zelari-code 2.0.1 → 2.1.1

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 (123) hide show
  1. package/README.md +5 -5
  2. package/dist/cli/hooks/useChatTurn.js +2 -1
  3. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  4. package/dist/cli/kraken/candidateRegistry.js +15 -1
  5. package/dist/cli/kraken/candidateRegistry.js.map +1 -1
  6. package/dist/cli/kraken/verificationBridge.js +125 -14
  7. package/dist/cli/kraken/verificationBridge.js.map +1 -1
  8. package/dist/cli/kraken/verifierLifecycle.js +88 -0
  9. package/dist/cli/kraken/verifierLifecycle.js.map +1 -0
  10. package/dist/cli/kraken/verifyReport.js.map +1 -1
  11. package/dist/cli/main.bundled.js +272 -89
  12. package/dist/cli/main.bundled.js.map +4 -4
  13. package/dist/cli/runHeadless.js +44 -93
  14. package/dist/cli/runHeadless.js.map +1 -1
  15. package/dist/cli/tools/taskTool.js +49 -3
  16. package/dist/cli/tools/taskTool.js.map +1 -1
  17. package/package.json +8 -5
  18. package/dist/cli/ast/engine.test.js +0 -101
  19. package/dist/cli/ast/engine.test.js.map +0 -1
  20. package/dist/cli/ast/tools.test.js +0 -124
  21. package/dist/cli/ast/tools.test.js.map +0 -1
  22. package/dist/cli/headless.test.js +0 -107
  23. package/dist/cli/headless.test.js.map +0 -1
  24. package/dist/cli/headlessE2eSession.test.js +0 -189
  25. package/dist/cli/headlessE2eSession.test.js.map +0 -1
  26. package/dist/cli/headlessHistorySeed.test.js +0 -158
  27. package/dist/cli/headlessHistorySeed.test.js.map +0 -1
  28. package/dist/cli/headlessSessionEvent.test.js +0 -83
  29. package/dist/cli/headlessSessionEvent.test.js.map +0 -1
  30. package/dist/cli/headlessSpine.test.js +0 -153
  31. package/dist/cli/headlessSpine.test.js.map +0 -1
  32. package/dist/cli/hooks/observationStore.test.js +0 -135
  33. package/dist/cli/hooks/observationStore.test.js.map +0 -1
  34. package/dist/cli/hooks/sessionSurface.test.js +0 -112
  35. package/dist/cli/hooks/sessionSurface.test.js.map +0 -1
  36. package/dist/cli/kraken/candidateRegistry.test.js +0 -211
  37. package/dist/cli/kraken/candidateRegistry.test.js.map +0 -1
  38. package/dist/cli/kraken/completionGate.test.js +0 -172
  39. package/dist/cli/kraken/completionGate.test.js.map +0 -1
  40. package/dist/cli/kraken/evidenceAnchoring.test.js +0 -92
  41. package/dist/cli/kraken/evidenceAnchoring.test.js.map +0 -1
  42. package/dist/cli/kraken/executor.workbench.test.js +0 -134
  43. package/dist/cli/kraken/executor.workbench.test.js.map +0 -1
  44. package/dist/cli/kraken/metrics.test.js +0 -145
  45. package/dist/cli/kraken/metrics.test.js.map +0 -1
  46. package/dist/cli/kraken/nativeVerification.test.js +0 -207
  47. package/dist/cli/kraken/nativeVerification.test.js.map +0 -1
  48. package/dist/cli/kraken/planner.test.js +0 -43
  49. package/dist/cli/kraken/planner.test.js.map +0 -1
  50. package/dist/cli/kraken/scriptPlanner.test.js +0 -152
  51. package/dist/cli/kraken/scriptPlanner.test.js.map +0 -1
  52. package/dist/cli/kraken/selectionPlaybook.test.js +0 -55
  53. package/dist/cli/kraken/selectionPlaybook.test.js.map +0 -1
  54. package/dist/cli/kraken/skillSuggest.test.js +0 -157
  55. package/dist/cli/kraken/skillSuggest.test.js.map +0 -1
  56. package/dist/cli/kraken/strictDefaults.test.js +0 -149
  57. package/dist/cli/kraken/strictDefaults.test.js.map +0 -1
  58. package/dist/cli/kraken/turnRuntime.test.js +0 -377
  59. package/dist/cli/kraken/turnRuntime.test.js.map +0 -1
  60. package/dist/cli/kraken/verificationBridge.session.test.js +0 -104
  61. package/dist/cli/kraken/verificationBridge.session.test.js.map +0 -1
  62. package/dist/cli/kraken/verificationBridge.test.js +0 -177
  63. package/dist/cli/kraken/verificationBridge.test.js.map +0 -1
  64. package/dist/cli/kraken/verifier.test.js +0 -232
  65. package/dist/cli/kraken/verifier.test.js.map +0 -1
  66. package/dist/cli/kraken/verifierAdvisoryLock.test.js +0 -154
  67. package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +0 -1
  68. package/dist/cli/kraken/verifierRoundTrip.test.js +0 -166
  69. package/dist/cli/kraken/verifierRoundTrip.test.js.map +0 -1
  70. package/dist/cli/kraken/verifierSettings.test.js +0 -237
  71. package/dist/cli/kraken/verifierSettings.test.js.map +0 -1
  72. package/dist/cli/kraken/verifyReport.test.js +0 -111
  73. package/dist/cli/kraken/verifyReport.test.js.map +0 -1
  74. package/dist/cli/kraken/weaknessMeter.test.js +0 -212
  75. package/dist/cli/kraken/weaknessMeter.test.js.map +0 -1
  76. package/dist/cli/kraken/workbench.test.js +0 -253
  77. package/dist/cli/kraken/workbench.test.js.map +0 -1
  78. package/dist/cli/kraken/workbenchView.test.js +0 -130
  79. package/dist/cli/kraken/workbenchView.test.js.map +0 -1
  80. package/dist/cli/legacyContextIsolation.test.js +0 -65
  81. package/dist/cli/legacyContextIsolation.test.js.map +0 -1
  82. package/dist/cli/lsp/tools.test.js +0 -90
  83. package/dist/cli/lsp/tools.test.js.map +0 -1
  84. package/dist/cli/missionContinuation.test.js +0 -117
  85. package/dist/cli/missionContinuation.test.js.map +0 -1
  86. package/dist/cli/profileMatrix.test.js +0 -130
  87. package/dist/cli/profileMatrix.test.js.map +0 -1
  88. package/dist/cli/provider/capabilities.test.js +0 -46
  89. package/dist/cli/provider/capabilities.test.js.map +0 -1
  90. package/dist/cli/provider/openai-compatible.timeout.test.js +0 -72
  91. package/dist/cli/provider/openai-compatible.timeout.test.js.map +0 -1
  92. package/dist/cli/providerConfig.test.js +0 -85
  93. package/dist/cli/providerConfig.test.js.map +0 -1
  94. package/dist/cli/sessionReplayInvariant.test.js +0 -187
  95. package/dist/cli/sessionReplayInvariant.test.js.map +0 -1
  96. package/dist/cli/sessionSpine.test.js +0 -171
  97. package/dist/cli/sessionSpine.test.js.map +0 -1
  98. package/dist/cli/thinking.test.js +0 -214
  99. package/dist/cli/thinking.test.js.map +0 -1
  100. package/dist/cli/tools/inspectCommand.schema.test.js +0 -82
  101. package/dist/cli/tools/inspectCommand.schema.test.js.map +0 -1
  102. package/dist/cli/tools/inspectCommand.test.js +0 -311
  103. package/dist/cli/tools/inspectCommand.test.js.map +0 -1
  104. package/dist/cli/tools/krakenCsvFanout.test.js +0 -200
  105. package/dist/cli/tools/krakenCsvFanout.test.js.map +0 -1
  106. package/dist/cli/tools/krakenSelectTool.test.js +0 -246
  107. package/dist/cli/tools/krakenSelectTool.test.js.map +0 -1
  108. package/dist/cli/tools/observeBatch.test.js +0 -329
  109. package/dist/cli/tools/observeBatch.test.js.map +0 -1
  110. package/dist/cli/tools/taskTool.dynamicChecks.test.js +0 -156
  111. package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +0 -1
  112. package/dist/cli/tools/taskTool.planSafety.test.js +0 -280
  113. package/dist/cli/tools/taskTool.planSafety.test.js.map +0 -1
  114. package/dist/cli/tools/taskTool.verifyReport.test.js +0 -140
  115. package/dist/cli/tools/taskTool.verifyReport.test.js.map +0 -1
  116. package/dist/cli/utils/contextGrowthSummary.test.js +0 -74
  117. package/dist/cli/utils/contextGrowthSummary.test.js.map +0 -1
  118. package/dist/cli/workspace/planDriftCheck.test.js +0 -146
  119. package/dist/cli/workspace/planDriftCheck.test.js.map +0 -1
  120. package/dist/cli/workspace/planStore.test.js +0 -295
  121. package/dist/cli/workspace/planStore.test.js.map +0 -1
  122. package/dist/cli/zelariMission.test.js +0 -44
  123. package/dist/cli/zelariMission.test.js.map +0 -1
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities.test.js","sourceRoot":"","sources":["../../../src/cli/provider/capabilities.test.ts"],"names":[],"mappings":"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"}
@@ -1,72 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { readChunkWithTimeout } from './openai-compatible.js';
3
- /**
4
- * Regression: the stream idle timeout used to reset on EVERY network chunk,
5
- * including SSE keep-alive frames that carry no content (blank lines, `: ping`,
6
- * `data:` with no choices). A stalled model behind a keep-alive gateway looked
7
- * "alive" forever: process hung 20+ min with an ESTABLISHED socket and zero
8
- * tokens, and the 5-min idle timeout never fired because keep-alives kept
9
- * resetting it. The idle budget now measures silence since the last *useful*
10
- * delta (text/thinking/tool_call/usage), so keep-alives cannot mask a stall.
11
- */
12
- function makeStream(chunk) {
13
- const encoder = new TextEncoder();
14
- let timer;
15
- const stream = new ReadableStream({
16
- start(controller) {
17
- timer = setInterval(() => {
18
- try {
19
- controller.enqueue(encoder.encode(chunk));
20
- }
21
- catch {
22
- // Controller already closed (reader cancelled) — stop the timer.
23
- if (timer)
24
- clearInterval(timer);
25
- }
26
- }, 10);
27
- },
28
- });
29
- return {
30
- reader: stream.getReader(),
31
- stop: () => {
32
- if (timer)
33
- clearInterval(timer);
34
- },
35
- };
36
- }
37
- describe('readChunkWithTimeout idle budget', () => {
38
- it('fires idle timeout even when keep-alive frames keep arriving (no content)', async () => {
39
- const { reader, stop } = makeStream(':\n\n'); // SSE comment = keep-alive
40
- const lastUsefulAt = Date.now() - 5_000; // last useful delta 5s ago
41
- const deadline = Date.now() + 30_000;
42
- const started = Date.now();
43
- await expect(readChunkWithTimeout(reader, {
44
- idleMs: 2_000,
45
- deadlineMs: deadline,
46
- lastUsefulAt: () => lastUsefulAt,
47
- })).rejects.toThrow(/idle/);
48
- // The timeout must fire promptly (not wait for the absolute deadline),
49
- // because the idle budget is already exhausted.
50
- expect(Date.now() - started).toBeLessThan(1_000);
51
- await reader.cancel('test done');
52
- stop();
53
- });
54
- it('does NOT fire idle when useful content keeps the budget fresh', async () => {
55
- const { reader, stop } = makeStream('data: {"choices":[{"delta":{"content":"x"}}]}\n\n');
56
- let lastUsefulAt = Date.now();
57
- // Read 3 chunks; with each chunk the caller would markUseful(), so the
58
- // idle budget never runs out. A single read returns the chunk.
59
- for (let i = 0; i < 3; i += 1) {
60
- const res = await readChunkWithTimeout(reader, {
61
- idleMs: 2_000,
62
- deadlineMs: Date.now() + 30_000,
63
- lastUsefulAt: () => lastUsefulAt,
64
- });
65
- expect(res.done).toBe(false);
66
- lastUsefulAt = Date.now(); // simulate markUseful()
67
- }
68
- await reader.cancel('test done');
69
- stop();
70
- });
71
- });
72
- //# sourceMappingURL=openai-compatible.timeout.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-compatible.timeout.test.js","sourceRoot":"","sources":["../../../src/cli/provider/openai-compatible.timeout.test.ts"],"names":[],"mappings":"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"}