@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.
- package/CHANGELOG.md +36 -0
- package/dist/bun/cli.d.ts +3 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +3 -8
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/runtime-setup.d.ts +2 -0
- package/dist/bun/runtime-setup.d.ts.map +1 -0
- package/dist/bun/runtime-setup.js +9 -0
- package/dist/bun/runtime-setup.js.map +1 -0
- package/dist/bun/sandbox-env-setup.d.ts +2 -0
- package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
- package/dist/bun/sandbox-env-setup.js +4 -0
- package/dist/bun/sandbox-env-setup.js.map +1 -0
- package/dist/bundle/chunks/anthropic-messages-XULXUBIG.js +6 -0
- package/dist/bundle/chunks/{azure-openai-responses-ZN52D6YC.js → azure-openai-responses-JEG2XOYC.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +6 -6
- package/dist/bundle/chunks/{chunk-ARF4OE6X.js → chunk-2LC3S3VV.js} +8 -8
- package/dist/bundle/chunks/chunk-43O5DDAH.js +31 -0
- package/dist/bundle/chunks/{chunk-H2O6VOXT.js → chunk-46DC2JD6.js} +2 -2
- package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
- package/dist/bundle/chunks/{chunk-WJZ4KLGL.js → chunk-E6KP6V7F.js} +1 -1
- package/dist/bundle/chunks/{chunk-PSKDLDLZ.js → chunk-HPPQHK3J.js} +3 -3
- package/dist/bundle/chunks/chunk-JUPSJTFQ.js +42 -0
- package/dist/bundle/chunks/chunk-PL7O7J4J.js +133 -0
- package/dist/bundle/chunks/{chunk-PFVS5ZYL.js → chunk-RM336IEI.js} +378 -369
- package/dist/bundle/chunks/chunk-USJZMAIR.js +2 -0
- package/dist/bundle/chunks/{extract-2L7ZVN7F.js → extract-TRW5FBY6.js} +2 -2
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-FF7M7XHT.js → google-generative-ai-OX6VSCA6.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-YMUBFRBA.js → google-vertex-GW76GSS2.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{mistral-conversations-O4M7IQML.js → mistral-conversations-WXGXZOFJ.js} +1 -1
- package/dist/bundle/chunks/node-AUOGOBCN.js +2 -0
- package/dist/bundle/chunks/node-KOIP55YZ.js +16 -0
- package/dist/bundle/chunks/openai-codex-responses-NPLWP6ZC.js +10 -0
- package/dist/bundle/chunks/{openai-completions-L4AHDQ5D.js → openai-completions-OT2GTJKC.js} +3 -3
- package/dist/bundle/chunks/openai-responses-5A6CR7GI.js +2 -0
- package/dist/bundle/chunks/{openrouter-images-Y2PCWAQH.js → openrouter-images-YLQ4RJ2F.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-57K43J6J.js → pi-messages-OJF77SY3.js} +1 -1
- package/dist/bundle/chunks/{undici-D6ABF53Q.js → undici-KA2LJNVT.js} +1 -1
- package/dist/bundle/chunks/webapi-RFAXLI2D.js +5 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +2 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +13 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli.js +2 -14
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +15 -7
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +14 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +2 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +1 -2
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +2 -0
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +4 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts +15 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +3 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts +1 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +5 -2
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +8 -2
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +40 -13
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -2
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +8 -9
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +3 -120
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +1 -12
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +5 -163
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +4 -55
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +4 -60
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +4 -49
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +4 -120
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts +12 -0
- package/dist/core/tools/renderers/bash.d.ts.map +1 -0
- package/dist/core/tools/renderers/bash.js +133 -0
- package/dist/core/tools/renderers/bash.js.map +1 -0
- package/dist/core/tools/renderers/edit.d.ts +23 -0
- package/dist/core/tools/renderers/edit.d.ts.map +1 -0
- package/dist/core/tools/renderers/edit.js +167 -0
- package/dist/core/tools/renderers/edit.js.map +1 -0
- package/dist/core/tools/renderers/find.d.ts +10 -0
- package/dist/core/tools/renderers/find.d.ts.map +1 -0
- package/dist/core/tools/renderers/find.js +64 -0
- package/dist/core/tools/renderers/find.js.map +1 -0
- package/dist/core/tools/renderers/grep.d.ts +10 -0
- package/dist/core/tools/renderers/grep.d.ts.map +1 -0
- package/dist/core/tools/renderers/grep.js +69 -0
- package/dist/core/tools/renderers/grep.js.map +1 -0
- package/dist/core/tools/renderers/index.d.ts +22 -0
- package/dist/core/tools/renderers/index.d.ts.map +1 -0
- package/dist/core/tools/renderers/index.js +48 -0
- package/dist/core/tools/renderers/index.js.map +1 -0
- package/dist/core/tools/renderers/ls.d.ts +10 -0
- package/dist/core/tools/renderers/ls.d.ts.map +1 -0
- package/dist/core/tools/renderers/ls.js +58 -0
- package/dist/core/tools/renderers/ls.js.map +1 -0
- package/dist/core/tools/renderers/read.d.ts +11 -0
- package/dist/core/tools/renderers/read.d.ts.map +1 -0
- package/dist/core/tools/renderers/read.js +129 -0
- package/dist/core/tools/renderers/read.js.map +1 -0
- package/dist/core/tools/renderers/write.d.ts +10 -0
- package/dist/core/tools/renderers/write.d.ts.map +1 -0
- package/dist/core/tools/renderers/write.js +152 -0
- package/dist/core/tools/renderers/write.js.map +1 -0
- package/dist/core/tools/subagent-worktree.d.ts +1 -0
- package/dist/core/tools/subagent-worktree.d.ts.map +1 -1
- package/dist/core/tools/subagent-worktree.js +25 -1
- package/dist/core/tools/subagent-worktree.js.map +1 -1
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +5 -2
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +5 -145
- package/dist/core/tools/write.js.map +1 -1
- package/dist/humain/bedrock-provider/vendor/index.bundle.mjs +51 -12
- package/dist/humain/mcp-adapter/vendor/package.json +2 -2
- package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.js +3 -1
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.d.ts +2 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.js +4 -2
- package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.js +11 -4
- package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
- package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/github-extract.js +238 -1
- package/dist/humain/web-access/vendor/github-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/index.js +118 -64
- package/dist/humain/web-access/vendor/index.js.map +1 -1
- package/dist/humain/web-access/vendor/mistral-search.d.ts +4 -0
- package/dist/humain/web-access/vendor/mistral-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/mistral-search.js +274 -0
- package/dist/humain/web-access/vendor/mistral-search.js.map +1 -0
- package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/perplexity.js +12 -1
- package/dist/humain/web-access/vendor/perplexity.js.map +1 -1
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/utils.js +1 -2
- package/dist/humain/web-access/vendor/utils.js.map +1 -1
- package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/xai-search.js +92 -35
- package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +4 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/chat-viewport.d.ts +20 -0
- package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
- package/dist/modes/interactive/chat-viewport.js +28 -0
- package/dist/modes/interactive/chat-viewport.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +18 -10
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +37 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +8 -17
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +14 -10
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +10 -3
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +4 -4
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +34 -32
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +2 -2
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -15
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +96 -81
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/session-share.d.ts.map +1 -1
- package/dist/modes/interactive/session-share.js +8 -12
- package/dist/modes/interactive/session-share.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +2 -1
- package/dist/modes/interactive/theme/light.json +2 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +5 -0
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
- package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-json.js +130 -0
- package/dist/modes/interactive/theme/theme-json.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +6 -2
- package/dist/modes/interactive/theme/theme.d.ts +14 -5
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +18 -119
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tui-renderer.d.ts +21 -0
- package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
- package/dist/modes/interactive/tui-renderer.js +66 -0
- package/dist/modes/interactive/tui-renderer.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js +2 -3
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +41 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/containerization.md +45 -0
- package/docs/development.md +19 -0
- package/docs/environment-variables.md +2 -0
- package/docs/extensions.md +5 -2
- package/docs/keybindings.md +5 -2
- package/docs/models.md +4 -1
- package/docs/rpc.md +1 -1
- package/docs/sdk.md +5 -0
- package/docs/settings.md +3 -3
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +15 -0
- package/docs/themes.md +8 -6
- package/docs/tui.md +19 -0
- package/examples/README.md +3 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +84 -84
- package/examples/extensions/custom-provider-anthropic/package.json +17 -17
- package/examples/extensions/custom-provider-gitlab-duo/package.json +14 -14
- package/examples/extensions/dynamic-resources/dynamic.json +2 -0
- package/examples/extensions/gondolin/package-lock.json +8 -8
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +6 -6
- package/examples/extensions/sandbox/package.json +2 -2
- package/examples/extensions/with-deps/package-lock.json +29 -29
- package/examples/extensions/with-deps/package.json +20 -20
- package/examples/plugins/pi-example-plugin/README.md +38 -0
- package/examples/plugins/pi-example-plugin/package.json +10 -0
- package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
- package/examples/plugins/pi-example-plugin/src/session.ts +23 -0
- package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
- package/npm-shrinkwrap.json +772 -205
- package/package.json +31 -24
- package/src/humain/web-access/UPSTREAM.md +12 -1
- package/src/humain/web-access/upstream.json +4 -4
- package/dist/bundle/chunks/anthropic-messages-M4LCS3KH.js +0 -6
- package/dist/bundle/chunks/chunk-3VI4HD7D.js +0 -31
- package/dist/bundle/chunks/chunk-BOW22LW6.js +0 -42
- package/dist/bundle/chunks/chunk-CBHC6EL7.js +0 -133
- package/dist/bundle/chunks/chunk-JUUC5AZY.js +0 -2
- package/dist/bundle/chunks/node-ZHY4LHC7.js +0 -15
- package/dist/bundle/chunks/openai-codex-responses-HRVCDY54.js +0 -8
- package/dist/bundle/chunks/openai-responses-4MWLJHIK.js +0 -2
- package/dist/bundle/chunks/webapi-AFS5FDJJ.js +0 -5
- package/dist/bundle/client.js +0 -2
- package/dist/cli/experimental/auth.d.ts +0 -16
- package/dist/cli/experimental/auth.d.ts.map +0 -1
- package/dist/cli/experimental/auth.js +0 -13
- package/dist/cli/experimental/auth.js.map +0 -1
- package/dist/cli/experimental/cli.d.ts +0 -6
- package/dist/cli/experimental/cli.d.ts.map +0 -1
- package/dist/cli/experimental/cli.js +0 -5
- package/dist/cli/experimental/cli.js.map +0 -1
- package/dist/cli/experimental/command-options.d.ts +0 -17
- package/dist/cli/experimental/command-options.d.ts.map +0 -1
- package/dist/cli/experimental/command-options.js +0 -35
- package/dist/cli/experimental/command-options.js.map +0 -1
- package/dist/cli/experimental/command.d.ts +0 -63
- package/dist/cli/experimental/command.d.ts.map +0 -1
- package/dist/cli/experimental/command.js +0 -127
- package/dist/cli/experimental/command.js.map +0 -1
- package/dist/cli/experimental/commands/client.d.ts +0 -13
- package/dist/cli/experimental/commands/client.d.ts.map +0 -1
- package/dist/cli/experimental/commands/client.js +0 -25
- package/dist/cli/experimental/commands/client.js.map +0 -1
- package/dist/cli/experimental/commands/pi.d.ts +0 -15
- package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
- package/dist/cli/experimental/commands/pi.js +0 -28
- package/dist/cli/experimental/commands/pi.js.map +0 -1
- package/dist/cli/experimental/commands/server.d.ts +0 -13
- package/dist/cli/experimental/commands/server.d.ts.map +0 -1
- package/dist/cli/experimental/commands/server.js +0 -25
- package/dist/cli/experimental/commands/server.js.map +0 -1
- package/dist/cli/experimental/transport-address.d.ts +0 -10
- package/dist/cli/experimental/transport-address.d.ts.map +0 -1
- package/dist/cli/experimental/transport-address.js +0 -38
- package/dist/cli/experimental/transport-address.js.map +0 -1
- package/dist/client/index.d.ts +0 -3
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -3
- package/dist/client/index.js.map +0 -1
- package/dist/client/remote-session.d.ts +0 -53
- package/dist/client/remote-session.d.ts.map +0 -1
- package/dist/client/remote-session.js +0 -340
- package/dist/client/remote-session.js.map +0 -1
- package/dist/client/transcript.d.ts +0 -12
- package/dist/client/transcript.d.ts.map +0 -1
- package/dist/client/transcript.js +0 -98
- package/dist/client/transcript.js.map +0 -1
- package/dist/server/create-harness.d.ts +0 -26
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -106
- 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,
|
|
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":"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,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA+B9E,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,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;IAED,IAAI,cAAyC,CAAC;IAC9C,MAAM,QAAQ,GAAqB;QAClC,IAAI;QACJ,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 { 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":"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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 { 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;
|
|
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.
|
|
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
|
-
|
|
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
|
}
|