@duckmind/dm-windows-x64 0.60.4 → 0.60.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +70 -123
  3. package/extensions/dm-9router-ext/src/index.js +410 -5
  4. package/extensions/dm-caveman/extensions/caveman.js +283 -12
  5. package/extensions/dm-cliproxy/index.js +182 -2
  6. package/extensions/dm-cliproxy/scripts/check-config-migration.js +66 -8
  7. package/extensions/dm-cliproxy/src/apply.js +228 -1
  8. package/extensions/dm-cliproxy/src/cache.js +42 -1
  9. package/extensions/dm-cliproxy/src/commands.js +50 -2
  10. package/extensions/dm-cliproxy/src/compat.js +81 -1
  11. package/extensions/dm-cliproxy/src/config.js +192 -2
  12. package/extensions/dm-cliproxy/src/conflicts.js +46 -1
  13. package/extensions/dm-cliproxy/src/fetch-models.js +190 -1
  14. package/extensions/dm-cliproxy/src/fetch-usage.js +41 -1
  15. package/extensions/dm-cliproxy/src/log.js +23 -1
  16. package/extensions/dm-cliproxy/src/status-quota.js +77 -1
  17. package/extensions/dm-cliproxy/src/ui-frame.js +50 -1
  18. package/extensions/dm-cliproxy/src/ui-hub/hub.js +199 -2
  19. package/extensions/dm-cliproxy/src/ui-hub/index.js +26 -2
  20. package/extensions/dm-cliproxy/src/ui-hub/shell.js +46 -1
  21. package/extensions/dm-cliproxy/src/ui-hub/view-diagnostics.js +69 -1
  22. package/extensions/dm-cliproxy/src/ui-hub/view-models.js +379 -1
  23. package/extensions/dm-cliproxy/src/ui-hub/view-usage.js +106 -1
  24. package/extensions/dm-cliproxy/src/ui-picker/catalog.js +41 -1
  25. package/extensions/dm-cliproxy/src/ui-picker/mutate.js +115 -1
  26. package/extensions/dm-cliproxy/src/ui-picker/prompt-confirm.js +35 -1
  27. package/extensions/dm-cliproxy/src/ui-picker/prompt-name.js +62 -1
  28. package/extensions/dm-cliproxy/src/ui-picker/providers.js +45 -1
  29. package/extensions/dm-cliproxy/src/ui-picker/render-text.js +34 -1
  30. package/extensions/dm-cliproxy/src/ui-picker/rows.js +57 -1
  31. package/extensions/dm-cliproxy/src/ui-setup.js +260 -2
  32. package/extensions/dm-cliproxy/src/ui-usage.js +151 -1
  33. package/extensions/dm-cliproxy/src/usage-shared-cache.js +97 -1
  34. package/extensions/dm-context/src/context.js +144 -1
  35. package/extensions/dm-context/src/index.js +339 -7
  36. package/extensions/dm-context/src/utils.js +9 -1
  37. package/extensions/dm-cua/bin/browser-cua.mjs +73 -8
  38. package/extensions/dm-cua/index.js +75 -6
  39. package/extensions/dm-cua/src/browser-cua-lib.mjs +490 -6
  40. package/extensions/dm-cua/src/browser-install.mjs +331 -2
  41. package/extensions/dm-fff/src/index.js +688 -12
  42. package/extensions/dm-fff/src/query.js +60 -1
  43. package/extensions/dm-goal/src/goal.js +894 -23
  44. package/extensions/dm-image2/index.js +103 -9
  45. package/extensions/dm-image2/src/image-lib.mjs +1275 -8
  46. package/extensions/dm-subagents/install.mjs +62 -8
  47. package/extensions/dm-subagents/src/agents/agent-management.js +1190 -36
  48. package/extensions/dm-subagents/src/agents/agent-memory.js +216 -6
  49. package/extensions/dm-subagents/src/agents/agent-scope.js +5 -1
  50. package/extensions/dm-subagents/src/agents/agent-selection.js +20 -1
  51. package/extensions/dm-subagents/src/agents/agent-serializer.js +120 -5
  52. package/extensions/dm-subagents/src/agents/agents.js +1139 -11
  53. package/extensions/dm-subagents/src/agents/chain-serializer.js +299 -11
  54. package/extensions/dm-subagents/src/agents/frontmatter.js +65 -6
  55. package/extensions/dm-subagents/src/agents/identity.js +29 -1
  56. package/extensions/dm-subagents/src/agents/proactive-skills.js +141 -1
  57. package/extensions/dm-subagents/src/agents/skills.js +614 -6
  58. package/extensions/dm-subagents/src/extension/config.js +35 -2
  59. package/extensions/dm-subagents/src/extension/control-notices.js +69 -4
  60. package/extensions/dm-subagents/src/extension/doctor.js +172 -15
  61. package/extensions/dm-subagents/src/extension/fanout-child.js +158 -231
  62. package/extensions/dm-subagents/src/extension/index.js +521 -359
  63. package/extensions/dm-subagents/src/extension/rpc.js +266 -7
  64. package/extensions/dm-subagents/src/extension/schemas.js +275 -1
  65. package/extensions/dm-subagents/src/extension/tool-description.js +111 -6
  66. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +126 -4
  67. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +452 -5
  68. package/extensions/dm-subagents/src/intercom/result-intercom.js +319 -3
  69. package/extensions/dm-subagents/src/profiles/profiles.js +458 -3
  70. package/extensions/dm-subagents/src/runs/background/async-execution.js +834 -40
  71. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +435 -14
  72. package/extensions/dm-subagents/src/runs/background/async-resume.js +334 -8
  73. package/extensions/dm-subagents/src/runs/background/async-status.js +313 -12
  74. package/extensions/dm-subagents/src/runs/background/chain-append.js +245 -2
  75. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +136 -1
  76. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +94 -1
  77. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +54 -1
  78. package/extensions/dm-subagents/src/runs/background/control-channel.js +190 -1
  79. package/extensions/dm-subagents/src/runs/background/fleet-view.js +483 -17
  80. package/extensions/dm-subagents/src/runs/background/notify.js +129 -3
  81. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +34 -1
  82. package/extensions/dm-subagents/src/runs/background/result-watcher.js +236 -6
  83. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +76 -4
  84. package/extensions/dm-subagents/src/runs/background/run-status.js +427 -23
  85. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +487 -4
  86. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +306 -9
  87. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +2849 -73
  88. package/extensions/dm-subagents/src/runs/background/top-level-async.js +5 -1
  89. package/extensions/dm-subagents/src/runs/background/wait.js +206 -11
  90. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +1013 -12
  91. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +980 -101
  92. package/extensions/dm-subagents/src/runs/foreground/execution.js +1165 -45
  93. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +3157 -222
  94. package/extensions/dm-subagents/src/runs/shared/acceptance.js +835 -3
  95. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +104 -1
  96. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +116 -3
  97. package/extensions/dm-subagents/src/runs/shared/dm-args.js +208 -1
  98. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +90 -1
  99. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +282 -1
  100. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +148 -1
  101. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +305 -1
  102. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +194 -1
  103. package/extensions/dm-subagents/src/runs/shared/model-scope.js +65 -1
  104. package/extensions/dm-subagents/src/runs/shared/nested-events.js +851 -8
  105. package/extensions/dm-subagents/src/runs/shared/nested-path.js +41 -1
  106. package/extensions/dm-subagents/src/runs/shared/nested-render.js +105 -1
  107. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +81 -4
  108. package/extensions/dm-subagents/src/runs/shared/run-history.js +51 -4
  109. package/extensions/dm-subagents/src/runs/shared/single-output.js +149 -8
  110. package/extensions/dm-subagents/src/runs/shared/structured-output.js +58 -1
  111. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +166 -5
  112. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +329 -13
  113. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +73 -1
  114. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +47 -4
  115. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +196 -1
  116. package/extensions/dm-subagents/src/runs/shared/worktree.js +435 -3
  117. package/extensions/dm-subagents/src/shared/artifacts.js +92 -2
  118. package/extensions/dm-subagents/src/shared/atomic-json.js +55 -1
  119. package/extensions/dm-subagents/src/shared/child-transcript.js +167 -5
  120. package/extensions/dm-subagents/src/shared/file-coalescer.js +25 -1
  121. package/extensions/dm-subagents/src/shared/fork-context.js +147 -4
  122. package/extensions/dm-subagents/src/shared/formatters.js +98 -7
  123. package/extensions/dm-subagents/src/shared/jsonl-writer.js +56 -2
  124. package/extensions/dm-subagents/src/shared/model-info.js +62 -1
  125. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +68 -1
  126. package/extensions/dm-subagents/src/shared/session-identity.js +6 -1
  127. package/extensions/dm-subagents/src/shared/session-tokens.js +39 -2
  128. package/extensions/dm-subagents/src/shared/settings.js +198 -11
  129. package/extensions/dm-subagents/src/shared/status-format.js +53 -1
  130. package/extensions/dm-subagents/src/shared/types.js +184 -6
  131. package/extensions/dm-subagents/src/shared/utils.js +462 -2
  132. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +288 -1
  133. package/extensions/dm-subagents/src/slash/prompt-workflows.js +297 -7
  134. package/extensions/dm-subagents/src/slash/slash-bridge.js +118 -1
  135. package/extensions/dm-subagents/src/slash/slash-commands.js +1287 -31
  136. package/extensions/dm-subagents/src/slash/slash-live-state.js +240 -4
  137. package/extensions/dm-subagents/src/tui/render-helpers.js +64 -1
  138. package/extensions/dm-subagents/src/tui/render.js +1542 -4
  139. package/extensions/dm-usage/index.js +1294 -9
  140. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +40 -9
  141. package/extensions/greedysearch-dm/bin/cdp-headless.mjs +5 -2
  142. package/extensions/greedysearch-dm/bin/cdp-visible.mjs +5 -2
  143. package/extensions/greedysearch-dm/bin/cdp.mjs +896 -30
  144. package/extensions/greedysearch-dm/bin/gschrome.mjs +30 -2
  145. package/extensions/greedysearch-dm/bin/kill-visible.mjs +7 -2
  146. package/extensions/greedysearch-dm/bin/launch-visible.mjs +13 -2
  147. package/extensions/greedysearch-dm/bin/launch.mjs +282 -10
  148. package/extensions/greedysearch-dm/bin/mcp.mjs +386 -361
  149. package/extensions/greedysearch-dm/bin/search.mjs +620 -540
  150. package/extensions/greedysearch-dm/bin/visible.mjs +22 -2
  151. package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +329 -579
  152. package/extensions/greedysearch-dm/extractors/chatgpt.mjs +301 -583
  153. package/extensions/greedysearch-dm/extractors/common.mjs +408 -32
  154. package/extensions/greedysearch-dm/extractors/consensus.mjs +376 -365
  155. package/extensions/greedysearch-dm/extractors/consent.mjs +303 -14
  156. package/extensions/greedysearch-dm/extractors/gemini.mjs +228 -592
  157. package/extensions/greedysearch-dm/extractors/google-ai.mjs +78 -499
  158. package/extensions/greedysearch-dm/extractors/logically.mjs +270 -347
  159. package/extensions/greedysearch-dm/extractors/perplexity.mjs +243 -581
  160. package/extensions/greedysearch-dm/extractors/selectors.mjs +32 -1
  161. package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +130 -317
  162. package/extensions/greedysearch-dm/index.js +123 -23
  163. package/extensions/greedysearch-dm/src/fetcher.mjs +576 -2
  164. package/extensions/greedysearch-dm/src/formatters/results.js +95 -10
  165. package/extensions/greedysearch-dm/src/formatters/sources.js +57 -1
  166. package/extensions/greedysearch-dm/src/formatters/synthesis.js +49 -1
  167. package/extensions/greedysearch-dm/src/github.mjs +222 -7
  168. package/extensions/greedysearch-dm/src/reddit.mjs +145 -14
  169. package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +340 -9
  170. package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +112 -4
  171. package/extensions/greedysearch-dm/src/search/chrome.mjs +486 -285
  172. package/extensions/greedysearch-dm/src/search/constants.mjs +109 -8
  173. package/extensions/greedysearch-dm/src/search/defaults.mjs +10 -1
  174. package/extensions/greedysearch-dm/src/search/engines.mjs +79 -9
  175. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +441 -349
  176. package/extensions/greedysearch-dm/src/search/file-sources.mjs +29 -7
  177. package/extensions/greedysearch-dm/src/search/minimize.mjs +86 -1
  178. package/extensions/greedysearch-dm/src/search/output.mjs +51 -5
  179. package/extensions/greedysearch-dm/src/search/paths.mjs +48 -1
  180. package/extensions/greedysearch-dm/src/search/pdf.mjs +63 -2
  181. package/extensions/greedysearch-dm/src/search/port-pid.mjs +69 -1
  182. package/extensions/greedysearch-dm/src/search/progress.mjs +109 -2
  183. package/extensions/greedysearch-dm/src/search/query.mjs +21 -1
  184. package/extensions/greedysearch-dm/src/search/recovery.mjs +49 -1
  185. package/extensions/greedysearch-dm/src/search/research.mjs +2227 -458
  186. package/extensions/greedysearch-dm/src/search/scale-aware.mjs +61 -11
  187. package/extensions/greedysearch-dm/src/search/simple-research.mjs +396 -805
  188. package/extensions/greedysearch-dm/src/search/sources.mjs +412 -1
  189. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +127 -12
  190. package/extensions/greedysearch-dm/src/search/synthesis.mjs +202 -12
  191. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +209 -23
  192. package/extensions/greedysearch-dm/src/tools/shared.js +226 -10
  193. package/extensions/greedysearch-dm/src/utils/content.mjs +35 -4
  194. package/extensions/greedysearch-dm/src/utils/helpers.js +22 -1
  195. package/extensions/greedysearch-dm/src/utils/node-runtime.mjs +10 -1
  196. package/extensions/greedysearch-dm/src/utils/system-cmds.mjs +61 -1
  197. package/package.json +1 -1
@@ -1,17 +1,483 @@
1
- import*as W from"node:fs";import*as M from"node:path";import*as C from"node:fs";import*as o from"node:path";var w=new Map;function On(n){return n instanceof Error?n.message:String(n)}function Cn(n){return typeof n==="object"&&n!==null&&"code"in n&&n.code==="ENOENT"}function l(n){let f=o.join(n,"status.json"),$;try{$=C.statSync(f)}catch(A){if(Cn(A))return null;throw Error(`Failed to inspect async status file '${f}': ${On(A)}`,{cause:A instanceof Error?A:void 0})}let j=w.get(f);if(j&&j.mtime===$.mtimeMs)return j.status;let T;try{T=C.readFileSync(f,"utf-8")}catch(A){if(Cn(A))return null;throw Error(`Failed to read async status file '${f}': ${On(A)}`,{cause:A instanceof Error?A:void 0})}let J;try{J=JSON.parse(T)}catch(A){throw Error(`Failed to parse async status file '${f}': ${On(A)}`,{cause:A instanceof Error?A:void 0})}if(w.set(f,{mtime:$.mtimeMs,status:J}),w.size>50){let A=w.keys().next().value;if(A)w.delete(A)}return J}import*as N from"node:os";import*as R from"node:path";function p(n){return n.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function Qf(n){let f=n?.env??process.env,$=n&&Object.hasOwn(n,"getuid")?n.getuid:process.getuid?.bind(process);if(typeof $==="function")return`uid-${$()}`;for(let A of["USERNAME","USER","LOGNAME"]){let B=f[A];if(B)return`user-${p(B)}`}let j=n&&Object.hasOwn(n,"userInfo")?n.userInfo:N.userInfo;try{let A=j?.().username;if(A)return`user-${p(A)}`}catch{}let T=f.USERPROFILE??f.HOME;if(T)return`home-${p(T)}`;let J=n&&Object.hasOwn(n,"homedir")?n.homedir:N.homedir;try{let A=J?.();if(A)return`home-${p(A)}`}catch{}return"shared"}var E=R.join(N.tmpdir(),`dm-subagents-${Qf()}`),m=R.join(E,"async-subagent-results"),Bn=R.join(E,"async-subagent-runs"),cf=R.join(E,"chain-runs"),C$=R.join(E,"artifacts");var Zn=["off","minimal","low","medium","high","xhigh"];function Un(n){let f=n.lastIndexOf(":");if(f===-1)return{baseModel:n,thinkingSuffix:""};let $=Zn.find((j)=>j===n.substring(f+1));if(!$)return{baseModel:n,thinkingSuffix:""};return{baseModel:n.substring(0,f),thinkingSuffix:`:${$}`}}function h(n){return n<1000?String(n):n<1e4?`${(n/1000).toFixed(1)}k`:`${Math.round(n/1000)}k`}function e(n,f){let $=n?Un(n):void 0,j=$?.baseModel??n,T=Zn.find((A)=>A===f?.trim()),J=$?.thinkingSuffix?$.thinkingSuffix.slice(1):T;if(j){let A=j.lastIndexOf("/");if(A!==-1)j=j.slice(A+1)}return[j,J?`thinking ${J}`:void 0].filter(Boolean).join(" · ")}function P(n){if(n<1000)return`${n}ms`;if(n<60000)return`${(n/1000).toFixed(1)}s`;return`${Math.floor(n/60000)}m${Math.floor(n%60000/1000)}s`}function U(n){let f=process.env.HOME;if(f&&n.startsWith(f))return`~${n.slice(f.length)}`;return n}function Lf(n){if(n<1000)return"now";if(n<60000)return`${Math.floor(n/1000)}s`;return`${Math.floor(n/60000)}m`}function k(n,f,$=Date.now()){if(n===void 0){if(f==="needs_attention")return"needs attention";if(f==="active_long_running")return"active but long-running";return}let j=Lf(Math.max(0,$-n));if(f==="needs_attention")return`no activity for ${j}`;if(f==="active_long_running")return`active but long-running · last activity ${j} ago`;return j==="now"?"active now":`active ${j} ago`}function qf(n){return n==="complete"||n==="completed"}function Xf(n){return n===1?"1 agent running":`${n} agents running`}function Qn(n,f,$={}){let j=n.filter((O)=>O.status==="running").length,T=n.filter((O)=>qf(O.status)).length,J=n.filter((O)=>O.status==="failed").length,A=n.filter((O)=>O.status==="paused").length,B=[`${T}/${f} done`];if($.showRunning!==!1&&j>0)B.unshift(Xf(j));if(J>0)B.push(`${J} failed`);if(A>0)B.push(`${A} paused`);return B.join(" · ")}function _n(n){let f={total:0,running:0,paused:0,complete:0,failed:0,queued:0};for(let $ of n??[]){f.total++,f[$.state]++;let j=_n([...$.children??[],...$.steps?.flatMap((T)=>T.children??[])??[]]);f.total+=j.total,f.running+=j.running,f.paused+=j.paused,f.complete+=j.complete,f.failed+=j.failed,f.queued+=j.queued}return f}function cn(n){let f=_n(n);if(f.total===0)return;let $=[f.running>0?`${f.running} running`:"",f.paused>0?`${f.paused} paused`:"",f.failed>0?`${f.failed} failed`:"",f.complete>0?`${f.complete} complete`:"",f.queued>0?`${f.queued} queued`:""].filter(Boolean);return`+${f.total} nested run${f.total===1?"":"s"}${$.length?` (${$.join(", ")})`:""}`}function Yf(n){if(n.agent)return n.agent;if(n.agents?.length)return n.agents.length===1?n.agents[0]:`${n.agents.slice(0,2).join(", ")}${n.agents.length>2?` +${n.agents.length-2}`:""}`;return n.id}function gn(n){let f=[];if(n.currentTool&&n.currentToolStartedAt!==void 0)f.push(`tool ${n.currentTool} ${P(Math.max(0,Date.now()-n.currentToolStartedAt))}`);else if(n.currentTool)f.push(`tool ${n.currentTool}`);if(n.currentPath)f.push(U(n.currentPath));if(n.turnCount!==void 0)f.push(`${n.turnCount} turns`);if(n.toolCount!==void 0)f.push(`${n.toolCount} tools`);if(n.totalTokens)f.push(`${h(n.totalTokens.total)} tok`);let $=k(n.lastActivityAt,n.activityState);return $||f.length?[$,...f].filter(Boolean).join(" | "):void 0}function Kf(n,f){let $=[],j=(T,J,A)=>{if(!T?.length||$.length>=f.maxLines)return;if(J>f.maxDepth){let B=cn(T);if(B&&$.length<f.maxLines)$.push(`${A}↳ ${B}`);return}for(let B=0;B<T.length;B++){let O=T[B];if($.length>=f.maxLines){let Z=cn(T.slice(B));if(Z)$[$.length-1]=`${A}↳ ${Z}`;return}let c=O.state==="running"?gn(O):void 0,L=O.error?` | error: ${O.error}`:"";if($.push(`${A}↳ ${Yf(O)} [${O.id}] ${O.state}${c?` | ${c}`:""}${L}`),f.commandHints&&$.length<f.maxLines)$.push(`${A} Status: subagent({ action: "status", id: "${O.id}" })`);if(J===f.maxDepth){let Z=cn([...O.steps?.flatMap((Y)=>Y.children??[])??[],...O.children??[]]);if(Z&&$.length<f.maxLines)$.push(`${A} ↳ ${Z}`);continue}for(let[Z,Y]of(O.steps??[]).entries()){if($.length>=f.maxLines)return;let q=Y.status==="running"?gn(Y):void 0;$.push(`${A} ${Z+1}. ${Y.agent} ${Y.status}${q?` | ${q}`:""}${Y.error?` | error: ${Y.error}`:""}`),j(Y.children,J+1,`${A} `)}j(O.children,J+1,`${A} `)}};return j(n,0,f.indent),$}function v(n,f={}){return Kf(n,{indent:f.indent??" ",maxDepth:f.maxDepth??2,maxLines:f.maxLines??40,commandHints:f.commandHints??!1})}import*as i from"node:fs";import*as F from"node:path";import{randomUUID as bf}from"node:crypto";import*as G from"node:fs";import*as K from"node:path";import*as En from"node:path";var Wf=128,Hf=4;function Ln(n){return typeof n==="string"&&n.length>0&&n.length<=Wf&&!En.isAbsolute(n)&&!n.includes("/")&&!n.includes("\\")&&!n.includes("..")}function bn(n){return typeof n==="number"&&Number.isFinite(n)?n:void 0}function zn(n,f){return typeof n==="string"&&n.length>0?n.slice(0,f):void 0}function xn(n){if(!Array.isArray(n))return[];return n.map((f)=>{if(!f||typeof f!=="object")return;let $=f;if(!Ln($.runId))return;return{runId:$.runId,...bn($.stepIndex)!==void 0?{stepIndex:bn($.stepIndex)}:{},...zn($.agent,128)?{agent:zn($.agent,128)}:{}}}).filter((f)=>Boolean(f)).slice(0,Hf)}import*as b from"node:path";import{fileURLToPath as In}from"node:url";import*as z from"node:os";import*as _ from"node:path";var r$=_.join(z.homedir(),".config","mcp","mcp.json"),u$={cursor:[_.join(z.homedir(),".cursor","mcp.json")],"claude-code":[_.join(z.homedir(),".claude","mcp.json"),_.join(z.homedir(),".claude.json"),_.join(z.homedir(),".claude","claude_desktop_config.json")],"claude-desktop":[_.join(z.homedir(),"Library","Application Support","Claude","claude_desktop_config.json")],codex:[_.join(z.homedir(),".codex","config.json")],windsurf:[_.join(z.homedir(),".windsurf","mcp.json")],vscode:[".vscode/mcp.json"]};import{Compile as p$}from"typebox/compile";function Nn(n,f){let $=In(n),j=b.extname($),T=[".js",".mjs",".cjs",".ts",".mts",".cts"].includes(j)?j:".ts";return b.join(b.dirname($),`${f}${T}`)}function Rn(n){return b.basename(In(n)).startsWith("dm-args.")}function yf(n=import.meta.url){let f=Rn(n)?"subagent-prompt-runtime":b.join("..","runs","shared","subagent-prompt-runtime");return Nn(n,f)}function Gf(n=import.meta.url){let f=Rn(n)?b.join("..","..","extension","fanout-child"):"fanout-child";return Nn(n,f)}var Q0=yf(),c0=Gf();import*as Sf from"node:fs";import*as I from"node:path";var Ff=[10,25,50,100,200,500,1000,2000,4000],Vf=new Set(["EACCES","EBUSY","EPERM"]),mn=typeof SharedArrayBuffer<"u"?new SharedArrayBuffer(4):void 0,Dn=mn?new Int32Array(mn):void 0;function Cf(n){if(n<=0)return;if(Dn)try{Atomics.wait(Dn,0,0,n);return}catch{}let f=Date.now()+n;while(Date.now()<f);}function Uf(n){let f=n?.code;return typeof f==="string"&&Vf.has(f)}function gf(n,f,$,j,T){for(let J=0;;J++)try{n.renameSync(f,$);return}catch(A){let B=j[J];if(B===void 0||!Uf(A))throw A;T(B)}}function _f(n={}){let f=n.fs??Sf,$=n.now??Date.now,j=n.pid??process.pid,T=n.random??Math.random,A=n.retryRenameErrors??process.platform==="win32"?n.retryDelaysMs??Ff:[],B=n.wait??Cf;return(O,c)=>{f.mkdirSync(I.dirname(O),{recursive:!0});let L=I.join(I.dirname(O),`.${I.basename(O)}.${j}.${$()}.${T().toString(36).slice(2)}.tmp`);try{f.writeFileSync(L,JSON.stringify(c,null,2),"utf-8"),gf(f,L,O,A,B)}finally{f.rmSync(L,{force:!0})}}}var D=_f();var a=K.join(E,"nested-subagent-events"),zf="route.json",Ef="registry.json",Wn=65536,qn=12,d=16,Xn=3;function t(n){return Ln(n)}function xf(n,f){if(!t(f))throw Error(`${n} must be a non-empty safe id token.`)}function wn(n,f){xf(n,f)}function Yn(n,f){let $=K.resolve(n),j=K.resolve(f);return j===$||j.startsWith(`${$}${K.sep}`)}function hn(n){return K.dirname(K.resolve(n.eventSink))}function fn(n){if(wn("rootRunId",n.rootRunId),wn("capabilityToken",n.capabilityToken),!Yn(a,n.eventSink))throw Error("Nested event sink is outside the subagent nested event root.");if(!Yn(a,n.controlInbox))throw Error("Nested control inbox is outside the subagent nested event root.");if(hn(n)!==K.dirname(K.resolve(n.controlInbox)))throw Error("Nested event sink and control inbox must share one route root.")}function Pn(n,f){if(!f.asyncDir)return;let $=K.resolve(f.asyncDir),j=K.resolve(E,"nested-subagent-runs",n,f.id),T=K.relative(j,$);return $===j||!T.startsWith("..")&&!K.isAbsolute(T)?$:void 0}function Q(n){return typeof n==="number"&&Number.isFinite(n)?n:void 0}function X(n,f=512){return typeof n==="string"&&n.length>0?n.slice(0,f):void 0}function If(n){if(!n||typeof n!=="object")return;let f=n,$=Q(f.input),j=Q(f.output),T=Q(f.total);return $!==void 0&&j!==void 0&&T!==void 0?{input:$,output:j,total:T}:void 0}function Nf(n){if(!n||typeof n!=="object")return;let f=n,$=Q(f.inputTokens),j=Q(f.outputTokens),T=Q(f.costUsd);return $!==void 0&&j!==void 0&&T!==void 0?{inputTokens:$,outputTokens:j,costUsd:T}:void 0}function nn(n){if(!n||typeof n!=="object")return;let f=n,$=Q(f.maxTurns),j=Q(f.graceTurns),T=Q(f.turnCount),J=f.outcome==="within-budget"||f.outcome==="wrap-up-requested"||f.outcome==="exceeded"?f.outcome:void 0;if($===void 0||j===void 0||T===void 0||!J)return;return{maxTurns:$,graceTurns:j,turnCount:T,outcome:J,...Q(f.wrapUpRequestedAtTurn)!==void 0?{wrapUpRequestedAtTurn:Q(f.wrapUpRequestedAtTurn)}:{},...Q(f.exceededAtTurn)!==void 0?{exceededAtTurn:Q(f.exceededAtTurn)}:{}}}function Rf(n,f){return n==="queued"||n==="running"||n==="complete"||n==="failed"||n==="paused"?n:f}function mf(n,f){if(!n||typeof n!=="object")return;let $=n,j=X($.agent,128);if(!j)return;let T=$.status==="pending"||$.status==="running"||$.status==="complete"||$.status==="completed"||$.status==="failed"||$.status==="paused"?$.status:"pending";return{agent:j,status:T,...X($.sessionFile,2048)?{sessionFile:X($.sessionFile,2048)}:{},...$.activityState==="active_long_running"||$.activityState==="needs_attention"?{activityState:$.activityState}:{},...Q($.lastActivityAt)!==void 0?{lastActivityAt:Q($.lastActivityAt)}:{},...X($.currentTool,128)?{currentTool:X($.currentTool,128)}:{},...Q($.currentToolStartedAt)!==void 0?{currentToolStartedAt:Q($.currentToolStartedAt)}:{},...X($.currentPath,2048)?{currentPath:X($.currentPath,2048)}:{},...Q($.turnCount)!==void 0?{turnCount:Q($.turnCount)}:{},...Q($.toolCount)!==void 0?{toolCount:Q($.toolCount)}:{},...Q($.startedAt)!==void 0?{startedAt:Q($.startedAt)}:{},...Q($.endedAt)!==void 0?{endedAt:Q($.endedAt)}:{},...X($.error,1024)?{error:X($.error,1024)}:{},...$.timedOut===!0?{timedOut:!0}:{},...nn($.turnBudget)?{turnBudget:nn($.turnBudget)}:{},...$.turnBudgetExceeded===!0?{turnBudgetExceeded:!0}:{},...$.wrapUpRequested===!0?{wrapUpRequested:!0}:{},...f<Xn&&Array.isArray($.children)?{children:$.children.map((J)=>$n(J,f+1)).filter((J)=>Boolean(J)).slice(0,d)}:{}}}function $n(n,f=0){if(!n||typeof n!=="object")return;let $=n;if(!t($.id)||!t($.parentRunId))return;let j=xn($.path),T=Array.isArray($.steps)?$.steps.map((B)=>mf(B,f+1)).filter((B)=>Boolean(B)).slice(0,qn):void 0,J=If($.totalTokens),A=Nf($.totalCost);return{id:$.id,parentRunId:$.parentRunId,...Q($.parentStepIndex)!==void 0?{parentStepIndex:Q($.parentStepIndex)}:{},...X($.parentAgent,128)?{parentAgent:X($.parentAgent,128)}:{},depth:Math.min(Math.max(0,Q($.depth)??0),Xn),path:j,state:Rf($.state,"running"),...X($.asyncDir,2048)?{asyncDir:X($.asyncDir,2048)}:{},...Q($.pid)!==void 0&&Q($.pid)>0&&Number.isInteger(Q($.pid))?{pid:Q($.pid)}:{},...X($.sessionId,256)?{sessionId:X($.sessionId,256)}:{},...X($.sessionFile,2048)?{sessionFile:X($.sessionFile,2048)}:{},...X($.intercomTarget,256)?{intercomTarget:X($.intercomTarget,256)}:{},...X($.ownerIntercomTarget,256)?{ownerIntercomTarget:X($.ownerIntercomTarget,256)}:{},...X($.leafIntercomTarget,256)?{leafIntercomTarget:X($.leafIntercomTarget,256)}:{},...$.ownerState==="live"||$.ownerState==="gone"||$.ownerState==="unknown"?{ownerState:$.ownerState}:{},...X($.controlInbox,2048)?{controlInbox:X($.controlInbox,2048)}:{},...X($.capabilityToken,128)?{capabilityToken:X($.capabilityToken,128)}:{},...$.mode==="single"||$.mode==="parallel"||$.mode==="chain"?{mode:$.mode}:{},...X($.agent,128)?{agent:X($.agent,128)}:{},...Array.isArray($.agents)?{agents:$.agents.map((B)=>X(B,128)).filter((B)=>Boolean(B)).slice(0,qn)}:{},...Q($.currentStep)!==void 0?{currentStep:Q($.currentStep)}:{},...Q($.chainStepCount)!==void 0?{chainStepCount:Q($.chainStepCount)}:{},...$.activityState==="active_long_running"||$.activityState==="needs_attention"?{activityState:$.activityState}:{},...Q($.lastActivityAt)!==void 0?{lastActivityAt:Q($.lastActivityAt)}:{},...X($.currentTool,128)?{currentTool:X($.currentTool,128)}:{},...Q($.currentToolStartedAt)!==void 0?{currentToolStartedAt:Q($.currentToolStartedAt)}:{},...X($.currentPath,2048)?{currentPath:X($.currentPath,2048)}:{},...Q($.turnCount)!==void 0?{turnCount:Q($.turnCount)}:{},...Q($.toolCount)!==void 0?{toolCount:Q($.toolCount)}:{},...J?{totalTokens:J}:{},...A?{totalCost:A}:{},...Q($.startedAt)!==void 0?{startedAt:Q($.startedAt)}:{},...Q($.endedAt)!==void 0?{endedAt:Q($.endedAt)}:{},...Q($.lastUpdate)!==void 0?{lastUpdate:Q($.lastUpdate)}:{},...Q($.timeoutMs)!==void 0?{timeoutMs:Q($.timeoutMs)}:{},...Q($.deadlineAt)!==void 0?{deadlineAt:Q($.deadlineAt)}:{},...$.timedOut===!0?{timedOut:!0}:{},...nn($.turnBudget)?{turnBudget:nn($.turnBudget)}:{},...$.turnBudgetExceeded===!0?{turnBudgetExceeded:!0}:{},...$.wrapUpRequested===!0?{wrapUpRequested:!0}:{},...X($.error,1024)?{error:X($.error,1024)}:{},...T&&T.length>0?{steps:T}:{},...f<Xn&&Array.isArray($.children)?{children:$.children.map((B)=>$n(B,f+1)).filter((B)=>Boolean(B)).slice(0,d)}:{}}}function Kn(n,f){if(Buffer.byteLength(n,"utf-8")>Wn)return;let $;try{$=JSON.parse(n)}catch{return}if(!$||typeof $!=="object")return;let j=$;if(j.type!=="subagent.nested.started"&&j.type!=="subagent.nested.updated"&&j.type!=="subagent.nested.completed")return;if(j.rootRunId!==f.rootRunId||j.capabilityToken!==f.capabilityToken)return;if(!t(j.parentRunId))return;let T=Q(j.ts);if(T===void 0)return;let J=$n(j.child);if(!J||J.id===f.rootRunId)return;let A={...J,controlInbox:f.controlInbox,capabilityToken:f.capabilityToken,ownerState:J.ownerState??"unknown"};return{type:j.type,ts:T,rootRunId:f.rootRunId,parentRunId:j.parentRunId,...Q(j.parentStepIndex)!==void 0?{parentStepIndex:Q(j.parentStepIndex)}:{},capabilityToken:f.capabilityToken,child:A}}function Df(n,f){if(!n.includes(`
2
- `)){let $=Kn(n.trim(),f);return $?[$]:[]}return n.split(`
3
- `).slice(0,n.endsWith(`
4
- `)?void 0:-1).map(($)=>$.trim()?Kn($,f):void 0).filter(($)=>Boolean($))}function s(n){return n==="complete"||n==="failed"||n==="paused"}function on(n,f){let $=f.type==="subagent.nested.completed"&&f.child.state==="running"?"complete":f.child.state,j={...f.child,state:$,lastUpdate:f.child.lastUpdate??f.ts};if(!n)return j;let T=n.lastUpdate??0,J=j.lastUpdate??f.ts;if(J<T)return n;if(s(n.state)&&!s(j.state))return n;if(s(n.state)&&s(j.state)&&J===T)return n;return{...n,...j,state:j.state,lastUpdate:Math.max(T,J)}}function wf(n,f){let $=!1,j=(B)=>B.map((O)=>{if(O.id===f.parentRunId){let L=O.children??[],Z=L.findIndex((y)=>y.id===f.child.id),Y=on(Z>=0?L[Z]:void 0,f),q=Z>=0?L.map((y,g)=>g===Z?Y:y):[...L,Y];return $=!0,{...O,children:q.slice(0,d),lastUpdate:Math.max(O.lastUpdate??0,f.ts)}}if(!O.children?.length)return O;let c=j(O.children);return c===O.children?O:{...O,children:c}}),T=j(n);if($)return T;let J=T.findIndex((B)=>B.id===f.child.id),A=on(J>=0?T[J]:void 0,f);return J>=0?T.map((B,O)=>O===J?A:B):[...T,A].slice(0,d)}function of(n,f){return{...n,updatedAt:Math.max(n.updatedAt,f.ts),children:wf(n.children,f)}}function kn(n){return K.join(hn(n),Ef)}function vn(){let n;try{n=G.readdirSync(a)}catch($){if($.code==="ENOENT")return new Map;throw $}let f=new Map;for(let $ of n){let j=K.join(a,$);try{let T=JSON.parse(G.readFileSync(K.join(j,zf),"utf-8"));if(typeof T.rootRunId!=="string"||typeof T.capabilityToken!=="string")continue;if(f.has(T.rootRunId))continue;let J={rootRunId:T.rootRunId,eventSink:K.join(j,"events"),controlInbox:K.join(j,"controls"),capabilityToken:T.capabilityToken};fn(J),f.set(T.rootRunId,J)}catch{continue}}return f}function hf(n){fn(n);try{let f=JSON.parse(G.readFileSync(kn(n),"utf-8"));return{rootRunId:n.rootRunId,updatedAt:typeof f.updatedAt==="number"?f.updatedAt:0,children:Array.isArray(f.children)?f.children.map(($)=>$n($)).filter(($)=>Boolean($)):[],processedEvents:Array.isArray(f.processedEvents)?f.processedEvents.filter(($)=>typeof $==="string"):[]}}catch(f){if(f.code!=="ENOENT")throw f;return{rootRunId:n.rootRunId,updatedAt:0,children:[],processedEvents:[]}}}function jn(n){fn(n);let f=hf(n),$=new Set(f.processedEvents),j=!1,T=[];try{T=G.readdirSync(n.eventSink).filter((J)=>J.endsWith(".json")||J.endsWith(".jsonl")).sort()}catch(J){if(J.code!=="ENOENT")throw J}for(let J of T){if($.has(J))continue;let A=K.join(n.eventSink,J);if(!Yn(n.eventSink,A))continue;let B;try{let O=G.statSync(A);if(!O.isFile()||O.size>Wn)continue;B=G.readFileSync(A,"utf-8")}catch{continue}for(let O of Df(B,n))f=of(f,O),j=!0;$.add(J),j=!0}if(j)f={...f,processedEvents:[...$].slice(-1000)},D(kn(n),f);return f}function Pf(n,f,$){let j=`${JSON.stringify($)}
5
- `;if(Buffer.byteLength(j,"utf-8")>Wn)throw Error("Nested route record exceeds the maximum size.");G.mkdirSync(n,{recursive:!0,mode:448});let T=`${String(f).padStart(13,"0")}-${bf()}.json`,J=K.join(n,`.${T}.tmp`),A=K.join(n,T);return G.writeFileSync(J,j,{mode:384}),G.renameSync(J,A),A}function dn(n,f){fn(n);let $={...f,rootRunId:n.rootRunId,capabilityToken:n.capabilityToken},j=Kn(JSON.stringify($),n);if(!j)throw Error("Nested event record failed validation.");Pf(n.eventSink,j.ts,j)}function rn(n,f,$){if(!f?.length)return;for(let j of f)j.children=void 0;if(!$?.length)return;for(let j of $){if(j.parentRunId!==n||j.parentStepIndex===void 0)continue;let T=f.find((J,A)=>(J.index??A)===j.parentStepIndex);if(!T)continue;T.children??=[],T.children=[...T.children.filter((J)=>J.id!==j.id),j].slice(0,d)}}function un(n,f,$){return{id:n.runId||$.id,parentRunId:$.parentRunId,...$.parentStepIndex!==void 0?{parentStepIndex:$.parentStepIndex}:{},depth:$.depth,path:$.path??[{runId:$.parentRunId,...$.parentStepIndex!==void 0?{stepIndex:$.parentStepIndex}:{}}],asyncDir:f,...n.pid?{pid:n.pid}:{},...n.sessionId?{sessionId:n.sessionId}:{},mode:n.mode??$.mode,state:n.state,...n.currentStep!==void 0?{currentStep:n.currentStep}:{},...n.chainStepCount!==void 0?{chainStepCount:n.chainStepCount}:{},...n.activityState?{activityState:n.activityState}:{},...n.lastActivityAt!==void 0?{lastActivityAt:n.lastActivityAt}:{},...n.currentTool?{currentTool:n.currentTool}:{},...n.currentToolStartedAt!==void 0?{currentToolStartedAt:n.currentToolStartedAt}:{},...n.currentPath?{currentPath:n.currentPath}:{},...n.turnCount!==void 0?{turnCount:n.turnCount}:{},...n.toolCount!==void 0?{toolCount:n.toolCount}:{},...n.totalTokens?{totalTokens:n.totalTokens}:{},...n.timeoutMs!==void 0?{timeoutMs:n.timeoutMs}:{},...n.deadlineAt!==void 0?{deadlineAt:n.deadlineAt}:{},...n.timedOut!==void 0?{timedOut:n.timedOut}:{},...n.turnBudget?{turnBudget:n.turnBudget}:{},...n.turnBudgetExceeded!==void 0?{turnBudgetExceeded:n.turnBudgetExceeded}:{},...n.wrapUpRequested!==void 0?{wrapUpRequested:n.wrapUpRequested}:{},...n.error?{error:n.error}:{},...n.startedAt!==void 0?{startedAt:n.startedAt}:{startedAt:$.ts},...n.endedAt!==void 0?{endedAt:n.endedAt}:{},lastUpdate:n.lastUpdate??$.ts,...n.sessionFile?{sessionFile:n.sessionFile}:{},...n.steps?.length?{steps:n.steps.map((j)=>({agent:j.agent,status:j.status,...j.sessionFile?{sessionFile:j.sessionFile}:{},...j.activityState?{activityState:j.activityState}:{},...j.lastActivityAt!==void 0?{lastActivityAt:j.lastActivityAt}:{},...j.currentTool?{currentTool:j.currentTool}:{},...j.currentToolStartedAt!==void 0?{currentToolStartedAt:j.currentToolStartedAt}:{},...j.currentPath?{currentPath:j.currentPath}:{},...j.turnCount!==void 0?{turnCount:j.turnCount}:{},...j.toolCount!==void 0?{toolCount:j.toolCount}:{},...j.startedAt!==void 0?{startedAt:j.startedAt}:{},...j.endedAt!==void 0?{endedAt:j.endedAt}:{},...j.error?{error:j.error}:{},...j.timedOut!==void 0?{timedOut:j.timedOut}:{},...j.turnBudget?{turnBudget:j.turnBudget}:{},...j.turnBudgetExceeded!==void 0?{turnBudgetExceeded:j.turnBudgetExceeded}:{},...j.wrapUpRequested!==void 0?{wrapUpRequested:j.wrapUpRequested}:{}})).slice(0,qn)}:{}}}function kf(n,f,$){if(typeof n!=="object"||n===null)return!1;let{start:j,count:T,stepIndex:J}=n;return typeof j==="number"&&typeof T==="number"&&typeof J==="number"&&Number.isInteger(j)&&Number.isInteger(T)&&Number.isInteger(J)&&j>=0&&T>0&&J>=0&&J<$&&j+T<=f}function r(n,f,$){if(!Array.isArray(n))return[];return n.filter((j)=>kf(j,f,$)).sort((j,T)=>j.stepIndex-T.stepIndex||j.start-T.start)}function ln(n,f,$){let j=0,T=0;for(let J of $){while(T<J.start&&j<f){if(T===n)return j;T++,j++}if(n>=J.start&&n<J.start+J.count)return J.stepIndex;T=J.start+J.count,j=J.stepIndex+1}while(T<=n&&j<f){if(T===n)return j;T++,j++}return Math.max(0,f-1)}import*as H from"node:fs";import*as S from"node:path";function Hn(n){return n instanceof Error?n.message:String(n)}function vf(n){let f=S.join(n,"runner.stderr.log"),$=65536,j;try{let J=H.statSync(f);if(J.size<=0)return;let A=H.openSync(f,"r");try{let B=Math.min(J.size,65536),O=Math.max(0,J.size-B),c=Buffer.alloc(B);H.readSync(A,c,0,B,O),j=c.toString("utf-8").trim()}finally{H.closeSync(A)}}catch{return}if(!j)return;let T=j.split(/\r?\n/).slice(-30).join(`
6
- `);return T.length>4000?`${T.slice(-4000)}
7
- [stderr tail truncated]`:T}function sn(n){return typeof n==="object"&&n!==null&&"code"in n&&n.code==="ENOENT"}function df(n,f){try{H.mkdirSync(S.dirname(n),{recursive:!0}),H.appendFileSync(n,`${JSON.stringify(f)}
8
- `,"utf-8")}catch{}}function rf(n){let f=S.join(n,"status.json"),$;try{$=H.readFileSync(f,"utf-8")}catch(j){if(sn(j))return null;throw Error(`Failed to read async status file '${f}': ${Hn(j)}`,{cause:j instanceof Error?j:void 0})}try{return JSON.parse($)}catch(j){throw Error(`Failed to parse async status file '${f}': ${Hn(j)}`,{cause:j instanceof Error?j:void 0})}}function uf(n){try{let f=JSON.parse(H.readFileSync(n,"utf-8"));return{state:f.success?"complete":f.state==="paused"||f.exitCode===0?"paused":"failed",...Array.isArray(f.results)?{results:f.results}:{}}}catch(f){if(sn(f))return;throw Error(`Failed to read async result file '${n}': ${Hn(f)}`,{cause:f instanceof Error?f:void 0})}}function lf(n,f){if(f?.success===!0)return"complete";if(f?.success===!1)return"failed";return n}function pf(n,f,$){let j=uf(f);if(!j)return;let T=(n.steps??[]).map((J,A)=>{if(J.status!=="running"&&J.status!=="pending")return J;let B=j.results?.[A],O=lf(j.state,B);return{...J,status:O==="complete"?"complete":O,endedAt:J.endedAt??$,durationMs:J.startedAt!==void 0&&J.durationMs===void 0?Math.max(0,$-J.startedAt):J.durationMs,exitCode:J.exitCode??(O==="complete"||O==="paused"?0:1),error:O==="failed"?J.error??B?.error:J.error,sessionFile:J.sessionFile??B?.sessionFile,model:J.model??B?.model,attemptedModels:J.attemptedModels??B?.attemptedModels,modelAttempts:J.modelAttempts??B?.modelAttempts}});return{...n,state:j.state,activityState:void 0,lastUpdate:$,endedAt:n.endedAt??$,steps:T}}function ef(n,f,$){let j=f.startedAt??$,T=f.agents?.length?f.agents:["subagent"],J=f.chainStepCount,A=J!==void 0?r(f.parallelGroups,T.length,J):[];return{runId:f.runId||S.basename(n),...f.sessionId?{sessionId:f.sessionId}:{},mode:f.mode??"single",state:"running",pid:f.pid,startedAt:j,lastUpdate:$,currentStep:0,...J!==void 0?{chainStepCount:J}:{},...A.length?{parallelGroups:A}:{},steps:T.map((B)=>({agent:B,status:"running",startedAt:j})),...f.sessionFile?{sessionFile:f.sessionFile}:{}}}function sf(n,f,$,j){let T=n.runId||S.basename(f),J=typeof n.pid==="number"?n.pid:"unknown",A=j??`Async runner process ${J} exited or disappeared before writing a result. Marked run failed by stale-run reconciliation.`,B=vf(f),O=B?`${A}
9
-
10
- Runner stderr tail:
11
- ${B}`:A,L=((n.steps?.length)?n.steps:[{agent:"subagent",status:"running"}]).map((q)=>q.status==="running"||q.status==="pending"?{...q,status:"failed",activityState:void 0,endedAt:q.endedAt??$,durationMs:q.startedAt!==void 0&&q.durationMs===void 0?Math.max(0,$-q.startedAt):q.durationMs,exitCode:q.exitCode??1,error:q.error??O}:q),Z={...n,state:"failed",activityState:void 0,lastUpdate:$,endedAt:$,steps:L},Y=L[n.currentStep??0]?.agent??L[0]?.agent??"subagent";return{status:Z,message:O,result:{id:T,agent:Y,mode:n.mode,success:!1,state:"failed",summary:O,results:L.map((q)=>({agent:q.agent,output:q.status==="complete"||q.status==="completed"?"":O,error:q.status==="complete"||q.status==="completed"?void 0:q.error??O,success:q.status==="complete"||q.status==="completed",model:q.model,attemptedModels:q.attemptedModels,modelAttempts:q.modelAttempts,sessionFile:q.sessionFile})),exitCode:1,timestamp:$,durationMs:Math.max(0,$-n.startedAt),asyncDir:f,sessionId:n.sessionId,sessionFile:n.sessionFile}}}function pn(n,f,$,j,T){let J=sf(f,n,j,T);return D($,J.result),D(S.join(n,"status.json"),J.status),df(S.join(n,"events.jsonl"),{type:"subagent.run.repaired_stale",ts:j,runId:J.status.runId,pid:f.pid,resultPath:$,message:J.message}),{status:J.status,repaired:!0,resultPath:$,message:J.message}}function en(n){return n==="complete"||n==="failed"||n==="paused"}function*Mn(n){for(let f of n??[])yield f,yield*Mn(f.children),yield*Mn(f.steps?.flatMap(($)=>$.children??[]))}function an(n,f={}){let $=jn(n);for(let j of Mn($.children)){if(j.state!=="running"&&j.state!=="queued")continue;let T=Pn(n.rootRunId,j);if(!T)continue;let J=yn(T,{...f,resultsDir:S.join(f.resultsDir??m,"nested",n.rootRunId)}),A=J.status;if(!A)continue;if(!J.repaired&&!en(A.state))continue;let B=f.now?.()??Date.now();dn(n,{type:en(A.state)?"subagent.nested.completed":"subagent.nested.updated",ts:B,parentRunId:j.parentRunId,parentStepIndex:j.parentStepIndex,child:un(A,T,{id:j.id,parentRunId:j.parentRunId,parentStepIndex:j.parentStepIndex,depth:j.depth,path:j.path,mode:j.mode,ts:B})})}}function af(n,f=process.kill){try{return f(n,0),"alive"}catch($){let j=typeof $==="object"&&$!==null&&"code"in $?$.code:void 0;if(j==="ESRCH")return"dead";if(j==="EPERM")return"unknown";return"unknown"}}function yn(n,f={}){let $=f.now?.()??Date.now(),j=rf(n),T=!j&&f.startedRun?ef(n,f.startedRun,$):void 0,J=j??T;if(!J)return{status:null,repaired:!1};let A=J.runId||S.basename(n),B=S.join(f.resultsDir??m,`${A}.json`);if(H.existsSync(B)){let c=J.state==="running"||J.state==="queued"?pf(J,B,$):void 0;if(c)return D(S.join(n,"status.json"),c),{status:c,repaired:!0,resultPath:B,message:"Existing async result file was used to repair stale running status."};return{status:J,repaired:!1,resultPath:B}}if(J.state!=="running"||typeof J.pid!=="number")return{status:j??null,repaired:!1,resultPath:B};if(!j){let c=f.startedRun?.startedAt??J.startedAt;if($-c<(f.missingStatusGraceMs??1000))return{status:null,repaired:!1,resultPath:B}}if(af(J.pid,f.kill)!=="dead"){let c=f.staleAlivePidMs??86400000,L=J.lastUpdate??J.startedAt;if($-L<=c)return{status:j??null,repaired:!1,resultPath:B};let Z=`Async runner process ${J.pid} still has a live PID, but status has not updated for ${$-L}ms. Marked run failed by stale-run reconciliation because PID ownership cannot be verified.`;return pn(n,J,B,$,Z)}return pn(n,J,B,$)}function u(n){return n instanceof Error?n.message:String(n)}function Gn(n){return typeof n==="object"&&n!==null&&"code"in n&&n.code==="ENOENT"}function tf(n,f){let $=F.join(n,f);try{return i.statSync($).isDirectory()}catch(j){if(Gn(j))return!1;throw Error(`Failed to inspect async run path '${$}': ${u(j)}`,{cause:j instanceof Error?j:void 0})}}function n$(n){if(!n)return;try{return i.statSync(n).mtimeMs}catch(f){if(Gn(f))return;throw Error(`Failed to inspect async output file '${n}': ${u(f)}`,{cause:f instanceof Error?f:void 0})}}function f$(n,f){if(f.state!=="running")return{activityState:f.activityState,lastActivityAt:f.lastActivityAt};let $=f.outputFile?F.isAbsolute(f.outputFile)?f.outputFile:F.join(n,f.outputFile):void 0,j=typeof f.currentStep==="number"?f.steps?.[f.currentStep]:void 0;return{activityState:f.activityState,lastActivityAt:f.lastActivityAt??n$($)??j?.lastActivityAt??j?.startedAt??f.startedAt}}function $$(n,f,$=[],j){if(f.sessionId!==void 0&&typeof f.sessionId!=="string")throw Error(`Invalid async status '${F.join(n,"status.json")}': sessionId must be a string.`);let{activityState:T,lastActivityAt:J}=f$(n,f),A=f.steps??[],B=f.chainStepCount??A.length,O=r(f.parallelGroups,A.length,B),c=[];if($.length===0&&j)try{c=jn(j)?.children??[]}catch(Z){$.push(`Nested status unavailable: ${u(Z)}`)}let L=A.map((Z,Y)=>{let{activityState:q,lastActivityAt:y}=Z;return{index:Y,agent:Z.agent,...Z.label?{label:Z.label}:{},...Z.phase?{phase:Z.phase}:{},...Z.outputName?{outputName:Z.outputName}:{},...Z.structured?{structured:Z.structured}:{},status:Z.status,...q?{activityState:q}:{},...y?{lastActivityAt:y}:{},...Z.currentTool?{currentTool:Z.currentTool}:{},...Z.currentToolArgs?{currentToolArgs:Z.currentToolArgs}:{},...Z.currentToolStartedAt?{currentToolStartedAt:Z.currentToolStartedAt}:{},...Z.currentPath?{currentPath:Z.currentPath}:{},...Z.recentTools?{recentTools:Z.recentTools.map((g)=>({...g}))}:{},...Z.recentOutput?{recentOutput:[...Z.recentOutput]}:{},...Z.turnCount!==void 0?{turnCount:Z.turnCount}:{},...Z.toolCount!==void 0?{toolCount:Z.toolCount}:{},...Z.steerCount!==void 0?{steerCount:Z.steerCount}:{},...Z.lastSteerAt!==void 0?{lastSteerAt:Z.lastSteerAt}:{},...Z.durationMs!==void 0?{durationMs:Z.durationMs}:{},...Z.tokens?{tokens:Z.tokens}:{},...Z.totalCost?{totalCost:Z.totalCost}:{},...Z.skills?{skills:Z.skills}:{},...Z.model?{model:Z.model}:{},...Z.thinking?{thinking:Z.thinking}:{},...Z.attemptedModels?{attemptedModels:Z.attemptedModels}:{},...Z.error?{error:Z.error}:{},...Z.timedOut!==void 0?{timedOut:Z.timedOut}:{},...Z.turnBudget?{turnBudget:Z.turnBudget}:{},...Z.turnBudgetExceeded!==void 0?{turnBudgetExceeded:Z.turnBudgetExceeded}:{},...Z.wrapUpRequested!==void 0?{wrapUpRequested:Z.wrapUpRequested}:{},...Z.children?.length?{children:Z.children}:{}}});return rn(f.runId||F.basename(n),L,c),{id:f.runId||F.basename(n),asyncDir:n,...f.sessionId?{sessionId:f.sessionId}:{},state:f.state,...f.error?{error:f.error}:{},activityState:T,lastActivityAt:J,currentTool:f.currentTool,currentToolStartedAt:f.currentToolStartedAt,currentPath:f.currentPath,turnCount:f.turnCount,toolCount:f.toolCount,steerCount:f.steerCount,lastSteerAt:f.lastSteerAt,mode:f.mode,cwd:f.cwd,startedAt:f.startedAt,lastUpdate:f.lastUpdate,endedAt:f.endedAt,...f.timeoutMs!==void 0?{timeoutMs:f.timeoutMs}:{},...f.deadlineAt!==void 0?{deadlineAt:f.deadlineAt}:{},...f.timedOut!==void 0?{timedOut:f.timedOut}:{},...f.turnBudget?{turnBudget:f.turnBudget}:{},...f.turnBudgetExceeded!==void 0?{turnBudgetExceeded:f.turnBudgetExceeded}:{},...f.wrapUpRequested!==void 0?{wrapUpRequested:f.wrapUpRequested}:{},currentStep:f.currentStep,...f.chainStepCount!==void 0?{chainStepCount:f.chainStepCount}:{},...f.pendingAppends!==void 0?{pendingAppends:f.pendingAppends}:{},...O.length?{parallelGroups:O}:{},steps:L,...c.length?{nestedChildren:c}:{},...$.length?{nestedWarnings:$}:{},...f.sessionDir?{sessionDir:f.sessionDir}:{},...f.outputFile?{outputFile:f.outputFile}:{},...f.totalTokens?{totalTokens:f.totalTokens}:{},...f.totalCost?{totalCost:f.totalCost}:{},...f.sessionFile?{sessionFile:f.sessionFile}:{}}}function j$(n){let f=($)=>{switch($){case"running":return 0;case"queued":return 1;case"failed":return 2;case"paused":return 2;case"complete":return 3}};return[...n].sort(($,j)=>{let T=f($.state)-f(j.state);if(T!==0)return T;let J=$.lastUpdate??$.endedAt??$.startedAt;return(j.lastUpdate??j.endedAt??j.startedAt)-J})}function tn(n,f={}){let $;try{$=i.readdirSync(n).filter((O)=>tf(n,O))}catch(O){if(Gn(O))return[];throw Error(`Failed to list async runs in '${n}': ${u(O)}`,{cause:O instanceof Error?O:void 0})}let j=f.states?new Set(f.states):void 0,T=[],J,A=(O)=>{if(!J)J=vn();return J.get(O)};for(let O of $){let c=F.join(n,O),Z=(f.reconcile===!1?void 0:yn(c,{resultsDir:f.resultsDir,kill:f.kill,now:f.now}))?.status??l(c);if(!Z)continue;if(j&&!j.has(Z.state))continue;if(f.sessionId&&Z.sessionId!==f.sessionId)continue;let Y=[],q;try{if(q=A(Z.runId||F.basename(c)),q)an(q,{resultsDir:f.resultsDir,kill:f.kill,now:f.now})}catch(g){Y.push(`Nested status unavailable: ${u(g)}`)}let y=$$(c,Z,Y,q);T.push(y)}let B=j$(T);return f.limit!==void 0?B.slice(0,f.limit):B}function nf(n){if(!n.outputFile)return;return F.isAbsolute(n.outputFile)?n.outputFile:F.join(n.asyncDir,n.outputFile)}function ff(n){let f=n.steps.length||1,$=n.chainStepCount??f,j=r(n.parallelGroups,n.steps.length,$),T=n.currentStep!==void 0?j.find((J)=>n.currentStep>=J.start&&n.currentStep<J.start+J.count):void 0;if(T){let J=n.steps.slice(T.start,T.start+T.count),A=Qn(J,T.count,{showRunning:n.state==="running"});if(n.mode==="parallel")return A;return`step ${T.stepIndex+1}/${$} · parallel group: ${A}`}if(n.mode==="parallel")return Qn(n.steps,f,{showRunning:n.state==="running"});if(n.mode==="chain"&&n.currentStep!==void 0&&j.length>0)return`step ${ln(n.currentStep,$,j)+1}/${$}`;return n.currentStep!==void 0?`step ${n.currentStep+1}/${f}`:`steps ${f}`}var $f=80,J$=500,T$=262144;function Fn(n){if(n===void 0)return $f;if(!Number.isFinite(n))return $f;return Math.max(1,Math.min(J$,Math.trunc(n)))}function jf(n){let f=new Set,$=[];for(let j of n){if(!j||f.has(j))continue;f.add(j),$.push(j)}return $}function A$(n,f){if(!f)return;return M.resolve(n,f)}function Jf(n,f){let $=M.resolve(n),j=M.resolve(f);return j===$||j.startsWith(`${$}${M.sep}`)}function Jn(n){return n instanceof Error?n.message:String(n)}function Tf(n){return typeof n==="object"&&n!==null&&"code"in n&&n.code==="ENOENT"}function O$(n,f){let $;try{$=W.statSync(n)}catch(T){if(Tf(T))return{path:n,lines:[],truncated:!1};return{path:n,lines:[],truncated:!1,error:Jn(T)}}if($.size===0)return{path:n,lines:[],truncated:!1};let j;try{let T=Math.min($.size,T$),J=$.size-T,A=Buffer.alloc(T);j=W.openSync(n,"r");let B=W.readSync(j,A,0,T,J),c=A.subarray(0,B).toString("utf-8").split(/\r?\n/);if(J>0&&c.length>0)c=c.slice(1);if(c.at(-1)==="")c=c.slice(0,-1);return{path:n,lines:c.slice(-f),truncated:J>0||c.length>f}}catch(T){return{path:n,lines:[],truncated:!1,error:Jn(T)}}finally{if(j!==void 0)W.closeSync(j)}}function Af(n,f,$,j){if($.length===0)return{path:n,lines:[],truncated:!1,error:`Refusing to read ${j} transcript path without a trusted root: ${n}`};let T=M.resolve(n);if(!$.some((O)=>Jf(O,T)))return{path:n,lines:[],truncated:!1,error:`Refusing to read ${j} transcript path outside trusted roots: ${n}`};let J;try{J=W.lstatSync(T)}catch(O){if(Tf(O))return{path:n,lines:[],truncated:!1};return{path:n,lines:[],truncated:!1,error:Jn(O)}}if(J.isSymbolicLink())return{path:n,lines:[],truncated:!1,error:`Refusing to read symlink ${j} transcript path: ${n}`};if(!J.isFile())return{path:n,lines:[],truncated:!1,error:`Refusing to read non-file ${j} transcript path: ${n}`};let A,B;try{A=W.realpathSync(T),B=$.filter((O)=>W.existsSync(O)).map((O)=>W.realpathSync(O))}catch(O){return{path:n,lines:[],truncated:!1,error:Jn(O)}}if(!B.some((O)=>Jf(O,A)))return{path:n,lines:[],truncated:!1,error:`Refusing to read ${j} transcript path outside trusted roots: ${n}`};return O$(T,f)}function Sn(n,f=240){let $;if(typeof n==="string")$=n;else $=JSON.stringify(n);return $.length>f?`${$.slice(0,f)}…`:$}function B$(n){if(typeof n==="string")return n;if(!Array.isArray(n))return"";return n.map((f)=>{if(!f||typeof f!=="object")return"";let $=f;if(typeof $.text==="string")return $.text;if($.type==="toolCall"||$.type==="tool_call")return`[tool: ${typeof $.name==="string"?$.name:typeof $.toolName==="string"?$.toolName:"tool"}${$.args===void 0?"":` ${Sn($.args)}`}]`;if($.type==="toolResult"||$.type==="tool_result")return`[tool result${$.result===void 0?"":`: ${Sn($.result)}`}]`;if($.content!==void 0)return Sn($.content);return""}).filter(Boolean).join(`
12
- `)}function Z$(n){if(!n||typeof n!=="object")return;let f=n,$=f.message&&typeof f.message==="object"?f.message:f,j=typeof $.role==="string"?$.role:void 0;if(!j)return;let T=B$($.content).trim();if(!T)return;return`${j}: ${T}`}function Of(n,f,$){let j=Af(n,Math.max(f*4,f),$,"session"),T=[];if(j.error)T.push(`Session read failed for ${n}: ${j.error}`);let J=[],A=0;for(let B of j.lines){if(!B.trim())continue;try{let O=JSON.parse(B),c=Z$(O);if(c)J.push(c)}catch{A++}}if(A>0)T.push(`Skipped ${A} malformed session tail line${A===1?"":"s"}.`);return{lines:J.slice(-f),warnings:T}}function Tn(n){let f=[];if(n.currentTool&&n.currentToolStartedAt!==void 0)f.push(`tool ${n.currentTool} ${P(Math.max(0,Date.now()-n.currentToolStartedAt))}`);else if(n.currentTool)f.push(`tool ${n.currentTool}`);if(n.currentPath)f.push(U(n.currentPath));if(n.turnCount!==void 0)f.push(`${n.turnCount} turns`);if(n.toolCount!==void 0)f.push(`${n.toolCount} tools`);if(n.tokens?.total)f.push(`${h(n.tokens.total)} tok`);let $=k(n.lastActivityAt,n.activityState);return $||f.length?[$,...f].filter(Boolean).join(" | "):void 0}function Q$(n){if(n.mode==="single"&&n.currentAgent)return n.currentAgent;return n.mode}function c$(n){if(n.length===0)return[];let f=["Foreground runs:"],$=[...n].sort((j,T)=>T.updatedAt-j.updatedAt);for(let j of $){let T=Tn({activityState:j.currentActivityState,lastActivityAt:j.lastActivityAt,currentTool:j.currentTool,currentToolStartedAt:j.currentToolStartedAt,currentPath:j.currentPath,turnCount:j.turnCount,toolCount:j.toolCount,...j.tokens!==void 0?{tokens:{total:j.tokens}}:{}}),J=j.currentAgent?` | ${j.currentAgent}${j.currentIndex!==void 0?` #${j.currentIndex}`:""}`:"";f.push(`- ${j.runId} | running | ${Q$(j)}${J}${T?` | ${T}`:""}`),f.push(` status: subagent({ action: "status", id: "${j.runId}" })`),f.push(" transcript: live in the expanded foreground result; persisted session transcript appears after completion when sessions are enabled."),f.push(...v(j.nestedChildren,{indent:" ",commandHints:!0,maxLines:12}))}return f}function L$(n){if(n.length===0)return[];let f=["Async runs:"];for(let $ of n){let j=ff($),T=Tn($),J=$.cwd?U($.cwd):U($.asyncDir),A=$.pendingAppends?` | ${$.pendingAppends} pending append${$.pendingAppends===1?"":"s"}`:"";f.push(`- ${$.id} | ${$.state}${T?` | ${T}`:""} | ${$.mode} | ${j}${A} | ${J}`),f.push(` status: subagent({ action: "status", id: "${$.id}" })`),f.push(` transcript: subagent({ action: "status", id: "${$.id}", view: "transcript" })`);for(let L of $.steps){let Z=L.label?`${L.label} (${L.agent})`:L.agent,Y=L.phase?`[${L.phase}] `:"",q=Tn(L),y=e(L.model,L.thinking),g=[`${L.index}. ${Y}${Z}`,L.status,q,y].filter(Boolean);f.push(` ${g.join(" | ")}`);let V=M.join($.asyncDir,`output-${L.index}.log`);if(W.existsSync(V))f.push(` output: ${U(V)}`);if(L.sessionFile)f.push(` session: ${U(L.sessionFile)}`);if(L.status==="running"||L.recentOutput?.length||W.existsSync(V))f.push(` transcript: subagent({ action: "status", id: "${$.id}", index: ${L.index}, view: "transcript" })`);f.push(...v(L.children,{indent:" ",commandHints:!0,maxLines:12}))}let B=new Set($.steps.flatMap((L)=>L.children?.map((Z)=>Z.id)??[])),O=$.nestedChildren?.filter((L)=>!B.has(L.id))??[];if(f.push(...v(O,{indent:" ",commandHints:!0,maxLines:12})),$.error)f.push(` error: ${$.error}`);for(let L of $.nestedWarnings??[])f.push(` warning: ${L}`);let c=nf($);if(c)f.push(` output: ${U(c)}`);if($.sessionFile)f.push(` session: ${U($.sessionFile)}`)}return f}function l0(n,f={}){if(f.childSafe)return{content:[{type:"text",text:'Child-safe subagent fleet view is unavailable without an explicit run id. Use subagent({ action: "status", id: "..." }) for the delegated run you can see.'}],isError:!0,details:{mode:"management",results:[]}};let $;try{$=tn(f.asyncDirRoot??Bn,{states:["queued","running"],sessionId:f.state?.currentSessionId??void 0,resultsDir:f.resultsDir??m,kill:f.kill,now:f.now})}catch(O){return{content:[{type:"text",text:O instanceof Error?O.message:String(O)}],isError:!0,details:{mode:"management",results:[]}}}let j=f.state?[...f.state.foregroundControls.values()]:[],T=j.length+$.length;if(T===0)return{content:[{type:"text",text:'No active subagent fleet. Background runs that already finished are available through completion notifications or subagent({ action: "status", id: "..." }).'}],details:{mode:"management",results:[]}};let J=[`Subagent fleet: ${T} active`,""],A=c$(j);if(A.length)J.push(...A,"");let B=L$($);if(B.length)J.push(...B,"");return J.push("Commands:"),J.push(' Refresh fleet: subagent({ action: "status", view: "fleet" })'),J.push(' Tail run transcript: subagent({ action: "status", id: "<run-id>", view: "transcript" })'),J.push(' Tail child transcript: subagent({ action: "status", id: "<run-id>", index: 0, view: "transcript" })'),{content:[{type:"text",text:J.join(`
13
- `).trimEnd()}],details:{mode:"management",results:[]}}}function q$(n,f){if(n===void 0)return;if(!Number.isInteger(n))throw Error("Transcript index must be an integer.");if(n<0||n>=f.length)throw Error(`Transcript index ${n} is out of range for ${f.length} child step${f.length===1?"":"s"}.`);return n}function X$(n,f){let $=n.steps??[],j=q$(f.index,$);if(j===void 0){if(n.state==="running"&&typeof n.currentStep==="number"&&n.currentStep>=0&&n.currentStep<$.length)j=n.currentStep;else if($.length===1)j=0}let T=j!==void 0?$[j]:void 0,J=f.index===void 0&&$.length>1?`Tip: pass index to inspect a specific child transcript (${$.map((A,B)=>`${B}=${A.agent}`).join(", ")}).`:void 0;return{index:j,step:T,hint:J}}function Y$(n,f,$){if(f===void 0||!$)return;let j=e($.model,$.thinking);return[`${n==="parallel"?"Agent":"Step"}: ${f} (${$.agent})`,$.status,Tn($),j,$.error?`error: ${$.error}`:void 0].filter(Boolean).join(" | ")}function Vn(n,f){let $=[];for(let j of f.outputPaths)$.push(`Output: ${j}`);if(f.sessionFile)$.push(`Session: ${f.sessionFile}`);if(f.eventsPath)$.push(`Events: ${f.eventsPath}`);if(f.logPath)$.push(`Log: ${f.logPath}`);if(f.resultPath)$.push(`Result: ${f.resultPath}`);if(!$.length)return;n.push("Artifacts:");for(let j of $)n.push(` ${j}`)}function An(n,f,$,j){if(n.push(`${f}${j?" (tail truncated)":""}:`),$.length===0){n.push(" (no transcript lines available yet)");return}for(let T of $)n.push(` ${T}`)}function K$(n,f,$={}){let j=Fn($.lines),T=X$(n,$),J=T.index!==void 0?M.join(f,`output-${T.index}.log`):void 0,A=A$(f,n.outputFile),B=M.join(f,`subagent-log-${n.runId}.md`),O=T.index!==void 0?jf([J,A&&J&&M.resolve(A)===M.resolve(J)?A:void 0]):jf([A]),c=T.index!==void 0?T.step?.sessionFile:n.sessionFile,L=M.join(f,"events.jsonl"),Z=[`Run: ${n.runId}`,`State: ${n.state}`,`Mode: ${n.mode}`,Y$(n.mode,T.index,T.step),T.hint].filter((V)=>Boolean(V));Vn(Z,{outputPaths:O,sessionFile:c,eventsPath:W.existsSync(L)?L:void 0,logPath:W.existsSync(B)?B:void 0});let Y=[],q=[],y="Transcript tail",g=!1;for(let V of O){let x=Af(V,j,[f],"output");if(x.error)Y.push(`Output read failed for ${x.path}: ${x.error}`);if(x.lines.length===0)continue;q=x.lines,y=`Transcript tail from ${x.path}`,g=x.truncated;break}if(q.length===0&&T.step?.recentOutput?.length)q=T.step.recentOutput.slice(-j),y="Recent output from status.json";if(q.length===0&&c){let V=Of(c,j,$.sessionRoots??[]);if(q=V.lines,Y.push(...V.warnings),q.length>0)y=`Session transcript tail from ${c}`}if(Y.length){Z.push("Warnings:");for(let V of Y)Z.push(` ${V}`)}return An(Z,y,q,g),Z.join(`
14
- `)}function p0(n,f={}){if(n.asyncDir){let J=l(n.asyncDir);if(J)return K$(J,n.asyncDir,f)}let $=Fn(f.lines),j=[`Nested run: ${n.id}`,`State: ${n.state}`,n.mode?`Mode: ${n.mode}`:void 0,n.agent?`Agent: ${n.agent}`:n.agents?.length?`Agents: ${n.agents.join(", ")}`:void 0].filter((J)=>Boolean(J));if(Vn(j,{outputPaths:[],sessionFile:n.sessionFile}),!n.sessionFile)return An(j,"Transcript tail",[],!1),j.join(`
15
- `);let T=Of(n.sessionFile,$,f.sessionRoots??[]);if(T.warnings.length){j.push("Warnings:");for(let J of T.warnings)j.push(` ${J}`)}return An(j,`Session transcript tail from ${n.sessionFile}`,T.lines,!1),j.join(`
16
- `)}function e0(n,f,$={}){let j=Fn($.lines),T=n.runId??n.id??M.basename(f,".json"),J=Array.isArray(n.results)?n.results:n.agent?[{agent:n.agent,output:n.output,summary:n.summary,sessionFile:n.sessionFile,state:n.state,success:n.success,exitCode:n.exitCode}]:[],A=$.index;if(A!==void 0&&!Number.isInteger(A))throw Error("Transcript index must be an integer.");if(A===void 0&&J.length===1)A=0;if(A!==void 0&&(A<0||A>=J.length))throw Error(`Transcript index ${A} is out of range for ${J.length} result child${J.length===1?"":"ren"}.`);let B=A!==void 0?J[A]:void 0,O=A!==void 0?B?.output??B?.summary??(J.length===1?n.output??n.summary:void 0)??"":n.output??n.summary??"",c=O.split(/\r?\n/).slice(-j),L=B?.sessionFile??n.sessionFile,Z=[`Run: ${T}`,`State: ${n.state??(n.success?"complete":"failed")}`,A!==void 0&&B?`Child: ${A} (${B.agent??"subagent"})`:void 0,A===void 0&&J.length>1?`Tip: pass index to inspect a specific child transcript (${J.map((Y,q)=>`${q}=${Y.agent??"subagent"}`).join(", ")}).`:void 0].filter((Y)=>Boolean(Y));return Vn(Z,{outputPaths:[],sessionFile:L,resultPath:f}),An(Z,"Result transcript tail",c.filter((Y)=>Y.trim()),O.split(/\r?\n/).length>j),Z.join(`
17
- `)}export{l0 as inspectSubagentFleet,p0 as formatNestedRunTranscript,K$ as formatAsyncRunTranscript,e0 as formatAsyncResultTranscript};
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { formatDuration, formatModelThinking, formatTokens, shortenPath } from "../../shared/formatters.js";
4
+ import { formatActivityLabel } from "../../shared/status-format.js";
5
+ import {
6
+ ASYNC_DIR,
7
+ RESULTS_DIR
8
+ } from "../../shared/types.js";
9
+ import { readStatus } from "../../shared/utils.js";
10
+ import { formatNestedRunStatusLines } from "../shared/nested-render.js";
11
+ import { formatAsyncRunOutputPath, formatAsyncRunProgressLabel, listAsyncRuns } from "./async-status.js";
12
+ const DEFAULT_TRANSCRIPT_LINES = 80;
13
+ const MAX_TRANSCRIPT_LINES = 500;
14
+ const TRANSCRIPT_TAIL_BYTES = 256 * 1024;
15
+ function transcriptLineLimit(value) {
16
+ if (value === undefined)
17
+ return DEFAULT_TRANSCRIPT_LINES;
18
+ if (!Number.isFinite(value))
19
+ return DEFAULT_TRANSCRIPT_LINES;
20
+ return Math.max(1, Math.min(MAX_TRANSCRIPT_LINES, Math.trunc(value)));
21
+ }
22
+ function uniqueStrings(values) {
23
+ const seen = new Set;
24
+ const result = [];
25
+ for (const value of values) {
26
+ if (!value || seen.has(value))
27
+ continue;
28
+ seen.add(value);
29
+ result.push(value);
30
+ }
31
+ return result;
32
+ }
33
+ function resolveMaybeRelative(asyncDir, filePath) {
34
+ if (!filePath)
35
+ return;
36
+ return path.resolve(asyncDir, filePath);
37
+ }
38
+ function pathWithin(base, candidate) {
39
+ const resolvedBase = path.resolve(base);
40
+ const resolvedCandidate = path.resolve(candidate);
41
+ return resolvedCandidate === resolvedBase || resolvedCandidate.startsWith(`${resolvedBase}${path.sep}`);
42
+ }
43
+ function getErrorMessage(error) {
44
+ return error instanceof Error ? error.message : String(error);
45
+ }
46
+ function isNotFoundError(error) {
47
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
48
+ }
49
+ function readTextTail(filePath, maxLines) {
50
+ let stat;
51
+ try {
52
+ stat = fs.statSync(filePath);
53
+ } catch (error) {
54
+ if (isNotFoundError(error))
55
+ return { path: filePath, lines: [], truncated: false };
56
+ return { path: filePath, lines: [], truncated: false, error: getErrorMessage(error) };
57
+ }
58
+ if (stat.size === 0)
59
+ return { path: filePath, lines: [], truncated: false };
60
+ let fd;
61
+ try {
62
+ const bytesToRead = Math.min(stat.size, TRANSCRIPT_TAIL_BYTES);
63
+ const start = stat.size - bytesToRead;
64
+ const buffer = Buffer.alloc(bytesToRead);
65
+ fd = fs.openSync(filePath, "r");
66
+ const bytesRead = fs.readSync(fd, buffer, 0, bytesToRead, start);
67
+ const content = buffer.subarray(0, bytesRead).toString("utf-8");
68
+ let lines = content.split(/\r?\n/);
69
+ if (start > 0 && lines.length > 0)
70
+ lines = lines.slice(1);
71
+ if (lines.at(-1) === "")
72
+ lines = lines.slice(0, -1);
73
+ return { path: filePath, lines: lines.slice(-maxLines), truncated: start > 0 || lines.length > maxLines };
74
+ } catch (error) {
75
+ return { path: filePath, lines: [], truncated: false, error: getErrorMessage(error) };
76
+ } finally {
77
+ if (fd !== undefined)
78
+ fs.closeSync(fd);
79
+ }
80
+ }
81
+ function readContainedTextTail(filePath, maxLines, trustedRoots, label) {
82
+ if (trustedRoots.length === 0)
83
+ return { path: filePath, lines: [], truncated: false, error: `Refusing to read ${label} transcript path without a trusted root: ${filePath}` };
84
+ const resolvedPath = path.resolve(filePath);
85
+ if (!trustedRoots.some((root) => pathWithin(root, resolvedPath))) {
86
+ return { path: filePath, lines: [], truncated: false, error: `Refusing to read ${label} transcript path outside trusted roots: ${filePath}` };
87
+ }
88
+ let lstat;
89
+ try {
90
+ lstat = fs.lstatSync(resolvedPath);
91
+ } catch (error) {
92
+ if (isNotFoundError(error))
93
+ return { path: filePath, lines: [], truncated: false };
94
+ return { path: filePath, lines: [], truncated: false, error: getErrorMessage(error) };
95
+ }
96
+ if (lstat.isSymbolicLink())
97
+ return { path: filePath, lines: [], truncated: false, error: `Refusing to read symlink ${label} transcript path: ${filePath}` };
98
+ if (!lstat.isFile())
99
+ return { path: filePath, lines: [], truncated: false, error: `Refusing to read non-file ${label} transcript path: ${filePath}` };
100
+ let realPath;
101
+ let realRoots;
102
+ try {
103
+ realPath = fs.realpathSync(resolvedPath);
104
+ realRoots = trustedRoots.filter((root) => fs.existsSync(root)).map((root) => fs.realpathSync(root));
105
+ } catch (error) {
106
+ return { path: filePath, lines: [], truncated: false, error: getErrorMessage(error) };
107
+ }
108
+ if (!realRoots.some((root) => pathWithin(root, realPath))) {
109
+ return { path: filePath, lines: [], truncated: false, error: `Refusing to read ${label} transcript path outside trusted roots: ${filePath}` };
110
+ }
111
+ return readTextTail(resolvedPath, maxLines);
112
+ }
113
+ function stringifyJsonPreview(value, maxLength = 240) {
114
+ let raw;
115
+ if (typeof value === "string")
116
+ raw = value;
117
+ else
118
+ raw = JSON.stringify(value);
119
+ return raw.length > maxLength ? `${raw.slice(0, maxLength)}…` : raw;
120
+ }
121
+ function contentText(content) {
122
+ if (typeof content === "string")
123
+ return content;
124
+ if (!Array.isArray(content))
125
+ return "";
126
+ return content.map((part) => {
127
+ if (!part || typeof part !== "object")
128
+ return "";
129
+ const entry = part;
130
+ if (typeof entry.text === "string")
131
+ return entry.text;
132
+ if (entry.type === "toolCall" || entry.type === "tool_call") {
133
+ const name = typeof entry.name === "string" ? entry.name : typeof entry.toolName === "string" ? entry.toolName : "tool";
134
+ return `[tool: ${name}${entry.args === undefined ? "" : ` ${stringifyJsonPreview(entry.args)}`}]`;
135
+ }
136
+ if (entry.type === "toolResult" || entry.type === "tool_result") {
137
+ return `[tool result${entry.result === undefined ? "" : `: ${stringifyJsonPreview(entry.result)}`}]`;
138
+ }
139
+ if (entry.content !== undefined)
140
+ return stringifyJsonPreview(entry.content);
141
+ return "";
142
+ }).filter(Boolean).join(`
143
+ `);
144
+ }
145
+ function sessionMessageLine(record) {
146
+ if (!record || typeof record !== "object")
147
+ return;
148
+ const outer = record;
149
+ const message = outer.message && typeof outer.message === "object" ? outer.message : outer;
150
+ const role = typeof message.role === "string" ? message.role : undefined;
151
+ if (!role)
152
+ return;
153
+ const text = contentText(message.content).trim();
154
+ if (!text)
155
+ return;
156
+ return `${role}: ${text}`;
157
+ }
158
+ function readSessionTranscriptTail(sessionFile, maxLines, trustedRoots) {
159
+ const tail = readContainedTextTail(sessionFile, Math.max(maxLines * 4, maxLines), trustedRoots, "session");
160
+ const warnings = [];
161
+ if (tail.error)
162
+ warnings.push(`Session read failed for ${sessionFile}: ${tail.error}`);
163
+ const lines = [];
164
+ let malformed = 0;
165
+ for (const line of tail.lines) {
166
+ if (!line.trim())
167
+ continue;
168
+ try {
169
+ const parsed = JSON.parse(line);
170
+ const messageLine = sessionMessageLine(parsed);
171
+ if (messageLine)
172
+ lines.push(messageLine);
173
+ } catch {
174
+ malformed++;
175
+ }
176
+ }
177
+ if (malformed > 0)
178
+ warnings.push(`Skipped ${malformed} malformed session tail line${malformed === 1 ? "" : "s"}.`);
179
+ return { lines: lines.slice(-maxLines), warnings };
180
+ }
181
+ function formatActivityFacts(input) {
182
+ const facts = [];
183
+ if (input.currentTool && input.currentToolStartedAt !== undefined)
184
+ facts.push(`tool ${input.currentTool} ${formatDuration(Math.max(0, Date.now() - input.currentToolStartedAt))}`);
185
+ else if (input.currentTool)
186
+ facts.push(`tool ${input.currentTool}`);
187
+ if (input.currentPath)
188
+ facts.push(shortenPath(input.currentPath));
189
+ if (input.turnCount !== undefined)
190
+ facts.push(`${input.turnCount} turns`);
191
+ if (input.toolCount !== undefined)
192
+ facts.push(`${input.toolCount} tools`);
193
+ if (input.tokens?.total)
194
+ facts.push(`${formatTokens(input.tokens.total)} tok`);
195
+ const activity = formatActivityLabel(input.lastActivityAt, input.activityState);
196
+ return activity || facts.length ? [activity, ...facts].filter(Boolean).join(" | ") : undefined;
197
+ }
198
+ function foregroundModeName(control) {
199
+ if (control.mode === "single" && control.currentAgent)
200
+ return control.currentAgent;
201
+ return control.mode;
202
+ }
203
+ function formatForegroundFleetLines(controls) {
204
+ if (controls.length === 0)
205
+ return [];
206
+ const lines = ["Foreground runs:"];
207
+ const ordered = [...controls].sort((left, right) => right.updatedAt - left.updatedAt);
208
+ for (const control of ordered) {
209
+ const activity = formatActivityFacts({
210
+ activityState: control.currentActivityState,
211
+ lastActivityAt: control.lastActivityAt,
212
+ currentTool: control.currentTool,
213
+ currentToolStartedAt: control.currentToolStartedAt,
214
+ currentPath: control.currentPath,
215
+ turnCount: control.turnCount,
216
+ toolCount: control.toolCount,
217
+ ...control.tokens !== undefined ? { tokens: { total: control.tokens } } : {}
218
+ });
219
+ const current = control.currentAgent ? ` | ${control.currentAgent}${control.currentIndex !== undefined ? ` #${control.currentIndex}` : ""}` : "";
220
+ lines.push(`- ${control.runId} | running | ${foregroundModeName(control)}${current}${activity ? ` | ${activity}` : ""}`);
221
+ lines.push(` status: subagent({ action: "status", id: "${control.runId}" })`);
222
+ lines.push(" transcript: live in the expanded foreground result; persisted session transcript appears after completion when sessions are enabled.");
223
+ lines.push(...formatNestedRunStatusLines(control.nestedChildren, { indent: " ", commandHints: true, maxLines: 12 }));
224
+ }
225
+ return lines;
226
+ }
227
+ function formatAsyncFleetLines(runs) {
228
+ if (runs.length === 0)
229
+ return [];
230
+ const lines = ["Async runs:"];
231
+ for (const run of runs) {
232
+ const progress = formatAsyncRunProgressLabel(run);
233
+ const activity = formatActivityFacts(run);
234
+ const cwd = run.cwd ? shortenPath(run.cwd) : shortenPath(run.asyncDir);
235
+ const pending = run.pendingAppends ? ` | ${run.pendingAppends} pending append${run.pendingAppends === 1 ? "" : "s"}` : "";
236
+ lines.push(`- ${run.id} | ${run.state}${activity ? ` | ${activity}` : ""} | ${run.mode} | ${progress}${pending} | ${cwd}`);
237
+ lines.push(` status: subagent({ action: "status", id: "${run.id}" })`);
238
+ lines.push(` transcript: subagent({ action: "status", id: "${run.id}", view: "transcript" })`);
239
+ for (const step of run.steps) {
240
+ const display = step.label ? `${step.label} (${step.agent})` : step.agent;
241
+ const phase = step.phase ? `[${step.phase}] ` : "";
242
+ const stepActivity = formatActivityFacts(step);
243
+ const modelThinking = formatModelThinking(step.model, step.thinking);
244
+ const parts = [`${step.index}. ${phase}${display}`, step.status, stepActivity, modelThinking].filter(Boolean);
245
+ lines.push(` ${parts.join(" | ")}`);
246
+ const output = path.join(run.asyncDir, `output-${step.index}.log`);
247
+ if (fs.existsSync(output))
248
+ lines.push(` output: ${shortenPath(output)}`);
249
+ if (step.sessionFile)
250
+ lines.push(` session: ${shortenPath(step.sessionFile)}`);
251
+ if (step.status === "running" || step.recentOutput?.length || fs.existsSync(output)) {
252
+ lines.push(` transcript: subagent({ action: "status", id: "${run.id}", index: ${step.index}, view: "transcript" })`);
253
+ }
254
+ lines.push(...formatNestedRunStatusLines(step.children, { indent: " ", commandHints: true, maxLines: 12 }));
255
+ }
256
+ const attached = new Set(run.steps.flatMap((step) => step.children?.map((child) => child.id) ?? []));
257
+ const unattached = run.nestedChildren?.filter((child) => !attached.has(child.id)) ?? [];
258
+ lines.push(...formatNestedRunStatusLines(unattached, { indent: " ", commandHints: true, maxLines: 12 }));
259
+ if (run.error)
260
+ lines.push(` error: ${run.error}`);
261
+ for (const warning of run.nestedWarnings ?? [])
262
+ lines.push(` warning: ${warning}`);
263
+ const outputPath = formatAsyncRunOutputPath(run);
264
+ if (outputPath)
265
+ lines.push(` output: ${shortenPath(outputPath)}`);
266
+ if (run.sessionFile)
267
+ lines.push(` session: ${shortenPath(run.sessionFile)}`);
268
+ }
269
+ return lines;
270
+ }
271
+ export function inspectSubagentFleet(_params, deps = {}) {
272
+ if (deps.childSafe) {
273
+ return {
274
+ content: [{ type: "text", text: 'Child-safe subagent fleet view is unavailable without an explicit run id. Use subagent({ action: "status", id: "..." }) for the delegated run you can see.' }],
275
+ isError: true,
276
+ details: { mode: "management", results: [] }
277
+ };
278
+ }
279
+ let asyncRuns;
280
+ try {
281
+ asyncRuns = listAsyncRuns(deps.asyncDirRoot ?? ASYNC_DIR, {
282
+ states: ["queued", "running"],
283
+ sessionId: deps.state?.currentSessionId ?? undefined,
284
+ resultsDir: deps.resultsDir ?? RESULTS_DIR,
285
+ kill: deps.kill,
286
+ now: deps.now
287
+ });
288
+ } catch (error) {
289
+ const message = error instanceof Error ? error.message : String(error);
290
+ return { content: [{ type: "text", text: message }], isError: true, details: { mode: "management", results: [] } };
291
+ }
292
+ const foregroundControls = deps.state ? [...deps.state.foregroundControls.values()] : [];
293
+ const total = foregroundControls.length + asyncRuns.length;
294
+ if (total === 0) {
295
+ return {
296
+ content: [{ type: "text", text: 'No active subagent fleet. Background runs that already finished are available through completion notifications or subagent({ action: "status", id: "..." }).' }],
297
+ details: { mode: "management", results: [] }
298
+ };
299
+ }
300
+ const lines = [`Subagent fleet: ${total} active`, ""];
301
+ const foregroundLines = formatForegroundFleetLines(foregroundControls);
302
+ if (foregroundLines.length)
303
+ lines.push(...foregroundLines, "");
304
+ const asyncLines = formatAsyncFleetLines(asyncRuns);
305
+ if (asyncLines.length)
306
+ lines.push(...asyncLines, "");
307
+ lines.push("Commands:");
308
+ lines.push(' Refresh fleet: subagent({ action: "status", view: "fleet" })');
309
+ lines.push(' Tail run transcript: subagent({ action: "status", id: "<run-id>", view: "transcript" })');
310
+ lines.push(' Tail child transcript: subagent({ action: "status", id: "<run-id>", index: 0, view: "transcript" })');
311
+ return { content: [{ type: "text", text: lines.join(`
312
+ `).trimEnd() }], details: { mode: "management", results: [] } };
313
+ }
314
+ function validateTranscriptIndex(index, steps) {
315
+ if (index === undefined)
316
+ return;
317
+ if (!Number.isInteger(index))
318
+ throw new Error("Transcript index must be an integer.");
319
+ if (index < 0 || index >= steps.length)
320
+ throw new Error(`Transcript index ${index} is out of range for ${steps.length} child step${steps.length === 1 ? "" : "s"}.`);
321
+ return index;
322
+ }
323
+ function selectTranscriptStep(status, options) {
324
+ const steps = status.steps ?? [];
325
+ let selectedIndex = validateTranscriptIndex(options.index, steps);
326
+ if (selectedIndex === undefined) {
327
+ if (status.state === "running" && typeof status.currentStep === "number" && status.currentStep >= 0 && status.currentStep < steps.length) {
328
+ selectedIndex = status.currentStep;
329
+ } else if (steps.length === 1) {
330
+ selectedIndex = 0;
331
+ }
332
+ }
333
+ const step = selectedIndex !== undefined ? steps[selectedIndex] : undefined;
334
+ const hint = options.index === undefined && steps.length > 1 ? `Tip: pass index to inspect a specific child transcript (${steps.map((candidate, index) => `${index}=${candidate.agent}`).join(", ")}).` : undefined;
335
+ return { index: selectedIndex, step, hint };
336
+ }
337
+ function stepStateLine(mode, index, step) {
338
+ if (index === undefined || !step)
339
+ return;
340
+ const modelThinking = formatModelThinking(step.model, step.thinking);
341
+ const parts = [
342
+ `${mode === "parallel" ? "Agent" : "Step"}: ${index} (${step.agent})`,
343
+ step.status,
344
+ formatActivityFacts(step),
345
+ modelThinking,
346
+ step.error ? `error: ${step.error}` : undefined
347
+ ].filter(Boolean);
348
+ return parts.join(" | ");
349
+ }
350
+ function appendKnownArtifacts(lines, input) {
351
+ const artifacts = [];
352
+ for (const outputPath of input.outputPaths)
353
+ artifacts.push(`Output: ${outputPath}`);
354
+ if (input.sessionFile)
355
+ artifacts.push(`Session: ${input.sessionFile}`);
356
+ if (input.eventsPath)
357
+ artifacts.push(`Events: ${input.eventsPath}`);
358
+ if (input.logPath)
359
+ artifacts.push(`Log: ${input.logPath}`);
360
+ if (input.resultPath)
361
+ artifacts.push(`Result: ${input.resultPath}`);
362
+ if (!artifacts.length)
363
+ return;
364
+ lines.push("Artifacts:");
365
+ for (const artifact of artifacts)
366
+ lines.push(` ${artifact}`);
367
+ }
368
+ function appendTranscriptBody(lines, sourceLabel, sourceLines, truncated) {
369
+ lines.push(`${sourceLabel}${truncated ? " (tail truncated)" : ""}:`);
370
+ if (sourceLines.length === 0) {
371
+ lines.push(" (no transcript lines available yet)");
372
+ return;
373
+ }
374
+ for (const line of sourceLines)
375
+ lines.push(` ${line}`);
376
+ }
377
+ export function formatAsyncRunTranscript(status, asyncDir, options = {}) {
378
+ const lineLimit = transcriptLineLimit(options.lines);
379
+ const selected = selectTranscriptStep(status, options);
380
+ const stepOutputPath = selected.index !== undefined ? path.join(asyncDir, `output-${selected.index}.log`) : undefined;
381
+ const runOutputPath = resolveMaybeRelative(asyncDir, status.outputFile);
382
+ const logPath = path.join(asyncDir, `subagent-log-${status.runId}.md`);
383
+ const outputPaths = selected.index !== undefined ? uniqueStrings([stepOutputPath, runOutputPath && stepOutputPath && path.resolve(runOutputPath) === path.resolve(stepOutputPath) ? runOutputPath : undefined]) : uniqueStrings([runOutputPath]);
384
+ const sessionFile = selected.index !== undefined ? selected.step?.sessionFile : status.sessionFile;
385
+ const eventsPath = path.join(asyncDir, "events.jsonl");
386
+ const lines = [
387
+ `Run: ${status.runId}`,
388
+ `State: ${status.state}`,
389
+ `Mode: ${status.mode}`,
390
+ stepStateLine(status.mode, selected.index, selected.step),
391
+ selected.hint
392
+ ].filter((line) => Boolean(line));
393
+ appendKnownArtifacts(lines, { outputPaths, sessionFile, eventsPath: fs.existsSync(eventsPath) ? eventsPath : undefined, logPath: fs.existsSync(logPath) ? logPath : undefined });
394
+ const warnings = [];
395
+ let transcriptLines = [];
396
+ let transcriptSource = "Transcript tail";
397
+ let truncated = false;
398
+ for (const outputPath of outputPaths) {
399
+ const tail = readContainedTextTail(outputPath, lineLimit, [asyncDir], "output");
400
+ if (tail.error)
401
+ warnings.push(`Output read failed for ${tail.path}: ${tail.error}`);
402
+ if (tail.lines.length === 0)
403
+ continue;
404
+ transcriptLines = tail.lines;
405
+ transcriptSource = `Transcript tail from ${tail.path}`;
406
+ truncated = tail.truncated;
407
+ break;
408
+ }
409
+ if (transcriptLines.length === 0 && selected.step?.recentOutput?.length) {
410
+ transcriptLines = selected.step.recentOutput.slice(-lineLimit);
411
+ transcriptSource = "Recent output from status.json";
412
+ }
413
+ if (transcriptLines.length === 0 && sessionFile) {
414
+ const sessionTail = readSessionTranscriptTail(sessionFile, lineLimit, options.sessionRoots ?? []);
415
+ transcriptLines = sessionTail.lines;
416
+ warnings.push(...sessionTail.warnings);
417
+ if (transcriptLines.length > 0)
418
+ transcriptSource = `Session transcript tail from ${sessionFile}`;
419
+ }
420
+ if (warnings.length) {
421
+ lines.push("Warnings:");
422
+ for (const warning of warnings)
423
+ lines.push(` ${warning}`);
424
+ }
425
+ appendTranscriptBody(lines, transcriptSource, transcriptLines, truncated);
426
+ return lines.join(`
427
+ `);
428
+ }
429
+ export function formatNestedRunTranscript(run, options = {}) {
430
+ if (run.asyncDir) {
431
+ const status = readStatus(run.asyncDir);
432
+ if (status)
433
+ return formatAsyncRunTranscript(status, run.asyncDir, options);
434
+ }
435
+ const lineLimit = transcriptLineLimit(options.lines);
436
+ const lines = [
437
+ `Nested run: ${run.id}`,
438
+ `State: ${run.state}`,
439
+ run.mode ? `Mode: ${run.mode}` : undefined,
440
+ run.agent ? `Agent: ${run.agent}` : run.agents?.length ? `Agents: ${run.agents.join(", ")}` : undefined
441
+ ].filter((line) => Boolean(line));
442
+ appendKnownArtifacts(lines, { outputPaths: [], sessionFile: run.sessionFile });
443
+ if (!run.sessionFile) {
444
+ appendTranscriptBody(lines, "Transcript tail", [], false);
445
+ return lines.join(`
446
+ `);
447
+ }
448
+ const sessionTail = readSessionTranscriptTail(run.sessionFile, lineLimit, options.sessionRoots ?? []);
449
+ if (sessionTail.warnings.length) {
450
+ lines.push("Warnings:");
451
+ for (const warning of sessionTail.warnings)
452
+ lines.push(` ${warning}`);
453
+ }
454
+ appendTranscriptBody(lines, `Session transcript tail from ${run.sessionFile}`, sessionTail.lines, false);
455
+ return lines.join(`
456
+ `);
457
+ }
458
+ export function formatAsyncResultTranscript(data, resultPath, options = {}) {
459
+ const lineLimit = transcriptLineLimit(options.lines);
460
+ const runId = data.runId ?? data.id ?? path.basename(resultPath, ".json");
461
+ const children = Array.isArray(data.results) ? data.results : data.agent ? [{ agent: data.agent, output: data.output, summary: data.summary, sessionFile: data.sessionFile, state: data.state, success: data.success, exitCode: data.exitCode }] : [];
462
+ let index = options.index;
463
+ if (index !== undefined && !Number.isInteger(index))
464
+ throw new Error("Transcript index must be an integer.");
465
+ if (index === undefined && children.length === 1)
466
+ index = 0;
467
+ if (index !== undefined && (index < 0 || index >= children.length))
468
+ throw new Error(`Transcript index ${index} is out of range for ${children.length} result child${children.length === 1 ? "" : "ren"}.`);
469
+ const child = index !== undefined ? children[index] : undefined;
470
+ const output = index !== undefined ? child?.output ?? child?.summary ?? (children.length === 1 ? data.output ?? data.summary : undefined) ?? "" : data.output ?? data.summary ?? "";
471
+ const transcriptLines = output.split(/\r?\n/).slice(-lineLimit);
472
+ const sessionFile = child?.sessionFile ?? data.sessionFile;
473
+ const lines = [
474
+ `Run: ${runId}`,
475
+ `State: ${data.state ?? (data.success ? "complete" : "failed")}`,
476
+ index !== undefined && child ? `Child: ${index} (${child.agent ?? "subagent"})` : undefined,
477
+ index === undefined && children.length > 1 ? `Tip: pass index to inspect a specific child transcript (${children.map((candidate, childIndex) => `${childIndex}=${candidate.agent ?? "subagent"}`).join(", ")}).` : undefined
478
+ ].filter((line) => Boolean(line));
479
+ appendKnownArtifacts(lines, { outputPaths: [], sessionFile, resultPath });
480
+ appendTranscriptBody(lines, "Result transcript tail", transcriptLines.filter((line) => line.trim()), output.split(/\r?\n/).length > lineLimit);
481
+ return lines.join(`
482
+ `);
483
+ }