agent-tower 0.7.1-beta.3 → 0.7.1-beta.4
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/dist/executors/__tests__/base.executor.test.js +2 -2
- package/dist/executors/__tests__/base.executor.test.js.map +1 -1
- package/dist/executors/__tests__/codex.executor.test.js +137 -25
- package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
- package/dist/executors/__tests__/providers.test.js +69 -2
- package/dist/executors/__tests__/providers.test.js.map +1 -1
- package/dist/executors/__tests__/stdin-prompt.executors.test.js +61 -3
- package/dist/executors/__tests__/stdin-prompt.executors.test.js.map +1 -1
- package/dist/executors/base.executor.d.ts +8 -1
- package/dist/executors/base.executor.d.ts.map +1 -1
- package/dist/executors/base.executor.js +22 -8
- package/dist/executors/base.executor.js.map +1 -1
- package/dist/executors/claude-code.executor.d.ts +2 -0
- package/dist/executors/claude-code.executor.d.ts.map +1 -1
- package/dist/executors/claude-code.executor.js +51 -41
- package/dist/executors/claude-code.executor.js.map +1 -1
- package/dist/executors/codex.executor.d.ts +3 -0
- package/dist/executors/codex.executor.d.ts.map +1 -1
- package/dist/executors/codex.executor.js +35 -1
- package/dist/executors/codex.executor.js.map +1 -1
- package/dist/executors/cursor-agent.executor.d.ts +1 -0
- package/dist/executors/cursor-agent.executor.d.ts.map +1 -1
- package/dist/executors/cursor-agent.executor.js +2 -0
- package/dist/executors/cursor-agent.executor.js.map +1 -1
- package/dist/executors/default-providers.json +45 -39
- package/dist/executors/gemini-cli.executor.d.ts +3 -1
- package/dist/executors/gemini-cli.executor.d.ts.map +1 -1
- package/dist/executors/gemini-cli.executor.js +18 -12
- package/dist/executors/gemini-cli.executor.js.map +1 -1
- package/dist/executors/index.d.ts +4 -0
- package/dist/executors/index.d.ts.map +1 -1
- package/dist/executors/index.js +14 -4
- package/dist/executors/index.js.map +1 -1
- package/dist/executors/providers.d.ts +4 -1
- package/dist/executors/providers.d.ts.map +1 -1
- package/dist/executors/providers.js +20 -5
- package/dist/executors/providers.js.map +1 -1
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.d.ts +2 -0
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.d.ts.map +1 -0
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.js +84 -0
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.js.map +1 -0
- package/dist/output/claude-code-parser.d.ts +14 -2
- package/dist/output/claude-code-parser.d.ts.map +1 -1
- package/dist/output/claude-code-parser.js +55 -8
- package/dist/output/claude-code-parser.js.map +1 -1
- package/dist/pipeline/__tests__/agent-pipeline.test.js +48 -1
- package/dist/pipeline/__tests__/agent-pipeline.test.js.map +1 -1
- package/dist/pipeline/agent-pipeline.d.ts +6 -1
- package/dist/pipeline/agent-pipeline.d.ts.map +1 -1
- package/dist/pipeline/agent-pipeline.js +42 -4
- package/dist/pipeline/agent-pipeline.js.map +1 -1
- package/dist/routes/__tests__/providers.test.js +287 -12
- package/dist/routes/__tests__/providers.test.js.map +1 -1
- package/dist/routes/__tests__/sessions-runtime.test.js +9 -0
- package/dist/routes/__tests__/sessions-runtime.test.js.map +1 -1
- package/dist/routes/providers.d.ts +2 -0
- package/dist/routes/providers.d.ts.map +1 -1
- package/dist/routes/providers.js +79 -34
- package/dist/routes/providers.js.map +1 -1
- package/dist/routes/sessions.js +2 -2
- package/dist/routes/sessions.js.map +1 -1
- package/dist/runtime/__tests__/acp-agent-definitions.test.js +54 -6
- package/dist/runtime/__tests__/acp-agent-definitions.test.js.map +1 -1
- package/dist/runtime/__tests__/acp-driver-lifecycle.test.js +85 -12
- package/dist/runtime/__tests__/acp-driver-lifecycle.test.js.map +1 -1
- package/dist/runtime/__tests__/acp-driver.test.js +38 -1
- package/dist/runtime/__tests__/acp-driver.test.js.map +1 -1
- package/dist/runtime/__tests__/claude-cli-control.test.d.ts +2 -0
- package/dist/runtime/__tests__/claude-cli-control.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/claude-cli-control.test.js +147 -0
- package/dist/runtime/__tests__/claude-cli-control.test.js.map +1 -0
- package/dist/runtime/__tests__/claude-cli-driver.test.d.ts +2 -0
- package/dist/runtime/__tests__/claude-cli-driver.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/claude-cli-driver.test.js +327 -0
- package/dist/runtime/__tests__/claude-cli-driver.test.js.map +1 -0
- package/dist/runtime/__tests__/cli-driver-lifecycle.test.js +107 -2
- package/dist/runtime/__tests__/cli-driver-lifecycle.test.js.map +1 -1
- package/dist/runtime/__tests__/codex-cli-control.test.d.ts +2 -0
- package/dist/runtime/__tests__/codex-cli-control.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/codex-cli-control.test.js +287 -0
- package/dist/runtime/__tests__/codex-cli-control.test.js.map +1 -0
- package/dist/runtime/__tests__/codex-cli-identity.test.d.ts +2 -0
- package/dist/runtime/__tests__/codex-cli-identity.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/codex-cli-identity.test.js +166 -0
- package/dist/runtime/__tests__/codex-cli-identity.test.js.map +1 -0
- package/dist/runtime/__tests__/codex-runtime-resolution.test.js +34 -0
- package/dist/runtime/__tests__/codex-runtime-resolution.test.js.map +1 -1
- package/dist/runtime/__tests__/runtime-coordinator.test.js +74 -0
- package/dist/runtime/__tests__/runtime-coordinator.test.js.map +1 -1
- package/dist/runtime/acp/acp-driver.d.ts.map +1 -1
- package/dist/runtime/acp/acp-driver.js +27 -9
- package/dist/runtime/acp/acp-driver.js.map +1 -1
- package/dist/runtime/acp/agents/claude-code.d.ts.map +1 -1
- package/dist/runtime/acp/agents/claude-code.js +6 -11
- package/dist/runtime/acp/agents/claude-code.js.map +1 -1
- package/dist/runtime/acp/agents/codex.d.ts.map +1 -1
- package/dist/runtime/acp/agents/codex.js +15 -6
- package/dist/runtime/acp/agents/codex.js.map +1 -1
- package/dist/runtime/acp/agents/cursor-agent.d.ts.map +1 -1
- package/dist/runtime/acp/agents/cursor-agent.js +2 -1
- package/dist/runtime/acp/agents/cursor-agent.js.map +1 -1
- package/dist/runtime/acp/agents/deepseek-hermes.js +3 -3
- package/dist/runtime/acp/agents/deepseek-hermes.js.map +1 -1
- package/dist/runtime/acp/agents/gemini-cli.d.ts.map +1 -1
- package/dist/runtime/acp/agents/gemini-cli.js +1 -0
- package/dist/runtime/acp/agents/gemini-cli.js.map +1 -1
- package/dist/runtime/acp/agents/grok-build.d.ts.map +1 -1
- package/dist/runtime/acp/agents/grok-build.js +4 -1
- package/dist/runtime/acp/agents/grok-build.js.map +1 -1
- package/dist/runtime/acp/agents/kiro-cli.d.ts.map +1 -1
- package/dist/runtime/acp/agents/kiro-cli.js +2 -1
- package/dist/runtime/acp/agents/kiro-cli.js.map +1 -1
- package/dist/runtime/acp/agents/minion-code.js +1 -1
- package/dist/runtime/acp/agents/minion-code.js.map +1 -1
- package/dist/runtime/acp/agents/native-agent.d.ts +2 -0
- package/dist/runtime/acp/agents/native-agent.d.ts.map +1 -1
- package/dist/runtime/acp/agents/native-agent.js +12 -16
- package/dist/runtime/acp/agents/native-agent.js.map +1 -1
- package/dist/runtime/acp/agents/opencode.d.ts.map +1 -1
- package/dist/runtime/acp/agents/opencode.js +50 -2
- package/dist/runtime/acp/agents/opencode.js.map +1 -1
- package/dist/runtime/acp/agents/pi-coding-agent.d.ts.map +1 -1
- package/dist/runtime/acp/agents/pi-coding-agent.js +2 -5
- package/dist/runtime/acp/agents/pi-coding-agent.js.map +1 -1
- package/dist/runtime/acp/agents/qwen-code.d.ts.map +1 -1
- package/dist/runtime/acp/agents/qwen-code.js +9 -11
- package/dist/runtime/acp/agents/qwen-code.js.map +1 -1
- package/dist/runtime/acp/agents/types.d.ts +4 -2
- package/dist/runtime/acp/agents/types.d.ts.map +1 -1
- package/dist/runtime/acp/codex-cli-identity.d.ts +52 -0
- package/dist/runtime/acp/codex-cli-identity.d.ts.map +1 -0
- package/dist/runtime/acp/codex-cli-identity.js +179 -0
- package/dist/runtime/acp/codex-cli-identity.js.map +1 -0
- package/dist/runtime/acp/codex-provider-config.d.ts +15 -2
- package/dist/runtime/acp/codex-provider-config.d.ts.map +1 -1
- package/dist/runtime/acp/codex-provider-config.js +42 -5
- package/dist/runtime/acp/codex-provider-config.js.map +1 -1
- package/dist/runtime/claude-cli-control.d.ts +32 -0
- package/dist/runtime/claude-cli-control.d.ts.map +1 -0
- package/dist/runtime/claude-cli-control.js +156 -0
- package/dist/runtime/claude-cli-control.js.map +1 -0
- package/dist/runtime/cli-action-summary.d.ts +3 -0
- package/dist/runtime/cli-action-summary.d.ts.map +1 -0
- package/dist/runtime/cli-action-summary.js +13 -0
- package/dist/runtime/cli-action-summary.js.map +1 -0
- package/dist/runtime/cli-driver.d.ts.map +1 -1
- package/dist/runtime/cli-driver.js +119 -26
- package/dist/runtime/cli-driver.js.map +1 -1
- package/dist/runtime/cli-parser.d.ts +4 -1
- package/dist/runtime/cli-parser.d.ts.map +1 -1
- package/dist/runtime/cli-parser.js +2 -2
- package/dist/runtime/cli-parser.js.map +1 -1
- package/dist/runtime/codex-cli-control.d.ts +63 -0
- package/dist/runtime/codex-cli-control.d.ts.map +1 -0
- package/dist/runtime/codex-cli-control.js +311 -0
- package/dist/runtime/codex-cli-control.js.map +1 -0
- package/dist/runtime/codex-cli-projector.d.ts +17 -0
- package/dist/runtime/codex-cli-projector.d.ts.map +1 -0
- package/dist/runtime/codex-cli-projector.js +80 -0
- package/dist/runtime/codex-cli-projector.js.map +1 -0
- package/dist/runtime/contracts.d.ts +12 -2
- package/dist/runtime/contracts.d.ts.map +1 -1
- package/dist/runtime/runtime-coordinator.d.ts +1 -1
- package/dist/runtime/runtime-coordinator.d.ts.map +1 -1
- package/dist/runtime/runtime-coordinator.js +40 -6
- package/dist/runtime/runtime-coordinator.js.map +1 -1
- package/dist/services/__tests__/claude-cli-capabilities.service.test.d.ts +2 -0
- package/dist/services/__tests__/claude-cli-capabilities.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/claude-cli-capabilities.service.test.js +37 -0
- package/dist/services/__tests__/claude-cli-capabilities.service.test.js.map +1 -0
- package/dist/services/__tests__/codex-cli-capabilities.service.test.d.ts +2 -0
- package/dist/services/__tests__/codex-cli-capabilities.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/codex-cli-capabilities.service.test.js +35 -0
- package/dist/services/__tests__/codex-cli-capabilities.service.test.js.map +1 -0
- package/dist/services/__tests__/codex-model-capabilities.service.test.js +23 -2
- package/dist/services/__tests__/codex-model-capabilities.service.test.js.map +1 -1
- package/dist/services/__tests__/execution-permission.service.test.d.ts +2 -0
- package/dist/services/__tests__/execution-permission.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/execution-permission.service.test.js +111 -0
- package/dist/services/__tests__/execution-permission.service.test.js.map +1 -0
- package/dist/services/__tests__/provider-config.service.test.js +1 -0
- package/dist/services/__tests__/provider-config.service.test.js.map +1 -1
- package/dist/services/__tests__/session-manager.lifecycle.test.js +151 -3
- package/dist/services/__tests__/session-manager.lifecycle.test.js.map +1 -1
- package/dist/services/claude-cli-capabilities.service.d.ts +11 -0
- package/dist/services/claude-cli-capabilities.service.d.ts.map +1 -0
- package/dist/services/claude-cli-capabilities.service.js +54 -0
- package/dist/services/claude-cli-capabilities.service.js.map +1 -0
- package/dist/services/codex-cli-capabilities.service.d.ts +12 -0
- package/dist/services/codex-cli-capabilities.service.d.ts.map +1 -0
- package/dist/services/codex-cli-capabilities.service.js +65 -0
- package/dist/services/codex-cli-capabilities.service.js.map +1 -0
- package/dist/services/codex-model-capabilities.service.d.ts.map +1 -1
- package/dist/services/codex-model-capabilities.service.js +12 -1
- package/dist/services/codex-model-capabilities.service.js.map +1 -1
- package/dist/services/execution-permission.service.d.ts +30 -0
- package/dist/services/execution-permission.service.d.ts.map +1 -0
- package/dist/services/execution-permission.service.js +149 -0
- package/dist/services/execution-permission.service.js.map +1 -0
- package/dist/services/provider-config.service.d.ts.map +1 -1
- package/dist/services/provider-config.service.js +19 -29
- package/dist/services/provider-config.service.js.map +1 -1
- package/dist/services/session-manager.d.ts +9 -7
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +46 -7
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/task.service.d.ts +4 -4
- package/dist/services/workspace.service.d.ts +7 -7
- package/dist/utils/cli-duplex-channel.d.ts +21 -0
- package/dist/utils/cli-duplex-channel.d.ts.map +1 -0
- package/dist/utils/cli-duplex-channel.js +200 -0
- package/dist/utils/cli-duplex-channel.js.map +1 -0
- package/dist/utils/cli-duplex-channel.test.d.ts +2 -0
- package/dist/utils/cli-duplex-channel.test.d.ts.map +1 -0
- package/dist/utils/cli-duplex-channel.test.js +191 -0
- package/dist/utils/cli-duplex-channel.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/process-launch.d.ts +3 -0
- package/dist/utils/process-launch.d.ts.map +1 -1
- package/dist/utils/process-launch.js +129 -10
- package/dist/utils/process-launch.js.map +1 -1
- package/dist/utils/process-launch.test.js +103 -0
- package/dist/utils/process-launch.test.js.map +1 -1
- package/dist/web/assets/{AgentDemoPage-B6pABvRL.js → AgentDemoPage-B__0_CPX.js} +1 -1
- package/dist/web/assets/{AgentEnvironmentSettingsPage-CqMfdwkM.js → AgentEnvironmentSettingsPage-uSnG5iV3.js} +1 -1
- package/dist/web/assets/{AgentLogo-Ntqe3_Mx.js → AgentLogo-CoAT8dNB.js} +1 -1
- package/dist/web/assets/ConversationPage-BOfzGTyj.js +3 -0
- package/dist/web/assets/CreateTaskInput-DwQsAlWX.js +1 -0
- package/dist/web/assets/{DemoPage-D1Ki6sJ0.js → DemoPage-CuDLCuUQ.js} +1 -1
- package/dist/web/assets/ExecutionPermissionSelector-Cu7Z72Yk.js +29 -0
- package/dist/web/assets/{GeneralSettingsPage-DoAXPabw.js → GeneralSettingsPage-CmG_TW4-.js} +1 -1
- package/dist/web/assets/{Icons-KJJd6C8K.js → Icons-B6q-ul89.js} +1 -1
- package/dist/web/assets/{LoadingPreviewPage-BqCKBvgv.js → LoadingPreviewPage-Db5WcYw_.js} +1 -1
- package/dist/web/assets/{McpSettingsPage-QXVD4XCW.js → McpSettingsPage-CQV1RaHW.js} +1 -1
- package/dist/web/assets/{MemberAvatar-kbJEoyh0.js → MemberAvatar-BQA5sE4L.js} +1 -1
- package/dist/web/assets/{NotificationSettingsPage-BrqSeU--.js → NotificationSettingsPage-BGKJ6wO0.js} +1 -1
- package/dist/web/assets/{ProfileSettingsPage-BmWgVdnG.js → ProfileSettingsPage-dTvp-LFa.js} +1 -1
- package/dist/web/assets/{ProjectKanbanPage-D7RJm4yg.js → ProjectKanbanPage-CHZc9WB7.js} +35 -35
- package/dist/web/assets/{ProjectSettingsPage-BVINN99w.js → ProjectSettingsPage-CwLXTwwe.js} +1 -1
- package/dist/web/assets/ProviderSettingsPage-Ced1VN2f.js +67 -0
- package/dist/web/assets/{SettingsMasterDetail-OF28cvPV.js → SettingsMasterDetail-CEZsOwjq.js} +1 -1
- package/dist/web/assets/{TeamSettingsPage-BWGm0m7s.js → TeamSettingsPage-lErIz31n.js} +1 -1
- package/dist/web/assets/{arc-CqFgRaZU.js → arc-CgQPLQJF.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-C0PMdIZJ.js → architectureDiagram-3BPJPVTR-BRns2_cB.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-SqqtxqkX.js → blockDiagram-GPEHLZMM-DUIPlzPN.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-DYJXB3xL.js → c4Diagram-AAUBKEIU-BfWsGU4R.js} +1 -1
- package/dist/web/assets/channel-CYUMBIeW.js +1 -0
- package/dist/web/assets/check-C_RQ5zOf.js +1 -0
- package/dist/web/assets/{chevron-down-BZfpVhYr.js → chevron-down-Dz61D9cJ.js} +1 -1
- package/dist/web/assets/{chevron-right-D52zUyOF.js → chevron-right-q_hHAFb1.js} +1 -1
- package/dist/web/assets/{chevron-up-CFOy5dmW.js → chevron-up-ChWM4fJS.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-DQCbv8W_.js → chunk-2J33WTMH-DOverrRX.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-B_68_oNW.js → chunk-4BX2VUAB-BakE7rwb.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-Bb-pPIxs.js → chunk-55IACEB6-BJY_hqWJ.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-CAiaySk6.js → chunk-727SXJPM-Bz_y_ixN.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-ChCLJ4Wv.js → chunk-AQP2D5EJ-DPrP1E5u.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-Kz0Cc0mv.js → chunk-FMBD7UC4--yjwIi92.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-BttoT7UR.js → chunk-ND2GUHAM-BlN7Zpnx.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-BcVhzXXK.js → chunk-QZHKN3VN-b97Y7iON.js} +1 -1
- package/dist/web/assets/{circle-alert-D67xfWMs.js → circle-alert-B3BU6yxp.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-KLi01tMF.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-KLi01tMF.js +1 -0
- package/dist/web/assets/{code-block-OCS4YCEC-CMA1utSp.js → code-block-OCS4YCEC-pXxp6Ipb.js} +1 -1
- package/dist/web/assets/{confirm-dialog-BWvZEHpu.js → confirm-dialog-CeNfH2ZR.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-B391zTey.js → cose-bilkent-S5V4N54A-BE-ASlGZ.js} +1 -1
- package/dist/web/assets/cssMode-B8d06lCF.js +1 -0
- package/dist/web/assets/{dagre-BM42HDAG-CymH_FEZ.js → dagre-BM42HDAG-lAvNJn8H.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-DXOIiLDr.js → diagram-2AECGRRQ-DBgI60j-.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-B9ocgjdh.js → diagram-5GNKFQAL-BqFMhpcI.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-DLMpk9Wg.js → diagram-KO2AKTUF-8dtMJ7XC.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-BBnF83je.js → diagram-LMA3HP47-CEbAGy_U.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-AK4FunVI.js → diagram-OG6HWLK6-BTy4Wqho.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-B1mryURg.js → erDiagram-TEJ5UH35-Fe0pjB7H.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-BjIG_1l5.js → flowDiagram-I6XJVG4X-Cn5xoMyS.js} +1 -1
- package/dist/web/assets/{folder-picker-CaM_drIJ.js → folder-picker-DlJ9hExj.js} +1 -1
- package/dist/web/assets/{freemarker2-Dj1C_6Ng.js → freemarker2-WBCTYbCf.js} +2 -2
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-DjR6lyIQ.js → ganttDiagram-6RSMTGT7-Bwf7sOJW.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-BpW2L4ry.js → gitGraphDiagram-PVQCEYII-DEqHf_N3.js} +1 -1
- package/dist/web/assets/handlebars-aoMw8XNP.js +1 -0
- package/dist/web/assets/html-mP4L-gn5.js +1 -0
- package/dist/web/assets/htmlMode-BRkGssBX.js +1 -0
- package/dist/web/assets/index-BoQh7Rhc.css +1 -0
- package/dist/web/assets/{index-DaRxJqVy.js → index-DxE1UagD.js} +4 -4
- package/dist/web/assets/index-_mroLJ3-.js +122 -0
- package/dist/web/assets/{infoDiagram-5YYISTIA-Cu-PA_-6.js → infoDiagram-5YYISTIA-BzITBBR6.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-S6Esbkdw.js → ishikawaDiagram-YF4QCWOH-Bd9MT4ne.js} +1 -1
- package/dist/web/assets/javascript-CzeLwCQy.js +1 -0
- package/dist/web/assets/{journeyDiagram-JHISSGLW-wPF9FT9V.js → journeyDiagram-JHISSGLW-CR2x5gV0.js} +1 -1
- package/dist/web/assets/{jsonMode-D6IoFlQF.js → jsonMode-BixD4b0P.js} +4 -4
- package/dist/web/assets/{kanban-definition-UN3LZRKU-C4jl9zOj.js → kanban-definition-UN3LZRKU-DZx-6dHw.js} +1 -1
- package/dist/web/assets/{layers-hQUUT3Gb.js → layers-DOM1D0GC.js} +1 -1
- package/dist/web/assets/{linear-D83xDp0H.js → linear-BBLqccsD.js} +1 -1
- package/dist/web/assets/liquid-DGETTZ3q.js +1 -0
- package/dist/web/assets/{lspLanguageFeatures-CUyibjAN.js → lspLanguageFeatures-DLBGi3go.js} +1 -1
- package/dist/web/assets/mdx-Co95_1jL.js +1 -0
- package/dist/web/assets/{mermaid-NOHMQCX5-CGCWmHha.js → mermaid-NOHMQCX5-K1Nm51AP.js} +45 -45
- package/dist/web/assets/{message-square-B-uYQiTq.js → message-square-eTP8tZLX.js} +1 -1
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-D5v2uvjn.js → mindmap-definition-RKZ34NQL-BuB-92St.js} +1 -1
- package/dist/web/assets/{modal-D87uszzb.js → modal-CSnK65Cb.js} +1 -1
- package/dist/web/assets/{monaco-B25-2nEB.js → monaco-C17UmdbS.js} +3 -3
- package/dist/web/assets/{pencil-CY2RnQrx.js → pencil-l1-UifOH.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-6wdFz_7x.js → pieDiagram-4H26LBE5--40xP_i_.js} +1 -1
- package/dist/web/assets/python-CQw9WtC1.js +1 -0
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-C1CrGMEK.js → quadrantDiagram-W4KKPZXB-BxiOfFTG.js} +1 -1
- package/dist/web/assets/razor-Du_XbZEg.js +1 -0
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-mDtZrxpp.js → requirementDiagram-4Y6WPE33-GR0Dtr4T.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-hBlj0XoH.js → sankeyDiagram-5OEKKPKP-tWpKambG.js} +1 -1
- package/dist/web/assets/select-DB6L9-KB.js +1 -0
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DsWmMm20.js → sequenceDiagram-3UESZ5HK-ByVTWC_r.js} +1 -1
- package/dist/web/assets/{server-qlZupTvg.js → server-CrODl9NC.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-VNyX1L66.js → stateDiagram-AJRCARHV-Bd8b6zV5.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-A6YN_ZNd.js +1 -0
- package/dist/web/assets/{switch-1pvXCcP-.js → switch-DvXJc47w.js} +1 -1
- package/dist/web/assets/{textarea-D9oaz-Ba.js → textarea-CSKljQWP.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-DuBxxd9E.js → timeline-definition-PNZ67QCA-BZhaE4Q8.js} +1 -1
- package/dist/web/assets/{trash-2-C0P8jNpJ.js → trash-2-DdOhDOCv.js} +1 -1
- package/dist/web/assets/{tsMode-ogL-3MSe.js → tsMode-D9Lc5Ctp.js} +2 -2
- package/dist/web/assets/typescript-jsG0idOk.js +1 -0
- package/dist/web/assets/{upload-BYgsDplu.js → upload-9nN5Lg83.js} +1 -1
- package/dist/web/assets/{use-profiles-BkGnmson.js → use-profiles-8YJrKR2I.js} +1 -1
- package/dist/web/assets/{use-projects-B4w00h5I.js → use-projects-BdSJ4zPv.js} +1 -1
- package/dist/web/assets/use-providers-BlqWIGOP.js +1 -0
- package/dist/web/assets/{useNormalizedLogs-MsDkcnRQ.js → useNormalizedLogs-B_LoDoiT.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-RbPPOLBo.js → vennDiagram-CIIHVFJN-COnwMBZG.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-DXzUbdMF.js → wardley-L42UT6IY-DnIbpfhs.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-B0QXobQM.js → wardleyDiagram-YWT4CUSO-QNFL1GWo.js} +1 -1
- package/dist/web/assets/xml-C_Zqe3tk.js +1 -0
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-C7bFJItM.js → xychartDiagram-2RQKCTM6-CW7FVlM3.js} +1 -1
- package/dist/web/assets/yaml-CETOqGaS.js +1 -0
- package/dist/web/index.html +2 -2
- package/node_modules/@agent-tower/shared/dist/execution-permission.d.ts +19 -0
- package/node_modules/@agent-tower/shared/dist/execution-permission.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/execution-permission.js +53 -0
- package/node_modules/@agent-tower/shared/dist/execution-permission.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts +1 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/index.js +1 -0
- package/node_modules/@agent-tower/shared/dist/index.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts +6 -5
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.d.ts +49 -2
- package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/assets/ConversationPage-BINGA8XL.js +0 -3
- package/dist/web/assets/CreateTaskInput-8bLhHYOc.js +0 -1
- package/dist/web/assets/ProviderSettingsPage-BlgfQMwe.js +0 -95
- package/dist/web/assets/channel-B8s9dqlX.js +0 -1
- package/dist/web/assets/check-C1zWgxFO.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-61bPx188.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-61bPx188.js +0 -1
- package/dist/web/assets/cssMode-CNU1q_Gl.js +0 -1
- package/dist/web/assets/handlebars-DNXOgRZc.js +0 -1
- package/dist/web/assets/html-C20FgNS-.js +0 -1
- package/dist/web/assets/htmlMode-CtcV1Ktd.js +0 -1
- package/dist/web/assets/index-dElqH2UR.css +0 -1
- package/dist/web/assets/index-oC5eh7mZ.js +0 -122
- package/dist/web/assets/javascript-CFAVZ6Tb.js +0 -1
- package/dist/web/assets/liquid-CuzuRJIN.js +0 -1
- package/dist/web/assets/mdx-C3rxTvel.js +0 -1
- package/dist/web/assets/python-BYGLbOzO.js +0 -1
- package/dist/web/assets/razor-m0U9iUAj.js +0 -1
- package/dist/web/assets/select-D7WkUiad.js +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-DHz3oGyD.js +0 -1
- package/dist/web/assets/typescript-rHoDxTY8.js +0 -1
- package/dist/web/assets/use-providers-B70-BYNu.js +0 -1
- package/dist/web/assets/xml-BqnpQrAq.js +0 -1
- package/dist/web/assets/yaml-mz2Zn_K2.js +0 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdtemp, chmod, writeFile, rm } from 'node:fs/promises';
|
|
3
|
+
import { createServer } from 'node:net';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
const MAX_FRAME = 16 * 1024 * 1024;
|
|
7
|
+
const DEADLINE_MS = 10_000;
|
|
8
|
+
/** Private launch-scoped IPC. Agent stdio never travels through the terminal PTY. */
|
|
9
|
+
export async function createCliDuplexChannel() {
|
|
10
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'tower-duplex-'));
|
|
11
|
+
await chmod(dir, 0o700);
|
|
12
|
+
const endpoint = process.platform === 'win32' ? `\\\\.\\pipe\\tower-duplex-${randomUUID()}` : path.join(dir, 'io.sock');
|
|
13
|
+
const secret = randomUUID();
|
|
14
|
+
let socket;
|
|
15
|
+
let listener;
|
|
16
|
+
let events = [];
|
|
17
|
+
let buffered = 0;
|
|
18
|
+
let failure;
|
|
19
|
+
let ended = false;
|
|
20
|
+
let outputConsumed = false;
|
|
21
|
+
let seq = 0;
|
|
22
|
+
let serial = Promise.resolve();
|
|
23
|
+
let connected;
|
|
24
|
+
let rejectConnection;
|
|
25
|
+
const connection = new Promise((resolve, reject) => { connected = resolve; rejectConnection = reject; });
|
|
26
|
+
void connection.catch(() => undefined);
|
|
27
|
+
const connectionTimer = setTimeout(() => fail(new Error('CLI I/O connection timed out')), DEADLINE_MS);
|
|
28
|
+
const pending = new Map();
|
|
29
|
+
const deliver = (event) => {
|
|
30
|
+
if (event.type === 'output_complete') {
|
|
31
|
+
outputConsumed = true;
|
|
32
|
+
socket?.write(JSON.stringify({ type: 'output_consumed' }) + '\n');
|
|
33
|
+
}
|
|
34
|
+
else
|
|
35
|
+
listener?.(event);
|
|
36
|
+
};
|
|
37
|
+
const emit = (event) => {
|
|
38
|
+
if (listener)
|
|
39
|
+
deliver(event);
|
|
40
|
+
else {
|
|
41
|
+
buffered += 'data' in event ? Buffer.byteLength(event.data) : 0;
|
|
42
|
+
if (buffered > MAX_FRAME) {
|
|
43
|
+
fail(new Error('CLI early output exceeded its limit'));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
events.push(event);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const fail = (error) => {
|
|
50
|
+
if (failure)
|
|
51
|
+
return;
|
|
52
|
+
failure = error;
|
|
53
|
+
clearTimeout(connectionTimer);
|
|
54
|
+
rejectConnection(error);
|
|
55
|
+
buffered = 0;
|
|
56
|
+
for (const item of pending.values()) {
|
|
57
|
+
clearTimeout(item.timer);
|
|
58
|
+
item.reject(error);
|
|
59
|
+
}
|
|
60
|
+
pending.clear();
|
|
61
|
+
socket?.destroy();
|
|
62
|
+
emit({ type: 'disconnected', error });
|
|
63
|
+
};
|
|
64
|
+
const server = createServer(candidate => {
|
|
65
|
+
if (socket || failure) {
|
|
66
|
+
candidate.destroy();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
let authenticated = false;
|
|
70
|
+
let buffer = '';
|
|
71
|
+
candidate.setEncoding('utf8');
|
|
72
|
+
candidate.on('error', () => { if (authenticated)
|
|
73
|
+
fail(new Error('CLI I/O failed')); });
|
|
74
|
+
candidate.on('close', () => { if (authenticated && !outputConsumed)
|
|
75
|
+
fail(new Error('CLI I/O disconnected')); });
|
|
76
|
+
candidate.on('data', (data) => {
|
|
77
|
+
buffer += data;
|
|
78
|
+
if (buffer.length > MAX_FRAME) {
|
|
79
|
+
candidate.destroy();
|
|
80
|
+
if (authenticated)
|
|
81
|
+
fail(new Error('CLI I/O frame exceeded its limit'));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
let newline;
|
|
85
|
+
while ((newline = buffer.indexOf('\n')) >= 0) {
|
|
86
|
+
const line = buffer.slice(0, newline);
|
|
87
|
+
buffer = buffer.slice(newline + 1);
|
|
88
|
+
try {
|
|
89
|
+
const frame = JSON.parse(line);
|
|
90
|
+
if (!authenticated) {
|
|
91
|
+
if (frame.type !== 'hello' || frame.secret !== secret) {
|
|
92
|
+
candidate.destroy();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
authenticated = true;
|
|
96
|
+
socket = candidate;
|
|
97
|
+
clearTimeout(connectionTimer);
|
|
98
|
+
connected();
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (frame.type === 'ack') {
|
|
102
|
+
const item = pending.get(frame.id);
|
|
103
|
+
if (!item)
|
|
104
|
+
continue;
|
|
105
|
+
pending.delete(frame.id);
|
|
106
|
+
clearTimeout(item.timer);
|
|
107
|
+
if (frame.error) {
|
|
108
|
+
const error = new Error('CLI stdin write failed');
|
|
109
|
+
item.reject(error);
|
|
110
|
+
fail(error);
|
|
111
|
+
}
|
|
112
|
+
else
|
|
113
|
+
item.resolve();
|
|
114
|
+
}
|
|
115
|
+
else if ((frame.type === 'stdout' || frame.type === 'stderr') && typeof frame.data === 'string') {
|
|
116
|
+
emit({ type: frame.type, data: frame.data });
|
|
117
|
+
}
|
|
118
|
+
else if (frame.type === 'eof')
|
|
119
|
+
emit({ type: 'eof' });
|
|
120
|
+
else if (frame.type === 'output_complete')
|
|
121
|
+
emit({ type: 'output_complete' });
|
|
122
|
+
else
|
|
123
|
+
throw new Error('Invalid CLI I/O frame');
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
fail(new Error('Invalid CLI I/O frame'));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
const authTimer = setTimeout(() => { if (!authenticated)
|
|
132
|
+
candidate.destroy(); }, DEADLINE_MS);
|
|
133
|
+
authTimer.unref();
|
|
134
|
+
candidate.once('close', () => clearTimeout(authTimer));
|
|
135
|
+
});
|
|
136
|
+
try {
|
|
137
|
+
await new Promise((resolve, reject) => { server.once('error', reject); server.listen(endpoint, resolve); });
|
|
138
|
+
if (process.platform !== 'win32')
|
|
139
|
+
await chmod(endpoint, 0o600);
|
|
140
|
+
const configFile = path.join(dir, 'launch.json');
|
|
141
|
+
await writeFile(configFile, JSON.stringify({ endpoint, secret }), { mode: 0o600 });
|
|
142
|
+
const send = (type, data, isCurrent) => {
|
|
143
|
+
const operation = serial.then(async () => {
|
|
144
|
+
await connection;
|
|
145
|
+
if (failure)
|
|
146
|
+
throw failure;
|
|
147
|
+
if (outputConsumed)
|
|
148
|
+
throw new Error('CLI output has ended');
|
|
149
|
+
if (isCurrent && !isCurrent())
|
|
150
|
+
throw new Error('CLI request is no longer active');
|
|
151
|
+
if (ended)
|
|
152
|
+
throw new Error('CLI stdin has ended');
|
|
153
|
+
if (!socket || socket.destroyed)
|
|
154
|
+
throw new Error('CLI I/O is not connected');
|
|
155
|
+
if (type === 'end')
|
|
156
|
+
ended = true;
|
|
157
|
+
const id = ++seq;
|
|
158
|
+
const frame = JSON.stringify({ type, id, data }) + '\n';
|
|
159
|
+
if (Buffer.byteLength(frame) > MAX_FRAME)
|
|
160
|
+
throw new Error('CLI input exceeded its limit');
|
|
161
|
+
await new Promise((resolve, reject) => {
|
|
162
|
+
const timer = setTimeout(() => fail(new Error('CLI stdin write timed out')), DEADLINE_MS);
|
|
163
|
+
pending.set(id, { resolve, reject, timer });
|
|
164
|
+
socket.write(frame, error => { if (error)
|
|
165
|
+
fail(new Error('CLI stdin write failed')); });
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
serial = operation.catch(() => undefined);
|
|
169
|
+
return operation;
|
|
170
|
+
};
|
|
171
|
+
return {
|
|
172
|
+
configFile,
|
|
173
|
+
subscribe(next) {
|
|
174
|
+
if (listener)
|
|
175
|
+
throw new Error('CLI I/O already has a reader');
|
|
176
|
+
listener = next;
|
|
177
|
+
const early = events;
|
|
178
|
+
events = [];
|
|
179
|
+
buffered = 0;
|
|
180
|
+
for (const event of early)
|
|
181
|
+
deliver(event);
|
|
182
|
+
return () => { if (listener === next)
|
|
183
|
+
listener = undefined; };
|
|
184
|
+
},
|
|
185
|
+
write: (data, current) => send('write', data, current),
|
|
186
|
+
end: () => send('end'),
|
|
187
|
+
close() {
|
|
188
|
+
fail(new Error('CLI I/O closed'));
|
|
189
|
+
server.close();
|
|
190
|
+
void rm(dir, { recursive: true, force: true }).catch(() => undefined);
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
server.close();
|
|
196
|
+
await rm(dir, { recursive: true, force: true });
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=cli-duplex-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-duplex-channel.js","sourceRoot":"","sources":["../../src/utils/cli-duplex-channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-duplex-channel.test.d.ts","sourceRoot":"","sources":["../../src/utils/cli-duplex-channel.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { once } from 'node:events';
|
|
3
|
+
import { mkdtemp, rm, writeFile, readFile } from 'node:fs/promises';
|
|
4
|
+
import { createServer } from 'node:net';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { describe, it, expect } from 'vitest';
|
|
8
|
+
import { createCliDuplexChannel } from './cli-duplex-channel.js';
|
|
9
|
+
import { buildPtyCommandWithDuplex, buildPtyWrapperEnv } from './process-launch.js';
|
|
10
|
+
async function waitUntil(test, timeoutMs = 5000) {
|
|
11
|
+
const deadline = Date.now() + timeoutMs;
|
|
12
|
+
while (!test() && Date.now() < deadline)
|
|
13
|
+
await new Promise(r => setTimeout(r, 10));
|
|
14
|
+
expect(test()).toBe(true);
|
|
15
|
+
}
|
|
16
|
+
describe('launch-scoped duplex transport', () => {
|
|
17
|
+
it('waits for the late reader to consume result, usage and EOF before wrapper exit', async () => {
|
|
18
|
+
const io = await createCliDuplexChannel();
|
|
19
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'tower-duplex-late-reader-'));
|
|
20
|
+
const rootExit = path.join(dir, 'root-exit');
|
|
21
|
+
const invocation = buildPtyCommandWithDuplex(process.execPath, ['-e', `process.stdout.write(JSON.stringify({type:'result',usage:{input_tokens:17,output_tokens:9}})+'\\n',()=>{require('node:fs').writeFileSync(process.argv[1],'done');process.exit(0);});`, rootExit], io.configFile);
|
|
22
|
+
const child = spawn(invocation.command, invocation.args, { env: buildPtyWrapperEnv(process.env), stdio: 'ignore' });
|
|
23
|
+
const exit = once(child, 'exit');
|
|
24
|
+
const events = [];
|
|
25
|
+
try {
|
|
26
|
+
await waitUntil(() => child.pid !== undefined);
|
|
27
|
+
const deadline = Date.now() + 5000;
|
|
28
|
+
while (!(await readFile(rootExit, 'utf8').catch(() => '')) && Date.now() < deadline)
|
|
29
|
+
await new Promise(r => setTimeout(r, 10));
|
|
30
|
+
expect(await readFile(rootExit, 'utf8')).toBe('done');
|
|
31
|
+
await new Promise(r => setTimeout(r, 350));
|
|
32
|
+
expect(child.exitCode).toBeNull();
|
|
33
|
+
io.subscribe(event => events.push(event));
|
|
34
|
+
await exit;
|
|
35
|
+
expect(child.exitCode).toBe(0);
|
|
36
|
+
expect(events.flatMap(e => e.type === 'stdout' ? [e.data] : []).join('')).toContain('"usage":{"input_tokens":17,"output_tokens":9}');
|
|
37
|
+
expect(events.at(-1)?.type).toBe('eof');
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
io.close();
|
|
41
|
+
if (child.exitCode === null) {
|
|
42
|
+
child.kill('SIGTERM');
|
|
43
|
+
await exit;
|
|
44
|
+
}
|
|
45
|
+
await rm(dir, { recursive: true, force: true });
|
|
46
|
+
}
|
|
47
|
+
}, 10_000);
|
|
48
|
+
it('drains backpressured output beyond 100ms and cleans a hung descendant before consumption ACK', async () => {
|
|
49
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'tower-duplex-backpressure-'));
|
|
50
|
+
const endpoint = path.join(dir, 'io.sock');
|
|
51
|
+
const configFile = path.join(dir, 'launch.json');
|
|
52
|
+
await writeFile(configFile, JSON.stringify({ endpoint, secret: 'test' }));
|
|
53
|
+
let peer;
|
|
54
|
+
let output = '';
|
|
55
|
+
let buffer = '';
|
|
56
|
+
let eof = false;
|
|
57
|
+
let complete = false;
|
|
58
|
+
let startedAt = 0;
|
|
59
|
+
let consumedAt = 0;
|
|
60
|
+
const server = createServer(socket => {
|
|
61
|
+
peer = socket;
|
|
62
|
+
socket.setEncoding('utf8');
|
|
63
|
+
socket.on('data', data => {
|
|
64
|
+
buffer += data;
|
|
65
|
+
let newline;
|
|
66
|
+
while ((newline = buffer.indexOf('\n')) >= 0) {
|
|
67
|
+
const frame = JSON.parse(buffer.slice(0, newline));
|
|
68
|
+
buffer = buffer.slice(newline + 1);
|
|
69
|
+
if (frame.type === 'hello') {
|
|
70
|
+
startedAt = Date.now();
|
|
71
|
+
socket.pause();
|
|
72
|
+
setTimeout(() => socket.resume(), 350);
|
|
73
|
+
}
|
|
74
|
+
else if (frame.type === 'stdout')
|
|
75
|
+
output += frame.data;
|
|
76
|
+
else if (frame.type === 'eof')
|
|
77
|
+
eof = true;
|
|
78
|
+
else if (frame.type === 'output_complete')
|
|
79
|
+
complete = true;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
await new Promise(resolve => server.listen(endpoint, resolve));
|
|
84
|
+
const payload = 'x'.repeat(4 * 1024 * 1024);
|
|
85
|
+
const script = `const {spawn}=require('node:child_process');const grand=spawn(process.execPath,['-e',"process.on('SIGHUP',()=>{});setInterval(()=>{},1000)"],{stdio:'inherit'});process.stdout.write('GRAND:'+grand.pid+'\\n');process.stdout.write('x'.repeat(4*1024*1024),()=>process.stdout.write('\\n'+JSON.stringify({type:'result',usage:{input_tokens:23,output_tokens:11}})+'\\n',()=>process.exit(0)));`;
|
|
86
|
+
const invocation = buildPtyCommandWithDuplex(process.execPath, ['-e', script], configFile);
|
|
87
|
+
const child = spawn(invocation.command, invocation.args, { env: buildPtyWrapperEnv(process.env), stdio: 'ignore' });
|
|
88
|
+
const exit = once(child, 'exit');
|
|
89
|
+
try {
|
|
90
|
+
await waitUntil(() => complete, 10_000);
|
|
91
|
+
consumedAt = Date.now();
|
|
92
|
+
expect(consumedAt - startedAt).toBeGreaterThan(300);
|
|
93
|
+
expect(eof).toBe(true);
|
|
94
|
+
expect(output).toContain(payload + '\n{"type":"result","usage":{"input_tokens":23,"output_tokens":11}}\n');
|
|
95
|
+
const pid = Number(/GRAND:(\d+)/.exec(output)?.[1]);
|
|
96
|
+
expect(pid).toBeGreaterThan(0);
|
|
97
|
+
expect(() => process.kill(pid, 0)).toThrow();
|
|
98
|
+
expect(child.exitCode).toBeNull();
|
|
99
|
+
peer.write(JSON.stringify({ type: 'output_consumed' }) + '\n');
|
|
100
|
+
await exit;
|
|
101
|
+
expect(child.exitCode).toBe(0);
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
peer?.destroy();
|
|
105
|
+
if (child.exitCode === null) {
|
|
106
|
+
child.kill('SIGTERM');
|
|
107
|
+
await exit;
|
|
108
|
+
}
|
|
109
|
+
await new Promise(resolve => server.close(() => resolve()));
|
|
110
|
+
await rm(dir, { recursive: true, force: true });
|
|
111
|
+
}
|
|
112
|
+
}, 15_000);
|
|
113
|
+
it('keeps real stdin open, separates Unicode stdout/stderr, serializes writes, and closes with EOF', async () => {
|
|
114
|
+
const io = await createCliDuplexChannel();
|
|
115
|
+
const events = [];
|
|
116
|
+
const script = `process.stdin.setEncoding('utf8'); let input=''; process.stdin.on('data', c=>{input+=c; process.stdout.write(c);}); process.stderr.write('诊断\\n'); process.stdin.on('end',()=>{process.stdout.write('EOF:'+input.length+'\\n');});`;
|
|
117
|
+
const invocation = buildPtyCommandWithDuplex(process.execPath, ['-e', script], io.configFile);
|
|
118
|
+
const child = spawn(invocation.command, invocation.args, { env: buildPtyWrapperEnv(process.env), stdio: 'ignore' });
|
|
119
|
+
const exit = once(child, 'exit');
|
|
120
|
+
const off = io.subscribe(event => events.push(event));
|
|
121
|
+
try {
|
|
122
|
+
await Promise.all([io.write('你好\n'), io.write('x'.repeat(100_000) + '\n'), io.write('last\n')]);
|
|
123
|
+
await waitUntil(() => events.some(e => e.type === 'stdout' && e.data.includes('last')));
|
|
124
|
+
expect(child.exitCode).toBeNull();
|
|
125
|
+
await io.end();
|
|
126
|
+
await exit;
|
|
127
|
+
const stdout = events.flatMap(e => e.type === 'stdout' ? [e.data] : []).join('');
|
|
128
|
+
const stderr = events.flatMap(e => e.type === 'stderr' ? [e.data] : []).join('');
|
|
129
|
+
expect(stdout).toContain('你好\n' + 'x'.repeat(100_000) + '\nlast\n');
|
|
130
|
+
expect(stdout).not.toContain('诊断');
|
|
131
|
+
expect(stderr).toBe('诊断\n');
|
|
132
|
+
expect(events.some(e => e.type === 'eof')).toBe(true);
|
|
133
|
+
await expect(io.write('late')).rejects.toThrow();
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
off();
|
|
137
|
+
io.close();
|
|
138
|
+
if (child.exitCode === null) {
|
|
139
|
+
child.kill('SIGTERM');
|
|
140
|
+
await exit;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}, 10_000);
|
|
144
|
+
it('cleans a descendant retaining stdout after the native root exits', async () => {
|
|
145
|
+
const io = await createCliDuplexChannel();
|
|
146
|
+
let output = '';
|
|
147
|
+
const script = `const {spawn}=require('node:child_process'); const grand=spawn(process.execPath,['-e','setInterval(()=>{},1000)'],{stdio:'inherit'}); process.stdout.write('GRAND:'+grand.pid+'\\n'); setTimeout(()=>process.exit(0),50);`;
|
|
148
|
+
const invocation = buildPtyCommandWithDuplex(process.execPath, ['-e', script], io.configFile);
|
|
149
|
+
const child = spawn(invocation.command, invocation.args, { env: buildPtyWrapperEnv(process.env), stdio: 'ignore' });
|
|
150
|
+
const exit = once(child, 'exit');
|
|
151
|
+
io.subscribe(event => { if (event.type === 'stdout')
|
|
152
|
+
output += event.data; });
|
|
153
|
+
try {
|
|
154
|
+
await exit;
|
|
155
|
+
const pid = Number(/GRAND:(\d+)/.exec(output)?.[1]);
|
|
156
|
+
expect(pid).toBeGreaterThan(0);
|
|
157
|
+
expect(() => process.kill(pid, 0)).toThrow();
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
io.close();
|
|
161
|
+
if (child.exitCode === null) {
|
|
162
|
+
child.kill('SIGTERM');
|
|
163
|
+
await exit;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}, 10_000);
|
|
167
|
+
it('rejects queued writes invalidated before delivery and cleans the child on host disconnect', async () => {
|
|
168
|
+
const io = await createCliDuplexChannel();
|
|
169
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'tower-duplex-test-'));
|
|
170
|
+
const invocation = buildPtyCommandWithDuplex(process.execPath, ['-e', `process.stdin.resume(); setInterval(()=>{},1000);`], io.configFile);
|
|
171
|
+
const child = spawn(invocation.command, invocation.args, { cwd: dir, env: buildPtyWrapperEnv(process.env), stdio: 'ignore' });
|
|
172
|
+
const exit = once(child, 'exit');
|
|
173
|
+
io.subscribe(() => { });
|
|
174
|
+
try {
|
|
175
|
+
await io.write('first');
|
|
176
|
+
await expect(io.write('cancelled', () => false)).rejects.toThrow('no longer active');
|
|
177
|
+
io.close();
|
|
178
|
+
await exit;
|
|
179
|
+
expect(child.exitCode).not.toBeNull();
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
io.close();
|
|
183
|
+
if (child.exitCode === null) {
|
|
184
|
+
child.kill('SIGTERM');
|
|
185
|
+
await exit;
|
|
186
|
+
}
|
|
187
|
+
await rm(dir, { recursive: true, force: true });
|
|
188
|
+
}
|
|
189
|
+
}, 10_000);
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=cli-duplex-channel.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-duplex-channel.test.js","sourceRoot":"","sources":["../../src/utils/cli-duplex-channel.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -18,5 +18,6 @@ export declare function execAsync(command: string, options?: ExecOptions): Promi
|
|
|
18
18
|
export declare function which(command: string, options?: {
|
|
19
19
|
platform?: NodeJS.Platform;
|
|
20
20
|
env?: NodeJS.ProcessEnv;
|
|
21
|
+
timeoutMs?: number;
|
|
21
22
|
}): Promise<string | null>;
|
|
22
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAU3D,eAAO,MAAM,MAAM,+GAAqB,CAAC;AAEzC,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAI5C;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAczD;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAM7C;AAED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAU3D,eAAO,MAAM,MAAM,+GAAqB,CAAC;AAEzC,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAI5C;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAczD;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAM7C;AAED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACd,GACL,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB"}
|
package/dist/utils/index.js
CHANGED
|
@@ -43,6 +43,7 @@ export async function which(command, options = {}) {
|
|
|
43
43
|
const { stdout } = await execFileAsync(lookupCommand, [command], {
|
|
44
44
|
encoding: 'utf-8',
|
|
45
45
|
windowsHide: true,
|
|
46
|
+
timeout: options.timeoutMs,
|
|
46
47
|
env: platform === 'win32'
|
|
47
48
|
? withWindowsUserPathFallbacks(env)
|
|
48
49
|
: platform === 'darwin' || platform === 'linux'
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAoB,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;AAC7B,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAEzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C,IAAI,6BAA6B,GAAyB,IAAI,CAAC;AAE/D;;;GAGG;AACH,MAAM,UAAU,yBAAyB;IACvC,IAAI,6BAA6B,EAAE,CAAC;QAClC,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,6BAA6B,GAAG,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,eAAe,CAAC,yBAAyB,sBAAsB,EAAE,CAAC,CAAC;IAClF,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACnB,6BAA6B,GAAG,IAAI,CAAC;QACrC,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,6BAA6B,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,OAAqB;IAErB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,OAAe,EACf,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ export interface CommandInvocation {
|
|
|
2
2
|
command: string;
|
|
3
3
|
args: string[];
|
|
4
4
|
}
|
|
5
|
+
export declare const PTY_WRAPPER_FORCE_KILL_GRACE_MS = 5000;
|
|
6
|
+
export declare const PTY_WRAPPER_EXIT_TIMEOUT_MS: number;
|
|
5
7
|
export declare function getNodeRuntimeCommand(): string;
|
|
6
8
|
export declare const PTY_WRAPPER_ENV_KEYS: readonly ["AGENT_TOWER_NODE_RUNTIME", "ELECTRON_RUN_AS_NODE", "AGENT_TOWER_TREE_CLEANUP_CHANNEL", "AGENT_TOWER_TREE_CLEANUP_SECRET", "AGENT_TOWER_PROCESS_IDENTITY", "AGENT_TOWER_PTY_IDENTITY_SEED"];
|
|
7
9
|
export declare function buildPtyWrapperEnv(agentEnv: Record<string, string>, parentEnv?: NodeJS.ProcessEnv, ownershipToken?: string, cleanupChannel?: Record<string, string>): Record<string, string>;
|
|
@@ -17,4 +19,5 @@ export declare function withUnixUserPathFallbacks(env?: NodeJS.ProcessEnv, platf
|
|
|
17
19
|
export declare function getDefaultTerminalShell(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): CommandInvocation;
|
|
18
20
|
export declare function getPtyLogFilePath(tmpDir?: string): string;
|
|
19
21
|
export declare function normalizeCommandLookupOutput(stdout: string, platform?: NodeJS.Platform): string | null;
|
|
22
|
+
export declare function buildPtyCommandWithDuplex(programPath: string, args: string[], configFile: string): CommandInvocation;
|
|
20
23
|
//# sourceMappingURL=process-launch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-launch.d.ts","sourceRoot":"","sources":["../../src/utils/process-launch.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAcD,eAAO,MAAM,oBAAoB,uMAOvB,CAAC;AAEX,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,SAAS,GAAE,MAAM,CAAC,UAAwB,EAC1C,cAAc,CAAC,EAAE,MAAM,EACvB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkCxB;
|
|
1
|
+
{"version":3,"file":"process-launch.d.ts","sourceRoot":"","sources":["../../src/utils/process-launch.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AAErD,eAAO,MAAM,2BAA2B,QAA0C,CAAC;AAEnF,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAcD,eAAO,MAAM,oBAAoB,uMAOvB,CAAC;AAEX,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,SAAS,GAAE,MAAM,CAAC,UAAwB,EAC1C,cAAc,CAAC,EAAE,MAAM,EACvB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkCxB;AAusBD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAK5E;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAKtF;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,MAAM,GAChB,iBAAiB,CAKnB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1F;AAaD,wBAAgB,oCAAoC,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,SAAS,CAmB/F;AAED,wBAAgB,4BAA4B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU,CAQpG;AAkCD,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,QAAQ,GAAE,QAAQ,GAAG,OAA4D,GAChF,MAAM,GAAG,SAAS,CAkCpB;AAED,wBAAgB,yBAAyB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,QAAQ,GAAG,OAA4D,GAChF,MAAM,CAAC,UAAU,CAOnB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,iBAAiB,CAYnB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,MAAoB,GAAG,MAAM,CAEtE;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,GAAG,IAAI,CAkBf;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAEpH"}
|