zelari-code 1.48.1 → 2.0.0-alpha.2

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 (77) hide show
  1. package/dist/cli/app.js +4 -1
  2. package/dist/cli/app.js.map +1 -1
  3. package/dist/cli/desktopConfig.js +51 -4
  4. package/dist/cli/desktopConfig.js.map +1 -1
  5. package/dist/cli/headless.js +65 -0
  6. package/dist/cli/headless.js.map +1 -1
  7. package/dist/cli/headlessSpine.js +102 -0
  8. package/dist/cli/headlessSpine.js.map +1 -0
  9. package/dist/cli/headlessSpine.test.js +153 -0
  10. package/dist/cli/headlessSpine.test.js.map +1 -0
  11. package/dist/cli/hooks/useChatTurn.js +85 -0
  12. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  13. package/dist/cli/hooks/useSession.js +16 -2
  14. package/dist/cli/hooks/useSession.js.map +1 -1
  15. package/dist/cli/kraken/candidateRegistry.js +195 -0
  16. package/dist/cli/kraken/candidateRegistry.js.map +1 -0
  17. package/dist/cli/kraken/candidateRegistry.test.js +211 -0
  18. package/dist/cli/kraken/candidateRegistry.test.js.map +1 -0
  19. package/dist/cli/kraken/completionGate.js +116 -0
  20. package/dist/cli/kraken/completionGate.js.map +1 -0
  21. package/dist/cli/kraken/completionGate.test.js +172 -0
  22. package/dist/cli/kraken/completionGate.test.js.map +1 -0
  23. package/dist/cli/kraken/metrics.js +96 -0
  24. package/dist/cli/kraken/metrics.js.map +1 -0
  25. package/dist/cli/kraken/metrics.test.js +145 -0
  26. package/dist/cli/kraken/metrics.test.js.map +1 -0
  27. package/dist/cli/kraken/selectionPlaybook.js +23 -0
  28. package/dist/cli/kraken/selectionPlaybook.js.map +1 -0
  29. package/dist/cli/kraken/selectionPlaybook.test.js +55 -0
  30. package/dist/cli/kraken/selectionPlaybook.test.js.map +1 -0
  31. package/dist/cli/kraken/turnRuntime.js +207 -0
  32. package/dist/cli/kraken/turnRuntime.js.map +1 -0
  33. package/dist/cli/kraken/turnRuntime.test.js +377 -0
  34. package/dist/cli/kraken/turnRuntime.test.js.map +1 -0
  35. package/dist/cli/kraken/verificationBridge.js +153 -0
  36. package/dist/cli/kraken/verificationBridge.js.map +1 -0
  37. package/dist/cli/kraken/verificationBridge.test.js +131 -0
  38. package/dist/cli/kraken/verificationBridge.test.js.map +1 -0
  39. package/dist/cli/kraken/verifier.js +233 -0
  40. package/dist/cli/kraken/verifier.js.map +1 -0
  41. package/dist/cli/kraken/verifier.test.js +232 -0
  42. package/dist/cli/kraken/verifier.test.js.map +1 -0
  43. package/dist/cli/kraken/verifierSettings.test.js +237 -0
  44. package/dist/cli/kraken/verifierSettings.test.js.map +1 -0
  45. package/dist/cli/kraken/verifyReport.js +115 -0
  46. package/dist/cli/kraken/verifyReport.js.map +1 -0
  47. package/dist/cli/kraken/verifyReport.test.js +111 -0
  48. package/dist/cli/kraken/verifyReport.test.js.map +1 -0
  49. package/dist/cli/main.bundled.js +4676 -943
  50. package/dist/cli/main.bundled.js.map +4 -4
  51. package/dist/cli/main.js +29 -0
  52. package/dist/cli/main.js.map +1 -1
  53. package/dist/cli/providerConfig.js +46 -0
  54. package/dist/cli/providerConfig.js.map +1 -1
  55. package/dist/cli/runHeadless.js +198 -4
  56. package/dist/cli/runHeadless.js.map +1 -1
  57. package/dist/cli/sessionSpine.js +272 -0
  58. package/dist/cli/sessionSpine.js.map +1 -0
  59. package/dist/cli/sessionSpine.test.js +171 -0
  60. package/dist/cli/sessionSpine.test.js.map +1 -0
  61. package/dist/cli/toolRegistry.js +50 -6
  62. package/dist/cli/toolRegistry.js.map +1 -1
  63. package/dist/cli/tools/krakenSelectTool.js +165 -0
  64. package/dist/cli/tools/krakenSelectTool.js.map +1 -0
  65. package/dist/cli/tools/krakenSelectTool.test.js +246 -0
  66. package/dist/cli/tools/krakenSelectTool.test.js.map +1 -0
  67. package/dist/cli/tools/taskTool.dynamicChecks.test.js +156 -0
  68. package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +1 -0
  69. package/dist/cli/tools/taskTool.js +174 -6
  70. package/dist/cli/tools/taskTool.js.map +1 -1
  71. package/dist/cli/tools/taskTool.planSafety.test.js +280 -0
  72. package/dist/cli/tools/taskTool.planSafety.test.js.map +1 -0
  73. package/dist/cli/tools/taskTool.verifyReport.test.js +140 -0
  74. package/dist/cli/tools/taskTool.verifyReport.test.js.map +1 -0
  75. package/dist/cli/zelariMission.js +18 -8
  76. package/dist/cli/zelariMission.js.map +1 -1
  77. package/package.json +3 -2
@@ -0,0 +1,207 @@
1
+ /**
2
+ * KrakenTurnRuntime — per-turn, in-memory progress projection for standard
3
+ * Kraken (Fase 2, ADR-0020).
4
+ *
5
+ * Derives a user-facing phase (understanding → exploring → implementing |
6
+ * planning → verifying → completed) from the parent turn's BrainEvent stream
7
+ * by PROJECTION (tool activity), without asking the model to self-report.
8
+ * In-memory only: no persistence, no cross-turn state (ADR-0020 non-goal v1 —
9
+ * durable run state is explicitly deferred).
10
+ *
11
+ * Phase rules (deterministic):
12
+ * - turn start → understanding
13
+ * - task(explore) start → exploring
14
+ * - kraken_select start → selecting (Fase 4)
15
+ * - task(verify) start → verifying
16
+ * - task(verify) end → checksPassed refresh (Fase 7)
17
+ * - beginPass(true) repair pass → repairing (Fase 8)
18
+ * - successful write/edit/apply_diff → implementing (build; in plan these
19
+ * tools are not registered, so the transition cannot fire there)
20
+ * - last in-flight tentacle ends → planning (plan) | implementing when
21
+ * writes>0 (build)
22
+ * - finish('completed') → completed
23
+ *
24
+ * Emits `kraken_progress` ONLY on phase change — counters ride the payload of
25
+ * the last event, so the NDJSON stream stays sparse (Desktop ignores unknown
26
+ * event types by design, which keeps this contract additive).
27
+ */
28
+ import { createBrainEvent, } from '@zelari/core/events';
29
+ const WRITE_TOOLS = new Set([
30
+ 'write_file',
31
+ 'edit_file',
32
+ 'apply_diff',
33
+ ]);
34
+ export class KrakenTurnRuntime {
35
+ mode;
36
+ sessionId;
37
+ onProgress;
38
+ now;
39
+ loadCheckTotal;
40
+ loadChecksPassed;
41
+ phase = 'understanding';
42
+ phaseEnteredAt;
43
+ tentacles = 0;
44
+ exploreTentacles = 0;
45
+ verifyTentacles = 0;
46
+ writes = 0;
47
+ inFlightTentacles = 0;
48
+ /** Required checks registered via kraken_select (Fase 6). */
49
+ checkTotal;
50
+ /** Required checks explicitly PASSED (Fase 7; undefined until first report). */
51
+ checksPassed;
52
+ /** toolCallId → toolName (end events omit the name). */
53
+ pendingTools = new Map();
54
+ /** toolCallIds of VERIFY tentacles (Fase 7 refresh trigger). */
55
+ pendingVerifyIds = new Set();
56
+ started = false;
57
+ constructor(opts) {
58
+ this.mode = opts.mode;
59
+ this.sessionId = opts.sessionId;
60
+ this.onProgress = opts.onProgress;
61
+ this.now = opts.now ?? Date.now;
62
+ this.loadCheckTotal = opts.loadCheckTotal;
63
+ this.loadChecksPassed = opts.loadChecksPassed;
64
+ this.phaseEnteredAt = this.now();
65
+ }
66
+ /** Start the turn: emits the initial `understanding` event. */
67
+ beginTurn() {
68
+ this.started = true;
69
+ this.emit();
70
+ }
71
+ /**
72
+ * Reset the phase machine for a recovery pass of the SAME turn (headless
73
+ * BUILD write-retry). Counters are kept — they describe the whole turn.
74
+ *
75
+ * Fase 8 (ADR-0020): `beginPass(true)` marks an automatic REPAIR pass
76
+ * (completion gate) and projects `repairing` instead of restarting at
77
+ * `understanding`, so the UI shows the fix loop rather than a fresh turn.
78
+ */
79
+ beginPass(repair = false) {
80
+ this.transition(repair ? 'repairing' : 'understanding');
81
+ }
82
+ /**
83
+ * Terminal transition. `completed` is only projected on a clean finish —
84
+ * cancellations and errors are already carried by the `agent_end` event.
85
+ */
86
+ finish(reason) {
87
+ if (reason === 'completed')
88
+ this.transition('completed');
89
+ }
90
+ /** Feed one parent-turn BrainEvent. Never throws. */
91
+ observe(event) {
92
+ try {
93
+ if (event.type === 'tool_execution_start') {
94
+ if (event.toolCallId && event.toolName) {
95
+ this.pendingTools.set(event.toolCallId, event.toolName);
96
+ }
97
+ if (event.toolName === 'kraken_select') {
98
+ // Fase 4 (ADR-0020): the parent is comparing candidates.
99
+ this.transition('selecting');
100
+ return;
101
+ }
102
+ if (event.toolName === 'task') {
103
+ this.tentacles++;
104
+ this.inFlightTentacles++;
105
+ const agent = typeof event.args?.agent === 'string' ? event.args.agent : 'explore';
106
+ if (agent === 'verify') {
107
+ this.verifyTentacles++;
108
+ if (event.toolCallId)
109
+ this.pendingVerifyIds.add(event.toolCallId);
110
+ }
111
+ else
112
+ this.exploreTentacles++;
113
+ this.transition(agent === 'verify' ? 'verifying' : 'exploring');
114
+ }
115
+ return;
116
+ }
117
+ if (event.type === 'tool_execution_end') {
118
+ const name = this.pendingTools.get(event.toolCallId);
119
+ this.pendingTools.delete(event.toolCallId);
120
+ if (name === 'task') {
121
+ const wasVerify = event.toolCallId
122
+ ? this.pendingVerifyIds.delete(event.toolCallId)
123
+ : false;
124
+ this.inFlightTentacles = Math.max(0, this.inFlightTentacles - 1);
125
+ // Fase 7 (ADR-0020): when a VERIFY tentacle ends, refresh the
126
+ // passed-check counter. Silent update first, so a phase transition
127
+ // below carries the new counters in ONE event (sparse stream);
128
+ // emit explicitly only when no transition fires.
129
+ let checksChanged = false;
130
+ if (wasVerify && this.loadChecksPassed) {
131
+ const passed = this.loadChecksPassed();
132
+ if (passed !== undefined && passed !== this.checksPassed) {
133
+ this.checksPassed = passed;
134
+ checksChanged = true;
135
+ }
136
+ }
137
+ if (this.inFlightTentacles === 0) {
138
+ if (this.mode === 'plan')
139
+ this.transition('planning');
140
+ else if (this.writes > 0)
141
+ this.transition('implementing');
142
+ else if (checksChanged)
143
+ this.emit();
144
+ }
145
+ else if (checksChanged) {
146
+ this.emit();
147
+ }
148
+ return;
149
+ }
150
+ if (name === 'kraken_select') {
151
+ // Fase 6 (ADR-0020): register the selection's required checks as
152
+ // the turn's check counter. Same-phase refresh — the counters ride
153
+ // the payload of the (re)emitted event, keeping the stream sparse.
154
+ const total = this.loadCheckTotal?.() ?? 0;
155
+ if (total > 0 && total !== this.checkTotal) {
156
+ this.checkTotal = total;
157
+ this.emit();
158
+ }
159
+ return;
160
+ }
161
+ if (name && WRITE_TOOLS.has(name) && !event.isError) {
162
+ this.writes++;
163
+ if (this.mode === 'build')
164
+ this.transition('implementing');
165
+ }
166
+ return;
167
+ }
168
+ }
169
+ catch {
170
+ // Progress projection must never break the turn.
171
+ }
172
+ }
173
+ /** Current progress payload (counters + phase). */
174
+ snapshot() {
175
+ return {
176
+ phase: this.phase,
177
+ mode: this.mode,
178
+ tentacles: this.tentacles,
179
+ exploreTentacles: this.exploreTentacles,
180
+ verifyTentacles: this.verifyTentacles,
181
+ writes: this.writes,
182
+ phaseEnteredAt: this.phaseEnteredAt,
183
+ ...(this.checkTotal !== undefined ? { checkTotal: this.checkTotal } : {}),
184
+ ...(this.checksPassed !== undefined ? { checksPassed: this.checksPassed } : {}),
185
+ };
186
+ }
187
+ transition(next) {
188
+ if (this.phase === next)
189
+ return;
190
+ this.phase = next;
191
+ this.phaseEnteredAt = this.now();
192
+ this.emit();
193
+ }
194
+ emit() {
195
+ if (!this.started)
196
+ return;
197
+ try {
198
+ this.onProgress(createBrainEvent('kraken_progress', this.sessionId, {
199
+ progress: this.snapshot(),
200
+ }));
201
+ }
202
+ catch {
203
+ // A broken sink must never break the turn.
204
+ }
205
+ }
206
+ }
207
+ //# sourceMappingURL=turnRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnRuntime.js","sourceRoot":"","sources":["../../../src/cli/kraken/turnRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,377 @@
1
+ /**
2
+ * turnRuntime.test — KrakenTurnRuntime phase projection (Fase 2, ADR-0020).
3
+ *
4
+ * Covers the deterministic derivation:
5
+ * understanding → exploring → implementing|planning → verifying → completed
6
+ * and the sparse emission contract (only on phase change).
7
+ */
8
+ import { describe, expect, it } from 'vitest';
9
+ import { createBrainEvent } from '@zelari/core/events';
10
+ import { KrakenTurnRuntime } from './turnRuntime.js';
11
+ function harness(mode, extra = {}) {
12
+ const events = [];
13
+ let t = 1_000;
14
+ const rt = new KrakenTurnRuntime({
15
+ mode,
16
+ sessionId: 'test-session',
17
+ onProgress: (ev) => events.push(ev),
18
+ now: () => t++,
19
+ ...extra,
20
+ });
21
+ return {
22
+ rt,
23
+ events,
24
+ phases: () => events.map((e) => e.progress.phase),
25
+ toolStart: (toolName, toolCallId, args = {}) => rt.observe(createBrainEvent('tool_execution_start', 'test-session', {
26
+ toolCallId,
27
+ toolName,
28
+ args,
29
+ })),
30
+ toolEnd: (toolCallId, isError = false) => rt.observe(createBrainEvent('tool_execution_end', 'test-session', {
31
+ toolCallId,
32
+ result: '',
33
+ isError,
34
+ durationMs: 5,
35
+ })),
36
+ };
37
+ }
38
+ describe('KrakenTurnRuntime — build mode', () => {
39
+ it('emits understanding at beginTurn and derives exploring on first task', () => {
40
+ const h = harness('build');
41
+ h.rt.beginTurn();
42
+ h.toolStart('task', 't1', { agent: 'explore' });
43
+ expect(h.phases()).toEqual(['understanding', 'exploring']);
44
+ expect(h.events.at(-1)?.progress.exploreTentacles).toBe(1);
45
+ expect(h.events.at(-1)?.progress.tentacles).toBe(1);
46
+ });
47
+ it('write success transitions to implementing (end carries the tool name)', () => {
48
+ const h = harness('build');
49
+ h.rt.beginTurn();
50
+ h.toolStart('write_file', 'w1', { path: 'a.ts' });
51
+ h.toolEnd('w1');
52
+ expect(h.phases()).toEqual(['understanding', 'implementing']);
53
+ expect(h.rt.snapshot().writes).toBe(1);
54
+ });
55
+ it('verify tentacle transitions to verifying, then back to implementing after writes', () => {
56
+ const h = harness('build');
57
+ h.rt.beginTurn();
58
+ h.toolStart('write_file', 'w1', { path: 'a.ts' });
59
+ h.toolEnd('w1');
60
+ h.toolStart('task', 't1', { agent: 'verify' });
61
+ expect(h.phases()).toEqual(['understanding', 'implementing', 'verifying']);
62
+ h.toolEnd('t1');
63
+ // writes > 0 → back to implementing when the last tentacle lands
64
+ expect(h.phases()).toEqual([
65
+ 'understanding',
66
+ 'implementing',
67
+ 'verifying',
68
+ 'implementing',
69
+ ]);
70
+ expect(h.rt.snapshot().verifyTentacles).toBe(1);
71
+ });
72
+ it('finish(completed) projects completed; cancelled/error do not', () => {
73
+ const h = harness('build');
74
+ h.rt.beginTurn();
75
+ h.rt.finish('cancelled');
76
+ expect(h.phases()).toEqual(['understanding']);
77
+ h.rt.finish('completed');
78
+ expect(h.phases()).toEqual(['understanding', 'completed']);
79
+ });
80
+ it('emits ONLY on phase change (sparse contract)', () => {
81
+ const h = harness('build');
82
+ h.rt.beginTurn();
83
+ h.toolStart('write_file', 'w1', { path: 'a.ts' });
84
+ h.toolEnd('w1');
85
+ h.toolStart('write_file', 'w2', { path: 'b.ts' });
86
+ h.toolEnd('w2');
87
+ h.toolStart('read_file', 'r1', { path: 'c.ts' });
88
+ h.toolEnd('r1');
89
+ // second write and reads do not re-emit: still 2 events
90
+ expect(h.phases()).toEqual(['understanding', 'implementing']);
91
+ // but counters ride the snapshot
92
+ expect(h.rt.snapshot().writes).toBe(2);
93
+ });
94
+ it('a failed write does not count and does not transition', () => {
95
+ const h = harness('build');
96
+ h.rt.beginTurn();
97
+ h.toolStart('write_file', 'w1', { path: 'a.ts' });
98
+ h.toolEnd('w1', true);
99
+ expect(h.phases()).toEqual(['understanding']);
100
+ expect(h.rt.snapshot().writes).toBe(0);
101
+ });
102
+ });
103
+ describe('KrakenTurnRuntime — plan mode', () => {
104
+ it('after the last explore tentacle lands, planning is projected', () => {
105
+ const h = harness('plan');
106
+ h.rt.beginTurn();
107
+ h.toolStart('task', 't1', { agent: 'explore' });
108
+ h.toolStart('task', 't2', { agent: 'explore' });
109
+ h.toolEnd('t1');
110
+ expect(h.phases()).toEqual(['understanding', 'exploring']);
111
+ h.toolEnd('t2');
112
+ expect(h.phases()).toEqual(['understanding', 'exploring', 'planning']);
113
+ });
114
+ it('a verify tentacle in plan still projects verifying (recovery-research)', () => {
115
+ const h = harness('plan');
116
+ h.rt.beginTurn();
117
+ h.toolStart('task', 't1', { agent: 'verify' });
118
+ expect(h.phases()).toEqual(['understanding', 'verifying']);
119
+ h.toolEnd('t1');
120
+ expect(h.phases()).toEqual(['understanding', 'verifying', 'planning']);
121
+ });
122
+ it('events carry mode: plan and the phaseEnteredAt clock', () => {
123
+ const h = harness('plan');
124
+ h.rt.beginTurn();
125
+ expect(h.events[0].progress.mode).toBe('plan');
126
+ expect(h.events[0].progress.phaseEnteredAt).toBeGreaterThanOrEqual(1_000);
127
+ });
128
+ });
129
+ describe('KrakenTurnRuntime — robustness', () => {
130
+ it('unknown events are ignored without emission', () => {
131
+ const h = harness('build');
132
+ h.rt.beginTurn();
133
+ h.rt.observe(createBrainEvent('message_delta', 'test-session', { messageId: 'm1', delta: 'x' }));
134
+ h.rt.observe(createBrainEvent('queue_update', 'test-session', { queuedCount: 1 }));
135
+ expect(h.phases()).toEqual(['understanding']);
136
+ });
137
+ it('a throwing sink never breaks observe', () => {
138
+ const rt = new KrakenTurnRuntime({
139
+ mode: 'build',
140
+ sessionId: 's',
141
+ onProgress: () => {
142
+ throw new Error('sink down');
143
+ },
144
+ });
145
+ expect(() => {
146
+ rt.beginTurn();
147
+ rt.observe(createBrainEvent('tool_execution_start', 's', {
148
+ toolCallId: 't1',
149
+ toolName: 'task',
150
+ args: { agent: 'explore' },
151
+ }));
152
+ }).not.toThrow();
153
+ expect(rt.snapshot().phase).toBe('exploring');
154
+ });
155
+ it('beginPass resets the phase for a recovery pass but keeps counters', () => {
156
+ const h = harness('build');
157
+ h.rt.beginTurn();
158
+ h.toolStart('task', 't1', { agent: 'explore' });
159
+ h.toolEnd('t1');
160
+ h.rt.beginPass();
161
+ expect(h.phases()).toEqual(['understanding', 'exploring', 'understanding']);
162
+ expect(h.rt.snapshot().tentacles).toBe(1);
163
+ });
164
+ it('task end events without a matching start are tolerated', () => {
165
+ const h = harness('build');
166
+ h.rt.beginTurn();
167
+ h.toolEnd('ghost');
168
+ expect(h.phases()).toEqual(['understanding']);
169
+ expect(h.rt.snapshot().tentacles).toBe(0);
170
+ });
171
+ });
172
+ describe('selecting phase (ADR-0020 Fase 4)', () => {
173
+ it('kraken_select start → selecting; later task(verify) still wins → verifying', () => {
174
+ const events = [];
175
+ const rt = new KrakenTurnRuntime({
176
+ mode: 'build',
177
+ sessionId: 's-select',
178
+ onProgress: (e) => events.push(e),
179
+ now: () => 1000,
180
+ });
181
+ rt.beginTurn();
182
+ rt.observe({
183
+ type: 'tool_execution_start',
184
+ toolCallId: 'c1',
185
+ toolName: 'kraken_select',
186
+ args: {},
187
+ });
188
+ expect(rt.snapshot().phase).toBe('selecting');
189
+ rt.observe({
190
+ type: 'tool_execution_start',
191
+ toolCallId: 'c2',
192
+ toolName: 'task',
193
+ args: { agent: 'verify' },
194
+ });
195
+ expect(rt.snapshot().phase).toBe('verifying');
196
+ expect(events.map((e) => e.progress.phase)).toEqual([
197
+ 'understanding',
198
+ 'selecting',
199
+ 'verifying',
200
+ ]);
201
+ });
202
+ });
203
+ describe('checkTotal refresh (ADR-0020 Fase 6)', () => {
204
+ it('kraken_select end refreshes the payload without a phase change', () => {
205
+ const h = harness('build', { loadCheckTotal: () => 3 });
206
+ h.rt.beginTurn();
207
+ h.toolStart('kraken_select', 'sel1');
208
+ h.toolEnd('sel1');
209
+ expect(h.phases()).toEqual(['understanding', 'selecting', 'selecting']);
210
+ const last = h.events[h.events.length - 1];
211
+ expect(last.progress.checkTotal).toBe(3);
212
+ });
213
+ it('checkTotal rides later phase payloads', () => {
214
+ const h = harness('build', { loadCheckTotal: () => 2 });
215
+ h.rt.beginTurn();
216
+ h.toolStart('kraken_select', 'sel1');
217
+ h.toolEnd('sel1');
218
+ h.toolStart('task', 't1', { agent: 'verify' });
219
+ const last = h.events[h.events.length - 1];
220
+ expect(last.progress.phase).toBe('verifying');
221
+ expect(last.progress.checkTotal).toBe(2);
222
+ });
223
+ it('no loader → no checkTotal, no extra event', () => {
224
+ const h = harness('build');
225
+ h.rt.beginTurn();
226
+ h.toolStart('kraken_select', 'sel1');
227
+ const before = h.events.length;
228
+ h.toolEnd('sel1');
229
+ expect(h.events.length).toBe(before);
230
+ expect(h.rt.snapshot().checkTotal).toBeUndefined();
231
+ });
232
+ it('loader returning 0 does not set the counter', () => {
233
+ const h = harness('build', { loadCheckTotal: () => 0 });
234
+ h.rt.beginTurn();
235
+ h.toolStart('kraken_select', 'sel1');
236
+ const before = h.events.length;
237
+ h.toolEnd('sel1');
238
+ expect(h.events.length).toBe(before);
239
+ expect(h.rt.snapshot().checkTotal).toBeUndefined();
240
+ });
241
+ it('same count on a second kraken_select does not re-emit', () => {
242
+ const h = harness('build', { loadCheckTotal: () => 3 });
243
+ h.rt.beginTurn();
244
+ h.toolStart('kraken_select', 'sel1');
245
+ h.toolEnd('sel1');
246
+ const after = h.events.length;
247
+ h.toolStart('kraken_select', 'sel2'); // same phase → no emit
248
+ h.toolEnd('sel2'); // same count → no refresh
249
+ expect(h.events.length).toBe(after);
250
+ });
251
+ });
252
+ describe('Fase 7 — checksPassed refresh on verify tentacle end', () => {
253
+ it('verify end (no writes) refreshes checksPassed in-phase', () => {
254
+ let passed = 2;
255
+ const h = harness('build', { loadChecksPassed: () => passed });
256
+ h.rt.beginTurn();
257
+ h.toolStart('task', 'v1', { agent: 'verify' });
258
+ expect(h.phases()).toEqual(['understanding', 'verifying']);
259
+ h.toolEnd('v1');
260
+ expect(h.phases()).toEqual(['understanding', 'verifying', 'verifying']);
261
+ const last = h.events.at(-1)?.progress;
262
+ expect(last?.checksPassed).toBe(2);
263
+ expect(last?.verifyTentacles).toBe(1);
264
+ });
265
+ it('verify end after writes carries checksPassed in the single transition event', () => {
266
+ const h = harness('build', { loadChecksPassed: () => 1 });
267
+ h.rt.beginTurn();
268
+ h.toolStart('write_file', 'w1', { path: 'a.ts' });
269
+ h.toolEnd('w1');
270
+ h.toolStart('task', 'v1', { agent: 'verify' });
271
+ const before = h.events.length;
272
+ h.toolEnd('v1');
273
+ expect(h.events.length).toBe(before + 1); // sparse: one event, not two
274
+ expect(h.phases().at(-1)).toBe('implementing');
275
+ expect(h.events.at(-1)?.progress.checksPassed).toBe(1);
276
+ });
277
+ it('unchanged counter does not re-emit (sparse stream)', () => {
278
+ const h = harness('build', { loadChecksPassed: () => 1 });
279
+ h.rt.beginTurn();
280
+ h.toolStart('task', 'v1', { agent: 'verify' });
281
+ h.toolEnd('v1');
282
+ const count = h.events.length;
283
+ h.toolStart('task', 'v2', { agent: 'verify' });
284
+ h.toolEnd('v2');
285
+ // same value the second time → no extra emit for v2 (sparse stream)
286
+ expect(h.events.length).toBe(count);
287
+ });
288
+ it('a second verify with a better count updates the counter', () => {
289
+ let passed = 1;
290
+ const h = harness('build', { loadChecksPassed: () => passed });
291
+ h.rt.beginTurn();
292
+ h.toolStart('task', 'v1', { agent: 'verify' });
293
+ h.toolEnd('v1');
294
+ passed = 3; // repair pass: re-verification now green
295
+ h.toolStart('task', 'v2', { agent: 'verify' });
296
+ h.toolEnd('v2');
297
+ const last = h.events.at(-1)?.progress;
298
+ expect(last?.checksPassed).toBe(3);
299
+ });
300
+ it('loader returning undefined emits nothing and omits the field', () => {
301
+ const h = harness('build', { loadChecksPassed: () => undefined });
302
+ h.rt.beginTurn();
303
+ h.toolStart('task', 'v1', { agent: 'verify' });
304
+ h.toolEnd('v1');
305
+ const last = h.events.at(-1)?.progress;
306
+ expect(last?.checksPassed).toBeUndefined();
307
+ expect('checksPassed' in (last ?? {})).toBe(false);
308
+ });
309
+ it('explore tentacle end never triggers the check refresh', () => {
310
+ const h = harness('build', {
311
+ loadChecksPassed: () => {
312
+ throw new Error('must not be called for explore tentacles');
313
+ },
314
+ });
315
+ h.rt.beginTurn();
316
+ h.toolStart('task', 'e1', { agent: 'explore' });
317
+ h.toolEnd('e1');
318
+ expect(h.phases()).toEqual(['understanding', 'exploring']);
319
+ expect(h.events.at(-1)?.progress.checksPassed).toBeUndefined();
320
+ });
321
+ it('no loader → verify end behaves exactly as before (phase only)', () => {
322
+ const h = harness('build');
323
+ h.rt.beginTurn();
324
+ h.toolStart('task', 'v1', { agent: 'verify' });
325
+ h.toolEnd('v1');
326
+ expect(h.phases()).toEqual(['understanding', 'verifying']);
327
+ expect('checksPassed' in (h.events.at(-1)?.progress ?? {})).toBe(false);
328
+ });
329
+ });
330
+ describe('KrakenTurnRuntime — repair pass (Fase 8)', () => {
331
+ it('beginPass(true) projects repairing and keeps turn counters', () => {
332
+ const h = harness('build');
333
+ h.rt.beginTurn();
334
+ h.toolStart('task', 'e1', { agent: 'explore' });
335
+ h.toolEnd('e1');
336
+ h.rt.finish('completed');
337
+ h.rt.beginPass(true);
338
+ expect(h.phases()).toEqual([
339
+ 'understanding',
340
+ 'exploring',
341
+ 'completed',
342
+ 'repairing',
343
+ ]);
344
+ const last = h.events.at(-1)?.progress;
345
+ expect(last?.tentacles).toBe(1); // counters describe the WHOLE turn
346
+ expect(last?.exploreTentacles).toBe(1);
347
+ });
348
+ it('during repair, verify tentacles still transition to verifying', () => {
349
+ const h = harness('build');
350
+ h.rt.beginTurn();
351
+ h.rt.beginPass(true);
352
+ h.toolStart('task', 'v1', { agent: 'verify' });
353
+ expect(h.phases()).toEqual(['understanding', 'repairing', 'verifying']);
354
+ });
355
+ it('beginPass() without args still restarts at understanding (write-retry path)', () => {
356
+ const h = harness('build');
357
+ h.rt.beginTurn();
358
+ h.toolStart('task', 'v1', { agent: 'verify' });
359
+ h.rt.beginPass();
360
+ expect(h.phases()).toEqual(['understanding', 'verifying', 'understanding']);
361
+ });
362
+ it('repair pass can finish completed after re-verification', () => {
363
+ const h = harness('build');
364
+ h.rt.beginTurn();
365
+ h.rt.beginPass(true);
366
+ h.toolStart('task', 'v1', { agent: 'verify' });
367
+ h.toolEnd('v1');
368
+ h.rt.finish('completed');
369
+ expect(h.phases()).toEqual([
370
+ 'understanding',
371
+ 'repairing',
372
+ 'verifying',
373
+ 'completed',
374
+ ]);
375
+ });
376
+ });
377
+ //# sourceMappingURL=turnRuntime.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnRuntime.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/turnRuntime.test.ts"],"names":[],"mappings":"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"}