@akon-labs/nexus-cli 0.1.7 → 0.1.9

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.
@@ -0,0 +1,530 @@
1
+ /**
2
+ * Internal delegated-worker runtime.
3
+ *
4
+ * This file deliberately does not register a user-facing tool by default. The
5
+ * authenticated Hub policy must advertise delegation before the GitNexus
6
+ * extension calls registerDelegateTaskTool(). The CLI owns process isolation
7
+ * and streaming UX; the Hub owns one-time worker authorization and routing.
8
+ */
9
+ import { execFile, spawn } from "node:child_process";
10
+ import { randomUUID } from "node:crypto";
11
+ import * as fs from "node:fs";
12
+ import * as os from "node:os";
13
+ import * as path from "node:path";
14
+ import { Text } from "@earendil-works/pi-tui";
15
+ import { Type } from "typebox";
16
+ import { AUTO_MODEL_ID, AUTO_PROVIDER_ID, isAutoModel } from "../../core/auto-model.js";
17
+ import { withFileMutationQueue } from "../../core/tools/index.js";
18
+ import { resolveGitNexusConfig } from "../gitnexus/config.js";
19
+ import { hubApiBase } from "../gitnexus/device-auth.js";
20
+ export const DELEGATE_TASK_TOOL_NAME = "delegate_task";
21
+ export const INTERNAL_WORKER_MARKER_ENV = "NEXUS_INTERNAL_DELEGATED_WORKER";
22
+ export const INTERNAL_WORKER_SESSION_ENV = "NEXUS_INTERNAL_WORKER_SESSION_ID";
23
+ export const INTERNAL_WORKER_TASK_ENV = "NEXUS_INTERNAL_WORKER_TASK_ID";
24
+ export const INTERNAL_WORKER_RUN_ENV = "NEXUS_INTERNAL_WORKER_RUN_ID";
25
+ export const INTERNAL_WORKER_ROOT_REQUEST_ENV = "NEXUS_INTERNAL_WORKER_ROOT_REQUEST_ID";
26
+ export const INTERNAL_WORKER_PARENT_REQUEST_ENV = "NEXUS_INTERNAL_WORKER_PARENT_REQUEST_ID";
27
+ export const INTERNAL_WORKER_GRANT_HEADER = "x-nexus-worker-grant";
28
+ export const INTERNAL_WORKER_TASK_HEADER = "x-nexus-worker-task-id";
29
+ export const SESSION_AFFINITY_HEADER = "x-session-affinity";
30
+ export const RUN_ID_HEADER = "x-nexus-run-id";
31
+ export const REQUEST_ID_HEADER = "x-nexus-request-id";
32
+ export const ROOT_REQUEST_ID_HEADER = "x-nexus-root-request-id";
33
+ export const PARENT_REQUEST_ID_HEADER = "x-nexus-parent-request-id";
34
+ export const DELEGATION_ID_HEADER = "x-nexus-delegation-id";
35
+ export const REQUEST_SCOPE_HEADER = "x-nexus-request-scope";
36
+ export const MAX_DELEGATED_TURNS = 50;
37
+ export const DELEGATED_WORKER_TIMEOUT_MS = 5 * 60 * 1000;
38
+ export const DELEGATED_OUTPUT_CAP_BYTES = 32 * 1024;
39
+ export const DELEGATED_EVENT_CAP_BYTES = 1024 * 1024;
40
+ export const MAX_DELEGATED_TASK_BYTES = 32 * 1024;
41
+ const WORKER_GRANT_TIMEOUT_MS = 10_000;
42
+ const INVALID_WORKER_GRANT = "unavailable";
43
+ const MAX_PARALLEL_MUTATING_WORKERS = 1;
44
+ export const DELEGATED_WORKER_TOOLS = [
45
+ "read",
46
+ "grep",
47
+ "find",
48
+ "ls",
49
+ "bash",
50
+ "write",
51
+ "edit",
52
+ "websearch",
53
+ "gitnexus_query",
54
+ "gitnexus_context",
55
+ "gitnexus_impact",
56
+ "gitnexus_detect_changes",
57
+ "gitnexus_cypher",
58
+ "gitnexus_list_repos",
59
+ ];
60
+ const WORKER_SYSTEM_PROMPT = `You are an internal delegated worker for Nexus Agent.
61
+
62
+ Complete only the self-contained task you were delegated. Investigate before editing, follow local instructions, and verify any changed behavior. Do not delegate work or broaden scope. Do not discuss model names, providers, routing, credits, or internal architecture.
63
+
64
+ Finish with a concise report containing:
65
+ - work completed or findings
66
+ - verification performed and results
67
+ - blockers or remaining risks`;
68
+ function isRecord(value) {
69
+ return typeof value === "object" && value !== null;
70
+ }
71
+ function parseAssistantSnapshot(value) {
72
+ if (!isRecord(value) || value.role !== "assistant" || !Array.isArray(value.content))
73
+ return undefined;
74
+ const text = value.content
75
+ .filter(isRecord)
76
+ .filter((part) => part.type === "text" && typeof part.text === "string")
77
+ .map((part) => part.text)
78
+ .join("\n");
79
+ return {
80
+ text,
81
+ ...(typeof value.stopReason === "string" ? { stopReason: value.stopReason } : {}),
82
+ };
83
+ }
84
+ export function composeDelegatedTask(task, acceptanceCriteria, relevantPaths) {
85
+ const sections = [`Task:\n${task.trim()}`];
86
+ if (acceptanceCriteria.length > 0) {
87
+ sections.push(`Acceptance criteria:\n${acceptanceCriteria.map((criterion) => `- ${criterion}`).join("\n")}`);
88
+ }
89
+ if (relevantPaths.length > 0) {
90
+ sections.push(`Relevant paths:\n${relevantPaths.map((filePath) => `- ${filePath}`).join("\n")}`);
91
+ }
92
+ return sections.join("\n\n");
93
+ }
94
+ export function buildDelegatedWorkerArgs(task, promptPath) {
95
+ return [
96
+ "--mode",
97
+ "json",
98
+ "-p",
99
+ "--no-session",
100
+ "--model",
101
+ `${AUTO_PROVIDER_ID}/${AUTO_MODEL_ID}`,
102
+ "--tools",
103
+ DELEGATED_WORKER_TOOLS.join(","),
104
+ "--exclude-tools",
105
+ `${DELEGATE_TASK_TOOL_NAME},subagent`,
106
+ "--append-system-prompt",
107
+ promptPath,
108
+ task,
109
+ ];
110
+ }
111
+ function getNexusInvocation(args) {
112
+ const currentScript = process.argv[1];
113
+ const isBunVirtualScript = currentScript?.startsWith("/$bunfs/root/");
114
+ if (currentScript && !isBunVirtualScript && fs.existsSync(currentScript)) {
115
+ return { command: process.execPath, args: [currentScript, ...args] };
116
+ }
117
+ const execName = path.basename(process.execPath).toLowerCase();
118
+ const isGenericRuntime = /^(node|bun)(\.exe)?$/.test(execName);
119
+ return isGenericRuntime ? { command: "nexus", args } : { command: process.execPath, args };
120
+ }
121
+ async function writeWorkerPrompt() {
122
+ const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "nexus-worker-"));
123
+ const filePath = path.join(dir, "system.md");
124
+ await withFileMutationQueue(filePath, async () => {
125
+ await fs.promises.writeFile(filePath, WORKER_SYSTEM_PROMPT, { encoding: "utf8", mode: 0o600 });
126
+ });
127
+ return { dir, filePath };
128
+ }
129
+ function truncateUtf8(value, cap) {
130
+ if (Buffer.byteLength(value, "utf8") <= cap)
131
+ return { value, truncated: false };
132
+ const suffix = "\n\n[Report truncated]";
133
+ let truncated = value.slice(0, Math.max(0, cap - Buffer.byteLength(suffix, "utf8")));
134
+ while (Buffer.byteLength(`${truncated}${suffix}`, "utf8") > cap)
135
+ truncated = truncated.slice(0, -1);
136
+ return { value: `${truncated}${suffix}`, truncated: true };
137
+ }
138
+ export function createHubDelegationController(config, options = {}) {
139
+ const fetchImpl = options.fetchImpl ?? fetch;
140
+ return {
141
+ async createWorkerGrant(request) {
142
+ const controller = new AbortController();
143
+ const onAbort = () => controller.abort();
144
+ if (request.signal?.aborted)
145
+ controller.abort();
146
+ else
147
+ request.signal?.addEventListener("abort", onAbort, { once: true });
148
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? WORKER_GRANT_TIMEOUT_MS);
149
+ try {
150
+ const response = await fetchImpl(`${hubApiBase(config.hubUrl)}/llm/worker-grants`, {
151
+ method: "POST",
152
+ headers: {
153
+ "content-type": "application/json",
154
+ accept: "application/json",
155
+ authorization: `Bearer ${config.token}`,
156
+ [RUN_ID_HEADER]: request.runId,
157
+ [REQUEST_ID_HEADER]: request.requestId,
158
+ [ROOT_REQUEST_ID_HEADER]: request.rootRequestId,
159
+ [PARENT_REQUEST_ID_HEADER]: request.parentRequestId,
160
+ [DELEGATION_ID_HEADER]: request.taskId,
161
+ [REQUEST_SCOPE_HEADER]: "worker",
162
+ ...(config.deviceFingerprint ? { "x-device-fingerprint": config.deviceFingerprint } : {}),
163
+ ...(config.deviceName ? { "x-device-name": config.deviceName } : {}),
164
+ },
165
+ body: JSON.stringify({ sessionId: request.sessionId, taskId: request.taskId }),
166
+ signal: controller.signal,
167
+ });
168
+ if (!response.ok) {
169
+ await response.body?.cancel().catch(() => { });
170
+ throw new Error("Worker authorization unavailable");
171
+ }
172
+ const body = await response.json();
173
+ if (!isRecord(body) ||
174
+ typeof body.grant !== "string" ||
175
+ !body.grant.trim() ||
176
+ typeof body.expiresAt !== "string" ||
177
+ !body.expiresAt.trim() ||
178
+ !Number.isFinite(Date.parse(body.expiresAt))) {
179
+ throw new Error("Invalid worker authorization response");
180
+ }
181
+ return { token: body.grant, expiresAt: body.expiresAt };
182
+ }
183
+ finally {
184
+ clearTimeout(timeout);
185
+ request.signal?.removeEventListener("abort", onAbort);
186
+ }
187
+ },
188
+ };
189
+ }
190
+ export function isDelegatedWorkerProcess(env = process.env) {
191
+ return env[INTERNAL_WORKER_MARKER_ENV] === "1";
192
+ }
193
+ /** Capture task routing once, then remove it before worker tools can inherit it. */
194
+ export function consumeWorkerContext(env = process.env) {
195
+ if (!isDelegatedWorkerProcess(env))
196
+ return undefined;
197
+ const sessionId = env[INTERNAL_WORKER_SESSION_ENV]?.trim();
198
+ const taskId = env[INTERNAL_WORKER_TASK_ENV]?.trim();
199
+ const runId = env[INTERNAL_WORKER_RUN_ENV]?.trim();
200
+ const rootRequestId = env[INTERNAL_WORKER_ROOT_REQUEST_ENV]?.trim();
201
+ const parentRequestId = env[INTERNAL_WORKER_PARENT_REQUEST_ENV]?.trim();
202
+ delete env[INTERNAL_WORKER_SESSION_ENV];
203
+ delete env[INTERNAL_WORKER_TASK_ENV];
204
+ delete env[INTERNAL_WORKER_RUN_ENV];
205
+ delete env[INTERNAL_WORKER_ROOT_REQUEST_ENV];
206
+ delete env[INTERNAL_WORKER_PARENT_REQUEST_ENV];
207
+ if (!sessionId || !taskId || !runId || !rootRequestId || !parentRequestId)
208
+ return undefined;
209
+ return { sessionId, taskId, runId, rootRequestId, parentRequestId };
210
+ }
211
+ function killProcessTree(pid, signal) {
212
+ if (pid === undefined)
213
+ return;
214
+ if (process.platform === "win32") {
215
+ execFile("taskkill", ["/T", "/F", "/PID", String(pid)], () => undefined);
216
+ return;
217
+ }
218
+ try {
219
+ process.kill(-pid, signal);
220
+ }
221
+ catch {
222
+ // The detached process group may already have exited.
223
+ }
224
+ }
225
+ export async function runDelegatedWorker(options) {
226
+ const prompt = await writeWorkerPrompt();
227
+ const task = composeDelegatedTask(options.task, options.acceptanceCriteria, options.relevantPaths);
228
+ const args = buildDelegatedWorkerArgs(task, prompt.filePath);
229
+ let output = "";
230
+ let turns = 0;
231
+ let terminalStatus;
232
+ let assistantFailed = false;
233
+ let eventBytes = 0;
234
+ try {
235
+ const exitCode = await new Promise((resolve) => {
236
+ const invocation = getNexusInvocation(args);
237
+ const child = spawn(invocation.command, invocation.args, {
238
+ cwd: options.cwd,
239
+ detached: true,
240
+ env: {
241
+ ...process.env,
242
+ [INTERNAL_WORKER_MARKER_ENV]: "1",
243
+ [INTERNAL_WORKER_SESSION_ENV]: options.workerContext.sessionId,
244
+ [INTERNAL_WORKER_TASK_ENV]: options.workerContext.taskId,
245
+ [INTERNAL_WORKER_RUN_ENV]: options.workerContext.runId,
246
+ [INTERNAL_WORKER_ROOT_REQUEST_ENV]: options.workerContext.rootRequestId,
247
+ [INTERNAL_WORKER_PARENT_REQUEST_ENV]: options.workerContext.parentRequestId,
248
+ },
249
+ shell: false,
250
+ stdio: ["ignore", "pipe", "pipe"],
251
+ windowsHide: true,
252
+ });
253
+ let buffer = "";
254
+ let settled = false;
255
+ let stopped = false;
256
+ let forceKillTimer;
257
+ const finish = (code) => {
258
+ if (settled)
259
+ return;
260
+ settled = true;
261
+ clearTimeout(timeoutTimer);
262
+ clearTimeout(forceKillTimer);
263
+ options.signal?.removeEventListener("abort", abortHandler);
264
+ resolve(code);
265
+ };
266
+ const stop = (status) => {
267
+ if (stopped)
268
+ return;
269
+ stopped = true;
270
+ terminalStatus = status;
271
+ killProcessTree(child.pid, "SIGTERM");
272
+ forceKillTimer = setTimeout(() => {
273
+ if (process.platform !== "win32")
274
+ killProcessTree(child.pid, "SIGKILL");
275
+ finish(1);
276
+ }, 5000);
277
+ };
278
+ const emitProgress = () => {
279
+ options.onUpdate?.({
280
+ content: [{ type: "text", text: "Delegated work is in progress." }],
281
+ details: { status: "running", turns },
282
+ });
283
+ };
284
+ const processLine = (line) => {
285
+ if (!line.trim())
286
+ return;
287
+ let parsed;
288
+ try {
289
+ parsed = JSON.parse(line);
290
+ }
291
+ catch {
292
+ return;
293
+ }
294
+ if (!isRecord(parsed) || parsed.type !== "message_end")
295
+ return;
296
+ const snapshot = parseAssistantSnapshot(parsed.message);
297
+ if (!snapshot)
298
+ return;
299
+ turns += 1;
300
+ if (snapshot.text)
301
+ output = snapshot.text;
302
+ if (snapshot.stopReason === "error" || snapshot.stopReason === "aborted")
303
+ assistantFailed = true;
304
+ emitProgress();
305
+ // A final assistant response can legitimately be the last allowed turn.
306
+ // Stop only when the worker is asking the harness for another tool loop.
307
+ if (turns >= MAX_DELEGATED_TURNS && snapshot.stopReason === "toolUse")
308
+ stop("turn_limit");
309
+ };
310
+ const abortHandler = () => stop("aborted");
311
+ const timeoutTimer = setTimeout(() => stop("timeout"), Math.min(Math.max(1_000, options.timeoutMs ?? DELEGATED_WORKER_TIMEOUT_MS), DELEGATED_WORKER_TIMEOUT_MS));
312
+ child.stdout.on("data", (chunk) => {
313
+ eventBytes += Buffer.byteLength(chunk);
314
+ if (eventBytes > DELEGATED_EVENT_CAP_BYTES) {
315
+ assistantFailed = true;
316
+ stop("event_limit");
317
+ return;
318
+ }
319
+ buffer += chunk.toString();
320
+ if (Buffer.byteLength(buffer, "utf8") > DELEGATED_EVENT_CAP_BYTES) {
321
+ buffer = "";
322
+ assistantFailed = true;
323
+ return;
324
+ }
325
+ const lines = buffer.split("\n");
326
+ buffer = lines.pop() ?? "";
327
+ for (const line of lines)
328
+ processLine(line);
329
+ });
330
+ // Consume stderr so a noisy child cannot block. Raw provider/process output
331
+ // is intentionally not retained or exposed to the orchestrator or user.
332
+ child.stderr.on("data", () => undefined);
333
+ child.on("close", (code) => {
334
+ if (buffer.trim())
335
+ processLine(buffer);
336
+ finish(code ?? (terminalStatus ? 1 : 0));
337
+ });
338
+ child.on("error", () => finish(1));
339
+ if (options.signal?.aborted)
340
+ abortHandler();
341
+ else
342
+ options.signal?.addEventListener("abort", abortHandler, { once: true });
343
+ });
344
+ const limitedOutput = truncateUtf8(output, DELEGATED_OUTPUT_CAP_BYTES);
345
+ const status = terminalStatus ?? (exitCode === 0 && !assistantFailed ? "completed" : "failed");
346
+ return {
347
+ status,
348
+ turns,
349
+ exitCode,
350
+ output: limitedOutput.value,
351
+ outputTruncated: limitedOutput.truncated,
352
+ };
353
+ }
354
+ finally {
355
+ await fs.promises.rm(prompt.dir, { recursive: true, force: true });
356
+ }
357
+ }
358
+ const DelegateTaskParameters = Type.Object({
359
+ task: Type.String({ description: "A self-contained task with explicit boundaries", maxLength: 32_768 }),
360
+ acceptanceCriteria: Type.Optional(Type.Array(Type.String({ maxLength: 2000 }), { maxItems: 10 })),
361
+ relevantPaths: Type.Optional(Type.Array(Type.String({ maxLength: 1000 }), { maxItems: 20 })),
362
+ });
363
+ function resultContent(result) {
364
+ const report = result.output.trim() || "No worker report was returned.";
365
+ if (result.status === "completed")
366
+ return `Delegated work completed.\n\n${report}`;
367
+ return `Delegated work did not complete (${result.status}).\n\nPartial report:\n${report}`;
368
+ }
369
+ /** Register the tool only after the Hub explicitly advertises delegation. */
370
+ export function registerDelegateTaskTool(pi, capability) {
371
+ const maxTaskBytes = Math.min(Math.max(1, Math.floor(capability.maxTaskBytes)), MAX_DELEGATED_TASK_BYTES);
372
+ const workerTimeoutMs = Math.min(Math.max(1_000, Math.floor(capability.workerTimeoutMs)), DELEGATED_WORKER_TIMEOUT_MS);
373
+ const runId = randomUUID();
374
+ let rootRequestId;
375
+ let latestRootRequestId;
376
+ let activeWorkers = 0;
377
+ pi.on("before_agent_start", (event, ctx) => {
378
+ if (!isAutoModel(ctx.model))
379
+ return;
380
+ return {
381
+ systemPrompt: `${event.systemPrompt}\n\nDelegation guidance: prioritize delegate_task for self-contained, context-heavy investigation, broad searches, audits, repeated tool loops, or substantial implementation so the main conversation stays focused and efficient. Use your own tools directly when the work is small, depends on context already established in this conversation, requires direct verification, or delegation fails or reaches a limit. You remain responsible for the final result.`,
382
+ };
383
+ });
384
+ pi.on("before_provider_headers", (event, ctx) => {
385
+ if (!isAutoModel(ctx.model) || isDelegatedWorkerProcess())
386
+ return;
387
+ const requestId = randomUUID();
388
+ rootRequestId ??= requestId;
389
+ latestRootRequestId = requestId;
390
+ event.headers[RUN_ID_HEADER] = runId;
391
+ event.headers[REQUEST_ID_HEADER] = requestId;
392
+ event.headers[ROOT_REQUEST_ID_HEADER] = rootRequestId;
393
+ event.headers[REQUEST_SCOPE_HEADER] = "root";
394
+ });
395
+ pi.registerTool({
396
+ name: DELEGATE_TASK_TOOL_NAME,
397
+ label: "Work",
398
+ description: "Delegate one self-contained task to an isolated internal worker. Keep user communication and final responsibility in this conversation.",
399
+ parameters: DelegateTaskParameters,
400
+ executionMode: "sequential",
401
+ async execute(_toolCallId, params, signal, onUpdate, ctx) {
402
+ if (!isAutoModel(ctx.model)) {
403
+ return {
404
+ content: [{ type: "text", text: "Delegated work is unavailable for the active mode." }],
405
+ details: { status: "failed", turns: 0 },
406
+ };
407
+ }
408
+ if (!ctx.isProjectTrusted()) {
409
+ return {
410
+ content: [{ type: "text", text: "Delegated work requires a trusted project." }],
411
+ details: { status: "failed", turns: 0 },
412
+ };
413
+ }
414
+ if (activeWorkers >= MAX_PARALLEL_MUTATING_WORKERS) {
415
+ return {
416
+ content: [{ type: "text", text: "Delegated work is temporarily unavailable for this run." }],
417
+ details: { status: "failed", turns: 0 },
418
+ };
419
+ }
420
+ const request = {
421
+ task: params.task,
422
+ acceptanceCriteria: params.acceptanceCriteria ?? [],
423
+ relevantPaths: params.relevantPaths ?? [],
424
+ cwd: ctx.cwd,
425
+ signal,
426
+ };
427
+ if (Buffer.byteLength(composeDelegatedTask(request.task, request.acceptanceCriteria, request.relevantPaths), "utf8") > maxTaskBytes) {
428
+ return {
429
+ content: [{ type: "text", text: "Delegated work is too large for one bounded task." }],
430
+ details: { status: "failed", turns: 0 },
431
+ };
432
+ }
433
+ activeWorkers += 1;
434
+ try {
435
+ const delegationId = randomUUID();
436
+ rootRequestId ??= randomUUID();
437
+ const result = await runDelegatedWorker({
438
+ ...request,
439
+ workerContext: {
440
+ sessionId: ctx.sessionManager.getSessionId(),
441
+ taskId: delegationId,
442
+ runId,
443
+ rootRequestId,
444
+ parentRequestId: latestRootRequestId ?? rootRequestId,
445
+ },
446
+ timeoutMs: workerTimeoutMs,
447
+ onUpdate,
448
+ });
449
+ return {
450
+ content: [{ type: "text", text: resultContent(result) }],
451
+ details: {
452
+ status: result.status,
453
+ turns: result.turns,
454
+ exitCode: result.exitCode,
455
+ outputTruncated: result.outputTruncated,
456
+ },
457
+ };
458
+ }
459
+ catch {
460
+ return {
461
+ content: [{ type: "text", text: "Delegated work could not be started." }],
462
+ details: { status: "failed", turns: 0 },
463
+ };
464
+ }
465
+ finally {
466
+ activeWorkers -= 1;
467
+ }
468
+ },
469
+ renderCall(_args, theme) {
470
+ return new Text(theme.fg("toolTitle", theme.bold("Working…")), 0, 0);
471
+ },
472
+ renderResult(result, _options, theme) {
473
+ const details = result.details;
474
+ if (details?.status === "running")
475
+ return new Text(theme.fg("muted", "Working…"), 0, 0);
476
+ if (details?.status === "completed")
477
+ return new Text(theme.fg("success", "Work completed"), 0, 0);
478
+ return new Text(theme.fg("error", "Work needs attention"), 0, 0);
479
+ },
480
+ });
481
+ }
482
+ /**
483
+ * Install a fail-closed header hook for one worker task. A fresh one-time grant
484
+ * is minted for each model turn; no grant is inherited by worker tools.
485
+ */
486
+ export function registerWorkerGrantHeaders(pi, workerContext, controller) {
487
+ pi.on("before_provider_headers", async (event, ctx) => {
488
+ if (!isAutoModel(ctx.model)) {
489
+ ctx.abort();
490
+ return;
491
+ }
492
+ // Set an invalid sentinel first. Extension handler errors are reported and
493
+ // swallowed by the runner, so this prevents a mint failure from silently
494
+ // falling back to an ungranted root request.
495
+ const requestId = randomUUID();
496
+ event.headers[INTERNAL_WORKER_GRANT_HEADER] = INVALID_WORKER_GRANT;
497
+ event.headers[INTERNAL_WORKER_TASK_HEADER] = workerContext.taskId;
498
+ event.headers[SESSION_AFFINITY_HEADER] = workerContext.sessionId;
499
+ event.headers[RUN_ID_HEADER] = workerContext.runId;
500
+ event.headers[REQUEST_ID_HEADER] = requestId;
501
+ event.headers[ROOT_REQUEST_ID_HEADER] = workerContext.rootRequestId;
502
+ event.headers[PARENT_REQUEST_ID_HEADER] = workerContext.parentRequestId;
503
+ event.headers[DELEGATION_ID_HEADER] = workerContext.taskId;
504
+ event.headers[REQUEST_SCOPE_HEADER] = "worker";
505
+ if (!controller)
506
+ return;
507
+ const grant = await controller.createWorkerGrant({
508
+ ...workerContext,
509
+ requestId,
510
+ signal: ctx.signal,
511
+ });
512
+ event.headers[INTERNAL_WORKER_GRANT_HEADER] = grant.token;
513
+ });
514
+ }
515
+ export default function delegatedWorkerRuntime(pi) {
516
+ const isWorker = isDelegatedWorkerProcess();
517
+ const workerContext = consumeWorkerContext();
518
+ if (!isWorker)
519
+ return;
520
+ const config = resolveGitNexusConfig();
521
+ const failClosedContext = {
522
+ sessionId: "unavailable",
523
+ taskId: "unavailable",
524
+ runId: "unavailable",
525
+ rootRequestId: "unavailable",
526
+ parentRequestId: "unavailable",
527
+ };
528
+ registerWorkerGrantHeaders(pi, workerContext ?? failClosedContext, workerContext && config ? createHubDelegationController(config) : undefined);
529
+ }
530
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Internal delegated-worker runtime.\n *\n * This file deliberately does not register a user-facing tool by default. The\n * authenticated Hub policy must advertise delegation before the GitNexus\n * extension calls registerDelegateTaskTool(). The CLI owns process isolation\n * and streaming UX; the Hub owns one-time worker authorization and routing.\n */\n\nimport { execFile, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport { AUTO_MODEL_ID, AUTO_PROVIDER_ID, isAutoModel } from \"../../core/auto-model.ts\";\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/index.ts\";\nimport type { GitNexusConfig } from \"../gitnexus/config.ts\";\nimport { resolveGitNexusConfig } from \"../gitnexus/config.ts\";\nimport { hubApiBase } from \"../gitnexus/device-auth.ts\";\n\nexport const DELEGATE_TASK_TOOL_NAME = \"delegate_task\";\nexport const INTERNAL_WORKER_MARKER_ENV = \"NEXUS_INTERNAL_DELEGATED_WORKER\";\nexport const INTERNAL_WORKER_SESSION_ENV = \"NEXUS_INTERNAL_WORKER_SESSION_ID\";\nexport const INTERNAL_WORKER_TASK_ENV = \"NEXUS_INTERNAL_WORKER_TASK_ID\";\nexport const INTERNAL_WORKER_RUN_ENV = \"NEXUS_INTERNAL_WORKER_RUN_ID\";\nexport const INTERNAL_WORKER_ROOT_REQUEST_ENV = \"NEXUS_INTERNAL_WORKER_ROOT_REQUEST_ID\";\nexport const INTERNAL_WORKER_PARENT_REQUEST_ENV = \"NEXUS_INTERNAL_WORKER_PARENT_REQUEST_ID\";\nexport const INTERNAL_WORKER_GRANT_HEADER = \"x-nexus-worker-grant\";\nexport const INTERNAL_WORKER_TASK_HEADER = \"x-nexus-worker-task-id\";\nexport const SESSION_AFFINITY_HEADER = \"x-session-affinity\";\nexport const RUN_ID_HEADER = \"x-nexus-run-id\";\nexport const REQUEST_ID_HEADER = \"x-nexus-request-id\";\nexport const ROOT_REQUEST_ID_HEADER = \"x-nexus-root-request-id\";\nexport const PARENT_REQUEST_ID_HEADER = \"x-nexus-parent-request-id\";\nexport const DELEGATION_ID_HEADER = \"x-nexus-delegation-id\";\nexport const REQUEST_SCOPE_HEADER = \"x-nexus-request-scope\";\nexport const MAX_DELEGATED_TURNS = 50;\nexport const DELEGATED_WORKER_TIMEOUT_MS = 5 * 60 * 1000;\nexport const DELEGATED_OUTPUT_CAP_BYTES = 32 * 1024;\nexport const DELEGATED_EVENT_CAP_BYTES = 1024 * 1024;\nexport const MAX_DELEGATED_TASK_BYTES = 32 * 1024;\n\nconst WORKER_GRANT_TIMEOUT_MS = 10_000;\nconst INVALID_WORKER_GRANT = \"unavailable\";\nconst MAX_PARALLEL_MUTATING_WORKERS = 1;\n\nexport const DELEGATED_WORKER_TOOLS = [\n\t\"read\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"bash\",\n\t\"write\",\n\t\"edit\",\n\t\"websearch\",\n\t\"gitnexus_query\",\n\t\"gitnexus_context\",\n\t\"gitnexus_impact\",\n\t\"gitnexus_detect_changes\",\n\t\"gitnexus_cypher\",\n\t\"gitnexus_list_repos\",\n] as const;\n\nconst WORKER_SYSTEM_PROMPT = `You are an internal delegated worker for Nexus Agent.\n\nComplete only the self-contained task you were delegated. Investigate before editing, follow local instructions, and verify any changed behavior. Do not delegate work or broaden scope. Do not discuss model names, providers, routing, credits, or internal architecture.\n\nFinish with a concise report containing:\n- work completed or findings\n- verification performed and results\n- blockers or remaining risks`;\n\nexport type DelegationStatus =\n\t| \"running\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"aborted\"\n\t| \"timeout\"\n\t| \"turn_limit\"\n\t| \"event_limit\";\n\nexport interface DelegationDetails {\n\tstatus: DelegationStatus;\n\tturns: number;\n\texitCode?: number;\n\toutputTruncated?: boolean;\n}\n\nexport interface WorkerGrant {\n\t/** Opaque, short-lived grant minted by the Hub for one worker completion. */\n\ttoken: string;\n\texpiresAt: string;\n}\n\nexport interface DelegationCapability {\n\tenabled: true;\n\tversion: 1;\n\tmaxParallel: number;\n\tmaxTaskBytes: number;\n\tworkerTimeoutMs: number;\n}\n\nexport interface WorkerGrantRequest {\n\tsessionId: string;\n\ttaskId: string;\n\trunId: string;\n\trootRequestId: string;\n\tparentRequestId: string;\n\trequestId: string;\n\tsignal: AbortSignal | undefined;\n}\n\nexport interface DelegationController {\n\tcreateWorkerGrant(request: WorkerGrantRequest): Promise<WorkerGrant>;\n}\n\nexport interface DelegationRequest {\n\ttask: string;\n\tacceptanceCriteria: string[];\n\trelevantPaths: string[];\n\tcwd: string;\n\tsignal: AbortSignal | undefined;\n}\n\nexport interface WorkerContext {\n\tsessionId: string;\n\ttaskId: string;\n\trunId: string;\n\trootRequestId: string;\n\tparentRequestId: string;\n}\n\nexport interface DelegatedWorkerOptions extends DelegationRequest {\n\tworkerContext: WorkerContext;\n\ttimeoutMs?: number;\n\tonUpdate?: (result: AgentToolResult<DelegationDetails>) => void;\n}\n\nexport interface DelegatedWorkerResult {\n\tstatus: Exclude<DelegationStatus, \"running\">;\n\tturns: number;\n\texitCode: number;\n\toutput: string;\n\toutputTruncated: boolean;\n}\n\ninterface AssistantSnapshot {\n\ttext: string;\n\tstopReason?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction parseAssistantSnapshot(value: unknown): AssistantSnapshot | undefined {\n\tif (!isRecord(value) || value.role !== \"assistant\" || !Array.isArray(value.content)) return undefined;\n\tconst text = value.content\n\t\t.filter(isRecord)\n\t\t.filter((part) => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text as string)\n\t\t.join(\"\\n\");\n\treturn {\n\t\ttext,\n\t\t...(typeof value.stopReason === \"string\" ? { stopReason: value.stopReason } : {}),\n\t};\n}\n\nexport function composeDelegatedTask(\n\ttask: string,\n\tacceptanceCriteria: readonly string[],\n\trelevantPaths: readonly string[],\n): string {\n\tconst sections = [`Task:\\n${task.trim()}`];\n\tif (acceptanceCriteria.length > 0) {\n\t\tsections.push(`Acceptance criteria:\\n${acceptanceCriteria.map((criterion) => `- ${criterion}`).join(\"\\n\")}`);\n\t}\n\tif (relevantPaths.length > 0) {\n\t\tsections.push(`Relevant paths:\\n${relevantPaths.map((filePath) => `- ${filePath}`).join(\"\\n\")}`);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\n\nexport function buildDelegatedWorkerArgs(task: string, promptPath: string): string[] {\n\treturn [\n\t\t\"--mode\",\n\t\t\"json\",\n\t\t\"-p\",\n\t\t\"--no-session\",\n\t\t\"--model\",\n\t\t`${AUTO_PROVIDER_ID}/${AUTO_MODEL_ID}`,\n\t\t\"--tools\",\n\t\tDELEGATED_WORKER_TOOLS.join(\",\"),\n\t\t\"--exclude-tools\",\n\t\t`${DELEGATE_TASK_TOOL_NAME},subagent`,\n\t\t\"--append-system-prompt\",\n\t\tpromptPath,\n\t\ttask,\n\t];\n}\n\nfunction getNexusInvocation(args: string[]): { command: string; args: string[] } {\n\tconst currentScript = process.argv[1];\n\tconst isBunVirtualScript = currentScript?.startsWith(\"/$bunfs/root/\");\n\tif (currentScript && !isBunVirtualScript && fs.existsSync(currentScript)) {\n\t\treturn { command: process.execPath, args: [currentScript, ...args] };\n\t}\n\n\tconst execName = path.basename(process.execPath).toLowerCase();\n\tconst isGenericRuntime = /^(node|bun)(\\.exe)?$/.test(execName);\n\treturn isGenericRuntime ? { command: \"nexus\", args } : { command: process.execPath, args };\n}\n\nasync function writeWorkerPrompt(): Promise<{ dir: string; filePath: string }> {\n\tconst dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), \"nexus-worker-\"));\n\tconst filePath = path.join(dir, \"system.md\");\n\tawait withFileMutationQueue(filePath, async () => {\n\t\tawait fs.promises.writeFile(filePath, WORKER_SYSTEM_PROMPT, { encoding: \"utf8\", mode: 0o600 });\n\t});\n\treturn { dir, filePath };\n}\n\nfunction truncateUtf8(value: string, cap: number): { value: string; truncated: boolean } {\n\tif (Buffer.byteLength(value, \"utf8\") <= cap) return { value, truncated: false };\n\tconst suffix = \"\\n\\n[Report truncated]\";\n\tlet truncated = value.slice(0, Math.max(0, cap - Buffer.byteLength(suffix, \"utf8\")));\n\twhile (Buffer.byteLength(`${truncated}${suffix}`, \"utf8\") > cap) truncated = truncated.slice(0, -1);\n\treturn { value: `${truncated}${suffix}`, truncated: true };\n}\n\nexport function createHubDelegationController(\n\tconfig: GitNexusConfig,\n\toptions: { fetchImpl?: typeof fetch; timeoutMs?: number } = {},\n): DelegationController {\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\treturn {\n\t\tasync createWorkerGrant(request) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst onAbort = (): void => controller.abort();\n\t\t\tif (request.signal?.aborted) controller.abort();\n\t\t\telse request.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tconst timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? WORKER_GRANT_TIMEOUT_MS);\n\t\t\ttry {\n\t\t\t\tconst response = await fetchImpl(`${hubApiBase(config.hubUrl)}/llm/worker-grants`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\tauthorization: `Bearer ${config.token}`,\n\t\t\t\t\t\t[RUN_ID_HEADER]: request.runId,\n\t\t\t\t\t\t[REQUEST_ID_HEADER]: request.requestId,\n\t\t\t\t\t\t[ROOT_REQUEST_ID_HEADER]: request.rootRequestId,\n\t\t\t\t\t\t[PARENT_REQUEST_ID_HEADER]: request.parentRequestId,\n\t\t\t\t\t\t[DELEGATION_ID_HEADER]: request.taskId,\n\t\t\t\t\t\t[REQUEST_SCOPE_HEADER]: \"worker\",\n\t\t\t\t\t\t...(config.deviceFingerprint ? { \"x-device-fingerprint\": config.deviceFingerprint } : {}),\n\t\t\t\t\t\t...(config.deviceName ? { \"x-device-name\": config.deviceName } : {}),\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({ sessionId: request.sessionId, taskId: request.taskId }),\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t});\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tawait response.body?.cancel().catch(() => {});\n\t\t\t\t\tthrow new Error(\"Worker authorization unavailable\");\n\t\t\t\t}\n\t\t\t\tconst body: unknown = await response.json();\n\t\t\t\tif (\n\t\t\t\t\t!isRecord(body) ||\n\t\t\t\t\ttypeof body.grant !== \"string\" ||\n\t\t\t\t\t!body.grant.trim() ||\n\t\t\t\t\ttypeof body.expiresAt !== \"string\" ||\n\t\t\t\t\t!body.expiresAt.trim() ||\n\t\t\t\t\t!Number.isFinite(Date.parse(body.expiresAt))\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid worker authorization response\");\n\t\t\t\t}\n\t\t\t\treturn { token: body.grant, expiresAt: body.expiresAt };\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\trequest.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function isDelegatedWorkerProcess(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env[INTERNAL_WORKER_MARKER_ENV] === \"1\";\n}\n\n/** Capture task routing once, then remove it before worker tools can inherit it. */\nexport function consumeWorkerContext(env: NodeJS.ProcessEnv = process.env): WorkerContext | undefined {\n\tif (!isDelegatedWorkerProcess(env)) return undefined;\n\tconst sessionId = env[INTERNAL_WORKER_SESSION_ENV]?.trim();\n\tconst taskId = env[INTERNAL_WORKER_TASK_ENV]?.trim();\n\tconst runId = env[INTERNAL_WORKER_RUN_ENV]?.trim();\n\tconst rootRequestId = env[INTERNAL_WORKER_ROOT_REQUEST_ENV]?.trim();\n\tconst parentRequestId = env[INTERNAL_WORKER_PARENT_REQUEST_ENV]?.trim();\n\tdelete env[INTERNAL_WORKER_SESSION_ENV];\n\tdelete env[INTERNAL_WORKER_TASK_ENV];\n\tdelete env[INTERNAL_WORKER_RUN_ENV];\n\tdelete env[INTERNAL_WORKER_ROOT_REQUEST_ENV];\n\tdelete env[INTERNAL_WORKER_PARENT_REQUEST_ENV];\n\tif (!sessionId || !taskId || !runId || !rootRequestId || !parentRequestId) return undefined;\n\treturn { sessionId, taskId, runId, rootRequestId, parentRequestId };\n}\n\nfunction killProcessTree(pid: number | undefined, signal: NodeJS.Signals): void {\n\tif (pid === undefined) return;\n\tif (process.platform === \"win32\") {\n\t\texecFile(\"taskkill\", [\"/T\", \"/F\", \"/PID\", String(pid)], () => undefined);\n\t\treturn;\n\t}\n\ttry {\n\t\tprocess.kill(-pid, signal);\n\t} catch {\n\t\t// The detached process group may already have exited.\n\t}\n}\n\nexport async function runDelegatedWorker(options: DelegatedWorkerOptions): Promise<DelegatedWorkerResult> {\n\tconst prompt = await writeWorkerPrompt();\n\tconst task = composeDelegatedTask(options.task, options.acceptanceCriteria, options.relevantPaths);\n\tconst args = buildDelegatedWorkerArgs(task, prompt.filePath);\n\tlet output = \"\";\n\tlet turns = 0;\n\tlet terminalStatus: Exclude<DelegationStatus, \"running\" | \"completed\" | \"failed\"> | undefined;\n\tlet assistantFailed = false;\n\tlet eventBytes = 0;\n\n\ttry {\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tconst invocation = getNexusInvocation(args);\n\t\t\tconst child = spawn(invocation.command, invocation.args, {\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tdetached: true,\n\t\t\t\tenv: {\n\t\t\t\t\t...process.env,\n\t\t\t\t\t[INTERNAL_WORKER_MARKER_ENV]: \"1\",\n\t\t\t\t\t[INTERNAL_WORKER_SESSION_ENV]: options.workerContext.sessionId,\n\t\t\t\t\t[INTERNAL_WORKER_TASK_ENV]: options.workerContext.taskId,\n\t\t\t\t\t[INTERNAL_WORKER_RUN_ENV]: options.workerContext.runId,\n\t\t\t\t\t[INTERNAL_WORKER_ROOT_REQUEST_ENV]: options.workerContext.rootRequestId,\n\t\t\t\t\t[INTERNAL_WORKER_PARENT_REQUEST_ENV]: options.workerContext.parentRequestId,\n\t\t\t\t},\n\t\t\t\tshell: false,\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tlet buffer = \"\";\n\t\t\tlet settled = false;\n\t\t\tlet stopped = false;\n\t\t\tlet forceKillTimer: NodeJS.Timeout | undefined;\n\n\t\t\tconst finish = (code: number): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(timeoutTimer);\n\t\t\t\tclearTimeout(forceKillTimer);\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", abortHandler);\n\t\t\t\tresolve(code);\n\t\t\t};\n\n\t\t\tconst stop = (status: \"aborted\" | \"timeout\" | \"turn_limit\" | \"event_limit\"): void => {\n\t\t\t\tif (stopped) return;\n\t\t\t\tstopped = true;\n\t\t\t\tterminalStatus = status;\n\t\t\t\tkillProcessTree(child.pid, \"SIGTERM\");\n\t\t\t\tforceKillTimer = setTimeout(() => {\n\t\t\t\t\tif (process.platform !== \"win32\") killProcessTree(child.pid, \"SIGKILL\");\n\t\t\t\t\tfinish(1);\n\t\t\t\t}, 5000);\n\t\t\t};\n\n\t\t\tconst emitProgress = (): void => {\n\t\t\t\toptions.onUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is in progress.\" }],\n\t\t\t\t\tdetails: { status: \"running\", turns },\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst processLine = (line: string): void => {\n\t\t\t\tif (!line.trim()) return;\n\t\t\t\tlet parsed: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(line);\n\t\t\t\t} catch {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!isRecord(parsed) || parsed.type !== \"message_end\") return;\n\t\t\t\tconst snapshot = parseAssistantSnapshot(parsed.message);\n\t\t\t\tif (!snapshot) return;\n\t\t\t\tturns += 1;\n\t\t\t\tif (snapshot.text) output = snapshot.text;\n\t\t\t\tif (snapshot.stopReason === \"error\" || snapshot.stopReason === \"aborted\") assistantFailed = true;\n\t\t\t\temitProgress();\n\t\t\t\t// A final assistant response can legitimately be the last allowed turn.\n\t\t\t\t// Stop only when the worker is asking the harness for another tool loop.\n\t\t\t\tif (turns >= MAX_DELEGATED_TURNS && snapshot.stopReason === \"toolUse\") stop(\"turn_limit\");\n\t\t\t};\n\n\t\t\tconst abortHandler = (): void => stop(\"aborted\");\n\t\t\tconst timeoutTimer = setTimeout(\n\t\t\t\t() => stop(\"timeout\"),\n\t\t\t\tMath.min(Math.max(1_000, options.timeoutMs ?? DELEGATED_WORKER_TIMEOUT_MS), DELEGATED_WORKER_TIMEOUT_MS),\n\t\t\t);\n\t\t\tchild.stdout.on(\"data\", (chunk: Buffer | string) => {\n\t\t\t\teventBytes += Buffer.byteLength(chunk);\n\t\t\t\tif (eventBytes > DELEGATED_EVENT_CAP_BYTES) {\n\t\t\t\t\tassistantFailed = true;\n\t\t\t\t\tstop(\"event_limit\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbuffer += chunk.toString();\n\t\t\t\tif (Buffer.byteLength(buffer, \"utf8\") > DELEGATED_EVENT_CAP_BYTES) {\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tassistantFailed = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() ?? \"\";\n\t\t\t\tfor (const line of lines) processLine(line);\n\t\t\t});\n\t\t\t// Consume stderr so a noisy child cannot block. Raw provider/process output\n\t\t\t// is intentionally not retained or exposed to the orchestrator or user.\n\t\t\tchild.stderr.on(\"data\", () => undefined);\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tif (buffer.trim()) processLine(buffer);\n\t\t\t\tfinish(code ?? (terminalStatus ? 1 : 0));\n\t\t\t});\n\t\t\tchild.on(\"error\", () => finish(1));\n\t\t\tif (options.signal?.aborted) abortHandler();\n\t\t\telse options.signal?.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t});\n\n\t\tconst limitedOutput = truncateUtf8(output, DELEGATED_OUTPUT_CAP_BYTES);\n\t\tconst status = terminalStatus ?? (exitCode === 0 && !assistantFailed ? \"completed\" : \"failed\");\n\t\treturn {\n\t\t\tstatus,\n\t\t\tturns,\n\t\t\texitCode,\n\t\t\toutput: limitedOutput.value,\n\t\t\toutputTruncated: limitedOutput.truncated,\n\t\t};\n\t} finally {\n\t\tawait fs.promises.rm(prompt.dir, { recursive: true, force: true });\n\t}\n}\n\nconst DelegateTaskParameters = Type.Object({\n\ttask: Type.String({ description: \"A self-contained task with explicit boundaries\", maxLength: 32_768 }),\n\tacceptanceCriteria: Type.Optional(Type.Array(Type.String({ maxLength: 2000 }), { maxItems: 10 })),\n\trelevantPaths: Type.Optional(Type.Array(Type.String({ maxLength: 1000 }), { maxItems: 20 })),\n});\n\nfunction resultContent(result: DelegatedWorkerResult): string {\n\tconst report = result.output.trim() || \"No worker report was returned.\";\n\tif (result.status === \"completed\") return `Delegated work completed.\\n\\n${report}`;\n\treturn `Delegated work did not complete (${result.status}).\\n\\nPartial report:\\n${report}`;\n}\n\n/** Register the tool only after the Hub explicitly advertises delegation. */\nexport function registerDelegateTaskTool(pi: ExtensionAPI, capability: DelegationCapability): void {\n\tconst maxTaskBytes = Math.min(Math.max(1, Math.floor(capability.maxTaskBytes)), MAX_DELEGATED_TASK_BYTES);\n\tconst workerTimeoutMs = Math.min(\n\t\tMath.max(1_000, Math.floor(capability.workerTimeoutMs)),\n\t\tDELEGATED_WORKER_TIMEOUT_MS,\n\t);\n\tconst runId = randomUUID();\n\tlet rootRequestId: string | undefined;\n\tlet latestRootRequestId: string | undefined;\n\tlet activeWorkers = 0;\n\tpi.on(\"before_agent_start\", (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model)) return;\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\nDelegation guidance: prioritize delegate_task for self-contained, context-heavy investigation, broad searches, audits, repeated tool loops, or substantial implementation so the main conversation stays focused and efficient. Use your own tools directly when the work is small, depends on context already established in this conversation, requires direct verification, or delegation fails or reaches a limit. You remain responsible for the final result.`,\n\t\t};\n\t});\n\tpi.on(\"before_provider_headers\", (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model) || isDelegatedWorkerProcess()) return;\n\t\tconst requestId = randomUUID();\n\t\trootRequestId ??= requestId;\n\t\tlatestRootRequestId = requestId;\n\t\tevent.headers[RUN_ID_HEADER] = runId;\n\t\tevent.headers[REQUEST_ID_HEADER] = requestId;\n\t\tevent.headers[ROOT_REQUEST_ID_HEADER] = rootRequestId;\n\t\tevent.headers[REQUEST_SCOPE_HEADER] = \"root\";\n\t});\n\tpi.registerTool({\n\t\tname: DELEGATE_TASK_TOOL_NAME,\n\t\tlabel: \"Work\",\n\t\tdescription:\n\t\t\t\"Delegate one self-contained task to an isolated internal worker. Keep user communication and final responsibility in this conversation.\",\n\t\tparameters: DelegateTaskParameters,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tif (!isAutoModel(ctx.model)) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is unavailable for the active mode.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!ctx.isProjectTrusted()) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work requires a trusted project.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (activeWorkers >= MAX_PARALLEL_MUTATING_WORKERS) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is temporarily unavailable for this run.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst request: DelegationRequest = {\n\t\t\t\ttask: params.task,\n\t\t\t\tacceptanceCriteria: params.acceptanceCriteria ?? [],\n\t\t\t\trelevantPaths: params.relevantPaths ?? [],\n\t\t\t\tcwd: ctx.cwd,\n\t\t\t\tsignal,\n\t\t\t};\n\t\t\tif (\n\t\t\t\tBuffer.byteLength(\n\t\t\t\t\tcomposeDelegatedTask(request.task, request.acceptanceCriteria, request.relevantPaths),\n\t\t\t\t\t\"utf8\",\n\t\t\t\t) > maxTaskBytes\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is too large for one bounded task.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tactiveWorkers += 1;\n\t\t\ttry {\n\t\t\t\tconst delegationId = randomUUID();\n\t\t\t\trootRequestId ??= randomUUID();\n\t\t\t\tconst result = await runDelegatedWorker({\n\t\t\t\t\t...request,\n\t\t\t\t\tworkerContext: {\n\t\t\t\t\t\tsessionId: ctx.sessionManager.getSessionId(),\n\t\t\t\t\t\ttaskId: delegationId,\n\t\t\t\t\t\trunId,\n\t\t\t\t\t\trootRequestId,\n\t\t\t\t\t\tparentRequestId: latestRootRequestId ?? rootRequestId,\n\t\t\t\t\t},\n\t\t\t\t\ttimeoutMs: workerTimeoutMs,\n\t\t\t\t\tonUpdate,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: resultContent(result) }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\tturns: result.turns,\n\t\t\t\t\t\texitCode: result.exitCode,\n\t\t\t\t\t\toutputTruncated: result.outputTruncated,\n\t\t\t\t\t} satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work could not be started.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tactiveWorkers -= 1;\n\t\t\t}\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"Working…\")), 0, 0);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as DelegationDetails | undefined;\n\t\t\tif (details?.status === \"running\") return new Text(theme.fg(\"muted\", \"Working…\"), 0, 0);\n\t\t\tif (details?.status === \"completed\") return new Text(theme.fg(\"success\", \"Work completed\"), 0, 0);\n\t\t\treturn new Text(theme.fg(\"error\", \"Work needs attention\"), 0, 0);\n\t\t},\n\t});\n}\n\n/**\n * Install a fail-closed header hook for one worker task. A fresh one-time grant\n * is minted for each model turn; no grant is inherited by worker tools.\n */\nexport function registerWorkerGrantHeaders(\n\tpi: ExtensionAPI,\n\tworkerContext: WorkerContext,\n\tcontroller: DelegationController | undefined,\n): void {\n\tpi.on(\"before_provider_headers\", async (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model)) {\n\t\t\tctx.abort();\n\t\t\treturn;\n\t\t}\n\n\t\t// Set an invalid sentinel first. Extension handler errors are reported and\n\t\t// swallowed by the runner, so this prevents a mint failure from silently\n\t\t// falling back to an ungranted root request.\n\t\tconst requestId = randomUUID();\n\t\tevent.headers[INTERNAL_WORKER_GRANT_HEADER] = INVALID_WORKER_GRANT;\n\t\tevent.headers[INTERNAL_WORKER_TASK_HEADER] = workerContext.taskId;\n\t\tevent.headers[SESSION_AFFINITY_HEADER] = workerContext.sessionId;\n\t\tevent.headers[RUN_ID_HEADER] = workerContext.runId;\n\t\tevent.headers[REQUEST_ID_HEADER] = requestId;\n\t\tevent.headers[ROOT_REQUEST_ID_HEADER] = workerContext.rootRequestId;\n\t\tevent.headers[PARENT_REQUEST_ID_HEADER] = workerContext.parentRequestId;\n\t\tevent.headers[DELEGATION_ID_HEADER] = workerContext.taskId;\n\t\tevent.headers[REQUEST_SCOPE_HEADER] = \"worker\";\n\t\tif (!controller) return;\n\n\t\tconst grant = await controller.createWorkerGrant({\n\t\t\t...workerContext,\n\t\t\trequestId,\n\t\t\tsignal: ctx.signal,\n\t\t});\n\t\tevent.headers[INTERNAL_WORKER_GRANT_HEADER] = grant.token;\n\t});\n}\n\nexport default function delegatedWorkerRuntime(pi: ExtensionAPI): void {\n\tconst isWorker = isDelegatedWorkerProcess();\n\tconst workerContext = consumeWorkerContext();\n\tif (!isWorker) return;\n\tconst config = resolveGitNexusConfig();\n\tconst failClosedContext: WorkerContext = {\n\t\tsessionId: \"unavailable\",\n\t\ttaskId: \"unavailable\",\n\t\trunId: \"unavailable\",\n\t\trootRequestId: \"unavailable\",\n\t\tparentRequestId: \"unavailable\",\n\t};\n\tregisterWorkerGrantHeaders(\n\t\tpi,\n\t\tworkerContext ?? failClosedContext,\n\t\tworkerContext && config ? createHubDelegationController(config) : undefined,\n\t);\n}\n"]}