zelari-code 1.48.0 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/cli/desktopConfig.js +51 -4
  2. package/dist/cli/desktopConfig.js.map +1 -1
  3. package/dist/cli/hooks/useChatTurn.js +80 -0
  4. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  5. package/dist/cli/kraken/candidateRegistry.js +195 -0
  6. package/dist/cli/kraken/candidateRegistry.js.map +1 -0
  7. package/dist/cli/kraken/candidateRegistry.test.js +211 -0
  8. package/dist/cli/kraken/candidateRegistry.test.js.map +1 -0
  9. package/dist/cli/kraken/completionGate.js +116 -0
  10. package/dist/cli/kraken/completionGate.js.map +1 -0
  11. package/dist/cli/kraken/completionGate.test.js +172 -0
  12. package/dist/cli/kraken/completionGate.test.js.map +1 -0
  13. package/dist/cli/kraken/metrics.js +96 -0
  14. package/dist/cli/kraken/metrics.js.map +1 -0
  15. package/dist/cli/kraken/metrics.test.js +145 -0
  16. package/dist/cli/kraken/metrics.test.js.map +1 -0
  17. package/dist/cli/kraken/selectionPlaybook.js +23 -0
  18. package/dist/cli/kraken/selectionPlaybook.js.map +1 -0
  19. package/dist/cli/kraken/selectionPlaybook.test.js +55 -0
  20. package/dist/cli/kraken/selectionPlaybook.test.js.map +1 -0
  21. package/dist/cli/kraken/turnRuntime.js +207 -0
  22. package/dist/cli/kraken/turnRuntime.js.map +1 -0
  23. package/dist/cli/kraken/turnRuntime.test.js +377 -0
  24. package/dist/cli/kraken/turnRuntime.test.js.map +1 -0
  25. package/dist/cli/kraken/verifier.js +233 -0
  26. package/dist/cli/kraken/verifier.js.map +1 -0
  27. package/dist/cli/kraken/verifier.test.js +232 -0
  28. package/dist/cli/kraken/verifier.test.js.map +1 -0
  29. package/dist/cli/kraken/verifierSettings.test.js +237 -0
  30. package/dist/cli/kraken/verifierSettings.test.js.map +1 -0
  31. package/dist/cli/kraken/verifyReport.js +115 -0
  32. package/dist/cli/kraken/verifyReport.js.map +1 -0
  33. package/dist/cli/kraken/verifyReport.test.js +111 -0
  34. package/dist/cli/kraken/verifyReport.test.js.map +1 -0
  35. package/dist/cli/main.bundled.js +1369 -111
  36. package/dist/cli/main.bundled.js.map +4 -4
  37. package/dist/cli/provider/openai-compatible.js +40 -6
  38. package/dist/cli/provider/openai-compatible.js.map +1 -1
  39. package/dist/cli/provider/openai-compatible.timeout.test.js +72 -0
  40. package/dist/cli/provider/openai-compatible.timeout.test.js.map +1 -0
  41. package/dist/cli/providerConfig.js +46 -0
  42. package/dist/cli/providerConfig.js.map +1 -1
  43. package/dist/cli/runHeadless.js +85 -0
  44. package/dist/cli/runHeadless.js.map +1 -1
  45. package/dist/cli/toolRegistry.js +50 -6
  46. package/dist/cli/toolRegistry.js.map +1 -1
  47. package/dist/cli/tools/krakenSelectTool.js +165 -0
  48. package/dist/cli/tools/krakenSelectTool.js.map +1 -0
  49. package/dist/cli/tools/krakenSelectTool.test.js +246 -0
  50. package/dist/cli/tools/krakenSelectTool.test.js.map +1 -0
  51. package/dist/cli/tools/taskTool.dynamicChecks.test.js +156 -0
  52. package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +1 -0
  53. package/dist/cli/tools/taskTool.js +174 -6
  54. package/dist/cli/tools/taskTool.js.map +1 -1
  55. package/dist/cli/tools/taskTool.planSafety.test.js +280 -0
  56. package/dist/cli/tools/taskTool.planSafety.test.js.map +1 -0
  57. package/dist/cli/tools/taskTool.verifyReport.test.js +140 -0
  58. package/dist/cli/tools/taskTool.verifyReport.test.js.map +1 -0
  59. package/package.json +2 -2
@@ -0,0 +1,140 @@
1
+ /**
2
+ * taskTool.verifyReport.test — Fase 7 / ADR-0020 (Kraken Verified Selection).
3
+ *
4
+ * Structured verification wiring inside the task tool:
5
+ * - verify tentacle conclusion with `<verify-report>` blocks → results
6
+ * registered in the turn registry (checksPassed counts only `pass`)
7
+ * - failed verify tentacle → ALL checks unknown (degraded ≠ proof)
8
+ * - no selection this turn → nothing registered
9
+ * - explore tentacle never registers check results
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 { getKrakenCheckResults, krakenChecksPassed, resetKrakenCandidates, setKrakenSelection, } from '../kraken/candidateRegistry.js';
18
+ function tmpRoot() {
19
+ return fs.mkdtempSync(path.join(tmpdir(), 'zelari-verify-report-'));
20
+ }
21
+ function makeCtx(cwd = tmpRoot()) {
22
+ return {
23
+ signal: new AbortController().signal,
24
+ cwd,
25
+ audit: () => undefined,
26
+ sessionId: 'verify-report-test',
27
+ };
28
+ }
29
+ /**
30
+ * Deps fake whose scripted harness returns a fixed conclusion text.
31
+ * An empty conclusion simulates a tentacle that produced no output.
32
+ */
33
+ function scriptedDeps(conclusion) {
34
+ return {
35
+ createSubAgentContext: async ({ agent }) => {
36
+ const ctx = {
37
+ providerStream: (() => {
38
+ throw new Error('not invoked by the scripted harness');
39
+ }),
40
+ model: 'test-model',
41
+ provider: 'test-provider',
42
+ registry: new ToolRegistry(),
43
+ tools: [],
44
+ agent,
45
+ };
46
+ return ctx;
47
+ },
48
+ harnessFactory: () => ({
49
+ run: async function* () {
50
+ if (conclusion === '')
51
+ return;
52
+ yield { type: 'message_start' };
53
+ yield { type: 'message_delta', delta: conclusion };
54
+ yield { type: 'message_end' };
55
+ },
56
+ }),
57
+ allowWorktree: false,
58
+ };
59
+ }
60
+ const CHECKS = [
61
+ 'unit test for session refresh passes',
62
+ 'no Set-Cookie regression on logout',
63
+ ];
64
+ function selectedVerdict() {
65
+ return {
66
+ status: 'selected',
67
+ winnerIndex: 1,
68
+ rationale: 'grounded in evidence',
69
+ requiredChecks: CHECKS,
70
+ degraded: false,
71
+ verifier: { provider: 'p', model: 'm' },
72
+ judgedBy: 'llm',
73
+ };
74
+ }
75
+ const GOOD_CONCLUSION = [
76
+ 'Ran the targeted suite.',
77
+ '<verify-report>',
78
+ `check: ${CHECKS[0]}`,
79
+ 'status: pass',
80
+ 'note: vitest src/auth 41/41 green',
81
+ '</verify-report>',
82
+ '<verify-report>',
83
+ `check: ${CHECKS[1]}`,
84
+ 'status: fail',
85
+ 'note: logout still emits double Set-Cookie',
86
+ '</verify-report>',
87
+ ].join('\n');
88
+ async function spawn(deps, agent) {
89
+ const tool = createTaskTool(deps);
90
+ const res = await tool.execute({
91
+ description: 'verify the fix',
92
+ prompt: 'Verify the implementation.',
93
+ agent,
94
+ }, makeCtx());
95
+ return { ok: res.ok };
96
+ }
97
+ describe('structured verification registration (ADR-0020 Fase 7)', () => {
98
+ beforeEach(() => {
99
+ resetTaskSpawnCount();
100
+ resetKrakenCandidates();
101
+ });
102
+ afterEach(() => {
103
+ resetKrakenCandidates();
104
+ });
105
+ it('verify conclusion with blocks → per-check results registered, unknown ≠ pass', async () => {
106
+ setKrakenSelection(selectedVerdict());
107
+ const { ok } = await spawn(scriptedDeps(GOOD_CONCLUSION), 'verify');
108
+ expect(ok).toBe(true);
109
+ const results = getKrakenCheckResults();
110
+ expect(results).not.toBeNull();
111
+ expect(results?.map((r) => r.status)).toEqual(['pass', 'fail']);
112
+ expect(krakenChecksPassed()).toBe(1);
113
+ });
114
+ it('failed verify tentacle → all checks unknown, zero passed', async () => {
115
+ setKrakenSelection(selectedVerdict());
116
+ const { ok } = await spawn(scriptedDeps(''), 'verify');
117
+ expect(ok).toBe(false);
118
+ const results = getKrakenCheckResults();
119
+ expect(results?.map((r) => r.status)).toEqual(['unknown', 'unknown']);
120
+ expect(krakenChecksPassed()).toBe(0);
121
+ });
122
+ it('verify without report blocks → every check unknown (no report ≠ pass)', async () => {
123
+ setKrakenSelection(selectedVerdict());
124
+ await spawn(scriptedDeps('looks good to me, suite green'), 'verify');
125
+ expect(getKrakenCheckResults()?.map((r) => r.status)).toEqual(['unknown', 'unknown']);
126
+ expect(krakenChecksPassed()).toBe(0);
127
+ });
128
+ it('no selection this turn → nothing registered', async () => {
129
+ const { ok } = await spawn(scriptedDeps(GOOD_CONCLUSION), 'verify');
130
+ expect(ok).toBe(true);
131
+ expect(getKrakenCheckResults()).toBeNull();
132
+ expect(krakenChecksPassed()).toBeUndefined();
133
+ });
134
+ it('explore tentacle never registers check results', async () => {
135
+ setKrakenSelection(selectedVerdict());
136
+ await spawn(scriptedDeps(GOOD_CONCLUSION), 'explore');
137
+ expect(getKrakenCheckResults()).toBeNull();
138
+ });
139
+ });
140
+ //# sourceMappingURL=taskTool.verifyReport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskTool.verifyReport.test.js","sourceRoot":"","sources":["../../../src/cli/tools/taskTool.verifyReport.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zelari-code",
3
- "version": "1.48.0",
3
+ "version": "1.49.0",
4
4
  "description": "Zelari Code — AI Council coding agent CLI. Multi-agent orchestration (Caronte, Nettuno, Gerione, Plutone, Minosse, Lucifero) with slash commands, provider-agnostic LLM streaming, and self-update.",
5
5
  "author": "Anathema Studio <https://anathema-studio.com/>",
6
6
  "license": "Apache-2.0",
@@ -52,7 +52,7 @@
52
52
  },
53
53
  "devDependencies": {
54
54
  "@testing-library/react": "^16.3.2",
55
- "@zelari/core": "1.48.0",
55
+ "@zelari/core": "1.48.1",
56
56
  "@types/node": "^25.3.0",
57
57
  "@types/react": "^19.0.10",
58
58
  "esbuild": "^0.25.0",