zelari-code 2.4.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.
Files changed (37) hide show
  1. package/dist/cli/budget/budgetRuntime.js +115 -0
  2. package/dist/cli/budget/budgetRuntime.js.map +1 -0
  3. package/dist/cli/budget/historySummary.js +40 -2
  4. package/dist/cli/budget/historySummary.js.map +1 -1
  5. package/dist/cli/budget/modelContextBuilder.js +137 -0
  6. package/dist/cli/budget/modelContextBuilder.js.map +1 -0
  7. package/dist/cli/budget/persistCompact.js +67 -0
  8. package/dist/cli/budget/persistCompact.js.map +1 -0
  9. package/dist/cli/budget/resourceLedger.js +61 -0
  10. package/dist/cli/budget/resourceLedger.js.map +1 -0
  11. package/dist/cli/budget/resourceSnapshot.js +43 -0
  12. package/dist/cli/budget/resourceSnapshot.js.map +1 -0
  13. package/dist/cli/budget/tokenBudget.js +47 -13
  14. package/dist/cli/budget/tokenBudget.js.map +1 -1
  15. package/dist/cli/compaction.js +5 -0
  16. package/dist/cli/compaction.js.map +1 -1
  17. package/dist/cli/gauntlet/policy.js +9 -0
  18. package/dist/cli/gauntlet/policy.js.map +1 -1
  19. package/dist/cli/harnessManifest.js +62 -0
  20. package/dist/cli/harnessManifest.js.map +1 -0
  21. package/dist/cli/headlessSpine.js +18 -2
  22. package/dist/cli/headlessSpine.js.map +1 -1
  23. package/dist/cli/hooks/historyCompaction.js +56 -8
  24. package/dist/cli/hooks/historyCompaction.js.map +1 -1
  25. package/dist/cli/hooks/useChatTurn.js +56 -68
  26. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  27. package/dist/cli/kraken/taskContract.js +44 -0
  28. package/dist/cli/kraken/taskContract.js.map +1 -0
  29. package/dist/cli/main.bundled.js +3002 -1214
  30. package/dist/cli/main.bundled.js.map +4 -4
  31. package/dist/cli/metrics.js +16 -0
  32. package/dist/cli/metrics.js.map +1 -1
  33. package/dist/cli/runHeadless.js +96 -10
  34. package/dist/cli/runHeadless.js.map +1 -1
  35. package/dist/cli/sessionSpine.js +183 -11
  36. package/dist/cli/sessionSpine.js.map +1 -1
  37. 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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"}
@@ -10,16 +10,30 @@ export function extractiveHistorySummary(dropped, opts) {
10
10
  return 'No prior turns.';
11
11
  const userGoals = [];
12
12
  const assistantNotes = [];
13
+ const userConstraints = [];
14
+ const unresolved = [];
15
+ const verification = [];
16
+ const decisions = [];
13
17
  const tools = new Map();
14
18
  const files = new Set();
15
19
  let toolResults = 0;
16
20
  for (const m of dropped) {
17
21
  if (m.role === 'user' && m.content.trim()) {
18
- userGoals.push(oneLine(m.content, 220));
22
+ const goal = oneLine(m.content, 220);
23
+ userGoals.push(goal);
24
+ if (/\b(must|never|required|only|do not|constraint|vincolo|deve|senza)\b/i.test(goal))
25
+ userConstraints.push(goal);
19
26
  }
20
27
  else if (m.role === 'assistant') {
21
28
  if (m.content.trim()) {
22
- assistantNotes.push(oneLine(m.content, 180));
29
+ const note = oneLine(m.content, 220);
30
+ assistantNotes.push(note);
31
+ if (/\b(fail|failed|error|unresolved|remaining|todo|blocked|gap|errore|fallit|irrisolt|manca)\b/i.test(note))
32
+ unresolved.push(note);
33
+ if (/\b(test|typecheck|build|verify|verification|passed|failed|green|red)\b/i.test(note))
34
+ verification.push(note);
35
+ if (/\b(decid|decision|chosen|choose|scelt|adopt|implement)\b/i.test(note))
36
+ decisions.push(note);
23
37
  }
24
38
  if (m.toolCalls) {
25
39
  for (const tc of m.toolCalls) {
@@ -31,6 +45,10 @@ export function extractiveHistorySummary(dropped, opts) {
31
45
  else if (m.role === 'tool') {
32
46
  toolResults += 1;
33
47
  collectPathsFromText(m.content, files);
48
+ if (/\b(fail|failed|error|exception|blocked|errore|fallit)\b/i.test(m.content))
49
+ unresolved.push(oneLine(m.content, 220));
50
+ if (/\b(test|typecheck|build|verify|passed|failed|success)\b/i.test(m.content))
51
+ verification.push(oneLine(m.content, 220));
34
52
  }
35
53
  }
36
54
  const parts = [
@@ -42,6 +60,26 @@ export function extractiveHistorySummary(dropped, opts) {
42
60
  for (const g of userGoals.slice(-6))
43
61
  parts.push(`- ${g}`);
44
62
  }
63
+ if (userConstraints.length) {
64
+ parts.push('## User constraints (preserve exactly)');
65
+ for (const item of [...new Set(userConstraints)].slice(-8))
66
+ parts.push(`- ${item}`);
67
+ }
68
+ if (unresolved.length) {
69
+ parts.push('## Unresolved failures / pending repair');
70
+ for (const item of [...new Set(unresolved)].slice(-8))
71
+ parts.push(`- ${item}`);
72
+ }
73
+ if (verification.length) {
74
+ parts.push('## Latest verification state');
75
+ for (const item of [...new Set(verification)].slice(-6))
76
+ parts.push(`- ${item}`);
77
+ }
78
+ if (decisions.length) {
79
+ parts.push('## Recent active decisions');
80
+ for (const item of [...new Set(decisions)].slice(-6))
81
+ parts.push(`- ${item}`);
82
+ }
45
83
  if (assistantNotes.length) {
46
84
  parts.push('## Assistant conclusions (truncated)');
47
85
  for (const a of assistantNotes.slice(-5))
@@ -1 +1 @@
1
- {"version":3,"file":"historySummary.js","sourceRoot":"","sources":["../../../src/cli/budget/historySummary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"historySummary.js","sourceRoot":"","sources":["../../../src/cli/budget/historySummary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { applyBudgetPolicyAsync, estimateHistoryTokens, } from './tokenBudget.js';
2
+ import { measureRequest } from './requestMeter.js';
3
+ import { compactEventPayload, } from './persistCompact.js';
4
+ import { derivedModelSeed } from '../headlessSpine.js';
5
+ import { formatResourceSnapshot } from '@zelari/core/session';
6
+ function messageWasRecompacted(message, history) {
7
+ if (message.compactedFromSeq === undefined)
8
+ return false;
9
+ return !history.some((candidate) => candidate.seq !== undefined && candidate.seq === message.seq);
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
+ }
15
+ async function sessionHistory(session) {
16
+ if (!session || session.status !== 'active')
17
+ return null;
18
+ const derived = await session.derivedPriorTurns();
19
+ if (!derived || derived.length === 0)
20
+ return null;
21
+ return derivedModelSeed(derived);
22
+ }
23
+ /**
24
+ * Build the model-visible conversation once for every host.
25
+ *
26
+ * Call before logging the current user message, so a post-compaction
27
+ * re-derive contains prior turns only and no host-specific stripping is
28
+ * required.
29
+ */
30
+ export async function buildModelContext(input) {
31
+ const derived = await sessionHistory(input.session);
32
+ const source = derived ? 'session' : 'fallback';
33
+ const sourceHistory = derived ?? [...input.fallbackHistory];
34
+ const inputTokens = estimateHistoryTokens(sourceHistory);
35
+ const requestSurface = input.systemMessages || input.tools
36
+ ? {
37
+ provider: input.provider ?? 'local',
38
+ model: input.model ?? 'unknown',
39
+ systemMessages: input.systemMessages ?? [],
40
+ tools: input.tools ?? [],
41
+ }
42
+ : null;
43
+ let budget = await applyBudgetPolicyAsync(sourceHistory, input.phase, {
44
+ model: input.model,
45
+ sessionTokens: input.sessionTokens,
46
+ sessionId: input.sessionId,
47
+ signal: input.signal,
48
+ requestSnapshot: input.requestSnapshot,
49
+ requestSurface,
50
+ providerStream: input.providerStream,
51
+ });
52
+ let history = budget.history;
53
+ let compactionPayload;
54
+ let durableCompaction = false;
55
+ let reconstructedFromSession = false;
56
+ let compactionMetrics;
57
+ if ((budget.messagesRemoved ?? 0) > 0) {
58
+ const ranged = budget.compactedFromSeq !== undefined &&
59
+ budget.compactedToSeq !== undefined;
60
+ const stateSnapshot = ranged && input.session?.compactionStateSnapshot
61
+ ? await input.session.compactionStateSnapshot(budget.compactedToSeq)
62
+ : null;
63
+ const outputTokens = estimateHistoryTokens(budget.history);
64
+ const telemetry = {
65
+ inputTokens,
66
+ outputTokens,
67
+ savedTokens: Math.max(0, inputTokens - outputTokens),
68
+ recompactionRate: sourceHistory.some((message) => messageWasRecompacted(message, budget.history)) ? 1 : 0,
69
+ summaryStrategy: budget.compactStrategy ?? 'extractive',
70
+ ...(budget.compactStrategy === 'llm' && input.provider
71
+ ? { provider: input.provider }
72
+ : {}),
73
+ ...(budget.compactStrategy === 'llm' && input.model ? { model: input.model } : {}),
74
+ };
75
+ compactionPayload = compactEventPayload(budget, stateSnapshot, telemetry);
76
+ if (input.persistCompaction) {
77
+ await input.persistCompaction(compactionPayload, budget);
78
+ await input.session?.flush?.();
79
+ if (ranged && input.session?.status === 'active') {
80
+ const replayed = await sessionHistory(input.session);
81
+ if (replayed) {
82
+ history = replayed;
83
+ durableCompaction = true;
84
+ reconstructedFromSession = true;
85
+ }
86
+ }
87
+ }
88
+ compactionMetrics = {
89
+ count: 1,
90
+ ...telemetry,
91
+ restoreFailures: ranged && input.persistCompaction && !reconstructedFromSession ? 1 : 0,
92
+ };
93
+ input.onCompactionMetric?.(compactionMetrics);
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
+ }
101
+ if (requestSurface) {
102
+ const measured = measureRequest({
103
+ systemMessages: requestSurface.systemMessages,
104
+ tools: requestSurface.tools,
105
+ conversation: history,
106
+ anchor: input.requestSnapshot,
107
+ contextLimit: budget.contextLimit,
108
+ reservedOutputTokens: 8_192,
109
+ });
110
+ budget = {
111
+ ...budget,
112
+ history,
113
+ estimatedHistoryTokens: estimateHistoryTokens(history),
114
+ occupancy: measured.occupancy,
115
+ contextPressureTokens: measured.contextPressureTokens,
116
+ };
117
+ }
118
+ else {
119
+ const estimated = estimateHistoryTokens(history);
120
+ budget = {
121
+ ...budget,
122
+ history,
123
+ estimatedHistoryTokens: estimated,
124
+ occupancy: Math.min(1, estimated / budget.contextLimit),
125
+ };
126
+ }
127
+ return {
128
+ history,
129
+ budget,
130
+ source,
131
+ ...(compactionPayload ? { compactionPayload } : {}),
132
+ ...(compactionMetrics ? { compactionMetrics } : {}),
133
+ durableCompaction,
134
+ reconstructedFromSession,
135
+ };
136
+ }
137
+ //# sourceMappingURL=modelContextBuilder.js.map
@@ -0,0 +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;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAO9D,SAAS,qBAAqB,CAAC,OAAqB,EAAE,OAAgC;IACpF,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AACpG,CAAC;AAED,gFAAgF;AAChF,SAAS,qBAAqB,CAAC,OAAe;IAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,CAAC,OAAkC,CAAC,EAAE,CAAC;AACjG,CAAC;AA6CD,KAAK,UAAU,cAAc,CAC3B,OAA+C;IAE/C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAClD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA+B;IAE/B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,SAAkB,CAAC,CAAC,CAAC,UAAmB,CAAC;IAClE,MAAM,aAAa,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,cAAc,GAClB,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK;QACjC,CAAC,CAAC;YACE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO;YACnC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,SAAS;YAC/B,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE;YAC1C,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;SACzB;QACH,CAAC,CAAC,IAAI,CAAC;IAEX,IAAI,MAAM,GAAG,MAAM,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE;QACpE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,cAAc;QACd,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CAAC,CAAC;IACH,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7B,IAAI,iBAAuD,CAAC;IAC5D,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,wBAAwB,GAAG,KAAK,CAAC;IACrC,IAAI,iBAAgD,CAAC;IAErD,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GACV,MAAM,CAAC,gBAAgB,KAAK,SAAS;YACrC,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC;QACtC,MAAM,aAAa,GACjB,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,uBAAuB;YAC9C,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,cAAe,CAAC;YACrE,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAwB;YACrC,WAAW;YACX,YAAY;YACZ,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;YACpD,gBAAgB,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC/C,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAC/C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACT,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,YAAY;YACvD,GAAG,CAAC,MAAM,CAAC,eAAe,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ;gBACpD,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;gBAC9B,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,eAAe,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAC;QACF,iBAAiB,GAAG,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/B,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrD,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,GAAG,QAAQ,CAAC;oBACnB,iBAAiB,GAAG,IAAI,CAAC;oBACzB,wBAAwB,GAAG,IAAI,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QACD,iBAAiB,GAAG;YAClB,KAAK,EAAE,CAAC;YACR,GAAG,SAAS;YACZ,eAAe,EACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzE,CAAC;QACF,KAAK,CAAC,kBAAkB,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAChD,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,yEAAyE;IACzE,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,cAAc,CAAC;YAC9B,cAAc,EAAE,cAAc,CAAC,cAAc;YAC7C,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,YAAY,EAAE,OAAO;YACrB,MAAM,EAAE,KAAK,CAAC,eAAe;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,oBAAoB,EAAE,KAAK;SAC5B,CAAC,CAAC;QACH,MAAM,GAAG;YACP,GAAG,MAAM;YACT,OAAO;YACP,sBAAsB,EAAE,qBAAqB,CAAC,OAAO,CAAC;YACtD,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB;SACtD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG;YACP,GAAG,MAAM;YACT,OAAO;YACP,sBAAsB,EAAE,SAAS;YACjC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;SACxD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO;QACP,MAAM;QACN,MAAM;QACN,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,iBAAiB;QACjB,wBAAwB;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Persist a durable session.compacted range and optionally re-seed the
3
+ * model history from the spine (compact the projection, never only RAM).
4
+ */
5
+ import { createBrainEvent } from '@zelari/core';
6
+ import { formatCompactionStateSnapshot, } from '@zelari/core/session';
7
+ import { derivedModelSeed } from '../headlessSpine.js';
8
+ export function compactEventPayload(budget, stateSnapshot, telemetry) {
9
+ const summary = budget.compactSummary ?? '';
10
+ const first = budget.history[0];
11
+ const narrative = first?.role === 'user' && first.content.includes('<compacted-summary>')
12
+ ? first.content
13
+ : summary;
14
+ const checkpointContent = stateSnapshot
15
+ ? formatCompactionStateSnapshot(stateSnapshot) + '\n\n' + narrative
16
+ : narrative;
17
+ const ranged = budget.compactedFromSeq !== undefined && budget.compactedToSeq !== undefined;
18
+ return {
19
+ summary,
20
+ messagesRemoved: budget.messagesRemoved ?? 0,
21
+ ...(telemetry ? { ...telemetry } : {}),
22
+ ...(ranged
23
+ ? {
24
+ fromSeq: budget.compactedFromSeq,
25
+ toSeq: budget.compactedToSeq,
26
+ checkpoint: { role: 'user', content: checkpointContent },
27
+ ...(budget.compactStrategy ? { strategy: budget.compactStrategy } : {}),
28
+ ...(budget.compactSourceSeqs && budget.compactSourceSeqs.length > 0
29
+ ? { sourceEventSeqs: budget.compactSourceSeqs }
30
+ : {}),
31
+ ...(stateSnapshot
32
+ ? {
33
+ retainedCriterionIds: stateSnapshot.activeCriteria
34
+ .filter((criterion) => criterion.required)
35
+ .map((criterion) => criterion.id),
36
+ retainedEvidenceRefs: stateSnapshot.retainedEvidenceRefs,
37
+ retainedState: {
38
+ unresolvedIssueIds: stateSnapshot.unresolvedIssues.map((issue) => issue.id),
39
+ affectedFiles: stateSnapshot.affectedFiles,
40
+ ...(stateSnapshot.missionState?.phase
41
+ ? { missionStateRef: 'phase:' + stateSnapshot.missionState.phase }
42
+ : {}),
43
+ },
44
+ stateSnapshot,
45
+ }
46
+ : {}),
47
+ }
48
+ : {}),
49
+ };
50
+ }
51
+ export function createSessionCompactedEvent(sessionId, budget) {
52
+ return createBrainEvent('session_compacted', sessionId, compactEventPayload(budget));
53
+ }
54
+ export async function reseedAfterDurableCompact(spine, currentUserText) {
55
+ if (!spine || spine.status !== 'active')
56
+ return null;
57
+ const derived = await spine.derivedPriorTurns();
58
+ if (!derived || derived.length === 0)
59
+ return null;
60
+ let seed = derivedModelSeed(derived);
61
+ const last = seed[seed.length - 1];
62
+ if (last?.role === 'user' && last.content === currentUserText) {
63
+ seed = seed.slice(0, -1);
64
+ }
65
+ return seed;
66
+ }
67
+ //# sourceMappingURL=persistCompact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistCompact.js","sourceRoot":"","sources":["../../../src/cli/budget/persistCompact.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"}