agent-tower 0.7.4 → 0.7.5-beta.5
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/app.d.ts.map +1 -1
- package/dist/app.js +6 -1
- package/dist/app.js.map +1 -1
- package/dist/core/container.d.ts +2 -0
- package/dist/core/container.d.ts.map +1 -1
- package/dist/core/container.js +25 -0
- package/dist/core/container.js.map +1 -1
- package/dist/executors/__tests__/base.executor.test.js +19 -0
- package/dist/executors/__tests__/base.executor.test.js.map +1 -1
- package/dist/executors/__tests__/claude-code-mcp.test.d.ts +2 -0
- package/dist/executors/__tests__/claude-code-mcp.test.d.ts.map +1 -0
- package/dist/executors/__tests__/claude-code-mcp.test.js +211 -0
- package/dist/executors/__tests__/claude-code-mcp.test.js.map +1 -0
- package/dist/executors/__tests__/codex-mcp-windows.test.d.ts +2 -0
- package/dist/executors/__tests__/codex-mcp-windows.test.d.ts.map +1 -0
- package/dist/executors/__tests__/codex-mcp-windows.test.js +128 -0
- package/dist/executors/__tests__/codex-mcp-windows.test.js.map +1 -0
- package/dist/executors/__tests__/codex.executor.test.js +394 -1
- package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
- package/dist/executors/base.executor.d.ts.map +1 -1
- package/dist/executors/base.executor.js +13 -0
- package/dist/executors/base.executor.js.map +1 -1
- package/dist/executors/claude-code.executor.d.ts +1 -0
- package/dist/executors/claude-code.executor.d.ts.map +1 -1
- package/dist/executors/claude-code.executor.js +52 -3
- package/dist/executors/claude-code.executor.js.map +1 -1
- package/dist/executors/codex.executor.d.ts +6 -6
- package/dist/executors/codex.executor.d.ts.map +1 -1
- package/dist/executors/codex.executor.js +118 -32
- package/dist/executors/codex.executor.js.map +1 -1
- package/dist/git/worktree.manager.d.ts.map +1 -1
- package/dist/git/worktree.manager.js +5 -2
- package/dist/git/worktree.manager.js.map +1 -1
- package/dist/mcp/http-client.d.ts +8 -1
- package/dist/mcp/http-client.d.ts.map +1 -1
- package/dist/mcp/http-client.js +6 -0
- package/dist/mcp/http-client.js.map +1 -1
- package/dist/mcp/tools/__tests__/workspace-services.test.js +34 -1
- package/dist/mcp/tools/__tests__/workspace-services.test.js.map +1 -1
- package/dist/mcp/tools/tasks.js +1 -1
- package/dist/mcp/tools/tasks.js.map +1 -1
- package/dist/mcp/tools/workspace-services.d.ts.map +1 -1
- package/dist/mcp/tools/workspace-services.js +39 -2
- package/dist/mcp/tools/workspace-services.js.map +1 -1
- package/dist/mcp/types.d.ts +20 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js +12 -0
- package/dist/mcp/types.js.map +1 -1
- package/dist/middleware/__tests__/preview-fallback.test.d.ts +2 -0
- package/dist/middleware/__tests__/preview-fallback.test.d.ts.map +1 -0
- package/dist/middleware/__tests__/preview-fallback.test.js +93 -0
- package/dist/middleware/__tests__/preview-fallback.test.js.map +1 -0
- package/dist/middleware/preview-fallback.d.ts +5 -0
- package/dist/middleware/preview-fallback.d.ts.map +1 -0
- package/dist/middleware/preview-fallback.js +91 -0
- package/dist/middleware/preview-fallback.js.map +1 -0
- package/dist/output/__tests__/claude-code-parser-continuation.test.d.ts +2 -0
- package/dist/output/__tests__/claude-code-parser-continuation.test.d.ts.map +1 -0
- package/dist/output/__tests__/claude-code-parser-continuation.test.js +89 -0
- package/dist/output/__tests__/claude-code-parser-continuation.test.js.map +1 -0
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.js +4 -1
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.js.map +1 -1
- package/dist/output/claude-code-parser.d.ts +36 -1
- package/dist/output/claude-code-parser.d.ts.map +1 -1
- package/dist/output/claude-code-parser.js +149 -18
- package/dist/output/claude-code-parser.js.map +1 -1
- package/dist/output/types.d.ts +2 -0
- package/dist/output/types.d.ts.map +1 -1
- package/dist/output/types.js.map +1 -1
- package/dist/prompts/workspace-background-service-policy.d.ts +6 -2
- package/dist/prompts/workspace-background-service-policy.d.ts.map +1 -1
- package/dist/prompts/workspace-background-service-policy.js +12 -3
- package/dist/prompts/workspace-background-service-policy.js.map +1 -1
- package/dist/prompts/workspace-background-service-policy.test.js +11 -0
- package/dist/prompts/workspace-background-service-policy.test.js.map +1 -1
- package/dist/routes/__tests__/previews.integration.test.js +117 -6
- package/dist/routes/__tests__/previews.integration.test.js.map +1 -1
- package/dist/routes/__tests__/previews.test.js +223 -194
- package/dist/routes/__tests__/previews.test.js.map +1 -1
- package/dist/routes/__tests__/task-handoff.test.js +25 -16
- package/dist/routes/__tests__/task-handoff.test.js.map +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +3 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/previews.d.ts +11 -9
- package/dist/routes/previews.d.ts.map +1 -1
- package/dist/routes/previews.js +137 -516
- package/dist/routes/previews.js.map +1 -1
- package/dist/routes/session-wakeups.d.ts +7 -0
- package/dist/routes/session-wakeups.d.ts.map +1 -0
- package/dist/routes/session-wakeups.js +86 -0
- package/dist/routes/session-wakeups.js.map +1 -0
- package/dist/routes/tasks.d.ts.map +1 -1
- package/dist/routes/tasks.js +3 -1
- package/dist/routes/tasks.js.map +1 -1
- package/dist/runtime/__tests__/acp-process-manager.test.js +65 -0
- package/dist/runtime/__tests__/acp-process-manager.test.js.map +1 -1
- package/dist/runtime/__tests__/claude-cli-driver.test.js +96 -2
- package/dist/runtime/__tests__/claude-cli-driver.test.js.map +1 -1
- package/dist/runtime/__tests__/claude-run-lifecycle.test.d.ts +2 -0
- package/dist/runtime/__tests__/claude-run-lifecycle.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/claude-run-lifecycle.test.js +88 -0
- package/dist/runtime/__tests__/claude-run-lifecycle.test.js.map +1 -0
- package/dist/runtime/__tests__/cli-driver-lifecycle.test.js +14 -7
- package/dist/runtime/__tests__/cli-driver-lifecycle.test.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 +3 -0
- package/dist/runtime/acp/agents/pi-coding-agent.js.map +1 -1
- package/dist/runtime/claude-run-lifecycle.d.ts +77 -0
- package/dist/runtime/claude-run-lifecycle.d.ts.map +1 -0
- package/dist/runtime/claude-run-lifecycle.js +147 -0
- package/dist/runtime/claude-run-lifecycle.js.map +1 -0
- package/dist/runtime/cli-driver.d.ts.map +1 -1
- package/dist/runtime/cli-driver.js +89 -3
- package/dist/runtime/cli-driver.js.map +1 -1
- package/dist/runtime/contracts.d.ts +6 -1
- package/dist/runtime/contracts.d.ts.map +1 -1
- package/dist/runtime/process-scope/__tests__/process-scope.test.d.ts +2 -0
- package/dist/runtime/process-scope/__tests__/process-scope.test.d.ts.map +1 -0
- package/dist/runtime/process-scope/__tests__/process-scope.test.js +156 -0
- package/dist/runtime/process-scope/__tests__/process-scope.test.js.map +1 -0
- package/dist/runtime/process-scope/process-scope.d.ts +46 -0
- package/dist/runtime/process-scope/process-scope.d.ts.map +1 -0
- package/dist/runtime/process-scope/process-scope.js +68 -0
- package/dist/runtime/process-scope/process-scope.js.map +1 -0
- package/dist/runtime/process-scope/scope-helper.d.ts +28 -0
- package/dist/runtime/process-scope/scope-helper.d.ts.map +1 -0
- package/dist/runtime/process-scope/scope-helper.js +78 -0
- package/dist/runtime/process-scope/scope-helper.js.map +1 -0
- package/dist/runtime/runtime-coordinator.d.ts.map +1 -1
- package/dist/runtime/runtime-coordinator.js +6 -0
- package/dist/runtime/runtime-coordinator.js.map +1 -1
- package/dist/services/__tests__/preview-runtime-manager.test.js +13 -112
- package/dist/services/__tests__/preview-runtime-manager.test.js.map +1 -1
- package/dist/services/__tests__/preview.service.test.js +13 -14
- package/dist/services/__tests__/preview.service.test.js.map +1 -1
- package/dist/services/__tests__/session-manager.lifecycle.test.js +147 -1
- package/dist/services/__tests__/session-manager.lifecycle.test.js.map +1 -1
- package/dist/services/__tests__/session-wakeup.service.test.d.ts +2 -0
- package/dist/services/__tests__/session-wakeup.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/session-wakeup.service.test.js +173 -0
- package/dist/services/__tests__/session-wakeup.service.test.js.map +1 -0
- package/dist/services/__tests__/terminal-manager.test.js +129 -51
- package/dist/services/__tests__/terminal-manager.test.js.map +1 -1
- package/dist/services/__tests__/workspace.service.test.js +31 -0
- package/dist/services/__tests__/workspace.service.test.js.map +1 -1
- package/dist/services/message-delivery.service.d.ts +3 -2
- package/dist/services/message-delivery.service.d.ts.map +1 -1
- package/dist/services/message-delivery.service.js +11 -7
- package/dist/services/message-delivery.service.js.map +1 -1
- package/dist/services/preview-bridge.d.ts +50 -0
- package/dist/services/preview-bridge.d.ts.map +1 -0
- package/dist/services/preview-bridge.js +537 -0
- package/dist/services/preview-bridge.js.map +1 -0
- package/dist/services/preview-cookies.d.ts +28 -0
- package/dist/services/preview-cookies.d.ts.map +1 -0
- package/dist/services/preview-cookies.js +133 -0
- package/dist/services/preview-cookies.js.map +1 -0
- package/dist/services/preview-proxy.d.ts +71 -0
- package/dist/services/preview-proxy.d.ts.map +1 -0
- package/dist/services/preview-proxy.js +462 -0
- package/dist/services/preview-proxy.js.map +1 -0
- package/dist/services/preview-runtime-manager.d.ts +11 -25
- package/dist/services/preview-runtime-manager.d.ts.map +1 -1
- package/dist/services/preview-runtime-manager.js +46 -363
- package/dist/services/preview-runtime-manager.js.map +1 -1
- package/dist/services/preview.service.d.ts.map +1 -1
- package/dist/services/preview.service.js +11 -9
- package/dist/services/preview.service.js.map +1 -1
- package/dist/services/project.service.d.ts +13 -13
- package/dist/services/session-manager.d.ts +2 -0
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +4 -2
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/session-wakeup.service.d.ts +105 -0
- package/dist/services/session-wakeup.service.d.ts.map +1 -0
- package/dist/services/session-wakeup.service.js +319 -0
- package/dist/services/session-wakeup.service.js.map +1 -0
- package/dist/services/task-handoff.service.d.ts +3 -2
- package/dist/services/task-handoff.service.d.ts.map +1 -1
- package/dist/services/task-handoff.service.js +7 -6
- package/dist/services/task-handoff.service.js.map +1 -1
- package/dist/services/team-room-delivery.d.ts +4 -4
- package/dist/services/terminal-manager.d.ts +16 -0
- package/dist/services/terminal-manager.d.ts.map +1 -1
- package/dist/services/terminal-manager.js +64 -7
- package/dist/services/terminal-manager.js.map +1 -1
- package/dist/services/workspace-background-service.service.d.ts +15 -1
- package/dist/services/workspace-background-service.service.d.ts.map +1 -1
- package/dist/services/workspace-background-service.service.js +41 -2
- package/dist/services/workspace-background-service.service.js.map +1 -1
- package/dist/services/workspace.service.d.ts.map +1 -1
- package/dist/services/workspace.service.js +2 -1
- package/dist/services/workspace.service.js.map +1 -1
- package/dist/utils/database-schema.d.ts.map +1 -1
- package/dist/utils/database-schema.js +9 -4
- package/dist/utils/database-schema.js.map +1 -1
- package/dist/utils/database-schema.test.js +21 -0
- package/dist/utils/database-schema.test.js.map +1 -1
- package/dist/utils/owned-child-process.d.ts +32 -3
- package/dist/utils/owned-child-process.d.ts.map +1 -1
- package/dist/utils/owned-child-process.js +138 -1
- package/dist/utils/owned-child-process.js.map +1 -1
- package/dist/web/assets/{AgentDemoPage-D9bIiALx.js → AgentDemoPage-D6clLNZx.js} +1 -1
- package/dist/web/assets/{AgentEnvironmentSettingsPage-BE0RC6fR.js → AgentEnvironmentSettingsPage-O1hlpsgp.js} +1 -1
- package/dist/web/assets/AttachmentPreview-hD3g_T_y.js +2 -0
- package/dist/web/assets/{BranchSelect-Kv3M1YhZ.js → BranchSelect-BkuXnEG2.js} +1 -1
- package/dist/web/assets/{BrandLogo-fR2lCwEo.js → BrandLogo-BSwQa2SF.js} +1 -1
- package/dist/web/assets/{ConversationPage-BZiMHI9T.js → ConversationPage-DvWjqFF2.js} +1 -1
- package/dist/web/assets/CreateTaskInput-Bric0GeW.js +1 -0
- package/dist/web/assets/{DemoPage-DwpThe16.js → DemoPage-Cwy3EmOm.js} +1 -1
- package/dist/web/assets/{DesignSystemPage-DH9_cygJ.js → DesignSystemPage-C1HrGwpV.js} +1 -1
- package/dist/web/assets/{ExecutionPermissionSelector-C-akTOVg.js → ExecutionPermissionSelector-BgrxbvBB.js} +1 -1
- package/dist/web/assets/{GeneralSettingsPage-v2w1eofz.js → GeneralSettingsPage-qdeAdBkW.js} +1 -1
- package/dist/web/assets/{LoadingPreviewPage-pgk3PWM9.js → LoadingPreviewPage-qeZ8nuiQ.js} +1 -1
- package/dist/web/assets/{McpSettingsPage-w1DOlY5V.js → McpSettingsPage-Bo-auo0X.js} +1 -1
- package/dist/web/assets/{MemberAvatar-CJtylxwu.js → MemberAvatar-DBab_9EO.js} +1 -1
- package/dist/web/assets/{MobileTaskDetail-D5Czlr2O.js → MobileTaskDetail-Dm64ie99.js} +2 -2
- package/dist/web/assets/{NotificationSettingsPage-CkLg4WvT.js → NotificationSettingsPage-BVJpo76k.js} +1 -1
- package/dist/web/assets/{ProfileSettingsPage-B3yzbY1V.js → ProfileSettingsPage-CbSRYGcp.js} +1 -1
- package/dist/web/assets/{ProjectKanbanPage-CuGSLvrU.js → ProjectKanbanPage-Cp3rdFik.js} +6 -6
- package/dist/web/assets/{ProjectSettingsPage-DoklOfna.js → ProjectSettingsPage-DLs5-Gk3.js} +1 -1
- package/dist/web/assets/{ProviderSettingsPage-Cm0hbX5n.js → ProviderSettingsPage-BnBcgAMQ.js} +1 -1
- package/dist/web/assets/{SettingsMasterDetail-CGCUalkW.js → SettingsMasterDetail-fu-_yejj.js} +1 -1
- package/dist/web/assets/{TaskDetail-BiZbuXcE.js → TaskDetail-C2_Fg59e.js} +1 -1
- package/dist/web/assets/TaskHandoffPanel-3Y0gcjyN.js +70 -0
- package/dist/web/assets/{TeamSettingsPage-CyppRTaY.js → TeamSettingsPage-CAjitaBe.js} +1 -1
- package/dist/web/assets/{TranslationSettingsPage-BoQXEZmn.js → TranslationSettingsPage-DKD6Uw2F.js} +1 -1
- package/dist/web/assets/{arc-5NPBSbiL.js → arc-BiuUFTzU.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-CqPT-IsX.js → architectureDiagram-3BPJPVTR-Dcwk905A.js} +1 -1
- package/dist/web/assets/{at-sign-Cf39WHCg.js → at-sign-CZAKOH3i.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-BN-1z9KN.js → blockDiagram-GPEHLZMM-Cfc5JDN-.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-CkeLbmQp.js → c4Diagram-AAUBKEIU-B4v5PUdt.js} +1 -1
- package/dist/web/assets/channel-DThSYkmR.js +1 -0
- package/dist/web/assets/check-C3vuSPKz.js +1 -0
- package/dist/web/assets/{chevron-down-Ct7FZbKm.js → chevron-down-CtAk9uZw.js} +1 -1
- package/dist/web/assets/{chevron-up-ARFlXMyO.js → chevron-up-DAc3NX1J.js} +1 -1
- package/dist/web/assets/{chip-BV_1-tIb.js → chip-CDUNxQW2.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-CWR7tRuT.js → chunk-2J33WTMH-BYRdUeyt.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-CAulp4D5.js → chunk-4BX2VUAB-3si_kPmV.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-DqkKXsbD.js → chunk-55IACEB6-JiMm9u33.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-B19m45Sq.js → chunk-727SXJPM-CMCFIUyF.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-CuODwkza.js → chunk-AQP2D5EJ-CzvnZjH5.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-CbUAjtCT.js → chunk-FMBD7UC4-hsabZkPl.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-C54VxArl.js → chunk-ND2GUHAM-D2o-Reeo.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-D54Uw5fD.js → chunk-QZHKN3VN-ASJk-E7d.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-CjJqgIpK.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CjJqgIpK.js +1 -0
- package/dist/web/assets/{code-block-OCS4YCEC-CtAySD1h.js → code-block-OCS4YCEC-5bkFBowa.js} +1 -1
- package/dist/web/assets/{confirm-dialog-CCjHVFTv.js → confirm-dialog-Bs80kXB9.js} +1 -1
- package/dist/web/assets/{content-DZozZbBD.js → content-DAccroCT.js} +1 -1
- package/dist/web/assets/{copy-C-jvx2et.js → copy-D1XK3OqK.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-BaB2EVcU.js → cose-bilkent-S5V4N54A-C52UKnOd.js} +1 -1
- package/dist/web/assets/{cssMode-wd7JR1S4.js → cssMode-BFq_c5xU.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-C2j1Y8pO.js → dagre-BM42HDAG-CeEute93.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-CF-EvpV9.js → diagram-2AECGRRQ-CEcq4W4S.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-rBNso835.js → diagram-5GNKFQAL-DqQe7Rr7.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-6NW-oos1.js → diagram-KO2AKTUF-C1KVZphS.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-DTfRxRLT.js → diagram-LMA3HP47-D1BL7GQh.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-CS4Ae-hD.js → diagram-OG6HWLK6-ngyXooqC.js} +1 -1
- package/dist/web/assets/{dialog-DV4wfpNU.js → dialog-XkZ8wMQa.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-Dw9QQctN.js → erDiagram-TEJ5UH35-D1zIFVqE.js} +1 -1
- package/dist/web/assets/{file-Btui_I8Z.js → file-CXCll7Pm.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-BGZ9q86S.js → flowDiagram-I6XJVG4X-BZu49qcj.js} +1 -1
- package/dist/web/assets/{folder-picker-DiR-8Qdl.js → folder-picker-CVkaEJEL.js} +1 -1
- package/dist/web/assets/{freemarker2-yVWXzD3l.js → freemarker2-CmhadAeB.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-CkGun0no.js → ganttDiagram-6RSMTGT7-eJ8yBxfS.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-Bz3oiYvi.js → gitGraphDiagram-PVQCEYII-DpeUUyH_.js} +1 -1
- package/dist/web/assets/{globe-DAFqpAcW.js → globe-WnxN1JzY.js} +1 -1
- package/dist/web/assets/{handlebars-BPf0z6eN.js → handlebars-DtjmH1qR.js} +1 -1
- package/dist/web/assets/{html-HCTCjfUg.js → html-DOYAlzlD.js} +1 -1
- package/dist/web/assets/{htmlMode-BDkbsknt.js → htmlMode-ORxd7KRN.js} +1 -1
- package/dist/web/assets/{index-BMcLxIvZ.js → index-6mINSZng.js} +1 -1
- package/dist/web/assets/{index-BPqjxXmH.js → index-BrjvxKaf.js} +1 -1
- package/dist/web/assets/{index-B8xoIIa6.js → index-CqIyOiVN.js} +4 -4
- package/dist/web/assets/{index-DgUtx9rV.js → index-D9w1zMaz.js} +1 -1
- package/dist/web/assets/{index-DkSPjZm4.js → index-DHDgbH3t.js} +1 -1
- package/dist/web/assets/{index-BszkzNS4.js → index-Dz9SKopM.js} +13 -13
- package/dist/web/assets/{index-GuczxPxb.js → index-eIXz5Hbk.js} +1 -1
- package/dist/web/assets/{index-DuM6iAxG.js → index-iOIxdF6J.js} +1 -1
- package/dist/web/assets/{index-lZLy5rkr.js → index-wbMiSmsY.js} +1 -1
- package/dist/web/assets/{infoDiagram-5YYISTIA-DYFufUYC.js → infoDiagram-5YYISTIA-BiVrC__7.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-IOkrKRwu.js → ishikawaDiagram-YF4QCWOH-B1kPjO1J.js} +1 -1
- package/dist/web/assets/javascript-CHlWHrtz.js +1 -0
- package/dist/web/assets/{journeyDiagram-JHISSGLW-Btl3yxne.js → journeyDiagram-JHISSGLW-DoTAPPAQ.js} +1 -1
- package/dist/web/assets/{jsonMode-DJPdvFcw.js → jsonMode-BkeQ_C6g.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-CDryhPbA.js → kanban-definition-UN3LZRKU-CBRmLcce.js} +1 -1
- package/dist/web/assets/{kbd-8RRRm9jd.js → kbd-CTfS0G5-.js} +1 -1
- package/dist/web/assets/{key-round-wojrCrDP.js → key-round-B7gTfpDR.js} +1 -1
- package/dist/web/assets/{layers-BH_LL4b8.js → layers-DE0xXedq.js} +1 -1
- package/dist/web/assets/{linear-BLuwKHze.js → linear-VLiA8Vcw.js} +1 -1
- package/dist/web/assets/{link-jWQOSQOQ.js → link-BSE_nRDT.js} +1 -1
- package/dist/web/assets/{liquid-1y-xg637.js → liquid-BZeg6p1K.js} +1 -1
- package/dist/web/assets/{lspLanguageFeatures-cYkILdCn.js → lspLanguageFeatures-CuFQ2_f9.js} +1 -1
- package/dist/web/assets/{mdx-CRg4Q6aP.js → mdx-C7xLyFFX.js} +1 -1
- package/dist/web/assets/{menu-CMqbaDni.js → menu-Dp4RDxvP.js} +1 -1
- package/dist/web/assets/{mermaid-NOHMQCX5-CYeAhOl-.js → mermaid-NOHMQCX5-C2enCJxR.js} +62 -62
- package/dist/web/assets/{message-square-DykJ2lWP.js → message-square-4lyHjyHe.js} +1 -1
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-B5wtw1Rv.js → mindmap-definition-RKZ34NQL-C1OOtqma.js} +1 -1
- package/dist/web/assets/{modal-BwOwTzij.js → modal-BGglpgrR.js} +1 -1
- package/dist/web/assets/{monaco-CcHqpOKe.js → monaco-B-6VmJO0.js} +3 -3
- package/dist/web/assets/{nav-row-BmtdNLxR.js → nav-row-DaR8yP7p.js} +1 -1
- package/dist/web/assets/{paperclip-C4t49vX2.js → paperclip-DORF2rEM.js} +1 -1
- package/dist/web/assets/{pencil-BQ5_raiB.js → pencil-BG033B74.js} +1 -1
- package/dist/web/assets/{people-Dr0v8HK0.js → people-1qyKeYq6.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-BZ3VoaNI.js → pieDiagram-4H26LBE5-BYYFVqOS.js} +1 -1
- package/dist/web/assets/{popover-CTqvKqTR.js → popover-CvjMbMb4.js} +1 -1
- package/dist/web/assets/{python-Huq_acyd.js → python-TTfnYnjF.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-C6ArHmnG.js → quadrantDiagram-W4KKPZXB-DTllM2j9.js} +1 -1
- package/dist/web/assets/{razor-Clc87Ivb.js → razor-BFVXAHVd.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-DiLzBRQP.js → requirementDiagram-4Y6WPE33-DeJDRYUP.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-QlYYd7IZ.js → sankeyDiagram-5OEKKPKP-DzTvEKv8.js} +1 -1
- package/dist/web/assets/{search-CMIAPUEt.js → search-DDRcBORc.js} +1 -1
- package/dist/web/assets/{select-DqB7YF38.js → select-CXC17bJx.js} +1 -1
- package/dist/web/assets/{select-Bg7NI8i0.js → select-CzXL3ZbG.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-COKEtqc0.js → sequenceDiagram-3UESZ5HK-CIYrA1ww.js} +1 -1
- package/dist/web/assets/{server-D7knl8H9.js → server-KqeWHfgr.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-1RZZZdOe.js → stateDiagram-AJRCARHV-Dg_UXkEq.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-Lc4r0bC3.js +1 -0
- package/dist/web/assets/{textarea-BCY2J2ca.js → textarea-Cmbv5l35.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-IJl1LY6J.js → timeline-definition-PNZ67QCA-CfSPMqxF.js} +1 -1
- package/dist/web/assets/{toggles-C4LmZwyo.js → toggles-t5v4QKn6.js} +1 -1
- package/dist/web/assets/{tooltip-Cirpotu3.js → tooltip-Cp8tovqH.js} +1 -1
- package/dist/web/assets/{track-Cv7h6oaE.js → track-C1rUV49K.js} +1 -1
- package/dist/web/assets/{trash-2-BEOQ1ICJ.js → trash-2-Ca2ken6q.js} +1 -1
- package/dist/web/assets/{tsMode-CHIbCBQc.js → tsMode-DBbiXlyu.js} +1 -1
- package/dist/web/assets/{typescript-CScj0bbb.js → typescript-jv_3P9x_.js} +1 -1
- package/dist/web/assets/{upload-tLVD0xMT.js → upload-CgGjN1FH.js} +1 -1
- package/dist/web/assets/{use-profiles-TkoP4Yw9.js → use-profiles-BdL-U8GZ.js} +1 -1
- package/dist/web/assets/{use-providers-Bz6YNiYj.js → use-providers-B6Mj5qeG.js} +1 -1
- package/dist/web/assets/{use-translation-settings-CCpQNS30.js → use-translation-settings-FIP674t9.js} +1 -1
- package/dist/web/assets/{useNormalizedLogs-Bstb98cF.js → useNormalizedLogs-FpVMUHeq.js} +1 -1
- package/dist/web/assets/useTokenUsage-Ay3Yy0_V.js +1 -0
- package/dist/web/assets/{vennDiagram-CIIHVFJN-DzVayy4U.js → vennDiagram-CIIHVFJN-DKREAIRT.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-CULSKh55.js → wardley-L42UT6IY-BMpDotAz.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-C5_h3lAA.js → wardleyDiagram-YWT4CUSO-DAPccQsF.js} +1 -1
- package/dist/web/assets/{xml-XuycSwh6.js → xml-DnxIQwRS.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-F65naXcR.js → xychartDiagram-2RQKCTM6-o06g8vo8.js} +1 -1
- package/dist/web/assets/{yaml-BWm159lw.js → yaml-BV5yQTRd.js} +1 -1
- package/dist/web/index.html +1 -1
- package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts +4 -0
- package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/log-adapter.js +1 -0
- package/node_modules/@agent-tower/shared/dist/log-adapter.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/translation.d.ts +4 -1
- package/node_modules/@agent-tower/shared/dist/translation.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/translation.js +4 -1
- package/node_modules/@agent-tower/shared/dist/translation.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.d.ts +38 -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 +2 -1
- package/prisma/migrations/20261106000000_add_session_wakeups/migration.sql +28 -0
- package/prisma/schema.prisma +28 -0
- package/scripts/postinstall.js +23 -0
- package/dist/web/assets/AttachmentPreview-TPd4gdfb.js +0 -2
- package/dist/web/assets/CreateTaskInput-TcZpjBe-.js +0 -1
- package/dist/web/assets/TaskHandoffPanel-CJahUKNo.js +0 -70
- package/dist/web/assets/channel-CDkuQ_7m.js +0 -1
- package/dist/web/assets/check-yNWhPvMH.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-eHY73FGu.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-eHY73FGu.js +0 -1
- package/dist/web/assets/javascript-DKmxrNeR.js +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-CCLmVs34.js +0 -1
- package/dist/web/assets/useTokenUsage-D7SEwXb0.js +0 -1
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import https from 'node:https';
|
|
3
|
+
import { buildPreviewBootstrapPage, buildPreviewBridgeScript, buildPreviewServiceWorkerScript, injectPreviewBridge, PREVIEW_BASE_PATH_HEADER, PREVIEW_BOOT_PARAM, PREVIEW_DESTINATION_HEADER, PREVIEW_INTERNAL_QUERY_PARAMS, PREVIEW_MODE_PARAM, PREVIEW_SERVICE_WORKER_HEADER, PREVIEW_SERVICE_WORKER_SEGMENT, PREVIEW_TARGET_HEADER, } from './preview-bridge.js';
|
|
4
|
+
import { filterTargetCookieHeader, PREVIEW_CONTEXT_COOKIE_NAME, previewCookieScopeName, rewriteTargetCookie, } from './preview-cookies.js';
|
|
5
|
+
import { buildPreviewPathPrefix, parsePreviewPath, PREVIEW_PREFIX } from '../utils/preview-path.js';
|
|
6
|
+
/**
|
|
7
|
+
* Same-origin workspace preview proxy mounted at `/view/:workspaceId/`.
|
|
8
|
+
*
|
|
9
|
+
* The browser only ever talks to Agent Tower's own origin, so the preview is
|
|
10
|
+
* reachable from exactly the places Agent Tower itself is reachable from:
|
|
11
|
+
* localhost, the LAN, a Cloudflare tunnel, a reverse proxy, or Docker.
|
|
12
|
+
*/
|
|
13
|
+
export const PREVIEW_SANDBOX_CSP = [
|
|
14
|
+
'sandbox',
|
|
15
|
+
'allow-scripts',
|
|
16
|
+
'allow-same-origin',
|
|
17
|
+
'allow-forms',
|
|
18
|
+
'allow-popups',
|
|
19
|
+
'allow-popups-to-escape-sandbox',
|
|
20
|
+
'allow-modals',
|
|
21
|
+
'allow-downloads',
|
|
22
|
+
'allow-pointer-lock',
|
|
23
|
+
'allow-presentation',
|
|
24
|
+
].join(' ');
|
|
25
|
+
const PREVIEW_CONTEXT_COOKIE_MAX_AGE_SECONDS = 24 * 60 * 60;
|
|
26
|
+
const EMBEDDED_DESTINATIONS = new Set(['iframe', 'frame', 'embed', 'object']);
|
|
27
|
+
const DOCUMENT_DESTINATIONS = new Set(['document', ...EMBEDDED_DESTINATIONS]);
|
|
28
|
+
const STRIPPED_REQUEST_HEADERS = new Set([
|
|
29
|
+
'host',
|
|
30
|
+
'connection',
|
|
31
|
+
'upgrade',
|
|
32
|
+
'content-length',
|
|
33
|
+
'accept-encoding',
|
|
34
|
+
'proxy-authorization',
|
|
35
|
+
'forwarded',
|
|
36
|
+
'x-forwarded-for',
|
|
37
|
+
'x-forwarded-host',
|
|
38
|
+
'x-forwarded-proto',
|
|
39
|
+
'x-real-ip',
|
|
40
|
+
'sec-fetch-dest',
|
|
41
|
+
'sec-fetch-mode',
|
|
42
|
+
'sec-fetch-site',
|
|
43
|
+
'sec-fetch-user',
|
|
44
|
+
PREVIEW_SERVICE_WORKER_HEADER,
|
|
45
|
+
PREVIEW_DESTINATION_HEADER,
|
|
46
|
+
]);
|
|
47
|
+
export function firstHeaderValue(value) {
|
|
48
|
+
return Array.isArray(value) ? value[0] : value;
|
|
49
|
+
}
|
|
50
|
+
export function requestProtocol(headers) {
|
|
51
|
+
const forwarded = firstHeaderValue(headers['x-forwarded-proto']);
|
|
52
|
+
if (forwarded?.split(',')[0]?.trim().toLowerCase() === 'https')
|
|
53
|
+
return 'https';
|
|
54
|
+
const cfVisitor = firstHeaderValue(headers['cf-visitor']);
|
|
55
|
+
if (cfVisitor) {
|
|
56
|
+
try {
|
|
57
|
+
if (JSON.parse(cfVisitor).scheme === 'https')
|
|
58
|
+
return 'https';
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Ignore malformed Cloudflare metadata.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return 'http';
|
|
65
|
+
}
|
|
66
|
+
function isHtmlAcceptHeader(accept) {
|
|
67
|
+
return typeof accept === 'string' && accept.toLowerCase().includes('text/html');
|
|
68
|
+
}
|
|
69
|
+
export function classifyPreviewRequest(method, headers, search) {
|
|
70
|
+
const params = new URLSearchParams(search);
|
|
71
|
+
const swHeader = firstHeaderValue(headers[PREVIEW_SERVICE_WORKER_HEADER]);
|
|
72
|
+
const serviceWorker = Boolean(swHeader);
|
|
73
|
+
const upperMethod = method.toUpperCase();
|
|
74
|
+
const navigationMethod = upperMethod === 'GET' || upperMethod === 'HEAD' || upperMethod === 'POST';
|
|
75
|
+
if (serviceWorker) {
|
|
76
|
+
const destination = firstHeaderValue(headers[PREVIEW_DESTINATION_HEADER]) ?? '';
|
|
77
|
+
const document = swHeader === 'navigate';
|
|
78
|
+
return {
|
|
79
|
+
serviceWorker: true,
|
|
80
|
+
document,
|
|
81
|
+
embedded: document && EMBEDDED_DESTINATIONS.has(destination),
|
|
82
|
+
plainMode: false,
|
|
83
|
+
bootstrapped: params.get(PREVIEW_BOOT_PARAM) === '1',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const destination = firstHeaderValue(headers['sec-fetch-dest']);
|
|
87
|
+
const document = navigationMethod && (destination
|
|
88
|
+
? DOCUMENT_DESTINATIONS.has(destination)
|
|
89
|
+
: isHtmlAcceptHeader(firstHeaderValue(headers.accept)));
|
|
90
|
+
return {
|
|
91
|
+
serviceWorker: false,
|
|
92
|
+
document,
|
|
93
|
+
embedded: document && (destination ? EMBEDDED_DESTINATIONS.has(destination) : false),
|
|
94
|
+
plainMode: params.get(PREVIEW_MODE_PARAM) === 'plain',
|
|
95
|
+
bootstrapped: params.get(PREVIEW_BOOT_PARAM) === '1',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Should the request be answered with the service worker bootstrap page instead of the target document? */
|
|
99
|
+
export function shouldServeBootstrap(context, method) {
|
|
100
|
+
if (method.toUpperCase() !== 'GET')
|
|
101
|
+
return false;
|
|
102
|
+
return context.document && !context.serviceWorker && !context.plainMode && !context.bootstrapped;
|
|
103
|
+
}
|
|
104
|
+
export function stripInternalQueryParams(search) {
|
|
105
|
+
if (!search)
|
|
106
|
+
return '';
|
|
107
|
+
const params = new URLSearchParams(search);
|
|
108
|
+
for (const name of PREVIEW_INTERNAL_QUERY_PARAMS)
|
|
109
|
+
params.delete(name);
|
|
110
|
+
const next = params.toString();
|
|
111
|
+
return next ? `?${next}` : '';
|
|
112
|
+
}
|
|
113
|
+
export function joinTargetPath(target, suffix, search) {
|
|
114
|
+
const normalizedSuffix = suffix.startsWith('/') ? suffix : `/${suffix}`;
|
|
115
|
+
const base = target.basePath || '';
|
|
116
|
+
const path = `${base}${normalizedSuffix}`.replace(/\/{2,}/g, '/');
|
|
117
|
+
return `${path || '/'}${search}`;
|
|
118
|
+
}
|
|
119
|
+
function getPathname(value) {
|
|
120
|
+
const end = value.search(/[?#]/);
|
|
121
|
+
return end === -1 ? value : value.slice(0, end);
|
|
122
|
+
}
|
|
123
|
+
function isSameOrChildPath(pathname, basePath) {
|
|
124
|
+
return pathname === basePath || pathname.startsWith(`${basePath}/`);
|
|
125
|
+
}
|
|
126
|
+
/** Map a browser URL on the Agent Tower origin back to the target URL it represents. */
|
|
127
|
+
function browserUrlToTargetUrl(value, scope) {
|
|
128
|
+
let url;
|
|
129
|
+
try {
|
|
130
|
+
url = new URL(value);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const parsed = parsePreviewPath(`${url.pathname}${url.search}`);
|
|
136
|
+
const targetUrl = new URL(scope.target.origin);
|
|
137
|
+
if (parsed && parsed.workspaceId === scope.workspaceId) {
|
|
138
|
+
targetUrl.pathname = getPathname(joinTargetPath(scope.target, parsed.suffix, ''));
|
|
139
|
+
targetUrl.search = stripInternalQueryParams(parsed.search);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Virtualized documents report target-relative paths directly.
|
|
143
|
+
targetUrl.pathname = getPathname(joinTargetPath(scope.target, url.pathname, ''));
|
|
144
|
+
targetUrl.search = stripInternalQueryParams(url.search);
|
|
145
|
+
}
|
|
146
|
+
targetUrl.hash = '';
|
|
147
|
+
return targetUrl.toString();
|
|
148
|
+
}
|
|
149
|
+
export function proxyRequestHeaders(headers, scope, targetPath) {
|
|
150
|
+
const targetUrl = new URL(scope.target.origin);
|
|
151
|
+
const next = {};
|
|
152
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
153
|
+
const lower = key.toLowerCase();
|
|
154
|
+
if (STRIPPED_REQUEST_HEADERS.has(lower) || lower.startsWith('cf-'))
|
|
155
|
+
continue;
|
|
156
|
+
if (value !== undefined)
|
|
157
|
+
next[lower] = value;
|
|
158
|
+
}
|
|
159
|
+
const cookie = filterTargetCookieHeader(firstHeaderValue(headers.cookie), previewCookieScopeName(scope.workspaceId));
|
|
160
|
+
if (cookie)
|
|
161
|
+
next.cookie = cookie;
|
|
162
|
+
else
|
|
163
|
+
delete next.cookie;
|
|
164
|
+
next.host = targetUrl.host;
|
|
165
|
+
next['accept-encoding'] = 'identity';
|
|
166
|
+
next['x-forwarded-host'] = firstHeaderValue(headers.host) ?? targetUrl.host;
|
|
167
|
+
next['x-forwarded-proto'] = requestProtocol(headers);
|
|
168
|
+
if (headers.origin)
|
|
169
|
+
next.origin = targetUrl.origin;
|
|
170
|
+
const referer = firstHeaderValue(headers.referer);
|
|
171
|
+
if (referer) {
|
|
172
|
+
next.referer = browserUrlToTargetUrl(referer, scope) ?? new URL(targetPath, targetUrl).toString();
|
|
173
|
+
}
|
|
174
|
+
return next;
|
|
175
|
+
}
|
|
176
|
+
export function rewriteLocationHeader(value, scope) {
|
|
177
|
+
const prefix = buildPreviewPathPrefix(scope.workspaceId, scope.previewToken);
|
|
178
|
+
const { target } = scope;
|
|
179
|
+
try {
|
|
180
|
+
const location = new URL(value, target.origin);
|
|
181
|
+
if (location.origin !== target.origin)
|
|
182
|
+
return value;
|
|
183
|
+
if (isSameOrChildPath(location.pathname, prefix)) {
|
|
184
|
+
return `${location.pathname}${location.search}${location.hash}`;
|
|
185
|
+
}
|
|
186
|
+
const basePath = target.basePath;
|
|
187
|
+
const isUnderBasePath = basePath
|
|
188
|
+
? location.pathname === basePath || location.pathname.startsWith(`${basePath}/`)
|
|
189
|
+
: true;
|
|
190
|
+
const path = isUnderBasePath
|
|
191
|
+
? location.pathname.slice(target.basePath.length || 0) || '/'
|
|
192
|
+
: location.pathname;
|
|
193
|
+
return `${prefix}${path}${location.search}${location.hash}`;
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
if (isSameOrChildPath(getPathname(value), prefix))
|
|
197
|
+
return value;
|
|
198
|
+
if (value.startsWith('/'))
|
|
199
|
+
return `${prefix}${value}`;
|
|
200
|
+
return value;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export function serializePreviewContextCookie(workspaceId, secure) {
|
|
204
|
+
const parts = [
|
|
205
|
+
`${PREVIEW_CONTEXT_COOKIE_NAME}=${encodeURIComponent(workspaceId)}`,
|
|
206
|
+
'Path=/',
|
|
207
|
+
'HttpOnly',
|
|
208
|
+
'SameSite=Lax',
|
|
209
|
+
`Max-Age=${PREVIEW_CONTEXT_COOKIE_MAX_AGE_SECONDS}`,
|
|
210
|
+
];
|
|
211
|
+
if (secure)
|
|
212
|
+
parts.push('Secure');
|
|
213
|
+
return parts.join('; ');
|
|
214
|
+
}
|
|
215
|
+
export function proxyResponseHeaders(headers, scope, requestHeaders, options) {
|
|
216
|
+
const next = {};
|
|
217
|
+
const secure = requestProtocol(requestHeaders) === 'https';
|
|
218
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
219
|
+
const lower = key.toLowerCase();
|
|
220
|
+
if (lower === 'connection'
|
|
221
|
+
|| (lower === 'content-length' && (options.rewritesBody ?? options.document))
|
|
222
|
+
|| lower === 'content-encoding'
|
|
223
|
+
|| lower === 'transfer-encoding'
|
|
224
|
+
|| lower === 'keep-alive'
|
|
225
|
+
|| lower === 'x-frame-options'
|
|
226
|
+
|| lower === 'content-security-policy'
|
|
227
|
+
|| lower === 'content-security-policy-report-only') {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (lower === 'location' && typeof value === 'string') {
|
|
231
|
+
next[key] = rewriteLocationHeader(value, scope);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (lower === 'set-cookie') {
|
|
235
|
+
const cookies = Array.isArray(value) ? value : typeof value === 'string' ? [value] : [];
|
|
236
|
+
next[key] = cookies.map((cookie) => rewriteTargetCookie(cookie, scope.target, previewCookieScopeName(scope.workspaceId), secure, { forceRootPath: true }));
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (value !== undefined)
|
|
240
|
+
next[key] = value;
|
|
241
|
+
}
|
|
242
|
+
if (options.document) {
|
|
243
|
+
next[PREVIEW_TARGET_HEADER] = scope.target.origin;
|
|
244
|
+
next[PREVIEW_BASE_PATH_HEADER] = scope.target.basePath;
|
|
245
|
+
const existing = next['set-cookie'];
|
|
246
|
+
const cookies = Array.isArray(existing) ? existing : typeof existing === 'string' ? [existing] : [];
|
|
247
|
+
next['set-cookie'] = [...cookies, serializePreviewContextCookie(scope.workspaceId, secure)];
|
|
248
|
+
if (options.embedded)
|
|
249
|
+
next['content-security-policy'] = PREVIEW_SANDBOX_CSP;
|
|
250
|
+
next['cache-control'] = 'no-store';
|
|
251
|
+
}
|
|
252
|
+
return next;
|
|
253
|
+
}
|
|
254
|
+
function isHtmlResponse(headers) {
|
|
255
|
+
const contentType = firstHeaderValue(headers['content-type'])?.toLowerCase() ?? '';
|
|
256
|
+
return contentType.includes('text/html');
|
|
257
|
+
}
|
|
258
|
+
function isCssResponse(headers) {
|
|
259
|
+
const contentType = firstHeaderValue(headers['content-type'])?.toLowerCase() ?? '';
|
|
260
|
+
return contentType.includes('text/css');
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Plain mode only (no service worker): rewrite static root-relative references
|
|
264
|
+
* in HTML/CSS so the first paint works without a redirect round trip for every
|
|
265
|
+
* asset. Service-worker documents are left untouched.
|
|
266
|
+
*/
|
|
267
|
+
export function rewritePlainModeBody(body, prefix, kind) {
|
|
268
|
+
let next = body;
|
|
269
|
+
if (kind === 'html') {
|
|
270
|
+
next = next
|
|
271
|
+
.replace(/(\s(?:src|href|action|poster|data|formaction)=["'])\/(?!\/|view\/)([^"']*)/gi, `$1${prefix}/$2`)
|
|
272
|
+
.replace(/(\s(?:srcset|imagesrcset)=["'])([^"']*)(["'])/gi, (_match, before, srcset, after) => {
|
|
273
|
+
const rewritten = srcset.replace(/(^|,\s*)\/(?!\/|view\/)([^\s,]+)/g, `$1${prefix}/$2`);
|
|
274
|
+
return `${before}${rewritten}${after}`;
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
next = next.replace(/url\((['"]?)\/(?!\/|view\/)([^)'"]+)\1\)/g, `url($1${prefix}/$2$1)`);
|
|
278
|
+
return next;
|
|
279
|
+
}
|
|
280
|
+
export function buildBridgeTag(scope, serviceWorker) {
|
|
281
|
+
return buildPreviewBridgeScript({
|
|
282
|
+
mode: 'prefix',
|
|
283
|
+
prefix: buildPreviewPathPrefix(scope.workspaceId, scope.previewToken),
|
|
284
|
+
workspaceId: scope.workspaceId,
|
|
285
|
+
targetOrigin: scope.target.origin,
|
|
286
|
+
targetBasePath: scope.target.basePath,
|
|
287
|
+
serviceWorker,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
export function previewServiceWorkerSegment(suffix) {
|
|
291
|
+
return suffix === `/${PREVIEW_SERVICE_WORKER_SEGMENT}`;
|
|
292
|
+
}
|
|
293
|
+
export function writeServiceWorkerScript(response) {
|
|
294
|
+
response.writeHead(200, {
|
|
295
|
+
'content-type': 'application/javascript; charset=utf-8',
|
|
296
|
+
'cache-control': 'no-cache',
|
|
297
|
+
'service-worker-allowed': `${PREVIEW_PREFIX}/`,
|
|
298
|
+
});
|
|
299
|
+
response.end(buildPreviewServiceWorkerScript());
|
|
300
|
+
}
|
|
301
|
+
export function writeBootstrapPage(response, scope) {
|
|
302
|
+
response.writeHead(200, {
|
|
303
|
+
'content-type': 'text/html; charset=utf-8',
|
|
304
|
+
'cache-control': 'no-store',
|
|
305
|
+
});
|
|
306
|
+
response.end(buildPreviewBootstrapPage({
|
|
307
|
+
scope: `${buildPreviewPathPrefix(scope.workspaceId, scope.previewToken)}/`,
|
|
308
|
+
}));
|
|
309
|
+
}
|
|
310
|
+
function writeProxyError(response, message) {
|
|
311
|
+
if (!response.headersSent) {
|
|
312
|
+
response.writeHead(502, {
|
|
313
|
+
'content-type': 'text/html; charset=utf-8',
|
|
314
|
+
'cache-control': 'no-store',
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
const escaped = message.replace(/[&<>"]/g, (char) => ({ '&': '&', '<': '<', '>': '>', '"': '"' }[char] ?? char));
|
|
318
|
+
response.end(`<!doctype html><html><head><meta charset="utf-8"><title>Preview unavailable</title></head>`
|
|
319
|
+
+ `<body style="font:14px system-ui,sans-serif;color:#6b7280;padding:24px">`
|
|
320
|
+
+ `<p data-agent-tower-preview-error>Preview target unavailable: ${escaped}</p>`
|
|
321
|
+
+ `<p>Start the preview server, then refresh.</p></body></html>`);
|
|
322
|
+
}
|
|
323
|
+
export async function proxyPreviewHttpRequest(input) {
|
|
324
|
+
const { request, response, scope, context } = input;
|
|
325
|
+
const targetUrl = new URL(scope.target.origin);
|
|
326
|
+
const targetPath = joinTargetPath(scope.target, input.suffix, stripInternalQueryParams(input.search));
|
|
327
|
+
const headers = proxyRequestHeaders(request.headers, scope, targetPath);
|
|
328
|
+
if (input.body)
|
|
329
|
+
headers['content-length'] = Buffer.byteLength(input.body);
|
|
330
|
+
const prefix = buildPreviewPathPrefix(scope.workspaceId, scope.previewToken);
|
|
331
|
+
const options = {
|
|
332
|
+
protocol: targetUrl.protocol,
|
|
333
|
+
hostname: targetUrl.hostname,
|
|
334
|
+
port: targetUrl.port,
|
|
335
|
+
method: request.method,
|
|
336
|
+
path: targetPath,
|
|
337
|
+
headers,
|
|
338
|
+
rejectUnauthorized: false,
|
|
339
|
+
};
|
|
340
|
+
const transport = targetUrl.protocol === 'https:' ? https : http;
|
|
341
|
+
await new Promise((resolve) => {
|
|
342
|
+
const proxyRequest = transport.request(options, (proxyResponse) => {
|
|
343
|
+
const statusCode = proxyResponse.statusCode ?? 502;
|
|
344
|
+
const hasBody = request.method !== 'HEAD' && statusCode !== 204 && statusCode !== 304;
|
|
345
|
+
const html = hasBody && isHtmlResponse(proxyResponse.headers);
|
|
346
|
+
const documentResponse = context.document && html;
|
|
347
|
+
const rewriteCss = hasBody && !context.serviceWorker && isCssResponse(proxyResponse.headers);
|
|
348
|
+
const rewriteBody = documentResponse || rewriteCss;
|
|
349
|
+
const responseHeaders = proxyResponseHeaders(proxyResponse.headers, scope, request.headers, {
|
|
350
|
+
document: documentResponse,
|
|
351
|
+
embedded: context.embedded,
|
|
352
|
+
rewritesBody: rewriteBody,
|
|
353
|
+
});
|
|
354
|
+
response.statusCode = statusCode;
|
|
355
|
+
for (const [key, value] of Object.entries(responseHeaders)) {
|
|
356
|
+
if (value !== undefined)
|
|
357
|
+
response.setHeader(key, value);
|
|
358
|
+
}
|
|
359
|
+
if (!rewriteBody) {
|
|
360
|
+
proxyResponse.pipe(response);
|
|
361
|
+
proxyResponse.once('end', resolve);
|
|
362
|
+
proxyResponse.once('error', () => {
|
|
363
|
+
response.destroy();
|
|
364
|
+
resolve();
|
|
365
|
+
});
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
const chunks = [];
|
|
369
|
+
proxyResponse.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
|
|
370
|
+
proxyResponse.once('end', () => {
|
|
371
|
+
let payload = Buffer.concat(chunks);
|
|
372
|
+
if (documentResponse) {
|
|
373
|
+
if (!context.serviceWorker) {
|
|
374
|
+
payload = Buffer.from(rewritePlainModeBody(payload.toString('utf8'), prefix, 'html'), 'utf8');
|
|
375
|
+
}
|
|
376
|
+
payload = injectPreviewBridge(payload, buildBridgeTag(scope, context.serviceWorker));
|
|
377
|
+
}
|
|
378
|
+
else if (rewriteCss) {
|
|
379
|
+
payload = Buffer.from(rewritePlainModeBody(payload.toString('utf8'), prefix, 'css'), 'utf8');
|
|
380
|
+
}
|
|
381
|
+
response.end(payload);
|
|
382
|
+
resolve();
|
|
383
|
+
});
|
|
384
|
+
proxyResponse.once('error', () => {
|
|
385
|
+
response.destroy();
|
|
386
|
+
resolve();
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
proxyRequest.once('error', (error) => {
|
|
390
|
+
writeProxyError(response, error.message);
|
|
391
|
+
resolve();
|
|
392
|
+
});
|
|
393
|
+
proxyRequest.end(input.body ?? undefined);
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
export function writeUpgradeError(socket, statusCode, message) {
|
|
397
|
+
if (socket.destroyed)
|
|
398
|
+
return;
|
|
399
|
+
socket.write(`HTTP/1.1 ${statusCode} ${message}\r\nConnection: close\r\n\r\n`);
|
|
400
|
+
socket.destroy();
|
|
401
|
+
}
|
|
402
|
+
export function proxyPreviewWebSocket(request, socket, head, scope, suffix, search) {
|
|
403
|
+
socket.on('error', () => {
|
|
404
|
+
if (!socket.destroyed)
|
|
405
|
+
socket.destroy();
|
|
406
|
+
});
|
|
407
|
+
const targetUrl = new URL(scope.target.origin);
|
|
408
|
+
const targetPath = joinTargetPath(scope.target, suffix, stripInternalQueryParams(search));
|
|
409
|
+
const headers = proxyRequestHeaders(request.headers, scope, targetPath);
|
|
410
|
+
headers.connection = 'Upgrade';
|
|
411
|
+
headers.upgrade = 'websocket';
|
|
412
|
+
const options = {
|
|
413
|
+
protocol: targetUrl.protocol,
|
|
414
|
+
hostname: targetUrl.hostname,
|
|
415
|
+
port: targetUrl.port,
|
|
416
|
+
method: 'GET',
|
|
417
|
+
path: targetPath,
|
|
418
|
+
headers,
|
|
419
|
+
rejectUnauthorized: false,
|
|
420
|
+
};
|
|
421
|
+
const transport = targetUrl.protocol === 'https:' ? https : http;
|
|
422
|
+
const proxyRequest = transport.request(options);
|
|
423
|
+
proxyRequest.once('upgrade', (proxyResponse, proxySocket, proxyHead) => {
|
|
424
|
+
const closeClient = () => {
|
|
425
|
+
if (!socket.destroyed)
|
|
426
|
+
socket.destroy();
|
|
427
|
+
};
|
|
428
|
+
const closeTarget = () => {
|
|
429
|
+
if (!proxySocket.destroyed)
|
|
430
|
+
proxySocket.destroy();
|
|
431
|
+
};
|
|
432
|
+
socket.once('close', closeTarget);
|
|
433
|
+
socket.once('error', closeTarget);
|
|
434
|
+
proxySocket.once('close', closeClient);
|
|
435
|
+
proxySocket.once('error', closeClient);
|
|
436
|
+
const headerLines = [
|
|
437
|
+
`HTTP/1.1 ${proxyResponse.statusCode} ${proxyResponse.statusMessage}`,
|
|
438
|
+
...Object.entries(proxyResponse.headers).flatMap(([key, value]) => {
|
|
439
|
+
if (Array.isArray(value))
|
|
440
|
+
return value.map((item) => `${key}: ${item}`);
|
|
441
|
+
return value === undefined ? [] : [`${key}: ${value}`];
|
|
442
|
+
}),
|
|
443
|
+
'',
|
|
444
|
+
'',
|
|
445
|
+
];
|
|
446
|
+
socket.write(headerLines.join('\r\n'));
|
|
447
|
+
if (proxyHead.length > 0)
|
|
448
|
+
socket.write(proxyHead);
|
|
449
|
+
if (head.length > 0)
|
|
450
|
+
proxySocket.write(head);
|
|
451
|
+
proxySocket.pipe(socket);
|
|
452
|
+
socket.pipe(proxySocket);
|
|
453
|
+
});
|
|
454
|
+
proxyRequest.once('response', (proxyResponse) => {
|
|
455
|
+
writeUpgradeError(socket, proxyResponse.statusCode ?? 502, proxyResponse.statusMessage ?? 'Bad Gateway');
|
|
456
|
+
});
|
|
457
|
+
proxyRequest.once('error', () => {
|
|
458
|
+
writeUpgradeError(socket, 502, 'Bad Gateway');
|
|
459
|
+
});
|
|
460
|
+
proxyRequest.end();
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=preview-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-proxy.js","sourceRoot":"","sources":["../../src/services/preview-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
import type { NormalizedPreviewTarget } from './preview.service.js';
|
|
2
|
-
|
|
2
|
+
export { rewriteTargetCookie } from './preview-cookies.js';
|
|
3
|
+
/**
|
|
4
|
+
* Dedicated-origin preview gateways.
|
|
5
|
+
*
|
|
6
|
+
* Each workspace preview opened from a browser that can reach extra ports on
|
|
7
|
+
* the Agent Tower host gets its own root-path HTTP server. The previewed app
|
|
8
|
+
* then owns the whole URL space (`/login`, `/assets`, SPA history, cookies)
|
|
9
|
+
* without any rewriting. Browsers that cannot reach those ports use the
|
|
10
|
+
* same-origin `/view/:workspaceId/` proxy instead (see preview-proxy.ts).
|
|
11
|
+
*/
|
|
3
12
|
export declare const PREVIEW_GATEWAY_TOKEN_PARAM = "__agent_tower_preview_token";
|
|
4
|
-
export declare const PREVIEW_BRIDGE_PATH = "/__agent_tower_preview_bridge.js";
|
|
5
13
|
export declare const PREVIEW_HEARTBEAT_PATH = "/__agent_tower_preview_heartbeat";
|
|
6
|
-
type PreviewMode = 'local' | 'remote';
|
|
7
|
-
interface PreviewTunnel extends ManagedCloudflaredTunnel {
|
|
8
|
-
stop(): boolean;
|
|
9
|
-
on(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
|
|
10
|
-
on(event: 'error', listener: (error: Error) => void): this;
|
|
11
|
-
once(event: 'url', listener: (url: string) => void): this;
|
|
12
|
-
once(event: 'error', listener: (error: Error) => void): this;
|
|
13
|
-
once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
|
|
14
|
-
off(event: 'url', listener: (url: string) => void): this;
|
|
15
|
-
off(event: 'error', listener: (error: Error) => void): this;
|
|
16
|
-
off(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
|
|
17
|
-
}
|
|
18
14
|
export interface PreviewGatewaySession {
|
|
19
15
|
id: string;
|
|
20
16
|
workspaceId: string;
|
|
21
17
|
target: string;
|
|
22
|
-
mode: PreviewMode;
|
|
23
18
|
viewBaseUrl: string;
|
|
24
19
|
expiresAt: string;
|
|
25
20
|
}
|
|
@@ -29,10 +24,7 @@ export interface PreviewRuntimeManagerOptions {
|
|
|
29
24
|
sweepIntervalMs?: number;
|
|
30
25
|
listenHost?: string;
|
|
31
26
|
now?: () => number;
|
|
32
|
-
createTunnel?: (targetUrl: string) => PreviewTunnel;
|
|
33
|
-
ensureTunnelBinary?: () => Promise<void>;
|
|
34
27
|
}
|
|
35
|
-
export declare function rewriteTargetCookie(value: string, target: NormalizedPreviewTarget, runtimeCookieName: string, secureGateway: boolean): string;
|
|
36
28
|
export declare function addPreviewAccessToken(viewBaseUrl: string, token: string, suffix?: string): string;
|
|
37
29
|
export declare class PreviewRuntimeManager {
|
|
38
30
|
private readonly runtimes;
|
|
@@ -41,11 +33,9 @@ export declare class PreviewRuntimeManager {
|
|
|
41
33
|
private readonly leaseTtlMs;
|
|
42
34
|
private readonly listenHost;
|
|
43
35
|
private readonly now;
|
|
44
|
-
private readonly createTunnel;
|
|
45
|
-
private readonly ensureTunnelBinary;
|
|
46
36
|
private readonly sweepTimer;
|
|
47
37
|
constructor(options?: PreviewRuntimeManagerOptions);
|
|
48
|
-
acquire(workspaceId: string, target: NormalizedPreviewTarget,
|
|
38
|
+
acquire(workspaceId: string, target: NormalizedPreviewTarget, localHostname: string): Promise<PreviewGatewaySession>;
|
|
49
39
|
heartbeat(workspaceId: string, leaseId: string): Promise<PreviewGatewaySession | null>;
|
|
50
40
|
release(workspaceId: string, leaseId: string): void;
|
|
51
41
|
invalidate(workspaceId: string): Promise<void>;
|
|
@@ -60,10 +50,6 @@ export declare class PreviewRuntimeManager {
|
|
|
60
50
|
private proxyHttpRequest;
|
|
61
51
|
private handleWebSocketUpgrade;
|
|
62
52
|
private assertRuntimeActive;
|
|
63
|
-
private ensureTunnel;
|
|
64
53
|
private sweep;
|
|
65
|
-
private stopRuntime;
|
|
66
|
-
private stopTunnel;
|
|
67
54
|
}
|
|
68
|
-
export {};
|
|
69
55
|
//# sourceMappingURL=preview-runtime-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview-runtime-manager.d.ts","sourceRoot":"","sources":["../../src/services/preview-runtime-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preview-runtime-manager.d.ts","sourceRoot":"","sources":["../../src/services/preview-runtime-manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAWpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;;;GAQG;AAEH,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,sBAAsB,qCAAqC,CAAC;AA+BzE,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAuND,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,MAAM,CAI9F;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;gBAEhC,OAAO,GAAE,4BAAiC;IAahD,OAAO,CACX,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,uBAAuB,EAC/B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,qBAAqB,CAAC;IAc3B,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAY5F,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7C,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,OAAO,CAAC,SAAS;YAUH,aAAa;IA+D3B,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,YAAY;YAIN,kBAAkB;YAyBlB,iBAAiB;YA+BjB,gBAAgB;YAwEhB,sBAAsB;IA+DpC,OAAO,CAAC,mBAAmB;YAMb,KAAK;CAqBpB"}
|