agent-tower 0.4.15 → 0.4.16-beta.3

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 (279) hide show
  1. package/dist/app.test.js +2 -0
  2. package/dist/app.test.js.map +1 -1
  3. package/dist/core/event-bus.d.ts +2 -0
  4. package/dist/core/event-bus.d.ts.map +1 -1
  5. package/dist/core/event-bus.js.map +1 -1
  6. package/dist/executors/__tests__/codex.executor.test.d.ts +2 -0
  7. package/dist/executors/__tests__/codex.executor.test.d.ts.map +1 -0
  8. package/dist/executors/__tests__/codex.executor.test.js +28 -0
  9. package/dist/executors/__tests__/codex.executor.test.js.map +1 -0
  10. package/dist/executors/codex.executor.d.ts +1 -0
  11. package/dist/executors/codex.executor.d.ts.map +1 -1
  12. package/dist/executors/codex.executor.js +19 -1
  13. package/dist/executors/codex.executor.js.map +1 -1
  14. package/dist/git/git-cli.d.ts +18 -1
  15. package/dist/git/git-cli.d.ts.map +1 -1
  16. package/dist/git/git-cli.js +17 -1
  17. package/dist/git/git-cli.js.map +1 -1
  18. package/dist/git/worktree.manager.d.ts +29 -2
  19. package/dist/git/worktree.manager.d.ts.map +1 -1
  20. package/dist/git/worktree.manager.js +137 -16
  21. package/dist/git/worktree.manager.js.map +1 -1
  22. package/dist/git/worktree.manager.test.d.ts +2 -0
  23. package/dist/git/worktree.manager.test.d.ts.map +1 -0
  24. package/dist/git/worktree.manager.test.js +104 -0
  25. package/dist/git/worktree.manager.test.js.map +1 -0
  26. package/dist/mcp/context.d.ts +3 -0
  27. package/dist/mcp/context.d.ts.map +1 -1
  28. package/dist/mcp/context.js +10 -1
  29. package/dist/mcp/context.js.map +1 -1
  30. package/dist/mcp/http-client.d.ts +24 -1
  31. package/dist/mcp/http-client.d.ts.map +1 -1
  32. package/dist/mcp/http-client.js +37 -3
  33. package/dist/mcp/http-client.js.map +1 -1
  34. package/dist/mcp/server.d.ts.map +1 -1
  35. package/dist/mcp/server.js +190 -0
  36. package/dist/mcp/server.js.map +1 -1
  37. package/dist/middleware/tunnel-auth.d.ts.map +1 -1
  38. package/dist/middleware/tunnel-auth.js +2 -0
  39. package/dist/middleware/tunnel-auth.js.map +1 -1
  40. package/dist/output/__tests__/codex-parser.test.d.ts +2 -0
  41. package/dist/output/__tests__/codex-parser.test.d.ts.map +1 -0
  42. package/dist/output/__tests__/codex-parser.test.js +148 -0
  43. package/dist/output/__tests__/codex-parser.test.js.map +1 -0
  44. package/dist/output/codex-parser.d.ts +12 -0
  45. package/dist/output/codex-parser.d.ts.map +1 -1
  46. package/dist/output/codex-parser.js +129 -12
  47. package/dist/output/codex-parser.js.map +1 -1
  48. package/dist/routes/__tests__/attachments.test.d.ts +2 -0
  49. package/dist/routes/__tests__/attachments.test.d.ts.map +1 -0
  50. package/dist/routes/__tests__/attachments.test.js +86 -0
  51. package/dist/routes/__tests__/attachments.test.js.map +1 -0
  52. package/dist/routes/__tests__/filesystem.test.d.ts +2 -0
  53. package/dist/routes/__tests__/filesystem.test.d.ts.map +1 -0
  54. package/dist/routes/__tests__/filesystem.test.js +80 -0
  55. package/dist/routes/__tests__/filesystem.test.js.map +1 -0
  56. package/dist/routes/__tests__/previews.test.d.ts +2 -0
  57. package/dist/routes/__tests__/previews.test.d.ts.map +1 -0
  58. package/dist/routes/__tests__/previews.test.js +89 -0
  59. package/dist/routes/__tests__/previews.test.js.map +1 -0
  60. package/dist/routes/__tests__/tasks.test.d.ts +2 -0
  61. package/dist/routes/__tests__/tasks.test.d.ts.map +1 -0
  62. package/dist/routes/__tests__/tasks.test.js +72 -0
  63. package/dist/routes/__tests__/tasks.test.js.map +1 -0
  64. package/dist/routes/attachments.d.ts.map +1 -1
  65. package/dist/routes/attachments.js +36 -16
  66. package/dist/routes/attachments.js.map +1 -1
  67. package/dist/routes/filesystem.d.ts.map +1 -1
  68. package/dist/routes/filesystem.js +24 -3
  69. package/dist/routes/filesystem.js.map +1 -1
  70. package/dist/routes/index.d.ts.map +1 -1
  71. package/dist/routes/index.js +6 -0
  72. package/dist/routes/index.js.map +1 -1
  73. package/dist/routes/previews.d.ts +6 -0
  74. package/dist/routes/previews.d.ts.map +1 -0
  75. package/dist/routes/previews.js +413 -0
  76. package/dist/routes/previews.js.map +1 -0
  77. package/dist/routes/projects.d.ts.map +1 -1
  78. package/dist/routes/projects.js +1 -0
  79. package/dist/routes/projects.js.map +1 -1
  80. package/dist/routes/system.d.ts.map +1 -1
  81. package/dist/routes/system.js +35 -1
  82. package/dist/routes/system.js.map +1 -1
  83. package/dist/routes/tasks.js +2 -2
  84. package/dist/routes/tasks.js.map +1 -1
  85. package/dist/routes/team-runs.d.ts +11 -0
  86. package/dist/routes/team-runs.d.ts.map +1 -0
  87. package/dist/routes/team-runs.js +309 -0
  88. package/dist/routes/team-runs.js.map +1 -0
  89. package/dist/routes/tunnel.d.ts.map +1 -1
  90. package/dist/routes/tunnel.js +20 -0
  91. package/dist/routes/tunnel.js.map +1 -1
  92. package/dist/routes/workspaces.d.ts.map +1 -1
  93. package/dist/routes/workspaces.js +15 -1
  94. package/dist/routes/workspaces.js.map +1 -1
  95. package/dist/services/__tests__/preview.service.test.d.ts +2 -0
  96. package/dist/services/__tests__/preview.service.test.d.ts.map +1 -0
  97. package/dist/services/__tests__/preview.service.test.js +29 -0
  98. package/dist/services/__tests__/preview.service.test.js.map +1 -0
  99. package/dist/services/__tests__/session-manager.team-run.test.d.ts +2 -0
  100. package/dist/services/__tests__/session-manager.team-run.test.d.ts.map +1 -0
  101. package/dist/services/__tests__/session-manager.team-run.test.js +286 -0
  102. package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -0
  103. package/dist/services/__tests__/task.service.test.d.ts +2 -0
  104. package/dist/services/__tests__/task.service.test.d.ts.map +1 -0
  105. package/dist/services/__tests__/task.service.test.js +65 -0
  106. package/dist/services/__tests__/task.service.test.js.map +1 -0
  107. package/dist/services/__tests__/team-lock.service.test.d.ts +2 -0
  108. package/dist/services/__tests__/team-lock.service.test.d.ts.map +1 -0
  109. package/dist/services/__tests__/team-lock.service.test.js +81 -0
  110. package/dist/services/__tests__/team-lock.service.test.js.map +1 -0
  111. package/dist/services/__tests__/team-reconciler.service.test.d.ts +2 -0
  112. package/dist/services/__tests__/team-reconciler.service.test.d.ts.map +1 -0
  113. package/dist/services/__tests__/team-reconciler.service.test.js +1536 -0
  114. package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -0
  115. package/dist/services/__tests__/team-run.service.test.d.ts +2 -0
  116. package/dist/services/__tests__/team-run.service.test.d.ts.map +1 -0
  117. package/dist/services/__tests__/team-run.service.test.js +699 -0
  118. package/dist/services/__tests__/team-run.service.test.js.map +1 -0
  119. package/dist/services/__tests__/team-scheduler.service.test.d.ts +2 -0
  120. package/dist/services/__tests__/team-scheduler.service.test.d.ts.map +1 -0
  121. package/dist/services/__tests__/team-scheduler.service.test.js +1688 -0
  122. package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -0
  123. package/dist/services/__tests__/tunnel.service.test.d.ts +2 -0
  124. package/dist/services/__tests__/tunnel.service.test.d.ts.map +1 -0
  125. package/dist/services/__tests__/tunnel.service.test.js +138 -0
  126. package/dist/services/__tests__/tunnel.service.test.js.map +1 -0
  127. package/dist/services/__tests__/workspace.service.test.d.ts +2 -0
  128. package/dist/services/__tests__/workspace.service.test.d.ts.map +1 -0
  129. package/dist/services/__tests__/workspace.service.test.js +695 -0
  130. package/dist/services/__tests__/workspace.service.test.js.map +1 -0
  131. package/dist/services/attachment-context.d.ts +3 -0
  132. package/dist/services/attachment-context.d.ts.map +1 -0
  133. package/dist/services/attachment-context.js +34 -0
  134. package/dist/services/attachment-context.js.map +1 -0
  135. package/dist/services/preview.service.d.ts +19 -0
  136. package/dist/services/preview.service.d.ts.map +1 -0
  137. package/dist/services/preview.service.js +147 -0
  138. package/dist/services/preview.service.js.map +1 -0
  139. package/dist/services/project.service.d.ts +2 -0
  140. package/dist/services/project.service.d.ts.map +1 -1
  141. package/dist/services/project.service.js +87 -18
  142. package/dist/services/project.service.js.map +1 -1
  143. package/dist/services/session-manager.d.ts +43 -1
  144. package/dist/services/session-manager.d.ts.map +1 -1
  145. package/dist/services/session-manager.js +110 -2
  146. package/dist/services/session-manager.js.map +1 -1
  147. package/dist/services/task.service.d.ts +6 -0
  148. package/dist/services/task.service.d.ts.map +1 -1
  149. package/dist/services/task.service.js +15 -3
  150. package/dist/services/task.service.js.map +1 -1
  151. package/dist/services/team-lock.service.d.ts +25 -0
  152. package/dist/services/team-lock.service.d.ts.map +1 -0
  153. package/dist/services/team-lock.service.js +56 -0
  154. package/dist/services/team-lock.service.js.map +1 -0
  155. package/dist/services/team-reconciler.service.d.ts +44 -0
  156. package/dist/services/team-reconciler.service.d.ts.map +1 -0
  157. package/dist/services/team-reconciler.service.js +286 -0
  158. package/dist/services/team-reconciler.service.js.map +1 -0
  159. package/dist/services/team-run-events.d.ts +13 -0
  160. package/dist/services/team-run-events.d.ts.map +1 -0
  161. package/dist/services/team-run-events.js +27 -0
  162. package/dist/services/team-run-events.js.map +1 -0
  163. package/dist/services/team-run.service.d.ts +92 -0
  164. package/dist/services/team-run.service.d.ts.map +1 -0
  165. package/dist/services/team-run.service.js +835 -0
  166. package/dist/services/team-run.service.js.map +1 -0
  167. package/dist/services/team-scheduler.service.d.ts +104 -0
  168. package/dist/services/team-scheduler.service.d.ts.map +1 -0
  169. package/dist/services/team-scheduler.service.js +843 -0
  170. package/dist/services/team-scheduler.service.js.map +1 -0
  171. package/dist/services/tunnel.service.d.ts +31 -5
  172. package/dist/services/tunnel.service.d.ts.map +1 -1
  173. package/dist/services/tunnel.service.js +293 -32
  174. package/dist/services/tunnel.service.js.map +1 -1
  175. package/dist/services/workspace.service.d.ts +161 -7
  176. package/dist/services/workspace.service.d.ts.map +1 -1
  177. package/dist/services/workspace.service.js +396 -51
  178. package/dist/services/workspace.service.js.map +1 -1
  179. package/dist/socket/events.d.ts +1 -1
  180. package/dist/socket/events.d.ts.map +1 -1
  181. package/dist/socket/events.js.map +1 -1
  182. package/dist/socket/socket-gateway.d.ts.map +1 -1
  183. package/dist/socket/socket-gateway.js +5 -1
  184. package/dist/socket/socket-gateway.js.map +1 -1
  185. package/dist/web/assets/AgentDemoPage-Bf6labVB.js +1 -0
  186. package/dist/web/assets/{DemoPage-XwuS8vNB.js → DemoPage-DlfG47rV.js} +3 -3
  187. package/dist/web/assets/{GeneralSettingsPage-CliIgpwf.js → GeneralSettingsPage-DefqwzVn.js} +1 -1
  188. package/dist/web/assets/MemberAvatar-DVw_TedB.js +1 -0
  189. package/dist/web/assets/NotificationSettingsPage-C9h1U1Za.js +1 -0
  190. package/dist/web/assets/{ProfileSettingsPage-CkU_kZKG.js → ProfileSettingsPage-BkZE2yVP.js} +1 -1
  191. package/dist/web/assets/ProjectKanbanPage-B1Ckl1uY.js +89 -0
  192. package/dist/web/assets/ProjectSettingsPage-ByZ13awb.js +2 -0
  193. package/dist/web/assets/{ProviderSettingsPage-CfvdeoEU.js → ProviderSettingsPage-DSQYe8B6.js} +12 -12
  194. package/dist/web/assets/TeamSettingsPage-DUukJ_Ih.js +1 -0
  195. package/dist/web/assets/agent-tower-logo-COx9gy77.png +0 -0
  196. package/dist/web/assets/{button-BWFTEdOr.js → button-Bpm98eOV.js} +1 -1
  197. package/dist/web/assets/{chevron-down-CuPdBAx-.js → chevron-down-DSKKXCi8.js} +1 -1
  198. package/dist/web/assets/{chevron-right-Cs8vYTMn.js → chevron-right-CZdDV9GU.js} +1 -1
  199. package/dist/web/assets/chevron-up-gnnlwvYe.js +1 -0
  200. package/dist/web/assets/{circle-check-BXZTzqw0.js → circle-check-DeD_VuLK.js} +1 -1
  201. package/dist/web/assets/{code-block-OCS4YCEC-BxUpvXK_.js → code-block-OCS4YCEC-BrGjkdjS.js} +1 -1
  202. package/dist/web/assets/{confirm-dialog-CDLHRthd.js → confirm-dialog-CEVVvAcE.js} +1 -1
  203. package/dist/web/assets/folder-picker-ZBQlFEWL.js +1 -0
  204. package/dist/web/assets/index-B5g4V0NU.js +13 -0
  205. package/dist/web/assets/index-ltjI8o6A.css +1 -0
  206. package/dist/web/assets/loader-circle-GMfBClX0.js +1 -0
  207. package/dist/web/assets/{log-adapter-CeKrvZcz.js → log-adapter-DKKM3sxS.js} +1 -1
  208. package/dist/web/assets/{mermaid-NOHMQCX5-BOSwJqP0.js → mermaid-NOHMQCX5-D5USvUiZ.js} +44 -44
  209. package/dist/web/assets/modal-JMpuh-LG.js +1 -0
  210. package/dist/web/assets/{pencil-BMxBxIhw.js → pencil-QrCW47nn.js} +1 -1
  211. package/dist/web/assets/{select-BUmRG0LY.js → select-CINRzLiE.js} +1 -1
  212. package/dist/web/assets/upload-vFxZxKHo.js +1 -0
  213. package/dist/web/assets/{use-profiles-C1vlPE-2.js → use-profiles-SrVWPYv0.js} +1 -1
  214. package/dist/web/assets/{use-providers-Cdxr4Jbz.js → use-providers-BihMydl0.js} +1 -1
  215. package/dist/web/avatars/presets/avatar-preset-01-developer.png +0 -0
  216. package/dist/web/avatars/presets/avatar-preset-02-architect.png +0 -0
  217. package/dist/web/avatars/presets/avatar-preset-03-tester.png +0 -0
  218. package/dist/web/avatars/presets/avatar-preset-04-devops.png +0 -0
  219. package/dist/web/avatars/presets/avatar-preset-05-data-scientist.png +0 -0
  220. package/dist/web/avatars/presets/avatar-preset-06-frontend.png +0 -0
  221. package/dist/web/avatars/presets/avatar-preset-07-backend.png +0 -0
  222. package/dist/web/avatars/presets/avatar-preset-08-security.png +0 -0
  223. package/dist/web/avatars/presets/avatar-preset-09-project-manager.png +0 -0
  224. package/dist/web/avatars/presets/avatar-preset-10-product-manager.png +0 -0
  225. package/dist/web/avatars/presets/avatar-preset-11-scrum-master.png +0 -0
  226. package/dist/web/avatars/presets/avatar-preset-12-tech-lead.png +0 -0
  227. package/dist/web/avatars/presets/avatar-preset-13-coordinator.png +0 -0
  228. package/dist/web/avatars/presets/avatar-preset-14-mentor.png +0 -0
  229. package/dist/web/avatars/presets/avatar-preset-15-reviewer.png +0 -0
  230. package/dist/web/avatars/presets/avatar-preset-16-ui-designer.png +0 -0
  231. package/dist/web/avatars/presets/avatar-preset-17-ux-researcher.png +0 -0
  232. package/dist/web/avatars/presets/avatar-preset-18-documenter.png +0 -0
  233. package/dist/web/avatars/presets/avatar-preset-19-translator.png +0 -0
  234. package/dist/web/avatars/presets/avatar-preset-20-analyst.png +0 -0
  235. package/dist/web/avatars/presets/avatar-preset-21-consultant.png +0 -0
  236. package/dist/web/avatars/presets/avatar-preset-22-creative-director.png +0 -0
  237. package/dist/web/avatars/presets/avatar-preset-23-support.png +0 -0
  238. package/dist/web/avatars/presets/avatar-preset-24-assistant.png +0 -0
  239. package/dist/web/avatars/presets/avatar-preset-25-robot.png +0 -0
  240. package/dist/web/avatars/presets/avatar-preset-grid.png +0 -0
  241. package/dist/web/index.html +2 -2
  242. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +10 -0
  243. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -1
  244. package/node_modules/@agent-tower/shared/dist/socket/events.js +1 -0
  245. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -1
  246. package/node_modules/@agent-tower/shared/dist/types.d.ts +161 -0
  247. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  248. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  249. package/node_modules/@prisma/client/.prisma/client/default.d.ts +1 -0
  250. package/node_modules/@prisma/client/.prisma/client/default.js +1 -0
  251. package/node_modules/@prisma/client/.prisma/client/edge.d.ts +1 -0
  252. package/node_modules/@prisma/client/.prisma/client/edge.js +396 -0
  253. package/node_modules/@prisma/client/.prisma/client/index-browser.js +385 -0
  254. package/node_modules/@prisma/client/.prisma/client/index.d.ts +26996 -0
  255. package/node_modules/@prisma/client/.prisma/client/index.js +421 -0
  256. package/node_modules/@prisma/client/.prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  257. package/node_modules/@prisma/client/.prisma/client/package.json +97 -0
  258. package/node_modules/@prisma/client/.prisma/client/query_engine-windows.dll.node +0 -0
  259. package/node_modules/@prisma/client/.prisma/client/schema.prisma +296 -0
  260. package/node_modules/@prisma/client/.prisma/client/wasm.d.ts +1 -0
  261. package/node_modules/@prisma/client/.prisma/client/wasm.js +385 -0
  262. package/node_modules/@prisma/client/package.json +3 -2
  263. package/package.json +2 -1
  264. package/prisma/migrations/20260515000000_add_workspace_preview_target/migration.sql +2 -0
  265. package/prisma/migrations/20260518000000_add_team_run_collaboration/migration.sql +150 -0
  266. package/prisma/migrations/20260522000000_add_team_member_session_policy/migration.sql +2 -0
  267. package/prisma/migrations/20260526000000_add_team_run_main_and_dedicated_workspaces/migration.sql +21 -0
  268. package/prisma/schema.prisma +147 -1
  269. package/dist/web/assets/AgentDemoPage-ClnGPAV9.js +0 -1
  270. package/dist/web/assets/NotificationSettingsPage-y3vhVgPv.js +0 -1
  271. package/dist/web/assets/ProjectKanbanPage-BddzfZRV.js +0 -87
  272. package/dist/web/assets/ProjectSettingsPage-B6xhbziO.js +0 -2
  273. package/dist/web/assets/circle-alert-EUyZcWhp.js +0 -1
  274. package/dist/web/assets/folder-picker-CUbhsnhi.js +0 -1
  275. package/dist/web/assets/index-BGvfX18x.css +0 -1
  276. package/dist/web/assets/index-CHN8jahE.js +0 -13
  277. package/dist/web/assets/loader-circle-BHzDVpxt.js +0 -1
  278. package/dist/web/assets/modal-D_AU4URz.js +0 -1
  279. package/dist/web/assets/use-projects-Bcd5hIOY.js +0 -1
@@ -0,0 +1,2 @@
1
+ import{h as se,u as B,r as l,g as ne,j as e,t as T}from"./index-B5g4V0NU.js";import{F as W,a as _,u as re,b as le,c as ae,d as ie,R as oe,e as ce}from"./folder-picker-ZBQlFEWL.js";import{B as S}from"./button-Bpm98eOV.js";import{S as de}from"./select-CINRzLiE.js";import{X as J,P as Q,T as ue,M as G}from"./modal-JMpuh-LG.js";import"./utils-CkSf8FUe.js";import"./chevron-right-CZdDV9GU.js";import"./loader-circle-GMfBClX0.js";import"./chevron-down-DSKKXCi8.js";const xe=[["path",{d:"M12 10v6",key:"1bos4e"}],["path",{d:"M9 13h6",key:"1uhe8q"}],["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]],me=se("folder-plus",xe);function pe({value:t,onChange:g,repoPath:b,placeholder:v}){const{t:o}=B(),[i,c]=l.useState(""),[x,h]=l.useState([]),[N,r]=l.useState(!1),[u,y]=l.useState(-1),m=l.useRef(null),f=l.useRef(null),P=l.useRef(void 0),F=l.useCallback(async s=>{if(!b||!s){h([]),r(!1);return}try{const a=await ne.get("/filesystem/complete",{params:{basePath:b,prefix:s}});h(a.results),r(a.results.length>0),y(-1)}catch{h([]),r(!1)}},[b]);l.useEffect(()=>{if(clearTimeout(P.current),!i){h([]),r(!1);return}return P.current=setTimeout(()=>F(i),200),()=>clearTimeout(P.current)},[i,F]),l.useEffect(()=>{const s=a=>{f.current&&!f.current.contains(a.target)&&m.current&&!m.current.contains(a.target)&&r(!1)};return document.addEventListener("mousedown",s),()=>document.removeEventListener("mousedown",s)},[]);const k=s=>{const a=s.trim();!a||t.includes(a)||(g([...t,a]),c(""),r(!1),m.current?.focus())},z=s=>{g(t.filter((a,w)=>w!==s))},D=s=>{s.type==="directory"?(c(s.path),m.current?.focus()):k(s.path)},C=(s,a)=>{a.stopPropagation(),k(s.path.replace(/\/$/,""))},A=s=>{s.nativeEvent.isComposing||s.nativeEvent.keyCode===229||(N&&x.length>0?s.key==="ArrowDown"?(s.preventDefault(),y(a=>Math.min(a+1,x.length-1))):s.key==="ArrowUp"?(s.preventDefault(),y(a=>Math.max(a-1,-1))):s.key==="Enter"?(s.preventDefault(),u>=0?D(x[u]):k(i)):s.key==="Escape"&&r(!1):s.key==="Enter"&&(s.preventDefault(),k(i)))};return e.jsxs("div",{children:[t.length>0&&e.jsx("div",{className:"border border-neutral-200 rounded-lg mb-2 divide-y divide-neutral-100",children:t.map((s,a)=>e.jsxs("div",{className:"flex items-center gap-2 px-3 py-1.5 group",children:[s.includes(".")&&!s.endsWith("/")?e.jsx(W,{size:14,className:"text-neutral-400 shrink-0"}):e.jsx(_,{size:14,className:"text-amber-500 shrink-0"}),e.jsx("span",{className:"text-sm font-mono text-neutral-700 truncate flex-1",children:s}),e.jsx("button",{onClick:()=>z(a),className:"p-0.5 text-neutral-300 hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity shrink-0",children:e.jsx(J,{size:14})})]},s))}),e.jsxs("div",{className:"relative",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{ref:m,type:"text",value:i,onChange:s=>c(s.target.value),onKeyDown:A,onFocus:()=>{i&&x.length>0&&r(!0)},placeholder:v??o("输入文件路径..."),className:"flex-1 px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300"}),e.jsxs("button",{onClick:()=>k(i),disabled:!i.trim(),className:"flex items-center gap-1 px-3 py-2 text-sm bg-neutral-900 text-white rounded-lg hover:bg-neutral-800 disabled:opacity-30 disabled:cursor-not-allowed transition-colors",children:[e.jsx(Q,{size:14}),e.jsx("span",{children:o("添加")})]})]}),N&&e.jsx("div",{ref:f,className:"absolute z-50 left-0 right-0 mt-1 bg-white border border-neutral-200 rounded-lg shadow-lg max-h-[200px] overflow-y-auto",children:x.map((s,a)=>e.jsxs("button",{onClick:()=>D(s),className:`w-full flex items-center gap-2 px-3 py-1.5 text-sm text-left hover:bg-neutral-50 transition-colors ${a===u?"bg-neutral-100":""}`,children:[s.type==="directory"?e.jsx(_,{size:14,className:"text-amber-500 shrink-0"}):e.jsx(W,{size:14,className:"text-neutral-400 shrink-0"}),e.jsx("span",{className:"font-mono text-neutral-700 truncate flex-1",children:s.path}),s.type==="directory"&&e.jsx("span",{onClick:w=>C(s,w),className:"p-0.5 text-neutral-300 hover:text-emerald-600 shrink-0",title:o("添加此目录"),children:e.jsx(me,{size:14})})]},s.path))})]})]})}function he({value:t,onChange:g}){const{t:b}=B(),[v,o]=l.useState(""),[i,c]=l.useState(""),x=()=>{const r=v.trim(),u=i.trim();!r||!u||(g([...t,{name:r,command:u}]),o(""),c(""))},h=r=>{g(t.filter((u,y)=>y!==r))},N=r=>{r.key==="Enter"&&!r.nativeEvent.isComposing&&r.nativeEvent.keyCode!==229&&(r.preventDefault(),x())};return e.jsxs("div",{children:[t.length>0&&e.jsx("div",{className:"border border-neutral-200 rounded-lg mb-2 divide-y divide-neutral-100",children:t.map((r,u)=>e.jsxs("div",{className:"flex items-center gap-3 px-3 py-2 group",children:[e.jsx("span",{className:"text-sm font-medium text-neutral-700 w-28 shrink-0 truncate",children:r.name}),e.jsx("span",{className:"text-sm font-mono text-neutral-500 flex-1 truncate",children:r.command}),e.jsx("button",{onClick:()=>h(u),className:"p-0.5 text-neutral-300 hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity shrink-0",children:e.jsx(J,{size:14})})]},u))}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"text",value:v,onChange:r=>o(r.target.value),onKeyDown:N,placeholder:b("名称"),className:"w-28 shrink-0 px-3 py-2 border border-neutral-200 rounded-lg text-sm focus:outline-none focus:ring-1 focus:ring-neutral-300"}),e.jsx("input",{type:"text",value:i,onChange:r=>c(r.target.value),onKeyDown:N,placeholder:b("命令"),className:"flex-1 px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300"}),e.jsxs("button",{onClick:x,disabled:!v.trim()||!i.trim(),className:"flex items-center gap-1 px-3 py-2 text-sm bg-neutral-900 text-white rounded-lg hover:bg-neutral-800 disabled:opacity-30 disabled:cursor-not-allowed transition-colors shrink-0",children:[e.jsx(Q,{size:14}),e.jsx("span",{children:b("添加")})]})]})]})}function fe(t){return t?t.split(",").map(g=>g.trim()).filter(Boolean):[]}function je(t){if(!t)return[];try{return JSON.parse(t)}catch{return[]}}function $(t){return typeof t.color!="string"||t.color.trim()===""?"bg-neutral-400":t.color.startsWith("bg-")?t.color:t.color.startsWith("text-")?t.color.replace("text-","bg-"):"bg-neutral-400"}function Re(){const{t}=B(),{data:g,isLoading:b}=re({limit:100,includeArchived:!0}),v=le(),o=ae(),i=ie(),[c,x]=l.useState(""),[h,N]=l.useState(null),[r,u]=l.useState({copyFiles:[],setupScript:"",quickCommands:[]}),[y,m]=l.useState(!1),[f,P]=l.useState(null),[F,k]=l.useState(!1),[z,D]=l.useState(!1),[C,A]=l.useState(!1),[s,a]=l.useState(!1),[w,I]=l.useState(""),R=g?.data??[],j=l.useMemo(()=>R.filter(n=>!n.archivedAt),[R]),E=l.useMemo(()=>R.filter(n=>n.archivedAt),[R]),d=j.find(n=>n.id===c),q=l.useMemo(()=>R.find(n=>n.id===f)??null,[f,R]);if(l.useEffect(()=>{!c&&j.length>0&&x(j[0].id)},[j,c]),l.useEffect(()=>{if(h){j.some(n=>n.id===h)&&(x(h),N(null));return}c&&!j.some(n=>n.id===c)&&(x(j[0]?.id??""),m(!1))},[j,h,c]),l.useEffect(()=>{d&&!y&&u({copyFiles:fe(d.copyFiles),setupScript:d.setupScript??"",quickCommands:je(d.quickCommands)})},[d,y]),b)return e.jsx("div",{className:"p-6 text-sm text-neutral-400",children:t("加载中...")});if(R.length===0)return e.jsx("div",{className:"p-6 text-sm text-neutral-400",children:t("暂无项目,请先创建项目")});const H=j.map(n=>({value:n.id,label:n.name})),V=()=>{c&&v.mutate({id:c,copyFiles:r.copyFiles.length>0?r.copyFiles.join(", "):null,setupScript:r.setupScript.trim()||null,quickCommands:r.quickCommands.length>0?JSON.stringify(r.quickCommands):null},{onSuccess:()=>m(!1)})},X=n=>{N(null),x(n),m(!1)},Z=()=>{d&&(P(d.id),A(!1),a(!1),k(!0))},O=()=>{o.isPending||(k(!1),P(null),A(!1),a(!1))},Y=async()=>{if(f)try{await o.mutateAsync({id:f,deleteRepo:C}),T.success(t(C?"项目已删除,并清理了本地文件":"项目已删除")),m(!1),O()}catch{}},ee=n=>{const p=E.find(U=>U.id===n);P(n),I(p?.repoDeletedAt?p.repoPath:""),D(!0)},M=()=>{i.isPending||(D(!1),P(null),I(""))},te=async()=>{if(!(!f||q?.repoDeletedAt&&!w.trim()))try{const p=await i.mutateAsync({id:f,repoPath:w.trim()||void 0});T.success(t("项目已恢复"));for(const U of p.warnings)T.warning(U);m(!1),N(p.project.id),x(p.project.id),M()}catch{}},K=q?.name??t("this project"),L=!!q?.repoDeletedAt;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-10 py-6 mx-auto w-full max-w-4xl space-y-8",children:[e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:t("项目配置")}),e.jsx("p",{className:"text-[12px] text-neutral-400",children:t("配置当前项目的 worktree 初始化行为,并在此页统一管理删除与恢复。")})]}),j.length>0?e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[12px] font-medium text-neutral-700 mb-2",children:t("选择项目")}),e.jsx(de,{value:c,onChange:X,options:H,placeholder:t("选择项目...")})]}),d?e.jsx("div",{className:"rounded-xl border border-neutral-200 bg-neutral-50 px-4 py-4",children:e.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-start md:justify-between",children:[e.jsxs("div",{className:"space-y-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`h-2.5 w-2.5 rounded-full ${$(d)}`}),e.jsx("p",{className:"text-sm font-medium text-neutral-900",children:d.name})]}),e.jsx("p",{className:"text-xs text-neutral-500 break-all",children:d.repoPath}),d.repoRemoteUrl?e.jsxs("p",{className:"text-xs text-neutral-400 break-all",children:[t("Remote"),": ",d.repoRemoteUrl]}):null]}),e.jsxs("div",{className:"flex flex-col items-stretch gap-2 md:items-end",children:[e.jsxs(S,{size:"sm",variant:"destructive",onClick:Z,disabled:o.isPending||i.isPending,children:[e.jsx(ue,{size:14}),t("删除项目")]}),e.jsx("p",{className:"text-[11px] text-neutral-500 md:max-w-56 md:text-right",children:t("删除后项目会从默认列表隐藏,但历史任务、workspace 与会话记录仍会保留。")})]})]})}):null]}):e.jsx("div",{className:"rounded-xl border border-dashed border-neutral-200 bg-neutral-50 px-4 py-5 text-sm text-neutral-500",children:t("当前没有可配置的项目。你可以先创建项目,或在下方恢复已删除项目。")})]}),d?e.jsxs(e.Fragment,{children:[e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:t("自动复制文件")}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:t("创建 worktree 时自动从主仓库复制的文件或目录。支持 glob 模式。")}),e.jsx(pe,{value:r.copyFiles,onChange:n=>{u(p=>({...p,copyFiles:n})),m(!0)},repoPath:d.repoPath}),e.jsx("p",{className:"text-[11px] text-neutral-400 mt-2",children:t("适用于不在 git 管理中但启动必需的文件,如 .env、node_modules、数据库文件等")})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:t("Setup 脚本")}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:t("创建 worktree 后自动执行的命令,每行一条,按顺序执行。")}),e.jsx("textarea",{value:r.setupScript,onChange:n=>{u(p=>({...p,setupScript:n.target.value})),m(!0)},placeholder:`pnpm install
2
+ pnpm run setup`,rows:4,className:"w-full px-3 py-2 border border-neutral-200 rounded-lg text-sm font-mono focus:outline-none focus:ring-1 focus:ring-neutral-300 resize-none"}),e.jsx("p",{className:"text-[11px] text-neutral-400 mt-1",children:t("命令在 worktree 目录下执行,单条命令超时 5 分钟,失败不会阻断后续命令")})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:t("常用命令")}),e.jsx("p",{className:"text-[12px] text-neutral-400 mb-3",children:t("在终端中可快速执行的命令,不会自动运行。")}),e.jsx(he,{value:r.quickCommands,onChange:n=>{u(p=>({...p,quickCommands:n})),m(!0)}})]})]}):null,e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900 mb-1",children:t("已删除项目")}),e.jsx("p",{className:"text-[12px] text-neutral-400",children:t("这些项目不会出现在主看板里,但历史记录仍保留;如源码已删除,恢复时需要重新绑定 repoPath。")})]}),e.jsx("span",{className:"rounded-full bg-neutral-100 px-2.5 py-1 text-[11px] font-medium text-neutral-500",children:E.length})]}),E.length===0?e.jsx("div",{className:"rounded-xl border border-dashed border-neutral-200 bg-neutral-50 px-4 py-5 text-sm text-neutral-500",children:t("暂无已删除项目")}):e.jsx("div",{className:"space-y-3",children:E.map(n=>e.jsx("div",{className:"rounded-xl border border-neutral-200 bg-white px-4 py-4",children:e.jsxs("div",{className:"flex flex-col gap-4 md:flex-row md:items-start md:justify-between",children:[e.jsxs("div",{className:"space-y-2 min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:`h-2.5 w-2.5 rounded-full ${$(n)}`}),e.jsx("p",{className:"text-sm font-medium text-neutral-900",children:n.name}),e.jsx("span",{className:"rounded-full bg-neutral-100 px-2 py-0.5 text-[10px] font-medium text-neutral-500",children:t("已删除")}),n.repoDeletedAt?e.jsx("span",{className:"rounded-full bg-amber-100 px-2 py-0.5 text-[10px] font-medium text-amber-700",children:t("源码已删除")}):null]}),n.repoDeletedAt?e.jsx("p",{className:"text-xs text-neutral-500",children:t("本地源码目录已删除,相关 Git/代码能力已禁用。恢复时需要重新绑定一个有效仓库路径。")}):e.jsx("p",{className:"text-xs text-neutral-500 break-all",children:n.repoPath}),n.repoRemoteUrl?e.jsxs("p",{className:"text-xs text-neutral-400 break-all",children:[t("Remote"),": ",n.repoRemoteUrl]}):null]}),e.jsxs(S,{size:"sm",variant:"outline",onClick:()=>ee(n.id),disabled:o.isPending||i.isPending,children:[e.jsx(oe,{size:14}),t("恢复")]})]})},n.id))})]}),y&&d?e.jsx("div",{className:"sticky bottom-6 flex justify-end",children:e.jsx(S,{size:"sm",onClick:V,disabled:v.isPending,children:v.isPending?t("保存中..."):t("保存")})}):null]}),e.jsx(G,{isOpen:F,onClose:O,title:t("Delete Project"),action:e.jsxs(e.Fragment,{children:[e.jsx(S,{variant:"outline",onClick:O,disabled:o.isPending,children:t("Cancel")}),e.jsx(S,{variant:"destructive",onClick:Y,disabled:o.isPending||C&&!s,children:o.isPending?t("Deleting..."):t("Delete Project")})]}),children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-neutral-600 leading-relaxed",children:t("项目「{title}」将从默认项目列表隐藏,但历史任务、workspace 和会话记录仍会保留。",{title:K})}),e.jsxs("label",{className:"flex items-start gap-3 rounded-lg border border-neutral-200 bg-neutral-50 px-3 py-3",children:[e.jsx("input",{type:"checkbox",checked:C,onChange:n=>{A(n.target.checked),n.target.checked||a(!1)},className:"mt-0.5"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-neutral-900",children:t("同时删除本地项目文件")}),e.jsx("p",{className:"mt-1 text-xs text-neutral-500",children:t("勾选后会删除 repoPath 指向的本地仓库目录,并禁用代码/Git 相关能力。")})]})]}),C?e.jsxs("div",{className:"rounded-lg border border-red-200 bg-red-50 px-3 py-3",children:[e.jsx("p",{className:"text-sm font-medium text-red-700",children:t("勾选后会连项目文件一起删除,请谨慎选择。")}),e.jsx("p",{className:"mt-1 text-xs text-red-600",children:t("恢复该项目时需要重新绑定一个有效的 Git 仓库路径。")}),e.jsxs("label",{className:"mt-3 flex items-start gap-2 text-xs text-red-700",children:[e.jsx("input",{type:"checkbox",checked:s,onChange:n=>a(n.target.checked),className:"mt-0.5"}),e.jsx("span",{children:t("我已确认这会删除本地项目文件")})]})]}):null,o.isError?e.jsx("p",{className:"text-xs text-red-500",children:o.error instanceof Error?o.error.message:t("Failed to delete project")}):null]})}),e.jsx(G,{isOpen:z,onClose:M,title:t("Restore Project"),action:e.jsxs(e.Fragment,{children:[e.jsx(S,{variant:"outline",onClick:M,disabled:i.isPending,children:t("Cancel")}),e.jsx(S,{onClick:te,disabled:i.isPending||L&&!w.trim(),children:i.isPending?t("Restoring..."):t("Restore Project")})]}),children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-neutral-600 leading-relaxed",children:L?t("项目「{title}」的本地仓库文件已删除。恢复前需要重新绑定一个有效的 Git 仓库路径。",{title:K}):t("恢复后,项目会重新出现在默认项目列表中。")}),L?e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-neutral-700 mb-1.5",children:t("Repository Path")}),e.jsx(ce,{value:w,onChange:I}),e.jsx("p",{className:"mt-2 text-xs text-neutral-400",children:t("Agent Tower 会尽量校验仓库 identity;如果 remote URL 或目录名不同,会给出警告但允许继续。")})]}):null,i.isError?e.jsx("p",{className:"text-xs text-red-500",children:i.error instanceof Error?i.error.message:t("Failed to restore project")}):null]})})]})}export{Re as ProjectSettingsPage};
@@ -1,25 +1,25 @@
1
- import{h as X,d as be,q as ve,g as ye,u as T,r as w,j as n,t as P,i as Q}from"./index-CHN8jahE.js";import{u as je,a as we,b as Ne,c as Ce,d as Ee,e as ke,f as Pe}from"./use-providers-Cdxr4Jbz.js";import{B as E}from"./button-BWFTEdOr.js";import{C as _e}from"./confirm-dialog-CDLHRthd.js";import{P as re,T as se,M as q}from"./modal-D_AU4URz.js";import{S as le}from"./select-BUmRG0LY.js";import{A as N}from"./log-adapter-CeKrvZcz.js";import{c as U}from"./utils-CkSf8FUe.js";import{C as ae}from"./chevron-down-CuPdBAx-.js";import{P as Oe}from"./pencil-BMxBxIhw.js";import{C as Ie}from"./circle-check-BXZTzqw0.js";const Te=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],Ae=X("circle-x",Te);const Se=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],De=X("download",Se);const Le=[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]],Re=X("upload",Le);function Me(e,t){let l=e.slice(0,t).split(/\r\n|\n|\r/g);return[l.length,l.pop().length+1]}function Fe(e,t,l){let i=e.split(/\r\n|\n|\r/g),a="",s=(Math.log10(t+1)|0)+1;for(let r=t-1;r<=t+1;r++){let o=i[r-1];o&&(a+=r.toString().padEnd(s," "),a+=": ",a+=o,a+=`
1
+ import{h as ne,d as be,q as ve,g as ye,u as T,r as w,j as n,t as P,w as W}from"./index-B5g4V0NU.js";import{u as je,a as we,b as Ne,c as Ce,d as Ee,e as ke,f as Pe}from"./use-providers-BihMydl0.js";import{B as E}from"./button-Bpm98eOV.js";import{C as Oe}from"./confirm-dialog-CEVVvAcE.js";import{P as re,T as se,M as $}from"./modal-JMpuh-LG.js";import{S as le}from"./select-CINRzLiE.js";import{A as N}from"./log-adapter-DKKM3sxS.js";import{c as U}from"./utils-CkSf8FUe.js";import{C as ae}from"./chevron-down-DSKKXCi8.js";import{U as _e}from"./upload-vFxZxKHo.js";import{P as Ie}from"./pencil-QrCW47nn.js";import{C as Te}from"./circle-check-DeD_VuLK.js";const Ae=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],Se=ne("circle-x",Ae);const De=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],Le=ne("download",De);function Re(e,t){let l=e.slice(0,t).split(/\r\n|\n|\r/g);return[l.length,l.pop().length+1]}function Fe(e,t,l){let i=e.split(/\r\n|\n|\r/g),a="",s=(Math.log10(t+1)|0)+1;for(let r=t-1;r<=t+1;r++){let o=i[r-1];o&&(a+=r.toString().padEnd(s," "),a+=": ",a+=o,a+=`
2
2
  `,r===t&&(a+=" ".repeat(s+l+2),a+=`^
3
- `))}return a}class f extends Error{line;column;codeblock;constructor(t,l){const[i,a]=Me(l.toml,l.ptr),s=Fe(l.toml,i,a);super(`Invalid TOML document: ${t}
3
+ `))}return a}class f extends Error{line;column;codeblock;constructor(t,l){const[i,a]=Re(l.toml,l.ptr),s=Fe(l.toml,i,a);super(`Invalid TOML document: ${t}
4
4
 
5
- ${s}`,l),this.line=i,this.column=a,this.codeblock=s}}function Ue(e,t){let l=0;for(;e[t-++l]==="\\";);return--l&&l%2}function G(e,t=0,l=e.length){let i=e.indexOf(`
6
- `,t);return e[i-1]==="\r"&&i--,i<=l?i:-1}function F(e,t){for(let l=t;l<e.length;l++){let i=e[l];if(i===`
5
+ ${s}`,l),this.line=i,this.column=a,this.codeblock=s}}function Me(e,t){let l=0;for(;e[t-++l]==="\\";);return--l&&l%2}function G(e,t=0,l=e.length){let i=e.indexOf(`
6
+ `,t);return e[i-1]==="\r"&&i--,i<=l?i:-1}function M(e,t){for(let l=t;l<e.length;l++){let i=e[l];if(i===`
7
7
  `)return l;if(i==="\r"&&e[l+1]===`
8
8
  `)return l+1;if(i<" "&&i!==" "||i==="")throw new f("control characters are not allowed in comments",{toml:e,ptr:t})}return e.length}function k(e,t,l,i){let a;for(;(a=e[t])===" "||a===" "||!l&&(a===`
9
9
  `||a==="\r"&&e[t+1]===`
10
- `);)t++;return i||a!=="#"?t:k(e,F(e,t),l)}function ze(e,t,l,i,a=!1){if(!i)return t=G(e,t),t<0?e.length:t;for(let s=t;s<e.length;s++){let r=e[s];if(r==="#")s=G(e,s);else{if(r===l)return s+1;if(r===i||a&&(r===`
10
+ `);)t++;return i||a!=="#"?t:k(e,M(e,t),l)}function Ue(e,t,l,i,a=!1){if(!i)return t=G(e,t),t<0?e.length:t;for(let s=t;s<e.length;s++){let r=e[s];if(r==="#")s=G(e,s);else{if(r===l)return s+1;if(r===i||a&&(r===`
11
11
  `||r==="\r"&&e[s+1]===`
12
- `))return s}}throw new f("cannot find end of structure",{toml:e,ptr:t})}function ie(e,t){let l=e[t],i=l===e[t+1]&&e[t+1]===e[t+2]?e.slice(t,t+3):l;t+=i.length-1;do t=e.indexOf(i,++t);while(t>-1&&l!=="'"&&Ue(e,t));return t>-1&&(t+=i.length,i.length>1&&(e[t]===l&&t++,e[t]===l&&t++)),t}let Be=/^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[-+]\d{2}:\d{2})?$/i;class S extends Date{#t=!1;#n=!1;#e=null;constructor(t){let l=!0,i=!0,a="Z";if(typeof t=="string"){let s=t.match(Be);s?(s[1]||(l=!1,t=`0000-01-01T${t}`),i=!!s[2],i&&t[10]===" "&&(t=t.replace(" ","T")),s[2]&&+s[2]>23?t="":(a=s[3]||null,t=t.toUpperCase(),!a&&i&&(t+="Z"))):t=""}super(t),isNaN(this.getTime())||(this.#t=l,this.#n=i,this.#e=a)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let t=super.toISOString();if(this.isDate())return t.slice(0,10);if(this.isTime())return t.slice(11,23);if(this.#e===null)return t.slice(0,-1);if(this.#e==="Z")return t;let l=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return l=this.#e[0]==="-"?l:-l,new Date(this.getTime()-l*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(t,l="Z"){let i=new S(t);return i.#e=l,i}static wrapAsLocalDateTime(t){let l=new S(t);return l.#e=null,l}static wrapAsLocalDate(t){let l=new S(t);return l.#n=!1,l.#e=null,l}static wrapAsLocalTime(t){let l=new S(t);return l.#t=!1,l.#e=null,l}}let Ge=/^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\d(_?\d)*))$/,$e=/^[+-]?\d(_?\d)*(\.\d(_?\d)*)?([eE][+-]?\d(_?\d)*)?$/,Ke=/^[+-]?0[0-9_]/,Xe=/^[0-9a-f]{2,8}$/i,ee={b:"\b",t:" ",n:`
12
+ `))return s}}throw new f("cannot find end of structure",{toml:e,ptr:t})}function ie(e,t){let l=e[t],i=l===e[t+1]&&e[t+1]===e[t+2]?e.slice(t,t+3):l;t+=i.length-1;do t=e.indexOf(i,++t);while(t>-1&&l!=="'"&&Me(e,t));return t>-1&&(t+=i.length,i.length>1&&(e[t]===l&&t++,e[t]===l&&t++)),t}let ze=/^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[-+]\d{2}:\d{2})?$/i;class S extends Date{#t=!1;#n=!1;#e=null;constructor(t){let l=!0,i=!0,a="Z";if(typeof t=="string"){let s=t.match(ze);s?(s[1]||(l=!1,t=`0000-01-01T${t}`),i=!!s[2],i&&t[10]===" "&&(t=t.replace(" ","T")),s[2]&&+s[2]>23?t="":(a=s[3]||null,t=t.toUpperCase(),!a&&i&&(t+="Z"))):t=""}super(t),isNaN(this.getTime())||(this.#t=l,this.#n=i,this.#e=a)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let t=super.toISOString();if(this.isDate())return t.slice(0,10);if(this.isTime())return t.slice(11,23);if(this.#e===null)return t.slice(0,-1);if(this.#e==="Z")return t;let l=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return l=this.#e[0]==="-"?l:-l,new Date(this.getTime()-l*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(t,l="Z"){let i=new S(t);return i.#e=l,i}static wrapAsLocalDateTime(t){let l=new S(t);return l.#e=null,l}static wrapAsLocalDate(t){let l=new S(t);return l.#n=!1,l.#e=null,l}static wrapAsLocalTime(t){let l=new S(t);return l.#t=!1,l.#e=null,l}}let Be=/^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\d(_?\d)*))$/,Ge=/^[+-]?\d(_?\d)*(\.\d(_?\d)*)?([eE][+-]?\d(_?\d)*)?$/,Ke=/^[+-]?0[0-9_]/,Xe=/^[0-9a-f]{2,8}$/i,Q={b:"\b",t:" ",n:`
13
13
  `,f:"\f",r:"\r",e:"\x1B",'"':'"',"\\":"\\"};function oe(e,t=0,l=e.length){let i=e[t]==="'",a=e[t++]===e[t]&&e[t]===e[t+1];a&&(l-=2,e[t+=2]==="\r"&&t++,e[t]===`
14
14
  `&&t++);let s=0,r,o="",d=t;for(;t<l-1;){let c=e[t++];if(c===`
15
15
  `||c==="\r"&&e[t]===`
16
16
  `){if(!a)throw new f("newlines are not allowed in strings",{toml:e,ptr:t-1})}else if(c<" "&&c!==" "||c==="")throw new f("control characters are not allowed in strings",{toml:e,ptr:t-1});if(r){if(r=!1,c==="x"||c==="u"||c==="U"){let p=e.slice(t,t+=c==="x"?2:c==="u"?4:8);if(!Xe.test(p))throw new f("invalid unicode escape",{toml:e,ptr:s});try{o+=String.fromCodePoint(parseInt(p,16))}catch{throw new f("invalid unicode escape",{toml:e,ptr:s})}}else if(a&&(c===`
17
17
  `||c===" "||c===" "||c==="\r")){if(t=k(e,t-1,!0),e[t]!==`
18
- `&&e[t]!=="\r")throw new f("invalid escape: only line-ending whitespace may be escaped",{toml:e,ptr:s});t=k(e,t)}else if(c in ee)o+=ee[c];else throw new f("unrecognized escape sequence",{toml:e,ptr:s});d=t}else!i&&c==="\\"&&(s=t-1,r=!0,o+=e.slice(d,s))}return o+e.slice(d,l-1)}function qe(e,t,l,i){if(e==="true")return!0;if(e==="false")return!1;if(e==="-inf")return-1/0;if(e==="inf"||e==="+inf")return 1/0;if(e==="nan"||e==="+nan"||e==="-nan")return NaN;if(e==="-0")return i?0n:0;let a=Ge.test(e);if(a||$e.test(e)){if(Ke.test(e))throw new f("leading zeroes are not allowed",{toml:t,ptr:l});e=e.replace(/_/g,"");let r=+e;if(isNaN(r))throw new f("invalid number",{toml:t,ptr:l});if(a){if((a=!Number.isSafeInteger(r))&&!i)throw new f("integer value cannot be represented losslessly",{toml:t,ptr:l});(a||i===!0)&&(r=BigInt(e))}return r}const s=new S(e);if(!s.isValid())throw new f("invalid value",{toml:t,ptr:l});return s}function Ve(e,t,l){let i=e.slice(t,l),a=i.indexOf("#");return a>-1&&(F(e,a),i=i.slice(0,a)),[i.trimEnd(),a]}function V(e,t,l,i,a){if(i===0)throw new f("document contains excessively nested structures. aborting.",{toml:e,ptr:t});let s=e[t];if(s==="["||s==="{"){let[d,c]=s==="["?Je(e,t,i,a):He(e,t,i,a);if(l){if(c=k(e,c),e[c]===",")c++;else if(e[c]!==l)throw new f("expected comma or end of structure",{toml:e,ptr:c})}return[d,c]}let r;if(s==='"'||s==="'"){r=ie(e,t);let d=oe(e,t,r);if(l){if(r=k(e,r),e[r]&&e[r]!==","&&e[r]!==l&&e[r]!==`
19
- `&&e[r]!=="\r")throw new f("unexpected character encountered",{toml:e,ptr:r});r+=+(e[r]===",")}return[d,r]}r=ze(e,t,",",l);let o=Ve(e,t,r-+(e[r-1]===","));if(!o[0])throw new f("incomplete key-value declaration: no value specified",{toml:e,ptr:t});return l&&o[1]>-1&&(r=k(e,t+o[1]),r+=+(e[r]===",")),[qe(o[0],e,t,a),r]}let Ze=/^[a-zA-Z0-9-_]+[ \t]*$/;function $(e,t,l="="){let i=t-1,a=[],s=e.indexOf(l,t);if(s<0)throw new f("incomplete key-value: cannot find end of key",{toml:e,ptr:t});do{let r=e[t=++i];if(r!==" "&&r!==" ")if(r==='"'||r==="'"){if(r===e[t+1]&&r===e[t+2])throw new f("multiline strings are not allowed in keys",{toml:e,ptr:t});let o=ie(e,t);if(o<0)throw new f("unfinished string encountered",{toml:e,ptr:t});i=e.indexOf(".",o);let d=e.slice(o,i<0||i>s?s:i),c=G(d);if(c>-1)throw new f("newlines are not allowed in keys",{toml:e,ptr:t+i+c});if(d.trimStart())throw new f("found extra tokens after the string part",{toml:e,ptr:o});if(s<o&&(s=e.indexOf(l,o),s<0))throw new f("incomplete key-value: cannot find end of key",{toml:e,ptr:t});a.push(oe(e,t,o))}else{i=e.indexOf(".",t);let o=e.slice(t,i<0||i>s?s:i);if(!Ze.test(o))throw new f("only letter, numbers, dashes and underscores are allowed in keys",{toml:e,ptr:t});a.push(o.trimEnd())}}while(i+1&&i<s);return[a,k(e,s+1,!0,!0)]}function He(e,t,l,i){let a={},s=new Set,r;for(t++;(r=e[t++])!=="}"&&r;){if(r===",")throw new f("expected value, found comma",{toml:e,ptr:t-1});if(r==="#")t=F(e,t);else if(r!==" "&&r!==" "&&r!==`
20
- `&&r!=="\r"){let o,d=a,c=!1,[p,v]=$(e,t-1);for(let g=0;g<p.length;g++){if(g&&(d=c?d[o]:d[o]={}),o=p[g],(c=Object.hasOwn(d,o))&&(typeof d[o]!="object"||s.has(d[o])))throw new f("trying to redefine an already defined value",{toml:e,ptr:t});!c&&o==="__proto__"&&Object.defineProperty(d,o,{enumerable:!0,configurable:!0,writable:!0})}if(c)throw new f("trying to redefine an already defined value",{toml:e,ptr:t});let[h,u]=V(e,v,"}",l-1,i);s.add(h),d[o]=h,t=u}}if(!r)throw new f("unfinished table encountered",{toml:e,ptr:t});return[a,t]}function Je(e,t,l,i){let a=[],s;for(t++;(s=e[t++])!=="]"&&s;){if(s===",")throw new f("expected value, found comma",{toml:e,ptr:t-1});if(s==="#")t=F(e,t);else if(s!==" "&&s!==" "&&s!==`
21
- `&&s!=="\r"){let r=V(e,t-1,"]",l-1,i);a.push(r[0]),t=r[1]}}if(!s)throw new f("unfinished array encountered",{toml:e,ptr:t});return[a,t]}function te(e,t,l,i){let a=t,s=l,r,o=!1,d;for(let c=0;c<e.length;c++){if(c){if(a=o?a[r]:a[r]={},s=(d=s[r]).c,i===0&&(d.t===1||d.t===2))return null;if(d.t===2){let p=a.length-1;a=a[p],s=s[p].c}}if(r=e[c],(o=Object.hasOwn(a,r))&&s[r]?.t===0&&s[r]?.d)return null;o||(r==="__proto__"&&(Object.defineProperty(a,r,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(s,r,{enumerable:!0,configurable:!0,writable:!0})),s[r]={t:c<e.length-1&&i===2?3:i,d:!1,i:0,c:{}})}if(d=s[r],d.t!==i&&!(i===1&&d.t===3)||(i===2&&(d.d||(d.d=!0,a[r]=[]),a[r].push(a={}),d.c[d.i++]=d={t:1,d:!1,i:0,c:{}}),d.d))return null;if(d.d=!0,i===1)a=o?a[r]:a[r]={};else if(i===0&&o)return null;return[r,a,d.c]}function Ye(e,{maxDepth:t=1e3,integersAsBigInt:l}={}){let i={},a={},s=i,r=a;for(let o=k(e,0);o<e.length;){if(e[o]==="["){let d=e[++o]==="[",c=$(e,o+=+d,"]");if(d){if(e[c[1]-1]!=="]")throw new f("expected end of table declaration",{toml:e,ptr:c[1]-1});c[1]++}let p=te(c[0],i,a,d?2:1);if(!p)throw new f("trying to redefine an already defined table or value",{toml:e,ptr:o});r=p[2],s=p[1],o=c[1]}else{let d=$(e,o),c=te(d[0],s,r,0);if(!c)throw new f("trying to redefine an already defined table or value",{toml:e,ptr:o});let p=V(e,d[1],void 0,t,l);c[1][c[0]]=p[0],o=p[1]}if(o=k(e,o,!0),e[o]&&e[o]!==`
22
- `&&e[o]!=="\r")throw new f("each key-value declaration must be followed by an end-of-line",{toml:e,ptr:o});o=k(e,o)}return i}function We(){return be({queryKey:ve.system.cursorAgentModels,queryFn:()=>ye.get("/system/cursor-agent-models"),staleTime:1e3*60*10})}function Qe({value:e,onChange:t}){const{t:l}=T(),{data:i,isLoading:a,isError:s}=We(),r=i?.models??[],[o,d]=w.useState(!1),[c,p]=w.useState(""),v=w.useMemo(()=>{const h=c.trim().toLowerCase();return h?r.filter(u=>u.id.toLowerCase().includes(h)||u.label.toLowerCase().includes(h)):r},[r,c]);return n.jsxs("div",{className:"flex flex-col gap-2 flex-1 min-w-0",children:[n.jsx("input",{type:"text",value:e,onChange:h=>{const u=h.target.value;t(u===""?void 0:u)},placeholder:l("留空为 auto;或直接输入模型 ID(与 cursor-agent --model 一致)"),className:"w-full px-3 py-1.5 text-sm border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900 font-mono"}),n.jsxs("button",{type:"button",onClick:()=>d(h=>!h),disabled:a,className:"flex items-center gap-1 text-xs text-neutral-600 hover:text-neutral-900 disabled:opacity-50 w-fit",children:[n.jsx(ae,{size:14,className:U("transition-transform",o&&"rotate-180")}),a?l("正在加载 cursor-agent 模型列表…"):o?l("收起列表"):l("从本机 cursor-agent 选择({count} 个)",{count:r.length})]}),o&&!a&&n.jsxs("div",{className:"rounded-lg border border-neutral-200 bg-white shadow-sm overflow-hidden",children:[n.jsx("input",{type:"text",value:c,onChange:h=>p(h.target.value),placeholder:l("筛选模型…"),className:"w-full px-3 py-2 text-sm border-b border-neutral-100 focus:outline-none focus:ring-1 focus:ring-inset focus:ring-neutral-300"}),n.jsxs("div",{className:"max-h-[min(50vh,22rem)] overflow-y-auto py-1",children:[n.jsx("button",{type:"button",onClick:()=>{t(void 0),d(!1),p("")},className:U("w-full px-3 py-2 text-left text-sm hover:bg-neutral-50",e?"text-neutral-700":"bg-neutral-50 font-medium"),children:l("默认 (auto)")}),v.map(h=>n.jsxs("button",{type:"button",onClick:()=>{t(h.id),d(!1),p("")},className:U("w-full px-3 py-2 text-left text-sm hover:bg-neutral-50 border-t border-neutral-100",e===h.id?"bg-blue-50/80":""),children:[n.jsx("div",{className:"font-mono text-xs text-neutral-900 break-all",children:h.id}),n.jsx("div",{className:"text-xs text-neutral-500 mt-0.5 break-words",children:h.label})]},h.id)),v.length===0&&n.jsx("div",{className:"px-3 py-4 text-xs text-neutral-400 text-center",children:l("无匹配项")})]})]}),(s||i?.error)&&n.jsxs("p",{className:"text-xs text-amber-700",children:[l("无法从本机加载模型列表({error})。仍可手动输入;或在安装 cursor-agent 的机器上运行",{error:i?.error??l("请求失败")}),n.jsx("code",{className:"mx-0.5 bg-neutral-100 px-1 rounded text-[11px]",children:"cursor-agent --list-models"}),l("查看 ID。")]})]})}const Z={CLAUDE_CODE:"Claude Code",GEMINI_CLI:"Gemini CLI",CURSOR_AGENT:"Cursor Agent",CODEX:"Codex"},R={key:"appendPrompt",label:"追加 Prompt",type:"textarea",rows:3,placeholder:"追加到每次 prompt 末尾的文本"},H={[N.CLAUDE_CODE]:[{key:"dangerouslySkipPermissions",label:"跳过权限确认",type:"switch"},{key:"model",label:"模型",type:"input",placeholder:"claude-sonnet-4-20250514"},{key:"effort",label:"推理强度",type:"select",options:[{value:"",label:"默认"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"},{value:"xhigh",label:"XHigh"},{value:"max",label:"Max"}]},R],[N.GEMINI_CLI]:[{key:"yolo",label:"跳过权限确认",type:"switch"},{key:"model",label:"模型",type:"input",placeholder:"gemini-2.5-pro"},R],[N.CURSOR_AGENT]:[{key:"force",label:"强制执行",type:"switch"},{key:"model",label:"模型",type:"cursor_model"},R],[N.CODEX]:[{key:"dangerouslyBypassApprovalsAndSandbox",label:"跳过所有确认和沙盒",type:"switch"},{key:"model",label:"模型",type:"input",placeholder:"o3"},{key:"profile",label:"Profile",type:"input",placeholder:"~/.codex/config.toml 中的 profile 名称"},R]};function ne(){return{}}function K(e,t){return{...t}}const et=JSON.stringify({env:{ANTHROPIC_API_KEY:"",ANTHROPIC_BASE_URL:""}},null,2),tt=`# Codex config.toml 配置片段 — 通过 -c 参数注入,不会修改 ~/.codex/config.toml
18
+ `&&e[t]!=="\r")throw new f("invalid escape: only line-ending whitespace may be escaped",{toml:e,ptr:s});t=k(e,t)}else if(c in Q)o+=Q[c];else throw new f("unrecognized escape sequence",{toml:e,ptr:s});d=t}else!i&&c==="\\"&&(s=t-1,r=!0,o+=e.slice(d,s))}return o+e.slice(d,l-1)}function $e(e,t,l,i){if(e==="true")return!0;if(e==="false")return!1;if(e==="-inf")return-1/0;if(e==="inf"||e==="+inf")return 1/0;if(e==="nan"||e==="+nan"||e==="-nan")return NaN;if(e==="-0")return i?0n:0;let a=Be.test(e);if(a||Ge.test(e)){if(Ke.test(e))throw new f("leading zeroes are not allowed",{toml:t,ptr:l});e=e.replace(/_/g,"");let r=+e;if(isNaN(r))throw new f("invalid number",{toml:t,ptr:l});if(a){if((a=!Number.isSafeInteger(r))&&!i)throw new f("integer value cannot be represented losslessly",{toml:t,ptr:l});(a||i===!0)&&(r=BigInt(e))}return r}const s=new S(e);if(!s.isValid())throw new f("invalid value",{toml:t,ptr:l});return s}function Ve(e,t,l){let i=e.slice(t,l),a=i.indexOf("#");return a>-1&&(M(e,a),i=i.slice(0,a)),[i.trimEnd(),a]}function V(e,t,l,i,a){if(i===0)throw new f("document contains excessively nested structures. aborting.",{toml:e,ptr:t});let s=e[t];if(s==="["||s==="{"){let[d,c]=s==="["?Je(e,t,i,a):qe(e,t,i,a);if(l){if(c=k(e,c),e[c]===",")c++;else if(e[c]!==l)throw new f("expected comma or end of structure",{toml:e,ptr:c})}return[d,c]}let r;if(s==='"'||s==="'"){r=ie(e,t);let d=oe(e,t,r);if(l){if(r=k(e,r),e[r]&&e[r]!==","&&e[r]!==l&&e[r]!==`
19
+ `&&e[r]!=="\r")throw new f("unexpected character encountered",{toml:e,ptr:r});r+=+(e[r]===",")}return[d,r]}r=Ue(e,t,",",l);let o=Ve(e,t,r-+(e[r-1]===","));if(!o[0])throw new f("incomplete key-value declaration: no value specified",{toml:e,ptr:t});return l&&o[1]>-1&&(r=k(e,t+o[1]),r+=+(e[r]===",")),[$e(o[0],e,t,a),r]}let Ze=/^[a-zA-Z0-9-_]+[ \t]*$/;function K(e,t,l="="){let i=t-1,a=[],s=e.indexOf(l,t);if(s<0)throw new f("incomplete key-value: cannot find end of key",{toml:e,ptr:t});do{let r=e[t=++i];if(r!==" "&&r!==" ")if(r==='"'||r==="'"){if(r===e[t+1]&&r===e[t+2])throw new f("multiline strings are not allowed in keys",{toml:e,ptr:t});let o=ie(e,t);if(o<0)throw new f("unfinished string encountered",{toml:e,ptr:t});i=e.indexOf(".",o);let d=e.slice(o,i<0||i>s?s:i),c=G(d);if(c>-1)throw new f("newlines are not allowed in keys",{toml:e,ptr:t+i+c});if(d.trimStart())throw new f("found extra tokens after the string part",{toml:e,ptr:o});if(s<o&&(s=e.indexOf(l,o),s<0))throw new f("incomplete key-value: cannot find end of key",{toml:e,ptr:t});a.push(oe(e,t,o))}else{i=e.indexOf(".",t);let o=e.slice(t,i<0||i>s?s:i);if(!Ze.test(o))throw new f("only letter, numbers, dashes and underscores are allowed in keys",{toml:e,ptr:t});a.push(o.trimEnd())}}while(i+1&&i<s);return[a,k(e,s+1,!0,!0)]}function qe(e,t,l,i){let a={},s=new Set,r;for(t++;(r=e[t++])!=="}"&&r;){if(r===",")throw new f("expected value, found comma",{toml:e,ptr:t-1});if(r==="#")t=M(e,t);else if(r!==" "&&r!==" "&&r!==`
20
+ `&&r!=="\r"){let o,d=a,c=!1,[p,v]=K(e,t-1);for(let g=0;g<p.length;g++){if(g&&(d=c?d[o]:d[o]={}),o=p[g],(c=Object.hasOwn(d,o))&&(typeof d[o]!="object"||s.has(d[o])))throw new f("trying to redefine an already defined value",{toml:e,ptr:t});!c&&o==="__proto__"&&Object.defineProperty(d,o,{enumerable:!0,configurable:!0,writable:!0})}if(c)throw new f("trying to redefine an already defined value",{toml:e,ptr:t});let[h,u]=V(e,v,"}",l-1,i);s.add(h),d[o]=h,t=u}}if(!r)throw new f("unfinished table encountered",{toml:e,ptr:t});return[a,t]}function Je(e,t,l,i){let a=[],s;for(t++;(s=e[t++])!=="]"&&s;){if(s===",")throw new f("expected value, found comma",{toml:e,ptr:t-1});if(s==="#")t=M(e,t);else if(s!==" "&&s!==" "&&s!==`
21
+ `&&s!=="\r"){let r=V(e,t-1,"]",l-1,i);a.push(r[0]),t=r[1]}}if(!s)throw new f("unfinished array encountered",{toml:e,ptr:t});return[a,t]}function ee(e,t,l,i){let a=t,s=l,r,o=!1,d;for(let c=0;c<e.length;c++){if(c){if(a=o?a[r]:a[r]={},s=(d=s[r]).c,i===0&&(d.t===1||d.t===2))return null;if(d.t===2){let p=a.length-1;a=a[p],s=s[p].c}}if(r=e[c],(o=Object.hasOwn(a,r))&&s[r]?.t===0&&s[r]?.d)return null;o||(r==="__proto__"&&(Object.defineProperty(a,r,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(s,r,{enumerable:!0,configurable:!0,writable:!0})),s[r]={t:c<e.length-1&&i===2?3:i,d:!1,i:0,c:{}})}if(d=s[r],d.t!==i&&!(i===1&&d.t===3)||(i===2&&(d.d||(d.d=!0,a[r]=[]),a[r].push(a={}),d.c[d.i++]=d={t:1,d:!1,i:0,c:{}}),d.d))return null;if(d.d=!0,i===1)a=o?a[r]:a[r]={};else if(i===0&&o)return null;return[r,a,d.c]}function Ye(e,{maxDepth:t=1e3,integersAsBigInt:l}={}){let i={},a={},s=i,r=a;for(let o=k(e,0);o<e.length;){if(e[o]==="["){let d=e[++o]==="[",c=K(e,o+=+d,"]");if(d){if(e[c[1]-1]!=="]")throw new f("expected end of table declaration",{toml:e,ptr:c[1]-1});c[1]++}let p=ee(c[0],i,a,d?2:1);if(!p)throw new f("trying to redefine an already defined table or value",{toml:e,ptr:o});r=p[2],s=p[1],o=c[1]}else{let d=K(e,o),c=ee(d[0],s,r,0);if(!c)throw new f("trying to redefine an already defined table or value",{toml:e,ptr:o});let p=V(e,d[1],void 0,t,l);c[1][c[0]]=p[0],o=p[1]}if(o=k(e,o,!0),e[o]&&e[o]!==`
22
+ `&&e[o]!=="\r")throw new f("each key-value declaration must be followed by an end-of-line",{toml:e,ptr:o});o=k(e,o)}return i}function He(){return be({queryKey:ve.system.cursorAgentModels,queryFn:()=>ye.get("/system/cursor-agent-models"),staleTime:1e3*60*10})}function We({value:e,onChange:t}){const{t:l}=T(),{data:i,isLoading:a,isError:s}=He(),r=i?.models??[],[o,d]=w.useState(!1),[c,p]=w.useState(""),v=w.useMemo(()=>{const h=c.trim().toLowerCase();return h?r.filter(u=>u.id.toLowerCase().includes(h)||u.label.toLowerCase().includes(h)):r},[r,c]);return n.jsxs("div",{className:"flex flex-col gap-2 flex-1 min-w-0",children:[n.jsx("input",{type:"text",value:e,onChange:h=>{const u=h.target.value;t(u===""?void 0:u)},placeholder:l("留空为 auto;或直接输入模型 ID(与 cursor-agent --model 一致)"),className:"w-full px-3 py-1.5 text-sm border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900 font-mono"}),n.jsxs("button",{type:"button",onClick:()=>d(h=>!h),disabled:a,className:"flex items-center gap-1 text-xs text-neutral-600 hover:text-neutral-900 disabled:opacity-50 w-fit",children:[n.jsx(ae,{size:14,className:U("transition-transform",o&&"rotate-180")}),a?l("正在加载 cursor-agent 模型列表…"):o?l("收起列表"):l("从本机 cursor-agent 选择({count} 个)",{count:r.length})]}),o&&!a&&n.jsxs("div",{className:"rounded-lg border border-neutral-200 bg-white shadow-sm overflow-hidden",children:[n.jsx("input",{type:"text",value:c,onChange:h=>p(h.target.value),placeholder:l("筛选模型…"),className:"w-full px-3 py-2 text-sm border-b border-neutral-100 focus:outline-none focus:ring-1 focus:ring-inset focus:ring-neutral-300"}),n.jsxs("div",{className:"max-h-[min(50vh,22rem)] overflow-y-auto py-1",children:[n.jsx("button",{type:"button",onClick:()=>{t(void 0),d(!1),p("")},className:U("w-full px-3 py-2 text-left text-sm hover:bg-neutral-50",e?"text-neutral-700":"bg-neutral-50 font-medium"),children:l("默认 (auto)")}),v.map(h=>n.jsxs("button",{type:"button",onClick:()=>{t(h.id),d(!1),p("")},className:U("w-full px-3 py-2 text-left text-sm hover:bg-neutral-50 border-t border-neutral-100",e===h.id?"bg-blue-50/80":""),children:[n.jsx("div",{className:"font-mono text-xs text-neutral-900 break-all",children:h.id}),n.jsx("div",{className:"text-xs text-neutral-500 mt-0.5 break-words",children:h.label})]},h.id)),v.length===0&&n.jsx("div",{className:"px-3 py-4 text-xs text-neutral-400 text-center",children:l("无匹配项")})]})]}),(s||i?.error)&&n.jsxs("p",{className:"text-xs text-amber-700",children:[l("无法从本机加载模型列表({error})。仍可手动输入;或在安装 cursor-agent 的机器上运行",{error:i?.error??l("请求失败")}),n.jsx("code",{className:"mx-0.5 bg-neutral-100 px-1 rounded text-[11px]",children:"cursor-agent --list-models"}),l("查看 ID。")]})]})}const Z={CLAUDE_CODE:"Claude Code",GEMINI_CLI:"Gemini CLI",CURSOR_AGENT:"Cursor Agent",CODEX:"Codex"},R={key:"appendPrompt",label:"追加 Prompt",type:"textarea",rows:3,placeholder:"追加到每次 prompt 末尾的文本"},q={[N.CLAUDE_CODE]:[{key:"dangerouslySkipPermissions",label:"跳过权限确认",type:"switch"},{key:"model",label:"模型",type:"input",placeholder:"claude-sonnet-4-20250514"},{key:"effort",label:"推理强度",type:"select",options:[{value:"",label:"默认"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"},{value:"xhigh",label:"XHigh"},{value:"max",label:"Max"}]},R],[N.GEMINI_CLI]:[{key:"yolo",label:"跳过权限确认",type:"switch"},{key:"model",label:"模型",type:"input",placeholder:"gemini-2.5-pro"},R],[N.CURSOR_AGENT]:[{key:"force",label:"强制执行",type:"switch"},{key:"model",label:"模型",type:"cursor_model"},R],[N.CODEX]:[{key:"dangerouslyBypassApprovalsAndSandbox",label:"跳过所有确认和沙盒",type:"switch"},{key:"model",label:"模型",type:"input",placeholder:"o3"},{key:"profile",label:"Profile",type:"input",placeholder:"~/.codex/config.toml 中的 profile 名称"},R]};function te(){return{}}function X(e,t){return{...t}}const Qe=JSON.stringify({env:{ANTHROPIC_API_KEY:"",ANTHROPIC_BASE_URL:""}},null,2),et=`# Codex config.toml 配置片段 — 通过 -c 参数注入,不会修改 ~/.codex/config.toml
23
23
  # 参考: https://developers.openai.com/codex/config-sample
24
24
 
25
25
  # ─── 模型与推理 ─────────────────────────────────────────────
@@ -51,4 +51,4 @@ ${s}`,l),this.line=i,this.column=a,this.codeblock=s}}function Ue(e,t){let l=0;fo
51
51
  # name = "Ollama"
52
52
  # base_url = "http://localhost:11434/v1"
53
53
  # wire_api = "responses"
54
- `;function z(e){return e===N.CLAUDE_CODE?et:e===N.CODEX?tt:""}function nt(e){return e===N.CLAUDE_CODE||e===N.CODEX}const rt=Object.values(H).flat().reduce((e,t)=>(e[t.key]||(e[t.key]=t.label),e),{}),st=Object.values(H).flat().reduce((e,t)=>(t.options&&(e[t.key]=Object.fromEntries(t.options.map(l=>[l.value,l.label]))),e),{});function lt(e,t){return typeof t=="boolean"?t?Q("是"):Q("否"):typeof t=="string"&&t?st[e]?.[t]??t:String(t)}function M(e,t){return e instanceof Error?e.message:t}function at(e){return`agent-tower-provider-backup-${e.replace(/[:.]/g,"-")}.json`}function it(e,t){const l=new Blob([JSON.stringify(t,null,2)],{type:"application/json"}),i=URL.createObjectURL(l),a=document.createElement("a");a.href=i,a.download=e,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}function ot(e){switch(e){case"CREATE":return{label:"新增",className:"text-green-700 bg-green-50"};case"OVERWRITE":return{label:"覆盖",className:"text-amber-700 bg-amber-50"};case"SKIP":return{label:"跳过",className:"text-neutral-600 bg-neutral-100"}}}function ct({type:e}){const{t}=T();return e==="LOGIN_DETECTED"||e==="INSTALLATION_FOUND"?n.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-xs text-green-700 bg-green-50 rounded",children:[n.jsx(Ie,{size:12}),t("可用")]}):n.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-xs text-neutral-500 bg-neutral-50 rounded",children:[n.jsx(Ae,{size:12}),t("不可用")]})}function B({title:e,defaultOpen:t=!1,children:l}){const[i,a]=w.useState(t);return n.jsxs("div",{className:"border border-neutral-200 rounded-lg",children:[n.jsxs("button",{type:"button",onClick:()=>a(s=>!s),className:"w-full flex items-center justify-between px-4 py-2.5 text-sm font-medium text-neutral-700 hover:bg-neutral-50 transition-colors rounded-lg",children:[e,n.jsx(ae,{size:14,className:`transition-transform ${i?"rotate-180":""}`})]}),i&&n.jsx("div",{className:"px-4 pb-4 space-y-3",children:l})]})}function dt({agentType:e,config:t,onChange:l}){const{t:i}=T(),a=H[e]??[];if(a.length===0)return n.jsx("p",{className:"text-xs text-neutral-400",children:i("该类型暂无运行配置")});const s=(r,o)=>{l({...t,[r]:o})};return n.jsx("div",{className:"space-y-3",children:a.map(r=>r.type==="textarea"?n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm text-neutral-700 mb-1",children:i(r.label)}),n.jsx("textarea",{value:t[r.key]??"",onChange:o=>s(r.key,o.target.value||void 0),placeholder:r.placeholder?i(r.placeholder):void 0,rows:r.rows??3,className:"w-full px-3 py-1.5 text-sm border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900"})]},r.key):r.type==="cursor_model"?n.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start",children:[n.jsx("label",{className:"text-sm text-neutral-700 w-32 shrink-0 sm:pt-2",children:i(r.label)}),n.jsx(Qe,{value:t[r.key]??"",onChange:o=>s(r.key,o)})]},r.key):n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx("label",{className:"text-sm text-neutral-700 w-32 shrink-0",children:i(r.label)}),r.type==="switch"&&n.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:!!t[r.key],onChange:o=>s(r.key,o.target.checked),className:"sr-only peer"}),n.jsx("div",{className:"w-9 h-5 bg-neutral-200 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-neutral-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-neutral-900"})]}),r.type==="input"&&n.jsx("input",{type:"text",value:t[r.key]??"",onChange:o=>s(r.key,o.target.value||void 0),placeholder:r.placeholder?i(r.placeholder):void 0,className:"flex-1 px-3 py-1.5 text-sm border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900"}),r.type==="select"&&r.options&&n.jsx(le,{value:t[r.key]??"",onChange:o=>s(r.key,o||void 0),options:r.options,placeholder:i("选择...")})]},r.key))})}function ut({isOpen:e,onClose:t,initialData:l,onSave:i}){const{t:a}=T(),[s,r]=w.useState(l??{name:"",agentType:N.CLAUDE_CODE,config:ne(),settings:"",env:[],isDefault:!1}),[o,d]=w.useState("");w.useEffect(()=>{if(!l&&!s.settings){const u=z(s.agentType);u&&r(g=>({...g,settings:u}))}},[]);const c=u=>{r(g=>({...g,agentType:u,config:ne(),settings:z(u)}))},p=()=>{d("");const u=K(s.agentType,s.config),g={};for(const[j,_]of Object.entries(u))_!==void 0&&_!==""&&(g[j]=_);const y=s.settings.trim();if(y){if(s.agentType===N.CODEX)try{Ye(y)}catch(j){d(a("TOML 语法错误: {message}",{message:j instanceof Error?j.message:String(j)}));return}else if(s.agentType===N.CLAUDE_CODE)try{JSON.parse(y)}catch{d(a("JSON 语法错误"));return}}const b={};for(const{key:j,value:_}of s.env){const D=j.trim();D&&(b[D]=_)}const C={name:s.name,agentType:s.agentType,config:g,settings:y||void 0,env:Object.keys(b).length>0?b:void 0,isDefault:s.isDefault};i(C)};if(!e)return null;const v=nt(s.agentType),h=s.agentType===N.CODEX;return n.jsx(q,{isOpen:e,onClose:t,title:a(l?"编辑 Provider":"新建 Provider"),className:"max-w-2xl",children:n.jsxs("div",{className:"space-y-4",children:[n.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[n.jsxs("div",{children:[n.jsx("label",{className:"block text-xs font-medium text-neutral-700 mb-1",children:a("名称")}),n.jsx("input",{type:"text",value:s.name,onChange:u=>r(g=>({...g,name:u.target.value})),className:"w-full px-3 py-2 text-sm border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900",placeholder:a("例如: Claude Code (官方)")})]}),!l&&n.jsxs("div",{children:[n.jsx("label",{className:"block text-xs font-medium text-neutral-700 mb-1",children:a("Agent 类型")}),n.jsx(le,{value:s.agentType,onChange:u=>c(u),options:Object.values(N).map(u=>({value:u,label:Z[u]??u})),placeholder:a("选择 Agent 类型")})]})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",id:"isDefault",checked:s.isDefault,onChange:u=>r(g=>({...g,isDefault:u.target.checked})),className:"w-4 h-4"}),n.jsx("label",{htmlFor:"isDefault",className:"text-sm text-neutral-700",children:a("设为该类型的默认 Provider")})]}),n.jsx(B,{title:a("运行配置"),defaultOpen:!0,children:n.jsx(dt,{agentType:s.agentType,config:s.config,onChange:u=>r(g=>({...g,config:u}))})}),n.jsxs(B,{title:a("环境变量"),defaultOpen:s.env.length>0,children:[n.jsxs("p",{className:"text-xs text-neutral-500 mb-2",children:[a("注入到 Agent 进程的环境变量。Codex 的")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"env_key"})," ",a("指定的是变量名,实际值需在此处设置。")]}),n.jsxs("div",{className:"space-y-2",children:[s.env.map((u,g)=>n.jsxs("div",{className:"flex gap-2 items-center",children:[n.jsx("input",{type:"text",value:u.key,onChange:y=>{const b=[...s.env];b[g]={...b[g],key:y.target.value},r(C=>({...C,env:b}))},placeholder:a("变量名,如 AZURE_OPENAI_API_KEY"),className:"flex-1 px-3 py-1.5 text-sm font-mono border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900"}),n.jsx("input",{type:"text",value:u.value,onChange:y=>{const b=[...s.env];b[g]={...b[g],value:y.target.value},r(C=>({...C,env:b}))},placeholder:a("值"),className:"flex-1 px-3 py-1.5 text-sm font-mono border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900"}),n.jsx("button",{type:"button",onClick:()=>{const y=s.env.filter((b,C)=>C!==g);r(b=>({...b,env:y}))},className:"p-1.5 text-neutral-400 hover:text-red-500",children:n.jsx(se,{size:14})})]},g)),n.jsxs(E,{variant:"outline",size:"sm",onClick:()=>r(u=>({...u,env:[...u.env,{key:"",value:""}]})),children:[n.jsx(re,{size:12,className:"mr-1"}),a("添加变量")]})]})]}),v&&n.jsxs(B,{title:a(h?"CLI 原生配置 (config.toml)":"CLI 原生配置 (settings.json)"),children:[n.jsx("p",{className:"text-xs text-neutral-500 mb-2",children:h?n.jsxs(n.Fragment,{children:[a("直接填写 Codex")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"config.toml"})," ",a("格式的配置片段,通过")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"-c"})," ",a("参数注入。不会修改你的")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"~/.codex/config.toml"})," ",a("文件。")]}):n.jsxs(n.Fragment,{children:[a("对应 Claude Code 的")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"~/.claude/settings.json"}),",",a("通过")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"--settings"})," ",a("参数注入。在")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"env"})," ",a("中设置 ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL 等。")]})}),n.jsx("textarea",{value:s.settings,onChange:u=>{r(g=>({...g,settings:u.target.value})),d("")},rows:10,className:"w-full px-3 py-2 text-sm font-mono border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900 bg-neutral-50",placeholder:z(s.agentType)}),o&&n.jsx("p",{className:"mt-1 text-xs text-red-600",children:o})]}),n.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[n.jsx(E,{variant:"outline",onClick:t,children:a("取消")}),n.jsx(E,{onClick:p,disabled:!s.name.trim(),children:a("保存")})]})]})})}function mt({isOpen:e,onClose:t,onConfirm:l,acknowledged:i,onAcknowledgedChange:a,isLoading:s}){const{t:r}=T();return n.jsx(q,{isOpen:e,onClose:t,title:r("导出 Provider 备份"),className:"max-w-xl",action:n.jsxs(n.Fragment,{children:[n.jsx(E,{variant:"outline",onClick:t,disabled:s,children:r("取消")}),n.jsx(E,{onClick:l,disabled:!i||s,children:r(s?"导出中...":"导出备份")})]}),children:n.jsxs("div",{className:"space-y-4",children:[n.jsx("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900",children:r("导出的备份文件将包含完整的 Provider 配置,包括环境变量、CLI settings 等敏感信息。任何拿到文件的人都可能直接使用这些 Provider。")}),n.jsxs("div",{className:"text-sm text-neutral-600 space-y-2",children:[n.jsx("p",{children:r("这个功能用于备份和迁移,不用于分享配置。")}),n.jsx("p",{children:r("导出内容只包含用户层配置:自定义 Provider,以及对内置 Provider 的覆盖。")})]}),n.jsxs("label",{className:"flex items-start gap-3 rounded-lg border border-neutral-200 px-4 py-3 text-sm text-neutral-700",children:[n.jsx("input",{type:"checkbox",checked:i,onChange:o=>a(o.target.checked),className:"mt-0.5 h-4 w-4"}),n.jsx("span",{children:r("我已知晓该备份文件包含敏感信息,只会保存在安全位置。")})]})]})})}function xt({isOpen:e,onClose:t,preview:l,backup:i,onConfirm:a,isLoading:s}){const{t:r}=T();if(!l||!i)return null;const o=l.summary.create+l.summary.overwrite,d=[...l.items].sort((c,p)=>{const v={CREATE:0,OVERWRITE:1,SKIP:2};return v[c.action]-v[p.action]});return n.jsx(q,{isOpen:e,onClose:t,title:r("导入 Provider 备份"),className:"max-w-3xl",action:n.jsxs(n.Fragment,{children:[n.jsx(E,{variant:"outline",onClick:t,disabled:s,children:r("取消")}),n.jsx(E,{onClick:a,disabled:o===0||s,children:s?r("导入中..."):r("确认导入 {count} 项",{count:o})})]}),children:n.jsxs("div",{className:"space-y-4",children:[n.jsxs("div",{className:"rounded-lg border border-neutral-200 bg-neutral-50 px-4 py-3 text-sm text-neutral-600",children:[n.jsx("div",{children:r("导出时间:{value}",{value:new Date(i.exportedAt).toLocaleString()})}),n.jsx("div",{children:r("模式:完整备份(含敏感信息)")}),n.jsx("div",{children:r("文件内 Provider 数量:{count}",{count:i.providers.length})})]}),n.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[n.jsxs("div",{className:"rounded-lg border border-green-200 bg-green-50 px-4 py-3",children:[n.jsx("div",{className:"text-xs text-green-700",children:r("新增")}),n.jsx("div",{className:"text-lg font-semibold text-green-900",children:l.summary.create})]}),n.jsxs("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-4 py-3",children:[n.jsx("div",{className:"text-xs text-amber-700",children:r("覆盖")}),n.jsx("div",{className:"text-lg font-semibold text-amber-900",children:l.summary.overwrite})]}),n.jsxs("div",{className:"rounded-lg border border-neutral-200 bg-neutral-50 px-4 py-3",children:[n.jsx("div",{className:"text-xs text-neutral-500",children:r("跳过")}),n.jsx("div",{className:"text-lg font-semibold text-neutral-900",children:l.summary.skip})]})]}),n.jsx("div",{className:"max-h-[420px] overflow-y-auto space-y-3 pr-1",children:d.map(c=>{const p=ot(c.action);return n.jsxs("div",{className:"rounded-lg border border-neutral-200 px-4 py-3",children:[n.jsx("div",{className:"flex items-center justify-between gap-3",children:n.jsxs("div",{className:"min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("h4",{className:"truncate text-sm font-medium text-neutral-900",children:c.incoming.name}),n.jsx("span",{className:`inline-flex rounded px-2 py-0.5 text-xs ${p.className}`,children:r(p.label)})]}),n.jsxs("div",{className:"mt-1 text-xs text-neutral-500",children:[Z[c.incoming.agentType]??c.incoming.agentType," · ",n.jsx("code",{className:"rounded bg-neutral-100 px-1 py-0.5",children:c.incoming.id})]})]})}),c.action==="OVERWRITE"&&c.existing&&n.jsx("p",{className:"mt-2 text-xs text-amber-700",children:r("将覆盖当前已有的 Provider:{name}",{name:c.existing.name})}),c.action==="SKIP"&&n.jsx("p",{className:"mt-2 text-xs text-neutral-500",children:r("当前同 ID Provider 配置一致,本次不会重复写入。")}),c.action==="CREATE"&&n.jsx("p",{className:"mt-2 text-xs text-green-700",children:r("当前不存在同 ID Provider,将直接新增。")})]},c.incoming.id)})})]})})}function Et(){const{t:e}=T(),{data:t,isLoading:l}=je(),i=we(),a=Ne(),s=Ce(),r=Ee(),o=ke(),d=Pe(),c=w.useRef(null),[p,v]=w.useState(null),[h,u]=w.useState(null),[g,y]=w.useState(!1),[b,C]=w.useState(!1),[j,_]=w.useState(null),D=m=>{i.mutate(m,{onSuccess:()=>v(null)})},ce=(m,x)=>{a.mutate({id:m,data:x},{onSuccess:()=>v(null)})},de=m=>{if(!(m.deletable??!m.builtIn)){P.error(e("系统内置 Provider 不可删除"));return}u({id:m.id,name:m.name,builtIn:m.builtIn})},ue=()=>{h&&s.mutate(h.id,{onSuccess:()=>{P.success(h.builtIn?e("已恢复默认 Provider 配置"):e("Provider 已删除")),u(null)},onError:m=>{P.error(M(m,e("删除 Provider 失败")))}})},J=()=>{y(!1),C(!1)},Y=()=>{_(null)},me=()=>{r.mutate(void 0,{onSuccess:m=>{it(at(m.exportedAt),m),P.success(e("Provider 备份已导出")),J()},onError:m=>{P.error(M(m,e("导出 Provider 备份失败")))}})},xe=()=>{c.current&&(c.current.value="",c.current.click())},fe=async m=>{const x=m.target.files?.[0];if(m.target.value="",!x)return;let O;try{O=JSON.parse(await x.text())}catch{P.error(e("备份文件不是有效的 JSON"));return}o.mutate(O,{onSuccess:I=>{_({backup:O,preview:I})},onError:I=>{P.error(M(I,e("导入预览失败")))}})},pe=()=>{j&&d.mutate(j.backup,{onSuccess:m=>{const x=m.summary.create+m.summary.overwrite;P.success(x===0?e("导入完成,当前配置无需变更"):e("导入完成:新增 {create},覆盖 {overwrite},跳过 {skip}",{create:m.summary.create,overwrite:m.summary.overwrite,skip:m.summary.skip})),Y()},onError:m=>{P.error(M(m,e("导入 Provider 备份失败")))}})},he=m=>{const x=m.provider,O=x.env?Object.entries(x.env).map(([I,L])=>({key:I,value:L})):[];v({id:x.id,data:{name:x.name,agentType:x.agentType,config:K(x.agentType,x.config),settings:x.settings??"",env:O,isDefault:x.isDefault}})};if(l)return n.jsx("div",{className:"p-6 text-sm text-neutral-400",children:e("加载中...")});const W=t??[];return n.jsxs("div",{className:"px-10 py-6 mx-auto w-full max-w-4xl",children:[n.jsx("input",{ref:c,type:"file",accept:".json,application/json",className:"hidden",onChange:fe}),n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsxs("div",{children:[n.jsx("h2",{className:"text-lg font-semibold text-neutral-900",children:e("Provider 配置")}),n.jsx("p",{className:"text-sm text-neutral-500 mt-1",children:e("管理 AI Agent 的连接配置和运行参数")})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsxs(E,{variant:"outline",onClick:xe,disabled:o.isPending||d.isPending,children:[n.jsx(Re,{size:14}),e("导入备份")]}),n.jsxs(E,{variant:"outline",onClick:()=>y(!0),disabled:r.isPending,children:[n.jsx(De,{size:14}),e("导出备份")]}),n.jsxs(E,{onClick:()=>v({}),children:[n.jsx(re,{size:14,className:"mr-1"}),e("新建 Provider")]})]})]}),W.length===0?n.jsx("div",{className:"text-center py-12 text-sm text-neutral-400",children:e("暂无 Provider 配置")}):n.jsx("div",{className:"space-y-3",children:W.map(m=>{const x=m.provider,O=m.availability,I=K(x.agentType,x.config),L=Object.entries(I).filter(([A])=>A!=="cmd");return n.jsx("div",{className:"border border-neutral-200 rounded-lg p-4 hover:border-neutral-300 transition-colors",children:n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("div",{className:"flex-1",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[n.jsx("h3",{className:"text-sm font-medium text-neutral-900",children:x.name}),n.jsx(ct,{type:O.type}),x.isDefault&&n.jsx("span",{className:"px-2 py-0.5 text-xs text-blue-700 bg-blue-50 rounded",children:e("默认")}),x.builtIn&&n.jsx("span",{className:"px-2 py-0.5 text-xs text-neutral-500 bg-neutral-50 rounded",children:e("内置")})]}),n.jsx("p",{className:"text-xs text-neutral-500 mb-2",children:Z[x.agentType]??x.agentType}),L.length>0&&n.jsx("div",{className:"text-xs text-neutral-600 mb-1",children:L.map(([A,ge])=>n.jsxs("span",{className:"inline-flex items-center mr-3",children:[n.jsxs("span",{className:"font-medium",children:[e(rt[A]??A),":"]})," ",lt(A,ge)]},A))}),x.settings?.trim()&&n.jsxs("div",{className:"text-xs text-neutral-600",children:[n.jsx("span",{className:"font-medium",children:e("CLI 配置:")})," ",e("已配置")]}),Object.keys(x.env).length>0&&!x.settings&&n.jsxs("div",{className:"text-xs text-neutral-600",children:[n.jsx("span",{className:"font-medium",children:e("环境变量:")})," ",Object.keys(x.env).join(", ")]})]}),n.jsxs("div",{className:"flex items-center gap-1 ml-4",children:[n.jsx("button",{onClick:()=>he(m),className:"p-2 text-neutral-400 hover:text-neutral-900 transition-colors",title:e("编辑"),children:n.jsx(Oe,{size:14})}),n.jsx("button",{onClick:()=>de(x),className:"p-2 text-neutral-400 hover:text-red-600 transition-colors",title:x.deletable===!1?e("系统内置 Provider 不可删除"):x.builtIn?e("删除自定义覆盖并恢复默认"):e("删除"),disabled:x.deletable===!1,children:n.jsx(se,{size:14})})]})]})},x.id)})}),p&&n.jsx(ut,{isOpen:!0,onClose:()=>v(null),initialData:p.data,onSave:m=>{p.id?ce(p.id,m):D(m)}}),n.jsx(_e,{isOpen:h!==null,onClose:()=>{s.isPending||u(null)},onConfirm:ue,title:h?.builtIn?e("恢复默认 Provider"):e("删除 Provider"),description:h?.builtIn?e('确定删除 "{name}" 的自定义覆盖,并恢复系统默认配置?',{name:h?.name}):e('确定删除 "{name}"?此操作不可撤销。',{name:h?.name}),confirmText:h?.builtIn?e("恢复默认"):e("删除"),cancelText:e("取消"),variant:"danger",isLoading:s.isPending}),n.jsx(mt,{isOpen:g,onClose:J,onConfirm:me,acknowledged:b,onAcknowledgedChange:C,isLoading:r.isPending}),n.jsx(xt,{isOpen:!!j,onClose:Y,preview:j?.preview??null,backup:j?.backup??null,onConfirm:pe,isLoading:d.isPending})]})}export{Et as ProviderSettingsPage};
54
+ `;function z(e){return e===N.CLAUDE_CODE?Qe:e===N.CODEX?et:""}function tt(e){return e===N.CLAUDE_CODE||e===N.CODEX}const nt=Object.values(q).flat().reduce((e,t)=>(e[t.key]||(e[t.key]=t.label),e),{}),rt=Object.values(q).flat().reduce((e,t)=>(t.options&&(e[t.key]=Object.fromEntries(t.options.map(l=>[l.value,l.label]))),e),{});function st(e,t){return typeof t=="boolean"?t?W("是"):W("否"):typeof t=="string"&&t?rt[e]?.[t]??t:String(t)}function F(e,t){return e instanceof Error?e.message:t}function lt(e){return`agent-tower-provider-backup-${e.replace(/[:.]/g,"-")}.json`}function at(e,t){const l=new Blob([JSON.stringify(t,null,2)],{type:"application/json"}),i=URL.createObjectURL(l),a=document.createElement("a");a.href=i,a.download=e,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}function it(e){switch(e){case"CREATE":return{label:"新增",className:"text-green-700 bg-green-50"};case"OVERWRITE":return{label:"覆盖",className:"text-amber-700 bg-amber-50"};case"SKIP":return{label:"跳过",className:"text-neutral-600 bg-neutral-100"}}}function ot({type:e}){const{t}=T();return e==="LOGIN_DETECTED"||e==="INSTALLATION_FOUND"?n.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-xs text-green-700 bg-green-50 rounded",children:[n.jsx(Te,{size:12}),t("可用")]}):n.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-xs text-neutral-500 bg-neutral-50 rounded",children:[n.jsx(Se,{size:12}),t("不可用")]})}function B({title:e,defaultOpen:t=!1,children:l}){const[i,a]=w.useState(t);return n.jsxs("div",{className:"border border-neutral-200 rounded-lg",children:[n.jsxs("button",{type:"button",onClick:()=>a(s=>!s),className:"w-full flex items-center justify-between px-4 py-2.5 text-sm font-medium text-neutral-700 hover:bg-neutral-50 transition-colors rounded-lg",children:[e,n.jsx(ae,{size:14,className:`transition-transform ${i?"rotate-180":""}`})]}),i&&n.jsx("div",{className:"px-4 pb-4 space-y-3",children:l})]})}function ct({agentType:e,config:t,onChange:l}){const{t:i}=T(),a=q[e]??[];if(a.length===0)return n.jsx("p",{className:"text-xs text-neutral-400",children:i("该类型暂无运行配置")});const s=(r,o)=>{l({...t,[r]:o})};return n.jsx("div",{className:"space-y-3",children:a.map(r=>r.type==="textarea"?n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm text-neutral-700 mb-1",children:i(r.label)}),n.jsx("textarea",{value:t[r.key]??"",onChange:o=>s(r.key,o.target.value||void 0),placeholder:r.placeholder?i(r.placeholder):void 0,rows:r.rows??3,className:"w-full px-3 py-1.5 text-sm border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900"})]},r.key):r.type==="cursor_model"?n.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start",children:[n.jsx("label",{className:"text-sm text-neutral-700 w-32 shrink-0 sm:pt-2",children:i(r.label)}),n.jsx(We,{value:t[r.key]??"",onChange:o=>s(r.key,o)})]},r.key):n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx("label",{className:"text-sm text-neutral-700 w-32 shrink-0",children:i(r.label)}),r.type==="switch"&&n.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:!!t[r.key],onChange:o=>s(r.key,o.target.checked),className:"sr-only peer"}),n.jsx("div",{className:"w-9 h-5 bg-neutral-200 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-neutral-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-neutral-900"})]}),r.type==="input"&&n.jsx("input",{type:"text",value:t[r.key]??"",onChange:o=>s(r.key,o.target.value||void 0),placeholder:r.placeholder?i(r.placeholder):void 0,className:"flex-1 px-3 py-1.5 text-sm border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900"}),r.type==="select"&&r.options&&n.jsx(le,{value:t[r.key]??"",onChange:o=>s(r.key,o||void 0),options:r.options,placeholder:i("选择...")})]},r.key))})}function dt({isOpen:e,onClose:t,initialData:l,onSave:i}){const{t:a}=T(),[s,r]=w.useState(l??{name:"",agentType:N.CLAUDE_CODE,config:te(),settings:"",env:[],isDefault:!1}),[o,d]=w.useState("");w.useEffect(()=>{if(!l&&!s.settings){const u=z(s.agentType);u&&r(g=>({...g,settings:u}))}},[]);const c=u=>{r(g=>({...g,agentType:u,config:te(),settings:z(u)}))},p=()=>{d("");const u=X(s.agentType,s.config),g={};for(const[j,O]of Object.entries(u))O!==void 0&&O!==""&&(g[j]=O);const y=s.settings.trim();if(y){if(s.agentType===N.CODEX)try{Ye(y)}catch(j){d(a("TOML 语法错误: {message}",{message:j instanceof Error?j.message:String(j)}));return}else if(s.agentType===N.CLAUDE_CODE)try{JSON.parse(y)}catch{d(a("JSON 语法错误"));return}}const b={};for(const{key:j,value:O}of s.env){const D=j.trim();D&&(b[D]=O)}const C={name:s.name,agentType:s.agentType,config:g,settings:y||void 0,env:Object.keys(b).length>0?b:void 0,isDefault:s.isDefault};i(C)};if(!e)return null;const v=tt(s.agentType),h=s.agentType===N.CODEX;return n.jsx($,{isOpen:e,onClose:t,title:a(l?"编辑 Provider":"新建 Provider"),className:"max-w-2xl",children:n.jsxs("div",{className:"space-y-4",children:[n.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[n.jsxs("div",{children:[n.jsx("label",{className:"block text-xs font-medium text-neutral-700 mb-1",children:a("名称")}),n.jsx("input",{type:"text",value:s.name,onChange:u=>r(g=>({...g,name:u.target.value})),className:"w-full px-3 py-2 text-sm border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900",placeholder:a("例如: Claude Code (官方)")})]}),!l&&n.jsxs("div",{children:[n.jsx("label",{className:"block text-xs font-medium text-neutral-700 mb-1",children:a("Agent 类型")}),n.jsx(le,{value:s.agentType,onChange:u=>c(u),options:Object.values(N).map(u=>({value:u,label:Z[u]??u})),placeholder:a("选择 Agent 类型")})]})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",id:"isDefault",checked:s.isDefault,onChange:u=>r(g=>({...g,isDefault:u.target.checked})),className:"w-4 h-4"}),n.jsx("label",{htmlFor:"isDefault",className:"text-sm text-neutral-700",children:a("设为该类型的默认 Provider")})]}),n.jsx(B,{title:a("运行配置"),defaultOpen:!0,children:n.jsx(ct,{agentType:s.agentType,config:s.config,onChange:u=>r(g=>({...g,config:u}))})}),n.jsxs(B,{title:a("环境变量"),defaultOpen:s.env.length>0,children:[n.jsxs("p",{className:"text-xs text-neutral-500 mb-2",children:[a("注入到 Agent 进程的环境变量。Codex 的")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"env_key"})," ",a("指定的是变量名,实际值需在此处设置。")]}),n.jsxs("div",{className:"space-y-2",children:[s.env.map((u,g)=>n.jsxs("div",{className:"flex gap-2 items-center",children:[n.jsx("input",{type:"text",value:u.key,onChange:y=>{const b=[...s.env];b[g]={...b[g],key:y.target.value},r(C=>({...C,env:b}))},placeholder:a("变量名,如 AZURE_OPENAI_API_KEY"),className:"flex-1 px-3 py-1.5 text-sm font-mono border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900"}),n.jsx("input",{type:"text",value:u.value,onChange:y=>{const b=[...s.env];b[g]={...b[g],value:y.target.value},r(C=>({...C,env:b}))},placeholder:a("值"),className:"flex-1 px-3 py-1.5 text-sm font-mono border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900"}),n.jsx("button",{type:"button",onClick:()=>{const y=s.env.filter((b,C)=>C!==g);r(b=>({...b,env:y}))},className:"p-1.5 text-neutral-400 hover:text-red-500",children:n.jsx(se,{size:14})})]},g)),n.jsxs(E,{variant:"outline",size:"sm",onClick:()=>r(u=>({...u,env:[...u.env,{key:"",value:""}]})),children:[n.jsx(re,{size:12,className:"mr-1"}),a("添加变量")]})]})]}),v&&n.jsxs(B,{title:a(h?"CLI 原生配置 (config.toml)":"CLI 原生配置 (settings.json)"),children:[n.jsx("p",{className:"text-xs text-neutral-500 mb-2",children:h?n.jsxs(n.Fragment,{children:[a("直接填写 Codex")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"config.toml"})," ",a("格式的配置片段,通过")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"-c"})," ",a("参数注入。不会修改你的")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"~/.codex/config.toml"})," ",a("文件。")]}):n.jsxs(n.Fragment,{children:[a("对应 Claude Code 的")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"~/.claude/settings.json"}),",",a("通过")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"--settings"})," ",a("参数注入。在")," ",n.jsx("code",{className:"bg-neutral-100 px-1 rounded",children:"env"})," ",a("中设置 ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL 等。")]})}),n.jsx("textarea",{value:s.settings,onChange:u=>{r(g=>({...g,settings:u.target.value})),d("")},rows:10,className:"w-full px-3 py-2 text-sm font-mono border border-neutral-200 rounded focus:outline-none focus:ring-1 focus:ring-neutral-900 bg-neutral-50",placeholder:z(s.agentType)}),o&&n.jsx("p",{className:"mt-1 text-xs text-red-600",children:o})]}),n.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[n.jsx(E,{variant:"outline",onClick:t,children:a("取消")}),n.jsx(E,{onClick:p,disabled:!s.name.trim(),children:a("保存")})]})]})})}function ut({isOpen:e,onClose:t,onConfirm:l,acknowledged:i,onAcknowledgedChange:a,isLoading:s}){const{t:r}=T();return n.jsx($,{isOpen:e,onClose:t,title:r("导出 Provider 备份"),className:"max-w-xl",action:n.jsxs(n.Fragment,{children:[n.jsx(E,{variant:"outline",onClick:t,disabled:s,children:r("取消")}),n.jsx(E,{onClick:l,disabled:!i||s,children:r(s?"导出中...":"导出备份")})]}),children:n.jsxs("div",{className:"space-y-4",children:[n.jsx("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900",children:r("导出的备份文件将包含完整的 Provider 配置,包括环境变量、CLI settings 等敏感信息。任何拿到文件的人都可能直接使用这些 Provider。")}),n.jsxs("div",{className:"text-sm text-neutral-600 space-y-2",children:[n.jsx("p",{children:r("这个功能用于备份和迁移,不用于分享配置。")}),n.jsx("p",{children:r("导出内容只包含用户层配置:自定义 Provider,以及对内置 Provider 的覆盖。")})]}),n.jsxs("label",{className:"flex items-start gap-3 rounded-lg border border-neutral-200 px-4 py-3 text-sm text-neutral-700",children:[n.jsx("input",{type:"checkbox",checked:i,onChange:o=>a(o.target.checked),className:"mt-0.5 h-4 w-4"}),n.jsx("span",{children:r("我已知晓该备份文件包含敏感信息,只会保存在安全位置。")})]})]})})}function mt({isOpen:e,onClose:t,preview:l,backup:i,onConfirm:a,isLoading:s}){const{t:r}=T();if(!l||!i)return null;const o=l.summary.create+l.summary.overwrite,d=[...l.items].sort((c,p)=>{const v={CREATE:0,OVERWRITE:1,SKIP:2};return v[c.action]-v[p.action]});return n.jsx($,{isOpen:e,onClose:t,title:r("导入 Provider 备份"),className:"max-w-3xl",action:n.jsxs(n.Fragment,{children:[n.jsx(E,{variant:"outline",onClick:t,disabled:s,children:r("取消")}),n.jsx(E,{onClick:a,disabled:o===0||s,children:s?r("导入中..."):r("确认导入 {count} 项",{count:o})})]}),children:n.jsxs("div",{className:"space-y-4",children:[n.jsxs("div",{className:"rounded-lg border border-neutral-200 bg-neutral-50 px-4 py-3 text-sm text-neutral-600",children:[n.jsx("div",{children:r("导出时间:{value}",{value:new Date(i.exportedAt).toLocaleString()})}),n.jsx("div",{children:r("模式:完整备份(含敏感信息)")}),n.jsx("div",{children:r("文件内 Provider 数量:{count}",{count:i.providers.length})})]}),n.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[n.jsxs("div",{className:"rounded-lg border border-green-200 bg-green-50 px-4 py-3",children:[n.jsx("div",{className:"text-xs text-green-700",children:r("新增")}),n.jsx("div",{className:"text-lg font-semibold text-green-900",children:l.summary.create})]}),n.jsxs("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-4 py-3",children:[n.jsx("div",{className:"text-xs text-amber-700",children:r("覆盖")}),n.jsx("div",{className:"text-lg font-semibold text-amber-900",children:l.summary.overwrite})]}),n.jsxs("div",{className:"rounded-lg border border-neutral-200 bg-neutral-50 px-4 py-3",children:[n.jsx("div",{className:"text-xs text-neutral-500",children:r("跳过")}),n.jsx("div",{className:"text-lg font-semibold text-neutral-900",children:l.summary.skip})]})]}),n.jsx("div",{className:"max-h-[420px] overflow-y-auto space-y-3 pr-1",children:d.map(c=>{const p=it(c.action);return n.jsxs("div",{className:"rounded-lg border border-neutral-200 px-4 py-3",children:[n.jsx("div",{className:"flex items-center justify-between gap-3",children:n.jsxs("div",{className:"min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("h4",{className:"truncate text-sm font-medium text-neutral-900",children:c.incoming.name}),n.jsx("span",{className:`inline-flex rounded px-2 py-0.5 text-xs ${p.className}`,children:r(p.label)})]}),n.jsxs("div",{className:"mt-1 text-xs text-neutral-500",children:[Z[c.incoming.agentType]??c.incoming.agentType," · ",n.jsx("code",{className:"rounded bg-neutral-100 px-1 py-0.5",children:c.incoming.id})]})]})}),c.action==="OVERWRITE"&&c.existing&&n.jsx("p",{className:"mt-2 text-xs text-amber-700",children:r("将覆盖当前已有的 Provider:{name}",{name:c.existing.name})}),c.action==="SKIP"&&n.jsx("p",{className:"mt-2 text-xs text-neutral-500",children:r("当前同 ID Provider 配置一致,本次不会重复写入。")}),c.action==="CREATE"&&n.jsx("p",{className:"mt-2 text-xs text-green-700",children:r("当前不存在同 ID Provider,将直接新增。")})]},c.incoming.id)})})]})})}function Et(){const{t:e}=T(),{data:t,isLoading:l}=je(),i=we(),a=Ne(),s=Ce(),r=Ee(),o=ke(),d=Pe(),c=w.useRef(null),[p,v]=w.useState(null),[h,u]=w.useState(null),[g,y]=w.useState(!1),[b,C]=w.useState(!1),[j,O]=w.useState(null),D=m=>{i.mutate(m,{onSuccess:()=>v(null)})},ce=(m,x)=>{a.mutate({id:m,data:x},{onSuccess:()=>v(null)})},de=m=>{if(!(m.deletable??!m.builtIn)){P.error(e("系统内置 Provider 不可删除"));return}u({id:m.id,name:m.name,builtIn:m.builtIn})},ue=()=>{h&&s.mutate(h.id,{onSuccess:()=>{P.success(h.builtIn?e("已恢复默认 Provider 配置"):e("Provider 已删除")),u(null)},onError:m=>{P.error(F(m,e("删除 Provider 失败")))}})},J=()=>{y(!1),C(!1)},Y=()=>{O(null)},me=()=>{r.mutate(void 0,{onSuccess:m=>{at(lt(m.exportedAt),m),P.success(e("Provider 备份已导出")),J()},onError:m=>{P.error(F(m,e("导出 Provider 备份失败")))}})},xe=()=>{c.current&&(c.current.value="",c.current.click())},fe=async m=>{const x=m.target.files?.[0];if(m.target.value="",!x)return;let _;try{_=JSON.parse(await x.text())}catch{P.error(e("备份文件不是有效的 JSON"));return}o.mutate(_,{onSuccess:I=>{O({backup:_,preview:I})},onError:I=>{P.error(F(I,e("导入预览失败")))}})},pe=()=>{j&&d.mutate(j.backup,{onSuccess:m=>{const x=m.summary.create+m.summary.overwrite;P.success(x===0?e("导入完成,当前配置无需变更"):e("导入完成:新增 {create},覆盖 {overwrite},跳过 {skip}",{create:m.summary.create,overwrite:m.summary.overwrite,skip:m.summary.skip})),Y()},onError:m=>{P.error(F(m,e("导入 Provider 备份失败")))}})},he=m=>{const x=m.provider,_=x.env?Object.entries(x.env).map(([I,L])=>({key:I,value:L})):[];v({id:x.id,data:{name:x.name,agentType:x.agentType,config:X(x.agentType,x.config),settings:x.settings??"",env:_,isDefault:x.isDefault}})};if(l)return n.jsx("div",{className:"p-6 text-sm text-neutral-400",children:e("加载中...")});const H=t??[];return n.jsxs("div",{className:"px-10 py-6 mx-auto w-full max-w-4xl",children:[n.jsx("input",{ref:c,type:"file",accept:".json,application/json",className:"hidden",onChange:fe}),n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsxs("div",{children:[n.jsx("h2",{className:"text-lg font-semibold text-neutral-900",children:e("Provider 配置")}),n.jsx("p",{className:"text-sm text-neutral-500 mt-1",children:e("管理 AI Agent 的连接配置和运行参数")})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsxs(E,{variant:"outline",onClick:xe,disabled:o.isPending||d.isPending,children:[n.jsx(_e,{size:14}),e("导入备份")]}),n.jsxs(E,{variant:"outline",onClick:()=>y(!0),disabled:r.isPending,children:[n.jsx(Le,{size:14}),e("导出备份")]}),n.jsxs(E,{onClick:()=>v({}),children:[n.jsx(re,{size:14,className:"mr-1"}),e("新建 Provider")]})]})]}),H.length===0?n.jsx("div",{className:"text-center py-12 text-sm text-neutral-400",children:e("暂无 Provider 配置")}):n.jsx("div",{className:"space-y-3",children:H.map(m=>{const x=m.provider,_=m.availability,I=X(x.agentType,x.config),L=Object.entries(I).filter(([A])=>A!=="cmd");return n.jsx("div",{className:"border border-neutral-200 rounded-lg p-4 hover:border-neutral-300 transition-colors",children:n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("div",{className:"flex-1",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[n.jsx("h3",{className:"text-sm font-medium text-neutral-900",children:x.name}),n.jsx(ot,{type:_.type}),x.isDefault&&n.jsx("span",{className:"px-2 py-0.5 text-xs text-blue-700 bg-blue-50 rounded",children:e("默认")}),x.builtIn&&n.jsx("span",{className:"px-2 py-0.5 text-xs text-neutral-500 bg-neutral-50 rounded",children:e("内置")})]}),n.jsx("p",{className:"text-xs text-neutral-500 mb-2",children:Z[x.agentType]??x.agentType}),L.length>0&&n.jsx("div",{className:"text-xs text-neutral-600 mb-1",children:L.map(([A,ge])=>n.jsxs("span",{className:"inline-flex items-center mr-3",children:[n.jsxs("span",{className:"font-medium",children:[e(nt[A]??A),":"]})," ",st(A,ge)]},A))}),x.settings?.trim()&&n.jsxs("div",{className:"text-xs text-neutral-600",children:[n.jsx("span",{className:"font-medium",children:e("CLI 配置:")})," ",e("已配置")]}),Object.keys(x.env).length>0&&!x.settings&&n.jsxs("div",{className:"text-xs text-neutral-600",children:[n.jsx("span",{className:"font-medium",children:e("环境变量:")})," ",Object.keys(x.env).join(", ")]})]}),n.jsxs("div",{className:"flex items-center gap-1 ml-4",children:[n.jsx("button",{onClick:()=>he(m),className:"p-2 text-neutral-400 hover:text-neutral-900 transition-colors",title:e("编辑"),children:n.jsx(Ie,{size:14})}),n.jsx("button",{onClick:()=>de(x),className:"p-2 text-neutral-400 hover:text-red-600 transition-colors",title:x.deletable===!1?e("系统内置 Provider 不可删除"):x.builtIn?e("删除自定义覆盖并恢复默认"):e("删除"),disabled:x.deletable===!1,children:n.jsx(se,{size:14})})]})]})},x.id)})}),p&&n.jsx(dt,{isOpen:!0,onClose:()=>v(null),initialData:p.data,onSave:m=>{p.id?ce(p.id,m):D(m)}}),n.jsx(Oe,{isOpen:h!==null,onClose:()=>{s.isPending||u(null)},onConfirm:ue,title:h?.builtIn?e("恢复默认 Provider"):e("删除 Provider"),description:h?.builtIn?e('确定删除 "{name}" 的自定义覆盖,并恢复系统默认配置?',{name:h?.name}):e('确定删除 "{name}"?此操作不可撤销。',{name:h?.name}),confirmText:h?.builtIn?e("恢复默认"):e("删除"),cancelText:e("取消"),variant:"danger",isLoading:s.isPending}),n.jsx(ut,{isOpen:g,onClose:J,onConfirm:me,acknowledged:b,onAcknowledgedChange:C,isLoading:r.isPending}),n.jsx(mt,{isOpen:!!j,onClose:Y,preview:j?.preview??null,backup:j?.backup??null,onConfirm:pe,isLoading:d.isPending})]})}export{Et as ProviderSettingsPage};
@@ -0,0 +1 @@
1
+ import{u as Ae,i as nt,k as it,l as ot,m as ct,n as dt,o as mt,p as ut,s as xt,r as i,j as e,t as d}from"./index-B5g4V0NU.js";import{B as u}from"./button-Bpm98eOV.js";import{C as Se}from"./confirm-dialog-CEVVvAcE.js";import{P as me,T as ue,M as pt}from"./modal-JMpuh-LG.js";import{S as B}from"./select-CINRzLiE.js";import{M as z}from"./MemberAvatar-DVw_TedB.js";import{u as bt}from"./use-providers-BihMydl0.js";import{c as M}from"./utils-CkSf8FUe.js";import{U as ht}from"./upload-vFxZxKHo.js";import{C as gt}from"./chevron-up-gnnlwvYe.js";import{C as vt}from"./chevron-down-DSKKXCi8.js";const n="/avatars/presets",ft=[{id:"developer",label:"Developer",src:`${n}/avatar-preset-01-developer.png`},{id:"architect",label:"Architect",src:`${n}/avatar-preset-02-architect.png`},{id:"tester",label:"Tester",src:`${n}/avatar-preset-03-tester.png`},{id:"devops",label:"DevOps",src:`${n}/avatar-preset-04-devops.png`},{id:"data-scientist",label:"Data scientist",src:`${n}/avatar-preset-05-data-scientist.png`},{id:"frontend",label:"Frontend",src:`${n}/avatar-preset-06-frontend.png`},{id:"backend",label:"Backend",src:`${n}/avatar-preset-07-backend.png`},{id:"security",label:"Security",src:`${n}/avatar-preset-08-security.png`},{id:"project-manager",label:"Project manager",src:`${n}/avatar-preset-09-project-manager.png`},{id:"product-manager",label:"Product manager",src:`${n}/avatar-preset-10-product-manager.png`},{id:"scrum-master",label:"Scrum master",src:`${n}/avatar-preset-11-scrum-master.png`},{id:"tech-lead",label:"Tech lead",src:`${n}/avatar-preset-12-tech-lead.png`},{id:"coordinator",label:"Coordinator",src:`${n}/avatar-preset-13-coordinator.png`},{id:"mentor",label:"Mentor",src:`${n}/avatar-preset-14-mentor.png`},{id:"reviewer",label:"Reviewer",src:`${n}/avatar-preset-15-reviewer.png`},{id:"ui-designer",label:"UI designer",src:`${n}/avatar-preset-16-ui-designer.png`},{id:"ux-researcher",label:"UX researcher",src:`${n}/avatar-preset-17-ux-researcher.png`},{id:"documenter",label:"Documenter",src:`${n}/avatar-preset-18-documenter.png`},{id:"translator",label:"Translator",src:`${n}/avatar-preset-19-translator.png`},{id:"analyst",label:"Analyst",src:`${n}/avatar-preset-20-analyst.png`},{id:"consultant",label:"Consultant",src:`${n}/avatar-preset-21-consultant.png`},{id:"creative-director",label:"Creative director",src:`${n}/avatar-preset-22-creative-director.png`},{id:"support",label:"Support",src:`${n}/avatar-preset-23-support.png`},{id:"assistant",label:"Assistant",src:`${n}/avatar-preset-24-assistant.png`},{id:"robot",label:"Robot",src:`${n}/avatar-preset-25-robot.png`}],_e="/api",jt=2*1024*1024,yt=[],Nt=[],Pt=[],Me=[{key:"readRoom",label:"读房间"},{key:"postRoomMessage",label:"发房间消息"},{key:"mentionMembers",label:"提及成员"},{key:"stopMemberWork",label:"停止成员工作"},{key:"markReadyForReview",label:"标记可审查"},{key:"readFiles",label:"读文件"},{key:"writeFiles",label:"写文件"},{key:"runCommands",label:"运行命令"},{key:"readDiff",label:"读 diff"},{key:"mergeWorkspace",label:"合并工作区"}],Fe={readRoom:!1,postRoomMessage:!1,mentionMembers:!1,stopMemberWork:!1,markReadyForReview:!1,readFiles:!1,writeFiles:!1,runCommands:!1,readDiff:!1,mergeWorkspace:!1},wt=[{value:"none",label:"无"},{value:"shared",label:"共享"},{value:"dedicated",label:"独占"}],Tt={none:"无",shared:"共享",dedicated:"独占"},It=[{value:"MENTION_ONLY",label:"仅提及"},{value:"USER_MESSAGES",label:"所有用户消息"}],kt={MENTION_ONLY:"仅提及",USER_MESSAGES:"所有用户消息"},St=[{value:"new_per_request",label:"每次新会话"},{value:"resume_last",label:"复用上次会话"}],Ct={new_per_request:"每次新会话",resume_last:"复用上次会话"};function U(){return{name:"",aliasesText:"",providerId:"",rolePrompt:"",capabilities:{...Fe},workspacePolicy:"none",triggerPolicy:"MENTION_ONLY",sessionPolicy:"new_per_request",avatar:""}}function xe(s){return{name:s.name,aliasesText:s.aliases.join(", "),providerId:s.providerId,rolePrompt:s.rolePrompt,capabilities:{...Fe,...s.capabilities},workspacePolicy:s.workspacePolicy,triggerPolicy:s.triggerPolicy,sessionPolicy:s.sessionPolicy,avatar:s.avatar??""}}function Y(){return{name:"",memberPresetIds:[]}}function pe(s){return{name:s.name,memberPresetIds:s.members?.map(o=>o.memberPresetId)??[]}}function Ce(s,o,c,m){if(c.filter(O=>O===m).length<=1)return s;const W=c.slice(0,o+1).filter(O=>O===m).length;return`${s} #${W}`}function Et(s){return Array.from(new Set(s.split(/[\n,]/).map(o=>o.trim()).filter(Boolean)))}function At(s){const o=s.trim();return o||null}function Ee(s){return Me.reduce((o,c)=>o+(s[c.key]?1:0),0)}function F(s,o){return s instanceof Error?s.message:o}function _t(s){return["image/png","image/jpeg","image/webp"].includes(s.type)}async function Mt(s){const o=new FormData;o.append("file",s);const c=await fetch(`${_e}/attachments/upload`,{method:"POST",body:o});if(!c.ok){const m=await c.json().catch(()=>({}));throw new Error(m.error||m.message||`Upload failed (${c.status})`)}return c.json()}function G({title:s,error:o,isFetching:c,onRetry:m}){const{t:S}=Ae();return e.jsx("div",{role:"alert",className:"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700",children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"font-medium",children:s}),e.jsx("div",{className:"mt-1 text-xs text-red-600",children:F(o,S("请稍后重试。"))})]}),e.jsx(u,{type:"button",size:"sm",variant:"outline",onClick:m,disabled:c,children:S(c?"加载中...":"重试")})]})})}function Wt(){const{t:s}=Ae(),{data:o,error:c,isError:m,isFetching:S,isLoading:W,refetch:O}=bt(),{data:Oe,error:be,isError:C,isFetching:he,isLoading:V,refetch:ge}=nt(),{data:Re,error:$e,isError:$,isFetching:Le,isLoading:q,refetch:De}=it(),J=ot(),K=ct(),ve=dt(),X=mt(),H=ut(),fe=xt(),[Q,je]=i.useState("presets"),[j,Z]=i.useState("edit"),[h,ee]=i.useState(null),[r,y]=i.useState(U()),[ye,R]=i.useState(!1),[N,te]=i.useState(null),[Be,se]=i.useState(!1),[Ne,Pe]=i.useState(!1),we=i.useRef(null),[P,ae]=i.useState("edit"),[g,re]=i.useState(null),[w,v]=i.useState(Y()),[Te,T]=i.useState(!1),[I,le]=i.useState(null),p=Oe??yt,f=Re??Nt,L=o??Pt,D=i.useMemo(()=>new Map(p.map(t=>[t.id,t])),[p]),ne=i.useMemo(()=>new Map(f.map(t=>[t.id,t])),[f]),Ie=i.useMemo(()=>{const t=L.map(({provider:a,availability:l})=>({value:a.id,label:a.name+(l.type==="NOT_FOUND"?s(" (不可用)"):""),disabled:l.type==="NOT_FOUND"}));return r.providerId&&!t.some(a=>a.value===r.providerId)&&t.unshift({value:r.providerId,label:`${r.providerId}${s(" (不可用)")}`,disabled:!0}),t},[r.providerId,L,s]),ie=h?D.get(h)??null:null,oe=g?ne.get(g)??null:null,ce=i.useMemo(()=>new Map(L.map(({provider:t,availability:a})=>[t.id,t.name+(a.type==="NOT_FOUND"?s(" (不可用)"):"")])),[L,s]);if(i.useEffect(()=>{if(!(V||C)&&!ye){if(j==="create"){y(U());return}if(h){const t=D.get(h);t&&y(xe(t));return}if(p.length>0){const t=p[0];ee(t.id),Z("edit"),y(xe(t));return}Z("create"),ee(null),y(U())}},[D,ye,j,p,C,V,h]),i.useEffect(()=>{if(!(q||$)&&!Te){if(P==="create"){v(Y());return}if(g){const t=ne.get(g);t&&v(pe(t));return}if(f.length>0){const t=f[0];re(t.id),ae("edit"),v(pe(t));return}ae("create"),re(null),v(Y())}},[g,ne,Te,P,f,$,q]),W||V||q)return e.jsx("div",{className:"p-6 text-sm text-neutral-400",children:s("加载中...")});const b=(t,a)=>{y(l=>({...l,[t]:a})),R(!0)},ze=(t,a)=>{y(l=>({...l,capabilities:{...l.capabilities,[t]:a}})),R(!0)},Ue=t=>{b("avatar",t),se(!1)},Ye=()=>{b("avatar","")},Ge=async t=>{const a=t.target.files?.[0];if(t.target.value="",!!a){if(!_t(a)){d.error(s("仅支持 PNG、JPG、WebP 头像。"));return}if(a.size>jt){d.error(s("头像图片不能超过 2MB。"));return}Pe(!0);try{const l=await Mt(a);b("avatar",`${_e}${l.url}`),d.success(s("头像已上传"))}catch(l){d.error(F(l,s("头像上传失败")))}finally{Pe(!1)}}},E=(t,a)=>{Z(t),ee(a?.id??null),y(a?xe(a):U()),R(!1)},We=(t,a)=>{v(l=>({...l,[t]:a})),T(!0)},A=(t,a)=>{ae(t),re(a?.id??null),v(a?pe(a):Y()),T(!1)},Ve=async()=>{const t={name:r.name.trim(),aliases:Et(r.aliasesText),providerId:r.providerId.trim(),rolePrompt:r.rolePrompt.trim(),capabilities:{...r.capabilities},workspacePolicy:r.workspacePolicy,triggerPolicy:r.triggerPolicy,sessionPolicy:r.sessionPolicy,avatar:At(r.avatar)};try{if(j==="create"||!h){const a=await J.mutateAsync(t);E("edit",a),d.success(s("已创建"))}else{const a=await K.mutateAsync({id:h,data:t});E("edit",a),d.success(s("已保存"))}}catch(a){d.error(F(a,s("保存失败")))}},qe=async()=>{if(N)try{await ve.mutateAsync(N.id),d.success(s("Deleted"));const t=p.filter(a=>a.id!==N.id);h===N.id&&(t.length>0?E("edit",t[0]):E("create",null)),te(null)}catch(t){d.error(F(t,s("删除失败")))}},Je=async()=>{const t={name:w.name.trim(),memberPresetIds:w.memberPresetIds};try{if(P==="create"||!g){const a=await X.mutateAsync(t);A("edit",a),d.success(s("已创建"))}else{const a=await H.mutateAsync({id:g,data:t});A("edit",a),d.success(s("已保存"))}}catch(a){d.error(F(a,s("保存失败")))}},Ke=async()=>{if(I)try{await fe.mutateAsync(I.id),d.success(s("Deleted"));const t=f.filter(a=>a.id!==I.id);g===I.id&&(t.length>0?A("edit",t[0]):A("create",null)),le(null)}catch(t){d.error(F(t,s("删除失败")))}},Xe=Ee(r.capabilities),He=!!r.name.trim()&&!!r.providerId.trim()&&!!r.rolePrompt.trim()&&!m&&!C&&!J.isPending&&!K.isPending,Qe=!!w.name.trim()&&!$&&!C&&!X.isPending&&!H.isPending,de=w.memberPresetIds.map(t=>D.get(t)).filter(t=>!!t),Ze=t=>{R(!1),E("edit",t)},et=()=>{R(!1),E("create",null)},tt=t=>{T(!1),A("edit",t)},st=()=>{T(!1),A("create",null)},at=t=>{v(a=>({...a,memberPresetIds:[...a.memberPresetIds,t]})),T(!0)},rt=t=>{v(a=>({...a,memberPresetIds:a.memberPresetIds.filter((l,x)=>x!==t)})),T(!0)},ke=(t,a)=>{v(l=>{const x=t+a;if(x<0||x>=l.memberPresetIds.length)return l;const _=[...l.memberPresetIds],[k]=_.splice(t,1);return _.splice(x,0,k),{...l,memberPresetIds:_}}),T(!0)};return e.jsxs("div",{className:"px-10 py-6 mx-auto w-full max-w-6xl space-y-6",children:[e.jsxs("section",{className:"space-y-1",children:[e.jsx("h2",{className:"text-lg font-semibold text-neutral-900",children:s("团队协作设置")}),e.jsx("p",{className:"text-sm text-neutral-500",children:s("管理成员预设与团队模板。")})]}),m&&e.jsx(G,{title:s("Provider 列表加载失败"),error:c,isFetching:S,onRetry:()=>{O()}}),e.jsxs("div",{className:"inline-flex rounded-md border border-neutral-200 bg-neutral-50 p-1",children:[e.jsx("button",{type:"button",onClick:()=>je("presets"),className:M("rounded-md px-3 py-1.5 text-sm transition-colors",Q==="presets"?"bg-white text-neutral-900 shadow-sm":"text-neutral-500 hover:text-neutral-900"),children:s("成员预设")}),e.jsx("button",{type:"button",onClick:()=>je("templates"),className:M("rounded-md px-3 py-1.5 text-sm transition-colors",Q==="templates"?"bg-white text-neutral-900 shadow-sm":"text-neutral-500 hover:text-neutral-900"),children:s("团队模板")})]}),Q==="presets"?e.jsxs("div",{className:"grid gap-6 lg:grid-cols-[280px_minmax(0,1fr)]",children:[e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900",children:s("成员预设")}),e.jsx("p",{className:"text-[12px] text-neutral-400",children:s("点击列表项可编辑。")})]}),e.jsxs(u,{size:"sm",variant:"outline",onClick:et,children:[e.jsx(me,{size:14}),s("新增")]})]}),C?e.jsx(G,{title:s("成员预设加载失败"),error:be,isFetching:he,onRetry:()=>{ge()}}):p.length===0?e.jsx("div",{className:"rounded-lg border border-dashed border-neutral-200 p-4 text-sm text-neutral-400",children:s("当前没有成员预设")}):e.jsx("div",{className:"space-y-2",children:p.map(t=>{const a=j==="edit"&&t.id===h,l=ce.get(t.providerId)??t.providerId,x=Ee(t.capabilities);return e.jsx("button",{type:"button",onClick:()=>Ze(t),className:M("w-full rounded-lg border px-3 py-2 text-left transition-colors",a?"border-neutral-900 bg-neutral-50":"border-neutral-200 bg-white hover:border-neutral-300 hover:bg-neutral-50"),children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(z,{name:t.name,avatar:t.avatar,className:"h-10 w-10 text-[11px]"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"truncate text-sm font-medium text-neutral-900",children:t.name}),e.jsx("div",{className:"truncate text-xs text-neutral-500",children:l})]}),e.jsxs("div",{className:"shrink-0 text-[11px] text-neutral-400",children:[x,"/10"]})]}),e.jsxs("div",{className:"mt-2 flex flex-wrap gap-1",children:[e.jsx("span",{className:"rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] text-neutral-600",children:s(Tt[t.workspacePolicy])}),e.jsx("span",{className:"rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] text-neutral-600",children:s(kt[t.triggerPolicy])}),e.jsx("span",{className:"rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] text-neutral-600",children:s(Ct[t.sessionPolicy])})]})]})]})},t.id)})})]}),e.jsxs("section",{className:"rounded-lg border border-neutral-200 bg-white p-5 space-y-5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold text-neutral-900",children:s("成员预设")}),e.jsx("p",{className:"text-xs text-neutral-400",children:j==="create"?s("创建新成员预设"):ie?.name??s("编辑成员预设")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[j==="edit"&&ie&&e.jsxs(u,{size:"sm",variant:"outline",onClick:()=>te(ie),children:[e.jsx(ue,{size:14}),s("删除")]}),e.jsx(u,{size:"sm",onClick:Ve,disabled:!He,children:J.isPending||K.isPending?s("保存中..."):s(j==="create"?"创建":"保存")})]})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"team-member-preset-name",className:"block text-[13px] font-medium text-neutral-700 mb-1",children:s("名称")}),e.jsx("input",{id:"team-member-preset-name","aria-label":s("成员预设名称"),value:r.name,onChange:t=>b("name",t.target.value),className:"w-full rounded-lg border border-neutral-200 bg-white px-3 py-2 text-sm focus:border-neutral-400 focus:outline-none"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"team-member-preset-aliases",className:"block text-[13px] font-medium text-neutral-700 mb-1",children:s("别名")}),e.jsx("input",{id:"team-member-preset-aliases","aria-label":s("成员预设别名"),value:r.aliasesText,onChange:t=>b("aliasesText",t.target.value),placeholder:s("alice, a, reviewer"),className:"w-full rounded-lg border border-neutral-200 bg-white px-3 py-2 text-sm focus:border-neutral-400 focus:outline-none"})]})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:s("Provider")}),e.jsx(B,{value:r.providerId,onChange:t=>b("providerId",t),options:Ie,disabled:m}),m?e.jsx("p",{className:"mt-1 text-[11px] text-red-500",children:s("Provider 列表加载失败,无法创建或修改成员预设。")}):Ie.length===0&&e.jsx("p",{className:"mt-1 text-[11px] text-neutral-400",children:s("暂无可用 Provider,请先在 Agent 配置中创建。")})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between gap-3",children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700",children:s("头像")}),e.jsx("button",{type:"button",onClick:Ye,disabled:!r.avatar.trim(),className:"text-[11px] font-medium text-neutral-400 transition-colors hover:text-neutral-900 disabled:cursor-not-allowed disabled:opacity-40",children:s("清除头像")})]}),e.jsxs("div",{className:"rounded-lg border border-neutral-200 bg-neutral-50 px-3 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx(z,{name:r.name||s("Agent"),avatar:r.avatar,className:"h-14 w-14 text-sm"}),e.jsxs("div",{className:"min-w-[180px] flex-1",children:[e.jsx("div",{className:"truncate text-xs font-medium text-neutral-700",children:r.avatar.trim()?r.avatar:s("默认首字母头像")}),e.jsxs("div",{className:"mt-1 flex flex-wrap gap-2",children:[e.jsx(u,{type:"button",size:"sm",variant:"outline",onClick:()=>se(!0),children:s("选择预设")}),e.jsxs(u,{type:"button",size:"sm",variant:"outline",onClick:()=>we.current?.click(),disabled:Ne,children:[e.jsx(ht,{size:14}),s(Ne?"上传中...":"上传头像")]})]})]})]}),e.jsx("input",{ref:we,type:"file",accept:"image/png,image/jpeg,image/webp",className:"hidden",onChange:Ge}),e.jsx("p",{className:"mt-2 text-[11px] text-neutral-400",children:s("支持 PNG、JPG、WebP,最大 2MB。")})]})]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"team-member-preset-role-prompt",className:"block text-[13px] font-medium text-neutral-700 mb-1",children:s("角色提示词")}),e.jsx("textarea",{id:"team-member-preset-role-prompt","aria-label":s("成员预设角色提示词"),value:r.rolePrompt,onChange:t=>b("rolePrompt",t.target.value),rows:6,className:"w-full rounded-lg border border-neutral-200 bg-white px-3 py-2 text-sm font-mono focus:border-neutral-400 focus:outline-none resize-y"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"flex items-end justify-between gap-3 mb-2",children:e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700",children:s("可用能力")}),e.jsxs("p",{className:"text-[11px] text-neutral-400",children:[Xe,"/10"]})]})}),e.jsx("div",{className:"grid gap-2 md:grid-cols-2 xl:grid-cols-3",children:Me.map(t=>e.jsxs("label",{className:"flex items-center gap-2 rounded-md border border-neutral-200 px-3 py-2 text-sm text-neutral-700",children:[e.jsx("input",{type:"checkbox",checked:r.capabilities[t.key],onChange:a=>ze(t.key,a.target.checked),className:"h-4 w-4 rounded border-neutral-300 text-neutral-900 focus:ring-neutral-400"}),e.jsx("span",{children:s(t.label)})]},t.key))})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:s("工作区策略")}),e.jsx(B,{value:r.workspacePolicy,onChange:t=>b("workspacePolicy",t),options:wt.map(t=>({value:t.value,label:s(t.label)}))})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:s("触发策略")}),e.jsx(B,{value:r.triggerPolicy,onChange:t=>b("triggerPolicy",t),options:It.map(t=>({value:t.value,label:s(t.label)}))})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700 mb-1",children:s("会话策略")}),e.jsx(B,{value:r.sessionPolicy,onChange:t=>b("sessionPolicy",t),options:St.map(t=>({value:t.value,label:s(t.label)}))})]})]})]})]}):e.jsxs("div",{className:"grid gap-6 lg:grid-cols-[280px_minmax(0,1fr)]",children:[e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-[13px] font-semibold text-neutral-900",children:s("团队模板")}),e.jsx("p",{className:"text-[12px] text-neutral-400",children:s("点击列表项可编辑。")})]}),e.jsxs(u,{size:"sm",variant:"outline",onClick:st,children:[e.jsx(me,{size:14}),s("新增")]})]}),$?e.jsx(G,{title:s("团队模板加载失败"),error:$e,isFetching:Le,onRetry:()=>{De()}}):f.length===0?e.jsx("div",{className:"rounded-lg border border-dashed border-neutral-200 p-4 text-sm text-neutral-400",children:s("当前没有团队模板")}):e.jsx("div",{className:"space-y-2",children:f.map(t=>{const a=P==="edit"&&t.id===g,l=t.members?.length??0,x=t.members?.map(k=>k.memberPresetId)??[],_=t.members?.slice(0,3).map((k,lt)=>Ce(k.memberPreset?.name??k.memberPresetId,lt,x,k.memberPresetId)).join(" · ");return e.jsx("button",{type:"button",onClick:()=>tt(t),className:M("w-full rounded-lg border px-3 py-2 text-left transition-colors",a?"border-neutral-900 bg-neutral-50":"border-neutral-200 bg-white hover:border-neutral-300 hover:bg-neutral-50"),children:e.jsx("div",{className:"flex items-start justify-between gap-3",children:e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"truncate text-sm font-medium text-neutral-900",children:t.name}),e.jsx("div",{className:"mt-1 truncate text-xs text-neutral-500",children:s("{count} 个成员",{count:l})}),_&&e.jsx("div",{className:"mt-2 truncate text-[11px] text-neutral-400",children:_})]})})},t.id)})})]}),e.jsxs("section",{className:"rounded-lg border border-neutral-200 bg-white p-5 space-y-5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold text-neutral-900",children:s("团队模板")}),e.jsx("p",{className:"text-xs text-neutral-400",children:P==="create"?s("创建新团队模板"):oe?.name??s("编辑团队模板")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[P==="edit"&&oe&&e.jsxs(u,{size:"sm",variant:"outline",onClick:()=>le(oe),children:[e.jsx(ue,{size:14}),s("删除")]}),e.jsx(u,{size:"sm",onClick:Je,disabled:!Qe,children:X.isPending||H.isPending?s("保存中..."):s(P==="create"?"创建":"保存")})]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"team-template-name",className:"block text-[13px] font-medium text-neutral-700 mb-1",children:s("名称")}),e.jsx("input",{id:"team-template-name","aria-label":s("团队模板名称"),value:w.name,onChange:t=>We("name",t.target.value),className:"w-full rounded-lg border border-neutral-200 bg-white px-3 py-2 text-sm focus:border-neutral-400 focus:outline-none"})]}),e.jsxs("div",{className:"grid gap-4 xl:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700",children:s("成员预设")}),e.jsx("p",{className:"text-[11px] text-neutral-400",children:s("选择顺序即保存顺序。")})]}),e.jsx("div",{className:"max-h-[360px] space-y-2 overflow-y-auto pr-1",children:C?e.jsx(G,{title:s("成员预设加载失败"),error:be,isFetching:he,onRetry:()=>{ge()}}):p.length===0?e.jsx("div",{className:"rounded-lg border border-dashed border-neutral-200 p-4 text-sm text-neutral-400",children:s("先创建成员预设,再配置团队模板。")}):p.map(t=>{const a=w.memberPresetIds.filter(x=>x===t.id).length,l=ce.get(t.providerId)??t.providerId;return e.jsxs("button",{type:"button",onClick:()=>at(t.id),className:M("flex w-full items-start gap-3 rounded-lg border px-3 py-2 text-left transition-colors",a>0?"border-neutral-900 bg-neutral-50":"border-neutral-200 bg-white hover:border-neutral-300 hover:bg-neutral-50"),children:[e.jsx(z,{name:t.name,avatar:t.avatar,className:"mt-0.5 h-8 w-8 text-[11px]"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-sm font-medium text-neutral-900",children:t.name}),e.jsx("div",{className:"truncate text-xs text-neutral-500",children:l})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[a>0&&e.jsxs("span",{className:"rounded-full bg-neutral-900 px-2 py-0.5 text-[11px] font-medium text-white",children:["x",a]}),e.jsx(me,{size:15,className:"text-neutral-500"})]})]},t.id)})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[13px] font-medium text-neutral-700",children:s("已选成员")}),e.jsx("p",{className:"text-[11px] text-neutral-400",children:s("上移下移后即为保存顺序。")})]}),e.jsx("div",{className:"max-h-[360px] space-y-2 overflow-y-auto pr-1",children:de.length===0?e.jsx("div",{className:"rounded-lg border border-dashed border-neutral-200 p-4 text-sm text-neutral-400",children:s("尚未选择成员预设")}):de.map((t,a)=>{const l=Ce(t.name,a,w.memberPresetIds,t.id);return e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-lg border border-neutral-200 bg-white px-3 py-2",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx(z,{name:t.name,avatar:t.avatar,className:"h-8 w-8 text-[11px]"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"truncate text-sm font-medium text-neutral-900",children:l}),e.jsx("div",{className:"truncate text-xs text-neutral-500",children:ce.get(t.providerId)??t.providerId})]})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(u,{type:"button",variant:"ghost",size:"icon-sm",onClick:()=>ke(a,-1),disabled:a===0,title:s("上移"),children:e.jsx(gt,{size:14})}),e.jsx(u,{type:"button",variant:"ghost",size:"icon-sm",onClick:()=>ke(a,1),disabled:a===de.length-1,title:s("下移"),children:e.jsx(vt,{size:14})}),e.jsx(u,{type:"button",variant:"ghost",size:"icon-sm",onClick:()=>rt(a),title:s("移除"),children:e.jsx(ue,{size:14})})]})]},`${t.id}-${a}`)})})]})]})]})]}),e.jsx(Se,{isOpen:!!N,onClose:()=>te(null),onConfirm:qe,title:s("删除"),description:N?s('确定删除 "{name}"?此操作不可撤销。',{name:N.name}):"",variant:"danger",confirmText:s("删除"),cancelText:s("取消"),isLoading:ve.isPending}),e.jsx(pt,{isOpen:Be,onClose:()=>se(!1),title:s("选择预设头像"),className:"max-w-2xl",children:e.jsx("div",{className:"grid grid-cols-4 gap-2 sm:grid-cols-5",children:ft.map(t=>{const a=r.avatar===t.src;return e.jsxs("button",{type:"button",onClick:()=>Ue(t.src),className:M("group rounded-lg border bg-white p-2 text-center transition-colors hover:border-neutral-400 hover:bg-neutral-50 focus:outline-none focus:ring-2 focus:ring-neutral-900/15",a?"border-neutral-900 ring-2 ring-neutral-900/10":"border-neutral-200"),"aria-pressed":a,"aria-label":s("选择 {name} 头像",{name:t.label}),children:[e.jsx("img",{src:t.src,alt:t.label,loading:"lazy",className:"mx-auto h-14 w-14 rounded-full object-cover sm:h-16 sm:w-16"}),e.jsx("span",{className:"mt-1 block truncate text-[10px] font-medium text-neutral-500",children:t.label})]},t.id)})})}),e.jsx(Se,{isOpen:!!I,onClose:()=>le(null),onConfirm:Ke,title:s("删除"),description:I?s('确定删除 "{name}"?此操作不可撤销。',{name:I.name}):"",variant:"danger",confirmText:s("删除"),cancelText:s("取消"),isLoading:fe.isPending})]})}export{Wt as TeamSettingsPage};
@@ -1 +1 @@
1
- import{r as a,j as p}from"./index-CHN8jahE.js";import{a as V,c as k}from"./utils-CkSf8FUe.js";const y=t=>typeof t=="boolean"?`${t}`:t===0?"0":t,b=V,E=(t,n)=>e=>{var i;if(n?.variants==null)return b(t,e?.class,e?.className);const{variants:r,defaultVariants:s}=n,u=Object.keys(r).map(o=>{const c=e?.[o],d=s?.[o];if(c===null)return null;const v=y(c)||y(d);return r[o][v]}),l=e&&Object.entries(e).reduce((o,c)=>{let[d,v]=c;return v===void 0||(o[d]=v),o},{}),f=n==null||(i=n.compoundVariants)===null||i===void 0?void 0:i.reduce((o,c)=>{let{class:d,className:v,...x}=c;return Object.entries(x).every(C=>{let[m,g]=C;return Array.isArray(g)?g.includes({...s,...l}[m]):{...s,...l}[m]===g})?[...o,d,v]:o},[]);return b(t,u,f,e?.class,e?.className)};function h(t,n){if(typeof t=="function")return t(n);t!=null&&(t.current=n)}function S(...t){return n=>{let e=!1;const i=t.map(r=>{const s=h(r,n);return!e&&typeof s=="function"&&(e=!0),s});if(e)return()=>{for(let r=0;r<i.length;r++){const s=i[r];typeof s=="function"?s():h(t[r],null)}}}}function j(t){const n=_(t),e=a.forwardRef((i,r)=>{const{children:s,...u}=i,l=a.Children.toArray(s),f=l.find(R);if(f){const o=f.props.children,c=l.map(d=>d===f?a.Children.count(o)>1?a.Children.only(null):a.isValidElement(o)?o.props.children:null:d);return p.jsx(n,{...u,ref:r,children:a.isValidElement(o)?a.cloneElement(o,void 0,c):null})}return p.jsx(n,{...u,ref:r,children:s})});return e.displayName=`${t}.Slot`,e}var z=j("Slot");function _(t){const n=a.forwardRef((e,i)=>{const{children:r,...s}=e;if(a.isValidElement(r)){const u=w(r),l=O(s,r.props);return r.type!==a.Fragment&&(l.ref=i?S(i,u):u),a.cloneElement(r,l)}return a.Children.count(r)>1?a.Children.only(null):null});return n.displayName=`${t}.SlotClone`,n}var N=Symbol("radix.slottable");function R(t){return a.isValidElement(t)&&typeof t.type=="function"&&"__radixId"in t.type&&t.type.__radixId===N}function O(t,n){const e={...n};for(const i in n){const r=t[i],s=n[i];/^on[A-Z]/.test(i)?r&&s?e[i]=(...l)=>{const f=s(...l);return r(...l),f}:r&&(e[i]=r):i==="style"?e[i]={...r,...s}:i==="className"&&(e[i]=[r,s].filter(Boolean).join(" "))}return{...t,...e}}function w(t){let n=Object.getOwnPropertyDescriptor(t.props,"ref")?.get,e=n&&"isReactWarning"in n&&n.isReactWarning;return e?t.ref:(n=Object.getOwnPropertyDescriptor(t,"ref")?.get,e=n&&"isReactWarning"in n&&n.isReactWarning,e?t.props.ref:t.props.ref||t.ref)}const P=E("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-xs":"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function I({className:t,variant:n="default",size:e="default",asChild:i=!1,...r}){const s=i?z:"button";return p.jsx(s,{"data-slot":"button","data-variant":n,"data-size":e,className:k(P({variant:n,size:e,className:t})),...r})}export{I as B};
1
+ import{r as a,j as p}from"./index-B5g4V0NU.js";import{a as V,c as k}from"./utils-CkSf8FUe.js";const y=t=>typeof t=="boolean"?`${t}`:t===0?"0":t,b=V,E=(t,n)=>e=>{var i;if(n?.variants==null)return b(t,e?.class,e?.className);const{variants:r,defaultVariants:s}=n,u=Object.keys(r).map(o=>{const c=e?.[o],d=s?.[o];if(c===null)return null;const v=y(c)||y(d);return r[o][v]}),l=e&&Object.entries(e).reduce((o,c)=>{let[d,v]=c;return v===void 0||(o[d]=v),o},{}),f=n==null||(i=n.compoundVariants)===null||i===void 0?void 0:i.reduce((o,c)=>{let{class:d,className:v,...x}=c;return Object.entries(x).every(C=>{let[m,g]=C;return Array.isArray(g)?g.includes({...s,...l}[m]):{...s,...l}[m]===g})?[...o,d,v]:o},[]);return b(t,u,f,e?.class,e?.className)};function h(t,n){if(typeof t=="function")return t(n);t!=null&&(t.current=n)}function S(...t){return n=>{let e=!1;const i=t.map(r=>{const s=h(r,n);return!e&&typeof s=="function"&&(e=!0),s});if(e)return()=>{for(let r=0;r<i.length;r++){const s=i[r];typeof s=="function"?s():h(t[r],null)}}}}function j(t){const n=_(t),e=a.forwardRef((i,r)=>{const{children:s,...u}=i,l=a.Children.toArray(s),f=l.find(R);if(f){const o=f.props.children,c=l.map(d=>d===f?a.Children.count(o)>1?a.Children.only(null):a.isValidElement(o)?o.props.children:null:d);return p.jsx(n,{...u,ref:r,children:a.isValidElement(o)?a.cloneElement(o,void 0,c):null})}return p.jsx(n,{...u,ref:r,children:s})});return e.displayName=`${t}.Slot`,e}var z=j("Slot");function _(t){const n=a.forwardRef((e,i)=>{const{children:r,...s}=e;if(a.isValidElement(r)){const u=w(r),l=O(s,r.props);return r.type!==a.Fragment&&(l.ref=i?S(i,u):u),a.cloneElement(r,l)}return a.Children.count(r)>1?a.Children.only(null):null});return n.displayName=`${t}.SlotClone`,n}var N=Symbol("radix.slottable");function R(t){return a.isValidElement(t)&&typeof t.type=="function"&&"__radixId"in t.type&&t.type.__radixId===N}function O(t,n){const e={...n};for(const i in n){const r=t[i],s=n[i];/^on[A-Z]/.test(i)?r&&s?e[i]=(...l)=>{const f=s(...l);return r(...l),f}:r&&(e[i]=r):i==="style"?e[i]={...r,...s}:i==="className"&&(e[i]=[r,s].filter(Boolean).join(" "))}return{...t,...e}}function w(t){let n=Object.getOwnPropertyDescriptor(t.props,"ref")?.get,e=n&&"isReactWarning"in n&&n.isReactWarning;return e?t.ref:(n=Object.getOwnPropertyDescriptor(t,"ref")?.get,e=n&&"isReactWarning"in n&&n.isReactWarning,e?t.props.ref:t.props.ref||t.ref)}const P=E("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-xs":"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function I({className:t,variant:n="default",size:e="default",asChild:i=!1,...r}){const s=i?z:"button";return p.jsx(s,{"data-slot":"button","data-variant":n,"data-size":e,className:k(P({variant:n,size:e,className:t})),...r})}export{I as B};
@@ -1 +1 @@
1
- import{h as o}from"./index-CHN8jahE.js";const c=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],t=o("check",c);const e=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],s=o("chevron-down",e);export{s as C,t as a};
1
+ import{h as o}from"./index-B5g4V0NU.js";const c=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],t=o("check",c);const e=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],s=o("chevron-down",e);export{s as C,t as a};
@@ -1 +1 @@
1
- import{h as o}from"./index-CHN8jahE.js";const t=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],h=o("chevron-right",t);export{h as C};
1
+ import{h as o}from"./index-B5g4V0NU.js";const t=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],h=o("chevron-right",t);export{h as C};
@@ -0,0 +1 @@
1
+ import{h as o}from"./index-B5g4V0NU.js";const e=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],n=o("chevron-up",e);export{n as C};
@@ -1 +1 @@
1
- import{h as c}from"./index-CHN8jahE.js";const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],r=c("circle-check",e);export{r as C};
1
+ import{h as c}from"./index-B5g4V0NU.js";const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],r=c("circle-check",e);export{r as C};
@@ -1,2 +1,2 @@
1
- import{L as h,Z as x,I as p,g as u}from"./mermaid-NOHMQCX5-BOSwJqP0.js";import{r as i,j as a}from"./index-CHN8jahE.js";import"./log-adapter-CeKrvZcz.js";import"./chevron-right-Cs8vYTMn.js";import"./chevron-down-CuPdBAx-.js";import"./utils-CkSf8FUe.js";var v=u("block","before:content-[counter(line)]","before:inline-block","before:[counter-increment:line]","before:w-6","before:mr-4","before:text-[13px]","before:text-right","before:text-muted-foreground/50","before:font-mono","before:select-none"),k=r=>{let e={};for(let l of r.split(";")){let o=l.indexOf(":");if(o>0){let c=l.slice(0,o).trim(),n=l.slice(o+1).trim();c&&n&&(e[c]=n)}}return e},j=i.memo(({children:r,result:e,language:l,className:o,...c})=>{let n=i.useMemo(()=>{let s={};return e.bg&&(s["--sdm-bg"]=e.bg),e.fg&&(s["--sdm-fg"]=e.fg),e.rootStyle&&Object.assign(s,k(e.rootStyle)),s},[e.bg,e.fg,e.rootStyle]);return a.jsx("pre",{className:u(o,"p-4 text-sm","bg-[var(--sdm-bg,transparent)]","dark:bg-[var(--shiki-dark-bg,var(--sdm-bg,transparent))]"),"data-language":l,"data-streamdown":"code-block-body",style:n,...c,children:a.jsx("code",{className:"[counter-increment:line_0] [counter-reset:line]",children:e.tokens.map((s,d)=>a.jsx("span",{className:v,children:s.map((t,b)=>a.jsx("span",{className:u("text-[var(--sdm-c,inherit)]","dark:text-[var(--shiki-dark,var(--sdm-c,inherit))]",t.bgColor&&"bg-[var(--sdm-tbg)]",t.bgColor&&"dark:bg-[var(--shiki-dark-bg,var(--sdm-tbg))]"),style:{...t.color?{"--sdm-c":t.color}:{},...t.bgColor?{"--sdm-tbg":t.bgColor}:{},...t.htmlStyle},...t.htmlAttrs,children:t.content},b))},d))})})},(r,e)=>r.result===e.result&&r.language===e.language&&r.className===e.className),y=({className:r,language:e,style:l,...o})=>a.jsx("div",{className:u("my-4 w-full overflow-hidden rounded-xl border border-border",r),"data-language":e,"data-streamdown":"code-block",style:{contentVisibility:"auto",containIntrinsicSize:"auto 200px",...l},...o}),N=({language:r,children:e})=>a.jsxs("div",{className:"flex items-center justify-between bg-muted/80 p-3 text-muted-foreground text-xs","data-language":r,"data-streamdown":"code-block-header",children:[a.jsx("span",{className:"ml-1 font-mono lowercase",children:r}),a.jsx("div",{className:"flex items-center gap-2",children:e})]}),w=/\n+$/,O=({code:r,language:e,className:l,children:o,...c})=>{let{shikiTheme:n}=i.useContext(h),s=x(),d=i.useMemo(()=>r.replace(w,""),[r]),t=i.useMemo(()=>({bg:"transparent",fg:"inherit",tokens:d.split(`
1
+ import{L as h,Z as x,I as p,g as u}from"./mermaid-NOHMQCX5-D5USvUiZ.js";import{r as i,j as a}from"./index-B5g4V0NU.js";import"./log-adapter-DKKM3sxS.js";import"./chevron-right-CZdDV9GU.js";import"./chevron-down-DSKKXCi8.js";import"./utils-CkSf8FUe.js";var v=u("block","before:content-[counter(line)]","before:inline-block","before:[counter-increment:line]","before:w-6","before:mr-4","before:text-[13px]","before:text-right","before:text-muted-foreground/50","before:font-mono","before:select-none"),k=r=>{let e={};for(let l of r.split(";")){let o=l.indexOf(":");if(o>0){let c=l.slice(0,o).trim(),n=l.slice(o+1).trim();c&&n&&(e[c]=n)}}return e},j=i.memo(({children:r,result:e,language:l,className:o,...c})=>{let n=i.useMemo(()=>{let s={};return e.bg&&(s["--sdm-bg"]=e.bg),e.fg&&(s["--sdm-fg"]=e.fg),e.rootStyle&&Object.assign(s,k(e.rootStyle)),s},[e.bg,e.fg,e.rootStyle]);return a.jsx("pre",{className:u(o,"p-4 text-sm","bg-[var(--sdm-bg,transparent)]","dark:bg-[var(--shiki-dark-bg,var(--sdm-bg,transparent))]"),"data-language":l,"data-streamdown":"code-block-body",style:n,...c,children:a.jsx("code",{className:"[counter-increment:line_0] [counter-reset:line]",children:e.tokens.map((s,d)=>a.jsx("span",{className:v,children:s.map((t,b)=>a.jsx("span",{className:u("text-[var(--sdm-c,inherit)]","dark:text-[var(--shiki-dark,var(--sdm-c,inherit))]",t.bgColor&&"bg-[var(--sdm-tbg)]",t.bgColor&&"dark:bg-[var(--shiki-dark-bg,var(--sdm-tbg))]"),style:{...t.color?{"--sdm-c":t.color}:{},...t.bgColor?{"--sdm-tbg":t.bgColor}:{},...t.htmlStyle},...t.htmlAttrs,children:t.content},b))},d))})})},(r,e)=>r.result===e.result&&r.language===e.language&&r.className===e.className),y=({className:r,language:e,style:l,...o})=>a.jsx("div",{className:u("my-4 w-full overflow-hidden rounded-xl border border-border",r),"data-language":e,"data-streamdown":"code-block",style:{contentVisibility:"auto",containIntrinsicSize:"auto 200px",...l},...o}),N=({language:r,children:e})=>a.jsxs("div",{className:"flex items-center justify-between bg-muted/80 p-3 text-muted-foreground text-xs","data-language":r,"data-streamdown":"code-block-header",children:[a.jsx("span",{className:"ml-1 font-mono lowercase",children:r}),a.jsx("div",{className:"flex items-center gap-2",children:e})]}),w=/\n+$/,O=({code:r,language:e,className:l,children:o,...c})=>{let{shikiTheme:n}=i.useContext(h),s=x(),d=i.useMemo(()=>r.replace(w,""),[r]),t=i.useMemo(()=>({bg:"transparent",fg:"inherit",tokens:d.split(`
2
2
  `).map(g=>[{content:g,color:"inherit",bgColor:"transparent",htmlStyle:{},offset:0}])}),[d]),[b,m]=i.useState(t);return i.useEffect(()=>{if(!s){m(t);return}let g=s.highlight({code:d,language:e,themes:n},f=>{m(f)});if(g){m(g);return}m(t)},[d,e,n,s,t]),a.jsx(p.Provider,{value:{code:r},children:a.jsxs(y,{language:e,children:[a.jsx(N,{language:e,children:o}),a.jsx(j,{className:l,language:e,result:b,...c})]})})};export{O as CodeBlock};
@@ -1 +1 @@
1
- import{h as x,u as h,j as e}from"./index-CHN8jahE.js";import{M as u}from"./modal-D_AU4URz.js";import{c as p}from"./utils-CkSf8FUe.js";const b=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],f=x("triangle-alert",b),N=({isOpen:n,onClose:a,onConfirm:l,title:i,description:d,confirmText:o="确认",cancelText:c="取消",variant:m="default",isLoading:t=!1})=>{const{t:s}=h(),r=m==="danger";return e.jsx(u,{isOpen:n,onClose:a,title:i,className:"max-w-sm",action:e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:a,disabled:t,className:"px-4 py-2 text-sm font-medium text-neutral-600 hover:text-neutral-900 transition-colors disabled:opacity-50",children:s(c)}),e.jsx("button",{onClick:l,disabled:t,className:p("px-4 py-2 text-sm font-medium rounded-lg transition-colors disabled:opacity-50",r?"bg-red-500 text-white hover:bg-red-600":"bg-neutral-900 text-white hover:bg-black"),children:s(t?"处理中...":o)})]}),children:e.jsxs("div",{className:"flex gap-4",children:[r&&e.jsx("div",{className:"shrink-0 w-10 h-10 rounded-full bg-red-50 flex items-center justify-center",children:e.jsx(f,{size:20,className:"text-red-500"})}),e.jsx("div",{className:"text-sm text-neutral-600 leading-relaxed pt-1",children:d})]})})};export{N as C,f as T};
1
+ import{h as x,u as h,j as e}from"./index-B5g4V0NU.js";import{M as u}from"./modal-JMpuh-LG.js";import{c as p}from"./utils-CkSf8FUe.js";const b=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],f=x("triangle-alert",b),N=({isOpen:n,onClose:a,onConfirm:l,title:i,description:d,confirmText:o="确认",cancelText:c="取消",variant:m="default",isLoading:t=!1})=>{const{t:s}=h(),r=m==="danger";return e.jsx(u,{isOpen:n,onClose:a,title:i,className:"max-w-sm",action:e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:a,disabled:t,className:"px-4 py-2 text-sm font-medium text-neutral-600 hover:text-neutral-900 transition-colors disabled:opacity-50",children:s(c)}),e.jsx("button",{onClick:l,disabled:t,className:p("px-4 py-2 text-sm font-medium rounded-lg transition-colors disabled:opacity-50",r?"bg-red-500 text-white hover:bg-red-600":"bg-neutral-900 text-white hover:bg-black"),children:s(t?"处理中...":o)})]}),children:e.jsxs("div",{className:"flex gap-4",children:[r&&e.jsx("div",{className:"shrink-0 w-10 h-10 rounded-full bg-red-50 flex items-center justify-center",children:e.jsx(f,{size:20,className:"text-red-500"})}),e.jsx("div",{className:"text-sm text-neutral-600 leading-relaxed pt-1",children:d})]})})};export{N as C,f as T};
@@ -0,0 +1 @@
1
+ import{h as N,d as V,e as y,f as j,q as i,g as p,u as O,r as n,j as e,F as P}from"./index-B5g4V0NU.js";import{c as x}from"./utils-CkSf8FUe.js";import{C as R}from"./chevron-right-CZdDV9GU.js";import{L as D,C as L}from"./loader-circle-GMfBClX0.js";import{a as T}from"./chevron-down-DSKKXCi8.js";const X=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}]],ie=N("file",X);const Y=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]],v=N("folder",Y);const ee=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],oe=N("rotate-ccw",ee);function ce(t){const a={};return t?.page!=null&&(a.page=String(t.page)),t?.limit!=null&&(a.limit=String(t.limit)),t?.includeArchived&&(a.includeArchived="true"),V({queryKey:i.projects.list(t),queryFn:()=>p.get("/projects",{params:a})})}function ue(t){return V({queryKey:i.projects.detail(t),queryFn:()=>p.get(`/projects/${t}`),enabled:!!t})}function de(){const t=y();return j({mutationFn:a=>p.post("/projects",a),onSuccess:()=>{t.invalidateQueries({queryKey:i.projects.all})}})}function pe(){const t=y();return j({mutationFn:({id:a,...l})=>p.put(`/projects/${a}`,l),onSuccess:(a,l)=>{t.invalidateQueries({queryKey:i.projects.all}),t.invalidateQueries({queryKey:i.projects.detail(l.id)})}})}function xe(){const t=y();return j({mutationFn:({id:a,deleteRepo:l})=>p.post(`/projects/${a}/archive`,{deleteRepo:l??!1}),onSuccess:(a,l)=>{t.invalidateQueries({queryKey:i.projects.all}),t.invalidateQueries({queryKey:i.projects.detail(l.id)}),t.invalidateQueries({queryKey:i.tasks.all}),t.invalidateQueries({queryKey:i.workspaces.all})}})}function me(){const t=y();return j({mutationFn:({id:a,repoPath:l})=>p.post(`/projects/${a}/restore`,l?{repoPath:l}:{}),onSuccess:(a,l)=>{t.invalidateQueries({queryKey:i.projects.all}),t.invalidateQueries({queryKey:i.projects.detail(l.id)}),t.invalidateQueries({queryKey:i.tasks.all}),t.invalidateQueries({queryKey:i.workspaces.all})}})}function te(t){return t.isGitRepo?"select-and-browse":"browse"}function he({value:t,onChange:a,validationMode:l="git",placeholder:_}){const{t:g}=O(),[u,A]=n.useState(""),[k,G]=n.useState([]),[C,$]=n.useState(""),[I,B]=n.useState("/"),[w,U]=n.useState([]),[M,q]=n.useState(!1),[S,K]=n.useState(null),[b,z]=n.useState(t),[E,d]=n.useState(null),[W,F]=n.useState(!1),Q=n.useRef(!1);n.useEffect(()=>{z(t)},[t]);const o=n.useCallback(async s=>{q(!0),K(null);try{const r={};s&&(r.path=s);const c=await p.get("/filesystem/browse",{params:r});A(c.current),$(c.parent),B(c.sep||"/"),G(c.dirs),c.drives&&U(c.drives)}catch(r){K(r instanceof Error?r.message:"Failed to browse directory")}finally{q(!1)}},[]);n.useEffect(()=>{Q.current||(Q.current=!0,o())},[o]);const m=n.useCallback(async s=>{if(l==="directory"){a(s),d(null);return}F(!0),d(null);try{const r=await p.get("/filesystem/validate",{params:{path:s}});r.valid?(a(s),d(null)):d(r.error??"Not a Git repository")}catch(r){d(r instanceof Error?r.message:"Validation failed")}finally{F(!1)}},[a,l]),Z=n.useCallback(s=>{te(s)==="select-and-browse"?(m(s.path),o(s.path)):(o(s.path),d(null))},[m,o]),h=I==="\\",f=n.useMemo(()=>u?u.split(/[\\/]/).filter(Boolean):[],[u]),H=n.useCallback(s=>{const r=f.slice(0,s+1);let c;h?(c=r.join("\\"),r.length===1&&/^[A-Za-z]:$/.test(r[0])&&(c+="\\")):c="/"+r.join("/"),o(c),d(null)},[f,o,h]),J=n.useCallback(s=>{if(s.key==="Enter"&&!s.nativeEvent.isComposing&&s.nativeEvent.keyCode!==229){s.preventDefault();const r=b.trim();r&&(o(r),m(r))}},[b,o,m]);return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:"text",value:b,onChange:s=>z(s.target.value),onKeyDown:J,placeholder:_??"e.g., /Users/me/projects/my-repo",className:x("w-full px-3 py-2 border rounded-lg text-sm font-mono focus:outline-none transition-colors pr-8",t?"border-emerald-300 bg-emerald-50/50 focus:border-emerald-400":"border-neutral-200 focus:border-neutral-400")}),t&&(l==="git"?e.jsx(P,{size:14,className:"absolute right-3 top-1/2 -translate-y-1/2 text-emerald-500"}):e.jsx(v,{size:14,className:"absolute right-3 top-1/2 -translate-y-1/2 text-emerald-500"}))]}),e.jsx("p",{className:"text-xs text-neutral-400",children:g(l==="git"?"Browse and select a Git repository, or type a path and press Enter":"Browse and select a directory, or type a path and press Enter")}),w.length>0&&e.jsx("div",{className:"flex items-center gap-1 flex-wrap",children:w.map(s=>e.jsx("button",{onClick:()=>{o(s),d(null)},className:x("px-2 py-0.5 rounded text-xs font-mono transition-colors border",u.toUpperCase().startsWith(s.toUpperCase())?"bg-neutral-900 text-white border-neutral-900":"border-neutral-200 text-neutral-600 hover:bg-neutral-100"),children:s.replace("\\","")},s))}),e.jsxs("div",{className:"flex items-center gap-0.5 text-xs text-neutral-500 overflow-x-auto pb-1 scrollbar-none",children:[!h&&e.jsx("button",{onClick:()=>o("/"),className:"hover:text-neutral-900 transition-colors flex-shrink-0 px-1 py-0.5 rounded hover:bg-neutral-100",children:"/"}),f.map((s,r)=>e.jsxs("span",{className:"flex items-center gap-0.5 flex-shrink-0",children:[(h?r>0:!0)&&e.jsx(R,{size:10,className:"text-neutral-300"}),e.jsx("button",{onClick:()=>H(r),className:x("px-1 py-0.5 rounded transition-colors truncate max-w-[120px]",r===f.length-1?"font-medium text-neutral-900":"hover:text-neutral-900 hover:bg-neutral-100"),children:s})]},r))]}),e.jsx("div",{className:"border border-neutral-200 rounded-lg overflow-hidden",children:e.jsx("div",{className:"max-h-[200px] overflow-y-auto",children:M?e.jsxs("div",{className:"flex items-center justify-center py-8 text-neutral-400",children:[e.jsx(D,{size:16,className:"animate-spin mr-2"}),e.jsx("span",{className:"text-xs",children:"Loading..."})]}):S?e.jsxs("div",{className:"flex items-center justify-center py-8 text-red-500 gap-2",children:[e.jsx(L,{size:14}),e.jsx("span",{className:"text-xs",children:S})]}):k.length===0?e.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 py-8 text-neutral-400",children:[e.jsx("span",{className:"text-xs",children:"No subdirectories"}),l==="directory"&&u&&e.jsxs("button",{type:"button",onClick:()=>m(u),className:x("inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-xs font-medium transition-colors",u===t?"border-emerald-200 bg-emerald-50 text-emerald-700":"border-neutral-200 bg-white text-neutral-700 hover:bg-neutral-50"),children:[e.jsx(T,{size:13}),e.jsx("span",{children:g("Select Current")})]})]}):e.jsxs("ul",{className:"divide-y divide-neutral-100",children:[u!==C&&e.jsx("li",{children:e.jsxs("button",{onClick:()=>o(C),className:"w-full flex items-center gap-2.5 px-3 py-2 text-left hover:bg-neutral-50 transition-colors group",children:[e.jsx(v,{size:14,className:"text-neutral-400 flex-shrink-0"}),e.jsx("span",{className:"text-xs text-neutral-500 group-hover:text-neutral-700",children:".."})]})}),k.map(s=>e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>Z(s),className:x("w-full flex items-center gap-2.5 px-3 py-2 text-left transition-colors group",s.path===t?"bg-emerald-50":"hover:bg-neutral-50"),children:[s.isGitRepo?e.jsx(P,{size:14,className:"text-emerald-500 flex-shrink-0"}):e.jsx(v,{size:14,className:"text-neutral-400 flex-shrink-0"}),e.jsx("span",{className:x("text-xs truncate",s.path===t?"font-medium text-emerald-700":"text-neutral-700 group-hover:text-neutral-900"),children:s.name}),s.isGitRepo&&e.jsx("span",{className:"ml-auto flex-shrink-0 text-[10px] font-medium bg-emerald-100 text-emerald-600 px-1.5 py-0.5 rounded",children:"Git"}),!s.isGitRepo&&e.jsx(R,{size:12,className:"ml-auto text-neutral-300 group-hover:text-neutral-400 flex-shrink-0"})]})},s.path))]})})}),W&&e.jsxs("div",{className:"flex items-center gap-2 text-xs text-neutral-400",children:[e.jsx(D,{size:12,className:"animate-spin"}),e.jsx("span",{children:"Validating..."})]}),E&&e.jsxs("div",{className:"flex items-center gap-2 text-xs text-red-500",children:[e.jsx(L,{size:12}),e.jsx("span",{children:E})]})]})}export{ie as F,oe as R,v as a,pe as b,xe as c,me as d,he as e,ue as f,de as g,ce as u};