agent-tower 0.5.3 → 0.5.4-beta.1
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/README.md +6 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +15 -1
- package/dist/app.js.map +1 -1
- package/dist/app.test.js +12 -0
- package/dist/app.test.js.map +1 -1
- package/dist/cli.js +18 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/event-bus.d.ts +3 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/executors/__tests__/base.executor.test.js +29 -1
- package/dist/executors/__tests__/base.executor.test.js.map +1 -1
- package/dist/executors/__tests__/codex.executor.test.js +13 -0
- 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 +4 -0
- package/dist/executors/base.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 +7 -0
- package/dist/executors/execution-env.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/http-client.d.ts +33 -1
- package/dist/mcp/http-client.d.ts.map +1 -1
- package/dist/mcp/http-client.js +21 -2
- package/dist/mcp/http-client.js.map +1 -1
- package/dist/mcp/index.js +4 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +64 -9
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/__tests__/workspaces.test.d.ts +2 -0
- package/dist/mcp/tools/__tests__/workspaces.test.d.ts.map +1 -0
- package/dist/mcp/tools/__tests__/workspaces.test.js +72 -0
- package/dist/mcp/tools/__tests__/workspaces.test.js.map +1 -0
- package/dist/mcp/tools/workspaces.d.ts +9 -1
- package/dist/mcp/tools/workspaces.d.ts.map +1 -1
- package/dist/mcp/tools/workspaces.js +96 -2
- package/dist/mcp/tools/workspaces.js.map +1 -1
- package/dist/mcp/types.d.ts +46 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js +23 -0
- package/dist/mcp/types.js.map +1 -1
- package/dist/middleware/__tests__/access-auth.test.d.ts +2 -0
- package/dist/middleware/__tests__/access-auth.test.d.ts.map +1 -0
- package/dist/middleware/__tests__/access-auth.test.js +249 -0
- package/dist/middleware/__tests__/access-auth.test.js.map +1 -0
- package/dist/middleware/access-auth.d.ts +3 -0
- package/dist/middleware/access-auth.d.ts.map +1 -0
- package/dist/middleware/access-auth.js +110 -0
- package/dist/middleware/access-auth.js.map +1 -0
- package/dist/routes/__tests__/files.test.d.ts +2 -0
- package/dist/routes/__tests__/files.test.d.ts.map +1 -0
- package/dist/routes/__tests__/files.test.js +101 -0
- package/dist/routes/__tests__/files.test.js.map +1 -0
- package/dist/routes/__tests__/previews.integration.test.d.ts +2 -0
- package/dist/routes/__tests__/previews.integration.test.d.ts.map +1 -0
- package/dist/routes/__tests__/previews.integration.test.js +269 -0
- package/dist/routes/__tests__/previews.integration.test.js.map +1 -0
- package/dist/routes/__tests__/previews.test.js +103 -1
- package/dist/routes/__tests__/previews.test.js.map +1 -1
- package/dist/routes/__tests__/team-runs-merge.test.d.ts +2 -0
- package/dist/routes/__tests__/team-runs-merge.test.d.ts.map +1 -0
- package/dist/routes/__tests__/team-runs-merge.test.js +156 -0
- package/dist/routes/__tests__/team-runs-merge.test.js.map +1 -0
- package/dist/routes/__tests__/team-runs-private-messages.test.d.ts +2 -0
- package/dist/routes/__tests__/team-runs-private-messages.test.d.ts.map +1 -0
- package/dist/routes/__tests__/team-runs-private-messages.test.js +82 -0
- package/dist/routes/__tests__/team-runs-private-messages.test.js.map +1 -0
- package/dist/routes/access-auth.d.ts +3 -0
- package/dist/routes/access-auth.d.ts.map +1 -0
- package/dist/routes/access-auth.js +89 -0
- package/dist/routes/access-auth.js.map +1 -0
- package/dist/routes/files.d.ts.map +1 -1
- package/dist/routes/files.js +46 -0
- package/dist/routes/files.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 +7 -2
- package/dist/routes/previews.d.ts.map +1 -1
- package/dist/routes/previews.js +106 -32
- package/dist/routes/previews.js.map +1 -1
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +9 -0
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/team-runs.d.ts +2 -0
- package/dist/routes/team-runs.d.ts.map +1 -1
- package/dist/routes/team-runs.js +48 -1
- package/dist/routes/team-runs.js.map +1 -1
- package/dist/routes/workspaces.d.ts.map +1 -1
- package/dist/routes/workspaces.js +43 -4
- package/dist/routes/workspaces.js.map +1 -1
- package/dist/services/__tests__/access-auth.service.test.d.ts +2 -0
- package/dist/services/__tests__/access-auth.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/access-auth.service.test.js +316 -0
- package/dist/services/__tests__/access-auth.service.test.js.map +1 -0
- package/dist/services/__tests__/member-heartbeat.test.d.ts +2 -0
- package/dist/services/__tests__/member-heartbeat.test.d.ts.map +1 -0
- package/dist/services/__tests__/member-heartbeat.test.js +344 -0
- package/dist/services/__tests__/member-heartbeat.test.js.map +1 -0
- package/dist/services/__tests__/project.service.test.js +29 -0
- package/dist/services/__tests__/project.service.test.js.map +1 -1
- package/dist/services/__tests__/session-manager.team-run.test.js +144 -0
- package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -1
- package/dist/services/__tests__/task.service.test.js +34 -0
- package/dist/services/__tests__/task.service.test.js.map +1 -1
- package/dist/services/__tests__/team-reconciler.service.test.js +307 -11
- package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -1
- package/dist/services/__tests__/team-run.service.test.js +368 -2
- package/dist/services/__tests__/team-run.service.test.js.map +1 -1
- package/dist/services/__tests__/team-scheduler.service.test.js +409 -5
- package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -1
- package/dist/services/__tests__/workspace.service.test.js +991 -3
- package/dist/services/__tests__/workspace.service.test.js.map +1 -1
- package/dist/services/access-auth.service.d.ts +82 -0
- package/dist/services/access-auth.service.d.ts.map +1 -0
- package/dist/services/access-auth.service.js +385 -0
- package/dist/services/access-auth.service.js.map +1 -0
- package/dist/services/mcp-config.service.d.ts.map +1 -1
- package/dist/services/mcp-config.service.js +8 -2
- package/dist/services/mcp-config.service.js.map +1 -1
- package/dist/services/mcp-config.service.test.js +18 -3
- package/dist/services/mcp-config.service.test.js.map +1 -1
- package/dist/services/member-heartbeat-scheduler.d.ts +33 -0
- package/dist/services/member-heartbeat-scheduler.d.ts.map +1 -0
- package/dist/services/member-heartbeat-scheduler.js +83 -0
- package/dist/services/member-heartbeat-scheduler.js.map +1 -0
- package/dist/services/project-guards.d.ts +5 -0
- package/dist/services/project-guards.d.ts.map +1 -1
- package/dist/services/project-guards.js +47 -0
- package/dist/services/project-guards.js.map +1 -1
- package/dist/services/project.service.d.ts +6 -4
- package/dist/services/project.service.d.ts.map +1 -1
- package/dist/services/project.service.js +16 -7
- package/dist/services/project.service.js.map +1 -1
- package/dist/services/session-manager.d.ts +11 -0
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +76 -0
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/task.service.d.ts +11 -9
- package/dist/services/task.service.d.ts.map +1 -1
- package/dist/services/task.service.js +17 -12
- package/dist/services/task.service.js.map +1 -1
- package/dist/services/team-reconciler.service.d.ts +39 -0
- package/dist/services/team-reconciler.service.d.ts.map +1 -1
- package/dist/services/team-reconciler.service.js +234 -3
- package/dist/services/team-reconciler.service.js.map +1 -1
- package/dist/services/team-run.service.d.ts +7 -1
- package/dist/services/team-run.service.d.ts.map +1 -1
- package/dist/services/team-run.service.js +98 -9
- package/dist/services/team-run.service.js.map +1 -1
- package/dist/services/team-scheduler.service.d.ts +21 -1
- package/dist/services/team-scheduler.service.d.ts.map +1 -1
- package/dist/services/team-scheduler.service.js +252 -15
- package/dist/services/team-scheduler.service.js.map +1 -1
- package/dist/services/terminal-manager.d.ts.map +1 -1
- package/dist/services/terminal-manager.js +1 -0
- package/dist/services/terminal-manager.js.map +1 -1
- package/dist/services/workspace.service.d.ts +56 -1
- package/dist/services/workspace.service.d.ts.map +1 -1
- package/dist/services/workspace.service.js +841 -8
- package/dist/services/workspace.service.js.map +1 -1
- package/dist/socket/__tests__/socket-gateway.test.d.ts +2 -0
- package/dist/socket/__tests__/socket-gateway.test.d.ts.map +1 -0
- package/dist/socket/__tests__/socket-gateway.test.js +119 -0
- package/dist/socket/__tests__/socket-gateway.test.js.map +1 -0
- package/dist/socket/middleware/__tests__/auth.test.js +102 -2
- package/dist/socket/middleware/__tests__/auth.test.js.map +1 -1
- package/dist/socket/middleware/auth.d.ts +1 -0
- package/dist/socket/middleware/auth.d.ts.map +1 -1
- package/dist/socket/middleware/auth.js +22 -2
- package/dist/socket/middleware/auth.js.map +1 -1
- package/dist/socket/socket-gateway.d.ts +6 -2
- package/dist/socket/socket-gateway.d.ts.map +1 -1
- package/dist/socket/socket-gateway.js +78 -15
- package/dist/socket/socket-gateway.js.map +1 -1
- package/dist/utils/internal-api-token.d.ts +9 -0
- package/dist/utils/internal-api-token.d.ts.map +1 -0
- package/dist/utils/internal-api-token.js +74 -0
- package/dist/utils/internal-api-token.js.map +1 -0
- package/dist/utils/preview-path.d.ts +11 -0
- package/dist/utils/preview-path.d.ts.map +1 -0
- package/dist/utils/preview-path.js +46 -0
- package/dist/utils/preview-path.js.map +1 -0
- package/dist/utils/process-launch.test.js +14 -0
- package/dist/utils/process-launch.test.js.map +1 -1
- package/dist/web/assets/{AgentDemoPage-DMLw4xpg.js → AgentDemoPage-UmBBXiZq.js} +1 -1
- package/dist/web/assets/{AgentEnvironmentSettingsPage-NgRdouLu.js → AgentEnvironmentSettingsPage-DeMVC_O2.js} +1 -1
- package/dist/web/assets/{AgentLogo-ThhvSi7G.js → AgentLogo-sxp-yGLB.js} +1 -1
- package/dist/web/assets/{ConversationPage-B1ZcyF_h.js → ConversationPage-ykUuKcMG.js} +2 -2
- package/dist/web/assets/CreateTaskInput-WmNhRnVp.js +1 -0
- package/dist/web/assets/{DemoPage-CN2OBKzu.js → DemoPage-Cx-F46PV.js} +3 -3
- package/dist/web/assets/GeneralSettingsPage-DM4iy6dp.js +1 -0
- package/dist/web/assets/{Icons-DIZBOtuC.js → Icons-CO02_BMI.js} +1 -1
- package/dist/web/assets/{LoadingPreviewPage-CRBcypeY.js → LoadingPreviewPage-C58uR8H7.js} +1 -1
- package/dist/web/assets/McpSettingsPage-CTe-SNfY.js +1 -0
- package/dist/web/assets/{MemberAvatar-Y_pJlw-N.js → MemberAvatar-CZegYpYl.js} +1 -1
- package/dist/web/assets/NotificationSettingsPage-D17SAmMK.js +1 -0
- package/dist/web/assets/ProfileSettingsPage-B2rHV2eU.js +3 -0
- package/dist/web/assets/{ProjectKanbanPage-CBfocvKp.js → ProjectKanbanPage-SpCqpcZ0.js} +31 -32
- package/dist/web/assets/ProjectSettingsPage-2dD_ahm-.js +2 -0
- package/dist/web/assets/{ProviderSettingsPage-D-1Fyh5B.js → ProviderSettingsPage-D9vu3rO0.js} +6 -6
- package/dist/web/assets/{SettingsMasterDetail-CZfVaFo2.js → SettingsMasterDetail-CwRB1WBt.js} +1 -1
- package/dist/web/assets/{TeamSettingsPage-DysTmOGE.js → TeamSettingsPage-QXwc1AJE.js} +1 -1
- package/dist/web/assets/{arc-CgLBAHTH.js → arc-BRCC5BeU.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-CP9eQfdk.js → architectureDiagram-3BPJPVTR-7lTGsSu5.js} +1 -1
- package/dist/web/assets/{arrow-left-y1LwO7sB.js → arrow-left-CNgpy5r6.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-BURZnUwn.js → blockDiagram-GPEHLZMM-CnscyQkX.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-Dzgp3z3S.js → c4Diagram-AAUBKEIU-DDhuPTLZ.js} +1 -1
- package/dist/web/assets/channel-S-3oxkZZ.js +1 -0
- package/dist/web/assets/check-DRdZLPss.js +1 -0
- package/dist/web/assets/{chevron-down--B7iZqBL.js → chevron-down-CqZBsPeR.js} +1 -1
- package/dist/web/assets/{chevron-right-7PShDIwg.js → chevron-right-YWciNkox.js} +1 -1
- package/dist/web/assets/{chevron-up-3n_vHdrD.js → chevron-up-BJ4i5iAn.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-CIpasa01.js → chunk-2J33WTMH-B96XJhZG.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-DeSe2m1y.js → chunk-4BX2VUAB-IUZUHtbw.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-BkJ6ogdn.js → chunk-55IACEB6-DcO4xSOO.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-Bkbv-knP.js → chunk-727SXJPM-DuQwKkk-.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-BG9wGFIo.js → chunk-AQP2D5EJ-QotCqjAo.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-Cvl_2za9.js → chunk-FMBD7UC4-C7hUbfZh.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-B_zdzkWX.js → chunk-ND2GUHAM-B_C5eChQ.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-Ch6dvKNw.js → chunk-QZHKN3VN-DRgZY4LJ.js} +1 -1
- package/dist/web/assets/{circle-alert-W13JkYj3.js → circle-alert-Ch4pQ3zT.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-C00aPgpD.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-C00aPgpD.js +1 -0
- package/dist/web/assets/{code-block-OCS4YCEC-CYhJ9OPu.js → code-block-OCS4YCEC-h5zD4EvJ.js} +1 -1
- package/dist/web/assets/confirm-dialog-DG0L1v-9.js +1 -0
- package/dist/web/assets/{copy-bJ2sut_L.js → copy-JHS-5tjr.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-DWlnxyfH.js → cose-bilkent-S5V4N54A-6Gv8U8Cj.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-Bt3QI02a.js → dagre-BM42HDAG-Cf4rsmyS.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-EaJBYSnS.js → diagram-2AECGRRQ-DW3DQ8NA.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-BGyRb-_h.js → diagram-5GNKFQAL-C5cQ_MTX.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-CZhDTMfm.js → diagram-KO2AKTUF-Dcs4NTfn.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-Be8BAxmL.js → diagram-LMA3HP47-lLI-OolH.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-DEdQ7Cml.js → diagram-OG6HWLK6-BTdMG1u6.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-CG9SNlbz.js → erDiagram-TEJ5UH35-BrKfSMWb.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-BUpx5PVX.js → flowDiagram-I6XJVG4X-BFT9EHqo.js} +1 -1
- package/dist/web/assets/folder-picker--V79noua.js +1 -0
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-D7vRxMpE.js → ganttDiagram-6RSMTGT7-D_44EJ_y.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-3lhH-RcD.js → gitGraphDiagram-PVQCEYII-COrCr27e.js} +1 -1
- package/dist/web/assets/index-BC5stA77.js +122 -0
- package/dist/web/assets/{index-CGMjRoF7.js → index-Cjaho2ST.js} +4 -4
- package/dist/web/assets/index-DRJLGAPR.css +1 -0
- package/dist/web/assets/{infoDiagram-5YYISTIA-C5SNbJpO.js → infoDiagram-5YYISTIA-Derwhgw-.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-Ca7tX9_0.js → ishikawaDiagram-YF4QCWOH-Dv_SKfKy.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-B2oo6nxY.js → journeyDiagram-JHISSGLW-BvL0Myto.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-D1CzIzX9.js → kanban-definition-UN3LZRKU-D9iCCF7g.js} +1 -1
- package/dist/web/assets/{layers-BbLzQqyy.js → layers-D-OLv40U.js} +1 -1
- package/dist/web/assets/{linear-BWowtcGw.js → linear-DLebIyPZ.js} +1 -1
- package/dist/web/assets/{mermaid-NOHMQCX5-B42ziicV.js → mermaid-NOHMQCX5-CyA4Kmm7.js} +40 -40
- package/dist/web/assets/{message-square-Bd_m34OX.js → message-square-ByVmnBN0.js} +1 -1
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-CYbO6QCk.js → mindmap-definition-RKZ34NQL-CJXkujXD.js} +1 -1
- package/dist/web/assets/{modal-CxOKWOjZ.js → modal-KKPLseLk.js} +1 -1
- package/dist/web/assets/{pencil-h5kxwbcu.js → pencil-B7ylaB7k.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-DXQghKRy.js → pieDiagram-4H26LBE5-C8DfXjYu.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-C6lAMMQB.js → quadrantDiagram-W4KKPZXB-BxaUhA-J.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-Di9Le7Wy.js → requirementDiagram-4Y6WPE33-CkP381y3.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-BGpnptvR.js → sankeyDiagram-5OEKKPKP-Ciot-1f1.js} +1 -1
- package/dist/web/assets/{select-DFuN9DX8.js → select-CLvHC1t4.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DjfkfaQL.js → sequenceDiagram-3UESZ5HK-ZrO6aulq.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-DsELotm9.js → stateDiagram-AJRCARHV-BDC3J_xT.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-C_4zupNH.js +1 -0
- package/dist/web/assets/{switch-gL7lBFj6.js → switch-DqXAu8pW.js} +1 -1
- package/dist/web/assets/{textarea-Lr4GZaYW.js → textarea-ByV2n54w.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-Cq1BWC0T.js → timeline-definition-PNZ67QCA-CG898aCW.js} +1 -1
- package/dist/web/assets/{trash-2-B7GFt5Wl.js → trash-2-D-MBxpK4.js} +1 -1
- package/dist/web/assets/{upload-L8hpDFoO.js → upload-CkkorsYk.js} +1 -1
- package/dist/web/assets/{use-profiles-zIsoigD8.js → use-profiles-B62R9Kbn.js} +1 -1
- package/dist/web/assets/use-projects-JMhtZFd6.js +1 -0
- package/dist/web/assets/{use-providers-erJ2iHLz.js → use-providers-Cg1RDnUJ.js} +1 -1
- package/dist/web/assets/{useNormalizedLogs-CXAn7xj_.js → useNormalizedLogs-BMa5-cCl.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-DdOfNtRo.js → vennDiagram-CIIHVFJN-CNRNbGoo.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-BeKcEIgK.js → wardley-L42UT6IY-Fm0b_w6O.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-DPKOxABd.js → wardleyDiagram-YWT4CUSO-C_xf1EWg.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-olIy_aaY.js → xychartDiagram-2RQKCTM6-D9yke6dF.js} +1 -1
- package/dist/web/index.html +2 -2
- package/node_modules/@agent-tower/shared/dist/types.d.ts +198 -1
- 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/node_modules/@prisma/client/.prisma/client/edge.js +52 -5
- package/node_modules/@prisma/client/.prisma/client/index-browser.js +47 -0
- package/node_modules/@prisma/client/.prisma/client/index.d.ts +6144 -2196
- package/node_modules/@prisma/client/.prisma/client/index.js +52 -5
- package/node_modules/@prisma/client/.prisma/client/package.json +1 -1
- package/node_modules/@prisma/client/.prisma/client/schema.prisma +94 -30
- package/node_modules/@prisma/client/.prisma/client/wasm.js +47 -0
- package/package.json +1 -1
- package/prisma/migrations/20260618010000_add_workspace_verdicts/migration.sql +27 -0
- package/prisma/migrations/20260701000000_add_access_auth_settings/migration.sql +9 -0
- package/prisma/migrations/20260702000000_add_teamrun_target_commit_fields/migration.sql +38 -0
- package/prisma/schema.prisma +64 -0
- package/dist/web/assets/CreateTaskInput-Cb3aRHr3.js +0 -1
- package/dist/web/assets/GeneralSettingsPage-CE7P3t_v.js +0 -1
- package/dist/web/assets/McpSettingsPage-gp1XDMUd.js +0 -1
- package/dist/web/assets/NotificationSettingsPage-BhZeHEef.js +0 -1
- package/dist/web/assets/ProfileSettingsPage-D_y3ePFs.js +0 -3
- package/dist/web/assets/ProjectSettingsPage-V38j8T61.js +0 -2
- package/dist/web/assets/channel-CWEYGfCJ.js +0 -1
- package/dist/web/assets/check-D2WWIhwV.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-CcU8zfK8.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CcU8zfK8.js +0 -1
- package/dist/web/assets/confirm-dialog-BAqfLDT8.js +0 -1
- package/dist/web/assets/folder-picker-DFB9_pv4.js +0 -1
- package/dist/web/assets/folder-u7fKAtz_.js +0 -1
- package/dist/web/assets/index-7nw4fV42.js +0 -122
- package/dist/web/assets/index-YCjjSSLC.css +0 -1
- package/dist/web/assets/input-CKwRYuUJ.js +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-CudtEyHd.js +0 -1
|
@@ -108,19 +108,20 @@ model TeamTemplateMember {
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
model TeamRun {
|
|
111
|
-
id String
|
|
112
|
-
taskId String
|
|
113
|
-
task Task
|
|
111
|
+
id String @id @default(uuid())
|
|
112
|
+
taskId String @unique
|
|
113
|
+
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
114
114
|
mainWorkspaceId String?
|
|
115
|
-
mainWorkspace Workspace?
|
|
115
|
+
mainWorkspace Workspace? @relation("TeamRunMainWorkspace", fields: [mainWorkspaceId], references: [id], onDelete: SetNull)
|
|
116
116
|
mode String
|
|
117
117
|
reviewReason String?
|
|
118
|
-
createdAt DateTime
|
|
119
|
-
updatedAt DateTime
|
|
118
|
+
createdAt DateTime @default(now())
|
|
119
|
+
updatedAt DateTime @updatedAt
|
|
120
120
|
members TeamMember[]
|
|
121
121
|
messages RoomMessage[]
|
|
122
122
|
workRequests WorkRequest[]
|
|
123
123
|
invocations AgentInvocation[]
|
|
124
|
+
verdicts WorkspaceVerdict[]
|
|
124
125
|
|
|
125
126
|
@@index([mainWorkspaceId])
|
|
126
127
|
}
|
|
@@ -190,22 +191,31 @@ model RoomMessageParticipant {
|
|
|
190
191
|
}
|
|
191
192
|
|
|
192
193
|
model WorkRequest {
|
|
193
|
-
id
|
|
194
|
-
teamRunId
|
|
195
|
-
teamRun
|
|
196
|
-
requesterMemberId
|
|
197
|
-
requesterType
|
|
198
|
-
targetMemberId
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
194
|
+
id String @id @default(uuid())
|
|
195
|
+
teamRunId String
|
|
196
|
+
teamRun TeamRun @relation(fields: [teamRunId], references: [id], onDelete: Cascade)
|
|
197
|
+
requesterMemberId String?
|
|
198
|
+
requesterType String
|
|
199
|
+
targetMemberId String
|
|
200
|
+
targetKind String?
|
|
201
|
+
targetPurpose String?
|
|
202
|
+
targetSourceWorkspaceId String?
|
|
203
|
+
targetSourceMemberId String?
|
|
204
|
+
targetHeadSha String?
|
|
205
|
+
targetBranchName String?
|
|
206
|
+
targetPlanItemId String?
|
|
207
|
+
triggerMessageId String
|
|
208
|
+
instruction String
|
|
209
|
+
ifBusy String @default("queue")
|
|
210
|
+
cancelQueued Boolean @default(false)
|
|
211
|
+
status String @default("QUEUED")
|
|
212
|
+
createdAt DateTime @default(now())
|
|
213
|
+
updatedAt DateTime @updatedAt
|
|
206
214
|
|
|
207
215
|
@@index([teamRunId])
|
|
208
216
|
@@index([targetMemberId])
|
|
217
|
+
@@index([targetSourceWorkspaceId])
|
|
218
|
+
@@index([targetHeadSha])
|
|
209
219
|
@@index([status])
|
|
210
220
|
}
|
|
211
221
|
|
|
@@ -217,15 +227,33 @@ model AgentInvocation {
|
|
|
217
227
|
memberId String
|
|
218
228
|
workspaceId String?
|
|
219
229
|
sessionId String?
|
|
230
|
+
targetKind String?
|
|
231
|
+
targetPurpose String?
|
|
232
|
+
targetSourceWorkspaceId String?
|
|
233
|
+
targetSourceMemberId String?
|
|
234
|
+
targetHeadSha String?
|
|
235
|
+
targetBranchName String?
|
|
236
|
+
targetPlanItemId String?
|
|
237
|
+
targetSyncStatus String?
|
|
238
|
+
targetSyncError String?
|
|
239
|
+
targetExecutionBranch String?
|
|
240
|
+
targetPort Int?
|
|
241
|
+
targetVitePort Int?
|
|
242
|
+
targetE2EPort Int?
|
|
220
243
|
status String @default("QUEUED")
|
|
221
244
|
roomReplyReminderCount Int @default(0)
|
|
222
245
|
nextRoomReplyReminderAt DateTime?
|
|
246
|
+
lastHeartbeatAt DateTime? // 最近一次真实进展(session:patch / room message)时间,心跳 watchdog 比对用
|
|
247
|
+
firstNudgeAt DateTime? // 首次心跳唤醒时间,作为绝对兜底起点(收到 room message 或终态时清空)
|
|
223
248
|
createdAt DateTime @default(now())
|
|
224
249
|
updatedAt DateTime @updatedAt
|
|
225
250
|
|
|
226
251
|
@@index([teamRunId])
|
|
227
252
|
@@index([memberId])
|
|
228
253
|
@@index([sessionId])
|
|
254
|
+
@@index([targetSourceWorkspaceId])
|
|
255
|
+
@@index([targetHeadSha])
|
|
256
|
+
@@index([targetSyncStatus])
|
|
229
257
|
@@index([status])
|
|
230
258
|
}
|
|
231
259
|
|
|
@@ -233,27 +261,28 @@ model AgentInvocation {
|
|
|
233
261
|
// WorkspaceStatus: ACTIVE, MERGED, ABANDONED, HIBERNATED
|
|
234
262
|
// WorkspaceKind: WORKTREE, MAIN_DIRECTORY
|
|
235
263
|
model Workspace {
|
|
236
|
-
id String
|
|
264
|
+
id String @id @default(uuid())
|
|
237
265
|
taskId String
|
|
238
|
-
task Task
|
|
266
|
+
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
239
267
|
parentWorkspaceId String?
|
|
240
|
-
parentWorkspace Workspace?
|
|
241
|
-
childWorkspaces Workspace[]
|
|
268
|
+
parentWorkspace Workspace? @relation("WorkspaceChildren", fields: [parentWorkspaceId], references: [id], onDelete: SetNull)
|
|
269
|
+
childWorkspaces Workspace[] @relation("WorkspaceChildren")
|
|
242
270
|
ownerMemberId String?
|
|
243
|
-
ownerMember TeamMember?
|
|
244
|
-
mainForTeamRuns TeamRun[]
|
|
271
|
+
ownerMember TeamMember? @relation("WorkspaceOwner", fields: [ownerMemberId], references: [id], onDelete: SetNull)
|
|
272
|
+
mainForTeamRuns TeamRun[] @relation("TeamRunMainWorkspace")
|
|
245
273
|
branchName String
|
|
246
274
|
baseBranch String?
|
|
247
275
|
worktreePath String
|
|
248
|
-
workspaceKind String
|
|
249
|
-
workingDir String
|
|
250
|
-
status String
|
|
276
|
+
workspaceKind String @default("WORKTREE")
|
|
277
|
+
workingDir String @default("")
|
|
278
|
+
status String @default("ACTIVE")
|
|
251
279
|
commitMessage String? // AI 生成的 commit message(合并时使用)
|
|
252
280
|
previewTarget String? // Preview 代理目标(仅允许 loopback 地址)
|
|
253
281
|
hibernatedAt DateTime? // 自动休眠时间
|
|
254
282
|
sessions Session[]
|
|
255
|
-
|
|
256
|
-
|
|
283
|
+
verdicts WorkspaceVerdict[]
|
|
284
|
+
createdAt DateTime @default(now())
|
|
285
|
+
updatedAt DateTime @updatedAt
|
|
257
286
|
|
|
258
287
|
@@unique([parentWorkspaceId, ownerMemberId])
|
|
259
288
|
@@index([taskId])
|
|
@@ -264,6 +293,30 @@ model Workspace {
|
|
|
264
293
|
@@index([workingDir])
|
|
265
294
|
}
|
|
266
295
|
|
|
296
|
+
// 工作区审查/测试记录
|
|
297
|
+
// WorkspaceVerdictKind: REVIEW, TEST
|
|
298
|
+
// REVIEW verdict: APPROVED, CHANGES_REQUESTED
|
|
299
|
+
// TEST verdict: PASSED, FAILED
|
|
300
|
+
model WorkspaceVerdict {
|
|
301
|
+
id String @id @default(uuid())
|
|
302
|
+
workspaceId String
|
|
303
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
304
|
+
teamRunId String
|
|
305
|
+
teamRun TeamRun @relation(fields: [teamRunId], references: [id], onDelete: Cascade)
|
|
306
|
+
kind String
|
|
307
|
+
verdict String
|
|
308
|
+
reviewedSha String
|
|
309
|
+
reviewerMemberId String?
|
|
310
|
+
reason String?
|
|
311
|
+
sequence Int @default(0)
|
|
312
|
+
createdAt DateTime @default(now())
|
|
313
|
+
|
|
314
|
+
@@index([workspaceId, kind, createdAt])
|
|
315
|
+
@@index([workspaceId, kind, sequence])
|
|
316
|
+
@@index([teamRunId])
|
|
317
|
+
@@index([reviewerMemberId])
|
|
318
|
+
}
|
|
319
|
+
|
|
267
320
|
// 独立对话:不绑定 Project/Task/Workspace,仅复用 Session 执行链路
|
|
268
321
|
model Conversation {
|
|
269
322
|
id String @id @default(uuid())
|
|
@@ -351,6 +404,17 @@ model AppSettings {
|
|
|
351
404
|
commitMessagePrompt String?
|
|
352
405
|
}
|
|
353
406
|
|
|
407
|
+
// 访问密码配置 (单例,只有一行)
|
|
408
|
+
model AccessAuthSettings {
|
|
409
|
+
id String @id @default("singleton")
|
|
410
|
+
enabled Boolean @default(false)
|
|
411
|
+
passwordHash String?
|
|
412
|
+
sessionSecret String
|
|
413
|
+
passwordUpdatedAt DateTime?
|
|
414
|
+
createdAt DateTime @default(now())
|
|
415
|
+
updatedAt DateTime @updatedAt
|
|
416
|
+
}
|
|
417
|
+
|
|
354
418
|
// 通知配置 (单例,只有一行)
|
|
355
419
|
// thirdPartyChannel: none, feishu
|
|
356
420
|
model NotificationSettings {
|
|
@@ -254,6 +254,13 @@ exports.Prisma.WorkRequestScalarFieldEnum = {
|
|
|
254
254
|
requesterMemberId: 'requesterMemberId',
|
|
255
255
|
requesterType: 'requesterType',
|
|
256
256
|
targetMemberId: 'targetMemberId',
|
|
257
|
+
targetKind: 'targetKind',
|
|
258
|
+
targetPurpose: 'targetPurpose',
|
|
259
|
+
targetSourceWorkspaceId: 'targetSourceWorkspaceId',
|
|
260
|
+
targetSourceMemberId: 'targetSourceMemberId',
|
|
261
|
+
targetHeadSha: 'targetHeadSha',
|
|
262
|
+
targetBranchName: 'targetBranchName',
|
|
263
|
+
targetPlanItemId: 'targetPlanItemId',
|
|
257
264
|
triggerMessageId: 'triggerMessageId',
|
|
258
265
|
instruction: 'instruction',
|
|
259
266
|
ifBusy: 'ifBusy',
|
|
@@ -270,9 +277,24 @@ exports.Prisma.AgentInvocationScalarFieldEnum = {
|
|
|
270
277
|
memberId: 'memberId',
|
|
271
278
|
workspaceId: 'workspaceId',
|
|
272
279
|
sessionId: 'sessionId',
|
|
280
|
+
targetKind: 'targetKind',
|
|
281
|
+
targetPurpose: 'targetPurpose',
|
|
282
|
+
targetSourceWorkspaceId: 'targetSourceWorkspaceId',
|
|
283
|
+
targetSourceMemberId: 'targetSourceMemberId',
|
|
284
|
+
targetHeadSha: 'targetHeadSha',
|
|
285
|
+
targetBranchName: 'targetBranchName',
|
|
286
|
+
targetPlanItemId: 'targetPlanItemId',
|
|
287
|
+
targetSyncStatus: 'targetSyncStatus',
|
|
288
|
+
targetSyncError: 'targetSyncError',
|
|
289
|
+
targetExecutionBranch: 'targetExecutionBranch',
|
|
290
|
+
targetPort: 'targetPort',
|
|
291
|
+
targetVitePort: 'targetVitePort',
|
|
292
|
+
targetE2EPort: 'targetE2EPort',
|
|
273
293
|
status: 'status',
|
|
274
294
|
roomReplyReminderCount: 'roomReplyReminderCount',
|
|
275
295
|
nextRoomReplyReminderAt: 'nextRoomReplyReminderAt',
|
|
296
|
+
lastHeartbeatAt: 'lastHeartbeatAt',
|
|
297
|
+
firstNudgeAt: 'firstNudgeAt',
|
|
276
298
|
createdAt: 'createdAt',
|
|
277
299
|
updatedAt: 'updatedAt'
|
|
278
300
|
};
|
|
@@ -295,6 +317,19 @@ exports.Prisma.WorkspaceScalarFieldEnum = {
|
|
|
295
317
|
updatedAt: 'updatedAt'
|
|
296
318
|
};
|
|
297
319
|
|
|
320
|
+
exports.Prisma.WorkspaceVerdictScalarFieldEnum = {
|
|
321
|
+
id: 'id',
|
|
322
|
+
workspaceId: 'workspaceId',
|
|
323
|
+
teamRunId: 'teamRunId',
|
|
324
|
+
kind: 'kind',
|
|
325
|
+
verdict: 'verdict',
|
|
326
|
+
reviewedSha: 'reviewedSha',
|
|
327
|
+
reviewerMemberId: 'reviewerMemberId',
|
|
328
|
+
reason: 'reason',
|
|
329
|
+
sequence: 'sequence',
|
|
330
|
+
createdAt: 'createdAt'
|
|
331
|
+
};
|
|
332
|
+
|
|
298
333
|
exports.Prisma.ConversationScalarFieldEnum = {
|
|
299
334
|
id: 'id',
|
|
300
335
|
title: 'title',
|
|
@@ -356,6 +391,16 @@ exports.Prisma.AppSettingsScalarFieldEnum = {
|
|
|
356
391
|
commitMessagePrompt: 'commitMessagePrompt'
|
|
357
392
|
};
|
|
358
393
|
|
|
394
|
+
exports.Prisma.AccessAuthSettingsScalarFieldEnum = {
|
|
395
|
+
id: 'id',
|
|
396
|
+
enabled: 'enabled',
|
|
397
|
+
passwordHash: 'passwordHash',
|
|
398
|
+
sessionSecret: 'sessionSecret',
|
|
399
|
+
passwordUpdatedAt: 'passwordUpdatedAt',
|
|
400
|
+
createdAt: 'createdAt',
|
|
401
|
+
updatedAt: 'updatedAt'
|
|
402
|
+
};
|
|
403
|
+
|
|
359
404
|
exports.Prisma.NotificationSettingsScalarFieldEnum = {
|
|
360
405
|
id: 'id',
|
|
361
406
|
osNotificationEnabled: 'osNotificationEnabled',
|
|
@@ -391,12 +436,14 @@ exports.Prisma.ModelName = {
|
|
|
391
436
|
WorkRequest: 'WorkRequest',
|
|
392
437
|
AgentInvocation: 'AgentInvocation',
|
|
393
438
|
Workspace: 'Workspace',
|
|
439
|
+
WorkspaceVerdict: 'WorkspaceVerdict',
|
|
394
440
|
Conversation: 'Conversation',
|
|
395
441
|
Session: 'Session',
|
|
396
442
|
ExecutionProcess: 'ExecutionProcess',
|
|
397
443
|
ExecutionLog: 'ExecutionLog',
|
|
398
444
|
Attachment: 'Attachment',
|
|
399
445
|
AppSettings: 'AppSettings',
|
|
446
|
+
AccessAuthSettings: 'AccessAuthSettings',
|
|
400
447
|
NotificationSettings: 'NotificationSettings'
|
|
401
448
|
};
|
|
402
449
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "WorkspaceVerdict" (
|
|
3
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
4
|
+
"workspaceId" TEXT NOT NULL,
|
|
5
|
+
"teamRunId" TEXT NOT NULL,
|
|
6
|
+
"kind" TEXT NOT NULL,
|
|
7
|
+
"verdict" TEXT NOT NULL,
|
|
8
|
+
"reviewedSha" TEXT NOT NULL,
|
|
9
|
+
"reviewerMemberId" TEXT,
|
|
10
|
+
"reason" TEXT,
|
|
11
|
+
"sequence" INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
CONSTRAINT "WorkspaceVerdict_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
|
14
|
+
CONSTRAINT "WorkspaceVerdict_teamRunId_fkey" FOREIGN KEY ("teamRunId") REFERENCES "TeamRun" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
-- CreateIndex
|
|
18
|
+
CREATE INDEX "WorkspaceVerdict_workspaceId_kind_createdAt_idx" ON "WorkspaceVerdict"("workspaceId", "kind", "createdAt");
|
|
19
|
+
|
|
20
|
+
-- CreateIndex
|
|
21
|
+
CREATE INDEX "WorkspaceVerdict_workspaceId_kind_sequence_idx" ON "WorkspaceVerdict"("workspaceId", "kind", "sequence");
|
|
22
|
+
|
|
23
|
+
-- CreateIndex
|
|
24
|
+
CREATE INDEX "WorkspaceVerdict_teamRunId_idx" ON "WorkspaceVerdict"("teamRunId");
|
|
25
|
+
|
|
26
|
+
-- CreateIndex
|
|
27
|
+
CREATE INDEX "WorkspaceVerdict_reviewerMemberId_idx" ON "WorkspaceVerdict"("reviewerMemberId");
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
CREATE TABLE "AccessAuthSettings" (
|
|
2
|
+
"id" TEXT NOT NULL PRIMARY KEY DEFAULT 'singleton',
|
|
3
|
+
"enabled" BOOLEAN NOT NULL DEFAULT false,
|
|
4
|
+
"passwordHash" TEXT,
|
|
5
|
+
"sessionSecret" TEXT NOT NULL,
|
|
6
|
+
"passwordUpdatedAt" DATETIME,
|
|
7
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
8
|
+
"updatedAt" DATETIME NOT NULL
|
|
9
|
+
);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
-- AlterTable
|
|
2
|
+
ALTER TABLE "WorkRequest" ADD COLUMN "targetKind" TEXT;
|
|
3
|
+
ALTER TABLE "WorkRequest" ADD COLUMN "targetPurpose" TEXT;
|
|
4
|
+
ALTER TABLE "WorkRequest" ADD COLUMN "targetSourceWorkspaceId" TEXT;
|
|
5
|
+
ALTER TABLE "WorkRequest" ADD COLUMN "targetSourceMemberId" TEXT;
|
|
6
|
+
ALTER TABLE "WorkRequest" ADD COLUMN "targetHeadSha" TEXT;
|
|
7
|
+
ALTER TABLE "WorkRequest" ADD COLUMN "targetBranchName" TEXT;
|
|
8
|
+
ALTER TABLE "WorkRequest" ADD COLUMN "targetPlanItemId" TEXT;
|
|
9
|
+
|
|
10
|
+
-- AlterTable
|
|
11
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetKind" TEXT;
|
|
12
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetPurpose" TEXT;
|
|
13
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetSourceWorkspaceId" TEXT;
|
|
14
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetSourceMemberId" TEXT;
|
|
15
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetHeadSha" TEXT;
|
|
16
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetBranchName" TEXT;
|
|
17
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetPlanItemId" TEXT;
|
|
18
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetSyncStatus" TEXT;
|
|
19
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetSyncError" TEXT;
|
|
20
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetExecutionBranch" TEXT;
|
|
21
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetPort" INTEGER;
|
|
22
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetVitePort" INTEGER;
|
|
23
|
+
ALTER TABLE "AgentInvocation" ADD COLUMN "targetE2EPort" INTEGER;
|
|
24
|
+
|
|
25
|
+
-- CreateIndex
|
|
26
|
+
CREATE INDEX "WorkRequest_targetSourceWorkspaceId_idx" ON "WorkRequest"("targetSourceWorkspaceId");
|
|
27
|
+
|
|
28
|
+
-- CreateIndex
|
|
29
|
+
CREATE INDEX "WorkRequest_targetHeadSha_idx" ON "WorkRequest"("targetHeadSha");
|
|
30
|
+
|
|
31
|
+
-- CreateIndex
|
|
32
|
+
CREATE INDEX "AgentInvocation_targetSourceWorkspaceId_idx" ON "AgentInvocation"("targetSourceWorkspaceId");
|
|
33
|
+
|
|
34
|
+
-- CreateIndex
|
|
35
|
+
CREATE INDEX "AgentInvocation_targetHeadSha_idx" ON "AgentInvocation"("targetHeadSha");
|
|
36
|
+
|
|
37
|
+
-- CreateIndex
|
|
38
|
+
CREATE INDEX "AgentInvocation_targetSyncStatus_idx" ON "AgentInvocation"("targetSyncStatus");
|
package/prisma/schema.prisma
CHANGED
|
@@ -121,6 +121,7 @@ model TeamRun {
|
|
|
121
121
|
messages RoomMessage[]
|
|
122
122
|
workRequests WorkRequest[]
|
|
123
123
|
invocations AgentInvocation[]
|
|
124
|
+
verdicts WorkspaceVerdict[]
|
|
124
125
|
|
|
125
126
|
@@index([mainWorkspaceId])
|
|
126
127
|
}
|
|
@@ -196,6 +197,13 @@ model WorkRequest {
|
|
|
196
197
|
requesterMemberId String?
|
|
197
198
|
requesterType String
|
|
198
199
|
targetMemberId String
|
|
200
|
+
targetKind String?
|
|
201
|
+
targetPurpose String?
|
|
202
|
+
targetSourceWorkspaceId String?
|
|
203
|
+
targetSourceMemberId String?
|
|
204
|
+
targetHeadSha String?
|
|
205
|
+
targetBranchName String?
|
|
206
|
+
targetPlanItemId String?
|
|
199
207
|
triggerMessageId String
|
|
200
208
|
instruction String
|
|
201
209
|
ifBusy String @default("queue")
|
|
@@ -206,6 +214,8 @@ model WorkRequest {
|
|
|
206
214
|
|
|
207
215
|
@@index([teamRunId])
|
|
208
216
|
@@index([targetMemberId])
|
|
217
|
+
@@index([targetSourceWorkspaceId])
|
|
218
|
+
@@index([targetHeadSha])
|
|
209
219
|
@@index([status])
|
|
210
220
|
}
|
|
211
221
|
|
|
@@ -217,15 +227,33 @@ model AgentInvocation {
|
|
|
217
227
|
memberId String
|
|
218
228
|
workspaceId String?
|
|
219
229
|
sessionId String?
|
|
230
|
+
targetKind String?
|
|
231
|
+
targetPurpose String?
|
|
232
|
+
targetSourceWorkspaceId String?
|
|
233
|
+
targetSourceMemberId String?
|
|
234
|
+
targetHeadSha String?
|
|
235
|
+
targetBranchName String?
|
|
236
|
+
targetPlanItemId String?
|
|
237
|
+
targetSyncStatus String?
|
|
238
|
+
targetSyncError String?
|
|
239
|
+
targetExecutionBranch String?
|
|
240
|
+
targetPort Int?
|
|
241
|
+
targetVitePort Int?
|
|
242
|
+
targetE2EPort Int?
|
|
220
243
|
status String @default("QUEUED")
|
|
221
244
|
roomReplyReminderCount Int @default(0)
|
|
222
245
|
nextRoomReplyReminderAt DateTime?
|
|
246
|
+
lastHeartbeatAt DateTime? // 最近一次真实进展(session:patch / room message)时间,心跳 watchdog 比对用
|
|
247
|
+
firstNudgeAt DateTime? // 首次心跳唤醒时间,作为绝对兜底起点(收到 room message 或终态时清空)
|
|
223
248
|
createdAt DateTime @default(now())
|
|
224
249
|
updatedAt DateTime @updatedAt
|
|
225
250
|
|
|
226
251
|
@@index([teamRunId])
|
|
227
252
|
@@index([memberId])
|
|
228
253
|
@@index([sessionId])
|
|
254
|
+
@@index([targetSourceWorkspaceId])
|
|
255
|
+
@@index([targetHeadSha])
|
|
256
|
+
@@index([targetSyncStatus])
|
|
229
257
|
@@index([status])
|
|
230
258
|
}
|
|
231
259
|
|
|
@@ -252,6 +280,7 @@ model Workspace {
|
|
|
252
280
|
previewTarget String? // Preview 代理目标(仅允许 loopback 地址)
|
|
253
281
|
hibernatedAt DateTime? // 自动休眠时间
|
|
254
282
|
sessions Session[]
|
|
283
|
+
verdicts WorkspaceVerdict[]
|
|
255
284
|
createdAt DateTime @default(now())
|
|
256
285
|
updatedAt DateTime @updatedAt
|
|
257
286
|
|
|
@@ -264,6 +293,30 @@ model Workspace {
|
|
|
264
293
|
@@unique([parentWorkspaceId, ownerMemberId])
|
|
265
294
|
}
|
|
266
295
|
|
|
296
|
+
// 工作区审查/测试记录
|
|
297
|
+
// WorkspaceVerdictKind: REVIEW, TEST
|
|
298
|
+
// REVIEW verdict: APPROVED, CHANGES_REQUESTED
|
|
299
|
+
// TEST verdict: PASSED, FAILED
|
|
300
|
+
model WorkspaceVerdict {
|
|
301
|
+
id String @id @default(uuid())
|
|
302
|
+
workspaceId String
|
|
303
|
+
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
304
|
+
teamRunId String
|
|
305
|
+
teamRun TeamRun @relation(fields: [teamRunId], references: [id], onDelete: Cascade)
|
|
306
|
+
kind String
|
|
307
|
+
verdict String
|
|
308
|
+
reviewedSha String
|
|
309
|
+
reviewerMemberId String?
|
|
310
|
+
reason String?
|
|
311
|
+
sequence Int @default(0)
|
|
312
|
+
createdAt DateTime @default(now())
|
|
313
|
+
|
|
314
|
+
@@index([workspaceId, kind, createdAt])
|
|
315
|
+
@@index([workspaceId, kind, sequence])
|
|
316
|
+
@@index([teamRunId])
|
|
317
|
+
@@index([reviewerMemberId])
|
|
318
|
+
}
|
|
319
|
+
|
|
267
320
|
// 独立对话:不绑定 Project/Task/Workspace,仅复用 Session 执行链路
|
|
268
321
|
model Conversation {
|
|
269
322
|
id String @id @default(uuid())
|
|
@@ -351,6 +404,17 @@ model AppSettings {
|
|
|
351
404
|
commitMessagePrompt String?
|
|
352
405
|
}
|
|
353
406
|
|
|
407
|
+
// 访问密码配置 (单例,只有一行)
|
|
408
|
+
model AccessAuthSettings {
|
|
409
|
+
id String @id @default("singleton")
|
|
410
|
+
enabled Boolean @default(false)
|
|
411
|
+
passwordHash String?
|
|
412
|
+
sessionSecret String
|
|
413
|
+
passwordUpdatedAt DateTime?
|
|
414
|
+
createdAt DateTime @default(now())
|
|
415
|
+
updatedAt DateTime @updatedAt
|
|
416
|
+
}
|
|
417
|
+
|
|
354
418
|
// 通知配置 (单例,只有一行)
|
|
355
419
|
// thirdPartyChannel: none, feishu
|
|
356
420
|
model NotificationSettings {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as q,j as e,u as ce,r as n,aa as Re,O as Ye,x as Ge,y as Ve,$ as le,P as Ae,h as b,X as Xe,ab as Ze,ac as Je,ad as Qe}from"./index-7nw4fV42.js";import{W as L,u as et,A as tt}from"./mermaid-NOHMQCX5-B42ziicV.js";import{A as se}from"./AgentLogo-ThhvSi7G.js";import{C as re}from"./chevron-down--B7iZqBL.js";import{C as X}from"./check-D2WWIhwV.js";import{M as ze}from"./MemberAvatar-Y_pJlw-N.js";import{u as st}from"./use-providers-erJ2iHLz.js";import{P as rt}from"./trash-2-B7GFt5Wl.js";import{P as nt}from"./useNormalizedLogs-CXAn7xj_.js";import{F as ot}from"./folder-u7fKAtz_.js";const at=[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]],Ot=q("arrow-down",at);const it=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],lt=q("arrow-up",it);const ct=[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]],dt=q("gauge",ct);const ut=[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]],mt=q("git-branch",ut);const ft=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Pt=q("search",ft);const xt=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],pt=q("shield",xt);const gt=[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]],Ft=q("square-pen",gt);const ht=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],bt=q("zap",ht);function be({content:a,children:c,className:d="",side:l="top"}){const j=l==="bottom"?"top-full mt-2":"bottom-full mb-2",v=l==="bottom"?"bottom-full border-b-neutral-900":"top-full border-t-neutral-900";return e.jsxs("div",{className:`group/tooltip relative inline-block ${d}`,children:[c,e.jsxs("div",{className:`invisible absolute ${j} left-1/2 -translate-x-1/2 max-w-[260px] px-3 py-2 bg-neutral-900 text-white text-xs leading-relaxed rounded-lg opacity-0 group-hover/tooltip:visible group-hover/tooltip:opacity-100 group-focus-within/tooltip:visible group-focus-within/tooltip:opacity-100 transition-opacity pointer-events-none whitespace-normal z-[100] shadow-lg`,children:[a,e.jsx("div",{className:`absolute ${v} left-1/2 -translate-x-1/2 border-4 border-transparent`})]})]})}function ie(a){return a>=1e6?`${(a/1e6).toFixed(1)}M`:a>=1e3?`${(a/1e3).toFixed(1)}K`:a.toString()}function vt(a){return a>=.9?"text-red-500":a>=.7?"text-amber-500":"text-neutral-400"}function Bt({usage:a,tooltipSide:c="top"}){const{t:d}=ce();if(!a)return null;const l=a.modelContextWindow,j=l?a.totalTokens/l:0,v=l?Math.min(Math.round(j*100),100):null,u=l?vt(j):"text-neutral-400",y=l?e.jsx("span",{children:d("上下文: {used} / {max} tokens",{used:ie(a.totalTokens),max:ie(l)})}):e.jsx("span",{children:d("已使用: {used} tokens",{used:ie(a.totalTokens)})});return e.jsx(be,{content:y,side:c,children:e.jsxs("div",{className:"flex items-center gap-1.5 px-2 py-1.5 text-xs rounded-lg hover:bg-neutral-100 transition-colors cursor-default select-none",children:[e.jsx(dt,{size:14,className:u}),e.jsxs("span",{className:`tabular-nums ${u}`,children:[ie(a.totalTokens),v!==null&&e.jsxs("span",{className:"text-neutral-300 ml-0.5",children:["/ ",v,"%"]})]})]})})}const Nt={damping:.7,stiffness:.05,mass:1.25},jt=70,yt=1e3/60,kt=350;let de=!1;globalThis.document?.addEventListener("mousedown",()=>{de=!0});globalThis.document?.addEventListener("mouseup",()=>{de=!1});globalThis.document?.addEventListener("click",()=>{de=!1});const $t=(a={})=>{const[c,d]=n.useState(!1),[l,j]=n.useState(a.initial!==!1),[v,u]=n.useState(!1),y=n.useRef(null);y.current=a;const f=n.useCallback(()=>{if(!de)return!1;const o=window.getSelection();if(!o||!o.rangeCount)return!1;const m=o.getRangeAt(0);return m.commonAncestorContainer.contains(g.current)||g.current?.contains(m.commonAncestorContainer)},[]),N=n.useCallback(o=>{t.isAtBottom=o,j(o)},[]),x=n.useCallback(o=>{t.escapedFromLock=o,d(o)},[]),t=n.useMemo(()=>{let o;return{escapedFromLock:c,isAtBottom:l,resizeDifference:0,accumulated:0,velocity:0,listeners:new Set,get scrollTop(){return g.current?.scrollTop??0},set scrollTop(m){g.current&&(g.current.scrollTop=m,t.ignoreScrollToTop=g.current.scrollTop)},get targetScrollTop(){return!g.current||!F.current?0:g.current.scrollHeight-1-g.current.clientHeight},get calculatedTargetScrollTop(){if(!g.current||!F.current)return 0;const{targetScrollTop:m}=this;if(!a.targetScrollTop)return m;if(o?.targetScrollTop===m)return o.calculatedScrollTop;const p=Math.max(Math.min(a.targetScrollTop(m,{scrollElement:g.current,contentElement:F.current}),m),0);return o={targetScrollTop:m,calculatedScrollTop:p},requestAnimationFrame(()=>{o=void 0}),p},get scrollDifference(){return this.calculatedTargetScrollTop-this.scrollTop},get isNearBottom(){return this.scrollDifference<=jt}}},[]),P=n.useCallback((o={})=>{typeof o=="string"&&(o={animation:o}),o.preserveScrollPosition||N(!0);const m=Date.now()+(Number(o.wait)||0),p=he(y.current,o.animation),{ignoreEscapes:w=!1}=o;let R,A=t.calculatedTargetScrollTop;o.duration instanceof Promise?o.duration.finally(()=>{R=Date.now()}):R=m+(o.duration??0);const M=async()=>{const H=new Promise(requestAnimationFrame).then(()=>{if(!t.isAtBottom)return t.animation=void 0,!1;const{scrollTop:z}=t,Y=performance.now(),U=(Y-(t.lastTick??Y))/yt;if(t.animation||(t.animation={behavior:p,promise:H,ignoreEscapes:w}),t.animation.behavior===p&&(t.lastTick=Y),f()||m>Date.now())return M();if(z<Math.min(A,t.calculatedTargetScrollTop)){if(t.animation?.behavior===p){if(p==="instant")return t.scrollTop=t.calculatedTargetScrollTop,M();t.velocity=(p.damping*t.velocity+p.stiffness*t.scrollDifference)/p.mass,t.accumulated+=t.velocity*U,t.scrollTop+=t.accumulated,t.scrollTop!==z&&(t.accumulated=0)}return M()}return R>Date.now()?(A=t.calculatedTargetScrollTop,M()):(t.animation=void 0,t.scrollTop<t.calculatedTargetScrollTop?P({animation:he(y.current,y.current.resize),ignoreEscapes:w,duration:Math.max(0,R-Date.now())||void 0}):t.isAtBottom)});return H.then(z=>(requestAnimationFrame(()=>{t.animation||(t.lastTick=void 0,t.velocity=0)}),z))};return o.wait!==!0&&(t.animation=void 0),t.animation?.behavior===p?t.animation.promise:M()},[N,f,t]),i=n.useCallback(()=>{x(!0),N(!1)},[x,N]),O=n.useCallback(({target:o})=>{if(o!==g.current)return;const{scrollTop:m,ignoreScrollToTop:p}=t;let{lastScrollTop:w=m}=t;t.lastScrollTop=m,t.ignoreScrollToTop=void 0,p&&p>m&&(w=p),u(t.isNearBottom),setTimeout(()=>{if(t.resizeDifference||m===p)return;if(f()){x(!0),N(!1);return}const R=m>w,A=m<w;if(t.animation?.ignoreEscapes){t.scrollTop=w;return}A&&(x(!0),N(!1)),R&&x(!1),!t.escapedFromLock&&t.isNearBottom&&N(!0)},1)},[x,N,f,t]),K=n.useCallback(({target:o,deltaY:m})=>{let p=o;for(;!["scroll","auto"].includes(getComputedStyle(p).overflow);){if(!p.parentElement)return;p=p.parentElement}p===g.current&&m<0&&g.current.scrollHeight>g.current.clientHeight&&!t.animation?.ignoreEscapes&&(x(!0),N(!1))},[x,N,t]),g=Ie(o=>{g.current?.removeEventListener("scroll",O),g.current?.removeEventListener("wheel",K),o?.addEventListener("scroll",O,{passive:!0}),o?.addEventListener("wheel",K,{passive:!0})},[]),F=Ie(o=>{if(t.resizeObserver?.disconnect(),!o)return;let m;t.resizeObserver=new ResizeObserver(([p])=>{const{height:w}=p.contentRect,R=w-(m??w);if(t.resizeDifference=R,t.scrollTop>t.targetScrollTop&&(t.scrollTop=t.targetScrollTop),u(t.isNearBottom),R>=0){const A=he(y.current,m?y.current.resize:y.current.initial);P({animation:A,wait:!0,preserveScrollPosition:!0,duration:A==="instant"?void 0:kt})}else t.isNearBottom&&(x(!1),N(!0));m=w,requestAnimationFrame(()=>{setTimeout(()=>{t.resizeDifference===R&&(t.resizeDifference=0)},1)})}),t.resizeObserver?.observe(o)},[]);return{contentRef:F,scrollRef:g,scrollToBottom:P,stopScroll:i,isAtBottom:l||v,isNearBottom:v,escapedFromLock:c,state:t}};function Ie(a,c){const d=n.useCallback(l=>(d.current=l,a(l)),c);return d}const ge=new Map;function he(...a){const c={...Nt};let d=!1;for(const j of a){if(j==="instant"){d=!0;continue}typeof j=="object"&&(d=!1,c.damping=j.damping??c.damping,c.stiffness=j.stiffness??c.stiffness,c.mass=j.mass??c.mass)}const l=JSON.stringify(c);return ge.has(l)||ge.set(l,Object.freeze(c)),d?"instant":ge.get(l)}function Ut({providers:a,currentProviderId:c,agentType:d,onSelect:l}){const{t:j}=ce(),[v,u]=n.useState(!1),y=n.useRef(null),f=a.filter(x=>String(x.provider.agentType)===d),N=a.find(x=>x.provider.id===c);return n.useEffect(()=>{function x(t){y.current&&!y.current.contains(t.target)&&u(!1)}if(v)return document.addEventListener("mousedown",x),()=>document.removeEventListener("mousedown",x)},[v]),f.length<=1?e.jsxs("div",{className:"flex items-center gap-1 text-xs text-neutral-400 px-2 py-1.5 select-none cursor-default",children:[e.jsx(se,{agentType:N?.provider.agentType??d,className:"size-3.5"}),e.jsx("span",{className:"min-w-0 truncate",children:N?.provider.name?Re(N.provider.name,12):d})]}):e.jsxs("div",{className:"relative",ref:y,children:[e.jsxs("button",{onClick:()=>u(!v),className:"flex items-center gap-1 text-xs px-2 py-1.5 rounded-lg transition-colors cursor-pointer hover:bg-neutral-100 text-neutral-400 hover:text-neutral-600",title:`Provider: ${N?.provider.name??d} (click to change)`,children:[e.jsx(se,{agentType:N?.provider.agentType??d,className:"size-3.5"}),e.jsx("span",{className:"min-w-0 truncate",children:N?.provider.name?Re(N.provider.name,12):d}),e.jsx(re,{size:12,className:`shrink-0 transition-transform ${v?"rotate-180":""}`})]}),v&&e.jsxs("div",{className:"absolute bottom-full right-0 mb-1 bg-white rounded-lg border border-neutral-200 shadow-lg py-1 min-w-[160px] z-50",children:[e.jsx("div",{className:"px-2 py-1 text-xs text-neutral-400 border-b border-neutral-100",children:j("切换渠道")}),f.map(x=>e.jsxs("button",{onClick:()=>{l(x.provider.id),u(!1)},className:`w-full flex items-center justify-between px-3 py-2 text-sm text-left hover:bg-neutral-50 transition-colors ${x.provider.id===c?"bg-blue-50 text-blue-600":"text-neutral-700"}`,children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[e.jsx(se,{agentType:x.provider.agentType,className:"size-4"}),e.jsx("span",{className:"truncate max-w-[120px]",children:x.provider.name}),x.provider.isDefault&&e.jsx("span",{className:"text-xs text-neutral-400",children:j("(默认)")})]}),x.provider.id===c&&e.jsx(X,{size:14,className:"shrink-0"})]},x.provider.id))]})]})}function Wt(a,c){return n.useMemo(()=>{for(let d=a.length-1;d>=0;d--){const l=a[d];if(l.tokenUsage&&typeof l.tokenUsage.totalTokens=="number"&&l.tokenUsage.totalTokens>0)return{totalTokens:l.tokenUsage.totalTokens,modelContextWindow:l.tokenUsage.modelContextWindow}}return c??null},[a,c])}function Le(a,c,d,l){if(d.filter(u=>u===l).length<=1)return a;const v=d.slice(0,c+1).filter(u=>u===l).length;return`${a} #${v}`}function wt(a){return Object.values(a).filter(Boolean).length}function Tt({mode:a,setMode:c,selectedTemplateId:d,setSelectedTemplateId:l,selectedMemberPresetIds:j,setSelectedMemberPresetIds:v,disabled:u=!1,compact:y=!1}){const{t:f}=ce(),{preserveDesktopSearch:N}=Ye(),[x,t]=n.useState(!1),{data:P}=st(),{data:i,isError:O,isFetching:K,isLoading:g,refetch:F}=Ge(),{data:o,isError:m,isFetching:p,isLoading:w,refetch:R}=Ve(),A=n.useMemo(()=>new Map((P??[]).map(({provider:r,availability:h})=>[r.id,r.name+(h.type==="NOT_FOUND"?f(" (不可用)"):"")])),[P,f]),M=n.useMemo(()=>new Map((i??[]).map(r=>[r.id,r])),[i]),H=n.useMemo(()=>new Map((o??[]).map(r=>[r.id,r])),[o]),z=n.useMemo(()=>j.map(r=>M.get(r)).filter(r=>!!r),[M,j]);n.useEffect(()=>{i!==void 0&&v(r=>{const h=r.filter(T=>M.has(T));return h.length===r.length&&h.every((T,_)=>T===r[_])?r:h})},[i,M,v]),n.useEffect(()=>{o!==void 0&&l(r=>!r||H.has(r)?r:null)},[l,H,o]);const Y=r=>{u||l(h=>h===r?null:r)},U=r=>{u||v(h=>[...h,r])},ue=r=>{u||v(h=>h.filter((T,_)=>_!==r))},ne=e.jsxs("section",{className:"min-w-0",children:[e.jsx("div",{className:"text-[11px] font-medium text-muted-foreground mb-1.5",children:f("团队模板")}),m?e.jsxs("div",{className:"rounded-lg bg-destructive/10 px-3 py-2.5 text-xs text-destructive",children:[e.jsx("span",{children:f("团队模板加载失败")}),e.jsx("button",{type:"button",onClick:()=>{R()},disabled:u||p,className:"ml-2 underline hover:no-underline",children:f("重试")})]}):w?e.jsxs("div",{className:"flex items-center gap-2 py-3 text-xs text-muted-foreground",children:[e.jsx(le,{size:12,className:"animate-spin"}),f("加载中...")]}):(o??[]).length===0?e.jsxs("div",{className:"rounded-lg border border-dashed border-border bg-background px-3 py-3 text-xs text-muted-foreground",children:[f("当前没有团队模板"),e.jsx(Ae,{to:N("/settings/team"),className:"ml-1.5 text-info hover:underline",children:f("去创建")})]}):e.jsx("div",{className:b("space-y-1.5",y&&"sm:grid sm:grid-cols-2 sm:gap-1.5 sm:space-y-0"),children:(o??[]).map(r=>{const h=r.id===d,T=r.members?.length??0,_=r.members?.map(B=>B.memberPresetId)??[],W=r.members?.slice(0,3).map((B,me)=>Le(B.memberPreset?.name??B.memberPresetId,me,_,B.memberPresetId)).join(", ");return e.jsx("button",{type:"button",onClick:()=>Y(r.id),disabled:u,className:b("w-full rounded-lg px-3 py-2 text-left border transition-all disabled:cursor-not-allowed disabled:opacity-60",h?"bg-background border-foreground/20 shadow-sm":"bg-background border-border/60 hover:border-border hover:bg-accent"),children:e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:b("text-xs truncate",h?"font-medium text-foreground":"text-foreground"),children:r.name}),e.jsxs("span",{className:"text-[10px] text-muted-foreground shrink-0",children:[T,f("人")]})]}),W&&e.jsx("div",{className:"mt-0.5 text-[10px] text-muted-foreground truncate",children:W})]}),h&&e.jsx(X,{size:13,className:"shrink-0 text-foreground"})]})},r.id)})})]}),Z=z.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1 mb-2",children:z.map((r,h)=>{const T=Le(r.name,h,j,r.id);return e.jsxs("div",{className:"inline-flex items-center gap-1 pl-1 pr-0.5 py-0.5 rounded-md border border-border/60 bg-background text-[10px] text-foreground",children:[e.jsx(ze,{name:r.name,avatar:r.avatar,className:"h-3.5 w-3.5 text-[7px]"}),e.jsx("span",{className:"max-w-[80px] truncate",children:T}),e.jsx("button",{type:"button",onClick:()=>ue(h),disabled:u,className:"p-0.5 text-muted-foreground hover:text-destructive disabled:opacity-30 rounded transition-colors",children:e.jsx(Xe,{size:9})})]},`${r.id}-${h}`)})}),G=O?e.jsxs("div",{className:"rounded-lg bg-destructive/10 px-3 py-2.5 text-xs text-destructive",children:[e.jsx("span",{children:f("成员预设加载失败")}),e.jsx("button",{type:"button",onClick:()=>{F()},disabled:u||K,className:"ml-2 underline hover:no-underline",children:f("重试")})]}):g?e.jsxs("div",{className:"flex items-center gap-2 py-3 text-xs text-muted-foreground",children:[e.jsx(le,{size:12,className:"animate-spin"}),f("加载中...")]}):(i??[]).length===0?e.jsxs("div",{className:"rounded-lg border border-dashed border-border bg-background px-3 py-3 text-xs text-muted-foreground",children:[f("当前没有成员预设"),e.jsx(Ae,{to:N("/settings/team"),className:"ml-1.5 text-info hover:underline",children:f("去创建")})]}):e.jsx("div",{className:"space-y-1 max-h-[180px] overflow-y-auto pr-1",children:(i??[]).map(r=>{const h=j.filter(W=>W===r.id).length,T=A.get(r.providerId)??r.providerId,_=wt(r.capabilities);return e.jsxs("button",{type:"button",onClick:()=>U(r.id),disabled:u,className:b("flex items-center gap-2 w-full px-2 py-1.5 rounded-lg text-left border border-transparent transition-all",u&&"cursor-not-allowed opacity-60","bg-background hover:bg-accent hover:border-border/60"),children:[e.jsx(ze,{name:r.name,avatar:r.avatar,className:"h-6 w-6 text-[9px] shrink-0"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-xs text-foreground truncate",children:r.name}),e.jsxs("div",{className:"text-[10px] text-muted-foreground truncate",children:[T," · ",_,"/10"]})]}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[h>0&&e.jsxs("span",{className:"text-[10px] text-foreground font-semibold",children:["×",h]}),e.jsx(rt,{size:12,className:"text-muted-foreground"})]})]},r.id)})}),J=z.length>0&&e.jsx("span",{className:"inline-flex items-center justify-center min-w-[16px] h-4 rounded-full bg-primary text-[10px] font-semibold text-primary-foreground px-1.5",children:z.length}),V=e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-[11px] font-medium text-muted-foreground shrink-0",children:f("执行模式")}),e.jsxs("div",{className:"inline-flex items-center h-7 rounded-md border border-border/70 bg-background p-0.5",children:[e.jsxs("button",{type:"button",onClick:()=>!u&&c("AUTO"),disabled:u,className:b("flex items-center gap-1.5 rounded h-full px-2.5 text-xs transition-all disabled:cursor-not-allowed disabled:opacity-50",a==="AUTO"?"bg-primary text-primary-foreground font-medium shadow-sm":"text-muted-foreground hover:text-foreground"),children:[e.jsx(bt,{size:11}),f("自动模式")]}),e.jsxs("button",{type:"button",onClick:()=>!u&&c("CONFIRM"),disabled:u,className:b("flex items-center gap-1.5 rounded h-full px-2.5 text-xs transition-all disabled:cursor-not-allowed disabled:opacity-50",a==="CONFIRM"?"bg-primary text-primary-foreground font-medium shadow-sm":"text-muted-foreground hover:text-foreground"),children:[e.jsx(pt,{size:11}),f("确认模式")]})]})]});return y?e.jsxs("div",{className:"space-y-3",children:[V,ne,e.jsxs("div",{className:"border-t border-border/50 pt-2.5",children:[e.jsxs("button",{type:"button",onClick:()=>!u&&t(r=>!r),disabled:u,"aria-expanded":x,className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground hover:text-foreground transition-colors disabled:cursor-not-allowed disabled:opacity-50",children:[e.jsx(re,{size:12,className:b("transition-transform",x?"":"-rotate-90")}),f("追加独立成员"),J]}),x&&e.jsxs("div",{className:"mt-2",children:[Z,G]})]})]}):e.jsxs("div",{className:"space-y-3.5",children:[V,e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[ne,e.jsxs("section",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1.5",children:[e.jsx("span",{className:"text-[11px] font-medium text-muted-foreground",children:f("追加成员")}),J]}),Z,G]})]})]})}function qt({className:a="h-7 w-7"}){return e.jsx("img",{src:Ze,alt:"Agent Tower",className:`block shrink-0 object-contain ${a}`})}function Kt({className:a=""}){return e.jsx("span",{className:`font-semibold text-foreground tracking-tight text-base ${a}`,children:"Agent Tower"})}const Ct={idle:"","creating-task":"Creating Task...","creating-teamrun":"Creating TeamRun...","creating-workspace":"Creating Workspace...","creating-session":"Creating Session...","starting-session":"Starting Agent..."};function Ht({variant:a="task",projects:c,providers:d,isProvidersLoading:l,onSubmit:j,defaultProjectId:v="",defaultProviderId:u="",onProjectChange:y,createStep:f,placeholder:N,submitLabel:x,pendingLabel:t,submitTitle:P}){const{t:i}=ce(),[O,K]=n.useState(""),[g,F]=n.useState(v),[o,m]=n.useState(u),[p,w]=n.useState("SOLO"),[R,A]=n.useState(L.WORKTREE),[M,H]=n.useState("AUTO"),[z,Y]=n.useState(null),[U,ue]=n.useState([]),[ne,Z]=n.useState(!1),[G,J]=n.useState(!1),[V,r]=n.useState(!1),[h,T]=n.useState(!1),_=n.useRef(null),W=n.useRef(null),B=n.useRef(null),me=n.useRef(null),ve=n.useRef(null),{files:Ne,addFiles:Q,removeFile:De,clear:je,buildMarkdownLinks:ye,getDoneAttachments:ke,isUploading:oe}=et(),C=a==="conversation",k=a==="task"||a==="conversation",_e=x??i(C?"开始":"创建");n.useEffect(()=>{F(v),y?.(v)},[v,y]),n.useEffect(()=>{m(u)},[u]),n.useEffect(()=>{if(!G)return;const s=S=>{_.current&&!_.current.contains(S.target)&&J(!1)};return document.addEventListener("mousedown",s),()=>document.removeEventListener("mousedown",s)},[G]),n.useEffect(()=>{if(!V)return;const s=S=>{W.current&&!W.current.contains(S.target)&&r(!1)};return document.addEventListener("mousedown",s),()=>document.removeEventListener("mousedown",s)},[V]),n.useEffect(()=>{if(!h)return;const s=S=>{B.current&&!B.current.contains(S.target)&&T(!1)};return document.addEventListener("mousedown",s),()=>document.removeEventListener("mousedown",s)},[h]);const ae=n.useMemo(()=>c.find(s=>s.id===g),[c,g]),fe=n.useMemo(()=>d.find(s=>s.id===o),[d,o]),Oe=ae?.isGitRepo!==!1,D=!C&&!Oe,I=D?"SOLO":p,$=D?L.MAIN_DIRECTORY:R,Pe=$===L.MAIN_DIRECTORY?i("本地模式"):i("工作树模式"),we=i("工作树隔离改动,支持 TeamRun、Merge、Rebase 和冲突解决。"),Fe=i("本地模式会直接修改项目主目录,不会自动提交,也不能使用 Merge、Rebase 或冲突解决。"),Te=i("初始化 Git 后可使用工作树模式。"),E=f!=="idle",Ce=!!z||U.length>0,ee=!E&&!oe&&O.trim().length>0&&(C?!!o:!!g&&(I==="SOLO"?!!o:Ce));n.useEffect(()=>{D&&(w("SOLO"),A(L.MAIN_DIRECTORY),Z(!1),T(!1))},[D]);const xe=n.useCallback(async()=>{if(!ee)return;const s=k?ye():"",S=k?ke().map(te=>te.id):[];try{await j({title:O.trim(),description:"",projectId:C?"":g,providerId:o,mode:C?"SOLO":I,workspaceMode:!C&&I==="SOLO"?$:L.WORKTREE,teamRunMode:C?"AUTO":M,teamTemplateId:C||D?null:z,memberPresetIds:C||D?[]:U,attachmentLinks:s,attachmentIds:S}),K(""),k&&je()}catch{}},[ee,k,ye,ke,j,O,C,g,o,I,$,M,D,z,U,je]),Be=n.useCallback(s=>{s.key==="Enter"&&!s.shiftKey&&!s.nativeEvent.isComposing&&s.nativeEvent.keyCode!==229&&(s.preventDefault(),xe())},[xe]),$e=n.useCallback(s=>{const S=s.target.files;S&&S.length>0&&Q(Array.from(S)),s.target.value=""},[Q]),Ue=n.useCallback(s=>{F(s),y?.(s),J(!1)},[y]),We=n.useCallback(s=>{if(!k)return;const S=s.clipboardData.items,te=[];for(const Me of S)if(Me.kind==="file"){const Ee=Me.getAsFile();Ee&&te.push(Ee)}te.length>0&&(s.preventDefault(),Q(te))},[Q,k]),[Se,pe]=n.useState(!1),qe=n.useCallback(s=>{k&&(s.preventDefault(),pe(!0))},[k]),Ke=n.useCallback(s=>{k&&(s.preventDefault(),pe(!1))},[k]),He=n.useCallback(s=>{if(!k)return;s.preventDefault(),pe(!1);const S=s.dataTransfer.files;S.length>0&&Q(Array.from(S))},[Q,k]);return e.jsxs("div",{className:"w-full",children:[e.jsxs("div",{className:b("relative bg-background rounded-xl border transition-colors duration-200","shadow-[0_1px_2px_rgba(0,0,0,0.05)]","hover:border-ring/40 focus-within:border-ring/60",Se?"border-info bg-info/5":"border-border",E&&"opacity-80"),onDragOver:k?qe:void 0,onDragLeave:k?Ke:void 0,onDrop:k?He:void 0,children:[k&&Ne.length>0&&e.jsx("div",{className:"px-4 pt-3",children:e.jsx(tt,{files:Ne,onRemove:De})}),e.jsx("textarea",{ref:me,value:O,onChange:s=>K(s.target.value),onKeyDown:Be,onPaste:k?We:void 0,placeholder:i(N||"Describe your task..."),disabled:E,autoFocus:!0,rows:1,className:"w-full px-4 pt-4 pb-2 bg-transparent border-none focus:outline-none resize-none text-[15px] text-foreground placeholder:text-muted-foreground/80 leading-relaxed",style:{minHeight:"76px",maxHeight:"220px",fieldSizing:"content"}}),k&&Se&&e.jsx("div",{className:"px-4 pb-2",children:e.jsx("div",{className:"flex items-center justify-center py-3 border border-dashed border-info/40 rounded-lg text-xs font-medium text-info",children:i("Drop files here")})}),e.jsxs("div",{className:"flex items-center justify-between px-2 pb-2 pt-1",children:[e.jsx("div",{className:"flex items-center gap-1",children:k?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>ve.current?.click(),disabled:E||oe,className:"p-2 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors disabled:opacity-40 disabled:cursor-not-allowed",title:i("Attach files"),children:e.jsx(nt,{size:18})}),e.jsx("input",{ref:ve,type:"file",multiple:!0,onChange:$e,className:"hidden"})]}):null}),e.jsxs("div",{className:"flex items-center gap-2",children:[k&&oe&&e.jsxs("span",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[e.jsx(le,{size:14,className:"animate-spin"}),i("Uploading...")]}),E&&e.jsxs("span",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[e.jsx(le,{size:14,className:"animate-spin"}),i(t??Ct[f])]}),!C&&!E&&!oe&&I==="TEAM"&&!Ce&&O.trim().length>0&&e.jsx("span",{className:"text-[11px] text-warning",children:i("请选择团队模板或追加成员")}),ee&&e.jsxs("span",{className:"hidden sm:inline-flex items-center gap-1 text-[11px] text-muted-foreground/80 select-none",children:[e.jsx("kbd",{className:"inline-flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded border border-border bg-muted/60 text-[10px] font-medium text-muted-foreground leading-none",children:"⏎"}),_e]}),e.jsx("button",{type:"button",onClick:xe,disabled:!ee,className:b("flex items-center justify-center size-8 rounded-lg transition-all duration-200",ee?"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm":"bg-muted text-muted-foreground/40 cursor-not-allowed"),title:i(P||"Create & Start"),children:e.jsx(lt,{size:16,strokeWidth:2.5})})]})]})]}),e.jsxs("div",{className:"flex items-center flex-wrap gap-1.5 mt-2.5 px-0.5",children:[!C&&e.jsxs("div",{className:"relative",ref:_,children:[e.jsxs("button",{type:"button",onClick:()=>{E||J(s=>!s)},disabled:E,className:b("flex items-center gap-1.5 px-2 h-7 rounded-md text-xs font-medium transition-colors","hover:bg-accent disabled:opacity-40 disabled:cursor-not-allowed",ae?"text-foreground/80":"text-muted-foreground"),children:[e.jsx(ot,{size:14,className:"shrink-0",style:{color:ae?.color??"var(--muted-foreground)"}}),e.jsx("span",{className:"max-w-[120px] truncate",children:ae?.name??i("Project")}),e.jsx(re,{size:12,className:b("text-muted-foreground transition-transform",G&&"rotate-180")})]}),G&&e.jsx("div",{className:"absolute top-full left-0 mt-1.5 w-56 bg-popover border border-border rounded-lg shadow-[0_4px_12px_rgba(0,0,0,0.06)] py-1 max-h-[240px] overflow-y-auto z-50",children:c.map(s=>e.jsxs("button",{type:"button",onClick:()=>Ue(s.id),className:"flex items-center w-full px-3 py-2 text-xs text-left hover:bg-accent transition-colors",children:[e.jsx("span",{className:"size-2 rounded-full shrink-0 mr-2",style:{backgroundColor:s.color??"var(--muted-foreground)"}}),e.jsx("span",{className:b("truncate flex-1",s.id===g?"text-foreground font-medium":"text-muted-foreground"),children:s.name}),e.jsx(X,{size:14,className:b("ml-2 shrink-0 text-foreground",s.id===g?"opacity-100":"opacity-0")})]},s.id))})]}),(C||I==="SOLO")&&e.jsxs("div",{className:"relative",ref:W,children:[e.jsxs("button",{type:"button",onClick:()=>{E||r(s=>!s)},disabled:E,className:b("flex items-center gap-1.5 px-2 h-7 rounded-md text-xs font-medium transition-colors","hover:bg-accent disabled:opacity-40 disabled:cursor-not-allowed",fe?"text-foreground/80":"text-muted-foreground"),children:[e.jsx(se,{agentType:fe?.agentType,className:"size-3.5"}),e.jsx("span",{className:"max-w-[120px] truncate",children:fe?.name??i(l?"Loading...":"Agent")}),e.jsx(re,{size:12,className:b("text-muted-foreground transition-transform",V&&"rotate-180")})]}),V&&e.jsx("div",{className:"absolute top-full left-0 mt-1.5 w-56 bg-popover border border-border rounded-lg shadow-[0_4px_12px_rgba(0,0,0,0.06)] py-1 max-h-[240px] overflow-y-auto z-50",children:d.map(s=>e.jsxs("button",{type:"button",disabled:!s.available,onClick:()=>{m(s.id),r(!1)},className:b("flex items-center w-full px-3 py-2 text-xs text-left hover:bg-accent transition-colors",!s.available&&"opacity-40 cursor-not-allowed"),children:[e.jsx(X,{size:14,className:b("mr-2 shrink-0 text-foreground",s.id===o?"opacity-100":"opacity-0")}),e.jsx(se,{agentType:s.agentType,className:"mr-2 size-3.5"}),e.jsxs("span",{className:b("min-w-0 truncate",s.id===o?"text-foreground font-medium":"text-muted-foreground"),children:[s.name,s.available?"":i(" (unavailable)")]})]},s.id))})]}),!C&&I==="SOLO"&&e.jsxs("div",{className:"relative",ref:B,children:[e.jsxs("button",{type:"button",onClick:()=>{E||T(s=>!s)},disabled:E,className:b("flex items-center gap-1.5 px-2 h-7 rounded-md text-xs font-medium transition-colors","hover:bg-accent disabled:opacity-40 disabled:cursor-not-allowed text-foreground/80"),children:[e.jsx(mt,{size:14,className:"text-muted-foreground"}),e.jsx("span",{className:"max-w-[96px] truncate",children:Pe}),e.jsx(re,{size:12,className:b("text-muted-foreground transition-transform",h&&"rotate-180")})]}),h&&e.jsxs("div",{className:"absolute top-full left-0 mt-1.5 w-72 max-w-[calc(100vw-2rem)] bg-popover border border-border rounded-lg shadow-[0_4px_12px_rgba(0,0,0,0.06)] py-1 z-50",children:[D?e.jsx(be,{side:"bottom",className:"block w-full",content:Te,children:e.jsx("div",{tabIndex:0,"aria-label":Te,className:"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60",children:e.jsxs("button",{type:"button",disabled:!0,className:"flex w-full cursor-not-allowed items-center px-3 py-2 text-left text-xs opacity-40 transition-colors",children:[e.jsx(X,{size:14,className:"mr-2 mt-0.5 shrink-0 text-foreground opacity-0"}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-muted-foreground",children:i("工作树模式")}),e.jsx("span",{className:"mt-0.5 block whitespace-normal text-[11px] leading-snug text-muted-foreground/80",children:we})]})]})})}):e.jsxs("button",{type:"button",onClick:()=>{A(L.WORKTREE),T(!1)},className:"flex w-full items-center px-3 py-2 text-left text-xs transition-colors hover:bg-accent",children:[e.jsx(X,{size:14,className:b("mr-2 mt-0.5 shrink-0 text-foreground",$===L.WORKTREE?"opacity-100":"opacity-0")}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:b("block truncate",$===L.WORKTREE?"text-foreground font-medium":"text-muted-foreground"),children:i("工作树模式")}),e.jsx("span",{className:"mt-0.5 block whitespace-normal text-[11px] leading-snug text-muted-foreground/80",children:we})]})]}),e.jsxs("button",{type:"button",onClick:()=>{A(L.MAIN_DIRECTORY),T(!1)},className:"flex items-start w-full px-3 py-2 text-xs text-left hover:bg-accent transition-colors",children:[e.jsx(X,{size:14,className:b("mr-2 mt-0.5 shrink-0 text-foreground",$===L.MAIN_DIRECTORY?"opacity-100":"opacity-0")}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:b("block truncate",$===L.MAIN_DIRECTORY?"text-foreground font-medium":"text-muted-foreground"),children:i("本地模式")}),e.jsx("span",{className:"mt-0.5 block whitespace-normal text-[11px] leading-snug text-muted-foreground/80",children:Fe})]})]})]})]}),!C&&e.jsx(be,{side:"bottom",className:"ml-auto",content:D?i("Local projects only support local Solo tasks. Initialize Git to use worktrees and TeamRun."):$===L.MAIN_DIRECTORY?i("TeamRun 需要工作树模式。开启团队模式时会自动切换为工作树模式。"):i("启用 TeamRun 后可选择团队模板或成员。"),children:e.jsxs("button",{type:"button",role:"switch","aria-checked":I==="TEAM",onClick:()=>{E||D||(p==="TEAM"?(w("SOLO"),Z(!1)):(w("TEAM"),T(!1),A(L.WORKTREE),Z(!0)))},disabled:E||D,className:b("flex items-center gap-2 h-7 pl-2 pr-2 rounded-md text-xs font-medium transition-colors","hover:bg-accent disabled:opacity-40 disabled:cursor-not-allowed","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",I==="TEAM"?"text-foreground/80":"text-muted-foreground"),"aria-label":i("启用团队模式"),children:[e.jsx(Je,{size:14,className:I==="TEAM"?"text-foreground/80":"text-muted-foreground"}),e.jsx("span",{children:i("团队模式")}),(D||$===L.MAIN_DIRECTORY)&&I!=="TEAM"?e.jsx(Qe,{size:12,className:"text-muted-foreground/70","aria-hidden":"true"}):null,e.jsx("span",{className:b("relative inline-flex h-4 w-7 shrink-0 items-center rounded-full transition-colors",I==="TEAM"?"bg-primary":"bg-border"),children:e.jsx("span",{className:b("inline-block size-3 rounded-full bg-background shadow-sm transition-transform",I==="TEAM"?"translate-x-3.5":"translate-x-0.5")})})]})})]}),!C&&I==="TEAM"&&ne&&e.jsx("div",{className:"mt-2.5 rounded-xl border border-border/60 bg-muted/40 p-3 animate-[fadeInUp_0.25s_cubic-bezier(0.16,1,0.3,1)]",children:e.jsx(Tt,{mode:M,setMode:H,selectedTemplateId:z,setSelectedTemplateId:Y,selectedMemberPresetIds:U,setSelectedMemberPresetIds:ue,disabled:E,compact:!0})})]})}export{Ot as A,qt as B,Ht as C,mt as G,Ut as P,Ft as S,Bt as T,bt as Z,Wt as a,lt as b,Kt as c,Pt as d,be as e,Tt as f,pt as g,$t as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as y,a as _,b as A,c as E,r as i,t as m,j as s,S as T,d as I,e as p,f as M,B as g}from"./index-7nw4fV42.js";import{S as v}from"./select-DFuN9DX8.js";import{T as O}from"./textarea-Lr4GZaYW.js";import{u as k}from"./use-providers-erJ2iHLz.js";import"./chevron-down--B7iZqBL.js";import"./check-D2WWIhwV.js";const L=[{value:"zh-CN",label:"简体中文"},{value:"en",label:"English"}],l="__follow_task__";function F(){const{locale:x,setLocale:S,t:e}=y(),{data:r}=_(),{data:f}=k(),{data:o}=A(),a=E(),[h,u]=i.useState(l),[c,d]=i.useState(""),[j,n]=i.useState(!1);i.useEffect(()=>{!r||!o||(u(r.commitMessageProviderId||l),d(r.commitMessagePrompt||o.prompt),n(!1))},[r,o]);const P=[{value:l,label:e("跟随任务")},...(f??[]).filter(t=>t.availability.type!=="NOT_FOUND").map(t=>({value:t.provider.id,label:t.provider.name}))],b=i.useCallback(t=>{u(t);const N=t===l?null:t;a.mutate({commitMessageProviderId:N},{onError:()=>m.error(e("保存失败"))})},[a,e]),C=i.useCallback(()=>{const t=c.trim()||null;a.mutate({commitMessagePrompt:t},{onSuccess:()=>{n(!1),m.success(e("已保存"))},onError:()=>m.error(e("保存失败"))})},[c,a,e]);return s.jsxs(T,{children:[s.jsx(I,{title:e("通用设置"),className:"mb-1"}),s.jsx("div",{className:"divide-y divide-border/60",children:s.jsx(p,{label:e("显示语言"),description:e("界面语言会保存到本地数据库,重启后继续生效。"),align:"center",children:s.jsx(v,{value:x,onChange:t=>S(t),options:L})})}),s.jsx(M,{className:"mt-8 mb-1",children:e("Git Commit Message")}),s.jsxs("div",{className:"divide-y divide-border/60",children:[s.jsx(p,{label:e("Agent 渠道"),description:e('"跟随任务"表示使用当前任务所用的 Agent 渠道。选择具体渠道可使用更经济的模型。'),children:s.jsx(v,{value:h,onChange:b,options:P})}),s.jsx(p,{label:e("提示词模板"),description:e("自定义生成 commit message 的提示词。留空则使用内置默认模板。"),children:s.jsxs("div",{className:"space-y-2",children:[s.jsx(O,{value:c,onChange:t=>{d(t.target.value),n(!0)},rows:5,className:"font-mono resize-y"}),j&&s.jsxs("div",{className:"flex items-center justify-end gap-2",children:[s.jsx(g,{size:"sm",variant:"ghost",onClick:()=>{d(r?.commitMessagePrompt||o?.prompt||""),n(!1)},children:e("取消")}),s.jsx(g,{size:"sm",onClick:C,disabled:a.isPending,children:a.isPending?e("保存中..."):e("保存")})]})]})})]})]})}export{F as GeneralSettingsPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as x,i as m,q as o,m as u,u as p,r as g,t as n,j as e,S as a,$ as f,B as i,a1 as h}from"./index-7nw4fV42.js";import{C as j}from"./copy-bJ2sut_L.js";import{C as b}from"./check-D2WWIhwV.js";const y=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],N=x("server",y);function C(){return m({queryKey:o.system.mcpConfig,queryFn:()=>u.get("/system/mcp-config")})}function v({mode:s,label:t}){const r=s==="desktop-packaged";return e.jsx("span",{className:`inline-flex items-center rounded-md px-2 py-1 text-[11px] font-medium ${r?"bg-emerald-50 text-emerald-700":"bg-amber-50 text-amber-700"}`,children:t})}function z(){const{t:s}=p(),{data:t,isLoading:r,isError:l,refetch:d}=C(),c=g.useCallback(async()=>{if(t?.configJson)try{await navigator.clipboard.writeText(t.configJson),n.success(s("MCP 配置已复制"))}catch{n.error(s("复制 MCP 配置失败"))}},[t?.configJson,s]);return r?e.jsx(a,{children:e.jsx("div",{className:"flex items-center justify-center py-20",children:e.jsx(f,{className:"h-5 w-5 animate-spin text-neutral-500"})})}):l||!t?e.jsxs(a,{children:[e.jsx("h2",{className:"mb-1 text-base font-semibold text-neutral-900",children:s("MCP 配置")}),e.jsx("div",{className:"mt-5 rounded-lg border border-red-100 bg-red-50 px-4 py-3 text-sm text-red-700",children:s("MCP 配置加载失败")}),e.jsx(i,{className:"mt-4",size:"sm",variant:"outline",onClick:()=>{d()},children:s("重试")})]}):e.jsxs(a,{children:[e.jsxs("div",{className:"mb-5 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-semibold text-neutral-900",children:s("MCP 配置")}),e.jsx("p",{className:"mt-1 text-[12px] leading-relaxed text-neutral-500",children:s("复制下面的 JSON 到支持 MCP 的客户端配置中。桌面打包版使用 App 内置 runtime,不需要全局安装 agent-tower。")})]}),e.jsxs(i,{size:"sm",onClick:c,children:[e.jsx(j,{size:14}),s("复制配置")]})]}),e.jsxs("div",{className:"space-y-3 border-b border-neutral-100 pb-5",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(v,{mode:t.runtimeMode,label:t.runtimeMode==="desktop-packaged"?s("桌面打包 runtime"):s("工作区 runtime")}),e.jsx("span",{className:"text-[12px] text-neutral-400",children:t.serverName})]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{className:"rounded-lg border border-neutral-100 bg-neutral-50/70 p-3",children:[e.jsxs("div",{className:"mb-1 flex items-center gap-1.5 text-[11px] font-medium uppercase text-neutral-400",children:[e.jsx(h,{size:12}),"Command"]}),e.jsx("div",{className:"break-all font-mono text-[12px] leading-relaxed text-neutral-800",children:t.command})]}),e.jsxs("div",{className:"rounded-lg border border-neutral-100 bg-neutral-50/70 p-3",children:[e.jsxs("div",{className:"mb-1 flex items-center gap-1.5 text-[11px] font-medium uppercase text-neutral-400",children:[e.jsx(N,{size:12}),"Entry"]}),e.jsx("div",{className:"break-all font-mono text-[12px] leading-relaxed text-neutral-800",children:t.args[0]??""})]})]})]}),e.jsxs("div",{className:"pt-5",children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between",children:[e.jsx("label",{className:"text-[12px] font-medium text-neutral-600",children:"mcpServers JSON"}),t.runtimeMode==="desktop-packaged"&&e.jsxs("span",{className:"inline-flex items-center gap-1 text-[11px] text-emerald-600",children:[e.jsx(b,{size:12}),s("无需全局 CLI")]})]}),e.jsx("textarea",{readOnly:!0,value:t.configJson,rows:14,className:"w-full resize-y rounded-lg border border-neutral-200 bg-neutral-950 px-3 py-3 font-mono text-[12px] leading-relaxed text-neutral-100 outline-none"}),e.jsx("p",{className:"mt-2 text-[11px] leading-relaxed text-neutral-400",children:s("当前版本只生成通用 MCP 配置,不会自动修改 Claude、Codex 或其他第三方客户端配置文件。")})]})]})}export{z as McpSettingsPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as P,i as q,k as E,l as k,q as v,m as h,u as R,r as o,j as e,S as g,Z as B,d as W,e as j,_ as z,B as L,$ as M,a0 as A,f as K,W as Q}from"./index-7nw4fV42.js";import{S as _}from"./select-DFuN9DX8.js";import{I as d}from"./input-CKwRYuUJ.js";import{S as O}from"./switch-gL7lBFj6.js";import{M as D}from"./message-square-Bd_m34OX.js";import{C as H}from"./circle-alert-W13JkYj3.js";import"./chevron-down--B7iZqBL.js";import"./check-D2WWIhwV.js";const Z=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]],$=P("link",Z);function G(){return q({queryKey:v.notifications.settings,queryFn:()=>h.get("/notifications/settings")})}function J(){const t=E();return k({mutationFn:i=>h.put("/notifications/settings",i),onSuccess:()=>{t.invalidateQueries({queryKey:v.notifications.settings})}})}function V(){return k({mutationFn:t=>h.post("/notifications/test",t)})}function oe(){const{t}=R(),{data:i,isLoading:y}=G(),l=J(),n=V(),N=[{value:"none",label:t("关闭")},{value:"feishu",label:t("飞书 Webhook")}],[a,x]=o.useState({webhookUrl:"",baseUrl:"",titleTemplate:"",bodyTemplate:""}),[m,p]=o.useState(!1),[f,r]=o.useState("idle"),u=o.useRef(void 0);if(o.useEffect(()=>{i&&!m&&x({webhookUrl:i.feishuWebhookUrl??"",baseUrl:i.thirdPartyBaseUrl??"",titleTemplate:i.taskInReviewTitleTemplate??"",bodyTemplate:i.taskInReviewBodyTemplate??""})},[i,m]),o.useEffect(()=>(n.isSuccess?(r("success"),u.current=setTimeout(()=>r("idle"),3e3)):n.isError&&(r("error"),u.current=setTimeout(()=>r("idle"),5e3)),()=>clearTimeout(u.current)),[n.isSuccess,n.isError]),y)return e.jsx(g,{children:e.jsx(B,{rows:3})});const T=i?.osNotificationEnabled??!0,b=i?.thirdPartyChannel??"none",c=(s,I)=>{x(F=>({...F,[s]:I})),p(!0)},S=s=>{l.mutate({osNotificationEnabled:s})},C=s=>{l.mutate({thirdPartyChannel:s})},U=()=>{l.mutate({feishuWebhookUrl:a.webhookUrl.trim()||null,thirdPartyBaseUrl:a.baseUrl.trim()||null,taskInReviewTitleTemplate:a.titleTemplate.trim()||"Agent Tower",taskInReviewBodyTemplate:a.bodyTemplate.trim()||t('✅ "{taskTitle}" 已完成,等待审查')},{onSuccess:()=>p(!1)})},w=()=>{a.webhookUrl.trim()&&n.mutate({channel:"feishu",webhookUrl:a.webhookUrl.trim(),baseUrl:a.baseUrl.trim()||void 0})};return e.jsxs(g,{children:[e.jsx(W,{title:t("通知设置"),className:"mb-1"}),e.jsxs("div",{className:"divide-y divide-border/60",children:[e.jsx(j,{icon:z,label:t("桌面通知"),description:t("任务完成时弹出系统通知"),align:"center",controlWidth:"auto",children:e.jsx(O,{checked:T,onCheckedChange:S,"aria-label":t("桌面通知")})}),e.jsxs("div",{className:"py-5",children:[e.jsx(j,{icon:D,label:t("第三方通知"),description:t("推送到外部渠道(飞书群机器人等)"),align:"center",className:"py-0",children:e.jsx(_,{value:b,onChange:s=>C(s),options:N})}),b==="feishu"&&e.jsxs("div",{className:"mt-4 space-y-4 sm:pl-11",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"feishu-webhook-url",className:"mb-1.5 block text-xs font-medium text-muted-foreground",children:"Webhook URL"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{id:"feishu-webhook-url",value:a.webhookUrl,onChange:s=>c("webhookUrl",s.target.value),placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/...",className:"min-w-0 flex-1 font-mono"}),e.jsxs(L,{size:"sm",variant:"outline",onClick:w,disabled:!a.webhookUrl.trim()||n.isPending,className:"h-auto shrink-0",children:[n.isPending&&e.jsx(M,{size:12,className:"mr-1 animate-spin motion-reduce:animate-none"}),t("测试")]})]}),f==="success"&&e.jsxs("div",{role:"status",className:"mt-2 flex items-center gap-1.5 text-xs text-success",children:[e.jsx(A,{size:12,"aria-hidden":"true"}),t("测试消息发送成功")]}),f==="error"&&e.jsxs("div",{role:"alert",className:"mt-2 flex items-center gap-1.5 text-xs text-destructive",children:[e.jsx(H,{size:12,"aria-hidden":"true"}),t("发送失败,请检查 Webhook 地址")]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"feishu-base-url",className:"mb-1.5 block text-xs font-medium text-muted-foreground",children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx($,{size:11,"aria-hidden":"true"}),t("跳转地址")]})}),e.jsx(d,{id:"feishu-base-url",value:a.baseUrl,onChange:s=>c("baseUrl",s.target.value),placeholder:"http://localhost:5173",className:"font-mono"}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:t('通知卡片中的"查看任务"按钮跳转地址前缀')})]})]})]}),e.jsxs("div",{className:"py-5",children:[e.jsxs("div",{className:"mb-4",children:[e.jsx(K,{children:t("通知模板")}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:t("支持变量: {taskTitle}, {taskId}, {projectId}, {projectName}, {status}",{taskTitle:"{taskTitle}",taskId:"{taskId}",projectId:"{projectId}",projectName:"{projectName}",status:"{status}"})})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"notification-title-template",className:"mb-1.5 block text-xs font-medium text-muted-foreground",children:t("标题")}),e.jsx(d,{id:"notification-title-template",value:a.titleTemplate,onChange:s=>c("titleTemplate",s.target.value),placeholder:"Agent Tower"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"notification-body-template",className:"mb-1.5 block text-xs font-medium text-muted-foreground",children:t("内容")}),e.jsx(d,{id:"notification-body-template",value:a.bodyTemplate,onChange:s=>c("bodyTemplate",s.target.value),placeholder:t('✅ "{taskTitle}" 已完成,等待审查')})]})]})]})]}),m&&e.jsx(Q,{saving:l.isPending,onSave:U})]})}export{oe as NotificationSettingsPage};
|