@astralyn/pi 0.84.11 → 0.84.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/cli/startup-ui.d.ts.map +1 -1
  3. package/dist/cli/startup-ui.js +2 -1
  4. package/dist/cli/startup-ui.js.map +1 -1
  5. package/dist/core/agent-session.d.ts +62 -8
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +395 -78
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  10. package/dist/core/compaction/branch-summarization.js +4 -3
  11. package/dist/core/compaction/branch-summarization.js.map +1 -1
  12. package/dist/core/compaction/compaction.d.ts +5 -0
  13. package/dist/core/compaction/compaction.d.ts.map +1 -1
  14. package/dist/core/compaction/compaction.js +19 -5
  15. package/dist/core/compaction/compaction.js.map +1 -1
  16. package/dist/core/extensions/index.d.ts +1 -1
  17. package/dist/core/extensions/index.d.ts.map +1 -1
  18. package/dist/core/extensions/index.js.map +1 -1
  19. package/dist/core/extensions/runner.d.ts +5 -0
  20. package/dist/core/extensions/runner.d.ts.map +1 -1
  21. package/dist/core/extensions/runner.js +44 -1
  22. package/dist/core/extensions/runner.js.map +1 -1
  23. package/dist/core/extensions/types.d.ts +18 -10
  24. package/dist/core/extensions/types.d.ts.map +1 -1
  25. package/dist/core/extensions/types.js.map +1 -1
  26. package/dist/core/session-manager.d.ts.map +1 -1
  27. package/dist/core/session-manager.js +4 -2
  28. package/dist/core/session-manager.js.map +1 -1
  29. package/dist/core/settings-manager.d.ts +8 -1
  30. package/dist/core/settings-manager.d.ts.map +1 -1
  31. package/dist/core/settings-manager.js +17 -0
  32. package/dist/core/settings-manager.js.map +1 -1
  33. package/dist/core/tools/bash.d.ts +5 -0
  34. package/dist/core/tools/bash.d.ts.map +1 -1
  35. package/dist/core/tools/bash.js +5 -1
  36. package/dist/core/tools/bash.js.map +1 -1
  37. package/dist/extensions/background/actions.d.ts +21 -0
  38. package/dist/extensions/background/actions.d.ts.map +1 -0
  39. package/dist/extensions/background/actions.js +264 -0
  40. package/dist/extensions/background/actions.js.map +1 -0
  41. package/dist/extensions/background/constants.d.ts +24 -0
  42. package/dist/extensions/background/constants.d.ts.map +1 -0
  43. package/dist/extensions/background/constants.js +24 -0
  44. package/dist/extensions/background/constants.js.map +1 -0
  45. package/dist/extensions/background/index.d.ts +6 -115
  46. package/dist/extensions/background/index.d.ts.map +1 -1
  47. package/dist/extensions/background/index.js +38 -509
  48. package/dist/extensions/background/index.js.map +1 -1
  49. package/dist/extensions/background/manager.d.ts +2 -1
  50. package/dist/extensions/background/manager.d.ts.map +1 -1
  51. package/dist/extensions/background/manager.js +8 -10
  52. package/dist/extensions/background/manager.js.map +1 -1
  53. package/dist/extensions/background/notify.d.ts +16 -0
  54. package/dist/extensions/background/notify.d.ts.map +1 -0
  55. package/dist/extensions/background/notify.js +114 -0
  56. package/dist/extensions/background/notify.js.map +1 -0
  57. package/dist/extensions/background/output-file.d.ts +58 -0
  58. package/dist/extensions/background/output-file.d.ts.map +1 -0
  59. package/dist/extensions/background/output-file.js +122 -0
  60. package/dist/extensions/background/output-file.js.map +1 -0
  61. package/dist/extensions/background/registry.d.ts +40 -72
  62. package/dist/extensions/background/registry.d.ts.map +1 -1
  63. package/dist/extensions/background/registry.js +71 -184
  64. package/dist/extensions/background/registry.js.map +1 -1
  65. package/dist/extensions/background/render.d.ts +3 -10
  66. package/dist/extensions/background/render.d.ts.map +1 -1
  67. package/dist/extensions/background/render.js +20 -60
  68. package/dist/extensions/background/render.js.map +1 -1
  69. package/dist/extensions/background/schema.d.ts +34 -0
  70. package/dist/extensions/background/schema.d.ts.map +1 -0
  71. package/dist/extensions/background/schema.js +89 -0
  72. package/dist/extensions/background/schema.js.map +1 -0
  73. package/dist/extensions/background/task-view.d.ts +48 -0
  74. package/dist/extensions/background/task-view.d.ts.map +1 -0
  75. package/dist/extensions/background/task-view.js +90 -0
  76. package/dist/extensions/background/task-view.js.map +1 -0
  77. package/dist/extensions/background/text.d.ts +15 -0
  78. package/dist/extensions/background/text.d.ts.map +1 -0
  79. package/dist/extensions/background/text.js +31 -0
  80. package/dist/extensions/background/text.js.map +1 -0
  81. package/dist/extensions/background/types.d.ts +74 -0
  82. package/dist/extensions/background/types.d.ts.map +1 -0
  83. package/dist/extensions/background/types.js +17 -0
  84. package/dist/extensions/background/types.js.map +1 -0
  85. package/dist/extensions/index.d.ts.map +1 -1
  86. package/dist/extensions/index.js +2 -0
  87. package/dist/extensions/index.js.map +1 -1
  88. package/dist/extensions/llama/client.d.ts +6 -0
  89. package/dist/extensions/llama/client.d.ts.map +1 -1
  90. package/dist/extensions/llama/client.js +7 -0
  91. package/dist/extensions/llama/client.js.map +1 -1
  92. package/dist/extensions/llama/provider.d.ts +3 -1
  93. package/dist/extensions/llama/provider.d.ts.map +1 -1
  94. package/dist/extensions/llama/provider.js +27 -6
  95. package/dist/extensions/llama/provider.js.map +1 -1
  96. package/dist/extensions/subagent/activity.d.ts +5 -0
  97. package/dist/extensions/subagent/activity.d.ts.map +1 -1
  98. package/dist/extensions/subagent/activity.js +5 -0
  99. package/dist/extensions/subagent/activity.js.map +1 -1
  100. package/dist/extensions/subagent/agents-command.d.ts.map +1 -1
  101. package/dist/extensions/subagent/agents-command.js +6 -391
  102. package/dist/extensions/subagent/agents-command.js.map +1 -1
  103. package/dist/extensions/subagent/constants.d.ts.map +1 -1
  104. package/dist/extensions/subagent/constants.js +1 -0
  105. package/dist/extensions/subagent/constants.js.map +1 -1
  106. package/dist/extensions/subagent/render.d.ts.map +1 -1
  107. package/dist/extensions/subagent/render.js +15 -1
  108. package/dist/extensions/subagent/render.js.map +1 -1
  109. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  110. package/dist/extensions/subagent/resolve.js +2 -4
  111. package/dist/extensions/subagent/resolve.js.map +1 -1
  112. package/dist/extensions/subagent/runner.d.ts +1 -1
  113. package/dist/extensions/subagent/runner.d.ts.map +1 -1
  114. package/dist/extensions/subagent/runner.js +8 -8
  115. package/dist/extensions/subagent/runner.js.map +1 -1
  116. package/dist/extensions/subagent/sdk-runner.d.ts +11 -0
  117. package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
  118. package/dist/extensions/subagent/sdk-runner.js +90 -79
  119. package/dist/extensions/subagent/sdk-runner.js.map +1 -1
  120. package/dist/extensions/subagent/state.d.ts.map +1 -1
  121. package/dist/extensions/subagent/state.js +145 -126
  122. package/dist/extensions/subagent/state.js.map +1 -1
  123. package/dist/extensions/subagent/text.d.ts.map +1 -1
  124. package/dist/extensions/subagent/text.js +4 -0
  125. package/dist/extensions/subagent/text.js.map +1 -1
  126. package/dist/extensions/subagent/ui/agents-dialog.d.ts +4 -0
  127. package/dist/extensions/subagent/ui/agents-dialog.d.ts.map +1 -0
  128. package/dist/extensions/subagent/ui/agents-dialog.js +84 -0
  129. package/dist/extensions/subagent/ui/agents-dialog.js.map +1 -0
  130. package/dist/extensions/subagent/ui/choice-menu.d.ts +39 -0
  131. package/dist/extensions/subagent/ui/choice-menu.d.ts.map +1 -0
  132. package/dist/extensions/subagent/ui/choice-menu.js +93 -0
  133. package/dist/extensions/subagent/ui/choice-menu.js.map +1 -0
  134. package/dist/extensions/subagent/ui/model-picker.d.ts +47 -0
  135. package/dist/extensions/subagent/ui/model-picker.d.ts.map +1 -0
  136. package/dist/extensions/subagent/ui/model-picker.js +142 -0
  137. package/dist/extensions/subagent/ui/model-picker.js.map +1 -0
  138. package/dist/extensions/subagent/ui/profile-settings-menu.d.ts +41 -0
  139. package/dist/extensions/subagent/ui/profile-settings-menu.d.ts.map +1 -0
  140. package/dist/extensions/subagent/ui/profile-settings-menu.js +98 -0
  141. package/dist/extensions/subagent/ui/profile-settings-menu.js.map +1 -0
  142. package/dist/extensions/web-search/auth.d.ts +12 -0
  143. package/dist/extensions/web-search/auth.d.ts.map +1 -0
  144. package/dist/extensions/web-search/auth.js +90 -0
  145. package/dist/extensions/web-search/auth.js.map +1 -0
  146. package/dist/extensions/web-search/constants.d.ts +13 -0
  147. package/dist/extensions/web-search/constants.d.ts.map +1 -0
  148. package/dist/extensions/web-search/constants.js +27 -0
  149. package/dist/extensions/web-search/constants.js.map +1 -0
  150. package/dist/extensions/web-search/fusion.d.ts +36 -0
  151. package/dist/extensions/web-search/fusion.d.ts.map +1 -0
  152. package/dist/extensions/web-search/fusion.js +272 -0
  153. package/dist/extensions/web-search/fusion.js.map +1 -0
  154. package/dist/extensions/web-search/index.d.ts +6 -0
  155. package/dist/extensions/web-search/index.d.ts.map +1 -0
  156. package/dist/extensions/web-search/index.js +70 -0
  157. package/dist/extensions/web-search/index.js.map +1 -0
  158. package/dist/extensions/web-search/providers/deepseek.d.ts +15 -0
  159. package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -0
  160. package/dist/extensions/web-search/providers/deepseek.js +63 -0
  161. package/dist/extensions/web-search/providers/deepseek.js.map +1 -0
  162. package/dist/extensions/web-search/providers/http.d.ts +9 -0
  163. package/dist/extensions/web-search/providers/http.d.ts.map +1 -0
  164. package/dist/extensions/web-search/providers/http.js +25 -0
  165. package/dist/extensions/web-search/providers/http.js.map +1 -0
  166. package/dist/extensions/web-search/providers/minimax.d.ts +14 -0
  167. package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -0
  168. package/dist/extensions/web-search/providers/minimax.js +69 -0
  169. package/dist/extensions/web-search/providers/minimax.js.map +1 -0
  170. package/dist/extensions/web-search/render.d.ts +11 -0
  171. package/dist/extensions/web-search/render.d.ts.map +1 -0
  172. package/dist/extensions/web-search/render.js +109 -0
  173. package/dist/extensions/web-search/render.js.map +1 -0
  174. package/dist/extensions/web-search/schema.d.ts +12 -0
  175. package/dist/extensions/web-search/schema.d.ts.map +1 -0
  176. package/dist/extensions/web-search/schema.js +57 -0
  177. package/dist/extensions/web-search/schema.js.map +1 -0
  178. package/dist/extensions/web-search/types.d.ts +111 -0
  179. package/dist/extensions/web-search/types.d.ts.map +1 -0
  180. package/dist/extensions/web-search/types.js +5 -0
  181. package/dist/extensions/web-search/types.js.map +1 -0
  182. package/dist/index.d.ts +2 -1
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.js +1 -0
  185. package/dist/index.js.map +1 -1
  186. package/dist/main.d.ts.map +1 -1
  187. package/dist/main.js +2 -0
  188. package/dist/main.js.map +1 -1
  189. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  190. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  191. package/dist/modes/interactive/components/settings-selector.js +10 -0
  192. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  193. package/dist/modes/interactive/interactive-mode.d.ts +4 -0
  194. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  195. package/dist/modes/interactive/interactive-mode.js +71 -58
  196. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  197. package/dist/modes/rpc/rpc-client.d.ts +7 -0
  198. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  199. package/dist/modes/rpc/rpc-client.js +7 -0
  200. package/dist/modes/rpc/rpc-client.js.map +1 -1
  201. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  202. package/dist/modes/rpc/rpc-mode.js +3 -0
  203. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  204. package/dist/modes/rpc/rpc-types.d.ts +12 -0
  205. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  206. package/dist/modes/rpc/rpc-types.js.map +1 -1
  207. package/dist/utils/shell.d.ts.map +1 -1
  208. package/dist/utils/shell.js +6 -4
  209. package/dist/utils/shell.js.map +1 -1
  210. package/docs/bundled/README.md +1 -0
  211. package/docs/bundled/extensions/web-search.md +50 -0
  212. package/docs/compaction.md +5 -12
  213. package/docs/environment-variables.md +3 -0
  214. package/docs/extensions.md +21 -5
  215. package/docs/keybindings.md +1 -1
  216. package/docs/quickstart.md +1 -1
  217. package/docs/rpc.md +23 -0
  218. package/docs/settings.md +7 -0
  219. package/docs/terminal-setup.md +12 -0
  220. package/docs/usage.md +4 -3
  221. package/npm-shrinkwrap.json +29 -29
  222. package/package.json +6 -6
  223. package/dist/core/compaction-controller.d.ts +0 -90
  224. package/dist/core/compaction-controller.d.ts.map +0 -1
  225. package/dist/core/compaction-controller.js +0 -471
  226. package/dist/core/compaction-controller.js.map +0 -1
@@ -170,9 +170,23 @@ function spinnerGlyph(now) {
170
170
  const frame = Math.floor(now / SPINNER_INTERVAL_MS) % SPINNER_FRAMES.length;
171
171
  return SPINNER_FRAMES[frame] ?? SPINNER_FRAMES[0] ?? "";
172
172
  }
173
+ // All spinner and status glyphs are single-width characters; this constant
174
+ // documents the expectation and guards against accidental double-width
175
+ // substitutions causing layout flicker in the collapsed flow.
176
+ const MARKER_WIDTH = 1;
173
177
  /** One collapsed cell: status glyph, ordinal, and profile label only. */
174
178
  function flowSegment(run, index, theme, now) {
175
- const marker = run.status === "running" ? theme.fg("accent", spinnerGlyph(now)) : statusMarker(run.status, theme);
179
+ let marker;
180
+ if (run.status === "running") {
181
+ const glyph = spinnerGlyph(now);
182
+ // Pad to MARKER_WIDTH so cellWidth stays stable across frames even if
183
+ // a glyph measures wider on some terminal/font combinations.
184
+ const pad = Math.max(0, MARKER_WIDTH - visibleWidth(glyph));
185
+ marker = theme.fg("accent", glyph) + (pad > 0 ? " ".repeat(pad) : "");
186
+ }
187
+ else {
188
+ marker = statusMarker(run.status, theme);
189
+ }
176
190
  return `${marker} ${theme.fg("dim", `#${index + 1}`)} ${theme.fg("accent", profileLabel(run.agent))}`;
177
191
  }
178
192
  /** Collapsed batch flow: one cell per run, wrapped at cell boundaries with
@@ -1 +1 @@
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"]}
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// All spinner and status glyphs are single-width characters; this constant\n// documents the expectation and guards against accidental double-width\n// substitutions causing layout flicker in the collapsed flow.\nconst MARKER_WIDTH = 1;\n\n/** One collapsed cell: status glyph, ordinal, and profile label only. */\nfunction flowSegment(run: SubagentRunDetails, index: number, theme: Theme, now: number): string {\n\tlet marker: string;\n\tif (run.status === \"running\") {\n\t\tconst glyph = spinnerGlyph(now);\n\t\t// Pad to MARKER_WIDTH so cellWidth stays stable across frames even if\n\t\t// a glyph measures wider on some terminal/font combinations.\n\t\tconst pad = Math.max(0, MARKER_WIDTH - visibleWidth(glyph));\n\t\tmarker = theme.fg(\"accent\", glyph) + (pad > 0 ? \" \".repeat(pad) : \"\");\n\t} else {\n\t\tmarker = statusMarker(run.status, theme);\n\t}\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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,GAAG,EAAsB,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAExF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAA2B,MAAM,YAAY,CAAC;AAEpG,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,GAAG,mBAAmB,CAAC,CAAC;CAClF;AAoBD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAqB1F;AA+BD,wBAAsB,mBAAmB,CACxC,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,kBAAkB,EAC1B,cAAc,SAAgB,EAC9B,eAAe,CAAC,EAAE,kBAAkB,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAkB/B"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,GAAG,EAAsB,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAExF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAA2B,MAAM,YAAY,CAAC;AAEpG,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,GAAG,mBAAmB,CAAC,CAAC;CAClF;AAkBD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAqB1F;AA+BD,wBAAsB,mBAAmB,CACxC,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,kBAAkB,EAC1B,cAAc,SAAgB,EAC9B,eAAe,CAAC,EAAE,kBAAkB,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAkB/B"}
@@ -18,11 +18,9 @@ function isWithin(parent, child) {
18
18
  const normalizedParent = process.platform === "win32" ? parent.toLowerCase() : parent;
19
19
  const normalizedChild = process.platform === "win32" ? child.toLowerCase() : child;
20
20
  const rest = relative(normalizedParent, normalizedChild);
21
- return rest === "" || (rest !== ".." && !rest.startsWith(`..${requirePathSeparator()}`) && !isAbsolute(rest));
22
- }
23
- function requirePathSeparator() {
24
- return process.platform === "win32" ? "\\" : "/";
21
+ return rest === "" || (rest !== ".." && !rest.startsWith(`..${PATH_SEP}`) && !isAbsolute(rest));
25
22
  }
23
+ const PATH_SEP = process.platform === "win32" ? "\\" : "/";
26
24
  export function resolveTaskCwd(parentCwd, requestedCwd) {
27
25
  const value = normalizeCwdInput(requestedCwd);
28
26
  // Models routinely echo the parent working directory back as an absolute
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/extensions/subagent/resolve.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, realpathSync, statSync } from \"node:fs\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { type Api, clampThinkingLevel, type Model } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ModelRegistry } from \"../../core/model-registry.ts\";\nimport { AGENT_PROFILES } from \"./agents.ts\";\nimport { findAvailableModel } from \"./model-selection.ts\";\nimport type { SubagentTask } from \"./schema.ts\";\nimport { loadSubagentConfig } from \"./settings.ts\";\nimport { firstPlainLine } from \"./text.ts\";\nimport type { ResolvedSubagentTask, SubagentConfigFile, SubagentProfileOverride } from \"./types.ts\";\n\nexport interface ParentModelContext {\n\tmodel: Model<Api> | undefined;\n\tthinking: ThinkingLevel;\n\tmodelRegistry: Pick<ModelRegistry, \"find\" | \"getAvailable\" | \"hasConfiguredAuth\">;\n}\n\nfunction normalizeCwdInput(value: string | undefined): string | undefined {\n\tif (value === undefined) return undefined;\n\tconst trimmed = value.trim();\n\tif (!trimmed) throw new Error(\"cwd must not be empty.\");\n\treturn trimmed.startsWith(\"@\") ? trimmed.slice(1) : trimmed;\n}\n\nfunction isWithin(parent: string, child: string): boolean {\n\tconst normalizedParent = process.platform === \"win32\" ? parent.toLowerCase() : parent;\n\tconst normalizedChild = process.platform === \"win32\" ? child.toLowerCase() : child;\n\tconst rest = relative(normalizedParent, normalizedChild);\n\treturn rest === \"\" || (rest !== \"..\" && !rest.startsWith(`..${requirePathSeparator()}`) && !isAbsolute(rest));\n}\n\nfunction requirePathSeparator(): string {\n\treturn process.platform === \"win32\" ? \"\\\\\" : \"/\";\n}\n\nexport function resolveTaskCwd(parentCwd: string, requestedCwd: string | undefined): string {\n\tconst value = normalizeCwdInput(requestedCwd);\n\t// Models routinely echo the parent working directory back as an absolute\n\t// path; accept an absolute cwd that stays inside the parent instead of\n\t// failing the whole task over path style.\n\tconst absolute = value !== undefined && isAbsolute(value);\n\tconst candidate = absolute ? resolve(value) : resolve(parentCwd, value ?? \".\");\n\t// Relative inputs get a lexical traversal check before touching the file\n\t// system. Absolute inputs may use the real spelling of a symlinked parent,\n\t// so their containment is decided by the canonical check below.\n\tif (!absolute && !isWithin(resolve(parentCwd), candidate))\n\t\tthrow new Error(`Subagent cwd escapes the parent working directory: ${requestedCwd}`);\n\tif (!existsSync(candidate) || !statSync(candidate).isDirectory())\n\t\tthrow new Error(`Subagent cwd is not a directory: ${candidate}`);\n\tconst realParent = realpathSync(parentCwd);\n\tconst realCandidate = realpathSync(candidate);\n\tif (!isWithin(realParent, realCandidate)) {\n\t\tif (absolute) throw new Error(\"cwd must stay inside the parent working directory.\");\n\t\tthrow new Error(`Subagent cwd escapes the parent working directory: ${requestedCwd}`);\n\t}\n\treturn realCandidate;\n}\n\n// Exactly two layers: a /agents override wins, otherwise the subagent\n// inherits the parent session. Callers and agent files cannot pick models.\nfunction resolveModel(override: SubagentProfileOverride | undefined, parent: ParentModelContext): Model<Api> {\n\tif (override?.model) return findAvailableModel(override.model, parent.modelRegistry);\n\tif (!parent.model) throw new Error(\"The parent session has no active model.\");\n\treturn parent.model;\n}\n\nfunction resolveThinking(\n\toverride: SubagentProfileOverride | undefined,\n\tparent: ParentModelContext,\n\tmodel: Model<Api>,\n): ThinkingLevel {\n\tconst requested = override?.thinking ?? parent.thinking;\n\treturn clampThinkingLevel(model, requested) as ThinkingLevel;\n}\n\n// The schema restricts task.agent to explorer|general; an omitted or null\n// agent resolves to the read-only explorer profile.\nconst DEFAULT_AGENT_NAME = \"explorer\";\n\n// The schema has no description field; derive a bounded plain-text label from\n// the briefing's first meaningful line so UI rows and report headings stay readable.\nfunction taskDescription(prompt: string): string {\n\tconst firstLine = firstPlainLine(prompt);\n\tconst characters = [...firstLine];\n\treturn characters.length <= 80 ? firstLine : `${characters.slice(0, 79).join(\"\")}…`;\n}\n\nexport async function resolveSubagentTask(\n\ttask: SubagentTask,\n\tparentCwd: string,\n\tparent: ParentModelContext,\n\tconfigAgentDir = getAgentDir(),\n\tpreloadedConfig?: SubagentConfigFile,\n): Promise<ResolvedSubagentTask> {\n\tconst agentName = task.agent ?? DEFAULT_AGENT_NAME;\n\tconst agent = AGENT_PROFILES.find((candidate) => candidate.name === agentName);\n\tif (!agent) {\n\t\tconst available = AGENT_PROFILES.map((candidate) => candidate.name).join(\", \") || \"none\";\n\t\tthrow new Error(`Unknown agent \"${agentName}\". Available agents: ${available}.`);\n\t}\n\tconst config = preloadedConfig ?? (await loadSubagentConfig(configAgentDir));\n\tconst override = config.profiles[agent.name];\n\tconst model = resolveModel(override, parent);\n\treturn {\n\t\tagent,\n\t\tdescription: taskDescription(task.prompt),\n\t\tprompt: task.prompt,\n\t\tcwd: resolveTaskCwd(parentCwd, task.cwd ?? undefined),\n\t\tmodel,\n\t\tthinking: resolveThinking(override, parent, model),\n\t};\n}\n"]}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/extensions/subagent/resolve.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, realpathSync, statSync } from \"node:fs\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { type Api, clampThinkingLevel, type Model } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ModelRegistry } from \"../../core/model-registry.ts\";\nimport { AGENT_PROFILES } from \"./agents.ts\";\nimport { findAvailableModel } from \"./model-selection.ts\";\nimport type { SubagentTask } from \"./schema.ts\";\nimport { loadSubagentConfig } from \"./settings.ts\";\nimport { firstPlainLine } from \"./text.ts\";\nimport type { ResolvedSubagentTask, SubagentConfigFile, SubagentProfileOverride } from \"./types.ts\";\n\nexport interface ParentModelContext {\n\tmodel: Model<Api> | undefined;\n\tthinking: ThinkingLevel;\n\tmodelRegistry: Pick<ModelRegistry, \"find\" | \"getAvailable\" | \"hasConfiguredAuth\">;\n}\n\nfunction normalizeCwdInput(value: string | undefined): string | undefined {\n\tif (value === undefined) return undefined;\n\tconst trimmed = value.trim();\n\tif (!trimmed) throw new Error(\"cwd must not be empty.\");\n\treturn trimmed.startsWith(\"@\") ? trimmed.slice(1) : trimmed;\n}\n\nfunction isWithin(parent: string, child: string): boolean {\n\tconst normalizedParent = process.platform === \"win32\" ? parent.toLowerCase() : parent;\n\tconst normalizedChild = process.platform === \"win32\" ? child.toLowerCase() : child;\n\tconst rest = relative(normalizedParent, normalizedChild);\n\treturn rest === \"\" || (rest !== \"..\" && !rest.startsWith(`..${PATH_SEP}`) && !isAbsolute(rest));\n}\n\nconst PATH_SEP = process.platform === \"win32\" ? \"\\\\\" : \"/\";\n\nexport function resolveTaskCwd(parentCwd: string, requestedCwd: string | undefined): string {\n\tconst value = normalizeCwdInput(requestedCwd);\n\t// Models routinely echo the parent working directory back as an absolute\n\t// path; accept an absolute cwd that stays inside the parent instead of\n\t// failing the whole task over path style.\n\tconst absolute = value !== undefined && isAbsolute(value);\n\tconst candidate = absolute ? resolve(value) : resolve(parentCwd, value ?? \".\");\n\t// Relative inputs get a lexical traversal check before touching the file\n\t// system. Absolute inputs may use the real spelling of a symlinked parent,\n\t// so their containment is decided by the canonical check below.\n\tif (!absolute && !isWithin(resolve(parentCwd), candidate))\n\t\tthrow new Error(`Subagent cwd escapes the parent working directory: ${requestedCwd}`);\n\tif (!existsSync(candidate) || !statSync(candidate).isDirectory())\n\t\tthrow new Error(`Subagent cwd is not a directory: ${candidate}`);\n\tconst realParent = realpathSync(parentCwd);\n\tconst realCandidate = realpathSync(candidate);\n\tif (!isWithin(realParent, realCandidate)) {\n\t\tif (absolute) throw new Error(\"cwd must stay inside the parent working directory.\");\n\t\tthrow new Error(`Subagent cwd escapes the parent working directory: ${requestedCwd}`);\n\t}\n\treturn realCandidate;\n}\n\n// Exactly two layers: a /agents override wins, otherwise the subagent\n// inherits the parent session. Callers and agent files cannot pick models.\nfunction resolveModel(override: SubagentProfileOverride | undefined, parent: ParentModelContext): Model<Api> {\n\tif (override?.model) return findAvailableModel(override.model, parent.modelRegistry);\n\tif (!parent.model) throw new Error(\"The parent session has no active model.\");\n\treturn parent.model;\n}\n\nfunction resolveThinking(\n\toverride: SubagentProfileOverride | undefined,\n\tparent: ParentModelContext,\n\tmodel: Model<Api>,\n): ThinkingLevel {\n\tconst requested = override?.thinking ?? parent.thinking;\n\treturn clampThinkingLevel(model, requested) as ThinkingLevel;\n}\n\n// The schema restricts task.agent to explorer|general; an omitted or null\n// agent resolves to the read-only explorer profile.\nconst DEFAULT_AGENT_NAME = \"explorer\";\n\n// The schema has no description field; derive a bounded plain-text label from\n// the briefing's first meaningful line so UI rows and report headings stay readable.\nfunction taskDescription(prompt: string): string {\n\tconst firstLine = firstPlainLine(prompt);\n\tconst characters = [...firstLine];\n\treturn characters.length <= 80 ? firstLine : `${characters.slice(0, 79).join(\"\")}…`;\n}\n\nexport async function resolveSubagentTask(\n\ttask: SubagentTask,\n\tparentCwd: string,\n\tparent: ParentModelContext,\n\tconfigAgentDir = getAgentDir(),\n\tpreloadedConfig?: SubagentConfigFile,\n): Promise<ResolvedSubagentTask> {\n\tconst agentName = task.agent ?? DEFAULT_AGENT_NAME;\n\tconst agent = AGENT_PROFILES.find((candidate) => candidate.name === agentName);\n\tif (!agent) {\n\t\tconst available = AGENT_PROFILES.map((candidate) => candidate.name).join(\", \") || \"none\";\n\t\tthrow new Error(`Unknown agent \"${agentName}\". Available agents: ${available}.`);\n\t}\n\tconst config = preloadedConfig ?? (await loadSubagentConfig(configAgentDir));\n\tconst override = config.profiles[agent.name];\n\tconst model = resolveModel(override, parent);\n\treturn {\n\t\tagent,\n\t\tdescription: taskDescription(task.prompt),\n\t\tprompt: task.prompt,\n\t\tcwd: resolveTaskCwd(parentCwd, task.cwd ?? undefined),\n\t\tmodel,\n\t\tthinking: resolveThinking(override, parent, model),\n\t};\n}\n"]}
@@ -27,5 +27,5 @@ export interface SubagentInvocationOptions {
27
27
  batchId?: string;
28
28
  }
29
29
  export declare function runSubagentInvocation(options: SubagentInvocationOptions): Promise<SubagentExecutionResult>;
30
- export declare function isSubagentError(details: Pick<SubagentDetails, "status" | "runs">): boolean;
30
+ export { isSubagentError } from "./state.ts";
31
31
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,EAAE,KAAK,kBAAkB,EAAuB,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAahE,OAAO,KAAK,EAAwB,eAAe,EAAE,uBAAuB,EAAiB,MAAM,YAAY,CAAC;AAShH,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,SAAkB;IAInC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAoBlD,OAAO,CAAC,OAAO;CAcf;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC;IAC3D,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAqID,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA+ChH;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAE1F"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,EAAE,KAAK,kBAAkB,EAAuB,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAYhE,OAAO,KAAK,EAAwB,eAAe,EAAE,uBAAuB,EAAiB,MAAM,YAAY,CAAC;AAUhH,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,SAAkB;IAInC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAsBlD,OAAO,CAAC,OAAO;CAYf;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC;IAC3D,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAqID,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA+ChH;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -6,7 +6,7 @@ import { MAX_CONCURRENCY, MAX_TASKS, TASK_RETRY_BASE_DELAY_MS, TASK_RETRY_LIMIT
6
6
  import { resolveSubagentTask } from "./resolve.js";
7
7
  import { runSdkTask } from "./sdk-runner.js";
8
8
  import { loadSubagentConfig } from "./settings.js";
9
- import { createRunState, isSubagentError as isSubagentErrorSelector, reduceRun, statusOf, toRunDetails, versionSum, } from "./state.js";
9
+ import { createRunState, reduceRun, statusOf, toRunDetails, versionSum, } from "./state.js";
10
10
  export class ConcurrencyGate {
11
11
  constructor(limit = MAX_CONCURRENCY) {
12
12
  this.active = 0;
@@ -21,9 +21,12 @@ export class ConcurrencyGate {
21
21
  return Promise.resolve(() => this.release());
22
22
  }
23
23
  return new Promise((resolve, reject) => {
24
- const waiter = { resolve, reject, signal };
24
+ const waiter = { resolve, reject, signal, settled: false };
25
25
  if (signal) {
26
26
  waiter.abortListener = () => {
27
+ if (waiter.settled)
28
+ return;
29
+ waiter.settled = true;
27
30
  const index = this.waiters.indexOf(waiter);
28
31
  if (index >= 0)
29
32
  this.waiters.splice(index, 1);
@@ -38,10 +41,9 @@ export class ConcurrencyGate {
38
41
  this.active = Math.max(0, this.active - 1);
39
42
  while (this.waiters.length > 0) {
40
43
  const waiter = this.waiters.shift();
41
- if (waiter.signal?.aborted) {
42
- waiter.abortListener?.();
44
+ if (waiter.settled || waiter.signal?.aborted)
43
45
  continue;
44
- }
46
+ waiter.settled = true;
45
47
  waiter.signal?.removeEventListener("abort", waiter.abortListener);
46
48
  this.active++;
47
49
  waiter.resolve(() => this.release());
@@ -211,7 +213,5 @@ export async function runSubagentInvocation(options) {
211
213
  usage: toNestedUsage(latestDetails.usage),
212
214
  };
213
215
  }
214
- export function isSubagentError(details) {
215
- return isSubagentErrorSelector(details);
216
- }
216
+ export { isSubagentError } from "./state.js";
217
217
  //# sourceMappingURL=runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRetryableAssistantError } from \"@earendil-works/pi-ai/compat\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { emptyUsage, mergeUsage, toNestedUsage } from \"./activity.ts\";\nimport { boundSubagentDetails, resultContent } from \"./budget.ts\";\nimport { abortableSleep, createRunCancellation, type RunCancellation } from \"./cancellation.ts\";\nimport { MAX_CONCURRENCY, MAX_TASKS, TASK_RETRY_BASE_DELAY_MS, TASK_RETRY_LIMIT } from \"./constants.ts\";\nimport { type ParentModelContext, resolveSubagentTask } from \"./resolve.ts\";\nimport type { SubagentParams, SubagentTask } from \"./schema.ts\";\nimport { runSdkTask } from \"./sdk-runner.ts\";\nimport { loadSubagentConfig } from \"./settings.ts\";\nimport {\n\tcreateRunState,\n\tisSubagentError as isSubagentErrorSelector,\n\treduceRun,\n\ttype SubagentRunEvent,\n\ttype SubagentRunState,\n\tstatusOf,\n\ttoRunDetails,\n\tversionSum,\n} from \"./state.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentExecutionResult, SubagentUsage } from \"./types.ts\";\n\ninterface Waiter {\n\tresolve: (release: () => void) => void;\n\treject: (error: Error) => void;\n\tsignal?: AbortSignal;\n\tabortListener?: () => void;\n}\n\nexport class ConcurrencyGate {\n\tprivate active = 0;\n\tprivate readonly waiters: Waiter[] = [];\n\tprivate readonly limit: number;\n\n\tconstructor(limit = MAX_CONCURRENCY) {\n\t\tthis.limit = limit;\n\t}\n\n\tacquire(signal?: AbortSignal): Promise<() => void> {\n\t\tif (signal?.aborted) return Promise.reject(new Error(\"Subagent was aborted while queued.\"));\n\t\tif (this.active < this.limit) {\n\t\t\tthis.active++;\n\t\t\treturn Promise.resolve(() => this.release());\n\t\t}\n\t\treturn new Promise<() => void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = { resolve, reject, signal };\n\t\t\tif (signal) {\n\t\t\t\twaiter.abortListener = () => {\n\t\t\t\t\tconst index = this.waiters.indexOf(waiter);\n\t\t\t\t\tif (index >= 0) this.waiters.splice(index, 1);\n\t\t\t\t\treject(new Error(\"Subagent was aborted while queued.\"));\n\t\t\t\t};\n\t\t\t\tsignal.addEventListener(\"abort\", waiter.abortListener, { once: true });\n\t\t\t}\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate release(): void {\n\t\tthis.active = Math.max(0, this.active - 1);\n\t\twhile (this.waiters.length > 0) {\n\t\t\tconst waiter = this.waiters.shift()!;\n\t\t\tif (waiter.signal?.aborted) {\n\t\t\t\twaiter.abortListener?.();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twaiter.signal?.removeEventListener(\"abort\", waiter.abortListener!);\n\t\t\tthis.active++;\n\t\t\twaiter.resolve(() => this.release());\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport interface SubagentInvocationOptions {\n\tparams: SubagentParams;\n\tparentCwd: string;\n\tparent: ParentModelContext;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tsignal?: AbortSignal;\n\tgate: ConcurrencyGate;\n\tonUpdate?: (details: SubagentDetails) => void;\n\tregisterAbort?: (abort: () => Promise<void>) => () => void;\n\t/** Test hook: overrides the task-retry backoff base delay. */\n\ttaskRetryBaseDelayMs?: number;\n\t/** Tool-call id of the invoking call; prefixes per-run ids for readability. */\n\tbatchId?: string;\n}\n\nfunction aggregateUsage(runs: readonly SubagentRunState[]): SubagentUsage {\n\tconst usage = emptyUsage();\n\tfor (const run of runs) mergeUsage(usage, run.usage);\n\treturn usage;\n}\n\nfunction emitDetails(\n\truns: SubagentRunState[],\n\tstartedAt: number,\n\tonUpdate: ((details: SubagentDetails) => void) | undefined,\n): SubagentDetails {\n\tconst details: SubagentDetails = {\n\t\tstatus: statusOf(runs),\n\t\truns: runs.map(toRunDetails),\n\t\tstartedAt,\n\t\tusage: aggregateUsage(runs),\n\t};\n\tonUpdate?.(boundSubagentDetails(details));\n\treturn details;\n}\n\nfunction validateTaskCount(tasks: readonly SubagentTask[]): void {\n\tif (tasks.length === 0) throw new Error(\"Subagent task list must not be empty.\");\n\tif (tasks.length > MAX_TASKS) throw new Error(`Subagent task list is limited to ${MAX_TASKS} tasks.`);\n}\n\nasync function resolveTasks(\n\ttasks: readonly SubagentTask[],\n\toptions: SubagentInvocationOptions,\n): Promise<ResolvedSubagentTask[]> {\n\tvalidateTaskCount(tasks);\n\t// One config load and one resolution pass for the whole batch: every\n\t// task/profile/cwd/model is settled before any run is created or any\n\t// worker starts, so a failing task cannot strand half-initialized runs.\n\tconst config = await loadSubagentConfig(options.agentDir);\n\treturn Promise.all(\n\t\ttasks.map((task, index) =>\n\t\t\tresolveSubagentTask(task, options.parentCwd, options.parent, options.agentDir, config).catch((error) => {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new Error(`Subagent task tasks[${index}] failed to resolve: ${message}`);\n\t\t\t}),\n\t\t),\n\t);\n}\n\n// Reuses pi-ai's provider-error classification by wrapping the stored error\n// text in the assistant-message shape it inspects.\nfunction isRetryableRunError(error: string | undefined): boolean {\n\tif (!error) return false;\n\tconst probe = { role: \"assistant\", content: [], stopReason: \"error\", errorMessage: error };\n\treturn isRetryableAssistantError(probe as unknown as Parameters<typeof isRetryableAssistantError>[0]);\n}\n\n// Session-level auto-retry already covers errors that happen inside the agent\n// loop; this catches the paths that bypass it (preflight throws such as auth\n// checks). Only a run that produced nothing is retried, so partial work is\n// never discarded.\nfunction shouldRetryTask(run: SubagentRunState): boolean {\n\treturn (\n\t\trun.status === \"failed\" && run.usage.turns === 0 && run.usage.toolUses === 0 && isRetryableRunError(run.error)\n\t);\n}\n\n// The gate slot is held only while a worker session actually runs. Backoff\n// waits outside the slot (release, sleep, reacquire) so a retrying task\n// cannot starve queued tasks, and aborting during the wait settles the run\n// without occupying the gate.\nasync function runWithGate(\n\ttask: ResolvedSubagentTask,\n\tscope: RunCancellation,\n\toptions: SubagentInvocationOptions,\n\tdispatch: (event: SubagentRunEvent) => void,\n\tgetState: () => SubagentRunState,\n\tonProgress: () => void,\n): Promise<void> {\n\tconst baseDelayMs = options.taskRetryBaseDelayMs ?? TASK_RETRY_BASE_DELAY_MS;\n\tfor (let attempt = 0; ; attempt++) {\n\t\tdispatch({ type: \"retry_started\" });\n\t\tlet release: (() => void) | undefined;\n\t\tlet delayMs = 0;\n\t\ttry {\n\t\t\trelease = await options.gate.acquire(scope.signal);\n\t\t\tif (scope.signal.aborted) {\n\t\t\t\tdispatch({ type: \"abort_while_queued\", endedAt: Date.now() });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdispatch({ type: \"slot_acquired\", startedAt: Date.now() });\n\t\t\tawait runSdkTask({\n\t\t\t\ttask,\n\t\t\t\tscope,\n\t\t\t\tdispatch,\n\t\t\t\tmodelRuntime: options.modelRuntime,\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tprojectTrusted: options.projectTrusted,\n\t\t\t\tonProgress,\n\t\t\t});\n\t\t\tconst state = getState();\n\t\t\tif (attempt >= TASK_RETRY_LIMIT || scope.signal.aborted || !shouldRetryTask(state)) return;\n\t\t\tdelayMs = baseDelayMs * 2 ** attempt;\n\t\t\tdispatch({\n\t\t\t\ttype: \"retry_scheduled\",\n\t\t\t\tattempt: attempt + 1,\n\t\t\t\tmaxAttempts: TASK_RETRY_LIMIT,\n\t\t\t\tdeadline: Date.now() + delayMs,\n\t\t\t\terror: state.error,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (scope.signal.aborted) {\n\t\t\t\tdispatch({ type: \"abort_while_queued\", endedAt: Date.now() });\n\t\t\t} else {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"settle\",\n\t\t\t\t\tverdict: \"failed\",\n\t\t\t\t\treport: \"\",\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tendedAt: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t} finally {\n\t\t\trelease?.();\n\t\t}\n\t\ttry {\n\t\t\tawait abortableSleep(delayMs, scope);\n\t\t} catch {\n\t\t\tdispatch({ type: \"abort_while_retrying\", endedAt: Date.now() });\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport async function runSubagentInvocation(options: SubagentInvocationOptions): Promise<SubagentExecutionResult> {\n\t// Defensive count check: the schema already enforces 1..MAX_TASKS, but\n\t// strict providers can bypass minItems, so validate before any work.\n\tconst tasks = options.params.tasks ?? [];\n\tconst resolved = await resolveTasks(tasks, options);\n\tconst runs = resolved.map((task, index) => createRunState(task, index, options.batchId, options.parentCwd));\n\tconst startedAt = Date.now();\n\t// Every run's cancellation scope exists and is registered before any\n\t// gate work starts, so a shutdown snapshot can never miss a queued task.\n\tconst scopes = runs.map(() => createRunCancellation(options.signal));\n\tconst unregisterScopes = scopes.map((scope) => options.registerAbort?.(scope.abort));\n\tlet lastVersion = versionSum(runs);\n\tconst progress = (): void => {\n\t\tconst version = versionSum(runs);\n\t\tif (version === lastVersion) return;\n\t\tlastVersion = version;\n\t\temitDetails(runs, startedAt, options.onUpdate);\n\t};\n\tconst dispatch = (index: number, event: SubagentRunEvent): void => {\n\t\truns[index] = reduceRun(runs[index]!, event);\n\t\tprogress();\n\t};\n\tlet latestDetails = emitDetails(runs, startedAt, options.onUpdate);\n\n\t// Every task runs concurrently through the shared gate; Promise.all keeps\n\t// result order identical to input order. There is no single-task branch:\n\t// one task is just a batch of one.\n\ttry {\n\t\tawait Promise.all(\n\t\t\tresolved.map((task, index) => {\n\t\t\t\tconst dispatchToRun = (event: SubagentRunEvent): void => dispatch(index, event);\n\t\t\t\treturn runWithGate(task, scopes[index]!, options, dispatchToRun, () => runs[index]!, progress);\n\t\t\t}),\n\t\t);\n\t} finally {\n\t\tfor (const unregister of unregisterScopes) unregister?.();\n\t\tfor (const scope of scopes) scope.dispose();\n\t}\n\tlatestDetails = emitDetails(runs, startedAt, undefined);\n\tlatestDetails.endedAt = Date.now();\n\t// Error classification lives in the tool_result handler (index.ts), the\n\t// only channel that reaches the session transcript and export.\n\treturn {\n\t\tcontent: resultContent(latestDetails),\n\t\tdetails: boundSubagentDetails(latestDetails),\n\t\tusage: toNestedUsage(latestDetails.usage),\n\t};\n}\n\nexport function isSubagentError(details: Pick<SubagentDetails, \"status\" | \"runs\">): boolean {\n\treturn isSubagentErrorSelector(details);\n}\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRetryableAssistantError } from \"@earendil-works/pi-ai/compat\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { emptyUsage, mergeUsage, toNestedUsage } from \"./activity.ts\";\nimport { boundSubagentDetails, resultContent } from \"./budget.ts\";\nimport { abortableSleep, createRunCancellation, type RunCancellation } from \"./cancellation.ts\";\nimport { MAX_CONCURRENCY, MAX_TASKS, TASK_RETRY_BASE_DELAY_MS, TASK_RETRY_LIMIT } from \"./constants.ts\";\nimport { type ParentModelContext, resolveSubagentTask } from \"./resolve.ts\";\nimport type { SubagentParams, SubagentTask } from \"./schema.ts\";\nimport { runSdkTask } from \"./sdk-runner.ts\";\nimport { loadSubagentConfig } from \"./settings.ts\";\nimport {\n\tcreateRunState,\n\treduceRun,\n\ttype SubagentRunEvent,\n\ttype SubagentRunState,\n\tstatusOf,\n\ttoRunDetails,\n\tversionSum,\n} from \"./state.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentExecutionResult, SubagentUsage } from \"./types.ts\";\n\ninterface Waiter {\n\tresolve: (release: () => void) => void;\n\treject: (error: Error) => void;\n\tsignal?: AbortSignal;\n\tabortListener?: () => void;\n\tsettled: boolean;\n}\n\nexport class ConcurrencyGate {\n\tprivate active = 0;\n\tprivate readonly waiters: Waiter[] = [];\n\tprivate readonly limit: number;\n\n\tconstructor(limit = MAX_CONCURRENCY) {\n\t\tthis.limit = limit;\n\t}\n\n\tacquire(signal?: AbortSignal): Promise<() => void> {\n\t\tif (signal?.aborted) return Promise.reject(new Error(\"Subagent was aborted while queued.\"));\n\t\tif (this.active < this.limit) {\n\t\t\tthis.active++;\n\t\t\treturn Promise.resolve(() => this.release());\n\t\t}\n\t\treturn new Promise<() => void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = { resolve, reject, signal, settled: false };\n\t\t\tif (signal) {\n\t\t\t\twaiter.abortListener = () => {\n\t\t\t\t\tif (waiter.settled) return;\n\t\t\t\t\twaiter.settled = true;\n\t\t\t\t\tconst index = this.waiters.indexOf(waiter);\n\t\t\t\t\tif (index >= 0) this.waiters.splice(index, 1);\n\t\t\t\t\treject(new Error(\"Subagent was aborted while queued.\"));\n\t\t\t\t};\n\t\t\t\tsignal.addEventListener(\"abort\", waiter.abortListener, { once: true });\n\t\t\t}\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate release(): void {\n\t\tthis.active = Math.max(0, this.active - 1);\n\t\twhile (this.waiters.length > 0) {\n\t\t\tconst waiter = this.waiters.shift()!;\n\t\t\tif (waiter.settled || waiter.signal?.aborted) continue;\n\t\t\twaiter.settled = true;\n\t\t\twaiter.signal?.removeEventListener(\"abort\", waiter.abortListener!);\n\t\t\tthis.active++;\n\t\t\twaiter.resolve(() => this.release());\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport interface SubagentInvocationOptions {\n\tparams: SubagentParams;\n\tparentCwd: string;\n\tparent: ParentModelContext;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tsignal?: AbortSignal;\n\tgate: ConcurrencyGate;\n\tonUpdate?: (details: SubagentDetails) => void;\n\tregisterAbort?: (abort: () => Promise<void>) => () => void;\n\t/** Test hook: overrides the task-retry backoff base delay. */\n\ttaskRetryBaseDelayMs?: number;\n\t/** Tool-call id of the invoking call; prefixes per-run ids for readability. */\n\tbatchId?: string;\n}\n\nfunction aggregateUsage(runs: readonly SubagentRunState[]): SubagentUsage {\n\tconst usage = emptyUsage();\n\tfor (const run of runs) mergeUsage(usage, run.usage);\n\treturn usage;\n}\n\nfunction emitDetails(\n\truns: SubagentRunState[],\n\tstartedAt: number,\n\tonUpdate: ((details: SubagentDetails) => void) | undefined,\n): SubagentDetails {\n\tconst details: SubagentDetails = {\n\t\tstatus: statusOf(runs),\n\t\truns: runs.map(toRunDetails),\n\t\tstartedAt,\n\t\tusage: aggregateUsage(runs),\n\t};\n\tonUpdate?.(boundSubagentDetails(details));\n\treturn details;\n}\n\nfunction validateTaskCount(tasks: readonly SubagentTask[]): void {\n\tif (tasks.length === 0) throw new Error(\"Subagent task list must not be empty.\");\n\tif (tasks.length > MAX_TASKS) throw new Error(`Subagent task list is limited to ${MAX_TASKS} tasks.`);\n}\n\nasync function resolveTasks(\n\ttasks: readonly SubagentTask[],\n\toptions: SubagentInvocationOptions,\n): Promise<ResolvedSubagentTask[]> {\n\tvalidateTaskCount(tasks);\n\t// One config load and one resolution pass for the whole batch: every\n\t// task/profile/cwd/model is settled before any run is created or any\n\t// worker starts, so a failing task cannot strand half-initialized runs.\n\tconst config = await loadSubagentConfig(options.agentDir);\n\treturn Promise.all(\n\t\ttasks.map((task, index) =>\n\t\t\tresolveSubagentTask(task, options.parentCwd, options.parent, options.agentDir, config).catch((error) => {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new Error(`Subagent task tasks[${index}] failed to resolve: ${message}`);\n\t\t\t}),\n\t\t),\n\t);\n}\n\n// Reuses pi-ai's provider-error classification by wrapping the stored error\n// text in the assistant-message shape it inspects.\nfunction isRetryableRunError(error: string | undefined): boolean {\n\tif (!error) return false;\n\tconst probe = { role: \"assistant\", content: [], stopReason: \"error\", errorMessage: error };\n\treturn isRetryableAssistantError(probe as unknown as Parameters<typeof isRetryableAssistantError>[0]);\n}\n\n// Session-level auto-retry already covers errors that happen inside the agent\n// loop; this catches the paths that bypass it (preflight throws such as auth\n// checks). Only a run that produced nothing is retried, so partial work is\n// never discarded.\nfunction shouldRetryTask(run: SubagentRunState): boolean {\n\treturn (\n\t\trun.status === \"failed\" && run.usage.turns === 0 && run.usage.toolUses === 0 && isRetryableRunError(run.error)\n\t);\n}\n\n// The gate slot is held only while a worker session actually runs. Backoff\n// waits outside the slot (release, sleep, reacquire) so a retrying task\n// cannot starve queued tasks, and aborting during the wait settles the run\n// without occupying the gate.\nasync function runWithGate(\n\ttask: ResolvedSubagentTask,\n\tscope: RunCancellation,\n\toptions: SubagentInvocationOptions,\n\tdispatch: (event: SubagentRunEvent) => void,\n\tgetState: () => SubagentRunState,\n\tonProgress: () => void,\n): Promise<void> {\n\tconst baseDelayMs = options.taskRetryBaseDelayMs ?? TASK_RETRY_BASE_DELAY_MS;\n\tfor (let attempt = 0; ; attempt++) {\n\t\tdispatch({ type: \"retry_started\" });\n\t\tlet release: (() => void) | undefined;\n\t\tlet delayMs = 0;\n\t\ttry {\n\t\t\trelease = await options.gate.acquire(scope.signal);\n\t\t\tif (scope.signal.aborted) {\n\t\t\t\tdispatch({ type: \"abort_while_queued\", endedAt: Date.now() });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdispatch({ type: \"slot_acquired\", startedAt: Date.now() });\n\t\t\tawait runSdkTask({\n\t\t\t\ttask,\n\t\t\t\tscope,\n\t\t\t\tdispatch,\n\t\t\t\tmodelRuntime: options.modelRuntime,\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tprojectTrusted: options.projectTrusted,\n\t\t\t\tonProgress,\n\t\t\t});\n\t\t\tconst state = getState();\n\t\t\tif (attempt >= TASK_RETRY_LIMIT || scope.signal.aborted || !shouldRetryTask(state)) return;\n\t\t\tdelayMs = baseDelayMs * 2 ** attempt;\n\t\t\tdispatch({\n\t\t\t\ttype: \"retry_scheduled\",\n\t\t\t\tattempt: attempt + 1,\n\t\t\t\tmaxAttempts: TASK_RETRY_LIMIT,\n\t\t\t\tdeadline: Date.now() + delayMs,\n\t\t\t\terror: state.error,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (scope.signal.aborted) {\n\t\t\t\tdispatch({ type: \"abort_while_queued\", endedAt: Date.now() });\n\t\t\t} else {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"settle\",\n\t\t\t\t\tverdict: \"failed\",\n\t\t\t\t\treport: \"\",\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tendedAt: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t} finally {\n\t\t\trelease?.();\n\t\t}\n\t\ttry {\n\t\t\tawait abortableSleep(delayMs, scope);\n\t\t} catch {\n\t\t\tdispatch({ type: \"abort_while_retrying\", endedAt: Date.now() });\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport async function runSubagentInvocation(options: SubagentInvocationOptions): Promise<SubagentExecutionResult> {\n\t// Defensive count check: the schema already enforces 1..MAX_TASKS, but\n\t// strict providers can bypass minItems, so validate before any work.\n\tconst tasks = options.params.tasks ?? [];\n\tconst resolved = await resolveTasks(tasks, options);\n\tconst runs = resolved.map((task, index) => createRunState(task, index, options.batchId, options.parentCwd));\n\tconst startedAt = Date.now();\n\t// Every run's cancellation scope exists and is registered before any\n\t// gate work starts, so a shutdown snapshot can never miss a queued task.\n\tconst scopes = runs.map(() => createRunCancellation(options.signal));\n\tconst unregisterScopes = scopes.map((scope) => options.registerAbort?.(scope.abort));\n\tlet lastVersion = versionSum(runs);\n\tconst progress = (): void => {\n\t\tconst version = versionSum(runs);\n\t\tif (version === lastVersion) return;\n\t\tlastVersion = version;\n\t\temitDetails(runs, startedAt, options.onUpdate);\n\t};\n\tconst dispatch = (index: number, event: SubagentRunEvent): void => {\n\t\truns[index] = reduceRun(runs[index]!, event);\n\t\tprogress();\n\t};\n\tlet latestDetails = emitDetails(runs, startedAt, options.onUpdate);\n\n\t// Every task runs concurrently through the shared gate; Promise.all keeps\n\t// result order identical to input order. There is no single-task branch:\n\t// one task is just a batch of one.\n\ttry {\n\t\tawait Promise.all(\n\t\t\tresolved.map((task, index) => {\n\t\t\t\tconst dispatchToRun = (event: SubagentRunEvent): void => dispatch(index, event);\n\t\t\t\treturn runWithGate(task, scopes[index]!, options, dispatchToRun, () => runs[index]!, progress);\n\t\t\t}),\n\t\t);\n\t} finally {\n\t\tfor (const unregister of unregisterScopes) unregister?.();\n\t\tfor (const scope of scopes) scope.dispose();\n\t}\n\tlatestDetails = emitDetails(runs, startedAt, undefined);\n\tlatestDetails.endedAt = Date.now();\n\t// Error classification lives in the tool_result handler (index.ts), the\n\t// only channel that reaches the session transcript and export.\n\treturn {\n\t\tcontent: resultContent(latestDetails),\n\t\tdetails: boundSubagentDetails(latestDetails),\n\t\tusage: toNestedUsage(latestDetails.usage),\n\t};\n}\n\nexport { isSubagentError } from \"./state.ts\";\n"]}
@@ -1,3 +1,4 @@
1
+ import type { AgentSessionEvent } from "../../core/agent-session.ts";
1
2
  import type { ModelRuntime } from "../../core/model-runtime.ts";
2
3
  import type { RunCancellation } from "./cancellation.ts";
3
4
  import type { SubagentRunEvent } from "./state.ts";
@@ -13,6 +14,16 @@ export interface SdkRunnerOptions {
13
14
  projectTrusted: boolean;
14
15
  onProgress?: () => void;
15
16
  }
17
+ export interface MappedSessionEvent {
18
+ runEvent: SubagentRunEvent;
19
+ /** Whether the progress emission should be immediate (true) or throttled (false). */
20
+ immediate: boolean;
21
+ }
22
+ /**
23
+ * Pure mapping from AgentSessionEvent to SubagentRunEvent. Returns undefined
24
+ * for events the subagent adapter does not handle. Exported for unit testing.
25
+ */
26
+ export declare function mapSessionEvent(event: AgentSessionEvent, seenAssistantMessages: Set<unknown>, now?: number): MappedSessionEvent | undefined;
16
27
  /**
17
28
  * Runs one worker attempt as a pure adapter: it owns the worker session's
18
29
  * lifecycle and translates AgentSessionEvents into SubagentRunEvents; every
@@ -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,CAsOzE"}
1
+ {"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,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;AA8DD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,iBAAiB,EACxB,qBAAqB,EAAE,GAAG,CAAC,OAAO,CAAC,EACnC,GAAG,SAAa,GACd,kBAAkB,GAAG,SAAS,CA2EhC;AA0CD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0JzE"}