reasonix 0.40.0 → 0.43.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 (194) hide show
  1. package/README.md +47 -16
  2. package/README.zh-CN.md +19 -13
  3. package/dashboard/app.css +8 -4
  4. package/dashboard/dist/app.js +377 -227
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/dist/cli/acp-DAGPCVFZ.js +713 -0
  7. package/dist/cli/acp-DAGPCVFZ.js.map +1 -0
  8. package/dist/cli/chat-7ES4IBNH.js +50 -0
  9. package/dist/cli/{chunk-E46ECXJD.js → chunk-2425HK6U.js} +2 -1
  10. package/dist/cli/{chunk-E46ECXJD.js.map → chunk-2425HK6U.js.map} +1 -1
  11. package/dist/cli/chunk-25T6CVUP.js +172 -0
  12. package/dist/cli/chunk-25T6CVUP.js.map +1 -0
  13. package/dist/cli/{chunk-7DLHHBGN.js → chunk-2K65GZBT.js} +16 -5
  14. package/dist/cli/chunk-2K65GZBT.js.map +1 -0
  15. package/dist/cli/{chunk-KMWKGPFZ.js → chunk-2KDUS647.js} +14 -4
  16. package/dist/cli/chunk-2KDUS647.js.map +1 -0
  17. package/dist/cli/chunk-2R4QCDOZ.js +11392 -0
  18. package/dist/cli/chunk-2R4QCDOZ.js.map +1 -0
  19. package/dist/cli/{chunk-3Q3C4W66.js → chunk-2UQP6H6T.js} +2 -1
  20. package/dist/cli/{chunk-3Q3C4W66.js.map → chunk-2UQP6H6T.js.map} +1 -1
  21. package/dist/cli/chunk-2Z35JOA4.js +96 -0
  22. package/dist/cli/chunk-2Z35JOA4.js.map +1 -0
  23. package/dist/cli/chunk-32TIKD5U.js +54 -0
  24. package/dist/cli/{chunk-JWCTX5S4.js.map → chunk-32TIKD5U.js.map} +1 -1
  25. package/dist/cli/{chunk-UVRXTSK3.js → chunk-3BXRZFWS.js} +65 -3
  26. package/dist/cli/chunk-3BXRZFWS.js.map +1 -0
  27. package/dist/cli/chunk-3Z6IBU3D.js +249 -0
  28. package/dist/cli/chunk-3Z6IBU3D.js.map +1 -0
  29. package/dist/cli/{chunk-VLNRQMCI.js → chunk-45U62RI3.js} +12 -5
  30. package/dist/cli/chunk-45U62RI3.js.map +1 -0
  31. package/dist/cli/{chunk-5GKJLNP2.js → chunk-4QUNBQQ2.js} +3 -2
  32. package/dist/cli/{chunk-5GKJLNP2.js.map → chunk-4QUNBQQ2.js.map} +1 -1
  33. package/dist/cli/{chunk-R4YTW7PR.js → chunk-5JJRUIPA.js} +57 -12
  34. package/dist/cli/chunk-5JJRUIPA.js.map +1 -0
  35. package/dist/cli/{chunk-HCC42PEI.js → chunk-6AK4EY3D.js} +12 -6
  36. package/dist/cli/chunk-6AK4EY3D.js.map +1 -0
  37. package/dist/cli/chunk-6G3CUUFG.js +34320 -0
  38. package/dist/cli/chunk-6G3CUUFG.js.map +1 -0
  39. package/dist/cli/{chunk-XST7BSZJ.js → chunk-6PBZN4VI.js} +21 -3
  40. package/dist/cli/chunk-6PBZN4VI.js.map +1 -0
  41. package/dist/cli/{chunk-A5LSGEEK.js → chunk-6PZ3CXBP.js} +88 -66
  42. package/dist/cli/chunk-6PZ3CXBP.js.map +1 -0
  43. package/dist/cli/chunk-74EX7SUH.js +25293 -0
  44. package/dist/cli/chunk-74EX7SUH.js.map +1 -0
  45. package/dist/cli/{chunk-FFNOMR32.js → chunk-7O5ALB4C.js} +3 -2
  46. package/dist/cli/{chunk-FFNOMR32.js.map → chunk-7O5ALB4C.js.map} +1 -1
  47. package/dist/cli/{chunk-UCMTWZKU.js → chunk-DOYHN4KB.js} +3 -2
  48. package/dist/cli/{chunk-UCMTWZKU.js.map → chunk-DOYHN4KB.js.map} +1 -1
  49. package/dist/cli/{chunk-XJLZ4HKU.js → chunk-F3PXYSNN.js} +3 -2
  50. package/dist/cli/{chunk-XJLZ4HKU.js.map → chunk-F3PXYSNN.js.map} +1 -1
  51. package/dist/cli/{chunk-XHQIK7B6.js → chunk-FHOGSSCH.js} +4 -3
  52. package/dist/cli/{chunk-XHQIK7B6.js.map → chunk-FHOGSSCH.js.map} +1 -1
  53. package/dist/cli/{chunk-IYF36OCJ.js → chunk-H6PS7IUE.js} +3 -2
  54. package/dist/cli/{chunk-IYF36OCJ.js.map → chunk-H6PS7IUE.js.map} +1 -1
  55. package/dist/cli/{chunk-ZTLZO42A.js → chunk-HFEAY5DT.js} +3 -2
  56. package/dist/cli/{chunk-ZTLZO42A.js.map → chunk-HFEAY5DT.js.map} +1 -1
  57. package/dist/cli/{chunk-FWGEHRB7.js → chunk-J5XJHLWM.js} +2 -1
  58. package/dist/cli/{chunk-FWGEHRB7.js.map → chunk-J5XJHLWM.js.map} +1 -1
  59. package/dist/cli/chunk-JMBMLOBP.js +26 -0
  60. package/dist/cli/chunk-JMBMLOBP.js.map +1 -0
  61. package/dist/cli/{chunk-SZH34P45.js → chunk-O52OLQL3.js} +52 -18
  62. package/dist/cli/chunk-O52OLQL3.js.map +1 -0
  63. package/dist/cli/{chunk-4DCHFFEY.js → chunk-OSZC7C6F.js} +3 -2
  64. package/dist/cli/{chunk-4DCHFFEY.js.map → chunk-OSZC7C6F.js.map} +1 -1
  65. package/dist/cli/chunk-P7EKE5ZQ.js +60641 -0
  66. package/dist/cli/chunk-P7EKE5ZQ.js.map +1 -0
  67. package/dist/cli/{chunk-FM57FNPJ.js → chunk-PLHAZOLZ.js} +2 -1
  68. package/dist/cli/{chunk-FM57FNPJ.js.map → chunk-PLHAZOLZ.js.map} +1 -1
  69. package/dist/cli/{chunk-RFX7TYVV.js → chunk-PQXPXJBJ.js} +16 -2
  70. package/dist/cli/chunk-PQXPXJBJ.js.map +1 -0
  71. package/dist/cli/{chunk-DAEAAVDF.js → chunk-PV55UMTO.js} +2 -1
  72. package/dist/cli/{chunk-DAEAAVDF.js.map → chunk-PV55UMTO.js.map} +1 -1
  73. package/dist/cli/{chunk-H7PHYVPM.js → chunk-RE4RAVFF.js} +85 -14
  74. package/dist/cli/chunk-RE4RAVFF.js.map +1 -0
  75. package/dist/cli/chunk-S4XVGLRW.js +499 -0
  76. package/dist/cli/chunk-S4XVGLRW.js.map +1 -0
  77. package/dist/cli/{chunk-WJ3YX4PZ.js → chunk-SZ5XES2N.js} +3 -2
  78. package/dist/cli/{chunk-WJ3YX4PZ.js.map → chunk-SZ5XES2N.js.map} +1 -1
  79. package/dist/cli/{chunk-4X3NY5ZM.js → chunk-TJX6BFZZ.js} +16 -9
  80. package/dist/cli/{chunk-4X3NY5ZM.js.map → chunk-TJX6BFZZ.js.map} +1 -1
  81. package/dist/cli/chunk-TUK7OWJA.js +51 -0
  82. package/dist/cli/{chunk-WKOMCPXP.js → chunk-VK5HG73G.js} +26 -17
  83. package/dist/cli/chunk-VK5HG73G.js.map +1 -0
  84. package/dist/cli/{chunk-CLAN6PVH.js → chunk-XCGGEJTI.js} +21 -8
  85. package/dist/cli/chunk-XCGGEJTI.js.map +1 -0
  86. package/dist/cli/{chunk-SOZE7V7V.js → chunk-XJXDHAES.js} +3 -2
  87. package/dist/cli/{chunk-SOZE7V7V.js.map → chunk-XJXDHAES.js.map} +1 -1
  88. package/dist/cli/chunk-XPDVG52A.js +2648 -0
  89. package/dist/cli/chunk-XPDVG52A.js.map +1 -0
  90. package/dist/cli/{chunk-CRPQUBP6.js → chunk-XXC2BYTV.js} +2 -1
  91. package/dist/cli/{chunk-CRPQUBP6.js.map → chunk-XXC2BYTV.js.map} +1 -1
  92. package/dist/cli/{chunk-AVB3WZWU.js → chunk-YFGF5NKA.js} +17 -14
  93. package/dist/cli/{chunk-AVB3WZWU.js.map → chunk-YFGF5NKA.js.map} +1 -1
  94. package/dist/cli/{chunk-ORM6PK57.js → chunk-YQ6NTIIE.js} +2 -1
  95. package/dist/cli/{chunk-ORM6PK57.js.map → chunk-YQ6NTIIE.js.map} +1 -1
  96. package/dist/cli/{chunk-ULBW7DYL.js → chunk-YYQAUTTN.js} +3 -2
  97. package/dist/cli/{chunk-ULBW7DYL.js.map → chunk-YYQAUTTN.js.map} +1 -1
  98. package/dist/cli/chunk-ZZM6QJ4W.js +109 -0
  99. package/dist/cli/chunk-ZZM6QJ4W.js.map +1 -0
  100. package/dist/cli/code-SMKEW6CD.js +154 -0
  101. package/dist/cli/code-SMKEW6CD.js.map +1 -0
  102. package/dist/cli/{commands-FQZOBLLZ.js → commands-FVVB5FZF.js} +7 -5
  103. package/dist/cli/{commands-FQZOBLLZ.js.map → commands-FVVB5FZF.js.map} +1 -1
  104. package/dist/cli/{commit-ZS24SHPG.js → commit-HE4VSPZ7.js} +7 -4
  105. package/dist/cli/{commit-ZS24SHPG.js.map → commit-HE4VSPZ7.js.map} +1 -1
  106. package/dist/cli/{desktop-6OLENOOO.js → desktop-Q7NDXCON.js} +379 -72
  107. package/dist/cli/desktop-Q7NDXCON.js.map +1 -0
  108. package/dist/cli/devtools-YECO25QO.js +3719 -0
  109. package/dist/cli/devtools-YECO25QO.js.map +1 -0
  110. package/dist/cli/diff-435UTPC5.js +165 -0
  111. package/dist/cli/{diff-2VUKNGEI.js.map → diff-435UTPC5.js.map} +1 -1
  112. package/dist/cli/doctor-OT7KH75K.js +27 -0
  113. package/dist/cli/{events-APSVNROZ.js → events-XEFAD5VX.js} +6 -4
  114. package/dist/cli/{events-APSVNROZ.js.map → events-XEFAD5VX.js.map} +1 -1
  115. package/dist/cli/index.js +3233 -123
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/{mcp-DCKOE5RF.js → mcp-WUL2WO75.js} +6 -4
  118. package/dist/cli/{mcp-DCKOE5RF.js.map → mcp-WUL2WO75.js.map} +1 -1
  119. package/dist/cli/{mcp-browse-D6GBP5RQ.js → mcp-browse-RR7R4XET.js} +34 -19
  120. package/dist/cli/mcp-browse-RR7R4XET.js.map +1 -0
  121. package/dist/cli/{mcp-inspect-KFGFPJ3E.js → mcp-inspect-REGLYBWT.js} +9 -8
  122. package/dist/cli/{mcp-inspect-KFGFPJ3E.js.map → mcp-inspect-REGLYBWT.js.map} +1 -1
  123. package/dist/cli/package.json +3 -0
  124. package/dist/cli/prompt-UW6EFLVR.js +16 -0
  125. package/dist/cli/{prune-sessions-LV33R47N.js → prune-sessions-3RWUBYRS.js} +4 -2
  126. package/dist/cli/{prune-sessions-LV33R47N.js.map → prune-sessions-3RWUBYRS.js.map} +1 -1
  127. package/dist/cli/{replay-WFCYX7XF.js → replay-YOURXV4C.js} +42 -30
  128. package/dist/cli/{replay-WFCYX7XF.js.map → replay-YOURXV4C.js.map} +1 -1
  129. package/dist/cli/{run-IUJYEPMT.js → run-Q6BUXV66.js} +28 -27
  130. package/dist/cli/{run-IUJYEPMT.js.map → run-Q6BUXV66.js.map} +1 -1
  131. package/dist/cli/{server-CN4QPPVJ.js → server-XGDBRWMB.js} +44 -43
  132. package/dist/cli/server-XGDBRWMB.js.map +1 -0
  133. package/dist/cli/{sessions-F5GPGTJN.js → sessions-FH7QVYSY.js} +22 -19
  134. package/dist/cli/{sessions-F5GPGTJN.js.map → sessions-FH7QVYSY.js.map} +1 -1
  135. package/dist/cli/setup-VDS6SVEP.js +618 -0
  136. package/dist/cli/setup-VDS6SVEP.js.map +1 -0
  137. package/dist/cli/stats-MQVI2XQH.js +14 -0
  138. package/dist/cli/update-6ITLPRDV.js +15 -0
  139. package/dist/cli/update-6ITLPRDV.js.map +1 -0
  140. package/dist/cli/version-DAHGZY5N.js +33 -0
  141. package/dist/cli/{version-KQUPV6T5.js.map → version-DAHGZY5N.js.map} +1 -1
  142. package/dist/index.d.ts +157 -103
  143. package/dist/index.js +597 -178
  144. package/dist/index.js.map +1 -1
  145. package/package.json +2 -1
  146. package/dist/cli/chat-G7CUW4ZI.js +0 -45
  147. package/dist/cli/chunk-26UDIXLD.js +0 -16481
  148. package/dist/cli/chunk-26UDIXLD.js.map +0 -1
  149. package/dist/cli/chunk-4YV2GBYG.js +0 -5237
  150. package/dist/cli/chunk-4YV2GBYG.js.map +0 -1
  151. package/dist/cli/chunk-5X7LZJDE.js +0 -36
  152. package/dist/cli/chunk-5X7LZJDE.js.map +0 -1
  153. package/dist/cli/chunk-7DLHHBGN.js.map +0 -1
  154. package/dist/cli/chunk-A5LSGEEK.js.map +0 -1
  155. package/dist/cli/chunk-AFFZF3MW.js +0 -36
  156. package/dist/cli/chunk-AFFZF3MW.js.map +0 -1
  157. package/dist/cli/chunk-CLAN6PVH.js.map +0 -1
  158. package/dist/cli/chunk-CPOV2O73.js +0 -39
  159. package/dist/cli/chunk-CPOV2O73.js.map +0 -1
  160. package/dist/cli/chunk-CPTZ5OHX.js +0 -18
  161. package/dist/cli/chunk-CPTZ5OHX.js.map +0 -1
  162. package/dist/cli/chunk-CZSJILQP.js +0 -854
  163. package/dist/cli/chunk-CZSJILQP.js.map +0 -1
  164. package/dist/cli/chunk-H7PHYVPM.js.map +0 -1
  165. package/dist/cli/chunk-HCC42PEI.js.map +0 -1
  166. package/dist/cli/chunk-JWCTX5S4.js +0 -46
  167. package/dist/cli/chunk-KMWKGPFZ.js.map +0 -1
  168. package/dist/cli/chunk-MRLXEMZ7.js +0 -26
  169. package/dist/cli/chunk-MRLXEMZ7.js.map +0 -1
  170. package/dist/cli/chunk-R4YTW7PR.js.map +0 -1
  171. package/dist/cli/chunk-RFX7TYVV.js.map +0 -1
  172. package/dist/cli/chunk-SZH34P45.js.map +0 -1
  173. package/dist/cli/chunk-UVRXTSK3.js.map +0 -1
  174. package/dist/cli/chunk-VLNRQMCI.js.map +0 -1
  175. package/dist/cli/chunk-WKOMCPXP.js.map +0 -1
  176. package/dist/cli/chunk-XST7BSZJ.js.map +0 -1
  177. package/dist/cli/code-YQGVLIT2.js +0 -147
  178. package/dist/cli/code-YQGVLIT2.js.map +0 -1
  179. package/dist/cli/desktop-6OLENOOO.js.map +0 -1
  180. package/dist/cli/diff-2VUKNGEI.js +0 -153
  181. package/dist/cli/doctor-JO2WNN6C.js +0 -24
  182. package/dist/cli/mcp-browse-D6GBP5RQ.js.map +0 -1
  183. package/dist/cli/prompt-PKCCLLAD.js +0 -13
  184. package/dist/cli/server-CN4QPPVJ.js.map +0 -1
  185. package/dist/cli/setup-WWMDBPSB.js +0 -516
  186. package/dist/cli/setup-WWMDBPSB.js.map +0 -1
  187. package/dist/cli/stats-5RJCATCE.js +0 -12
  188. package/dist/cli/update-GUCWB4UN.js +0 -13
  189. package/dist/cli/version-KQUPV6T5.js +0 -30
  190. /package/dist/cli/{chat-G7CUW4ZI.js.map → chat-7ES4IBNH.js.map} +0 -0
  191. /package/dist/cli/{doctor-JO2WNN6C.js.map → chunk-TUK7OWJA.js.map} +0 -0
  192. /package/dist/cli/{prompt-PKCCLLAD.js.map → doctor-OT7KH75K.js.map} +0 -0
  193. /package/dist/cli/{stats-5RJCATCE.js.map → prompt-UW6EFLVR.js.map} +0 -0
  194. /package/dist/cli/{update-GUCWB4UN.js.map → stats-MQVI2XQH.js.map} +0 -0
@@ -18925,6 +18925,20 @@ async function api(path, opts = {}) {
18925
18925
  return parsed;
18926
18926
  }
18927
18927
 
18928
+ // dashboard/src/lib/bus-filter.ts
18929
+ var THIRD_PARTY_ORIGIN_PREFIXES = [
18930
+ "chrome-extension://",
18931
+ "moz-extension://",
18932
+ "safari-web-extension://",
18933
+ "safari-extension://",
18934
+ "ms-browser-extension://"
18935
+ ];
18936
+ function isThirdPartyError(error, filename) {
18937
+ const hay = `${filename ?? ""}
18938
+ ${error?.stack ?? ""}`;
18939
+ return THIRD_PARTY_ORIGIN_PREFIXES.some((prefix) => hay.includes(prefix));
18940
+ }
18941
+
18928
18942
  // dashboard/src/lib/bus.ts
18929
18943
  var html = htm_module_default.bind(k);
18930
18944
  var appBus = new EventTarget();
@@ -18940,9 +18954,11 @@ function reportAppError(error, source, info) {
18940
18954
  }
18941
18955
  window.addEventListener("error", (ev) => {
18942
18956
  if (!ev.error) return;
18957
+ if (isThirdPartyError(ev.error, ev.filename)) return;
18943
18958
  reportAppError(ev.error, "window", ev.message);
18944
18959
  });
18945
18960
  window.addEventListener("unhandledrejection", (ev) => {
18961
+ if (isThirdPartyError(ev.reason)) return;
18946
18962
  reportAppError(ev.reason, "promise");
18947
18963
  });
18948
18964
  function ToastStack() {
@@ -19486,7 +19502,44 @@ var en = {
19486
19502
  colDesc: "description",
19487
19503
  readOnly: "read-only",
19488
19504
  write: "write",
19489
- flat: "flat"
19505
+ flat: "flat",
19506
+ desc: {
19507
+ web_search: "Search the public web. Returns ranked results with title, url, and snippet. Call this when the answer depends on current state \u2014 events, prices, releases, real-world status.",
19508
+ web_fetch: "Download a URL and return its visible text content (scripts/styles/nav stripped). Use after web_search when a snippet isn't enough.",
19509
+ run_command: "Run a shell command in the project root; returns combined stdout+stderr. Allowlisted read-only commands run immediately; mutations are gated by user confirmation.",
19510
+ run_background: "Spawn a long-running process and detach. Returns a job id for tailing logs, waiting for completion, or killing. Use for dev servers, watchers, and one-shot long jobs.",
19511
+ job_output: "Read the latest output of a background job. Returns the tail of the buffer and tells you whether the job is still running.",
19512
+ wait_for_job: "Block server-side until a background job finishes, bounded by timeout. Use instead of polling job_output in a loop.",
19513
+ stop_job: "Stop a background job. SIGTERM first, SIGKILL after a grace period. Safe to call on an already-exited job.",
19514
+ list_jobs: "List every background job started this session \u2014 running and exited \u2014 with id, command, pid, and status.",
19515
+ remember: "Save a memory for future sessions. Use when the user states a preference, corrects your approach, shares a non-obvious fact, or asks you to remember something.",
19516
+ forget: "Delete a memory file and remove it from MEMORY.md. Use when the user asks to forget something or a remembered fact is now wrong.",
19517
+ recall_memory: "Read the full body of a memory file when its one-line summary isn't enough detail.",
19518
+ read_file: "Read a file under the sandbox root. Supports head/tail/range scoping to save context. Auto-returns a preview for files over 200 lines.",
19519
+ list_directory: "List entries in a directory. Returns one line per entry, marking directories with a trailing slash.",
19520
+ directory_tree: "Recursively list entries in a directory as an indented tree. Budget-aware with auto-collapse for large subtrees.",
19521
+ search_files: "Find files whose NAME matches a substring or regex. Case-insensitive. Skips dependency/build directories by default.",
19522
+ search_content: "Recursively grep file CONTENTS for a substring or regex. Returns matches in path:line:text format. The right tool for finding references.",
19523
+ glob: "List files matching a glob pattern, sorted by mtime. Default limit 200, max 1000. Skips node_modules/.git/dist by default.",
19524
+ get_file_info: "Stat a path under the sandbox root. Returns type, size in bytes, and mtime.",
19525
+ write_file: "Create or overwrite a file with the given content. Parent directories are created as needed.",
19526
+ edit_file: "Apply a SEARCH/REPLACE edit to an existing file. The search must match exactly and be unique in the file.",
19527
+ multi_edit: "Apply N SEARCH/REPLACE edits across one or more files atomically. If any edit fails, no files are written.",
19528
+ create_directory: "Create a directory (and any missing parents) under the sandbox root.",
19529
+ move_file: "Rename or move a file or directory under the sandbox root.",
19530
+ delete_file: "Delete one file under the sandbox root. Refuses directories \u2014 use delete_directory for those.",
19531
+ delete_directory: "Recursively delete a directory under the sandbox root. Pass recursive:false to refuse non-empty directories.",
19532
+ copy_file: "Copy a file or directory under the sandbox root. Refuses to overwrite an existing destination.",
19533
+ submit_plan: "Submit one concrete plan for a review gate. Use for multi-file refactors, architecture changes, or anything expensive to undo.",
19534
+ mark_step_complete: "Mark one step of the approved plan as done. Call exactly once after finishing each step.",
19535
+ revise_plan: "Surgically replace the remaining steps of an in-flight plan. Done steps are never touched.",
19536
+ run_skill: "Invoke a playbook from the Skills index. Pass the bare skill name. Subagent-tagged skills spawn an isolated subagent.",
19537
+ spawn_subagent: "Spawn an isolated subagent for a self-contained subtask. Use for parallel fan-out or when the work needs many file reads.",
19538
+ todo_write: "In-session task tracker for multi-step work. Replaces the entire list every call. No approval gate or file writes.",
19539
+ ask_choice: "Present 2-6 alternatives to the user. Use when the user asks for options or you need a preference decision.",
19540
+ create_skill: "Scaffold a new skill the user can invoke later via /skill. Supports inline and subagent run modes.",
19541
+ add_mcp_server: "Register a new MCP server in the user's config. Takes effect on the next session. Supports stdio, SSE, and streamable-http."
19542
+ }
19490
19543
  },
19491
19544
  permissions: {
19492
19545
  loading: "loading permissions\u2026",
@@ -20109,7 +20162,44 @@ var zhCN = {
20109
20162
  colDesc: "\u63CF\u8FF0",
20110
20163
  readOnly: "\u53EA\u8BFB",
20111
20164
  write: "\u5199\u5165",
20112
- flat: "\u6241\u5E73"
20165
+ flat: "\u6241\u5E73",
20166
+ desc: {
20167
+ web_search: "\u641C\u7D22\u516C\u5171\u7F51\u7EDC\u3002\u8FD4\u56DE\u5E26\u6807\u9898\u3001URL \u548C\u6458\u8981\u7684\u6392\u5E8F\u7ED3\u679C\u3002\u5F53\u7B54\u6848\u7684\u6B63\u786E\u6027\u4F9D\u8D56\u4E8E\u5F53\u524D\u72B6\u6001\u65F6\u8C03\u7528\u2014\u2014\u4E8B\u4EF6\u3001\u4EF7\u683C\u3001\u53D1\u5E03\u3001\u73B0\u5B9E\u4E16\u754C\u7684\u72B6\u6001\u3002",
20168
+ web_fetch: "\u4E0B\u8F7D URL \u5E76\u8FD4\u56DE\u5176\u53EF\u89C1\u6587\u672C\u5185\u5BB9\uFF08\u5DF2\u5265\u79BB\u811A\u672C/\u6837\u5F0F/\u5BFC\u822A\uFF09\u3002\u5728 web_search \u6458\u8981\u4E0D\u591F\u65F6\u4F7F\u7528\u3002",
20169
+ run_command: "\u5728\u9879\u76EE\u6839\u76EE\u5F55\u6267\u884C shell \u547D\u4EE4\uFF0C\u8FD4\u56DE\u5408\u5E76\u7684\u6807\u51C6\u8F93\u51FA\u548C\u6807\u51C6\u9519\u8BEF\u3002\u767D\u540D\u5355\u4E2D\u7684\u53EA\u8BFB\u547D\u4EE4\u7ACB\u5373\u6267\u884C\uFF1B\u53EF\u80FD\u4FEE\u6539\u72B6\u6001\u7684\u64CD\u4F5C\u9700\u7528\u6237\u786E\u8BA4\u3002",
20170
+ run_background: "\u542F\u52A8\u4E00\u4E2A\u957F\u65F6\u95F4\u8FD0\u884C\u7684\u8FDB\u7A0B\u5E76\u5206\u79BB\u3002\u8FD4\u56DE\u4EFB\u52A1 ID \u7528\u4E8E\u67E5\u770B\u65E5\u5FD7\u3001\u7B49\u5F85\u5B8C\u6210\u6216\u7EC8\u6B62\u3002\u7528\u4E8E\u5F00\u53D1\u670D\u52A1\u5668\u3001\u6587\u4EF6\u76D1\u542C\u5668\u548C\u4E00\u6B21\u6027\u957F\u65F6\u95F4\u4EFB\u52A1\u3002",
20171
+ job_output: "\u8BFB\u53D6\u540E\u53F0\u4EFB\u52A1\u7684\u6700\u65B0\u8F93\u51FA\u3002\u8FD4\u56DE\u7F13\u51B2\u533A\u672B\u5C3E\u5185\u5BB9\u5E76\u544A\u77E5\u4EFB\u52A1\u662F\u5426\u4ECD\u5728\u8FD0\u884C\u3002",
20172
+ wait_for_job: "\u5728\u670D\u52A1\u7AEF\u963B\u585E\u76F4\u5230\u540E\u53F0\u4EFB\u52A1\u5B8C\u6210\uFF08\u6709\u8D85\u65F6\u9650\u5236\uFF09\u3002\u7528\u4E8E\u66FF\u4EE3\u8F6E\u8BE2 job_output\u3002",
20173
+ stop_job: "\u505C\u6B62\u540E\u53F0\u4EFB\u52A1\u3002\u5148\u53D1\u9001 SIGTERM\uFF0C\u5BBD\u9650\u671F\u540E\u53D1\u9001 SIGKILL\u3002\u53EF\u5B89\u5168\u8C03\u7528\u5DF2\u9000\u51FA\u7684\u4EFB\u52A1\u3002",
20174
+ list_jobs: "\u5217\u51FA\u672C\u6B21\u4F1A\u8BDD\u542F\u52A8\u7684\u6240\u6709\u540E\u53F0\u4EFB\u52A1\u2014\u2014\u8FD0\u884C\u4E2D\u548C\u5DF2\u9000\u51FA\u7684\u2014\u2014\u5305\u542B ID\u3001\u547D\u4EE4\u3001PID \u548C\u72B6\u6001\u3002",
20175
+ remember: "\u4FDD\u5B58\u4E00\u6761\u8BB0\u5FC6\u4F9B\u672A\u6765\u4F1A\u8BDD\u4F7F\u7528\u3002\u5F53\u7528\u6237\u9648\u8FF0\u504F\u597D\u3001\u7EA0\u6B63\u4F60\u7684\u65B9\u6CD5\u3001\u5206\u4EAB\u975E\u663E\u800C\u6613\u89C1\u7684\u4E8B\u5B9E\u6216\u8981\u6C42\u4F60\u8BB0\u4F4F\u67D0\u4E8B\u65F6\u4F7F\u7528\u3002",
20176
+ forget: "\u5220\u9664\u8BB0\u5FC6\u6587\u4EF6\u5E76\u4ECE MEMORY.md \u4E2D\u79FB\u9664\u3002\u5F53\u7528\u6237\u8981\u6C42\u5FD8\u8BB0\u67D0\u4E8B\u6216\u4E4B\u524D\u8BB0\u4F4F\u7684\u4E8B\u5B9E\u5DF2\u4E0D\u518D\u6B63\u786E\u65F6\u4F7F\u7528\u3002",
20177
+ recall_memory: "\u5F53\u8BB0\u5FC6\u6587\u4EF6\u7684\u4E00\u884C\u6458\u8981\u4E0D\u591F\u8BE6\u7EC6\u65F6\uFF0C\u8BFB\u53D6\u5176\u5B8C\u6574\u5185\u5BB9\u3002",
20178
+ read_file: "\u8BFB\u53D6\u6C99\u7BB1\u6839\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\u3002\u652F\u6301 head/tail/range \u8303\u56F4\u8BFB\u53D6\u4EE5\u8282\u7701\u4E0A\u4E0B\u6587\u3002\u8D85\u8FC7 200 \u884C\u7684\u6587\u4EF6\u81EA\u52A8\u8FD4\u56DE\u9884\u89C8\u3002",
20179
+ list_directory: "\u5217\u51FA\u76EE\u5F55\u4E2D\u7684\u6761\u76EE\u3002\u6BCF\u884C\u4E00\u4E2A\u6761\u76EE\uFF0C\u76EE\u5F55\u4EE5\u659C\u6760\u6807\u8BB0\u3002",
20180
+ directory_tree: "\u9012\u5F52\u5217\u51FA\u76EE\u5F55\u4E2D\u7684\u6761\u76EE\uFF0C\u4EE5\u7F29\u8FDB\u6811\u5F62\u7ED3\u6784\u663E\u793A\u3002\u5BF9\u5927\u5B50\u76EE\u5F55\u81EA\u52A8\u6298\u53E0\u4EE5\u8282\u7701\u9884\u7B97\u3002",
20181
+ search_files: "\u6839\u636E\u540D\u79F0\u5339\u914D\u5B50\u4E32\u6216\u6B63\u5219\u8868\u8FBE\u5F0F\u67E5\u627E\u6587\u4EF6\u3002\u4E0D\u533A\u5206\u5927\u5C0F\u5199\u3002\u9ED8\u8BA4\u8DF3\u8FC7\u4F9D\u8D56/\u6784\u5EFA\u76EE\u5F55\u3002",
20182
+ search_content: "\u9012\u5F52\u641C\u7D22\u6587\u4EF6\u5185\u5BB9\u4E2D\u7684\u5B50\u4E32\u6216\u6B63\u5219\u8868\u8FBE\u5F0F\u3002\u4EE5 path:line:text \u683C\u5F0F\u8FD4\u56DE\u5339\u914D\u7ED3\u679C\u3002\u67E5\u627E\u5F15\u7528\u7684\u6B63\u786E\u5DE5\u5177\u3002",
20183
+ glob: "\u6309 glob \u6A21\u5F0F\u5217\u51FA\u6587\u4EF6\uFF0C\u6309\u4FEE\u6539\u65F6\u95F4\u6392\u5E8F\u3002\u9ED8\u8BA4\u9650\u5236 200\uFF0C\u6700\u5927 1000\u3002\u9ED8\u8BA4\u8DF3\u8FC7 node_modules/.git/dist\u3002",
20184
+ get_file_info: "\u83B7\u53D6\u6C99\u7BB1\u6839\u76EE\u5F55\u4E0B\u8DEF\u5F84\u7684\u72B6\u6001\u4FE1\u606F\u3002\u8FD4\u56DE\u7C7B\u578B\u3001\u5B57\u8282\u5927\u5C0F\u548C\u4FEE\u6539\u65F6\u95F4\u3002",
20185
+ write_file: "\u521B\u5EFA\u6216\u8986\u76D6\u6587\u4EF6\uFF0C\u5185\u5BB9\u7531\u53C2\u6570\u6307\u5B9A\u3002\u6309\u9700\u521B\u5EFA\u7236\u76EE\u5F55\u3002",
20186
+ edit_file: "\u5BF9\u73B0\u6709\u6587\u4EF6\u5E94\u7528 SEARCH/REPLACE \u7F16\u8F91\u3002\u641C\u7D22\u5FC5\u987B\u5B8C\u5168\u5339\u914D\u4E14\u5728\u6587\u4EF6\u4E2D\u552F\u4E00\u3002",
20187
+ multi_edit: "\u8DE8\u4E00\u4E2A\u6216\u591A\u4E2A\u6587\u4EF6\u539F\u5B50\u6027\u5730\u5E94\u7528 N \u4E2A SEARCH/REPLACE \u7F16\u8F91\u3002\u5982\u679C\u4EFB\u4F55\u7F16\u8F91\u5931\u8D25\uFF0C\u4E0D\u5199\u5165\u4EFB\u4F55\u6587\u4EF6\u3002",
20188
+ create_directory: "\u5728\u6C99\u7BB1\u6839\u76EE\u5F55\u4E0B\u521B\u5EFA\u76EE\u5F55\uFF08\u4EE5\u53CA\u4EFB\u4F55\u7F3A\u5931\u7684\u7236\u76EE\u5F55\uFF09\u3002",
20189
+ move_file: "\u91CD\u547D\u540D\u6216\u79FB\u52A8\u6C99\u7BB1\u6839\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\u6216\u76EE\u5F55\u3002",
20190
+ delete_file: "\u5220\u9664\u6C99\u7BB1\u6839\u76EE\u5F55\u4E0B\u7684\u4E00\u4E2A\u6587\u4EF6\u3002\u62D2\u7EDD\u76EE\u5F55\u2014\u2014\u8BF7\u4F7F\u7528 delete_directory \u5220\u9664\u76EE\u5F55\u3002",
20191
+ delete_directory: "\u9012\u5F52\u5220\u9664\u6C99\u7BB1\u6839\u76EE\u5F55\u4E0B\u7684\u76EE\u5F55\u3002\u4F20\u5165 recursive:false \u53EF\u62D2\u7EDD\u975E\u7A7A\u76EE\u5F55\u3002",
20192
+ copy_file: "\u590D\u5236\u6C99\u7BB1\u6839\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\u6216\u76EE\u5F55\u3002\u62D2\u7EDD\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u76EE\u6807\u3002",
20193
+ submit_plan: "\u63D0\u4EA4\u4E00\u4E2A\u5177\u4F53\u7684\u8BA1\u5212\u4EE5\u4F9B\u5BA1\u67E5\u5BA1\u6279\u3002\u7528\u4E8E\u591A\u6587\u4EF6\u91CD\u6784\u3001\u67B6\u6784\u53D8\u66F4\u6216\u4EFB\u4F55\u64A4\u9500\u4EE3\u4EF7\u9AD8\u6602\u7684\u64CD\u4F5C\u3002",
20194
+ mark_step_complete: "\u5C06\u5DF2\u6279\u51C6\u8BA1\u5212\u7684\u4E00\u4E2A\u6B65\u9AA4\u6807\u8BB0\u4E3A\u5B8C\u6210\u3002\u5B8C\u6210\u6BCF\u4E2A\u6B65\u9AA4\u540E\u6070\u597D\u8C03\u7528\u4E00\u6B21\u3002",
20195
+ revise_plan: "\u5916\u79D1\u624B\u672F\u5F0F\u66FF\u6362\u8FDB\u884C\u4E2D\u8BA1\u5212\u7684\u5269\u4F59\u6B65\u9AA4\u3002\u5DF2\u5B8C\u6210\u7684\u6B65\u9AA4\u6C38\u8FDC\u4E0D\u4F1A\u88AB\u89E6\u53CA\u3002",
20196
+ run_skill: "\u4ECE\u6280\u80FD\u7D22\u5F15\u4E2D\u8C03\u7528\u4E00\u4E2A playbook\u3002\u4F20\u5165\u88F8\u6280\u80FD\u540D\u79F0\u3002\u6807\u8BB0\u4E3A\u5B50\u4EE3\u7406\u7684\u6280\u80FD\u5C06\u542F\u52A8\u72EC\u7ACB\u7684\u5B50\u4EE3\u7406\u3002",
20197
+ spawn_subagent: "\u4E3A\u4E00\u4E2A\u72EC\u7ACB\u5B50\u4EFB\u52A1\u542F\u52A8\u9694\u79BB\u7684\u5B50\u4EE3\u7406\u3002\u7528\u4E8E\u5E76\u884C\u5206\u53D1\u6216\u9700\u8981\u5927\u91CF\u6587\u4EF6\u8BFB\u53D6\u7684\u5DE5\u4F5C\u3002",
20198
+ todo_write: "\u591A\u6B65\u5DE5\u4F5C\u7684\u4F1A\u8BDD\u5185\u4EFB\u52A1\u8DDF\u8E2A\u5668\u3002\u6BCF\u6B21\u8C03\u7528\u66FF\u6362\u6574\u4E2A\u5217\u8868\u3002\u65E0\u5BA1\u6279\u5173\u5361\uFF0C\u4E0D\u5199\u5165\u6587\u4EF6\u3002",
20199
+ ask_choice: "\u5411\u7528\u6237\u5C55\u793A 2-6 \u4E2A\u9009\u9879\u3002\u5F53\u7528\u6237\u8981\u6C42\u9009\u62E9\u6216\u9700\u8981\u504F\u597D\u51B3\u7B56\u65F6\u4F7F\u7528\u3002",
20200
+ create_skill: "\u521B\u5EFA\u4E00\u4E2A\u65B0\u6280\u80FD\uFF0C\u7528\u6237\u53EF\u901A\u8FC7 /skill \u547D\u4EE4\u8C03\u7528\u3002\u652F\u6301\u5185\u8054\u548C\u5B50\u4EE3\u7406\u4E24\u79CD\u8FD0\u884C\u6A21\u5F0F\u3002",
20201
+ add_mcp_server: "\u5728\u7528\u6237\u914D\u7F6E\u4E2D\u6CE8\u518C\u65B0\u7684 MCP \u670D\u52A1\u5668\u3002\u4E0B\u6B21\u4F1A\u8BDD\u751F\u6548\u3002\u652F\u6301 stdio\u3001SSE \u548C streamable-http\u3002"
20202
+ }
20113
20203
  },
20114
20204
  permissions: {
20115
20205
  loading: "\u52A0\u8F7D\u6743\u9650\u2026",
@@ -20441,6 +20531,187 @@ var zhCN = {
20441
20531
  // dashboard/src/i18n/index.ts
20442
20532
  var t4 = createT({ en, "zh-CN": zhCN });
20443
20533
 
20534
+ // node_modules/preact/compat/dist/compat.module.js
20535
+ function g3(n3, t5) {
20536
+ for (var e3 in t5) n3[e3] = t5[e3];
20537
+ return n3;
20538
+ }
20539
+ function E2(n3, t5) {
20540
+ for (var e3 in n3) if ("__source" !== e3 && !(e3 in t5)) return true;
20541
+ for (var r3 in t5) if ("__source" !== r3 && n3[r3] !== t5[r3]) return true;
20542
+ return false;
20543
+ }
20544
+ function M2(n3, t5) {
20545
+ this.props = n3, this.context = t5;
20546
+ }
20547
+ function N2(n3, e3) {
20548
+ function r3(n4) {
20549
+ var t5 = this.props.ref;
20550
+ return t5 != n4.ref && t5 && ("function" == typeof t5 ? t5(null) : t5.current = null), e3 ? !e3(this.props, n4) || t5 != n4.ref : E2(this.props, n4);
20551
+ }
20552
+ function u3(e4) {
20553
+ return this.shouldComponentUpdate = r3, k(n3, e4);
20554
+ }
20555
+ return u3.displayName = "Memo(" + (n3.displayName || n3.name) + ")", u3.__f = u3.prototype.isReactComponent = true, u3.type = n3, u3;
20556
+ }
20557
+ (M2.prototype = new C()).isPureReactComponent = true, M2.prototype.shouldComponentUpdate = function(n3, t5) {
20558
+ return E2(this.props, n3) || E2(this.state, t5);
20559
+ };
20560
+ var T3 = l.__b;
20561
+ l.__b = function(n3) {
20562
+ n3.type && n3.type.__f && n3.ref && (n3.props.ref = n3.ref, n3.ref = null), T3 && T3(n3);
20563
+ };
20564
+ var A3 = "undefined" != typeof Symbol && Symbol.for && /* @__PURE__ */ Symbol.for("react.forward_ref") || 3911;
20565
+ var O2 = l.__e;
20566
+ l.__e = function(n3, t5, e3, r3) {
20567
+ if (n3.then) {
20568
+ for (var u3, o3 = t5; o3 = o3.__; ) if ((u3 = o3.__c) && u3.__c) return null == t5.__e && (t5.__e = e3.__e, t5.__k = e3.__k), u3.__c(n3, t5);
20569
+ }
20570
+ O2(n3, t5, e3, r3);
20571
+ };
20572
+ var U2 = l.unmount;
20573
+ function V2(n3, t5, e3) {
20574
+ return n3 && (n3.__c && n3.__c.__H && (n3.__c.__H.__.forEach(function(n4) {
20575
+ "function" == typeof n4.__c && n4.__c();
20576
+ }), n3.__c.__H = null), null != (n3 = g3({}, n3)).__c && (n3.__c.__P === e3 && (n3.__c.__P = t5), n3.__c.__e = true, n3.__c = null), n3.__k = n3.__k && n3.__k.map(function(n4) {
20577
+ return V2(n4, t5, e3);
20578
+ })), n3;
20579
+ }
20580
+ function W2(n3, t5, e3) {
20581
+ return n3 && e3 && (n3.__v = null, n3.__k = n3.__k && n3.__k.map(function(n4) {
20582
+ return W2(n4, t5, e3);
20583
+ }), n3.__c && n3.__c.__P === t5 && (n3.__e && e3.appendChild(n3.__e), n3.__c.__e = true, n3.__c.__P = e3)), n3;
20584
+ }
20585
+ function P3() {
20586
+ this.__u = 0, this.o = null, this.__b = null;
20587
+ }
20588
+ function j3(n3) {
20589
+ var t5 = n3.__ && n3.__.__c;
20590
+ return t5 && t5.__a && t5.__a(n3);
20591
+ }
20592
+ function B3() {
20593
+ this.i = null, this.l = null;
20594
+ }
20595
+ l.unmount = function(n3) {
20596
+ var t5 = n3.__c;
20597
+ t5 && (t5.__z = true), t5 && t5.__R && t5.__R(), t5 && 32 & n3.__u && (n3.type = null), U2 && U2(n3);
20598
+ }, (P3.prototype = new C()).__c = function(n3, t5) {
20599
+ var e3 = t5.__c, r3 = this;
20600
+ null == r3.o && (r3.o = []), r3.o.push(e3);
20601
+ var u3 = j3(r3.__v), o3 = false, i3 = function() {
20602
+ o3 || r3.__z || (o3 = true, e3.__R = null, u3 ? u3(c3) : c3());
20603
+ };
20604
+ e3.__R = i3;
20605
+ var l3 = e3.__P;
20606
+ e3.__P = null;
20607
+ var c3 = function() {
20608
+ if (!--r3.__u) {
20609
+ if (r3.state.__a) {
20610
+ var n4 = r3.state.__a;
20611
+ r3.__v.__k[0] = W2(n4, n4.__c.__P, n4.__c.__O);
20612
+ }
20613
+ var t6;
20614
+ for (r3.setState({ __a: r3.__b = null }); t6 = r3.o.pop(); ) t6.__P = l3, t6.forceUpdate();
20615
+ }
20616
+ };
20617
+ r3.__u++ || 32 & t5.__u || r3.setState({ __a: r3.__b = r3.__v.__k[0] }), n3.then(i3, i3);
20618
+ }, P3.prototype.componentWillUnmount = function() {
20619
+ this.o = [];
20620
+ }, P3.prototype.render = function(n3, e3) {
20621
+ if (this.__b) {
20622
+ if (this.__v.__k) {
20623
+ var r3 = document.createElement("div"), o3 = this.__v.__k[0].__c;
20624
+ this.__v.__k[0] = V2(this.__b, r3, o3.__O = o3.__P);
20625
+ }
20626
+ this.__b = null;
20627
+ }
20628
+ var i3 = e3.__a && k(S, null, n3.fallback);
20629
+ return i3 && (i3.__u &= -33), [k(S, null, e3.__a ? null : n3.children), i3];
20630
+ };
20631
+ var H2 = function(n3, t5, e3) {
20632
+ if (++e3[1] === e3[0] && n3.l.delete(t5), n3.props.revealOrder && ("t" !== n3.props.revealOrder[0] || !n3.l.size)) for (e3 = n3.i; e3; ) {
20633
+ for (; e3.length > 3; ) e3.pop()();
20634
+ if (e3[1] < e3[0]) break;
20635
+ n3.i = e3 = e3[2];
20636
+ }
20637
+ };
20638
+ (B3.prototype = new C()).__a = function(n3) {
20639
+ var t5 = this, e3 = j3(t5.__v), r3 = t5.l.get(n3);
20640
+ return r3[0]++, function(u3) {
20641
+ var o3 = function() {
20642
+ t5.props.revealOrder ? (r3.push(u3), H2(t5, n3, r3)) : u3();
20643
+ };
20644
+ e3 ? e3(o3) : o3();
20645
+ };
20646
+ }, B3.prototype.render = function(n3) {
20647
+ this.i = null, this.l = /* @__PURE__ */ new Map();
20648
+ var t5 = F(n3.children);
20649
+ n3.revealOrder && "b" === n3.revealOrder[0] && t5.reverse();
20650
+ for (var e3 = t5.length; e3--; ) this.l.set(t5[e3], this.i = [1, 0, this.i]);
20651
+ return n3.children;
20652
+ }, B3.prototype.componentDidUpdate = B3.prototype.componentDidMount = function() {
20653
+ var n3 = this;
20654
+ this.l.forEach(function(t5, e3) {
20655
+ H2(n3, e3, t5);
20656
+ });
20657
+ };
20658
+ var q3 = "undefined" != typeof Symbol && Symbol.for && /* @__PURE__ */ Symbol.for("react.element") || 60103;
20659
+ var G2 = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/;
20660
+ var J2 = /^on(Ani|Tra|Tou|BeforeInp|Compo)/;
20661
+ var K2 = /[A-Z0-9]/g;
20662
+ var Q2 = "undefined" != typeof document;
20663
+ var X2 = function(n3) {
20664
+ return ("undefined" != typeof Symbol && "symbol" == typeof /* @__PURE__ */ Symbol() ? /fil|che|rad/ : /fil|che|ra/).test(n3);
20665
+ };
20666
+ C.prototype.isReactComponent = true, ["componentWillMount", "componentWillReceiveProps", "componentWillUpdate"].forEach(function(t5) {
20667
+ Object.defineProperty(C.prototype, t5, { configurable: true, get: function() {
20668
+ return this["UNSAFE_" + t5];
20669
+ }, set: function(n3) {
20670
+ Object.defineProperty(this, t5, { configurable: true, writable: true, value: n3 });
20671
+ } });
20672
+ });
20673
+ var en2 = l.event;
20674
+ l.event = function(n3) {
20675
+ return en2 && (n3 = en2(n3)), n3.persist = function() {
20676
+ }, n3.isPropagationStopped = function() {
20677
+ return this.cancelBubble;
20678
+ }, n3.isDefaultPrevented = function() {
20679
+ return this.defaultPrevented;
20680
+ }, n3.nativeEvent = n3;
20681
+ };
20682
+ var rn;
20683
+ var un = { configurable: true, get: function() {
20684
+ return this.class;
20685
+ } };
20686
+ var on = l.vnode;
20687
+ l.vnode = function(n3) {
20688
+ "string" == typeof n3.type && (function(n4) {
20689
+ var t5 = n4.props, e3 = n4.type, u3 = {}, o3 = -1 == e3.indexOf("-");
20690
+ for (var i3 in t5) {
20691
+ var l3 = t5[i3];
20692
+ if (!("value" === i3 && "defaultValue" in t5 && null == l3 || Q2 && "children" === i3 && "noscript" === e3 || "class" === i3 || "className" === i3)) {
20693
+ var c3 = i3.toLowerCase();
20694
+ "defaultValue" === i3 && "value" in t5 && null == t5.value ? i3 = "value" : "download" === i3 && true === l3 ? l3 = "" : "translate" === c3 && "no" === l3 ? l3 = false : "o" === c3[0] && "n" === c3[1] ? "ondoubleclick" === c3 ? i3 = "ondblclick" : "onchange" !== c3 || "input" !== e3 && "textarea" !== e3 || X2(t5.type) ? "onfocus" === c3 ? i3 = "onfocusin" : "onblur" === c3 ? i3 = "onfocusout" : J2.test(i3) && (i3 = c3) : c3 = i3 = "oninput" : o3 && G2.test(i3) ? i3 = i3.replace(K2, "-$&").toLowerCase() : null === l3 && (l3 = void 0), "oninput" === c3 && u3[i3 = c3] && (i3 = "oninputCapture"), u3[i3] = l3;
20695
+ }
20696
+ }
20697
+ "select" == e3 && (u3.multiple && Array.isArray(u3.value) && (u3.value = F(t5.children).forEach(function(n5) {
20698
+ n5.props.selected = -1 != u3.value.indexOf(n5.props.value);
20699
+ })), null != u3.defaultValue && (u3.value = F(t5.children).forEach(function(n5) {
20700
+ n5.props.selected = u3.multiple ? -1 != u3.defaultValue.indexOf(n5.props.value) : u3.defaultValue == n5.props.value;
20701
+ }))), t5.class && !t5.className ? (u3.class = t5.class, Object.defineProperty(u3, "className", un)) : t5.className && (u3.class = u3.className = t5.className), n4.props = u3;
20702
+ })(n3), n3.$$typeof = q3, on && on(n3);
20703
+ };
20704
+ var ln = l.__r;
20705
+ l.__r = function(n3) {
20706
+ ln && ln(n3), rn = n3.__c;
20707
+ };
20708
+ var cn = l.diffed;
20709
+ l.diffed = function(n3) {
20710
+ cn && cn(n3);
20711
+ var t5 = n3.props, e3 = n3.__e;
20712
+ null != e3 && "textarea" === n3.type && "value" in t5 && t5.value !== e3.value && (e3.value = null == t5.value ? "" : t5.value), rn = null;
20713
+ };
20714
+
20444
20715
  // node_modules/marked/lib/marked.esm.js
20445
20716
  function _getDefaults() {
20446
20717
  return {
@@ -22577,187 +22848,6 @@ var parseInline = marked.parseInline;
22577
22848
  var parser = _Parser.parse;
22578
22849
  var lexer = _Lexer.lex;
22579
22850
 
22580
- // node_modules/preact/compat/dist/compat.module.js
22581
- function g3(n3, t5) {
22582
- for (var e3 in t5) n3[e3] = t5[e3];
22583
- return n3;
22584
- }
22585
- function E2(n3, t5) {
22586
- for (var e3 in n3) if ("__source" !== e3 && !(e3 in t5)) return true;
22587
- for (var r3 in t5) if ("__source" !== r3 && n3[r3] !== t5[r3]) return true;
22588
- return false;
22589
- }
22590
- function M2(n3, t5) {
22591
- this.props = n3, this.context = t5;
22592
- }
22593
- function N2(n3, e3) {
22594
- function r3(n4) {
22595
- var t5 = this.props.ref;
22596
- return t5 != n4.ref && t5 && ("function" == typeof t5 ? t5(null) : t5.current = null), e3 ? !e3(this.props, n4) || t5 != n4.ref : E2(this.props, n4);
22597
- }
22598
- function u3(e4) {
22599
- return this.shouldComponentUpdate = r3, k(n3, e4);
22600
- }
22601
- return u3.displayName = "Memo(" + (n3.displayName || n3.name) + ")", u3.__f = u3.prototype.isReactComponent = true, u3.type = n3, u3;
22602
- }
22603
- (M2.prototype = new C()).isPureReactComponent = true, M2.prototype.shouldComponentUpdate = function(n3, t5) {
22604
- return E2(this.props, n3) || E2(this.state, t5);
22605
- };
22606
- var T3 = l.__b;
22607
- l.__b = function(n3) {
22608
- n3.type && n3.type.__f && n3.ref && (n3.props.ref = n3.ref, n3.ref = null), T3 && T3(n3);
22609
- };
22610
- var A3 = "undefined" != typeof Symbol && Symbol.for && /* @__PURE__ */ Symbol.for("react.forward_ref") || 3911;
22611
- var O2 = l.__e;
22612
- l.__e = function(n3, t5, e3, r3) {
22613
- if (n3.then) {
22614
- for (var u3, o3 = t5; o3 = o3.__; ) if ((u3 = o3.__c) && u3.__c) return null == t5.__e && (t5.__e = e3.__e, t5.__k = e3.__k), u3.__c(n3, t5);
22615
- }
22616
- O2(n3, t5, e3, r3);
22617
- };
22618
- var U2 = l.unmount;
22619
- function V2(n3, t5, e3) {
22620
- return n3 && (n3.__c && n3.__c.__H && (n3.__c.__H.__.forEach(function(n4) {
22621
- "function" == typeof n4.__c && n4.__c();
22622
- }), n3.__c.__H = null), null != (n3 = g3({}, n3)).__c && (n3.__c.__P === e3 && (n3.__c.__P = t5), n3.__c.__e = true, n3.__c = null), n3.__k = n3.__k && n3.__k.map(function(n4) {
22623
- return V2(n4, t5, e3);
22624
- })), n3;
22625
- }
22626
- function W2(n3, t5, e3) {
22627
- return n3 && e3 && (n3.__v = null, n3.__k = n3.__k && n3.__k.map(function(n4) {
22628
- return W2(n4, t5, e3);
22629
- }), n3.__c && n3.__c.__P === t5 && (n3.__e && e3.appendChild(n3.__e), n3.__c.__e = true, n3.__c.__P = e3)), n3;
22630
- }
22631
- function P3() {
22632
- this.__u = 0, this.o = null, this.__b = null;
22633
- }
22634
- function j3(n3) {
22635
- var t5 = n3.__ && n3.__.__c;
22636
- return t5 && t5.__a && t5.__a(n3);
22637
- }
22638
- function B3() {
22639
- this.i = null, this.l = null;
22640
- }
22641
- l.unmount = function(n3) {
22642
- var t5 = n3.__c;
22643
- t5 && (t5.__z = true), t5 && t5.__R && t5.__R(), t5 && 32 & n3.__u && (n3.type = null), U2 && U2(n3);
22644
- }, (P3.prototype = new C()).__c = function(n3, t5) {
22645
- var e3 = t5.__c, r3 = this;
22646
- null == r3.o && (r3.o = []), r3.o.push(e3);
22647
- var u3 = j3(r3.__v), o3 = false, i3 = function() {
22648
- o3 || r3.__z || (o3 = true, e3.__R = null, u3 ? u3(c3) : c3());
22649
- };
22650
- e3.__R = i3;
22651
- var l3 = e3.__P;
22652
- e3.__P = null;
22653
- var c3 = function() {
22654
- if (!--r3.__u) {
22655
- if (r3.state.__a) {
22656
- var n4 = r3.state.__a;
22657
- r3.__v.__k[0] = W2(n4, n4.__c.__P, n4.__c.__O);
22658
- }
22659
- var t6;
22660
- for (r3.setState({ __a: r3.__b = null }); t6 = r3.o.pop(); ) t6.__P = l3, t6.forceUpdate();
22661
- }
22662
- };
22663
- r3.__u++ || 32 & t5.__u || r3.setState({ __a: r3.__b = r3.__v.__k[0] }), n3.then(i3, i3);
22664
- }, P3.prototype.componentWillUnmount = function() {
22665
- this.o = [];
22666
- }, P3.prototype.render = function(n3, e3) {
22667
- if (this.__b) {
22668
- if (this.__v.__k) {
22669
- var r3 = document.createElement("div"), o3 = this.__v.__k[0].__c;
22670
- this.__v.__k[0] = V2(this.__b, r3, o3.__O = o3.__P);
22671
- }
22672
- this.__b = null;
22673
- }
22674
- var i3 = e3.__a && k(S, null, n3.fallback);
22675
- return i3 && (i3.__u &= -33), [k(S, null, e3.__a ? null : n3.children), i3];
22676
- };
22677
- var H2 = function(n3, t5, e3) {
22678
- if (++e3[1] === e3[0] && n3.l.delete(t5), n3.props.revealOrder && ("t" !== n3.props.revealOrder[0] || !n3.l.size)) for (e3 = n3.i; e3; ) {
22679
- for (; e3.length > 3; ) e3.pop()();
22680
- if (e3[1] < e3[0]) break;
22681
- n3.i = e3 = e3[2];
22682
- }
22683
- };
22684
- (B3.prototype = new C()).__a = function(n3) {
22685
- var t5 = this, e3 = j3(t5.__v), r3 = t5.l.get(n3);
22686
- return r3[0]++, function(u3) {
22687
- var o3 = function() {
22688
- t5.props.revealOrder ? (r3.push(u3), H2(t5, n3, r3)) : u3();
22689
- };
22690
- e3 ? e3(o3) : o3();
22691
- };
22692
- }, B3.prototype.render = function(n3) {
22693
- this.i = null, this.l = /* @__PURE__ */ new Map();
22694
- var t5 = F(n3.children);
22695
- n3.revealOrder && "b" === n3.revealOrder[0] && t5.reverse();
22696
- for (var e3 = t5.length; e3--; ) this.l.set(t5[e3], this.i = [1, 0, this.i]);
22697
- return n3.children;
22698
- }, B3.prototype.componentDidUpdate = B3.prototype.componentDidMount = function() {
22699
- var n3 = this;
22700
- this.l.forEach(function(t5, e3) {
22701
- H2(n3, e3, t5);
22702
- });
22703
- };
22704
- var q3 = "undefined" != typeof Symbol && Symbol.for && /* @__PURE__ */ Symbol.for("react.element") || 60103;
22705
- var G2 = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/;
22706
- var J2 = /^on(Ani|Tra|Tou|BeforeInp|Compo)/;
22707
- var K2 = /[A-Z0-9]/g;
22708
- var Q2 = "undefined" != typeof document;
22709
- var X2 = function(n3) {
22710
- return ("undefined" != typeof Symbol && "symbol" == typeof /* @__PURE__ */ Symbol() ? /fil|che|rad/ : /fil|che|ra/).test(n3);
22711
- };
22712
- C.prototype.isReactComponent = true, ["componentWillMount", "componentWillReceiveProps", "componentWillUpdate"].forEach(function(t5) {
22713
- Object.defineProperty(C.prototype, t5, { configurable: true, get: function() {
22714
- return this["UNSAFE_" + t5];
22715
- }, set: function(n3) {
22716
- Object.defineProperty(this, t5, { configurable: true, writable: true, value: n3 });
22717
- } });
22718
- });
22719
- var en2 = l.event;
22720
- l.event = function(n3) {
22721
- return en2 && (n3 = en2(n3)), n3.persist = function() {
22722
- }, n3.isPropagationStopped = function() {
22723
- return this.cancelBubble;
22724
- }, n3.isDefaultPrevented = function() {
22725
- return this.defaultPrevented;
22726
- }, n3.nativeEvent = n3;
22727
- };
22728
- var rn;
22729
- var un = { configurable: true, get: function() {
22730
- return this.class;
22731
- } };
22732
- var on = l.vnode;
22733
- l.vnode = function(n3) {
22734
- "string" == typeof n3.type && (function(n4) {
22735
- var t5 = n4.props, e3 = n4.type, u3 = {}, o3 = -1 == e3.indexOf("-");
22736
- for (var i3 in t5) {
22737
- var l3 = t5[i3];
22738
- if (!("value" === i3 && "defaultValue" in t5 && null == l3 || Q2 && "children" === i3 && "noscript" === e3 || "class" === i3 || "className" === i3)) {
22739
- var c3 = i3.toLowerCase();
22740
- "defaultValue" === i3 && "value" in t5 && null == t5.value ? i3 = "value" : "download" === i3 && true === l3 ? l3 = "" : "translate" === c3 && "no" === l3 ? l3 = false : "o" === c3[0] && "n" === c3[1] ? "ondoubleclick" === c3 ? i3 = "ondblclick" : "onchange" !== c3 || "input" !== e3 && "textarea" !== e3 || X2(t5.type) ? "onfocus" === c3 ? i3 = "onfocusin" : "onblur" === c3 ? i3 = "onfocusout" : J2.test(i3) && (i3 = c3) : c3 = i3 = "oninput" : o3 && G2.test(i3) ? i3 = i3.replace(K2, "-$&").toLowerCase() : null === l3 && (l3 = void 0), "oninput" === c3 && u3[i3 = c3] && (i3 = "oninputCapture"), u3[i3] = l3;
22741
- }
22742
- }
22743
- "select" == e3 && (u3.multiple && Array.isArray(u3.value) && (u3.value = F(t5.children).forEach(function(n5) {
22744
- n5.props.selected = -1 != u3.value.indexOf(n5.props.value);
22745
- })), null != u3.defaultValue && (u3.value = F(t5.children).forEach(function(n5) {
22746
- n5.props.selected = u3.multiple ? -1 != u3.defaultValue.indexOf(n5.props.value) : u3.defaultValue == n5.props.value;
22747
- }))), t5.class && !t5.className ? (u3.class = t5.class, Object.defineProperty(u3, "className", un)) : t5.className && (u3.class = u3.className = t5.className), n4.props = u3;
22748
- })(n3), n3.$$typeof = q3, on && on(n3);
22749
- };
22750
- var ln = l.__r;
22751
- l.__r = function(n3) {
22752
- ln && ln(n3), rn = n3.__c;
22753
- };
22754
- var cn = l.diffed;
22755
- l.diffed = function(n3) {
22756
- cn && cn(n3);
22757
- var t5 = n3.props, e3 = n3.__e;
22758
- null != e3 && "textarea" === n3.type && "value" in t5 && t5.value !== e3.value && (e3.value = null == t5.value ? "" : t5.value), rn = null;
22759
- };
22760
-
22761
22851
  // dashboard/src/lib/html.ts
22762
22852
  var html4 = htm_module_default.bind(k);
22763
22853
 
@@ -23954,15 +24044,6 @@ function ChatPanel() {
23954
24044
  autoScrollInFlight.current = false;
23955
24045
  }, 0);
23956
24046
  }, [messages, streaming]);
23957
- const allMessages = streaming ? [
23958
- ...messages,
23959
- {
23960
- id: streaming.id,
23961
- role: "assistant",
23962
- text: streaming.text,
23963
- reasoning: streaming.reasoning
23964
- }
23965
- ] : messages;
23966
24047
  const resolveModal = q2(async (kind, choice, text) => {
23967
24048
  try {
23968
24049
  await api("/modal/resolve", {
@@ -24107,19 +24188,7 @@ function ChatPanel() {
24107
24188
 
24108
24189
  <div class="chat-body">
24109
24190
  <div class="chat-main">
24110
- <div class="chat-feed" ref=${feedRef}>
24111
- ${allMessages.length === 0 ? html4`<div class="chat-empty">
24112
- ${t4("chat.noConversation")}
24113
- </div>` : allMessages.map(
24114
- (m3) => html4`
24115
- <${ChatMessage}
24116
- key=${m3.id}
24117
- msg=${m3}
24118
- streaming=${Boolean(streaming && streaming.id === m3.id)}
24119
- />
24120
- `
24121
- )}
24122
- </div>
24191
+ <${ChatFeed} messages=${messages} streaming=${streaming} innerRef=${feedRef} />
24123
24192
 
24124
24193
  <div class="chat-input-area" style="position:relative">
24125
24194
  ${popoverKind && popoverItems.length > 0 ? html4`
@@ -24181,7 +24250,32 @@ function ChatPanel() {
24181
24250
  </div>
24182
24251
  `;
24183
24252
  }
24184
- function SideRail({ stats, budgetUsd, activePlan }) {
24253
+ var ChatFeed = N2(function ChatFeed2({ messages, streaming, innerRef }) {
24254
+ useLang();
24255
+ const allMessages = streaming ? [
24256
+ ...messages,
24257
+ {
24258
+ id: streaming.id,
24259
+ role: "assistant",
24260
+ text: streaming.text,
24261
+ reasoning: streaming.reasoning
24262
+ }
24263
+ ] : messages;
24264
+ return html4`
24265
+ <div class="chat-feed" ref=${innerRef}>
24266
+ ${allMessages.length === 0 ? html4`<div class="chat-empty">${t4("chat.noConversation")}</div>` : allMessages.map(
24267
+ (m3) => html4`
24268
+ <${ChatMessage}
24269
+ key=${m3.id}
24270
+ msg=${m3}
24271
+ streaming=${Boolean(streaming && streaming.id === m3.id)}
24272
+ />
24273
+ `
24274
+ )}
24275
+ </div>
24276
+ `;
24277
+ });
24278
+ var SideRail = N2(function SideRail2({ stats, budgetUsd, activePlan }) {
24185
24279
  useLang();
24186
24280
  if (!stats && !activePlan) return html4`<aside class="chat-rail"></aside>`;
24187
24281
  const cachePct = stats ? stats.cacheHitRatio * 100 : 0;
@@ -24218,7 +24312,7 @@ function SideRail({ stats, budgetUsd, activePlan }) {
24218
24312
  ` : null}
24219
24313
  </aside>
24220
24314
  `;
24221
- }
24315
+ });
24222
24316
  function ActivePlanCard({ plan }) {
24223
24317
  useLang();
24224
24318
  const dots = [];
@@ -24304,7 +24398,7 @@ function InFlightRow({
24304
24398
  </div>
24305
24399
  `;
24306
24400
  }
24307
- function ChatStatusBar({ stats, model }) {
24401
+ var ChatStatusBar = N2(function ChatStatusBar2({ stats, model }) {
24308
24402
  useLang();
24309
24403
  if (!stats) {
24310
24404
  return html4`
@@ -24353,7 +24447,7 @@ function ChatStatusBar({ stats, model }) {
24353
24447
  ` : null}
24354
24448
  </div>
24355
24449
  `;
24356
- }
24450
+ });
24357
24451
 
24358
24452
  // dashboard/src/panels/hooks.ts
24359
24453
  function buildMatrix(data) {
@@ -27602,6 +27696,11 @@ function SystemPanel() {
27602
27696
  }
27603
27697
 
27604
27698
  // dashboard/src/panels/tools.ts
27699
+ function toolDesc(name, fallback) {
27700
+ const key = `tools.desc.${name}`;
27701
+ const translated = t4(key);
27702
+ return translated === key ? fallback : translated;
27703
+ }
27605
27704
  function ToolsPanel() {
27606
27705
  useLang();
27607
27706
  const { data, error, loading } = usePoll("/tools", 4e3);
@@ -27640,7 +27739,7 @@ function ToolsPanel() {
27640
27739
  ${tool.readOnly ? html4`<span class="pill ok">${t4("tools.readOnly")}</span>` : html4`<span class="pill acc">${t4("tools.write")}</span>`}
27641
27740
  ${tool.flattened ? html4` <span class="pill">${t4("tools.flat")}</span>` : null}
27642
27741
  </td>
27643
- <td class="dim">${tool.description ?? ""}</td>
27742
+ <td class="dim">${toolDesc(tool.name, tool.description ?? "")}</td>
27644
27743
  </tr>
27645
27744
  `
27646
27745
  )}
@@ -28482,7 +28581,10 @@ function ChangesPanel() {
28482
28581
  onToggleReview=${toggleReviewMode}
28483
28582
  files=${openFiles}
28484
28583
  activePath=${activeFilePath}
28485
- onSelect=${setActiveFilePath}
28584
+ onSelect=${(path) => {
28585
+ setActiveFilePath(path);
28586
+ setReviewMode(false);
28587
+ }}
28486
28588
  onClose=${closeFile}
28487
28589
  />
28488
28590
  <div class="review-controls" style=${{ display: "flex", alignItems: "center", gap: "8px", padding: "6px 12px", borderBottom: "1px solid var(--bd)", fontSize: "12px" }}>
@@ -28659,7 +28761,7 @@ function fmtCost2(usd, currency) {
28659
28761
  }
28660
28762
  return `$${usd.toFixed(4)}`;
28661
28763
  }
28662
- function ChatStatusBar2({ stats, model }) {
28764
+ function ChatStatusBar3({ stats, model }) {
28663
28765
  useLang();
28664
28766
  if (!stats) {
28665
28767
  return html6`
@@ -29197,6 +29299,9 @@ function ChatPane(props) {
29197
29299
  const [model, setModel] = d2(null);
29198
29300
  const shouldAutoScroll = A2(true);
29199
29301
  const feedRef = A2(null);
29302
+ const streamBufRef = A2(null);
29303
+ const streamRafRef = A2(null);
29304
+ const autoScrollInFlight = A2(false);
29200
29305
  const [slashCommands, setSlashCommands] = d2([]);
29201
29306
  const [popoverKind, setPopoverKind] = d2(null);
29202
29307
  const [popoverItems, setPopoverItems] = d2([]);
@@ -29233,22 +29338,54 @@ function ChatPane(props) {
29233
29338
  }, []);
29234
29339
  y2(() => {
29235
29340
  let cancelled = false;
29236
- (async () => {
29341
+ const tick = async () => {
29237
29342
  try {
29238
29343
  const data = await api("/overview");
29239
- if (!cancelled) {
29240
- setStats(data.stats ?? null);
29241
- setModel(data.model ?? null);
29242
- }
29344
+ if (cancelled) return;
29345
+ setStats(data.stats ?? null);
29346
+ setModel(data.model ?? null);
29243
29347
  } catch {
29244
29348
  }
29245
- })();
29349
+ };
29350
+ tick();
29351
+ const t5 = setInterval(tick, 2500);
29246
29352
  return () => {
29247
29353
  cancelled = true;
29354
+ clearInterval(t5);
29248
29355
  };
29249
29356
  }, []);
29357
+ const flushStreaming = q2(() => {
29358
+ streamRafRef.current = null;
29359
+ if (streamBufRef.current) setStreaming(streamBufRef.current);
29360
+ }, []);
29361
+ const cancelStreamingRaf = q2(() => {
29362
+ if (streamRafRef.current !== null) {
29363
+ cancelAnimationFrame(streamRafRef.current);
29364
+ streamRafRef.current = null;
29365
+ }
29366
+ streamBufRef.current = null;
29367
+ }, []);
29368
+ const refetchCanonicalState = q2(async () => {
29369
+ try {
29370
+ const data = await api("/messages");
29371
+ setMessages(data.messages ?? []);
29372
+ setBusy(Boolean(data.busy));
29373
+ cancelStreamingRaf();
29374
+ setStreaming(null);
29375
+ setActiveTool(null);
29376
+ } catch {
29377
+ }
29378
+ }, [cancelStreamingRaf]);
29250
29379
  y2(() => {
29251
29380
  const es = new EventSource(`/api/events?token=${TOKEN}`);
29381
+ let firstOpen = true;
29382
+ es.onopen = () => {
29383
+ if (firstOpen) {
29384
+ firstOpen = false;
29385
+ return;
29386
+ }
29387
+ void refetchCanonicalState();
29388
+ };
29252
29389
  es.onmessage = (ev) => {
29253
29390
  let dash;
29254
29391
  try {
@@ -29266,14 +29403,20 @@ function ChatPane(props) {
29266
29403
  return;
29267
29404
  }
29268
29405
  if (dash.kind === "assistant_delta") {
29269
- setStreaming((cur) => {
29270
- const text = (cur?.text ?? "") + (dash.contentDelta ?? "");
29271
- const reasoning = (cur?.reasoning ?? "") + (dash.reasoningDelta ?? "");
29272
- return { id: dash.id, text, reasoning };
29273
- });
29406
+ const cur = streamBufRef.current;
29407
+ const baseId = cur?.id === dash.id ? cur : null;
29408
+ streamBufRef.current = {
29409
+ id: dash.id,
29410
+ text: (baseId?.text ?? "") + (dash.contentDelta ?? ""),
29411
+ reasoning: (baseId?.reasoning ?? "") + (dash.reasoningDelta ?? "")
29412
+ };
29413
+ if (streamRafRef.current === null) {
29414
+ streamRafRef.current = requestAnimationFrame(flushStreaming);
29415
+ }
29274
29416
  return;
29275
29417
  }
29276
29418
  if (dash.kind === "assistant_final") {
29419
+ cancelStreamingRaf();
29277
29420
  setStreaming(null);
29278
29421
  setMessages((prev) => [
29279
29422
  ...prev,
@@ -29308,18 +29451,26 @@ function ChatPane(props) {
29308
29451
  setError(t4("chat.eventStreamError"));
29309
29452
  setTimeout(() => setError(null), 3e3);
29310
29453
  };
29311
- return () => es.close();
29312
- }, []);
29454
+ return () => {
29455
+ es.close();
29456
+ cancelStreamingRaf();
29457
+ };
29458
+ }, [refetchCanonicalState, cancelStreamingRaf]);
29313
29459
  y2(() => {
29314
29460
  if (!shouldAutoScroll.current) return;
29315
29461
  const el = feedRef.current;
29316
29462
  if (!el) return;
29463
+ autoScrollInFlight.current = true;
29317
29464
  el.scrollTop = el.scrollHeight;
29465
+ setTimeout(() => {
29466
+ autoScrollInFlight.current = false;
29467
+ }, 0);
29318
29468
  }, [messages, streaming]);
29319
29469
  y2(() => {
29320
29470
  const el = feedRef.current;
29321
29471
  if (!el) return;
29322
29472
  const onScroll = () => {
29473
+ if (autoScrollInFlight.current) return;
29323
29474
  const distFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;
29324
29475
  shouldAutoScroll.current = distFromBottom < 80;
29325
29476
  };
@@ -29508,7 +29659,6 @@ ${commentRefs}` : commentRefs;
29508
29659
  </div>
29509
29660
  ` : null}
29510
29661
  <div style=${{ display: "flex", gap: "8px", alignItems: "flex-end", position: "relative" }}>
29511
- <button style=${{ background: "transparent", border: "none", color: "var(--fg-3)", padding: "8px", cursor: "pointer", fontSize: "18px", flexShrink: 0 }}>+</button>
29512
29662
  <div style=${{ flex: 1, position: "relative" }}>
29513
29663
  ${popoverKind && popoverItems.length > 0 ? html6`
29514
29664
  <div class="popover" style="position:absolute;bottom:calc(100% + 6px);left:0;width:380px;max-height:280px;overflow-y:auto;z-index:10">
@@ -29551,7 +29701,7 @@ ${commentRefs}` : commentRefs;
29551
29701
  </div>
29552
29702
  </div>
29553
29703
  </div>
29554
- <${ChatStatusBar2} stats=${stats} model=${model} />
29704
+ <${ChatStatusBar3} stats=${stats} model=${model} />
29555
29705
  </div>
29556
29706
  `;
29557
29707
  }