agent-tower 0.4.16-beta.0 → 0.4.16-beta.4
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.test.js +2 -0
- package/dist/app.test.js.map +1 -1
- package/dist/git/git-cli.d.ts +18 -1
- package/dist/git/git-cli.d.ts.map +1 -1
- package/dist/git/git-cli.js +17 -1
- package/dist/git/git-cli.js.map +1 -1
- package/dist/git/worktree.manager.d.ts +29 -2
- package/dist/git/worktree.manager.d.ts.map +1 -1
- package/dist/git/worktree.manager.js +137 -16
- package/dist/git/worktree.manager.js.map +1 -1
- package/dist/git/worktree.manager.test.d.ts +2 -0
- package/dist/git/worktree.manager.test.d.ts.map +1 -0
- package/dist/git/worktree.manager.test.js +104 -0
- package/dist/git/worktree.manager.test.js.map +1 -0
- package/dist/mcp/http-client.d.ts +5 -1
- package/dist/mcp/http-client.d.ts.map +1 -1
- package/dist/mcp/http-client.js +13 -3
- package/dist/mcp/http-client.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +33 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/middleware/tunnel-auth.d.ts.map +1 -1
- package/dist/middleware/tunnel-auth.js +2 -0
- package/dist/middleware/tunnel-auth.js.map +1 -1
- package/dist/output/__tests__/codex-parser.test.d.ts +2 -0
- package/dist/output/__tests__/codex-parser.test.d.ts.map +1 -0
- package/dist/output/__tests__/codex-parser.test.js +148 -0
- package/dist/output/__tests__/codex-parser.test.js.map +1 -0
- package/dist/output/codex-parser.d.ts +12 -0
- package/dist/output/codex-parser.d.ts.map +1 -1
- package/dist/output/codex-parser.js +129 -12
- package/dist/output/codex-parser.js.map +1 -1
- package/dist/routes/__tests__/attachments.test.d.ts +2 -0
- package/dist/routes/__tests__/attachments.test.d.ts.map +1 -0
- package/dist/routes/__tests__/attachments.test.js +86 -0
- package/dist/routes/__tests__/attachments.test.js.map +1 -0
- package/dist/routes/__tests__/filesystem.test.d.ts +2 -0
- package/dist/routes/__tests__/filesystem.test.d.ts.map +1 -0
- package/dist/routes/__tests__/filesystem.test.js +80 -0
- package/dist/routes/__tests__/filesystem.test.js.map +1 -0
- package/dist/routes/__tests__/previews.test.d.ts +2 -0
- package/dist/routes/__tests__/previews.test.d.ts.map +1 -0
- package/dist/routes/__tests__/previews.test.js +89 -0
- package/dist/routes/__tests__/previews.test.js.map +1 -0
- package/dist/routes/__tests__/tasks.test.d.ts +2 -0
- package/dist/routes/__tests__/tasks.test.d.ts.map +1 -0
- package/dist/routes/__tests__/tasks.test.js +72 -0
- package/dist/routes/__tests__/tasks.test.js.map +1 -0
- package/dist/routes/attachments.d.ts.map +1 -1
- package/dist/routes/attachments.js +36 -16
- package/dist/routes/attachments.js.map +1 -1
- package/dist/routes/filesystem.d.ts.map +1 -1
- package/dist/routes/filesystem.js +24 -3
- package/dist/routes/filesystem.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 +6 -0
- package/dist/routes/previews.d.ts.map +1 -0
- package/dist/routes/previews.js +413 -0
- package/dist/routes/previews.js.map +1 -0
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +1 -0
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/tasks.js +2 -2
- package/dist/routes/tasks.js.map +1 -1
- package/dist/routes/team-runs.d.ts.map +1 -1
- package/dist/routes/team-runs.js +36 -9
- package/dist/routes/team-runs.js.map +1 -1
- package/dist/routes/tunnel.d.ts.map +1 -1
- package/dist/routes/tunnel.js +20 -0
- package/dist/routes/tunnel.js.map +1 -1
- package/dist/routes/workspaces.d.ts.map +1 -1
- package/dist/routes/workspaces.js +15 -1
- package/dist/routes/workspaces.js.map +1 -1
- package/dist/services/__tests__/preview.service.test.d.ts +2 -0
- package/dist/services/__tests__/preview.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/preview.service.test.js +29 -0
- package/dist/services/__tests__/preview.service.test.js.map +1 -0
- package/dist/services/__tests__/task.service.test.d.ts +2 -0
- package/dist/services/__tests__/task.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/task.service.test.js +65 -0
- package/dist/services/__tests__/task.service.test.js.map +1 -0
- package/dist/services/__tests__/team-reconciler.service.test.js +720 -28
- package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -1
- package/dist/services/__tests__/team-run.service.test.js +416 -0
- package/dist/services/__tests__/team-run.service.test.js.map +1 -1
- package/dist/services/__tests__/team-scheduler.service.test.js +680 -26
- package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -1
- package/dist/services/__tests__/tunnel.service.test.d.ts +2 -0
- package/dist/services/__tests__/tunnel.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/tunnel.service.test.js +138 -0
- package/dist/services/__tests__/tunnel.service.test.js.map +1 -0
- package/dist/services/__tests__/workspace.service.test.d.ts +2 -0
- package/dist/services/__tests__/workspace.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/workspace.service.test.js +695 -0
- package/dist/services/__tests__/workspace.service.test.js.map +1 -0
- package/dist/services/attachment-context.d.ts +3 -0
- package/dist/services/attachment-context.d.ts.map +1 -0
- package/dist/services/attachment-context.js +34 -0
- package/dist/services/attachment-context.js.map +1 -0
- package/dist/services/preview.service.d.ts +19 -0
- package/dist/services/preview.service.d.ts.map +1 -0
- package/dist/services/preview.service.js +147 -0
- package/dist/services/preview.service.js.map +1 -0
- package/dist/services/project.service.d.ts +2 -0
- package/dist/services/project.service.d.ts.map +1 -1
- package/dist/services/project.service.js +87 -18
- package/dist/services/project.service.js.map +1 -1
- package/dist/services/session-manager.d.ts +12 -0
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/task.service.d.ts +6 -0
- package/dist/services/task.service.d.ts.map +1 -1
- package/dist/services/task.service.js +15 -3
- package/dist/services/task.service.js.map +1 -1
- package/dist/services/team-lock.service.d.ts +3 -0
- package/dist/services/team-lock.service.d.ts.map +1 -1
- package/dist/services/team-lock.service.js +11 -0
- package/dist/services/team-lock.service.js.map +1 -1
- package/dist/services/team-run.service.d.ts +34 -1
- package/dist/services/team-run.service.d.ts.map +1 -1
- package/dist/services/team-run.service.js +370 -30
- package/dist/services/team-run.service.js.map +1 -1
- package/dist/services/team-scheduler.service.d.ts +22 -1
- package/dist/services/team-scheduler.service.d.ts.map +1 -1
- package/dist/services/team-scheduler.service.js +148 -33
- package/dist/services/team-scheduler.service.js.map +1 -1
- package/dist/services/tunnel.service.d.ts +31 -5
- package/dist/services/tunnel.service.d.ts.map +1 -1
- package/dist/services/tunnel.service.js +293 -32
- package/dist/services/tunnel.service.js.map +1 -1
- package/dist/services/workspace.service.d.ts +161 -7
- package/dist/services/workspace.service.d.ts.map +1 -1
- package/dist/services/workspace.service.js +396 -51
- package/dist/services/workspace.service.js.map +1 -1
- package/dist/web/assets/{AgentDemoPage-p9YI4_l4.js → AgentDemoPage-BhDnxdmh.js} +1 -1
- package/dist/web/assets/{DemoPage-B5DTSEbS.js → DemoPage-CJBc0NZf.js} +1 -1
- package/dist/web/assets/{GeneralSettingsPage-Cspr7Vol.js → GeneralSettingsPage-CEjDPmtD.js} +1 -1
- package/dist/web/assets/MemberAvatar-DxRCLAoK.js +1 -0
- package/dist/web/assets/NotificationSettingsPage-i77lmSic.js +1 -0
- package/dist/web/assets/{ProfileSettingsPage-CNugU40a.js → ProfileSettingsPage-DcGLD5O-.js} +1 -1
- package/dist/web/assets/ProjectKanbanPage-CX-NY7hx.js +89 -0
- package/dist/web/assets/ProjectSettingsPage-BBfroQPA.js +2 -0
- package/dist/web/assets/{ProviderSettingsPage-D_KWkgRM.js → ProviderSettingsPage-BdxbO1E9.js} +12 -12
- package/dist/web/assets/TeamSettingsPage-CTWGO79W.js +1 -0
- package/dist/web/assets/agent-tower-logo-COx9gy77.png +0 -0
- package/dist/web/assets/{button-B6JaSbDB.js → button-RDdre_kF.js} +1 -1
- package/dist/web/assets/{chevron-down-CACy4UFq.js → chevron-down-Cfeapk0v.js} +1 -1
- package/dist/web/assets/{chevron-right-DFWfnDJY.js → chevron-right-BE6LVCii.js} +1 -1
- package/dist/web/assets/{chevron-up-CGlf6jzw.js → chevron-up-CEEz4jJv.js} +1 -1
- package/dist/web/assets/{circle-check-DMK8auwb.js → circle-check-0imI5gEL.js} +1 -1
- package/dist/web/assets/{code-block-OCS4YCEC-Hn75KHRK.js → code-block-OCS4YCEC-D4c9zDcq.js} +1 -1
- package/dist/web/assets/{confirm-dialog-DHI2f7Ni.js → confirm-dialog--HDqEa-R.js} +1 -1
- package/dist/web/assets/folder-picker-CKfogW-o.js +1 -0
- package/dist/web/assets/index-BHmOCKAn.css +1 -0
- package/dist/web/assets/{index-BFAA3PTl.js → index-DbGCpy8E.js} +9 -9
- package/dist/web/assets/loader-circle-BAUFMewp.js +1 -0
- package/dist/web/assets/{log-adapter-CeKrvZcz.js → log-adapter-DKKM3sxS.js} +1 -1
- package/dist/web/assets/{mermaid-NOHMQCX5-DJFgrXPd.js → mermaid-NOHMQCX5-BkaKG_2K.js} +4 -4
- package/dist/web/assets/{modal-B5IRN7QI.js → modal-3rdeMVPn.js} +1 -1
- package/dist/web/assets/{pencil-CJY6Ahn7.js → pencil-CqWv0WcO.js} +1 -1
- package/dist/web/assets/{select-BPZZlla1.js → select-DHVfUr22.js} +1 -1
- package/dist/web/assets/upload-D3aqtSCY.js +1 -0
- package/dist/web/assets/{use-profiles-C2k04ICZ.js → use-profiles-BznmWvqM.js} +1 -1
- package/dist/web/assets/{use-providers-C7fIDWzP.js → use-providers-DIHUIuEZ.js} +1 -1
- package/dist/web/avatars/presets/avatar-preset-01-developer.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-02-architect.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-03-tester.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-04-devops.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-05-data-scientist.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-06-frontend.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-07-backend.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-08-security.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-09-project-manager.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-10-product-manager.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-11-scrum-master.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-12-tech-lead.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-13-coordinator.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-14-mentor.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-15-reviewer.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-16-ui-designer.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-17-ux-researcher.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-18-documenter.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-19-translator.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-20-analyst.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-21-consultant.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-22-creative-director.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-23-support.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-24-assistant.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-25-robot.png +0 -0
- package/dist/web/avatars/presets/avatar-preset-grid.png +0 -0
- package/dist/web/index.html +2 -2
- package/node_modules/@agent-tower/shared/dist/types.d.ts +13 -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 +11 -5
- package/node_modules/@prisma/client/.prisma/client/index-browser.js +6 -0
- package/node_modules/@prisma/client/.prisma/client/index.d.ts +1309 -14
- package/node_modules/@prisma/client/.prisma/client/index.js +11 -5
- package/node_modules/@prisma/client/.prisma/client/package.json +1 -1
- package/node_modules/@prisma/client/.prisma/client/schema.prisma +70 -52
- package/node_modules/@prisma/client/.prisma/client/wasm.js +6 -0
- package/package.json +1 -1
- package/prisma/migrations/20260515000000_add_workspace_preview_target/migration.sql +2 -0
- package/prisma/migrations/20260526000000_add_team_run_main_and_dedicated_workspaces/migration.sql +21 -0
- package/prisma/migrations/20260529000000_add_team_member_queue_management_policy/migration.sql +2 -0
- package/prisma/schema.prisma +29 -11
- package/dist/web/assets/NotificationSettingsPage-C9VfrRr-.js +0 -1
- package/dist/web/assets/ProjectKanbanPage-CkGNuqxq.js +0 -87
- package/dist/web/assets/ProjectSettingsPage-f1dg0XMf.js +0 -2
- package/dist/web/assets/TeamSettingsPage-B6WciZyi.js +0 -1
- package/dist/web/assets/circle-alert-BSAUEd9O.js +0 -1
- package/dist/web/assets/folder-picker-CtQkbWfa.js +0 -1
- package/dist/web/assets/index-mBCb67dB.css +0 -1
- package/dist/web/assets/loader-circle-CkDnf8ST.js +0 -1
- package/dist/web/assets/use-projects-BxuE-ulT.js +0 -1
|
@@ -50,18 +50,19 @@ model Task {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
model MemberPreset {
|
|
53
|
-
id
|
|
54
|
-
name
|
|
55
|
-
aliases
|
|
56
|
-
providerId
|
|
57
|
-
rolePrompt
|
|
58
|
-
capabilities
|
|
59
|
-
workspacePolicy
|
|
60
|
-
triggerPolicy
|
|
61
|
-
sessionPolicy
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
53
|
+
id String @id @default(uuid())
|
|
54
|
+
name String
|
|
55
|
+
aliases String // JSON string: string[]
|
|
56
|
+
providerId String
|
|
57
|
+
rolePrompt String
|
|
58
|
+
capabilities String // JSON TeamMemberCapabilities
|
|
59
|
+
workspacePolicy String
|
|
60
|
+
triggerPolicy String
|
|
61
|
+
sessionPolicy String @default("new_per_request")
|
|
62
|
+
queueManagementPolicy String @default("own_only")
|
|
63
|
+
avatar String? // JSON or string ref
|
|
64
|
+
createdAt DateTime @default(now())
|
|
65
|
+
updatedAt DateTime @updatedAt
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
model TeamTemplate {
|
|
@@ -84,36 +85,42 @@ model TeamTemplateMember {
|
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
model TeamRun {
|
|
87
|
-
id
|
|
88
|
-
taskId
|
|
89
|
-
task
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
88
|
+
id String @id @default(uuid())
|
|
89
|
+
taskId String @unique
|
|
90
|
+
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
91
|
+
mainWorkspaceId String?
|
|
92
|
+
mainWorkspace Workspace? @relation("TeamRunMainWorkspace", fields: [mainWorkspaceId], references: [id], onDelete: SetNull)
|
|
93
|
+
mode String
|
|
94
|
+
reviewReason String?
|
|
95
|
+
createdAt DateTime @default(now())
|
|
96
|
+
updatedAt DateTime @updatedAt
|
|
97
|
+
members TeamMember[]
|
|
98
|
+
messages RoomMessage[]
|
|
99
|
+
workRequests WorkRequest[]
|
|
100
|
+
invocations AgentInvocation[]
|
|
101
|
+
|
|
102
|
+
@@index([mainWorkspaceId])
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
model TeamMember {
|
|
101
|
-
id
|
|
102
|
-
teamRunId
|
|
103
|
-
teamRun
|
|
104
|
-
presetId
|
|
105
|
-
name
|
|
106
|
-
aliases
|
|
107
|
-
providerId
|
|
108
|
-
rolePrompt
|
|
109
|
-
capabilities
|
|
110
|
-
workspacePolicy
|
|
111
|
-
triggerPolicy
|
|
112
|
-
sessionPolicy
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
106
|
+
id String @id @default(uuid())
|
|
107
|
+
teamRunId String
|
|
108
|
+
teamRun TeamRun @relation(fields: [teamRunId], references: [id], onDelete: Cascade)
|
|
109
|
+
presetId String?
|
|
110
|
+
name String
|
|
111
|
+
aliases String // JSON string: string[]
|
|
112
|
+
providerId String
|
|
113
|
+
rolePrompt String
|
|
114
|
+
capabilities String // JSON TeamMemberCapabilities
|
|
115
|
+
workspacePolicy String
|
|
116
|
+
triggerPolicy String
|
|
117
|
+
sessionPolicy String @default("new_per_request")
|
|
118
|
+
queueManagementPolicy String @default("own_only")
|
|
119
|
+
avatar String?
|
|
120
|
+
status String @default("IDLE")
|
|
121
|
+
ownedWorkspaces Workspace[] @relation("WorkspaceOwner")
|
|
122
|
+
createdAt DateTime @default(now())
|
|
123
|
+
updatedAt DateTime @updatedAt
|
|
117
124
|
|
|
118
125
|
@@index([teamRunId])
|
|
119
126
|
}
|
|
@@ -180,20 +187,31 @@ model AgentInvocation {
|
|
|
180
187
|
// 工作空间 (对应一个 git worktree)
|
|
181
188
|
// WorkspaceStatus: ACTIVE, MERGED, ABANDONED, HIBERNATED
|
|
182
189
|
model Workspace {
|
|
183
|
-
id
|
|
184
|
-
taskId
|
|
185
|
-
task
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
190
|
+
id String @id @default(uuid())
|
|
191
|
+
taskId String
|
|
192
|
+
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
193
|
+
parentWorkspaceId String?
|
|
194
|
+
parentWorkspace Workspace? @relation("WorkspaceChildren", fields: [parentWorkspaceId], references: [id], onDelete: SetNull)
|
|
195
|
+
childWorkspaces Workspace[] @relation("WorkspaceChildren")
|
|
196
|
+
ownerMemberId String?
|
|
197
|
+
ownerMember TeamMember? @relation("WorkspaceOwner", fields: [ownerMemberId], references: [id], onDelete: SetNull)
|
|
198
|
+
mainForTeamRuns TeamRun[] @relation("TeamRunMainWorkspace")
|
|
199
|
+
branchName String
|
|
200
|
+
baseBranch String?
|
|
201
|
+
worktreePath String
|
|
202
|
+
status String @default("ACTIVE")
|
|
203
|
+
commitMessage String? // AI 生成的 commit message(合并时使用)
|
|
204
|
+
previewTarget String? // Preview 代理目标(仅允许 loopback 地址)
|
|
205
|
+
hibernatedAt DateTime? // 自动休眠时间
|
|
206
|
+
sessions Session[]
|
|
207
|
+
createdAt DateTime @default(now())
|
|
208
|
+
updatedAt DateTime @updatedAt
|
|
209
|
+
|
|
210
|
+
@@unique([parentWorkspaceId, ownerMemberId])
|
|
196
211
|
@@index([taskId])
|
|
212
|
+
@@index([parentWorkspaceId])
|
|
213
|
+
@@index([ownerMemberId])
|
|
214
|
+
@@index([taskId, parentWorkspaceId])
|
|
197
215
|
}
|
|
198
216
|
|
|
199
217
|
// 会话 (一次 AI 代理执行)
|
|
@@ -157,6 +157,7 @@ exports.Prisma.MemberPresetScalarFieldEnum = {
|
|
|
157
157
|
workspacePolicy: 'workspacePolicy',
|
|
158
158
|
triggerPolicy: 'triggerPolicy',
|
|
159
159
|
sessionPolicy: 'sessionPolicy',
|
|
160
|
+
queueManagementPolicy: 'queueManagementPolicy',
|
|
160
161
|
avatar: 'avatar',
|
|
161
162
|
createdAt: 'createdAt',
|
|
162
163
|
updatedAt: 'updatedAt'
|
|
@@ -179,6 +180,7 @@ exports.Prisma.TeamTemplateMemberScalarFieldEnum = {
|
|
|
179
180
|
exports.Prisma.TeamRunScalarFieldEnum = {
|
|
180
181
|
id: 'id',
|
|
181
182
|
taskId: 'taskId',
|
|
183
|
+
mainWorkspaceId: 'mainWorkspaceId',
|
|
182
184
|
mode: 'mode',
|
|
183
185
|
reviewReason: 'reviewReason',
|
|
184
186
|
createdAt: 'createdAt',
|
|
@@ -197,6 +199,7 @@ exports.Prisma.TeamMemberScalarFieldEnum = {
|
|
|
197
199
|
workspacePolicy: 'workspacePolicy',
|
|
198
200
|
triggerPolicy: 'triggerPolicy',
|
|
199
201
|
sessionPolicy: 'sessionPolicy',
|
|
202
|
+
queueManagementPolicy: 'queueManagementPolicy',
|
|
200
203
|
avatar: 'avatar',
|
|
201
204
|
status: 'status',
|
|
202
205
|
createdAt: 'createdAt',
|
|
@@ -250,11 +253,14 @@ exports.Prisma.AgentInvocationScalarFieldEnum = {
|
|
|
250
253
|
exports.Prisma.WorkspaceScalarFieldEnum = {
|
|
251
254
|
id: 'id',
|
|
252
255
|
taskId: 'taskId',
|
|
256
|
+
parentWorkspaceId: 'parentWorkspaceId',
|
|
257
|
+
ownerMemberId: 'ownerMemberId',
|
|
253
258
|
branchName: 'branchName',
|
|
254
259
|
baseBranch: 'baseBranch',
|
|
255
260
|
worktreePath: 'worktreePath',
|
|
256
261
|
status: 'status',
|
|
257
262
|
commitMessage: 'commitMessage',
|
|
263
|
+
previewTarget: 'previewTarget',
|
|
258
264
|
hibernatedAt: 'hibernatedAt',
|
|
259
265
|
createdAt: 'createdAt',
|
|
260
266
|
updatedAt: 'updatedAt'
|
package/package.json
CHANGED
package/prisma/migrations/20260526000000_add_team_run_main_and_dedicated_workspaces/migration.sql
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
-- AlterTable
|
|
2
|
+
ALTER TABLE "TeamRun" ADD COLUMN "mainWorkspaceId" TEXT REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
3
|
+
|
|
4
|
+
-- AlterTable
|
|
5
|
+
ALTER TABLE "Workspace" ADD COLUMN "parentWorkspaceId" TEXT REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
6
|
+
ALTER TABLE "Workspace" ADD COLUMN "ownerMemberId" TEXT REFERENCES "TeamMember"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
7
|
+
|
|
8
|
+
-- CreateIndex
|
|
9
|
+
CREATE INDEX "TeamRun_mainWorkspaceId_idx" ON "TeamRun"("mainWorkspaceId");
|
|
10
|
+
|
|
11
|
+
-- CreateIndex
|
|
12
|
+
CREATE INDEX "Workspace_parentWorkspaceId_idx" ON "Workspace"("parentWorkspaceId");
|
|
13
|
+
|
|
14
|
+
-- CreateIndex
|
|
15
|
+
CREATE INDEX "Workspace_ownerMemberId_idx" ON "Workspace"("ownerMemberId");
|
|
16
|
+
|
|
17
|
+
-- CreateIndex
|
|
18
|
+
CREATE INDEX "Workspace_taskId_parentWorkspaceId_idx" ON "Workspace"("taskId", "parentWorkspaceId");
|
|
19
|
+
|
|
20
|
+
-- CreateIndex
|
|
21
|
+
CREATE UNIQUE INDEX "Workspace_parentWorkspaceId_ownerMemberId_key" ON "Workspace"("parentWorkspaceId", "ownerMemberId");
|
package/prisma/schema.prisma
CHANGED
|
@@ -59,6 +59,7 @@ model MemberPreset {
|
|
|
59
59
|
workspacePolicy String
|
|
60
60
|
triggerPolicy String
|
|
61
61
|
sessionPolicy String @default("new_per_request")
|
|
62
|
+
queueManagementPolicy String @default("own_only")
|
|
62
63
|
avatar String? // JSON or string ref
|
|
63
64
|
createdAt DateTime @default(now())
|
|
64
65
|
updatedAt DateTime @updatedAt
|
|
@@ -84,17 +85,21 @@ model TeamTemplateMember {
|
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
model TeamRun {
|
|
87
|
-
id
|
|
88
|
-
taskId
|
|
89
|
-
task
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
88
|
+
id String @id @default(uuid())
|
|
89
|
+
taskId String @unique
|
|
90
|
+
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
91
|
+
mainWorkspaceId String?
|
|
92
|
+
mainWorkspace Workspace? @relation("TeamRunMainWorkspace", fields: [mainWorkspaceId], references: [id], onDelete: SetNull)
|
|
93
|
+
mode String
|
|
94
|
+
reviewReason String?
|
|
95
|
+
createdAt DateTime @default(now())
|
|
96
|
+
updatedAt DateTime @updatedAt
|
|
97
|
+
members TeamMember[]
|
|
98
|
+
messages RoomMessage[]
|
|
99
|
+
workRequests WorkRequest[]
|
|
100
|
+
invocations AgentInvocation[]
|
|
101
|
+
|
|
102
|
+
@@index([mainWorkspaceId])
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
model TeamMember {
|
|
@@ -110,8 +115,10 @@ model TeamMember {
|
|
|
110
115
|
workspacePolicy String
|
|
111
116
|
triggerPolicy String
|
|
112
117
|
sessionPolicy String @default("new_per_request")
|
|
118
|
+
queueManagementPolicy String @default("own_only")
|
|
113
119
|
avatar String?
|
|
114
120
|
status String @default("IDLE")
|
|
121
|
+
ownedWorkspaces Workspace[] @relation("WorkspaceOwner")
|
|
115
122
|
createdAt DateTime @default(now())
|
|
116
123
|
updatedAt DateTime @updatedAt
|
|
117
124
|
|
|
@@ -183,17 +190,28 @@ model Workspace {
|
|
|
183
190
|
id String @id @default(uuid())
|
|
184
191
|
taskId String
|
|
185
192
|
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
|
|
193
|
+
parentWorkspaceId String?
|
|
194
|
+
parentWorkspace Workspace? @relation("WorkspaceChildren", fields: [parentWorkspaceId], references: [id], onDelete: SetNull)
|
|
195
|
+
childWorkspaces Workspace[] @relation("WorkspaceChildren")
|
|
196
|
+
ownerMemberId String?
|
|
197
|
+
ownerMember TeamMember? @relation("WorkspaceOwner", fields: [ownerMemberId], references: [id], onDelete: SetNull)
|
|
198
|
+
mainForTeamRuns TeamRun[] @relation("TeamRunMainWorkspace")
|
|
186
199
|
branchName String
|
|
187
200
|
baseBranch String?
|
|
188
201
|
worktreePath String
|
|
189
202
|
status String @default("ACTIVE")
|
|
190
203
|
commitMessage String? // AI 生成的 commit message(合并时使用)
|
|
204
|
+
previewTarget String? // Preview 代理目标(仅允许 loopback 地址)
|
|
191
205
|
hibernatedAt DateTime? // 自动休眠时间
|
|
192
206
|
sessions Session[]
|
|
193
207
|
createdAt DateTime @default(now())
|
|
194
208
|
updatedAt DateTime @updatedAt
|
|
195
209
|
|
|
196
210
|
@@index([taskId])
|
|
211
|
+
@@index([parentWorkspaceId])
|
|
212
|
+
@@index([ownerMemberId])
|
|
213
|
+
@@index([taskId, parentWorkspaceId])
|
|
214
|
+
@@unique([parentWorkspaceId, ownerMemberId])
|
|
197
215
|
}
|
|
198
216
|
|
|
199
217
|
// 会话 (一次 AI 代理执行)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as I,d as E,e as P,f as j,q as k,g as x,u as q,r,j as e}from"./index-BFAA3PTl.js";import{B as g}from"./button-B6JaSbDB.js";import{S as R}from"./select-BPZZlla1.js";import{L as z}from"./loader-circle-CkDnf8ST.js";import{C as B}from"./circle-check-DMK8auwb.js";import{C as L}from"./circle-alert-BSAUEd9O.js";import"./utils-CkSf8FUe.js";import"./chevron-down-CACy4UFq.js";const F=[["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"}]],A=I("link",F);function K(){return E({queryKey:k.notifications.settings,queryFn:()=>x.get("/notifications/settings")})}function M(){const t=P();return j({mutationFn:a=>x.put("/notifications/settings",a),onSuccess:()=>{t.invalidateQueries({queryKey:k.notifications.settings})}})}function Q(){return j({mutationFn:t=>x.post("/notifications/test",t)})}function V(){const{t}=q(),{data:a,isLoading:y}=K(),i=M(),l=Q(),N=[{value:"none",label:t("无")},{value:"feishu",label:t("飞书")}],[n,p]=r.useState({webhookUrl:"",baseUrl:"",titleTemplate:"",bodyTemplate:""}),[u,h]=r.useState(!1),[f,o]=r.useState("idle"),d=r.useRef(void 0);if(r.useEffect(()=>{a&&!u&&p({webhookUrl:a.feishuWebhookUrl??"",baseUrl:a.thirdPartyBaseUrl??"",titleTemplate:a.taskInReviewTitleTemplate??"",bodyTemplate:a.taskInReviewBodyTemplate??""})},[a,u]),r.useEffect(()=>(l.isSuccess?(o("success"),d.current=setTimeout(()=>o("idle"),3e3)):l.isError&&(o("error"),d.current=setTimeout(()=>o("idle"),5e3)),()=>clearTimeout(d.current)),[l.isSuccess,l.isError]),y)return e.jsx("div",{className:"p-6 text-sm text-neutral-400",children:t("加载中...")});const m=a?.osNotificationEnabled??!0,b=a?.thirdPartyChannel??"none",c=(s,U)=>{p(S=>({...S,[s]:U})),h(!0)},v=()=>{i.mutate({osNotificationEnabled:!m})},T=s=>{i.mutate({thirdPartyChannel:s})},w=()=>{i.mutate({feishuWebhookUrl:n.webhookUrl.trim()||null,thirdPartyBaseUrl:n.baseUrl.trim()||null,taskInReviewTitleTemplate:n.titleTemplate.trim()||"Agent Tower",taskInReviewBodyTemplate:n.bodyTemplate.trim()||t('✅ "{taskTitle}" 已完成,等待审查')},{onSuccess:()=>h(!1)})},C=()=>{n.webhookUrl.trim()&&l.mutate({channel:"feishu",webhookUrl:n.webhookUrl.trim(),baseUrl:n.baseUrl.trim()||void 0})};return e.jsxs("div",{className:"px-10 py-6 mx-auto w-full max-w-3xl space-y-8",children:[e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:t("系统通知")}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:t("任务完成时弹出桌面通知")}),e.jsx("button",{onClick:v,className:`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${m?"bg-neutral-900":"bg-neutral-200"}`,children:e.jsx("span",{className:`inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform ${m?"translate-x-[18px]":"translate-x-[3px]"}`})})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:t("第三方通知")}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:t("选择一个第三方渠道接收通知")}),e.jsx(R,{value:b,onChange:s=>T(s),options:N}),b==="feishu"&&e.jsxs("div",{className:"mt-4 space-y-4",children:[e.jsxs("div",{className:"p-4 border border-neutral-100 rounded-lg space-y-3",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"flex items-center gap-1 text-[13px] font-medium text-neutral-700 mb-1",children:[e.jsx(A,{size:12}),"Webhook URL"]}),e.jsx("input",{type:"text",value:n.webhookUrl,onChange:s=>c("webhookUrl",s.target.value),placeholder:"https://open.feishu.cn/open-apis/bot/v2/hook/...",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(g,{size:"sm",variant:"outline",onClick:C,disabled:!n.webhookUrl.trim()||l.isPending,children:[l.isPending&&e.jsx(z,{size:12,className:"animate-spin mr-1"}),t("测试发送")]}),f==="success"&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-green-600",children:[e.jsx(B,{size:12}),t("发送成功")]}),f==="error"&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-red-500",children:[e.jsx(L,{size:12}),t("发送失败")]})]})]}),e.jsx("div",{className:"p-4 border border-neutral-100 rounded-lg space-y-3",children:e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:t("跳转地址(用于生成任务链接)")}),e.jsx("input",{type:"text",value:n.baseUrl,onChange:s=>c("baseUrl",s.target.value),placeholder:"http://localhost:5173",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300"}),e.jsx("p",{className:"text-[11px] text-neutral-400 mt-1",children:t('通知卡片中的"查看任务"按钮将跳转到 {path}',{path:"{baseUrl}/projects/{projectId}/tasks/{taskId}"})})]})})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:t("通知模板")}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:t("支持变量: {taskTitle}, {taskId}, {projectId}, {projectName}, {status}",{taskTitle:"{taskTitle}",taskId:"{taskId}",projectId:"{projectId}",projectName:"{projectName}",status:"{status}"})}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:t("标题模板")}),e.jsx("input",{type:"text",value:n.titleTemplate,onChange:s=>c("titleTemplate",s.target.value),placeholder:"Agent Tower",className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm focus:outline-none focus:ring-1 focus:ring-neutral-300"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:t("内容模板")}),e.jsx("textarea",{value:n.bodyTemplate,onChange:s=>c("bodyTemplate",s.target.value),placeholder:t('✅ "{taskTitle}" 已完成,等待审查'),rows:2,className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm focus:outline-none focus:ring-1 focus:ring-neutral-300 resize-none"})]})]})]}),u&&e.jsx("div",{className:"sticky bottom-6 flex justify-end",children:e.jsx(g,{size:"sm",onClick:w,disabled:i.isPending,children:i.isPending?t("保存中..."):t("保存所有更改")})})]})}export{V as NotificationSettingsPage};
|