zelari-code 2.5.0 → 2.6.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/budget/budgetRuntime.js +115 -0
- package/dist/cli/budget/budgetRuntime.js.map +1 -0
- package/dist/cli/budget/modelContextBuilder.js +11 -0
- package/dist/cli/budget/modelContextBuilder.js.map +1 -1
- package/dist/cli/budget/resourceLedger.js +61 -0
- package/dist/cli/budget/resourceLedger.js.map +1 -0
- package/dist/cli/budget/resourceSnapshot.js +43 -0
- package/dist/cli/budget/resourceSnapshot.js.map +1 -0
- package/dist/cli/gauntlet/policy.js +9 -0
- package/dist/cli/gauntlet/policy.js.map +1 -1
- package/dist/cli/harnessManifest.js +62 -0
- package/dist/cli/harnessManifest.js.map +1 -0
- package/dist/cli/headlessSpine.js +15 -0
- package/dist/cli/headlessSpine.js.map +1 -1
- package/dist/cli/hooks/useChatTurn.js +4 -0
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/kraken/taskContract.js +44 -0
- package/dist/cli/kraken/taskContract.js.map +1 -0
- package/dist/cli/main.bundled.js +1223 -303
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/runHeadless.js +5 -0
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/sessionSpine.js +118 -4
- package/dist/cli/sessionSpine.js.map +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/cli/budget/budgetRuntime.ts — live host-owned budget runtime (2.6
|
|
3
|
+
* Track B, doc §9–§12 rollout Phase 2/3). Wires the pure core primitives
|
|
4
|
+
* (ResourcePolicy/ResourceBudget) to the running loop:
|
|
5
|
+
*
|
|
6
|
+
* - counts every tool.call that lands on the spine (via SessionSpineMirror
|
|
7
|
+
* attach) and emits `resource.snapshot` events at §10.4 frequency;
|
|
8
|
+
* - exposes the LATEST snapshot for the model-visible RESOURCE STATUS
|
|
9
|
+
* block (injected by buildModelContext);
|
|
10
|
+
* - gates tool calls when the protected verification zone is entered
|
|
11
|
+
* (§11.3): `advisory` (default, Phase 2) lets everything through with a
|
|
12
|
+
* warning; `protected` (Phase 3, ZELARI_RESOURCE_ENFORCEMENT=protected)
|
|
13
|
+
* denies non-essential tools and tells the model to verify/finalize.
|
|
14
|
+
*
|
|
15
|
+
* The model never mutates this state — only the host appends (§9.5).
|
|
16
|
+
*/
|
|
17
|
+
import { defaultResourcePolicy } from '@zelari/core';
|
|
18
|
+
import { ResourceLedger, rebuildLedgerFromEvents } from './resourceLedger.js';
|
|
19
|
+
import { buildResourceSnapshot, shouldEmitSnapshot, } from './resourceSnapshot.js';
|
|
20
|
+
/**
|
|
21
|
+
* §11.3 verification-essential tools: test/typecheck/build/diff/read
|
|
22
|
+
* failure/targeted repair/retest. Everything else (delegation, speculative
|
|
23
|
+
* search, new architecture) is non-essential inside the protected zone.
|
|
24
|
+
*/
|
|
25
|
+
const DEFAULT_ESSENTIAL_TOOLS = [
|
|
26
|
+
'bash',
|
|
27
|
+
'read_file',
|
|
28
|
+
'edit_file',
|
|
29
|
+
'write_file',
|
|
30
|
+
'apply_diff',
|
|
31
|
+
'grep_content',
|
|
32
|
+
'list_files',
|
|
33
|
+
'show_diff',
|
|
34
|
+
];
|
|
35
|
+
const ADVISORY_NOTICE = 'Resource advisory: verification reserve reached. Prioritize test/typecheck/build/diff and targeted repair; avoid broad exploration or delegation.';
|
|
36
|
+
const PROTECTED_DENIAL = 'Resource protected: remaining tool calls are reserved for verification and targeted repair. Run the required checks (test/typecheck/build), read the failure, apply a minimal fix, retest — or report BLOCKED with the evidence you have.';
|
|
37
|
+
/** Phase selector — advisory by default (§11.4), protected via env (Phase 3). */
|
|
38
|
+
export function resolveResourceEnforcement(env = process.env) {
|
|
39
|
+
return env.ZELARI_RESOURCE_ENFORCEMENT === 'protected' ? 'protected' : 'advisory';
|
|
40
|
+
}
|
|
41
|
+
export class BudgetRuntime {
|
|
42
|
+
policy;
|
|
43
|
+
enforcement;
|
|
44
|
+
ledger;
|
|
45
|
+
essential;
|
|
46
|
+
stage;
|
|
47
|
+
lastEmitted;
|
|
48
|
+
constructor(profileId, opts = {}) {
|
|
49
|
+
this.policy = opts.policy ?? defaultResourcePolicy(profileId);
|
|
50
|
+
this.enforcement = opts.enforcement ?? 'advisory';
|
|
51
|
+
this.essential = new Set(opts.essentialTools ?? DEFAULT_ESSENTIAL_TOOLS);
|
|
52
|
+
this.stage = opts.stage ?? 'implement';
|
|
53
|
+
this.ledger = new ResourceLedger();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Count one tool call; returns the snapshot to emit when §10.4 says so
|
|
57
|
+
* (first sight, stage/pressure change, reserve crossing, any usage delta).
|
|
58
|
+
*/
|
|
59
|
+
noteToolCall() {
|
|
60
|
+
this.ledger.record('tool-call');
|
|
61
|
+
return this.emitIfDue();
|
|
62
|
+
}
|
|
63
|
+
/** §10.4 verification start: stage change (and a zero-cost ledger mark). */
|
|
64
|
+
noteVerificationStart() {
|
|
65
|
+
this.ledger.record('verification', 0);
|
|
66
|
+
return this.setStage('verify');
|
|
67
|
+
}
|
|
68
|
+
/** §10.4 repair start. */
|
|
69
|
+
noteRepairStart() {
|
|
70
|
+
return this.setStage('repair');
|
|
71
|
+
}
|
|
72
|
+
/** Stage transition; emits when the stage actually changes. */
|
|
73
|
+
setStage(stage) {
|
|
74
|
+
if (stage === this.stage)
|
|
75
|
+
return null;
|
|
76
|
+
this.stage = stage;
|
|
77
|
+
return this.emitIfDue();
|
|
78
|
+
}
|
|
79
|
+
/** Current projection without emitting. */
|
|
80
|
+
current() {
|
|
81
|
+
return buildResourceSnapshot(this.ledger.budget(this.policy, this.stage), this.policy);
|
|
82
|
+
}
|
|
83
|
+
/** §11.3 gate — advisory mode never blocks; protected mode guards the zone. */
|
|
84
|
+
gateToolCall(toolName) {
|
|
85
|
+
const snapshot = this.current();
|
|
86
|
+
if (!snapshot.reserveProtected)
|
|
87
|
+
return { allowed: true, advisory: false, snapshot };
|
|
88
|
+
if (this.enforcement === 'advisory') {
|
|
89
|
+
return { allowed: true, advisory: true, reason: ADVISORY_NOTICE, snapshot };
|
|
90
|
+
}
|
|
91
|
+
if (this.essential.has(toolName)) {
|
|
92
|
+
return { allowed: true, advisory: true, reason: ADVISORY_NOTICE, snapshot };
|
|
93
|
+
}
|
|
94
|
+
return { allowed: false, advisory: false, reason: PROTECTED_DENIAL, snapshot };
|
|
95
|
+
}
|
|
96
|
+
/** Resume path (§9.5): rebuild usage from the session log, no emission. */
|
|
97
|
+
adoptLedgerFromEvents(events) {
|
|
98
|
+
const rebuilt = rebuildLedgerFromEvents(events);
|
|
99
|
+
this.ledger.resetTo(rebuilt.snapshot());
|
|
100
|
+
this.lastEmitted = undefined;
|
|
101
|
+
}
|
|
102
|
+
/** Latest emitted snapshot (what the model surface shows), if any. */
|
|
103
|
+
latestEmitted() {
|
|
104
|
+
return this.lastEmitted;
|
|
105
|
+
}
|
|
106
|
+
emitIfDue() {
|
|
107
|
+
const next = this.current();
|
|
108
|
+
if (shouldEmitSnapshot(this.lastEmitted, next)) {
|
|
109
|
+
this.lastEmitted = next;
|
|
110
|
+
return next;
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=budgetRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budgetRuntime.js","sourceRoot":"","sources":["../../../src/cli/budget/budgetRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,16 @@ import { applyBudgetPolicyAsync, estimateHistoryTokens, } from './tokenBudget.js
|
|
|
2
2
|
import { measureRequest } from './requestMeter.js';
|
|
3
3
|
import { compactEventPayload, } from './persistCompact.js';
|
|
4
4
|
import { derivedModelSeed } from '../headlessSpine.js';
|
|
5
|
+
import { formatResourceSnapshot } from '@zelari/core/session';
|
|
5
6
|
function messageWasRecompacted(message, history) {
|
|
6
7
|
if (message.compactedFromSeq === undefined)
|
|
7
8
|
return false;
|
|
8
9
|
return !history.some((candidate) => candidate.seq !== undefined && candidate.seq === message.seq);
|
|
9
10
|
}
|
|
11
|
+
/** RESOURCE STATUS system tail (doc §10.3) from the latest snapshot payload. */
|
|
12
|
+
function resourceStatusMessage(payload) {
|
|
13
|
+
return { role: 'system', content: formatResourceSnapshot(payload) };
|
|
14
|
+
}
|
|
10
15
|
async function sessionHistory(session) {
|
|
11
16
|
if (!session || session.status !== 'active')
|
|
12
17
|
return null;
|
|
@@ -87,6 +92,12 @@ export async function buildModelContext(input) {
|
|
|
87
92
|
};
|
|
88
93
|
input.onCompactionMetric?.(compactionMetrics);
|
|
89
94
|
}
|
|
95
|
+
// 2.6 Track B (doc §10.3): model-visible RESOURCE STATUS — the LATEST
|
|
96
|
+
// snapshot only, appended as a system tail AFTER compaction replay so the
|
|
97
|
+
// occupancy measurement below includes it. Projection stays latest-only.
|
|
98
|
+
if (input.resourceSnapshot) {
|
|
99
|
+
history = [...history, resourceStatusMessage(input.resourceSnapshot)];
|
|
100
|
+
}
|
|
90
101
|
if (requestSurface) {
|
|
91
102
|
const measured = measureRequest({
|
|
92
103
|
systemMessages: requestSurface.systemMessages,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelContextBuilder.js","sourceRoot":"","sources":["../../../src/cli/budget/modelContextBuilder.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAGtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"modelContextBuilder.js","sourceRoot":"","sources":["../../../src/cli/budget/modelContextBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/cli/budget/resourceLedger.ts — host-owned append-only resource ledger
|
|
3
|
+
* (2.6 Track B, doc §9.4). Single counting point: tool-call usage derives
|
|
4
|
+
* from `tool.call` session events (never from tool.interrupted — no double
|
|
5
|
+
* count). The model can read projections; only the host appends.
|
|
6
|
+
*/
|
|
7
|
+
import { ledgerDeltaFor, usageFromLedger, } from '@zelari/core';
|
|
8
|
+
import { budgetPressure, computeBudget } from '@zelari/core';
|
|
9
|
+
export class ResourceLedger {
|
|
10
|
+
entries = [];
|
|
11
|
+
nextSeq = 1;
|
|
12
|
+
static fromEntries(entries) {
|
|
13
|
+
const ledger = new ResourceLedger();
|
|
14
|
+
ledger.entries = [...entries];
|
|
15
|
+
ledger.nextSeq = entries.reduce((m, e) => Math.max(m, e.seq), 0) + 1;
|
|
16
|
+
return ledger;
|
|
17
|
+
}
|
|
18
|
+
/** Record one spend. Returns the entry (host call sites only). */
|
|
19
|
+
record(reason, calls = 1) {
|
|
20
|
+
const entry = { seq: this.nextSeq++, reason, delta: ledgerDeltaFor(reason, calls) };
|
|
21
|
+
this.entries.push(entry);
|
|
22
|
+
return entry;
|
|
23
|
+
}
|
|
24
|
+
snapshot() {
|
|
25
|
+
return [...this.entries];
|
|
26
|
+
}
|
|
27
|
+
/** Replace state (BudgetRuntime resume path); host call sites only. */
|
|
28
|
+
resetTo(entries) {
|
|
29
|
+
this.entries = [...entries];
|
|
30
|
+
this.nextSeq = entries.reduce((m, e) => Math.max(m, e.seq), 0) + 1;
|
|
31
|
+
}
|
|
32
|
+
usage() {
|
|
33
|
+
return usageFromLedger(this.entries);
|
|
34
|
+
}
|
|
35
|
+
/** Current budget projection under the given policy. Pure over the ledger. */
|
|
36
|
+
budget(policy, stage = 'implement') {
|
|
37
|
+
const usage = this.usage();
|
|
38
|
+
return computeBudget(policy, { toolCallsUsed: usage.toolCallsUsed, elapsedMs: usage.wallMs, tokensUsed: usage.tokensUsed }, stage);
|
|
39
|
+
}
|
|
40
|
+
pressure(policy) {
|
|
41
|
+
return budgetPressure(this.budget(policy), policy);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Rebuild the ledger from a session log (resume path, doc §9.5):
|
|
46
|
+
* one `tool-call` delta per `tool.call` event. Idempotent, order-preserving.
|
|
47
|
+
*/
|
|
48
|
+
export function rebuildLedgerFromEvents(events) {
|
|
49
|
+
const ledger = new ResourceLedger();
|
|
50
|
+
for (const e of events) {
|
|
51
|
+
if (e.kind === 'tool.call') {
|
|
52
|
+
// Same delta shape a live host append produces — replay == live.
|
|
53
|
+
ledger.record('tool-call', 1);
|
|
54
|
+
}
|
|
55
|
+
else if (e.kind === 'verification.run') {
|
|
56
|
+
ledger.record('verification', 0);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return ledger;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=resourceLedger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceLedger.js","sourceRoot":"","sources":["../../../src/cli/budget/resourceLedger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,cAAc,EACd,eAAe,GAIhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D,MAAM,OAAO,cAAc;IACjB,OAAO,GAA0B,EAAE,CAAC;IACpC,OAAO,GAAG,CAAC,CAAC;IAEpB,MAAM,CAAC,WAAW,CAAC,OAAuC;QACxD,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kEAAkE;IAClE,MAAM,CAAC,MAA4B,EAAE,KAAK,GAAG,CAAC;QAC5C,MAAM,KAAK,GAAwB,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QACzG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,uEAAuE;IACvE,OAAO,CAAC,OAAuC;QAC7C,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,KAAK;QACH,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,8EAA8E;IAC9E,MAAM,CAAC,MAAsB,EAAE,QAAuB,WAAW;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;IACrI,CAAC;IAED,QAAQ,CAAC,MAAsB;QAC7B,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAuC;IAC7E,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3B,iEAAiE;YACjE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/cli/budget/resourceSnapshot.ts — emits `resource.snapshot` events and
|
|
3
|
+
* the model-visible RESOURCE STATUS block (2.6 Track B, doc §10).
|
|
4
|
+
*
|
|
5
|
+
* Frequency rules (§10.4): after a tool batch, on stage change, when a
|
|
6
|
+
* reserve threshold is crossed, and at verification/repair start. The event
|
|
7
|
+
* is model-surface LATEST-ONLY (modelSurface.ts projection) — the ledger
|
|
8
|
+
* keeps every snapshot, the model sees the last.
|
|
9
|
+
*/
|
|
10
|
+
import { budgetPressure, isVerificationReserveProtected } from '@zelari/core';
|
|
11
|
+
export function buildResourceSnapshot(budget, policy) {
|
|
12
|
+
return {
|
|
13
|
+
toolCallsLimit: budget.toolCalls.limit,
|
|
14
|
+
toolCallsUsed: budget.toolCalls.used,
|
|
15
|
+
toolCallsRemaining: budget.toolCalls.remaining,
|
|
16
|
+
...(budget.wallTime.remainingMs !== undefined ? { wallMsRemaining: budget.wallTime.remainingMs } : {}),
|
|
17
|
+
verificationReserve: budget.reserve.verification,
|
|
18
|
+
repairReserve: budget.reserve.repair,
|
|
19
|
+
stage: budget.stage,
|
|
20
|
+
pressure: budgetPressure(budget, policy),
|
|
21
|
+
reserveProtected: isVerificationReserveProtected(budget),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Decide whether a new snapshot must be emitted after a state change. */
|
|
25
|
+
export function shouldEmitSnapshot(previous, next) {
|
|
26
|
+
if (!previous)
|
|
27
|
+
return true;
|
|
28
|
+
if (previous.stage !== next.stage)
|
|
29
|
+
return true;
|
|
30
|
+
if (previous.pressure !== next.pressure)
|
|
31
|
+
return true;
|
|
32
|
+
if (previous.reserveProtected !== next.reserveProtected)
|
|
33
|
+
return true;
|
|
34
|
+
// After every tool batch: any usage delta.
|
|
35
|
+
if (previous.toolCallsUsed !== next.toolCallsUsed)
|
|
36
|
+
return true;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
/** Event data payload — keys the invariant checker validates. */
|
|
40
|
+
export function snapshotEventData(s) {
|
|
41
|
+
return { ...s };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=resourceSnapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceSnapshot.js","sourceRoot":"","sources":["../../../src/cli/budget/resourceSnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,cAAc,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAiB9E,MAAM,UAAU,qBAAqB,CAAC,MAAsB,EAAE,MAAsB;IAClF,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK;QACtC,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI;QACpC,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS;QAC9C,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtG,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY;QAChD,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;QACpC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;QACxC,gBAAgB,EAAE,8BAA8B,CAAC,MAAM,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAChC,QAA6C,EAC7C,IAA6B;IAE7B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,QAAQ,CAAC,gBAAgB,KAAK,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACrE,2CAA2C;IAC3C,IAAI,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,iBAAiB,CAAC,CAA0B;IAC1D,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -58,4 +58,13 @@ export function shouldRunGauntletHostLoop(opts) {
|
|
|
58
58
|
const phase = opts.phase ?? 'build';
|
|
59
59
|
return phase !== 'plan';
|
|
60
60
|
}
|
|
61
|
+
export function budgetAwareGauntletGate(input) {
|
|
62
|
+
if (input.verdict === 'PASS')
|
|
63
|
+
return 'proceed';
|
|
64
|
+
if (input.toolCallsRemaining <= input.verificationReserve)
|
|
65
|
+
return 'finalize-verify';
|
|
66
|
+
if (input.toolCallsRemaining <= 0)
|
|
67
|
+
return 'hold';
|
|
68
|
+
return 'proceed';
|
|
69
|
+
}
|
|
61
70
|
//# sourceMappingURL=policy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/cli/gauntlet/policy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C,gEAAgE;AAChE,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,MAAM;CACE,CAAC;AAUX,SAAS,MAAM,CAAC,GAAuB,EAAE,QAAgB,EAAE,GAAW,EAAE,GAAW;IACjF,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAkB,EAClB,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC;IAChC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC;IAC5C,IAAI,WAAW,GAAG,eAAe,CAAC;IAClC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,WAAW,GAAG,CAAC,CAAC;IACpD,CAAC;IACD,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5E,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3E,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,CAAC;QACjF,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CAAC,IAMzC;IACC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC;IACpC,OAAO,KAAK,KAAK,MAAM,CAAC;AAC1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/cli/gauntlet/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/cli/harnessManifest.ts — builds and emits the canonical harness
|
|
3
|
+
* manifest for the running CLI session (2.6 Track A, doc §6).
|
|
4
|
+
*
|
|
5
|
+
* Pure assembly: raw prompt texts / policy objects go IN, hashes come OUT
|
|
6
|
+
* (never the raw text). Version resolution follows the updater.ts precedent
|
|
7
|
+
* (`__dirname` + `require`, bundle-safe); everything else is injected so the
|
|
8
|
+
* builder stays unit-testable and deterministic.
|
|
9
|
+
*/
|
|
10
|
+
import { HarnessManifestV1Schema, harnessInputHash, hashHarnessManifest, } from '@zelari/core';
|
|
11
|
+
import { profileHash, toolManifestHash } from '@zelari/core';
|
|
12
|
+
import { getCurrentVersion } from './updater.js';
|
|
13
|
+
function resolveCoreVersion() {
|
|
14
|
+
try {
|
|
15
|
+
// Same bundle-safe precedent as updater.ts getCurrentVersion().
|
|
16
|
+
const pkgPath = require.resolve('@zelari/core/package.json');
|
|
17
|
+
const pkg = require(pkgPath);
|
|
18
|
+
return pkg.version;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return '0.0.0';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Build + validate + hash the manifest. Throws on invalid assembly. */
|
|
25
|
+
export function buildHarnessManifest(parts) {
|
|
26
|
+
const prompts = {};
|
|
27
|
+
for (const [role, text] of Object.entries(parts.prompts ?? {})) {
|
|
28
|
+
if (typeof text === 'string' && text.length > 0) {
|
|
29
|
+
prompts[role] = harnessInputHash(text);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const manifest = HarnessManifestV1Schema.parse({
|
|
33
|
+
schemaVersion: 1,
|
|
34
|
+
profile: {
|
|
35
|
+
id: parts.profile.id,
|
|
36
|
+
phase: parts.phase,
|
|
37
|
+
hash: profileHash(parts.profile),
|
|
38
|
+
},
|
|
39
|
+
prompts,
|
|
40
|
+
capabilities: {
|
|
41
|
+
toolManifestHash: toolManifestHash(parts.toolNames),
|
|
42
|
+
skillManifestHash: harnessInputHash([...(parts.skillIds ?? [])].sort()),
|
|
43
|
+
},
|
|
44
|
+
policies: {
|
|
45
|
+
routingHash: harnessInputHash(parts.routing ?? { unset: true }),
|
|
46
|
+
verificationHash: harnessInputHash(parts.verification ?? { engine: 'deterministic' }),
|
|
47
|
+
completionPolicyHash: harnessInputHash(parts.completionPolicy ?? { mode: 'strict', required: '*' }),
|
|
48
|
+
compactionHash: harnessInputHash(parts.compaction ?? { version: 1 }),
|
|
49
|
+
resourcePolicyHash: harnessInputHash(parts.resourcePolicy ?? { unset: true }),
|
|
50
|
+
},
|
|
51
|
+
runtime: {
|
|
52
|
+
coreVersion: parts.coreVersion ?? resolveCoreVersion(),
|
|
53
|
+
cliVersion: parts.cliVersion ?? getCurrentVersion(),
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
return { manifest, manifestHash: hashHarnessManifest(manifest) };
|
|
57
|
+
}
|
|
58
|
+
/** Session event payload for `session.harness_manifest` (state-only). */
|
|
59
|
+
export function harnessManifestEventData(manifest, manifestHash) {
|
|
60
|
+
return { manifest, manifestHash };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=harnessManifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessManifest.js","sourceRoot":"","sources":["../../src/cli/harnessManifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAgB,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AA8BjD,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,gEAAgE;QAChE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAwB,CAAC;QACpD,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,KAA2B;IAI9D,MAAM,OAAO,GAAiC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,IAA0C,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAsB,uBAAuB,CAAC,KAAK,CAAC;QAChE,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE;YACP,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;SACjC;QACD,OAAO;QACP,YAAY,EAAE;YACZ,gBAAgB,EAAE,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC;YACnD,iBAAiB,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACxE;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC/D,gBAAgB,EAAE,gBAAgB,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;YACrF,oBAAoB,EAAE,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YACnG,cAAc,EAAE,gBAAgB,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACpE,kBAAkB,EAAE,gBAAgB,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SAC9E;QACD,OAAO,EAAE;YACP,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,kBAAkB,EAAE;YACtD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,iBAAiB,EAAE;SACpD;KACF,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,wBAAwB,CAAC,QAA2B,EAAE,YAAoB;IACxF,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
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 { readSessionLog } from '@zelari/core/session';
|
|
5
|
+
import path from 'node:path';
|
|
4
6
|
import { resolveProfile, toolManifestHash } from '@zelari/core/runtime';
|
|
5
7
|
import { SessionSpineMirror } from './sessionSpine.js';
|
|
8
|
+
import { BudgetRuntime, resolveResourceEnforcement } from './budget/budgetRuntime.js';
|
|
6
9
|
import { defaultProfileForMode } from './headless.js';
|
|
7
10
|
/**
|
|
8
11
|
* E1.4 (ADR-0016/0021): the NDJSON event hosts consume to learn which 2.0
|
|
@@ -46,6 +49,15 @@ export async function openHeadlessSpine(opts) {
|
|
|
46
49
|
};
|
|
47
50
|
const spine = await SessionSpineMirror.adopt(opts.sessionId, mirrorOpts);
|
|
48
51
|
if (spine.status === 'active') {
|
|
52
|
+
// 2.6 Track B (Phase 2/3): count tool calls, emit resource.snapshot.
|
|
53
|
+
const budget = new BudgetRuntime(profileId, { enforcement: resolveResourceEnforcement() });
|
|
54
|
+
if (spine.resumedFromSeq !== undefined && spine.resumedFromSeq > 0) {
|
|
55
|
+
// §9.5 reconstructable state: rebuild usage from the prior log.
|
|
56
|
+
const prior = await readSessionLog(path.join(spine.sessionsDir, opts.sessionId, 'events.jsonl')).catch(() => null);
|
|
57
|
+
if (prior)
|
|
58
|
+
budget.adoptLedgerFromEvents(prior.events);
|
|
59
|
+
}
|
|
60
|
+
spine.attachBudgetRuntime(budget);
|
|
49
61
|
spine.note('headless.profile', { profile: profileId, mode: opts.mode ?? 'kraken' });
|
|
50
62
|
}
|
|
51
63
|
return {
|
|
@@ -60,6 +72,9 @@ export async function openHeadlessSpine(opts) {
|
|
|
60
72
|
userMessage(text) {
|
|
61
73
|
spine.userMessage(text);
|
|
62
74
|
},
|
|
75
|
+
gateResourceToolCall(toolName) {
|
|
76
|
+
return spine.gateResourceToolCall(toolName);
|
|
77
|
+
},
|
|
63
78
|
verificationRun(payload) {
|
|
64
79
|
spine.verificationRun(payload);
|
|
65
80
|
},
|
|
@@ -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,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAA2B,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"headlessSpine.js","sourceRoot":"","sources":["../../src/cli/headlessSpine.ts"],"names":[],"mappings":"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"}
|
|
@@ -249,6 +249,7 @@ export function useChatTurn(params) {
|
|
|
249
249
|
const modelContext = await buildModelContext({
|
|
250
250
|
fallbackHistory: historyForModel,
|
|
251
251
|
session: writerRef.current?.spine ?? null,
|
|
252
|
+
resourceSnapshot: writerRef.current?.spine?.latestResourceSnapshot() ?? null,
|
|
252
253
|
phase: workPhase,
|
|
253
254
|
model: getActiveModel(),
|
|
254
255
|
provider: envConfig?.providerId ?? (localCli || 'local'),
|
|
@@ -578,6 +579,9 @@ export function useChatTurn(params) {
|
|
|
578
579
|
})),
|
|
579
580
|
toolRegistry,
|
|
580
581
|
providerStream,
|
|
582
|
+
// 2.6 Phase 3: host-owned pre-dispatch resource gate via the spine
|
|
583
|
+
// mirror (doc section 11.3). Degrade-and-stop (null gate = allow).
|
|
584
|
+
toolCallGate: (name) => writerRef.current?.spine?.gateResourceToolCall(name) ?? { allowed: true },
|
|
581
585
|
cwd,
|
|
582
586
|
maxToolCallsPerTurn,
|
|
583
587
|
maxToolLoopIterations,
|