@astralyn/pi 0.84.7 → 0.84.8
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/CHANGELOG.md +19 -0
- package/dist/core/compaction/compaction.d.ts +2 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +7 -7
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/extensions/background/index.d.ts.map +1 -1
- package/dist/extensions/background/index.js +48 -72
- package/dist/extensions/background/index.js.map +1 -1
- package/dist/extensions/background/manager.d.ts.map +1 -1
- package/dist/extensions/background/manager.js +5 -3
- package/dist/extensions/background/manager.js.map +1 -1
- package/dist/extensions/background/registry.d.ts +11 -13
- package/dist/extensions/background/registry.d.ts.map +1 -1
- package/dist/extensions/background/registry.js +71 -80
- package/dist/extensions/background/registry.js.map +1 -1
- package/dist/extensions/background/render.d.ts.map +1 -1
- package/dist/extensions/background/render.js +8 -3
- package/dist/extensions/background/render.js.map +1 -1
- package/dist/extensions/deepwiki/constants.d.ts +2 -2
- package/dist/extensions/deepwiki/constants.d.ts.map +1 -1
- package/dist/extensions/deepwiki/constants.js +5 -5
- package/dist/extensions/deepwiki/constants.js.map +1 -1
- package/dist/extensions/deepwiki/schema.js +1 -1
- package/dist/extensions/deepwiki/schema.js.map +1 -1
- package/dist/extensions/question/constants.d.ts +2 -2
- package/dist/extensions/question/constants.d.ts.map +1 -1
- package/dist/extensions/question/constants.js +5 -2
- package/dist/extensions/question/constants.js.map +1 -1
- package/dist/extensions/subagent/activity.d.ts +9 -0
- package/dist/extensions/subagent/activity.d.ts.map +1 -1
- package/dist/extensions/subagent/activity.js +21 -0
- package/dist/extensions/subagent/activity.js.map +1 -1
- package/dist/extensions/subagent/agents.d.ts.map +1 -1
- package/dist/extensions/subagent/agents.js +7 -3
- package/dist/extensions/subagent/agents.js.map +1 -1
- package/dist/extensions/subagent/constants.d.ts +1 -0
- package/dist/extensions/subagent/constants.d.ts.map +1 -1
- package/dist/extensions/subagent/constants.js +4 -0
- package/dist/extensions/subagent/constants.js.map +1 -1
- package/dist/extensions/subagent/index.js +2 -2
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +1 -7
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +19 -0
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/state.d.ts +9 -0
- package/dist/extensions/subagent/state.d.ts.map +1 -1
- package/dist/extensions/subagent/state.js +33 -2
- package/dist/extensions/subagent/state.js.map +1 -1
- package/dist/extensions/todo/constants.d.ts +1 -1
- package/dist/extensions/todo/constants.d.ts.map +1 -1
- package/dist/extensions/todo/constants.js +10 -27
- package/dist/extensions/todo/constants.js.map +1 -1
- package/dist/extensions/todo/state.d.ts.map +1 -1
- package/dist/extensions/todo/state.js +27 -16
- package/dist/extensions/todo/state.js.map +1 -1
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js +16 -5
- package/dist/extensions/todo/view.js.map +1 -1
- package/docs/bundled/extensions/background.md +3 -3
- package/docs/bundled/extensions/todo.md +2 -2
- package/docs/compaction.md +2 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -14,9 +14,9 @@ export default function subagent(pi) {
|
|
|
14
14
|
name: SUBAGENT_TOOL_NAME,
|
|
15
15
|
label: SUBAGENT_TOOL_LABEL,
|
|
16
16
|
description: subagentToolDescription(),
|
|
17
|
-
promptSnippet: "Delegate bounded work to isolated
|
|
17
|
+
promptSnippet: "Delegate bounded work to isolated explorer or general workers",
|
|
18
18
|
promptGuidelines: [
|
|
19
|
-
"Use subagent for bounded work that benefits from isolated context or concurrent investigation;
|
|
19
|
+
"Use `subagent` for bounded work that benefits from isolated context or concurrent investigation; do not delegate a task you can finish with one or two direct tool calls.",
|
|
20
20
|
],
|
|
21
21
|
parameters: SubagentParamsSchema,
|
|
22
22
|
async execute(toolCallId, params, signal, onUpdate, ctx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAA4B,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEtH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAgB;IAChD,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEtD,EAAE,CAAC,YAAY,CAAoE;QAClF,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,uBAAuB,EAAE;QACtC,aAAa,EAAE,+DAA+D;QAC9E,gBAAgB,EAAE;YACjB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAgentDir } from \"../../config.ts\";\nimport type { AgentToolResult, ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { emptyUsage } from \"./activity.ts\";\nimport { subagentToolDescription } from \"./agents.ts\";\nimport { showAgentsCommand } from \"./agents-command.ts\";\nimport { SUBAGENT_COMMAND_NAME, SUBAGENT_TOOL_LABEL, SUBAGENT_TOOL_NAME } from \"./constants.ts\";\nimport { renderSubagentCall, renderSubagentResult, type SubagentRenderState, scheduleLiveRefresh } from \"./render.ts\";\nimport type { ParentModelContext } from \"./resolve.ts\";\nimport { ConcurrencyGate, isSubagentError, runSubagentInvocation } from \"./runner.ts\";\nimport { SubagentParamsSchema } from \"./schema.ts\";\nimport { statusSummary } from \"./state.ts\";\nimport type { SubagentDetails } from \"./types.ts\";\n\nexport default function subagent(pi: ExtensionAPI): void {\n\tconst gate = new ConcurrencyGate();\n\tconst activeAborters = new Set<() => Promise<void>>();\n\n\tpi.registerTool<typeof SubagentParamsSchema, SubagentDetails, SubagentRenderState>({\n\t\tname: SUBAGENT_TOOL_NAME,\n\t\tlabel: SUBAGENT_TOOL_LABEL,\n\t\tdescription: subagentToolDescription(),\n\t\tpromptSnippet: \"Delegate bounded work to isolated explorer or general workers\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use `subagent` for bounded work that benefits from isolated context or concurrent investigation; do not delegate a task you can finish with one or two direct tool calls.\",\n\t\t],\n\t\tparameters: SubagentParamsSchema,\n\t\tasync execute(toolCallId, params, signal, onUpdate, ctx): Promise<AgentToolResult<SubagentDetails>> {\n\t\t\t// First paint before task preflight so filesystem and model checks\n\t\t\t// cannot leave the transcript card empty.\n\t\t\tonUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: \"Initializing…\" }],\n\t\t\t\tdetails: {\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\truns: [],\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\tusage: emptyUsage(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst parent: ParentModelContext = {\n\t\t\t\tmodel: ctx.model,\n\t\t\t\tthinking: pi.getThinkingLevel(),\n\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t};\n\t\t\tconst execution = await runSubagentInvocation({\n\t\t\t\tparams,\n\t\t\t\tparentCwd: ctx.cwd,\n\t\t\t\tparent,\n\t\t\t\tmodelRuntime: ctx.modelRuntime,\n\t\t\t\tagentDir: getAgentDir(),\n\t\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\t\tsignal,\n\t\t\t\tgate,\n\t\t\t\tbatchId: toolCallId,\n\t\t\t\tonUpdate: (details) => {\n\t\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: statusSummary(details) }], details });\n\t\t\t\t},\n\t\t\t\tregisterAbort: (abort) => {\n\t\t\t\t\tactiveAborters.add(abort);\n\t\t\t\t\treturn () => activeAborters.delete(abort);\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: execution.content }],\n\t\t\t\tdetails: execution.details,\n\t\t\t\tusage: execution.usage,\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn renderSubagentCall(args, theme);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tscheduleLiveRefresh(context, options.isPartial);\n\t\t\treturn renderSubagentResult(result, options, theme, context.args, context.isError);\n\t\t},\n\t});\n\n\tpi.registerCommand(SUBAGENT_COMMAND_NAME, {\n\t\tdescription: \"Configure Subagent profiles, models, and thinking levels\",\n\t\thandler: async (_args, ctx) => showAgentsCommand(ctx, pi.getThinkingLevel()),\n\t});\n\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== SUBAGENT_TOOL_NAME) return;\n\t\tconst details = event.details as SubagentDetails | undefined;\n\t\tif (details && isSubagentError(details)) return { isError: true };\n\t});\n\n\tpi.on(\"session_shutdown\", async () => {\n\t\tawait Promise.allSettled([...activeAborters].map((abort) => abort()));\n\t\tactiveAborters.clear();\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAClH,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAClH,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAItF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,KAAK,EAAE,eAAe,EAAuD,MAAM,YAAY,CAAC;AA2OvG,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IACnC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;CAC7C;AAID,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAgB7G;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAQhF;AAED,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,EACxC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,OAAO,GACd,SAAS,CA6BX"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
|
|
2
2
|
import { getMarkdownTheme } from "../../modes/interactive/theme/theme.js";
|
|
3
|
+
import { formatTokens } from "./activity.js";
|
|
3
4
|
import { AGENT_PROFILE_LABELS } from "./agents.js";
|
|
4
5
|
import { getSubagentRetryView, statusSummary } from "./state.js";
|
|
5
6
|
import { firstPlainLine, plainLine, truncate } from "./text.js";
|
|
@@ -22,13 +23,6 @@ function taskSummary(args, index, run) {
|
|
|
22
23
|
function profileLabel(agent) {
|
|
23
24
|
return AGENT_PROFILE_LABELS[agent] ?? agent;
|
|
24
25
|
}
|
|
25
|
-
function formatTokens(value) {
|
|
26
|
-
if (value < 1_000)
|
|
27
|
-
return String(value);
|
|
28
|
-
if (value < 1_000_000)
|
|
29
|
-
return `${(value / 1_000).toFixed(value < 10_000 ? 1 : 0)}k`;
|
|
30
|
-
return `${(value / 1_000_000).toFixed(1)}M`;
|
|
31
|
-
}
|
|
32
26
|
function formatDuration(seconds) {
|
|
33
27
|
const roundedSeconds = Math.round(seconds);
|
|
34
28
|
if (roundedSeconds >= 60)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, Container, Markdown, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from \"../../core/extensions/types.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { AGENT_PROFILE_LABELS } from \"./agents.ts\";\nimport type { SubagentAgentName } from \"./constants.ts\";\nimport type { SubagentParams } from \"./schema.ts\";\nimport { getSubagentRetryView, statusSummary } from \"./state.ts\";\nimport { firstPlainLine, plainLine, truncate } from \"./text.ts\";\nimport type { SubagentDetails, SubagentRunDetails, SubagentRunStatus, ToolActivity } from \"./types.ts\";\n\nconst TASK_SUMMARY_LIMIT = 72;\nconst ACTIVITY_SUMMARY_LIMIT = 120;\nconst ACTIVITY_RESULT_LIMIT = 96;\nconst RETRY_ERROR_LIMIT = 160;\nconst FALLBACK_OUTPUT_LIMIT = 4_000;\nconst ACTIVITY_DURATION_MIN_MS = 10_000;\n\nfunction taskPrompt(args: SubagentParams, index: number, run: SubagentRunDetails): string {\n\t// Tool calls restored from before the tasks-array shape carry a legacy\n\t// args object without `tasks`; those rows fall back to the description.\n\tconst tasks = (args as Partial<SubagentParams>).tasks;\n\treturn tasks?.[index]?.prompt ?? run.description;\n}\n\nfunction taskSummary(args: SubagentParams, index: number, run: SubagentRunDetails): string {\n\tconst firstLine = firstPlainLine(taskPrompt(args, index, run));\n\treturn truncate(firstLine || plainLine(run.description) || `Task ${index + 1}`, TASK_SUMMARY_LIMIT);\n}\n\nfunction profileLabel(agent: string): string {\n\treturn AGENT_PROFILE_LABELS[agent as SubagentAgentName] ?? agent;\n}\n\nfunction formatTokens(value: number): string {\n\tif (value < 1_000) return String(value);\n\tif (value < 1_000_000) return `${(value / 1_000).toFixed(value < 10_000 ? 1 : 0)}k`;\n\treturn `${(value / 1_000_000).toFixed(1)}M`;\n}\n\nfunction formatDuration(seconds: number): string {\n\tconst roundedSeconds = Math.round(seconds);\n\tif (roundedSeconds >= 60) return `${Math.floor(roundedSeconds / 60)}m ${roundedSeconds % 60}s`;\n\treturn `${seconds.toFixed(seconds < 10 ? 1 : 0)}s`;\n}\n\nfunction elapsed(startedAt: number | undefined, endedAt?: number): string | undefined {\n\tif (startedAt === undefined) return undefined;\n\treturn formatDuration(Math.max(0, ((endedAt ?? Date.now()) - startedAt) / 1_000));\n}\n\nfunction statusColor(status: SubagentRunStatus): \"success\" | \"error\" | \"warning\" | \"accent\" | \"muted\" {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\t\treturn \"success\";\n\t\tcase \"failed\":\n\t\t\treturn \"error\";\n\t\tcase \"aborted\":\n\t\t\treturn \"warning\";\n\t\tcase \"running\":\n\t\t\treturn \"accent\";\n\t\tdefault:\n\t\t\treturn \"muted\";\n\t}\n}\n\nfunction statusMarker(status: SubagentRunStatus, theme: Theme): string {\n\tconst glyph =\n\t\tstatus === \"completed\"\n\t\t\t? \"✓\"\n\t\t\t: status === \"failed\"\n\t\t\t\t? \"×\"\n\t\t\t\t: status === \"aborted\"\n\t\t\t\t\t? \"■\"\n\t\t\t\t\t: status === \"running\"\n\t\t\t\t\t\t? \"›\"\n\t\t\t\t\t\t: \"○\";\n\treturn theme.fg(statusColor(status), glyph);\n}\n\nfunction statusWord(status: SubagentRunStatus): string {\n\tif (status === \"completed\") return \"Completed\";\n\tif (status === \"failed\") return \"Failed\";\n\tif (status === \"aborted\") return \"Aborted\";\n\tif (status === \"running\") return \"Running\";\n\treturn \"Queued\";\n}\n\nfunction retryText(run: SubagentRunDetails): string | undefined {\n\tconst retry = getSubagentRetryView(run);\n\tif (!retry) return undefined;\n\tconst state =\n\t\tretry.remainingSeconds > 0\n\t\t\t? `Retrying (${retry.attempt}/${retry.maxAttempts}) in ${retry.remainingSeconds}s`\n\t\t\t: `Retrying now… (${retry.attempt}/${retry.maxAttempts})`;\n\tconst error = truncate(plainLine(retry.error), RETRY_ERROR_LIMIT);\n\treturn error ? `${state} — ${error}` : state;\n}\n\nfunction runningDetail(run: SubagentRunDetails): string | undefined {\n\tconst retry = retryText(run);\n\tif (retry) return retry;\n\tif (run.currentActivity) return truncate(plainLine(run.currentActivity), ACTIVITY_SUMMARY_LIMIT);\n\tif (run.status === \"queued\") return \"Waiting for a worker slot\";\n\tif (run.status === \"running\" && run.usage.turns === 0 && run.usage.toolUses === 0) return \"Initializing…\";\n\tif (run.status === \"running\") return \"Thinking…\";\n\tif ((run.status === \"failed\" || run.status === \"aborted\") && run.error) {\n\t\treturn truncate(plainLine(run.error), ACTIVITY_RESULT_LIMIT);\n\t}\n\treturn undefined;\n}\n\nfunction batchMarker(details: SubagentDetails, theme: Theme): string {\n\tif (details.runs.some((run) => run.status === \"failed\")) return theme.fg(\"error\", \"×\");\n\tif (details.runs.some((run) => run.status === \"aborted\")) return theme.fg(\"warning\", \"■\");\n\treturn theme.fg(\"success\", \"✓\");\n}\n\nfunction progressHeader(details: SubagentDetails, theme: Theme): string {\n\tconst settled = details.runs.filter((run) => run.status !== \"running\" && run.status !== \"queued\").length;\n\treturn theme.fg(\"accent\", `› ${settled}/${details.runs.length} done · ${elapsed(details.startedAt) ?? \"0.0s\"}`);\n}\n\nfunction taskRow(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme, live: boolean): string {\n\tlet line = ` ${statusMarker(run.status, theme)} ${theme.fg(\"accent\", profileLabel(run.agent))}${theme.fg(\"dim\", ` · ${taskSummary(args, index, run)}`)}`;\n\tconst detail = live ? runningDetail(run) : undefined;\n\tif (detail) {\n\t\tline += theme.fg(\"dim\", ` — ${detail}`);\n\t} else if (run.status !== \"running\" && run.status !== \"queued\") {\n\t\tconst duration = elapsed(run.startedAt, run.endedAt);\n\t\tif (duration) line += theme.fg(\"dim\", ` · ${duration}`);\n\t}\n\treturn line;\n}\n\nfunction outcomeSummary(details: SubagentDetails): string {\n\tconst completed = details.runs.filter((run) => run.status === \"completed\").length;\n\tconst failed = details.runs.filter((run) => run.status === \"failed\").length;\n\tconst aborted = details.runs.filter((run) => run.status === \"aborted\").length;\n\tconst parts: string[] = [];\n\tif (completed) parts.push(`${completed} completed`);\n\tif (failed) parts.push(`${failed} failed`);\n\tif (aborted) parts.push(`${aborted} aborted`);\n\tif (parts.length === 0) parts.push(statusSummary(details));\n\tconst duration = elapsed(details.startedAt, details.endedAt);\n\tif (duration) parts.push(duration);\n\tif (details.usage.cost) parts.push(`$${details.usage.cost.toFixed(3)}`);\n\treturn parts.join(\" · \");\n}\n\nfunction runMetrics(run: SubagentRunDetails): string {\n\tconst items = [run.model];\n\tif (run.thinking !== \"off\") items.push(`${run.thinking} thinking`);\n\tif (run.cwd) items.push(`cwd: ${run.cwd}`);\n\tconst settled = run.status !== \"running\" && run.status !== \"queued\";\n\tif (settled && run.usage.totalTokens) items.push(`${formatTokens(run.usage.totalTokens)} tok`);\n\tif (run.usage.toolUses) items.push(`${run.usage.toolUses} tool use${run.usage.toolUses === 1 ? \"\" : \"s\"}`);\n\tif (run.usage.turns) items.push(`${run.usage.turns} turn${run.usage.turns === 1 ? \"\" : \"s\"}`);\n\tif (run.usage.contextTokens) items.push(`ctx: ${formatTokens(run.usage.contextTokens)}`);\n\tif (run.usage.cost) items.push(`$${run.usage.cost.toFixed(3)}`);\n\tconst duration = elapsed(run.startedAt, run.endedAt);\n\tif (duration) items.push(duration);\n\treturn items.join(\" · \");\n}\n\nfunction activityLine(activity: ToolActivity, run: SubagentRunDetails, theme: Theme): string {\n\tconst summary =\n\t\tactivity.status === \"running\" && run.currentActivity\n\t\t\t? truncate(plainLine(run.currentActivity), ACTIVITY_SUMMARY_LIMIT)\n\t\t\t: truncate(plainLine(activity.summary), ACTIVITY_SUMMARY_LIMIT);\n\tlet line =\n\t\tactivity.status === \"failed\"\n\t\t\t? `${theme.fg(\"error\", \"×\")} ${theme.fg(\"toolOutput\", summary)}`\n\t\t\t: activity.status === \"running\"\n\t\t\t\t? `${theme.fg(\"accent\", \"›\")} ${theme.fg(\"toolOutput\", summary)}`\n\t\t\t\t: ` ${theme.fg(\"toolOutput\", summary)}`;\n\tif (activity.status === \"failed\" && activity.resultSummary) {\n\t\tline += theme.fg(\"error\", ` · ${truncate(plainLine(activity.resultSummary), ACTIVITY_RESULT_LIMIT)}`);\n\t}\n\tif (activity.endedAt !== undefined && activity.endedAt - activity.startedAt >= ACTIVITY_DURATION_MIN_MS) {\n\t\tline += theme.fg(\"dim\", ` · ${formatDuration((activity.endedAt - activity.startedAt) / 1_000)}`);\n\t}\n\treturn line;\n}\n\nfunction runHeader(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): string {\n\treturn `${theme.fg(\"dim\", `── #${index + 1} `)}${statusMarker(run.status, theme)} ${theme.fg(\"accent\", profileLabel(run.agent))}${theme.fg(\"dim\", ` · ${taskSummary(args, index, run)}`)}`;\n}\n\nfunction renderRunningRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new Text(runHeader(run, index, args, theme), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"dim\", runMetrics(run)), 0, 0));\n\tconst retry = retryText(run);\n\tif (retry) container.addChild(new Text(theme.fg(\"accent\", retry), 0, 0));\n\tcontainer.addChild(new Spacer(1));\n\tconst total = Math.max(run.usage.toolUses, run.activities.length);\n\tconst label = total > run.activities.length ? `Activity · last ${run.activities.length} of ${total}` : \"Activity\";\n\tcontainer.addChild(new Text(theme.fg(\"muted\", label), 0, 0));\n\tif (run.activities.length > 0) {\n\t\tfor (const activity of run.activities) container.addChild(new Text(activityLine(activity, run, theme), 0, 0));\n\t} else {\n\t\tconst fallback = retry\n\t\t\t? \"Waiting to retry\"\n\t\t\t: run.status === \"failed\" || run.status === \"aborted\"\n\t\t\t\t? \"No activity recorded\"\n\t\t\t\t: (runningDetail(run) ?? statusWord(run.status));\n\t\tcontainer.addChild(new Text(theme.fg(\"dim\", ` ${fallback}`), 0, 0));\n\t}\n\tif (run.error) {\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Error\"), 0, 0));\n\t\tcontainer.addChild(new Text(theme.fg(\"error\", run.error), 0, 0));\n\t}\n\treturn container;\n}\n\nfunction renderSettledRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new Text(runHeader(run, index, args, theme), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"dim\", runMetrics(run)), 0, 0));\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Prompt\"), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"toolOutput\", taskPrompt(args, index, run)), 0, 0));\n\tif (run.error) {\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Error\"), 0, 0));\n\t\tcontainer.addChild(new Text(theme.fg(\"error\", run.error), 0, 0));\n\t}\n\tcontainer.addChild(new Spacer(1));\n\tconst reportLabel = run.status !== \"completed\" && run.report ? \"Report · partial\" : \"Report\";\n\tcontainer.addChild(new Text(theme.fg(\"muted\", reportLabel), 0, 0));\n\tif (run.report) {\n\t\tcontainer.addChild(\n\t\t\tnew Markdown(run.report, 0, 0, getMarkdownTheme(), {\n\t\t\t\tcolor: (text) => theme.fg(\"toolOutput\", text),\n\t\t\t}),\n\t\t);\n\t} else {\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"(No report.)\"), 0, 0));\n\t}\n\treturn container;\n}\n\nfunction fallbackResult(result: AgentToolResult<SubagentDetails>, theme: Theme, isError: boolean): Component {\n\tconst text = result.content.find((part) => part.type === \"text\");\n\tconst value = text?.type === \"text\" ? truncate(text.text, FALLBACK_OUTPUT_LIMIT) : \"(no output)\";\n\treturn new Text(theme.fg(isError ? \"error\" : \"muted\", value), 0, 0);\n}\n\n/** Per-result live-refresh state owned by the shell's render context. */\nexport interface SubagentRenderState {\n\trefreshTimer?: ReturnType<typeof setTimeout>;\n}\n\n// Re-render elapsed time and retry countdowns once per second while the\n// result is still partial; the first settled render clears the timer.\nexport function scheduleLiveRefresh(context: ToolRenderContext<SubagentRenderState>, isPartial: boolean): void {\n\tconst state = context.state;\n\tif (isPartial) {\n\t\tif (state.refreshTimer === undefined) {\n\t\t\tstate.refreshTimer = setTimeout(() => {\n\t\t\t\tstate.refreshTimer = undefined;\n\t\t\t\tcontext.invalidate();\n\t\t\t}, 1000);\n\t\t\tstate.refreshTimer.unref?.();\n\t\t}\n\t\treturn;\n\t}\n\tif (state.refreshTimer !== undefined) {\n\t\tclearTimeout(state.refreshTimer);\n\t\tstate.refreshTimer = undefined;\n\t}\n}\n\nexport function renderSubagentCall(args: SubagentParams, theme: Theme): Component {\n\tconst count = Array.isArray(args.tasks) ? args.tasks.length : 0;\n\tconst label = `${count} task${count === 1 ? \"\" : \"s\"}`;\n\treturn new Text(\n\t\t`${theme.fg(\"toolTitle\", theme.bold(\"Subagent\"))}${theme.fg(count > 0 ? \"dim\" : \"error\", ` · ${label}`)}`,\n\t\t0,\n\t\t0,\n\t);\n}\n\nexport function renderSubagentResult(\n\tresult: AgentToolResult<SubagentDetails>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\targs: SubagentParams,\n\tisError: boolean,\n): Component {\n\tconst details = result.details;\n\tif (!details || !Array.isArray(details.runs)) return fallbackResult(result, theme, isError);\n\tif (details.runs.length === 0) return new Text(theme.fg(\"muted\", \"Initializing…\"), 0, 0);\n\n\tif (!options.expanded) {\n\t\tconst container = new Container();\n\t\tconst header = options.isPartial\n\t\t\t? progressHeader(details, theme)\n\t\t\t: `${batchMarker(details, theme)} ${theme.fg(isError ? \"error\" : \"muted\", outcomeSummary(details))}`;\n\t\tcontainer.addChild(new Text(header, 0, 0));\n\t\tfor (const [index, run] of details.runs.entries()) {\n\t\t\tcontainer.addChild(new Text(taskRow(run, index, args, theme, options.isPartial), 0, 0));\n\t\t}\n\t\treturn container;\n\t}\n\n\tconst container = new Container();\n\tconst header = options.isPartial\n\t\t? progressHeader(details, theme)\n\t\t: `${batchMarker(details, theme)} ${theme.fg(isError ? \"error\" : \"toolTitle\", outcomeSummary(details))}`;\n\tcontainer.addChild(new Text(header, 0, 0));\n\tfor (const [index, run] of details.runs.entries()) {\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(\n\t\t\toptions.isPartial ? renderRunningRun(run, index, args, theme) : renderSettledRun(run, index, args, theme),\n\t\t);\n\t}\n\treturn container;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, Container, Markdown, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from \"../../core/extensions/types.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { formatTokens } from \"./activity.ts\";\nimport { AGENT_PROFILE_LABELS } from \"./agents.ts\";\nimport type { SubagentAgentName } from \"./constants.ts\";\nimport type { SubagentParams } from \"./schema.ts\";\nimport { getSubagentRetryView, statusSummary } from \"./state.ts\";\nimport { firstPlainLine, plainLine, truncate } from \"./text.ts\";\nimport type { SubagentDetails, SubagentRunDetails, SubagentRunStatus, ToolActivity } from \"./types.ts\";\n\nconst TASK_SUMMARY_LIMIT = 72;\nconst ACTIVITY_SUMMARY_LIMIT = 120;\nconst ACTIVITY_RESULT_LIMIT = 96;\nconst RETRY_ERROR_LIMIT = 160;\nconst FALLBACK_OUTPUT_LIMIT = 4_000;\nconst ACTIVITY_DURATION_MIN_MS = 10_000;\n\nfunction taskPrompt(args: SubagentParams, index: number, run: SubagentRunDetails): string {\n\t// Tool calls restored from before the tasks-array shape carry a legacy\n\t// args object without `tasks`; those rows fall back to the description.\n\tconst tasks = (args as Partial<SubagentParams>).tasks;\n\treturn tasks?.[index]?.prompt ?? run.description;\n}\n\nfunction taskSummary(args: SubagentParams, index: number, run: SubagentRunDetails): string {\n\tconst firstLine = firstPlainLine(taskPrompt(args, index, run));\n\treturn truncate(firstLine || plainLine(run.description) || `Task ${index + 1}`, TASK_SUMMARY_LIMIT);\n}\n\nfunction profileLabel(agent: string): string {\n\treturn AGENT_PROFILE_LABELS[agent as SubagentAgentName] ?? agent;\n}\n\nfunction formatDuration(seconds: number): string {\n\tconst roundedSeconds = Math.round(seconds);\n\tif (roundedSeconds >= 60) return `${Math.floor(roundedSeconds / 60)}m ${roundedSeconds % 60}s`;\n\treturn `${seconds.toFixed(seconds < 10 ? 1 : 0)}s`;\n}\n\nfunction elapsed(startedAt: number | undefined, endedAt?: number): string | undefined {\n\tif (startedAt === undefined) return undefined;\n\treturn formatDuration(Math.max(0, ((endedAt ?? Date.now()) - startedAt) / 1_000));\n}\n\nfunction statusColor(status: SubagentRunStatus): \"success\" | \"error\" | \"warning\" | \"accent\" | \"muted\" {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\t\treturn \"success\";\n\t\tcase \"failed\":\n\t\t\treturn \"error\";\n\t\tcase \"aborted\":\n\t\t\treturn \"warning\";\n\t\tcase \"running\":\n\t\t\treturn \"accent\";\n\t\tdefault:\n\t\t\treturn \"muted\";\n\t}\n}\n\nfunction statusMarker(status: SubagentRunStatus, theme: Theme): string {\n\tconst glyph =\n\t\tstatus === \"completed\"\n\t\t\t? \"✓\"\n\t\t\t: status === \"failed\"\n\t\t\t\t? \"×\"\n\t\t\t\t: status === \"aborted\"\n\t\t\t\t\t? \"■\"\n\t\t\t\t\t: status === \"running\"\n\t\t\t\t\t\t? \"›\"\n\t\t\t\t\t\t: \"○\";\n\treturn theme.fg(statusColor(status), glyph);\n}\n\nfunction statusWord(status: SubagentRunStatus): string {\n\tif (status === \"completed\") return \"Completed\";\n\tif (status === \"failed\") return \"Failed\";\n\tif (status === \"aborted\") return \"Aborted\";\n\tif (status === \"running\") return \"Running\";\n\treturn \"Queued\";\n}\n\nfunction retryText(run: SubagentRunDetails): string | undefined {\n\tconst retry = getSubagentRetryView(run);\n\tif (!retry) return undefined;\n\tconst state =\n\t\tretry.remainingSeconds > 0\n\t\t\t? `Retrying (${retry.attempt}/${retry.maxAttempts}) in ${retry.remainingSeconds}s`\n\t\t\t: `Retrying now… (${retry.attempt}/${retry.maxAttempts})`;\n\tconst error = truncate(plainLine(retry.error), RETRY_ERROR_LIMIT);\n\treturn error ? `${state} — ${error}` : state;\n}\n\nfunction runningDetail(run: SubagentRunDetails): string | undefined {\n\tconst retry = retryText(run);\n\tif (retry) return retry;\n\tif (run.currentActivity) return truncate(plainLine(run.currentActivity), ACTIVITY_SUMMARY_LIMIT);\n\tif (run.status === \"queued\") return \"Waiting for a worker slot\";\n\tif (run.status === \"running\" && run.usage.turns === 0 && run.usage.toolUses === 0) return \"Initializing…\";\n\tif (run.status === \"running\") return \"Thinking…\";\n\tif ((run.status === \"failed\" || run.status === \"aborted\") && run.error) {\n\t\treturn truncate(plainLine(run.error), ACTIVITY_RESULT_LIMIT);\n\t}\n\treturn undefined;\n}\n\nfunction batchMarker(details: SubagentDetails, theme: Theme): string {\n\tif (details.runs.some((run) => run.status === \"failed\")) return theme.fg(\"error\", \"×\");\n\tif (details.runs.some((run) => run.status === \"aborted\")) return theme.fg(\"warning\", \"■\");\n\treturn theme.fg(\"success\", \"✓\");\n}\n\nfunction progressHeader(details: SubagentDetails, theme: Theme): string {\n\tconst settled = details.runs.filter((run) => run.status !== \"running\" && run.status !== \"queued\").length;\n\treturn theme.fg(\"accent\", `› ${settled}/${details.runs.length} done · ${elapsed(details.startedAt) ?? \"0.0s\"}`);\n}\n\nfunction taskRow(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme, live: boolean): string {\n\tlet line = ` ${statusMarker(run.status, theme)} ${theme.fg(\"accent\", profileLabel(run.agent))}${theme.fg(\"dim\", ` · ${taskSummary(args, index, run)}`)}`;\n\tconst detail = live ? runningDetail(run) : undefined;\n\tif (detail) {\n\t\tline += theme.fg(\"dim\", ` — ${detail}`);\n\t} else if (run.status !== \"running\" && run.status !== \"queued\") {\n\t\tconst duration = elapsed(run.startedAt, run.endedAt);\n\t\tif (duration) line += theme.fg(\"dim\", ` · ${duration}`);\n\t}\n\treturn line;\n}\n\nfunction outcomeSummary(details: SubagentDetails): string {\n\tconst completed = details.runs.filter((run) => run.status === \"completed\").length;\n\tconst failed = details.runs.filter((run) => run.status === \"failed\").length;\n\tconst aborted = details.runs.filter((run) => run.status === \"aborted\").length;\n\tconst parts: string[] = [];\n\tif (completed) parts.push(`${completed} completed`);\n\tif (failed) parts.push(`${failed} failed`);\n\tif (aborted) parts.push(`${aborted} aborted`);\n\tif (parts.length === 0) parts.push(statusSummary(details));\n\tconst duration = elapsed(details.startedAt, details.endedAt);\n\tif (duration) parts.push(duration);\n\tif (details.usage.cost) parts.push(`$${details.usage.cost.toFixed(3)}`);\n\treturn parts.join(\" · \");\n}\n\nfunction runMetrics(run: SubagentRunDetails): string {\n\tconst items = [run.model];\n\tif (run.thinking !== \"off\") items.push(`${run.thinking} thinking`);\n\tif (run.cwd) items.push(`cwd: ${run.cwd}`);\n\tconst settled = run.status !== \"running\" && run.status !== \"queued\";\n\tif (settled && run.usage.totalTokens) items.push(`${formatTokens(run.usage.totalTokens)} tok`);\n\tif (run.usage.toolUses) items.push(`${run.usage.toolUses} tool use${run.usage.toolUses === 1 ? \"\" : \"s\"}`);\n\tif (run.usage.turns) items.push(`${run.usage.turns} turn${run.usage.turns === 1 ? \"\" : \"s\"}`);\n\tif (run.usage.contextTokens) items.push(`ctx: ${formatTokens(run.usage.contextTokens)}`);\n\tif (run.usage.cost) items.push(`$${run.usage.cost.toFixed(3)}`);\n\tconst duration = elapsed(run.startedAt, run.endedAt);\n\tif (duration) items.push(duration);\n\treturn items.join(\" · \");\n}\n\nfunction activityLine(activity: ToolActivity, run: SubagentRunDetails, theme: Theme): string {\n\tconst summary =\n\t\tactivity.status === \"running\" && run.currentActivity\n\t\t\t? truncate(plainLine(run.currentActivity), ACTIVITY_SUMMARY_LIMIT)\n\t\t\t: truncate(plainLine(activity.summary), ACTIVITY_SUMMARY_LIMIT);\n\tlet line =\n\t\tactivity.status === \"failed\"\n\t\t\t? `${theme.fg(\"error\", \"×\")} ${theme.fg(\"toolOutput\", summary)}`\n\t\t\t: activity.status === \"running\"\n\t\t\t\t? `${theme.fg(\"accent\", \"›\")} ${theme.fg(\"toolOutput\", summary)}`\n\t\t\t\t: ` ${theme.fg(\"toolOutput\", summary)}`;\n\tif (activity.status === \"failed\" && activity.resultSummary) {\n\t\tline += theme.fg(\"error\", ` · ${truncate(plainLine(activity.resultSummary), ACTIVITY_RESULT_LIMIT)}`);\n\t}\n\tif (activity.endedAt !== undefined && activity.endedAt - activity.startedAt >= ACTIVITY_DURATION_MIN_MS) {\n\t\tline += theme.fg(\"dim\", ` · ${formatDuration((activity.endedAt - activity.startedAt) / 1_000)}`);\n\t}\n\treturn line;\n}\n\nfunction runHeader(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): string {\n\treturn `${theme.fg(\"dim\", `── #${index + 1} `)}${statusMarker(run.status, theme)} ${theme.fg(\"accent\", profileLabel(run.agent))}${theme.fg(\"dim\", ` · ${taskSummary(args, index, run)}`)}`;\n}\n\nfunction renderRunningRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new Text(runHeader(run, index, args, theme), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"dim\", runMetrics(run)), 0, 0));\n\tconst retry = retryText(run);\n\tif (retry) container.addChild(new Text(theme.fg(\"accent\", retry), 0, 0));\n\tcontainer.addChild(new Spacer(1));\n\tconst total = Math.max(run.usage.toolUses, run.activities.length);\n\tconst label = total > run.activities.length ? `Activity · last ${run.activities.length} of ${total}` : \"Activity\";\n\tcontainer.addChild(new Text(theme.fg(\"muted\", label), 0, 0));\n\tif (run.activities.length > 0) {\n\t\tfor (const activity of run.activities) container.addChild(new Text(activityLine(activity, run, theme), 0, 0));\n\t} else {\n\t\tconst fallback = retry\n\t\t\t? \"Waiting to retry\"\n\t\t\t: run.status === \"failed\" || run.status === \"aborted\"\n\t\t\t\t? \"No activity recorded\"\n\t\t\t\t: (runningDetail(run) ?? statusWord(run.status));\n\t\tcontainer.addChild(new Text(theme.fg(\"dim\", ` ${fallback}`), 0, 0));\n\t}\n\tif (run.error) {\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Error\"), 0, 0));\n\t\tcontainer.addChild(new Text(theme.fg(\"error\", run.error), 0, 0));\n\t}\n\treturn container;\n}\n\nfunction renderSettledRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new Text(runHeader(run, index, args, theme), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"dim\", runMetrics(run)), 0, 0));\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Prompt\"), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"toolOutput\", taskPrompt(args, index, run)), 0, 0));\n\tif (run.error) {\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Error\"), 0, 0));\n\t\tcontainer.addChild(new Text(theme.fg(\"error\", run.error), 0, 0));\n\t}\n\tcontainer.addChild(new Spacer(1));\n\tconst reportLabel = run.status !== \"completed\" && run.report ? \"Report · partial\" : \"Report\";\n\tcontainer.addChild(new Text(theme.fg(\"muted\", reportLabel), 0, 0));\n\tif (run.report) {\n\t\tcontainer.addChild(\n\t\t\tnew Markdown(run.report, 0, 0, getMarkdownTheme(), {\n\t\t\t\tcolor: (text) => theme.fg(\"toolOutput\", text),\n\t\t\t}),\n\t\t);\n\t} else {\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"(No report.)\"), 0, 0));\n\t}\n\treturn container;\n}\n\nfunction fallbackResult(result: AgentToolResult<SubagentDetails>, theme: Theme, isError: boolean): Component {\n\tconst text = result.content.find((part) => part.type === \"text\");\n\tconst value = text?.type === \"text\" ? truncate(text.text, FALLBACK_OUTPUT_LIMIT) : \"(no output)\";\n\treturn new Text(theme.fg(isError ? \"error\" : \"muted\", value), 0, 0);\n}\n\n/** Per-result live-refresh state owned by the shell's render context. */\nexport interface SubagentRenderState {\n\trefreshTimer?: ReturnType<typeof setTimeout>;\n}\n\n// Re-render elapsed time and retry countdowns once per second while the\n// result is still partial; the first settled render clears the timer.\nexport function scheduleLiveRefresh(context: ToolRenderContext<SubagentRenderState>, isPartial: boolean): void {\n\tconst state = context.state;\n\tif (isPartial) {\n\t\tif (state.refreshTimer === undefined) {\n\t\t\tstate.refreshTimer = setTimeout(() => {\n\t\t\t\tstate.refreshTimer = undefined;\n\t\t\t\tcontext.invalidate();\n\t\t\t}, 1000);\n\t\t\tstate.refreshTimer.unref?.();\n\t\t}\n\t\treturn;\n\t}\n\tif (state.refreshTimer !== undefined) {\n\t\tclearTimeout(state.refreshTimer);\n\t\tstate.refreshTimer = undefined;\n\t}\n}\n\nexport function renderSubagentCall(args: SubagentParams, theme: Theme): Component {\n\tconst count = Array.isArray(args.tasks) ? args.tasks.length : 0;\n\tconst label = `${count} task${count === 1 ? \"\" : \"s\"}`;\n\treturn new Text(\n\t\t`${theme.fg(\"toolTitle\", theme.bold(\"Subagent\"))}${theme.fg(count > 0 ? \"dim\" : \"error\", ` · ${label}`)}`,\n\t\t0,\n\t\t0,\n\t);\n}\n\nexport function renderSubagentResult(\n\tresult: AgentToolResult<SubagentDetails>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\targs: SubagentParams,\n\tisError: boolean,\n): Component {\n\tconst details = result.details;\n\tif (!details || !Array.isArray(details.runs)) return fallbackResult(result, theme, isError);\n\tif (details.runs.length === 0) return new Text(theme.fg(\"muted\", \"Initializing…\"), 0, 0);\n\n\tif (!options.expanded) {\n\t\tconst container = new Container();\n\t\tconst header = options.isPartial\n\t\t\t? progressHeader(details, theme)\n\t\t\t: `${batchMarker(details, theme)} ${theme.fg(isError ? \"error\" : \"muted\", outcomeSummary(details))}`;\n\t\tcontainer.addChild(new Text(header, 0, 0));\n\t\tfor (const [index, run] of details.runs.entries()) {\n\t\t\tcontainer.addChild(new Text(taskRow(run, index, args, theme, options.isPartial), 0, 0));\n\t\t}\n\t\treturn container;\n\t}\n\n\tconst container = new Container();\n\tconst header = options.isPartial\n\t\t? progressHeader(details, theme)\n\t\t: `${batchMarker(details, theme)} ${theme.fg(isError ? \"error\" : \"toolTitle\", outcomeSummary(details))}`;\n\tcontainer.addChild(new Text(header, 0, 0));\n\tfor (const [index, run] of details.runs.entries()) {\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(\n\t\t\toptions.isPartial ? renderRunningRun(run, index, args, theme) : renderSettledRun(run, index, args, theme),\n\t\t);\n\t}\n\treturn container;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,eAAe,CAAC;IACvB,mEAAmE;IACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAiGD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,eAAe,CAAC;IACvB,mEAAmE;IACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAiGD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsOzE"}
|
|
@@ -200,6 +200,25 @@ export async function runSdkTask(options) {
|
|
|
200
200
|
emitImmediate();
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
|
+
if (event.type === "compaction_start") {
|
|
204
|
+
dispatch({ type: "compaction_started", startedAt: Date.now() });
|
|
205
|
+
emitImmediate();
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (event.type === "compaction_end") {
|
|
209
|
+
// A worker has no status line of its own, so the compaction's outcome —
|
|
210
|
+
// especially the reason a failed one blocks the next request — only
|
|
211
|
+
// reaches the caller through the activity log.
|
|
212
|
+
dispatch({
|
|
213
|
+
type: "compaction_ended",
|
|
214
|
+
tokensBefore: event.result?.tokensBefore,
|
|
215
|
+
tokensAfter: event.result?.estimatedTokensAfter,
|
|
216
|
+
error: event.errorMessage,
|
|
217
|
+
endedAt: Date.now(),
|
|
218
|
+
});
|
|
219
|
+
emitImmediate();
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
203
222
|
if (event.type === "message_end" && event.message.role === "assistant") {
|
|
204
223
|
if (!seenAssistantMessages.has(event.message)) {
|
|
205
224
|
seenAssistantMessages.add(event.message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { finalAssistantText } from \"./activity.ts\";\nimport type { RunCancellation } from \"./cancellation.ts\";\nimport type { SubagentRunEvent } from \"./state.ts\";\nimport type { ResolvedSubagentTask } from \"./types.ts\";\n\nexport interface SdkRunnerOptions {\n\ttask: ResolvedSubagentTask;\n\t/** Cancellation scope covering this attempt (queued through session end). */\n\tscope: RunCancellation;\n\t/** Reducer input; the adapter never touches run state directly. */\n\tdispatch: (event: SubagentRunEvent) => void;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tonProgress?: () => void;\n}\n\nfunction workerSystemPrompt(base: string | undefined, task: ResolvedSubagentTask): string {\n\treturn [\n\t\tbase,\n\t\t`You are Pi subagent \"${task.agent.name}\", working independently on one delegated task.`,\n\t\t\"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.\",\n\t\t\"Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.\",\n\t\t\"Complete the task fully—do not gold-plate it, but do not leave it half-done.\",\n\t\t\"Stay inside the assigned working directory and delegated scope.\",\n\t\t\"Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.\",\n\t\t\"Do not spawn subagents or invoke tools outside the configured tool list.\",\n\t\t\"When referencing files in the final report, use paths relative to the task's working directory so the caller can locate them unambiguously.\",\n\t\t\"Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.\",\n\t\t\"End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.\",\n\t\ttask.agent.systemPrompt,\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction lastAssistantMessage(session: { messages: readonly AgentMessage[] }) {\n\tfor (let index = session.messages.length - 1; index >= 0; index--) {\n\t\tconst message = session.messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n\nfunction assistantError(message: ReturnType<typeof lastAssistantMessage>): string | undefined {\n\tif (!message || message.role !== \"assistant\") return undefined;\n\treturn message.errorMessage;\n}\n\ninterface ThrottledEmitter {\n\temit: () => void;\n\t/** Drops any pending timer so nothing fires after the run has settled. */\n\tcancel: () => void;\n}\n\nfunction createThrottledEmitter(onProgress: (() => void) | undefined): ThrottledEmitter {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\treturn {\n\t\temit: () => {\n\t\t\tif (!onProgress || timer) return;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tonProgress();\n\t\t\t}, 80);\n\t\t},\n\t\tcancel: () => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t},\n\t};\n}\n\ntype InitializationOutcome =\n\t| { kind: \"created\"; session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] }\n\t| { kind: \"aborted\" }\n\t| { kind: \"error\"; error: unknown };\n\n// Neither resource loading nor session creation takes an abort signal, and\n// both can hang on network work; race both against the scope. The losing\n// chain keeps running, so its eventual result or rejection is always\n// consumed by a no-op handler.\nasync function raceInitialization(\n\tchain: Promise<InitializationOutcome>,\n\tscope: RunCancellation,\n): Promise<InitializationOutcome> {\n\treturn new Promise<InitializationOutcome>((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = (outcome: InitializationOutcome): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tscope.signal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(outcome);\n\t\t};\n\t\tconst onAbort = (): void => {\n\t\t\tfinish({ kind: \"aborted\" });\n\t\t};\n\t\tif (scope.signal.aborted) {\n\t\t\tonAbort();\n\t\t\tvoid chain.then(\n\t\t\t\t() => undefined,\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tscope.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid chain.then(\n\t\t\t(outcome) => finish(outcome),\n\t\t\t(error) => finish({ kind: \"error\", error }),\n\t\t);\n\t});\n}\n\n/**\n * Runs one worker attempt as a pure adapter: it owns the worker session's\n * lifecycle and translates AgentSessionEvents into SubagentRunEvents; every\n * state transition happens in the reducer on the other side of dispatch.\n */\nexport async function runSdkTask(options: SdkRunnerOptions): Promise<void> {\n\tconst { task, scope, dispatch, modelRuntime, agentDir, projectTrusted, onProgress } = options;\n\tconst throttled = createThrottledEmitter(onProgress);\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unregisterAbort: (() => void) | undefined;\n\tlet session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] | undefined;\n\t// Streaming updates carry no semantic weight; the settled messages are\n\t// where usage is accounted, and worker sessions can replay them.\n\tconst seenAssistantMessages = new Set<unknown>();\n\tconst emitImmediate = (): void => onProgress?.();\n\tconst emitThrottled = throttled.emit;\n\n\tunregisterAbort = scope.onAbort(async () => {\n\t\tif (session) await session.abort();\n\t});\n\n\ttry {\n\t\tif (scope.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted before it started.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoSkills: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t\t// Read-only explorers skip AGENTS.md/CLAUDE.md: they don't need\n\t\t\t// commit/PR/style rules, and the parent interprets their results.\n\t\t\tnoContextFiles: task.agent.omitContextFiles ?? false,\n\t\t\tsystemPromptOverride: (base) => workerSystemPrompt(base, task),\n\t\t});\n\t\tconst initialization = (async (): Promise<InitializationOutcome> => {\n\t\t\tawait resourceLoader.reload();\n\t\t\tif (scope.signal.aborted) return { kind: \"aborted\" };\n\t\t\tconst created = await createAgentSession({\n\t\t\t\tcwd: task.cwd,\n\t\t\t\tagentDir,\n\t\t\t\tmodelRuntime,\n\t\t\t\tmodel: task.model,\n\t\t\t\tthinkingLevel: task.thinking,\n\t\t\t\ttools: task.agent.tools,\n\t\t\t\tresourceLoader,\n\t\t\t\tsessionManager: SessionManager.inMemory(task.cwd),\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\t\treturn { kind: \"created\", session: created.session };\n\t\t})();\n\t\tconst outcome = await raceInitialization(initialization, scope);\n\t\tif (outcome.kind === \"error\") throw outcome.error;\n\t\tif (outcome.kind === \"aborted\") {\n\t\t\t// The initialization chain cannot be cancelled. Dispose the\n\t\t\t// session if it eventually resolves, and swallow a late rejection\n\t\t\t// after this run has already settled.\n\t\t\tvoid initialization.then(\n\t\t\t\t(late) => {\n\t\t\t\t\tif (late.kind === \"created\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlate.session.dispose();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// The aborted run has no remaining channel for cleanup errors.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {},\n\t\t\t);\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsession = outcome.session;\n\t\tif (scope.aborted) {\n\t\t\tawait session.abort();\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tif (event.type === \"auto_retry_start\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"auto_retry_start\",\n\t\t\t\t\tattempt: event.attempt,\n\t\t\t\t\tmaxAttempts: event.maxAttempts,\n\t\t\t\t\tdeadline: Date.now() + event.delayMs,\n\t\t\t\t\terror: event.errorMessage,\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"auto_retry_end\") {\n\t\t\t\tdispatch({ type: \"auto_retry_end\" });\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"turn_end\") {\n\t\t\t\tdispatch({ type: \"turn_end\" });\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\tif (!seenAssistantMessages.has(event.message)) {\n\t\t\t\t\tseenAssistantMessages.add(event.message);\n\t\t\t\t\tdispatch({ type: \"assistant_message_settled\", usage: event.message.usage });\n\t\t\t\t} else {\n\t\t\t\t\tdispatch({ type: \"assistant_message_settled\", usage: undefined });\n\t\t\t\t}\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_started\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\targs: event.args,\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_update\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_updated\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\targs: event.args,\n\t\t\t\t});\n\t\t\t\temitThrottled();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_ended\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tresult: event.result,\n\t\t\t\t\tisError: event.isError,\n\t\t\t\t\tendedAt: Date.now(),\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t}\n\t\t});\n\t\tawait session.prompt(task.prompt);\n\t\tconst finalMessage = lastAssistantMessage(session);\n\t\tconst report = finalAssistantText(session.messages);\n\t\tconst error = assistantError(finalMessage);\n\t\tif (scope.signal.aborted || finalMessage?.stopReason === \"aborted\") {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else if (finalMessage?.stopReason === \"error\" || error) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent failed.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({ type: \"settle\", verdict: \"completed\", report, error: undefined, endedAt: Date.now() });\n\t\t}\n\t} catch (error) {\n\t\tconst report = session ? finalAssistantText(session.messages) : \"\";\n\t\tif (scope.signal.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t}\n\t} finally {\n\t\tthrottled.cancel();\n\t\tunregisterAbort?.();\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\temitImmediate();\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { finalAssistantText } from \"./activity.ts\";\nimport type { RunCancellation } from \"./cancellation.ts\";\nimport type { SubagentRunEvent } from \"./state.ts\";\nimport type { ResolvedSubagentTask } from \"./types.ts\";\n\nexport interface SdkRunnerOptions {\n\ttask: ResolvedSubagentTask;\n\t/** Cancellation scope covering this attempt (queued through session end). */\n\tscope: RunCancellation;\n\t/** Reducer input; the adapter never touches run state directly. */\n\tdispatch: (event: SubagentRunEvent) => void;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tonProgress?: () => void;\n}\n\nfunction workerSystemPrompt(base: string | undefined, task: ResolvedSubagentTask): string {\n\treturn [\n\t\tbase,\n\t\t`You are Pi subagent \"${task.agent.name}\", working independently on one delegated task.`,\n\t\t\"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.\",\n\t\t\"Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.\",\n\t\t\"Complete the task fully—do not gold-plate it, but do not leave it half-done.\",\n\t\t\"Stay inside the assigned working directory and delegated scope.\",\n\t\t\"Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.\",\n\t\t\"Do not spawn subagents or invoke tools outside the configured tool list.\",\n\t\t\"When referencing files in the final report, use paths relative to the task's working directory so the caller can locate them unambiguously.\",\n\t\t\"Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.\",\n\t\t\"End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.\",\n\t\ttask.agent.systemPrompt,\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction lastAssistantMessage(session: { messages: readonly AgentMessage[] }) {\n\tfor (let index = session.messages.length - 1; index >= 0; index--) {\n\t\tconst message = session.messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n\nfunction assistantError(message: ReturnType<typeof lastAssistantMessage>): string | undefined {\n\tif (!message || message.role !== \"assistant\") return undefined;\n\treturn message.errorMessage;\n}\n\ninterface ThrottledEmitter {\n\temit: () => void;\n\t/** Drops any pending timer so nothing fires after the run has settled. */\n\tcancel: () => void;\n}\n\nfunction createThrottledEmitter(onProgress: (() => void) | undefined): ThrottledEmitter {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\treturn {\n\t\temit: () => {\n\t\t\tif (!onProgress || timer) return;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tonProgress();\n\t\t\t}, 80);\n\t\t},\n\t\tcancel: () => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t},\n\t};\n}\n\ntype InitializationOutcome =\n\t| { kind: \"created\"; session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] }\n\t| { kind: \"aborted\" }\n\t| { kind: \"error\"; error: unknown };\n\n// Neither resource loading nor session creation takes an abort signal, and\n// both can hang on network work; race both against the scope. The losing\n// chain keeps running, so its eventual result or rejection is always\n// consumed by a no-op handler.\nasync function raceInitialization(\n\tchain: Promise<InitializationOutcome>,\n\tscope: RunCancellation,\n): Promise<InitializationOutcome> {\n\treturn new Promise<InitializationOutcome>((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = (outcome: InitializationOutcome): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tscope.signal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(outcome);\n\t\t};\n\t\tconst onAbort = (): void => {\n\t\t\tfinish({ kind: \"aborted\" });\n\t\t};\n\t\tif (scope.signal.aborted) {\n\t\t\tonAbort();\n\t\t\tvoid chain.then(\n\t\t\t\t() => undefined,\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tscope.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid chain.then(\n\t\t\t(outcome) => finish(outcome),\n\t\t\t(error) => finish({ kind: \"error\", error }),\n\t\t);\n\t});\n}\n\n/**\n * Runs one worker attempt as a pure adapter: it owns the worker session's\n * lifecycle and translates AgentSessionEvents into SubagentRunEvents; every\n * state transition happens in the reducer on the other side of dispatch.\n */\nexport async function runSdkTask(options: SdkRunnerOptions): Promise<void> {\n\tconst { task, scope, dispatch, modelRuntime, agentDir, projectTrusted, onProgress } = options;\n\tconst throttled = createThrottledEmitter(onProgress);\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unregisterAbort: (() => void) | undefined;\n\tlet session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] | undefined;\n\t// Streaming updates carry no semantic weight; the settled messages are\n\t// where usage is accounted, and worker sessions can replay them.\n\tconst seenAssistantMessages = new Set<unknown>();\n\tconst emitImmediate = (): void => onProgress?.();\n\tconst emitThrottled = throttled.emit;\n\n\tunregisterAbort = scope.onAbort(async () => {\n\t\tif (session) await session.abort();\n\t});\n\n\ttry {\n\t\tif (scope.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted before it started.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoSkills: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t\t// Read-only explorers skip AGENTS.md/CLAUDE.md: they don't need\n\t\t\t// commit/PR/style rules, and the parent interprets their results.\n\t\t\tnoContextFiles: task.agent.omitContextFiles ?? false,\n\t\t\tsystemPromptOverride: (base) => workerSystemPrompt(base, task),\n\t\t});\n\t\tconst initialization = (async (): Promise<InitializationOutcome> => {\n\t\t\tawait resourceLoader.reload();\n\t\t\tif (scope.signal.aborted) return { kind: \"aborted\" };\n\t\t\tconst created = await createAgentSession({\n\t\t\t\tcwd: task.cwd,\n\t\t\t\tagentDir,\n\t\t\t\tmodelRuntime,\n\t\t\t\tmodel: task.model,\n\t\t\t\tthinkingLevel: task.thinking,\n\t\t\t\ttools: task.agent.tools,\n\t\t\t\tresourceLoader,\n\t\t\t\tsessionManager: SessionManager.inMemory(task.cwd),\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\t\treturn { kind: \"created\", session: created.session };\n\t\t})();\n\t\tconst outcome = await raceInitialization(initialization, scope);\n\t\tif (outcome.kind === \"error\") throw outcome.error;\n\t\tif (outcome.kind === \"aborted\") {\n\t\t\t// The initialization chain cannot be cancelled. Dispose the\n\t\t\t// session if it eventually resolves, and swallow a late rejection\n\t\t\t// after this run has already settled.\n\t\t\tvoid initialization.then(\n\t\t\t\t(late) => {\n\t\t\t\t\tif (late.kind === \"created\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlate.session.dispose();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// The aborted run has no remaining channel for cleanup errors.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {},\n\t\t\t);\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsession = outcome.session;\n\t\tif (scope.aborted) {\n\t\t\tawait session.abort();\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tif (event.type === \"auto_retry_start\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"auto_retry_start\",\n\t\t\t\t\tattempt: event.attempt,\n\t\t\t\t\tmaxAttempts: event.maxAttempts,\n\t\t\t\t\tdeadline: Date.now() + event.delayMs,\n\t\t\t\t\terror: event.errorMessage,\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"auto_retry_end\") {\n\t\t\t\tdispatch({ type: \"auto_retry_end\" });\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"turn_end\") {\n\t\t\t\tdispatch({ type: \"turn_end\" });\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"compaction_start\") {\n\t\t\t\tdispatch({ type: \"compaction_started\", startedAt: Date.now() });\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"compaction_end\") {\n\t\t\t\t// A worker has no status line of its own, so the compaction's outcome —\n\t\t\t\t// especially the reason a failed one blocks the next request — only\n\t\t\t\t// reaches the caller through the activity log.\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"compaction_ended\",\n\t\t\t\t\ttokensBefore: event.result?.tokensBefore,\n\t\t\t\t\ttokensAfter: event.result?.estimatedTokensAfter,\n\t\t\t\t\terror: event.errorMessage,\n\t\t\t\t\tendedAt: Date.now(),\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\tif (!seenAssistantMessages.has(event.message)) {\n\t\t\t\t\tseenAssistantMessages.add(event.message);\n\t\t\t\t\tdispatch({ type: \"assistant_message_settled\", usage: event.message.usage });\n\t\t\t\t} else {\n\t\t\t\t\tdispatch({ type: \"assistant_message_settled\", usage: undefined });\n\t\t\t\t}\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_started\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\targs: event.args,\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_update\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_updated\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\targs: event.args,\n\t\t\t\t});\n\t\t\t\temitThrottled();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"tool_ended\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tresult: event.result,\n\t\t\t\t\tisError: event.isError,\n\t\t\t\t\tendedAt: Date.now(),\n\t\t\t\t});\n\t\t\t\temitImmediate();\n\t\t\t}\n\t\t});\n\t\tawait session.prompt(task.prompt);\n\t\tconst finalMessage = lastAssistantMessage(session);\n\t\tconst report = finalAssistantText(session.messages);\n\t\tconst error = assistantError(finalMessage);\n\t\tif (scope.signal.aborted || finalMessage?.stopReason === \"aborted\") {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else if (finalMessage?.stopReason === \"error\" || error) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent failed.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({ type: \"settle\", verdict: \"completed\", report, error: undefined, endedAt: Date.now() });\n\t\t}\n\t} catch (error) {\n\t\tconst report = session ? finalAssistantText(session.messages) : \"\";\n\t\tif (scope.signal.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t}\n\t} finally {\n\t\tthrottled.cancel();\n\t\tunregisterAbort?.();\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\temitImmediate();\n\t}\n}\n"]}
|
|
@@ -51,6 +51,15 @@ export type SubagentRunEvent = {
|
|
|
51
51
|
result: unknown;
|
|
52
52
|
isError: boolean;
|
|
53
53
|
endedAt: number;
|
|
54
|
+
} | {
|
|
55
|
+
type: "compaction_started";
|
|
56
|
+
startedAt: number;
|
|
57
|
+
} | {
|
|
58
|
+
type: "compaction_ended";
|
|
59
|
+
tokensBefore: number | undefined;
|
|
60
|
+
tokensAfter: number | undefined;
|
|
61
|
+
error: string | undefined;
|
|
62
|
+
endedAt: number;
|
|
54
63
|
} | {
|
|
55
64
|
type: "settle";
|
|
56
65
|
verdict: "completed" | "failed" | "aborted";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { relative } from "node:path";
|
|
2
|
-
import { activitySummary, addUsage, emptyUsage, resultSummary } from "./activity.js";
|
|
3
|
-
import { ACTIVITY_LIMIT, ACTIVITY_TEXT_LIMIT, ERROR_TEXT_LIMIT, RETRY_ERROR_TEXT_LIMIT, TASK_OUTPUT_LIMIT, } from "./constants.js";
|
|
2
|
+
import { activitySummary, addUsage, compactionError, compactionSummary, emptyUsage, resultSummary, } from "./activity.js";
|
|
3
|
+
import { ACTIVITY_LIMIT, ACTIVITY_TEXT_LIMIT, COMPACTION_ACTIVITY_ID, ERROR_TEXT_LIMIT, RETRY_ERROR_TEXT_LIMIT, TASK_OUTPUT_LIMIT, } from "./constants.js";
|
|
4
4
|
import { modelId } from "./model-selection.js";
|
|
5
5
|
import { boundText } from "./text.js";
|
|
6
6
|
function runId(batchId, index) {
|
|
@@ -200,6 +200,37 @@ export function reduceRun(state, event) {
|
|
|
200
200
|
}
|
|
201
201
|
draft.currentActivity = deriveCurrentActivity(draft);
|
|
202
202
|
});
|
|
203
|
+
case "compaction_started":
|
|
204
|
+
// Auto-compaction is a synthetic activity: it has a start, an end and a
|
|
205
|
+
// failure mode just like a tool call, so it reuses the activity log and its
|
|
206
|
+
// budgets. It is not a tool call, so it never counts toward toolUses.
|
|
207
|
+
return withRevision(state, (draft) => {
|
|
208
|
+
clearRetry(draft);
|
|
209
|
+
appendActivity(draft.activities, {
|
|
210
|
+
id: COMPACTION_ACTIVITY_ID,
|
|
211
|
+
toolName: COMPACTION_ACTIVITY_ID,
|
|
212
|
+
summary: "Compacting context…",
|
|
213
|
+
status: "running",
|
|
214
|
+
startedAt: event.startedAt,
|
|
215
|
+
});
|
|
216
|
+
draft.currentActivity = deriveCurrentActivity(draft);
|
|
217
|
+
});
|
|
218
|
+
case "compaction_ended":
|
|
219
|
+
return withRevision(state, (draft) => {
|
|
220
|
+
clearRetry(draft);
|
|
221
|
+
// Only one compaction runs at a time, so the newest running entry with
|
|
222
|
+
// this id is always the one that just ended.
|
|
223
|
+
const activity = [...draft.activities]
|
|
224
|
+
.reverse()
|
|
225
|
+
.find((candidate) => candidate.id === COMPACTION_ACTIVITY_ID && candidate.status === "running");
|
|
226
|
+
if (activity) {
|
|
227
|
+
activity.status = event.error ? "failed" : "succeeded";
|
|
228
|
+
activity.endedAt = event.endedAt;
|
|
229
|
+
activity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);
|
|
230
|
+
activity.resultSummary = event.error ? compactionError(event.error) : undefined;
|
|
231
|
+
}
|
|
232
|
+
draft.currentActivity = deriveCurrentActivity(draft);
|
|
233
|
+
});
|
|
203
234
|
case "settle":
|
|
204
235
|
return withRevision(state, (draft) => {
|
|
205
236
|
draft.status = event.verdict;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport { activitySummary, addUsage, emptyUsage, resultSummary } from \"./activity.ts\";\nimport {\n\tACTIVITY_LIMIT,\n\tACTIVITY_TEXT_LIMIT,\n\tERROR_TEXT_LIMIT,\n\tRETRY_ERROR_TEXT_LIMIT,\n\tTASK_OUTPUT_LIMIT,\n} from \"./constants.ts\";\nimport { modelId } from \"./model-selection.ts\";\nimport { boundText } from \"./text.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\n/**\n * Mutable-run state plus an internal revision counter. All transitions go\n * through {@link reduceRun}; the batch runner compares version sums instead\n * of diffing rendered fields.\n */\nexport interface SubagentRunState extends SubagentRunDetails {\n\t/** Monotonic per-run revision; bumped by every applied event. */\n\tversion: number;\n}\n\n/** The adapter layer's only output and the reducer's only input. */\nexport type SubagentRunEvent =\n\t| { type: \"slot_acquired\"; startedAt: number }\n\t| {\n\t\t\ttype: \"retry_scheduled\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdeadline: number;\n\t\t\terror: string | undefined;\n\t }\n\t| { type: \"retry_started\" }\n\t| { type: \"auto_retry_start\"; attempt: number; maxAttempts: number; deadline: number; error: string }\n\t| { type: \"auto_retry_end\" }\n\t| { type: \"turn_end\" }\n\t| { type: \"assistant_message_settled\"; usage: Usage | undefined }\n\t| { type: \"tool_started\"; toolCallId: string; toolName: string; args: unknown; startedAt: number }\n\t| { type: \"tool_updated\"; toolCallId: string; toolName: string; args: unknown }\n\t| { type: \"tool_ended\"; toolCallId: string; result: unknown; isError: boolean; endedAt: number }\n\t| {\n\t\t\ttype: \"settle\";\n\t\t\tverdict: \"completed\" | \"failed\" | \"aborted\";\n\t\t\treport: string;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| { type: \"abort_while_queued\"; endedAt: number }\n\t| { type: \"abort_while_retrying\"; endedAt: number };\n\nfunction runId(batchId: string | undefined, index: number): string {\n\tif (!batchId) return `subagent-${index + 1}`;\n\t// toolCallIds are provider-shaped (\"call_ABC...\"); keep the readable\n\t// prefix, then disambiguate truncated collisions with a deterministic\n\t// hash of the full id.\n\tconst sanitized = batchId.replace(/[^A-Za-z0-9-]+/gu, \"-\").replace(/^-+|-+$/gu, \"\");\n\tconst hash = hashRunId(batchId);\n\tconst prefix = sanitized.length > 24 ? `${sanitized.slice(0, 24)}-${hash}` : sanitized || `run-${hash}`;\n\treturn `${prefix}-${index + 1}`;\n}\n\nfunction hashRunId(value: string): string {\n\tlet hash = 0x811c9dc5;\n\tfor (let index = 0; index < value.length; index++) {\n\t\thash ^= value.charCodeAt(index);\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36).padStart(6, \"0\").slice(0, 6);\n}\n\nexport function createRunState(\n\ttask: ResolvedSubagentTask,\n\tindex: number,\n\tbatchId: string | undefined,\n\tparentCwd: string,\n): SubagentRunState {\n\treturn {\n\t\tid: runId(batchId, index),\n\t\tagent: task.agent.name,\n\t\tdescription: task.description,\n\t\t// Display-only relative path; the worker session itself uses the\n\t\t// resolved absolute task.cwd. Empty means \"same as the parent\".\n\t\tcwd: relative(parentCwd, task.cwd),\n\t\tmodel: modelId(task.model),\n\t\tthinking: task.thinking,\n\t\tstatus: \"queued\",\n\t\tactivities: [],\n\t\treport: \"\",\n\t\tusage: emptyUsage(),\n\t\tversion: 0,\n\t};\n}\n\n/** Strips internal fields for projection into the public details shape. */\nexport function toRunDetails(state: SubagentRunState): SubagentRunDetails {\n\tconst { version: _version, ...details } = state;\n\treturn details;\n}\n\n// The live \"current activity\" line is derived, never imperative: a pending\n// retry wins, then the most recent still-running tool. This is what keeps a\n// parallel batch's line correct when tools end out of order.\nexport function deriveCurrentActivity(state: SubagentRunState): string | undefined {\n\tif (state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\") return undefined;\n\tif (state.retry) return `Retrying (${state.retry.attempt}/${state.retry.maxAttempts})…`;\n\tfor (let index = state.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = state.activities[index];\n\t\tif (activity?.status === \"running\") return activity.summary;\n\t}\n\treturn undefined;\n}\n\nfunction positiveInteger(value: number, fallback: number): number {\n\treturn Number.isFinite(value) ? Math.max(1, Math.floor(value)) : fallback;\n}\n\nfunction retryError(error: string): string {\n\tconst normalized = error.replace(/\\s+/gu, \" \").trim();\n\treturn boundText(normalized, RETRY_ERROR_TEXT_LIMIT).replace(/\\s+/gu, \" \").trim();\n}\n\nfunction makeRetry(attempt: number, maxAttempts: number, deadline: number, error: string): SubagentRunState[\"retry\"] {\n\tconst normalizedAttempt = positiveInteger(attempt, 1);\n\treturn {\n\t\tattempt: normalizedAttempt,\n\t\tmaxAttempts: Math.max(normalizedAttempt, positiveInteger(maxAttempts, normalizedAttempt)),\n\t\tdeadline,\n\t\terror: retryError(error),\n\t};\n}\n\n// The in-memory activity log keeps the newest entries within both the count\n// and text budgets; a bounded O(ACTIVITY_LIMIT) rescan per event replaces\n// incremental byte bookkeeping. Exported for direct budget tests: real\n// events bound every summary, so the text-budget eviction is otherwise\n// purely defensive.\nexport function appendActivity(activities: ToolActivity[], activity: ToolActivity): void {\n\tactivities.push(activity);\n\twhile (activities.length > ACTIVITY_LIMIT) activities.shift();\n\twhile (\n\t\tactivities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0) >\n\t\tACTIVITY_TEXT_LIMIT\n\t) {\n\t\tif (activities.length <= 1) break;\n\t\tactivities.shift();\n\t}\n}\n\nfunction isTerminal(state: SubagentRunState): boolean {\n\treturn state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\";\n}\n\nfunction withRevision(state: SubagentRunState, mutate: (draft: SubagentRunState) => void): SubagentRunState {\n\tconst draft: SubagentRunState = {\n\t\t...state,\n\t\tactivities: state.activities.map((activity) => ({ ...activity })),\n\t\tusage: { ...state.usage },\n\t};\n\tmutate(draft);\n\tdraft.version = state.version + 1;\n\treturn draft;\n}\n\nfunction clearRetry(draft: SubagentRunState): void {\n\tdraft.retry = undefined;\n}\n\n/**\n * Pure transition function; timestamps and deadlines arrive in the event.\n * Events applied after a terminal verdict are ignored (settle is idempotent)\n * — except retry_scheduled, the one sanctioned reopening transition.\n */\nexport function reduceRun(state: SubagentRunState, event: SubagentRunEvent): SubagentRunState {\n\tif (isTerminal(state) && event.type !== \"retry_scheduled\") return state;\n\n\tswitch (event.type) {\n\t\tcase \"slot_acquired\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.status = \"running\";\n\t\t\t\tdraft.startedAt = event.startedAt;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"retry_scheduled\":\n\t\t\t// The full reset matrix from the historical resetRunForRetry: only\n\t\t\t// runs that produced nothing are retried, so nothing of value is\n\t\t\t// discarded. The retry view stays visible through the backoff.\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tconst error = draft.error ?? \"Subagent failed before retry.\";\n\t\t\t\tdraft.status = \"queued\";\n\t\t\t\tdraft.error = undefined;\n\t\t\t\tdraft.startedAt = undefined;\n\t\t\t\tdraft.endedAt = undefined;\n\t\t\t\tdraft.report = \"\";\n\t\t\t\tdraft.activities = [];\n\t\t\t\tdraft.usage = emptyUsage();\n\t\t\t\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, error);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"retry_started\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"auto_retry_start\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, event.error);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"auto_retry_end\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"turn_end\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.usage.turns++;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"assistant_message_settled\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\taddUsage(draft.usage, event.usage);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"tool_started\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.usage.toolUses++;\n\t\t\t\tappendActivity(draft.activities, {\n\t\t\t\t\tid: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\tsummary: activitySummary(event.toolName, event.args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tstartedAt: event.startedAt,\n\t\t\t\t});\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"tool_updated\": {\n\t\t\tconst summary = activitySummary(event.toolName, event.args);\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tconst activity =\n\t\t\t\t\tdraft.activities.find(\n\t\t\t\t\t\t(candidate) => candidate.id === event.toolCallId && candidate.status === \"running\",\n\t\t\t\t\t) ?? [...draft.activities].reverse().find((candidate) => candidate.status === \"running\");\n\t\t\t\tif (activity) activity.summary = summary;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\t}\n\t\tcase \"tool_ended\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tconst activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);\n\t\t\t\tif (activity && activity.status === \"running\") {\n\t\t\t\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\t\t\t\tactivity.endedAt = event.endedAt;\n\t\t\t\t\tactivity.resultSummary = resultSummary(event.result) || undefined;\n\t\t\t\t}\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"settle\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = event.verdict;\n\t\t\t\tdraft.report = boundText(event.report, TASK_OUTPUT_LIMIT);\n\t\t\t\tdraft.error = event.error ? boundText(event.error, ERROR_TEXT_LIMIT) : undefined;\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity({ ...draft, status: event.verdict });\n\t\t\t});\n\t\tcase \"abort_while_queued\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = \"aborted\";\n\t\t\t\tdraft.error = \"Subagent was aborted while queued.\";\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = undefined;\n\t\t\t});\n\t\tcase \"abort_while_retrying\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = \"aborted\";\n\t\t\t\tdraft.error = \"Subagent was aborted while waiting to retry.\";\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = undefined;\n\t\t\t});\n\t}\n}\n\nexport function versionSum(runs: readonly SubagentRunState[]): number {\n\tlet total = 0;\n\tfor (const run of runs) total += run.version;\n\treturn total;\n}\n\nexport function statusOf(runs: readonly SubagentRunDetails[]): SubagentDetails[\"status\"] {\n\tif (runs.length === 0) return \"running\";\n\t// Active beats terminal: any queued or running run keeps the batch\n\t// \"running\" regardless of what the others have settled to.\n\tif (runs.some((run) => run.status === \"queued\" || run.status === \"running\")) return \"running\";\n\tif (runs.every((run) => run.status === \"completed\")) return \"completed\";\n\tif (runs.some((run) => run.status === \"completed\")) return \"partial\";\n\tif (runs.every((run) => run.status === \"aborted\")) return \"aborted\";\n\treturn \"failed\";\n}\n\nexport function isSubagentError(details: Pick<SubagentDetails, \"status\" | \"runs\">): boolean {\n\tif (details.status !== \"failed\" && details.status !== \"aborted\") return false;\n\t// A batch with any successful run is a partial result, not an error:\n\t// per-run status is already reported in the content sections.\n\treturn !details.runs.some((run) => run.status === \"completed\");\n}\n\nfunction statusText(details: SubagentDetails): string {\n\tif (details.runs.length === 0) return \"Initializing…\";\n\tconst running = details.runs.filter((run) => run.status === \"running\").length;\n\tconst queued = details.runs.filter((run) => run.status === \"queued\").length;\n\tconst completed = details.runs.filter((run) => run.status === \"completed\").length;\n\tconst failed = details.runs.filter((run) => run.status === \"failed\").length;\n\tconst aborted = details.runs.filter((run) => run.status === \"aborted\").length;\n\tconst parts = [`${completed}/${details.runs.length} complete`];\n\tif (running) parts.push(`${running} running`);\n\tif (queued) parts.push(`${queued} queued`);\n\tif (failed) parts.push(`${failed} failed`);\n\tif (aborted) parts.push(`${aborted} aborted`);\n\treturn parts.join(\" · \");\n}\n\nexport function statusSummary(details: SubagentDetails): string {\n\treturn statusText(details);\n}\n\nexport interface SubagentRetryView {\n\tattempt: number;\n\tmaxAttempts: number;\n\tremainingSeconds: number;\n\terror: string;\n}\n\nexport function getSubagentRetryView(run: SubagentRunDetails, now = Date.now()): SubagentRetryView | undefined {\n\tconst retry = run.retry;\n\tif (!retry || !Number.isFinite(retry.deadline)) return undefined;\n\tconst attempt = positiveInteger(retry.attempt, 1);\n\tconst maxAttempts = Math.max(attempt, positiveInteger(retry.maxAttempts, attempt));\n\tconst currentTime = Number.isFinite(now) ? now : retry.deadline;\n\treturn {\n\t\tattempt,\n\t\tmaxAttempts,\n\t\tremainingSeconds: Math.max(0, Math.ceil((retry.deadline - currentTime) / 1000)),\n\t\terror: retryError(typeof retry.error === \"string\" ? retry.error : \"\"),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport {\n\tactivitySummary,\n\taddUsage,\n\tcompactionError,\n\tcompactionSummary,\n\temptyUsage,\n\tresultSummary,\n} from \"./activity.ts\";\nimport {\n\tACTIVITY_LIMIT,\n\tACTIVITY_TEXT_LIMIT,\n\tCOMPACTION_ACTIVITY_ID,\n\tERROR_TEXT_LIMIT,\n\tRETRY_ERROR_TEXT_LIMIT,\n\tTASK_OUTPUT_LIMIT,\n} from \"./constants.ts\";\nimport { modelId } from \"./model-selection.ts\";\nimport { boundText } from \"./text.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\n/**\n * Mutable-run state plus an internal revision counter. All transitions go\n * through {@link reduceRun}; the batch runner compares version sums instead\n * of diffing rendered fields.\n */\nexport interface SubagentRunState extends SubagentRunDetails {\n\t/** Monotonic per-run revision; bumped by every applied event. */\n\tversion: number;\n}\n\n/** The adapter layer's only output and the reducer's only input. */\nexport type SubagentRunEvent =\n\t| { type: \"slot_acquired\"; startedAt: number }\n\t| {\n\t\t\ttype: \"retry_scheduled\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdeadline: number;\n\t\t\terror: string | undefined;\n\t }\n\t| { type: \"retry_started\" }\n\t| { type: \"auto_retry_start\"; attempt: number; maxAttempts: number; deadline: number; error: string }\n\t| { type: \"auto_retry_end\" }\n\t| { type: \"turn_end\" }\n\t| { type: \"assistant_message_settled\"; usage: Usage | undefined }\n\t| { type: \"tool_started\"; toolCallId: string; toolName: string; args: unknown; startedAt: number }\n\t| { type: \"tool_updated\"; toolCallId: string; toolName: string; args: unknown }\n\t| { type: \"tool_ended\"; toolCallId: string; result: unknown; isError: boolean; endedAt: number }\n\t| { type: \"compaction_started\"; startedAt: number }\n\t| {\n\t\t\ttype: \"compaction_ended\";\n\t\t\ttokensBefore: number | undefined;\n\t\t\ttokensAfter: number | undefined;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| {\n\t\t\ttype: \"settle\";\n\t\t\tverdict: \"completed\" | \"failed\" | \"aborted\";\n\t\t\treport: string;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| { type: \"abort_while_queued\"; endedAt: number }\n\t| { type: \"abort_while_retrying\"; endedAt: number };\n\nfunction runId(batchId: string | undefined, index: number): string {\n\tif (!batchId) return `subagent-${index + 1}`;\n\t// toolCallIds are provider-shaped (\"call_ABC...\"); keep the readable\n\t// prefix, then disambiguate truncated collisions with a deterministic\n\t// hash of the full id.\n\tconst sanitized = batchId.replace(/[^A-Za-z0-9-]+/gu, \"-\").replace(/^-+|-+$/gu, \"\");\n\tconst hash = hashRunId(batchId);\n\tconst prefix = sanitized.length > 24 ? `${sanitized.slice(0, 24)}-${hash}` : sanitized || `run-${hash}`;\n\treturn `${prefix}-${index + 1}`;\n}\n\nfunction hashRunId(value: string): string {\n\tlet hash = 0x811c9dc5;\n\tfor (let index = 0; index < value.length; index++) {\n\t\thash ^= value.charCodeAt(index);\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36).padStart(6, \"0\").slice(0, 6);\n}\n\nexport function createRunState(\n\ttask: ResolvedSubagentTask,\n\tindex: number,\n\tbatchId: string | undefined,\n\tparentCwd: string,\n): SubagentRunState {\n\treturn {\n\t\tid: runId(batchId, index),\n\t\tagent: task.agent.name,\n\t\tdescription: task.description,\n\t\t// Display-only relative path; the worker session itself uses the\n\t\t// resolved absolute task.cwd. Empty means \"same as the parent\".\n\t\tcwd: relative(parentCwd, task.cwd),\n\t\tmodel: modelId(task.model),\n\t\tthinking: task.thinking,\n\t\tstatus: \"queued\",\n\t\tactivities: [],\n\t\treport: \"\",\n\t\tusage: emptyUsage(),\n\t\tversion: 0,\n\t};\n}\n\n/** Strips internal fields for projection into the public details shape. */\nexport function toRunDetails(state: SubagentRunState): SubagentRunDetails {\n\tconst { version: _version, ...details } = state;\n\treturn details;\n}\n\n// The live \"current activity\" line is derived, never imperative: a pending\n// retry wins, then the most recent still-running tool. This is what keeps a\n// parallel batch's line correct when tools end out of order.\nexport function deriveCurrentActivity(state: SubagentRunState): string | undefined {\n\tif (state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\") return undefined;\n\tif (state.retry) return `Retrying (${state.retry.attempt}/${state.retry.maxAttempts})…`;\n\tfor (let index = state.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = state.activities[index];\n\t\tif (activity?.status === \"running\") return activity.summary;\n\t}\n\treturn undefined;\n}\n\nfunction positiveInteger(value: number, fallback: number): number {\n\treturn Number.isFinite(value) ? Math.max(1, Math.floor(value)) : fallback;\n}\n\nfunction retryError(error: string): string {\n\tconst normalized = error.replace(/\\s+/gu, \" \").trim();\n\treturn boundText(normalized, RETRY_ERROR_TEXT_LIMIT).replace(/\\s+/gu, \" \").trim();\n}\n\nfunction makeRetry(attempt: number, maxAttempts: number, deadline: number, error: string): SubagentRunState[\"retry\"] {\n\tconst normalizedAttempt = positiveInteger(attempt, 1);\n\treturn {\n\t\tattempt: normalizedAttempt,\n\t\tmaxAttempts: Math.max(normalizedAttempt, positiveInteger(maxAttempts, normalizedAttempt)),\n\t\tdeadline,\n\t\terror: retryError(error),\n\t};\n}\n\n// The in-memory activity log keeps the newest entries within both the count\n// and text budgets; a bounded O(ACTIVITY_LIMIT) rescan per event replaces\n// incremental byte bookkeeping. Exported for direct budget tests: real\n// events bound every summary, so the text-budget eviction is otherwise\n// purely defensive.\nexport function appendActivity(activities: ToolActivity[], activity: ToolActivity): void {\n\tactivities.push(activity);\n\twhile (activities.length > ACTIVITY_LIMIT) activities.shift();\n\twhile (\n\t\tactivities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0) >\n\t\tACTIVITY_TEXT_LIMIT\n\t) {\n\t\tif (activities.length <= 1) break;\n\t\tactivities.shift();\n\t}\n}\n\nfunction isTerminal(state: SubagentRunState): boolean {\n\treturn state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\";\n}\n\nfunction withRevision(state: SubagentRunState, mutate: (draft: SubagentRunState) => void): SubagentRunState {\n\tconst draft: SubagentRunState = {\n\t\t...state,\n\t\tactivities: state.activities.map((activity) => ({ ...activity })),\n\t\tusage: { ...state.usage },\n\t};\n\tmutate(draft);\n\tdraft.version = state.version + 1;\n\treturn draft;\n}\n\nfunction clearRetry(draft: SubagentRunState): void {\n\tdraft.retry = undefined;\n}\n\n/**\n * Pure transition function; timestamps and deadlines arrive in the event.\n * Events applied after a terminal verdict are ignored (settle is idempotent)\n * — except retry_scheduled, the one sanctioned reopening transition.\n */\nexport function reduceRun(state: SubagentRunState, event: SubagentRunEvent): SubagentRunState {\n\tif (isTerminal(state) && event.type !== \"retry_scheduled\") return state;\n\n\tswitch (event.type) {\n\t\tcase \"slot_acquired\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.status = \"running\";\n\t\t\t\tdraft.startedAt = event.startedAt;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"retry_scheduled\":\n\t\t\t// The full reset matrix from the historical resetRunForRetry: only\n\t\t\t// runs that produced nothing are retried, so nothing of value is\n\t\t\t// discarded. The retry view stays visible through the backoff.\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tconst error = draft.error ?? \"Subagent failed before retry.\";\n\t\t\t\tdraft.status = \"queued\";\n\t\t\t\tdraft.error = undefined;\n\t\t\t\tdraft.startedAt = undefined;\n\t\t\t\tdraft.endedAt = undefined;\n\t\t\t\tdraft.report = \"\";\n\t\t\t\tdraft.activities = [];\n\t\t\t\tdraft.usage = emptyUsage();\n\t\t\t\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, error);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"retry_started\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"auto_retry_start\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, event.error);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"auto_retry_end\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"turn_end\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.usage.turns++;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"assistant_message_settled\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\taddUsage(draft.usage, event.usage);\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"tool_started\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tdraft.usage.toolUses++;\n\t\t\t\tappendActivity(draft.activities, {\n\t\t\t\t\tid: event.toolCallId,\n\t\t\t\t\ttoolName: event.toolName,\n\t\t\t\t\tsummary: activitySummary(event.toolName, event.args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tstartedAt: event.startedAt,\n\t\t\t\t});\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"tool_updated\": {\n\t\t\tconst summary = activitySummary(event.toolName, event.args);\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tconst activity =\n\t\t\t\t\tdraft.activities.find(\n\t\t\t\t\t\t(candidate) => candidate.id === event.toolCallId && candidate.status === \"running\",\n\t\t\t\t\t) ?? [...draft.activities].reverse().find((candidate) => candidate.status === \"running\");\n\t\t\t\tif (activity) activity.summary = summary;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\t}\n\t\tcase \"tool_ended\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tconst activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);\n\t\t\t\tif (activity && activity.status === \"running\") {\n\t\t\t\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\t\t\t\tactivity.endedAt = event.endedAt;\n\t\t\t\t\tactivity.resultSummary = resultSummary(event.result) || undefined;\n\t\t\t\t}\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"compaction_started\":\n\t\t\t// Auto-compaction is a synthetic activity: it has a start, an end and a\n\t\t\t// failure mode just like a tool call, so it reuses the activity log and its\n\t\t\t// budgets. It is not a tool call, so it never counts toward toolUses.\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\tappendActivity(draft.activities, {\n\t\t\t\t\tid: COMPACTION_ACTIVITY_ID,\n\t\t\t\t\ttoolName: COMPACTION_ACTIVITY_ID,\n\t\t\t\t\tsummary: \"Compacting context…\",\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tstartedAt: event.startedAt,\n\t\t\t\t});\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"compaction_ended\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tclearRetry(draft);\n\t\t\t\t// Only one compaction runs at a time, so the newest running entry with\n\t\t\t\t// this id is always the one that just ended.\n\t\t\t\tconst activity = [...draft.activities]\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.find((candidate) => candidate.id === COMPACTION_ACTIVITY_ID && candidate.status === \"running\");\n\t\t\t\tif (activity) {\n\t\t\t\t\tactivity.status = event.error ? \"failed\" : \"succeeded\";\n\t\t\t\t\tactivity.endedAt = event.endedAt;\n\t\t\t\t\tactivity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);\n\t\t\t\t\tactivity.resultSummary = event.error ? compactionError(event.error) : undefined;\n\t\t\t\t}\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t\t\t});\n\t\tcase \"settle\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = event.verdict;\n\t\t\t\tdraft.report = boundText(event.report, TASK_OUTPUT_LIMIT);\n\t\t\t\tdraft.error = event.error ? boundText(event.error, ERROR_TEXT_LIMIT) : undefined;\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = deriveCurrentActivity({ ...draft, status: event.verdict });\n\t\t\t});\n\t\tcase \"abort_while_queued\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = \"aborted\";\n\t\t\t\tdraft.error = \"Subagent was aborted while queued.\";\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = undefined;\n\t\t\t});\n\t\tcase \"abort_while_retrying\":\n\t\t\treturn withRevision(state, (draft) => {\n\t\t\t\tdraft.status = \"aborted\";\n\t\t\t\tdraft.error = \"Subagent was aborted while waiting to retry.\";\n\t\t\t\tdraft.endedAt = event.endedAt;\n\t\t\t\tdraft.retry = undefined;\n\t\t\t\tdraft.currentActivity = undefined;\n\t\t\t});\n\t}\n}\n\nexport function versionSum(runs: readonly SubagentRunState[]): number {\n\tlet total = 0;\n\tfor (const run of runs) total += run.version;\n\treturn total;\n}\n\nexport function statusOf(runs: readonly SubagentRunDetails[]): SubagentDetails[\"status\"] {\n\tif (runs.length === 0) return \"running\";\n\t// Active beats terminal: any queued or running run keeps the batch\n\t// \"running\" regardless of what the others have settled to.\n\tif (runs.some((run) => run.status === \"queued\" || run.status === \"running\")) return \"running\";\n\tif (runs.every((run) => run.status === \"completed\")) return \"completed\";\n\tif (runs.some((run) => run.status === \"completed\")) return \"partial\";\n\tif (runs.every((run) => run.status === \"aborted\")) return \"aborted\";\n\treturn \"failed\";\n}\n\nexport function isSubagentError(details: Pick<SubagentDetails, \"status\" | \"runs\">): boolean {\n\tif (details.status !== \"failed\" && details.status !== \"aborted\") return false;\n\t// A batch with any successful run is a partial result, not an error:\n\t// per-run status is already reported in the content sections.\n\treturn !details.runs.some((run) => run.status === \"completed\");\n}\n\nfunction statusText(details: SubagentDetails): string {\n\tif (details.runs.length === 0) return \"Initializing…\";\n\tconst running = details.runs.filter((run) => run.status === \"running\").length;\n\tconst queued = details.runs.filter((run) => run.status === \"queued\").length;\n\tconst completed = details.runs.filter((run) => run.status === \"completed\").length;\n\tconst failed = details.runs.filter((run) => run.status === \"failed\").length;\n\tconst aborted = details.runs.filter((run) => run.status === \"aborted\").length;\n\tconst parts = [`${completed}/${details.runs.length} complete`];\n\tif (running) parts.push(`${running} running`);\n\tif (queued) parts.push(`${queued} queued`);\n\tif (failed) parts.push(`${failed} failed`);\n\tif (aborted) parts.push(`${aborted} aborted`);\n\treturn parts.join(\" · \");\n}\n\nexport function statusSummary(details: SubagentDetails): string {\n\treturn statusText(details);\n}\n\nexport interface SubagentRetryView {\n\tattempt: number;\n\tmaxAttempts: number;\n\tremainingSeconds: number;\n\terror: string;\n}\n\nexport function getSubagentRetryView(run: SubagentRunDetails, now = Date.now()): SubagentRetryView | undefined {\n\tconst retry = run.retry;\n\tif (!retry || !Number.isFinite(retry.deadline)) return undefined;\n\tconst attempt = positiveInteger(retry.attempt, 1);\n\tconst maxAttempts = Math.max(attempt, positiveInteger(retry.maxAttempts, attempt));\n\tconst currentTime = Number.isFinite(now) ? now : retry.deadline;\n\treturn {\n\t\tattempt,\n\t\tmaxAttempts,\n\t\tremainingSeconds: Math.max(0, Math.ceil((retry.deadline - currentTime) / 1000)),\n\t\terror: retryError(typeof retry.error === \"string\" ? retry.error : \"\"),\n\t};\n}\n"]}
|