zelari-code 2.12.0 → 2.14.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/cli/headless/policyGate.js +101 -0
- package/dist/cli/headless/policyGate.js.map +1 -0
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/kraken/completionProof.js +89 -41
- package/dist/cli/kraken/completionProof.js.map +1 -1
- package/dist/cli/kraken/completionProofAttestation.js +157 -0
- package/dist/cli/kraken/completionProofAttestation.js.map +1 -0
- package/dist/cli/kraken/completionProofPersist.js +219 -0
- package/dist/cli/kraken/completionProofPersist.js.map +1 -0
- package/dist/cli/kraken/completionProofProbe.js +135 -0
- package/dist/cli/kraken/completionProofProbe.js.map +1 -0
- package/dist/cli/kraken/contractCompiler.js +142 -0
- package/dist/cli/kraken/contractCompiler.js.map +1 -0
- package/dist/cli/kraken/delegationPolicy.js +40 -3
- package/dist/cli/kraken/delegationPolicy.js.map +1 -1
- package/dist/cli/kraken/executor.js +462 -9
- package/dist/cli/kraken/executor.js.map +1 -1
- package/dist/cli/kraken/fileOwnership.js +190 -0
- package/dist/cli/kraken/fileOwnership.js.map +1 -0
- package/dist/cli/kraken/modelReputation.js +208 -0
- package/dist/cli/kraken/modelReputation.js.map +1 -0
- package/dist/cli/kraken/nativeVerification.js +53 -11
- package/dist/cli/kraken/nativeVerification.js.map +1 -1
- package/dist/cli/kraken/planner.js +2 -0
- package/dist/cli/kraken/planner.js.map +1 -1
- package/dist/cli/kraken/reputationStore.js +139 -0
- package/dist/cli/kraken/reputationStore.js.map +1 -0
- package/dist/cli/kraken/semanticOwnership.js +184 -0
- package/dist/cli/kraken/semanticOwnership.js.map +1 -0
- package/dist/cli/kraken/spawnRoi.js +209 -0
- package/dist/cli/kraken/spawnRoi.js.map +1 -0
- package/dist/cli/kraken/transactional.js +104 -0
- package/dist/cli/kraken/transactional.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/dotnet.js +49 -0
- package/dist/cli/kraken/verificationAdapters/dotnet.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/go.js +36 -0
- package/dist/cli/kraken/verificationAdapters/go.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/index.js +47 -0
- package/dist/cli/kraken/verificationAdapters/index.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/java.js +102 -0
- package/dist/cli/kraken/verificationAdapters/java.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/node.js +90 -0
- package/dist/cli/kraken/verificationAdapters/node.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/python.js +86 -0
- package/dist/cli/kraken/verificationAdapters/python.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/rust.js +39 -0
- package/dist/cli/kraken/verificationAdapters/rust.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/types.js +2 -0
- package/dist/cli/kraken/verificationAdapters/types.js.map +1 -0
- package/dist/cli/kraken/verificationBridge.js +40 -3
- package/dist/cli/kraken/verificationBridge.js.map +1 -1
- package/dist/cli/kraken/verifierLifecycle.js +51 -36
- package/dist/cli/kraken/verifierLifecycle.js.map +1 -1
- package/dist/cli/kraken/verifierRouting.js +264 -0
- package/dist/cli/kraken/verifierRouting.js.map +1 -0
- package/dist/cli/kraken/worktreeScheduling.js +201 -0
- package/dist/cli/kraken/worktreeScheduling.js.map +1 -0
- package/dist/cli/main.bundled.js +4085 -939
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/orchestration/facts.js +127 -0
- package/dist/cli/orchestration/facts.js.map +1 -0
- package/dist/cli/orchestration/policy.js +128 -75
- package/dist/cli/orchestration/policy.js.map +1 -1
- package/dist/cli/orchestration/signals.js +96 -0
- package/dist/cli/orchestration/signals.js.map +1 -0
- package/dist/cli/runHeadless.js +92 -19
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/safety/policyEngine.js +217 -43
- package/dist/cli/safety/policyEngine.js.map +1 -1
- package/dist/cli/safety/policyLayers.js +55 -0
- package/dist/cli/safety/policyLayers.js.map +1 -0
- package/dist/cli/safety/policyLoadMode.js +59 -0
- package/dist/cli/safety/policyLoadMode.js.map +1 -0
- package/dist/cli/safety/resourceClaims.js +373 -0
- package/dist/cli/safety/resourceClaims.js.map +1 -0
- package/dist/cli/safety/sandboxPath.js +160 -17
- package/dist/cli/safety/sandboxPath.js.map +1 -1
- package/dist/cli/toolRegistry.js +114 -15
- package/dist/cli/toolRegistry.js.map +1 -1
- package/dist/cli/tools/execProcess.js +121 -0
- package/dist/cli/tools/execProcess.js.map +1 -0
- package/dist/cli/tools/krakenCsvFanout.js +4 -4
- package/dist/cli/tools/krakenCsvFanout.js.map +1 -1
- package/dist/cli/tools/krakenRadio.js +9 -0
- package/dist/cli/tools/krakenRadio.js.map +1 -1
- package/dist/cli/tools/taskTool.js +12 -6
- package/dist/cli/tools/taskTool.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,56 +1,122 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Policy engine
|
|
2
|
+
* Policy engine v2 (P0.A) — per-command and per-path permission rules per
|
|
3
3
|
* agent, layered on top of the per-CATEGORY policy in toolPermissions.ts.
|
|
4
4
|
*
|
|
5
5
|
* Rules come from two USER-authored config files (same trust level as
|
|
6
|
-
* AGENTS.MD — deliberately NO trust subsystem here; the
|
|
7
|
-
*
|
|
8
|
-
* with-lease*` that the global file denies):
|
|
6
|
+
* AGENTS.MD — deliberately NO trust subsystem here; the GLOBAL file is the
|
|
7
|
+
* user's personal floor, which the project file can NO LONGER relax):
|
|
9
8
|
*
|
|
10
|
-
* <root>/.zelari/policy.json — project rules
|
|
11
|
-
* ~/.zelari/policy.json — global
|
|
9
|
+
* <root>/.zelari/policy.json — project rules
|
|
10
|
+
* ~/.zelari/policy.json — global rules
|
|
12
11
|
*
|
|
13
12
|
* Shape:
|
|
14
13
|
* {
|
|
15
|
-
* version?: 1,
|
|
14
|
+
* version?: 1 | 2,
|
|
16
15
|
* agents: {
|
|
17
|
-
* lead? : { shell?: Rule[], edit?: Rule[] },
|
|
18
|
-
* explore? : { shell?: Rule[], edit?: Rule[] },
|
|
19
|
-
* general? : { shell?: Rule[], edit?: Rule[] },
|
|
20
|
-
* verify? : { shell?: Rule[], edit?: Rule[] }
|
|
16
|
+
* lead? : { shell?: Rule[], edit?: Rule[], claims?: ClaimRule[] },
|
|
17
|
+
* explore? : { shell?: Rule[], edit?: Rule[], claims?: ClaimRule[] },
|
|
18
|
+
* general? : { shell?: Rule[], edit?: Rule[], claims?: ClaimRule[] },
|
|
19
|
+
* verify? : { shell?: Rule[], edit?: Rule[], claims?: ClaimRule[] }
|
|
21
20
|
* }
|
|
22
21
|
* }
|
|
23
22
|
* Rule = { match: string, effect: 'allow' | 'ask' | 'deny', reason?: string }
|
|
24
23
|
*
|
|
24
|
+
* P0.C1 adds the optional per-agent `claims` section (v2 resource-claim
|
|
25
|
+
* rules — one rule per touched path/process/network/mcp/ssh resource, each
|
|
26
|
+
* matched independently then intersected deny > ask > allow). Version 2 is
|
|
27
|
+
* accepted for `claims`; `version: 1` files keep working EXACTLY unchanged
|
|
28
|
+
* (they simply never carry a claims key). See resourceClaims.ts.
|
|
29
|
+
*
|
|
25
30
|
* `match` is a GLOB-style prefix pattern: `git push*` matches any command
|
|
26
31
|
* starting with "git push"; `src/**` matches any path under src/; `*` alone
|
|
27
|
-
* matches everything. Within one
|
|
28
|
-
* wins (
|
|
29
|
-
*
|
|
32
|
+
* matches everything. Within one LAYER's ordered rule list the FIRST match
|
|
33
|
+
* wins (P0.A): the two layers stay SEPARATE and combine RESTRICT-ONLY — every
|
|
34
|
+
* matching rule intersects with the category decision, most-restrictive-wins
|
|
35
|
+
* (deny > ask > allow), so a global deny can never be masked by the project.
|
|
36
|
+
* Escape hatch: ZELARI_POLICY_PRECEDENCE=legacy restores the v1 behavior
|
|
37
|
+
* (project rules concatenated before global ones, first-match overrides);
|
|
38
|
+
* the active mode is exposed as `PolicySet.precedence`.
|
|
30
39
|
*
|
|
31
40
|
* Fail-closed conventions (mirrors toolPermissions.ts): a missing file is
|
|
32
|
-
* silently empty; a broken file NEVER throws
|
|
33
|
-
* in `warnings` and the offending
|
|
41
|
+
* silently empty; a broken file NEVER throws in the default `permissive`
|
|
42
|
+
* mode — the parse error is collected in `warnings` and the offending
|
|
43
|
+
* file/section is ignored. P0.B adds `strict` mode: an EXISTING file that
|
|
44
|
+
* fails JSON/schema validation throws PolicyLoadError so headless/CI/mission
|
|
45
|
+
* hosts can block the run (exit 2, reason `policy-load-failed`); resolution
|
|
46
|
+
* of the active mode lives in policyLoadMode.ts. Opt out entirely
|
|
34
47
|
* with ZELARI_POLICY=0 (always the empty set).
|
|
35
48
|
*
|
|
36
49
|
* Hand-rolled validators on purpose: no zod, no new deps.
|
|
37
50
|
*
|
|
38
|
-
* @since v2.12.0
|
|
51
|
+
* @since v2.12.0 · restrict-only layers v2.13.0
|
|
39
52
|
*/
|
|
40
53
|
import { readFileSync } from 'node:fs';
|
|
41
54
|
import { homedir } from 'node:os';
|
|
42
55
|
import path from 'node:path';
|
|
56
|
+
/**
|
|
57
|
+
* Thrown ONLY in strict mode when a policy file exists but fails JSON or
|
|
58
|
+
* schema parsing. Carries machine-readable fields so hosts (headless runner,
|
|
59
|
+
* CI gates) can classify the failure without string matching:
|
|
60
|
+
* `code` ('policy_invalid'), absolute-ish `file` path as passed to the
|
|
61
|
+
* loader, optional 1-based `line` when derivable from the parser position,
|
|
62
|
+
* and the human `message`.
|
|
63
|
+
*/
|
|
64
|
+
export class PolicyLoadError extends Error {
|
|
65
|
+
/** Machine-readable discriminator: always 'policy_invalid'. */
|
|
66
|
+
code;
|
|
67
|
+
/** Path of the offending policy file (absolute when the caller passed one). */
|
|
68
|
+
file;
|
|
69
|
+
/** 1-based source line when derivable from the JSON error position. */
|
|
70
|
+
line;
|
|
71
|
+
constructor(file, detail, opts = {}) {
|
|
72
|
+
super(`${file}: ${detail}`);
|
|
73
|
+
this.name = 'PolicyLoadError';
|
|
74
|
+
this.code = 'policy_invalid';
|
|
75
|
+
this.file = file;
|
|
76
|
+
if (opts.line !== undefined)
|
|
77
|
+
this.line = opts.line;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Claim kinds accepted by the v2 schema (`ui`/`agent` parse today; they
|
|
81
|
+
* are not emitted by any tool yet — evaluation deferred to v1.1). */
|
|
82
|
+
export const CLAIM_KINDS = [
|
|
83
|
+
'path',
|
|
84
|
+
'process',
|
|
85
|
+
'network',
|
|
86
|
+
'mcp',
|
|
87
|
+
'ssh',
|
|
88
|
+
'ui',
|
|
89
|
+
'agent',
|
|
90
|
+
];
|
|
43
91
|
/** The authoritative agent keys ('lead' = the main registry; the three
|
|
44
92
|
* sub-agent kinds mirror taskAgentToProfile in toolRegistry.ts). */
|
|
45
93
|
export const POLICY_AGENTS = ['lead', 'explore', 'general', 'verify'];
|
|
46
94
|
const KNOWN_AGENTS = new Set(POLICY_AGENTS);
|
|
47
95
|
export const EMPTY_POLICY_RULE_SET = { shell: [], edit: [] };
|
|
96
|
+
export const EMPTY_POLICY_LAYERS = {
|
|
97
|
+
global: EMPTY_POLICY_RULE_SET,
|
|
98
|
+
project: EMPTY_POLICY_RULE_SET,
|
|
99
|
+
};
|
|
48
100
|
export function emptyPolicySet() {
|
|
49
|
-
return { agents: new Map(), warnings: [] };
|
|
101
|
+
return { agents: new Map(), warnings: [], precedence: policyPrecedenceFromEnv() };
|
|
102
|
+
}
|
|
103
|
+
/** Raw layers for one agent; unknown/unlisted agents get the empty layers. */
|
|
104
|
+
export function agentLayersFor(set, agent) {
|
|
105
|
+
return set.agents.get(agent) ?? EMPTY_POLICY_LAYERS;
|
|
50
106
|
}
|
|
51
|
-
/**
|
|
107
|
+
/**
|
|
108
|
+
* COMPAT view (v1 shape): project rules then global rules in ONE list —
|
|
109
|
+
* first-match over this concatenation IS legacy precedence. Restrict-only
|
|
110
|
+
* consumers must use agentLayersFor + matchAgentPolicyRuleLayered instead.
|
|
111
|
+
*/
|
|
52
112
|
export function agentRulesFor(set, agent) {
|
|
53
|
-
|
|
113
|
+
const l = set.agents.get(agent);
|
|
114
|
+
if (!l)
|
|
115
|
+
return EMPTY_POLICY_RULE_SET;
|
|
116
|
+
return {
|
|
117
|
+
shell: [...l.project.shell, ...l.global.shell],
|
|
118
|
+
edit: [...l.project.edit, ...l.global.edit],
|
|
119
|
+
};
|
|
54
120
|
}
|
|
55
121
|
// ── Glob matching ──────────────────────────────────────────────────────────
|
|
56
122
|
/**
|
|
@@ -97,7 +163,8 @@ export function resolvePolicyRule(rules, value) {
|
|
|
97
163
|
return null;
|
|
98
164
|
}
|
|
99
165
|
// ── Merge with the category decision ──────────────────────────────────────
|
|
100
|
-
|
|
166
|
+
/** Shared lattice with policyLayers.ts intersectEffects: deny > ask > allow. */
|
|
167
|
+
export const EFFECT_RANK = { allow: 0, ask: 1, deny: 2 };
|
|
101
168
|
/**
|
|
102
169
|
* Merge a matched rule's effect into the category-level action under the
|
|
103
170
|
* same lattice as intersectPermissionPolicy: deny > ask > allow. A rule can
|
|
@@ -115,7 +182,7 @@ export function mergeRuleEffect(base, rule) {
|
|
|
115
182
|
* whether the model passed `src/x.ts` or `E:\repo\src\x.ts`). Root-relative
|
|
116
183
|
* first — it is what users write in policy.json.
|
|
117
184
|
*/
|
|
118
|
-
function pathCandidates(value, root) {
|
|
185
|
+
export function pathCandidates(value, root) {
|
|
119
186
|
const norm = normalizeForMatch(value);
|
|
120
187
|
if (!root)
|
|
121
188
|
return [norm];
|
|
@@ -164,6 +231,17 @@ export function isPolicyEngineDisabled() {
|
|
|
164
231
|
const v = process.env.ZELARI_POLICY?.trim().toLowerCase();
|
|
165
232
|
return v === '0' || v === 'false' || v === 'no' || v === 'off';
|
|
166
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* P0.A escape hatch: ZELARI_POLICY_PRECEDENCE=legacy selects the v1
|
|
236
|
+
* project-overrides-global first-match behavior; any other value (unset
|
|
237
|
+
* included) selects the default restrict-only layering. Read at policy-load
|
|
238
|
+
* time and exposed as PolicySet.precedence so callers/tests can assert the
|
|
239
|
+
* active mode.
|
|
240
|
+
*/
|
|
241
|
+
export function policyPrecedenceFromEnv() {
|
|
242
|
+
const v = process.env.ZELARI_POLICY_PRECEDENCE?.trim().toLowerCase();
|
|
243
|
+
return v === 'legacy' ? 'legacy' : 'restrict-only';
|
|
244
|
+
}
|
|
167
245
|
function isPlainObject(v) {
|
|
168
246
|
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
169
247
|
}
|
|
@@ -196,6 +274,55 @@ function parseRuleList(raw, origin, warnings) {
|
|
|
196
274
|
});
|
|
197
275
|
return out;
|
|
198
276
|
}
|
|
277
|
+
/**
|
|
278
|
+
* v2 claim-rule list (same rule-level discipline as parseRuleList: a
|
|
279
|
+
* malformed SINGLE rule is skipped with a warning in BOTH load modes and
|
|
280
|
+
* never drops the whole file/section).
|
|
281
|
+
*/
|
|
282
|
+
function parseClaimRuleList(raw, origin, warnings) {
|
|
283
|
+
if (raw === undefined)
|
|
284
|
+
return [];
|
|
285
|
+
if (!Array.isArray(raw)) {
|
|
286
|
+
warnings.push(`${origin}: expected an array of claim rules, got ${typeof raw} — section ignored.`);
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
const out = [];
|
|
290
|
+
raw.forEach((item, i) => {
|
|
291
|
+
const where = `${origin}[${i}]`;
|
|
292
|
+
if (!isPlainObject(item)) {
|
|
293
|
+
warnings.push(`${where}: claim rule is not an object — skipped.`);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const kind = item['kind'];
|
|
297
|
+
const pattern = item['pattern'];
|
|
298
|
+
const effect = item['effect'];
|
|
299
|
+
const reason = item['reason'];
|
|
300
|
+
const operation = item['operation'];
|
|
301
|
+
if (typeof kind !== 'string' || !CLAIM_KINDS.includes(kind)) {
|
|
302
|
+
warnings.push(`${where}: "kind" must be one of ${CLAIM_KINDS.join(' | ')} — skipped.`);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (typeof pattern !== 'string' || pattern.trim() === '') {
|
|
306
|
+
warnings.push(`${where} (${kind}): missing or empty "pattern" — skipped.`);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (effect !== 'allow' && effect !== 'ask' && effect !== 'deny') {
|
|
310
|
+
warnings.push(`${where} (${kind}): "effect" must be allow|ask|deny — skipped.`);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
let op;
|
|
314
|
+
if (operation !== undefined) {
|
|
315
|
+
if (kind !== 'path' || (operation !== 'read' && operation !== 'write')) {
|
|
316
|
+
warnings.push(`${where} (${kind}): "operation" is only valid as read|write on kind "path" — skipped.`);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
op = operation;
|
|
320
|
+
}
|
|
321
|
+
const base = op === undefined ? { kind, pattern, effect } : { kind, pattern, effect, operation: op };
|
|
322
|
+
out.push(typeof reason === 'string' && reason.trim() !== '' ? { ...base, reason } : base);
|
|
323
|
+
});
|
|
324
|
+
return out;
|
|
325
|
+
}
|
|
199
326
|
/** Returns null when the WHOLE file must be ignored (bad shape / version). */
|
|
200
327
|
function parsePolicyFile(raw, origin, warnings) {
|
|
201
328
|
if (!isPlainObject(raw)) {
|
|
@@ -203,8 +330,8 @@ function parsePolicyFile(raw, origin, warnings) {
|
|
|
203
330
|
return null;
|
|
204
331
|
}
|
|
205
332
|
const version = raw['version'];
|
|
206
|
-
if (version !== undefined && version !== 1) {
|
|
207
|
-
warnings.push(`${origin}: unsupported "version" ${JSON.stringify(version)} (expected 1) — file ignored.`);
|
|
333
|
+
if (version !== undefined && version !== 1 && version !== 2) {
|
|
334
|
+
warnings.push(`${origin}: unsupported "version" ${JSON.stringify(version)} (expected 1 or 2) — file ignored.`);
|
|
208
335
|
return null;
|
|
209
336
|
}
|
|
210
337
|
const agentsRaw = raw['agents'];
|
|
@@ -229,18 +356,39 @@ function parsePolicyFile(raw, origin, warnings) {
|
|
|
229
356
|
}
|
|
230
357
|
const shell = parseRuleList(val['shell'], `${origin} agents.${key}.shell`, warnings);
|
|
231
358
|
const edit = parseRuleList(val['edit'], `${origin} agents.${key}.edit`, warnings);
|
|
232
|
-
|
|
359
|
+
const claims = parseClaimRuleList(val['claims'], `${origin} agents.${key}.claims`, warnings);
|
|
360
|
+
out.set(agent, { shell, edit, ...(claims.length > 0 ? { claims } : {}) });
|
|
233
361
|
}
|
|
234
362
|
return out;
|
|
235
363
|
}
|
|
236
|
-
|
|
364
|
+
/**
|
|
365
|
+
* Best-effort 1-based line for a JSON syntax error: V8 puts the offending
|
|
366
|
+
* offset in the message ("at position N") on many Node versions; older or
|
|
367
|
+
* alternative engines may not — `line` then stays undefined (cheap only).
|
|
368
|
+
*/
|
|
369
|
+
function jsonErrorLine(text, message) {
|
|
370
|
+
const m = /(?:at )?position (\d+)/i.exec(message);
|
|
371
|
+
if (!m)
|
|
372
|
+
return undefined;
|
|
373
|
+
const pos = Number(m[1]);
|
|
374
|
+
if (!Number.isInteger(pos) || pos < 0)
|
|
375
|
+
return undefined;
|
|
376
|
+
let line = 1;
|
|
377
|
+
for (let i = 0; i < pos && i < text.length; i++) {
|
|
378
|
+
if (text.charCodeAt(i) === 10)
|
|
379
|
+
line++; // '\n'
|
|
380
|
+
}
|
|
381
|
+
return line;
|
|
382
|
+
}
|
|
383
|
+
function readPolicyFile(file, warnings, mode) {
|
|
237
384
|
let text;
|
|
238
385
|
try {
|
|
239
386
|
text = readFileSync(file, 'utf8');
|
|
240
387
|
}
|
|
241
388
|
catch {
|
|
242
389
|
// Missing file is the common case (most repos/users have none) — not a
|
|
243
|
-
// warning, just no rules from this source
|
|
390
|
+
// warning, just no rules from this source (in strict mode too: ABSENCE
|
|
391
|
+
// is fine, a PRESENT-but-broken file is what strict rejects).
|
|
244
392
|
return new Map();
|
|
245
393
|
}
|
|
246
394
|
let parsed;
|
|
@@ -248,33 +396,59 @@ function readPolicyFile(file, warnings) {
|
|
|
248
396
|
parsed = JSON.parse(text);
|
|
249
397
|
}
|
|
250
398
|
catch (err) {
|
|
251
|
-
|
|
399
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
400
|
+
warnings.push(`${file}: invalid JSON (${detail}) — file ignored.`);
|
|
401
|
+
if (mode === 'strict') {
|
|
402
|
+
const line = jsonErrorLine(text, detail);
|
|
403
|
+
throw new PolicyLoadError(file, `invalid JSON (${detail})`, {
|
|
404
|
+
...(line !== undefined ? { line } : {}),
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
return new Map();
|
|
408
|
+
}
|
|
409
|
+
const before = warnings.length;
|
|
410
|
+
const parsedRules = parsePolicyFile(parsed, file, warnings);
|
|
411
|
+
if (parsedRules === null) {
|
|
412
|
+
// Whole-file schema reject (not an object / unsupported version / missing
|
|
413
|
+
// "agents" / "agents" not an object) — the reasons were pushed above.
|
|
414
|
+
const why = warnings.slice(before).join('; ') || 'file rejected by schema validation';
|
|
415
|
+
if (mode === 'strict')
|
|
416
|
+
throw new PolicyLoadError(file, why);
|
|
252
417
|
return new Map();
|
|
253
418
|
}
|
|
254
|
-
return
|
|
419
|
+
return parsedRules;
|
|
255
420
|
}
|
|
256
421
|
/**
|
|
257
|
-
* Load
|
|
258
|
-
* (`~/.zelari/policy.json`) rule sets
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
*
|
|
422
|
+
* Load the project (`<root>/.zelari/policy.json`) and global
|
|
423
|
+
* (`~/.zelari/policy.json`) rule sets into DISTINCT layers (P0.A): the two
|
|
424
|
+
* sources are NEVER concatenated at load time — evaluation intersects them
|
|
425
|
+
* restrict-only (matchAgentPolicyRuleLayered in policyLayers.ts) unless
|
|
426
|
+
* ZELARI_POLICY_PRECEDENCE=legacy restores the v1 concat view.
|
|
427
|
+
*
|
|
428
|
+
* Loading discipline (P0.B): in `permissive` mode (default, v1 behavior)
|
|
429
|
+
* this NEVER throws — broken files yield warnings + whatever parsed cleanly.
|
|
430
|
+
* In `strict` mode a file that EXISTS but fails JSON/schema validation throws
|
|
431
|
+
* PolicyLoadError (`code: 'policy_invalid'`, `file`, optional `line`); hosts
|
|
432
|
+
* decide what to do — the headless runner turns it into exit 2 / reason
|
|
433
|
+
* `policy-load-failed` (headless/policyGate.ts). Missing files stay empty in
|
|
434
|
+
* both modes. Pass `homeDir` to override the global-file location (tests).
|
|
263
435
|
*/
|
|
264
436
|
export function loadPolicySet(root, opts = {}) {
|
|
265
437
|
if (isPolicyEngineDisabled())
|
|
266
438
|
return emptyPolicySet();
|
|
439
|
+
const mode = opts.mode ?? 'permissive';
|
|
267
440
|
const warnings = [];
|
|
268
|
-
const
|
|
269
|
-
const
|
|
441
|
+
const precedence = policyPrecedenceFromEnv();
|
|
442
|
+
const project = readPolicyFile(path.join(root, '.zelari', 'policy.json'), warnings, mode);
|
|
443
|
+
const global = readPolicyFile(path.join(opts.homeDir ?? homedir(), '.zelari', 'policy.json'), warnings, mode);
|
|
270
444
|
const agents = new Map();
|
|
271
|
-
for (const [agent, g] of global) {
|
|
272
|
-
agents.set(agent, { shell: [...g.shell], edit: [...g.edit] });
|
|
273
|
-
}
|
|
274
445
|
for (const [agent, p] of project) {
|
|
275
|
-
|
|
276
|
-
|
|
446
|
+
agents.set(agent, { project: p, global: EMPTY_POLICY_RULE_SET });
|
|
447
|
+
}
|
|
448
|
+
for (const [agent, g] of global) {
|
|
449
|
+
const l = agents.get(agent);
|
|
450
|
+
agents.set(agent, l ? { ...l, global: g } : { project: EMPTY_POLICY_RULE_SET, global: g });
|
|
277
451
|
}
|
|
278
|
-
return { agents, warnings };
|
|
452
|
+
return { agents, warnings, precedence };
|
|
279
453
|
}
|
|
280
454
|
//# sourceMappingURL=policyEngine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policyEngine.js","sourceRoot":"","sources":["../../../src/cli/safety/policyEngine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"policyEngine.js","sourceRoot":"","sources":["../../../src/cli/safety/policyEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { EFFECT_RANK, matchAgentPolicyRule, } from './policyEngine.js';
|
|
2
|
+
/**
|
|
3
|
+
* Intersect candidate effects into ONE effect: deny > ask > allow. Absent
|
|
4
|
+
* matches arrive as `undefined` and simply do not constrain the result; with
|
|
5
|
+
* NO constraint at all the slot is unconstrained (`allow`). Feed this the
|
|
6
|
+
* category decision plus every layer's matched effect and the result is the
|
|
7
|
+
* effective action — no operand can ever RELAX another.
|
|
8
|
+
*/
|
|
9
|
+
export function intersectEffects(...effects) {
|
|
10
|
+
let best;
|
|
11
|
+
for (const effect of effects) {
|
|
12
|
+
if (effect === undefined)
|
|
13
|
+
continue;
|
|
14
|
+
if (best === undefined || EFFECT_RANK[effect] > EFFECT_RANK[best])
|
|
15
|
+
best = effect;
|
|
16
|
+
}
|
|
17
|
+
return best ?? 'allow';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve THIS agent's policy contribution across BOTH layers for one tool
|
|
21
|
+
* invocation:
|
|
22
|
+
*
|
|
23
|
+
* - `restrict-only` (default): each layer matches independently and the
|
|
24
|
+
* STRICTER effect wins; equal ranks surface the project rule (it is the
|
|
25
|
+
* more specific intent).
|
|
26
|
+
* - `legacy`: v1 semantics — project rules concatenated before global ones,
|
|
27
|
+
* FIRST match wins (a project match masks the global rule entirely).
|
|
28
|
+
*
|
|
29
|
+
* Either way a single rule carries the effect the caller must intersect into
|
|
30
|
+
* the category decision (see intersectEffects and wrapWithPermissions in
|
|
31
|
+
* toolRegistry.ts). Tools with no usable argument match nothing in both
|
|
32
|
+
* layers → null, leaving the category decision untouched.
|
|
33
|
+
*/
|
|
34
|
+
export function matchAgentPolicyRuleLayered(layers, precedence, required, args, root) {
|
|
35
|
+
if (!layers)
|
|
36
|
+
return null;
|
|
37
|
+
if (precedence === 'legacy') {
|
|
38
|
+
// v1: ONE concatenated list — project rules first, first-match-wins.
|
|
39
|
+
return matchAgentPolicyRule({
|
|
40
|
+
shell: [...layers.project.shell, ...layers.global.shell],
|
|
41
|
+
edit: [...layers.project.edit, ...layers.global.edit],
|
|
42
|
+
}, required, args, root);
|
|
43
|
+
}
|
|
44
|
+
// Default restrict-only: independent matches, stricter effect wins (ties
|
|
45
|
+
// keep the project rule as the surfaced representative).
|
|
46
|
+
const g = matchAgentPolicyRule(layers.global, required, args, root);
|
|
47
|
+
const p = matchAgentPolicyRule(layers.project, required, args, root);
|
|
48
|
+
if (!g)
|
|
49
|
+
return p;
|
|
50
|
+
if (!p)
|
|
51
|
+
return g;
|
|
52
|
+
const win = intersectEffects(p.effect, g.effect);
|
|
53
|
+
return p.effect === win ? p : g;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=policyLayers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyLayers.js","sourceRoot":"","sources":["../../../src/cli/safety/policyLayers.ts"],"names":[],"mappings":"AAsBA,OAAO,EACL,WAAW,EACX,oBAAoB,GAIrB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAG,OAA4C;IAC9E,IAAI,IAAkC,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,IAAI,IAAI,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,MAAM,CAAC;IACnF,CAAC;IACD,OAAO,IAAI,IAAI,OAAO,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAwC,EACxC,UAA4B,EAC5B,QAAmC,EACnC,IAAa,EACb,IAAa;IAEb,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,qEAAqE;QACrE,OAAO,oBAAoB,CACzB;YACE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YACxD,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;SACtD,EACD,QAAQ,EACR,IAAI,EACJ,IAAI,CACL,CAAC;IACJ,CAAC;IACD,yEAAyE;IACzE,yDAAyD;IACzD,MAAM,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrE,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** Env override accepted by resolvePolicyLoadMode. */
|
|
2
|
+
export const POLICY_LOAD_MODE_ENV = 'ZELARI_POLICY_LOAD_MODE';
|
|
3
|
+
/** Machine-readable teardown reason for a blocked run (headless NDJSON + spine). */
|
|
4
|
+
export const POLICY_LOAD_BLOCK_REASON = 'policy-load-failed';
|
|
5
|
+
/**
|
|
6
|
+
* Exit code for a strict load failure. Deliberately 2 — the existing
|
|
7
|
+
* headless map already labels 2 as "runtime error" (provider failure,
|
|
8
|
+
* council exception): an unreadable policy is exactly that class of
|
|
9
|
+
* harness-level failure. Exit 4 stays reserved for the strict COMPLETION
|
|
10
|
+
* gate (verificationBridge.STRICT_DONE_EXIT_CODE) so the two never collide.
|
|
11
|
+
*/
|
|
12
|
+
export const POLICY_LOAD_EXIT_CODE = 2;
|
|
13
|
+
function isTruthyFlag(v) {
|
|
14
|
+
const n = v?.trim().toLowerCase();
|
|
15
|
+
return n === '1' || n === 'true' || n === 'yes' || n === 'on';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Pure mode resolution. Any value of ZELARI_POLICY_LOAD_MODE other than
|
|
19
|
+
* exactly `strict` / `permissive` (case/space-insensitive) is IGNORED and
|
|
20
|
+
* falls through to the defaults — no typo silently flips strictness.
|
|
21
|
+
*/
|
|
22
|
+
export function resolvePolicyLoadMode(input) {
|
|
23
|
+
const v = input.override?.trim().toLowerCase();
|
|
24
|
+
if (v === 'strict')
|
|
25
|
+
return 'strict';
|
|
26
|
+
if (v === 'permissive')
|
|
27
|
+
return 'permissive';
|
|
28
|
+
// Headless runners and missions get fail-closed file loading by default;
|
|
29
|
+
// interactive TUI only tightens when the ambient environment says CI.
|
|
30
|
+
if (input.surface === 'headless' || input.surface === 'mission')
|
|
31
|
+
return 'strict';
|
|
32
|
+
if (isTruthyFlag(input.ci))
|
|
33
|
+
return 'strict';
|
|
34
|
+
return 'permissive';
|
|
35
|
+
}
|
|
36
|
+
// ── Active-surface seam ──────────────────────────────────────────────────
|
|
37
|
+
// Process-lifetime configuration (hosts register once before dispatch);
|
|
38
|
+
// defaults to 'tui' because that is what imports toolRegistry directly.
|
|
39
|
+
let activeSurface = 'tui';
|
|
40
|
+
/** Register the host BEFORE building registries (runHeadless pre-flight). */
|
|
41
|
+
export function setActivePolicyLoadSurface(surface) {
|
|
42
|
+
activeSurface = surface;
|
|
43
|
+
}
|
|
44
|
+
/** Current host registration (read-mostly; exposed for tests/diagnostics). */
|
|
45
|
+
export function activePolicyLoadSurface() {
|
|
46
|
+
return activeSurface;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the ACTIVE policy-load mode from the registered surface + env.
|
|
50
|
+
* `env` is injectable so callers/tests avoid touching process.env.
|
|
51
|
+
*/
|
|
52
|
+
export function activePolicyLoadMode(env = process.env) {
|
|
53
|
+
return resolvePolicyLoadMode({
|
|
54
|
+
surface: activeSurface,
|
|
55
|
+
override: env[POLICY_LOAD_MODE_ENV],
|
|
56
|
+
ci: typeof env.CI === 'string' ? env.CI : undefined,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=policyLoadMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyLoadMode.js","sourceRoot":"","sources":["../../../src/cli/safety/policyLoadMode.ts"],"names":[],"mappings":"AAqBA,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAE9D,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAWvC,SAAS,YAAY,CAAC,CAAqB;IACzC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAiC;IACrE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACpC,IAAI,CAAC,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAC5C,yEAAyE;IACzE,sEAAsE;IACtE,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACjF,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,4EAA4E;AAC5E,wEAAwE;AACxE,wEAAwE;AAExE,IAAI,aAAa,GAAsB,KAAK,CAAC;AAE7C,6EAA6E;AAC7E,MAAM,UAAU,0BAA0B,CAAC,OAA0B;IACnE,aAAa,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB;IACrC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvE,OAAO,qBAAqB,CAAC;QAC3B,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,GAAG,CAAC,oBAAoB,CAAC;QACnC,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC,CAAC;AACL,CAAC"}
|