import { compileGlobPatterns, matchesAnyGlobPattern } from "./glob-pattern.js" ;
import type { SandboxToolPolicy } from "./sandbox/types.js" ;
import { expandToolGroups, normalizeToolName } from "./tool-policy.js" ;
function makeToolPolicyMatcher(policy: SandboxToolPolicy) {
const deny = compileGlobPatterns({
raw: expandToolGroups(policy.deny ?? []),
normalize: normalizeToolName,
});
const allow = compileGlobPatterns({
raw: expandToolGroups(policy.allow ?? []),
normalize: normalizeToolName,
});
return (name: string) => {
const normalized = normalizeToolName(name);
if (matchesAnyGlobPattern(normalized, deny)) {
return false ;
}
if (normalized === "apply_patch" && matchesAnyGlobPattern("write" , deny)) {
return false ;
}
if (allow.length === 0 ) {
return true ;
}
if (matchesAnyGlobPattern(normalized, allow)) {
return true ;
}
if (normalized === "apply_patch" && matchesAnyGlobPattern("write" , allow)) {
return true ;
}
return false ;
};
}
export function isToolAllowedByPolicyName(name: string, policy?: SandboxToolPolicy): boolean {
if (!policy) {
return true ;
}
return makeToolPolicyMatcher(policy)(name);
}
export function isToolAllowedByPolicies(
name: string,
policies: Array<SandboxToolPolicy | undefined>,
) {
return policies.every((policy) => isToolAllowedByPolicyName(name, policy));
}
Messung V0.5 in Prozent C=99 H=97 G=97
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland