luckerr 0.41.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 (156) hide show
  1. package/README.md +267 -0
  2. package/README.zh-CN.md +237 -0
  3. package/dashboard/app.css +3022 -0
  4. package/dashboard/dist/app.js +30137 -0
  5. package/dashboard/dist/app.js.map +1 -0
  6. package/dashboard/dist/vendor-hljs.css +10 -0
  7. package/dashboard/dist/vendor-uplot.css +1 -0
  8. package/dashboard/index.html +19 -0
  9. package/data/deepseek-tokenizer.json.gz +0 -0
  10. package/dist/cli/acp-EOOAI4F5.js +712 -0
  11. package/dist/cli/acp-EOOAI4F5.js.map +1 -0
  12. package/dist/cli/chat-7J6GJXL2.js +51 -0
  13. package/dist/cli/chat-7J6GJXL2.js.map +1 -0
  14. package/dist/cli/chunk-2425HK6U.js +54 -0
  15. package/dist/cli/chunk-2425HK6U.js.map +1 -0
  16. package/dist/cli/chunk-25T6CVUP.js +172 -0
  17. package/dist/cli/chunk-25T6CVUP.js.map +1 -0
  18. package/dist/cli/chunk-2UQP6H6T.js +31 -0
  19. package/dist/cli/chunk-2UQP6H6T.js.map +1 -0
  20. package/dist/cli/chunk-56OAJILV.js +47 -0
  21. package/dist/cli/chunk-56OAJILV.js.map +1 -0
  22. package/dist/cli/chunk-5FTI4KXH.js +150 -0
  23. package/dist/cli/chunk-5FTI4KXH.js.map +1 -0
  24. package/dist/cli/chunk-5TWQD73O.js +2846 -0
  25. package/dist/cli/chunk-5TWQD73O.js.map +1 -0
  26. package/dist/cli/chunk-653BOCMK.js +40 -0
  27. package/dist/cli/chunk-653BOCMK.js.map +1 -0
  28. package/dist/cli/chunk-6ALJTWWQ.js +2663 -0
  29. package/dist/cli/chunk-6ALJTWWQ.js.map +1 -0
  30. package/dist/cli/chunk-6DRKA2IL.js +341 -0
  31. package/dist/cli/chunk-6DRKA2IL.js.map +1 -0
  32. package/dist/cli/chunk-6LV63NJV.js +634 -0
  33. package/dist/cli/chunk-6LV63NJV.js.map +1 -0
  34. package/dist/cli/chunk-74EX7SUH.js +25293 -0
  35. package/dist/cli/chunk-74EX7SUH.js.map +1 -0
  36. package/dist/cli/chunk-74U5RKTX.js +60611 -0
  37. package/dist/cli/chunk-74U5RKTX.js.map +1 -0
  38. package/dist/cli/chunk-ANJSUESV.js +143 -0
  39. package/dist/cli/chunk-ANJSUESV.js.map +1 -0
  40. package/dist/cli/chunk-DB2Z3DKZ.js +54 -0
  41. package/dist/cli/chunk-DB2Z3DKZ.js.map +1 -0
  42. package/dist/cli/chunk-DDIH3ZAA.js +400 -0
  43. package/dist/cli/chunk-DDIH3ZAA.js.map +1 -0
  44. package/dist/cli/chunk-ELN3Z3B2.js +621 -0
  45. package/dist/cli/chunk-ELN3Z3B2.js.map +1 -0
  46. package/dist/cli/chunk-F6BSQJGV.js +200 -0
  47. package/dist/cli/chunk-F6BSQJGV.js.map +1 -0
  48. package/dist/cli/chunk-FET2UAG5.js +246 -0
  49. package/dist/cli/chunk-FET2UAG5.js.map +1 -0
  50. package/dist/cli/chunk-FFJ342IJ.js +190 -0
  51. package/dist/cli/chunk-FFJ342IJ.js.map +1 -0
  52. package/dist/cli/chunk-GB3247B6.js +130 -0
  53. package/dist/cli/chunk-GB3247B6.js.map +1 -0
  54. package/dist/cli/chunk-HC2J4U3G.js +373 -0
  55. package/dist/cli/chunk-HC2J4U3G.js.map +1 -0
  56. package/dist/cli/chunk-HRUZAIHQ.js +42 -0
  57. package/dist/cli/chunk-HRUZAIHQ.js.map +1 -0
  58. package/dist/cli/chunk-J3ZJFUDL.js +308 -0
  59. package/dist/cli/chunk-J3ZJFUDL.js.map +1 -0
  60. package/dist/cli/chunk-J5XJHLWM.js +55 -0
  61. package/dist/cli/chunk-J5XJHLWM.js.map +1 -0
  62. package/dist/cli/chunk-JFGLMRZ6.js +160 -0
  63. package/dist/cli/chunk-JFGLMRZ6.js.map +1 -0
  64. package/dist/cli/chunk-JMBMLOBP.js +26 -0
  65. package/dist/cli/chunk-JMBMLOBP.js.map +1 -0
  66. package/dist/cli/chunk-JMWHXZEL.js +551 -0
  67. package/dist/cli/chunk-JMWHXZEL.js.map +1 -0
  68. package/dist/cli/chunk-KEQGPJBO.js +209 -0
  69. package/dist/cli/chunk-KEQGPJBO.js.map +1 -0
  70. package/dist/cli/chunk-M4K6U37F.js +232 -0
  71. package/dist/cli/chunk-M4K6U37F.js.map +1 -0
  72. package/dist/cli/chunk-MIJI2WMN.js +95 -0
  73. package/dist/cli/chunk-MIJI2WMN.js.map +1 -0
  74. package/dist/cli/chunk-MPAO3JNR.js +128 -0
  75. package/dist/cli/chunk-MPAO3JNR.js.map +1 -0
  76. package/dist/cli/chunk-PZOFBEDC.js +873 -0
  77. package/dist/cli/chunk-PZOFBEDC.js.map +1 -0
  78. package/dist/cli/chunk-RAILYQLN.js +46 -0
  79. package/dist/cli/chunk-RAILYQLN.js.map +1 -0
  80. package/dist/cli/chunk-RR35VQVT.js +90 -0
  81. package/dist/cli/chunk-RR35VQVT.js.map +1 -0
  82. package/dist/cli/chunk-RRA7VPW4.js +417 -0
  83. package/dist/cli/chunk-RRA7VPW4.js.map +1 -0
  84. package/dist/cli/chunk-RU36QVN3.js +452 -0
  85. package/dist/cli/chunk-RU36QVN3.js.map +1 -0
  86. package/dist/cli/chunk-RUBIINXR.js +1819 -0
  87. package/dist/cli/chunk-RUBIINXR.js.map +1 -0
  88. package/dist/cli/chunk-S4XVGLRW.js +499 -0
  89. package/dist/cli/chunk-S4XVGLRW.js.map +1 -0
  90. package/dist/cli/chunk-TUK7OWJA.js +51 -0
  91. package/dist/cli/chunk-TUK7OWJA.js.map +1 -0
  92. package/dist/cli/chunk-VALDDV76.js +580 -0
  93. package/dist/cli/chunk-VALDDV76.js.map +1 -0
  94. package/dist/cli/chunk-WQOGPYGN.js +11390 -0
  95. package/dist/cli/chunk-WQOGPYGN.js.map +1 -0
  96. package/dist/cli/chunk-WREKDFXT.js +34320 -0
  97. package/dist/cli/chunk-WREKDFXT.js.map +1 -0
  98. package/dist/cli/chunk-Y7XQU2EL.js +270 -0
  99. package/dist/cli/chunk-Y7XQU2EL.js.map +1 -0
  100. package/dist/cli/chunk-YBVCZJU4.js +54 -0
  101. package/dist/cli/chunk-YBVCZJU4.js.map +1 -0
  102. package/dist/cli/chunk-YLIHDXUQ.js +749 -0
  103. package/dist/cli/chunk-YLIHDXUQ.js.map +1 -0
  104. package/dist/cli/chunk-YV5XXFD7.js +767 -0
  105. package/dist/cli/chunk-YV5XXFD7.js.map +1 -0
  106. package/dist/cli/chunk-ZRCNIYRQ.js +101 -0
  107. package/dist/cli/chunk-ZRCNIYRQ.js.map +1 -0
  108. package/dist/cli/code-CRKVCMFZ.js +155 -0
  109. package/dist/cli/code-CRKVCMFZ.js.map +1 -0
  110. package/dist/cli/commands-QLMD3T7B.js +356 -0
  111. package/dist/cli/commands-QLMD3T7B.js.map +1 -0
  112. package/dist/cli/commit-53PP32NC.js +293 -0
  113. package/dist/cli/commit-53PP32NC.js.map +1 -0
  114. package/dist/cli/desktop-R6W5CLJ5.js +1046 -0
  115. package/dist/cli/desktop-R6W5CLJ5.js.map +1 -0
  116. package/dist/cli/devtools-YECO25QO.js +3719 -0
  117. package/dist/cli/devtools-YECO25QO.js.map +1 -0
  118. package/dist/cli/diff-LYNRCJZE.js +166 -0
  119. package/dist/cli/diff-LYNRCJZE.js.map +1 -0
  120. package/dist/cli/doctor-5IBP4R5J.js +28 -0
  121. package/dist/cli/doctor-5IBP4R5J.js.map +1 -0
  122. package/dist/cli/events-QN6KLN2V.js +340 -0
  123. package/dist/cli/events-QN6KLN2V.js.map +1 -0
  124. package/dist/cli/index.js +3500 -0
  125. package/dist/cli/index.js.map +1 -0
  126. package/dist/cli/mcp-FGKEH7RG.js +277 -0
  127. package/dist/cli/mcp-FGKEH7RG.js.map +1 -0
  128. package/dist/cli/mcp-browse-YCND4NWT.js +178 -0
  129. package/dist/cli/mcp-browse-YCND4NWT.js.map +1 -0
  130. package/dist/cli/mcp-inspect-V34J3VX5.js +143 -0
  131. package/dist/cli/mcp-inspect-V34J3VX5.js.map +1 -0
  132. package/dist/cli/package.json +3 -0
  133. package/dist/cli/prompt-I775PNKT.js +16 -0
  134. package/dist/cli/prompt-I775PNKT.js.map +1 -0
  135. package/dist/cli/prune-sessions-KGIIYD3P.js +44 -0
  136. package/dist/cli/prune-sessions-KGIIYD3P.js.map +1 -0
  137. package/dist/cli/replay-RDXLUAOE.js +292 -0
  138. package/dist/cli/replay-RDXLUAOE.js.map +1 -0
  139. package/dist/cli/run-RCAC2RYW.js +223 -0
  140. package/dist/cli/run-RCAC2RYW.js.map +1 -0
  141. package/dist/cli/server-FFU6TLYJ.js +3658 -0
  142. package/dist/cli/server-FFU6TLYJ.js.map +1 -0
  143. package/dist/cli/sessions-QT26MQAE.js +107 -0
  144. package/dist/cli/sessions-QT26MQAE.js.map +1 -0
  145. package/dist/cli/setup-VV4WKXHV.js +767 -0
  146. package/dist/cli/setup-VV4WKXHV.js.map +1 -0
  147. package/dist/cli/stats-JVZPQWAN.js +15 -0
  148. package/dist/cli/stats-JVZPQWAN.js.map +1 -0
  149. package/dist/cli/update-KYI3OVJP.js +15 -0
  150. package/dist/cli/update-KYI3OVJP.js.map +1 -0
  151. package/dist/cli/version-ANYORXTI.js +34 -0
  152. package/dist/cli/version-ANYORXTI.js.map +1 -0
  153. package/dist/index.d.ts +2557 -0
  154. package/dist/index.js +15000 -0
  155. package/dist/index.js.map +1 -0
  156. package/package.json +106 -0
@@ -0,0 +1,2846 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
+ import {
4
+ loadLanguage,
5
+ saveLanguage
6
+ } from "./chunk-6ALJTWWQ.js";
7
+
8
+ // src/i18n/EN.ts
9
+ var EN = {
10
+ common: {
11
+ error: "Error",
12
+ warning: "Warning",
13
+ loading: "Loading...",
14
+ done: "Done",
15
+ cancel: "Cancel",
16
+ confirm: "Confirm",
17
+ back: "Back",
18
+ next: "Next",
19
+ tool: "tool",
20
+ running: "running",
21
+ noTurns: "(no turns yet)"
22
+ },
23
+ cli: {
24
+ description: "DeepSeek-native agent framework \u2014 built for cache hits and cheap tokens.",
25
+ continue: "Resume the most recently used chat session without showing the picker.",
26
+ setup: "Interactive wizard \u2014 API key, preset, MCP servers. Re-run any time to reconfigure.",
27
+ code: "Code-editing chat \u2014 filesystem tools rooted at <dir> (default: cwd), coding system prompt, v4-flash baseline.",
28
+ chat: "Interactive Ink TUI with live cache/cost panel.",
29
+ run: "Run a single task non-interactively, streaming output.",
30
+ stats: "Show usage dashboard.",
31
+ doctor: "One-command health check.",
32
+ commit: "Draft a commit message from the staged diff.",
33
+ sessions: "List saved chat sessions, or inspect one by name.",
34
+ pruneSessions: "Delete saved sessions idle \u2265N days (default 90). Use --dry-run to preview.",
35
+ events: "Pretty-print the kernel event-log sidecar.",
36
+ replay: "Interactive Ink TUI to scrub through a transcript.",
37
+ diff: "Compare two transcripts in a split-pane Ink TUI.",
38
+ mcp: "Model Context Protocol helpers \u2014 discover servers, test your setup.",
39
+ version: "Print Luckerr version.",
40
+ update: "Check for a newer Luckerr and install it.",
41
+ index: "Build (or incrementally refresh) a local semantic search index."
42
+ },
43
+ ui: {
44
+ welcome: "Run `luckerr` any time to start chatting \u2014 your settings are remembered.",
45
+ taglineChat: "DeepSeek-native agent",
46
+ taglineCode: "DeepSeek-native coding agent",
47
+ taglineSub: "cache-first \xB7 flash-first",
48
+ startSessionHint: "type a message to start your session",
49
+ inputPlaceholder: "Ask anything... (type / for commands, @ for files)",
50
+ busy: "Thinking...",
51
+ thinking: "\u25B8 thinking...",
52
+ undo: "Undo",
53
+ undoHint: "press u within 5s to undo",
54
+ applied: "applied",
55
+ rejected: "rejected",
56
+ noDashboard: "Suppress the auto-launched embedded web dashboard.",
57
+ dashboardPortHint: "Pin the dashboard to a fixed port (1\u201365535). Stable across restarts \u2014 required for SSH tunnels. Default: ephemeral.",
58
+ dashboardPortInvalid: "\u25B2 ignoring --dashboard-port={value} (must be an integer 1\u201365535) \u2014 falling back to ephemeral",
59
+ dashboardAutoStartFailed: "\u25B2 dashboard auto-start failed ({reason}) \u2014 try /dashboard, or pass --no-dashboard to silence",
60
+ systemAppendHint: "Append instructions to the code system prompt. Does NOT replace the default prompt \u2014 adds after it.",
61
+ systemAppendFileHint: "Append file contents to the code system prompt. Does NOT replace the default prompt. UTF-8, relative to cwd or absolute.",
62
+ resumedSession: '\u25B8 resumed session "{name}" with {count} prior messages \xB7 /new to start fresh \xB7 /sessions to manage',
63
+ newSession: '\u25B8 session "{name}" (new) \u2014 auto-saved as you chat \xB7 /sessions to rename or delete',
64
+ ephemeralSession: "\u25B8 ephemeral chat (no session persistence) \u2014 drop --no-session to enable",
65
+ restoredEdits: "\u25B8 restored {count} pending edit block(s) from an interrupted prior run \u2014 /apply to commit or /discard to drop.",
66
+ resumedPlan: "Resumed plan \xB7 {when}{summary}",
67
+ tipEditBindings: {
68
+ topic: "edit-gate keybindings",
69
+ sections: [
70
+ {
71
+ rows: [
72
+ { key: "y / n", text: "accept or drop pending edits" },
73
+ {
74
+ key: "Shift+Tab",
75
+ text: "switch review \u2194 AUTO (persisted; AUTO applies instantly)"
76
+ },
77
+ { key: "u", text: "undo the last auto-applied batch (within the 5s banner)" }
78
+ ]
79
+ }
80
+ ],
81
+ footer: "Current mode shown in the bottom status bar \xB7 /keys for the full reference"
82
+ },
83
+ tipMouseClipboard: {
84
+ topic: "mouse + clipboard",
85
+ sections: [
86
+ {
87
+ rows: [
88
+ { key: "drag", text: "select text \u2014 terminal-native, no modifier needed" },
89
+ {
90
+ key: "right-click",
91
+ text: "your terminal's native menu (paste / copy on Windows Terminal etc.)"
92
+ },
93
+ { key: "wheel", text: "scrolls chat history (works on web/cloud/SSH terminals too)" },
94
+ {
95
+ key: "\u2191 / \u2193",
96
+ text: "scroll chat \xB7 use Ctrl+P / Ctrl+N for prompt history + multi-line cursor"
97
+ }
98
+ ]
99
+ }
100
+ ],
101
+ footer: "Run /keys for the full keyboard + mouse reference"
102
+ },
103
+ keysReference: {
104
+ topic: "Luckerr keys + mouse reference",
105
+ sections: [
106
+ {
107
+ title: "keyboard",
108
+ rows: [
109
+ { key: "Enter", text: "submit the prompt" },
110
+ { key: "Shift+Enter", text: "insert a newline in the prompt" },
111
+ { key: "\u2191 / \u2193", text: "scroll chat history (mouse wheel routes here too)" },
112
+ {
113
+ key: "Ctrl+P / Ctrl+N",
114
+ text: "previous / next prompt history \xB7 cursor up / down in a multi-line draft"
115
+ },
116
+ { key: "Ctrl+A / Ctrl+E", text: "jump to start / end of the current line" },
117
+ { key: "Ctrl+W", text: "delete the word before the cursor" },
118
+ { key: "Ctrl+U", text: "clear the entire prompt buffer" },
119
+ { key: "Tab", text: "complete @-mention \xB7 drill folder \xB7 accept slash command" },
120
+ { key: "Shift+Tab", text: "edit-gate: toggle review \u2194 AUTO mode" },
121
+ { key: "Esc", text: "dismiss picker \xB7 abort the running model turn" },
122
+ { key: "Ctrl+C", text: "abort the running model turn (NOT copy \u2014 see clipboard)" },
123
+ { key: "PgUp / PgDn", text: "scroll chat history a page at a time" },
124
+ { key: "End", text: "jump chat to the most recent line" }
125
+ ]
126
+ },
127
+ {
128
+ title: "mouse",
129
+ rows: [
130
+ { key: "wheel", text: "scrolls chat history (works on web/cloud/SSH terminals too)" },
131
+ { key: "drag", text: "selects text natively \u2014 direct copy works, no modifier" },
132
+ { key: "right-click", text: "terminal-native (paste menu on Windows Terminal etc.)" }
133
+ ]
134
+ },
135
+ {
136
+ title: "copy / paste",
137
+ rows: [
138
+ { key: "select text", text: "drag to select \u2014 terminal-native (no modifier needed)" },
139
+ {
140
+ key: "/copy",
141
+ text: "vim/tmux-style copy mode \u2014 works in SSH/mosh/tmux where drag-select can't extend past the viewport"
142
+ },
143
+ {
144
+ key: "copy",
145
+ text: "Ctrl+Shift+C (Win/Linux) \xB7 Cmd+C (macOS) \u2014 or auto-copy-on-select if your terminal does it"
146
+ },
147
+ { key: "paste", text: "Ctrl+V or Ctrl+Shift+V (Win/Linux) \xB7 Cmd+V (macOS)" },
148
+ {
149
+ key: "bracketed paste",
150
+ text: "multi-line pastes stay one block \u2014 no auto-submit on intermediate newlines"
151
+ }
152
+ ]
153
+ },
154
+ {
155
+ title: "edit-gate (code mode)",
156
+ rows: [
157
+ { key: "y / n", text: "accept or drop pending edits in the review modal" },
158
+ { key: "Shift+Tab", text: "toggle review \u2194 AUTO (persisted across sessions)" },
159
+ { key: "u", text: "undo the last auto-applied batch (within the 5s banner)" }
160
+ ]
161
+ }
162
+ ],
163
+ footer: "Wheel\u2192\u2191/\u2193 via DECSET 1007 (alternate-scroll) \u2014 wheel scrolls chat on most terminals (web/cloud/SSH included) without disturbing native selection. Drag to select stays modifier-free. Pass --no-mouse to opt out."
164
+ },
165
+ tipShownOnce: "shown once",
166
+ modelOverride: "override the default model",
167
+ noSession: "disable session persistence for this run",
168
+ resumeHint: "force-resume the named session (even if idle)",
169
+ newHint: "force a fresh session (ignore --session / --continue)",
170
+ transcriptHint: "path to write the JSONL transcript",
171
+ budgetHint: "session USD cap \u2014 warns at 80%, refuses next turn at 100%",
172
+ modelIdHint: "DeepSeek model id (e.g. deepseek-v4-flash)",
173
+ systemPromptHint: "override the default system prompt",
174
+ presetHint: "model bundle \u2014 auto|flash|pro",
175
+ sessionNameHint: "session name (default: 'default')",
176
+ ephemeralHint: "disable session persistence for this run",
177
+ mcpSpecHint: "MCP server spec (repeatable)",
178
+ mcpPrefixHint: "prefix MCP tool names with this string",
179
+ noConfigHint: "ignore ~/.luckerr/config.json for this run",
180
+ presetHintShort: "model bundle \u2014 auto|flash|pro",
181
+ budgetHintShort: "session USD cap",
182
+ transcriptHintShort: "JSONL transcript path",
183
+ mcpSpecHintShort: "MCP server spec (repeatable)",
184
+ mcpPrefixHintShort: "MCP tool name prefix",
185
+ dryRunHint: "show what would be installed without actually installing",
186
+ rebuildHint: "rebuild the index from scratch",
187
+ embedModelHint: "embedding model name",
188
+ projectDirHint: "project root directory",
189
+ ollamaUrlHint: "Ollama server URL",
190
+ skipPromptsHint: "skip confirmation prompts",
191
+ verboseHint: "show full session metadata",
192
+ pruneDaysHint: "delete sessions idle this many days or more (default 90)",
193
+ pruneDryRunHint: "list what would be deleted without removing anything",
194
+ eventTypeHint: "filter by event type",
195
+ eventSinceHint: "start from this event id",
196
+ eventTailHint: "show only the last N events",
197
+ jsonHint: "output as JSON",
198
+ projectionHint: "show projected state at each event",
199
+ printHint: "print to stdout instead of TUI",
200
+ headHint: "show only the first N events",
201
+ tailHint: "show only the last N events",
202
+ mdReportHint: "write a markdown diff report to this path",
203
+ printHintTable: "print a table to stdout",
204
+ tuiHint: "open the interactive TUI",
205
+ labelAHint: "label for the left pane",
206
+ labelBHint: "label for the right pane",
207
+ mcpListDescription: "browse the MCP registry (official \u2192 smithery \u2192 local fallback)",
208
+ mcpInspectDescription: "inspect an MCP server spec (tools, resources, prompts)",
209
+ mcpSearchDescription: "search the MCP registry for servers matching a query",
210
+ mcpInstallDescription: "install an MCP server by name (writes its spec to your config)",
211
+ mcpBrowseDescription: "interactive marketplace browser \u2014 type to filter, enter to install",
212
+ mcpLocalHint: "show only the bundled offline catalog",
213
+ mcpRefreshHint: "bypass the 24h cache and refetch",
214
+ mcpLimitHint: "max entries to show",
215
+ mcpPagesHint: "eagerly load this many pages (default 1)",
216
+ mcpAllHint: "load every page (slow on first run)",
217
+ mcpMaxPagesHint: "cap how many pages to walk while searching (default 20)",
218
+ jsonHintCatalog: "output as JSON",
219
+ jsonHintReport: "output the inspection report as JSON",
220
+ modelOverrideFlash: "override the model (default: deepseek-v4-flash)",
221
+ skipConfirmHint: "skip the confirmation prompt"
222
+ },
223
+ slash: {
224
+ help: { description: "show the full command reference" },
225
+ copy: {
226
+ description: "open vim/tmux-style copy mode \u2014 j/k navigate, v select, y yank to clipboard"
227
+ },
228
+ status: { description: "current model, flags, context, session" },
229
+ preset: {
230
+ description: "model bundle \u2014 auto escalates flash \u2192 pro, flash/pro lock",
231
+ argsHint: "<auto|flash|pro>"
232
+ },
233
+ model: { description: "switch DeepSeek model id", argsHint: "<id>" },
234
+ models: { description: "list available models fetched from DeepSeek /models" },
235
+ theme: {
236
+ description: "show or persist the terminal theme preference. Bare opens picker.",
237
+ argsHint: "[auto|default|dark|light|tokyo-night|github-dark|github-light|high-contrast]"
238
+ },
239
+ language: {
240
+ description: "switch the runtime language",
241
+ argsHint: "<EN|zh-CN>",
242
+ success: "Language switched to English.",
243
+ unsupported: "Unsupported language code: {code}. Supported: {supported}."
244
+ },
245
+ pro: {
246
+ description: "arm v4-pro for the NEXT turn only (one-shot \xB7 auto-disarms after turn)",
247
+ argsHint: "[off]"
248
+ },
249
+ budget: {
250
+ description: "session USD cap \u2014 warns at 80%, refuses next turn at 100%. Off by default. /budget alone shows status",
251
+ argsHint: "[usd|off]"
252
+ },
253
+ mcp: { description: "list MCP servers + tools attached to this session" },
254
+ resource: {
255
+ description: "browse + read MCP resources (no arg \u2192 list URIs; <uri> \u2192 fetch contents)",
256
+ argsHint: "[uri]"
257
+ },
258
+ prompt: {
259
+ description: "browse + fetch MCP prompts (no arg \u2192 list names; <name> \u2192 render prompt)",
260
+ argsHint: "[name]"
261
+ },
262
+ memory: {
263
+ description: "show / manage pinned memory (LUCKERR.md + ~/.luckerr/memory)",
264
+ argsHint: "[list|show <name>|forget <name>|clear <scope> confirm]"
265
+ },
266
+ skill: {
267
+ description: "list / run user skills (<project>/.luckerr/skills + ~/.luckerr/skills)",
268
+ argsHint: "[list|show <name>|<name> [args]]"
269
+ },
270
+ hooks: {
271
+ description: "list active hooks (settings.json under .luckerr/) \xB7 reload re-reads from disk",
272
+ argsHint: "[reload]"
273
+ },
274
+ permissions: {
275
+ description: "show / edit shell allowlist (builtin read-only \xB7 per-project: ~/.luckerr/config.json)",
276
+ argsHint: "[list|add <prefix>|remove <prefix|N>|clear confirm]"
277
+ },
278
+ dashboard: {
279
+ description: "launch the embedded web dashboard (127.0.0.1, token-gated)",
280
+ argsHint: "[stop]"
281
+ },
282
+ update: { description: "show current vs latest version + the shell command to upgrade" },
283
+ stats: {
284
+ description: "cross-session cost dashboard (today / week / month / all-time \xB7 cache hit \xB7 vs Claude)"
285
+ },
286
+ cost: {
287
+ description: "bare \u2192 last turn's spend (Usage card); with text \u2192 estimate cost of sending it next (worst-case + likely-cache)",
288
+ argsHint: "[text]"
289
+ },
290
+ doctor: { description: "health check (api / config / api-reach / index / hooks / project)" },
291
+ context: { description: "show context-window breakdown (system / tools / log / input)" },
292
+ retry: { description: "truncate & resend your last message (fresh sample)" },
293
+ compact: {
294
+ description: "narrow oversized tool results + tool-call args in the log; cap at tokens, default 4000",
295
+ argsHint: "[tokens]"
296
+ },
297
+ cwd: {
298
+ description: "switch the workspace root mid-session \u2014 re-points fs / shell / memory tools, reloads project hooks, refreshes the at-mention walker",
299
+ argsHint: "<path>"
300
+ },
301
+ stop: { description: "abort the current model turn (typed alternative to Esc)" },
302
+ feedback: { description: "open a GitHub issue with diagnostic info copied to clipboard" },
303
+ keys: { description: "keyboard + mouse + copy/paste reference" },
304
+ plans: { description: "list this session's active + archived plans, newest first" },
305
+ replay: {
306
+ description: "load an archived plan as a read-only Time Travel snapshot (default: newest)",
307
+ argsHint: "[N]"
308
+ },
309
+ sessions: { description: "list saved sessions (current marked with \u25B8)" },
310
+ setup: { description: "reminds you to exit and run `luckerr setup`" },
311
+ semantic: {
312
+ description: "show semantic_search status \u2014 built? Ollama installed? how to enable"
313
+ },
314
+ clear: { description: "clear visible scrollback only (log/context kept)" },
315
+ new: { description: "start a fresh conversation (clear context + scrollback)" },
316
+ loop: {
317
+ description: "auto-resubmit <prompt> every <interval> until you type something / Esc / /loop stop",
318
+ argsHint: "<5s..6h> <prompt> \xB7 stop \xB7 (no args = status)"
319
+ },
320
+ exit: { description: "quit the TUI" },
321
+ init: {
322
+ description: "scan the project and synthesize a baseline LUCKERR.md (model writes; review with /apply). `force` overwrites an existing file.",
323
+ argsHint: "[force]"
324
+ },
325
+ apply: {
326
+ description: "commit pending edit blocks to disk (no arg \u2192 all; `1`, `1,3`, or `1-4` \u2192 that subset, rest stay pending)",
327
+ argsHint: "[N|N,M|N-M]"
328
+ },
329
+ discard: {
330
+ description: "drop pending edit blocks without writing (no arg \u2192 all; indices \u2192 that subset)",
331
+ argsHint: "[N|N,M|N-M]"
332
+ },
333
+ walk: {
334
+ description: "step through pending edits one block at a time (git-add-p style: y/n per block, a apply rest, A flip AUTO)"
335
+ },
336
+ undo: { description: "roll back the last applied edit batch" },
337
+ history: { description: "list every edit batch this session (ids for /show, undone markers)" },
338
+ show: {
339
+ description: "dump a stored edit diff (omit id for newest non-undone)",
340
+ argsHint: "[id]"
341
+ },
342
+ commit: { description: "git add -A && git commit -m ...", argsHint: '"msg"' },
343
+ checkpoint: {
344
+ description: "snapshot every file the session has touched (Cursor-style internal store, not git). /checkpoint alone lists.",
345
+ argsHint: "[name|list|forget <id>]"
346
+ },
347
+ restore: {
348
+ description: "roll back files to a named checkpoint (see /checkpoint list)",
349
+ argsHint: "<name|id>"
350
+ },
351
+ plan: {
352
+ description: "toggle read-only plan mode (writes bounced until submit_plan + approval)",
353
+ argsHint: "[on|off]"
354
+ },
355
+ mode: {
356
+ description: "edit-gate: review (queue) \xB7 auto (apply+undo) \xB7 yolo (apply+auto-shell). Shift+Tab cycles.",
357
+ argsHint: "[review|auto|yolo]"
358
+ },
359
+ jobs: { description: "list background jobs started by run_background" },
360
+ kill: {
361
+ description: "stop a background job by id (SIGTERM \u2192 SIGKILL after grace)",
362
+ argsHint: "<id>"
363
+ },
364
+ logs: {
365
+ description: "tail a background job's output (default last 80 lines)",
366
+ argsHint: "<id> [lines]"
367
+ }
368
+ },
369
+ wizard: {
370
+ languageTitle: "Choose your language",
371
+ languageSubtitle: "Detected from your system locale. Switch later via /language.",
372
+ welcomeTitle: "Welcome to Luckerr.",
373
+ apiKeyPrompt: "Paste your DeepSeek API key to get started.",
374
+ apiKeyGetOne: "Get one at: https://platform.deepseek.com/api_keys",
375
+ apiKeySavedLocally: "Saved locally to {path}",
376
+ apiKeyInputLabel: "key \u203A ",
377
+ apiKeyInvalid: "Key looks too short \u2014 paste the full token (16+ chars, no spaces).",
378
+ apiKeyChecking: "Checking API key\u2026",
379
+ apiKeyRejected: "DeepSeek rejected this API key. Paste a valid key, or press Esc to cancel setup.",
380
+ apiKeyCheckFailed: "Could not verify this API key right now ({message}). Check your network or try again.",
381
+ apiKeyPreview: "preview: {redacted}",
382
+ themeTitle: "Choose a theme",
383
+ themeSubtitle: "Preview updates live as you navigate. Change later with /theme.",
384
+ themeSampleHeading: "Sample",
385
+ themeFooter: "[\u2191\u2193] navigate \xB7 [Enter] confirm \xB7 [Esc] cancel",
386
+ themeCaption: {
387
+ default: "GitHub dark (default)",
388
+ dark: "Cool dark tones",
389
+ light: "Clean light mode",
390
+ "tokyo-night": "Tokyo Night palette",
391
+ "github-dark": "GitHub dark",
392
+ "github-light": "GitHub light",
393
+ "high-contrast": "Accessibility"
394
+ },
395
+ reviewLabelTheme: "Theme",
396
+ presetTitle: "Pick a preset",
397
+ mcpTitle: "Which MCP servers should Luckerr wire up for you?",
398
+ mcpUserArgsHint: "(you'll provide {arg})",
399
+ mcpFooterMulti: "[\u2191\u2193] navigate \xB7 [Space] toggle \xB7 [Enter] confirm \xB7 [Esc] cancel \xB7 empty = skip",
400
+ mcpArgsTitle: "Configure {name}",
401
+ mcpArgsDirMissing: "Directory {path} doesn't exist.",
402
+ mcpArgsDirCreateHint: "[Y/Enter] create it (mkdir -p) \xB7 [N/Esc] enter a different path",
403
+ mcpArgsDirCreateFailed: "Couldn't create {path}: {message}",
404
+ mcpArgsRequiredParam: "Required parameter: ",
405
+ mcpArgsEmpty: "{name} needs a value \u2014 got an empty string.",
406
+ mcpArgsNotADir: "{path} exists but is not a directory.",
407
+ reviewTitle: "Ready to save",
408
+ reviewLabelApiKey: "API key",
409
+ reviewLabelLanguage: "Language",
410
+ reviewLabelPreset: "Preset",
411
+ reviewLabelMcp: "MCP",
412
+ reviewMcpNone: "(none)",
413
+ reviewMcpServers: "{count} server(s)",
414
+ reviewSavesTo: "Saves to {path}",
415
+ reviewSaveError: "Could not save config: {message}",
416
+ reviewFooter: "[Enter] save \xB7 [Esc] cancel",
417
+ savedTitle: "\u25B8 Saved.",
418
+ savedFooter: "[Enter] to exit",
419
+ selectFooter: "[\u2191\u2193] navigate \xB7 [Enter] confirm \xB7 [Esc] cancel",
420
+ stepCounter: "Step {step}/{total} \xB7 ",
421
+ exitHint: "/exit to abort",
422
+ apiKeyPlaceholder: "sk-...",
423
+ themeSampleReasoning: "Reasoning",
424
+ providerKeysTitle: "Configure your AI providers",
425
+ providerKeysSubtitle: "Enter API keys for the providers you want to use. At least one is required.",
426
+ providerKeysConfigured: "{count} provider(s) configured",
427
+ providerKeysNone: "(none \u2014 at least one required)",
428
+ providerKeysFooter: "[\u2191\u2193] navigate \xB7 [Enter] configure \xB7 [Esc] cancel \xB7 [Space] confirm all",
429
+ providerKeysInputFor: "API key for {label}:",
430
+ providerKeysGetOne: "Get one at: {url}",
431
+ providerKeysDetected: "(detected from env)",
432
+ providerKeysFromConfig: "(saved in config)",
433
+ providerKeysNeeded: "At least one API key is required to continue.",
434
+ reviewLabelProviders: "AI providers"
435
+ },
436
+ themePicker: {
437
+ header: "Theme",
438
+ footer: "\u2191\u2193 pick \xB7 \u23CE confirm \xB7 esc cancel",
439
+ currentPref: "current preference",
440
+ activeNow: "active now",
441
+ autoDesc: "use LUCKERR_THEME or default"
442
+ },
443
+ planFlow: {
444
+ approveCardTitle: "Approve plan",
445
+ approveCardMetaRight: "awaiting",
446
+ openQuestionsBanner: "\u25B2 the plan flags open questions or risks \u2014 pick {refine} to write concrete answers before the model moves on.",
447
+ openQuestionsHeader: "Open questions / risks",
448
+ truncatedBodyMore: "\u2026 {n} more line above in scrollback",
449
+ truncatedBodyMorePlural: "\u2026 {n} more lines above in scrollback",
450
+ picker: {
451
+ accept: "accept",
452
+ acceptHint: "run it now, in order",
453
+ refine: "refine",
454
+ refineHint: "give the agent more guidance, draft a new plan",
455
+ revise: "revise",
456
+ reviseHint: "edit the plan inline before running (skip / reorder steps)",
457
+ reject: "reject",
458
+ rejectHint: "discard, agent will retry from scratch"
459
+ },
460
+ refineFooter: "\u23CE send \xB7 esc return to picker",
461
+ refineQuestionsHeading: "Answer these or describe the change you want:",
462
+ modes: {
463
+ approve: {
464
+ title: "approving \u2014 any last instructions?",
465
+ hint: "Answer questions the plan raised, add constraints, or just press Enter to approve as-is.",
466
+ blankHint: " (Enter with blank = approve without extra instructions.)"
467
+ },
468
+ refine: {
469
+ title: "refining \u2014 what should the model change?",
470
+ hint: "Describe what's wrong or missing, or answer questions the plan raised.",
471
+ blankHint: " (Enter with blank = let the model pick safe defaults for any open questions.)"
472
+ },
473
+ reject: {
474
+ title: "rejecting \u2014 tell the model why (optional)",
475
+ hint: "Say what the model got wrong about your goal, or what you actually want instead.",
476
+ blankHint: " (Enter with blank = cancel without explanation; the model will ask what you want.)"
477
+ },
478
+ "checkpoint-revise": {
479
+ title: "revising \u2014 what should change before the next step?",
480
+ hint: "Scope change, skip steps, alternative approach \u2014 the model adjusts the remaining plan.",
481
+ blankHint: " (Enter with blank = continue with the current plan.)"
482
+ },
483
+ "choice-custom": {
484
+ title: "custom answer \u2014 type whatever fits",
485
+ hint: "Free-form reply. The model reads it verbatim and proceeds \u2014 no need to match the listed options.",
486
+ blankHint: " (Enter with blank = ask the model what you actually want.)"
487
+ }
488
+ },
489
+ checkpoint: {
490
+ title: "Checkpoint \u2014 step done",
491
+ continue: "Continue \u2014 run the next step",
492
+ continueHint: "Model resumes with the next step.",
493
+ revise: "Revise \u2014 give feedback before the next step",
494
+ reviseHint: "Stay paused, type guidance; model adjusts the remaining plan.",
495
+ stop: "Stop \u2014 end the plan here",
496
+ stopHint: "Model summarizes what was done and ends."
497
+ },
498
+ stepList: {
499
+ counter: "{total} steps",
500
+ counterSingular: "{total} step",
501
+ counterDone: "{done}/{total} done ({pct}%) \xB7 {total} steps",
502
+ counterDoneSingular: "{done}/{total} done ({pct}%) \xB7 {total} step"
503
+ },
504
+ noPlanSummary: "No plan body submitted yet.",
505
+ detailCollapsedHint: "Ctrl+P expands full plan details.",
506
+ detailExpandedHint: "Ctrl+P collapses details.",
507
+ detailHeader: "Plan details",
508
+ detailWindow: "showing lines {start}-{end} of {total}",
509
+ detailScrollHint: "PgUp/PgDn scroll details \xB7 Home/End jump",
510
+ reviseTitle: "Revise plan",
511
+ reviseSteps: "{count} steps",
512
+ reviseFooter: "\u2191\u2193 focus \xB7 space toggle skip \xB7 k/j move \xB7 \u23CE accept \xB7 esc cancel",
513
+ riskMed: " med",
514
+ riskHigh: " high",
515
+ completeMsg: "\u25B8 plan complete \u2014 all {total} step{s} done \xB7 archived"
516
+ },
517
+ app: {
518
+ walkCancelledRemaining: "\u25B8 walk cancelled \u2014 {count} block(s) still pending.",
519
+ walkCancelled: "\u25B8 walk cancelled.",
520
+ editModeYolo: "\u25B8 edit mode: YOLO \u2014 edits AND shell commands auto-run. /undo still rolls back edits. Use carefully.",
521
+ editModeAuto: "\u25B8 edit mode: AUTO \u2014 edits apply immediately; press u within 5s to undo (space pauses the timer). Shell commands still ask.",
522
+ editModeReview: "\u25B8 edit mode: review \u2014 edits queue for /apply (or y) / /discard (or n)",
523
+ rejectedEdit: "\u25B8 rejected edit to {path}{context}",
524
+ autoApprovingRest: "\u25B8 auto-approving remaining edits for this turn",
525
+ flippedAutoSession: "\u25B8 flipped to AUTO mode for the rest of the session (persisted)",
526
+ flippedAutoWalk: "\u25B8 flipped to AUTO mode \u2014 future edits will apply immediately. Walk exited.",
527
+ dashboardStopped: "\u25B8 dashboard stopped.",
528
+ notedMemory: "\u25B8 noted ({scope}) \u2014 {verb} {path}",
529
+ notedScopeProject: "project",
530
+ notedScopeGlobal: "global",
531
+ notedVerbCreated: "created",
532
+ notedVerbAppended: "appended to",
533
+ memoryWriteFailed: "# memory write failed",
534
+ commandFailed: "! command failed",
535
+ btwUsage: "\u25B8 /btw <question> \u2014 ask a side question without polluting the conversation context.",
536
+ btwHeader: "\u226B btw",
537
+ btwFailed: "/btw failed",
538
+ restoreCodeOnly: "\u25B8 /restore is code-mode only",
539
+ hookUserPromptSubmit: "UserPromptSubmit hook",
540
+ hookStop: "Stop hook",
541
+ atMentions: "\u25B8 @mentions: {parts}",
542
+ atUrl: "\u25B8 @url: {parts}",
543
+ atUrlFailed: "@url expansion failed",
544
+ denied: "\u25B8 denied: {cmd}{context}",
545
+ alwaysAllowed: '\u25B8 always allowed "{prefix}" for {dir}',
546
+ runningCommand: "\u25B8 running: {cmd}",
547
+ startingBackground: "\u25B8 starting (background): {cmd}",
548
+ checkpointSaved: "\u26C1 checkpoint saved \xB7 {id} \xB7 {count} file{s} \xB7 /restore {id} to roll back this step",
549
+ continuingAfter: "\u25B8 continuing after {label}{counter}",
550
+ planStoppedAt: "\u25B8 plan stopped at {label}{counter}",
551
+ revisingAfter: "\u25B8 revising after {label} \u2014 {feedback}"
552
+ },
553
+ hooks: {
554
+ head: "hook {tag} `{cmd}` {decision}{truncTag}",
555
+ headWithDetail: "hook {tag} `{cmd}` {decision}{truncTag}: {detail}",
556
+ truncated: " (output truncated at 256KB)",
557
+ decisionBlock: "block",
558
+ decisionWarn: "warn",
559
+ decisionTimeout: "timeout",
560
+ decisionError: "error"
561
+ },
562
+ summary: {
563
+ status: "summarizing what was gathered\u2026",
564
+ hallucinatedFallback: "(model emitted fake tool-call markup instead of a prose summary \u2014 try /retry with a narrower question, or /think to inspect R1's reasoning)",
565
+ failedAfterReason: "{label} and the fallback summary call failed: {message}. Run /clear and retry with a narrower question, or raise --max-tool-iters."
566
+ },
567
+ loop: {
568
+ budgetExhausted: "session budget exhausted \u2014 spent ${spent} \u2265 cap ${cap}. Bump the cap with /budget <usd>, clear it with /budget off, or end the session.",
569
+ budget80Pct: "\u25B2 budget 80% used \u2014 ${spent} of ${cap}. Next turn or two likely trips the cap.",
570
+ proArmed: "\u21E7 /pro armed \u2014 this turn runs on deepseek-v4-pro (one-shot \xB7 disarms after turn)",
571
+ abortedAtIter: "aborted at iter {iter}/{cap} \u2014 stopped without producing a summary (press \u2191 + Enter or /retry to resume)",
572
+ toolUploadStatus: "tool result uploaded \xB7 model thinking before next response\u2026",
573
+ toolBudgetWarning: "{iter}/{cap} tool calls used \u2014 approaching budget. Press Esc to force a summary now.",
574
+ preflightFoldStatus: "preflight: context near full, attempting fold\u2026",
575
+ preflightFolded: "preflight: request ~{estimate}/{ctxMax} tokens ({pct}%) \u2014 folded {beforeMessages} messages \u2192 {afterMessages} (summary {summaryChars} chars). Sending.",
576
+ preflightNoFold: "preflight: request ~{estimate}/{ctxMax} tokens ({pct}%) and nothing left to fold \u2014 DeepSeek will likely 400. Run /clear or /new to start fresh.",
577
+ flashEscalation: "\u21E7 flash requested escalation \u2014 retrying this turn on {model}{reasonSuffix}",
578
+ harvestStatus: "extracting plan state from reasoning\u2026",
579
+ autoEscalation: "\u21E7 auto-escalating to {model} for the rest of this turn \u2014 flash hit {breakdown}. Next turn falls back to {fallback} unless /pro is armed.",
580
+ readOnlyLoopEscalation: "\u21E7 auto-escalating to {model} \u2014 flash made {n} consecutive read-only calls without producing an edit or final answer. Next turn falls back to {fallback} unless /pro is armed.",
581
+ repeatToolCallWarning: "Caught a repeated tool call \u2014 let the model see the issue and retry with a different approach.",
582
+ stormStuck: "Stopped a stuck retry loop \u2014 the model kept calling the same tool with identical args after a self-correction nudge. Try /retry, rephrase, or rule out the underlying blocker.",
583
+ stormSuppressed: "Suppressed {count} repeated tool call(s) \u2014 same name + args fired 3+ times.",
584
+ compactingHistoryStatus: "compacting history{aggressiveTag}\u2026",
585
+ aggressiveTag: " (aggressive)",
586
+ foldedHistory: "context {before}/{ctxMax} ({pct}%) \u2014 folded {beforeMessages} messages \u2192 {afterMessages} (summary {summaryChars} chars). Continuing.",
587
+ aggressivelyFoldedHistory: "context {before}/{ctxMax} ({pct}%) \u2014 aggressively folded {beforeMessages} messages \u2192 {afterMessages} (summary {summaryChars} chars). Continuing.",
588
+ forcingSummary: "context {before}/{ctxMax} ({pct}%) \u2014 forcing summary from what was gathered. Run /compact, /clear, or /new to reset."
589
+ },
590
+ errors: {
591
+ contextOverflow: "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. Luckerr caps new tool results at 8k tokens and auto-heals oversized history on session load \u2014 a restart often clears it. If it still overflows, run /new to start fresh, or open /sessions and press [d] to delete this session.",
592
+ contextOverflowTooMany: "too many tokens",
593
+ auth401: "Authentication failed (DeepSeek 401): {inner}. Your API key is rejected. Fix with `luckerr setup` or `export DEEPSEEK_API_KEY=sk-...`. Get one at https://platform.deepseek.com/api_keys.",
594
+ balance402: "Out of balance (DeepSeek 402): {inner}. Top up at https://platform.deepseek.com/top_up \u2014 the panel header shows your balance once it's non-zero.",
595
+ badparam422: "Invalid parameter (DeepSeek 422): {inner}",
596
+ badrequest400: "Bad request (DeepSeek 400): {inner}",
597
+ deepseek5xxHead: "DeepSeek service unavailable ({status}) \u2014 this is a DeepSeek-side problem, not Luckerr. Already retried 4\xD7 with backoff.",
598
+ deepseek5xxReachable: " DeepSeek's main API answered our health check, but /chat/completions is failing \u2014 partial outage on their side.",
599
+ deepseek5xxUnreachable: " DeepSeek API is unreachable from your network \u2014 could be a wider DS outage or a local network issue.",
600
+ deepseek5xxActionNetwork: " Try: (1) check your network, (2) wait 30s and retry, (3) status page: https://status.deepseek.com.",
601
+ deepseek5xxActionRetry: " Try: (1) wait 30s and retry, (2) /preset to switch model, (3) status page: https://status.deepseek.com.",
602
+ innerNoMessage: "(no message)",
603
+ reasonAborted: "[aborted by user (Esc) \u2014 summarizing what I found so far]",
604
+ reasonContextGuard: "[context budget running low \u2014 summarizing before the next call would overflow]",
605
+ reasonStuck: "[stuck on a repeated tool call \u2014 explaining what was tried and what's blocking progress]",
606
+ reasonBudget: "[tool-call budget ({iterCap}) reached \u2014 forcing summary from what I found]",
607
+ labelAborted: "aborted by user",
608
+ labelContextGuard: "context-guard triggered (prompt > 80% of window)",
609
+ labelStuck: "stuck (repeated tool call suppressed by storm-breaker)",
610
+ labelBudget: "tool-call budget ({iterCap}) reached"
611
+ },
612
+ handlers: {
613
+ basic: {
614
+ newInfo: "\u25B8 new conversation \u2014 dropped {count} message(s) from context. Same session, fresh slate.",
615
+ newInfoArchived: '\u25B8 new conversation \u2014 dropped {count} message(s) from context. Prior transcript archived as "{archived}" (visible under Sessions).',
616
+ newInfoSystemReloaded: " \xB7 LUCKERR.md / project memory reloaded (next turn pays one cache miss)",
617
+ helpTitle: "Commands:",
618
+ helpShellTitle: "Shell shortcut:",
619
+ helpShell: " !<cmd> run <cmd> in the sandbox root; output goes into",
620
+ helpShellDetail: " the conversation so the model sees it next turn.",
621
+ helpShellConsent: " No allowlist gate \u2014 user-typed = explicit consent.",
622
+ helpShellExample: " Example: !git status !ls src/ !npm test",
623
+ helpMemoryTitle: "Quick memory:",
624
+ helpMemoryPin: " #<note> append <note> to <project>/LUCKERR.md (committable).",
625
+ helpMemoryPinEx: " Example: #findByEmail must be case-insensitive",
626
+ helpMemoryGlobal: " #g <note> append <note> to ~/.luckerr/LUCKERR.md (global, never committed).",
627
+ helpMemoryGlobalEx: " Example: #g always run pnpm not npm",
628
+ helpMemoryPinBoth: " Both pin into every future session's prefix. Faster than /memory.",
629
+ helpMemoryEscape: " Use `\\#text` to send a literal `#text` to the model.",
630
+ helpFileTitle: "File references (code mode):",
631
+ helpFile: " @path/to/file inline file content under [Referenced files] on send.",
632
+ helpFilePicker: " Type `@` to open the picker (\u2191\u2193 navigate, Tab/Enter pick).",
633
+ helpUrlTitle: "URL references:",
634
+ helpUrl: " @https://example.com fetch the URL, strip HTML, inline under [Referenced URLs].",
635
+ helpUrlCache: " Same URL twice in one session fetches once (in-mem cache).",
636
+ helpUrlPunct: " Trailing sentence punctuation (./,/)) is stripped automatically.",
637
+ helpPresetsTitle: "Presets (branch + harvest are NEVER auto-enabled \u2014 opt-in only):",
638
+ helpPresetAuto: " auto v4-flash \u2192 v4-pro on hard turns \u2190 default \xB7 cheap when easy, smart when hard",
639
+ helpPresetFlash: " flash v4-flash always cheapest \xB7 predictable per-turn cost",
640
+ helpPresetPro: " pro v4-pro always ~3\xD7 flash (5/31) \xB7 hard multi-turn work",
641
+ helpSessionsTitle: "Sessions (auto-enabled by default, named 'default'):",
642
+ helpSessionCustom: " luckerr chat --session <name> use a different named session",
643
+ helpSessionNone: " luckerr chat --no-session disable persistence for this run",
644
+ retryNone: "nothing to retry \u2014 no prior user message in this session's log.",
645
+ retryInfo: '\u25B8 retrying: "{preview}"',
646
+ loopTuiOnly: "/loop is only available in the interactive TUI (not in run/replay).",
647
+ loopStopped: "\u25B8 loop stopped.",
648
+ loopNoActive: "no active loop to stop.",
649
+ loopNoActiveHint: "no active loop. Start one with `/loop <interval> <prompt>` (e.g. /loop 30s npm test).\nCancels on: /loop stop \xB7 Esc \xB7 /clear /new \xB7 any user-typed prompt.",
650
+ loopStarted: '\u25B8 loop started \u2014 re-submitting "{prompt}" every {duration}. Type anything (or /loop stop) to cancel.',
651
+ keysNeedsTui: "/keys needs a TUI context (postKeys wired).",
652
+ unknownCommand: "unknown command: /{cmd} \u2014 did you mean {list}?",
653
+ unknownCommandShort: "unknown command: /{cmd} (try /help)"
654
+ },
655
+ admin: {
656
+ doctorNeedsTui: "/doctor needs a TUI context (postDoctor wired).",
657
+ doctorRunning: "\u2695 Doctor \u2014 running health checks\u2026",
658
+ hooksReloadUnavailable: "/hooks reload is not available in this context (no reload callback wired).",
659
+ hooksReloaded: "\u25B8 reloaded hooks \xB7 {count} active",
660
+ hooksUsage: "usage: /hooks list active hooks\n /hooks reload re-read settings.json files",
661
+ hooksNone: "no hooks configured.",
662
+ hooksDropHint: "drop a settings.json with a `hooks` key into either of:",
663
+ hooksProject: " \xB7 {path} (project)",
664
+ hooksProjectFallback: " \xB7 <project>/.luckerr/settings.json (project)",
665
+ hooksGlobal: " \xB7 {path} (global)",
666
+ hooksEvents: "events: PreToolUse, PostToolUse, UserPromptSubmit, Stop",
667
+ hooksExitCodes: "exit 0 = pass \xB7 exit 2 = block (Pre*) \xB7 other = warn",
668
+ hooksLoaded: "\u25B8 {count} hook(s) loaded",
669
+ hooksSources: "sources: project={project} \xB7 global={global}",
670
+ updateCurrent: "current: luckerr {version}",
671
+ updateLatestPending: "latest: (not yet resolved \u2014 background check in flight or offline)",
672
+ updateRetryHint: "triggered a fresh registry fetch \u2014 retry `/update` in a few seconds,",
673
+ updateRetryHint2: "or run `luckerr update` in another terminal to force it synchronously.",
674
+ updateLatest: "latest: luckerr {version}",
675
+ updateUpToDate: "you're on the latest. nothing to do.",
676
+ updateNpxHint: "you're running via npx \u2014 the next `npx luckerr ...` launch will auto-fetch.",
677
+ updateNpxForce: "to force a refresh sooner: `npm cache clean --force`.",
678
+ updateUpgradeHint: "to upgrade, exit this session and run:",
679
+ updateUpgradeCmd1: " luckerr update (interactive, dry-run supported via --dry-run)",
680
+ updateUpgradeCmd2: " {command} (direct)",
681
+ updateInSessionDisabled: "in-session install is deliberately disabled \u2014 the install spawn would",
682
+ updateInSessionDisabled2: "corrupt this TUI's rendering and Windows can lock the running binary.",
683
+ statsNoData: "no usage data yet.",
684
+ statsEveryTurn: "every turn you run here appends one record \u2014 this session's turns",
685
+ statsWillAppear: "will show up in the dashboard once you send a message."
686
+ },
687
+ edits: {
688
+ undoCodeOnly: "/undo is only available inside `luckerr code` \u2014 chat mode doesn't apply edits.",
689
+ historyCodeOnly: "/history is only available inside `luckerr code`.",
690
+ showCodeOnly: "/show is only available inside `luckerr code`.",
691
+ applyCodeOnly: "/apply is only available inside `luckerr code` (nothing to apply here).",
692
+ discardCodeOnly: "/discard is only available inside `luckerr code`.",
693
+ planCodeOnly: "/plan is only available inside `luckerr code` \u2014 chat mode doesn't gate tool writes.",
694
+ planOn: "\u25B8 plan mode ON \u2014 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 \u2014 this toggle is the stronger, explicit constraint.) Type /plan off to leave.",
695
+ planOff: "\u25B8 plan mode OFF \u2014 write tools are live again. Model can still propose plans autonomously for large tasks.",
696
+ modeCodeOnly: "/mode is only available inside `luckerr code`.",
697
+ modeUsage: "usage: /mode <review|auto|yolo> (Shift+Tab also cycles)",
698
+ modeYolo: "\u25B8 edit mode: YOLO \u2014 edits AND shell commands auto-run with no prompt. /undo still rolls back edits. Use carefully.",
699
+ modeAuto: "\u25B8 edit mode: AUTO \u2014 edits apply immediately; press u within 5s to undo, or /undo later. Shell commands still ask.",
700
+ modeReview: "\u25B8 edit mode: review \u2014 edits queue for /apply (or y) / /discard (or n)",
701
+ commitCodeOnly: "/commit is only available inside `luckerr code` (needs a rooted git repo).",
702
+ commitUsage: 'usage: /commit "your commit message" \u2014 runs `git add -A && git commit -m "\u2026"` in {root}',
703
+ walkCodeOnly: "/walk is only available inside `luckerr code`.",
704
+ checkpointCodeOnly: "/checkpoint is only available inside `luckerr code` \u2014 chat mode doesn't apply edits.",
705
+ checkpointNone: "no checkpoints yet \u2014 `/checkpoint <name>` snapshots every file the session has touched. Restore later with `/restore <name>`.",
706
+ checkpointHeader: "\u25C8 checkpoints \xB7 {count} stored",
707
+ checkpointRestoreHint: " /restore <name|id> \xB7 /checkpoint forget <id> \xB7 /checkpoint <name> to add",
708
+ checkpointForgetUsage: "usage: /checkpoint forget <id|name>",
709
+ checkpointNoMatch: '\u25B8 no checkpoint matching "{name}" \u2014 see /checkpoint list',
710
+ checkpointDeleted: "\u25B8 deleted checkpoint {id} ({name})",
711
+ checkpointDeleteFailed: "\u25B8 failed to delete {id} (already gone?)",
712
+ checkpointSaveUsage: "usage: /checkpoint <name> (or /checkpoint list to see existing)",
713
+ checkpointSavedEmpty: `\u25B8 checkpoint "{name}" saved ({id}) \u2014 but no files have been touched yet, so it's an empty baseline. Edits made after this point will be revertable.`,
714
+ checkpointSaved: '\u25B8 checkpoint "{name}" saved ({id}) \u2014 {files} file{s}, {size} KB. Restore: /restore {name}',
715
+ restoreCodeOnly: "/restore is only available inside `luckerr code`.",
716
+ restoreUsage: "usage: /restore <name|id> (see /checkpoint list for ids)",
717
+ restoreNoMatch: '\u25B8 no checkpoint matching "{target}" \u2014 try /checkpoint list',
718
+ restoreInfo: '\u25B8 restored "{name}" ({id}) from {when}',
719
+ restoreWrote: " \xB7 wrote back {count} file{s}",
720
+ restoreRemoved: " \xB7 removed {count} file{s} (didn't exist at checkpoint time)",
721
+ restoreSkipped: " \u2717 {count} file{s} skipped:",
722
+ cwdCodeOnly: "/cwd is only available inside `luckerr code`.",
723
+ cwdUsage: "usage: /cwd <path> (current root: {current}). Re-points filesystem / shell / memory tools to <path>.",
724
+ cwdUsageNoCurrent: "usage: /cwd <path> re-points the workspace root to <path>."
725
+ },
726
+ model: {
727
+ modelHint: "try deepseek-v4-flash or deepseek-v4-pro \u2014 run /models to fetch the live list",
728
+ modelUsage: "usage: /model <id> ({hint})",
729
+ modelNotInCatalog: "model \u2192 {id} (\u26A0 not in the fetched catalog: {list}. If this is wrong the next call will 400 \u2014 run /models to refresh.)",
730
+ modelSet: "model \u2192 {id}",
731
+ presetAuto: "preset \u2192 auto (v4-flash \u2192 v4-pro on hard turns \xB7 default)",
732
+ presetFlash: "preset \u2192 flash (v4-flash always \xB7 cheapest \xB7 /pro still bumps one turn)",
733
+ presetPro: "preset \u2192 pro (v4-pro always \xB7 ~3\xD7 flash \xB7 for hard multi-turn work)",
734
+ presetUsage: "usage: /preset <auto|flash|pro>",
735
+ proNothingArmed: "nothing armed \u2014 /pro with no args will arm pro for your next turn",
736
+ proDisarmed: "\u25B8 /pro disarmed \u2014 next turn falls back to the current preset",
737
+ proUsage: "usage: /pro arm pro for the next turn (one-shot, auto-disarms after)\n /pro off cancel armed state before the next turn",
738
+ proArmed: "\u25B8 /pro armed \u2014 your NEXT message runs on {model} regardless of preset. Auto-disarms after one turn. Use /preset max for a persistent switch.",
739
+ budgetNoCap: "no session budget set \u2014 Luckerr will keep going until you stop it. Set one with: /budget <usd> (e.g. /budget 5)",
740
+ budgetStatus: "budget: ${spent} of ${cap} ({pct}%) \xB7 /budget off to clear, /budget <usd> to change",
741
+ budgetOff: "budget \u2192 off (no cap)",
742
+ budgetUsage: 'usage: /budget <usd> (got "{arg}" \u2014 must be a positive number, e.g. /budget 5 or /budget 12.50)',
743
+ budgetExhausted: "\u25B2 budget \u2192 ${cap} but already spent ${spent}. Next turn will be refused \u2014 bump the cap higher to keep going, or end the session.",
744
+ budgetSet: "budget \u2192 ${cap} (so far: ${spent} \xB7 warns at 80%, refuses next turn at 100% \xB7 /budget off to clear)"
745
+ },
746
+ permissions: {
747
+ mutateCodeOnly: "/permissions add / remove / clear are only available inside `luckerr code` \u2014 they edit the project-scoped allowlist (`~/.luckerr/config.json` projects[<root>].shellAllowed).",
748
+ addUsage: 'usage: /permissions add <prefix> (multi-token OK: /permissions add "git push origin")',
749
+ addAlready: "\u25B8 already allowed: {prefix}",
750
+ addBuiltin: "\u25B8 `{prefix}` is already in the builtin allowlist \u2014 no per-project entry needed. (Builtin entries are always on.)",
751
+ addInfo: "\u25B8 added: {prefix}\n \u2192 next `{prefix}` invocation runs without prompting in this project.",
752
+ removeUsage: "usage: /permissions remove <prefix-or-index> (e.g. /permissions remove 3, or /permissions remove npm)",
753
+ removeEmpty: "\u25B8 no project allowlist entries to remove.",
754
+ removeIndexOob: "\u25B8 index out of range: {idx} (project list has {count} entries)",
755
+ removeNothing: "\u25B8 nothing to remove.",
756
+ removeBuiltin: "\u25B8 `{prefix}` is in the builtin allowlist (read-only). Builtin entries can't be removed at runtime \u2014 they're baked into the binary.",
757
+ removeInfo: "\u25B8 removed: {prefix}",
758
+ removeNotFound: "\u25B8 no such project entry: {prefix} (try /permissions list to see what's stored)",
759
+ clearAlready: "\u25B8 project allowlist is already empty.",
760
+ clearConfirm: "about to drop {count} project allowlist entr{plural} for {root}. Re-run with the word 'confirm' to proceed: /permissions clear confirm",
761
+ clearedNone: "\u25B8 project allowlist was already empty \u2014 nothing changed.",
762
+ cleared: "\u25B8 cleared {count} project allowlist entr{plural}.",
763
+ usage: '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',
764
+ modeYolo: "\u25B8 edit mode: YOLO \u2014 every shell command auto-runs, allowlist is bypassed. /mode review to re-enable prompts.",
765
+ modeAuto: "\u25B8 edit mode: auto \u2014 edits auto-apply, shell still gated by allowlist (or ShellConfirm prompt for non-allowlisted).",
766
+ modeReview: "\u25B8 edit mode: review \u2014 both edits and non-allowlisted shell commands ask before running.",
767
+ projectHeader: "Project allowlist ({count}) \u2014 {root}",
768
+ projectNone1: ' (none \u2014 pick "always allow" on a ShellConfirm prompt to add one,',
769
+ projectNone2: " or `/permissions add <prefix>` directly.)",
770
+ projectNoRoot: "Project allowlist \u2014 (no project root; chat mode shows builtin entries only)",
771
+ builtinHeader: "Builtin allowlist ({count}) \u2014 read-only, baked in",
772
+ subcommands: "Subcommands: /permissions add <prefix> \xB7 /permissions remove <prefix-or-N> \xB7 /permissions clear confirm"
773
+ },
774
+ dashboard: {
775
+ notAvailable: "/dashboard is not available in this context (no startDashboard callback wired).",
776
+ stopNoCallback: "/dashboard stop: no stop callback wired.",
777
+ notRunning: "\u25B8 dashboard is not running.",
778
+ stopping: "\u25B8 dashboard stopping\u2026",
779
+ alreadyRunning: "\u25B8 dashboard is already running:",
780
+ alreadyRunningHint: "Open it in any browser. Type `/dashboard stop` to tear it down.",
781
+ ready: "\u25B8 dashboard ready:",
782
+ readyHint: "127.0.0.1 only \xB7 token-gated. Type `/dashboard stop` to shut down.",
783
+ failed: "\u25B8 dashboard failed to start: {reason}",
784
+ starting: "\u25B8 starting dashboard server\u2026"
785
+ },
786
+ observability: {
787
+ contextInfo: "context: ~{total} of {max} ({pct}%) \xB7 system {sys} \xB7 tools {tools} \xB7 log {log}",
788
+ compactStarting: "\u25B8 folding older turns into a summary\u2026",
789
+ compactNoop: "\u25B8 nothing to fold \u2014 log already small or recent turns alone exceed the budget.",
790
+ compactDone: "\u25B8 folded {before} messages \u2192 {after} (summary {chars} chars). Continuing.",
791
+ compactFailed: "\u25B8 fold failed: {reason}",
792
+ costNoTurn: "no turn yet \u2014 `/cost` shows the most recent turn's token + spend breakdown.",
793
+ costNeedsTui: "/cost needs a TUI context (postUsage wired).",
794
+ costNoPricing: '\u25B8 /cost: no pricing table for model "{model}". Add one to telemetry/stats.ts.',
795
+ costEstimate: "\u25B8 /cost estimate \xB7 {model} \xB7 {prompt} prompt tokens (sys {sys} + tools {tools} + log {log} + msg {msg})",
796
+ costWorstCase: " worst case (full miss): {input} input + ~{output} output ({avg} avg) \u2248 {total}",
797
+ costLikely: " likely ({pct}% session cache hit): {input} input + ~{output} output \u2248 {total}",
798
+ costLikelyCold: " likely: matches worst case until cache fills (no completed turns yet)",
799
+ statusModel: " model {model}",
800
+ statusFlags: " flags stream={stream} \xB7 effort={effort}",
801
+ statusCtx: " ctx {bar} {used}/{max} ({pct}%)",
802
+ statusCtxNone: " ctx no turns yet",
803
+ statusCost: " cost ${cost} \xB7 cache {bar} {pct}% \xB7 turns {turns}",
804
+ statusCostCold: " cost ${cost} \xB7 turns {turns} (cache warming up)",
805
+ statusBudget: " budget ${spent} / ${cap} ({pct}%){tag}",
806
+ statusSession: ' session "{name}" \xB7 {count} messages in log (resumed {resumed})',
807
+ statusSessionEphemeral: " session (ephemeral \u2014 no persistence)",
808
+ statusWorkspace: " workspace {path} \xB7 pinned at launch (relaunch with --dir <path> to switch)",
809
+ statusMcp: " mcp {servers} server(s), {tools} tool(s) in registry",
810
+ statusEdits: " edits {count} pending (/apply to commit, /discard to drop)",
811
+ statusPlan: " plan ON \u2014 writes gated (submit_plan + approval)",
812
+ statusModeYolo: " mode YOLO \u2014 edits + shell auto-run with no prompt (/undo still rolls back \xB7 Shift+Tab to flip)",
813
+ statusModeAuto: " mode AUTO \u2014 edits apply immediately (u to undo within 5s \xB7 Shift+Tab to flip)",
814
+ statusModeReview: " mode review \u2014 edits queue for /apply or y (Shift+Tab to flip)",
815
+ statusDash: " dash {url} (open in browser \xB7 /dashboard stop)"
816
+ },
817
+ plans: {
818
+ noSession: "no session attached \u2014 `/plans` is per-session. Run `luckerr code` in a project to get a session.",
819
+ activePlan: "\u25B8 active plan{label} \u2014 {done}/{total} step{s} done \xB7 last touched {when}",
820
+ activeNone: "\u25B8 active plan: (none)",
821
+ noArchives: "no archived plans yet for this session \u2014 they auto-archive when every step is done",
822
+ archivedHeader: "Archived ({count}):",
823
+ replayNoSession: "no session attached \u2014 `/replay` is per-session. Run `luckerr code` in a project to get a session.",
824
+ replayNoArchives: "no archived plans yet for this session \u2014 `/replay` lights up once a plan completes (auto-archives when every step is done).",
825
+ replayInvalidIndex: "invalid index \u2014 `/replay` takes 1..{max} (newest = 1). Use `/plans` to see the list.",
826
+ archivedRow: " \u2713 {when} {total} step{s} \xB7 {completion} {label}",
827
+ completionComplete: "complete",
828
+ stopAborted: "\u25B8 plan stopped \u2014 model aborted; type a follow-up to continue or start a new task.",
829
+ doneUsage: "usage: /plans done <stepId> \xB7 /plans done all \u2014 manual override when the model forgot to call mark_step_complete",
830
+ doneUnavailable: "/plans done is only available inside an active session.",
831
+ doneNoPlan: "no active plan \u2014 nothing to mark done.",
832
+ doneNotInPlan: "step `{id}` is not in the active plan. Run /plans to see the step ids.",
833
+ doneAlready: "step `{id}` was already marked done.",
834
+ doneOk: "\u25B8 marked step `{id}` done.",
835
+ doneAllNoop: "every step is already done.",
836
+ doneAllOk: "\u25B8 marked {count} step(s) done."
837
+ },
838
+ jobs: {
839
+ codeOnly: "/jobs is only available inside `luckerr code`.",
840
+ killCodeOnly: "/kill is only available inside `luckerr code`.",
841
+ logsCodeOnly: "/logs is only available inside `luckerr code`.",
842
+ empty: "\u25C8 jobs \xB7 0 running \xB7 0 total\n (run_background spawns one \u2014 dev servers, watchers, long-running scripts)",
843
+ header: "\u25C8 jobs \xB7 {running} running \xB7 {total} total",
844
+ footer: " /logs <id> tail \xB7 /kill <id> SIGTERM \u2192 SIGKILL",
845
+ killUsage: "usage: /kill <id> (see /jobs for ids)",
846
+ killNotFound: "job {id}: not found",
847
+ killAlreadyExited: "job {id} already exited ({code})",
848
+ killStopping: "\u25B8 stopping job {id} (tree kill: SIGTERM \u2192 SIGKILL after 2s grace; Windows: taskkill /T /F)",
849
+ killStatus: "\u25B8 job {id} {status}",
850
+ killStillAlive: "still alive after SIGKILL (!) \u2014 report this as a bug",
851
+ logsUsage: "usage: /logs <id> [lines] (default last 80 lines)",
852
+ logsNotFound: "job {id}: not found",
853
+ logsStatus: "[job {id} \xB7 {status}]\n$ {command}",
854
+ logsRunning: "running \xB7 pid {pid}",
855
+ logsExited: "exited {code}",
856
+ logsFailed: "failed ({reason})",
857
+ logsStopped: "stopped"
858
+ },
859
+ memory: {
860
+ disabled: "memory is disabled (LUCKERR_MEMORY=off in env). Unset the var to re-enable \u2014 no LUCKERR.md or ~/.luckerr/memory content will be pinned in the meantime.",
861
+ noRoot: "no working directory on this session \u2014 `/memory` needs a root to resolve LUCKERR.md from. (Running in a test harness?)",
862
+ listEmpty: "no user memories yet. The model can call `remember` to save one, or you can create files by hand in ~/.luckerr/memory/global/ or the per-project subdir.",
863
+ listHeader: "User memories ({count}):",
864
+ listFooter: "View body: /memory show <name> Delete: /memory forget <name>",
865
+ showUsage: "usage: /memory show <name> or /memory show <scope>/<name>",
866
+ showNotFound: "no memory found: {target}",
867
+ showFailed: "show failed: {reason}",
868
+ forgetUsage: "usage: /memory forget <name> or /memory forget <scope>/<name>",
869
+ forgetNotFound: "no memory found: {target}",
870
+ forgetInfo: "\u25B8 forgot {scope}/{name}. Next /new or launch won't see it.",
871
+ forgetFailed: "could not forget {scope}/{name} (already gone?)",
872
+ forgetError: "forget failed: {reason}",
873
+ clearUsage: "usage: /memory clear <global|project> confirm",
874
+ clearConfirm: "about to delete every memory in scope={scope}. Re-run with the word 'confirm' to proceed: /memory clear {scope} confirm",
875
+ cleared: "\u25B8 cleared scope={scope} \u2014 deleted {count} memory file(s).",
876
+ noMemory: "no memory pinned in {root}.",
877
+ layers: "Three layers are available:",
878
+ layerProject: " 1. {file} \u2014 committable team memory (in the repo).",
879
+ layerGlobal: " 2. ~/.luckerr/memory/global/ \u2014 your cross-project private memory.",
880
+ layerProjectHash: " 3. ~/.luckerr/memory/<project-hash>/ \u2014 this project's private memory.",
881
+ askModel: "Ask the model to `remember` something, or hand-edit files directly.",
882
+ changesNote: "Changes take effect on next /new or launch \u2014 the system prompt is hashed once per session to keep the prefix cache warm.",
883
+ subcommands: "Subcommands: /memory list | /memory show <name> | /memory forget <name> | /memory clear <scope> confirm",
884
+ changesNoteShort: "Changes take effect on next /new or launch. Subcommands: /memory list | show | forget | clear"
885
+ },
886
+ mcp: {
887
+ noServers: 'no MCP servers attached. Run `luckerr setup` to pick some, or launch with --mcp "<spec>". `luckerr mcp list` shows the catalog.',
888
+ toolsLabel: " tools {count}",
889
+ resourcesHint: "`/resource` to browse+read",
890
+ promptsHint: "`/prompt` to browse+fetch",
891
+ awarenessOnly: "Chat mode consumes tools today; resources+prompts are surfaced here for awareness.",
892
+ catalogHint: "Full catalog: `luckerr mcp list` \xB7 deeper diagnosis: `luckerr mcp inspect <spec>`.",
893
+ fallbackServers: "MCP servers ({count}):",
894
+ fallbackTools: "Tools in registry ({count}):",
895
+ fallbackChange: "To change this set, exit and run `luckerr setup`.",
896
+ usageDisableEnable: "usage: /mcp {action} <name> \xB7 pick a name shown in /mcp (anonymous servers can't be named-toggled).",
897
+ usageReconnect: "usage: /mcp reconnect <name> \xB7 pick a name shown in /mcp.",
898
+ unknownServer: 'unknown MCP server "{name}". Known: {list}.',
899
+ noneList: "(none)",
900
+ reconnectNoTui: "/mcp reconnect requires the interactive TUI (postInfo not wired).",
901
+ liveTab: "Live",
902
+ marketplaceTab: "Marketplace",
903
+ tabHint: "tab to switch"
904
+ },
905
+ init: {
906
+ codeOnly: "/init only works in code mode (it needs filesystem tools).\nRun `luckerr code [path]` to start a session rooted at the\nproject you want to initialize, then run /init.",
907
+ exists: "\u25B8 LUCKERR.md already exists at {path}",
908
+ existsForce: " /init force regenerate from scratch (overwrites)",
909
+ existsEdit: " Or edit it by hand \u2014 it's just markdown. The current file is",
910
+ existsPinned: " pinned into the system prompt every launch as-is.",
911
+ info: "\u25B8 /init \u2014 model will scan the project and synthesize LUCKERR.md.\n The result lands as a pending edit; review with /apply or /walk."
912
+ },
913
+ webSearchEngine: {
914
+ currentEngine: "Current web search engine: {engine}",
915
+ endpoint: "SearXNG endpoint: {url}",
916
+ usageHeader: "Usage:",
917
+ usageMojeek: " /search-engine mojeek use Mojeek (default, no external deps)",
918
+ usageSearxng: " /search-engine searxng use SearXNG at default endpoint",
919
+ usageSearxngUrl: " /search-engine searxng <url> use SearXNG at custom endpoint",
920
+ alias: "Alias: /se",
921
+ searxngInfo: "SearXNG is a self-hosted metasearch engine (https://github.com/searxng/searxng).",
922
+ searxngInstall: "Install it with: docker run -d -p 8080:8080 searxng/searxng",
923
+ switched: 'Switched web search engine to "{engine}".{note}',
924
+ switchedSearxngNote: " Make sure SearXNG is running at {endpoint}.",
925
+ confirmed: '\u2713 Web search engine set to "{engine}"{detail}. Next assistant turn will pick up the change.',
926
+ confirmedDetail: " ({endpoint})"
927
+ },
928
+ skill: {
929
+ listEmpty: "no skills found. Luckerr reads skills from:",
930
+ listProjectScope: " \xB7 <project>/.luckerr/skills/<name>/SKILL.md (or <name>.md) \u2014 project scope",
931
+ listGlobalScope: " \xB7 ~/.luckerr/skills/<name>/SKILL.md (or <name>.md) \u2014 global scope",
932
+ listProjectOnly: " (project scope is only active in `luckerr code`)",
933
+ listFrontmatter: "Each file's frontmatter needs at least `name` and `description`.",
934
+ listInvoke: "Invoke a skill with `/skill <name> [args]` or by asking the model to call `run_skill`.",
935
+ listHeader: "User skills ({count}):",
936
+ listFooter: "View: /skill show <name> Run: /skill <name> [args] New: /skill new <name>",
937
+ listEmptyNewHint: "Scaffold one with: /skill new <name> (project scope) \u2014 there's no remote registry yet; you author skills directly.",
938
+ showUsage: "usage: /skill show <name>",
939
+ showNotFound: "no skill found: {name}",
940
+ runNotFound: "no skill found: {name} (try /skill list)",
941
+ runInfo: "\u25B8 running skill: {name}{args}",
942
+ newUsage: "usage: /skill new <name> [--global]",
943
+ newCreated: "\u25B8 created skill: {name}\n {path}\n edit it, then `/skill {name}` to invoke",
944
+ newError: "\u25B2 /skill new failed: {reason}"
945
+ }
946
+ },
947
+ statusBar: {
948
+ turn: "turn",
949
+ cache: "cache",
950
+ spent: "spent",
951
+ left: " left",
952
+ slow: "slow",
953
+ disconnect: "disconnect",
954
+ reconnecting: "reconnecting\u2026",
955
+ approvingIn: "approving in ",
956
+ escToInterrupt: "s \xB7 esc to interrupt",
957
+ recordingGlyph: "\u25CFREC",
958
+ mb: " MB",
959
+ evt: " evt",
960
+ editsLabel: "edits:",
961
+ mcpLoading: "MCP"
962
+ },
963
+ editMode: {
964
+ plan: "PLAN MODE",
965
+ yolo: "YOLO",
966
+ auto: "AUTO",
967
+ review: "REVIEW",
968
+ writesGated: " writes gated \xB7 /plan off to leave",
969
+ editsShellAuto: "edits + shell auto \xB7 /undo to roll back",
970
+ editsLandNow: "edits land now \xB7 u to undo",
971
+ queuedApplyDiscard: "{count} queued \xB7 y apply \xB7 n discard",
972
+ editsQueued: "edits queued \xB7 y apply \xB7 n discard",
973
+ shiftTabFlip: " {mid} \xB7 Shift+Tab to flip",
974
+ queuedDots: "queued\u2026"
975
+ },
976
+ composer: {
977
+ placeholder: "ask anything \xB7 slash for commands \xB7 at-sign for files",
978
+ waitingForResponse: "\u2026waiting for response\u2026",
979
+ hintSend: "send",
980
+ hintNewline: "newline",
981
+ hintClear: "clear",
982
+ hintScroll: "scroll",
983
+ hintHistory: "history",
984
+ hintAbort: "abort",
985
+ hintQuit: "quit",
986
+ abortedHint: "turn aborted by user \xB7 esc again to clear \xB7 \u23CE to ask a follow-up",
987
+ editorNoRawMode: "external editor unavailable \u2014 stdin doesn't support raw-mode toggling on this terminal",
988
+ editorFailed: "external editor:",
989
+ editorMissing: "no $EDITOR / $VISUAL / $GIT_EDITOR set \u2014 export one (e.g. `export EDITOR=nano`) and retry",
990
+ editorExited: "editor exited with code {code}"
991
+ },
992
+ pathConfirm: {
993
+ title: "Outside-sandbox path",
994
+ subtitleRead: "{tool} wants to READ a file outside the project sandbox",
995
+ subtitleWrite: "{tool} wants to WRITE a file outside the project sandbox",
996
+ awaiting: "awaiting",
997
+ denyTitle: "Deny \u2014 provide context",
998
+ optional: "optional",
999
+ denyFooter: "type context \xB7 \u23CE submit with reason \xB7 esc skip (deny without reason)",
1000
+ pickFooter: "\u2191\u2193 pick \xB7 \u23CE confirm \xB7 Tab add context \xB7 esc cancel",
1001
+ allowOnce: "allow once",
1002
+ allowOnceDesc: "permit this access; remember the directory for the rest of this session",
1003
+ allowAlways: "allow always",
1004
+ allowAlwaysDesc: "remember `{prefix}` for this project (persisted in ~/.luckerr/config.json)",
1005
+ deny: "deny",
1006
+ denyDesc: "press Tab to add context telling the model why",
1007
+ pathLabel: "path",
1008
+ sandboxLabel: "sandbox",
1009
+ allowPrefixLabel: "prefix"
1010
+ },
1011
+ shellConfirm: {
1012
+ title: "Shell command",
1013
+ bgTitle: "Background process",
1014
+ subtitle: "model wants to run a shell command",
1015
+ bgSubtitle: "long-running process \u2014 keeps running after approval, /kill to stop",
1016
+ denyTitle: "Deny \u2014 provide context",
1017
+ optional: "optional",
1018
+ denyFooter: "type context \xB7 \u23CE submit with reason \xB7 esc skip (deny without reason)",
1019
+ awaiting: "awaiting",
1020
+ pickFooter: "\u2191\u2193 pick \xB7 \u23CE confirm \xB7 Tab add context \xB7 esc cancel",
1021
+ allowOnce: "allow once",
1022
+ allowOnceDesc: "run this command, ask again next time",
1023
+ allowAlways: "allow always",
1024
+ allowAlwaysDesc: "remember `{prefix}` for this project",
1025
+ deny: "deny",
1026
+ denyDesc: "press Tab to add context telling the model why",
1027
+ cwdLabel: "cwd",
1028
+ timeoutLabel: "timeout",
1029
+ waitLabel: "wait",
1030
+ previewMore: "\u2026 {n} more line hidden \u2014 press esc, ask the model to split it",
1031
+ previewMorePlural: "\u2026 {n} more lines hidden \u2014 press esc, ask the model to split it"
1032
+ },
1033
+ editConfirm: {
1034
+ footer: "[y/Enter] apply \xB7 [n] reject with reason \xB7 [a] apply rest \xB7 [A] flip AUTO \xB7 [\u2191\u2193/Space] scroll \xB7 [Esc] abort",
1035
+ newTag: "NEW",
1036
+ editTag: "EDIT",
1037
+ linesCount: "-{removed} +{added} lines",
1038
+ viewingRange: "viewing {start}-{end}/{total}",
1039
+ denyFooter: "\u23CE submit \xB7 esc skip (deny without reason)",
1040
+ oldLabel: " - old",
1041
+ newLabel: " + new",
1042
+ sideBySide: " side-by-side \xB7 removed lines on the left, added on the right \xB7 paired by offset",
1043
+ linesAbove: " \u2191 {count} line above (\u2191/k or PgUp)",
1044
+ linesAbovePlural: " \u2191 {count} lines above (\u2191/k or PgUp)",
1045
+ linesBelow: " \u2193 {count} line below (\u2193/j or Space/PgDn)",
1046
+ linesBelowPlural: " \u2193 {count} lines below (\u2193/j or Space/PgDn)"
1047
+ },
1048
+ sessionPicker: {
1049
+ header: " \u25C8 LUCKERR \xB7 pick a session ",
1050
+ title: "pick a session \u2014 {workspace}",
1051
+ messages: "{count} message",
1052
+ messagesPlural: "{count} messages",
1053
+ turns: "{count} turns",
1054
+ pickerHint: "\u2191\u2193 pick \xB7 \u23CE open \xB7 [n] new \xB7 [d] delete \xB7 [r] rename \xB7 esc quit",
1055
+ empty: " no saved sessions in this workspace yet \u2014 press ",
1056
+ emptyNew: " to start a new one",
1057
+ renamePrompt: ' rename "{from}" \u2192 ',
1058
+ renameHint: " \u23CE confirm rename \xB7 esc cancel",
1059
+ emptyHint: " \u23CE new session \xB7 esc quit",
1060
+ justNow: "just now",
1061
+ minAgo: "{count} min ago",
1062
+ yesterday: "yesterday",
1063
+ hoursAgo: "{count}h ago",
1064
+ daysAgo: "{count} days ago"
1065
+ },
1066
+ modelPicker: {
1067
+ header: " \u25C8 LUCKERR \xB7 pick a setup ",
1068
+ loading: " \xB7 loading catalog\u2026",
1069
+ catalogEmpty: " \xB7 catalog empty \u2014 using known fallbacks",
1070
+ modelsAvailable: " \xB7 {count} models available",
1071
+ presetsHeader: " PRESETS \xB7 recommended \u2014 model + effort + auto-escalate",
1072
+ modelsHeader: " MODELS \xB7 raw pick \u2014 auto-escalate stays as-is",
1073
+ pickerFooter: " \u2191\u2193 pick \xB7 \u23CE confirm \xB7 [r] refresh \xB7 esc cancel",
1074
+ currentLabel: " \xB7 current"
1075
+ },
1076
+ slashSuggestions: {
1077
+ noMatch: "no slash command matches that prefix",
1078
+ backspaceHint: " \u2014 Backspace to edit, or /help for the full list",
1079
+ commandCount: "{count} command",
1080
+ commandCountPlural: "{count} commands",
1081
+ aboveLabel: " \u2191 {count} above",
1082
+ belowLabel: " \u2193 {count} below",
1083
+ advancedHint: " + {count} advanced \xB7 type a letter to search",
1084
+ footerHint: " \u2191\u2193 navigate \xB7 Tab / \u23CE pick \xB7 esc cancel",
1085
+ groupChat: "CHAT",
1086
+ groupSetup: "SETUP",
1087
+ groupInfo: "INFO",
1088
+ groupSession: "SESSION",
1089
+ groupExtend: "EXTEND",
1090
+ groupCode: "CODE",
1091
+ groupJobs: "JOBS",
1092
+ groupAdvanced: "ADVANCED",
1093
+ groupDetailSetup: "model + cost",
1094
+ groupDetailInfo: "current state",
1095
+ groupDetailChat: "daily turn ops",
1096
+ groupDetailExtend: "MCP, memory, skills",
1097
+ groupDetailSession: "saved sessions",
1098
+ groupDetailCode: "edits + plans (code mode)",
1099
+ groupDetailJobs: "background processes (code mode)",
1100
+ groupDetailAdvanced: "rare or set-and-forget"
1101
+ },
1102
+ atMentions: {
1103
+ loading: "loading\u2026",
1104
+ entrySingular: "{count} entry",
1105
+ entryPlural: "{count} entries",
1106
+ searching: "searching\u2026",
1107
+ scanned: "scanned",
1108
+ match: "match",
1109
+ matches: "matches",
1110
+ forFilter: 'for "{filter}"',
1111
+ noMatch: 'no files match "{filter}"',
1112
+ emptyDir: "empty directory",
1113
+ scanning: "scanning the tree\u2026",
1114
+ footerBrowse: "\u2191\u2193 navigate \xB7 Tab drill into folder \xB7 \u23CE insert \xB7 esc cancel",
1115
+ footerBrowseSearch: "\u2191\u2193 navigate \xB7 Tab / \u23CE insert as @path \xB7 esc cancel",
1116
+ footerInsert: "\u2191\u2193 navigate \xB7 Tab / \u23CE insert as @path \xB7 esc cancel"
1117
+ },
1118
+ statsPanel: {
1119
+ modePlan: "PLAN",
1120
+ modeYolo: "yolo",
1121
+ modeAuto: "auto",
1122
+ modeReview: "review",
1123
+ pro: "\u21E7 pro",
1124
+ budget: " budget "
1125
+ },
1126
+ welcomeBanner: {
1127
+ workspace: "\u25B8 workspace",
1128
+ relaunchHint: " (relaunch with --dir <path> to switch)",
1129
+ dashboard: "\u25B8 web"
1130
+ },
1131
+ ctxBreakdown: {
1132
+ title: "\u25A3 context",
1133
+ compactHint: " /compact folds (auto at 50%) \xB7 /new wipes log",
1134
+ topTools: " top tool results by cost ({count}):",
1135
+ msg: "msg",
1136
+ turnLabel: "turn"
1137
+ },
1138
+ startup: {
1139
+ codeRooted: '\u25B8 luckerr code: rooted at {rootDir}, session "{session}" \xB7 {tools} native tool(s){semantic}',
1140
+ ephemeral: "(ephemeral)",
1141
+ semanticOn: " \xB7 semantic_search on"
1142
+ },
1143
+ doctorErrors: {
1144
+ unreadable: "{path} unreadable \u2014 {message}",
1145
+ cannotList: "cannot list \u2014 {message}",
1146
+ parseFailed: "couldn't parse settings.json \u2014 {message}",
1147
+ probeFailed: "probe failed \u2014 {message}"
1148
+ },
1149
+ webErrors: {
1150
+ status: "web_search {status} \u2014 try: the search backend returned an error; rephrase the query, or switch engine with /search-engine mojeek|searxng",
1151
+ rateLimit429: "web_search 429 \u2014 try: wait 10s before retrying, or rephrase the query; the search backend is rate-limiting this client",
1152
+ forbidden403: "web_search 403 \u2014 try: the search backend is blocking this client; switch engine with /search-engine mojeek|searxng, or wait and retry later",
1153
+ serverError5xx: "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",
1154
+ mojeekBlocked: "web_search: Mojeek anti-bot page \u2014 rate-limited or blocked \u2014 try: wait 30s and retry, or switch engine with /search-engine searxng",
1155
+ mojeekNoResults: "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 searxng",
1156
+ invalidEndpoint: 'web_search: invalid SearXNG endpoint "{endpoint}" \u2014 try: set a valid URL with /search-endpoint http://host:port',
1157
+ endpointMustBeHttp: "web_search: SearXNG endpoint must be http(s), got {protocol} \u2014 try: set a valid URL with /search-endpoint http://host:port",
1158
+ cannotReach: "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 the default engine with /search-engine mojeek",
1159
+ searxngNoResults: "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 mojeek",
1160
+ fetchStatus: "web_fetch {status} for {url} \u2014 try: confirm the URL resolves in a browser; status suggests the host returned an error page",
1161
+ fetchRateLimit429: "web_fetch 429 for {url} \u2014 try: wait 10s before retrying; the host is rate-limiting this client",
1162
+ fetchForbidden403: "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",
1163
+ fetchServerError5xx: "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",
1164
+ fetchTimeout: "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",
1165
+ fetchTooLarge: "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",
1166
+ fetchBodyTooLarge: "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",
1167
+ fetchInvalidUrl: "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)"
1168
+ },
1169
+ choiceConfirm: {
1170
+ customLabel: "Let me type my own answer",
1171
+ customDesc: "None of the above fits \u2014 type a free-form reply. The model reads it verbatim.",
1172
+ cancelLabel: "Cancel \u2014 drop the question",
1173
+ cancelDesc: "Model stops and asks what you want instead."
1174
+ },
1175
+ cardTitles: {
1176
+ usage: "usage",
1177
+ context: "context",
1178
+ search: "search",
1179
+ subagent: "subagent",
1180
+ reply: "reply",
1181
+ reasoning: "reasoning",
1182
+ reasoningAborted: "reasoning (aborted)",
1183
+ reasoningEllipsis: "reasoning\u2026",
1184
+ error: "error",
1185
+ doctor: "doctor",
1186
+ you: "you",
1187
+ task: "task"
1188
+ },
1189
+ cardLabels: {
1190
+ prompt: "prompt",
1191
+ reason: "reason",
1192
+ output: "output",
1193
+ cache: "cache",
1194
+ session: "session",
1195
+ balance: "balance",
1196
+ turn: "turn",
1197
+ system: "system",
1198
+ tools: "tools",
1199
+ log: "log",
1200
+ input: "input",
1201
+ topTools: "top tools",
1202
+ logMsgs: "log msgs",
1203
+ hitSingular: "{count} hit \xB7 {files} file",
1204
+ hitsPlural: "{count} hits \xB7 {files} files",
1205
+ moreHitSingular: "\u22EE +{count} more hit",
1206
+ moreHitsPlural: "\u22EE +{count} more hits",
1207
+ earlierLine: "\u22EE {count} earlier line (use /tool to read full)",
1208
+ earlierLines: "\u22EE {count} earlier lines (use /tool to read full)",
1209
+ earlierStackLine: "\u22EE {count} earlier stack line hidden",
1210
+ earlierStackLines: "\u22EE {count} earlier stack lines hidden",
1211
+ agent: "agent \xB7 {name}",
1212
+ response: "response",
1213
+ writing: "writing \u2026",
1214
+ tok: "tok",
1215
+ pilcrow: "\xB6",
1216
+ aborted: "aborted",
1217
+ truncatedByEsc: "[truncated by esc]",
1218
+ rejected: "rejected",
1219
+ exit: "exit {code}",
1220
+ bytesIn: "{bytes} in",
1221
+ elapsedSec: "{secs}s",
1222
+ stackTrace: "stack trace",
1223
+ retries: "retries",
1224
+ reasoningLabel: "reasoning \xB7 {count} \xB6",
1225
+ runningLabel: "running",
1226
+ workingLabel: "working",
1227
+ defaultFooter: "\u2191\u2193 pick \xB7 \u23CE confirm \xB7 esc cancel",
1228
+ applyAction: "[a] apply",
1229
+ skipAction: "[s] skip",
1230
+ rejectAction: "[r] reject",
1231
+ levelOk: "OK",
1232
+ levelWarn: "warn",
1233
+ levelFail: "FAIL",
1234
+ checksLabel: "checks",
1235
+ passed: "passed",
1236
+ warnTag: "warn",
1237
+ failTag: "fail",
1238
+ stepLabel: "step",
1239
+ done: "done",
1240
+ inProgress: "\u2190 in progress",
1241
+ upcoming: "upcoming",
1242
+ resumed: "resumed \xB7 ",
1243
+ archive: "\u23EA archive \xB7 ",
1244
+ more: "\u22EE +{count} more",
1245
+ categoryUser: "user",
1246
+ categoryFeedback: "feedback",
1247
+ categoryProject: "project",
1248
+ categoryReference: "reference"
1249
+ },
1250
+ copyMode: {
1251
+ title: "\u2500\u2500 COPY MODE \u2500\u2500",
1252
+ help: "j/k or \u2191/\u2193 move \xB7 v select \xB7 y yank \xB7 g/G top/bottom \xB7 q quit",
1253
+ statusBar: "line {cur}/{total} \xB7 selection: {sel}",
1254
+ statusYanked: "yanked {size} chars (osc52={osc52})",
1255
+ statusEmpty: "nothing selected",
1256
+ empty: "(no chat content yet \u2014 say something to the model first)",
1257
+ labelUser: "you",
1258
+ labelAssistant: "assistant",
1259
+ labelReasoning: "reasoning",
1260
+ yankedToast: "\u25B8 copied {size} chars to clipboard (osc52)",
1261
+ yankedToastFile: "\u25B8 copied {size} chars \xB7 file: {path}"
1262
+ },
1263
+ mcpHealth: {
1264
+ noData: "no inspect data",
1265
+ healthy: "healthy \xB7 {ms}ms",
1266
+ slow: "slow \xB7 {ms}ms",
1267
+ verySlow: "very slow \xB7 {ms}ms",
1268
+ slowToast: "\u26A0 MCP `{name}` slow \xB7 {seconds}s p95 over the last {sampleSize} calls",
1269
+ emptyHint: "\u2139 no MCP servers configured \u2014 try: `luckerr setup` to re-pick, or `luckerr mcp install filesystem`"
1270
+ },
1271
+ denyContextInput: {
1272
+ description: "Tell the agent why you denied this. The next attempt will see your reason as additional context."
1273
+ },
1274
+ cardStream: {
1275
+ scrollAbove: " \u2191 {scroll} / {max} row above",
1276
+ scrollAbovePlural: " \u2191 {scroll} / {max} rows above",
1277
+ scrollMore: " \u2014 {remaining} more",
1278
+ scrollPgUp: " \xB7 PgUp / wheel / \u2191"
1279
+ },
1280
+ slashArgPicker: {
1281
+ noMatch: 'no match for "{partial}"',
1282
+ keepTyping: " \u2014 keep typing, or Backspace to edit",
1283
+ above: " \u2191 {hidden} above",
1284
+ below: " \u2193 {hidden} below",
1285
+ footer: " \u2191\u2193 navigate \xB7 Tab / \u23CE pick \xB7 esc cancel"
1286
+ },
1287
+ mcpMarketplace: {
1288
+ title: "MCP marketplace",
1289
+ filter: "filter: ",
1290
+ filterPlaceholder: "(type to filter)",
1291
+ matchSingular: "{n} match",
1292
+ matchPlural: "{n} matches",
1293
+ loading: "loading\u2026",
1294
+ noEntries: "no entries",
1295
+ opening: "opening registry\u2026",
1296
+ cached: "\xB7 cached",
1297
+ exhausted: "\xB7 exhausted",
1298
+ loadingMore: "loading more\u2026",
1299
+ allLoaded: "all pages loaded",
1300
+ fetchingDetail: "fetching smithery detail\u2026",
1301
+ noInstallInfo: "no install info for {name} - try `npx -y @smithery/cli install {name}`",
1302
+ alreadyInstalled: "already installed: {spec}",
1303
+ installed: "installed \u2192 {spec}",
1304
+ uninstalled: "uninstalled {name}",
1305
+ installFailed: "install failed: {message}",
1306
+ notInstalled: "not installed: {name}",
1307
+ bridged: "\u2713 installed {name} - bridged",
1308
+ bridgeFailed: "\u25B2 installed {name} - bridge failed: {reason}",
1309
+ bridgeReloadFailed: "\u2713 installed {name} - restart `luckerr code` to bridge (reload failed: {message})",
1310
+ restartBridge: "\u2713 installed {name} - restart `luckerr code` to bridge",
1311
+ needsEnv: " \xB7 needs env: {env}",
1312
+ badgeOfficial: "[off]",
1313
+ badgeSmithery: "[smt]",
1314
+ badgeLocal: "[loc]",
1315
+ footerHint: "type filter \xB7 \u2191\u2193 pick \xB7 \u23CE install/toggle \xB7 PgDn load more \xB7 esc close",
1316
+ specLine: "spec: {runtime} {id} \xB7 {transport}",
1317
+ smitheryDetail: "(smithery listing \u2014 install detail fetched on Enter)",
1318
+ statusError: "error: {message}"
1319
+ },
1320
+ mcpBrowser: {
1321
+ title: "\u25C8 MCP browser",
1322
+ empty: "No MCP servers attached. Run `luckerr setup` to pick some, or launch with --mcp.",
1323
+ serverCount: "{count} server{s}",
1324
+ footer: "\u2191\u2193 pick \xB7 [r] reconnect \xB7 [d] disable \xB7 esc quit"
1325
+ },
1326
+ mcpLifecycle: {
1327
+ handshake: "handshake\u2026",
1328
+ connected: "connected",
1329
+ failed: "failed",
1330
+ disabled: "disabled",
1331
+ reconnect: "reconnect\u2026",
1332
+ initDetail: "initialise \u2192 tools/list \u2192 resources/list",
1333
+ reconnectDetail: "tearing down \xB7 re-handshake \xB7 listing tools",
1334
+ disabledDetail: "via /mcp disable {name}"
1335
+ },
1336
+ checkpointPicker: {
1337
+ title: "restore a checkpoint \u2014 {workspace}",
1338
+ header: " \u25C8 LUCKERR \xB7 pick a checkpoint ",
1339
+ empty: " no checkpoints in this workspace yet - see /checkpoint to make one",
1340
+ more: " \u2026 {hidden} more",
1341
+ footer: " \u2191\u2193 pick \xB7 \u23CE restore \xB7 [d] forget \xB7 esc quit",
1342
+ footerEmpty: " esc quit"
1343
+ },
1344
+ planReviseConfirm: {
1345
+ title: "plan revision proposed",
1346
+ metaRight: "\u2212{removed} +{added} \xB7 {kept} kept",
1347
+ updatedSummary: "updated summary: {summary}",
1348
+ acceptLabel: "Accept revision - apply the new step list",
1349
+ acceptHint: "Replaces the remaining plan with the proposed steps. Done steps are untouched.",
1350
+ rejectLabel: "Reject - keep the original plan",
1351
+ rejectHint: "Drops the proposal. Model continues with the original remaining steps."
1352
+ },
1353
+ diffApp: {
1354
+ title: "luckerr diff",
1355
+ turnLabel: "turn {turn} ({current}/{total})",
1356
+ turnsAligned: "{count} turns aligned",
1357
+ paneEmpty: "(no records on this side for this turn)",
1358
+ kindMatch: "\u2713 match",
1359
+ kindDiverge: "\u2605 diverge",
1360
+ kindOnlyInA: "\u2190 only in A",
1361
+ kindOnlyInB: "\u2192 only in B"
1362
+ },
1363
+ recordView: {
1364
+ userPrefix: "you \u203A ",
1365
+ assistant: "assistant",
1366
+ toolPrefix: "tool<",
1367
+ argsLabel: " args: ",
1368
+ resultArrow: " \u2192 ",
1369
+ error: "error ",
1370
+ cache: " \xB7 cache ",
1371
+ toolCallOnly: "(tool-call response only)",
1372
+ truncateExtra: "(+{extra} chars)"
1373
+ },
1374
+ replayApp: {
1375
+ emptyTranscript: "empty transcript",
1376
+ turnProgress: "turn {current}/{total}",
1377
+ noRecords: "no records",
1378
+ untracked: "(untracked)",
1379
+ churned: "(churned \xD7{count})"
1380
+ }
1381
+ };
1382
+
1383
+ // src/i18n/zh-CN.ts
1384
+ var zhCN = {
1385
+ common: {
1386
+ error: "\u9519\u8BEF",
1387
+ warning: "\u8B66\u544A",
1388
+ loading: "\u52A0\u8F7D\u4E2D...",
1389
+ done: "\u5B8C\u6210",
1390
+ cancel: "\u53D6\u6D88",
1391
+ confirm: "\u786E\u8BA4",
1392
+ back: "\u8FD4\u56DE",
1393
+ next: "\u4E0B\u4E00\u6B65",
1394
+ tool: "\u5DE5\u5177",
1395
+ running: "\u8FD0\u884C\u4E2D",
1396
+ noTurns: "(\u6682\u65E0\u5BF9\u8BDD)"
1397
+ },
1398
+ cli: {
1399
+ description: "DeepSeek \u539F\u751F\u667A\u80FD\u4F53\u6846\u67B6 \u2014 \u4E13\u4E3A\u7F13\u5B58\u547D\u4E2D\u548C\u4F4E\u6210\u672C\u4EE4\u724C\u6784\u5EFA\u3002",
1400
+ continue: "\u6062\u590D\u6700\u8FD1\u4F7F\u7528\u7684\u804A\u5929\u4F1A\u8BDD\uFF0C\u4E0D\u663E\u793A\u9009\u62E9\u5668\u3002",
1401
+ setup: "\u4EA4\u4E92\u5F0F\u5411\u5BFC \u2014 API \u5BC6\u94A5\u3001\u9884\u8BBE\u3001MCP \u670D\u52A1\u5668\u3002\u968F\u65F6\u91CD\u65B0\u8FD0\u884C\u4EE5\u91CD\u65B0\u914D\u7F6E\u3002",
1402
+ code: "\u4EE3\u7801\u7F16\u8F91\u804A\u5929 \u2014 \u4EE5 <dir>\uFF08\u9ED8\u8BA4\uFF1Acwd\uFF09\u4E3A\u6839\u7684\u6587\u4EF6\u7CFB\u7EDF\u5DE5\u5177\uFF0C\u7F16\u7801\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF0Cv4-flash \u57FA\u7EBF\u3002",
1403
+ chat: "\u5177\u6709\u5B9E\u65F6\u7F13\u5B58/\u6210\u672C\u9762\u677F\u7684\u4EA4\u4E92\u5F0F Ink TUI\u3002",
1404
+ run: "\u4EE5\u975E\u4EA4\u4E92\u65B9\u5F0F\u8FD0\u884C\u5355\u4E2A\u4EFB\u52A1\uFF0C\u6D41\u5F0F\u8F93\u51FA\u3002",
1405
+ stats: "\u663E\u793A\u4F7F\u7528\u60C5\u51B5\u4EEA\u8868\u677F\u3002",
1406
+ doctor: "\u4E00\u952E\u5065\u5EB7\u68C0\u67E5\u3002",
1407
+ commit: "\u4ECE\u6682\u5B58\u7684\u5DEE\u5F02\u4E2D\u8D77\u8349\u63D0\u4EA4\u6D88\u606F\u3002",
1408
+ sessions: "\u5217\u51FA\u4FDD\u5B58\u7684\u804A\u5929\u4F1A\u8BDD\uFF0C\u6216\u6309\u540D\u79F0\u68C0\u67E5\u3002",
1409
+ pruneSessions: "\u5220\u9664\u7A7A\u95F2 \u2265N \u5929\u7684\u5DF2\u4FDD\u5B58\u4F1A\u8BDD\uFF08\u9ED8\u8BA4 90\uFF09\u3002\u4F7F\u7528 --dry-run \u9884\u89C8\u3002",
1410
+ events: "\u7F8E\u5316\u6253\u5370\u5185\u6838\u4E8B\u4EF6\u65E5\u5FD7\u4FA7\u8FB9\u6587\u4EF6\u3002",
1411
+ replay: "\u4EA4\u4E92\u5F0F Ink TUI\uFF0C\u7528\u4E8E\u6D4F\u89C8\u8F6C\u5F55\u7A3F\u3002",
1412
+ diff: "\u5728\u5206\u680F Ink TUI \u4E2D\u6BD4\u8F83\u4E24\u4E2A\u8F6C\u5F55\u7A3F\u3002",
1413
+ mcp: "\u6A21\u578B\u4E0A\u4E0B\u6587\u534F\u8BAE (MCP) \u52A9\u624B \u2014 \u53D1\u73B0\u670D\u52A1\u5668\uFF0C\u6D4B\u8BD5\u60A8\u7684\u8BBE\u7F6E\u3002",
1414
+ version: "\u6253\u5370 Luckerr \u7248\u672C\u3002",
1415
+ update: "\u68C0\u67E5\u8F83\u65B0\u7248\u672C\u7684 Luckerr \u5E76\u5B89\u88C5\u3002",
1416
+ index: "\u6784\u5EFA\uFF08\u6216\u589E\u91CF\u5237\u65B0\uFF09\u672C\u5730\u8BED\u4E49\u641C\u7D22\u7D22\u5F15\u3002"
1417
+ },
1418
+ ui: {
1419
+ welcome: "\u968F\u65F6\u8FD0\u884C `luckerr` \u5F00\u59CB\u804A\u5929 \u2014 \u60A8\u7684\u8BBE\u7F6E\u5C06\u88AB\u8BB0\u4F4F\u3002",
1420
+ taglineChat: "DeepSeek \u539F\u751F\u667A\u80FD\u4F53",
1421
+ taglineCode: "DeepSeek \u539F\u751F\u4EE3\u7801\u667A\u80FD\u4F53",
1422
+ taglineSub: "\u7F13\u5B58\u4F18\u5148 \xB7 Flash \u4F18\u5148",
1423
+ startSessionHint: "\u8F93\u5165\u6D88\u606F\u4EE5\u5F00\u59CB\u60A8\u7684\u4F1A\u8BDD",
1424
+ inputPlaceholder: "\u8F93\u5165\u4EFB\u4F55\u5185\u5BB9... (\u8F93\u5165 / \u4F7F\u7528\u547D\u4EE4, @ \u5F15\u7528\u6587\u4EF6)",
1425
+ busy: "\u601D\u8003\u4E2D...",
1426
+ thinking: "\u25B8 \u601D\u8003\u4E2D...",
1427
+ undo: "\u64A4\u6D88",
1428
+ undoHint: "\u5728 5 \u79D2\u5185\u6309 u \u64A4\u6D88",
1429
+ applied: "\u5DF2\u5E94\u7528",
1430
+ rejected: "\u5DF2\u62D2\u7EDD",
1431
+ noDashboard: "\u7981\u6B62\u81EA\u52A8\u542F\u52A8\u5D4C\u5165\u5F0F Web \u4EEA\u8868\u677F\u3002",
1432
+ dashboardPortHint: "\u5C06\u4EEA\u8868\u677F\u7ED1\u5B9A\u5230\u56FA\u5B9A\u7AEF\u53E3 (1\u201365535)\u3002\u91CD\u542F\u540E\u4FDD\u6301\u7A33\u5B9A \u2014 SSH \u96A7\u9053\u8BBF\u95EE\u5FC5\u9700\u3002\u9ED8\u8BA4\u4E3A\u4E34\u65F6\u7AEF\u53E3\u3002",
1433
+ dashboardPortInvalid: "\u25B2 \u5FFD\u7565 --dashboard-port={value} (\u5FC5\u987B\u4E3A 1\u201365535 \u4E4B\u95F4\u7684\u6574\u6570) \u2014 \u56DE\u9000\u5230\u4E34\u65F6\u7AEF\u53E3",
1434
+ dashboardAutoStartFailed: "\u25B2 \u4EEA\u8868\u677F\u81EA\u52A8\u542F\u52A8\u5931\u8D25 ({reason}) \u2014 \u5C1D\u8BD5 /dashboard\uFF0C\u6216\u4F20\u9012 --no-dashboard \u4EE5\u9759\u9ED8",
1435
+ systemAppendHint: "\u8FFD\u52A0\u6307\u4EE4\u5230\u4EE3\u7801\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002\u4E0D\u66FF\u6362\u9ED8\u8BA4\u63D0\u793A\u8BCD \u2014 \u5728\u5176\u540E\u6DFB\u52A0\u3002",
1436
+ systemAppendFileHint: "\u8FFD\u52A0\u6587\u4EF6\u5185\u5BB9\u5230\u4EE3\u7801\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002\u4E0D\u66FF\u6362\u9ED8\u8BA4\u63D0\u793A\u8BCD\u3002UTF-8\uFF0C\u76F8\u5BF9\u4E8E cwd \u6216\u7EDD\u5BF9\u8DEF\u5F84\u3002",
1437
+ resumedSession: '\u25B8 \u5DF2\u6062\u590D\u4F1A\u8BDD "{name}"\uFF0C\u5305\u542B {count} \u6761\u5386\u53F2\u6D88\u606F \xB7 /new \u91CD\u65B0\u5F00\u59CB \xB7 /sessions \u7BA1\u7406',
1438
+ newSession: '\u25B8 \u4F1A\u8BDD "{name}" (\u65B0) \u2014 \u968F\u804A\u968F\u5B58 \xB7 /sessions \u91CD\u547D\u540D\u6216\u5220\u9664',
1439
+ ephemeralSession: "\u25B8 \u4E34\u65F6\u804A\u5929 (\u4E0D\u4FDD\u5B58\u4F1A\u8BDD) \u2014 \u53BB\u6389 --no-session \u4EE5\u542F\u7528\u4FDD\u5B58",
1440
+ restoredEdits: "\u25B8 \u4ECE\u4E2D\u65AD\u7684\u8FD0\u884C\u4E2D\u6062\u590D\u4E86 {count} \u4E2A\u5F85\u5904\u7406\u7684\u7F16\u8F91\u5757 \u2014 /apply \u63D0\u4EA4\u6216 /discard \u653E\u5F03\u3002",
1441
+ resumedPlan: "\u5DF2\u6062\u590D\u8BA1\u5212 \xB7 {when}{summary}",
1442
+ tipEditBindings: {
1443
+ topic: "\u7F16\u8F91\u95E8\u63A7\u5FEB\u6377\u952E",
1444
+ sections: [
1445
+ {
1446
+ rows: [
1447
+ { key: "y / n", text: "\u63A5\u53D7\u6216\u653E\u5F03\u5F85\u5904\u7406\u7684\u7F16\u8F91" },
1448
+ { key: "Shift+Tab", text: "\u5207\u6362 \u9884\u89C8 \u2194 \u81EA\u52A8\uFF08\u6301\u4E45\u5316\uFF1B\u81EA\u52A8\u6A21\u5F0F\u7ACB\u5373\u5E94\u7528\uFF09" },
1449
+ { key: "u", text: "\u64A4\u9500\u4E0A\u6B21\u81EA\u52A8\u5E94\u7528\u7684\u6279\u5904\u7406\uFF085 \u79D2\u6A2A\u5E45\u5185\uFF09" }
1450
+ ]
1451
+ }
1452
+ ],
1453
+ footer: "\u5F53\u524D\u6A21\u5F0F\u663E\u793A\u5728\u5E95\u90E8\u72B6\u6001\u680F \xB7 /keys \u67E5\u770B\u5B8C\u6574\u5FEB\u6377\u952E\u53C2\u8003"
1454
+ },
1455
+ tipMouseClipboard: {
1456
+ topic: "\u9F20\u6807 + \u526A\u8D34\u677F",
1457
+ sections: [
1458
+ {
1459
+ rows: [
1460
+ { key: "\u62D6\u52A8", text: "\u76F4\u63A5\u9009\u4E2D\u6587\u672C \u2014 \u7EC8\u7AEF\u539F\u751F\uFF0C\u4E0D\u9700\u8981\u6309 Shift" },
1461
+ {
1462
+ key: "\u53F3\u952E",
1463
+ text: "\u7EC8\u7AEF\u539F\u751F\u83DC\u5355\uFF08Windows Terminal \u7B49\u7684\u590D\u5236 / \u7C98\u8D34\uFF09"
1464
+ },
1465
+ { key: "\u6EDA\u8F6E", text: "\u6EDA\u52A8\u804A\u5929\u8BB0\u5F55\uFF08Web / \u4E91\u7AEF / SSH \u7EC8\u7AEF\u4E5F\u80FD\u7528\uFF09" },
1466
+ {
1467
+ key: "\u2191 / \u2193",
1468
+ text: "\u6EDA\u52A8\u804A\u5929 \xB7 \u8F93\u5165\u6846\u5386\u53F2 + \u591A\u884C\u5149\u6807\u7528 Ctrl+P / Ctrl+N"
1469
+ }
1470
+ ]
1471
+ }
1472
+ ],
1473
+ footer: "\u8FD0\u884C /keys \u67E5\u770B\u5B8C\u6574\u952E\u76D8 + \u9F20\u6807\u53C2\u8003"
1474
+ },
1475
+ keysReference: {
1476
+ topic: "Luckerr \u952E\u76D8 + \u9F20\u6807\u53C2\u8003",
1477
+ sections: [
1478
+ {
1479
+ title: "\u952E\u76D8",
1480
+ rows: [
1481
+ { key: "Enter", text: "\u63D0\u4EA4\u8F93\u5165" },
1482
+ { key: "Shift+Enter", text: "\u5728\u8F93\u5165\u6846\u4E2D\u63D2\u5165\u6362\u884C" },
1483
+ { key: "\u2191 / \u2193", text: "\u6EDA\u52A8\u804A\u5929\u8BB0\u5F55\uFF08\u9F20\u6807\u6EDA\u8F6E\u4E5F\u8D70\u8FD9\u6761\u8DEF\u5F84\uFF09" },
1484
+ {
1485
+ key: "Ctrl+P / Ctrl+N",
1486
+ text: "\u4E0A\u4E00\u6761 / \u4E0B\u4E00\u6761\u8F93\u5165\u5386\u53F2 \xB7 \u591A\u884C\u8349\u7A3F\u4E2D\u6309\u884C\u79FB\u52A8\u5149\u6807"
1487
+ },
1488
+ { key: "Ctrl+A / Ctrl+E", text: "\u8DF3\u5230\u5F53\u524D\u884C\u7684\u5F00\u5934 / \u7ED3\u5C3E" },
1489
+ { key: "Ctrl+W", text: "\u5220\u9664\u5149\u6807\u524D\u7684\u4E00\u4E2A\u8BCD" },
1490
+ { key: "Ctrl+U", text: "\u6E05\u7A7A\u6574\u4E2A\u8F93\u5165\u7F13\u51B2\u533A" },
1491
+ { key: "Tab", text: "\u8865\u5168 @-mention \xB7 \u8FDB\u5165\u6587\u4EF6\u5939 \xB7 \u63A5\u53D7 slash \u547D\u4EE4" },
1492
+ { key: "Shift+Tab", text: "\u7F16\u8F91\u95E8\u63A7\uFF1A\u5207\u6362 \u9884\u89C8 \u2194 \u81EA\u52A8 \u6A21\u5F0F" },
1493
+ { key: "Esc", text: "\u5173\u95ED\u5F39\u51FA\u9009\u62E9\u5668 \xB7 \u4E2D\u6B62\u5F53\u524D\u6A21\u578B\u56DE\u5408" },
1494
+ { key: "Ctrl+C", text: "\u4E2D\u6B62\u5F53\u524D\u6A21\u578B\u56DE\u5408\uFF08\u4E0D\u662F\u590D\u5236 \u2014 \u89C1\u526A\u8D34\u677F\u6BB5\uFF09" },
1495
+ { key: "PgUp / PgDn", text: "\u6574\u9875\u6EDA\u52A8\u804A\u5929\u8BB0\u5F55" },
1496
+ { key: "End", text: "\u8DF3\u5230\u804A\u5929\u7684\u6700\u65B0\u4E00\u884C" }
1497
+ ]
1498
+ },
1499
+ {
1500
+ title: "\u9F20\u6807",
1501
+ rows: [
1502
+ { key: "\u6EDA\u8F6E", text: "\u6EDA\u52A8\u804A\u5929\u8BB0\u5F55\uFF08Web / \u4E91\u7AEF / SSH \u7EC8\u7AEF\u4E5F\u80FD\u7528\uFF09" },
1503
+ { key: "\u62D6\u52A8", text: "\u539F\u751F\u9009\u4E2D\u6587\u672C \u2014 \u76F4\u63A5\u590D\u5236\uFF0C\u4E0D\u9700\u8981\u4FEE\u9970\u952E" },
1504
+ { key: "\u53F3\u952E", text: "\u7EC8\u7AEF\u539F\u751F\uFF08Windows Terminal \u7B49\u7684\u7C98\u8D34\u83DC\u5355\uFF09" }
1505
+ ]
1506
+ },
1507
+ {
1508
+ title: "\u590D\u5236 / \u7C98\u8D34",
1509
+ rows: [
1510
+ { key: "\u9009\u4E2D\u6587\u5B57", text: "\u76F4\u63A5\u62D6\u52A8 \u2014 \u7EC8\u7AEF\u539F\u751F\uFF08\u4E0D\u9700\u8981\u4EFB\u4F55\u4FEE\u9970\u952E\uFF09" },
1511
+ {
1512
+ key: "/copy",
1513
+ text: "vim/tmux \u98CE\u683C\u590D\u5236\u6A21\u5F0F \u2014 SSH / mosh / tmux \u4E0B\u62D6\u9009\u8D8A\u8FC7\u53EF\u89C6\u533A\u65E0\u6548\u65F6\u7528\u8FD9\u4E2A"
1514
+ },
1515
+ {
1516
+ key: "\u590D\u5236",
1517
+ text: "Ctrl+Shift+C\uFF08Win/Linux\uFF09\xB7 Cmd+C\uFF08macOS\uFF09\u2014 \u6216\u9009\u4E2D\u5373\u590D\u5236\uFF08\u770B\u7EC8\u7AEF\u8BBE\u7F6E\uFF09"
1518
+ },
1519
+ { key: "\u7C98\u8D34", text: "Ctrl+V \u6216 Ctrl+Shift+V\uFF08Win/Linux\uFF09\xB7 Cmd+V\uFF08macOS\uFF09" },
1520
+ {
1521
+ key: "bracketed paste",
1522
+ text: "\u591A\u884C\u7C98\u8D34\u6574\u4F53\u8FDB\u5165 \u2014 \u4E2D\u95F4\u6362\u884C\u4E0D\u4F1A\u89E6\u53D1\u63D0\u4EA4"
1523
+ }
1524
+ ]
1525
+ },
1526
+ {
1527
+ title: "\u7F16\u8F91\u95E8\u63A7\uFF08\u4EC5 code \u6A21\u5F0F\uFF09",
1528
+ rows: [
1529
+ { key: "y / n", text: "\u5728\u9884\u89C8\u6A21\u6001\u4E2D\u63A5\u53D7\u6216\u653E\u5F03\u5F85\u5904\u7406\u7684\u7F16\u8F91" },
1530
+ { key: "Shift+Tab", text: "\u5207\u6362 \u9884\u89C8 \u2194 \u81EA\u52A8\uFF08\u6301\u4E45\u5316\uFF09" },
1531
+ { key: "u", text: "\u64A4\u9500\u4E0A\u6B21\u81EA\u52A8\u5E94\u7528\u7684\u6279\u5904\u7406\uFF085 \u79D2\u6A2A\u5E45\u5185\uFF09" }
1532
+ ]
1533
+ }
1534
+ ],
1535
+ footer: "\u901A\u8FC7 DECSET 1007\uFF08alternate-scroll\uFF09\uFF0C\u7EC8\u7AEF\u628A\u6EDA\u8F6E\u7FFB\u8BD1\u6210 \u2191/\u2193 \u53D1\u7ED9\u5E94\u7528 \u2014 \u5927\u591A\u6570\u7EC8\u7AEF\uFF08\u542B Web / \u4E91\u7AEF / SSH\uFF09\u90FD\u80FD\u6EDA\uFF0C\u4E14\u4E0D\u5F71\u54CD\u7EC8\u7AEF\u539F\u751F\u9009\u533A\u3002\u76F4\u63A5\u62D6\u52A8\u9009\u4E2D\u6587\u672C\u65E0\u9700 Shift\u3002\u4F20\u5165 --no-mouse \u53EF\u5173\u95ED\u3002"
1536
+ },
1537
+ tipShownOnce: "\u4EC5\u663E\u793A\u4E00\u6B21",
1538
+ modelOverride: "\u8986\u76D6\u9ED8\u8BA4\u6A21\u578B",
1539
+ noSession: "\u7981\u7528\u672C\u6B21\u8FD0\u884C\u7684\u4F1A\u8BDD\u6301\u4E45\u5316",
1540
+ resumeHint: "\u5F3A\u5236\u6062\u590D\u6307\u5B9A\u4F1A\u8BDD\uFF08\u5373\u4F7F\u7A7A\u95F2\uFF09",
1541
+ newHint: "\u5F3A\u5236\u521B\u5EFA\u65B0\u4F1A\u8BDD\uFF08\u5FFD\u7565 --session / --continue\uFF09",
1542
+ transcriptHint: "JSONL \u8F6C\u5F55\u7A3F\u7684\u5199\u5165\u8DEF\u5F84",
1543
+ budgetHint: "\u4F1A\u8BDD\u7F8E\u5143\u4E0A\u9650 \u2014 80% \u65F6\u8B66\u544A\uFF0C100% \u65F6\u62D2\u7EDD\u4E0B\u4E00\u8F6E",
1544
+ modelIdHint: "DeepSeek \u6A21\u578B ID\uFF08\u4F8B\u5982 deepseek-v4-flash\uFF09",
1545
+ systemPromptHint: "\u8986\u76D6\u9ED8\u8BA4\u7CFB\u7EDF\u63D0\u793A\u8BCD",
1546
+ presetHint: "\u6A21\u578B\u7EC4\u5408 \u2014 auto|flash|pro",
1547
+ sessionNameHint: "\u4F1A\u8BDD\u540D\u79F0\uFF08\u9ED8\u8BA4\uFF1A'default'\uFF09",
1548
+ ephemeralHint: "\u7981\u7528\u672C\u6B21\u8FD0\u884C\u7684\u4F1A\u8BDD\u6301\u4E45\u5316",
1549
+ mcpSpecHint: "MCP \u670D\u52A1\u5668\u89C4\u683C\uFF08\u53EF\u91CD\u590D\uFF09",
1550
+ mcpPrefixHint: "\u7528\u6B64\u5B57\u7B26\u4E32\u4E3A MCP \u5DE5\u5177\u540D\u6DFB\u52A0\u524D\u7F00",
1551
+ noConfigHint: "\u672C\u6B21\u8FD0\u884C\u5FFD\u7565 ~/.luckerr/config.json",
1552
+ presetHintShort: "\u6A21\u578B\u7EC4\u5408 \u2014 auto|flash|pro",
1553
+ budgetHintShort: "\u4F1A\u8BDD\u7F8E\u5143\u4E0A\u9650",
1554
+ transcriptHintShort: "JSONL \u8F6C\u5F55\u7A3F\u8DEF\u5F84",
1555
+ mcpSpecHintShort: "MCP \u670D\u52A1\u5668\u89C4\u683C\uFF08\u53EF\u91CD\u590D\uFF09",
1556
+ mcpPrefixHintShort: "MCP \u5DE5\u5177\u540D\u524D\u7F00",
1557
+ dryRunHint: "\u663E\u793A\u5C06\u8981\u5B89\u88C5\u7684\u5185\u5BB9\u4F46\u4E0D\u5B9E\u9645\u5B89\u88C5",
1558
+ rebuildHint: "\u4ECE\u5934\u91CD\u5EFA\u7D22\u5F15",
1559
+ embedModelHint: "\u5D4C\u5165\u6A21\u578B\u540D\u79F0",
1560
+ projectDirHint: "\u9879\u76EE\u6839\u76EE\u5F55",
1561
+ ollamaUrlHint: "Ollama \u670D\u52A1\u5668 URL",
1562
+ skipPromptsHint: "\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A",
1563
+ verboseHint: "\u663E\u793A\u5B8C\u6574\u7684\u4F1A\u8BDD\u5143\u6570\u636E",
1564
+ pruneDaysHint: "\u5220\u9664\u7A7A\u95F2\u6B64\u5929\u6570\u6216\u66F4\u591A\u7684\u4F1A\u8BDD\uFF08\u9ED8\u8BA4 90\uFF09",
1565
+ pruneDryRunHint: "\u5217\u51FA\u5C06\u8981\u5220\u9664\u7684\u5185\u5BB9\u4F46\u4E0D\u5B9E\u9645\u5220\u9664",
1566
+ eventTypeHint: "\u6309\u4E8B\u4EF6\u7C7B\u578B\u8FC7\u6EE4",
1567
+ eventSinceHint: "\u4ECE\u6B64\u4E8B\u4EF6 ID \u5F00\u59CB",
1568
+ eventTailHint: "\u4EC5\u663E\u793A\u6700\u540E N \u4E2A\u4E8B\u4EF6",
1569
+ jsonHint: "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA",
1570
+ projectionHint: "\u663E\u793A\u6BCF\u4E2A\u4E8B\u4EF6\u7684\u6295\u5F71\u72B6\u6001",
1571
+ printHint: "\u6253\u5370\u5230\u6807\u51C6\u8F93\u51FA\u800C\u975E TUI",
1572
+ headHint: "\u4EC5\u663E\u793A\u524D N \u4E2A\u4E8B\u4EF6",
1573
+ tailHint: "\u4EC5\u663E\u793A\u6700\u540E N \u4E2A\u4E8B\u4EF6",
1574
+ mdReportHint: "\u5C06 markdown \u5DEE\u5F02\u62A5\u544A\u5199\u5165\u6B64\u8DEF\u5F84",
1575
+ printHintTable: "\u6253\u5370\u8868\u683C\u5230\u6807\u51C6\u8F93\u51FA",
1576
+ tuiHint: "\u6253\u5F00\u4EA4\u4E92\u5F0F TUI",
1577
+ labelAHint: "\u5DE6\u4FA7\u9762\u677F\u7684\u6807\u7B7E",
1578
+ labelBHint: "\u53F3\u4FA7\u9762\u677F\u7684\u6807\u7B7E",
1579
+ mcpListDescription: "\u6D4F\u89C8 MCP \u6CE8\u518C\u8868\uFF08\u5B98\u65B9 \u2192 smithery \u2192 \u672C\u5730 fallback\uFF09",
1580
+ mcpInspectDescription: "\u68C0\u67E5 MCP \u670D\u52A1\u5668\u89C4\u683C\uFF08\u5DE5\u5177\u3001\u8D44\u6E90\u3001\u63D0\u793A\uFF09",
1581
+ mcpSearchDescription: "\u5728 MCP \u6CE8\u518C\u8868\u4E2D\u641C\u7D22\u5339\u914D\u7684\u670D\u52A1\u5668",
1582
+ mcpInstallDescription: "\u6309\u540D\u79F0\u5B89\u88C5 MCP \u670D\u52A1\u5668\uFF08\u5C06\u5176\u89C4\u683C\u5199\u5165\u914D\u7F6E\uFF09",
1583
+ mcpBrowseDescription: "\u4EA4\u4E92\u5F0F\u5E02\u573A\u6D4F\u89C8\u5668 \u2014 \u8F93\u5165\u8FC7\u6EE4\u3001\u56DE\u8F66\u5B89\u88C5",
1584
+ mcpLocalHint: "\u53EA\u663E\u793A\u5185\u7F6E\u7684\u79BB\u7EBF\u76EE\u5F55",
1585
+ mcpRefreshHint: "\u5FFD\u7565 24 \u5C0F\u65F6\u7F13\u5B58\uFF0C\u5F3A\u5236\u5237\u65B0",
1586
+ mcpLimitHint: "\u6700\u591A\u663E\u793A\u591A\u5C11\u6761",
1587
+ mcpPagesHint: "\u4E00\u6B21\u6027\u9884\u52A0\u8F7D\u591A\u5C11\u9875\uFF08\u9ED8\u8BA4 1\uFF09",
1588
+ mcpAllHint: "\u52A0\u8F7D\u5168\u90E8\u9875\uFF08\u9996\u6B21\u8F83\u6162\uFF09",
1589
+ mcpMaxPagesHint: "\u641C\u7D22\u65F6\u6700\u591A\u8D70\u591A\u5C11\u9875\uFF08\u9ED8\u8BA4 20\uFF09",
1590
+ jsonHintCatalog: "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA",
1591
+ jsonHintReport: "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u68C0\u67E5\u62A5\u544A",
1592
+ modelOverrideFlash: "\u8986\u76D6\u6A21\u578B\uFF08\u9ED8\u8BA4\uFF1Adeepseek-v4-flash\uFF09",
1593
+ skipConfirmHint: "\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A"
1594
+ },
1595
+ slash: {
1596
+ help: { description: "\u663E\u793A\u5B8C\u6574\u547D\u4EE4\u53C2\u8003" },
1597
+ copy: {
1598
+ description: "\u8FDB\u5165 vim/tmux \u98CE\u683C\u590D\u5236\u6A21\u5F0F \u2014 j/k \u79FB\u52A8\u3001v \u8D77\u9009\u533A\u3001y \u590D\u5236\u5230\u526A\u8D34\u677F"
1599
+ },
1600
+ status: { description: "\u5F53\u524D\u6A21\u578B\u3001\u6807\u5FD7\u3001\u4E0A\u4E0B\u6587\u3001\u4F1A\u8BDD" },
1601
+ preset: {
1602
+ description: "\u6A21\u578B\u7EC4\u5408 \u2014 \u81EA\u52A8\u5728 flash \u2192 pro \u4E4B\u95F4\u5207\u6362\uFF0C\u6216\u9501\u5B9A flash/pro",
1603
+ argsHint: "<auto|flash|pro>"
1604
+ },
1605
+ model: { description: "\u5207\u6362 DeepSeek \u6A21\u578B ID", argsHint: "<id>" },
1606
+ models: { description: "\u5217\u51FA\u4ECE DeepSeek /models \u83B7\u53D6\u7684\u53EF\u7528\u6A21\u578B" },
1607
+ theme: {
1608
+ description: "\u663E\u793A\u6216\u6301\u4E45\u5316\u7EC8\u7AEF\u4E3B\u9898\u504F\u597D\u3002\u65E0\u53C2\u6570\u65F6\u6253\u5F00\u9009\u62E9\u5668\u3002",
1609
+ argsHint: "[auto|default|dark|light|tokyo-night|github-dark|github-light|high-contrast]"
1610
+ },
1611
+ language: {
1612
+ description: "\u5207\u6362\u8FD0\u884C\u65F6\u8BED\u8A00",
1613
+ argsHint: "<en|zh-CN>",
1614
+ success: "\u8BED\u8A00\u5DF2\u5207\u6362\u4E3A\u7B80\u4F53\u4E2D\u6587\u3002",
1615
+ unsupported: "\u4E0D\u652F\u6301\u7684\u8BED\u8A00\u4EE3\u7801\uFF1A{code}\u3002\u652F\u6301\u7684\u8BED\u8A00\uFF1A{supported}\u3002"
1616
+ },
1617
+ pro: {
1618
+ description: "\u4EC5\u4E3A\u4E0B\u4E00\u8F6E\u542F\u7528 v4-pro\uFF08\u4E00\u6B21\u6027 \xB7 \u81EA\u52A8\u89E3\u9664\uFF09",
1619
+ argsHint: "[off]"
1620
+ },
1621
+ budget: {
1622
+ description: "\u4F1A\u8BDD\u7F8E\u5143\u4E0A\u9650 \u2014 80% \u65F6\u8B66\u544A\uFF0C100% \u65F6\u62D2\u7EDD\u4E0B\u4E00\u8F6E\u3002\u9ED8\u8BA4\u5173\u95ED\u3002\u5355\u72EC /budget \u663E\u793A\u72B6\u6001",
1623
+ argsHint: "[usd|off]"
1624
+ },
1625
+ mcp: { description: "\u5217\u51FA\u9644\u52A0\u5230\u6B64\u4F1A\u8BDD\u7684 MCP \u670D\u52A1\u5668 + \u5DE5\u5177" },
1626
+ resource: {
1627
+ description: "\u6D4F\u89C8 + \u8BFB\u53D6 MCP \u8D44\u6E90\uFF08\u65E0\u53C2\u6570 \u2192 \u5217\u51FA URI\uFF1B<uri> \u2192 \u83B7\u53D6\u5185\u5BB9\uFF09",
1628
+ argsHint: "[uri]"
1629
+ },
1630
+ prompt: {
1631
+ description: "\u6D4F\u89C8 + \u83B7\u53D6 MCP \u63D0\u793A\uFF08\u65E0\u53C2\u6570 \u2192 \u5217\u51FA\u540D\u79F0\uFF1B<name> \u2192 \u6E32\u67D3\u63D0\u793A\uFF09",
1632
+ argsHint: "[name]"
1633
+ },
1634
+ memory: {
1635
+ description: "\u663E\u793A / \u7BA1\u7406\u56FA\u5B9A\u8BB0\u5FC6\uFF08LUCKERR.md + ~/.luckerr/memory\uFF09",
1636
+ argsHint: "[list|show <name>|forget <name>|clear <scope> confirm]"
1637
+ },
1638
+ skill: {
1639
+ description: "\u5217\u51FA / \u8FD0\u884C\u7528\u6237\u6280\u80FD\uFF08<project>/.luckerr/skills + ~/.luckerr/skills\uFF09",
1640
+ argsHint: "[list|show <name>|<name> [args]]"
1641
+ },
1642
+ hooks: {
1643
+ description: "\u5217\u51FA\u6D3B\u8DC3\u7684 hooks\uFF08.luckerr/ \u4E0B\u7684 settings.json\uFF09\xB7 reload \u4ECE\u78C1\u76D8\u91CD\u65B0\u8BFB\u53D6",
1644
+ argsHint: "[reload]"
1645
+ },
1646
+ permissions: {
1647
+ description: "\u663E\u793A / \u7F16\u8F91 shell \u5141\u8BB8\u5217\u8868\uFF08\u5185\u7F6E\u53EA\u8BFB \xB7 \u9879\u76EE\u7EA7\uFF1A~/.luckerr/config.json\uFF09",
1648
+ argsHint: "[list|add <prefix>|remove <prefix|N>|clear confirm]"
1649
+ },
1650
+ dashboard: {
1651
+ description: "\u542F\u52A8\u5D4C\u5165\u5F0F Web \u4EEA\u8868\u677F\uFF08127.0.0.1\uFF0Ctoken \u4FDD\u62A4\uFF09",
1652
+ argsHint: "[stop]"
1653
+ },
1654
+ update: { description: "\u663E\u793A\u5F53\u524D\u7248\u672C\u4E0E\u6700\u65B0\u7248\u672C\u53CA\u5347\u7EA7\u547D\u4EE4" },
1655
+ stats: {
1656
+ description: "\u8DE8\u4F1A\u8BDD\u6210\u672C\u4EEA\u8868\u677F\uFF08\u4ECA\u65E5 / \u672C\u5468 / \u672C\u6708 / \u5168\u90E8 \xB7 \u7F13\u5B58\u547D\u4E2D \xB7 \u4E0E Claude \u5BF9\u6BD4\uFF09"
1657
+ },
1658
+ cost: {
1659
+ description: "\u7A7A \u2192 \u4E0A\u4E00\u8F6E\u82B1\u8D39\uFF08\u4F7F\u7528\u5361\u7247\uFF09\uFF1B\u5E26\u6587\u672C \u2192 \u4F30\u7B97\u53D1\u9001\u6210\u672C\uFF08\u6700\u574F\u60C5\u51B5 + \u53EF\u80FD\u7F13\u5B58\u547D\u4E2D\uFF09",
1660
+ argsHint: "[text]"
1661
+ },
1662
+ doctor: {
1663
+ description: "\u5065\u5EB7\u68C0\u67E5\uFF08api / config / api-reach / index / hooks / project\uFF09"
1664
+ },
1665
+ context: { description: "\u663E\u793A\u4E0A\u4E0B\u6587\u7A97\u53E3\u5206\u89E3\uFF08\u7CFB\u7EDF / \u5DE5\u5177 / \u65E5\u5FD7 / \u8F93\u5165\uFF09" },
1666
+ retry: { description: "\u622A\u65AD\u5E76\u91CD\u53D1\u60A8\u7684\u6700\u540E\u4E00\u6761\u6D88\u606F\uFF08\u91CD\u65B0\u91C7\u6837\uFF09" },
1667
+ compact: {
1668
+ description: "\u7F29\u5C0F\u65E5\u5FD7\u4E2D\u8FC7\u5927\u7684\u5DE5\u5177\u7ED3\u679C\u548C\u5DE5\u5177\u8C03\u7528\u53C2\u6570\uFF1B\u4E0A\u9650\u4E3A tokens\uFF0C\u9ED8\u8BA4 4000",
1669
+ argsHint: "[tokens]"
1670
+ },
1671
+ keys: { description: "\u952E\u76D8 + \u9F20\u6807 + \u590D\u5236\u7C98\u8D34\u53C2\u8003" },
1672
+ cwd: {
1673
+ description: "\u5207\u6362\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55 \u2014 \u91CD\u65B0\u6307\u5411\u6587\u4EF6/Shell/\u8BB0\u5FC6\u5DE5\u5177\uFF0C\u91CD\u8F7D\u9879\u76EE hooks\uFF0C\u5237\u65B0 @ \u5F15\u7528\u904D\u5386\u5668",
1674
+ argsHint: "<path>"
1675
+ },
1676
+ stop: { description: "\u4E2D\u6B62\u5F53\u524D\u6A21\u578B\u56DE\u5408\uFF08\u6309 Esc \u7684\u66FF\u4EE3\u65B9\u5F0F\uFF09" },
1677
+ feedback: { description: "\u6253\u5F00 GitHub Issue\uFF0C\u8BCA\u65AD\u4FE1\u606F\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F" },
1678
+ plans: { description: "\u5217\u51FA\u6B64\u4F1A\u8BDD\u7684\u6D3B\u8DC3 + \u5F52\u6863\u8BA1\u5212\uFF08\u6700\u65B0\u5728\u524D\uFF09" },
1679
+ replay: {
1680
+ description: "\u52A0\u8F7D\u5F52\u6863\u8BA1\u5212\u4E3A\u53EA\u8BFB\u7684\u65F6\u95F4\u65C5\u884C\u5FEB\u7167\uFF08\u9ED8\u8BA4\uFF1A\u6700\u65B0\uFF09",
1681
+ argsHint: "[N]"
1682
+ },
1683
+ sessions: { description: "\u5217\u51FA\u5DF2\u4FDD\u5B58\u7684\u4F1A\u8BDD\uFF08\u5F53\u524D\u6807\u8BB0\u4E3A \u25B8\uFF09" },
1684
+ setup: { description: "\u63D0\u9192\u60A8\u9000\u51FA\u5E76\u8FD0\u884C `luckerr setup`" },
1685
+ semantic: {
1686
+ description: "\u663E\u793A semantic_search \u72B6\u6001 \u2014 \u5DF2\u6784\u5EFA\uFF1FOllama \u5DF2\u5B89\u88C5\uFF1F\u5982\u4F55\u542F\u7528"
1687
+ },
1688
+ clear: { description: "\u4EC5\u6E05\u9664\u53EF\u89C1\u7684\u6EDA\u52A8\u56DE\u653E\uFF08\u65E5\u5FD7/\u4E0A\u4E0B\u6587\u4FDD\u7559\uFF09" },
1689
+ new: { description: "\u5F00\u59CB\u5168\u65B0\u5BF9\u8BDD\uFF08\u6E05\u9664\u4E0A\u4E0B\u6587 + \u6EDA\u52A8\u56DE\u653E\uFF09" },
1690
+ loop: {
1691
+ description: "\u6BCF <interval> \u81EA\u52A8\u91CD\u65B0\u63D0\u4EA4 <prompt>\uFF0C\u76F4\u5230\u60A8\u8F93\u5165 / Esc / /loop stop",
1692
+ argsHint: "<5s..6h> <prompt> \xB7 stop \xB7 \uFF08\u65E0\u53C2\u6570 = \u72B6\u6001\uFF09"
1693
+ },
1694
+ exit: { description: "\u9000\u51FA TUI" },
1695
+ init: {
1696
+ description: "\u626B\u63CF\u9879\u76EE\u5E76\u5408\u6210\u57FA\u7EBF LUCKERR.md\uFF08\u6A21\u578B\u5199\u5165\uFF1B\u4F7F\u7528 /apply \u5BA1\u67E5\uFF09\u3002`force` \u8986\u76D6\u5DF2\u6709\u6587\u4EF6\u3002",
1697
+ argsHint: "[force]"
1698
+ },
1699
+ apply: {
1700
+ description: "\u5C06\u5F85\u5904\u7406\u7684\u7F16\u8F91\u5757\u63D0\u4EA4\u5230\u78C1\u76D8\uFF08\u65E0\u53C2\u6570 \u2192 \u5168\u90E8\uFF1B`1`\u3001`1,3` \u6216 `1-4` \u2192 \u8BE5\u5B50\u96C6\uFF0C\u5176\u4F59\u4FDD\u6301\u5F85\u5904\u7406\uFF09",
1701
+ argsHint: "[N|N,M|N-M]"
1702
+ },
1703
+ discard: {
1704
+ description: "\u4E22\u5F03\u5F85\u5904\u7406\u7684\u7F16\u8F91\u5757\u800C\u4E0D\u5199\u5165\uFF08\u65E0\u53C2\u6570 \u2192 \u5168\u90E8\uFF1B\u7D22\u5F15 \u2192 \u8BE5\u5B50\u96C6\uFF09",
1705
+ argsHint: "[N|N,M|N-M]"
1706
+ },
1707
+ walk: {
1708
+ description: "\u9010\u5757\u9010\u6B65\u5904\u7406\u5F85\u5904\u7406\u7684\u7F16\u8F91\uFF08git-add-p \u98CE\u683C\uFF1A\u6BCF\u5757 y/n\uFF0Ca \u5E94\u7528\u5269\u4F59\uFF0CA \u5207\u6362 AUTO\uFF09"
1709
+ },
1710
+ undo: { description: "\u56DE\u6EDA\u6700\u540E\u5E94\u7528\u7684\u7F16\u8F91\u6279\u5904\u7406" },
1711
+ history: {
1712
+ description: "\u5217\u51FA\u6B64\u4F1A\u8BDD\u7684\u6BCF\u4E2A\u7F16\u8F91\u6279\u5904\u7406\uFF08\u7528\u4E8E /show \u7684 ID\uFF0C\u64A4\u6D88\u6807\u8BB0\uFF09"
1713
+ },
1714
+ show: {
1715
+ description: "\u8F6C\u50A8\u5B58\u50A8\u7684\u7F16\u8F91\u5DEE\u5F02\uFF08\u7701\u7565 id \u65F6\u4E3A\u6700\u65B0\u672A\u64A4\u6D88\u7684\uFF09",
1716
+ argsHint: "[id]"
1717
+ },
1718
+ commit: { description: "git add -A && git commit -m ...", argsHint: '"msg"' },
1719
+ checkpoint: {
1720
+ description: "\u5FEB\u7167\u4F1A\u8BDD\u6D89\u53CA\u7684\u6BCF\u4E2A\u6587\u4EF6\uFF08Cursor \u98CE\u683C\u5185\u90E8\u5B58\u50A8\uFF0C\u975E git\uFF09\u3002\u5355\u72EC /checkpoint \u5217\u51FA\u3002",
1721
+ argsHint: "[name|list|forget <id>]"
1722
+ },
1723
+ restore: {
1724
+ description: "\u5C06\u6587\u4EF6\u56DE\u6EDA\u5230\u547D\u540D\u7684\u68C0\u67E5\u70B9\uFF08\u89C1 /checkpoint list\uFF09",
1725
+ argsHint: "<name|id>"
1726
+ },
1727
+ plan: {
1728
+ description: "\u5207\u6362\u53EA\u8BFB\u8BA1\u5212\u6A21\u5F0F\uFF08\u5199\u5165\u88AB\u5F39\u56DE\u76F4\u5230 submit_plan + \u5BA1\u6279\uFF09",
1729
+ argsHint: "[on|off]"
1730
+ },
1731
+ mode: {
1732
+ description: "\u7F16\u8F91\u95E8\u63A7\uFF1Areview\uFF08\u6392\u961F\uFF09\xB7 auto\uFF08\u5E94\u7528+\u64A4\u6D88\uFF09\xB7 yolo\uFF08\u5E94\u7528+\u81EA\u52A8 shell\uFF09\u3002Shift+Tab \u5FAA\u73AF\u3002",
1733
+ argsHint: "[review|auto|yolo]"
1734
+ },
1735
+ jobs: { description: "\u5217\u51FA run_background \u542F\u52A8\u7684\u540E\u53F0\u4F5C\u4E1A" },
1736
+ kill: {
1737
+ description: "\u6309 ID \u505C\u6B62\u540E\u53F0\u4F5C\u4E1A\uFF08SIGTERM \u2192 \u5BBD\u9650\u671F\u540E SIGKILL\uFF09",
1738
+ argsHint: "<id>"
1739
+ },
1740
+ logs: {
1741
+ description: "\u8DDF\u8E2A\u540E\u53F0\u4F5C\u4E1A\u7684\u8F93\u51FA\uFF08\u9ED8\u8BA4\u6700\u540E 80 \u884C\uFF09",
1742
+ argsHint: "<id> [lines]"
1743
+ }
1744
+ },
1745
+ wizard: {
1746
+ languageTitle: "\u9009\u62E9\u8BED\u8A00",
1747
+ languageSubtitle: "\u5DF2\u6839\u636E\u7CFB\u7EDF\u8BED\u8A00\u81EA\u52A8\u9009\u4E2D\u3002\u4E4B\u540E\u53EF\u7528 /language \u5207\u6362\u3002",
1748
+ welcomeTitle: "\u6B22\u8FCE\u4F7F\u7528 Luckerr\u3002",
1749
+ apiKeyPrompt: "\u7C98\u8D34\u4F60\u7684 DeepSeek API key \u5F00\u59CB\u4F7F\u7528\u3002",
1750
+ apiKeyGetOne: "\u5728\u6B64\u83B7\u53D6\uFF1Ahttps://platform.deepseek.com/api_keys",
1751
+ apiKeySavedLocally: "\u4FDD\u5B58\u5728\u672C\u5730\uFF1A{path}",
1752
+ apiKeyInputLabel: "key \u203A ",
1753
+ apiKeyInvalid: "key \u957F\u5EA6\u4E0D\u8DB3\u2014\u2014\u8BF7\u7C98\u8D34\u5B8C\u6574 token\uFF0816+ \u5B57\u7B26\uFF0C\u4E0D\u542B\u7A7A\u683C\uFF09\u3002",
1754
+ apiKeyChecking: "\u6B63\u5728\u68C0\u67E5 API key\u2026",
1755
+ apiKeyRejected: "DeepSeek \u62D2\u7EDD\u4E86\u8FD9\u4E2A API key\u3002\u8BF7\u7C98\u8D34\u6709\u6548 key\uFF0C\u6216\u6309 Esc \u53D6\u6D88\u8BBE\u7F6E\u3002",
1756
+ apiKeyCheckFailed: "\u6682\u65F6\u65E0\u6CD5\u9A8C\u8BC1 API key\uFF08{message}\uFF09\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\u3002",
1757
+ apiKeyPreview: "\u9884\u89C8\uFF1A{redacted}",
1758
+ themeTitle: "\u9009\u62E9\u4E3B\u9898",
1759
+ themeSubtitle: "\u65B9\u5411\u952E\u5207\u6362\u65F6\u5373\u65F6\u9884\u89C8\u6548\u679C\uFF0C\u4E4B\u540E\u53EF\u7528 /theme \u66F4\u6539\u3002",
1760
+ themeSampleHeading: "\u793A\u4F8B",
1761
+ themeFooter: "[\u2191\u2193] \u79FB\u52A8 \xB7 [Enter] \u786E\u8BA4 \xB7 [Esc] \u53D6\u6D88",
1762
+ themeCaption: {
1763
+ default: "GitHub \u6DF1\u8272\uFF08\u9ED8\u8BA4\uFF09",
1764
+ dark: "\u6DF1\u8272\u8C03",
1765
+ light: "\u6E05\u723D\u6D45\u8272",
1766
+ "tokyo-night": "\u4E1C\u4EAC\u591C\u8272",
1767
+ "github-dark": "GitHub \u6DF1\u8272",
1768
+ "github-light": "GitHub \u6D45\u8272",
1769
+ "high-contrast": "\u9AD8\u5BF9\u6BD4\u5EA6\uFF08\u65E0\u969C\u788D\uFF09"
1770
+ },
1771
+ reviewLabelTheme: "\u4E3B\u9898",
1772
+ presetTitle: "\u9009\u62E9\u9884\u8BBE",
1773
+ mcpTitle: "Luckerr \u8981\u4E3A\u4F60\u63A5\u5165\u54EA\u4E9B MCP \u670D\u52A1\u5668\uFF1F",
1774
+ mcpUserArgsHint: "\uFF08\u9700\u8981\u4F60\u63D0\u4F9B {arg}\uFF09",
1775
+ mcpFooterMulti: "[\u2191\u2193] \u79FB\u52A8 \xB7 [\u7A7A\u683C] \u9009\u62E9 \xB7 [Enter] \u786E\u8BA4 \xB7 [Esc] \u53D6\u6D88 \xB7 \u5168\u4E0D\u9009 = \u8DF3\u8FC7",
1776
+ mcpArgsTitle: "\u914D\u7F6E {name}",
1777
+ mcpArgsDirMissing: "\u76EE\u5F55 {path} \u4E0D\u5B58\u5728\u3002",
1778
+ mcpArgsDirCreateHint: "[Y/Enter] \u521B\u5EFA\uFF08mkdir -p\uFF09\xB7 [N/Esc] \u8F93\u5165\u5176\u4ED6\u8DEF\u5F84",
1779
+ mcpArgsDirCreateFailed: "\u65E0\u6CD5\u521B\u5EFA {path}\uFF1A{message}",
1780
+ mcpArgsRequiredParam: "\u5FC5\u586B\u53C2\u6570\uFF1A",
1781
+ mcpArgsEmpty: "{name} \u9700\u8981\u4E00\u4E2A\u503C \u2014 \u4E0D\u80FD\u4E3A\u7A7A\u3002",
1782
+ mcpArgsNotADir: "{path} \u5B58\u5728\u4F46\u4E0D\u662F\u76EE\u5F55\u3002",
1783
+ reviewTitle: "\u786E\u8BA4\u4FDD\u5B58",
1784
+ reviewLabelApiKey: "API key",
1785
+ reviewLabelLanguage: "\u8BED\u8A00",
1786
+ reviewLabelPreset: "\u9884\u8BBE",
1787
+ reviewLabelMcp: "MCP",
1788
+ reviewMcpNone: "\uFF08\u65E0\uFF09",
1789
+ reviewMcpServers: "{count} \u4E2A\u670D\u52A1\u5668",
1790
+ reviewSavesTo: "\u4FDD\u5B58\u5230 {path}",
1791
+ reviewSaveError: "\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25\uFF1A{message}",
1792
+ reviewFooter: "[Enter] \u4FDD\u5B58 \xB7 [Esc] \u53D6\u6D88",
1793
+ savedTitle: "\u25B8 \u5DF2\u4FDD\u5B58\u3002",
1794
+ savedFooter: "[Enter] \u9000\u51FA",
1795
+ selectFooter: "[\u2191\u2193] \u79FB\u52A8 \xB7 [Enter] \u786E\u8BA4 \xB7 [Esc] \u53D6\u6D88",
1796
+ stepCounter: "\u6B65\u9AA4 {step}/{total} \xB7 ",
1797
+ exitHint: "/exit \u4E2D\u6B62",
1798
+ apiKeyPlaceholder: "sk-...",
1799
+ themeSampleReasoning: "\u63A8\u7406\u4E2D",
1800
+ providerKeysTitle: "\u914D\u7F6E AI \u670D\u52A1\u5546",
1801
+ providerKeysSubtitle: "\u8F93\u5165\u4F60\u60F3\u4F7F\u7528\u7684 AI \u670D\u52A1\u5546\u7684 API key\u3002\u81F3\u5C11\u586B\u5199\u4E00\u4E2A\u3002",
1802
+ providerKeysConfigured: "\u5DF2\u914D\u7F6E {count} \u4E2A\u670D\u52A1\u5546",
1803
+ providerKeysNone: "\uFF08\u672A\u914D\u7F6E\u2014\u2014\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\uFF09",
1804
+ providerKeysFooter: "[\u2191\u2193] \u79FB\u52A8 \xB7 [Enter] \u914D\u7F6E \xB7 [Esc] \u53D6\u6D88 \xB7 [Space] \u786E\u8BA4",
1805
+ providerKeysInputFor: "{label} \u7684 API key\uFF1A",
1806
+ providerKeysGetOne: "\u5728\u6B64\u83B7\u53D6\uFF1A{url}",
1807
+ providerKeysDetected: "\uFF08\u4ECE\u73AF\u5883\u53D8\u91CF\u4E2D\u68C0\u6D4B\u5230\uFF09",
1808
+ providerKeysFromConfig: "\uFF08\u5DF2\u4FDD\u5B58\u5728\u914D\u7F6E\u4E2D\uFF09",
1809
+ providerKeysNeeded: "\u81F3\u5C11\u9700\u8981\u4E00\u4E2A API key \u624D\u80FD\u7EE7\u7EED\u3002",
1810
+ reviewLabelProviders: "AI \u670D\u52A1\u5546"
1811
+ },
1812
+ themePicker: {
1813
+ header: "\u4E3B\u9898",
1814
+ footer: "\u2191\u2193 \u9009\u62E9 \xB7 \u23CE \u786E\u8BA4 \xB7 Esc \u53D6\u6D88",
1815
+ currentPref: "\u5F53\u524D\u504F\u597D",
1816
+ activeNow: "\u5F53\u524D\u751F\u6548",
1817
+ autoDesc: "\u4F7F\u7528 LUCKERR_THEME \u6216\u9ED8\u8BA4\u4E3B\u9898"
1818
+ },
1819
+ planFlow: {
1820
+ approveCardTitle: "\u786E\u8BA4\u8BA1\u5212",
1821
+ approveCardMetaRight: "\u7B49\u5F85\u4E2D",
1822
+ openQuestionsBanner: "\u25B2 \u8BA1\u5212\u4E2D\u6807\u8BB0\u4E86\u5F85\u786E\u8BA4\u7684\u95EE\u9898\u6216\u98CE\u9669 \u2014\u2014 \u8BF7\u9009 {refine} \u7ED9\u51FA\u660E\u786E\u7B54\u6848\uFF0C\u518D\u8BA9\u6A21\u578B\u7EE7\u7EED\u3002",
1823
+ openQuestionsHeader: "\u5F85\u786E\u8BA4 / \u98CE\u9669",
1824
+ truncatedBodyMore: "\u2026 \u8FD8\u6709 {n} \u884C\u5728\u4E0A\u65B9\u6EDA\u52A8\u5386\u53F2\u4E2D",
1825
+ truncatedBodyMorePlural: "\u2026 \u8FD8\u6709 {n} \u884C\u5728\u4E0A\u65B9\u6EDA\u52A8\u5386\u53F2\u4E2D",
1826
+ picker: {
1827
+ accept: "\u91C7\u7EB3",
1828
+ acceptHint: "\u7ACB\u5373\u6309\u987A\u5E8F\u6267\u884C",
1829
+ refine: "\u7EC6\u5316",
1830
+ refineHint: "\u7ED9\u6A21\u578B\u66F4\u591A\u6307\u5F15\uFF0C\u91CD\u65B0\u51FA\u4E00\u7248\u8BA1\u5212",
1831
+ revise: "\u6539\u5199",
1832
+ reviseHint: "\u5728\u6267\u884C\u524D\u5C31\u5730\u7F16\u8F91\u8BA1\u5212\uFF08\u8DF3\u8FC7 / \u91CD\u6392\u6B65\u9AA4\uFF09",
1833
+ reject: "\u9A73\u56DE",
1834
+ rejectHint: "\u4E22\u5F03\uFF0C\u8BA9\u6A21\u578B\u4ECE\u5934\u518D\u6765"
1835
+ },
1836
+ refineFooter: "\u23CE \u53D1\u9001 \xB7 esc \u8FD4\u56DE\u9009\u9879",
1837
+ refineQuestionsHeading: "\u56DE\u7B54\u4EE5\u4E0B\u95EE\u9898\uFF0C\u6216\u76F4\u63A5\u8BF4\u660E\u4F60\u60F3\u8981\u7684\u4FEE\u6539\uFF1A",
1838
+ modes: {
1839
+ approve: {
1840
+ title: "\u91C7\u7EB3 \u2014\u2014 \u8FD8\u6709\u8865\u5145\u6307\u793A\u5417\uFF1F",
1841
+ hint: "\u56DE\u7B54\u8BA1\u5212\u4E2D\u7684\u95EE\u9898\u3001\u8865\u5145\u7EA6\u675F\uFF0C\u6216\u76F4\u63A5\u56DE\u8F66\u6309\u73B0\u72B6\u91C7\u7EB3\u3002",
1842
+ blankHint: "\uFF08\u7559\u7A7A\u56DE\u8F66 = \u4E0D\u9644\u52A0\u6307\u793A\u76F4\u63A5\u91C7\u7EB3\u3002\uFF09"
1843
+ },
1844
+ refine: {
1845
+ title: "\u7EC6\u5316 \u2014\u2014 \u6A21\u578B\u5E94\u8BE5\u6539\u4EC0\u4E48\uFF1F",
1846
+ hint: "\u8BF4\u660E\u95EE\u9898\u5728\u54EA\u3001\u7F3A\u4EC0\u4E48\uFF0C\u6216\u8005\u56DE\u7B54\u8BA1\u5212\u63D0\u51FA\u7684\u7591\u95EE\u3002",
1847
+ blankHint: "\uFF08\u7559\u7A7A\u56DE\u8F66 = \u8BA9\u6A21\u578B\u5BF9\u6240\u6709\u5F85\u786E\u8BA4\u95EE\u9898\u9009\u7528\u5B89\u5168\u9ED8\u8BA4\u3002\uFF09"
1848
+ },
1849
+ reject: {
1850
+ title: "\u9A73\u56DE \u2014\u2014 \u544A\u8BC9\u6A21\u578B\u539F\u56E0\uFF08\u53EF\u9009\uFF09",
1851
+ hint: "\u8BF4\u660E\u6A21\u578B\u5BF9\u4F60\u7684\u76EE\u6807\u7406\u89E3\u9519\u5728\u54EA\u91CC\uFF0C\u6216\u4F60\u771F\u6B63\u60F3\u8981\u4EC0\u4E48\u3002",
1852
+ blankHint: "\uFF08\u7559\u7A7A\u56DE\u8F66 = \u4E0D\u89E3\u91CA\u76F4\u63A5\u53D6\u6D88\uFF1B\u6A21\u578B\u4F1A\u53CD\u8FC7\u6765\u95EE\u4F60\u60F3\u8981\u4EC0\u4E48\u3002\uFF09"
1853
+ },
1854
+ "checkpoint-revise": {
1855
+ title: "\u6539\u5199 \u2014\u2014 \u4E0B\u4E00\u6B65\u524D\u8981\u8C03\u6574\u4EC0\u4E48\uFF1F",
1856
+ hint: "\u8303\u56F4\u8C03\u6574\u3001\u8DF3\u8FC7\u6B65\u9AA4\u3001\u6362\u4E2A\u601D\u8DEF \u2014\u2014 \u6A21\u578B\u4F1A\u636E\u6B64\u4FEE\u6539\u5269\u4F59\u6B65\u9AA4\u3002",
1857
+ blankHint: "\uFF08\u7559\u7A7A\u56DE\u8F66 = \u6309\u5F53\u524D\u8BA1\u5212\u7EE7\u7EED\u3002\uFF09"
1858
+ },
1859
+ "choice-custom": {
1860
+ title: "\u81EA\u5B9A\u4E49\u56DE\u7B54 \u2014\u2014 \u60F3\u8BF4\u4EC0\u4E48\u90FD\u884C",
1861
+ hint: "\u81EA\u7531\u6587\u672C\u3002\u6A21\u578B\u4F1A\u539F\u6837\u8BFB\u53D6\u5E76\u7EE7\u7EED \u2014\u2014 \u4E0D\u5FC5\u5339\u914D\u5019\u9009\u9879\u3002",
1862
+ blankHint: "\uFF08\u7559\u7A7A\u56DE\u8F66 = \u8BA9\u6A21\u578B\u53CD\u8FC7\u6765\u95EE\u4F60\u60F3\u8981\u4EC0\u4E48\u3002\uFF09"
1863
+ }
1864
+ },
1865
+ checkpoint: {
1866
+ title: "\u68C0\u67E5\u70B9 \u2014\u2014 \u5F53\u524D\u6B65\u9AA4\u5DF2\u5B8C\u6210",
1867
+ continue: "\u7EE7\u7EED \u2014\u2014 \u6267\u884C\u4E0B\u4E00\u6B65",
1868
+ continueHint: "\u6A21\u578B\u4ECE\u4E0B\u4E00\u6B65\u7EE7\u7EED\u3002",
1869
+ revise: "\u8C03\u6574 \u2014\u2014 \u5728\u4E0B\u4E00\u6B65\u524D\u7ED9\u53CD\u9988",
1870
+ reviseHint: "\u5148\u6682\u505C\uFF0C\u8F93\u5165\u6307\u5F15\uFF1B\u6A21\u578B\u4F1A\u8C03\u6574\u5269\u4F59\u8BA1\u5212\u3002",
1871
+ stop: "\u505C\u6B62 \u2014\u2014 \u5728\u6B64\u7ED3\u675F\u8BA1\u5212",
1872
+ stopHint: "\u6A21\u578B\u603B\u7ED3\u5DF2\u5B8C\u6210\u7684\u5DE5\u4F5C\u5E76\u7ED3\u675F\u3002"
1873
+ },
1874
+ stepList: {
1875
+ counter: "{total} \u4E2A\u6B65\u9AA4",
1876
+ counterSingular: "{total} \u4E2A\u6B65\u9AA4",
1877
+ counterDone: "{done}/{total} \u5DF2\u5B8C\u6210\uFF08{pct}%\uFF09 \xB7 \u5171 {total} \u6B65",
1878
+ counterDoneSingular: "{done}/{total} \u5DF2\u5B8C\u6210\uFF08{pct}%\uFF09 \xB7 \u5171 {total} \u6B65"
1879
+ },
1880
+ noPlanSummary: "\u5C1A\u672A\u63D0\u4EA4\u8BA1\u5212\u5185\u5BB9\u3002",
1881
+ detailCollapsedHint: "Ctrl+P \u5C55\u5F00\u5B8C\u6574\u8BA1\u5212\u8BE6\u60C5\u3002",
1882
+ detailExpandedHint: "Ctrl+P \u6536\u8D77\u8BE6\u60C5\u3002",
1883
+ detailHeader: "\u8BA1\u5212\u8BE6\u60C5",
1884
+ detailWindow: "\u663E\u793A\u7B2C {start}-{end} \u884C\uFF0C\u5171 {total} \u884C",
1885
+ detailScrollHint: "PgUp/PgDn \u6EDA\u52A8\u8BE6\u60C5 \xB7 Home/End \u8DF3\u8F6C",
1886
+ reviseTitle: "\u4FEE\u6539\u8BA1\u5212",
1887
+ reviseSteps: "{count} \u4E2A\u6B65\u9AA4",
1888
+ reviseFooter: "\u2191\u2193 \u7126\u70B9 \xB7 \u7A7A\u683C\u5207\u6362\u8DF3\u8FC7 \xB7 k/j \u79FB\u52A8 \xB7 \u23CE \u786E\u8BA4 \xB7 Esc \u53D6\u6D88",
1889
+ riskMed: " \u4E2D",
1890
+ riskHigh: " \u9AD8",
1891
+ completeMsg: "\u25B8 \u8BA1\u5212\u5B8C\u6210 \u2014 \u5168\u90E8 {total} \u4E2A\u6B65\u9AA4\u5DF2\u5B8C\u6210 \xB7 \u5DF2\u5F52\u6863"
1892
+ },
1893
+ app: {
1894
+ walkCancelledRemaining: "\u25B8 \u6D4F\u89C8\u5DF2\u53D6\u6D88 \u2014 \u8FD8\u6709 {count} \u4E2A\u5F85\u5904\u7406\u7F16\u8F91\u5757\u3002",
1895
+ walkCancelled: "\u25B8 \u6D4F\u89C8\u5DF2\u53D6\u6D88\u3002",
1896
+ editModeYolo: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1AYOLO \u2014 \u7F16\u8F91\u548C shell \u547D\u4EE4\u90FD\u81EA\u52A8\u6267\u884C\u3002/undo \u4ECD\u53EF\u64A4\u9500\u7F16\u8F91\u3002\u8BF7\u8C28\u614E\u4F7F\u7528\u3002",
1897
+ editModeAuto: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1AAUTO \u2014 \u7F16\u8F91\u7ACB\u5373\u5E94\u7528\uFF1B5 \u79D2\u5185\u6309 u \u64A4\u9500\uFF08\u7A7A\u683C\u6682\u505C\u8BA1\u65F6\uFF09\u3002shell \u547D\u4EE4\u4ECD\u4F1A\u8BE2\u95EE\u3002",
1898
+ editModeReview: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1Areview \u2014 \u7F16\u8F91\u5165\u961F\u5F85 /apply\uFF08\u6216 y\uFF09/ /discard\uFF08\u6216 n\uFF09",
1899
+ rejectedEdit: "\u25B8 \u62D2\u7EDD\u4E86\u5BF9 {path} \u7684\u7F16\u8F91{context}",
1900
+ autoApprovingRest: "\u25B8 \u672C\u8F6E\u5269\u4F59\u7F16\u8F91\u81EA\u52A8\u6279\u51C6",
1901
+ flippedAutoSession: "\u25B8 \u5DF2\u5207\u6362\u5230 AUTO \u6A21\u5F0F\uFF08\u672C\u4F1A\u8BDD\u5269\u4F59\u751F\u6548\uFF0C\u5DF2\u6301\u4E45\u5316\uFF09",
1902
+ flippedAutoWalk: "\u25B8 \u5DF2\u5207\u6362\u5230 AUTO \u6A21\u5F0F \u2014 \u540E\u7EED\u7F16\u8F91\u7ACB\u5373\u5E94\u7528\u3002\u6D4F\u89C8\u6A21\u5F0F\u9000\u51FA\u3002",
1903
+ dashboardStopped: "\u25B8 \u4EEA\u8868\u677F\u5DF2\u505C\u6B62\u3002",
1904
+ notedMemory: "\u25B8 \u5DF2\u8BB0\u5F55\uFF08{scope}\uFF09\u2014 {verb} {path}",
1905
+ notedScopeProject: "\u9879\u76EE",
1906
+ notedScopeGlobal: "\u5168\u5C40",
1907
+ notedVerbCreated: "\u521B\u5EFA",
1908
+ notedVerbAppended: "\u8FFD\u52A0\u5230",
1909
+ memoryWriteFailed: "# \u8BB0\u5FC6\u5199\u5165\u5931\u8D25",
1910
+ commandFailed: "! \u547D\u4EE4\u5931\u8D25",
1911
+ btwUsage: "\u25B8 /btw <\u95EE\u9898> \u2014 \u987A\u4FBF\u95EE\u4E2A\u9898\u5916\u8BDD\uFF0C\u4E0D\u4F1A\u5199\u5165\u5F53\u524D\u4F1A\u8BDD\u4E0A\u4E0B\u6587\u3002",
1912
+ btwHeader: "\u226B btw",
1913
+ btwFailed: "/btw \u8C03\u7528\u5931\u8D25",
1914
+ restoreCodeOnly: "\u25B8 /restore \u4EC5\u5728\u4EE3\u7801\u6A21\u5F0F\u53EF\u7528",
1915
+ hookUserPromptSubmit: "UserPromptSubmit \u94A9\u5B50",
1916
+ hookStop: "Stop \u94A9\u5B50",
1917
+ atMentions: "\u25B8 @mentions\uFF1A{parts}",
1918
+ atUrl: "\u25B8 @url\uFF1A{parts}",
1919
+ atUrlFailed: "@url \u5C55\u5F00\u5931\u8D25",
1920
+ denied: "\u25B8 \u5DF2\u62D2\u7EDD\uFF1A{cmd}{context}",
1921
+ alwaysAllowed: '\u25B8 \u5DF2\u5BF9 {dir} \u6C38\u4E45\u5141\u8BB8 "{prefix}"',
1922
+ runningCommand: "\u25B8 \u6B63\u5728\u6267\u884C\uFF1A{cmd}",
1923
+ startingBackground: "\u25B8 \u540E\u53F0\u542F\u52A8\uFF1A{cmd}",
1924
+ checkpointSaved: "\u26C1 \u5DF2\u4FDD\u5B58\u68C0\u67E5\u70B9 \xB7 {id} \xB7 {count} \u4E2A\u6587\u4EF6 \xB7 /restore {id} \u53EF\u56DE\u6EDA\u6B64\u6B65",
1925
+ continuingAfter: "\u25B8 \u5728 {label}{counter} \u4E4B\u540E\u7EE7\u7EED",
1926
+ planStoppedAt: "\u25B8 \u8BA1\u5212\u5728 {label}{counter} \u5904\u505C\u6B62",
1927
+ revisingAfter: "\u25B8 \u5728 {label} \u4E4B\u540E\u4FEE\u8BA2 \u2014 {feedback}"
1928
+ },
1929
+ hooks: {
1930
+ head: "\u94A9\u5B50 {tag} `{cmd}` {decision}{truncTag}",
1931
+ headWithDetail: "\u94A9\u5B50 {tag} `{cmd}` {decision}{truncTag}\uFF1A{detail}",
1932
+ truncated: "\uFF08\u8F93\u51FA\u5728 256KB \u5904\u622A\u65AD\uFF09",
1933
+ decisionBlock: "\u62E6\u622A",
1934
+ decisionWarn: "\u544A\u8B66",
1935
+ decisionTimeout: "\u8D85\u65F6",
1936
+ decisionError: "\u9519\u8BEF"
1937
+ },
1938
+ summary: {
1939
+ status: "\u6B63\u5728\u603B\u7ED3\u5DF2\u6536\u96C6\u7684\u5185\u5BB9\u2026",
1940
+ hallucinatedFallback: "\uFF08\u6A21\u578B\u751F\u6210\u4E86\u4F2A\u9020\u7684\u5DE5\u5177\u8C03\u7528\u6807\u8BB0\u800C\u975E\u7EAF\u6587\u672C\u603B\u7ED3 \u2014 \u8BD5\u8BD5 /retry \u6362\u4E2A\u66F4\u7A84\u7684\u95EE\u9898\uFF0C\u6216 /think \u67E5\u770B R1 \u7684\u63A8\u7406\uFF09",
1941
+ failedAfterReason: "{label}\uFF0C\u4E14\u56DE\u9000\u7684\u603B\u7ED3\u8C03\u7528\u4E5F\u5931\u8D25\uFF1A{message}\u3002\u8BF7\u8FD0\u884C /clear \u540E\u7528\u66F4\u7A84\u7684\u95EE\u9898\u91CD\u8BD5\uFF0C\u6216\u63D0\u9AD8 --max-tool-iters\u3002"
1942
+ },
1943
+ loop: {
1944
+ budgetExhausted: "\u4F1A\u8BDD\u9884\u7B97\u5DF2\u7528\u5B8C \u2014 \u5DF2\u82B1\u8D39 ${spent} \u2265 \u4E0A\u9650 ${cap}\u3002\u7528 /budget <usd> \u63D0\u9AD8\u4E0A\u9650\uFF0C/budget off \u6E05\u9664\u4E0A\u9650\uFF0C\u6216\u7ED3\u675F\u4F1A\u8BDD\u3002",
1945
+ budget80Pct: "\u25B2 \u9884\u7B97\u5DF2\u7528 80% \u2014 ${spent} / ${cap}\u3002\u4E0B\u4E00\u4E24\u8F6E\u53EF\u80FD\u5C31\u89E6\u9876\u3002",
1946
+ proArmed: "\u21E7 /pro \u5DF2\u88C5\u5907 \u2014 \u672C\u8F6E\u4F7F\u7528 deepseek-v4-pro\uFF08\u4E00\u6B21\u6027 \xB7 \u672C\u8F6E\u540E\u81EA\u52A8\u89E3\u9664\uFF09",
1947
+ abortedAtIter: "\u5728\u7B2C {iter}/{cap} \u6B21\u5DE5\u5177\u8C03\u7528\u5904\u4E2D\u65AD \u2014 \u672A\u751F\u6210\u603B\u7ED3\u5373\u505C\u6B62\uFF08\u6309 \u2191 + Enter \u6216 /retry \u6062\u590D\uFF09",
1948
+ toolUploadStatus: "\u5DE5\u5177\u7ED3\u679C\u5DF2\u4E0A\u4F20 \xB7 \u6A21\u578B\u5728\u751F\u6210\u4E0B\u4E00\u6761\u54CD\u5E94\u524D\u601D\u8003\u4E2D\u2026",
1949
+ toolBudgetWarning: "\u5DF2\u7528 {iter}/{cap} \u6B21\u5DE5\u5177\u8C03\u7528 \u2014 \u63A5\u8FD1\u4E0A\u9650\u3002\u6309 Esc \u7ACB\u5373\u5F3A\u5236\u603B\u7ED3\u3002",
1950
+ preflightFoldStatus: "\u9884\u68C0\uFF1A\u4E0A\u4E0B\u6587\u63A5\u8FD1\u4E0A\u9650\uFF0C\u5C1D\u8BD5\u6298\u53E0\u2026",
1951
+ preflightFolded: "\u9884\u68C0\uFF1A\u8BF7\u6C42\u7EA6 {estimate}/{ctxMax} tokens\uFF08{pct}%\uFF09\u2014 \u5DF2\u6298\u53E0 {beforeMessages} \u6761\u6D88\u606F \u2192 {afterMessages}\uFF08\u603B\u7ED3 {summaryChars} \u5B57\uFF09\u3002\u53D1\u9001\u4E2D\u3002",
1952
+ preflightNoFold: "\u9884\u68C0\uFF1A\u8BF7\u6C42\u7EA6 {estimate}/{ctxMax} tokens\uFF08{pct}%\uFF09\u4E14\u6CA1\u6709\u53EF\u6298\u53E0\u7684\u5185\u5BB9 \u2014 DeepSeek \u5927\u6982\u7387\u4F1A\u8FD4\u56DE 400\u3002\u8BF7\u8FD0\u884C /clear \u6216 /new \u91CD\u65B0\u5F00\u59CB\u3002",
1953
+ flashEscalation: "\u21E7 flash \u8BF7\u6C42\u5347\u7EA7 \u2014 \u672C\u8F6E\u6539\u7528 {model}{reasonSuffix}",
1954
+ harvestStatus: "\u6B63\u5728\u4ECE\u63A8\u7406\u8FC7\u7A0B\u63D0\u53D6\u8BA1\u5212\u72B6\u6001\u2026",
1955
+ autoEscalation: "\u21E7 \u672C\u8F6E\u5269\u4F59\u8C03\u7528\u81EA\u52A8\u5347\u7EA7\u5230 {model} \u2014 flash \u547D\u4E2D {breakdown}\u3002\u4E0B\u4E00\u8F6E\u56DE\u9000\u5230 {fallback}\uFF0C\u9664\u975E\u5DF2\u88C5\u5907 /pro\u3002",
1956
+ readOnlyLoopEscalation: "\u21E7 \u81EA\u52A8\u5347\u7EA7\u5230 {model} \u2014 flash \u8FDE\u7EED {n} \u6B21\u53EA\u8BFB\u8C03\u7528\uFF0C\u672A\u4EA7\u51FA\u4FEE\u6539\u6216\u6700\u7EC8\u7B54\u6848\u3002\u4E0B\u4E00\u8F6E\u56DE\u9000\u5230 {fallback}\uFF0C\u9664\u975E\u5DF2\u88C5\u5907 /pro\u3002",
1957
+ repeatToolCallWarning: "\u62E6\u622A\u5230\u91CD\u590D\u5DE5\u5177\u8C03\u7528 \u2014 \u8BA9\u6A21\u578B\u5BDF\u89C9\u95EE\u9898\u5E76\u6362\u79CD\u65B9\u5F0F\u91CD\u8BD5\u3002",
1958
+ stormStuck: "\u5DF2\u505C\u6B62\u5361\u6B7B\u7684\u91CD\u8BD5\u5FAA\u73AF \u2014 \u6A21\u578B\u5728\u81EA\u7EA0\u63D0\u793A\u540E\u4ECD\u4EE5\u76F8\u540C\u53C2\u6570\u91CD\u590D\u8C03\u7528\u540C\u4E00\u5DE5\u5177\u3002\u8BF7\u5C1D\u8BD5 /retry\u3001\u6362\u79CD\u8BF4\u6CD5\uFF0C\u6216\u6392\u67E5\u5E95\u5C42\u963B\u585E\u3002",
1959
+ stormSuppressed: "\u5DF2\u6291\u5236 {count} \u6B21\u91CD\u590D\u5DE5\u5177\u8C03\u7528 \u2014 \u540C\u4E00\u540D\u79F0 + \u53C2\u6570\u89E6\u53D1 3 \u6B21\u4EE5\u4E0A\u3002",
1960
+ compactingHistoryStatus: "\u6B63\u5728\u538B\u7F29\u5386\u53F2{aggressiveTag}\u2026",
1961
+ aggressiveTag: "\uFF08\u6FC0\u8FDB\uFF09",
1962
+ foldedHistory: "\u4E0A\u4E0B\u6587 {before}/{ctxMax}\uFF08{pct}%\uFF09\u2014 \u5DF2\u6298\u53E0 {beforeMessages} \u6761\u6D88\u606F \u2192 {afterMessages}\uFF08\u603B\u7ED3 {summaryChars} \u5B57\uFF09\u3002\u7EE7\u7EED\u3002",
1963
+ aggressivelyFoldedHistory: "\u4E0A\u4E0B\u6587 {before}/{ctxMax}\uFF08{pct}%\uFF09\u2014 \u5DF2\u6FC0\u8FDB\u6298\u53E0 {beforeMessages} \u6761\u6D88\u606F \u2192 {afterMessages}\uFF08\u603B\u7ED3 {summaryChars} \u5B57\uFF09\u3002\u7EE7\u7EED\u3002",
1964
+ forcingSummary: "\u4E0A\u4E0B\u6587 {before}/{ctxMax}\uFF08{pct}%\uFF09\u2014 \u57FA\u4E8E\u5DF2\u6536\u96C6\u5230\u7684\u5185\u5BB9\u5F3A\u5236\u603B\u7ED3\u3002\u8BF7\u8FD0\u884C /compact\u3001/clear \u6216 /new \u91CD\u7F6E\u3002"
1965
+ },
1966
+ errors: {
1967
+ contextOverflow: "\u4E0A\u4E0B\u6587\u6EA2\u51FA\uFF08DeepSeek 400\uFF09\uFF1A\u4F1A\u8BDD\u5386\u53F2\u5DF2\u8FBE {requested}\uFF0C\u8D85\u51FA\u6A21\u578B prompt \u4E0A\u9650\uFF08V4\uFF1A1M tokens\uFF1B\u65E7\u7248 chat/reasoner\uFF1A131k\uFF09\u3002\u901A\u5E38\u662F\u5355\u4E2A\u5DE5\u5177\u7ED3\u679C\u592A\u5927\u3002Luckerr \u9ED8\u8BA4\u5C06\u65B0\u5DE5\u5177\u7ED3\u679C\u9650\u5236\u5728 8k tokens\uFF0C\u5E76\u5728\u4F1A\u8BDD\u52A0\u8F7D\u65F6\u81EA\u52A8\u4FEE\u590D\u8D85\u5927\u5386\u53F2 \u2014 \u91CD\u542F\u5E38\u80FD\u6E05\u6389\u3002\u5982\u679C\u4ECD\u7136\u6EA2\u51FA\uFF0C\u8FD0\u884C /new \u91CD\u65B0\u5F00\u59CB\uFF0C\u6216\u6253\u5F00 /sessions \u9009\u4E2D\u540E\u6309 [d] \u5220\u9664\u8BE5\u4F1A\u8BDD\u3002",
1968
+ contextOverflowTooMany: "tokens \u6570\u91CF\u8FC7\u591A",
1969
+ auth401: "\u8BA4\u8BC1\u5931\u8D25\uFF08DeepSeek 401\uFF09\uFF1A{inner}\u3002\u4F60\u7684 API key \u88AB\u62D2\u7EDD\u3002\u8FD0\u884C `luckerr setup` \u6216 `export DEEPSEEK_API_KEY=sk-...` \u4FEE\u590D\u3002\u5728 https://platform.deepseek.com/api_keys \u83B7\u53D6 key\u3002",
1970
+ balance402: "\u4F59\u989D\u4E0D\u8DB3\uFF08DeepSeek 402\uFF09\uFF1A{inner}\u3002\u5728 https://platform.deepseek.com/top_up \u5145\u503C \u2014 \u4F59\u989D\u975E\u96F6\u65F6\u9762\u677F\u9876\u680F\u4F1A\u663E\u793A\u3002",
1971
+ badparam422: "\u53C2\u6570\u9519\u8BEF\uFF08DeepSeek 422\uFF09\uFF1A{inner}",
1972
+ badrequest400: "\u8BF7\u6C42\u9519\u8BEF\uFF08DeepSeek 400\uFF09\uFF1A{inner}",
1973
+ deepseek5xxHead: "DeepSeek \u670D\u52A1\u4E0D\u53EF\u7528\uFF08{status}\uFF09 \u2014 \u8FD9\u662F DeepSeek \u670D\u52A1\u7AEF\u95EE\u9898\uFF0C\u4E0D\u662F Luckerr \u6545\u969C\u3002\u5DF2\u6309\u6307\u6570\u9000\u907F\u91CD\u8BD5 4 \u6B21\u3002",
1974
+ deepseek5xxReachable: " DeepSeek \u4E3B API \u5065\u5EB7\u68C0\u67E5\u901A\u8FC7\uFF0C\u4F46 /chat/completions \u5728\u6302 \u2014 \u4ED6\u4EEC\u90A3\u8FB9\u90E8\u5206\u670D\u52A1\u5F02\u5E38\u3002",
1975
+ deepseek5xxUnreachable: " \u65E0\u6CD5\u4ECE\u4F60\u7684\u7F51\u7EDC\u8BBF\u95EE DeepSeek API \u2014 \u53EF\u80FD\u662F DS \u6574\u4F53\u6545\u969C\uFF0C\u4E5F\u53EF\u80FD\u662F\u672C\u5730\u7F51\u7EDC\u95EE\u9898\u3002",
1976
+ deepseek5xxActionNetwork: " \u5EFA\u8BAE\uFF1A(1) \u68C0\u67E5\u7F51\u7EDC\uFF0C(2) \u7B49 30 \u79D2\u540E\u91CD\u8BD5\uFF0C(3) \u67E5\u770B\u72B6\u6001\u9875 https://status.deepseek.com\u3002",
1977
+ deepseek5xxActionRetry: " \u5EFA\u8BAE\uFF1A(1) \u7B49 30 \u79D2\u540E\u91CD\u8BD5\uFF0C(2) \u7528 /preset \u5207\u6362\u6A21\u578B\uFF0C(3) \u67E5\u770B\u72B6\u6001\u9875 https://status.deepseek.com\u3002",
1978
+ innerNoMessage: "\uFF08\u65E0\u9519\u8BEF\u4FE1\u606F\uFF09",
1979
+ reasonAborted: "[\u7528\u6237\u5DF2\u4E2D\u65AD\uFF08Esc\uFF09 \u2014 \u6B63\u5728\u603B\u7ED3\u5230\u76EE\u524D\u4E3A\u6B62\u7684\u53D1\u73B0]",
1980
+ reasonContextGuard: "[\u4E0A\u4E0B\u6587\u989D\u5EA6\u5373\u5C06\u8017\u5C3D \u2014 \u5728\u4E0B\u4E00\u6B21\u8C03\u7528\u6EA2\u51FA\u4E4B\u524D\u5148\u603B\u7ED3]",
1981
+ reasonStuck: "[\u5361\u5728\u91CD\u590D\u7684\u5DE5\u5177\u8C03\u7528\u4E0A \u2014 \u8BF4\u660E\u5DF2\u5C1D\u8BD5\u7684\u65B9\u6CD5\u4EE5\u53CA\u963B\u585E\u70B9]",
1982
+ reasonBudget: "[\u5DE5\u5177\u8C03\u7528\u914D\u989D\uFF08{iterCap}\uFF09\u5DF2\u7528\u5C3D \u2014 \u57FA\u4E8E\u5DF2\u53D1\u73B0\u7684\u5185\u5BB9\u5F3A\u5236\u603B\u7ED3]",
1983
+ labelAborted: "\u7528\u6237\u4E2D\u65AD",
1984
+ labelContextGuard: "\u89E6\u53D1\u4E0A\u4E0B\u6587\u4FDD\u62A4\uFF08prompt > 80% \u7A97\u53E3\uFF09",
1985
+ labelStuck: "\u5361\u6B7B\uFF08\u91CD\u590D\u5DE5\u5177\u8C03\u7528\u88AB\u53CD\u98CE\u66B4\u673A\u5236\u6291\u5236\uFF09",
1986
+ labelBudget: "\u5DE5\u5177\u8C03\u7528\u914D\u989D\uFF08{iterCap}\uFF09\u5DF2\u7528\u5C3D"
1987
+ },
1988
+ handlers: {
1989
+ basic: {
1990
+ newInfo: "\u25B8 \u65B0\u5BF9\u8BDD \u2014 \u5DF2\u4ECE\u4E0A\u4E0B\u6587\u4E2D\u4E22\u5F03 {count} \u6761\u6D88\u606F\u3002\u540C\u4E00\u4F1A\u8BDD\uFF0C\u5168\u65B0\u5F00\u59CB\u3002",
1991
+ newInfoArchived: "\u25B8 \u65B0\u5BF9\u8BDD \u2014 \u5DF2\u4ECE\u4E0A\u4E0B\u6587\u4E2D\u4E22\u5F03 {count} \u6761\u6D88\u606F\u3002\u539F\u5BF9\u8BDD\u5DF2\u5F52\u6863\u4E3A\u300C{archived}\u300D\uFF0C\u53EF\u5728 Sessions \u9762\u677F\u67E5\u770B\u3002",
1992
+ newInfoSystemReloaded: " \xB7 LUCKERR.md / \u9879\u76EE\u8BB0\u5FC6\u5DF2\u91CD\u65B0\u52A0\u8F7D\uFF08\u4E0B\u4E00\u8F6E\u4E00\u6B21\u6027 cache miss\uFF09",
1993
+ helpTitle: "\u547D\u4EE4\uFF1A",
1994
+ helpShellTitle: "Shell \u5FEB\u6377\u65B9\u5F0F\uFF1A",
1995
+ helpShell: " !<cmd> \u5728\u6C99\u7BB1\u6839\u76EE\u5F55\u8FD0\u884C <cmd>\uFF1B\u8F93\u51FA\u8FDB\u5165\u5BF9\u8BDD",
1996
+ helpShellDetail: " \u4EE5\u4FBF\u6A21\u578B\u5728\u4E0B\u4E00\u8F6E\u770B\u5230\u3002\u65E0\u5141\u8BB8\u5217\u8868\u9650\u5236\u3002",
1997
+ helpShellConsent: " \u7528\u6237\u8F93\u5165 = \u660E\u786E\u540C\u610F\u3002",
1998
+ helpShellExample: " \u793A\u4F8B\uFF1A!git status !ls src/ !npm test",
1999
+ helpMemoryTitle: "\u5FEB\u901F\u8BB0\u5FC6\uFF1A",
2000
+ helpMemoryPin: " #<note> \u5C06 <note> \u8FFD\u52A0\u5230 <project>/LUCKERR.md\uFF08\u53EF\u63D0\u4EA4\uFF09\u3002",
2001
+ helpMemoryPinEx: " \u793A\u4F8B\uFF1A#findByEmail \u5FC5\u987B\u533A\u5206\u5927\u5C0F\u5199",
2002
+ helpMemoryGlobal: " #g <note> \u5C06 <note> \u8FFD\u52A0\u5230 ~/.luckerr/LUCKERR.md\uFF08\u5168\u5C40\uFF0C\u4E0D\u63D0\u4EA4\uFF09\u3002",
2003
+ helpMemoryGlobalEx: " \u793A\u4F8B\uFF1A#g \u59CB\u7EC8\u4F7F\u7528 pnpm \u800C\u975E npm",
2004
+ helpMemoryPinBoth: " \u4E24\u8005\u90FD\u56FA\u5B9A\u5230\u6BCF\u4E2A\u672A\u6765\u4F1A\u8BDD\u7684\u524D\u7F00\u4E2D\u3002\u6BD4 /memory \u66F4\u5FEB\u3002",
2005
+ helpMemoryEscape: " \u4F7F\u7528 `\\#text` \u53D1\u9001\u5B57\u9762\u91CF `#text` \u7ED9\u6A21\u578B\u3002",
2006
+ helpFileTitle: "\u6587\u4EF6\u5F15\u7528\uFF08\u4EE3\u7801\u6A21\u5F0F\uFF09\uFF1A",
2007
+ helpFile: " @path/to/file \u53D1\u9001\u65F6\u5C06\u6587\u4EF6\u5185\u5BB9\u5185\u8054\u5230 [Referenced files] \u4E0B\u3002",
2008
+ helpFilePicker: " \u8F93\u5165 `@` \u6253\u5F00\u9009\u62E9\u5668\uFF08\u2191\u2193 \u5BFC\u822A\uFF0CTab/Enter \u9009\u62E9\uFF09\u3002",
2009
+ helpUrlTitle: "URL \u5F15\u7528\uFF1A",
2010
+ helpUrl: " @https://example.com \u83B7\u53D6 URL\uFF0C\u5265\u79BB HTML\uFF0C\u5185\u8054\u5230 [Referenced URLs] \u4E0B\u3002",
2011
+ helpUrlCache: " \u540C\u4E00\u4F1A\u8BDD\u4E2D\u76F8\u540C URL \u53EA\u83B7\u53D6\u4E00\u6B21\uFF08\u5185\u5B58\u7F13\u5B58\uFF09\u3002",
2012
+ helpUrlPunct: " \u81EA\u52A8\u5265\u79BB\u5C3E\u90E8\u6807\u70B9\u7B26\u53F7\uFF08./,/\uFF09\uFF09\u3002",
2013
+ helpPresetsTitle: "\u9884\u8BBE\uFF08branch + harvest \u6C38\u8FDC\u4E0D\u4F1A\u81EA\u52A8\u542F\u7528 \u2014 \u4EC5\u624B\u52A8\u9009\u62E9\uFF09\uFF1A",
2014
+ helpPresetAuto: " auto v4-flash \u2192 v4-pro \u5728\u56F0\u96BE\u8F6E\u6B21\u5207\u6362 \u2190 \u9ED8\u8BA4 \xB7 \u7B80\u5355\u65F6\u4FBF\u5B9C\uFF0C\u56F0\u96BE\u65F6\u667A\u80FD",
2015
+ helpPresetFlash: " flash \u59CB\u7EC8\u4F7F\u7528 v4-flash \u6700\u4FBF\u5B9C \xB7 \u6BCF\u8F6E\u6210\u672C\u53EF\u9884\u6D4B",
2016
+ helpPresetPro: " pro \u59CB\u7EC8\u4F7F\u7528 v4-pro \u7EA6 3 \u500D flash \xB7 \u7528\u4E8E\u56F0\u96BE\u7684\u591A\u8F6E\u5DE5\u4F5C",
2017
+ helpSessionsTitle: "\u4F1A\u8BDD\uFF08\u9ED8\u8BA4\u81EA\u52A8\u542F\u7528\uFF0C\u547D\u540D\u4E3A 'default'\uFF09\uFF1A",
2018
+ helpSessionCustom: " luckerr chat --session <name> \u4F7F\u7528\u4E0D\u540C\u7684\u547D\u540D\u4F1A\u8BDD",
2019
+ helpSessionNone: " luckerr chat --no-session \u7981\u7528\u672C\u6B21\u8FD0\u884C\u7684\u6301\u4E45\u5316",
2020
+ retryNone: "\u6CA1\u6709\u53EF\u91CD\u8BD5\u7684\u5185\u5BB9 \u2014 \u6B64\u4F1A\u8BDD\u65E5\u5FD7\u4E2D\u6CA1\u6709\u5148\u524D\u7684\u7528\u6237\u6D88\u606F\u3002",
2021
+ retryInfo: '\u25B8 \u91CD\u8BD5\u4E2D\uFF1A"{preview}"',
2022
+ loopTuiOnly: "/loop \u4EC5\u5728\u4EA4\u4E92\u5F0F TUI \u4E2D\u53EF\u7528\uFF08\u4E0D\u5728 run/replay \u4E2D\uFF09\u3002",
2023
+ loopStopped: "\u25B8 \u5FAA\u73AF\u5DF2\u505C\u6B62\u3002",
2024
+ loopNoActive: "\u6CA1\u6709\u6D3B\u52A8\u7684\u5FAA\u73AF\u53EF\u505C\u6B62\u3002",
2025
+ loopNoActiveHint: "\u6CA1\u6709\u6D3B\u52A8\u7684\u5FAA\u73AF\u3002\u4F7F\u7528 `/loop <interval> <prompt>` \u542F\u52A8\u4E00\u4E2A\uFF08\u4F8B\u5982 /loop 30s npm test\uFF09\u3002\n\u53D6\u6D88\u65B9\u5F0F\uFF1A/loop stop \xB7 Esc \xB7 /clear /new \xB7 \u4EFB\u4F55\u7528\u6237\u8F93\u5165\u7684\u63D0\u793A\u3002",
2026
+ loopStarted: '\u25B8 \u5FAA\u73AF\u5DF2\u542F\u52A8 \u2014 \u6BCF {duration} \u91CD\u65B0\u63D0\u4EA4 "{prompt}"\u3002\u8F93\u5165\u4EFB\u4F55\u5185\u5BB9\uFF08\u6216 /loop stop\uFF09\u53D6\u6D88\u3002',
2027
+ keysNeedsTui: "/keys \u9700\u8981 TUI \u4E0A\u4E0B\u6587\uFF08postKeys \u5DF2\u8FDE\u63A5\uFF09\u3002",
2028
+ unknownCommand: "\u672A\u77E5\u547D\u4EE4\uFF1A/{cmd} \u2014 \u4F60\u662F\u4E0D\u662F\u60F3\u7528 {list}\uFF1F",
2029
+ unknownCommandShort: "\u672A\u77E5\u547D\u4EE4\uFF1A/{cmd} \uFF08\u8BD5\u8BD5 /help\uFF09"
2030
+ },
2031
+ admin: {
2032
+ doctorNeedsTui: "/doctor \u9700\u8981 TUI \u4E0A\u4E0B\u6587\uFF08postDoctor \u5DF2\u8FDE\u63A5\uFF09\u3002",
2033
+ doctorRunning: "\u2695 \u5065\u5EB7\u68C0\u67E5 \u2014 \u6B63\u5728\u8FD0\u884C\u2026",
2034
+ hooksReloadUnavailable: "/hooks reload \u5728\u6B64\u4E0A\u4E0B\u6587\u4E2D\u4E0D\u53EF\u7528\uFF08\u65E0\u91CD\u8F7D\u56DE\u8C03\uFF09\u3002",
2035
+ hooksReloaded: "\u25B8 \u5DF2\u91CD\u8F7D hooks \xB7 {count} \u4E2A\u6D3B\u8DC3",
2036
+ hooksUsage: "\u7528\u6CD5\uFF1A/hooks \u5217\u51FA\u6D3B\u8DC3\u7684 hooks\n /hooks reload \u91CD\u65B0\u8BFB\u53D6 settings.json \u6587\u4EF6",
2037
+ hooksNone: "\u672A\u914D\u7F6E hooks\u3002",
2038
+ hooksDropHint: "\u5C06\u5305\u542B `hooks` \u952E\u7684 settings.json \u653E\u5165\u4EE5\u4E0B\u4EFB\u4E00\u4F4D\u7F6E\uFF1A",
2039
+ hooksProject: " \xB7 {path}\uFF08\u9879\u76EE\uFF09",
2040
+ hooksProjectFallback: " \xB7 <project>/.luckerr/settings.json\uFF08\u9879\u76EE\uFF09",
2041
+ hooksGlobal: " \xB7 {path}\uFF08\u5168\u5C40\uFF09",
2042
+ hooksEvents: "\u4E8B\u4EF6\uFF1APreToolUse, PostToolUse, UserPromptSubmit, Stop",
2043
+ hooksExitCodes: "exit 0 = \u901A\u8FC7 \xB7 exit 2 = \u963B\u6B62\uFF08Pre*\uFF09\xB7 \u5176\u4ED6 = \u8B66\u544A",
2044
+ hooksLoaded: "\u25B8 \u5DF2\u52A0\u8F7D {count} \u4E2A hook",
2045
+ hooksSources: "\u6765\u6E90\uFF1Aproject={project} \xB7 global={global}",
2046
+ updateCurrent: "\u5F53\u524D\uFF1Aluckerr {version}",
2047
+ updateLatestPending: "\u6700\u65B0\uFF1A\uFF08\u5C1A\u672A\u89E3\u6790 \u2014 \u540E\u53F0\u68C0\u67E5\u8FDB\u884C\u4E2D\u6216\u79BB\u7EBF\uFF09",
2048
+ updateRetryHint: "\u5DF2\u89E6\u53D1\u65B0\u7684\u6CE8\u518C\u8868\u83B7\u53D6 \u2014 \u51E0\u79D2\u540E\u91CD\u8BD5 `/update`\uFF0C",
2049
+ updateRetryHint2: "\u6216\u5728\u53E6\u4E00\u4E2A\u7EC8\u7AEF\u8FD0\u884C `luckerr update` \u5F3A\u5236\u540C\u6B65\u6267\u884C\u3002",
2050
+ updateLatest: "\u6700\u65B0\uFF1Aluckerr {version}",
2051
+ updateUpToDate: "\u60A8\u5DF2\u662F\u6700\u65B0\u7248\u672C\u3002\u65E0\u9700\u64CD\u4F5C\u3002",
2052
+ updateNpxHint: "\u60A8\u6B63\u5728\u901A\u8FC7 npx \u8FD0\u884C \u2014 \u4E0B\u6B21 `npx luckerr ...` \u542F\u52A8\u65F6\u5C06\u81EA\u52A8\u83B7\u53D6\u3002",
2053
+ updateNpxForce: "\u8981\u5F3A\u5236\u5237\u65B0\uFF1A`npm cache clean --force`\u3002",
2054
+ updateUpgradeHint: "\u8981\u5347\u7EA7\uFF0C\u8BF7\u9000\u51FA\u6B64\u4F1A\u8BDD\u5E76\u8FD0\u884C\uFF1A",
2055
+ updateUpgradeCmd1: " luckerr update \uFF08\u4EA4\u4E92\u5F0F\uFF0C\u652F\u6301 --dry-run \u9884\u89C8\uFF09",
2056
+ updateUpgradeCmd2: " {command} \uFF08\u76F4\u63A5\u5B89\u88C5\uFF09",
2057
+ updateInSessionDisabled: "\u4F1A\u8BDD\u5185\u5B89\u88C5\u88AB\u523B\u610F\u7981\u7528 \u2014 \u5B89\u88C5\u547D\u4EE4\u4F1A",
2058
+ updateInSessionDisabled2: "\u7834\u574F\u6B64 TUI \u7684\u6E32\u67D3\uFF0C\u4E14 Windows \u53EF\u80FD\u9501\u5B9A\u8FD0\u884C\u4E2D\u7684\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002",
2059
+ statsNoData: "\u5C1A\u65E0\u4F7F\u7528\u6570\u636E\u3002",
2060
+ statsEveryTurn: "\u60A8\u5728\u6B64\u8FD0\u884C\u7684\u6BCF\u4E00\u8F6E\u90FD\u4F1A\u8FFD\u52A0\u4E00\u6761\u8BB0\u5F55 \u2014 \u6B64\u4F1A\u8BDD\u7684\u8F6E\u6B21",
2061
+ statsWillAppear: "\u5C06\u5728\u60A8\u53D1\u9001\u6D88\u606F\u540E\u663E\u793A\u5728\u4EEA\u8868\u677F\u4E2D\u3002"
2062
+ },
2063
+ edits: {
2064
+ undoCodeOnly: "/undo \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528 \u2014 \u804A\u5929\u6A21\u5F0F\u4E0D\u5E94\u7528\u7F16\u8F91\u3002",
2065
+ historyCodeOnly: "/history \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2066
+ showCodeOnly: "/show \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2067
+ applyCodeOnly: "/apply \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\uFF08\u6B64\u5904\u65E0\u5185\u5BB9\u53EF\u5E94\u7528\uFF09\u3002",
2068
+ discardCodeOnly: "/discard \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2069
+ planCodeOnly: "/plan \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528 \u2014 \u804A\u5929\u6A21\u5F0F\u4E0D\u9650\u5236\u5DE5\u5177\u5199\u5165\u3002",
2070
+ planOn: "\u25B8 \u8BA1\u5212\u6A21\u5F0F\u5F00\u542F \u2014 \u5199\u5165\u5DE5\u5177\u88AB\u9650\u5236\uFF1B\u6A21\u578B\u5FC5\u987B\u5148\u8C03\u7528 `submit_plan` \u624D\u80FD\u6267\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002\uFF08\u6A21\u578B\u4E5F\u53EF\u4EE5\u5728\u8BA1\u5212\u6A21\u5F0F\u5173\u95ED\u65F6\u81EA\u4E3B\u8C03\u7528 submit_plan \u5904\u7406\u5927\u578B\u4EFB\u52A1 \u2014 \u6B64\u5F00\u5173\u662F\u66F4\u5F3A\u7684\u663E\u5F0F\u7EA6\u675F\u3002\uFF09\u8F93\u5165 /plan off \u9000\u51FA\u3002",
2071
+ planOff: "\u25B8 \u8BA1\u5212\u6A21\u5F0F\u5173\u95ED \u2014 \u5199\u5165\u5DE5\u5177\u518D\u6B21\u53EF\u7528\u3002\u6A21\u578B\u4ECD\u53EF\u4E3A\u5927\u578B\u4EFB\u52A1\u81EA\u4E3B\u63D0\u51FA\u8BA1\u5212\u3002",
2072
+ modeCodeOnly: "/mode \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2073
+ modeUsage: "\u7528\u6CD5\uFF1A/mode <review|auto|yolo> \uFF08Shift+Tab \u4E5F\u53EF\u5FAA\u73AF\uFF09",
2074
+ modeYolo: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1AYOLO \u2014 \u7F16\u8F91\u548C Shell \u547D\u4EE4\u81EA\u52A8\u8FD0\u884C\uFF0C\u65E0\u63D0\u793A\u3002/undo \u4ECD\u53EF\u56DE\u6EDA\u7F16\u8F91\u3002\u8BF7\u8C28\u614E\u4F7F\u7528\u3002",
2075
+ modeAuto: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1AAUTO \u2014 \u7F16\u8F91\u7ACB\u5373\u5E94\u7528\uFF1B\u5728 5 \u79D2\u5185\u6309 u \u64A4\u6D88\uFF0C\u6216\u7A0D\u540E\u4F7F\u7528 /undo\u3002Shell \u547D\u4EE4\u4ECD\u4F1A\u8BE2\u95EE\u3002",
2076
+ modeReview: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1Areview \u2014 \u7F16\u8F91\u6392\u961F\u7B49\u5F85 /apply\uFF08\u6216 y\uFF09/ /discard\uFF08\u6216 n\uFF09",
2077
+ commitCodeOnly: "/commit \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\uFF08\u9700\u8981\u6709\u6839\u7684 git \u4ED3\u5E93\uFF09\u3002",
2078
+ commitUsage: '\u7528\u6CD5\uFF1A/commit "\u63D0\u4EA4\u6D88\u606F" \u2014 \u5728 {root} \u4E2D\u8FD0\u884C `git add -A && git commit -m "\u2026"`',
2079
+ walkCodeOnly: "/walk \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2080
+ checkpointCodeOnly: "/checkpoint \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528 \u2014 \u804A\u5929\u6A21\u5F0F\u4E0D\u5E94\u7528\u7F16\u8F91\u3002",
2081
+ checkpointNone: "\u5C1A\u65E0\u68C0\u67E5\u70B9 \u2014 `/checkpoint <name>` \u5FEB\u7167\u4F1A\u8BDD\u6D89\u53CA\u7684\u6BCF\u4E2A\u6587\u4EF6\u3002\u7A0D\u540E\u4F7F\u7528 `/restore <name>` \u6062\u590D\u3002",
2082
+ checkpointHeader: "\u25C8 \u68C0\u67E5\u70B9 \xB7 \u5DF2\u5B58\u50A8 {count} \u4E2A",
2083
+ checkpointRestoreHint: " /restore <name|id> \xB7 /checkpoint forget <id> \xB7 /checkpoint <name> \u6DFB\u52A0",
2084
+ checkpointForgetUsage: "\u7528\u6CD5\uFF1A/checkpoint forget <id|name>",
2085
+ checkpointNoMatch: '\u25B8 \u672A\u627E\u5230\u5339\u914D "{name}" \u7684\u68C0\u67E5\u70B9 \u2014 \u89C1 /checkpoint list',
2086
+ checkpointDeleted: "\u25B8 \u5DF2\u5220\u9664\u68C0\u67E5\u70B9 {id}\uFF08{name}\uFF09",
2087
+ checkpointDeleteFailed: "\u25B8 \u5220\u9664 {id} \u5931\u8D25\uFF08\u5DF2\u6D88\u5931\uFF1F\uFF09",
2088
+ checkpointSaveUsage: "\u7528\u6CD5\uFF1A/checkpoint <name> \uFF08\u6216 /checkpoint list \u67E5\u770B\u73B0\u6709\uFF09",
2089
+ checkpointSavedEmpty: '\u25B8 \u68C0\u67E5\u70B9 "{name}" \u5DF2\u4FDD\u5B58\uFF08{id}\uFF09\u2014 \u4F46\u5C1A\u672A\u6D89\u53CA\u4EFB\u4F55\u6587\u4EF6\uFF0C\u56E0\u6B64\u662F\u7A7A\u57FA\u7EBF\u3002\u6B64\u540E\u7684\u7F16\u8F91\u5C06\u53EF\u64A4\u6D88\u3002',
2090
+ checkpointSaved: '\u25B8 \u68C0\u67E5\u70B9 "{name}" \u5DF2\u4FDD\u5B58\uFF08{id}\uFF09\u2014 {files} \u4E2A\u6587\u4EF6\uFF0C{size} KB\u3002\u6062\u590D\uFF1A/restore {name}',
2091
+ restoreCodeOnly: "/restore \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2092
+ restoreUsage: "\u7528\u6CD5\uFF1A/restore <name|id> \uFF08\u89C1 /checkpoint list \u83B7\u53D6 ID\uFF09",
2093
+ restoreNoMatch: '\u25B8 \u672A\u627E\u5230\u5339\u914D "{target}" \u7684\u68C0\u67E5\u70B9 \u2014 \u5C1D\u8BD5 /checkpoint list',
2094
+ restoreInfo: '\u25B8 \u5DF2\u6062\u590D "{name}"\uFF08{id}\uFF09\uFF0C\u6765\u81EA {when}',
2095
+ restoreWrote: " \xB7 \u5199\u56DE\u4E86 {count} \u4E2A\u6587\u4EF6",
2096
+ restoreRemoved: " \xB7 \u79FB\u9664\u4E86 {count} \u4E2A\u6587\u4EF6\uFF08\u68C0\u67E5\u70B9\u65F6\u4E0D\u5B58\u5728\uFF09",
2097
+ restoreSkipped: " \u2717 \u8DF3\u8FC7\u4E86 {count} \u4E2A\u6587\u4EF6\uFF1A",
2098
+ cwdCodeOnly: "/cwd \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2099
+ cwdUsage: "\u7528\u6CD5\uFF1A/cwd <path> \uFF08\u5F53\u524D\u6839\u76EE\u5F55\uFF1A{current}\uFF09\u3002\u91CD\u65B0\u6307\u5411 filesystem / shell / memory \u5DE5\u5177\u5230 <path>\u3002",
2100
+ cwdUsageNoCurrent: "\u7528\u6CD5\uFF1A/cwd <path> \u5C06\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55\u5207\u6362\u5230 <path>\u3002"
2101
+ },
2102
+ model: {
2103
+ modelHint: "\u5C1D\u8BD5 deepseek-v4-flash \u6216 deepseek-v4-pro \u2014 \u8FD0\u884C /models \u83B7\u53D6\u5B9E\u65F6\u5217\u8868",
2104
+ modelUsage: "\u7528\u6CD5\uFF1A/model <id> \uFF08{hint}\uFF09",
2105
+ modelNotInCatalog: "model \u2192 {id} \uFF08\u26A0 \u4E0D\u5728\u83B7\u53D6\u7684\u76EE\u5F55\u4E2D\uFF1A{list}\u3002\u5982\u679C\u8FD9\u662F\u9519\u8BEF\u7684\uFF0C\u4E0B\u6B21\u8C03\u7528\u5C06\u8FD4\u56DE 400 \u2014 \u8FD0\u884C /models \u5237\u65B0\u3002\uFF09",
2106
+ modelSet: "model \u2192 {id}",
2107
+ presetAuto: "preset \u2192 auto \uFF08v4-flash \u2192 v4-pro \u5728\u56F0\u96BE\u8F6E\u6B21\u5207\u6362 \xB7 \u9ED8\u8BA4\uFF09",
2108
+ presetFlash: "preset \u2192 flash \uFF08\u59CB\u7EC8\u4F7F\u7528 v4-flash \xB7 \u6700\u4FBF\u5B9C \xB7 /pro \u4ECD\u53EF\u4E34\u65F6\u63D0\u5347\u4E00\u8F6E\uFF09",
2109
+ presetPro: "preset \u2192 pro \uFF08\u59CB\u7EC8\u4F7F\u7528 v4-pro \xB7 \u7EA6 3 \u500D flash \xB7 \u7528\u4E8E\u56F0\u96BE\u7684\u591A\u8F6E\u5DE5\u4F5C\uFF09",
2110
+ presetUsage: "\u7528\u6CD5\uFF1A/preset <auto|flash|pro>",
2111
+ proNothingArmed: "\u672A\u542F\u7528 \u2014 /pro \u4E0D\u5E26\u53C2\u6570\u5C06\u4E3A\u4E0B\u4E00\u8F6E\u542F\u7528 pro",
2112
+ proDisarmed: "\u25B8 /pro \u5DF2\u89E3\u9664 \u2014 \u4E0B\u4E00\u8F6E\u56DE\u9000\u5230\u5F53\u524D\u9884\u8BBE",
2113
+ proUsage: "\u7528\u6CD5\uFF1A/pro \u4E3A\u4E0B\u4E00\u8F6E\u542F\u7528 pro\uFF08\u4E00\u6B21\u6027\uFF0C\u81EA\u52A8\u89E3\u9664\uFF09\n /pro off \u5728\u4E0B\u4E00\u8F6E\u524D\u53D6\u6D88\u542F\u7528\u72B6\u6001",
2114
+ proArmed: "\u25B8 /pro \u5DF2\u542F\u7528 \u2014 \u60A8\u7684\u4E0B\u4E00\u6761\u6D88\u606F\u5C06\u5728 {model} \u4E0A\u8FD0\u884C\uFF0C\u65E0\u8BBA\u9884\u8BBE\u5982\u4F55\u3002\u4E00\u8F6E\u540E\u81EA\u52A8\u89E3\u9664\u3002\u4F7F\u7528 /preset max \u8FDB\u884C\u6301\u4E45\u5207\u6362\u3002",
2115
+ budgetNoCap: "\u672A\u8BBE\u7F6E\u4F1A\u8BDD\u9884\u7B97 \u2014 Luckerr \u5C06\u6301\u7EED\u8FD0\u884C\u76F4\u5230\u60A8\u505C\u6B62\u3002\u4F7F\u7528\u4EE5\u4E0B\u65B9\u5F0F\u8BBE\u7F6E\uFF1A/budget <usd> \uFF08\u4F8B\u5982 /budget 5\uFF09",
2116
+ budgetStatus: "\u9884\u7B97\uFF1A${spent} / ${cap}\uFF08{pct}%\uFF09\xB7 /budget off \u6E05\u9664\uFF0C/budget <usd> \u66F4\u6539",
2117
+ budgetOff: "budget \u2192 \u5173\u95ED\uFF08\u65E0\u4E0A\u9650\uFF09",
2118
+ budgetUsage: '\u7528\u6CD5\uFF1A/budget <usd> \uFF08\u6536\u5230 "{arg}" \u2014 \u5FC5\u987B\u662F\u6B63\u6570\uFF0C\u4F8B\u5982 /budget 5 \u6216 /budget 12.50\uFF09',
2119
+ budgetExhausted: "\u25B2 budget \u2192 ${cap} \u4F46\u5DF2\u82B1\u8D39 ${spent}\u3002\u4E0B\u4E00\u8F6E\u5C06\u88AB\u62D2\u7EDD \u2014 \u63D0\u9AD8\u4E0A\u9650\u4EE5\u7EE7\u7EED\uFF0C\u6216\u7ED3\u675F\u4F1A\u8BDD\u3002",
2120
+ budgetSet: "budget \u2192 ${cap} \uFF08\u8FC4\u4ECA\uFF1A${spent} \xB7 80% \u65F6\u8B66\u544A\uFF0C100% \u65F6\u62D2\u7EDD\u4E0B\u4E00\u8F6E \xB7 /budget off \u6E05\u9664\uFF09"
2121
+ },
2122
+ permissions: {
2123
+ mutateCodeOnly: "/permissions add / remove / clear \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528 \u2014 \u5B83\u4EEC\u7F16\u8F91\u9879\u76EE\u8303\u56F4\u7684\u5141\u8BB8\u5217\u8868\uFF08`~/.luckerr/config.json` projects[<root>].shellAllowed\uFF09\u3002",
2124
+ addUsage: '\u7528\u6CD5\uFF1A/permissions add <prefix> \uFF08\u591A token \u53EF\u7528\uFF1A/permissions add "git push origin"\uFF09',
2125
+ addAlready: "\u25B8 \u5DF2\u5141\u8BB8\uFF1A{prefix}",
2126
+ addBuiltin: "\u25B8 `{prefix}` \u5DF2\u5728\u5185\u7F6E\u5141\u8BB8\u5217\u8868\u4E2D \u2014 \u65E0\u9700\u9879\u76EE\u6761\u76EE\u3002\uFF08\u5185\u7F6E\u6761\u76EE\u59CB\u7EC8\u5F00\u542F\u3002\uFF09",
2127
+ addInfo: "\u25B8 \u5DF2\u6DFB\u52A0\uFF1A{prefix}\n \u2192 \u5728\u6B64\u9879\u76EE\u4E2D\uFF0C\u4E0B\u6B21 `{prefix}` \u8C03\u7528\u5C06\u65E0\u9700\u63D0\u793A\u3002",
2128
+ removeUsage: "\u7528\u6CD5\uFF1A/permissions remove <prefix-or-index> \uFF08\u4F8B\u5982 /permissions remove 3\uFF0C\u6216 /permissions remove npm\uFF09",
2129
+ removeEmpty: "\u25B8 \u6CA1\u6709\u9879\u76EE\u5141\u8BB8\u5217\u8868\u6761\u76EE\u53EF\u79FB\u9664\u3002",
2130
+ removeIndexOob: "\u25B8 \u7D22\u5F15\u8D85\u51FA\u8303\u56F4\uFF1A{idx}\uFF08\u9879\u76EE\u5217\u8868\u6709 {count} \u4E2A\u6761\u76EE\uFF09",
2131
+ removeNothing: "\u25B8 \u65E0\u5185\u5BB9\u53EF\u79FB\u9664\u3002",
2132
+ removeBuiltin: "\u25B8 `{prefix}` \u5728\u5185\u7F6E\u5141\u8BB8\u5217\u8868\u4E2D\uFF08\u53EA\u8BFB\uFF09\u3002\u5185\u7F6E\u6761\u76EE\u65E0\u6CD5\u5728\u8FD0\u884C\u65F6\u79FB\u9664 \u2014 \u5B83\u4EEC\u5DF2\u7F16\u8BD1\u5230\u4E8C\u8FDB\u5236\u6587\u4EF6\u4E2D\u3002",
2133
+ removeInfo: "\u25B8 \u5DF2\u79FB\u9664\uFF1A{prefix}",
2134
+ removeNotFound: "\u25B8 \u65E0\u6B64\u9879\u76EE\u6761\u76EE\uFF1A{prefix} \uFF08\u5C1D\u8BD5 /permissions list \u67E5\u770B\u5DF2\u5B58\u50A8\u7684\u5185\u5BB9\uFF09",
2135
+ clearAlready: "\u25B8 \u9879\u76EE\u5141\u8BB8\u5217\u8868\u5DF2\u4E3A\u7A7A\u3002",
2136
+ clearConfirm: "\u5373\u5C06\u4E22\u5F03 {root} \u7684 {count} \u4E2A\u9879\u76EE\u5141\u8BB8\u5217\u8868\u6761\u76EE\u3002\u91CD\u65B0\u8FD0\u884C\u5E76\u9644\u5E26 'confirm' \u4E00\u8BCD\u4EE5\u7EE7\u7EED\uFF1A/permissions clear confirm",
2137
+ clearedNone: "\u25B8 \u9879\u76EE\u5141\u8BB8\u5217\u8868\u5DF2\u4E3A\u7A7A \u2014 \u65E0\u53D8\u5316\u3002",
2138
+ cleared: "\u25B8 \u5DF2\u6E05\u9664 {count} \u4E2A\u9879\u76EE\u5141\u8BB8\u5217\u8868\u6761\u76EE\u3002",
2139
+ usage: '\u7528\u6CD5\uFF1A/permissions [list] \u663E\u793A\u5F53\u524D\u72B6\u6001\n /permissions add <prefix> \u6301\u4E45\u5316\uFF08\u4F8B\u5982 "npm run build"\uFF09\n /permissions remove <prefix-or-N> \u5220\u9664\u4E00\u4E2A\u6761\u76EE\n /permissions clear confirm \u6E05\u9664\u6240\u6709\u9879\u76EE\u6761\u76EE',
2140
+ modeYolo: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1AYOLO \u2014 \u6BCF\u4E2A shell \u547D\u4EE4\u81EA\u52A8\u8FD0\u884C\uFF0C\u5141\u8BB8\u5217\u8868\u88AB\u7ED5\u8FC7\u3002/mode review \u91CD\u65B0\u542F\u7528\u63D0\u793A\u3002",
2141
+ modeAuto: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1Aauto \u2014 \u7F16\u8F91\u81EA\u52A8\u5E94\u7528\uFF0Cshell \u4ECD\u53D7\u5141\u8BB8\u5217\u8868\u9650\u5236\uFF08\u6216\u975E\u5141\u8BB8\u5217\u8868\u7684 ShellConfirm \u63D0\u793A\uFF09\u3002",
2142
+ modeReview: "\u25B8 \u7F16\u8F91\u6A21\u5F0F\uFF1Areview \u2014 \u7F16\u8F91\u548C\u975E\u5141\u8BB8\u5217\u8868\u7684 shell \u547D\u4EE4\u5728\u8FD0\u884C\u524D\u90FD\u4F1A\u8BE2\u95EE\u3002",
2143
+ projectHeader: "\u9879\u76EE\u5141\u8BB8\u5217\u8868\uFF08{count}\uFF09\u2014 {root}",
2144
+ projectNone1: ' \uFF08\u65E0 \u2014 \u5728 ShellConfirm \u63D0\u793A\u4E2D\u9009\u62E9 "always allow" \u6DFB\u52A0\u4E00\u4E2A\uFF0C',
2145
+ projectNone2: " \u6216\u76F4\u63A5 `/permissions add <prefix>`\u3002\uFF09",
2146
+ projectNoRoot: "\u9879\u76EE\u5141\u8BB8\u5217\u8868 \u2014 \uFF08\u65E0\u9879\u76EE\u6839\u76EE\u5F55\uFF1B\u804A\u5929\u6A21\u5F0F\u4EC5\u663E\u793A\u5185\u7F6E\u6761\u76EE\uFF09",
2147
+ builtinHeader: "\u5185\u7F6E\u5141\u8BB8\u5217\u8868\uFF08{count}\uFF09\u2014 \u53EA\u8BFB\uFF0C\u5DF2\u7F16\u8BD1",
2148
+ subcommands: "\u5B50\u547D\u4EE4\uFF1A/permissions add <prefix> \xB7 /permissions remove <prefix-or-N> \xB7 /permissions clear confirm"
2149
+ },
2150
+ dashboard: {
2151
+ notAvailable: "/dashboard \u5728\u6B64\u4E0A\u4E0B\u6587\u4E2D\u4E0D\u53EF\u7528\uFF08\u65E0 startDashboard \u56DE\u8C03\uFF09\u3002",
2152
+ stopNoCallback: "/dashboard stop\uFF1A\u65E0\u505C\u6B62\u56DE\u8C03\u3002",
2153
+ notRunning: "\u25B8 \u4EEA\u8868\u677F\u672A\u8FD0\u884C\u3002",
2154
+ stopping: "\u25B8 \u4EEA\u8868\u677F\u6B63\u5728\u505C\u6B62\u2026",
2155
+ alreadyRunning: "\u25B8 \u4EEA\u8868\u677F\u5DF2\u5728\u8FD0\u884C\uFF1A",
2156
+ alreadyRunningHint: "\u5728\u4EFB\u4F55\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u5B83\u3002\u8F93\u5165 `/dashboard stop` \u5173\u95ED\u3002",
2157
+ ready: "\u25B8 \u4EEA\u8868\u677F\u5C31\u7EEA\uFF1A",
2158
+ readyHint: "\u4EC5 127.0.0.1 \xB7 token \u4FDD\u62A4\u3002\u8F93\u5165 `/dashboard stop` \u5173\u95ED\u3002",
2159
+ failed: "\u25B8 \u4EEA\u8868\u677F\u542F\u52A8\u5931\u8D25\uFF1A{reason}",
2160
+ starting: "\u25B8 \u6B63\u5728\u542F\u52A8\u4EEA\u8868\u677F\u670D\u52A1\u5668\u2026"
2161
+ },
2162
+ observability: {
2163
+ contextInfo: "\u4E0A\u4E0B\u6587\uFF1A~{total} / {max}\uFF08{pct}%\uFF09\xB7 \u7CFB\u7EDF {sys} \xB7 \u5DE5\u5177 {tools} \xB7 \u65E5\u5FD7 {log}",
2164
+ compactStarting: "\u25B8 \u6B63\u5728\u6298\u53E0\u65E7\u8F6E\u6B21\u4E3A\u6458\u8981\u2026",
2165
+ compactNoop: "\u25B8 \u65E0\u9700\u6298\u53E0 \u2014 \u65E5\u5FD7\u5DF2\u8DB3\u591F\u5C0F\uFF0C\u6216\u6700\u8FD1\u8F6E\u6B21\u672C\u8EAB\u5DF2\u8D85\u8FC7\u9884\u7B97\u3002",
2166
+ compactDone: "\u25B8 \u5DF2\u6298\u53E0 {before} \u6761\u6D88\u606F \u2192 {after}\uFF08\u6458\u8981 {chars} \u5B57\u7B26\uFF09\u3002\u7EE7\u7EED\u3002",
2167
+ compactFailed: "\u25B8 \u6298\u53E0\u5931\u8D25\uFF1A{reason}",
2168
+ costNoTurn: "\u5C1A\u65E0\u8F6E\u6B21 \u2014 `/cost` \u663E\u793A\u6700\u8FD1\u4E00\u8F6E\u7684 token + \u82B1\u8D39\u660E\u7EC6\u3002",
2169
+ costNeedsTui: "/cost \u9700\u8981 TUI \u4E0A\u4E0B\u6587\uFF08postUsage \u5DF2\u8FDE\u63A5\uFF09\u3002",
2170
+ costNoPricing: '\u25B8 /cost\uFF1A\u6A21\u578B "{model}" \u65E0\u5B9A\u4EF7\u8868\u3002\u8BF7\u5728 telemetry/stats.ts \u4E2D\u6DFB\u52A0\u3002',
2171
+ costEstimate: "\u25B8 /cost \u4F30\u7B97 \xB7 {model} \xB7 {prompt} prompt tokens\uFF08\u7CFB\u7EDF {sys} + \u5DE5\u5177 {tools} + \u65E5\u5FD7 {log} + \u6D88\u606F {msg}\uFF09",
2172
+ costWorstCase: " \u6700\u574F\u60C5\u51B5\uFF08\u5B8C\u5168\u672A\u547D\u4E2D\uFF09\uFF1A{input} \u8F93\u5165 + ~{output} \u8F93\u51FA\uFF08{avg} \u5E73\u5747\uFF09\u2248 {total}",
2173
+ costLikely: " \u53EF\u80FD\uFF08{pct}% \u4F1A\u8BDD\u7F13\u5B58\u547D\u4E2D\uFF09\uFF1A{input} \u8F93\u5165 + ~{output} \u8F93\u51FA \u2248 {total}",
2174
+ costLikelyCold: " \u53EF\u80FD\uFF1A\u5728\u7F13\u5B58\u586B\u5145\u524D\u4E0E\u6700\u574F\u60C5\u51B5\u76F8\u540C\uFF08\u65E0\u5DF2\u5B8C\u6210\u7684\u8F6E\u6B21\uFF09",
2175
+ statusModel: " \u6A21\u578B {model}",
2176
+ statusFlags: " \u6807\u5FD7 stream={stream} \xB7 effort={effort}",
2177
+ statusCtx: " \u4E0A\u4E0B\u6587 {bar} {used}/{max}\uFF08{pct}%\uFF09",
2178
+ statusCtxNone: " \u4E0A\u4E0B\u6587 \u5C1A\u65E0\u8F6E\u6B21",
2179
+ statusCost: " \u6210\u672C ${cost} \xB7 \u7F13\u5B58 {bar} {pct}% \xB7 \u8F6E\u6B21 {turns}",
2180
+ statusCostCold: " \u6210\u672C ${cost} \xB7 \u8F6E\u6B21 {turns}\uFF08\u7F13\u5B58\u9884\u70ED\u4E2D\uFF09",
2181
+ statusBudget: " \u9884\u7B97 ${spent} / ${cap}\uFF08{pct}%\uFF09{tag}",
2182
+ statusSession: ' \u4F1A\u8BDD "{name}" \xB7 \u65E5\u5FD7\u4E2D {count} \u6761\u6D88\u606F\uFF08\u6062\u590D\u4E86 {resumed} \u6761\uFF09',
2183
+ statusSessionEphemeral: " \u4F1A\u8BDD \uFF08\u4E34\u65F6 \u2014 \u65E0\u6301\u4E45\u5316\uFF09",
2184
+ statusWorkspace: " \u5DE5\u4F5C\u533A {path} \xB7 \u542F\u52A8\u65F6\u9501\u5B9A\uFF08\u7528 --dir <path> \u91CD\u65B0\u542F\u52A8\u4EE5\u5207\u6362\uFF09",
2185
+ statusMcp: " MCP {servers} \u4E2A\u670D\u52A1\u5668\uFF0C\u6CE8\u518C\u8868\u4E2D {tools} \u4E2A\u5DE5\u5177",
2186
+ statusEdits: " \u7F16\u8F91 {count} \u4E2A\u5F85\u5904\u7406\uFF08/apply \u63D0\u4EA4\uFF0C/discard \u4E22\u5F03\uFF09",
2187
+ statusPlan: " \u8BA1\u5212 \u5F00\u542F \u2014 \u5199\u5165\u53D7\u9650\uFF08submit_plan + \u5BA1\u6279\uFF09",
2188
+ statusModeYolo: " \u6A21\u5F0F YOLO \u2014 \u7F16\u8F91 + shell \u81EA\u52A8\u8FD0\u884C\uFF0C\u65E0\u63D0\u793A\uFF08/undo \u4ECD\u53EF\u56DE\u6EDA \xB7 Shift+Tab \u5207\u6362\uFF09",
2189
+ statusModeAuto: " \u6A21\u5F0F AUTO \u2014 \u7F16\u8F91\u7ACB\u5373\u5E94\u7528\uFF085 \u79D2\u5185\u6309 u \u64A4\u6D88 \xB7 Shift+Tab \u5207\u6362\uFF09",
2190
+ statusModeReview: " \u6A21\u5F0F review \u2014 \u7F16\u8F91\u6392\u961F\u7B49\u5F85 /apply \u6216 y\uFF08Shift+Tab \u5207\u6362\uFF09",
2191
+ statusDash: " \u4EEA\u8868\u677F {url}\uFF08\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00 \xB7 /dashboard stop\uFF09"
2192
+ },
2193
+ plans: {
2194
+ noSession: "\u672A\u9644\u52A0\u4F1A\u8BDD \u2014 `/plans` \u662F\u6309\u4F1A\u8BDD\u7684\u3002\u5728\u9879\u76EE\u4E2D\u8FD0\u884C `luckerr code` \u4EE5\u83B7\u53D6\u4F1A\u8BDD\u3002",
2195
+ activePlan: "\u25B8 \u6D3B\u8DC3\u8BA1\u5212{label} \u2014 {done}/{total} \u6B65\u9AA4\u5DF2\u5B8C\u6210 \xB7 \u6700\u540E\u89E6\u53CA {when}",
2196
+ activeNone: "\u25B8 \u6D3B\u8DC3\u8BA1\u5212\uFF1A\uFF08\u65E0\uFF09",
2197
+ noArchives: "\u6B64\u4F1A\u8BDD\u5C1A\u65E0\u5F52\u6863\u8BA1\u5212 \u2014 \u5F53\u6BCF\u4E2A\u6B65\u9AA4\u5B8C\u6210\u65F6\u81EA\u52A8\u5F52\u6863",
2198
+ archivedHeader: "\u5DF2\u5F52\u6863\uFF08{count}\uFF09\uFF1A",
2199
+ replayNoSession: "\u672A\u9644\u52A0\u4F1A\u8BDD \u2014 `/replay` \u662F\u6309\u4F1A\u8BDD\u7684\u3002\u5728\u9879\u76EE\u4E2D\u8FD0\u884C `luckerr code` \u4EE5\u83B7\u53D6\u4F1A\u8BDD\u3002",
2200
+ replayNoArchives: "\u6B64\u4F1A\u8BDD\u5C1A\u65E0\u5F52\u6863\u8BA1\u5212 \u2014 `/replay` \u5728\u8BA1\u5212\u5B8C\u6210\u540E\u542F\u7528\uFF08\u6BCF\u4E2A\u6B65\u9AA4\u5B8C\u6210\u65F6\u81EA\u52A8\u5F52\u6863\uFF09\u3002",
2201
+ replayInvalidIndex: "\u65E0\u6548\u7D22\u5F15 \u2014 `/replay` \u63A5\u53D7 1..{max}\uFF08\u6700\u65B0 = 1\uFF09\u3002\u4F7F\u7528 `/plans` \u67E5\u770B\u5217\u8868\u3002",
2202
+ archivedRow: " \u2713 {when} {total}\u6B65 \xB7 {completion} {label}",
2203
+ completionComplete: "\u5DF2\u5B8C\u6210",
2204
+ stopAborted: "\u25B8 \u8BA1\u5212\u5DF2\u505C\u6B62 \u2014 \u6A21\u578B\u5DF2\u4E2D\u6B62\uFF1B\u8F93\u5165\u540E\u7EED\u5185\u5BB9\u7EE7\u7EED\uFF0C\u6216\u5F00\u59CB\u65B0\u4EFB\u52A1\u3002",
2205
+ doneUsage: "\u7528\u6CD5\uFF1A/plans done <stepId> \xB7 /plans done all \u2014 \u6A21\u578B\u5FD8\u8BB0\u8C03\u7528 mark_step_complete \u65F6\u7684\u624B\u52A8\u515C\u5E95",
2206
+ doneUnavailable: "/plans done \u4EC5\u5728\u6D3B\u8DC3\u4F1A\u8BDD\u5185\u53EF\u7528\u3002",
2207
+ doneNoPlan: "\u5F53\u524D\u65E0\u6D3B\u8DC3\u8BA1\u5212 \u2014 \u6CA1\u6709\u53EF\u6807\u8BB0\u7684\u5185\u5BB9\u3002",
2208
+ doneNotInPlan: "\u6B65\u9AA4 `{id}` \u4E0D\u5728\u5F53\u524D\u8BA1\u5212\u4E2D\u3002\u8FD0\u884C /plans \u67E5\u770B\u6B65\u9AA4 id\u3002",
2209
+ doneAlready: "\u6B65\u9AA4 `{id}` \u5DF2\u88AB\u6807\u8BB0\u4E3A\u5B8C\u6210\u3002",
2210
+ doneOk: "\u25B8 \u5DF2\u5C06\u6B65\u9AA4 `{id}` \u6807\u8BB0\u4E3A\u5B8C\u6210\u3002",
2211
+ doneAllNoop: "\u6240\u6709\u6B65\u9AA4\u5747\u5DF2\u5B8C\u6210\u3002",
2212
+ doneAllOk: "\u25B8 \u5DF2\u6807\u8BB0 {count} \u4E2A\u6B65\u9AA4\u4E3A\u5B8C\u6210\u3002"
2213
+ },
2214
+ jobs: {
2215
+ codeOnly: "/jobs \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2216
+ killCodeOnly: "/kill \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2217
+ logsCodeOnly: "/logs \u4EC5\u5728 `luckerr code` \u4E2D\u53EF\u7528\u3002",
2218
+ empty: "\u25C8 \u4F5C\u4E1A \xB7 0 \u8FD0\u884C\u4E2D \xB7 \u5171 0 \u4E2A\n \uFF08run_background \u751F\u6210\u4E00\u4E2A \u2014 \u5F00\u53D1\u670D\u52A1\u5668\u3001\u76D1\u89C6\u5668\u3001\u957F\u65F6\u95F4\u8FD0\u884C\u7684\u811A\u672C\uFF09",
2219
+ header: "\u25C8 \u4F5C\u4E1A \xB7 {running} \u8FD0\u884C\u4E2D \xB7 \u5171 {total} \u4E2A",
2220
+ footer: " /logs <id> \u8DDF\u8E2A \xB7 /kill <id> SIGTERM \u2192 SIGKILL",
2221
+ killUsage: "\u7528\u6CD5\uFF1A/kill <id> \uFF08\u89C1 /jobs \u83B7\u53D6 ID\uFF09",
2222
+ killNotFound: "\u4F5C\u4E1A {id}\uFF1A\u672A\u627E\u5230",
2223
+ killAlreadyExited: "\u4F5C\u4E1A {id} \u5DF2\u9000\u51FA\uFF08{code}\uFF09",
2224
+ killStopping: "\u25B8 \u6B63\u5728\u505C\u6B62\u4F5C\u4E1A {id}\uFF08\u6811\u7EC8\u6B62\uFF1ASIGTERM \u2192 2 \u79D2\u5BBD\u9650\u671F\u540E SIGKILL\uFF1BWindows\uFF1Ataskkill /T /F\uFF09",
2225
+ killStatus: "\u25B8 \u4F5C\u4E1A {id} {status}",
2226
+ killStillAlive: "SIGKILL \u540E\u4ECD\u5B58\u6D3B (!) \u2014 \u8BF7\u5C06\u6B64\u4F5C\u4E3A bug \u62A5\u544A",
2227
+ logsUsage: "\u7528\u6CD5\uFF1A/logs <id> [lines] \uFF08\u9ED8\u8BA4\u6700\u540E 80 \u884C\uFF09",
2228
+ logsNotFound: "\u4F5C\u4E1A {id}\uFF1A\u672A\u627E\u5230",
2229
+ logsStatus: "[\u4F5C\u4E1A {id} \xB7 {status}]\n$ {command}",
2230
+ logsRunning: "\u8FD0\u884C\u4E2D \xB7 pid {pid}",
2231
+ logsExited: "\u5DF2\u9000\u51FA {code}",
2232
+ logsFailed: "\u5931\u8D25\uFF08{reason}\uFF09",
2233
+ logsStopped: "\u5DF2\u505C\u6B62"
2234
+ },
2235
+ memory: {
2236
+ disabled: "\u8BB0\u5FC6\u5DF2\u7981\u7528\uFF08\u73AF\u5883\u53D8\u91CF LUCKERR_MEMORY=off\uFF09\u3002\u53D6\u6D88\u8BBE\u7F6E\u8BE5\u53D8\u91CF\u4EE5\u91CD\u65B0\u542F\u7528 \u2014 \u6B64\u671F\u95F4\u4E0D\u4F1A\u56FA\u5B9A\u4EFB\u4F55 LUCKERR.md \u6216 ~/.luckerr/memory \u5185\u5BB9\u3002",
2237
+ noRoot: "\u6B64\u4F1A\u8BDD\u65E0\u5DE5\u4F5C\u76EE\u5F55 \u2014 `/memory` \u9700\u8981\u4E00\u4E2A\u6839\u76EE\u5F55\u6765\u89E3\u6790 LUCKERR.md\u3002\uFF08\u5728\u6D4B\u8BD5\u73AF\u5883\u4E2D\u8FD0\u884C\uFF1F\uFF09",
2238
+ listEmpty: "\u5C1A\u65E0\u7528\u6237\u8BB0\u5FC6\u3002\u6A21\u578B\u53EF\u4EE5\u8C03\u7528 `remember` \u4FDD\u5B58\u4E00\u4E2A\uFF0C\u6216\u60A8\u53EF\u4EE5\u5728 ~/.luckerr/memory/global/ \u6216\u9879\u76EE\u5B50\u76EE\u5F55\u4E2D\u624B\u52A8\u521B\u5EFA\u6587\u4EF6\u3002",
2239
+ listHeader: "\u7528\u6237\u8BB0\u5FC6\uFF08{count}\uFF09\uFF1A",
2240
+ listFooter: "\u67E5\u770B\u6B63\u6587\uFF1A/memory show <name> \u5220\u9664\uFF1A/memory forget <name>",
2241
+ showUsage: "\u7528\u6CD5\uFF1A/memory show <name> \u6216 /memory show <scope>/<name>",
2242
+ showNotFound: "\u672A\u627E\u5230\u8BB0\u5FC6\uFF1A{target}",
2243
+ showFailed: "\u663E\u793A\u5931\u8D25\uFF1A{reason}",
2244
+ forgetUsage: "\u7528\u6CD5\uFF1A/memory forget <name> \u6216 /memory forget <scope>/<name>",
2245
+ forgetNotFound: "\u672A\u627E\u5230\u8BB0\u5FC6\uFF1A{target}",
2246
+ forgetInfo: "\u25B8 \u5DF2\u9057\u5FD8 {scope}/{name}\u3002\u4E0B\u6B21 /new \u6216\u542F\u52A8\u65F6\u5C06\u4E0D\u53EF\u89C1\u3002",
2247
+ forgetFailed: "\u65E0\u6CD5\u9057\u5FD8 {scope}/{name}\uFF08\u5DF2\u6D88\u5931\uFF1F\uFF09",
2248
+ forgetError: "\u9057\u5FD8\u5931\u8D25\uFF1A{reason}",
2249
+ clearUsage: "\u7528\u6CD5\uFF1A/memory clear <global|project> confirm",
2250
+ clearConfirm: "\u5373\u5C06\u5220\u9664 scope={scope} \u4E2D\u7684\u6BCF\u4E2A\u8BB0\u5FC6\u3002\u91CD\u65B0\u8FD0\u884C\u5E76\u9644\u5E26 'confirm' \u4E00\u8BCD\u4EE5\u7EE7\u7EED\uFF1A/memory clear {scope} confirm",
2251
+ cleared: "\u25B8 \u5DF2\u6E05\u9664 scope={scope} \u2014 \u5220\u9664\u4E86 {count} \u4E2A\u8BB0\u5FC6\u6587\u4EF6\u3002",
2252
+ noMemory: "\u5728 {root} \u4E2D\u672A\u56FA\u5B9A\u8BB0\u5FC6\u3002",
2253
+ layers: "\u53EF\u7528\u7684\u4E09\u4E2A\u5C42\u7EA7\uFF1A",
2254
+ layerProject: " 1. {file} \u2014 \u53EF\u63D0\u4EA4\u7684\u56E2\u961F\u8BB0\u5FC6\uFF08\u5728\u4ED3\u5E93\u4E2D\uFF09\u3002",
2255
+ layerGlobal: " 2. ~/.luckerr/memory/global/ \u2014 \u60A8\u7684\u8DE8\u9879\u76EE\u79C1\u6709\u8BB0\u5FC6\u3002",
2256
+ layerProjectHash: " 3. ~/.luckerr/memory/<project-hash>/ \u2014 \u6B64\u9879\u76EE\u7684\u79C1\u6709\u8BB0\u5FC6\u3002",
2257
+ askModel: "\u8BA9\u6A21\u578B `remember` \u67D0\u4E9B\u5185\u5BB9\uFF0C\u6216\u76F4\u63A5\u624B\u7F16\u8F91\u6587\u4EF6\u3002",
2258
+ changesNote: "\u66F4\u6539\u5728\u4E0B\u6B21 /new \u6216\u542F\u52A8\u65F6\u751F\u6548 \u2014 \u7CFB\u7EDF\u63D0\u793A\u8BCD\u6BCF\u4F1A\u8BDD\u54C8\u5E0C\u4E00\u6B21\u4EE5\u4FDD\u6301\u524D\u7F00\u7F13\u5B58\u70ED\u5EA6\u3002",
2259
+ subcommands: "\u5B50\u547D\u4EE4\uFF1A/memory list | /memory show <name> | /memory forget <name> | /memory clear <scope> confirm",
2260
+ changesNoteShort: "\u66F4\u6539\u5728\u4E0B\u6B21 /new \u6216\u542F\u52A8\u65F6\u751F\u6548\u3002\u5B50\u547D\u4EE4\uFF1A/memory list | show | forget | clear"
2261
+ },
2262
+ mcp: {
2263
+ noServers: '\u672A\u9644\u52A0 MCP \u670D\u52A1\u5668\u3002\u8FD0\u884C `luckerr setup` \u9009\u62E9\u4E00\u4E9B\uFF0C\u6216\u4F7F\u7528 --mcp "<spec>" \u542F\u52A8\u3002`luckerr mcp list` \u663E\u793A\u76EE\u5F55\u3002',
2264
+ toolsLabel: " \u5DE5\u5177 {count}",
2265
+ resourcesHint: "`/resource` \u6D4F\u89C8+\u8BFB\u53D6",
2266
+ promptsHint: "`/prompt` \u6D4F\u89C8+\u83B7\u53D6",
2267
+ awarenessOnly: "\u804A\u5929\u6A21\u5F0F\u76EE\u524D\u6D88\u8017\u5DE5\u5177\uFF1B\u8D44\u6E90+\u63D0\u793A\u5728\u6B64\u5C55\u793A\u4F9B\u4E86\u89E3\u3002",
2268
+ catalogHint: "\u5B8C\u6574\u76EE\u5F55\uFF1A`luckerr mcp list` \xB7 \u6DF1\u5EA6\u8BCA\u65AD\uFF1A`luckerr mcp inspect <spec>`\u3002",
2269
+ fallbackServers: "MCP \u670D\u52A1\u5668\uFF08{count}\uFF09\uFF1A",
2270
+ fallbackTools: "\u6CE8\u518C\u8868\u4E2D\u7684\u5DE5\u5177\uFF08{count}\uFF09\uFF1A",
2271
+ fallbackChange: "\u8981\u66F4\u6539\u6B64\u8BBE\u7F6E\uFF0C\u8BF7\u9000\u51FA\u5E76\u8FD0\u884C `luckerr setup`\u3002",
2272
+ usageDisableEnable: "\u7528\u6CD5\uFF1A/mcp {action} <name> \xB7 \u4ECE /mcp \u5217\u8868\u4E2D\u6311\u4E00\u4E2A\u540D\u5B57\uFF08\u533F\u540D\u670D\u52A1\u5668\u65E0\u6CD5\u6309\u540D\u5207\u6362\uFF09\u3002",
2273
+ usageReconnect: "\u7528\u6CD5\uFF1A/mcp reconnect <name> \xB7 \u4ECE /mcp \u5217\u8868\u4E2D\u6311\u4E00\u4E2A\u540D\u5B57\u3002",
2274
+ unknownServer: '\u672A\u77E5 MCP \u670D\u52A1\u5668 "{name}"\u3002\u5DF2\u77E5\uFF1A{list}\u3002',
2275
+ noneList: "\uFF08\u65E0\uFF09",
2276
+ reconnectNoTui: "/mcp reconnect \u9700\u8981\u4EA4\u4E92\u5F0F TUI\uFF08postInfo \u672A\u8FDE\u63A5\uFF09\u3002",
2277
+ liveTab: "\u5DF2\u8FDE\u63A5",
2278
+ marketplaceTab: "\u5E02\u573A",
2279
+ tabHint: "\u6309 tab \u5207\u6362"
2280
+ },
2281
+ init: {
2282
+ codeOnly: "/init \u4EC5\u5728\u4EE3\u7801\u6A21\u5F0F\u4E0B\u5DE5\u4F5C\uFF08\u9700\u8981\u6587\u4EF6\u7CFB\u7EDF\u5DE5\u5177\uFF09\u3002\n\u8FD0\u884C `luckerr code [path]` \u542F\u52A8\u4E00\u4E2A\u4EE5\u60A8\u8981\u521D\u59CB\u5316\u7684\u9879\u76EE\u4E3A\u6839\u7684\u4F1A\u8BDD\uFF0C\n\u7136\u540E\u8FD0\u884C /init\u3002",
2283
+ exists: "\u25B8 LUCKERR.md \u5DF2\u5B58\u5728\u4E8E {path}",
2284
+ existsForce: " /init force \u4ECE\u5934\u91CD\u65B0\u751F\u6210\uFF08\u8986\u76D6\uFF09",
2285
+ existsEdit: " \u6216\u624B\u52A8\u7F16\u8F91 \u2014 \u5B83\u53EA\u662F markdown\u3002\u5F53\u524D\u6587\u4EF6\u5DF2",
2286
+ existsPinned: " \u56FA\u5B9A\u5230\u6BCF\u6B21\u542F\u52A8\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\u4E2D\u3002",
2287
+ info: "\u25B8 /init \u2014 \u6A21\u578B\u5C06\u626B\u63CF\u9879\u76EE\u5E76\u5408\u6210 LUCKERR.md\u3002\n \u7ED3\u679C\u5C06\u4F5C\u4E3A\u5F85\u5904\u7406\u7684\u7F16\u8F91\uFF1B\u4F7F\u7528 /apply \u6216 /walk \u5BA1\u67E5\u3002"
2288
+ },
2289
+ webSearchEngine: {
2290
+ currentEngine: "\u5F53\u524D\u7F51\u9875\u641C\u7D22\u5F15\u64CE\uFF1A{engine}",
2291
+ endpoint: "SearXNG \u7AEF\u70B9\uFF1A{url}",
2292
+ usageHeader: "\u7528\u6CD5\uFF1A",
2293
+ usageMojeek: " /search-engine mojeek \u4F7F\u7528 Mojeek\uFF08\u9ED8\u8BA4\uFF0C\u65E0\u5916\u90E8\u4F9D\u8D56\uFF09",
2294
+ usageSearxng: " /search-engine searxng \u4F7F\u7528 SearXNG \u9ED8\u8BA4\u7AEF\u70B9",
2295
+ usageSearxngUrl: " /search-engine searxng <url> \u4F7F\u7528 SearXNG \u81EA\u5B9A\u4E49\u7AEF\u70B9",
2296
+ alias: "\u522B\u540D\uFF1A/se",
2297
+ searxngInfo: "SearXNG \u662F\u4E00\u4E2A\u81EA\u6258\u7BA1\u7684\u5143\u641C\u7D22\u5F15\u64CE\uFF08https://github.com/searxng/searxng\uFF09\u3002",
2298
+ searxngInstall: "\u5B89\u88C5\u547D\u4EE4\uFF1A docker run -d -p 8080:8080 searxng/searxng",
2299
+ switched: '\u5DF2\u5207\u6362\u7F51\u9875\u641C\u7D22\u5F15\u64CE\u4E3A "{engine}"\u3002{note}',
2300
+ switchedSearxngNote: " \u8BF7\u786E\u4FDD SearXNG \u5728 {endpoint} \u8FD0\u884C\u3002",
2301
+ confirmed: '\u2713 \u7F51\u9875\u641C\u7D22\u5F15\u64CE\u5DF2\u8BBE\u4E3A "{engine}"{detail}\u3002\u4E0B\u4E00\u8F6E\u6A21\u578B\u8C03\u7528\u5C06\u751F\u6548\u3002',
2302
+ confirmedDetail: "\uFF08{endpoint}\uFF09"
2303
+ },
2304
+ skill: {
2305
+ listEmpty: "\u672A\u627E\u5230\u6280\u80FD\u3002Luckerr \u4ECE\u4EE5\u4E0B\u4F4D\u7F6E\u8BFB\u53D6\u6280\u80FD\uFF1A",
2306
+ listProjectScope: " \xB7 <project>/.luckerr/skills/<name>/SKILL.md \uFF08\u6216 <name>.md\uFF09 \u2014 \u9879\u76EE\u8303\u56F4",
2307
+ listGlobalScope: " \xB7 ~/.luckerr/skills/<name>/SKILL.md \uFF08\u6216 <name>.md\uFF09 \u2014 \u5168\u5C40\u8303\u56F4",
2308
+ listProjectOnly: " \uFF08\u9879\u76EE\u8303\u56F4\u4EC5\u5728 `luckerr code` \u4E2D\u6D3B\u8DC3\uFF09",
2309
+ listFrontmatter: "\u6BCF\u4E2A\u6587\u4EF6\u7684 frontmatter \u81F3\u5C11\u9700\u8981 `name` \u548C `description`\u3002",
2310
+ listInvoke: "\u4F7F\u7528 `/skill <name> [args]` \u8C03\u7528\u6280\u80FD\uFF0C\u6216\u8BA9\u6A21\u578B\u8C03\u7528 `run_skill`\u3002",
2311
+ listHeader: "\u7528\u6237\u6280\u80FD\uFF08{count}\uFF09\uFF1A",
2312
+ listFooter: "\u67E5\u770B\uFF1A/skill show <name> \u8FD0\u884C\uFF1A/skill <name> [args] \u65B0\u5EFA\uFF1A/skill new <name>",
2313
+ listEmptyNewHint: "\u7528 `/skill new <name>` \u5728\u9879\u76EE\u8303\u56F4\u4E0B\u751F\u6210\u4E00\u4E2A\u7A7A\u767D\u6A21\u677F \u2014 \u6682\u65E0\u5728\u7EBF\u5E02\u573A\uFF0C\u6280\u80FD\u9700\u8981\u81EA\u5DF1\u5199\u3002",
2314
+ showUsage: "\u7528\u6CD5\uFF1A/skill show <name>",
2315
+ showNotFound: "\u672A\u627E\u5230\u6280\u80FD\uFF1A{name}",
2316
+ runNotFound: "\u672A\u627E\u5230\u6280\u80FD\uFF1A{name} \uFF08\u5C1D\u8BD5 /skill list\uFF09",
2317
+ runInfo: "\u25B8 \u6B63\u5728\u8FD0\u884C\u6280\u80FD\uFF1A{name}{args}",
2318
+ newUsage: "\u7528\u6CD5\uFF1A/skill new <name> [--global]",
2319
+ newCreated: "\u25B8 \u5DF2\u521B\u5EFA\u6280\u80FD\uFF1A{name}\n {path}\n \u7F16\u8F91\u540E\u7528 `/skill {name}` \u8C03\u7528",
2320
+ newError: "\u25B2 /skill new \u5931\u8D25\uFF1A{reason}"
2321
+ }
2322
+ },
2323
+ statusBar: {
2324
+ turn: "\u8F6E",
2325
+ cache: "\u7F13\u5B58",
2326
+ spent: "\u5DF2\u82B1\u8D39",
2327
+ left: " \u5269\u4F59",
2328
+ slow: "\u6162\u901F",
2329
+ disconnect: "\u65AD\u5F00",
2330
+ reconnecting: "\u91CD\u8FDE\u4E2D\u2026",
2331
+ approvingIn: "\u5373\u5C06\u6279\u51C6\uFF0C",
2332
+ escToInterrupt: "\u79D2 \xB7 Esc \u4E2D\u65AD",
2333
+ recordingGlyph: "\u25CFREC",
2334
+ mb: " MB",
2335
+ evt: " \u4E8B\u4EF6",
2336
+ editsLabel: "\u7F16\u8F91:",
2337
+ mcpLoading: "MCP"
2338
+ },
2339
+ editMode: {
2340
+ plan: "\u8BA1\u5212",
2341
+ yolo: "\u81EA\u7531",
2342
+ auto: "\u81EA\u52A8",
2343
+ review: "\u5BA1\u67E5",
2344
+ writesGated: " \u5DF2\u9650\u5236\u5199\u5165 \xB7 /plan off \u89E3\u9664",
2345
+ editsShellAuto: "\u7F16\u8F91 + Shell \u81EA\u52A8 \xB7 /undo \u53EF\u56DE\u6EDA",
2346
+ editsLandNow: "\u7F16\u8F91\u5DF2\u751F\u6548 \xB7 \u6309 u \u64A4\u6D88",
2347
+ queuedApplyDiscard: "{count} \u4E2A\u5F85\u5904\u7406 \xB7 y \u5E94\u7528 \xB7 n \u4E22\u5F03",
2348
+ editsQueued: "\u7F16\u8F91\u5DF2\u6392\u961F \xB7 y \u5E94\u7528 \xB7 n \u4E22\u5F03",
2349
+ shiftTabFlip: " {mid} \xB7 Shift+Tab \u5207\u6362",
2350
+ queuedDots: "\u6392\u961F\u4E2D\u2026"
2351
+ },
2352
+ composer: {
2353
+ placeholder: "\u8F93\u5165\u4EFB\u4F55\u5185\u5BB9 \xB7 / \u4F7F\u7528\u547D\u4EE4 \xB7 @ \u5F15\u7528\u6587\u4EF6",
2354
+ waitingForResponse: "\u2026\u7B49\u5F85\u54CD\u5E94\u2026",
2355
+ hintSend: "\u53D1\u9001",
2356
+ hintNewline: "\u6362\u884C",
2357
+ hintClear: "\u6E05\u7A7A",
2358
+ hintScroll: "\u6EDA\u52A8",
2359
+ hintHistory: "\u5386\u53F2",
2360
+ hintAbort: "\u4E2D\u6B62",
2361
+ hintQuit: "\u9000\u51FA",
2362
+ abortedHint: "\u7528\u6237\u5DF2\u4E2D\u6B62\u672C\u8F6E \xB7 \u518D\u6309 Esc \u6E05\u9664 \xB7 \u23CE \u7EE7\u7EED\u63D0\u95EE",
2363
+ editorNoRawMode: "\u5916\u90E8\u7F16\u8F91\u5668\u4E0D\u53EF\u7528 \u2014 \u5F53\u524D\u7EC8\u7AEF\u4E0D\u652F\u6301 raw-mode \u5207\u6362",
2364
+ editorFailed: "\u5916\u90E8\u7F16\u8F91\u5668\uFF1A",
2365
+ editorMissing: "\u672A\u8BBE\u7F6E $EDITOR / $VISUAL / $GIT_EDITOR \u2014 \u8BF7\u5BFC\u51FA\u73AF\u5883\u53D8\u91CF\uFF08\u4F8B\u5982 `export EDITOR=nano`\uFF09\u540E\u91CD\u8BD5",
2366
+ editorExited: "\u7F16\u8F91\u5668\u5F02\u5E38\u9000\u51FA\uFF0C\u8FD4\u56DE\u7801 {code}"
2367
+ },
2368
+ pathConfirm: {
2369
+ title: "\u6C99\u7BB1\u5916\u8DEF\u5F84",
2370
+ subtitleRead: "{tool} \u60F3\u8981\u8BFB\u53D6\u6C99\u7BB1\u5916\u7684\u6587\u4EF6",
2371
+ subtitleWrite: "{tool} \u60F3\u8981\u5199\u5165\u6C99\u7BB1\u5916\u7684\u6587\u4EF6",
2372
+ awaiting: "\u7B49\u5F85\u4E2D",
2373
+ denyTitle: "\u62D2\u7EDD \u2014 \u63D0\u4F9B\u539F\u56E0",
2374
+ optional: "\u53EF\u9009",
2375
+ denyFooter: "\u8F93\u5165\u539F\u56E0 \xB7 \u23CE \u63D0\u4EA4 \xB7 Esc \u8DF3\u8FC7\uFF08\u76F4\u63A5\u62D2\u7EDD\uFF09",
2376
+ pickFooter: "\u2191\u2193 \u9009\u62E9 \xB7 \u23CE \u786E\u8BA4 \xB7 Tab \u6DFB\u52A0\u8BF4\u660E \xB7 Esc \u53D6\u6D88",
2377
+ allowOnce: "\u5141\u8BB8\u4E00\u6B21",
2378
+ allowOnceDesc: "\u672C\u6B21\u5141\u8BB8\uFF0C\u672C\u4F1A\u8BDD\u5185\u6B64\u76EE\u5F55\u4E0D\u518D\u8BE2\u95EE",
2379
+ allowAlways: "\u59CB\u7EC8\u5141\u8BB8",
2380
+ allowAlwaysDesc: "\u8BB0\u4F4F `{prefix}`\uFF0C\u672C\u9879\u76EE\u6C38\u4E45\u5141\u8BB8\uFF08\u5199\u5165 ~/.luckerr/config.json\uFF09",
2381
+ deny: "\u62D2\u7EDD",
2382
+ denyDesc: "\u6309 Tab \u6DFB\u52A0\u8BF4\u660E\uFF0C\u544A\u8BC9\u6A21\u578B\u539F\u56E0",
2383
+ pathLabel: "\u8DEF\u5F84",
2384
+ sandboxLabel: "\u6C99\u7BB1",
2385
+ allowPrefixLabel: "\u524D\u7F00"
2386
+ },
2387
+ shellConfirm: {
2388
+ title: "Shell \u547D\u4EE4",
2389
+ bgTitle: "\u540E\u53F0\u8FDB\u7A0B",
2390
+ subtitle: "\u6A21\u578B\u8BF7\u6C42\u6267\u884C Shell \u547D\u4EE4",
2391
+ bgSubtitle: "\u957F\u65F6\u95F4\u8FD0\u884C \u2014 \u6279\u51C6\u540E\u6301\u7EED\u8FD0\u884C\uFF0C/kill \u53EF\u505C\u6B62",
2392
+ denyTitle: "\u62D2\u7EDD \u2014 \u63D0\u4F9B\u539F\u56E0",
2393
+ optional: "\u53EF\u9009",
2394
+ denyFooter: "\u8F93\u5165\u539F\u56E0 \xB7 \u23CE \u63D0\u4EA4 \xB7 Esc \u8DF3\u8FC7\uFF08\u76F4\u63A5\u62D2\u7EDD\uFF09",
2395
+ awaiting: "\u7B49\u5F85\u4E2D",
2396
+ pickFooter: "\u2191\u2193 \u9009\u62E9 \xB7 \u23CE \u786E\u8BA4 \xB7 Tab \u6DFB\u52A0\u8BF4\u660E \xB7 Esc \u53D6\u6D88",
2397
+ allowOnce: "\u5141\u8BB8\u4E00\u6B21",
2398
+ allowOnceDesc: "\u6267\u884C\u6B64\u547D\u4EE4\uFF0C\u4E0B\u6B21\u518D\u95EE",
2399
+ allowAlways: "\u59CB\u7EC8\u5141\u8BB8",
2400
+ allowAlwaysDesc: "\u8BB0\u4F4F `{prefix}`\uFF0C\u672C\u9879\u76EE\u5185\u4E0D\u518D\u8BE2\u95EE",
2401
+ deny: "\u62D2\u7EDD",
2402
+ denyDesc: "\u6309 Tab \u6DFB\u52A0\u8BF4\u660E\uFF0C\u544A\u8BC9\u6A21\u578B\u539F\u56E0",
2403
+ cwdLabel: "\u5DE5\u4F5C\u76EE\u5F55",
2404
+ timeoutLabel: "\u8D85\u65F6",
2405
+ waitLabel: "\u7B49\u5F85",
2406
+ previewMore: "\u2026 \u8FD8\u6709 {n} \u884C\u672A\u663E\u793A \u2014 \u6309 esc \u53D6\u6D88\uFF0C\u8BA9\u6A21\u578B\u62C6\u5206\u540E\u518D\u8BD5",
2407
+ previewMorePlural: "\u2026 \u8FD8\u6709 {n} \u884C\u672A\u663E\u793A \u2014 \u6309 esc \u53D6\u6D88\uFF0C\u8BA9\u6A21\u578B\u62C6\u5206\u540E\u518D\u8BD5"
2408
+ },
2409
+ editConfirm: {
2410
+ footer: "[y/Enter] \u5E94\u7528 \xB7 [n] \u62D2\u7EDD\u5E76\u8BF4\u660E \xB7 [a] \u5E94\u7528\u5269\u4F59 \xB7 [A] \u5207\u6362 AUTO \xB7 [\u2191\u2193/Space] \u6EDA\u52A8 \xB7 [Esc] \u4E2D\u6B62",
2411
+ newTag: "\u65B0\u589E",
2412
+ editTag: "\u7F16\u8F91",
2413
+ linesCount: "-{removed} +{added} \u884C",
2414
+ viewingRange: "\u6B63\u5728\u67E5\u770B {start}-{end}/{total}",
2415
+ denyFooter: "\u23CE \u63D0\u4EA4 \xB7 Esc \u8DF3\u8FC7\uFF08\u76F4\u63A5\u62D2\u7EDD\uFF09",
2416
+ oldLabel: " \u65E7\u5185\u5BB9",
2417
+ newLabel: " \u65B0\u5185\u5BB9",
2418
+ sideBySide: " \u5DE6\u53F3\u5BF9\u6BD4 \xB7 \u5DE6\u4FA7\u5220\u9664\uFF0C\u53F3\u4FA7\u65B0\u589E \xB7 \u6309\u504F\u79FB\u914D\u5BF9",
2419
+ linesAbove: " \u2191 \u4E0A\u65B9 {count} \u884C\uFF08\u2191/k \u6216 PgUp\uFF09",
2420
+ linesAbovePlural: " \u2191 \u4E0A\u65B9 {count} \u884C\uFF08\u2191/k \u6216 PgUp\uFF09",
2421
+ linesBelow: " \u2193 \u4E0B\u65B9 {count} \u884C\uFF08\u2193/j \u6216 Space/PgDn\uFF09",
2422
+ linesBelowPlural: " \u2193 \u4E0B\u65B9 {count} \u884C\uFF08\u2193/j \u6216 Space/PgDn\uFF09"
2423
+ },
2424
+ sessionPicker: {
2425
+ header: " \u25C8 LUCKERR \xB7 \u9009\u62E9\u4F1A\u8BDD ",
2426
+ title: "\u9009\u62E9\u4F1A\u8BDD \u2014 {workspace}",
2427
+ messages: "{count} \u6761\u6D88\u606F",
2428
+ messagesPlural: "{count} \u6761\u6D88\u606F",
2429
+ turns: "{count} \u8F6E",
2430
+ pickerHint: "\u2191\u2193 \u9009\u62E9 \xB7 \u23CE \u6253\u5F00 \xB7 [n] \u65B0\u5EFA \xB7 [d] \u5220\u9664 \xB7 [r] \u91CD\u547D\u540D \xB7 Esc \u9000\u51FA",
2431
+ empty: " \u6B64\u5DE5\u4F5C\u533A\u6682\u65E0\u5DF2\u4FDD\u5B58\u7684\u4F1A\u8BDD \u2014 \u6309 ",
2432
+ emptyNew: " \u5F00\u59CB\u65B0\u4F1A\u8BDD",
2433
+ renamePrompt: ' \u91CD\u547D\u540D "{from}" \u2192 ',
2434
+ renameHint: " \u23CE \u786E\u8BA4\u91CD\u547D\u540D \xB7 Esc \u53D6\u6D88",
2435
+ emptyHint: " \u23CE \u65B0\u5EFA\u4F1A\u8BDD \xB7 Esc \u9000\u51FA",
2436
+ justNow: "\u521A\u521A",
2437
+ minAgo: "{count} \u5206\u949F\u524D",
2438
+ yesterday: "\u6628\u5929",
2439
+ hoursAgo: "{count} \u5C0F\u65F6\u524D",
2440
+ daysAgo: "{count} \u5929\u524D"
2441
+ },
2442
+ modelPicker: {
2443
+ header: " \u25C8 LUCKERR \xB7 \u9009\u62E9\u914D\u7F6E ",
2444
+ loading: " \xB7 \u52A0\u8F7D\u76EE\u5F55\u2026",
2445
+ catalogEmpty: " \xB7 \u76EE\u5F55\u4E3A\u7A7A \u2014 \u4F7F\u7528\u5DF2\u77E5\u5907\u9009",
2446
+ modelsAvailable: " \xB7 {count} \u4E2A\u6A21\u578B\u53EF\u7528",
2447
+ presetsHeader: " \u9884\u8BBE \xB7 \u63A8\u8350 \u2014 \u6A21\u578B + \u5F3A\u5EA6 + \u81EA\u52A8\u5347\u7EA7",
2448
+ modelsHeader: " \u6A21\u578B \xB7 \u76F4\u63A5\u9009\u62E9 \u2014 \u81EA\u52A8\u5347\u7EA7\u4FDD\u6301\u4E0D\u53D8",
2449
+ pickerFooter: " \u2191\u2193 \u9009\u62E9 \xB7 \u23CE \u786E\u8BA4 \xB7 [r] \u5237\u65B0 \xB7 Esc \u53D6\u6D88",
2450
+ currentLabel: " \xB7 \u5F53\u524D"
2451
+ },
2452
+ slashSuggestions: {
2453
+ noMatch: "\u6CA1\u6709\u5339\u914D\u6B64\u524D\u7F00\u7684\u659C\u6760\u547D\u4EE4",
2454
+ backspaceHint: " \u2014 \u6309 Backspace \u4FEE\u6539\uFF0C\u6216 /help \u67E5\u770B\u5B8C\u6574\u5217\u8868",
2455
+ commandCount: "{count} \u4E2A\u547D\u4EE4",
2456
+ commandCountPlural: "{count} \u4E2A\u547D\u4EE4",
2457
+ aboveLabel: " \u2191 {count} \u4E2A\u4EE5\u4E0A",
2458
+ belowLabel: " \u2193 {count} \u4E2A\u4EE5\u4E0B",
2459
+ advancedHint: " + {count} \u4E2A\u9AD8\u7EA7\u547D\u4EE4 \xB7 \u8F93\u5165\u5B57\u6BCD\u641C\u7D22",
2460
+ footerHint: " \u2191\u2193 \u5BFC\u822A \xB7 Tab / \u23CE \u9009\u62E9 \xB7 Esc \u53D6\u6D88",
2461
+ groupChat: "\u804A\u5929",
2462
+ groupSetup: "\u8BBE\u7F6E",
2463
+ groupInfo: "\u4FE1\u606F",
2464
+ groupSession: "\u4F1A\u8BDD",
2465
+ groupExtend: "\u6269\u5C55",
2466
+ groupCode: "\u4EE3\u7801",
2467
+ groupJobs: "\u4EFB\u52A1",
2468
+ groupAdvanced: "\u9AD8\u7EA7",
2469
+ groupDetailSetup: "\u6A21\u578B + \u6210\u672C",
2470
+ groupDetailInfo: "\u5F53\u524D\u72B6\u6001",
2471
+ groupDetailChat: "\u65E5\u5E38\u804A\u5929\u64CD\u4F5C",
2472
+ groupDetailExtend: "MCP, \u8BB0\u5FC6, \u6280\u80FD",
2473
+ groupDetailSession: "\u5DF2\u4FDD\u5B58\u7684\u4F1A\u8BDD",
2474
+ groupDetailCode: "\u7F16\u8F91 + \u8BA1\u5212 (\u4EE3\u7801\u6A21\u5F0F)",
2475
+ groupDetailJobs: "\u540E\u53F0\u8FDB\u7A0B (\u4EE3\u7801\u6A21\u5F0F)",
2476
+ groupDetailAdvanced: "\u9AD8\u7EA7\u6216\u4E00\u6B21\u6027\u8BBE\u7F6E"
2477
+ },
2478
+ atMentions: {
2479
+ loading: "\u52A0\u8F7D\u4E2D\u2026",
2480
+ entrySingular: "{count} \u6761",
2481
+ entryPlural: "{count} \u6761",
2482
+ searching: "\u641C\u7D22\u4E2D\u2026",
2483
+ scanned: "\u5DF2\u626B\u63CF",
2484
+ match: "\u4E2A\u5339\u914D",
2485
+ matches: "\u4E2A\u5339\u914D",
2486
+ forFilter: '\u5339\u914D "{filter}"',
2487
+ noMatch: '\u6CA1\u6709\u5339\u914D "{filter}" \u7684\u6587\u4EF6',
2488
+ emptyDir: "\u7A7A\u76EE\u5F55",
2489
+ scanning: "\u6B63\u5728\u626B\u63CF\u76EE\u5F55\u6811\u2026",
2490
+ footerBrowse: "\u2191\u2193 \u5BFC\u822A \xB7 Tab \u8FDB\u5165\u6587\u4EF6\u5939 \xB7 \u23CE \u63D2\u5165 \xB7 Esc \u53D6\u6D88",
2491
+ footerBrowseSearch: "\u2191\u2193 \u5BFC\u822A \xB7 Tab / \u23CE \u4EE5 @path \u63D2\u5165 \xB7 Esc \u53D6\u6D88",
2492
+ footerInsert: "\u2191\u2193 \u5BFC\u822A \xB7 Tab / \u23CE \u4EE5 @path \u63D2\u5165 \xB7 Esc \u53D6\u6D88"
2493
+ },
2494
+ statsPanel: {
2495
+ modePlan: "\u8BA1\u5212",
2496
+ modeYolo: "\u81EA\u7531",
2497
+ modeAuto: "\u81EA\u52A8",
2498
+ modeReview: "\u5BA1\u67E5",
2499
+ pro: "\u21E7 \u4E13\u4E1A",
2500
+ budget: " \u9884\u7B97 "
2501
+ },
2502
+ welcomeBanner: {
2503
+ workspace: "\u25B8 \u5DE5\u4F5C\u533A",
2504
+ relaunchHint: "\uFF08\u91CD\u542F\u65F6\u7528 --dir <path> \u5207\u6362\uFF09",
2505
+ dashboard: "\u25B8 \u7F51\u9875"
2506
+ },
2507
+ ctxBreakdown: {
2508
+ title: "\u25A3 \u4E0A\u4E0B\u6587",
2509
+ compactHint: " /compact \u6298\u53E0\uFF08\u8D85\u8FC7 50% \u81EA\u52A8\u89E6\u53D1\uFF09\xB7 /new \u6E05\u7A7A\u65E5\u5FD7",
2510
+ topTools: " \u5E38\u7528\u5DE5\u5177\uFF08\u6309\u6210\u672C\u6392\u5E8F\uFF0C{count} \u4E2A\uFF09\uFF1A",
2511
+ msg: "\u6761",
2512
+ turnLabel: "\u8F6E"
2513
+ },
2514
+ startup: {
2515
+ codeRooted: '\u25B8 luckerr code\uFF1A\u6839\u76EE\u5F55 {rootDir}\uFF0C\u4F1A\u8BDD "{session}" \xB7 {tools} \u4E2A\u539F\u751F\u5DE5\u5177{semantic}',
2516
+ ephemeral: "\uFF08\u4E34\u65F6\uFF09",
2517
+ semanticOn: " \xB7 \u8BED\u4E49\u641C\u7D22\u5DF2\u5F00\u542F"
2518
+ },
2519
+ doctorErrors: {
2520
+ unreadable: "{path} \u65E0\u6CD5\u8BFB\u53D6 \u2014 {message}",
2521
+ cannotList: "\u65E0\u6CD5\u5217\u51FA \u2014 {message}",
2522
+ parseFailed: "\u65E0\u6CD5\u89E3\u6790 settings.json \u2014 {message}",
2523
+ probeFailed: "\u63A2\u6D4B\u5931\u8D25 \u2014 {message}"
2524
+ },
2525
+ webErrors: {
2526
+ status: "web_search {status} \u2014 try: \u641C\u7D22\u540E\u7AEF\u8FD4\u56DE\u9519\u8BEF\uFF1B\u8BF7\u6539\u5199\u67E5\u8BE2\uFF0C\u6216\u4F7F\u7528 /search-engine mojeek|searxng \u5207\u6362\u5F15\u64CE",
2527
+ rateLimit429: "web_search 429 \u2014 try: \u7B49\u5F85 10 \u79D2\u540E\u91CD\u8BD5\uFF0C\u6216\u6539\u5199\u67E5\u8BE2\uFF1B\u641C\u7D22\u540E\u7AEF\u6B63\u5728\u5BF9\u8BE5\u5BA2\u6237\u7AEF\u8FDB\u884C\u9650\u6D41",
2528
+ forbidden403: "web_search 403 \u2014 try: \u641C\u7D22\u540E\u7AEF\u62D2\u7EDD\u8BE5\u5BA2\u6237\u7AEF\u8BBF\u95EE\uFF1B\u4F7F\u7528 /search-engine mojeek|searxng \u5207\u6362\u5F15\u64CE\uFF0C\u6216\u7A0D\u540E\u91CD\u8BD5",
2529
+ serverError5xx: "web_search {status} \u2014 try: \u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u641C\u7D22 URL\uFF1B\u82E5\u80FD\u52A0\u8F7D\u5219\u5C5E\u4E34\u65F6\u6545\u969C\uFF0C\u7B49 30 \u79D2\u91CD\u8BD5\u5373\u53EF",
2530
+ mojeekBlocked: "web_search: Mojeek \u53CD\u722C\u9875\u9762 \u2014 \u9891\u7387\u9650\u5236\u6216\u88AB\u5C4F\u853D \u2014 try: \u7B49\u5F85 30 \u79D2\u540E\u91CD\u8BD5\uFF0C\u6216\u4F7F\u7528 /search-engine searxng \u5207\u6362\u5F15\u64CE",
2531
+ mojeekNoResults: "web_search: \u8FD4\u56DE 0 \u6761\u7ED3\u679C\u4F46\u54CD\u5E94\u770B\u8D77\u6765\u4E0D\u662F\u6B63\u5E38\u7A7A\u7ED3\u679C\u9875\uFF08{chars} \u5B57\u7B26\uFF0C\u524D 120 \u5B57\u7B26\uFF1A{preview}\uFF09\u2014 try: \u4F7F\u7528\u66F4\u7B80\u5355\u7684\u5173\u952E\u8BCD\u6539\u5199\u67E5\u8BE2\uFF0C\u6216\u4F7F\u7528 /search-engine searxng \u5207\u6362\u5F15\u64CE",
2532
+ invalidEndpoint: 'web_search: \u65E0\u6548\u7684 SearXNG \u7AEF\u70B9 "{endpoint}" \u2014 try: \u4F7F\u7528 /search-endpoint http://host:port \u8BBE\u7F6E\u6709\u6548\u7684 URL',
2533
+ endpointMustBeHttp: "web_search: SearXNG \u7AEF\u70B9\u5FC5\u987B\u662F http(s) \u534F\u8BAE\uFF0C\u5F53\u524D\u4E3A {protocol} \u2014 try: \u4F7F\u7528 /search-endpoint http://host:port \u8BBE\u7F6E\u6709\u6548\u7684 URL",
2534
+ cannotReach: "web_search: \u65E0\u6CD5\u8BBF\u95EE SearXNG \u670D\u52A1\u5668 {endpoint} \u2014 try: \u5B89\u88C5\u5E76\u542F\u52A8 SearXNG\uFF08https://github.com/searxng/searxng\uFF0C\u4F8B\u5982 `docker run -d -p 8080:8080 searxng/searxng`\uFF09\uFF0C\u6216\u4F7F\u7528 /search-engine mojeek \u5207\u6362\u5230\u9ED8\u8BA4\u5F15\u64CE",
2535
+ searxngNoResults: "web_search: \u8FD4\u56DE 0 \u6761\u7ED3\u679C\u4F46 SearXNG \u54CD\u5E94\u770B\u8D77\u6765\u4E0D\u662F\u6B63\u5E38\u7A7A\u7ED3\u679C\u9875\uFF08{chars} \u5B57\u7B26\uFF09\u2014 try: \u4F7F\u7528\u66F4\u7B80\u5355\u7684\u5173\u952E\u8BCD\u6539\u5199\u67E5\u8BE2\uFF0C\u6216\u4F7F\u7528 /search-engine mojeek \u5207\u6362\u5F15\u64CE",
2536
+ fetchStatus: "web_fetch {status} for {url} \u2014 try: \u5728\u6D4F\u89C8\u5668\u4E2D\u786E\u8BA4\u8BE5 URL \u80FD\u5426\u8BBF\u95EE\uFF1B\u8BE5\u72B6\u6001\u7801\u8868\u660E\u76EE\u6807\u4E3B\u673A\u8FD4\u56DE\u4E86\u9519\u8BEF\u9875\u9762",
2537
+ fetchRateLimit429: "web_fetch 429 for {url} \u2014 try: \u7B49\u5F85 10 \u79D2\u540E\u91CD\u8BD5\uFF1B\u76EE\u6807\u4E3B\u673A\u6B63\u5728\u5BF9\u8BE5\u5BA2\u6237\u7AEF\u8FDB\u884C\u9650\u6D41",
2538
+ fetchForbidden403: "web_fetch 403 for {url} \u2014 try: \u76EE\u6807\u4E3B\u673A\u62D2\u7EDD\u8BE5\u5BA2\u6237\u7AEF\u8BBF\u95EE\uFF1B\u8BE5\u9875\u9762\u53EF\u80FD\u9700\u8981\u767B\u5F55\u6216\u5C4F\u853D\u722C\u866B \u2014 \u6539\u7528 web_search \u6458\u8981",
2539
+ fetchServerError5xx: "web_fetch {status} for {url} \u2014 try: \u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u8BE5 URL\uFF1B\u82E5\u80FD\u52A0\u8F7D\u5219\u5C5E\u4E34\u65F6\u6545\u969C\uFF0C\u7B49 30 \u79D2\u91CD\u8BD5\u5373\u53EF",
2540
+ fetchTimeout: "web_fetch: timed out after {ms}ms for {url} \u2014 try: \u66F4\u77ED\u7684 URL \u6216\u66F4\u5C0F\u7684\u5185\u5BB9\uFF1B\u53EF\u80FD\u662F CDN \u8F83\u6162\uFF0C\u6216\u91CD\u8BD5\u4E00\u6B21",
2541
+ fetchTooLarge: "web_fetch \u62D2\u7EDD\uFF1Acontent-length {len} \u5B57\u8282\u8D85\u8FC7\u4E0A\u9650 {cap} \u5B57\u8282\uFF08{url}\uFF09\u2014 try: \u6539\u6362\u5176\u4ED6 URL \u83B7\u53D6\u8F83\u5C0F\u7684\u5185\u5BB9\uFF1B\u8BE5\u9875\u9762\u8FC7\u5927\u65E0\u6CD5\u83B7\u53D6",
2542
+ fetchBodyTooLarge: "web_fetch \u62D2\u7EDD\uFF1A\u54CD\u5E94\u4F53\u8D85\u8FC7 {cap} \u5B57\u8282\u4E0A\u9650\uFF08\u5DF2\u63A5\u6536 {seen} \u5B57\u8282\uFF09\u2014 try: \u6539\u6362\u5176\u4ED6 URL \u83B7\u53D6\u8F83\u5C0F\u7684\u5185\u5BB9\uFF1B\u8BE5\u9875\u9762\u6D41\u5F0F\u4F20\u8F93\u8D85\u51FA\u5927\u5C0F\u4E0A\u9650",
2543
+ fetchInvalidUrl: "web_fetch: URL \u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934 \u2014 try: \u4F20\u5165\u7EDD\u5BF9\u7684 http(s) URL\uFF08\u8BE5 URL \u683C\u5F0F\u9519\u8BEF\u6216\u4F7F\u7528\u4E86\u4E0D\u652F\u6301\u7684\u534F\u8BAE\uFF09"
2544
+ },
2545
+ choiceConfirm: {
2546
+ customLabel: "\u81EA\u5B9A\u4E49\u56DE\u7B54",
2547
+ customDesc: "\u4EE5\u4E0A\u9009\u9879\u90FD\u4E0D\u5408\u9002 \u2014 \u8F93\u5165\u81EA\u7531\u683C\u5F0F\u56DE\u590D\uFF0C\u6A21\u578B\u4F1A\u539F\u6837\u8BFB\u53D6",
2548
+ cancelLabel: "\u53D6\u6D88 \u2014 \u653E\u5F03\u95EE\u9898",
2549
+ cancelDesc: "\u6A21\u578B\u505C\u6B62\u5E76\u8BE2\u95EE\u4F60\u771F\u6B63\u7684\u9700\u6C42"
2550
+ },
2551
+ cardTitles: {
2552
+ usage: "\u7528\u91CF",
2553
+ context: "\u4E0A\u4E0B\u6587",
2554
+ search: "\u641C\u7D22",
2555
+ subagent: "\u5B50\u4EE3\u7406",
2556
+ reply: "\u56DE\u590D",
2557
+ reasoning: "\u63A8\u7406\u4E2D",
2558
+ reasoningAborted: "\u63A8\u7406\uFF08\u5DF2\u4E2D\u6B62\uFF09",
2559
+ reasoningEllipsis: "\u63A8\u7406\u4E2D\u2026",
2560
+ error: "\u9519\u8BEF",
2561
+ doctor: "\u73AF\u5883\u8BCA\u65AD",
2562
+ you: "\u4F60",
2563
+ task: "\u4EFB\u52A1"
2564
+ },
2565
+ cardLabels: {
2566
+ prompt: "\u63D0\u793A",
2567
+ reason: "\u63A8\u7406",
2568
+ output: "\u8F93\u51FA",
2569
+ cache: "\u7F13\u5B58",
2570
+ session: "\u4F1A\u8BDD",
2571
+ balance: "\u4F59\u989D",
2572
+ turn: "\u8F6E",
2573
+ system: "\u7CFB\u7EDF",
2574
+ tools: "\u5DE5\u5177",
2575
+ log: "\u65E5\u5FD7",
2576
+ input: "\u8F93\u5165",
2577
+ topTools: "\u5E38\u7528\u5DE5\u5177",
2578
+ logMsgs: "\u65E5\u5FD7\u6D88\u606F",
2579
+ hitSingular: "{count} \u6761\u7ED3\u679C \xB7 {files} \u4E2A\u6587\u4EF6",
2580
+ hitsPlural: "{count} \u6761\u7ED3\u679C \xB7 {files} \u4E2A\u6587\u4EF6",
2581
+ moreHitSingular: "\u22EE +{count} \u6761\u7ED3\u679C",
2582
+ moreHitsPlural: "\u22EE +{count} \u6761\u7ED3\u679C",
2583
+ earlierLine: "\u22EE \u524D {count} \u884C\uFF08\u4F7F\u7528 /tool \u9605\u8BFB\u5168\u6587\uFF09",
2584
+ earlierLines: "\u22EE \u524D {count} \u884C\uFF08\u4F7F\u7528 /tool \u9605\u8BFB\u5168\u6587\uFF09",
2585
+ earlierStackLine: "\u22EE \u524D {count} \u884C\u5806\u6808\u5DF2\u9690\u85CF",
2586
+ earlierStackLines: "\u22EE \u524D {count} \u884C\u5806\u6808\u5DF2\u9690\u85CF",
2587
+ agent: "\u4EE3\u7406 \xB7 {name}",
2588
+ response: "\u56DE\u590D",
2589
+ writing: "\u8F93\u51FA\u4E2D \u2026",
2590
+ tok: "tok",
2591
+ pilcrow: "\xB6",
2592
+ aborted: "\u5DF2\u4E2D\u6B62",
2593
+ truncatedByEsc: "[\u5DF2\u88AB Esc \u622A\u65AD]",
2594
+ rejected: "\u5DF2\u62D2\u7EDD",
2595
+ exit: "\u9000\u51FA\u7801 {code}",
2596
+ bytesIn: "{bytes} \u8F93\u5165",
2597
+ elapsedSec: "{secs}\u79D2",
2598
+ stackTrace: "\u5806\u6808\u8DDF\u8E2A",
2599
+ retries: "\u6B21\u91CD\u8BD5",
2600
+ reasoningLabel: "\u63A8\u7406 \xB7 {count} \xB6",
2601
+ runningLabel: "\u8FD0\u884C\u4E2D",
2602
+ workingLabel: "\u5904\u7406\u4E2D",
2603
+ defaultFooter: "\u2191\u2193 \u9009\u62E9 \xB7 \u23CE \u786E\u8BA4 \xB7 Esc \u53D6\u6D88",
2604
+ applyAction: "[a] \u5E94\u7528",
2605
+ skipAction: "[s] \u8DF3\u8FC7",
2606
+ rejectAction: "[r] \u62D2\u7EDD",
2607
+ levelOk: "\u6B63\u5E38",
2608
+ levelWarn: "\u8B66\u544A",
2609
+ levelFail: "\u5931\u8D25",
2610
+ checksLabel: "\u68C0\u67E5\u9879",
2611
+ passed: "\u901A\u8FC7",
2612
+ warnTag: "\u8B66\u544A",
2613
+ failTag: "\u5931\u8D25",
2614
+ stepLabel: "\u6B65\u9AA4",
2615
+ done: "\u5DF2\u5B8C\u6210",
2616
+ inProgress: "\u2190 \u8FDB\u884C\u4E2D",
2617
+ upcoming: "\u5F85\u5904\u7406",
2618
+ resumed: "\u5DF2\u6062\u590D \xB7 ",
2619
+ archive: "\u23EA \u5F52\u6863 \xB7 ",
2620
+ more: "\u22EE +{count} \u66F4\u591A",
2621
+ categoryUser: "\u7528\u6237",
2622
+ categoryFeedback: "\u53CD\u9988",
2623
+ categoryProject: "\u9879\u76EE",
2624
+ categoryReference: "\u53C2\u8003"
2625
+ },
2626
+ copyMode: {
2627
+ title: "\u2500\u2500 \u590D\u5236\u6A21\u5F0F \u2500\u2500",
2628
+ help: "j/k \u6216 \u2191/\u2193 \u79FB\u52A8 \xB7 v \u8D77\u9009\u533A \xB7 y \u590D\u5236 \xB7 g/G \u9876/\u5E95 \xB7 q \u9000\u51FA",
2629
+ statusBar: "\u7B2C {cur}/{total} \u884C \xB7 \u9009\u533A\uFF1A{sel}",
2630
+ statusYanked: "\u5DF2\u590D\u5236 {size} \u5B57\u7B26\uFF08osc52={osc52}\uFF09",
2631
+ statusEmpty: "\u672A\u9009\u4E2D\u5185\u5BB9",
2632
+ empty: "\uFF08\u8FD8\u6CA1\u6709\u804A\u5929\u5185\u5BB9 \u2014 \u5148\u548C\u6A21\u578B\u8BF4\u70B9\u4EC0\u4E48\uFF09",
2633
+ labelUser: "\u4F60",
2634
+ labelAssistant: "\u52A9\u624B",
2635
+ labelReasoning: "\u63A8\u7406",
2636
+ yankedToast: "\u25B8 \u5DF2\u590D\u5236 {size} \u5B57\u7B26\u5230\u526A\u8D34\u677F (osc52)",
2637
+ yankedToastFile: "\u25B8 \u5DF2\u590D\u5236 {size} \u5B57\u7B26 \xB7 \u6587\u4EF6\uFF1A{path}"
2638
+ },
2639
+ mcpHealth: {
2640
+ noData: "\u65E0\u68C0\u67E5\u6570\u636E",
2641
+ healthy: "\u6B63\u5E38 \xB7 {ms}ms",
2642
+ slow: "\u7F13\u6162 \xB7 {ms}ms",
2643
+ verySlow: "\u975E\u5E38\u6162 \xB7 {ms}ms",
2644
+ slowToast: "\u26A0 MCP `{name}` \u54CD\u5E94\u7F13\u6162 \xB7 P95 {seconds}s \xB7 \u6700\u8FD1 {sampleSize} \u6B21\u8C03\u7528",
2645
+ emptyHint: "\u2139 \u672A\u914D\u7F6E MCP \u670D\u52A1\u5668 \u2014\u2014 \u53EF\u5C1D\u8BD5\uFF1A`luckerr setup` \u91CD\u65B0\u9009\u62E9\uFF0C\u6216 `luckerr mcp install filesystem`"
2646
+ },
2647
+ denyContextInput: {
2648
+ description: "\u544A\u8BC9\u6A21\u578B\u4F60\u4E3A\u4EC0\u4E48\u62D2\u7EDD\u4E86\u3002\u6A21\u578B\u4E0B\u6B21\u4F1A\u770B\u5230\u4F60\u7684\u7406\u7531\u4F5C\u4E3A\u989D\u5916\u7684\u4E0A\u4E0B\u6587\u3002"
2649
+ },
2650
+ cardStream: {
2651
+ scrollAbove: " \u2191 {scroll}/{max} \u884C",
2652
+ scrollAbovePlural: " \u2191 {scroll}/{max} \u884C",
2653
+ scrollMore: " \u2014 \u8FD8\u6709 {remaining} \u884C",
2654
+ scrollPgUp: " \xB7 PgUp/\u6EDA\u8F6E/\u2191"
2655
+ },
2656
+ slashArgPicker: {
2657
+ noMatch: '\u6CA1\u6709\u5339\u914D "{partial}"',
2658
+ keepTyping: " \u2014 \u7EE7\u7EED\u8F93\u5165\uFF0C\u6216 Backspace \u4FEE\u6539",
2659
+ above: " \u2191 \u8FD8\u6709 {hidden} \u4E2A",
2660
+ below: " \u2193 \u8FD8\u6709 {hidden} \u4E2A",
2661
+ footer: " \u2191\u2193 \u5BFC\u822A \xB7 Tab/\u23CE \u9009\u62E9 \xB7 Esc \u53D6\u6D88"
2662
+ },
2663
+ mcpMarketplace: {
2664
+ title: "MCP \u5E02\u573A",
2665
+ filter: "\u7B5B\u9009\uFF1A",
2666
+ filterPlaceholder: "\uFF08\u8F93\u5165\u7B5B\u9009\uFF09",
2667
+ matchSingular: "{n} \u6761\u5339\u914D",
2668
+ matchPlural: "{n} \u6761\u5339\u914D",
2669
+ loading: "\u52A0\u8F7D\u4E2D\u2026",
2670
+ noEntries: "\u65E0\u6761\u76EE",
2671
+ opening: "\u6B63\u5728\u6253\u5F00\u6CE8\u518C\u8868\u2026",
2672
+ cached: " \xB7 \u5DF2\u7F13\u5B58",
2673
+ exhausted: " \xB7 \u5DF2\u8017\u5C3D",
2674
+ loadingMore: "\u52A0\u8F7D\u66F4\u591A\u2026",
2675
+ allLoaded: "\u6240\u6709\u9875\u9762\u5DF2\u52A0\u8F7D",
2676
+ fetchingDetail: "\u6B63\u5728\u83B7\u53D6 smithery \u8BE6\u60C5\u2026",
2677
+ noInstallInfo: "\u6CA1\u6709 {name} \u7684\u5B89\u88C5\u4FE1\u606F \u2014 \u8BD5\u8BD5 `npx -y @smithery/cli install {name}`",
2678
+ alreadyInstalled: "\u5DF2\u5B89\u88C5\uFF1A{spec}",
2679
+ installed: "\u5DF2\u5B89\u88C5 \u2192 {spec}",
2680
+ uninstalled: "\u5DF2\u5378\u8F7D {name}",
2681
+ installFailed: "\u5B89\u88C5\u5931\u8D25\uFF1A{message}",
2682
+ notInstalled: "\u672A\u5B89\u88C5\uFF1A{name}",
2683
+ bridged: "\u2713 \u5DF2\u5B89\u88C5 {name} \u2014 \u5DF2\u6865\u63A5",
2684
+ bridgeFailed: "\u25B2 \u5DF2\u5B89\u88C5 {name} \u2014 \u6865\u63A5\u5931\u8D25\uFF1A{reason}",
2685
+ bridgeReloadFailed: "\u2713 \u5DF2\u5B89\u88C5 {name} \u2014 \u91CD\u542F `luckerr code` \u4EE5\u6865\u63A5\uFF08\u91CD\u8F7D\u5931\u8D25\uFF1A{message}\uFF09",
2686
+ restartBridge: "\u2713 \u5DF2\u5B89\u88C5 {name} \u2014 \u91CD\u542F `luckerr code` \u4EE5\u6865\u63A5",
2687
+ needsEnv: " \xB7 \u9700\u8981\u73AF\u5883\u53D8\u91CF\uFF1A{env}",
2688
+ badgeOfficial: "[\u5B98\u65B9]",
2689
+ badgeSmithery: "[\u4E09\u65B9]",
2690
+ badgeLocal: "[\u672C\u5730]",
2691
+ footerHint: "\u8F93\u5165\u7B5B\u9009 \xB7 \u2191\u2193 \u9009\u62E9 \xB7 \u23CE \u5B89\u88C5/\u5207\u6362 \xB7 PgDn \u52A0\u8F7D\u66F4\u591A \xB7 Esc \u5173\u95ED",
2692
+ specLine: "\u914D\u7F6E\uFF1A{runtime} {id} \xB7 {transport}",
2693
+ smitheryDetail: "\uFF08smithery \u5217\u8868 \u2014 \u6309 Enter \u83B7\u53D6\u5B89\u88C5\u8BE6\u60C5\uFF09",
2694
+ statusError: "\u9519\u8BEF\uFF1A{message}"
2695
+ },
2696
+ mcpBrowser: {
2697
+ title: "\u25C8 MCP \u6D4F\u89C8\u5668",
2698
+ empty: "\u6CA1\u6709\u6302\u8F7D MCP \u670D\u52A1\u5668\u3002\u8FD0\u884C `luckerr setup` \u9009\u62E9\u4E00\u4E9B\uFF0C\u6216\u4F7F\u7528 --mcp \u542F\u52A8\u3002",
2699
+ serverCount: "{count} \u4E2A\u670D\u52A1\u5668",
2700
+ footer: "\u2191\u2193 \u9009\u62E9 \xB7 [r] \u91CD\u8FDE \xB7 [d] \u7981\u7528 \xB7 Esc \u9000\u51FA"
2701
+ },
2702
+ mcpLifecycle: {
2703
+ handshake: "\u63E1\u624B\u4E2D\u2026",
2704
+ connected: "\u5DF2\u8FDE\u63A5",
2705
+ failed: "\u5931\u8D25",
2706
+ disabled: "\u5DF2\u7981\u7528",
2707
+ reconnect: "\u91CD\u8FDE\u4E2D\u2026",
2708
+ initDetail: "\u521D\u59CB\u5316 \u2192 tools/list \u2192 resources/list",
2709
+ reconnectDetail: "\u65AD\u5F00\u65E7\u8FDE\u63A5 \xB7 \u91CD\u65B0\u63E1\u624B \xB7 \u5217\u51FA\u5DE5\u5177",
2710
+ disabledDetail: "\u901A\u8FC7 /mcp disable {name}"
2711
+ },
2712
+ checkpointPicker: {
2713
+ title: "\u6062\u590D\u68C0\u67E5\u70B9 \u2014 {workspace}",
2714
+ header: " \u25C8 LUCKERR \xB7 \u9009\u62E9\u68C0\u67E5\u70B9 ",
2715
+ empty: " \u6B64\u5DE5\u4F5C\u533A\u6682\u65E0\u68C0\u67E5\u70B9 \u2014 \u53C2\u89C1 /checkpoint \u521B\u5EFA",
2716
+ more: " \u2026 \u8FD8\u6709 {hidden} \u4E2A",
2717
+ footer: " \u2191\u2193 \u9009\u62E9 \xB7 \u23CE \u6062\u590D \xB7 [d] \u5220\u9664 \xB7 Esc \u9000\u51FA",
2718
+ footerEmpty: " Esc \u9000\u51FA"
2719
+ },
2720
+ planReviseConfirm: {
2721
+ title: "\u8BA1\u5212\u4FEE\u6539\u5DF2\u63D0\u4EA4",
2722
+ metaRight: "\u2212{removed} +{added} \xB7 {kept} \u4E2A\u4FDD\u7559",
2723
+ updatedSummary: "\u66F4\u65B0\u6458\u8981\uFF1A{summary}",
2724
+ acceptLabel: "\u63A5\u53D7\u4FEE\u6539 \u2014 \u5E94\u7528\u65B0\u7684\u6B65\u9AA4\u5217\u8868",
2725
+ acceptHint: "\u7528\u65B0\u6B65\u9AA4\u66FF\u6362\u5269\u4F59\u8BA1\u5212\u3002\u5DF2\u5B8C\u6210\u7684\u6B65\u9AA4\u4E0D\u53D8\u3002",
2726
+ rejectLabel: "\u62D2\u7EDD \u2014 \u4FDD\u7559\u539F\u8BA1\u5212",
2727
+ rejectHint: "\u653E\u5F03\u4FEE\u6539\u3002\u6A21\u578B\u7EE7\u7EED\u6309\u539F\u6B65\u9AA4\u6267\u884C\u3002"
2728
+ },
2729
+ diffApp: {
2730
+ title: "luckerr diff",
2731
+ turnLabel: "\u7B2C {turn} \u8F6E\uFF08{current}/{total}\uFF09",
2732
+ turnsAligned: "{count} \u8F6E\u5DF2\u5BF9\u9F50",
2733
+ paneEmpty: "\uFF08\u6B64\u8F6E\u8BE5\u4FA7\u65E0\u8BB0\u5F55\uFF09",
2734
+ kindMatch: "\u2713 \u4E00\u81F4",
2735
+ kindDiverge: "\u2605 \u5206\u6B67",
2736
+ kindOnlyInA: "\u2190 \u4EC5 A \u6709",
2737
+ kindOnlyInB: "\u2192 \u4EC5 B \u6709"
2738
+ },
2739
+ recordView: {
2740
+ userPrefix: "\u4F60 \u203A ",
2741
+ assistant: "\u52A9\u624B",
2742
+ toolPrefix: "tool<",
2743
+ argsLabel: " \u53C2\u6570\uFF1A",
2744
+ resultArrow: " \u2192 ",
2745
+ error: "\u9519\u8BEF ",
2746
+ cache: " \xB7 \u7F13\u5B58 ",
2747
+ toolCallOnly: "\uFF08\u4EC5\u5DE5\u5177\u8C03\u7528\u54CD\u5E94\uFF09",
2748
+ truncateExtra: "\uFF08+{extra} \u5B57\u7B26\uFF09"
2749
+ },
2750
+ replayApp: {
2751
+ emptyTranscript: "\u7A7A\u8BB0\u5F55",
2752
+ turnProgress: "\u7B2C {current}/{total} \u8F6E",
2753
+ noRecords: "\u65E0\u8BB0\u5F55",
2754
+ untracked: "\uFF08\u672A\u8FFD\u8E2A\uFF09",
2755
+ churned: "\uFF08\u5DF2\u53D8\u66F4 \xD7{count}\uFF09"
2756
+ }
2757
+ };
2758
+
2759
+ // src/i18n/index.ts
2760
+ var translations = {
2761
+ EN,
2762
+ "zh-CN": zhCN
2763
+ };
2764
+ function detectSystemLanguage(locale = Intl.DateTimeFormat().resolvedOptions().locale) {
2765
+ if (locale.startsWith("zh")) return "zh-CN";
2766
+ if (locale.startsWith("en")) return "EN";
2767
+ return null;
2768
+ }
2769
+ var currentLang = loadLanguage() ?? detectSystemLanguage() ?? "EN";
2770
+ var listeners = [];
2771
+ function onLanguageChange(cb) {
2772
+ listeners.push(cb);
2773
+ return () => {
2774
+ const i = listeners.indexOf(cb);
2775
+ if (i >= 0) listeners.splice(i, 1);
2776
+ };
2777
+ }
2778
+ function notifyLanguageChange() {
2779
+ for (const cb of listeners) cb();
2780
+ }
2781
+ function setLanguage(lang) {
2782
+ if (translations[lang]) {
2783
+ currentLang = lang;
2784
+ saveLanguage(lang);
2785
+ }
2786
+ }
2787
+ function getLanguage() {
2788
+ return currentLang;
2789
+ }
2790
+ function getSupportedLanguages() {
2791
+ return Object.keys(translations);
2792
+ }
2793
+ function tObj(path) {
2794
+ const parts = path.split(".");
2795
+ let val = translations[currentLang] || translations.EN;
2796
+ for (const part of parts) {
2797
+ val = val?.[part];
2798
+ if (val === void 0) break;
2799
+ }
2800
+ if (val === void 0 && currentLang !== "EN") {
2801
+ val = translations.EN;
2802
+ for (const part of parts) {
2803
+ val = val?.[part];
2804
+ if (val === void 0) break;
2805
+ }
2806
+ }
2807
+ return val;
2808
+ }
2809
+ function t(path, params) {
2810
+ const parts = path.split(".");
2811
+ let val = translations[currentLang] || translations.EN;
2812
+ for (const part of parts) {
2813
+ val = val?.[part];
2814
+ if (val === void 0) break;
2815
+ }
2816
+ if (val === void 0 && currentLang !== "EN") {
2817
+ val = translations.EN;
2818
+ for (const part of parts) {
2819
+ val = val?.[part];
2820
+ if (val === void 0) break;
2821
+ }
2822
+ }
2823
+ if (typeof val !== "string") {
2824
+ return path;
2825
+ }
2826
+ if (params) {
2827
+ let result = val;
2828
+ for (const [k, v] of Object.entries(params)) {
2829
+ result = result.replace(new RegExp(`\\{${k}\\}`, "g"), String(v));
2830
+ }
2831
+ return result;
2832
+ }
2833
+ return val;
2834
+ }
2835
+
2836
+ export {
2837
+ detectSystemLanguage,
2838
+ onLanguageChange,
2839
+ notifyLanguageChange,
2840
+ setLanguage,
2841
+ getLanguage,
2842
+ getSupportedLanguages,
2843
+ tObj,
2844
+ t
2845
+ };
2846
+ //# sourceMappingURL=chunk-5TWQD73O.js.map