@astralyn/pi 0.84.10 → 0.84.11

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 CHANGED
@@ -4,6 +4,12 @@ This file records `@astralyn/pi` releases beginning with the first Fork-owned re
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.84.11] - 2026-08-26
8
+
9
+ ### Changed
10
+
11
+ - Increased the bundled Subagent maximum concurrency limit from 5 to 6 active workers.
12
+ - Redesigned the bundled Subagent collapsed view around a compact flow grid: each task renders as one status-marked cell — a breathing dot-to-star bloom spinner while running, a static muted `○` while queued, and `✓`/`×`/`■` when settled — showing only its ordinal and profile, cells wrap at their boundaries with uniform widths so continuation rows stay column-aligned, and the call header settles on a quiet `● Subagent` title. Batch elapsed time and aggregate cost moved into a `── Batch` summary line at the top of the expanded view; activity summaries, per-run durations, failure details, and retry countdowns are no longer echoed in collapsed rows. Live refresh runs at the spinner cadence while a task is running and the card is collapsed, falling back to a one-second cadence when expanded or settled, and switching between the two takes effect immediately when the card is expanded or collapsed.
7
13
  ## [0.84.10] - 2026-08-24
8
14
 
9
15
  ### Upstream sync: Pi v0.84.3
@@ -4,7 +4,7 @@ export declare const SUBAGENT_COMMAND_NAME = "agents";
4
4
  export declare const SUBAGENT_CONFIG_VERSION = 1;
5
5
  export declare const SUBAGENT_CONFIG_FILE = "subagent.json";
6
6
  export declare const MAX_TASKS = 8;
7
- export declare const MAX_CONCURRENCY = 5;
7
+ export declare const MAX_CONCURRENCY = 6;
8
8
  export declare const TASK_RETRY_LIMIT = 2;
9
9
  export declare const TASK_RETRY_BASE_DELAY_MS = 1000;
10
10
  export declare const SUBAGENT_AGENT_NAMES: readonly ["explorer", "general"];
@@ -4,7 +4,7 @@ export const SUBAGENT_COMMAND_NAME = "agents";
4
4
  export const SUBAGENT_CONFIG_VERSION = 1;
5
5
  export const SUBAGENT_CONFIG_FILE = "subagent.json";
6
6
  export const MAX_TASKS = 8;
7
- export const MAX_CONCURRENCY = 5;
7
+ export const MAX_CONCURRENCY = 6;
8
8
  // Task-level retry for failures that bypass the session's own auto-retry
9
9
  // (preflight throws such as auth checks). Only runs that produced nothing
10
10
  // are retried, so a retry never discards partial work.
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/subagent/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,yEAAyE;AACzE,0EAA0E;AAC1E,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAAU,EAAE,SAAS,CAAU,CAAC;AAGrE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,mBAAmB;AACnB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAU,CAAC;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;CACuC,CAAC;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,+EAA+E;AAC/E,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AACnD,yEAAyE;AACzE,oEAAoE;AACpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC3C,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,CAAC;AAC/C,yEAAyE;AACzE,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const SUBAGENT_TOOL_NAME = \"subagent\";\nexport const SUBAGENT_TOOL_LABEL = \"Subagent\";\nexport const SUBAGENT_COMMAND_NAME = \"agents\";\nexport const SUBAGENT_CONFIG_VERSION = 1;\nexport const SUBAGENT_CONFIG_FILE = \"subagent.json\";\n\nexport const MAX_TASKS = 8;\nexport const MAX_CONCURRENCY = 5;\n\n// Task-level retry for failures that bypass the session's own auto-retry\n// (preflight throws such as auth checks). Only runs that produced nothing\n// are retried, so a retry never discards partial work.\nexport const TASK_RETRY_LIMIT = 2;\nexport const TASK_RETRY_BASE_DELAY_MS = 1_000;\n\n// The only selectable agents: the schema's agent field restricts task items\n// to these names, resolve.ts defaults an omitted/null agent to explorer.\nexport const SUBAGENT_AGENT_NAMES = [\"explorer\", \"general\"] as const;\nexport type SubagentAgentName = (typeof SUBAGENT_AGENT_NAMES)[number];\n\n// Matches the parent session's default toolset; bash covers search needs.\nexport const DEFAULT_AGENT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\"] as const;\n// The read-only explorer profile gets the standalone search tools plus bash\n// for read-only inspection (git history, counting); the system prompt\n// constrains bash.\nexport const EXPLORER_TOOLS = [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] as const;\n\nexport const THINKING_LEVELS = [\n\t\"off\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\",\n\t\"max\",\n] as const satisfies readonly ThinkingLevel[];\n\nexport const ACTIVITY_LIMIT = 80;\nexport const ACTIVITY_TEXT_LIMIT = 24 * 1024;\n// Auto-compaction enters the activity log as a synthetic entry so the worker's\n// context maintenance is visible alongside its tool calls. Only one compaction\n// can run at a time, so a single fixed id is enough to pair start with end.\nexport const COMPACTION_ACTIVITY_ID = \"compaction\";\n// Per-task ceiling for the model-facing report; the total cap below wins\n// when the batch is large enough that a fair share would exceed it.\nexport const TASK_OUTPUT_LIMIT = 32 * 1024;\n// Total cap for the model-facing report across every task section.\nexport const TOTAL_OUTPUT_LIMIT = 48 * 1024;\nexport const ERROR_TEXT_LIMIT = 8 * 1024;\nexport const RETRY_ERROR_TEXT_LIMIT = 160;\nexport const DETAILS_OUTPUT_LIMIT = 120 * 1024;\n// Bounded per run inside DETAILS_OUTPUT_LIMIT; each activity costs up to\n// ~600 bytes, so 12 keeps an 8-run parallel batch from starving outputs.\nexport const DETAILS_ACTIVITY_LIMIT = 12;\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/subagent/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,yEAAyE;AACzE,0EAA0E;AAC1E,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAAU,EAAE,SAAS,CAAU,CAAC;AAGrE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,mBAAmB;AACnB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAU,CAAC;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;CACuC,CAAC;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,+EAA+E;AAC/E,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AACnD,yEAAyE;AACzE,oEAAoE;AACpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC3C,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,CAAC;AAC/C,yEAAyE;AACzE,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const SUBAGENT_TOOL_NAME = \"subagent\";\nexport const SUBAGENT_TOOL_LABEL = \"Subagent\";\nexport const SUBAGENT_COMMAND_NAME = \"agents\";\nexport const SUBAGENT_CONFIG_VERSION = 1;\nexport const SUBAGENT_CONFIG_FILE = \"subagent.json\";\n\nexport const MAX_TASKS = 8;\nexport const MAX_CONCURRENCY = 6;\n\n// Task-level retry for failures that bypass the session's own auto-retry\n// (preflight throws such as auth checks). Only runs that produced nothing\n// are retried, so a retry never discards partial work.\nexport const TASK_RETRY_LIMIT = 2;\nexport const TASK_RETRY_BASE_DELAY_MS = 1_000;\n\n// The only selectable agents: the schema's agent field restricts task items\n// to these names, resolve.ts defaults an omitted/null agent to explorer.\nexport const SUBAGENT_AGENT_NAMES = [\"explorer\", \"general\"] as const;\nexport type SubagentAgentName = (typeof SUBAGENT_AGENT_NAMES)[number];\n\n// Matches the parent session's default toolset; bash covers search needs.\nexport const DEFAULT_AGENT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\"] as const;\n// The read-only explorer profile gets the standalone search tools plus bash\n// for read-only inspection (git history, counting); the system prompt\n// constrains bash.\nexport const EXPLORER_TOOLS = [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] as const;\n\nexport const THINKING_LEVELS = [\n\t\"off\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\",\n\t\"max\",\n] as const satisfies readonly ThinkingLevel[];\n\nexport const ACTIVITY_LIMIT = 80;\nexport const ACTIVITY_TEXT_LIMIT = 24 * 1024;\n// Auto-compaction enters the activity log as a synthetic entry so the worker's\n// context maintenance is visible alongside its tool calls. Only one compaction\n// can run at a time, so a single fixed id is enough to pair start with end.\nexport const COMPACTION_ACTIVITY_ID = \"compaction\";\n// Per-task ceiling for the model-facing report; the total cap below wins\n// when the batch is large enough that a fair share would exceed it.\nexport const TASK_OUTPUT_LIMIT = 32 * 1024;\n// Total cap for the model-facing report across every task section.\nexport const TOTAL_OUTPUT_LIMIT = 48 * 1024;\nexport const ERROR_TEXT_LIMIT = 8 * 1024;\nexport const RETRY_ERROR_TEXT_LIMIT = 160;\nexport const DETAILS_OUTPUT_LIMIT = 120 * 1024;\n// Bounded per run inside DETAILS_OUTPUT_LIMIT; each activity costs up to\n// ~600 bytes, so 12 keeps an 8-run parallel batch from starving outputs.\nexport const DETAILS_ACTIVITY_LIMIT = 12;\n"]}
@@ -60,8 +60,8 @@ export default function subagent(pi) {
60
60
  usage: execution.usage,
61
61
  };
62
62
  },
63
- renderCall(args, theme, context) {
64
- return renderSubagentCall(args, theme, context);
63
+ renderCall(args, theme) {
64
+ return renderSubagentCall(args, theme);
65
65
  },
66
66
  renderResult(result, options, theme, context) {
67
67
  scheduleLiveRefresh(context, options.isPartial);
@@ -1 +1 @@
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, context) {\n\t\t\treturn renderSubagentCall(args, theme, context);\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
+ {"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"]}
@@ -3,15 +3,15 @@ import type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from
3
3
  import { type Theme } from "../../modes/interactive/theme/theme.ts";
4
4
  import type { SubagentParams } from "./schema.ts";
5
5
  import type { SubagentDetails } from "./types.ts";
6
- /** Per-result live-refresh and timing state owned by the shell's render context. */
6
+ /** Per-result live-refresh state owned by the shell's render context. */
7
7
  export interface SubagentRenderState {
8
8
  refreshTimer?: ReturnType<typeof setTimeout>;
9
- startedAt?: number;
10
- endedAt?: number;
9
+ /** Cadence the current timer was created with, used to detect changes. */
10
+ refreshInterval?: number;
11
11
  }
12
12
  type SubagentToolRenderContext = ToolRenderContext<SubagentRenderState, SubagentParams, SubagentDetails>;
13
- export declare function scheduleLiveRefresh(context: ToolRenderContext<SubagentRenderState>, isPartial: boolean): void;
14
- export declare function renderSubagentCall(args: SubagentParams, theme: Theme, context?: SubagentToolRenderContext): Component;
13
+ export declare function scheduleLiveRefresh(context: SubagentToolRenderContext, isPartial: boolean): void;
14
+ export declare function renderSubagentCall(args: SubagentParams, theme: Theme): Component;
15
15
  export declare function renderSubagentResult(result: AgentToolResult<SubagentDetails>, options: ToolRenderResultOptions, theme: Theme, args: SubagentParams, isError: boolean): Component;
16
16
  export {};
17
17
  //# sourceMappingURL=render.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAsD,MAAM,wBAAwB,CAAC;AAC5G,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAClH,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAGtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,KAAK,EAAE,eAAe,EAAuD,MAAM,YAAY,CAAC;AAuPvG,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IACnC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,yBAAyB,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAiBzG,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,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAYrH;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,CAqBX"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAOd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAClH,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAGtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,KAAK,EAAE,eAAe,EAAuD,MAAM,YAAY,CAAC;AAkTvG,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IACnC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAC7C,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,yBAAyB,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAazG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CA0BhG;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAIhF;AAaD,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,CAsBX"}
@@ -1,4 +1,4 @@
1
- import { Container, Markdown, Spacer, Text, truncateToWidth } from "@earendil-works/pi-tui";
1
+ import { Container, Markdown, Spacer, Text, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
2
2
  import { getMarkdownTheme } from "../../modes/interactive/theme/theme.js";
3
3
  import { AGENT_PROFILE_LABELS } from "./agents.js";
4
4
  import { COMPACTION_ACTIVITY_ID } from "./constants.js";
@@ -9,6 +9,16 @@ const RETRY_ERROR_LIMIT = 160;
9
9
  const FALLBACK_OUTPUT_LIMIT = 4_000;
10
10
  const ACTIVITY_DURATION_MIN_MS = 10_000;
11
11
  const OUTPUT_TRUNCATION_NOTICE_PATTERN = /\s*\[Output truncated(?:: \d+ bytes omitted)?\.\]\s*$/u;
12
+ // A breathing dot-to-star bloom: the sequence plays forward to full bloom
13
+ // and back, holding each extreme for two ticks. The mid frame uses ✼ rather
14
+ // than the more common ✳ because U+2733 carries the Unicode Emoji property
15
+ // and some terminals render it as a double-width color emoji.
16
+ const SPINNER_BLOOM = ["·", "✢", "✼", "✶", "✻", "✽"];
17
+ const SPINNER_FRAMES = [...SPINNER_BLOOM, ...[...SPINNER_BLOOM].reverse()];
18
+ const SPINNER_INTERVAL_MS = 120;
19
+ const ELAPSED_REFRESH_INTERVAL_MS = 1_000;
20
+ const FLOW_SEPARATOR = " · ";
21
+ const FLOW_SEPARATOR_WIDTH = 3;
12
22
  /** Width-aware single-line text for compact rows and section headers. */
13
23
  class SingleLineText {
14
24
  constructor(text) {
@@ -156,8 +166,45 @@ function runStateText(run) {
156
166
  return "Starting...";
157
167
  return statusWord(run.status);
158
168
  }
159
- function taskRow(run, index, theme) {
160
- return `${statusMarker(run.status, theme)} ${theme.fg("dim", `#${index + 1}`)} ${theme.fg("accent", profileLabel(run.agent))}${theme.fg("dim", ` · ${runStateText(run)}`)}`;
169
+ function spinnerGlyph(now) {
170
+ const frame = Math.floor(now / SPINNER_INTERVAL_MS) % SPINNER_FRAMES.length;
171
+ return SPINNER_FRAMES[frame] ?? SPINNER_FRAMES[0] ?? "";
172
+ }
173
+ /** One collapsed cell: status glyph, ordinal, and profile label only. */
174
+ function flowSegment(run, index, theme, now) {
175
+ const marker = run.status === "running" ? theme.fg("accent", spinnerGlyph(now)) : statusMarker(run.status, theme);
176
+ return `${marker} ${theme.fg("dim", `#${index + 1}`)} ${theme.fg("accent", profileLabel(run.agent))}`;
177
+ }
178
+ /** Collapsed batch flow: one cell per run, wrapped at cell boundaries with
179
+ * uniform cell widths so continuation rows keep their columns aligned. */
180
+ class CollapsedFlow {
181
+ constructor(segments) {
182
+ this.segments = segments;
183
+ this.cellWidth = segments.reduce((max, segment) => Math.max(max, visibleWidth(segment)), 1);
184
+ }
185
+ render(width) {
186
+ const usable = Math.max(1, width);
187
+ const joined = this.segments.join(FLOW_SEPARATOR);
188
+ const packed = visibleWidth(joined);
189
+ if (this.cellWidth > usable || packed <= usable) {
190
+ return [packed <= usable ? joined : truncateToWidth(joined, usable, "...")];
191
+ }
192
+ const columnCount = Math.max(1, Math.floor((usable + FLOW_SEPARATOR_WIDTH) / (this.cellWidth + FLOW_SEPARATOR_WIDTH)));
193
+ const lines = [];
194
+ for (let start = 0; start < this.segments.length; start += columnCount) {
195
+ const row = this.segments.slice(start, start + columnCount);
196
+ lines.push(row
197
+ .map((segment, index) => {
198
+ if (index === row.length - 1)
199
+ return segment;
200
+ const padding = Math.max(0, this.cellWidth - visibleWidth(segment));
201
+ return `${segment}${padding > 0 ? " ".repeat(padding) : ""}${FLOW_SEPARATOR}`;
202
+ })
203
+ .join(""));
204
+ }
205
+ return lines;
206
+ }
207
+ invalidate() { }
161
208
  }
162
209
  function runHeader(run, index, theme) {
163
210
  const metrics = [run.model];
@@ -240,51 +287,59 @@ function fallbackResult(result, theme, isError) {
240
287
  const value = text?.type === "text" ? truncate(text.text, FALLBACK_OUTPUT_LIMIT) : "(no output)";
241
288
  return new Text(theme.fg(isError ? "error" : "muted", value), 0, 0);
242
289
  }
243
- function observeTiming(context) {
244
- const details = context.result?.details;
245
- const startedAt = details?.startedAt;
246
- if (typeof startedAt === "number" && Number.isFinite(startedAt)) {
247
- context.state.startedAt =
248
- context.state.startedAt === undefined ? startedAt : Math.min(context.state.startedAt, startedAt);
249
- }
250
- if (!context.isPartial && context.state.endedAt === undefined) {
251
- const endedAt = details?.endedAt;
252
- context.state.endedAt = typeof endedAt === "number" && Number.isFinite(endedAt) ? endedAt : Date.now();
253
- }
290
+ // Only genuinely running runs justify spinner-cadence repaints; queued runs
291
+ // show a static marker and pick the animation back up via runner updates.
292
+ function hasRunningRuns(runs) {
293
+ return runs.some((run) => run.status === "running");
254
294
  }
255
- // Re-render elapsed time and retry countdowns once per second while the
256
- // result is still partial; the first settled render clears the timer.
295
+ // Animate a collapsed flow at the spinner cadence while runs are active;
296
+ // otherwise re-render timing and retry text once per second. The first
297
+ // settled render clears the timer, and a cadence change (expand/collapse or
298
+ // the last run finishing) reschedules immediately instead of waiting out
299
+ // the previous interval.
257
300
  export function scheduleLiveRefresh(context, isPartial) {
258
301
  const state = context.state;
259
302
  if (isPartial) {
260
- if (state.refreshTimer === undefined) {
261
- state.refreshTimer = setTimeout(() => {
262
- state.refreshTimer = undefined;
263
- context.invalidate();
264
- }, 1000);
265
- state.refreshTimer.unref?.();
303
+ const details = context.result?.details;
304
+ const interval = !context.expanded && hasRunningRuns(details?.runs ?? []) ? SPINNER_INTERVAL_MS : ELAPSED_REFRESH_INTERVAL_MS;
305
+ if (state.refreshTimer !== undefined) {
306
+ // Keep a matching timer so unrelated re-renders cannot postpone the
307
+ // next tick; only reschedule when the desired cadence changes.
308
+ if (state.refreshInterval === interval)
309
+ return;
310
+ clearTimeout(state.refreshTimer);
266
311
  }
312
+ state.refreshInterval = interval;
313
+ state.refreshTimer = setTimeout(() => {
314
+ state.refreshTimer = undefined;
315
+ state.refreshInterval = undefined;
316
+ context.invalidate();
317
+ }, interval);
318
+ state.refreshTimer.unref?.();
267
319
  return;
268
320
  }
269
321
  if (state.refreshTimer !== undefined) {
270
322
  clearTimeout(state.refreshTimer);
271
323
  state.refreshTimer = undefined;
324
+ state.refreshInterval = undefined;
272
325
  }
273
326
  }
274
- export function renderSubagentCall(args, theme, context) {
327
+ export function renderSubagentCall(args, theme) {
275
328
  const count = Array.isArray(args.tasks) ? args.tasks.length : 0;
276
329
  const title = theme.fg(count > 0 ? "toolTitle" : "error", theme.bold("Subagent"));
277
- if (!context)
278
- return new Text(title, 0, 0);
279
- observeTiming(context);
280
- const metadata = [];
281
- const duration = elapsed(context.state.startedAt, context.state.endedAt);
330
+ return new Text(title, 0, 0);
331
+ }
332
+ /** Batch-level timing and cost live only in the expanded view. */
333
+ function batchSummaryLine(details, theme, isPartial) {
334
+ const parts = [];
335
+ const duration = elapsed(details.startedAt, details.endedAt);
282
336
  if (duration)
283
- metadata.push(duration);
284
- const cost = context.isPartial ? undefined : context.result?.details?.usage.cost;
285
- if (typeof cost === "number" && Number.isFinite(cost) && cost > 0)
286
- metadata.push(`$${cost.toFixed(3)}`);
287
- return new Text(`${title}${metadata.length > 0 ? theme.fg("dim", ` · ${metadata.join(" · ")}`) : ""}`, 0, 0);
337
+ parts.push(duration);
338
+ const cost = details.usage?.cost;
339
+ if (!isPartial && typeof cost === "number" && Number.isFinite(cost) && cost > 0)
340
+ parts.push(`$${cost.toFixed(3)}`);
341
+ const tasks = `${details.runs.length} task${details.runs.length === 1 ? "" : "s"}`;
342
+ return `${theme.fg("dim", `── Batch · ${tasks}`)}${parts.length > 0 ? `${theme.fg("dim", ` · ${parts.join(" · ")}`)}` : ""}`;
288
343
  }
289
344
  export function renderSubagentResult(result, options, theme, args, isError) {
290
345
  const details = result.details;
@@ -294,11 +349,12 @@ export function renderSubagentResult(result, options, theme, args, isError) {
294
349
  return new Text(theme.fg("muted", "Starting..."), 0, 0);
295
350
  const container = new Container();
296
351
  if (!options.expanded) {
297
- for (const [index, run] of details.runs.entries()) {
298
- container.addChild(new SingleLineText(taskRow(run, index, theme)));
299
- }
352
+ const now = Date.now();
353
+ container.addChild(new CollapsedFlow(details.runs.map((run, index) => flowSegment(run, index, theme, now))));
300
354
  return container;
301
355
  }
356
+ container.addChild(new SingleLineText(batchSummaryLine(details, theme, options.isPartial)));
357
+ container.addChild(new Spacer(1));
302
358
  for (const [index, run] of details.runs.entries()) {
303
359
  if (index > 0)
304
360
  container.addChild(new Spacer(1));
@@ -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, truncateToWidth } 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 { COMPACTION_ACTIVITY_ID, type SubagentAgentName } from \"./constants.ts\";\nimport type { SubagentParams } from \"./schema.ts\";\nimport { getSubagentRetryView } from \"./state.ts\";\nimport { plainLine, truncate } from \"./text.ts\";\nimport type { SubagentDetails, SubagentRunDetails, SubagentRunStatus, ToolActivity } from \"./types.ts\";\n\nconst ACTIVITY_RESULT_LIMIT = 96;\nconst RETRY_ERROR_LIMIT = 160;\nconst FALLBACK_OUTPUT_LIMIT = 4_000;\nconst ACTIVITY_DURATION_MIN_MS = 10_000;\nconst OUTPUT_TRUNCATION_NOTICE_PATTERN = /\\s*\\[Output truncated(?:: \\d+ bytes omitted)?\\.\\]\\s*$/u;\n\n/** Width-aware single-line text for compact rows and section headers. */\nclass SingleLineText implements Component {\n\tprivate readonly text: string;\n\n\tconstructor(text: string) {\n\t\tthis.text = text;\n\t}\n\n\trender(width: number): string[] {\n\t\treturn [truncateToWidth(this.text, Math.max(1, width), \"...\")];\n\t}\n\n\tinvalidate(): void {}\n}\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 sections fall back to the description.\n\tconst tasks = (args as Partial<SubagentParams>).tasks;\n\treturn tasks?.[index]?.prompt ?? run.description;\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 \"Thinking...\";\n\treturn \"Queued\";\n}\n\nfunction displayLine(text: string): string {\n\treturn plainLine(text).replace(OUTPUT_TRUNCATION_NOTICE_PATTERN, \"...\").trim();\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 (${retry.attempt}/${retry.maxAttempts}) now...`;\n\tconst error = truncate(displayLine(retry.error), RETRY_ERROR_LIMIT);\n\treturn error ? `${state} · ${error}` : state;\n}\n\nfunction replaceToolPrefix(text: string, toolName: string, label: string, emptyLabel = label): string {\n\tif (text === toolName) return emptyLabel;\n\tif (text.startsWith(`${toolName} `)) return `${label}${text.slice(toolName.length)}`;\n\treturn text;\n}\n\nfunction activitySummary(activity: ToolActivity): string {\n\tconst summary = displayLine(activity.summary);\n\tif (activity.toolName === COMPACTION_ACTIVITY_ID) {\n\t\treturn activity.status === \"running\" ? \"Compacting...\" : summary;\n\t}\n\tif (activity.toolName === \"bash\") return summary === \"bash\" ? \"Run\" : summary;\n\tif (activity.toolName === \"read\") return replaceToolPrefix(summary, \"read\", \"Read\");\n\tif (activity.toolName === \"grep\") return replaceToolPrefix(summary, \"grep\", \"Search\");\n\tif (activity.toolName === \"find\") return replaceToolPrefix(summary, \"find\", \"Find\");\n\tif (activity.toolName === \"ls\") return replaceToolPrefix(summary, \"ls\", \"List\", \"List .\");\n\tif (activity.toolName === \"edit\") return replaceToolPrefix(summary, \"edit\", \"Edit\");\n\tif (activity.toolName === \"write\") return replaceToolPrefix(summary, \"write\", \"Write\");\n\treturn summary || activity.toolName;\n}\n\nfunction latestRunningActivity(run: SubagentRunDetails, toolName?: string): ToolActivity | undefined {\n\tfor (let index = run.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = run.activities[index];\n\t\tif (activity?.status === \"running\" && (toolName === undefined || activity.toolName === toolName)) return activity;\n\t}\n\treturn undefined;\n}\n\nfunction fallbackCurrentActivity(run: SubagentRunDetails): string | undefined {\n\tif (!run.currentActivity) return undefined;\n\tconst current = displayLine(run.currentActivity);\n\tif (/^Compacting(?: context)?(?:…|\\.\\.\\.)?$/u.test(current)) return \"Compacting...\";\n\treturn current;\n}\n\nfunction runStateText(run: SubagentRunDetails): string {\n\tif (run.status === \"completed\" || run.status === \"failed\" || run.status === \"aborted\") {\n\t\tconst duration = elapsed(run.startedAt, run.endedAt);\n\t\treturn duration ? `${statusWord(run.status)} · ${duration}` : statusWord(run.status);\n\t}\n\n\tconst retry = retryText(run);\n\tif (retry) return retry;\n\tif (run.status === \"queued\") return \"Queued\";\n\n\tconst compaction = latestRunningActivity(run, COMPACTION_ACTIVITY_ID);\n\tif (compaction) return \"Compacting...\";\n\tconst activity = latestRunningActivity(run);\n\tif (activity) return activitySummary(activity);\n\tconst current = fallbackCurrentActivity(run);\n\tif (current) return current;\n\tif (run.status === \"running\" && run.usage.turns === 0 && run.usage.toolUses === 0) return \"Starting...\";\n\treturn statusWord(run.status);\n}\n\nfunction taskRow(run: SubagentRunDetails, index: number, theme: Theme): string {\n\treturn `${statusMarker(run.status, theme)} ${theme.fg(\"dim\", `#${index + 1}`)} ${theme.fg(\"accent\", profileLabel(run.agent))}${theme.fg(\"dim\", ` · ${runStateText(run)}`)}`;\n}\n\nfunction runHeader(run: SubagentRunDetails, index: number, theme: Theme): string {\n\tconst metrics = [run.model];\n\tif (run.thinking !== \"off\") metrics.push(run.thinking);\n\tif (run.cwd) metrics.push(`cwd: ${run.cwd}`);\n\tif (run.usage.toolUses) metrics.push(`${run.usage.toolUses} tool use${run.usage.toolUses === 1 ? \"\" : \"s\"}`);\n\tif (run.usage.turns) metrics.push(`${run.usage.turns} turn${run.usage.turns === 1 ? \"\" : \"s\"}`);\n\tconst duration = elapsed(run.startedAt, run.endedAt);\n\tif (duration) metrics.push(duration);\n\treturn `${theme.fg(\"dim\", `── #${index + 1} `)}${theme.fg(\"accent\", profileLabel(run.agent))}${theme.fg(\"dim\", ` · ${metrics.join(\" · \")}`)}`;\n}\n\nfunction activityLine(activity: ToolActivity, theme: Theme): string {\n\tconst summary = activitySummary(activity);\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(displayLine(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 addPrompt(\n\tcontainer: Container,\n\trun: SubagentRunDetails,\n\tindex: number,\n\targs: SubagentParams,\n\ttheme: Theme,\n): void {\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}\n\nfunction renderRunningRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new SingleLineText(runHeader(run, index, theme)));\n\taddPrompt(container, run, index, args, theme);\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\n\tconst retry = retryText(run);\n\tif (retry) {\n\t\tcontainer.addChild(new SingleLineText(`${statusMarker(run.status, theme)} ${theme.fg(\"toolOutput\", retry)}`));\n\t}\n\tfor (const activity of run.activities) container.addChild(new SingleLineText(activityLine(activity, theme)));\n\tif (!retry && run.activities.length === 0) {\n\t\tcontainer.addChild(new SingleLineText(theme.fg(\"dim\", ` ${runStateText(run)}`)));\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 SingleLineText(runHeader(run, index, theme)));\n\taddPrompt(container, run, index, args, theme);\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 and timing state owned by the shell's render context. */\nexport interface SubagentRenderState {\n\trefreshTimer?: ReturnType<typeof setTimeout>;\n\tstartedAt?: number;\n\tendedAt?: number;\n}\n\ntype SubagentToolRenderContext = ToolRenderContext<SubagentRenderState, SubagentParams, SubagentDetails>;\n\nfunction observeTiming(context: SubagentToolRenderContext): void {\n\tconst details = context.result?.details;\n\tconst startedAt = details?.startedAt;\n\tif (typeof startedAt === \"number\" && Number.isFinite(startedAt)) {\n\t\tcontext.state.startedAt =\n\t\t\tcontext.state.startedAt === undefined ? startedAt : Math.min(context.state.startedAt, startedAt);\n\t}\n\tif (!context.isPartial && context.state.endedAt === undefined) {\n\t\tconst endedAt = details?.endedAt;\n\t\tcontext.state.endedAt = typeof endedAt === \"number\" && Number.isFinite(endedAt) ? endedAt : Date.now();\n\t}\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, context?: SubagentToolRenderContext): Component {\n\tconst count = Array.isArray(args.tasks) ? args.tasks.length : 0;\n\tconst title = theme.fg(count > 0 ? \"toolTitle\" : \"error\", theme.bold(\"Subagent\"));\n\tif (!context) return new Text(title, 0, 0);\n\n\tobserveTiming(context);\n\tconst metadata: string[] = [];\n\tconst duration = elapsed(context.state.startedAt, context.state.endedAt);\n\tif (duration) metadata.push(duration);\n\tconst cost = context.isPartial ? undefined : context.result?.details?.usage.cost;\n\tif (typeof cost === \"number\" && Number.isFinite(cost) && cost > 0) metadata.push(`$${cost.toFixed(3)}`);\n\treturn new Text(`${title}${metadata.length > 0 ? theme.fg(\"dim\", ` · ${metadata.join(\" · \")}`) : \"\"}`, 0, 0);\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\", \"Starting...\"), 0, 0);\n\n\tconst container = new Container();\n\tif (!options.expanded) {\n\t\tfor (const [index, run] of details.runs.entries()) {\n\t\t\tcontainer.addChild(new SingleLineText(taskRow(run, index, theme)));\n\t\t}\n\t\treturn container;\n\t}\n\n\tfor (const [index, run] of details.runs.entries()) {\n\t\tif (index > 0) container.addChild(new Spacer(1));\n\t\tconst settled = run.status === \"completed\" || run.status === \"failed\" || run.status === \"aborted\";\n\t\tcontainer.addChild(\n\t\t\tsettled ? renderSettledRun(run, index, args, theme) : renderRunningRun(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 {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} 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 { COMPACTION_ACTIVITY_ID, type SubagentAgentName } from \"./constants.ts\";\nimport type { SubagentParams } from \"./schema.ts\";\nimport { getSubagentRetryView } from \"./state.ts\";\nimport { plainLine, truncate } from \"./text.ts\";\nimport type { SubagentDetails, SubagentRunDetails, SubagentRunStatus, ToolActivity } from \"./types.ts\";\n\nconst ACTIVITY_RESULT_LIMIT = 96;\nconst RETRY_ERROR_LIMIT = 160;\nconst FALLBACK_OUTPUT_LIMIT = 4_000;\nconst ACTIVITY_DURATION_MIN_MS = 10_000;\nconst OUTPUT_TRUNCATION_NOTICE_PATTERN = /\\s*\\[Output truncated(?:: \\d+ bytes omitted)?\\.\\]\\s*$/u;\n\n// A breathing dot-to-star bloom: the sequence plays forward to full bloom\n// and back, holding each extreme for two ticks. The mid frame uses ✼ rather\n// than the more common ✳ because U+2733 carries the Unicode Emoji property\n// and some terminals render it as a double-width color emoji.\nconst SPINNER_BLOOM = [\"·\", \"✢\", \"✼\", \"✶\", \"✻\", \"✽\"];\nconst SPINNER_FRAMES = [...SPINNER_BLOOM, ...[...SPINNER_BLOOM].reverse()];\nconst SPINNER_INTERVAL_MS = 120;\nconst ELAPSED_REFRESH_INTERVAL_MS = 1_000;\nconst FLOW_SEPARATOR = \" · \";\nconst FLOW_SEPARATOR_WIDTH = 3;\n\n/** Width-aware single-line text for compact rows and section headers. */\nclass SingleLineText implements Component {\n\tprivate readonly text: string;\n\n\tconstructor(text: string) {\n\t\tthis.text = text;\n\t}\n\n\trender(width: number): string[] {\n\t\treturn [truncateToWidth(this.text, Math.max(1, width), \"...\")];\n\t}\n\n\tinvalidate(): void {}\n}\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 sections fall back to the description.\n\tconst tasks = (args as Partial<SubagentParams>).tasks;\n\treturn tasks?.[index]?.prompt ?? run.description;\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 \"Thinking...\";\n\treturn \"Queued\";\n}\n\nfunction displayLine(text: string): string {\n\treturn plainLine(text).replace(OUTPUT_TRUNCATION_NOTICE_PATTERN, \"...\").trim();\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 (${retry.attempt}/${retry.maxAttempts}) now...`;\n\tconst error = truncate(displayLine(retry.error), RETRY_ERROR_LIMIT);\n\treturn error ? `${state} · ${error}` : state;\n}\n\nfunction replaceToolPrefix(text: string, toolName: string, label: string, emptyLabel = label): string {\n\tif (text === toolName) return emptyLabel;\n\tif (text.startsWith(`${toolName} `)) return `${label}${text.slice(toolName.length)}`;\n\treturn text;\n}\n\nfunction activitySummary(activity: ToolActivity): string {\n\tconst summary = displayLine(activity.summary);\n\tif (activity.toolName === COMPACTION_ACTIVITY_ID) {\n\t\treturn activity.status === \"running\" ? \"Compacting...\" : summary;\n\t}\n\tif (activity.toolName === \"bash\") return summary === \"bash\" ? \"Run\" : summary;\n\tif (activity.toolName === \"read\") return replaceToolPrefix(summary, \"read\", \"Read\");\n\tif (activity.toolName === \"grep\") return replaceToolPrefix(summary, \"grep\", \"Search\");\n\tif (activity.toolName === \"find\") return replaceToolPrefix(summary, \"find\", \"Find\");\n\tif (activity.toolName === \"ls\") return replaceToolPrefix(summary, \"ls\", \"List\", \"List .\");\n\tif (activity.toolName === \"edit\") return replaceToolPrefix(summary, \"edit\", \"Edit\");\n\tif (activity.toolName === \"write\") return replaceToolPrefix(summary, \"write\", \"Write\");\n\treturn summary || activity.toolName;\n}\n\nfunction latestRunningActivity(run: SubagentRunDetails, toolName?: string): ToolActivity | undefined {\n\tfor (let index = run.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = run.activities[index];\n\t\tif (activity?.status === \"running\" && (toolName === undefined || activity.toolName === toolName)) return activity;\n\t}\n\treturn undefined;\n}\n\nfunction fallbackCurrentActivity(run: SubagentRunDetails): string | undefined {\n\tif (!run.currentActivity) return undefined;\n\tconst current = displayLine(run.currentActivity);\n\tif (/^Compacting(?: context)?(?:…|\\.\\.\\.)?$/u.test(current)) return \"Compacting...\";\n\treturn current;\n}\n\nfunction runStateText(run: SubagentRunDetails): string {\n\tif (run.status === \"completed\" || run.status === \"failed\" || run.status === \"aborted\") {\n\t\tconst duration = elapsed(run.startedAt, run.endedAt);\n\t\treturn duration ? `${statusWord(run.status)} · ${duration}` : statusWord(run.status);\n\t}\n\n\tconst retry = retryText(run);\n\tif (retry) return retry;\n\tif (run.status === \"queued\") return \"Queued\";\n\n\tconst compaction = latestRunningActivity(run, COMPACTION_ACTIVITY_ID);\n\tif (compaction) return \"Compacting...\";\n\tconst activity = latestRunningActivity(run);\n\tif (activity) return activitySummary(activity);\n\tconst current = fallbackCurrentActivity(run);\n\tif (current) return current;\n\tif (run.status === \"running\" && run.usage.turns === 0 && run.usage.toolUses === 0) return \"Starting...\";\n\treturn statusWord(run.status);\n}\n\nfunction spinnerGlyph(now: number): string {\n\tconst frame = Math.floor(now / SPINNER_INTERVAL_MS) % SPINNER_FRAMES.length;\n\treturn SPINNER_FRAMES[frame] ?? SPINNER_FRAMES[0] ?? \"\";\n}\n\n/** One collapsed cell: status glyph, ordinal, and profile label only. */\nfunction flowSegment(run: SubagentRunDetails, index: number, theme: Theme, now: number): string {\n\tconst marker = run.status === \"running\" ? theme.fg(\"accent\", spinnerGlyph(now)) : statusMarker(run.status, theme);\n\treturn `${marker} ${theme.fg(\"dim\", `#${index + 1}`)} ${theme.fg(\"accent\", profileLabel(run.agent))}`;\n}\n\n/** Collapsed batch flow: one cell per run, wrapped at cell boundaries with\n * uniform cell widths so continuation rows keep their columns aligned. */\nclass CollapsedFlow implements Component {\n\tprivate readonly segments: string[];\n\tprivate readonly cellWidth: number;\n\n\tconstructor(segments: string[]) {\n\t\tthis.segments = segments;\n\t\tthis.cellWidth = segments.reduce((max, segment) => Math.max(max, visibleWidth(segment)), 1);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst usable = Math.max(1, width);\n\t\tconst joined = this.segments.join(FLOW_SEPARATOR);\n\t\tconst packed = visibleWidth(joined);\n\t\tif (this.cellWidth > usable || packed <= usable) {\n\t\t\treturn [packed <= usable ? joined : truncateToWidth(joined, usable, \"...\")];\n\t\t}\n\t\tconst columnCount = Math.max(\n\t\t\t1,\n\t\t\tMath.floor((usable + FLOW_SEPARATOR_WIDTH) / (this.cellWidth + FLOW_SEPARATOR_WIDTH)),\n\t\t);\n\t\tconst lines: string[] = [];\n\t\tfor (let start = 0; start < this.segments.length; start += columnCount) {\n\t\t\tconst row = this.segments.slice(start, start + columnCount);\n\t\t\tlines.push(\n\t\t\t\trow\n\t\t\t\t\t.map((segment, index) => {\n\t\t\t\t\t\tif (index === row.length - 1) return segment;\n\t\t\t\t\t\tconst padding = Math.max(0, this.cellWidth - visibleWidth(segment));\n\t\t\t\t\t\treturn `${segment}${padding > 0 ? \" \".repeat(padding) : \"\"}${FLOW_SEPARATOR}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\"\"),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction runHeader(run: SubagentRunDetails, index: number, theme: Theme): string {\n\tconst metrics = [run.model];\n\tif (run.thinking !== \"off\") metrics.push(run.thinking);\n\tif (run.cwd) metrics.push(`cwd: ${run.cwd}`);\n\tif (run.usage.toolUses) metrics.push(`${run.usage.toolUses} tool use${run.usage.toolUses === 1 ? \"\" : \"s\"}`);\n\tif (run.usage.turns) metrics.push(`${run.usage.turns} turn${run.usage.turns === 1 ? \"\" : \"s\"}`);\n\tconst duration = elapsed(run.startedAt, run.endedAt);\n\tif (duration) metrics.push(duration);\n\treturn `${theme.fg(\"dim\", `── #${index + 1} `)}${theme.fg(\"accent\", profileLabel(run.agent))}${theme.fg(\"dim\", ` · ${metrics.join(\" · \")}`)}`;\n}\n\nfunction activityLine(activity: ToolActivity, theme: Theme): string {\n\tconst summary = activitySummary(activity);\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(displayLine(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 addPrompt(\n\tcontainer: Container,\n\trun: SubagentRunDetails,\n\tindex: number,\n\targs: SubagentParams,\n\ttheme: Theme,\n): void {\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}\n\nfunction renderRunningRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new SingleLineText(runHeader(run, index, theme)));\n\taddPrompt(container, run, index, args, theme);\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\n\tconst retry = retryText(run);\n\tif (retry) {\n\t\tcontainer.addChild(new SingleLineText(`${statusMarker(run.status, theme)} ${theme.fg(\"toolOutput\", retry)}`));\n\t}\n\tfor (const activity of run.activities) container.addChild(new SingleLineText(activityLine(activity, theme)));\n\tif (!retry && run.activities.length === 0) {\n\t\tcontainer.addChild(new SingleLineText(theme.fg(\"dim\", ` ${runStateText(run)}`)));\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 SingleLineText(runHeader(run, index, theme)));\n\taddPrompt(container, run, index, args, theme);\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\t/** Cadence the current timer was created with, used to detect changes. */\n\trefreshInterval?: number;\n}\n\ntype SubagentToolRenderContext = ToolRenderContext<SubagentRenderState, SubagentParams, SubagentDetails>;\n\n// Only genuinely running runs justify spinner-cadence repaints; queued runs\n// show a static marker and pick the animation back up via runner updates.\nfunction hasRunningRuns(runs: SubagentRunDetails[]): boolean {\n\treturn runs.some((run) => run.status === \"running\");\n}\n\n// Animate a collapsed flow at the spinner cadence while runs are active;\n// otherwise re-render timing and retry text once per second. The first\n// settled render clears the timer, and a cadence change (expand/collapse or\n// the last run finishing) reschedules immediately instead of waiting out\n// the previous interval.\nexport function scheduleLiveRefresh(context: SubagentToolRenderContext, isPartial: boolean): void {\n\tconst state = context.state;\n\tif (isPartial) {\n\t\tconst details = context.result?.details;\n\t\tconst interval =\n\t\t\t!context.expanded && hasRunningRuns(details?.runs ?? []) ? SPINNER_INTERVAL_MS : ELAPSED_REFRESH_INTERVAL_MS;\n\t\tif (state.refreshTimer !== undefined) {\n\t\t\t// Keep a matching timer so unrelated re-renders cannot postpone the\n\t\t\t// next tick; only reschedule when the desired cadence changes.\n\t\t\tif (state.refreshInterval === interval) return;\n\t\t\tclearTimeout(state.refreshTimer);\n\t\t}\n\t\tstate.refreshInterval = interval;\n\t\tstate.refreshTimer = setTimeout(() => {\n\t\t\tstate.refreshTimer = undefined;\n\t\t\tstate.refreshInterval = undefined;\n\t\t\tcontext.invalidate();\n\t\t}, interval);\n\t\tstate.refreshTimer.unref?.();\n\t\treturn;\n\t}\n\tif (state.refreshTimer !== undefined) {\n\t\tclearTimeout(state.refreshTimer);\n\t\tstate.refreshTimer = undefined;\n\t\tstate.refreshInterval = 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 title = theme.fg(count > 0 ? \"toolTitle\" : \"error\", theme.bold(\"Subagent\"));\n\treturn new Text(title, 0, 0);\n}\n\n/** Batch-level timing and cost live only in the expanded view. */\nfunction batchSummaryLine(details: SubagentDetails, theme: Theme, isPartial: boolean): string {\n\tconst parts: string[] = [];\n\tconst duration = elapsed(details.startedAt, details.endedAt);\n\tif (duration) parts.push(duration);\n\tconst cost = details.usage?.cost;\n\tif (!isPartial && typeof cost === \"number\" && Number.isFinite(cost) && cost > 0) parts.push(`$${cost.toFixed(3)}`);\n\tconst tasks = `${details.runs.length} task${details.runs.length === 1 ? \"\" : \"s\"}`;\n\treturn `${theme.fg(\"dim\", `── Batch · ${tasks}`)}${parts.length > 0 ? `${theme.fg(\"dim\", ` · ${parts.join(\" · \")}`)}` : \"\"}`;\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\", \"Starting...\"), 0, 0);\n\n\tconst container = new Container();\n\tif (!options.expanded) {\n\t\tconst now = Date.now();\n\t\tcontainer.addChild(new CollapsedFlow(details.runs.map((run, index) => flowSegment(run, index, theme, now))));\n\t\treturn container;\n\t}\n\n\tcontainer.addChild(new SingleLineText(batchSummaryLine(details, theme, options.isPartial)));\n\tcontainer.addChild(new Spacer(1));\n\tfor (const [index, run] of details.runs.entries()) {\n\t\tif (index > 0) container.addChild(new Spacer(1));\n\t\tconst settled = run.status === \"completed\" || run.status === \"failed\" || run.status === \"aborted\";\n\t\tcontainer.addChild(\n\t\t\tsettled ? renderSettledRun(run, index, args, theme) : renderRunningRun(run, index, args, theme),\n\t\t);\n\t}\n\treturn container;\n}\n"]}
@@ -26,7 +26,7 @@ agent? explorer or general; defaults to explorer
26
26
  cwd? Directory inside the parent working directory
27
27
  ```
28
28
 
29
- There is no separate single-task or parallel mode. One item launches one worker; multiple items launch concurrent workers. A session-scoped gate permits at most five active workers across all sibling `subagent` calls, so additional items wait for a slot. Results always follow input order, regardless of completion order.
29
+ There is no separate single-task or parallel mode. One item launches one worker; multiple items launch concurrent workers. A session-scoped gate permits at most six active workers across all sibling `subagent` calls, so additional items wait for a slot. Results always follow input order, regardless of completion order.
30
30
 
31
31
  All tasks are preflighted before any worker starts. Profile, working-directory, model, thinking-level, or authentication failure in one item rejects the entire call without launching the other workers. Once execution begins, one worker failing does not cancel independent siblings.
32
32
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@astralyn/pi",
3
- "version": "0.84.10",
3
+ "version": "0.84.11",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@astralyn/pi",
9
- "version": "0.84.10",
9
+ "version": "0.84.11",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@earendil-works/pi-agent-core": "0.84.3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astralyn/pi",
3
- "version": "0.84.10",
3
+ "version": "0.84.11",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {