@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,11 +1,308 @@
1
- import*as H from"node:fs";import*as U from"node:path";import*as V$ from"node:fs";import*as C from"node:path";var L$=[10,25,50,100,200,500,1000,2000,4000],U$=new Set(["EACCES","EBUSY","EPERM"]),p=typeof SharedArrayBuffer<"u"?new SharedArrayBuffer(4):void 0,u=p?new Int32Array(p):void 0;function M$($){if($<=0)return;if(u)try{Atomics.wait(u,0,0,$);return}catch{}let J=Date.now()+$;while(Date.now()<J);}function f$($){let J=$?.code;return typeof J==="string"&&U$.has(J)}function A$($,J,j,Z,W){for(let Q=0;;Q++)try{$.renameSync(J,j);return}catch(B){let O=Z[Q];if(O===void 0||!f$(B))throw B;W(O)}}function z$($={}){let J=$.fs??V$,j=$.now??Date.now,Z=$.pid??process.pid,W=$.random??Math.random,B=$.retryRenameErrors??process.platform==="win32"?$.retryDelaysMs??L$:[],O=$.wait??M$;return(K,V)=>{J.mkdirSync(C.dirname(K),{recursive:!0});let L=C.join(C.dirname(K),`.${C.basename(K)}.${Z}.${j()}.${W().toString(36).slice(2)}.tmp`);try{J.writeFileSync(L,JSON.stringify(V,null,2),"utf-8"),A$(J,L,K,B,O)}finally{J.rmSync(L,{force:!0})}}}var _=z$();import*as E from"node:os";import*as y from"node:path";function b($){return $.trim().replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown"}function T$($){let J=$?.env??process.env,j=$&&Object.hasOwn($,"getuid")?$.getuid:process.getuid?.bind(process);if(typeof j==="function")return`uid-${j()}`;for(let B of["USERNAME","USER","LOGNAME"]){let O=J[B];if(O)return`user-${b(O)}`}let Z=$&&Object.hasOwn($,"userInfo")?$.userInfo:E.userInfo;try{let B=Z?.().username;if(B)return`user-${b(B)}`}catch{}let W=J.USERPROFILE??J.HOME;if(W)return`home-${b(W)}`;let Q=$&&Object.hasOwn($,"homedir")?$.homedir:E.homedir;try{let B=Q?.();if(B)return`home-${b(B)}`}catch{}return"shared"}var F=y.join(E.tmpdir(),`dm-subagents-${T$()}`),I=y.join(F,"async-subagent-results"),F$=y.join(F,"async-subagent-runs"),C$=y.join(F,"chain-runs"),jj=y.join(F,"artifacts");function _$($,J,j){if(typeof $!=="object"||$===null)return!1;let{start:Z,count:W,stepIndex:Q}=$;return typeof Z==="number"&&typeof W==="number"&&typeof Q==="number"&&Number.isInteger(Z)&&Number.isInteger(W)&&Number.isInteger(Q)&&Z>=0&&W>0&&Q>=0&&Q<j&&Z+W<=J}function r($,J,j){if(!Array.isArray($))return[];return $.filter((Z)=>_$(Z,J,j)).sort((Z,W)=>Z.stepIndex-W.stepIndex||Z.start-W.start)}import{randomUUID as x$}from"node:crypto";import*as M from"node:fs";import*as q from"node:path";import*as s from"node:path";var E$=128,y$=4;function k($){return typeof $==="string"&&$.length>0&&$.length<=E$&&!s.isAbsolute($)&&!$.includes("/")&&!$.includes("\\")&&!$.includes("..")}function l($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function i($,J){return typeof $==="string"&&$.length>0?$.slice(0,J):void 0}function a($){if(!Array.isArray($))return[];return $.map((J)=>{if(!J||typeof J!=="object")return;let j=J;if(!k(j.runId))return;return{runId:j.runId,...l(j.stepIndex)!==void 0?{stepIndex:l(j.stepIndex)}:{},...i(j.agent,128)?{agent:i(j.agent,128)}:{}}}).filter((J)=>Boolean(J)).slice(0,y$)}import*as A from"node:path";import{fileURLToPath as e}from"node:url";import*as z from"node:os";import*as f from"node:path";var bj=f.join(z.homedir(),".config","mcp","mcp.json"),Ij={cursor:[f.join(z.homedir(),".cursor","mcp.json")],"claude-code":[f.join(z.homedir(),".claude","mcp.json"),f.join(z.homedir(),".claude.json"),f.join(z.homedir(),".claude","claude_desktop_config.json")],"claude-desktop":[f.join(z.homedir(),"Library","Application Support","Claude","claude_desktop_config.json")],codex:[f.join(z.homedir(),".codex","config.json")],windsurf:[f.join(z.homedir(),".windsurf","mcp.json")],vscode:[".vscode/mcp.json"]};import{Compile as xj}from"typebox/compile";function t($,J){let j=e($),Z=A.extname(j),W=[".js",".mjs",".cjs",".ts",".mts",".cts"].includes(Z)?Z:".ts";return A.join(A.dirname(j),`${J}${W}`)}function $$($){return A.basename(e($)).startsWith("dm-args.")}function N$($=import.meta.url){let J=$$($)?"subagent-prompt-runtime":A.join("..","runs","shared","subagent-prompt-runtime");return t($,J)}function R$($=import.meta.url){let J=$$($)?A.join("..","..","extension","fanout-child"):"fanout-child";return t($,J)}var rj=N$(),lj=R$();var j$=q.join(F,"nested-subagent-events");var D$="registry.json",h=65536,v=12,R=16,g=3;function x($){return k($)}function P$($,J){if(!x(J))throw Error(`${$} must be a non-empty safe id token.`)}function J$($,J){P$($,J)}function c($,J){let j=q.resolve($),Z=q.resolve(J);return Z===j||Z.startsWith(`${j}${q.sep}`)}function Q$($){return q.dirname(q.resolve($.eventSink))}function d($){if(J$("rootRunId",$.rootRunId),J$("capabilityToken",$.capabilityToken),!c(j$,$.eventSink))throw Error("Nested event sink is outside the subagent nested event root.");if(!c(j$,$.controlInbox))throw Error("Nested control inbox is outside the subagent nested event root.");if(Q$($)!==q.dirname(q.resolve($.controlInbox)))throw Error("Nested event sink and control inbox must share one route root.")}function W$($,J){if(!J.asyncDir)return;let j=q.resolve(J.asyncDir),Z=q.resolve(F,"nested-subagent-runs",$,J.id),W=q.relative(Z,j);return j===Z||!W.startsWith("..")&&!q.isAbsolute(W)?j:void 0}function X($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function Y($,J=512){return typeof $==="string"&&$.length>0?$.slice(0,J):void 0}function w$($){if(!$||typeof $!=="object")return;let J=$,j=X(J.input),Z=X(J.output),W=X(J.total);return j!==void 0&&Z!==void 0&&W!==void 0?{input:j,output:Z,total:W}:void 0}function k$($){if(!$||typeof $!=="object")return;let J=$,j=X(J.inputTokens),Z=X(J.outputTokens),W=X(J.costUsd);return j!==void 0&&Z!==void 0&&W!==void 0?{inputTokens:j,outputTokens:Z,costUsd:W}:void 0}function D($){if(!$||typeof $!=="object")return;let J=$,j=X(J.maxTurns),Z=X(J.graceTurns),W=X(J.turnCount),Q=J.outcome==="within-budget"||J.outcome==="wrap-up-requested"||J.outcome==="exceeded"?J.outcome:void 0;if(j===void 0||Z===void 0||W===void 0||!Q)return;return{maxTurns:j,graceTurns:Z,turnCount:W,outcome:Q,...X(J.wrapUpRequestedAtTurn)!==void 0?{wrapUpRequestedAtTurn:X(J.wrapUpRequestedAtTurn)}:{},...X(J.exceededAtTurn)!==void 0?{exceededAtTurn:X(J.exceededAtTurn)}:{}}}function v$($,J){return $==="queued"||$==="running"||$==="complete"||$==="failed"||$==="paused"?$:J}function g$($,J){if(!$||typeof $!=="object")return;let j=$,Z=Y(j.agent,128);if(!Z)return;let W=j.status==="pending"||j.status==="running"||j.status==="complete"||j.status==="completed"||j.status==="failed"||j.status==="paused"?j.status:"pending";return{agent:Z,status:W,...Y(j.sessionFile,2048)?{sessionFile:Y(j.sessionFile,2048)}:{},...j.activityState==="active_long_running"||j.activityState==="needs_attention"?{activityState:j.activityState}:{},...X(j.lastActivityAt)!==void 0?{lastActivityAt:X(j.lastActivityAt)}:{},...Y(j.currentTool,128)?{currentTool:Y(j.currentTool,128)}:{},...X(j.currentToolStartedAt)!==void 0?{currentToolStartedAt:X(j.currentToolStartedAt)}:{},...Y(j.currentPath,2048)?{currentPath:Y(j.currentPath,2048)}:{},...X(j.turnCount)!==void 0?{turnCount:X(j.turnCount)}:{},...X(j.toolCount)!==void 0?{toolCount:X(j.toolCount)}:{},...X(j.startedAt)!==void 0?{startedAt:X(j.startedAt)}:{},...X(j.endedAt)!==void 0?{endedAt:X(j.endedAt)}:{},...Y(j.error,1024)?{error:Y(j.error,1024)}:{},...j.timedOut===!0?{timedOut:!0}:{},...D(j.turnBudget)?{turnBudget:D(j.turnBudget)}:{},...j.turnBudgetExceeded===!0?{turnBudgetExceeded:!0}:{},...j.wrapUpRequested===!0?{wrapUpRequested:!0}:{},...J<g&&Array.isArray(j.children)?{children:j.children.map((Q)=>P(Q,J+1)).filter((Q)=>Boolean(Q)).slice(0,R)}:{}}}function P($,J=0){if(!$||typeof $!=="object")return;let j=$;if(!x(j.id)||!x(j.parentRunId))return;let Z=a(j.path),W=Array.isArray(j.steps)?j.steps.map((O)=>g$(O,J+1)).filter((O)=>Boolean(O)).slice(0,v):void 0,Q=w$(j.totalTokens),B=k$(j.totalCost);return{id:j.id,parentRunId:j.parentRunId,...X(j.parentStepIndex)!==void 0?{parentStepIndex:X(j.parentStepIndex)}:{},...Y(j.parentAgent,128)?{parentAgent:Y(j.parentAgent,128)}:{},depth:Math.min(Math.max(0,X(j.depth)??0),g),path:Z,state:v$(j.state,"running"),...Y(j.asyncDir,2048)?{asyncDir:Y(j.asyncDir,2048)}:{},...X(j.pid)!==void 0&&X(j.pid)>0&&Number.isInteger(X(j.pid))?{pid:X(j.pid)}:{},...Y(j.sessionId,256)?{sessionId:Y(j.sessionId,256)}:{},...Y(j.sessionFile,2048)?{sessionFile:Y(j.sessionFile,2048)}:{},...Y(j.intercomTarget,256)?{intercomTarget:Y(j.intercomTarget,256)}:{},...Y(j.ownerIntercomTarget,256)?{ownerIntercomTarget:Y(j.ownerIntercomTarget,256)}:{},...Y(j.leafIntercomTarget,256)?{leafIntercomTarget:Y(j.leafIntercomTarget,256)}:{},...j.ownerState==="live"||j.ownerState==="gone"||j.ownerState==="unknown"?{ownerState:j.ownerState}:{},...Y(j.controlInbox,2048)?{controlInbox:Y(j.controlInbox,2048)}:{},...Y(j.capabilityToken,128)?{capabilityToken:Y(j.capabilityToken,128)}:{},...j.mode==="single"||j.mode==="parallel"||j.mode==="chain"?{mode:j.mode}:{},...Y(j.agent,128)?{agent:Y(j.agent,128)}:{},...Array.isArray(j.agents)?{agents:j.agents.map((O)=>Y(O,128)).filter((O)=>Boolean(O)).slice(0,v)}:{},...X(j.currentStep)!==void 0?{currentStep:X(j.currentStep)}:{},...X(j.chainStepCount)!==void 0?{chainStepCount:X(j.chainStepCount)}:{},...j.activityState==="active_long_running"||j.activityState==="needs_attention"?{activityState:j.activityState}:{},...X(j.lastActivityAt)!==void 0?{lastActivityAt:X(j.lastActivityAt)}:{},...Y(j.currentTool,128)?{currentTool:Y(j.currentTool,128)}:{},...X(j.currentToolStartedAt)!==void 0?{currentToolStartedAt:X(j.currentToolStartedAt)}:{},...Y(j.currentPath,2048)?{currentPath:Y(j.currentPath,2048)}:{},...X(j.turnCount)!==void 0?{turnCount:X(j.turnCount)}:{},...X(j.toolCount)!==void 0?{toolCount:X(j.toolCount)}:{},...Q?{totalTokens:Q}:{},...B?{totalCost:B}:{},...X(j.startedAt)!==void 0?{startedAt:X(j.startedAt)}:{},...X(j.endedAt)!==void 0?{endedAt:X(j.endedAt)}:{},...X(j.lastUpdate)!==void 0?{lastUpdate:X(j.lastUpdate)}:{},...X(j.timeoutMs)!==void 0?{timeoutMs:X(j.timeoutMs)}:{},...X(j.deadlineAt)!==void 0?{deadlineAt:X(j.deadlineAt)}:{},...j.timedOut===!0?{timedOut:!0}:{},...D(j.turnBudget)?{turnBudget:D(j.turnBudget)}:{},...j.turnBudgetExceeded===!0?{turnBudgetExceeded:!0}:{},...j.wrapUpRequested===!0?{wrapUpRequested:!0}:{},...Y(j.error,1024)?{error:Y(j.error,1024)}:{},...W&&W.length>0?{steps:W}:{},...J<g&&Array.isArray(j.children)?{children:j.children.map((O)=>P(O,J+1)).filter((O)=>Boolean(O)).slice(0,R)}:{}}}function m($,J){if(Buffer.byteLength($,"utf-8")>h)return;let j;try{j=JSON.parse($)}catch{return}if(!j||typeof j!=="object")return;let Z=j;if(Z.type!=="subagent.nested.started"&&Z.type!=="subagent.nested.updated"&&Z.type!=="subagent.nested.completed")return;if(Z.rootRunId!==J.rootRunId||Z.capabilityToken!==J.capabilityToken)return;if(!x(Z.parentRunId))return;let W=X(Z.ts);if(W===void 0)return;let Q=P(Z.child);if(!Q||Q.id===J.rootRunId)return;let B={...Q,controlInbox:J.controlInbox,capabilityToken:J.capabilityToken,ownerState:Q.ownerState??"unknown"};return{type:Z.type,ts:W,rootRunId:J.rootRunId,parentRunId:Z.parentRunId,...X(Z.parentStepIndex)!==void 0?{parentStepIndex:X(Z.parentStepIndex)}:{},capabilityToken:J.capabilityToken,child:B}}function c$($,J){if(!$.includes(`
2
- `)){let j=m($.trim(),J);return j?[j]:[]}return $.split(`
3
- `).slice(0,$.endsWith(`
4
- `)?void 0:-1).map((j)=>j.trim()?m(j,J):void 0).filter((j)=>Boolean(j))}function N($){return $==="complete"||$==="failed"||$==="paused"}function Z$($,J){let j=J.type==="subagent.nested.completed"&&J.child.state==="running"?"complete":J.child.state,Z={...J.child,state:j,lastUpdate:J.child.lastUpdate??J.ts};if(!$)return Z;let W=$.lastUpdate??0,Q=Z.lastUpdate??J.ts;if(Q<W)return $;if(N($.state)&&!N(Z.state))return $;if(N($.state)&&N(Z.state)&&Q===W)return $;return{...$,...Z,state:Z.state,lastUpdate:Math.max(W,Q)}}function m$($,J){let j=!1,Z=(O)=>O.map((K)=>{if(K.id===J.parentRunId){let L=K.children??[],T=L.findIndex((w)=>w.id===J.child.id),S=Z$(T>=0?L[T]:void 0,J),G=T>=0?L.map((w,H$)=>H$===T?S:w):[...L,S];return j=!0,{...K,children:G.slice(0,R),lastUpdate:Math.max(K.lastUpdate??0,J.ts)}}if(!K.children?.length)return K;let V=Z(K.children);return V===K.children?K:{...K,children:V}}),W=Z($);if(j)return W;let Q=W.findIndex((O)=>O.id===J.child.id),B=Z$(Q>=0?W[Q]:void 0,J);return Q>=0?W.map((O,K)=>K===Q?B:O):[...W,B].slice(0,R)}function h$($,J){return{...$,updatedAt:Math.max($.updatedAt,J.ts),children:m$($.children,J)}}function O$($){return q.join(Q$($),D$)}function d$($){d($);try{let J=JSON.parse(M.readFileSync(O$($),"utf-8"));return{rootRunId:$.rootRunId,updatedAt:typeof J.updatedAt==="number"?J.updatedAt:0,children:Array.isArray(J.children)?J.children.map((j)=>P(j)).filter((j)=>Boolean(j)):[],processedEvents:Array.isArray(J.processedEvents)?J.processedEvents.filter((j)=>typeof j==="string"):[]}}catch(J){if(J.code!=="ENOENT")throw J;return{rootRunId:$.rootRunId,updatedAt:0,children:[],processedEvents:[]}}}function X$($){d($);let J=d$($),j=new Set(J.processedEvents),Z=!1,W=[];try{W=M.readdirSync($.eventSink).filter((Q)=>Q.endsWith(".json")||Q.endsWith(".jsonl")).sort()}catch(Q){if(Q.code!=="ENOENT")throw Q}for(let Q of W){if(j.has(Q))continue;let B=q.join($.eventSink,Q);if(!c($.eventSink,B))continue;let O;try{let K=M.statSync(B);if(!K.isFile()||K.size>h)continue;O=M.readFileSync(B,"utf-8")}catch{continue}for(let K of c$(O,$))J=h$(J,K),Z=!0;j.add(Q),Z=!0}if(Z)J={...J,processedEvents:[...j].slice(-1000)},_(O$($),J);return J}function n$($,J,j){let Z=`${JSON.stringify(j)}
5
- `;if(Buffer.byteLength(Z,"utf-8")>h)throw Error("Nested route record exceeds the maximum size.");M.mkdirSync($,{recursive:!0,mode:448});let W=`${String(J).padStart(13,"0")}-${x$()}.json`,Q=q.join($,`.${W}.tmp`),B=q.join($,W);return M.writeFileSync(Q,Z,{mode:384}),M.renameSync(Q,B),B}function B$($,J){d($);let j={...J,rootRunId:$.rootRunId,capabilityToken:$.capabilityToken},Z=m(JSON.stringify(j),$);if(!Z)throw Error("Nested event record failed validation.");n$($.eventSink,Z.ts,Z)}function K$($,J,j){return{id:$.runId||j.id,parentRunId:j.parentRunId,...j.parentStepIndex!==void 0?{parentStepIndex:j.parentStepIndex}:{},depth:j.depth,path:j.path??[{runId:j.parentRunId,...j.parentStepIndex!==void 0?{stepIndex:j.parentStepIndex}:{}}],asyncDir:J,...$.pid?{pid:$.pid}:{},...$.sessionId?{sessionId:$.sessionId}:{},mode:$.mode??j.mode,state:$.state,...$.currentStep!==void 0?{currentStep:$.currentStep}:{},...$.chainStepCount!==void 0?{chainStepCount:$.chainStepCount}:{},...$.activityState?{activityState:$.activityState}:{},...$.lastActivityAt!==void 0?{lastActivityAt:$.lastActivityAt}:{},...$.currentTool?{currentTool:$.currentTool}:{},...$.currentToolStartedAt!==void 0?{currentToolStartedAt:$.currentToolStartedAt}:{},...$.currentPath?{currentPath:$.currentPath}:{},...$.turnCount!==void 0?{turnCount:$.turnCount}:{},...$.toolCount!==void 0?{toolCount:$.toolCount}:{},...$.totalTokens?{totalTokens:$.totalTokens}:{},...$.timeoutMs!==void 0?{timeoutMs:$.timeoutMs}:{},...$.deadlineAt!==void 0?{deadlineAt:$.deadlineAt}:{},...$.timedOut!==void 0?{timedOut:$.timedOut}:{},...$.turnBudget?{turnBudget:$.turnBudget}:{},...$.turnBudgetExceeded!==void 0?{turnBudgetExceeded:$.turnBudgetExceeded}:{},...$.wrapUpRequested!==void 0?{wrapUpRequested:$.wrapUpRequested}:{},...$.error?{error:$.error}:{},...$.startedAt!==void 0?{startedAt:$.startedAt}:{startedAt:j.ts},...$.endedAt!==void 0?{endedAt:$.endedAt}:{},lastUpdate:$.lastUpdate??j.ts,...$.sessionFile?{sessionFile:$.sessionFile}:{},...$.steps?.length?{steps:$.steps.map((Z)=>({agent:Z.agent,status:Z.status,...Z.sessionFile?{sessionFile:Z.sessionFile}:{},...Z.activityState?{activityState:Z.activityState}:{},...Z.lastActivityAt!==void 0?{lastActivityAt:Z.lastActivityAt}:{},...Z.currentTool?{currentTool:Z.currentTool}:{},...Z.currentToolStartedAt!==void 0?{currentToolStartedAt:Z.currentToolStartedAt}:{},...Z.currentPath?{currentPath:Z.currentPath}:{},...Z.turnCount!==void 0?{turnCount:Z.turnCount}:{},...Z.toolCount!==void 0?{toolCount:Z.toolCount}:{},...Z.startedAt!==void 0?{startedAt:Z.startedAt}:{},...Z.endedAt!==void 0?{endedAt:Z.endedAt}:{},...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}:{}})).slice(0,v)}:{}}}function n($){return $ instanceof Error?$.message:String($)}function o$($){let J=U.join($,"runner.stderr.log"),j=65536,Z;try{let Q=H.statSync(J);if(Q.size<=0)return;let B=H.openSync(J,"r");try{let O=Math.min(Q.size,65536),K=Math.max(0,Q.size-O),V=Buffer.alloc(O);H.readSync(B,V,0,O,K),Z=V.toString("utf-8").trim()}finally{H.closeSync(B)}}catch{return}if(!Z)return;let W=Z.split(/\r?\n/).slice(-30).join(`
6
- `);return W.length>4000?`${W.slice(-4000)}
7
- [stderr tail truncated]`:W}function q$($){return typeof $==="object"&&$!==null&&"code"in $&&$.code==="ENOENT"}function p$($,J){try{H.mkdirSync(U.dirname($),{recursive:!0}),H.appendFileSync($,`${JSON.stringify(J)}
8
- `,"utf-8")}catch{}}function u$($){let J=U.join($,"status.json"),j;try{j=H.readFileSync(J,"utf-8")}catch(Z){if(q$(Z))return null;throw Error(`Failed to read async status file '${J}': ${n(Z)}`,{cause:Z instanceof Error?Z:void 0})}try{return JSON.parse(j)}catch(Z){throw Error(`Failed to parse async status file '${J}': ${n(Z)}`,{cause:Z instanceof Error?Z:void 0})}}function r$($){try{let J=JSON.parse(H.readFileSync($,"utf-8"));return{state:J.success?"complete":J.state==="paused"||J.exitCode===0?"paused":"failed",...Array.isArray(J.results)?{results:J.results}:{}}}catch(J){if(q$(J))return;throw Error(`Failed to read async result file '${$}': ${n(J)}`,{cause:J instanceof Error?J:void 0})}}function l$($,J){if(J?.success===!0)return"complete";if(J?.success===!1)return"failed";return $}function i$($,J,j){let Z=r$(J);if(!Z)return;let W=($.steps??[]).map((Q,B)=>{if(Q.status!=="running"&&Q.status!=="pending")return Q;let O=Z.results?.[B],K=l$(Z.state,O);return{...Q,status:K==="complete"?"complete":K,endedAt:Q.endedAt??j,durationMs:Q.startedAt!==void 0&&Q.durationMs===void 0?Math.max(0,j-Q.startedAt):Q.durationMs,exitCode:Q.exitCode??(K==="complete"||K==="paused"?0:1),error:K==="failed"?Q.error??O?.error:Q.error,sessionFile:Q.sessionFile??O?.sessionFile,model:Q.model??O?.model,attemptedModels:Q.attemptedModels??O?.attemptedModels,modelAttempts:Q.modelAttempts??O?.modelAttempts}});return{...$,state:Z.state,activityState:void 0,lastUpdate:j,endedAt:$.endedAt??j,steps:W}}function s$($,J,j){let Z=J.startedAt??j,W=J.agents?.length?J.agents:["subagent"],Q=J.chainStepCount,B=Q!==void 0?r(J.parallelGroups,W.length,Q):[];return{runId:J.runId||U.basename($),...J.sessionId?{sessionId:J.sessionId}:{},mode:J.mode??"single",state:"running",pid:J.pid,startedAt:Z,lastUpdate:j,currentStep:0,...Q!==void 0?{chainStepCount:Q}:{},...B.length?{parallelGroups:B}:{},steps:W.map((O)=>({agent:O,status:"running",startedAt:Z})),...J.sessionFile?{sessionFile:J.sessionFile}:{}}}function a$($,J,j,Z){let W=$.runId||U.basename(J),Q=typeof $.pid==="number"?$.pid:"unknown",B=Z??`Async runner process ${Q} exited or disappeared before writing a result. Marked run failed by stale-run reconciliation.`,O=o$(J),K=O?`${B}
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { writeAtomicJson } from "../../shared/atomic-json.js";
4
+ import { RESULTS_DIR } from "../../shared/types.js";
5
+ import { normalizeParallelGroups } from "./parallel-groups.js";
6
+ import { nestedSummaryFromAsyncStatus, projectNestedEvents, resolveNestedAsyncDir, writeNestedEvent } from "../shared/nested-events.js";
7
+ function getErrorMessage(error) {
8
+ return error instanceof Error ? error.message : String(error);
9
+ }
10
+ function readRunnerStartupDiagnostics(asyncDir) {
11
+ const stderrPath = path.join(asyncDir, "runner.stderr.log");
12
+ const maxBytes = 64 * 1024;
13
+ let content;
14
+ try {
15
+ const stat = fs.statSync(stderrPath);
16
+ if (stat.size <= 0)
17
+ return;
18
+ const fd = fs.openSync(stderrPath, "r");
19
+ try {
20
+ const bytesToRead = Math.min(stat.size, maxBytes);
21
+ const start = Math.max(0, stat.size - bytesToRead);
22
+ const buffer = Buffer.alloc(bytesToRead);
23
+ fs.readSync(fd, buffer, 0, bytesToRead, start);
24
+ content = buffer.toString("utf-8").trim();
25
+ } finally {
26
+ fs.closeSync(fd);
27
+ }
28
+ } catch {
29
+ return;
30
+ }
31
+ if (!content)
32
+ return;
33
+ const lines = content.split(/\r?\n/).slice(-30).join(`
34
+ `);
35
+ return lines.length > 4000 ? `${lines.slice(-4000)}
36
+ [stderr tail truncated]` : lines;
37
+ }
38
+ function isNotFoundError(error) {
39
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
40
+ }
41
+ function appendJsonlBestEffort(filePath, payload) {
42
+ try {
43
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
44
+ fs.appendFileSync(filePath, `${JSON.stringify(payload)}
45
+ `, "utf-8");
46
+ } catch {}
47
+ }
48
+ function readStatusFile(asyncDir) {
49
+ const statusPath = path.join(asyncDir, "status.json");
50
+ let content;
51
+ try {
52
+ content = fs.readFileSync(statusPath, "utf-8");
53
+ } catch (error) {
54
+ if (isNotFoundError(error))
55
+ return null;
56
+ throw new Error(`Failed to read async status file '${statusPath}': ${getErrorMessage(error)}`, {
57
+ cause: error instanceof Error ? error : undefined
58
+ });
59
+ }
60
+ try {
61
+ return JSON.parse(content);
62
+ } catch (error) {
63
+ throw new Error(`Failed to parse async status file '${statusPath}': ${getErrorMessage(error)}`, {
64
+ cause: error instanceof Error ? error : undefined
65
+ });
66
+ }
67
+ }
68
+ function readResultRepairData(resultPath) {
69
+ try {
70
+ const data = JSON.parse(fs.readFileSync(resultPath, "utf-8"));
71
+ const state = data.success ? "complete" : data.state === "paused" || data.exitCode === 0 ? "paused" : "failed";
72
+ return { state, ...Array.isArray(data.results) ? { results: data.results } : {} };
73
+ } catch (error) {
74
+ if (isNotFoundError(error))
75
+ return;
76
+ throw new Error(`Failed to read async result file '${resultPath}': ${getErrorMessage(error)}`, {
77
+ cause: error instanceof Error ? error : undefined
78
+ });
79
+ }
80
+ }
81
+ function childState(overallState, child) {
82
+ if (child?.success === true)
83
+ return "complete";
84
+ if (child?.success === false)
85
+ return "failed";
86
+ return overallState;
87
+ }
88
+ function terminalStatusFromResult(status, resultPath, now) {
89
+ const repair = readResultRepairData(resultPath);
90
+ if (!repair)
91
+ return;
92
+ const steps = (status.steps ?? []).map((step, index) => {
93
+ if (step.status !== "running" && step.status !== "pending")
94
+ return step;
95
+ const child = repair.results?.[index];
96
+ const state = childState(repair.state, child);
97
+ return {
98
+ ...step,
99
+ status: state === "complete" ? "complete" : state,
100
+ endedAt: step.endedAt ?? now,
101
+ durationMs: step.startedAt !== undefined && step.durationMs === undefined ? Math.max(0, now - step.startedAt) : step.durationMs,
102
+ exitCode: step.exitCode ?? (state === "complete" || state === "paused" ? 0 : 1),
103
+ error: state === "failed" ? step.error ?? child?.error : step.error,
104
+ sessionFile: step.sessionFile ?? child?.sessionFile,
105
+ model: step.model ?? child?.model,
106
+ attemptedModels: step.attemptedModels ?? child?.attemptedModels,
107
+ modelAttempts: step.modelAttempts ?? child?.modelAttempts
108
+ };
109
+ });
110
+ return {
111
+ ...status,
112
+ state: repair.state,
113
+ activityState: undefined,
114
+ lastUpdate: now,
115
+ endedAt: status.endedAt ?? now,
116
+ steps
117
+ };
118
+ }
119
+ function buildStartedStatus(asyncDir, startedRun, now) {
120
+ const startedAt = startedRun.startedAt ?? now;
121
+ const agents = startedRun.agents?.length ? startedRun.agents : ["subagent"];
122
+ const chainStepCount = startedRun.chainStepCount;
123
+ const parallelGroups = chainStepCount !== undefined ? normalizeParallelGroups(startedRun.parallelGroups, agents.length, chainStepCount) : [];
124
+ return {
125
+ runId: startedRun.runId || path.basename(asyncDir),
126
+ ...startedRun.sessionId ? { sessionId: startedRun.sessionId } : {},
127
+ mode: startedRun.mode ?? "single",
128
+ state: "running",
129
+ pid: startedRun.pid,
130
+ startedAt,
131
+ lastUpdate: now,
132
+ currentStep: 0,
133
+ ...chainStepCount !== undefined ? { chainStepCount } : {},
134
+ ...parallelGroups.length ? { parallelGroups } : {},
135
+ steps: agents.map((agent) => ({
136
+ agent,
137
+ status: "running",
138
+ startedAt
139
+ })),
140
+ ...startedRun.sessionFile ? { sessionFile: startedRun.sessionFile } : {}
141
+ };
142
+ }
143
+ function buildFailedRepair(status, asyncDir, now, reason) {
144
+ const runId = status.runId || path.basename(asyncDir);
145
+ const pid = typeof status.pid === "number" ? status.pid : "unknown";
146
+ const baseMessage = reason ?? `Async runner process ${pid} exited or disappeared before writing a result. Marked run failed by stale-run reconciliation.`;
147
+ const diagnostics = readRunnerStartupDiagnostics(asyncDir);
148
+ const message = diagnostics ? `${baseMessage}
9
149
 
10
150
  Runner stderr tail:
11
- ${O}`:B,L=(($.steps?.length)?$.steps:[{agent:"subagent",status:"running"}]).map((G)=>G.status==="running"||G.status==="pending"?{...G,status:"failed",activityState:void 0,endedAt:G.endedAt??j,durationMs:G.startedAt!==void 0&&G.durationMs===void 0?Math.max(0,j-G.startedAt):G.durationMs,exitCode:G.exitCode??1,error:G.error??K}:G),T={...$,state:"failed",activityState:void 0,lastUpdate:j,endedAt:j,steps:L},S=L[$.currentStep??0]?.agent??L[0]?.agent??"subagent";return{status:T,message:K,result:{id:W,agent:S,mode:$.mode,success:!1,state:"failed",summary:K,results:L.map((G)=>({agent:G.agent,output:G.status==="complete"||G.status==="completed"?"":K,error:G.status==="complete"||G.status==="completed"?void 0:G.error??K,success:G.status==="complete"||G.status==="completed",model:G.model,attemptedModels:G.attemptedModels,modelAttempts:G.modelAttempts,sessionFile:G.sessionFile})),exitCode:1,timestamp:j,durationMs:Math.max(0,j-$.startedAt),asyncDir:J,sessionId:$.sessionId,sessionFile:$.sessionFile}}}function Y$($,J,j,Z,W){let Q=a$(J,$,Z,W);return _(j,Q.result),_(U.join($,"status.json"),Q.status),p$(U.join($,"events.jsonl"),{type:"subagent.run.repaired_stale",ts:Z,runId:Q.status.runId,pid:J.pid,resultPath:j,message:Q.message}),{status:Q.status,repaired:!0,resultPath:j,message:Q.message}}function G$($){return $==="complete"||$==="failed"||$==="paused"}function*o($){for(let J of $??[])yield J,yield*o(J.children),yield*o(J.steps?.flatMap((j)=>j.children??[]))}function V0($,J={}){let j=X$($);for(let Z of o(j.children)){if(Z.state!=="running"&&Z.state!=="queued")continue;let W=W$($.rootRunId,Z);if(!W)continue;let Q=t$(W,{...J,resultsDir:U.join(J.resultsDir??I,"nested",$.rootRunId)}),B=Q.status;if(!B)continue;if(!Q.repaired&&!G$(B.state))continue;let O=J.now?.()??Date.now();B$($,{type:G$(B.state)?"subagent.nested.completed":"subagent.nested.updated",ts:O,parentRunId:Z.parentRunId,parentStepIndex:Z.parentStepIndex,child:K$(B,W,{id:Z.id,parentRunId:Z.parentRunId,parentStepIndex:Z.parentStepIndex,depth:Z.depth,path:Z.path,mode:Z.mode,ts:O})})}}function e$($,J=process.kill){try{return J($,0),"alive"}catch(j){let Z=typeof j==="object"&&j!==null&&"code"in j?j.code:void 0;if(Z==="ESRCH")return"dead";if(Z==="EPERM")return"unknown";return"unknown"}}function t$($,J={}){let j=J.now?.()??Date.now(),Z=u$($),W=!Z&&J.startedRun?s$($,J.startedRun,j):void 0,Q=Z??W;if(!Q)return{status:null,repaired:!1};let B=Q.runId||U.basename($),O=U.join(J.resultsDir??I,`${B}.json`);if(H.existsSync(O)){let V=Q.state==="running"||Q.state==="queued"?i$(Q,O,j):void 0;if(V)return _(U.join($,"status.json"),V),{status:V,repaired:!0,resultPath:O,message:"Existing async result file was used to repair stale running status."};return{status:Q,repaired:!1,resultPath:O}}if(Q.state!=="running"||typeof Q.pid!=="number")return{status:Z??null,repaired:!1,resultPath:O};if(!Z){let V=J.startedRun?.startedAt??Q.startedAt;if(j-V<(J.missingStatusGraceMs??1000))return{status:null,repaired:!1,resultPath:O}}if(e$(Q.pid,J.kill)!=="dead"){let V=J.staleAlivePidMs??86400000,L=Q.lastUpdate??Q.startedAt;if(j-L<=V)return{status:Z??null,repaired:!1,resultPath:O};let T=`Async runner process ${Q.pid} still has a live PID, but status has not updated for ${j-L}ms. Marked run failed by stale-run reconciliation because PID ownership cannot be verified.`;return Y$($,Q,O,j,T)}return Y$($,Q,O,j)}export{V0 as reconcileNestedAsyncDescendants,t$ as reconcileAsyncRun,e$ as checkPidLiveness};
151
+ ${diagnostics}` : baseMessage;
152
+ const steps = status.steps?.length ? status.steps : [{ agent: "subagent", status: "running" }];
153
+ const repairedSteps = steps.map((step) => step.status === "running" || step.status === "pending" ? {
154
+ ...step,
155
+ status: "failed",
156
+ activityState: undefined,
157
+ endedAt: step.endedAt ?? now,
158
+ durationMs: step.startedAt !== undefined && step.durationMs === undefined ? Math.max(0, now - step.startedAt) : step.durationMs,
159
+ exitCode: step.exitCode ?? 1,
160
+ error: step.error ?? message
161
+ } : step);
162
+ const repairedStatus = {
163
+ ...status,
164
+ state: "failed",
165
+ activityState: undefined,
166
+ lastUpdate: now,
167
+ endedAt: now,
168
+ steps: repairedSteps
169
+ };
170
+ const resultAgent = repairedSteps[status.currentStep ?? 0]?.agent ?? repairedSteps[0]?.agent ?? "subagent";
171
+ return {
172
+ status: repairedStatus,
173
+ message,
174
+ result: {
175
+ id: runId,
176
+ agent: resultAgent,
177
+ mode: status.mode,
178
+ success: false,
179
+ state: "failed",
180
+ summary: message,
181
+ results: repairedSteps.map((step) => ({
182
+ agent: step.agent,
183
+ output: step.status === "complete" || step.status === "completed" ? "" : message,
184
+ error: step.status === "complete" || step.status === "completed" ? undefined : step.error ?? message,
185
+ success: step.status === "complete" || step.status === "completed",
186
+ model: step.model,
187
+ attemptedModels: step.attemptedModels,
188
+ modelAttempts: step.modelAttempts,
189
+ sessionFile: step.sessionFile
190
+ })),
191
+ exitCode: 1,
192
+ timestamp: now,
193
+ durationMs: Math.max(0, now - status.startedAt),
194
+ asyncDir,
195
+ sessionId: status.sessionId,
196
+ sessionFile: status.sessionFile
197
+ }
198
+ };
199
+ }
200
+ function writeFailedRepair(asyncDir, status, resultPath, now, reason) {
201
+ const repair = buildFailedRepair(status, asyncDir, now, reason);
202
+ writeAtomicJson(resultPath, repair.result);
203
+ writeAtomicJson(path.join(asyncDir, "status.json"), repair.status);
204
+ appendJsonlBestEffort(path.join(asyncDir, "events.jsonl"), {
205
+ type: "subagent.run.repaired_stale",
206
+ ts: now,
207
+ runId: repair.status.runId,
208
+ pid: status.pid,
209
+ resultPath,
210
+ message: repair.message
211
+ });
212
+ return { status: repair.status, repaired: true, resultPath, message: repair.message };
213
+ }
214
+ function terminal(state) {
215
+ return state === "complete" || state === "failed" || state === "paused";
216
+ }
217
+ function* nestedRuns(children) {
218
+ for (const child of children ?? []) {
219
+ yield child;
220
+ yield* nestedRuns(child.children);
221
+ yield* nestedRuns(child.steps?.flatMap((step) => step.children ?? []));
222
+ }
223
+ }
224
+ export function reconcileNestedAsyncDescendants(route, options = {}) {
225
+ const registry = projectNestedEvents(route);
226
+ for (const run of nestedRuns(registry.children)) {
227
+ if (run.state !== "running" && run.state !== "queued")
228
+ continue;
229
+ const asyncDir = resolveNestedAsyncDir(route.rootRunId, run);
230
+ if (!asyncDir)
231
+ continue;
232
+ const result = reconcileAsyncRun(asyncDir, {
233
+ ...options,
234
+ resultsDir: path.join(options.resultsDir ?? RESULTS_DIR, "nested", route.rootRunId)
235
+ });
236
+ const status = result.status;
237
+ if (!status)
238
+ continue;
239
+ if (!result.repaired && !terminal(status.state))
240
+ continue;
241
+ const ts = options.now?.() ?? Date.now();
242
+ writeNestedEvent(route, {
243
+ type: terminal(status.state) ? "subagent.nested.completed" : "subagent.nested.updated",
244
+ ts,
245
+ parentRunId: run.parentRunId,
246
+ parentStepIndex: run.parentStepIndex,
247
+ child: nestedSummaryFromAsyncStatus(status, asyncDir, {
248
+ id: run.id,
249
+ parentRunId: run.parentRunId,
250
+ parentStepIndex: run.parentStepIndex,
251
+ depth: run.depth,
252
+ path: run.path,
253
+ mode: run.mode,
254
+ ts
255
+ })
256
+ });
257
+ }
258
+ }
259
+ export function checkPidLiveness(pid, kill = process.kill) {
260
+ try {
261
+ kill(pid, 0);
262
+ return "alive";
263
+ } catch (error) {
264
+ const code = typeof error === "object" && error !== null && "code" in error ? error.code : undefined;
265
+ if (code === "ESRCH")
266
+ return "dead";
267
+ if (code === "EPERM")
268
+ return "unknown";
269
+ return "unknown";
270
+ }
271
+ }
272
+ export function reconcileAsyncRun(asyncDir, options = {}) {
273
+ const now = options.now?.() ?? Date.now();
274
+ const status = readStatusFile(asyncDir);
275
+ const startedStatus = !status && options.startedRun ? buildStartedStatus(asyncDir, options.startedRun, now) : undefined;
276
+ const effectiveStatus = status ?? startedStatus;
277
+ if (!effectiveStatus)
278
+ return { status: null, repaired: false };
279
+ const runId = effectiveStatus.runId || path.basename(asyncDir);
280
+ const resultPath = path.join(options.resultsDir ?? RESULTS_DIR, `${runId}.json`);
281
+ if (fs.existsSync(resultPath)) {
282
+ const terminalStatus = effectiveStatus.state === "running" || effectiveStatus.state === "queued" ? terminalStatusFromResult(effectiveStatus, resultPath, now) : undefined;
283
+ if (terminalStatus) {
284
+ writeAtomicJson(path.join(asyncDir, "status.json"), terminalStatus);
285
+ return { status: terminalStatus, repaired: true, resultPath, message: "Existing async result file was used to repair stale running status." };
286
+ }
287
+ return { status: effectiveStatus, repaired: false, resultPath };
288
+ }
289
+ if (effectiveStatus.state !== "running" || typeof effectiveStatus.pid !== "number") {
290
+ return { status: status ?? null, repaired: false, resultPath };
291
+ }
292
+ if (!status) {
293
+ const startedAt = options.startedRun?.startedAt ?? effectiveStatus.startedAt;
294
+ if (now - startedAt < (options.missingStatusGraceMs ?? 1000)) {
295
+ return { status: null, repaired: false, resultPath };
296
+ }
297
+ }
298
+ const liveness = checkPidLiveness(effectiveStatus.pid, options.kill);
299
+ if (liveness !== "dead") {
300
+ const staleAfterMs = options.staleAlivePidMs ?? 24 * 60 * 60 * 1000;
301
+ const lastUpdate = effectiveStatus.lastUpdate ?? effectiveStatus.startedAt;
302
+ if (now - lastUpdate <= staleAfterMs)
303
+ return { status: status ?? null, repaired: false, resultPath };
304
+ const message = `Async runner process ${effectiveStatus.pid} still has a live PID, but status has not updated for ${now - lastUpdate}ms. Marked run failed by stale-run reconciliation because PID ownership cannot be verified.`;
305
+ return writeFailedRepair(asyncDir, effectiveStatus, resultPath, now, message);
306
+ }
307
+ return writeFailedRepair(asyncDir, effectiveStatus, resultPath, now);
308
+ }