zelari-code 2.0.0-alpha.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/cli/headless.js +9 -0
  2. package/dist/cli/headless.js.map +1 -1
  3. package/dist/cli/headlessE2eSession.test.js +189 -0
  4. package/dist/cli/headlessE2eSession.test.js.map +1 -0
  5. package/dist/cli/headlessSessionEvent.test.js +83 -0
  6. package/dist/cli/headlessSessionEvent.test.js.map +1 -0
  7. package/dist/cli/headlessSpine.js +25 -0
  8. package/dist/cli/headlessSpine.js.map +1 -1
  9. package/dist/cli/hooks/chatState.js.map +1 -1
  10. package/dist/cli/hooks/eventsToMessages.js.map +1 -1
  11. package/dist/cli/hooks/useChatTurn.js +40 -7
  12. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  13. package/dist/cli/hooks/useSession.js +0 -2
  14. package/dist/cli/hooks/useSession.js.map +1 -1
  15. package/dist/cli/kraken/evidenceAnchoring.test.js +92 -0
  16. package/dist/cli/kraken/evidenceAnchoring.test.js.map +1 -0
  17. package/dist/cli/kraken/nativeVerification.js +113 -0
  18. package/dist/cli/kraken/nativeVerification.js.map +1 -0
  19. package/dist/cli/kraken/nativeVerification.test.js +207 -0
  20. package/dist/cli/kraken/nativeVerification.test.js.map +1 -0
  21. package/dist/cli/kraken/strictDefaults.test.js +149 -0
  22. package/dist/cli/kraken/strictDefaults.test.js.map +1 -0
  23. package/dist/cli/kraken/verificationBridge.js +121 -8
  24. package/dist/cli/kraken/verificationBridge.js.map +1 -1
  25. package/dist/cli/kraken/verificationBridge.session.test.js +104 -0
  26. package/dist/cli/kraken/verificationBridge.session.test.js.map +1 -0
  27. package/dist/cli/kraken/verificationBridge.test.js +63 -17
  28. package/dist/cli/kraken/verificationBridge.test.js.map +1 -1
  29. package/dist/cli/kraken/verifierAdvisoryLock.test.js +154 -0
  30. package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +1 -0
  31. package/dist/cli/kraken/verifierResolution.js +28 -0
  32. package/dist/cli/kraken/verifierResolution.js.map +1 -0
  33. package/dist/cli/kraken/verifierRoundTrip.test.js +166 -0
  34. package/dist/cli/kraken/verifierRoundTrip.test.js.map +1 -0
  35. package/dist/cli/legacyContextIsolation.test.js +65 -0
  36. package/dist/cli/legacyContextIsolation.test.js.map +1 -0
  37. package/dist/cli/main.bundled.js +893 -317
  38. package/dist/cli/main.bundled.js.map +4 -4
  39. package/dist/cli/missionContinuation.test.js +117 -0
  40. package/dist/cli/missionContinuation.test.js.map +1 -0
  41. package/dist/cli/profileMatrix.test.js +130 -0
  42. package/dist/cli/profileMatrix.test.js.map +1 -0
  43. package/dist/cli/runHeadless.js +68 -8
  44. package/dist/cli/runHeadless.js.map +1 -1
  45. package/dist/cli/sessionManager.js +7 -0
  46. package/dist/cli/sessionManager.js.map +1 -1
  47. package/dist/cli/sessionSpine.js +43 -3
  48. package/dist/cli/sessionSpine.js.map +1 -1
  49. package/dist/cli/zelariMission.js +16 -0
  50. package/dist/cli/zelariMission.js.map +1 -1
  51. package/package.json +3 -3
@@ -0,0 +1,166 @@
1
+ /**
2
+ * verifierRoundTrip — Desktop verifier round-trip smoke (Exit-3.1, plan §9).
3
+ *
4
+ * Locks the FULL chain the plan requires:
5
+ *
6
+ * Desktop settings (applySetConfig — the real --set-config channel)
7
+ * → persist (provider.json)
8
+ * → restart/load (fresh disk read)
9
+ * → runtime resolution (loadVerifierModelSelection)
10
+ * → VerifierService.reviewCompletion
11
+ * → verification.run event logs the ACTUAL model used
12
+ *
13
+ * The three cases from the plan (§9):
14
+ * - Inherit: Primary=A, Verifier=inherit → effective verifier = A
15
+ * - Dedicated: Primary=A, Verifier=B → effective verifier = B
16
+ * - Reset: Dedicated B → clear override → inherit A
17
+ *
18
+ * The model call is stubbed at the transport boundary (callModel), reporting
19
+ * the provider/model the selected transport would actually use: in inherit
20
+ * mode the session transport (A), in fixed mode the dedicated transport (B).
21
+ */
22
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
23
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
24
+ import { tmpdir } from 'node:os';
25
+ import path from 'node:path';
26
+ import { VerifierService, VerifierConfigSchema, } from '@zelari/core/verification';
27
+ import { getKrakenVerifierOverride } from '../providerConfig.js';
28
+ import { applySetConfig, buildDesktopConfigSnapshot } from '../desktopConfig.js';
29
+ import { loadVerifierModelSelection, verifierOverrideToModelSelection, } from './verifierResolution.js';
30
+ // Primary model A (the session/run model).
31
+ const PRIMARY = { provider: 'grok', model: 'grok-4.6' };
32
+ // Dedicated verifier B.
33
+ const DEDICATED = { provider: 'anthropic', model: 'claude-sonnet-4-6' };
34
+ let tmpDir = '';
35
+ let savedEnv;
36
+ beforeEach(() => {
37
+ tmpDir = mkdtempSync(path.join(tmpdir(), 'zelari-vrt-'));
38
+ savedEnv = process.env.ANATHEMA_PROVIDER_CONFIG_FILE;
39
+ process.env.ANATHEMA_PROVIDER_CONFIG_FILE = path.join(tmpDir, 'provider.json');
40
+ writeFileSync(process.env.ANATHEMA_PROVIDER_CONFIG_FILE, JSON.stringify({
41
+ activeProviderId: PRIMARY.provider,
42
+ modelByProvider: { [PRIMARY.provider]: PRIMARY.model },
43
+ }, null, 2), 'utf-8');
44
+ delete process.env.ZELARI_KRAKEN_SELECT_PROVIDER;
45
+ delete process.env.ZELARI_KRAKEN_SELECT_MODEL;
46
+ });
47
+ afterEach(() => {
48
+ if (savedEnv === undefined)
49
+ delete process.env.ANATHEMA_PROVIDER_CONFIG_FILE;
50
+ else
51
+ process.env.ANATHEMA_PROVIDER_CONFIG_FILE = savedEnv;
52
+ rmSync(tmpDir, { recursive: true, force: true });
53
+ });
54
+ /** Enabled VerifierService from the resolved selection; captures spine events. */
55
+ function verifierFor(selection, transport, emitted) {
56
+ const config = VerifierConfigSchema.parse({ enabled: true, model: selection });
57
+ return new VerifierService({
58
+ config,
59
+ callModel: async () => ({
60
+ text: '{"verdict":"confirmed","score":0.9,"rationale":"round-trip smoke"}',
61
+ provider: transport.provider,
62
+ model: transport.model,
63
+ }),
64
+ emit: async (input) => {
65
+ emitted.push(input);
66
+ },
67
+ });
68
+ }
69
+ describe('Desktop verifier round-trip (Exit-3.1)', () => {
70
+ it('Inherit: Primary=A, Verifier=inherit → effective verifier = A, event logs A', async () => {
71
+ // (1) Desktop settings: no override (the recommended default).
72
+ // (2) Restart/load: fresh disk read → inherit.
73
+ expect(getKrakenVerifierOverride()).toBeUndefined();
74
+ // UI reload leg: the snapshot exposes null = inherit.
75
+ expect(buildDesktopConfigSnapshot().krakenVerifier).toBeNull();
76
+ // (3) Runtime resolution.
77
+ const selection = loadVerifierModelSelection();
78
+ expect(selection).toEqual({ mode: 'inherit' });
79
+ // (4)+(5) Review + spine event: the session transport reports the primary model.
80
+ const emitted = [];
81
+ const verifier = verifierFor(selection, PRIMARY, emitted);
82
+ const review = await verifier.reviewCompletion({
83
+ summary: 'round-trip smoke: all checks green',
84
+ results: [],
85
+ session: { provider: PRIMARY.provider, model: PRIMARY.model },
86
+ });
87
+ expect(review.effectiveModel).toEqual({ mode: 'inherit', ...PRIMARY });
88
+ expect(emitted).toHaveLength(1);
89
+ expect(emitted[0].kind).toBe('verification.run');
90
+ const data = emitted[0].data;
91
+ expect(data.source).toBe('verifier-model');
92
+ expect(data.selectionMode).toBe('inherit');
93
+ expect(data.provider).toBe(PRIMARY.provider);
94
+ expect(data.model).toBe(PRIMARY.model);
95
+ });
96
+ it('Dedicated: Primary=A, Verifier=B → effective verifier = B, event logs B', async () => {
97
+ // (1) Desktop settings → persist through the real --set-config channel.
98
+ const applied = applySetConfig({
99
+ verifierProvider: DEDICATED.provider,
100
+ verifierModel: DEDICATED.model,
101
+ });
102
+ expect(applied.ok).toBe(true);
103
+ // UI reload leg: the snapshot exposes the dedicated override.
104
+ expect(buildDesktopConfigSnapshot().krakenVerifier).toEqual(DEDICATED);
105
+ // (2) Restart/load: fresh disk read.
106
+ expect(getKrakenVerifierOverride()).toEqual(DEDICATED);
107
+ // (3) Runtime resolution.
108
+ const selection = loadVerifierModelSelection();
109
+ expect(selection).toEqual({ mode: 'fixed', ...DEDICATED });
110
+ // (4)+(5) Review + spine: the dedicated transport reports B even though the
111
+ // session model is A — this is the "event logs actual model" lock.
112
+ const emitted = [];
113
+ const verifier = verifierFor(selection, DEDICATED, emitted);
114
+ const review = await verifier.reviewCompletion({
115
+ summary: 'round-trip smoke: all checks green',
116
+ results: [],
117
+ session: { provider: PRIMARY.provider, model: PRIMARY.model },
118
+ });
119
+ expect(review.effectiveModel).toEqual({ mode: 'fixed', ...DEDICATED });
120
+ const data = emitted[0].data;
121
+ expect(data.selectionMode).toBe('fixed');
122
+ expect(data.provider).toBe(DEDICATED.provider);
123
+ expect(data.model).toBe(DEDICATED.model);
124
+ });
125
+ it('Reset: Dedicated B → clear override → inherit A', async () => {
126
+ // Start dedicated, then reset through the real channel.
127
+ const set = applySetConfig({
128
+ verifierProvider: DEDICATED.provider,
129
+ verifierModel: DEDICATED.model,
130
+ });
131
+ expect(set.ok).toBe(true);
132
+ const cleared = applySetConfig({ verifierClear: true });
133
+ expect(cleared.ok).toBe(true);
134
+ // UI reload leg: back to null (inherit).
135
+ expect(buildDesktopConfigSnapshot().krakenVerifier).toBeNull();
136
+ // Restart/load + resolution.
137
+ expect(getKrakenVerifierOverride()).toBeUndefined();
138
+ const selection = loadVerifierModelSelection();
139
+ expect(selection).toEqual({ mode: 'inherit' });
140
+ // Review + spine: back to the primary model A.
141
+ const emitted = [];
142
+ const verifier = verifierFor(selection, PRIMARY, emitted);
143
+ const review = await verifier.reviewCompletion({
144
+ summary: 'round-trip smoke: all checks green',
145
+ results: [],
146
+ session: { provider: PRIMARY.provider, model: PRIMARY.model },
147
+ });
148
+ expect(review.effectiveModel).toEqual({ mode: 'inherit', ...PRIMARY });
149
+ const data = emitted[0].data;
150
+ expect(data.selectionMode).toBe('inherit');
151
+ expect(data.model).toBe(PRIMARY.model);
152
+ });
153
+ it('verifierOverrideToModelSelection: partial/blank overrides degrade to inherit', () => {
154
+ expect(verifierOverrideToModelSelection(undefined)).toEqual({ mode: 'inherit' });
155
+ expect(verifierOverrideToModelSelection(null)).toEqual({ mode: 'inherit' });
156
+ expect(verifierOverrideToModelSelection({ provider: 'grok', model: ' ' })).toEqual({ mode: 'inherit' });
157
+ expect(verifierOverrideToModelSelection({ provider: '', model: 'm' })).toEqual({ mode: 'inherit' });
158
+ // Complete overrides are fixed, trimmed.
159
+ expect(verifierOverrideToModelSelection({ provider: ' grok ', model: ' grok-4.6 ' })).toEqual({
160
+ mode: 'fixed',
161
+ provider: 'grok',
162
+ model: 'grok-4.6',
163
+ });
164
+ });
165
+ });
166
+ //# sourceMappingURL=verifierRoundTrip.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifierRoundTrip.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierRoundTrip.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacyContextIsolation.test.js","sourceRoot":"","sources":["../../src/cli/legacyContextIsolation.test.ts"],"names":[],"mappings":"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"}