@ashx-j/lunr 0.2.26 → 0.2.28

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 (697) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/LICENSE +22 -0
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +1 -1
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
  8. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  9. package/dist/builtin-extensions/ashxj-tui.js +6 -10
  10. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  11. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  12. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  13. package/dist/builtin-extensions/lunr-cron.js +94 -108
  14. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  15. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  16. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  17. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  18. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
  19. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js +5 -2
  20. package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
  21. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  22. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  23. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  24. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  27. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  28. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  29. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  30. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  31. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  32. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  33. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  34. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  36. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  39. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  40. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  41. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  43. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  45. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  47. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  48. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  49. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  51. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  57. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  59. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  60. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  61. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  63. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  64. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  67. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  70. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  71. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  73. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  74. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  76. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  78. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  80. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  81. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  83. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  89. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  91. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  93. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  94. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  95. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  96. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  97. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  98. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  99. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  101. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  102. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  103. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  104. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  105. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  106. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  108. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  109. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  110. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  111. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  112. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  115. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  116. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  118. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  120. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  121. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  122. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts +4 -1
  123. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +2 -0
  125. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -1
  127. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +17 -31
  129. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  132. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +5 -1
  134. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +78 -42
  136. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
  139. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +0 -3
  141. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +134 -28
  143. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +26 -5
  146. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  149. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  152. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  154. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts +7 -1
  156. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.d.ts.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js +70 -38
  158. package/dist/builtin-extensions/pi-subagents/src/shared/session-tokens.js.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +9 -0
  160. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  162. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  165. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  166. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  168. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  170. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +13 -62
  171. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  172. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +18 -9
  175. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  176. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  178. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  179. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-tps.js +28 -17
  181. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  182. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  183. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  185. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  186. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  187. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  188. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  189. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  190. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  191. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  192. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  193. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  194. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  195. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  196. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  197. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  198. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  199. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  200. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  201. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  202. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  203. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  204. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  205. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  206. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  207. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  208. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  209. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  210. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  211. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  212. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  213. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  214. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  215. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  216. package/dist/catalog/models.json +1 -1
  217. package/dist/catalog/providers/google-vertex.json +1 -1
  218. package/dist/catalog/providers/google.json +1 -1
  219. package/dist/catalog/publication.json +3 -3
  220. package/dist/cli/install-cli.d.ts.map +1 -1
  221. package/dist/cli/install-cli.js +38 -30
  222. package/dist/cli/install-cli.js.map +1 -1
  223. package/dist/core/agent-session-runtime.d.ts +13 -0
  224. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  225. package/dist/core/agent-session-runtime.js +75 -11
  226. package/dist/core/agent-session-runtime.js.map +1 -1
  227. package/dist/core/agent-session-services.d.ts +1 -0
  228. package/dist/core/agent-session-services.d.ts.map +1 -1
  229. package/dist/core/agent-session-services.js +1 -0
  230. package/dist/core/agent-session-services.js.map +1 -1
  231. package/dist/core/agent-session.d.ts +46 -21
  232. package/dist/core/agent-session.d.ts.map +1 -1
  233. package/dist/core/agent-session.js +344 -126
  234. package/dist/core/agent-session.js.map +1 -1
  235. package/dist/core/browser/runtime.d.ts +2 -0
  236. package/dist/core/browser/runtime.d.ts.map +1 -1
  237. package/dist/core/browser/runtime.js +80 -45
  238. package/dist/core/browser/runtime.js.map +1 -1
  239. package/dist/core/browser/setup.d.ts.map +1 -1
  240. package/dist/core/browser/setup.js +12 -1
  241. package/dist/core/browser/setup.js.map +1 -1
  242. package/dist/core/cache-stats.d.ts +1 -1
  243. package/dist/core/cache-stats.d.ts.map +1 -1
  244. package/dist/core/cache-stats.js +1 -1
  245. package/dist/core/cache-stats.js.map +1 -1
  246. package/dist/core/compaction/branch-summarization.d.ts +2 -1
  247. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  248. package/dist/core/compaction/branch-summarization.js +1 -0
  249. package/dist/core/compaction/branch-summarization.js.map +1 -1
  250. package/dist/core/compaction/compaction.d.ts +5 -11
  251. package/dist/core/compaction/compaction.d.ts.map +1 -1
  252. package/dist/core/compaction/compaction.js +38 -92
  253. package/dist/core/compaction/compaction.js.map +1 -1
  254. package/dist/core/computer-use/adapter.d.ts.map +1 -1
  255. package/dist/core/computer-use/adapter.js +7 -2
  256. package/dist/core/computer-use/adapter.js.map +1 -1
  257. package/dist/core/computer-use/image.d.ts.map +1 -1
  258. package/dist/core/computer-use/image.js +17 -5
  259. package/dist/core/computer-use/image.js.map +1 -1
  260. package/dist/core/computer-use/schemas.d.ts.map +1 -1
  261. package/dist/core/computer-use/schemas.js +23 -6
  262. package/dist/core/computer-use/schemas.js.map +1 -1
  263. package/dist/core/computer-use/workflow.d.ts.map +1 -1
  264. package/dist/core/computer-use/workflow.js +459 -119
  265. package/dist/core/computer-use/workflow.js.map +1 -1
  266. package/dist/core/context-breakdown.d.ts +2 -2
  267. package/dist/core/context-breakdown.d.ts.map +1 -1
  268. package/dist/core/context-breakdown.js +22 -20
  269. package/dist/core/context-breakdown.js.map +1 -1
  270. package/dist/core/cron/jobs.d.ts +26 -8
  271. package/dist/core/cron/jobs.d.ts.map +1 -1
  272. package/dist/core/cron/jobs.js +357 -232
  273. package/dist/core/cron/jobs.js.map +1 -1
  274. package/dist/core/cron/origin-context.d.ts +1 -0
  275. package/dist/core/cron/origin-context.d.ts.map +1 -1
  276. package/dist/core/cron/origin-context.js.map +1 -1
  277. package/dist/core/cron/scheduler.d.ts +22 -17
  278. package/dist/core/cron/scheduler.d.ts.map +1 -1
  279. package/dist/core/cron/scheduler.js +153 -73
  280. package/dist/core/cron/scheduler.js.map +1 -1
  281. package/dist/core/extensions/index.d.ts +1 -1
  282. package/dist/core/extensions/index.d.ts.map +1 -1
  283. package/dist/core/extensions/index.js.map +1 -1
  284. package/dist/core/extensions/runner.d.ts +1 -0
  285. package/dist/core/extensions/runner.d.ts.map +1 -1
  286. package/dist/core/extensions/runner.js +8 -0
  287. package/dist/core/extensions/runner.js.map +1 -1
  288. package/dist/core/extensions/types.d.ts +11 -1
  289. package/dist/core/extensions/types.d.ts.map +1 -1
  290. package/dist/core/extensions/types.js.map +1 -1
  291. package/dist/core/footer-data-provider.d.ts +4 -0
  292. package/dist/core/footer-data-provider.d.ts.map +1 -1
  293. package/dist/core/footer-data-provider.js +22 -1
  294. package/dist/core/footer-data-provider.js.map +1 -1
  295. package/dist/core/large-subagent-launch.d.ts +1 -1
  296. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  297. package/dist/core/large-subagent-launch.js +7 -7
  298. package/dist/core/large-subagent-launch.js.map +1 -1
  299. package/dist/core/model-registry.d.ts +2 -0
  300. package/dist/core/model-registry.d.ts.map +1 -1
  301. package/dist/core/model-registry.js +5 -0
  302. package/dist/core/model-registry.js.map +1 -1
  303. package/dist/core/model-runtime.d.ts +4 -1
  304. package/dist/core/model-runtime.d.ts.map +1 -1
  305. package/dist/core/model-runtime.js +40 -4
  306. package/dist/core/model-runtime.js.map +1 -1
  307. package/dist/core/package-manager.d.ts.map +1 -1
  308. package/dist/core/package-manager.js.map +1 -1
  309. package/dist/core/permissions.d.ts +3 -3
  310. package/dist/core/permissions.d.ts.map +1 -1
  311. package/dist/core/permissions.js +11 -35
  312. package/dist/core/permissions.js.map +1 -1
  313. package/dist/core/plan-mode.d.ts +5 -13
  314. package/dist/core/plan-mode.d.ts.map +1 -1
  315. package/dist/core/plan-mode.js +126 -116
  316. package/dist/core/plan-mode.js.map +1 -1
  317. package/dist/core/project-trust.d.ts.map +1 -1
  318. package/dist/core/project-trust.js +1 -1
  319. package/dist/core/project-trust.js.map +1 -1
  320. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  321. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  322. package/dist/core/prompt-resource-bridge.js +9 -0
  323. package/dist/core/prompt-resource-bridge.js.map +1 -0
  324. package/dist/core/protected-targets.d.ts +6 -0
  325. package/dist/core/protected-targets.d.ts.map +1 -0
  326. package/dist/core/protected-targets.js +45 -0
  327. package/dist/core/protected-targets.js.map +1 -0
  328. package/dist/core/resource-loader.d.ts.map +1 -1
  329. package/dist/core/resource-loader.js +7 -0
  330. package/dist/core/resource-loader.js.map +1 -1
  331. package/dist/core/rollback.d.ts +19 -3
  332. package/dist/core/rollback.d.ts.map +1 -1
  333. package/dist/core/rollback.js +172 -56
  334. package/dist/core/rollback.js.map +1 -1
  335. package/dist/core/runtime-credentials.d.ts +3 -0
  336. package/dist/core/runtime-credentials.d.ts.map +1 -1
  337. package/dist/core/runtime-credentials.js +14 -1
  338. package/dist/core/runtime-credentials.js.map +1 -1
  339. package/dist/core/sdk.d.ts +3 -0
  340. package/dist/core/sdk.d.ts.map +1 -1
  341. package/dist/core/sdk.js +1 -0
  342. package/dist/core/sdk.js.map +1 -1
  343. package/dist/core/session-manager.d.ts +11 -1
  344. package/dist/core/session-manager.d.ts.map +1 -1
  345. package/dist/core/session-manager.js +111 -33
  346. package/dist/core/session-manager.js.map +1 -1
  347. package/dist/core/session-ownership.d.ts.map +1 -1
  348. package/dist/core/session-ownership.js +8 -3
  349. package/dist/core/session-ownership.js.map +1 -1
  350. package/dist/core/session-retention.d.ts.map +1 -1
  351. package/dist/core/session-retention.js +18 -7
  352. package/dist/core/session-retention.js.map +1 -1
  353. package/dist/core/session-startup-settings.d.ts +10 -0
  354. package/dist/core/session-startup-settings.d.ts.map +1 -0
  355. package/dist/core/session-startup-settings.js +70 -0
  356. package/dist/core/session-startup-settings.js.map +1 -0
  357. package/dist/core/subscriptions.d.ts +16 -7
  358. package/dist/core/subscriptions.d.ts.map +1 -1
  359. package/dist/core/subscriptions.js +96 -55
  360. package/dist/core/subscriptions.js.map +1 -1
  361. package/dist/core/trust-manager.d.ts +2 -1
  362. package/dist/core/trust-manager.d.ts.map +1 -1
  363. package/dist/core/trust-manager.js +6 -1
  364. package/dist/core/trust-manager.js.map +1 -1
  365. package/dist/core/update-check.d.ts.map +1 -1
  366. package/dist/core/update-check.js.map +1 -1
  367. package/dist/core/usage-accounting.d.ts +47 -0
  368. package/dist/core/usage-accounting.d.ts.map +1 -0
  369. package/dist/core/usage-accounting.js +205 -0
  370. package/dist/core/usage-accounting.js.map +1 -0
  371. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  372. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  373. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  374. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  375. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  376. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  377. package/dist/core/usage-adapters/openai-codex.js +3 -3
  378. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  379. package/dist/core/usage-adapters/xai.d.ts +2 -2
  380. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  381. package/dist/core/usage-adapters/xai.js +3 -3
  382. package/dist/core/usage-adapters/xai.js.map +1 -1
  383. package/dist/core/usage-adapters/zai.d.ts +2 -2
  384. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  385. package/dist/core/usage-adapters/zai.js +2 -2
  386. package/dist/core/usage-adapters/zai.js.map +1 -1
  387. package/dist/core/usage-history.d.ts +1 -18
  388. package/dist/core/usage-history.d.ts.map +1 -1
  389. package/dist/core/usage-history.js +46 -114
  390. package/dist/core/usage-history.js.map +1 -1
  391. package/dist/core/usage-service.d.ts +9 -2
  392. package/dist/core/usage-service.d.ts.map +1 -1
  393. package/dist/core/usage-service.js +95 -50
  394. package/dist/core/usage-service.js.map +1 -1
  395. package/dist/gateway/agent-bridge.d.ts +9 -1
  396. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  397. package/dist/gateway/agent-bridge.js +91 -37
  398. package/dist/gateway/agent-bridge.js.map +1 -1
  399. package/dist/gateway/buttons.d.ts +8 -1
  400. package/dist/gateway/buttons.d.ts.map +1 -1
  401. package/dist/gateway/buttons.js +76 -18
  402. package/dist/gateway/buttons.js.map +1 -1
  403. package/dist/gateway/commands.d.ts +1 -0
  404. package/dist/gateway/commands.d.ts.map +1 -1
  405. package/dist/gateway/commands.js +10 -4
  406. package/dist/gateway/commands.js.map +1 -1
  407. package/dist/gateway/cron.d.ts +12 -11
  408. package/dist/gateway/cron.d.ts.map +1 -1
  409. package/dist/gateway/cron.js +65 -56
  410. package/dist/gateway/cron.js.map +1 -1
  411. package/dist/gateway/index.d.ts.map +1 -1
  412. package/dist/gateway/index.js +2 -1
  413. package/dist/gateway/index.js.map +1 -1
  414. package/dist/gateway/mobile-commands.d.ts +1 -0
  415. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  416. package/dist/gateway/mobile-commands.js +69 -15
  417. package/dist/gateway/mobile-commands.js.map +1 -1
  418. package/dist/gateway/presenter.d.ts +12 -2
  419. package/dist/gateway/presenter.d.ts.map +1 -1
  420. package/dist/gateway/presenter.js +73 -38
  421. package/dist/gateway/presenter.js.map +1 -1
  422. package/dist/gateway/router.d.ts +2 -2
  423. package/dist/gateway/router.d.ts.map +1 -1
  424. package/dist/gateway/router.js +17 -2
  425. package/dist/gateway/router.js.map +1 -1
  426. package/dist/gateway/service.d.ts +2 -0
  427. package/dist/gateway/service.d.ts.map +1 -1
  428. package/dist/gateway/service.js +153 -0
  429. package/dist/gateway/service.js.map +1 -1
  430. package/dist/main.d.ts.map +1 -1
  431. package/dist/main.js +86 -33
  432. package/dist/main.js.map +1 -1
  433. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/assistant-message.js +6 -4
  435. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  436. package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
  437. package/dist/modes/interactive/components/context-view.js +2 -2
  438. package/dist/modes/interactive/components/context-view.js.map +1 -1
  439. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/copyable-text.js +3 -2
  441. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  442. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  443. package/dist/modes/interactive/components/extension-editor.js +1 -1
  444. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  445. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/footer.js +8 -12
  447. package/dist/modes/interactive/components/footer.js.map +1 -1
  448. package/dist/modes/interactive/components/usage-view.d.ts +5 -0
  449. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/usage-view.js +21 -6
  451. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  452. package/dist/modes/interactive/interactive-mode.d.ts +3 -7
  453. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  454. package/dist/modes/interactive/interactive-mode.js +151 -131
  455. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  456. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  457. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  458. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  459. package/dist/modes/rpc/rpc-mode.js +2 -1
  460. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  461. package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
  462. package/dist/node-runtime/agent-session-services-RTUGP3XR.js +54 -0
  463. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  464. package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-N4EUD6SB.js} +8 -7
  465. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  466. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  467. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  468. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  469. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  470. package/dist/node-runtime/chunk-4QRUZ64T.js +1203 -0
  471. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  472. package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
  473. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  474. package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
  475. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  476. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  477. package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-BMRXLQWQ.js} +464 -160
  478. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  479. package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-DFMPRAQQ.js} +162 -82
  480. package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
  481. package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-E5DQGNJI.js} +455 -278
  482. package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
  483. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  484. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  485. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  486. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  487. package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
  488. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  489. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  490. package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
  491. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  492. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  493. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  494. package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
  495. package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
  496. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-ICKGAKWX.js} +23 -59
  497. package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
  498. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  499. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  500. package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JEK35V2M.js} +45 -31
  501. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  502. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  503. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  504. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  505. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  506. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-PWHTSQC4.js} +83 -21
  507. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  508. package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-QT3F6UEV.js} +233 -169
  509. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  510. package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
  511. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  512. package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
  513. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-RY3FJ6WI.js} +29 -27
  514. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  515. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-STMX7W5I.js} +3 -3
  516. package/dist/node-runtime/chunk-SWWHZ2RI.js +158 -0
  517. package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
  518. package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-U3YVZ6UC.js} +18 -14
  519. package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
  520. package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
  521. package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
  522. package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
  523. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  524. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  525. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  526. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  527. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  528. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  529. package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
  530. package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
  531. package/dist/node-runtime/cli-runtime.js +4 -4
  532. package/dist/node-runtime/{command-FSBU2EVZ.js → command-YRT7I2BW.js} +5 -5
  533. package/dist/node-runtime/{commands-NAAL7KNT.js → commands-2ETOWWRA.js} +16 -16
  534. package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
  535. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  536. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  537. package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
  538. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  539. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-DBQRRMAY.js} +4 -4
  540. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  541. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  542. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  543. package/dist/node-runtime/{gateway-DQM333YV.js → gateway-V6K2CDWN.js} +51 -42
  544. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  545. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  546. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  547. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-J7TYMOBK.js} +14 -8
  548. package/dist/node-runtime/index.js +51 -48
  549. package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
  550. package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
  551. package/dist/node-runtime/interactive-mode-ASZ7APYP.js +75 -0
  552. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  553. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  554. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  555. package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
  556. package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-WD3YH4CR.js} +93 -80
  557. package/dist/node-runtime/main.js +43 -41
  558. package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-ICUXFW5V.js} +12 -12
  559. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  560. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  561. package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
  562. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  563. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  564. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  565. package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  566. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  567. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  568. package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-QPU3OXE4.js} +114 -167
  569. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  570. package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
  571. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  572. package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
  573. package/dist/node-runtime/rpc-entry.js +43 -41
  574. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  575. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  576. package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
  577. package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
  578. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  579. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LYH53ESV.js} +4 -4
  580. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-ZJ3N5Q74.js} +3 -3
  581. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  582. package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
  583. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  584. package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
  585. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  586. package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-UI6SHG3X.js} +412 -288
  587. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  588. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  589. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  590. package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
  591. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  592. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  593. package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
  594. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  595. package/dist/utils/clipboard-image.d.ts.map +1 -1
  596. package/dist/utils/clipboard-image.js.map +1 -1
  597. package/dist/utils/exif-orientation.d.ts.map +1 -1
  598. package/dist/utils/exif-orientation.js +25 -10
  599. package/dist/utils/exif-orientation.js.map +1 -1
  600. package/dist/utils/image-resize-core.d.ts.map +1 -1
  601. package/dist/utils/image-resize-core.js +2 -0
  602. package/dist/utils/image-resize-core.js.map +1 -1
  603. package/dist/utils/paths.d.ts +4 -0
  604. package/dist/utils/paths.d.ts.map +1 -1
  605. package/dist/utils/paths.js +33 -2
  606. package/dist/utils/paths.js.map +1 -1
  607. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  608. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  609. package/dist/utils/sanitize-terminal-text.js +67 -0
  610. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  611. package/docs/browser.md +1 -1
  612. package/docs/custom-provider.md +3 -3
  613. package/docs/extensions.md +8 -4
  614. package/docs/features.md +25 -7
  615. package/docs/keybindings.md +1 -1
  616. package/docs/models.md +5 -5
  617. package/docs/packages.md +1 -1
  618. package/docs/providers.md +2 -2
  619. package/docs/rpc.md +7 -7
  620. package/docs/security.md +10 -5
  621. package/docs/sessions.md +2 -2
  622. package/docs/skills.md +1 -1
  623. package/docs/terminal-setup.md +7 -7
  624. package/docs/themes.md +1 -1
  625. package/docs/usage.md +1 -1
  626. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  627. package/examples/extensions/bash-spawn-hook.ts +1 -1
  628. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  629. package/examples/extensions/claude-rules.ts +1 -1
  630. package/examples/extensions/commands.ts +1 -1
  631. package/examples/extensions/custom-compaction.ts +1 -1
  632. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  633. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  634. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  635. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  636. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  637. package/examples/extensions/doom-overlay/index.ts +1 -1
  638. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  639. package/examples/extensions/gondolin/index.ts +1 -1
  640. package/examples/extensions/gondolin/package-lock.json +2 -2
  641. package/examples/extensions/gondolin/package.json +1 -1
  642. package/examples/extensions/hidden-thinking-label.ts +1 -1
  643. package/examples/extensions/inline-bash.ts +2 -2
  644. package/examples/extensions/input-transform-streaming.ts +2 -2
  645. package/examples/extensions/input-transform.ts +2 -2
  646. package/examples/extensions/interactive-shell.ts +1 -1
  647. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  648. package/examples/extensions/mac-system-theme.ts +1 -1
  649. package/examples/extensions/minimal-mode.ts +1 -1
  650. package/examples/extensions/modal-editor.ts +1 -1
  651. package/examples/extensions/model-status.ts +1 -1
  652. package/examples/extensions/notify.ts +3 -3
  653. package/examples/extensions/overlay-qa-tests.ts +1 -1
  654. package/examples/extensions/overlay-test.ts +1 -1
  655. package/examples/extensions/pirate.ts +1 -1
  656. package/examples/extensions/preset.ts +3 -3
  657. package/examples/extensions/project-trust.ts +4 -4
  658. package/examples/extensions/prompt-customizer.ts +1 -1
  659. package/examples/extensions/rainbow-editor.ts +1 -1
  660. package/examples/extensions/rpc-demo.ts +1 -1
  661. package/examples/extensions/sandbox/index.ts +7 -7
  662. package/examples/extensions/sandbox/package-lock.json +2 -2
  663. package/examples/extensions/sandbox/package.json +1 -1
  664. package/examples/extensions/shutdown-command.ts +5 -5
  665. package/examples/extensions/ssh.ts +2 -2
  666. package/examples/extensions/subagent/README.md +3 -3
  667. package/examples/extensions/subagent/index.ts +2 -2
  668. package/examples/extensions/titlebar-spinner.ts +1 -1
  669. package/examples/extensions/tool-override.ts +1 -1
  670. package/examples/extensions/tools.ts +1 -1
  671. package/examples/extensions/with-deps/package-lock.json +2 -2
  672. package/examples/extensions/with-deps/package.json +1 -1
  673. package/examples/extensions/working-indicator.ts +1 -1
  674. package/examples/extensions/working-message-test.ts +1 -1
  675. package/examples/sdk/01-minimal.ts +1 -1
  676. package/examples/sdk/03-custom-prompt.ts +1 -1
  677. package/examples/sdk/04-skills.ts +1 -1
  678. package/examples/sdk/06-extensions.ts +2 -2
  679. package/examples/sdk/08-prompt-templates.ts +1 -1
  680. package/install-lock/package-lock.json +24 -24
  681. package/install-lock/package.json +2 -2
  682. package/npm-shrinkwrap.json +60 -24
  683. package/package.json +9 -9
  684. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  685. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  686. package/dist/modes/interactive/components/exit-card.js +0 -69
  687. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  688. package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
  689. package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
  690. package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
  691. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  692. package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
  693. package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
  694. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  695. package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
  696. package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
  697. package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/types.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Type definitions for the subagent extension\n */\n\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { Message } from \"@ashx-j/lunr-ai\";\nimport type { FSWatcher } from \"node:fs\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport type { ModelScopeConfig } from \"../runs/shared/model-scope.ts\";\n\n// ============================================================================\n// Basic Types\n// ============================================================================\n\nexport interface MaxOutputConfig {\n\tbytes?: number;\n\tlines?: number;\n}\n\nexport type OutputMode = \"inline\" | \"file-only\";\n\nexport type ChildPermission = \"full\" | \"read-only\";\nexport type ChildTier = \"light\" | \"standard\" | \"heavy\";\n\n/** How the child model was chosen. Captured from requested params before resolution. */\nexport type ModelSelection =\n\t| { kind: \"tier\"; tier: ChildTier }\n\t| { kind: \"model\"; model?: string };\n\nexport interface ChildSpec {\n\tchildId: string;\n\ttask: string;\n\tdescription: string;\n\trequestedPermissions: ChildPermission;\n\teffectivePermissions: ChildPermission;\n\t/** User-requested model when modelSelection.kind is \"model\". Never a tier-resolved runtime id. */\n\tmodel?: string;\n\ttier?: ChildTier;\n\tmodelSelection?: ModelSelection;\n\t/** Explicit thinking level paired with modelSelection.kind === \"model\". */\n\tthinking?: string;\n\tskill?: string | string[] | false;\n\tcwd?: string;\n\toutput?: string | false;\n\toutputMode?: OutputMode;\n\tacceptance?: AcceptanceInput;\n\ttoolBudget?: ToolBudgetConfig;\n\tcount?: number;\n\treads?: string[] | false;\n\tprogress?: boolean;\n\tlabel?: string;\n\tphase?: string;\n\tas?: string;\n\toutputSchema?: JsonSchemaObject;\n\tfanoutAuthorized?: boolean;\n}\n\n/** Internal execution compatibility shape. It is built from ChildSpec and is never user-discovered. */\nexport interface ChildRuntimeConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tmcpDirectTools?: string[];\n\tmodel?: string;\n\tfallbackModels?: string[];\n\tthinking?: string | false;\n\tsystemPromptMode: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tacceptanceRole?: AcceptanceRole;\n\tsystemPrompt: string;\n\tskills?: string[];\n\tskillPath?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\toutput?: string;\n\tmaxSubagentDepth?: number;\n\tcompletionGuard?: boolean;\n\ttoolBudget?: ToolBudgetConfig;\n}\n\nexport function childRowLabel(entry: {\n\tdescription?: string;\n\tlabel?: string;\n\tagent?: string;\n\tchildId?: string;\n}): string {\n\treturn entry.label?.trim() || entry.description?.trim() || entry.agent?.trim() || entry.childId || \"child\";\n}\n\nexport type AcceptanceRole = \"read-only\" | \"writer\";\n\nexport type JsonSchemaObject = Record<string, unknown>;\n\nexport interface ChainOutputMapEntry {\n\ttext: string;\n\tstructured?: unknown;\n\tagent: string;\n\tstepIndex: number;\n}\n\nexport type ChainOutputMap = Record<string, ChainOutputMapEntry>;\n\nexport type WorkflowNodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"paused\" | \"stopped\" | \"detached\";\n\nexport interface WorkflowGraphNode {\n\tid: string;\n\tkind: \"step\" | \"parallel-group\" | \"dynamic-parallel-group\" | \"agent\";\n\tagent?: string;\n\tphase?: string;\n\tlabel: string;\n\tstatus: WorkflowNodeStatus;\n\tflatIndex?: number;\n\tstepIndex?: number;\n\tchildren?: WorkflowGraphNode[];\n\tdynamic?: {\n\t\tsourceOutput: string;\n\t\tsourcePath: string;\n\t\titemName: string;\n\t\tmaxItems?: number;\n\t\tcollectAs?: string;\n\t};\n\titemKey?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tacceptanceStatus?: AcceptanceLedgerStatus;\n\terror?: string;\n}\n\nexport interface WorkflowGraphSnapshot {\n\trunId: string;\n\tmode: \"chain\" | \"parallel\" | \"single\";\n\tphases: Array<{ title: string; nodeIds: string[] }>;\n\tnodes: WorkflowGraphNode[];\n\tcurrentNodeId?: string;\n}\n\nexport interface SavedOutputReference {\n\tpath: string;\n\tbytes: number;\n\tlines: number;\n\tmessage: string;\n}\n\ninterface TruncationResult {\n\ttext: string;\n\ttruncated: boolean;\n\toriginalBytes?: number;\n\toriginalLines?: number;\n\tartifactPath?: string;\n}\n\nexport interface Usage {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tturns: number;\n}\n\nexport interface TurnBudgetConfig {\n\tmaxTurns: number;\n\tgraceTurns?: number;\n}\n\nexport interface ResolvedTurnBudget {\n\tmaxTurns: number;\n\tgraceTurns: number;\n}\n\nexport interface ToolBudgetConfig {\n\tsoft?: number;\n\thard: number;\n\tblock?: string[] | \"*\";\n}\n\nexport interface ResolvedToolBudget {\n\tsoft?: number;\n\thard: number;\n\tblock: string[] | \"*\";\n}\n\nexport type ToolBudgetOutcome = \"within-budget\" | \"soft-reached\" | \"hard-blocked\";\n\nexport interface ToolBudgetState extends ResolvedToolBudget {\n\toutcome: ToolBudgetOutcome;\n\ttoolCount: number;\n\tsoftReachedAt?: number;\n\thardReachedAt?: number;\n\tblockedTool?: string;\n}\n\nexport type TurnBudgetOutcome = \"within-budget\" | \"wrap-up-requested\" | \"exceeded\";\n\nexport interface TurnBudgetState extends ResolvedTurnBudget {\n\toutcome: TurnBudgetOutcome;\n\tturnCount: number;\n\twrapUpRequestedAtTurn?: number;\n\texceededAtTurn?: number;\n}\n\nexport interface TokenUsage {\n\tinput: number;\n\toutput: number;\n\ttotal: number;\n}\n\nexport type ActivityState = \"active_long_running\" | \"needs_attention\";\nexport type ControlEventType = \"active_long_running\" | \"needs_attention\";\nexport type ControlNotificationChannel = \"event\" | \"async\" | \"intercom\";\n\nexport interface ControlConfig {\n\tenabled?: boolean;\n\tneedsAttentionAfterMs?: number;\n\tactiveNoticeAfterMs?: number;\n\tactiveNoticeAfterTurns?: number;\n\tactiveNoticeAfterTokens?: number;\n\tfailedToolAttemptsBeforeAttention?: number;\n\tnotifyOn?: ControlEventType[];\n\tnotifyChannels?: ControlNotificationChannel[];\n}\n\nexport interface ResolvedControlConfig {\n\tenabled: boolean;\n\tneedsAttentionAfterMs: number;\n\tactiveNoticeAfterMs: number;\n\tactiveNoticeAfterTurns?: number;\n\tactiveNoticeAfterTokens?: number;\n\tfailedToolAttemptsBeforeAttention: number;\n\tnotifyOn: ControlEventType[];\n\tnotifyChannels: ControlNotificationChannel[];\n}\n\n/**\n * Smart completion batching for async-completion notifications. Successful\n * sibling completions are held briefly so they arrive as one grouped message;\n * failure and attention signals bypass grouping and always fire immediately.\n */\nexport interface CompletionBatchConfig {\n\tenabled?: boolean;\n\t/** Idle window after each arrival; resets on every new item. */\n\tdebounceMs?: number;\n\t/** Hard cap measured from the first item in a group. */\n\tmaxWaitMs?: number;\n\t/** Shorter idle window for straggler groups. */\n\tstragglerDebounceMs?: number;\n\t/** Shorter hard cap for straggler groups. */\n\tstragglerMaxWaitMs?: number;\n\t/** Arrivals within this window after an emit join a straggler group. */\n\tstragglerWindowMs?: number;\n}\n\nexport interface WaitToolConfigObject {\n\tenabled?: boolean;\n}\n\nexport type WaitToolConfig = boolean | WaitToolConfigObject;\n\nexport interface ControlEvent {\n\ttype: ControlEventType;\n\tfrom?: ActivityState;\n\tto: ActivityState;\n\tts: number;\n\tagent: string;\n\tindex?: number;\n\trunId: string;\n\tnestedRunId?: string;\n\tnestingPath?: NestedRunAddress[\"path\"];\n\tmessage: string;\n\treason?: \"idle\" | \"completion_guard\" | \"active_long_running\" | \"tool_failures\" | \"time_threshold\" | \"turn_threshold\" | \"token_threshold\";\n\tturns?: number;\n\ttokens?: number;\n\ttoolCount?: number;\n\tcurrentTool?: string;\n\tcurrentToolDurationMs?: number;\n\tcurrentPath?: string;\n\telapsedMs?: number;\n\trecentFailureSummary?: string;\n}\n\nexport type SubagentResultStatus = \"completed\" | \"failed\" | \"paused\" | \"stopped\" | \"detached\";\nexport type SubagentRunMode = \"single\" | \"parallel\" | \"chain\";\nexport const SUBAGENT_LIFECYCLE_ARTIFACT_VERSION = 4;\nexport type SubagentLifecycleArtifactVersion = typeof SUBAGENT_LIFECYCLE_ARTIFACT_VERSION;\nexport const UNSUPPORTED_SUBAGENT_LIFECYCLE_MESSAGE =\n\t\"This subagent run uses an unsupported lifecycle format. Named agent types cannot be resumed. Launch a new prompt-driven child instead.\";\n\nexport function isSupportedSubagentLifecycleVersion(version: unknown): boolean {\n\treturn version === SUBAGENT_LIFECYCLE_ARTIFACT_VERSION;\n}\n\nexport type SteeringActionState = \"delivered\" | \"scheduled\" | \"pending\" | \"partial\" | \"recovered\" | \"failed\";\nexport type SteeringTargetState = \"scheduled\" | \"routed\" | \"delivered\" | \"late\" | \"failed\" | \"recovered\";\n\nexport interface SteeringTargetStatus {\n\tindex: number;\n\tstate: SteeringTargetState;\n\troutedAt?: number;\n\tdeliveredAt?: number;\n\tlateDeliveredAt?: number;\n\tfailedAt?: number;\n\trecoveredAt?: number;\n\treason?: string;\n\treplacementRunId?: string;\n}\n\nexport interface SteeringRequestStatus {\n\tid: string;\n\trequestedAt: number;\n\tsource?: string;\n\tmessagePreview: string;\n\ttargets: SteeringTargetStatus[];\n}\n\nexport interface SteeringStatus {\n\trequested: number;\n\tscheduled: number;\n\tpending: number;\n\tdelivered: number;\n\tfailed: number;\n\trecovered: number;\n\tlastRequestedAt?: number;\n\tlastDeliveredAt?: number;\n\trecent: SteeringRequestStatus[];\n}\n\nexport interface SteerActionTarget {\n\tindex: number;\n\tstate: SteeringTargetState;\n\tdeliveredAt?: number;\n\tlateDeliveredAt?: number;\n\treason?: string;\n\treplacementRunId?: string;\n}\n\nexport interface SteerActionResult {\n\trequestId: string;\n\tstate: SteeringActionState;\n\tsourceRunId: string;\n\treplacementRunId?: string;\n\ttargets: SteerActionTarget[];\n}\n\nexport interface SteeringNotice {\n\ttype: \"subagent.steering.notice\";\n\tts: number;\n\trunId: string;\n\trequestId: string;\n\tstate: \"failed\" | \"partial\" | \"recovered\";\n\tmessage: string;\n\tcurrentSessionId?: string;\n}\n\nexport interface SteeringRecoveryDescriptor {\n\tversion: 4;\n\tlifecycleArtifactVersion?: SubagentLifecycleArtifactVersion;\n\tsourceRunId: string;\n\tchildId: string;\n\tdescription: string;\n\tpermissions: ChildPermission;\n\tagent: string;\n\tsessionFile?: string;\n\tcwd: string;\n\tmodel?: string;\n\ttier?: ChildTier;\n\tthinking?: string;\n\tmodelSelection?: ModelSelection;\n\tskills?: string[];\n\toutputPath?: string;\n\toutputMode: \"inline\" | \"file-only\";\n\tacceptance?: ResolvedAcceptanceConfig;\n\tcontrolConfig?: ResolvedControlConfig;\n\tabsoluteDeadlineAt?: number;\n\tinitialTurnBudget?: ResolvedTurnBudget;\n\tinitialToolBudget?: ResolvedToolBudget;\n\tmaxSubagentDepth: number;\n\tmaxOutput?: MaxOutputConfig;\n\tshare: boolean;\n\tsessionDir?: string;\n\tartifactsDir?: string;\n\tartifactConfig?: ArtifactConfig;\n}\n\nexport type PublicNestedStepSummary = Pick<\n\tNestedStepSummary,\n\t\"agent\" | \"status\" | \"sessionFile\" | \"transcriptPath\" | \"transcriptError\" | \"activityState\" | \"lastActivityAt\" | \"currentTool\" | \"currentToolStartedAt\" | \"currentPath\" | \"turnCount\" | \"toolCount\" | \"toolBudget\" | \"toolBudgetBlocked\" | \"startedAt\" | \"endedAt\" | \"error\" | \"timedOut\" | \"stopped\"\n> & {\n\tchildren?: PublicNestedRunSummary[];\n};\n\nexport type CostSummary = {\n\tinputTokens: number;\n\toutputTokens: number;\n\tcostUsd: number;\n};\n\nexport type PublicNestedRunSummary = Pick<\n\tNestedRunSummary,\n\t\"id\" | \"parentRunId\" | \"parentStepIndex\" | \"parentAgent\" | \"depth\" | \"path\" | \"asyncDir\" | \"sessionId\" | \"sessionFile\" | \"intercomTarget\" | \"ownerIntercomTarget\" | \"leafIntercomTarget\" | \"ownerState\" | \"mode\" | \"state\" | \"agent\" | \"agents\" | \"currentStep\" | \"chainStepCount\" | \"parallelGroups\" | \"activityState\" | \"lastActivityAt\" | \"currentTool\" | \"currentToolStartedAt\" | \"currentPath\" | \"turnCount\" | \"toolCount\" | \"toolBudget\" | \"toolBudgetBlocked\" | \"totalTokens\" | \"totalCost\" | \"startedAt\" | \"endedAt\" | \"lastUpdate\" | \"error\" | \"timeoutMs\" | \"deadlineAt\" | \"timedOut\" | \"stopped\" | \"turnBudget\" | \"turnBudgetExceeded\" | \"wrapUpRequested\"\n> & {\n\tsteps?: PublicNestedStepSummary[];\n\tchildren?: PublicNestedRunSummary[];\n};\n\nexport interface SubagentResultIntercomChild {\n\tagent: string;\n\tstatus: SubagentResultStatus;\n\tsummary: string;\n\tindex?: number;\n\tartifactPath?: string;\n\tsessionPath?: string;\n\tintercomTarget?: string;\n\tchildren?: PublicNestedRunSummary[];\n}\n\nexport interface SubagentResultIntercomPayload {\n\townerNotificationSessionId?: string;\n\tto: string;\n\tmessage: string;\n\trequestId?: string;\n\trunId: string;\n\tmode: SubagentRunMode;\n\tstatus: SubagentResultStatus;\n\tsummary: string;\n\tsource: \"foreground\" | \"async\";\n\tchildren: SubagentResultIntercomChild[];\n\tasyncId?: string;\n\tasyncDir?: string;\n\tchainSteps?: number;\n\tagent?: string;\n\tindex?: number;\n\tartifactPath?: string;\n\tsessionPath?: string;\n}\n\n// ============================================================================\n// Progress Tracking\n// ============================================================================\n\nexport interface ChildWatchdogProgress {\n\tphase: \"idle\" | \"reviewing\" | \"autofollow\" | \"settling\" | \"stale\" | \"failed\";\n\tseq: number;\n\tlastUpdate: number;\n\tfollowUpPending: boolean;\n\treason?: string;\n\ttimedOut?: boolean;\n}\n\nexport interface AgentProgress {\n\tindex: number;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: ChildPermission;\n\tagent: string;\n\tstatus: \"pending\" | \"running\" | \"completed\" | \"failed\" | \"detached\";\n\tactivityState?: ActivityState;\n\ttask: string;\n\tskills?: string[];\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: ModelSelection;\n\tthinkingText?: string;\n\trecentTools: Array<{ tool: string; args: string; endMs: number }>;\n\trecentOutput: string[];\n\ttoolCount: number;\n\tturnCount?: number;\n\ttokens: number;\n\tdurationMs: number;\n\terror?: string;\n\tfailedTool?: string;\n\twatchdog?: ChildWatchdogProgress;\n}\n\nexport interface ToolCallSummary {\n\ttext: string;\n\texpandedText: string;\n}\n\ninterface ProgressSummary {\n\ttoolCount: number;\n\ttokens: number;\n\tdurationMs: number;\n}\n\n// ============================================================================\n// Results\n// ============================================================================\n\nexport interface ModelAttempt {\n\tmodel: string;\n\tsuccess: boolean;\n\texitCode?: number | null;\n\terror?: string;\n\tusage?: Usage;\n}\n\nexport type AcceptanceLevel = \"auto\" | \"none\" | \"attested\" | \"checked\" | \"verified\" | \"reviewed\";\n\nexport type AcceptanceEvidenceKind =\n\t| \"changed-files\"\n\t| \"tests-added\"\n\t| \"commands-run\"\n\t| \"validation-output\"\n\t| \"residual-risks\"\n\t| \"no-staged-files\"\n\t| \"diff-summary\"\n\t| \"review-findings\"\n\t| \"manual-notes\";\n\nexport interface AcceptanceGate {\n\tid: string;\n\tmust: string;\n\tevidence?: AcceptanceEvidenceKind[];\n\tseverity?: \"required\" | \"recommended\";\n}\n\nexport interface AcceptanceVerifyCommand {\n\tid: string;\n\tcommand: string;\n\ttimeoutMs?: number;\n\tcwd?: string;\n\tenv?: Record<string, string>;\n\tallowFailure?: boolean;\n}\n\nexport interface AcceptanceReviewGate {\n\tagent?: string;\n\tfocus?: string;\n\trequired?: boolean;\n}\n\nexport interface AcceptanceConfig {\n\tlevel?: AcceptanceLevel;\n\tcriteria?: Array<string | AcceptanceGate>;\n\tevidence?: AcceptanceEvidenceKind[];\n\tverify?: AcceptanceVerifyCommand[];\n\treview?: AcceptanceReviewGate | false;\n\tstopRules?: string[];\n\treason?: string;\n}\n\n/** Bare \"none\" is not accepted: use { level: \"none\", reason: \"...\" }; false remains a deprecated shorthand. */\nexport type AcceptanceInput = Exclude<AcceptanceLevel, \"none\"> | false | AcceptanceConfig;\n\nexport interface ResolvedAcceptanceGate extends AcceptanceGate {\n\tid: string;\n\tmust: string;\n\tevidence: AcceptanceEvidenceKind[];\n\tseverity: \"required\" | \"recommended\";\n}\n\nexport interface ResolvedAcceptanceConfig {\n\tlevel: Exclude<AcceptanceLevel, \"auto\">;\n\texplicit: boolean;\n\tinferredReason: string[];\n\tcriteria: ResolvedAcceptanceGate[];\n\tevidence: AcceptanceEvidenceKind[];\n\tverify: AcceptanceVerifyCommand[];\n\treview?: AcceptanceReviewGate | false;\n\tstopRules: string[];\n\treason?: string;\n}\n\nexport interface AcceptanceReport {\n\tcriteriaSatisfied?: Array<{\n\t\tid?: string;\n\t\tstatus: \"satisfied\" | \"not-satisfied\" | \"not-applicable\";\n\t\tevidence: string;\n\t}>;\n\tchangedFiles?: string[];\n\ttestsAddedOrUpdated?: string[];\n\tcommandsRun?: Array<{\n\t\tcommand: string;\n\t\tresult: \"passed\" | \"failed\" | \"not-run\";\n\t\tsummary: string;\n\t}>;\n\tvalidationOutput?: string[];\n\tresidualRisks?: string[];\n\tnoStagedFiles?: boolean;\n\tdiffSummary?: string;\n\treviewFindings?: string[];\n\tmanualNotes?: string;\n\tnotes?: string;\n}\n\nexport type AcceptanceRuntimeCheckStatus = \"passed\" | \"failed\" | \"not-applicable\";\n\nexport interface AcceptanceRuntimeCheck {\n\tid: string;\n\tstatus: AcceptanceRuntimeCheckStatus;\n\tmessage: string;\n}\n\nexport interface AcceptanceVerifyResult {\n\tid: string;\n\tcommand: string;\n\tcwd?: string;\n\texitCode: number | null;\n\tstatus: \"passed\" | \"failed\" | \"timed-out\" | \"allowed-failure\";\n\tstdout?: string;\n\tstderr?: string;\n\tdurationMs: number;\n}\n\nexport interface AcceptanceReviewResult {\n\tstatus: \"no-blockers\" | \"blockers\" | \"needs-parent-decision\";\n\tfindings: Array<{\n\t\tseverity: \"blocker\" | \"non-blocking\";\n\t\tfile?: string;\n\t\tissue: string;\n\t\trationale: string;\n\t}>;\n}\n\nexport type AcceptanceLedgerStatus =\n\t| \"pending\"\n\t| \"not-required\"\n\t| \"claimed\"\n\t| \"attested\"\n\t| \"checked\"\n\t| \"verified\"\n\t| \"reviewed\"\n\t| \"accepted\"\n\t| \"rejected\";\n\nexport interface AcceptanceLedger {\n\tstatus: AcceptanceLedgerStatus;\n\texplicit: boolean;\n\teffectiveAcceptance: ResolvedAcceptanceConfig;\n\tinferredReason: string[];\n\tcriteria: ResolvedAcceptanceGate[];\n\tchildReport?: AcceptanceReport;\n\tchildReportParseError?: string;\n\truntimeChecks: AcceptanceRuntimeCheck[];\n\tverifyRuns: AcceptanceVerifyResult[];\n\treviewResult?: AcceptanceReviewResult;\n\tparentDecision?: {\n\t\tstatus: \"accepted\" | \"rejected\";\n\t\tat: string;\n\t\treason?: string;\n\t};\n}\n\nexport interface ProtocolOutputLimit {\n\tcode: \"protocol_output_limit\";\n\tstream: \"stdout\" | \"stderr\";\n\tlimitBytes: number;\n\tobservedBytes: number;\n\tdiagnosticPrefix: string;\n\tdiagnosticTail: string;\n}\n\nexport interface SingleResult {\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: ChildPermission;\n\tagent: string;\n\ttask: string;\n\texitCode: number;\n\tdetached?: boolean;\n\tdetachedReason?: string;\n\tinterrupted?: boolean;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\tmessages?: Message[];\n\tusage: Usage;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: ModelSelection;\n\tattemptedModels?: string[];\n\tmodelAttempts?: ModelAttempt[];\n\tcontrolEvents?: ControlEvent[];\n\terror?: string;\n\tprotocolError?: ProtocolOutputLimit;\n\tsessionFile?: string;\n\tskills?: string[];\n\tskillsWarning?: string;\n\tprogress?: AgentProgress;\n\tprogressSummary?: ProgressSummary;\n\ttoolCalls?: ToolCallSummary[];\n\tartifactPaths?: ArtifactPaths;\n\ttruncation?: TruncationResult;\n\tfinalOutput?: string;\n\toutputMode?: OutputMode;\n\tsavedOutputPath?: string;\n\toutputReference?: SavedOutputReference;\n\toutputSaveError?: string;\n\tstructuredOutput?: unknown;\n\tstructuredOutputPath?: string;\n\tstructuredOutputSchemaPath?: string;\n\tacceptance?: AcceptanceLedger;\n\ttranscriptPath?: string;\n\ttranscriptError?: string;\n\tchildren?: NestedRunSummary[];\n\twatchdog?: ChildWatchdogProgress;\n}\n\nexport interface Details {\n\tmode: SubagentRunMode | \"management\";\n\trunId?: string;\n\tcontext?: \"fresh\" | \"fork\";\n\tresults: SingleResult[];\n\tcontrolEvents?: ControlEvent[];\n\tsteering?: SteerActionResult;\n\tasyncId?: string;\n\tasyncDir?: string;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: ResolvedTurnBudget;\n\ttoolBudget?: ResolvedToolBudget;\n\tprogress?: AgentProgress[];\n\tprogressSummary?: ProgressSummary;\n\tartifacts?: {\n\t\tdir: string;\n\t\tfiles: ArtifactPaths[];\n\t};\n\ttruncation?: {\n\t\ttruncated: boolean;\n\t\toriginalBytes?: number;\n\t\toriginalLines?: number;\n\t\tartifactPath?: string;\n\t};\n\t// Chain metadata for observability\n\tchainAgents?: string[]; // deprecated: child descriptions in order\n\tchainChildren?: Array<{ childId: string; description: string; permissions: ChildPermission }>;\n\ttotalSteps?: number; // Total steps in chain\n\tcurrentStepIndex?: number; // 0-indexed current step (for running chains)\n\tworkflowGraph?: WorkflowGraphSnapshot;\n\toutputs?: ChainOutputMap;\n\t// Aggregated child usage across all agents in the run\n\ttotalChildUsage?: Usage;\n\t// Aggregated cost across all agents in the run\n\ttotalCost?: CostSummary;\n\tquestionId?: string;\n\tstate?: string;\n\t/** Resolved UI label for management actions, persisted with the tool result. */\n\tdisplayTitle?: string;\n\tcommunication?: import(\"../intercom/communication.ts\").SubagentCommunication;\n\tanswered?: boolean;\n\tdelivered?: boolean;\n}\n\n// ============================================================================\n// Artifacts\n// ============================================================================\n\nexport interface ArtifactPaths {\n\tinputPath: string;\n\toutputPath: string;\n\tjsonlPath: string;\n\ttranscriptPath: string;\n\tmetadataPath: string;\n}\n\nexport interface ArtifactConfig {\n\tenabled: boolean;\n\tincludeInput: boolean;\n\tincludeOutput: boolean;\n\tincludeJsonl: boolean;\n\tincludeTranscript?: boolean;\n\tincludeMetadata: boolean;\n\tcleanupDays: number;\n}\n\n// ============================================================================\n// Async Execution\n// ============================================================================\n\nexport interface AsyncParallelGroupStatus {\n\tstart: number;\n\tcount: number;\n\tstepIndex: number;\n}\n\nexport type NestedRunState = \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\nexport type NestedOwnerState = \"live\" | \"gone\" | \"unknown\";\n\nexport interface NestedRunAddress {\n\tid: string;\n\tparentRunId: string;\n\tparentStepIndex?: number;\n\tparentAgent?: string;\n\tdepth: number;\n\tpath: Array<{ runId: string; stepIndex?: number; agent?: string }>;\n}\n\nexport interface NestedStepSummary {\n\tagent: string;\n\tstatus: \"pending\" | \"running\" | \"complete\" | \"completed\" | \"failed\" | \"paused\" | \"stopped\";\n\tsessionFile?: string;\n\ttranscriptPath?: string;\n\ttranscriptError?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tstartedAt?: number;\n\tendedAt?: number;\n\terror?: string;\n\twatchdog?: ChildWatchdogProgress;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\tchildren?: NestedRunSummary[];\n}\n\nexport interface NestedRunSummary extends NestedRunAddress {\n\tasyncDir?: string;\n\tpid?: number;\n\tsessionId?: string;\n\tsessionFile?: string;\n\tintercomTarget?: string;\n\townerIntercomTarget?: string;\n\tleafIntercomTarget?: string;\n\townerState?: NestedOwnerState;\n\tcontrolInbox?: string;\n\tcapabilityToken?: string;\n\tmode?: SubagentRunMode;\n\tstate: NestedRunState;\n\tagent?: string;\n\tagents?: string[];\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tsteps?: NestedStepSummary[];\n\tchildren?: NestedRunSummary[];\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\ttotalTokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tlastUpdate?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\terror?: string;\n}\n\nexport interface NestedRouteInfo {\n\trootRunId: string;\n\teventSink: string;\n\tcontrolInbox: string;\n\tcapabilityToken: string;\n}\n\nexport interface AsyncStartedEvent {\n\tlifecycleArtifactVersion?: SubagentLifecycleArtifactVersion;\n\tid?: string;\n\tasyncDir?: string;\n\tpid?: number;\n\tsessionId?: string;\n\tmode?: SubagentRunMode;\n\tagent?: string;\n\tagents?: string[];\n\t/** Truncated first child task retained for backwards compatibility. */\n\ttask?: string;\n\t/** Workflow-level caller task, falling back to the first child task. */\n\tgoal?: string;\n\tchain?: string[];\n\tchainStepCount?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tworkflowGraph?: WorkflowGraphSnapshot;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\tturnBudget?: TurnBudgetState;\n\tnestedRoute?: NestedRouteInfo;\n}\n\nexport interface AsyncStatus {\n\tlifecycleArtifactVersion?: SubagentLifecycleArtifactVersion;\n\trunId: string;\n\tsessionId?: string;\n\tmode: SubagentRunMode;\n\tisNested?: boolean;\n\tstate: \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\n\terror?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tstartedAt: number;\n\tendedAt?: number;\n\tlastUpdate?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\tpid?: number;\n\tcwd?: string;\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tpendingAppends?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tworkflowGraph?: WorkflowGraphSnapshot;\n\tsteps?: Array<{\n\t\tchildId?: string;\n\t\tdescription?: string;\n\t\tpermissions?: ChildPermission;\n\t\tagent: string;\n\t\tphase?: string;\n\t\tlabel?: string;\n\t\toutputName?: string;\n\t\tstructured?: boolean;\n\t\tstatus: \"pending\" | \"running\" | \"complete\" | \"completed\" | \"failed\" | \"paused\" | \"stopped\";\n\t\tchildren?: NestedRunSummary[];\n\t\tsessionFile?: string;\n\t\ttranscriptPath?: string;\n\t\ttranscriptError?: string;\n\t\tactivityState?: ActivityState;\n\t\tlastActivityAt?: number;\n\t\tcurrentTool?: string;\n\t\tcurrentToolArgs?: string;\n\t\tcurrentToolStartedAt?: number;\n\t\tcurrentPath?: string;\n\t\trecentTools?: Array<{ tool: string; args: string; endMs: number }>;\n\t\trecentOutput?: string[];\n\t\tturnCount?: number;\n\t\ttoolCount?: number;\n\t\tstartedAt?: number;\n\t\tendedAt?: number;\n\t\tdurationMs?: number;\n\t\texitCode?: number | null;\n\t\ttimedOut?: boolean;\n\t\tstopped?: boolean;\n\t\tturnBudget?: TurnBudgetState;\n\t\tturnBudgetExceeded?: boolean;\n\t\twrapUpRequested?: boolean;\n\t\ttoolBudget?: ToolBudgetState;\n\t\ttoolBudgetBlocked?: boolean;\n\t\ttokens?: TokenUsage;\n\t\tskills?: string[];\n\t\tmodel?: string;\n\t\tthinking?: string;\n\t\tmodelSelection?: ModelSelection;\n\t\tattemptedModels?: string[];\n\t\tmodelAttempts?: ModelAttempt[];\n\t\ttotalCost?: CostSummary;\n\t\tsteering?: SteeringStatus;\n\t\terror?: string;\n\t\tstructuredOutput?: unknown;\n\t\tstructuredOutputPath?: string;\n\t\tstructuredOutputSchemaPath?: string;\n\t\tacceptance?: AcceptanceLedger;\n\t\twatchdog?: ChildWatchdogProgress;\n\t}>;\n\tsessionDir?: string;\n\toutputFile?: string;\n\ttotalTokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tsessionFile?: string;\n\toutputs?: ChainOutputMap;\n}\n\nexport type AsyncJobStep = NonNullable<AsyncStatus[\"steps\"]>[number] & {\n\tindex?: number;\n};\n\nexport interface AsyncJobState {\n\tasyncId: string;\n\tasyncDir: string;\n\tstatus: \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\n\tpid?: number;\n\tsessionId?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tmode?: SubagentRunMode;\n\tagents?: string[];\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tsteps?: AsyncJobStep[];\n\tstepsTotal?: number;\n\trunningSteps?: number;\n\tcompletedSteps?: number;\n\thasParallelGroups?: boolean;\n\tactiveParallelGroup?: boolean;\n\tstartedAt?: number;\n\tupdatedAt?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\tsessionDir?: string;\n\toutputFile?: string;\n\ttotalTokens?: TokenUsage;\n\tsessionFile?: string;\n\tcontrolEventCursor?: number;\n\tnestedRoute?: NestedRouteInfo;\n\tnestedChildren?: NestedRunSummary[];\n}\n\nexport interface ForegroundResumeChild {\n\tagent: string;\n\tindex: number;\n\tsessionFile?: string;\n\tstatus: SubagentResultStatus;\n\texitCode?: number;\n\terror?: string;\n\tfinalOutput?: string;\n\toutputMode?: OutputMode;\n\tsavedOutputPath?: string;\n\toutputSaveError?: string;\n\tartifactPaths?: ArtifactPaths;\n\ttranscriptPath?: string;\n\ttranscriptError?: string;\n\tdetachedReason?: string;\n\tacceptance?: AcceptanceLedger;\n\tupdatedAt?: number;\n}\n\nexport interface ForegroundResumeRun {\n\trunId: string;\n\tmode: SubagentRunMode;\n\tcwd: string;\n\t/** Originating parent session. Detached exits can outlive the active session. */\n\tsessionId?: string;\n\tupdatedAt: number;\n\tchildren: ForegroundResumeChild[];\n}\n\nexport interface SubagentState {\n\tbaseCwd: string;\n\tcurrentSessionId: string | null;\n\t/** Bumps on session_start / session replacement so owned supervisor questions fail closed. */\n\tsessionGeneration?: number;\n\t/** Live foreground `subagent` tool calls. Caps same-turn overlap. */\n\tforegroundSubagentInFlight?: number;\n\tsubagentSpawns?: { sessionId: string | null; count: number };\n\tasyncJobs: Map<string, AsyncJobState>;\n\t/** Current-session active and recent async runs for the native fleet inspector. */\n\tfleetJobs?: Map<string, AsyncJobState>;\n\tforegroundRuns?: Map<string, ForegroundResumeRun>;\n\tforegroundControls: Map<string, {\n\t\trunId: string;\n\t\tmode: SubagentRunMode;\n\t\tstartedAt: number;\n\t\tupdatedAt: number;\n\t\tcurrentAgent?: string;\n\t\tcurrentChildId?: string;\n\t\tcurrentIndex?: number;\n\t\tcurrentActivityState?: ActivityState;\n\t\tlastActivityAt?: number;\n\t\tcurrentTool?: string;\n\t\tcurrentToolStartedAt?: number;\n\t\tcurrentPath?: string;\n\t\tturnCount?: number;\n\t\ttokens?: number;\n\t\ttoolCount?: number;\n\t\tnestedRoute?: NestedRouteInfo;\n\t\tnestedChildren?: NestedRunSummary[];\n\t\tinterrupt?: () => boolean;\n\t}>;\n\tlastForegroundControlId: string | null;\n\tpendingForegroundControlNotices?: Map<string, ReturnType<typeof setTimeout>>;\n\tcleanupTimers: Map<string, ReturnType<typeof setTimeout>>;\n\tlastUiContext: ExtensionContext | null;\n\tpoller: NodeJS.Timeout | null;\n\tcompletionSeen: Map<string, number>;\n\twatcher: FSWatcher | null;\n\twatcherRestartTimer: ReturnType<typeof setTimeout> | null;\n\tresultFileCoalescer: {\n\t\tschedule(file: string, delayMs?: number): boolean;\n\t\tclear(): void;\n\t};\n}\n\n// ============================================================================\n// Display\n// ============================================================================\n\nexport type DisplayItem = \n\t| { type: \"text\"; text: string } \n\t| { type: \"tool\"; name: string; args: Record<string, unknown> };\n\n// ============================================================================\n// Error Handling\n// ============================================================================\n\nexport interface ErrorInfo {\n\thasError: boolean;\n\texitCode?: number;\n\terrorType?: string;\n\tdetails?: string;\n}\n\nexport interface IntercomEventBus {\n\ton(channel: string, handler: (data: unknown) => void): () => void;\n\temit(channel: string, data: unknown): void;\n}\n\nexport const INTERCOM_DETACH_REQUEST_EVENT = \"pi-intercom:detach-request\";\nexport const INTERCOM_DETACH_RESPONSE_EVENT = \"pi-intercom:detach-response\";\nexport const SUBAGENT_ASYNC_STARTED_EVENT = \"subagent:async-started\";\nexport const SUBAGENT_ASYNC_COMPLETE_EVENT = \"subagent:async-complete\";\nexport const SUBAGENT_FOREGROUND_COMPLETE_EVENT = \"subagent:foreground-complete\";\nexport const SUBAGENT_CONTROL_EVENT = \"subagent:control-event\";\nexport const SUBAGENT_CONTROL_INTERCOM_EVENT = \"subagent:control-intercom\";\nexport const SUBAGENT_STEERING_NOTICE_EVENT = \"subagent:steering-notice\";\nexport const SUBAGENT_RESULT_INTERCOM_EVENT = \"subagent:result-intercom\";\nexport const SUBAGENT_RESULT_INTERCOM_DELIVERY_EVENT = \"subagent:result-intercom-delivery\";\n\n// ============================================================================\n// Execution Options\n// ============================================================================\n\nexport interface RunSyncOptions {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\tcwd?: string;\n\tsignal?: AbortSignal;\n\tinterruptSignal?: AbortSignal;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\ttoolBudget?: ResolvedToolBudget;\n\tallowIntercomDetach?: boolean;\n\tcommunicationEnabled?: boolean;\n\tintercomEvents?: IntercomEventBus;\n\tonUpdate?: (r: import(\"@ashx-j/lunr-agent\").AgentToolResult<Details>) => void;\n\tonControlEvent?: (event: ControlEvent) => void;\n\tonDetachedExit?: (result: SingleResult) => void;\n\tcontrolConfig?: ResolvedControlConfig;\n\tintercomSessionName?: string;\n\torchestratorIntercomTarget?: string;\n\tmaxOutput?: MaxOutputConfig;\n\tartifactsDir?: string;\n\tartifactConfig?: ArtifactConfig;\n\trunId: string;\n\tindex?: number;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tshare?: boolean;\n\toutputPath?: string;\n\toutputMode?: OutputMode;\n\tmaxSubagentDepth?: number;\n\t/** Effective parent wait-tool setting propagated to the child runtime. */\n\twaitToolEnabled?: boolean;\n\tnestedRoute?: NestedRouteInfo;\n\t/** Override the agent's default model (format: \"provider/id\" or just \"id\") */\n\tmodelOverride?: string;\n\t/** Override the agent's default thinking level for this run */\n\tthinkingOverride?: string | false;\n\t/** Registry models available for heuristic bare-model resolution */\n\tavailableModels?: Array<{ provider: string; id: string; fullId: string }>;\n\t/** Current parent-session provider to prefer for ambiguous bare model ids */\n\tpreferredModelProvider?: string;\n\t/** Optional subagent model-scope enforcement for fallback candidates */\n\tmodelScope?: ModelScopeConfig;\n\t/** Skills to make available (overrides agent default if provided) */\n\tskills?: string[];\n\tstructuredOutput?: {\n\t\tschema: JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tacceptance?: AcceptanceInput;\n\tacceptanceContext?: {\n\t\tmode?: SubagentRunMode;\n\t\tasync?: boolean;\n\t\tdynamic?: boolean;\n\t\tdynamicGroup?: boolean;\n\t};\n}\n\nexport type IntercomBridgeMode = \"off\" | \"fork-only\" | \"always\";\n\nexport interface IntercomBridgeConfig {\n\tmode?: IntercomBridgeMode;\n\tinstructionFile?: string;\n}\n\ninterface TopLevelParallelConfig {\n\tmaxTasks?: number;\n\tconcurrency?: number;\n}\n\ninterface ExtensionChainConfig {\n\tdynamicFanout?: {\n\t\tmaxItems?: number;\n\t};\n}\n\nexport interface ProactiveSkillSubagentsConfig {\n\tenabled?: boolean;\n\tminReferences?: number;\n\tmaxRecommendations?: number;\n\tpreferredAgent?: string;\n}\n\nexport type ToolDescriptionMode = \"full\" | \"compact\" | \"custom\";\n\nexport interface ScheduledRunsConfig {\n\tenabled?: boolean;\n\tmaxLatenessMs?: number;\n\tmaxPending?: number;\n}\n\nexport interface ExtensionConfig {\n\t/** @deprecated Launches now default to async regardless of this legacy value. */\n\tasyncByDefault?: boolean;\n\t/** Show the above-editor async runs widget. Defaults to true. */\n\tasyncWidget?: boolean;\n\t/** Tool description variant registered for the parent-facing subagent tool. Defaults to full. */\n\ttoolDescriptionMode?: ToolDescriptionMode;\n\t/** @deprecated Omitted async already means async; explicit async:false and clarify:true stay foreground. */\n\tforceTopLevelAsync?: boolean;\n\twaitTool?: WaitToolConfig;\n\tdefaultSessionDir?: string;\n\tsingleRunOutputBaseDir?: string;\n\tmaxSubagentDepth?: number;\n\t/** Optional cumulative session cap. Unset or 0 means unlimited. */\n\tmaxSubagentSpawnsPerSession?: number;\n\t/** Global cap on simultaneously-running subagent tasks within a single run. Unset means unlimited. */\n\tglobalConcurrencyLimit?: number;\n\tcontrol?: ControlConfig;\n\tcompletionBatch?: CompletionBatchConfig;\n\tturnBudget?: TurnBudgetConfig;\n\ttoolBudget?: ToolBudgetConfig;\n\tparallel?: TopLevelParallelConfig;\n\tchain?: ExtensionChainConfig;\n\tworktreeSetupHook?: string;\n\tworktreeSetupHookTimeoutMs?: number;\n\tworktreeBaseDir?: string;\n\tintercomBridge?: IntercomBridgeConfig;\n\tproactiveSkillSubagents?: ProactiveSkillSubagentsConfig | false;\n\tscheduledRuns?: ScheduledRunsConfig;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport const DEFAULT_MAX_OUTPUT: Required<MaxOutputConfig> = {\n\tbytes: 200 * 1024,\n\tlines: 5000,\n};\n\nexport const DEFAULT_ARTIFACT_CONFIG: ArtifactConfig = {\n\tenabled: true,\n\tincludeInput: true,\n\tincludeOutput: true,\n\tincludeJsonl: false,\n\tincludeTranscript: true,\n\tincludeMetadata: true,\n\tcleanupDays: 7,\n};\n\nfunction sanitizeTempScopeSegment(value: string): string {\n\tconst sanitized = value\n\t\t.trim()\n\t\t.replace(/[^A-Za-z0-9._-]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\treturn sanitized || \"unknown\";\n}\n\nexport function resolveTempScopeId(options?: {\n\tenv?: NodeJS.ProcessEnv;\n\tgetuid?: (() => number) | undefined;\n\tuserInfo?: (() => { username?: string | null }) | undefined;\n\thomedir?: (() => string) | undefined;\n}): string {\n\tconst env = options?.env ?? process.env;\n\tconst getuid = options && Object.hasOwn(options, \"getuid\")\n\t\t? options.getuid\n\t\t: process.getuid?.bind(process);\n\tif (typeof getuid === \"function\") {\n\t\treturn `uid-${getuid()}`;\n\t}\n\n\tfor (const key of [\"USERNAME\", \"USER\", \"LOGNAME\"] as const) {\n\t\tconst value = env[key];\n\t\tif (value) return `user-${sanitizeTempScopeSegment(value)}`;\n\t}\n\n\tconst userInfo = options && Object.hasOwn(options, \"userInfo\")\n\t\t? options.userInfo\n\t\t: os.userInfo;\n\ttry {\n\t\tconst username = userInfo?.().username;\n\t\tif (username) return `user-${sanitizeTempScopeSegment(username)}`;\n\t} catch {\n\t\t// Fall through to home-directory-based scoping.\n\t}\n\n\tconst homedir = env.USERPROFILE ?? env.HOME;\n\tif (homedir) return `home-${sanitizeTempScopeSegment(homedir)}`;\n\n\tconst resolveHomedir = options && Object.hasOwn(options, \"homedir\")\n\t\t? options.homedir\n\t\t: os.homedir;\n\ttry {\n\t\tconst fallbackHomedir = resolveHomedir?.();\n\t\tif (fallbackHomedir) return `home-${sanitizeTempScopeSegment(fallbackHomedir)}`;\n\t} catch {\n\t\t// Fall through to the last-resort shared scope.\n\t}\n\n\treturn \"shared\";\n}\n\nconst MAX_PARALLEL = Number.MAX_SAFE_INTEGER;\nexport const MAX_CONCURRENCY = Number.MAX_SAFE_INTEGER;\nexport const TEMP_ROOT_DIR = path.join(os.tmpdir(), `pi-subagents-${resolveTempScopeId()}`);\nexport const RESULTS_DIR = path.join(TEMP_ROOT_DIR, \"async-subagent-results\");\nexport const ASYNC_DIR = path.join(TEMP_ROOT_DIR, \"async-subagent-runs\");\nexport const CHAIN_RUNS_DIR = path.join(TEMP_ROOT_DIR, \"chain-runs\");\nexport const TEMP_ARTIFACTS_DIR = path.join(TEMP_ROOT_DIR, \"artifacts\");\nexport const WIDGET_KEY = \"subagent-async\";\nexport const SLASH_RESULT_TYPE = \"subagent-slash-result\";\nexport const SLASH_TEXT_RESULT_TYPE = \"subagent-slash-text-result\";\nexport const SLASH_SUBAGENT_REQUEST_EVENT = \"subagent:slash:request\";\nexport const SLASH_SUBAGENT_STARTED_EVENT = \"subagent:slash:started\";\nexport const SLASH_SUBAGENT_RESPONSE_EVENT = \"subagent:slash:response\";\nexport const SLASH_SUBAGENT_UPDATE_EVENT = \"subagent:slash:update\";\nexport const SLASH_SUBAGENT_CANCEL_EVENT = \"subagent:slash:cancel\";\nexport const POLL_INTERVAL_MS = 250;\nexport const MAX_WIDGET_JOBS = 4;\nexport const DEFAULT_SUBAGENT_MAX_DEPTH = 2;\nexport const SUBAGENT_ACTIONS = [\"status\", \"interrupt\", \"resume\", \"steer\", \"stop\", \"append-step\", \"doctor\", \"watchdog.status\", \"watchdog.check\", \"watchdog.recommend-model\", \"schedule\", \"schedule-list\", \"schedule-status\", \"schedule-cancel\"] as const;\nexport const REMOVED_SUBAGENT_ACTIONS = [\"list\", \"get\", \"models\", \"create\", \"update\", \"delete\", \"eject\", \"disable\", \"enable\", \"reset\"] as const;\n\nexport const DEFAULT_FORK_PREAMBLE =\n\t\"You are a delegated subagent running from a fork of the parent session. \" +\n\t\"Treat the inherited conversation as reference-only context, not a live thread to continue. \" +\n\t\"Do not continue or answer prior messages as if they are waiting for a reply. \" +\n\t\"Your sole job is to execute the task below and return a focused result for that task using your tools.\";\n\nfunction normalizeTopLevelParallelValue(value: unknown): number | undefined {\n\tconst parsed = typeof value === \"number\" ? value : typeof value === \"string\" ? Number(value) : NaN;\n\tif (!Number.isInteger(parsed) || parsed < 1) return undefined;\n\treturn parsed;\n}\n\nexport function resolveTopLevelParallelMaxTasks(value: unknown): number {\n\treturn normalizeTopLevelParallelValue(value) ?? MAX_PARALLEL;\n}\n\nexport function resolveTopLevelParallelConcurrency(\n\toverride: unknown,\n\tconfigValue: unknown,\n): number {\n\treturn normalizeTopLevelParallelValue(override)\n\t\t?? normalizeTopLevelParallelValue(configValue)\n\t\t?? MAX_CONCURRENCY;\n}\n\nexport function getAsyncConfigPath(suffix: string): string {\n\treturn path.join(TEMP_ROOT_DIR, `async-cfg-${suffix}.json`);\n}\n\nexport function wrapForkTask(task: string, preamble?: string | false): string {\n\tif (preamble === false) return task;\n\tconst effectivePreamble = preamble ?? DEFAULT_FORK_PREAMBLE;\n\tconst wrappedPrefix = `${effectivePreamble}\\n\\nTask:\\n`;\n\tif (task.startsWith(wrappedPrefix)) return task;\n\treturn `${wrappedPrefix}${task}`;\n}\n\n// ============================================================================\n// Recursion Depth Guard\n// ============================================================================\n\nfunction normalizeNonNegativeInteger(value: unknown): number | undefined {\n\tconst parsed = typeof value === \"number\" ? value : typeof value === \"string\" ? Number(value) : NaN;\n\tif (!Number.isInteger(parsed) || parsed < 0) return undefined;\n\treturn parsed;\n}\n\nexport function normalizeMaxSubagentDepth(value: unknown): number | undefined {\n\treturn normalizeNonNegativeInteger(value);\n}\n\nexport function resolveCurrentMaxSubagentDepth(configMaxDepth?: number): number {\n\treturn normalizeMaxSubagentDepth(process.env.PI_SUBAGENT_MAX_DEPTH)\n\t\t?? normalizeMaxSubagentDepth(configMaxDepth)\n\t\t?? DEFAULT_SUBAGENT_MAX_DEPTH;\n}\n\nexport function resolveChildMaxSubagentDepth(parentMaxDepth: number, agentMaxDepth?: number): number {\n\tconst normalizedParent = normalizeMaxSubagentDepth(parentMaxDepth) ?? DEFAULT_SUBAGENT_MAX_DEPTH;\n\tconst normalizedAgent = normalizeMaxSubagentDepth(agentMaxDepth);\n\treturn normalizedAgent === undefined ? normalizedParent : Math.min(normalizedParent, normalizedAgent);\n}\n\nexport function checkSubagentDepth(configMaxDepth?: number): { blocked: boolean; depth: number; maxDepth: number } {\n\tconst depth = Number(process.env.PI_SUBAGENT_DEPTH ?? \"0\");\n\tconst maxDepth = resolveCurrentMaxSubagentDepth(configMaxDepth);\n\tconst blocked = Number.isFinite(depth) && depth >= maxDepth;\n\treturn { blocked, depth, maxDepth };\n}\n\nexport function getSubagentDepthEnv(maxDepth?: number): Record<string, string> {\n\tconst parentDepth = Number(process.env.PI_SUBAGENT_DEPTH ?? \"0\");\n\tconst nextDepth = Number.isFinite(parentDepth) ? parentDepth + 1 : 1;\n\treturn {\n\t\tPI_SUBAGENT_DEPTH: String(nextDepth),\n\t\tPI_SUBAGENT_MAX_DEPTH: String(normalizeMaxSubagentDepth(maxDepth) ?? resolveCurrentMaxSubagentDepth()),\n\t};\n}\n\nexport function normalizeMaxSubagentSpawnsPerSession(value: unknown): number | undefined {\n\treturn normalizeNonNegativeInteger(value);\n}\n\nexport function resolveMaxSubagentSpawnsPerSession(configMaxSpawns?: number): number | undefined {\n\tconst envMaxSpawns = normalizeMaxSubagentSpawnsPerSession(process.env.PI_SUBAGENT_MAX_SPAWNS_PER_SESSION);\n\tif (envMaxSpawns !== undefined) return envMaxSpawns === 0 ? undefined : envMaxSpawns;\n\tconst configuredMaxSpawns = normalizeMaxSubagentSpawnsPerSession(configMaxSpawns);\n\treturn configuredMaxSpawns === 0 ? undefined : configuredMaxSpawns;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nexport function truncateOutput(\n\toutput: string,\n\tconfig: Required<MaxOutputConfig>,\n\tartifactPath?: string,\n): TruncationResult {\n\tconst lines = output.split(\"\\n\");\n\tconst bytes = Buffer.byteLength(output, \"utf-8\");\n\n\tif (bytes <= config.bytes && lines.length <= config.lines) {\n\t\treturn { text: output, truncated: false };\n\t}\n\n\tlet truncatedLines = lines;\n\tif (lines.length > config.lines) {\n\t\ttruncatedLines = lines.slice(0, config.lines);\n\t}\n\n\tlet result = truncatedLines.join(\"\\n\");\n\tif (Buffer.byteLength(result, \"utf-8\") > config.bytes) {\n\t\tlet low = 0;\n\t\tlet high = result.length;\n\t\twhile (low < high) {\n\t\t\tconst mid = Math.floor((low + high + 1) / 2);\n\t\t\tif (Buffer.byteLength(result.slice(0, mid), \"utf-8\") <= config.bytes) {\n\t\t\t\tlow = mid;\n\t\t\t} else {\n\t\t\t\thigh = mid - 1;\n\t\t\t}\n\t\t}\n\t\tresult = result.slice(0, low);\n\t}\n\n\tconst keptLines = result.split(\"\\n\").length;\n\tconst marker = `[TRUNCATED: showing first ${keptLines} of ${lines.length} lines, ${formatBytes(Buffer.byteLength(result))} of ${formatBytes(bytes)}${artifactPath ? ` - full output at ${artifactPath}` : \"\"}]\\n`;\n\n\treturn {\n\t\ttext: marker + result,\n\t\ttruncated: true,\n\t\toriginalBytes: bytes,\n\t\toriginalLines: lines.length,\n\t\tartifactPath,\n\t};\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/types.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Type definitions for the subagent extension\n */\n\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AccountedRequest } from \"../../../../core/usage-accounting.ts\";\nimport type { Message } from \"@ashx-j/lunr-ai\";\nimport type { FSWatcher } from \"node:fs\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport type { ModelScopeConfig } from \"../runs/shared/model-scope.ts\";\n\n// ============================================================================\n// Basic Types\n// ============================================================================\n\nexport interface MaxOutputConfig {\n\tbytes?: number;\n\tlines?: number;\n}\n\nexport type OutputMode = \"inline\" | \"file-only\";\n\nexport type ChildPermission = \"full\" | \"read-only\";\nexport type ChildTier = \"light\" | \"standard\" | \"heavy\";\n\n/** How the child model was chosen. Captured from requested params before resolution. */\nexport type ModelSelection =\n\t| { kind: \"tier\"; tier: ChildTier }\n\t| { kind: \"model\"; model?: string };\n\nexport interface ChildSpec {\n\tchildId: string;\n\ttask: string;\n\tdescription: string;\n\trequestedPermissions: ChildPermission;\n\teffectivePermissions: ChildPermission;\n\t/** User-requested model when modelSelection.kind is \"model\". Never a tier-resolved runtime id. */\n\tmodel?: string;\n\ttier?: ChildTier;\n\tmodelSelection?: ModelSelection;\n\t/** Explicit thinking level paired with modelSelection.kind === \"model\". */\n\tthinking?: string;\n\tskill?: string | string[] | false;\n\tcwd?: string;\n\toutput?: string | false;\n\toutputMode?: OutputMode;\n\tacceptance?: AcceptanceInput;\n\ttoolBudget?: ToolBudgetConfig;\n\tcount?: number;\n\treads?: string[] | false;\n\tprogress?: boolean;\n\tlabel?: string;\n\tphase?: string;\n\tas?: string;\n\toutputSchema?: JsonSchemaObject;\n\tfanoutAuthorized?: boolean;\n}\n\n/** Internal execution compatibility shape. It is built from ChildSpec and is never user-discovered. */\nexport interface ChildRuntimeConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tmcpDirectTools?: string[];\n\tmodel?: string;\n\tfallbackModels?: string[];\n\tthinking?: string | false;\n\tsystemPromptMode: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tacceptanceRole?: AcceptanceRole;\n\tsystemPrompt: string;\n\tskills?: string[];\n\tskillPath?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\toutput?: string;\n\tmaxSubagentDepth?: number;\n\tcompletionGuard?: boolean;\n\ttoolBudget?: ToolBudgetConfig;\n}\n\nexport function childRowLabel(entry: {\n\tdescription?: string;\n\tlabel?: string;\n\tagent?: string;\n\tchildId?: string;\n}): string {\n\treturn entry.label?.trim() || entry.description?.trim() || entry.agent?.trim() || entry.childId || \"child\";\n}\n\nexport type AcceptanceRole = \"read-only\" | \"writer\";\n\nexport type JsonSchemaObject = Record<string, unknown>;\n\nexport interface ChainOutputMapEntry {\n\ttext: string;\n\tstructured?: unknown;\n\tagent: string;\n\tstepIndex: number;\n}\n\nexport type ChainOutputMap = Record<string, ChainOutputMapEntry>;\n\nexport type WorkflowNodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"paused\" | \"stopped\" | \"detached\";\n\nexport interface WorkflowGraphNode {\n\tid: string;\n\tkind: \"step\" | \"parallel-group\" | \"dynamic-parallel-group\" | \"agent\";\n\tagent?: string;\n\tphase?: string;\n\tlabel: string;\n\tstatus: WorkflowNodeStatus;\n\tflatIndex?: number;\n\tstepIndex?: number;\n\tchildren?: WorkflowGraphNode[];\n\tdynamic?: {\n\t\tsourceOutput: string;\n\t\tsourcePath: string;\n\t\titemName: string;\n\t\tmaxItems?: number;\n\t\tcollectAs?: string;\n\t};\n\titemKey?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tacceptanceStatus?: AcceptanceLedgerStatus;\n\terror?: string;\n}\n\nexport interface WorkflowGraphSnapshot {\n\trunId: string;\n\tmode: \"chain\" | \"parallel\" | \"single\";\n\tphases: Array<{ title: string; nodeIds: string[] }>;\n\tnodes: WorkflowGraphNode[];\n\tcurrentNodeId?: string;\n}\n\nexport interface SavedOutputReference {\n\tpath: string;\n\tbytes: number;\n\tlines: number;\n\tmessage: string;\n}\n\ninterface TruncationResult {\n\ttext: string;\n\ttruncated: boolean;\n\toriginalBytes?: number;\n\toriginalLines?: number;\n\tartifactPath?: string;\n}\n\nexport interface Usage {\n\tunknownRequests?: number;\n\tpartialRequests?: number;\n\tunknownCosts?: number;\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n\tturns: number;\n}\n\nexport interface TurnBudgetConfig {\n\tmaxTurns: number;\n\tgraceTurns?: number;\n}\n\nexport interface ResolvedTurnBudget {\n\tmaxTurns: number;\n\tgraceTurns: number;\n}\n\nexport interface ToolBudgetConfig {\n\tsoft?: number;\n\thard: number;\n\tblock?: string[] | \"*\";\n}\n\nexport interface ResolvedToolBudget {\n\tsoft?: number;\n\thard: number;\n\tblock: string[] | \"*\";\n}\n\nexport type ToolBudgetOutcome = \"within-budget\" | \"soft-reached\" | \"hard-blocked\";\n\nexport interface ToolBudgetState extends ResolvedToolBudget {\n\toutcome: ToolBudgetOutcome;\n\ttoolCount: number;\n\tsoftReachedAt?: number;\n\thardReachedAt?: number;\n\tblockedTool?: string;\n}\n\nexport type TurnBudgetOutcome = \"within-budget\" | \"wrap-up-requested\" | \"exceeded\";\n\nexport interface TurnBudgetState extends ResolvedTurnBudget {\n\toutcome: TurnBudgetOutcome;\n\tturnCount: number;\n\twrapUpRequestedAtTurn?: number;\n\texceededAtTurn?: number;\n}\n\nexport interface TokenUsage {\n\t/** Input includes cache reads and writes. */\n\tcacheRead?: number;\n\tcacheWrite?: number;\n\tinput: number;\n\toutput: number;\n\ttotal: number;\n}\n\nexport type ActivityState = \"active_long_running\" | \"needs_attention\";\nexport type ControlEventType = \"active_long_running\" | \"needs_attention\";\nexport type ControlNotificationChannel = \"event\" | \"async\" | \"intercom\";\n\nexport interface ControlConfig {\n\tenabled?: boolean;\n\tneedsAttentionAfterMs?: number;\n\tactiveNoticeAfterMs?: number;\n\tactiveNoticeAfterTurns?: number;\n\tactiveNoticeAfterTokens?: number;\n\tfailedToolAttemptsBeforeAttention?: number;\n\tnotifyOn?: ControlEventType[];\n\tnotifyChannels?: ControlNotificationChannel[];\n}\n\nexport interface ResolvedControlConfig {\n\tenabled: boolean;\n\tneedsAttentionAfterMs: number;\n\tactiveNoticeAfterMs: number;\n\tactiveNoticeAfterTurns?: number;\n\tactiveNoticeAfterTokens?: number;\n\tfailedToolAttemptsBeforeAttention: number;\n\tnotifyOn: ControlEventType[];\n\tnotifyChannels: ControlNotificationChannel[];\n}\n\n/**\n * Smart completion batching for async-completion notifications. Successful\n * sibling completions are held briefly so they arrive as one grouped message;\n * failure and attention signals bypass grouping and always fire immediately.\n */\nexport interface CompletionBatchConfig {\n\tenabled?: boolean;\n\t/** Idle window after each arrival; resets on every new item. */\n\tdebounceMs?: number;\n\t/** Hard cap measured from the first item in a group. */\n\tmaxWaitMs?: number;\n\t/** Shorter idle window for straggler groups. */\n\tstragglerDebounceMs?: number;\n\t/** Shorter hard cap for straggler groups. */\n\tstragglerMaxWaitMs?: number;\n\t/** Arrivals within this window after an emit join a straggler group. */\n\tstragglerWindowMs?: number;\n}\n\nexport interface WaitToolConfigObject {\n\tenabled?: boolean;\n}\n\nexport type WaitToolConfig = boolean | WaitToolConfigObject;\n\nexport interface ControlEvent {\n\ttype: ControlEventType;\n\tfrom?: ActivityState;\n\tto: ActivityState;\n\tts: number;\n\tagent: string;\n\tindex?: number;\n\trunId: string;\n\tnestedRunId?: string;\n\tnestingPath?: NestedRunAddress[\"path\"];\n\tmessage: string;\n\treason?: \"idle\" | \"completion_guard\" | \"active_long_running\" | \"tool_failures\" | \"time_threshold\" | \"turn_threshold\" | \"token_threshold\";\n\tturns?: number;\n\ttokens?: number;\n\ttoolCount?: number;\n\tcurrentTool?: string;\n\tcurrentToolDurationMs?: number;\n\tcurrentPath?: string;\n\telapsedMs?: number;\n\trecentFailureSummary?: string;\n}\n\nexport type SubagentResultStatus = \"completed\" | \"failed\" | \"paused\" | \"stopped\" | \"detached\";\nexport type SubagentRunMode = \"single\" | \"parallel\" | \"chain\";\nexport const SUBAGENT_LIFECYCLE_ARTIFACT_VERSION = 4;\nexport type SubagentLifecycleArtifactVersion = typeof SUBAGENT_LIFECYCLE_ARTIFACT_VERSION;\nexport const UNSUPPORTED_SUBAGENT_LIFECYCLE_MESSAGE =\n\t\"This subagent run uses an unsupported lifecycle format. Named agent types cannot be resumed. Launch a new prompt-driven child instead.\";\n\nexport function isSupportedSubagentLifecycleVersion(version: unknown): boolean {\n\treturn version === SUBAGENT_LIFECYCLE_ARTIFACT_VERSION;\n}\n\nexport type SteeringActionState = \"delivered\" | \"scheduled\" | \"pending\" | \"partial\" | \"recovered\" | \"failed\";\nexport type SteeringTargetState = \"scheduled\" | \"routed\" | \"delivered\" | \"late\" | \"failed\" | \"recovered\";\n\nexport interface SteeringTargetStatus {\n\tindex: number;\n\tstate: SteeringTargetState;\n\troutedAt?: number;\n\tdeliveredAt?: number;\n\tlateDeliveredAt?: number;\n\tfailedAt?: number;\n\trecoveredAt?: number;\n\treason?: string;\n\treplacementRunId?: string;\n}\n\nexport interface SteeringRequestStatus {\n\tid: string;\n\trequestedAt: number;\n\tsource?: string;\n\tmessagePreview: string;\n\ttargets: SteeringTargetStatus[];\n}\n\nexport interface SteeringStatus {\n\trequested: number;\n\tscheduled: number;\n\tpending: number;\n\tdelivered: number;\n\tfailed: number;\n\trecovered: number;\n\tlastRequestedAt?: number;\n\tlastDeliveredAt?: number;\n\trecent: SteeringRequestStatus[];\n}\n\nexport interface SteerActionTarget {\n\tindex: number;\n\tstate: SteeringTargetState;\n\tdeliveredAt?: number;\n\tlateDeliveredAt?: number;\n\treason?: string;\n\treplacementRunId?: string;\n}\n\nexport interface SteerActionResult {\n\trequestId: string;\n\tstate: SteeringActionState;\n\tsourceRunId: string;\n\treplacementRunId?: string;\n\ttargets: SteerActionTarget[];\n}\n\nexport interface SteeringNotice {\n\ttype: \"subagent.steering.notice\";\n\tts: number;\n\trunId: string;\n\trequestId: string;\n\tstate: \"failed\" | \"partial\" | \"recovered\";\n\tmessage: string;\n\tcurrentSessionId?: string;\n}\n\nexport interface SteeringRecoveryDescriptor {\n\tversion: 4;\n\tlifecycleArtifactVersion?: SubagentLifecycleArtifactVersion;\n\tsourceRunId: string;\n\tchildId: string;\n\tdescription: string;\n\tpermissions: ChildPermission;\n\tagent: string;\n\tsessionFile?: string;\n\tcwd: string;\n\tmodel?: string;\n\ttier?: ChildTier;\n\tthinking?: string;\n\tmodelSelection?: ModelSelection;\n\tskills?: string[];\n\toutputPath?: string;\n\toutputMode: \"inline\" | \"file-only\";\n\tacceptance?: ResolvedAcceptanceConfig;\n\tcontrolConfig?: ResolvedControlConfig;\n\tabsoluteDeadlineAt?: number;\n\tinitialTurnBudget?: ResolvedTurnBudget;\n\tinitialToolBudget?: ResolvedToolBudget;\n\tmaxSubagentDepth: number;\n\tmaxOutput?: MaxOutputConfig;\n\tshare: boolean;\n\tsessionDir?: string;\n\tartifactsDir?: string;\n\tartifactConfig?: ArtifactConfig;\n}\n\nexport type PublicNestedStepSummary = Pick<\n\tNestedStepSummary,\n\t\"agent\" | \"status\" | \"sessionFile\" | \"transcriptPath\" | \"transcriptError\" | \"activityState\" | \"lastActivityAt\" | \"currentTool\" | \"currentToolStartedAt\" | \"currentPath\" | \"turnCount\" | \"toolCount\" | \"toolBudget\" | \"toolBudgetBlocked\" | \"startedAt\" | \"endedAt\" | \"error\" | \"timedOut\" | \"stopped\"\n> & {\n\tchildren?: PublicNestedRunSummary[];\n};\n\nexport type CostSummary = {\n\tinputTokens: number;\n\toutputTokens: number;\n\tcostUsd: number;\n};\n\nexport type PublicNestedRunSummary = Pick<\n\tNestedRunSummary,\n\t\"id\" | \"parentRunId\" | \"parentStepIndex\" | \"parentAgent\" | \"depth\" | \"path\" | \"asyncDir\" | \"sessionId\" | \"sessionFile\" | \"intercomTarget\" | \"ownerIntercomTarget\" | \"leafIntercomTarget\" | \"ownerState\" | \"mode\" | \"state\" | \"agent\" | \"agents\" | \"currentStep\" | \"chainStepCount\" | \"parallelGroups\" | \"activityState\" | \"lastActivityAt\" | \"currentTool\" | \"currentToolStartedAt\" | \"currentPath\" | \"turnCount\" | \"toolCount\" | \"toolBudget\" | \"toolBudgetBlocked\" | \"totalTokens\" | \"totalCost\" | \"startedAt\" | \"endedAt\" | \"lastUpdate\" | \"error\" | \"timeoutMs\" | \"deadlineAt\" | \"timedOut\" | \"stopped\" | \"turnBudget\" | \"turnBudgetExceeded\" | \"wrapUpRequested\"\n> & {\n\tsteps?: PublicNestedStepSummary[];\n\tchildren?: PublicNestedRunSummary[];\n};\n\nexport interface SubagentResultIntercomChild {\n\tagent: string;\n\tstatus: SubagentResultStatus;\n\tsummary: string;\n\tindex?: number;\n\tartifactPath?: string;\n\tsessionPath?: string;\n\tintercomTarget?: string;\n\tchildren?: PublicNestedRunSummary[];\n}\n\nexport interface SubagentResultIntercomPayload {\n\townerNotificationSessionId?: string;\n\tto: string;\n\tmessage: string;\n\trequestId?: string;\n\trunId: string;\n\tmode: SubagentRunMode;\n\tstatus: SubagentResultStatus;\n\tsummary: string;\n\tsource: \"foreground\" | \"async\";\n\tchildren: SubagentResultIntercomChild[];\n\tasyncId?: string;\n\tasyncDir?: string;\n\tchainSteps?: number;\n\tagent?: string;\n\tindex?: number;\n\tartifactPath?: string;\n\tsessionPath?: string;\n}\n\n// ============================================================================\n// Progress Tracking\n// ============================================================================\n\nexport interface ChildWatchdogProgress {\n\tphase: \"idle\" | \"reviewing\" | \"autofollow\" | \"settling\" | \"stale\" | \"failed\";\n\tseq: number;\n\tlastUpdate: number;\n\tfollowUpPending: boolean;\n\treason?: string;\n\ttimedOut?: boolean;\n}\n\nexport interface AgentProgress {\n\tindex: number;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: ChildPermission;\n\tagent: string;\n\tstatus: \"pending\" | \"running\" | \"completed\" | \"failed\" | \"detached\";\n\tactivityState?: ActivityState;\n\ttask: string;\n\tskills?: string[];\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: ModelSelection;\n\tthinkingText?: string;\n\trecentTools: Array<{ tool: string; args: string; endMs: number }>;\n\trecentOutput: string[];\n\ttoolCount: number;\n\tturnCount?: number;\n\ttokens: number;\n\tdurationMs: number;\n\terror?: string;\n\tfailedTool?: string;\n\twatchdog?: ChildWatchdogProgress;\n}\n\nexport interface ToolCallSummary {\n\ttext: string;\n\texpandedText: string;\n}\n\ninterface ProgressSummary {\n\ttoolCount: number;\n\ttokens: number;\n\tdurationMs: number;\n}\n\n// ============================================================================\n// Results\n// ============================================================================\n\nexport interface ModelAttempt {\n\tmodel: string;\n\tsuccess: boolean;\n\texitCode?: number | null;\n\terror?: string;\n\tusage?: Usage;\n}\n\nexport type AcceptanceLevel = \"auto\" | \"none\" | \"attested\" | \"checked\" | \"verified\" | \"reviewed\";\n\nexport type AcceptanceEvidenceKind =\n\t| \"changed-files\"\n\t| \"tests-added\"\n\t| \"commands-run\"\n\t| \"validation-output\"\n\t| \"residual-risks\"\n\t| \"no-staged-files\"\n\t| \"diff-summary\"\n\t| \"review-findings\"\n\t| \"manual-notes\";\n\nexport interface AcceptanceGate {\n\tid: string;\n\tmust: string;\n\tevidence?: AcceptanceEvidenceKind[];\n\tseverity?: \"required\" | \"recommended\";\n}\n\nexport interface AcceptanceVerifyCommand {\n\tid: string;\n\tcommand: string;\n\ttimeoutMs?: number;\n\tcwd?: string;\n\tenv?: Record<string, string>;\n\tallowFailure?: boolean;\n}\n\nexport interface AcceptanceReviewGate {\n\tagent?: string;\n\tfocus?: string;\n\trequired?: boolean;\n}\n\nexport interface AcceptanceConfig {\n\tlevel?: AcceptanceLevel;\n\tcriteria?: Array<string | AcceptanceGate>;\n\tevidence?: AcceptanceEvidenceKind[];\n\tverify?: AcceptanceVerifyCommand[];\n\treview?: AcceptanceReviewGate | false;\n\tstopRules?: string[];\n\treason?: string;\n}\n\n/** Bare \"none\" is not accepted: use { level: \"none\", reason: \"...\" }; false remains a deprecated shorthand. */\nexport type AcceptanceInput = Exclude<AcceptanceLevel, \"none\"> | false | AcceptanceConfig;\n\nexport interface ResolvedAcceptanceGate extends AcceptanceGate {\n\tid: string;\n\tmust: string;\n\tevidence: AcceptanceEvidenceKind[];\n\tseverity: \"required\" | \"recommended\";\n}\n\nexport interface ResolvedAcceptanceConfig {\n\tlevel: Exclude<AcceptanceLevel, \"auto\">;\n\texplicit: boolean;\n\tinferredReason: string[];\n\tcriteria: ResolvedAcceptanceGate[];\n\tevidence: AcceptanceEvidenceKind[];\n\tverify: AcceptanceVerifyCommand[];\n\treview?: AcceptanceReviewGate | false;\n\tstopRules: string[];\n\treason?: string;\n}\n\nexport interface AcceptanceReport {\n\tcriteriaSatisfied?: Array<{\n\t\tid?: string;\n\t\tstatus: \"satisfied\" | \"not-satisfied\" | \"not-applicable\";\n\t\tevidence: string;\n\t}>;\n\tchangedFiles?: string[];\n\ttestsAddedOrUpdated?: string[];\n\tcommandsRun?: Array<{\n\t\tcommand: string;\n\t\tresult: \"passed\" | \"failed\" | \"not-run\";\n\t\tsummary: string;\n\t}>;\n\tvalidationOutput?: string[];\n\tresidualRisks?: string[];\n\tnoStagedFiles?: boolean;\n\tdiffSummary?: string;\n\treviewFindings?: string[];\n\tmanualNotes?: string;\n\tnotes?: string;\n}\n\nexport type AcceptanceRuntimeCheckStatus = \"passed\" | \"failed\" | \"not-applicable\";\n\nexport interface AcceptanceRuntimeCheck {\n\tid: string;\n\tstatus: AcceptanceRuntimeCheckStatus;\n\tmessage: string;\n}\n\nexport interface AcceptanceVerifyResult {\n\tid: string;\n\tcommand: string;\n\tcwd?: string;\n\texitCode: number | null;\n\tstatus: \"passed\" | \"failed\" | \"timed-out\" | \"allowed-failure\";\n\tstdout?: string;\n\tstderr?: string;\n\tdurationMs: number;\n}\n\nexport interface AcceptanceReviewResult {\n\tstatus: \"no-blockers\" | \"blockers\" | \"needs-parent-decision\";\n\tfindings: Array<{\n\t\tseverity: \"blocker\" | \"non-blocking\";\n\t\tfile?: string;\n\t\tissue: string;\n\t\trationale: string;\n\t}>;\n}\n\nexport type AcceptanceLedgerStatus =\n\t| \"pending\"\n\t| \"not-required\"\n\t| \"claimed\"\n\t| \"attested\"\n\t| \"checked\"\n\t| \"verified\"\n\t| \"reviewed\"\n\t| \"accepted\"\n\t| \"rejected\";\n\nexport interface AcceptanceLedger {\n\tstatus: AcceptanceLedgerStatus;\n\texplicit: boolean;\n\teffectiveAcceptance: ResolvedAcceptanceConfig;\n\tinferredReason: string[];\n\tcriteria: ResolvedAcceptanceGate[];\n\tchildReport?: AcceptanceReport;\n\tchildReportParseError?: string;\n\truntimeChecks: AcceptanceRuntimeCheck[];\n\tverifyRuns: AcceptanceVerifyResult[];\n\treviewResult?: AcceptanceReviewResult;\n\tparentDecision?: {\n\t\tstatus: \"accepted\" | \"rejected\";\n\t\tat: string;\n\t\treason?: string;\n\t};\n}\n\nexport interface ProtocolOutputLimit {\n\tcode: \"protocol_output_limit\";\n\tstream: \"stdout\" | \"stderr\";\n\tlimitBytes: number;\n\tobservedBytes: number;\n\tdiagnosticPrefix: string;\n\tdiagnosticTail: string;\n}\n\nexport interface SingleResult {\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: ChildPermission;\n\tagent: string;\n\ttask: string;\n\texitCode: number;\n\tdetached?: boolean;\n\tdetachedReason?: string;\n\tinterrupted?: boolean;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\tmessages?: Message[];\n\tusage: Usage;\n\t/** Durable request receipts deduplicate fallback, completion, wait, and resume. */\n\tusageRequests?: AccountedRequest[];\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: ModelSelection;\n\tattemptedModels?: string[];\n\tmodelAttempts?: ModelAttempt[];\n\tcontrolEvents?: ControlEvent[];\n\terror?: string;\n\tprotocolError?: ProtocolOutputLimit;\n\tsessionFile?: string;\n\tskills?: string[];\n\tskillsWarning?: string;\n\tprogress?: AgentProgress;\n\tprogressSummary?: ProgressSummary;\n\ttoolCalls?: ToolCallSummary[];\n\tartifactPaths?: ArtifactPaths;\n\ttruncation?: TruncationResult;\n\tfinalOutput?: string;\n\toutputMode?: OutputMode;\n\tsavedOutputPath?: string;\n\toutputReference?: SavedOutputReference;\n\toutputSaveError?: string;\n\tstructuredOutput?: unknown;\n\tstructuredOutputPath?: string;\n\tstructuredOutputSchemaPath?: string;\n\tacceptance?: AcceptanceLedger;\n\ttranscriptPath?: string;\n\ttranscriptError?: string;\n\tchildren?: NestedRunSummary[];\n\twatchdog?: ChildWatchdogProgress;\n}\n\nexport interface Details {\n\tmode: SubagentRunMode | \"management\";\n\trunId?: string;\n\tcontext?: \"fresh\" | \"fork\";\n\tresults: SingleResult[];\n\tcontrolEvents?: ControlEvent[];\n\tsteering?: SteerActionResult;\n\tasyncId?: string;\n\tasyncDir?: string;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: ResolvedTurnBudget;\n\ttoolBudget?: ResolvedToolBudget;\n\tprogress?: AgentProgress[];\n\tprogressSummary?: ProgressSummary;\n\tartifacts?: {\n\t\tdir: string;\n\t\tfiles: ArtifactPaths[];\n\t};\n\ttruncation?: {\n\t\ttruncated: boolean;\n\t\toriginalBytes?: number;\n\t\toriginalLines?: number;\n\t\tartifactPath?: string;\n\t};\n\t// Chain metadata for observability\n\tchainAgents?: string[]; // deprecated: child descriptions in order\n\tchainChildren?: Array<{ childId: string; description: string; permissions: ChildPermission }>;\n\ttotalSteps?: number; // Total steps in chain\n\tcurrentStepIndex?: number; // 0-indexed current step (for running chains)\n\tworkflowGraph?: WorkflowGraphSnapshot;\n\toutputs?: ChainOutputMap;\n\t// Aggregated child usage across all agents in the run\n\ttotalChildUsage?: Usage;\n\t// Aggregated cost across all agents in the run\n\ttotalCost?: CostSummary;\n\tquestionId?: string;\n\tstate?: string;\n\t/** Resolved UI label for management actions, persisted with the tool result. */\n\tdisplayTitle?: string;\n\tcommunication?: import(\"../intercom/communication.ts\").SubagentCommunication;\n\tanswered?: boolean;\n\tdelivered?: boolean;\n}\n\n// ============================================================================\n// Artifacts\n// ============================================================================\n\nexport interface ArtifactPaths {\n\tinputPath: string;\n\toutputPath: string;\n\tjsonlPath: string;\n\ttranscriptPath: string;\n\tmetadataPath: string;\n}\n\nexport interface ArtifactConfig {\n\tenabled: boolean;\n\tincludeInput: boolean;\n\tincludeOutput: boolean;\n\tincludeJsonl: boolean;\n\tincludeTranscript?: boolean;\n\tincludeMetadata: boolean;\n\tcleanupDays: number;\n}\n\n// ============================================================================\n// Async Execution\n// ============================================================================\n\nexport interface AsyncParallelGroupStatus {\n\tstart: number;\n\tcount: number;\n\tstepIndex: number;\n}\n\nexport type NestedRunState = \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\nexport type NestedOwnerState = \"live\" | \"gone\" | \"unknown\";\n\nexport interface NestedRunAddress {\n\tid: string;\n\tparentRunId: string;\n\tparentStepIndex?: number;\n\tparentAgent?: string;\n\tdepth: number;\n\tpath: Array<{ runId: string; stepIndex?: number; agent?: string }>;\n}\n\nexport interface NestedStepSummary {\n\tagent: string;\n\tstatus: \"pending\" | \"running\" | \"complete\" | \"completed\" | \"failed\" | \"paused\" | \"stopped\";\n\tsessionFile?: string;\n\ttranscriptPath?: string;\n\ttranscriptError?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tstartedAt?: number;\n\tendedAt?: number;\n\terror?: string;\n\twatchdog?: ChildWatchdogProgress;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\tchildren?: NestedRunSummary[];\n}\n\nexport interface NestedRunSummary extends NestedRunAddress {\n\tasyncDir?: string;\n\tpid?: number;\n\tsessionId?: string;\n\tsessionFile?: string;\n\tintercomTarget?: string;\n\townerIntercomTarget?: string;\n\tleafIntercomTarget?: string;\n\townerState?: NestedOwnerState;\n\tcontrolInbox?: string;\n\tcapabilityToken?: string;\n\tmode?: SubagentRunMode;\n\tstate: NestedRunState;\n\tagent?: string;\n\tagents?: string[];\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tsteps?: NestedStepSummary[];\n\tchildren?: NestedRunSummary[];\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\ttotalTokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tlastUpdate?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\terror?: string;\n}\n\nexport interface NestedRouteInfo {\n\trootRunId: string;\n\teventSink: string;\n\tcontrolInbox: string;\n\tcapabilityToken: string;\n}\n\nexport interface AsyncStartedEvent {\n\tlifecycleArtifactVersion?: SubagentLifecycleArtifactVersion;\n\tid?: string;\n\tasyncDir?: string;\n\tpid?: number;\n\tsessionId?: string;\n\tmode?: SubagentRunMode;\n\tagent?: string;\n\tagents?: string[];\n\t/** Truncated first child task retained for backwards compatibility. */\n\ttask?: string;\n\t/** Workflow-level caller task, falling back to the first child task. */\n\tgoal?: string;\n\tchain?: string[];\n\tchainStepCount?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tworkflowGraph?: WorkflowGraphSnapshot;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\tturnBudget?: TurnBudgetState;\n\tnestedRoute?: NestedRouteInfo;\n}\n\nexport interface AsyncStatus {\n\tlifecycleArtifactVersion?: SubagentLifecycleArtifactVersion;\n\trunId: string;\n\tsessionId?: string;\n\tmode: SubagentRunMode;\n\tisNested?: boolean;\n\tstate: \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\n\terror?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tstartedAt: number;\n\tendedAt?: number;\n\tlastUpdate?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\tpid?: number;\n\tcwd?: string;\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tpendingAppends?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tworkflowGraph?: WorkflowGraphSnapshot;\n\tsteps?: Array<{\n\t\tchildId?: string;\n\t\tdescription?: string;\n\t\tpermissions?: ChildPermission;\n\t\tagent: string;\n\t\tphase?: string;\n\t\tlabel?: string;\n\t\toutputName?: string;\n\t\tstructured?: boolean;\n\t\tstatus: \"pending\" | \"running\" | \"complete\" | \"completed\" | \"failed\" | \"paused\" | \"stopped\";\n\t\tchildren?: NestedRunSummary[];\n\t\tsessionFile?: string;\n\t\ttranscriptPath?: string;\n\t\ttranscriptError?: string;\n\t\tactivityState?: ActivityState;\n\t\tlastActivityAt?: number;\n\t\tcurrentTool?: string;\n\t\tcurrentToolArgs?: string;\n\t\tcurrentToolStartedAt?: number;\n\t\tcurrentPath?: string;\n\t\trecentTools?: Array<{ tool: string; args: string; endMs: number }>;\n\t\trecentOutput?: string[];\n\t\tturnCount?: number;\n\t\ttoolCount?: number;\n\t\tstartedAt?: number;\n\t\tendedAt?: number;\n\t\tdurationMs?: number;\n\t\texitCode?: number | null;\n\t\ttimedOut?: boolean;\n\t\tstopped?: boolean;\n\t\tturnBudget?: TurnBudgetState;\n\t\tturnBudgetExceeded?: boolean;\n\t\twrapUpRequested?: boolean;\n\t\ttoolBudget?: ToolBudgetState;\n\t\ttoolBudgetBlocked?: boolean;\n\t\ttokens?: TokenUsage;\n\t\tskills?: string[];\n\t\tmodel?: string;\n\t\tthinking?: string;\n\t\tmodelSelection?: ModelSelection;\n\t\tattemptedModels?: string[];\n\t\tmodelAttempts?: ModelAttempt[];\n\t\ttotalCost?: CostSummary;\n\t\tsteering?: SteeringStatus;\n\t\terror?: string;\n\t\tstructuredOutput?: unknown;\n\t\tstructuredOutputPath?: string;\n\t\tstructuredOutputSchemaPath?: string;\n\t\tacceptance?: AcceptanceLedger;\n\t\twatchdog?: ChildWatchdogProgress;\n\t}>;\n\tsessionDir?: string;\n\toutputFile?: string;\n\ttotalTokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tsessionFile?: string;\n\toutputs?: ChainOutputMap;\n}\n\nexport type AsyncJobStep = NonNullable<AsyncStatus[\"steps\"]>[number] & {\n\tindex?: number;\n};\n\nexport interface AsyncJobState {\n\tasyncId: string;\n\tasyncDir: string;\n\tstatus: \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\n\tpid?: number;\n\tsessionId?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tmode?: SubagentRunMode;\n\tagents?: string[];\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tsteps?: AsyncJobStep[];\n\tstepsTotal?: number;\n\trunningSteps?: number;\n\tcompletedSteps?: number;\n\thasParallelGroups?: boolean;\n\tactiveParallelGroup?: boolean;\n\tstartedAt?: number;\n\tupdatedAt?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\ttoolBudget?: ToolBudgetState;\n\ttoolBudgetBlocked?: boolean;\n\tsessionDir?: string;\n\toutputFile?: string;\n\ttotalTokens?: TokenUsage;\n\tsessionFile?: string;\n\tcontrolEventCursor?: number;\n\tnestedRoute?: NestedRouteInfo;\n\tnestedChildren?: NestedRunSummary[];\n}\n\nexport interface ForegroundResumeChild {\n\tagent: string;\n\tindex: number;\n\tsessionFile?: string;\n\tstatus: SubagentResultStatus;\n\texitCode?: number;\n\terror?: string;\n\tfinalOutput?: string;\n\toutputMode?: OutputMode;\n\tsavedOutputPath?: string;\n\toutputSaveError?: string;\n\tartifactPaths?: ArtifactPaths;\n\ttranscriptPath?: string;\n\ttranscriptError?: string;\n\tdetachedReason?: string;\n\tacceptance?: AcceptanceLedger;\n\tupdatedAt?: number;\n}\n\nexport interface ForegroundResumeRun {\n\trunId: string;\n\tmode: SubagentRunMode;\n\tcwd: string;\n\t/** Originating parent session. Detached exits can outlive the active session. */\n\tsessionId?: string;\n\tupdatedAt: number;\n\tchildren: ForegroundResumeChild[];\n}\n\nexport interface SubagentState {\n\tbaseCwd: string;\n\tcurrentSessionId: string | null;\n\t/** Bumps on session_start / session replacement so owned supervisor questions fail closed. */\n\tsessionGeneration?: number;\n\t/** Live foreground `subagent` tool calls. Caps same-turn overlap. */\n\tforegroundSubagentInFlight?: number;\n\tsubagentSpawns?: { sessionId: string | null; count: number };\n\tasyncJobs: Map<string, AsyncJobState>;\n\t/** Current-session active and recent async runs for the native fleet inspector. */\n\tfleetJobs?: Map<string, AsyncJobState>;\n\tforegroundRuns?: Map<string, ForegroundResumeRun>;\n\tforegroundControls: Map<string, {\n\t\trunId: string;\n\t\tmode: SubagentRunMode;\n\t\tstartedAt: number;\n\t\tupdatedAt: number;\n\t\tcurrentAgent?: string;\n\t\tcurrentChildId?: string;\n\t\tcurrentIndex?: number;\n\t\tcurrentActivityState?: ActivityState;\n\t\tlastActivityAt?: number;\n\t\tcurrentTool?: string;\n\t\tcurrentToolStartedAt?: number;\n\t\tcurrentPath?: string;\n\t\tturnCount?: number;\n\t\ttokens?: number;\n\t\ttoolCount?: number;\n\t\tnestedRoute?: NestedRouteInfo;\n\t\tnestedChildren?: NestedRunSummary[];\n\t\tinterrupt?: () => boolean;\n\t}>;\n\tlastForegroundControlId: string | null;\n\tpendingForegroundControlNotices?: Map<string, ReturnType<typeof setTimeout>>;\n\tcleanupTimers: Map<string, ReturnType<typeof setTimeout>>;\n\tlastUiContext: ExtensionContext | null;\n\tpoller: NodeJS.Timeout | null;\n\tcompletionSeen: Map<string, number>;\n\twatcher: FSWatcher | null;\n\twatcherRestartTimer: ReturnType<typeof setTimeout> | null;\n\tresultFileCoalescer: {\n\t\tschedule(file: string, delayMs?: number): boolean;\n\t\tclear(): void;\n\t};\n}\n\n// ============================================================================\n// Display\n// ============================================================================\n\nexport type DisplayItem = \n\t| { type: \"text\"; text: string } \n\t| { type: \"tool\"; name: string; args: Record<string, unknown> };\n\n// ============================================================================\n// Error Handling\n// ============================================================================\n\nexport interface ErrorInfo {\n\thasError: boolean;\n\texitCode?: number;\n\terrorType?: string;\n\tdetails?: string;\n}\n\nexport interface IntercomEventBus {\n\ton(channel: string, handler: (data: unknown) => void): () => void;\n\temit(channel: string, data: unknown): void;\n}\n\nexport const INTERCOM_DETACH_REQUEST_EVENT = \"pi-intercom:detach-request\";\nexport const INTERCOM_DETACH_RESPONSE_EVENT = \"pi-intercom:detach-response\";\nexport const SUBAGENT_ASYNC_STARTED_EVENT = \"subagent:async-started\";\nexport const SUBAGENT_ASYNC_COMPLETE_EVENT = \"subagent:async-complete\";\nexport const SUBAGENT_FOREGROUND_COMPLETE_EVENT = \"subagent:foreground-complete\";\nexport const SUBAGENT_CONTROL_EVENT = \"subagent:control-event\";\nexport const SUBAGENT_CONTROL_INTERCOM_EVENT = \"subagent:control-intercom\";\nexport const SUBAGENT_STEERING_NOTICE_EVENT = \"subagent:steering-notice\";\nexport const SUBAGENT_RESULT_INTERCOM_EVENT = \"subagent:result-intercom\";\nexport const SUBAGENT_RESULT_INTERCOM_DELIVERY_EVENT = \"subagent:result-intercom-delivery\";\n\n// ============================================================================\n// Execution Options\n// ============================================================================\n\nexport interface RunSyncOptions {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\tcwd?: string;\n\tsignal?: AbortSignal;\n\tinterruptSignal?: AbortSignal;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\ttoolBudget?: ResolvedToolBudget;\n\tallowIntercomDetach?: boolean;\n\tcommunicationEnabled?: boolean;\n\tintercomEvents?: IntercomEventBus;\n\tonUpdate?: (r: import(\"@ashx-j/lunr-agent\").AgentToolResult<Details>) => void;\n\tonControlEvent?: (event: ControlEvent) => void;\n\tonDetachedExit?: (result: SingleResult) => void;\n\tcontrolConfig?: ResolvedControlConfig;\n\tintercomSessionName?: string;\n\torchestratorIntercomTarget?: string;\n\tmaxOutput?: MaxOutputConfig;\n\tartifactsDir?: string;\n\tartifactConfig?: ArtifactConfig;\n\trunId: string;\n\tindex?: number;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tshare?: boolean;\n\toutputPath?: string;\n\toutputMode?: OutputMode;\n\tmaxSubagentDepth?: number;\n\t/** Effective parent wait-tool setting propagated to the child runtime. */\n\twaitToolEnabled?: boolean;\n\tnestedRoute?: NestedRouteInfo;\n\t/** Override the agent's default model (format: \"provider/id\" or just \"id\") */\n\tmodelOverride?: string;\n\t/** Override the agent's default thinking level for this run */\n\tthinkingOverride?: string | false;\n\t/** Registry models available for heuristic bare-model resolution */\n\tavailableModels?: Array<{ provider: string; id: string; fullId: string }>;\n\t/** Current parent-session provider to prefer for ambiguous bare model ids */\n\tpreferredModelProvider?: string;\n\t/** Optional subagent model-scope enforcement for fallback candidates */\n\tmodelScope?: ModelScopeConfig;\n\t/** Skills to make available (overrides agent default if provided) */\n\tskills?: string[];\n\tstructuredOutput?: {\n\t\tschema: JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tacceptance?: AcceptanceInput;\n\tacceptanceContext?: {\n\t\tmode?: SubagentRunMode;\n\t\tasync?: boolean;\n\t\tdynamic?: boolean;\n\t\tdynamicGroup?: boolean;\n\t};\n}\n\nexport type IntercomBridgeMode = \"off\" | \"fork-only\" | \"always\";\n\nexport interface IntercomBridgeConfig {\n\tmode?: IntercomBridgeMode;\n\tinstructionFile?: string;\n}\n\ninterface TopLevelParallelConfig {\n\tmaxTasks?: number;\n\tconcurrency?: number;\n}\n\ninterface ExtensionChainConfig {\n\tdynamicFanout?: {\n\t\tmaxItems?: number;\n\t};\n}\n\nexport interface ProactiveSkillSubagentsConfig {\n\tenabled?: boolean;\n\tminReferences?: number;\n\tmaxRecommendations?: number;\n\tpreferredAgent?: string;\n}\n\nexport type ToolDescriptionMode = \"full\" | \"compact\" | \"custom\";\n\nexport interface ScheduledRunsConfig {\n\tenabled?: boolean;\n\tmaxLatenessMs?: number;\n\tmaxPending?: number;\n}\n\nexport interface ExtensionConfig {\n\t/** @deprecated Launches now default to async regardless of this legacy value. */\n\tasyncByDefault?: boolean;\n\t/** Show the above-editor async runs widget. Defaults to true. */\n\tasyncWidget?: boolean;\n\t/** Tool description variant registered for the parent-facing subagent tool. Defaults to full. */\n\ttoolDescriptionMode?: ToolDescriptionMode;\n\t/** @deprecated Omitted async already means async; explicit async:false and clarify:true stay foreground. */\n\tforceTopLevelAsync?: boolean;\n\twaitTool?: WaitToolConfig;\n\tdefaultSessionDir?: string;\n\tsingleRunOutputBaseDir?: string;\n\tmaxSubagentDepth?: number;\n\t/** Optional cumulative session cap. Unset or 0 means unlimited. */\n\tmaxSubagentSpawnsPerSession?: number;\n\t/** Global cap on simultaneously-running subagent tasks within a single run. Unset means unlimited. */\n\tglobalConcurrencyLimit?: number;\n\tcontrol?: ControlConfig;\n\tcompletionBatch?: CompletionBatchConfig;\n\tturnBudget?: TurnBudgetConfig;\n\ttoolBudget?: ToolBudgetConfig;\n\tparallel?: TopLevelParallelConfig;\n\tchain?: ExtensionChainConfig;\n\tworktreeSetupHook?: string;\n\tworktreeSetupHookTimeoutMs?: number;\n\tworktreeBaseDir?: string;\n\tintercomBridge?: IntercomBridgeConfig;\n\tproactiveSkillSubagents?: ProactiveSkillSubagentsConfig | false;\n\tscheduledRuns?: ScheduledRunsConfig;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport const DEFAULT_MAX_OUTPUT: Required<MaxOutputConfig> = {\n\tbytes: 200 * 1024,\n\tlines: 5000,\n};\n\nexport const DEFAULT_ARTIFACT_CONFIG: ArtifactConfig = {\n\tenabled: true,\n\tincludeInput: true,\n\tincludeOutput: true,\n\tincludeJsonl: false,\n\tincludeTranscript: true,\n\tincludeMetadata: true,\n\tcleanupDays: 7,\n};\n\nfunction sanitizeTempScopeSegment(value: string): string {\n\tconst sanitized = value\n\t\t.trim()\n\t\t.replace(/[^A-Za-z0-9._-]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\treturn sanitized || \"unknown\";\n}\n\nexport function resolveTempScopeId(options?: {\n\tenv?: NodeJS.ProcessEnv;\n\tgetuid?: (() => number) | undefined;\n\tuserInfo?: (() => { username?: string | null }) | undefined;\n\thomedir?: (() => string) | undefined;\n}): string {\n\tconst env = options?.env ?? process.env;\n\tconst getuid = options && Object.hasOwn(options, \"getuid\")\n\t\t? options.getuid\n\t\t: process.getuid?.bind(process);\n\tif (typeof getuid === \"function\") {\n\t\treturn `uid-${getuid()}`;\n\t}\n\n\tfor (const key of [\"USERNAME\", \"USER\", \"LOGNAME\"] as const) {\n\t\tconst value = env[key];\n\t\tif (value) return `user-${sanitizeTempScopeSegment(value)}`;\n\t}\n\n\tconst userInfo = options && Object.hasOwn(options, \"userInfo\")\n\t\t? options.userInfo\n\t\t: os.userInfo;\n\ttry {\n\t\tconst username = userInfo?.().username;\n\t\tif (username) return `user-${sanitizeTempScopeSegment(username)}`;\n\t} catch {\n\t\t// Fall through to home-directory-based scoping.\n\t}\n\n\tconst homedir = env.USERPROFILE ?? env.HOME;\n\tif (homedir) return `home-${sanitizeTempScopeSegment(homedir)}`;\n\n\tconst resolveHomedir = options && Object.hasOwn(options, \"homedir\")\n\t\t? options.homedir\n\t\t: os.homedir;\n\ttry {\n\t\tconst fallbackHomedir = resolveHomedir?.();\n\t\tif (fallbackHomedir) return `home-${sanitizeTempScopeSegment(fallbackHomedir)}`;\n\t} catch {\n\t\t// Fall through to the last-resort shared scope.\n\t}\n\n\treturn \"shared\";\n}\n\nconst MAX_PARALLEL = Number.MAX_SAFE_INTEGER;\nexport const MAX_CONCURRENCY = Number.MAX_SAFE_INTEGER;\nexport const TEMP_ROOT_DIR = path.join(os.tmpdir(), `pi-subagents-${resolveTempScopeId()}`);\nexport const RESULTS_DIR = path.join(TEMP_ROOT_DIR, \"async-subagent-results\");\nexport const ASYNC_DIR = path.join(TEMP_ROOT_DIR, \"async-subagent-runs\");\nexport const CHAIN_RUNS_DIR = path.join(TEMP_ROOT_DIR, \"chain-runs\");\nexport const TEMP_ARTIFACTS_DIR = path.join(TEMP_ROOT_DIR, \"artifacts\");\nexport const WIDGET_KEY = \"subagent-async\";\nexport const SLASH_RESULT_TYPE = \"subagent-slash-result\";\nexport const SLASH_TEXT_RESULT_TYPE = \"subagent-slash-text-result\";\nexport const SLASH_SUBAGENT_REQUEST_EVENT = \"subagent:slash:request\";\nexport const SLASH_SUBAGENT_STARTED_EVENT = \"subagent:slash:started\";\nexport const SLASH_SUBAGENT_RESPONSE_EVENT = \"subagent:slash:response\";\nexport const SLASH_SUBAGENT_UPDATE_EVENT = \"subagent:slash:update\";\nexport const SLASH_SUBAGENT_CANCEL_EVENT = \"subagent:slash:cancel\";\nexport const POLL_INTERVAL_MS = 250;\nexport const MAX_WIDGET_JOBS = 4;\nexport const DEFAULT_SUBAGENT_MAX_DEPTH = 2;\nexport const SUBAGENT_ACTIONS = [\"status\", \"interrupt\", \"resume\", \"steer\", \"stop\", \"append-step\", \"doctor\", \"watchdog.status\", \"watchdog.check\", \"watchdog.recommend-model\", \"schedule\", \"schedule-list\", \"schedule-status\", \"schedule-cancel\"] as const;\nexport const REMOVED_SUBAGENT_ACTIONS = [\"list\", \"get\", \"models\", \"create\", \"update\", \"delete\", \"eject\", \"disable\", \"enable\", \"reset\"] as const;\n\nexport const DEFAULT_FORK_PREAMBLE =\n\t\"You are a delegated subagent running from a fork of the parent session. \" +\n\t\"Treat the inherited conversation as reference-only context, not a live thread to continue. \" +\n\t\"Do not continue or answer prior messages as if they are waiting for a reply. \" +\n\t\"Your sole job is to execute the task below and return a focused result for that task using your tools.\";\n\nfunction normalizeTopLevelParallelValue(value: unknown): number | undefined {\n\tconst parsed = typeof value === \"number\" ? value : typeof value === \"string\" ? Number(value) : NaN;\n\tif (!Number.isInteger(parsed) || parsed < 1) return undefined;\n\treturn parsed;\n}\n\nexport function resolveTopLevelParallelMaxTasks(value: unknown): number {\n\treturn normalizeTopLevelParallelValue(value) ?? MAX_PARALLEL;\n}\n\nexport function resolveTopLevelParallelConcurrency(\n\toverride: unknown,\n\tconfigValue: unknown,\n): number {\n\treturn normalizeTopLevelParallelValue(override)\n\t\t?? normalizeTopLevelParallelValue(configValue)\n\t\t?? MAX_CONCURRENCY;\n}\n\nexport function getAsyncConfigPath(suffix: string): string {\n\treturn path.join(TEMP_ROOT_DIR, `async-cfg-${suffix}.json`);\n}\n\nexport function wrapForkTask(task: string, preamble?: string | false): string {\n\tif (preamble === false) return task;\n\tconst effectivePreamble = preamble ?? DEFAULT_FORK_PREAMBLE;\n\tconst wrappedPrefix = `${effectivePreamble}\\n\\nTask:\\n`;\n\tif (task.startsWith(wrappedPrefix)) return task;\n\treturn `${wrappedPrefix}${task}`;\n}\n\n// ============================================================================\n// Recursion Depth Guard\n// ============================================================================\n\nfunction normalizeNonNegativeInteger(value: unknown): number | undefined {\n\tconst parsed = typeof value === \"number\" ? value : typeof value === \"string\" ? Number(value) : NaN;\n\tif (!Number.isInteger(parsed) || parsed < 0) return undefined;\n\treturn parsed;\n}\n\nexport function normalizeMaxSubagentDepth(value: unknown): number | undefined {\n\treturn normalizeNonNegativeInteger(value);\n}\n\nexport function resolveCurrentMaxSubagentDepth(configMaxDepth?: number): number {\n\treturn normalizeMaxSubagentDepth(process.env.PI_SUBAGENT_MAX_DEPTH)\n\t\t?? normalizeMaxSubagentDepth(configMaxDepth)\n\t\t?? DEFAULT_SUBAGENT_MAX_DEPTH;\n}\n\nexport function resolveChildMaxSubagentDepth(parentMaxDepth: number, agentMaxDepth?: number): number {\n\tconst normalizedParent = normalizeMaxSubagentDepth(parentMaxDepth) ?? DEFAULT_SUBAGENT_MAX_DEPTH;\n\tconst normalizedAgent = normalizeMaxSubagentDepth(agentMaxDepth);\n\treturn normalizedAgent === undefined ? normalizedParent : Math.min(normalizedParent, normalizedAgent);\n}\n\nexport function checkSubagentDepth(configMaxDepth?: number): { blocked: boolean; depth: number; maxDepth: number } {\n\tconst depth = Number(process.env.PI_SUBAGENT_DEPTH ?? \"0\");\n\tconst maxDepth = resolveCurrentMaxSubagentDepth(configMaxDepth);\n\tconst blocked = Number.isFinite(depth) && depth >= maxDepth;\n\treturn { blocked, depth, maxDepth };\n}\n\nexport function getSubagentDepthEnv(maxDepth?: number): Record<string, string> {\n\tconst parentDepth = Number(process.env.PI_SUBAGENT_DEPTH ?? \"0\");\n\tconst nextDepth = Number.isFinite(parentDepth) ? parentDepth + 1 : 1;\n\treturn {\n\t\tPI_SUBAGENT_DEPTH: String(nextDepth),\n\t\tPI_SUBAGENT_MAX_DEPTH: String(normalizeMaxSubagentDepth(maxDepth) ?? resolveCurrentMaxSubagentDepth()),\n\t};\n}\n\nexport function normalizeMaxSubagentSpawnsPerSession(value: unknown): number | undefined {\n\treturn normalizeNonNegativeInteger(value);\n}\n\nexport function resolveMaxSubagentSpawnsPerSession(configMaxSpawns?: number): number | undefined {\n\tconst envMaxSpawns = normalizeMaxSubagentSpawnsPerSession(process.env.PI_SUBAGENT_MAX_SPAWNS_PER_SESSION);\n\tif (envMaxSpawns !== undefined) return envMaxSpawns === 0 ? undefined : envMaxSpawns;\n\tconst configuredMaxSpawns = normalizeMaxSubagentSpawnsPerSession(configMaxSpawns);\n\treturn configuredMaxSpawns === 0 ? undefined : configuredMaxSpawns;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nexport function truncateOutput(\n\toutput: string,\n\tconfig: Required<MaxOutputConfig>,\n\tartifactPath?: string,\n): TruncationResult {\n\tconst lines = output.split(\"\\n\");\n\tconst bytes = Buffer.byteLength(output, \"utf-8\");\n\n\tif (bytes <= config.bytes && lines.length <= config.lines) {\n\t\treturn { text: output, truncated: false };\n\t}\n\n\tlet truncatedLines = lines;\n\tif (lines.length > config.lines) {\n\t\ttruncatedLines = lines.slice(0, config.lines);\n\t}\n\n\tlet result = truncatedLines.join(\"\\n\");\n\tif (Buffer.byteLength(result, \"utf-8\") > config.bytes) {\n\t\tlet low = 0;\n\t\tlet high = result.length;\n\t\twhile (low < high) {\n\t\t\tconst mid = Math.floor((low + high + 1) / 2);\n\t\t\tif (Buffer.byteLength(result.slice(0, mid), \"utf-8\") <= config.bytes) {\n\t\t\t\tlow = mid;\n\t\t\t} else {\n\t\t\t\thigh = mid - 1;\n\t\t\t}\n\t\t}\n\t\tresult = result.slice(0, low);\n\t}\n\n\tconst keptLines = result.split(\"\\n\").length;\n\tconst marker = `[TRUNCATED: showing first ${keptLines} of ${lines.length} lines, ${formatBytes(Buffer.byteLength(result))} of ${formatBytes(bytes)}${artifactPath ? ` - full output at ${artifactPath}` : \"\"}]\\n`;\n\n\treturn {\n\t\ttext: marker + result,\n\t\ttruncated: true,\n\t\toriginalBytes: bytes,\n\t\toriginalLines: lines.length,\n\t\tartifactPath,\n\t};\n}\n"]}
@@ -11,7 +11,7 @@ export declare function getProjectConfigDir(projectRoot: string): string;
11
11
  export declare function getAgentDir(): string;
12
12
  export declare function resolveChildCwd(baseCwd: string, childCwd: string | undefined): string;
13
13
  /**
14
- * Read async job status from disk (with mtime-based caching)
14
+ * Read async job status from disk, caching while file identity and metadata match.
15
15
  */
16
16
  export declare function readStatus(asyncDir: string): AsyncStatus | null;
17
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/utils.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAiB,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAoB,YAAY,EAAmB,KAAK,EAAE,MAAM,YAAY,CAAC;AAUtJ,eAAO,MAAM,gCAAgC,8CAA8C,CAAC;AAE5F,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,MAAM,EACjB,cAAc,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAA+B,GACnE,MAAM,CAOR;AAqCD,wBAAgB,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAOnH;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAKpC;AAQD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGrF;AASD;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA2C/D;AAiDD;;GAEG;AACF,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAavE;AAgBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CA2B1D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,UAAU,CAAC,GAAG,MAAM,CAEpG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,WAAW,EAAE,CAY9E;AAwCD,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,CAW9D;AAeD,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CASzF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAS1E;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAQlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAsElE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAqD5E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAyB/D;AAMD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC","sourcesContent":["// @ts-nocheck\n/**\n * General utility functions for the subagent extension\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { Message } from \"@ashx-j/lunr-ai\";\nimport { formatToolCall } from \"./formatters.ts\";\nimport type { AgentProgress, AsyncStatus, Details, DisplayItem, ErrorInfo, NestedRunSummary, SingleResult, ToolCallSummary, Usage } from \"./types.ts\";\n\n// ============================================================================\n// File System Utilities\n// ============================================================================\n\n// lunr: last-resort default was \".pi\" — lunr's config dir is .lunr. (The package.json\n// probe above normally resolves piConfig.configDir; this only fires when it fails.)\nconst DEFAULT_CONFIG_DIR_NAME = \".lunr\";\nconst PI_CODING_AGENT_PACKAGE_NAME = \"@ashx-j/lunr\";\nexport const PI_CODING_AGENT_PACKAGE_ROOT_ENV = \"PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT\";\n\nexport function resolveWatchPath(\n\twatchPath: string,\n\tnativeRealpath: (filePath: string) => string = fs.realpathSync.native,\n): string {\n\t// libuv's Windows watcher cannot mix 8.3 registration paths with long event paths.\n\ttry {\n\t\treturn nativeRealpath(watchPath);\n\t} catch {\n\t\treturn watchPath;\n\t}\n}\n\nfunction validConfigDirName(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction readConfigDirNameFromPackageRoot(packageRoot: string | undefined): string | undefined {\n\tif (!packageRoot) return undefined;\n\ttry {\n\t\tconst pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, \"package.json\"), \"utf-8\")) as {\n\t\t\tname?: unknown;\n\t\t\tpiConfig?: { configDir?: unknown };\n\t\t};\n\t\tif (pkg.name !== PI_CODING_AGENT_PACKAGE_NAME) return undefined;\n\t\treturn validConfigDirName(pkg.piConfig?.configDir);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction resolveConfigDirNameFromPackageJson(entryPoint = process.argv[1], packageRoot = process.env[PI_CODING_AGENT_PACKAGE_ROOT_ENV]): string | undefined {\n\tconst packageRootValue = readConfigDirNameFromPackageRoot(packageRoot);\n\tif (packageRootValue) return packageRootValue;\n\tif (!entryPoint) return undefined;\n\ttry {\n\t\tlet dir = path.dirname(fs.realpathSync(entryPoint));\n\t\twhile (dir !== path.dirname(dir)) {\n\t\t\tconst value = readConfigDirNameFromPackageRoot(dir);\n\t\t\tif (value) return value;\n\t\t\tdir = path.dirname(dir);\n\t\t}\n\t} catch {\n\t\t// Package metadata lookup is best-effort; detached runners must not fail here.\n\t}\n\treturn undefined;\n}\n\nexport function resolveConfigDirName(codingAgentModule?: unknown, entryPoint?: string, packageRoot?: string): string {\n\tconst moduleValue = codingAgentModule && typeof codingAgentModule === \"object\"\n\t\t? validConfigDirName((codingAgentModule as { CONFIG_DIR_NAME?: unknown }).CONFIG_DIR_NAME)\n\t\t: undefined;\n\treturn moduleValue\n\t\t?? resolveConfigDirNameFromPackageJson(entryPoint, packageRoot)\n\t\t?? DEFAULT_CONFIG_DIR_NAME;\n}\n\nexport function getConfigDirName(): string {\n\treturn resolveConfigDirName();\n}\n\nexport function getProjectConfigDir(projectRoot: string): string {\n\treturn path.join(projectRoot, getConfigDirName());\n}\n\nexport function getAgentDir(): string {\n\tconst configured = process.env.PI_CODING_AGENT_DIR;\n\tif (configured === \"~\") return os.homedir();\n\tif (configured?.startsWith(\"~/\")) return path.join(os.homedir(), configured.slice(2));\n\treturn configured || path.join(os.homedir(), getConfigDirName(), \"agent\");\n}\n\nconst statusCache = new Map<string, { mtime: number; status: AsyncStatus }>();\n\nfunction getErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nexport function resolveChildCwd(baseCwd: string, childCwd: string | undefined): string {\n\tif (!childCwd) return baseCwd;\n\treturn path.isAbsolute(childCwd) ? childCwd : path.resolve(baseCwd, childCwd);\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn typeof error === \"object\"\n\t\t&& error !== null\n\t\t&& \"code\" in error\n\t\t&& (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\n/**\n * Read async job status from disk (with mtime-based caching)\n */\nexport function readStatus(asyncDir: string): AsyncStatus | null {\n\tconst statusPath = path.join(asyncDir, \"status.json\");\n\n\tlet stat: fs.Stats;\n\ttry {\n\t\tstat = fs.statSync(statusPath);\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return null;\n\t\tthrow new Error(`Failed to inspect async status file '${statusPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tconst cached = statusCache.get(statusPath);\n\tif (cached && cached.mtime === stat.mtimeMs) {\n\t\treturn cached.status;\n\t}\n\n\tlet content: string;\n\ttry {\n\t\tcontent = fs.readFileSync(statusPath, \"utf-8\");\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return null;\n\t\tthrow new Error(`Failed to read async status file '${statusPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tlet status: AsyncStatus;\n\ttry {\n\t\tstatus = JSON.parse(content) as AsyncStatus;\n\t} catch (error) {\n\t\tthrow new Error(`Failed to parse async status file '${statusPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tstatusCache.set(statusPath, { mtime: stat.mtimeMs, status });\n\tif (statusCache.size > 50) {\n\t\tconst firstKey = statusCache.keys().next().value;\n\t\tif (firstKey) statusCache.delete(firstKey);\n\t}\n\treturn status;\n}\n\nconst outputTailCache = new Map<string, { mtime: number; size: number; lines: string[] }>();\n\n/**\n * Get the last N lines from an output file (with mtime/size-based caching)\n */\nfunction getOutputTail(outputFile: string | undefined, maxLines: number = 3): string[] {\n\tif (!outputFile) return [];\n\tlet fd: number | null = null;\n\ttry {\n\t\tconst stat = fs.statSync(outputFile);\n\t\tif (stat.size === 0) return [];\n\n\t\tconst cached = outputTailCache.get(outputFile);\n\t\tif (cached && cached.mtime === stat.mtimeMs && cached.size === stat.size) {\n\t\t\treturn cached.lines;\n\t\t}\n\n\t\tconst tailBytes = 4096;\n\t\tconst start = Math.max(0, stat.size - tailBytes);\n\t\tfd = fs.openSync(outputFile, \"r\");\n\t\tconst buffer = Buffer.alloc(Math.min(tailBytes, stat.size));\n\t\tfs.readSync(fd, buffer, 0, buffer.length, start);\n\t\tconst content = buffer.toString(\"utf-8\");\n\t\tconst allLines = content.split(\"\\n\").filter((l) => l.trim());\n\t\tconst lines = allLines.slice(-maxLines).map((l) => l.slice(0, 120) + (l.length > 120 ? \"...\" : \"\"));\n\n\t\toutputTailCache.set(outputFile, { mtime: stat.mtimeMs, size: stat.size, lines });\n\t\tif (outputTailCache.size > 20) {\n\t\t\tconst firstKey = outputTailCache.keys().next().value;\n\t\t\tif (firstKey) outputTailCache.delete(firstKey);\n\t\t}\n\n\t\treturn lines;\n\t} catch {\n\t\t// Output tails are UI-only hints; unreadable or missing files should render as no tail.\n\t\treturn [];\n\t} finally {\n\t\tif (fd !== null) {\n\t\t\ttry {\n\t\t\t\tfs.closeSync(fd);\n\t\t\t} catch {\n\t\t\t\t// Closing the best-effort tail file handle should not surface over the main status view.\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Get human-readable last activity time for a file\n */\n\texport function getLastActivity(outputFile: string | undefined): string {\n\tif (!outputFile) return \"\";\n\ttry {\n\t\tconst stat = fs.statSync(outputFile);\n\t\tconst ago = Date.now() - stat.mtimeMs;\n\t\tif (ago < 1000) return \"active now\";\n\t\tif (ago < 60000) return `active ${Math.floor(ago / 1000)}s ago`;\n\t\treturn `active ${Math.floor(ago / 60000)}m ago`;\n\t} catch {\n\t\t// Last-activity text is best effort; missing files should simply omit the hint.\n\t\treturn \"\";\n\t}\n}\n\n/**\n * Find the latest session file in a directory\n */\nexport function findLatestSessionFile(sessionDir: string): string | null {\n\tif (!fs.existsSync(sessionDir)) return null;\n\tconst files = fs.readdirSync(sessionDir)\n\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t.map((f) => {\n\t\t\tconst filePath = path.join(sessionDir, f);\n\t\t\treturn {\n\t\t\t\tpath: filePath,\n\t\t\t\tmtime: fs.statSync(filePath).mtimeMs,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => b.mtime - a.mtime);\n\treturn files.length > 0 ? files[0].path : null;\n}\n\n/**\n * Write a prompt to a temporary file\n */\nfunction writePrompt(agent: string, prompt: string): { dir: string; path: string } {\n\tconst dir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\tconst p = path.join(dir, `${agent.replace(/[^\\w.-]/g, \"_\")}.md`);\n\tfs.writeFileSync(p, prompt, { mode: 0o600 });\n\treturn { dir, path: p };\n}\n\n// ============================================================================\n// Message Parsing Utilities\n// ============================================================================\n\n/**\n * Get the final text output from a list of messages\n */\nexport function getFinalOutput(messages: Message[]): string {\n\tconst validTextParts: string[] = [];\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role !== \"assistant\") continue;\n\t\tconst hasAssistantError = (\"errorMessage\" in msg && typeof msg.errorMessage === \"string\" && msg.errorMessage.length > 0)\n\t\t\t|| (\"stopReason\" in msg && msg.stopReason === \"error\");\n\t\tif (hasAssistantError) continue;\n\t\tconst messageText = msg.content\n\t\t\t.filter((part) => part.type === \"text\" && part.text.trim().length > 0)\n\t\t\t.map((part) => part.type === \"text\" ? part.text : \"\")\n\t\t\t.join(\"\\n\");\n\t\tfor (let j = msg.content.length - 1; j >= 0; j--) {\n\t\t\tconst part = msg.content[j];\n\t\t\tif (part.type !== \"text\" || part.text.trim().length === 0) continue;\n\t\t\tvalidTextParts.push(part.text);\n\t\t\tif (/```acceptance[-_]report\\s*\\n[\\s\\S]*?```/i.test(part.text)) return messageText;\n\t\t\tfor (const match of part.text.matchAll(/```(?:json|jsonc|json5)\\s*\\n([\\s\\S]*?)```/gi)) {\n\t\t\t\tconst body = match[1] ?? \"\";\n\t\t\t\tif (/\"(?:criteriaSatisfied|criteria_satisfied)\"/.test(body) && /\"(?:changedFiles|changed_files|testsAddedOrUpdated|tests_added_or_updated|commandsRun|commands_run|validationOutput|validation_output|residualRisks|residual_risks|noStagedFiles|no_staged_files|diffSummary|diff_summary|reviewFindings|review_findings|manualNotes|manual_notes)\"/.test(body)) {\n\t\t\t\t\treturn messageText;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (/ACCEPTANCE_REPORT\\s*:/i.test(part.text)) return messageText;\n\t\t}\n\t}\n\treturn validTextParts[0] ?? \"\";\n}\n\nexport function getSingleResultOutput(result: Pick<SingleResult, \"finalOutput\" | \"messages\">): string {\n\treturn result.finalOutput ?? getFinalOutput(result.messages ?? []);\n}\n\n/**\n * Extract display items (text and tool calls) from messages\n */\nexport function getDisplayItems(messages: Message[] | undefined): DisplayItem[] {\n\tif (!messages || messages.length === 0) return [];\n\tconst items: DisplayItem[] = [];\n\tfor (const msg of messages) {\n\t\tif (msg.role === \"assistant\") {\n\t\t\tfor (const part of msg.content) {\n\t\t\t\tif (part.type === \"text\") items.push({ type: \"text\", text: part.text });\n\t\t\t\telse if (part.type === \"toolCall\") items.push({ type: \"tool\", name: part.name, args: part.arguments });\n\t\t\t}\n\t\t}\n\t}\n\treturn items;\n}\n\nfunction compactCompletedProgress(progress: AgentProgress): AgentProgress {\n\tif (progress.status === \"running\") return progress;\n\treturn {\n\t\tindex: progress.index,\n\t\tagent: progress.agent,\n\t\tstatus: progress.status,\n\t\tactivityState: progress.activityState,\n\t\ttask: progress.task,\n\t\tskills: progress.skills,\n\t\ttoolCount: progress.toolCount,\n\t\ttokens: progress.tokens,\n\t\tdurationMs: progress.durationMs,\n\t\terror: progress.error,\n\t\tfailedTool: progress.failedTool,\n\t\trecentTools: [],\n\t\trecentOutput: [],\n\t};\n}\n\nfunction extractToolCallSummaries(messages: Message[] | undefined): ToolCallSummary[] {\n\tif (!messages?.length) return [];\n\tconst summaries: ToolCallSummary[] = [];\n\tfor (const msg of messages) {\n\t\tif (msg.role !== \"assistant\") continue;\n\t\tfor (const part of msg.content) {\n\t\t\tif (part.type !== \"toolCall\") continue;\n\t\t\tconst args = typeof part.arguments === \"object\" && part.arguments !== null && !Array.isArray(part.arguments)\n\t\t\t\t? part.arguments\n\t\t\t\t: {};\n\t\t\tsummaries.push({\n\t\t\t\ttext: formatToolCall(part.name, args),\n\t\t\t\texpandedText: formatToolCall(part.name, args, true),\n\t\t\t});\n\t\t}\n\t}\n\treturn summaries;\n}\n\nexport function sumResultsUsage(results: SingleResult[]): Usage {\n\tconst usage: Usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 };\n\tfor (const result of results) {\n\t\tusage.input += result.usage.input;\n\t\tusage.output += result.usage.output;\n\t\tusage.cacheRead += result.usage.cacheRead;\n\t\tusage.cacheWrite += result.usage.cacheWrite;\n\t\tusage.cost += result.usage.cost;\n\t\tusage.turns += result.usage.turns;\n\t}\n\treturn usage;\n}\n\nfunction addNestedCost(total: NonNullable<Details[\"totalCost\"]>, children: NestedRunSummary[] | undefined): void {\n\tfor (const child of children ?? []) {\n\t\tif (child.totalCost) {\n\t\t\ttotal.inputTokens += child.totalCost.inputTokens;\n\t\t\ttotal.outputTokens += child.totalCost.outputTokens;\n\t\t\ttotal.costUsd += child.totalCost.costUsd;\n\t\t\tcontinue;\n\t\t}\n\t\taddNestedCost(total, child.children);\n\t\tfor (const step of child.steps ?? []) addNestedCost(total, step.children);\n\t}\n}\n\n/** Sum input tokens, output tokens, and cost across a set of SingleResults. */\nexport function sumResultsCost(results: SingleResult[]): NonNullable<Details[\"totalCost\"]> {\n\tconst total = { inputTokens: 0, outputTokens: 0, costUsd: 0 };\n\tfor (const result of results) {\n\t\ttotal.inputTokens += result.usage.input;\n\t\ttotal.outputTokens += result.usage.output;\n\t\ttotal.costUsd += result.usage.cost;\n\t\taddNestedCost(total, result.children);\n\t}\n\treturn total;\n}\n\nexport function compactForegroundResult(result: SingleResult): SingleResult {\n\tif (result.progress?.status === \"running\") return result;\n\tconst toolCalls = result.toolCalls?.length ? result.toolCalls : extractToolCallSummaries(result.messages);\n\treturn {\n\t\t...result,\n\t\tmessages: undefined,\n\t\tprogress: undefined,\n\t\ttoolCalls: toolCalls.length ? toolCalls : undefined,\n\t};\n}\n\nexport function compactForegroundDetails(details: Details): Details {\n\treturn {\n\t\t...details,\n\t\tresults: details.results.map(compactForegroundResult),\n\t\tprogress: details.progress\n\t\t\t? details.progress.map(compactCompletedProgress)\n\t\t\t: undefined,\n\t};\n}\n\n/**\n * Detect errors in subagent execution from messages (only errors with no subsequent success)\n */\nexport function detectSubagentError(messages: Message[]): ErrorInfo {\n\tlet lastAssistantTextIndex = -1;\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role === \"assistant\") {\n\t\t\tconst hasText = Array.isArray(msg.content) && msg.content.some(\n\t\t\t\t(c) => c.type === \"text\" && \"text\" in c && typeof c.text === \"string\" && c.text.trim().length > 0,\n\t\t\t);\n\t\t\tif (hasText) {\n\t\t\t\tlastAssistantTextIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst scanStart = lastAssistantTextIndex >= 0 ? lastAssistantTextIndex + 1 : 0;\n\n\tfor (let i = messages.length - 1; i >= scanStart; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role !== \"toolResult\") continue;\n\t\tconst toolName = \"toolName\" in msg && typeof msg.toolName === \"string\" ? msg.toolName : undefined;\n\t\tconst isError = \"isError\" in msg && msg.isError === true;\n\n\t\tif (isError) {\n\t\t\tconst text = msg.content.find((c) => c.type === \"text\");\n\t\t\tconst details = text && \"text\" in text ? text.text : undefined;\n\t\t\tconst exitMatch = details?.match(/exit(?:ed)?\\s*(?:with\\s*)?(?:code|status)?\\s*[:\\s]?\\s*(\\d+)/i);\n\t\t\treturn {\n\t\t\t\thasError: true,\n\t\t\t\texitCode: exitMatch ? parseInt(exitMatch[1], 10) : 1,\n\t\t\t\terrorType: toolName || \"tool\",\n\t\t\t\tdetails: details?.slice(0, 200),\n\t\t\t};\n\t\t}\n\n\t\tif (toolName !== \"bash\") continue;\n\n\t\tconst text = msg.content.find((c) => c.type === \"text\");\n\t\tif (!text || !(\"text\" in text)) continue;\n\t\tconst output = text.text;\n\n\t\tconst exitMatch = output.match(/exit(?:ed)?\\s*(?:with\\s*)?(?:code|status)?\\s*[:\\s]?\\s*(\\d+)/i);\n\t\tif (exitMatch) {\n\t\t\tconst code = parseInt(exitMatch[1], 10);\n\t\t\tif (code !== 0) {\n\t\t\t\treturn { hasError: true, exitCode: code, errorType: \"bash\", details: output.slice(0, 200) };\n\t\t\t}\n\t\t}\n\n\t\t// NOTE: These patterns can match legitimate output (grep results, logs,\n\t\t// testing). With the assistant-message check above, most false positives\n\t\t// are mitigated since the agent will have responded after routine errors.\n\t\tconst fatalPatterns = [\n\t\t\t/command not found/i,\n\t\t\t/permission denied/i,\n\t\t\t/no such file or directory/i,\n\t\t\t/segmentation fault/i,\n\t\t\t/killed|terminated/i,\n\t\t\t/out of memory/i,\n\t\t\t/connection refused/i,\n\t\t\t/timeout/i,\n\t\t];\n\t\tfor (const pattern of fatalPatterns) {\n\t\t\tif (pattern.test(output)) {\n\t\t\t\treturn { hasError: true, exitCode: 1, errorType: \"bash\", details: output.slice(0, 200) };\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { hasError: false };\n}\n\n/**\n * Extract a preview of tool arguments for display\n */\nexport function extractToolArgsPreview(args: Record<string, unknown>): string {\n\tconst truncatePreview = (value: string, maxLength: number): string =>\n\t\tvalue.length > maxLength ? `${value.slice(0, maxLength - 3)}...` : value;\n\n\tconst stringifyPreviewValue = (value: unknown): string | undefined => {\n\t\tif (typeof value === \"string\" && value.trim().length > 0) return value;\n\t\tif (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n\t\treturn undefined;\n\t};\n\n\tconst previewArray = (value: unknown): string | undefined => {\n\t\tif (!Array.isArray(value) || value.length === 0) return undefined;\n\t\tconst first = stringifyPreviewValue(value[0]);\n\t\tif (!first) return undefined;\n\t\tconst suffix = value.length > 1 ? ` (+${value.length - 1} more)` : \"\";\n\t\treturn `${first}${suffix}`;\n\t};\n\n\t// Handle MCP tool calls - show server/tool info\n\tif (args.tool && typeof args.tool === \"string\") {\n\t\tconst server = args.server && typeof args.server === \"string\" ? `${args.server}/` : \"\";\n\t\tconst toolArgs = args.args && typeof args.args === \"string\" ? ` ${args.args.slice(0, 40)}` : \"\";\n\t\treturn `${server}${args.tool}${toolArgs}`;\n\t}\n\n\tconst queriesPreview = previewArray(args.queries);\n\tif (queriesPreview) return truncatePreview(queriesPreview, 60);\n\tif (typeof args.query === \"string\" && args.query.trim().length > 0) return truncatePreview(args.query, 60);\n\tif (typeof args.workflow === \"string\" && args.workflow.trim().length > 0) return `workflow=${truncatePreview(args.workflow, 48)}`;\n\n\tif (typeof args.url === \"string\" && args.url.trim().length > 0) return truncatePreview(args.url, 60);\n\tconst urlsPreview = previewArray(args.urls);\n\tif (urlsPreview) return truncatePreview(urlsPreview, 60);\n\tif (typeof args.prompt === \"string\" && args.prompt.trim().length > 0) return truncatePreview(args.prompt, 60);\n\t\n\tconst previewKeys = [\"command\", \"path\", \"file_path\", \"pattern\", \"query\", \"url\", \"task\", \"describe\", \"search\"];\n\tfor (const key of previewKeys) {\n\t\tif (args[key] && typeof args[key] === \"string\") {\n\t\t\tconst value = args[key] as string;\n\t\t\treturn truncatePreview(value, 60);\n\t\t}\n\t}\n\t\n\t// Fallback: show first string value found\n\tfor (const [key, value] of Object.entries(args)) {\n\t\tconst arrayPreview = previewArray(value);\n\t\tif (arrayPreview) return `${key}=${truncatePreview(arrayPreview, 50)}`;\n\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\tconst preview = truncatePreview(value, 50);\n\t\t\treturn `${key}=${preview}`;\n\t\t}\n\t}\n\treturn \"\";\n}\n\n/**\n * Extract text content from various message content formats\n */\nexport function extractTextFromContent(content: unknown): string {\n\tif (!content) return \"\";\n\t// Handle string content directly\n\tif (typeof content === \"string\") return content;\n\t// Handle array content\n\tif (!Array.isArray(content)) return \"\";\n\tconst texts: string[] = [];\n\tfor (const part of content) {\n\t\tif (part && typeof part === \"object\") {\n\t\t\t// Handle { type: \"text\", text: \"...\" }\n\t\t\tif (\"type\" in part && part.type === \"text\" && \"text\" in part) {\n\t\t\t\ttexts.push(String(part.text));\n\t\t\t}\n\t\t\t// Handle { type: \"tool_result\", content: \"...\" }\n\t\t\telse if (\"type\" in part && part.type === \"tool_result\" && \"content\" in part) {\n\t\t\t\tconst inner = extractTextFromContent(part.content);\n\t\t\t\tif (inner) texts.push(inner);\n\t\t\t}\n\t\t\t// Handle { text: \"...\" } without type\n\t\t\telse if (\"text\" in part) {\n\t\t\t\ttexts.push(String(part.text));\n\t\t\t}\n\t\t}\n\t}\n\treturn texts.join(\"\\n\");\n}\n\n// ============================================================================\n// Concurrency Utilities\n// ============================================================================\n\nexport { mapConcurrent } from \"../runs/shared/parallel-utils.ts\";\n"]}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/utils.ts"],"names":[],"mappings":"AACA;;GAEG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAiB,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAoB,YAAY,EAAmB,KAAK,EAAE,MAAM,YAAY,CAAC;AAUtJ,eAAO,MAAM,gCAAgC,8CAA8C,CAAC;AAE5F,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,MAAM,EACjB,cAAc,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAA+B,GACnE,MAAM,CAOR;AAqCD,wBAAgB,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAOnH;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAKpC;AAQD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGrF;AASD;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAuD/D;AAiDD;;GAEG;AACF,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAavE;AAgBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CA2B1D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,UAAU,CAAC,GAAG,MAAM,CAEpG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,WAAW,EAAE,CAY9E;AAwCD,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,CAW9D;AAeD,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CASzF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAS1E;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAQlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAsElE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAqD5E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAyB/D;AAMD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC","sourcesContent":["// @ts-nocheck\n/**\n * General utility functions for the subagent extension\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { Message } from \"@ashx-j/lunr-ai\";\nimport { formatToolCall } from \"./formatters.ts\";\nimport type { AgentProgress, AsyncStatus, Details, DisplayItem, ErrorInfo, NestedRunSummary, SingleResult, ToolCallSummary, Usage } from \"./types.ts\";\n\n// ============================================================================\n// File System Utilities\n// ============================================================================\n\n// lunr: last-resort default was \".pi\" — lunr's config dir is .lunr. (The package.json\n// probe above normally resolves piConfig.configDir; this only fires when it fails.)\nconst DEFAULT_CONFIG_DIR_NAME = \".lunr\";\nconst PI_CODING_AGENT_PACKAGE_NAME = \"@ashx-j/lunr\";\nexport const PI_CODING_AGENT_PACKAGE_ROOT_ENV = \"PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT\";\n\nexport function resolveWatchPath(\n\twatchPath: string,\n\tnativeRealpath: (filePath: string) => string = fs.realpathSync.native,\n): string {\n\t// libuv's Windows watcher cannot mix 8.3 registration paths with long event paths.\n\ttry {\n\t\treturn nativeRealpath(watchPath);\n\t} catch {\n\t\treturn watchPath;\n\t}\n}\n\nfunction validConfigDirName(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction readConfigDirNameFromPackageRoot(packageRoot: string | undefined): string | undefined {\n\tif (!packageRoot) return undefined;\n\ttry {\n\t\tconst pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, \"package.json\"), \"utf-8\")) as {\n\t\t\tname?: unknown;\n\t\t\tpiConfig?: { configDir?: unknown };\n\t\t};\n\t\tif (pkg.name !== PI_CODING_AGENT_PACKAGE_NAME) return undefined;\n\t\treturn validConfigDirName(pkg.piConfig?.configDir);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction resolveConfigDirNameFromPackageJson(entryPoint = process.argv[1], packageRoot = process.env[PI_CODING_AGENT_PACKAGE_ROOT_ENV]): string | undefined {\n\tconst packageRootValue = readConfigDirNameFromPackageRoot(packageRoot);\n\tif (packageRootValue) return packageRootValue;\n\tif (!entryPoint) return undefined;\n\ttry {\n\t\tlet dir = path.dirname(fs.realpathSync(entryPoint));\n\t\twhile (dir !== path.dirname(dir)) {\n\t\t\tconst value = readConfigDirNameFromPackageRoot(dir);\n\t\t\tif (value) return value;\n\t\t\tdir = path.dirname(dir);\n\t\t}\n\t} catch {\n\t\t// Package metadata lookup is best-effort; detached runners must not fail here.\n\t}\n\treturn undefined;\n}\n\nexport function resolveConfigDirName(codingAgentModule?: unknown, entryPoint?: string, packageRoot?: string): string {\n\tconst moduleValue = codingAgentModule && typeof codingAgentModule === \"object\"\n\t\t? validConfigDirName((codingAgentModule as { CONFIG_DIR_NAME?: unknown }).CONFIG_DIR_NAME)\n\t\t: undefined;\n\treturn moduleValue\n\t\t?? resolveConfigDirNameFromPackageJson(entryPoint, packageRoot)\n\t\t?? DEFAULT_CONFIG_DIR_NAME;\n}\n\nexport function getConfigDirName(): string {\n\treturn resolveConfigDirName();\n}\n\nexport function getProjectConfigDir(projectRoot: string): string {\n\treturn path.join(projectRoot, getConfigDirName());\n}\n\nexport function getAgentDir(): string {\n\tconst configured = process.env.PI_CODING_AGENT_DIR;\n\tif (configured === \"~\") return os.homedir();\n\tif (configured?.startsWith(\"~/\")) return path.join(os.homedir(), configured.slice(2));\n\treturn configured || path.join(os.homedir(), getConfigDirName(), \"agent\");\n}\n\nconst statusCache = new Map<string, { stat: fs.Stats; status: AsyncStatus }>();\n\nfunction getErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nexport function resolveChildCwd(baseCwd: string, childCwd: string | undefined): string {\n\tif (!childCwd) return baseCwd;\n\treturn path.isAbsolute(childCwd) ? childCwd : path.resolve(baseCwd, childCwd);\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn typeof error === \"object\"\n\t\t&& error !== null\n\t\t&& \"code\" in error\n\t\t&& (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\n/**\n * Read async job status from disk, caching while file identity and metadata match.\n */\nexport function readStatus(asyncDir: string): AsyncStatus | null {\n\tconst statusPath = path.join(asyncDir, \"status.json\");\n\n\tlet stat: fs.Stats;\n\ttry {\n\t\tstat = fs.statSync(statusPath);\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) {\n\t\t\tstatusCache.delete(statusPath);\n\t\t\treturn null;\n\t\t}\n\t\tthrow new Error(`Failed to inspect async status file '${statusPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tconst cached = statusCache.get(statusPath);\n\t// Atomic writers replace the file even when timestamp precision hides the update.\n\tif (cached\n\t\t&& cached.stat.dev === stat.dev\n\t\t&& cached.stat.ino === stat.ino\n\t\t&& cached.stat.mtimeMs === stat.mtimeMs\n\t\t&& cached.stat.ctimeMs === stat.ctimeMs\n\t\t&& cached.stat.size === stat.size) {\n\t\treturn cached.status;\n\t}\n\n\tlet content: string;\n\ttry {\n\t\tcontent = fs.readFileSync(statusPath, \"utf-8\");\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) {\n\t\t\tstatusCache.delete(statusPath);\n\t\t\treturn null;\n\t\t}\n\t\tthrow new Error(`Failed to read async status file '${statusPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tlet status: AsyncStatus;\n\ttry {\n\t\tstatus = JSON.parse(content) as AsyncStatus;\n\t} catch (error) {\n\t\tthrow new Error(`Failed to parse async status file '${statusPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tstatusCache.set(statusPath, { stat, status });\n\tif (statusCache.size > 50) {\n\t\tconst firstKey = statusCache.keys().next().value;\n\t\tif (firstKey) statusCache.delete(firstKey);\n\t}\n\treturn status;\n}\n\nconst outputTailCache = new Map<string, { mtime: number; size: number; lines: string[] }>();\n\n/**\n * Get the last N lines from an output file (with mtime/size-based caching)\n */\nfunction getOutputTail(outputFile: string | undefined, maxLines: number = 3): string[] {\n\tif (!outputFile) return [];\n\tlet fd: number | null = null;\n\ttry {\n\t\tconst stat = fs.statSync(outputFile);\n\t\tif (stat.size === 0) return [];\n\n\t\tconst cached = outputTailCache.get(outputFile);\n\t\tif (cached && cached.mtime === stat.mtimeMs && cached.size === stat.size) {\n\t\t\treturn cached.lines;\n\t\t}\n\n\t\tconst tailBytes = 4096;\n\t\tconst start = Math.max(0, stat.size - tailBytes);\n\t\tfd = fs.openSync(outputFile, \"r\");\n\t\tconst buffer = Buffer.alloc(Math.min(tailBytes, stat.size));\n\t\tfs.readSync(fd, buffer, 0, buffer.length, start);\n\t\tconst content = buffer.toString(\"utf-8\");\n\t\tconst allLines = content.split(\"\\n\").filter((l) => l.trim());\n\t\tconst lines = allLines.slice(-maxLines).map((l) => l.slice(0, 120) + (l.length > 120 ? \"...\" : \"\"));\n\n\t\toutputTailCache.set(outputFile, { mtime: stat.mtimeMs, size: stat.size, lines });\n\t\tif (outputTailCache.size > 20) {\n\t\t\tconst firstKey = outputTailCache.keys().next().value;\n\t\t\tif (firstKey) outputTailCache.delete(firstKey);\n\t\t}\n\n\t\treturn lines;\n\t} catch {\n\t\t// Output tails are UI-only hints; unreadable or missing files should render as no tail.\n\t\treturn [];\n\t} finally {\n\t\tif (fd !== null) {\n\t\t\ttry {\n\t\t\t\tfs.closeSync(fd);\n\t\t\t} catch {\n\t\t\t\t// Closing the best-effort tail file handle should not surface over the main status view.\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Get human-readable last activity time for a file\n */\n\texport function getLastActivity(outputFile: string | undefined): string {\n\tif (!outputFile) return \"\";\n\ttry {\n\t\tconst stat = fs.statSync(outputFile);\n\t\tconst ago = Date.now() - stat.mtimeMs;\n\t\tif (ago < 1000) return \"active now\";\n\t\tif (ago < 60000) return `active ${Math.floor(ago / 1000)}s ago`;\n\t\treturn `active ${Math.floor(ago / 60000)}m ago`;\n\t} catch {\n\t\t// Last-activity text is best effort; missing files should simply omit the hint.\n\t\treturn \"\";\n\t}\n}\n\n/**\n * Find the latest session file in a directory\n */\nexport function findLatestSessionFile(sessionDir: string): string | null {\n\tif (!fs.existsSync(sessionDir)) return null;\n\tconst files = fs.readdirSync(sessionDir)\n\t\t.filter((f) => f.endsWith(\".jsonl\"))\n\t\t.map((f) => {\n\t\t\tconst filePath = path.join(sessionDir, f);\n\t\t\treturn {\n\t\t\t\tpath: filePath,\n\t\t\t\tmtime: fs.statSync(filePath).mtimeMs,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => b.mtime - a.mtime);\n\treturn files.length > 0 ? files[0].path : null;\n}\n\n/**\n * Write a prompt to a temporary file\n */\nfunction writePrompt(agent: string, prompt: string): { dir: string; path: string } {\n\tconst dir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\tconst p = path.join(dir, `${agent.replace(/[^\\w.-]/g, \"_\")}.md`);\n\tfs.writeFileSync(p, prompt, { mode: 0o600 });\n\treturn { dir, path: p };\n}\n\n// ============================================================================\n// Message Parsing Utilities\n// ============================================================================\n\n/**\n * Get the final text output from a list of messages\n */\nexport function getFinalOutput(messages: Message[]): string {\n\tconst validTextParts: string[] = [];\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role !== \"assistant\") continue;\n\t\tconst hasAssistantError = (\"errorMessage\" in msg && typeof msg.errorMessage === \"string\" && msg.errorMessage.length > 0)\n\t\t\t|| (\"stopReason\" in msg && msg.stopReason === \"error\");\n\t\tif (hasAssistantError) continue;\n\t\tconst messageText = msg.content\n\t\t\t.filter((part) => part.type === \"text\" && part.text.trim().length > 0)\n\t\t\t.map((part) => part.type === \"text\" ? part.text : \"\")\n\t\t\t.join(\"\\n\");\n\t\tfor (let j = msg.content.length - 1; j >= 0; j--) {\n\t\t\tconst part = msg.content[j];\n\t\t\tif (part.type !== \"text\" || part.text.trim().length === 0) continue;\n\t\t\tvalidTextParts.push(part.text);\n\t\t\tif (/```acceptance[-_]report\\s*\\n[\\s\\S]*?```/i.test(part.text)) return messageText;\n\t\t\tfor (const match of part.text.matchAll(/```(?:json|jsonc|json5)\\s*\\n([\\s\\S]*?)```/gi)) {\n\t\t\t\tconst body = match[1] ?? \"\";\n\t\t\t\tif (/\"(?:criteriaSatisfied|criteria_satisfied)\"/.test(body) && /\"(?:changedFiles|changed_files|testsAddedOrUpdated|tests_added_or_updated|commandsRun|commands_run|validationOutput|validation_output|residualRisks|residual_risks|noStagedFiles|no_staged_files|diffSummary|diff_summary|reviewFindings|review_findings|manualNotes|manual_notes)\"/.test(body)) {\n\t\t\t\t\treturn messageText;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (/ACCEPTANCE_REPORT\\s*:/i.test(part.text)) return messageText;\n\t\t}\n\t}\n\treturn validTextParts[0] ?? \"\";\n}\n\nexport function getSingleResultOutput(result: Pick<SingleResult, \"finalOutput\" | \"messages\">): string {\n\treturn result.finalOutput ?? getFinalOutput(result.messages ?? []);\n}\n\n/**\n * Extract display items (text and tool calls) from messages\n */\nexport function getDisplayItems(messages: Message[] | undefined): DisplayItem[] {\n\tif (!messages || messages.length === 0) return [];\n\tconst items: DisplayItem[] = [];\n\tfor (const msg of messages) {\n\t\tif (msg.role === \"assistant\") {\n\t\t\tfor (const part of msg.content) {\n\t\t\t\tif (part.type === \"text\") items.push({ type: \"text\", text: part.text });\n\t\t\t\telse if (part.type === \"toolCall\") items.push({ type: \"tool\", name: part.name, args: part.arguments });\n\t\t\t}\n\t\t}\n\t}\n\treturn items;\n}\n\nfunction compactCompletedProgress(progress: AgentProgress): AgentProgress {\n\tif (progress.status === \"running\") return progress;\n\treturn {\n\t\tindex: progress.index,\n\t\tagent: progress.agent,\n\t\tstatus: progress.status,\n\t\tactivityState: progress.activityState,\n\t\ttask: progress.task,\n\t\tskills: progress.skills,\n\t\ttoolCount: progress.toolCount,\n\t\ttokens: progress.tokens,\n\t\tdurationMs: progress.durationMs,\n\t\terror: progress.error,\n\t\tfailedTool: progress.failedTool,\n\t\trecentTools: [],\n\t\trecentOutput: [],\n\t};\n}\n\nfunction extractToolCallSummaries(messages: Message[] | undefined): ToolCallSummary[] {\n\tif (!messages?.length) return [];\n\tconst summaries: ToolCallSummary[] = [];\n\tfor (const msg of messages) {\n\t\tif (msg.role !== \"assistant\") continue;\n\t\tfor (const part of msg.content) {\n\t\t\tif (part.type !== \"toolCall\") continue;\n\t\t\tconst args = typeof part.arguments === \"object\" && part.arguments !== null && !Array.isArray(part.arguments)\n\t\t\t\t? part.arguments\n\t\t\t\t: {};\n\t\t\tsummaries.push({\n\t\t\t\ttext: formatToolCall(part.name, args),\n\t\t\t\texpandedText: formatToolCall(part.name, args, true),\n\t\t\t});\n\t\t}\n\t}\n\treturn summaries;\n}\n\nexport function sumResultsUsage(results: SingleResult[]): Usage {\n\tconst usage: Usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 };\n\tfor (const result of results) {\n\t\tusage.input += result.usage.input;\n\t\tusage.output += result.usage.output;\n\t\tusage.cacheRead += result.usage.cacheRead;\n\t\tusage.cacheWrite += result.usage.cacheWrite;\n\t\tusage.cost += result.usage.cost;\n\t\tusage.turns += result.usage.turns;\n\t}\n\treturn usage;\n}\n\nfunction addNestedCost(total: NonNullable<Details[\"totalCost\"]>, children: NestedRunSummary[] | undefined): void {\n\tfor (const child of children ?? []) {\n\t\tif (child.totalCost) {\n\t\t\ttotal.inputTokens += child.totalCost.inputTokens;\n\t\t\ttotal.outputTokens += child.totalCost.outputTokens;\n\t\t\ttotal.costUsd += child.totalCost.costUsd;\n\t\t\tcontinue;\n\t\t}\n\t\taddNestedCost(total, child.children);\n\t\tfor (const step of child.steps ?? []) addNestedCost(total, step.children);\n\t}\n}\n\n/** Sum input tokens, output tokens, and cost across a set of SingleResults. */\nexport function sumResultsCost(results: SingleResult[]): NonNullable<Details[\"totalCost\"]> {\n\tconst total = { inputTokens: 0, outputTokens: 0, costUsd: 0 };\n\tfor (const result of results) {\n\t\ttotal.inputTokens += result.usage.input;\n\t\ttotal.outputTokens += result.usage.output;\n\t\ttotal.costUsd += result.usage.cost;\n\t\taddNestedCost(total, result.children);\n\t}\n\treturn total;\n}\n\nexport function compactForegroundResult(result: SingleResult): SingleResult {\n\tif (result.progress?.status === \"running\") return result;\n\tconst toolCalls = result.toolCalls?.length ? result.toolCalls : extractToolCallSummaries(result.messages);\n\treturn {\n\t\t...result,\n\t\tmessages: undefined,\n\t\tprogress: undefined,\n\t\ttoolCalls: toolCalls.length ? toolCalls : undefined,\n\t};\n}\n\nexport function compactForegroundDetails(details: Details): Details {\n\treturn {\n\t\t...details,\n\t\tresults: details.results.map(compactForegroundResult),\n\t\tprogress: details.progress\n\t\t\t? details.progress.map(compactCompletedProgress)\n\t\t\t: undefined,\n\t};\n}\n\n/**\n * Detect errors in subagent execution from messages (only errors with no subsequent success)\n */\nexport function detectSubagentError(messages: Message[]): ErrorInfo {\n\tlet lastAssistantTextIndex = -1;\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role === \"assistant\") {\n\t\t\tconst hasText = Array.isArray(msg.content) && msg.content.some(\n\t\t\t\t(c) => c.type === \"text\" && \"text\" in c && typeof c.text === \"string\" && c.text.trim().length > 0,\n\t\t\t);\n\t\t\tif (hasText) {\n\t\t\t\tlastAssistantTextIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst scanStart = lastAssistantTextIndex >= 0 ? lastAssistantTextIndex + 1 : 0;\n\n\tfor (let i = messages.length - 1; i >= scanStart; i--) {\n\t\tconst msg = messages[i];\n\t\tif (msg.role !== \"toolResult\") continue;\n\t\tconst toolName = \"toolName\" in msg && typeof msg.toolName === \"string\" ? msg.toolName : undefined;\n\t\tconst isError = \"isError\" in msg && msg.isError === true;\n\n\t\tif (isError) {\n\t\t\tconst text = msg.content.find((c) => c.type === \"text\");\n\t\t\tconst details = text && \"text\" in text ? text.text : undefined;\n\t\t\tconst exitMatch = details?.match(/exit(?:ed)?\\s*(?:with\\s*)?(?:code|status)?\\s*[:\\s]?\\s*(\\d+)/i);\n\t\t\treturn {\n\t\t\t\thasError: true,\n\t\t\t\texitCode: exitMatch ? parseInt(exitMatch[1], 10) : 1,\n\t\t\t\terrorType: toolName || \"tool\",\n\t\t\t\tdetails: details?.slice(0, 200),\n\t\t\t};\n\t\t}\n\n\t\tif (toolName !== \"bash\") continue;\n\n\t\tconst text = msg.content.find((c) => c.type === \"text\");\n\t\tif (!text || !(\"text\" in text)) continue;\n\t\tconst output = text.text;\n\n\t\tconst exitMatch = output.match(/exit(?:ed)?\\s*(?:with\\s*)?(?:code|status)?\\s*[:\\s]?\\s*(\\d+)/i);\n\t\tif (exitMatch) {\n\t\t\tconst code = parseInt(exitMatch[1], 10);\n\t\t\tif (code !== 0) {\n\t\t\t\treturn { hasError: true, exitCode: code, errorType: \"bash\", details: output.slice(0, 200) };\n\t\t\t}\n\t\t}\n\n\t\t// NOTE: These patterns can match legitimate output (grep results, logs,\n\t\t// testing). With the assistant-message check above, most false positives\n\t\t// are mitigated since the agent will have responded after routine errors.\n\t\tconst fatalPatterns = [\n\t\t\t/command not found/i,\n\t\t\t/permission denied/i,\n\t\t\t/no such file or directory/i,\n\t\t\t/segmentation fault/i,\n\t\t\t/killed|terminated/i,\n\t\t\t/out of memory/i,\n\t\t\t/connection refused/i,\n\t\t\t/timeout/i,\n\t\t];\n\t\tfor (const pattern of fatalPatterns) {\n\t\t\tif (pattern.test(output)) {\n\t\t\t\treturn { hasError: true, exitCode: 1, errorType: \"bash\", details: output.slice(0, 200) };\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { hasError: false };\n}\n\n/**\n * Extract a preview of tool arguments for display\n */\nexport function extractToolArgsPreview(args: Record<string, unknown>): string {\n\tconst truncatePreview = (value: string, maxLength: number): string =>\n\t\tvalue.length > maxLength ? `${value.slice(0, maxLength - 3)}...` : value;\n\n\tconst stringifyPreviewValue = (value: unknown): string | undefined => {\n\t\tif (typeof value === \"string\" && value.trim().length > 0) return value;\n\t\tif (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n\t\treturn undefined;\n\t};\n\n\tconst previewArray = (value: unknown): string | undefined => {\n\t\tif (!Array.isArray(value) || value.length === 0) return undefined;\n\t\tconst first = stringifyPreviewValue(value[0]);\n\t\tif (!first) return undefined;\n\t\tconst suffix = value.length > 1 ? ` (+${value.length - 1} more)` : \"\";\n\t\treturn `${first}${suffix}`;\n\t};\n\n\t// Handle MCP tool calls - show server/tool info\n\tif (args.tool && typeof args.tool === \"string\") {\n\t\tconst server = args.server && typeof args.server === \"string\" ? `${args.server}/` : \"\";\n\t\tconst toolArgs = args.args && typeof args.args === \"string\" ? ` ${args.args.slice(0, 40)}` : \"\";\n\t\treturn `${server}${args.tool}${toolArgs}`;\n\t}\n\n\tconst queriesPreview = previewArray(args.queries);\n\tif (queriesPreview) return truncatePreview(queriesPreview, 60);\n\tif (typeof args.query === \"string\" && args.query.trim().length > 0) return truncatePreview(args.query, 60);\n\tif (typeof args.workflow === \"string\" && args.workflow.trim().length > 0) return `workflow=${truncatePreview(args.workflow, 48)}`;\n\n\tif (typeof args.url === \"string\" && args.url.trim().length > 0) return truncatePreview(args.url, 60);\n\tconst urlsPreview = previewArray(args.urls);\n\tif (urlsPreview) return truncatePreview(urlsPreview, 60);\n\tif (typeof args.prompt === \"string\" && args.prompt.trim().length > 0) return truncatePreview(args.prompt, 60);\n\t\n\tconst previewKeys = [\"command\", \"path\", \"file_path\", \"pattern\", \"query\", \"url\", \"task\", \"describe\", \"search\"];\n\tfor (const key of previewKeys) {\n\t\tif (args[key] && typeof args[key] === \"string\") {\n\t\t\tconst value = args[key] as string;\n\t\t\treturn truncatePreview(value, 60);\n\t\t}\n\t}\n\t\n\t// Fallback: show first string value found\n\tfor (const [key, value] of Object.entries(args)) {\n\t\tconst arrayPreview = previewArray(value);\n\t\tif (arrayPreview) return `${key}=${truncatePreview(arrayPreview, 50)}`;\n\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\tconst preview = truncatePreview(value, 50);\n\t\t\treturn `${key}=${preview}`;\n\t\t}\n\t}\n\treturn \"\";\n}\n\n/**\n * Extract text content from various message content formats\n */\nexport function extractTextFromContent(content: unknown): string {\n\tif (!content) return \"\";\n\t// Handle string content directly\n\tif (typeof content === \"string\") return content;\n\t// Handle array content\n\tif (!Array.isArray(content)) return \"\";\n\tconst texts: string[] = [];\n\tfor (const part of content) {\n\t\tif (part && typeof part === \"object\") {\n\t\t\t// Handle { type: \"text\", text: \"...\" }\n\t\t\tif (\"type\" in part && part.type === \"text\" && \"text\" in part) {\n\t\t\t\ttexts.push(String(part.text));\n\t\t\t}\n\t\t\t// Handle { type: \"tool_result\", content: \"...\" }\n\t\t\telse if (\"type\" in part && part.type === \"tool_result\" && \"content\" in part) {\n\t\t\t\tconst inner = extractTextFromContent(part.content);\n\t\t\t\tif (inner) texts.push(inner);\n\t\t\t}\n\t\t\t// Handle { text: \"...\" } without type\n\t\t\telse if (\"text\" in part) {\n\t\t\t\ttexts.push(String(part.text));\n\t\t\t}\n\t\t}\n\t}\n\treturn texts.join(\"\\n\");\n}\n\n// ============================================================================\n// Concurrency Utilities\n// ============================================================================\n\nexport { mapConcurrent } from \"../runs/shared/parallel-utils.ts\";\n"]}
@@ -97,7 +97,7 @@ function isNotFoundError(error) {
97
97
  && error.code === "ENOENT";
98
98
  }
99
99
  /**
100
- * Read async job status from disk (with mtime-based caching)
100
+ * Read async job status from disk, caching while file identity and metadata match.
101
101
  */
102
102
  export function readStatus(asyncDir) {
103
103
  const statusPath = path.join(asyncDir, "status.json");
@@ -106,14 +106,22 @@ export function readStatus(asyncDir) {
106
106
  stat = fs.statSync(statusPath);
107
107
  }
108
108
  catch (error) {
109
- if (isNotFoundError(error))
109
+ if (isNotFoundError(error)) {
110
+ statusCache.delete(statusPath);
110
111
  return null;
112
+ }
111
113
  throw new Error(`Failed to inspect async status file '${statusPath}': ${getErrorMessage(error)}`, {
112
114
  cause: error instanceof Error ? error : undefined,
113
115
  });
114
116
  }
115
117
  const cached = statusCache.get(statusPath);
116
- if (cached && cached.mtime === stat.mtimeMs) {
118
+ // Atomic writers replace the file even when timestamp precision hides the update.
119
+ if (cached
120
+ && cached.stat.dev === stat.dev
121
+ && cached.stat.ino === stat.ino
122
+ && cached.stat.mtimeMs === stat.mtimeMs
123
+ && cached.stat.ctimeMs === stat.ctimeMs
124
+ && cached.stat.size === stat.size) {
117
125
  return cached.status;
118
126
  }
119
127
  let content;
@@ -121,8 +129,10 @@ export function readStatus(asyncDir) {
121
129
  content = fs.readFileSync(statusPath, "utf-8");
122
130
  }
123
131
  catch (error) {
124
- if (isNotFoundError(error))
132
+ if (isNotFoundError(error)) {
133
+ statusCache.delete(statusPath);
125
134
  return null;
135
+ }
126
136
  throw new Error(`Failed to read async status file '${statusPath}': ${getErrorMessage(error)}`, {
127
137
  cause: error instanceof Error ? error : undefined,
128
138
  });
@@ -136,7 +146,7 @@ export function readStatus(asyncDir) {
136
146
  cause: error instanceof Error ? error : undefined,
137
147
  });
138
148
  }
139
- statusCache.set(statusPath, { mtime: stat.mtimeMs, status });
149
+ statusCache.set(statusPath, { stat, status });
140
150
  if (statusCache.size > 50) {
141
151
  const firstKey = statusCache.keys().next().value;
142
152
  if (firstKey)