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.
- package/README.md +5 -5
- package/dist/cli/hooks/useChatTurn.js +2 -1
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/kraken/candidateRegistry.js +15 -1
- package/dist/cli/kraken/candidateRegistry.js.map +1 -1
- package/dist/cli/kraken/verificationBridge.js +125 -14
- package/dist/cli/kraken/verificationBridge.js.map +1 -1
- package/dist/cli/kraken/verifierLifecycle.js +88 -0
- package/dist/cli/kraken/verifierLifecycle.js.map +1 -0
- package/dist/cli/kraken/verifyReport.js.map +1 -1
- package/dist/cli/main.bundled.js +272 -89
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/runHeadless.js +44 -93
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/tools/taskTool.js +49 -3
- package/dist/cli/tools/taskTool.js.map +1 -1
- package/package.json +8 -5
- package/dist/cli/ast/engine.test.js +0 -101
- package/dist/cli/ast/engine.test.js.map +0 -1
- package/dist/cli/ast/tools.test.js +0 -124
- package/dist/cli/ast/tools.test.js.map +0 -1
- package/dist/cli/headless.test.js +0 -107
- package/dist/cli/headless.test.js.map +0 -1
- package/dist/cli/headlessE2eSession.test.js +0 -189
- package/dist/cli/headlessE2eSession.test.js.map +0 -1
- package/dist/cli/headlessHistorySeed.test.js +0 -158
- package/dist/cli/headlessHistorySeed.test.js.map +0 -1
- package/dist/cli/headlessSessionEvent.test.js +0 -83
- package/dist/cli/headlessSessionEvent.test.js.map +0 -1
- package/dist/cli/headlessSpine.test.js +0 -153
- package/dist/cli/headlessSpine.test.js.map +0 -1
- package/dist/cli/hooks/observationStore.test.js +0 -135
- package/dist/cli/hooks/observationStore.test.js.map +0 -1
- package/dist/cli/hooks/sessionSurface.test.js +0 -112
- package/dist/cli/hooks/sessionSurface.test.js.map +0 -1
- package/dist/cli/kraken/candidateRegistry.test.js +0 -211
- package/dist/cli/kraken/candidateRegistry.test.js.map +0 -1
- package/dist/cli/kraken/completionGate.test.js +0 -172
- package/dist/cli/kraken/completionGate.test.js.map +0 -1
- package/dist/cli/kraken/evidenceAnchoring.test.js +0 -92
- package/dist/cli/kraken/evidenceAnchoring.test.js.map +0 -1
- package/dist/cli/kraken/executor.workbench.test.js +0 -134
- package/dist/cli/kraken/executor.workbench.test.js.map +0 -1
- package/dist/cli/kraken/metrics.test.js +0 -145
- package/dist/cli/kraken/metrics.test.js.map +0 -1
- package/dist/cli/kraken/nativeVerification.test.js +0 -207
- package/dist/cli/kraken/nativeVerification.test.js.map +0 -1
- package/dist/cli/kraken/planner.test.js +0 -43
- package/dist/cli/kraken/planner.test.js.map +0 -1
- package/dist/cli/kraken/scriptPlanner.test.js +0 -152
- package/dist/cli/kraken/scriptPlanner.test.js.map +0 -1
- package/dist/cli/kraken/selectionPlaybook.test.js +0 -55
- package/dist/cli/kraken/selectionPlaybook.test.js.map +0 -1
- package/dist/cli/kraken/skillSuggest.test.js +0 -157
- package/dist/cli/kraken/skillSuggest.test.js.map +0 -1
- package/dist/cli/kraken/strictDefaults.test.js +0 -149
- package/dist/cli/kraken/strictDefaults.test.js.map +0 -1
- package/dist/cli/kraken/turnRuntime.test.js +0 -377
- package/dist/cli/kraken/turnRuntime.test.js.map +0 -1
- package/dist/cli/kraken/verificationBridge.session.test.js +0 -104
- package/dist/cli/kraken/verificationBridge.session.test.js.map +0 -1
- package/dist/cli/kraken/verificationBridge.test.js +0 -177
- package/dist/cli/kraken/verificationBridge.test.js.map +0 -1
- package/dist/cli/kraken/verifier.test.js +0 -232
- package/dist/cli/kraken/verifier.test.js.map +0 -1
- package/dist/cli/kraken/verifierAdvisoryLock.test.js +0 -154
- package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +0 -1
- package/dist/cli/kraken/verifierRoundTrip.test.js +0 -166
- package/dist/cli/kraken/verifierRoundTrip.test.js.map +0 -1
- package/dist/cli/kraken/verifierSettings.test.js +0 -237
- package/dist/cli/kraken/verifierSettings.test.js.map +0 -1
- package/dist/cli/kraken/verifyReport.test.js +0 -111
- package/dist/cli/kraken/verifyReport.test.js.map +0 -1
- package/dist/cli/kraken/weaknessMeter.test.js +0 -212
- package/dist/cli/kraken/weaknessMeter.test.js.map +0 -1
- package/dist/cli/kraken/workbench.test.js +0 -253
- package/dist/cli/kraken/workbench.test.js.map +0 -1
- package/dist/cli/kraken/workbenchView.test.js +0 -130
- package/dist/cli/kraken/workbenchView.test.js.map +0 -1
- package/dist/cli/legacyContextIsolation.test.js +0 -65
- package/dist/cli/legacyContextIsolation.test.js.map +0 -1
- package/dist/cli/lsp/tools.test.js +0 -90
- package/dist/cli/lsp/tools.test.js.map +0 -1
- package/dist/cli/missionContinuation.test.js +0 -117
- package/dist/cli/missionContinuation.test.js.map +0 -1
- package/dist/cli/profileMatrix.test.js +0 -130
- package/dist/cli/profileMatrix.test.js.map +0 -1
- package/dist/cli/provider/capabilities.test.js +0 -46
- package/dist/cli/provider/capabilities.test.js.map +0 -1
- package/dist/cli/provider/openai-compatible.timeout.test.js +0 -72
- package/dist/cli/provider/openai-compatible.timeout.test.js.map +0 -1
- package/dist/cli/providerConfig.test.js +0 -85
- package/dist/cli/providerConfig.test.js.map +0 -1
- package/dist/cli/sessionReplayInvariant.test.js +0 -187
- package/dist/cli/sessionReplayInvariant.test.js.map +0 -1
- package/dist/cli/sessionSpine.test.js +0 -171
- package/dist/cli/sessionSpine.test.js.map +0 -1
- package/dist/cli/thinking.test.js +0 -214
- package/dist/cli/thinking.test.js.map +0 -1
- package/dist/cli/tools/inspectCommand.schema.test.js +0 -82
- package/dist/cli/tools/inspectCommand.schema.test.js.map +0 -1
- package/dist/cli/tools/inspectCommand.test.js +0 -311
- package/dist/cli/tools/inspectCommand.test.js.map +0 -1
- package/dist/cli/tools/krakenCsvFanout.test.js +0 -200
- package/dist/cli/tools/krakenCsvFanout.test.js.map +0 -1
- package/dist/cli/tools/krakenSelectTool.test.js +0 -246
- package/dist/cli/tools/krakenSelectTool.test.js.map +0 -1
- package/dist/cli/tools/observeBatch.test.js +0 -329
- package/dist/cli/tools/observeBatch.test.js.map +0 -1
- package/dist/cli/tools/taskTool.dynamicChecks.test.js +0 -156
- package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +0 -1
- package/dist/cli/tools/taskTool.planSafety.test.js +0 -280
- package/dist/cli/tools/taskTool.planSafety.test.js.map +0 -1
- package/dist/cli/tools/taskTool.verifyReport.test.js +0 -140
- package/dist/cli/tools/taskTool.verifyReport.test.js.map +0 -1
- package/dist/cli/utils/contextGrowthSummary.test.js +0 -74
- package/dist/cli/utils/contextGrowthSummary.test.js.map +0 -1
- package/dist/cli/workspace/planDriftCheck.test.js +0 -146
- package/dist/cli/workspace/planDriftCheck.test.js.map +0 -1
- package/dist/cli/workspace/planStore.test.js +0 -295
- package/dist/cli/workspace/planStore.test.js.map +0 -1
- package/dist/cli/zelariMission.test.js +0 -44
- package/dist/cli/zelariMission.test.js.map +0 -1
|
@@ -1,166 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifierRoundTrip.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierRoundTrip.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,oBAAoB,GAGrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,0BAA0B,EAC1B,gCAAgC,GACjC,MAAM,yBAAyB,CAAC;AAKjC,2CAA2C;AAC3C,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAW,CAAC;AACjE,wBAAwB;AACxB,MAAM,SAAS,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB,EAAW,CAAC;AAEjF,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,IAAI,QAA4B,CAAC;AAEjC,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACzD,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/E,aAAa,CACX,OAAO,CAAC,GAAG,CAAC,6BAA8B,EAC1C,IAAI,CAAC,SAAS,CACZ;QACE,gBAAgB,EAAE,OAAO,CAAC,QAAQ;QAClC,eAAe,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE;KACvD,EACD,IAAI,EACJ,CAAC,CACF,EACD,OAAO,CACR,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IACjD,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;;QACxE,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,QAAQ,CAAC;IAC1D,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAClF,SAAS,WAAW,CAClB,SAAyB,EACzB,SAA8C,EAC9C,OAAqB;IAErB,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/E,OAAO,IAAI,eAAe,CAAC;QACzB,MAAM;QACN,SAAS,EAAE,KAAK,IAAoC,EAAE,CAAC,CAAC;YACtD,IAAI,EAAE,oEAAoE;YAC1E,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC;QACF,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,KAAmB,CAAC,CAAC;QACpC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,+DAA+D;QAC/D,+CAA+C;QAC/C,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,sDAAsD;QACtD,MAAM,CAAC,0BAA0B,EAAE,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/D,0BAA0B;QAC1B,MAAM,SAAS,GAAG,0BAA0B,EAAE,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,iFAAiF;QACjF,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,OAAO,EAAE,oCAAoC;YAC7C,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;SAC9D,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,wEAAwE;QACxE,MAAM,OAAO,GAAG,cAAc,CAAC;YAC7B,gBAAgB,EAAE,SAAS,CAAC,QAAQ;YACpC,aAAa,EAAE,SAAS,CAAC,KAAK;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,8DAA8D;QAC9D,MAAM,CAAC,0BAA0B,EAAE,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvE,qCAAqC;QACrC,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,0BAA0B;QAC1B,MAAM,SAAS,GAAG,0BAA0B,EAAE,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;QAC3D,4EAA4E;QAC5E,mEAAmE;QACnE,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,OAAO,EAAE,oCAAoC;YAC7C,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;SAC9D,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAI,OAAO,CAAC,CAAC,CAAgB,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,wDAAwD;QACxD,MAAM,GAAG,GAAG,cAAc,CAAC;YACzB,gBAAgB,EAAE,SAAS,CAAC,QAAQ;YACpC,aAAa,EAAE,SAAS,CAAC,KAAK;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,yCAAyC;QACzC,MAAM,CAAC,0BAA0B,EAAE,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/D,6BAA6B;QAC7B,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,0BAA0B,EAAE,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,+CAA+C;QAC/C,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,OAAO,EAAE,oCAAoC;YAC7C,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;SAC9D,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAI,OAAO,CAAC,CAAC,CAAgB,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,gCAAgC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1G,MAAM,CAAC,gCAAgC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACpG,yCAAyC;QACzC,MAAM,CAAC,gCAAgC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5F,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* verifierSettings — Fase 9 settings tests (ADR-0020 §57/§64).
|
|
3
|
-
*
|
|
4
|
-
* Coverage required by the plan:
|
|
5
|
-
* - old provider.json (no krakenVerifier field) → verifier inherit
|
|
6
|
-
* - inherit → follows the current run model (parent identity)
|
|
7
|
-
* - explicit custom verifier → fixed model (survives parent changes)
|
|
8
|
-
* - missing/invalid custom verifier → parent model fallback
|
|
9
|
-
* - save/reload round-trip persists the override
|
|
10
|
-
* - --set-config flag parsing (verifier-provider/model/clear)
|
|
11
|
-
* - applySetConfig + snapshot exposure (Desktop save/reload)
|
|
12
|
-
*
|
|
13
|
-
* All file I/O is redirected to a temp file via ANATHEMA_PROVIDER_CONFIG_FILE.
|
|
14
|
-
*/
|
|
15
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
16
|
-
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
17
|
-
import { tmpdir } from 'node:os';
|
|
18
|
-
import path from 'node:path';
|
|
19
|
-
import { getProviderConfig, getKrakenVerifierOverride, setKrakenVerifier, clearKrakenVerifier, } from '../providerConfig.js';
|
|
20
|
-
import { parseSetConfigFlags, applySetConfig, buildDesktopConfigSnapshot, } from '../desktopConfig.js';
|
|
21
|
-
import { resolveKrakenVerifier } from './verifier.js';
|
|
22
|
-
let tmpDir = '';
|
|
23
|
-
let savedEnv;
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
tmpDir = mkdtempSync(path.join(tmpdir(), 'zelari-vf-'));
|
|
26
|
-
savedEnv = process.env.ANATHEMA_PROVIDER_CONFIG_FILE;
|
|
27
|
-
process.env.ANATHEMA_PROVIDER_CONFIG_FILE = path.join(tmpDir, 'provider.json');
|
|
28
|
-
delete process.env.ZELARI_KRAKEN_SELECT_PROVIDER;
|
|
29
|
-
delete process.env.ZELARI_KRAKEN_SELECT_MODEL;
|
|
30
|
-
});
|
|
31
|
-
afterEach(() => {
|
|
32
|
-
if (savedEnv === undefined)
|
|
33
|
-
delete process.env.ANATHEMA_PROVIDER_CONFIG_FILE;
|
|
34
|
-
else
|
|
35
|
-
process.env.ANATHEMA_PROVIDER_CONFIG_FILE = savedEnv;
|
|
36
|
-
rmSync(tmpDir, { recursive: true, force: true });
|
|
37
|
-
});
|
|
38
|
-
/** Write a provider.json blob (as an old or hand-edited file would look). */
|
|
39
|
-
function writeConfigFile(raw) {
|
|
40
|
-
writeFileSync(process.env.ANATHEMA_PROVIDER_CONFIG_FILE, JSON.stringify(raw, null, 2), 'utf-8');
|
|
41
|
-
}
|
|
42
|
-
const OLD_FILE = {
|
|
43
|
-
activeProviderId: 'grok',
|
|
44
|
-
modelByProvider: { grok: 'grok-4.6' },
|
|
45
|
-
};
|
|
46
|
-
const PARENT = { provider: 'grok', model: 'grok-4.6' };
|
|
47
|
-
describe('providerConfig.krakenVerifier', () => {
|
|
48
|
-
it('old provider.json without the field → override undefined (inherit)', () => {
|
|
49
|
-
writeConfigFile(OLD_FILE);
|
|
50
|
-
expect(getKrakenVerifierOverride()).toBeUndefined();
|
|
51
|
-
// inherit resolution: exact parent model, no LLM-config surprise
|
|
52
|
-
expect(resolveKrakenVerifier(PARENT)).toEqual(PARENT);
|
|
53
|
-
});
|
|
54
|
-
it('inherit → follows the current run model', () => {
|
|
55
|
-
writeConfigFile(OLD_FILE);
|
|
56
|
-
const otherParent = { provider: 'glm', model: 'glm-4.6' };
|
|
57
|
-
// no override + no env → whatever model the run resolved wins
|
|
58
|
-
expect(resolveKrakenVerifier(otherParent)).toEqual(otherParent);
|
|
59
|
-
});
|
|
60
|
-
it('explicit custom verifier → fixed model, independent of parent', () => {
|
|
61
|
-
writeConfigFile(OLD_FILE);
|
|
62
|
-
setKrakenVerifier('anthropic', 'claude-sonnet-4-6');
|
|
63
|
-
const override = getKrakenVerifierOverride();
|
|
64
|
-
expect(override).toEqual({ provider: 'anthropic', model: 'claude-sonnet-4-6' });
|
|
65
|
-
// parent changed → verifier stays fixed (the tool passes the persisted
|
|
66
|
-
// override as `explicit` — see krakenSelectTool wiring)
|
|
67
|
-
expect(resolveKrakenVerifier({ provider: 'grok', model: 'grok-4.6' }, process.env, getKrakenVerifierOverride())).toEqual({
|
|
68
|
-
provider: 'anthropic',
|
|
69
|
-
model: 'claude-sonnet-4-6',
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
it('save/reload round-trip: persisted override survives a fresh read', () => {
|
|
73
|
-
writeConfigFile(OLD_FILE);
|
|
74
|
-
setKrakenVerifier('minimax', 'MiniMax-M2.5');
|
|
75
|
-
const reloaded = getProviderConfig();
|
|
76
|
-
expect(reloaded.krakenVerifier).toEqual({ provider: 'minimax', model: 'MiniMax-M2.5' });
|
|
77
|
-
});
|
|
78
|
-
it('invalid overrides on disk are dropped → parent fallback', () => {
|
|
79
|
-
// partial (provider only)
|
|
80
|
-
writeConfigFile({ ...OLD_FILE, krakenVerifier: { provider: 'grok' } });
|
|
81
|
-
expect(getKrakenVerifierOverride()).toBeUndefined();
|
|
82
|
-
// unknown provider
|
|
83
|
-
writeConfigFile({
|
|
84
|
-
...OLD_FILE,
|
|
85
|
-
krakenVerifier: { provider: 'nope', model: 'm' },
|
|
86
|
-
});
|
|
87
|
-
expect(getKrakenVerifierOverride()).toBeUndefined();
|
|
88
|
-
// empty model
|
|
89
|
-
writeConfigFile({
|
|
90
|
-
...OLD_FILE,
|
|
91
|
-
krakenVerifier: { provider: 'grok', model: ' ' },
|
|
92
|
-
});
|
|
93
|
-
expect(getKrakenVerifierOverride()).toBeUndefined();
|
|
94
|
-
// non-object garbage
|
|
95
|
-
writeConfigFile({ ...OLD_FILE, krakenVerifier: 'grok' });
|
|
96
|
-
expect(getKrakenVerifierOverride()).toBeUndefined();
|
|
97
|
-
// in every case resolution falls back to the exact parent model
|
|
98
|
-
expect(resolveKrakenVerifier(PARENT)).toEqual(PARENT);
|
|
99
|
-
});
|
|
100
|
-
it('clearKrakenVerifier → back to inherit (no-op when already inherit)', () => {
|
|
101
|
-
writeConfigFile(OLD_FILE);
|
|
102
|
-
setKrakenVerifier('grok', 'grok-4.6');
|
|
103
|
-
clearKrakenVerifier();
|
|
104
|
-
expect(getKrakenVerifierOverride()).toBeUndefined();
|
|
105
|
-
expect(() => clearKrakenVerifier()).not.toThrow();
|
|
106
|
-
});
|
|
107
|
-
it('setKrakenVerifier validates provider and model', () => {
|
|
108
|
-
writeConfigFile(OLD_FILE);
|
|
109
|
-
expect(() => setKrakenVerifier('nope', 'm')).toThrow(/Unknown provider id/);
|
|
110
|
-
expect(() => setKrakenVerifier('grok', ' ')).toThrow(/cannot be empty/);
|
|
111
|
-
});
|
|
112
|
-
it('env override still wins when no persisted config exists', () => {
|
|
113
|
-
writeConfigFile(OLD_FILE);
|
|
114
|
-
const resolved = resolveKrakenVerifier(PARENT, {
|
|
115
|
-
ZELARI_KRAKEN_SELECT_PROVIDER: 'deepseek',
|
|
116
|
-
ZELARI_KRAKEN_SELECT_MODEL: 'deepseek-v4-pro',
|
|
117
|
-
});
|
|
118
|
-
expect(resolved).toEqual({ provider: 'deepseek', model: 'deepseek-v4-pro' });
|
|
119
|
-
});
|
|
120
|
-
it('persisted override is passed as `explicit` → beats env', () => {
|
|
121
|
-
writeConfigFile(OLD_FILE);
|
|
122
|
-
setKrakenVerifier('glm', 'glm-4.6');
|
|
123
|
-
const resolved = resolveKrakenVerifier(PARENT, {
|
|
124
|
-
ZELARI_KRAKEN_SELECT_PROVIDER: 'deepseek',
|
|
125
|
-
ZELARI_KRAKEN_SELECT_MODEL: 'deepseek-v4-pro',
|
|
126
|
-
}, getKrakenVerifierOverride());
|
|
127
|
-
expect(resolved).toEqual({ provider: 'glm', model: 'glm-4.6' });
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
describe('parseSetConfigFlags — verifier flags', () => {
|
|
131
|
-
it('valid: --verifier-provider + --verifier-model together', () => {
|
|
132
|
-
const res = parseSetConfigFlags([
|
|
133
|
-
'--set-config',
|
|
134
|
-
'--verifier-provider',
|
|
135
|
-
'anthropic',
|
|
136
|
-
'--verifier-model',
|
|
137
|
-
'claude-sonnet-4-6',
|
|
138
|
-
]);
|
|
139
|
-
expect(res.error).toBeUndefined();
|
|
140
|
-
expect(res.request?.verifierProvider).toBe('anthropic');
|
|
141
|
-
expect(res.request?.verifierModel).toBe('claude-sonnet-4-6');
|
|
142
|
-
expect(res.request?.verifierClear).toBeUndefined();
|
|
143
|
-
});
|
|
144
|
-
it('valid: --verifier-clear alone', () => {
|
|
145
|
-
const res = parseSetConfigFlags(['--set-config', '--verifier-clear']);
|
|
146
|
-
expect(res.error).toBeUndefined();
|
|
147
|
-
expect(res.request?.verifierClear).toBe(true);
|
|
148
|
-
expect(res.request?.verifierProvider).toBeUndefined();
|
|
149
|
-
});
|
|
150
|
-
it('provider without model → error', () => {
|
|
151
|
-
const res = parseSetConfigFlags(['--set-config', '--verifier-provider', 'grok']);
|
|
152
|
-
expect(res.request).toBeNull();
|
|
153
|
-
expect(res.error).toMatch(/must be used together/);
|
|
154
|
-
});
|
|
155
|
-
it('model without provider → error', () => {
|
|
156
|
-
const res = parseSetConfigFlags(['--set-config', '--verifier-model', 'm']);
|
|
157
|
-
expect(res.request).toBeNull();
|
|
158
|
-
expect(res.error).toMatch(/must be used together/);
|
|
159
|
-
});
|
|
160
|
-
it('clear + provider/model → conflict error', () => {
|
|
161
|
-
const res = parseSetConfigFlags([
|
|
162
|
-
'--set-config',
|
|
163
|
-
'--verifier-clear',
|
|
164
|
-
'--verifier-provider',
|
|
165
|
-
'grok',
|
|
166
|
-
'--verifier-model',
|
|
167
|
-
'm',
|
|
168
|
-
]);
|
|
169
|
-
expect(res.request).toBeNull();
|
|
170
|
-
expect(res.error).toMatch(/conflicts/);
|
|
171
|
-
});
|
|
172
|
-
it('empty values → error', () => {
|
|
173
|
-
const a = parseSetConfigFlags([
|
|
174
|
-
'--set-config',
|
|
175
|
-
'--verifier-provider',
|
|
176
|
-
' ',
|
|
177
|
-
'--verifier-model',
|
|
178
|
-
'm',
|
|
179
|
-
]);
|
|
180
|
-
expect(a.error).toMatch(/cannot be empty/);
|
|
181
|
-
const b = parseSetConfigFlags([
|
|
182
|
-
'--set-config',
|
|
183
|
-
'--verifier-provider',
|
|
184
|
-
'grok',
|
|
185
|
-
'--verifier-model',
|
|
186
|
-
'',
|
|
187
|
-
]);
|
|
188
|
-
expect(b.error).toMatch(/cannot be empty/);
|
|
189
|
-
});
|
|
190
|
-
it('no flags at all → still an error (same as before)', () => {
|
|
191
|
-
const res = parseSetConfigFlags(['--set-config']);
|
|
192
|
-
expect(res.request).toBeNull();
|
|
193
|
-
expect(res.error).toMatch(/--set-config requires/);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
describe('applySetConfig + snapshot — verifier persistence', () => {
|
|
197
|
-
it('set via flags → persisted → snapshot exposes it', () => {
|
|
198
|
-
writeConfigFile(OLD_FILE);
|
|
199
|
-
const res = applySetConfig({
|
|
200
|
-
verifierProvider: 'anthropic',
|
|
201
|
-
verifierModel: 'claude-sonnet-4-6',
|
|
202
|
-
});
|
|
203
|
-
expect(res.ok).toBe(true);
|
|
204
|
-
if (res.ok)
|
|
205
|
-
expect(res.message).toContain('verifier=anthropic/claude-sonnet-4-6');
|
|
206
|
-
const snap = buildDesktopConfigSnapshot();
|
|
207
|
-
expect(snap.krakenVerifier).toEqual({
|
|
208
|
-
provider: 'anthropic',
|
|
209
|
-
model: 'claude-sonnet-4-6',
|
|
210
|
-
});
|
|
211
|
-
// save/reload equality (Desktop round-trip)
|
|
212
|
-
expect(getKrakenVerifierOverride()).toEqual(snap.krakenVerifier);
|
|
213
|
-
});
|
|
214
|
-
it('unknown verifier provider → explicit error, nothing persisted', () => {
|
|
215
|
-
writeConfigFile(OLD_FILE);
|
|
216
|
-
const res = applySetConfig({ verifierProvider: 'nope', verifierModel: 'm' });
|
|
217
|
-
expect(res.ok).toBe(false);
|
|
218
|
-
if (!res.ok)
|
|
219
|
-
expect(res.error).toMatch(/unknown verifier provider/);
|
|
220
|
-
expect(getKrakenVerifierOverride()).toBeUndefined();
|
|
221
|
-
});
|
|
222
|
-
it('clear via flags → snapshot back to null (inherit)', () => {
|
|
223
|
-
writeConfigFile(OLD_FILE);
|
|
224
|
-
setKrakenVerifier('grok', 'grok-4.6');
|
|
225
|
-
const res = applySetConfig({ verifierClear: true });
|
|
226
|
-
expect(res.ok).toBe(true);
|
|
227
|
-
if (res.ok)
|
|
228
|
-
expect(res.message).toContain('verifier=inherit');
|
|
229
|
-
expect(buildDesktopConfigSnapshot().krakenVerifier).toBeNull();
|
|
230
|
-
});
|
|
231
|
-
it('fresh install (no file) → snapshot krakenVerifier null, inherit default', () => {
|
|
232
|
-
// no config file written in this tmp dir
|
|
233
|
-
const snap = buildDesktopConfigSnapshot();
|
|
234
|
-
expect(snap.krakenVerifier).toBeNull();
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
//# sourceMappingURL=verifierSettings.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifierSettings.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierSettings.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* verifyReport.test — Fase 7 (ADR-0020): structured verification.
|
|
3
|
-
* - parse `<verify-report>` blocks (pass/fail/unknown per required check)
|
|
4
|
-
* - unmatched / invalid / missing status → unknown (never pass)
|
|
5
|
-
* - wording-tolerant matching (normalized equality, then containment)
|
|
6
|
-
* - later duplicate blocks win
|
|
7
|
-
* - failed tentacle → allUnknownCheckResults
|
|
8
|
-
*/
|
|
9
|
-
import { describe, expect, it } from 'vitest';
|
|
10
|
-
import { allUnknownCheckResults, extractVerifyReportBlocks, parseVerifyReport, } from './verifyReport.js';
|
|
11
|
-
const CHECKS = [
|
|
12
|
-
'unit test for session refresh passes',
|
|
13
|
-
'no Set-Cookie regression on logout',
|
|
14
|
-
];
|
|
15
|
-
function block(check, status, note) {
|
|
16
|
-
return [
|
|
17
|
-
'<verify-report>',
|
|
18
|
-
`check: ${check}`,
|
|
19
|
-
`status: ${status}`,
|
|
20
|
-
...(note ? [`note: ${note}`] : []),
|
|
21
|
-
'</verify-report>',
|
|
22
|
-
].join('\n');
|
|
23
|
-
}
|
|
24
|
-
const REPORTED = [
|
|
25
|
-
'Ran the targeted suite.',
|
|
26
|
-
block(CHECKS[0], 'pass', 'vitest src/auth 41/41 green'),
|
|
27
|
-
block(CHECKS[1], 'fail', 'logout still emits double Set-Cookie'),
|
|
28
|
-
].join('\n');
|
|
29
|
-
describe('extractVerifyReportBlocks', () => {
|
|
30
|
-
it('extracts blocks with check/status/note', () => {
|
|
31
|
-
const blocks = extractVerifyReportBlocks(REPORTED);
|
|
32
|
-
expect(blocks).toHaveLength(2);
|
|
33
|
-
expect(blocks[0]).toMatchObject({ check: CHECKS[0], status: 'pass', note: 'vitest src/auth 41/41 green' });
|
|
34
|
-
expect(blocks[1]).toMatchObject({ check: CHECKS[1], status: 'fail' });
|
|
35
|
-
});
|
|
36
|
-
it('skips blocks without a check line and tolerates prose between blocks', () => {
|
|
37
|
-
const raw = [
|
|
38
|
-
'prose',
|
|
39
|
-
'<verify-report>',
|
|
40
|
-
'status: pass',
|
|
41
|
-
'</verify-report>',
|
|
42
|
-
'more prose',
|
|
43
|
-
block('some check', 'unknown'),
|
|
44
|
-
].join('\n');
|
|
45
|
-
const blocks = extractVerifyReportBlocks(raw);
|
|
46
|
-
expect(blocks).toHaveLength(1);
|
|
47
|
-
expect(blocks[0].check).toBe('some check');
|
|
48
|
-
});
|
|
49
|
-
it('stops at an unterminated block (no close tag)', () => {
|
|
50
|
-
const raw = '<verify-report>\ncheck: x\nstatus: pass';
|
|
51
|
-
expect(extractVerifyReportBlocks(raw)).toEqual([]);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
describe('parseVerifyReport', () => {
|
|
55
|
-
it('maps each required check to its reported status', () => {
|
|
56
|
-
const results = parseVerifyReport(REPORTED, CHECKS);
|
|
57
|
-
expect(results[0]).toMatchObject({ check: CHECKS[0], status: 'pass' });
|
|
58
|
-
expect(results[1]).toMatchObject({ check: CHECKS[1], status: 'fail' });
|
|
59
|
-
});
|
|
60
|
-
it('unmatched check → unknown, never pass', () => {
|
|
61
|
-
const raw = block(CHECKS[0], 'pass');
|
|
62
|
-
const results = parseVerifyReport(raw, CHECKS);
|
|
63
|
-
expect(results[0].status).toBe('pass');
|
|
64
|
-
expect(results[1].status).toBe('unknown');
|
|
65
|
-
expect(results[1].note).toContain('no verify-report block');
|
|
66
|
-
});
|
|
67
|
-
it('invalid status word → unknown', () => {
|
|
68
|
-
const raw = block(CHECKS[0], 'mostly-fine');
|
|
69
|
-
expect(parseVerifyReport(raw, [CHECKS[0]])[0].status).toBe('unknown');
|
|
70
|
-
});
|
|
71
|
-
it('missing status line → unknown', () => {
|
|
72
|
-
const raw = ['<verify-report>', `check: ${CHECKS[0]}`, '</verify-report>'].join('\n');
|
|
73
|
-
expect(parseVerifyReport(raw, [CHECKS[0]])[0].status).toBe('unknown');
|
|
74
|
-
});
|
|
75
|
-
it('matches a lightly reworded criterion (containment, case-insensitive)', () => {
|
|
76
|
-
const raw = block('Unit test for Session REFRESH passes (targeted)', 'pass');
|
|
77
|
-
expect(parseVerifyReport(raw, [CHECKS[0]])[0].status).toBe('pass');
|
|
78
|
-
});
|
|
79
|
-
it('later duplicate block for the same check wins (self-correction)', () => {
|
|
80
|
-
const raw = [block(CHECKS[0], 'fail'), block(CHECKS[0], 'pass', 're-ran: green')].join('\n');
|
|
81
|
-
const results = parseVerifyReport(raw, [CHECKS[0]]);
|
|
82
|
-
expect(results[0].status).toBe('pass');
|
|
83
|
-
expect(results[0].note).toBe('re-ran: green');
|
|
84
|
-
});
|
|
85
|
-
it('no blocks at all → every check unknown', () => {
|
|
86
|
-
const results = parseVerifyReport('plain conclusion, no structure', CHECKS);
|
|
87
|
-
expect(results.map((r) => r.status)).toEqual(['unknown', 'unknown']);
|
|
88
|
-
});
|
|
89
|
-
it('empty required list → empty results', () => {
|
|
90
|
-
expect(parseVerifyReport(REPORTED, [])).toEqual([]);
|
|
91
|
-
});
|
|
92
|
-
it('unknown status from a legit `unknown` report is preserved verbatim', () => {
|
|
93
|
-
const raw = block(CHECKS[0], 'unknown', 'grep timed out');
|
|
94
|
-
const results = parseVerifyReport(raw, [CHECKS[0]]);
|
|
95
|
-
expect(results[0]).toMatchObject({ status: 'unknown', note: 'grep timed out' });
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
describe('allUnknownCheckResults', () => {
|
|
99
|
-
it('marks every check unknown with the failure reason', () => {
|
|
100
|
-
const results = allUnknownCheckResults(CHECKS, 'verify tentacle failed: timeout');
|
|
101
|
-
expect(results).toHaveLength(2);
|
|
102
|
-
for (const r of results) {
|
|
103
|
-
expect(r.status).toBe('unknown');
|
|
104
|
-
expect(r.note).toBe('verify tentacle failed: timeout');
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
it('empty list → empty results', () => {
|
|
108
|
-
expect(allUnknownCheckResults([], 'x')).toEqual([]);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
//# sourceMappingURL=verifyReport.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifyReport.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifyReport.test.ts"],"names":[],"mappings":"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"}
|