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.
Files changed (216) hide show
  1. package/dist/app.test.js +2 -0
  2. package/dist/app.test.js.map +1 -1
  3. package/dist/git/git-cli.d.ts +18 -1
  4. package/dist/git/git-cli.d.ts.map +1 -1
  5. package/dist/git/git-cli.js +17 -1
  6. package/dist/git/git-cli.js.map +1 -1
  7. package/dist/git/worktree.manager.d.ts +29 -2
  8. package/dist/git/worktree.manager.d.ts.map +1 -1
  9. package/dist/git/worktree.manager.js +137 -16
  10. package/dist/git/worktree.manager.js.map +1 -1
  11. package/dist/git/worktree.manager.test.d.ts +2 -0
  12. package/dist/git/worktree.manager.test.d.ts.map +1 -0
  13. package/dist/git/worktree.manager.test.js +104 -0
  14. package/dist/git/worktree.manager.test.js.map +1 -0
  15. package/dist/mcp/http-client.d.ts +5 -1
  16. package/dist/mcp/http-client.d.ts.map +1 -1
  17. package/dist/mcp/http-client.js +13 -3
  18. package/dist/mcp/http-client.js.map +1 -1
  19. package/dist/mcp/server.d.ts.map +1 -1
  20. package/dist/mcp/server.js +33 -3
  21. package/dist/mcp/server.js.map +1 -1
  22. package/dist/middleware/tunnel-auth.d.ts.map +1 -1
  23. package/dist/middleware/tunnel-auth.js +2 -0
  24. package/dist/middleware/tunnel-auth.js.map +1 -1
  25. package/dist/output/__tests__/codex-parser.test.d.ts +2 -0
  26. package/dist/output/__tests__/codex-parser.test.d.ts.map +1 -0
  27. package/dist/output/__tests__/codex-parser.test.js +148 -0
  28. package/dist/output/__tests__/codex-parser.test.js.map +1 -0
  29. package/dist/output/codex-parser.d.ts +12 -0
  30. package/dist/output/codex-parser.d.ts.map +1 -1
  31. package/dist/output/codex-parser.js +129 -12
  32. package/dist/output/codex-parser.js.map +1 -1
  33. package/dist/routes/__tests__/attachments.test.d.ts +2 -0
  34. package/dist/routes/__tests__/attachments.test.d.ts.map +1 -0
  35. package/dist/routes/__tests__/attachments.test.js +86 -0
  36. package/dist/routes/__tests__/attachments.test.js.map +1 -0
  37. package/dist/routes/__tests__/filesystem.test.d.ts +2 -0
  38. package/dist/routes/__tests__/filesystem.test.d.ts.map +1 -0
  39. package/dist/routes/__tests__/filesystem.test.js +80 -0
  40. package/dist/routes/__tests__/filesystem.test.js.map +1 -0
  41. package/dist/routes/__tests__/previews.test.d.ts +2 -0
  42. package/dist/routes/__tests__/previews.test.d.ts.map +1 -0
  43. package/dist/routes/__tests__/previews.test.js +89 -0
  44. package/dist/routes/__tests__/previews.test.js.map +1 -0
  45. package/dist/routes/__tests__/tasks.test.d.ts +2 -0
  46. package/dist/routes/__tests__/tasks.test.d.ts.map +1 -0
  47. package/dist/routes/__tests__/tasks.test.js +72 -0
  48. package/dist/routes/__tests__/tasks.test.js.map +1 -0
  49. package/dist/routes/attachments.d.ts.map +1 -1
  50. package/dist/routes/attachments.js +36 -16
  51. package/dist/routes/attachments.js.map +1 -1
  52. package/dist/routes/filesystem.d.ts.map +1 -1
  53. package/dist/routes/filesystem.js +24 -3
  54. package/dist/routes/filesystem.js.map +1 -1
  55. package/dist/routes/index.d.ts.map +1 -1
  56. package/dist/routes/index.js +3 -0
  57. package/dist/routes/index.js.map +1 -1
  58. package/dist/routes/previews.d.ts +6 -0
  59. package/dist/routes/previews.d.ts.map +1 -0
  60. package/dist/routes/previews.js +413 -0
  61. package/dist/routes/previews.js.map +1 -0
  62. package/dist/routes/projects.d.ts.map +1 -1
  63. package/dist/routes/projects.js +1 -0
  64. package/dist/routes/projects.js.map +1 -1
  65. package/dist/routes/tasks.js +2 -2
  66. package/dist/routes/tasks.js.map +1 -1
  67. package/dist/routes/team-runs.d.ts.map +1 -1
  68. package/dist/routes/team-runs.js +36 -9
  69. package/dist/routes/team-runs.js.map +1 -1
  70. package/dist/routes/tunnel.d.ts.map +1 -1
  71. package/dist/routes/tunnel.js +20 -0
  72. package/dist/routes/tunnel.js.map +1 -1
  73. package/dist/routes/workspaces.d.ts.map +1 -1
  74. package/dist/routes/workspaces.js +15 -1
  75. package/dist/routes/workspaces.js.map +1 -1
  76. package/dist/services/__tests__/preview.service.test.d.ts +2 -0
  77. package/dist/services/__tests__/preview.service.test.d.ts.map +1 -0
  78. package/dist/services/__tests__/preview.service.test.js +29 -0
  79. package/dist/services/__tests__/preview.service.test.js.map +1 -0
  80. package/dist/services/__tests__/task.service.test.d.ts +2 -0
  81. package/dist/services/__tests__/task.service.test.d.ts.map +1 -0
  82. package/dist/services/__tests__/task.service.test.js +65 -0
  83. package/dist/services/__tests__/task.service.test.js.map +1 -0
  84. package/dist/services/__tests__/team-reconciler.service.test.js +720 -28
  85. package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -1
  86. package/dist/services/__tests__/team-run.service.test.js +416 -0
  87. package/dist/services/__tests__/team-run.service.test.js.map +1 -1
  88. package/dist/services/__tests__/team-scheduler.service.test.js +680 -26
  89. package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -1
  90. package/dist/services/__tests__/tunnel.service.test.d.ts +2 -0
  91. package/dist/services/__tests__/tunnel.service.test.d.ts.map +1 -0
  92. package/dist/services/__tests__/tunnel.service.test.js +138 -0
  93. package/dist/services/__tests__/tunnel.service.test.js.map +1 -0
  94. package/dist/services/__tests__/workspace.service.test.d.ts +2 -0
  95. package/dist/services/__tests__/workspace.service.test.d.ts.map +1 -0
  96. package/dist/services/__tests__/workspace.service.test.js +695 -0
  97. package/dist/services/__tests__/workspace.service.test.js.map +1 -0
  98. package/dist/services/attachment-context.d.ts +3 -0
  99. package/dist/services/attachment-context.d.ts.map +1 -0
  100. package/dist/services/attachment-context.js +34 -0
  101. package/dist/services/attachment-context.js.map +1 -0
  102. package/dist/services/preview.service.d.ts +19 -0
  103. package/dist/services/preview.service.d.ts.map +1 -0
  104. package/dist/services/preview.service.js +147 -0
  105. package/dist/services/preview.service.js.map +1 -0
  106. package/dist/services/project.service.d.ts +2 -0
  107. package/dist/services/project.service.d.ts.map +1 -1
  108. package/dist/services/project.service.js +87 -18
  109. package/dist/services/project.service.js.map +1 -1
  110. package/dist/services/session-manager.d.ts +12 -0
  111. package/dist/services/session-manager.d.ts.map +1 -1
  112. package/dist/services/task.service.d.ts +6 -0
  113. package/dist/services/task.service.d.ts.map +1 -1
  114. package/dist/services/task.service.js +15 -3
  115. package/dist/services/task.service.js.map +1 -1
  116. package/dist/services/team-lock.service.d.ts +3 -0
  117. package/dist/services/team-lock.service.d.ts.map +1 -1
  118. package/dist/services/team-lock.service.js +11 -0
  119. package/dist/services/team-lock.service.js.map +1 -1
  120. package/dist/services/team-run.service.d.ts +34 -1
  121. package/dist/services/team-run.service.d.ts.map +1 -1
  122. package/dist/services/team-run.service.js +370 -30
  123. package/dist/services/team-run.service.js.map +1 -1
  124. package/dist/services/team-scheduler.service.d.ts +22 -1
  125. package/dist/services/team-scheduler.service.d.ts.map +1 -1
  126. package/dist/services/team-scheduler.service.js +148 -33
  127. package/dist/services/team-scheduler.service.js.map +1 -1
  128. package/dist/services/tunnel.service.d.ts +31 -5
  129. package/dist/services/tunnel.service.d.ts.map +1 -1
  130. package/dist/services/tunnel.service.js +293 -32
  131. package/dist/services/tunnel.service.js.map +1 -1
  132. package/dist/services/workspace.service.d.ts +161 -7
  133. package/dist/services/workspace.service.d.ts.map +1 -1
  134. package/dist/services/workspace.service.js +396 -51
  135. package/dist/services/workspace.service.js.map +1 -1
  136. package/dist/web/assets/{AgentDemoPage-p9YI4_l4.js → AgentDemoPage-BhDnxdmh.js} +1 -1
  137. package/dist/web/assets/{DemoPage-B5DTSEbS.js → DemoPage-CJBc0NZf.js} +1 -1
  138. package/dist/web/assets/{GeneralSettingsPage-Cspr7Vol.js → GeneralSettingsPage-CEjDPmtD.js} +1 -1
  139. package/dist/web/assets/MemberAvatar-DxRCLAoK.js +1 -0
  140. package/dist/web/assets/NotificationSettingsPage-i77lmSic.js +1 -0
  141. package/dist/web/assets/{ProfileSettingsPage-CNugU40a.js → ProfileSettingsPage-DcGLD5O-.js} +1 -1
  142. package/dist/web/assets/ProjectKanbanPage-CX-NY7hx.js +89 -0
  143. package/dist/web/assets/ProjectSettingsPage-BBfroQPA.js +2 -0
  144. package/dist/web/assets/{ProviderSettingsPage-D_KWkgRM.js → ProviderSettingsPage-BdxbO1E9.js} +12 -12
  145. package/dist/web/assets/TeamSettingsPage-CTWGO79W.js +1 -0
  146. package/dist/web/assets/agent-tower-logo-COx9gy77.png +0 -0
  147. package/dist/web/assets/{button-B6JaSbDB.js → button-RDdre_kF.js} +1 -1
  148. package/dist/web/assets/{chevron-down-CACy4UFq.js → chevron-down-Cfeapk0v.js} +1 -1
  149. package/dist/web/assets/{chevron-right-DFWfnDJY.js → chevron-right-BE6LVCii.js} +1 -1
  150. package/dist/web/assets/{chevron-up-CGlf6jzw.js → chevron-up-CEEz4jJv.js} +1 -1
  151. package/dist/web/assets/{circle-check-DMK8auwb.js → circle-check-0imI5gEL.js} +1 -1
  152. package/dist/web/assets/{code-block-OCS4YCEC-Hn75KHRK.js → code-block-OCS4YCEC-D4c9zDcq.js} +1 -1
  153. package/dist/web/assets/{confirm-dialog-DHI2f7Ni.js → confirm-dialog--HDqEa-R.js} +1 -1
  154. package/dist/web/assets/folder-picker-CKfogW-o.js +1 -0
  155. package/dist/web/assets/index-BHmOCKAn.css +1 -0
  156. package/dist/web/assets/{index-BFAA3PTl.js → index-DbGCpy8E.js} +9 -9
  157. package/dist/web/assets/loader-circle-BAUFMewp.js +1 -0
  158. package/dist/web/assets/{log-adapter-CeKrvZcz.js → log-adapter-DKKM3sxS.js} +1 -1
  159. package/dist/web/assets/{mermaid-NOHMQCX5-DJFgrXPd.js → mermaid-NOHMQCX5-BkaKG_2K.js} +4 -4
  160. package/dist/web/assets/{modal-B5IRN7QI.js → modal-3rdeMVPn.js} +1 -1
  161. package/dist/web/assets/{pencil-CJY6Ahn7.js → pencil-CqWv0WcO.js} +1 -1
  162. package/dist/web/assets/{select-BPZZlla1.js → select-DHVfUr22.js} +1 -1
  163. package/dist/web/assets/upload-D3aqtSCY.js +1 -0
  164. package/dist/web/assets/{use-profiles-C2k04ICZ.js → use-profiles-BznmWvqM.js} +1 -1
  165. package/dist/web/assets/{use-providers-C7fIDWzP.js → use-providers-DIHUIuEZ.js} +1 -1
  166. package/dist/web/avatars/presets/avatar-preset-01-developer.png +0 -0
  167. package/dist/web/avatars/presets/avatar-preset-02-architect.png +0 -0
  168. package/dist/web/avatars/presets/avatar-preset-03-tester.png +0 -0
  169. package/dist/web/avatars/presets/avatar-preset-04-devops.png +0 -0
  170. package/dist/web/avatars/presets/avatar-preset-05-data-scientist.png +0 -0
  171. package/dist/web/avatars/presets/avatar-preset-06-frontend.png +0 -0
  172. package/dist/web/avatars/presets/avatar-preset-07-backend.png +0 -0
  173. package/dist/web/avatars/presets/avatar-preset-08-security.png +0 -0
  174. package/dist/web/avatars/presets/avatar-preset-09-project-manager.png +0 -0
  175. package/dist/web/avatars/presets/avatar-preset-10-product-manager.png +0 -0
  176. package/dist/web/avatars/presets/avatar-preset-11-scrum-master.png +0 -0
  177. package/dist/web/avatars/presets/avatar-preset-12-tech-lead.png +0 -0
  178. package/dist/web/avatars/presets/avatar-preset-13-coordinator.png +0 -0
  179. package/dist/web/avatars/presets/avatar-preset-14-mentor.png +0 -0
  180. package/dist/web/avatars/presets/avatar-preset-15-reviewer.png +0 -0
  181. package/dist/web/avatars/presets/avatar-preset-16-ui-designer.png +0 -0
  182. package/dist/web/avatars/presets/avatar-preset-17-ux-researcher.png +0 -0
  183. package/dist/web/avatars/presets/avatar-preset-18-documenter.png +0 -0
  184. package/dist/web/avatars/presets/avatar-preset-19-translator.png +0 -0
  185. package/dist/web/avatars/presets/avatar-preset-20-analyst.png +0 -0
  186. package/dist/web/avatars/presets/avatar-preset-21-consultant.png +0 -0
  187. package/dist/web/avatars/presets/avatar-preset-22-creative-director.png +0 -0
  188. package/dist/web/avatars/presets/avatar-preset-23-support.png +0 -0
  189. package/dist/web/avatars/presets/avatar-preset-24-assistant.png +0 -0
  190. package/dist/web/avatars/presets/avatar-preset-25-robot.png +0 -0
  191. package/dist/web/avatars/presets/avatar-preset-grid.png +0 -0
  192. package/dist/web/index.html +2 -2
  193. package/node_modules/@agent-tower/shared/dist/types.d.ts +13 -1
  194. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  195. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  196. package/node_modules/@prisma/client/.prisma/client/edge.js +11 -5
  197. package/node_modules/@prisma/client/.prisma/client/index-browser.js +6 -0
  198. package/node_modules/@prisma/client/.prisma/client/index.d.ts +1309 -14
  199. package/node_modules/@prisma/client/.prisma/client/index.js +11 -5
  200. package/node_modules/@prisma/client/.prisma/client/package.json +1 -1
  201. package/node_modules/@prisma/client/.prisma/client/schema.prisma +70 -52
  202. package/node_modules/@prisma/client/.prisma/client/wasm.js +6 -0
  203. package/package.json +1 -1
  204. package/prisma/migrations/20260515000000_add_workspace_preview_target/migration.sql +2 -0
  205. package/prisma/migrations/20260526000000_add_team_run_main_and_dedicated_workspaces/migration.sql +21 -0
  206. package/prisma/migrations/20260529000000_add_team_member_queue_management_policy/migration.sql +2 -0
  207. package/prisma/schema.prisma +29 -11
  208. package/dist/web/assets/NotificationSettingsPage-C9VfrRr-.js +0 -1
  209. package/dist/web/assets/ProjectKanbanPage-CkGNuqxq.js +0 -87
  210. package/dist/web/assets/ProjectSettingsPage-f1dg0XMf.js +0 -2
  211. package/dist/web/assets/TeamSettingsPage-B6WciZyi.js +0 -1
  212. package/dist/web/assets/circle-alert-BSAUEd9O.js +0 -1
  213. package/dist/web/assets/folder-picker-CtQkbWfa.js +0 -1
  214. package/dist/web/assets/index-mBCb67dB.css +0 -1
  215. package/dist/web/assets/loader-circle-CkDnf8ST.js +0 -1
  216. 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 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
- avatar String? // JSON or string ref
63
- createdAt DateTime @default(now())
64
- updatedAt DateTime @updatedAt
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 String @id @default(uuid())
88
- taskId String @unique
89
- task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
90
- mode String
91
- reviewReason String?
92
- createdAt DateTime @default(now())
93
- updatedAt DateTime @updatedAt
94
- members TeamMember[]
95
- messages RoomMessage[]
96
- workRequests WorkRequest[]
97
- invocations AgentInvocation[]
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 String @id @default(uuid())
102
- teamRunId String
103
- teamRun TeamRun @relation(fields: [teamRunId], references: [id], onDelete: Cascade)
104
- presetId String?
105
- name String
106
- aliases String // JSON string: string[]
107
- providerId String
108
- rolePrompt String
109
- capabilities String // JSON TeamMemberCapabilities
110
- workspacePolicy String
111
- triggerPolicy String
112
- sessionPolicy String @default("new_per_request")
113
- avatar String?
114
- status String @default("IDLE")
115
- createdAt DateTime @default(now())
116
- updatedAt DateTime @updatedAt
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 String @id @default(uuid())
184
- taskId String
185
- task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
186
- branchName String
187
- baseBranch String?
188
- worktreePath String
189
- status String @default("ACTIVE")
190
- commitMessage String? // AI 生成的 commit message(合并时使用)
191
- hibernatedAt DateTime? // 自动休眠时间
192
- sessions Session[]
193
- createdAt DateTime @default(now())
194
- updatedAt DateTime @updatedAt
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-tower",
3
- "version": "0.4.16-beta.0",
3
+ "version": "0.4.16-beta.4",
4
4
  "description": "AI Agent Task Management Dashboard",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,2 @@
1
+ -- Add preview target configuration to workspaces.
2
+ ALTER TABLE "Workspace" ADD COLUMN "previewTarget" TEXT;
@@ -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");
@@ -0,0 +1,2 @@
1
+ ALTER TABLE "MemberPreset" ADD COLUMN "queueManagementPolicy" TEXT NOT NULL DEFAULT 'own_only';
2
+ ALTER TABLE "TeamMember" ADD COLUMN "queueManagementPolicy" TEXT NOT NULL DEFAULT 'own_only';
@@ -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 String @id @default(uuid())
88
- taskId String @unique
89
- task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
90
- mode String
91
- reviewReason String?
92
- createdAt DateTime @default(now())
93
- updatedAt DateTime @updatedAt
94
- members TeamMember[]
95
- messages RoomMessage[]
96
- workRequests WorkRequest[]
97
- invocations AgentInvocation[]
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};