zelari-code 2.1.0 → 2.1.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 (114) hide show
  1. package/README.md +4 -4
  2. package/package.json +8 -5
  3. package/dist/cli/ast/engine.test.js +0 -101
  4. package/dist/cli/ast/engine.test.js.map +0 -1
  5. package/dist/cli/ast/tools.test.js +0 -124
  6. package/dist/cli/ast/tools.test.js.map +0 -1
  7. package/dist/cli/headless.test.js +0 -107
  8. package/dist/cli/headless.test.js.map +0 -1
  9. package/dist/cli/headlessE2eSession.test.js +0 -189
  10. package/dist/cli/headlessE2eSession.test.js.map +0 -1
  11. package/dist/cli/headlessHistorySeed.test.js +0 -158
  12. package/dist/cli/headlessHistorySeed.test.js.map +0 -1
  13. package/dist/cli/headlessSessionEvent.test.js +0 -83
  14. package/dist/cli/headlessSessionEvent.test.js.map +0 -1
  15. package/dist/cli/headlessSpine.test.js +0 -153
  16. package/dist/cli/headlessSpine.test.js.map +0 -1
  17. package/dist/cli/hooks/observationStore.test.js +0 -135
  18. package/dist/cli/hooks/observationStore.test.js.map +0 -1
  19. package/dist/cli/hooks/sessionSurface.test.js +0 -112
  20. package/dist/cli/hooks/sessionSurface.test.js.map +0 -1
  21. package/dist/cli/kraken/candidateRegistry.test.js +0 -211
  22. package/dist/cli/kraken/candidateRegistry.test.js.map +0 -1
  23. package/dist/cli/kraken/completionGate.test.js +0 -172
  24. package/dist/cli/kraken/completionGate.test.js.map +0 -1
  25. package/dist/cli/kraken/evidenceAnchoring.test.js +0 -92
  26. package/dist/cli/kraken/evidenceAnchoring.test.js.map +0 -1
  27. package/dist/cli/kraken/evidenceProvenance.test.js +0 -113
  28. package/dist/cli/kraken/evidenceProvenance.test.js.map +0 -1
  29. package/dist/cli/kraken/executor.workbench.test.js +0 -134
  30. package/dist/cli/kraken/executor.workbench.test.js.map +0 -1
  31. package/dist/cli/kraken/metrics.test.js +0 -145
  32. package/dist/cli/kraken/metrics.test.js.map +0 -1
  33. package/dist/cli/kraken/nativeVerification.test.js +0 -207
  34. package/dist/cli/kraken/nativeVerification.test.js.map +0 -1
  35. package/dist/cli/kraken/planner.test.js +0 -43
  36. package/dist/cli/kraken/planner.test.js.map +0 -1
  37. package/dist/cli/kraken/scriptPlanner.test.js +0 -152
  38. package/dist/cli/kraken/scriptPlanner.test.js.map +0 -1
  39. package/dist/cli/kraken/selectionPlaybook.test.js +0 -55
  40. package/dist/cli/kraken/selectionPlaybook.test.js.map +0 -1
  41. package/dist/cli/kraken/skillSuggest.test.js +0 -157
  42. package/dist/cli/kraken/skillSuggest.test.js.map +0 -1
  43. package/dist/cli/kraken/strictDefaults.test.js +0 -149
  44. package/dist/cli/kraken/strictDefaults.test.js.map +0 -1
  45. package/dist/cli/kraken/strictGatePackIndependence.test.js +0 -112
  46. package/dist/cli/kraken/strictGatePackIndependence.test.js.map +0 -1
  47. package/dist/cli/kraken/turnRuntime.test.js +0 -377
  48. package/dist/cli/kraken/turnRuntime.test.js.map +0 -1
  49. package/dist/cli/kraken/verificationBridge.session.test.js +0 -104
  50. package/dist/cli/kraken/verificationBridge.session.test.js.map +0 -1
  51. package/dist/cli/kraken/verificationBridge.test.js +0 -177
  52. package/dist/cli/kraken/verificationBridge.test.js.map +0 -1
  53. package/dist/cli/kraken/verifier.test.js +0 -232
  54. package/dist/cli/kraken/verifier.test.js.map +0 -1
  55. package/dist/cli/kraken/verifierAdvisoryLock.test.js +0 -154
  56. package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +0 -1
  57. package/dist/cli/kraken/verifierLifecycle.test.js +0 -181
  58. package/dist/cli/kraken/verifierLifecycle.test.js.map +0 -1
  59. package/dist/cli/kraken/verifierRoundTrip.test.js +0 -166
  60. package/dist/cli/kraken/verifierRoundTrip.test.js.map +0 -1
  61. package/dist/cli/kraken/verifierSettings.test.js +0 -237
  62. package/dist/cli/kraken/verifierSettings.test.js.map +0 -1
  63. package/dist/cli/kraken/verifyReport.test.js +0 -111
  64. package/dist/cli/kraken/verifyReport.test.js.map +0 -1
  65. package/dist/cli/kraken/weaknessMeter.test.js +0 -212
  66. package/dist/cli/kraken/weaknessMeter.test.js.map +0 -1
  67. package/dist/cli/kraken/workbench.test.js +0 -253
  68. package/dist/cli/kraken/workbench.test.js.map +0 -1
  69. package/dist/cli/kraken/workbenchView.test.js +0 -130
  70. package/dist/cli/kraken/workbenchView.test.js.map +0 -1
  71. package/dist/cli/legacyContextIsolation.test.js +0 -65
  72. package/dist/cli/legacyContextIsolation.test.js.map +0 -1
  73. package/dist/cli/lsp/tools.test.js +0 -90
  74. package/dist/cli/lsp/tools.test.js.map +0 -1
  75. package/dist/cli/missionContinuation.test.js +0 -117
  76. package/dist/cli/missionContinuation.test.js.map +0 -1
  77. package/dist/cli/profileMatrix.test.js +0 -130
  78. package/dist/cli/profileMatrix.test.js.map +0 -1
  79. package/dist/cli/provider/capabilities.test.js +0 -46
  80. package/dist/cli/provider/capabilities.test.js.map +0 -1
  81. package/dist/cli/provider/openai-compatible.timeout.test.js +0 -72
  82. package/dist/cli/provider/openai-compatible.timeout.test.js.map +0 -1
  83. package/dist/cli/providerConfig.test.js +0 -85
  84. package/dist/cli/providerConfig.test.js.map +0 -1
  85. package/dist/cli/sessionReplayInvariant.test.js +0 -187
  86. package/dist/cli/sessionReplayInvariant.test.js.map +0 -1
  87. package/dist/cli/sessionSpine.test.js +0 -171
  88. package/dist/cli/sessionSpine.test.js.map +0 -1
  89. package/dist/cli/thinking.test.js +0 -214
  90. package/dist/cli/thinking.test.js.map +0 -1
  91. package/dist/cli/tools/inspectCommand.schema.test.js +0 -82
  92. package/dist/cli/tools/inspectCommand.schema.test.js.map +0 -1
  93. package/dist/cli/tools/inspectCommand.test.js +0 -311
  94. package/dist/cli/tools/inspectCommand.test.js.map +0 -1
  95. package/dist/cli/tools/krakenCsvFanout.test.js +0 -200
  96. package/dist/cli/tools/krakenCsvFanout.test.js.map +0 -1
  97. package/dist/cli/tools/krakenSelectTool.test.js +0 -246
  98. package/dist/cli/tools/krakenSelectTool.test.js.map +0 -1
  99. package/dist/cli/tools/observeBatch.test.js +0 -329
  100. package/dist/cli/tools/observeBatch.test.js.map +0 -1
  101. package/dist/cli/tools/taskTool.dynamicChecks.test.js +0 -156
  102. package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +0 -1
  103. package/dist/cli/tools/taskTool.planSafety.test.js +0 -280
  104. package/dist/cli/tools/taskTool.planSafety.test.js.map +0 -1
  105. package/dist/cli/tools/taskTool.verifyReport.test.js +0 -140
  106. package/dist/cli/tools/taskTool.verifyReport.test.js.map +0 -1
  107. package/dist/cli/utils/contextGrowthSummary.test.js +0 -74
  108. package/dist/cli/utils/contextGrowthSummary.test.js.map +0 -1
  109. package/dist/cli/workspace/planDriftCheck.test.js +0 -146
  110. package/dist/cli/workspace/planDriftCheck.test.js.map +0 -1
  111. package/dist/cli/workspace/planStore.test.js +0 -295
  112. package/dist/cli/workspace/planStore.test.js.map +0 -1
  113. package/dist/cli/zelariMission.test.js +0 -44
  114. package/dist/cli/zelariMission.test.js.map +0 -1
@@ -1,130 +0,0 @@
1
- /**
2
- * Kraken workbench view — tests.
3
- *
4
- * Covers:
5
- * - `parseWorkbench` round-trips a workbench file produced by the writer
6
- * - Tolerant: partial / truncated input does not throw
7
- * - `formatWorkbenchForTerminal` produces a readable text block
8
- */
9
- import { describe, it, expect } from 'vitest';
10
- import { parseWorkbench, formatWorkbenchForTerminal } from './workbenchView.js';
11
- import { WorkbenchWriter } from './workbench.js';
12
- import { promises as fs } from 'node:fs';
13
- import os from 'node:os';
14
- import path from 'node:path';
15
- const SAMPLE = `# Kraken workbench
16
-
17
- **Goal:** refactor auth
18
- **Graph id:** \`g-abc\`
19
- **Started:** 2026-08-08T11:00:00.000Z · **Elapsed:** 00:01:23
20
-
21
- ## Progress: 2/5 · 1↑ · 0✗
22
-
23
- ## Wave
24
-
25
- | id | label | kind | scope | status | model | duration |
26
- |----|-------|------|-------|--------|-------|----------|
27
- | t0001 | map auth | explore | src/auth | ✓ | grok-3-mini | 4.0s |
28
- | t0002 | refactor | general | src/auth | ✓ | grok-4.5 | 12.3s |
29
- | t0003 | test | general | tests/auth | ↑ | grok-4.5 | |
30
- | t0004 | judge | verify | | pending | | |
31
- | t0005 | merge | merge | | pending | | |
32
-
33
- ## Events (latest 30)
34
-
35
- - 11:00:01 node_start t0001 map auth
36
- - 11:00:05 node_end t0001 done (4000ms)
37
- - 11:00:06 node_start t0002 refactor
38
- - 11:00:18 node_end t0002 done (12300ms)
39
- - 11:00:18 node_start t0003 test
40
- `;
41
- describe('parseWorkbench', () => {
42
- it('parses a full workbench file', () => {
43
- const p = parseWorkbench(SAMPLE);
44
- expect(p.goal).toBe('refactor auth');
45
- expect(p.graphId).toBe('g-abc');
46
- expect(p.started).toContain('2026-08-08');
47
- expect(p.progress).toContain('2/5');
48
- expect(p.nodes).toHaveLength(5);
49
- expect(p.nodes[0]).toMatchObject({
50
- id: 't0001',
51
- label: 'map auth',
52
- kind: 'explore',
53
- scope: 'src/auth',
54
- status: '✓',
55
- model: 'grok-3-mini',
56
- duration: '4.0s',
57
- });
58
- expect(p.events).toHaveLength(5);
59
- expect(p.events[0]).toEqual({ ts: '11:00:01', text: 'node_start t0001 map auth' });
60
- });
61
- it('returns empty for empty / null input', () => {
62
- expect(parseWorkbench('')).toEqual({
63
- goal: '', graphId: '', started: '', elapsed: '', progress: '',
64
- nodes: [], events: [],
65
- });
66
- expect(parseWorkbench(undefined)).toEqual({
67
- goal: '', graphId: '', started: '', elapsed: '', progress: '',
68
- nodes: [], events: [],
69
- });
70
- expect(parseWorkbench(null)).toEqual({
71
- goal: '', graphId: '', started: '', elapsed: '', progress: '',
72
- nodes: [], events: [],
73
- });
74
- });
75
- it('tolerates a truncated file (only header, no sections)', () => {
76
- const p = parseWorkbench('# Kraken workbench\n\n**Goal:** x\n');
77
- expect(p.goal).toBe('x');
78
- expect(p.nodes).toEqual([]);
79
- expect(p.events).toEqual([]);
80
- });
81
- it('tolerates a partial events section', () => {
82
- const p = parseWorkbench('# Kraken workbench\n\n## Events (latest 30)\n\n- 11:00:01 hello\n');
83
- expect(p.events).toHaveLength(1);
84
- expect(p.events[0].text).toBe('hello');
85
- });
86
- it('ignores rows that do not have enough cells', () => {
87
- const content = `
88
- ## Wave
89
-
90
- | id | label | kind | scope | status | model | duration |
91
- |----|-------|------|-------|--------|-------|----------|
92
- | t0001 ok
93
- `;
94
- const p = parseWorkbench(content);
95
- expect(p.nodes).toEqual([]); // row has only 1 cell, dropped
96
- });
97
- it('round-trips with the writer', async () => {
98
- const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-wb-view-'));
99
- const w = new WorkbenchWriter({ cwd: tmp, graphId: 'g-rt', goal: 'rt test', debounceMs: 0 });
100
- w.setNodes([
101
- { id: 't0001', kind: 'explore', label: 'a', status: 'done', model: 'm1', durationMs: 100 },
102
- { id: 't0002', kind: 'general', label: 'b', status: 'running', scope: ['src/x'] },
103
- ]);
104
- w.logEvent('event 1');
105
- w.logEvent('event 2');
106
- const out = await w.flush();
107
- const content = await fs.readFile(out, 'utf8');
108
- const parsed = parseWorkbench(content);
109
- expect(parsed.goal).toBe('rt test');
110
- expect(parsed.graphId).toBe('g-rt');
111
- expect(parsed.nodes).toHaveLength(2);
112
- expect(parsed.events.length).toBeGreaterThanOrEqual(2);
113
- });
114
- });
115
- describe('formatWorkbenchForTerminal', () => {
116
- it('includes the goal, progress, and recent events', () => {
117
- const out = formatWorkbenchForTerminal(parseWorkbench(SAMPLE));
118
- expect(out).toContain('[kraken] refactor auth');
119
- expect(out).toContain('[kraken] progress: 2/5');
120
- expect(out).toContain('[kraken] wave:');
121
- expect(out).toContain('t0001 map auth');
122
- expect(out).toContain('11:00:01 node_start t0001');
123
- });
124
- it('produces a readable block for an empty workbench', () => {
125
- const out = formatWorkbenchForTerminal(parseWorkbench(''));
126
- // Empty workbench → empty render (nothing to show).
127
- expect(out.trim()).toBe('');
128
- });
129
- });
130
- //# sourceMappingURL=workbenchView.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workbenchView.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/workbenchView.test.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- /**
2
- * legacyContextIsolation — architectural gate for ADR-0024 (E1.5).
3
- *
4
- * Encodes the Exit-1 grep criteria as a CI test: the 1.x store and
5
- * sessionManager must never feed the model context on a hot path. These are
6
- * source-level assertions on purpose; the behavioral replay + invariant
7
- * coverage lives in sessionReplayInvariant.test.ts.
8
- */
9
- import { describe, expect, it } from 'vitest';
10
- import { readFileSync } from 'node:fs';
11
- import path from 'node:path';
12
- import { fileURLToPath } from 'node:url';
13
- // Source-level gate: resolve against THIS file, never process.cwd() — the
14
- // core workspace runs `vitest run --root ../..` with cwd=packages/core, and
15
- // a cwd-relative path would ENOENT there. From src/cli (and the compiled
16
- // dist/cli twin, same depth) `../..` is always the repo root.
17
- const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
18
- function readCli(rel) {
19
- return readFileSync(path.join(REPO_ROOT, 'src', 'cli', rel), 'utf8');
20
- }
21
- describe('ADR-0024 — legacy context isolation', () => {
22
- it('budget pipeline measures the spine-derived seed, never the raw 1.x store', () => {
23
- const src = readCli(path.join('hooks', 'useChatTurn.ts'));
24
- expect(src).not.toContain('applyBudgetPolicyAsync(getHistory()');
25
- // The declared discrete fallback (degraded/disabled spine) stays the only
26
- // seed path that may read the 1.x store.
27
- const fallbackUses = src.match(/spineSeed \?\? getHistory\(\)/g) ?? [];
28
- expect(fallbackUses.length).toBe(1);
29
- });
30
- it('headless hot path touches opts.history only via the one-shot spine import', () => {
31
- const src = readCli('runHeadless.ts');
32
- const lines = src.split(/\r?\n/);
33
- const optHistoryLines = lines.filter((l) => l.includes('opts.history'));
34
- expect(optHistoryLines.length).toBeGreaterThan(0);
35
- for (const line of optHistoryLines) {
36
- expect(line).toContain('seedHeadlessModelHistory');
37
- }
38
- // No second history brain on the headless path.
39
- expect(src).not.toContain('getHistory');
40
- });
41
- it('spine modules never import the 1.x sessionManager', () => {
42
- for (const rel of ['sessionSpine.ts', 'headlessSpine.ts']) {
43
- const src = readCli(rel);
44
- expect(src).not.toMatch(/from\s+['"][^'"]*sessionManager/);
45
- }
46
- });
47
- });
48
- describe('strict done gate enforcement (E2.2)', () => {
49
- it('headless kraken BUILD enforces the strict verdict on the run outcome', () => {
50
- const src = readCli('runHeadless.ts');
51
- expect(src).toContain('strictGateExitCode(after)');
52
- expect(src).toMatch(/strictExit !== 0 \? 'stopped' : 'completed'/);
53
- expect(src).toMatch(/if \(strictExit !== 0\) return strictExit;/);
54
- });
55
- it('the strict BUILD policy excludes verifier-llm evidence (LLM score alone is not done)', () => {
56
- const policy = readFileSync(path.join(REPO_ROOT, 'packages', 'core', 'src', 'verification', 'completionPolicy.ts'), 'utf8');
57
- expect(policy).toContain('export const STRICT_BUILD_POLICY');
58
- const tiersBlock = policy.slice(policy.indexOf('DETERMINISTIC_EVIDENCE_TIERS'), policy.indexOf('export const STRICT_BUILD_POLICY'));
59
- expect(tiersBlock).toContain("'tool-output'");
60
- expect(tiersBlock).not.toContain("'verifier-llm'");
61
- expect(policy).toMatch(/admissibleTiers/);
62
- expect(policy).toMatch(/requireEventBackedEvidence:\s*true/);
63
- });
64
- });
65
- //# sourceMappingURL=legacyContextIsolation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacyContextIsolation.test.js","sourceRoot":"","sources":["../../src/cli/legacyContextIsolation.test.ts"],"names":[],"mappings":"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"}
@@ -1,90 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { createLspTools } from './tools.js';
3
- /**
4
- * WS4 — LSP read-only in plan + EMPTY ≠ DEGRADED (piano §8, t4).
5
- *
6
- * The tools must (a) stay pure read-only surface, and (b) when the provider
7
- * reports `serverStatusFor → 'unavailable'`, stamp an explicit `degraded`
8
- * field on the result instead of presenting an empty array as evidence.
9
- */
10
- function loc(file, line, col) {
11
- return {
12
- uri: `file:///${file.replace(/\\/g, '/')}`,
13
- range: { start: { line: line - 1, character: col - 1 }, end: { line: line - 1, character: col } },
14
- };
15
- }
16
- function makeProvider(overrides) {
17
- const status = overrides?.status ?? 'available';
18
- const base = {
19
- definition: async () => [loc('src/a.ts', 10, 3)],
20
- references: async () => [loc('src/a.ts', 10, 3), loc('src/b.ts', 42, 17)],
21
- hover: async () => '(hover) const x: number',
22
- documentSymbols: async () => [{ kind: 'function', name: 'foo', line: 1 }],
23
- rename: async () => ({ totalEdits: 2, files: [{ file: 'src/a.ts', count: 2 }] }),
24
- dispose: () => { },
25
- };
26
- const merged = { ...base, ...overrides };
27
- // serverStatusFor is not part of older fakes; attach explicitly.
28
- merged.serverStatusFor =
29
- () => status;
30
- return merged;
31
- }
32
- function tool(names, name) {
33
- const t = names.find((x) => x.name === name);
34
- if (!t)
35
- throw new Error(`tool not found: ${name}`);
36
- return t;
37
- }
38
- describe('createLspTools — WS4', () => {
39
- it('all five tools are read-only (permissions: ["read"])', () => {
40
- for (const t of createLspTools(makeProvider())) {
41
- expect(t.permissions).toEqual(['read']);
42
- }
43
- });
44
- it('healthy provider: results carry no degraded field', async () => {
45
- const tools = createLspTools(makeProvider(), '/proj');
46
- const def = await tool(tools, 'go_to_definition').execute({ path: 'src/a.ts', line: 10, column: 3 }, undefined);
47
- expect(def).toMatchObject({ ok: true });
48
- if (def.ok) {
49
- expect(def.value).toHaveProperty('count', 1);
50
- expect(def.value).not.toHaveProperty('degraded');
51
- expect(JSON.stringify(def.value)).toContain('src/a.ts:10:3');
52
- }
53
- });
54
- it('unavailable server: go_to_definition stamps LSP_PROVIDER_DEGRADED (EMPTY ≠ DEGRADED)', async () => {
55
- const tools = createLspTools(makeProvider({ status: 'unavailable', definition: async () => [] }), '/proj');
56
- const res = await tool(tools, 'go_to_definition').execute({ path: 'src/a.ts', line: 10, column: 3 }, undefined);
57
- expect(res).toMatchObject({ ok: true });
58
- if (res.ok) {
59
- expect(res.value).toHaveProperty('count', 0);
60
- const degraded = res.value.degraded;
61
- expect(degraded).toContain('LSP_PROVIDER_DEGRADED');
62
- expect(degraded).toContain('NOT evidence');
63
- }
64
- });
65
- it('unavailable server: find_references + document_symbols stamp degraded on empty results', async () => {
66
- const tools = createLspTools(makeProvider({ status: 'unavailable', references: async () => [], documentSymbols: async () => [] }), '/proj');
67
- const refs = await tool(tools, 'find_references').execute({ path: 'src/a.ts', line: 10, column: 3 }, undefined);
68
- const syms = await tool(tools, 'document_symbols').execute({ path: 'src/a.ts' }, undefined);
69
- expect(refs.ok && refs.value.degraded).toContain('LSP_PROVIDER_DEGRADED');
70
- expect(syms.ok && syms.value.degraded).toContain('LSP_PROVIDER_DEGRADED');
71
- });
72
- it('unavailable server: hover null becomes degraded note, not "(no hover information)"', async () => {
73
- const tools = createLspTools(makeProvider({ status: 'unavailable', hover: async () => null }), '/proj');
74
- const res = await tool(tools, 'hover_type').execute({ path: 'src/a.ts', line: 10, column: 3 }, undefined);
75
- expect(res.ok && res.value.hover).toContain('LSP_PROVIDER_DEGRADED');
76
- });
77
- it('unavailable server: rename null becomes degraded note; rename preview stays read-only', async () => {
78
- const tools = createLspTools(makeProvider({ status: 'unavailable', rename: async () => null }), '/proj');
79
- const res = await tool(tools, 'rename_symbol').execute({ path: 'src/a.ts', line: 10, column: 3, newName: 'bar' }, undefined);
80
- expect(res.ok && res.value.preview).toContain('LSP_PROVIDER_DEGRADED');
81
- });
82
- it('provider without serverStatusFor (legacy fake): never degrades', async () => {
83
- const provider = makeProvider({ definition: async () => [] });
84
- delete provider.serverStatusFor;
85
- const tools = createLspTools(provider, '/proj');
86
- const res = await tool(tools, 'go_to_definition').execute({ path: 'src/a.ts', line: 10, column: 3 }, undefined);
87
- expect(res.ok && JSON.stringify(res.value)).not.toContain('DEGRADED');
88
- });
89
- });
90
- //# sourceMappingURL=tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../../src/cli/lsp/tools.test.ts"],"names":[],"mappings":"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"}
@@ -1,117 +0,0 @@
1
- /**
2
- * F4 integration — the mission loop records advisory continuation without
3
- * obeying it: advice on every implementation slice, deterministic stop rules
4
- * untouched, spine round-trip of mission.progress state events.
5
- */
6
- import { describe, expect, it, vi } from 'vitest';
7
- import { runZelariMission, } from './zelariMission.js';
8
- import { SessionStore, readSessionLog, buildProjection, } from '@zelari/core/session';
9
- import { deriveMissionState } from '@zelari/core/mission';
10
- import * as path from 'node:path';
11
- import * as os from 'node:os';
12
- import { promises as fs } from 'node:fs';
13
- const brief = {
14
- goal: 'vertical slice',
15
- deliverableThisMission: 'one module',
16
- phases: [{ mode: 'implementation', focus: 'impl' }],
17
- sliceMvp: { id: 'slice-1', summary: 'mvp', acceptance: [] },
18
- };
19
- function fakeMemory() {
20
- return {
21
- init: vi.fn(async () => { }),
22
- add: vi.fn(async () => { }),
23
- search: vi.fn(async () => []),
24
- };
25
- }
26
- function deps(overrides = {}) {
27
- return {
28
- projectRoot: os.tmpdir(),
29
- memory: fakeMemory(),
30
- runSlice: vi.fn(async () => ({ completionOk: true, ran: true, writeCount: 2 })),
31
- emit: vi.fn(),
32
- env: { ZELARI_CHECKPOINT: '0', ZELARI_MISSION_MAX_ITER: '3' },
33
- ...overrides,
34
- };
35
- }
36
- describe('runZelariMission — advisory continuation (F4)', () => {
37
- it('records advice on each implementation slice but never obeys it for done-by-score', async () => {
38
- const onMissionProgress = vi.fn();
39
- // Slice 1: claims completion but wrote 0 files → NOT done.
40
- // Slice 2: real green → done. The loop must follow its own deterministic
41
- // rules; the advice is only recorded.
42
- const results = [
43
- { completionOk: true, ran: true, writeCount: 0 },
44
- { completionOk: true, ran: true, writeCount: 3 },
45
- ];
46
- let i = 0;
47
- const d = deps({
48
- runSlice: vi.fn(async () => results[i++]),
49
- onMissionProgress,
50
- });
51
- const state = await runZelariMission('do it', brief, d);
52
- expect(state.status).toBe('success');
53
- expect(state.iteration).toBeGreaterThanOrEqual(2);
54
- expect(onMissionProgress).toHaveBeenCalled();
55
- const first = onMissionProgress.mock.calls[0][0];
56
- expect(first.doneByScore).toBe(false);
57
- expect(first.goalRewrite).toBe(false);
58
- expect(['continue', 'wind-down', 'hold-for-user']).toContain(first.recommendation);
59
- });
60
- it('emits a wind-down advice only when the deterministic gate is green', async () => {
61
- const seen = [];
62
- const d = deps({
63
- runSlice: vi.fn(async () => ({ completionOk: true, ran: true, writeCount: 1 })),
64
- onMissionProgress: (advice) => seen.push(advice.recommendation),
65
- });
66
- const state = await runZelariMission('go', brief, d);
67
- expect(state.status).toBe('success');
68
- expect(seen[seen.length - 1]).toBe('wind-down');
69
- });
70
- it('budget-exhausted run holds for the user instead of claiming done', async () => {
71
- const onMissionProgress = vi.fn();
72
- const d = deps({
73
- runSlice: vi.fn(async () => ({ completionOk: false, ran: true, writeCount: 1 })),
74
- onMissionProgress,
75
- });
76
- const state = await runZelariMission('go', brief, d);
77
- expect(state.status).toBe('stopped');
78
- const last = onMissionProgress.mock.calls.at(-1)[0];
79
- expect(['hold-for-user', 'continue']).toContain(last.recommendation);
80
- });
81
- });
82
- describe('mission.progress spine round-trip', () => {
83
- it('advice events replay as state (lastAdvice) and never join the model surface', async () => {
84
- const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'f4-'));
85
- const store = new SessionStore(tmp);
86
- const { sessionId, writer } = await store.create({ profile: 'mission/v1' });
87
- await writer.append({
88
- kind: 'mission.phase',
89
- actor: { type: 'system' },
90
- data: { phase: 'build' },
91
- });
92
- await writer.append({
93
- kind: 'mission.progress',
94
- actor: { type: 'system' },
95
- data: {
96
- recommendation: 'continue',
97
- rationale: 'required criteria incomplete → no early-stop',
98
- blockers: ['1/1 required criteria not passing'],
99
- iteration: 2,
100
- },
101
- });
102
- await writer.close();
103
- const report = await readSessionLog(path.join(tmp, sessionId, 'events.jsonl'));
104
- const events = report.events;
105
- const projection = buildProjection(events, report.issues);
106
- expect(projection.missionAdvice).toHaveLength(1);
107
- expect(projection.missionAdvice[0].recommendation).toBe('continue');
108
- const state = deriveMissionState(projection);
109
- expect(state.phase).toBe('build');
110
- expect(state.lastAdvice?.rationale).toContain('no early-stop');
111
- const { isModelSurfaceEvent } = await import('@zelari/core/session');
112
- const adviceEvent = events.find((e) => e.kind === 'mission.progress');
113
- expect(adviceEvent).toBeDefined();
114
- expect(isModelSurfaceEvent(adviceEvent)).toBe(false);
115
- });
116
- });
117
- //# sourceMappingURL=missionContinuation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"missionContinuation.test.js","sourceRoot":"","sources":["../../src/cli/missionContinuation.test.ts"],"names":[],"mappings":"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"}
@@ -1,130 +0,0 @@
1
- /**
2
- * profileMatrix — F7 (Exit-3.2, doc §10) profile × phase smoke matrix.
3
- *
4
- * Cells (§10 minimum): minimal+plan/build, kraken+plan/build, council+plan,
5
- * mission+build. For each cell the smoke walks the three real wiring legs:
6
- *
7
- * 1. profile loader — mode/--profile resolves to the expected versioned
8
- * profile (ADR-0022); explicit ids win over mode defaults
9
- * 2. session metadata — the spine `session.started` header records profile +
10
- * toolManifestHash of the declared profile, so same-task/same-profile
11
- * runs stay comparable
12
- * 3. capability gate — the REAL registry built for that phase: plan strips
13
- * every PLAN_BLOCKED_TOOLS mutator while keeping the plan-domain tools
14
- * (task_create/update/list + explore-only `task`); build registers the
15
- * full mutator set; declared profile tools are a subset of the build
16
- * registry (declarative 2.0 manifest ⊆ real 1.x registry)
17
- *
18
- * Wiring invariants that live inside runHeadless (mission slices never run in
19
- * plan; kraken/council registries derive planMode from the phase) are locked
20
- * as source assertions — same pattern as legacyContextIsolation.test.ts.
21
- */
22
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
23
- import { promises as fs } from 'node:fs';
24
- import { readFileSync } from 'node:fs';
25
- import path from 'node:path';
26
- import os from 'node:os';
27
- import { fileURLToPath } from 'node:url';
28
- import { readSessionLog } from '@zelari/core/session';
29
- import { MINIMAL_V1, KRAKEN_V1, MISSION_V1, toolManifestHash } from '@zelari/core/runtime';
30
- import { openHeadlessSpine, resolveHeadlessProfileId } from './headlessSpine.js';
31
- import { createBuiltinToolRegistry } from './toolRegistry.js';
32
- import { PLAN_BLOCKED_TOOLS } from './phase.js';
33
- const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
34
- function readCli(rel) {
35
- return readFileSync(path.join(REPO_ROOT, 'src', 'cli', rel), 'utf8');
36
- }
37
- const MATRIX = [
38
- { mode: 'kraken', profile: 'minimal/v1', explicitProfile: 'minimal/v1', phase: 'plan', declaredTools: MINIMAL_V1.tools },
39
- { mode: 'kraken', profile: 'minimal/v1', explicitProfile: 'minimal/v1', phase: 'build', declaredTools: MINIMAL_V1.tools },
40
- { mode: 'kraken', profile: 'kraken/v1', phase: 'plan', declaredTools: KRAKEN_V1.tools },
41
- { mode: 'kraken', profile: 'kraken/v1', phase: 'build', declaredTools: KRAKEN_V1.tools },
42
- { mode: 'council', profile: 'council/v1', phase: 'plan', declaredTools: [...MINIMAL_V1.tools, 'write_file'] },
43
- // §10 + mission contract: mission runs BUILD only (slices implement on disk).
44
- { mode: 'zelari', profile: 'mission/v1', phase: 'build', declaredTools: MISSION_V1.tools },
45
- ];
46
- let tmp;
47
- beforeEach(async () => {
48
- tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'zelari-profile-matrix-'));
49
- });
50
- afterEach(async () => {
51
- await fs.rm(tmp, { recursive: true, force: true });
52
- });
53
- describe('F7 profile × phase smoke matrix (Exit-3.2)', () => {
54
- it.each(MATRIX)('cell $mode/$phase → $profile: loader, session metadata and phase capability gate', async (cell) => {
55
- // Leg 1 — profile loader: explicit id wins, otherwise the mode default.
56
- expect(resolveHeadlessProfileId(cell.mode, cell.explicitProfile)).toBe(cell.profile);
57
- // Leg 2 — session metadata on the spine header.
58
- const sessionId = `mx-${cell.mode}-${cell.phase}`;
59
- const handle = await openHeadlessSpine({ sessionId, mode: cell.mode, profile: cell.explicitProfile, baseDir: tmp, quiet: true });
60
- expect(handle.profileId).toBe(cell.profile);
61
- const report = await readSessionLog(path.join(tmp, sessionId, 'events.jsonl'));
62
- expect(report.ok).toBe(true);
63
- const started = report.events.find((e) => e.kind === 'session.started');
64
- expect(started).toBeDefined();
65
- const startedData = (started?.data ?? {});
66
- expect(startedData.profile).toBe(cell.profile);
67
- // The manifest hash is the DECLARED profile tool set (ADR-0022) — the
68
- // comparability contract, distinct from the phase-gated live registry.
69
- expect(startedData.toolManifestHash).toBe(toolManifestHash(cell.declaredTools));
70
- // Leg 3 — real registry for the phase (no tool is invoked: zero side effects).
71
- const { registry } = createBuiltinToolRegistry({
72
- root: tmp,
73
- sessionId,
74
- planMode: cell.phase === 'plan',
75
- lifecycleHooks: null,
76
- lspProvider: null,
77
- });
78
- const names = new Set(registry.list());
79
- // Observe builtins exist in BOTH phases.
80
- for (const observe of ['read_file', 'grep_content', 'list_files']) {
81
- expect(names.has(observe), `${observe} must exist in ${cell.phase}`).toBe(true);
82
- }
83
- if (cell.phase === 'plan') {
84
- // No mutating builtin survives plan (no unauthorized side effects).
85
- for (const blocked of PLAN_BLOCKED_TOOLS) {
86
- expect(names.has(blocked), `${blocked} must be stripped in plan`).toBe(false);
87
- }
88
- // Plan-domain tools stay: durable plan tasks + explore-only delegation.
89
- for (const planTool of ['task_create', 'task_update', 'task_list', 'task']) {
90
- expect(names.has(planTool), `${planTool} must exist in plan`).toBe(true);
91
- }
92
- }
93
- else {
94
- // Build: the full mutator set is available.
95
- for (const mutator of ['write_file', 'edit_file', 'apply_diff', 'bash', 'task']) {
96
- expect(names.has(mutator), `${mutator} must exist in build`).toBe(true);
97
- }
98
- // Declared 2.0 profile tools are a subset of the real build registry.
99
- for (const declared of cell.declaredTools) {
100
- expect(names.has(declared), `declared tool ${declared} missing from build registry`).toBe(true);
101
- }
102
- }
103
- }, 30_000);
104
- });
105
- describe('F7 wiring invariants (source-level, legacyContextIsolation pattern)', () => {
106
- it('kraken and council registries derive planMode from the resolved phase', () => {
107
- const src = readCli('runHeadless.ts');
108
- // Kraken parent registry (headless hot path).
109
- expect(src).toContain('planMode: planModeFromOpts(opts),');
110
- // Council pipelines: explicit phase (design leg) and soft-gated variant.
111
- expect(src).toContain('planModeFromOpts(opts) || softGated,');
112
- expect(src).toContain('planModeFromOpts(opts),');
113
- // planModeFromOpts is the single phase→planMode derivation.
114
- expect(src).toContain("return (opts.phase ?? 'build') === 'plan';");
115
- });
116
- it('mission implementation slices are hard-wired to BUILD (never planMode)', () => {
117
- const src = readCli('runHeadless.ts');
118
- const lines = src.split(/\r?\n/);
119
- const idx = lines.findIndex((l) => l.includes('const { registry: agentRegistry } = createBuiltinToolRegistry({'));
120
- expect(idx).toBeGreaterThan(-1);
121
- const window = lines.slice(idx, idx + 12).join('\n');
122
- expect(window).toContain('planMode: false');
123
- expect(window).not.toContain('planMode: true');
124
- });
125
- it('PLAN_BLOCKED_TOOLS stays exactly the mutating builtins', () => {
126
- // If a new mutator lands without a plan gate, this reminds the author.
127
- expect([...PLAN_BLOCKED_TOOLS].sort()).toEqual(['apply_diff', 'bash', 'edit_file', 'write_file']);
128
- });
129
- });
130
- //# sourceMappingURL=profileMatrix.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"profileMatrix.test.js","sourceRoot":"","sources":["../../src/cli/profileMatrix.test.ts"],"names":[],"mappings":"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"}
@@ -1,46 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { capabilitiesFor, resolveHarnessProfile, isDeepSeekV4Model, } from './capabilities.js';
3
- describe('provider capabilities / harness profiles', () => {
4
- it('maps deepseek-v4* to the dedicated profile', () => {
5
- expect(resolveHarnessProfile('deepseek-v4-pro')).toBe('deepseek-v4');
6
- expect(resolveHarnessProfile('deepseek-v4-flash')).toBe('deepseek-v4');
7
- expect(resolveHarnessProfile('deepseek-v4')).toBe('deepseek-v4');
8
- expect(isDeepSeekV4Model('deepseek-v4.1')).toBe(true);
9
- });
10
- it('maps everything else to default', () => {
11
- expect(resolveHarnessProfile('grok-4')).toBe('default');
12
- expect(resolveHarnessProfile('deepseek-chat')).toBe('default');
13
- expect(resolveHarnessProfile(undefined)).toBe('default');
14
- expect(isDeepSeekV4Model('glm-4.6')).toBe(false);
15
- });
16
- it('deepseek-v4: 1M ctx, priced cache, reasoning replay, same compaction', () => {
17
- const cap = capabilitiesFor('deepseek-v4-pro');
18
- expect(cap.profile).toBe('deepseek-v4');
19
- expect(cap.contextWindow).toBe(1_000_000);
20
- expect(cap.promptCache.supported).toBe(true);
21
- expect(cap.promptCache.pricedCacheRead).toBe(true);
22
- expect(cap.reasoning.supported).toBe(true);
23
- expect(cap.reasoning.replayReasoning).toBe(true);
24
- expect(cap.reasoning.levels).toEqual(['high', 'max']);
25
- expect(cap.toolCalling.parallel).toBe(true);
26
- expect(cap.sampling.temperature).toBe(0.7);
27
- expect(cap.compaction).toEqual({ warnAt: 0.7, compactAt: 0.85, hardAt: 0.95 });
28
- });
29
- it('default: 400k ctx, unpriced cache, same sampling/compaction', () => {
30
- const cap = capabilitiesFor('grok-4');
31
- expect(cap.profile).toBe('default');
32
- expect(cap.contextWindow).toBe(400_000);
33
- expect(cap.promptCache.pricedCacheRead).toBe(false);
34
- expect(cap.sampling.temperature).toBe(0.7);
35
- expect(cap.compaction.compactAt).toBe(0.85);
36
- expect(cap.compaction.hardAt).toBe(0.95);
37
- });
38
- it('returned objects are frozen (callers cannot mutate shared policy)', () => {
39
- const cap = capabilitiesFor('deepseek-v4-flash');
40
- expect(Object.isFrozen(cap)).toBe(true);
41
- expect(() => {
42
- cap.contextWindow = 1;
43
- }).toThrow();
44
- });
45
- });
46
- //# sourceMappingURL=capabilities.test.js.map