@thaut/claude-ide 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (559) hide show
  1. package/bin/claude-ide.js +23 -0
  2. package/package.json +75 -4
  3. package/server/add-dirs.ts +126 -0
  4. package/server/auth.test.ts +148 -0
  5. package/server/auth.ts +235 -0
  6. package/server/bang.ts +54 -0
  7. package/server/btw-instructions.ts +19 -0
  8. package/server/btw-policy.ts +17 -0
  9. package/server/btw.ts +143 -0
  10. package/server/child-env.ts +29 -0
  11. package/server/cli-control.ts +255 -0
  12. package/server/cli-files.ts +55 -0
  13. package/server/cli-info.ts +73 -0
  14. package/server/config/account.ts +65 -0
  15. package/server/config/agents.ts +186 -0
  16. package/server/config/mcp.ts +86 -0
  17. package/server/config/memory.ts +193 -0
  18. package/server/config/paths.ts +156 -0
  19. package/server/config/plugins.ts +204 -0
  20. package/server/config/routes.ts +95 -0
  21. package/server/config/settings.ts +246 -0
  22. package/server/config.ts +46 -0
  23. package/server/db.ts +121 -0
  24. package/server/directories.test.ts +180 -0
  25. package/server/directories.ts +87 -0
  26. package/server/dist-version.ts +69 -0
  27. package/server/durable-tasks.ts +61 -0
  28. package/server/file-transfers.ts +79 -0
  29. package/server/files.test.ts +127 -0
  30. package/server/files.ts +386 -0
  31. package/server/fs-queue.ts +14 -0
  32. package/server/fsutil.ts +144 -0
  33. package/server/git.ts +86 -0
  34. package/server/goal-state.test.ts +64 -0
  35. package/server/goal-state.ts +78 -0
  36. package/server/history-pages.test.ts +619 -0
  37. package/server/history-pages.ts +513 -0
  38. package/server/http-channel-manager.ts +468 -0
  39. package/server/http-channel-pull.test.ts +314 -0
  40. package/server/http-channel-push.test.ts +364 -0
  41. package/server/http-channel-registration.test.ts +291 -0
  42. package/server/http-channel-routes.ts +73 -0
  43. package/server/http-channel-store.ts +142 -0
  44. package/server/http-channel-test-fixture.ts +103 -0
  45. package/server/ide-messages-mcp.test.ts +82 -0
  46. package/server/ide-messages-mcp.ts +47 -0
  47. package/server/idecron-mcp.ts +65 -0
  48. package/server/idecron.test.ts +79 -0
  49. package/server/idecron.ts +271 -0
  50. package/server/index.ts +336 -0
  51. package/server/live-session.test.ts +1126 -0
  52. package/server/live-session.ts +1165 -0
  53. package/server/project-routes.ts +46 -0
  54. package/server/projects.test.ts +28 -0
  55. package/server/push.ts +315 -0
  56. package/server/report-cache.ts +28 -0
  57. package/server/session-aliases.test.ts +57 -0
  58. package/server/session-aliases.ts +50 -0
  59. package/server/session-branch.ts +71 -0
  60. package/server/session-dirs.ts +189 -0
  61. package/server/session-file.test.ts +134 -0
  62. package/server/session-file.ts +113 -0
  63. package/server/session-messaging.test.ts +297 -0
  64. package/server/session-messaging.ts +165 -0
  65. package/server/sessions.ts +638 -0
  66. package/server/subagents.test.ts +43 -0
  67. package/server/subagents.ts +58 -0
  68. package/server/tool-images.test.ts +76 -0
  69. package/server/tool-images.ts +45 -0
  70. package/server/turn-changes.ts +308 -0
  71. package/server/worktree-git.ts +87 -0
  72. package/server/worktrees.ts +138 -0
  73. package/server/ws.test.ts +195 -0
  74. package/server/ws.ts +197 -0
  75. package/shared/agent-model.ts +15 -0
  76. package/shared/agent-tasks.ts +12 -0
  77. package/shared/config.ts +175 -0
  78. package/shared/directories.ts +12 -0
  79. package/shared/files.ts +51 -0
  80. package/shared/http-channels.ts +63 -0
  81. package/shared/message-window.ts +189 -0
  82. package/shared/project.ts +77 -0
  83. package/shared/protocol.ts +203 -0
  84. package/shared/task-types.ts +4 -0
  85. package/shared/todos.ts +40 -0
  86. package/shared/write-policy.ts +9 -0
  87. package/web/dist/assets/AgentView-wrTKgcJ3.js +1 -0
  88. package/web/dist/assets/AnnotationSelection-BZmNmwVW.js +7 -0
  89. package/web/dist/assets/ChangesView-G1WTzh4q.js +2 -0
  90. package/web/dist/assets/FilesView-DPgAbYt_.js +6 -0
  91. package/web/dist/assets/Form-BKTwiYyw.js +1 -0
  92. package/web/dist/assets/HomePage-Dq2apjBe.js +1 -0
  93. package/web/dist/assets/Markdown-IwP-xF29.js +67 -0
  94. package/web/dist/assets/MessageList-DD9GypSy.js +15 -0
  95. package/web/dist/assets/Modal-g2rv8I_n.js +1 -0
  96. package/web/dist/assets/NotificationSettings-DpuLO_Bv.js +1 -0
  97. package/web/dist/assets/OverviewPage-Dx6miabE.js +1 -0
  98. package/web/dist/assets/ProjectHome-CousyTLL.js +1 -0
  99. package/web/dist/assets/SessionView-CPVL7_HO.js +2 -0
  100. package/web/dist/assets/SettingsPage-D_oYSnW2.js +7 -0
  101. package/web/dist/assets/WorktreesView-C7e0HV__.js +1 -0
  102. package/web/dist/assets/abap-CLvhMVsD.js +1 -0
  103. package/web/dist/assets/actionscript-3-Cs6JJXT5.js +1 -0
  104. package/web/dist/assets/ada-X3Y2mlq2.js +1 -0
  105. package/web/dist/assets/ahk-DwADkxyd.js +1 -0
  106. package/web/dist/assets/ahk2-_6rzW9BS.js +1 -0
  107. package/web/dist/assets/andromeeda-vGVdxbeo.js +1 -0
  108. package/web/dist/assets/angular-html-Cw29lun8.js +1 -0
  109. package/web/dist/assets/angular-ts-BXz-O3SJ.js +1 -0
  110. package/web/dist/assets/apache-U0d_L8uA.js +1 -0
  111. package/web/dist/assets/apex-KFGFyKwG.js +1 -0
  112. package/web/dist/assets/apl-xBchdRhy.js +1 -0
  113. package/web/dist/assets/applescript-CCn79oCD.js +1 -0
  114. package/web/dist/assets/ara-4CJ0cIlV.js +1 -0
  115. package/web/dist/assets/asciidoc-SCjQUq34.js +1 -0
  116. package/web/dist/assets/asm-Cmm7eHzH.js +1 -0
  117. package/web/dist/assets/astro-1q6DGuN3.js +1 -0
  118. package/web/dist/assets/aurora-x-CDeNXAV0.js +1 -0
  119. package/web/dist/assets/awk-BWXHIvNe.js +1 -0
  120. package/web/dist/assets/ayu-dark-DluEY0Gj.js +1 -0
  121. package/web/dist/assets/ayu-light-C3h-C4tm.js +1 -0
  122. package/web/dist/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  123. package/web/dist/assets/ballerina-B7ZEbQpA.js +1 -0
  124. package/web/dist/assets/bat-qdxAdBWQ.js +1 -0
  125. package/web/dist/assets/beancount-C2IN4Vk8.js +1 -0
  126. package/web/dist/assets/berry-DKpUyyne.js +1 -0
  127. package/web/dist/assets/bibtex-Ci_nEsc7.js +1 -0
  128. package/web/dist/assets/bicep-CUHmPFLl.js +1 -0
  129. package/web/dist/assets/bird2-CYIUgYqB.js +1 -0
  130. package/web/dist/assets/blade-Cqdv4oZN.js +1 -0
  131. package/web/dist/assets/bsl-CVED6lJ1.js +1 -0
  132. package/web/dist/assets/c-D9gIxSfx.js +1 -0
  133. package/web/dist/assets/c3-D0apG41V.js +1 -0
  134. package/web/dist/assets/cadence-CQ2zXKGN.js +1 -0
  135. package/web/dist/assets/cairo-DRAZz75c.js +1 -0
  136. package/web/dist/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
  137. package/web/dist/assets/catppuccin-latte-CtsyrtPq.js +1 -0
  138. package/web/dist/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
  139. package/web/dist/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
  140. package/web/dist/assets/chapel-CuseGurG.js +1 -0
  141. package/web/dist/assets/clarity-CtfBBspg.js +1 -0
  142. package/web/dist/assets/clojure-DqKBuwfJ.js +1 -0
  143. package/web/dist/assets/cmake-Bj61d0ZC.js +1 -0
  144. package/web/dist/assets/cobol-Bdpj3Qoh.js +1 -0
  145. package/web/dist/assets/codeowners-C8r90Shi.js +1 -0
  146. package/web/dist/assets/codeql-oeQT6MSM.js +1 -0
  147. package/web/dist/assets/coffee-Sk8pHFjs.js +1 -0
  148. package/web/dist/assets/common-lisp-Cv5bFMCO.js +1 -0
  149. package/web/dist/assets/coq-CGaSfhwR.js +1 -0
  150. package/web/dist/assets/core-BxI4V4-T.js +12 -0
  151. package/web/dist/assets/cpp-BQfBYKx3.js +1 -0
  152. package/web/dist/assets/crystal-B3j7DoOZ.js +1 -0
  153. package/web/dist/assets/csharp-dmMxLVLW.js +1 -0
  154. package/web/dist/assets/css-DpFbYmRh.js +1 -0
  155. package/web/dist/assets/csv-Dx-8-gkx.js +1 -0
  156. package/web/dist/assets/cue-CE9AQfxI.js +1 -0
  157. package/web/dist/assets/cypher-ClKdZ_lG.js +1 -0
  158. package/web/dist/assets/d-qD-0Kul2.js +1 -0
  159. package/web/dist/assets/dark-plus-Cs2F2srj.js +1 -0
  160. package/web/dist/assets/dart-CHZY9Xhz.js +1 -0
  161. package/web/dist/assets/dax-BkyTk9wS.js +1 -0
  162. package/web/dist/assets/desktop-Dlh5hvp9.js +1 -0
  163. package/web/dist/assets/diff-woXpYk--.js +1 -0
  164. package/web/dist/assets/docker-IyjqRm3v.js +1 -0
  165. package/web/dist/assets/dotenv-CuH5my32.js +1 -0
  166. package/web/dist/assets/dracula-BHWKrbxM.js +1 -0
  167. package/web/dist/assets/dracula-soft-5eyTD99u.js +1 -0
  168. package/web/dist/assets/dream-maker-DW3nJb8Q.js +1 -0
  169. package/web/dist/assets/edge-DXQWmXTB.js +1 -0
  170. package/web/dist/assets/elixir-CrDIY2Vo.js +1 -0
  171. package/web/dist/assets/elm-BslFEg8K.js +1 -0
  172. package/web/dist/assets/emacs-lisp-DR2vtWaj.js +1 -0
  173. package/web/dist/assets/engine-javascript-DJg3-Vu2.js +141 -0
  174. package/web/dist/assets/erb-CUYhg0Ws.js +1 -0
  175. package/web/dist/assets/erlang-BXdgHVfi.js +1 -0
  176. package/web/dist/assets/everforest-dark-sB-x3p7T.js +1 -0
  177. package/web/dist/assets/everforest-light-Df2xbC6M.js +1 -0
  178. package/web/dist/assets/fennel-DQxkIbk2.js +1 -0
  179. package/web/dist/assets/fish-BJitypiv.js +1 -0
  180. package/web/dist/assets/fluent-C03EYrpw.js +1 -0
  181. package/web/dist/assets/format-DrBC7w0A.js +1 -0
  182. package/web/dist/assets/fortran-fixed-form-D6mN0kjy.js +1 -0
  183. package/web/dist/assets/fortran-free-form-CYNrtFtB.js +1 -0
  184. package/web/dist/assets/fsharp-CwoEF39o.js +1 -0
  185. package/web/dist/assets/gdresource-CZkFGo3B.js +1 -0
  186. package/web/dist/assets/gdscript-DYvRD3hg.js +1 -0
  187. package/web/dist/assets/gdshader-CBce3t8t.js +1 -0
  188. package/web/dist/assets/genie-CV2tkWYe.js +1 -0
  189. package/web/dist/assets/gherkin-DExj1W_8.js +1 -0
  190. package/web/dist/assets/git-commit-dUGrvm6Q.js +1 -0
  191. package/web/dist/assets/git-rebase-4zCRqF28.js +1 -0
  192. package/web/dist/assets/github-dark-C-LZuMrd.js +1 -0
  193. package/web/dist/assets/github-dark-default-DXG-b-1a.js +1 -0
  194. package/web/dist/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  195. package/web/dist/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  196. package/web/dist/assets/github-light-EUqPIrTm.js +1 -0
  197. package/web/dist/assets/github-light-default-BXViO-2h.js +1 -0
  198. package/web/dist/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  199. package/web/dist/assets/gleam-CSRkHgEL.js +1 -0
  200. package/web/dist/assets/glimmer-js-7adTRvH4.js +1 -0
  201. package/web/dist/assets/glimmer-ts-IdSskDYw.js +1 -0
  202. package/web/dist/assets/glsl-Qzy53KDt.js +1 -0
  203. package/web/dist/assets/gn-CAXYAgV-.js +1 -0
  204. package/web/dist/assets/gnuplot-7GGW24-e.js +1 -0
  205. package/web/dist/assets/go-rLFTqkRN.js +1 -0
  206. package/web/dist/assets/graphql-CV_puxbB.js +1 -0
  207. package/web/dist/assets/groovy-CacY0gHj.js +1 -0
  208. package/web/dist/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  209. package/web/dist/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  210. package/web/dist/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  211. package/web/dist/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  212. package/web/dist/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  213. package/web/dist/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  214. package/web/dist/assets/hack-C5GPjiLV.js +1 -0
  215. package/web/dist/assets/haml-BQ5YR1DQ.js +1 -0
  216. package/web/dist/assets/handlebars-DnhRK9A1.js +1 -0
  217. package/web/dist/assets/haskell-D8IpX4py.js +1 -0
  218. package/web/dist/assets/haxe-C8oCnwJJ.js +1 -0
  219. package/web/dist/assets/hcl-Dh228itO.js +1 -0
  220. package/web/dist/assets/highlight.worker-CY-ZeDAl.js +1 -0
  221. package/web/dist/assets/hjson-CxZEssPk.js +1 -0
  222. package/web/dist/assets/hlsl-Cvrh5tZx.js +1 -0
  223. package/web/dist/assets/horizon-CE9ld1lL.js +1 -0
  224. package/web/dist/assets/horizon-bright-DSNQnXHK.js +1 -0
  225. package/web/dist/assets/houston-CsvMBhTu.js +1 -0
  226. package/web/dist/assets/html-CmHiEKV9.js +1 -0
  227. package/web/dist/assets/html-derivative-BXE-rYIK.js +1 -0
  228. package/web/dist/assets/http-DPjjqtcL.js +1 -0
  229. package/web/dist/assets/hurl-AMBpSloO.js +1 -0
  230. package/web/dist/assets/hxml-D7Y24wKF.js +1 -0
  231. package/web/dist/assets/hy-CZbG8q4J.js +1 -0
  232. package/web/dist/assets/imba-DsUTQ-LC.js +1 -0
  233. package/web/dist/assets/index-DNPnl4sh.css +2 -0
  234. package/web/dist/assets/index-DQh72lEx.js +14 -0
  235. package/web/dist/assets/ini-B5eOa1yu.js +1 -0
  236. package/web/dist/assets/java-CEM7Tdw_.js +1 -0
  237. package/web/dist/assets/javascript-CU3PLowd.js +1 -0
  238. package/web/dist/assets/jinja-fR0x_9Xy.js +1 -0
  239. package/web/dist/assets/jison-BoKsxs5M.js +1 -0
  240. package/web/dist/assets/json-BM2FWsRB.js +1 -0
  241. package/web/dist/assets/json5-BR5RXkoi.js +1 -0
  242. package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  243. package/web/dist/assets/jsonl-CmCQp5Yx.js +1 -0
  244. package/web/dist/assets/jsonnet-CJTPZ8u_.js +1 -0
  245. package/web/dist/assets/jssm-DXw9l8Rf.js +1 -0
  246. package/web/dist/assets/jsx-B5fTecQP.js +1 -0
  247. package/web/dist/assets/julia-DGyDG39_.js +1 -0
  248. package/web/dist/assets/just-B-RyLcSR.js +1 -0
  249. package/web/dist/assets/kanagawa-dragon-Bozd7klA.js +1 -0
  250. package/web/dist/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
  251. package/web/dist/assets/kanagawa-wave-BML5mF2J.js +1 -0
  252. package/web/dist/assets/kdl-CsD5j6eV.js +1 -0
  253. package/web/dist/assets/kotlin-DhhofPvG.js +1 -0
  254. package/web/dist/assets/kusto-C7mF5XQf.js +1 -0
  255. package/web/dist/assets/langs-CciPKqaF.js +1 -0
  256. package/web/dist/assets/laserwave-C_8bwKvT.js +1 -0
  257. package/web/dist/assets/latex-CV1pQelm.js +1 -0
  258. package/web/dist/assets/lean-CewbzKMR.js +1 -0
  259. package/web/dist/assets/less-DVTAwKKz.js +1 -0
  260. package/web/dist/assets/lib-DlcVMUqT.js +1 -0
  261. package/web/dist/assets/light-plus-DVQuIRkW.js +1 -0
  262. package/web/dist/assets/liquid-9p05RSzQ.js +1 -0
  263. package/web/dist/assets/llvm-DqHOMS-s.js +1 -0
  264. package/web/dist/assets/log-BNLmms1o.js +1 -0
  265. package/web/dist/assets/logo-Cluzi2Zq.js +1 -0
  266. package/web/dist/assets/lua-CIPVh0S-.js +1 -0
  267. package/web/dist/assets/luau-VGWVLoqX.js +1 -0
  268. package/web/dist/assets/make-Dixweg8N.js +1 -0
  269. package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  270. package/web/dist/assets/marko-h2h6YUMS.js +1 -0
  271. package/web/dist/assets/material-theme-Bm3Qr25_.js +1 -0
  272. package/web/dist/assets/material-theme-darker-2IIEA8gg.js +1 -0
  273. package/web/dist/assets/material-theme-lighter-uhdI0v04.js +1 -0
  274. package/web/dist/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  275. package/web/dist/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  276. package/web/dist/assets/matlab-D7qyCx1q.js +1 -0
  277. package/web/dist/assets/mdc-yAyZMdoC.js +1 -0
  278. package/web/dist/assets/mdx-DQZ5AkYe.js +1 -0
  279. package/web/dist/assets/mermaid-BxpfTIzt.js +1 -0
  280. package/web/dist/assets/message-font-size-DoaZfwkT.js +1 -0
  281. package/web/dist/assets/min-dark-BSWPekZh.js +1 -0
  282. package/web/dist/assets/min-light-DDpmG2fV.js +1 -0
  283. package/web/dist/assets/mipsasm-BMqwQI7S.js +1 -0
  284. package/web/dist/assets/mojo-fg40_ntQ.js +1 -0
  285. package/web/dist/assets/monokai-BscAjiQZ.js +1 -0
  286. package/web/dist/assets/moonbit-D9W784E_.js +1 -0
  287. package/web/dist/assets/move-BYnGhZoM.js +1 -0
  288. package/web/dist/assets/narrat-_X_XdTYD.js +1 -0
  289. package/web/dist/assets/nextflow-BoTnSBQ_.js +1 -0
  290. package/web/dist/assets/nextflow-groovy-D7IRt6Pp.js +1 -0
  291. package/web/dist/assets/nginx-jWINucNT.js +1 -0
  292. package/web/dist/assets/night-owl-DhmEMT88.js +1 -0
  293. package/web/dist/assets/night-owl-light-eJ-hLW7d.js +1 -0
  294. package/web/dist/assets/nim-Dtt9DZ0t.js +1 -0
  295. package/web/dist/assets/nix-Cl_7024t.js +1 -0
  296. package/web/dist/assets/nord-Cb4Vim4T.js +1 -0
  297. package/web/dist/assets/nsis-CjNLYCLg.js +1 -0
  298. package/web/dist/assets/nushell--0fT3PI1.js +1 -0
  299. package/web/dist/assets/objective-c-D1A_Heim.js +1 -0
  300. package/web/dist/assets/objective-cpp-BsSzOQcm.js +1 -0
  301. package/web/dist/assets/ocaml-O90oeIOV.js +1 -0
  302. package/web/dist/assets/odin-B1RWQWA5.js +1 -0
  303. package/web/dist/assets/one-dark-pro-C6YyR8OD.js +1 -0
  304. package/web/dist/assets/one-light-D7Lr4KcI.js +1 -0
  305. package/web/dist/assets/openscad-BUDT5pXO.js +1 -0
  306. package/web/dist/assets/org-ClD5huOa.js +1 -0
  307. package/web/dist/assets/pascal-4ZHwLPI5.js +1 -0
  308. package/web/dist/assets/perl-BFegxyeJ.js +1 -0
  309. package/web/dist/assets/php-B-qOA3Y4.js +1 -0
  310. package/web/dist/assets/pkl-ot-7Btpt.js +1 -0
  311. package/web/dist/assets/plastic-DQwYfKfQ.js +1 -0
  312. package/web/dist/assets/plsql-DGHpHOYJ.js +1 -0
  313. package/web/dist/assets/po-BiJDBrnU.js +1 -0
  314. package/web/dist/assets/poimandres-DRFjx7u4.js +1 -0
  315. package/web/dist/assets/polar-C7UOKdEL.js +1 -0
  316. package/web/dist/assets/postcss-BXeXVLqQ.js +1 -0
  317. package/web/dist/assets/powerquery-DNMTfnFr.js +1 -0
  318. package/web/dist/assets/powershell-QtSnmXcu.js +1 -0
  319. package/web/dist/assets/prisma-DMgNhnYS.js +1 -0
  320. package/web/dist/assets/prolog-iXnhIJG7.js +1 -0
  321. package/web/dist/assets/proto-DB4EqR-F.js +1 -0
  322. package/web/dist/assets/pug-Cq0NBPu-.js +1 -0
  323. package/web/dist/assets/puppet-CDv2pdJW.js +1 -0
  324. package/web/dist/assets/purescript-9MfHhQsQ.js +1 -0
  325. package/web/dist/assets/python-gzcpVVnB.js +1 -0
  326. package/web/dist/assets/qml-CYUsa87k.js +1 -0
  327. package/web/dist/assets/qmldir-DCQb3MpD.js +1 -0
  328. package/web/dist/assets/qss-Fe1Jh2GI.js +1 -0
  329. package/web/dist/assets/r-4xJhgbOf.js +1 -0
  330. package/web/dist/assets/racket-DcIDlBhZ.js +1 -0
  331. package/web/dist/assets/raku-B3gFvitq.js +1 -0
  332. package/web/dist/assets/razor-BlHaOHx8.js +1 -0
  333. package/web/dist/assets/rbs-C0MpOrj4.js +1 -0
  334. package/web/dist/assets/react-B4UGpcWC.js +1 -0
  335. package/web/dist/assets/red-CYlAq2b0.js +1 -0
  336. package/web/dist/assets/reg-CRGYupPL.js +1 -0
  337. package/web/dist/assets/regexp-BUSxjv2o.js +1 -0
  338. package/web/dist/assets/rel-BtDbiS_P.js +1 -0
  339. package/web/dist/assets/riscv-Ckw8ddFX.js +1 -0
  340. package/web/dist/assets/ron-VUp2lXgN.js +1 -0
  341. package/web/dist/assets/rose-pine-aMsaMD1D.js +1 -0
  342. package/web/dist/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
  343. package/web/dist/assets/rose-pine-moon-DO-qXg-I.js +1 -0
  344. package/web/dist/assets/rosmsg-CAekHB0j.js +1 -0
  345. package/web/dist/assets/rst-zjfguEh7.js +1 -0
  346. package/web/dist/assets/ruby-4oR9waBK.js +1 -0
  347. package/web/dist/assets/rust-DpiIf5JO.js +1 -0
  348. package/web/dist/assets/sas-Do4V_2i9.js +1 -0
  349. package/web/dist/assets/sass-DXrisJhu.js +1 -0
  350. package/web/dist/assets/scala-BiFt_7mu.js +1 -0
  351. package/web/dist/assets/scheme-DQCgrYNe.js +1 -0
  352. package/web/dist/assets/scss-CW6JPtag.js +1 -0
  353. package/web/dist/assets/sdbl-bTVj8UrX.js +1 -0
  354. package/web/dist/assets/shaderlab-C4rnI7x0.js +1 -0
  355. package/web/dist/assets/shellscript-zBmOMFJh.js +1 -0
  356. package/web/dist/assets/shellsession-DxGUTWaf.js +1 -0
  357. package/web/dist/assets/slack-dark-DnToyrRv.js +1 -0
  358. package/web/dist/assets/slack-ochin-B2OO5cIa.js +1 -0
  359. package/web/dist/assets/smalltalk-BHpQb5nM.js +1 -0
  360. package/web/dist/assets/smithy-Dgaz7aur.js +1 -0
  361. package/web/dist/assets/snazzy-light-4G7pJPwS.js +1 -0
  362. package/web/dist/assets/solarized-dark-b97czJOk.js +1 -0
  363. package/web/dist/assets/solarized-light-DFPxpIYQ.js +1 -0
  364. package/web/dist/assets/solidity-Bj7E1mRn.js +1 -0
  365. package/web/dist/assets/soy-DVtw20Yn.js +1 -0
  366. package/web/dist/assets/sparql-C0ia5K60.js +1 -0
  367. package/web/dist/assets/splunk-BC2Px7Mm.js +1 -0
  368. package/web/dist/assets/sql-DGCM-jag.js +1 -0
  369. package/web/dist/assets/ssh-config-BgfXC-Er.js +1 -0
  370. package/web/dist/assets/stata-DfuMOXna.js +1 -0
  371. package/web/dist/assets/stylus-B6D30XZt.js +1 -0
  372. package/web/dist/assets/surrealql-CBoRWxfR.js +1 -0
  373. package/web/dist/assets/svelte-g_uCUem5.js +1 -0
  374. package/web/dist/assets/swift-CyEgAFGc.js +1 -0
  375. package/web/dist/assets/synthwave-84-nFMaYfgc.js +1 -0
  376. package/web/dist/assets/system-verilog-Dh5ihWbf.js +1 -0
  377. package/web/dist/assets/systemd-BxMlprV5.js +1 -0
  378. package/web/dist/assets/talonscript-CohzipZa.js +1 -0
  379. package/web/dist/assets/tasl-DMoTqEGO.js +1 -0
  380. package/web/dist/assets/tcl-CZd0xW_V.js +1 -0
  381. package/web/dist/assets/templ-N5C1hJ4Y.js +1 -0
  382. package/web/dist/assets/terraform-DswuEJGm.js +1 -0
  383. package/web/dist/assets/tex-mx6xDwuK.js +1 -0
  384. package/web/dist/assets/themes-CNElGaXw.js +1 -0
  385. package/web/dist/assets/tokyo-night-oM2G3aXe.js +1 -0
  386. package/web/dist/assets/toml-CcmNWLt0.js +1 -0
  387. package/web/dist/assets/ts-tags-C-j71FRb.js +1 -0
  388. package/web/dist/assets/tsv-sltzmVWM.js +1 -0
  389. package/web/dist/assets/tsx-z04y7qR9.js +1 -0
  390. package/web/dist/assets/turtle-ByJddavk.js +1 -0
  391. package/web/dist/assets/twig-Bz57G_nl.js +1 -0
  392. package/web/dist/assets/typescript-RMqVTmzR.js +1 -0
  393. package/web/dist/assets/typespec-BGhR2SqG.js +1 -0
  394. package/web/dist/assets/typst-BgkqA2Pg.js +1 -0
  395. package/web/dist/assets/v-DBj4K9d_.js +1 -0
  396. package/web/dist/assets/vala-zf12oZj6.js +1 -0
  397. package/web/dist/assets/vb-DOwzaHZ0.js +1 -0
  398. package/web/dist/assets/verilog-B2gwz-sJ.js +1 -0
  399. package/web/dist/assets/vesper-DdrHHSXu.js +1 -0
  400. package/web/dist/assets/vhdl-BroJfC0k.js +1 -0
  401. package/web/dist/assets/viml-DvXPmvsu.js +1 -0
  402. package/web/dist/assets/vitesse-black-fwtXNY1n.js +1 -0
  403. package/web/dist/assets/vitesse-dark-BZCL-v6S.js +1 -0
  404. package/web/dist/assets/vitesse-light-VbXTXTou.js +1 -0
  405. package/web/dist/assets/vue-CQgvQytb.js +1 -0
  406. package/web/dist/assets/vue-html-Dhl6fh9l.js +1 -0
  407. package/web/dist/assets/vue-vine-Dw_uU59K.js +1 -0
  408. package/web/dist/assets/vyper-CgoNMtux.js +1 -0
  409. package/web/dist/assets/wasm-ByWQv1Qj.js +1 -0
  410. package/web/dist/assets/wenyan-C8pVoKbM.js +1 -0
  411. package/web/dist/assets/wgsl-BsKzXJz4.js +1 -0
  412. package/web/dist/assets/wikitext-ClFFjSW2.js +1 -0
  413. package/web/dist/assets/wit-DdvCle-K.js +1 -0
  414. package/web/dist/assets/wolfram-DLL8P-h_.js +1 -0
  415. package/web/dist/assets/xml-B49klYQ3.js +1 -0
  416. package/web/dist/assets/xsl-D7tnD3qq.js +1 -0
  417. package/web/dist/assets/yaml-DNQ5_xkL.js +1 -0
  418. package/web/dist/assets/zenscript-BnlCZFoB.js +1 -0
  419. package/web/dist/assets/zig-CMLA9XwU.js +1 -0
  420. package/web/dist/icons/apple-touch-icon.png +0 -0
  421. package/web/dist/icons/badge-96.png +0 -0
  422. package/web/dist/icons/icon-192.png +0 -0
  423. package/web/dist/icons/icon-512.png +0 -0
  424. package/web/dist/icons/icon.svg +4 -0
  425. package/web/dist/icons/maskable-192.png +0 -0
  426. package/web/dist/icons/maskable-512.png +0 -0
  427. package/web/dist/index.html +30 -0
  428. package/web/dist/manifest.webmanifest +20 -0
  429. package/web/dist/sw.js +176 -0
  430. package/web/dist/version.json +1 -0
  431. package/web/src/App.tsx +97 -0
  432. package/web/src/agent-history-flow.test.ts +191 -0
  433. package/web/src/agent-history-flow.ts +58 -0
  434. package/web/src/agent-owners.ts +30 -0
  435. package/web/src/annotation-selection.test.ts +36 -0
  436. package/web/src/annotation-selection.ts +123 -0
  437. package/web/src/annotations.test.ts +279 -0
  438. package/web/src/annotations.ts +191 -0
  439. package/web/src/api.ts +27 -0
  440. package/web/src/auth-events.ts +11 -0
  441. package/web/src/auth-lifecycle.test.ts +105 -0
  442. package/web/src/clipboard.ts +32 -0
  443. package/web/src/components/ActivityNotifier.tsx +22 -0
  444. package/web/src/components/AnnotationEditor.tsx +135 -0
  445. package/web/src/components/AnnotationSelection.tsx +122 -0
  446. package/web/src/components/Automation.tsx +390 -0
  447. package/web/src/components/CodeView.tsx +121 -0
  448. package/web/src/components/Composer.tsx +552 -0
  449. package/web/src/components/ComposerAnnotations.tsx +45 -0
  450. package/web/src/components/Confirmation.tsx +91 -0
  451. package/web/src/components/CopyButton.tsx +23 -0
  452. package/web/src/components/DiffView.tsx +94 -0
  453. package/web/src/components/DirectoryPicker.tsx +230 -0
  454. package/web/src/components/FileCopyMenu.tsx +58 -0
  455. package/web/src/components/FileEntryActions.tsx +95 -0
  456. package/web/src/components/ImagePreview.tsx +68 -0
  457. package/web/src/components/Items.tsx +608 -0
  458. package/web/src/components/Markdown.tsx +73 -0
  459. package/web/src/components/MessageList.tsx +458 -0
  460. package/web/src/components/Modal.tsx +72 -0
  461. package/web/src/components/NotificationEntry.tsx +31 -0
  462. package/web/src/components/NotificationSettings.tsx +226 -0
  463. package/web/src/components/NotificationToasts.tsx +59 -0
  464. package/web/src/components/OpenTabs.tsx +112 -0
  465. package/web/src/components/Pending.tsx +175 -0
  466. package/web/src/components/ProjectExtras.tsx +299 -0
  467. package/web/src/components/ProjectNav.tsx +47 -0
  468. package/web/src/components/SessionActions.tsx +271 -0
  469. package/web/src/components/SessionChannels.tsx +288 -0
  470. package/web/src/components/SessionExtras.tsx +263 -0
  471. package/web/src/components/SettingsLink.tsx +21 -0
  472. package/web/src/components/Shell.tsx +320 -0
  473. package/web/src/components/SvgPreview.tsx +18 -0
  474. package/web/src/components/TodoPanel.tsx +37 -0
  475. package/web/src/components/VersionNotice.tsx +40 -0
  476. package/web/src/components/icons.tsx +43 -0
  477. package/web/src/diff.ts +62 -0
  478. package/web/src/drafts.test.ts +80 -0
  479. package/web/src/drafts.ts +64 -0
  480. package/web/src/format.ts +5 -0
  481. package/web/src/highlight.worker.ts +49 -0
  482. package/web/src/hooks.ts +59 -0
  483. package/web/src/item-view-state.test.ts +51 -0
  484. package/web/src/item-view-state.ts +43 -0
  485. package/web/src/live-history-flow.test.ts +77 -0
  486. package/web/src/live-merge.test.ts +64 -0
  487. package/web/src/live-merge.ts +50 -0
  488. package/web/src/live-message-hydration.test.ts +253 -0
  489. package/web/src/live.ts +404 -0
  490. package/web/src/main.tsx +27 -0
  491. package/web/src/markdown-assets.test.ts +70 -0
  492. package/web/src/markdown-assets.ts +78 -0
  493. package/web/src/markdown-html.test.ts +84 -0
  494. package/web/src/markdown-html.ts +60 -0
  495. package/web/src/markdown-svg.test.ts +37 -0
  496. package/web/src/markdown-svg.ts +42 -0
  497. package/web/src/markdown-tables.test.ts +34 -0
  498. package/web/src/markdown-tables.ts +17 -0
  499. package/web/src/message-bodies.ts +117 -0
  500. package/web/src/message-cache.test.ts +208 -0
  501. package/web/src/message-cache.ts +158 -0
  502. package/web/src/message-font-size.test.ts +41 -0
  503. package/web/src/message-font-size.ts +57 -0
  504. package/web/src/message-time.test.ts +32 -0
  505. package/web/src/message-time.ts +26 -0
  506. package/web/src/notify.ts +132 -0
  507. package/web/src/open-tabs.test.ts +69 -0
  508. package/web/src/open-tabs.ts +110 -0
  509. package/web/src/pages/AgentView.tsx +138 -0
  510. package/web/src/pages/ChangesView.tsx +193 -0
  511. package/web/src/pages/FilesView.tsx +406 -0
  512. package/web/src/pages/HomePage.tsx +96 -0
  513. package/web/src/pages/LoginPage.tsx +56 -0
  514. package/web/src/pages/OverviewPage.tsx +124 -0
  515. package/web/src/pages/ProjectHome.tsx +136 -0
  516. package/web/src/pages/SessionView.tsx +238 -0
  517. package/web/src/pages/WorktreesView.tsx +197 -0
  518. package/web/src/pages/settings/AccountPage.tsx +149 -0
  519. package/web/src/pages/settings/AgentsPage.tsx +182 -0
  520. package/web/src/pages/settings/ConfigPage.tsx +181 -0
  521. package/web/src/pages/settings/GeneralPage.tsx +27 -0
  522. package/web/src/pages/settings/HooksPage.tsx +244 -0
  523. package/web/src/pages/settings/McpPage.tsx +310 -0
  524. package/web/src/pages/settings/MemoryPage.tsx +309 -0
  525. package/web/src/pages/settings/PermissionsPage.tsx +160 -0
  526. package/web/src/pages/settings/PluginsPage.tsx +251 -0
  527. package/web/src/pages/settings/SettingsPage.tsx +141 -0
  528. package/web/src/pages/settings/SkillsPage.tsx +142 -0
  529. package/web/src/pages/settings/ui.tsx +165 -0
  530. package/web/src/preference-document.ts +133 -0
  531. package/web/src/project-actions.ts +18 -0
  532. package/web/src/project-files-state.test.ts +49 -0
  533. package/web/src/project-files-state.ts +64 -0
  534. package/web/src/project-images.ts +13 -0
  535. package/web/src/pwa.ts +33 -0
  536. package/web/src/queryClient.ts +5 -0
  537. package/web/src/reasoning-preference.test.ts +39 -0
  538. package/web/src/reasoning-preference.ts +42 -0
  539. package/web/src/session-confirmations.ts +36 -0
  540. package/web/src/stream-replay.test.ts +163 -0
  541. package/web/src/styles.css +231 -0
  542. package/web/src/tool-result-body.test.ts +115 -0
  543. package/web/src/transcript.test.ts +186 -0
  544. package/web/src/transcript.ts +583 -0
  545. package/web/src/turns.test.ts +338 -0
  546. package/web/src/turns.ts +178 -0
  547. package/web/src/ui/Button.tsx +60 -0
  548. package/web/src/ui/Controls.tsx +227 -0
  549. package/web/src/ui/Form.tsx +203 -0
  550. package/web/src/ui/MenuPopover.tsx +144 -0
  551. package/web/src/ui/Popover.tsx +147 -0
  552. package/web/src/ui/ResizablePane.tsx +110 -0
  553. package/web/src/ui/Select.tsx +150 -0
  554. package/web/src/ui/icons.tsx +270 -0
  555. package/web/src/unsaved.tsx +99 -0
  556. package/web/src/user-text.test.ts +60 -0
  557. package/web/src/user-text.ts +35 -0
  558. package/web/src/uuid.ts +12 -0
  559. package/README.md +0 -3
@@ -0,0 +1,15 @@
1
+ import{L as e,at as t,ht as n,mt as r,p as i,rt as a,vt as o,x as s}from"./Form-BKTwiYyw.js";import{S as c,b as l}from"./Modal-g2rv8I_n.js";import{t as u}from"./lib-DlcVMUqT.js";import{O as d,h as f,m as p,v as m}from"./index-DQh72lEx.js";import{t as h}from"./Markdown-IwP-xF29.js";import{i as g,r as _,t as v}from"./message-font-size-DoaZfwkT.js";import{p as y}from"./AnnotationSelection-BZmNmwVW.js";function b(e,t){let n;for(let r of e)r.taskId===t&&(!n?.runId||r.runId&&r.runId>=n.runId)&&(n=r);return n}function x(e){let t;if(e.type===`assistant`&&!e.error&&!e.aborted)t=e.message?.model;else if(e.type===`stream_event`){let n=e.event;n?.type===`message_start`&&(t=n.message?.model)}if(typeof t!=`string`)return;let n=t.trim();return n&&n!==`<synthetic>`?n:void 0}function S(e){return e===`local_agent`||e===`subagent`}function C(e,t,n){return{queryKey:[`subagents`,e,t],queryFn:n}}function w(e,t,n,r){let i=e.find(e=>e.toolUseId===t);if(i)return i;let a=n??r;return a?e.find(e=>e.agentId===a):void 0}function T(e,t,n=[]){if(S(e.type))return b(t,e.id)?.toolUseId||n.find(t=>t.agentId===e.id)?.toolUseId||void 0}function E(e,t,n,r={}){let i=new Set([e]);if(n){n.toolUseId&&i.add(n.toolUseId);for(let e of t)e.taskId===n.agentId&&i.add(e.toolUseId);for(let[e,t]of Object.entries(r))t===n.agentId&&i.add(e)}return i}function D(e,t,n=[]){for(let n=t.length-1;n>=0;n--){let r=t[n];if(r.k!==`sdk`||r.m.parent_tool_use_id!==e)continue;let i=x(r.m);if(i)return i}for(let t=n.length-1;t>=0;t--){let r=n[t];if(r.parent_tool_use_id&&r.parent_tool_use_id!==e)continue;let i=x(r);if(i)return i}}var O=o(n(),1),k=c();function A(e){return typeof e==`object`?e.key:e}function j(e,t){let n=e.length;return new Proxy(e,{get(e,r,i){if(typeof r==`string`){let i=r.charCodeAt(0);if(i>=48&&i<=57){let i=+r;if(Number.isInteger(i)&&i>=0&&i<n){let n=e[i];if(typeof n!=`object`){let r=t[i*2];n=e[i]={index:i,key:n,start:r,size:t[i*2+1],end:r+t[i*2+1],lane:0}}return n}}if(r===`length`)return n}return Reflect.get(e,r,i)}})}function M(e,t,n){let r=n.initialDeps??[],i,a=!0;function o(){let o=e();return(o.length!==r.length||o.some((e,t)=>r[t]!==e))&&(r=o,i=t(...o),n?.onChange&&!(a&&n.skipInitialOnChange)&&n.onChange(i),a=!1),i}return o.updateDeps=e=>{r=e},o}function N(e,t){if(e===void 0)throw Error(`Unexpected undefined${t?`: ${t}`:``}`);return e}var P=(e,t)=>Math.abs(e-t)<1.01,ee=(e,t,n)=>{let r;return Object.assign(function(...i){e.clearTimeout(r),r=e.setTimeout(()=>t.apply(this,i),n)},{cancel:()=>{e.clearTimeout(r)}})},F,I=()=>{if(F!==void 0)return F;if(typeof navigator>`u`)return F=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return F=!0;let e=navigator.maxTouchPoints;return F=navigator.platform===`MacIntel`&&e!==void 0&&e>0},te=e=>{let{offsetWidth:t,offsetHeight:n}=e;return{width:t,height:n}},ne=e=>{let t=new Set;return{schedule:n=>{let r=e.requestAnimationFrame(()=>{t.delete(r),n()});t.add(r)},cancel:()=>{t.forEach(t=>e.cancelAnimationFrame(t)),t.clear()}}},re=e=>e,ie=e=>{let t=e.overscan*Math.max(e.lanes??1,1),n=Math.max(e.startIndex-t,0),r=Math.min(e.endIndex+t,e.count-1)-n+1,i=Array(r);for(let e=0;e<r;e++)i[e]=n+e;return i},ae=(e,t)=>{let n=e.scrollElement;if(!n)return;let r=e.targetWindow;if(!r)return;let i=e=>{let{width:n,height:r}=e;t({width:Math.round(n),height:Math.round(r)})};if(i(te(n)),!r.ResizeObserver)return()=>{};let a=ne(r),o=new r.ResizeObserver(t=>{let r=()=>{let e=t[0];if(e?.borderBoxSize){let t=e.borderBoxSize[0];if(t){i({width:t.inlineSize,height:t.blockSize});return}}i(te(n))};e.options.useAnimationFrameWithResizeObserver?a.schedule(r):r()});return o.observe(n,{box:`border-box`}),()=>{o.unobserve(n),a.cancel()}},L={passive:!0},oe=typeof window>`u`||`onscrollend`in window,se=(e,t,n)=>{let r=e.scrollElement;if(!r)return;let i=e.targetWindow;if(!i)return;let a=e.options.useScrollendEvent&&oe,o=0,s=a?null:ee(i,()=>t(n(r),!1),e.options.isScrollingResetDelay),c=e=>()=>{o=n(r),s?.(),t(o,e)},l=c(!0),u=c(!1);return r.addEventListener(`scroll`,l,L),a&&r.addEventListener(`scrollend`,u,L),()=>{r.removeEventListener(`scroll`,l),a&&r.removeEventListener(`scrollend`,u),s?.cancel()}},ce=(e,t)=>se(e,t,t=>{let{horizontal:n,isRtl:r}=e.options;return n?t.scrollLeft*(r&&-1||1):t.scrollTop}),le=(e,t,n)=>{if(n.options.useCachedMeasurements){let t=n.indexFromElement(e),r=n.options.getItemKey(t);return n.itemSizeCache.get(r)??n.options.estimateSize(t)}if(t?.borderBoxSize){let e=t.borderBoxSize[0];if(e)return Math.round(e[n.options.horizontal?`inlineSize`:`blockSize`])}if(!t){let t=n.indexFromElement(e),r=n.options.getItemKey(t),i=n.itemSizeCache.get(r);if(i!==void 0)return i}return e[n.options.horizontal?`offsetWidth`:`offsetHeight`]},ue=(e,{adjustments:t=0,behavior:n},r)=>{var i,a;(a=(i=r.scrollElement)?.scrollTo)==null||a.call(i,{[r.options.horizontal?`left`:`top`]:e+t,behavior:n})},de=(e,t)=>e===`smooth`?t?`smoothLanded`:`smooth`:`instant`,R=e=>e?.phase===`smooth`||e?.phase===`smoothLanded`,fe=e=>e.phase===`smooth`||e.phase===`smoothFinishing`;function pe(e,t,n,r){if(t===0)return!1;let i=r(0),a=new Set,o=0;for(;o<e;){let e=n(o);if(e===i)break;a.add(e),o++}let s=e-o;if(s===0||s>=t)return!1;for(let e=0;e<s;e++)if(r(e)!==n(o+e))return!1;for(let e=s;e<t;e++)if(a.has(r(e)))return!1;return!0}var me=class{constructor(e){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._singleLaneMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this._iosDeferredAdjustment=0,this._iosTouch=null,this.pendingWrite=null,this._clampedAdjustment=null,this.elementsCache=new Map,this._resizeBatch=null,this.now=()=>{var e;return((e=this.targetWindow?.performance)?.now)?.call(e)??Date.now()},this.observer=(()=>{let e=null,t=null,n=()=>{if(e)return e;let n=this.targetWindow;if(!n||!n.ResizeObserver)return null;let i=t=ne(n);return e=new n.ResizeObserver(e=>{let t=()=>{let t={sync:!1};this._resizeBatch=t;try{e.forEach(r)}finally{this._resizeBatch=null,t.notify&&(this.notify(t.sync),this._retryClampedAdjustment())}};this.options.useAnimationFrameWithResizeObserver?i.schedule(t):t()})},r=e=>{let t=e.target,n=this.indexFromElement(t);if(t.isConnected)this.isIndexInRange(n)&&this.shouldMeasureDuringScroll(n)&&this.resizeItem(n,this.options.measureElement(t,e,this));else{this.observer.unobserve(t);for(let[e,n]of this.elementsCache)if(n===t){this.elementsCache.delete(e);break}}};return{disconnect:()=>{var r;(r=n())==null||r.disconnect(),t?.cancel(),e=null,t=null},observe:e=>n()?.observe(e,{box:`border-box`}),unobserve:e=>n()?.unobserve(e)}})(),this.range=null,this.setOptions=e=>{let t={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:re,rangeExtractor:ie,onChange:()=>{},measureElement:le,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:`data-index`,initialMeasurementsCache:[],lanes:1,anchorTo:`start`,followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:`estimate`,useCachedMeasurements:!1};for(let n in e){let r=e[n];r!==void 0&&(t[n]=r)}let n=this.options,r=null,i=null,a=!1;if(n!==void 0&&n.enabled&&t.enabled&&t.anchorTo===`end`&&this.scrollElement!==null){let e=n.count,o=t.count,s=this.getMeasurements(),c=this._singleLaneMeasurements?.items??s,l=e=>A(c[e]),u=e>0?l(0):null,d=e>0?l(e-1):null;if(o!==e||e>0&&o>0&&(t.getItemKey(0)!==u||t.getItemKey(o-1)!==d)){a=!0;let c=e>0?this.getVirtualItemForOffset(this.getScrollOffset())??s[0]:null;c&&(r=[c.key,this.getScrollOffset()-c.start]);let u=t.followOnAppend===!0?`auto`:t.followOnAppend||null;u&&o>0&&this.isAtEnd(n.scrollEndThreshold)&&(e===0||t.getItemKey(o-1)!==d)&&(o>e||pe(e,o,l,t.getItemKey))&&(i=u)}}this.options=t,a&&(this.pendingMin=0,this.itemSizeCacheVersion++);let o=null;if(r&&this.scrollOffset!==null){let[e,t]=r,n=this.getMeasurements(),{count:a,getItemKey:s}=this.options,c=0;for(;c<a&&s(c)!==e;)c++;if(c<a){let e=n[c];if(e){let n=Math.max(0,e.start+t);!i&&n!==this.scrollOffset&&(o=n-this.scrollOffset,this.scrollOffset=n)}}}i?this.pendingScrollAnchor={kind:`follow`,behavior:i}:o!==null&&(this.pendingScrollAnchor={kind:`anchor`,delta:o})},this.notify=e=>{var t,n;(n=(t=this.options).onChange)==null||n.call(t,this,e)},this.maybeNotify=M(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),e=>{this.notify(e)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(e=>e()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this.isScrolling=!1,this.scrollDirection=null,this._iosDeferredAdjustment=0,this._endIosTouch(),this._clampedAdjustment=null,this.pendingWrite=null,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{let e=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==e){if(this.cleanup(),!e){this.maybeNotify();return}if(this.scrollElement=e,this.targetWindow=this.scrollElement&&`ownerDocument`in this.scrollElement?this.scrollElement.ownerDocument.defaultView:this.scrollElement?.window??null,this.elementsCache.forEach(e=>{this.observer.observe(e)}),this.unsubs.push(this.options.observeElementRect(this,e=>{this.scrollRect=e,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(e,t)=>{if(t&&this.pendingWrite===null&&e===this.scrollOffset)return;let n=this.pendingWrite;n!==null&&Math.abs(e-n.target)<1.5?e=n.target:this.scrollState?.index!=null&&!fe(this.scrollState)&&!P(e,this.scrollState.lastTargetOffset)&&!P(e,this.getScrollStateTarget(this.scrollState))&&(this._clampedAdjustment===null||Math.abs(e-this._clampedAdjustment.maxAtWrite)>=1.5)&&(this.scrollState=null),this.pendingWrite=null,this._clampedAdjustment!==null&&Math.abs(e-this._clampedAdjustment.maxAtWrite)>=1.5&&(this._clampedAdjustment=null);let r=this.getScrollOffset();this.scrollDirection=t?r===e?this.scrollDirection:r<e?`forward`:`backward`:null,this.scrollOffset=e,this.isScrolling=t,this._flushIosDeferredIfReady(),this.scrollState&&this.scheduleScrollReconcile(),this.maybeNotify()})),`addEventListener`in this.scrollElement){let e=this.scrollElement,t=()=>{this._endIosTouch(),this._iosTouch={phase:`down`}},n=()=>{if(this._endIosTouch(),!I()||this.targetWindow==null)return;let e={phase:`tail`,timerId:this.targetWindow.setTimeout(()=>{this._iosTouch===e&&(this._iosTouch=null),this._flushIosDeferredIfReady()},150)};this._iosTouch=e};e.addEventListener(`touchstart`,t,L),e.addEventListener(`touchend`,n,L),e.addEventListener(`touchcancel`,n,L),this.unsubs.push(()=>{e.removeEventListener(`touchstart`,t),e.removeEventListener(`touchend`,n),e.removeEventListener(`touchcancel`,n),this._endIosTouch()})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}let t=this.pendingScrollAnchor;this.pendingScrollAnchor=null,t&&this.scrollElement&&this.options.enabled&&(t.kind===`anchor`?I()&&this._iosInMotion()?this._iosDeferredAdjustment+=t.delta:R(this.scrollState)&&!P(this.getScrollOffset()-t.delta,this.scrollState.lastTargetOffset)||this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0}):this.scrollToEnd({behavior:t.behavior})),this._retryClampedAdjustment()},this._retryClampedAdjustment=()=>{if(this._clampedAdjustment===null||!this.scrollElement||!this.options.enabled)return;let{target:e,maxAtWrite:t}=this._clampedAdjustment,n=this.getMaxScrollOffset();n>t+.5&&(this._clampedAdjustment=e>n+.5?{target:e,maxAtWrite:n}:null,this._scrollToOffset(e,{adjustments:void 0,behavior:void 0}))},this._iosInMotion=()=>this.isScrolling||this._iosTouch!==null,this._endIosTouch=()=>{this._iosTouch?.phase===`tail`&&this.targetWindow!=null&&this.targetWindow.clearTimeout(this._iosTouch.timerId),this._iosTouch=null},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this._iosInMotion())return;let e=this.getScrollOffset(),t=this.getMaxScrollOffset();if(e<0||e>t)return;if(this._iosDeferredAdjustment<0&&e>=t-1){this._iosDeferredAdjustment=0;return}let n=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(e,{adjustments:this.scrollAdjustments+n,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?`width`:`height`]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset==`function`?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getMeasurementOptions=M(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode,this.options.gap],(e,t,n,r,i,a,o,s)=>(this.prevLanes!==void 0&&this.prevLanes!==a&&(this.lanesChangedFlag=!0),this.prevLanes=a,this.pendingMin=null,{count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i,lanes:a,laneAssignmentMode:o,gap:s}),{key:!1}),this.isIndexInRange=e=>e>=0&&e<this.options.count,this.getMeasurements=M(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:e,paddingStart:t,scrollMargin:n,getItemKey:r,enabled:i,lanes:a,laneAssignmentMode:o,gap:s},c)=>{let l=this.itemSizeCache;if(!i)return this.measurementsCache=[],this._singleLaneMeasurements=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>e)for(let t of this.laneAssignments.keys())t>=e&&this.laneAssignments.delete(t);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this._singleLaneMeasurements=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(e=>{this.itemSizeCache.set(e.key,e.size)}));let u=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===e&&(this.lanesSettling=!1),a===1){let i=e*2,a=this._singleLaneMeasurements?.flat;if(!a||a.length<i){let e=new Float64Array(i);a&&u>0&&e.set(a.subarray(0,u*2)),a=e}let o=u===0?Array(e):this._singleLaneMeasurements.items.slice(),c;if(u===0)c=t+n;else{let e=u-1;c=a[e*2]+a[e*2+1]+s}for(let t=u;t<e;t++){let e=r(t);o[t]=e;let n=l.get(e),i=typeof n==`number`?n:this.options.estimateSize(t);a[t*2]=c,a[t*2+1]=i,c+=i+s}this._singleLaneMeasurements={flat:a,items:o};let d=j(o,a);return this.measurementsCache=d,d}let d=this.measurementsCache.slice(0,u),f=Array(a).fill(void 0),p=new Float64Array(a),m=0;for(let e=0;e<u;e++){let t=d[e];t&&(f[t.lane]===void 0&&m++,f[t.lane]=e,p[t.lane]=t.end)}for(let i=u;i<e;i++){let e=r(i),c=this.laneAssignments.get(i),u,h,g=o===`estimate`||l.has(e);if(c!==void 0&&this.options.lanes>1){u=c;let e=f[u],r=e===void 0?void 0:d[e];h=r?r.end+s:t+n}else if(m===a){let e=0,t=p[0],n=f[0];for(let r=1;r<a;r++){let i=p[r];(i<t||i===t&&f[r]<n)&&(e=r,t=i,n=f[r])}u=e,h=t+s,g&&this.laneAssignments.set(i,u)}else u=i%this.options.lanes,h=t+n,g&&this.laneAssignments.set(i,u);let _=l.get(e),v=typeof _==`number`?_:this.options.estimateSize(i),y=h+v;d[i]={index:i,start:h,size:v,end:y,key:e,lane:u},f[u]===void 0&&m++,f[u]=i,p[u]=y}return this.measurementsCache=d,d},{key:!1,debug:()=>this.options.debug}),this.calculateRange=M(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(e,t,n,r)=>e.length===0||t===0?(this.range=null,null):(this.range=_e(e,t,n,r,r===1&&this._singleLaneMeasurements!==null?this._singleLaneMeasurements.flat:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=M(()=>{let e=null,t=null,n=this.calculateRange();return n&&(e=n.startIndex,t=n.endIndex),this.maybeNotify.updateDeps([this.isScrolling,e,t]),[this.options.rangeExtractor,this.options.overscan,this.options.count,e,t,this.options.lanes]},(e,t,n,r,i,a)=>r===null||i===null?[]:e({startIndex:r,endIndex:i,overscan:t,count:n,lanes:a}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{let t=this.options.indexAttribute,n=e.getAttribute(t);return n?parseInt(n,10):(console.warn(`Missing attribute name '${t}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=e=>{if(!R(this.scrollState))return!0;let t=this.scrollState.index??this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)?.index;if(t!==void 0&&this.range){let n=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),r=Math.max(0,t-n),i=Math.min(this.options.count-1,t+n);return e>=r&&e<=i}return!0},this.measureElement=e=>{if(!e){this.elementsCache.forEach((e,t)=>{e.isConnected||(this.observer.unobserve(e),this.elementsCache.delete(t))});return}let t=this.indexFromElement(e);if(!this.isIndexInRange(t))return;let n=this.options.getItemKey(t),r=this.elementsCache.get(n);r!==e&&(r&&this.observer.unobserve(r),this.observer.observe(e),this.elementsCache.set(n,e)),e.isConnected&&(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(t)&&this.resizeItem(t,this.options.measureElement(e,void 0,this))},this.resizeItem=(e,t)=>{var n;if(!this.isIndexInRange(e))return;this._resizeBatch?.sync&&this.getMeasurements();let r,i,a,o=this._singleLaneMeasurements?.flat;if(this.options.lanes===1&&o!=null)a=this.options.getItemKey(e),i=o[e*2],r=o[e*2+1];else{let t=this.measurementsCache[e];if(!t)return;a=t.key,i=t.start,r=t.size}let s=this.itemSizeCache.get(a)??r,c=t-s;if(c!==0){let o=this.options.anchorTo===`end`&&!R(this.scrollState)&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,l=o?this.getTotalSize():0,u=this.getScrollOffset()+this.scrollAdjustments,d=this.itemSizeCache.has(a)?i+s<=u&&this.scrollDirection!==`backward`:i<u,f=!R(this.scrollState)&&(this.shouldAdjustScrollPositionOnItemSizeChange===void 0?d:this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[e]??{index:e,key:a,start:i,size:r,end:i+r,lane:0},c,this));(this.pendingMin===null||e<this.pendingMin)&&(this.pendingMin=e),this.itemSizeCache.set(a,t),this.itemSizeCacheVersion++;let p=this.getCommandWrittenOffset(),m=p!==null&&!P(p,this.getScrollOffset()+this.scrollAdjustments),h=!1;if(m||(o?h=this.applyScrollAdjustment(this.getTotalSize()-l):f&&(h=this.applyScrollAdjustment(c))),this._resizeBatch){this._resizeBatch.notify=!0,(n=this._resizeBatch).sync||(n.sync=h);return}this.notify(h),this._retryClampedAdjustment()}},this.getVirtualItems=M(()=>[this.getVirtualIndexes(),this.getMeasurements()],(e,t)=>{let n=[];for(let r=0,i=e.length;r<i;r++){let i=t[e[r]];n.push(i)}return n},{key:!1,debug:()=>this.options.debug}),this.getVirtualItemForOffset=e=>{let t=this.getMeasurements();if(t.length===0)return;let n=this._singleLaneMeasurements?.flat,r=this.options.lanes===1&&n!=null;return N(t[he(0,t.length-1,r?e=>n[e*2]:e=>N(t[e]).start,e)])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if(`scrollHeight`in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{let e=this.scrollElement.document.documentElement;return this.options.horizontal?e.scrollWidth-this.scrollElement.innerWidth:e.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(e=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=e,this.getOffsetForAlignment=(e,t,n=0)=>{if(!this.scrollElement)return 0;let r=this.getSize(),i=this.getScrollOffset();t===`auto`&&(t=e>=i+r?`end`:`start`),t===`center`?e+=(n-r)/2:t===`end`&&(e-=r);let a=this.getMaxScrollOffset();return Math.max(Math.min(a,e),0)},this.getOffsetForIndex=(e,t=`auto`)=>{e=Math.max(0,Math.min(e,this.options.count-1));let n=this.getSize(),r=this.getScrollOffset(),i=this.measurementsCache[e];if(!i)return;if(t===`auto`){if(i.end>=r+n-this.options.scrollPaddingEnd)t=`end`;else if(i.start<=r+this.options.scrollPaddingStart)t=`start`;else return[r,t]}if(t===`end`&&e===this.options.count-1){let e=this.getMaxScrollOffset(),n=e-this.options.paddingEnd+this.options.scrollPaddingEnd;return[Math.max(Math.min(n,e),0),t]}let a=t===`end`?i.end+this.options.scrollPaddingEnd:i.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(a,t,i.size),t]},this.scrollToOffset=(e,{align:t=`start`,behavior:n=`auto`}={})=>{this._startScroll({index:null,align:t},this.getOffsetForAlignment(e,t),n,`absolute`)},this.scrollToIndex=(e,{align:t=`auto`,behavior:n=`auto`}={})=>{e=Math.max(0,Math.min(e,this.options.count-1));let r=this.getOffsetForIndex(e,t);if(!r){this._iosDeferredAdjustment=0;return}let[i,a]=r;this._startScroll({index:e,align:a},i,n,`absolute`)},this.scrollBy=(e,{behavior:t=`auto`}={})=>{let n=this.getOffsetForAlignment((this.getCommandWrittenOffset()??this.getScrollOffset())+e,`start`);this._startScroll({index:null,align:`start`},n,t,`relative`)},this.scrollToEnd=({behavior:e=`auto`}={})=>{this.options.count>0?this._startScroll({index:this.options.count-1,align:`end`,toEnd:!0},Math.max(this.getMaxScrollOffset(),0),e,`absolute`):this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:e})},this.cancelScroll=()=>{this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null},this.getTotalSize=()=>{let e=this.getMeasurements(),t;if(e.length===0)t=this.options.paddingStart;else if(this.options.lanes===1){let n=e.length-1,r=this._singleLaneMeasurements?.flat;t=r==null?e[n]?.end??0:r[n*2]+r[n*2+1]}else{let n=Array(this.options.lanes).fill(null),r=e.length-1;for(;r>=0&&n.some(e=>e===null);){let t=e[r];n[t.lane]===null&&(n[t.lane]=t.end),r--}t=Math.max(...n.filter(e=>e!==null))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{let e=[];if(this.itemSizeCache.size===0)return e;let t=this.getMeasurements();for(let n of t)n&&this.itemSizeCache.has(n.key)&&e.push({index:n.index,key:n.key,start:n.start,size:n.size,end:n.end,lane:n.lane});return e},this._scrollToOffset=(e,{adjustments:t,behavior:n})=>{this.pendingWrite={target:e+(t??0),smooth:n===`smooth`,adjustments:t??this.scrollAdjustments},this.options.scrollToFn(e,{behavior:n,adjustments:t},this)},this.getCommandWrittenOffset=()=>this.scrollState!==null&&this.pendingWrite!==null&&!this.pendingWrite.smooth?this.pendingWrite.target:null,this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(e)}get scrollAdjustments(){return this.pendingWrite?.adjustments??0}applyScrollAdjustment(e,t){if(e===0)return!1;if(I()&&this._iosInMotion())return this.scrollState?.index??(this._iosDeferredAdjustment+=e),!1;{let n=this.getScrollOffset()+this.scrollAdjustments+e,r=this.scrollElement,i=r!==null&&(`scrollHeight`in r||`document`in r)?this.getMaxScrollOffset():null;return this._clampedAdjustment=i!==null&&n>i+.5?{target:n,maxAtWrite:i}:null,this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+e,behavior:t}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollOffset<0&&(this.scrollOffset=0),this.pendingWrite&&(this.pendingWrite.adjustments=0)),!0}}scheduleScrollReconcile(){this.targetWindow?this.rafId??=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}):this.scrollState=null}getScrollStateTarget(e){let t=e.toEnd?[Math.max(this.getMaxScrollOffset(),0)]:e.index==null?void 0:this.getOffsetForIndex(e.index,e.align);return t?t[0]:e.lastTargetOffset}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}this.getMeasurements();let e=this.getScrollStateTarget(this.scrollState),t=this.scrollState.index==null?1:this.options.useAnimationFrameWithResizeObserver?3:2,n=e!==this.scrollState.lastTargetOffset;if(!n&&P(e,this.getScrollOffset())){if(this.scrollState.phase===`smooth`?this.scrollState.phase=`smoothLanded`:this.scrollState.phase===`smoothFinishing`&&(this.scrollState.phase=`instant`),this.scrollState.stableFrames++,this.scrollState.stableFrames>=t){this.getScrollOffset()!==e&&this._scrollToOffset(e,{adjustments:void 0,behavior:`auto`}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,n){let t=this.getSize()||600,n=Math.abs(e-this.getScrollOffset()),r=R(this.scrollState)&&n>t;this.scrollState.lastTargetOffset=e,r?this.scrollState.phase=`smooth`:this.scrollState.phase===`smooth`?this.scrollState.phase=`smoothFinishing`:this.scrollState.phase===`smoothLanded`&&(this.scrollState.phase=`instant`),this._scrollToOffset(e,{adjustments:void 0,behavior:r?`smooth`:`auto`})}this.scheduleScrollReconcile()}_startScroll(e,t,n,r){r===`absolute`&&(this._iosDeferredAdjustment=0),this.scrollState={...e,startedAt:this.now(),lastTargetOffset:t,stableFrames:0,phase:de(n,e.index!=null&&P(t,this.getScrollOffset()))},this._scrollToOffset(t,{adjustments:void 0,behavior:n}),this.scheduleScrollReconcile()}},he=(e,t,n,r)=>{for(;e<=t;){let i=(e+t)/2|0,a=n(i);if(a<r)e=i+1;else if(a>r)t=i-1;else return i}return e>0?e-1:0};function ge(e,t,n){let r=0;for(;r<=t;){let i=(r+t)/2|0,a=e[i*2];if(a<n)r=i+1;else if(a>n)t=i-1;else return i}return r>0?r-1:0}function _e(e,t,n,r,i){let a=e.length-1;if(e.length<=r)return{startIndex:0,endIndex:a};if(r===1&&i!==null){let e=ge(i,a,n),r=e,o=n+t;for(;r<a&&i[r*2]+i[r*2+1]<o;)r++;return{startIndex:e,endIndex:r}}let o=he(0,a,t=>e[t].start,n),s=o;if(r===1)for(;s<a&&e[s].end<n+t;)s++;else if(r>1){let i=Array(r).fill(0);for(;s<a&&i.some(e=>e<n+t);){let t=e[s];i[t.lane]=t.end,s++}let c=Array(r).fill(n+t);for(;o>=0&&c.some(e=>e>=n);){let t=e[o];c[t.lane]=t.start,o--}o=Math.max(0,o-o%r),s=Math.min(a,s+(r-1-s%r))}return{startIndex:o,endIndex:s}}var z=typeof document<`u`?O.useLayoutEffect:O.useEffect;function ve({useFlushSync:e=!0,directDomUpdates:t=!1,directDomUpdatesMode:n=`transform`,...r}){let i=O.useReducer(e=>e+1,0)[1],a=O.useRef({enabled:t,mode:n,container:null,lastSize:null,lastPositions:new WeakMap,prevRange:null});a.current.enabled=t,a.current.mode=n;let o=O.useRef(!1),s=e=>{let t=a.current;if(!t.enabled||!t.container)return;let n=e.getTotalSize();if(n!==t.lastSize){t.lastSize=n;let r=e.options.horizontal?`width`:`height`;t.container.style[r]=`${n}px`}},c=(e,t,n)=>{let r=a.current,i=!!e.options.horizontal,o=t.start-e.options.scrollMargin;r.lastPositions.get(n)!==o&&(r.lastPositions.set(n,o),r.mode===`transform`?n.style.transform=i?`translate3d(${o}px, 0, 0)`:`translate3d(0, ${o}px, 0)`:n.style[i?`left`:`top`]=`${o}px`)},l=e=>{let t=a.current;if(t.enabled&&t.container){s(e);for(let t of e.getVirtualItems()){let n=e.elementsCache.get(t.key);n&&c(e,t,n)}}},u={...r,onChange:(t,n)=>{var s;let c=a.current,u=!0;if(c.enabled){l(t);let e=t.range,n=c.prevRange;u=!n||n.isScrolling!==t.isScrolling||n.startIndex!==e?.startIndex||n.endIndex!==e?.endIndex,u&&(c.prevRange=e?{startIndex:e.startIndex,endIndex:e.endIndex,isScrolling:t.isScrolling}:null)}u&&(e&&n&&!o.current?(0,k.flushSync)(i):i()),(s=r.onChange)==null||s.call(r,t,n)}},[d]=O.useState(()=>{let e=new me(u),t=e.measureElement;return e.measureElement=n=>{o.current=!0;try{t(n)}finally{o.current=!1}let r=a.current;if(n!==null&&r.enabled&&r.container){let t=e.measurementsCache[e.indexFromElement(n)];t&&c(e,t,n)}},Object.assign(e,{containerRef:t=>{let n=a.current;n.container=t,n.lastSize=null,t!==null&&l(e)}})});return d.setOptions(u),z(()=>d._didMount(),[]),z(()=>(s(d),d._willUpdate())),z(()=>{l(d)}),d}function ye(e){return ve({observeElementRect:ae,observeElementOffset:ce,scrollToFn:ue,...e})}function B(e,t,n=3){let r=e.split(`
2
+ `),i=t.split(`
3
+ `),a=[];if(r.length*i.length>4e6)return r.forEach((e,t)=>a.push({type:`-`,text:e,oldNo:t+1})),i.forEach((e,t)=>a.push({type:`+`,text:e,newNo:t+1})),a;let o=r.length,s=i.length,c=Array.from({length:o+1},()=>new Uint32Array(s+1));for(let e=o-1;e>=0;e--)for(let t=s-1;t>=0;t--)c[e][t]=r[e]===i[t]?c[e+1][t+1]+1:Math.max(c[e+1][t],c[e][t+1]);let l=0,u=0;for(;l<o||u<s;)l<o&&u<s&&r[l]===i[u]?a.push({type:` `,text:r[l],oldNo:++l,newNo:++u}):u<s&&(l>=o||c[l][u+1]>=c[l+1][u])?a.push({type:`+`,text:i[u],newNo:++u}):a.push({type:`-`,text:r[l],oldNo:++l});return be(a,n)}function be(e,t=3){let n=e.map(()=>!1);e.forEach((r,i)=>{if(r.type===`+`||r.type===`-`)for(let r=Math.max(0,i-t);r<=Math.min(e.length-1,i+t);r++)n[r]=!0});let r=[],i=0;return e.forEach((e,t)=>{n[t]||e.type===`gap`?(i&&r.push({type:`gap`,count:i}),i=0,r.push(e)):i++}),i&&r.push({type:`gap`,count:i}),r}function xe(e){let t=[];for(let n of e){t.length&&t.push({type:`gap`,count:0});let e=n.oldStart,r=n.newStart;for(let i of n.lines){let n=i[0];n===`+`?t.push({type:`+`,text:i.slice(1),newNo:r++}):n===`-`?t.push({type:`-`,text:i.slice(1),oldNo:e++}):t.push({type:` `,text:i.slice(1),oldNo:e++,newNo:r++})}}return t}function Se(e){let t=[],n=/<(asr-recognized-text|asr-warning|unheard_text)(?=[\s>])([^<>]*)>([\s\S]*?)<\/\1\s*>/g,r=0;for(let i of e.matchAll(n)){i.index>r&&t.push({kind:`text`,text:e.slice(r,i.index)});let n=i[3].replace(/^\r?\n|\r?\n$/g,``);if(i[1]===`unheard_text`){let e=/(?:^|\s)reason\s*=\s*(?:"([^"]*)"|'([^']*)')/.exec(i[2]);t.push({kind:`unheard_text`,text:n,reason:e?.[1]??e?.[2]})}else i[1]===`asr-warning`?t.push({kind:`asr-warning`,text:n}):t.push({kind:`asr-recognized-text`,text:n});r=i.index+i[0].length}return(r<e.length||!t.length)&&t.push({kind:`text`,text:e.slice(r)}),t}function Ce(e){let t=Se(e),n=t.filter(e=>e.kind===`asr-recognized-text`&&e.text.trim());return(n.length?n:t.filter(e=>e.kind===`text`)).map(e=>e.text).join(` `).replace(/\s+/g,` `).trim()}var we=class{limit;choices=new Map;revision=0;constructor(e=7500){this.limit=e}read(e,t,n=!1,r=[],i){if(e===void 0)return i??{value:t,revision:0};let a=[...r,e],o=a.flatMap(e=>this.choices.has(e)?[this.choices.get(e)]:[]),s=o[0]??i??{value:t,revision:0};for(let e of[...o,...i?[i]:[]])e.revision>s.revision&&(s=e);return(o.length||n||s.revision>0)&&this.link(a,s),s}write(e,t,n=[]){let r={value:t,revision:++this.revision};return e!==void 0&&this.link([...n,e],r),r}link(e,t){let n=new Set(e.flatMap(e=>{let n=this.choices.get(e);return n&&n!==t?[n]:[]}));if(n.size)for(let[e,r]of this.choices)n.has(r)&&this.choices.set(e,t);for(let n of e)this.choices.get(n)!==t&&(this.choices.delete(n),this.choices.set(n,t));for(;this.choices.size>this.limit;)this.choices.delete(this.choices.keys().next().value)}};function Te(){if(typeof crypto.randomUUID==`function`)return crypto.randomUUID();let e=crypto.getRandomValues(new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=[...e].map(e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}var V=r(),H=(0,O.createContext)({}),Ee=(0,O.memo)(function({item:e}){let t=e.deferred?.uuid??(e.kind===`tool`?e.result?.deferredUuid:void 0);return(0,V.jsxs)(`div`,{"data-annotation-item":e.key,children:[(0,V.jsx)(Oe,{item:e}),t&&(0,V.jsx)(De,{uuid:t})]})});function De({uuid:e}){let{loadMessage:n}=(0,O.useContext)(H),[r,i]=(0,O.useState)(!1),[a,o]=(0,O.useState)(``);return n?(0,V.jsxs)(`div`,{className:`mt-2 text-xs text-muted`,children:[(0,V.jsx)(t,{size:`sm`,disabled:r,onClick:async()=>{i(!0),o(``);try{await n(e)}catch(e){o(e.message)}finally{i(!1)}},children:r?`加载中…`:`加载完整消息`}),a&&(0,V.jsx)(`p`,{className:`mt-1 text-danger`,children:a})]}):null}function Oe({item:e}){switch(e.kind){case`user`:return(0,V.jsx)(je,{item:e});case`text`:return(0,V.jsxs)(`div`,{className:`group/text relative`,"data-testid":`assistant-text`,"data-streaming":e.streaming?`true`:void 0,children:[(0,V.jsx)(h,{text:e.text}),!e.streaming&&(0,V.jsx)(Ae,{text:e.text})]});case`thinking`:return(0,V.jsx)(K,{label:(0,V.jsx)(`span`,{className:`italic`,children:`思考过程`}),testId:`thinking`,stateKey:e.key,stateAliases:e.streamStateKey?[e.streamStateKey]:void 0,defaultOpen:g(),rememberInitial:!0,children:(0,V.jsx)(`div`,{className:`whitespace-pre-wrap px-3 py-3 text-sm text-muted md:px-4`,children:e.text})});case`tool`:return(0,V.jsx)(Be,{item:e});case`result`:return(0,V.jsxs)(`div`,{className:`flex items-center gap-3 border-t border-border pt-2 text-xs text-muted`,"data-testid":`turn-result`,children:[!e.ok&&(0,V.jsx)(`span`,{className:`text-danger`,children:e.subtype===`error_during_execution`?`已中断`:e.error||(e.subtype===`success`?`出错`:e.subtype)}),e.durationMs!==void 0&&(0,V.jsxs)(`span`,{children:[`耗时 `,(e.durationMs/1e3).toFixed(1),`s`]}),e.turnCostUsd!==void 0&&e.turnCostUsd>0&&(0,V.jsxs)(`span`,{title:`本轮花费`,"data-testid":`turn-cost`,children:[`费用 $`,e.turnCostUsd.toFixed(4)]})]});case`bash`:return(0,V.jsx)(ke,{item:e});case`local`:return(0,V.jsx)(G,{text:e.text,stateKey:e.key,children:e=>(0,V.jsx)(`pre`,{className:`overflow-x-auto whitespace-pre-wrap break-words rounded-lg border border-border bg-surface-2/60 px-3 py-2 font-mono text-xs leading-relaxed`,"data-testid":`local-output`,children:e})});case`notice`:return(0,V.jsx)(`div`,{className:`text-center text-xs ${e.tone===`error`?`text-danger`:`text-muted`}`,children:e.text})}}function ke({item:e}){return(0,V.jsxs)(`div`,{className:`overflow-hidden rounded-lg border border-border font-mono text-xs`,"data-testid":`bash-block`,"data-running":e.running?`true`:void 0,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2 bg-surface-2 px-3 py-2`,children:[(0,V.jsx)(`span`,{className:`text-accent`,children:`!`}),(0,V.jsx)(`span`,{className:`min-w-0 flex-1 whitespace-pre-wrap break-all text-text`,children:e.command}),e.running&&(0,V.jsx)(`span`,{className:`size-1.5 shrink-0 animate-pulse rounded-full bg-accent`})]}),(e.stdout||e.stderr)&&(0,V.jsx)(G,{text:(e.stdout??``)+(e.stderr?(e.stdout?`
4
+ `:``)+e.stderr:``),stateKey:e.key,children:(t,n)=>(0,V.jsxs)(`pre`,{className:`max-h-80 overflow-auto whitespace-pre-wrap break-words px-3 py-2`,"data-testid":`bash-output`,children:[e.stdout?.slice(0,n),e.stderr&&n>(e.stdout?.length??0)&&(0,V.jsxs)(`span`,{className:`text-danger`,children:[e.stdout?`
5
+ `:``,e.stderr.slice(0,n-(e.stdout?e.stdout.length+1:0))]})]})})]})}function Ae({text:e}){let[t,n]=(0,O.useState)(!1);return(0,V.jsx)(`button`,{className:`mt-1 rounded px-1.5 py-0.5 text-xs text-muted opacity-100 hover:bg-surface-2 hover:text-text md:opacity-0 md:group-hover/text:opacity-100`,"aria-label":`复制回复`,onClick:async()=>{await f(e),n(!0),setTimeout(()=>n(!1),1500)},children:t?`已复制`:`复制`})}function je({item:e}){let{userActions:t}=(0,O.useContext)(H),n=!!e.text.trim()&&!e.deferred;return(0,V.jsxs)(`div`,{className:`group`,"data-testid":`user-message`,"data-uuid":e.key,children:[(0,V.jsx)(`div`,{className:`flex justify-end`,children:(0,V.jsxs)(`div`,{className:`max-w-[85%] whitespace-pre-wrap break-words rounded-2xl bg-surface-2 px-4 py-2.5`,children:[e.scheduled&&(0,V.jsx)(`div`,{className:`mb-1 text-[10px] font-medium text-accent`,children:`IDECron`}),e.imageSrcs?.length?(0,V.jsx)(`div`,{className:`mb-1.5 flex flex-wrap justify-end gap-1.5`,children:e.imageSrcs.map((e,t)=>(0,V.jsx)(`button`,{type:`button`,onClick:()=>m(e,`图片 ${t+1}`),"aria-label":`预览图片 ${t+1}`,className:`shrink-0 cursor-zoom-in rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50`,children:(0,V.jsx)(`img`,{src:e,alt:`图片 ${t+1}`,"data-testid":`user-image`,className:`size-20 rounded-lg border border-border object-cover`})},t))}):e.images>0&&(0,V.jsxs)(`div`,{className:`mb-1 text-xs text-muted`,children:[`[`,e.images,` 张图片]`]}),(0,V.jsx)(Me,{text:e.text})]})}),(n||t)&&(0,V.jsxs)(`div`,{className:`mt-1 flex items-center justify-end gap-1`,children:[n&&(0,V.jsx)(p,{text:e.text,label:`复制消息`}),t?.(e.key)]})]})}function Me({text:t}){let n=(0,O.useMemo)(()=>Se(t),[t]);return n.every(e=>e.kind===`text`)?t:(0,V.jsx)(`div`,{className:`space-y-2`,children:n.map((t,n)=>t.kind===`text`?t.text.trim()?(0,V.jsx)(`div`,{className:`whitespace-pre-wrap`,children:t.text},n):null:(0,V.jsxs)(`div`,{className:`min-w-0 rounded-lg border px-3 py-2 ${t.kind===`asr-warning`?`border-accent/40 bg-accent/5`:t.kind===`unheard_text`?`border-dashed border-border bg-bg/60`:`border-accent/20 bg-bg/60`}`,"data-testid":t.kind,children:[(0,V.jsxs)(`div`,{className:`mb-1.5 flex flex-wrap items-center gap-x-2 gap-y-1 whitespace-normal text-xs text-muted`,children:[(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 ${t.kind===`unheard_text`?``:`text-accent`}`,children:[t.kind===`asr-warning`?(0,V.jsx)(i,{}):t.kind===`asr-recognized-text`?(0,V.jsx)(e,{}):(0,V.jsx)(a,{}),t.kind===`asr-warning`?`语音识别纠偏`:t.kind===`asr-recognized-text`?`语音输入`:`未听到的内容`]}),t.kind===`unheard_text`&&t.reason&&(0,V.jsx)(`span`,{className:`rounded bg-surface-2 px-1.5 py-0.5`,children:t.reason})]}),(0,V.jsx)(`div`,{className:`whitespace-pre-wrap ${t.kind===`unheard_text`?`text-muted`:``}`,children:t.text})]},n))})}var U=new we;function W(e,t,n=!1,r){let[i,a]=(0,O.useState)(()=>({key:e,choice:U.read(e,t,n,r)}));return[U.read(e,t,n,r,i.key===e?i.choice:void 0).value,t=>{a({key:e,choice:U.write(e,t,r)})}]}var Ne=200,Pe=2e4;function Fe(e,t=Ne,n=Pe){if(e.length<=n&&e.length<t*20)return-1;let r=-1;for(let n=0;n<t&&(r=e.indexOf(`
6
+ `,r+1),r!==-1);n++);let i=Math.min(r===-1?e.length:r,n);return i>=e.length?-1:i}function Ie(e){let t=1;for(let n=e.indexOf(`
7
+ `);n!==-1;n=e.indexOf(`
8
+ `,n+1))t++;return t}function G({text:e,stateKey:t,children:n}){let[r,i]=W(t&&`${t}:all`,!1),a=r?-1:Fe(e);return a===-1?(0,V.jsx)(V.Fragment,{children:n(e,e.length)}):(0,V.jsxs)(V.Fragment,{children:[n(e.slice(0,a),a),(0,V.jsx)(Le,{onClick:()=>i(!0),label:`显示全部(共 ${Ie(e)} 行,${Math.ceil(e.length/1024)} KB)`})]})}function Le({onClick:e,label:t}){return(0,V.jsx)(`button`,{className:`block w-full border-t border-border px-3 py-2 text-left text-xs text-accent hover:bg-surface-2`,onClick:e,"data-testid":`show-all`,children:t})}function K({label:e,children:t,testId:n,attrs:r,stateKey:i,stateAliases:a,actions:o,defaultOpen:s=!1,rememberInitial:c=!1}){let[l,u]=W(i&&`${i}:open`,s,c,a?.map(e=>`${e}:open`));return(0,V.jsxs)(`div`,{className:`min-w-0 rounded-lg border border-border bg-surface/60`,"data-testid":n,...r,children:[(0,V.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,V.jsxs)(`button`,{className:`flex min-w-0 flex-1 items-center gap-2 px-3 py-2 text-left text-sm text-muted`,onClick:()=>u(!l),"aria-expanded":l,children:[(0,V.jsx)(d,{open:l}),e]}),o&&(0,V.jsx)(`div`,{className:`shrink-0 pr-2`,children:o})]}),l&&(0,V.jsx)(`div`,{className:`min-w-0 border-t border-border`,children:t})]})}var q=e=>typeof e==`string`?e:``;function Re(){let{root:e}=(0,O.useContext)(H);return t=>e&&t.startsWith(e+`/`)?t.slice(e.length+1):t}function J(e){return e.task&&e.task.status!==`running`&&!e.result?e.task.status===`completed`?`done`:`error`:e.result?e.result.isError?`error`:`done`:`running`}function ze({status:e}){return e===`running`?(0,V.jsx)(`span`,{className:`ml-auto size-1.5 shrink-0 animate-pulse rounded-full bg-accent`,"aria-label":`运行中`}):e===`error`?(0,V.jsx)(`span`,{className:`ml-auto shrink-0 text-xs text-danger`,children:`失败`}):null}function Y({item:e,children:t}){return(0,V.jsxs)(`span`,{className:`flex min-w-0 flex-1 items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`shrink-0 font-medium text-text`,children:e.name}),(0,V.jsx)(`span`,{className:`min-w-0 truncate font-mono text-xs`,children:t}),(0,V.jsx)(ze,{status:J(e)})]})}function X(e){if(!e)return``;let t=e.content;return typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?String(e.text):``).join(`
9
+ `):JSON.stringify(t,null,2)}function Be({item:e}){let t={"data-tool":e.name,"data-status":J(e),"data-tool-id":e.id};switch(e.name){case`Bash`:return(0,V.jsx)(Ve,{item:e,attrs:t});case`Edit`:case`MultiEdit`:case`Write`:case`NotebookEdit`:return(0,V.jsx)(Ue,{item:e,attrs:t});case`Agent`:case`Task`:return(0,V.jsx)(qe,{item:e,attrs:t});case`TaskCreate`:case`TaskUpdate`:case`TodoWrite`:case`TaskList`:case`TaskGet`:return(0,V.jsx)(Je,{item:e,attrs:t});default:return(0,V.jsx)(Ze,{item:e,attrs:t})}}function Z({text:e,error:t,stateKey:n}){return e?(0,V.jsx)(G,{text:e,stateKey:n,children:e=>(0,V.jsx)(`pre`,{className:`max-h-80 overflow-auto whitespace-pre-wrap break-words px-3 py-2 font-mono text-xs leading-relaxed ${t?`text-danger`:``}`,children:e})}):null}function Ve({item:e,attrs:n}){let{backgroundTool:r}=(0,O.useContext)(H),[i,a]=W(`${e.key}:backgrounded`,!1),o=l({mutationFn:async()=>{if(!r)throw Error(`会话当前未运行`);await r(e.id)},onSuccess:()=>a(!0)}),s=!!r&&!e.result&&e.input.run_in_background!==!0&&J(e)===`running`,c=q(e.input.command),u=X(e.result);return(0,V.jsxs)(`div`,{className:`space-y-1`,children:[(0,V.jsxs)(K,{testId:`tool-call`,attrs:n,stateKey:e.key,label:(0,V.jsx)(Y,{item:e,children:q(e.input.description)||c.split(`
10
+ `)[0]}),actions:s&&(0,V.jsx)(t,{variant:`ghost`,size:`sm`,loading:o.isPending,disabled:i,title:`命令继续在后台运行,让 agent 继续执行`,"data-testid":`bash-background`,onClick:()=>o.mutate(),children:i?`已转后台`:`转后台`}),children:[(0,V.jsxs)(`pre`,{className:`overflow-x-auto whitespace-pre-wrap break-words bg-surface-2/60 px-3 py-2 font-mono text-xs`,"data-testid":`bash-command`,children:[(0,V.jsx)(`span`,{className:`select-none text-muted`,children:`$ `}),c]}),(0,V.jsx)(`div`,{"data-testid":`bash-output`,children:(0,V.jsx)(Z,{text:u,error:e.result?.isError,stateKey:e.key})})]}),o.isError&&!e.result&&(0,V.jsx)(`p`,{role:`alert`,className:`px-3 text-xs text-danger`,children:o.error.message})]})}function He(e){let t=e.result?.structured;if(t?.structuredPatch?.length)return xe(t.structuredPatch);let n=e.input;return e.name===`Write`?be(q(n.content).split(`
11
+ `).map((e,t)=>({type:`+`,text:e,newNo:t+1})),1e9):e.name===`MultiEdit`&&Array.isArray(n.edits)?n.edits.flatMap((e,t)=>[...t?[{type:`gap`,count:0}]:[],...B(e.old_string??``,e.new_string??``)]):B(q(n.old_string),q(n.new_string))}function Ue({item:e,attrs:t}){let n=Re(),r=He(e),i=r.filter(e=>e.type===`+`).length,a=r.filter(e=>e.type===`-`).length;return(0,V.jsx)(K,{testId:`tool-call`,attrs:t,stateKey:e.key,label:(0,V.jsxs)(Y,{item:e,children:[n(q(e.input.file_path)||q(e.input.notebook_path)),(0,V.jsxs)(`span`,{className:`ml-2 text-ok`,children:[`+`,i]}),` `,(0,V.jsxs)(`span`,{className:`text-danger`,children:[`-`,a]})]}),children:e.result?.isError?(0,V.jsx)(Z,{text:X(e.result),error:!0}):(0,V.jsx)(Ge,{rows:r,stateKey:e.key})})}var We=300;function Ge({rows:e,stateKey:t}){let[n,r]=W(t&&`${t}:all`,!1),i=n||e.length<=We?e:e.slice(0,We);return(0,V.jsxs)(`div`,{className:`max-h-[28rem] overflow-auto font-mono text-xs leading-relaxed`,"data-testid":`diff`,children:[(0,V.jsx)(`table`,{className:`w-full border-collapse`,children:(0,V.jsx)(`tbody`,{children:i.map((e,t)=>e.type===`gap`?(0,V.jsx)(`tr`,{className:`bg-surface-2/50 text-muted`,children:(0,V.jsx)(`td`,{colSpan:3,className:`px-3 py-0.5 text-center`,children:e.count?`… ${e.count} 行未改动`:`⋯`})},t):(0,V.jsxs)(`tr`,{className:e.type===`+`?`bg-ok/10`:e.type===`-`?`bg-danger/10`:``,"data-diff":e.type===`+`?`add`:e.type===`-`?`del`:`ctx`,children:[(0,V.jsx)(`td`,{className:`w-10 select-none px-2 text-right align-top text-muted/70`,children:e.type===`+`?e.newNo:e.oldNo}),(0,V.jsx)(`td`,{className:`w-4 select-none align-top ${e.type===`+`?`text-ok`:e.type===`-`?`text-danger`:`text-muted`}`,children:e.type===` `?``:e.type}),(0,V.jsx)(`td`,{className:`whitespace-pre-wrap break-all pr-3`,children:e.text||` `})]},t))})}),i.length<e.length&&(0,V.jsx)(Le,{onClick:()=>r(!0),label:`显示全部(共 ${e.length} 行)`})]})}function Ke(e){let t=e,n=t.indexOf(`The report follows:
12
+ `);if(t.startsWith(`[Subagent hand-back]`)&&n!==-1){let e=t.slice(n+20).split(`
13
+ `),r=[];for(let t of e)if(t.startsWith(` `)||t===``)r.push(t.slice(2));else break;t=r.join(`
14
+ `)}return t.replace(/\nagentId: [\s\S]*$/,``).trim()}function qe({item:e,attrs:t}){let{sessionUrl:n}=(0,O.useContext)(H),r=J(e),i=e.task,a=q(e.input.description)||i?.description||`子 agent`,o=q(e.input.subagent_type)||i?.subagentType,s=e.result?Ke(X(e.result)):``,c=s.startsWith(`Async agent launched`);return(0,V.jsxs)(K,{testId:`tool-call`,attrs:{...t,"data-agent":`true`},stateKey:e.key,label:(0,V.jsxs)(`span`,{className:`flex min-w-0 flex-1 items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`shrink-0 rounded bg-accent/15 px-1.5 py-0.5 text-xs font-medium text-accent`,children:`子 agent`}),(0,V.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-medium`,children:a}),o&&(0,V.jsx)(`span`,{className:`hidden shrink-0 text-xs text-muted sm:inline`,children:o}),(0,V.jsx)(ze,{status:c&&(!i||i.status===`running`)?`running`:r})]}),children:[(r===`running`||c)&&i?.status!==`completed`&&(0,V.jsxs)(`div`,{className:`border-t border-border px-3 py-1.5 text-xs text-muted`,"data-testid":`agent-progress`,children:[i?.summary||(i?.lastTool?`正在使用 ${i.lastTool}`:`启动中…`),i?.toolUses!==void 0&&(0,V.jsxs)(`span`,{className:`ml-2`,children:[`· `,i.toolUses,` 次工具调用`]}),e.steps?(0,V.jsxs)(`span`,{className:`ml-2`,children:[`· `,e.steps,` 步`]}):null]}),s&&!c&&(0,V.jsx)(`div`,{className:`max-h-96 overflow-y-auto border-t border-border px-3 py-2 text-sm`,"data-testid":`agent-report`,children:(0,V.jsx)(h,{text:s})}),n&&(0,V.jsx)(`div`,{className:`border-t border-border px-3 py-1.5 text-right`,children:(0,V.jsx)(u,{to:`${n}/agent/${e.id}`,className:`text-xs text-accent hover:underline`,children:`查看完整过程 →`})})]})}function Je({item:e,attrs:t}){let{todoNames:n}=(0,O.useContext)(H),r=e.input,i;if(e.name===`TaskCreate`)i=`新增待办:${q(r.subject)}`;else if(e.name===`TaskUpdate`){let e=n?.get(q(r.taskId))??`#${q(r.taskId)}`;i=r.status?`${Ye[q(r.status)]??q(r.status)}:${e}`:`更新待办:${e}`}else i=e.name===`TodoWrite`?`更新待办清单`:`查看待办`;return(0,V.jsxs)(`div`,{className:`flex items-center gap-2 px-1 text-xs text-muted`,"data-testid":`tool-call`,...t,children:[(0,V.jsx)(`span`,{children:`☑`}),(0,V.jsx)(`span`,{className:`min-w-0 truncate`,children:i})]})}var Ye={pending:`待办`,in_progress:`进行中`,completed:`已完成`,deleted:`已删除`};function Xe(e,t,n){switch(e){case`Read`:return n(q(t.file_path));case`Glob`:case`Grep`:return q(t.pattern)+(t.path?` ${n(q(t.path))}`:``);case`WebFetch`:return q(t.url);case`WebSearch`:return q(t.query);case`ToolSearch`:return q(t.query);case`Skill`:return q(t.skill)||q(t.command);default:return``}}function Ze({item:e,attrs:t}){let n=Re(),r=X(e.result);return(0,V.jsxs)(K,{testId:`tool-call`,attrs:t,stateKey:e.key,label:(0,V.jsx)(Y,{item:e,children:Xe(e.name,e.input,n)}),children:[(0,V.jsx)(`pre`,{className:`max-h-48 overflow-auto whitespace-pre-wrap break-words px-3 py-2 font-mono text-xs text-muted`,children:JSON.stringify(e.input,null,2)}),(0,V.jsx)(Qe,{item:e}),e.result&&(0,V.jsx)(`div`,{className:`border-t border-border`,children:(0,V.jsx)(Z,{text:r,error:e.result.isError,stateKey:e.key})})]})}function Qe({item:e}){let{readImageUrl:t}=(0,O.useContext)(H),n=q(e.input.file_path),r=e.name===`Read`&&!e.result?.isError&&y.some(e=>n.toLowerCase().endsWith(e))?t?.(e.id):void 0;return r?(0,V.jsx)($e,{src:r,file:n},r):null}function $e({src:e,file:t}){let[n]=(0,O.useState)(()=>`${e}${e.includes(`?`)?`&`:`?`}preview=${Te()}`),[r,i]=(0,O.useState)(!1),[a,o]=(0,O.useState)(!1);return a?null:(0,V.jsx)(`button`,{type:`button`,hidden:!r,"aria-label":`预览图片 ${t}`,title:`临时预览当前文件`,onClick:()=>m(n,t,!0),className:`mx-3 mb-3 max-w-[calc(100%_-_1.5rem)] cursor-zoom-in rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50`,children:(0,V.jsx)(`img`,{src:n,alt:t,onLoad:()=>i(!0),onError:()=>o(!0),"data-testid":`read-image`,className:`max-h-80 max-w-full rounded-lg border border-border object-contain`})})}function et(e,t,n=!1){let r=[],i=new Map,a=new Set,o=new Set,s=new Set,c;for(let t of e){if(t.kind===`result`){let e=new Set((t.userMessageIds??[]).map(e=>i.get(e)).filter(e=>e!==void 0)),n=r.findLast(t=>e.has(t))??c;if(n){e.size||e.add(n);for(let n of e)a.add(n),n.error=t.ok?void 0:t.error||`本轮执行失败`;n.result=t,n.items.push(t);continue}}if((!c||t.kind===`user`&&o.has(c)||a.has(c))&&(c={key:t.key,items:[],summary:`后台调用`,active:!1,queued:!1},r.push(c)),c.items.push(t),t.kind===`user`){if(!s.has(c)){let e=Ce(t.text);e?(c.summary=e.slice(0,120),s.add(c)):t.images?(c.summary=`图片输入`,s.add(c)):c.items.length===1&&(c.summary=`会话输入`)}i.set(t.key,c)}else t.kind===`result`?(c.result=t,c.error=t.ok?void 0:t.error||`本轮执行失败`,a.add(c)):(o.add(c),t.kind===`notice`&&t.tone===`error`&&(c.error=t.text,c.items.some(e=>e.kind===`user`)||(c.summary=`执行失败`)))}if(t){let e=r.findLast(e=>!a.has(e)&&e.items.some(e=>(e.kind===`text`||e.kind===`thinking`)&&e.streaming||e.kind===`tool`&&!e.result&&(!e.task||e.task.status===`running`))),t=e?r.indexOf(e):r.length-1;for(let e=t;e>=0&&e<r.length;e++){let n=r[e];a.has(n)||n.error||(n.active=!0,n.queued=e>t&&!o.has(n))}}return n&&r.length&&(r[r.length-1].latest=!0),r}function tt(e){return!e.active&&!e.latest&&!e.error}function nt(e,t){return t??tt(e)?t===!0?[]:rt(e):e.items}function rt(e){let t=e.items.length;for(;t&&e.items[t-1].kind===`result`;)t--;let n=e.items[t-1];if(n?.kind!==`text`||n.streaming)return[];let r=t-1,i=/^(.*):\d+$/.exec(n.key)?.[1];for(;i&&r>0;){let t=e.items[r-1];if(t.kind!==`text`||t.streaming||/^(.*):\d+$/.exec(t.key)?.[1]!==i)break;r--}return e.items.slice(r,t)}function it(e,t){let n=new Map(t.flatMap(e=>e.items.map(t=>[t.key,e.key]))),r=new Map;for(let t of e){let e=t.items.map(e=>n.get(e.key)).find(e=>e!==void 0);e&&e!==t.key&&r.set(t.key,e)}return r}function at(e,t){for(let n of[`turn-`,`changes-`,`running-`])if(e.startsWith(n))return n+(t.get(e.slice(n.length))??e.slice(n.length));return e}function Q(e,t,n,r){let i=e.get(n),a=new Map(e);if(i)for(let[n,o]of e)n.startsWith(`${t}:`)&&o===i&&a.set(n,r);for(a.delete(n),a.set(n,r);a.size>7500;)a.delete(a.keys().next().value);return a}function ot(e,t,n){let r=e;for(let[i,a]of n){let n=`${t}:${i}`,o=`${t}:${a}`,s=r.get(n),c=r.get(o);if(s&&s===c)continue;let l=s&&c?s.revision>c.revision?s:c:s??c??{revision:0};r===e&&(r=new Map(e));for(let[e,n]of r)e.startsWith(`${t}:`)&&(n===s||n===c)&&r.set(e,l);r.set(n,l),r.set(o,l)}for(r.size>7500&&r===e&&(r=new Map(e));r.size>7500;)r.delete(r.keys().next().value);return r}var st=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`}),ct=new Intl.DateTimeFormat(void 0,{month:`2-digit`,day:`2-digit`}),lt=new Intl.DateTimeFormat(void 0,{year:`2-digit`,month:`2-digit`,day:`2-digit`}),ut=new Intl.DateTimeFormat(void 0,{dateStyle:`medium`,timeStyle:`medium`});function dt(e,t){return e!==void 0&&e!==t}function ft(e,t=Date.now()){if(e===void 0||!Number.isFinite(e))return;let n=new Date(e);if(Number.isNaN(n.getTime()))return;let r=new Date(t),i=n.getFullYear()===r.getFullYear()&&n.getMonth()===r.getMonth()&&n.getDate()===r.getDate(),a=n.getFullYear()===r.getFullYear(),o=st.format(n),s=i?void 0:(a?ct:lt).format(n);return{lines:s?[s,o]:[o],title:ut.format(n),dateTime:n.toISOString()}}var pt=150,mt=80,$=new Map,ht=0;function gt({items:e,loading:n,running:r,waiting:i=!1,turnSlots:a,history:o}){let c=(0,O.useRef)(null),l=(0,O.useRef)(!0),u=(0,O.useRef)(null),d=(0,O.useRef)(null),f=(0,O.useCallback)(()=>{let e=c.current;if(!e||l.current)return;let t=e.getBoundingClientRect().top,n=[...e.querySelectorAll(`[data-row-key]`)].find(e=>e.getBoundingClientRect().bottom>t);n&&(u.current={key:n.dataset.rowKey,offset:n.getBoundingClientRect().top-t})},[]),p=_(f),[m,h]=(0,O.useState)(null),[g,v]=(0,O.useState)(!1),{sessionUrl:y=``,viewKey:b}=(0,O.useContext)(H),x=b??y,[S,C]=(0,O.useState)(()=>new Map($)),w=!o?.newer,T=(0,O.useMemo)(()=>et(e,r||i,w),[e,r,i,w]),E=(0,O.useRef)({namespace:x,turns:[]}),D=(0,O.useMemo)(()=>it(E.current.namespace===x?E.current.turns:[],T),[T,x]),k=(0,O.useMemo)(()=>ot(S,x,D),[S,D,x]);(0,O.useLayoutEffect)(()=>{E.current={namespace:x,turns:T},$=ot($,x,D),$!==S&&C($)},[T,x,k,S]);let A=e=>{let t=c.current;if(e===`latest`)l.current=!0,u.current=null;else if(t){l.current=!1;let e=t.getBoundingClientRect().top,n=[...t.querySelectorAll(`[data-row-key]`)].find(t=>t.getBoundingClientRect().bottom>e&&!t.dataset.rowKey?.startsWith(`history-`));n&&(u.current={key:n.dataset.rowKey,offset:n.getBoundingClientRect().top-e})}o?.load(e)},j=(0,O.useMemo)(()=>{let e=[],n;return o&&e.push({key:`history-controls`,node:(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center justify-center gap-2 text-xs text-muted`,children:[o.older&&(0,V.jsx)(t,{size:`sm`,disabled:o.loading,onClick:()=>A(`older`),children:`加载更早消息`}),o.historical&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{children:`正在查看历史`}),(0,V.jsx)(t,{size:`sm`,disabled:o.loading,onClick:()=>A(`latest`),children:`返回最新消息`})]}),o.loading&&(0,V.jsx)(`span`,{children:`加载中…`}),o.error&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`text-danger`,children:o.error}),(0,V.jsx)(t,{size:`sm`,onClick:()=>A(`latest`),children:`重新加载`})]})]})}),T.forEach((t,o)=>{let s=`${x}:${t.key}`,d=k.get(s)?.collapsed,f=d??tt(t),p=nt(t,d),m={key:t.key,number:o+1,expanded:p.length>0},h=t=>e.push({...t,turn:m});if(h({key:`turn-${t.key}`,node:(0,V.jsx)(vt,{turn:t,number:o+1,collapsed:f,waiting:i&&t.active&&!t.queued,onToggle:e=>{l.current=!1,u.current={key:`turn-${t.key}`,offset:Math.max(0,e.getBoundingClientRect().top-(c.current?.getBoundingClientRect().top??0)),focus:!0};let n={collapsed:!f,revision:++ht};$=Q($,x,s,n),C($)}})}),p.forEach((e,t)=>{let r=dt(e.ts,n?.ts);n=e,h({key:e.key,item:e,showTime:r,before:!f&&t?a.before(e.key):null,nested:!0})}),f)return;let g=T[o+1]?.items[0],_=g?a.before(g.key):a.tail;_&&h({key:`changes-${t.key}`,node:_,nested:!0}),t.active&&!t.queued&&r&&h({key:`running-${t.key}`,node:(0,V.jsx)(St,{}),nested:!0})}),!T.length&&r&&e.push({key:`running`,node:(0,V.jsx)(St,{})}),o?.historical&&e.push({key:`history-newer`,node:(0,V.jsxs)(`div`,{className:`flex justify-center gap-2`,children:[o.newer&&(0,V.jsx)(t,{size:`sm`,disabled:o.loading,onClick:()=>A(`newer`),children:`加载后续消息`}),(0,V.jsx)(t,{size:`sm`,disabled:o.loading,onClick:()=>A(`latest`),children:`返回最新消息`})]})}),e},[T,k,x,a,r,i,o]),M=j.length>pt,N=(0,O.useCallback)(()=>{d.current===null&&(d.current=requestAnimationFrame(()=>{d.current=null;let e=c.current;if(!e)return;let t=e.getBoundingClientRect(),n=t.top+Math.min(80,t.height/4),r=null;for(let i of e.querySelectorAll(`[data-turn-key]`)){let e=i.getBoundingClientRect();if(!(e.bottom<=n||e.top>=t.bottom)){i.dataset.turnExpanded===`true`&&(r={key:i.dataset.turnKey,number:Number(i.dataset.turnNumber)});break}}h(e=>e?.key===r?.key&&e?.number===r?.number?e:r)}))},[]);return(0,O.useLayoutEffect)(N,[j,p,N]),(0,O.useEffect)(()=>()=>{d.current!==null&&cancelAnimationFrame(d.current),d.current=null},[]),(0,O.useLayoutEffect)(()=>{if(M||o?.loading||!u.current||!c.current)return;let e=c.current,t=u.current,n=e.querySelector(`[data-row-key="${CSS.escape(at(t.key,D))}"]`);n?(u.current=null,e.scrollTop+=n.getBoundingClientRect().top-e.getBoundingClientRect().top-t.offset,t.focus&&n.querySelector(`button`)?.focus({preventScroll:!0})):u.current=null},[j,M,o?.loading,D,p]),(0,O.useLayoutEffect)(()=>{let e=c.current;e&&l.current&&(e.scrollTop=e.scrollHeight)},[e,r,p]),(0,O.useLayoutEffect)(()=>{let e=c.current;if(!e)return;let t=new ResizeObserver(()=>{l.current&&(e.scrollTop=e.scrollHeight);let t=e.scrollHeight-e.scrollTop-e.clientHeight<mt;l.current=t,v(!t),N()});return t.observe(e),e.firstElementChild&&t.observe(e.firstElementChild),()=>t.disconnect()},[M,N]),(0,V.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,V.jsx)(`div`,{ref:c,className:`message-transcript min-h-0 flex-1 overflow-y-auto overflow-x-hidden ${M?`[overflow-anchor:none]`:``}`,onScroll:e=>{N();let t=e.currentTarget,n=t.scrollHeight-t.scrollTop-t.clientHeight<mt;if(!o?.loading){let e=t.getBoundingClientRect().top,r=[...t.querySelectorAll(`[data-row-key]`)].find(t=>t.getBoundingClientRect().bottom>e);u.current=!n&&r?{key:r.dataset.rowKey,offset:r.getBoundingClientRect().top-e}:null}n!==l.current&&(l.current=n,v(!n))},"data-testid":`message-list`,"data-virtual":M?`true`:void 0,"data-message-font-size":p,children:M?(0,V.jsx)(_t,{rows:j,scrollRef:c,stick:l,scrollAnchor:u,anchoringPaused:o?.loading,rebases:D,fontSize:p}):(0,V.jsxs)(`div`,{className:`mx-auto max-w-4xl space-y-4 pb-20 pl-12 pr-4 pt-6 md:pl-14 md:pr-6`,children:[n&&(0,V.jsx)(`p`,{className:`text-sm text-muted`,children:`加载中…`}),!n&&e.length===0&&!r&&(0,V.jsx)(wt,{}),j.map(e=>(0,V.jsxs)(`div`,{"data-row-key":e.key,"data-turn-key":e.turn?.key,"data-turn-number":e.turn?.number,"data-turn-expanded":e.turn?.expanded,className:`relative ${e.nested?`ml-2 border-l border-border/70 pl-4`:``}`,children:[e.item&&e.showTime&&(0,V.jsx)(yt,{item:e.item}),e.item?(0,V.jsx)(bt,{item:e.item,before:e.before}):e.node]},e.key))]})}),(m||g)&&(0,V.jsxs)(`div`,{className:`pointer-events-none absolute inset-x-3 bottom-3 z-10 flex flex-wrap justify-center gap-2`,children:[m&&(0,V.jsx)(t,{icon:(0,V.jsx)(s,{className:`rotate-180`}),className:`pointer-events-auto gap-1.5! rounded-full! bg-bg/95 font-normal! shadow-lg backdrop-blur-sm`,"aria-label":`收起第 ${m.number} 轮`,"data-testid":`turn-collapse`,onClick:()=>{if(!m)return;let e=T.find(e=>e.key===m.key),t=`${x}:${m.key}`,n=k.get(t)?.collapsed;if(!e||!nt(e,n).length)return;l.current=!1,u.current={key:`turn-${e.key}`,offset:12,focus:!0};let r={collapsed:!0,revision:++ht};$=Q($,x,t,r),C($),h(null)},children:(0,V.jsxs)(`span`,{className:`inline-flex items-baseline gap-2`,children:[(0,V.jsx)(`span`,{children:`收起`}),(0,V.jsxs)(`span`,{className:`text-xs text-muted`,children:[`第 `,m.number,` 轮`]})]})}),g&&(0,V.jsx)(t,{icon:(0,V.jsx)(s,{}),className:`pointer-events-auto rounded-full! bg-bg/95 shadow-lg backdrop-blur-sm`,"aria-label":`回到底部`,onClick:()=>{let e=c.current;e&&(l.current=!0,v(!1),e.scrollTop=e.scrollHeight)},children:`回到底部`})]})]})}function _t({rows:e,scrollRef:t,stick:n,scrollAnchor:r,anchoringPaused:i,rebases:a,fontSize:o}){let s=v.find(e=>e.value===o).bodyRem,c=ye({count:e.length,getScrollElement:()=>t.current,estimateSize:t=>xt(e[t])*s,getItemKey:t=>e[t].key,overscan:6,paddingStart:24,paddingEnd:80,gap:16,initialOffset:()=>n.current?2**53-1:0});(0,O.useLayoutEffect)(()=>{c.measure(),t.current?.querySelectorAll(`[data-index]`).forEach(e=>c.measureElement(e)),n.current&&c.scrollToEnd()},[o,c,t,n]),(0,O.useLayoutEffect)(()=>{if(i||!r.current)return;let n=r.current,o=at(n.key,a),s=e.findIndex(e=>e.key===o);if(s<0){r.current=null;return}let l=c.getOffsetForIndex(s,`start`);if(!l)return;r.current={...n,key:o},c.scrollToOffset(Math.max(0,l[0]-n.offset));let u=requestAnimationFrame(()=>{let e=t.current,i=e?.querySelector(`[data-row-key="${CSS.escape(o)}"]`);e&&i&&(r.current=null,e.scrollTop+=i.getBoundingClientRect().top-e.getBoundingClientRect().top-n.offset,n.focus&&i.querySelector(`button`)?.focus({preventScroll:!0}))});return()=>cancelAnimationFrame(u)},[e,c,r,t,i,a,o]);let l=(0,O.useRef)(null);return(0,O.useEffect)(()=>{let e=l.current,r=t.current;if(!e||!r)return;let i=new ResizeObserver(()=>{n.current&&(r.scrollTop=r.scrollHeight)});return i.observe(e),()=>i.disconnect()},[t,n]),(0,V.jsx)(`div`,{className:`mx-auto max-w-4xl pl-12 pr-4 md:pl-14 md:pr-6`,children:(0,V.jsx)(`div`,{ref:l,className:`relative w-full`,style:{height:c.getTotalSize()},children:c.getVirtualItems().map(t=>{let n=e[t.index];return(0,V.jsxs)(`div`,{"data-row-key":n.key,"data-turn-key":n.turn?.key,"data-turn-number":n.turn?.number,"data-turn-expanded":n.turn?.expanded,"data-index":t.index,ref:c.measureElement,className:`absolute top-0 ${n.nested?`left-2 w-[calc(100%-0.5rem)] border-l border-border/70 pl-4`:`left-0 w-full`}`,style:{transform:`translateY(${t.start}px)`},children:[n.item&&n.showTime&&(0,V.jsx)(yt,{item:n.item}),n.item?(0,V.jsx)(bt,{item:n.item,before:n.before}):n.node]},t.key)})})})}function vt({turn:e,number:t,collapsed:n,waiting:r,onToggle:i}){let a=e.items.filter(e=>e.kind===`tool`).length,o=e.result,s=e.error?o?.subtype===`error_during_execution`?`已中断`:`失败`:e.active?e.queued?`排队中`:r?`等待回答`:`执行中`:`已结束`;return(0,V.jsxs)(`button`,{type:`button`,className:`flex w-full min-w-0 items-center gap-2 rounded-lg border border-border bg-surface/70 px-3 py-2 text-left text-sm hover:bg-surface-2`,"aria-expanded":!n,"aria-label":`${n?`展开`:`折叠`}第 ${t} 轮`,onClick:e=>i(e.currentTarget),"data-testid":`turn-header`,children:[(0,V.jsx)(d,{open:!n}),(0,V.jsxs)(`span`,{className:`shrink-0 font-medium`,children:[`第 `,t,` 轮`]}),(0,V.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-muted`,title:e.summary,children:e.summary}),a>0&&(0,V.jsxs)(`span`,{className:`hidden shrink-0 text-xs text-muted sm:inline`,children:[a,` 次工具调用`]}),n&&o?.durationMs!==void 0&&(0,V.jsxs)(`span`,{className:`hidden shrink-0 text-xs text-muted sm:inline`,children:[(o.durationMs/1e3).toFixed(1),`s`]}),(0,V.jsx)(`span`,{className:`shrink-0 text-xs ${e.error?`text-danger`:e.active?`text-accent`:`text-muted`}`,children:s})]})}var yt=(0,O.memo)(function({item:e}){let t=ft(e.ts);return t?(0,V.jsx)(`time`,{className:`absolute top-0 flex w-max select-none flex-col items-end gap-0.5 text-right text-[10px] leading-none tabular-nums text-muted/80`,style:{right:`calc(100% + 0.5rem)`},dateTime:t.dateTime,title:t.title,"data-testid":`message-time`,children:t.lines.map((e,t)=>(0,V.jsx)(`span`,{className:`whitespace-nowrap`,children:e},t))}):null}),bt=(0,O.memo)(function({item:e,before:t}){return t?(0,V.jsxs)(`div`,{className:`space-y-4`,children:[t,(0,V.jsx)(Ee,{item:e})]}):(0,V.jsx)(Ee,{item:e})});function xt(e){let t=e.item,n=e.before?56:0;if(!t)return 40;let r=(e,t)=>e.split(`
15
+ `).reduce((e,n)=>e+Math.max(1,Math.ceil(n.length/t)),0);switch(t.kind){case`user`:return n+48+24*r(t.text,60);case`text`:return n+32+26*r(t.text,80);case`thinking`:return n+40;case`tool`:return t.name===`Agent`||t.name===`Task`?n+40:t.name.startsWith(`Task`)||t.name===`TodoWrite`?n+20:n+40;case`result`:return n+28;case`bash`:return n+80;case`local`:return n+16+18*r(t.text,100);case`notice`:return n+20}}function St(){return(0,V.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted`,"data-testid":`running-indicator`,children:[(0,V.jsx)(`span`,{className:`inline-block size-2 animate-pulse rounded-full bg-accent`}),`Claude 正在工作…`]})}var Ct=[[`/`,`斜杠命令和技能,例如 /init、/review、/goal`],[`@`,`引用项目里的文件`],[`!`,`直接在项目目录执行一条命令,输出带进对话`],[`图片`,`粘贴、拖进来,或点输入框左下角的按钮`]];function wt(){return(0,V.jsxs)(`div`,{className:`mx-auto max-w-md py-[10vh] text-center`,"data-testid":`empty-conversation`,children:[(0,V.jsx)(`h2`,{className:`text-2xl`,children:`有什么要做的?`}),(0,V.jsx)(`p`,{className:`mt-2 text-sm text-muted`,children:`描述任务,Claude 会在这个项目里读代码、改文件、跑命令。关掉页面也会继续运行。`}),(0,V.jsx)(`ul`,{className:`mt-6 space-y-2 text-left text-sm`,children:Ct.map(([e,t])=>(0,V.jsxs)(`li`,{className:`flex items-baseline gap-3 rounded-lg border border-border bg-surface px-3 py-2`,children:[(0,V.jsx)(`kbd`,{className:`min-w-8 shrink-0 rounded border border-border bg-surface-2 px-1.5 text-center font-mono text-xs`,children:e}),(0,V.jsx)(`span`,{className:`text-muted`,children:t})]},e))})]})}export{xe as a,D as c,w as d,S as f,Te as i,E as l,Ge as n,B as o,b as p,H as r,C as s,gt as t,T as u};
@@ -0,0 +1 @@
1
+ import{R as e,at as t,ct as n,gt as r,ht as i,it as a,mt as o,ut as s,vt as c}from"./Form-BKTwiYyw.js";import{C as l,I as u,M as d,N as f,T as p,g as m,k as h,v as g,x as _,y as v}from"./lib-DlcVMUqT.js";var y=r((e=>{var t=i();function n(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function r(){}var a={d:{f:r,r:function(){throw Error(n(522))},D:r,C:r,L:r,m:r,X:r,S:r,M:r},p:0,findDOMNode:null},o=Symbol.for(`react.portal`),s=Symbol.for(`react.recoverable`),c=Symbol.for(`react.optimistic_key`);function l(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:o,key:r==null?null:r===c?c:``+r,children:e,containerInfo:t,implementation:n}}var u=t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function d(e,t){if(e===`font`)return``;if(typeof t==`string`)return t===`use-credentials`?t:``}e.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=a,e.browser=function(e){return{$$typeof:s,_reason:e}},e.createPortal=function(e,t){var r=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(n(299));return l(e,t,null,r)},e.flushSync=function(e){var t=u.T,n=a.p;try{if(u.T=null,a.p=2,e)return e()}finally{u.T=t,a.p=n,a.d.f()}},e.preconnect=function(e,t){typeof e==`string`&&(t?(t=t.crossOrigin,t=typeof t==`string`?t===`use-credentials`?t:``:void 0):t=null,a.d.C(e,t))},e.prefetchDNS=function(e){typeof e==`string`&&a.d.D(e)},e.preinit=function(e,t){if(typeof e==`string`&&t&&typeof t.as==`string`){var n=t.as,r=d(n,t.crossOrigin),i=typeof t.integrity==`string`?t.integrity:void 0,o=typeof t.fetchPriority==`string`?t.fetchPriority:void 0;n===`style`?a.d.S(e,typeof t.precedence==`string`?t.precedence:void 0,{crossOrigin:r,integrity:i,fetchPriority:o}):n===`script`&&a.d.X(e,{crossOrigin:r,integrity:i,fetchPriority:o,nonce:typeof t.nonce==`string`?t.nonce:void 0})}},e.preinitModule=function(e,t){if(typeof e==`string`){if(typeof t==`object`&&t){if(t.as==null||t.as===`script`){var n=d(t.as,t.crossOrigin);a.d.M(e,{crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0})}}else t??a.d.M(e)}},e.preload=function(e,t){if(typeof e==`string`&&typeof t==`object`&&t&&typeof t.as==`string`){var n=t.as,r=d(n,t.crossOrigin);a.d.L(e,n,{crossOrigin:r,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,type:typeof t.type==`string`?t.type:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0,referrerPolicy:typeof t.referrerPolicy==`string`?t.referrerPolicy:void 0,imageSrcSet:typeof t.imageSrcSet==`string`?t.imageSrcSet:void 0,imageSizes:typeof t.imageSizes==`string`?t.imageSizes:void 0,media:typeof t.media==`string`?t.media:void 0})}},e.preloadModule=function(e,t){if(typeof e==`string`){if(t){var n=d(t.as,t.crossOrigin);a.d.m(e,{as:typeof t.as==`string`&&t.as!==`script`?t.as:void 0,crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0})}else a.d.m(e)}},e.requestFormReset=function(e){a.d.r(e)},e.unstable_batchedUpdates=function(e,t){return e(t)},e.useFormState=function(e,t,n){return u.H.useFormState(e,t,n)},e.useFormStatus=function(){return u.H.useHostTransitionStatus()},e.version=`19.3.0`})),b=r(((e,t)=>{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=y()})),x=class extends g{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||S(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??(this.state.status===`pending`?this.execute(this.state.variables):Promise.resolve())}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey},r=this.#r=v({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)}),i=this.state.status===`pending`,a=!r.canStart();try{if(i)t();else{this.#i({type:`pending`,variables:e,isPaused:a}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:a})}let o=await r.start();return await this.#n.config.onSuccess?.(o,e,this.state.context,this,n),await this.options.onSuccess?.(o,e,this.state.context,n),await this.#n.config.onSettled?.(o,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(o,null,e,this.state.context,n),this.#i({type:`success`,data:o}),o}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#r===r&&(this.#r=void 0),this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),_.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function S(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var C=class extends l{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),d(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&p(t.mutationKey)!==p(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onSubscribe(){this.listeners.size===1&&this.#n&&(this.#n.addObserver(this),this.#i())}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??S();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){_.batch(()=>{let t=this.#r;if(t&&this.hasListeners()){let n=this.#t.variables,r=this.#t.context,i={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{t.onSuccess?.(e.data,n,r,i)}catch(e){Promise.reject(e)}try{t.onSettled?.(e.data,null,n,r,i)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{t.onError?.(e.error,n,r,i)}catch(e){Promise.reject(e)}try{t.onSettled?.(void 0,e.error,n,r,i)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},w=c(i(),1);function T(e,t){let n=u(t),[r]=w.useState(()=>new C(n,e));w.useEffect(()=>{r.setOptions(e)},[r,e]);let i=w.useSyncExternalStore(w.useCallback(e=>r.subscribe(_.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=w.useCallback((...e)=>{r.mutate(e[0],e[1]).catch(h)},[r]);if(i.error&&f(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}function E(){return m({queryKey:[`projects`],queryFn:()=>s(`/api/projects`)})}function D(e){return m({queryKey:[`sessions`,e],queryFn:()=>s(`/api/projects/${e}/sessions`),enabled:!!e})}function O(e){return m({queryKey:[`models`,e],queryFn:()=>s(`/api/projects/${e}/models`),enabled:!!e,staleTime:6e5})}function k(e){return m({queryKey:[`commands`,e],queryFn:()=>s(`/api/projects/${e}/commands`),enabled:!!e,staleTime:6e5})}function A(){return m({queryKey:[`overview`],queryFn:()=>s(`/api/overview`),refetchInterval:3e4})}function j(e){let t=Math.round((Date.now()-e)/1e3);return t<60?`刚刚`:t<3600?`${Math.floor(t/60)} 分钟前`:t<86400?`${Math.floor(t/3600)} 小时前`:t<604800?`${Math.floor(t/86400)} 天前`:new Date(e).toLocaleDateString()}var M=b(),N=o();function P(){let[e,t]=(0,w.useState)(!1),n=(0,w.useRef)(null);return{open:e,setOpen:t,toggle:(0,w.useCallback)(()=>t(e=>!e),[]),close:(0,w.useCallback)(()=>{t(!1),n.current?.focus({preventScroll:!0})},[]),triggerRef:n}}var F=()=>typeof window<`u`&&window.matchMedia(`(max-width: 639px)`).matches;function I({open:e,onClose:t,anchor:r,children:i,align:a=`start`,width:o,label:s,testId:c,sheetOnMobile:l=!0,topmostOnly:u=!1}){let d=(0,w.useRef)(null),[f,p]=(0,w.useState)(null),m=l&&F();return(0,w.useLayoutEffect)(()=>{if(!e||m)return;let t=()=>{let e=r.current?.getBoundingClientRect();if(!e)return;let t=window.innerWidth,n=window.innerHeight,i=o===`trigger`||o===void 0?Math.max(e.width,192):o,s=Math.max(0,Math.min(i,t-24)),c=n-e.bottom-12,l=e.top-12,u=c<240&&l>c,d=a===`end`?e.right-s:e.left;d=Math.max(12,Math.min(d,t-s-12)),p({top:u?e.top-4:e.bottom+4,left:d,width:s,maxHeight:Math.max(0,Math.min(420,(u?l:c)-4)),above:u})};return t(),window.addEventListener(`resize`,t),window.addEventListener(`scroll`,t,!0),()=>{window.removeEventListener(`resize`,t),window.removeEventListener(`scroll`,t,!0)}},[e,r,a,o,m]),(0,w.useEffect)(()=>{if(!e)return;let n=e=>{if(e.key===`Escape`){if(u){let t=document.querySelectorAll(`[role="dialog"]`);if(t[t.length-1]!==d.current?.closest(`[role="dialog"]`))return;e.preventDefault()}e.stopPropagation(),t(`escape`)}},i=e=>{let n=e.target;if(d.current?.contains(n)||r.current?.contains(n))return;let i=e.target instanceof Element&&!!e.target.closest(`[data-popover-backdrop]`);u&&i&&e.preventDefault(),t(i?`backdrop`:`outside`)};return document.addEventListener(`keydown`,n,!0),document.addEventListener(`pointerdown`,i,!0),()=>{document.removeEventListener(`keydown`,n,!0),document.removeEventListener(`pointerdown`,i,!0)}},[e,t,r,u]),e?m?(0,M.createPortal)((0,N.jsxs)(`div`,{className:`safe-overlay fixed inset-0 z-50 flex items-end`,role:`dialog`,"aria-label":s,children:[(0,N.jsx)(`div`,{"data-popover-backdrop":!0,className:`absolute inset-0 bg-black/25`,onClick:()=>t(`backdrop`)}),(0,N.jsxs)(`div`,{ref:d,"data-testid":c,className:`safe-sheet-panel relative w-full overflow-y-auto overscroll-contain rounded-2xl border border-border bg-surface pb-2 shadow-2xl`,children:[(0,N.jsx)(`div`,{className:`sticky top-0 flex justify-center bg-surface pb-1 pt-2`,children:(0,N.jsx)(`span`,{className:`h-1 w-10 rounded-full bg-border`,"aria-hidden":!0})}),i]})]}),document.body):f?(0,M.createPortal)((0,N.jsx)(`div`,{ref:d,role:`dialog`,"aria-label":s,"data-testid":c,style:{top:f.top,left:`clamp(max(12px, env(safe-area-inset-left)), ${f.left}px, calc(100vw - ${f.width}px - max(12px, env(safe-area-inset-right))))`,width:`min(${f.width}px, calc(100vw - max(12px, env(safe-area-inset-left)) - max(12px, env(safe-area-inset-right))))`,maxHeight:f.maxHeight,transform:f.above?`translateY(-100%)`:void 0},className:n(`fixed z-50 overflow-y-auto overscroll-contain rounded-lg border border-border bg-surface py-1 shadow-lg ring-1 ring-black/5`),children:i}),document.body):null:null}var L=(0,w.createContext)(void 0),R=()=>(0,w.useContext)(L);function z(e){return!e.matches(`:disabled, [aria-disabled="true"]`)&&!e.closest(`[inert]`)&&e.getClientRects().length>0&&![`hidden`,`collapse`].includes(getComputedStyle(e).visibility)}function B(e){return[...e.querySelectorAll(`[role="menuitem"]`)].filter(t=>t.closest(`[role="menu"]`)===e&&z(t))}function V({trigger:e,children:t,label:n,beforeOpen:r,align:i=`end`,width:a=220,testId:o}){let[s,c]=(0,w.useState)(!1),l=(0,w.useRef)(!1),u=(0,w.useRef)(!1),d=(0,w.useRef)(`first`),f=(0,w.useRef)(null),p=(0,w.useRef)(null),m=(0,w.useId)(),h=(0,w.useCallback)(e=>{l.current&&(l.current=!1,c(!1),(e===`action`||e===`escape`||e===`backdrop`||e===`trigger`)&&f.current?.focus({preventScroll:!0}))},[]),g=(0,w.useCallback)(()=>h(`action`),[h]),_=(0,w.useCallback)(e=>h(e??`outside`),[h]),v=e=>{u.current||r?.(),u.current=!1,d.current=e,l.current=!0,c(!0)};return(0,N.jsxs)(N.Fragment,{children:[e({ref:f,"aria-label":n,"aria-haspopup":`menu`,"aria-expanded":s,"aria-controls":s?m:void 0,onPointerDown:e=>{u.current=!1,!l.current&&e.button===0&&(r?.(),u.current=!0)},onPointerCancel:()=>{u.current=!1},onClick:()=>{l.current?h(`trigger`):v(`first`)},onKeyDown:e=>{[`Enter`,` `,`ArrowDown`,`ArrowUp`].includes(e.key)&&(e.preventDefault(),u.current=!1,l.current?e.key===`Enter`||e.key===` `?h(`trigger`):p.current&&U(p.current,e.key===`ArrowUp`?`last`:`first`):v(e.key===`ArrowUp`?`last`:`first`))}}),(0,N.jsx)(I,{open:s,onClose:_,anchor:f,align:i,width:a,label:n,testId:o,topmostOnly:!0,children:(0,N.jsx)(L.Provider,{value:g,children:(0,N.jsx)(W,{id:m,label:n,menu:p,anchor:f,firstFocus:d.current,close:h,children:typeof t==`function`?t(g):t})})})]})}function H(e){e.focus({preventScroll:!0}),e.scrollIntoView({block:`nearest`,inline:`nearest`})}function U(e,t){let n=B(e),r=t===`last`?n.at(-1):n[0];r?H(r):e.focus({preventScroll:!0})}function W({id:e,label:t,menu:n,anchor:r,firstFocus:i,close:a,children:o}){return(0,w.useLayoutEffect)(()=>{let e=n.current;if(!e)return;let t=document.querySelectorAll(`[role="dialog"]`);if(t[t.length-1]!==e.closest(`[role="dialog"]`))return;let r=document.activeElement;(!e.contains(r)||r===e&&B(e).length||r instanceof HTMLElement&&r!==e&&!z(r))&&U(e,i)},[n,i,o]),(0,N.jsx)(`div`,{ref:n,id:e,role:`menu`,"aria-label":t,tabIndex:-1,className:`outline-none`,onClickCapture:e=>{let t=e.target instanceof Element?e.target.closest(`[role="menuitem"]`):null;(!t||!z(t))&&e.stopPropagation()},onKeyDown:e=>{let t=n.current;if(t){if(e.key===`Tab`){let t=r.current,n=t?.closest(`[role="dialog"][aria-modal="true"]`),i=[...(n??document.body).querySelectorAll(`button, a[href], input:not([type="hidden"]), select, textarea, [tabindex]`)].filter(e=>e.tabIndex>=0&&z(e)&&!e.closest(`[role="menu"]`)),o=i[(t?i.indexOf(t):-1)+(e.shiftKey?-1:1)]??(n?e.shiftKey?i.at(-1):i[0]:void 0);a(`tab`),o?(e.preventDefault(),o.focus({preventScroll:!0})):t?.focus({preventScroll:!0})}else if([`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key)){e.preventDefault();let n=B(t);if(!n.length)return;let r=n.indexOf(document.activeElement),i=e.key===`Home`?0:e.key===`End`?n.length-1:e.key===`ArrowDown`?(r+1)%n.length:(r<0?n.length-1:r-1+n.length)%n.length;n[i]&&H(n[i])}}},children:o})}function G({checked:e,onChange:t,label:r,icon:i,className:a,compact:o,disabled:s}){return(0,N.jsxs)(`button`,{type:`button`,role:`switch`,"aria-checked":e,"aria-label":r,disabled:s,onClick:()=>t(!e),className:n(`inline-flex h-10 shrink-0 items-center gap-2 rounded-md border px-2.5 text-sm transition-colors md:h-8`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40 disabled:cursor-wait disabled:opacity-60`,e?`border-accent/50 bg-accent/10 text-text`:`border-border bg-surface text-muted hover:text-text`,a),children:[i,!o&&(0,N.jsx)(`span`,{className:`hidden sm:inline`,children:r}),(0,N.jsx)(`span`,{className:n(`relative h-4 w-7 rounded-full transition-colors`,e?`bg-accent`:`bg-border`),"aria-hidden":!0,children:(0,N.jsx)(`span`,{className:n(`absolute top-0.5 size-3 rounded-full bg-white shadow-sm transition-all`,e?`left-3.5`:`left-0.5`)})})]})}function K({children:e,onClick:t,onRemove:r,removeLabel:i=`移除`,active:o,tone:s=`neutral`,icon:c,testId:l,checked:u,disabled:d,ariaLabel:f,compactOnMobile:p,shape:m=`pill`}){return(0,N.jsxs)(`span`,{className:n(`inline-flex max-w-full items-stretch overflow-hidden border transition-colors md:h-7 md:text-xs`,m===`rounded`?`rounded-md`:`rounded-full`,p?`h-7 text-[11px]`:`h-8 text-xs`,{neutral:`border-border text-muted`,accent:`border-accent/40 text-text bg-accent/5`,ok:`border-ok/40 text-ok bg-ok/5`,warn:`border-amber-500/40 text-amber-700 dark:text-amber-400 bg-amber-500/5`}[s],o&&`ring-2 ring-accent/25`),children:[(0,N.jsxs)(`button`,{type:`button`,"data-testid":l,role:u===void 0?void 0:`switch`,"aria-checked":u,"aria-label":f,"aria-expanded":u===void 0&&t?!!o:void 0,disabled:d,onClick:t,className:n(`flex min-w-0 items-center hover:text-text focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent/40 disabled:cursor-wait disabled:opacity-60`,m===`rounded`?`gap-1 pl-1.5 md:pl-2`:p?`gap-1 pl-2.5 md:gap-1.5 md:pl-3`:`gap-1.5 pl-3`,p&&`[&>svg]:size-[13px] md:[&>svg]:size-3.5`,r?`pr-1.5`:m===`rounded`?`pr-1.5 md:pr-2`:p?`pr-2.5 md:pr-3`:`pr-3`),children:[c,(0,N.jsx)(`span`,{className:`truncate`,children:e})]}),r&&(0,N.jsx)(`button`,{type:`button`,"aria-label":i,onClick:r,className:`flex w-7 items-center justify-center border-l border-current/15 hover:bg-surface-2 hover:text-text`,children:(0,N.jsx)(a,{size:12})})]})}function q({title:e,onClose:r,children:i,actions:o,testId:s,className:c}){return(0,N.jsxs)(`section`,{className:n(`rounded-xl border border-border bg-surface shadow-sm`,c),"data-testid":s,children:[(0,N.jsxs)(`header`,{className:`flex items-center gap-2 border-b border-border py-1.5 pl-3.5 pr-1.5`,children:[(0,N.jsx)(`h3`,{className:`min-w-0 flex-1 truncate font-sans text-sm font-medium`,children:e}),o,(0,N.jsx)(t,{variant:`ghost`,size:`sm`,iconOnly:!0,onClick:r,"aria-label":`关闭`,title:`关闭`,children:(0,N.jsx)(a,{})})]}),(0,N.jsx)(`div`,{className:`p-3.5`,children:i})]})}function J({children:n,label:r=`更多操作`,testId:i,align:a=`end`}){return(0,N.jsx)(`span`,{"data-testid":i,children:(0,N.jsx)(V,{label:r,align:a,trigger:n=>(0,N.jsx)(t,{...n,variant:`ghost`,size:`sm`,iconOnly:!0,children:(0,N.jsx)(e,{})}),children:n})})}function Y({onClick:e,children:t,danger:r,icon:i,hint:a,disabled:o}){let s=R();return(0,N.jsxs)(`button`,{type:`button`,role:`menuitem`,tabIndex:s?-1:void 0,disabled:o,onClick:()=>{s?.(),e()},className:n(`flex w-full items-center gap-2.5 px-3 py-2.5 text-left text-sm hover:bg-surface-2 focus-visible:bg-surface-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-45 sm:py-2`,r?`text-danger`:`text-text`),children:[i&&(0,N.jsx)(`span`,{className:`w-4 shrink-0 text-muted`,children:i}),(0,N.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:t}),a&&(0,N.jsx)(`span`,{className:`shrink-0 text-xs text-muted`,children:a})]})}function X(){return(0,N.jsx)(`div`,{className:`my-1 border-t border-border`,role:`separator`})}function Z({label:e,value:t,onChange:r,options:i}){return(0,N.jsx)(`div`,{role:`radiogroup`,"aria-label":e,className:`space-y-2`,children:i.map(e=>{let i=e.value===t;return(0,N.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":i,onClick:()=>r(e.value),className:n(`flex w-full items-start gap-3 rounded-lg border px-3.5 py-3 text-left transition-colors`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,i?`border-accent/60 bg-accent/5`:`border-border hover:border-muted/40`),children:[(0,N.jsx)(`span`,{className:n(`mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border`,i?`border-accent`:`border-muted/50`),"aria-hidden":!0,children:i&&(0,N.jsx)(`span`,{className:`size-2 rounded-full bg-accent`})}),(0,N.jsxs)(`span`,{className:`min-w-0`,children:[(0,N.jsx)(`span`,{className:`block text-sm font-medium`,children:e.title}),e.detail&&(0,N.jsx)(`span`,{className:`mt-0.5 block text-xs leading-relaxed text-muted`,children:e.detail})]})]},e.value)})})}function Q({title:e,onClose:n,children:r,testId:i,scrollBody:o=!0,panelClassName:s=``}){let c=(0,w.useRef)(null),l=(0,w.useRef)(document.activeElement),u=(0,w.useRef)(n);return(0,w.useEffect)(()=>{u.current=n},[n]),(0,w.useEffect)(()=>{let e=c.current,t=l.current;e.contains(document.activeElement)||e.focus({preventScroll:!0});let n=t=>{if(t.defaultPrevented)return;let n=document.querySelectorAll(`[role="dialog"][aria-modal="true"]`);if(n[n.length-1]===e){if(t.key===`Escape`)t.preventDefault(),u.current();else if(t.key===`Tab`){let n=document.querySelectorAll(`[role="dialog"]`),r=n[n.length-1];if(r!==e&&!e.contains(r))return;let i=[...e.querySelectorAll(`button:not([disabled]), a[href], input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`)].filter(e=>e.tabIndex>=0&&!e.matches(`:disabled`)&&!e.closest(`[inert]`)&&e.getClientRects().length>0&&getComputedStyle(e).visibility!==`hidden`),a=i[0],o=i.at(-1),s=document.activeElement;(!a||s===e||!e.contains(s)||(t.shiftKey?s===a:s===o))&&(t.preventDefault(),(t.shiftKey?o:a)?.focus({preventScroll:!0}))}}};return window.addEventListener(`keydown`,n),()=>{window.removeEventListener(`keydown`,n),!e.isConnected&&t instanceof HTMLElement&&t.isConnected&&(e.contains(document.activeElement)||document.activeElement===document.body)&&t.focus({preventScroll:!0})}},[]),(0,N.jsxs)(`div`,{ref:c,tabIndex:-1,className:`safe-overlay fixed inset-0 z-50 flex items-end justify-center outline-none sm:items-center`,role:`dialog`,"aria-modal":`true`,"aria-label":e,"data-testid":i,children:[(0,N.jsx)(`div`,{className:`absolute inset-0 bg-black/30 backdrop-blur-[1px]`,onClick:n}),(0,N.jsxs)(`div`,{className:`safe-overlay-panel relative flex w-full max-w-lg flex-col overflow-hidden rounded-2xl border border-border bg-bg shadow-2xl sm:rounded-xl ${s}`,children:[(0,N.jsxs)(`header`,{className:`flex shrink-0 items-center gap-2 border-b border-border py-2.5 pl-5 pr-2.5`,children:[(0,N.jsx)(`h2`,{className:`min-w-0 flex-1 truncate text-lg`,children:e}),(0,N.jsx)(t,{variant:`ghost`,size:`sm`,iconOnly:!0,onClick:n,"aria-label":`关闭`,children:(0,N.jsx)(a,{})})]}),(0,N.jsx)(`div`,{className:`min-h-0 px-4 py-4 sm:px-5 ${o?`overflow-y-auto overscroll-contain`:`flex flex-1 flex-col overflow-hidden`}`,children:r})]})]})}function $({label:e,children:t,testId:n}){return(0,N.jsx)(J,{label:e,testId:n,children:()=>t})}var ee=Y;export{b as S,A as _,K as a,T as b,q as c,V as d,I as f,O as g,k as h,J as i,Z as l,j as m,ee as n,Y as o,P as p,Q as r,X as s,$ as t,G as u,E as v,x,D as y};
@@ -0,0 +1 @@
1
+ import{at as e,b as t,h as n,ht as r,lt as i,mt as a,o,p as s,s as c,t as l,ut as u,vt as d}from"./Form-BKTwiYyw.js";import{B as f,F as p,I as m,L as h,R as g,V as _,z as v}from"./index-DQh72lEx.js";var y=d(r(),1),b=a();function x(e){let t=(e+`=`.repeat((4-e.length%4)%4)).replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t),r=new Uint8Array(new ArrayBuffer(n.length));for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function S(e,t){if(!e)return!1;let n=new Uint8Array(e);return n.length===t.length&&n.every((e,n)=>e===t[n])}var C=e=>e instanceof i||e instanceof Error?e.message:String(e);function w(){return window.isSecureContext?f()?`ok`:`unsupported`:`insecure`}var T=()=>/iPhone|iPad|iPod/.test(navigator.userAgent)||navigator.platform===`MacIntel`&&navigator.maxTouchPoints>1;function E(){let r=w(),[a,d]=(0,y.useState)(m),[f,E]=(0,y.useState)(null),[D,O]=(0,y.useState)(()=>`Notification`in window?Notification.permission:`unavailable`),[k,A]=(0,y.useState)(!1),[j,M]=(0,y.useState)(null),[N,P]=(0,y.useState)([]),[F,I]=(0,y.useState)(null),L=(0,y.useCallback)(async()=>{let e=r===`ok`?await v():null,t=e?await u(`/api/push/settings?endpoint=${encodeURIComponent(e.endpoint)}`).catch(()=>null):null;t?.subscribed&&(d(t.kinds),g(t.kinds)),E(t?.subscribed?e:null),I(t?.subscribed?t.id:null),P(await u(`/api/push/subscriptions`).catch(()=>[]))},[r]);(0,y.useEffect)(()=>{L()},[L]);async function R(){A(!0),M(null);try{let e=await Notification.requestPermission();if(O(e),e!==`granted`)throw Error(e===`denied`?`通知权限被拒绝,请在浏览器或系统设置里允许本站通知`:`没有获得通知权限`);let t=await _();if(!t)throw Error(`Service Worker 未注册成功`);await navigator.serviceWorker.ready;let{publicKey:n}=await u(`/api/push/key`),r=x(n),i=await t.pushManager.getSubscription();i&&!S(i.options.applicationServerKey,r)&&(await i.unsubscribe(),i=null),i??=await t.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:r}),await u(`/api/push/subscribe`,{method:`POST`,json:{subscription:i.toJSON(),kinds:a}}),M({ok:!0,text:`已在此设备开启推送`}),await L()}catch(e){M({ok:!1,text:`开启失败:${C(e)}`})}finally{A(!1)}}async function z(){A(!0),M(null);try{f&&(await u(`/api/push/subscribe`,{method:`DELETE`,json:{endpoint:f.endpoint}}),await f.unsubscribe().catch(()=>{})),M({ok:!0,text:`已关闭此设备的推送`}),await L()}catch(e){M({ok:!1,text:C(e)})}finally{A(!1)}}async function B(e,t){let n={...a,[e]:t};d(n),g(n),f&&await u(`/api/push/settings`,{method:`PATCH`,json:{endpoint:f.endpoint,kinds:{[e]:t}}}).catch(e=>M({ok:!1,text:C(e)}))}async function V(){A(!0),M(null);try{f?(await u(`/api/push/test`,{method:`POST`,json:{endpoint:f.endpoint}}),M({ok:!0,text:`测试通知已发出,几秒内应在系统通知里出现`})):(await h({kind:`done`,title:`测试通知`,body:`页面打开时,提醒会这样出现。`,tag:`test`},{force:!0}),M({ok:!0,text:`已显示页面内提醒`}))}catch(e){M({ok:!1,text:C(e)}),e instanceof i&&e.status===410&&await L()}finally{A(!1)}}async function H(e){await u(`/api/push/subscribe`,{method:`DELETE`,json:{id:e}}).catch(()=>{}),await L()}return(0,b.jsxs)(`div`,{className:`space-y-5 text-sm`,"data-testid":`notification-settings`,children:[(0,b.jsxs)(`section`,{className:`space-y-2`,children:[(0,b.jsx)(`h3`,{className:`text-base`,children:`此设备的推送`}),(0,b.jsx)(`p`,{className:`text-xs leading-relaxed text-muted`,children:`会话完成、需要你回答问题或审批计划、出错时提醒你。页面打开时在页面内提醒;开启推送后,关掉页面也能在系统通知里收到。`}),r===`insecure`&&(0,b.jsxs)(`p`,{className:`flex items-start gap-2 rounded-lg border border-border bg-surface-2/60 p-3 leading-relaxed`,"data-testid":`push-insecure`,children:[(0,b.jsx)(s,{className:`mt-0.5 shrink-0 text-muted`}),`当前通过 http 访问,浏览器不允许推送。需要 https(例如 Tailscale serve)才能在手机上收推送。页面打开时仍会在页面内提醒。`]}),r===`unsupported`&&(0,b.jsxs)(`p`,{className:`flex items-start gap-2 rounded-lg border border-border bg-surface-2/60 p-3 leading-relaxed`,children:[(0,b.jsx)(s,{className:`mt-0.5 shrink-0 text-muted`}),T()?`iPhone / iPad 上需要先在 Safari 里「添加到主屏幕」,再从主屏图标打开,才能开启推送(iOS 16.4 及以上)。`:`这个浏览器不支持 Web Push。页面打开时仍会在页面内提醒。`]}),r===`ok`&&(0,b.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 rounded-lg border border-border bg-surface px-3 py-2.5`,children:[(0,b.jsx)(n,{className:f?`text-accent`:`text-muted`}),(0,b.jsx)(`span`,{className:`min-w-0 flex-1`,children:(0,b.jsx)(`span`,{className:f?`font-medium text-ok`:`text-muted`,"data-testid":`push-status`,children:f?`已开启`:D===`denied`?`通知权限被拒绝`:`未开启`})}),f?(0,b.jsx)(e,{loading:k,onClick:z,children:`关闭推送`}):(0,b.jsx)(e,{variant:`primary`,loading:k,onClick:R,children:`开启推送`})]})]}),(0,b.jsxs)(`section`,{children:[(0,b.jsx)(`h3`,{className:`mb-1 text-base`,children:`提醒哪些事`}),(0,b.jsx)(`div`,{className:`divide-y divide-border rounded-lg border border-border bg-surface px-3`,children:Object.keys(p).map(e=>(0,b.jsx)(o,{label:p[e],checked:a[e],onChange:t=>void B(e,t)},e))})]}),(0,b.jsxs)(`section`,{className:`flex flex-wrap items-center gap-3`,children:[(0,b.jsx)(e,{disabled:k,onClick:V,icon:(0,b.jsx)(n,{size:14}),children:`发送测试通知`}),j&&(0,b.jsxs)(`p`,{role:j.ok?`status`:`alert`,className:`flex items-center gap-1.5 ${j.ok?`text-ok`:`text-danger`}`,children:[j.ok?(0,b.jsx)(t,{className:`shrink-0`}):(0,b.jsx)(s,{className:`shrink-0`}),j.text]})]}),N.length>0&&(0,b.jsxs)(`section`,{children:[(0,b.jsx)(`h3`,{className:`mb-1 text-base`,children:`已开启推送的设备`}),(0,b.jsx)(`ul`,{className:`divide-y divide-border rounded-lg border border-border bg-surface`,children:N.map(e=>(0,b.jsxs)(`li`,{className:`flex flex-wrap items-center gap-2 py-1.5 pl-3 pr-1.5`,children:[(0,b.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,b.jsxs)(`span`,{className:`flex min-w-0 items-center gap-1.5`,children:[(0,b.jsx)(`span`,{className:`truncate`,children:e.device}),F===e.id&&(0,b.jsx)(c,{tone:`accent`,children:`(此设备)`})]}),(0,b.jsxs)(`span`,{className:`block text-xs text-muted`,children:[new Date(e.createdAt).toLocaleDateString(),` 开启`,e.lastSuccessAt?` · 最近送达 ${new Date(e.lastSuccessAt).toLocaleString()}`:` · 还没有送达记录`]})]}),(0,b.jsx)(l,{variant:`ghost`,confirmText:`停止推送到这台设备?`,onConfirm:()=>void H(e.id),label:`移除 ${e.device}`,children:`移除`})]},e.id))})]})]})}export{E as NotificationSettings};
@@ -0,0 +1 @@
1
+ import{C as e,I as t,K as n,S as r,Z as i,a,at as o,k as s,mt as c,n as l,s as u}from"./Form-BKTwiYyw.js";import{_ as d}from"./Modal-g2rv8I_n.js";import{t as f}from"./lib-DlcVMUqT.js";import{f as p}from"./index-DQh72lEx.js";var m=c();function h(){let c=d(),h=c.data??[],_=h.filter(e=>e.waitingFor.length>0||e.state===`requires_action`).length,v=h.filter(e=>e.state===`running`).length,y=h.some(e=>e.cronIds!==void 0)?new Set(h.flatMap(e=>e.cronIds??[])).size:h.reduce((e,t)=>e+t.crons,0),b=h.reduce((e,t)=>e+t.tasks,0),x=e=>e.waitingFor.length||e.state===`requires_action`?0:e.state===`running`?1:2,S=new Map;for(let e of[...h].sort((e,t)=>x(e)-x(t))){let t=S.get(e.projectId)??{name:e.projectName,items:[]};t.items.push(e),S.set(e.projectId,t)}return(0,m.jsx)(`main`,{className:`min-h-0 flex-1 overflow-y-auto`,children:(0,m.jsxs)(`div`,{className:`mx-auto max-w-4xl px-4 py-8 md:px-8 md:py-10`,children:[(0,m.jsxs)(`div`,{className:`flex flex-wrap items-start gap-3`,children:[(0,m.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,m.jsx)(`h1`,{className:`text-3xl`,children:`运行总览`}),(0,m.jsx)(`p`,{className:`mt-1 text-sm text-muted`,children:`所有项目里正在运行、等你处理,或有定时任务的会话。每 30 秒自动刷新。`})]}),(0,m.jsx)(o,{size:`sm`,variant:`ghost`,icon:(0,m.jsx)(n,{}),onClick:()=>c.refetch(),loading:c.isFetching,children:`刷新`})]}),(0,m.jsxs)(`div`,{className:`mt-6 grid grid-cols-2 gap-3 md:grid-cols-4`,children:[(0,m.jsx)(g,{label:`等你处理`,value:_,tone:_?`warn`:void 0}),(0,m.jsx)(g,{label:`运行中`,value:v,tone:v?`accent`:void 0}),(0,m.jsx)(g,{label:`定时任务`,value:y}),(0,m.jsx)(g,{label:`后台任务`,value:b})]}),c.isPending&&(0,m.jsx)(`div`,{className:`mt-8`,children:(0,m.jsx)(a,{rows:3})}),(0,m.jsx)(`div`,{className:`mt-8 space-y-6`,"data-testid":`overview-list`,children:[...S.entries()].map(([n,a])=>(0,m.jsxs)(`section`,{children:[(0,m.jsxs)(`div`,{className:`mb-2 flex items-center gap-2`,children:[(0,m.jsx)(s,{className:`text-muted`}),(0,m.jsx)(f,{to:`/p/${n}`,className:`text-sm font-medium hover:text-accent`,children:a.name}),(0,m.jsxs)(`span`,{className:`text-xs text-muted`,children:[a.items.length,` 个会话`]})]}),(0,m.jsx)(`ul`,{className:`grid gap-2 md:grid-cols-2`,children:a.items.map(n=>(0,m.jsx)(`li`,{children:(0,m.jsxs)(f,{to:`/p/${n.projectId}/s/${n.sessionId}`,className:`flex h-full items-start gap-3 rounded-xl border border-border bg-surface px-4 py-3 shadow-sm transition-colors hover:border-muted/40`,"data-testid":`overview-item`,"data-state":n.state,children:[(0,m.jsx)(`span`,{className:`mt-1.5`,children:(0,m.jsx)(p,{state:n.state})}),(0,m.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,m.jsx)(`span`,{className:`line-clamp-2 text-sm font-medium`,children:n.title}),(0,m.jsxs)(`span`,{className:`mt-1.5 flex flex-wrap gap-1.5`,children:[n.waitingFor.includes(`ask`)&&(0,m.jsx)(u,{tone:`warn`,children:`等你回答问题`}),n.waitingFor.includes(`plan`)&&(0,m.jsx)(u,{tone:`warn`,children:`等你审批计划`}),n.state===`running`&&(0,m.jsx)(u,{tone:`accent`,icon:(0,m.jsx)(i,{size:11}),children:`运行中`}),n.crons>0&&(0,m.jsxs)(u,{icon:(0,m.jsx)(e,{size:11}),children:[n.crons,` 个定时任务`]}),n.tasks>0&&(0,m.jsxs)(u,{icon:(0,m.jsx)(t,{size:11}),children:[n.tasks,` 个后台任务`]})]})]}),(0,m.jsx)(r,{className:`mt-1 shrink-0 text-muted`})]})},n.sessionId))})]},n))}),c.isSuccess&&h.length===0&&(0,m.jsx)(`div`,{className:`mt-2`,children:(0,m.jsx)(l,{icon:(0,m.jsx)(i,{size:16}),title:`现在没有正在运行的会话`,action:(0,m.jsx)(f,{to:`/`,className:`inline-flex h-10 items-center rounded-md border border-border bg-surface px-3 text-sm font-medium hover:bg-surface-2 md:h-8`,children:`去项目列表`}),children:`会话开始运行、需要你回答问题或审批计划、设置了定时任务时,会出现在这里,方便在多个项目之间来回照看。`})})]})})}function g({label:e,value:t,tone:n}){return(0,m.jsxs)(`div`,{className:`rounded-xl border border-border bg-surface px-4 py-3`,children:[(0,m.jsx)(`div`,{className:`text-xs text-muted`,children:e}),(0,m.jsx)(`div`,{className:`mt-1 font-serif text-2xl tabular-nums ${n===`accent`?`text-accent`:n===`warn`?`text-amber-600 dark:text-amber-400`:``}`,children:t})]})}export{h as OverviewPage};
@@ -0,0 +1 @@
1
+ import{at as e,k as t,mt as n,ut as r,v as i}from"./Form-BKTwiYyw.js";import{b as a,m as o,v as s,y as c}from"./Modal-g2rv8I_n.js";import{I as l,g as u,m as d,t as f}from"./lib-DlcVMUqT.js";import{M as p,S as m,T as h,f as g,m as _}from"./index-DQh72lEx.js";var v=n();function y({pid:n}){let o=h(n),f=s().data?.find(e=>e.id===n),g=c(n),y=u({queryKey:[`git-status`,n],queryFn:()=>r(`/api/projects/${n}/git/status`),staleTime:15e3}),C=d(),w=l(),T=a({mutationFn:()=>r(`/api/projects/${n}/sessions`,{method:`POST`}),onSuccess:({id:e})=>{w.invalidateQueries({queryKey:[`sessions`,n]}),C(`/p/${n}/s/${e}`)}}),E=(g.data??[]).filter(e=>!e.archived),D=E.filter(e=>e.state===`running`).length,O=E.filter(e=>e.state===`requires_action`||e.needsAttention).length,k=y.data?.isRepo?y.data.changes.length:void 0,A=[...E].sort((e,t)=>t.lastModified-e.lastModified).slice(0,8);return(0,v.jsx)(`main`,{className:`min-h-0 flex-1 overflow-y-auto`,"data-testid":`project-home`,children:(0,v.jsxs)(`div`,{className:`mx-auto max-w-4xl px-8 py-10`,children:[(0,v.jsxs)(`div`,{className:`flex items-start gap-4`,children:[(0,v.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,v.jsx)(`h1`,{className:`truncate text-3xl`,children:f?.name??`项目`}),(0,v.jsxs)(`div`,{className:`mt-1 flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted`,children:[(0,v.jsxs)(`span`,{className:`inline-flex min-w-0 max-w-full items-center gap-1.5 font-mono`,children:[(0,v.jsx)(t,{className:`shrink-0`}),(0,v.jsx)(`span`,{className:`min-w-0 truncate`,title:f?.path,children:f?.path}),f?.path&&(0,v.jsx)(_,{text:f.path,label:`复制项目路径`},f.path)]}),y.data?.isRepo&&y.data.branch&&(0,v.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-1.5 font-mono`,children:[(0,v.jsx)(i,{className:`shrink-0`}),(0,v.jsx)(`span`,{className:`truncate`,children:y.data.branch})]})]})]}),(0,v.jsx)(e,{variant:`primary`,icon:(0,v.jsx)(p,{}),onClick:()=>T.mutate(),loading:T.isPending,children:`新会话`})]}),(0,v.jsxs)(`div`,{className:`mt-8 grid grid-cols-2 gap-3 lg:grid-cols-4`,children:[(0,v.jsx)(b,{label:`会话`,value:E.length}),(0,v.jsx)(b,{label:`运行中`,value:D,tone:D?`accent`:void 0}),(0,v.jsx)(b,{label:`等你处理`,value:O,tone:O?`warn`:void 0}),(0,v.jsx)(b,{label:`未提交改动`,value:k??`—`,to:k===void 0?void 0:`/p/${n}/changes`})]}),(0,v.jsxs)(`section`,{className:`mt-10`,children:[(0,v.jsxs)(`div`,{className:`mb-3 flex items-baseline justify-between`,children:[(0,v.jsx)(`h2`,{className:`text-lg`,children:`最近的会话`}),(0,v.jsx)(`span`,{className:`text-xs text-muted`,children:E.length>A.length?`另有 ${E.length-A.length} 个在左侧列表`:``})]}),A.length?(0,v.jsx)(`ul`,{className:`grid gap-2 md:grid-cols-2`,children:A.map(e=>(0,v.jsx)(`li`,{children:(0,v.jsx)(x,{pid:n,s:e})},e.id))}):(0,v.jsxs)(`div`,{className:`rounded-xl border border-dashed border-border px-6 py-10 text-center text-sm text-muted`,children:[`这个项目还没有会话。点右上角"新会话"开始;在终端里用 `,(0,v.jsx)(`code`,{className:`font-mono`,children:`claude`}),` 开的会话也会出现在这里。`]})]}),(0,v.jsxs)(`section`,{className:`mt-10 grid gap-3 md:grid-cols-3`,children:[(0,v.jsx)(S,{to:m(n,o.file),title:`浏览文件`,body:`文件树、代码高亮、按名称和内容搜索。`}),(0,v.jsx)(S,{to:`/p/${n}/changes`,title:`查看变更`,body:`git 状态和每个文件的 diff。`}),(0,v.jsx)(S,{to:`/p/${n}/worktrees`,title:`工作区`,body:`为一个任务开独立的 git worktree,并行改代码。`})]})]})})}function b({label:e,value:t,tone:n,to:r}){let i=(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`div`,{className:`text-xs text-muted`,children:e}),(0,v.jsx)(`div`,{className:`mt-1 font-serif text-2xl tabular-nums ${n===`accent`?`text-accent`:n===`warn`?`text-amber-600 dark:text-amber-400`:``}`,children:t})]}),a=`block rounded-xl border border-border bg-surface px-4 py-3`;return r?(0,v.jsx)(f,{to:r,className:`${a} transition-colors hover:border-muted/40`,children:i}):(0,v.jsx)(`div`,{className:a,children:i})}function x({pid:e,s:t}){return(0,v.jsxs)(f,{to:`/p/${e}/s/${t.id}`,className:`flex h-full flex-col rounded-xl border border-border bg-surface px-4 py-3 transition-colors hover:border-muted/40`,children:[(0,v.jsx)(`span`,{className:`line-clamp-2 text-sm font-medium`,children:t.title||(t.draft?`新会话`:`未命名会话`)}),(0,v.jsxs)(`span`,{className:`mt-auto flex items-center gap-1.5 pt-2 text-xs text-muted`,children:[t.state!==`idle`&&(0,v.jsx)(g,{state:t.state}),o(t.lastModified),t.worktree&&(0,v.jsxs)(`span`,{className:`truncate font-mono`,children:[`· ⎇ `,t.worktree]}),t.pinned&&(0,v.jsx)(`span`,{className:`text-accent`,children:`· 置顶`})]})]})}function S({to:e,title:t,body:n}){return(0,v.jsxs)(f,{to:e,className:`rounded-xl border border-border px-4 py-3 transition-colors hover:border-muted/40 hover:bg-surface`,children:[(0,v.jsxs)(`div`,{className:`text-sm font-medium`,children:[t,` →`]}),(0,v.jsx)(`div`,{className:`mt-1 text-xs leading-relaxed text-muted`,children:n})]})}export{y as ProjectHome};
@@ -0,0 +1,2 @@
1
+ import{$ as e,C as t,G as n,K as r,M as i,Q as a,S as o,U as s,V as c,Y as l,Z as u,_ as d,at as f,b as p,ct as m,d as h,ht as g,i as _,k as v,lt as y,mt as b,o as x,r as S,s as C,u as w,ut as T,v as E,vt as ee,y as D}from"./Form-BKTwiYyw.js";import{a as O,b as k,c as te,f as ne,g as A,h as re,l as j,n as M,p as N,r as P,t as F,v as I,y as L}from"./Modal-g2rv8I_n.js";import{I as R,g as z,h as B,m as V,t as H}from"./lib-DlcVMUqT.js";import{A as U,D as W,G,H as K,J as q,K as J,N as Y,O as ie,P as ae,U as oe,W as se,Y as ce,Z as le,_ as X,a as ue,c as de,f as fe,h as pe,i as me,j as he,k as ge,l as _e,m as ve,o as ye,p as be,q as xe,r as Se,s as Ce,u as we}from"./index-DQh72lEx.js";import{a as Te,f as Ee,i as Z,n as De,o as Oe,r as ke,s as Ae,t as je,u as Me}from"./MessageList-DD9GypSy.js";import{t as Ne}from"./Markdown-IwP-xF29.js";import{a as Pe,c as Fe,d as Ie,i as Le,l as Re,n as ze,o as Be,r as Ve,s as He,t as Ue,u as We}from"./AnnotationSelection-BZmNmwVW.js";var Q=ee(g(),1),$=b();function Ge({todos:e}){let[t,n]=(0,Q.useState)(!1);if(e.length===0)return null;let r=e.filter(e=>e.status===`completed`).length,i=e.find(e=>e.status===`in_progress`);return(0,$.jsxs)(`div`,{className:`mb-2 rounded-xl border border-border bg-surface/80 text-sm`,"data-testid":`todo-panel`,children:[(0,$.jsxs)(`button`,{className:`flex w-full min-w-0 items-center gap-2 px-3 py-2 text-left`,onClick:()=>n(e=>!e),"aria-expanded":t,children:[(0,$.jsx)(ie,{open:t}),(0,$.jsxs)(`span`,{className:`shrink-0 font-medium`,children:[`待办 `,r,`/`,e.length]}),(0,$.jsx)(`span`,{className:`min-w-0 truncate text-muted`,children:i?i.activeForm||i.subject:r===e.length?`全部完成`:``}),(0,$.jsx)(`span`,{className:`ml-auto h-1.5 w-16 shrink-0 overflow-hidden rounded-full bg-surface-2`,children:(0,$.jsx)(`span`,{className:`block h-full bg-accent`,style:{width:`${r/e.length*100}%`}})})]}),t&&(0,$.jsx)(`ul`,{className:`max-h-60 space-y-1 overflow-y-auto border-t border-border px-3 py-2`,children:e.map(e=>(0,$.jsxs)(`li`,{className:`flex items-start gap-2`,"data-status":e.status,children:[(0,$.jsx)(`span`,{className:`mt-0.5 shrink-0 ${e.status===`completed`?`text-ok`:e.status===`in_progress`?`text-accent`:`text-muted`}`,children:e.status===`completed`?`✓`:e.status===`in_progress`?`◐`:`○`}),(0,$.jsx)(`span`,{className:e.status===`completed`?`text-muted line-through`:``,children:e.subject})]},e.id))})]})}function Ke(e,t){let n=X();return async(r=``,i)=>(await n({title:`压缩上下文?`,description:`后续推理将使用压缩摘要,部分讨论细节可能不再包含在上下文中。历史对话仍保留。${r.trim()?`\n\n压缩说明:${r.trim()}`:``}`,confirmLabel:`确认压缩`})).confirmed?(G({t:`send`,projectId:e,sessionId:t,uuid:Z(),text:`/compact${r.trim()?` ${r.trim()}`:``}`,...i?.length?{images:i}:{}}),!0):!1}function qe(e,t){let n=X();return async r=>(await n({title:`清除当前目标?`,description:`${r?`当前目标:${r}。`:``}将取消持续推进这个目标,已经完成的操作不会撤销。`,confirmLabel:`清除目标`,danger:!0})).confirmed?(G({t:`send`,projectId:e,sessionId:t,uuid:Z(),text:`/goal clear`}),!0):!1}function Je(e,t,n){G({t:`send`,sessionId:t,projectId:e,uuid:Z(),text:n})}function Ye(e){if(!e)return``;let t=Math.round((e-Date.now())/1e3);return t<=0?`即将执行`:t<60?`${t} 秒后`:t<3600?`${Math.round(t/60)} 分钟后`:new Date(e).toLocaleString()}function Xe({pid:n,sid:r,snapshot:o,turns:s,historyRevision:c,resetCount:l}){let u=qe(n,r),d=Ie(e=>e.mode),[f,p]=(0,Q.useState)(null),m=(0,Q.useRef)(null),h=z({queryKey:[`goal`,r,n,c,l,s,o.state],queryFn:({signal:e})=>T(`/api/projects/${n}/sessions/${r}/goal`,{signal:e})}).data,g=o.tasks.filter(e=>e.status===`running`),_=e=>p(t=>t===e?null:e),v=()=>p(null);return(0,$.jsxs)(`div`,{className:`mb-2 text-sm`,"data-testid":`automation-bar`,children:[(0,$.jsxs)(`div`,{className:`flex items-start gap-1`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-wrap items-center gap-1`,children:[(0,$.jsx)(O,{compactOnMobile:!0,shape:`rounded`,active:f===`goal`,onClick:()=>_(`goal`),testId:`goal-chip`,tone:h?.status===`active`?`accent`:h?.status===`met`?`ok`:`neutral`,icon:(0,$.jsx)(a,{}),onRemove:h?.status===`active`?()=>{u(h.condition)}:void 0,removeLabel:`清除目标`,children:h?.status===`active`?`目标:${h.condition}`:h?.status===`met`?`目标已达成`:`目标`}),(0,$.jsx)(O,{compactOnMobile:!0,shape:`rounded`,checked:d,onClick:()=>Re(!d),ariaLabel:`批注模式`,tone:d?`accent`:`neutral`,icon:(0,$.jsx)(D,{}),children:`批注`}),(0,$.jsx)(Qe,{pid:n,sid:r,enabled:o.askQuestionsEnabled!==!1},`${n}:${r}`),(0,$.jsx)($e,{pid:n,sid:r,readOnly:o.writeEnabled===!1},`read-only:${n}:${r}`),o.crons.length>0&&(0,$.jsxs)(O,{compactOnMobile:!0,shape:`rounded`,active:f===`crons`,onClick:()=>_(`crons`),testId:`crons-chip`,tone:`accent`,icon:(0,$.jsx)(t,{}),children:[`定时任务 `,o.crons.length]}),o.tasks.length>0&&(0,$.jsxs)(O,{compactOnMobile:!0,shape:`rounded`,active:f===`tasks`,onClick:()=>_(`tasks`),testId:`tasks-chip`,tone:g.length?`accent`:`neutral`,icon:(0,$.jsx)(e,{}),children:[`后台 `,g.length,`/`,o.tasks.length]})]}),(0,$.jsx)(`button`,{ref:m,type:`button`,"aria-label":`使用引导`,title:`使用引导`,"aria-haspopup":`dialog`,"aria-expanded":f===`guide`,onClick:()=>_(`guide`),className:`inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted transition-colors hover:bg-surface-2 hover:text-text focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/40`,children:(0,$.jsx)(i,{size:16})})]}),f&&(0,$.jsxs)(`div`,{className:`mt-2`,children:[f===`goal`&&(0,$.jsx)(et,{pid:n,sid:r,goal:h??null,onDone:v},`${n}:${r}:${c??``}:${l}`),f===`crons`&&(0,$.jsx)(tt,{pid:n,sid:r,crons:o.crons,onClose:v}),f===`tasks`&&(0,$.jsx)(nt,{pid:n,sid:r,tasks:o.tasks,agentTasks:o.agentTasks??[],onClose:v},`${n}:${r}`),f===`guide`&&(0,$.jsx)(Ze,{onClose:()=>{v(),m.current?.focus()}})]})]})}function Ze({onClose:r}){return(0,$.jsxs)(P,{title:`会话使用引导`,onClose:r,testId:`composer-guide`,children:[(0,$.jsx)(`p`,{className:`mb-4 text-sm text-muted`,children:`批注、提问和只读高亮时表示已开启。`}),(0,$.jsxs)(`dl`,{className:`space-y-4 text-sm leading-relaxed`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`dt`,{className:`mb-1 flex items-center gap-2 font-medium`,children:[(0,$.jsx)(a,{}),`目标`]}),(0,$.jsx)(`dd`,{className:`text-muted`,children:`写下完成条件,Claude 会持续推进,直到达成。点击目标可以查看、修改或清除。`})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`dt`,{className:`mb-1 flex items-center gap-2 font-medium`,children:[(0,$.jsx)(D,{}),`批注`]}),(0,$.jsx)(`dd`,{className:`text-muted`,children:`开启后,选中消息中的文字即可添加批注。文件源码始终支持批注。批注会保留在输入框上方,可编辑或删除,随下一条消息发送。`})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`dt`,{className:`mb-1 flex items-center gap-2 font-medium`,children:[(0,$.jsx)(n,{}),`提问`]}),(0,$.jsx)(`dd`,{className:`text-muted`,children:`控制 Claude 是否可以通过提问卡片向你确认信息。关闭后,Claude 会根据已有信息继续,或在回复中说明缺少的信息。`})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`dt`,{className:`mb-1 flex items-center gap-2 font-medium`,children:[(0,$.jsx)(l,{}),`只读`]}),(0,$.jsx)(`dd`,{className:`text-muted`,children:`开启后只放行已知的只读工具,禁用命令执行、文件写入和无法确认用途的扩展工具。普通会话默认关闭,btw 默认开启;btw 还禁止创建或操作子代理。它与计划模式独立,只影响后续操作,不会停止或撤销已经开始的操作。`})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`dt`,{className:`mb-1 flex items-center gap-2 font-medium`,children:[(0,$.jsx)(t,{}),`定时任务`]}),(0,$.jsx)(`dd`,{className:`text-muted`,children:`有定时任务时会显示入口,分为“本会话”“本项目持久”和“IDECron”三类,可以查看执行时间和任务内容,也可以取消任务。`})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`dt`,{className:`mb-1 flex items-center gap-2 font-medium`,children:[(0,$.jsx)(e,{}),`后台`]}),(0,$.jsx)(`dd`,{className:`text-muted`,children:`有后台任务时会显示入口,可以查看状态和输出、打开子代理过程,或停止仍在运行的任务。`})]})]}),(0,$.jsx)(`div`,{className:`mt-5 flex justify-end`,children:(0,$.jsx)(f,{onClick:r,children:`知道了`})})]})}function Qe({pid:e,sid:t,enabled:r}){let i=k({mutationFn:n=>T(`/api/projects/${e}/sessions/${t}`,{method:`PATCH`,json:{askQuestionsEnabled:n}})});return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(O,{compactOnMobile:!0,shape:`rounded`,checked:r,onClick:()=>i.mutate(!r),ariaLabel:`允许提问`,disabled:i.isPending,tone:r?`accent`:`neutral`,icon:(0,$.jsx)(n,{}),children:`提问`}),i.error&&(0,$.jsxs)(`p`,{role:`alert`,className:`basis-full text-xs text-danger`,children:[`提问设置保存失败:`,i.error.message]})]})}function $e({pid:e,sid:t,readOnly:n}){let r=k({mutationFn:n=>T(`/api/projects/${e}/sessions/${t}`,{method:`PATCH`,json:{writeEnabled:!n}})});return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(O,{compactOnMobile:!0,shape:`rounded`,checked:n,onClick:()=>r.mutate(!n),ariaLabel:`只读`,disabled:r.isPending,tone:n?`accent`:`neutral`,icon:(0,$.jsx)(l,{}),children:`只读`}),r.error&&(0,$.jsxs)(`p`,{role:`alert`,className:`basis-full text-xs text-danger`,children:[`只读设置保存失败:`,r.error.message]})]})}function et({pid:e,sid:t,goal:n,onDone:r}){let i=qe(e,t),[a,o]=(0,Q.useState)(n?.status===`active`?n.condition:``),s=(0,Q.useRef)(!1);(0,Q.useEffect)(()=>{s.current||o(n?.status===`active`?n.condition:``)},[n?.condition,n?.status]);let c=n?.status===`active`;return(0,$.jsxs)(P,{title:c?`修改目标`:`设定目标`,onClose:r,testId:`goal-panel`,scrollBody:!1,panelClassName:`goal-dialog sm:max-w-2xl`,children:[(0,$.jsxs)(`p`,{className:`mb-3 max-h-28 shrink-0 overflow-y-auto overscroll-contain text-sm leading-relaxed text-muted`,children:[n?.status===`active`&&`Claude 会一直推进,直到这个条件成立;每一轮结束都会检查一次。`,n?.status===`met`&&(0,$.jsxs)($.Fragment,{children:[`上一个目标已达成:`,n.condition]}),n?.status===`failed`&&(0,$.jsxs)($.Fragment,{children:[`上一个目标无法达成:`,n.reason??n.condition]}),(!n||n.status===`cleared`)&&`写下「完成」的条件。设定后 Claude 会持续工作,直到条件成立。`,n?.reason&&n.status===`active`&&(0,$.jsxs)(`span`,{className:`mt-1 block`,children:[`最近一次检查:`,n.reason]})]}),(0,$.jsxs)(`form`,{className:`flex min-h-0 flex-1 flex-col`,onSubmit:n=>{n.preventDefault(),a.trim()&&(Je(e,t,`/goal ${a.trim()}`),r())},children:[(0,$.jsx)(`textarea`,{"aria-label":`目标条件`,placeholder:`例如:所有测试通过,并且 README 写了使用说明`,value:a,rows:12,onChange:e=>{s.current=!0,o(e.target.value)},onKeyDown:e=>{e.key===`Enter`&&(e.ctrlKey||e.metaKey)&&!e.nativeEvent.isComposing&&(e.preventDefault(),e.currentTarget.form?.requestSubmit())},className:`block min-h-0 w-full flex-1 resize-none touch-pan-y overflow-y-auto overscroll-contain rounded-md border border-border bg-bg px-3 py-3 text-base leading-relaxed outline-none focus:border-accent/60 focus:ring-2 focus:ring-accent/20`}),(0,$.jsxs)(`div`,{className:`mt-3 flex shrink-0 flex-wrap items-center justify-end gap-2`,children:[c&&(0,$.jsx)(f,{variant:`outline-danger`,className:`mr-auto`,onClick:async()=>{await i(n.condition)&&r()},children:`清除目标`}),(0,$.jsx)(f,{variant:`ghost`,onClick:r,children:`取消`}),(0,$.jsx)(f,{type:`submit`,variant:`primary`,disabled:!a.trim(),children:c?`修改目标`:`设定目标`})]})]})]})}function tt({pid:e,sid:n,crons:r,onClose:i}){let a=X(),[o,s]=(0,Q.useState)(new Set);(0,Q.useEffect)(()=>{if(!o.size)return;let e=setTimeout(()=>s(new Set),3e4);return()=>clearTimeout(e)},[o]),(0,Q.useEffect)(()=>{s(e=>{let t=new Set([...e].filter(e=>r.some(t=>t.id===e)));return t.size===e.size?e:t})},[r]);let c=[{key:`session`,label:`本会话`,items:r.filter(e=>!e.durable&&!e.server)},{key:`project`,label:`本项目持久`,items:r.filter(e=>e.durable)},{key:`idecron`,label:`IDECron`,items:r.filter(e=>e.server)}].filter(e=>e.items.length>0),l=r=>(0,$.jsxs)(`li`,{className:`flex items-center gap-3 py-2`,"data-testid":`cron-item`,children:[(0,$.jsx)(t,{className:`shrink-0 text-muted`}),(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,$.jsx)(`div`,{className:`truncate`,children:r.prompt}),(0,$.jsxs)(`div`,{className:`mt-0.5 flex flex-wrap gap-x-2 text-xs text-muted`,children:[(0,$.jsx)(`span`,{className:`font-mono`,children:r.schedule}),(0,$.jsx)(`span`,{children:r.recurring?`循环`:`一次`}),r.server&&(0,$.jsx)(`span`,{children:r.mode===`next_turn`?`下一轮`:r.mode===`interrupt`?`中断后`:`steer`}),r.nextRun&&(0,$.jsxs)(`span`,{children:[`下次:`,Ye(r.nextRun)]})]})]}),(0,$.jsx)(f,{size:`sm`,variant:`outline-danger`,loading:o.has(r.id),onClick:async()=>{let t=r.server?`这是 claude-ide 服务端的 IDECron 任务。`:r.durable?`这是项目级持久任务,取消后该项目所有会话都不会再执行它。`:`这是本会话的定时任务。`;(await a({title:`取消定时任务?`,description:`任务:${r.prompt}。计划:${r.schedule}(${r.recurring?`循环`:`一次`})。${t}取消后不再按此计划触发,已经执行的操作不会撤销。`,confirmLabel:`取消任务`,cancelLabel:`保留任务`,danger:!0})).confirmed&&(s(e=>new Set(e).add(r.id)),r.server?G({t:`cancelIdecron`,sessionId:n,projectId:e,id:r.id}):Je(e,n,`Cancel the scheduled task with id ${r.id} by calling CronDelete. Do nothing else.`))},children:o.has(r.id)?`取消中`:`取消`})]},r.id);return(0,$.jsx)(te,{title:`定时任务 · ${r.length}`,onClose:i,testId:`crons-panel`,children:c.map(e=>(0,$.jsxs)(`section`,{"data-testid":`cron-group-${e.key}`,className:`mt-2 first:mt-0`,children:[(0,$.jsxs)(`h4`,{className:`mb-1 text-xs font-medium text-muted`,children:[e.label,` · `,e.items.length]}),(0,$.jsx)(`ul`,{className:`-my-1 divide-y divide-border`,children:e.items.map(l)})]},e.key))})}function nt({pid:e,sid:t,tasks:n,agentTasks:r,onClose:i}){let a=X(),o=V(),s=R(),c=(0,Q.useRef)(0);(0,Q.useEffect)(()=>()=>{c.current++},[e,t]);let[l,u]=(0,Q.useState)(),[d,p]=(0,Q.useState)(null),[m,h]=(0,Q.useState)(new Set),[g,_]=(0,Q.useState)(),v=async n=>{let a=++c.current;u(n.id),_(void 0);try{let l=Me(n,r);if(!l){let i=await s.fetchQuery(Ae(e,t,()=>T(`/api/projects/${e}/sessions/${t}/subagents`)));l=Me(n,r,i)}if(a!==c.current)return;if(!l)throw Error(`暂未找到这个子 agent 的过程记录,请稍后重试。`);i(),o(`/p/${e}/s/${t}/agent/${encodeURIComponent(l)}`)}catch(e){a===c.current&&_(e instanceof Error?e.message:String(e))}finally{a===c.current&&u(void 0)}};return(0,$.jsxs)(P,{title:`后台任务 · ${n.filter(e=>e.status===`running`).length} 个运行中`,onClose:i,testId:`tasks-panel`,panelClassName:`sm:max-w-3xl`,children:[(0,$.jsx)(`ul`,{className:`-my-1 divide-y divide-border`,children:n.map(n=>(0,$.jsxs)(`li`,{className:`flex items-center gap-2.5 py-2.5`,"data-testid":`task-item`,"data-status":n.status,children:[(0,$.jsx)(`span`,{className:`size-2 shrink-0 rounded-full ${n.status===`running`?`animate-pulse bg-accent`:n.status===`completed`?`bg-ok`:`bg-muted/50`}`,"aria-hidden":!0}),(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,$.jsx)(`div`,{className:`truncate`,title:n.description||n.command,children:n.description||n.command}),(0,$.jsxs)(`div`,{className:`mt-0.5 text-xs text-muted`,children:[rt[n.type]??n.type,` · `,it[n.status]??n.status]})]}),(0,$.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5`,children:[Ee(n.type)&&(0,$.jsx)(f,{size:`sm`,loading:l===n.id,onClick:()=>void v(n),"data-testid":`task-trace`,children:`查看过程`}),(0,$.jsx)(f,{size:`sm`,onClick:()=>p(n),children:`输出`}),n.status===`running`&&(0,$.jsx)(f,{size:`sm`,variant:`outline-danger`,loading:m.has(n.id),onClick:async()=>{if((await a({title:`停止后台任务?`,description:`任务:${n.description||n.command||n.id}。停止后不会撤销它已经产生的文件改动或其他操作。`,confirmLabel:`停止任务`,cancelLabel:`继续运行`,danger:!0})).confirmed){h(e=>new Set(e).add(n.id)),_(void 0);try{await T(`/api/projects/${e}/sessions/${t}/tasks/${n.id}/stop`,{method:`POST`})}catch(e){_(e instanceof Error?e.message:String(e))}finally{h(e=>{let t=new Set(e);return t.delete(n.id),t})}}},children:`停止`})]})]},n.id))}),g&&(0,$.jsx)(`p`,{role:`alert`,className:`mt-2 text-xs text-danger`,children:g}),d&&(0,$.jsx)(at,{pid:e,sid:t,task:d,onClose:()=>p(null)})]})}var rt={local_bash:`命令`,shell:`命令`,local_agent:`子 agent`,subagent:`子 agent`,monitor:`监控`},it={running:`运行中`,completed:`已完成`,failed:`失败`,killed:`已停止`,stopped:`已停止`};function at({pid:e,sid:t,task:n,onClose:r}){let i=z({queryKey:[`task-output`,t,n.id],queryFn:()=>T(`/api/projects/${e}/sessions/${t}/tasks/${n.id}/output`),refetchInterval:2e3});return(0,$.jsxs)(P,{title:n.description||n.command||`后台任务`,onClose:r,testId:`task-output`,children:[n.command&&(0,$.jsxs)(`pre`,{className:`mb-2 whitespace-pre-wrap break-all rounded bg-surface-2 px-2 py-1 font-mono text-xs`,children:[`$ `,n.command]}),(0,$.jsxs)(`pre`,{className:`max-h-[60dvh] overflow-auto whitespace-pre-wrap break-words font-mono text-xs`,"data-testid":`task-output-text`,children:[i.data?.truncated&&(0,$.jsxs)(`span`,{className:`text-muted`,children:[`…(只显示最后一部分)`,`
2
+ `]}),i.data?.output||(i.isPending?`加载中…`:`(暂无输出)`)]})]})}function ot({projectId:e,sessionId:t}){let n=Ie(e=>e.items),r=Ie(e=>e.storageError),i=n.filter(n=>n.projectId===e&&n.targetSessionId===t),[a,o]=(0,Q.useState)(null),s=i.find(e=>e.id===a);return(0,Q.useEffect)(()=>{Be()},[]),(0,Q.useEffect)(()=>{o(null)},[e,t]),!i.length&&!r?null:(0,$.jsxs)(`div`,{className:`mb-2 min-w-0 text-sm`,"data-testid":`composer-annotations`,"data-annotation-exclude":!0,children:[r&&(0,$.jsx)(`p`,{role:`alert`,"data-testid":`annotation-storage-error`,className:`mb-2 rounded-md border border-danger/30 bg-danger/5 px-3 py-2 text-xs text-danger`,children:r}),i.length>0&&(0,$.jsxs)(`details`,{className:`rounded-lg border border-accent/25 bg-accent/5`,children:[(0,$.jsxs)(`summary`,{className:`cursor-pointer select-none px-3 py-2 text-xs font-medium text-accent`,children:[`批注(`,i.length,`)`,(0,$.jsx)(`span`,{className:`ml-2 font-normal text-muted`,children:`随下一条消息发送`})]}),(0,$.jsx)(`ul`,{className:`max-h-64 space-y-2 overflow-y-auto border-t border-accent/15 p-2`,"data-testid":`annotation-list`,children:i.map(e=>(0,$.jsx)(st,{item:e,onEdit:()=>o(e.id)},e.id))})]}),s&&(0,$.jsx)(ze,{projectId:e,sessionId:t,source:s.source,quote:s.quote,annotation:s,onClose:()=>o(null)})]})}function st({item:e,onEdit:t}){return(0,$.jsxs)(`li`,{className:`min-w-0 rounded-md border border-border bg-bg px-3 py-2`,"data-annotation-id":e.id,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-start gap-2`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[e.source.kind===`file`&&(0,$.jsx)(`div`,{className:`mb-1.5 flex min-w-0`,children:(0,$.jsx)(Ve,{projectId:e.projectId,source:e.source})}),(0,$.jsx)(`blockquote`,{className:`max-h-24 overflow-auto whitespace-pre-wrap break-words border-l-2 border-border pl-2 font-mono text-xs text-muted`,children:e.quote})]}),(0,$.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[(0,$.jsx)(f,{variant:`ghost`,size:`sm`,onClick:t,"data-testid":`annotation-edit`,children:`编辑`}),(0,$.jsx)(f,{variant:`ghost`,size:`sm`,onClick:()=>Pe(e.id),"data-testid":`annotation-delete`,className:`hover:text-danger`,children:`删除`})]})]}),(0,$.jsx)(`p`,{className:`mt-2 whitespace-pre-wrap break-words text-sm`,children:e.comment})]})}var ct=typeof window<`u`&&window.matchMedia(`(pointer: coarse)`).matches;function lt({projectId:e,sessionId:t,state:n,cronsStale:i,onBtw:a,onClear:o,onAddDir:s}){let c=X(),l=Ke(e,t),u=qe(e,t),d=(0,Q.useRef)(!1),f=V(),p=R(),[m]=(0,Q.useState)(()=>Ce(t)),h=we(e=>e.drafts[t])??m,g=Ie(n=>n.items.some(n=>n.projectId===e&&n.targetSessionId===t)),{text:_,images:v,processing:y}=h,b=e=>ye(t,{text:e}),x=e=>ye(t,{images:e(Ce(t).images)}),[S,C]=(0,Q.useState)(),[w,E]=(0,Q.useState)(!1),[ee,D]=(0,Q.useState)(!1),O=(0,Q.useRef)(null),k=(0,Q.useRef)(null),te=n!==`idle`,ne=re(e),[A,j]=(0,Q.useState)(0),[M,N]=(0,Q.useState)(!1),P=g?void 0:/^\/(\S*)$/.exec(_)?.[1],F=(0,Q.useMemo)(()=>P===void 0?[]:ft(ne.data??[],P),[ne.data,P]),I=P!==void 0&&!M&&F.length>0;(0,Q.useEffect)(()=>j(0),[P]),(0,Q.useEffect)(()=>{i||E(!1)},[i]),(0,Q.useEffect)(()=>{if(!w)return;let e=setTimeout(()=>E(!1),3e4);return()=>clearTimeout(e)},[w]);let[L,B]=(0,Q.useState)(0),H=/(?:^|\s)@([^\s@]*)$/.exec(_.slice(0,L))?.[1],W=z({queryKey:[`mention`,e,H],queryFn:()=>T(`/api/projects/${e}/search/files?limit=20&q=${encodeURIComponent(H??``)}`).then(e=>e.matches),enabled:H!==void 0,staleTime:3e4,placeholderData:e=>e}),K=H!==void 0&&!M?W.data??[]:[],q=!I&&K.length>0;(0,Q.useEffect)(()=>j(0),[H]);function J(e){let t=_.slice(0,L).replace(/@[^\s@]*$/,`@${e.path} `),n=t+_.slice(L);b(n),N(!1),requestAnimationFrame(()=>{let e=O.current;e&&(e.focus(),e.setSelectionRange(t.length,t.length),B(t.length),_t(e))})}function ie(e){ue(t,e),C(void 0),requestAnimationFrame(()=>_t(O.current))}async function oe(){if(!d.current){d.current=!0;try{await se()}catch(e){C(e instanceof Error?e.message:String(e))}finally{d.current=!1}}}async function se(){let n=Ce(t);if(n.processing)return;let{text:r,images:i,revision:d}=n,m=We(e,t),h=r.trim();if(!h&&i.length===0&&m.length===0)return;C(void 0);let g=()=>ie(d),_=()=>{G({t:`send`,sessionId:t,projectId:e,uuid:Z(),text:m.length?He(h,m):h,...i.length?{images:i.map(({mediaType:e,data:t})=>({mediaType:e,data:t}))}:{}}),m.length&&Le(m),g()};if(m.length)return _();if(h.startsWith(`!`)&&i.length===0){let n=h.slice(1).trim();return n?(G({t:`bash`,sessionId:t,projectId:e,uuid:Z(),command:n}),g()):void 0}let v=/^\/btw(?:\s+([\s\S]*))?$/.exec(h);if(v&&a){let e=v[1]?.trim()??``;try{await a(e),g()}catch(e){C(e instanceof Error?e.message:String(e))}return}let y=/^\/add-dir(?:\s+([\s\S]*))?$/.exec(h);if(y&&s){let e=y[1]?.trim();if(!e)return C(`用法:/add-dir 绝对路径`);try{await s(e),g()}catch(e){C(e instanceof Error?e.message:String(e))}return}let b=/^\/cd\s+(\S[\s\S]*)$/.exec(h);if(b){try{let n=await T(`/api/projects/${e}/sessions/${t}/cd`,{method:`POST`,json:{path:b[1].trim()}});g(),p.invalidateQueries({queryKey:[`projects`]}),f(`/p/${n.projectId}/s/${t}`)}catch(e){C(e instanceof Error?e.message:String(e))}return}let x=/^\/(?:feedback|bug)(?:\s+([\s\S]*))?$/.exec(h);if(x){let n=x[1]?.trim();if(!n)return C(`用法:/feedback 你想反馈的内容(提交前可选择是否附带会话记录)`);let r=await c({title:`提交反馈给 Anthropic?`,description:n,confirmLabel:`提交反馈`,checkbox:{label:`附带本会话记录(可能包含代码和敏感内容)`,defaultChecked:!1}});if(!r.confirmed)return;try{await T(`/api/projects/${e}/sessions/${t}/feedback`,{method:`POST`,json:{description:n,attachTranscript:r.checked}}),g(),C(`反馈已提交,谢谢。`)}catch(e){C(e instanceof Error?e.message:String(e))}return}if(h===`/release-notes`)return window.open(`https://code.claude.com/docs/en/changelog`,`_blank`,`noopener`),g();if(h===`/clear`&&o){try{await o()&&g()}catch(e){C(e instanceof Error?e.message:String(e))}return}let S=/^\/compact(?:\s+([\s\S]*))?$/.exec(h);S?await l(S[1],i.map(({mediaType:e,data:t})=>({mediaType:e,data:t})))&&g():/^\/goal\s+clear$/.test(h)?await u()&&g():_()}function ce(e){b(`/${e.name} `),N(!1),requestAnimationFrame(()=>{let e=O.current;e&&(e.focus(),e.setSelectionRange(e.value.length,e.value.length),_t(e))})}function le(e){if(!e.nativeEvent.isComposing){if(q){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;j(e=>(e+t+K.length)%K.length);return}if(e.key===`Enter`||e.key===`Tab`){let t=K[A];if(t){e.preventDefault(),J(t);return}}if(e.key===`Escape`){e.preventDefault(),N(!0);return}}if(I){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;j(e=>(e+t+F.length)%F.length);return}if(e.key===`Enter`||e.key===`Tab`){let t=F[A];if(t&&(e.key!==`Enter`||P!==t.name||t.argumentHint)){e.preventDefault(),ce(t);return}}if(e.key===`Escape`){e.preventDefault(),N(!0);return}}e.key===`Enter`&&!e.shiftKey&&!ct&&(e.preventDefault(),oe())}}async function de(e){let n=[...e].filter(e=>e.type.startsWith(`image/`));if(!n.length)return!1;try{await me(t,n.length,()=>Promise.all(n.map(gt)))}catch{C(`图片读取失败`)}return!0}function fe(e){let t=[...e.clipboardData.files].filter(e=>e.type.startsWith(`image/`));t.length&&(e.preventDefault(),de(t))}function pe(e){D(!1),e.dataTransfer.files.length&&(e.preventDefault(),de(e.dataTransfer.files))}let he=!g&&_.trimStart().startsWith(`!`);return(0,$.jsxs)(`div`,{className:`relative`,children:[q&&(0,$.jsx)(ut,{items:K,active:A,onHover:j,onChoose:J}),I&&(0,$.jsx)(dt,{items:F,active:A,onHover:j,onChoose:ce}),(0,$.jsxs)(`div`,{className:`rounded-2xl border bg-surface shadow-sm focus-within:border-accent/60 ${ee?`border-accent`:he?`border-accent/60`:`border-border`}`,onDragOver:e=>{[...e.dataTransfer.types].includes(`Files`)&&(e.preventDefault(),D(!0))},onDragLeave:()=>D(!1),onDrop:pe,"data-testid":`composer`,"data-session-id":t,children:[(0,$.jsx)(ot,{projectId:e,sessionId:t}),v.length>0&&(0,$.jsx)(`div`,{className:`flex flex-wrap gap-2 px-3 pt-3`,"data-testid":`attachments`,children:v.map(e=>(0,$.jsxs)(`div`,{className:`relative`,children:[(0,$.jsx)(`img`,{src:e.url,alt:`待发送的图片`,className:`size-16 rounded-lg border border-border object-cover`}),(0,$.jsx)(`button`,{className:`absolute -right-2 -top-2 flex size-6 items-center justify-center rounded-full border border-border bg-surface text-muted shadow-sm hover:text-text`,onClick:()=>x(t=>t.filter(t=>t.id!==e.id)),"aria-label":`移除图片`,children:(0,$.jsx)(ge,{size:12})})]},e.id))}),(0,$.jsx)(`textarea`,{ref:O,"aria-label":`消息`,rows:1,value:_,placeholder:te?`继续输入,消息会排进下一轮…`:`给 Claude 发消息(/ 命令,! 执行命令)`,onSelect:e=>B(e.currentTarget.selectionStart),onChange:e=>{b(e.target.value),B(e.target.selectionStart),N(!1),_t(e.target)},onKeyDown:le,onPaste:fe,className:`block max-h-[40dvh] w-full resize-none bg-transparent px-4 pt-3 text-base outline-none ${he?`font-mono`:``}`}),(0,$.jsxs)(`div`,{className:`flex items-center gap-2 px-2 pb-2`,children:[(0,$.jsx)(`input`,{ref:k,type:`file`,accept:`image/*`,multiple:!0,hidden:!0,"data-testid":`image-input`,onChange:e=>{e.target.files&&de(e.target.files),e.target.value=``}}),(0,$.jsx)(`button`,{onClick:()=>k.current?.click(),className:`flex size-9 items-center justify-center rounded-full text-muted hover:bg-surface-2 hover:text-text`,"aria-label":`添加图片`,title:`添加图片`,children:(0,$.jsx)(U,{})}),i&&(0,$.jsx)(`button`,{type:`button`,onClick:()=>{w||(E(!0),G({t:`refreshCrons`,sessionId:t,projectId:e}))},disabled:te||w,className:`flex size-9 items-center justify-center rounded-full text-muted hover:bg-surface-2 hover:text-text disabled:opacity-40`,"aria-label":`刷新定时任务`,title:`重新确认定时任务(会发送一条刷新消息)`,"data-testid":`refresh-crons`,children:(0,$.jsx)(r,{size:18,className:w?`animate-spin`:void 0})}),(0,$.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-xs text-muted`,children:S?(0,$.jsx)(`span`,{className:`text-danger`,role:`alert`,children:S}):y?`正在处理图片…`:he?`在项目目录执行命令,输出会带进对话`:null}),te&&(0,$.jsx)(`button`,{onClick:()=>G({t:`interrupt`,sessionId:t}),className:`flex size-9 items-center justify-center rounded-full border border-border text-text hover:bg-surface-2`,"aria-label":`中断`,title:`中断`,children:(0,$.jsx)(ae,{})}),(0,$.jsx)(`button`,{onClick:()=>void oe(),disabled:y>0||!_.trim()&&v.length===0&&!g,className:`flex size-9 items-center justify-center rounded-full bg-accent text-accent-text disabled:opacity-40`,"aria-label":`发送`,title:`发送`,children:(0,$.jsx)(Y,{})})]})]})]})}function ut({items:e,active:t,onHover:n,onChoose:r}){return(0,$.jsx)(`div`,{role:`listbox`,"aria-label":`文件`,className:`absolute inset-x-0 bottom-full z-30 mb-2 max-h-[45dvh] overflow-y-auto overscroll-contain rounded-xl border border-border bg-surface py-1 shadow-lg`,children:e.map((e,i)=>(0,$.jsxs)(`button`,{role:`option`,"aria-selected":i===t,onMouseDown:e=>e.preventDefault(),onMouseEnter:()=>n(i),onClick:()=>r(e),className:`block w-full truncate px-3 py-2 text-left font-mono text-sm ${i===t?`bg-surface-2`:``}`,children:[`@`,e.path]},e.path))})}function dt({items:e,active:t,onHover:n,onChoose:r}){let i=(0,Q.useRef)(null);return(0,Q.useEffect)(()=>{i.current?.querySelector(`[data-index="${t}"]`)?.scrollIntoView({block:`nearest`})},[t]),(0,$.jsx)(`div`,{ref:i,role:`listbox`,"aria-label":`命令`,className:`absolute inset-x-0 bottom-full z-30 mb-2 max-h-[45dvh] overflow-y-auto overscroll-contain rounded-xl border border-border bg-surface py-1 shadow-lg`,children:e.map((e,i)=>(0,$.jsxs)(`button`,{"data-index":i,role:`option`,"aria-selected":i===t,onMouseDown:e=>e.preventDefault(),onMouseEnter:()=>n(i),onClick:()=>r(e),className:`block w-full px-3 py-2 text-left ${i===t?`bg-surface-2`:``}`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-baseline gap-2`,children:[(0,$.jsxs)(`span`,{className:`shrink-0 font-mono text-sm text-text`,children:[`/`,e.name]}),e.argumentHint&&(0,$.jsx)(`span`,{className:`min-w-0 truncate font-mono text-xs text-muted`,children:e.argumentHint})]}),e.description&&(0,$.jsx)(`div`,{className:`line-clamp-2 text-xs text-muted`,children:e.description})]},e.name))})}function ft(e,t){let n=t.toLowerCase();if(!n)return e;let r=e=>{let t=e.name.toLowerCase();return t.startsWith(n)?0:e.aliases?.some(e=>e.toLowerCase().startsWith(n))?1:t.includes(n)?2:e.description.toLowerCase().includes(n)?3:-1};return e.map(e=>({c:e,r:r(e)})).filter(e=>e.r>=0).sort((e,t)=>e.r-t.r||e.c.name.length-t.c.name.length).map(e=>e.c)}var pt=2e3,mt=35e5,ht=new Set([`image/png`,`image/jpeg`,`image/gif`,`image/webp`]);async function gt(e){let t=await new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result)),r.onerror=()=>n(r.error),r.readAsDataURL(e)}),n=await new Promise((e,n)=>{let r=new Image;r.onload=()=>e(r),r.onerror=n,r.src=t}),r=t,i=e.type;if(!ht.has(e.type)||e.size>mt||Math.max(n.naturalWidth,n.naturalHeight)>pt){let e=Math.min(1,pt/Math.max(n.naturalWidth,n.naturalHeight)),t=document.createElement(`canvas`);t.width=Math.round(n.naturalWidth*e),t.height=Math.round(n.naturalHeight*e),t.getContext(`2d`).drawImage(n,0,0,t.width,t.height),r=t.toDataURL(`image/jpeg`,.85),i=`image/jpeg`}return{id:Z(),url:r,mediaType:i,data:r.slice(r.indexOf(`,`)+1)}}function _t(e){e&&(e.style.height=`auto`,e.style.height=`${e.scrollHeight}px`)}function vt({req:e,sessionId:t}){return(0,$.jsxs)(`div`,{className:`mb-3 overflow-hidden rounded-xl border border-accent/40 bg-surface shadow-sm ${e.kind===`ask`?`flex max-h-[min(55dvh,32rem)] min-h-0 flex-col`:``}`,"data-testid":`pending-${e.kind}`,children:[(0,$.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-border bg-accent/5 px-4 py-2 text-xs font-medium text-accent`,children:[(0,$.jsx)(`span`,{className:`size-1.5 animate-pulse rounded-full bg-accent`,"aria-hidden":!0}),e.kind===`ask`?`Claude 在等你回答`:`Claude 在等你审批计划`]}),(0,$.jsx)(`div`,{className:e.kind===`ask`?`flex min-h-0 flex-col`:`p-4`,children:e.kind===`ask`?(0,$.jsx)(yt,{req:e,sessionId:t},e.id):(0,$.jsx)(bt,{req:e,sessionId:t})})]})}function yt({req:e,sessionId:t}){let n=e.input.questions??[],[r,i]=(0,Q.useState)({}),[a,o]=(0,Q.useState)({}),[s,c]=(0,Q.useState)(0),l=Math.min(s,Math.max(0,n.length-1)),u=n[l],d=(0,Q.useRef)(null);(0,Q.useEffect)(()=>{d.current&&(d.current.scrollTop=0)},[l]);let m=e=>{let t=[...r[e.question]??[]],n=a[e.question]?.trim();return n&&t.push(n),t.join(`, `)},h=n.filter(e=>m(e)).length,g=n.length>0&&h===n.length;function _(e,t){i(n=>{let r=n[e.question]??[];return e.multiSelect?{...n,[e.question]:r.includes(t)?r.filter(e=>e!==t):[...r,t]}:{...n,[e.question]:[t]}}),e.multiSelect||o(t=>({...t,[e.question]:``}))}return(0,$.jsxs)(`div`,{className:`flex min-h-0 flex-col`,children:[n.length>1&&(0,$.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center justify-between gap-2 px-4 pb-2 pt-3`,children:[(0,$.jsxs)(`p`,{className:`text-xs text-muted`,role:`status`,children:[`第 `,l+1,` / `,n.length,` 题 · 已答 `,h,` 题`]}),(0,$.jsx)(`nav`,{className:`flex gap-1`,"aria-label":`问题分页`,children:n.map((e,t)=>(0,$.jsxs)(f,{size:`sm`,iconOnly:!0,variant:t===l?`primary`:`ghost`,"aria-label":`第 ${t+1} 题${e.header?`:${e.header}`:``}(${m(e)?`已回答`:`未回答`})`,"aria-current":t===l?`step`:void 0,title:e.header??e.question,onClick:()=>c(t),children:[t+1,m(e)&&(0,$.jsx)(`span`,{className:`sr-only`,children:`,已回答`})]},t))})]}),(0,$.jsx)(`div`,{ref:d,className:`min-h-0 overflow-y-auto overscroll-contain px-4 py-3`,"data-testid":`ask-question-body`,children:u?(0,$.jsxs)(`fieldset`,{className:`min-w-0 space-y-2`,children:[(0,$.jsxs)(`legend`,{className:`max-w-full break-words font-medium`,children:[u.header&&(0,$.jsx)(`span`,{className:`mr-2 rounded bg-surface-2 px-1.5 py-0.5 text-xs text-muted`,children:u.header}),u.question]}),(0,$.jsxs)(`div`,{className:`grid gap-2`,children:[u.options.map(e=>{let t=r[u.question]?.includes(e.label);return(0,$.jsxs)(`button`,{type:`button`,role:u.multiSelect?`checkbox`:`radio`,"aria-checked":!!t,onClick:()=>_(u,e.label),className:`flex items-start gap-3 rounded-lg border px-3.5 py-2.5 text-left transition-colors ${t?`border-accent/60 bg-accent/5`:`border-border hover:border-muted/40`}`,children:[(0,$.jsx)(`span`,{className:`mt-0.5 flex size-4 shrink-0 items-center justify-center border ${u.multiSelect?`rounded`:`rounded-full`} ${t?`border-accent bg-accent text-accent-text`:`border-muted/50`}`,"aria-hidden":!0,children:t&&(u.multiSelect?(0,$.jsx)(p,{size:11}):(0,$.jsx)(`span`,{className:`size-1.5 rounded-full bg-accent-text`}))}),(0,$.jsxs)(`span`,{className:`min-w-0 break-words`,children:[(0,$.jsx)(`div`,{className:`text-sm font-medium`,children:e.label}),e.description&&(0,$.jsx)(`div`,{className:`mt-0.5 text-xs text-muted`,children:e.description})]})]},e.label)}),(0,$.jsx)(`input`,{"aria-label":`其他回答:${u.question}`,placeholder:`其他(自由输入)`,value:a[u.question]??``,onChange:e=>{let t=e.target.value;o(e=>({...e,[u.question]:t})),!u.multiSelect&&t&&i(e=>({...e,[u.question]:[]}))},className:`h-10 min-w-0 rounded-lg border border-border bg-bg px-3 text-base outline-none focus:border-accent/60 focus:ring-2 focus:ring-accent/20 md:h-9 md:text-sm`})]})]},l):(0,$.jsx)(`p`,{className:`text-sm text-muted`,children:`当前没有可回答的问题。`})}),(0,$.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-border px-4 py-3`,children:[(0,$.jsx)(f,{variant:`ghost`,className:`mr-auto`,onClick:()=>G({t:`answer`,sessionId:t,requestId:e.id,answer:{kind:`cancel`}}),children:n.length>1?`跳过全部`:`跳过`}),n.length>1&&(0,$.jsx)(f,{disabled:l===0,onClick:()=>c(l-1),children:`上一步`}),l<n.length-1?(0,$.jsx)(f,{variant:`primary`,disabled:!u||!m(u),onClick:()=>c(l+1),children:`下一步`},`next`):(0,$.jsx)(f,{variant:`primary`,disabled:!g,onClick:()=>G({t:`answer`,sessionId:t,requestId:e.id,answer:{kind:`ask`,answers:Object.fromEntries(n.map(e=>[e.question,m(e)]))}}),children:n.length>1?`提交全部`:`提交`},`submit`)]})]})}function bt({req:e,sessionId:t}){let[n,r]=(0,Q.useState)(``);return(0,$.jsxs)(`div`,{className:`space-y-3`,children:[(0,$.jsx)(`h2`,{className:`text-lg`,children:`Claude 的计划`}),(0,$.jsx)(`div`,{className:`max-h-[50dvh] overflow-y-auto rounded-lg bg-bg p-3`,children:(0,$.jsx)(Ne,{text:e.input.plan})}),(0,$.jsx)(`textarea`,{"aria-label":`修改意见`,placeholder:`需要修改的地方(打回时必填)`,value:n,onChange:e=>r(e.target.value),rows:2,className:`w-full resize-none rounded-lg border border-border bg-bg px-3 py-2 text-sm outline-none focus:border-accent`}),(0,$.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,$.jsx)(f,{disabled:!n.trim(),onClick:()=>G({t:`answer`,sessionId:t,requestId:e.id,answer:{kind:`plan`,approve:!1,feedback:n}}),children:`打回修改`}),(0,$.jsx)(f,{variant:`primary`,onClick:()=>G({t:`answer`,sessionId:t,requestId:e.id,answer:{kind:`plan`,approve:!0}}),children:`批准执行`})]})]})}var xt=new Set([`Edit`,`Write`,`MultiEdit`,`NotebookEdit`]);function St(e,t,n,r){let i=n.filter(e=>e.kind===`tool`&&xt.has(e.name)&&e.result).length,a=n.filter(e=>e.kind===`result`).length,o=z({queryKey:[`turn-changes`,e,t,i,a,r],queryFn:()=>T(`/api/projects/${e}/sessions/${t}/turn-changes`),placeholderData:e=>e});return(0,Q.useMemo)(()=>{let r=new Map;for(let e of o.data?.turns??[])r.set(e.prompt,[...r.get(e.prompt)??[],e]);let i=new Map,a=[],s=n=>n.length?(0,$.jsx)($.Fragment,{children:n.map(n=>(0,$.jsx)(Tt,{pid:e,sid:t,turn:n},n.id))}):null;for(let e of n)e.kind===`user`&&(a.length&&i.set(e.key,s(a)),a=r.get(e.key)??[]);return{before:e=>i.get(e)??null,tail:s(a)}},[o.data,n,e,t])}var Ct={A:`text-ok`,M:`text-accent`,D:`text-danger`},wt={A:`新增`,M:`修改`,D:`删除`};function Tt({pid:e,sid:t,turn:n}){let[r,i]=(0,Q.useState)(!1),[a,s]=(0,Q.useState)(),c=n.files.reduce((e,t)=>e+t.additions,0),l=n.files.reduce((e,t)=>e+t.deletions,0);return(0,$.jsxs)(`div`,{className:`rounded-lg border border-border bg-surface/60 text-sm`,"data-testid":`turn-changes`,"data-turn":n.id,children:[(0,$.jsxs)(`button`,{className:`flex w-full min-w-0 items-center gap-2 px-3 py-2 text-left text-muted`,onClick:()=>i(e=>!e),"aria-expanded":r,children:[(0,$.jsx)(o,{size:12,className:m(`shrink-0 transition-transform`,r&&`rotate-90`)}),(0,$.jsxs)(`span`,{className:`text-text`,children:[`本轮改动:`,n.files.length,` 个文件`]}),(0,$.jsxs)(`span`,{className:`text-xs`,children:[(0,$.jsxs)(`span`,{className:`text-ok`,children:[`+`,c]}),` `,(0,$.jsxs)(`span`,{className:`text-danger`,children:[`-`,l]})]})]}),r&&(0,$.jsxs)(`div`,{className:`border-t border-border`,children:[(0,$.jsx)(`ul`,{className:`py-1`,children:n.files.map(r=>(0,$.jsxs)(`li`,{children:[(0,$.jsxs)(`button`,{className:`flex w-full min-w-0 items-center gap-2 px-3 py-2 text-left md:py-1.5 ${a===r.path?`bg-surface-2`:`hover:bg-surface-2/70`}`,onClick:()=>s(a===r.path?void 0:r.path),"aria-expanded":a===r.path,"data-testid":`turn-file`,"data-path":r.path,children:[(0,$.jsx)(`span`,{className:`w-4 shrink-0 font-mono text-xs font-semibold ${Ct[r.status]}`,title:wt[r.status],children:r.status}),(0,$.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono text-[13px]`,title:r.path,children:r.path}),r.unchanged?(0,$.jsx)(`span`,{className:`shrink-0 text-xs text-muted`,children:`无净变化`}):(0,$.jsxs)(`span`,{className:`shrink-0 text-xs`,children:[(0,$.jsxs)(`span`,{className:`text-ok`,children:[`+`,r.additions]}),` `,(0,$.jsxs)(`span`,{className:`text-danger`,children:[`-`,r.deletions]})]})]}),a===r.path&&(0,$.jsx)(Et,{pid:e,sid:t,turn:n.id,path:r.path})]},r.path))}),(0,$.jsx)(`p`,{className:`border-t border-border px-3 py-1.5 text-xs text-muted`,children:`根据 CLI 的代码检查点和本轮的 Edit/Write 调用统计;Bash 命令和子 agent 改动的文件追踪不到,不在此列。`})]})]})}function Et({pid:e,sid:t,turn:n,path:r}){let i=z({queryKey:[`turn-diff`,e,t,n,r],queryFn:()=>T(`/api/projects/${e}/sessions/${t}/turn-changes/diff?${new URLSearchParams({turn:n,path:r})}`)}),a=(0,Q.useMemo)(()=>{let e=i.data;return!e||e.binary?[]:e.patches?Te(e.patches):Oe(e.before??``,e.after??``)},[i.data]);return i.isPending?(0,$.jsx)(`p`,{className:`px-3 py-2 text-xs text-muted`,children:`加载中…`}):i.isError?(0,$.jsx)(`p`,{className:`px-3 py-2 text-xs text-danger`,children:i.error instanceof y?i.error.message:`读取失败`}):i.data.binary?(0,$.jsx)(`p`,{className:`px-3 py-2 text-xs text-muted`,children:`二进制文件,无法显示差异。`}):(0,$.jsxs)(`div`,{className:`border-y border-border`,"data-testid":`turn-diff`,children:[i.data.patches&&(0,$.jsx)(`p`,{className:`bg-surface-2/60 px-3 py-1 text-xs text-muted`,children:`没有检查点,按本轮各次编辑的补丁显示。`}),i.data.truncated&&(0,$.jsx)(`p`,{className:`bg-surface-2/60 px-3 py-1 text-xs text-muted`,children:`文件太大,只比较了前 1 MiB。`}),(0,$.jsx)(De,{rows:a})]})}var Dt,Ot=new Set,kt=e=>{Dt=e;for(let e of Ot)e()},At=e=>kt(e);function jt(e){return(0,Q.useSyncExternalStore)(e=>(Ot.add(e),()=>Ot.delete(e)),()=>Dt===e)}function Mt(e,t){return z({queryKey:[`dirs`,e,t],queryFn:()=>T(`/api/projects/${e}/sessions/${t}/dirs`)})}function Nt(e,t){let n=R();return async(r,i=!1)=>{let a=await T(`/api/projects/${e}/sessions/${t}/dirs`,{method:`POST`,json:{path:r,remember:i}});n.setQueryData([`dirs`,e,t],a)}}var Pt={session:`本会话`,local:`已记住`,project:`项目设置`,user:`用户设置`};function Ft({pid:e,sid:t,meta:n}){let r=Mt(e,t),i=jt(t),a=r.data?.dirs??[];return!n?.worktree&&a.length===0&&!i?null:(0,$.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 border-b border-border px-4 py-1.5 text-xs text-muted md:px-6`,"data-testid":`session-context`,children:[n?.worktree&&(0,$.jsxs)(H,{to:`/p/${e}/worktrees`,className:`flex min-w-0 items-center gap-1 hover:text-accent`,title:n.cwd,"data-testid":`session-worktree`,children:[(0,$.jsx)(E,{size:12,className:`shrink-0`}),(0,$.jsxs)(`span`,{className:`truncate`,children:[`worktree `,(0,$.jsx)(`span`,{className:`font-mono text-text`,children:n.worktree})]})]}),a.length>0&&(0,$.jsxs)(`button`,{className:`flex min-w-0 items-center gap-1 hover:text-accent`,onClick:()=>kt(t),"data-testid":`extra-dirs-button`,children:[(0,$.jsx)(v,{size:12,className:`shrink-0`}),(0,$.jsxs)(`span`,{className:`truncate`,children:[`额外目录 `,a.length]})]}),i&&(0,$.jsx)(It,{pid:e,sid:t,info:r.data,onClose:()=>kt(void 0)})]})}function It({pid:e,sid:t,info:n,onClose:r}){let i=R(),a=Nt(e,t),[o,c]=(0,Q.useState)(``),[l,u]=(0,Q.useState)(!1),d=k({mutationFn:()=>a(o,l),onSuccess:()=>c(``)}),p=k({mutationFn:n=>T(`/api/projects/${e}/sessions/${t}/dirs?${new URLSearchParams({path:n})}`,{method:`DELETE`}),onSuccess:n=>i.setQueryData([`dirs`,e,t],n)});return(0,$.jsxs)(P,{title:`额外目录`,onClose:r,testId:`dirs-dialog`,children:[(0,$.jsxs)(`p`,{className:`text-sm text-muted`,children:[`除了会话的工作目录`,n&&(0,$.jsxs)(`span`,{className:`font-mono`,children:[` `,n.cwd]}),`,Claude 还可以读写这些目录(相当于 CLI 的 /add-dir)。运行中的会话立即生效。`]}),(0,$.jsx)(`ul`,{className:`mt-3 divide-y divide-border rounded-lg border border-border bg-surface empty:hidden`,"aria-label":`额外目录列表`,children:n?.dirs.map(e=>{let t=e.sources.includes(`session`)||e.sources.includes(`local`);return(0,$.jsxs)(`li`,{className:`flex min-w-0 items-center gap-2 py-2 pl-3 pr-1.5`,"data-testid":`extra-dir`,"data-path":e.path,children:[(0,$.jsx)(v,{className:`shrink-0 text-muted`}),(0,$.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,$.jsx)(`div`,{className:m(`truncate font-mono text-[13px]`,!e.exists&&`text-danger line-through`),title:e.path,children:e.path}),(0,$.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:[e.sources.map(e=>(0,$.jsx)(C,{tone:e===`session`?`accent`:`neutral`,children:Pt[e]},e)),!e.exists&&(0,$.jsx)(C,{tone:`danger`,children:`目录不存在`})]})]}),t?(0,$.jsx)(f,{variant:`ghost`,size:`sm`,className:`text-danger hover:text-danger`,onClick:()=>p.mutate(e.path),disabled:p.isPending,children:`移除`}):(0,$.jsx)(`span`,{className:`shrink-0 px-2 text-xs text-muted`,title:`在设置文件里,请在设置页修改`,children:`只读`})]},e.path)})}),n&&n.dirs.length===0&&(0,$.jsx)(`p`,{className:`mt-3 rounded-lg border border-dashed border-border px-3 py-4 text-center text-sm text-muted`,children:`还没有额外目录。在下面填一个绝对路径即可添加。`}),(0,$.jsxs)(`form`,{className:`mt-4 space-y-2`,onSubmit:e=>{e.preventDefault(),o.trim()&&d.mutate()},children:[(0,$.jsx)(`input`,{"aria-label":`目录路径`,placeholder:`/home/you/other-repo`,value:o,onChange:e=>c(e.target.value),className:w}),(0,$.jsx)(x,{checked:l,onChange:u,label:`记住这个目录`,desc:(0,$.jsxs)($.Fragment,{children:[`写进 `,(0,$.jsx)(`span`,{className:`font-mono`,children:`.claude/settings.local.json`}),`,以后这个目录下的会话(包括 CLI)都能访问`]})}),(d.error||p.error)&&(0,$.jsx)(`p`,{role:`alert`,className:`text-xs text-danger`,children:(d.error??p.error).message}),(0,$.jsxs)(`div`,{className:`flex justify-end gap-2 border-t border-border pt-3`,children:[(0,$.jsx)(f,{variant:`ghost`,onClick:r,children:`完成`}),(0,$.jsx)(f,{type:`submit`,variant:`primary`,icon:(0,$.jsx)(s,{}),disabled:!o.trim(),loading:d.isPending,children:`添加`})]})]})]})}var Lt=()=>({kind:`http`,brainId:``,brainVoice:``,name:``,url:``,timeout:`120`,subscribeMethod:`GET`,headers:``,hasHeaders:!1,extraBody:``}),Rt=()=>({brainId:``,brainVoice:``,inheritVoice:!0}),zt=e=>({brainId:e.brainId.trim()||null,brainVoice:e.inheritVoice?null:e.brainVoice});function Bt({source:e,draft:t,onChange:n}){return(0,$.jsxs)(`div`,{className:`space-y-3`,children:[(0,$.jsx)(S,{label:`brain_id`,hint:e.brainId?`留空继承 HTTP 源配置。`:`请在激活前填写。`,children:(0,$.jsx)(`input`,{"aria-label":`会话 brain_id`,className:w,value:t.brainId,maxLength:256,placeholder:`填写 brain_id`,onChange:e=>n({...t,brainId:e.target.value})})}),(0,$.jsx)(S,{label:`x-brain-voice`,group:!0,hint:`仅用于推送。取消勾选后留空则不发送 voice。`,children:(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[(0,$.jsx)(`input`,{"aria-label":`会话 x-brain-voice`,value:t.brainVoice,maxLength:1024,disabled:t.inheritVoice,className:`${w} flex-1 disabled:cursor-not-allowed disabled:bg-surface-2`,onChange:e=>n({...t,brainVoice:e.target.value})}),(0,$.jsxs)(`label`,{className:`flex min-h-10 shrink-0 cursor-pointer items-center gap-2 whitespace-nowrap text-xs md:min-h-8`,children:[(0,$.jsx)(`input`,{type:`checkbox`,checked:t.inheritVoice,onChange:e=>n({...t,inheritVoice:e.target.checked}),className:`size-4 accent-accent`}),`使用源配置`]})]})})]})}function Vt({binding:e,source:t,onClose:n}){let[r,i]=(0,Q.useState)({brainId:e.brainId??``,brainVoice:e.brainVoice??``,inheritVoice:e.brainVoice==null}),[a]=(0,Q.useState)(()=>JSON.stringify(r)),{discard:o}=Se(JSON.stringify(r)!==a,`会话 brain 配置`),s=R(),c=k({mutationFn:()=>T(`/api/http-channels/bindings/${e.id}`,{method:`PATCH`,json:zt(r)}),onSuccess:()=>{s.invalidateQueries({queryKey:[`http-channels`]}),n()}});return(0,$.jsx)(P,{title:`会话 brain 配置`,onClose:()=>{c.isPending||o().then(e=>{e&&n()})},testId:`brain-binding-dialog`,children:(0,$.jsxs)(`form`,{className:`space-y-4`,onSubmit:e=>{e.preventDefault(),c.mutate()},children:[(0,$.jsxs)(`p`,{className:`break-words text-sm text-muted`,children:[t.name,` · 配置仅影响这条注册。`]}),(0,$.jsx)(`fieldset`,{disabled:c.isPending,className:`min-w-0`,children:(0,$.jsx)(Bt,{source:t,draft:r,onChange:i})}),c.error&&(0,$.jsx)(`p`,{role:`alert`,className:`text-sm text-danger`,children:c.error.message}),(0,$.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,$.jsx)(f,{disabled:c.isPending,onClick:()=>void o().then(e=>{e&&n()}),children:`取消`}),(0,$.jsx)(f,{type:`submit`,variant:`primary`,loading:c.isPending,children:`保存配置`})]})]})})}function Ht({pid:e,sid:t,onClose:n}){let r=R(),i=X(),a=z({queryKey:[`http-channels`],queryFn:()=>T(`/api/http-channels`),refetchInterval:2e3}),[o,s]=(0,Q.useState)(`session`),[c,l]=(0,Q.useState)(``),[u,d]=(0,Q.useState)(`subscribe`),[p,m]=(0,Q.useState)(Rt),[g,v]=(0,Q.useState)(null),[y,b]=(0,Q.useState)(null),[x,E]=(0,Q.useState)(!1),[ee,D]=(0,Q.useState)(),O=(0,Q.useRef)(0),[te,ne]=(0,Q.useState)(``),[A,re]=(0,Q.useState)(),{discard:j}=Se(!!y&&JSON.stringify(y)!==te,`HTTP 源配置`),M=async()=>{await j()&&(O.current++,E(!1),n())},N=async()=>{await j()&&(O.current++,E(!1),b(null))},F=async e=>{e!==o&&await j()&&(O.current++,E(!1),b(null),s(e))},I=async e=>{if(!await j())return;let t=++O.current;b(null),s(`sources`),E(!0),D(void 0),L.reset();try{let n=e?await T(`/api/http-channels/sources/${e.id}`,{cache:`no-store`}):void 0;if(O.current!==t)return;let r=n?{id:n.id,kind:n.kind,brainId:n.brainId??``,brainVoice:n.brainVoice??``,name:n.name,url:n.url,timeout:String(n.timeoutMs/1e3),subscribeMethod:n.subscribeMethod,headers:n.hasHeaders?JSON.stringify(n.headers,null,2):``,hasHeaders:n.hasHeaders,extraBody:n.hasExtraBody?JSON.stringify(n.extraBody,null,2):``}:Lt();b(r),ne(JSON.stringify(r))}catch(e){O.current===t&&D(e instanceof Error?e.message:String(e))}finally{O.current===t&&E(!1)}},L=k({mutationFn:e=>e(),onSuccess:()=>r.invalidateQueries({queryKey:[`http-channels`]})}),B=a.data?.sources??[],V=B.find(e=>e.id===c),U=V?.kind===`brain-api`,G=e=>B.find(t=>t.id===e.sourceId)?.kind===`brain-api`,K=e=>G(e)?`brain-api 订阅`:e.direction===`subscribe`?`订阅`:`推送`,q=a.data?.bindings.filter(e=>o===`all`||e.sessionId===t)??[],J=e=>B.find(t=>t.id===e)?.name??`HTTP 源`,Y=L.error??ee??a.error,ie=e=>L.mutate(async()=>{if(e.active&&!(await i({title:`反激活这条注册?`,description:`将停止“${J(e.sourceId)}”的${G(e)?`订阅与推送`:K(e)},清除尚未投递的内容。已交给会话的消息继续处理。`,confirmLabel:`反激活`})).confirmed)return;let t=await T(`/api/http-channels/bindings/${e.id}/activation`,{method:`POST`,json:{active:!e.active}}),n=a.data?.bindings.find(e=>e.id===t.deactivatedId);re(n?`已激活;最早激活的${K(n)}“${J(n.sourceId)}”已反激活。`:void 0)}),ae=e=>L.mutate(async()=>{(await i({title:`删除这条注册?`,description:`会停止“${J(e.sourceId)}”的${G(e)?`订阅与推送`:K(e)}并删除注册配置。`,confirmLabel:`删除注册`,danger:!0})).confirmed&&await T(`/api/http-channels/bindings/${e.id}`,{method:`DELETE`})}),oe=e=>L.mutate(async()=>{(await i({title:`删除 HTTP 源?`,description:`“${e.name}”以及所有会话对它的注册都会删除,正在执行的请求会取消。`,confirmLabel:`删除源`,danger:!0})).confirmed&&(await T(`/api/http-channels/sources/${e.id}`,{method:`DELETE`}),c===e.id&&l(``))}),se=()=>L.mutate(async()=>{if(!y)return;let e=y,t=O.current,n=y.hasHeaders?{}:void 0;if(y.headers.trim())try{n=JSON.parse(y.headers)}catch{throw Error(`请求头不是有效 JSON`)}let r={};if(y.kind===`http`&&y.extraBody.trim())try{r=JSON.parse(y.extraBody)}catch{throw Error(`Extra body 不是有效 JSON`)}let i={name:y.name,url:y.url,kind:y.kind,brainId:y.brainId,...y.kind===`brain-api`?{brainVoice:y.brainVoice}:{},timeoutMs:Number(y.timeout)*1e3,subscribeMethod:y.subscribeMethod,extraBody:r,...n===void 0?{}:{headers:n}},a=await T(`/api/http-channels/sources${y.id?`/${y.id}`:``}`,{method:y.id?`PUT`:`POST`,json:i});O.current===t&&(l(a.id),a.id!==c&&m(Rt()),re(`HTTP 源“${a.name}”已保存。`),ne(JSON.stringify({...e,id:a.id,hasHeaders:a.hasHeaders})),b(n=>O.current!==t||!n?n:n===e?null:{...n,id:a.id,hasHeaders:a.hasHeaders}))});return(0,$.jsxs)(P,{title:`推送与订阅`,onClose:()=>void M(),testId:`http-channels-dialog`,children:[(0,$.jsxs)(`div`,{className:`space-y-4`,children:[(0,$.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 text-xs text-muted`,children:[(0,$.jsxs)(`span`,{children:[`已激活 `,a.data?.activeCount??0,` / `,a.data?.activeLimit??32]}),(0,$.jsxs)(`span`,{children:[`待投递 `,a.data?.inboxSize??0,` / `,a.data?.inboxLimit??1024]})]}),(0,$.jsx)(_,{label:`通道管理`,value:o,onChange:e=>void F(e),stretch:!0,options:[{value:`session`,label:`本会话`},{value:`all`,label:`全部注册`},{value:`sources`,label:`HTTP 源`}]}),Y&&(0,$.jsx)(`p`,{role:`alert`,className:`whitespace-pre-wrap break-words text-sm text-danger`,children:Y instanceof Error?Y.message:String(Y)}),A&&(0,$.jsx)(`p`,{role:`status`,className:`rounded-lg bg-surface-2 px-3 py-2 text-sm`,children:A}),a.isPending&&(0,$.jsx)(`p`,{className:`text-sm text-muted`,children:`正在加载…`}),o!==`sources`&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`p`,{className:`text-xs leading-relaxed text-muted`,children:`推送和订阅共用 32 个激活名额,超出时自动反激活最早的一条。关闭网页不影响服务端运行。`}),(0,$.jsxs)(`div`,{className:`space-y-2`,children:[q.map(e=>(0,$.jsxs)(`div`,{className:`rounded-lg border border-border bg-surface px-3 py-2.5`,"data-testid":`http-binding`,"data-active":e.active,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,$.jsx)(C,{tone:e.active?`accent`:`neutral`,children:K(e)}),(0,$.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm font-medium`,children:J(e.sourceId)}),(0,$.jsx)(C,{tone:e.active?`ok`:`neutral`,children:e.active?`已激活`:`未激活`})]}),o===`all`&&(0,$.jsx)(H,{to:`/p/${e.projectId}/s/${e.sessionId}`,onClick:n,className:`mt-1 block text-xs text-accent`,children:e.sessionId===t?`当前会话`:`会话 ${e.sessionId.slice(0,8)}`}),G(e)&&(0,$.jsxs)(`p`,{className:`mt-1 break-words text-xs text-muted`,children:[`brain_id: `,e.brainId??B.find(t=>t.id===e.sourceId)?.brainId??`未设置`,e.brainId?`(会话覆写)`:`(继承源)`,` · voice: `,e.brainVoice===``?`不发送`:e.brainVoice??B.find(t=>t.id===e.sourceId)?.brainVoice??`未设置`]}),e.stats?(0,$.jsxs)(`p`,{className:`mt-1.5 text-xs text-muted`,children:[G(e)?`已接收 ${e.stats.received} · 已推送 ${e.stats.pushed}`:`已${e.direction===`subscribe`?`投递`:`推送`} ${e.stats.delivered}`,` · 待处理 `,e.stats.pending,` · 去重 `,e.stats.duplicates,e.stats.dropped>0?` · 未发送 ${e.stats.dropped}`:``]}):e.inactiveReason&&(0,$.jsx)(`p`,{className:`mt-1.5 text-xs text-muted`,children:e.inactiveReason}),G(e)?(0,$.jsxs)($.Fragment,{children:[e.stats?.lastPullError&&(0,$.jsxs)(`p`,{className:`mt-1.5 break-words text-xs text-danger`,children:[`订阅:`,e.stats.lastPullError]}),e.stats?.lastPushError&&(0,$.jsxs)(`p`,{className:`mt-1.5 break-words text-xs text-danger`,children:[`推送:`,e.stats.lastPushError]})]}):e.stats?.lastError&&(0,$.jsx)(`p`,{className:`mt-1.5 break-words text-xs text-danger`,children:e.stats.lastError}),(0,$.jsxs)(`div`,{className:`mt-2 flex justify-end gap-2`,children:[G(e)&&(0,$.jsx)(f,{size:`sm`,disabled:L.isPending,onClick:()=>v(e),children:`配置`}),(0,$.jsx)(f,{size:`sm`,variant:`ghost`,disabled:L.isPending,onClick:()=>ae(e),children:`删除`}),(0,$.jsx)(f,{size:`sm`,variant:e.active?`secondary`:`primary`,disabled:L.isPending,onClick:()=>ie(e),children:e.active?`反激活`:`激活`})]})]},e.id)),!q.length&&(0,$.jsx)(`p`,{className:`rounded-lg border border-dashed border-border py-5 text-center text-sm text-muted`,children:`暂无注册`})]}),o===`session`&&(0,$.jsxs)(`form`,{className:`space-y-3 border-t border-border pt-3`,onSubmit:n=>{n.preventDefault(),L.mutate(async()=>{await T(`/api/projects/${e}/sessions/${t}/http-bindings`,{method:`POST`,json:{sourceId:c,direction:U?`subscribe`:u,...U?zt(p):{}}})})},children:[(0,$.jsx)(S,{label:`HTTP 源`,group:!0,children:(0,$.jsx)(W,{label:`HTTP 源`,value:c,onChange:e=>{l(e),m(Rt())},className:`w-full`,emptyText:`请先添加 HTTP 源`,options:[{value:``,label:`选择 HTTP 源…`},...B.map(e=>({value:e.id,label:e.name,hint:e.url}))]})}),!U&&(0,$.jsx)(_,{label:`注册方向`,value:u,onChange:d,stretch:!0,options:[{value:`subscribe`,label:`订阅 → 会话`},{value:`push`,label:`会话 → 推送`}]}),U&&(0,$.jsx)(Bt,{source:V,draft:p,onChange:m},c),(0,$.jsx)(`p`,{className:`text-xs leading-relaxed text-muted`,children:U?`brain-api 订阅:同时接收消息和推送会话正文,占 1 个激活名额。`:u===`subscribe`?`接收外部消息,发送到当前会话。`:`将会话正文发送到 HTTP 源。`}),(0,$.jsxs)(`div`,{className:`flex justify-between gap-2`,children:[(0,$.jsx)(f,{variant:`ghost`,onClick:()=>void I(),children:`添加源`}),(0,$.jsx)(f,{type:`submit`,variant:`primary`,disabled:!c,loading:L.isPending,children:`注册`})]}),(0,$.jsx)(`p`,{className:`text-xs text-muted`,children:`注册后点击“激活”开始运行。`})]})]}),o===`sources`&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{className:`space-y-2`,children:B.map(e=>(0,$.jsxs)(`div`,{className:`rounded-lg border border-border bg-surface px-3 py-2.5`,children:[(0,$.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,$.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm font-medium`,children:e.name}),e.kind===`brain-api`&&(0,$.jsx)(C,{children:`brain-api 订阅`}),e.hasHeaders&&(0,$.jsx)(C,{children:`已设请求头`}),e.hasExtraBody&&(0,$.jsx)(C,{children:`Extra body`})]}),(0,$.jsx)(`p`,{className:`mt-1 break-all font-mono text-xs text-muted`,children:e.url}),e.kind===`brain-api`&&(0,$.jsxs)(`p`,{className:`mt-1 break-all font-mono text-xs text-muted`,children:[`默认 brain_id: `,e.brainId??`未设置`]}),(0,$.jsxs)(`div`,{className:`mt-2 flex justify-end gap-2`,children:[(0,$.jsx)(f,{variant:`ghost`,size:`sm`,disabled:L.isPending,onClick:()=>oe(e),children:`删除`}),(0,$.jsx)(f,{size:`sm`,disabled:L.isPending||x,onClick:()=>void I(e),children:`编辑`})]})]},e.id))}),x&&(0,$.jsx)(`p`,{className:`text-sm text-muted`,role:`status`,children:`正在加载源配置…`}),!y&&(0,$.jsx)(f,{className:`w-full`,disabled:x,onClick:()=>void I(),children:`添加源`}),y&&(0,$.jsxs)(`form`,{className:`space-y-3 border-t border-border pt-3`,onSubmit:e=>{e.preventDefault(),se()},children:[(0,$.jsx)(`p`,{className:`text-sm font-medium`,children:y.id?`编辑源`:`添加源`}),y.id?(0,$.jsx)(C,{children:y.kind===`brain-api`?`brain-api 订阅`:`HTTP 源`}):(0,$.jsx)(_,{label:`源类型`,value:y.kind,disabled:L.isPending,onChange:e=>{L.isPending||b({...y,kind:e})},stretch:!0,options:[{value:`http`,label:`HTTP 源`},{value:`brain-api`,label:`brain-api 订阅`}]}),(0,$.jsx)(S,{label:y.kind===`brain-api`?`名称(可选)`:`名称`,children:(0,$.jsx)(`input`,{"aria-label":`源名称`,value:y.name,onChange:e=>b({...y,name:e.target.value}),className:`h-10 md:h-8 w-full min-w-0 rounded-md border border-border bg-surface px-3 text-base md:text-sm text-text outline-none transition-colors placeholder:text-muted/80 hover:border-muted/40 focus:border-accent/60 focus:ring-2 focus:ring-accent/20 disabled:opacity-50`,maxLength:100})}),(0,$.jsx)(S,{label:y.kind===`brain-api`?`服务 URL`:`HTTP 地址`,hint:y.kind===`brain-api`?`填写服务根地址,自动连接两个收发端点。`:void 0,children:(0,$.jsx)(`input`,{"aria-label":`源地址`,value:y.url,onChange:e=>b({...y,url:e.target.value}),className:w,placeholder:y.kind===`brain-api`?`http://localhost:8000`:`https://example.com/messages`,required:!0})}),y.kind===`brain-api`&&(0,$.jsx)(S,{label:`默认 brain_id(可选)`,hint:`也可以在每个会话注册时填写。`,children:(0,$.jsx)(`input`,{"aria-label":`brain_id`,value:y.brainId,onChange:e=>b({...y,brainId:e.target.value}),className:w,maxLength:256,placeholder:`留空,在会话中配置`})}),y.kind===`brain-api`&&(0,$.jsx)(S,{label:`默认 x-brain-voice(可选)`,hint:`仅用于推送请求头,会话可以覆写。`,children:(0,$.jsx)(`input`,{"aria-label":`x-brain-voice`,value:y.brainVoice,onChange:e=>b({...y,brainVoice:e.target.value}),className:w,maxLength:1024})}),y.kind===`http`&&(0,$.jsx)(S,{label:`订阅请求方式`,group:!0,hint:`仅影响订阅;推送始终使用 POST。`,children:(0,$.jsx)(_,{label:`订阅请求方式`,value:y.subscribeMethod,onChange:e=>b({...y,subscribeMethod:e}),options:[{value:`GET`,label:`GET`},{value:`POST`,label:`POST`}]})}),(0,$.jsx)(S,{label:`请求超时(秒)`,hint:`订阅使用长轮询,按外部服务的等待时间设置。`,children:(0,$.jsx)(`input`,{"aria-label":`源超时`,type:`number`,min:1,max:600,value:y.timeout,onChange:e=>b({...y,timeout:e.target.value}),className:`h-10 md:h-8 w-full min-w-0 rounded-md border border-border bg-surface px-3 text-base md:text-sm text-text outline-none transition-colors placeholder:text-muted/80 hover:border-muted/40 focus:border-accent/60 focus:ring-2 focus:ring-accent/20 disabled:opacity-50`})}),(0,$.jsx)(S,{label:`请求头 JSON(可选)`,hint:`如鉴权 Token。留空清除,Content-Type 固定为 application/json。`,children:(0,$.jsx)(`textarea`,{"aria-label":`源请求头`,value:y.headers,onChange:e=>b({...y,headers:e.target.value}),className:h,rows:3,placeholder:`{"Authorization":"Bearer …"}`,spellCheck:!1})}),y.kind===`http`&&(0,$.jsx)(S,{label:`Extra body JSON(可选)`,hint:`POST 订阅按原样发送;推送支持 {{text}}。留空清除。`,children:(0,$.jsx)(`textarea`,{"aria-label":`源额外请求体`,value:y.extraBody,onChange:e=>b({...y,extraBody:e.target.value}),className:h,rows:4,placeholder:y.subscribeMethod===`POST`?`{"brain_id":"你的ID"}`:`{"target_id":"频道ID","content":"{{text}}"}`,spellCheck:!1})}),Y&&(0,$.jsx)(`p`,{role:`alert`,className:`whitespace-pre-wrap break-words text-sm text-danger`,children:Y instanceof Error?Y.message:String(Y)}),(0,$.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,$.jsx)(f,{variant:`ghost`,onClick:()=>void N(),children:`取消`}),(0,$.jsx)(f,{variant:`primary`,type:`submit`,disabled:!y.url.trim()||y.kind===`http`&&!y.name.trim(),loading:L.isPending,children:`保存源`})]})]}),(0,$.jsxs)(`div`,{className:`space-y-2 rounded-lg bg-surface-2 p-3 text-xs leading-relaxed text-muted`,children:[(0,$.jsx)(`p`,{children:`订阅接收消息,推送发送会话正文。`}),(0,$.jsx)(`p`,{children:`brain-api 自动收发。源可设置默认 brain_id 和 voice,会话注册可覆写;激活前需有 brain_id。`}),(0,$.jsxs)(`details`,{children:[(0,$.jsx)(`summary`,{className:`cursor-pointer`,children:`查看消息格式`}),(0,$.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,$.jsxs)(`p`,{children:[`订阅无消息时返回 `,(0,$.jsx)(`code`,{children:`{"kind":"empty"}`}),`,有消息时返回:`]}),(0,$.jsx)(`pre`,{className:`whitespace-pre-wrap break-words`,children:`{"kind":"text","text":"正文"}`}),(0,$.jsxs)(`p`,{children:[`可附带唯一 `,(0,$.jsx)(`code`,{children:`id`}),` 去重;省略时每次响应都作为新消息。正文原样投递。`]}),(0,$.jsx)(`p`,{children:`订阅可选 GET 或 POST。POST 请求体为 Extra body 原文,不附加推送字段。`}),(0,$.jsx)(`p`,{children:`推送使用 POST JSON,Extra body 合并到以下内容:`}),(0,$.jsx)(`pre`,{className:`whitespace-pre-wrap break-words`,children:`{"kind":"text","id":"消息ID","text":"正文","sessionId":"会话ID"}`}),(0,$.jsxs)(`p`,{children:[`Extra body 的字符串可使用 `,(0,$.jsx)(`code`,{children:`{{text}}`}),`、`,(0,$.jsx)(`code`,{children:`{{id}}`}),`、`,(0,$.jsx)(`code`,{children:`{{sessionId}}`}),`,不能覆盖上述四个字段。`]}),(0,$.jsx)(`p`,{children:`服务重启后,待投递消息和去重记录会清空。`})]})]})]})]})]}),g&&B.find(e=>e.id===g.sourceId)&&(0,$.jsx)(Vt,{binding:g,source:B.find(e=>e.id===g.sourceId),onClose:()=>v(null)},g.id)]})}function Ut(e){let t=R();return()=>t.invalidateQueries({queryKey:[`sessions`,e]})}function Wt({pid:e,sid:t,meta:n}){let r=V(),i=Ut(e),[a,o]=(0,Q.useState)(!1),[s,c]=(0,Q.useState)(!1),[l,u]=(0,Q.useState)(!1),[d,p]=(0,Q.useState)(!1),m=n=>T(`/api/projects/${e}/sessions/${t}`,{method:`PATCH`,json:n}).then(i),h=k({mutationFn:()=>T(`/api/projects/${e}/sessions/${t}/fork`,{method:`POST`,json:{}}),onSuccess:({id:t})=>{i(),r(`/p/${e}/s/${t}`)}});return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(F,{label:`会话操作`,testId:`session-menu`,children:[(0,$.jsx)(M,{onClick:()=>o(!0),children:`重命名`}),(0,$.jsx)(M,{onClick:()=>m({pinned:!n?.pinned}),children:n?.pinned?`取消置顶`:`置顶`}),(0,$.jsx)(M,{onClick:()=>m({archived:!n?.archived}),children:n?.archived?`取消归档`:`归档`}),(0,$.jsx)(M,{onClick:()=>h.mutate(),children:`Fork 整个会话`}),(0,$.jsx)(M,{onClick:()=>At(t),children:`额外目录…`}),(0,$.jsx)(M,{onClick:()=>u(!0),children:`推送与订阅…`}),(0,$.jsx)(M,{onClick:()=>window.open(`/api/projects/${e}/sessions/${t}/export`,`_blank`),children:`导出对话`}),(0,$.jsx)(M,{onClick:()=>void pe(t),children:`复制会话 ID`}),(0,$.jsx)(M,{onClick:()=>p(!0),children:`会话文件…`}),(0,$.jsx)(M,{onClick:()=>void pe(`claude --resume ${t}`),children:`复制 CLI 续聊命令`}),(0,$.jsx)(M,{danger:!0,onClick:()=>c(!0),children:`删除`})]}),a&&(0,$.jsx)(Gt,{current:n?.title??``,onClose:()=>o(!1),onSave:e=>m({title:e}).then(()=>o(!1))}),l&&(0,$.jsx)(Ht,{pid:e,sid:t,onClose:()=>u(!1)},t),d&&(0,$.jsx)(Kt,{pid:e,sid:t,onClose:()=>p(!1)}),s&&(0,$.jsxs)(P,{title:`删除会话?`,onClose:()=>c(!1),testId:`delete-dialog`,children:[(0,$.jsx)(`p`,{className:`text-sm text-muted`,children:`会话文件会从磁盘删除,CLI 里也将看不到它。这个操作无法撤销。`}),(0,$.jsxs)(`div`,{className:`mt-5 flex justify-end gap-2`,children:[(0,$.jsx)(f,{variant:`ghost`,onClick:()=>c(!1),children:`取消`}),(0,$.jsx)(f,{variant:`danger`,onClick:async()=>{await T(`/api/projects/${e}/sessions/${t}`,{method:`DELETE`}),i(),r(`/p/${e}`)},children:`确认删除`})]})]})]})}function Gt({current:e,onClose:t,onSave:n}){let[r,i]=(0,Q.useState)(e);return(0,$.jsx)(P,{title:`重命名会话`,onClose:t,children:(0,$.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),r.trim()&&n(r.trim())},children:[(0,$.jsx)(`input`,{"aria-label":`会话标题`,autoFocus:!0,value:r,onChange:e=>i(e.target.value),className:`h-10 w-full rounded-md border border-border bg-surface px-3 text-base outline-none focus:border-accent/60 focus:ring-2 focus:ring-accent/20 md:h-9 md:text-sm`}),(0,$.jsxs)(`div`,{className:`mt-4 flex justify-end gap-2`,children:[(0,$.jsx)(f,{variant:`ghost`,onClick:t,children:`取消`}),(0,$.jsx)(f,{type:`submit`,variant:`primary`,children:`保存`})]})]})})}function Kt({pid:e,sid:t,onClose:n}){let r=z({queryKey:[`session-info`,e,t],queryFn:()=>T(`/api/projects/${e}/sessions/${t}/info`),staleTime:0});return(0,$.jsxs)(P,{title:`会话文件`,onClose:n,testId:`session-info-dialog`,children:[(0,$.jsxs)(`dl`,{className:`space-y-4 text-sm`,children:[(0,$.jsx)(qt,{label:`会话 ID`,value:t,testId:`session-info-id`}),r.isPending?(0,$.jsx)(`p`,{className:`text-xs text-muted`,children:`正在读取会话文件…`}):r.error?(0,$.jsxs)(`p`,{role:`alert`,className:`text-xs text-danger`,children:[`读取失败:`,r.error instanceof Error?r.error.message:String(r.error)]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(qt,{label:`工作目录`,value:r.data.cwd,testId:`session-info-cwd`}),(0,$.jsx)(qt,{label:`会话文件`,value:r.data.file,empty:`还没有写入磁盘。发送第一条消息后,CLI 会创建这个文件。`,testId:`session-info-file`})]})]}),(0,$.jsx)(`p`,{className:`mt-5 text-xs leading-relaxed text-muted`,children:`会话文件是 JSONL 格式,每行一条消息,可以用文本编辑器直接查看或备份。`})]})}function qt({label:e,value:t,empty:n,testId:r}){return(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`dt`,{className:`mb-1 text-xs text-muted`,children:e}),t?(0,$.jsxs)(`dd`,{className:`flex items-start gap-2`,children:[(0,$.jsx)(`code`,{className:`min-w-0 flex-1 break-all rounded-md bg-surface-2 px-2 py-1.5 font-mono text-xs`,"data-testid":r,children:t}),(0,$.jsx)(ve,{text:t,label:`复制${e}`,className:`shrink-0`})]}):(0,$.jsx)(`dd`,{className:`text-xs text-muted`,"data-testid":r,children:n})]})}function Jt({pid:e,meta:t,sessions:n}){if(!t?.forkedFrom)return null;let r=n?.find(e=>e.id===t.forkedFrom);return(0,$.jsxs)(H,{to:`/p/${e}/s/${t.forkedFrom}`,className:`truncate text-xs text-muted hover:text-accent`,"data-testid":`lineage`,children:[`⑂ 分支自:`,r?.title||t.forkedFrom.slice(0,8)]})}function Yt({pid:e,sid:t,uuid:n}){let r=V(),i=Ut(e),[a,o]=(0,Q.useState)(!1),[s,c]=(0,Q.useState)(null);async function l(){try{let{id:a}=await T(`/api/projects/${e}/sessions/${t}/fork`,{method:`POST`,json:{beforeUuid:n}});i(),r(`/p/${e}/s/${a}`)}catch(e){c(e instanceof y?e.message:`fork 失败`)}}return(0,$.jsxs)(`div`,{className:`flex justify-end`,children:[(0,$.jsxs)(F,{label:`消息操作`,testId:`message-menu`,children:[(0,$.jsx)(M,{onClick:l,children:`从这条消息之前 fork`}),(0,$.jsx)(M,{onClick:()=>o(!0),children:`回退到这里…`})]}),s&&(0,$.jsx)(`span`,{className:`text-xs text-danger`,children:s}),a&&(0,$.jsx)(Zt,{pid:e,sid:t,uuid:n,onClose:()=>o(!1)})]})}var Xt=[{value:`conversation`,title:`只回退对话`,detail:`这条消息和它之后的对话从当前会话移除,消息内容放回输入框,可以修改后重新发送。项目文件不变。原来的对话仍保存在会话文件里,可以 fork 找回。`},{value:`code`,title:`只回退代码`,detail:`把 Claude 从这条消息起用 Edit/Write 改过的文件恢复到发送前的状态。对话不变。用 Bash 命令改动的文件不会恢复。`},{value:`both`,title:`对话和代码都回退`,detail:`先恢复文件,再回退对话。`}];function Zt({pid:e,sid:t,uuid:n,onClose:r}){let i=V(),a=R(),[o,s]=(0,Q.useState)(`conversation`),[c,l]=(0,Q.useState)(null),[u,d]=(0,Q.useState)(!1),p=z({queryKey:[`rewind-preview`,t,n],queryFn:()=>T(`/api/projects/${e}/sessions/${t}/rewind`,{method:`POST`,json:{userUuid:n,mode:`code`,dryRun:!0}}),enabled:o!==`conversation`,staleTime:0}),m=p.data?.files;async function h(){d(!0),l(null);try{let s=await T(`/api/projects/${e}/sessions/${t}/rewind`,{method:`POST`,json:{userUuid:n,mode:o}});if(s.files&&!s.files.canRewind)throw new y(400,s.files.error||`无法回退代码`);if(a.invalidateQueries({queryKey:[`sessions`,e]}),o!==`code`){let n=s.newSessionId??t;_e(n,s.text,s.rewindId),s.newSessionId&&i(`/p/${e}/s/${s.newSessionId}`)}r()}catch(e){l(e instanceof y?e.message:`回退失败`)}finally{d(!1)}}return(0,$.jsxs)(P,{title:`回退到这条消息`,onClose:r,testId:`rewind-dialog`,children:[(0,$.jsx)(j,{label:`回退方式`,value:o,onChange:s,options:Xt.map(e=>({value:e.value,title:e.title,detail:e.detail}))}),o!==`conversation`&&(0,$.jsx)(`div`,{className:`mt-3 rounded-lg bg-surface-2 px-3 py-2 text-xs`,"data-testid":`rewind-preview`,children:p.isPending?`正在计算会恢复哪些文件…`:m?.canRewind?m.filesChanged?.length?`将恢复 ${m.filesChanged.length} 个文件(+${m.insertions??0} −${m.deletions??0}):${m.filesChanged.join(`、`)}`:`没有需要恢复的文件。`:`无法回退代码:${m?.error??`没有检查点`}`}),c&&(0,$.jsx)(`p`,{className:`mt-3 text-sm text-danger`,children:c}),(0,$.jsxs)(`div`,{className:`mt-5 flex justify-end gap-2`,children:[(0,$.jsx)(f,{variant:`ghost`,onClick:r,children:`取消`}),(0,$.jsx)(f,{variant:`primary`,loading:u,onClick:h,children:`回退`})]})]})}function Qt(e,t){return z({queryKey:[`btw`,e,t],queryFn:({signal:n})=>T(`/api/projects/${e}/sessions/${t}/btw`,{signal:n})})}function $t(e,t,n){let r=R(),i=(0,Q.useRef)({pid:e,sid:t});i.current={pid:e,sid:t};let a=(0,Q.useRef)(!1);return(0,Q.useEffect)(()=>(a.current=!0,()=>{a.current=!1}),[]),async o=>{let{id:s}=await T(`/api/projects/${e}/sessions/${t}/btw`,{method:`POST`,json:{question:o}});r.invalidateQueries({queryKey:[`btw`,e,t]}),a.current&&i.current.pid===e&&i.current.sid===t&&n?.(s)}}function en(e){let t=R();return k({mutationFn:t=>T(`/api/projects/${e}/sessions/${t}/promote`,{method:`POST`}),onSuccess:async(n,r)=>{await t.cancelQueries({queryKey:[`btw`,e]}),t.setQueriesData({queryKey:[`btw`,e]},e=>e&&{parent:e.parent,children:e.children.filter(e=>e.id!==r)}),t.setQueryData([`btw`,e,r],e=>({parent:null,children:e?.children??[]})),t.invalidateQueries({queryKey:[`btw`,e]}),t.invalidateQueries({queryKey:[`sessions`,e]})}})}function tn({pid:e,sid:t}){let n=Qt(e,t),r=en(e),i=n.data?.parent;return i?(0,$.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-surface-2/60 px-4 py-2 text-sm md:px-6`,"data-testid":`btw-banner`,children:[(0,$.jsx)(`span`,{className:`text-muted`,children:`btw 旁支 · 后续消息留在此会话`}),(0,$.jsx)(H,{to:`/p/${e}/s/${i}`,className:`text-accent underline underline-offset-2`,children:`返回主会话`}),(0,$.jsx)(f,{size:`sm`,className:`ml-auto`,onClick:()=>r.mutate(t),loading:r.isPending,children:`转为普通会话`}),r.error&&(0,$.jsxs)(`p`,{role:`alert`,className:`basis-full text-xs text-danger`,children:[`转换失败:`,r.error.message]})]}):null}function nn({pid:e,sid:t,open:n,setOpen:r}){let i=Qt(e,t),a=en(e),o=V(),s=$t(e,t,t=>o(`/p/${e}/s/${t}`)),[c,l]=(0,Q.useState)(``),[u,d]=(0,Q.useState)(),[p,m]=(0,Q.useState)(!1),h=(0,Q.useRef)(!1),g=i.data?.children??[];if(g.length===0&&!n)return null;let _=g.filter(e=>e.state!==`idle`).length;return(0,$.jsxs)(`div`,{className:`mb-2 rounded-xl border border-border bg-surface`,"data-testid":`btw-panel`,children:[(0,$.jsxs)(`button`,{className:`flex w-full items-center gap-2 px-3 py-2 text-left text-sm`,onClick:()=>r(!n),"aria-expanded":n,children:[(0,$.jsx)(ie,{open:n}),(0,$.jsx)(`span`,{children:`旁支问答`}),(0,$.jsx)(`span`,{className:`text-muted`,children:g.length}),_>0&&(0,$.jsx)(`span`,{className:`size-1.5 animate-pulse rounded-full bg-accent`})]}),n&&(0,$.jsxs)(`div`,{className:`max-h-[40dvh] space-y-2 overflow-y-auto overscroll-contain border-t border-border px-3 py-2`,children:[g.map(t=>(0,$.jsxs)(`div`,{className:`rounded-lg border border-border px-3 py-2`,"data-testid":`btw-item`,"data-state":t.state,children:[(0,$.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,$.jsx)(fe,{state:t.state}),(0,$.jsx)(`div`,{className:`min-w-0 flex-1 break-words text-sm font-medium`,children:t.question})]}),(0,$.jsx)(`div`,{className:`mt-1 text-sm`,"data-testid":`btw-answer`,children:t.answer?(0,$.jsx)(Ne,{text:t.answer}):(0,$.jsx)(`span`,{className:`text-muted`,children:t.state===`idle`?`暂无回答`:`正在回答…`})}),(0,$.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2 text-xs`,children:[(0,$.jsx)(f,{size:`sm`,onClick:()=>o(`/p/${e}/s/${t.id}`),children:`继续对话`}),(0,$.jsx)(f,{size:`sm`,onClick:()=>a.mutate(t.id),loading:a.isPending&&a.variables===t.id,disabled:a.isPending,children:`转为普通会话`})]})]},t.id)),g.length===0&&(0,$.jsxs)(`form`,{className:`flex gap-2`,onSubmit:async e=>{if(e.preventDefault(),c.trim()&&!h.current){h.current=!0,m(!0),d(void 0);try{await s(c),l(``)}catch(e){d(e instanceof Error?e.message:String(e))}finally{h.current=!1,m(!1)}}},children:[(0,$.jsx)(`input`,{"aria-label":`旁支问题`,placeholder:`创建一个旁支,单独讨论这个问题`,value:c,onChange:e=>l(e.target.value),className:`h-10 min-w-0 flex-1 rounded-md border border-border bg-bg px-3 text-base outline-none focus:border-accent/60 focus:ring-2 focus:ring-accent/20 md:h-8 md:text-sm`}),(0,$.jsx)(f,{type:`submit`,variant:`primary`,disabled:!c.trim(),loading:p,children:`创建旁支`})]}),(0,$.jsx)(`p`,{className:`text-xs text-muted`,children:`每个主会话绑定一个 btw 旁支。继续对话不会新建;转为普通会话后,主会话才能创建新的旁支。`}),u&&(0,$.jsx)(`p`,{className:`text-xs text-danger`,role:`alert`,children:u}),a.error&&(0,$.jsxs)(`p`,{className:`text-xs text-danger`,role:`alert`,children:[`转换失败:`,a.error.message]})]})]})}function rn(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e5?0:1)}k`:String(e)}function an({pid:e,sid:t,onClear:n}){let r=Ke(e,t),i=q(t),a=i?.events.filter(e=>e.k===`sdk`&&e.m.type===`result`).length??0,o=i?.snapshot.state,s=z({queryKey:[`context`,t,a,o===`idle`],queryFn:()=>T(`/api/projects/${e}/sessions/${t}/context`),placeholderData:e=>e}),c=N(),[l,u]=(0,Q.useState)(``),[p,m]=(0,Q.useState)(),h=s.data,g=h?Math.round(h.percentage):void 0,_=h?.categories.filter(e=>e.kind!==`deferred`)??[];return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(f,{ref:c.triggerRef,iconOnly:!0,icon:(0,$.jsx)(d,{size:18,className:g!==void 0&&g>=80?`text-danger`:`text-muted`}),onClick:c.toggle,"aria-haspopup":`dialog`,"aria-expanded":c.open,"aria-label":`上下文用量`,title:g===void 0?`上下文用量`:`上下文用量:${g}%`,"data-testid":`context-meter`}),(0,$.jsx)(ne,{open:c.open,onClose:c.close,anchor:c.triggerRef,align:`end`,width:340,label:`上下文用量`,testId:`context-details`,children:(0,$.jsxs)(`div`,{className:`px-4 pb-3 pt-2 text-sm`,children:[(0,$.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,$.jsx)(`h3`,{className:`text-base`,children:`上下文`}),i?.snapshot.costUsd!==void 0&&(0,$.jsxs)(`span`,{className:`text-xs tabular-nums text-muted`,children:[`本会话 $`,i.snapshot.costUsd.toFixed(4)]})]}),h?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{className:`mt-2 h-2 overflow-hidden rounded-full bg-surface-2`,children:(0,$.jsx)(`div`,{className:`h-full ${g!==void 0&&g>=80?`bg-danger`:`bg-accent`}`,style:{width:`${g??0}%`}})}),(0,$.jsxs)(`p`,{className:`mt-1.5 text-xs text-muted`,children:[rn(h.totalTokens),` / `,rn(h.maxTokens),` tokens · `,g,`% · `,h.model]}),(0,$.jsx)(`table`,{className:`mt-2 w-full text-xs`,children:(0,$.jsx)(`tbody`,{children:_.map(e=>(0,$.jsxs)(`tr`,{className:`border-t border-border`,"data-testid":`context-row`,children:[(0,$.jsx)(`td`,{className:`py-1.5 pr-2`,children:e.name}),(0,$.jsx)(`td`,{className:`py-1.5 pr-2 text-right font-mono tabular-nums`,children:rn(e.tokens)}),(0,$.jsxs)(`td`,{className:`w-12 py-1.5 text-right font-mono tabular-nums text-muted`,children:[h.maxTokens?(e.tokens/h.maxTokens*100).toFixed(1):`0`,`%`]})]},e.name))})})]}):(0,$.jsx)(`p`,{className:`mt-1 text-muted`,children:`发出第一条消息后可见。`}),(0,$.jsxs)(`div`,{className:`mt-3 space-y-2 border-t border-border pt-3`,children:[(0,$.jsx)(`input`,{"aria-label":`压缩说明`,placeholder:`压缩说明(可选),如:保留接口设计的讨论`,value:l,onChange:e=>u(e.target.value),className:`h-10 w-full rounded-md border border-border bg-bg px-3 text-base outline-none focus:border-accent/60 focus:ring-2 focus:ring-accent/20 md:h-8 md:text-sm`}),(0,$.jsxs)(`div`,{className:`flex gap-2`,children:[(0,$.jsx)(f,{className:`flex-1`,onClick:async()=>{c.close(),await r(l)?u(``):c.setOpen(!0)},children:`压缩`}),(0,$.jsx)(f,{className:`flex-1`,title:`新建一个会话并跳转过去,原会话保留`,onClick:async()=>{c.close(),m(void 0);try{await n()||c.setOpen(!0)}catch(e){m(e instanceof Error?e.message:String(e)),c.setOpen(!0)}},children:`新开会话`})]}),p&&(0,$.jsx)(`p`,{role:`alert`,className:`text-xs text-danger`,children:p})]})]})})]})}var on={low:`低`,medium:`中`,high:`高`,xhigh:`很高`,max:`最高`},sn=[];function cn(e){let t=R(),n=V(),r=X();return async()=>{if(!(await r({title:`新开会话?`,description:`将新建并切换到一个没有当前上下文的会话。原会话和历史记录保留,正在运行的任务不会停止。`,confirmLabel:`新开会话`})).confirmed)return!1;let{id:i}=await T(`/api/projects/${e}/sessions`,{method:`POST`});return t.invalidateQueries({queryKey:[`sessions`,e]}),n(`/p/${e}/s/${i}`),!0}}function ln(){let{pid:e,sid:t}=B(),n=V(),r=q(t),i=r?.snapshot??K,a=Ie(e=>e.mode);(0,Q.useEffect)(()=>J(t,e),[t,e]),(0,Q.useEffect)(()=>Fe(e,t),[e,t]);let o=r?.history?.source===`main`?r.history:void 0,s=r?.resetCount;(0,Q.useEffect)(()=>{s!==void 0&&se(t,e)},[t,e,s]);let c=o?.mode===`history`,l=(0,Q.useMemo)(()=>new ce,[t]),u=c?sn:r?.events??sn,d=(0,Q.useMemo)(()=>l.update(o?.items,u),[l,o?.items,u]),f=(0,Q.useMemo)(()=>({older:!!o?.older||!c&&!!r?.evicted,newer:!!o?.newer,historical:c,loading:!!o?.loading,error:o?.error,load:n=>se(t,e,n)}),[o?.older,o?.newer,c,o?.loading,o?.error,r?.evicted,t,e]),p=L(e),m=p.data?.find(e=>e.id===t),h=(0,Q.useMemo)(()=>r?.todos??le(d),[r?.todos,d]),g=(0,Q.useMemo)(()=>new Map,[t]);for(let e of h)g.set(e.id,e.subject);for(;g.size>1024;)g.delete(g.keys().next().value);let _=I().data?.find(t=>t.id===e),v=(0,Q.useMemo)(()=>({root:_?.path,sessionUrl:`/p/${e}/s/${t}`,loadMessage:n=>oe(t,e,n),readImageUrl:n=>`/api/projects/${e}/sessions/${t}/tools/${encodeURIComponent(n)}/image`,userActions:n=>(0,$.jsx)(Yt,{pid:e,sid:t,uuid:n}),backgroundTool:i.state===`idle`?void 0:async n=>{await T(`/api/projects/${e}/sessions/${t}/tools/${encodeURIComponent(n)}/background`,{method:`POST`})},todoNames:g}),[_?.path,e,t,g,i.state]),y=z({queryKey:[`rewind-draft`,t,r?.resetCount??0,i.state],queryFn:async()=>{let n=Ce(t).generation;return{...await T(`/api/projects/${e}/sessions/${t}/draft`),generation:n}}});(0,Q.useEffect)(()=>{y.data?.rewindText!=null&&y.data.rewindId&&de(t,y.data.rewindText,y.data.rewindId,y.data.generation)},[y.data,t]);let[b,x]=(0,Q.useState)(!1);(0,Q.useEffect)(()=>x(!1),[t]);let S=$t(e,t,t=>n(`/p/${e}/s/${t}`)),C=cn(e),w=Nt(e,t),E=St(e,t,d,i.state!==`idle`);return(0,$.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:[(0,$.jsx)(un,{pid:e,sid:t,meta:m,sessions:p.data,onClear:C}),(0,$.jsx)(tn,{pid:e,sid:t}),(0,$.jsx)(Ft,{pid:e,sid:t,meta:m}),(0,$.jsx)(ke.Provider,{value:v,children:(0,$.jsx)(Ue,{projectId:e,sessionId:t,enabled:a,className:`flex min-h-0 flex-1 flex-col`,children:(0,$.jsx)(je,{items:d,loading:!o||!!o.loading&&!o.items.length,running:!c&&i.state===`running`,waiting:!c&&i.state===`requires_action`,turnSlots:E,history:f},t)})}),(0,$.jsxs)(`div`,{className:`mx-auto w-full max-w-4xl px-3 pb-[max(env(safe-area-inset-bottom),0.75rem)] md:px-6`,children:[y.data?.rewindText!=null&&(0,$.jsx)(`div`,{className:`mb-2 rounded-lg bg-surface-2 px-3 py-2 text-xs text-muted`,"data-testid":`rewind-banner`,children:`已回退到这条消息之前。发送消息后,对话从这里继续。`}),(0,$.jsx)(Xe,{pid:e,sid:t,snapshot:i,turns:d.filter(e=>e.kind===`result`).length,historyRevision:r?.historyRevision,resetCount:s??0}),(0,$.jsx)(Ge,{todos:h}),i.pending.map(e=>(0,$.jsx)(vt,{req:e,sessionId:t},e.id)),(0,$.jsx)(nn,{pid:e,sid:t,open:b,setOpen:x}),(0,$.jsx)(dn,{}),(0,$.jsx)(lt,{projectId:e,sessionId:t,state:i.state,cronsStale:i.cronsStale,onBtw:S,onClear:C,onAddDir:w},t)]})]})}function un({pid:e,sid:t,meta:n,sessions:r,onClear:i}){let a=q(t)?.snapshot??K,o=A(e),s=(o.data?.find(e=>e.value===a.model)??o.data?.[0])?.efforts??[],l=be();return(0,$.jsxs)(`header`,{className:`flex flex-wrap items-center gap-x-3 gap-y-2 border-b border-border px-2 py-2 md:flex-nowrap md:px-5`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 flex-1 basis-48 items-center gap-2`,children:[(0,$.jsx)(`button`,{className:`rounded-md p-2.5 hover:bg-surface-2 md:hidden`,onClick:l,"aria-label":`打开导航`,children:(0,$.jsx)(he,{})}),(0,$.jsx)(fe,{state:a.state}),(0,$.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,$.jsxs)(`h1`,{className:`truncate text-lg md:max-w-[300px]`,title:n?.title,children:[n?.pinned&&(0,$.jsx)(`span`,{className:`mr-1 text-accent`,"aria-label":`已置顶`,children:`•`}),n?.title||`新会话`]}),(0,$.jsx)(Jt,{pid:e,meta:n,sessions:r})]}),(0,$.jsx)(Wt,{pid:e,sid:t,meta:n})]}),(0,$.jsxs)(`div`,{className:`flex w-full min-w-0 items-center gap-1.5 md:w-auto md:gap-2`,children:[(0,$.jsx)(W,{label:`模型`,value:a.model??``,onChange:n=>G({t:`setModel`,sessionId:t,projectId:e,model:n}),options:[{value:``,label:`默认模型`,text:`默认`,hint:`使用设置里的默认值`},...(o.data??[]).map(e=>({value:e.value,label:e.displayName,text:e.displayName.replace(/\s*\(.*\)$/,``),hint:e.description}))],icon:(0,$.jsx)(u,{className:`shrink-0 text-muted`}),className:`min-w-0 flex-1 md:w-40 md:flex-none`,menuWidth:280,testId:`model-select`}),s.length>0&&(0,$.jsx)(W,{label:`思考强度`,value:a.effort??``,onChange:n=>G({t:`setEffort`,sessionId:t,projectId:e,effort:n}),options:[{value:``,label:`默认强度`,text:`默认`},...s.map(e=>({value:e,label:on[e]??e,text:on[e]??e}))],icon:(0,$.jsx)(d,{className:`shrink-0 text-muted`}),className:`min-w-0 flex-1 md:w-32 md:flex-none`,testId:`effort-select`}),(0,$.jsx)(W,{label:`计划模式`,value:a.planMode?`plan`:`execute`,onChange:n=>G({t:`setPlanMode`,sessionId:t,projectId:e,on:n===`plan`}),options:[{value:`execute`,label:`执行`,hint:`直接执行任务`},{value:`plan`,label:`计划`,hint:`先制定计划,再确认执行`}],icon:(0,$.jsx)(c,{className:a.planMode?`text-accent`:`text-muted`}),className:`shrink-0`,testId:`plan-select`}),(0,$.jsx)(an,{pid:e,sid:t,onClear:i}),a.costUsd!==void 0&&(0,$.jsxs)(`span`,{className:`hidden whitespace-nowrap text-xs tabular-nums text-muted lg:inline`,title:`会话累计花费`,children:[`$`,a.costUsd.toFixed(3)]})]})]})}function dn(){let e=xe(e=>e.connected),[t,n]=(0,Q.useState)(!1);return(0,Q.useEffect)(()=>{if(e)return n(!1);let t=setTimeout(()=>n(!0),1500);return()=>clearTimeout(t)},[e]),t?(0,$.jsxs)(`div`,{className:`mb-2 flex items-center gap-2 rounded-lg border border-amber-500/40 bg-amber-500/5 px-3 py-2 text-xs text-amber-700 dark:text-amber-400`,role:`status`,"data-testid":`connection-notice`,children:[(0,$.jsx)(`span`,{className:`size-1.5 animate-pulse rounded-full bg-amber-500`,"aria-hidden":!0}),`连接已断开,正在重连…现在发出的消息会在重连后送达。`]}):null}export{ln as SessionView};