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.
- package/README.md +3 -3
- package/dist/cli/app.js +4 -3
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/buildPolicy.js +1 -1
- package/dist/cli/buildPolicy.js.map +1 -1
- package/dist/cli/companion/runManager.js +2 -2
- package/dist/cli/companion/runManager.js.map +1 -1
- package/dist/cli/companion/serve.js +1 -1
- package/dist/cli/companion/serve.js.map +1 -1
- package/dist/cli/components/StatusBar.js +7 -2
- package/dist/cli/components/StatusBar.js.map +1 -1
- package/dist/cli/headless.js +3 -3
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/hooks/useChatTurn.js +16 -12
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/hooks/useSlashDispatch.js +8 -1
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
- package/dist/cli/main.bundled.js +1228 -581
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +1 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/missionSlice.js +7 -6
- package/dist/cli/missionSlice.js.map +1 -1
- package/dist/cli/mode.js +21 -7
- package/dist/cli/mode.js.map +1 -1
- package/dist/cli/phase.js +1 -1
- package/dist/cli/runHeadless.js +9 -6
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/slashCommands.js +17 -6
- package/dist/cli/slashCommands.js.map +1 -1
- package/dist/cli/toolRegistry.js +9 -4
- package/dist/cli/toolRegistry.js.map +1 -1
- package/dist/cli/tools/krakenLive.js +107 -0
- package/dist/cli/tools/krakenLive.js.map +1 -0
- package/dist/cli/tools/krakenModel.js +115 -0
- package/dist/cli/tools/krakenModel.js.map +1 -0
- package/dist/cli/tools/krakenRadio.js +95 -0
- package/dist/cli/tools/krakenRadio.js.map +1 -0
- package/dist/cli/tools/krakenWorktree.js +245 -0
- package/dist/cli/tools/krakenWorktree.js.map +1 -0
- package/dist/cli/tools/taskTool.js +206 -14
- package/dist/cli/tools/taskTool.js.map +1 -1
- package/dist/cli/workspace/composeContext.js +2 -2
- package/dist/cli/workspace/composeContext.js.map +1 -1
- 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
|
|
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
|
|
22
|
-
'bounded unit of work. Prefer small, correct edits.
|
|
23
|
-
'
|
|
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
|
|
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({
|
|
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:
|
|
273
|
+
{ role: 'user', content: userContent },
|
|
147
274
|
],
|
|
148
275
|
tools: sub.tools,
|
|
149
276
|
toolRegistry: sub.registry,
|
|
150
277
|
providerStream: sub.providerStream,
|
|
151
|
-
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) {
|