zelari-code 2.37.3 → 2.38.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/asyncLimit.js +53 -0
- package/dist/cli/asyncLimit.js.map +1 -0
- package/dist/cli/budget/restoreRuntime.js +10 -5
- package/dist/cli/budget/restoreRuntime.js.map +1 -1
- package/dist/cli/crossProviderFailover.js +32 -0
- package/dist/cli/crossProviderFailover.js.map +1 -1
- package/dist/cli/harnessState.js +7 -3
- package/dist/cli/harnessState.js.map +1 -1
- package/dist/cli/headlessSpine.js +7 -3
- package/dist/cli/headlessSpine.js.map +1 -1
- package/dist/cli/kraken/cachedShell.js +162 -0
- package/dist/cli/kraken/cachedShell.js.map +1 -0
- package/dist/cli/kraken/contractCompiler.js +6 -1
- package/dist/cli/kraken/contractCompiler.js.map +1 -1
- package/dist/cli/kraken/executor.js +27 -17
- package/dist/cli/kraken/executor.js.map +1 -1
- package/dist/cli/kraken/nativeVerification.js +9 -1
- package/dist/cli/kraken/nativeVerification.js.map +1 -1
- package/dist/cli/kraken/worktreeCleanupBatch.js +110 -0
- package/dist/cli/kraken/worktreeCleanupBatch.js.map +1 -0
- package/dist/cli/main.bundled.js +1204 -468
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/memory/legacyImport.js +66 -14
- package/dist/cli/memory/legacyImport.js.map +1 -1
- package/dist/cli/memory/sqliteBackend.js +19 -5
- package/dist/cli/memory/sqliteBackend.js.map +1 -1
- package/dist/cli/providerFailover.js +21 -2
- package/dist/cli/providerFailover.js.map +1 -1
- package/dist/cli/runHeadless.js +32 -1
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/sessionSpine.js +26 -10
- package/dist/cli/sessionSpine.js.map +1 -1
- package/dist/cli/toolRegistry.js +23 -4
- package/dist/cli/toolRegistry.js.map +1 -1
- package/dist/cli/tools/krakenModel.js +72 -9
- package/dist/cli/tools/krakenModel.js.map +1 -1
- package/dist/cli/tools/krakenRadio.js +60 -3
- package/dist/cli/tools/krakenRadio.js.map +1 -1
- package/dist/cli/tools/krakenWorktree.js +105 -4
- package/dist/cli/tools/krakenWorktree.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* asyncLimit — minimal bounded-concurrency runner (zero deps).
|
|
3
|
+
*
|
|
4
|
+
* Latency fix (Int 3b): the Kraken memory-graph link tail awaited one
|
|
5
|
+
* round-trip per edge. A bounded fan-out collapses K sequential awaits into
|
|
6
|
+
* ceil(K / limit) waves without opening an unbounded number of calls on the
|
|
7
|
+
* memory backend.
|
|
8
|
+
*
|
|
9
|
+
* @since v2.37.x
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Run `fn` over `items` with at most `limit` calls in flight at any time.
|
|
13
|
+
*
|
|
14
|
+
* Semantics (small and explicit — callers rely on them):
|
|
15
|
+
* - `limit` is clamped to >= 1: `0`, negatives and `NaN` mean "sequential",
|
|
16
|
+
* so a bad env/clamp upstream can never deadlock or fan out unbounded;
|
|
17
|
+
* - items start in input order: the first `limit` items are started by the
|
|
18
|
+
* workers in order, later items start as slots free up (completion order);
|
|
19
|
+
* - fail-fast: the returned promise rejects with the FIRST rejection of
|
|
20
|
+
* `fn`. In-flight calls are neither awaited nor cancelled (their outcome is
|
|
21
|
+
* ignored) and no further item is started, which keeps the failure latency
|
|
22
|
+
* low. The runner holds no state after it settles, so a rejection can never
|
|
23
|
+
* leave a slot held — retrying is always safe;
|
|
24
|
+
* - resolves with `undefined` once every item settled successfully.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* await runWithLimit(edges, 8, (edge) => memory.connect(edge).catch(() => undefined));
|
|
28
|
+
*/
|
|
29
|
+
export async function runWithLimit(items, limit, fn) {
|
|
30
|
+
const slots = Math.min(items.length, Math.max(1, Number.isFinite(limit) ? Math.floor(limit) : 1));
|
|
31
|
+
if (slots <= 0)
|
|
32
|
+
return;
|
|
33
|
+
let cursor = 0;
|
|
34
|
+
let failed = false;
|
|
35
|
+
const worker = async () => {
|
|
36
|
+
while (!failed && cursor < items.length) {
|
|
37
|
+
const index = cursor;
|
|
38
|
+
cursor += 1;
|
|
39
|
+
try {
|
|
40
|
+
await fn(items[index], index);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
failed = true; // stop every worker from pulling more items
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const workers = [];
|
|
49
|
+
for (let i = 0; i < slots; i += 1)
|
|
50
|
+
workers.push(worker());
|
|
51
|
+
await Promise.all(workers);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=asyncLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asyncLimit.js","sourceRoot":"","sources":["../../src/cli/asyncLimit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAmB,EACnB,KAAa,EACb,EAAgD;IAEhD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,KAAK,CAAC,MAAM,EACZ,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5D,CAAC;IACF,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO;IAEvB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,OAAO,CAAC,MAAM,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,MAAM,CAAC;YACrB,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,IAAI,CAAC,CAAC,4CAA4C;gBAC3D,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -8,15 +8,19 @@
|
|
|
8
8
|
* interrupted 12/40 → resume same epoch → remaining 28
|
|
9
9
|
* completed 40/40 → new user turn → 0/40 (session total stays 40)
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
11
|
+
import { readSessionLogCached, resolveSessionsDir } from '@zelari/core/session';
|
|
12
12
|
import path from 'node:path';
|
|
13
13
|
/**
|
|
14
14
|
* Rebuild `budget` usage from `<sessionsDir>/<sessionId>/events.jsonl`.
|
|
15
15
|
* Returns false when there is nothing to resume from (fresh session).
|
|
16
|
+
*
|
|
17
|
+
* PERF-4a: session log cache — pass the session's `SessionLogCache` to reuse
|
|
18
|
+
* the already-parsed prefix (kill switch ZELARI_SPINE_REPLAY_CACHE, default
|
|
19
|
+
* OFF: without it this is `readSessionLog` verbatim).
|
|
16
20
|
*/
|
|
17
|
-
export async function restoreBudgetRuntimeFromSession(budget, sessionId, baseDir) {
|
|
21
|
+
export async function restoreBudgetRuntimeFromSession(budget, sessionId, baseDir, cache) {
|
|
18
22
|
const eventsPath = path.join(resolveSessionsDir({ baseDir }), sessionId, 'events.jsonl');
|
|
19
|
-
const report = await
|
|
23
|
+
const report = await readSessionLogCached(eventsPath, cache).catch(() => null);
|
|
20
24
|
if (!report || report.events.length === 0)
|
|
21
25
|
return false;
|
|
22
26
|
budget.adoptLedgerFromEvents(report.events);
|
|
@@ -25,10 +29,11 @@ export async function restoreBudgetRuntimeFromSession(budget, sessionId, baseDir
|
|
|
25
29
|
/**
|
|
26
30
|
* 2.6.1 (plan §6): hash of the LAST persisted session.harness_manifest
|
|
27
31
|
* (null when the log has none) — the resume-time drift baseline.
|
|
32
|
+
* PERF-4a: session log cache (see above).
|
|
28
33
|
*/
|
|
29
|
-
export async function lastHarnessManifestHash(sessionId, baseDir) {
|
|
34
|
+
export async function lastHarnessManifestHash(sessionId, baseDir, cache) {
|
|
30
35
|
const eventsPath = path.join(resolveSessionsDir({ baseDir }), sessionId, 'events.jsonl');
|
|
31
|
-
const report = await
|
|
36
|
+
const report = await readSessionLogCached(eventsPath, cache).catch(() => null);
|
|
32
37
|
if (!report)
|
|
33
38
|
return null;
|
|
34
39
|
for (let i = report.events.length - 1; i >= 0; i--) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoreRuntime.js","sourceRoot":"","sources":["../../../src/cli/budget/restoreRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"restoreRuntime.js","sourceRoot":"","sources":["../../../src/cli/budget/restoreRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAwB,MAAM,sBAAsB,CAAC;AACtG,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,MAAqB,EACrB,SAAiB,EACjB,OAAgB,EAChB,KAAuB;IAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/E,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiB,EACjB,OAAgB,EAChB,KAAuB;IAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAI,CAAC,CAAC,IAAmC,CAAC,YAAY,CAAC;YAC9D,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
*
|
|
22
22
|
* @see docs/plans/ (v3-J plan, 2026-06-29)
|
|
23
23
|
*/
|
|
24
|
+
import { providerFailover } from './providerFailover.js';
|
|
24
25
|
/**
|
|
25
26
|
* Pure resolver for the failover fallback stream. Side-effect free: takes
|
|
26
27
|
* everything via `options`, returns a `ResolveResult`. Tests can stub the
|
|
@@ -80,4 +81,35 @@ export async function resolveFailoverStream(options) {
|
|
|
80
81
|
reason: 'resolved',
|
|
81
82
|
};
|
|
82
83
|
}
|
|
84
|
+
/** Int5b: headless/tentacle transport failover is opt-in (default off). */
|
|
85
|
+
export function isHeadlessFailoverEnabled(env = process.env) {
|
|
86
|
+
return env.ZELARI_HEADLESS_FAILOVER === '1' && env.ANATHEMA_FAILOVER !== '0';
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Wrap a primary stream with TUI-equivalent first-failure failover when
|
|
90
|
+
* `ZELARI_HEADLESS_FAILOVER=1`. Flag off → returns the same `primary` (identity).
|
|
91
|
+
*/
|
|
92
|
+
export async function wrapWithHeadlessFailover(options) {
|
|
93
|
+
const env = options.env ?? process.env;
|
|
94
|
+
if (!isHeadlessFailoverEnabled(env)) {
|
|
95
|
+
return options.primary;
|
|
96
|
+
}
|
|
97
|
+
const resolved = await resolveFailoverStream({
|
|
98
|
+
failoverEnabled: true,
|
|
99
|
+
envValue: env.ANATHEMA_FAILOVER_PROVIDER,
|
|
100
|
+
primaryProviderId: options.primaryProviderId,
|
|
101
|
+
primary: options.primary,
|
|
102
|
+
validProviderIds: options.validProviderIds,
|
|
103
|
+
lookupFallbackConfig: options.lookupFallbackConfig,
|
|
104
|
+
buildStream: options.buildStream,
|
|
105
|
+
});
|
|
106
|
+
if (resolved.warning)
|
|
107
|
+
options.onWarning?.(resolved.warning);
|
|
108
|
+
return providerFailover({
|
|
109
|
+
primary: options.primary,
|
|
110
|
+
fallback: resolved.fallback,
|
|
111
|
+
...(resolved.fallbackLabel ? { fallbackLabel: resolved.fallbackLabel } : {}),
|
|
112
|
+
...(options.onFailover ? { onFailover: options.onFailover } : {}),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
83
115
|
//# sourceMappingURL=crossProviderFailover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crossProviderFailover.js","sourceRoot":"","sources":["../../src/cli/crossProviderFailover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"crossProviderFailover.js","sourceRoot":"","sources":["../../src/cli/crossProviderFailover.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/harnessState.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* `verification.run` is not admissible (mirrors evaluateStrictBuildGateFromSession).
|
|
14
14
|
*/
|
|
15
15
|
import path from 'node:path';
|
|
16
|
-
import {
|
|
16
|
+
import { readSessionLogCached } from '@zelari/core/session';
|
|
17
17
|
/** Defensive payload readers (buildProjection idiom). */
|
|
18
18
|
function asString(v) {
|
|
19
19
|
return typeof v === 'string' ? v : '';
|
|
@@ -244,9 +244,13 @@ function contractFor(t) {
|
|
|
244
244
|
* Convenience read-model loader for a session DIR (the `<id>/` folder under
|
|
245
245
|
* `.zelari/sessions` containing `events.jsonl`). Tolerant like readSessionLog:
|
|
246
246
|
* a missing log yields an empty pending state, never a throw.
|
|
247
|
+
*
|
|
248
|
+
* PERF-4a: session log cache — pass the session's `SessionLogCache` to reuse
|
|
249
|
+
* the parsed prefix (kill switch ZELARI_SPINE_REPLAY_CACHE, default OFF:
|
|
250
|
+
* without a cache this is `readSessionLog` verbatim).
|
|
247
251
|
*/
|
|
248
|
-
export async function readHarnessState(sessionDir) {
|
|
249
|
-
const report = await
|
|
252
|
+
export async function readHarnessState(sessionDir, cache) {
|
|
253
|
+
const report = await readSessionLogCached(path.join(sessionDir, 'events.jsonl'), cache);
|
|
250
254
|
return deriveHarnessState(report.events);
|
|
251
255
|
}
|
|
252
256
|
//# sourceMappingURL=harnessState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnessState.js","sourceRoot":"","sources":["../../src/cli/harnessState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"harnessState.js","sourceRoot":"","sources":["../../src/cli/harnessState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cleanAgentContent } from '@zelari/core';
|
|
2
2
|
import { exportSessionJson, SessionStore, resolveSessionsDir, derivedToAgentMessages, } from '@zelari/core/session';
|
|
3
3
|
import { deriveMissionState } from '@zelari/core/mission';
|
|
4
|
-
import {
|
|
4
|
+
import { readSessionLogCached } from '@zelari/core/session';
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
import { resolveProfile, toolManifestHash } from '@zelari/core/runtime';
|
|
7
7
|
import { SessionSpineMirror } from './sessionSpine.js';
|
|
@@ -43,7 +43,8 @@ async function countVerificationEvidenceInLog(mirror, sessionId) {
|
|
|
43
43
|
return -1;
|
|
44
44
|
try {
|
|
45
45
|
await mirror.flush().catch(() => undefined);
|
|
46
|
-
|
|
46
|
+
// PERF-4a: session log cache (the mirror owns the per-session instance).
|
|
47
|
+
const report = await readSessionLogCached(path.join(mirror.sessionsDir, sessionId, 'events.jsonl'), mirror.replayCache);
|
|
47
48
|
return report.events.filter((e) => e.kind === 'verification.evidence').length;
|
|
48
49
|
}
|
|
49
50
|
catch (err) {
|
|
@@ -77,7 +78,8 @@ export async function openHeadlessSpine(opts) {
|
|
|
77
78
|
const budget = new BudgetRuntime(profileId, { enforcement: resolveResourceEnforcement() });
|
|
78
79
|
if (spine.resumedFromSeq !== undefined && spine.resumedFromSeq > 0) {
|
|
79
80
|
// 2.6.1 plan §10: the SAME helper every host uses (parity invariant).
|
|
80
|
-
|
|
81
|
+
// PERF-4a: session log cache (the mirror owns the per-session instance).
|
|
82
|
+
await restoreBudgetRuntimeFromSession(budget, opts.sessionId, opts.baseDir, spine.replayCache);
|
|
81
83
|
}
|
|
82
84
|
spine.attachBudgetRuntime(budget);
|
|
83
85
|
// 2.6.1 (plan §6): same lifecycle as the TUI — manifest presence 100%,
|
|
@@ -198,6 +200,8 @@ export async function seedHeadlessModelHistory(handle, legacy) {
|
|
|
198
200
|
if (mirror.status !== 'active') {
|
|
199
201
|
return { history: legacySeed, importedCount: 0, source: 'legacy-fallback' };
|
|
200
202
|
}
|
|
203
|
+
// PERF-4a: session log cache — derivedPriorTurns() reads through the
|
|
204
|
+
// mirror's per-session SessionLogCache (the seed is the hot consumer).
|
|
201
205
|
const existing = await mirror.derivedPriorTurns();
|
|
202
206
|
if (existing && existing.length > 0) {
|
|
203
207
|
return { history: derivedModelSeed(existing), importedCount: 0, source: 'spine' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headlessSpine.js","sourceRoot":"","sources":["../../src/cli/headlessSpine.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,GAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"headlessSpine.js","sourceRoot":"","sources":["../../src/cli/headlessSpine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cachedShell — Int2b / plan v2 §6.2: in-process result cache for the
|
|
3
|
+
* verification-gate commands (typecheck / test / build / contract `Verify:`).
|
|
4
|
+
*
|
|
5
|
+
* Why: one strict turn evaluates the SAME deterministic commands up to three
|
|
6
|
+
* times — the first gate, the post-repair gate (`runOneTurn.ts`), and the
|
|
7
|
+
* end-of-mission gate. Those commands are minutes each and a repair often
|
|
8
|
+
* lands no delta at all, so the second run buys the same exit code and the
|
|
9
|
+
* same stdout digest at full price.
|
|
10
|
+
*
|
|
11
|
+
* What does NOT change: the verdict. A hit is served ONLY when the key proves
|
|
12
|
+
* the observation must be identical — same command line, same relative cwd,
|
|
13
|
+
* same timeout, and an UNCHANGED working tree (`HEAD` + a digest of
|
|
14
|
+
* `git status --porcelain` over tracked AND untracked files). A cached FAIL
|
|
15
|
+
* stays FAIL, and the stdout digest the F3 evidence anchoring depends on is
|
|
16
|
+
* byte-identical by construction (only provenance is annotated: `cached:
|
|
17
|
+
* true`, which the engine surfaces in `detail` and in `verification.evidence`).
|
|
18
|
+
*
|
|
19
|
+
* Fail-open everywhere: not a git worktree, no git binary, no commit yet,
|
|
20
|
+
* unreadable status, or a git call past its 10 s cap → no tree token → no key
|
|
21
|
+
* → the command executes exactly as before.
|
|
22
|
+
*
|
|
23
|
+
* Kill-switch: `ZELARI_VERIFY_CACHE=0|off|false` (default ON) makes
|
|
24
|
+
* `wrapWithVerifyCache` an IDENTITY function — no wrapper, no git calls.
|
|
25
|
+
*
|
|
26
|
+
* State: the LRU is MODULE-level on purpose. Every gate site builds its own
|
|
27
|
+
* decorator, but they all read/write the same map, so the post-repair and
|
|
28
|
+
* end-of-mission evaluations reuse what the first one observed — that is the
|
|
29
|
+
* whole point of Int2b (no shell plumbing through the bridge needed).
|
|
30
|
+
*
|
|
31
|
+
* Concurrency: the gate is sequential today; two identical commands in flight
|
|
32
|
+
* at the same time can both miss and both execute (no in-flight dedup). That
|
|
33
|
+
* is acceptable and honest — we never serve a result that was not observed.
|
|
34
|
+
*
|
|
35
|
+
* @since v2.38.0 (Int2b)
|
|
36
|
+
*/
|
|
37
|
+
import { execFile } from 'node:child_process';
|
|
38
|
+
import { createHash } from 'node:crypto';
|
|
39
|
+
import { promisify } from 'node:util';
|
|
40
|
+
const execFileAsync = promisify(execFile);
|
|
41
|
+
/** LRU bound (plan §6.2): 32 command results, memory-only, no persistence. */
|
|
42
|
+
const MAX_ENTRIES = 32;
|
|
43
|
+
/** Freshness window of one tree token inside a single decorator instance. */
|
|
44
|
+
const TREE_TTL_MS = 5_000;
|
|
45
|
+
/** `git status` can be large on dirty repos; past this it throws → fail-open. */
|
|
46
|
+
const GIT_MAX_BUFFER = 8 * 1024 * 1024;
|
|
47
|
+
/** A hung git (network mount, index lock) must never stall the gate. */
|
|
48
|
+
const GIT_TIMEOUT_MS = 10_000;
|
|
49
|
+
/**
|
|
50
|
+
* Module-level LRU (insertion order = recency, Map semantics): a hit is
|
|
51
|
+
* re-inserted, an overflow drops the oldest key. Shared by every decorator
|
|
52
|
+
* instance built in this process — see the header.
|
|
53
|
+
*/
|
|
54
|
+
const cache = new Map();
|
|
55
|
+
/** Test-only: drop every cached entry so suites stay independent. */
|
|
56
|
+
export function __resetVerifyCacheForTests() {
|
|
57
|
+
cache.clear();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Kill-switch, mirroring the `ZELARI_VERIFY_PACK` convention (default ON,
|
|
61
|
+
* `0|off|false` opts out).
|
|
62
|
+
*/
|
|
63
|
+
export function verifyCacheEnabled(env = process.env) {
|
|
64
|
+
const v = env.ZELARI_VERIFY_CACHE?.toLowerCase();
|
|
65
|
+
if (v === '0' || v === 'off' || v === 'false')
|
|
66
|
+
return false;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
function sha256(input) {
|
|
70
|
+
return createHash('sha256').update(input).digest('hex');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* `'HEAD:<rev>|<sha256(porcelain)>'`, or null when the root is not a usable
|
|
74
|
+
* git worktree (no git binary, not a repo, unborn HEAD, unreadable status).
|
|
75
|
+
* `--untracked-files=all` is deliberate: the default porcelain collapses an
|
|
76
|
+
* untracked DIRECTORY into a single entry, so a new file inside it would not
|
|
77
|
+
* move the digest.
|
|
78
|
+
*/
|
|
79
|
+
async function readTreeState(root) {
|
|
80
|
+
try {
|
|
81
|
+
const opts = { maxBuffer: GIT_MAX_BUFFER, timeout: GIT_TIMEOUT_MS, windowsHide: true };
|
|
82
|
+
const [head, status] = await Promise.all([
|
|
83
|
+
execFileAsync('git', ['-C', root, 'rev-parse', 'HEAD'], opts),
|
|
84
|
+
execFileAsync('git', ['-C', root, 'status', '--porcelain', '--untracked-files=all'], opts),
|
|
85
|
+
]);
|
|
86
|
+
return `HEAD:${String(head.stdout).trim()}|${sha256(String(status.stdout))}`;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
class CachedShellProvider {
|
|
93
|
+
inner;
|
|
94
|
+
root;
|
|
95
|
+
/**
|
|
96
|
+
* Tree token memo, PER INSTANCE (5 s TTL). Deliberately not module-level: a
|
|
97
|
+
* stale token would keep matching the pre-write key for up to the TTL and
|
|
98
|
+
* serve the PRE-repair result after the repair wrote files — a false PASS
|
|
99
|
+
* window on the gate. Every evaluation builds its own decorator, so a write
|
|
100
|
+
* made between evaluations is always observed; the memo only avoids
|
|
101
|
+
* re-running git for the sibling criteria of the SAME evaluation.
|
|
102
|
+
*/
|
|
103
|
+
treeMemo;
|
|
104
|
+
constructor(inner, options = {}) {
|
|
105
|
+
this.inner = inner;
|
|
106
|
+
this.root = options.root ?? process.cwd();
|
|
107
|
+
}
|
|
108
|
+
async treeState() {
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
if (this.treeMemo && now - this.treeMemo.at < TREE_TTL_MS)
|
|
111
|
+
return this.treeMemo.value;
|
|
112
|
+
const value = await readTreeState(this.root);
|
|
113
|
+
this.treeMemo = { at: now, value };
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
116
|
+
async exec(command, options = {}) {
|
|
117
|
+
const tree = await this.treeState();
|
|
118
|
+
// Unprovable tree → no key → execute exactly as an undecorated shell.
|
|
119
|
+
if (tree === null)
|
|
120
|
+
return await this.inner.exec(command, options);
|
|
121
|
+
const key = sha256(JSON.stringify({
|
|
122
|
+
command,
|
|
123
|
+
cwd: options.cwd ?? '',
|
|
124
|
+
timeoutMs: options.timeoutMs ?? null,
|
|
125
|
+
tree,
|
|
126
|
+
// Additive safety field: two evaluation roots in ONE process must
|
|
127
|
+
// never collide on the same relative cwd.
|
|
128
|
+
root: this.root,
|
|
129
|
+
}));
|
|
130
|
+
const started = Date.now();
|
|
131
|
+
const hit = cache.get(key);
|
|
132
|
+
if (hit !== undefined) {
|
|
133
|
+
cache.delete(key); // refresh recency
|
|
134
|
+
cache.set(key, hit);
|
|
135
|
+
// Copy on the way out: callers (and tests) must not mutate the entry.
|
|
136
|
+
return { ...hit, cached: true, durationMs: Date.now() - started };
|
|
137
|
+
}
|
|
138
|
+
const result = await this.inner.exec(command, options);
|
|
139
|
+
// Timeouts and signal/abort kills are NOT deterministic observations (the
|
|
140
|
+
// engine maps them to `unknown`) — never served from, never stored in.
|
|
141
|
+
if (!result.timedOut && result.exitCode !== null) {
|
|
142
|
+
cache.set(key, { ...result });
|
|
143
|
+
if (cache.size > MAX_ENTRIES) {
|
|
144
|
+
const oldest = cache.keys().next().value;
|
|
145
|
+
if (oldest !== undefined)
|
|
146
|
+
cache.delete(oldest);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Decorate `shell` with the shared verify cache. Identity when the kill-switch
|
|
154
|
+
* is off, so callers can wrap unconditionally.
|
|
155
|
+
*/
|
|
156
|
+
export function wrapWithVerifyCache(shell, options = {}) {
|
|
157
|
+
const env = options.env ?? process.env;
|
|
158
|
+
if (!verifyCacheEnabled(env))
|
|
159
|
+
return shell;
|
|
160
|
+
return new CachedShellProvider(shell, options);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=cachedShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cachedShell.js","sourceRoot":"","sources":["../../../src/cli/kraken/cachedShell.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LocalWorkspace, NodeShellProvider } from '@zelari/core/runtime';
|
|
2
2
|
import { VerificationEngine, } from '@zelari/core/verification';
|
|
3
3
|
import { EMPTY_POLICY_RULE_SET, matchAgentPolicyRule, } from '../safety/policyEngine.js';
|
|
4
|
+
import { wrapWithVerifyCache } from './cachedShell.js';
|
|
4
5
|
/** Engine packId for contract-derived checks (distinct from the coding pack). */
|
|
5
6
|
export const CONTRACT_CRITERIA_PACK_ID = 'task-contract/v1';
|
|
6
7
|
/** Per-command timeout for compiled criteria (mirrors the native pack default). */
|
|
@@ -132,7 +133,11 @@ export async function evaluateContractCriteria(contract, deps = {}) {
|
|
|
132
133
|
const criteria = compileVerificationCriteria(contract, { timeoutMs: deps.timeoutMs });
|
|
133
134
|
if (criteria.length === 0)
|
|
134
135
|
return null;
|
|
135
|
-
|
|
136
|
+
// Int2b: same decorator discipline as the native pack — the module-level
|
|
137
|
+
// LRU is shared, so a contract `Verify:` command already executed in this
|
|
138
|
+
// process under an unchanged tree is not re-run (ZELARI_VERIFY_CACHE=0 opts
|
|
139
|
+
// out). An injected shell (tests) is used as is.
|
|
140
|
+
const shell = deps.shell ?? wrapWithVerifyCache(new NodeShellProvider(new LocalWorkspace(cwd)), { root: cwd });
|
|
136
141
|
const engine = deps.emit
|
|
137
142
|
? new VerificationEngine({ shell }, { emit: deps.emit })
|
|
138
143
|
: new VerificationEngine({ shell });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contractCompiler.js","sourceRoot":"","sources":["../../../src/cli/kraken/contractCompiler.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzE,OAAO,EACL,kBAAkB,GAGnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAGrB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"contractCompiler.js","sourceRoot":"","sources":["../../../src/cli/kraken/contractCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,8 +36,9 @@
|
|
|
36
36
|
*/
|
|
37
37
|
import { getReadyNodes, isSettled, isConverged, failedNodeIds, countByStatus, canRunParallel, parseVerifyVerdict, } from '@zelari/core';
|
|
38
38
|
import { runTentacle, TASK_TOOL_TIMEOUT_MS, } from './tentacle.js';
|
|
39
|
-
import { mergeKrakenWorktree, } from '../tools/krakenWorktree.js';
|
|
39
|
+
import { beginKrakenWorktreeCleanupBatch, flushKrakenWorktreeCleanupBatch, mergeKrakenWorktree, } from '../tools/krakenWorktree.js';
|
|
40
40
|
import { appendKrakenRadio } from '../tools/krakenRadio.js';
|
|
41
|
+
import { runWithLimit } from '../asyncLimit.js';
|
|
41
42
|
import { runTransactional } from './transactional.js';
|
|
42
43
|
import { runBacktest } from '../workspace/worldModel.js';
|
|
43
44
|
import { startKrakenGraphLive, updateKrakenGraphLive, endKrakenGraphLive, } from './graphStatus.js';
|
|
@@ -485,6 +486,12 @@ export class KrakenGraphExecutor {
|
|
|
485
486
|
// Do not hold the process open just to fire a cancellation.
|
|
486
487
|
graphTimer.unref?.();
|
|
487
488
|
}
|
|
489
|
+
// Int3c (plan v2 §7.3): this run owns the worktree cleanup batch. Eager
|
|
490
|
+
// per-worktree `worktree remove --force` frees the filesystem immediately,
|
|
491
|
+
// while `worktree prune` + `branch -D` are queued and issued ONCE in the
|
|
492
|
+
// `finally` below — the real end-of-run site, after `schedule()` has
|
|
493
|
+
// merged every deferred worktree and written the graph snapshot.
|
|
494
|
+
const worktreeCleanupBatched = beginKrakenWorktreeCleanupBatch(process.env);
|
|
488
495
|
try {
|
|
489
496
|
return await this.schedule(graph);
|
|
490
497
|
}
|
|
@@ -492,6 +499,11 @@ export class KrakenGraphExecutor {
|
|
|
492
499
|
if (graphTimer)
|
|
493
500
|
clearTimeout(graphTimer);
|
|
494
501
|
this.signal?.removeEventListener('abort', onAbort);
|
|
502
|
+
// Fires on the throw path too: the queue is in-process state, so a
|
|
503
|
+
// cancelled or failed run must not be the only thing that ever gets to
|
|
504
|
+
// delete the branches whose worktrees it already removed.
|
|
505
|
+
if (worktreeCleanupBatched)
|
|
506
|
+
await flushKrakenWorktreeCleanupBatch();
|
|
495
507
|
}
|
|
496
508
|
}
|
|
497
509
|
/** The scheduling loop proper. See {@link execute} for the cancellation wrapper. */
|
|
@@ -1443,6 +1455,10 @@ export class KrakenGraphExecutor {
|
|
|
1443
1455
|
if (!memory || this.deps.memoryAutoWrite === false)
|
|
1444
1456
|
return;
|
|
1445
1457
|
try {
|
|
1458
|
+
// Int 3b: collect the edges FIRST, then link them with a bounded fan-out
|
|
1459
|
+
// (8 concurrent connects). The previous loop awaited one round-trip per
|
|
1460
|
+
// edge, so K edges cost K sequential latencies before `remember` ran.
|
|
1461
|
+
const edges = [];
|
|
1446
1462
|
for (const node of graph.nodes.values()) {
|
|
1447
1463
|
const nodeMemoryId = this.memoryIds.get(node.id);
|
|
1448
1464
|
if (!nodeMemoryId)
|
|
@@ -1453,7 +1469,7 @@ export class KrakenGraphExecutor {
|
|
|
1453
1469
|
continue;
|
|
1454
1470
|
if (node.kind === 'verify') {
|
|
1455
1471
|
const verdict = parseVerifyVerdict(node.result).verdict;
|
|
1456
|
-
|
|
1472
|
+
edges.push({
|
|
1457
1473
|
from: dependencyMemoryId,
|
|
1458
1474
|
to: nodeMemoryId,
|
|
1459
1475
|
relation: verdict === 'pass'
|
|
@@ -1461,19 +1477,14 @@ export class KrakenGraphExecutor {
|
|
|
1461
1477
|
: verdict === 'fail'
|
|
1462
1478
|
? 'invalidated_by'
|
|
1463
1479
|
: 'related_to',
|
|
1464
|
-
createdBy: 'kraken-orchestrator',
|
|
1465
1480
|
});
|
|
1466
1481
|
}
|
|
1467
1482
|
else {
|
|
1468
|
-
|
|
1469
|
-
from: nodeMemoryId,
|
|
1470
|
-
to: dependencyMemoryId,
|
|
1471
|
-
relation: 'derived_from',
|
|
1472
|
-
createdBy: 'kraken-orchestrator',
|
|
1473
|
-
});
|
|
1483
|
+
edges.push({ from: nodeMemoryId, to: dependencyMemoryId, relation: 'derived_from' });
|
|
1474
1484
|
}
|
|
1475
1485
|
}
|
|
1476
1486
|
}
|
|
1487
|
+
await runWithLimit(edges, 8, (edge) => memory.connect({ ...edge, createdBy: 'kraken-orchestrator' }).catch(() => undefined));
|
|
1477
1488
|
const counts = countByStatus(graph);
|
|
1478
1489
|
const outcome = await memory.remember({
|
|
1479
1490
|
kind: converged ? 'outcome' : 'failure',
|
|
@@ -1486,14 +1497,13 @@ export class KrakenGraphExecutor {
|
|
|
1486
1497
|
metadata: { graphId: graph.id, converged, counts, writeClass: 'auto' },
|
|
1487
1498
|
writeClass: 'auto',
|
|
1488
1499
|
});
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
}
|
|
1500
|
+
const outcomeEdges = [...this.memoryIds.values()].map((memoryId) => ({
|
|
1501
|
+
from: outcome.id,
|
|
1502
|
+
to: memoryId,
|
|
1503
|
+
relation: 'derived_from',
|
|
1504
|
+
createdBy: 'kraken-orchestrator',
|
|
1505
|
+
}));
|
|
1506
|
+
await runWithLimit(outcomeEdges, 8, (edge) => memory.connect(edge).catch(() => undefined));
|
|
1497
1507
|
await memory.consolidate({
|
|
1498
1508
|
source: { agent: 'kraken-orchestrator', sessionId: this.sessionId },
|
|
1499
1509
|
minOccurrences: 2,
|