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,319 @@
|
|
|
1
|
+
import { ServiceError } from '../errors.js';
|
|
2
|
+
import { prisma } from '../utils/index.js';
|
|
3
|
+
import { writeErrorLog } from '../utils/error-log.js';
|
|
4
|
+
export const MIN_WAKEUP_DELAY_SECONDS = 30;
|
|
5
|
+
export const MAX_WAKEUP_DELAY_SECONDS = 24 * 60 * 60;
|
|
6
|
+
export const MAX_PENDING_WAKEUPS_PER_SESSION = 8;
|
|
7
|
+
export const DEFAULT_MAX_WAKEUPS_PER_SESSION_PER_DAY = 24;
|
|
8
|
+
export const MAX_WAKEUPS_PER_DAY_ENV = 'AGENT_TOWER_MAX_WAKEUPS_PER_DAY';
|
|
9
|
+
const DEFAULT_POLL_INTERVAL_MS = 5_000;
|
|
10
|
+
const READY_BATCH = 50;
|
|
11
|
+
const LOG_TAIL_LINES = 40;
|
|
12
|
+
const ACTIVE_STATES = ['PENDING', 'READY'];
|
|
13
|
+
export function resolveMaxWakeupsPerSessionPerDay(env = process.env) {
|
|
14
|
+
const raw = env[MAX_WAKEUPS_PER_DAY_ENV]?.trim();
|
|
15
|
+
if (!raw)
|
|
16
|
+
return DEFAULT_MAX_WAKEUPS_PER_SESSION_PER_DAY;
|
|
17
|
+
const value = Number(raw);
|
|
18
|
+
return Number.isFinite(value) && value >= 0 ? Math.floor(value) : DEFAULT_MAX_WAKEUPS_PER_SESSION_PER_DAY;
|
|
19
|
+
}
|
|
20
|
+
function toDto(row) {
|
|
21
|
+
return {
|
|
22
|
+
id: row.id,
|
|
23
|
+
sessionId: row.sessionId,
|
|
24
|
+
kind: row.kind,
|
|
25
|
+
reason: row.reason,
|
|
26
|
+
serviceName: row.serviceName,
|
|
27
|
+
fireAt: row.fireAt?.toISOString() ?? null,
|
|
28
|
+
state: row.state,
|
|
29
|
+
lastError: row.lastError,
|
|
30
|
+
createdAt: row.createdAt.toISOString(),
|
|
31
|
+
firedAt: row.firedAt?.toISOString() ?? null,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function escapeAttribute(value) {
|
|
35
|
+
return value.replace(/[&"<>]/g, (char) => ({ '&': '&', '"': '"', '<': '<', '>': '>' }[char] ?? char));
|
|
36
|
+
}
|
|
37
|
+
const NOTIFICATION_HEADER = [
|
|
38
|
+
'[SYSTEM NOTIFICATION - NOT USER INPUT]',
|
|
39
|
+
'This is an automated Agent Tower wake-up, not a message from the user. It is not approval, consent, or an answer to any pending question.',
|
|
40
|
+
'Continue the work you planned around this event. If nothing is needed, say so briefly and finish your turn.',
|
|
41
|
+
].join('\n');
|
|
42
|
+
export function buildWakeupMessage(row) {
|
|
43
|
+
if (row.kind === 'SERVICE_EXIT') {
|
|
44
|
+
let payload = {};
|
|
45
|
+
try {
|
|
46
|
+
payload = JSON.parse(row.payload);
|
|
47
|
+
}
|
|
48
|
+
catch { /* empty payload */ }
|
|
49
|
+
const name = row.serviceName ?? 'unknown';
|
|
50
|
+
const exitCode = payload.exitCode ?? null;
|
|
51
|
+
const state = payload.runtimeState ?? (payload.stopped ? 'STOPPED' : 'EXITED');
|
|
52
|
+
const lines = [
|
|
53
|
+
`<agent_tower_wakeup kind="service_exit" service="${escapeAttribute(name)}" exit_code="${exitCode ?? 'unknown'}" runtime_state="${escapeAttribute(state)}">`,
|
|
54
|
+
payload.stopped
|
|
55
|
+
? `Workspace service "${name}" was stopped before it finished.`
|
|
56
|
+
: `Workspace service "${name}" exited with code ${exitCode ?? 'unknown'}.`,
|
|
57
|
+
];
|
|
58
|
+
if (row.reason)
|
|
59
|
+
lines.push(`Reason you gave for waiting: ${row.reason}`);
|
|
60
|
+
const tail = (payload.logTail ?? []).filter((line) => line.length > 0).slice(-LOG_TAIL_LINES);
|
|
61
|
+
if (tail.length > 0) {
|
|
62
|
+
lines.push('Last log lines:');
|
|
63
|
+
lines.push(...tail);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
lines.push('No log output was captured for this service.');
|
|
67
|
+
}
|
|
68
|
+
lines.push('</agent_tower_wakeup>');
|
|
69
|
+
return `${NOTIFICATION_HEADER}\n\n${lines.join('\n')}`;
|
|
70
|
+
}
|
|
71
|
+
const scheduledAt = row.createdAt.toISOString();
|
|
72
|
+
const delaySeconds = row.fireAt ? Math.max(0, Math.round((row.fireAt.getTime() - row.createdAt.getTime()) / 1000)) : 0;
|
|
73
|
+
return [
|
|
74
|
+
NOTIFICATION_HEADER,
|
|
75
|
+
'',
|
|
76
|
+
`<agent_tower_wakeup kind="timer" scheduled_at="${scheduledAt}" delay_seconds="${delaySeconds}">`,
|
|
77
|
+
'The wake-up you scheduled has fired.',
|
|
78
|
+
`Reason: ${row.reason || '(none given)'}`,
|
|
79
|
+
'</agent_tower_wakeup>',
|
|
80
|
+
].join('\n');
|
|
81
|
+
}
|
|
82
|
+
export class SessionWakeupService {
|
|
83
|
+
options;
|
|
84
|
+
timer;
|
|
85
|
+
pumping;
|
|
86
|
+
pumpAgain = false;
|
|
87
|
+
closed = false;
|
|
88
|
+
unsubscribe = [];
|
|
89
|
+
maxPerSessionPerDay;
|
|
90
|
+
now;
|
|
91
|
+
constructor(options) {
|
|
92
|
+
this.options = options;
|
|
93
|
+
this.maxPerSessionPerDay = options.maxPerSessionPerDay ?? resolveMaxWakeupsPerSessionPerDay();
|
|
94
|
+
this.now = options.now ?? (() => new Date());
|
|
95
|
+
}
|
|
96
|
+
start() {
|
|
97
|
+
if (this.timer || this.closed)
|
|
98
|
+
return;
|
|
99
|
+
const interval = this.options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
100
|
+
this.timer = setInterval(() => { void this.pump(); }, interval);
|
|
101
|
+
this.timer.unref?.();
|
|
102
|
+
const bus = this.options.eventBus;
|
|
103
|
+
const onCompleted = () => { void this.pump(); };
|
|
104
|
+
const onStopped = ({ sessionId }) => {
|
|
105
|
+
void this.cancelForSession(sessionId, 'SESSION_STOPPED').catch((error) => this.log('cancel after stop failed', error, { sessionId }));
|
|
106
|
+
};
|
|
107
|
+
bus.on('session:completed', onCompleted);
|
|
108
|
+
bus.on('session:stopped', onStopped);
|
|
109
|
+
this.unsubscribe.push(() => bus.off('session:completed', onCompleted), () => bus.off('session:stopped', onStopped));
|
|
110
|
+
void this.pump();
|
|
111
|
+
}
|
|
112
|
+
stop() {
|
|
113
|
+
this.closed = true;
|
|
114
|
+
if (this.timer)
|
|
115
|
+
clearInterval(this.timer);
|
|
116
|
+
this.timer = undefined;
|
|
117
|
+
for (const off of this.unsubscribe.splice(0))
|
|
118
|
+
off();
|
|
119
|
+
}
|
|
120
|
+
async scheduleTimer(input) {
|
|
121
|
+
const delaySeconds = Math.floor(input.delaySeconds);
|
|
122
|
+
if (!Number.isFinite(delaySeconds) || delaySeconds < MIN_WAKEUP_DELAY_SECONDS || delaySeconds > MAX_WAKEUP_DELAY_SECONDS) {
|
|
123
|
+
throw new ServiceError(`delaySeconds must be between ${MIN_WAKEUP_DELAY_SECONDS} and ${MAX_WAKEUP_DELAY_SECONDS}`, 'VALIDATION_ERROR', 400);
|
|
124
|
+
}
|
|
125
|
+
const reason = input.reason.trim().slice(0, 500);
|
|
126
|
+
if (!reason)
|
|
127
|
+
throw new ServiceError('A reason is required for a wake-up', 'VALIDATION_ERROR', 400);
|
|
128
|
+
await this.assertSession(input.sessionId);
|
|
129
|
+
await this.assertCapacity(input.sessionId);
|
|
130
|
+
const row = await prisma.sessionWakeup.create({
|
|
131
|
+
data: {
|
|
132
|
+
sessionId: input.sessionId,
|
|
133
|
+
kind: 'TIMER',
|
|
134
|
+
reason,
|
|
135
|
+
fireAt: new Date(this.now().getTime() + delaySeconds * 1000),
|
|
136
|
+
state: 'PENDING',
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
return toDto(row);
|
|
140
|
+
}
|
|
141
|
+
async waitForService(input) {
|
|
142
|
+
const session = await this.assertSession(input.sessionId);
|
|
143
|
+
if (session.workspaceId !== input.workspaceId) {
|
|
144
|
+
throw new ServiceError('Agent session is not bound to this workspace', 'INTERNAL_SESSION_WORKSPACE_MISMATCH', 403);
|
|
145
|
+
}
|
|
146
|
+
const service = await this.options.services.findService(input.workspaceId, input.serviceName);
|
|
147
|
+
if (!service)
|
|
148
|
+
throw new ServiceError('Workspace service not found', 'NOT_FOUND', 404);
|
|
149
|
+
const existing = await prisma.sessionWakeup.findFirst({
|
|
150
|
+
where: { sessionId: input.sessionId, serviceId: service.id, kind: 'SERVICE_EXIT', state: { in: ACTIVE_STATES } },
|
|
151
|
+
orderBy: { createdAt: 'desc' },
|
|
152
|
+
});
|
|
153
|
+
if (existing)
|
|
154
|
+
return toDto(existing);
|
|
155
|
+
await this.assertCapacity(input.sessionId);
|
|
156
|
+
const reason = (input.reason ?? '').trim().slice(0, 500);
|
|
157
|
+
const alreadyExited = service.runtimeInstanceId === null && ['EXITED', 'FAILED', 'STOPPED'].includes(service.runtimeState);
|
|
158
|
+
let payload;
|
|
159
|
+
if (alreadyExited) {
|
|
160
|
+
let logTail = [];
|
|
161
|
+
try {
|
|
162
|
+
logTail = await this.options.services.readLogTail(input.workspaceId, input.serviceName, LOG_TAIL_LINES);
|
|
163
|
+
}
|
|
164
|
+
catch { /* optional */ }
|
|
165
|
+
payload = { exitCode: service.exitCode, runtimeState: service.runtimeState, stopped: service.runtimeState === 'STOPPED', logTail, workspaceId: input.workspaceId };
|
|
166
|
+
}
|
|
167
|
+
const row = await prisma.sessionWakeup.create({
|
|
168
|
+
data: {
|
|
169
|
+
sessionId: input.sessionId,
|
|
170
|
+
kind: 'SERVICE_EXIT',
|
|
171
|
+
reason,
|
|
172
|
+
serviceId: service.id,
|
|
173
|
+
serviceName: service.name,
|
|
174
|
+
state: alreadyExited ? 'READY' : 'PENDING',
|
|
175
|
+
payload: JSON.stringify(payload ?? { workspaceId: input.workspaceId }),
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
if (alreadyExited)
|
|
179
|
+
void this.pump();
|
|
180
|
+
return toDto(row);
|
|
181
|
+
}
|
|
182
|
+
async listForSession(sessionId) {
|
|
183
|
+
const rows = await prisma.sessionWakeup.findMany({ where: { sessionId }, orderBy: { createdAt: 'desc' }, take: 100 });
|
|
184
|
+
return rows.map(toDto);
|
|
185
|
+
}
|
|
186
|
+
async cancelForSession(sessionId, reason) {
|
|
187
|
+
const result = await prisma.sessionWakeup.updateMany({
|
|
188
|
+
where: { sessionId, state: { in: ACTIVE_STATES } },
|
|
189
|
+
data: { state: 'CANCELLED', lastError: reason },
|
|
190
|
+
});
|
|
191
|
+
return result.count;
|
|
192
|
+
}
|
|
193
|
+
/** A workspace service exit was persisted; release the wake-ups waiting for it. */
|
|
194
|
+
async handleServiceExit(event) {
|
|
195
|
+
const payload = {
|
|
196
|
+
exitCode: event.exitCode,
|
|
197
|
+
runtimeState: event.runtimeState,
|
|
198
|
+
stopped: event.stopped,
|
|
199
|
+
logTail: event.logTail.slice(-LOG_TAIL_LINES),
|
|
200
|
+
workspaceId: event.workspaceId,
|
|
201
|
+
};
|
|
202
|
+
const updated = await prisma.sessionWakeup.updateMany({
|
|
203
|
+
where: { serviceId: event.serviceId, kind: 'SERVICE_EXIT', state: 'PENDING' },
|
|
204
|
+
data: { state: 'READY', payload: JSON.stringify(payload) },
|
|
205
|
+
});
|
|
206
|
+
if (updated.count > 0)
|
|
207
|
+
void this.pump();
|
|
208
|
+
}
|
|
209
|
+
/** Promote due timers and deliver every READY wake-up whose session can accept it. */
|
|
210
|
+
async pump() {
|
|
211
|
+
if (this.closed)
|
|
212
|
+
return;
|
|
213
|
+
if (this.pumping) {
|
|
214
|
+
this.pumpAgain = true;
|
|
215
|
+
return this.pumping;
|
|
216
|
+
}
|
|
217
|
+
this.pumping = this.runPump().catch((error) => this.log('pump failed', error)).finally(() => {
|
|
218
|
+
this.pumping = undefined;
|
|
219
|
+
if (this.pumpAgain) {
|
|
220
|
+
this.pumpAgain = false;
|
|
221
|
+
void this.pump();
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
return this.pumping;
|
|
225
|
+
}
|
|
226
|
+
async runPump() {
|
|
227
|
+
await prisma.sessionWakeup.updateMany({
|
|
228
|
+
where: { state: 'PENDING', kind: 'TIMER', fireAt: { lte: this.now() } },
|
|
229
|
+
data: { state: 'READY' },
|
|
230
|
+
});
|
|
231
|
+
const ready = await prisma.sessionWakeup.findMany({ where: { state: 'READY' }, orderBy: { createdAt: 'asc' }, take: READY_BATCH });
|
|
232
|
+
const blockedSessions = new Set();
|
|
233
|
+
for (const row of ready) {
|
|
234
|
+
if (this.closed)
|
|
235
|
+
return;
|
|
236
|
+
if (blockedSessions.has(row.sessionId))
|
|
237
|
+
continue;
|
|
238
|
+
const delivered = await this.deliver(row);
|
|
239
|
+
if (!delivered)
|
|
240
|
+
blockedSessions.add(row.sessionId);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async deliver(row) {
|
|
244
|
+
const session = await prisma.session.findUnique({
|
|
245
|
+
where: { id: row.sessionId },
|
|
246
|
+
select: {
|
|
247
|
+
status: true,
|
|
248
|
+
conversationId: true,
|
|
249
|
+
workspace: { select: { task: { select: { deletedAt: true } } } },
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
if (!session || session.conversationId || session.workspace?.task?.deletedAt) {
|
|
253
|
+
await this.cancel(row.id, 'SESSION_UNAVAILABLE');
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
if (session.status === 'CANCELLED') {
|
|
257
|
+
// The user stopped this session; an automatic wake-up must not restart it.
|
|
258
|
+
await this.cancel(row.id, 'SESSION_STOPPED');
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
if (this.options.sessions.hasActiveTurn(row.sessionId))
|
|
262
|
+
return false;
|
|
263
|
+
if (await this.firedInLastDay(row.sessionId) >= this.maxPerSessionPerDay) {
|
|
264
|
+
await this.cancel(row.id, 'CAP_EXCEEDED');
|
|
265
|
+
this.log('wake-up cap exceeded', undefined, { sessionId: row.sessionId, wakeupId: row.id });
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
const result = await this.options.delivery.submitSession({
|
|
270
|
+
sessionId: row.sessionId,
|
|
271
|
+
message: buildWakeupMessage(row),
|
|
272
|
+
systemEvent: true,
|
|
273
|
+
clientSubmissionId: `wakeup:${row.id}`,
|
|
274
|
+
});
|
|
275
|
+
await prisma.sessionWakeup.updateMany({
|
|
276
|
+
where: { id: row.id, state: 'READY' },
|
|
277
|
+
data: { state: 'FIRED', firedAt: this.now(), deliveryId: result.operationId, lastError: null },
|
|
278
|
+
});
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
if (error instanceof ServiceError && error.code === 'DELIVERY_QUEUE_FULL')
|
|
283
|
+
return false;
|
|
284
|
+
await this.cancel(row.id, error instanceof ServiceError ? error.code : 'DELIVERY_FAILED');
|
|
285
|
+
this.log('wake-up delivery failed', error, { sessionId: row.sessionId, wakeupId: row.id });
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async cancel(id, reason) {
|
|
290
|
+
await prisma.sessionWakeup.updateMany({ where: { id, state: { in: ACTIVE_STATES } }, data: { state: 'CANCELLED', lastError: reason } });
|
|
291
|
+
}
|
|
292
|
+
async assertSession(sessionId) {
|
|
293
|
+
const session = await prisma.session.findUnique({ where: { id: sessionId }, select: { id: true, workspaceId: true, conversationId: true } });
|
|
294
|
+
if (!session)
|
|
295
|
+
throw new ServiceError('Session not found', 'NOT_FOUND', 404);
|
|
296
|
+
if (session.conversationId || !session.workspaceId) {
|
|
297
|
+
throw new ServiceError('Wake-ups are available for workspace sessions only', 'WAKEUP_UNAVAILABLE', 409);
|
|
298
|
+
}
|
|
299
|
+
return session;
|
|
300
|
+
}
|
|
301
|
+
async assertCapacity(sessionId) {
|
|
302
|
+
const pending = await prisma.sessionWakeup.count({ where: { sessionId, state: { in: ACTIVE_STATES } } });
|
|
303
|
+
if (pending >= MAX_PENDING_WAKEUPS_PER_SESSION) {
|
|
304
|
+
throw new ServiceError(`At most ${MAX_PENDING_WAKEUPS_PER_SESSION} wake-ups can be pending for a session`, 'WAKEUP_LIMIT', 429);
|
|
305
|
+
}
|
|
306
|
+
if (await this.firedInLastDay(sessionId) >= this.maxPerSessionPerDay) {
|
|
307
|
+
throw new ServiceError(`This session already used its ${this.maxPerSessionPerDay} automatic wake-ups for today`, 'WAKEUP_CAP_EXCEEDED', 429);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
firedInLastDay(sessionId) {
|
|
311
|
+
return prisma.sessionWakeup.count({
|
|
312
|
+
where: { sessionId, state: 'FIRED', firedAt: { gte: new Date(this.now().getTime() - 24 * 60 * 60_000) } },
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
log(message, error, metadata) {
|
|
316
|
+
writeErrorLog({ level: 'warn', source: 'sessionWakeup', message: `[SessionWakeupService] ${message}`, error, metadata });
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=session-wakeup.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-wakeup.service.js","sourceRoot":"","sources":["../../src/services/session-wakeup.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,9 +10,10 @@ export type TaskHandoffCaller = {
|
|
|
10
10
|
export declare class TaskHandoffService {
|
|
11
11
|
private readonly eventBus;
|
|
12
12
|
constructor(eventBus: EventBus);
|
|
13
|
-
|
|
13
|
+
/** Reads are open to every authenticated caller; managed Agents may only edit their own task's note. */
|
|
14
|
+
private authorizeWrite;
|
|
14
15
|
private requireTask;
|
|
15
|
-
get(taskId: string
|
|
16
|
+
get(taskId: string): Promise<TaskHandoff>;
|
|
16
17
|
update(taskId: string, input: UpdateTaskHandoffInput, caller: TaskHandoffCaller): Promise<TaskHandoff>;
|
|
17
18
|
}
|
|
18
19
|
//# sourceMappingURL=task-handoff.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-handoff.service.d.ts","sourceRoot":"","sources":["../../src/services/task-handoff.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,WAAW,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKrD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,SAAS,GAAG,UAAU,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEtE,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"task-handoff.service.d.ts","sourceRoot":"","sources":["../../src/services/task-handoff.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,WAAW,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKrD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,SAAS,GAAG,UAAU,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEtE,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAE/C,wGAAwG;YAC1F,cAAc;YAyBd,WAAW;IASnB,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAKzC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;CAoC7G"}
|
|
@@ -7,7 +7,8 @@ export class TaskHandoffService {
|
|
|
7
7
|
constructor(eventBus) {
|
|
8
8
|
this.eventBus = eventBus;
|
|
9
9
|
}
|
|
10
|
-
|
|
10
|
+
/** Reads are open to every authenticated caller; managed Agents may only edit their own task's note. */
|
|
11
|
+
async authorizeWrite(taskId, caller) {
|
|
11
12
|
if (caller.kind !== 'agent')
|
|
12
13
|
return;
|
|
13
14
|
const session = await prisma.session.findUnique({
|
|
@@ -33,8 +34,7 @@ export class TaskHandoffService {
|
|
|
33
34
|
throw new ServiceError('The Agent is not an active member of this task.', 'HANDOFF_ACCESS_DENIED', 403);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
|
-
async requireTask(taskId
|
|
37
|
-
await this.authorize(taskId, caller);
|
|
37
|
+
async requireTask(taskId) {
|
|
38
38
|
const task = await prisma.task.findFirst({
|
|
39
39
|
where: { id: taskId, deletedAt: null },
|
|
40
40
|
select: { id: true, handoff: true, projectId: true, status: true, project: { select: { name: true, archivedAt: true, repoDeletedAt: true } } },
|
|
@@ -43,12 +43,13 @@ export class TaskHandoffService {
|
|
|
43
43
|
throw new NotFoundError('Task', taskId);
|
|
44
44
|
return task;
|
|
45
45
|
}
|
|
46
|
-
async get(taskId
|
|
47
|
-
const task = await this.requireTask(taskId
|
|
46
|
+
async get(taskId) {
|
|
47
|
+
const task = await this.requireTask(taskId);
|
|
48
48
|
return { taskId, content: task.handoff ?? '' };
|
|
49
49
|
}
|
|
50
50
|
async update(taskId, input, caller) {
|
|
51
|
-
|
|
51
|
+
await this.authorizeWrite(taskId, caller);
|
|
52
|
+
const task = await this.requireTask(taskId);
|
|
52
53
|
ensureProjectIsMutable(task.project, 'edit the task handoff');
|
|
53
54
|
const current = task.handoff ?? '';
|
|
54
55
|
const { oldString, newString } = input;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-handoff.service.js","sourceRoot":"","sources":["../../src/services/task-handoff.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAiD,MAAM,qBAAqB,CAAC;AAE7G,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAM7D,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"task-handoff.service.js","sourceRoot":"","sources":["../../src/services/task-handoff.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,8 +115,8 @@ declare const intentSchema: z.ZodObject<{
|
|
|
115
115
|
}>, "many">;
|
|
116
116
|
}, "strict", z.ZodTypeAny, {
|
|
117
117
|
kind: "system" | "chat" | "work_request" | "artifact" | "review" | "decision";
|
|
118
|
-
taskSourceHash: string;
|
|
119
118
|
version: 1;
|
|
119
|
+
taskSourceHash: string;
|
|
120
120
|
mentions: {
|
|
121
121
|
memberId: string;
|
|
122
122
|
label?: string | undefined;
|
|
@@ -148,8 +148,8 @@ declare const intentSchema: z.ZodObject<{
|
|
|
148
148
|
}[];
|
|
149
149
|
}, {
|
|
150
150
|
kind: "system" | "chat" | "work_request" | "artifact" | "review" | "decision";
|
|
151
|
-
taskSourceHash: string;
|
|
152
151
|
version: 1;
|
|
152
|
+
taskSourceHash: string;
|
|
153
153
|
mentions: {
|
|
154
154
|
memberId: string;
|
|
155
155
|
label?: string | undefined;
|
|
@@ -425,11 +425,11 @@ export declare const teamInitialIntentSchema: z.ZodObject<{
|
|
|
425
425
|
mode: "AUTO" | "CONFIRM";
|
|
426
426
|
sourceRevision: number;
|
|
427
427
|
kind: "system" | "chat" | "work_request" | "artifact" | "review" | "decision";
|
|
428
|
+
version: 2;
|
|
428
429
|
taskSourceHash: string;
|
|
429
430
|
originalTitle: string;
|
|
430
431
|
originalDescription: string | null;
|
|
431
432
|
heartbeatTimeoutMinutes: number;
|
|
432
|
-
version: 2;
|
|
433
433
|
mentions: {
|
|
434
434
|
memberId: string;
|
|
435
435
|
label?: string | undefined;
|
|
@@ -490,11 +490,11 @@ export declare const teamInitialIntentSchema: z.ZodObject<{
|
|
|
490
490
|
mode: "AUTO" | "CONFIRM";
|
|
491
491
|
sourceRevision: number;
|
|
492
492
|
kind: "system" | "chat" | "work_request" | "artifact" | "review" | "decision";
|
|
493
|
+
version: 2;
|
|
493
494
|
taskSourceHash: string;
|
|
494
495
|
originalTitle: string;
|
|
495
496
|
originalDescription: string | null;
|
|
496
497
|
heartbeatTimeoutMinutes: number;
|
|
497
|
-
version: 2;
|
|
498
498
|
mentions: {
|
|
499
499
|
memberId: string;
|
|
500
500
|
label?: string | undefined;
|
|
@@ -3,6 +3,7 @@ import type { EventBus } from '../core/event-bus.js';
|
|
|
3
3
|
import { type CommandInvocation } from '../utils/process-launch.js';
|
|
4
4
|
import { type UnixProcessIdentityAdapter } from '../utils/unix-process-identity.js';
|
|
5
5
|
import { type WindowsProcessTreeAdapter } from '../runtime/acp/process-manager.js';
|
|
6
|
+
import { type ProcessScopeRuntime } from '../runtime/process-scope/process-scope.js';
|
|
6
7
|
export interface TerminalManagerOptions {
|
|
7
8
|
spawn?: typeof pty.spawn;
|
|
8
9
|
shell?: CommandInvocation;
|
|
@@ -11,6 +12,12 @@ export interface TerminalManagerOptions {
|
|
|
11
12
|
windowsProcessAdapter?: WindowsProcessTreeAdapter;
|
|
12
13
|
gracefulTimeoutMs?: number;
|
|
13
14
|
forceTimeoutMs?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Process scope backend. `undefined` selects the host default (the
|
|
17
|
+
* `agent-tower-scope` supervisor on Linux when available); `null` forces the
|
|
18
|
+
* compatibility backend that samples the process table.
|
|
19
|
+
*/
|
|
20
|
+
processScope?: ProcessScopeRuntime | null;
|
|
14
21
|
}
|
|
15
22
|
export interface TerminalCreateOptions {
|
|
16
23
|
cwd?: string;
|
|
@@ -40,6 +47,7 @@ export declare class TerminalManager {
|
|
|
40
47
|
private readonly shell;
|
|
41
48
|
private readonly gracefulTimeoutMs;
|
|
42
49
|
private readonly forceTimeoutMs;
|
|
50
|
+
private readonly processScope;
|
|
43
51
|
constructor(eventBus: EventBus, options?: TerminalManagerOptions);
|
|
44
52
|
/**
|
|
45
53
|
* Create a new standalone terminal.
|
|
@@ -62,6 +70,14 @@ export declare class TerminalManager {
|
|
|
62
70
|
destroyAll(): Promise<void>;
|
|
63
71
|
private destroyMany;
|
|
64
72
|
private captureWindowsTree;
|
|
73
|
+
/**
|
|
74
|
+
* The supervisor forwards SIGHUP to every member, escalates to SIGKILL after
|
|
75
|
+
* the grace period on its own, and exits once the scope is empty. Its exit
|
|
76
|
+
* (the PTY exit event) is the only confirmation needed; a supervisor that
|
|
77
|
+
* does not exit in time is asked to escalate, and failure stays retryable.
|
|
78
|
+
*/
|
|
79
|
+
private stopScope;
|
|
80
|
+
private waitForExit;
|
|
65
81
|
private captureTerminalRoot;
|
|
66
82
|
private refreshGroups;
|
|
67
83
|
private refreshGroupsOnce;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-manager.d.ts","sourceRoot":"","sources":["../../src/services/terminal-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAC;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAmH,KAAK,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAErM,OAAO,EAAgE,KAAK,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-manager.d.ts","sourceRoot":"","sources":["../../src/services/terminal-manager.ts"],"names":[],"mappings":"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"}
|