reasonix 0.50.0 → 0.51.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 (147) hide show
  1. package/dashboard/dist/app.css +1 -1
  2. package/dashboard/dist/app.js +24 -22
  3. package/dashboard/dist/app.js.map +1 -1
  4. package/dist/cli/{acp-6B25WIFF.js → acp-XEUHGG7X.js} +34 -31
  5. package/dist/cli/acp-XEUHGG7X.js.map +1 -0
  6. package/dist/cli/chat-NJ2Q5KHG.js +50 -0
  7. package/dist/cli/{chunk-OPGWCKKU.js → chunk-2HVTBFCI.js} +3 -3
  8. package/dist/cli/{chunk-AJIZ5KFK.js → chunk-2WUEAI2I.js} +3 -3
  9. package/dist/cli/{chunk-I4Q3QT4W.js → chunk-36BM7INR.js} +2 -2
  10. package/dist/cli/{chunk-3RNFYDDM.js → chunk-3BTK5BHI.js} +11 -7
  11. package/dist/cli/chunk-3BTK5BHI.js.map +1 -0
  12. package/dist/cli/{chunk-GMSAB2TC.js → chunk-3YRTIWFX.js} +2 -2
  13. package/dist/cli/{chunk-NLRC3DWQ.js → chunk-544J4PXD.js} +5 -5
  14. package/dist/cli/{chunk-7WITYWKN.js → chunk-5AIDYVH2.js} +2 -2
  15. package/dist/cli/{chunk-ALCOQP6R.js → chunk-5BBC6YMV.js} +5 -5
  16. package/dist/cli/{chunk-S4XVGLRW.js → chunk-6UNHNVJR.js} +72 -5
  17. package/dist/cli/chunk-6UNHNVJR.js.map +1 -0
  18. package/dist/cli/{chunk-IK6WWRIX.js → chunk-6XWXIVQ3.js} +38 -22
  19. package/dist/cli/chunk-6XWXIVQ3.js.map +1 -0
  20. package/dist/cli/{chunk-AAHB2PFX.js → chunk-7YB26OQO.js} +4 -4
  21. package/dist/cli/chunk-7YB26OQO.js.map +1 -0
  22. package/dist/cli/{chunk-MXWPAPZW.js → chunk-A5PBEIJ7.js} +53 -10
  23. package/dist/cli/chunk-A5PBEIJ7.js.map +1 -0
  24. package/dist/cli/{chunk-FQSQFCBI.js → chunk-BA5R6BAE.js} +2 -2
  25. package/dist/cli/{chunk-XWPZHWC2.js → chunk-BM6BBFAV.js} +2 -2
  26. package/dist/cli/{chunk-CAGKEGNE.js → chunk-BOWSNGQC.js} +52 -140
  27. package/dist/cli/chunk-BOWSNGQC.js.map +1 -0
  28. package/dist/cli/{chunk-EZ57UEZQ.js → chunk-C2MRSJTV.js} +2 -2
  29. package/dist/cli/{chunk-PYIZZAVQ.js → chunk-DVD67FXQ.js} +1716 -4
  30. package/dist/cli/chunk-DVD67FXQ.js.map +1 -0
  31. package/dist/cli/{chunk-ZAXMJANP.js → chunk-EAMXOWUW.js} +3 -3
  32. package/dist/cli/{chunk-TX652NBA.js → chunk-EWVFGYT6.js} +2 -2
  33. package/dist/cli/{chunk-IBRTU5WO.js → chunk-FP7IOWBQ.js} +18 -1182
  34. package/dist/cli/chunk-FP7IOWBQ.js.map +1 -0
  35. package/dist/cli/{chunk-I6FBSTTR.js → chunk-HGK57NBN.js} +9 -353
  36. package/dist/cli/chunk-HGK57NBN.js.map +1 -0
  37. package/dist/cli/chunk-JHWQDJZA.js +80 -0
  38. package/dist/cli/chunk-JHWQDJZA.js.map +1 -0
  39. package/dist/cli/{chunk-X2BQZQEE.js → chunk-K3QJ3GKI.js} +3 -3
  40. package/dist/cli/{chunk-GPUH2BNM.js → chunk-K4YQFULP.js} +612 -254
  41. package/dist/cli/chunk-K4YQFULP.js.map +1 -0
  42. package/dist/cli/chunk-L3VPEESB.js +31 -0
  43. package/dist/cli/chunk-L3VPEESB.js.map +1 -0
  44. package/dist/cli/{chunk-ENFBF6HI.js → chunk-N4SEBLU4.js} +383 -5
  45. package/dist/cli/chunk-N4SEBLU4.js.map +1 -0
  46. package/dist/cli/chunk-NRROJXXT.js +879 -0
  47. package/dist/cli/chunk-NRROJXXT.js.map +1 -0
  48. package/dist/cli/{chunk-3KRRTLC5.js → chunk-R6KIHEF3.js} +1619 -1036
  49. package/dist/cli/chunk-R6KIHEF3.js.map +1 -0
  50. package/dist/cli/{chunk-VVMY4M7J.js → chunk-SBHF5NWD.js} +27 -4
  51. package/dist/cli/chunk-SBHF5NWD.js.map +1 -0
  52. package/dist/cli/{chunk-OWA42BKS.js → chunk-SXSAWOB7.js} +14 -14
  53. package/dist/cli/{chunk-6IUMTRFP.js → chunk-UMZ6KHTS.js} +2 -2
  54. package/dist/cli/{chunk-7X4JJOO7.js → chunk-UO6E7FN3.js} +69 -5
  55. package/dist/cli/{chunk-7X4JJOO7.js.map → chunk-UO6E7FN3.js.map} +1 -1
  56. package/dist/cli/{chunk-3ZZXQ3CZ.js → chunk-UPW544V3.js} +2 -2
  57. package/dist/cli/{chunk-XJZWMU5P.js → chunk-WPOKBW5E.js} +2 -2
  58. package/dist/cli/{chunk-WSBFVOCO.js → chunk-Z3MKG7MQ.js} +2 -2
  59. package/dist/cli/{code-TBK2TASK.js → code-BMXLBC7D.js} +37 -36
  60. package/dist/cli/{code-TBK2TASK.js.map → code-BMXLBC7D.js.map} +1 -1
  61. package/dist/cli/{commands-NXTKSQTN.js → commands-E4RZXMF6.js} +5 -5
  62. package/dist/cli/{commit-IR5SPP7A.js → commit-KSRQ64IL.js} +3 -3
  63. package/dist/cli/{config-XK5WQGTS.js → config-QNDONOTU.js} +4 -2
  64. package/dist/cli/{desktop-5NTQBADL.js → desktop-H3ZHIMDA.js} +83 -37
  65. package/dist/cli/desktop-H3ZHIMDA.js.map +1 -0
  66. package/dist/cli/{diff-JNYX5BSZ.js → diff-I4PYI43W.js} +9 -9
  67. package/dist/cli/{doctor-IKYLUFXX.js → doctor-Y2E4MY2F.js} +12 -12
  68. package/dist/cli/{events-HSC57ONU.js → events-47HOT7ZA.js} +5 -5
  69. package/dist/cli/find-in-code-YLEIK5FK.js +145 -0
  70. package/dist/cli/find-in-code-YLEIK5FK.js.map +1 -0
  71. package/dist/cli/index.js +95 -44
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/cli/{mcp-BDJJWOCD.js → mcp-76DK63ZB.js} +3 -3
  74. package/dist/cli/{mcp-browse-NJRZDI6V.js → mcp-browse-SDNUGO74.js} +3 -3
  75. package/dist/cli/{mcp-inspect-Y62NWZQL.js → mcp-inspect-BL5DEO5M.js} +3 -3
  76. package/dist/cli/{prompt-UTOIFUQC.js → prompt-JLATI3P7.js} +5 -5
  77. package/dist/cli/{prune-sessions-UCUD4XAP.js → prune-sessions-WHZDFUKD.js} +4 -4
  78. package/dist/cli/{replay-VVIN64MN.js → replay-MHXS7C7Z.js} +10 -10
  79. package/dist/cli/{run-76OBDZFB.js → run-SXNCPRJE.js} +22 -22
  80. package/dist/cli/{server-SZZDKTH2.js → server-GEHOE6CO.js} +61 -35
  81. package/dist/cli/server-GEHOE6CO.js.map +1 -0
  82. package/dist/cli/{sessions-FZTGRCM5.js → sessions-EPBFYISL.js} +18 -18
  83. package/dist/cli/{setup-4UNENGOE.js → setup-IW2XR5XI.js} +8 -7
  84. package/dist/cli/setup-IW2XR5XI.js.map +1 -0
  85. package/dist/cli/{stats-F4NDOD7D.js → stats-4WB4XHBP.js} +6 -6
  86. package/dist/cli/symbols-UQ274IOB.js +167 -0
  87. package/dist/cli/symbols-UQ274IOB.js.map +1 -0
  88. package/dist/cli/version-4SP3DLLH.js +33 -0
  89. package/dist/index.d.ts +25 -6
  90. package/dist/index.js +2700 -578
  91. package/dist/index.js.map +1 -1
  92. package/package.json +6 -3
  93. package/scripts/postinstall.mjs +10 -0
  94. package/dist/cli/acp-6B25WIFF.js.map +0 -1
  95. package/dist/cli/chat-7WASPB4O.js +0 -50
  96. package/dist/cli/chunk-3KRRTLC5.js.map +0 -1
  97. package/dist/cli/chunk-3RNFYDDM.js.map +0 -1
  98. package/dist/cli/chunk-AAHB2PFX.js.map +0 -1
  99. package/dist/cli/chunk-CAGKEGNE.js.map +0 -1
  100. package/dist/cli/chunk-ENFBF6HI.js.map +0 -1
  101. package/dist/cli/chunk-GPUH2BNM.js.map +0 -1
  102. package/dist/cli/chunk-I6FBSTTR.js.map +0 -1
  103. package/dist/cli/chunk-IBRTU5WO.js.map +0 -1
  104. package/dist/cli/chunk-IK6WWRIX.js.map +0 -1
  105. package/dist/cli/chunk-MXWPAPZW.js.map +0 -1
  106. package/dist/cli/chunk-PYIZZAVQ.js.map +0 -1
  107. package/dist/cli/chunk-S4XVGLRW.js.map +0 -1
  108. package/dist/cli/chunk-VVMY4M7J.js.map +0 -1
  109. package/dist/cli/desktop-5NTQBADL.js.map +0 -1
  110. package/dist/cli/server-SZZDKTH2.js.map +0 -1
  111. package/dist/cli/setup-4UNENGOE.js.map +0 -1
  112. package/dist/cli/version-LUVTWHLL.js +0 -33
  113. /package/dist/cli/{chat-7WASPB4O.js.map → chat-NJ2Q5KHG.js.map} +0 -0
  114. /package/dist/cli/{chunk-OPGWCKKU.js.map → chunk-2HVTBFCI.js.map} +0 -0
  115. /package/dist/cli/{chunk-AJIZ5KFK.js.map → chunk-2WUEAI2I.js.map} +0 -0
  116. /package/dist/cli/{chunk-I4Q3QT4W.js.map → chunk-36BM7INR.js.map} +0 -0
  117. /package/dist/cli/{chunk-GMSAB2TC.js.map → chunk-3YRTIWFX.js.map} +0 -0
  118. /package/dist/cli/{chunk-NLRC3DWQ.js.map → chunk-544J4PXD.js.map} +0 -0
  119. /package/dist/cli/{chunk-7WITYWKN.js.map → chunk-5AIDYVH2.js.map} +0 -0
  120. /package/dist/cli/{chunk-ALCOQP6R.js.map → chunk-5BBC6YMV.js.map} +0 -0
  121. /package/dist/cli/{chunk-FQSQFCBI.js.map → chunk-BA5R6BAE.js.map} +0 -0
  122. /package/dist/cli/{chunk-XWPZHWC2.js.map → chunk-BM6BBFAV.js.map} +0 -0
  123. /package/dist/cli/{chunk-EZ57UEZQ.js.map → chunk-C2MRSJTV.js.map} +0 -0
  124. /package/dist/cli/{chunk-ZAXMJANP.js.map → chunk-EAMXOWUW.js.map} +0 -0
  125. /package/dist/cli/{chunk-TX652NBA.js.map → chunk-EWVFGYT6.js.map} +0 -0
  126. /package/dist/cli/{chunk-X2BQZQEE.js.map → chunk-K3QJ3GKI.js.map} +0 -0
  127. /package/dist/cli/{chunk-OWA42BKS.js.map → chunk-SXSAWOB7.js.map} +0 -0
  128. /package/dist/cli/{chunk-6IUMTRFP.js.map → chunk-UMZ6KHTS.js.map} +0 -0
  129. /package/dist/cli/{chunk-3ZZXQ3CZ.js.map → chunk-UPW544V3.js.map} +0 -0
  130. /package/dist/cli/{chunk-XJZWMU5P.js.map → chunk-WPOKBW5E.js.map} +0 -0
  131. /package/dist/cli/{chunk-WSBFVOCO.js.map → chunk-Z3MKG7MQ.js.map} +0 -0
  132. /package/dist/cli/{commands-NXTKSQTN.js.map → commands-E4RZXMF6.js.map} +0 -0
  133. /package/dist/cli/{commit-IR5SPP7A.js.map → commit-KSRQ64IL.js.map} +0 -0
  134. /package/dist/cli/{config-XK5WQGTS.js.map → config-QNDONOTU.js.map} +0 -0
  135. /package/dist/cli/{diff-JNYX5BSZ.js.map → diff-I4PYI43W.js.map} +0 -0
  136. /package/dist/cli/{doctor-IKYLUFXX.js.map → doctor-Y2E4MY2F.js.map} +0 -0
  137. /package/dist/cli/{events-HSC57ONU.js.map → events-47HOT7ZA.js.map} +0 -0
  138. /package/dist/cli/{mcp-BDJJWOCD.js.map → mcp-76DK63ZB.js.map} +0 -0
  139. /package/dist/cli/{mcp-browse-NJRZDI6V.js.map → mcp-browse-SDNUGO74.js.map} +0 -0
  140. /package/dist/cli/{mcp-inspect-Y62NWZQL.js.map → mcp-inspect-BL5DEO5M.js.map} +0 -0
  141. /package/dist/cli/{prompt-UTOIFUQC.js.map → prompt-JLATI3P7.js.map} +0 -0
  142. /package/dist/cli/{prune-sessions-UCUD4XAP.js.map → prune-sessions-WHZDFUKD.js.map} +0 -0
  143. /package/dist/cli/{replay-VVIN64MN.js.map → replay-MHXS7C7Z.js.map} +0 -0
  144. /package/dist/cli/{run-76OBDZFB.js.map → run-SXNCPRJE.js.map} +0 -0
  145. /package/dist/cli/{sessions-FZTGRCM5.js.map → sessions-EPBFYISL.js.map} +0 -0
  146. /package/dist/cli/{stats-F4NDOD7D.js.map → stats-4WB4XHBP.js.map} +0 -0
  147. /package/dist/cli/{version-LUVTWHLL.js.map → version-4SP3DLLH.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/i18n/EN.ts","../../src/i18n/zh-CN.ts","../../src/i18n/index.ts"],"sourcesContent":["import type { TranslationSchema } from \"./types.js\";\n\nexport const EN: TranslationSchema = {\n common: {\n error: \"Error\",\n warning: \"Warning\",\n loading: \"Loading...\",\n done: \"Done\",\n cancel: \"Cancel\",\n confirm: \"Confirm\",\n back: \"Back\",\n next: \"Next\",\n tool: \"tool\",\n running: \"running\",\n noTurns: \"(no turns yet)\",\n },\n cli: {\n description: \"DeepSeek-native agent framework — built for cache hits and cheap tokens.\",\n continue: \"Resume the most recently used chat session without showing the picker.\",\n setup: \"Interactive wizard — API key, MCP servers. Re-run any time to reconfigure.\",\n code: \"Code-editing chat — filesystem tools rooted at <dir> (default: cwd), coding system prompt, v4-flash baseline.\",\n chat: \"Interactive Ink TUI with live cache/cost panel.\",\n run: \"Run a single task non-interactively, streaming output.\",\n stats: \"Show usage dashboard.\",\n doctor: \"One-command health check.\",\n commit: \"Draft a commit message from the staged diff.\",\n sessions: \"List saved chat sessions, or inspect one by name.\",\n pruneSessions: \"Delete saved sessions idle ≥N days (default 90). Use --dry-run to preview.\",\n events: \"Pretty-print the kernel event-log sidecar.\",\n replay: \"Interactive Ink TUI to scrub through a transcript.\",\n diff: \"Compare two transcripts in a split-pane Ink TUI.\",\n mcp: \"Model Context Protocol helpers — discover servers, test your setup.\",\n version: \"Print Reasonix version.\",\n update: \"Check for a newer Reasonix and install it.\",\n index: \"Build (or incrementally refresh) a local semantic search index.\",\n },\n stats: {\n usageHint: \"run `reasonix chat`, `reasonix code`, or `reasonix run <task>` — every turn\",\n usageDetail: \"appends one line to the log and `reasonix stats` will roll it up.\",\n },\n run: {\n missingApiKey:\n \"DEEPSEEK_API_KEY is not set and stdin is not a TTY (cannot prompt).\\n\" +\n \"Set the env var, or run `reasonix chat` once interactively to save a key.\\n\",\n },\n sessions: {\n emptyHint:\n \"no saved sessions yet — run `reasonix chat` (sessions are auto-saved unless --no-session).\",\n listHeader: \"Saved sessions (~/.reasonix/sessions/):\",\n inspectHint: \"Inspect: reasonix sessions <name>\",\n resumeHint: \"Resume: reasonix chat --session <name>\",\n noSession: 'no session named \"{name}\" (or it\\u2019s empty).',\n lookedAt: \"looked at: {path}\",\n noIdleSessions: \"no sessions idle \\u2265{days} days. Nothing pruned.\",\n wouldPrune: \"would prune {count} session(s) idle \\u2265{days} days:\",\n dryRunHint: \"re-run without --dry-run to actually delete.\",\n prunedCount: \"pruned {count} session(s) idle \\u2265{days} days:\",\n daysInvalid: \"--days must be a positive integer (got {days}).\",\n },\n ui: {\n welcome: \"Run `reasonix` any time to start chatting — your settings are remembered.\",\n taglineChat: \"DeepSeek-native agent\",\n taglineCode: \"DeepSeek-native coding agent\",\n taglineSub: \"cache-first · flash-first\",\n startSessionHint: \"type a message to start your session\",\n inputPlaceholder: \"Ask anything... (type / for commands, @ for files)\",\n busy: \"Thinking...\",\n thinking: \"▸ thinking...\",\n undo: \"Undo\",\n undoHint: \"press u within 5s to undo\",\n applied: \"applied\",\n rejected: \"rejected\",\n noDashboard: \"Suppress the auto-launched embedded web dashboard.\",\n openDashboardHint:\n \"Open the dashboard URL in your default browser as soon as the server is ready. No-op when --no-dashboard is set.\",\n dashboardPortHint:\n \"Pin the dashboard to a fixed port (1–65535). Stable across restarts — required for SSH tunnels. Default: ephemeral.\",\n dashboardPortInvalid:\n \"▲ ignoring --dashboard-port={value} (must be an integer 1–65535) — falling back to ephemeral\",\n dashboardAutoStartFailed:\n \"▲ dashboard auto-start failed ({reason}) — try /dashboard, or pass --no-dashboard to silence\",\n systemAppendHint:\n \"Append instructions to the code system prompt. Does NOT replace the default prompt — adds after it.\",\n systemAppendFileHint:\n \"Append file contents to the code system prompt. Does NOT replace the default prompt. UTF-8, relative to cwd or absolute.\",\n resumedSession:\n '▸ resumed session \"{name}\" with {count} prior messages · /new to start fresh · /sessions to manage',\n newSession: '▸ session \"{name}\" (new) — auto-saved as you chat · /sessions to rename or delete',\n ephemeralSession: \"▸ ephemeral chat (no session persistence) — drop --no-session to enable\",\n restoredEdits:\n \"▸ restored {count} pending edit block(s) from an interrupted prior run — /apply to commit or /discard to drop.\",\n resumedPlan: \"Resumed plan · {when}{summary}\",\n tipEditBindings: {\n topic: \"edit-gate keybindings\",\n sections: [\n {\n rows: [\n { key: \"y / n\", text: \"accept or drop pending edits\" },\n {\n key: \"Shift+Tab\",\n text: \"switch review ↔ AUTO (persisted; AUTO applies instantly)\",\n },\n { key: \"u\", text: \"undo the last auto-applied batch (within the 5s banner)\" },\n ],\n },\n ],\n footer: \"Current mode shown in the bottom status bar · /keys for the full reference\",\n },\n tipMouseClipboard: {\n topic: \"mouse + clipboard\",\n sections: [\n {\n rows: [\n { key: \"drag\", text: \"select text — terminal-native, no modifier needed\" },\n {\n key: \"right-click\",\n text: \"your terminal's native menu (paste / copy on Windows Terminal etc.)\",\n },\n { key: \"wheel\", text: \"scrolls chat history (works on web/cloud/SSH terminals too)\" },\n {\n key: \"↑ / ↓\",\n text: \"prompt history (or per-line cursor in a multi-line draft) — Ctrl+P / Ctrl+N alias\",\n },\n { key: \"PgUp / PgDn\", text: \"scroll chat history (mouse wheel routes here too)\" },\n ],\n },\n ],\n footer: \"Run /keys for the full keyboard + mouse reference\",\n },\n keysReference: {\n topic: \"Reasonix keys + mouse reference\",\n sections: [\n {\n title: \"keyboard\",\n rows: [\n { key: \"Enter\", text: \"submit the prompt\" },\n { key: \"Shift+Enter\", text: \"insert a newline in the prompt\" },\n {\n key: \"↑ / ↓\",\n text: \"previous / next prompt history · cursor up / down in a multi-line draft\",\n },\n { key: \"Ctrl+P / Ctrl+N\", text: \"readline alias for ↑ / ↓\" },\n { key: \"Ctrl+A / Ctrl+E\", text: \"jump to start / end of the current line\" },\n { key: \"Ctrl+W\", text: \"delete the word before the cursor\" },\n { key: \"Ctrl+U\", text: \"clear the entire prompt buffer\" },\n { key: \"Tab\", text: \"complete @-mention · drill folder · accept slash command\" },\n { key: \"Shift+Tab\", text: \"edit-gate: toggle review ↔ AUTO mode\" },\n { key: \"Esc\", text: \"dismiss picker · abort the running model turn\" },\n { key: \"Ctrl+C\", text: \"abort the running model turn (NOT copy — see clipboard)\" },\n { key: \"PgUp / PgDn\", text: \"scroll chat history a page at a time\" },\n { key: \"End\", text: \"jump chat to the most recent line\" },\n {\n key: \"Ctrl+R\",\n text: \"toggle verbose mode — full reasoning + tool output, no head/tail elision\",\n },\n ],\n },\n {\n title: \"mouse\",\n rows: [\n { key: \"wheel\", text: \"scrolls chat history (works on web/cloud/SSH terminals too)\" },\n { key: \"drag\", text: \"selects text natively — direct copy works, no modifier\" },\n { key: \"right-click\", text: \"terminal-native (paste menu on Windows Terminal etc.)\" },\n ],\n },\n {\n title: \"copy / paste\",\n rows: [\n { key: \"select text\", text: \"drag to select — terminal-native (no modifier needed)\" },\n {\n key: \"copy\",\n text: \"Ctrl+Shift+C (Win/Linux) · Cmd+C (macOS) — or auto-copy-on-select if your terminal does it\",\n },\n { key: \"paste\", text: \"Ctrl+V or Ctrl+Shift+V (Win/Linux) · Cmd+V (macOS)\" },\n {\n key: \"bracketed paste\",\n text: \"multi-line pastes stay one block — no auto-submit on intermediate newlines\",\n },\n ],\n },\n {\n title: \"edit-gate (code mode)\",\n rows: [\n { key: \"y / n\", text: \"accept or drop pending edits in the review modal\" },\n { key: \"Shift+Tab\", text: \"toggle review ↔ AUTO (persisted across sessions)\" },\n { key: \"u\", text: \"undo the last auto-applied batch (within the 5s banner)\" },\n ],\n },\n ],\n footer:\n \"Wheel scrolls chat on most terminals (web/cloud/SSH included) — SGR mouse tracking is on by default and stays out of the way of native drag-select and right-click. Pass --no-mouse to opt out.\",\n },\n tipShownOnce: \"shown once\",\n modelOverride: \"override the default model\",\n noSession: \"disable session persistence for this run\",\n noMouseHint: \"disable SGR mouse tracking; restores native drag-select and right-click\",\n noProxyHint: \"ignore HTTPS_PROXY / HTTP_PROXY for this run; go direct\",\n resumeHint: \"force-resume the named session (even if idle)\",\n newHint: \"force a fresh session (ignore --session / --continue)\",\n transcriptHint: \"path to write the JSONL transcript\",\n budgetHint: \"session USD cap — warns at 80%, refuses next turn at 100%\",\n modelIdHint: \"DeepSeek model id (e.g. deepseek-v4-flash)\",\n systemPromptHint: \"override the default system prompt\",\n effortHint: \"reasoning effort — low|medium|high|max\",\n sessionNameHint: \"session name (default: 'default')\",\n ephemeralHint: \"disable session persistence for this run\",\n mcpSpecHint: \"MCP server spec (repeatable)\",\n mcpPrefixHint: \"prefix MCP tool names with this string\",\n noConfigHint: \"ignore ~/.reasonix/config.json for this run\",\n effortHintShort: \"reasoning effort — low|medium|high|max\",\n budgetHintShort: \"session USD cap\",\n transcriptHintShort: \"JSONL transcript path\",\n mcpSpecHintShort: \"MCP server spec (repeatable)\",\n mcpPrefixHintShort: \"MCP tool name prefix\",\n dryRunHint: \"show what would be installed without actually installing\",\n rebuildHint: \"rebuild the index from scratch\",\n embedModelHint: \"embedding model name\",\n projectDirHint: \"project root directory\",\n ollamaUrlHint: \"Ollama server URL\",\n skipPromptsHint: \"skip confirmation prompts\",\n verboseHint: \"show full session metadata\",\n pruneDaysHint: \"delete sessions idle this many days or more (default 90)\",\n pruneDryRunHint: \"list what would be deleted without removing anything\",\n eventTypeHint: \"filter by event type\",\n eventSinceHint: \"start from this event id\",\n eventTailHint: \"show only the last N events\",\n jsonHint: \"output as JSON\",\n projectionHint: \"show projected state at each event\",\n printHint: \"print to stdout instead of TUI\",\n headHint: \"show only the first N events\",\n tailHint: \"show only the last N events\",\n mdReportHint: \"write a markdown diff report to this path\",\n printHintTable: \"print a table to stdout\",\n tuiHint: \"open the interactive TUI\",\n labelAHint: \"label for the left pane\",\n labelBHint: \"label for the right pane\",\n mcpListDescription: \"browse the MCP registry (official → smithery → local fallback)\",\n mcpInspectDescription: \"inspect an MCP server spec (tools, resources, prompts)\",\n mcpSearchDescription: \"search the MCP registry for servers matching a query\",\n mcpInstallDescription: \"install an MCP server by name (writes its spec to your config)\",\n mcpBrowseDescription: \"interactive marketplace browser — type to filter, enter to install\",\n mcpLocalHint: \"show only the bundled offline catalog\",\n mcpRefreshHint: \"bypass the 24h cache and refetch\",\n mcpLimitHint: \"max entries to show\",\n mcpPagesHint: \"eagerly load this many pages (default 1)\",\n mcpAllHint: \"load every page (slow on first run)\",\n mcpMaxPagesHint: \"cap how many pages to walk while searching (default 20)\",\n jsonHintCatalog: \"output as JSON\",\n jsonHintReport: \"output the inspection report as JSON\",\n modelOverrideFlash: \"override the model (default: deepseek-v4-flash)\",\n skipConfirmHint: \"skip the confirmation prompt\",\n yoloHint:\n \"auto-approve plan checkpoints for this invocation (equivalent to editMode=yolo without mutating config)\",\n },\n code: {\n workspaceConflict:\n \"⚠ workspace contains another agent platform's files ({platforms}). Reasonix Code may read them as project content; relaunch with --dir <your-project> if that's not what you want.\\n\",\n systemAppendEmpty: \"--system-append is empty — no prompt text will be appended\\n\",\n systemAppendFileReadError:\n 'Error: cannot read --system-append-file \"{filePath}\": {errorDetails}\\n',\n },\n slash: {\n help: { description: \"show the full command reference\" },\n status: { description: \"current model, flags, context, session\" },\n effort: {\n description:\n \"reasoning_effort cap (low|medium|high|max); high is the safe default for vLLM/Azure\",\n argsHint: \"<low|medium|high|max>\",\n },\n model: { description: \"switch DeepSeek model id\", argsHint: \"<id>\" },\n models: { description: \"list available models fetched from DeepSeek /models\" },\n theme: {\n description: \"show or persist the terminal theme preference. Bare opens picker.\",\n argsHint: \"[auto|dark|light|midnight|deep-blue|high-contrast]\",\n },\n language: {\n description: \"switch the runtime language\",\n argsHint: \"<EN|zh-CN>\",\n success: \"Language switched to English.\",\n unsupported: \"Unsupported language code: {code}. Supported: {supported}.\",\n },\n budget: {\n description:\n \"session USD cap — warns at 80%, refuses next turn at 100%. Off by default. /budget alone shows status\",\n argsHint: \"[usd|off]\",\n },\n mcp: { description: \"list MCP servers + tools attached to this session\" },\n resource: {\n description: \"browse + read MCP resources (no arg → list URIs; <uri> → fetch contents)\",\n argsHint: \"[uri]\",\n },\n prompt: {\n description: \"browse + fetch MCP prompts (no arg → list names; <name> → render prompt)\",\n argsHint: \"[name]\",\n },\n memory: {\n description: \"show / manage pinned memory (REASONIX.md + ~/.reasonix/memory)\",\n argsHint: \"[list|show <name>|forget <name>|clear <scope> confirm]\",\n },\n skill: {\n description: \"list / run user skills (project + custom + global + builtin)\",\n argsHint: \"[list|paths|show <name>|<name> [args]]\",\n },\n hooks: {\n description: \"list active hooks (settings.json under .reasonix/) · reload re-reads from disk\",\n argsHint: \"[reload]\",\n },\n permissions: {\n description:\n \"show / edit shell allowlist (builtin read-only · per-project: ~/.reasonix/config.json)\",\n argsHint: \"[list|add <prefix>|remove <prefix|N>|clear confirm]\",\n },\n dashboard: {\n description: \"launch the embedded web dashboard (127.0.0.1, token-gated)\",\n argsHint: \"[stop]\",\n },\n update: { description: \"show current vs latest version + the shell command to upgrade\" },\n stats: {\n description:\n \"cross-session cost dashboard (today / week / month / all-time · cache hit · vs Claude)\",\n },\n cost: {\n description:\n \"bare → last turn's spend (Usage card); with text → estimate cost of sending it next (worst-case + likely-cache)\",\n argsHint: \"[text]\",\n },\n doctor: { description: \"health check (api / config / api-reach / index / hooks / project)\" },\n context: { description: \"show context-window breakdown (system / tools / log / input)\" },\n retry: { description: \"truncate & resend your last message (fresh sample)\" },\n compact: {\n description:\n \"narrow oversized tool results + tool-call args in the log; cap at tokens, default 4000\",\n argsHint: \"[tokens]\",\n },\n cwd: {\n description:\n \"switch the workspace root mid-session — re-points fs / shell / memory tools, reloads project hooks, refreshes the at-mention walker\",\n argsHint: \"[path]\",\n },\n stop: { description: \"abort the current model turn (typed alternative to Esc)\" },\n feedback: { description: \"open a GitHub issue with diagnostic info copied to clipboard\" },\n about: { description: \"project info — version, website, repo, license\" },\n keys: { description: \"keyboard + mouse + copy/paste reference\" },\n plans: { description: \"list this session's active + archived plans, newest first\" },\n replay: {\n description: \"load an archived plan as a read-only Time Travel snapshot (default: newest)\",\n argsHint: \"[N]\",\n },\n sessions: { description: \"list saved sessions (current marked with ▸)\" },\n title: { description: \"ask the model to rename this session from the conversation\" },\n qq: {\n description:\n \"connect, inspect, or disconnect the QQ channel for this session (first connect guides App ID / App Secret setup)\",\n argsHint: \"[connect [appId appSecret [sandbox]]|status|disconnect]\",\n },\n setup: { description: \"reminds you to exit and run `reasonix setup`\" },\n semantic: {\n description: \"show semantic_search status — built? Ollama installed? how to enable\",\n },\n clear: { description: \"clear visible scrollback only (log/context kept)\" },\n new: { description: \"start a fresh conversation (clear context + scrollback)\" },\n loop: {\n description:\n \"auto-resubmit <prompt> every <interval> until you type something / Esc / /loop stop\",\n argsHint: \"<5s..6h> <prompt> · stop · (no args = status)\",\n },\n exit: { description: \"quit the TUI\" },\n init: {\n description:\n \"scan the project and synthesize a baseline REASONIX.md (model writes; review with /apply). `force` overwrites an existing file.\",\n argsHint: \"[force]\",\n },\n apply: {\n description:\n \"commit pending edit blocks to disk (no arg → all; `1`, `1,3`, or `1-4` → that subset, rest stay pending)\",\n argsHint: \"[N|N,M|N-M]\",\n },\n discard: {\n description: \"drop pending edit blocks without writing (no arg → all; indices → that subset)\",\n argsHint: \"[N|N,M|N-M]\",\n },\n walk: {\n description:\n \"step through pending edits one block at a time (git-add-p style: y/n per block, a apply rest, A flip AUTO)\",\n },\n undo: { description: \"roll back the last applied edit batch\" },\n history: { description: \"list every edit batch this session (ids for /show, undone markers)\" },\n show: {\n description: \"dump a stored edit diff (omit id for newest non-undone)\",\n argsHint: \"[id]\",\n },\n commit: { description: \"git add -A && git commit -m ...\", argsHint: '\"msg\"' },\n checkpoint: {\n description:\n \"snapshot every file the session has touched (Cursor-style internal store, not git). /checkpoint alone lists.\",\n argsHint: \"[name|list|forget <id>]\",\n },\n restore: {\n description: \"roll back files to a named checkpoint (see /checkpoint list)\",\n argsHint: \"<name|id>\",\n },\n plan: {\n description: \"toggle read-only plan mode (writes bounced until submit_plan + approval)\",\n argsHint: \"[on|off]\",\n },\n mode: {\n description:\n \"edit-gate: review (queue) · auto (apply+undo) · yolo (apply+auto-shell). Shift+Tab cycles.\",\n argsHint: \"[review|auto|yolo]\",\n },\n jobs: { description: \"list background jobs started by run_background\" },\n kill: {\n description: \"stop a background job by id (SIGTERM → SIGKILL after grace)\",\n argsHint: \"<id>\",\n },\n logs: {\n description: \"tail a background job's output (default last 80 lines)\",\n argsHint: \"<id> [lines]\",\n },\n btw: {\n description:\n \"ask a quick side question — answered from a blank slate, never added to the conversation context\",\n argsHint: \"<question>\",\n },\n \"search-engine\": {\n description:\n \"switch web search backend — bing (default, works from CN without proxy), searxng (self-hosted), metaso (free 100/d), tavily (free 1000/mo), perplexity (AI-native), or exa (AI-native)\",\n argsHint: \"<bing|searxng|metaso|tavily|perplexity|exa> [<key>]\",\n },\n },\n wizard: {\n languageTitle: \"Choose your language\",\n languageSubtitle: \"Detected from your system locale. Switch later via /language.\",\n welcomeTitle: \"Welcome to Reasonix.\",\n apiKeyPrompt: \"Paste your DeepSeek API key to get started.\",\n apiKeyGetOne: \"Get one at: https://platform.deepseek.com/api_keys\",\n apiKeySavedLocally: \"Saved locally to {path}\",\n apiKeyInputLabel: \"key › \",\n apiKeyInvalid: \"Key looks too short — paste the full token (16+ chars, no spaces).\",\n apiKeyChecking: \"Checking API key…\",\n apiKeyRejected:\n \"DeepSeek rejected this API key. Paste a valid key, or press Esc to cancel setup.\",\n apiKeyCheckFailed:\n \"Could not verify this API key right now ({message}). Check your network or try again.\",\n apiKeyPreview: \"preview: {redacted}\",\n themeTitle: \"Choose a theme\",\n themeSubtitle: \"Preview updates live as you navigate. Change later with /theme.\",\n themeSampleHeading: \"Sample\",\n themeFooter: \"[↑↓] navigate · [Enter] confirm · [Esc] cancel\",\n themeCaption: {\n dark: \"Cool dark tones (default)\",\n light: \"Clean light mode\",\n midnight: \"Tokyo Night palette\",\n \"deep-blue\": \"Deep blue on black\",\n \"high-contrast\": \"Accessibility\",\n },\n reviewLabelTheme: \"Theme\",\n mcpTitle: \"Which MCP servers should Reasonix wire up for you?\",\n mcpUserArgsHint: \"(you'll provide {arg})\",\n mcpFooterMulti:\n \"[↑↓] navigate · [Space] toggle · [Enter] confirm · [Esc] cancel · empty = skip\",\n mcpArgsTitle: \"Configure {name}\",\n mcpArgsDirMissing: \"Directory {path} doesn't exist.\",\n mcpArgsDirCreateHint: \"[Y/Enter] create it (mkdir -p) · [N/Esc] enter a different path\",\n mcpArgsDirCreateFailed: \"Couldn't create {path}: {message}\",\n mcpArgsRequiredParam: \"Required parameter: \",\n mcpArgsEmpty: \"{name} needs a value — got an empty string.\",\n mcpArgsNotADir: \"{path} exists but is not a directory.\",\n reviewTitle: \"Ready to save\",\n reviewLabelApiKey: \"API key\",\n reviewLabelLanguage: \"Language\",\n reviewLabelMcp: \"MCP\",\n reviewMcpNone: \"(none)\",\n reviewMcpServers: \"{count} server(s)\",\n reviewSavesTo: \"Saves to {path}\",\n reviewSaveError: \"Could not save config: {message}\",\n reviewFooter: \"[Enter] save · [Esc] cancel\",\n savedTitle: \"▸ Saved.\",\n savedShellHint:\n \"Shell commands the model wants to run ask each time — pick `allow always` on the prompt to whitelist that exact command for this project. No global allow-all flag by design.\",\n savedFooter: \"[Enter] to exit\",\n selectFooter: \"[↑↓] navigate · [Enter] confirm · [Esc] cancel\",\n stepCounter: \"Step {step}/{total} · \",\n exitHint: \"/exit to abort\",\n apiKeyPlaceholder: \"sk-...\",\n themeSampleReasoning: \"Reasoning\",\n },\n themePicker: {\n header: \"Theme\",\n footer: \"↑↓ pick · ⏎ confirm · esc cancel\",\n currentPref: \"current preference\",\n activeNow: \"active now\",\n autoDesc: \"use REASONIX_THEME or default\",\n },\n planFlow: {\n approveCardTitle: \"Approve plan\",\n approveCardMetaRight: \"awaiting\",\n openQuestionsBanner:\n \"▲ the plan flags open questions or risks — pick {refine} to write concrete answers before the model moves on.\",\n openQuestionsHeader: \"Open questions / risks\",\n truncatedBodyMore: \"… {n} more line above in scrollback\",\n truncatedBodyMorePlural: \"… {n} more lines above in scrollback\",\n picker: {\n accept: \"accept\",\n acceptHint: \"run it now, in order\",\n refine: \"refine\",\n refineHint: \"give the agent more guidance, draft a new plan\",\n revise: \"revise\",\n reviseHint: \"edit the plan inline before running (skip / reorder steps)\",\n reject: \"reject\",\n rejectHint: \"discard, agent will retry from scratch\",\n },\n refineFooter: \"⏎ send · esc return to picker\",\n refineQuestionsHeading: \"Answer these or describe the change you want:\",\n modes: {\n approve: {\n title: \"approving — any last instructions?\",\n hint: \"Answer questions the plan raised, add constraints, or just press Enter to approve as-is.\",\n blankHint: \" (Enter with blank = approve without extra instructions.)\",\n },\n refine: {\n title: \"refining — what should the model change?\",\n hint: \"Describe what's wrong or missing, or answer questions the plan raised.\",\n blankHint: \" (Enter with blank = let the model pick safe defaults for any open questions.)\",\n },\n reject: {\n title: \"rejecting — tell the model why (optional)\",\n hint: \"Say what the model got wrong about your goal, or what you actually want instead.\",\n blankHint:\n \" (Enter with blank = cancel without explanation; the model will ask what you want.)\",\n },\n \"checkpoint-revise\": {\n title: \"revising — what should change before the next step?\",\n hint: \"Scope change, skip steps, alternative approach — the model adjusts the remaining plan.\",\n blankHint: \" (Enter with blank = continue with the current plan.)\",\n },\n \"choice-custom\": {\n title: \"custom answer — type whatever fits\",\n hint: \"Free-form reply. The model reads it verbatim and proceeds — no need to match the listed options.\",\n blankHint: \" (Enter with blank = ask the model what you actually want.)\",\n },\n },\n checkpoint: {\n title: \"Checkpoint — step done\",\n continue: \"Continue — run the next step\",\n continueHint: \"Model resumes with the next step.\",\n finish: \"Finish — summarize and close\",\n finishHint: \"Model records the final step and summarizes the completed plan.\",\n revise: \"Revise — give feedback before the next step\",\n reviseHint: \"Stay paused, type guidance; model adjusts the remaining plan.\",\n stop: \"Stop — end the plan here\",\n stopHint: \"Model summarizes what was done and ends.\",\n },\n stepList: {\n counter: \"{total} steps\",\n counterSingular: \"{total} step\",\n counterDone: \"{done}/{total} done ({pct}%) · {total} steps\",\n counterDoneSingular: \"{done}/{total} done ({pct}%) · {total} step\",\n },\n noPlanSummary: \"No plan body submitted yet.\",\n detailCollapsedHint: \"Ctrl+P expands full plan details.\",\n detailExpandedHint: \"Ctrl+P collapses details.\",\n detailHeader: \"Plan details\",\n detailWindow: \"showing lines {start}-{end} of {total}\",\n detailScrollHint: \"PgUp/PgDn scroll details · Home/End jump\",\n reviseTitle: \"Revise plan\",\n reviseSteps: \"{count} steps\",\n reviseFooter:\n \"\\u2191\\u2193 focus \\u00b7 space toggle skip \\u00b7 k/j move \\u00b7 \\u23ce accept \\u00b7 esc cancel\",\n riskMed: \" med\",\n riskHigh: \" high\",\n completeMsg: \"\\u25b8 plan complete \\u2014 all {total} step{s} done \\u00b7 archived\",\n },\n app: {\n walkCancelledRemaining: \"▸ walk cancelled — {count} block(s) still pending.\",\n walkCancelled: \"▸ walk cancelled.\",\n editModeYolo:\n \"▸ edit mode: YOLO — edits AND shell commands auto-run. /undo still rolls back edits. Use carefully.\",\n editModeAuto:\n \"▸ edit mode: AUTO — edits apply immediately; press u within 5s to undo (space pauses the timer). Shell commands still ask.\",\n editModeReview: \"▸ edit mode: review — edits queue for /apply (or y) / /discard (or n)\",\n rejectedEdit: \"▸ rejected edit to {path}{context}\",\n autoApprovingRest: \"▸ auto-approving remaining edits for this turn\",\n flippedAutoSession: \"▸ flipped to AUTO mode for the rest of the session (persisted)\",\n flippedAutoWalk: \"▸ flipped to AUTO mode — future edits will apply immediately. Walk exited.\",\n dashboardStopped: \"▸ dashboard stopped.\",\n notedMemory: \"▸ noted ({scope}) — {verb} {path}\",\n notedScopeProject: \"project\",\n notedScopeGlobal: \"global\",\n notedVerbCreated: \"created\",\n notedVerbAppended: \"appended to\",\n memoryWriteFailed: \"# memory write failed\",\n verboseOn: \"▸ verbose mode on — full reasoning + tool output\",\n verboseOff: \"▸ verbose mode off — head/tail elision restored\",\n commandFailed: \"! command failed\",\n steerInjected: \"▸ steering queued — will be added after the current step\",\n steerCommandRejected: \"▸ commands are disabled while steering a busy turn\",\n btwUsage: \"▸ /btw <question> — ask a side question without polluting the conversation context.\",\n btwHeader: \"≫ btw\",\n btwFailed: \"/btw failed\",\n restoreCodeOnly: \"▸ /restore is code-mode only\",\n hookUserPromptSubmit: \"UserPromptSubmit hook\",\n hookStop: \"Stop hook\",\n atMentions: \"▸ @mentions: {parts}\",\n atUrl: \"▸ @url: {parts}\",\n atUrlFailed: \"@url expansion failed\",\n sessionTitleNoSession: \"▸ no persisted session is active, so there is nothing to rename.\",\n sessionTitleNoContent: \"▸ not enough conversation content to name this session yet.\",\n sessionTitleNoTitle: \"▸ the model did not return a usable session title.\",\n sessionTitleUpdated: '▸ session title updated: \"{title}\"',\n sessionTitleRenameFailed: '▸ could not rename the session for title \"{title}\".',\n sessionTitleRenamed: '▸ session renamed to \"{name}\" — {title}',\n sessionTitleAutoRenamed: '▸ auto-named session \"{name}\" — {title}',\n workspaceSwitched: \"▸ workspace switched to {root}\",\n semanticRepointed: \"▸ semantic_search re-pointed at {root}\",\n semanticDisabledForRoot: \"▸ semantic_search disabled (no compatible index in {root})\",\n semanticRebootstrapFailed: \"▸ semantic_search re-bootstrap failed: {reason}\",\n denied: \"▸ denied: {cmd}{context}\",\n alwaysAllowed: '▸ always allowed \"{prefix}\" for {dir}',\n runningCommand: \"▸ running: {cmd}\",\n startingBackground: \"▸ starting (background): {cmd}\",\n checkpointSaved:\n \"⛁ checkpoint saved · {id} · {count} file{s} · /restore {id} to roll back this step\",\n continuingAfter: \"▸ continuing after {label}{counter}\",\n planStoppedAt: \"▸ plan stopped at {label}{counter}\",\n revisingAfter: \"▸ revising after {label} — {feedback}\",\n historyScrollHint: \" ↑ reading history · End / PgDn returns to bottom · ↓ advances one line\",\n editHistoryTitle: \"Edit history (oldest first):\",\n editHistoryNoCodeMode: \"not in code mode\",\n editHistoryNoEdits: \"no edits recorded this session yet\",\n editHistoryNoShowId:\n \"usage: /show [id] [path] (omit id for newest; path from the per-file summary)\",\n editHistoryIdNotFound: \"no edit #{id} — run /history to see valid ids\",\n editHistoryLookupFailed: \"unexpected: history lookup failed\",\n editHistoryBatchNoFile: 'batch #{id} doesn\\'t include \"{path}\" — files in this batch: {files}',\n editHistoryNoEdits2: \"no edits recorded this session — /history is empty\",\n editHistoryStatusApplied: \"applied\",\n editHistoryStatusPartial: \"PARTIAL\",\n editHistoryStatusUndone: \"UNDONE\",\n editHistoryHelpShow:\n \"/show <id> \\u2192 per-file summary \\u00b7 /show <id> <path> \\u2192 full diff of one file\",\n editHistoryHelpUndo:\n \"/undo \\u2192 newest non-undone \\u00b7 /undo <id> [path] \\u2192 target a specific batch or file\",\n editHistoryAlreadyReverted: \"(already reverted \\u2014 /history shows the batch-level status)\",\n editHistoryRevertFile: \"/undo {id} {path} \\u2192 revert just this file\",\n mcpFailed: \"MCP {name} failed\",\n mcpWarn: \"MCP {name} warn\",\n unknownTheme: \"unknown theme: {name}\\navailable: {choices}\",\n themeSaved: \"theme saved: {name}\\nactive on next launch: {active}\",\n noPendingEdits:\n \"nothing pending \\u2014 the model hasn\\u2019t proposed edits since the last /apply or /discard.\",\n noMatchedApply:\n \"\\u25b8 no edits matched those indices \\u2014 nothing applied. Use /apply with no args to commit them all.\",\n noPendingDiscard: \"nothing pending to discard.\",\n noMatchedDiscard: \"\\u25b8 no edits matched those indices \\u2014 nothing discarded.\",\n blocksStillPending:\n \"\\u25b8 {count} edit block(s) still pending \\u2014 /apply or /discard to clear them.\",\n nothingWritten: \". Nothing was written to disk.\",\n discardedCount: \"\\u25b8 discarded {count} pending edit block(s)\",\n noEventsFor: 'no events for session \"{name}\"',\n lookedAtFile: \"looked at: {path}\",\n sidecarHint:\n \"(sessions auto-create the sidecar on first turn \\u2014 has this session run yet?)\",\n },\n hooks: {\n head: \"hook {tag} `{cmd}` {decision}{truncTag}\",\n headWithDetail: \"hook {tag} `{cmd}` {decision}{truncTag}: {detail}\",\n truncated: \" (output truncated at 256KB)\",\n decisionBlock: \"block\",\n decisionWarn: \"warn\",\n decisionTimeout: \"timeout\",\n decisionError: \"error\",\n },\n summary: {\n status: \"summarizing what was gathered…\",\n hallucinatedFallback:\n \"(model emitted fake tool-call markup instead of a prose summary — try /retry with a narrower question, or /think to inspect R1's reasoning)\",\n failedAfterReason:\n \"{label} and the fallback summary call failed: {message}. Run /clear and retry with a narrower question, or raise --max-tool-iters.\",\n },\n loop: {\n budgetExhausted:\n \"session budget exhausted — spent ${spent} ≥ cap ${cap}. Bump the cap with /budget <usd>, clear it with /budget off, or end the session.\",\n budget80Pct: \"▲ budget 80% used — ${spent} of ${cap}. Next turn or two likely trips the cap.\",\n proArmed: \"⇧ /pro armed — this turn runs on deepseek-v4-pro (one-shot · disarms after turn)\",\n toolUploadStatus: \"tool result uploaded · model thinking before next response…\",\n turnStartFoldStatus: \"turn start: context approaching limit, compacting history…\",\n turnStartFolded:\n \"turn start: request ~{estimate}/{ctxMax} tokens ({pct}%) — compacted {beforeMessages} messages → {afterMessages}. Sending.\",\n harvestStatus: \"extracting plan state from reasoning…\",\n repeatToolCallWarning:\n \"Caught a repeated tool call — let the model see the issue and retry with a different approach.\",\n stormStuck:\n \"Stopped a stuck retry loop — the model kept calling the same tool with identical args after a self-correction nudge. Try /retry, rephrase, or rule out the underlying blocker.\",\n stormSuppressed: \"Suppressed {count} repeated tool call(s) — same name + args fired 3+ times.\",\n compactingHistoryStatus: \"compacting history{aggressiveTag}…\",\n aggressiveTag: \" (aggressive)\",\n foldedHistory:\n \"context {before}/{ctxMax} ({pct}%) — folded {beforeMessages} messages → {afterMessages} (summary {summaryChars} chars). Continuing.\",\n aggressivelyFoldedHistory:\n \"context {before}/{ctxMax} ({pct}%) — aggressively folded {beforeMessages} messages → {afterMessages} (summary {summaryChars} chars). Continuing.\",\n forcingSummary:\n \"context {before}/{ctxMax} ({pct}%) — forcing summary from what was gathered. Run /compact, /clear, or /new to reset.\",\n },\n errors: {\n contextOverflow:\n \"Context overflow (DeepSeek 400): session history is {requested}, past the model's prompt limit (V4: 1M tokens; legacy chat/reasoner: 131k). Usually a single tool result grew too big. Reasonix caps new tool results at 8k tokens and auto-heals oversized history on session load — a restart often clears it. If it still overflows, run /new to start fresh, or open /sessions and press [d] to delete this session.\",\n contextOverflowTooMany: \"too many tokens\",\n auth401:\n \"Authentication failed (DeepSeek 401): {inner}. Your API key is rejected. Fix with `reasonix setup` or `export DEEPSEEK_API_KEY=sk-...`. Get one at https://platform.deepseek.com/api_keys.\",\n balance402:\n \"Out of balance (DeepSeek 402): {inner}. Top up at https://platform.deepseek.com/top_up — the panel header shows your balance once it's non-zero.\",\n badparam422: \"Invalid parameter (DeepSeek 422): {inner}\",\n badrequest400: \"Bad request (DeepSeek 400): {inner}\",\n concurrency429:\n \"DeepSeek concurrency limit hit (429): {inner}. The account has too many in-flight requests (cap: 500 for v4-pro, 2500 for v4-flash, summed across API keys account-wide). Usually means another Reasonix process is sharing the same key, or a parallel subagent fan-out overshot. Wait a few seconds and retry, reduce parallelism, or request a higher cap at https://platform.deepseek.com.\",\n deepseek5xxHead:\n \"DeepSeek service unavailable ({status}) — this is a DeepSeek-side problem, not Reasonix. Already retried 4× with backoff.\",\n deepseek5xxReachable:\n \" DeepSeek's main API answered our health check, but /chat/completions is failing — partial outage on their side.\",\n deepseek5xxUnreachable:\n \" DeepSeek API is unreachable from your network — could be a wider DS outage or a local network issue.\",\n deepseek5xxActionNetwork:\n \" Try: (1) check your network, (2) wait 30s and retry, (3) status page: https://status.deepseek.com.\",\n deepseek5xxActionRetry:\n \" Try: (1) wait 30s and retry, (2) /model to switch model, (3) status page: https://status.deepseek.com.\",\n innerNoMessage: \"(no message)\",\n reasonAborted: \"[aborted by user (Esc) — summarizing what I found so far]\",\n reasonContextGuard:\n \"[context budget running low — summarizing before the next call would overflow]\",\n reasonStuck:\n \"[stuck on a repeated tool call — explaining what was tried and what's blocking progress]\",\n labelAborted: \"aborted by user\",\n labelContextGuard: \"context-guard triggered (prompt > 80% of window)\",\n labelStuck: \"stuck (repeated tool call suppressed by storm-breaker)\",\n },\n handlers: {\n basic: {\n newInfo:\n \"▸ new conversation — dropped {count} message(s) from context. Same session, fresh slate.\",\n newInfoArchived:\n '▸ new conversation — dropped {count} message(s) from context. Prior transcript archived as \"{archived}\" (visible under Sessions).',\n newInfoSystemReloaded:\n \" · REASONIX.md / project memory reloaded (next turn pays one cache miss)\",\n helpTitle: \"Commands:\",\n helpShellTitle: \"Shell shortcut:\",\n helpShell: \" !<cmd> run <cmd> in the sandbox root; output goes into\",\n helpShellDetail:\n \" the conversation so the model sees it next turn.\",\n helpShellConsent:\n \" No allowlist gate — user-typed = explicit consent.\",\n helpShellExample: \" Example: !git status !ls src/ !npm test\",\n helpShellGateTitle: \"Model-invoked shell commands (per-call approval):\",\n helpShellGate:\n \" ↑↓ + ⏎ each call shows a prompt with `allow once` / `allow always`\",\n helpShellGateDetail:\n \" / `deny`. Pick `allow always` to whitelist that exact\",\n helpShellGatePolicy:\n \" command prefix for this project. No global allow-all flag.\",\n helpMemoryTitle: \"Quick memory:\",\n helpMemoryPin:\n \" #<note> append <note> to <project>/REASONIX.md (committable).\",\n helpMemoryPinEx:\n \" Example: #findByEmail must be case-insensitive\",\n helpMemoryGlobal:\n \" #g <note> append <note> to ~/.reasonix/REASONIX.md (global, never committed).\",\n helpMemoryGlobalEx: \" Example: #g always run pnpm not npm\",\n helpMemoryPinBoth:\n \" Both pin into every future session's prefix. Faster than /memory.\",\n helpMemoryEscape:\n \" Use `\\\\#text` to send a literal `#text` to the model.\",\n helpFileTitle: \"File references (code mode):\",\n helpFile: \" @path/to/file inline file content under [Referenced files] on send.\",\n helpFilePicker:\n \" Type `@` to open the picker (↑↓ navigate, Tab/Enter pick).\",\n helpUrlTitle: \"URL references:\",\n helpUrl:\n \" @https://example.com fetch the URL, strip HTML, inline under [Referenced URLs].\",\n helpUrlCache:\n \" Same URL twice in one session fetches once (in-mem cache).\",\n helpUrlPunct:\n \" Trailing sentence punctuation (./,/)) is stripped automatically.\",\n helpSessionsTitle: \"Sessions (auto-enabled by default, named 'default'):\",\n helpSessionCustom: \" reasonix chat --session <name> use a different named session\",\n helpSessionNone: \" reasonix chat --no-session disable persistence for this run\",\n retryNone: \"nothing to retry — no prior user message in this session's log.\",\n retryInfo: '▸ retrying: \"{preview}\"',\n loopTuiOnly: \"/loop is only available in the interactive TUI (not in run/replay).\",\n loopStopped: \"▸ loop stopped.\",\n loopNoActive: \"no active loop to stop.\",\n loopNoActiveHint:\n \"no active loop. Start one with `/loop <interval> <prompt>` (e.g. /loop 30s npm test).\\nCancels on: /loop stop · Esc · /clear /new · any user-typed prompt.\",\n loopStarted:\n '▸ loop started — re-submitting \"{prompt}\" every {duration}. Type anything (or /loop stop) to cancel.',\n keysNeedsTui: \"/keys needs a TUI context (postKeys wired).\",\n aboutHeader: \"Reasonix v{version} — a cache-first DeepSeek coding agent\",\n aboutWebsiteLabel: \"Website\",\n aboutRepoLabel: \"GitHub \",\n aboutLicenseLabel: \"License\",\n unknownCommand: \"unknown command: /{cmd} — did you mean {list}?\",\n unknownCommandShort: \"unknown command: /{cmd} (try /help)\",\n },\n sessions: {\n titleUnavailable: \"/title is only available in an active persisted TUI session.\",\n titleStarted: \"▸ naming session…\",\n titleFailed: \"▸ session title failed: {reason}\",\n },\n qq: {\n unavailable: \"/qq is not available in this session.\",\n connecting: \"QQ: connecting…\",\n connectFailed: \"QQ connect failed: {reason}\",\n disconnecting: \"QQ: disconnecting…\",\n disconnectFailed: \"QQ disconnect failed: {reason}\",\n usage: \"Usage: /qq connect [appId appSecret [sandbox]] | /qq status | /qq disconnect\",\n promptAppId:\n \"QQ setup: enter your QQ Open Platform App ID, then press Enter. Type /cancel to abort.\",\n promptAppSecret:\n \"QQ setup: enter your QQ Open Platform App Secret, then press Enter. Type /cancel to abort.\",\n setupWaitingAppId: \"waiting for App ID\",\n setupWaitingAppSecret: \"waiting for App Secret\",\n setupCancelled: \"QQ setup cancelled.\",\n credentialsRequired: \"QQ App ID and App Secret are required.\",\n connected: \"QQ connected in {mode} mode. It will auto-start on future launches.\",\n alreadyConnected: \"QQ is already connected in {mode} mode. Auto-start is enabled.\",\n disconnected: \"QQ disconnected. Auto-start is disabled.\",\n status:\n \"QQ: {connected}, auto-start {enabled}, credentials {configured}, appId {appId}, {sandbox}, access {access}, current mode {mode}.\",\n statusSetup: \"QQ: setup in progress — {step}\",\n stateConnected: \"connected\",\n stateDisconnected: \"disconnected\",\n stateEnabled: \"enabled\",\n stateDisabled: \"disabled\",\n stateConfigured: \"configured\",\n stateNotConfigured: \"not configured\",\n sandbox: \"sandbox\",\n production: \"production\",\n none: \"none\",\n modeChat: \"chat\",\n modeCode: \"code\",\n accessOwner: \"owner {owner}\",\n accessOwnerWithAllowlist: \"owner {owner}, allowlist {count}\",\n accessAllowlist: \"allowlist {count}\",\n accessRuntime: \"first-sender (runtime only, {owner})\",\n accessOpen: \"open (unbound)\",\n lockAlreadyRunning:\n \"QQ channel is already running in process {pid}. Stop that process before starting another QQ channel.\",\n unauthorizedMessage:\n \"QQ ignored message from unauthorized openid {openid}. Current access: {access}.\",\n runtimeBound:\n \"QQ temporarily bound this run to first sender {openid}. Set `qq.ownerOpenId` in config to persist access.\",\n missingAppId: \"QQ App ID is required. Run `/qq connect` to configure.\",\n missingAppSecret: \"QQ App Secret is required. Run `/qq connect` to configure.\",\n authFailed: \"QQ bot authentication failed — check your App ID and App Secret.\",\n readyTimeout: \"QQ bot did not receive READY within 15s — check your App ID and App Secret.\",\n },\n admin: {\n doctorNeedsTui: \"/doctor needs a TUI context (postDoctor wired).\",\n doctorRunning: \"⚕ Doctor — running health checks…\",\n hooksReloadUnavailable:\n \"/hooks reload is not available in this context (no reload callback wired).\",\n hooksReloaded: \"▸ reloaded hooks · {count} active\",\n hooksUsage:\n \"usage: /hooks list active hooks\\n /hooks reload re-read settings.json files\",\n hooksNone: \"no hooks configured.\",\n hooksDropHint: \"drop a settings.json with a `hooks` key into either of:\",\n hooksProject: \" · {path} (project)\",\n hooksProjectFallback: \" · <project>/.reasonix/settings.json (project)\",\n hooksGlobal: \" · {path} (global)\",\n hooksEvents: \"events: PreToolUse, PostToolUse, UserPromptSubmit, Stop\",\n hooksExitCodes: \"exit 0 = pass · exit 2 = block (Pre*) · other = warn\",\n hooksLoaded: \"▸ {count} hook(s) loaded\",\n hooksSources: \"sources: project={project} · global={global}\",\n updateCurrent: \"current: reasonix {version}\",\n updateLatestPending: \"latest: (not yet resolved — background check in flight or offline)\",\n updateRetryHint: \"triggered a fresh registry fetch — retry `/update` in a few seconds,\",\n updateRetryHint2: \"or run `reasonix update` in another terminal to force it synchronously.\",\n updateLatest: \"latest: reasonix {version}\",\n updateUpToDate: \"you're on the latest. nothing to do.\",\n updateNpxHint: \"you're running via npx — the next `npx reasonix ...` launch will auto-fetch.\",\n updateNpxForce: \"to force a refresh sooner: `npm cache clean --force`.\",\n updateUpgradeHint: \"to upgrade, exit this session and run:\",\n updateUpgradeCmd1:\n \" reasonix update (interactive, dry-run supported via --dry-run)\",\n updateUpgradeCmd2: \" {command} (direct)\",\n updateInSessionDisabled:\n \"in-session install is deliberately disabled — the install spawn would\",\n updateInSessionDisabled2:\n \"corrupt this TUI's rendering and Windows can lock the running binary.\",\n statsNoData: \"no usage data yet.\",\n statsEveryTurn: \"every turn you run here appends one record — this session's turns\",\n statsWillAppear: \"will show up in the dashboard once you send a message.\",\n },\n edits: {\n undoCodeOnly:\n \"/undo is only available inside `reasonix code` — chat mode doesn't apply edits.\",\n historyCodeOnly: \"/history is only available inside `reasonix code`.\",\n showCodeOnly: \"/show is only available inside `reasonix code`.\",\n applyCodeOnly: \"/apply is only available inside `reasonix code` (nothing to apply here).\",\n discardCodeOnly: \"/discard is only available inside `reasonix code`.\",\n planCodeOnly:\n \"/plan is only available inside `reasonix code` — chat mode doesn't gate tool writes.\",\n planOn:\n \"▸ plan mode ON — write tools are gated; the model MUST call `submit_plan` before anything executes. (The model can also call submit_plan on its own for big tasks even when plan mode is off — this toggle is the stronger, explicit constraint.) Type /plan off to leave.\",\n planOff:\n \"▸ plan mode OFF — write tools are live again. Model can still propose plans autonomously for large tasks.\",\n modeCodeOnly: \"/mode is only available inside `reasonix code`.\",\n modeUsage: \"usage: /mode <review|auto|yolo> (Shift+Tab also cycles)\",\n modeYolo:\n \"▸ edit mode: YOLO — edits AND shell commands auto-run with no prompt. /undo still rolls back edits. Use carefully.\",\n modeAuto:\n \"▸ edit mode: AUTO — edits apply immediately; press u within 5s to undo, or /undo later. Shell commands still ask.\",\n modeReview: \"▸ edit mode: review — edits queue for /apply (or y) / /discard (or n)\",\n commitCodeOnly: \"/commit is only available inside `reasonix code` (needs a rooted git repo).\",\n commitUsage:\n 'usage: /commit \"your commit message\" — runs `git add -A && git commit -m \"…\"` in {root}',\n walkCodeOnly: \"/walk is only available inside `reasonix code`.\",\n checkpointCodeOnly:\n \"/checkpoint is only available inside `reasonix code` — chat mode doesn't apply edits.\",\n checkpointNone:\n \"no checkpoints yet — `/checkpoint <name>` snapshots every file the session has touched. Restore later with `/restore <name>`.\",\n checkpointHeader: \"◈ checkpoints · {count} stored\",\n checkpointRestoreHint:\n \" /restore <name|id> · /checkpoint forget <id> · /checkpoint <name> to add\",\n checkpointForgetUsage: \"usage: /checkpoint forget <id|name>\",\n checkpointNoMatch: '▸ no checkpoint matching \"{name}\" — see /checkpoint list',\n checkpointDeleted: \"▸ deleted checkpoint {id} ({name})\",\n checkpointDeleteFailed: \"▸ failed to delete {id} (already gone?)\",\n checkpointSaveUsage: \"usage: /checkpoint <name> (or /checkpoint list to see existing)\",\n checkpointSavedEmpty:\n '▸ checkpoint \"{name}\" saved ({id}) — but no files have been touched yet, so it\\'s an empty baseline. Edits made after this point will be revertable.',\n checkpointSaved:\n '▸ checkpoint \"{name}\" saved ({id}) — {files} file{s}, {size} KB. Restore: /restore {name}',\n restoreCodeOnly: \"/restore is only available inside `reasonix code`.\",\n restoreUsage: \"usage: /restore <name|id> (see /checkpoint list for ids)\",\n restoreNoMatch: '▸ no checkpoint matching \"{target}\" — try /checkpoint list',\n restoreInfo: '▸ restored \"{name}\" ({id}) from {when}',\n restoreWrote: \" · wrote back {count} file{s}\",\n restoreRemoved: \" · removed {count} file{s} (didn't exist at checkpoint time)\",\n restoreSkipped: \" ✗ {count} file{s} skipped:\",\n cwdCodeOnly: \"/cwd is only available inside `reasonix code`.\",\n cwdUsage:\n \"usage: /cwd <path> (current root: {current}). Re-points filesystem / shell / memory tools to <path>.\",\n cwdUsageNoCurrent: \"usage: /cwd <path> re-points the workspace root to <path>.\",\n },\n model: {\n modelHint: \"try deepseek-v4-flash or deepseek-v4-pro — run /models to fetch the live list\",\n modelUsage: \"usage: /model <id> ({hint})\",\n modelNotInCatalog:\n \"model → {id} (⚠ not in the fetched catalog: {list}. If this is wrong the next call will 400 — run /models to refresh.)\",\n modelSet: \"model → {id}\",\n effortStatus: \"effort → {current} (pick: {list})\",\n effortUsage:\n \"usage: /effort <{list}> (high is the safe default; max is a DeepSeek extension)\",\n effortSet: \"effort → {effort}\",\n budgetNoCap:\n \"no session budget set — Reasonix will keep going until you stop it. Set one with: /budget <usd> (e.g. /budget 5)\",\n budgetStatus:\n \"budget: ${spent} of ${cap} ({pct}%) · /budget off to clear, /budget <usd> to change\",\n budgetOff: \"budget → off (no cap)\",\n budgetUsage:\n 'usage: /budget <usd> (got \"{arg}\" — must be a positive number, e.g. /budget 5 or /budget 12.50)',\n budgetExhausted:\n \"▲ budget → ${cap} but already spent ${spent}. Next turn will be refused — bump the cap higher to keep going, or end the session.\",\n budgetSet:\n \"budget → ${cap} (so far: ${spent} · warns at 80%, refuses next turn at 100% · /budget off to clear)\",\n },\n permissions: {\n mutateCodeOnly:\n \"/permissions add / remove / clear are only available inside `reasonix code` — they edit the project-scoped allowlist (`~/.reasonix/config.json` projects[<root>].shellAllowed).\",\n addUsage:\n 'usage: /permissions add <prefix> (multi-token OK: /permissions add \"git push origin\")',\n addAlready: \"▸ already allowed: {prefix}\",\n addBuiltin:\n \"▸ `{prefix}` is already in the builtin allowlist — no per-project entry needed. (Builtin entries are always on.)\",\n addInfo:\n \"▸ added: {prefix}\\n → next `{prefix}` invocation runs without prompting in this project.\",\n removeUsage:\n \"usage: /permissions remove <prefix-or-index> (e.g. /permissions remove 3, or /permissions remove npm)\",\n removeEmpty: \"▸ no project allowlist entries to remove.\",\n removeIndexOob: \"▸ index out of range: {idx} (project list has {count} entries)\",\n removeNothing: \"▸ nothing to remove.\",\n removeBuiltin:\n \"▸ `{prefix}` is in the builtin allowlist (read-only). Builtin entries can't be removed at runtime — they're baked into the binary.\",\n removeInfo: \"▸ removed: {prefix}\",\n removeNotFound:\n \"▸ no such project entry: {prefix} (try /permissions list to see what's stored)\",\n clearAlready: \"▸ project allowlist is already empty.\",\n clearConfirm:\n \"about to drop {count} project allowlist entr{plural} for {root}. Re-run with the word 'confirm' to proceed: /permissions clear confirm\",\n clearedNone: \"▸ project allowlist was already empty — nothing changed.\",\n cleared: \"▸ cleared {count} project allowlist entr{plural}.\",\n usage:\n 'usage: /permissions [list] show current state\\n /permissions add <prefix> persist (e.g. \"npm run build\")\\n /permissions remove <prefix-or-N> drop one entry\\n /permissions clear confirm wipe every project entry',\n modeYolo:\n \"▸ edit mode: YOLO — every shell command auto-runs, allowlist is bypassed. /mode review to re-enable prompts.\",\n modeAuto:\n \"▸ edit mode: auto — edits auto-apply, shell still gated by allowlist (or ShellConfirm prompt for non-allowlisted).\",\n modeReview:\n \"▸ edit mode: review — both edits and non-allowlisted shell commands ask before running.\",\n projectHeader: \"Project allowlist ({count}) — {root}\",\n projectNone1: ' (none — pick \"always allow\" on a ShellConfirm prompt to add one,',\n projectNone2: \" or `/permissions add <prefix>` directly.)\",\n projectNoRoot: \"Project allowlist — (no project root; chat mode shows builtin entries only)\",\n builtinHeader: \"Builtin allowlist ({count}) — read-only, baked in\",\n subcommands:\n \"Subcommands: /permissions add <prefix> · /permissions remove <prefix-or-N> · /permissions clear confirm\",\n },\n dashboard: {\n notAvailable:\n \"/dashboard is not available in this context (no startDashboard callback wired).\",\n stopNoCallback: \"/dashboard stop: no stop callback wired.\",\n notRunning: \"▸ dashboard is not running.\",\n stopping: \"▸ dashboard stopping…\",\n alreadyRunning: \"▸ dashboard is already running:\",\n alreadyRunningHint: \"Open it in any browser. Type `/dashboard stop` to tear it down.\",\n ready: \"▸ dashboard ready:\",\n readyHint: \"127.0.0.1 only · token-gated. Type `/dashboard stop` to shut down.\",\n failed: \"▸ dashboard failed to start: {reason}\",\n starting: \"▸ starting dashboard server…\",\n copied: \"▸ dashboard URL copied to clipboard: {url}\",\n tokenResetting: \"▸ rotating dashboard token — restarting server…\",\n tokenReset: \"▸ dashboard token rotated. New URL:\",\n },\n observability: {\n contextInfo: \"context: ~{total} of {max} ({pct}%) · system {sys} · tools {tools} · log {log}\",\n compactStarting: \"▸ folding older turns into a summary…\",\n compactNoop: \"▸ nothing to fold — log already small or recent turns alone exceed the budget.\",\n compactDone: \"▸ folded {before} messages → {after} (summary {chars} chars). Continuing.\",\n compactFailed: \"▸ fold failed: {reason}\",\n costNoTurn: \"no turn yet — `/cost` shows the most recent turn's token + spend breakdown.\",\n costNeedsTui: \"/cost needs a TUI context (postUsage wired).\",\n costNoPricing:\n '▸ /cost: no pricing table for model \"{model}\". Add one to telemetry/stats.ts.',\n costEstimate:\n \"▸ /cost estimate · {model} · {prompt} prompt tokens (sys {sys} + tools {tools} + log {log} + msg {msg})\",\n costWorstCase:\n \" worst case (full miss): {input} input + ~{output} output ({avg} avg) ≈ {total}\",\n costLikely: \" likely ({pct}% session cache hit): {input} input + ~{output} output ≈ {total}\",\n costLikelyCold: \" likely: matches worst case until cache fills (no completed turns yet)\",\n statusModel: \" model {model}\",\n statusFlags: \" flags stream={stream} · effort={effort}\",\n statusCtx: \" ctx {bar} {used}/{max} ({pct}%)\",\n statusCtxNone: \" ctx no turns yet\",\n statusCost: \" cost ${cost} · cache {bar} {pct}% · turns {turns}\",\n statusCostCold: \" cost ${cost} · turns {turns} (cache warming up)\",\n statusBudget: \" budget ${spent} / ${cap} ({pct}%){tag}\",\n statusSession: ' session \"{name}\" · {count} messages in log (resumed {resumed})',\n statusSessionEphemeral: \" session (ephemeral — no persistence)\",\n statusWorkspace:\n \" workspace {path} · pinned at launch (relaunch with --dir <path> to switch)\",\n statusMcp: \" mcp {servers} server(s), {tools} tool(s) in registry\",\n statusEdits: \" edits {count} pending (/apply to commit, /discard to drop)\",\n statusPlan: \" plan ON — writes gated (submit_plan + approval)\",\n statusLifecycle: \" lifecycle {mode}/{state} · {progress}{evidence}\",\n lifecycleNoPlan: \"no plan\",\n lifecycleEvidencePending: \"evidence pending\",\n lifecycleRejected: \"lifecycle: {tool} blocked in {state} — next: {next}\",\n lifecycleEvidenceRejected: \"lifecycle: step {stepId} needs evidence — next: {next}\",\n lifecycleRepeatedRejected:\n \"lifecycle: repeated {tool} rejection — do not retry identical args\",\n statusModeYolo:\n \" mode YOLO — edits + shell auto-run with no prompt (/undo still rolls back · Shift+Tab to flip)\",\n statusModeAuto:\n \" mode AUTO — edits apply immediately (u to undo within 5s · Shift+Tab to flip)\",\n statusModeReview: \" mode review — edits queue for /apply or y (Shift+Tab to flip)\",\n statusDash: \" dash {url} (open in browser · /dashboard stop)\",\n },\n plans: {\n noSession:\n \"no session attached — `/plans` is per-session. Run `reasonix code` in a project to get a session.\",\n activePlan: \"▸ active plan{label} — {done}/{total} step{s} done · last touched {when}\",\n activeNone: \"▸ active plan: (none)\",\n noArchives:\n \"no archived plans yet for this session — they auto-archive when every step is done\",\n archivedHeader: \"Archived ({count}):\",\n evidencePending:\n \" ! evidence pending — current step needs verification/diff/checkpoint/manual evidence\",\n evidenceLine: \" evidence {stepId}: {summary}\",\n archivedEvidenceLine: \" evidence: {summary}\",\n replayNoSession:\n \"no session attached — `/replay` is per-session. Run `reasonix code` in a project to get a session.\",\n replayNoArchives:\n \"no archived plans yet for this session — `/replay` lights up once a plan completes (auto-archives when every step is done).\",\n replayInvalidIndex:\n \"invalid index — `/replay` takes 1..{max} (newest = 1). Use `/plans` to see the list.\",\n archivedRow: \" ✓ {when} {total} step{s} · {completion} {label}\",\n completionComplete: \"complete\",\n stopAborted:\n \"▸ plan stopped — model aborted; type a follow-up to continue or start a new task.\",\n doneUsage:\n \"usage: /plans done <stepId> · /plans done all — manual override when the model forgot to call mark_step_complete\",\n doneUnavailable: \"/plans done is only available inside an active session.\",\n doneNoPlan: \"no active plan — nothing to mark done.\",\n doneNotInPlan: \"step `{id}` is not in the active plan. Run /plans to see the step ids.\",\n doneAlready: \"step `{id}` was already marked done.\",\n doneOk: \"▸ marked step `{id}` done.\",\n doneAllNoop: \"every step is already done.\",\n doneAllOk: \"▸ marked {count} step(s) done.\",\n },\n jobs: {\n codeOnly: \"/jobs is only available inside `reasonix code`.\",\n killCodeOnly: \"/kill is only available inside `reasonix code`.\",\n logsCodeOnly: \"/logs is only available inside `reasonix code`.\",\n empty:\n \"◈ jobs · 0 running · 0 total\\n (run_background spawns one — dev servers, watchers, long-running scripts)\",\n header: \"◈ jobs · {running} running · {total} total\",\n footer: \" /logs <id> tail · /kill <id> SIGTERM → SIGKILL\",\n killUsage: \"usage: /kill <id> (see /jobs for ids)\",\n killNotFound: \"job {id}: not found\",\n killAlreadyExited: \"job {id} already exited ({code})\",\n killStopping:\n \"▸ stopping job {id} (tree kill: SIGTERM → SIGKILL after 2s grace; Windows: taskkill /T /F)\",\n killStatus: \"▸ job {id} {status}\",\n killStillAlive: \"still alive after SIGKILL (!) — report this as a bug\",\n logsUsage: \"usage: /logs <id> [lines] (default last 80 lines)\",\n logsNotFound: \"job {id}: not found\",\n logsStatus: \"[job {id} · {status}]\\n$ {command}\",\n logsRunning: \"running · pid {pid}\",\n logsExited: \"exited {code}\",\n logsFailed: \"failed ({reason})\",\n logsStopped: \"stopped\",\n },\n memory: {\n disabled:\n \"memory is disabled (REASONIX_MEMORY=off in env). Unset the var to re-enable — no REASONIX.md or ~/.reasonix/memory content will be pinned in the meantime.\",\n noRoot:\n \"no working directory on this session — `/memory` needs a root to resolve REASONIX.md from. (Running in a test harness?)\",\n listEmpty:\n \"no user memories yet. The model can call `remember` to save one, or you can create files by hand in ~/.reasonix/memory/global/ or the per-project subdir.\",\n listHeader: \"User memories ({count}):\",\n listFooter: \"View body: /memory show <name> Delete: /memory forget <name>\",\n showUsage: \"usage: /memory show <name> or /memory show <scope>/<name>\",\n showNotFound: \"no memory found: {target}\",\n showFailed: \"show failed: {reason}\",\n forgetUsage: \"usage: /memory forget <name> or /memory forget <scope>/<name>\",\n forgetNotFound: \"no memory found: {target}\",\n forgetInfo: \"▸ forgot {scope}/{name}. Next /new or launch won't see it.\",\n forgetFailed: \"could not forget {scope}/{name} (already gone?)\",\n forgetError: \"forget failed: {reason}\",\n clearUsage: \"usage: /memory clear <global|project> confirm\",\n clearConfirm:\n \"about to delete every memory in scope={scope}. Re-run with the word 'confirm' to proceed: /memory clear {scope} confirm\",\n cleared: \"▸ cleared scope={scope} — deleted {count} memory file(s).\",\n noMemory: \"no memory pinned in {root}.\",\n layers: \"Three layers are available:\",\n layerProject: \" 1. {file} — committable team memory (in the repo).\",\n layerGlobal: \" 2. ~/.reasonix/memory/global/ — your cross-project private memory.\",\n layerProjectHash: \" 3. ~/.reasonix/memory/<project-hash>/ — this project's private memory.\",\n askModel: \"Ask the model to `remember` something, or hand-edit files directly.\",\n changesNote:\n \"Changes take effect on next /new or launch — the system prompt is hashed once per session to keep the prefix cache warm.\",\n subcommands:\n \"Subcommands: /memory list | /memory show <name> | /memory forget <name> | /memory clear <scope> confirm\",\n changesNoteShort:\n \"Changes take effect on next /new or launch. Subcommands: /memory list | show | forget | clear\",\n },\n mcp: {\n noServers:\n 'no MCP servers attached. Run `reasonix setup` to pick some, or launch with --mcp \"<spec>\". `reasonix mcp list` shows the catalog. Note: model-invoked shell commands are gated per-call (allow once / allow always / deny) — no global allow-all flag.',\n toolsLabel: \" tools {count}\",\n resourcesHint: \"`/resource` to browse+read\",\n promptsHint: \"`/prompt` to browse+fetch\",\n awarenessOnly:\n \"Chat mode consumes tools today; resources+prompts are surfaced here for awareness.\",\n catalogHint:\n \"Full catalog: `reasonix mcp list` · deeper diagnosis: `reasonix mcp inspect <spec>`.\",\n fallbackServers: \"MCP servers ({count}):\",\n fallbackTools: \"Tools in registry ({count}):\",\n fallbackChange: \"To change this set, exit and run `reasonix setup`.\",\n usageDisableEnable:\n \"usage: /mcp {action} <name> · pick a name shown in /mcp (anonymous servers can't be named-toggled).\",\n usageReconnect: \"usage: /mcp reconnect <name> · pick a name shown in /mcp.\",\n unknownServer: 'unknown MCP server \"{name}\". Known: {list}.',\n noneList: \"(none)\",\n reconnectNoTui: \"/mcp reconnect requires the interactive TUI (postInfo not wired).\",\n liveTab: \"Live\",\n marketplaceTab: \"Marketplace\",\n tabHint: \"tab to switch\",\n },\n init: {\n codeOnly:\n \"/init only works in code mode (it needs filesystem tools).\\nRun `reasonix code [path]` to start a session rooted at the\\nproject you want to initialize, then run /init.\",\n exists: \"▸ REASONIX.md already exists at {path}\",\n existsForce: \" /init force regenerate from scratch (overwrites)\",\n existsEdit: \" Or edit it by hand — it's just markdown. The current file is\",\n existsPinned: \" pinned into the system prompt every launch as-is.\",\n info: \"▸ /init — model will scan the project and synthesize REASONIX.md.\\n The result lands as a pending edit; review with /apply or /walk.\",\n },\n webSearchEngine: {\n currentEngine: \"Current web search engine: {engine}\",\n endpoint: \"SearXNG endpoint: {url}\",\n usageHeader: \"Usage:\",\n usageBing:\n \" /search-engine bing use Bing (default, works from CN without proxy)\",\n usageSearxng: \" /search-engine searxng use SearXNG at default endpoint\",\n usageSearxngUrl: \" /search-engine searxng <url> use SearXNG at custom endpoint\",\n usageMetaso:\n \" /search-engine metaso use Metaso API (100/d free, configure your own API key for more)\",\n usageTavily:\n \" /search-engine tavily use Tavily API (LLM-friendly, free 1000/mo — set TAVILY_API_KEY or tavilyApiKey in config; get one at https://tavily.com)\",\n usagePerplexity:\n \" /search-engine perplexity use Perplexity AI (AI-native answer + citations — set PERPLEXITY_API_KEY or perplexityApiKey in config; get one at https://perplexity.ai/settings/api)\",\n usageExa:\n \" /search-engine exa use Exa API (AI-native answer + citations, free 1000/mo — set EXA_API_KEY or exaApiKey in config; sign up at https://exa.ai)\",\n alias: \"Alias: /se\",\n searxngInfo:\n \"SearXNG is a self-hosted metasearch engine (https://github.com/searxng/searxng).\",\n searxngInstall: \"Install it with: docker run -d -p 8080:8080 searxng/searxng\",\n switched: 'Switched web search engine to \"{engine}\".{note}',\n switchedSearxngNote: \" Make sure SearXNG is running at {endpoint}.\",\n switchedMetasoNote:\n \" There is a daily quota of 100 (configure your own API key for higher limits).\",\n switchedTavilyNote:\n \" Set TAVILY_API_KEY or `tavilyApiKey` in config; free 1000/mo at https://tavily.com.\",\n switchedPerplexityNote:\n \" Set PERPLEXITY_API_KEY or `perplexityApiKey` in config; get one at https://perplexity.ai/settings/api.\",\n switchedExaNote: \" Set EXA_API_KEY or `exaApiKey` in config; sign up at https://exa.ai.\",\n keyNeeded:\n 'No API key configured for \"{engine}\".\\n\\n 1. Set the {envVar} environment variable\\n 2. Or provide one inline: /search-engine {engine} <your-key>\\n 3. Or add \"{engine}ApiKey\" to ~/.reasonix/config.json\\n\\nThen retry /search-engine {engine}.',\n keySaved: \" API key saved to config.\",\n confirmed:\n 'Web search engine set to \"{engine}\"{detail}. Next assistant turn will pick up the change.',\n confirmedDetail: \" ({endpoint})\",\n },\n skill: {\n listEmpty: \"no skills found. Reasonix reads skills from:\",\n listProjectScope:\n \" · <project>/.reasonix/skills/<name>/SKILL.md (or <name>.md) — project scope\",\n listGlobalScope: \" · ~/.reasonix/skills/<name>/SKILL.md (or <name>.md) — global scope\",\n listProjectOnly: \" (project scope is only active in `reasonix code`)\",\n listFrontmatter: \"Each file's frontmatter needs at least `name` and `description`.\",\n listInvoke:\n \"Invoke a skill with `/skill <name> [args]` or by asking the model to call `run_skill`.\",\n listHeader: \"User skills ({count}):\",\n listFooter: \"View: /skill show <name> Run: /skill <name> [args] New: /skill new <name>\",\n listEmptyNewHint:\n \"Scaffold one with: /skill new <name> (project scope) — there's no remote registry yet; you author skills directly.\",\n showUsage: \"usage: /skill show <name>\",\n showNotFound: \"no skill found: {name}\",\n runNotFound: \"no skill found: {name} (try /skill list)\",\n runInfo: \"▸ running skill: {name}{args}\",\n newUsage: \"usage: /skill new <name> [--global]\",\n newCreated: \"▸ created skill: {name}\\n {path}\\n edit it, then `/skill {name}` to invoke\",\n newError: \"▲ /skill new failed: {reason}\",\n pathsHeader: \"Skill paths (priority order):\",\n pathsPriority:\n \"Priority: project > custom paths in config order > global > builtin. Changes affect the system prompt on next /new or new session.\",\n pathsUsage:\n \"usage: /skill paths [list]\\n /skill paths add <path>\\n /skill paths remove <path|N>\",\n pathsAddUsage: \"usage: /skill paths add <path>\",\n pathsRemoveUsage: \"usage: /skill paths remove <path|N>\",\n pathsAdded: \"▸ added custom skills path: {path}\",\n pathsAlready: \"▸ custom skills path already configured: {path}\",\n pathsRemoved: \"▸ removed custom skills path: {path}\",\n pathsRemoveNotFound: \"▸ no custom skills path matches: {target}\",\n pathsRestartHint:\n \"The current session's system prompt is unchanged; run /new or start a new session to refresh the skills index.\",\n },\n },\n statusBar: {\n turn: \"turn\",\n cache: \"cache\",\n spent: \"spent\",\n left: \" left\",\n slow: \"slow\",\n disconnect: \"disconnect\",\n reconnecting: \"reconnecting\\u2026\",\n approvingIn: \"approving in \",\n escToInterrupt: \"s \\u00b7 esc to interrupt\",\n recordingGlyph: \"\\u25CFREC\",\n mb: \" MB\",\n evt: \" evt\",\n editsLabel: \"edits:\",\n mcpLoading: \"MCP\",\n ctx: \"ctx\",\n shortcutsHint: \"Ctrl+P shortcuts\",\n },\n editMode: {\n plan: \"PLAN MODE\",\n yolo: \"YOLO\",\n auto: \"AUTO\",\n review: \"REVIEW\",\n writesGated: \" writes gated \\u00b7 /plan off to leave\",\n editsShellAuto: \"edits + shell auto \\u00b7 /undo to roll back\",\n editsLandNow: \"edits land now \\u00b7 u to undo\",\n queuedApplyDiscard: \"{count} queued \\u00b7 y apply \\u00b7 n discard\",\n editsQueued: \"edits queued \\u00b7 y apply \\u00b7 n discard\",\n shiftTabFlip: \" {mid} \\u00b7 Shift+Tab to flip\",\n queuedDots: \"queued\\u2026\",\n },\n composer: {\n placeholder: \"ask anything \\u00b7 slash for commands \\u00b7 at-sign for files\",\n waitingForResponse: \"\\u2026waiting for response\\u2026\",\n hintSend: \"send\",\n hintNewline: \"newline\",\n hintClear: \"clear\",\n hintScroll: \"scroll\",\n hintHistory: \"history\",\n hintAbort: \"abort\",\n hintQuit: \"quit\",\n abortedHint: \"turn aborted by user \\u00b7 esc again to clear \\u00b7 \\u23ce to ask a follow-up\",\n editorNoRawMode:\n \"external editor unavailable \\u2014 stdin doesn't support raw-mode toggling on this terminal\",\n editorFailed: \"external editor:\",\n editorMissing:\n \"no $EDITOR / $VISUAL / $GIT_EDITOR set \\u2014 export one (e.g. `export EDITOR=nano`) and retry\",\n editorExited: \"editor exited with code {code}\",\n typeaheadStaged: \"\\u25b8 {count} line(s) staged \\u00b7 esc recall\",\n steerPlaceholder: \"type to steer the current task — commands are disabled while busy\",\n steerHint: \"send — injected mid-turn\",\n stashNothing: \"Nothing to stash\",\n stashSaved: \"Stashed\",\n stashRecall: \"Recalled\",\n },\n pathConfirm: {\n title: \"Outside-sandbox path\",\n subtitleRead: \"{tool} wants to READ a file outside the project sandbox\",\n subtitleWrite: \"{tool} wants to WRITE a file outside the project sandbox\",\n awaiting: \"awaiting\",\n denyTitle: \"Deny \\u2014 provide context\",\n optional: \"optional\",\n denyFooter:\n \"type context \\u00b7 \\u23ce submit with reason \\u00b7 esc skip (deny without reason)\",\n pickFooter:\n \"\\u2191\\u2193 pick \\u00b7 \\u23ce confirm \\u00b7 Tab add context \\u00b7 esc cancel\",\n allowOnce: \"allow once\",\n allowOnceDesc: \"permit this access; remember the directory for the rest of this session\",\n allowAlways: \"allow always\",\n allowAlwaysDesc: \"remember `{prefix}` for this project (persisted in ~/.reasonix/config.json)\",\n deny: \"deny\",\n denyDesc: \"press Tab to add context telling the model why\",\n pathLabel: \"path\",\n sandboxLabel: \"sandbox\",\n allowPrefixLabel: \"prefix\",\n promptTitleRead: \"Access path \\u2014 read\",\n promptTitleWrite: \"Access path \\u2014 write\",\n actionAllowRead: \"Allow read\",\n actionAllowWrite: \"Allow write\",\n actionAlwaysAllow: \"Always allow \\u2014 {prefix}\",\n actionDeny: \"Deny\",\n },\n shellConfirm: {\n title: \"Shell command\",\n bgTitle: \"Background process\",\n subtitle: \"model wants to run a shell command\",\n bgSubtitle: \"long-running process \\u2014 keeps running after approval, /kill to stop\",\n denyTitle: \"Deny \\u2014 provide context\",\n optional: \"optional\",\n denyFooter:\n \"type context \\u00b7 \\u23ce submit with reason \\u00b7 esc skip (deny without reason)\",\n awaiting: \"awaiting\",\n pickFooter:\n \"\\u2191\\u2193 pick \\u00b7 \\u23ce confirm \\u00b7 Tab add context \\u00b7 esc cancel\",\n allowOnce: \"allow once\",\n allowOnceDesc: \"run this command, ask again next time\",\n allowAlways: \"allow always\",\n allowAlwaysDesc: \"remember `{prefix}` for this project\",\n deny: \"deny\",\n denyDesc: \"press Tab to add context telling the model why\",\n cwdLabel: \"cwd\",\n timeoutLabel: \"timeout\",\n waitLabel: \"wait\",\n previewMore: \"… {n} more line hidden — press esc, ask the model to split it\",\n previewMorePlural: \"… {n} more lines hidden — press esc, ask the model to split it\",\n promptTitleRunCommand: \"Run command\",\n promptTitleRunBackground: \"Run background command\",\n actionRunOnce: \"Run once\",\n actionAlwaysAllow: \"Always allow \\u2014 {prefix}\",\n actionDeny: \"Deny\",\n },\n editConfirm: {\n footer:\n \"[y/Enter] apply \\u00b7 [n] reject with reason \\u00b7 [a] apply rest \\u00b7 [A] flip AUTO \\u00b7 [\\u2191\\u2193/Space] scroll \\u00b7 [Esc] abort\",\n newTag: \"NEW\",\n editTag: \"EDIT\",\n linesCount: \"-{removed} +{added} lines\",\n viewingRange: \"viewing {start}-{end}/{total}\",\n denyFooter: \"\\u23ce submit \\u00b7 esc skip (deny without reason)\",\n oldLabel: \" - old\",\n newLabel: \" + new\",\n sideBySide:\n \" side-by-side \\u00b7 removed lines on the left, added on the right \\u00b7 paired by offset\",\n linesAbove: \" \\u2191 {count} line above (\\u2191/k or PgUp)\",\n linesAbovePlural: \" \\u2191 {count} lines above (\\u2191/k or PgUp)\",\n linesBelow: \" \\u2193 {count} line below (\\u2193/j or Space/PgDn)\",\n linesBelowPlural: \" \\u2193 {count} lines below (\\u2193/j or Space/PgDn)\",\n },\n editPicker: {\n title: \"edit a previous message\",\n hint: \"↑↓ pick · Enter to load into composer · Esc to cancel\",\n empty: \"no user turns yet — nothing to edit\",\n dismiss: \"Esc to dismiss\",\n forked: \"▸ forked at turn #{turn} — buffer holds the original text\",\n },\n sessionPicker: {\n header: \" \\u25c8 REASONIX \\u00b7 pick a session \",\n title: \"pick a session \\u2014 {workspace}\",\n messages: \"{count} message\",\n messagesPlural: \"{count} messages\",\n turns: \"{count} turns\",\n pickerHint:\n \"\\u2191\\u2193 pick \\u00b7 / search \\u00b7 \\u23ce open \\u00b7 [n] new \\u00b7 [d] delete \\u00b7 [r] rename \\u00b7 esc quit\",\n empty: \" no saved sessions in this workspace yet \\u2014 press \",\n emptyNew: \" to start a new one\",\n renamePrompt: ' rename \"{from}\" \\u2192 ',\n renameHint: \" \\u23ce confirm rename \\u00b7 esc cancel\",\n searchPrompt: \" search sessions: /\",\n searchHint: \" type to filter \\u00b7 \\u23ce open match \\u00b7 esc clear\",\n searchEmpty: \" no sessions match this search\",\n emptyHint: \" \\u23ce new session \\u00b7 esc quit\",\n justNow: \"just now\",\n minAgo: \"{count} min ago\",\n yesterday: \"yesterday\",\n hoursAgo: \"{count}h ago\",\n daysAgo: \"{count} days ago\",\n },\n workspacePicker: {\n header: \" ◈ REASONIX · pick a workspace \",\n title: \"pick a workspace — {workspace}\",\n sessions: \"{count} session\",\n sessionsPlural: \"{count} sessions\",\n current: \"current\",\n pickerHint: \"↑↓ pick · / search · ⏎ switch + pick session · esc quit · /cwd <path> adds one\",\n empty: \" no known workspaces yet — run /cwd <path> once to add one\",\n searchPrompt: \" search workspaces: /\",\n searchHint: \" type to filter · ⏎ switch + pick session · esc clear\",\n searchEmpty: \" no workspaces match this search\",\n },\n modelPicker: {\n header: \" \\u25c8 REASONIX \\u00b7 pick a setup \",\n loading: \" \\u00b7 loading catalog\\u2026\",\n catalogEmpty: \" \\u00b7 catalog empty \\u2014 using known fallbacks\",\n modelsAvailable: \" \\u00b7 {count} models available\",\n effortHeader: \" EFFORT \\u00b7 reasoning_effort cap\",\n modelsHeader: \" MODELS \\u00b7 DeepSeek-compatible ids\",\n effortDesc: {\n low: \"fastest \\u2014 minimal reasoning\",\n medium: \"balanced\",\n high: \"default \\u2014 safe for vLLM / Azure\",\n max: \"DeepSeek extension; rejected by stock OpenAI / vLLM\",\n },\n pickerFooter:\n \" \\u2191\\u2193 pick \\u00b7 \\u23ce confirm \\u00b7 [r] refresh \\u00b7 esc cancel\",\n currentLabel: \" \\u00b7 current\",\n },\n slashSuggestions: {\n noMatch: \"no slash command matches that prefix\",\n backspaceHint: \" \\u2014 Backspace to edit, or /help for the full list\",\n commandCount: \"{count} command\",\n commandCountPlural: \"{count} commands\",\n aboveLabel: \" \\u2191 {count} above\",\n belowLabel: \" \\u2193 {count} below\",\n advancedHint: \" + {count} advanced \\u00b7 type a letter to search\",\n footerHint: \" \\u2191\\u2193 navigate \\u00b7 Tab / \\u23ce pick \\u00b7 esc cancel\",\n groupChat: \"CHAT\",\n groupSetup: \"SETUP\",\n groupInfo: \"INFO\",\n groupSession: \"SESSION\",\n groupExtend: \"EXTEND\",\n groupCode: \"CODE\",\n groupJobs: \"JOBS\",\n groupAdvanced: \"ADVANCED\",\n groupDetailSetup: \"model + cost\",\n groupDetailInfo: \"current state\",\n groupDetailChat: \"daily turn ops\",\n groupDetailExtend: \"MCP, memory, skills\",\n groupDetailSession: \"saved sessions\",\n groupDetailCode: \"edits + plans (code mode)\",\n groupDetailJobs: \"background processes (code mode)\",\n groupDetailAdvanced: \"rare or set-and-forget\",\n },\n atMentions: {\n loading: \"loading\\u2026\",\n entrySingular: \"{count} entry\",\n entryPlural: \"{count} entries\",\n searching: \"searching\\u2026\",\n scanned: \"scanned\",\n match: \"match\",\n matches: \"matches\",\n forFilter: 'for \"{filter}\"',\n noMatch: 'no files match \"{filter}\"',\n emptyDir: \"empty directory\",\n scanning: \"scanning the tree\\u2026\",\n footerBrowse:\n \"\\u2191\\u2193 navigate \\u00b7 Tab drill into folder \\u00b7 \\u23ce insert \\u00b7 esc cancel\",\n footerBrowseSearch:\n \"\\u2191\\u2193 navigate \\u00b7 Tab / \\u23ce insert as @path \\u00b7 esc cancel\",\n footerInsert: \"\\u2191\\u2193 navigate \\u00b7 Tab / \\u23ce insert as @path \\u00b7 esc cancel\",\n },\n statsPanel: {\n modePlan: \"PLAN\",\n modeYolo: \"yolo\",\n modeAuto: \"auto\",\n modeReview: \"review\",\n pro: \"\\u21e7 pro\",\n budget: \" budget \",\n },\n welcomeBanner: {\n workspace: \"\\u25b8 workspace\",\n relaunchHint: \" (relaunch with --dir <path> to switch)\",\n dashboard: \"\\u25b8 web\",\n },\n ctxBreakdown: {\n title: \"\\u25a3 context\",\n compactHint: \" /compact folds (auto at 50%) \\u00b7 /new wipes log\",\n topTools: \" top tool results by cost ({count}):\",\n msg: \"msg\",\n turnLabel: \"turn\",\n },\n startup: {\n codeRooted:\n '\\u25b8 reasonix code: rooted at {rootDir}, session \"{session}\" \\u00b7 {tools} native tool(s){semantic}',\n ephemeral: \"(ephemeral)\",\n semanticOn: \" \\u00b7 semantic_search on\",\n },\n doctorErrors: {\n unreadable: \"{path} unreadable \\u2014 {message}\",\n cannotList: \"cannot list \\u2014 {message}\",\n parseFailed: \"couldn't parse settings.json \\u2014 {message}\",\n probeFailed: \"probe failed \\u2014 {message}\",\n },\n webErrors: {\n status:\n \"web_search {status} \\u2014 try: the search backend returned an error; rephrase the query, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n rateLimit429:\n \"web_search 429 \\u2014 try: wait 10s before retrying, or rephrase the query; the search backend is rate-limiting this client\",\n forbidden403:\n \"web_search 403 \\u2014 try: the search backend is blocking this client; switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa, or wait and retry later\",\n serverError5xx:\n \"web_search {status} \\u2014 try: open the search URL in a browser; if it loads this is transient and a retry in 30s may help\",\n bingBlocked:\n \"web_search: Bing anti-bot page \\u2014 rate-limited or blocked \\u2014 try: wait 30s and retry, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n bingNoResults:\n \"web_search: 0 results but response doesn't look like a real empty page ({chars} chars, first 120: {preview}) \\u2014 try: rephrase the query with simpler terms, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n invalidEndpoint:\n 'web_search: invalid SearXNG endpoint \"{endpoint}\" \\u2014 try: set a valid URL with /search-endpoint http://host:port',\n endpointMustBeHttp:\n \"web_search: SearXNG endpoint must be http(s), got {protocol} \\u2014 try: set a valid URL with /search-endpoint http://host:port\",\n cannotReach:\n \"web_search: Cannot reach SearXNG server at {endpoint} \\u2014 try: install and start SearXNG (https://github.com/searxng/searxng, e.g. `docker run -d -p 8080:8080 searxng/searxng`), or switch to another engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n searxngNoResults:\n \"web_search: 0 results but SearXNG response doesn't look like an empty results page ({chars} chars) \\u2014 try: rephrase the query with simpler terms, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n metasoMissingKey:\n \"web_search: Metaso requires an API key \\u2014 set METASO_API_KEY or configure one with /search-engine metaso <key>. Get one at https://metaso.cn/search-api/playground\",\n metasoDailyLimit:\n \"web_search: Metaso daily search limit reached \\u2014 set METASO_API_KEY or get a key at https://metaso.cn/search-api/playground\",\n metasoUnauthorized:\n \"web_search: Metaso API key rejected \\u2014 check METASO_API_KEY or get one at https://metaso.cn/search-api/playground\",\n metasoRateLimit:\n \"web_search: Metaso rate-limited \\u2014 wait and retry, or get your own API key at https://metaso.cn/search-api/playground\",\n metasoServerError:\n \"web_search: Metaso server error ({status}) \\u2014 try again later, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n metasoParseError:\n \"web_search: Metaso returned unparseable response (HTTP {status}) \\u2014 try again later\",\n metasoApiError: \"web_search: Metaso API error (code {code}: {message}) \\u2014 try again later\",\n tavilyMissingKey:\n \"web_search: Tavily backend requires an API key \\u2014 set TAVILY_API_KEY env var or `tavilyApiKey` in ~/.reasonix/config.json; free 1000/mo signup at https://tavily.com\",\n tavilyUnauthorized:\n \"web_search: Tavily API key rejected \\u2014 check TAVILY_API_KEY or get one at https://tavily.com\",\n tavilyRateLimit:\n \"web_search: Tavily rate-limited or monthly quota exceeded \\u2014 wait, switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa, or upgrade your Tavily plan\",\n tavilyServerError:\n \"web_search: Tavily server error ({status}) \\u2014 try again later, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n tavilyParseError:\n \"web_search: Tavily returned unparseable response (HTTP {status}) \\u2014 try again later\",\n perplexityMissingKey:\n \"web_search: Perplexity backend requires an API key \\u2014 set PERPLEXITY_API_KEY env var or `perplexityApiKey` in ~/.reasonix/config.json; get one at https://perplexity.ai/settings/api\",\n perplexityUnauthorized:\n \"web_search: Perplexity API key rejected \\u2014 check PERPLEXITY_API_KEY or get one at https://perplexity.ai/settings/api\",\n perplexityRateLimit:\n \"web_search: Perplexity rate-limited \\u2014 wait and retry, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n perplexityServerError:\n \"web_search: Perplexity server error ({status}) \\u2014 try again later, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n perplexityParseError:\n \"web_search: Perplexity returned unparseable response (HTTP {status}) \\u2014 try again later\",\n exaMissingKey:\n \"web_search: Exa backend requires an API key \\u2014 set EXA_API_KEY env var or `exaApiKey` in ~/.reasonix/config.json; free 1000/mo signup at https://exa.ai\",\n exaUnauthorized:\n \"web_search: Exa API key rejected \\u2014 check EXA_API_KEY or get one at https://exa.ai\",\n exaRateLimit:\n \"web_search: Exa API rate-limited or monthly quota exceeded \\u2014 wait or upgrade at https://exa.ai/pricing\",\n exaServerError:\n \"web_search: Exa server error ({status}) \\u2014 try again later, or switch engine with /search-engine bing|searxng|metaso|tavily|perplexity|exa\",\n exaParseError:\n \"web_search: Exa returned unparseable response (HTTP {status}) \\u2014 try again later\",\n fetchStatus:\n \"web_fetch {status} for {url} \\u2014 try: confirm the URL resolves in a browser; status suggests the host returned an error page\",\n fetchRateLimit429:\n \"web_fetch 429 for {url} \\u2014 try: wait 10s before retrying; the host is rate-limiting this client\",\n fetchForbidden403:\n \"web_fetch 403 for {url} \\u2014 try: the host is blocking this client; the page may require login or block bots \\u2014 use web_search snippets instead\",\n fetchServerError5xx:\n \"web_fetch {status} for {url} \\u2014 try: open the URL in a browser; if it loads this is transient and a retry in 30s may help\",\n fetchTimeout:\n \"web_fetch: timed out after {ms}ms for {url} \\u2014 try: a shorter URL or smaller content; this may be a slow CDN, or retry once\",\n fetchTooLarge:\n \"web_fetch refused: content-length {len} bytes exceeds {cap}-byte cap ({url}) \\u2014 try: a different URL with smaller content; this page is too large to fetch\",\n fetchBodyTooLarge:\n \"web_fetch refused: response body exceeded {cap}-byte cap ({seen} bytes seen) \\u2014 try: a different URL with smaller content; this page streamed past the size cap\",\n fetchInvalidUrl:\n \"web_fetch: url must start with http:// or https:// \\u2014 try: pass an absolute http(s) URL (the URL is malformed or uses an unsupported scheme)\",\n },\n choiceConfirm: {\n customLabel: \"Let me type my own answer\",\n customDesc:\n \"None of the above fits \\u2014 type a free-form reply. The model reads it verbatim.\",\n cancelLabel: \"Cancel \\u2014 drop the question\",\n cancelDesc: \"Model stops and asks what you want instead.\",\n },\n cardTitles: {\n usage: \"usage\",\n context: \"context\",\n search: \"search\",\n subagent: \"subagent\",\n reply: \"reply\",\n reasoning: \"reasoning\",\n reasoningAborted: \"reasoning (aborted)\",\n reasoningEllipsis: \"reasoning\\u2026\",\n error: \"error\",\n doctor: \"doctor\",\n you: \"you\",\n task: \"task\",\n },\n cardLabels: {\n prompt: \"prompt\",\n reason: \"reason\",\n output: \"output\",\n cache: \"cache\",\n session: \"session\",\n balance: \"balance\",\n turn: \"turn\",\n system: \"system\",\n tools: \"tools\",\n log: \"log\",\n input: \"input\",\n topTools: \"top tools\",\n logMsgs: \"log msgs\",\n hitSingular: \"{count} hit \\u00b7 {files} file\",\n hitsPlural: \"{count} hits \\u00b7 {files} files\",\n moreHitSingular: \"\\u22ee +{count} more hit\",\n moreHitsPlural: \"\\u22ee +{count} more hits\",\n earlierLine: \"\\u22ee {count} hidden line (Ctrl+R for full output)\",\n earlierLines: \"\\u22ee {count} hidden lines (Ctrl+R for full output)\",\n hiddenLine: \"\\u22ee {count} hidden line\",\n hiddenLines: \"\\u22ee {count} hidden lines\",\n earlierStackLine: \"\\u22ee {count} earlier stack line hidden\",\n earlierStackLines: \"\\u22ee {count} earlier stack lines hidden\",\n agent: \"agent \\u00b7 {name}\",\n response: \"response\",\n writing: \"writing \\u2026\",\n tok: \"tok\",\n pilcrow: \"\\u00b6\",\n aborted: \"aborted\",\n truncatedByEsc: \"[truncated by esc]\",\n rejected: \"rejected\",\n exit: \"exit {code}\",\n bytesIn: \"{bytes} in\",\n elapsedSec: \"{secs}s\",\n stackTrace: \"stack trace\",\n retries: \"retries\",\n reasoningLabel: \"reasoning \\u00b7 {count} \\u00b6\",\n runningLabel: \"running\",\n workingLabel: \"working\",\n defaultFooter: \"\\u2191\\u2193 pick \\u00b7 \\u23ce confirm \\u00b7 esc cancel\",\n applyAction: \"[a] apply\",\n skipAction: \"[s] skip\",\n rejectAction: \"[r] reject\",\n levelOk: \"OK\",\n levelWarn: \"warn\",\n levelFail: \"FAIL\",\n checksLabel: \"checks\",\n passed: \"passed\",\n warnTag: \"warn\",\n failTag: \"fail\",\n stepLabel: \"step\",\n done: \"done\",\n inProgress: \"\\u2190 in progress\",\n upcoming: \"upcoming\",\n resumed: \"resumed \\u00b7 \",\n archive: \"\\u23ea archive \\u00b7 \",\n more: \"\\u22ee +{count} more\",\n categoryUser: \"user\",\n categoryFeedback: \"feedback\",\n categoryProject: \"project\",\n categoryReference: \"reference\",\n },\n mcpHealth: {\n noData: \"no inspect data\",\n healthy: \"healthy \\u00b7 {ms}ms\",\n slow: \"slow \\u00b7 {ms}ms\",\n verySlow: \"very slow \\u00b7 {ms}ms\",\n slowToast: \"\\u26a0 MCP `{name}` slow \\u00b7 {seconds}s p95 over the last {sampleSize} calls\",\n emptyHint:\n \"\\u2139 no MCP servers configured \\u2014 try: `reasonix setup` to re-pick, or `reasonix mcp install filesystem` \\u00b7 shell commands gate per-call (allow once / allow always / deny), no global allow-all\",\n },\n denyContextInput: {\n description:\n \"Tell the agent why you denied this. The next attempt will see your reason as additional context.\",\n },\n cardStream: {\n scrollAbove: \" \\u2191 {scroll} / {max} row above\",\n scrollAbovePlural: \" \\u2191 {scroll} / {max} rows above\",\n scrollMore: \" \\u2014 {remaining} more\",\n scrollPgUp: \" \\u00b7 PgUp / wheel\",\n scrollCopy: \" \\u00b7 /copy enters copy mode\",\n },\n slashArgPicker: {\n noMatch: 'no match for \"{partial}\"',\n keepTyping: \" \\u2014 keep typing, or Backspace to edit\",\n above: \" \\u2191 {hidden} above\",\n below: \" \\u2193 {hidden} below\",\n footer: \" \\u2191\\u2193 navigate \\u00b7 Tab / \\u23ce pick \\u00b7 esc cancel\",\n },\n mcpMarketplace: {\n title: \"MCP marketplace\",\n filter: \"filter: \",\n filterPlaceholder: \"(type to filter)\",\n matchSingular: \"{n} match\",\n matchPlural: \"{n} matches\",\n loading: \"loading\\u2026\",\n noEntries: \"no entries\",\n opening: \"opening registry\\u2026\",\n cached: \"\\u00b7 cached\",\n exhausted: \"\\u00b7 exhausted\",\n loadingMore: \"loading more\\u2026\",\n allLoaded: \"all pages loaded\",\n fetchingDetail: \"fetching smithery detail\\u2026\",\n noInstallInfo: \"no install info for {name} - try `npx -y @smithery/cli install {name}`\",\n alreadyInstalled: \"already installed: {spec}\",\n installed: \"installed \\u2192 {spec}\",\n uninstalled: \"uninstalled {name}\",\n installFailed: \"install failed: {message}\",\n notInstalled: \"not installed: {name}\",\n bridged: \"\\u2713 installed {name} - bridged\",\n bridgeFailed: \"\\u25b2 installed {name} - bridge failed: {reason}\",\n bridgeReloadFailed:\n \"\\u2713 installed {name} - restart `reasonix code` to bridge (reload failed: {message})\",\n restartBridge: \"\\u2713 installed {name} - restart `reasonix code` to bridge\",\n needsEnv: \" \\u00b7 needs env: {env}\",\n badgeOfficial: \"[off]\",\n badgeSmithery: \"[smt]\",\n badgeLocal: \"[loc]\",\n footerHint:\n \"type filter \\u00b7 \\u2191\\u2193 pick \\u00b7 \\u23ce install/toggle \\u00b7 PgDn load more \\u00b7 esc close\",\n specLine: \"spec: {runtime} {id} \\u00b7 {transport}\",\n smitheryDetail: \"(smithery listing \\u2014 install detail fetched on Enter)\",\n statusError: \"error: {message}\",\n },\n mcpBrowser: {\n title: \"\\u25c8 MCP browser\",\n empty: \"No MCP servers attached. Run `reasonix setup` to pick some, or launch with --mcp.\",\n serverCount: \"{count} server{s}\",\n footer: \"\\u2191\\u2193 pick \\u00b7 [r] reconnect \\u00b7 [d] disable \\u00b7 esc quit\",\n },\n mcpBrowse: {\n noResources:\n \"No resources on any connected MCP server (or no servers connected). `/mcp` shows the current set.\",\n readOne: \"Read one: `/resource <uri>` \\u2014 or use Tab in the picker.\",\n noPrompts:\n \"No prompts on any connected MCP server (or no servers connected). `/mcp` shows the current set.\",\n fetchOne:\n \"Fetch one: `/prompt <name>` \\u2014 args are not supported yet; prompts with required args will surface an error from the server.\",\n noServerForResource: 'no server exposes resource \"{name}\"',\n resourceHint: \"`/resource` with no arg lists what's available.\",\n readFailed: \"readResource failed\",\n noServerForPrompt: 'no server exposes prompt \"{name}\"',\n promptHint: \"`/prompt` with no arg lists what's available.\",\n fetchFailed: \"getPrompt failed\",\n },\n mcpLifecycle: {\n handshake: \"handshake\\u2026\",\n connected: \"connected\",\n failed: \"failed\",\n disabled: \"disabled\",\n reconnect: \"reconnect\\u2026\",\n initDetail: \"initialise \\u2192 tools/list \\u2192 resources/list\",\n reconnectDetail: \"tearing down \\u00b7 re-handshake \\u00b7 listing tools\",\n disabledDetail: \"via /mcp disable {name}\",\n failedSetupHint:\n \"→ run `reasonix setup` to remove this entry, or fix the underlying issue (missing npm package, network, etc.).\",\n failedSetupConfigHint:\n \"→ run `reasonix setup` to remove broken entries from your saved config.\",\n abortedHint:\n \"MCP startup aborted — {count} server(s) skipped. Run /mcp to retry once you've fixed the underlying issue.\",\n toolsReady: \"tools ready\",\n warnLabel: \"warn\",\n },\n checkpointPicker: {\n title: \"restore a checkpoint \\u2014 {workspace}\",\n header: \" \\u25c8 REASONIX \\u00b7 pick a checkpoint \",\n empty: \" no checkpoints in this workspace yet - see /checkpoint to make one\",\n more: \" \\u2026 {hidden} more\",\n footer: \" \\u2191\\u2193 pick \\u00b7 \\u23ce restore \\u00b7 [d] forget \\u00b7 esc quit\",\n footerEmpty: \" esc quit\",\n },\n planReviseConfirm: {\n title: \"plan revision proposed\",\n metaRight: \"\\u2212{removed} +{added} \\u00b7 {kept} kept\",\n updatedSummary: \"updated summary: {summary}\",\n acceptLabel: \"Accept revision - apply the new step list\",\n acceptHint: \"Replaces the remaining plan with the proposed steps. Done steps are untouched.\",\n rejectLabel: \"Reject - keep the original plan\",\n rejectHint: \"Drops the proposal. Model continues with the original remaining steps.\",\n },\n diffApp: {\n title: \"reasonix diff\",\n turnLabel: \"turn {turn} ({current}/{total})\",\n turnsAligned: \"{count} turns aligned\",\n paneEmpty: \"(no records on this side for this turn)\",\n kindMatch: \"\\u2713 match\",\n kindDiverge: \"\\u2605 diverge\",\n kindOnlyInA: \"\\u2190 only in A\",\n kindOnlyInB: \"\\u2192 only in B\",\n },\n recordView: {\n userPrefix: \"you \\u203a \",\n assistant: \"assistant\",\n toolPrefix: \"tool<\",\n argsLabel: \" args: \",\n resultArrow: \" \\u2192 \",\n error: \"error \",\n cache: \" \\u00b7 cache \",\n toolCallOnly: \"(tool-call response only)\",\n truncateExtra: \"(+{extra} chars)\",\n },\n replayApp: {\n emptyTranscript: \"empty transcript\",\n turnProgress: \"turn {current}/{total}\",\n noRecords: \"no records\",\n untracked: \"(untracked)\",\n churned: \"(churned \\u00d7{count})\",\n },\n builtinSkills: {\n explore:\n \"Explore the codebase in an isolated subagent \\u2014 wide-net read-only investigation that returns one distilled answer. Best for: 'find all places that\\u2026', 'how does X work across the project', 'survey the code for Y'.\",\n research:\n \"Research a question by combining web search + code reading in an isolated subagent. Best for: 'is X feature supported by lib Y', 'what\\u2019s the canonical way to do Z', 'compare our impl against the spec'.\",\n review:\n \"Review the pending changes (current branch diff by default) in an isolated subagent \\u2014 flags correctness, security, missing tests, hidden behavior changes; reports verdict + per-issue file:line. Read-only; the parent decides what to act on.\",\n securityReview:\n \"Security-focused review of the current branch diff in an isolated subagent \\u2014 flags injection/authz/secrets/deserialization/path-traversal/crypto issues, severity-tagged. Read-only. Use when shipping changes that touch auth, input parsing, file IO, or external requests.\",\n test: \"Run the project\\u2019s test suite, diagnose failures, propose SEARCH/REPLACE fixes, re-run until green (or stop after 2 fix attempts on the same failure). Inlined \\u2014 runs in the parent loop so you see the edit blocks and can /apply them. Detects npm/pnpm/yarn/pytest/go/cargo.\",\n },\n shortcutsHelp: {\n title: \"Shortcuts\",\n groupInput: \"Input\",\n groupNavigation: \"Navigation\",\n groupSession: \"Session\",\n groupSystem: \"System\",\n descEnter: \"Send message\",\n descShiftEnter: \"New line\",\n descCtrlEnter: \"New line\",\n descCtrlJ: \"New line\",\n descCtrlU: \"Clear input\",\n descCtrlW: \"Delete word\",\n descCtrlP: \"Show/hide shortcuts\",\n descCtrlX: \"Open in editor\",\n descArrows: \"Input history\",\n descPgUpDown: \"Scroll page\",\n descCtrlL: \"Clear screen\",\n descCtrlB: \"Toggle sidebar\",\n descNewSession: \"New session\",\n descListSessions: \"List sessions\",\n descSwitchModel: \"Switch model\",\n descSwitchEffort: \"Switch reasoning effort\",\n descSwitchTheme: \"Switch theme\",\n descCtrlC: \"Quit\",\n descEsc: \"Stop / Cancel\",\n descCtrlR: \"Toggle verbose\",\n descCtrlO: \"Expand reply (streaming only)\",\n descHelp: \"Show all commands\",\n descShiftTab: \"Switch edit mode\",\n descAltS: \"Stash / recall input\",\n },\n mcpCli: {\n bundledCatalog: \"Bundled MCP servers (offline catalog):\",\n justFetched: \"just fetched\",\n cachedAge: \"cached, {age}\",\n moreAvailable: \"more available\",\n allLoaded: \"all loaded\",\n morePagesAvailable:\n \"\\u25b8 more pages available \\u2014 `reasonix mcp list --pages <n>` or --all\",\n installHint: \"Install: reasonix mcp install <name>\",\n usageSearch: \"usage: reasonix mcp search <query>\",\n usageInstall: \"usage: reasonix mcp install <name>\",\n noMatchesFor: 'No matches for \"{q}\" across {count} loaded entries ({source})',\n matchCount: '{count} match(es) for \"{q}\" in {source} registry ({loaded} entries scanned):',\n moreLoaded: \"\\u2026 {count} more loaded \\u2014 use `reasonix mcp search <query>` to filter\",\n moreMatches: \"\\u2026 {count} more matches\",\n installed: \"Installed: {spec}\",\n noServerFound:\n 'No MCP server named \"{target}\" found after walking {pages} page(s) of the {source} registry.',\n noServerTryMore: \"Try: reasonix mcp install {target} --max-pages 100\",\n noInstallMeta:\n 'Could not derive install metadata for \"{name}\" \\u2014 try `npx -y @smithery/cli install {name}` directly.',\n buildSpecFailed: \"Cannot build install spec for {name}: {message}\",\n alreadyInstalled: \"Already installed: {spec}\",\n },\n};\n","import type { TranslationSchema } from \"./types.js\";\n\nexport const zhCN: TranslationSchema = {\n common: {\n error: \"错误\",\n warning: \"警告\",\n loading: \"加载中...\",\n done: \"完成\",\n cancel: \"取消\",\n confirm: \"确认\",\n back: \"返回\",\n next: \"下一步\",\n tool: \"工具\",\n running: \"运行中\",\n noTurns: \"(暂无对话)\",\n },\n cli: {\n description: \"DeepSeek 原生智能体框架 — 专为缓存命中和低成本令牌构建。\",\n continue: \"恢复最近使用的聊天会话,不显示选择器。\",\n setup: \"交互式向导 — API 密钥、MCP 服务器。随时重新运行以重新配置。\",\n code: \"代码编辑聊天 — 以 <dir>(默认:cwd)为根的文件系统工具,编码系统提示词,v4-flash 基线。\",\n chat: \"具有实时缓存/成本面板的交互式 Ink TUI。\",\n run: \"以非交互方式运行单个任务,流式输出。\",\n stats: \"显示使用情况仪表板。\",\n doctor: \"一键健康检查。\",\n commit: \"从暂存的差异中起草提交消息。\",\n sessions: \"列出保存的聊天会话,或按名称检查。\",\n pruneSessions: \"删除空闲 ≥N 天的已保存会话(默认 90)。使用 --dry-run 预览。\",\n events: \"美化打印内核事件日志侧边文件。\",\n replay: \"交互式 Ink TUI,用于浏览转录稿。\",\n diff: \"在分栏 Ink TUI 中比较两个转录稿。\",\n mcp: \"模型上下文协议 (MCP) 助手 — 发现服务器,测试您的设置。\",\n version: \"打印 Reasonix 版本。\",\n update: \"检查较新版本的 Reasonix 并安装。\",\n index: \"构建(或增量刷新)本地语义搜索索引。\",\n },\n stats: {\n usageHint: \"运行 `reasonix chat`、`reasonix code` 或 `reasonix run <task>` — 每次对话都会记录\",\n usageDetail: \"每次对话在日志中追加一行,`reasonix stats` 会将其汇总统计。\",\n },\n run: {\n missingApiKey:\n \"未设置 DEEPSEEK_API_KEY 且标准输入不是 TTY(无法交互式输入)。\\n\" +\n \"请设置环境变量,或先运行 `reasonix chat` 交互一次以保存密钥。\\n\",\n },\n sessions: {\n emptyHint:\n \"暂无已保存的会话 — 运行 `reasonix chat`(会话会自动保存,除非使用了 --no-session)。\",\n listHeader: \"保存的会话 (~/.reasonix/sessions/):\",\n inspectHint: \"查看:reasonix sessions <name>\",\n resumeHint: \"恢复:reasonix chat --session <name>\",\n noSession: '找不到会话 \"{name}\"(或为空)。',\n lookedAt: \"位置:{path}\",\n noIdleSessions: \"没有闲置 ≥{days} 天的会话。无需清理。\",\n wouldPrune: \"将清理 {count} 个闲置 ≥{days} 天的会话:\",\n dryRunHint: \"去掉 --dry-run 可实际执行删除。\",\n prunedCount: \"已清理 {count} 个闲置 ≥{days} 天的会话:\",\n daysInvalid: \"--days 必须是正整数(传入了 {days})。\",\n },\n ui: {\n welcome: \"随时运行 `reasonix` 开始聊天 — 您的设置将被记住。\",\n taglineChat: \"DeepSeek 原生智能体\",\n taglineCode: \"DeepSeek 原生代码智能体\",\n taglineSub: \"缓存优先 · Flash 优先\",\n startSessionHint: \"输入消息以开始您的会话\",\n inputPlaceholder: \"输入任何内容... (输入 / 使用命令, @ 引用文件)\",\n busy: \"思考中...\",\n thinking: \"▸ 思考中...\",\n undo: \"撤消\",\n undoHint: \"在 5 秒内按 u 撤消\",\n applied: \"已应用\",\n rejected: \"已拒绝\",\n noDashboard: \"禁止自动启动嵌入式 Web 仪表板。\",\n openDashboardHint:\n \"服务就绪后立即在默认浏览器中打开仪表板地址。设置了 --no-dashboard 时不生效。\",\n dashboardPortHint:\n \"将仪表板绑定到固定端口 (1–65535)。重启后保持稳定 — SSH 隧道访问必需。默认为临时端口。\",\n dashboardPortInvalid:\n \"▲ 忽略 --dashboard-port={value} (必须为 1–65535 之间的整数) — 回退到临时端口\",\n dashboardAutoStartFailed:\n \"▲ 仪表板自动启动失败 ({reason}) — 尝试 /dashboard,或传递 --no-dashboard 以静默\",\n systemAppendHint: \"追加指令到代码系统提示词。不替换默认提示词 — 在其后添加。\",\n systemAppendFileHint:\n \"追加文件内容到代码系统提示词。不替换默认提示词。UTF-8,相对于 cwd 或绝对路径。\",\n resumedSession:\n '▸ 已恢复会话 \"{name}\",包含 {count} 条历史消息 · /new 重新开始 · /sessions 管理',\n newSession: '▸ 会话 \"{name}\" (新) — 随聊随存 · /sessions 重命名或删除',\n ephemeralSession: \"▸ 临时聊天 (不保存会话) — 去掉 --no-session 以启用保存\",\n restoredEdits:\n \"▸ 从中断的运行中恢复了 {count} 个待处理的编辑块 — /apply 提交或 /discard 放弃。\",\n resumedPlan: \"已恢复计划 · {when}{summary}\",\n tipEditBindings: {\n topic: \"编辑门控快捷键\",\n sections: [\n {\n rows: [\n { key: \"y / n\", text: \"接受或放弃待处理的编辑\" },\n { key: \"Shift+Tab\", text: \"切换 预览 ↔ 自动(持久化;自动模式立即应用)\" },\n { key: \"u\", text: \"撤销上次自动应用的批处理(5 秒横幅内)\" },\n ],\n },\n ],\n footer: \"当前模式显示在底部状态栏 · /keys 查看完整快捷键参考\",\n },\n tipMouseClipboard: {\n topic: \"鼠标 + 剪贴板\",\n sections: [\n {\n rows: [\n { key: \"拖动\", text: \"直接选中文本 — 终端原生,不需要按 Shift\" },\n {\n key: \"右键\",\n text: \"终端原生菜单(Windows Terminal 等的复制 / 粘贴)\",\n },\n { key: \"滚轮\", text: \"滚动聊天记录(Web / 云端 / SSH 终端也能用)\" },\n {\n key: \"↑ / ↓\",\n text: \"输入历史(多行草稿时按行移动光标)— Ctrl+P / Ctrl+N 同义\",\n },\n { key: \"PgUp / PgDn\", text: \"滚动聊天记录(鼠标滚轮也走这条路径)\" },\n ],\n },\n ],\n footer: \"运行 /keys 查看完整键盘 + 鼠标参考\",\n },\n keysReference: {\n topic: \"Reasonix 键盘 + 鼠标参考\",\n sections: [\n {\n title: \"键盘\",\n rows: [\n { key: \"Enter\", text: \"提交输入\" },\n { key: \"Shift+Enter\", text: \"在输入框中插入换行\" },\n {\n key: \"↑ / ↓\",\n text: \"上一条 / 下一条输入历史 · 多行草稿中按行移动光标\",\n },\n { key: \"Ctrl+P / Ctrl+N\", text: \"↑ / ↓ 的 readline 同义键\" },\n { key: \"Ctrl+A / Ctrl+E\", text: \"跳到当前行的开头 / 结尾\" },\n { key: \"Ctrl+W\", text: \"删除光标前的一个词\" },\n { key: \"Ctrl+U\", text: \"清空整个输入缓冲区\" },\n { key: \"Tab\", text: \"补全 @-mention · 进入文件夹 · 接受 slash 命令\" },\n { key: \"Shift+Tab\", text: \"编辑门控:切换 预览 ↔ 自动 模式\" },\n { key: \"Esc\", text: \"关闭弹出选择器 · 中止当前模型回合\" },\n { key: \"Ctrl+C\", text: \"中止当前模型回合(不是复制 — 见剪贴板段)\" },\n { key: \"PgUp / PgDn\", text: \"整页滚动聊天记录\" },\n { key: \"End\", text: \"跳到聊天的最新一行\" },\n { key: \"Ctrl+R\", text: \"切换详细模式 — 显示完整推理 + 工具输出,不省略\" },\n ],\n },\n {\n title: \"鼠标\",\n rows: [\n { key: \"滚轮\", text: \"滚动聊天记录(Web / 云端 / SSH 终端也能用)\" },\n { key: \"拖动\", text: \"原生选中文本 — 直接复制,不需要修饰键\" },\n { key: \"右键\", text: \"终端原生(Windows Terminal 等的粘贴菜单)\" },\n ],\n },\n {\n title: \"复制 / 粘贴\",\n rows: [\n { key: \"选中文字\", text: \"直接拖动 — 终端原生(不需要任何修饰键)\" },\n {\n key: \"复制\",\n text: \"Ctrl+Shift+C(Win/Linux)· Cmd+C(macOS)— 或选中即复制(看终端设置)\",\n },\n { key: \"粘贴\", text: \"Ctrl+V 或 Ctrl+Shift+V(Win/Linux)· Cmd+V(macOS)\" },\n {\n key: \"bracketed paste\",\n text: \"多行粘贴整体进入 — 中间换行不会触发提交\",\n },\n ],\n },\n {\n title: \"编辑门控(仅 code 模式)\",\n rows: [\n { key: \"y / n\", text: \"在预览模态中接受或放弃待处理的编辑\" },\n { key: \"Shift+Tab\", text: \"切换 预览 ↔ 自动(持久化)\" },\n { key: \"u\", text: \"撤销上次自动应用的批处理(5 秒横幅内)\" },\n ],\n },\n ],\n footer:\n \"滚轮在大多数终端(含 Web / 云端 / SSH)都能滚聊天 — 默认开启 SGR 鼠标跟踪,但不会影响终端原生拖选和右键菜单。直接拖动选中文本无需 Shift。传入 --no-mouse 可关闭。\",\n },\n tipShownOnce: \"仅显示一次\",\n modelOverride: \"覆盖默认模型\",\n noSession: \"禁用本次运行的会话持久化\",\n noMouseHint: \"关闭 SGR 鼠标跟踪;恢复终端原生拖选和右键行为\",\n noProxyHint: \"本次运行忽略 HTTPS_PROXY / HTTP_PROXY,直连\",\n resumeHint: \"强制恢复指定会话(即使空闲)\",\n newHint: \"强制创建新会话(忽略 --session / --continue)\",\n transcriptHint: \"JSONL 转录稿的写入路径\",\n budgetHint: \"会话美元上限 — 80% 时警告,100% 时拒绝下一轮\",\n modelIdHint: \"DeepSeek 模型 ID(例如 deepseek-v4-flash)\",\n systemPromptHint: \"覆盖默认系统提示词\",\n effortHint: \"推理强度 — low|medium|high|max\",\n sessionNameHint: \"会话名称(默认:'default')\",\n ephemeralHint: \"禁用本次运行的会话持久化\",\n mcpSpecHint: \"MCP 服务器规格(可重复)\",\n mcpPrefixHint: \"用此字符串为 MCP 工具名添加前缀\",\n noConfigHint: \"本次运行忽略 ~/.reasonix/config.json\",\n effortHintShort: \"推理强度 — low|medium|high|max\",\n budgetHintShort: \"会话美元上限\",\n transcriptHintShort: \"JSONL 转录稿路径\",\n mcpSpecHintShort: \"MCP 服务器规格(可重复)\",\n mcpPrefixHintShort: \"MCP 工具名前缀\",\n dryRunHint: \"显示将要安装的内容但不实际安装\",\n rebuildHint: \"从头重建索引\",\n embedModelHint: \"嵌入模型名称\",\n projectDirHint: \"项目根目录\",\n ollamaUrlHint: \"Ollama 服务器 URL\",\n skipPromptsHint: \"跳过确认提示\",\n verboseHint: \"显示完整的会话元数据\",\n pruneDaysHint: \"删除空闲此天数或更多的会话(默认 90)\",\n pruneDryRunHint: \"列出将要删除的内容但不实际删除\",\n eventTypeHint: \"按事件类型过滤\",\n eventSinceHint: \"从此事件 ID 开始\",\n eventTailHint: \"仅显示最后 N 个事件\",\n jsonHint: \"以 JSON 格式输出\",\n projectionHint: \"显示每个事件的投影状态\",\n printHint: \"打印到标准输出而非 TUI\",\n headHint: \"仅显示前 N 个事件\",\n tailHint: \"仅显示最后 N 个事件\",\n mdReportHint: \"将 markdown 差异报告写入此路径\",\n printHintTable: \"打印表格到标准输出\",\n tuiHint: \"打开交互式 TUI\",\n labelAHint: \"左侧面板的标签\",\n labelBHint: \"右侧面板的标签\",\n mcpListDescription: \"浏览 MCP 注册表(官方 → smithery → 本地 fallback)\",\n mcpInspectDescription: \"检查 MCP 服务器规格(工具、资源、提示)\",\n mcpSearchDescription: \"在 MCP 注册表中搜索匹配的服务器\",\n mcpInstallDescription: \"按名称安装 MCP 服务器(将其规格写入配置)\",\n mcpBrowseDescription: \"交互式市场浏览器 — 输入过滤、回车安装\",\n mcpLocalHint: \"只显示内置的离线目录\",\n mcpRefreshHint: \"忽略 24 小时缓存,强制刷新\",\n mcpLimitHint: \"最多显示多少条\",\n mcpPagesHint: \"一次性预加载多少页(默认 1)\",\n mcpAllHint: \"加载全部页(首次较慢)\",\n mcpMaxPagesHint: \"搜索时最多走多少页(默认 20)\",\n jsonHintCatalog: \"以 JSON 格式输出\",\n jsonHintReport: \"以 JSON 格式输出检查报告\",\n modelOverrideFlash: \"覆盖模型(默认:deepseek-v4-flash)\",\n skipConfirmHint: \"跳过确认提示\",\n yoloHint: \"自动批准本次调用的计划检查点(等同于 editMode=yolo,但不修改配置文件)\",\n },\n code: {\n workspaceConflict:\n \"⚠ 工作区包含另一个智能体平台的文件 ({platforms})。Reasonix Code 可能会将其作为项目内容读取;如果不是您想要的,请使用 --dir <your-project> 重新启动。\\n\",\n systemAppendEmpty: \"--system-append 为空 — 不会追加任何提示文本\\n\",\n systemAppendFileReadError: '错误:无法读取 --system-append-file \"{filePath}\":{errorDetails}\\n',\n },\n slash: {\n help: { description: \"显示完整命令参考\" },\n status: { description: \"当前模型、标志、上下文、会话\" },\n effort: {\n description: \"推理强度上限(low|medium|high|max);high 是 vLLM/Azure 安全默认\",\n argsHint: \"<low|medium|high|max>\",\n },\n model: { description: \"切换 DeepSeek 模型 ID\", argsHint: \"<id>\" },\n models: { description: \"列出从 DeepSeek /models 获取的可用模型\" },\n theme: {\n description: \"显示或持久化终端主题偏好。无参数时打开选择器。\",\n argsHint: \"[auto|dark|light|midnight|deep-blue|high-contrast]\",\n },\n language: {\n description: \"切换运行时语言\",\n argsHint: \"<en|zh-CN>\",\n success: \"语言已切换为简体中文。\",\n unsupported: \"不支持的语言代码:{code}。支持的语言:{supported}。\",\n },\n budget: {\n description: \"会话美元上限 — 80% 时警告,100% 时拒绝下一轮。默认关闭。单独 /budget 显示状态\",\n argsHint: \"[usd|off]\",\n },\n mcp: { description: \"列出附加到此会话的 MCP 服务器 + 工具\" },\n resource: {\n description: \"浏览 + 读取 MCP 资源(无参数 → 列出 URI;<uri> → 获取内容)\",\n argsHint: \"[uri]\",\n },\n prompt: {\n description: \"浏览 + 获取 MCP 提示(无参数 → 列出名称;<name> → 渲染提示)\",\n argsHint: \"[name]\",\n },\n memory: {\n description: \"显示 / 管理固定记忆(REASONIX.md + ~/.reasonix/memory)\",\n argsHint: \"[list|show <name>|forget <name>|clear <scope> confirm]\",\n },\n skill: {\n description: \"列出 / 运行用户技能(项目 + 自定义 + 全局 + 内置)\",\n argsHint: \"[list|paths|show <name>|<name> [args]]\",\n },\n hooks: {\n description: \"列出活跃的 hooks(.reasonix/ 下的 settings.json)· reload 从磁盘重新读取\",\n argsHint: \"[reload]\",\n },\n permissions: {\n description: \"显示 / 编辑 shell 允许列表(内置只读 · 项目级:~/.reasonix/config.json)\",\n argsHint: \"[list|add <prefix>|remove <prefix|N>|clear confirm]\",\n },\n dashboard: {\n description: \"启动嵌入式 Web 仪表板(127.0.0.1,token 保护)\",\n argsHint: \"[stop]\",\n },\n update: { description: \"显示当前版本与最新版本及升级命令\" },\n stats: {\n description: \"跨会话成本仪表板(今日 / 本周 / 本月 / 全部 · 缓存命中 · 与 Claude 对比)\",\n },\n cost: {\n description: \"空 → 上一轮花费(使用卡片);带文本 → 估算发送成本(最坏情况 + 可能缓存命中)\",\n argsHint: \"[text]\",\n },\n doctor: {\n description: \"健康检查(api / config / api-reach / index / hooks / project)\",\n },\n context: { description: \"显示上下文窗口分解(系统 / 工具 / 日志 / 输入)\" },\n retry: { description: \"截断并重发您的最后一条消息(重新采样)\" },\n compact: {\n description: \"缩小日志中过大的工具结果和工具调用参数;上限为 tokens,默认 4000\",\n argsHint: \"[tokens]\",\n },\n keys: { description: \"键盘 + 鼠标 + 复制粘贴参考\" },\n cwd: {\n description:\n \"切换工作区根目录 — 重新指向文件/Shell/记忆工具,重载项目 hooks,刷新 @ 引用遍历器\",\n argsHint: \"[path]\",\n },\n stop: { description: \"中止当前模型回合(按 Esc 的替代方式)\" },\n feedback: { description: \"打开 GitHub Issue,诊断信息已复制到剪贴板\" },\n about: { description: \"项目信息 — 版本、官网、仓库、协议\" },\n plans: { description: \"列出此会话的活跃 + 归档计划(最新在前)\" },\n replay: {\n description: \"加载归档计划为只读的时间旅行快照(默认:最新)\",\n argsHint: \"[N]\",\n },\n sessions: { description: \"列出已保存的会话(当前标记为 ▸)\" },\n title: { description: \"让模型根据当前对话重命名此会话\" },\n qq: {\n description: \"连接、查看或断开当前会话的 QQ 通道(首次连接会引导录入 App ID / App Secret)\",\n argsHint: \"[connect [appId appSecret [sandbox]]|status|disconnect]\",\n },\n setup: { description: \"提醒您退出并运行 `reasonix setup`\" },\n semantic: {\n description: \"显示 semantic_search 状态 — 已构建?Ollama 已安装?如何启用\",\n },\n clear: { description: \"仅清除可见的滚动回放(日志/上下文保留)\" },\n new: { description: \"开始全新对话(清除上下文 + 滚动回放)\" },\n loop: {\n description: \"每 <interval> 自动重新提交 <prompt>,直到您输入 / Esc / /loop stop\",\n argsHint: \"<5s..6h> <prompt> · stop · (无参数 = 状态)\",\n },\n exit: { description: \"退出 TUI\" },\n init: {\n description:\n \"扫描项目并合成基线 REASONIX.md(模型写入;使用 /apply 审查)。`force` 覆盖已有文件。\",\n argsHint: \"[force]\",\n },\n apply: {\n description:\n \"将待处理的编辑块提交到磁盘(无参数 → 全部;`1`、`1,3` 或 `1-4` → 该子集,其余保持待处理)\",\n argsHint: \"[N|N,M|N-M]\",\n },\n discard: {\n description: \"丢弃待处理的编辑块而不写入(无参数 → 全部;索引 → 该子集)\",\n argsHint: \"[N|N,M|N-M]\",\n },\n walk: {\n description: \"逐块逐步处理待处理的编辑(git-add-p 风格:每块 y/n,a 应用剩余,A 切换 AUTO)\",\n },\n undo: { description: \"回滚最后应用的编辑批处理\" },\n history: {\n description: \"列出此会话的每个编辑批处理(用于 /show 的 ID,撤消标记)\",\n },\n show: {\n description: \"转储存储的编辑差异(省略 id 时为最新未撤消的)\",\n argsHint: \"[id]\",\n },\n commit: { description: \"git add -A && git commit -m ...\", argsHint: '\"msg\"' },\n checkpoint: {\n description: \"快照会话涉及的每个文件(Cursor 风格内部存储,非 git)。单独 /checkpoint 列出。\",\n argsHint: \"[name|list|forget <id>]\",\n },\n restore: {\n description: \"将文件回滚到命名的检查点(见 /checkpoint list)\",\n argsHint: \"<name|id>\",\n },\n plan: {\n description: \"切换只读计划模式(写入被弹回直到 submit_plan + 审批)\",\n argsHint: \"[on|off]\",\n },\n mode: {\n description:\n \"编辑门控:review(排队)· auto(应用+撤消)· yolo(应用+自动 shell)。Shift+Tab 循环。\",\n argsHint: \"[review|auto|yolo]\",\n },\n jobs: { description: \"列出 run_background 启动的后台作业\" },\n kill: {\n description: \"按 ID 停止后台作业(SIGTERM → 宽限期后 SIGKILL)\",\n argsHint: \"<id>\",\n },\n logs: {\n description: \"跟踪后台作业的输出(默认最后 80 行)\",\n argsHint: \"<id> [lines]\",\n },\n btw: {\n description: \"顺便问一下 — 从空白上下文回答,不写入会话历史\",\n argsHint: \"<question>\",\n },\n \"search-engine\": {\n description:\n \"切换网络搜索后端 — bing(默认,国内裸 IP 直连)、searxng(自托管)、metaso(每日 100 次)、tavily(每月 1000 次免费)、perplexity(AI 直接回答)或 exa(AI 直接回答)\",\n argsHint: \"<bing|searxng|metaso|tavily|perplexity|exa> [<key>]\",\n },\n },\n wizard: {\n languageTitle: \"选择语言\",\n languageSubtitle: \"已根据系统语言自动选中。之后可用 /language 切换。\",\n welcomeTitle: \"欢迎使用 Reasonix。\",\n apiKeyPrompt: \"粘贴你的 DeepSeek API key 开始使用。\",\n apiKeyGetOne: \"在此获取:https://platform.deepseek.com/api_keys\",\n apiKeySavedLocally: \"保存在本地:{path}\",\n apiKeyInputLabel: \"key › \",\n apiKeyInvalid: \"key 长度不足——请粘贴完整 token(16+ 字符,不含空格)。\",\n apiKeyChecking: \"正在检查 API key…\",\n apiKeyRejected: \"DeepSeek 拒绝了这个 API key。请粘贴有效 key,或按 Esc 取消设置。\",\n apiKeyCheckFailed: \"暂时无法验证 API key({message})。请检查网络后重试。\",\n apiKeyPreview: \"预览:{redacted}\",\n themeTitle: \"选择主题\",\n themeSubtitle: \"方向键切换时即时预览效果,之后可用 /theme 更改。\",\n themeSampleHeading: \"示例\",\n themeFooter: \"[↑↓] 移动 · [Enter] 确认 · [Esc] 取消\",\n themeCaption: {\n dark: \"深色调(默认)\",\n light: \"清爽浅色\",\n midnight: \"东京夜色\",\n \"deep-blue\": \"深蓝纯黑\",\n \"high-contrast\": \"高对比度(无障碍)\",\n },\n reviewLabelTheme: \"主题\",\n mcpTitle: \"Reasonix 要为你接入哪些 MCP 服务器?\",\n mcpUserArgsHint: \"(需要你提供 {arg})\",\n mcpFooterMulti: \"[↑↓] 移动 · [空格] 选择 · [Enter] 确认 · [Esc] 取消 · 全不选 = 跳过\",\n mcpArgsTitle: \"配置 {name}\",\n mcpArgsDirMissing: \"目录 {path} 不存在。\",\n mcpArgsDirCreateHint: \"[Y/Enter] 创建(mkdir -p)· [N/Esc] 输入其他路径\",\n mcpArgsDirCreateFailed: \"无法创建 {path}:{message}\",\n mcpArgsRequiredParam: \"必填参数:\",\n mcpArgsEmpty: \"{name} 需要一个值 — 不能为空。\",\n mcpArgsNotADir: \"{path} 存在但不是目录。\",\n reviewTitle: \"确认保存\",\n reviewLabelApiKey: \"API key\",\n reviewLabelLanguage: \"语言\",\n reviewLabelMcp: \"MCP\",\n reviewMcpNone: \"(无)\",\n reviewMcpServers: \"{count} 个服务器\",\n reviewSavesTo: \"保存到 {path}\",\n reviewSaveError: \"保存配置失败:{message}\",\n reviewFooter: \"[Enter] 保存 · [Esc] 取消\",\n savedTitle: \"▸ 已保存。\",\n savedShellHint:\n \"模型发起的 shell 命令每次都会弹出确认 —— 在提示框里选 `allow always` 可将该命令前缀加入本项目白名单。设计上没有「全局放行」开关。\",\n savedFooter: \"[Enter] 退出\",\n selectFooter: \"[↑↓] 移动 · [Enter] 确认 · [Esc] 取消\",\n stepCounter: \"步骤 {step}/{total} · \",\n exitHint: \"/exit 中止\",\n apiKeyPlaceholder: \"sk-...\",\n themeSampleReasoning: \"推理中\",\n },\n themePicker: {\n header: \"主题\",\n footer: \"↑↓ 选择 · ⏎ 确认 · Esc 取消\",\n currentPref: \"当前偏好\",\n activeNow: \"当前生效\",\n autoDesc: \"使用 REASONIX_THEME 或默认主题\",\n },\n planFlow: {\n approveCardTitle: \"确认计划\",\n approveCardMetaRight: \"等待中\",\n openQuestionsBanner:\n \"▲ 计划中标记了待确认的问题或风险 —— 请选 {refine} 给出明确答案,再让模型继续。\",\n openQuestionsHeader: \"待确认 / 风险\",\n truncatedBodyMore: \"… 还有 {n} 行在上方滚动历史中\",\n truncatedBodyMorePlural: \"… 还有 {n} 行在上方滚动历史中\",\n picker: {\n accept: \"采纳\",\n acceptHint: \"立即按顺序执行\",\n refine: \"细化\",\n refineHint: \"给模型更多指引,重新出一版计划\",\n revise: \"改写\",\n reviseHint: \"在执行前就地编辑计划(跳过 / 重排步骤)\",\n reject: \"驳回\",\n rejectHint: \"丢弃,让模型从头再来\",\n },\n refineFooter: \"⏎ 发送 · esc 返回选项\",\n refineQuestionsHeading: \"回答以下问题,或直接说明你想要的修改:\",\n modes: {\n approve: {\n title: \"采纳 —— 还有补充指示吗?\",\n hint: \"回答计划中的问题、补充约束,或直接回车按现状采纳。\",\n blankHint: \"(留空回车 = 不附加指示直接采纳。)\",\n },\n refine: {\n title: \"细化 —— 模型应该改什么?\",\n hint: \"说明问题在哪、缺什么,或者回答计划提出的疑问。\",\n blankHint: \"(留空回车 = 让模型对所有待确认问题选用安全默认。)\",\n },\n reject: {\n title: \"驳回 —— 告诉模型原因(可选)\",\n hint: \"说明模型对你的目标理解错在哪里,或你真正想要什么。\",\n blankHint: \"(留空回车 = 不解释直接取消;模型会反过来问你想要什么。)\",\n },\n \"checkpoint-revise\": {\n title: \"改写 —— 下一步前要调整什么?\",\n hint: \"范围调整、跳过步骤、换个思路 —— 模型会据此修改剩余步骤。\",\n blankHint: \"(留空回车 = 按当前计划继续。)\",\n },\n \"choice-custom\": {\n title: \"自定义回答 —— 想说什么都行\",\n hint: \"自由文本。模型会原样读取并继续 —— 不必匹配候选项。\",\n blankHint: \"(留空回车 = 让模型反过来问你想要什么。)\",\n },\n },\n checkpoint: {\n title: \"检查点 —— 当前步骤已完成\",\n continue: \"继续 —— 执行下一步\",\n continueHint: \"模型从下一步继续。\",\n finish: \"完成 —— 总结并收尾\",\n finishHint: \"模型记录最后一步,然后总结已完成的计划。\",\n revise: \"调整 —— 在下一步前给反馈\",\n reviseHint: \"先暂停,输入指引;模型会调整剩余计划。\",\n stop: \"停止 —— 在此结束计划\",\n stopHint: \"模型总结已完成的工作并结束。\",\n },\n stepList: {\n counter: \"{total} 个步骤\",\n counterSingular: \"{total} 个步骤\",\n counterDone: \"{done}/{total} 已完成({pct}%) · 共 {total} 步\",\n counterDoneSingular: \"{done}/{total} 已完成({pct}%) · 共 {total} 步\",\n },\n noPlanSummary: \"尚未提交计划内容。\",\n detailCollapsedHint: \"Ctrl+P 展开完整计划详情。\",\n detailExpandedHint: \"Ctrl+P 收起详情。\",\n detailHeader: \"计划详情\",\n detailWindow: \"显示第 {start}-{end} 行,共 {total} 行\",\n detailScrollHint: \"PgUp/PgDn 滚动详情 · Home/End 跳转\",\n reviseTitle: \"修改计划\",\n reviseSteps: \"{count} 个步骤\",\n reviseFooter:\n \"\\u2191\\u2193 焦点 \\u00b7 空格切换跳过 \\u00b7 k/j 移动 \\u00b7 \\u23ce 确认 \\u00b7 Esc 取消\",\n riskMed: \" 中\",\n riskHigh: \" 高\",\n completeMsg:\n \"\\u25b8 \\u8ba1\\u5212\\u5b8c\\u6210 \\u2014 \\u5168\\u90e8 {total} \\u4e2a\\u6b65\\u9aa4\\u5df2\\u5b8c\\u6210 \\u00b7 \\u5df2\\u5f52\\u6863\",\n },\n app: {\n walkCancelledRemaining: \"▸ 浏览已取消 — 还有 {count} 个待处理编辑块。\",\n walkCancelled: \"▸ 浏览已取消。\",\n editModeYolo:\n \"▸ 编辑模式:YOLO — 编辑和 shell 命令都自动执行。/undo 仍可撤销编辑。请谨慎使用。\",\n editModeAuto:\n \"▸ 编辑模式:AUTO — 编辑立即应用;5 秒内按 u 撤销(空格暂停计时)。shell 命令仍会询问。\",\n editModeReview: \"▸ 编辑模式:review — 编辑入队待 /apply(或 y)/ /discard(或 n)\",\n rejectedEdit: \"▸ 拒绝了对 {path} 的编辑{context}\",\n autoApprovingRest: \"▸ 本轮剩余编辑自动批准\",\n flippedAutoSession: \"▸ 已切换到 AUTO 模式(本会话剩余生效,已持久化)\",\n flippedAutoWalk: \"▸ 已切换到 AUTO 模式 — 后续编辑立即应用。浏览模式退出。\",\n dashboardStopped: \"▸ 仪表板已停止。\",\n notedMemory: \"▸ 已记录({scope})— {verb} {path}\",\n notedScopeProject: \"项目\",\n notedScopeGlobal: \"全局\",\n notedVerbCreated: \"创建\",\n notedVerbAppended: \"追加到\",\n memoryWriteFailed: \"# 记忆写入失败\",\n verboseOn: \"▸ 详细模式已开 — 显示完整推理 + 工具输出\",\n verboseOff: \"▸ 详细模式已关 — 恢复头尾省略\",\n commandFailed: \"! 命令失败\",\n steerInjected: \"▸ 已加入引导队列 — 将在当前步骤后注入\",\n steerCommandRejected: \"▸ 当前轮次忙碌时不能提交命令,只能输入普通引导消息\",\n btwUsage: \"▸ /btw <问题> — 顺便问个题外话,不会写入当前会话上下文。\",\n btwHeader: \"≫ btw\",\n btwFailed: \"/btw 调用失败\",\n restoreCodeOnly: \"▸ /restore 仅在代码模式可用\",\n hookUserPromptSubmit: \"UserPromptSubmit 钩子\",\n hookStop: \"Stop 钩子\",\n atMentions: \"▸ @mentions:{parts}\",\n atUrl: \"▸ @url:{parts}\",\n atUrlFailed: \"@url 展开失败\",\n sessionTitleNoSession: \"▸ 当前没有启用持久化会话,无法重命名。\",\n sessionTitleNoContent: \"▸ 当前对话内容还不够,暂时无法命名会话。\",\n sessionTitleNoTitle: \"▸ 模型没有返回可用的会话标题。\",\n sessionTitleUpdated: '▸ 会话标题已更新:\"{title}\"',\n sessionTitleRenameFailed: '▸ 无法按标题 \"{title}\" 重命名会话。',\n sessionTitleRenamed: '▸ 会话已重命名为 \"{name}\" — {title}',\n sessionTitleAutoRenamed: '▸ 已自动命名会话 \"{name}\" — {title}',\n workspaceSwitched: \"▸ 工作区已切换到 {root}\",\n semanticRepointed: \"▸ semantic_search 已指向 {root}\",\n semanticDisabledForRoot: \"▸ semantic_search 已禁用({root} 没有兼容索引)\",\n semanticRebootstrapFailed: \"▸ semantic_search 重新初始化失败:{reason}\",\n denied: \"▸ 已拒绝:{cmd}{context}\",\n alwaysAllowed: '▸ 已对 {dir} 永久允许 \"{prefix}\"',\n runningCommand: \"▸ 正在执行:{cmd}\",\n startingBackground: \"▸ 后台启动:{cmd}\",\n checkpointSaved: \"⛁ 已保存检查点 · {id} · {count} 个文件 · /restore {id} 可回滚此步\",\n continuingAfter: \"▸ 在 {label}{counter} 之后继续\",\n planStoppedAt: \"▸ 计划在 {label}{counter} 处停止\",\n revisingAfter: \"▸ 在 {label} 之后修订 — {feedback}\",\n historyScrollHint: \" ↑ 正在查看历史 · End / PgDn 返回底部 · ↓ 向下滚动一行\",\n editHistoryTitle: \"编辑历史(从旧到新):\",\n editHistoryNoCodeMode: \"不在代码模式中\",\n editHistoryNoEdits: \"此会话尚未记录任何编辑\",\n editHistoryNoShowId: \"用法:/show [id] [path] (省略 id 查看最新;path 来自文件摘要)\",\n editHistoryIdNotFound: \"未找到编辑 #{id} — 运行 /history 查看有效 ID\",\n editHistoryLookupFailed: \"意外错误:历史查找失败\",\n editHistoryBatchNoFile: '批次 #{id} 不包含 \"{path}\" — 此批次中的文件:{files}',\n editHistoryNoEdits2: \"此会话尚未记录编辑 — /history 为空\",\n editHistoryStatusApplied: \"已应用\",\n editHistoryStatusPartial: \"部分应用\",\n editHistoryStatusUndone: \"已撤销\",\n editHistoryHelpShow:\n \"/show <id> → 文件摘要 · /show <id> <path> → 某个文件的完整 diff\",\n editHistoryHelpUndo:\n \"/undo → 最新的未撤销项 · /undo <id> [path] → 指定批次或文件\",\n editHistoryAlreadyReverted: \"(已撤销 — /history 显示批次级状态)\",\n editHistoryRevertFile: \"/undo {id} {path} → 仅还原此文件\",\n mcpFailed: \"MCP {name} 失败\",\n mcpWarn: \"MCP {name} 警告\",\n unknownTheme: \"未知主题:{name}\\n可用主题:{choices}\",\n themeSaved: \"主题已保存:{name}\\n下次启动生效:{active}\",\n noPendingEdits: \"没有待处理的编辑 — 自上次 /apply 或 /discard 以来模型未提出修改。\",\n noMatchedApply: \"▸ 没有匹配这些索引的编辑 — 什么都没应用。不带参数使用 /apply 提交全部。\",\n noPendingDiscard: \"没有可丢弃的待处理编辑。\",\n noMatchedDiscard: \"▸ 没有匹配这些索引的编辑 — 什么都没丢弃。\",\n blocksStillPending: \"▸ 还有 {count} 个待处理编辑 — 使用 /apply 或 /discard 处理。\",\n nothingWritten: \"。没有写入磁盘。\",\n discardedCount: \"▸ 已丢弃 {count} 个待处理编辑\",\n noEventsFor: '没有会话 \"{name}\" 的事件',\n lookedAtFile: \"位置:{path}\",\n sidecarHint: \"(会话会在第一轮时自动创建 sidecar — 此会话是否运行过?)\",\n },\n hooks: {\n head: \"钩子 {tag} `{cmd}` {decision}{truncTag}\",\n headWithDetail: \"钩子 {tag} `{cmd}` {decision}{truncTag}:{detail}\",\n truncated: \"(输出在 256KB 处截断)\",\n decisionBlock: \"拦截\",\n decisionWarn: \"告警\",\n decisionTimeout: \"超时\",\n decisionError: \"错误\",\n },\n summary: {\n status: \"正在总结已收集的内容…\",\n hallucinatedFallback:\n \"(模型生成了伪造的工具调用标记而非纯文本总结 — 试试 /retry 换个更窄的问题,或 /think 查看 R1 的推理)\",\n failedAfterReason:\n \"{label},且回退的总结调用也失败:{message}。请运行 /clear 后用更窄的问题重试,或提高 --max-tool-iters。\",\n },\n loop: {\n budgetExhausted:\n \"会话预算已用完 — 已花费 ${spent} ≥ 上限 ${cap}。用 /budget <usd> 提高上限,/budget off 清除上限,或结束会话。\",\n budget80Pct: \"▲ 预算已用 80% — ${spent} / ${cap}。下一两轮可能就触顶。\",\n proArmed: \"⇧ /pro 已装备 — 本轮使用 deepseek-v4-pro(一次性 · 本轮后自动解除)\",\n toolUploadStatus: \"工具结果已上传 · 模型在生成下一条响应前思考中…\",\n turnStartFoldStatus: \"回合开始:上下文接近上限,正在压缩历史…\",\n turnStartFolded:\n \"回合开始:请求约 {estimate}/{ctxMax} tokens({pct}%)— 已压缩 {beforeMessages} 条消息 → {afterMessages}。发送中。\",\n harvestStatus: \"正在从推理过程提取计划状态…\",\n repeatToolCallWarning: \"拦截到重复工具调用 — 让模型察觉问题并换种方式重试。\",\n stormStuck:\n \"已停止卡死的重试循环 — 模型在自纠提示后仍以相同参数重复调用同一工具。请尝试 /retry、换种说法,或排查底层阻塞。\",\n stormSuppressed: \"已抑制 {count} 次重复工具调用 — 同一名称 + 参数触发 3 次以上。\",\n compactingHistoryStatus: \"正在压缩历史{aggressiveTag}…\",\n aggressiveTag: \"(激进)\",\n foldedHistory:\n \"上下文 {before}/{ctxMax}({pct}%)— 已折叠 {beforeMessages} 条消息 → {afterMessages}(总结 {summaryChars} 字)。继续。\",\n aggressivelyFoldedHistory:\n \"上下文 {before}/{ctxMax}({pct}%)— 已激进折叠 {beforeMessages} 条消息 → {afterMessages}(总结 {summaryChars} 字)。继续。\",\n forcingSummary:\n \"上下文 {before}/{ctxMax}({pct}%)— 基于已收集到的内容强制总结。请运行 /compact、/clear 或 /new 重置。\",\n },\n errors: {\n contextOverflow:\n \"上下文溢出(DeepSeek 400):会话历史已达 {requested},超出模型 prompt 上限(V4:1M tokens;旧版 chat/reasoner:131k)。通常是单个工具结果太大。Reasonix 默认将新工具结果限制在 8k tokens,并在会话加载时自动修复超大历史 — 重启常能清掉。如果仍然溢出,运行 /new 重新开始,或打开 /sessions 选中后按 [d] 删除该会话。\",\n contextOverflowTooMany: \"tokens 数量过多\",\n auth401:\n \"认证失败(DeepSeek 401):{inner}。你的 API key 被拒绝。运行 `reasonix setup` 或 `export DEEPSEEK_API_KEY=sk-...` 修复。在 https://platform.deepseek.com/api_keys 获取 key。\",\n balance402:\n \"余额不足(DeepSeek 402):{inner}。在 https://platform.deepseek.com/top_up 充值 — 余额非零时面板顶栏会显示。\",\n badparam422: \"参数错误(DeepSeek 422):{inner}\",\n badrequest400: \"请求错误(DeepSeek 400):{inner}\",\n concurrency429:\n \"DeepSeek 并发超限(429):{inner}。账号在跑的请求超过上限(v4-pro 500、v4-flash 2500,账号下所有 API key 累加)。通常是同一账号开了多个 Reasonix 进程,或者并行 subagent 一次发太多。等几秒重试、减少并行,或在 https://platform.deepseek.com 申请扩容。\",\n deepseek5xxHead:\n \"DeepSeek 服务不可用({status}) — 这是 DeepSeek 服务端问题,不是 Reasonix 故障。已按指数退避重试 4 次。\",\n deepseek5xxReachable:\n \" DeepSeek 主 API 健康检查通过,但 /chat/completions 在挂 — 他们那边部分服务异常。\",\n deepseek5xxUnreachable:\n \" 无法从你的网络访问 DeepSeek API — 可能是 DS 整体故障,也可能是本地网络问题。\",\n deepseek5xxActionNetwork:\n \" 建议:(1) 检查网络,(2) 等 30 秒后重试,(3) 查看状态页 https://status.deepseek.com。\",\n deepseek5xxActionRetry:\n \" 建议:(1) 等 30 秒后重试,(2) 用 /model 切换模型,(3) 查看状态页 https://status.deepseek.com。\",\n innerNoMessage: \"(无错误信息)\",\n reasonAborted: \"[用户已中断(Esc) — 正在总结到目前为止的发现]\",\n reasonContextGuard: \"[上下文额度即将耗尽 — 在下一次调用溢出之前先总结]\",\n reasonStuck: \"[卡在重复的工具调用上 — 说明已尝试的方法以及阻塞点]\",\n labelAborted: \"用户中断\",\n labelContextGuard: \"触发上下文保护(prompt > 80% 窗口)\",\n labelStuck: \"卡死(重复工具调用被反风暴机制抑制)\",\n },\n handlers: {\n basic: {\n newInfo: \"▸ 新对话 — 已从上下文中丢弃 {count} 条消息。同一会话,全新开始。\",\n newInfoArchived:\n \"▸ 新对话 — 已从上下文中丢弃 {count} 条消息。原对话已归档为「{archived}」,可在 Sessions 面板查看。\",\n newInfoSystemReloaded: \" · REASONIX.md / 项目记忆已重新加载(下一轮一次性 cache miss)\",\n helpTitle: \"命令:\",\n helpShellTitle: \"Shell 快捷方式:\",\n helpShell: \" !<cmd> 在沙箱根目录运行 <cmd>;输出进入对话\",\n helpShellDetail: \" 以便模型在下一轮看到。无允许列表限制。\",\n helpShellConsent: \" 用户输入 = 明确同意。\",\n helpShellExample: \" 示例:!git status !ls src/ !npm test\",\n helpShellGateTitle: \"模型发起的 shell 命令(按次审批):\",\n helpShellGate: \" ↑↓ + ⏎ 每次都会弹出 `allow once` / `allow always` /\",\n helpShellGateDetail:\n \" `deny` 三选一。选 `allow always` 可将该命令前缀\",\n helpShellGatePolicy:\n \" 加入本项目白名单。设计上没有「全局放行」开关。\",\n helpMemoryTitle: \"快速记忆:\",\n helpMemoryPin:\n \" #<note> 将 <note> 追加到 <project>/REASONIX.md(可提交)。\",\n helpMemoryPinEx: \" 示例:#findByEmail 必须区分大小写\",\n helpMemoryGlobal:\n \" #g <note> 将 <note> 追加到 ~/.reasonix/REASONIX.md(全局,不提交)。\",\n helpMemoryGlobalEx: \" 示例:#g 始终使用 pnpm 而非 npm\",\n helpMemoryPinBoth:\n \" 两者都固定到每个未来会话的前缀中。比 /memory 更快。\",\n helpMemoryEscape: \" 使用 `\\\\#text` 发送字面量 `#text` 给模型。\",\n helpFileTitle: \"文件引用(代码模式):\",\n helpFile: \" @path/to/file 发送时将文件内容内联到 [Referenced files] 下。\",\n helpFilePicker:\n \" 输入 `@` 打开选择器(↑↓ 导航,Tab/Enter 选择)。\",\n helpUrlTitle: \"URL 引用:\",\n helpUrl: \" @https://example.com 获取 URL,剥离 HTML,内联到 [Referenced URLs] 下。\",\n helpUrlCache: \" 同一会话中相同 URL 只获取一次(内存缓存)。\",\n helpUrlPunct: \" 自动剥离尾部标点符号(./,/))。\",\n helpSessionsTitle: \"会话(默认自动启用,命名为 'default'):\",\n helpSessionCustom: \" reasonix chat --session <name> 使用不同的命名会话\",\n helpSessionNone: \" reasonix chat --no-session 禁用本次运行的持久化\",\n retryNone: \"没有可重试的内容 — 此会话日志中没有先前的用户消息。\",\n retryInfo: '▸ 重试中:\"{preview}\"',\n loopTuiOnly: \"/loop 仅在交互式 TUI 中可用(不在 run/replay 中)。\",\n loopStopped: \"▸ 循环已停止。\",\n loopNoActive: \"没有活动的循环可停止。\",\n loopNoActiveHint:\n \"没有活动的循环。使用 `/loop <interval> <prompt>` 启动一个(例如 /loop 30s npm test)。\\n取消方式:/loop stop · Esc · /clear /new · 任何用户输入的提示。\",\n loopStarted:\n '▸ 循环已启动 — 每 {duration} 重新提交 \"{prompt}\"。输入任何内容(或 /loop stop)取消。',\n keysNeedsTui: \"/keys 需要 TUI 上下文(postKeys 已连接)。\",\n aboutHeader: \"Reasonix v{version} — 缓存优先的 DeepSeek 编码代理\",\n aboutWebsiteLabel: \"官网\",\n aboutRepoLabel: \"仓库\",\n aboutLicenseLabel: \"协议\",\n unknownCommand: \"未知命令:/{cmd} — 你是不是想用 {list}?\",\n unknownCommandShort: \"未知命令:/{cmd} (试试 /help)\",\n },\n sessions: {\n titleUnavailable: \"/title 只能在已启用会话持久化的 TUI 会话中使用。\",\n titleStarted: \"▸ 正在命名会话…\",\n titleFailed: \"▸ 会话命名失败:{reason}\",\n },\n qq: {\n unavailable: \"/qq 在当前会话中不可用。\",\n connecting: \"QQ:正在连接…\",\n connectFailed: \"QQ 连接失败:{reason}\",\n disconnecting: \"QQ:正在断开…\",\n disconnectFailed: \"QQ 断开失败:{reason}\",\n usage: \"用法:/qq connect [appId appSecret [sandbox]] | /qq status | /qq disconnect\",\n promptAppId: \"QQ 首次配置:请输入 QQ 开放平台 App ID 后回车。输入 /cancel 可取消。\",\n promptAppSecret: \"QQ 首次配置:请输入 QQ 开放平台 App Secret 后回车。输入 /cancel 可取消。\",\n setupWaitingAppId: \"等待输入 App ID\",\n setupWaitingAppSecret: \"等待输入 App Secret\",\n setupCancelled: \"QQ 首次配置已取消。\",\n credentialsRequired: \"QQ App ID 和 App Secret 不能为空。\",\n connected: \"QQ 已在{mode}模式下连接成功,后续启动会自动启用。\",\n alreadyConnected: \"QQ 已在{mode}模式下连接,自动启动已启用。\",\n disconnected: \"QQ 已断开连接,自动启动已关闭。\",\n status:\n \"QQ:{connected},自动启动{enabled},凭据{configured},appId {appId},{sandbox},访问控制 {access},当前模式 {mode}。\",\n statusSetup: \"QQ:首次配置进行中 —— {step}\",\n stateConnected: \"已连接\",\n stateDisconnected: \"未连接\",\n stateEnabled: \"已启用\",\n stateDisabled: \"未启用\",\n stateConfigured: \"已配置\",\n stateNotConfigured: \"未配置\",\n sandbox: \"沙箱环境\",\n production: \"正式环境\",\n none: \"无\",\n modeChat: \"聊天\",\n modeCode: \"代码\",\n accessOwner: \"所有者 {owner}\",\n accessOwnerWithAllowlist: \"所有者 {owner},白名单 {count}\",\n accessAllowlist: \"白名单 {count}\",\n accessRuntime: \"首个私聊用户(仅本次运行,{owner})\",\n accessOpen: \"开放(未绑定)\",\n lockAlreadyRunning: \"QQ 通道已在进程 {pid} 中运行。请先停止该进程,再启动新的 QQ 通道。\",\n unauthorizedMessage: \"QQ 忽略了未授权 openid {openid} 的消息。当前访问控制:{access}。\",\n runtimeBound:\n \"QQ 已在本次运行中临时绑定到首个发送者 {openid}。如需持久化,请在配置中设置 `qq.ownerOpenId`。\",\n missingAppId: \"缺少 QQ App ID。请先运行 `/qq connect` 完成配置。\",\n missingAppSecret: \"缺少 QQ App Secret。请先运行 `/qq connect` 完成配置。\",\n authFailed: \"QQ 机器人鉴权失败,请检查 App ID 和 App Secret。\",\n readyTimeout: \"QQ 机器人 15 秒内未收到 READY,请检查 App ID 和 App Secret。\",\n },\n admin: {\n doctorNeedsTui: \"/doctor 需要 TUI 上下文(postDoctor 已连接)。\",\n doctorRunning: \"⚕ 健康检查 — 正在运行…\",\n hooksReloadUnavailable: \"/hooks reload 在此上下文中不可用(无重载回调)。\",\n hooksReloaded: \"▸ 已重载 hooks · {count} 个活跃\",\n hooksUsage:\n \"用法:/hooks 列出活跃的 hooks\\n /hooks reload 重新读取 settings.json 文件\",\n hooksNone: \"未配置 hooks。\",\n hooksDropHint: \"将包含 `hooks` 键的 settings.json 放入以下任一位置:\",\n hooksProject: \" · {path}(项目)\",\n hooksProjectFallback: \" · <project>/.reasonix/settings.json(项目)\",\n hooksGlobal: \" · {path}(全局)\",\n hooksEvents: \"事件:PreToolUse, PostToolUse, UserPromptSubmit, Stop\",\n hooksExitCodes: \"exit 0 = 通过 · exit 2 = 阻止(Pre*)· 其他 = 警告\",\n hooksLoaded: \"▸ 已加载 {count} 个 hook\",\n hooksSources: \"来源:project={project} · global={global}\",\n updateCurrent: \"当前:reasonix {version}\",\n updateLatestPending: \"最新:(尚未解析 — 后台检查进行中或离线)\",\n updateRetryHint: \"已触发新的注册表获取 — 几秒后重试 `/update`,\",\n updateRetryHint2: \"或在另一个终端运行 `reasonix update` 强制同步执行。\",\n updateLatest: \"最新:reasonix {version}\",\n updateUpToDate: \"您已是最新版本。无需操作。\",\n updateNpxHint: \"您正在通过 npx 运行 — 下次 `npx reasonix ...` 启动时将自动获取。\",\n updateNpxForce: \"要强制刷新:`npm cache clean --force`。\",\n updateUpgradeHint: \"要升级,请退出此会话并运行:\",\n updateUpgradeCmd1: \" reasonix update (交互式,支持 --dry-run 预览)\",\n updateUpgradeCmd2: \" {command} (直接安装)\",\n updateInSessionDisabled: \"会话内安装被刻意禁用 — 安装命令会\",\n updateInSessionDisabled2: \"破坏此 TUI 的渲染,且 Windows 可能锁定运行中的二进制文件。\",\n statsNoData: \"尚无使用数据。\",\n statsEveryTurn: \"您在此运行的每一轮都会追加一条记录 — 此会话的轮次\",\n statsWillAppear: \"将在您发送消息后显示在仪表板中。\",\n },\n edits: {\n undoCodeOnly: \"/undo 仅在 `reasonix code` 中可用 — 聊天模式不应用编辑。\",\n historyCodeOnly: \"/history 仅在 `reasonix code` 中可用。\",\n showCodeOnly: \"/show 仅在 `reasonix code` 中可用。\",\n applyCodeOnly: \"/apply 仅在 `reasonix code` 中可用(此处无内容可应用)。\",\n discardCodeOnly: \"/discard 仅在 `reasonix code` 中可用。\",\n planCodeOnly: \"/plan 仅在 `reasonix code` 中可用 — 聊天模式不限制工具写入。\",\n planOn:\n \"▸ 计划模式开启 — 写入工具被限制;模型必须先调用 `submit_plan` 才能执行任何操作。(模型也可以在计划模式关闭时自主调用 submit_plan 处理大型任务 — 此开关是更强的显式约束。)输入 /plan off 退出。\",\n planOff: \"▸ 计划模式关闭 — 写入工具再次可用。模型仍可为大型任务自主提出计划。\",\n modeCodeOnly: \"/mode 仅在 `reasonix code` 中可用。\",\n modeUsage: \"用法:/mode <review|auto|yolo> (Shift+Tab 也可循环)\",\n modeYolo:\n \"▸ 编辑模式:YOLO — 编辑和 Shell 命令自动运行,无提示。/undo 仍可回滚编辑。请谨慎使用。\",\n modeAuto:\n \"▸ 编辑模式:AUTO — 编辑立即应用;在 5 秒内按 u 撤消,或稍后使用 /undo。Shell 命令仍会询问。\",\n modeReview: \"▸ 编辑模式:review — 编辑排队等待 /apply(或 y)/ /discard(或 n)\",\n commitCodeOnly: \"/commit 仅在 `reasonix code` 中可用(需要有根的 git 仓库)。\",\n commitUsage: '用法:/commit \"提交消息\" — 在 {root} 中运行 `git add -A && git commit -m \"…\"`',\n walkCodeOnly: \"/walk 仅在 `reasonix code` 中可用。\",\n checkpointCodeOnly: \"/checkpoint 仅在 `reasonix code` 中可用 — 聊天模式不应用编辑。\",\n checkpointNone:\n \"尚无检查点 — `/checkpoint <name>` 快照会话涉及的每个文件。稍后使用 `/restore <name>` 恢复。\",\n checkpointHeader: \"◈ 检查点 · 已存储 {count} 个\",\n checkpointRestoreHint:\n \" /restore <name|id> · /checkpoint forget <id> · /checkpoint <name> 添加\",\n checkpointForgetUsage: \"用法:/checkpoint forget <id|name>\",\n checkpointNoMatch: '▸ 未找到匹配 \"{name}\" 的检查点 — 见 /checkpoint list',\n checkpointDeleted: \"▸ 已删除检查点 {id}({name})\",\n checkpointDeleteFailed: \"▸ 删除 {id} 失败(已消失?)\",\n checkpointSaveUsage: \"用法:/checkpoint <name> (或 /checkpoint list 查看现有)\",\n checkpointSavedEmpty:\n '▸ 检查点 \"{name}\" 已保存({id})— 但尚未涉及任何文件,因此是空基线。此后的编辑将可撤消。',\n checkpointSaved:\n '▸ 检查点 \"{name}\" 已保存({id})— {files} 个文件,{size} KB。恢复:/restore {name}',\n restoreCodeOnly: \"/restore 仅在 `reasonix code` 中可用。\",\n restoreUsage: \"用法:/restore <name|id> (见 /checkpoint list 获取 ID)\",\n restoreNoMatch: '▸ 未找到匹配 \"{target}\" 的检查点 — 尝试 /checkpoint list',\n restoreInfo: '▸ 已恢复 \"{name}\"({id}),来自 {when}',\n restoreWrote: \" · 写回了 {count} 个文件\",\n restoreRemoved: \" · 移除了 {count} 个文件(检查点时不存在)\",\n restoreSkipped: \" ✗ 跳过了 {count} 个文件:\",\n cwdCodeOnly: \"/cwd 仅在 `reasonix code` 中可用。\",\n cwdUsage:\n \"用法:/cwd <path> (当前根目录:{current})。重新指向 filesystem / shell / memory 工具到 <path>。\",\n cwdUsageNoCurrent: \"用法:/cwd <path> 将工作区根目录切换到 <path>。\",\n },\n model: {\n modelHint: \"尝试 deepseek-v4-flash 或 deepseek-v4-pro — 运行 /models 获取实时列表\",\n modelUsage: \"用法:/model <id> ({hint})\",\n modelNotInCatalog:\n \"model → {id} (⚠ 不在获取的目录中:{list}。如果这是错误的,下次调用将返回 400 — 运行 /models 刷新。)\",\n modelSet: \"model → {id}\",\n effortStatus: \"effort → {current} (可选:{list})\",\n effortUsage: \"用法:/effort <{list}> (high 为安全默认;max 是 DeepSeek 扩展)\",\n effortSet: \"effort → {effort}\",\n budgetNoCap:\n \"未设置会话预算 — Reasonix 将持续运行直到您停止。使用以下方式设置:/budget <usd> (例如 /budget 5)\",\n budgetStatus: \"预算:${spent} / ${cap}({pct}%)· /budget off 清除,/budget <usd> 更改\",\n budgetOff: \"budget → 关闭(无上限)\",\n budgetUsage:\n '用法:/budget <usd> (收到 \"{arg}\" — 必须是正数,例如 /budget 5 或 /budget 12.50)',\n budgetExhausted:\n \"▲ budget → ${cap} 但已花费 ${spent}。下一轮将被拒绝 — 提高上限以继续,或结束会话。\",\n budgetSet:\n \"budget → ${cap} (迄今:${spent} · 80% 时警告,100% 时拒绝下一轮 · /budget off 清除)\",\n },\n permissions: {\n mutateCodeOnly:\n \"/permissions add / remove / clear 仅在 `reasonix code` 中可用 — 它们编辑项目范围的允许列表(`~/.reasonix/config.json` projects[<root>].shellAllowed)。\",\n addUsage:\n '用法:/permissions add <prefix> (多 token 可用:/permissions add \"git push origin\")',\n addAlready: \"▸ 已允许:{prefix}\",\n addBuiltin: \"▸ `{prefix}` 已在内置允许列表中 — 无需项目条目。(内置条目始终开启。)\",\n addInfo: \"▸ 已添加:{prefix}\\n → 在此项目中,下次 `{prefix}` 调用将无需提示。\",\n removeUsage:\n \"用法:/permissions remove <prefix-or-index> (例如 /permissions remove 3,或 /permissions remove npm)\",\n removeEmpty: \"▸ 没有项目允许列表条目可移除。\",\n removeIndexOob: \"▸ 索引超出范围:{idx}(项目列表有 {count} 个条目)\",\n removeNothing: \"▸ 无内容可移除。\",\n removeBuiltin:\n \"▸ `{prefix}` 在内置允许列表中(只读)。内置条目无法在运行时移除 — 它们已编译到二进制文件中。\",\n removeInfo: \"▸ 已移除:{prefix}\",\n removeNotFound: \"▸ 无此项目条目:{prefix} (尝试 /permissions list 查看已存储的内容)\",\n clearAlready: \"▸ 项目允许列表已为空。\",\n clearConfirm:\n \"即将丢弃 {root} 的 {count} 个项目允许列表条目。重新运行并附带 'confirm' 一词以继续:/permissions clear confirm\",\n clearedNone: \"▸ 项目允许列表已为空 — 无变化。\",\n cleared: \"▸ 已清除 {count} 个项目允许列表条目。\",\n usage:\n '用法:/permissions [list] 显示当前状态\\n /permissions add <prefix> 持久化(例如 \"npm run build\")\\n /permissions remove <prefix-or-N> 删除一个条目\\n /permissions clear confirm 清除所有项目条目',\n modeYolo:\n \"▸ 编辑模式:YOLO — 每个 shell 命令自动运行,允许列表被绕过。/mode review 重新启用提示。\",\n modeAuto:\n \"▸ 编辑模式:auto — 编辑自动应用,shell 仍受允许列表限制(或非允许列表的 ShellConfirm 提示)。\",\n modeReview: \"▸ 编辑模式:review — 编辑和非允许列表的 shell 命令在运行前都会询问。\",\n projectHeader: \"项目允许列表({count})— {root}\",\n projectNone1: ' (无 — 在 ShellConfirm 提示中选择 \"always allow\" 添加一个,',\n projectNone2: \" 或直接 `/permissions add <prefix>`。)\",\n projectNoRoot: \"项目允许列表 — (无项目根目录;聊天模式仅显示内置条目)\",\n builtinHeader: \"内置允许列表({count})— 只读,已编译\",\n subcommands:\n \"子命令:/permissions add <prefix> · /permissions remove <prefix-or-N> · /permissions clear confirm\",\n },\n dashboard: {\n notAvailable: \"/dashboard 在此上下文中不可用(无 startDashboard 回调)。\",\n stopNoCallback: \"/dashboard stop:无停止回调。\",\n notRunning: \"▸ 仪表板未运行。\",\n stopping: \"▸ 仪表板正在停止…\",\n alreadyRunning: \"▸ 仪表板已在运行:\",\n alreadyRunningHint: \"在任何浏览器中打开它。输入 `/dashboard stop` 关闭。\",\n ready: \"▸ 仪表板就绪:\",\n readyHint: \"仅 127.0.0.1 · token 保护。输入 `/dashboard stop` 关闭。\",\n failed: \"▸ 仪表板启动失败:{reason}\",\n starting: \"▸ 正在启动仪表板服务器…\",\n copied: \"▸ 仪表板 URL 已复制到剪贴板:{url}\",\n tokenResetting: \"▸ 正在轮换仪表板 token 并重启服务…\",\n tokenReset: \"▸ 仪表板 token 已轮换。新 URL:\",\n },\n observability: {\n contextInfo: \"上下文:~{total} / {max}({pct}%)· 系统 {sys} · 工具 {tools} · 日志 {log}\",\n compactStarting: \"▸ 正在折叠旧轮次为摘要…\",\n compactNoop: \"▸ 无需折叠 — 日志已足够小,或最近轮次本身已超过预算。\",\n compactDone: \"▸ 已折叠 {before} 条消息 → {after}(摘要 {chars} 字符)。继续。\",\n compactFailed: \"▸ 折叠失败:{reason}\",\n costNoTurn: \"尚无轮次 — `/cost` 显示最近一轮的 token + 花费明细。\",\n costNeedsTui: \"/cost 需要 TUI 上下文(postUsage 已连接)。\",\n costNoPricing: '▸ /cost:模型 \"{model}\" 无定价表。请在 telemetry/stats.ts 中添加。',\n costEstimate:\n \"▸ /cost 估算 · {model} · {prompt} prompt tokens(系统 {sys} + 工具 {tools} + 日志 {log} + 消息 {msg})\",\n costWorstCase:\n \" 最坏情况(完全未命中):{input} 输入 + ~{output} 输出({avg} 平均)≈ {total}\",\n costLikely: \" 可能({pct}% 会话缓存命中):{input} 输入 + ~{output} 输出 ≈ {total}\",\n costLikelyCold: \" 可能:在缓存填充前与最坏情况相同(无已完成的轮次)\",\n statusModel: \" 模型 {model}\",\n statusFlags: \" 标志 stream={stream} · effort={effort}\",\n statusCtx: \" 上下文 {bar} {used}/{max}({pct}%)\",\n statusCtxNone: \" 上下文 尚无轮次\",\n statusCost: \" 成本 ${cost} · 缓存 {bar} {pct}% · 轮次 {turns}\",\n statusCostCold: \" 成本 ${cost} · 轮次 {turns}(缓存预热中)\",\n statusBudget: \" 预算 ${spent} / ${cap}({pct}%){tag}\",\n statusSession: ' 会话 \"{name}\" · 日志中 {count} 条消息(恢复了 {resumed} 条)',\n statusSessionEphemeral: \" 会话 (临时 — 无持久化)\",\n statusWorkspace: \" 工作区 {path} · 启动时锁定(用 --dir <path> 重新启动以切换)\",\n statusMcp: \" MCP {servers} 个服务器,注册表中 {tools} 个工具\",\n statusEdits: \" 编辑 {count} 个待处理(/apply 提交,/discard 丢弃)\",\n statusPlan: \" 计划 开启 — 写入受限(submit_plan + 审批)\",\n statusLifecycle: \" 生命周期 {mode}/{state} · {progress}{evidence}\",\n lifecycleNoPlan: \"暂无计划\",\n lifecycleEvidencePending: \"等待 evidence\",\n lifecycleRejected: \"lifecycle:{tool} 在 {state} 状态被拦截 — 下一步:{next}\",\n lifecycleEvidenceRejected: \"lifecycle:步骤 {stepId} 需要 evidence — 下一步:{next}\",\n lifecycleRepeatedRejected: \"lifecycle:{tool} 被重复拦截 — 不要用相同参数反复重试\",\n statusModeYolo:\n \" 模式 YOLO — 编辑 + shell 自动运行,无提示(/undo 仍可回滚 · Shift+Tab 切换)\",\n statusModeAuto: \" 模式 AUTO — 编辑立即应用(5 秒内按 u 撤消 · Shift+Tab 切换)\",\n statusModeReview: \" 模式 review — 编辑排队等待 /apply 或 y(Shift+Tab 切换)\",\n statusDash: \" 仪表板 {url}(在浏览器中打开 · /dashboard stop)\",\n },\n plans: {\n noSession: \"未附加会话 — `/plans` 是按会话的。在项目中运行 `reasonix code` 以获取会话。\",\n activePlan: \"▸ 活跃计划{label} — {done}/{total} 步骤已完成 · 最后触及 {when}\",\n activeNone: \"▸ 活跃计划:(无)\",\n noArchives: \"此会话尚无归档计划 — 当每个步骤完成时自动归档\",\n archivedHeader: \"已归档({count}):\",\n evidencePending:\n \" ! 等待 evidence — 当前步骤需要 verification/diff/checkpoint/manual evidence\",\n evidenceLine: \" evidence {stepId}: {summary}\",\n archivedEvidenceLine: \" evidence: {summary}\",\n replayNoSession:\n \"未附加会话 — `/replay` 是按会话的。在项目中运行 `reasonix code` 以获取会话。\",\n replayNoArchives:\n \"此会话尚无归档计划 — `/replay` 在计划完成后启用(每个步骤完成时自动归档)。\",\n replayInvalidIndex:\n \"无效索引 — `/replay` 接受 1..{max}(最新 = 1)。使用 `/plans` 查看列表。\",\n archivedRow: \" ✓ {when} {total}步 · {completion} {label}\",\n completionComplete: \"已完成\",\n stopAborted: \"▸ 计划已停止 — 模型已中止;输入后续内容继续,或开始新任务。\",\n doneUsage:\n \"用法:/plans done <stepId> · /plans done all — 模型忘记调用 mark_step_complete 时的手动兜底\",\n doneUnavailable: \"/plans done 仅在活跃会话内可用。\",\n doneNoPlan: \"当前无活跃计划 — 没有可标记的内容。\",\n doneNotInPlan: \"步骤 `{id}` 不在当前计划中。运行 /plans 查看步骤 id。\",\n doneAlready: \"步骤 `{id}` 已被标记为完成。\",\n doneOk: \"▸ 已将步骤 `{id}` 标记为完成。\",\n doneAllNoop: \"所有步骤均已完成。\",\n doneAllOk: \"▸ 已标记 {count} 个步骤为完成。\",\n },\n jobs: {\n codeOnly: \"/jobs 仅在 `reasonix code` 中可用。\",\n killCodeOnly: \"/kill 仅在 `reasonix code` 中可用。\",\n logsCodeOnly: \"/logs 仅在 `reasonix code` 中可用。\",\n empty:\n \"◈ 作业 · 0 运行中 · 共 0 个\\n (run_background 生成一个 — 开发服务器、监视器、长时间运行的脚本)\",\n header: \"◈ 作业 · {running} 运行中 · 共 {total} 个\",\n footer: \" /logs <id> 跟踪 · /kill <id> SIGTERM → SIGKILL\",\n killUsage: \"用法:/kill <id> (见 /jobs 获取 ID)\",\n killNotFound: \"作业 {id}:未找到\",\n killAlreadyExited: \"作业 {id} 已退出({code})\",\n killStopping:\n \"▸ 正在停止作业 {id}(树终止:SIGTERM → 2 秒宽限期后 SIGKILL;Windows:taskkill /T /F)\",\n killStatus: \"▸ 作业 {id} {status}\",\n killStillAlive: \"SIGKILL 后仍存活 (!) — 请将此作为 bug 报告\",\n logsUsage: \"用法:/logs <id> [lines] (默认最后 80 行)\",\n logsNotFound: \"作业 {id}:未找到\",\n logsStatus: \"[作业 {id} · {status}]\\n$ {command}\",\n logsRunning: \"运行中 · pid {pid}\",\n logsExited: \"已退出 {code}\",\n logsFailed: \"失败({reason})\",\n logsStopped: \"已停止\",\n },\n memory: {\n disabled:\n \"记忆已禁用(环境变量 REASONIX_MEMORY=off)。取消设置该变量以重新启用 — 此期间不会固定任何 REASONIX.md 或 ~/.reasonix/memory 内容。\",\n noRoot:\n \"此会话无工作目录 — `/memory` 需要一个根目录来解析 REASONIX.md。(在测试环境中运行?)\",\n listEmpty:\n \"尚无用户记忆。模型可以调用 `remember` 保存一个,或您可以在 ~/.reasonix/memory/global/ 或项目子目录中手动创建文件。\",\n listHeader: \"用户记忆({count}):\",\n listFooter: \"查看正文:/memory show <name> 删除:/memory forget <name>\",\n showUsage: \"用法:/memory show <name> 或 /memory show <scope>/<name>\",\n showNotFound: \"未找到记忆:{target}\",\n showFailed: \"显示失败:{reason}\",\n forgetUsage: \"用法:/memory forget <name> 或 /memory forget <scope>/<name>\",\n forgetNotFound: \"未找到记忆:{target}\",\n forgetInfo: \"▸ 已遗忘 {scope}/{name}。下次 /new 或启动时将不可见。\",\n forgetFailed: \"无法遗忘 {scope}/{name}(已消失?)\",\n forgetError: \"遗忘失败:{reason}\",\n clearUsage: \"用法:/memory clear <global|project> confirm\",\n clearConfirm:\n \"即将删除 scope={scope} 中的每个记忆。重新运行并附带 'confirm' 一词以继续:/memory clear {scope} confirm\",\n cleared: \"▸ 已清除 scope={scope} — 删除了 {count} 个记忆文件。\",\n noMemory: \"在 {root} 中未固定记忆。\",\n layers: \"可用的三个层级:\",\n layerProject: \" 1. {file} — 可提交的团队记忆(在仓库中)。\",\n layerGlobal: \" 2. ~/.reasonix/memory/global/ — 您的跨项目私有记忆。\",\n layerProjectHash: \" 3. ~/.reasonix/memory/<project-hash>/ — 此项目的私有记忆。\",\n askModel: \"让模型 `remember` 某些内容,或直接手编辑文件。\",\n changesNote: \"更改在下次 /new 或启动时生效 — 系统提示词每会话哈希一次以保持前缀缓存热度。\",\n subcommands:\n \"子命令:/memory list | /memory show <name> | /memory forget <name> | /memory clear <scope> confirm\",\n changesNoteShort:\n \"更改在下次 /new 或启动时生效。子命令:/memory list | show | forget | clear\",\n },\n mcp: {\n noServers:\n '未附加 MCP 服务器。运行 `reasonix setup` 选择一些,或使用 --mcp \"<spec>\" 启动。`reasonix mcp list` 显示目录。注:模型发起的 shell 命令按次审批(allow once / allow always / deny),设计上没有「全局放行」开关。',\n toolsLabel: \" 工具 {count}\",\n resourcesHint: \"`/resource` 浏览+读取\",\n promptsHint: \"`/prompt` 浏览+获取\",\n awarenessOnly: \"聊天模式目前消耗工具;资源+提示在此展示供了解。\",\n catalogHint: \"完整目录:`reasonix mcp list` · 深度诊断:`reasonix mcp inspect <spec>`。\",\n fallbackServers: \"MCP 服务器({count}):\",\n fallbackTools: \"注册表中的工具({count}):\",\n fallbackChange: \"要更改此设置,请退出并运行 `reasonix setup`。\",\n usageDisableEnable:\n \"用法:/mcp {action} <name> · 从 /mcp 列表中挑一个名字(匿名服务器无法按名切换)。\",\n usageReconnect: \"用法:/mcp reconnect <name> · 从 /mcp 列表中挑一个名字。\",\n unknownServer: '未知 MCP 服务器 \"{name}\"。已知:{list}。',\n noneList: \"(无)\",\n reconnectNoTui: \"/mcp reconnect 需要交互式 TUI(postInfo 未连接)。\",\n liveTab: \"已连接\",\n marketplaceTab: \"市场\",\n tabHint: \"按 tab 切换\",\n },\n init: {\n codeOnly:\n \"/init 仅在代码模式下工作(需要文件系统工具)。\\n运行 `reasonix code [path]` 启动一个以您要初始化的项目为根的会话,\\n然后运行 /init。\",\n exists: \"▸ REASONIX.md 已存在于 {path}\",\n existsForce: \" /init force 从头重新生成(覆盖)\",\n existsEdit: \" 或手动编辑 — 它只是 markdown。当前文件已\",\n existsPinned: \" 固定到每次启动的系统提示词中。\",\n info: \"▸ /init — 模型将扫描项目并合成 REASONIX.md。\\n 结果将作为待处理的编辑;使用 /apply 或 /walk 审查。\",\n },\n webSearchEngine: {\n currentEngine: \"当前网页搜索引擎:{engine}\",\n endpoint: \"SearXNG 端点:{url}\",\n usageHeader: \"用法:\",\n usageBing: \" /search-engine bing 使用 Bing(默认,国内裸 IP 直连,无需代理)\",\n usageSearxng: \" /search-engine searxng 使用 SearXNG 默认端点\",\n usageSearxngUrl: \" /search-engine searxng <url> 使用 SearXNG 自定义端点\",\n usageMetaso:\n \" /search-engine metaso 使用 Metaso API(每天 100 次免费,配置你自己的 API 密钥可提升限额)\",\n usageTavily:\n \" /search-engine tavily 使用 Tavily API(LLM 友好,每月 1000 次免费 — 设置 TAVILY_API_KEY 或 config 的 tavilyApiKey;注册 https://tavily.com)\",\n usagePerplexity:\n \" /search-engine perplexity 使用 Perplexity AI(AI 直接回答 + 引用 — 设置 PERPLEXITY_API_KEY 或 config 的 perplexityApiKey;在 https://perplexity.ai/settings/api 获取密钥)\",\n usageExa:\n \" /search-engine exa 使用 Exa API(AI 直接回答 + 引用,每月 1000 次免费 — 设置 EXA_API_KEY 或 config 的 exaApiKey;注册 https://exa.ai)\",\n alias: \"别名:/se\",\n searxngInfo: \"SearXNG 是一个自托管的元搜索引擎(https://github.com/searxng/searxng)。\",\n searxngInstall: \"安装命令: docker run -d -p 8080:8080 searxng/searxng\",\n switched: '已切换网页搜索引擎为 \"{engine}\"。{note}',\n switchedSearxngNote: \" 请确保 SearXNG 在 {endpoint} 运行。\",\n switchedMetasoNote: \" 每日限额 100 次(配置你自己的 API 密钥可提升限额)。\",\n switchedTavilyNote:\n \" 请设置环境变量 TAVILY_API_KEY 或 config 中的 `tavilyApiKey`;https://tavily.com 每月 1000 次免费。\",\n switchedPerplexityNote:\n \" 请设置环境变量 PERPLEXITY_API_KEY 或 config 中的 `perplexityApiKey`;在 https://perplexity.ai/settings/api 获取密钥。\",\n switchedExaNote:\n \" 请设置环境变量 EXA_API_KEY 或 config 中的 `exaApiKey`;注册 https://exa.ai。\",\n keyNeeded:\n '未配置 \"{engine}\" 的 API 密钥。\\n\\n 1. 设置环境变量 {envVar}\\n 2. 或内联提供:/search-engine {engine} <your-key>\\n 3. 或在 ~/.reasonix/config.json 中添加 \"{engine}ApiKey\"\\n\\n完成后重新执行 /search-engine {engine}。',\n keySaved: \" API 密钥已保存到配置。\",\n confirmed: '网页搜索引擎已设为 \"{engine}\"{detail}。下一轮模型调用将生效。',\n confirmedDetail: \"({endpoint})\",\n },\n skill: {\n listEmpty: \"未找到技能。Reasonix 从以下位置读取技能:\",\n listProjectScope:\n \" · <project>/.reasonix/skills/<name>/SKILL.md (或 <name>.md) — 项目范围\",\n listGlobalScope: \" · ~/.reasonix/skills/<name>/SKILL.md (或 <name>.md) — 全局范围\",\n listProjectOnly: \" (项目范围仅在 `reasonix code` 中活跃)\",\n listFrontmatter: \"每个文件的 frontmatter 至少需要 `name` 和 `description`。\",\n listInvoke: \"使用 `/skill <name> [args]` 调用技能,或让模型调用 `run_skill`。\",\n listHeader: \"用户技能({count}):\",\n listFooter: \"查看:/skill show <name> 运行:/skill <name> [args] 新建:/skill new <name>\",\n listEmptyNewHint:\n \"用 `/skill new <name>` 在项目范围下生成一个空白模板 — 暂无在线市场,技能需要自己写。\",\n showUsage: \"用法:/skill show <name>\",\n showNotFound: \"未找到技能:{name}\",\n runNotFound: \"未找到技能:{name} (尝试 /skill list)\",\n runInfo: \"▸ 正在运行技能:{name}{args}\",\n newUsage: \"用法:/skill new <name> [--global]\",\n newCreated: \"▸ 已创建技能:{name}\\n {path}\\n 编辑后用 `/skill {name}` 调用\",\n newError: \"▲ /skill new 失败:{reason}\",\n pathsHeader: \"技能路径(按优先级):\",\n pathsPriority:\n \"优先级:项目 > 配置顺序中的自定义路径 > 全局 > 内置。更改会在下次 /new 或新会话刷新系统提示词时生效。\",\n pathsUsage:\n \"用法:/skill paths [list]\\n /skill paths add <path>\\n /skill paths remove <path|N>\",\n pathsAddUsage: \"用法:/skill paths add <path>\",\n pathsRemoveUsage: \"用法:/skill paths remove <path|N>\",\n pathsAdded: \"▸ 已添加自定义技能路径:{path}\",\n pathsAlready: \"▸ 自定义技能路径已存在:{path}\",\n pathsRemoved: \"▸ 已移除自定义技能路径:{path}\",\n pathsRemoveNotFound: \"▸ 没有匹配的自定义技能路径:{target}\",\n pathsRestartHint: \"当前会话的系统提示词不会热更新;运行 /new 或启动新会话以刷新技能索引。\",\n },\n },\n statusBar: {\n turn: \"轮\",\n cache: \"缓存\",\n spent: \"已花费\",\n left: \" 剩余\",\n slow: \"慢速\",\n disconnect: \"断开\",\n reconnecting: \"重连中…\",\n approvingIn: \"即将批准,\",\n escToInterrupt: \"秒 · Esc 中断\",\n recordingGlyph: \"●REC\",\n mb: \" MB\",\n evt: \" 事件\",\n editsLabel: \"编辑:\",\n mcpLoading: \"MCP\",\n ctx: \"上下文\",\n shortcutsHint: \"Ctrl+P 快捷键\",\n },\n editMode: {\n plan: \"计划\",\n yolo: \"自由\",\n auto: \"自动\",\n review: \"审查\",\n writesGated: \" 已限制写入 · /plan off 解除\",\n editsShellAuto: \"编辑 + Shell 自动 · /undo 可回滚\",\n editsLandNow: \"编辑已生效 · 按 u 撤消\",\n queuedApplyDiscard: \"{count} 个待处理 · y 应用 · n 丢弃\",\n editsQueued: \"编辑已排队 · y 应用 · n 丢弃\",\n shiftTabFlip: \" {mid} · Shift+Tab 切换\",\n queuedDots: \"排队中…\",\n },\n composer: {\n placeholder: \"输入任何内容 · / 使用命令 · @ 引用文件\",\n waitingForResponse: \"…等待响应…\",\n hintSend: \"发送\",\n hintNewline: \"换行\",\n hintClear: \"清空\",\n hintScroll: \"滚动\",\n hintHistory: \"历史\",\n hintAbort: \"中止\",\n hintQuit: \"退出\",\n abortedHint: \"用户已中止本轮 · 再按 Esc 清除 · ⏎ 继续提问\",\n editorNoRawMode: \"外部编辑器不可用 — 当前终端不支持 raw-mode 切换\",\n editorFailed: \"外部编辑器:\",\n editorMissing:\n \"未设置 $EDITOR / $VISUAL / $GIT_EDITOR — 请导出环境变量(例如 `export EDITOR=nano`)后重试\",\n editorExited: \"编辑器异常退出,返回码 {code}\",\n typeaheadStaged: \"\\u25b8 {count} 行已暂存 \\u00b7 esc 召回\",\n steerPlaceholder: \"输入消息以引导当前任务 — 忙碌时不支持命令\",\n steerHint: \"发送 — 回合内注入\",\n stashNothing: \"没有可暂存的内容\",\n stashSaved: \"已暂存\",\n stashRecall: \"已恢复\",\n },\n pathConfirm: {\n title: \"沙箱外路径\",\n subtitleRead: \"{tool} 想要读取沙箱外的文件\",\n subtitleWrite: \"{tool} 想要写入沙箱外的文件\",\n awaiting: \"等待中\",\n denyTitle: \"拒绝 — 提供原因\",\n optional: \"可选\",\n denyFooter: \"输入原因 · ⏎ 提交 · Esc 跳过(直接拒绝)\",\n pickFooter: \"↑↓ 选择 · ⏎ 确认 · Tab 添加说明 · Esc 取消\",\n allowOnce: \"允许一次\",\n allowOnceDesc: \"本次允许,本会话内此目录不再询问\",\n allowAlways: \"始终允许\",\n allowAlwaysDesc: \"记住 `{prefix}`,本项目永久允许(写入 ~/.reasonix/config.json)\",\n deny: \"拒绝\",\n denyDesc: \"按 Tab 添加说明,告诉模型原因\",\n pathLabel: \"路径\",\n sandboxLabel: \"沙箱\",\n allowPrefixLabel: \"前缀\",\n promptTitleRead: \"访问路径 — 读取\",\n promptTitleWrite: \"访问路径 — 写入\",\n actionAllowRead: \"允许读取\",\n actionAllowWrite: \"允许写入\",\n actionAlwaysAllow: \"始终允许 — {prefix}\",\n actionDeny: \"拒绝\",\n },\n shellConfirm: {\n title: \"Shell 命令\",\n bgTitle: \"后台进程\",\n subtitle: \"模型请求执行 Shell 命令\",\n bgSubtitle: \"长时间运行 — 批准后持续运行,/kill 可停止\",\n denyTitle: \"拒绝 — 提供原因\",\n optional: \"可选\",\n denyFooter: \"输入原因 · ⏎ 提交 · Esc 跳过(直接拒绝)\",\n awaiting: \"等待中\",\n pickFooter: \"↑↓ 选择 · ⏎ 确认 · Tab 添加说明 · Esc 取消\",\n allowOnce: \"允许一次\",\n allowOnceDesc: \"执行此命令,下次再问\",\n allowAlways: \"始终允许\",\n allowAlwaysDesc: \"记住 `{prefix}`,本项目内不再询问\",\n deny: \"拒绝\",\n denyDesc: \"按 Tab 添加说明,告诉模型原因\",\n cwdLabel: \"工作目录\",\n timeoutLabel: \"超时\",\n waitLabel: \"等待\",\n previewMore: \"… 还有 {n} 行未显示 — 按 esc 取消,让模型拆分后再试\",\n previewMorePlural: \"… 还有 {n} 行未显示 — 按 esc 取消,让模型拆分后再试\",\n promptTitleRunCommand: \"运行命令\",\n promptTitleRunBackground: \"运行后台命令\",\n actionRunOnce: \"运行一次\",\n actionAlwaysAllow: \"始终允许 — {prefix}\",\n actionDeny: \"拒绝\",\n },\n editConfirm: {\n footer:\n \"[y/Enter] 应用 · [n] 拒绝并说明 · [a] 应用剩余 · [A] 切换 AUTO · [↑↓/Space] 滚动 · [Esc] 中止\",\n newTag: \"新增\",\n editTag: \"编辑\",\n linesCount: \"-{removed} +{added} 行\",\n viewingRange: \"正在查看 {start}-{end}/{total}\",\n denyFooter: \"⏎ 提交 · Esc 跳过(直接拒绝)\",\n oldLabel: \" 旧内容\",\n newLabel: \" 新内容\",\n sideBySide: \" 左右对比 · 左侧删除,右侧新增 · 按偏移配对\",\n linesAbove: \" ↑ 上方 {count} 行(↑/k 或 PgUp)\",\n linesAbovePlural: \" ↑ 上方 {count} 行(↑/k 或 PgUp)\",\n linesBelow: \" ↓ 下方 {count} 行(↓/j 或 Space/PgDn)\",\n linesBelowPlural: \" ↓ 下方 {count} 行(↓/j 或 Space/PgDn)\",\n },\n editPicker: {\n title: \"编辑之前的消息\",\n hint: \"↑↓ 选择 · Enter 加载到输入框 · Esc 取消\",\n empty: \"还没有用户发言 — 没什么可以编辑的\",\n dismiss: \"Esc 关闭\",\n forked: \"▸ 从第 #{turn} 轮分叉 — 原文已填回输入框\",\n },\n sessionPicker: {\n header: \" ◈ REASONIX · 选择会话 \",\n title: \"选择会话 — {workspace}\",\n messages: \"{count} 条消息\",\n messagesPlural: \"{count} 条消息\",\n turns: \"{count} 轮\",\n pickerHint: \"↑↓ 选择 · / 搜索 · ⏎ 打开 · [n] 新建 · [d] 删除 · [r] 重命名 · Esc 退出\",\n empty: \" 此工作区暂无已保存的会话 — 按 \",\n emptyNew: \" 开始新会话\",\n renamePrompt: ' 重命名 \"{from}\" → ',\n renameHint: \" ⏎ 确认重命名 · Esc 取消\",\n searchPrompt: \" 搜索会话:/\",\n searchHint: \" 输入过滤 · ⏎ 打开匹配项 · Esc 清除\",\n searchEmpty: \" 没有匹配的会话\",\n emptyHint: \" ⏎ 新建会话 · Esc 退出\",\n justNow: \"刚刚\",\n minAgo: \"{count} 分钟前\",\n yesterday: \"昨天\",\n hoursAgo: \"{count} 小时前\",\n daysAgo: \"{count} 天前\",\n },\n workspacePicker: {\n header: \" ◈ REASONIX · 选择工作区 \",\n title: \"选择工作区 — {workspace}\",\n sessions: \"{count} 个会话\",\n sessionsPlural: \"{count} 个会话\",\n current: \"当前\",\n pickerHint: \"↑↓ 选择 · / 搜索 · ⏎ 切换并选择会话 · Esc 退出 · /cwd <path> 添加\",\n empty: \" 暂无已知工作区 — 先运行一次 /cwd <path> 添加\",\n searchPrompt: \" 搜索工作区:/\",\n searchHint: \" 输入过滤 · ⏎ 切换并选择会话 · Esc 清除\",\n searchEmpty: \" 没有匹配的工作区\",\n },\n modelPicker: {\n header: \" ◈ REASONIX · 选择配置 \",\n loading: \" · 加载目录…\",\n catalogEmpty: \" · 目录为空 — 使用已知备选\",\n modelsAvailable: \" · {count} 个模型可用\",\n effortHeader: \" 强度 · reasoning_effort 上限\",\n modelsHeader: \" 模型 · DeepSeek 兼容 ID\",\n effortDesc: {\n low: \"最快 — 极少推理\",\n medium: \"平衡\",\n high: \"默认 — vLLM / Azure 安全\",\n max: \"DeepSeek 扩展;OpenAI / vLLM 会拒绝\",\n },\n pickerFooter: \" ↑↓ 选择 · ⏎ 确认 · [r] 刷新 · Esc 取消\",\n currentLabel: \" · 当前\",\n },\n slashSuggestions: {\n noMatch: \"没有匹配此前缀的斜杠命令\",\n backspaceHint: \" — 按 Backspace 修改,或 /help 查看完整列表\",\n commandCount: \"{count} 个命令\",\n commandCountPlural: \"{count} 个命令\",\n aboveLabel: \" ↑ {count} 个以上\",\n belowLabel: \" ↓ {count} 个以下\",\n advancedHint: \" + {count} 个高级命令 · 输入字母搜索\",\n footerHint: \" ↑↓ 导航 · Tab / ⏎ 选择 · Esc 取消\",\n groupChat: \"聊天\",\n groupSetup: \"设置\",\n groupInfo: \"信息\",\n groupSession: \"会话\",\n groupExtend: \"扩展\",\n groupCode: \"代码\",\n groupJobs: \"任务\",\n groupAdvanced: \"高级\",\n groupDetailSetup: \"模型 + 成本\",\n groupDetailInfo: \"当前状态\",\n groupDetailChat: \"日常聊天操作\",\n groupDetailExtend: \"MCP, 记忆, 技能\",\n groupDetailSession: \"已保存的会话\",\n groupDetailCode: \"编辑 + 计划 (代码模式)\",\n groupDetailJobs: \"后台进程 (代码模式)\",\n groupDetailAdvanced: \"高级或一次性设置\",\n },\n atMentions: {\n loading: \"加载中…\",\n entrySingular: \"{count} 条\",\n entryPlural: \"{count} 条\",\n searching: \"搜索中…\",\n scanned: \"已扫描\",\n match: \"个匹配\",\n matches: \"个匹配\",\n forFilter: '匹配 \"{filter}\"',\n noMatch: '没有匹配 \"{filter}\" 的文件',\n emptyDir: \"空目录\",\n scanning: \"正在扫描目录树…\",\n footerBrowse: \"↑↓ 导航 · Tab 进入文件夹 · ⏎ 插入 · Esc 取消\",\n footerBrowseSearch: \"↑↓ 导航 · Tab / ⏎ 以 @path 插入 · Esc 取消\",\n footerInsert: \"↑↓ 导航 · Tab / ⏎ 以 @path 插入 · Esc 取消\",\n },\n statsPanel: {\n modePlan: \"计划\",\n modeYolo: \"自由\",\n modeAuto: \"自动\",\n modeReview: \"审查\",\n pro: \"⇧ 专业\",\n budget: \" 预算 \",\n },\n welcomeBanner: {\n workspace: \"▸ 工作区\",\n relaunchHint: \"(重启时用 --dir <path> 切换)\",\n dashboard: \"▸ 网页\",\n },\n ctxBreakdown: {\n title: \"▣ 上下文\",\n compactHint: \" /compact 折叠(超过 50% 自动触发)· /new 清空日志\",\n topTools: \" 常用工具(按成本排序,{count} 个):\",\n msg: \"条\",\n turnLabel: \"轮\",\n },\n startup: {\n codeRooted:\n '▸ reasonix code:根目录 {rootDir},会话 \"{session}\" · {tools} 个原生工具{semantic}',\n ephemeral: \"(临时)\",\n semanticOn: \" · 语义搜索已开启\",\n },\n doctorErrors: {\n unreadable: \"{path} 无法读取 — {message}\",\n cannotList: \"无法列出 — {message}\",\n parseFailed: \"无法解析 settings.json — {message}\",\n probeFailed: \"探测失败 — {message}\",\n },\n webErrors: {\n status:\n \"web_search {status} — try: 搜索后端返回错误;请改写查询,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n rateLimit429:\n \"web_search 429 — try: 等待 10 秒后重试,或改写查询;搜索后端正在对该客户端进行限流\",\n forbidden403:\n \"web_search 403 — try: 搜索后端拒绝该客户端访问;使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎,或稍后重试\",\n serverError5xx:\n \"web_search {status} — try: 在浏览器中打开搜索 URL;若能加载则属临时故障,等 30 秒重试即可\",\n bingBlocked:\n \"web_search: Bing 反爬页面 — 频率限制或被屏蔽 — try: 等待 30 秒后重试,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n bingNoResults:\n \"web_search: 返回 0 条结果但响应看起来不是正常空结果页({chars} 字符,前 120 字符:{preview})— try: 使用更简单的关键词改写查询,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n invalidEndpoint:\n 'web_search: 无效的 SearXNG 端点 \"{endpoint}\" — try: 使用 /search-endpoint http://host:port 设置有效的 URL',\n endpointMustBeHttp:\n \"web_search: SearXNG 端点必须是 http(s) 协议,当前为 {protocol} — try: 使用 /search-endpoint http://host:port 设置有效的 URL\",\n cannotReach:\n \"web_search: 无法访问 SearXNG 服务器 {endpoint} — try: 安装并启动 SearXNG(https://github.com/searxng/searxng,例如 `docker run -d -p 8080:8080 searxng/searxng`),或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n searxngNoResults:\n \"web_search: 返回 0 条结果但 SearXNG 响应看起来不是正常空结果页({chars} 字符)— try: 使用更简单的关键词改写查询,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n metasoMissingKey:\n \"web_search: Metaso 需要 API 密钥 — 设置 METASO_API_KEY,或使用 /search-engine metaso <key> 配置;可在 https://metaso.cn/search-api/playground 获取密钥\",\n metasoDailyLimit:\n \"web_search: Metaso 每日搜索次数已达上限 — 设置 METASO_API_KEY,或在 https://metaso.cn/search-api/playground 获取密钥\",\n metasoUnauthorized:\n \"web_search: Metaso API 密钥被拒绝 — 检查 METASO_API_KEY,或在 https://metaso.cn/search-api/playground 获取密钥\",\n metasoRateLimit:\n \"web_search: Metaso 请求频率限制 — 等待后重试,或在 https://metaso.cn/search-api/playground 获取自己的密钥\",\n metasoServerError:\n \"web_search: Metaso 服务器错误({status})— 稍后重试,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n metasoParseError: \"web_search: Metaso 返回无法解析的响应(HTTP {status})— 稍后重试\",\n metasoApiError: \"web_search: Metaso API 错误(code {code}: {message})— 稍后重试\",\n tavilyMissingKey:\n \"web_search: Tavily 后端需要 API 密钥 — 设置 TAVILY_API_KEY 环境变量,或在 ~/.reasonix/config.json 中配置 `tavilyApiKey`;https://tavily.com 每月 1000 次免费\",\n tavilyUnauthorized:\n \"web_search: Tavily API 密钥被拒绝 — 检查 TAVILY_API_KEY,或在 https://tavily.com 获取密钥\",\n tavilyRateLimit:\n \"web_search: Tavily 请求频率限制或月度配额用尽 — 等待、用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎,或升级 Tavily 计划\",\n tavilyServerError:\n \"web_search: Tavily 服务器错误({status})— 稍后重试,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n tavilyParseError: \"web_search: Tavily 返回无法解析的响应(HTTP {status})— 稍后重试\",\n perplexityMissingKey:\n \"web_search: Perplexity 后端需要 API 密钥 — 设置 PERPLEXITY_API_KEY 环境变量,或在 ~/.reasonix/config.json 中配置 `perplexityApiKey`;在 https://perplexity.ai/settings/api 获取密钥\",\n perplexityUnauthorized:\n \"web_search: Perplexity API 密钥被拒绝 — 检查 PERPLEXITY_API_KEY,或在 https://perplexity.ai/settings/api 获取密钥\",\n perplexityRateLimit:\n \"web_search: Perplexity 请求频率限制 — 等待后重试,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n perplexityServerError:\n \"web_search: Perplexity 服务器错误({status})— 稍后重试,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n perplexityParseError: \"web_search: Perplexity 返回无法解析的响应(HTTP {status})— 稍后重试\",\n exaMissingKey:\n \"web_search: Exa 后端需要 API 密钥 — 设置 EXA_API_KEY 环境变量,或在 ~/.reasonix/config.json 中配置 `exaApiKey`;https://exa.ai 每月 1000 次免费\",\n exaUnauthorized:\n \"web_search: Exa API 密钥被拒绝 — 检查 EXA_API_KEY,或在 https://exa.ai 获取密钥\",\n exaRateLimit:\n \"web_search: Exa 请求频率限制或月度配额用尽 — 等待升级,或在 https://exa.ai/pricing 查看计划\",\n exaServerError:\n \"web_search: Exa 服务器错误({status})— 稍后重试,或使用 /search-engine bing|searxng|metaso|tavily|perplexity|exa 切换引擎\",\n exaParseError: \"web_search: Exa 返回无法解析的响应(HTTP {status})— 稍后重试\",\n fetchStatus:\n \"web_fetch {status} for {url} — try: 在浏览器中确认该 URL 能否访问;该状态码表明目标主机返回了错误页面\",\n fetchRateLimit429:\n \"web_fetch 429 for {url} — try: 等待 10 秒后重试;目标主机正在对该客户端进行限流\",\n fetchForbidden403:\n \"web_fetch 403 for {url} — try: 目标主机拒绝该客户端访问;该页面可能需要登录或屏蔽爬虫 — 改用 web_search 摘要\",\n fetchServerError5xx:\n \"web_fetch {status} for {url} — try: 在浏览器中打开该 URL;若能加载则属临时故障,等 30 秒重试即可\",\n fetchTimeout:\n \"web_fetch: timed out after {ms}ms for {url} — try: 更短的 URL 或更小的内容;可能是 CDN 较慢,或重试一次\",\n fetchTooLarge:\n \"web_fetch 拒绝:content-length {len} 字节超过上限 {cap} 字节({url})— try: 改换其他 URL 获取较小的内容;该页面过大无法获取\",\n fetchBodyTooLarge:\n \"web_fetch 拒绝:响应体超过 {cap} 字节上限(已接收 {seen} 字节)— try: 改换其他 URL 获取较小的内容;该页面流式传输超出大小上限\",\n fetchInvalidUrl:\n \"web_fetch: URL 必须以 http:// 或 https:// 开头 — try: 传入绝对的 http(s) URL(该 URL 格式错误或使用了不支持的协议)\",\n },\n choiceConfirm: {\n customLabel: \"自定义回答\",\n customDesc: \"以上选项都不合适 — 输入自由格式回复,模型会原样读取\",\n cancelLabel: \"取消 — 放弃问题\",\n cancelDesc: \"模型停止并询问你真正的需求\",\n },\n cardTitles: {\n usage: \"用量\",\n context: \"上下文\",\n search: \"搜索\",\n subagent: \"子代理\",\n reply: \"回复\",\n reasoning: \"推理中\",\n reasoningAborted: \"推理(已中止)\",\n reasoningEllipsis: \"推理中…\",\n error: \"错误\",\n doctor: \"环境诊断\",\n you: \"你\",\n task: \"任务\",\n },\n cardLabels: {\n prompt: \"提示\",\n reason: \"推理\",\n output: \"输出\",\n cache: \"缓存\",\n session: \"会话\",\n balance: \"余额\",\n turn: \"轮\",\n system: \"系统\",\n tools: \"工具\",\n log: \"日志\",\n input: \"输入\",\n topTools: \"常用工具\",\n logMsgs: \"日志消息\",\n hitSingular: \"{count} 条结果 · {files} 个文件\",\n hitsPlural: \"{count} 条结果 · {files} 个文件\",\n moreHitSingular: \"⋮ +{count} 条结果\",\n moreHitsPlural: \"⋮ +{count} 条结果\",\n earlierLine: \"⋮ {count} 行已隐藏(Ctrl+R 查看完整输出)\",\n earlierLines: \"⋮ {count} 行已隐藏(Ctrl+R 查看完整输出)\",\n hiddenLine: \"⋮ {count} 行已隐藏\",\n hiddenLines: \"⋮ {count} 行已隐藏\",\n earlierStackLine: \"⋮ 前 {count} 行堆栈已隐藏\",\n earlierStackLines: \"⋮ 前 {count} 行堆栈已隐藏\",\n agent: \"代理 · {name}\",\n response: \"回复\",\n writing: \"输出中 …\",\n tok: \"tok\",\n pilcrow: \"¶\",\n aborted: \"已中止\",\n truncatedByEsc: \"[已被 Esc 截断]\",\n rejected: \"已拒绝\",\n exit: \"退出码 {code}\",\n bytesIn: \"{bytes} 输入\",\n elapsedSec: \"{secs}秒\",\n stackTrace: \"堆栈跟踪\",\n retries: \"次重试\",\n reasoningLabel: \"推理 · {count} ¶\",\n runningLabel: \"运行中\",\n workingLabel: \"处理中\",\n defaultFooter: \"↑↓ 选择 · ⏎ 确认 · Esc 取消\",\n applyAction: \"[a] 应用\",\n skipAction: \"[s] 跳过\",\n rejectAction: \"[r] 拒绝\",\n levelOk: \"正常\",\n levelWarn: \"警告\",\n levelFail: \"失败\",\n checksLabel: \"检查项\",\n passed: \"通过\",\n warnTag: \"警告\",\n failTag: \"失败\",\n stepLabel: \"步骤\",\n done: \"已完成\",\n inProgress: \"← 进行中\",\n upcoming: \"待处理\",\n resumed: \"已恢复 · \",\n archive: \"⏪ 归档 · \",\n more: \"⋮ +{count} 更多\",\n categoryUser: \"用户\",\n categoryFeedback: \"反馈\",\n categoryProject: \"项目\",\n categoryReference: \"参考\",\n },\n mcpHealth: {\n noData: \"无检查数据\",\n healthy: \"正常 \\u00b7 {ms}ms\",\n slow: \"缓慢 \\u00b7 {ms}ms\",\n verySlow: \"非常慢 \\u00b7 {ms}ms\",\n slowToast: \"\\u26a0 MCP `{name}` 响应缓慢 \\u00b7 P95 {seconds}s \\u00b7 最近 {sampleSize} 次调用\",\n emptyHint:\n \"\\u2139 未配置 MCP 服务器 —— 可尝试:`reasonix setup` 重新选择,或 `reasonix mcp install filesystem` · shell 命令按次审批(allow once / allow always / deny),无全局放行\",\n },\n denyContextInput: {\n description: \"告诉模型你为什么拒绝了。模型下次会看到你的理由作为额外的上下文。\",\n },\n cardStream: {\n scrollAbove: \" \\u2191 {scroll}/{max} 行\",\n scrollAbovePlural: \" \\u2191 {scroll}/{max} 行\",\n scrollMore: \" \\u2014 还有 {remaining} 行\",\n scrollPgUp: \" \\u00b7 PgUp/\\u6eda\\u8f6e\",\n scrollCopy: \" \\u00b7 /copy \\u8fdb\\u5165\\u590d\\u5236\\u6a21\\u5f0f\",\n },\n slashArgPicker: {\n noMatch: '\\u6ca1\\u6709\\u5339\\u914d \"{partial}\"',\n keepTyping: \" \\u2014 \\u7ee7\\u7eed\\u8f93\\u5165\\uff0c\\u6216 Backspace \\u4fee\\u6539\",\n above: \" \\u2191 \\u8fd8\\u6709 {hidden} \\u4e2a\",\n below: \" \\u2193 \\u8fd8\\u6709 {hidden} \\u4e2a\",\n footer: \" \\u2191\\u2193 \\u5bfc\\u822a \\u00b7 Tab/\\u23ce \\u9009\\u62e9 \\u00b7 Esc \\u53d6\\u6d88\",\n },\n mcpMarketplace: {\n title: \"MCP 市场\",\n filter: \"筛选:\",\n filterPlaceholder: \"(输入筛选)\",\n matchSingular: \"{n} 条匹配\",\n matchPlural: \"{n} 条匹配\",\n loading: \"加载中…\",\n noEntries: \"无条目\",\n opening: \"正在打开注册表…\",\n cached: \" · 已缓存\",\n exhausted: \" · 已耗尽\",\n loadingMore: \"加载更多…\",\n allLoaded: \"所有页面已加载\",\n fetchingDetail: \"正在获取 smithery 详情…\",\n noInstallInfo: \"没有 {name} 的安装信息 — 试试 `npx -y @smithery/cli install {name}`\",\n alreadyInstalled: \"已安装:{spec}\",\n installed: \"已安装 → {spec}\",\n uninstalled: \"已卸载 {name}\",\n installFailed: \"安装失败:{message}\",\n notInstalled: \"未安装:{name}\",\n bridged: \"✓ 已安装 {name} — 已桥接\",\n bridgeFailed: \"▲ 已安装 {name} — 桥接失败:{reason}\",\n bridgeReloadFailed: \"✓ 已安装 {name} — 重启 `reasonix code` 以桥接(重载失败:{message})\",\n restartBridge: \"✓ 已安装 {name} — 重启 `reasonix code` 以桥接\",\n needsEnv: \" · 需要环境变量:{env}\",\n badgeOfficial: \"[官方]\",\n badgeSmithery: \"[三方]\",\n badgeLocal: \"[本地]\",\n footerHint: \"输入筛选 · ↑↓ 选择 · ⏎ 安装/切换 · PgDn 加载更多 · Esc 关闭\",\n specLine: \"配置:{runtime} {id} \\u00b7 {transport}\",\n smitheryDetail: \"(smithery 列表 \\u2014 按 Enter 获取安装详情)\",\n statusError: \"错误:{message}\",\n },\n mcpBrowser: {\n title: \"◈ MCP 浏览器\",\n empty: \"没有挂载 MCP 服务器。运行 `reasonix setup` 选择一些,或使用 --mcp 启动。\",\n serverCount: \"{count} 个服务器\",\n footer: \"↑↓ 选择 · [r] 重连 · [d] 禁用 · Esc 退出\",\n },\n mcpBrowse: {\n noResources: \"没有任何已连接 MCP 服务器上的资源(或无服务器连接)。`/mcp` 显示当前列表。\",\n readOne: \"读取:`/resource <uri>` — 或在选择器中使用 Tab 键。\",\n noPrompts: \"没有任何已连接 MCP 服务器上的提示(或无服务器连接)。`/mcp` 显示当前列表。\",\n fetchOne: \"获取:`/prompt <name>` — 暂不支持参数;带必需参数的提示将返回服务器错误。\",\n noServerForResource: '没有服务器暴露资源 \"{name}\"',\n resourceHint: \"`/resource` 不带参数可查看可用列表。\",\n readFailed: \"读取资源失败\",\n noServerForPrompt: '没有服务器暴露 prompt \"{name}\"',\n promptHint: \"`/prompt` 不带参数可查看可用列表。\",\n fetchFailed: \"获取 prompt 失败\",\n },\n mcpLifecycle: {\n handshake: \"握手中…\",\n connected: \"已连接\",\n failed: \"失败\",\n disabled: \"已禁用\",\n reconnect: \"重连中…\",\n initDetail: \"初始化 → tools/list → resources/list\",\n reconnectDetail: \"断开旧连接 · 重新握手 · 列出工具\",\n disabledDetail: \"通过 /mcp disable {name}\",\n failedSetupHint: \"→ 运行 `reasonix setup` 移除此条目,或修复底层问题(缺少 npm 包、网络等)。\",\n failedSetupConfigHint: \"→ 运行 `reasonix setup` 从已保存配置中移除损坏的条目。\",\n abortedHint: \"已中断 MCP 启动 — 跳过 {count} 个服务器。问题修复后用 /mcp 重新连接。\",\n toolsReady: \"工具就绪\",\n warnLabel: \"警告\",\n },\n checkpointPicker: {\n title: \"恢复检查点 \\u2014 {workspace}\",\n header: \" \\u25c8 REASONIX \\u00b7 选择检查点 \",\n empty: \" 此工作区暂无检查点 — 参见 /checkpoint 创建\",\n more: \" … 还有 {hidden} 个\",\n footer: \" ↑↓ 选择 · ⏎ 恢复 · [d] 删除 · Esc 退出\",\n footerEmpty: \" Esc 退出\",\n },\n planReviseConfirm: {\n title: \"计划修改已提交\",\n metaRight: \"−{removed} +{added} · {kept} 个保留\",\n updatedSummary: \"更新摘要:{summary}\",\n acceptLabel: \"接受修改 — 应用新的步骤列表\",\n acceptHint: \"用新步骤替换剩余计划。已完成的步骤不变。\",\n rejectLabel: \"拒绝 — 保留原计划\",\n rejectHint: \"放弃修改。模型继续按原步骤执行。\",\n },\n diffApp: {\n title: \"reasonix diff\",\n turnLabel: \"第 {turn} 轮({current}/{total})\",\n turnsAligned: \"{count} 轮已对齐\",\n paneEmpty: \"(此轮该侧无记录)\",\n kindMatch: \"✓ 一致\",\n kindDiverge: \"★ 分歧\",\n kindOnlyInA: \"← 仅 A 有\",\n kindOnlyInB: \"→ 仅 B 有\",\n },\n recordView: {\n userPrefix: \"你 › \",\n assistant: \"助手\",\n toolPrefix: \"tool<\",\n argsLabel: \" 参数:\",\n resultArrow: \" → \",\n error: \"错误 \",\n cache: \" · 缓存 \",\n toolCallOnly: \"(仅工具调用响应)\",\n truncateExtra: \"(+{extra} 字符)\",\n },\n replayApp: {\n emptyTranscript: \"空记录\",\n turnProgress: \"第 {current}/{total} 轮\",\n noRecords: \"无记录\",\n untracked: \"(未追踪)\",\n churned: \"(已变更 ×{count})\",\n },\n builtinSkills: {\n explore: \"在隔离子 agent 中探索代码库 — 只读宽网调查,返回一个精炼结论\",\n research: \"结合代码阅读与网络搜索进行调研 — 在隔离子 agent 中综合信息并返回结论\",\n review: \"审查当前分支变更 — 检查正确性、安全性、缺失测试、隐藏行为变更\",\n securityReview: \"安全专项审查 — 标记注入/认证/密钥/反序列化/路径穿越/加密问题\",\n test: \"运行测试套件并诊断失败 — 自动识别测试框架,修复后重跑直至通过\",\n },\n shortcutsHelp: {\n title: \"快捷键\",\n groupInput: \"输入\",\n groupNavigation: \"导航\",\n groupSession: \"会话\",\n groupSystem: \"系统\",\n descEnter: \"发送消息\",\n descShiftEnter: \"换行\",\n descCtrlEnter: \"换行\",\n descCtrlJ: \"换行\",\n descCtrlU: \"清空输入\",\n descCtrlW: \"删除单词\",\n descCtrlP: \"显示/隐藏快捷键\",\n descCtrlX: \"在编辑器中打开\",\n descArrows: \"浏览输入历史\",\n descPgUpDown: \"翻页\",\n descCtrlL: \"清屏\",\n descCtrlB: \"切换侧边栏\",\n descNewSession: \"新建会话\",\n descListSessions: \"列出会话\",\n descSwitchModel: \"切换模型\",\n descSwitchEffort: \"切换推理强度\",\n descSwitchTheme: \"切换主题\",\n descCtrlC: \"退出\",\n descEsc: \"停止/取消\",\n descCtrlR: \"切换详细模式\",\n descCtrlO: \"展开回复(仅流式输出期间)\",\n descHelp: \"显示所有命令\",\n descShiftTab: \"切换编辑模式\",\n descAltS: \"暂存/恢复输入\",\n },\n mcpCli: {\n bundledCatalog: \"已打包的 MCP 服务器(离线目录):\",\n justFetched: \"刚刚获取\",\n cachedAge: \"缓存,{age}\",\n moreAvailable: \"还有更多\",\n allLoaded: \"已全部加载\",\n morePagesAvailable: \"▸ 还有更多页可用 — `reasonix mcp list --pages <n>` 或 --all\",\n installHint: \"安装:reasonix mcp install <name>\",\n usageSearch: \"用法:reasonix mcp search <query>\",\n usageInstall: \"用法:reasonix mcp install <name>\",\n noMatchesFor: '未找到 \"{q}\" 的匹配项(已检索 {count} 条记录,来源:{source})',\n matchCount: '在 {source} 中找到 {count} 条 \"{q}\" 的匹配项(已扫描 {loaded} 条记录):',\n moreLoaded: \"… 还有 {count} 条已加载 — 使用 `reasonix mcp search <query>` 筛选\",\n moreMatches: \"… 还有 {count} 条匹配项\",\n installed: \"已安装:{spec}\",\n noServerFound: '在 {source} 中遍历了 {pages} 页后未找到名为 \"{target}\" 的 MCP 服务器。',\n noServerTryMore: \"试试:reasonix mcp install {target} --max-pages 100\",\n noInstallMeta: '无法为 \"{name}\" 获取安装元数据 — 试试 `npx -y @smithery/cli install {name}`。',\n buildSpecFailed: \"无法为 {name} 构建安装 spec:{message}\",\n alreadyInstalled: \"已安装:{spec}\",\n },\n};\n","import { loadLanguage, saveLanguage } from \"../config.js\";\nimport { EN } from \"./EN.js\";\nimport type { LanguageCode, TranslationSchema } from \"./types.js\";\nimport { zhCN } from \"./zh-CN.js\";\n\nconst translations: Record<LanguageCode, TranslationSchema> = {\n EN,\n \"zh-CN\": zhCN,\n};\n\n/** Map a system locale (e.g. \"zh-CN\", \"en-US\") to a supported LanguageCode, or null. */\nexport function detectSystemLanguage(\n locale: string = Intl.DateTimeFormat().resolvedOptions().locale,\n): LanguageCode | null {\n if (locale.startsWith(\"zh\")) return \"zh-CN\";\n if (locale.startsWith(\"en\")) return \"EN\";\n return null;\n}\n\nlet currentLang: LanguageCode = loadLanguage() ?? detectSystemLanguage() ?? \"EN\";\n\ntype Listener = () => void;\nconst listeners: Listener[] = [];\n\nexport function onLanguageChange(cb: Listener): () => void {\n listeners.push(cb);\n return () => {\n const i = listeners.indexOf(cb);\n if (i >= 0) listeners.splice(i, 1);\n };\n}\n\nexport function notifyLanguageChange(): void {\n for (const cb of listeners) cb();\n}\n\nexport function setLanguage(lang: LanguageCode): void {\n if (translations[lang]) {\n currentLang = lang;\n saveLanguage(lang);\n }\n}\n\n/** Set language for the current process only (no disk write). Used by tests. */\nexport function setLanguageRuntime(lang: LanguageCode): void {\n if (translations[lang]) {\n currentLang = lang;\n }\n}\n\nexport function getLanguage(): LanguageCode {\n return currentLang;\n}\n\nexport function getSupportedLanguages(): LanguageCode[] {\n return Object.keys(translations) as LanguageCode[];\n}\n\n/** Returns a structured (non-string) translation entry — for tables / row objects passed to TipCard etc. */\nexport function tObj<T>(path: string): T {\n const parts = path.split(\".\");\n let val: unknown = translations[currentLang] || translations.EN;\n for (const part of parts) {\n val = (val as Record<string, unknown> | undefined)?.[part];\n if (val === undefined) break;\n }\n if (val === undefined && currentLang !== \"EN\") {\n val = translations.EN;\n for (const part of parts) {\n val = (val as Record<string, unknown> | undefined)?.[part];\n if (val === undefined) break;\n }\n }\n return val as T;\n}\n\n/** Simple t() — nested keys (e.g. \"common.error\") + param replacement (e.g. \"{code}\"). */\nexport function t(path: string, params?: Record<string, string | number>): string {\n const parts = path.split(\".\");\n let val: any = translations[currentLang] || translations.EN;\n\n for (const part of parts) {\n val = val?.[part];\n if (val === undefined) break;\n }\n\n // Fallback to English if not found in current language\n if (val === undefined && currentLang !== \"EN\") {\n val = translations.EN;\n for (const part of parts) {\n val = val?.[part];\n if (val === undefined) break;\n }\n }\n\n if (typeof val !== \"string\") {\n return path;\n }\n\n if (params) {\n let result = val;\n for (const [k, v] of Object.entries(params)) {\n result = result.replace(new RegExp(`\\\\{${k}\\\\}`, \"g\"), String(v));\n }\n return result;\n }\n\n return val;\n}\n"],"mappings":"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","names":[]}