@corenel/harness 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/approvals/decisionLog.d.ts +21 -0
- package/dist/approvals/decisionLog.d.ts.map +1 -0
- package/dist/approvals/decisionLog.js +129 -0
- package/dist/approvals/decisionLog.js.map +1 -0
- package/dist/approvals/hooks.d.ts +18 -0
- package/dist/approvals/hooks.d.ts.map +1 -0
- package/dist/approvals/hooks.js +34 -0
- package/dist/approvals/hooks.js.map +1 -0
- package/dist/approvals/index.d.ts +10 -0
- package/dist/approvals/index.d.ts.map +1 -0
- package/dist/approvals/index.js +10 -0
- package/dist/approvals/index.js.map +1 -0
- package/dist/approvals/service.d.ts +46 -0
- package/dist/approvals/service.d.ts.map +1 -0
- package/dist/approvals/service.js +181 -0
- package/dist/approvals/service.js.map +1 -0
- package/dist/approvals/settings.d.ts +20 -0
- package/dist/approvals/settings.d.ts.map +1 -0
- package/dist/approvals/settings.js +32 -0
- package/dist/approvals/settings.js.map +1 -0
- package/dist/approvals/shellTools.d.ts +10 -0
- package/dist/approvals/shellTools.d.ts.map +1 -0
- package/dist/approvals/shellTools.js +17 -0
- package/dist/approvals/shellTools.js.map +1 -0
- package/dist/approvals/standingStore.d.ts +15 -0
- package/dist/approvals/standingStore.d.ts.map +1 -0
- package/dist/approvals/standingStore.js +50 -0
- package/dist/approvals/standingStore.js.map +1 -0
- package/dist/approvals/suggest.d.ts +15 -0
- package/dist/approvals/suggest.d.ts.map +1 -0
- package/dist/approvals/suggest.js +23 -0
- package/dist/approvals/suggest.js.map +1 -0
- package/dist/approvals/summarize.d.ts +7 -0
- package/dist/approvals/summarize.d.ts.map +1 -0
- package/dist/approvals/summarize.js +70 -0
- package/dist/approvals/summarize.js.map +1 -0
- package/dist/approvals/testTextStore.d.ts +6 -0
- package/dist/approvals/testTextStore.d.ts.map +1 -0
- package/dist/approvals/testTextStore.js +11 -0
- package/dist/approvals/testTextStore.js.map +1 -0
- package/dist/approvals/textStore.d.ts +9 -0
- package/dist/approvals/textStore.d.ts.map +1 -0
- package/dist/approvals/textStore.js +2 -0
- package/dist/approvals/textStore.js.map +1 -0
- package/dist/audit/canonical.d.ts +5 -0
- package/dist/audit/canonical.d.ts.map +1 -0
- package/dist/audit/canonical.js +15 -0
- package/dist/audit/canonical.js.map +1 -0
- package/dist/audit/ids.d.ts +3 -0
- package/dist/audit/ids.d.ts.map +1 -0
- package/dist/audit/ids.js +11 -0
- package/dist/audit/ids.js.map +1 -0
- package/dist/audit/index.d.ts +7 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +7 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/log.d.ts +64 -0
- package/dist/audit/log.d.ts.map +1 -0
- package/dist/audit/log.js +457 -0
- package/dist/audit/log.js.map +1 -0
- package/dist/audit/recorder.d.ts +31 -0
- package/dist/audit/recorder.d.ts.map +1 -0
- package/dist/audit/recorder.js +185 -0
- package/dist/audit/recorder.js.map +1 -0
- package/dist/audit/runAudit.d.ts +38 -0
- package/dist/audit/runAudit.d.ts.map +1 -0
- package/dist/audit/runAudit.js +99 -0
- package/dist/audit/runAudit.js.map +1 -0
- package/dist/audit/verify.d.ts +14 -0
- package/dist/audit/verify.d.ts.map +1 -0
- package/dist/audit/verify.js +47 -0
- package/dist/audit/verify.js.map +1 -0
- package/dist/conversation.d.ts +31 -0
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +33 -0
- package/dist/conversation.js.map +1 -1
- package/dist/core/hash.d.ts +2 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +9 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/loop.d.ts +18 -0
- package/dist/core/loop.d.ts.map +1 -1
- package/dist/core/loop.js +61 -5
- package/dist/core/loop.js.map +1 -1
- package/dist/core/spawn.d.ts +59 -4
- package/dist/core/spawn.d.ts.map +1 -1
- package/dist/core/spawn.js +83 -5
- package/dist/core/spawn.js.map +1 -1
- package/dist/core/turnVerify.d.ts +25 -0
- package/dist/core/turnVerify.d.ts.map +1 -0
- package/dist/core/turnVerify.js +177 -0
- package/dist/core/turnVerify.js.map +1 -0
- package/dist/dag/executeNode.d.ts +7 -0
- package/dist/dag/executeNode.d.ts.map +1 -1
- package/dist/dag/executeNode.js +3 -0
- package/dist/dag/executeNode.js.map +1 -1
- package/dist/guardrail/guardrail.d.ts +7 -0
- package/dist/guardrail/guardrail.d.ts.map +1 -1
- package/dist/guardrail/guardrail.js +8 -0
- package/dist/guardrail/guardrail.js.map +1 -1
- package/dist/guardrail/index.d.ts +2 -2
- package/dist/guardrail/index.d.ts.map +1 -1
- package/dist/guardrail/index.js +2 -2
- package/dist/guardrail/index.js.map +1 -1
- package/dist/guardrail/permission-service.d.ts +37 -6
- package/dist/guardrail/permission-service.d.ts.map +1 -1
- package/dist/guardrail/permission-service.js +111 -11
- package/dist/guardrail/permission-service.js.map +1 -1
- package/dist/guardrail/serialize.d.ts.map +1 -1
- package/dist/guardrail/serialize.js +2 -0
- package/dist/guardrail/serialize.js.map +1 -1
- package/dist/guardrail/validate.d.ts.map +1 -1
- package/dist/guardrail/validate.js +3 -1
- package/dist/guardrail/validate.js.map +1 -1
- package/dist/install/lockfile.d.ts +13 -5
- package/dist/install/lockfile.d.ts.map +1 -1
- package/dist/install/lockfile.js +31 -2
- package/dist/install/lockfile.js.map +1 -1
- package/dist/orchestrator/agentSearch.d.ts +15 -0
- package/dist/orchestrator/agentSearch.d.ts.map +1 -0
- package/dist/orchestrator/agentSearch.js +102 -0
- package/dist/orchestrator/agentSearch.js.map +1 -0
- package/dist/orchestrator/agentTags.d.ts +13 -0
- package/dist/orchestrator/agentTags.d.ts.map +1 -0
- package/dist/orchestrator/agentTags.js +48 -0
- package/dist/orchestrator/agentTags.js.map +1 -0
- package/dist/orchestrator/branch.d.ts +9 -0
- package/dist/orchestrator/branch.d.ts.map +1 -0
- package/dist/orchestrator/branch.js +26 -0
- package/dist/orchestrator/branch.js.map +1 -0
- package/dist/orchestrator/checks.d.ts +16 -0
- package/dist/orchestrator/checks.d.ts.map +1 -0
- package/dist/orchestrator/checks.js +66 -0
- package/dist/orchestrator/checks.js.map +1 -0
- package/dist/orchestrator/planDoc.d.ts +15 -0
- package/dist/orchestrator/planDoc.d.ts.map +1 -0
- package/dist/orchestrator/planDoc.js +59 -0
- package/dist/orchestrator/planDoc.js.map +1 -0
- package/dist/orchestrator/record.d.ts +103 -0
- package/dist/orchestrator/record.d.ts.map +1 -0
- package/dist/orchestrator/record.js +168 -0
- package/dist/orchestrator/record.js.map +1 -0
- package/dist/orchestrator/sidecarTools.d.ts +7 -0
- package/dist/orchestrator/sidecarTools.d.ts.map +1 -0
- package/dist/orchestrator/sidecarTools.js +141 -0
- package/dist/orchestrator/sidecarTools.js.map +1 -0
- package/dist/prompts/config.d.ts.map +1 -1
- package/dist/prompts/config.js +11 -0
- package/dist/prompts/config.js.map +1 -1
- package/dist/prompts/index.d.ts +0 -6
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +10 -17
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/library/defaults.generated.d.ts.map +1 -1
- package/dist/prompts/library/defaults.generated.js +29 -12
- package/dist/prompts/library/defaults.generated.js.map +1 -1
- package/dist/redact.d.ts.map +1 -1
- package/dist/redact.js +1 -0
- package/dist/redact.js.map +1 -1
- package/dist/rooms/findings.d.ts +14 -0
- package/dist/rooms/findings.d.ts.map +1 -1
- package/dist/rooms/findings.js +37 -0
- package/dist/rooms/findings.js.map +1 -1
- package/dist/sessions/blobGc.d.ts.map +1 -1
- package/dist/sessions/blobGc.js +2 -5
- package/dist/sessions/blobGc.js.map +1 -1
- package/dist/sessions/childSessions.d.ts +12 -0
- package/dist/sessions/childSessions.d.ts.map +1 -0
- package/dist/sessions/childSessions.js +43 -0
- package/dist/sessions/childSessions.js.map +1 -0
- package/dist/sessions/fileRecallStore.d.ts.map +1 -1
- package/dist/sessions/fileRecallStore.js +1 -3
- package/dist/sessions/fileRecallStore.js.map +1 -1
- package/dist/sessions/fileSessionStore.d.ts +11 -7
- package/dist/sessions/fileSessionStore.d.ts.map +1 -1
- package/dist/sessions/fileSessionStore.js +27 -16
- package/dist/sessions/fileSessionStore.js.map +1 -1
- package/dist/sessions/inflight.js +0 -0
- package/dist/sessions/inflight.js.map +1 -1
- package/dist/sessions/jsonl.d.ts +4 -0
- package/dist/sessions/jsonl.d.ts.map +1 -1
- package/dist/sessions/jsonl.js +1 -0
- package/dist/sessions/jsonl.js.map +1 -1
- package/dist/sessions/testFs.d.ts.map +1 -1
- package/dist/sessions/testFs.js +1 -1
- package/dist/sessions/testFs.js.map +1 -1
- package/dist/sidecar/host.d.ts +178 -1
- package/dist/sidecar/host.d.ts.map +1 -1
- package/dist/sidecar/host.js +363 -3
- package/dist/sidecar/host.js.map +1 -1
- package/dist/sidecar/identity.d.ts +44 -0
- package/dist/sidecar/identity.d.ts.map +1 -0
- package/dist/sidecar/identity.js +45 -0
- package/dist/sidecar/identity.js.map +1 -0
- package/dist/sidecar/server.d.ts +245 -2
- package/dist/sidecar/server.d.ts.map +1 -1
- package/dist/sidecar/server.js +833 -45
- package/dist/sidecar/server.js.map +1 -1
- package/dist/skillSource.js +1 -1
- package/dist/skillSource.js.map +1 -1
- package/dist/skills.d.ts +23 -7
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +62 -37
- package/dist/skills.js.map +1 -1
- package/dist/tools/callAgent.d.ts +29 -12
- package/dist/tools/callAgent.d.ts.map +1 -1
- package/dist/tools/callAgent.js +120 -14
- package/dist/tools/callAgent.js.map +1 -1
- package/dist/tools/crewList.d.ts +33 -0
- package/dist/tools/crewList.d.ts.map +1 -0
- package/dist/tools/crewList.js +66 -0
- package/dist/tools/crewList.js.map +1 -0
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +11 -5
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/findAgent.d.ts +23 -0
- package/dist/tools/findAgent.d.ts.map +1 -0
- package/dist/tools/findAgent.js +58 -0
- package/dist/tools/findAgent.js.map +1 -0
- package/dist/tools/namespaces.d.ts.map +1 -1
- package/dist/tools/namespaces.js +7 -0
- package/dist/tools/namespaces.js.map +1 -1
- package/dist/tools/orchestrate.d.ts +4 -0
- package/dist/tools/orchestrate.d.ts.map +1 -0
- package/dist/tools/orchestrate.js +38 -0
- package/dist/tools/orchestrate.js.map +1 -0
- package/dist/tools/orchestration.d.ts +24 -0
- package/dist/tools/orchestration.d.ts.map +1 -0
- package/dist/tools/orchestration.js +173 -0
- package/dist/tools/orchestration.js.map +1 -0
- package/dist/tools/orchestrationSet.d.ts +6 -0
- package/dist/tools/orchestrationSet.d.ts.map +1 -0
- package/dist/tools/orchestrationSet.js +12 -0
- package/dist/tools/orchestrationSet.js.map +1 -0
- package/dist/tools/roomTools.d.ts +6 -0
- package/dist/tools/roomTools.d.ts.map +1 -1
- package/dist/tools/roomTools.js +26 -2
- package/dist/tools/roomTools.js.map +1 -1
- package/dist/tools/skillTool.d.ts +15 -0
- package/dist/tools/skillTool.d.ts.map +1 -0
- package/dist/tools/skillTool.js +39 -0
- package/dist/tools/skillTool.js.map +1 -0
- package/dist/tools/urlGuard.d.ts +7 -0
- package/dist/tools/urlGuard.d.ts.map +1 -1
- package/dist/tools/urlGuard.js +54 -18
- package/dist/tools/urlGuard.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { sha256Hex } from './hash.js';
|
|
2
|
+
/** Coerce a tool argument the SAME way the tools themselves do before they act
|
|
3
|
+
* on it (`packages/harness/tools/builtins.ts:21`, `files.ts:9`: both define
|
|
4
|
+
* `str(args, key)` identically), so the verifier's before/after intent matches
|
|
5
|
+
* what the tool actually stored. A non-string, non-nullish value (e.g. the
|
|
6
|
+
* boolean `true` from `kv_set {value: true}`) becomes `String(v)`, not `''` --
|
|
7
|
+
* the verifier's old rule, which produced a false "didn't take" whenever a
|
|
8
|
+
* value wasn't already a string. Do not change the tools; this mirrors them. */
|
|
9
|
+
export function toolArgString(args, key) {
|
|
10
|
+
const v = args[key];
|
|
11
|
+
return typeof v === 'string' ? v : v == null ? '' : String(v);
|
|
12
|
+
}
|
|
13
|
+
/** One table drives both `intentsFor` and `VERIFIED_TOOLS`, so the two can
|
|
14
|
+
* never drift apart (a tool named as verified but not actually intent-mapped,
|
|
15
|
+
* or vice versa). */
|
|
16
|
+
const INTENTS = {
|
|
17
|
+
kv_set: (args) => [{ kind: 'kv', target: toolArgString(args, 'key'), expect: { value: toolArgString(args, 'value') } }],
|
|
18
|
+
write_file: (args) => [{ kind: 'file', target: toolArgString(args, 'path'), expect: { content: toolArgString(args, 'content') } }],
|
|
19
|
+
create_file: (args) => [{ kind: 'file', target: toolArgString(args, 'path'), expect: { content: toolArgString(args, 'content') } }],
|
|
20
|
+
delete_file: (args) => [{ kind: 'file', target: toolArgString(args, 'path'), expect: { absent: true } }],
|
|
21
|
+
rename_file: (args) => [
|
|
22
|
+
{ kind: 'file', target: toolArgString(args, 'from'), expect: { absent: true } },
|
|
23
|
+
{ kind: 'file', target: toolArgString(args, 'to'), expect: { present: true } },
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
export const VERIFIED_TOOLS = new Set(Object.keys(INTENTS));
|
|
27
|
+
function intentsFor(tool, args) {
|
|
28
|
+
return INTENTS[tool]?.(args) ?? [];
|
|
29
|
+
}
|
|
30
|
+
function stateOf(before, after) {
|
|
31
|
+
if (before === after)
|
|
32
|
+
return 'unchanged';
|
|
33
|
+
if (before === null)
|
|
34
|
+
return 'new';
|
|
35
|
+
if (after === null)
|
|
36
|
+
return 'deleted';
|
|
37
|
+
return 'changed';
|
|
38
|
+
}
|
|
39
|
+
/** Cap on each verifier read (kv get / file stat / file read), so a store that
|
|
40
|
+
* hangs can never hang the turn: on timeout the read rejects, and the caller's
|
|
41
|
+
* catch turns that into "unverifiable" like any other store error. The timer
|
|
42
|
+
* is always cleared -- on resolve, reject, AND timeout -- so nothing is left
|
|
43
|
+
* pending after the promise settles. */
|
|
44
|
+
const READ_TIMEOUT_MS = 5000;
|
|
45
|
+
function withReadTimeout(p) {
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
const timer = setTimeout(() => reject(new Error('turn verifier read timed out')), READ_TIMEOUT_MS);
|
|
48
|
+
p.then((v) => { clearTimeout(timer); resolve(v); }, (e) => { clearTimeout(timer); reject(e); });
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function createTurnVerifier(stores) {
|
|
52
|
+
const calls = [];
|
|
53
|
+
const changes = [];
|
|
54
|
+
const pending = new Map();
|
|
55
|
+
/** Current hash of a target, or null when it does not exist. Throws when the
|
|
56
|
+
* store itself cannot answer — the caller turns that into "unverifiable". */
|
|
57
|
+
async function read(i) {
|
|
58
|
+
if (i.kind === 'kv') {
|
|
59
|
+
const v = await withReadTimeout(stores.kv.get(i.target));
|
|
60
|
+
return v === null ? null : sha256Hex(v);
|
|
61
|
+
}
|
|
62
|
+
// Absence is decided by stat, not by catching read()'s error: a store
|
|
63
|
+
// outage must propagate (to the outer try/catch -> unverifiable), never
|
|
64
|
+
// be mistaken for "the file is gone" (-> a false confirmed delete).
|
|
65
|
+
// Known gap: SidecarFileService.stat can itself return null on a
|
|
66
|
+
// transport failure (open issue), so on a sidecar-backed workspace an
|
|
67
|
+
// outage can still read as absent until that is fixed.
|
|
68
|
+
const st = await withReadTimeout(stores.files.stat(i.target));
|
|
69
|
+
if (st === null)
|
|
70
|
+
return null;
|
|
71
|
+
return sha256Hex(await withReadTimeout(stores.files.read(i.target)));
|
|
72
|
+
}
|
|
73
|
+
// A kv store whose writes do not outlive the run (`ephemeral: true`, e.g. the
|
|
74
|
+
// daemon's per-run in-memory KV) can never be read back as a "saved value" --
|
|
75
|
+
// a kv intent against it is not observable, so it falls back to unverifiable
|
|
76
|
+
// rather than a false "confirmed".
|
|
77
|
+
const canObserve = (i) => {
|
|
78
|
+
if (i.target === '')
|
|
79
|
+
return false;
|
|
80
|
+
return i.kind === 'kv' ? !!stores.kv && !stores.kv.ephemeral : !!stores.files;
|
|
81
|
+
};
|
|
82
|
+
return {
|
|
83
|
+
async before(callId, tool, args) {
|
|
84
|
+
try {
|
|
85
|
+
const safeArgs = args && typeof args === 'object' ? args : {};
|
|
86
|
+
const intents = intentsFor(tool, safeArgs);
|
|
87
|
+
if (!intents.length || !intents.every(canObserve)) {
|
|
88
|
+
pending.set(callId, { tool, intents: [], before: [] });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const before = await Promise.all(intents.map(read));
|
|
92
|
+
pending.set(callId, { tool, intents, before });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
pending.set(callId, { tool, intents: [], before: [] });
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
async after(callId, outcome) {
|
|
99
|
+
const p = pending.get(callId);
|
|
100
|
+
pending.delete(callId);
|
|
101
|
+
try {
|
|
102
|
+
if (!p)
|
|
103
|
+
return;
|
|
104
|
+
if (!p.intents.length) {
|
|
105
|
+
calls.push({ callId, tool: p.tool, outcome, verifiable: false });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const after = await Promise.all(p.intents.map(read));
|
|
109
|
+
const made = [];
|
|
110
|
+
for (let k = 0; k < p.intents.length; k++) {
|
|
111
|
+
const i = p.intents[k];
|
|
112
|
+
const b = p.before[k] ?? null;
|
|
113
|
+
const a = after[k] ?? null;
|
|
114
|
+
let took;
|
|
115
|
+
if (i.kind === 'kv')
|
|
116
|
+
took = a !== null && a === (await sha256Hex(i.expect.value));
|
|
117
|
+
else if ('content' in i.expect)
|
|
118
|
+
took = a !== null && (a === (await sha256Hex(i.expect.content)) || a !== b);
|
|
119
|
+
// Deleting a path that never existed does nothing: only count it as
|
|
120
|
+
// taking effect when something was actually there beforehand.
|
|
121
|
+
else if ('absent' in i.expect)
|
|
122
|
+
took = a === null && b !== null;
|
|
123
|
+
else
|
|
124
|
+
took = a !== null;
|
|
125
|
+
made.push({ callId, kind: i.kind, target: i.target, beforeHash: b, afterHash: a, state: stateOf(b, a), took });
|
|
126
|
+
}
|
|
127
|
+
changes.push(...made);
|
|
128
|
+
calls.push({ callId, tool: p.tool, outcome, verifiable: true });
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
if (p)
|
|
132
|
+
calls.push({ callId, tool: p.tool, outcome, verifiable: false });
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
denied(callId, tool) {
|
|
136
|
+
calls.push({ callId, tool, outcome: 'denied', verifiable: VERIFIED_TOOLS.has(tool) });
|
|
137
|
+
},
|
|
138
|
+
result() {
|
|
139
|
+
if (!calls.length)
|
|
140
|
+
return null;
|
|
141
|
+
const counts = { confirmed: 0, didNotTake: 0, failed: 0, denied: 0, unverifiable: 0 };
|
|
142
|
+
for (const c of calls) {
|
|
143
|
+
if (c.outcome === 'denied') {
|
|
144
|
+
counts.denied++;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (c.outcome === 'failed') {
|
|
148
|
+
counts.failed++;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (!c.verifiable) {
|
|
152
|
+
counts.unverifiable++;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const mine = changes.filter((ch) => ch.callId === c.callId);
|
|
156
|
+
if (mine.every((ch) => ch.took))
|
|
157
|
+
counts.confirmed++;
|
|
158
|
+
else
|
|
159
|
+
counts.didNotTake++;
|
|
160
|
+
}
|
|
161
|
+
return { calls: [...calls], changes: [...changes], counts };
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** One summary for several turns' verifications (a daemon run can span more
|
|
166
|
+
* than one agent turn): calls and changes concatenated in order, counts summed.
|
|
167
|
+
* Null when there is nothing to merge. */
|
|
168
|
+
export function mergeTurnVerifications(vs) {
|
|
169
|
+
if (!vs.length)
|
|
170
|
+
return null;
|
|
171
|
+
const counts = { confirmed: 0, didNotTake: 0, failed: 0, denied: 0, unverifiable: 0 };
|
|
172
|
+
for (const v of vs)
|
|
173
|
+
for (const k of Object.keys(counts))
|
|
174
|
+
counts[k] += v.counts[k];
|
|
175
|
+
return { calls: vs.flatMap((v) => v.calls), changes: vs.flatMap((v) => v.changes), counts };
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=turnVerify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnVerify.js","sourceRoot":"","sources":["../../core/turnVerify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type OpenAI from 'openai';
|
|
2
2
|
import type { PermissionService } from '../guardrail/permission-service';
|
|
3
|
+
import type { SkillEntry } from '../tools/skillTool';
|
|
3
4
|
import type { AgentTool, AgentEvent, ToolContext, Policy, CompressionConfig, NodeOutput, NodeEvent, NodeSpec, RunNodeResult } from '@corenel/protocol';
|
|
4
5
|
export type { NodeSpec, RunNodeResult } from '@corenel/protocol';
|
|
5
6
|
export interface NodeRunRequest {
|
|
@@ -19,8 +20,14 @@ export interface RunNodeDeps {
|
|
|
19
20
|
toolCtx: ToolContext;
|
|
20
21
|
policy?: Policy;
|
|
21
22
|
permission?: PermissionService;
|
|
23
|
+
/** Forwarded to runAgent: the spawned child id its decisions carry. */
|
|
24
|
+
decisionNodeId?: string;
|
|
22
25
|
compression?: CompressionConfig;
|
|
23
26
|
defaultSystem?: string;
|
|
27
|
+
/** Receives the child's full transcript once the run finishes (spawn's trace recorder). */
|
|
28
|
+
onMessages?: (messages: unknown[]) => void;
|
|
29
|
+
/** The child's own skills; passed to the loop, which builds the index and use_skill. */
|
|
30
|
+
skills?: SkillEntry[];
|
|
24
31
|
}
|
|
25
32
|
/** Read-biased default tool set for a node with no explicit allowlist (§4). No
|
|
26
33
|
* mutating tools, so a delegated node never writes unless its allowlist opts in. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeNode.d.ts","sourceRoot":"","sources":["../../dag/executeNode.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAIjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EACV,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAC7D,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAC/C,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CACjC;AAED;;0CAE0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"executeNode.d.ts","sourceRoot":"","sources":["../../dag/executeNode.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAIjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EACV,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAC7D,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAC/C,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CACjC;AAED;;0CAE0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAC3C,wFAAwF;IACxF,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;CACvB;AAED;oFACoF;AACpF,eAAO,MAAM,iBAAiB,UAI7B,CAAC;AAEF;;kDAEkD;AAClD,eAAO,MAAM,cAAc,QAAO,OAAO,CAAC,MAAM,CAAmD,CAAC;AAEpG;+EAC+E;AAC/E,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,CAKzG;AAED;mFACmF;AACnF,wBAAsB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAWrG;AAED;gEACgE;AAChE,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAoC5F;AAED;oEACoE;AACpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,GAAG,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAExG"}
|
package/dist/dag/executeNode.js
CHANGED
|
@@ -69,6 +69,8 @@ export async function runNode(req, deps) {
|
|
|
69
69
|
maxTurns: node.maxTurns,
|
|
70
70
|
policy: deps.policy,
|
|
71
71
|
permission: deps.permission,
|
|
72
|
+
...(deps.skills && deps.skills.length ? { skills: deps.skills } : {}),
|
|
73
|
+
...(deps.decisionNodeId ? { decisionNodeId: deps.decisionNodeId } : {}),
|
|
72
74
|
compression: deps.compression,
|
|
73
75
|
signal,
|
|
74
76
|
onEvent: (e) => {
|
|
@@ -77,6 +79,7 @@ export async function runNode(req, deps) {
|
|
|
77
79
|
onEvent({ type: 'node-event', nodeId: node.id, event: e });
|
|
78
80
|
},
|
|
79
81
|
});
|
|
82
|
+
deps.onMessages?.(result.messages);
|
|
80
83
|
const output = { text: result.text, usage: result.usage, stopReason: result.stopReason };
|
|
81
84
|
onEvent({ type: 'node-done', nodeId: node.id, output });
|
|
82
85
|
return { ...output, turns };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeNode.js","sourceRoot":"","sources":["../../dag/executeNode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;4EAY4E;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"executeNode.js","sourceRoot":"","sources":["../../dag/executeNode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;4EAY4E;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAuClD;oFACoF;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,gBAAgB,EAAE,iBAAiB,EAAE,YAAY;IACjD,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW;IACtD,eAAe,EAAE,eAAe,EAAE,QAAQ;CAC3C,CAAC;AAEF;;kDAEkD;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAoB,EAAE,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAEpG;+EAC+E;AAC/E,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,KAA2B,EAAE,GAAgB;IAC1F,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC1E,IAAI,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACf,CAAC;AAED;mFACmF;AACnF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc,EAAE,MAAkC;IAClF,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,yEAAyE;QACzE,4EAA4E;QAC5E,MAAM,GAAG,GAAG,2DAA2D,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7F,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED;gEACgE;AAChE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAmB,EAAE,IAAiB;IAClE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAC9C,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAiC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;YACtC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,MAAM,cAAc,EAAE;YACnE,QAAQ;YACR,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM;YACN,OAAO,EAAE,CAAC,CAAa,EAAE,EAAE;gBACzB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;oBAAE,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;gBACtC,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;QACrG,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,MAAM,CAAE,CAAW,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED;oEACoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,MAA8B;IAC7E,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -11,6 +11,13 @@ export interface ToolCallSubject {
|
|
|
11
11
|
* namespace (`fs:*`). Falls back to bare-name matching when absent. */
|
|
12
12
|
address?: string;
|
|
13
13
|
}
|
|
14
|
+
/** Does the policy's `tools` gate decide this tool: a `tools.deny` entry
|
|
15
|
+
* matches it, or a `tools.allow` list exists (which then admits or blocks it)?
|
|
16
|
+
* Matched the way evaluateToolCall matches (address and bare name). */
|
|
17
|
+
export declare function toolGateCovers(policy: Policy, call: {
|
|
18
|
+
name: string;
|
|
19
|
+
address?: string;
|
|
20
|
+
}): boolean;
|
|
14
21
|
export declare function initialState(): GuardrailState;
|
|
15
22
|
/** Turn-budget check, evaluated at the start of each turn. */
|
|
16
23
|
export declare function evaluateTurnStart(policy: Policy, state: GuardrailState): GuardrailDecision;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guardrail.d.ts","sourceRoot":"","sources":["../../guardrail/guardrail.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAkC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE9G,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB;2EACuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD,wBAAgB,YAAY,IAAI,cAAc,CAE7C;AAgBD,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAK1F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,eAAe,GACpB,iBAAiB,CAkBnB;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,CAKrF"}
|
|
1
|
+
{"version":3,"file":"guardrail.d.ts","sourceRoot":"","sources":["../../guardrail/guardrail.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAkC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE9G,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB;2EACuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD;;uEAEuE;AACvE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAIhG;AAED,wBAAgB,YAAY,IAAI,cAAc,CAE7C;AAgBD,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAK1F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,eAAe,GACpB,iBAAiB,CAkBnB;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,SAAS,EAAE,CAKrF"}
|
|
@@ -10,6 +10,14 @@ function callMatches(call, globs) {
|
|
|
10
10
|
return true;
|
|
11
11
|
return matchesAnyGlob(call.name, globs);
|
|
12
12
|
}
|
|
13
|
+
/** Does the policy's `tools` gate decide this tool: a `tools.deny` entry
|
|
14
|
+
* matches it, or a `tools.allow` list exists (which then admits or blocks it)?
|
|
15
|
+
* Matched the way evaluateToolCall matches (address and bare name). */
|
|
16
|
+
export function toolGateCovers(policy, call) {
|
|
17
|
+
const allow = policy.tools?.allow ?? [];
|
|
18
|
+
const deny = policy.tools?.deny ?? [];
|
|
19
|
+
return allow.length > 0 || callMatches({ ...call, exists: true }, deny);
|
|
20
|
+
}
|
|
13
21
|
export function initialState() {
|
|
14
22
|
return { turn: 0, toolCalls: 0, calledTools: new Set() };
|
|
15
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guardrail.js","sourceRoot":"","sources":["../../guardrail/guardrail.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"guardrail.js","sourceRoot":"","sources":["../../guardrail/guardrail.ts"],"names":[],"mappings":"AAAA;;8EAE8E;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAiBxC,6EAA6E;AAC7E,SAAS,WAAW,CAAC,IAAqB,EAAE,KAAwB;IAClE,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED;;uEAEuE;AACvE,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,IAAwC;IACrF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;IACtC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC;AACtC,CAAC;AAED,SAAS,OAAO,CACd,IAAmB,EACnB,OAAe,EACf,MAAuB,EACvB,IAAa;IAEb,MAAM,SAAS,GAAc,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAChF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAqB;IACrE,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnE,OAAO,OAAO,CAAC,WAAW,EAAE,qBAAqB,MAAM,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,KAAqB,EACrB,IAAqB;IAErB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,cAAc,EAAE,+BAA+B,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;IAEtC,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,OAAO,CAAC,aAAa,EAAE,0BAA0B,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC,kBAAkB,EAAE,2BAA2B,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACnF,OAAO,OAAO,CAAC,gBAAgB,EAAE,yBAAyB,MAAM,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,KAAqB;IACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACrF,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,oCAAoC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5G,CAAC;AAED,+EAA+E;AAC/E,SAAS,eAAe,CAAC,UAAkB,EAAE,MAAmB;IAC9D,KAAK,MAAM,IAAI,IAAI,MAAM;QAAE,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAC/E,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from '@corenel/protocol';
|
|
2
2
|
export { matchesAnyGlob, globToRegex } from './glob';
|
|
3
|
-
export { initialState, evaluateTurnStart, evaluateToolCall, evaluateCompletion, type GuardrailState, type ToolCallSubject, } from './guardrail';
|
|
4
|
-
export { PermissionService, mostRestrictive, type PermissionSubject, type PermissionPrompt, type PermissionServiceOptions, } from './permission-service';
|
|
3
|
+
export { initialState, evaluateTurnStart, evaluateToolCall, evaluateCompletion, toolGateCovers, type GuardrailState, type ToolCallSubject, } from './guardrail';
|
|
4
|
+
export { PermissionService, mostRestrictive, strictestUnattended, policyNamesTool, type PermissionSubject, type PermissionPrompt, type PermissionServiceOptions, type CheckOptions, } from './permission-service';
|
|
5
5
|
export { STANDARD_POLICY, READ_ONLY_POLICY, AUTONOMOUS_POLICY, BUILTIN_POLICIES } from './builtins';
|
|
6
6
|
export { validatePolicy, type PolicyValidationResult } from './validate';
|
|
7
7
|
export { policyToYaml, policyFromYaml } from './serialize';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../guardrail/index.ts"],"names":[],"mappings":"AAEA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../guardrail/index.ts"],"names":[],"mappings":"AAEA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,YAAY,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,SAAS,CAAC"}
|
package/dist/guardrail/index.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* guardrail (hard gates) + permission service (per-tool oversight) + built-ins. */
|
|
3
3
|
export * from '@corenel/protocol';
|
|
4
4
|
export { matchesAnyGlob, globToRegex } from './glob.js';
|
|
5
|
-
export { initialState, evaluateTurnStart, evaluateToolCall, evaluateCompletion, } from './guardrail.js';
|
|
6
|
-
export { PermissionService, mostRestrictive, } from './permission-service.js';
|
|
5
|
+
export { initialState, evaluateTurnStart, evaluateToolCall, evaluateCompletion, toolGateCovers, } from './guardrail.js';
|
|
6
|
+
export { PermissionService, mostRestrictive, strictestUnattended, policyNamesTool, } from './permission-service.js';
|
|
7
7
|
export { STANDARD_POLICY, READ_ONLY_POLICY, AUTONOMOUS_POLICY, BUILTIN_POLICIES } from './builtins.js';
|
|
8
8
|
export { validatePolicy } from './validate.js';
|
|
9
9
|
export { policyToYaml, policyFromYaml } from './serialize.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../guardrail/index.ts"],"names":[],"mappings":"AAAA;mFACmF;AACnF,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../guardrail/index.ts"],"names":[],"mappings":"AAAA;mFACmF;AACnF,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,eAAe,GAKhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,EAAE,cAAc,EAA+B,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GAGtB,MAAM,SAAS,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Policy, PermissionLevel, PermissionCeiling, PermissionDecision } from '@corenel/protocol';
|
|
1
|
+
import type { Policy, PermissionLevel, PermissionCeiling, PermissionDecision, DecisionEvent, PromptAnswer, PromptRequest, StandingApprovals, ApprovalDetail, UnattendedMode } from '@corenel/protocol';
|
|
2
2
|
/** Minimal tool shape the resolver needs (a subset of AgentTool). */
|
|
3
3
|
export interface PermissionSubject {
|
|
4
4
|
name: string;
|
|
@@ -17,10 +17,9 @@ export interface PermissionSubject {
|
|
|
17
17
|
roomSafe?: boolean;
|
|
18
18
|
}
|
|
19
19
|
export interface PermissionPrompt {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}): Promise<PermissionDecision>;
|
|
20
|
+
/** A bare decision is recorded as a human answer. Prompts that know better
|
|
21
|
+
* (a session auto-answer, a daemon timeout) return a PromptAnswer. */
|
|
22
|
+
ask(req: PromptRequest): Promise<PermissionDecision | PromptAnswer>;
|
|
24
23
|
}
|
|
25
24
|
export interface PermissionServiceOptions {
|
|
26
25
|
policy: Policy;
|
|
@@ -31,9 +30,33 @@ export interface PermissionServiceOptions {
|
|
|
31
30
|
defaultForMutating?: PermissionLevel;
|
|
32
31
|
/** Hard upper bound clamped onto every resolution. */
|
|
33
32
|
ceiling?: PermissionCeiling;
|
|
33
|
+
/** Consulted only at the 'ask' branch, after sessionAllow, and never when
|
|
34
|
+
* the ceiling itself requires an ask. A throw/reject counts as no match. */
|
|
35
|
+
standing?: StandingApprovals;
|
|
36
|
+
/** Observer for every decision. Called after the decision is final and never
|
|
37
|
+
* awaited; a throw is swallowed. It cannot change the decision. */
|
|
38
|
+
onDecision?: (e: DecisionEvent) => void;
|
|
34
39
|
}
|
|
40
|
+
export interface CheckOptions {
|
|
41
|
+
/** The spawned child this check is for (stamped onto the DecisionEvent). */
|
|
42
|
+
nodeId?: string;
|
|
43
|
+
/** What the call would do (AgentTool.approvalDetail). Read only when a
|
|
44
|
+
* person is about to be asked, bounded by DETAIL_TIMEOUT_MS; a throw or a
|
|
45
|
+
* timeout asks without details rather than failing the check. */
|
|
46
|
+
detail?: () => Promise<ApprovalDetail | null>;
|
|
47
|
+
}
|
|
48
|
+
/** How long the prompt waits for a tool's approval details. */
|
|
49
|
+
export declare const DETAIL_TIMEOUT_MS = 15000;
|
|
50
|
+
/** Does any `permissions` rule in this policy -- bare name, address,
|
|
51
|
+
* namespace glob or `*` -- apply to this tool, the way the enforcer matches
|
|
52
|
+
* (see matchLevel)? False only when the policy is silent about it. */
|
|
53
|
+
export declare function policyNamesTool(policy: Policy, tool: PermissionSubject): boolean;
|
|
35
54
|
/** The more restrictive of two levels (the ceiling clamp). */
|
|
36
55
|
export declare function mostRestrictive(a: PermissionLevel, b: PermissionLevel): PermissionLevel;
|
|
56
|
+
/** The stricter of two unattended modes. A delegated callee runs under the
|
|
57
|
+
* stricter of its caller's and its own, so it is never more autonomous than
|
|
58
|
+
* the run it is part of, nor than its own policy says (spec section 3). */
|
|
59
|
+
export declare function strictestUnattended(a: UnattendedMode, b: UnattendedMode): UnattendedMode;
|
|
37
60
|
export declare class PermissionService {
|
|
38
61
|
private readonly policy;
|
|
39
62
|
private readonly prompt?;
|
|
@@ -41,11 +64,16 @@ export declare class PermissionService {
|
|
|
41
64
|
private readonly defaultForMutating;
|
|
42
65
|
private readonly ceiling?;
|
|
43
66
|
private readonly sessionAllow;
|
|
67
|
+
private readonly standing?;
|
|
68
|
+
private readonly onDecision?;
|
|
44
69
|
constructor(opts: PermissionServiceOptions);
|
|
45
70
|
/** Pre-approve a tool-name glob for the rest of the session (an "ask" becomes "allow"). */
|
|
46
71
|
preApprove(toolGlob: string): void;
|
|
47
72
|
reset(): void;
|
|
48
|
-
check
|
|
73
|
+
/** `opts.nodeId` names the spawned child this check is for; it is stamped
|
|
74
|
+
* onto the reported DecisionEvent so a host can attribute the decision
|
|
75
|
+
* (a policy-less child shares its parent's service, see spawn.ts). */
|
|
76
|
+
check(tool: PermissionSubject, input: unknown, opts?: CheckOptions): Promise<PermissionDecision>;
|
|
49
77
|
/**
|
|
50
78
|
* Resolve the effective level. Base precedence (highest first):
|
|
51
79
|
* policy.permissions glob
|
|
@@ -63,5 +91,8 @@ export declare class PermissionService {
|
|
|
63
91
|
private resolveBaseLevel;
|
|
64
92
|
private resolveCeilingLevel;
|
|
65
93
|
private decide;
|
|
94
|
+
/** Fail toward the human: a lookup failure is "no match", never "allow". */
|
|
95
|
+
private standingMatches;
|
|
96
|
+
private report;
|
|
66
97
|
}
|
|
67
98
|
//# sourceMappingURL=permission-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-service.d.ts","sourceRoot":"","sources":["../../guardrail/permission-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"permission-service.d.ts","sourceRoot":"","sources":["../../guardrail/permission-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,28 @@
|
|
|
5
5
|
* Marshal harness; the tool descriptor here is the browser harness's AgentTool
|
|
6
6
|
* shape ({ name, mutates?, permission? }) rather than the Node Tool. */
|
|
7
7
|
import { matchesAnyGlob } from './glob.js';
|
|
8
|
+
import { isCheckpointTool } from '@corenel/protocol';
|
|
9
|
+
// A direct file import, not the approvals barrel, so the guardrail does not
|
|
10
|
+
// pull the whole approvals module.
|
|
11
|
+
import { isNeverStanding } from '../approvals/shellTools.js';
|
|
12
|
+
/** How long the prompt waits for a tool's approval details. */
|
|
13
|
+
export const DETAIL_TIMEOUT_MS = 15000;
|
|
14
|
+
async function boundedDetail(detailOf) {
|
|
15
|
+
let timer;
|
|
16
|
+
try {
|
|
17
|
+
return await Promise.race([
|
|
18
|
+
detailOf(),
|
|
19
|
+
new Promise((resolve) => { timer = setTimeout(() => resolve(null), DETAIL_TIMEOUT_MS); }),
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
if (timer !== undefined)
|
|
27
|
+
clearTimeout(timer);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
8
30
|
const LEVEL_RANK = { allow: 0, ask: 1, deny: 2 };
|
|
9
31
|
/** Match a glob against a tool's address (if any) and its bare name. */
|
|
10
32
|
function subjectMatches(tool, glob) {
|
|
@@ -36,10 +58,25 @@ function matchLevel(tool, rules) {
|
|
|
36
58
|
}
|
|
37
59
|
return best;
|
|
38
60
|
}
|
|
61
|
+
/** Does any `permissions` rule in this policy -- bare name, address,
|
|
62
|
+
* namespace glob or `*` -- apply to this tool, the way the enforcer matches
|
|
63
|
+
* (see matchLevel)? False only when the policy is silent about it. */
|
|
64
|
+
export function policyNamesTool(policy, tool) {
|
|
65
|
+
return !!policy.permissions && matchLevel(tool, policy.permissions) !== undefined;
|
|
66
|
+
}
|
|
39
67
|
/** The more restrictive of two levels (the ceiling clamp). */
|
|
40
68
|
export function mostRestrictive(a, b) {
|
|
41
69
|
return LEVEL_RANK[a] >= LEVEL_RANK[b] ? a : b;
|
|
42
70
|
}
|
|
71
|
+
/** Strictest first: deny refuses at once, park waits for a person, allow
|
|
72
|
+
* answers itself. */
|
|
73
|
+
const UNATTENDED_RANK = { deny: 2, park: 1, allow: 0 };
|
|
74
|
+
/** The stricter of two unattended modes. A delegated callee runs under the
|
|
75
|
+
* stricter of its caller's and its own, so it is never more autonomous than
|
|
76
|
+
* the run it is part of, nor than its own policy says (spec section 3). */
|
|
77
|
+
export function strictestUnattended(a, b) {
|
|
78
|
+
return UNATTENDED_RANK[a] >= UNATTENDED_RANK[b] ? a : b;
|
|
79
|
+
}
|
|
43
80
|
export class PermissionService {
|
|
44
81
|
constructor(opts) {
|
|
45
82
|
Object.defineProperty(this, "policy", {
|
|
@@ -78,6 +115,18 @@ export class PermissionService {
|
|
|
78
115
|
writable: true,
|
|
79
116
|
value: new Set()
|
|
80
117
|
});
|
|
118
|
+
Object.defineProperty(this, "standing", {
|
|
119
|
+
enumerable: true,
|
|
120
|
+
configurable: true,
|
|
121
|
+
writable: true,
|
|
122
|
+
value: void 0
|
|
123
|
+
});
|
|
124
|
+
Object.defineProperty(this, "onDecision", {
|
|
125
|
+
enumerable: true,
|
|
126
|
+
configurable: true,
|
|
127
|
+
writable: true,
|
|
128
|
+
value: void 0
|
|
129
|
+
});
|
|
81
130
|
this.policy = opts.policy;
|
|
82
131
|
if (opts.prompt)
|
|
83
132
|
this.prompt = opts.prompt;
|
|
@@ -85,6 +134,10 @@ export class PermissionService {
|
|
|
85
134
|
this.defaultForMutating = opts.defaultForMutating ?? 'ask';
|
|
86
135
|
if (opts.ceiling)
|
|
87
136
|
this.ceiling = opts.ceiling;
|
|
137
|
+
if (opts.standing)
|
|
138
|
+
this.standing = opts.standing;
|
|
139
|
+
if (opts.onDecision)
|
|
140
|
+
this.onDecision = opts.onDecision;
|
|
88
141
|
}
|
|
89
142
|
/** Pre-approve a tool-name glob for the rest of the session (an "ask" becomes "allow"). */
|
|
90
143
|
preApprove(toolGlob) {
|
|
@@ -93,9 +146,22 @@ export class PermissionService {
|
|
|
93
146
|
reset() {
|
|
94
147
|
this.sessionAllow.clear();
|
|
95
148
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
149
|
+
/** `opts.nodeId` names the spawned child this check is for; it is stamped
|
|
150
|
+
* onto the reported DecisionEvent so a host can attribute the decision
|
|
151
|
+
* (a policy-less child shares its parent's service, see spawn.ts). */
|
|
152
|
+
async check(tool, input, opts) {
|
|
153
|
+
const baseLevel = this.resolveBaseLevel(tool);
|
|
154
|
+
const ceilingLevel = this.resolveCeilingLevel(tool);
|
|
155
|
+
const level = mostRestrictive(baseLevel, ceilingLevel);
|
|
156
|
+
const { decision, by, answerRef } = await this.decide(level, baseLevel, ceilingLevel, tool, input, opts?.detail);
|
|
157
|
+
this.report({
|
|
158
|
+
subject: { name: tool.name, ...(tool.address ? { address: tool.address } : {}), ...(tool.mutates !== undefined ? { mutates: tool.mutates } : {}) },
|
|
159
|
+
input, level, baseLevel, ceilingLevel, decision, by,
|
|
160
|
+
policy: this.policy.name,
|
|
161
|
+
...(opts?.nodeId ? { nodeId: opts.nodeId } : {}),
|
|
162
|
+
...(answerRef ? { answerRef } : {}),
|
|
163
|
+
});
|
|
164
|
+
return decision;
|
|
99
165
|
}
|
|
100
166
|
/**
|
|
101
167
|
* Resolve the effective level. Base precedence (highest first):
|
|
@@ -169,17 +235,51 @@ export class PermissionService {
|
|
|
169
235
|
return matched;
|
|
170
236
|
return c.defaultLevel ?? 'allow';
|
|
171
237
|
}
|
|
172
|
-
async decide(level,
|
|
238
|
+
async decide(level, baseLevel, ceilingLevel, tool, input, detailOf) {
|
|
173
239
|
if (level === 'allow')
|
|
174
|
-
return 'allow';
|
|
175
|
-
if (level === 'deny')
|
|
176
|
-
return 'deny';
|
|
240
|
+
return { decision: 'allow', by: 'policy' };
|
|
241
|
+
if (level === 'deny') {
|
|
242
|
+
return { decision: 'deny', by: ceilingLevel === 'deny' && baseLevel !== 'deny' ? 'ceiling' : 'policy' };
|
|
243
|
+
}
|
|
177
244
|
// level === 'ask'
|
|
178
|
-
|
|
179
|
-
|
|
245
|
+
// A checkpoint (plan, push, pull request, delegation) is decided by a
|
|
246
|
+
// person each time: no session allow and no standing rule answers it, not
|
|
247
|
+
// even one that predates this rule. Only the policy can lift the ask.
|
|
248
|
+
const checkpoint = isCheckpointTool(tool);
|
|
249
|
+
if (!checkpoint && this.sessionAllow.size && matchesAnyGlob(tool.name, [...this.sessionAllow]))
|
|
250
|
+
return { decision: 'allow', by: 'session' };
|
|
251
|
+
if (!checkpoint && this.standing && ceilingLevel !== 'ask' && (await this.standingMatches(tool)))
|
|
252
|
+
return { decision: 'allow', by: 'standing' };
|
|
180
253
|
if (!this.prompt)
|
|
181
|
-
return 'deny';
|
|
182
|
-
|
|
254
|
+
return { decision: 'deny', by: 'no-prompt' };
|
|
255
|
+
const detail = detailOf ? await boundedDetail(detailOf) : null;
|
|
256
|
+
const subject = { name: tool.name, ...(tool.address ? { address: tool.address } : {}), ...(tool.mutates !== undefined ? { mutates: tool.mutates } : {}) };
|
|
257
|
+
// Never eligible when the ceiling imposed the ask (spec section 2.3), the
|
|
258
|
+
// tool runs arbitrary commands, or it is a checkpoint (approvals/shellTools.ts).
|
|
259
|
+
const standingEligible = ceilingLevel !== 'ask' && !isNeverStanding(subject);
|
|
260
|
+
const answer = await this.prompt.ask({ tool: tool.name, input, ...(detail ? { detail } : {}), subject, standingEligible });
|
|
261
|
+
if (typeof answer === 'string')
|
|
262
|
+
return { decision: answer, by: 'human' };
|
|
263
|
+
return { decision: answer.decision, by: answer.by, ...(answer.answerRef ? { answerRef: answer.answerRef } : {}) };
|
|
264
|
+
}
|
|
265
|
+
/** Fail toward the human: a lookup failure is "no match", never "allow". */
|
|
266
|
+
async standingMatches(tool) {
|
|
267
|
+
try {
|
|
268
|
+
return (await this.standing?.matches(tool)) === true;
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
report(e) {
|
|
275
|
+
if (!this.onDecision)
|
|
276
|
+
return;
|
|
277
|
+
try {
|
|
278
|
+
this.onDecision(e);
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
/* observer failures never reach the decision path */
|
|
282
|
+
}
|
|
183
283
|
}
|
|
184
284
|
}
|
|
185
285
|
//# sourceMappingURL=permission-service.js.map
|