@sema-agent/core
Version:
Stateless, task-oriented AI agent core
45 lines (44 loc) • 1.46 kB
JavaScript
export function indexOfUnescaped(s, ch) {
for (let i = 0; i < s.length; i++) {
if (s[i] !== ch)
continue;
let backslashes = 0;
for (let j = i - 1; j >= 0 && s[j] === "\\"; j--)
backslashes++;
if (backslashes % 2 === 0)
return i;
}
return -1;
}
export function lastIndexOfUnescaped(s, ch) {
for (let i = s.length - 1; i >= 0; i--) {
if (s[i] !== ch)
continue;
let backslashes = 0;
for (let j = i - 1; j >= 0 && s[j] === "\\"; j--)
backslashes++;
if (backslashes % 2 === 0)
return i;
}
return -1;
}
function unescapeRuleContent(s) {
return s.replaceAll("\\(", "(").replaceAll("\\)", ")").replaceAll("\\\\", "\\");
}
export function parsePermissionRule(rule) {
const open = indexOfUnescaped(rule, "(");
if (open === -1)
return { toolName: rule.trim() };
const close = lastIndexOfUnescaped(rule, ")");
if (close === -1 || close <= open)
return { toolName: rule.trim() };
if (close !== rule.length - 1)
return { toolName: rule.trim() };
const name = rule.substring(0, open);
const content = rule.substring(open + 1, close);
if (!name)
return { toolName: rule.trim() };
if (content === "" || content === "*")
return { toolName: name.trim() };
return { toolName: name.trim(), ruleContent: unescapeRuleContent(content) };
}