@humain/terminal 0.0.17 → 0.1.0

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 (367) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/bun/cli.d.ts +3 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +3 -8
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/bun/runtime-setup.d.ts +2 -0
  7. package/dist/bun/runtime-setup.d.ts.map +1 -0
  8. package/dist/bun/runtime-setup.js +9 -0
  9. package/dist/bun/runtime-setup.js.map +1 -0
  10. package/dist/bun/sandbox-env-setup.d.ts +2 -0
  11. package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
  12. package/dist/bun/sandbox-env-setup.js +4 -0
  13. package/dist/bun/sandbox-env-setup.js.map +1 -0
  14. package/dist/bundle/chunks/anthropic-messages-XULXUBIG.js +6 -0
  15. package/dist/bundle/chunks/{azure-openai-responses-ZN52D6YC.js → azure-openai-responses-JEG2XOYC.js} +1 -1
  16. package/dist/bundle/chunks/bedrock-converse-stream.js +6 -6
  17. package/dist/bundle/chunks/{chunk-ARF4OE6X.js → chunk-2LC3S3VV.js} +8 -8
  18. package/dist/bundle/chunks/chunk-43O5DDAH.js +31 -0
  19. package/dist/bundle/chunks/{chunk-H2O6VOXT.js → chunk-46DC2JD6.js} +2 -2
  20. package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
  21. package/dist/bundle/chunks/{chunk-WJZ4KLGL.js → chunk-E6KP6V7F.js} +1 -1
  22. package/dist/bundle/chunks/{chunk-PSKDLDLZ.js → chunk-HPPQHK3J.js} +3 -3
  23. package/dist/bundle/chunks/chunk-JUPSJTFQ.js +42 -0
  24. package/dist/bundle/chunks/chunk-PL7O7J4J.js +133 -0
  25. package/dist/bundle/chunks/{chunk-PFVS5ZYL.js → chunk-RM336IEI.js} +378 -369
  26. package/dist/bundle/chunks/chunk-USJZMAIR.js +2 -0
  27. package/dist/bundle/chunks/{extract-2L7ZVN7F.js → extract-TRW5FBY6.js} +2 -2
  28. package/dist/bundle/chunks/github-copilot.js +1 -1
  29. package/dist/bundle/chunks/{google-generative-ai-FF7M7XHT.js → google-generative-ai-OX6VSCA6.js} +1 -1
  30. package/dist/bundle/chunks/{google-vertex-YMUBFRBA.js → google-vertex-GW76GSS2.js} +1 -1
  31. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  32. package/dist/bundle/chunks/{mistral-conversations-O4M7IQML.js → mistral-conversations-WXGXZOFJ.js} +1 -1
  33. package/dist/bundle/chunks/node-AUOGOBCN.js +2 -0
  34. package/dist/bundle/chunks/node-KOIP55YZ.js +16 -0
  35. package/dist/bundle/chunks/openai-codex-responses-NPLWP6ZC.js +10 -0
  36. package/dist/bundle/chunks/{openai-completions-L4AHDQ5D.js → openai-completions-OT2GTJKC.js} +3 -3
  37. package/dist/bundle/chunks/openai-responses-5A6CR7GI.js +2 -0
  38. package/dist/bundle/chunks/{openrouter-images-Y2PCWAQH.js → openrouter-images-YLQ4RJ2F.js} +1 -1
  39. package/dist/bundle/chunks/{pi-messages-57K43J6J.js → pi-messages-OJF77SY3.js} +1 -1
  40. package/dist/bundle/chunks/{undici-D6ABF53Q.js → undici-KA2LJNVT.js} +1 -1
  41. package/dist/bundle/chunks/webapi-RFAXLI2D.js +5 -0
  42. package/dist/bundle/cli.js +1 -1
  43. package/dist/bundle/index.js +1 -1
  44. package/dist/bundle/rpc-entry.js +1 -1
  45. package/dist/cli/config-selector.d.ts.map +1 -1
  46. package/dist/cli/config-selector.js +2 -1
  47. package/dist/cli/config-selector.js.map +1 -1
  48. package/dist/cli/setup.d.ts +2 -0
  49. package/dist/cli/setup.d.ts.map +1 -0
  50. package/dist/cli/setup.js +13 -0
  51. package/dist/cli/setup.js.map +1 -0
  52. package/dist/cli.js +2 -14
  53. package/dist/cli.js.map +1 -1
  54. package/dist/config.d.ts +1 -0
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +1 -0
  57. package/dist/config.js.map +1 -1
  58. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  59. package/dist/core/agent-session-runtime.js +15 -7
  60. package/dist/core/agent-session-runtime.js.map +1 -1
  61. package/dist/core/agent-session.d.ts +2 -6
  62. package/dist/core/agent-session.d.ts.map +1 -1
  63. package/dist/core/agent-session.js +14 -6
  64. package/dist/core/agent-session.js.map +1 -1
  65. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  66. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  67. package/dist/core/compaction/branch-summarization.js +2 -1
  68. package/dist/core/compaction/branch-summarization.js.map +1 -1
  69. package/dist/core/extensions/loader.d.ts.map +1 -1
  70. package/dist/core/extensions/loader.js +1 -2
  71. package/dist/core/extensions/loader.js.map +1 -1
  72. package/dist/core/extensions/types.d.ts +8 -2
  73. package/dist/core/extensions/types.d.ts.map +1 -1
  74. package/dist/core/extensions/types.js.map +1 -1
  75. package/dist/core/http-dispatcher.d.ts.map +1 -1
  76. package/dist/core/http-dispatcher.js +2 -0
  77. package/dist/core/http-dispatcher.js.map +1 -1
  78. package/dist/core/keybindings.d.ts +5 -0
  79. package/dist/core/keybindings.d.ts.map +1 -1
  80. package/dist/core/keybindings.js +4 -0
  81. package/dist/core/keybindings.js.map +1 -1
  82. package/dist/core/messages.d.ts +1 -1
  83. package/dist/core/messages.d.ts.map +1 -1
  84. package/dist/core/messages.js.map +1 -1
  85. package/dist/core/model-config.d.ts +15 -0
  86. package/dist/core/model-config.d.ts.map +1 -1
  87. package/dist/core/model-config.js +3 -0
  88. package/dist/core/model-config.js.map +1 -1
  89. package/dist/core/model-runtime.d.ts +1 -0
  90. package/dist/core/model-runtime.d.ts.map +1 -1
  91. package/dist/core/model-runtime.js +5 -2
  92. package/dist/core/model-runtime.js.map +1 -1
  93. package/dist/core/provider-composer.d.ts.map +1 -1
  94. package/dist/core/provider-composer.js +8 -2
  95. package/dist/core/provider-composer.js.map +1 -1
  96. package/dist/core/session-manager.d.ts +3 -2
  97. package/dist/core/session-manager.d.ts.map +1 -1
  98. package/dist/core/session-manager.js +40 -13
  99. package/dist/core/session-manager.js.map +1 -1
  100. package/dist/core/settings-manager.js.map +1 -1
  101. package/dist/core/skills.d.ts +1 -1
  102. package/dist/core/skills.d.ts.map +1 -1
  103. package/dist/core/skills.js +4 -2
  104. package/dist/core/skills.js.map +1 -1
  105. package/dist/core/system-prompt.d.ts.map +1 -1
  106. package/dist/core/system-prompt.js +8 -9
  107. package/dist/core/system-prompt.js.map +1 -1
  108. package/dist/core/tools/bash.d.ts.map +1 -1
  109. package/dist/core/tools/bash.js +3 -120
  110. package/dist/core/tools/bash.js.map +1 -1
  111. package/dist/core/tools/edit.d.ts +1 -12
  112. package/dist/core/tools/edit.d.ts.map +1 -1
  113. package/dist/core/tools/edit.js +5 -163
  114. package/dist/core/tools/edit.js.map +1 -1
  115. package/dist/core/tools/find.d.ts.map +1 -1
  116. package/dist/core/tools/find.js +4 -55
  117. package/dist/core/tools/find.js.map +1 -1
  118. package/dist/core/tools/grep.d.ts.map +1 -1
  119. package/dist/core/tools/grep.js +4 -60
  120. package/dist/core/tools/grep.js.map +1 -1
  121. package/dist/core/tools/ls.d.ts.map +1 -1
  122. package/dist/core/tools/ls.js +4 -49
  123. package/dist/core/tools/ls.js.map +1 -1
  124. package/dist/core/tools/read.d.ts.map +1 -1
  125. package/dist/core/tools/read.js +4 -120
  126. package/dist/core/tools/read.js.map +1 -1
  127. package/dist/core/tools/renderers/bash.d.ts +12 -0
  128. package/dist/core/tools/renderers/bash.d.ts.map +1 -0
  129. package/dist/core/tools/renderers/bash.js +133 -0
  130. package/dist/core/tools/renderers/bash.js.map +1 -0
  131. package/dist/core/tools/renderers/edit.d.ts +23 -0
  132. package/dist/core/tools/renderers/edit.d.ts.map +1 -0
  133. package/dist/core/tools/renderers/edit.js +167 -0
  134. package/dist/core/tools/renderers/edit.js.map +1 -0
  135. package/dist/core/tools/renderers/find.d.ts +10 -0
  136. package/dist/core/tools/renderers/find.d.ts.map +1 -0
  137. package/dist/core/tools/renderers/find.js +64 -0
  138. package/dist/core/tools/renderers/find.js.map +1 -0
  139. package/dist/core/tools/renderers/grep.d.ts +10 -0
  140. package/dist/core/tools/renderers/grep.d.ts.map +1 -0
  141. package/dist/core/tools/renderers/grep.js +69 -0
  142. package/dist/core/tools/renderers/grep.js.map +1 -0
  143. package/dist/core/tools/renderers/index.d.ts +22 -0
  144. package/dist/core/tools/renderers/index.d.ts.map +1 -0
  145. package/dist/core/tools/renderers/index.js +48 -0
  146. package/dist/core/tools/renderers/index.js.map +1 -0
  147. package/dist/core/tools/renderers/ls.d.ts +10 -0
  148. package/dist/core/tools/renderers/ls.d.ts.map +1 -0
  149. package/dist/core/tools/renderers/ls.js +58 -0
  150. package/dist/core/tools/renderers/ls.js.map +1 -0
  151. package/dist/core/tools/renderers/read.d.ts +11 -0
  152. package/dist/core/tools/renderers/read.d.ts.map +1 -0
  153. package/dist/core/tools/renderers/read.js +129 -0
  154. package/dist/core/tools/renderers/read.js.map +1 -0
  155. package/dist/core/tools/renderers/write.d.ts +10 -0
  156. package/dist/core/tools/renderers/write.d.ts.map +1 -0
  157. package/dist/core/tools/renderers/write.js +152 -0
  158. package/dist/core/tools/renderers/write.js.map +1 -0
  159. package/dist/core/tools/subagent-worktree.d.ts +1 -0
  160. package/dist/core/tools/subagent-worktree.d.ts.map +1 -1
  161. package/dist/core/tools/subagent-worktree.js +25 -1
  162. package/dist/core/tools/subagent-worktree.js.map +1 -1
  163. package/dist/core/tools/subagent.d.ts.map +1 -1
  164. package/dist/core/tools/subagent.js +5 -2
  165. package/dist/core/tools/subagent.js.map +1 -1
  166. package/dist/core/tools/write.d.ts.map +1 -1
  167. package/dist/core/tools/write.js +5 -145
  168. package/dist/core/tools/write.js.map +1 -1
  169. package/dist/humain/bedrock-provider/vendor/index.bundle.mjs +51 -12
  170. package/dist/humain/mcp-adapter/vendor/package.json +2 -2
  171. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
  172. package/dist/humain/web-access/vendor/curator-page.js +3 -1
  173. package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
  174. package/dist/humain/web-access/vendor/curator-server.d.ts +2 -0
  175. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
  176. package/dist/humain/web-access/vendor/curator-server.js +4 -2
  177. package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
  178. package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
  179. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
  180. package/dist/humain/web-access/vendor/gemini-search.js +11 -4
  181. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
  182. package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -1
  183. package/dist/humain/web-access/vendor/github-extract.js +238 -1
  184. package/dist/humain/web-access/vendor/github-extract.js.map +1 -1
  185. package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
  186. package/dist/humain/web-access/vendor/index.js +118 -64
  187. package/dist/humain/web-access/vendor/index.js.map +1 -1
  188. package/dist/humain/web-access/vendor/mistral-search.d.ts +4 -0
  189. package/dist/humain/web-access/vendor/mistral-search.d.ts.map +1 -0
  190. package/dist/humain/web-access/vendor/mistral-search.js +274 -0
  191. package/dist/humain/web-access/vendor/mistral-search.js.map +1 -0
  192. package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -1
  193. package/dist/humain/web-access/vendor/perplexity.js +12 -1
  194. package/dist/humain/web-access/vendor/perplexity.js.map +1 -1
  195. package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
  196. package/dist/humain/web-access/vendor/utils.js +1 -2
  197. package/dist/humain/web-access/vendor/utils.js.map +1 -1
  198. package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
  199. package/dist/humain/web-access/vendor/xai-search.js +92 -35
  200. package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
  201. package/dist/index.d.ts +1 -1
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js.map +1 -1
  204. package/dist/main.d.ts.map +1 -1
  205. package/dist/main.js +4 -1
  206. package/dist/main.js.map +1 -1
  207. package/dist/modes/interactive/chat-viewport.d.ts +20 -0
  208. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
  209. package/dist/modes/interactive/chat-viewport.js +28 -0
  210. package/dist/modes/interactive/chat-viewport.js.map +1 -0
  211. package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  212. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  213. package/dist/modes/interactive/components/assistant-message.js +18 -10
  214. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  215. package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
  216. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  217. package/dist/modes/interactive/components/custom-editor.js +37 -1
  218. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  219. package/dist/modes/interactive/components/index.d.ts +1 -1
  220. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  221. package/dist/modes/interactive/components/index.js.map +1 -1
  222. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  223. package/dist/modes/interactive/components/model-selector.js +8 -17
  224. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  225. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  226. package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
  227. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  228. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/dist/modes/interactive/components/settings-selector.js +14 -10
  230. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  232. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  233. package/dist/modes/interactive/components/status-indicator.js +10 -3
  234. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  235. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  236. package/dist/modes/interactive/components/thinking-selector.js +4 -4
  237. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  238. package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
  239. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/tool-execution.js +34 -32
  241. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  242. package/dist/modes/interactive/components/trust-selector.js +2 -2
  243. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  244. package/dist/modes/interactive/interactive-mode.d.ts +8 -15
  245. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  246. package/dist/modes/interactive/interactive-mode.js +96 -81
  247. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  248. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  249. package/dist/modes/interactive/session-share.js +8 -12
  250. package/dist/modes/interactive/session-share.js.map +1 -1
  251. package/dist/modes/interactive/theme/dark.json +2 -1
  252. package/dist/modes/interactive/theme/light.json +2 -1
  253. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  254. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  255. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  256. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  257. package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
  258. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
  259. package/dist/modes/interactive/theme/theme-json.js +130 -0
  260. package/dist/modes/interactive/theme/theme-json.js.map +1 -0
  261. package/dist/modes/interactive/theme/theme-schema.json +6 -2
  262. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  263. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  264. package/dist/modes/interactive/theme/theme.js +18 -119
  265. package/dist/modes/interactive/theme/theme.js.map +1 -1
  266. package/dist/modes/interactive/tui-renderer.d.ts +21 -0
  267. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
  268. package/dist/modes/interactive/tui-renderer.js +66 -0
  269. package/dist/modes/interactive/tui-renderer.js.map +1 -0
  270. package/dist/utils/exif-orientation.d.ts.map +1 -1
  271. package/dist/utils/exif-orientation.js +2 -3
  272. package/dist/utils/exif-orientation.js.map +1 -1
  273. package/dist/utils/tools-manager.d.ts +1 -0
  274. package/dist/utils/tools-manager.d.ts.map +1 -1
  275. package/dist/utils/tools-manager.js +41 -19
  276. package/dist/utils/tools-manager.js.map +1 -1
  277. package/docs/containerization.md +45 -0
  278. package/docs/development.md +19 -0
  279. package/docs/environment-variables.md +2 -0
  280. package/docs/extensions.md +5 -2
  281. package/docs/keybindings.md +5 -2
  282. package/docs/models.md +4 -1
  283. package/docs/rpc.md +1 -1
  284. package/docs/sdk.md +5 -0
  285. package/docs/settings.md +3 -3
  286. package/docs/skills.md +1 -1
  287. package/docs/terminal-setup.md +15 -0
  288. package/docs/themes.md +8 -6
  289. package/docs/tui.md +19 -0
  290. package/examples/README.md +3 -0
  291. package/examples/extensions/custom-provider-anthropic/package-lock.json +84 -84
  292. package/examples/extensions/custom-provider-anthropic/package.json +17 -17
  293. package/examples/extensions/custom-provider-gitlab-duo/package.json +14 -14
  294. package/examples/extensions/dynamic-resources/dynamic.json +2 -0
  295. package/examples/extensions/gondolin/package-lock.json +8 -8
  296. package/examples/extensions/gondolin/package.json +1 -1
  297. package/examples/extensions/sandbox/package-lock.json +6 -6
  298. package/examples/extensions/sandbox/package.json +2 -2
  299. package/examples/extensions/with-deps/package-lock.json +29 -29
  300. package/examples/extensions/with-deps/package.json +20 -20
  301. package/examples/plugins/pi-example-plugin/README.md +38 -0
  302. package/examples/plugins/pi-example-plugin/package.json +10 -0
  303. package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
  304. package/examples/plugins/pi-example-plugin/src/session.ts +23 -0
  305. package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
  306. package/npm-shrinkwrap.json +772 -205
  307. package/package.json +31 -24
  308. package/src/humain/web-access/UPSTREAM.md +12 -1
  309. package/src/humain/web-access/upstream.json +4 -4
  310. package/dist/bundle/chunks/anthropic-messages-M4LCS3KH.js +0 -6
  311. package/dist/bundle/chunks/chunk-3VI4HD7D.js +0 -31
  312. package/dist/bundle/chunks/chunk-BOW22LW6.js +0 -42
  313. package/dist/bundle/chunks/chunk-CBHC6EL7.js +0 -133
  314. package/dist/bundle/chunks/chunk-JUUC5AZY.js +0 -2
  315. package/dist/bundle/chunks/node-ZHY4LHC7.js +0 -15
  316. package/dist/bundle/chunks/openai-codex-responses-HRVCDY54.js +0 -8
  317. package/dist/bundle/chunks/openai-responses-4MWLJHIK.js +0 -2
  318. package/dist/bundle/chunks/webapi-AFS5FDJJ.js +0 -5
  319. package/dist/bundle/client.js +0 -2
  320. package/dist/cli/experimental/auth.d.ts +0 -16
  321. package/dist/cli/experimental/auth.d.ts.map +0 -1
  322. package/dist/cli/experimental/auth.js +0 -13
  323. package/dist/cli/experimental/auth.js.map +0 -1
  324. package/dist/cli/experimental/cli.d.ts +0 -6
  325. package/dist/cli/experimental/cli.d.ts.map +0 -1
  326. package/dist/cli/experimental/cli.js +0 -5
  327. package/dist/cli/experimental/cli.js.map +0 -1
  328. package/dist/cli/experimental/command-options.d.ts +0 -17
  329. package/dist/cli/experimental/command-options.d.ts.map +0 -1
  330. package/dist/cli/experimental/command-options.js +0 -35
  331. package/dist/cli/experimental/command-options.js.map +0 -1
  332. package/dist/cli/experimental/command.d.ts +0 -63
  333. package/dist/cli/experimental/command.d.ts.map +0 -1
  334. package/dist/cli/experimental/command.js +0 -127
  335. package/dist/cli/experimental/command.js.map +0 -1
  336. package/dist/cli/experimental/commands/client.d.ts +0 -13
  337. package/dist/cli/experimental/commands/client.d.ts.map +0 -1
  338. package/dist/cli/experimental/commands/client.js +0 -25
  339. package/dist/cli/experimental/commands/client.js.map +0 -1
  340. package/dist/cli/experimental/commands/pi.d.ts +0 -15
  341. package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
  342. package/dist/cli/experimental/commands/pi.js +0 -28
  343. package/dist/cli/experimental/commands/pi.js.map +0 -1
  344. package/dist/cli/experimental/commands/server.d.ts +0 -13
  345. package/dist/cli/experimental/commands/server.d.ts.map +0 -1
  346. package/dist/cli/experimental/commands/server.js +0 -25
  347. package/dist/cli/experimental/commands/server.js.map +0 -1
  348. package/dist/cli/experimental/transport-address.d.ts +0 -10
  349. package/dist/cli/experimental/transport-address.d.ts.map +0 -1
  350. package/dist/cli/experimental/transport-address.js +0 -38
  351. package/dist/cli/experimental/transport-address.js.map +0 -1
  352. package/dist/client/index.d.ts +0 -3
  353. package/dist/client/index.d.ts.map +0 -1
  354. package/dist/client/index.js +0 -3
  355. package/dist/client/index.js.map +0 -1
  356. package/dist/client/remote-session.d.ts +0 -53
  357. package/dist/client/remote-session.d.ts.map +0 -1
  358. package/dist/client/remote-session.js +0 -340
  359. package/dist/client/remote-session.js.map +0 -1
  360. package/dist/client/transcript.d.ts +0 -12
  361. package/dist/client/transcript.d.ts.map +0 -1
  362. package/dist/client/transcript.js +0 -98
  363. package/dist/client/transcript.js.map +0 -1
  364. package/dist/server/create-harness.d.ts +0 -26
  365. package/dist/server/create-harness.d.ts.map +0 -1
  366. package/dist/server/create-harness.js +0 -106
  367. package/dist/server/create-harness.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../../src/core/tools/renderers/write.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Presentation for the write tool.\n *\n * Renderers live apart from the implementation so a process that only displays tool output does not\n * load the execution path or its typebox parameter schema. `write.ts` spreads these into its\n * definition, so the tool's public shape is unchanged.\n */\n\nimport { Container, Text } from \"@earendil-works/pi-tui\";\nimport { keyHint } from \"../../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../../extensions/types.ts\";\nimport { normalizeDisplayText, renderToolPath, replaceTabs, str } from \"../render-utils.ts\";\n\ntype WriteHighlightCache = {\n\trawPath: string | null;\n\tlang: string;\n\trawContent: string;\n\tnormalizedLines: string[];\n\thighlightedLines: string[];\n};\nclass WriteCallRenderComponent extends Text {\n\tcache?: WriteHighlightCache;\n\n\tconstructor() {\n\t\tsuper(\"\", 0, 0);\n\t}\n}\nconst WRITE_PARTIAL_FULL_HIGHLIGHT_LINES = 50;\nfunction highlightSingleLine(line: string, lang: string): string {\n\tconst highlighted = highlightCode(line, lang);\n\treturn highlighted[0] ?? \"\";\n}\nfunction refreshWriteHighlightPrefix(cache: WriteHighlightCache): void {\n\tconst prefixCount = Math.min(WRITE_PARTIAL_FULL_HIGHLIGHT_LINES, cache.normalizedLines.length);\n\tif (prefixCount === 0) return;\n\tconst prefixSource = cache.normalizedLines.slice(0, prefixCount).join(\"\\n\");\n\tconst prefixHighlighted = highlightCode(prefixSource, cache.lang);\n\tfor (let i = 0; i < prefixCount; i++) {\n\t\tcache.highlightedLines[i] =\n\t\t\tprefixHighlighted[i] ?? highlightSingleLine(cache.normalizedLines[i] ?? \"\", cache.lang);\n\t}\n}\nfunction rebuildWriteHighlightCacheFull(rawPath: string | null, fileContent: string): WriteHighlightCache | undefined {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (!lang) return undefined;\n\tconst displayContent = normalizeDisplayText(fileContent);\n\tconst normalized = replaceTabs(displayContent);\n\treturn {\n\t\trawPath,\n\t\tlang,\n\t\trawContent: fileContent,\n\t\tnormalizedLines: normalized.split(\"\\n\"),\n\t\thighlightedLines: highlightCode(normalized, lang),\n\t};\n}\nfunction updateWriteHighlightCacheIncremental(\n\tcache: WriteHighlightCache | undefined,\n\trawPath: string | null,\n\tfileContent: string,\n): WriteHighlightCache | undefined {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (!lang) return undefined;\n\tif (!cache) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (cache.lang !== lang || cache.rawPath !== rawPath) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (!fileContent.startsWith(cache.rawContent)) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (fileContent.length === cache.rawContent.length) return cache;\n\n\tconst deltaRaw = fileContent.slice(cache.rawContent.length);\n\tconst deltaDisplay = normalizeDisplayText(deltaRaw);\n\tconst deltaNormalized = replaceTabs(deltaDisplay);\n\tcache.rawContent = fileContent;\n\tif (cache.normalizedLines.length === 0) {\n\t\tcache.normalizedLines.push(\"\");\n\t\tcache.highlightedLines.push(\"\");\n\t}\n\n\tconst segments = deltaNormalized.split(\"\\n\");\n\tconst lastIndex = cache.normalizedLines.length - 1;\n\tcache.normalizedLines[lastIndex] += segments[0];\n\tcache.highlightedLines[lastIndex] = highlightSingleLine(cache.normalizedLines[lastIndex], cache.lang);\n\tfor (let i = 1; i < segments.length; i++) {\n\t\tcache.normalizedLines.push(segments[i]);\n\t\tcache.highlightedLines.push(highlightSingleLine(segments[i], cache.lang));\n\t}\n\trefreshWriteHighlightPrefix(cache);\n\treturn cache;\n}\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\nfunction formatWriteCall(\n\targs: { path?: string; file_path?: string; content?: string } | undefined,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcache: WriteHighlightCache | undefined,\n\tcwd: string,\n): string {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst fileContent = str(args?.content);\n\tconst pathDisplay = renderToolPath(rawPath, theme, cwd);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"write\"))} ${pathDisplay}`;\n\n\tif (fileContent === null) {\n\t\ttext += `\\n\\n${theme.fg(\"error\", \"[invalid content arg - expected string]\")}`;\n\t} else if (fileContent) {\n\t\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\t\tconst renderedLines = lang\n\t\t\t? (cache?.highlightedLines ?? highlightCode(replaceTabs(normalizeDisplayText(fileContent)), lang))\n\t\t\t: normalizeDisplayText(fileContent).split(\"\\n\");\n\t\tconst lines = trimTrailingEmptyLines(renderedLines);\n\t\tconst totalLines = lines.length;\n\t\tconst maxLines = options.expanded ? lines.length : 10;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n\\n${displayLines.map((line) => (lang ? line : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines, ${totalLines} total,`)} ${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n\t\t}\n\t}\n\n\treturn text;\n}\nfunction formatWriteResult(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }>; isError?: boolean },\n\ttheme: Theme,\n): string | undefined {\n\tif (!result.isError) {\n\t\treturn undefined;\n\t}\n\tconst output = result.content\n\t\t.filter((c) => c.type === \"text\")\n\t\t.map((c) => c.text || \"\")\n\t\t.join(\"\\n\");\n\tif (!output) {\n\t\treturn undefined;\n\t}\n\treturn `\\n${theme.fg(\"error\", output)}`;\n}\n\nexport const writeRenderers: Pick<ToolDefinition<any, any>, \"renderCall\" | \"renderResult\"> = {\n\trenderCall(args, theme, context) {\n\t\tconst renderArgs = args as { path?: string; file_path?: string; content?: string } | undefined;\n\t\tconst rawPath = str(renderArgs?.file_path ?? renderArgs?.path);\n\t\tconst fileContent = str(renderArgs?.content);\n\t\tconst component =\n\t\t\t(context.lastComponent as WriteCallRenderComponent | undefined) ?? new WriteCallRenderComponent();\n\t\tif (fileContent !== null) {\n\t\t\tcomponent.cache = context.argsComplete\n\t\t\t\t? rebuildWriteHighlightCacheFull(rawPath, fileContent)\n\t\t\t\t: updateWriteHighlightCacheIncremental(component.cache, rawPath, fileContent);\n\t\t} else {\n\t\t\tcomponent.cache = undefined;\n\t\t}\n\t\tcomponent.setText(\n\t\t\tformatWriteCall(\n\t\t\t\trenderArgs,\n\t\t\t\t{ expanded: context.expanded, isPartial: context.isPartial },\n\t\t\t\ttheme,\n\t\t\t\tcomponent.cache,\n\t\t\t\tcontext.cwd,\n\t\t\t),\n\t\t);\n\t\treturn component;\n\t},\n\trenderResult(result, _options, theme, context) {\n\t\tconst output = formatWriteResult({ ...result, isError: context.isError }, theme);\n\t\tif (!output) {\n\t\t\tconst component = (context.lastComponent as Container | undefined) ?? new Container();\n\t\t\tcomponent.clear();\n\t\t\treturn component;\n\t\t}\n\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\ttext.setText(output);\n\t\treturn text;\n\t},\n};\n"]}
@@ -2,6 +2,7 @@ export type SubagentIsolation = "shared" | "worktree";
2
2
  export type SubagentMergeOutcome = "clean" | "conflict" | "skipped";
3
3
  export interface SubagentWorktree {
4
4
  readonly path: string;
5
+ readonly cwd: string;
5
6
  readonly snapshotSha: string;
6
7
  /** Apply the child's changes back onto the parent working tree. Never leaves conflict markers. */
7
8
  mergeBack(): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-worktree.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent-worktree.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAAC;AACtD,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kGAAkG;IAClG,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,oBAAoB,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,+CAA+C;IAC/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAgED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjE;AAgCD,oEAAoE;AACpE,wBAAsB,2BAA2B,CAChD,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAmB,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8BhC;AAqED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyDnH"}
1
+ {"version":3,"file":"subagent-worktree.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent-worktree.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAAC;AACtD,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kGAAkG;IAClG,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,oBAAoB,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,+CAA+C;IAC/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAgED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjE;AAgCD,oEAAoE;AACpE,wBAAsB,2BAA2B,CAChD,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAmB,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8BhC;AAqED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkFnH"}
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { rmSync } from "node:fs";
3
3
  import { mkdir, mkdtemp, readdir, realpath, rm, stat, writeFile } from "node:fs/promises";
4
4
  import { tmpdir } from "node:os";
5
- import { join } from "node:path";
5
+ import { isAbsolute, join, relative, resolve, sep } from "node:path";
6
6
  import { spawnProcess, spawnProcessSync } from "../../utils/child-process.js";
7
7
  const WORKTREE_ROOT = join(tmpdir(), "humain-terminal-worktrees");
8
8
  const STALE_AFTER_MS = 6 * 60 * 60_000;
@@ -184,6 +184,11 @@ for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
184
184
  }
185
185
  export async function createSubagentWorktree(input) {
186
186
  const repository = await getRepositoryContext(input.parentCwd);
187
+ const requestedCwd = await realpath(input.parentCwd);
188
+ const relativeCwd = relative(repository.parentCwd, requestedCwd);
189
+ if (relativeCwd === ".." || relativeCwd.startsWith(`..${sep}`) || isAbsolute(relativeCwd)) {
190
+ throw new Error(`Subagent cwd is outside the repository: ${input.parentCwd}`);
191
+ }
187
192
  await mkdir(repository.worktreeRoot, { recursive: true });
188
193
  await sweepOnce(repository);
189
194
  const safeLabel = input.label.replace(/[^A-Za-z0-9_.-]/g, "-").slice(0, 64) || "subagent";
@@ -196,9 +201,28 @@ export async function createSubagentWorktree(input) {
196
201
  await rm(path, { recursive: true, force: true });
197
202
  throw error;
198
203
  }
204
+ let cwd;
205
+ try {
206
+ const mappedCwd = resolve(path, relativeCwd);
207
+ await mkdir(mappedCwd, { recursive: true });
208
+ cwd = await realpath(mappedCwd);
209
+ const worktreeRelativeCwd = relative(await realpath(path), cwd);
210
+ if (worktreeRelativeCwd === ".." ||
211
+ worktreeRelativeCwd.startsWith(`..${sep}`) ||
212
+ isAbsolute(worktreeRelativeCwd)) {
213
+ throw new Error(`Subagent cwd resolves outside its worktree: ${input.parentCwd}`);
214
+ }
215
+ }
216
+ catch (error) {
217
+ await runGit(repository.parentCwd, ["worktree", "remove", "--force", path]);
218
+ await rm(path, { recursive: true, force: true });
219
+ await gitOk(repository.parentCwd, ["worktree", "prune"]);
220
+ throw error;
221
+ }
199
222
  let disposePromise;
200
223
  const worktree = {
201
224
  path,
225
+ cwd,
202
226
  snapshotSha,
203
227
  async mergeBack() {
204
228
  await gitOk(path, ["add", "-A"]);
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-worktree.js","sourceRoot":"","sources":["../../../src/core/tools/subagent-worktree.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { rmSync } from \"node:fs\";\nimport { mkdir, mkdtemp, readdir, realpath, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { spawnProcess, spawnProcessSync } from \"../../utils/child-process.ts\";\n\nexport type SubagentIsolation = \"shared\" | \"worktree\";\nexport type SubagentMergeOutcome = \"clean\" | \"conflict\" | \"skipped\";\n\nexport interface SubagentWorktree {\n\treadonly path: string;\n\treadonly snapshotSha: string;\n\t/** Apply the child's changes back onto the parent working tree. Never leaves conflict markers. */\n\tmergeBack(): Promise<{ outcome: SubagentMergeOutcome; changedFiles: string[]; patchPath?: string }>;\n\t/** Remove the worktree; safe to call twice. */\n\tdispose(): Promise<void>;\n}\n\ninterface GitResult {\n\tstatus: number;\n\tstdout: string;\n\tstderr: string;\n}\n\ninterface RepositoryContext {\n\tparentCwd: string;\n\tkey: string;\n\tworktreeRoot: string;\n}\n\ninterface ActiveWorktree {\n\tparentCwd: string;\n\tpath: string;\n}\n\nconst WORKTREE_ROOT = join(tmpdir(), \"humain-terminal-worktrees\");\nconst STALE_AFTER_MS = 6 * 60 * 60_000;\nconst active = new Map<SubagentWorktree, ActiveWorktree>();\nconst mergeLocks = new Map<string, Promise<void>>();\nconst sweptRepositories = new Set<string>();\nconst sweepingRepositories = new Map<string, Promise<void>>();\n\nfunction runGit(cwd: string, args: string[], stdin?: string, env?: NodeJS.ProcessEnv): Promise<GitResult> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst proc = spawnProcess(\"git\", args, { cwd, env, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tproc.stdout?.on(\"data\", (chunk) => {\n\t\t\tstdout += String(chunk);\n\t\t});\n\t\tproc.stderr?.on(\"data\", (chunk) => {\n\t\t\tstderr += String(chunk);\n\t\t});\n\t\tproc.once(\"error\", reject);\n\t\tproc.once(\"close\", (status) => resolve({ status: status ?? 1, stdout, stderr }));\n\t\tproc.stdin?.end(stdin);\n\t});\n}\n\nasync function gitOutput(cwd: string, args: string[], stdin?: string, env?: NodeJS.ProcessEnv): Promise<string> {\n\tconst result = await runGit(cwd, args, stdin, env);\n\tif (result.status !== 0) {\n\t\tthrow new Error(`git ${args[0]} failed: ${result.stderr.trim() || result.stdout.trim()}`);\n\t}\n\treturn result.stdout;\n}\n\nasync function gitOk(cwd: string, args: string[], stdin?: string, env?: NodeJS.ProcessEnv): Promise<string> {\n\treturn (await gitOutput(cwd, args, stdin, env)).trim();\n}\n\nasync function getRepositoryContext(cwd: string): Promise<RepositoryContext> {\n\tconst parentCwd = await realpath(await gitOk(cwd, [\"rev-parse\", \"--show-toplevel\"]));\n\tconst commonDir = await realpath(\n\t\tawait gitOk(parentCwd, [\"rev-parse\", \"--path-format=absolute\", \"--git-common-dir\"]),\n\t);\n\tconst key = createHash(\"sha256\").update(`${parentCwd}\\0${commonDir}`).digest(\"hex\").slice(0, 24);\n\treturn { parentCwd, key, worktreeRoot: join(WORKTREE_ROOT, key) };\n}\n\nexport async function isGitWorkTree(cwd: string): Promise<boolean> {\n\tconst result = await runGit(cwd, [\"rev-parse\", \"--is-inside-work-tree\"]);\n\treturn result.status === 0 && result.stdout.trim() === \"true\";\n}\n\n/** Commit HEAD plus tracked and non-ignored untracked files without changing the parent's index or refs. */\nasync function snapshotParent(parentCwd: string): Promise<string> {\n\tconst indexDir = await mkdtemp(join(tmpdir(), \"humain-terminal-worktree-index-\"));\n\tconst env = {\n\t\t...process.env,\n\t\tGIT_INDEX_FILE: join(indexDir, \"index\"),\n\t\tGIT_AUTHOR_NAME: \"HUMAIN Terminal\",\n\t\tGIT_AUTHOR_EMAIL: \"noreply@humain.ai\",\n\t\tGIT_COMMITTER_NAME: \"HUMAIN Terminal\",\n\t\tGIT_COMMITTER_EMAIL: \"noreply@humain.ai\",\n\t};\n\ttry {\n\t\tawait gitOk(parentCwd, [\"read-tree\", \"HEAD\"], undefined, env);\n\t\tawait gitOk(parentCwd, [\"add\", \"-A\"], undefined, env);\n\t\tconst tree = await gitOk(parentCwd, [\"write-tree\"], undefined, env);\n\t\treturn gitOk(parentCwd, [\"commit-tree\", tree, \"-p\", \"HEAD\"], \"subagent worktree snapshot\\n\", env);\n\t} finally {\n\t\tawait rm(indexDir, { recursive: true, force: true });\n\t}\n}\n\nfunction pidIsAlive(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn (error as NodeJS.ErrnoException).code === \"EPERM\";\n\t}\n}\n\n/** Remove worktrees and patches left by dead or stale processes. */\nexport async function sweepStaleSubagentWorktrees(\n\tparentCwd: string,\n\tnow: number = Date.now(),\n): Promise<{ removed: string[] }> {\n\tconst repository = await getRepositoryContext(parentCwd);\n\tconst removed: string[] = [];\n\tawait gitOk(repository.parentCwd, [\"worktree\", \"prune\"]);\n\tlet entries: string[];\n\ttry {\n\t\tentries = await readdir(repository.worktreeRoot);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { removed };\n\t\tthrow error;\n\t}\n\tfor (const name of entries) {\n\t\tconst path = join(repository.worktreeRoot, name);\n\t\tconst pid = Number.parseInt(name.split(\"-\")[0] ?? \"\", 10);\n\t\tlet ageMs: number;\n\t\ttry {\n\t\t\tageMs = now - (await stat(path)).mtimeMs;\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n\t\t\tthrow error;\n\t\t}\n\t\tif (pidIsAlive(pid) && ageMs < STALE_AFTER_MS) continue;\n\t\tif (!name.endsWith(\".patch\")) {\n\t\t\tawait runGit(repository.parentCwd, [\"worktree\", \"remove\", \"--force\", path]);\n\t\t}\n\t\tawait rm(path, { recursive: true, force: true });\n\t\tremoved.push(path);\n\t}\n\tawait gitOk(repository.parentCwd, [\"worktree\", \"prune\"]);\n\treturn { removed };\n}\n\nasync function sweepOnce(repository: RepositoryContext): Promise<void> {\n\tif (sweptRepositories.has(repository.key)) return;\n\tlet sweep = sweepingRepositories.get(repository.key);\n\tif (!sweep) {\n\t\tsweep = sweepStaleSubagentWorktrees(repository.parentCwd).then(() => undefined);\n\t\tsweepingRepositories.set(repository.key, sweep);\n\t}\n\ttry {\n\t\tawait sweep;\n\t\tsweptRepositories.add(repository.key);\n\t} finally {\n\t\tif (sweepingRepositories.get(repository.key) === sweep) sweepingRepositories.delete(repository.key);\n\t}\n}\n\nasync function withMergeLock<T>(repository: RepositoryContext, action: () => Promise<T>): Promise<T> {\n\tconst previous = mergeLocks.get(repository.key) ?? Promise.resolve();\n\tlet release: () => void = () => {};\n\tconst gate = new Promise<void>((resolve) => {\n\t\trelease = resolve;\n\t});\n\tconst next = previous.then(() => gate);\n\tmergeLocks.set(repository.key, next);\n\tawait previous;\n\ttry {\n\t\treturn await action();\n\t} finally {\n\t\trelease();\n\t\tif (mergeLocks.get(repository.key) === next) mergeLocks.delete(repository.key);\n\t}\n}\n\nfunction disposeAllActiveSync(): void {\n\tfor (const [worktree, record] of active) {\n\t\ttry {\n\t\t\tspawnProcessSync(\"git\", [\"worktree\", \"remove\", \"--force\", record.path], {\n\t\t\t\tcwd: record.parentCwd,\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\tstdio: \"ignore\",\n\t\t\t});\n\t\t\trmSync(record.path, { recursive: true, force: true });\n\t\t\tspawnProcessSync(\"git\", [\"worktree\", \"prune\"], {\n\t\t\t\tcwd: record.parentCwd,\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\tstdio: \"ignore\",\n\t\t\t});\n\t\t} catch {\n\t\t\t// Process termination leaves no async recovery path; the next sweep retries any residue.\n\t\t} finally {\n\t\t\tactive.delete(worktree);\n\t\t}\n\t}\n}\n\nprocess.once(\"exit\", disposeAllActiveSync);\n\nfor (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n\tconst handler = () => {\n\t\tdisposeAllActiveSync();\n\t\tif (process.listeners(signal).filter((listener) => listener !== handler).length === 0) {\n\t\t\tprocess.removeListener(signal, handler);\n\t\t\tprocess.kill(process.pid, signal);\n\t\t}\n\t};\n\tprocess.prependListener(signal, handler);\n}\n\nexport async function createSubagentWorktree(input: { parentCwd: string; label: string }): Promise<SubagentWorktree> {\n\tconst repository = await getRepositoryContext(input.parentCwd);\n\tawait mkdir(repository.worktreeRoot, { recursive: true });\n\tawait sweepOnce(repository);\n\tconst safeLabel = input.label.replace(/[^A-Za-z0-9_.-]/g, \"-\").slice(0, 64) || \"subagent\";\n\tconst snapshotSha = await snapshotParent(repository.parentCwd);\n\tconst path = await mkdtemp(join(repository.worktreeRoot, `${process.pid}-${safeLabel}-`));\n\ttry {\n\t\tawait gitOk(repository.parentCwd, [\"worktree\", \"add\", \"--detach\", path, snapshotSha]);\n\t} catch (error) {\n\t\tawait rm(path, { recursive: true, force: true });\n\t\tthrow error;\n\t}\n\n\tlet disposePromise: Promise<void> | undefined;\n\tconst worktree: SubagentWorktree = {\n\t\tpath,\n\t\tsnapshotSha,\n\t\tasync mergeBack() {\n\t\t\tawait gitOk(path, [\"add\", \"-A\"]);\n\t\t\tconst changedFiles = (await gitOk(path, [\"diff\", \"--cached\", \"--name-only\", snapshotSha]))\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.sort();\n\t\t\tif (changedFiles.length === 0) return { outcome: \"clean\" as const, changedFiles };\n\t\t\tconst patch = await gitOutput(path, [\"diff\", \"--cached\", \"--binary\", snapshotSha]);\n\t\t\treturn withMergeLock(repository, async () => {\n\t\t\t\tconst check = await runGit(repository.parentCwd, [\"apply\", \"--check\", \"--whitespace=nowarn\"], patch);\n\t\t\t\tif (check.status === 0) {\n\t\t\t\t\tconst apply = await runGit(repository.parentCwd, [\"apply\", \"--whitespace=nowarn\"], patch);\n\t\t\t\t\tif (apply.status === 0) return { outcome: \"clean\" as const, changedFiles };\n\t\t\t\t}\n\t\t\t\tconst patchPath = `${path}.patch`;\n\t\t\t\tawait writeFile(patchPath, patch);\n\t\t\t\treturn { outcome: \"conflict\" as const, changedFiles, patchPath };\n\t\t\t});\n\t\t},\n\t\tdispose() {\n\t\t\tif (disposePromise) return disposePromise;\n\t\t\tdisposePromise = (async () => {\n\t\t\t\tawait runGit(repository.parentCwd, [\"worktree\", \"remove\", \"--force\", path]);\n\t\t\t\tawait rm(path, { recursive: true, force: true });\n\t\t\t\tawait gitOk(repository.parentCwd, [\"worktree\", \"prune\"]);\n\t\t\t})().then(\n\t\t\t\t() => {\n\t\t\t\t\tactive.delete(worktree);\n\t\t\t\t},\n\t\t\t\t(error: unknown) => {\n\t\t\t\t\tdisposePromise = undefined;\n\t\t\t\t\tthrow error;\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn disposePromise;\n\t\t},\n\t};\n\tactive.set(worktree, { parentCwd: repository.parentCwd, path });\n\treturn worktree;\n}\n"]}
1
+ {"version":3,"file":"subagent-worktree.js","sourceRoot":"","sources":["../../../src/core/tools/subagent-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAgC9E,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC;AAClE,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;AACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;AAC3D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;AACpD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC5C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAyB,CAAC;AAE9D,SAAS,MAAM,CAAC,GAAW,EAAE,IAAc,EAAE,KAAc,EAAE,GAAuB;IACnF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACtF,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,IAAc,EAAE,KAAc,EAAE,GAAuB;IAC5F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,GAAW,EAAE,IAAc,EAAE,KAAc,EAAE,GAAuB;IACxF,OAAO,CAAC,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC/B,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,wBAAwB,EAAE,kBAAkB,CAAC,CAAC,CACnF,CAAC;IACF,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjG,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;AAC/D,CAAC;AAED,4GAA4G;AAC5G,KAAK,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iCAAiC,CAAC,CAAC,CAAC;IAClF,MAAM,GAAG,GAAG;QACX,GAAG,OAAO,CAAC,GAAG;QACd,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QACvC,eAAe,EAAE,iBAAiB;QAClC,gBAAgB,EAAE,mBAAmB;QACrC,kBAAkB,EAAE,iBAAiB;QACrC,mBAAmB,EAAE,mBAAmB;KACxC,CAAC;IACF,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACnG,CAAC;YAAS,CAAC;QACV,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC9B,IAAI,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAC1D,CAAC;AACF,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAChD,SAAiB,EACjB,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACJ,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC3E,MAAM,KAAK,CAAC;IACb,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACJ,KAAK,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACjE,MAAM,KAAK,CAAC;QACb,CAAC;QACD,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,cAAc;YAAE,SAAS;QACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,OAAO,EAAE,OAAO,EAAE,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,UAA6B;IACrD,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO;IAClD,IAAI,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,KAAK,GAAG,2BAA2B,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAChF,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC;QACZ,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACV,IAAI,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,KAAK;YAAE,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrG,CAAC;AACF,CAAC;AAED,KAAK,UAAU,aAAa,CAAI,UAA6B,EAAE,MAAwB;IACtF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACrE,IAAI,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC1C,OAAO,GAAG,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACvC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,CAAC;IACf,IAAI,CAAC;QACJ,OAAO,MAAM,MAAM,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACV,OAAO,EAAE,CAAC;QACV,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAChF,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB;IAC5B,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC;YACJ,gBAAgB,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;gBACvE,GAAG,EAAE,MAAM,CAAC,SAAS;gBACrB,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,QAAQ;aACf,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,gBAAgB,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE;gBAC9C,GAAG,EAAE,MAAM,CAAC,SAAS;gBACrB,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,QAAQ;aACf,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,yFAAyF;QAC1F,CAAC;gBAAS,CAAC;YACV,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;AACF,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAE3C,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,GAAG,EAAE;QACpB,oBAAoB,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvF,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;IACF,CAAC,CAAC;IACF,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAA2C;IACvF,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACjE,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IAC1F,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IAC1F,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IACb,CAAC;IACD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACJ,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAChE,IACC,mBAAmB,KAAK,IAAI;YAC5B,mBAAmB,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1C,UAAU,CAAC,mBAAmB,CAAC,EAC9B,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,+CAA+C,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5E,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC;IACb,CAAC;IAED,IAAI,cAAyC,CAAC;IAC9C,MAAM,QAAQ,GAAqB;QAClC,IAAI;QACJ,GAAG;QACH,WAAW;QACX,KAAK,CAAC,SAAS;YACd,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;YACjC,MAAM,YAAY,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;iBACxF,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,EAAE,CAAC;YACT,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,OAAgB,EAAE,YAAY,EAAE,CAAC;YAClF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;YACnF,OAAO,aAAa,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;gBAC3C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,qBAAqB,CAAC,EAAE,KAAK,CAAC,CAAC;gBACrG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,KAAK,CAAC,CAAC;oBAC1F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,EAAE,OAAO,EAAE,OAAgB,EAAE,YAAY,EAAE,CAAC;gBAC5E,CAAC;gBACD,MAAM,SAAS,GAAG,GAAG,IAAI,QAAQ,CAAC;gBAClC,MAAM,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAClC,OAAO,EAAE,OAAO,EAAE,UAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YAClE,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,OAAO;YACN,IAAI,cAAc;gBAAE,OAAO,cAAc,CAAC;YAC1C,cAAc,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC5B,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5E,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjD,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC,EAAE,CAAC,IAAI,CACR,GAAG,EAAE;gBACJ,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;gBAClB,cAAc,GAAG,SAAS,CAAC;gBAC3B,MAAM,KAAK,CAAC;YACb,CAAC,CACD,CAAC;YACF,OAAO,cAAc,CAAC;QACvB,CAAC;KACD,CAAC;IACF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC;AACjB,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { rmSync } from \"node:fs\";\nimport { mkdir, mkdtemp, readdir, realpath, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { spawnProcess, spawnProcessSync } from \"../../utils/child-process.ts\";\n\nexport type SubagentIsolation = \"shared\" | \"worktree\";\nexport type SubagentMergeOutcome = \"clean\" | \"conflict\" | \"skipped\";\n\nexport interface SubagentWorktree {\n\treadonly path: string;\n\treadonly cwd: string;\n\treadonly snapshotSha: string;\n\t/** Apply the child's changes back onto the parent working tree. Never leaves conflict markers. */\n\tmergeBack(): Promise<{ outcome: SubagentMergeOutcome; changedFiles: string[]; patchPath?: string }>;\n\t/** Remove the worktree; safe to call twice. */\n\tdispose(): Promise<void>;\n}\n\ninterface GitResult {\n\tstatus: number;\n\tstdout: string;\n\tstderr: string;\n}\n\ninterface RepositoryContext {\n\tparentCwd: string;\n\tkey: string;\n\tworktreeRoot: string;\n}\n\ninterface ActiveWorktree {\n\tparentCwd: string;\n\tpath: string;\n}\n\nconst WORKTREE_ROOT = join(tmpdir(), \"humain-terminal-worktrees\");\nconst STALE_AFTER_MS = 6 * 60 * 60_000;\nconst active = new Map<SubagentWorktree, ActiveWorktree>();\nconst mergeLocks = new Map<string, Promise<void>>();\nconst sweptRepositories = new Set<string>();\nconst sweepingRepositories = new Map<string, Promise<void>>();\n\nfunction runGit(cwd: string, args: string[], stdin?: string, env?: NodeJS.ProcessEnv): Promise<GitResult> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst proc = spawnProcess(\"git\", args, { cwd, env, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tproc.stdout?.on(\"data\", (chunk) => {\n\t\t\tstdout += String(chunk);\n\t\t});\n\t\tproc.stderr?.on(\"data\", (chunk) => {\n\t\t\tstderr += String(chunk);\n\t\t});\n\t\tproc.once(\"error\", reject);\n\t\tproc.once(\"close\", (status) => resolve({ status: status ?? 1, stdout, stderr }));\n\t\tproc.stdin?.end(stdin);\n\t});\n}\n\nasync function gitOutput(cwd: string, args: string[], stdin?: string, env?: NodeJS.ProcessEnv): Promise<string> {\n\tconst result = await runGit(cwd, args, stdin, env);\n\tif (result.status !== 0) {\n\t\tthrow new Error(`git ${args[0]} failed: ${result.stderr.trim() || result.stdout.trim()}`);\n\t}\n\treturn result.stdout;\n}\n\nasync function gitOk(cwd: string, args: string[], stdin?: string, env?: NodeJS.ProcessEnv): Promise<string> {\n\treturn (await gitOutput(cwd, args, stdin, env)).trim();\n}\n\nasync function getRepositoryContext(cwd: string): Promise<RepositoryContext> {\n\tconst parentCwd = await realpath(await gitOk(cwd, [\"rev-parse\", \"--show-toplevel\"]));\n\tconst commonDir = await realpath(\n\t\tawait gitOk(parentCwd, [\"rev-parse\", \"--path-format=absolute\", \"--git-common-dir\"]),\n\t);\n\tconst key = createHash(\"sha256\").update(`${parentCwd}\\0${commonDir}`).digest(\"hex\").slice(0, 24);\n\treturn { parentCwd, key, worktreeRoot: join(WORKTREE_ROOT, key) };\n}\n\nexport async function isGitWorkTree(cwd: string): Promise<boolean> {\n\tconst result = await runGit(cwd, [\"rev-parse\", \"--is-inside-work-tree\"]);\n\treturn result.status === 0 && result.stdout.trim() === \"true\";\n}\n\n/** Commit HEAD plus tracked and non-ignored untracked files without changing the parent's index or refs. */\nasync function snapshotParent(parentCwd: string): Promise<string> {\n\tconst indexDir = await mkdtemp(join(tmpdir(), \"humain-terminal-worktree-index-\"));\n\tconst env = {\n\t\t...process.env,\n\t\tGIT_INDEX_FILE: join(indexDir, \"index\"),\n\t\tGIT_AUTHOR_NAME: \"HUMAIN Terminal\",\n\t\tGIT_AUTHOR_EMAIL: \"noreply@humain.ai\",\n\t\tGIT_COMMITTER_NAME: \"HUMAIN Terminal\",\n\t\tGIT_COMMITTER_EMAIL: \"noreply@humain.ai\",\n\t};\n\ttry {\n\t\tawait gitOk(parentCwd, [\"read-tree\", \"HEAD\"], undefined, env);\n\t\tawait gitOk(parentCwd, [\"add\", \"-A\"], undefined, env);\n\t\tconst tree = await gitOk(parentCwd, [\"write-tree\"], undefined, env);\n\t\treturn gitOk(parentCwd, [\"commit-tree\", tree, \"-p\", \"HEAD\"], \"subagent worktree snapshot\\n\", env);\n\t} finally {\n\t\tawait rm(indexDir, { recursive: true, force: true });\n\t}\n}\n\nfunction pidIsAlive(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn (error as NodeJS.ErrnoException).code === \"EPERM\";\n\t}\n}\n\n/** Remove worktrees and patches left by dead or stale processes. */\nexport async function sweepStaleSubagentWorktrees(\n\tparentCwd: string,\n\tnow: number = Date.now(),\n): Promise<{ removed: string[] }> {\n\tconst repository = await getRepositoryContext(parentCwd);\n\tconst removed: string[] = [];\n\tawait gitOk(repository.parentCwd, [\"worktree\", \"prune\"]);\n\tlet entries: string[];\n\ttry {\n\t\tentries = await readdir(repository.worktreeRoot);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { removed };\n\t\tthrow error;\n\t}\n\tfor (const name of entries) {\n\t\tconst path = join(repository.worktreeRoot, name);\n\t\tconst pid = Number.parseInt(name.split(\"-\")[0] ?? \"\", 10);\n\t\tlet ageMs: number;\n\t\ttry {\n\t\t\tageMs = now - (await stat(path)).mtimeMs;\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n\t\t\tthrow error;\n\t\t}\n\t\tif (pidIsAlive(pid) && ageMs < STALE_AFTER_MS) continue;\n\t\tif (!name.endsWith(\".patch\")) {\n\t\t\tawait runGit(repository.parentCwd, [\"worktree\", \"remove\", \"--force\", path]);\n\t\t}\n\t\tawait rm(path, { recursive: true, force: true });\n\t\tremoved.push(path);\n\t}\n\tawait gitOk(repository.parentCwd, [\"worktree\", \"prune\"]);\n\treturn { removed };\n}\n\nasync function sweepOnce(repository: RepositoryContext): Promise<void> {\n\tif (sweptRepositories.has(repository.key)) return;\n\tlet sweep = sweepingRepositories.get(repository.key);\n\tif (!sweep) {\n\t\tsweep = sweepStaleSubagentWorktrees(repository.parentCwd).then(() => undefined);\n\t\tsweepingRepositories.set(repository.key, sweep);\n\t}\n\ttry {\n\t\tawait sweep;\n\t\tsweptRepositories.add(repository.key);\n\t} finally {\n\t\tif (sweepingRepositories.get(repository.key) === sweep) sweepingRepositories.delete(repository.key);\n\t}\n}\n\nasync function withMergeLock<T>(repository: RepositoryContext, action: () => Promise<T>): Promise<T> {\n\tconst previous = mergeLocks.get(repository.key) ?? Promise.resolve();\n\tlet release: () => void = () => {};\n\tconst gate = new Promise<void>((resolve) => {\n\t\trelease = resolve;\n\t});\n\tconst next = previous.then(() => gate);\n\tmergeLocks.set(repository.key, next);\n\tawait previous;\n\ttry {\n\t\treturn await action();\n\t} finally {\n\t\trelease();\n\t\tif (mergeLocks.get(repository.key) === next) mergeLocks.delete(repository.key);\n\t}\n}\n\nfunction disposeAllActiveSync(): void {\n\tfor (const [worktree, record] of active) {\n\t\ttry {\n\t\t\tspawnProcessSync(\"git\", [\"worktree\", \"remove\", \"--force\", record.path], {\n\t\t\t\tcwd: record.parentCwd,\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\tstdio: \"ignore\",\n\t\t\t});\n\t\t\trmSync(record.path, { recursive: true, force: true });\n\t\t\tspawnProcessSync(\"git\", [\"worktree\", \"prune\"], {\n\t\t\t\tcwd: record.parentCwd,\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\tstdio: \"ignore\",\n\t\t\t});\n\t\t} catch {\n\t\t\t// Process termination leaves no async recovery path; the next sweep retries any residue.\n\t\t} finally {\n\t\t\tactive.delete(worktree);\n\t\t}\n\t}\n}\n\nprocess.once(\"exit\", disposeAllActiveSync);\n\nfor (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n\tconst handler = () => {\n\t\tdisposeAllActiveSync();\n\t\tif (process.listeners(signal).filter((listener) => listener !== handler).length === 0) {\n\t\t\tprocess.removeListener(signal, handler);\n\t\t\tprocess.kill(process.pid, signal);\n\t\t}\n\t};\n\tprocess.prependListener(signal, handler);\n}\n\nexport async function createSubagentWorktree(input: { parentCwd: string; label: string }): Promise<SubagentWorktree> {\n\tconst repository = await getRepositoryContext(input.parentCwd);\n\tconst requestedCwd = await realpath(input.parentCwd);\n\tconst relativeCwd = relative(repository.parentCwd, requestedCwd);\n\tif (relativeCwd === \"..\" || relativeCwd.startsWith(`..${sep}`) || isAbsolute(relativeCwd)) {\n\t\tthrow new Error(`Subagent cwd is outside the repository: ${input.parentCwd}`);\n\t}\n\tawait mkdir(repository.worktreeRoot, { recursive: true });\n\tawait sweepOnce(repository);\n\tconst safeLabel = input.label.replace(/[^A-Za-z0-9_.-]/g, \"-\").slice(0, 64) || \"subagent\";\n\tconst snapshotSha = await snapshotParent(repository.parentCwd);\n\tconst path = await mkdtemp(join(repository.worktreeRoot, `${process.pid}-${safeLabel}-`));\n\ttry {\n\t\tawait gitOk(repository.parentCwd, [\"worktree\", \"add\", \"--detach\", path, snapshotSha]);\n\t} catch (error) {\n\t\tawait rm(path, { recursive: true, force: true });\n\t\tthrow error;\n\t}\n\tlet cwd: string;\n\ttry {\n\t\tconst mappedCwd = resolve(path, relativeCwd);\n\t\tawait mkdir(mappedCwd, { recursive: true });\n\t\tcwd = await realpath(mappedCwd);\n\t\tconst worktreeRelativeCwd = relative(await realpath(path), cwd);\n\t\tif (\n\t\t\tworktreeRelativeCwd === \"..\" ||\n\t\t\tworktreeRelativeCwd.startsWith(`..${sep}`) ||\n\t\t\tisAbsolute(worktreeRelativeCwd)\n\t\t) {\n\t\t\tthrow new Error(`Subagent cwd resolves outside its worktree: ${input.parentCwd}`);\n\t\t}\n\t} catch (error) {\n\t\tawait runGit(repository.parentCwd, [\"worktree\", \"remove\", \"--force\", path]);\n\t\tawait rm(path, { recursive: true, force: true });\n\t\tawait gitOk(repository.parentCwd, [\"worktree\", \"prune\"]);\n\t\tthrow error;\n\t}\n\n\tlet disposePromise: Promise<void> | undefined;\n\tconst worktree: SubagentWorktree = {\n\t\tpath,\n\t\tcwd,\n\t\tsnapshotSha,\n\t\tasync mergeBack() {\n\t\t\tawait gitOk(path, [\"add\", \"-A\"]);\n\t\t\tconst changedFiles = (await gitOk(path, [\"diff\", \"--cached\", \"--name-only\", snapshotSha]))\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.sort();\n\t\t\tif (changedFiles.length === 0) return { outcome: \"clean\" as const, changedFiles };\n\t\t\tconst patch = await gitOutput(path, [\"diff\", \"--cached\", \"--binary\", snapshotSha]);\n\t\t\treturn withMergeLock(repository, async () => {\n\t\t\t\tconst check = await runGit(repository.parentCwd, [\"apply\", \"--check\", \"--whitespace=nowarn\"], patch);\n\t\t\t\tif (check.status === 0) {\n\t\t\t\t\tconst apply = await runGit(repository.parentCwd, [\"apply\", \"--whitespace=nowarn\"], patch);\n\t\t\t\t\tif (apply.status === 0) return { outcome: \"clean\" as const, changedFiles };\n\t\t\t\t}\n\t\t\t\tconst patchPath = `${path}.patch`;\n\t\t\t\tawait writeFile(patchPath, patch);\n\t\t\t\treturn { outcome: \"conflict\" as const, changedFiles, patchPath };\n\t\t\t});\n\t\t},\n\t\tdispose() {\n\t\t\tif (disposePromise) return disposePromise;\n\t\t\tdisposePromise = (async () => {\n\t\t\t\tawait runGit(repository.parentCwd, [\"worktree\", \"remove\", \"--force\", path]);\n\t\t\t\tawait rm(path, { recursive: true, force: true });\n\t\t\t\tawait gitOk(repository.parentCwd, [\"worktree\", \"prune\"]);\n\t\t\t})().then(\n\t\t\t\t() => {\n\t\t\t\t\tactive.delete(worktree);\n\t\t\t\t},\n\t\t\t\t(error: unknown) => {\n\t\t\t\t\tdisposePromise = undefined;\n\t\t\t\t\tthrow error;\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn disposePromise;\n\t\t},\n\t};\n\tactive.set(worktree, { parentCwd: repository.parentCwd, path });\n\treturn worktree;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAO,OAAO,EAAS,MAAM,uBAAuB,CAAC;AAGjE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI/B,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG/E,OAAO,EAGN,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAEzB,MAAM,wBAAwB,CAAC;AAQhC,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AAUnE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAyED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAmBnF;AAoGD,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IAC3C,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAuYD,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAqBlB,CAAC;AAEH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,cAAc,EAAE,eAAe,CAAC,CAopBhH;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,2EAE7C"}
1
+ {"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../../src/core/tools/subagent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAO,OAAO,EAAS,MAAM,uBAAuB,CAAC;AAGjE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI/B,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG/E,OAAO,EAGN,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAEzB,MAAM,wBAAwB,CAAC;AAQhC,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AAUnE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAyED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAmBnF;AAoGD,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IAC3C,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,oBAAoB,EAAE,CAAC;CAChC;AA0YD,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAqBlB,CAAC;AAEH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,cAAc,EAAE,eAAe,CAAC,CAopBhH;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,2EAE7C"}
@@ -369,7 +369,7 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, isolatio
369
369
  if (isolation === "worktree") {
370
370
  if (await isGitWorkTree(parentCwd)) {
371
371
  worktree = await createSubagentWorktree({ parentCwd, label: `${toolCallId}-${childIndex}` });
372
- childCwd = worktree.path;
372
+ childCwd = worktree.cwd;
373
373
  currentResult.isolation = "worktree";
374
374
  }
375
375
  else {
@@ -525,7 +525,10 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, isolatio
525
525
  }
526
526
  catch (error) {
527
527
  currentResult.exitCode = 1;
528
- currentResult.errorMessage = `subagent worktree cleanup failed: ${error instanceof Error ? error.message : String(error)}`;
528
+ const cleanupError = `subagent worktree cleanup failed: ${error instanceof Error ? error.message : String(error)}`;
529
+ const primaryOutput = getResultOutput(currentResult);
530
+ currentResult.errorMessage =
531
+ primaryOutput === "(no output)" ? cleanupError : `${primaryOutput}\n${cleanupError}`;
529
532
  }
530
533
  }
531
534
  }