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,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-side runtime for workspace previews.
|
|
3
|
+
*
|
|
4
|
+
* Three pieces are generated here:
|
|
5
|
+
*
|
|
6
|
+
* 1. The bridge script injected into every proxied HTML document. It keeps the
|
|
7
|
+
* page inside its preview entry (prefix-aware URL rewriting, toolbar sync,
|
|
8
|
+
* optional address virtualization) and isolates browser storage.
|
|
9
|
+
* 2. The service worker used by the same-origin `/view/:workspaceId/` proxy.
|
|
10
|
+
* It transparently rewrites every request a controlled document makes so
|
|
11
|
+
* root-relative paths (`/assets/app.js`, `/api/...`, `import "/src/x.ts"`)
|
|
12
|
+
* reach the workspace target without any body rewriting.
|
|
13
|
+
* 3. The bootstrap page that registers the service worker before the real
|
|
14
|
+
* document is loaded, with a plain-mode fallback when workers are
|
|
15
|
+
* unavailable (insecure LAN origins, old browsers).
|
|
16
|
+
*/
|
|
17
|
+
export const PREVIEW_BRIDGE_SOURCE = 'agent-tower-preview';
|
|
18
|
+
export const PREVIEW_HOST_SOURCE = 'agent-tower-preview-host';
|
|
19
|
+
export const PREVIEW_SERVICE_WORKER_SEGMENT = '__agent_tower_preview_sw.js';
|
|
20
|
+
export const PREVIEW_SERVICE_WORKER_HEADER = 'x-agent-tower-preview-sw';
|
|
21
|
+
export const PREVIEW_DESTINATION_HEADER = 'x-agent-tower-preview-dest';
|
|
22
|
+
export const PREVIEW_TARGET_HEADER = 'x-agent-tower-preview-target';
|
|
23
|
+
export const PREVIEW_BASE_PATH_HEADER = 'x-agent-tower-preview-base-path';
|
|
24
|
+
export const PREVIEW_BOOT_PARAM = '__agent_tower_preview_boot';
|
|
25
|
+
export const PREVIEW_MODE_PARAM = '__agent_tower_preview_mode';
|
|
26
|
+
export const PREVIEW_TARGET_MESSAGE = 'agent-tower-preview-target';
|
|
27
|
+
export const PREVIEW_INTERNAL_QUERY_PARAMS = [PREVIEW_BOOT_PARAM, PREVIEW_MODE_PARAM];
|
|
28
|
+
export function buildPreviewBridgeScript(options) {
|
|
29
|
+
const config = {
|
|
30
|
+
mode: options.mode,
|
|
31
|
+
prefix: options.prefix,
|
|
32
|
+
workspaceId: options.workspaceId,
|
|
33
|
+
targetOrigin: options.targetOrigin,
|
|
34
|
+
targetBasePath: options.targetBasePath,
|
|
35
|
+
serviceWorker: options.serviceWorker,
|
|
36
|
+
heartbeatPath: options.heartbeatPath ?? null,
|
|
37
|
+
previewSource: PREVIEW_BRIDGE_SOURCE,
|
|
38
|
+
hostSource: PREVIEW_HOST_SOURCE,
|
|
39
|
+
targetMessage: PREVIEW_TARGET_MESSAGE,
|
|
40
|
+
internalParams: PREVIEW_INTERNAL_QUERY_PARAMS,
|
|
41
|
+
};
|
|
42
|
+
return `<script data-agent-tower-preview-bridge>(() => {
|
|
43
|
+
const config = ${JSON.stringify(config)};
|
|
44
|
+
const prefix = config.prefix;
|
|
45
|
+
const prefixDir = prefix + '/';
|
|
46
|
+
const loopbackHosts = new Set(['localhost', '127.0.0.1', '::1', '[::1]', '0.0.0.0']);
|
|
47
|
+
const privateHostPattern = /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.|169\\.254\\.|100\\.(6[4-9]|[7-9]\\d|1[01]\\d|12[0-7])\\.)/;
|
|
48
|
+
let target;
|
|
49
|
+
try { target = new URL(config.targetOrigin); } catch { target = null; }
|
|
50
|
+
const basePath = config.targetBasePath || '';
|
|
51
|
+
const embedded = window.self !== window.top;
|
|
52
|
+
const virtual = config.mode === 'prefix' && config.serviceWorker && embedded;
|
|
53
|
+
const post = (message) => {
|
|
54
|
+
if (!embedded) return;
|
|
55
|
+
try { window.parent.postMessage({ source: config.previewSource, ...message }, '*'); } catch {}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const normalizeProtocol = (protocol) => protocol === 'ws:' ? 'http:' : protocol === 'wss:' ? 'https:' : protocol;
|
|
59
|
+
const normalizeHost = (hostname) => {
|
|
60
|
+
const lower = hostname.toLowerCase();
|
|
61
|
+
return loopbackHosts.has(lower) ? 'loopback' : lower;
|
|
62
|
+
};
|
|
63
|
+
const effectivePort = (url) => url.port || (normalizeProtocol(url.protocol) === 'https:' ? '443' : '80');
|
|
64
|
+
const sameEndpoint = (left, right) => normalizeProtocol(left.protocol) === normalizeProtocol(right.protocol)
|
|
65
|
+
&& normalizeHost(left.hostname) === normalizeHost(right.hostname)
|
|
66
|
+
&& effectivePort(left) === effectivePort(right);
|
|
67
|
+
const isPrefixed = (pathname) => prefix !== '' && (pathname === prefix || pathname.startsWith(prefixDir));
|
|
68
|
+
const stripBasePath = (pathname) => basePath && (pathname === basePath || pathname.startsWith(basePath + '/'))
|
|
69
|
+
? (pathname.slice(basePath.length) || '/')
|
|
70
|
+
: pathname;
|
|
71
|
+
const stripInternalParams = (search) => {
|
|
72
|
+
const params = new URLSearchParams(search);
|
|
73
|
+
for (const name of config.internalParams) params.delete(name);
|
|
74
|
+
const next = params.toString();
|
|
75
|
+
return next ? '?' + next : '';
|
|
76
|
+
};
|
|
77
|
+
const isServerReachableHost = (hostname) => {
|
|
78
|
+
const lower = hostname.toLowerCase().replace(/^\\[|\\]$/g, '');
|
|
79
|
+
return loopbackHosts.has(lower)
|
|
80
|
+
|| privateHostPattern.test(lower)
|
|
81
|
+
|| lower.startsWith('fc') || lower.startsWith('fd') || lower.startsWith('fe80:')
|
|
82
|
+
|| !lower.includes('.')
|
|
83
|
+
|| /\\.(local|internal|lan|home|home\\.arpa|localhost)$/.test(lower);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// Classify a URL used by the page. Returns null when the proxy should not touch it.
|
|
87
|
+
const classify = (raw, base) => {
|
|
88
|
+
let url;
|
|
89
|
+
try { url = new URL(raw, base || window.location.href); } catch { return null; }
|
|
90
|
+
const isWs = url.protocol === 'ws:' || url.protocol === 'wss:';
|
|
91
|
+
if (!isWs && url.protocol !== 'http:' && url.protocol !== 'https:') return null;
|
|
92
|
+
const page = window.location;
|
|
93
|
+
const isPage = normalizeProtocol(url.protocol) === page.protocol && url.host.toLowerCase() === page.host.toLowerCase();
|
|
94
|
+
const isTarget = Boolean(target) && sameEndpoint(url, target);
|
|
95
|
+
if (isPage) {
|
|
96
|
+
if (config.mode === 'gateway' || isPrefixed(url.pathname)) return null;
|
|
97
|
+
return { url, pathname: url.pathname, isWs };
|
|
98
|
+
}
|
|
99
|
+
if (isTarget) return { url, pathname: stripBasePath(url.pathname), isWs };
|
|
100
|
+
return null;
|
|
101
|
+
};
|
|
102
|
+
const proxyUrl = (raw, base) => {
|
|
103
|
+
const info = classify(raw, base);
|
|
104
|
+
if (!info) return null;
|
|
105
|
+
const protocol = info.isWs
|
|
106
|
+
? (window.location.protocol === 'https:' ? 'wss:' : 'ws:')
|
|
107
|
+
: window.location.protocol;
|
|
108
|
+
return protocol + '//' + window.location.host + prefix + info.pathname + info.url.search + info.url.hash;
|
|
109
|
+
};
|
|
110
|
+
const currentTargetPath = () => {
|
|
111
|
+
const location = window.location;
|
|
112
|
+
let pathname = location.pathname;
|
|
113
|
+
if (config.mode === 'prefix' && !virtual && isPrefixed(pathname)) pathname = pathname.slice(prefix.length) || '/';
|
|
114
|
+
return pathname + stripInternalParams(location.search) + location.hash;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// Virtualize the address bar for SPA routers (service worker mode) or just
|
|
118
|
+
// drop the internal bootstrap parameters from the visible URL.
|
|
119
|
+
try {
|
|
120
|
+
if (config.mode === 'prefix') {
|
|
121
|
+
const location = window.location;
|
|
122
|
+
const search = stripInternalParams(location.search);
|
|
123
|
+
if (virtual) {
|
|
124
|
+
const pathname = isPrefixed(location.pathname) ? (location.pathname.slice(prefix.length) || '/') : location.pathname;
|
|
125
|
+
history.replaceState(history.state, '', pathname + search + location.hash);
|
|
126
|
+
} else if (search !== location.search) {
|
|
127
|
+
history.replaceState(history.state, '', location.pathname + search + location.hash);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
} catch {}
|
|
131
|
+
|
|
132
|
+
const sendLocation = () => post({ type: 'location', path: currentTargetPath(), href: window.location.href, title: document.title });
|
|
133
|
+
const scheduleLocation = () => window.setTimeout(sendLocation, 0);
|
|
134
|
+
|
|
135
|
+
const nativePushState = History.prototype.pushState;
|
|
136
|
+
const nativeReplaceState = History.prototype.replaceState;
|
|
137
|
+
const rewriteHistoryUrl = (url) => {
|
|
138
|
+
if (url === undefined || url === null || virtual) return url;
|
|
139
|
+
try {
|
|
140
|
+
const next = proxyUrl(url instanceof URL ? url.toString() : String(url));
|
|
141
|
+
return next === null ? url : next;
|
|
142
|
+
} catch {
|
|
143
|
+
return url;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
History.prototype.pushState = function (state, unused, url) {
|
|
147
|
+
const result = nativePushState.call(this, state, unused, rewriteHistoryUrl(url));
|
|
148
|
+
scheduleLocation();
|
|
149
|
+
return result;
|
|
150
|
+
};
|
|
151
|
+
History.prototype.replaceState = function (state, unused, url) {
|
|
152
|
+
const result = nativeReplaceState.call(this, state, unused, rewriteHistoryUrl(url));
|
|
153
|
+
scheduleLocation();
|
|
154
|
+
return result;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// Without a service worker the page's own network calls have to be rewritten here.
|
|
158
|
+
if (!config.serviceWorker) {
|
|
159
|
+
const nativeFetch = window.fetch.bind(window);
|
|
160
|
+
window.fetch = (input, init) => {
|
|
161
|
+
try {
|
|
162
|
+
if (typeof input === 'string' || input instanceof URL) {
|
|
163
|
+
const next = proxyUrl(String(input));
|
|
164
|
+
return nativeFetch(next === null ? input : next, init);
|
|
165
|
+
}
|
|
166
|
+
if (input instanceof Request) {
|
|
167
|
+
const next = proxyUrl(input.url);
|
|
168
|
+
return nativeFetch(next === null ? input : new Request(next, input), init);
|
|
169
|
+
}
|
|
170
|
+
} catch {}
|
|
171
|
+
return nativeFetch(input, init);
|
|
172
|
+
};
|
|
173
|
+
const nativeXhrOpen = XMLHttpRequest.prototype.open;
|
|
174
|
+
XMLHttpRequest.prototype.open = function (method, url, ...rest) {
|
|
175
|
+
let next = url;
|
|
176
|
+
try { next = proxyUrl(String(url)) ?? url; } catch {}
|
|
177
|
+
return nativeXhrOpen.call(this, method, next, ...rest);
|
|
178
|
+
};
|
|
179
|
+
const NativeEventSource = window.EventSource;
|
|
180
|
+
if (NativeEventSource) {
|
|
181
|
+
function PreviewEventSource(url, options) {
|
|
182
|
+
let next = url;
|
|
183
|
+
try { next = proxyUrl(String(url)) ?? url; } catch {}
|
|
184
|
+
return new NativeEventSource(next, options);
|
|
185
|
+
}
|
|
186
|
+
PreviewEventSource.prototype = NativeEventSource.prototype;
|
|
187
|
+
Object.setPrototypeOf(PreviewEventSource, NativeEventSource);
|
|
188
|
+
window.EventSource = PreviewEventSource;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Service workers never see WebSocket handshakes, so always route them here.
|
|
193
|
+
const NativeWebSocket = window.WebSocket;
|
|
194
|
+
if (NativeWebSocket) {
|
|
195
|
+
function PreviewWebSocket(url, protocols) {
|
|
196
|
+
let next = url;
|
|
197
|
+
try { next = proxyUrl(String(url)) ?? url; } catch {}
|
|
198
|
+
return protocols === undefined ? new NativeWebSocket(next) : new NativeWebSocket(next, protocols);
|
|
199
|
+
}
|
|
200
|
+
PreviewWebSocket.prototype = NativeWebSocket.prototype;
|
|
201
|
+
Object.setPrototypeOf(PreviewWebSocket, NativeWebSocket);
|
|
202
|
+
for (const key of ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED']) {
|
|
203
|
+
try { Object.defineProperty(PreviewWebSocket, key, { value: NativeWebSocket[key] }); } catch {}
|
|
204
|
+
}
|
|
205
|
+
window.WebSocket = PreviewWebSocket;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const nativeOpen = window.open;
|
|
209
|
+
window.open = function (url, ...rest) {
|
|
210
|
+
let next = url;
|
|
211
|
+
try { if (url !== undefined && url !== null) next = proxyUrl(String(url)) ?? url; } catch {}
|
|
212
|
+
return nativeOpen.call(this, next, ...rest);
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
// Real navigations (links the app did not handle itself, plain forms).
|
|
216
|
+
window.addEventListener('click', (event) => {
|
|
217
|
+
if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
|
|
218
|
+
const anchor = event.target instanceof Element ? event.target.closest('a[href]') : null;
|
|
219
|
+
if (!anchor) return;
|
|
220
|
+
let url;
|
|
221
|
+
try { url = new URL(anchor.href, window.location.href); } catch { return; }
|
|
222
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') return;
|
|
223
|
+
const newTab = anchor.target === '_blank';
|
|
224
|
+
const next = proxyUrl(url.toString());
|
|
225
|
+
if (next !== null) {
|
|
226
|
+
if (anchor.hasAttribute('download')) {
|
|
227
|
+
const original = anchor.getAttribute('href');
|
|
228
|
+
anchor.setAttribute('href', next);
|
|
229
|
+
window.setTimeout(() => { if (original !== null) anchor.setAttribute('href', original); }, 0);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
event.preventDefault();
|
|
233
|
+
if (newTab) window.open(next, '_blank');
|
|
234
|
+
else window.location.assign(next);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const page = window.location;
|
|
238
|
+
const samePage = url.protocol === page.protocol && url.host.toLowerCase() === page.host.toLowerCase();
|
|
239
|
+
if (samePage || !isServerReachableHost(url.hostname)) return;
|
|
240
|
+
event.preventDefault();
|
|
241
|
+
post({ type: 'navigate-target', href: url.toString(), newTab });
|
|
242
|
+
});
|
|
243
|
+
window.addEventListener('submit', (event) => {
|
|
244
|
+
if (event.defaultPrevented) return;
|
|
245
|
+
const form = event.target;
|
|
246
|
+
if (!(form instanceof HTMLFormElement)) return;
|
|
247
|
+
const submitter = event.submitter;
|
|
248
|
+
const action = submitter && submitter.hasAttribute('formaction') ? submitter.formAction : form.action;
|
|
249
|
+
let next = null;
|
|
250
|
+
try { next = proxyUrl(action); } catch {}
|
|
251
|
+
if (next === null) return;
|
|
252
|
+
if (submitter && submitter.hasAttribute('formaction')) submitter.formAction = next;
|
|
253
|
+
else form.action = next;
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
window.addEventListener('popstate', scheduleLocation);
|
|
257
|
+
window.addEventListener('hashchange', scheduleLocation);
|
|
258
|
+
window.addEventListener('pageshow', scheduleLocation);
|
|
259
|
+
window.addEventListener('message', (event) => {
|
|
260
|
+
if (!embedded || event.source !== window.parent) return;
|
|
261
|
+
const message = event.data;
|
|
262
|
+
if (!message || message.source !== config.hostSource) return;
|
|
263
|
+
if (message.action === 'back') window.history.back();
|
|
264
|
+
else if (message.action === 'forward') window.history.forward();
|
|
265
|
+
else if (message.action === 'stop') window.stop();
|
|
266
|
+
else if (message.action === 'reload') {
|
|
267
|
+
if (virtual) {
|
|
268
|
+
const location = window.location;
|
|
269
|
+
window.location.replace(prefix + location.pathname + location.search + location.hash);
|
|
270
|
+
} else {
|
|
271
|
+
window.location.reload();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
if (config.serviceWorker && navigator.serviceWorker && navigator.serviceWorker.controller) {
|
|
277
|
+
try {
|
|
278
|
+
navigator.serviceWorker.controller.postMessage({
|
|
279
|
+
type: config.targetMessage,
|
|
280
|
+
target: { origin: config.targetOrigin, basePath: basePath },
|
|
281
|
+
});
|
|
282
|
+
} catch {}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Same-origin previews share Agent Tower's storage; keep each workspace in
|
|
286
|
+
// its own namespace so a preview cannot clobber the host application.
|
|
287
|
+
if (config.mode === 'prefix') {
|
|
288
|
+
const namespace = '__agent_tower_preview:' + config.workspaceId + ':';
|
|
289
|
+
const wrapStorage = (storage) => {
|
|
290
|
+
const keys = () => {
|
|
291
|
+
const out = [];
|
|
292
|
+
for (let index = 0; index < storage.length; index += 1) {
|
|
293
|
+
const key = storage.key(index);
|
|
294
|
+
if (key !== null && key.startsWith(namespace)) out.push(key.slice(namespace.length));
|
|
295
|
+
}
|
|
296
|
+
return out;
|
|
297
|
+
};
|
|
298
|
+
const api = {
|
|
299
|
+
getItem: (key) => storage.getItem(namespace + String(key)),
|
|
300
|
+
setItem: (key, value) => storage.setItem(namespace + String(key), String(value)),
|
|
301
|
+
removeItem: (key) => storage.removeItem(namespace + String(key)),
|
|
302
|
+
clear: () => { for (const key of keys()) storage.removeItem(namespace + key); },
|
|
303
|
+
key: (index) => keys()[index] ?? null,
|
|
304
|
+
get length() { return keys().length; },
|
|
305
|
+
};
|
|
306
|
+
return new Proxy(api, {
|
|
307
|
+
get(base, property) {
|
|
308
|
+
if (property in base) {
|
|
309
|
+
const value = base[property];
|
|
310
|
+
return typeof value === 'function' ? value.bind(base) : value;
|
|
311
|
+
}
|
|
312
|
+
if (typeof property !== 'string') return undefined;
|
|
313
|
+
const stored = storage.getItem(namespace + property);
|
|
314
|
+
return stored === null ? undefined : stored;
|
|
315
|
+
},
|
|
316
|
+
set(base, property, value) {
|
|
317
|
+
storage.setItem(namespace + String(property), String(value));
|
|
318
|
+
return true;
|
|
319
|
+
},
|
|
320
|
+
deleteProperty(base, property) {
|
|
321
|
+
storage.removeItem(namespace + String(property));
|
|
322
|
+
return true;
|
|
323
|
+
},
|
|
324
|
+
has(base, property) {
|
|
325
|
+
return property in base || storage.getItem(namespace + String(property)) !== null;
|
|
326
|
+
},
|
|
327
|
+
ownKeys() { return keys(); },
|
|
328
|
+
getOwnPropertyDescriptor(base, property) {
|
|
329
|
+
const stored = storage.getItem(namespace + String(property));
|
|
330
|
+
if (stored === null) return undefined;
|
|
331
|
+
return { value: stored, enumerable: true, configurable: true, writable: true };
|
|
332
|
+
},
|
|
333
|
+
});
|
|
334
|
+
};
|
|
335
|
+
for (const name of ['localStorage', 'sessionStorage']) {
|
|
336
|
+
try {
|
|
337
|
+
const storage = window[name];
|
|
338
|
+
if (!storage) continue;
|
|
339
|
+
const wrapped = wrapStorage(storage);
|
|
340
|
+
Object.defineProperty(window, name, { configurable: true, enumerable: true, get: () => wrapped });
|
|
341
|
+
} catch {}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (config.heartbeatPath) {
|
|
346
|
+
const heartbeat = () => fetch(config.heartbeatPath, { credentials: 'include', cache: 'no-store' }).catch(() => {});
|
|
347
|
+
window.setInterval(heartbeat, 30000);
|
|
348
|
+
heartbeat();
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
sendLocation();
|
|
352
|
+
})();</script>`;
|
|
353
|
+
}
|
|
354
|
+
const HEAD_PATTERN = /<head(?:\s[^>]*)?>/i;
|
|
355
|
+
const BRIDGE_MARKER = 'data-agent-tower-preview-bridge';
|
|
356
|
+
/** Insert the bridge as the very first thing inside `<head>` so it runs before any app script. */
|
|
357
|
+
export function injectPreviewBridge(html, scriptTag) {
|
|
358
|
+
const text = html.toString('latin1');
|
|
359
|
+
if (text.includes(BRIDGE_MARKER))
|
|
360
|
+
return html;
|
|
361
|
+
const match = HEAD_PATTERN.exec(text);
|
|
362
|
+
const script = Buffer.from(scriptTag, 'utf8');
|
|
363
|
+
if (!match)
|
|
364
|
+
return Buffer.concat([script, html]);
|
|
365
|
+
const offset = Buffer.byteLength(text.slice(0, match.index + match[0].length), 'latin1');
|
|
366
|
+
return Buffer.concat([html.subarray(0, offset), script, html.subarray(offset)]);
|
|
367
|
+
}
|
|
368
|
+
export function buildPreviewServiceWorkerScript() {
|
|
369
|
+
const config = {
|
|
370
|
+
swHeader: PREVIEW_SERVICE_WORKER_HEADER,
|
|
371
|
+
destinationHeader: PREVIEW_DESTINATION_HEADER,
|
|
372
|
+
targetHeader: PREVIEW_TARGET_HEADER,
|
|
373
|
+
basePathHeader: PREVIEW_BASE_PATH_HEADER,
|
|
374
|
+
targetMessage: PREVIEW_TARGET_MESSAGE,
|
|
375
|
+
};
|
|
376
|
+
return `(() => {
|
|
377
|
+
const config = ${JSON.stringify(config)};
|
|
378
|
+
const scope = new URL(self.registration.scope);
|
|
379
|
+
const prefixDir = scope.pathname.endsWith('/') ? scope.pathname : scope.pathname + '/';
|
|
380
|
+
const prefix = prefixDir.slice(0, -1);
|
|
381
|
+
const loopbackHosts = new Set(['localhost', '127.0.0.1', '::1', '[::1]', '0.0.0.0']);
|
|
382
|
+
const targets = new Map();
|
|
383
|
+
let lastTarget = null;
|
|
384
|
+
|
|
385
|
+
const parseTarget = (origin, basePath) => {
|
|
386
|
+
try {
|
|
387
|
+
const url = new URL(origin);
|
|
388
|
+
return {
|
|
389
|
+
protocol: url.protocol,
|
|
390
|
+
hostname: url.hostname.toLowerCase(),
|
|
391
|
+
port: url.port || (url.protocol === 'https:' ? '443' : '80'),
|
|
392
|
+
basePath: basePath || '',
|
|
393
|
+
};
|
|
394
|
+
} catch {
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
const rememberTarget = (clientId, target) => {
|
|
399
|
+
if (!target) return;
|
|
400
|
+
lastTarget = target;
|
|
401
|
+
if (clientId) targets.set(clientId, target);
|
|
402
|
+
};
|
|
403
|
+
const normalizeHost = (hostname) => loopbackHosts.has(hostname) ? 'loopback' : hostname;
|
|
404
|
+
const matchesTarget = (url, target) => Boolean(target)
|
|
405
|
+
&& url.protocol === target.protocol
|
|
406
|
+
&& normalizeHost(url.hostname.toLowerCase()) === normalizeHost(target.hostname)
|
|
407
|
+
&& (url.port || (url.protocol === 'https:' ? '443' : '80')) === target.port;
|
|
408
|
+
const stripBasePath = (pathname, basePath) => basePath && (pathname === basePath || pathname.startsWith(basePath + '/'))
|
|
409
|
+
? (pathname.slice(basePath.length) || '/')
|
|
410
|
+
: pathname;
|
|
411
|
+
const isPrefixed = (pathname) => pathname === prefix || pathname.startsWith(prefixDir);
|
|
412
|
+
|
|
413
|
+
const resolve = (url, clientId) => {
|
|
414
|
+
if (url.origin === scope.origin) {
|
|
415
|
+
if (isPrefixed(url.pathname)) return url.href;
|
|
416
|
+
return scope.origin + prefix + url.pathname + url.search;
|
|
417
|
+
}
|
|
418
|
+
const target = targets.get(clientId) || lastTarget;
|
|
419
|
+
if (matchesTarget(url, target)) {
|
|
420
|
+
return scope.origin + prefix + stripBasePath(url.pathname, target.basePath) + url.search;
|
|
421
|
+
}
|
|
422
|
+
return null;
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const forward = async (request, nextUrl, navigate, clientId) => {
|
|
426
|
+
const headers = new Headers(request.headers);
|
|
427
|
+
headers.set(config.swHeader, navigate ? 'navigate' : 'subresource');
|
|
428
|
+
headers.set(config.destinationHeader, request.destination || (navigate ? 'document' : 'empty'));
|
|
429
|
+
const init = {
|
|
430
|
+
method: request.method,
|
|
431
|
+
headers,
|
|
432
|
+
mode: 'same-origin',
|
|
433
|
+
credentials: 'include',
|
|
434
|
+
cache: request.cache === 'only-if-cached' ? 'default' : request.cache,
|
|
435
|
+
redirect: navigate ? 'manual' : request.redirect,
|
|
436
|
+
referrer: request.referrer,
|
|
437
|
+
referrerPolicy: request.referrerPolicy,
|
|
438
|
+
integrity: request.integrity,
|
|
439
|
+
signal: request.signal,
|
|
440
|
+
};
|
|
441
|
+
// Browsers only stream upload bodies over HTTP/2+, so buffer them: Agent
|
|
442
|
+
// Tower itself is reached over HTTP/1.1 (local port, tunnel, reverse proxy).
|
|
443
|
+
const outgoing = request.method === 'GET' || request.method === 'HEAD' || request.body === null
|
|
444
|
+
? new Request(nextUrl, init)
|
|
445
|
+
: new Request(nextUrl, { ...init, body: await request.arrayBuffer() });
|
|
446
|
+
const response = await fetch(outgoing);
|
|
447
|
+
if (navigate) {
|
|
448
|
+
const origin = response.headers.get(config.targetHeader);
|
|
449
|
+
if (origin) rememberTarget(clientId, parseTarget(origin, response.headers.get(config.basePathHeader) || ''));
|
|
450
|
+
return response;
|
|
451
|
+
}
|
|
452
|
+
// Hand back a synthetic response so the browser attributes it to the URL the
|
|
453
|
+
// page asked for: module scripts then see a virtual import.meta.url instead
|
|
454
|
+
// of the proxy prefix, matching the virtualized document address.
|
|
455
|
+
if (response.type !== 'basic' && response.type !== 'default' && response.type !== 'cors') return response;
|
|
456
|
+
if (response.status === 0) return response;
|
|
457
|
+
const nullBody = response.status === 204 || response.status === 205 || response.status === 304 || request.method === 'HEAD';
|
|
458
|
+
try {
|
|
459
|
+
return new Response(nullBody ? null : response.body, {
|
|
460
|
+
status: response.status,
|
|
461
|
+
statusText: response.statusText,
|
|
462
|
+
headers: response.headers,
|
|
463
|
+
});
|
|
464
|
+
} catch {
|
|
465
|
+
return response;
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
self.addEventListener('install', () => self.skipWaiting());
|
|
470
|
+
self.addEventListener('activate', (event) => event.waitUntil(self.clients.claim()));
|
|
471
|
+
self.addEventListener('message', (event) => {
|
|
472
|
+
const data = event.data;
|
|
473
|
+
if (!data || data.type !== config.targetMessage || !data.target) return;
|
|
474
|
+
rememberTarget(event.source && event.source.id, parseTarget(data.target.origin, data.target.basePath));
|
|
475
|
+
});
|
|
476
|
+
self.addEventListener('fetch', (event) => {
|
|
477
|
+
const request = event.request;
|
|
478
|
+
let url;
|
|
479
|
+
try { url = new URL(request.url); } catch { return; }
|
|
480
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') return;
|
|
481
|
+
const navigate = request.mode === 'navigate';
|
|
482
|
+
const clientId = (navigate ? event.resultingClientId : event.clientId) || '';
|
|
483
|
+
const nextUrl = resolve(url, clientId);
|
|
484
|
+
if (nextUrl === null) return;
|
|
485
|
+
event.respondWith(forward(request, nextUrl, navigate, clientId));
|
|
486
|
+
});
|
|
487
|
+
})();`;
|
|
488
|
+
}
|
|
489
|
+
export function buildPreviewBootstrapPage(options) {
|
|
490
|
+
const config = {
|
|
491
|
+
scope: options.scope,
|
|
492
|
+
workerUrl: `${options.scope}${PREVIEW_SERVICE_WORKER_SEGMENT}`,
|
|
493
|
+
bootParam: PREVIEW_BOOT_PARAM,
|
|
494
|
+
modeParam: PREVIEW_MODE_PARAM,
|
|
495
|
+
};
|
|
496
|
+
return `<!doctype html>
|
|
497
|
+
<html lang="en">
|
|
498
|
+
<head>
|
|
499
|
+
<meta charset="utf-8">
|
|
500
|
+
<meta name="robots" content="noindex">
|
|
501
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
502
|
+
<title>Agent Tower Preview</title>
|
|
503
|
+
<style>
|
|
504
|
+
html, body { height: 100%; margin: 0; }
|
|
505
|
+
body { display: flex; align-items: center; justify-content: center; font: 14px system-ui, sans-serif; color: #6b7280; background: #fff; }
|
|
506
|
+
</style>
|
|
507
|
+
</head>
|
|
508
|
+
<body>
|
|
509
|
+
<div>Loading preview…</div>
|
|
510
|
+
<script>(async () => {
|
|
511
|
+
const config = ${JSON.stringify(config)};
|
|
512
|
+
const url = new URL(window.location.href);
|
|
513
|
+
const plain = () => {
|
|
514
|
+
url.searchParams.set(config.modeParam, 'plain');
|
|
515
|
+
window.location.replace(url.toString());
|
|
516
|
+
};
|
|
517
|
+
if (!('serviceWorker' in navigator) || !window.isSecureContext) return plain();
|
|
518
|
+
try {
|
|
519
|
+
const timeout = new Promise((_resolve, reject) => setTimeout(() => reject(new Error('timeout')), 8000));
|
|
520
|
+
await Promise.race([
|
|
521
|
+
(async () => {
|
|
522
|
+
await navigator.serviceWorker.register(config.workerUrl, { scope: config.scope });
|
|
523
|
+
await navigator.serviceWorker.ready;
|
|
524
|
+
})(),
|
|
525
|
+
timeout,
|
|
526
|
+
]);
|
|
527
|
+
url.searchParams.set(config.bootParam, '1');
|
|
528
|
+
window.location.replace(url.toString());
|
|
529
|
+
} catch (error) {
|
|
530
|
+
console.warn('[agent-tower preview] service worker unavailable, using plain proxy mode', error);
|
|
531
|
+
plain();
|
|
532
|
+
}
|
|
533
|
+
})();</script>
|
|
534
|
+
</body>
|
|
535
|
+
</html>`;
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=preview-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-bridge.js","sourceRoot":"","sources":["../../src/services/preview-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { NormalizedPreviewTarget } from './preview.service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cookie that remembers which workspace preview an embedded document belongs to.
|
|
4
|
+
* It lets the server route navigations that escaped the `/view/:workspaceId/`
|
|
5
|
+
* prefix (for example `location.reload()` from a virtualized SPA) back into
|
|
6
|
+
* the workspace proxy.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PREVIEW_CONTEXT_COOKIE_NAME = "agent-tower-preview-context";
|
|
9
|
+
export declare function previewCookieScopeName(workspaceId: string): string;
|
|
10
|
+
export declare function isInternalCookieName(name: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Build the Cookie header forwarded to the preview target: Agent Tower's own
|
|
13
|
+
* cookies never leave the server, the gateway/scope cookie is dropped, and
|
|
14
|
+
* target cookies that had to be renamed to avoid clashing with Agent Tower's
|
|
15
|
+
* cookies are restored to their original names.
|
|
16
|
+
*/
|
|
17
|
+
export declare function filterTargetCookieHeader(cookieHeader: string | undefined, scopeName: string): string | undefined;
|
|
18
|
+
export interface RewriteTargetCookieOptions {
|
|
19
|
+
/** Force `Path=/` so the cookie follows the app through any proxy prefix. */
|
|
20
|
+
forceRootPath?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Rewrite a Set-Cookie header coming from the preview target so the browser
|
|
24
|
+
* stores it against the preview entry (gateway origin or Agent Tower origin).
|
|
25
|
+
*/
|
|
26
|
+
export declare function rewriteTargetCookie(value: string, target: NormalizedPreviewTarget, scopeName: string, secureEntry: boolean, options?: RewriteTargetCookieOptions): string;
|
|
27
|
+
export declare function parseCookieHeader(header?: string): Map<string, string>;
|
|
28
|
+
//# sourceMappingURL=preview-cookies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-cookies.d.ts","sourceRoot":"","sources":["../../src/services/preview-cookies.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAIpE;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AAEzE,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGlE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI1D;AAkBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAoBpB;AAED,MAAM,WAAW,0BAA0B;IACzC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,uBAAuB,EAC/B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,EACpB,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAgDR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CActE"}
|