zelari-code 2.0.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +5 -5
  2. package/dist/cli/hooks/useChatTurn.js +2 -1
  3. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  4. package/dist/cli/kraken/candidateRegistry.js +15 -1
  5. package/dist/cli/kraken/candidateRegistry.js.map +1 -1
  6. package/dist/cli/kraken/verificationBridge.js +125 -14
  7. package/dist/cli/kraken/verificationBridge.js.map +1 -1
  8. package/dist/cli/kraken/verifierLifecycle.js +88 -0
  9. package/dist/cli/kraken/verifierLifecycle.js.map +1 -0
  10. package/dist/cli/kraken/verifyReport.js.map +1 -1
  11. package/dist/cli/main.bundled.js +272 -89
  12. package/dist/cli/main.bundled.js.map +4 -4
  13. package/dist/cli/runHeadless.js +44 -93
  14. package/dist/cli/runHeadless.js.map +1 -1
  15. package/dist/cli/tools/taskTool.js +49 -3
  16. package/dist/cli/tools/taskTool.js.map +1 -1
  17. package/package.json +8 -5
  18. package/dist/cli/ast/engine.test.js +0 -101
  19. package/dist/cli/ast/engine.test.js.map +0 -1
  20. package/dist/cli/ast/tools.test.js +0 -124
  21. package/dist/cli/ast/tools.test.js.map +0 -1
  22. package/dist/cli/headless.test.js +0 -107
  23. package/dist/cli/headless.test.js.map +0 -1
  24. package/dist/cli/headlessE2eSession.test.js +0 -189
  25. package/dist/cli/headlessE2eSession.test.js.map +0 -1
  26. package/dist/cli/headlessHistorySeed.test.js +0 -158
  27. package/dist/cli/headlessHistorySeed.test.js.map +0 -1
  28. package/dist/cli/headlessSessionEvent.test.js +0 -83
  29. package/dist/cli/headlessSessionEvent.test.js.map +0 -1
  30. package/dist/cli/headlessSpine.test.js +0 -153
  31. package/dist/cli/headlessSpine.test.js.map +0 -1
  32. package/dist/cli/hooks/observationStore.test.js +0 -135
  33. package/dist/cli/hooks/observationStore.test.js.map +0 -1
  34. package/dist/cli/hooks/sessionSurface.test.js +0 -112
  35. package/dist/cli/hooks/sessionSurface.test.js.map +0 -1
  36. package/dist/cli/kraken/candidateRegistry.test.js +0 -211
  37. package/dist/cli/kraken/candidateRegistry.test.js.map +0 -1
  38. package/dist/cli/kraken/completionGate.test.js +0 -172
  39. package/dist/cli/kraken/completionGate.test.js.map +0 -1
  40. package/dist/cli/kraken/evidenceAnchoring.test.js +0 -92
  41. package/dist/cli/kraken/evidenceAnchoring.test.js.map +0 -1
  42. package/dist/cli/kraken/executor.workbench.test.js +0 -134
  43. package/dist/cli/kraken/executor.workbench.test.js.map +0 -1
  44. package/dist/cli/kraken/metrics.test.js +0 -145
  45. package/dist/cli/kraken/metrics.test.js.map +0 -1
  46. package/dist/cli/kraken/nativeVerification.test.js +0 -207
  47. package/dist/cli/kraken/nativeVerification.test.js.map +0 -1
  48. package/dist/cli/kraken/planner.test.js +0 -43
  49. package/dist/cli/kraken/planner.test.js.map +0 -1
  50. package/dist/cli/kraken/scriptPlanner.test.js +0 -152
  51. package/dist/cli/kraken/scriptPlanner.test.js.map +0 -1
  52. package/dist/cli/kraken/selectionPlaybook.test.js +0 -55
  53. package/dist/cli/kraken/selectionPlaybook.test.js.map +0 -1
  54. package/dist/cli/kraken/skillSuggest.test.js +0 -157
  55. package/dist/cli/kraken/skillSuggest.test.js.map +0 -1
  56. package/dist/cli/kraken/strictDefaults.test.js +0 -149
  57. package/dist/cli/kraken/strictDefaults.test.js.map +0 -1
  58. package/dist/cli/kraken/turnRuntime.test.js +0 -377
  59. package/dist/cli/kraken/turnRuntime.test.js.map +0 -1
  60. package/dist/cli/kraken/verificationBridge.session.test.js +0 -104
  61. package/dist/cli/kraken/verificationBridge.session.test.js.map +0 -1
  62. package/dist/cli/kraken/verificationBridge.test.js +0 -177
  63. package/dist/cli/kraken/verificationBridge.test.js.map +0 -1
  64. package/dist/cli/kraken/verifier.test.js +0 -232
  65. package/dist/cli/kraken/verifier.test.js.map +0 -1
  66. package/dist/cli/kraken/verifierAdvisoryLock.test.js +0 -154
  67. package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +0 -1
  68. package/dist/cli/kraken/verifierRoundTrip.test.js +0 -166
  69. package/dist/cli/kraken/verifierRoundTrip.test.js.map +0 -1
  70. package/dist/cli/kraken/verifierSettings.test.js +0 -237
  71. package/dist/cli/kraken/verifierSettings.test.js.map +0 -1
  72. package/dist/cli/kraken/verifyReport.test.js +0 -111
  73. package/dist/cli/kraken/verifyReport.test.js.map +0 -1
  74. package/dist/cli/kraken/weaknessMeter.test.js +0 -212
  75. package/dist/cli/kraken/weaknessMeter.test.js.map +0 -1
  76. package/dist/cli/kraken/workbench.test.js +0 -253
  77. package/dist/cli/kraken/workbench.test.js.map +0 -1
  78. package/dist/cli/kraken/workbenchView.test.js +0 -130
  79. package/dist/cli/kraken/workbenchView.test.js.map +0 -1
  80. package/dist/cli/legacyContextIsolation.test.js +0 -65
  81. package/dist/cli/legacyContextIsolation.test.js.map +0 -1
  82. package/dist/cli/lsp/tools.test.js +0 -90
  83. package/dist/cli/lsp/tools.test.js.map +0 -1
  84. package/dist/cli/missionContinuation.test.js +0 -117
  85. package/dist/cli/missionContinuation.test.js.map +0 -1
  86. package/dist/cli/profileMatrix.test.js +0 -130
  87. package/dist/cli/profileMatrix.test.js.map +0 -1
  88. package/dist/cli/provider/capabilities.test.js +0 -46
  89. package/dist/cli/provider/capabilities.test.js.map +0 -1
  90. package/dist/cli/provider/openai-compatible.timeout.test.js +0 -72
  91. package/dist/cli/provider/openai-compatible.timeout.test.js.map +0 -1
  92. package/dist/cli/providerConfig.test.js +0 -85
  93. package/dist/cli/providerConfig.test.js.map +0 -1
  94. package/dist/cli/sessionReplayInvariant.test.js +0 -187
  95. package/dist/cli/sessionReplayInvariant.test.js.map +0 -1
  96. package/dist/cli/sessionSpine.test.js +0 -171
  97. package/dist/cli/sessionSpine.test.js.map +0 -1
  98. package/dist/cli/thinking.test.js +0 -214
  99. package/dist/cli/thinking.test.js.map +0 -1
  100. package/dist/cli/tools/inspectCommand.schema.test.js +0 -82
  101. package/dist/cli/tools/inspectCommand.schema.test.js.map +0 -1
  102. package/dist/cli/tools/inspectCommand.test.js +0 -311
  103. package/dist/cli/tools/inspectCommand.test.js.map +0 -1
  104. package/dist/cli/tools/krakenCsvFanout.test.js +0 -200
  105. package/dist/cli/tools/krakenCsvFanout.test.js.map +0 -1
  106. package/dist/cli/tools/krakenSelectTool.test.js +0 -246
  107. package/dist/cli/tools/krakenSelectTool.test.js.map +0 -1
  108. package/dist/cli/tools/observeBatch.test.js +0 -329
  109. package/dist/cli/tools/observeBatch.test.js.map +0 -1
  110. package/dist/cli/tools/taskTool.dynamicChecks.test.js +0 -156
  111. package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +0 -1
  112. package/dist/cli/tools/taskTool.planSafety.test.js +0 -280
  113. package/dist/cli/tools/taskTool.planSafety.test.js.map +0 -1
  114. package/dist/cli/tools/taskTool.verifyReport.test.js +0 -140
  115. package/dist/cli/tools/taskTool.verifyReport.test.js.map +0 -1
  116. package/dist/cli/utils/contextGrowthSummary.test.js +0 -74
  117. package/dist/cli/utils/contextGrowthSummary.test.js.map +0 -1
  118. package/dist/cli/workspace/planDriftCheck.test.js +0 -146
  119. package/dist/cli/workspace/planDriftCheck.test.js.map +0 -1
  120. package/dist/cli/workspace/planStore.test.js +0 -295
  121. package/dist/cli/workspace/planStore.test.js.map +0 -1
  122. package/dist/cli/zelariMission.test.js +0 -44
  123. package/dist/cli/zelariMission.test.js.map +0 -1
@@ -1,134 +0,0 @@
1
- /**
2
- * Executor → workbench wiring — tests.
3
- *
4
- * The WorkbenchWriter used to be a "prepared but unwired" feature: nothing in
5
- * the production flow ever constructed it, so `.zelari/radio/workbench-<id>.md`
6
- * never appeared and the desktop graph/tail tabs stayed empty no matter how
7
- * much the graph ran. These tests pin the wiring: run a tiny mock graph
8
- * through KrakenGraphExecutor and assert the workbench file is written with
9
- * the node rows and their statuses.
10
- */
11
- import { describe, expect, it } from 'vitest';
12
- import { promises as fs } from 'node:fs';
13
- import os from 'node:os';
14
- import path from 'node:path';
15
- import { buildGraphFromPlan } from './planner.js';
16
- import { KrakenGraphExecutor } from './executor.js';
17
- const WORKBENCH_ENV = 'ZELARI_KRAKEN_WORKBENCH';
18
- async function listRadioDir(cwd) {
19
- const dir = path.join(cwd, '.zelari', 'radio');
20
- try {
21
- return await fs.readdir(dir);
22
- }
23
- catch {
24
- return [];
25
- }
26
- }
27
- function okResult(description) {
28
- return {
29
- ok: true,
30
- agent: 'explore',
31
- thoroughness: 'medium',
32
- model: 'mock-model',
33
- result: `done: ${description}`,
34
- footer: '',
35
- worktreePath: null,
36
- worktreeHandle: null,
37
- };
38
- }
39
- describe('executor → workbench wiring', () => {
40
- it('writes a workbench file with nodes, deps and terminal statuses after a run', async () => {
41
- const cwd = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-wb-exec-'));
42
- const prev = process.env[WORKBENCH_ENV];
43
- process.env[WORKBENCH_ENV] = '1';
44
- try {
45
- const graph = buildGraphFromPlan('kraken-exec-test', [
46
- { id: 'e1', kind: 'explore', label: 'map auth', prompt: 'map auth', deps: [] },
47
- {
48
- id: 'g1',
49
- kind: 'general',
50
- label: 'auth fix',
51
- prompt: 'fix auth',
52
- scope: ['src/auth'],
53
- deps: ['e1'],
54
- },
55
- {
56
- id: 'g2',
57
- kind: 'general',
58
- label: 'tests',
59
- prompt: 'add tests',
60
- scope: ['tests/auth'],
61
- deps: ['e1'],
62
- },
63
- ]);
64
- const executor = new KrakenGraphExecutor({
65
- taskToolDeps: {
66
- createSubAgentContext: async () => null,
67
- },
68
- parentCwd: cwd,
69
- sessionId: 'sess-exec-test',
70
- goal: 'fix auth',
71
- runTentacleFn: async (opts) => okResult(opts.args.description),
72
- mergeFn: async () => ({
73
- ok: true,
74
- merged: false,
75
- committed: false,
76
- conflict: false,
77
- message: 'no-op',
78
- }),
79
- });
80
- const summary = await executor.execute(graph);
81
- expect(summary.converged).toBe(true);
82
- const files = await listRadioDir(cwd);
83
- const wb = files.find((f) => f.startsWith('workbench-') && f.endsWith('.md'));
84
- expect(wb, `expected a workbench-*.md file, got: ${files.join(', ')}`).toBeTruthy();
85
- const body = await fs.readFile(path.join(cwd, '.zelari', 'radio', wb), 'utf8');
86
- expect(body).toContain('**Goal:** fix auth');
87
- // Original planned nodes are in the Wave table...
88
- expect(body).toContain('| e1 | map auth | explore');
89
- expect(body).toContain('| g1 | auth fix | general |');
90
- // ...auto-injected verify + merge nodes too...
91
- expect(body).toContain('verify-');
92
- expect(body).toContain('| merge | merge parallel work |');
93
- // ...with terminal statuses and no lingering pending/running rows.
94
- expect(body).not.toContain('| ↑');
95
- expect(body).not.toContain('| ○');
96
- // ...and the run outcome is recorded in the event tail.
97
- expect(body).toContain('graph_converged');
98
- }
99
- finally {
100
- if (prev === undefined)
101
- delete process.env[WORKBENCH_ENV];
102
- else
103
- process.env[WORKBENCH_ENV] = prev;
104
- await fs.rm(cwd, { recursive: true, force: true });
105
- }
106
- });
107
- it('respects ZELARI_KRAKEN_WORKBENCH=0 (no workbench file written)', async () => {
108
- const cwd = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-wb-off-'));
109
- const prev = process.env[WORKBENCH_ENV];
110
- process.env[WORKBENCH_ENV] = '0';
111
- try {
112
- const graph = buildGraphFromPlan('kraken-exec-off', [
113
- { id: 'e1', kind: 'explore', label: 'a', prompt: 'a', deps: [] },
114
- ]);
115
- const executor = new KrakenGraphExecutor({
116
- taskToolDeps: { createSubAgentContext: async () => null },
117
- parentCwd: cwd,
118
- sessionId: 'sess-exec-off',
119
- runTentacleFn: async (opts) => okResult(opts.args.description),
120
- });
121
- await executor.execute(graph);
122
- const files = await listRadioDir(cwd);
123
- expect(files.filter((f) => f.startsWith('workbench-'))).toEqual([]);
124
- }
125
- finally {
126
- if (prev === undefined)
127
- delete process.env[WORKBENCH_ENV];
128
- else
129
- process.env[WORKBENCH_ENV] = prev;
130
- await fs.rm(cwd, { recursive: true, force: true });
131
- }
132
- });
133
- });
134
- //# sourceMappingURL=executor.workbench.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"executor.workbench.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/executor.workbench.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEhD,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,WAAmB;IACnC,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,SAAS,WAAW,EAAE;QAC9B,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,kBAAkB,CAAC,kBAAkB,EAAE;gBACnD,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC9E;oBACE,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,UAAU;oBACjB,MAAM,EAAE,UAAU;oBAClB,KAAK,EAAE,CAAC,UAAU,CAAC;oBACnB,IAAI,EAAE,CAAC,IAAI,CAAC;iBACb;gBACD;oBACE,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,OAAO;oBACd,MAAM,EAAE,WAAW;oBACnB,KAAK,EAAE,CAAC,YAAY,CAAC;oBACrB,IAAI,EAAE,CAAC,IAAI,CAAC;iBACb;aACF,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC;gBACvC,YAAY,EAAE;oBACZ,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;iBACxC;gBACD,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,gBAAgB;gBAC3B,IAAI,EAAE,UAAU;gBAChB,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9D,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;oBACpB,EAAE,EAAE,IAAI;oBACR,MAAM,EAAE,KAAK;oBACb,SAAS,EAAE,KAAK;oBAChB,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,OAAO;iBACjB,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAErC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9E,MAAM,CAAC,EAAE,EAAE,wCAAwC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;YAEpF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,EAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC7C,kDAAkD;YAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACtD,+CAA+C;YAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;YAC1D,mEAAmE;YACnE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAClC,wDAAwD;YACxD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;;gBACrD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;YACvC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,kBAAkB,CAAC,iBAAiB,EAAE;gBAClD,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;aACjE,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC;gBACvC,YAAY,EAAE,EAAE,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE;gBACzD,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,eAAe;gBAC1B,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;aAC/D,CAAC,CAAC;YACH,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;;gBACrD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;YACvC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,145 +0,0 @@
1
- import { afterEach, describe, expect, it } from 'vitest';
2
- import { collectKrakenTurnMetrics, markRepairSucceeded, markRepairTriggered, recordCandidateTokens, recordSelectionOutcome, resetKrakenTurnMetrics, } from './metrics.js';
3
- import { registerCandidate, resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection, } from './candidateRegistry.js';
4
- function verdict(partial) {
5
- return {
6
- status: 'selected',
7
- winnerIndex: 1,
8
- rationale: 'test',
9
- requiredChecks: [],
10
- degraded: false,
11
- verifier: null,
12
- judgedBy: 'deterministic',
13
- ...partial,
14
- };
15
- }
16
- function check(check, status) {
17
- return { check, status };
18
- }
19
- afterEach(() => {
20
- resetKrakenCandidates();
21
- resetKrakenTurnMetrics();
22
- });
23
- describe('collectKrakenTurnMetrics — null when no selection activity', () => {
24
- it('returns null on a plain turn (flag off ⇒ zero telemetry)', () => {
25
- resetKrakenCandidates();
26
- resetKrakenTurnMetrics();
27
- expect(collectKrakenTurnMetrics()).toBeNull();
28
- });
29
- it('returns null when only unrelated counters were touched', () => {
30
- recordCandidateTokens(0); // ignored by the guard
31
- expect(collectKrakenTurnMetrics()).toBeNull();
32
- });
33
- });
34
- describe('candidate counters', () => {
35
- it('counts registered candidates (ok and malformed both cost)', () => {
36
- registerCandidate({
37
- status: 'ok',
38
- description: 'h1',
39
- report: {
40
- hypothesis: 'h1',
41
- evidence: [{ claim: 'observed', basis: 'src/x.ts:10', degraded: false }],
42
- risks: [],
43
- hasDegradedEvidence: false,
44
- },
45
- raw: '',
46
- });
47
- registerCandidate({ status: 'malformed', description: 'h2', error: 'bad', raw: '' });
48
- const m = collectKrakenTurnMetrics();
49
- expect(m?.candidateCount).toBe(2);
50
- expect(m?.selectionUsed).toBe(false); // no kraken_select yet
51
- });
52
- it('sums provider-reported candidate tokens, ignoring junk', () => {
53
- registerCandidate({
54
- status: 'ok',
55
- description: 'h1',
56
- report: {
57
- hypothesis: 'h1',
58
- evidence: [],
59
- risks: [],
60
- hasDegradedEvidence: false,
61
- },
62
- raw: '',
63
- });
64
- recordCandidateTokens(1200);
65
- recordCandidateTokens(800.4); // rounded
66
- recordCandidateTokens(-5); // ignored
67
- recordCandidateTokens(Number.NaN); // ignored
68
- const m = collectKrakenTurnMetrics();
69
- expect(m?.candidateTokens).toBe(2000);
70
- });
71
- });
72
- describe('selection counters', () => {
73
- it('records latency/tokens/fallback from the judging call', () => {
74
- recordSelectionOutcome({ latencyMs: 1500, tokens: 900, degraded: false });
75
- const m = collectKrakenTurnMetrics();
76
- expect(m?.selectionLatencyMs).toBe(1500);
77
- expect(m?.selectionTokens).toBe(900);
78
- expect(m?.selectionFallback).toBe(false);
79
- });
80
- it('keeps tokens undefined when the provider reports none', () => {
81
- recordSelectionOutcome({ latencyMs: 200, degraded: true, fallbackReason: 'verifier call failed' });
82
- const m = collectKrakenTurnMetrics();
83
- expect(m?.selectionTokens).toBeUndefined();
84
- expect(m?.selectionFallback).toBe(true);
85
- expect(m?.selectionFallbackReason).toBe('verifier call failed');
86
- });
87
- it('flags needs_more_evidence from the persisted verdict', () => {
88
- setKrakenSelection(verdict({ status: 'needs_more_evidence', winnerIndex: null }));
89
- const m = collectKrakenTurnMetrics();
90
- expect(m?.selectionUsed).toBe(true);
91
- expect(m?.needsMoreEvidence).toBe(true);
92
- });
93
- });
94
- describe('verification counters', () => {
95
- it('classifies pass/fail/unknown from registry state', () => {
96
- setKrakenSelection(verdict({ requiredChecks: ['tests pass', 'build clean', 'lint clean'] }));
97
- setKrakenCheckResults([
98
- check('tests pass', 'pass'),
99
- check('build clean', 'fail'),
100
- // 'lint clean' unreported ⇒ unknown
101
- ]);
102
- const m = collectKrakenTurnMetrics();
103
- expect(m?.verificationPass).toBe(1);
104
- expect(m?.verificationFail).toBe(1);
105
- expect(m?.verificationUnknown).toBe(1);
106
- });
107
- it('reports zero verification counters before any verify tentacle', () => {
108
- setKrakenSelection(verdict({ requiredChecks: ['tests pass'] }));
109
- const m = collectKrakenTurnMetrics();
110
- expect(m?.verificationPass).toBe(0);
111
- expect(m?.verificationUnknown).toBe(1);
112
- });
113
- });
114
- describe('repair flags', () => {
115
- it('tracks triggered and success independently', () => {
116
- markRepairTriggered();
117
- let m = collectKrakenTurnMetrics();
118
- expect(m?.repairTriggered).toBe(true);
119
- expect(m?.repairSucceeded).toBe(false);
120
- markRepairSucceeded();
121
- m = collectKrakenTurnMetrics();
122
- expect(m?.repairSucceeded).toBe(true);
123
- });
124
- it('success without trigger is ignored (defensive)', () => {
125
- setKrakenSelection(verdict({})); // activity so the snapshot is non-null
126
- markRepairSucceeded();
127
- const m = collectKrakenTurnMetrics();
128
- expect(m?.repairTriggered).toBe(false);
129
- expect(m?.repairSucceeded).toBe(false);
130
- });
131
- });
132
- describe('reset', () => {
133
- it('clears transient counters but derives fresh from the registry', () => {
134
- recordSelectionOutcome({ latencyMs: 100, tokens: 50, degraded: false });
135
- markRepairTriggered();
136
- resetKrakenTurnMetrics();
137
- expect(collectKrakenTurnMetrics()).toBeNull(); // registry also empty here
138
- setKrakenSelection(verdict({}));
139
- const m = collectKrakenTurnMetrics();
140
- expect(m?.repairTriggered).toBe(false);
141
- expect(m?.candidateTokens).toBe(0);
142
- expect(m?.selectionLatencyMs).toBeUndefined();
143
- });
144
- });
145
- //# sourceMappingURL=metrics.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/metrics.test.ts"],"names":[],"mappings":"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"}
@@ -1,207 +0,0 @@
1
- /**
2
- * nativeVerification tests — F2 / Exit-2.4: the Zelari Coding Criteria Pack
3
- * runs natively in the Kraken strict-build path.
4
- *
5
- * Locks the composition contract:
6
- * - pack is opt-in (ZELARI_VERIFY_PACK=1), default off during the alpha;
7
- * - env overrides replace `npm run <script>` binding (hermetic tests);
8
- * - required criteria without a bound command are DROPPED, not unknowned;
9
- * - a failing pack command forces REPAIR_REQUIRED even when every selection
10
- * check passed with verify-agent evidence (deterministic beats narrative);
11
- * - all-pass pack + all-pass selection → PASS, and the spine payload
12
- * carries the native results with command digests.
13
- */
14
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
15
- import { buildNativeCriteria, evaluateNativePack, nativePackEnabled, packTimeoutMs, resolvePackCommands, } from './nativeVerification.js';
16
- import { evaluateStrictBuildGate, strictGateEventPayload, } from './verificationBridge.js';
17
- import { resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection } from './candidateRegistry.js';
18
- const CHECKS = ['session survives concurrent refresh'];
19
- function emitSeq() {
20
- let n = 1;
21
- return async () => ({ seq: n++ });
22
- }
23
- function selectWithChecks(checks) {
24
- resetKrakenCandidates();
25
- setKrakenSelection({
26
- status: 'selected',
27
- winnerIndex: 0,
28
- rationale: 'test',
29
- requiredChecks: checks,
30
- degraded: false,
31
- verifier: null,
32
- judgedBy: 'llm',
33
- });
34
- }
35
- /** Deterministic shell stub: map each command to a canned ShellResult. */
36
- function stubShell(byCommand) {
37
- return {
38
- async exec(command) {
39
- const canned = byCommand[command] ?? { exit: 0, stdout: '' };
40
- return {
41
- exitCode: canned.exit ?? 0,
42
- stdout: canned.stdout ?? '',
43
- stderr: canned.stderr ?? '',
44
- durationMs: 1,
45
- timedOut: false,
46
- };
47
- },
48
- };
49
- }
50
- const TYPECHECK = 'fake-typecheck';
51
- const TEST = 'fake-test';
52
- const BUILD = 'fake-build';
53
- function packEnv(overrides = {}) {
54
- return {
55
- ZELARI_VERIFY_PACK: '1',
56
- ZELARI_VERIFY_TYPECHECK_CMD: TYPECHECK,
57
- ZELARI_VERIFY_TEST_CMD: TEST,
58
- ZELARI_VERIFY_BUILD_CMD: BUILD,
59
- ...overrides,
60
- };
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('nativePackEnabled (alpha opt-in)', () => {
76
- it('is OFF by default and only enabled by explicit flags', () => {
77
- expect(nativePackEnabled({})).toBe(false);
78
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: '1' })).toBe(true);
79
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: 'on' })).toBe(true);
80
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: 'true' })).toBe(true);
81
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: '0' })).toBe(false);
82
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: 'yes' })).toBe(false);
83
- });
84
- });
85
- describe('resolvePackCommands', () => {
86
- it('binds npm scripts present in package.json', () => {
87
- const cmds = resolvePackCommands({}, { typecheck: 'tsc -p .', test: 'vitest run' });
88
- expect(cmds.typecheckCommand).toBe('npm run typecheck');
89
- expect(cmds.testCommand).toBe('npm run test');
90
- expect(cmds.buildCommand).toBeNull(); // script absent → unbound
91
- });
92
- it('env override wins; empty string explicitly disables', () => {
93
- const cmds = resolvePackCommands({ ZELARI_VERIFY_TYPECHECK_CMD: 'tsc --noEmit', ZELARI_VERIFY_TEST_CMD: '' }, { typecheck: 'x', test: 'y', build: 'z' });
94
- expect(cmds.typecheckCommand).toBe('tsc --noEmit');
95
- expect(cmds.testCommand).toBeNull();
96
- expect(cmds.buildCommand).toBe('npm run build');
97
- });
98
- it('packTimeoutMs clamps to [1, 3600000] and defaults to 600000', () => {
99
- expect(packTimeoutMs({})).toBe(600_000);
100
- expect(packTimeoutMs({ ZELARI_VERIFY_TIMEOUT_MS: '5000' })).toBe(5_000);
101
- expect(packTimeoutMs({ ZELARI_VERIFY_TIMEOUT_MS: '-3' })).toBe(600_000);
102
- expect(packTimeoutMs({ ZELARI_VERIFY_TIMEOUT_MS: '99999999' })).toBe(3_600_000);
103
- });
104
- });
105
- describe('buildNativeCriteria', () => {
106
- it('drops required criteria without a bound command; keeps advisory ones', () => {
107
- const criteria = buildNativeCriteria({ typecheckCommand: 'tsc', testCommand: null, buildCommand: null }, 1_000);
108
- const ids = criteria.map((c) => c.id);
109
- expect(ids).toContain('correctness.error-signals');
110
- expect(ids).not.toContain('correctness.specification');
111
- expect(ids).not.toContain('correctness.observable-output');
112
- // advisories stay even unbound — they surface as honest `unknown`
113
- expect(ids).toContain('evidence.verification-quality');
114
- });
115
- });
116
- describe('evaluateNativePack', () => {
117
- it('returns null when disabled or when no command is bound', async () => {
118
- expect(await evaluateNativePack({ env: {}, shell: stubShell({}) })).toBeNull();
119
- expect(await evaluateNativePack({
120
- env: { ZELARI_VERIFY_PACK: '1' },
121
- cwd: 'Z:/__no_such_repo__',
122
- shell: stubShell({}),
123
- })).toBeNull();
124
- });
125
- it('runs bound commands through the core engine and returns digested evidence', async () => {
126
- const pack = await evaluateNativePack({
127
- env: packEnv(),
128
- shell: stubShell({
129
- [TYPECHECK]: { exit: 0, stdout: 'no errors' },
130
- [TEST]: { exit: 0, stdout: '58 passed' },
131
- [BUILD]: { exit: 0, stdout: 'bundled' },
132
- }),
133
- });
134
- expect(pack).not.toBeNull();
135
- const byId = new Map(pack.results.map((r) => [r.criterionId, r]));
136
- expect(byId.get('correctness.error-signals')?.status).toBe('pass');
137
- expect(byId.get('correctness.specification')?.status).toBe('pass');
138
- const ev = byId.get('correctness.specification')?.evidence[0];
139
- expect(ev?.tier).toBe('command-output');
140
- expect(ev?.digest).toMatch(/^[0-9a-f]{64}$/);
141
- });
142
- });
143
- describe('evaluateStrictBuildGate × native pack (F2 lock)', () => {
144
- it('failing typecheck forces REPAIR_REQUIRED even when every selection check passes with notes', async () => {
145
- selectWithChecks(CHECKS);
146
- setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'vitest 58/58' }]);
147
- const gate = await evaluateStrictBuildGate('build', {
148
- env: packEnv(),
149
- emit: emitSeq(),
150
- shell: stubShell({
151
- [TYPECHECK]: { exit: 2, stderr: 'TS2345: argument of type...' },
152
- [TEST]: { exit: 0, stdout: '58 passed' },
153
- [BUILD]: { exit: 0, stdout: 'ok' },
154
- }),
155
- });
156
- expect(gate.strict).toBe(true);
157
- expect(gate.native).not.toBeNull();
158
- expect(gate.evaluation.verdict).toBe('REPAIR_REQUIRED');
159
- expect(gate.blocked).toBe(true);
160
- const failed = gate.evaluation.unsatisfied.find((u) => u.id === 'correctness.error-signals');
161
- expect(failed?.status).toBe('fail');
162
- });
163
- it('all-pass pack + all-pass selection → PASS with native results in the payload', async () => {
164
- selectWithChecks(CHECKS);
165
- setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'vitest 58/58' }]);
166
- const gate = await evaluateStrictBuildGate('build', {
167
- env: packEnv(),
168
- emit: emitSeq(),
169
- shell: stubShell({
170
- [TYPECHECK]: { exit: 0 },
171
- [TEST]: { exit: 0, stdout: '58 passed' },
172
- [BUILD]: { exit: 0 },
173
- }),
174
- });
175
- expect(gate.evaluation.verdict).toBe('PASS');
176
- expect(gate.blocked).toBe(false);
177
- const payload = strictGateEventPayload(gate);
178
- expect(payload.engine).toBe('kraken-legacy+completion-policy+criteria-pack');
179
- expect(payload.native).toMatchObject({ packId: 'zelari-coding/v1' });
180
- const results = payload.native.results;
181
- expect(results.filter((r) => r.status === 'pass').length).toBeGreaterThanOrEqual(3);
182
- });
183
- it('pack disabled (default) → native null and identical legacy-only verdict', async () => {
184
- selectWithChecks(CHECKS);
185
- setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'vitest 58/58' }]);
186
- const gate = await evaluateStrictBuildGate('build', { env: {}, emit: emitSeq(), shell: stubShell({}) });
187
- expect(gate.native).toBeNull();
188
- expect(gate.evaluation.verdict).toBe('PASS');
189
- expect(strictGateEventPayload(gate).engine).toBe('kraken-legacy+completion-policy');
190
- });
191
- it('a pack criterion timing out is unknown — blockers add, unknown never passes silently', async () => {
192
- selectWithChecks(CHECKS);
193
- setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'ok' }]);
194
- const timeoutShell = {
195
- async exec(command) {
196
- if (command === TEST) {
197
- return { exitCode: null, stdout: '', stderr: '', durationMs: 9, timedOut: true };
198
- }
199
- return { exitCode: 0, stdout: '', stderr: '', durationMs: 1, timedOut: false };
200
- },
201
- };
202
- const gate = await evaluateStrictBuildGate('build', { env: packEnv(), emit: emitSeq(), shell: timeoutShell });
203
- expect(gate.evaluation.verdict).toBe('BLOCKED'); // unknown ≠ pass
204
- expect(gate.blocked).toBe(true);
205
- });
206
- });
207
- //# sourceMappingURL=nativeVerification.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nativeVerification.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/nativeVerification.test.ts"],"names":[],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- /**
2
- * Tests for the planner system prompt builder.
3
- *
4
- * Today the only knob is the Bennett's Razor opt-in. Future knobs (e.g.
5
- * "include the Gauntlet Loop recipe", "include an example plan") belong
6
- * here as well — keep all prompt-shape decisions in one tested place.
7
- *
8
- * @since v1.31.x — Bennett's Razor opt-in
9
- */
10
- import { describe, expect, it } from 'vitest';
11
- import { KRAKEN_PLANNER_SYSTEM_PROMPT, buildPlannerSystemPrompt, } from './planner.js';
12
- describe('buildPlannerSystemPrompt', () => {
13
- it('returns the base prompt unchanged when the env var is unset', () => {
14
- expect(buildPlannerSystemPrompt({})).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
15
- expect(buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: '' })).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
16
- });
17
- it('returns the base prompt for non-truthy env values', () => {
18
- expect(buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: '0' })).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
19
- expect(buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: 'false' })).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
20
- expect(buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: 'no' })).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
21
- });
22
- it('appends the Bennett\'s Razor section when ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR=1', () => {
23
- const prompt = buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: '1' });
24
- expect(prompt).toContain(KRAKEN_PLANNER_SYSTEM_PROMPT);
25
- expect(prompt).toMatch(/Bennett/i);
26
- expect(prompt).toMatch(/assumes? the least/i);
27
- expect(prompt).toMatch(/tie-breaker/i);
28
- expect(prompt.length).toBeGreaterThan(KRAKEN_PLANNER_SYSTEM_PROMPT.length + 200);
29
- });
30
- it('also accepts "true" (case-insensitive) as truthy', () => {
31
- const prompt = buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: 'TRUE' });
32
- expect(prompt).toMatch(/Bennett/i);
33
- });
34
- it('appends the section AFTER the base prompt (not before)', () => {
35
- const prompt = buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: '1' });
36
- const baseIdx = prompt.indexOf(KRAKEN_PLANNER_SYSTEM_PROMPT);
37
- const razorIdx = prompt.indexOf("Bennett's Razor");
38
- expect(baseIdx).toBe(0);
39
- expect(razorIdx).toBeGreaterThan(0);
40
- expect(razorIdx).toBeGreaterThan(KRAKEN_PLANNER_SYSTEM_PROMPT.length);
41
- });
42
- });
43
- //# sourceMappingURL=planner.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"planner.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/planner.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,CAAC,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACjF,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAClF,4BAA4B,CAC7B,CAAC;QACF,MAAM,CAAC,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CACtF,4BAA4B,CAC7B,CAAC;QACF,MAAM,CAAC,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACnF,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,4BAA4B,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}