agent-tower 0.4.15 → 0.4.16-beta.0

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 (141) hide show
  1. package/dist/core/event-bus.d.ts +2 -0
  2. package/dist/core/event-bus.d.ts.map +1 -1
  3. package/dist/core/event-bus.js.map +1 -1
  4. package/dist/executors/__tests__/codex.executor.test.d.ts +2 -0
  5. package/dist/executors/__tests__/codex.executor.test.d.ts.map +1 -0
  6. package/dist/executors/__tests__/codex.executor.test.js +28 -0
  7. package/dist/executors/__tests__/codex.executor.test.js.map +1 -0
  8. package/dist/executors/codex.executor.d.ts +1 -0
  9. package/dist/executors/codex.executor.d.ts.map +1 -1
  10. package/dist/executors/codex.executor.js +19 -1
  11. package/dist/executors/codex.executor.js.map +1 -1
  12. package/dist/mcp/context.d.ts +3 -0
  13. package/dist/mcp/context.d.ts.map +1 -1
  14. package/dist/mcp/context.js +10 -1
  15. package/dist/mcp/context.js.map +1 -1
  16. package/dist/mcp/http-client.d.ts +24 -1
  17. package/dist/mcp/http-client.d.ts.map +1 -1
  18. package/dist/mcp/http-client.js +29 -2
  19. package/dist/mcp/http-client.js.map +1 -1
  20. package/dist/mcp/server.d.ts.map +1 -1
  21. package/dist/mcp/server.js +190 -0
  22. package/dist/mcp/server.js.map +1 -1
  23. package/dist/routes/index.d.ts.map +1 -1
  24. package/dist/routes/index.js +3 -0
  25. package/dist/routes/index.js.map +1 -1
  26. package/dist/routes/system.d.ts.map +1 -1
  27. package/dist/routes/system.js +35 -1
  28. package/dist/routes/system.js.map +1 -1
  29. package/dist/routes/team-runs.d.ts +11 -0
  30. package/dist/routes/team-runs.d.ts.map +1 -0
  31. package/dist/routes/team-runs.js +299 -0
  32. package/dist/routes/team-runs.js.map +1 -0
  33. package/dist/services/__tests__/session-manager.team-run.test.d.ts +2 -0
  34. package/dist/services/__tests__/session-manager.team-run.test.d.ts.map +1 -0
  35. package/dist/services/__tests__/session-manager.team-run.test.js +286 -0
  36. package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -0
  37. package/dist/services/__tests__/team-lock.service.test.d.ts +2 -0
  38. package/dist/services/__tests__/team-lock.service.test.d.ts.map +1 -0
  39. package/dist/services/__tests__/team-lock.service.test.js +81 -0
  40. package/dist/services/__tests__/team-lock.service.test.js.map +1 -0
  41. package/dist/services/__tests__/team-reconciler.service.test.d.ts +2 -0
  42. package/dist/services/__tests__/team-reconciler.service.test.d.ts.map +1 -0
  43. package/dist/services/__tests__/team-reconciler.service.test.js +1038 -0
  44. package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -0
  45. package/dist/services/__tests__/team-run.service.test.d.ts +2 -0
  46. package/dist/services/__tests__/team-run.service.test.d.ts.map +1 -0
  47. package/dist/services/__tests__/team-run.service.test.js +447 -0
  48. package/dist/services/__tests__/team-run.service.test.js.map +1 -0
  49. package/dist/services/__tests__/team-scheduler.service.test.d.ts +2 -0
  50. package/dist/services/__tests__/team-scheduler.service.test.d.ts.map +1 -0
  51. package/dist/services/__tests__/team-scheduler.service.test.js +1158 -0
  52. package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -0
  53. package/dist/services/session-manager.d.ts +31 -1
  54. package/dist/services/session-manager.d.ts.map +1 -1
  55. package/dist/services/session-manager.js +110 -2
  56. package/dist/services/session-manager.js.map +1 -1
  57. package/dist/services/team-lock.service.d.ts +22 -0
  58. package/dist/services/team-lock.service.d.ts.map +1 -0
  59. package/dist/services/team-lock.service.js +45 -0
  60. package/dist/services/team-lock.service.js.map +1 -0
  61. package/dist/services/team-reconciler.service.d.ts +44 -0
  62. package/dist/services/team-reconciler.service.d.ts.map +1 -0
  63. package/dist/services/team-reconciler.service.js +286 -0
  64. package/dist/services/team-reconciler.service.js.map +1 -0
  65. package/dist/services/team-run-events.d.ts +13 -0
  66. package/dist/services/team-run-events.d.ts.map +1 -0
  67. package/dist/services/team-run-events.js +27 -0
  68. package/dist/services/team-run-events.js.map +1 -0
  69. package/dist/services/team-run.service.d.ts +89 -0
  70. package/dist/services/team-run.service.d.ts.map +1 -0
  71. package/dist/services/team-run.service.js +577 -0
  72. package/dist/services/team-run.service.js.map +1 -0
  73. package/dist/services/team-scheduler.service.d.ts +89 -0
  74. package/dist/services/team-scheduler.service.d.ts.map +1 -0
  75. package/dist/services/team-scheduler.service.js +750 -0
  76. package/dist/services/team-scheduler.service.js.map +1 -0
  77. package/dist/socket/events.d.ts +1 -1
  78. package/dist/socket/events.d.ts.map +1 -1
  79. package/dist/socket/events.js.map +1 -1
  80. package/dist/socket/socket-gateway.d.ts.map +1 -1
  81. package/dist/socket/socket-gateway.js +5 -1
  82. package/dist/socket/socket-gateway.js.map +1 -1
  83. package/dist/web/assets/AgentDemoPage-p9YI4_l4.js +1 -0
  84. package/dist/web/assets/{DemoPage-XwuS8vNB.js → DemoPage-B5DTSEbS.js} +3 -3
  85. package/dist/web/assets/{GeneralSettingsPage-CliIgpwf.js → GeneralSettingsPage-Cspr7Vol.js} +1 -1
  86. package/dist/web/assets/{NotificationSettingsPage-y3vhVgPv.js → NotificationSettingsPage-C9VfrRr-.js} +1 -1
  87. package/dist/web/assets/{ProfileSettingsPage-CkU_kZKG.js → ProfileSettingsPage-CNugU40a.js} +1 -1
  88. package/dist/web/assets/ProjectKanbanPage-CkGNuqxq.js +87 -0
  89. package/dist/web/assets/{ProjectSettingsPage-B6xhbziO.js → ProjectSettingsPage-f1dg0XMf.js} +1 -1
  90. package/dist/web/assets/{ProviderSettingsPage-CfvdeoEU.js → ProviderSettingsPage-D_KWkgRM.js} +1 -1
  91. package/dist/web/assets/TeamSettingsPage-B6WciZyi.js +1 -0
  92. package/dist/web/assets/{button-BWFTEdOr.js → button-B6JaSbDB.js} +1 -1
  93. package/dist/web/assets/{chevron-down-CuPdBAx-.js → chevron-down-CACy4UFq.js} +1 -1
  94. package/dist/web/assets/{chevron-right-Cs8vYTMn.js → chevron-right-DFWfnDJY.js} +1 -1
  95. package/dist/web/assets/chevron-up-CGlf6jzw.js +1 -0
  96. package/dist/web/assets/{circle-alert-EUyZcWhp.js → circle-alert-BSAUEd9O.js} +1 -1
  97. package/dist/web/assets/{circle-check-BXZTzqw0.js → circle-check-DMK8auwb.js} +1 -1
  98. package/dist/web/assets/{code-block-OCS4YCEC-BxUpvXK_.js → code-block-OCS4YCEC-Hn75KHRK.js} +1 -1
  99. package/dist/web/assets/{confirm-dialog-CDLHRthd.js → confirm-dialog-DHI2f7Ni.js} +1 -1
  100. package/dist/web/assets/{folder-picker-CUbhsnhi.js → folder-picker-CtQkbWfa.js} +1 -1
  101. package/dist/web/assets/index-BFAA3PTl.js +13 -0
  102. package/dist/web/assets/index-mBCb67dB.css +1 -0
  103. package/dist/web/assets/{loader-circle-BHzDVpxt.js → loader-circle-CkDnf8ST.js} +1 -1
  104. package/dist/web/assets/{mermaid-NOHMQCX5-BOSwJqP0.js → mermaid-NOHMQCX5-DJFgrXPd.js} +44 -44
  105. package/dist/web/assets/modal-B5IRN7QI.js +1 -0
  106. package/dist/web/assets/{pencil-BMxBxIhw.js → pencil-CJY6Ahn7.js} +1 -1
  107. package/dist/web/assets/{select-BUmRG0LY.js → select-BPZZlla1.js} +1 -1
  108. package/dist/web/assets/{use-profiles-C1vlPE-2.js → use-profiles-C2k04ICZ.js} +1 -1
  109. package/dist/web/assets/{use-projects-Bcd5hIOY.js → use-projects-BxuE-ulT.js} +1 -1
  110. package/dist/web/assets/{use-providers-Cdxr4Jbz.js → use-providers-C7fIDWzP.js} +1 -1
  111. package/dist/web/index.html +2 -2
  112. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +10 -0
  113. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -1
  114. package/node_modules/@agent-tower/shared/dist/socket/events.js +1 -0
  115. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -1
  116. package/node_modules/@agent-tower/shared/dist/types.d.ts +153 -0
  117. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  118. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  119. package/node_modules/@prisma/client/.prisma/client/default.d.ts +1 -0
  120. package/node_modules/@prisma/client/.prisma/client/default.js +1 -0
  121. package/node_modules/@prisma/client/.prisma/client/edge.d.ts +1 -0
  122. package/node_modules/@prisma/client/.prisma/client/edge.js +392 -0
  123. package/node_modules/@prisma/client/.prisma/client/index-browser.js +381 -0
  124. package/node_modules/@prisma/client/.prisma/client/index.d.ts +25768 -0
  125. package/node_modules/@prisma/client/.prisma/client/index.js +417 -0
  126. package/node_modules/@prisma/client/.prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  127. package/node_modules/@prisma/client/.prisma/client/package.json +97 -0
  128. package/node_modules/@prisma/client/.prisma/client/query_engine-windows.dll.node +0 -0
  129. package/node_modules/@prisma/client/.prisma/client/schema.prisma +280 -0
  130. package/node_modules/@prisma/client/.prisma/client/wasm.d.ts +1 -0
  131. package/node_modules/@prisma/client/.prisma/client/wasm.js +381 -0
  132. package/node_modules/@prisma/client/package.json +3 -2
  133. package/package.json +2 -1
  134. package/prisma/migrations/20260518000000_add_team_run_collaboration/migration.sql +150 -0
  135. package/prisma/migrations/20260522000000_add_team_member_session_policy/migration.sql +2 -0
  136. package/prisma/schema.prisma +131 -1
  137. package/dist/web/assets/AgentDemoPage-ClnGPAV9.js +0 -1
  138. package/dist/web/assets/ProjectKanbanPage-BddzfZRV.js +0 -87
  139. package/dist/web/assets/index-BGvfX18x.css +0 -1
  140. package/dist/web/assets/index-CHN8jahE.js +0 -13
  141. package/dist/web/assets/modal-D_AU4URz.js +0 -1
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "prisma-client-2ffd4f872ae10b0962764c8245f0d9fc03f955d68240583cb3d09bdaa6def516",
3
+ "main": "index.js",
4
+ "types": "index.d.ts",
5
+ "browser": "index-browser.js",
6
+ "exports": {
7
+ "./package.json": "./package.json",
8
+ ".": {
9
+ "require": {
10
+ "node": "./index.js",
11
+ "edge-light": "./wasm.js",
12
+ "workerd": "./wasm.js",
13
+ "worker": "./wasm.js",
14
+ "browser": "./index-browser.js",
15
+ "default": "./index.js"
16
+ },
17
+ "import": {
18
+ "node": "./index.js",
19
+ "edge-light": "./wasm.js",
20
+ "workerd": "./wasm.js",
21
+ "worker": "./wasm.js",
22
+ "browser": "./index-browser.js",
23
+ "default": "./index.js"
24
+ },
25
+ "default": "./index.js"
26
+ },
27
+ "./edge": {
28
+ "types": "./edge.d.ts",
29
+ "require": "./edge.js",
30
+ "import": "./edge.js",
31
+ "default": "./edge.js"
32
+ },
33
+ "./react-native": {
34
+ "types": "./react-native.d.ts",
35
+ "require": "./react-native.js",
36
+ "import": "./react-native.js",
37
+ "default": "./react-native.js"
38
+ },
39
+ "./extension": {
40
+ "types": "./extension.d.ts",
41
+ "require": "./extension.js",
42
+ "import": "./extension.js",
43
+ "default": "./extension.js"
44
+ },
45
+ "./index-browser": {
46
+ "types": "./index.d.ts",
47
+ "require": "./index-browser.js",
48
+ "import": "./index-browser.js",
49
+ "default": "./index-browser.js"
50
+ },
51
+ "./index": {
52
+ "types": "./index.d.ts",
53
+ "require": "./index.js",
54
+ "import": "./index.js",
55
+ "default": "./index.js"
56
+ },
57
+ "./wasm": {
58
+ "types": "./wasm.d.ts",
59
+ "require": "./wasm.js",
60
+ "import": "./wasm.js",
61
+ "default": "./wasm.js"
62
+ },
63
+ "./runtime/library": {
64
+ "types": "./runtime/library.d.ts",
65
+ "require": "./runtime/library.js",
66
+ "import": "./runtime/library.js",
67
+ "default": "./runtime/library.js"
68
+ },
69
+ "./runtime/binary": {
70
+ "types": "./runtime/binary.d.ts",
71
+ "require": "./runtime/binary.js",
72
+ "import": "./runtime/binary.js",
73
+ "default": "./runtime/binary.js"
74
+ },
75
+ "./generator-build": {
76
+ "require": "./generator-build/index.js",
77
+ "import": "./generator-build/index.js",
78
+ "default": "./generator-build/index.js"
79
+ },
80
+ "./sql": {
81
+ "require": {
82
+ "types": "./sql.d.ts",
83
+ "node": "./sql.js",
84
+ "default": "./sql.js"
85
+ },
86
+ "import": {
87
+ "types": "./sql.d.ts",
88
+ "node": "./sql.mjs",
89
+ "default": "./sql.mjs"
90
+ },
91
+ "default": "./sql.js"
92
+ },
93
+ "./*": "./*"
94
+ },
95
+ "version": "5.22.0",
96
+ "sideEffects": false
97
+ }
@@ -0,0 +1,280 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ binaryTargets = ["native", "windows"]
4
+ }
5
+
6
+ datasource db {
7
+ provider = "sqlite"
8
+ url = env("AGENT_TOWER_DATABASE_URL")
9
+ }
10
+
11
+ // 项目
12
+ model Project {
13
+ id String @id @default(uuid())
14
+ name String
15
+ description String?
16
+ repoPath String
17
+ repoRemoteUrl String?
18
+ mainBranch String @default("main")
19
+ copyFiles String? // 逗号分隔的 glob/路径列表,worktree 创建后自动复制
20
+ setupScript String? // 多行命令文本,worktree 创建后自动执行
21
+ quickCommands String? // JSON: [{ name, command }],终端快捷命令
22
+ archivedAt DateTime?
23
+ repoDeletedAt DateTime?
24
+ createdAt DateTime @default(now())
25
+ updatedAt DateTime @updatedAt
26
+ tasks Task[]
27
+
28
+ @@index([archivedAt])
29
+ @@index([repoDeletedAt])
30
+ }
31
+
32
+ // 任务
33
+ // TaskStatus: TODO, IN_PROGRESS, IN_REVIEW, DONE, CANCELLED
34
+ model Task {
35
+ id String @id @default(uuid())
36
+ title String
37
+ description String?
38
+ status String @default("TODO")
39
+ priority Int @default(0)
40
+ position Int @default(0)
41
+ projectId String
42
+ project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
43
+ workspaces Workspace[]
44
+ teamRun TeamRun?
45
+ createdAt DateTime @default(now())
46
+ updatedAt DateTime @updatedAt
47
+
48
+ @@index([projectId])
49
+ @@index([status])
50
+ }
51
+
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
65
+ }
66
+
67
+ model TeamTemplate {
68
+ id String @id @default(uuid())
69
+ name String
70
+ members TeamTemplateMember[]
71
+ createdAt DateTime @default(now())
72
+ updatedAt DateTime @updatedAt
73
+ }
74
+
75
+ model TeamTemplateMember {
76
+ id String @id @default(uuid())
77
+ teamTemplateId String
78
+ teamTemplate TeamTemplate @relation(fields: [teamTemplateId], references: [id], onDelete: Cascade)
79
+ memberPresetId String
80
+ position Int @default(0)
81
+
82
+ @@index([teamTemplateId])
83
+ @@index([memberPresetId])
84
+ }
85
+
86
+ 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[]
98
+ }
99
+
100
+ 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
117
+
118
+ @@index([teamRunId])
119
+ }
120
+
121
+ model RoomMessage {
122
+ id String @id @default(uuid())
123
+ teamRunId String
124
+ teamRun TeamRun @relation(fields: [teamRunId], references: [id], onDelete: Cascade)
125
+ senderType String
126
+ senderId String?
127
+ senderInvocationId String?
128
+ kind String
129
+ content String
130
+ mentions String // JSON StructuredMention[]
131
+ workRequestIds String? // JSON string[]
132
+ artifactRefs String? // JSON string[]
133
+ attachmentIds String? // JSON string[]
134
+ createdAt DateTime @default(now())
135
+
136
+ @@index([teamRunId])
137
+ @@index([senderInvocationId])
138
+ }
139
+
140
+ model WorkRequest {
141
+ id String @id @default(uuid())
142
+ teamRunId String
143
+ teamRun TeamRun @relation(fields: [teamRunId], references: [id], onDelete: Cascade)
144
+ requesterMemberId String?
145
+ requesterType String
146
+ targetMemberId String
147
+ triggerMessageId String
148
+ instruction String
149
+ ifBusy String @default("queue")
150
+ cancelQueued Boolean @default(false)
151
+ status String @default("QUEUED")
152
+ createdAt DateTime @default(now())
153
+ updatedAt DateTime @updatedAt
154
+
155
+ @@index([teamRunId])
156
+ @@index([targetMemberId])
157
+ @@index([status])
158
+ }
159
+
160
+ model AgentInvocation {
161
+ id String @id @default(uuid())
162
+ teamRunId String
163
+ teamRun TeamRun @relation(fields: [teamRunId], references: [id], onDelete: Cascade)
164
+ workRequestId String
165
+ memberId String
166
+ workspaceId String?
167
+ sessionId String?
168
+ status String @default("QUEUED")
169
+ roomReplyReminderCount Int @default(0)
170
+ nextRoomReplyReminderAt DateTime?
171
+ createdAt DateTime @default(now())
172
+ updatedAt DateTime @updatedAt
173
+
174
+ @@index([teamRunId])
175
+ @@index([memberId])
176
+ @@index([sessionId])
177
+ @@index([status])
178
+ }
179
+
180
+ // 工作空间 (对应一个 git worktree)
181
+ // WorkspaceStatus: ACTIVE, MERGED, ABANDONED, HIBERNATED
182
+ 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
+
196
+ @@index([taskId])
197
+ }
198
+
199
+ // 会话 (一次 AI 代理执行)
200
+ // AgentType: CLAUDE_CODE, GEMINI_CLI, CURSOR_AGENT
201
+ // SessionStatus: PENDING, RUNNING, COMPLETED, FAILED, CANCELLED
202
+ // SessionPurpose: CHAT, COMMIT_MSG
203
+ model Session {
204
+ id String @id @default(uuid())
205
+ workspaceId String
206
+ workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
207
+ agentType String
208
+ variant String @default("DEFAULT")
209
+ providerId String?
210
+ prompt String
211
+ status String @default("PENDING")
212
+ purpose String @default("CHAT") // CHAT: 正常会话, COMMIT_MSG: 生成提交消息
213
+ logSnapshot String? // 序列化的 NormalizedConversation JSON,session 结束时持久化
214
+ tokenUsage String? // JSON: { totalTokens, modelContextWindow? }
215
+ processes ExecutionProcess[]
216
+ createdAt DateTime @default(now())
217
+ updatedAt DateTime @updatedAt
218
+
219
+ @@index([workspaceId])
220
+ }
221
+
222
+ // 执行进程
223
+ model ExecutionProcess {
224
+ id String @id @default(uuid())
225
+ sessionId String
226
+ session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade)
227
+ pid Int?
228
+ exitCode Int?
229
+ createdAt DateTime @default(now())
230
+ updatedAt DateTime @updatedAt
231
+
232
+ @@index([sessionId])
233
+ }
234
+
235
+ // 执行日志
236
+ model ExecutionLog {
237
+ id String @id @default(uuid())
238
+ processId String
239
+ content String
240
+ timestamp DateTime @default(now())
241
+
242
+ @@index([processId])
243
+ }
244
+
245
+ // 附件
246
+ model Attachment {
247
+ id String @id @default(uuid())
248
+ originalName String
249
+ mimeType String
250
+ sizeBytes Int
251
+ storagePath String
252
+ hash String
253
+ createdAt DateTime @default(now())
254
+
255
+ @@index([hash])
256
+ }
257
+
258
+ // 应用设置 (单例,只有一行)
259
+ model AppSettings {
260
+ id String @id @default("singleton")
261
+ locale String?
262
+ commitMessageProviderId String?
263
+ commitMessagePrompt String?
264
+ }
265
+
266
+ // 通知配置 (单例,只有一行)
267
+ // thirdPartyChannel: none, feishu
268
+ model NotificationSettings {
269
+ id String @id @default("singleton")
270
+ osNotificationEnabled Boolean @default(true)
271
+ thirdPartyChannel String @default("none")
272
+ feishuWebhookUrl String?
273
+
274
+ // 第三方通知跳转地址
275
+ thirdPartyBaseUrl String?
276
+
277
+ // 通知模板
278
+ taskInReviewTitleTemplate String @default("Agent Tower")
279
+ taskInReviewBodyTemplate String @default("✅ \"{taskTitle}\" 已完成,等待审查")
280
+ }
@@ -0,0 +1 @@
1
+ export * from "./index"