zelari-code 1.25.0 → 1.26.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 (45) hide show
  1. package/README.md +3 -3
  2. package/dist/cli/app.js +4 -3
  3. package/dist/cli/app.js.map +1 -1
  4. package/dist/cli/buildPolicy.js +1 -1
  5. package/dist/cli/buildPolicy.js.map +1 -1
  6. package/dist/cli/companion/runManager.js +2 -2
  7. package/dist/cli/companion/runManager.js.map +1 -1
  8. package/dist/cli/companion/serve.js +1 -1
  9. package/dist/cli/companion/serve.js.map +1 -1
  10. package/dist/cli/components/StatusBar.js +7 -2
  11. package/dist/cli/components/StatusBar.js.map +1 -1
  12. package/dist/cli/headless.js +3 -3
  13. package/dist/cli/headless.js.map +1 -1
  14. package/dist/cli/hooks/useChatTurn.js +16 -12
  15. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  16. package/dist/cli/hooks/useSlashDispatch.js +8 -1
  17. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  18. package/dist/cli/main.bundled.js +1228 -581
  19. package/dist/cli/main.bundled.js.map +4 -4
  20. package/dist/cli/main.js +1 -1
  21. package/dist/cli/main.js.map +1 -1
  22. package/dist/cli/missionSlice.js +7 -6
  23. package/dist/cli/missionSlice.js.map +1 -1
  24. package/dist/cli/mode.js +21 -7
  25. package/dist/cli/mode.js.map +1 -1
  26. package/dist/cli/phase.js +1 -1
  27. package/dist/cli/runHeadless.js +9 -6
  28. package/dist/cli/runHeadless.js.map +1 -1
  29. package/dist/cli/slashCommands.js +17 -6
  30. package/dist/cli/slashCommands.js.map +1 -1
  31. package/dist/cli/toolRegistry.js +9 -4
  32. package/dist/cli/toolRegistry.js.map +1 -1
  33. package/dist/cli/tools/krakenLive.js +107 -0
  34. package/dist/cli/tools/krakenLive.js.map +1 -0
  35. package/dist/cli/tools/krakenModel.js +115 -0
  36. package/dist/cli/tools/krakenModel.js.map +1 -0
  37. package/dist/cli/tools/krakenRadio.js +95 -0
  38. package/dist/cli/tools/krakenRadio.js.map +1 -0
  39. package/dist/cli/tools/krakenWorktree.js +245 -0
  40. package/dist/cli/tools/krakenWorktree.js.map +1 -0
  41. package/dist/cli/tools/taskTool.js +206 -14
  42. package/dist/cli/tools/taskTool.js.map +1 -1
  43. package/dist/cli/workspace/composeContext.js +2 -2
  44. package/dist/cli/workspace/composeContext.js.map +1 -1
  45. package/package.json +2 -2
@@ -0,0 +1,245 @@
1
+ /**
2
+ * krakenWorktree — opt-in git worktree isolation for Kraken general tentacles (K7).
3
+ *
4
+ * Enable with ZELARI_KRAKEN_WORKTREE=1 (or "true").
5
+ *
6
+ * Flow:
7
+ * 1. git worktree add <repo>/.zelari/worktrees/kraken-<id> -b kraken/<id>
8
+ * 2. Run sub-agent with cwd = worktree path
9
+ * 3. On success (default): squash-merge branch into parent HEAD, then cleanup
10
+ * - ZELARI_KRAKEN_WORKTREE_AUTO_MERGE=0 → skip merge (still cleanup unless KEEP)
11
+ * - ZELARI_KRAKEN_WORKTREE_KEEP=1 → never merge/cleanup (manual)
12
+ * 4. On merge conflict: keep worktree + branch, report error in footer
13
+ *
14
+ * Windows: Git for Windows worktree. Paths are absolute.
15
+ */
16
+ import { execFile } from 'node:child_process';
17
+ import { existsSync, mkdirSync, rmSync } from 'node:fs';
18
+ import path from 'node:path';
19
+ import { promisify } from 'node:util';
20
+ import { randomBytes } from 'node:crypto';
21
+ const execFileAsync = promisify(execFile);
22
+ export function isKrakenWorktreeEnabled(env = process.env) {
23
+ const v = (env.ZELARI_KRAKEN_WORKTREE ?? '').trim().toLowerCase();
24
+ return v === '1' || v === 'true' || v === 'yes' || v === 'on';
25
+ }
26
+ export function shouldKeepWorktree(env = process.env) {
27
+ const v = (env.ZELARI_KRAKEN_WORKTREE_KEEP ?? '').trim().toLowerCase();
28
+ return v === '1' || v === 'true' || v === 'yes' || v === 'on';
29
+ }
30
+ /**
31
+ * Auto-merge after a successful general tentacle.
32
+ * Default ON when worktree is enabled and KEEP is off.
33
+ * Set ZELARI_KRAKEN_WORKTREE_AUTO_MERGE=0 to disable.
34
+ */
35
+ export function isKrakenWorktreeAutoMergeEnabled(env = process.env) {
36
+ if (shouldKeepWorktree(env))
37
+ return false;
38
+ const v = (env.ZELARI_KRAKEN_WORKTREE_AUTO_MERGE ?? '1').trim().toLowerCase();
39
+ if (v === '0' || v === 'false' || v === 'no' || v === 'off')
40
+ return false;
41
+ return true;
42
+ }
43
+ async function git(cwd, args) {
44
+ try {
45
+ const { stdout, stderr } = await execFileAsync('git', ['-C', cwd, ...args], {
46
+ maxBuffer: 16 * 1024 * 1024,
47
+ windowsHide: true,
48
+ });
49
+ return { ok: true, stdout: stdout ?? '', stderr: stderr ?? '', code: 0 };
50
+ }
51
+ catch (err) {
52
+ const e = err;
53
+ return {
54
+ ok: false,
55
+ stdout: e.stdout ?? '',
56
+ stderr: e.stderr ?? e.message ?? String(err),
57
+ code: typeof e.code === 'number' ? e.code : 1,
58
+ };
59
+ }
60
+ }
61
+ /** Resolve git toplevel for worktree add. */
62
+ export async function resolveGitRoot(cwd) {
63
+ const r = await git(cwd, ['rev-parse', '--show-toplevel']);
64
+ if (!r.ok)
65
+ return null;
66
+ const root = r.stdout.trim();
67
+ return root || null;
68
+ }
69
+ /**
70
+ * Create an isolated worktree for a general tentacle.
71
+ * Returns null if git unavailable or worktree add fails (caller falls back to shared cwd).
72
+ */
73
+ export async function createKrakenWorktree(cwd, label) {
74
+ const repoRoot = await resolveGitRoot(cwd);
75
+ if (!repoRoot)
76
+ return null;
77
+ const head = await git(repoRoot, ['rev-parse', 'HEAD']);
78
+ const baseSha = head.ok ? head.stdout.trim() : undefined;
79
+ const id = `${Date.now().toString(36)}-${randomBytes(3).toString('hex')}`;
80
+ const slug = (label ?? 'task')
81
+ .toLowerCase()
82
+ .replace(/[^a-z0-9]+/g, '-')
83
+ .replace(/^-|-$/g, '')
84
+ .slice(0, 24) || 'task';
85
+ const branch = `kraken/${slug}-${id}`;
86
+ const wtRoot = path.join(repoRoot, '.zelari', 'worktrees');
87
+ const wtPath = path.join(wtRoot, `kraken-${id}`);
88
+ try {
89
+ if (!existsSync(wtRoot))
90
+ mkdirSync(wtRoot, { recursive: true });
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ const add = await git(repoRoot, ['worktree', 'add', '-b', branch, wtPath, 'HEAD']);
96
+ if (!add.ok) {
97
+ const add2 = await git(repoRoot, ['worktree', 'add', wtPath, 'HEAD']);
98
+ if (!add2.ok)
99
+ return null;
100
+ return { id, branch: 'HEAD', path: wtPath, repoRoot, baseSha };
101
+ }
102
+ return { id, branch, path: wtPath, repoRoot, baseSha };
103
+ }
104
+ /**
105
+ * Commit dirty files inside the worktree (best-effort).
106
+ */
107
+ export async function commitWorktreeChanges(handle, message) {
108
+ const st = await git(handle.path, ['status', '--porcelain']);
109
+ if (!st.ok)
110
+ return { ok: false, committed: false, detail: st.stderr || 'status failed' };
111
+ if (st.stdout.trim()) {
112
+ const add = await git(handle.path, ['add', '-A']);
113
+ if (!add.ok)
114
+ return { ok: false, committed: false, detail: add.stderr || 'add failed' };
115
+ const msg = message.slice(0, 200) || `kraken tentacle ${handle.id}`;
116
+ const commit = await git(handle.path, [
117
+ 'commit',
118
+ '-m',
119
+ msg,
120
+ '--author',
121
+ 'Kraken Tentacle <kraken@zelari.local>',
122
+ ]);
123
+ if (!commit.ok) {
124
+ const st2 = await git(handle.path, ['status', '--porcelain']);
125
+ if (st2.ok && !st2.stdout.trim()) {
126
+ return { ok: true, committed: false, detail: 'clean after add' };
127
+ }
128
+ return { ok: false, committed: false, detail: commit.stderr || 'commit failed' };
129
+ }
130
+ return { ok: true, committed: true, detail: 'committed in worktree' };
131
+ }
132
+ return { ok: true, committed: false, detail: 'worktree clean' };
133
+ }
134
+ /**
135
+ * Squash-merge tentacle branch into the parent repo HEAD, then optionally cleanup.
136
+ */
137
+ export async function mergeKrakenWorktree(handle, opts = {}, env = process.env) {
138
+ if (!handle.branch || handle.branch === 'HEAD') {
139
+ return {
140
+ ok: false,
141
+ merged: false,
142
+ committed: false,
143
+ message: 'worktree has no named branch to merge',
144
+ };
145
+ }
146
+ const commitMsg = (opts.message ?? `kraken: merge ${handle.branch}`).slice(0, 200);
147
+ const pre = await commitWorktreeChanges(handle, commitMsg);
148
+ if (!pre.ok) {
149
+ return {
150
+ ok: false,
151
+ merged: false,
152
+ committed: false,
153
+ message: `pre-merge commit failed: ${pre.detail}`,
154
+ };
155
+ }
156
+ const range = handle.baseSha
157
+ ? `${handle.baseSha}..${handle.branch}`
158
+ : handle.branch;
159
+ const log = await git(handle.repoRoot, ['log', '--oneline', range]);
160
+ const ahead = log.ok ? log.stdout.trim() : '';
161
+ if (!ahead && !pre.committed) {
162
+ if (opts.cleanup !== false && !shouldKeepWorktree(env)) {
163
+ await cleanupKrakenWorktree(handle, env);
164
+ }
165
+ return {
166
+ ok: true,
167
+ merged: false,
168
+ committed: false,
169
+ message: 'no changes to merge (worktree empty)',
170
+ };
171
+ }
172
+ const merge = await git(handle.repoRoot, ['merge', '--squash', handle.branch]);
173
+ if (!merge.ok) {
174
+ const conflict = /conflict/i.test(merge.stderr) || /conflict/i.test(merge.stdout);
175
+ if (conflict) {
176
+ await git(handle.repoRoot, ['reset', '--merge']);
177
+ }
178
+ return {
179
+ ok: false,
180
+ merged: false,
181
+ committed: false,
182
+ conflict: true,
183
+ message: `merge conflict or failed: ${(merge.stderr || merge.stdout).trim().slice(0, 300)}`,
184
+ };
185
+ }
186
+ const stParent = await git(handle.repoRoot, ['status', '--porcelain']);
187
+ let committed = false;
188
+ if (stParent.ok && stParent.stdout.trim()) {
189
+ const c = await git(handle.repoRoot, ['commit', '-m', commitMsg]);
190
+ if (!c.ok) {
191
+ return {
192
+ ok: false,
193
+ merged: true,
194
+ committed: false,
195
+ message: `squash staged but commit failed: ${c.stderr.slice(0, 200)}`,
196
+ };
197
+ }
198
+ committed = true;
199
+ }
200
+ if (opts.cleanup !== false && !shouldKeepWorktree(env)) {
201
+ await cleanupKrakenWorktree(handle, env);
202
+ }
203
+ return {
204
+ ok: true,
205
+ merged: true,
206
+ committed,
207
+ message: committed
208
+ ? `squash-merged ${handle.branch} into HEAD`
209
+ : `squash-merge ${handle.branch} (no parent commit — already applied?)`,
210
+ };
211
+ }
212
+ /**
213
+ * Remove worktree + delete branch (best-effort).
214
+ * Skipped when ZELARI_KRAKEN_WORKTREE_KEEP=1.
215
+ */
216
+ export async function cleanupKrakenWorktree(handle, env = process.env) {
217
+ if (shouldKeepWorktree(env))
218
+ return;
219
+ await git(handle.repoRoot, ['worktree', 'remove', '--force', handle.path]);
220
+ try {
221
+ if (existsSync(handle.path)) {
222
+ rmSync(handle.path, { recursive: true, force: true });
223
+ }
224
+ }
225
+ catch {
226
+ // ignore
227
+ }
228
+ await git(handle.repoRoot, ['worktree', 'prune']);
229
+ if (handle.branch.startsWith('kraken/')) {
230
+ await git(handle.repoRoot, ['branch', '-D', handle.branch]);
231
+ }
232
+ }
233
+ /** One-line status for task result footer. */
234
+ export function formatWorktreeFooter(handle, opts = {}) {
235
+ const merge = opts.merge;
236
+ if (merge) {
237
+ const flag = merge.ok ? 'ok' : merge.conflict ? 'CONFLICT' : 'fail';
238
+ return `worktree merge [${flag}]: ${merge.message} (branch=${handle.branch})`;
239
+ }
240
+ if (opts.kept) {
241
+ return `worktree kept: branch=${handle.branch} path=${handle.path} (merge manually, then git worktree remove)`;
242
+ }
243
+ return `worktree used: branch=${handle.branch} path=${handle.path}`;
244
+ }
245
+ //# sourceMappingURL=krakenWorktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krakenWorktree.js","sourceRoot":"","sources":["../../../src/cli/tools/krakenWorktree.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,78 @@
1
1
  /**
2
- * taskTool — delegate a bounded sub-task to an isolated sub-agent.
2
+ * taskTool — delegate a bounded sub-task to an isolated sub-agent (Kraken tentacle).
3
3
  *
4
4
  * Isolation & safety:
5
5
  * - explore / verify: READ-ONLY (or read+bash for verify)
6
6
  * - general: full tools except nested `task` (no recursion)
7
7
  * - Parent gets only a short conclusion, not the full sub-transcript
8
+ * - Optional git worktree for general when ZELARI_KRAKEN_WORKTREE=1
9
+ * - Radio JSONL under .zelari/radio/ for parent observability
8
10
  *
9
- * @since v0.7.x · typed agents v1.21.0
11
+ * @since v0.7.x · typed agents v1.21.0 · Kraken contracts v1.x
10
12
  */
11
13
  import { z } from 'zod';
12
14
  import { typedOk, typedErr, } from '@zelari/core/harness/tools/toolTypes';
15
+ import { appendKrakenRadio } from './krakenRadio.js';
16
+ import { createKrakenWorktree, cleanupKrakenWorktree, formatWorktreeFooter, isKrakenWorktreeEnabled, shouldKeepWorktree, mergeKrakenWorktree, isKrakenWorktreeAutoMergeEnabled, } from './krakenWorktree.js';
17
+ import { krakenTentacleStart, krakenTentacleEnd } from './krakenLive.js';
13
18
  const EXPLORE_PROMPT = [
14
- 'You are a focused EXPLORE sub-agent for a parent coding agent.',
19
+ 'You are a focused EXPLORE tentacle of Kraken (parent super-agent).',
15
20
  'READ-ONLY tools only (read, list, grep, fetch). No edits, no shell.',
16
21
  'Gather only what you need, then STOP with a concise conclusion:',
17
22
  'file paths, symbols, line refs, and how things connect. No large dumps.',
23
+ 'Respect any Scope / Acceptance sections in the user prompt.',
18
24
  'Do not ask follow-up questions.',
19
25
  ].join('\n');
20
26
  const GENERAL_PROMPT = [
21
- 'You are a GENERAL sub-agent that can read AND modify the codebase for one',
22
- 'bounded unit of work. Prefer small, correct edits. Run checks when needed.',
23
- 'Return a short report: what changed, files touched, remaining risks.',
27
+ 'You are a GENERAL tentacle of Kraken that can read AND modify the codebase',
28
+ 'for one bounded unit of work. Prefer small, correct edits.',
29
+ 'Stay inside Scope paths if provided. Match existing style. No drive-by refactors.',
30
+ 'Run light checks when needed. Return: what changed, files touched, risks.',
24
31
  'Do not spawn further sub-agents. Do not expand scope beyond the prompt.',
32
+ 'If you are in a git worktree, edit only inside this working tree.',
25
33
  ].join('\n');
26
34
  const VERIFY_PROMPT = [
27
- 'You are a VERIFY sub-agent. Confirm whether work is correct on disk.',
35
+ 'You are a VERIFY tentacle of Kraken. Confirm whether work is correct on disk.',
28
36
  'You may read files and run test/build commands via bash. Prefer',
29
37
  'targeted checks over full suite when possible.',
30
- 'Report: pass/fail, commands run, key output, and gaps.',
38
+ 'Report: pass/fail, commands run, key output, and gaps vs Acceptance criteria.',
39
+ 'If Acceptance criteria are listed, check each one explicitly.',
31
40
  ].join('\n');
41
+ /** Reset spawn counter (call at start of each parent user turn). */
42
+ export function resetTaskSpawnCount() {
43
+ const g = globalThis;
44
+ g.__zelariTaskSpawnCount = 0;
45
+ }
46
+ /** Max concurrent/serial task spawns per parent turn (env override). */
47
+ export function maxTaskSpawnsPerTurn() {
48
+ const raw = process.env.ZELARI_KRAKEN_MAX_TASK_SPAWNS;
49
+ if (raw === undefined || raw === '')
50
+ return 6;
51
+ const n = Number.parseInt(raw, 10);
52
+ return Number.isFinite(n) && n > 0 ? Math.min(n, 32) : 6;
53
+ }
54
+ /**
55
+ * After a successful general tentacle that changed code, remind the parent
56
+ * to verify (K4 soft gate — prompt-level + result footer).
57
+ */
58
+ export function verifyHintForGeneral(acceptance) {
59
+ const acc = acceptance && acceptance.length > 0
60
+ ? ` Acceptance to check: ${acceptance.join('; ')}.`
61
+ : '';
62
+ return (`[kraken:verify-hint] General tentacle finished. Before claiming done, ` +
63
+ `run checks or spawn task agent=verify.${acc}`);
64
+ }
65
+ /** Build user message with optional contract fields (Fractal-style NODE contract). */
66
+ export function buildTaskUserPrompt(args) {
67
+ const parts = [args.prompt.trim()];
68
+ if (args.scope && args.scope.length > 0) {
69
+ parts.push('', '## Scope (path allowlist — do not edit outside)', ...args.scope.map((s) => `- ${s}`));
70
+ }
71
+ if (args.acceptance && args.acceptance.length > 0) {
72
+ parts.push('', '## Acceptance criteria', ...args.acceptance.map((a) => `- ${a}`));
73
+ }
74
+ return parts.join('\n');
75
+ }
32
76
  export function systemPromptForAgent(agent) {
33
77
  if (agent === 'general')
34
78
  return GENERAL_PROMPT;
@@ -69,7 +113,7 @@ const TaskArgsSchema = z.object({
69
113
  .string()
70
114
  .min(1)
71
115
  .describe('The full, self-contained instruction for the sub-agent. It has no access ' +
72
- 'to this conversation, so include all context it needs.'),
116
+ 'to this conversation, so include all context it needs. Prefer Goal/Scope/Acceptance.'),
73
117
  agent: z
74
118
  .enum(['explore', 'general', 'verify'])
75
119
  .optional()
@@ -79,6 +123,16 @@ const TaskArgsSchema = z.object({
79
123
  .enum(['quick', 'medium', 'deep'])
80
124
  .optional()
81
125
  .describe('How deep the sub-agent should go (tool budget). Default medium.'),
126
+ scope: z
127
+ .array(z.string().min(1))
128
+ .max(32)
129
+ .optional()
130
+ .describe('Optional path/glob allowlist for this tentacle (contract). Appended to the prompt as Scope.'),
131
+ acceptance: z
132
+ .array(z.string().min(1))
133
+ .max(16)
134
+ .optional()
135
+ .describe('Optional acceptance checklist (contract). Appended to the prompt as Acceptance criteria.'),
82
136
  });
83
137
  /**
84
138
  * Run a sub-agent to completion and return the text of its final assistant
@@ -120,35 +174,108 @@ export function createTaskTool(deps) {
120
174
  '- agent=explore (default): read-only research/search\n' +
121
175
  '- agent=general: can edit files for one bounded unit of work\n' +
122
176
  '- agent=verify: read + bash to run tests/checks\n' +
123
- 'Provide a fully self-contained `prompt` (sub-agent cannot see this conversation).',
177
+ 'Provide a fully self-contained `prompt` (sub-agent cannot see this conversation). ' +
178
+ 'Optional scope[] + acceptance[] contracts. After general, follow up with verify.',
124
179
  permissions: ['read', 'network', 'write', 'execute'],
125
180
  timeoutMs: 300_000,
126
181
  inputSchema: TaskArgsSchema,
127
182
  execute: async (args, ctx) => {
128
183
  const agent = args.agent ?? 'explore';
129
184
  const thoroughness = args.thoroughness ?? 'medium';
185
+ const started = Date.now();
186
+ const sessionId = ctx.sessionId || 'default';
187
+ const parentCwd = ctx.cwd || process.cwd();
188
+ // Per-process spawn cap (Kraken K3). Reset via resetTaskSpawnCount() each parent turn.
189
+ const g = globalThis;
190
+ g.__zelariTaskSpawnCount = (g.__zelariTaskSpawnCount ?? 0) + 1;
191
+ const spawnCap = maxTaskSpawnsPerTurn();
192
+ if (g.__zelariTaskSpawnCount > spawnCap) {
193
+ return typedErr(`task: spawn cap reached (${spawnCap}). Finish the current slice or raise ZELARI_KRAKEN_MAX_TASK_SPAWNS.`);
194
+ }
195
+ // Optional worktree isolation for general writers (K7).
196
+ let worktree = null;
197
+ let effectiveCwd = parentCwd;
198
+ const wantWt = agent === 'general' &&
199
+ deps.allowWorktree !== false &&
200
+ isKrakenWorktreeEnabled();
201
+ if (wantWt) {
202
+ try {
203
+ worktree = await createKrakenWorktree(parentCwd, args.description);
204
+ if (worktree)
205
+ effectiveCwd = worktree.path;
206
+ }
207
+ catch {
208
+ worktree = null;
209
+ }
210
+ }
211
+ appendKrakenRadio(parentCwd, sessionId, {
212
+ kind: 'spawn',
213
+ agent,
214
+ thoroughness,
215
+ description: args.description,
216
+ worktree: worktree?.path ?? null,
217
+ });
218
+ // G1 (K10): track the tentacle in-process so StatusBar / Desktop can show
219
+ // "tentacles 1↑ 2✓" live during the parent turn.
220
+ const liveId = krakenTentacleStart({
221
+ agent,
222
+ description: args.description,
223
+ worktree: worktree?.path ?? null,
224
+ });
130
225
  let sub;
131
226
  try {
132
- sub = await deps.createSubAgentContext({ agent, thoroughness });
227
+ sub = await deps.createSubAgentContext({
228
+ agent,
229
+ thoroughness,
230
+ cwd: effectiveCwd,
231
+ });
133
232
  }
134
233
  catch (err) {
234
+ if (worktree)
235
+ await cleanupKrakenWorktree(worktree);
236
+ appendKrakenRadio(parentCwd, sessionId, {
237
+ kind: 'error',
238
+ agent,
239
+ description: args.description,
240
+ detail: err instanceof Error ? err.message : String(err),
241
+ ok: false,
242
+ durationMs: Date.now() - started,
243
+ });
244
+ krakenTentacleEnd(liveId, { ok: false, durationMs: Date.now() - started });
135
245
  return typedErr(`task: could not initialize sub-agent — ${err instanceof Error ? err.message : String(err)}`);
136
246
  }
137
247
  if (!sub) {
248
+ if (worktree)
249
+ await cleanupKrakenWorktree(worktree);
250
+ appendKrakenRadio(parentCwd, sessionId, {
251
+ kind: 'error',
252
+ agent,
253
+ description: args.description,
254
+ detail: 'no provider',
255
+ ok: false,
256
+ durationMs: Date.now() - started,
257
+ });
258
+ krakenTentacleEnd(liveId, { ok: false, durationMs: Date.now() - started });
138
259
  return typedErr('task: no provider configured for the sub-agent (set an API key / run /login).');
139
260
  }
261
+ const userContent = buildTaskUserPrompt({
262
+ prompt: args.prompt,
263
+ scope: args.scope,
264
+ acceptance: args.acceptance,
265
+ });
140
266
  const maxToolCalls = maxToolCallsForThoroughness(thoroughness, agent);
267
+ const runCwd = sub.cwd || effectiveCwd;
141
268
  const config = {
142
269
  model: sub.model,
143
270
  provider: sub.provider,
144
271
  messages: [
145
272
  { role: 'system', content: systemPromptForAgent(agent) },
146
- { role: 'user', content: args.prompt },
273
+ { role: 'user', content: userContent },
147
274
  ],
148
275
  tools: sub.tools,
149
276
  toolRegistry: sub.registry,
150
277
  providerStream: sub.providerStream,
151
- cwd: ctx.cwd,
278
+ cwd: runCwd,
152
279
  maxToolCallsPerTurn: maxToolCalls,
153
280
  maxToolLoopIterations: Math.max(12, maxToolCalls + 4),
154
281
  };
@@ -163,14 +290,79 @@ export function createTaskTool(deps) {
163
290
  }
164
291
  }
165
292
  catch (err) {
293
+ if (worktree)
294
+ await cleanupKrakenWorktree(worktree);
295
+ krakenTentacleEnd(liveId, { ok: false, durationMs: Date.now() - started });
166
296
  return typedErr(`task: failed to start sub-agent — ${err instanceof Error ? err.message : String(err)}`);
167
297
  }
168
298
  const { result, error } = await runSubAgent(harness);
299
+ const durationMs = Date.now() - started;
169
300
  if (!result) {
301
+ if (worktree)
302
+ await cleanupKrakenWorktree(worktree);
303
+ appendKrakenRadio(parentCwd, sessionId, {
304
+ kind: 'error',
305
+ agent,
306
+ thoroughness,
307
+ description: args.description,
308
+ detail: error ?? 'no output',
309
+ model: sub.model,
310
+ worktree: worktree?.path ?? null,
311
+ durationMs,
312
+ ok: false,
313
+ });
314
+ krakenTentacleEnd(liveId, { ok: false, model: sub.model, detail: error, durationMs });
170
315
  return typedErr(`task: sub-agent (${agent}) produced no output${error ? ` (${error})` : ''}.`);
171
316
  }
317
+ const kept = worktree ? shouldKeepWorktree() : false;
318
+ let footer = '';
319
+ if (worktree) {
320
+ // G2: before cleanup, squash-merge the tentacle branch into the parent
321
+ // HEAD so the sub-agent's edits survive. Without this the worktree is
322
+ // removed and all edits are lost (the original gap).
323
+ let merge = null;
324
+ if (!kept && isKrakenWorktreeAutoMergeEnabled()) {
325
+ try {
326
+ merge = await mergeKrakenWorktree(worktree, { message: `kraken: merge ${args.description.slice(0, 80)}` });
327
+ }
328
+ catch (err) {
329
+ merge = {
330
+ ok: false,
331
+ merged: false,
332
+ committed: false,
333
+ message: `merge threw: ${err instanceof Error ? err.message : String(err)}`,
334
+ };
335
+ }
336
+ }
337
+ else if (!kept) {
338
+ // auto-merge disabled — fall back to bare cleanup (old behavior)
339
+ await cleanupKrakenWorktree(worktree);
340
+ }
341
+ footer += `\n${formatWorktreeFooter(worktree, { kept, merge })}`;
342
+ }
343
+ if (agent === 'general') {
344
+ footer += `\n${verifyHintForGeneral(args.acceptance)}`;
345
+ g.__zelariLastGeneralAt = Date.now();
346
+ }
347
+ krakenTentacleEnd(liveId, {
348
+ ok: true,
349
+ model: sub.model,
350
+ detail: result.slice(0, 160),
351
+ durationMs,
352
+ });
353
+ appendKrakenRadio(parentCwd, sessionId, {
354
+ kind: agent === 'general' ? 'verify_hint' : 'done',
355
+ agent,
356
+ thoroughness,
357
+ description: args.description,
358
+ detail: result.slice(0, 240),
359
+ model: sub.model,
360
+ worktree: worktree?.path ?? null,
361
+ durationMs,
362
+ ok: true,
363
+ });
172
364
  return typedOk({
173
- result: `[sub-agent:${agent}/${thoroughness}]\n${result}`,
365
+ result: `[sub-agent:${agent}/${thoroughness} model=${sub.model}]\n${result}${footer}`,
174
366
  agent,
175
367
  });
176
368
  },
@@ -1 +1 @@
1
- {"version":3,"file":"taskTool.js","sourceRoot":"","sources":["../../../src/cli/tools/taskTool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"taskTool.js","sourceRoot":"","sources":["../../../src/cli/tools/taskTool.ts"],"names":[],"mappings":"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"}
@@ -101,7 +101,7 @@ export function composeProjectContext(input) {
101
101
  maxChars: planMax,
102
102
  });
103
103
  const hint = buildZelariReadHint(cwd);
104
- const designIndex = input.mode === "agent"
104
+ const designIndex = input.mode === "kraken" || input.mode === "agent"
105
105
  ? buildDesignIndex(cwd, designIndexMax)
106
106
  : // Council already writes design; still give a short index, not full docs.
107
107
  buildDesignIndex(cwd, designIndexMax);
@@ -146,7 +146,7 @@ export function composeProjectContext(input) {
146
146
  (process.env.ZELARI_STATE !== "0" &&
147
147
  (input.mode === "council" ||
148
148
  input.mode === "zelari" ||
149
- input.mode === "agent"));
149
+ input.mode === "kraken" || input.mode === "agent"));
150
150
  let durableRaw = input.durableState?.trim() ?? "";
151
151
  // Sync fallback only when async loadDurableContext was not used upstream.
152
152
  if (!durableRaw && wantDurable) {