zelari-code 2.1.0 → 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 +4 -4
- 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/evidenceProvenance.test.js +0 -113
- package/dist/cli/kraken/evidenceProvenance.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/strictGatePackIndependence.test.js +0 -112
- package/dist/cli/kraken/strictGatePackIndependence.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/verifierLifecycle.test.js +0 -181
- package/dist/cli/kraken/verifierLifecycle.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,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* verificationBridge tests (ADR-0023 host integration).
|
|
3
|
-
*
|
|
4
|
-
* Covers: check→contract mapping with tolerant matching, the pass-without-
|
|
5
|
-
* evidence rule, ZELARI_STRICT_DONE composition (blockers add, never
|
|
6
|
-
* subtract), and the machine-readable payload shape.
|
|
7
|
-
*/
|
|
8
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
9
|
-
import { evaluateStrictBuildGate, krakenResultsToContract, strictDoneEnabled, strictGateEventPayload, strictGateExitCode, } from './verificationBridge.js';
|
|
10
|
-
import { resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection, } from './candidateRegistry.js';
|
|
11
|
-
const CHECKS = ['session survives concurrent refresh', 'rotated cookie rejects the old token'];
|
|
12
|
-
/** Fake spine emitter that stamps sequential seq so notes become event-backed. */
|
|
13
|
-
function emitSeq() {
|
|
14
|
-
let n = 1;
|
|
15
|
-
return async () => ({ seq: n++ });
|
|
16
|
-
}
|
|
17
|
-
function selectWithChecks(checks) {
|
|
18
|
-
resetKrakenCandidates();
|
|
19
|
-
setKrakenSelection({
|
|
20
|
-
status: 'selected',
|
|
21
|
-
winnerIndex: 1,
|
|
22
|
-
rationale: 'stronger evidence',
|
|
23
|
-
requiredChecks: checks,
|
|
24
|
-
degraded: false,
|
|
25
|
-
verifier: null,
|
|
26
|
-
judgedBy: 'llm',
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
let envPrev;
|
|
30
|
-
beforeEach(() => {
|
|
31
|
-
envPrev = process.env.ZELARI_STRICT_DONE;
|
|
32
|
-
resetKrakenCandidates();
|
|
33
|
-
});
|
|
34
|
-
afterEach(() => {
|
|
35
|
-
if (envPrev === undefined)
|
|
36
|
-
delete process.env.ZELARI_STRICT_DONE;
|
|
37
|
-
else
|
|
38
|
-
process.env.ZELARI_STRICT_DONE = envPrev;
|
|
39
|
-
resetKrakenCandidates();
|
|
40
|
-
});
|
|
41
|
-
describe('krakenResultsToContract', () => {
|
|
42
|
-
it('maps every required check to a required criterion with a stable id', async () => {
|
|
43
|
-
const contract = krakenResultsToContract(CHECKS, [], 1000);
|
|
44
|
-
expect(contract.criteria).toHaveLength(2);
|
|
45
|
-
expect(contract.criteria.every((c) => c.required && c.source === 'kraken-selection')).toBe(true);
|
|
46
|
-
expect(contract.results.every((r) => r.status === 'unknown' && r.source === 'verify-agent')).toBe(true);
|
|
47
|
-
});
|
|
48
|
-
it('a pass WITH a note carries evidence; a pass WITHOUT a note does not', async () => {
|
|
49
|
-
const results = [
|
|
50
|
-
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
51
|
-
{ check: CHECKS[1], status: 'pass' },
|
|
52
|
-
];
|
|
53
|
-
const contract = krakenResultsToContract(CHECKS, results, 2000);
|
|
54
|
-
expect(contract.results[0].evidence).toHaveLength(1);
|
|
55
|
-
expect(contract.results[0].evidence[0].tier).toBe('tool-output');
|
|
56
|
-
expect(contract.results[1].evidence).toHaveLength(0);
|
|
57
|
-
});
|
|
58
|
-
it('tolerates lightly reworded check text (containment matching)', async () => {
|
|
59
|
-
const results = [
|
|
60
|
-
{ check: 'Session survives concurrent REFRESH (reworded)', status: 'pass', note: 'x' },
|
|
61
|
-
];
|
|
62
|
-
const contract = krakenResultsToContract([CHECKS[0]], results);
|
|
63
|
-
expect(contract.results[0].status).toBe('pass');
|
|
64
|
-
expect(contract.results[0].evidence).toHaveLength(1);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
describe('evaluateStrictBuildGate', () => {
|
|
68
|
-
it('strict off (default): mirrors the legacy gate exactly', async () => {
|
|
69
|
-
delete process.env.ZELARI_STRICT_DONE;
|
|
70
|
-
expect(strictDoneEnabled()).toBe(false);
|
|
71
|
-
selectWithChecks(CHECKS);
|
|
72
|
-
setKrakenCheckResults([
|
|
73
|
-
{ check: CHECKS[0], status: 'pass', note: 'ok' },
|
|
74
|
-
{ check: CHECKS[1], status: 'fail', note: 'assert' },
|
|
75
|
-
]);
|
|
76
|
-
const evaluation = await evaluateStrictBuildGate('build');
|
|
77
|
-
expect(evaluation.strict).toBe(false);
|
|
78
|
-
expect(evaluation.evaluation).toBeNull();
|
|
79
|
-
expect(evaluation.blocked).toBe(true);
|
|
80
|
-
});
|
|
81
|
-
it('strict on + all pass with notes → PASS', async () => {
|
|
82
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
83
|
-
selectWithChecks(CHECKS);
|
|
84
|
-
setKrakenCheckResults([
|
|
85
|
-
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
86
|
-
{ check: CHECKS[1], status: 'pass', note: 'curl 401' },
|
|
87
|
-
]);
|
|
88
|
-
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
89
|
-
expect(evaluation.strict).toBe(true);
|
|
90
|
-
expect(evaluation.evaluation.verdict).toBe('PASS');
|
|
91
|
-
expect(evaluation.blocked).toBe(false);
|
|
92
|
-
});
|
|
93
|
-
it('strict on + notes without spine emit → BLOCKED (event-backed required)', async () => {
|
|
94
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
95
|
-
selectWithChecks(CHECKS);
|
|
96
|
-
setKrakenCheckResults([
|
|
97
|
-
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
98
|
-
{ check: CHECKS[1], status: 'pass', note: 'curl 401' },
|
|
99
|
-
]);
|
|
100
|
-
const evaluation = await evaluateStrictBuildGate('build'); // no emit → unanchored
|
|
101
|
-
expect(evaluation.evaluation.verdict).toBe('BLOCKED');
|
|
102
|
-
expect(evaluation.evaluation.unsatisfied[0].reason).toContain('event-backed');
|
|
103
|
-
});
|
|
104
|
-
it('strict on + pass WITHOUT evidence → BLOCKED (false-done guard)', async () => {
|
|
105
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
106
|
-
selectWithChecks(CHECKS);
|
|
107
|
-
setKrakenCheckResults([
|
|
108
|
-
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
109
|
-
{ check: CHECKS[1], status: 'pass' }, // no note → no evidence
|
|
110
|
-
]);
|
|
111
|
-
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
112
|
-
expect(evaluation.evaluation.verdict).toBe('BLOCKED');
|
|
113
|
-
expect(evaluation.blocked).toBe(true);
|
|
114
|
-
expect(evaluation.evaluation.unsatisfied[0].status).toBe('unknown');
|
|
115
|
-
expect(evaluation.evaluation.unsatisfied[0].reason).toContain('without evidence');
|
|
116
|
-
});
|
|
117
|
-
it('strict on + legacy fail → REPAIR_REQUIRED (fail wins over unknown)', async () => {
|
|
118
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
119
|
-
selectWithChecks(CHECKS);
|
|
120
|
-
setKrakenCheckResults([
|
|
121
|
-
{ check: CHECKS[0], status: 'fail', note: 'assert false' },
|
|
122
|
-
{ check: CHECKS[1], status: 'unknown' },
|
|
123
|
-
]);
|
|
124
|
-
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
125
|
-
expect(evaluation.evaluation.verdict).toBe('REPAIR_REQUIRED');
|
|
126
|
-
expect(evaluation.blocked).toBe(true);
|
|
127
|
-
});
|
|
128
|
-
it('PLAN turns and turns without selection stay open', async () => {
|
|
129
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
130
|
-
expect((await evaluateStrictBuildGate('plan')).blocked).toBe(false);
|
|
131
|
-
resetKrakenCandidates();
|
|
132
|
-
expect((await evaluateStrictBuildGate('build')).blocked).toBe(false);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
describe('strictGateEventPayload', () => {
|
|
136
|
-
it('is JSON-serializable and carries both gate layers', async () => {
|
|
137
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
138
|
-
selectWithChecks(CHECKS);
|
|
139
|
-
setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'n' }]);
|
|
140
|
-
const payload = strictGateEventPayload(await evaluateStrictBuildGate('build', { emit: emitSeq() }));
|
|
141
|
-
expect(() => JSON.stringify(payload)).not.toThrow();
|
|
142
|
-
expect(payload).toMatchObject({ strict: true, engine: 'kraken-legacy+completion-policy' });
|
|
143
|
-
expect(payload.legacy).toMatchObject({ total: 2 });
|
|
144
|
-
expect(payload.evidence).not.toBeNull();
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
describe('strictGateExitCode (E2.2 — blocked strict done closes non-success)', () => {
|
|
148
|
-
it('strict on + blocked after repair → dedicated exit code 4', async () => {
|
|
149
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
150
|
-
selectWithChecks(CHECKS);
|
|
151
|
-
setKrakenCheckResults([
|
|
152
|
-
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
153
|
-
{ check: CHECKS[1], status: 'unknown' },
|
|
154
|
-
]);
|
|
155
|
-
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
156
|
-
expect(evaluation.blocked).toBe(true);
|
|
157
|
-
expect(strictGateExitCode(evaluation)).toBe(4);
|
|
158
|
-
});
|
|
159
|
-
it('strict on + evidence complete → 0 (run outcome unchanged)', async () => {
|
|
160
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
161
|
-
selectWithChecks([CHECKS[0]]);
|
|
162
|
-
setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' }]);
|
|
163
|
-
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
164
|
-
expect(evaluation.blocked).toBe(false);
|
|
165
|
-
expect(strictGateExitCode(evaluation)).toBe(0);
|
|
166
|
-
});
|
|
167
|
-
it('strict off + legacy blocked → 0 (enforcement is strict-only)', async () => {
|
|
168
|
-
delete process.env.ZELARI_STRICT_DONE;
|
|
169
|
-
selectWithChecks(CHECKS);
|
|
170
|
-
setKrakenCheckResults([{ check: CHECKS[0], status: 'fail', note: 'red' }]);
|
|
171
|
-
const evaluation = await evaluateStrictBuildGate('build');
|
|
172
|
-
expect(evaluation.blocked).toBe(true);
|
|
173
|
-
expect(evaluation.strict).toBe(false);
|
|
174
|
-
expect(strictGateExitCode(evaluation)).toBe(0);
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
//# sourceMappingURL=verificationBridge.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verificationBridge.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verificationBridge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* verifier.test — Fase 4 (ADR-0020) unit tests for the Kraken selection
|
|
3
|
-
* verifier: identity resolution (parent-exact default), judging prompt
|
|
4
|
-
* rules, lenient verdict parsing, and the never-throw fallback contract.
|
|
5
|
-
*/
|
|
6
|
-
import { describe, expect, it } from 'vitest';
|
|
7
|
-
import { buildSelectionPrompt, parseSelectionVerdict, resolveKrakenVerifier, runKrakenSelection, VERIFIER_SYSTEM_PROMPT, } from './verifier.js';
|
|
8
|
-
const PARENT = { provider: 'grok', model: 'grok-4-fast' };
|
|
9
|
-
function okCandidate(index, hypothesis, opts = {}) {
|
|
10
|
-
return {
|
|
11
|
-
status: 'ok',
|
|
12
|
-
index,
|
|
13
|
-
description: `candidate ${index}`,
|
|
14
|
-
report: {
|
|
15
|
-
hypothesis,
|
|
16
|
-
evidence: [
|
|
17
|
-
{ claim: `claim-${index}`, basis: `file:${index}`, degraded: opts.degraded === true },
|
|
18
|
-
],
|
|
19
|
-
risks: [],
|
|
20
|
-
hasDegradedEvidence: opts.degraded === true,
|
|
21
|
-
},
|
|
22
|
-
raw: '',
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
function malformedCandidate(index) {
|
|
26
|
-
return {
|
|
27
|
-
status: 'malformed',
|
|
28
|
-
index,
|
|
29
|
-
description: `candidate ${index}`,
|
|
30
|
-
error: 'missing report block',
|
|
31
|
-
raw: 'no block',
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
const verdictJson = (o) => `<selection-verdict>\n${JSON.stringify(o, null, 2)}\n</selection-verdict>`;
|
|
35
|
-
// ── resolveKrakenVerifier ──────────────────────────────────────────────────
|
|
36
|
-
describe('resolveKrakenVerifier', () => {
|
|
37
|
-
it('defaults to the EXACT parent identity (no cheap-model routing)', () => {
|
|
38
|
-
expect(resolveKrakenVerifier(PARENT, {})).toEqual(PARENT);
|
|
39
|
-
});
|
|
40
|
-
it('model-only env keeps parent provider, overrides model', () => {
|
|
41
|
-
expect(resolveKrakenVerifier(PARENT, { ZELARI_KRAKEN_SELECT_MODEL: 'glm-4.6' })).toEqual({
|
|
42
|
-
provider: 'grok',
|
|
43
|
-
model: 'glm-4.6',
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
it('provider+model env fully overrides', () => {
|
|
47
|
-
expect(resolveKrakenVerifier(PARENT, {
|
|
48
|
-
ZELARI_KRAKEN_SELECT_PROVIDER: 'openai-compatible',
|
|
49
|
-
ZELARI_KRAKEN_SELECT_MODEL: 'gpt-5',
|
|
50
|
-
})).toEqual({ provider: 'openai-compatible', model: 'gpt-5' });
|
|
51
|
-
});
|
|
52
|
-
it('provider-only env is invalid → falls back to parent (§64)', () => {
|
|
53
|
-
expect(resolveKrakenVerifier(PARENT, { ZELARI_KRAKEN_SELECT_PROVIDER: 'glm' })).toEqual(PARENT);
|
|
54
|
-
});
|
|
55
|
-
it('explicit settings override (Fase 9) wins over env', () => {
|
|
56
|
-
expect(resolveKrakenVerifier(PARENT, { ZELARI_KRAKEN_SELECT_MODEL: 'env-model' }, { provider: 'anthropic', model: 'claude-x' })).toEqual({ provider: 'anthropic', model: 'claude-x' });
|
|
57
|
-
});
|
|
58
|
-
it('partial explicit override is ignored → env applies', () => {
|
|
59
|
-
expect(resolveKrakenVerifier(PARENT, { ZELARI_KRAKEN_SELECT_MODEL: 'env-model' }, { model: 'x' })).toEqual({ provider: 'grok', model: 'env-model' });
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
// ── Prompt ─────────────────────────────────────────────────────────────────
|
|
63
|
-
describe('buildSelectionPrompt / system rules', () => {
|
|
64
|
-
it('system prompt carries the evidence-integrity rules', () => {
|
|
65
|
-
expect(VERIFIER_SYSTEM_PROMPT).toContain('NOT proof of absence');
|
|
66
|
-
expect(VERIFIER_SYSTEM_PROMPT).toContain('Evidence decides');
|
|
67
|
-
expect(VERIFIER_SYSTEM_PROMPT).toContain('needs_more_evidence');
|
|
68
|
-
});
|
|
69
|
-
it('renders hypotheses, degraded tags and malformed candidates', () => {
|
|
70
|
-
const p = buildSelectionPrompt('fix session loss', [
|
|
71
|
-
okCandidate(1, 'token rotation race'),
|
|
72
|
-
okCandidate(2, 'cookie expiry bug', { degraded: true }),
|
|
73
|
-
malformedCandidate(3),
|
|
74
|
-
]);
|
|
75
|
-
expect(p).toContain('TASK');
|
|
76
|
-
expect(p).toContain('Candidate #1 — token rotation race');
|
|
77
|
-
expect(p).toContain('DEGRADED — inconclusive, NOT proof of absence');
|
|
78
|
-
expect(p).toContain('Candidate #3 — UNUSABLE');
|
|
79
|
-
expect(p).toContain('claim-1 (basis: file:1)');
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
// ── parseSelectionVerdict ──────────────────────────────────────────────────
|
|
83
|
-
describe('parseSelectionVerdict', () => {
|
|
84
|
-
const two = [okCandidate(1, 'h1'), okCandidate(2, 'h2')];
|
|
85
|
-
it('accepts a valid selected verdict', () => {
|
|
86
|
-
const r = parseSelectionVerdict(verdictJson({ status: 'selected', winnerIndex: 2, rationale: 'grounded', requiredChecks: ['test:session'] }), two);
|
|
87
|
-
expect(r.ok).toBe(true);
|
|
88
|
-
if (r.ok) {
|
|
89
|
-
expect(r.verdict.status).toBe('selected');
|
|
90
|
-
expect(r.verdict.winnerIndex).toBe(2);
|
|
91
|
-
expect(r.verdict.requiredChecks).toEqual(['test:session']);
|
|
92
|
-
expect(r.verdict.degraded).toBe(false);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
it('accepts needs_more_evidence and ignores any winner', () => {
|
|
96
|
-
const r = parseSelectionVerdict(verdictJson({ status: 'needs_more_evidence', winnerIndex: 1, rationale: 'tie' }), two);
|
|
97
|
-
expect(r.ok).toBe(true);
|
|
98
|
-
if (r.ok)
|
|
99
|
-
expect(r.verdict.winnerIndex).toBeNull();
|
|
100
|
-
});
|
|
101
|
-
it('rejects non-integer winnerIndex', () => {
|
|
102
|
-
expect(parseSelectionVerdict(verdictJson({ status: 'selected', winnerIndex: 1.5 }), two)).toMatchObject({ ok: false });
|
|
103
|
-
expect(parseSelectionVerdict(verdictJson({ status: 'selected', winnerIndex: '2' }), two)).toMatchObject({ ok: false });
|
|
104
|
-
});
|
|
105
|
-
it('rejects a winner pointing at a malformed candidate', () => {
|
|
106
|
-
const r = parseSelectionVerdict(verdictJson({ status: 'selected', winnerIndex: 3 }), [okCandidate(1, 'h1'), okCandidate(2, 'h2'), malformedCandidate(3)]);
|
|
107
|
-
expect(r).toMatchObject({ ok: false });
|
|
108
|
-
});
|
|
109
|
-
it('rejects missing block / invalid JSON / bad status', () => {
|
|
110
|
-
expect(parseSelectionVerdict('no block here', two)).toMatchObject({ ok: false });
|
|
111
|
-
expect(parseSelectionVerdict('<selection-verdict>{bad json}</selection-verdict>', two)).toMatchObject({ ok: false });
|
|
112
|
-
expect(parseSelectionVerdict(verdictJson({ status: 'maybe' }), two)).toMatchObject({ ok: false });
|
|
113
|
-
});
|
|
114
|
-
it('clamps requiredChecks to 5 and drops non-strings', () => {
|
|
115
|
-
const r = parseSelectionVerdict(verdictJson({
|
|
116
|
-
status: 'selected',
|
|
117
|
-
winnerIndex: 1,
|
|
118
|
-
requiredChecks: ['a', 'b', 'c', 'd', 'e', 'f', 42, null],
|
|
119
|
-
}), two);
|
|
120
|
-
expect(r.ok).toBe(true);
|
|
121
|
-
if (r.ok)
|
|
122
|
-
expect(r.verdict.requiredChecks).toEqual(['a', 'b', 'c', 'd', 'e']);
|
|
123
|
-
});
|
|
124
|
-
it('uses the LAST verdict block when the model rambles', () => {
|
|
125
|
-
const raw = `prose <selection-verdict>{"status":"needs_more_evidence"}</selection-verdict> more prose
|
|
126
|
-
<selection-verdict>{"status":"selected","winnerIndex":1}</selection-verdict>`;
|
|
127
|
-
const r = parseSelectionVerdict(raw, two);
|
|
128
|
-
expect(r.ok).toBe(true);
|
|
129
|
-
if (r.ok)
|
|
130
|
-
expect(r.verdict.status).toBe('selected');
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
// ── runKrakenSelection ─────────────────────────────────────────────────────
|
|
134
|
-
describe('runKrakenSelection', () => {
|
|
135
|
-
it('zero usable candidates → deterministic needs_more_evidence, no LLM call', async () => {
|
|
136
|
-
let called = 0;
|
|
137
|
-
const v = await runKrakenSelection({
|
|
138
|
-
task: 't',
|
|
139
|
-
candidates: [malformedCandidate(1), malformedCandidate(2)],
|
|
140
|
-
identity: PARENT,
|
|
141
|
-
callModel: async () => {
|
|
142
|
-
called++;
|
|
143
|
-
return '';
|
|
144
|
-
},
|
|
145
|
-
});
|
|
146
|
-
expect(called).toBe(0);
|
|
147
|
-
expect(v.status).toBe('needs_more_evidence');
|
|
148
|
-
expect(v.degraded).toBe(true);
|
|
149
|
-
expect(v.fallbackReason).toBe('no usable candidates');
|
|
150
|
-
});
|
|
151
|
-
it('single usable candidate → deterministic selection, no LLM call', async () => {
|
|
152
|
-
let called = 0;
|
|
153
|
-
const v = await runKrakenSelection({
|
|
154
|
-
task: 't',
|
|
155
|
-
candidates: [okCandidate(1, 'only'), malformedCandidate(2)],
|
|
156
|
-
identity: PARENT,
|
|
157
|
-
callModel: async () => {
|
|
158
|
-
called++;
|
|
159
|
-
return '';
|
|
160
|
-
},
|
|
161
|
-
});
|
|
162
|
-
expect(called).toBe(0);
|
|
163
|
-
expect(v.status).toBe('selected');
|
|
164
|
-
expect(v.winnerIndex).toBe(1);
|
|
165
|
-
expect(v.judgedBy).toBe('deterministic');
|
|
166
|
-
});
|
|
167
|
-
it('two candidates → LLM judges with system+user and identity rides the verdict', async () => {
|
|
168
|
-
let seen = null;
|
|
169
|
-
const v = await runKrakenSelection({
|
|
170
|
-
task: 'fix intermittent session loss',
|
|
171
|
-
candidates: [okCandidate(1, 'race in refresh'), okCandidate(2, 'cookie expiry')],
|
|
172
|
-
identity: PARENT,
|
|
173
|
-
callModel: async ({ system, user }) => {
|
|
174
|
-
seen = { system, user };
|
|
175
|
-
return verdictJson({
|
|
176
|
-
status: 'selected',
|
|
177
|
-
winnerIndex: 1,
|
|
178
|
-
rationale: 'grounded in file evidence',
|
|
179
|
-
requiredChecks: ['regression test for concurrent refresh'],
|
|
180
|
-
});
|
|
181
|
-
},
|
|
182
|
-
});
|
|
183
|
-
expect(seen).not.toBeNull();
|
|
184
|
-
expect(seen.system).toContain('selection verifier');
|
|
185
|
-
expect(seen.user).toContain('fix intermittent session loss');
|
|
186
|
-
expect(v).toMatchObject({
|
|
187
|
-
status: 'selected',
|
|
188
|
-
winnerIndex: 1,
|
|
189
|
-
judgedBy: 'llm',
|
|
190
|
-
degraded: false,
|
|
191
|
-
verifier: PARENT,
|
|
192
|
-
});
|
|
193
|
-
expect(v.requiredChecks).toEqual(['regression test for concurrent refresh']);
|
|
194
|
-
});
|
|
195
|
-
it('model says tie → clean needs_more_evidence (not degraded)', async () => {
|
|
196
|
-
const v = await runKrakenSelection({
|
|
197
|
-
task: 't',
|
|
198
|
-
candidates: [okCandidate(1, 'a'), okCandidate(2, 'b')],
|
|
199
|
-
identity: PARENT,
|
|
200
|
-
callModel: async () => verdictJson({ status: 'needs_more_evidence', rationale: 'equally supported' }),
|
|
201
|
-
});
|
|
202
|
-
expect(v.status).toBe('needs_more_evidence');
|
|
203
|
-
expect(v.degraded).toBe(false);
|
|
204
|
-
expect(v.judgedBy).toBe('llm');
|
|
205
|
-
});
|
|
206
|
-
it('callModel throws (timeout/429/network) → degraded, run continues', async () => {
|
|
207
|
-
const v = await runKrakenSelection({
|
|
208
|
-
task: 't',
|
|
209
|
-
candidates: [okCandidate(1, 'a'), okCandidate(2, 'b')],
|
|
210
|
-
identity: PARENT,
|
|
211
|
-
callModel: async () => {
|
|
212
|
-
throw new Error('429 rate limited');
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
expect(v.status).toBe('needs_more_evidence');
|
|
216
|
-
expect(v.degraded).toBe(true);
|
|
217
|
-
expect(v.fallbackReason).toBe('verifier call failed');
|
|
218
|
-
expect(v.rationale).toContain('429');
|
|
219
|
-
});
|
|
220
|
-
it('malformed verifier response → degraded with reason', async () => {
|
|
221
|
-
const v = await runKrakenSelection({
|
|
222
|
-
task: 't',
|
|
223
|
-
candidates: [okCandidate(1, 'a'), okCandidate(2, 'b')],
|
|
224
|
-
identity: PARENT,
|
|
225
|
-
callModel: async () => 'I think candidate 1 is nicer',
|
|
226
|
-
});
|
|
227
|
-
expect(v.status).toBe('needs_more_evidence');
|
|
228
|
-
expect(v.degraded).toBe(true);
|
|
229
|
-
expect(v.fallbackReason).toContain('malformed verifier response');
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
//# sourceMappingURL=verifier.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* verifierAdvisoryLock — Exit-2.3 lock tests (ADR-0023 × strict BUILD gate).
|
|
3
|
-
*
|
|
4
|
-
* Locks the composition rule the 2.0 verification contract depends on:
|
|
5
|
-
* when the optional LLM verifier is ACTIVE, the deterministic CompletionPolicy
|
|
6
|
-
* stays the FINAL authority of the Kraken BUILD gate.
|
|
7
|
-
*
|
|
8
|
-
* Caso 1 — deterministic criterion UNKNOWN/FAIL + verifier CONFIRMED
|
|
9
|
-
* → no clean success (BLOCKED / REPAIR_REQUIRED, strict exit ≠ 0).
|
|
10
|
-
* Caso 2 — deterministic criteria PASS + verifier REJECTED
|
|
11
|
-
* → the deterministic verdict is NOT rewritten; the review is
|
|
12
|
-
* recorded in the spine as advisory only (exit stays 0).
|
|
13
|
-
*
|
|
14
|
-
* The verifier may add information, never authority. Breaking either test
|
|
15
|
-
* below is a contract regression, not a refactor.
|
|
16
|
-
*/
|
|
17
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
18
|
-
import { DEFAULT_VERIFIER_CONFIG, VerifierService, } from '@zelari/core/verification';
|
|
19
|
-
import { evaluateStrictBuildGate, krakenResultsToContract, strictGateEventPayload, strictGateExitCode, } from './verificationBridge.js';
|
|
20
|
-
import { getKrakenCheckResults, krakenRequiredChecks, resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection, } from './candidateRegistry.js';
|
|
21
|
-
const CHECKS = ['typecheck passes', 'suite verde'];
|
|
22
|
-
function emitSeq() {
|
|
23
|
-
let n = 1;
|
|
24
|
-
return async () => ({ seq: n++ });
|
|
25
|
-
}
|
|
26
|
-
function selectWithChecks() {
|
|
27
|
-
resetKrakenCandidates();
|
|
28
|
-
setKrakenSelection({
|
|
29
|
-
status: 'selected',
|
|
30
|
-
winnerIndex: 1,
|
|
31
|
-
rationale: 'stronger evidence',
|
|
32
|
-
requiredChecks: CHECKS,
|
|
33
|
-
degraded: false,
|
|
34
|
-
verifier: null,
|
|
35
|
-
judgedBy: 'llm',
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
/** Enabled verifier with a fixed test model; `reply` is the raw LLM answer. */
|
|
39
|
-
function activeVerifier(reply, emitted) {
|
|
40
|
-
return new VerifierService({
|
|
41
|
-
callModel: async () => ({
|
|
42
|
-
text: reply,
|
|
43
|
-
provider: 'test',
|
|
44
|
-
model: 'verifier-1',
|
|
45
|
-
}),
|
|
46
|
-
config: {
|
|
47
|
-
...DEFAULT_VERIFIER_CONFIG,
|
|
48
|
-
enabled: true,
|
|
49
|
-
model: { mode: 'fixed', provider: 'test', model: 'verifier-1' },
|
|
50
|
-
},
|
|
51
|
-
emit: async (input) => {
|
|
52
|
-
emitted.push(input);
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
const CONFIRMED = '{"verdict":"confirmed","score":0.97,"rationale":"looks done to me"}';
|
|
57
|
-
const REJECTED = '{"verdict":"rejected","score":0.05,"rationale":"not convinced"}';
|
|
58
|
-
/** Contract the runtime hands to BOTH the strict gate and the verifier. */
|
|
59
|
-
function currentContract() {
|
|
60
|
-
return krakenResultsToContract(krakenRequiredChecks(), getKrakenCheckResults());
|
|
61
|
-
}
|
|
62
|
-
let envPrev;
|
|
63
|
-
beforeEach(() => {
|
|
64
|
-
envPrev = process.env.ZELARI_STRICT_DONE;
|
|
65
|
-
process.env.ZELARI_STRICT_DONE = '1';
|
|
66
|
-
resetKrakenCandidates();
|
|
67
|
-
});
|
|
68
|
-
afterEach(() => {
|
|
69
|
-
if (envPrev === undefined)
|
|
70
|
-
delete process.env.ZELARI_STRICT_DONE;
|
|
71
|
-
else
|
|
72
|
-
process.env.ZELARI_STRICT_DONE = envPrev;
|
|
73
|
-
resetKrakenCandidates();
|
|
74
|
-
});
|
|
75
|
-
describe('Exit-2.3 lock: verifier LLM active cannot change the completion authority', () => {
|
|
76
|
-
it('Caso 1a — unknown criterion + verifier CONFIRMED → BLOCKED, strict exit 4 (advisory recorded, never applied)', async () => {
|
|
77
|
-
selectWithChecks();
|
|
78
|
-
setKrakenCheckResults([]); // verify tentacle never reported → unknown ≠ pass
|
|
79
|
-
const emitted = [];
|
|
80
|
-
const verifier = activeVerifier(CONFIRMED, emitted);
|
|
81
|
-
const review = await verifier.reviewCompletion({
|
|
82
|
-
summary: 'done: all green',
|
|
83
|
-
results: currentContract().results,
|
|
84
|
-
});
|
|
85
|
-
const gate = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
86
|
-
// The review itself may say "confirmed" — it is advisory information only.
|
|
87
|
-
expect(review.verdict).toBe('confirmed');
|
|
88
|
-
expect(review.effectiveModel).toEqual({
|
|
89
|
-
mode: 'fixed',
|
|
90
|
-
provider: 'test',
|
|
91
|
-
model: 'verifier-1',
|
|
92
|
-
});
|
|
93
|
-
// The deterministic policy stays the final authority: unknown → BLOCKED.
|
|
94
|
-
expect(gate.strict).toBe(true);
|
|
95
|
-
expect(gate.evaluation.verdict).toBe('BLOCKED');
|
|
96
|
-
expect(gate.blocked).toBe(true);
|
|
97
|
-
expect(strictGateExitCode(gate)).toBe(4);
|
|
98
|
-
expect(strictGateEventPayload(gate).verdict).toBe('BLOCKED');
|
|
99
|
-
// The spine keeps the verifier review as a separate advisory record.
|
|
100
|
-
expect(emitted).toHaveLength(1);
|
|
101
|
-
const data = emitted[0].data;
|
|
102
|
-
expect(data.source).toBe('verifier-model');
|
|
103
|
-
expect(data.verdict).toBe('confirmed');
|
|
104
|
-
expect(data.model).toBe('verifier-1');
|
|
105
|
-
expect(data.selectionMode).toBe('fixed');
|
|
106
|
-
});
|
|
107
|
-
it('Caso 1b — FAIL criterion + verifier CONFIRMED → REPAIR_REQUIRED (fail wins), review downgraded to unknown', async () => {
|
|
108
|
-
selectWithChecks();
|
|
109
|
-
setKrakenCheckResults([
|
|
110
|
-
{ check: CHECKS[0], status: 'pass', note: 'tsc clean' },
|
|
111
|
-
{ check: CHECKS[1], status: 'fail', note: 'vitest 1/2' },
|
|
112
|
-
]);
|
|
113
|
-
const emitted = [];
|
|
114
|
-
const verifier = activeVerifier(CONFIRMED, emitted);
|
|
115
|
-
const review = await verifier.reviewCompletion({
|
|
116
|
-
summary: 'done: mostly green',
|
|
117
|
-
results: currentContract().results,
|
|
118
|
-
});
|
|
119
|
-
const gate = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
120
|
-
// The service itself refuses to confirm over a failed deterministic check.
|
|
121
|
-
expect(review.verdict).toBe('unknown');
|
|
122
|
-
expect(review.fallback).toBe('discrete');
|
|
123
|
-
expect(review.rationale).toContain('cannot confirm');
|
|
124
|
-
// And even if it had not: the policy converts fail into repair, not done.
|
|
125
|
-
expect(gate.evaluation.verdict).toBe('REPAIR_REQUIRED');
|
|
126
|
-
expect(gate.blocked).toBe(true);
|
|
127
|
-
expect(strictGateExitCode(gate)).toBe(4);
|
|
128
|
-
});
|
|
129
|
-
it('Caso 2 — deterministic PASS + verifier REJECTED → PASS untouched, exit 0, rejection recorded as advisory', async () => {
|
|
130
|
-
selectWithChecks();
|
|
131
|
-
setKrakenCheckResults([
|
|
132
|
-
{ check: CHECKS[0], status: 'pass', note: 'tsc clean' },
|
|
133
|
-
{ check: CHECKS[1], status: 'pass', note: 'vitest 41/41' },
|
|
134
|
-
]);
|
|
135
|
-
const emitted = [];
|
|
136
|
-
const verifier = activeVerifier(REJECTED, emitted);
|
|
137
|
-
const review = await verifier.reviewCompletion({
|
|
138
|
-
summary: 'done: all green',
|
|
139
|
-
results: currentContract().results,
|
|
140
|
-
});
|
|
141
|
-
const gate = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
142
|
-
// The rejection is real, recorded, and advisory — it cannot dirty a
|
|
143
|
-
// deterministic strict PASS (no false-block from narration either).
|
|
144
|
-
expect(review.verdict).toBe('rejected');
|
|
145
|
-
expect(gate.evaluation.verdict).toBe('PASS');
|
|
146
|
-
expect(gate.blocked).toBe(false);
|
|
147
|
-
expect(strictGateExitCode(gate)).toBe(0);
|
|
148
|
-
expect(strictGateEventPayload(gate).verdict).toBe('PASS');
|
|
149
|
-
const data = emitted[0].data;
|
|
150
|
-
expect(data.verdict).toBe('rejected');
|
|
151
|
-
expect(data.source).toBe('verifier-model');
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
//# sourceMappingURL=verifierAdvisoryLock.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifierAdvisoryLock.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierAdvisoryLock.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,eAAe,GAEhB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,GAAG,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAC;AAEnD,SAAS,OAAO;IACd,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB;IACvB,qBAAqB,EAAE,CAAC;IACxB,kBAAkB,CAAC;QACjB,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,mBAAmB;QAC9B,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,SAAS,cAAc,CAAC,KAAa,EAAE,OAAkB;IACvD,OAAO,IAAI,eAAe,CAAC;QACzB,SAAS,EAAE,KAAK,IAAoC,EAAE,CAAC,CAAC;YACtD,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,YAAY;SACpB,CAAC;QACF,MAAM,EAAE;YACN,GAAG,uBAAuB;YAC1B,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE;SAChE;QACD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,SAAS,GAAG,qEAAqE,CAAC;AACxF,MAAM,QAAQ,GAAG,iEAAiE,CAAC;AAEnF,2EAA2E;AAC3E,SAAS,eAAe;IACtB,OAAO,uBAAuB,CAAC,oBAAoB,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,IAAI,OAA2B,CAAC;AAEhC,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;IACrC,qBAAqB,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;;QAC5D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC;IAC9C,qBAAqB,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2EAA2E,EAAE,GAAG,EAAE;IACzF,EAAE,CAAC,8GAA8G,EAAE,KAAK,IAAI,EAAE;QAC5H,gBAAgB,EAAE,CAAC;QACnB,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,kDAAkD;QAE7E,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,eAAe,EAAE,CAAC,OAAO;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAEzE,2EAA2E;QAC3E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;YACpC,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,YAAY;SACpB,CAAC,CAAC;QAEH,yEAAyE;QACzE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE7D,qEAAqE;QACrE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,IAAI,GAAI,OAAO,CAAC,CAAC,CAAuC,CAAC,IAAI,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2GAA2G,EAAE,KAAK,IAAI,EAAE;QACzH,gBAAgB,EAAE,CAAC;QACnB,qBAAqB,CAAC;YACpB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;YACvD,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE;SACzD,CAAC,CAAC;QAEH,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE,eAAe,EAAE,CAAC,OAAO;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAEzE,2EAA2E;QAC3E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAErD,0EAA0E;QAC1E,MAAM,CAAC,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0GAA0G,EAAE,KAAK,IAAI,EAAE;QACxH,gBAAgB,EAAE,CAAC;QACnB,qBAAqB,CAAC;YACpB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;YACvD,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;SAC3D,CAAC,CAAC;QAEH,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,eAAe,EAAE,CAAC,OAAO;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAEzE,oEAAoE;QACpE,oEAAoE;QACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAI,OAAO,CAAC,CAAC,CAAuC,CAAC,IAAI,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|