zelari-code 2.13.0 → 2.15.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.
Files changed (86) hide show
  1. package/dist/cli/desktopConfig.js +1 -1
  2. package/dist/cli/desktopConfig.js.map +1 -1
  3. package/dist/cli/headless/policyGate.js +101 -0
  4. package/dist/cli/headless/policyGate.js.map +1 -0
  5. package/dist/cli/headless.js.map +1 -1
  6. package/dist/cli/kraken/completionProof.js +89 -41
  7. package/dist/cli/kraken/completionProof.js.map +1 -1
  8. package/dist/cli/kraken/completionProofAttestation.js +157 -0
  9. package/dist/cli/kraken/completionProofAttestation.js.map +1 -0
  10. package/dist/cli/kraken/completionProofPersist.js +219 -0
  11. package/dist/cli/kraken/completionProofPersist.js.map +1 -0
  12. package/dist/cli/kraken/completionProofProbe.js +135 -0
  13. package/dist/cli/kraken/completionProofProbe.js.map +1 -0
  14. package/dist/cli/kraken/contractCompiler.js +142 -0
  15. package/dist/cli/kraken/contractCompiler.js.map +1 -0
  16. package/dist/cli/kraken/delegationPolicy.js +40 -3
  17. package/dist/cli/kraken/delegationPolicy.js.map +1 -1
  18. package/dist/cli/kraken/executor.js +462 -9
  19. package/dist/cli/kraken/executor.js.map +1 -1
  20. package/dist/cli/kraken/fileOwnership.js +190 -0
  21. package/dist/cli/kraken/fileOwnership.js.map +1 -0
  22. package/dist/cli/kraken/modelReputation.js +208 -0
  23. package/dist/cli/kraken/modelReputation.js.map +1 -0
  24. package/dist/cli/kraken/nativeVerification.js +53 -11
  25. package/dist/cli/kraken/nativeVerification.js.map +1 -1
  26. package/dist/cli/kraken/planner.js +2 -0
  27. package/dist/cli/kraken/planner.js.map +1 -1
  28. package/dist/cli/kraken/reputationStore.js +139 -0
  29. package/dist/cli/kraken/reputationStore.js.map +1 -0
  30. package/dist/cli/kraken/semanticOwnership.js +184 -0
  31. package/dist/cli/kraken/semanticOwnership.js.map +1 -0
  32. package/dist/cli/kraken/spawnRoi.js +209 -0
  33. package/dist/cli/kraken/spawnRoi.js.map +1 -0
  34. package/dist/cli/kraken/transactional.js +104 -0
  35. package/dist/cli/kraken/transactional.js.map +1 -0
  36. package/dist/cli/kraken/verificationAdapters/dotnet.js +49 -0
  37. package/dist/cli/kraken/verificationAdapters/dotnet.js.map +1 -0
  38. package/dist/cli/kraken/verificationAdapters/go.js +36 -0
  39. package/dist/cli/kraken/verificationAdapters/go.js.map +1 -0
  40. package/dist/cli/kraken/verificationAdapters/index.js +47 -0
  41. package/dist/cli/kraken/verificationAdapters/index.js.map +1 -0
  42. package/dist/cli/kraken/verificationAdapters/java.js +102 -0
  43. package/dist/cli/kraken/verificationAdapters/java.js.map +1 -0
  44. package/dist/cli/kraken/verificationAdapters/node.js +90 -0
  45. package/dist/cli/kraken/verificationAdapters/node.js.map +1 -0
  46. package/dist/cli/kraken/verificationAdapters/python.js +86 -0
  47. package/dist/cli/kraken/verificationAdapters/python.js.map +1 -0
  48. package/dist/cli/kraken/verificationAdapters/rust.js +39 -0
  49. package/dist/cli/kraken/verificationAdapters/rust.js.map +1 -0
  50. package/dist/cli/kraken/verificationAdapters/types.js +2 -0
  51. package/dist/cli/kraken/verificationAdapters/types.js.map +1 -0
  52. package/dist/cli/kraken/verificationBridge.js +40 -3
  53. package/dist/cli/kraken/verificationBridge.js.map +1 -1
  54. package/dist/cli/kraken/verifierLifecycle.js +51 -36
  55. package/dist/cli/kraken/verifierLifecycle.js.map +1 -1
  56. package/dist/cli/kraken/verifierRouting.js +264 -0
  57. package/dist/cli/kraken/verifierRouting.js.map +1 -0
  58. package/dist/cli/kraken/worktreeScheduling.js +201 -0
  59. package/dist/cli/kraken/worktreeScheduling.js.map +1 -0
  60. package/dist/cli/main.bundled.js +3881 -890
  61. package/dist/cli/main.bundled.js.map +4 -4
  62. package/dist/cli/orchestration/facts.js +127 -0
  63. package/dist/cli/orchestration/facts.js.map +1 -0
  64. package/dist/cli/orchestration/policy.js +128 -75
  65. package/dist/cli/orchestration/policy.js.map +1 -1
  66. package/dist/cli/orchestration/signals.js +96 -0
  67. package/dist/cli/orchestration/signals.js.map +1 -0
  68. package/dist/cli/runHeadless.js +92 -19
  69. package/dist/cli/runHeadless.js.map +1 -1
  70. package/dist/cli/safety/policyEngine.js +159 -20
  71. package/dist/cli/safety/policyEngine.js.map +1 -1
  72. package/dist/cli/safety/policyLoadMode.js +59 -0
  73. package/dist/cli/safety/policyLoadMode.js.map +1 -0
  74. package/dist/cli/safety/resourceClaims.js +373 -0
  75. package/dist/cli/safety/resourceClaims.js.map +1 -0
  76. package/dist/cli/safety/sandboxPath.js +160 -17
  77. package/dist/cli/safety/sandboxPath.js.map +1 -1
  78. package/dist/cli/toolRegistry.js +98 -8
  79. package/dist/cli/toolRegistry.js.map +1 -1
  80. package/dist/cli/tools/execProcess.js +121 -0
  81. package/dist/cli/tools/execProcess.js.map +1 -0
  82. package/dist/cli/tools/krakenRadio.js +9 -0
  83. package/dist/cli/tools/krakenRadio.js.map +1 -1
  84. package/dist/cli/tools/taskTool.js +8 -3
  85. package/dist/cli/tools/taskTool.js.map +1 -1
  86. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completionProofAttestation.js","sourceRoot":"","sources":["../../../src/cli/kraken/completionProofAttestation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * completionProofPersist — t20 (§P1.B): the durability contract behind the
3
+ * completion proof artifact.
4
+ *
5
+ * Three responsibilities, kept out of completionProof.ts to hold every file
6
+ * under the 300-LOC discipline:
7
+ *
8
+ * 1. ATOMIC WRITES — tmp → fsync(file) → rename over the final name, with a
9
+ * win32 fallback (EPERM/ENOTEMPTY under AV/indexer locks → rm + rename)
10
+ * and a guarantee that no `.tmp` litter survives success OR failure.
11
+ * 2. PERSISTENCE MODE — `ZELARI_PROOF_PERSISTENCE` env override over
12
+ * surface defaults (headless/mission/CI ⇒ `required`, interactive TUI ⇒
13
+ * `best-effort`), mirroring safety/policyLoadMode's pure-resolver +
14
+ * registered-active-surface pattern.
15
+ * 3. REQUIRED ENFORCEMENT — the pure gate flip: PASS + un-writable proof ⇒
16
+ * BLOCKED (completionGate exit-4 family), with the failure reason
17
+ * appended to the summary so NDJSON/headless surfaces see WHY.
18
+ */
19
+ import { open, rename, rm } from 'node:fs/promises';
20
+ import { randomBytes } from 'node:crypto';
21
+ import path from 'node:path';
22
+ import { computeProofDigest, isSha256Hex, PROOF_KIND, PROOF_VERSION, } from './completionProofAttestation.js';
23
+ /** Env override accepted by resolveProofPersistenceMode. */
24
+ export const PROOF_PERSISTENCE_ENV = 'ZELARI_PROOF_PERSISTENCE';
25
+ function isTruthyFlag(v) {
26
+ const n = v?.trim().toLowerCase();
27
+ return n === '1' || n === 'true' || n === 'yes' || n === 'on';
28
+ }
29
+ const warnedInvalidOverrides = new Set();
30
+ /**
31
+ * Emit ONE warning per distinct invalid override value (hosts surface it;
32
+ * repeat evaluations stay quiet).
33
+ */
34
+ function warnInvalidOverride(raw, fallback) {
35
+ if (warnedInvalidOverrides.has(raw))
36
+ return;
37
+ warnedInvalidOverrides.add(raw);
38
+ try {
39
+ process.stderr.write(`[zelari] ignoring invalid ${PROOF_PERSISTENCE_ENV}=${JSON.stringify(raw)} ` +
40
+ `(expected "best-effort" or "required") — defaulting to ${fallback}\n`);
41
+ }
42
+ catch {
43
+ /* stderr unavailable — resolution continues */
44
+ }
45
+ }
46
+ /**
47
+ * Pure mode resolution — precedence mirrors safety/policyLoadMode:
48
+ * 1. ZELARI_PROOF_PERSISTENCE=best-effort|required (any other value is
49
+ * IGNORED with a warning and falls through — no typo flips durability);
50
+ * 2. headless and mission surfaces default to `required`: an unattended
51
+ * run without its durable witness is not verifiable-complete;
52
+ * 3. the interactive TUI defaults to `best-effort` (a read-only checkout
53
+ * must not brick chat), tightening to `required` under ambient CI
54
+ * because CI consumes proofs as a pass condition (PW §7).
55
+ */
56
+ export function resolveProofPersistenceMode(env, ctx) {
57
+ const fallback = ctx.surface === 'headless' || ctx.surface === 'mission' || isTruthyFlag(ctx.ci) ? 'required' : 'best-effort';
58
+ const raw = env[PROOF_PERSISTENCE_ENV];
59
+ if (raw !== undefined) {
60
+ const v = raw.trim().toLowerCase();
61
+ if (v === 'best-effort')
62
+ return 'best-effort';
63
+ if (v === 'required')
64
+ return 'required';
65
+ warnInvalidOverride(raw.trim(), fallback);
66
+ }
67
+ return fallback;
68
+ }
69
+ // ── Active-surface seam (registered once by the host, like policyLoadMode)
70
+ let activeSurface = 'tui';
71
+ /** Register the host BEFORE any proof write (runHeadless pre-flight). */
72
+ export function setActiveProofPersistenceSurface(surface) {
73
+ activeSurface = surface;
74
+ }
75
+ /** Current registration (read-mostly; exposed for tests/diagnostics). */
76
+ export function activeProofPersistenceSurface() {
77
+ return activeSurface;
78
+ }
79
+ /**
80
+ * Resolve the ACTIVE persistence mode from the registered surface + env.
81
+ * `env` is injectable so callers/tests avoid touching process.env.
82
+ */
83
+ export function activeProofPersistenceMode(env = process.env) {
84
+ return resolveProofPersistenceMode(env, {
85
+ surface: activeSurface,
86
+ ...(typeof env.CI === 'string' ? { ci: env.CI } : {}),
87
+ });
88
+ }
89
+ // ── Atomic file write (tmp → fsync → rename) ─────────────────────────────
90
+ /** win32 rename-over-existing can hit transient AV/indexer locks. */
91
+ function isWindowsRenameBlock(err) {
92
+ if (process.platform !== 'win32')
93
+ return false;
94
+ const code = err?.code;
95
+ return code === 'EPERM' || code === 'ENOTEMPTY' || code === 'EEXIST';
96
+ }
97
+ /**
98
+ * Transaction-grade replacement for writeFile: data lands in
99
+ * `<target>.<random>.tmp`, gets fsync'd (`fh.sync()`), closes, and is
100
+ * renamed over the final name — readers never observe a half-written
101
+ * artifact. win32 fallback: EPERM/ENOTEMPTY → rm the previous file, rename
102
+ * again. On ANY failure the tmp file is removed; no `.tmp` litter survives
103
+ * success OR failure.
104
+ */
105
+ export async function writeFileAtomic(target, data) {
106
+ const dir = path.dirname(target);
107
+ const tmp = path.join(dir, `.${path.basename(target)}.${randomBytes(6).toString('hex')}.tmp`);
108
+ let fh = null;
109
+ try {
110
+ fh = await open(tmp, 'w');
111
+ await fh.writeFile(data, 'utf8');
112
+ await fh.sync(); // flush contents BEFORE the rename publishes them
113
+ await fh.close();
114
+ fh = null;
115
+ try {
116
+ await rename(tmp, target);
117
+ }
118
+ catch (err) {
119
+ if (!isWindowsRenameBlock(err))
120
+ throw err;
121
+ await rm(target, { force: true }); // drop the stale artifact, retry
122
+ await rename(tmp, target);
123
+ }
124
+ }
125
+ finally {
126
+ if (fh !== null) {
127
+ try {
128
+ await fh.close();
129
+ }
130
+ catch {
131
+ /* already closed */
132
+ }
133
+ }
134
+ await rm(tmp, { force: true }).catch(() => undefined);
135
+ }
136
+ }
137
+ /**
138
+ * t20 required-persistence contract, kept PURE so hosts wire it themselves:
139
+ * PASS + unwritable proof ⇒ blocked=true, with the failure reason appended
140
+ * to the summary (visible in NDJSON/log surfacing and any later re-render).
141
+ * An already-BLOCKED gate just records the extra cause. Mutates `gate` in
142
+ * place; returns true when enforcement fired.
143
+ */
144
+ export function enforceRequiredProofPersistence(gate, outcome) {
145
+ if (!outcome.requiredBlockReason)
146
+ return false;
147
+ if (!gate.blocked) {
148
+ gate.summary = `${gate.summary} [required-proof-persist]: ${outcome.requiredBlockReason}`;
149
+ }
150
+ gate.blocked = true;
151
+ return true;
152
+ }
153
+ const ATTESTATION_KEYS = [
154
+ 'commitSha',
155
+ 'diffDigest',
156
+ 'taskContractDigest',
157
+ 'verificationPlanDigest',
158
+ 'harnessManifestDigest',
159
+ 'proofDigest',
160
+ ];
161
+ /**
162
+ * Offline validator for a written proof — structural + integrity checks
163
+ * ONLY, no repo access (that is what makes it usable in CI). Re-seals the
164
+ * parsed proof via canonical hashing (order-insensitive) and compares the
165
+ * stored `proofDigest`; every present digest must be well-formed sha256
166
+ * hex. Never throws.
167
+ */
168
+ export function validateCompletionProof(proofJson) {
169
+ const errors = [];
170
+ if (!proofJson || typeof proofJson !== 'object' || Array.isArray(proofJson)) {
171
+ return { valid: false, errors: ['proof must be a JSON object'] };
172
+ }
173
+ const proof = proofJson;
174
+ if (proof.kind !== PROOF_KIND)
175
+ errors.push(`kind must be "${PROOF_KIND}"`);
176
+ if (proof.version !== PROOF_VERSION)
177
+ errors.push(`version must be ${PROOF_VERSION}`);
178
+ if (!proof.evaluation || typeof proof.evaluation !== 'object' || Array.isArray(proof.evaluation)) {
179
+ errors.push('evaluation must be a JSON object');
180
+ }
181
+ if (!proof.attestation || typeof proof.attestation !== 'object' || Array.isArray(proof.attestation)) {
182
+ return { valid: false, errors: [...errors, 'attestation must be a JSON object'] };
183
+ }
184
+ const att = proof.attestation;
185
+ for (const key of Object.keys(att)) {
186
+ if (!ATTESTATION_KEYS.includes(key))
187
+ errors.push(`attestation.${key} is not a known field`);
188
+ }
189
+ for (const key of ATTESTATION_KEYS) {
190
+ const v = att[key];
191
+ if (v === undefined || v === null) {
192
+ if (key === 'harnessManifestDigest' || key === 'proofDigest')
193
+ errors.push(`attestation.${key} is required`);
194
+ continue;
195
+ }
196
+ if (key === 'commitSha') {
197
+ if (typeof v !== 'string' || v.trim().length === 0) {
198
+ errors.push('attestation.commitSha must be a non-empty git sha string');
199
+ }
200
+ continue;
201
+ }
202
+ if (!isSha256Hex(v))
203
+ errors.push(`attestation.${key} must be sha256 hex`);
204
+ }
205
+ // Integrity seal: recompute over the parsed tree and compare.
206
+ if (isSha256Hex(att.proofDigest) && !errors.some((e) => e.startsWith('kind') || e.startsWith('version'))) {
207
+ const recomputed = computeProofDigest({
208
+ kind: proof.kind,
209
+ version: proof.version,
210
+ evaluation: proof.evaluation,
211
+ attestation: att,
212
+ });
213
+ if (recomputed !== att.proofDigest) {
214
+ errors.push('proofDigest does not match the sealed content (tampered or stale proof)');
215
+ }
216
+ }
217
+ return { valid: errors.length === 0, errors };
218
+ }
219
+ //# sourceMappingURL=completionProofPersist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completionProofPersist.js","sourceRoot":"","sources":["../../../src/cli/kraken/completionProofPersist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * completionProofProbe — t20 (§P1.B): environment-derived attestation
3
+ * inputs for the completion proof. Everything here is BEST-EFFORT and
4
+ * read-only: a missing git binary, a non-repo cwd, a disabled criteria
5
+ * pack or an unreadable package.json simply omits the corresponding
6
+ * attestation field (they are optional by design). Kept apart from the
7
+ * sealing core so that core stays pure and instantly testable.
8
+ *
9
+ * Owns:
10
+ * - harnessManifest: deterministic harness identity (version, pack,
11
+ * adapters, policy precedence/load mode) — PW §7;
12
+ * - gatherGitAttestation: HEAD sha + staged/unstaged `git diff` text;
13
+ * - defaultVerificationPlanSnapshot: the t19 adapter-resolved plan
14
+ * ({packId, commands}) canonically shaped for verificationPlanDigest.
15
+ */
16
+ import { execFile } from 'node:child_process';
17
+ import { promisify } from 'node:util';
18
+ // t22: the active contract-scope seam feeds the live taskContractDigest.
19
+ import { activeContractScope } from './contractCompiler.js';
20
+ const HARNESS_VERSION_FALLBACK = '2.13.0';
21
+ /**
22
+ * Mirrors verificationAdapters/index.ts REGISTRY ORDER IS CONTRACT. Kept a
23
+ * literal (adapters carry no id field); completionProofProbe.test.ts locks
24
+ * it to the live registry length so a registry extension without a mirror
25
+ * sync fails the suite instead of silently mis-attesting.
26
+ */
27
+ const ADAPTER_IDS = ['node', 'python', 'rust', 'go', 'java', 'dotnet'];
28
+ let cachedHarnessVersion = null;
29
+ async function readHarnessVersion() {
30
+ if (cachedHarnessVersion !== null)
31
+ return cachedHarnessVersion;
32
+ try {
33
+ const { readFile } = await import('node:fs/promises');
34
+ const { fileURLToPath } = await import('node:url');
35
+ const pkgPath = fileURLToPath(new URL('../../../package.json', import.meta.url));
36
+ const parsed = JSON.parse(await readFile(pkgPath, 'utf8'));
37
+ if (typeof parsed.version === 'string' && parsed.version.length > 0) {
38
+ return (cachedHarnessVersion = parsed.version);
39
+ }
40
+ }
41
+ catch {
42
+ /* fall through to the pinned constant */
43
+ }
44
+ return (cachedHarnessVersion = HARNESS_VERSION_FALLBACK);
45
+ }
46
+ /**
47
+ * The deterministic identity of the harness that produced a proof: which
48
+ * binary, which criteria pack, which adapters COULD have bound, and how
49
+ * policies were layered/loaded. Constant per configuration — cheap, and
50
+ * enough to detect cross-environment drift.
51
+ */
52
+ export async function harnessManifest(env = process.env) {
53
+ const [{ policyPrecedenceFromEnv }, { activePolicyLoadMode }, { ZELARI_CODING_PACK_ID }] = await Promise.all([
54
+ import('../safety/policyEngine.js'),
55
+ import('../safety/policyLoadMode.js'),
56
+ import('@zelari/core/verification'),
57
+ ]);
58
+ return {
59
+ harnessVersion: await readHarnessVersion(),
60
+ packId: ZELARI_CODING_PACK_ID,
61
+ adapters: ADAPTER_IDS,
62
+ policyPrecedence: policyPrecedenceFromEnv(),
63
+ policyLoadMode: activePolicyLoadMode(env),
64
+ };
65
+ }
66
+ const execFileAsync = promisify(execFile);
67
+ /** Best-effort `git -C <cwd> <args>` → stdout | null (never throws). */
68
+ async function git(cwd, args) {
69
+ try {
70
+ const { stdout } = await execFileAsync('git', ['-C', cwd, ...args], {
71
+ maxBuffer: 32 * 1024 * 1024,
72
+ windowsHide: true,
73
+ });
74
+ return stdout;
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ /**
81
+ * Resolve commit + working-tree-diff inputs (staged + unstaged vs HEAD).
82
+ * Any failure omits both fields; never throws.
83
+ */
84
+ export async function gatherGitAttestation(cwd = process.cwd()) {
85
+ const [head, stagedDiff, unstagedDiff] = await Promise.all([
86
+ git(cwd, ['rev-parse', 'HEAD']),
87
+ git(cwd, ['diff', '--cached']),
88
+ git(cwd, ['diff']),
89
+ ]);
90
+ const inputs = {};
91
+ const sha = head?.trim();
92
+ if (sha)
93
+ inputs.commitSha = sha;
94
+ if (stagedDiff !== null && unstagedDiff !== null) {
95
+ inputs.diffText = [stagedDiff, unstagedDiff].filter((s) => s.length > 0).join('\n');
96
+ }
97
+ return inputs;
98
+ }
99
+ /**
100
+ * Snapshot of the resolved native verification plan for THIS repo (t19
101
+ * adapters + env overrides), shaped canonically for verificationPlanDigest.
102
+ * undefined when the pack is disabled / nothing binds / resolution fails.
103
+ * Never throws.
104
+ */
105
+ export async function defaultVerificationPlanSnapshot(cwd = process.cwd(), env = process.env) {
106
+ try {
107
+ const { nativePackEnabled, resolvePackCommandsForRoot } = await import('./nativeVerification.js');
108
+ const { ZELARI_CODING_PACK_ID } = await import('@zelari/core/verification');
109
+ if (!nativePackEnabled(env))
110
+ return undefined;
111
+ const commands = await resolvePackCommandsForRoot(env, cwd);
112
+ if (!commands.typecheckCommand && !commands.testCommand && !commands.buildCommand)
113
+ return undefined;
114
+ return { packId: ZELARI_CODING_PACK_ID, commands };
115
+ }
116
+ catch {
117
+ return undefined;
118
+ }
119
+ }
120
+ /**
121
+ * t22 (PW §8): the LIVE TaskContract of the active turn, read from the
122
+ * contract-scope seam (kraken/contractCompiler.setActiveContractScope).
123
+ * Hosts re-register after every accepted steer, so a proof written after a
124
+ * steer hashes version N+1 — `taskContractDigest` always tracks the CURRENT
125
+ * contract. undefined when no scoped contract is registered; never throws.
126
+ */
127
+ export function activeTaskContractSnapshot() {
128
+ try {
129
+ return activeContractScope()?.contract;
130
+ }
131
+ catch {
132
+ return undefined;
133
+ }
134
+ }
135
+ //# sourceMappingURL=completionProofProbe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completionProofProbe.js","sourceRoot":"","sources":["../../../src/cli/kraken/completionProofProbe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import { LocalWorkspace, NodeShellProvider } from '@zelari/core/runtime';
2
+ import { VerificationEngine, } from '@zelari/core/verification';
3
+ import { EMPTY_POLICY_RULE_SET, matchAgentPolicyRule, } from '../safety/policyEngine.js';
4
+ /** Engine packId for contract-derived checks (distinct from the coding pack). */
5
+ export const CONTRACT_CRITERIA_PACK_ID = 'task-contract/v1';
6
+ /** Per-command timeout for compiled criteria (mirrors the native pack default). */
7
+ export const CONTRACT_COMMAND_TIMEOUT_MS = 600_000;
8
+ /** Sanity cap for a hint accepted as one shell command line. */
9
+ const MAX_COMMAND_LENGTH = 512;
10
+ // ── Capability layer (scope → policy rules) ───────────────────────────────
11
+ /**
12
+ * Compile `scope` into edit-category PolicyRules (the ACTUAL policyEngine
13
+ * shape: ordered list, FIRST match wins within the layer). Order encodes
14
+ * precedence so overlaps stay conservative:
15
+ *
16
+ * forbidden denies → allowedPath allows → catch-all deny (`**`)
17
+ *
18
+ * RESTRICT-ONLY by construction: `deny` entries rank highest in
19
+ * intersectEffects; the `allow` entries exist ONLY to opt paths out of the
20
+ * trailing deny-all — ranked lowest they can never relax any other layer or
21
+ * the category decision (identical lattice to policyLayers.ts).
22
+ */
23
+ export function compileCapabilityRules(contract) {
24
+ const scope = contract.scope;
25
+ if (!scope)
26
+ return [];
27
+ const rules = [];
28
+ for (const glob of scope.forbiddenPaths ?? []) {
29
+ if (glob.trim() === '')
30
+ continue;
31
+ rules.push({ match: glob, effect: 'deny', reason: 'contract:forbiddenPath' });
32
+ }
33
+ const allowed = (scope.allowedPaths ?? []).filter((g) => g.trim() !== '');
34
+ if (allowed.length > 0) {
35
+ for (const glob of allowed) {
36
+ rules.push({ match: glob, effect: 'allow', reason: 'contract:allowedPath' });
37
+ }
38
+ rules.push({ match: '**', effect: 'deny', reason: 'contract:outsideAllowedPaths' });
39
+ }
40
+ return rules;
41
+ }
42
+ /**
43
+ * The compiled layer as a `PolicyRuleSet` (edit-only) so callers can feed it
44
+ * through the SAME evaluators used for global/project layers
45
+ * (matchAgentPolicyRule / matchAgentPolicyRuleLayered): drop it in as an
46
+ * extra source and the deny>ask>allow intersection does the rest.
47
+ */
48
+ export function contractCapabilityLayer(contract) {
49
+ return { shell: [], edit: compileCapabilityRules(contract) };
50
+ }
51
+ let activeScope;
52
+ /**
53
+ * Register the live contract of THIS mission/turn (call at turn start and
54
+ * again after every accepted steer — `latestTaskContract` + the spine carry
55
+ * the new version). Pass `undefined` to clear. No-op-safe, idempotent.
56
+ */
57
+ export function setActiveContractScope(contract) {
58
+ activeScope = contract ? { contract, capabilityRules: contractCapabilityLayer(contract) } : undefined;
59
+ }
60
+ /** Current registration (undefined when the turn has no scoped contract). */
61
+ export function activeContractScope() {
62
+ return activeScope;
63
+ }
64
+ /**
65
+ * One tool invocation's CONTRACT verdict: restrict-only match of the active
66
+ * capability layer over the invocation args (same path normalization /
67
+ * candidates as the global+project layers). Null ⇒ the decision chain is
68
+ * untouched; non-null ⇒ intersect its effect LAST (non-overridable slot).
69
+ */
70
+ export function matchContractCapabilityRule(required, args, root) {
71
+ return matchAgentPolicyRule(activeScope?.capabilityRules ?? EMPTY_POLICY_RULE_SET, required, args, root);
72
+ }
73
+ // ── Verification criteria (verificationHint → deterministic checks) ───────
74
+ /** True when value parses as ONE sane shell command line (no CR/LF/NUL). */
75
+ function isShellCommandLike(value) {
76
+ const trimmed = value.trim();
77
+ if (trimmed === '' || trimmed.length > MAX_COMMAND_LENGTH)
78
+ return false;
79
+ // eslint-disable-next-line no-control-regex
80
+ return !/[\r\n\0]/.test(trimmed);
81
+ }
82
+ /**
83
+ * Deterministic criteria from `verificationHint` commands: one Criterion per
84
+ * acceptance criterion whose hint parses as a shell command (`Verify:`-style
85
+ * lines). Required:true per user intent — these ARE the definition of done
86
+ * stated by the author. `unknown ≠ pass` still holds end-to-end (an
87
+ * unrunnable command honestly surfaces as unknown, blocking like the pack's).
88
+ * No hints ⇒ [] ⇒ zero contribution (no behavior change for old contracts).
89
+ */
90
+ export function compileVerificationCriteria(contract, opts = {}) {
91
+ const timeoutMs = opts.timeoutMs ?? CONTRACT_COMMAND_TIMEOUT_MS;
92
+ const out = [];
93
+ for (const c of contract.acceptanceCriteria) {
94
+ const hint = c.verificationHint;
95
+ if (!hint || hint.kind !== 'command')
96
+ continue;
97
+ const command = hint.value?.trim();
98
+ if (!command || !isShellCommandLike(command))
99
+ continue;
100
+ out.push({
101
+ id: `contract:${c.id}`,
102
+ text: c.text,
103
+ source: 'task',
104
+ required: true,
105
+ check: { kind: 'command', command, timeoutMs },
106
+ });
107
+ }
108
+ return out;
109
+ }
110
+ /** Brief-named alias — the seam callers use when they hold the contract. */
111
+ export function contractCriteriaFor(contract, opts = {}) {
112
+ return compileVerificationCriteria(contract, opts);
113
+ }
114
+ /**
115
+ * Compiled criteria straight off the ACTIVE seam — how verificationBridge
116
+ * pulls the current-turn contribution without threading options through
117
+ * every host. Empty array when nothing is registered.
118
+ */
119
+ export function activeContractCriteria(opts = {}) {
120
+ return activeScope ? compileVerificationCriteria(activeScope.contract, opts) : [];
121
+ }
122
+ /**
123
+ * Execute the contract's compiled criteria through the SAME deterministic
124
+ * core engine the native pack uses. Deliberately NOT gated on
125
+ * ZELARI_VERIFY_PACK (user-stated Verify commands stand alone); results join
126
+ * the pack's inside evaluateStrictBuildGate where blockers add up.
127
+ */
128
+ export async function evaluateContractCriteria(contract, deps = {}) {
129
+ if (!contract)
130
+ return null;
131
+ const cwd = deps.cwd ?? process.cwd();
132
+ const criteria = compileVerificationCriteria(contract, { timeoutMs: deps.timeoutMs });
133
+ if (criteria.length === 0)
134
+ return null;
135
+ const shell = deps.shell ?? new NodeShellProvider(new LocalWorkspace(cwd));
136
+ const engine = deps.emit
137
+ ? new VerificationEngine({ shell }, { emit: deps.emit })
138
+ : new VerificationEngine({ shell });
139
+ const results = await engine.evaluate(criteria, { packId: CONTRACT_CRITERIA_PACK_ID });
140
+ return { criteria, results };
141
+ }
142
+ //# sourceMappingURL=contractCompiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractCompiler.js","sourceRoot":"","sources":["../../../src/cli/kraken/contractCompiler.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,12 @@
4
4
  * Routing (`ZELARI_KRAKEN_*_MODEL`) answers *which model* a tentacle uses.
5
5
  * This policy answers *whether* the lead should create the tentacle at all.
6
6
  *
7
- * `automatic` (default) injects nothing: the parent prompt stays
8
- * byte-identical to today's Lead Playbook. Other values append a short
9
- * override module after the lead playbook.
7
+ * `automatic` (default) injects nothing. Two sources can produce a REAL
8
+ * policy now (t23 / P1.E):
9
+ * 1. this env var (explicit user/host override — WINS below),
10
+ * 2. a strategy-derived mapping from the v2 OrchestrationDecision:
11
+ * `resolveDelegationPolicyForRun(strategy)` in the `--mode auto` path
12
+ * replaces the historical no-op injection with an actual module.
10
13
  *
11
14
  * Env: `ZELARI_KRAKEN_DELEGATION=automatic|prefer|aggressive|lead-only`
12
15
  */
@@ -41,6 +44,40 @@ export function resolveDelegationPolicy(raw = process.env[KRAKEN_DELEGATION_ENV]
41
44
  return 'automatic';
42
45
  return ALIASES[v] ?? 'automatic';
43
46
  }
47
+ /**
48
+ * t23 (§P1.E) — strategy → delegation mapping (replaces the `automatic`
49
+ * no-op when a v2 OrchestrationDecision is present). Maps onto the EXISTING
50
+ * three policy fragments (no new prompt prose invented):
51
+ *
52
+ * lead-only → 'lead-only' (prefer-lead / no tentacles)
53
+ * explore → 'automatic' (solo surface: delegation n/a, neutral)
54
+ * lead+verify → 'prefer' (default WITH the verify pass)
55
+ * parallel-build → 'prefer' (tentacles preferred incl. general)
56
+ * graph → 'prefer' (tentacles preferred incl. general)
57
+ * council → null (n/a on the council surface)
58
+ */
59
+ export const STRATEGY_DELEGATION = {
60
+ 'lead-only': 'lead-only',
61
+ explore: 'automatic',
62
+ 'lead+verify': 'prefer',
63
+ 'parallel-build': 'prefer',
64
+ graph: 'prefer',
65
+ council: null,
66
+ };
67
+ /**
68
+ * Effective delegation policy for one run. PRECEDENCE: an explicit
69
+ * non-automatic `ZELARI_KRAKEN_DELEGATION` wins over any strategy-derived
70
+ * value; otherwise the strategy map applies; no strategy ⇒ historical
71
+ * default ('automatic', which still injects nothing).
72
+ */
73
+ export function resolveDelegationPolicyForRun(strategy, env = process.env) {
74
+ const raw = env[KRAKEN_DELEGATION_ENV]?.trim().toLowerCase() ?? '';
75
+ const explicit = raw ? ALIASES[raw] : undefined;
76
+ if (explicit && explicit !== 'automatic')
77
+ return explicit;
78
+ const derived = strategy ? STRATEGY_DELEGATION[strategy] : undefined;
79
+ return derived ?? 'automatic';
80
+ }
44
81
  const PREFER_CONTENT = `# Kraken Delegation Policy
45
82
 
46
83
  Current policy: **prefer tentacles**.
@@ -1 +1 @@
1
- {"version":3,"file":"delegationPolicy.js","sourceRoot":"","sources":["../../../src/cli/kraken/delegationPolicy.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEhE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,WAAW;CACH,CAAC;AAIX,MAAM,OAAO,GAAqC;IAChD,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,QAAQ;IAChB,kBAAkB,EAAE,QAAQ;IAC5B,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,WAAW;IACxB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,WAAW;IACrB,GAAG,EAAE,WAAW;CACjB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACxB,mBAAyC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAA0B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAE5D,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC;IAC3B,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AACnC,CAAC;AAED,MAAM,cAAc,GAAG;;;;;;;;;;;;CAYtB,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;;;CAW1B,CAAC;AAEF,MAAM,iBAAiB,GAAG;;;;;;;CAOzB,CAAC;AAEF,MAAM,SAAS,GAA2D;IACxE,MAAM,EAAE,cAAc;IACtB,UAAU,EAAE,kBAAkB;IAC9B,WAAW,EAAE,iBAAiB;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAgB,EAChB,SAA2B,uBAAuB,EAAE;IAEpD,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAClD,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,0BAA0B;YACjC,mEAAmE;YACnE,oEAAoE;YACpE,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAwB;IAC5D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC;QAC5B,KAAK,YAAY;YACf,OAAO,YAAY,CAAC;QACtB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB;YACE,OAAO,WAAW,CAAC;IACvB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"delegationPolicy.js","sourceRoot":"","sources":["../../../src/cli/kraken/delegationPolicy.ts"],"names":[],"mappings":"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"}