zelari-code 2.1.0 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,329 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* observe_batch — tests (2026-07 context-growth plan, Fase 1 acceptance).
|
|
3
|
-
*
|
|
4
|
-
* Covers: aggregation + input order, isolated failures, per-op args
|
|
5
|
-
* validation, schema limits (max ops, dup ids), evidence determinism,
|
|
6
|
-
* evidence/raw modes, aggregate cap with explicit truncation, per-op
|
|
7
|
-
* timeout, Ground Truth batch meta.
|
|
8
|
-
*/
|
|
9
|
-
import { fileURLToPath } from 'node:url';
|
|
10
|
-
import path from 'node:path';
|
|
11
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
12
|
-
import { z } from 'zod';
|
|
13
|
-
import { createObserveBatchTool, projectEvidence, ObserveBatchArgsSchema, AGGREGATE_CAP_BYTES, MAX_OPERATIONS, } from './observeBatch.js';
|
|
14
|
-
import { typedOk, typedErr } from '@zelari/core/harness/tools/toolTypes';
|
|
15
|
-
// Pin repo root: npm test --workspace=@zelari/core runs with cwd packages/core
|
|
16
|
-
// (same as the publish workflow). Do NOT use process.cwd() / path.resolve().
|
|
17
|
-
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
|
|
18
|
-
function fakeCtx() {
|
|
19
|
-
return {
|
|
20
|
-
signal: new AbortController().signal,
|
|
21
|
-
cwd: '/tmp',
|
|
22
|
-
audit: () => { },
|
|
23
|
-
sessionId: 'test',
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
function sleep(ms) {
|
|
27
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
28
|
-
}
|
|
29
|
-
function okGrepTool(behavior) {
|
|
30
|
-
return {
|
|
31
|
-
name: 'grep_content',
|
|
32
|
-
description: 'fake',
|
|
33
|
-
permissions: ['read'],
|
|
34
|
-
timeoutMs: 5000,
|
|
35
|
-
inputSchema: z.record(z.string(), z.unknown()),
|
|
36
|
-
execute: async (args) => {
|
|
37
|
-
const value = behavior
|
|
38
|
-
? behavior(args)
|
|
39
|
-
: {
|
|
40
|
-
matches: [
|
|
41
|
-
{ relPath: 'src/a.ts', line: 10, text: 'x' },
|
|
42
|
-
{ relPath: 'src/b.ts', line: 22, text: 'y' },
|
|
43
|
-
],
|
|
44
|
-
totalMatches: 2,
|
|
45
|
-
truncated: false,
|
|
46
|
-
};
|
|
47
|
-
return typedOk(value, { status: 'complete', counts: { matches: 2, filesWalked: 7 } });
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
const okReadTool = {
|
|
52
|
-
name: 'read_file',
|
|
53
|
-
description: 'fake',
|
|
54
|
-
permissions: ['read'],
|
|
55
|
-
timeoutMs: 5000,
|
|
56
|
-
inputSchema: z.record(z.string(), z.unknown()),
|
|
57
|
-
execute: async () => typedOk({ path: 'src/a.ts', content: 'line1\nline2', totalLines: 120, readLines: { start: 1, end: 2 }, sizeBytes: 4000 }, { status: 'complete', counts: { lines: 120, bytes: 4000 } }),
|
|
58
|
-
};
|
|
59
|
-
const okListTool = {
|
|
60
|
-
name: 'list_files',
|
|
61
|
-
description: 'fake',
|
|
62
|
-
permissions: ['read'],
|
|
63
|
-
timeoutMs: 5000,
|
|
64
|
-
inputSchema: z.record(z.string(), z.unknown()),
|
|
65
|
-
execute: async () => typedOk({ dir: '/tmp', entries: [{ name: 'src', type: 'directory' }, { name: 'a.ts', type: 'file' }], truncated: false }, { status: 'complete', counts: { filesWalked: 2 } }),
|
|
66
|
-
};
|
|
67
|
-
function deps(over = {}) {
|
|
68
|
-
return {
|
|
69
|
-
tools: {
|
|
70
|
-
read_file: okReadTool,
|
|
71
|
-
grep_content: okGrepTool(),
|
|
72
|
-
list_files: okListTool,
|
|
73
|
-
...over,
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
async function run(depsArg, args) {
|
|
78
|
-
const tool = createObserveBatchTool(depsArg);
|
|
79
|
-
const parsed = tool.inputSchema.parse(args);
|
|
80
|
-
const res = await tool.execute(parsed, fakeCtx());
|
|
81
|
-
expect(res.ok).toBe(true);
|
|
82
|
-
return res.value;
|
|
83
|
-
}
|
|
84
|
-
function stripDynamic(result) {
|
|
85
|
-
const clone = JSON.parse(JSON.stringify(result));
|
|
86
|
-
for (const o of clone.observations)
|
|
87
|
-
delete o.durationMs;
|
|
88
|
-
delete clone.totals.wallMs;
|
|
89
|
-
return clone;
|
|
90
|
-
}
|
|
91
|
-
afterEach(() => {
|
|
92
|
-
delete process.env.ZELARI_OBSERVE_OP_TIMEOUT_MS;
|
|
93
|
-
});
|
|
94
|
-
describe('observe_batch schema', () => {
|
|
95
|
-
it('rejects more than MAX_OPERATIONS', () => {
|
|
96
|
-
const ops = Array.from({ length: MAX_OPERATIONS + 1 }, (_, i) => ({ id: `op${i}`, tool: 'read_file' }));
|
|
97
|
-
expect(() => ObserveBatchArgsSchema.parse({ operations: ops })).toThrow(/at most/);
|
|
98
|
-
});
|
|
99
|
-
it('rejects duplicate ids', () => {
|
|
100
|
-
expect(() => ObserveBatchArgsSchema.parse({ operations: [{ id: 'a', tool: 'read_file' }, { id: 'a', tool: 'list_files' }] })).toThrow(/unique/);
|
|
101
|
-
});
|
|
102
|
-
it('defaults resultMode to evidence and args to undefined', () => {
|
|
103
|
-
const parsed = ObserveBatchArgsSchema.parse({ operations: [{ id: 'a', tool: 'read_file' }] });
|
|
104
|
-
expect(parsed.resultMode).toBe('evidence');
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
describe('observe_batch execution', () => {
|
|
108
|
-
it('aggregates independent ops and preserves input order', async () => {
|
|
109
|
-
const slowFirst = {
|
|
110
|
-
...okGrepTool(),
|
|
111
|
-
execute: async () => {
|
|
112
|
-
await sleep(60);
|
|
113
|
-
return typedOk({ matches: [], totalMatches: 0, truncated: false }, { status: 'complete', counts: { matches: 0 } });
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
const result = await run(deps({ grep_content: slowFirst }), {
|
|
117
|
-
operations: [
|
|
118
|
-
{ id: 'first', tool: 'grep_content', args: { pattern: 'x' } },
|
|
119
|
-
{ id: 'second', tool: 'read_file', args: { path: 'a.ts' } },
|
|
120
|
-
{ id: 'third', tool: 'list_files' },
|
|
121
|
-
],
|
|
122
|
-
});
|
|
123
|
-
expect(result.failures).toEqual([]);
|
|
124
|
-
expect(result.observations.map((o) => o.id)).toEqual(['first', 'second', 'third']);
|
|
125
|
-
expect(result.totals).toMatchObject({ ops: 3, ok: 3, failed: 0 });
|
|
126
|
-
expect(result.truncated).toBe(false);
|
|
127
|
-
});
|
|
128
|
-
it('isolates per-op failures (typedErr + throw) without failing the batch', async () => {
|
|
129
|
-
const boom = {
|
|
130
|
-
...okGrepTool(),
|
|
131
|
-
execute: async () => typedErr('boom'),
|
|
132
|
-
};
|
|
133
|
-
const thrower = {
|
|
134
|
-
...okReadTool,
|
|
135
|
-
execute: async () => {
|
|
136
|
-
throw new Error('kaboom');
|
|
137
|
-
},
|
|
138
|
-
};
|
|
139
|
-
const result = await run(deps({ grep_content: boom, read_file: thrower }), {
|
|
140
|
-
operations: [
|
|
141
|
-
{ id: 'ok', tool: 'list_files' },
|
|
142
|
-
{ id: 'err', tool: 'grep_content' },
|
|
143
|
-
{ id: 'thr', tool: 'read_file' },
|
|
144
|
-
],
|
|
145
|
-
});
|
|
146
|
-
expect(result.observations.map((o) => o.id)).toEqual(['ok']);
|
|
147
|
-
const errIds = result.failures.map((f) => f.id).sort();
|
|
148
|
-
expect(errIds).toEqual(['err', 'thr']);
|
|
149
|
-
expect(result.failures.find((f) => f.id === 'err')?.error).toContain('boom');
|
|
150
|
-
expect(result.totals).toMatchObject({ ops: 3, ok: 1, failed: 2 });
|
|
151
|
-
});
|
|
152
|
-
it('validates each op args against the underlying schema (defaults + rejection)', async () => {
|
|
153
|
-
const strict = {
|
|
154
|
-
...okReadTool,
|
|
155
|
-
inputSchema: z.object({ path: z.string() }),
|
|
156
|
-
execute: async () => typedOk({ path: 'x', content: '', totalLines: 0, readLines: { start: 1, end: 1 }, sizeBytes: 0 }),
|
|
157
|
-
};
|
|
158
|
-
const result = await run(deps({ read_file: strict }), {
|
|
159
|
-
operations: [
|
|
160
|
-
{ id: 'bad', tool: 'read_file', args: {} },
|
|
161
|
-
{ id: 'good', tool: 'read_file', args: { path: 'ok.ts' } },
|
|
162
|
-
],
|
|
163
|
-
});
|
|
164
|
-
expect(result.failures).toHaveLength(1);
|
|
165
|
-
expect(result.failures[0]?.error).toMatch(/invalid args.*path/);
|
|
166
|
-
expect(result.observations.map((o) => o.id)).toEqual(['good']);
|
|
167
|
-
});
|
|
168
|
-
it('times out a stuck op (env knob) instead of hanging the batch', async () => {
|
|
169
|
-
process.env.ZELARI_OBSERVE_OP_TIMEOUT_MS = '50';
|
|
170
|
-
const stuck = {
|
|
171
|
-
...okReadTool,
|
|
172
|
-
execute: async () => {
|
|
173
|
-
await sleep(500);
|
|
174
|
-
return typedOk({ path: 'x', content: '', totalLines: 0, readLines: { start: 1, end: 1 }, sizeBytes: 0 });
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
const result = await run(deps({ read_file: stuck }), { operations: [{ id: 'stuck', tool: 'read_file' }, { id: 'ok', tool: 'list_files' }] });
|
|
178
|
-
expect(result.failures[0]?.error).toMatch(/TIMEOUT after \d+ms/);
|
|
179
|
-
expect(result.observations.map((o) => o.id)).toEqual(['ok']);
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
describe('observe_batch result modes + caps', () => {
|
|
183
|
-
it('evidence mode (default): no raw payload, compact deterministic evidence', async () => {
|
|
184
|
-
const result = await run(deps(), {
|
|
185
|
-
operations: [
|
|
186
|
-
{ id: 'g', tool: 'grep_content', args: { pattern: 'refreshSession' } },
|
|
187
|
-
{ id: 'r', tool: 'read_file', args: { path: 'src/a.ts' } },
|
|
188
|
-
{ id: 'l', tool: 'list_files' },
|
|
189
|
-
],
|
|
190
|
-
});
|
|
191
|
-
for (const o of result.observations) {
|
|
192
|
-
expect(o.raw).toBeUndefined();
|
|
193
|
-
expect(o.rawOmitted).toBeUndefined();
|
|
194
|
-
expect(o.bytes).toBeLessThan(400);
|
|
195
|
-
}
|
|
196
|
-
const g = result.observations.find((o) => o.id === 'g');
|
|
197
|
-
expect(g?.evidence).toMatchObject({ tool: 'grep_content', pattern: 'refreshSession', matches: 2, filesWalked: 7 });
|
|
198
|
-
const r = result.observations.find((o) => o.id === 'r');
|
|
199
|
-
expect(r?.evidence).toMatchObject({ tool: 'read_file', path: 'src/a.ts', totalLines: 120 });
|
|
200
|
-
expect(result.totals.bytes).toBeLessThan(1200);
|
|
201
|
-
});
|
|
202
|
-
it('raw mode includes payloads until the aggregate cap, then omits explicitly', async () => {
|
|
203
|
-
const bigPayload = { path: 'big.ts', content: 'x'.repeat(AGGREGATE_CAP_BYTES - 2048), totalLines: 1, readLines: { start: 1, end: 1 }, sizeBytes: AGGREGATE_CAP_BYTES };
|
|
204
|
-
const bigRead = {
|
|
205
|
-
...okReadTool,
|
|
206
|
-
execute: async () => typedOk(bigPayload, { status: 'complete' }),
|
|
207
|
-
};
|
|
208
|
-
const result = await run(deps({ read_file: bigRead }), {
|
|
209
|
-
resultMode: 'raw',
|
|
210
|
-
operations: [
|
|
211
|
-
{ id: 'first', tool: 'read_file' },
|
|
212
|
-
{ id: 'second', tool: 'read_file' },
|
|
213
|
-
],
|
|
214
|
-
});
|
|
215
|
-
const first = result.observations.find((o) => o.id === 'first');
|
|
216
|
-
const second = result.observations.find((o) => o.id === 'second');
|
|
217
|
-
expect(first?.raw).toBeDefined();
|
|
218
|
-
expect(first?.rawOmitted).toBeUndefined();
|
|
219
|
-
expect(second?.raw).toBeUndefined();
|
|
220
|
-
expect(second?.rawOmitted).toBe(true);
|
|
221
|
-
expect(second?.evidence).toBeDefined();
|
|
222
|
-
expect(result.truncated).toBe(true);
|
|
223
|
-
});
|
|
224
|
-
it('batch meta reflects Ground Truth status (partial on mixed outcome)', async () => {
|
|
225
|
-
const boom = { ...okGrepTool(), execute: async () => typedErr('x') };
|
|
226
|
-
const tool = createObserveBatchTool(deps({ grep_content: boom }));
|
|
227
|
-
const parsed = tool.inputSchema.parse({ operations: [{ id: 'a', tool: 'grep_content' }, { id: 'b', tool: 'list_files' }] });
|
|
228
|
-
const res = await tool.execute(parsed, fakeCtx());
|
|
229
|
-
expect(res.ok).toBe(true);
|
|
230
|
-
if (res.ok)
|
|
231
|
-
expect(res.meta?.status).toBe('partial');
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
describe('observe_batch integration (real registry + real builtins)', () => {
|
|
235
|
-
it('runs real read-only tools through the wrapped registry and projects evidence', async () => {
|
|
236
|
-
const { createBuiltinToolRegistry } = await import('../toolRegistry.js');
|
|
237
|
-
const { registry } = createBuiltinToolRegistry({ lspProvider: null, root: repoRoot });
|
|
238
|
-
expect(registry.list().includes('observe_batch')).toBe(true);
|
|
239
|
-
const toolsDir = path.join(repoRoot, 'src', 'cli', 'tools');
|
|
240
|
-
const pkgJson = path.join(repoRoot, 'package.json');
|
|
241
|
-
const res = await registry.invoke('observe_batch', {
|
|
242
|
-
operations: [
|
|
243
|
-
{ id: 'l', tool: 'list_files', args: { path: toolsDir, maxDepth: 1 } },
|
|
244
|
-
{
|
|
245
|
-
id: 'g',
|
|
246
|
-
tool: 'grep_content',
|
|
247
|
-
args: { pattern: 'observe_batch', path: toolsDir, include: ['*.ts'], contextLines: 0, maxMatches: 3 },
|
|
248
|
-
},
|
|
249
|
-
{ id: 'r', tool: 'read_file', args: { path: pkgJson, startLine: 1, endLine: 5 } },
|
|
250
|
-
],
|
|
251
|
-
});
|
|
252
|
-
expect(res.ok).toBe(true);
|
|
253
|
-
if (!res.ok)
|
|
254
|
-
return;
|
|
255
|
-
const v = res.value;
|
|
256
|
-
expect(v.failures).toEqual([]);
|
|
257
|
-
expect(v.observations).toHaveLength(3);
|
|
258
|
-
const l = v.observations.find((o) => o.id === 'l');
|
|
259
|
-
expect(l?.evidence).toMatchObject({ tool: 'list_files', entries: expect.any(Number) });
|
|
260
|
-
const sample = (l?.evidence).sample ?? [];
|
|
261
|
-
expect(sample.length).toBeGreaterThan(0);
|
|
262
|
-
expect(sample.some((n) => n.endsWith('.ts'))).toBe(true);
|
|
263
|
-
const g = v.observations.find((o) => o.id === 'g');
|
|
264
|
-
expect(g?.evidence).toMatchObject({ tool: 'grep_content', pattern: 'observe_batch' });
|
|
265
|
-
expect((g?.evidence).matches).toBeGreaterThan(0);
|
|
266
|
-
expect((g?.evidence).top?.[0]).toMatch(/observeBatch(\.test)?\.ts:\d+/);
|
|
267
|
-
const r = v.observations.find((o) => o.id === 'r');
|
|
268
|
-
expect(r?.evidence).toMatchObject({ tool: 'read_file' });
|
|
269
|
-
expect(String((r?.evidence).path ?? '')).toMatch(/package\.json$/);
|
|
270
|
-
expect(r?.raw).toBeUndefined(); // evidence mode: no payload in context
|
|
271
|
-
});
|
|
272
|
-
it('is registered in readOnly sub-agent registries and disabled by the kill switch', async () => {
|
|
273
|
-
const { createBuiltinToolRegistry } = await import('../toolRegistry.js');
|
|
274
|
-
const ro = createBuiltinToolRegistry({ lspProvider: null, readOnly: true });
|
|
275
|
-
expect(ro.registry.list().includes('observe_batch')).toBe(true);
|
|
276
|
-
process.env.ZELARI_OBSERVE_BATCH = '0';
|
|
277
|
-
try {
|
|
278
|
-
const off = createBuiltinToolRegistry({ lspProvider: null });
|
|
279
|
-
expect(off.registry.list().includes('observe_batch')).toBe(false);
|
|
280
|
-
}
|
|
281
|
-
finally {
|
|
282
|
-
delete process.env.ZELARI_OBSERVE_BATCH;
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
});
|
|
286
|
-
describe('projectEvidence determinism', () => {
|
|
287
|
-
it('is byte-identical for the same inputs', () => {
|
|
288
|
-
const args = { pattern: 'foo' };
|
|
289
|
-
const value = {
|
|
290
|
-
matches: Array.from({ length: 9 }, (_, i) => ({ relPath: `f${i}.ts`, line: i + 1, text: 'foo' })),
|
|
291
|
-
totalMatches: 9,
|
|
292
|
-
truncated: false,
|
|
293
|
-
};
|
|
294
|
-
const meta = { status: 'partial', counts: { matches: 9, filesWalked: 40 }, truncated: true };
|
|
295
|
-
const a = JSON.stringify(projectEvidence('grep_content', args, value, meta));
|
|
296
|
-
const b = JSON.stringify(projectEvidence('grep_content', args, value, meta));
|
|
297
|
-
expect(a).toBe(b);
|
|
298
|
-
const ev = JSON.parse(a);
|
|
299
|
-
expect(ev.matches).toBe(9);
|
|
300
|
-
expect(ev.filesWalked).toBe(40);
|
|
301
|
-
expect(ev.top).toHaveLength(5);
|
|
302
|
-
expect(ev.top[0]).toBe('f0.ts:1');
|
|
303
|
-
});
|
|
304
|
-
it('two identical batch executions yield identical results modulo timings', async () => {
|
|
305
|
-
const ops = {
|
|
306
|
-
operations: [
|
|
307
|
-
{ id: 'g', tool: 'grep_content', args: { pattern: 'p' } },
|
|
308
|
-
{ id: 'r', tool: 'read_file', args: { path: 'a' } },
|
|
309
|
-
{ id: 'l', tool: 'list_files' },
|
|
310
|
-
],
|
|
311
|
-
};
|
|
312
|
-
const a = await run(deps(), ops);
|
|
313
|
-
const b = await run(deps(), ops);
|
|
314
|
-
expect(stripDynamic(a)).toEqual(stripDynamic(b));
|
|
315
|
-
});
|
|
316
|
-
it('list_files evidence reports count + sample with dir suffix', () => {
|
|
317
|
-
const ev = projectEvidence('list_files', {}, {
|
|
318
|
-
dir: '/x',
|
|
319
|
-
entries: [
|
|
320
|
-
{ name: 'src', type: 'directory' },
|
|
321
|
-
{ name: 'a.ts', type: 'file' },
|
|
322
|
-
{ name: 'b.ts', type: 'file' },
|
|
323
|
-
],
|
|
324
|
-
truncated: false,
|
|
325
|
-
});
|
|
326
|
-
expect(ev).toMatchObject({ tool: 'list_files', dir: '/x', entries: 3, sample: ['src/', 'a.ts', 'b.ts'] });
|
|
327
|
-
});
|
|
328
|
-
});
|
|
329
|
-
//# sourceMappingURL=observeBatch.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"observeBatch.test.js","sourceRoot":"","sources":["../../../src/cli/tools/observeBatch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* taskTool.dynamicChecks.test — Fase 6 / ADR-0020 (Kraken Verified Selection).
|
|
3
|
-
*
|
|
4
|
-
* BUILD dynamic checks: le requiredChecks di una selezione `selected`
|
|
5
|
-
* diventano proof obligations AUTOMATICHE di ogni tentacle verify:
|
|
6
|
-
* - append dedupe case-insensitive sull'acceptance del parent
|
|
7
|
-
* - mai iniettate su explore/general
|
|
8
|
-
* - mai con needs_more_evidence (i check restano advisory)
|
|
9
|
-
* - assenza di selezione ⇒ comportamento invariato
|
|
10
|
-
*/
|
|
11
|
-
import { describe, expect, it, beforeEach, afterEach } from 'vitest';
|
|
12
|
-
import { tmpdir } from 'node:os';
|
|
13
|
-
import path from 'node:path';
|
|
14
|
-
import fs from 'node:fs';
|
|
15
|
-
import { ToolRegistry } from '@zelari/core/harness/tools/registry';
|
|
16
|
-
import { createTaskTool, resetTaskSpawnCount, } from './taskTool.js';
|
|
17
|
-
import { resetKrakenCandidates, setKrakenSelection, } from '../kraken/candidateRegistry.js';
|
|
18
|
-
function tmpRoot() {
|
|
19
|
-
return fs.mkdtempSync(path.join(tmpdir(), 'zelari-dyn-checks-'));
|
|
20
|
-
}
|
|
21
|
-
function makeCtx(cwd = tmpRoot()) {
|
|
22
|
-
return {
|
|
23
|
-
signal: new AbortController().signal,
|
|
24
|
-
cwd,
|
|
25
|
-
audit: () => undefined,
|
|
26
|
-
sessionId: 'dynamic-checks-test',
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Deps fake che cattura il user prompt del tentacle via harnessFactory:
|
|
31
|
-
* config.messages[0] = system, [1] = user (buildTaskUserPrompt output).
|
|
32
|
-
*/
|
|
33
|
-
function capturingDeps() {
|
|
34
|
-
const prompts = [];
|
|
35
|
-
const deps = {
|
|
36
|
-
createSubAgentContext: async ({ agent }) => {
|
|
37
|
-
const ctx = {
|
|
38
|
-
providerStream: (() => {
|
|
39
|
-
throw new Error('not invoked by the scripted harness');
|
|
40
|
-
}),
|
|
41
|
-
model: 'test-model',
|
|
42
|
-
provider: 'test-provider',
|
|
43
|
-
registry: new ToolRegistry(),
|
|
44
|
-
tools: [],
|
|
45
|
-
agent,
|
|
46
|
-
};
|
|
47
|
-
return ctx;
|
|
48
|
-
},
|
|
49
|
-
harnessFactory: (config) => {
|
|
50
|
-
prompts.push(String(config.messages[1]?.content ?? ''));
|
|
51
|
-
return {
|
|
52
|
-
run: async function* () {
|
|
53
|
-
yield { type: 'message_start' };
|
|
54
|
-
yield { type: 'message_delta', delta: 'verified' };
|
|
55
|
-
yield { type: 'message_end' };
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
},
|
|
59
|
-
allowWorktree: false,
|
|
60
|
-
};
|
|
61
|
-
return { deps, userPrompts: () => prompts };
|
|
62
|
-
}
|
|
63
|
-
const CHECKS = [
|
|
64
|
-
'unit test for session refresh passes',
|
|
65
|
-
'no Set-Cookie regression on logout',
|
|
66
|
-
];
|
|
67
|
-
function verdict(status, requiredChecks = CHECKS) {
|
|
68
|
-
return {
|
|
69
|
-
status,
|
|
70
|
-
winnerIndex: status === 'selected' ? 1 : null,
|
|
71
|
-
rationale: 'grounded in evidence',
|
|
72
|
-
requiredChecks,
|
|
73
|
-
degraded: false,
|
|
74
|
-
verifier: { provider: 'p', model: 'm' },
|
|
75
|
-
judgedBy: 'llm',
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
async function spawnVerify(deps, acceptance) {
|
|
79
|
-
const tool = createTaskTool(deps);
|
|
80
|
-
const res = await tool.execute({
|
|
81
|
-
description: 'verify the fix',
|
|
82
|
-
prompt: 'Verify the implementation.',
|
|
83
|
-
agent: 'verify',
|
|
84
|
-
...(acceptance ? { acceptance } : {}),
|
|
85
|
-
}, makeCtx());
|
|
86
|
-
if (!res.ok)
|
|
87
|
-
throw new Error(`task failed: ${String(res.error)}`);
|
|
88
|
-
return '';
|
|
89
|
-
}
|
|
90
|
-
describe('verify acceptance injection (ADR-0020 Fase 6)', () => {
|
|
91
|
-
beforeEach(() => {
|
|
92
|
-
resetTaskSpawnCount();
|
|
93
|
-
resetKrakenCandidates();
|
|
94
|
-
});
|
|
95
|
-
afterEach(() => {
|
|
96
|
-
resetKrakenCandidates();
|
|
97
|
-
});
|
|
98
|
-
it('selected verdict → requiredChecks become the verify acceptance', async () => {
|
|
99
|
-
const { deps, userPrompts } = capturingDeps();
|
|
100
|
-
setKrakenSelection(verdict('selected'));
|
|
101
|
-
await spawnVerify(deps);
|
|
102
|
-
const prompt = userPrompts()[0];
|
|
103
|
-
expect(prompt).toContain('## Acceptance criteria');
|
|
104
|
-
expect(prompt).toContain(CHECKS[0]);
|
|
105
|
-
expect(prompt).toContain(CHECKS[1]);
|
|
106
|
-
});
|
|
107
|
-
it('merges with parent acceptance, deduped case-insensitively', async () => {
|
|
108
|
-
const { deps, userPrompts } = capturingDeps();
|
|
109
|
-
setKrakenSelection(verdict('selected'));
|
|
110
|
-
await spawnVerify(deps, [
|
|
111
|
-
'Existing criterion', // parent-provided, must be kept
|
|
112
|
-
'Unit Test For Session Refresh Passes', // same check, different case
|
|
113
|
-
]);
|
|
114
|
-
const prompt = userPrompts()[0];
|
|
115
|
-
expect(prompt).toContain('Existing criterion');
|
|
116
|
-
// dedupe: the case-variant does not produce a second copy
|
|
117
|
-
expect(prompt.match(/session refresh passes/gi)).toHaveLength(1);
|
|
118
|
-
// the non-duplicated required check is appended once
|
|
119
|
-
expect(prompt.match(/Set-Cookie regression/gi)).toHaveLength(1);
|
|
120
|
-
});
|
|
121
|
-
it('needs_more_evidence → checks stay advisory (no injection)', async () => {
|
|
122
|
-
const { deps, userPrompts } = capturingDeps();
|
|
123
|
-
setKrakenSelection(verdict('needs_more_evidence'));
|
|
124
|
-
await spawnVerify(deps);
|
|
125
|
-
expect(userPrompts()[0]).not.toContain('## Acceptance criteria');
|
|
126
|
-
expect(userPrompts()[0]).not.toContain(CHECKS[0]);
|
|
127
|
-
});
|
|
128
|
-
it('explore tentacle is never touched by the injection', async () => {
|
|
129
|
-
const { deps, userPrompts } = capturingDeps();
|
|
130
|
-
setKrakenSelection(verdict('selected'));
|
|
131
|
-
const tool = createTaskTool(deps);
|
|
132
|
-
await tool.execute({ description: 'explore', prompt: 'Look around.', agent: 'explore' }, makeCtx());
|
|
133
|
-
expect(userPrompts()[0]).not.toContain('## Acceptance criteria');
|
|
134
|
-
expect(userPrompts()[0]).not.toContain(CHECKS[0]);
|
|
135
|
-
});
|
|
136
|
-
it('general tentacle keeps its own acceptance only', async () => {
|
|
137
|
-
const { deps, userPrompts } = capturingDeps();
|
|
138
|
-
setKrakenSelection(verdict('selected'));
|
|
139
|
-
const tool = createTaskTool(deps);
|
|
140
|
-
await tool.execute({
|
|
141
|
-
description: 'impl',
|
|
142
|
-
prompt: 'Implement.',
|
|
143
|
-
agent: 'general',
|
|
144
|
-
acceptance: ['Only criterion'],
|
|
145
|
-
}, makeCtx());
|
|
146
|
-
const prompt = userPrompts()[0];
|
|
147
|
-
expect(prompt).toContain('Only criterion');
|
|
148
|
-
expect(prompt).not.toContain(CHECKS[0]);
|
|
149
|
-
});
|
|
150
|
-
it('no selection this turn → verify prompt unchanged (no acceptance)', async () => {
|
|
151
|
-
const { deps, userPrompts } = capturingDeps();
|
|
152
|
-
await spawnVerify(deps);
|
|
153
|
-
expect(userPrompts()[0]).not.toContain('## Acceptance criteria');
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
//# sourceMappingURL=taskTool.dynamicChecks.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"taskTool.dynamicChecks.test.js","sourceRoot":"","sources":["../../../src/cli/tools/taskTool.dynamicChecks.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EACL,cAAc,EACd,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AAGxC,SAAS,OAAO;IACd,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,OAAO,CAAC,GAAG,GAAG,OAAO,EAAE;IAC9B,OAAO;QACL,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;QACpC,GAAG;QACH,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;QACtB,SAAS,EAAE,qBAAqB;KACjC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa;IACpB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAiB;QACzB,qBAAqB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACzC,MAAM,GAAG,GAAoB;gBAC3B,cAAc,EAAE,CAAC,GAAG,EAAE;oBACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,CAAC,CAAiD;gBAClD,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,eAAe;gBACzB,QAAQ,EAAE,IAAI,YAAY,EAAE;gBAC5B,KAAK,EAAE,EAAE;gBACT,KAAK;aACN,CAAC;YACF,OAAO,GAAG,CAAC;QACb,CAAC;QACD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO;gBACL,GAAG,EAAE,KAAK,SAAS,CAAC;oBAClB,MAAM,EAAE,IAAI,EAAE,eAAe,EAAgB,CAAC;oBAC9C,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAgB,CAAC;oBACjE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAgB,CAAC;gBAC9C,CAAC;aACF,CAAC;QACJ,CAAC;QACD,aAAa,EAAE,KAAK;KACrB,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,MAAM,GAAG;IACb,sCAAsC;IACtC,oCAAoC;CACrC,CAAC;AAEF,SAAS,OAAO,CACd,MAA0C,EAC1C,iBAA2B,MAAM;IAEjC,OAAO;QACL,MAAM;QACN,WAAW,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC7C,SAAS,EAAE,sBAAsB;QACjC,cAAc;QACd,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;QACvC,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAkB,EAClB,UAAqB;IAErB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B;QACE,WAAW,EAAE,gBAAgB;QAC7B,MAAM,EAAE,4BAA4B;QACpC,KAAK,EAAE,QAAQ;QACf,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,EACD,OAAO,EAAE,CACV,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,UAAU,CAAC,GAAG,EAAE;QACd,mBAAmB,EAAE,CAAC;QACtB,qBAAqB,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,qBAAqB,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9C,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACxC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9C,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACxC,MAAM,WAAW,CAAC,IAAI,EAAE;YACtB,oBAAoB,EAAE,gCAAgC;YACtD,sCAAsC,EAAE,6BAA6B;SACtE,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC/C,0DAA0D;QAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjE,qDAAqD;QACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9C,kBAAkB,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACnD,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9C,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,OAAO,CAChB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,EACpE,OAAO,EAAE,CACV,CAAC;QACF,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9C,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,OAAO,CAChB;YACE,WAAW,EAAE,MAAM;YACnB,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,CAAC,gBAAgB,CAAC;SAC/B,EACD,OAAO,EAAE,CACV,CAAC;QACF,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9C,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|