@ashx-j/lunr 0.2.25 → 0.2.27

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 (729) hide show
  1. package/CHANGELOG.md +31 -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/index.d.ts.map +1 -1
  12. package/dist/builtin-extensions/index.js +1 -0
  13. package/dist/builtin-extensions/index.js.map +1 -1
  14. package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
  15. package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
  16. package/dist/builtin-extensions/lunr-computer-use.js +179 -0
  17. package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
  18. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  19. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  20. package/dist/builtin-extensions/lunr-cron.js +94 -108
  21. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  22. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  23. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  24. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  27. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  28. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  29. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  30. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  31. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  32. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  33. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  34. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  36. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  38. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  40. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  41. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  43. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  45. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  47. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  48. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  49. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  51. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  57. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  59. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  60. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  61. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  63. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  64. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  67. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  71. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  73. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  74. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  76. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  78. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  80. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  81. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  83. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  89. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  91. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  93. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  94. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  95. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  96. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  97. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  98. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  99. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  101. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  102. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  103. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  104. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  105. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  106. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  108. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  109. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  110. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  112. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  115. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  116. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  117. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  118. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  119. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  120. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  121. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  122. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  125. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  127. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -4
  130. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +8 -5
  132. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
  134. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
  136. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  139. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +1 -0
  141. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +21 -4
  143. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +11 -4
  146. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +121 -25
  149. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
  152. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts +1 -0
  154. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js +5 -0
  156. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
  158. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
  160. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  162. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  165. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  166. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  168. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  170. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  171. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  172. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  175. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  176. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +1 -1
  178. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -1
  179. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  180. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  181. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +22 -11
  182. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  183. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  185. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  186. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-tps.js +20 -17
  188. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  189. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  190. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  191. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  192. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  193. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  194. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  195. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  196. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  197. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  198. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  199. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  200. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  201. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  202. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  203. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  204. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  205. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  206. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  207. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  208. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  209. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  210. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  211. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  212. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  213. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  214. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  215. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  216. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  217. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  218. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  219. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  220. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  221. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  222. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  223. package/dist/cli/install-cli.d.ts.map +1 -1
  224. package/dist/cli/install-cli.js +38 -30
  225. package/dist/cli/install-cli.js.map +1 -1
  226. package/dist/core/agent-session-runtime.d.ts +13 -0
  227. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  228. package/dist/core/agent-session-runtime.js +75 -11
  229. package/dist/core/agent-session-runtime.js.map +1 -1
  230. package/dist/core/agent-session-services.d.ts +1 -0
  231. package/dist/core/agent-session-services.d.ts.map +1 -1
  232. package/dist/core/agent-session-services.js +1 -0
  233. package/dist/core/agent-session-services.js.map +1 -1
  234. package/dist/core/agent-session.d.ts +40 -6
  235. package/dist/core/agent-session.d.ts.map +1 -1
  236. package/dist/core/agent-session.js +309 -76
  237. package/dist/core/agent-session.js.map +1 -1
  238. package/dist/core/browser/runtime.d.ts +2 -0
  239. package/dist/core/browser/runtime.d.ts.map +1 -1
  240. package/dist/core/browser/runtime.js +80 -45
  241. package/dist/core/browser/runtime.js.map +1 -1
  242. package/dist/core/browser/setup.d.ts.map +1 -1
  243. package/dist/core/browser/setup.js +12 -1
  244. package/dist/core/browser/setup.js.map +1 -1
  245. package/dist/core/computer-use/adapter.d.ts +28 -0
  246. package/dist/core/computer-use/adapter.d.ts.map +1 -0
  247. package/dist/core/computer-use/adapter.js +138 -0
  248. package/dist/core/computer-use/adapter.js.map +1 -0
  249. package/dist/core/computer-use/image.d.ts +27 -0
  250. package/dist/core/computer-use/image.d.ts.map +1 -0
  251. package/dist/core/computer-use/image.js +84 -0
  252. package/dist/core/computer-use/image.js.map +1 -0
  253. package/dist/core/computer-use/lease.d.ts +18 -0
  254. package/dist/core/computer-use/lease.d.ts.map +1 -0
  255. package/dist/core/computer-use/lease.js +129 -0
  256. package/dist/core/computer-use/lease.js.map +1 -0
  257. package/dist/core/computer-use/macos-runtime.d.ts +14 -0
  258. package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
  259. package/dist/core/computer-use/macos-runtime.js +148 -0
  260. package/dist/core/computer-use/macos-runtime.js.map +1 -0
  261. package/dist/core/computer-use/policy.d.ts +19 -0
  262. package/dist/core/computer-use/policy.d.ts.map +1 -0
  263. package/dist/core/computer-use/policy.js +67 -0
  264. package/dist/core/computer-use/policy.js.map +1 -0
  265. package/dist/core/computer-use/release.generated.d.ts +31 -0
  266. package/dist/core/computer-use/release.generated.d.ts.map +1 -0
  267. package/dist/core/computer-use/release.generated.js +36 -0
  268. package/dist/core/computer-use/release.generated.js.map +1 -0
  269. package/dist/core/computer-use/runtime.d.ts +13 -0
  270. package/dist/core/computer-use/runtime.d.ts.map +1 -0
  271. package/dist/core/computer-use/runtime.js +158 -0
  272. package/dist/core/computer-use/runtime.js.map +1 -0
  273. package/dist/core/computer-use/schemas.d.ts +100 -0
  274. package/dist/core/computer-use/schemas.d.ts.map +1 -0
  275. package/dist/core/computer-use/schemas.js +96 -0
  276. package/dist/core/computer-use/schemas.js.map +1 -0
  277. package/dist/core/computer-use/windows-desktop.d.ts +3 -0
  278. package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
  279. package/dist/core/computer-use/windows-desktop.js +48 -0
  280. package/dist/core/computer-use/windows-desktop.js.map +1 -0
  281. package/dist/core/computer-use/workflow.d.ts +38 -0
  282. package/dist/core/computer-use/workflow.d.ts.map +1 -0
  283. package/dist/core/computer-use/workflow.js +900 -0
  284. package/dist/core/computer-use/workflow.js.map +1 -0
  285. package/dist/core/cron/jobs.d.ts +26 -8
  286. package/dist/core/cron/jobs.d.ts.map +1 -1
  287. package/dist/core/cron/jobs.js +357 -232
  288. package/dist/core/cron/jobs.js.map +1 -1
  289. package/dist/core/cron/origin-context.d.ts +1 -0
  290. package/dist/core/cron/origin-context.d.ts.map +1 -1
  291. package/dist/core/cron/origin-context.js.map +1 -1
  292. package/dist/core/cron/scheduler.d.ts +22 -17
  293. package/dist/core/cron/scheduler.d.ts.map +1 -1
  294. package/dist/core/cron/scheduler.js +153 -73
  295. package/dist/core/cron/scheduler.js.map +1 -1
  296. package/dist/core/extensions/index.d.ts +1 -1
  297. package/dist/core/extensions/index.d.ts.map +1 -1
  298. package/dist/core/extensions/index.js.map +1 -1
  299. package/dist/core/extensions/loader.d.ts.map +1 -1
  300. package/dist/core/extensions/loader.js +4 -0
  301. package/dist/core/extensions/loader.js.map +1 -1
  302. package/dist/core/extensions/runner.d.ts +1 -0
  303. package/dist/core/extensions/runner.d.ts.map +1 -1
  304. package/dist/core/extensions/runner.js +8 -0
  305. package/dist/core/extensions/runner.js.map +1 -1
  306. package/dist/core/extensions/types.d.ts +8 -0
  307. package/dist/core/extensions/types.d.ts.map +1 -1
  308. package/dist/core/extensions/types.js.map +1 -1
  309. package/dist/core/footer-data-provider.d.ts +4 -0
  310. package/dist/core/footer-data-provider.d.ts.map +1 -1
  311. package/dist/core/footer-data-provider.js +22 -1
  312. package/dist/core/footer-data-provider.js.map +1 -1
  313. package/dist/core/large-subagent-launch.d.ts +1 -1
  314. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  315. package/dist/core/large-subagent-launch.js +7 -7
  316. package/dist/core/large-subagent-launch.js.map +1 -1
  317. package/dist/core/model-registry.d.ts +2 -0
  318. package/dist/core/model-registry.d.ts.map +1 -1
  319. package/dist/core/model-registry.js +5 -0
  320. package/dist/core/model-registry.js.map +1 -1
  321. package/dist/core/model-runtime.d.ts +4 -1
  322. package/dist/core/model-runtime.d.ts.map +1 -1
  323. package/dist/core/model-runtime.js +40 -4
  324. package/dist/core/model-runtime.js.map +1 -1
  325. package/dist/core/package-manager.d.ts.map +1 -1
  326. package/dist/core/package-manager.js.map +1 -1
  327. package/dist/core/permissions.d.ts +4 -4
  328. package/dist/core/permissions.d.ts.map +1 -1
  329. package/dist/core/permissions.js +25 -38
  330. package/dist/core/permissions.js.map +1 -1
  331. package/dist/core/plan-mode.d.ts +5 -13
  332. package/dist/core/plan-mode.d.ts.map +1 -1
  333. package/dist/core/plan-mode.js +135 -116
  334. package/dist/core/plan-mode.js.map +1 -1
  335. package/dist/core/project-trust.d.ts.map +1 -1
  336. package/dist/core/project-trust.js +1 -1
  337. package/dist/core/project-trust.js.map +1 -1
  338. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  339. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  340. package/dist/core/prompt-resource-bridge.js +9 -0
  341. package/dist/core/prompt-resource-bridge.js.map +1 -0
  342. package/dist/core/protected-targets.d.ts +6 -0
  343. package/dist/core/protected-targets.d.ts.map +1 -0
  344. package/dist/core/protected-targets.js +45 -0
  345. package/dist/core/protected-targets.js.map +1 -0
  346. package/dist/core/resource-loader.d.ts.map +1 -1
  347. package/dist/core/resource-loader.js +7 -0
  348. package/dist/core/resource-loader.js.map +1 -1
  349. package/dist/core/rollback.d.ts +19 -3
  350. package/dist/core/rollback.d.ts.map +1 -1
  351. package/dist/core/rollback.js +172 -56
  352. package/dist/core/rollback.js.map +1 -1
  353. package/dist/core/runtime-credentials.d.ts +3 -0
  354. package/dist/core/runtime-credentials.d.ts.map +1 -1
  355. package/dist/core/runtime-credentials.js +14 -1
  356. package/dist/core/runtime-credentials.js.map +1 -1
  357. package/dist/core/sdk.d.ts +3 -0
  358. package/dist/core/sdk.d.ts.map +1 -1
  359. package/dist/core/sdk.js +1 -0
  360. package/dist/core/sdk.js.map +1 -1
  361. package/dist/core/session-manager.d.ts +6 -0
  362. package/dist/core/session-manager.d.ts.map +1 -1
  363. package/dist/core/session-manager.js +95 -32
  364. package/dist/core/session-manager.js.map +1 -1
  365. package/dist/core/session-ownership.d.ts.map +1 -1
  366. package/dist/core/session-ownership.js +8 -3
  367. package/dist/core/session-ownership.js.map +1 -1
  368. package/dist/core/session-retention.d.ts.map +1 -1
  369. package/dist/core/session-retention.js +18 -7
  370. package/dist/core/session-retention.js.map +1 -1
  371. package/dist/core/session-startup-settings.d.ts +10 -0
  372. package/dist/core/session-startup-settings.d.ts.map +1 -0
  373. package/dist/core/session-startup-settings.js +70 -0
  374. package/dist/core/session-startup-settings.js.map +1 -0
  375. package/dist/core/settings-manager.d.ts +6 -0
  376. package/dist/core/settings-manager.d.ts.map +1 -1
  377. package/dist/core/settings-manager.js +19 -0
  378. package/dist/core/settings-manager.js.map +1 -1
  379. package/dist/core/subagent-event-transport.d.ts +3 -0
  380. package/dist/core/subagent-event-transport.d.ts.map +1 -0
  381. package/dist/core/subagent-event-transport.js +61 -0
  382. package/dist/core/subagent-event-transport.js.map +1 -0
  383. package/dist/core/subscriptions.d.ts +16 -7
  384. package/dist/core/subscriptions.d.ts.map +1 -1
  385. package/dist/core/subscriptions.js +96 -55
  386. package/dist/core/subscriptions.js.map +1 -1
  387. package/dist/core/trust-manager.d.ts +2 -1
  388. package/dist/core/trust-manager.d.ts.map +1 -1
  389. package/dist/core/trust-manager.js +6 -1
  390. package/dist/core/trust-manager.js.map +1 -1
  391. package/dist/core/update-check.d.ts.map +1 -1
  392. package/dist/core/update-check.js.map +1 -1
  393. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  394. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  395. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  396. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  397. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  398. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  399. package/dist/core/usage-adapters/openai-codex.js +3 -3
  400. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  401. package/dist/core/usage-adapters/xai.d.ts +2 -2
  402. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  403. package/dist/core/usage-adapters/xai.js +3 -3
  404. package/dist/core/usage-adapters/xai.js.map +1 -1
  405. package/dist/core/usage-adapters/zai.d.ts +2 -2
  406. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  407. package/dist/core/usage-adapters/zai.js +2 -2
  408. package/dist/core/usage-adapters/zai.js.map +1 -1
  409. package/dist/core/usage-service.d.ts +9 -2
  410. package/dist/core/usage-service.d.ts.map +1 -1
  411. package/dist/core/usage-service.js +95 -50
  412. package/dist/core/usage-service.js.map +1 -1
  413. package/dist/gateway/adapters/discord.d.ts.map +1 -1
  414. package/dist/gateway/adapters/discord.js +2 -2
  415. package/dist/gateway/adapters/discord.js.map +1 -1
  416. package/dist/gateway/agent-bridge.d.ts +9 -1
  417. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  418. package/dist/gateway/agent-bridge.js +91 -37
  419. package/dist/gateway/agent-bridge.js.map +1 -1
  420. package/dist/gateway/approval.d.ts.map +1 -1
  421. package/dist/gateway/approval.js +3 -3
  422. package/dist/gateway/approval.js.map +1 -1
  423. package/dist/gateway/authz.d.ts +4 -4
  424. package/dist/gateway/authz.d.ts.map +1 -1
  425. package/dist/gateway/authz.js +8 -12
  426. package/dist/gateway/authz.js.map +1 -1
  427. package/dist/gateway/buttons.d.ts +8 -1
  428. package/dist/gateway/buttons.d.ts.map +1 -1
  429. package/dist/gateway/buttons.js +76 -18
  430. package/dist/gateway/buttons.js.map +1 -1
  431. package/dist/gateway/commands.d.ts +1 -0
  432. package/dist/gateway/commands.d.ts.map +1 -1
  433. package/dist/gateway/commands.js +12 -10
  434. package/dist/gateway/commands.js.map +1 -1
  435. package/dist/gateway/cron.d.ts +12 -11
  436. package/dist/gateway/cron.d.ts.map +1 -1
  437. package/dist/gateway/cron.js +85 -62
  438. package/dist/gateway/cron.js.map +1 -1
  439. package/dist/gateway/index.d.ts.map +1 -1
  440. package/dist/gateway/index.js +5 -4
  441. package/dist/gateway/index.js.map +1 -1
  442. package/dist/gateway/mobile-commands.d.ts +1 -0
  443. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  444. package/dist/gateway/mobile-commands.js +64 -22
  445. package/dist/gateway/mobile-commands.js.map +1 -1
  446. package/dist/gateway/presenter.d.ts +12 -2
  447. package/dist/gateway/presenter.d.ts.map +1 -1
  448. package/dist/gateway/presenter.js +74 -39
  449. package/dist/gateway/presenter.js.map +1 -1
  450. package/dist/gateway/router.d.ts +2 -2
  451. package/dist/gateway/router.d.ts.map +1 -1
  452. package/dist/gateway/router.js +22 -9
  453. package/dist/gateway/router.js.map +1 -1
  454. package/dist/gateway/service.d.ts +2 -0
  455. package/dist/gateway/service.d.ts.map +1 -1
  456. package/dist/gateway/service.js +153 -0
  457. package/dist/gateway/service.js.map +1 -1
  458. package/dist/gateway/setup.d.ts.map +1 -1
  459. package/dist/gateway/setup.js +6 -4
  460. package/dist/gateway/setup.js.map +1 -1
  461. package/dist/main.d.ts.map +1 -1
  462. package/dist/main.js +86 -33
  463. package/dist/main.js.map +1 -1
  464. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/assistant-message.js +6 -4
  466. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  467. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/copyable-text.js +3 -2
  469. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  470. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/extension-editor.js +1 -1
  472. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  473. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  474. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  475. package/dist/modes/interactive/components/settings-selector.js +20 -0
  476. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  477. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  478. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  479. package/dist/modes/interactive/interactive-mode.js +104 -109
  480. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  481. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  482. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  483. package/dist/modes/print-mode.d.ts.map +1 -1
  484. package/dist/modes/print-mode.js +9 -1
  485. package/dist/modes/print-mode.js.map +1 -1
  486. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  487. package/dist/modes/rpc/rpc-mode.js +2 -1
  488. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  489. package/dist/node-runtime/adapter-247RTYLS.js +16 -0
  490. package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
  491. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  492. package/dist/node-runtime/{builtin-extensions-ZLAX7TUH.js → builtin-extensions-OX6KELNX.js} +9 -7
  493. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  494. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  495. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  496. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  497. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  498. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  499. package/dist/node-runtime/{chunk-NRKGMJYU.js → chunk-6O3IW3IA.js} +2 -2
  500. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  501. package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
  502. package/dist/node-runtime/{chunk-ZXSGTGJ6.js → chunk-APVM5NEU.js} +169 -148
  503. package/dist/node-runtime/{chunk-RC7DMV45.js → chunk-AYHH7YSD.js} +205 -144
  504. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  505. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  506. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  507. package/dist/node-runtime/{chunk-KWIYUUZK.js → chunk-C3P6Q3B2.js} +469 -283
  508. package/dist/node-runtime/{chunk-YCUZEGJG.js → chunk-DQSCFU7R.js} +17 -8
  509. package/dist/node-runtime/chunk-EBLAZVSA.js +4170 -0
  510. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
  511. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  512. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  513. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  514. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  515. package/dist/node-runtime/chunk-FE3WZI7F.js +290 -0
  516. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
  517. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  518. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  519. package/dist/node-runtime/chunk-FY4A63RK.js +73 -0
  520. package/dist/node-runtime/chunk-FYIFPFXE.js +98 -0
  521. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  522. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  523. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  524. package/dist/node-runtime/{chunk-6XL67VVY.js → chunk-HUD2RFJW.js} +17 -2
  525. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
  526. package/dist/node-runtime/chunk-IAZSK7KK.js +108 -0
  527. package/dist/node-runtime/{chunk-2HHLJWGD.js → chunk-IHHTWSXN.js} +9 -9
  528. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  529. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  530. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  531. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
  532. package/dist/node-runtime/{chunk-WF7PGWRZ.js → chunk-JWEVT363.js} +37 -28
  533. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  534. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  535. package/dist/node-runtime/{chunk-IJIFHRTB.js → chunk-MQPKUHRN.js} +165 -85
  536. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  537. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  538. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  539. package/dist/node-runtime/{chunk-E4D3IGP2.js → chunk-QNVMKNNN.js} +20 -17
  540. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  541. package/dist/node-runtime/{chunk-7S3T6YEA.js → chunk-R4WSB2MQ.js} +5 -5
  542. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  543. package/dist/node-runtime/{chunk-3XPLBUEM.js → chunk-RLGY2QIL.js} +49 -59
  544. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  545. package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-TCT6PCUR.js} +47 -115
  546. package/dist/node-runtime/chunk-U5F4IC7R.js +53 -0
  547. package/dist/node-runtime/{chunk-OCVIXVTZ.js → chunk-UBWW2PID.js} +13 -2
  548. package/dist/node-runtime/{chunk-HFVZUPFJ.js → chunk-UNUZICC4.js} +3 -3
  549. package/dist/node-runtime/{chunk-LQP3RB67.js → chunk-UYRKUKFE.js} +1 -1
  550. package/dist/node-runtime/{chunk-DSIKTUPW.js → chunk-VSUEAI7O.js} +2993 -3820
  551. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  552. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  553. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  554. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  555. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  556. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  557. package/dist/node-runtime/{chunk-VQFSUJJG.js → chunk-ZDJUR45D.js} +430 -129
  558. package/dist/node-runtime/{chunk-YDO2F2IA.js → chunk-ZEVFBFNF.js} +95 -142
  559. package/dist/node-runtime/chunk-ZIQUS5QO.js +180 -0
  560. package/dist/node-runtime/cli-runtime.js +4 -4
  561. package/dist/node-runtime/{command-6WDOYKS6.js → command-3HMSY6W2.js} +5 -5
  562. package/dist/node-runtime/{commands-NZLSOHPE.js → commands-D6A6H4TS.js} +11 -16
  563. package/dist/node-runtime/commands-OCSSEEWJ.js +37 -0
  564. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  565. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  566. package/dist/node-runtime/{direct-tool-executor-77GW4F5P.js → direct-tool-executor-2QJXVQD2.js} +8 -10
  567. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  568. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
  569. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  570. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  571. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  572. package/dist/node-runtime/{gateway-INAYBF4Q.js → gateway-6623C2U3.js} +61 -53
  573. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  574. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  575. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  576. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
  577. package/dist/node-runtime/index.js +54 -48
  578. package/dist/node-runtime/{init-HS6NQXSK.js → init-JBQJIPYI.js} +3 -4
  579. package/dist/node-runtime/{install-cli-KL4UDDAD.js → install-cli-INGHIVBY.js} +30 -25
  580. package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
  581. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  582. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  583. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  584. package/dist/node-runtime/lunr-computer-use-VDP2QNRQ.js +158 -0
  585. package/dist/node-runtime/{lunr-cron-LWIZJM2N.js → lunr-cron-LKVA5CZZ.js} +94 -79
  586. package/dist/node-runtime/main.js +42 -39
  587. package/dist/node-runtime/{mobile-commands-J7OJEKFO.js → mobile-commands-XT3NQXLD.js} +13 -12
  588. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  589. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  590. package/dist/node-runtime/{package-manager-cli-VYZM5WHN.js → package-manager-cli-CYM262SI.js} +20 -19
  591. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  592. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  593. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  594. package/dist/node-runtime/{pi-mcp-adapter-5UKBZP44.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  595. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  596. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  597. package/dist/node-runtime/{pi-subagents-DNY7EAIG.js → pi-subagents-LT3CTO4E.js} +114 -116
  598. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  599. package/dist/node-runtime/{print-mode-XSFM26EL.js → print-mode-2XHN5SUA.js} +4 -3
  600. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  601. package/dist/node-runtime/{proxy-modes-LGEUYD7R.js → proxy-modes-VEGC6QG5.js} +9 -13
  602. package/dist/node-runtime/rpc-entry.js +42 -39
  603. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  604. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  605. package/dist/node-runtime/runtime-UGXM4NPQ.js +21 -0
  606. package/dist/node-runtime/{runtime-bridges-VRDDR73P.js → runtime-bridges-DNKMNJCF.js} +8 -7
  607. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  608. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
  609. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
  610. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  611. package/dist/node-runtime/{settings-manager-J4SPQPDJ.js → settings-manager-P2TKGYTR.js} +6 -5
  612. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  613. package/dist/node-runtime/{setup-CQ2NLVK5.js → setup-OLQ4GXWS.js} +22 -21
  614. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  615. package/dist/node-runtime/{subagent-executor-KZZQGAKV.js → subagent-executor-Q5F7DBVM.js} +141 -62
  616. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  617. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  618. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  619. package/dist/node-runtime/{update-cli-GTFJC7XK.js → update-cli-F3XXJANQ.js} +7 -6
  620. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  621. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  622. package/dist/node-runtime/workflow-ICDI4N3J.js +767 -0
  623. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  624. package/dist/utils/clipboard-image.d.ts.map +1 -1
  625. package/dist/utils/clipboard-image.js.map +1 -1
  626. package/dist/utils/exif-orientation.d.ts.map +1 -1
  627. package/dist/utils/exif-orientation.js +25 -10
  628. package/dist/utils/exif-orientation.js.map +1 -1
  629. package/dist/utils/image-resize-core.d.ts +2 -0
  630. package/dist/utils/image-resize-core.d.ts.map +1 -1
  631. package/dist/utils/image-resize-core.js +12 -0
  632. package/dist/utils/image-resize-core.js.map +1 -1
  633. package/dist/utils/paths.d.ts +4 -0
  634. package/dist/utils/paths.d.ts.map +1 -1
  635. package/dist/utils/paths.js +33 -2
  636. package/dist/utils/paths.js.map +1 -1
  637. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  638. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  639. package/dist/utils/sanitize-terminal-text.js +67 -0
  640. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  641. package/docs/browser.md +1 -1
  642. package/docs/computer-use.md +362 -0
  643. package/docs/custom-provider.md +3 -3
  644. package/docs/extensions.md +8 -4
  645. package/docs/features.md +22 -12
  646. package/docs/keybindings.md +1 -1
  647. package/docs/models.md +5 -5
  648. package/docs/packages.md +1 -1
  649. package/docs/providers.md +2 -2
  650. package/docs/rpc.md +7 -7
  651. package/docs/security.md +10 -5
  652. package/docs/sessions.md +2 -2
  653. package/docs/skills.md +1 -1
  654. package/docs/terminal-setup.md +7 -7
  655. package/docs/themes.md +1 -1
  656. package/docs/usage.md +1 -1
  657. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  658. package/examples/extensions/bash-spawn-hook.ts +1 -1
  659. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  660. package/examples/extensions/claude-rules.ts +1 -1
  661. package/examples/extensions/commands.ts +1 -1
  662. package/examples/extensions/custom-compaction.ts +1 -1
  663. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  664. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  665. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  666. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  667. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  668. package/examples/extensions/doom-overlay/index.ts +1 -1
  669. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  670. package/examples/extensions/gondolin/index.ts +1 -1
  671. package/examples/extensions/gondolin/package-lock.json +2 -2
  672. package/examples/extensions/gondolin/package.json +1 -1
  673. package/examples/extensions/hidden-thinking-label.ts +1 -1
  674. package/examples/extensions/inline-bash.ts +2 -2
  675. package/examples/extensions/input-transform-streaming.ts +2 -2
  676. package/examples/extensions/input-transform.ts +2 -2
  677. package/examples/extensions/interactive-shell.ts +1 -1
  678. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  679. package/examples/extensions/mac-system-theme.ts +1 -1
  680. package/examples/extensions/minimal-mode.ts +1 -1
  681. package/examples/extensions/modal-editor.ts +1 -1
  682. package/examples/extensions/model-status.ts +1 -1
  683. package/examples/extensions/notify.ts +3 -3
  684. package/examples/extensions/overlay-qa-tests.ts +1 -1
  685. package/examples/extensions/overlay-test.ts +1 -1
  686. package/examples/extensions/pirate.ts +1 -1
  687. package/examples/extensions/preset.ts +3 -3
  688. package/examples/extensions/project-trust.ts +4 -4
  689. package/examples/extensions/prompt-customizer.ts +1 -1
  690. package/examples/extensions/rainbow-editor.ts +1 -1
  691. package/examples/extensions/rpc-demo.ts +1 -1
  692. package/examples/extensions/sandbox/index.ts +7 -7
  693. package/examples/extensions/sandbox/package-lock.json +2 -2
  694. package/examples/extensions/sandbox/package.json +1 -1
  695. package/examples/extensions/shutdown-command.ts +5 -5
  696. package/examples/extensions/ssh.ts +2 -2
  697. package/examples/extensions/subagent/README.md +3 -3
  698. package/examples/extensions/subagent/index.ts +2 -2
  699. package/examples/extensions/titlebar-spinner.ts +1 -1
  700. package/examples/extensions/tool-override.ts +1 -1
  701. package/examples/extensions/tools.ts +1 -1
  702. package/examples/extensions/with-deps/package-lock.json +2 -2
  703. package/examples/extensions/with-deps/package.json +1 -1
  704. package/examples/extensions/working-indicator.ts +1 -1
  705. package/examples/extensions/working-message-test.ts +1 -1
  706. package/examples/sdk/01-minimal.ts +1 -1
  707. package/examples/sdk/03-custom-prompt.ts +1 -1
  708. package/examples/sdk/04-skills.ts +1 -1
  709. package/examples/sdk/06-extensions.ts +2 -2
  710. package/examples/sdk/08-prompt-templates.ts +1 -1
  711. package/install-lock/package-lock.json +3841 -0
  712. package/install-lock/package.json +18 -0
  713. package/native/computer-use/LICENSE.md +21 -0
  714. package/npm-shrinkwrap.json +3858 -0
  715. package/package.json +15 -9
  716. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  717. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  718. package/dist/modes/interactive/components/exit-card.js +0 -69
  719. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  720. package/dist/node-runtime/agent-session-services-YXXFCP5J.js +0 -49
  721. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  722. package/dist/node-runtime/chunk-4TLO4PO2.js +0 -3427
  723. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  724. package/dist/node-runtime/chunk-OVX6X377.js +0 -50
  725. package/dist/node-runtime/chunk-QTU6AKNJ.js +0 -773
  726. package/dist/node-runtime/chunk-TORR5XBV.js +0 -356
  727. package/dist/node-runtime/commands-QC6VUZJQ.js +0 -36
  728. package/dist/node-runtime/interactive-mode-Z5M7WYYZ.js +0 -72
  729. package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +0 -32
@@ -21,68 +21,96 @@ export function flattenSteps(steps) {
21
21
  return flat;
22
22
  }
23
23
  export const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;
24
- // lunr: stagger parallel cold starts so the first child's response begins
25
- // (creating the Anthropic cache entry) before siblings fire identical
26
- // system prompts. Sequential mode (limit=1) is untouched.
27
- const PARALLEL_COLD_START_STAGGER_MS = 1000;
28
- /**
29
- * A promise-based semaphore for limiting concurrent access across multiple
30
- * mapConcurrent calls within a single run. Enforces a global cap on the total
31
- * number of subagent tasks executing simultaneously, regardless of each step's
32
- * per-step concurrency limit.
33
- */
24
+ // Give the first child a small head start for prompt-cache creation. All
25
+ // siblings share this one deadline, even when bounded workers reuse slots.
26
+ export const PARALLEL_COLD_START_ALLOWANCE_MS = 1000;
27
+ /** Run-wide concurrency cap, with removable waits for cancelled launches. */
34
28
  export class Semaphore {
35
29
  available;
36
30
  queue = [];
37
31
  constructor(limit) {
38
32
  this.available = Math.max(1, Math.floor(limit) || 1);
39
33
  }
40
- acquire() {
34
+ acquire(signal) {
35
+ signal?.throwIfAborted();
41
36
  if (this.available > 0) {
42
37
  this.available--;
43
38
  return Promise.resolve();
44
39
  }
45
- return new Promise((resolve) => {
46
- this.queue.push(resolve);
40
+ return new Promise((resolve, reject) => {
41
+ const grant = () => {
42
+ signal?.removeEventListener("abort", abort);
43
+ resolve();
44
+ };
45
+ const abort = () => {
46
+ const index = this.queue.indexOf(grant);
47
+ if (index !== -1)
48
+ this.queue.splice(index, 1);
49
+ reject(signal?.reason);
50
+ };
51
+ this.queue.push(grant);
52
+ signal?.addEventListener("abort", abort, { once: true });
47
53
  });
48
54
  }
49
55
  release() {
50
56
  const next = this.queue.shift();
51
- if (next) {
57
+ if (next)
52
58
  next();
53
- }
54
- else {
59
+ else
55
60
  this.available++;
56
- }
57
61
  }
58
62
  }
59
- export async function mapConcurrent(items, limit, fn, globalSemaphore) {
63
+ function waitForLaunch(delayMs, signal) {
64
+ signal?.throwIfAborted();
65
+ if (delayMs <= 0)
66
+ return Promise.resolve();
67
+ return new Promise((resolve, reject) => {
68
+ const timer = setTimeout(() => {
69
+ signal?.removeEventListener("abort", abort);
70
+ resolve();
71
+ }, delayMs);
72
+ const abort = () => {
73
+ clearTimeout(timer);
74
+ reject(signal?.reason);
75
+ };
76
+ signal?.addEventListener("abort", abort, { once: true });
77
+ });
78
+ }
79
+ export async function mapConcurrent(items, limit, fn, globalSemaphore, cancellation) {
60
80
  const safeLimit = Math.max(1, Math.floor(limit) || 1);
61
81
  const results = new Array(items.length);
82
+ const launchDeadline = Date.now() + (safeLimit > 1 ? PARALLEL_COLD_START_ALLOWANCE_MS : 0);
83
+ const signal = cancellation?.signal;
84
+ let launchReady;
62
85
  let next = 0;
63
- async function worker(_workerIndex) {
86
+ async function worker() {
64
87
  while (next < items.length) {
65
88
  const i = next++;
66
- if (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {
67
- await new Promise((resolve) => {
68
- setTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);
69
- });
70
- }
71
- if (globalSemaphore) {
72
- await globalSemaphore.acquire();
89
+ let acquired = false;
90
+ try {
73
91
  try {
74
- results[i] = await fn(items[i], i);
92
+ await (i === 0 ? waitForLaunch(0, signal) : launchReady ??= waitForLaunch(launchDeadline - Date.now(), signal));
93
+ if (globalSemaphore) {
94
+ await globalSemaphore.acquire(signal);
95
+ acquired = true;
96
+ }
97
+ signal?.throwIfAborted();
75
98
  }
76
- finally {
77
- globalSemaphore.release();
99
+ catch (error) {
100
+ if (!signal?.aborted || !cancellation)
101
+ throw error;
102
+ results[i] = cancellation.onAbort(items[i], i);
103
+ continue;
78
104
  }
79
- }
80
- else {
81
105
  results[i] = await fn(items[i], i);
82
106
  }
107
+ finally {
108
+ if (acquired)
109
+ globalSemaphore.release();
110
+ }
83
111
  }
84
112
  }
85
- await Promise.all(Array.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)));
113
+ await Promise.all(Array.from({ length: Math.min(safeLimit, items.length) }, () => worker()));
86
114
  return results;
87
115
  }
88
116
  export function aggregateParallelOutputs(results, headerFormat = (i, agent) => `=== Parallel Task ${i + 1} (${agent}) ===`) {
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-utils.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\tcompletionTask?: string;\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent?: string;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: \"full\" | \"read-only\";\n\ttier?: import(\"../../shared/types.ts\").ChildTier;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: import(\"../../shared/types.ts\").ModelSelection;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
1
+ {"version":3,"file":"parallel-utils.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\tcompletionTask?: string;\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent?: string;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: \"full\" | \"read-only\";\n\ttier?: import(\"../../shared/types.ts\").ChildTier;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: import(\"../../shared/types.ts\").ModelSelection;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// Give the first child a small head start for prompt-cache creation. All\n// siblings share this one deadline, even when bounded workers reuse slots.\nexport const PARALLEL_COLD_START_ALLOWANCE_MS = 1000;\n\n/** Run-wide concurrency cap, with removable waits for cancelled launches. */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(signal?: AbortSignal): Promise<void> {\n\t\tsignal?.throwIfAborted();\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst grant = () => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst abort = () => {\n\t\t\t\tconst index = this.queue.indexOf(grant);\n\t\t\t\tif (index !== -1) this.queue.splice(index, 1);\n\t\t\t\treject(signal?.reason);\n\t\t\t};\n\t\t\tthis.queue.push(grant);\n\t\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) next();\n\t\telse this.available++;\n\t}\n}\n\nfunction waitForLaunch(delayMs: number, signal?: AbortSignal): Promise<void> {\n\tsignal?.throwIfAborted();\n\tif (delayMs <= 0) return Promise.resolve();\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\tresolve();\n\t\t}, delayMs);\n\t\tconst abort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(signal?.reason);\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t});\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n\tcancellation?: { signal?: AbortSignal; onAbort: (item: T, i: number) => R },\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tconst launchDeadline = Date.now() + (safeLimit > 1 ? PARALLEL_COLD_START_ALLOWANCE_MS : 0);\n\tconst signal = cancellation?.signal;\n\tlet launchReady: Promise<void> | undefined;\n\tlet next = 0;\n\n\tasync function worker(): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tlet acquired = false;\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tawait (i === 0 ? waitForLaunch(0, signal) : launchReady ??= waitForLaunch(launchDeadline - Date.now(), signal));\n\t\t\t\t\tif (globalSemaphore) {\n\t\t\t\t\t\tawait globalSemaphore.acquire(signal);\n\t\t\t\t\t\tacquired = true;\n\t\t\t\t\t}\n\t\t\t\t\tsignal?.throwIfAborted();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!signal?.aborted || !cancellation) throw error;\n\t\t\t\t\tresults[i] = cancellation.onAbort(items[i], i);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t} finally {\n\t\t\t\tif (acquired) globalSemaphore!.release();\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(Array.from({ length: Math.min(safeLimit, items.length) }, () => worker()));\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\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)
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/utils.ts"],"names":[],"mappings":"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","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.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/utils.ts"],"names":[],"mappings":"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","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"]}