@ashx-j/lunr 0.2.26 → 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 (639) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/LICENSE +22 -0
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +1 -1
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
  8. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  9. package/dist/builtin-extensions/ashxj-tui.js +6 -10
  10. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  11. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  12. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  13. package/dist/builtin-extensions/lunr-cron.js +94 -108
  14. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  15. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  16. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  17. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  18. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  19. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  20. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  21. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  22. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  23. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  24. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  27. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  28. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  29. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  30. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  31. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  33. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  34. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  36. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  38. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  40. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  41. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  42. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  43. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  45. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  47. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  48. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  49. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  50. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  51. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  57. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  58. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  60. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  61. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  62. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  63. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  64. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  67. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  70. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  71. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  73. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  74. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  76. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  78. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  80. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  81. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  82. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  83. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  89. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  91. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  93. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  94. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  95. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  96. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  97. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  98. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  99. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  101. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  102. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  103. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  104. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  105. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  106. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  108. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  109. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  110. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  112. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  115. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  116. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  117. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  118. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
  120. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  121. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
  122. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  125. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  127. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +10 -2
  128. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +8 -1
  131. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  132. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +106 -24
  134. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  136. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
  137. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  139. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  141. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  143. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  145. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  146. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  149. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  152. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -1
  154. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +17 -8
  156. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  158. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  159. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  160. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  161. package/dist/builtin-extensions/pi-tps.js +20 -17
  162. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  163. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  164. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  165. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  166. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  167. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  168. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  169. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  170. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  171. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  172. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  173. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  174. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  175. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  176. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  177. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  178. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  179. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  180. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  181. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  182. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  183. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  184. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  185. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  186. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  188. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  189. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  190. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  191. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  192. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  193. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  194. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  195. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  196. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  197. package/dist/cli/install-cli.d.ts.map +1 -1
  198. package/dist/cli/install-cli.js +38 -30
  199. package/dist/cli/install-cli.js.map +1 -1
  200. package/dist/core/agent-session-runtime.d.ts +13 -0
  201. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  202. package/dist/core/agent-session-runtime.js +75 -11
  203. package/dist/core/agent-session-runtime.js.map +1 -1
  204. package/dist/core/agent-session-services.d.ts +1 -0
  205. package/dist/core/agent-session-services.d.ts.map +1 -1
  206. package/dist/core/agent-session-services.js +1 -0
  207. package/dist/core/agent-session-services.js.map +1 -1
  208. package/dist/core/agent-session.d.ts +40 -6
  209. package/dist/core/agent-session.d.ts.map +1 -1
  210. package/dist/core/agent-session.js +309 -76
  211. package/dist/core/agent-session.js.map +1 -1
  212. package/dist/core/browser/runtime.d.ts +2 -0
  213. package/dist/core/browser/runtime.d.ts.map +1 -1
  214. package/dist/core/browser/runtime.js +80 -45
  215. package/dist/core/browser/runtime.js.map +1 -1
  216. package/dist/core/browser/setup.d.ts.map +1 -1
  217. package/dist/core/browser/setup.js +12 -1
  218. package/dist/core/browser/setup.js.map +1 -1
  219. package/dist/core/computer-use/adapter.d.ts.map +1 -1
  220. package/dist/core/computer-use/adapter.js +7 -2
  221. package/dist/core/computer-use/adapter.js.map +1 -1
  222. package/dist/core/computer-use/image.d.ts.map +1 -1
  223. package/dist/core/computer-use/image.js +17 -5
  224. package/dist/core/computer-use/image.js.map +1 -1
  225. package/dist/core/computer-use/schemas.d.ts.map +1 -1
  226. package/dist/core/computer-use/schemas.js +23 -6
  227. package/dist/core/computer-use/schemas.js.map +1 -1
  228. package/dist/core/computer-use/workflow.d.ts.map +1 -1
  229. package/dist/core/computer-use/workflow.js +459 -119
  230. package/dist/core/computer-use/workflow.js.map +1 -1
  231. package/dist/core/cron/jobs.d.ts +26 -8
  232. package/dist/core/cron/jobs.d.ts.map +1 -1
  233. package/dist/core/cron/jobs.js +357 -232
  234. package/dist/core/cron/jobs.js.map +1 -1
  235. package/dist/core/cron/origin-context.d.ts +1 -0
  236. package/dist/core/cron/origin-context.d.ts.map +1 -1
  237. package/dist/core/cron/origin-context.js.map +1 -1
  238. package/dist/core/cron/scheduler.d.ts +22 -17
  239. package/dist/core/cron/scheduler.d.ts.map +1 -1
  240. package/dist/core/cron/scheduler.js +153 -73
  241. package/dist/core/cron/scheduler.js.map +1 -1
  242. package/dist/core/extensions/index.d.ts +1 -1
  243. package/dist/core/extensions/index.d.ts.map +1 -1
  244. package/dist/core/extensions/index.js.map +1 -1
  245. package/dist/core/extensions/runner.d.ts +1 -0
  246. package/dist/core/extensions/runner.d.ts.map +1 -1
  247. package/dist/core/extensions/runner.js +8 -0
  248. package/dist/core/extensions/runner.js.map +1 -1
  249. package/dist/core/extensions/types.d.ts +8 -0
  250. package/dist/core/extensions/types.d.ts.map +1 -1
  251. package/dist/core/extensions/types.js.map +1 -1
  252. package/dist/core/footer-data-provider.d.ts +4 -0
  253. package/dist/core/footer-data-provider.d.ts.map +1 -1
  254. package/dist/core/footer-data-provider.js +22 -1
  255. package/dist/core/footer-data-provider.js.map +1 -1
  256. package/dist/core/large-subagent-launch.d.ts +1 -1
  257. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  258. package/dist/core/large-subagent-launch.js +7 -7
  259. package/dist/core/large-subagent-launch.js.map +1 -1
  260. package/dist/core/model-registry.d.ts +2 -0
  261. package/dist/core/model-registry.d.ts.map +1 -1
  262. package/dist/core/model-registry.js +5 -0
  263. package/dist/core/model-registry.js.map +1 -1
  264. package/dist/core/model-runtime.d.ts +4 -1
  265. package/dist/core/model-runtime.d.ts.map +1 -1
  266. package/dist/core/model-runtime.js +40 -4
  267. package/dist/core/model-runtime.js.map +1 -1
  268. package/dist/core/package-manager.d.ts.map +1 -1
  269. package/dist/core/package-manager.js.map +1 -1
  270. package/dist/core/permissions.d.ts +3 -3
  271. package/dist/core/permissions.d.ts.map +1 -1
  272. package/dist/core/permissions.js +11 -35
  273. package/dist/core/permissions.js.map +1 -1
  274. package/dist/core/plan-mode.d.ts +5 -13
  275. package/dist/core/plan-mode.d.ts.map +1 -1
  276. package/dist/core/plan-mode.js +126 -116
  277. package/dist/core/plan-mode.js.map +1 -1
  278. package/dist/core/project-trust.d.ts.map +1 -1
  279. package/dist/core/project-trust.js +1 -1
  280. package/dist/core/project-trust.js.map +1 -1
  281. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  282. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  283. package/dist/core/prompt-resource-bridge.js +9 -0
  284. package/dist/core/prompt-resource-bridge.js.map +1 -0
  285. package/dist/core/protected-targets.d.ts +6 -0
  286. package/dist/core/protected-targets.d.ts.map +1 -0
  287. package/dist/core/protected-targets.js +45 -0
  288. package/dist/core/protected-targets.js.map +1 -0
  289. package/dist/core/resource-loader.d.ts.map +1 -1
  290. package/dist/core/resource-loader.js +7 -0
  291. package/dist/core/resource-loader.js.map +1 -1
  292. package/dist/core/rollback.d.ts +19 -3
  293. package/dist/core/rollback.d.ts.map +1 -1
  294. package/dist/core/rollback.js +172 -56
  295. package/dist/core/rollback.js.map +1 -1
  296. package/dist/core/runtime-credentials.d.ts +3 -0
  297. package/dist/core/runtime-credentials.d.ts.map +1 -1
  298. package/dist/core/runtime-credentials.js +14 -1
  299. package/dist/core/runtime-credentials.js.map +1 -1
  300. package/dist/core/sdk.d.ts +3 -0
  301. package/dist/core/sdk.d.ts.map +1 -1
  302. package/dist/core/sdk.js +1 -0
  303. package/dist/core/sdk.js.map +1 -1
  304. package/dist/core/session-manager.d.ts +6 -0
  305. package/dist/core/session-manager.d.ts.map +1 -1
  306. package/dist/core/session-manager.js +95 -32
  307. package/dist/core/session-manager.js.map +1 -1
  308. package/dist/core/session-ownership.d.ts.map +1 -1
  309. package/dist/core/session-ownership.js +8 -3
  310. package/dist/core/session-ownership.js.map +1 -1
  311. package/dist/core/session-retention.d.ts.map +1 -1
  312. package/dist/core/session-retention.js +18 -7
  313. package/dist/core/session-retention.js.map +1 -1
  314. package/dist/core/session-startup-settings.d.ts +10 -0
  315. package/dist/core/session-startup-settings.d.ts.map +1 -0
  316. package/dist/core/session-startup-settings.js +70 -0
  317. package/dist/core/session-startup-settings.js.map +1 -0
  318. package/dist/core/subscriptions.d.ts +16 -7
  319. package/dist/core/subscriptions.d.ts.map +1 -1
  320. package/dist/core/subscriptions.js +96 -55
  321. package/dist/core/subscriptions.js.map +1 -1
  322. package/dist/core/trust-manager.d.ts +2 -1
  323. package/dist/core/trust-manager.d.ts.map +1 -1
  324. package/dist/core/trust-manager.js +6 -1
  325. package/dist/core/trust-manager.js.map +1 -1
  326. package/dist/core/update-check.d.ts.map +1 -1
  327. package/dist/core/update-check.js.map +1 -1
  328. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  329. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  330. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  331. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  332. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  333. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  334. package/dist/core/usage-adapters/openai-codex.js +3 -3
  335. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  336. package/dist/core/usage-adapters/xai.d.ts +2 -2
  337. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  338. package/dist/core/usage-adapters/xai.js +3 -3
  339. package/dist/core/usage-adapters/xai.js.map +1 -1
  340. package/dist/core/usage-adapters/zai.d.ts +2 -2
  341. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  342. package/dist/core/usage-adapters/zai.js +2 -2
  343. package/dist/core/usage-adapters/zai.js.map +1 -1
  344. package/dist/core/usage-service.d.ts +9 -2
  345. package/dist/core/usage-service.d.ts.map +1 -1
  346. package/dist/core/usage-service.js +95 -50
  347. package/dist/core/usage-service.js.map +1 -1
  348. package/dist/gateway/agent-bridge.d.ts +9 -1
  349. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  350. package/dist/gateway/agent-bridge.js +91 -37
  351. package/dist/gateway/agent-bridge.js.map +1 -1
  352. package/dist/gateway/buttons.d.ts +8 -1
  353. package/dist/gateway/buttons.d.ts.map +1 -1
  354. package/dist/gateway/buttons.js +76 -18
  355. package/dist/gateway/buttons.js.map +1 -1
  356. package/dist/gateway/commands.d.ts +1 -0
  357. package/dist/gateway/commands.d.ts.map +1 -1
  358. package/dist/gateway/commands.js +10 -4
  359. package/dist/gateway/commands.js.map +1 -1
  360. package/dist/gateway/cron.d.ts +12 -11
  361. package/dist/gateway/cron.d.ts.map +1 -1
  362. package/dist/gateway/cron.js +65 -56
  363. package/dist/gateway/cron.js.map +1 -1
  364. package/dist/gateway/index.d.ts.map +1 -1
  365. package/dist/gateway/index.js +2 -1
  366. package/dist/gateway/index.js.map +1 -1
  367. package/dist/gateway/mobile-commands.d.ts +1 -0
  368. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  369. package/dist/gateway/mobile-commands.js +56 -14
  370. package/dist/gateway/mobile-commands.js.map +1 -1
  371. package/dist/gateway/presenter.d.ts +12 -2
  372. package/dist/gateway/presenter.d.ts.map +1 -1
  373. package/dist/gateway/presenter.js +73 -38
  374. package/dist/gateway/presenter.js.map +1 -1
  375. package/dist/gateway/router.d.ts +2 -2
  376. package/dist/gateway/router.d.ts.map +1 -1
  377. package/dist/gateway/router.js +17 -2
  378. package/dist/gateway/router.js.map +1 -1
  379. package/dist/gateway/service.d.ts +2 -0
  380. package/dist/gateway/service.d.ts.map +1 -1
  381. package/dist/gateway/service.js +153 -0
  382. package/dist/gateway/service.js.map +1 -1
  383. package/dist/main.d.ts.map +1 -1
  384. package/dist/main.js +86 -33
  385. package/dist/main.js.map +1 -1
  386. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  387. package/dist/modes/interactive/components/assistant-message.js +6 -4
  388. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  389. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  390. package/dist/modes/interactive/components/copyable-text.js +3 -2
  391. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  392. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  393. package/dist/modes/interactive/components/extension-editor.js +1 -1
  394. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  395. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  396. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  397. package/dist/modes/interactive/interactive-mode.js +96 -109
  398. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  399. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  400. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  401. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  402. package/dist/modes/rpc/rpc-mode.js +2 -1
  403. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  404. package/dist/node-runtime/{adapter-VFG7WNPX.js → adapter-247RTYLS.js} +4 -5
  405. package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
  406. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  407. package/dist/node-runtime/{builtin-extensions-I2HIFEMY.js → builtin-extensions-OX6KELNX.js} +8 -7
  408. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  409. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  410. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  411. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  412. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  413. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  414. package/dist/node-runtime/{chunk-SPVDBUOS.js → chunk-6O3IW3IA.js} +2 -2
  415. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  416. package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
  417. package/dist/node-runtime/{chunk-WIF24I7G.js → chunk-APVM5NEU.js} +149 -144
  418. package/dist/node-runtime/{chunk-RCR3XAQY.js → chunk-AYHH7YSD.js} +177 -144
  419. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  420. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  421. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  422. package/dist/node-runtime/{chunk-UVWCDQYF.js → chunk-C3P6Q3B2.js} +455 -278
  423. package/dist/node-runtime/{chunk-SN2KSMPQ.js → chunk-DQSCFU7R.js} +13 -7
  424. package/dist/node-runtime/{chunk-4SBQAI4T.js → chunk-EBLAZVSA.js} +2058 -73
  425. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
  426. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  427. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  428. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  429. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  430. package/dist/node-runtime/{chunk-IKU6Y7DL.js → chunk-FE3WZI7F.js} +9 -6
  431. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
  432. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  433. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  434. package/dist/node-runtime/{chunk-RGQAEOM5.js → chunk-FYIFPFXE.js} +23 -6
  435. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  436. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  437. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  438. package/dist/node-runtime/{chunk-I74LN5JG.js → chunk-HUD2RFJW.js} +2 -2
  439. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
  440. package/dist/node-runtime/{chunk-XHIRAZ26.js → chunk-IAZSK7KK.js} +1 -1
  441. package/dist/node-runtime/{chunk-X3PGBLQ7.js → chunk-IHHTWSXN.js} +9 -9
  442. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  443. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  444. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  445. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
  446. package/dist/node-runtime/{chunk-L24TPBS4.js → chunk-JWEVT363.js} +37 -29
  447. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  448. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  449. package/dist/node-runtime/{chunk-T4DA4XE7.js → chunk-MQPKUHRN.js} +162 -82
  450. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  451. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  452. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  453. package/dist/node-runtime/{chunk-P7XBVXGT.js → chunk-QNVMKNNN.js} +18 -14
  454. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  455. package/dist/node-runtime/{chunk-DVQSHCVP.js → chunk-R4WSB2MQ.js} +5 -5
  456. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  457. package/dist/node-runtime/{chunk-2CFDTH5B.js → chunk-RLGY2QIL.js} +45 -59
  458. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  459. package/dist/node-runtime/{chunk-5Q4A37RB.js → chunk-TCT6PCUR.js} +32 -11
  460. package/dist/node-runtime/{chunk-D5UCKPBQ.js → chunk-UBWW2PID.js} +1 -1
  461. package/dist/node-runtime/{chunk-E75WFZ33.js → chunk-UNUZICC4.js} +3 -3
  462. package/dist/node-runtime/{chunk-RAK2QA2B.js → chunk-UYRKUKFE.js} +4 -4
  463. package/dist/node-runtime/{chunk-LWJXTA6Z.js → chunk-VSUEAI7O.js} +1377 -45
  464. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  465. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  466. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  467. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  468. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  469. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  470. package/dist/node-runtime/{chunk-LJTIVM7I.js → chunk-ZDJUR45D.js} +427 -126
  471. package/dist/node-runtime/{chunk-YWOJIGFY.js → chunk-ZEVFBFNF.js} +95 -142
  472. package/dist/node-runtime/{chunk-5B6VKFEV.js → chunk-ZIQUS5QO.js} +1 -1
  473. package/dist/node-runtime/cli-runtime.js +4 -4
  474. package/dist/node-runtime/{command-FSBU2EVZ.js → command-3HMSY6W2.js} +5 -5
  475. package/dist/node-runtime/{commands-EMBQQVVT.js → commands-D6A6H4TS.js} +11 -18
  476. package/dist/node-runtime/{commands-NAAL7KNT.js → commands-OCSSEEWJ.js} +16 -16
  477. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  478. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  479. package/dist/node-runtime/{direct-tool-executor-4D7UXYU4.js → direct-tool-executor-2QJXVQD2.js} +6 -11
  480. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  481. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
  482. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  483. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  484. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  485. package/dist/node-runtime/{gateway-DQM333YV.js → gateway-6623C2U3.js} +51 -42
  486. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  487. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  488. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  489. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
  490. package/dist/node-runtime/index.js +50 -48
  491. package/dist/node-runtime/{init-P5AUV77I.js → init-JBQJIPYI.js} +3 -6
  492. package/dist/node-runtime/{install-cli-NN4YAU44.js → install-cli-INGHIVBY.js} +30 -25
  493. package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
  494. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  495. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  496. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  497. package/dist/node-runtime/{lunr-computer-use-Y23CCDIJ.js → lunr-computer-use-VDP2QNRQ.js} +9 -9
  498. package/dist/node-runtime/{lunr-cron-USHC4LXH.js → lunr-cron-LKVA5CZZ.js} +93 -80
  499. package/dist/node-runtime/main.js +42 -41
  500. package/dist/node-runtime/{mobile-commands-O5LCHL32.js → mobile-commands-XT3NQXLD.js} +12 -12
  501. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  502. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  503. package/dist/node-runtime/{package-manager-cli-Q7BL6KZO.js → package-manager-cli-CYM262SI.js} +20 -20
  504. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  505. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  506. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  507. package/dist/node-runtime/{pi-mcp-adapter-3PHF4KZ4.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  508. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  509. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  510. package/dist/node-runtime/{pi-subagents-7IBSSGEW.js → pi-subagents-LT3CTO4E.js} +98 -106
  511. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  512. package/dist/node-runtime/{print-mode-XQ76CYMT.js → print-mode-2XHN5SUA.js} +3 -3
  513. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  514. package/dist/node-runtime/{proxy-modes-5FAPSZEZ.js → proxy-modes-VEGC6QG5.js} +8 -15
  515. package/dist/node-runtime/rpc-entry.js +42 -41
  516. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  517. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  518. package/dist/node-runtime/{runtime-EFPPD2UW.js → runtime-UGXM4NPQ.js} +2 -2
  519. package/dist/node-runtime/{runtime-bridges-7WVCLI76.js → runtime-bridges-DNKMNJCF.js} +7 -7
  520. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  521. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
  522. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
  523. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  524. package/dist/node-runtime/{settings-manager-DJDM5AHM.js → settings-manager-P2TKGYTR.js} +5 -5
  525. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  526. package/dist/node-runtime/{setup-PFBWRNUI.js → setup-OLQ4GXWS.js} +17 -17
  527. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  528. package/dist/node-runtime/{subagent-executor-LPZ4BHWE.js → subagent-executor-Q5F7DBVM.js} +119 -58
  529. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  530. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  531. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  532. package/dist/node-runtime/{update-cli-HNMOTNGX.js → update-cli-F3XXJANQ.js} +6 -6
  533. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  534. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  535. package/dist/node-runtime/{workflow-OHPBEFO4.js → workflow-ICDI4N3J.js} +208 -78
  536. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  537. package/dist/utils/clipboard-image.d.ts.map +1 -1
  538. package/dist/utils/clipboard-image.js.map +1 -1
  539. package/dist/utils/exif-orientation.d.ts.map +1 -1
  540. package/dist/utils/exif-orientation.js +25 -10
  541. package/dist/utils/exif-orientation.js.map +1 -1
  542. package/dist/utils/image-resize-core.d.ts.map +1 -1
  543. package/dist/utils/image-resize-core.js +2 -0
  544. package/dist/utils/image-resize-core.js.map +1 -1
  545. package/dist/utils/paths.d.ts +4 -0
  546. package/dist/utils/paths.d.ts.map +1 -1
  547. package/dist/utils/paths.js +33 -2
  548. package/dist/utils/paths.js.map +1 -1
  549. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  550. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  551. package/dist/utils/sanitize-terminal-text.js +67 -0
  552. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  553. package/docs/browser.md +1 -1
  554. package/docs/custom-provider.md +3 -3
  555. package/docs/extensions.md +8 -4
  556. package/docs/features.md +15 -7
  557. package/docs/keybindings.md +1 -1
  558. package/docs/models.md +5 -5
  559. package/docs/packages.md +1 -1
  560. package/docs/providers.md +2 -2
  561. package/docs/rpc.md +7 -7
  562. package/docs/security.md +10 -5
  563. package/docs/sessions.md +2 -2
  564. package/docs/skills.md +1 -1
  565. package/docs/terminal-setup.md +7 -7
  566. package/docs/themes.md +1 -1
  567. package/docs/usage.md +1 -1
  568. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  569. package/examples/extensions/bash-spawn-hook.ts +1 -1
  570. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  571. package/examples/extensions/claude-rules.ts +1 -1
  572. package/examples/extensions/commands.ts +1 -1
  573. package/examples/extensions/custom-compaction.ts +1 -1
  574. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  575. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  576. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  577. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  578. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  579. package/examples/extensions/doom-overlay/index.ts +1 -1
  580. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  581. package/examples/extensions/gondolin/index.ts +1 -1
  582. package/examples/extensions/gondolin/package-lock.json +2 -2
  583. package/examples/extensions/gondolin/package.json +1 -1
  584. package/examples/extensions/hidden-thinking-label.ts +1 -1
  585. package/examples/extensions/inline-bash.ts +2 -2
  586. package/examples/extensions/input-transform-streaming.ts +2 -2
  587. package/examples/extensions/input-transform.ts +2 -2
  588. package/examples/extensions/interactive-shell.ts +1 -1
  589. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  590. package/examples/extensions/mac-system-theme.ts +1 -1
  591. package/examples/extensions/minimal-mode.ts +1 -1
  592. package/examples/extensions/modal-editor.ts +1 -1
  593. package/examples/extensions/model-status.ts +1 -1
  594. package/examples/extensions/notify.ts +3 -3
  595. package/examples/extensions/overlay-qa-tests.ts +1 -1
  596. package/examples/extensions/overlay-test.ts +1 -1
  597. package/examples/extensions/pirate.ts +1 -1
  598. package/examples/extensions/preset.ts +3 -3
  599. package/examples/extensions/project-trust.ts +4 -4
  600. package/examples/extensions/prompt-customizer.ts +1 -1
  601. package/examples/extensions/rainbow-editor.ts +1 -1
  602. package/examples/extensions/rpc-demo.ts +1 -1
  603. package/examples/extensions/sandbox/index.ts +7 -7
  604. package/examples/extensions/sandbox/package-lock.json +2 -2
  605. package/examples/extensions/sandbox/package.json +1 -1
  606. package/examples/extensions/shutdown-command.ts +5 -5
  607. package/examples/extensions/ssh.ts +2 -2
  608. package/examples/extensions/subagent/README.md +3 -3
  609. package/examples/extensions/subagent/index.ts +2 -2
  610. package/examples/extensions/titlebar-spinner.ts +1 -1
  611. package/examples/extensions/tool-override.ts +1 -1
  612. package/examples/extensions/tools.ts +1 -1
  613. package/examples/extensions/with-deps/package-lock.json +2 -2
  614. package/examples/extensions/with-deps/package.json +1 -1
  615. package/examples/extensions/working-indicator.ts +1 -1
  616. package/examples/extensions/working-message-test.ts +1 -1
  617. package/examples/sdk/01-minimal.ts +1 -1
  618. package/examples/sdk/03-custom-prompt.ts +1 -1
  619. package/examples/sdk/04-skills.ts +1 -1
  620. package/examples/sdk/06-extensions.ts +2 -2
  621. package/examples/sdk/08-prompt-templates.ts +1 -1
  622. package/install-lock/package-lock.json +24 -24
  623. package/install-lock/package.json +2 -2
  624. package/npm-shrinkwrap.json +60 -24
  625. package/package.json +9 -9
  626. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  627. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  628. package/dist/modes/interactive/components/exit-card.js +0 -69
  629. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  630. package/dist/node-runtime/agent-session-services-5YXS2PLF.js +0 -51
  631. package/dist/node-runtime/chunk-2IDTZAG5.js +0 -1415
  632. package/dist/node-runtime/chunk-3MISGG4S.js +0 -769
  633. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  634. package/dist/node-runtime/chunk-5B5QN3ZQ.js +0 -356
  635. package/dist/node-runtime/chunk-7IQGBKBJ.js +0 -2033
  636. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  637. package/dist/node-runtime/chunk-PTFBPO3C.js +0 -50
  638. package/dist/node-runtime/interactive-mode-YOHZVMKX.js +0 -74
  639. package/dist/node-runtime/mcp-auth-flow-QVLFVLEO.js +0 -33
@@ -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":"AAAA,cAAc;AACd;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,wFAAsF;AACtF,oFAAoF;AACpF,MAAM,uBAAuB,GAAG,OAAO,CAAC;AACxC,MAAM,4BAA4B,GAAG,iCAAiC,CAAC;AACvE,MAAM,CAAC,MAAM,gCAAgC,GAAG,2CAA2C,CAAC;AAE5F,MAAM,UAAU,gBAAgB,CAC/B,SAAiB,EACjB,cAAc,GAAiC,EAAE,CAAC,YAAY,CAAC,MAAM,EAC5D;IACT,mFAAmF;IACnF,IAAI,CAAC;QACJ,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AAAA,CACD;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAsB;IAC/D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACrE;AAED,SAAS,gCAAgC,CAAC,WAA+B,EAAsB;IAC9F,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAGtF,CAAC;QACF,IAAI,GAAG,CAAC,IAAI,KAAK,4BAA4B;YAAE,OAAO,SAAS,CAAC;QAChE,OAAO,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AAAA,CACD;AAED,SAAS,mCAAmC,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAAsB;IAC3J,MAAM,gBAAgB,GAAG,gCAAgC,CAAC,WAAW,CAAC,CAAC;IACvE,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,CAAC;QACJ,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,OAAO,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,gCAAgC,CAAC,GAAG,CAAC,CAAC;YACpD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,+EAA+E;IAChF,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,MAAM,UAAU,oBAAoB,CAAC,iBAA2B,EAAE,UAAmB,EAAE,WAAoB,EAAU;IACpH,MAAM,WAAW,GAAG,iBAAiB,IAAI,OAAO,iBAAiB,KAAK,QAAQ;QAC7E,CAAC,CAAC,kBAAkB,CAAE,iBAAmD,CAAC,eAAe,CAAC;QAC1F,CAAC,CAAC,SAAS,CAAC;IACb,OAAO,WAAW;WACd,mCAAmC,CAAC,UAAU,EAAE,WAAW,CAAC;WAC5D,uBAAuB,CAAC;AAAA,CAC5B;AAED,MAAM,UAAU,gBAAgB,GAAW;IAC1C,OAAO,oBAAoB,EAAE,CAAC;AAAA,CAC9B;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAU;IAChE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAAA,CAClD;AAED,MAAM,UAAU,WAAW,GAAW;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACnD,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IAC5C,IAAI,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,OAAO,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,CAAC;AAAA,CAC1E;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkD,CAAC;AAE9E,SAAS,eAAe,CAAC,KAAc,EAAU;IAChD,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,CAC9D;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,QAA4B,EAAU;IACtF,IAAI,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,CAC9E;AAED,SAAS,eAAe,CAAC,KAAc,EAAW;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ;WAC5B,KAAK,KAAK,IAAI;WACd,MAAM,IAAI,KAAK;WACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC;AAAA,CACvD;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAsB;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEtD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACJ,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,MAAM,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE;YACjG,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACjD,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACJ,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,MAAM,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE;YAC9F,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACjD,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,sCAAsC,UAAU,MAAM,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE;YAC/F,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACjD,CAAC,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,WAAW,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACjD,IAAI,QAAQ;YAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAA4D,CAAC;AAE5F;;GAEG;AACH,SAAS,aAAa,CAAC,UAA8B,EAAE,QAAQ,GAAW,CAAC,EAAY;IACtF,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,IAAI,EAAE,GAAkB,IAAI,CAAC;IAC7B,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1E,OAAO,MAAM,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;QACjD,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEpG,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,IAAI,eAAe,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACrD,IAAI,QAAQ;gBAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACR,wFAAwF;QACxF,OAAO,EAAE,CAAC;IACX,CAAC;YAAS,CAAC;QACV,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC;gBACJ,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACR,yFAAyF;YAC1F,CAAC;QACF,CAAC;IACF,CAAC;AAAA,CACD;AAED;;GAEG;AACF,MAAM,UAAU,eAAe,CAAC,UAA8B,EAAU;IACxE,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,GAAG,GAAG,IAAI;YAAE,OAAO,YAAY,CAAC;QACpC,IAAI,GAAG,GAAG,KAAK;YAAE,OAAO,UAAU,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QAChE,OAAO,UAAU,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACR,gFAAgF;QAChF,OAAO,EAAE,CAAC;IACX,CAAC;AAAA,CACD;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAiB;IACxE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC1C,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO;SACpC,CAAC;IAAA,CACF,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAAA,CAC/C;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAa,EAAE,MAAc,EAAiC;IAClF,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACjE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,CACxB;AAED,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAmB,EAAU;IAC3D,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QACvC,MAAM,iBAAiB,GAAG,CAAC,cAAc,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;eACpH,CAAC,YAAY,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC;QACxD,IAAI,iBAAiB;YAAE,SAAS;QAChC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO;aAC7B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aACrE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACpE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,0CAA0C,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,WAAW,CAAC;YACnF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,6CAA6C,CAAC,EAAE,CAAC;gBACvF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,qRAAqR,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjW,OAAO,WAAW,CAAC;gBACpB,CAAC;YACF,CAAC;YACD,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,WAAW,CAAC;QAClE,CAAC;IACF,CAAC;IACD,OAAO,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,CAC/B;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAsD,EAAU;IACrG,OAAO,MAAM,CAAC,WAAW,IAAI,cAAc,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAAA,CACnE;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAA+B,EAAiB;IAC/E,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;qBACnE,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACxG,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,wBAAwB,CAAC,QAAuB,EAAiB;IACzE,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACnD,OAAO;QACN,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,EAAE;KAChB,CAAC;AAAA,CACF;AAED,SAAS,wBAAwB,CAAC,QAA+B,EAAqB;IACrF,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QACvC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;gBAAE,SAAS;YACvC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC3G,CAAC,CAAC,IAAI,CAAC,SAAS;gBAChB,CAAC,CAAC,EAAE,CAAC;YACN,SAAS,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;gBACrC,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;aACnD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,MAAM,UAAU,eAAe,CAAC,OAAuB,EAAS;IAC/D,MAAM,KAAK,GAAU,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC7F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAClC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACpC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAC1C,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QAC5C,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAChC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,aAAa,CAAC,KAAwC,EAAE,QAAwC,EAAQ;IAChH,KAAK,MAAM,KAAK,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC;YACjD,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;YACnD,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC;YACzC,SAAS;QACV,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE;YAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3E,CAAC;AAAA,CACD;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAqC;IAC1F,MAAM,KAAK,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC9D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QACxC,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1C,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAoB,EAAgB;IAC3E,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1G,OAAO;QACN,GAAG,MAAM;QACT,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACnD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgB,EAAW;IACnE,OAAO;QACN,GAAG,OAAO;QACV,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACrD,QAAQ,EAAE,OAAO,CAAC,QAAQ;YACzB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,wBAAwB,CAAC;YAChD,CAAC,CAAC,SAAS;KACZ,CAAC;AAAA,CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAmB,EAAa;IACnE,IAAI,sBAAsB,GAAG,CAAC,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAC7D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACjG,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACb,sBAAsB,GAAG,CAAC,CAAC;gBAC3B,MAAM;YACP,CAAC;QACF,CAAC;IACF,CAAC;IAED,MAAM,SAAS,GAAG,sBAAsB,IAAI,CAAC,CAAC,CAAC,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/E,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;YAAE,SAAS;QACxC,MAAM,QAAQ,GAAG,UAAU,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,MAAM,OAAO,GAAG,SAAS,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;QAEzD,IAAI,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,MAAM,SAAS,GAAG,OAAO,EAAE,KAAK,CAAC,8DAA8D,CAAC,CAAC;YACjG,OAAO;gBACN,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,SAAS,EAAE,QAAQ,IAAI,MAAM;gBAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aAC/B,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,KAAK,MAAM;YAAE,SAAS;QAElC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;YAAE,SAAS;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QAEzB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC/F,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC7F,CAAC;QACF,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,MAAM,aAAa,GAAG;YACrB,oBAAoB;YACpB,oBAAoB;YACpB,4BAA4B;YAC5B,qBAAqB;YACrB,oBAAoB;YACpB,gBAAgB;YAChB,qBAAqB;YACrB,UAAU;SACV,CAAC;QACF,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC1F,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAAA,CAC3B;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAA6B,EAAU;IAC7E,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,SAAiB,EAAU,EAAE,CACpE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAE1E,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAAsB,EAAE,CAAC;QACrE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACvE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QAClF,OAAO,SAAS,CAAC;IAAA,CACjB,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAsB,EAAE,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAClE,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;IAAA,CAC3B,CAAC;IAEF,gDAAgD;IAChD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,cAAc;QAAE,OAAO,eAAe,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3G,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,YAAY,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;IAElI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrG,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,WAAW;QAAE,OAAO,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE9G,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC9G,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAW,CAAC;YAClC,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,YAAY;YAAE,OAAO,GAAG,GAAG,IAAI,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC;QACvE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,OAAO,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;QAC5B,CAAC;IACF,CAAC;IACD,OAAO,EAAE,CAAC;AAAA,CACV;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAU;IAChE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,iCAAiC;IACjC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,uBAAuB;IACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,uCAAuC;YACvC,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC9D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,iDAAiD;iBAC5C,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBAC7E,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnD,IAAI,KAAK;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YACD,sCAAsC;iBACjC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACxB;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,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.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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-workflows.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/slash/prompt-workflows.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAIlF,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,WAAW,CAAC;IAClC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,KAAK,oBAAoB,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAuFjG,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAOrE;AAgDD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAwC9K;AAmDD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACrD,EAAE,EAAE,YAAY,CAAC;IACjB,GAAG,EAAE,oBAAoB,CAAC;CAC1B,GAAG,IAAI,CAgEP","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport { parseFrontmatter } from \"../agents/frontmatter.ts\";\nimport type { SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport type { ChainStep } from \"../shared/settings.ts\";\nimport { getAgentDir, getProjectConfigDir } from \"../shared/utils.ts\";\n\ninterface PromptWorkflow {\n\tname: string;\n\tdescription: string;\n\tbody: string;\n\tfilePath: string;\n\tchildDescription: string;\n\tpermissions: \"full\" | \"read-only\";\n\ttier: \"light\" | \"standard\" | \"heavy\";\n\tskill?: string | string[] | false;\n\tcwd?: string;\n\tworktree?: boolean;\n\tchain?: string;\n}\n\ntype PromptWorkflowRunner = (params: SubagentParamsLike, ctx: ExtensionContext) => Promise<void>;\n\nconst RESERVED_COMMAND_NAMES = new Set([\n\t\"chain-prompts\",\n\t\"prompt-workflow\",\n\t\"run\",\n\t\"chain\",\n\t\"parallel\",\n\t\"subagents-doctor\",\n]);\n\nfunction packagePromptsDir(): string {\n\treturn path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"prompts\");\n}\n\nfunction promptDirs(cwd: string): string[] {\n\treturn [\n\t\tpackagePromptsDir(),\n\t\tpath.join(getAgentDir(), \"prompts\"),\n\t\tpath.join(getProjectConfigDir(cwd), \"prompts\"),\n\t];\n}\n\nfunction readPromptFiles(cwd: string): string[] {\n\tconst files: string[] = [];\n\tfor (const dir of promptDirs(cwd)) {\n\t\tlet entries: fs.Dirent[];\n\t\ttry {\n\t\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isFile() && entry.name.endsWith(\".md\")) files.push(path.join(dir, entry.name));\n\t\t}\n\t}\n\treturn files;\n}\n\nfunction firstNonEmptyLine(value: string): string {\n\treturn value.split(/\\r?\\n/).map((line) => line.trim()).find(Boolean) ?? \"Prompt workflow\";\n}\n\nfunction stringField(frontmatter: Record<string, string>, key: string): string | undefined {\n\tconst value = frontmatter[key]?.trim();\n\treturn value ? value : undefined;\n}\n\nfunction booleanField(frontmatter: Record<string, string>, key: string): boolean | undefined {\n\tconst value = frontmatter[key]?.trim().toLowerCase();\n\tif (value === \"true\" || value === \"yes\" || value === \"1\") return true;\n\tif (value === \"false\" || value === \"no\" || value === \"0\") return false;\n\treturn undefined;\n}\n\nfunction parseSkill(value: string | undefined): string | string[] | false | undefined {\n\tif (!value) return undefined;\n\tif (value === \"false\") return false;\n\tconst parts = value.split(\",\").map((part) => part.trim()).filter(Boolean);\n\treturn parts.length > 1 ? parts : parts[0];\n}\n\nfunction loadPromptWorkflow(filePath: string): PromptWorkflow | undefined {\n\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\tconst { frontmatter, body } = parseFrontmatter(content);\n\tconst name = path.basename(filePath, \".md\");\n\tif (!name || RESERVED_COMMAND_NAMES.has(name)) return undefined;\n\tconst tierValue = stringField(frontmatter, \"tier\");\n\tif (tierValue !== \"light\" && tierValue !== \"standard\" && tierValue !== \"heavy\") return undefined;\n\tconst skill = parseSkill(stringField(frontmatter, \"skill\"));\n\tconst cwd = stringField(frontmatter, \"cwd\");\n\tconst chain = stringField(frontmatter, \"chain\");\n\treturn {\n\t\tname,\n\t\tdescription: stringField(frontmatter, \"description\") ?? firstNonEmptyLine(body),\n\t\tbody,\n\t\tfilePath,\n\t\tchildDescription: stringField(frontmatter, \"child-description\") ?? name,\n\t\tpermissions: stringField(frontmatter, \"permissions\") === \"read-only\" ? \"read-only\" : \"full\",\n\t\ttier: tierValue,\n\t\t...(skill !== undefined ? { skill } : {}),\n\t\t...(cwd ? { cwd } : {}),\n\t\t...(booleanField(frontmatter, \"worktree\") === true ? { worktree: true } : {}),\n\t\t...(chain ? { chain } : {}),\n\t};\n}\n\nexport function discoverPromptWorkflows(cwd: string): PromptWorkflow[] {\n\tconst workflows = new Map<string, PromptWorkflow>();\n\tfor (const file of readPromptFiles(cwd)) {\n\t\tconst workflow = loadPromptWorkflow(file);\n\t\tif (workflow) workflows.set(workflow.name, workflow);\n\t}\n\treturn [...workflows.values()].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction shellWords(input: string): string[] {\n\tconst words: string[] = [];\n\tlet current = \"\";\n\tlet quote: \"'\" | '\"' | undefined;\n\tlet escaped = false;\n\tfor (const ch of input) {\n\t\tif (escaped) {\n\t\t\tcurrent += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\") {\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (quote) {\n\t\t\tif (ch === quote) quote = undefined;\n\t\t\telse current += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"'\" || ch === '\"') {\n\t\t\tquote = ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/\\s/.test(ch)) {\n\t\t\tif (current) {\n\t\t\t\twords.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent += ch;\n\t}\n\tif (current) words.push(current);\n\treturn words;\n}\n\nfunction substituteArgs(template: string, args: string[]): string {\n\tconst all = args.join(\" \");\n\treturn template\n\t\t.replace(/\\$ARGUMENTS/g, all)\n\t\t.replace(/\\$@/g, all)\n\t\t.replace(/\\$\\{(\\d+):-([^}]*)\\}/g, (_match, index: string, fallback: string) => args[Number(index) - 1] || fallback)\n\t\t.replace(/\\$(\\d+)/g, (_match, index: string) => args[Number(index) - 1] ?? \"\");\n}\n\nexport function parseRuntimeOptions(words: string[]): { args: string[]; descriptionOverride?: string; permissions?: \"full\" | \"read-only\"; worktree?: boolean; async?: boolean } {\n\tconst args: string[] = [];\n\tlet descriptionOverride: string | undefined;\n\tlet permissions: \"full\" | \"read-only\" | undefined;\n\tlet worktree = false;\n\tlet async: boolean | undefined;\n\tfor (let i = 0; i < words.length; i++) {\n\t\tconst word = words[i]!;\n\t\tif (word === \"--read-only\") {\n\t\t\tpermissions = \"read-only\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--full\") {\n\t\t\tpermissions = \"full\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--worktree\") {\n\t\t\tworktree = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--bg\" || word === \"--async\") {\n\t\t\tasync = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--fg\" || word === \"--foreground\") {\n\t\t\tasync = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--description\") {\n\t\t\tdescriptionOverride = words[++i];\n\t\t\tcontinue;\n\t\t}\n\t\tconst eq = word.match(/^--description(?:=|:)(.+)$/);\n\t\tif (eq) {\n\t\t\tdescriptionOverride = eq[1];\n\t\t\tcontinue;\n\t\t}\n\t\targs.push(word);\n\t}\n\treturn { args, descriptionOverride, permissions, worktree, async };\n}\n\nfunction splitChainDeclaration(input: string): { declaration: string; argsText: string } {\n\tconst delimiter = input.indexOf(\" -- \");\n\tif (delimiter === -1) return { declaration: input.trim(), argsText: \"\" };\n\treturn { declaration: input.slice(0, delimiter).trim(), argsText: input.slice(delimiter + 4).trim() };\n}\n\nfunction splitPromptChain(input: string): string[] {\n\treturn input.split(\" -> \").map((part) => part.trim()).filter(Boolean);\n}\n\nfunction workflowParams(workflow: PromptWorkflow, args: string[], runtime: ReturnType<typeof parseRuntimeOptions>): SubagentParamsLike {\n\tconst task = substituteArgs(workflow.body, args).trim();\n\treturn {\n\t\ttask,\n\t\tdescription: runtime.descriptionOverride ?? workflow.childDescription,\n\t\tpermissions: runtime.permissions ?? workflow.permissions,\n\t\ttier: workflow.tier,\n\t\tclarify: false,\n\t\t...(workflow.skill !== undefined ? { skill: workflow.skill } : {}),\n\t\t...(workflow.cwd ? { cwd: workflow.cwd } : {}),\n\t\t...(runtime.worktree || workflow.worktree ? { worktree: true } : {}),\n\t\t...(runtime.async !== undefined ? { async: runtime.async } : {}),\n\t};\n}\n\nfunction workflowChainStep(workflow: PromptWorkflow, args: string[], runtime: ReturnType<typeof parseRuntimeOptions>): ChainStep {\n\tconst params = workflowParams(workflow, args, runtime);\n\treturn {\n\t\tdescription: params.description ?? workflow.childDescription,\n\t\tpermissions: params.permissions ?? workflow.permissions,\n\t\ttier: params.tier,\n\t\ttask: params.task,\n\t\t...(params.skill !== undefined ? { skill: params.skill } : {}),\n\t\t...(params.cwd ? { cwd: params.cwd } : {}),\n\t};\n}\n\nfunction findWorkflow(workflows: PromptWorkflow[], name: string): PromptWorkflow | undefined {\n\treturn workflows.find((workflow) => workflow.name === name);\n}\n\nfunction formatWorkflowList(workflows: PromptWorkflow[]): string {\n\tif (workflows.length === 0) return \"No prompt workflows found in package, user, or project prompts.\";\n\treturn [\n\t\t\"Prompt workflows:\",\n\t\t...workflows.map((workflow) => `- ${workflow.name}: ${workflow.description} (${workflow.filePath})`),\n\t].join(\"\\n\");\n}\n\nexport function registerPromptWorkflowCommands(input: {\n\tpi: ExtensionAPI;\n\trun: PromptWorkflowRunner;\n}): void {\n\tconst { pi, run } = input;\n\n\tpi.registerCommand(\"prompt-workflow\", {\n\t\tdescription: \"Run a prompt template through lunR subagents: /prompt-workflow <name> [args]\",\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\tconst words = shellWords(rawArgs);\n\t\t\tconst name = words.shift();\n\t\t\tconst workflows = discoverPromptWorkflows(ctx.cwd);\n\t\t\tif (!name || name === \"list\") {\n\t\t\t\tpi.sendMessage({ content: formatWorkflowList(workflows), display: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst workflow = findWorkflow(workflows, name);\n\t\t\tif (!workflow) {\n\t\t\t\tctx.ui.notify(`Unknown prompt workflow: ${name}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst runtime = parseRuntimeOptions(words);\n\t\t\ttry {\n\t\t\t\tif (workflow.chain) {\n\t\t\t\t\tconst chainNames = splitPromptChain(workflow.chain);\n\t\t\t\t\tconst chain = chainNames.map((stepName) => {\n\t\t\t\t\t\tconst step = findWorkflow(workflows, stepName);\n\t\t\t\t\t\tif (!step) throw new Error(`Unknown prompt workflow in chain '${workflow.name}': ${stepName}`);\n\t\t\t\t\t\treturn workflowChainStep(step, runtime.args, runtime);\n\t\t\t\t\t});\n\t\t\t\t\tawait run({ chain, task: runtime.args.join(\" \"), clarify: false, ...(runtime.async !== undefined ? { async: runtime.async } : {}) }, ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait run(workflowParams(workflow, runtime.args, runtime), ctx);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.registerCommand(\"chain-prompts\", {\n\t\tdescription: \"Run prompt templates as a native subagent chain: /chain-prompts analyze -> fix -- args\",\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\tconst { declaration, argsText } = splitChainDeclaration(rawArgs);\n\t\t\tconst workflows = discoverPromptWorkflows(ctx.cwd);\n\t\t\tif (!declaration || declaration === \"list\") {\n\t\t\t\tpi.sendMessage({ content: formatWorkflowList(workflows), display: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst runtime = parseRuntimeOptions(shellWords(argsText));\n\t\t\tconst names = splitPromptChain(declaration);\n\t\t\tif (names.length === 0) {\n\t\t\t\tctx.ui.notify(\"Usage: /chain-prompts prompt-a -> prompt-b -- args\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst chain = names.map((name) => {\n\t\t\t\t\tconst workflow = findWorkflow(workflows, name);\n\t\t\t\t\tif (!workflow) throw new Error(`Unknown prompt workflow: ${name}`);\n\t\t\t\t\treturn workflowChainStep(workflow, runtime.args, runtime);\n\t\t\t\t});\n\t\t\t\tawait run({ chain, task: runtime.args.join(\" \"), clarify: false, ...(runtime.async !== undefined ? { async: runtime.async } : {}) }, ctx);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"prompt-workflows.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/slash/prompt-workflows.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAIlF,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,WAAW,CAAC;IAClC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,KAAK,oBAAoB,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAwFjG,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAOrE;AAgDD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAwC9K;AAmDD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACrD,EAAE,EAAE,YAAY,CAAC;IACjB,GAAG,EAAE,oBAAoB,CAAC;CAC1B,GAAG,IAAI,CAgEP","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport { parseFrontmatter } from \"../agents/frontmatter.ts\";\nimport type { SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport type { ChainStep } from \"../shared/settings.ts\";\nimport { getAgentDir, getProjectConfigDir } from \"../shared/utils.ts\";\n\ninterface PromptWorkflow {\n\tname: string;\n\tdescription: string;\n\tbody: string;\n\tfilePath: string;\n\tchildDescription: string;\n\tpermissions: \"full\" | \"read-only\";\n\ttier: \"light\" | \"standard\" | \"heavy\";\n\tskill?: string | string[] | false;\n\tcwd?: string;\n\tworktree?: boolean;\n\tchain?: string;\n}\n\ntype PromptWorkflowRunner = (params: SubagentParamsLike, ctx: ExtensionContext) => Promise<void>;\n\nconst RESERVED_COMMAND_NAMES = new Set([\n\t\"chain-prompts\",\n\t\"chain-workflows\",\n\t\"prompt-workflow\",\n\t\"run\",\n\t\"chain\",\n\t\"parallel\",\n\t\"subagents-doctor\",\n]);\n\nfunction packagePromptsDir(): string {\n\treturn path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"prompts\");\n}\n\nfunction promptDirs(cwd: string): string[] {\n\treturn [\n\t\tpackagePromptsDir(),\n\t\tpath.join(getAgentDir(), \"prompts\"),\n\t\tpath.join(getProjectConfigDir(cwd), \"prompts\"),\n\t];\n}\n\nfunction readPromptFiles(cwd: string): string[] {\n\tconst files: string[] = [];\n\tfor (const dir of promptDirs(cwd)) {\n\t\tlet entries: fs.Dirent[];\n\t\ttry {\n\t\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isFile() && entry.name.endsWith(\".md\")) files.push(path.join(dir, entry.name));\n\t\t}\n\t}\n\treturn files;\n}\n\nfunction firstNonEmptyLine(value: string): string {\n\treturn value.split(/\\r?\\n/).map((line) => line.trim()).find(Boolean) ?? \"Prompt workflow\";\n}\n\nfunction stringField(frontmatter: Record<string, string>, key: string): string | undefined {\n\tconst value = frontmatter[key]?.trim();\n\treturn value ? value : undefined;\n}\n\nfunction booleanField(frontmatter: Record<string, string>, key: string): boolean | undefined {\n\tconst value = frontmatter[key]?.trim().toLowerCase();\n\tif (value === \"true\" || value === \"yes\" || value === \"1\") return true;\n\tif (value === \"false\" || value === \"no\" || value === \"0\") return false;\n\treturn undefined;\n}\n\nfunction parseSkill(value: string | undefined): string | string[] | false | undefined {\n\tif (!value) return undefined;\n\tif (value === \"false\") return false;\n\tconst parts = value.split(\",\").map((part) => part.trim()).filter(Boolean);\n\treturn parts.length > 1 ? parts : parts[0];\n}\n\nfunction loadPromptWorkflow(filePath: string): PromptWorkflow | undefined {\n\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\tconst { frontmatter, body } = parseFrontmatter(content);\n\tconst name = path.basename(filePath, \".md\");\n\tif (!name || RESERVED_COMMAND_NAMES.has(name)) return undefined;\n\tconst tierValue = stringField(frontmatter, \"tier\");\n\tif (tierValue !== \"light\" && tierValue !== \"standard\" && tierValue !== \"heavy\") return undefined;\n\tconst skill = parseSkill(stringField(frontmatter, \"skill\"));\n\tconst cwd = stringField(frontmatter, \"cwd\");\n\tconst chain = stringField(frontmatter, \"chain\");\n\treturn {\n\t\tname,\n\t\tdescription: stringField(frontmatter, \"description\") ?? firstNonEmptyLine(body),\n\t\tbody,\n\t\tfilePath,\n\t\tchildDescription: stringField(frontmatter, \"child-description\") ?? name,\n\t\tpermissions: stringField(frontmatter, \"permissions\") === \"read-only\" ? \"read-only\" : \"full\",\n\t\ttier: tierValue,\n\t\t...(skill !== undefined ? { skill } : {}),\n\t\t...(cwd ? { cwd } : {}),\n\t\t...(booleanField(frontmatter, \"worktree\") === true ? { worktree: true } : {}),\n\t\t...(chain ? { chain } : {}),\n\t};\n}\n\nexport function discoverPromptWorkflows(cwd: string): PromptWorkflow[] {\n\tconst workflows = new Map<string, PromptWorkflow>();\n\tfor (const file of readPromptFiles(cwd)) {\n\t\tconst workflow = loadPromptWorkflow(file);\n\t\tif (workflow) workflows.set(workflow.name, workflow);\n\t}\n\treturn [...workflows.values()].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction shellWords(input: string): string[] {\n\tconst words: string[] = [];\n\tlet current = \"\";\n\tlet quote: \"'\" | '\"' | undefined;\n\tlet escaped = false;\n\tfor (const ch of input) {\n\t\tif (escaped) {\n\t\t\tcurrent += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\") {\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (quote) {\n\t\t\tif (ch === quote) quote = undefined;\n\t\t\telse current += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"'\" || ch === '\"') {\n\t\t\tquote = ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/\\s/.test(ch)) {\n\t\t\tif (current) {\n\t\t\t\twords.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent += ch;\n\t}\n\tif (current) words.push(current);\n\treturn words;\n}\n\nfunction substituteArgs(template: string, args: string[]): string {\n\tconst all = args.join(\" \");\n\treturn template\n\t\t.replace(/\\$ARGUMENTS/g, all)\n\t\t.replace(/\\$@/g, all)\n\t\t.replace(/\\$\\{(\\d+):-([^}]*)\\}/g, (_match, index: string, fallback: string) => args[Number(index) - 1] || fallback)\n\t\t.replace(/\\$(\\d+)/g, (_match, index: string) => args[Number(index) - 1] ?? \"\");\n}\n\nexport function parseRuntimeOptions(words: string[]): { args: string[]; descriptionOverride?: string; permissions?: \"full\" | \"read-only\"; worktree?: boolean; async?: boolean } {\n\tconst args: string[] = [];\n\tlet descriptionOverride: string | undefined;\n\tlet permissions: \"full\" | \"read-only\" | undefined;\n\tlet worktree = false;\n\tlet async: boolean | undefined;\n\tfor (let i = 0; i < words.length; i++) {\n\t\tconst word = words[i]!;\n\t\tif (word === \"--read-only\") {\n\t\t\tpermissions = \"read-only\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--full\") {\n\t\t\tpermissions = \"full\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--worktree\") {\n\t\t\tworktree = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--bg\" || word === \"--async\") {\n\t\t\tasync = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--fg\" || word === \"--foreground\") {\n\t\t\tasync = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (word === \"--description\") {\n\t\t\tdescriptionOverride = words[++i];\n\t\t\tcontinue;\n\t\t}\n\t\tconst eq = word.match(/^--description(?:=|:)(.+)$/);\n\t\tif (eq) {\n\t\t\tdescriptionOverride = eq[1];\n\t\t\tcontinue;\n\t\t}\n\t\targs.push(word);\n\t}\n\treturn { args, descriptionOverride, permissions, worktree, async };\n}\n\nfunction splitChainDeclaration(input: string): { declaration: string; argsText: string } {\n\tconst delimiter = input.indexOf(\" -- \");\n\tif (delimiter === -1) return { declaration: input.trim(), argsText: \"\" };\n\treturn { declaration: input.slice(0, delimiter).trim(), argsText: input.slice(delimiter + 4).trim() };\n}\n\nfunction splitPromptChain(input: string): string[] {\n\treturn input.split(\" -> \").map((part) => part.trim()).filter(Boolean);\n}\n\nfunction workflowParams(workflow: PromptWorkflow, args: string[], runtime: ReturnType<typeof parseRuntimeOptions>): SubagentParamsLike {\n\tconst task = substituteArgs(workflow.body, args).trim();\n\treturn {\n\t\ttask,\n\t\tdescription: runtime.descriptionOverride ?? workflow.childDescription,\n\t\tpermissions: runtime.permissions ?? workflow.permissions,\n\t\ttier: workflow.tier,\n\t\tclarify: false,\n\t\t...(workflow.skill !== undefined ? { skill: workflow.skill } : {}),\n\t\t...(workflow.cwd ? { cwd: workflow.cwd } : {}),\n\t\t...(runtime.worktree || workflow.worktree ? { worktree: true } : {}),\n\t\t...(runtime.async !== undefined ? { async: runtime.async } : {}),\n\t};\n}\n\nfunction workflowChainStep(workflow: PromptWorkflow, args: string[], runtime: ReturnType<typeof parseRuntimeOptions>): ChainStep {\n\tconst params = workflowParams(workflow, args, runtime);\n\treturn {\n\t\tdescription: params.description ?? workflow.childDescription,\n\t\tpermissions: params.permissions ?? workflow.permissions,\n\t\ttier: params.tier,\n\t\ttask: params.task,\n\t\t...(params.skill !== undefined ? { skill: params.skill } : {}),\n\t\t...(params.cwd ? { cwd: params.cwd } : {}),\n\t};\n}\n\nfunction findWorkflow(workflows: PromptWorkflow[], name: string): PromptWorkflow | undefined {\n\treturn workflows.find((workflow) => workflow.name === name);\n}\n\nfunction formatWorkflowList(workflows: PromptWorkflow[]): string {\n\tif (workflows.length === 0) return \"No prompt workflows found in package, user, or project prompts.\";\n\treturn [\n\t\t\"Prompt workflows:\",\n\t\t...workflows.map((workflow) => `- ${workflow.name}: ${workflow.description} (${workflow.filePath})`),\n\t].join(\"\\n\");\n}\n\nexport function registerPromptWorkflowCommands(input: {\n\tpi: ExtensionAPI;\n\trun: PromptWorkflowRunner;\n}): void {\n\tconst { pi, run } = input;\n\n\tpi.registerCommand(\"prompt-workflow\", {\n\t\tdescription: \"Run a prompt template through lunR subagents: /prompt-workflow <name> [args]\",\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\tconst words = shellWords(rawArgs);\n\t\t\tconst name = words.shift();\n\t\t\tconst workflows = discoverPromptWorkflows(ctx.cwd);\n\t\t\tif (!name || name === \"list\") {\n\t\t\t\tpi.sendMessage({ content: formatWorkflowList(workflows), display: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst workflow = findWorkflow(workflows, name);\n\t\t\tif (!workflow) {\n\t\t\t\tctx.ui.notify(`Unknown prompt workflow: ${name}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst runtime = parseRuntimeOptions(words);\n\t\t\ttry {\n\t\t\t\tif (workflow.chain) {\n\t\t\t\t\tconst chainNames = splitPromptChain(workflow.chain);\n\t\t\t\t\tconst chain = chainNames.map((stepName) => {\n\t\t\t\t\t\tconst step = findWorkflow(workflows, stepName);\n\t\t\t\t\t\tif (!step) throw new Error(`Unknown prompt workflow in chain '${workflow.name}': ${stepName}`);\n\t\t\t\t\t\treturn workflowChainStep(step, runtime.args, runtime);\n\t\t\t\t\t});\n\t\t\t\t\tawait run({ chain, task: runtime.args.join(\" \"), clarify: false, ...(runtime.async !== undefined ? { async: runtime.async } : {}) }, ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait run(workflowParams(workflow, runtime.args, runtime), ctx);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.registerCommand(\"chain-workflows\", {\n\t\tdescription: \"Run prompt workflows as a native subagent chain: /chain-workflows analyze -> fix -- args\",\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\tconst { declaration, argsText } = splitChainDeclaration(rawArgs);\n\t\t\tconst workflows = discoverPromptWorkflows(ctx.cwd);\n\t\t\tif (!declaration || declaration === \"list\") {\n\t\t\t\tpi.sendMessage({ content: formatWorkflowList(workflows), display: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst runtime = parseRuntimeOptions(shellWords(argsText));\n\t\t\tconst names = splitPromptChain(declaration);\n\t\t\tif (names.length === 0) {\n\t\t\t\tctx.ui.notify(\"Usage: /chain-workflows prompt-a -> prompt-b -- args\", \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst chain = names.map((name) => {\n\t\t\t\t\tconst workflow = findWorkflow(workflows, name);\n\t\t\t\t\tif (!workflow) throw new Error(`Unknown prompt workflow: ${name}`);\n\t\t\t\t\treturn workflowChainStep(workflow, runtime.args, runtime);\n\t\t\t\t});\n\t\t\t\tawait run({ chain, task: runtime.args.join(\" \"), clarify: false, ...(runtime.async !== undefined ? { async: runtime.async } : {}) }, ctx);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
@@ -6,6 +6,7 @@ import { parseFrontmatter } from "../agents/frontmatter.js";
6
6
  import { getAgentDir, getProjectConfigDir } from "../shared/utils.js";
7
7
  const RESERVED_COMMAND_NAMES = new Set([
8
8
  "chain-prompts",
9
+ "chain-workflows",
9
10
  "prompt-workflow",
10
11
  "run",
11
12
  "chain",
@@ -267,8 +268,8 @@ export function registerPromptWorkflowCommands(input) {
267
268
  }
268
269
  },
269
270
  });
270
- pi.registerCommand("chain-prompts", {
271
- description: "Run prompt templates as a native subagent chain: /chain-prompts analyze -> fix -- args",
271
+ pi.registerCommand("chain-workflows", {
272
+ description: "Run prompt workflows as a native subagent chain: /chain-workflows analyze -> fix -- args",
272
273
  handler: async (rawArgs, ctx) => {
273
274
  const { declaration, argsText } = splitChainDeclaration(rawArgs);
274
275
  const workflows = discoverPromptWorkflows(ctx.cwd);
@@ -279,7 +280,7 @@ export function registerPromptWorkflowCommands(input) {
279
280
  const runtime = parseRuntimeOptions(shellWords(argsText));
280
281
  const names = splitPromptChain(declaration);
281
282
  if (names.length === 0) {
282
- ctx.ui.notify("Usage: /chain-prompts prompt-a -> prompt-b -- args", "error");
283
+ ctx.ui.notify("Usage: /chain-workflows prompt-a -> prompt-b -- args", "error");
283
284
  return;
284
285
  }
285
286
  try {