agent-tower 0.6.0-beta.2 → 0.6.0-beta.3
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 +10 -2
- package/dist/app.js.map +1 -1
- package/dist/app.test.js +10 -0
- package/dist/app.test.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 +9 -1
- package/dist/core/container.js.map +1 -1
- package/dist/executors/__tests__/codex.executor.test.js +50 -0
- package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
- package/dist/executors/codex.executor.d.ts +2 -0
- package/dist/executors/codex.executor.d.ts.map +1 -1
- package/dist/executors/codex.executor.js +8 -0
- package/dist/executors/codex.executor.js.map +1 -1
- package/dist/executors/execution-env.d.ts +1 -1
- package/dist/executors/execution-env.d.ts.map +1 -1
- package/dist/executors/execution-env.js +2 -0
- package/dist/executors/execution-env.js.map +1 -1
- package/dist/mcp/http-client.d.ts +24 -0
- package/dist/mcp/http-client.d.ts.map +1 -1
- package/dist/mcp/http-client.js +66 -8
- package/dist/mcp/http-client.js.map +1 -1
- package/dist/mcp/http-client.test.d.ts +2 -0
- package/dist/mcp/http-client.test.d.ts.map +1 -0
- package/dist/mcp/http-client.test.js +67 -0
- package/dist/mcp/http-client.test.js.map +1 -0
- package/dist/mcp/index.js +9 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +7 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/__tests__/workspace-services.test.d.ts +2 -0
- package/dist/mcp/tools/__tests__/workspace-services.test.d.ts.map +1 -0
- package/dist/mcp/tools/__tests__/workspace-services.test.js +84 -0
- package/dist/mcp/tools/__tests__/workspace-services.test.js.map +1 -0
- package/dist/mcp/tools/workspace-services.d.ts +6 -0
- package/dist/mcp/tools/workspace-services.d.ts.map +1 -0
- package/dist/mcp/tools/workspace-services.js +102 -0
- package/dist/mcp/tools/workspace-services.js.map +1 -0
- package/dist/mcp/types.d.ts +55 -2
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js +29 -0
- package/dist/mcp/types.js.map +1 -1
- package/dist/middleware/__tests__/access-auth.test.js +229 -2
- package/dist/middleware/__tests__/access-auth.test.js.map +1 -1
- package/dist/middleware/access-auth.d.ts +7 -0
- package/dist/middleware/access-auth.d.ts.map +1 -1
- package/dist/middleware/access-auth.js +50 -9
- package/dist/middleware/access-auth.js.map +1 -1
- package/dist/prompts/agent-output-intents.d.ts +2 -0
- package/dist/prompts/agent-output-intents.d.ts.map +1 -0
- package/dist/prompts/agent-output-intents.js +11 -0
- package/dist/prompts/agent-output-intents.js.map +1 -0
- package/dist/prompts/agent-output-intents.test.d.ts +2 -0
- package/dist/prompts/agent-output-intents.test.d.ts.map +1 -0
- package/dist/prompts/agent-output-intents.test.js +12 -0
- package/dist/prompts/agent-output-intents.test.js.map +1 -0
- package/dist/prompts/workspace-background-service-policy.d.ts +9 -0
- package/dist/prompts/workspace-background-service-policy.d.ts.map +1 -0
- package/dist/prompts/workspace-background-service-policy.js +17 -0
- package/dist/prompts/workspace-background-service-policy.js.map +1 -0
- package/dist/prompts/workspace-background-service-policy.test.d.ts +2 -0
- package/dist/prompts/workspace-background-service-policy.test.d.ts.map +1 -0
- package/dist/prompts/workspace-background-service-policy.test.js +19 -0
- package/dist/prompts/workspace-background-service-policy.test.js.map +1 -0
- package/dist/routes/__tests__/previews.integration.test.js +1 -0
- package/dist/routes/__tests__/previews.integration.test.js.map +1 -1
- package/dist/routes/__tests__/previews.test.js +6 -1
- package/dist/routes/__tests__/previews.test.js.map +1 -1
- package/dist/routes/__tests__/providers.test.js +1 -0
- package/dist/routes/__tests__/providers.test.js.map +1 -1
- package/dist/routes/__tests__/sessions-visualizations.test.d.ts +2 -0
- package/dist/routes/__tests__/sessions-visualizations.test.d.ts.map +1 -0
- package/dist/routes/__tests__/sessions-visualizations.test.js +89 -0
- package/dist/routes/__tests__/sessions-visualizations.test.js.map +1 -0
- package/dist/routes/__tests__/workspace-services.test.d.ts +2 -0
- package/dist/routes/__tests__/workspace-services.test.d.ts.map +1 -0
- package/dist/routes/__tests__/workspace-services.test.js +148 -0
- package/dist/routes/__tests__/workspace-services.test.js.map +1 -0
- package/dist/routes/access-auth.d.ts.map +1 -1
- package/dist/routes/access-auth.js +24 -11
- package/dist/routes/access-auth.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.map +1 -1
- package/dist/routes/previews.js +4 -6
- package/dist/routes/previews.js.map +1 -1
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +93 -0
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/tasks.d.ts.map +1 -1
- package/dist/routes/tasks.js +2 -2
- package/dist/routes/tasks.js.map +1 -1
- package/dist/routes/workspace-services.d.ts +7 -0
- package/dist/routes/workspace-services.d.ts.map +1 -0
- package/dist/routes/workspace-services.js +129 -0
- package/dist/routes/workspace-services.js.map +1 -0
- package/dist/runtime/__tests__/acp-agent-definitions.test.js +43 -0
- package/dist/runtime/__tests__/acp-agent-definitions.test.js.map +1 -1
- package/dist/runtime/__tests__/acp-driver-lifecycle.test.js +61 -1
- package/dist/runtime/__tests__/acp-driver-lifecycle.test.js.map +1 -1
- package/dist/runtime/__tests__/acp-driver.test.js +2 -0
- package/dist/runtime/__tests__/acp-driver.test.js.map +1 -1
- package/dist/runtime/__tests__/acp-process-manager.test.js +40 -1
- package/dist/runtime/__tests__/acp-process-manager.test.js.map +1 -1
- package/dist/runtime/__tests__/acp-projector.test.js +55 -0
- package/dist/runtime/__tests__/acp-projector.test.js.map +1 -1
- package/dist/runtime/__tests__/runtime-coordinator.test.js +5 -2
- package/dist/runtime/__tests__/runtime-coordinator.test.js.map +1 -1
- package/dist/runtime/acp/acp-driver.js +79 -27
- package/dist/runtime/acp/acp-driver.js.map +1 -1
- package/dist/runtime/acp/agents/codex-frame-normalizer.d.ts +4 -0
- package/dist/runtime/acp/agents/codex-frame-normalizer.d.ts.map +1 -0
- package/dist/runtime/acp/agents/codex-frame-normalizer.js +51 -0
- package/dist/runtime/acp/agents/codex-frame-normalizer.js.map +1 -0
- package/dist/runtime/acp/agents/codex.d.ts.map +1 -1
- package/dist/runtime/acp/agents/codex.js +21 -0
- package/dist/runtime/acp/agents/codex.js.map +1 -1
- package/dist/runtime/acp/agents/types.d.ts +4 -0
- package/dist/runtime/acp/agents/types.d.ts.map +1 -1
- package/dist/runtime/acp/codex-provider-config.d.ts +1 -0
- package/dist/runtime/acp/codex-provider-config.d.ts.map +1 -1
- package/dist/runtime/acp/codex-provider-config.js +4 -0
- package/dist/runtime/acp/codex-provider-config.js.map +1 -1
- package/dist/runtime/acp/process-manager.d.ts +3 -0
- package/dist/runtime/acp/process-manager.d.ts.map +1 -1
- package/dist/runtime/acp/process-manager.js +31 -12
- package/dist/runtime/acp/process-manager.js.map +1 -1
- package/dist/runtime/acp/projector.d.ts.map +1 -1
- package/dist/runtime/acp/projector.js +71 -5
- package/dist/runtime/acp/projector.js.map +1 -1
- package/dist/runtime/contracts.d.ts +1 -0
- package/dist/runtime/contracts.d.ts.map +1 -1
- package/dist/runtime/runtime-coordinator.d.ts.map +1 -1
- package/dist/runtime/runtime-coordinator.js +1 -0
- package/dist/runtime/runtime-coordinator.js.map +1 -1
- package/dist/services/__tests__/access-auth.service.test.js +41 -0
- package/dist/services/__tests__/access-auth.service.test.js.map +1 -1
- package/dist/services/__tests__/agent-artifact.service.test.d.ts +2 -0
- package/dist/services/__tests__/agent-artifact.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/agent-artifact.service.test.js +133 -0
- package/dist/services/__tests__/agent-artifact.service.test.js.map +1 -0
- package/dist/services/__tests__/agent-visualization.service.test.d.ts +2 -0
- package/dist/services/__tests__/agent-visualization.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/agent-visualization.service.test.js +57 -0
- package/dist/services/__tests__/agent-visualization.service.test.js.map +1 -0
- package/dist/services/__tests__/preview-runtime-manager.test.js +5 -0
- package/dist/services/__tests__/preview-runtime-manager.test.js.map +1 -1
- package/dist/services/__tests__/project.service.test.js +6 -2
- package/dist/services/__tests__/project.service.test.js.map +1 -1
- package/dist/services/__tests__/provider-config.service.test.js +32 -0
- package/dist/services/__tests__/provider-config.service.test.js.map +1 -1
- package/dist/services/__tests__/session-manager.lifecycle.test.js +153 -1
- package/dist/services/__tests__/session-manager.lifecycle.test.js.map +1 -1
- package/dist/services/__tests__/session-manager.team-run.test.js +18 -5
- package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -1
- package/dist/services/__tests__/task.service.test.js +16 -3
- package/dist/services/__tests__/task.service.test.js.map +1 -1
- package/dist/services/__tests__/workspace-background-process-manager.test.d.ts +2 -0
- package/dist/services/__tests__/workspace-background-process-manager.test.d.ts.map +1 -0
- package/dist/services/__tests__/workspace-background-process-manager.test.js +412 -0
- package/dist/services/__tests__/workspace-background-process-manager.test.js.map +1 -0
- package/dist/services/__tests__/workspace-background-service.service.test.d.ts +2 -0
- package/dist/services/__tests__/workspace-background-service.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/workspace-background-service.service.test.js +418 -0
- package/dist/services/__tests__/workspace-background-service.service.test.js.map +1 -0
- package/dist/services/__tests__/workspace.service.test.js +137 -0
- package/dist/services/__tests__/workspace.service.test.js.map +1 -1
- package/dist/services/access-auth.service.d.ts +15 -1
- package/dist/services/access-auth.service.d.ts.map +1 -1
- package/dist/services/access-auth.service.js +75 -15
- package/dist/services/access-auth.service.js.map +1 -1
- package/dist/services/agent-artifact.service.d.ts +28 -0
- package/dist/services/agent-artifact.service.d.ts.map +1 -0
- package/dist/services/agent-artifact.service.js +287 -0
- package/dist/services/agent-artifact.service.js.map +1 -0
- package/dist/services/agent-visualization.service.d.ts +12 -0
- package/dist/services/agent-visualization.service.d.ts.map +1 -0
- package/dist/services/agent-visualization.service.js +239 -0
- package/dist/services/agent-visualization.service.js.map +1 -0
- package/dist/services/mcp-config.service.d.ts.map +1 -1
- package/dist/services/mcp-config.service.js +8 -1
- package/dist/services/mcp-config.service.js.map +1 -1
- package/dist/services/mcp-config.service.test.js +14 -0
- package/dist/services/mcp-config.service.test.js.map +1 -1
- package/dist/services/preview-runtime-manager.d.ts.map +1 -1
- package/dist/services/preview-runtime-manager.js +15 -12
- package/dist/services/preview-runtime-manager.js.map +1 -1
- package/dist/services/project.service.d.ts +4 -1
- package/dist/services/project.service.d.ts.map +1 -1
- package/dist/services/project.service.js +43 -32
- package/dist/services/project.service.js.map +1 -1
- package/dist/services/provider-config.service.d.ts.map +1 -1
- package/dist/services/provider-config.service.js +11 -0
- package/dist/services/provider-config.service.js.map +1 -1
- package/dist/services/session-manager.d.ts +34 -32
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +43 -23
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/task-cleanup.service.d.ts +4 -1
- package/dist/services/task-cleanup.service.d.ts.map +1 -1
- package/dist/services/task-cleanup.service.js +13 -1
- package/dist/services/task-cleanup.service.js.map +1 -1
- package/dist/services/task.service.d.ts +22 -20
- package/dist/services/task.service.d.ts.map +1 -1
- package/dist/services/task.service.js +21 -8
- package/dist/services/task.service.js.map +1 -1
- package/dist/services/workspace-background-process-manager.d.ts +66 -0
- package/dist/services/workspace-background-process-manager.d.ts.map +1 -0
- package/dist/services/workspace-background-process-manager.js +328 -0
- package/dist/services/workspace-background-process-manager.js.map +1 -0
- package/dist/services/workspace-background-service.service.d.ts +39 -0
- package/dist/services/workspace-background-service.service.d.ts.map +1 -0
- package/dist/services/workspace-background-service.service.js +520 -0
- package/dist/services/workspace-background-service.service.js.map +1 -0
- package/dist/services/workspace-lifecycle-barrier.d.ts +10 -0
- package/dist/services/workspace-lifecycle-barrier.d.ts.map +1 -0
- package/dist/services/workspace-lifecycle-barrier.js +35 -0
- package/dist/services/workspace-lifecycle-barrier.js.map +1 -0
- package/dist/services/workspace.service.d.ts +42 -36
- package/dist/services/workspace.service.d.ts.map +1 -1
- package/dist/services/workspace.service.js +100 -39
- package/dist/services/workspace.service.js.map +1 -1
- package/dist/socket/__tests__/socket-gateway.test.js +23 -0
- package/dist/socket/__tests__/socket-gateway.test.js.map +1 -1
- package/dist/socket/middleware/__tests__/auth.test.js +3 -3
- package/dist/socket/middleware/__tests__/auth.test.js.map +1 -1
- package/dist/utils/agent-api-credential.d.ts +11 -0
- package/dist/utils/agent-api-credential.d.ts.map +1 -0
- package/dist/utils/agent-api-credential.js +40 -0
- package/dist/utils/agent-api-credential.js.map +1 -0
- package/dist/utils/internal-api-token.d.ts +2 -0
- package/dist/utils/internal-api-token.d.ts.map +1 -1
- package/dist/utils/internal-api-token.js +2 -0
- package/dist/utils/internal-api-token.js.map +1 -1
- package/dist/utils/process-launch.d.ts.map +1 -1
- package/dist/utils/process-launch.js +156 -22
- package/dist/utils/process-launch.js.map +1 -1
- package/dist/utils/process-launch.test.js +7 -0
- package/dist/utils/process-launch.test.js.map +1 -1
- package/dist/utils/unix-process-identity.d.ts +23 -0
- package/dist/utils/unix-process-identity.d.ts.map +1 -0
- package/dist/utils/unix-process-identity.js +165 -0
- package/dist/utils/unix-process-identity.js.map +1 -0
- package/dist/web/assets/{AgentDemoPage-XrttOpQW.js → AgentDemoPage-CLemSpf6.js} +1 -1
- package/dist/web/assets/{AgentEnvironmentSettingsPage-CAo0bCpZ.js → AgentEnvironmentSettingsPage-CPggaJvZ.js} +1 -1
- package/dist/web/assets/{AgentLogo-BCwbooTN.js → AgentLogo-DJFjaRFS.js} +1 -1
- package/dist/web/assets/ConversationPage-CB4PoHYi.js +3 -0
- package/dist/web/assets/CreateTaskInput-CXWGjX_a.js +1 -0
- package/dist/web/assets/{DemoPage-DHMh9-zU.js → DemoPage-djW4NeHW.js} +3 -3
- package/dist/web/assets/{GeneralSettingsPage-DvWaqR9O.js → GeneralSettingsPage-0a2VgV74.js} +1 -1
- package/dist/web/assets/{Icons-DADUmnB1.js → Icons-tvQ3lNxT.js} +1 -1
- package/dist/web/assets/{LoadingPreviewPage-Dk91Ua1W.js → LoadingPreviewPage-D8GpQ-Ic.js} +1 -1
- package/dist/web/assets/McpSettingsPage-BxPMmwHH.js +1 -0
- package/dist/web/assets/{MemberAvatar-l-WCdlLA.js → MemberAvatar-JbGgXa3r.js} +1 -1
- package/dist/web/assets/{NotificationSettingsPage-Byu8b9X3.js → NotificationSettingsPage-BtN0fYTA.js} +1 -1
- package/dist/web/assets/{ProfileSettingsPage-BdylqWUj.js → ProfileSettingsPage-CVSHbAtS.js} +1 -1
- package/dist/web/assets/ProjectKanbanPage-Dq0pufE1.js +90 -0
- package/dist/web/assets/ProjectSettingsPage-CChSA5A4.js +2 -0
- package/dist/web/assets/ProviderSettingsPage-giXaDHmU.js +95 -0
- package/dist/web/assets/{SettingsMasterDetail-DTGIIGdI.js → SettingsMasterDetail-D-TeBuLx.js} +1 -1
- package/dist/web/assets/{TeamSettingsPage-BXuG4Bou.js → TeamSettingsPage-DNLp2l2E.js} +1 -1
- package/dist/web/assets/{arc-DrcjdWTE.js → arc-B5sdSA9b.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-CAoBhXSL.js → architectureDiagram-3BPJPVTR-ClsPKWjN.js} +1 -1
- package/dist/web/assets/{arrow-left-CCWDjOmp.js → arrow-left-B7C-fOb5.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-CcTSBbUq.js → blockDiagram-GPEHLZMM-HHViBKvL.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-BuUKdgUg.js → c4Diagram-AAUBKEIU-CRreiVUs.js} +1 -1
- package/dist/web/assets/channel-Bhjxgyee.js +1 -0
- package/dist/web/assets/check-Dtr-nHO5.js +1 -0
- package/dist/web/assets/{chevron-down-BQcW9sFf.js → chevron-down-BZnZAd2n.js} +1 -1
- package/dist/web/assets/{chevron-right-pH923eYp.js → chevron-right-nnOI2p8q.js} +1 -1
- package/dist/web/assets/{chevron-up-DyQW115F.js → chevron-up-Cl6FGZ8R.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-BWNSmQa8.js → chunk-2J33WTMH-_s2AOnis.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-Blldhw0k.js → chunk-4BX2VUAB-Ds1jhNjB.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-hTffyPXL.js → chunk-55IACEB6-B2SvpbB1.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-Cd48r7c-.js → chunk-727SXJPM-B6qjWdxn.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-BdDrOIL7.js → chunk-AQP2D5EJ-myECS-o9.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-6XIvQYVJ.js → chunk-FMBD7UC4-CFDf13jX.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-BJlcb_pB.js → chunk-ND2GUHAM-62aJufBH.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-3TZzFkxK.js → chunk-QZHKN3VN-DEWvzHCx.js} +1 -1
- package/dist/web/assets/{circle-alert-oa-BQ5e7.js → circle-alert-BSGJzTSj.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-BxnIeW8e.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-BxnIeW8e.js +1 -0
- package/dist/web/assets/{code-block-OCS4YCEC-xJQWFyR7.js → code-block-OCS4YCEC-DWj3hzdw.js} +1 -1
- package/dist/web/assets/{confirm-dialog-CRiC3xBd.js → confirm-dialog-oStWxmjS.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-Cjcm-rW_.js → cose-bilkent-S5V4N54A-DNYqhVNu.js} +1 -1
- package/dist/web/assets/cssMode-Cn68yhOS.js +1 -0
- package/dist/web/assets/{dagre-BM42HDAG-YqubcAJi.js → dagre-BM42HDAG-gQbGUd4s.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-Dk4ayFqg.js → diagram-2AECGRRQ-BeMaPQBR.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-CQ0joYfB.js → diagram-5GNKFQAL-CStJaSd8.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-DmuZzIdW.js → diagram-KO2AKTUF-BmEeaazt.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-YTPEfEZy.js → diagram-LMA3HP47-ClNnKUvt.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-DmwRuz8-.js → diagram-OG6HWLK6-C24GKhLk.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-LRL_DMXa.js → erDiagram-TEJ5UH35-6Xp8w1WL.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-ELBDyOvk.js → flowDiagram-I6XJVG4X-BCih6e9O.js} +1 -1
- package/dist/web/assets/folder-picker-DcY2P8zf.js +1 -0
- package/dist/web/assets/{freemarker2-DxJFkRz5.js → freemarker2-C6kMBtOW.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-D0e9ILuF.js → ganttDiagram-6RSMTGT7-_9GX-BOi.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-Ck6OXXw0.js → gitGraphDiagram-PVQCEYII-DEe9VMLq.js} +1 -1
- package/dist/web/assets/handlebars-BxZgdhY8.js +1 -0
- package/dist/web/assets/html-bhMfD_X9.js +1 -0
- package/dist/web/assets/htmlMode-CC7AVUJ4.js +1 -0
- package/dist/web/assets/index-018g9RN4.css +1 -0
- package/dist/web/assets/{index-D9kBRMR0.js → index-ToY1NCNr.js} +3 -3
- package/dist/web/assets/{index-CjdqAcbu.js → index-cl-QFuts.js} +4 -4
- package/dist/web/assets/{infoDiagram-5YYISTIA-Cx8be-MV.js → infoDiagram-5YYISTIA-CU3D8SMZ.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-Dlc7akl7.js → ishikawaDiagram-YF4QCWOH-ClffgdSa.js} +1 -1
- package/dist/web/assets/javascript-8UIdW5Gd.js +1 -0
- package/dist/web/assets/{journeyDiagram-JHISSGLW-BVDSbS9-.js → journeyDiagram-JHISSGLW-Cy7Rr0_y.js} +1 -1
- package/dist/web/assets/{jsonMode-B5CJhoWd.js → jsonMode-JLBoaKf1.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-nFR0zB7B.js → kanban-definition-UN3LZRKU-14piuQEq.js} +1 -1
- package/dist/web/assets/{layers-Bo4aml98.js → layers-C93epAjs.js} +1 -1
- package/dist/web/assets/{linear-BCWZjcpP.js → linear-BtH62ya4.js} +1 -1
- package/dist/web/assets/liquid-BntTiwt7.js +1 -0
- package/dist/web/assets/{lspLanguageFeatures-Cbk7wEkj.js → lspLanguageFeatures-Dk65AKZD.js} +1 -1
- package/dist/web/assets/mdx-ToUKdFio.js +1 -0
- package/dist/web/assets/{mermaid-NOHMQCX5-DWQaYVL0.js → mermaid-NOHMQCX5-CPO3gPWp.js} +66 -65
- package/dist/web/assets/{message-square-DxbkpGqF.js → message-square-BBENHwpb.js} +1 -1
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-LI7W1FIX.js → mindmap-definition-RKZ34NQL-gWYqFXbP.js} +1 -1
- package/dist/web/assets/{modal-Cymk-6Df.js → modal-D-sNOVPw.js} +1 -1
- package/dist/web/assets/{monaco-Bc-Z2u8N.js → monaco-B9Zd90UG.js} +3 -3
- package/dist/web/assets/{pencil-DOL2nlgg.js → pencil-BRPix314.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-mgUzAFkk.js → pieDiagram-4H26LBE5-C3cHgEuO.js} +1 -1
- package/dist/web/assets/python-BeGIUwrY.js +1 -0
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-CaDF2kqA.js → quadrantDiagram-W4KKPZXB-DZFYp-mp.js} +1 -1
- package/dist/web/assets/razor-CnCuqD7W.js +1 -0
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-DhmHdr_0.js → requirementDiagram-4Y6WPE33-DSQRXAFH.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-B7qnGfue.js → sankeyDiagram-5OEKKPKP-CEXk2v3C.js} +1 -1
- package/dist/web/assets/{select-BpKQyMvD.js → select-CGNclv1f.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-D2LhPgpM.js → sequenceDiagram-3UESZ5HK-CHVF_25M.js} +1 -1
- package/dist/web/assets/server-UA3ZvpjF.js +1 -0
- package/dist/web/assets/{stateDiagram-AJRCARHV-ClkO4Gu5.js → stateDiagram-AJRCARHV-TMqBR1_f.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-DqCjP1u1.js +1 -0
- package/dist/web/assets/{switch-BJ4Ar_OA.js → switch-C7qsQ1x2.js} +1 -1
- package/dist/web/assets/{textarea-DjwjAAG8.js → textarea-CDdCks2T.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-DhGIG-GC.js → timeline-definition-PNZ67QCA-CxC3mFt7.js} +1 -1
- package/dist/web/assets/{trash-2-R46i6Uus.js → trash-2-Bye7VGcW.js} +1 -1
- package/dist/web/assets/{tsMode-CKaqpIrz.js → tsMode-8nvc-x2E.js} +1 -1
- package/dist/web/assets/typescript-P7JXXc42.js +1 -0
- package/dist/web/assets/{upload-CgWqsmdI.js → upload-wJO5M1ZY.js} +1 -1
- package/dist/web/assets/{use-profiles-BlGgvdYm.js → use-profiles-CYJIKesy.js} +1 -1
- package/dist/web/assets/{use-projects-Cuv0A0RC.js → use-projects-Ds_YI2En.js} +1 -1
- package/dist/web/assets/{use-providers-DLcAY6E1.js → use-providers-B9FaTKyw.js} +1 -1
- package/dist/web/assets/{useNormalizedLogs-tfxFAJOF.js → useNormalizedLogs-B8um63GF.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-BngQhsYJ.js → vennDiagram-CIIHVFJN-DX0jm9G-.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-BEY6sftT.js → wardley-L42UT6IY-Ce-rqtq2.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-IH_Yh-cw.js → wardleyDiagram-YWT4CUSO-Gpxnu2av.js} +1 -1
- package/dist/web/assets/xml-1G4iEdpK.js +1 -0
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-BdrGFDsr.js → xychartDiagram-2RQKCTM6-COe6opx2.js} +1 -1
- package/dist/web/assets/yaml-HqUdsAk3.js +1 -0
- package/dist/web/index.html +2 -2
- package/node_modules/@agent-tower/shared/dist/agent-download-intent.d.ts +6 -0
- package/node_modules/@agent-tower/shared/dist/agent-download-intent.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/agent-download-intent.js +46 -0
- package/node_modules/@agent-tower/shared/dist/agent-download-intent.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts +1 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/index.js +1 -0
- package/node_modules/@agent-tower/shared/dist/index.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts +1 -0
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.js +4 -0
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.d.ts +56 -2
- package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/prisma/migrations/20260728000000_add_agent_artifacts/migration.sql +23 -0
- package/prisma/schema.prisma +48 -0
- package/dist/web/assets/ConversationPage-kyHuICil.js +0 -3
- package/dist/web/assets/CreateTaskInput-B67vzMJD.js +0 -1
- package/dist/web/assets/McpSettingsPage-CH8jFyxp.js +0 -1
- package/dist/web/assets/ProjectKanbanPage--cx6wNDR.js +0 -90
- package/dist/web/assets/ProjectSettingsPage-6psG0Vfc.js +0 -2
- package/dist/web/assets/ProviderSettingsPage-BPEEkhtA.js +0 -93
- package/dist/web/assets/channel-Bh_PCZNP.js +0 -1
- package/dist/web/assets/check-BN_PVKzE.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-B0lQFDoP.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-B0lQFDoP.js +0 -1
- package/dist/web/assets/copy-DaoAUKTO.js +0 -1
- package/dist/web/assets/cssMode-_D6u4YDd.js +0 -1
- package/dist/web/assets/folder-picker-WUhXxIM5.js +0 -1
- package/dist/web/assets/handlebars-djdO6ZKR.js +0 -1
- package/dist/web/assets/html-CHeBxmFi.js +0 -1
- package/dist/web/assets/htmlMode-SZh8FaPi.js +0 -1
- package/dist/web/assets/index-CjAJoGg5.css +0 -1
- package/dist/web/assets/javascript-l6fV6hf7.js +0 -1
- package/dist/web/assets/liquid-DkFOeJ6J.js +0 -1
- package/dist/web/assets/mdx-BOPNdexu.js +0 -1
- package/dist/web/assets/python-D_wlYLCL.js +0 -1
- package/dist/web/assets/razor-DBFVg4JU.js +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-YnSeSD_N.js +0 -1
- package/dist/web/assets/typescript-DsixnGVt.js +0 -1
- package/dist/web/assets/xml-dEcQ1gzo.js +0 -1
- package/dist/web/assets/yaml-BfGVqGj4.js +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { WorkspaceKind } from '../types/index.js';
|
|
2
2
|
import { type TeamLockService } from './team-lock.service.js';
|
|
3
3
|
import type { GitOperationStatus, MergeableWorkspacesResponse, MergeTeamRunMembersInput, MergeTeamRunMembersResponse, WorkspaceVerdict, WorkspaceVerdictKind, WorkspaceVerdictValue } from '@agent-tower/shared';
|
|
4
|
+
import type { WorkspaceBackgroundService } from './workspace-background-service.service.js';
|
|
4
5
|
export interface CreateWorkspaceOptions {
|
|
5
6
|
branchName?: string;
|
|
6
7
|
branchNamePrefix?: string;
|
|
@@ -52,11 +53,12 @@ export interface MergeTeamRunMembersOptions extends MergeTeamRunMembersInput {
|
|
|
52
53
|
}
|
|
53
54
|
export declare class WorkspaceService {
|
|
54
55
|
private readonly lockService;
|
|
56
|
+
private readonly backgroundService;
|
|
55
57
|
private static readonly mainWorkspaceClaims;
|
|
56
58
|
private static readonly dedicatedWorkspaceClaims;
|
|
57
59
|
private sessionService;
|
|
58
60
|
private eventBus;
|
|
59
|
-
constructor(lockService?: TeamLockService);
|
|
61
|
+
constructor(lockService?: TeamLockService, backgroundService?: Pick<WorkspaceBackgroundService, 'stopAllForWorkspace'> & Partial<Pick<WorkspaceBackgroundService, 'releaseLogsForWorkspace'>>);
|
|
60
62
|
private getBaseBranch;
|
|
61
63
|
findById(id: string): Promise<({
|
|
62
64
|
task: {
|
|
@@ -84,9 +86,9 @@ export declare class WorkspaceService {
|
|
|
84
86
|
description: string | null;
|
|
85
87
|
createdAt: Date;
|
|
86
88
|
updatedAt: Date;
|
|
87
|
-
title: string;
|
|
88
89
|
status: string;
|
|
89
90
|
priority: number;
|
|
91
|
+
title: string;
|
|
90
92
|
position: number;
|
|
91
93
|
projectId: string;
|
|
92
94
|
deletedAt: Date | null;
|
|
@@ -95,9 +97,9 @@ export declare class WorkspaceService {
|
|
|
95
97
|
id: string;
|
|
96
98
|
createdAt: Date;
|
|
97
99
|
updatedAt: Date;
|
|
100
|
+
agentType: string;
|
|
98
101
|
status: string;
|
|
99
102
|
workspaceId: string | null;
|
|
100
|
-
agentType: string;
|
|
101
103
|
variant: string;
|
|
102
104
|
providerId: string | null;
|
|
103
105
|
purpose: string;
|
|
@@ -107,15 +109,15 @@ export declare class WorkspaceService {
|
|
|
107
109
|
id: string;
|
|
108
110
|
createdAt: Date;
|
|
109
111
|
updatedAt: Date;
|
|
112
|
+
workingDir: string;
|
|
110
113
|
status: string;
|
|
111
114
|
taskId: string;
|
|
115
|
+
branchName: string;
|
|
116
|
+
worktreePath: string;
|
|
112
117
|
parentWorkspaceId: string | null;
|
|
113
118
|
ownerMemberId: string | null;
|
|
114
|
-
branchName: string;
|
|
115
119
|
baseBranch: string | null;
|
|
116
|
-
worktreePath: string;
|
|
117
120
|
workspaceKind: string;
|
|
118
|
-
workingDir: string;
|
|
119
121
|
commitMessage: string | null;
|
|
120
122
|
previewTarget: string | null;
|
|
121
123
|
hibernatedAt: Date | null;
|
|
@@ -128,9 +130,9 @@ export declare class WorkspaceService {
|
|
|
128
130
|
id: string;
|
|
129
131
|
createdAt: Date;
|
|
130
132
|
updatedAt: Date;
|
|
133
|
+
agentType: string;
|
|
131
134
|
status: string;
|
|
132
135
|
workspaceId: string | null;
|
|
133
|
-
agentType: string;
|
|
134
136
|
variant: string;
|
|
135
137
|
providerId: string | null;
|
|
136
138
|
purpose: string;
|
|
@@ -140,15 +142,15 @@ export declare class WorkspaceService {
|
|
|
140
142
|
id: string;
|
|
141
143
|
createdAt: Date;
|
|
142
144
|
updatedAt: Date;
|
|
145
|
+
workingDir: string;
|
|
143
146
|
status: string;
|
|
144
147
|
taskId: string;
|
|
148
|
+
branchName: string;
|
|
149
|
+
worktreePath: string;
|
|
145
150
|
parentWorkspaceId: string | null;
|
|
146
151
|
ownerMemberId: string | null;
|
|
147
|
-
branchName: string;
|
|
148
152
|
baseBranch: string | null;
|
|
149
|
-
worktreePath: string;
|
|
150
153
|
workspaceKind: string;
|
|
151
|
-
workingDir: string;
|
|
152
154
|
commitMessage: string | null;
|
|
153
155
|
previewTarget: string | null;
|
|
154
156
|
hibernatedAt: Date | null;
|
|
@@ -203,9 +205,9 @@ export declare class WorkspaceService {
|
|
|
203
205
|
description: string | null;
|
|
204
206
|
createdAt: Date;
|
|
205
207
|
updatedAt: Date;
|
|
206
|
-
title: string;
|
|
207
208
|
status: string;
|
|
208
209
|
priority: number;
|
|
210
|
+
title: string;
|
|
209
211
|
position: number;
|
|
210
212
|
projectId: string;
|
|
211
213
|
deletedAt: Date | null;
|
|
@@ -214,9 +216,9 @@ export declare class WorkspaceService {
|
|
|
214
216
|
id: string;
|
|
215
217
|
createdAt: Date;
|
|
216
218
|
updatedAt: Date;
|
|
219
|
+
agentType: string;
|
|
217
220
|
status: string;
|
|
218
221
|
workspaceId: string | null;
|
|
219
|
-
agentType: string;
|
|
220
222
|
variant: string;
|
|
221
223
|
providerId: string | null;
|
|
222
224
|
purpose: string;
|
|
@@ -226,15 +228,15 @@ export declare class WorkspaceService {
|
|
|
226
228
|
id: string;
|
|
227
229
|
createdAt: Date;
|
|
228
230
|
updatedAt: Date;
|
|
231
|
+
workingDir: string;
|
|
229
232
|
status: string;
|
|
230
233
|
taskId: string;
|
|
234
|
+
branchName: string;
|
|
235
|
+
worktreePath: string;
|
|
231
236
|
parentWorkspaceId: string | null;
|
|
232
237
|
ownerMemberId: string | null;
|
|
233
|
-
branchName: string;
|
|
234
238
|
baseBranch: string | null;
|
|
235
|
-
worktreePath: string;
|
|
236
239
|
workspaceKind: string;
|
|
237
|
-
workingDir: string;
|
|
238
240
|
commitMessage: string | null;
|
|
239
241
|
previewTarget: string | null;
|
|
240
242
|
hibernatedAt: Date | null;
|
|
@@ -266,9 +268,9 @@ export declare class WorkspaceService {
|
|
|
266
268
|
description: string | null;
|
|
267
269
|
createdAt: Date;
|
|
268
270
|
updatedAt: Date;
|
|
269
|
-
title: string;
|
|
270
271
|
status: string;
|
|
271
272
|
priority: number;
|
|
273
|
+
title: string;
|
|
272
274
|
position: number;
|
|
273
275
|
projectId: string;
|
|
274
276
|
deletedAt: Date | null;
|
|
@@ -277,9 +279,9 @@ export declare class WorkspaceService {
|
|
|
277
279
|
id: string;
|
|
278
280
|
createdAt: Date;
|
|
279
281
|
updatedAt: Date;
|
|
282
|
+
agentType: string;
|
|
280
283
|
status: string;
|
|
281
284
|
workspaceId: string | null;
|
|
282
|
-
agentType: string;
|
|
283
285
|
variant: string;
|
|
284
286
|
providerId: string | null;
|
|
285
287
|
purpose: string;
|
|
@@ -289,15 +291,15 @@ export declare class WorkspaceService {
|
|
|
289
291
|
id: string;
|
|
290
292
|
createdAt: Date;
|
|
291
293
|
updatedAt: Date;
|
|
294
|
+
workingDir: string;
|
|
292
295
|
status: string;
|
|
293
296
|
taskId: string;
|
|
297
|
+
branchName: string;
|
|
298
|
+
worktreePath: string;
|
|
294
299
|
parentWorkspaceId: string | null;
|
|
295
300
|
ownerMemberId: string | null;
|
|
296
|
-
branchName: string;
|
|
297
301
|
baseBranch: string | null;
|
|
298
|
-
worktreePath: string;
|
|
299
302
|
workspaceKind: string;
|
|
300
|
-
workingDir: string;
|
|
301
303
|
commitMessage: string | null;
|
|
302
304
|
previewTarget: string | null;
|
|
303
305
|
hibernatedAt: Date | null;
|
|
@@ -328,9 +330,9 @@ export declare class WorkspaceService {
|
|
|
328
330
|
description: string | null;
|
|
329
331
|
createdAt: Date;
|
|
330
332
|
updatedAt: Date;
|
|
331
|
-
title: string;
|
|
332
333
|
status: string;
|
|
333
334
|
priority: number;
|
|
335
|
+
title: string;
|
|
334
336
|
position: number;
|
|
335
337
|
projectId: string;
|
|
336
338
|
deletedAt: Date | null;
|
|
@@ -339,9 +341,9 @@ export declare class WorkspaceService {
|
|
|
339
341
|
id: string;
|
|
340
342
|
createdAt: Date;
|
|
341
343
|
updatedAt: Date;
|
|
344
|
+
agentType: string;
|
|
342
345
|
status: string;
|
|
343
346
|
workspaceId: string | null;
|
|
344
|
-
agentType: string;
|
|
345
347
|
variant: string;
|
|
346
348
|
providerId: string | null;
|
|
347
349
|
purpose: string;
|
|
@@ -351,15 +353,15 @@ export declare class WorkspaceService {
|
|
|
351
353
|
id: string;
|
|
352
354
|
createdAt: Date;
|
|
353
355
|
updatedAt: Date;
|
|
356
|
+
workingDir: string;
|
|
354
357
|
status: string;
|
|
355
358
|
taskId: string;
|
|
359
|
+
branchName: string;
|
|
360
|
+
worktreePath: string;
|
|
356
361
|
parentWorkspaceId: string | null;
|
|
357
362
|
ownerMemberId: string | null;
|
|
358
|
-
branchName: string;
|
|
359
363
|
baseBranch: string | null;
|
|
360
|
-
worktreePath: string;
|
|
361
364
|
workspaceKind: string;
|
|
362
|
-
workingDir: string;
|
|
363
365
|
commitMessage: string | null;
|
|
364
366
|
previewTarget: string | null;
|
|
365
367
|
hibernatedAt: Date | null;
|
|
@@ -382,6 +384,7 @@ export declare class WorkspaceService {
|
|
|
382
384
|
* - worktree 清理失败时仍然删除数据库记录(记录警告日志)
|
|
383
385
|
*/
|
|
384
386
|
delete(id: string): Promise<boolean>;
|
|
387
|
+
private deleteWithLifecycle;
|
|
385
388
|
getDiff(id: string): Promise<string>;
|
|
386
389
|
/**
|
|
387
390
|
* Rebase 工作空间分支到最新的基础分支
|
|
@@ -405,6 +408,7 @@ export declare class WorkspaceService {
|
|
|
405
408
|
private mergeRootWorkspaceToMain;
|
|
406
409
|
private assertTeamRunFinalMergeAllowed;
|
|
407
410
|
private assertNoActiveWriteSessions;
|
|
411
|
+
private assertNoActiveBackgroundServices;
|
|
408
412
|
private getMergeLockTarget;
|
|
409
413
|
private getParentWorkspaceMergeLockTarget;
|
|
410
414
|
private withMergeTargetLock;
|
|
@@ -437,9 +441,9 @@ export declare class WorkspaceService {
|
|
|
437
441
|
description: string | null;
|
|
438
442
|
createdAt: Date;
|
|
439
443
|
updatedAt: Date;
|
|
440
|
-
title: string;
|
|
441
444
|
status: string;
|
|
442
445
|
priority: number;
|
|
446
|
+
title: string;
|
|
443
447
|
position: number;
|
|
444
448
|
projectId: string;
|
|
445
449
|
deletedAt: Date | null;
|
|
@@ -448,12 +452,12 @@ export declare class WorkspaceService {
|
|
|
448
452
|
id: string;
|
|
449
453
|
createdAt: Date;
|
|
450
454
|
updatedAt: Date;
|
|
455
|
+
agentType: string;
|
|
456
|
+
runtimeType: string;
|
|
451
457
|
status: string;
|
|
452
458
|
workspaceId: string | null;
|
|
453
459
|
conversationId: string | null;
|
|
454
460
|
context: string;
|
|
455
|
-
agentType: string;
|
|
456
|
-
runtimeType: string;
|
|
457
461
|
externalSessionId: string | null;
|
|
458
462
|
variant: string;
|
|
459
463
|
providerId: string | null;
|
|
@@ -466,24 +470,26 @@ export declare class WorkspaceService {
|
|
|
466
470
|
id: string;
|
|
467
471
|
createdAt: Date;
|
|
468
472
|
updatedAt: Date;
|
|
473
|
+
workingDir: string;
|
|
469
474
|
status: string;
|
|
470
475
|
taskId: string;
|
|
476
|
+
branchName: string;
|
|
477
|
+
worktreePath: string;
|
|
471
478
|
parentWorkspaceId: string | null;
|
|
472
479
|
ownerMemberId: string | null;
|
|
473
|
-
branchName: string;
|
|
474
480
|
baseBranch: string | null;
|
|
475
|
-
worktreePath: string;
|
|
476
481
|
workspaceKind: string;
|
|
477
|
-
workingDir: string;
|
|
478
482
|
commitMessage: string | null;
|
|
479
483
|
previewTarget: string | null;
|
|
480
484
|
hibernatedAt: Date | null;
|
|
481
485
|
}>;
|
|
486
|
+
private archiveWithLifecycle;
|
|
482
487
|
/**
|
|
483
488
|
* 休眠单个 workspace:auto-commit dirty changes → 删除 worktree 目录 → 标记 HIBERNATED
|
|
484
489
|
* Branch 保留,可随时通过 reactivate() 恢复。
|
|
485
490
|
*/
|
|
486
491
|
hibernate(id: string): Promise<void>;
|
|
492
|
+
private hibernateWithLifecycle;
|
|
487
493
|
/**
|
|
488
494
|
* 唤醒休眠的 workspace:从 branch 重建 worktree → 复制文件 → 执行 setup → 恢复 ACTIVE
|
|
489
495
|
*/
|
|
@@ -513,9 +519,9 @@ export declare class WorkspaceService {
|
|
|
513
519
|
description: string | null;
|
|
514
520
|
createdAt: Date;
|
|
515
521
|
updatedAt: Date;
|
|
516
|
-
title: string;
|
|
517
522
|
status: string;
|
|
518
523
|
priority: number;
|
|
524
|
+
title: string;
|
|
519
525
|
position: number;
|
|
520
526
|
projectId: string;
|
|
521
527
|
deletedAt: Date | null;
|
|
@@ -524,9 +530,9 @@ export declare class WorkspaceService {
|
|
|
524
530
|
id: string;
|
|
525
531
|
createdAt: Date;
|
|
526
532
|
updatedAt: Date;
|
|
533
|
+
agentType: string;
|
|
527
534
|
status: string;
|
|
528
535
|
workspaceId: string | null;
|
|
529
|
-
agentType: string;
|
|
530
536
|
variant: string;
|
|
531
537
|
providerId: string | null;
|
|
532
538
|
purpose: string;
|
|
@@ -536,15 +542,15 @@ export declare class WorkspaceService {
|
|
|
536
542
|
id: string;
|
|
537
543
|
createdAt: Date;
|
|
538
544
|
updatedAt: Date;
|
|
545
|
+
workingDir: string;
|
|
539
546
|
status: string;
|
|
540
547
|
taskId: string;
|
|
548
|
+
branchName: string;
|
|
549
|
+
worktreePath: string;
|
|
541
550
|
parentWorkspaceId: string | null;
|
|
542
551
|
ownerMemberId: string | null;
|
|
543
|
-
branchName: string;
|
|
544
552
|
baseBranch: string | null;
|
|
545
|
-
worktreePath: string;
|
|
546
553
|
workspaceKind: string;
|
|
547
|
-
workingDir: string;
|
|
548
554
|
commitMessage: string | null;
|
|
549
555
|
previewTarget: string | null;
|
|
550
556
|
hibernatedAt: Date | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.service.d.ts","sourceRoot":"","sources":["../../src/services/workspace.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA8D,MAAM,mBAAmB,CAAC;AAM9G,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQtF,OAAO,KAAK,EACV,kBAAkB,EAElB,2BAA2B,EAG3B,wBAAwB,EACxB,2BAA2B,EAE3B,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.service.d.ts","sourceRoot":"","sources":["../../src/services/workspace.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { WorkspaceKind, WorkspaceStatus, TaskStatus, SessionStatus, SessionPurpo
|
|
|
3
3
|
import { WorktreeManager } from '../git/worktree.manager.js';
|
|
4
4
|
import { execGit, MergeConflictError } from '../git/git-cli.js';
|
|
5
5
|
import { NotFoundError, ServiceError } from '../errors.js';
|
|
6
|
-
import { getSessionManager, getEventBus } from '../core/container.js';
|
|
6
|
+
import { getSessionManager, getEventBus, getWorkspaceBackgroundService } from '../core/container.js';
|
|
7
7
|
import { copyProjectFiles } from './copy-files.service.js';
|
|
8
8
|
import { defaultTeamLockService } from './team-lock.service.js';
|
|
9
9
|
import { exec } from 'node:child_process';
|
|
@@ -14,6 +14,7 @@ import path from 'node:path';
|
|
|
14
14
|
import { ensureProjectIsMutable, ensureProjectSupportsWorktrees, hasGitMetadata, } from './project-guards.js';
|
|
15
15
|
import { ensureTaskNotDeleted } from './deleted-task-guard.js';
|
|
16
16
|
import { isMainDirectoryWorkspace, isWorktreeWorkspace, } from './workspace-kind.js';
|
|
17
|
+
import { defaultWorkspaceLifecycleBarrier } from './workspace-lifecycle-barrier.js';
|
|
17
18
|
const DEFAULT_IDLE_THRESHOLD_HOURS = 24;
|
|
18
19
|
const WORKSPACE_READY_RETRY_COUNT = 20;
|
|
19
20
|
const WORKSPACE_READY_RETRY_DELAY_MS = 50;
|
|
@@ -48,6 +49,13 @@ const visibleSessionsFilter = {
|
|
|
48
49
|
};
|
|
49
50
|
const activeSessionStatuses = [SessionStatus.PENDING, SessionStatus.RUNNING];
|
|
50
51
|
const activeInvocationStatuses = ['QUEUED', 'RUNNING', 'SESSION_ENDED', 'WAITING_ROOM_REPLY'];
|
|
52
|
+
const activeBackgroundServiceStates = ['STARTING', 'RUNNING', 'STOPPING'];
|
|
53
|
+
const activeBackgroundServiceWhere = {
|
|
54
|
+
OR: [
|
|
55
|
+
{ runtimeState: { in: activeBackgroundServiceStates } },
|
|
56
|
+
{ runtimeInstanceId: { not: null } },
|
|
57
|
+
],
|
|
58
|
+
};
|
|
51
59
|
const finalChildWorkspaceStatuses = [WorkspaceStatus.MERGED, WorkspaceStatus.ABANDONED];
|
|
52
60
|
function normalizeCreateOptions(input) {
|
|
53
61
|
if (typeof input === 'string') {
|
|
@@ -178,12 +186,14 @@ function resultSummary(results, requested = results.length) {
|
|
|
178
186
|
}
|
|
179
187
|
export class WorkspaceService {
|
|
180
188
|
lockService;
|
|
189
|
+
backgroundService;
|
|
181
190
|
static mainWorkspaceClaims = new Map();
|
|
182
191
|
static dedicatedWorkspaceClaims = new Map();
|
|
183
192
|
sessionService = getSessionManager();
|
|
184
193
|
eventBus = getEventBus();
|
|
185
|
-
constructor(lockService = defaultTeamLockService) {
|
|
194
|
+
constructor(lockService = defaultTeamLockService, backgroundService = getWorkspaceBackgroundService()) {
|
|
186
195
|
this.lockService = lockService;
|
|
196
|
+
this.backgroundService = backgroundService;
|
|
187
197
|
}
|
|
188
198
|
getBaseBranch(workspace) {
|
|
189
199
|
return workspace.baseBranch || workspace.task.project.mainBranch;
|
|
@@ -544,7 +554,7 @@ export class WorkspaceService {
|
|
|
544
554
|
});
|
|
545
555
|
const workspaceIds = dedicatedWorkspaces.map((workspace) => workspace.id);
|
|
546
556
|
const ownerMemberIds = dedicatedWorkspaces.map((workspace) => workspace.ownerMemberId);
|
|
547
|
-
const [verdicts, ownerInvocations, parentActiveWriteSession, mainHeadSha] = await Promise.all([
|
|
557
|
+
const [verdicts, ownerInvocations, activeServices, parentActiveWriteSession, mainHeadSha] = await Promise.all([
|
|
548
558
|
workspaceIds.length > 0
|
|
549
559
|
? prisma.workspaceVerdict.findMany({
|
|
550
560
|
where: {
|
|
@@ -571,6 +581,15 @@ export class WorkspaceService {
|
|
|
571
581
|
select: { memberId: true },
|
|
572
582
|
})
|
|
573
583
|
: Promise.resolve([]),
|
|
584
|
+
workspaceIds.length > 0
|
|
585
|
+
? prisma.workspaceBackgroundService.findMany({
|
|
586
|
+
where: {
|
|
587
|
+
workspaceId: { in: workspaceIds },
|
|
588
|
+
...activeBackgroundServiceWhere,
|
|
589
|
+
},
|
|
590
|
+
select: { workspaceId: true },
|
|
591
|
+
})
|
|
592
|
+
: Promise.resolve([]),
|
|
574
593
|
mainWorkspace
|
|
575
594
|
? prisma.session.findFirst({
|
|
576
595
|
where: {
|
|
@@ -620,6 +639,7 @@ export class WorkspaceService {
|
|
|
620
639
|
latestReviews,
|
|
621
640
|
latestTests,
|
|
622
641
|
ownerActiveMemberIds: new Set(ownerInvocations.map((invocation) => invocation.memberId)),
|
|
642
|
+
activeServiceWorkspaceIds: new Set(activeServices.map((service) => service.workspaceId)),
|
|
623
643
|
};
|
|
624
644
|
}
|
|
625
645
|
async buildMergeableWorkspacesResponse(context) {
|
|
@@ -718,6 +738,9 @@ export class WorkspaceService {
|
|
|
718
738
|
if (ownerHasActiveInvocation) {
|
|
719
739
|
blockers.push(blocker('OWNER_HAS_ACTIVE_INVOCATION', 'BLOCKING', 'Cannot merge while the workspace owner has active work'));
|
|
720
740
|
}
|
|
741
|
+
if (context.activeServiceWorkspaceIds.has(workspace.id)) {
|
|
742
|
+
blockers.push(blocker('WORKSPACE_HAS_ACTIVE_SERVICE', 'BLOCKING', 'Cannot merge a workspace while one of its background services is active'));
|
|
743
|
+
}
|
|
721
744
|
if (context.mainWorkspace.hasActiveWriteSession) {
|
|
722
745
|
blockers.push(blocker('PARENT_WORKSPACE_HAS_ACTIVE_SESSION', 'BLOCKING', 'Cannot merge into parent workspace while it has an active write session'));
|
|
723
746
|
}
|
|
@@ -1288,6 +1311,9 @@ export class WorkspaceService {
|
|
|
1288
1311
|
* - worktree 清理失败时仍然删除数据库记录(记录警告日志)
|
|
1289
1312
|
*/
|
|
1290
1313
|
async delete(id) {
|
|
1314
|
+
return defaultWorkspaceLifecycleBarrier.withWorkspace(id, () => this.deleteWithLifecycle(id));
|
|
1315
|
+
}
|
|
1316
|
+
async deleteWithLifecycle(id) {
|
|
1291
1317
|
const workspace = await prisma.workspace.findUnique({
|
|
1292
1318
|
where: { id },
|
|
1293
1319
|
include: {
|
|
@@ -1309,6 +1335,7 @@ export class WorkspaceService {
|
|
|
1309
1335
|
// 忽略停止失败
|
|
1310
1336
|
}
|
|
1311
1337
|
}
|
|
1338
|
+
await this.backgroundService.stopAllForWorkspace(id);
|
|
1312
1339
|
if (isWorktreeWorkspace(workspace) && workspace.worktreePath) {
|
|
1313
1340
|
// 清理 worktree
|
|
1314
1341
|
try {
|
|
@@ -1320,7 +1347,8 @@ export class WorkspaceService {
|
|
|
1320
1347
|
console.warn(`[WorkspaceService] Failed to remove worktree for workspace ${id}: ${err instanceof Error ? err.message : err}`);
|
|
1321
1348
|
}
|
|
1322
1349
|
}
|
|
1323
|
-
// 删除数据库记录(级联删除 sessions)
|
|
1350
|
+
// 删除数据库记录(级联删除 sessions/services)
|
|
1351
|
+
await this.backgroundService.releaseLogsForWorkspace?.(id);
|
|
1324
1352
|
await prisma.workspace.delete({ where: { id } });
|
|
1325
1353
|
return true;
|
|
1326
1354
|
}
|
|
@@ -1392,19 +1420,22 @@ export class WorkspaceService {
|
|
|
1392
1420
|
await worktreeManager.abortOperation(workspace.worktreePath);
|
|
1393
1421
|
}
|
|
1394
1422
|
async merge(id, commitMessageOrOptions) {
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1423
|
+
return defaultWorkspaceLifecycleBarrier.withWorkspace(id, async () => {
|
|
1424
|
+
const options = typeof commitMessageOrOptions === 'string'
|
|
1425
|
+
? { commitMessage: commitMessageOrOptions }
|
|
1426
|
+
: (commitMessageOrOptions ?? {});
|
|
1427
|
+
const workspace = await prisma.workspace.findUnique({
|
|
1428
|
+
where: { id },
|
|
1429
|
+
include: { task: { include: { project: true, teamRun: true } } },
|
|
1430
|
+
});
|
|
1431
|
+
if (!workspace) {
|
|
1432
|
+
throw new NotFoundError('Workspace', id);
|
|
1433
|
+
}
|
|
1434
|
+
ensureProjectIsMutable(workspace.task.project, 'merge workspaces');
|
|
1435
|
+
this.assertWorktreeWorkspace(workspace);
|
|
1436
|
+
await this.assertNoActiveBackgroundServices(workspace.id);
|
|
1437
|
+
return this.withMergeTargetLock(this.getMergeLockTarget(workspace), options.lockOwnerId, () => this.mergeWithLock(workspace, options));
|
|
1401
1438
|
});
|
|
1402
|
-
if (!workspace) {
|
|
1403
|
-
throw new NotFoundError('Workspace', id);
|
|
1404
|
-
}
|
|
1405
|
-
ensureProjectIsMutable(workspace.task.project, 'merge workspaces');
|
|
1406
|
-
this.assertWorktreeWorkspace(workspace);
|
|
1407
|
-
return this.withMergeTargetLock(this.getMergeLockTarget(workspace), options.lockOwnerId, () => this.mergeWithLock(workspace, options));
|
|
1408
1439
|
}
|
|
1409
1440
|
async mergeWithLock(workspace, options) {
|
|
1410
1441
|
if (this.isTeamRunDedicatedChildWorkspace(workspace) && workspace.status === WorkspaceStatus.MERGED) {
|
|
@@ -1421,6 +1452,9 @@ export class WorkspaceService {
|
|
|
1421
1452
|
if (workspace.status !== WorkspaceStatus.ACTIVE) {
|
|
1422
1453
|
throw new ServiceError(`Cannot merge workspace in ${workspace.status} status`, 'INVALID_WORKSPACE_STATE', 400);
|
|
1423
1454
|
}
|
|
1455
|
+
// The preflight/readiness result can become stale while waiting for the
|
|
1456
|
+
// merge target lock, so the process-writing invariant is checked again.
|
|
1457
|
+
await this.assertNoActiveBackgroundServices(workspace.id);
|
|
1424
1458
|
if (workspace.parentWorkspaceId) {
|
|
1425
1459
|
if (this.isTeamRunDedicatedChildWorkspace(workspace)) {
|
|
1426
1460
|
await this.assertTeamRunChildMergeGate(workspace, options);
|
|
@@ -1619,6 +1653,18 @@ export class WorkspaceService {
|
|
|
1619
1653
|
throw new ServiceError('Cannot merge into parent workspace while it has an active write session', 'PARENT_WORKSPACE_HAS_ACTIVE_SESSION', 409);
|
|
1620
1654
|
}
|
|
1621
1655
|
}
|
|
1656
|
+
async assertNoActiveBackgroundServices(workspaceId) {
|
|
1657
|
+
const activeService = await prisma.workspaceBackgroundService.findFirst({
|
|
1658
|
+
where: {
|
|
1659
|
+
workspaceId,
|
|
1660
|
+
...activeBackgroundServiceWhere,
|
|
1661
|
+
},
|
|
1662
|
+
select: { id: true },
|
|
1663
|
+
});
|
|
1664
|
+
if (activeService) {
|
|
1665
|
+
throw new ServiceError('Cannot merge a workspace while one of its background services is active', 'WORKSPACE_HAS_ACTIVE_SERVICE', 409);
|
|
1666
|
+
}
|
|
1667
|
+
}
|
|
1622
1668
|
getMergeLockTarget(workspace) {
|
|
1623
1669
|
if (workspace.parentWorkspaceId) {
|
|
1624
1670
|
return this.getParentWorkspaceMergeLockTarget(workspace.parentWorkspaceId);
|
|
@@ -1656,6 +1702,9 @@ export class WorkspaceService {
|
|
|
1656
1702
|
* 归档 Workspace(标记状态为 ABANDONED)
|
|
1657
1703
|
*/
|
|
1658
1704
|
async archive(id) {
|
|
1705
|
+
return defaultWorkspaceLifecycleBarrier.withWorkspace(id, () => this.archiveWithLifecycle(id));
|
|
1706
|
+
}
|
|
1707
|
+
async archiveWithLifecycle(id) {
|
|
1659
1708
|
const workspace = await prisma.workspace.findUnique({
|
|
1660
1709
|
where: { id },
|
|
1661
1710
|
include: { sessions: true, task: { include: { project: true } } },
|
|
@@ -1677,6 +1726,7 @@ export class WorkspaceService {
|
|
|
1677
1726
|
// 忽略停止失败
|
|
1678
1727
|
}
|
|
1679
1728
|
}
|
|
1729
|
+
await this.backgroundService.stopAllForWorkspace(id);
|
|
1680
1730
|
const archived = await prisma.workspace.update({
|
|
1681
1731
|
where: { id },
|
|
1682
1732
|
data: { status: WorkspaceStatus.ABANDONED },
|
|
@@ -1690,6 +1740,9 @@ export class WorkspaceService {
|
|
|
1690
1740
|
* Branch 保留,可随时通过 reactivate() 恢复。
|
|
1691
1741
|
*/
|
|
1692
1742
|
async hibernate(id) {
|
|
1743
|
+
return defaultWorkspaceLifecycleBarrier.withWorkspace(id, () => this.hibernateWithLifecycle(id));
|
|
1744
|
+
}
|
|
1745
|
+
async hibernateWithLifecycle(id) {
|
|
1693
1746
|
const workspace = await prisma.workspace.findUnique({
|
|
1694
1747
|
where: { id },
|
|
1695
1748
|
include: {
|
|
@@ -1708,6 +1761,9 @@ export class WorkspaceService {
|
|
|
1708
1761
|
if (hasActiveSessions) {
|
|
1709
1762
|
throw new ServiceError('Cannot hibernate workspace with active sessions', 'WORKSPACE_HAS_ACTIVE_SESSIONS', 409);
|
|
1710
1763
|
}
|
|
1764
|
+
// Hibernation removes the worktree. Long-running services must stop first
|
|
1765
|
+
// and remain stopped after reactivation.
|
|
1766
|
+
await this.backgroundService.stopAllForWorkspace(id);
|
|
1711
1767
|
// Auto-commit any dirty changes before removing worktree
|
|
1712
1768
|
if (workspace.worktreePath) {
|
|
1713
1769
|
const worktreeExists = await fs.access(workspace.worktreePath).then(() => true).catch(() => false);
|
|
@@ -1880,32 +1936,37 @@ export class WorkspaceService {
|
|
|
1880
1936
|
let cleaned = 0;
|
|
1881
1937
|
for (const workspace of workspaces) {
|
|
1882
1938
|
try {
|
|
1883
|
-
|
|
1939
|
+
await defaultWorkspaceLifecycleBarrier.withWorkspace(workspace.id, async () => {
|
|
1940
|
+
await this.backgroundService.stopAllForWorkspace(workspace.id);
|
|
1941
|
+
if (isMainDirectoryWorkspace(workspace)) {
|
|
1942
|
+
await this.backgroundService.releaseLogsForWorkspace?.(workspace.id);
|
|
1943
|
+
await prisma.workspace.delete({ where: { id: workspace.id } });
|
|
1944
|
+
cleaned++;
|
|
1945
|
+
return;
|
|
1946
|
+
}
|
|
1947
|
+
const worktreeManager = new WorktreeManager(workspace.task.project.repoPath);
|
|
1948
|
+
// 清理残留 worktree(如果还存在)
|
|
1949
|
+
if (workspace.worktreePath) {
|
|
1950
|
+
const removeResult = await worktreeManager.remove(workspace.worktreePath);
|
|
1951
|
+
if (removeResult.status === 'unregistered') {
|
|
1952
|
+
console.warn(`[WorkspaceService] cleanup: workspace ${workspace.id} path is unregistered or unsafe to remove: ${removeResult.path}`);
|
|
1953
|
+
return;
|
|
1954
|
+
}
|
|
1955
|
+
}
|
|
1956
|
+
// Task 已 DONE,branch 不再需要,删除。安全 helper 会跳过 base/main/master/current/missing。
|
|
1957
|
+
const branchDeleteResult = await worktreeManager.deleteBranchIfSafe(workspace.branchName, {
|
|
1958
|
+
protectedBranches: [workspace.task.project.mainBranch, workspace.baseBranch],
|
|
1959
|
+
});
|
|
1960
|
+
if (branchDeleteResult.status === 'failed') {
|
|
1961
|
+
console.warn(`[WorkspaceService] cleanup: failed to delete branch ${branchDeleteResult.branchName} for workspace ${workspace.id}: ${branchDeleteResult.reason}`);
|
|
1962
|
+
}
|
|
1963
|
+
else if (branchDeleteResult.status === 'checked_out') {
|
|
1964
|
+
console.warn(`[WorkspaceService] cleanup: skipped checked-out branch ${branchDeleteResult.branchName} for workspace ${workspace.id}: ${branchDeleteResult.reason}`);
|
|
1965
|
+
}
|
|
1966
|
+
await this.backgroundService.releaseLogsForWorkspace?.(workspace.id);
|
|
1884
1967
|
await prisma.workspace.delete({ where: { id: workspace.id } });
|
|
1885
1968
|
cleaned++;
|
|
1886
|
-
continue;
|
|
1887
|
-
}
|
|
1888
|
-
const worktreeManager = new WorktreeManager(workspace.task.project.repoPath);
|
|
1889
|
-
// 清理残留 worktree(如果还存在)
|
|
1890
|
-
if (workspace.worktreePath) {
|
|
1891
|
-
const removeResult = await worktreeManager.remove(workspace.worktreePath);
|
|
1892
|
-
if (removeResult.status === 'unregistered') {
|
|
1893
|
-
console.warn(`[WorkspaceService] cleanup: workspace ${workspace.id} path is unregistered or unsafe to remove: ${removeResult.path}`);
|
|
1894
|
-
continue;
|
|
1895
|
-
}
|
|
1896
|
-
}
|
|
1897
|
-
// Task 已 DONE,branch 不再需要,删除。安全 helper 会跳过 base/main/master/current/missing。
|
|
1898
|
-
const branchDeleteResult = await worktreeManager.deleteBranchIfSafe(workspace.branchName, {
|
|
1899
|
-
protectedBranches: [workspace.task.project.mainBranch, workspace.baseBranch],
|
|
1900
1969
|
});
|
|
1901
|
-
if (branchDeleteResult.status === 'failed') {
|
|
1902
|
-
console.warn(`[WorkspaceService] cleanup: failed to delete branch ${branchDeleteResult.branchName} for workspace ${workspace.id}: ${branchDeleteResult.reason}`);
|
|
1903
|
-
}
|
|
1904
|
-
else if (branchDeleteResult.status === 'checked_out') {
|
|
1905
|
-
console.warn(`[WorkspaceService] cleanup: skipped checked-out branch ${branchDeleteResult.branchName} for workspace ${workspace.id}: ${branchDeleteResult.reason}`);
|
|
1906
|
-
}
|
|
1907
|
-
await prisma.workspace.delete({ where: { id: workspace.id } });
|
|
1908
|
-
cleaned++;
|
|
1909
1970
|
}
|
|
1910
1971
|
catch (err) {
|
|
1911
1972
|
// worktree 删除失败时保留 DB 记录,下次 scan 重试
|