UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

45 lines (44 loc) • 1.46 kB
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) }; }