agent-tower 0.5.2 → 0.5.3-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/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -1
- package/dist/executors/__tests__/base.executor.test.js +12 -0
- package/dist/executors/__tests__/base.executor.test.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 +4 -0
- package/dist/executors/execution-env.js.map +1 -1
- package/dist/routes/conversations.d.ts +3 -0
- package/dist/routes/conversations.d.ts.map +1 -0
- package/dist/routes/conversations.js +102 -0
- package/dist/routes/conversations.js.map +1 -0
- 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/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +37 -21
- package/dist/routes/sessions.js.map +1 -1
- package/dist/services/__tests__/conversation.service.test.d.ts +2 -0
- package/dist/services/__tests__/conversation.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/conversation.service.test.js +102 -0
- package/dist/services/__tests__/conversation.service.test.js.map +1 -0
- package/dist/services/commit-message.service.d.ts.map +1 -1
- package/dist/services/commit-message.service.js +4 -0
- package/dist/services/commit-message.service.js.map +1 -1
- package/dist/services/conversation.service.d.ts +26 -0
- package/dist/services/conversation.service.d.ts.map +1 -0
- package/dist/services/conversation.service.js +224 -0
- package/dist/services/conversation.service.js.map +1 -0
- package/dist/services/session-manager.d.ts +69 -13
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +107 -42
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/task.service.d.ts +2 -2
- package/dist/services/terminal-manager.d.ts.map +1 -1
- package/dist/services/terminal-manager.js +2 -0
- package/dist/services/terminal-manager.js.map +1 -1
- package/dist/services/workspace.service.d.ts +9 -7
- package/dist/services/workspace.service.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -1
- package/dist/web/agent-icons/claude-code.svg +1 -0
- package/dist/web/agent-icons/codex.svg +1 -0
- package/dist/web/agent-icons/cursor-agent.svg +1 -0
- package/dist/web/agent-icons/gemini-cli.svg +1 -0
- package/dist/web/assets/AgentDemoPage-Cc1sKLmE.js +1 -0
- package/dist/web/assets/AgentLogo-DQId6FqS.js +1 -0
- package/dist/web/assets/ConversationPage-BXDIbwTR.js +3 -0
- package/dist/web/assets/CreateTaskInput-CDynnXvO.js +2 -0
- package/dist/web/assets/{DemoPage-Xc4QRNUj.js → DemoPage-BeL28u5_.js} +2 -2
- package/dist/web/assets/{GeneralSettingsPage-DWKl6BHA.js → GeneralSettingsPage-CFc1CWWl.js} +1 -1
- package/dist/web/assets/Icons-EVcY239B.js +1 -0
- package/dist/web/assets/LoadingPreviewPage-CRwEvHz_.js +1 -0
- package/dist/web/assets/{McpSettingsPage-BHEMUq7Z.js → McpSettingsPage-BujDKp8T.js} +1 -1
- package/dist/web/assets/{MemberAvatar-b_WKLu8w.js → MemberAvatar-Bvlu6rk3.js} +1 -1
- package/dist/web/assets/NotificationSettingsPage-Dsn-5Uft.js +1 -0
- package/dist/web/assets/ProfileSettingsPage-CuhQBP_t.js +3 -0
- package/dist/web/assets/ProjectKanbanPage-DiEo6BK_.js +89 -0
- package/dist/web/assets/ProjectSettingsPage-Cj46vZYF.js +2 -0
- package/dist/web/assets/ProviderSettingsPage-G7pPagR6.js +54 -0
- package/dist/web/assets/{SettingsMasterDetail-Cx9Ylq9N.js → SettingsMasterDetail-_vE8P7ke.js} +1 -1
- package/dist/web/assets/TeamSettingsPage-CC_QgVbE.js +1 -0
- package/dist/web/assets/arc-DWusz5nt.js +1 -0
- package/dist/web/assets/architectureDiagram-3BPJPVTR-BzUiKOFe.js +36 -0
- package/dist/web/assets/{arrow-left-DcUokonk.js → arrow-left-C_pxdzZL.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-DEDpa_4t.js → blockDiagram-GPEHLZMM-BGx2sLYW.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-BgS3ci_x.js → c4Diagram-AAUBKEIU-BCihVD7R.js} +1 -1
- package/dist/web/assets/channel-BBvaRDfe.js +1 -0
- package/dist/web/assets/check-C7Na6M49.js +1 -0
- package/dist/web/assets/{chevron-down-DuDzRplH.js → chevron-down-DuZqUX3d.js} +1 -1
- package/dist/web/assets/{chevron-right-BezhysME.js → chevron-right-BTjA7BSq.js} +1 -1
- package/dist/web/assets/{chevron-up-DtQ85g91.js → chevron-up-BeZXjQ4W.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-BnpAjP2E.js → chunk-2J33WTMH-BVhYZ0vK.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-DNUdFpBR.js → chunk-4BX2VUAB-amtolJb4.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-CTj6ihx_.js → chunk-55IACEB6-Bi5q9Evi.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-yKiHVB7X.js → chunk-727SXJPM-Bb_qV3PR.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-njbMVjqc.js → chunk-AQP2D5EJ-BhFBU2pH.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-h0jEUL75.js → chunk-FMBD7UC4-CbBz10YF.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-DjMFJZNr.js → chunk-ND2GUHAM-B930BNNl.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-odAhWIp4.js → chunk-QZHKN3VN-YlRfC0oD.js} +1 -1
- package/dist/web/assets/{circle-alert-IhLKVEi9.js → circle-alert-DCm2E91k.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-XuAtffBc.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-XuAtffBc.js +1 -0
- package/dist/web/assets/code-block-OCS4YCEC-ImXQka3_.js +2 -0
- package/dist/web/assets/{confirm-dialog-Amksh2QM.js → confirm-dialog-Cc27tq8j.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-Ds62_zKQ.js → cose-bilkent-S5V4N54A-Di3PzbLp.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-De9CyhMh.js → dagre-BM42HDAG-DD7qiU9m.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-Db7DRtzA.js → diagram-2AECGRRQ-Bgr-CjRi.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-DXeGI1-M.js → diagram-5GNKFQAL-CvRORhH2.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-Llle6qEC.js → diagram-KO2AKTUF-CkVyLyvM.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-BcK1LGRh.js → diagram-LMA3HP47-B-CPQQuU.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-0_sJ3YRD.js → diagram-OG6HWLK6-DXow9CgH.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-BjT0k23c.js → erDiagram-TEJ5UH35-BPLJJwjL.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-kaKS6P_m.js → flowDiagram-I6XJVG4X-ggyugmK6.js} +1 -1
- package/dist/web/assets/folder-B35uD7uF.js +1 -0
- package/dist/web/assets/folder-picker-DFxfUtH5.js +1 -0
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-CW8IoCY6.js → ganttDiagram-6RSMTGT7-317n6mcW.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-C5-QVJMh.js → gitGraphDiagram-PVQCEYII-DTUyiJew.js} +1 -1
- package/dist/web/assets/{index-Du7RXa9t.js → index-BwKL3rKp.js} +5 -5
- package/dist/web/assets/index-DgO-2xBV.css +1 -0
- package/dist/web/assets/index-OY1TIdAK.js +120 -0
- package/dist/web/assets/{infoDiagram-5YYISTIA-CG7QnPme.js → infoDiagram-5YYISTIA-1GXYdkvW.js} +1 -1
- package/dist/web/assets/{input-BxcpVmsb.js → input-6lLP89Y3.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-DitLiYai.js → ishikawaDiagram-YF4QCWOH-DSGxwLxL.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-EKXFhiai.js → journeyDiagram-JHISSGLW-Bk9wMzSo.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-Ckbr1P9R.js → kanban-definition-UN3LZRKU-BW3QAONh.js} +4 -4
- package/dist/web/assets/{layers-Dqjek9Kd.js → layers-CDcLPjE5.js} +1 -1
- package/dist/web/assets/{linear-HA2k3O-l.js → linear-DTyT0tZy.js} +1 -1
- package/dist/web/assets/{loader-circle-B4v8mirO.js → loader-circle-DDrZegLO.js} +1 -1
- package/dist/web/assets/mermaid-NOHMQCX5-CeIvIbfU.js +122 -0
- package/dist/web/assets/{message-square-B-2bz9LU.js → message-square-CunpcgQi.js} +1 -1
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-ByCTUtXz.js → mindmap-definition-RKZ34NQL-CMuh1LCP.js} +2 -2
- package/dist/web/assets/modal-D8uSzIAd.js +1 -0
- package/dist/web/assets/{pencil-DzjmtIoi.js → pencil-BTaYfjKo.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-DeQnXQoJ.js → pieDiagram-4H26LBE5-8PB3-bCK.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB--ocdxSbH.js → quadrantDiagram-W4KKPZXB-Dpf14KEr.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-CJq21gDX.js → requirementDiagram-4Y6WPE33-ClTLx63o.js} +1 -1
- package/dist/web/assets/{rotate-ccw-BhUVdZv6.js → rotate-ccw-bVmcWqcA.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-U373GNMv.js → sankeyDiagram-5OEKKPKP-ChlGi0jn.js} +1 -1
- package/dist/web/assets/select-tNVeGe-v.js +1 -0
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-BuH8el8s.js → sequenceDiagram-3UESZ5HK-6tJ810tk.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-CqZ_L1ch.js → stateDiagram-AJRCARHV-Cc5dwA5r.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-EVHRu9u3.js +1 -0
- package/dist/web/assets/{switch-DsjSr4nv.js → switch-7jE2n-KP.js} +1 -1
- package/dist/web/assets/{terminal-JXRig8oL.js → terminal-D5iU4zAj.js} +1 -1
- package/dist/web/assets/{textarea-BzeEPT1A.js → textarea-DVa2Yvj4.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-BIrIbCOG.js → timeline-definition-PNZ67QCA-q32Hcn4m.js} +3 -3
- package/dist/web/assets/trash-2-z7TLHqpU.js +1 -0
- package/dist/web/assets/{upload-BwkqnAVE.js → upload-DeI535ZH.js} +1 -1
- package/dist/web/assets/{use-profiles-DcyUHq0p.js → use-profiles-BS_Mkp5d.js} +1 -1
- package/dist/web/assets/{use-providers-BWgjPVX8.js → use-providers-CWfLQ--R.js} +1 -1
- package/dist/web/assets/useNormalizedLogs-DW37m6Ji.js +1 -0
- package/dist/web/assets/{vennDiagram-CIIHVFJN-Dmk1mluX.js → vennDiagram-CIIHVFJN-VxBXMI4P.js} +5 -5
- package/dist/web/assets/{wardley-L42UT6IY-CEY4M7Op.js → wardley-L42UT6IY-BvNOQGfh.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-CiK-Q213.js → wardleyDiagram-YWT4CUSO-DMTZkLB4.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-C5rj3Hpu.js → xychartDiagram-2RQKCTM6-BaJ2kymJ.js} +1 -1
- package/dist/web/index.html +2 -2
- package/node_modules/@agent-tower/shared/dist/types.d.ts +41 -1
- package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.js +8 -0
- package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
- package/node_modules/@prisma/client/.prisma/client/edge.js +21 -6
- package/node_modules/@prisma/client/.prisma/client/index-browser.js +14 -0
- package/node_modules/@prisma/client/.prisma/client/index.d.ts +1789 -211
- package/node_modules/@prisma/client/.prisma/client/index.js +21 -6
- package/node_modules/@prisma/client/.prisma/client/package.json +1 -1
- package/node_modules/@prisma/client/.prisma/client/schema.prisma +34 -14
- package/node_modules/@prisma/client/.prisma/client/wasm.js +14 -0
- package/package.json +1 -1
- package/prisma/migrations/20260618000000_add_conversations/migration.sql +79 -0
- package/prisma/schema.prisma +22 -2
- package/dist/web/assets/AgentDemoPage-DAdN5g19.js +0 -1
- package/dist/web/assets/NotificationSettingsPage-C2KeYegv.js +0 -1
- package/dist/web/assets/ProfileSettingsPage-CVOCVwVK.js +0 -3
- package/dist/web/assets/ProjectKanbanPage-J_5GxZQ7.js +0 -90
- package/dist/web/assets/ProjectSettingsPage-CP3V8oAJ.js +0 -2
- package/dist/web/assets/ProviderSettingsPage-DQ_IDUUZ.js +0 -54
- package/dist/web/assets/TeamSettingsPage-BHE2x82g.js +0 -1
- package/dist/web/assets/arc-D31VhUJX.js +0 -1
- package/dist/web/assets/architectureDiagram-3BPJPVTR-Ak9jpJ8q.js +0 -36
- package/dist/web/assets/channel-BLjA9Brq.js +0 -1
- package/dist/web/assets/check-DyTLNLlk.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-DHqakOiv.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-DHqakOiv.js +0 -1
- package/dist/web/assets/code-block-OCS4YCEC-4ofbxqu2.js +0 -2
- package/dist/web/assets/folder-picker-CbAfVBHD.js +0 -1
- package/dist/web/assets/index-Bd5HU-dB.js +0 -13
- package/dist/web/assets/index-LbQD7FZK.css +0 -1
- package/dist/web/assets/log-adapter-CtvxzS4j.js +0 -1
- package/dist/web/assets/mermaid-NOHMQCX5-C2N-Y-YP.js +0 -122
- package/dist/web/assets/modal-C6m1dmin.js +0 -1
- package/dist/web/assets/select-CCf5nwYs.js +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-DkD_6IX-.js +0 -1
|
@@ -264,27 +264,47 @@ model Workspace {
|
|
|
264
264
|
@@index([workingDir])
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
+
// 独立对话:不绑定 Project/Task/Workspace,仅复用 Session 执行链路
|
|
268
|
+
model Conversation {
|
|
269
|
+
id String @id @default(uuid())
|
|
270
|
+
title String
|
|
271
|
+
directoryName String @unique
|
|
272
|
+
workingDir String
|
|
273
|
+
session Session?
|
|
274
|
+
deletedAt DateTime?
|
|
275
|
+
lastActiveAt DateTime @default(now())
|
|
276
|
+
createdAt DateTime @default(now())
|
|
277
|
+
updatedAt DateTime @updatedAt
|
|
278
|
+
|
|
279
|
+
@@index([deletedAt])
|
|
280
|
+
@@index([lastActiveAt])
|
|
281
|
+
}
|
|
282
|
+
|
|
267
283
|
// 会话 (一次 AI 代理执行)
|
|
268
284
|
// AgentType: CLAUDE_CODE, GEMINI_CLI, CURSOR_AGENT
|
|
269
285
|
// SessionStatus: PENDING, RUNNING, COMPLETED, FAILED, CANCELLED
|
|
270
286
|
// SessionPurpose: CHAT, COMMIT_MSG
|
|
271
287
|
model Session {
|
|
272
|
-
id
|
|
273
|
-
workspaceId
|
|
274
|
-
workspace
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
288
|
+
id String @id @default(uuid())
|
|
289
|
+
workspaceId String?
|
|
290
|
+
workspace Workspace? @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
291
|
+
conversationId String? @unique
|
|
292
|
+
conversation Conversation? @relation(fields: [conversationId], references: [id], onDelete: Cascade)
|
|
293
|
+
context String @default("WORKSPACE") // WORKSPACE: 项目工作区, CONVERSATION: 独立对话
|
|
294
|
+
agentType String
|
|
295
|
+
variant String @default("DEFAULT")
|
|
296
|
+
providerId String?
|
|
297
|
+
prompt String
|
|
298
|
+
status String @default("PENDING")
|
|
299
|
+
purpose String @default("CHAT") // CHAT: 正常会话, COMMIT_MSG: 生成提交消息
|
|
300
|
+
logSnapshot String? // 序列化的 NormalizedConversation JSON,session 结束时持久化
|
|
301
|
+
tokenUsage String? // JSON: { totalTokens, modelContextWindow? }
|
|
302
|
+
processes ExecutionProcess[]
|
|
303
|
+
createdAt DateTime @default(now())
|
|
304
|
+
updatedAt DateTime @updatedAt
|
|
286
305
|
|
|
287
306
|
@@index([workspaceId])
|
|
307
|
+
@@index([context])
|
|
288
308
|
}
|
|
289
309
|
|
|
290
310
|
// 执行进程
|
|
@@ -295,9 +295,22 @@ exports.Prisma.WorkspaceScalarFieldEnum = {
|
|
|
295
295
|
updatedAt: 'updatedAt'
|
|
296
296
|
};
|
|
297
297
|
|
|
298
|
+
exports.Prisma.ConversationScalarFieldEnum = {
|
|
299
|
+
id: 'id',
|
|
300
|
+
title: 'title',
|
|
301
|
+
directoryName: 'directoryName',
|
|
302
|
+
workingDir: 'workingDir',
|
|
303
|
+
deletedAt: 'deletedAt',
|
|
304
|
+
lastActiveAt: 'lastActiveAt',
|
|
305
|
+
createdAt: 'createdAt',
|
|
306
|
+
updatedAt: 'updatedAt'
|
|
307
|
+
};
|
|
308
|
+
|
|
298
309
|
exports.Prisma.SessionScalarFieldEnum = {
|
|
299
310
|
id: 'id',
|
|
300
311
|
workspaceId: 'workspaceId',
|
|
312
|
+
conversationId: 'conversationId',
|
|
313
|
+
context: 'context',
|
|
301
314
|
agentType: 'agentType',
|
|
302
315
|
variant: 'variant',
|
|
303
316
|
providerId: 'providerId',
|
|
@@ -378,6 +391,7 @@ exports.Prisma.ModelName = {
|
|
|
378
391
|
WorkRequest: 'WorkRequest',
|
|
379
392
|
AgentInvocation: 'AgentInvocation',
|
|
380
393
|
Workspace: 'Workspace',
|
|
394
|
+
Conversation: 'Conversation',
|
|
381
395
|
Session: 'Session',
|
|
382
396
|
ExecutionProcess: 'ExecutionProcess',
|
|
383
397
|
ExecutionLog: 'ExecutionLog',
|
package/package.json
CHANGED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
-- Conversation sessions run outside Project/Task/Workspace, but still reuse
|
|
2
|
+
-- Session/ExecutionProcess/MsgStore. SQLite cannot alter a NOT NULL relation
|
|
3
|
+
-- into nullable in place, so Session is rebuilt with the new shape.
|
|
4
|
+
|
|
5
|
+
CREATE TABLE "Conversation" (
|
|
6
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
7
|
+
"title" TEXT NOT NULL,
|
|
8
|
+
"directoryName" TEXT NOT NULL,
|
|
9
|
+
"workingDir" TEXT NOT NULL,
|
|
10
|
+
"deletedAt" DATETIME,
|
|
11
|
+
"lastActiveAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
12
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
"updatedAt" DATETIME NOT NULL
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE UNIQUE INDEX "Conversation_directoryName_key" ON "Conversation"("directoryName");
|
|
17
|
+
CREATE INDEX "Conversation_deletedAt_idx" ON "Conversation"("deletedAt");
|
|
18
|
+
CREATE INDEX "Conversation_lastActiveAt_idx" ON "Conversation"("lastActiveAt");
|
|
19
|
+
|
|
20
|
+
PRAGMA foreign_keys=OFF;
|
|
21
|
+
|
|
22
|
+
CREATE TABLE "new_Session" (
|
|
23
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
24
|
+
"workspaceId" TEXT,
|
|
25
|
+
"conversationId" TEXT,
|
|
26
|
+
"context" TEXT NOT NULL DEFAULT 'WORKSPACE',
|
|
27
|
+
"agentType" TEXT NOT NULL,
|
|
28
|
+
"variant" TEXT NOT NULL DEFAULT 'DEFAULT',
|
|
29
|
+
"providerId" TEXT,
|
|
30
|
+
"prompt" TEXT NOT NULL,
|
|
31
|
+
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
32
|
+
"purpose" TEXT NOT NULL DEFAULT 'CHAT',
|
|
33
|
+
"logSnapshot" TEXT,
|
|
34
|
+
"tokenUsage" TEXT,
|
|
35
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
36
|
+
"updatedAt" DATETIME NOT NULL,
|
|
37
|
+
CONSTRAINT "Session_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
|
38
|
+
CONSTRAINT "Session_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
INSERT INTO "new_Session" (
|
|
42
|
+
"id",
|
|
43
|
+
"workspaceId",
|
|
44
|
+
"context",
|
|
45
|
+
"agentType",
|
|
46
|
+
"variant",
|
|
47
|
+
"providerId",
|
|
48
|
+
"prompt",
|
|
49
|
+
"status",
|
|
50
|
+
"purpose",
|
|
51
|
+
"logSnapshot",
|
|
52
|
+
"tokenUsage",
|
|
53
|
+
"createdAt",
|
|
54
|
+
"updatedAt"
|
|
55
|
+
)
|
|
56
|
+
SELECT
|
|
57
|
+
"id",
|
|
58
|
+
"workspaceId",
|
|
59
|
+
'WORKSPACE',
|
|
60
|
+
"agentType",
|
|
61
|
+
"variant",
|
|
62
|
+
"providerId",
|
|
63
|
+
"prompt",
|
|
64
|
+
"status",
|
|
65
|
+
"purpose",
|
|
66
|
+
"logSnapshot",
|
|
67
|
+
"tokenUsage",
|
|
68
|
+
"createdAt",
|
|
69
|
+
"updatedAt"
|
|
70
|
+
FROM "Session";
|
|
71
|
+
|
|
72
|
+
DROP TABLE "Session";
|
|
73
|
+
ALTER TABLE "new_Session" RENAME TO "Session";
|
|
74
|
+
|
|
75
|
+
CREATE UNIQUE INDEX "Session_conversationId_key" ON "Session"("conversationId");
|
|
76
|
+
CREATE INDEX "Session_workspaceId_idx" ON "Session"("workspaceId");
|
|
77
|
+
CREATE INDEX "Session_context_idx" ON "Session"("context");
|
|
78
|
+
|
|
79
|
+
PRAGMA foreign_keys=ON;
|
package/prisma/schema.prisma
CHANGED
|
@@ -264,14 +264,33 @@ model Workspace {
|
|
|
264
264
|
@@unique([parentWorkspaceId, ownerMemberId])
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
+
// 独立对话:不绑定 Project/Task/Workspace,仅复用 Session 执行链路
|
|
268
|
+
model Conversation {
|
|
269
|
+
id String @id @default(uuid())
|
|
270
|
+
title String
|
|
271
|
+
directoryName String @unique
|
|
272
|
+
workingDir String
|
|
273
|
+
session Session?
|
|
274
|
+
deletedAt DateTime?
|
|
275
|
+
lastActiveAt DateTime @default(now())
|
|
276
|
+
createdAt DateTime @default(now())
|
|
277
|
+
updatedAt DateTime @updatedAt
|
|
278
|
+
|
|
279
|
+
@@index([deletedAt])
|
|
280
|
+
@@index([lastActiveAt])
|
|
281
|
+
}
|
|
282
|
+
|
|
267
283
|
// 会话 (一次 AI 代理执行)
|
|
268
284
|
// AgentType: CLAUDE_CODE, GEMINI_CLI, CURSOR_AGENT
|
|
269
285
|
// SessionStatus: PENDING, RUNNING, COMPLETED, FAILED, CANCELLED
|
|
270
286
|
// SessionPurpose: CHAT, COMMIT_MSG
|
|
271
287
|
model Session {
|
|
272
288
|
id String @id @default(uuid())
|
|
273
|
-
workspaceId String
|
|
274
|
-
workspace Workspace
|
|
289
|
+
workspaceId String?
|
|
290
|
+
workspace Workspace? @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
|
291
|
+
conversationId String? @unique
|
|
292
|
+
conversation Conversation? @relation(fields: [conversationId], references: [id], onDelete: Cascade)
|
|
293
|
+
context String @default("WORKSPACE") // WORKSPACE: 项目工作区, CONVERSATION: 独立对话
|
|
275
294
|
agentType String
|
|
276
295
|
variant String @default("DEFAULT")
|
|
277
296
|
providerId String?
|
|
@@ -285,6 +304,7 @@ model Session {
|
|
|
285
304
|
updatedAt DateTime @updatedAt
|
|
286
305
|
|
|
287
306
|
@@index([workspaceId])
|
|
307
|
+
@@index([context])
|
|
288
308
|
}
|
|
289
309
|
|
|
290
310
|
// 执行进程
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as H,u as Q,r as n,m as b,j as e,B as y,L as X,H as Y}from"./index-Bd5HU-dB.js";import{u as Z,a as ee,b as L,c as te,d as se,e as ne,T as re,P as ae,A as le,G as ie,S as oe}from"./mermaid-NOHMQCX5-C2N-Y-YP.js";import{d as ce}from"./use-profiles-DcyUHq0p.js";import{C as de}from"./chevron-up-DtQ85g91.js";import{C as xe}from"./chevron-down-DuDzRplH.js";import"./log-adapter-CtvxzS4j.js";import"./chevron-right-BezhysME.js";import"./check-DyTLNLlk.js";const me=[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]],ue=H("hash",me);const pe=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]],he=H("send",pe),ge=!0;function Ae(){const{t:s}=Q(),[w,U]=n.useState([]),[i,S]=n.useState(""),[x,A]=n.useState("DEFAULT"),[o,k]=n.useState(""),[a,D]=n.useState(null),[l,c]=n.useState("idle"),[g,E]=n.useState(!1),[m,j]=n.useState(""),C=n.useRef(null),$=n.useRef(null),u=n.useRef(null),{data:p}=ce(i),F=p?Object.keys(p):["DEFAULT"],V=t=>{S(t),A("DEFAULT")},_=n.useCallback(t=>{c(t===0?"stopped":"error")},[]),B=n.useCallback(t=>{console.error("Agent error:",t),c("error")},[]),{isConnected:h,isAttached:f,logs:v,entries:G,agentSessionId:I,attach:z,clearLogs:P}=Z({sessionId:a||"",onExit:_,onError:B}),{todos:R}=ee(G);n.useEffect(()=>{b.get("/demo/agents").then(t=>{U(t.agents);const r=t.agents.find(N=>N.available);r&&S(r.type)})},[]),n.useEffect(()=>{C.current?.scrollToBottom("smooth")},[v]),n.useEffect(()=>{console.log(`[AgentDemoPage:useEffect] t=${Date.now()} sessionId=${a} isConnected=${h} isAttached=${f}`),a&&h&&!f&&(console.log(`[AgentDemoPage:useEffect] t=${Date.now()} calling attach()`),z())},[a,h,f,z]);const M=t=>{if(j(t.target.value),u.current){u.current.style.height="auto";const N=Math.min(u.current.scrollHeight,210);u.current.style.height=`${N}px`}},O=async()=>{if(!i||!o.trim())return;const t=Date.now();console.log(`[AgentDemoPage:handleStart] t=${t} starting...`),c("starting"),P();try{const r=await b.post("/demo/start",{agentType:i,prompt:o.trim(),variant:x});ge&&console.log(`[AgentDemoPage:handleStart] t=${Date.now()} apiTime=${Date.now()-t}ms sessionId=${r.sessionId}`),D(r.sessionId),c("running")}catch(r){console.error("Start failed:",r),c("error")}},T=async()=>{if(!a||!m.trim())return;const t=m.trim();j("");try{await b.post(`/demo/${a}/message`,{message:t})}catch(r){console.error("Send failed:",r)}},K=async()=>{if(a)try{await b.post(`/demo/${a}/stop`),c("stopped")}catch(t){console.error("Stop failed:",t)}},q=()=>{D(null),c("idle"),k(""),j(""),P()},J=l==="running",d=a!==null,W=w.find(t=>t.type===i);return e.jsxs("div",{className:"flex flex-col h-full bg-white",children:[e.jsxs("div",{className:"px-8 py-5 border-b border-neutral-100 bg-white transition-all duration-300",children:[e.jsxs("div",{className:"flex items-center flex-wrap gap-3",children:[e.jsxs("div",{className:"flex items-baseline gap-2",children:[e.jsx("span",{className:"text-base font-medium text-blue-600",children:"Agent Demo"}),e.jsx("span",{className:"text-neutral-300 text-sm",children:"/"}),e.jsx("span",{className:"text-xl font-bold text-neutral-900 tracking-tight",children:d?o.slice(0,50)+(o.length>50?"...":""):s("新会话")})]}),e.jsxs("div",{className:"flex items-center",children:[l==="running"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-blue-50 text-blue-700 rounded-full text-xs font-medium border border-blue-100",children:[e.jsx(L,{className:"w-3.5 h-3.5 animate-pulse"}),e.jsx("span",{children:"Running"})]}),l==="stopped"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-emerald-50 text-emerald-700 rounded-full text-xs font-medium border border-emerald-100",children:[e.jsx(te,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Done"})]}),l==="idle"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-neutral-100 text-neutral-600 rounded-full text-xs font-medium border border-neutral-200",children:[e.jsx(se,{className:"w-3.5 h-3.5"}),e.jsx("span",{children:"Idle"})]}),l==="starting"&&e.jsxs("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-amber-50 text-amber-700 rounded-full text-xs font-medium border border-amber-100",children:[e.jsx(L,{className:"w-3.5 h-3.5 animate-spin"}),e.jsx("span",{children:"Starting..."})]}),l==="error"&&e.jsx("div",{className:"flex items-center gap-1.5 px-2.5 py-0.5 bg-red-50 text-red-700 rounded-full text-xs font-medium border border-red-100",children:e.jsx("span",{children:"Error"})})]})]}),d&&e.jsxs("div",{className:"mt-1.5 flex items-start gap-2 group max-w-4xl",children:[e.jsx("div",{className:`text-sm text-neutral-600 leading-relaxed cursor-pointer transition-all ${g?"":"truncate"}`,onClick:()=>E(!g),children:o}),e.jsx("button",{onClick:()=>E(!g),className:"mt-0.5 text-neutral-400 opacity-0 group-hover:opacity-100 hover:text-neutral-600 transition-opacity",children:g?e.jsx(de,{size:14}):e.jsx(xe,{size:14})})]}),e.jsxs("div",{className:"flex items-center gap-6 mt-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Agent"}),e.jsx("div",{className:"flex items-center gap-1.5 text-neutral-900 font-medium bg-neutral-50 px-2 py-1 rounded border border-neutral-100",children:W?.name||i||s("未选择")})]}),x!=="DEFAULT"&&e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Variant"}),e.jsx("div",{className:"flex items-center gap-1.5 text-neutral-700 font-medium bg-blue-50 px-2 py-1 rounded border border-blue-100",children:x})]}),I&&e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:"Session"}),e.jsxs("div",{className:"flex items-center gap-1.5 text-neutral-700 font-mono bg-neutral-50 px-2 py-1 rounded border border-neutral-100",children:[I.slice(0,8),"..."]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"text-neutral-400 font-medium",children:s("连接")}),e.jsx("div",{className:`flex items-center gap-1.5 font-medium px-2 py-1 rounded border ${h?"text-emerald-700 bg-emerald-50 border-emerald-100":"text-neutral-500 bg-neutral-50 border-neutral-100"}`,children:s(h?f?"已连接":"连接中...":"未连接")})]}),d&&e.jsx(y,{variant:"outline",size:"sm",onClick:q,className:"ml-auto",children:s("新会话")}),e.jsxs(X,{to:"/settings/profiles",className:`flex items-center gap-1.5 text-xs text-neutral-500 hover:text-neutral-900 transition-colors ${d?"":"ml-auto"}`,children:[e.jsx(Y,{size:14}),e.jsx("span",{children:s("Profiles 设置")})]})]})]}),e.jsx("div",{ref:$,className:"flex-1 overflow-y-auto px-8 py-6",children:d?e.jsx("div",{className:"min-h-[200px]",children:v.length===0?e.jsx("div",{className:"text-neutral-400 text-center py-8",children:s("等待 Agent 响应...")}):e.jsx(ne,{ref:C,logs:v,scrollElementRef:$})}):e.jsxs("div",{className:"max-w-2xl mx-auto space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:s("选择 Agent")}),e.jsx("div",{className:"flex gap-2 flex-wrap",children:w.map(t=>e.jsxs(y,{variant:i===t.type?"default":"outline",disabled:!t.available,onClick:()=>V(t.type),children:[t.name,t.available&&t.version&&` (${t.version})`,!t.available&&s(" (不可用)")]},t.type))})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:s("配置变体 (Profile Variant)")}),e.jsx("div",{className:"flex gap-2 flex-wrap",children:F.map(t=>e.jsx("button",{onClick:()=>A(t),className:`px-3 py-1.5 rounded-full text-sm font-medium border transition-colors ${x===t?"bg-neutral-900 text-white border-neutral-900":"bg-white text-neutral-600 border-neutral-200 hover:border-neutral-400"}`,children:t},t))}),p&&p[x]&&e.jsx("p",{className:"mt-2 text-xs text-neutral-500 font-mono",children:Object.entries(p[x]).map(([t,r])=>`${t}: ${JSON.stringify(r)}`).join(", ")})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3 text-neutral-900",children:s("输入任务")}),e.jsxs("div",{className:"relative border border-neutral-200 rounded-xl shadow-sm bg-white focus-within:ring-1 focus-within:ring-neutral-300 focus-within:border-neutral-300 transition-all duration-200",children:[e.jsx("textarea",{value:o,onChange:t=>k(t.target.value),rows:4,placeholder:s("描述你想让 Agent 完成的任务..."),className:"w-full px-4 py-3 bg-transparent border-none focus:outline-none focus:ring-0 resize-none text-neutral-900 placeholder-neutral-400 leading-relaxed text-sm"}),e.jsx("div",{className:"flex items-center justify-end px-3 pb-3 pt-1",children:e.jsx(y,{onClick:O,disabled:l==="starting"||!i||!o.trim(),children:s(l==="starting"?"启动中...":"开始")})})]})]})]})}),d&&R.length>0&&e.jsx("div",{className:"px-8 py-2 bg-white border-t border-neutral-100",children:e.jsx(re,{todos:R})}),d&&e.jsx("div",{className:"px-8 py-6 border-t border-neutral-100 bg-white",children:e.jsxs("div",{className:"relative border border-neutral-200 rounded-xl shadow-sm bg-white focus-within:ring-1 focus-within:ring-neutral-300 focus-within:border-neutral-300 transition-all duration-200",children:[e.jsx("textarea",{ref:u,value:m,onChange:M,rows:3,placeholder:s("发送消息给 Agent..."),className:"w-full px-4 py-3 bg-transparent border-none focus:outline-none focus:ring-0 resize-none text-neutral-900 placeholder-neutral-400 leading-relaxed text-sm scrollbar-thin scrollbar-thumb-neutral-200 scrollbar-track-transparent",style:{minHeight:"80px",maxHeight:"210px"},onKeyDown:t=>{t.key==="Enter"&&!t.shiftKey&&!t.repeat&&!t.nativeEvent.isComposing&&t.nativeEvent.keyCode!==229&&(t.preventDefault(),T())}}),e.jsxs("div",{className:"flex items-center justify-between px-3 pb-3 pt-1 border-t border-transparent",children:[e.jsxs("div",{className:"flex items-center gap-1 text-neutral-400",children:[e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Attach File",children:e.jsx(ae,{size:18})}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Mention",children:e.jsx(le,{size:18})}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Reference Issue",children:e.jsx(ue,{size:18})}),e.jsx("div",{className:"w-px h-4 bg-neutral-200 mx-1"}),e.jsx("button",{className:"p-2 hover:bg-neutral-100 hover:text-neutral-600 rounded-lg transition-colors",title:"Search Web",children:e.jsx(ie,{size:18})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[J&&e.jsxs("button",{onClick:K,className:"flex items-center gap-2 px-3 py-2 text-xs font-semibold text-red-600 bg-red-50 hover:bg-red-100 rounded-lg transition-colors",children:[e.jsx(oe,{size:12,fill:"currentColor"}),e.jsx("span",{children:s("停止")})]}),e.jsxs("button",{onClick:T,disabled:!m.trim(),className:`flex items-center gap-2 px-3 py-2 text-xs font-semibold rounded-lg transition-all ${m.trim()?"bg-neutral-900 text-white hover:bg-black shadow-sm":"bg-neutral-100 text-neutral-400 cursor-not-allowed"}`,children:[e.jsx("span",{children:s("发送")}),e.jsx(he,{size:14})]})]})]})]})})]})}export{Ae as AgentDemoPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h 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,K as B,d as L,e as j,M,B as W,f as z,J as A}from"./index-Bd5HU-dB.js";import{S as K}from"./select-CCf5nwYs.js";import{I as d}from"./input-BxcpVmsb.js";import{S as Q,C as O}from"./switch-DsjSr4nv.js";import{M as _}from"./message-square-B-2bz9LU.js";import{L as D}from"./loader-circle-B4v8mirO.js";import{C as H}from"./circle-alert-IhLKVEi9.js";import"./chevron-down-DuDzRplH.js";import"./check-DyTLNLlk.js";const J=[["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"}]],G=P("link",J);function V(){return q({queryKey:v.notifications.settings,queryFn:()=>h.get("/notifications/settings")})}function X(){const t=E();return k({mutationFn:i=>h.put("/notifications/settings",i),onSuccess:()=>{t.invalidateQueries({queryKey:v.notifications.settings})}})}function Y(){return k({mutationFn:t=>h.post("/notifications/test",t)})}function le(){const{t}=R(),{data:i,isLoading:y}=V(),l=X(),n=Y(),N=[{value:"none",label:t("关闭")},{value:"feishu",label:t("飞书 Webhook")}],[a,p]=o.useState({webhookUrl:"",baseUrl:"",titleTemplate:"",bodyTemplate:""}),[m,x]=o.useState(!1),[f,r]=o.useState("idle"),u=o.useRef(void 0);if(o.useEffect(()=>{i&&!m&&p({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)=>{p(F=>({...F,[s]:I})),x(!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:()=>x(!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(L,{title:t("通知设置"),className:"mb-1"}),e.jsxs("div",{className:"divide-y divide-border/60",children:[e.jsx(j,{icon:M,label:t("桌面通知"),description:t("任务完成时弹出系统通知"),align:"center",controlWidth:"auto",children:e.jsx(Q,{checked:T,onCheckedChange:S,"aria-label":t("桌面通知")})}),e.jsxs("div",{className:"py-5",children:[e.jsx(j,{icon:_,label:t("第三方通知"),description:t("推送到外部渠道(飞书群机器人等)"),align:"center",className:"py-0",children:e.jsx(K,{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(W,{size:"sm",variant:"outline",onClick:w,disabled:!a.webhookUrl.trim()||n.isPending,className:"h-auto shrink-0",children:[n.isPending&&e.jsx(D,{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(O,{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(G,{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(z,{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(A,{saving:l.isPending,onSave:U})]})}export{le as NotificationSettingsPage};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{u as T,r as g,j as e,S,d as J,n as M,o as w,B as E,p,g as P}from"./index-Bd5HU-dB.js";import{u as U,a as _,b as z,c as B}from"./use-profiles-DcyUHq0p.js";import{M as F,P as G,T as $}from"./modal-C6m1dmin.js";import{C as R}from"./confirm-dialog-Amksh2QM.js";import{I as H}from"./input-BxcpVmsb.js";import{T as q}from"./textarea-BzeEPT1A.js";import{L as K}from"./layers-Dqjek9Kd.js";import{C as Q}from"./chevron-down-DuDzRplH.js";import{P as W}from"./pencil-DzjmtIoi.js";function X(t){const a=Object.entries(t);return a.length===0?"(empty)":a.map(([m,c])=>`${m}: ${JSON.stringify(c)}`).join(", ")}const y={CLAUDE_CODE:"Claude Code",GEMINI_CLI:"Gemini CLI",CURSOR_AGENT:"Cursor Agent"};function Y({agentType:t,variants:a,isBuiltIn:m,onEdit:c,onNew:h,onDelete:j}){const{t:n}=T(),[r,b]=g.useState(!0),u=Object.entries(a);return e.jsxs("div",{className:"overflow-hidden rounded-lg border border-border",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 bg-muted/40 px-4 py-3",children:[e.jsxs("button",{type:"button",onClick:()=>b(i=>!i),"aria-expanded":r,className:"flex items-center gap-3 rounded-md transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60",children:[e.jsx("h3",{className:"text-[13px] font-semibold text-foreground",children:y[t]??t}),e.jsxs("span",{className:"text-[11px] text-muted-foreground",children:[u.length," ",n("个变体")]}),e.jsx(Q,{size:14,"aria-hidden":"true",className:P("text-muted-foreground transition-transform motion-reduce:transition-none",r&&"rotate-180")})]}),e.jsxs("button",{type:"button",onClick:h,className:"flex items-center gap-1 rounded-md px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-background hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60",children:[e.jsx(G,{size:12,"aria-hidden":"true"}),n("新增")]})]}),r&&e.jsxs("div",{className:"divide-y divide-border/60",children:[u.map(([i,x])=>{const f=m(i);return e.jsxs("div",{className:"flex items-center gap-3 px-4 py-2.5 transition-colors hover:bg-muted/40",children:[e.jsx("span",{className:P("inline-flex shrink-0 items-center rounded px-2 py-0.5 text-[11px] font-semibold tracking-wide",i==="DEFAULT"?"bg-primary/[0.06] text-primary":"bg-muted text-muted-foreground"),children:i}),e.jsx("span",{className:"min-w-0 flex-1 truncate font-mono text-xs text-muted-foreground",children:X(x)}),f&&e.jsx("span",{className:"shrink-0 text-[10px] font-medium text-muted-foreground/70",children:n("内置")}),e.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[e.jsx("button",{onClick:()=>c(i,x),className:"flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60",title:n("编辑"),"aria-label":n("编辑"),children:e.jsx(W,{size:12})}),!f&&e.jsx("button",{onClick:()=>j(i),className:"flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60",title:n("删除"),"aria-label":n("删除"),children:e.jsx($,{size:12})})]})]},i)}),u.length===0&&e.jsx("div",{className:"px-4 py-4 text-center text-xs text-muted-foreground",children:n("暂无变体")})]})]})}function Z(){return e.jsxs("div",{role:"status","aria-label":"Loading",children:[e.jsx(p,{className:"h-7 w-36"}),e.jsx(p,{className:"mt-2 h-3.5 w-72 max-w-full"}),e.jsx("div",{className:"mt-5 space-y-3",children:Array.from({length:2}).map((t,a)=>e.jsxs("div",{className:"overflow-hidden rounded-lg border border-border",children:[e.jsxs("div",{className:"flex items-center gap-3 bg-muted/40 px-4 py-3",children:[e.jsx(p,{className:"h-4 w-28"}),e.jsx(p,{className:"h-3 w-14"})]}),e.jsx("div",{className:"divide-y divide-border/60",children:Array.from({length:2}).map((m,c)=>e.jsxs("div",{className:"flex items-center gap-3 px-4 py-2.5",children:[e.jsx(p,{className:"h-5 w-16 rounded"}),e.jsx(p,{className:"h-3.5 flex-1"})]},c))})]},a))})]})}function de(){const{t}=T(),{data:a,isLoading:m}=U(),{data:c}=_(),h=z(),j=B(),[n,r]=g.useState(null),[b,u]=g.useState(""),[i,x]=g.useState(""),[f,v]=g.useState(""),[o,N]=g.useState(null),k=(s,l,d)=>{r({agentType:s,variant:l,config:d,isNew:!1}),x(l),u(JSON.stringify(d,null,2)),v("")},O=s=>{r({agentType:s,variant:"",config:{},isNew:!0}),x(""),u(`{
|
|
2
|
-
|
|
3
|
-
}`),v("")},D=()=>{if(!(!n||!i.trim()))try{const s=JSON.parse(b);v(""),h.mutate({agentType:n.agentType,variant:i.trim().toUpperCase(),config:s},{onSuccess:()=>r(null)})}catch{v(t("JSON 格式错误"))}},L=(s,l)=>{N({agentType:s,variant:l})},A=()=>{o&&j.mutate({agentType:o.agentType,variant:o.variant},{onSettled:()=>N(null)})},I=(s,l)=>!!c?.executors[s]?.[l];if(m)return e.jsx(S,{children:e.jsx(Z,{})});const C=a?.executors??{};return e.jsxs(S,{children:[e.jsx(J,{title:t("Profile 配置"),description:t("管理 Agent 执行器的配置变体。每个变体定义一组运行参数。"),className:"mb-4"}),e.jsx("div",{className:"space-y-3",children:Object.entries(C).map(([s,l])=>e.jsx(Y,{agentType:s,variants:l,isBuiltIn:d=>I(s,d),onEdit:(d,V)=>k(s,d,V),onNew:()=>O(s),onDelete:d=>L(s,d)},s))}),Object.keys(C).length===0&&e.jsx(M,{icon:K,message:t("暂无 Profile 配置")}),e.jsx(F,{isOpen:!!n,onClose:()=>r(null),title:n?.isNew?t("新增 Variant — {agentType}",{agentType:y[n.agentType]??n.agentType}):t("编辑 {variant}",{variant:n?.variant??""}),action:e.jsxs(e.Fragment,{children:[e.jsx(E,{variant:"outline",onClick:()=>r(null),children:t("取消")}),e.jsx(E,{onClick:D,disabled:h.isPending,children:h.isPending?t("保存中..."):t("保存")})]}),children:e.jsxs("div",{className:"space-y-4",children:[e.jsx(w,{label:t("Variant 名称"),htmlFor:"profile-variant-name",children:e.jsx(H,{id:"profile-variant-name",value:i,onChange:s=>x(s.target.value),disabled:!n?.isNew,placeholder:t("例如: CUSTOM"),className:"font-mono"})}),e.jsxs(w,{label:t("配置 (JSON)"),htmlFor:"profile-variant-json",children:[e.jsx(q,{id:"profile-variant-json",value:b,onChange:s=>{u(s.target.value),v("")},rows:6,className:"resize-none font-mono","aria-invalid":!!f}),f&&e.jsx("p",{role:"alert",className:"mt-1 text-xs text-destructive",children:f})]})]})}),e.jsx(R,{isOpen:o!==null,onClose:()=>{j.isPending||N(null)},onConfirm:A,title:t("删除 Profile Variant"),description:o?t('确定删除 "{name}"?此操作不可撤销。',{name:`${y[o.agentType]??o.agentType} / ${o.variant}`}):"",confirmText:t("删除"),cancelText:t("取消"),variant:"danger",isLoading:j.isPending})]})}export{de as ProfileSettingsPage};
|