agent-tower 0.4.14 → 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 (154) 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/index.d.ts +0 -3
  81. package/dist/socket/index.d.ts.map +1 -1
  82. package/dist/socket/index.js +0 -4
  83. package/dist/socket/index.js.map +1 -1
  84. package/dist/socket/socket-gateway.d.ts +0 -3
  85. package/dist/socket/socket-gateway.d.ts.map +1 -1
  86. package/dist/socket/socket-gateway.js +20 -52
  87. package/dist/socket/socket-gateway.js.map +1 -1
  88. package/dist/web/assets/AgentDemoPage-p9YI4_l4.js +1 -0
  89. package/dist/web/assets/DemoPage-B5DTSEbS.js +4 -0
  90. package/dist/web/assets/{GeneralSettingsPage-DggKcdQM.js → GeneralSettingsPage-Cspr7Vol.js} +1 -1
  91. package/dist/web/assets/{NotificationSettingsPage-fDjeTfPh.js → NotificationSettingsPage-C9VfrRr-.js} +1 -1
  92. package/dist/web/assets/{ProfileSettingsPage-CWVSxzJw.js → ProfileSettingsPage-CNugU40a.js} +1 -1
  93. package/dist/web/assets/ProjectKanbanPage-CkGNuqxq.js +87 -0
  94. package/dist/web/assets/ProjectSettingsPage-f1dg0XMf.js +2 -0
  95. package/dist/web/assets/{ProviderSettingsPage-A_AoWMBp.js → ProviderSettingsPage-D_KWkgRM.js} +1 -1
  96. package/dist/web/assets/TeamSettingsPage-B6WciZyi.js +1 -0
  97. package/dist/web/assets/{button-5iX1e_fm.js → button-B6JaSbDB.js} +1 -1
  98. package/dist/web/assets/{chevron-down-BXQh2Wxh.js → chevron-down-CACy4UFq.js} +1 -1
  99. package/dist/web/assets/{chevron-right-Cpp4WiwB.js → chevron-right-DFWfnDJY.js} +1 -1
  100. package/dist/web/assets/chevron-up-CGlf6jzw.js +1 -0
  101. package/dist/web/assets/{circle-alert-B4o7LpBN.js → circle-alert-BSAUEd9O.js} +1 -1
  102. package/dist/web/assets/{circle-check-0QrYHY8C.js → circle-check-DMK8auwb.js} +1 -1
  103. package/dist/web/assets/{code-block-OCS4YCEC-CyOCA4DG.js → code-block-OCS4YCEC-Hn75KHRK.js} +1 -1
  104. package/dist/web/assets/{confirm-dialog-DnYr0-iE.js → confirm-dialog-DHI2f7Ni.js} +1 -1
  105. package/dist/web/assets/folder-picker-CtQkbWfa.js +1 -0
  106. package/dist/web/assets/index-BFAA3PTl.js +13 -0
  107. package/dist/web/assets/index-mBCb67dB.css +1 -0
  108. package/dist/web/assets/{loader-circle-DvZK36Ga.js → loader-circle-CkDnf8ST.js} +1 -1
  109. package/dist/web/assets/{mermaid-NOHMQCX5-xPQ5tFq8.js → mermaid-NOHMQCX5-DJFgrXPd.js} +60 -60
  110. package/dist/web/assets/modal-B5IRN7QI.js +1 -0
  111. package/dist/web/assets/{pencil-CNuySmPC.js → pencil-CJY6Ahn7.js} +1 -1
  112. package/dist/web/assets/{select-DOJOMQ5p.js → select-BPZZlla1.js} +1 -1
  113. package/dist/web/assets/{use-profiles-CGAx71Yx.js → use-profiles-C2k04ICZ.js} +1 -1
  114. package/dist/web/assets/use-projects-BxuE-ulT.js +1 -0
  115. package/dist/web/assets/{use-providers-RzfgfeZ2.js → use-providers-C7fIDWzP.js} +1 -1
  116. package/dist/web/index.html +2 -2
  117. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +10 -0
  118. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -1
  119. package/node_modules/@agent-tower/shared/dist/socket/events.js +1 -0
  120. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -1
  121. package/node_modules/@agent-tower/shared/dist/types.d.ts +153 -0
  122. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  123. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  124. package/node_modules/@prisma/client/.prisma/client/default.d.ts +1 -0
  125. package/node_modules/@prisma/client/.prisma/client/default.js +1 -0
  126. package/node_modules/@prisma/client/.prisma/client/edge.d.ts +1 -0
  127. package/node_modules/@prisma/client/.prisma/client/edge.js +392 -0
  128. package/node_modules/@prisma/client/.prisma/client/index-browser.js +381 -0
  129. package/node_modules/@prisma/client/.prisma/client/index.d.ts +25768 -0
  130. package/node_modules/@prisma/client/.prisma/client/index.js +417 -0
  131. package/node_modules/@prisma/client/.prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  132. package/node_modules/@prisma/client/.prisma/client/package.json +97 -0
  133. package/node_modules/@prisma/client/.prisma/client/query_engine-windows.dll.node +0 -0
  134. package/node_modules/@prisma/client/.prisma/client/schema.prisma +280 -0
  135. package/node_modules/@prisma/client/.prisma/client/wasm.d.ts +1 -0
  136. package/node_modules/@prisma/client/.prisma/client/wasm.js +381 -0
  137. package/node_modules/@prisma/client/package.json +3 -2
  138. package/package.json +2 -1
  139. package/prisma/migrations/20260518000000_add_team_run_collaboration/migration.sql +150 -0
  140. package/prisma/migrations/20260522000000_add_team_member_session_policy/migration.sql +2 -0
  141. package/prisma/schema.prisma +131 -1
  142. package/dist/socket/rooms.d.ts +0 -30
  143. package/dist/socket/rooms.d.ts.map +0 -1
  144. package/dist/socket/rooms.js +0 -39
  145. package/dist/socket/rooms.js.map +0 -1
  146. package/dist/web/assets/AgentDemoPage-BskuObus.js +0 -1
  147. package/dist/web/assets/DemoPage-DM2NLFlQ.js +0 -4
  148. package/dist/web/assets/ProjectKanbanPage-DHNpmw-4.js +0 -87
  149. package/dist/web/assets/ProjectSettingsPage-Cf4D6UFs.js +0 -2
  150. package/dist/web/assets/folder-picker-CTcrs_BC.js +0 -1
  151. package/dist/web/assets/index-BGvfX18x.css +0 -1
  152. package/dist/web/assets/index-BLRui4ck.js +0 -13
  153. package/dist/web/assets/modal-CvoxLn2x.js +0 -1
  154. package/dist/web/assets/rotate-ccw-BusOGXw0.js +0 -1
@@ -1,5 +1,6 @@
1
1
  generator client {
2
- provider = "prisma-client-js"
2
+ provider = "prisma-client-js"
3
+ binaryTargets = ["native", "windows"]
3
4
  }
4
5
 
5
6
  datasource db {
@@ -40,6 +41,7 @@ model Task {
40
41
  projectId String
41
42
  project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
42
43
  workspaces Workspace[]
44
+ teamRun TeamRun?
43
45
  createdAt DateTime @default(now())
44
46
  updatedAt DateTime @updatedAt
45
47
 
@@ -47,6 +49,134 @@ model Task {
47
49
  @@index([status])
48
50
  }
49
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
+
50
180
  // 工作空间 (对应一个 git worktree)
51
181
  // WorkspaceStatus: ACTIVE, MERGED, ABANDONED, HIBERNATED
52
182
  model Workspace {
@@ -1,30 +0,0 @@
1
- /**
2
- * 房间名称生成工具
3
- * 统一管理房间命名规则
4
- */
5
- export declare const getRoomName: {
6
- /**
7
- * 看板房间
8
- * 用于看板内的实时协作
9
- */
10
- board: (boardId: string) => string;
11
- /**
12
- * 用户私人房间
13
- * 用于接收个人通知
14
- */
15
- user: (userId: string) => string;
16
- /**
17
- * 项目房间(可选)
18
- * 用于项目级别的广播
19
- */
20
- project: (projectId: string) => string;
21
- };
22
- /**
23
- * 从房间名称解析 ID
24
- */
25
- export declare const parseRoomName: {
26
- board: (roomName: string) => string | null;
27
- user: (roomName: string) => string | null;
28
- project: (roomName: string) => string | null;
29
- };
30
- //# sourceMappingURL=rooms.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../../src/socket/rooms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,WAAW;IACtB;;;OAGG;qBACc,MAAM;IAEvB;;;OAGG;mBACY,MAAM;IAErB;;;OAGG;yBACkB,MAAM;CAC5B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;sBACN,MAAM,KAAG,MAAM,GAAG,IAAI;qBAKvB,MAAM,KAAG,MAAM,GAAG,IAAI;wBAKnB,MAAM,KAAG,MAAM,GAAG,IAAI;CAI3C,CAAA"}
@@ -1,39 +0,0 @@
1
- /**
2
- * 房间名称生成工具
3
- * 统一管理房间命名规则
4
- */
5
- export const getRoomName = {
6
- /**
7
- * 看板房间
8
- * 用于看板内的实时协作
9
- */
10
- board: (boardId) => `board:${boardId}`,
11
- /**
12
- * 用户私人房间
13
- * 用于接收个人通知
14
- */
15
- user: (userId) => `user:${userId}`,
16
- /**
17
- * 项目房间(可选)
18
- * 用于项目级别的广播
19
- */
20
- project: (projectId) => `project:${projectId}`,
21
- };
22
- /**
23
- * 从房间名称解析 ID
24
- */
25
- export const parseRoomName = {
26
- board: (roomName) => {
27
- const match = roomName.match(/^board:(.+)$/);
28
- return match ? match[1] : null;
29
- },
30
- user: (roomName) => {
31
- const match = roomName.match(/^user:(.+)$/);
32
- return match ? match[1] : null;
33
- },
34
- project: (roomName) => {
35
- const match = roomName.match(/^project:(.+)$/);
36
- return match ? match[1] : null;
37
- },
38
- };
39
- //# sourceMappingURL=rooms.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../../src/socket/rooms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB;;;OAGG;IACH,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,SAAS,OAAO,EAAE;IAE9C;;;OAGG;IACH,IAAI,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,QAAQ,MAAM,EAAE;IAE1C;;;OAGG;IACH,OAAO,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,WAAW,SAAS,EAAE;CACvD,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,CAAC,QAAgB,EAAiB,EAAE;QACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChC,CAAC;IAED,IAAI,EAAE,CAAC,QAAgB,EAAiB,EAAE;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAC3C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChC,CAAC;IAED,OAAO,EAAE,CAAC,QAAgB,EAAiB,EAAE;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChC,CAAC;CACF,CAAA"}
@@ -1 +0,0 @@
1
- import{h as j,u as Q,r as n,g as b,j as e,L as X}from"./index-BLRui4ck.js";import{u as Y,a as Z,b as _,c as ee,d as te,S as se,e as ne,T as re,P as ae,G as le,f as ie}from"./mermaid-NOHMQCX5-xPQ5tFq8.js";import{B as w}from"./button-5iX1e_fm.js";import{d as oe}from"./use-profiles-CGAx71Yx.js";import{C as ce}from"./chevron-down-BXQh2Wxh.js";import"./log-adapter-CeKrvZcz.js";import"./chevron-right-Cpp4WiwB.js";import"./utils-CkSf8FUe.js";const de=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8",key:"7n84p3"}]],xe=j("at-sign",de);const me=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],ue=j("chevron-up",me);const pe=[["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"}]],he=j("hash",pe);const ge=[["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"}]],fe=j("send",ge),be=!0;function De(){const{t:s}=Q(),[S,H]=n.useState([]),[i,k]=n.useState(""),[x,A]=n.useState("DEFAULT"),[o,D]=n.useState(""),[a,E]=n.useState(null),[l,c]=n.useState("idle"),[g,$]=n.useState(!1),[m,v]=n.useState(""),C=n.useRef(null),I=n.useRef(null),u=n.useRef(null),{data:p}=oe(i),U=p?Object.keys(p):["DEFAULT"],F=t=>{k(t),A("DEFAULT")},M=n.useCallback(t=>{c(t===0?"stopped":"error")},[]),V=n.useCallback(t=>{console.error("Agent error:",t),c("error")},[]),{isConnected:h,isAttached:f,logs:N,entries:B,agentSessionId:z,attach:P,clearLogs:R}=Y({sessionId:a||"",onExit:M,onError:V}),{todos:T}=Z(B);n.useEffect(()=>{b.get("/demo/agents").then(t=>{H(t.agents);const r=t.agents.find(y=>y.available);r&&k(r.type)})},[]),n.useEffect(()=>{C.current?.scrollToBottom("smooth")},[N]),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()`),P())},[a,h,f,P]);const G=t=>{if(v(t.target.value),u.current){u.current.style.height="auto";const y=Math.min(u.current.scrollHeight,210);u.current.style.height=`${y}px`}},O=async()=>{if(!i||!o.trim())return;const t=Date.now();console.log(`[AgentDemoPage:handleStart] t=${t} starting...`),c("starting"),R();try{const r=await b.post("/demo/start",{agentType:i,prompt:o.trim(),variant:x});be&&console.log(`[AgentDemoPage:handleStart] t=${Date.now()} apiTime=${Date.now()-t}ms sessionId=${r.sessionId}`),E(r.sessionId),c("running")}catch(r){console.error("Start failed:",r),c("error")}},L=async()=>{if(!a||!m.trim())return;const t=m.trim();v("");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=()=>{E(null),c("idle"),D(""),v(""),R()},J=l==="running",d=a!==null,W=S.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(_,{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(ee,{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(te,{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(_,{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:()=>$(!g),children:o}),e.jsx("button",{onClick:()=>$(!g),className:"mt-0.5 text-neutral-400 opacity-0 group-hover:opacity-100 hover:text-neutral-600 transition-opacity",children:g?e.jsx(ue,{size:14}):e.jsx(ce,{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})]}),z&&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:[z.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(w,{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(se,{size:14}),e.jsx("span",{children:s("Profiles 设置")})]})]})]}),e.jsx("div",{ref:I,className:"flex-1 overflow-y-auto px-8 py-6",children:d?e.jsx("div",{className:"min-h-[200px]",children:N.length===0?e.jsx("div",{className:"text-neutral-400 text-center py-8",children:s("等待 Agent 响应...")}):e.jsx(ne,{ref:C,logs:N,scrollElementRef:I})}):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:S.map(t=>e.jsxs(w,{variant:i===t.type?"default":"outline",disabled:!t.available,onClick:()=>F(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:U.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=>D(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(w,{onClick:O,disabled:l==="starting"||!i||!o.trim(),children:s(l==="starting"?"启动中...":"开始")})})]})]})]})}),d&&T.length>0&&e.jsx("div",{className:"px-8 py-2 bg-white border-t border-neutral-100",children:e.jsx(re,{todos:T})}),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:G,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(),L())}}),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(xe,{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(he,{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(le,{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(ie,{size:12,fill:"currentColor"}),e.jsx("span",{children:s("停止")})]}),e.jsxs("button",{onClick:L,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(fe,{size:14})]})]})]})]})})]})}export{De as AgentDemoPage};
@@ -1,4 +0,0 @@
1
- import{r as o,s as v,S as m,C as k,j as s,u as T,g as R}from"./index-BLRui4ck.js";import{B}from"./button-5iX1e_fm.js";import{c as $}from"./utils-CkSf8FUe.js";function M(n){const{sessionId:c,onOutput:j,onExit:p,onError:N}=n,[S,g]=o.useState(()=>v.isConnected()),[l,u]=o.useState(!1),f=o.useRef({onOutput:j,onExit:p,onError:N});f.current={onOutput:j,onExit:p,onError:N},o.useEffect(()=>{const t=v.getSocket();g(t.connected);const i=()=>g(!0),h=()=>{g(!1),u(!1)},D=r=>{r.sessionId===c&&f.current.onOutput?.(r.data)},O=r=>{r.sessionId===c&&(u(!1),f.current.onExit?.(r.exitCode))},I=r=>{r.sessionId===c&&f.current.onError?.(r.message)},b=r=>{r.sessionId===c&&u(!0)},C=r=>{r.sessionId===c&&u(!1)};return t.on("connect",i),t.on("disconnect",h),t.on(m.SESSION_STDOUT,D),t.on(m.SESSION_EXIT,O),t.on(m.SESSION_ERROR,I),t.on(m.SESSION_SUBSCRIBED,b),t.on(m.SESSION_UNSUBSCRIBED,C),g(t.connected),()=>{t.off("connect",i),t.off("disconnect",h),t.off(m.SESSION_STDOUT,D),t.off(m.SESSION_EXIT,O),t.off(m.SESSION_ERROR,I),t.off(m.SESSION_SUBSCRIBED,b),t.off(m.SESSION_UNSUBSCRIBED,C),t.emit(k.UNSUBSCRIBE,{topic:"session",id:c})}},[c]);const d=o.useCallback(()=>new Promise(t=>{const i=v.getSocket();if(!i.connected){t(!1);return}i.emit(k.SUBSCRIBE,{topic:"session",id:c},h=>{t(h.success)})}),[c]),y=o.useCallback(()=>{v.getSocket().emit(k.UNSUBSCRIBE,{topic:"session",id:c})},[c]),w=o.useCallback(t=>{v.getSocket().emit(k.INPUT,{sessionId:c,data:t})},[c]),E=o.useCallback((t,i)=>{v.getSocket().emit(k.RESIZE,{sessionId:c,cols:t,rows:i})},[c]);return{isConnected:S,isAttached:l,attach:d,detach:y,sendInput:w,resize:E}}function A({className:n,...c}){return s.jsx("div",{"data-slot":"card",className:$("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",n),...c})}function L(){const{t:n}=T(),[c,j]=o.useState([]),[p,N]=o.useState(""),[S,g]=o.useState(""),[l,u]=o.useState(null),[f,d]=o.useState([]),[y,w]=o.useState(!1),[E,t]=o.useState(""),i=o.useRef(null),h=o.useCallback(e=>{d(a=>{const x=a[a.length-1];return x&&x.role==="agent"?[...a.slice(0,-1),{...x,content:x.content+e}]:[...a,{role:"agent",content:e,timestamp:new Date}]})},[]),D=o.useCallback(e=>{d(a=>[...a,{role:"agent",content:`
2
- [进程退出,退出码: ${e}]`,timestamp:new Date}]),u(null)},[]),O=o.useCallback(e=>{d(a=>[...a,{role:"agent",content:`
3
- [错误: ${e}]`,timestamp:new Date}])},[]),{isConnected:I,isAttached:b,attach:C}=M({sessionId:l||"",onOutput:h,onExit:D,onError:O});o.useEffect(()=>{R.get("/demo/agents").then(e=>{j(e.agents);const a=e.agents.find(x=>x.available);a&&N(a.type)})},[]),o.useEffect(()=>{i.current?.scrollIntoView({behavior:"smooth"})},[f]),o.useEffect(()=>{l&&I&&!b&&C()},[l,I,b,C]);const r=async()=>{if(!(!p||!S.trim())){w(!0),d([{role:"user",content:S,timestamp:new Date}]);try{const e=await R.post("/demo/start",{agentType:p,prompt:S.trim()});u(e.sessionId),g("")}catch(e){d(a=>[...a,{role:"agent",content:n("启动失败: {message}",{message:e instanceof Error?e.message:n("未知错误")}),timestamp:new Date}])}finally{w(!1)}}},U=async()=>{if(!l||!E.trim())return;const e=E.trim();d(a=>[...a,{role:"user",content:e,timestamp:new Date}]),t("");try{await R.post(`/demo/${l}/message`,{message:e})}catch(a){d(x=>[...x,{role:"agent",content:n("发送失败: {message}",{message:a instanceof Error?a.message:n("未知错误")}),timestamp:new Date}])}},_=async()=>{if(l)try{await R.post(`/demo/${l}/stop`),d(e=>[...e,{role:"agent",content:`
4
- [${n("会话已停止")}]`,timestamp:new Date}]),u(null)}catch(e){console.error("Stop failed:",e)}};return s.jsxs("div",{className:"flex flex-col h-full max-w-4xl mx-auto p-4 gap-4",children:[s.jsx("h1",{className:"text-2xl font-bold",children:n("Agent 交互演示")}),!l&&s.jsxs(A,{className:"p-4",children:[s.jsx("h2",{className:"text-lg font-semibold mb-3",children:n("选择 Agent")}),s.jsx("div",{className:"flex gap-2 flex-wrap mb-4",children:c.map(e=>s.jsxs(B,{variant:p===e.type?"default":"outline",disabled:!e.available,onClick:()=>N(e.type),children:[e.name,e.available&&e.version&&` (${e.version})`,!e.available&&n(" (不可用)")]},e.type))}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx("input",{type:"text",value:S,onChange:e=>g(e.target.value),onKeyDown:e=>e.key==="Enter"&&!e.nativeEvent.isComposing&&e.nativeEvent.keyCode!==229&&r(),placeholder:n("输入你的问题或任务..."),className:"flex-1 px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"}),s.jsx(B,{onClick:r,disabled:y||!p||!S.trim(),children:n(y?"启动中...":"开始")})]})]}),s.jsxs(A,{className:"flex-1 p-4 overflow-hidden flex flex-col",children:[s.jsxs("div",{className:"flex justify-between items-center mb-3",children:[s.jsx("h2",{className:"text-lg font-semibold",children:n("对话")}),l&&s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-sm text-gray-500",children:n(I?b?"已连接":"连接中...":"未连接")}),s.jsx(B,{variant:"outline",size:"sm",onClick:_,children:n("停止")})]})]}),s.jsxs("div",{className:"flex-1 overflow-y-auto space-y-3",children:[f.length===0?s.jsx("div",{className:"text-gray-400 text-center py-8",children:n("选择 Agent 并输入问题开始对话")}):f.map((e,a)=>s.jsxs("div",{className:`p-3 rounded-lg ${e.role==="user"?"bg-blue-100 ml-8":"bg-gray-100 mr-8"}`,children:[s.jsx("div",{className:"text-xs text-gray-500 mb-1",children:e.role==="user"?n("你"):"Agent"}),s.jsx("pre",{className:"whitespace-pre-wrap font-mono text-sm",children:e.content})]},a)),s.jsx("div",{ref:i})]}),l&&s.jsxs("div",{className:"flex gap-2 mt-3 pt-3 border-t",children:[s.jsx("input",{type:"text",value:E,onChange:e=>t(e.target.value),onKeyDown:e=>e.key==="Enter"&&!e.repeat&&!e.nativeEvent.isComposing&&e.nativeEvent.keyCode!==229&&U(),placeholder:n("发送后续消息..."),className:"flex-1 px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"}),s.jsx(B,{onClick:U,disabled:!E.trim(),children:n("发送")})]})]})]})}export{L as DemoPage};