reasonix 0.41.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 (186) hide show
  1. package/README.md +26 -3
  2. package/dashboard/dist/app.js +98 -3
  3. package/dashboard/dist/app.js.map +1 -1
  4. package/dist/cli/{acp-64VQZLDJ.js → acp-DAGPCVFZ.js} +33 -28
  5. package/dist/cli/acp-DAGPCVFZ.js.map +1 -0
  6. package/dist/cli/chat-7ES4IBNH.js +50 -0
  7. package/dist/cli/{chunk-E46ECXJD.js → chunk-2425HK6U.js} +2 -1
  8. package/dist/cli/{chunk-E46ECXJD.js.map → chunk-2425HK6U.js.map} +1 -1
  9. package/dist/cli/chunk-25T6CVUP.js +172 -0
  10. package/dist/cli/chunk-25T6CVUP.js.map +1 -0
  11. package/dist/cli/{chunk-CD4SCQL4.js → chunk-2K65GZBT.js} +11 -2
  12. package/dist/cli/chunk-2K65GZBT.js.map +1 -0
  13. package/dist/cli/{chunk-H4OLWRSX.js → chunk-2KDUS647.js} +5 -4
  14. package/dist/cli/chunk-2KDUS647.js.map +1 -0
  15. package/dist/cli/chunk-2R4QCDOZ.js +11392 -0
  16. package/dist/cli/chunk-2R4QCDOZ.js.map +1 -0
  17. package/dist/cli/{chunk-3Q3C4W66.js → chunk-2UQP6H6T.js} +2 -1
  18. package/dist/cli/{chunk-3Q3C4W66.js.map → chunk-2UQP6H6T.js.map} +1 -1
  19. package/dist/cli/chunk-2Z35JOA4.js +96 -0
  20. package/dist/cli/chunk-2Z35JOA4.js.map +1 -0
  21. package/dist/cli/chunk-32TIKD5U.js +54 -0
  22. package/dist/cli/{chunk-L7W3HJZQ.js.map → chunk-32TIKD5U.js.map} +1 -1
  23. package/dist/cli/{chunk-A3LL4XDV.js → chunk-3BXRZFWS.js} +59 -3
  24. package/dist/cli/chunk-3BXRZFWS.js.map +1 -0
  25. package/dist/cli/{chunk-SXLJBFIV.js → chunk-3Z6IBU3D.js} +11 -7
  26. package/dist/cli/chunk-3Z6IBU3D.js.map +1 -0
  27. package/dist/cli/{chunk-A7VHMMDE.js → chunk-45U62RI3.js} +12 -5
  28. package/dist/cli/chunk-45U62RI3.js.map +1 -0
  29. package/dist/cli/{chunk-7VFNPMKG.js → chunk-4QUNBQQ2.js} +3 -2
  30. package/dist/cli/{chunk-7VFNPMKG.js.map → chunk-4QUNBQQ2.js.map} +1 -1
  31. package/dist/cli/{chunk-ARF3N2SY.js → chunk-5JJRUIPA.js} +4 -3
  32. package/dist/cli/{chunk-ARF3N2SY.js.map → chunk-5JJRUIPA.js.map} +1 -1
  33. package/dist/cli/{chunk-CFY2XLY6.js → chunk-6AK4EY3D.js} +7 -5
  34. package/dist/cli/{chunk-CFY2XLY6.js.map → chunk-6AK4EY3D.js.map} +1 -1
  35. package/dist/cli/chunk-6G3CUUFG.js +34320 -0
  36. package/dist/cli/chunk-6G3CUUFG.js.map +1 -0
  37. package/dist/cli/{chunk-YJFKFTAL.js → chunk-6PBZN4VI.js} +15 -3
  38. package/dist/cli/chunk-6PBZN4VI.js.map +1 -0
  39. package/dist/cli/{chunk-4W2CICFQ.js → chunk-6PZ3CXBP.js} +71 -60
  40. package/dist/cli/chunk-6PZ3CXBP.js.map +1 -0
  41. package/dist/cli/chunk-74EX7SUH.js +25293 -0
  42. package/dist/cli/chunk-74EX7SUH.js.map +1 -0
  43. package/dist/cli/{chunk-WE3YZULK.js → chunk-7O5ALB4C.js} +3 -2
  44. package/dist/cli/{chunk-WE3YZULK.js.map → chunk-7O5ALB4C.js.map} +1 -1
  45. package/dist/cli/{chunk-2CXPDAWX.js → chunk-DOYHN4KB.js} +3 -2
  46. package/dist/cli/{chunk-2CXPDAWX.js.map → chunk-DOYHN4KB.js.map} +1 -1
  47. package/dist/cli/{chunk-VFG4GIT3.js → chunk-F3PXYSNN.js} +3 -2
  48. package/dist/cli/{chunk-VFG4GIT3.js.map → chunk-F3PXYSNN.js.map} +1 -1
  49. package/dist/cli/{chunk-7SPOFTMT.js → chunk-FHOGSSCH.js} +4 -3
  50. package/dist/cli/{chunk-7SPOFTMT.js.map → chunk-FHOGSSCH.js.map} +1 -1
  51. package/dist/cli/{chunk-LTXADNCO.js → chunk-H6PS7IUE.js} +3 -2
  52. package/dist/cli/{chunk-LTXADNCO.js.map → chunk-H6PS7IUE.js.map} +1 -1
  53. package/dist/cli/{chunk-ZTLZO42A.js → chunk-HFEAY5DT.js} +3 -2
  54. package/dist/cli/{chunk-ZTLZO42A.js.map → chunk-HFEAY5DT.js.map} +1 -1
  55. package/dist/cli/{chunk-FWGEHRB7.js → chunk-J5XJHLWM.js} +2 -1
  56. package/dist/cli/{chunk-FWGEHRB7.js.map → chunk-J5XJHLWM.js.map} +1 -1
  57. package/dist/cli/{chunk-Y5XNV3NX.js → chunk-JMBMLOBP.js} +2 -1
  58. package/dist/cli/{chunk-Y5XNV3NX.js.map → chunk-JMBMLOBP.js.map} +1 -1
  59. package/dist/cli/{chunk-BYZGO3BX.js → chunk-O52OLQL3.js} +11 -3
  60. package/dist/cli/chunk-O52OLQL3.js.map +1 -0
  61. package/dist/cli/{chunk-4DCHFFEY.js → chunk-OSZC7C6F.js} +3 -2
  62. package/dist/cli/{chunk-4DCHFFEY.js.map → chunk-OSZC7C6F.js.map} +1 -1
  63. package/dist/cli/chunk-P7EKE5ZQ.js +60641 -0
  64. package/dist/cli/chunk-P7EKE5ZQ.js.map +1 -0
  65. package/dist/cli/{chunk-FM57FNPJ.js → chunk-PLHAZOLZ.js} +2 -1
  66. package/dist/cli/{chunk-FM57FNPJ.js.map → chunk-PLHAZOLZ.js.map} +1 -1
  67. package/dist/cli/{chunk-BOFL3T45.js → chunk-PQXPXJBJ.js} +12 -11
  68. package/dist/cli/chunk-PQXPXJBJ.js.map +1 -0
  69. package/dist/cli/{chunk-DAEAAVDF.js → chunk-PV55UMTO.js} +2 -1
  70. package/dist/cli/{chunk-DAEAAVDF.js.map → chunk-PV55UMTO.js.map} +1 -1
  71. package/dist/cli/{chunk-MHGPBJ2T.js → chunk-RE4RAVFF.js} +45 -10
  72. package/dist/cli/chunk-RE4RAVFF.js.map +1 -0
  73. package/dist/cli/chunk-S4XVGLRW.js +499 -0
  74. package/dist/cli/chunk-S4XVGLRW.js.map +1 -0
  75. package/dist/cli/{chunk-WJ3YX4PZ.js → chunk-SZ5XES2N.js} +3 -2
  76. package/dist/cli/{chunk-WJ3YX4PZ.js.map → chunk-SZ5XES2N.js.map} +1 -1
  77. package/dist/cli/{chunk-UV7XJUJH.js → chunk-TJX6BFZZ.js} +16 -9
  78. package/dist/cli/{chunk-UV7XJUJH.js.map → chunk-TJX6BFZZ.js.map} +1 -1
  79. package/dist/cli/chunk-TUK7OWJA.js +51 -0
  80. package/dist/cli/{chunk-KZYLMMU5.js → chunk-VK5HG73G.js} +13 -12
  81. package/dist/cli/{chunk-KZYLMMU5.js.map → chunk-VK5HG73G.js.map} +1 -1
  82. package/dist/cli/{chunk-4H3ZRJ2U.js → chunk-XCGGEJTI.js} +4 -3
  83. package/dist/cli/{chunk-4H3ZRJ2U.js.map → chunk-XCGGEJTI.js.map} +1 -1
  84. package/dist/cli/{chunk-SOZE7V7V.js → chunk-XJXDHAES.js} +3 -2
  85. package/dist/cli/{chunk-SOZE7V7V.js.map → chunk-XJXDHAES.js.map} +1 -1
  86. package/dist/cli/chunk-XPDVG52A.js +2648 -0
  87. package/dist/cli/chunk-XPDVG52A.js.map +1 -0
  88. package/dist/cli/{chunk-CRPQUBP6.js → chunk-XXC2BYTV.js} +2 -1
  89. package/dist/cli/{chunk-CRPQUBP6.js.map → chunk-XXC2BYTV.js.map} +1 -1
  90. package/dist/cli/{chunk-AT6GGIBV.js → chunk-YFGF5NKA.js} +17 -14
  91. package/dist/cli/{chunk-AT6GGIBV.js.map → chunk-YFGF5NKA.js.map} +1 -1
  92. package/dist/cli/{chunk-ORM6PK57.js → chunk-YQ6NTIIE.js} +2 -1
  93. package/dist/cli/{chunk-ORM6PK57.js.map → chunk-YQ6NTIIE.js.map} +1 -1
  94. package/dist/cli/{chunk-RAUPWSYA.js → chunk-YYQAUTTN.js} +3 -2
  95. package/dist/cli/{chunk-RAUPWSYA.js.map → chunk-YYQAUTTN.js.map} +1 -1
  96. package/dist/cli/chunk-ZZM6QJ4W.js +109 -0
  97. package/dist/cli/chunk-ZZM6QJ4W.js.map +1 -0
  98. package/dist/cli/{code-X3M6ENTQ.js → code-SMKEW6CD.js} +60 -56
  99. package/dist/cli/code-SMKEW6CD.js.map +1 -0
  100. package/dist/cli/{commands-QY7MSQG7.js → commands-FVVB5FZF.js} +7 -5
  101. package/dist/cli/{commands-QY7MSQG7.js.map → commands-FVVB5FZF.js.map} +1 -1
  102. package/dist/cli/{commit-BRCQ3OQO.js → commit-HE4VSPZ7.js} +7 -4
  103. package/dist/cli/{commit-BRCQ3OQO.js.map → commit-HE4VSPZ7.js.map} +1 -1
  104. package/dist/cli/{desktop-ZTMHQR2Y.js → desktop-Q7NDXCON.js} +162 -74
  105. package/dist/cli/desktop-Q7NDXCON.js.map +1 -0
  106. package/dist/cli/devtools-YECO25QO.js +3719 -0
  107. package/dist/cli/devtools-YECO25QO.js.map +1 -0
  108. package/dist/cli/diff-435UTPC5.js +165 -0
  109. package/dist/cli/{diff-YASCB7PU.js.map → diff-435UTPC5.js.map} +1 -1
  110. package/dist/cli/doctor-OT7KH75K.js +27 -0
  111. package/dist/cli/{events-2AJTXR7I.js → events-XEFAD5VX.js} +6 -4
  112. package/dist/cli/{events-2AJTXR7I.js.map → events-XEFAD5VX.js.map} +1 -1
  113. package/dist/cli/index.js +3209 -133
  114. package/dist/cli/index.js.map +1 -1
  115. package/dist/cli/{mcp-YMWBLRR7.js → mcp-WUL2WO75.js} +6 -4
  116. package/dist/cli/{mcp-YMWBLRR7.js.map → mcp-WUL2WO75.js.map} +1 -1
  117. package/dist/cli/{mcp-browse-XLDUE6SB.js → mcp-browse-RR7R4XET.js} +32 -21
  118. package/dist/cli/{mcp-browse-XLDUE6SB.js.map → mcp-browse-RR7R4XET.js.map} +1 -1
  119. package/dist/cli/{mcp-inspect-H4D2HSJP.js → mcp-inspect-REGLYBWT.js} +8 -5
  120. package/dist/cli/{mcp-inspect-H4D2HSJP.js.map → mcp-inspect-REGLYBWT.js.map} +1 -1
  121. package/dist/cli/package.json +3 -0
  122. package/dist/cli/prompt-UW6EFLVR.js +16 -0
  123. package/dist/cli/{prune-sessions-4N3BVST2.js → prune-sessions-3RWUBYRS.js} +4 -2
  124. package/dist/cli/{prune-sessions-4N3BVST2.js.map → prune-sessions-3RWUBYRS.js.map} +1 -1
  125. package/dist/cli/{replay-3GTWM75X.js → replay-YOURXV4C.js} +42 -30
  126. package/dist/cli/{replay-3GTWM75X.js.map → replay-YOURXV4C.js.map} +1 -1
  127. package/dist/cli/{run-BLZPTRDX.js → run-Q6BUXV66.js} +24 -21
  128. package/dist/cli/{run-BLZPTRDX.js.map → run-Q6BUXV66.js.map} +1 -1
  129. package/dist/cli/{server-DRFPXXSH.js → server-XGDBRWMB.js} +40 -43
  130. package/dist/cli/server-XGDBRWMB.js.map +1 -0
  131. package/dist/cli/{sessions-BOWFPTXT.js → sessions-FH7QVYSY.js} +22 -19
  132. package/dist/cli/{sessions-BOWFPTXT.js.map → sessions-FH7QVYSY.js.map} +1 -1
  133. package/dist/cli/setup-VDS6SVEP.js +618 -0
  134. package/dist/cli/setup-VDS6SVEP.js.map +1 -0
  135. package/dist/cli/stats-MQVI2XQH.js +14 -0
  136. package/dist/cli/update-6ITLPRDV.js +15 -0
  137. package/dist/cli/update-6ITLPRDV.js.map +1 -0
  138. package/dist/cli/version-DAHGZY5N.js +33 -0
  139. package/dist/cli/{version-XQXYSJ5L.js.map → version-DAHGZY5N.js.map} +1 -1
  140. package/dist/index.d.ts +12 -3
  141. package/dist/index.js +182 -97
  142. package/dist/index.js.map +1 -1
  143. package/package.json +1 -1
  144. package/dist/cli/acp-64VQZLDJ.js.map +0 -1
  145. package/dist/cli/chat-ZAGX52RV.js +0 -46
  146. package/dist/cli/chunk-4W2CICFQ.js.map +0 -1
  147. package/dist/cli/chunk-5X7LZJDE.js +0 -36
  148. package/dist/cli/chunk-5X7LZJDE.js.map +0 -1
  149. package/dist/cli/chunk-65Q5HQ26.js +0 -892
  150. package/dist/cli/chunk-65Q5HQ26.js.map +0 -1
  151. package/dist/cli/chunk-A3LL4XDV.js.map +0 -1
  152. package/dist/cli/chunk-A7VHMMDE.js.map +0 -1
  153. package/dist/cli/chunk-AFFZF3MW.js +0 -36
  154. package/dist/cli/chunk-AFFZF3MW.js.map +0 -1
  155. package/dist/cli/chunk-BOFL3T45.js.map +0 -1
  156. package/dist/cli/chunk-BYZGO3BX.js.map +0 -1
  157. package/dist/cli/chunk-CD4SCQL4.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-F2AV2QDK.js +0 -16514
  161. package/dist/cli/chunk-F2AV2QDK.js.map +0 -1
  162. package/dist/cli/chunk-H4OLWRSX.js.map +0 -1
  163. package/dist/cli/chunk-IEA6JOIP.js +0 -5430
  164. package/dist/cli/chunk-IEA6JOIP.js.map +0 -1
  165. package/dist/cli/chunk-L7W3HJZQ.js +0 -46
  166. package/dist/cli/chunk-LN27AKV3.js +0 -26
  167. package/dist/cli/chunk-LN27AKV3.js.map +0 -1
  168. package/dist/cli/chunk-MHGPBJ2T.js.map +0 -1
  169. package/dist/cli/chunk-SXLJBFIV.js.map +0 -1
  170. package/dist/cli/chunk-YJFKFTAL.js.map +0 -1
  171. package/dist/cli/code-X3M6ENTQ.js.map +0 -1
  172. package/dist/cli/desktop-ZTMHQR2Y.js.map +0 -1
  173. package/dist/cli/diff-YASCB7PU.js +0 -153
  174. package/dist/cli/doctor-XCN5ETVP.js +0 -24
  175. package/dist/cli/prompt-RSIHN62V.js +0 -14
  176. package/dist/cli/server-DRFPXXSH.js.map +0 -1
  177. package/dist/cli/setup-FQL2JJC2.js +0 -516
  178. package/dist/cli/setup-FQL2JJC2.js.map +0 -1
  179. package/dist/cli/stats-5RJCATCE.js +0 -12
  180. package/dist/cli/update-GUCWB4UN.js +0 -13
  181. package/dist/cli/version-XQXYSJ5L.js +0 -30
  182. /package/dist/cli/{chat-ZAGX52RV.js.map → chat-7ES4IBNH.js.map} +0 -0
  183. /package/dist/cli/{doctor-XCN5ETVP.js.map → chunk-TUK7OWJA.js.map} +0 -0
  184. /package/dist/cli/{prompt-RSIHN62V.js.map → doctor-OT7KH75K.js.map} +0 -0
  185. /package/dist/cli/{stats-5RJCATCE.js.map → prompt-UW6EFLVR.js.map} +0 -0
  186. /package/dist/cli/{update-GUCWB4UN.js.map → stats-MQVI2XQH.js.map} +0 -0
package/README.md CHANGED
@@ -56,14 +56,25 @@
56
56
 
57
57
  ## Install
58
58
 
59
+ Requires Node ≥ 22. Works on macOS · Linux · Windows (PowerShell · Git Bash · Windows Terminal).
60
+
61
+ Install Reasonix globally if you want the `reasonix` command available on your `PATH`:
62
+
63
+ ```bash
64
+ npm install -g reasonix
65
+ reasonix code my-project # paste a DeepSeek API key on first run; persists after
66
+ ```
67
+
68
+ Or run it once without installing globally:
69
+
59
70
  ```bash
60
71
  cd my-project
61
- npx reasonix code # paste a DeepSeek API key on first run; persists after
72
+ npx reasonix code # always uses the latest package by default
62
73
  ```
63
74
 
64
- Requires Node ≥ 22. Works on macOS · Linux · Windows (PowerShell · Git Bash · Windows Terminal). Grab a [DeepSeek API key →](https://platform.deepseek.com/api_keys) · `reasonix code --help` for flags.
75
+ Grab a [DeepSeek API key →](https://platform.deepseek.com/api_keys) · `reasonix code --help` for flags.
65
76
 
66
- `npx` is the recommended path — no global install, always latest. If you use Reasonix daily and want it on `PATH`, run `reasonix update` once.
77
+ If you use Reasonix daily, global install is the simplest path. If you just want to try it, use `npx`.
67
78
 
68
79
  | Command | When |
69
80
  |---|---|
@@ -75,6 +86,18 @@ Requires Node ≥ 22. Works on macOS · Linux · Windows (PowerShell · Git Bash
75
86
 
76
87
  Other subcommands (`replay` · `diff` · `events` · `stats` · `index` · `mcp` · `prune-sessions`) are in `reasonix --help` and the [CLI reference](https://esengine.github.io/DeepSeek-Reasonix/#cli).
77
88
 
89
+ ### Desktop client (prerelease)
90
+
91
+ A native Tauri client for users who want a GUI over the same loop. Multi-tab, the right-panel shows files the agent has read or edited this session, the same cost / cache / token meters live at the bottom. Same DeepSeek API key, same `~/.reasonix` config — the desktop bundles its own Node runtime, no separate `npm install` step.
92
+
93
+ Download platform installers from [GitHub Releases](https://github.com/esengine/DeepSeek-Reasonix/releases). The desktop ships as a **prerelease**: the loop and protocol are the same as the CLI, but the UI is still being polished and the installers aren't code-signed yet.
94
+
95
+ - **macOS** — first launch hits Gatekeeper. One-time fix: `xattr -dr com.apple.quarantine /Applications/Reasonix.app` (or right-click → Open → confirm).
96
+ - **Windows** — SmartScreen warns "Unknown publisher". Click **More info → Run anyway**.
97
+ - **Linux** — `.deb` and `.AppImage` ship plain, no extra step.
98
+
99
+ The CLI remains the canonical surface. Anything that lands in the CLI is also available from the desktop's composer.
100
+
78
101
  <details>
79
102
  <summary><strong>Working in another folder · chat vs. code · author a skill</strong></summary>
80
103
 
@@ -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",
@@ -27606,6 +27696,11 @@ function SystemPanel() {
27606
27696
  }
27607
27697
 
27608
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
+ }
27609
27704
  function ToolsPanel() {
27610
27705
  useLang();
27611
27706
  const { data, error, loading } = usePoll("/tools", 4e3);
@@ -27644,7 +27739,7 @@ function ToolsPanel() {
27644
27739
  ${tool.readOnly ? html4`<span class="pill ok">${t4("tools.readOnly")}</span>` : html4`<span class="pill acc">${t4("tools.write")}</span>`}
27645
27740
  ${tool.flattened ? html4` <span class="pill">${t4("tools.flat")}</span>` : null}
27646
27741
  </td>
27647
- <td class="dim">${tool.description ?? ""}</td>
27742
+ <td class="dim">${toolDesc(tool.name, tool.description ?? "")}</td>
27648
27743
  </tr>
27649
27744
  `
27650
27745
  )}