deel-local-cli 1.10.0 → 1.13.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 (55) hide show
  1. package/README.ko.md +1167 -1166
  2. package/README.md +1224 -1223
  3. package/bin/deel.js +1 -1
  4. package/package.json +2 -2
  5. package/src/acp/map.js +367 -362
  6. package/src/acp/serve.js +810 -769
  7. package/src/agent/budget.js +156 -153
  8. package/src/agent/commit.js +534 -511
  9. package/src/agent/compact.js +158 -31
  10. package/src/agent/effort.js +308 -197
  11. package/src/agent/evolve.js +263 -213
  12. package/src/agent/filemem.js +16 -2
  13. package/src/agent/loop.js +1728 -1516
  14. package/src/agent/memory.js +156 -152
  15. package/src/agent/mention.js +210 -210
  16. package/src/agent/recall.js +222 -209
  17. package/src/agent/session.js +1056 -948
  18. package/src/backend/adapter.js +1355 -798
  19. package/src/backend/cachemark.js +223 -0
  20. package/src/backend/detect.js +327 -288
  21. package/src/backend/http.js +460 -458
  22. package/src/backend/mcp.js +407 -395
  23. package/src/backend/price.js +260 -197
  24. package/src/backend/probe.js +487 -473
  25. package/src/backend/quota.js +274 -157
  26. package/src/backend/retry.js +30 -6
  27. package/src/backend/tokens.js +59 -0
  28. package/src/backend/toolfit.js +352 -325
  29. package/src/backend/wire.js +715 -0
  30. package/src/commands.js +3184 -2998
  31. package/src/config.js +283 -244
  32. package/src/i18n/en.js +545 -520
  33. package/src/i18n/ja.js +498 -473
  34. package/src/i18n/ko.js +592 -567
  35. package/src/i18n/zh.js +498 -473
  36. package/src/oneshot.js +625 -549
  37. package/src/pack/tar.js +154 -132
  38. package/src/pack/zip.js +235 -217
  39. package/src/plugins/manage.js +416 -336
  40. package/src/providers/bedrock.js +17 -0
  41. package/src/repl.js +2616 -2515
  42. package/src/safety/audit.js +148 -129
  43. package/src/safety/guard.js +641 -526
  44. package/src/safety/network.js +200 -157
  45. package/src/tools/fastgrep.js +229 -214
  46. package/src/tools/fsutil.js +291 -250
  47. package/src/tools/index.js +2560 -2523
  48. package/src/tools/jobs.js +876 -795
  49. package/src/tools/label.js +52 -0
  50. package/src/tools/spawn.js +213 -99
  51. package/src/tools/verify.js +358 -357
  52. package/src/tools/webfetch.js +418 -393
  53. package/src/ui/export.js +233 -217
  54. package/src/ui/pick.js +115 -115
  55. package/src/ui/status.js +617 -610
package/src/i18n/en.js CHANGED
@@ -1,520 +1,545 @@
1
- /**
2
- * English.
3
- *
4
- * ── What this is, and what it is not ────────────────────────────────────
5
- *
6
- * deel is a Korean-language tool. The code stays Korean — functions and
7
- * variables are named in Korean and that is deliberate. Only what shows up
8
- * on screen is translated, and only so that someone who opens the repo can
9
- * type `/help` and understand what they are looking at.
10
- *
11
- * Keys missing here fall back to Korean rather than to a blank. A blank is
12
- * read as a bug; Korean is read as "not translated yet", which is the truth.
13
- * `/lang` prints how much is done — see 옮긴만큼() in ./index.js.
14
- *
15
- * ── Wording rules ──────────────────────────────────────────────────────
16
- *
17
- * Keep the same directness as the Korean. The Korean text says what happens
18
- * and what it costs you, not what the feature is called. Translate that,
19
- * not the noun.
20
- *
21
- * Do not translate: command names (they are already English), `DEEL.md`,
22
- * `MCP`, `ACP`, and the tool names (Read/Write/Bash/Verify…). Those are
23
- * identifiers, and renaming them on screen would make the docs wrong.
24
- */
25
- export const en = {
26
- // ── Slash commands ────────────────────────────────────────────────────
27
- 'cmd.help.desc': 'list commands',
28
- 'cmd.clear.desc': 'clear the conversation',
29
- 'cmd.context.desc': 'show context usage',
30
- 'cmd.ctx.desc': 'context length — re-measure for this model, or set it yourself',
31
- 'cmd.ctx.arg': '[auto|number|640k]',
32
- 'cmd.out.desc': 'cap on one reply — raise this if large files come back cut off',
33
- 'cmd.out.arg': '[number|32k|auto]',
34
- 'cmd.grade.desc': 'model class — how much it can do on its own. Not the same axis as window size',
35
- 'cmd.grade.arg': '[small|medium|large|auto]',
36
- 'cmd.compact.desc': 'shrink older turns',
37
- 'cmd.model.desc': 'switch connection/model · `card` shows what this model has done here',
38
- 'cmd.model.arg': '[name|list|models|card]',
39
- 'cmd.think.desc': 'reasoning effort (off/low/medium/high/max)',
40
- 'cmd.think.arg': '<level>',
41
-
42
- // ── /think screen ──────────────────────────────────────────────────
43
- 'run.noTools': 'Tool calling is unconfirmed — check with deel diagnose',
44
- 'think.effort': 'Effort',
45
- 'think.profile': 'Profile',
46
- 'think.detail': 'detail',
47
- 'think.harder': 'harder',
48
- 'think.faster': 'faster',
49
- 'think.eg': 'e.g.',
50
- 'think.col.stage': 'Stage',
51
- 'think.col.level': 'Effort',
52
- 'think.col.cap': 'Out cap',
53
- 'think.col.when': 'When',
54
- 'think.cap.head': 'Caps are shared inside',
55
- 'think.cap.tail': ' —',
56
- 'think.cap.you': '(you set this)',
57
- 'think.cap.server': '(read from the server)',
58
- 'think.cap.guess': '(unknown, so a default)',
59
- 'think.ctx': 'Context',
60
- 'think.ctx.used': ' · used ',
61
- 'think.nomodel': 'This connection does not apply effort at the model layer.',
62
- 'think.nomodel.note': 'Only the per-stage output cap applies.',
63
- 'cmd.mode.desc': 'approval policy — how much it asks first (auto/confirm/strict)',
64
- 'cmd.mode.arg': '<mode>',
65
- 'cmd.work.desc': 'work mode — what kind of job this is (picked for you in auto)',
66
- 'cmd.work.arg': '[mode]',
67
- 'cmd.auto.desc': 'work mode → auto (moves by itself with the request. Not /mode)',
68
- 'cmd.code.desc': 'work mode → code (edits and builds)',
69
- 'cmd.plan.desc': 'work mode → plan (plan first, no edits)',
70
- 'cmd.architect.desc': 'work mode → architect (shapes the structure)',
71
- 'cmd.debug.desc': 'work mode → debug (finds the cause)',
72
- 'cmd.ask.desc': 'work mode → ask (explains only)',
73
- 'cmd.orchestrator.desc': 'work mode → orchestrator (splits a big job up)',
74
- 'cmd.undo.desc': 'undo the last turn — files and the conversation together',
75
- 'cmd.undo.arg': '[turns]',
76
- 'cmd.diff.desc': 'files changed this session, and what changed in them',
77
- 'cmd.diff.arg': '[file]',
78
- 'cmd.preview.desc': 'serve what you built, right here — nothing to deploy',
79
- 'cmd.preview.arg': '[folder|off]',
80
- 'cmd.tools.desc': 'show the tools available',
81
- 'cmd.skills.desc': 'browse, search, and load skills',
82
- 'cmd.skills.arg': '[search|all|off]',
83
- 'cmd.plugin.desc': 'plugins — list, install, remove, bundle for air-gapped import',
84
- 'cmd.plugin.arg': '[install|remove|pack]',
85
- 'cmd.cost.desc': 'usage for this session',
86
- 'cmd.status.desc': 'connection status',
87
- 'cmd.scan.desc': 'scan this machine for local model servers',
88
- 'cmd.scan.arg': '[save]',
89
- 'cmd.thread.desc': 'threads — take a side track. Connection and undo history stay shared',
90
- 'cmd.thread.arg': '[new|fork|close|number|name]',
91
- 'cmd.learned.desc': 'what deel picked up on its own — commands that work here, this model’s habits',
92
- 'cmd.learned.arg': '[clear]',
93
- 'cmd.pin.desc': 'pin a line — survives folding and summarising',
94
- 'cmd.pin.arg': '[text|clear number|clear all]',
95
- 'cmd.evidence.desc': 'evidence — what changed and what proves it. Says what is unproven too',
96
- 'cmd.evidence.arg': '[file]',
97
- 'cmd.commit.desc': 'commit — stages only what this session changed; message from the diff and the evidence',
98
- 'cmd.review.desc': 'review the changes in a fresh context — reports findings only, changes nothing',
99
- 'cmd.paste.desc': 'attach the screenshot sitting in the clipboard (capture, then /paste)',
100
- 'cmd.commit.arg': '[all|preview|title]',
101
- 'cmd.sessions.desc': 'past sessions in this folder',
102
- 'cmd.recall.desc': 'search past sessions — by what was said, not by title',
103
- 'cmd.recall.arg': '<text>',
104
- 'cmd.mcp.desc': 'show connected MCP tool servers',
105
- 'cmd.memory.desc': 'what survives the session — view and clear',
106
- 'cmd.memory.arg': '[forget <n>|clear|<text to remember>]',
107
- 'cmd.level.desc': 'user level (beginner/developer)',
108
- 'cmd.level.arg': '[level]',
109
- 'cmd.keys.desc': 'press keys to see what your terminal actually sends — when new lines will not work',
110
- 'cmd.bell.desc': 'bell and window title when a turn ends or deel needs you (on/off)',
111
- 'cmd.bell.arg': '[on|off]',
112
- 'cmd.motion.desc': 'what moves while deel works — knight, animals, office',
113
- 'cmd.motion.arg': '[knight|animal|office|default|off]',
114
- 'cmd.lang.desc': 'screen language — 한국어 / English',
115
- 'cmd.lang.arg': '[ko|en] [prompt lang]',
116
- 'cmd.init.desc': 'create a DEEL.md rules file',
117
- 'cmd.exit.desc': 'quit',
118
- 'cmd.quit.desc': 'quit',
119
-
120
- 'cmd.consult.desc': 'ask a second model one question — your current model stays put',
121
- 'cmd.consult.arg': '[profile <question>]',
122
- 'consult.title': 'models configured on this machine',
123
- 'consult.noProfiles': 'No profiles configured. Run /scan to look for local servers.',
124
- 'consult.current': '(in use)',
125
- 'consult.usage': 'Usage: /consult <profile> <question> e.g. /consult small what does this regex do?',
126
- 'consult.questionOnly': 'Only the question is sent — this conversation does not go with it. Put the background you need into the question.',
127
- 'consult.candidates': 'These match:',
128
- 'consult.have': 'Available:',
129
- 'consult.needQuestion': 'Add what you want to ask {이름}. e.g. /consult {이름} what does this error mean?',
130
- 'consult.goesOut': '— this question leaves your machine',
131
- 'consult.asking': 'asking {모델}…',
132
- 'consult.system': 'You are a model another coding agent is consulting. Answer briefly and precisely. Say so when you do not know. You are being asked a question, not told to edit files.',
133
- 'consult.failed': 'Could not ask — {왜}',
134
- 'consult.empty': 'The reply came back empty. That model may not answer without tools.',
135
- 'consult.added': 'Added that answer to the conversation, labelled with who said it.',
136
- // ── Connection check ──────────────────────────────────────────────────
137
- 'probe.codexOnly': 'The {모델} family is not served through this endpoint (/chat/completions) — OpenAI serves it only through the Responses API (/responses), which deel cannot speak yet. Pick a different model for now.',
138
- // ── Startup header ────────────────────────────────────────────────────
139
- 'head.spec.ollama': "Ollama's own API",
140
- 'head.spec.openai': 'OpenAI-compatible API',
141
- 'head.spec.anthropic': 'Anthropic API',
142
- 'head.mode.default': 'inside (default)',
143
- 'head.mode.online': 'outside (online)',
144
- 'head.mode.offline': 'sealed (offline)',
145
- 'head.model': 'model',
146
- 'head.tokens': 'tokens',
147
- 'head.grade': 'class',
148
- 'head.guess': 'guessed',
149
- 'head.send': 'sends to',
150
- 'head.inside': 'this machine',
151
- 'head.outside': 'outside',
152
- 'head.offlineLock': '[offline lock]',
153
- 'head.viaProxy': 'via proxy {프록시}',
154
- 'head.proxyBad': '[proxy setting unusable — see /status]',
155
- 'head.nowhereElse': '← and nowhere else',
156
- 'head.glyphHint': 'The {안} at the start of the status bar means this. It becomes {밖} when traffic leaves.',
157
- 'head.conn': 'link',
158
- 'head.streaming': 'streaming',
159
- 'head.noStreaming': 'no streaming',
160
- 'head.tools': 'tools',
161
- 'head.toolsUnknown': 'tools unconfirmed',
162
- 'head.thinkCtl': 'effort control',
163
- 'head.noThinkCtl': 'no effort control',
164
- 'head.folder': 'folder',
165
- 'head.approve': 'approval',
166
- 'head.shiftTab': 'Shift+Tab',
167
- 'head.shiftTabHint': ' changes it · ',
168
- 'head.tabHint': 'Tab completes the / command you are typing',
169
- 'head.newlineHint': 'New line: Alt+Enter (Option+Enter on Mac) breaks the line inside the box · if your terminal swallows it, end the line with space + ` then Enter',
170
- 'head.star': 'Enjoying this tool? Star us on GitHub —',
171
- 'head.thisPC': 'found',
172
- 'head.skills': 'skills {n}',
173
- 'head.commands': 'commands {n}',
174
- 'head.plugins': 'plugins {n}',
175
-
176
- 'grade.small': 'small',
177
- 'grade.medium': 'medium',
178
- 'grade.large': 'large',
179
- 'head.gradeSuffix': ' · {급} {급이름}{짐작}',
180
-
181
- // ── Status bar segments ───────────────────────────────────────────────
182
- 'seg.dir': 'working folder (the ⌂/↗ in front says where your source goes)',
183
- 'seg.ver': 'version',
184
- 'seg.thread': 'thread',
185
- 'seg.model': 'model name',
186
- 'seg.grade': 'model class (how much it does on its own)',
187
- 'seg.ctx': 'context used (ticks = where folding and summarising kick in)',
188
- 'seg.work': 'work mode',
189
- 'seg.think': 'reasoning effort and split',
190
- 'seg.mode': 'approval policy',
191
- 'seg.edits': 'files changed this session',
192
- 'seg.verify': 'what was actually verified',
193
- 'seg.undoable': 'turns you can still undo',
194
- 'seg.tok': 'tokens in/out',
195
- 'seg.cost': 'money spent (only when the price is known)',
196
- 'seg.tools': 'tool calls',
197
- 'seg.skills': 'skills found on this machine',
198
- 'seg.time': 'time since start',
199
-
200
- // ── Startup motion ────────────────────────────────────────────────────
201
- 'intro.inside': 'stays on this machine',
202
- 'intro.outside': 'leaves this machine',
203
-
204
- // ── Undo ──────────────────────────────────────────────────────────────
205
- 'undo.nothing': 'Nothing to undo.',
206
- 'undo.done': 'Rolled back {turns} turn(s) · {files} file(s) restored.',
207
- 'undo.alsoTalk': 'Rolled back {n} message(s) too — if the model still thinks the reverted code is there, it keeps building on it.',
208
- 'undo.repaired': '({n} orphaned tool call(s) cleaned up as well)',
209
- 'undo.saidWas': 'You had asked:',
210
- 'undo.failed': '{n} file(s) could not be restored — they are still modified. The snapshots were kept, so try /undo again.',
211
- 'undo.talkKept': 'The conversation is left as is — that turn had already been folded away.',
212
- 'undo.talkKeptWhy': 'The model may still think the reverted work exists, so mention it in your next message.',
213
-
214
- // ── Bell ──────────────────────────────────────────────────────────────
215
- 'bell.stateOn': 'on',
216
- 'bell.stateOff': 'off',
217
- 'bell.now': 'The bell is {상태}.',
218
- 'bell.when': 'It rings once when a turn takes longer than {초}s, and whenever deel needs an answer from you.',
219
- 'bell.title': 'The window title shows the state too — you can tell from the tab alone whether it is still working.',
220
- 'bell.howto': 'To change it',
221
- 'bell.notATty': '(Not a terminal right now, so no bell and no title — that would corrupt the pipe.)',
222
- 'bell.needOnOff': 'Please say on or off.',
223
- 'bell.turnedOn': 'Bell on.',
224
- 'bell.turnedOff': 'Bell off.',
225
- 'bell.justRang': 'That was one ring. If you heard nothing, check your terminal’s bell setting.',
226
- 'bell.appliesNow': 'Applies to this session right away.',
227
-
228
- 'motion.now': 'Now:',
229
- 'motion.plain': 'a one-cell spinner. Quiet',
230
- 'motion.knight': 'a knight swings a sword. Sometimes gets flattened',
231
- 'motion.animal': 'pixel animals wander about',
232
- 'motion.office': 'twelve rows of office above the prompt — the work as a room',
233
- 'motion.off': 'no drawing at all (for screen-reader users)',
234
- 'motion.set': 'Switched to {것}.',
235
- 'motion.appliesNow': 'Visible from the next frame. Saved to your config too.',
236
- 'motion.unknown': '"{값}" is not one of the drawings.',
237
- 'motion.pickOne': 'Pick one of:',
238
- 'motion.envWins': 'DEEL_MOTION / DEEL_OFFICE is set, and the environment wins.',
239
- 'motion.tooSmall': 'This terminal is {줄} x {칸} — the office needs at least {최소줄} rows and {최소칸} columns.',
240
- 'motion.appleTerminal': "macOS Terminal spaces lines apart, so the room gets horizontal seams — Terminal › Settings › Profiles › Text › Font \"Change\" › set Line Spacing to 1.0. (iTerm2 defaults to 1.0, which is why it looks right there)",
241
-
242
- // ── Screen language ───────────────────────────────────────────────────
243
- 'lang.now': 'Screen language is {이름}.',
244
- 'lang.ko': '한국어 (Korean)',
245
- 'lang.ja': '日本語 (Japanese)',
246
- 'lang.zh': '中文 (Chinese)',
247
- 'lang.en': 'English',
248
- 'lang.howto': 'To change it',
249
- 'lang.changed': 'Screen language is now {이름}.',
250
- 'lang.unknown': 'Please say ko or en.',
251
- 'lang.progress': '{언어}: {옮김} of {전체} strings translated. The rest come through in Korean.',
252
- 'lang.partial': 'Not everything is translated yet — untranslated lines show Korean rather than a blank.',
253
- 'lang.codeStays': 'Unless you set it separately, what the model reads follows the screen. Code, tool names and argument names stay as they are.',
254
- 'lang.promptNow': 'The model is instructed in {이름}.',
255
- 'lang.follows': 'the same as the screen',
256
- 'lang.splitHowto': 'To be instructed in English while the screen stays in your language:',
257
- 'lang.promptChanged': 'Instructions in {이름}, answers in {답} — 23% off the fixed share on an 8k window.',
258
- 'lang.envHint': 'To start in English every time, set DEEL_LANG=en',
259
-
260
- 'cmd.lsp.desc': 'language servers — what is installed, and whether Def/Refs are available',
261
- 'cmd.lsp.arg': '[on|off]',
262
- 'lsp.found': '{수} language server(s) on this machine',
263
- 'lsp.none': 'No language server on this machine. Falling back to Grep and Outline.',
264
- 'lsp.thisFolder': 'Language of this folder:',
265
- 'lsp.noneHere': 'none usable',
266
- 'lsp.fileCount': '{수} files',
267
- 'lsp.tools': 'Tools:',
268
- 'lsp.toolsHidden': 'hidden (no server here)',
269
- 'lsp.diag': 'Diagnostics after an edit:',
270
- 'lsp.stateOn': 'on',
271
- 'lsp.stateOff': 'off',
272
- 'lsp.ready': 'ready',
273
- 'lsp.starting': 'starting',
274
- 'lsp.diagOn': 'Diagnostics after an edit are on.',
275
- 'lsp.diagOff': 'Diagnostics after an edit are off. Def and Refs still work.',
276
- 'lsp.installHint': 'Install one and Def / Refs appear:',
277
- 'lsp.neverInstalls': 'deel installs nothing. Those are commands for you to run yourself.',
278
- 'lsp.howto': 'Turn post-edit diagnostics on or off:',
279
-
280
- 'cmd.export.desc': 'this conversation as a one-page HTML report — asked, changed, verified',
281
- 'cmd.export.arg': '[filename]',
282
- 'export.untitled': 'Untitled conversation',
283
- 'export.model': 'Model',
284
- 'export.calls': '{수} tool calls',
285
- 'export.conversation': 'What was asked and answered',
286
- 'export.you': 'You',
287
- 'export.nothing': 'Nothing was said.',
288
- 'export.changed': 'Changed files',
289
- 'export.file': 'File',
290
- 'export.times': 'Times',
291
- 'export.noChanges': 'No files were changed.',
292
- 'export.evidence': 'What was run',
293
- 'export.nothingRan': 'No commands were run.',
294
- 'export.unproven': 'Not proven',
295
- 'export.allProven': 'None — every change has a later check behind it.',
296
- 'export.footer': 'Report generated by deel. No outbound links — opens on any network.',
297
- 'export.saved': 'Report saved:',
298
- 'export.openHint': 'Double-click to open. Attach it to a review or report as-is.',
299
- 'export.failed': 'Could not save the report. Check folder permissions.',
300
-
301
-
302
- // ── Help, approval policy, user level ─────────────────────────────────
303
- 'help.titleCommon': 'commands (the ones you will use)',
304
- 'help.title': 'commands',
305
- 'help.moreHidden': '{n} more exist — type them and they run just the same.',
306
- 'help.showAll': 'To see all of them',
307
- 'help.restGoesToModel': 'Anything else goes to the model. Ctrl+C on an empty line quits.',
308
- 'approve.auto.name': 'auto-approve',
309
- 'approve.auto.short': 'auto',
310
- 'approve.auto.line': 'edits without asking. /undo is the safety net',
311
- 'approve.confirm.name': 'risky only',
312
- 'approve.confirm.short': 'risky',
313
- 'approve.confirm.line': 'asks before commands it cannot take back. Files are edited without asking',
314
- 'approve.strict.name': 'ask always',
315
- 'approve.strict.short': 'always',
316
- 'approve.strict.line': 'asks before every file edit and every command',
317
- 'level.beginner.name': 'beginner',
318
- 'level.beginner.hint': 'start on the recommended settings',
319
- 'level.developer.name': 'developer',
320
- 'level.developer.hint': 'everything by hand',
321
-
322
- // ── Ask box (the Ask tool) ────────────────────────────────────────────
323
- 'plan.ask': 'Go ahead with this?',
324
- 'plan.hint': '⏎ go · y with a note · 3 a note on that step · n cancel',
325
- 'plan.cancelled': 'Stopped. The plan is still above — just say what you want next.',
326
- 'plan.going': 'Going ahead with the plan.',
327
- 'plan.goingWith': 'Going ahead, with your note — {말}',
328
- 'plan.replan': 'Redoing the plan with that in mind.',
329
- 'plan.replanStep': 'Redoing the plan with your note on step {단계}.',
330
- 'ask.title': 'A question for you',
331
- 'ask.pickHint': 'Pick a number. Add a note after it if you have one (2 split the files)',
332
- 'ask.freeHint': 'Type your answer',
333
- 'ask.pickPrompt': '1-{끝} (a note may follow), or type your own',
334
- 'ask.freePrompt': 'Answer',
335
- 'ask.stopped': 'Stopped — treating it as unanswered.',
336
-
337
- // ── When the server pushes back (backend/retry.js) ────────────────────
338
- 'loop.backoff': 'The server pushed back ({무엇}) — calling again in {초}s ({n}/{max})',
339
- 'cost.retries': 'retries',
340
-
341
- // ── Counted things ────────────────────────────────────────────────────
342
- // Singular keys exist because English needs them; Korean reuses one word.
343
- 'unit.files': '{n} files',
344
- 'unit.files1': '1 file',
345
- 'unit.hits': '{n} hits',
346
- 'unit.hits1': '1 hit',
347
- 'unit.lines': '{n} lines',
348
- 'unit.lines1': '1 line',
349
- 'unit.spots': '{n} spots',
350
- 'unit.spots1': '1 spot',
351
- 'unit.places': '{n} places',
352
- 'unit.places1': '1 place',
353
- 'unit.count': '{n}',
354
- 'unit.count1': '1',
355
- 'unit.chars': '{n} chars',
356
- 'unit.kchars': '{n}k chars',
357
- 'unit.calls': '{n} calls',
358
- 'unit.sec': '{n}s',
359
- 'unit.min': '{n} min',
360
-
361
- // ── Tool result line ──────────────────────────────────────────────────
362
- 'sum.done': 'done',
363
- 'sum.ok': 'ok',
364
- 'sum.exitCode': 'exit {code}',
365
- 'sum.killedBy': 'killed by {시그널}',
366
- 'sum.tooMuchOut': 'output too large — capture cut short',
367
- 'sum.cantRun': 'could not run ({왜})',
368
- 'sum.partial': 'partial',
369
- 'sum.cut': 'truncated',
370
- 'sum.notAllSeen': 'not all scanned',
371
- 'sum.filesFailed': '{n} failed',
372
- 'sum.spotsFailed': '{n} spots failed',
373
- 'sum.moved': '{n} moved',
374
- 'sum.total': '{줄} total',
375
- 'sum.addedLines': '+{줄}',
376
- 'sum.noVision': 'this model cannot see images',
377
- 'sum.emptyAnswer': 'empty answer',
378
- 'sum.unread': '{n} unreadable',
379
- 'sum.doneOf': '{끝}/{전체} done',
380
- 'sum.justDone': '{n} just now',
381
- 'sum.noChange': 'unchanged',
382
- 'sum.verified': '{n} checked',
383
- 'sum.readAs': 'read via {쓴것}',
384
- 'sum.encGuess': '{인코딩} (guessed)',
385
- 'sum.linesOf': '{준}/{전체} lines',
386
- 'sum.countOf': '{n}/{전체}',
387
- 'sum.remembered': 'remembered ({n} lines)',
388
- 'sum.rememberFull': 'dropped the oldest to make room',
389
- 'sum.recall': '{맞음} of {전체} from past sessions',
390
- 'sum.jobStarted': 'started as job {n}',
391
- 'sum.jobRunning': 'running',
392
- 'sum.jobEndedAlready': 'already finished',
393
- 'sum.jobNotStopped': 'still running — could not stop it',
394
- 'sum.jobStopped': 'stopped',
395
-
396
- 'tier.exact': 'exact match',
397
- 'tier.trail': 'ignoring trailing spaces and line endings',
398
- 'tier.indent': 'ignoring indentation',
399
- 'tier.space': 'ignoring all whitespace',
400
-
401
- 'sum.image': 'image',
402
- 'sum.imageDropped': 'dropped {크기} of images',
403
-
404
- 'sum.broken': '{n} broken',
405
- 'sum.unverified': '{n} unchecked',
406
- 'lsp.noDef': 'no definition found. Try Grep.',
407
- 'lsp.defs': 'defined in {n}',
408
- 'lsp.noRefs': 'not used anywhere.',
409
- 'lsp.refs': 'used in {자리} across {파일}',
410
-
411
- 'sum.nothingToCheck': 'nothing to check',
412
- 'job.no': 'job {n}',
413
- 'job.stop': 'stop',
414
- 'more.files': 'and {n} more',
415
- 'more.spots': 'and {n} more spots',
416
-
417
- // ── Tool errors ───────────────────────────────────────────────────────
418
- 'err.noSuchFile': 'No such file: {경로}',
419
- 'err.alreadyThere': 'Already there: {경로}',
420
- 'err.overwriteHint': 'Pass overwrite: true to replace it.',
421
-
422
- // ── Chat screen ───────────────────────────────────────────────────────
423
- 'run.ctxProbe': 'Checking the context length this model was started with…',
424
- 'run.noStream': 'No streaming — the answer arrives all at once',
425
- 'run.hintHelp': '/help commands',
426
- 'run.hintEsc': 'ESC stop',
427
- 'run.hintQuit': 'Ctrl+C stop / quit',
428
- 'run.stopping': 'stopping…',
429
- 'run.errKept': 'What arrived before the failure was kept in the conversation — you can carry on from there.',
430
- 'ev.capped': 'The answer was cut off at {한계} tokens — raise the cap with /out, or have files written in parts',
431
- 'ev.cutoff': 'The server stopped the answer without saying it had finished — it may have been cut mid-way',
432
- 'ev.nudgeMissed': 'It was about to finish leaving {n} of the things you asked for undone — pushed back once',
433
- 'ev.nudgeRead': 'It was about to finish having only read things — pushed back once',
434
- 'ev.learnedCtx': 'Setting the context limit to {한계} as the server reported, and calling again',
435
- 'ev.learnedOut': 'Setting the answer-length limit to {한계} as the server reported, and calling again',
436
- 'ev.reset': 'Out of room — cleared {버린수} earlier messages and carrying on, {할일} to-do items left',
437
- 'ev.resetBare': 'Out of room — cleared {버린수} earlier messages and carrying on',
438
- 'paste.chip': 'pasted',
439
- 'paste.chipLines': '{n} lines',
440
- 'paste.folded': '{표} — folded away. It expands back verbatim when sent.',
441
- 'paste.pasted': 'Pasted {n} lines — Enter sends them all at once',
442
- 'run.thinking': 'thinking…',
443
- 'run.thinkingChars': 'thinking… {n} chars',
444
- 'run.turnFoot': '{초}s · {n} tool calls · ↑{입력} ↓{출력}',
445
- 'run.bye': 'Bye.',
446
- 'run.byeStats': '{n} model calls · {초}s in tools · ↑{입력} ↓{출력}',
447
- 'run.notMade': '— was not created',
448
- 'store.notSaving': 'This conversation is not being written to disk ({까닭}) — {n} lines lost. Close this window and you cannot resume it.',
449
-
450
- 'stage.plan': 'deciding',
451
- 'stage.work': 'continuing',
452
- 'stage.fix': 'stuck',
453
-
454
- // ── /tools · /status · /cost ──────────────────────────────────────────
455
- 'scr.tools': 'Tools',
456
- 'scr.conn': 'Connection',
457
- 'scr.session': 'This session',
458
- 'status.kind': 'API',
459
- 'status.url': 'URL',
460
- 'status.proxy': 'Proxy',
461
- 'status.proxyOff': 'unusable',
462
- 'status.model': 'Model',
463
- 'status.root': 'Work folder',
464
- 'status.shell': 'Shell',
465
- 'status.keyStore': 'Key store',
466
- 'status.rules': 'Rules',
467
- 'status.noRules': 'none (/init creates one)',
468
- 'status.rulesUnread': '{이름} exists but could not be read ({까닭}) — this folder\'s rules are not in effect',
469
- 'status.caps': 'Supports',
470
- 'status.capTools': 'tools',
471
- 'status.capStream': 'stream',
472
- 'status.capSchema': 'schema',
473
- 'status.capThink': 'reasoning',
474
- 'cost.calls': 'Model calls',
475
- 'cost.tokIn': 'Input tokens',
476
- 'cost.tokOut': 'Output tokens',
477
- 'cost.toolMs': 'Time in tools',
478
- 'cost.elapsed': 'Elapsed',
479
- 'cost.money': 'Cost',
480
- 'cost.quota': 'Server quota',
481
- 'cost.quotaAge': 'as of {초}s ago',
482
-
483
- // ── /context table ────────────────────────────────────────────────────
484
- 'scr.context': 'Context',
485
- 'unit.tokens': '{n} tokens',
486
- 'ctx.system': 'System prompt',
487
- 'ctx.rules': 'Rules ({이름})',
488
- 'ctx.rulesNone': 'Rules (none)',
489
- 'ctx.memory': 'Memory ({n} lines)',
490
- 'ctx.learned': 'What it has learned here',
491
- 'ctx.skills': 'Skill list ({실림}/{전체})',
492
- 'ctx.tools': 'Tool definitions',
493
- 'ctx.history': 'Conversation',
494
- 'ctx.toolResults': 'Tool results ({n} files)',
495
- 'ctx.left': 'Left',
496
- 'ctx.compactHint': 'shrink the conversation',
497
- 'ctx.clearHint': 'clear it all',
498
- 'ctx.calibrated': 'Adjusted by {부호}{퍼센트}% against what the server reported ({번} samples).',
499
- 'ctx.estimate': 'These are estimates no exact tokenizer is used.',
500
-
501
- // ── Fetching the key (safety/authcmd.js) ──────────────────────────────
502
- 'auth.waiting': 'waiting for your corporate login…',
503
- 'auth.got': 'Got a keygood for about {} min',
504
- 'auth.failed': 'Could not get a key {}',
505
- 'auth.from': 'fetched',
506
- 'auth.fromPolicy': 'fetched (admin policy)',
507
- 'auth.leftMin': '{분} min left',
508
- 'auth.notYet': 'not fetched yet',
509
-
510
- // ── Undo result lines ─────────────────────────────────────────────────
511
- 'undo.wayRestored': 'restored',
512
- 'undo.wayDeleted': 'deleted (did not exist before)',
513
-
514
- // ── Common ────────────────────────────────────────────────────────────
515
- 'common.unknownCommand': 'Unknown command',
516
- 'common.seeHelp': 'Run /help for the list',
517
- 'common.yes': 'yes',
518
- 'common.no': 'no',
519
- 'common.cfgSaveFailed': 'Could not write the setting to disk ({}) — it applies now but reverts on restart.',
520
- };
1
+ /**
2
+ * English.
3
+ *
4
+ * ── What this is, and what it is not ────────────────────────────────────
5
+ *
6
+ * deel is a Korean-language tool. The code stays Korean — functions and
7
+ * variables are named in Korean and that is deliberate. Only what shows up
8
+ * on screen is translated, and only so that someone who opens the repo can
9
+ * type `/help` and understand what they are looking at.
10
+ *
11
+ * Keys missing here fall back to Korean rather than to a blank. A blank is
12
+ * read as a bug; Korean is read as "not translated yet", which is the truth.
13
+ * `/lang` prints how much is done — see 옮긴만큼() in ./index.js.
14
+ *
15
+ * ── Wording rules ──────────────────────────────────────────────────────
16
+ *
17
+ * Keep the same directness as the Korean. The Korean text says what happens
18
+ * and what it costs you, not what the feature is called. Translate that,
19
+ * not the noun.
20
+ *
21
+ * Do not translate: command names (they are already English), `DEEL.md`,
22
+ * `MCP`, `ACP`, and the tool names (Read/Write/Bash/Verify…). Those are
23
+ * identifiers, and renaming them on screen would make the docs wrong.
24
+ */
25
+ export const en = {
26
+ // ── Slash commands ────────────────────────────────────────────────────
27
+ 'cmd.help.desc': 'list commands',
28
+ 'cmd.clear.desc': 'clear the conversation',
29
+ 'cmd.context.desc': 'show context usage',
30
+ 'cmd.ctx.desc': 'context length — re-measure for this model, or set it yourself',
31
+ 'cmd.ctx.arg': '[auto|number|640k]',
32
+ 'cmd.out.desc': 'cap on one reply — raise this if large files come back cut off',
33
+ 'cmd.out.arg': '[number|32k|auto]',
34
+ 'cmd.grade.desc': 'model class — how much it can do on its own. Not the same axis as window size',
35
+ 'cmd.grade.arg': '[small|medium|large|auto]',
36
+ 'cmd.compact.desc': 'shrink older turns',
37
+ 'cmd.model.desc': 'switch connection/model · `card` shows what this model has done here',
38
+ 'cmd.model.arg': '[name|list|models|card]',
39
+ 'cmd.think.desc': 'reasoning effort (off/low/medium/high/max)',
40
+ 'cmd.think.arg': '<level>',
41
+
42
+ // ── /think screen ──────────────────────────────────────────────────
43
+ 'run.noTools': 'Tool calling is unconfirmed — check with deel diagnose',
44
+ 'think.effort': 'Effort',
45
+ 'think.profile': 'Profile',
46
+ 'think.detail': 'detail',
47
+ 'think.harder': 'harder',
48
+ 'think.faster': 'faster',
49
+ 'think.eg': 'e.g.',
50
+ 'think.col.stage': 'Stage',
51
+ 'think.col.level': 'Effort',
52
+ 'think.col.cap': 'Out cap',
53
+ 'think.col.when': 'When',
54
+ 'think.cap.head': 'Caps are shared inside',
55
+ 'think.cap.tail': ' —',
56
+ 'think.cap.you': '(you set this)',
57
+ 'think.cap.server': '(read from the server)',
58
+ 'think.cap.guess': '(unknown, so a default)',
59
+ 'think.ctx': 'Context',
60
+ 'think.ctx.used': ' · used ',
61
+ 'think.nomodel': 'This connection does not apply effort at the model layer.',
62
+ 'think.nomodel.note': 'Only the per-stage output cap applies.',
63
+ 'cmd.mode.desc': 'approval policy — how much it asks first (auto/confirm/strict)',
64
+ 'cmd.mode.arg': '<mode>',
65
+ 'cmd.work.desc': 'work mode — what kind of job this is (picked for you in auto)',
66
+ 'cmd.work.arg': '[mode]',
67
+ 'cmd.auto.desc': 'work mode → auto (moves by itself with the request. Not /mode)',
68
+ 'cmd.code.desc': 'work mode → code (edits and builds)',
69
+ 'cmd.plan.desc': 'work mode → plan (plan first, no edits)',
70
+ 'cmd.architect.desc': 'work mode → architect (shapes the structure)',
71
+ 'cmd.debug.desc': 'work mode → debug (finds the cause)',
72
+ 'cmd.ask.desc': 'work mode → ask (explains only)',
73
+ 'cmd.orchestrator.desc': 'work mode → orchestrator (splits a big job up)',
74
+ 'cmd.undo.desc': 'undo the last turn — files and the conversation together',
75
+ 'cmd.undo.arg': '[turns]',
76
+ 'cmd.diff.desc': 'files changed this session, and what changed in them',
77
+ 'cmd.diff.arg': '[file]',
78
+ 'cmd.preview.desc': 'serve what you built, right here — nothing to deploy',
79
+ 'cmd.preview.arg': '[folder|off]',
80
+ 'cmd.tools.desc': 'show the tools available',
81
+ 'cmd.skills.desc': 'browse, search, and load skills',
82
+ 'cmd.skills.arg': '[search|all|off]',
83
+ 'cmd.plugin.desc': 'plugins — list, install, remove, bundle for air-gapped import',
84
+ 'cmd.plugin.arg': '[install|remove|pack]',
85
+ 'cmd.cost.desc': 'usage for this session',
86
+ 'cmd.status.desc': 'connection status',
87
+ 'cmd.scan.desc': 'scan this machine for local model servers',
88
+ 'cmd.scan.arg': '[save]',
89
+ 'cmd.thread.desc': 'threads — take a side track. Connection and undo history stay shared',
90
+ 'cmd.thread.arg': '[new|fork|close|number|name]',
91
+ 'cmd.learned.desc': 'what deel picked up on its own — commands that work here, this model’s habits',
92
+ 'cmd.learned.arg': '[clear]',
93
+ 'cmd.pin.desc': 'pin a line — survives folding and summarising',
94
+ 'cmd.pin.arg': '[text|clear number|clear all]',
95
+ 'cmd.evidence.desc': 'evidence — what changed and what proves it. Says what is unproven too',
96
+ 'cmd.evidence.arg': '[file]',
97
+ 'cmd.commit.desc': 'commit — stages only what this session changed; message from the diff and the evidence',
98
+ 'cmd.review.desc': 'review the changes in a fresh context — reports findings only, changes nothing',
99
+ 'cmd.paste.desc': 'attach the screenshot sitting in the clipboard (capture, then /paste)',
100
+ 'cmd.commit.arg': '[all|preview|title]',
101
+ 'cmd.sessions.desc': 'past sessions in this folder',
102
+ 'cmd.recall.desc': 'search past sessions — by what was said, not by title',
103
+ 'cmd.recall.arg': '<text>',
104
+ 'cmd.mcp.desc': 'show connected MCP tool servers',
105
+ 'cmd.memory.desc': 'what survives the session — view and clear',
106
+ 'cmd.memory.arg': '[forget <n>|clear|<text to remember>]',
107
+ 'cmd.level.desc': 'user level (beginner/developer)',
108
+ 'cmd.level.arg': '[level]',
109
+ 'cmd.keys.desc': 'press keys to see what your terminal actually sends — when new lines will not work',
110
+ 'cmd.bell.desc': 'bell and window title when a turn ends or deel needs you (on/off)',
111
+ 'cmd.bell.arg': '[on|off]',
112
+ 'cmd.motion.desc': 'what moves while deel works — knight, animals, office',
113
+ 'cmd.motion.arg': '[knight|animal|office|default|off]',
114
+ 'cmd.lang.desc': 'screen language — 한국어 / English',
115
+ 'cmd.lang.arg': '[ko|en] [prompt lang]',
116
+ 'cmd.init.desc': 'create a DEEL.md rules file',
117
+ 'cmd.exit.desc': 'quit',
118
+ 'cmd.quit.desc': 'quit',
119
+
120
+ 'cmd.consult.desc': 'ask a second model one question — your current model stays put',
121
+ 'cmd.consult.arg': '[profile <question>]',
122
+ 'consult.title': 'models configured on this machine',
123
+ 'consult.noProfiles': 'No profiles configured. Run /scan to look for local servers.',
124
+ 'consult.current': '(in use)',
125
+ 'consult.usage': 'Usage: /consult <profile> <question> e.g. /consult small what does this regex do?',
126
+ 'consult.questionOnly': 'Only the question is sent — this conversation does not go with it. Put the background you need into the question.',
127
+ 'consult.candidates': 'These match:',
128
+ 'consult.have': 'Available:',
129
+ 'consult.needQuestion': 'Add what you want to ask {이름}. e.g. /consult {이름} what does this error mean?',
130
+ 'consult.goesOut': '— this question leaves your machine',
131
+ 'consult.asking': 'asking {모델}…',
132
+ 'consult.system': 'You are a model another coding agent is consulting. Answer briefly and precisely. Say so when you do not know. You are being asked a question, not told to edit files.',
133
+ 'consult.failed': 'Could not ask — {왜}',
134
+ 'consult.empty': 'The reply came back empty. That model may not answer without tools.',
135
+ 'consult.added': 'Added that answer to the conversation, labelled with who said it.',
136
+ // ── Connection check ──────────────────────────────────────────────────
137
+ 'probe.codexOnly': 'The {모델} family is not served through this endpoint (/chat/completions) — OpenAI serves it only through the Responses API (/responses), which deel cannot speak yet. Pick a different model for now.',
138
+ // ── Startup header ────────────────────────────────────────────────────
139
+ 'head.spec.ollama': "Ollama's own API",
140
+ 'head.spec.openai': 'OpenAI-compatible API',
141
+ 'head.spec.anthropic': 'Anthropic API',
142
+ 'head.mode.default': 'inside (default)',
143
+ 'head.mode.online': 'outside (online)',
144
+ 'head.mode.offline': 'sealed (offline)',
145
+ 'head.model': 'model',
146
+ 'head.tokens': 'tokens',
147
+ 'head.grade': 'class',
148
+ 'head.guess': 'guessed',
149
+ 'head.send': 'sends to',
150
+ 'head.inside': 'this machine',
151
+ 'head.outside': 'outside',
152
+ 'head.offlineLock': '[offline lock]',
153
+ 'head.viaProxy': 'via proxy {프록시}',
154
+ 'head.proxyBad': '[proxy setting unusable — see /status]',
155
+ 'head.nowhereElse': '← and nowhere else',
156
+ 'head.glyphHint': 'The {안} at the start of the status bar means this. It becomes {밖} when traffic leaves.',
157
+ 'head.conn': 'link',
158
+ 'head.streaming': 'streaming',
159
+ 'head.noStreaming': 'no streaming',
160
+ 'head.tools': 'tools',
161
+ 'head.toolsUnknown': 'tools unconfirmed',
162
+ 'head.thinkCtl': 'effort control',
163
+ 'head.noThinkCtl': 'no effort control',
164
+ 'head.folder': 'folder',
165
+ 'head.approve': 'approval',
166
+ 'head.shiftTab': 'Shift+Tab',
167
+ 'head.shiftTabHint': ' changes it · ',
168
+ 'head.tabHint': 'Tab completes the / command you are typing',
169
+ 'head.newlineHint': 'New line: Alt+Enter (Option+Enter on Mac) breaks the line inside the box · if your terminal swallows it, end the line with space + ` then Enter',
170
+ 'head.star': 'Enjoying this tool? Star us on GitHub —',
171
+ 'head.thisPC': 'found',
172
+ 'head.skills': 'skills {n}',
173
+ 'head.commands': 'commands {n}',
174
+ 'head.plugins': 'plugins {n}',
175
+
176
+ 'grade.small': 'small',
177
+ 'grade.medium': 'medium',
178
+ 'grade.large': 'large',
179
+ 'head.gradeSuffix': ' · {급} {급이름}{짐작}',
180
+
181
+ // ── Status bar segments ───────────────────────────────────────────────
182
+ 'seg.dir': 'working folder (the ⌂/↗ in front says where your source goes)',
183
+ 'seg.ver': 'version',
184
+ 'seg.thread': 'thread',
185
+ 'seg.model': 'model name',
186
+ 'seg.grade': 'model class (how much it does on its own)',
187
+ 'seg.ctx': 'context used (ticks = where folding and summarising kick in)',
188
+ 'seg.work': 'work mode',
189
+ 'seg.think': 'reasoning effort and split',
190
+ 'seg.mode': 'approval policy',
191
+ 'seg.edits': 'files changed this session',
192
+ 'seg.verify': 'what was actually verified',
193
+ 'seg.undoable': 'turns you can still undo',
194
+ 'seg.tok': 'tokens in/out',
195
+ 'seg.cost': 'money spent (only when the price is known)',
196
+ 'seg.tools': 'tool calls',
197
+ 'seg.skills': 'skills found on this machine',
198
+ 'seg.time': 'time since start',
199
+
200
+ // ── Startup motion ────────────────────────────────────────────────────
201
+ 'intro.inside': 'stays on this machine',
202
+ 'intro.outside': 'leaves this machine',
203
+
204
+ // ── Undo ──────────────────────────────────────────────────────────────
205
+ 'undo.nothing': 'Nothing to undo.',
206
+ 'undo.done': 'Rolled back {turns} turn(s) · {files} file(s) restored.',
207
+ 'undo.alsoTalk': 'Rolled back {n} message(s) too — if the model still thinks the reverted code is there, it keeps building on it.',
208
+ 'undo.repaired': '({n} orphaned tool call(s) cleaned up as well)',
209
+ 'undo.saidWas': 'You had asked:',
210
+ 'undo.failed': '{n} file(s) could not be restored — they are still modified. The snapshots were kept, so try /undo again.',
211
+ 'undo.talkKept': 'The conversation is left as is — that turn had already been folded away.',
212
+ 'undo.talkKeptWhy': 'The model may still think the reverted work exists, so mention it in your next message.',
213
+
214
+ // ── Bell ──────────────────────────────────────────────────────────────
215
+ 'bell.stateOn': 'on',
216
+ 'bell.stateOff': 'off',
217
+ 'bell.now': 'The bell is {상태}.',
218
+ 'bell.when': 'It rings once when a turn takes longer than {초}s, and whenever deel needs an answer from you.',
219
+ 'bell.title': 'The window title shows the state too — you can tell from the tab alone whether it is still working.',
220
+ 'bell.howto': 'To change it',
221
+ 'bell.notATty': '(Not a terminal right now, so no bell and no title — that would corrupt the pipe.)',
222
+ 'bell.needOnOff': 'Please say on or off.',
223
+ 'bell.turnedOn': 'Bell on.',
224
+ 'bell.turnedOff': 'Bell off.',
225
+ 'bell.justRang': 'That was one ring. If you heard nothing, check your terminal’s bell setting.',
226
+ 'bell.appliesNow': 'Applies to this session right away.',
227
+
228
+ 'motion.now': 'Now:',
229
+ 'motion.plain': 'a one-cell spinner. Quiet',
230
+ 'motion.knight': 'a knight swings a sword. Sometimes gets flattened',
231
+ 'motion.animal': 'pixel animals wander about',
232
+ 'motion.office': 'twelve rows of office above the prompt — the work as a room',
233
+ 'motion.off': 'no drawing at all (for screen-reader users)',
234
+ 'motion.set': 'Switched to {것}.',
235
+ 'motion.appliesNow': 'Visible from the next frame. Saved to your config too.',
236
+ 'motion.unknown': '"{값}" is not one of the drawings.',
237
+ 'motion.pickOne': 'Pick one of:',
238
+ 'motion.envWins': 'DEEL_MOTION / DEEL_OFFICE is set, and the environment wins.',
239
+ 'motion.tooSmall': 'This terminal is {줄} x {칸} — the office needs at least {최소줄} rows and {최소칸} columns.',
240
+ 'motion.appleTerminal': "macOS Terminal spaces lines apart, so the room gets horizontal seams — Terminal › Settings › Profiles › Text › Font \"Change\" › set Line Spacing to 1.0. (iTerm2 defaults to 1.0, which is why it looks right there)",
241
+
242
+ // ── Screen language ───────────────────────────────────────────────────
243
+ 'lang.now': 'Screen language is {이름}.',
244
+ 'lang.ko': '한국어 (Korean)',
245
+ 'lang.ja': '日本語 (Japanese)',
246
+ 'lang.zh': '中文 (Chinese)',
247
+ 'lang.en': 'English',
248
+ 'lang.howto': 'To change it',
249
+ 'lang.changed': 'Screen language is now {이름}.',
250
+ 'lang.unknown': 'Please say ko or en.',
251
+ 'lang.progress': '{언어}: {옮김} of {전체} strings translated. The rest come through in Korean.',
252
+ 'lang.partial': 'Not everything is translated yet — untranslated lines show Korean rather than a blank.',
253
+ 'lang.codeStays': 'Unless you set it separately, what the model reads follows the screen. Code, tool names and argument names stay as they are.',
254
+ 'lang.promptNow': 'The model is instructed in {이름}.',
255
+ 'lang.follows': 'the same as the screen',
256
+ 'lang.splitHowto': 'To be instructed in English while the screen stays in your language:',
257
+ 'lang.promptChanged': 'Instructions in {이름}, answers in {답} — 23% off the fixed share on an 8k window.',
258
+ 'lang.envHint': 'To start in English every time, set DEEL_LANG=en',
259
+
260
+ 'cmd.lsp.desc': 'language servers — what is installed, and whether Def/Refs are available',
261
+ 'cmd.lsp.arg': '[on|off]',
262
+ 'lsp.found': '{수} language server(s) on this machine',
263
+ 'lsp.none': 'No language server on this machine. Falling back to Grep and Outline.',
264
+ 'lsp.thisFolder': 'Language of this folder:',
265
+ 'lsp.noneHere': 'none usable',
266
+ 'lsp.fileCount': '{수} files',
267
+ 'lsp.tools': 'Tools:',
268
+ 'lsp.toolsHidden': 'hidden (no server here)',
269
+ 'lsp.diag': 'Diagnostics after an edit:',
270
+ 'lsp.stateOn': 'on',
271
+ 'lsp.stateOff': 'off',
272
+ 'lsp.ready': 'ready',
273
+ 'lsp.starting': 'starting',
274
+ 'lsp.diagOn': 'Diagnostics after an edit are on.',
275
+ 'lsp.diagOff': 'Diagnostics after an edit are off. Def and Refs still work.',
276
+ 'lsp.installHint': 'Install one and Def / Refs appear:',
277
+ 'lsp.neverInstalls': 'deel installs nothing. Those are commands for you to run yourself.',
278
+ 'lsp.howto': 'Turn post-edit diagnostics on or off:',
279
+
280
+ 'cmd.export.desc': 'this conversation as a one-page HTML report — asked, changed, verified',
281
+ 'cmd.export.arg': '[filename]',
282
+ 'export.untitled': 'Untitled conversation',
283
+ 'export.model': 'Model',
284
+ 'export.calls': '{수} tool calls',
285
+ 'export.conversation': 'What was asked and answered',
286
+ 'export.you': 'You',
287
+ 'export.nothing': 'Nothing was said.',
288
+ 'export.changed': 'Changed files',
289
+ 'export.file': 'File',
290
+ 'export.times': 'Times',
291
+ 'export.noChanges': 'No files were changed.',
292
+ 'export.evidence': 'What was run',
293
+ 'export.nothingRan': 'No commands were run.',
294
+ 'export.unproven': 'Not proven',
295
+ 'export.allProven': 'None — every change has a later check behind it.',
296
+ 'export.footer': 'Report generated by deel. No outbound links — opens on any network.',
297
+ 'export.saved': 'Report saved:',
298
+ 'export.openHint': 'Double-click to open. Attach it to a review or report as-is.',
299
+ 'export.failed': 'Could not save the report. Check folder permissions.',
300
+
301
+
302
+ // ── Help, approval policy, user level ─────────────────────────────────
303
+ 'help.titleCommon': 'commands (the ones you will use)',
304
+ 'help.title': 'commands',
305
+ 'help.moreHidden': '{n} more exist — type them and they run just the same.',
306
+ 'help.showAll': 'To see all of them',
307
+ 'help.restGoesToModel': 'Anything else goes to the model. Ctrl+C on an empty line quits.',
308
+ 'approve.auto.name': 'auto-approve',
309
+ 'approve.auto.short': 'auto',
310
+ 'approve.auto.line': 'edits without asking. /undo is the safety net',
311
+ 'approve.confirm.name': 'risky only',
312
+ 'approve.confirm.short': 'risky',
313
+ 'approve.confirm.line': 'asks before commands it cannot take back. Files are edited without asking',
314
+ 'approve.strict.name': 'ask always',
315
+ 'approve.strict.short': 'always',
316
+ 'approve.strict.line': 'asks before every file edit and every command',
317
+ 'level.beginner.name': 'beginner',
318
+ 'level.beginner.hint': 'start on the recommended settings',
319
+ 'level.developer.name': 'developer',
320
+ 'level.developer.hint': 'everything by hand',
321
+
322
+ // ── Ask box (the Ask tool) ────────────────────────────────────────────
323
+ 'plan.ask': 'Go ahead with this?',
324
+ 'plan.hint': '⏎ go · y with a note · 3 a note on that step · n cancel',
325
+ 'plan.cancelled': 'Stopped. The plan is still above — just say what you want next.',
326
+ 'plan.going': 'Going ahead with the plan.',
327
+ 'plan.goingWith': 'Going ahead, with your note — {말}',
328
+ 'plan.replan': 'Redoing the plan with that in mind.',
329
+ 'plan.replanStep': 'Redoing the plan with your note on step {단계}.',
330
+ 'ask.title': 'A question for you',
331
+ 'ask.pickHint': 'Pick a number. Add a note after it if you have one (2 split the files)',
332
+ 'ask.freeHint': 'Type your answer',
333
+ 'ask.pickPrompt': '1-{끝} (a note may follow), or type your own',
334
+ 'ask.freePrompt': 'Answer',
335
+ 'ask.stopped': 'Stopped — treating it as unanswered.',
336
+
337
+ // ── When the server pushes back (backend/retry.js) ────────────────────
338
+ 'loop.backoff': 'The server pushed back ({무엇}) — calling again in {초}s ({n}/{max})',
339
+ 'cost.retries': 'retries',
340
+
341
+ // ── Counted things ────────────────────────────────────────────────────
342
+ // Singular keys exist because English needs them; Korean reuses one word.
343
+ 'unit.files': '{n} files',
344
+ 'unit.files1': '1 file',
345
+ 'unit.hits': '{n} hits',
346
+ 'unit.hits1': '1 hit',
347
+ 'unit.lines': '{n} lines',
348
+ 'unit.lines1': '1 line',
349
+ 'unit.spots': '{n} spots',
350
+ 'unit.spots1': '1 spot',
351
+ 'unit.places': '{n} places',
352
+ 'unit.places1': '1 place',
353
+ 'unit.count': '{n}',
354
+ 'unit.count1': '1',
355
+ 'unit.chars': '{n} chars',
356
+ 'unit.kchars': '{n}k chars',
357
+ 'unit.calls': '{n} calls',
358
+ 'unit.sec': '{n}s',
359
+ 'unit.min': '{n} min',
360
+
361
+ // ── Tool result line ──────────────────────────────────────────────────
362
+ 'sum.done': 'done',
363
+ 'sum.ok': 'ok',
364
+ 'sum.exitCode': 'exit {code}',
365
+ 'sum.killedBy': 'killed by {시그널}',
366
+ 'sum.tooMuchOut': 'output too large — capture cut short',
367
+ 'sum.cantRun': 'could not run ({왜})',
368
+ 'sum.partial': 'partial',
369
+ 'sum.cut': 'truncated',
370
+ 'sum.notAllSeen': 'not all scanned',
371
+ 'sum.filesFailed': '{n} failed',
372
+ 'sum.spotsFailed': '{n} spots failed',
373
+ 'sum.moved': '{n} moved',
374
+ 'sum.total': '{줄} total',
375
+ 'sum.addedLines': '+{줄}',
376
+ 'sum.noVision': 'this model cannot see images',
377
+ 'sum.emptyAnswer': 'empty answer',
378
+ 'sum.unread': '{n} unreadable',
379
+ 'sum.doneOf': '{끝}/{전체} done',
380
+ 'sum.justDone': '{n} just now',
381
+ 'sum.noChange': 'unchanged',
382
+ 'sum.verified': '{n} checked',
383
+ 'sum.readAs': 'read via {쓴것}',
384
+ 'sum.encGuess': '{인코딩} (guessed)',
385
+ 'sum.linesOf': '{준}/{전체} lines',
386
+ 'sum.countOf': '{n}/{전체}',
387
+ 'sum.remembered': 'remembered ({n} lines)',
388
+ 'sum.rememberFull': 'dropped the oldest to make room',
389
+ 'sum.recall': '{맞음} of {전체} from past sessions',
390
+ 'sum.jobStarted': 'started as job {n}',
391
+ 'sum.jobRunning': 'running',
392
+ 'sum.jobEndedAlready': 'already finished',
393
+ 'sum.jobNotStopped': 'still running — could not stop it',
394
+ 'sum.jobStopped': 'stopped',
395
+
396
+ 'tier.exact': 'exact match',
397
+ 'tier.trail': 'ignoring trailing spaces and line endings',
398
+ 'tier.indent': 'ignoring indentation',
399
+ 'tier.space': 'ignoring all whitespace',
400
+
401
+ 'sum.image': 'image',
402
+ 'sum.imageDropped': 'dropped {크기} of images',
403
+
404
+ 'sum.broken': '{n} broken',
405
+ 'sum.unverified': '{n} unchecked',
406
+ 'lsp.noDef': 'no definition found. Try Grep.',
407
+ 'lsp.defs': 'defined in {n}',
408
+ 'lsp.noRefs': 'not used anywhere.',
409
+ 'lsp.refs': 'used in {자리} across {파일}',
410
+
411
+ 'sum.nothingToCheck': 'nothing to check',
412
+ 'job.no': 'job {n}',
413
+ 'job.stop': 'stop',
414
+ 'more.files': 'and {n} more',
415
+ 'more.spots': 'and {n} more spots',
416
+
417
+ // ── Tool errors ───────────────────────────────────────────────────────
418
+ 'err.noSuchFile': 'No such file: {경로}',
419
+ 'err.alreadyThere': 'Already there: {경로}',
420
+ 'err.overwriteHint': 'Pass overwrite: true to replace it.',
421
+
422
+ // ── Chat screen ───────────────────────────────────────────────────────
423
+ 'run.ctxProbe': 'Checking the context length this model was started with…',
424
+ 'run.noStream': 'No streaming — the answer arrives all at once',
425
+ 'run.hintHelp': '/help commands',
426
+ 'run.hintEsc': 'ESC stop',
427
+ 'run.hintQuit': 'Ctrl+C stop / quit',
428
+ 'run.stopping': 'stopping…',
429
+ 'run.errKept': 'What arrived before the failure was kept in the conversation — you can carry on from there.',
430
+ 'ev.capped': 'The answer was cut off at {한계} tokens — raise the cap with /out, or have files written in parts',
431
+ 'ev.cutoff': 'The server stopped the answer without saying it had finished — it may have been cut mid-way',
432
+ 'ev.nudgeMissed': 'It was about to finish leaving {n} of the things you asked for undone — pushed back once',
433
+ 'ev.nudgeRead': 'It was about to finish having only read things — pushed back once',
434
+ 'ev.learnedCtx': 'Setting the context limit to {한계} as the server reported, and calling again',
435
+ 'ev.learnedOut': 'Setting the answer-length limit to {한계} as the server reported, and calling again',
436
+ 'ev.reset': 'Out of room — cleared {버린수} earlier messages and carrying on, {할일} to-do items left',
437
+ 'ev.resetBare': 'Out of room — cleared {버린수} earlier messages and carrying on',
438
+ 'paste.chip': 'pasted',
439
+ 'paste.chipLines': '{n} lines',
440
+ 'paste.folded': '{표} — folded away. It expands back verbatim when sent.',
441
+ 'paste.pasted': 'Pasted {n} lines — Enter sends them all at once',
442
+ 'run.thinking': 'thinking…',
443
+ 'run.thinkingChars': 'thinking… {n} chars',
444
+ 'run.turnFoot': '{초}s · {n} tool calls · ↑{입력} ↓{출력}',
445
+ 'run.bye': 'Bye.',
446
+ 'run.byeStats': '{n} model calls · {초}s in tools · ↑{입력} ↓{출력}',
447
+ 'run.notMade': '— was not created',
448
+ 'store.notSaving': 'This conversation is not being written to disk ({까닭}) — {n} lines lost. Close this window and you cannot resume it.',
449
+
450
+ 'stage.plan': 'deciding',
451
+ 'stage.work': 'continuing',
452
+ 'stage.fix': 'stuck',
453
+
454
+ // ── /tools · /status · /cost ──────────────────────────────────────────
455
+ 'scr.tools': 'Tools',
456
+ 'scr.conn': 'Connection',
457
+ 'scr.session': 'This session',
458
+ 'status.kind': 'API',
459
+ 'status.url': 'URL',
460
+ 'status.proxy': 'Proxy',
461
+ 'status.proxyOff': 'unusable',
462
+ 'status.model': 'Model',
463
+ 'status.root': 'Work folder',
464
+ 'status.shell': 'Shell',
465
+ 'status.keyStore': 'Key store',
466
+ 'status.rules': 'Rules',
467
+ 'status.noRules': 'none (/init creates one)',
468
+ 'status.rulesUnread': '{이름} exists but could not be read ({까닭}) — this folder\'s rules are not in effect',
469
+ 'status.caps': 'Supports',
470
+ 'status.capTools': 'tools',
471
+ 'status.capStream': 'stream',
472
+ 'status.capSchema': 'schema',
473
+ 'status.capThink': 'reasoning',
474
+ 'cost.calls': 'Model calls',
475
+ 'cost.tokIn': 'Input tokens',
476
+ 'cost.tokOut': 'Output tokens',
477
+ 'cost.toolMs': 'Time in tools',
478
+ 'cost.elapsed': 'Elapsed',
479
+ 'cost.money': 'Cost',
480
+ // ── Cache, wire card, automatic effort ────────────────────────────────
481
+ 'status.wire': 'wire',
482
+ 'wire.think': 'thinking',
483
+ 'run.refusal': 'The model declined this request — stopping here instead of pushing again',
484
+ 'run.refusalWhy': 'reason {왜}',
485
+ 'wire.rungs': 'rungs',
486
+ 'wire.cache': 'cache',
487
+ 'wire.none': 'none',
488
+ 'wire.cacheMarked': 'marked',
489
+ 'wire.cacheKey': 'key',
490
+ 'wire.cacheAuto': 'server-side',
491
+ 'cost.cache': 'Cache',
492
+ 'cost.think': 'Thinking',
493
+ 'cost.thinkLine': '{토큰} tokens · {몫}% of output',
494
+ 'cost.cacheLine': 'read {읽음} · written {} · {몫}% hit',
495
+ 'cost.cacheColdWarn': 'written but never read — the prefix is being rebuilt every time',
496
+ 'think.auto': 'auto',
497
+ 'think.autoNote': 'your setting is a ceiling ({천장}) — light turns run at {지금}',
498
+ 'think.autoOn': 'Effort now follows the request your setting becomes the ceiling',
499
+ 'think.autoOff': 'Effort stays exactly where you set it',
500
+ 'think.wire': 'wire',
501
+ 'think.wireSends': 'sends {값}',
502
+ 'think.wireNoOff': 'this endpoint never told us its off value — the field is omitted, so the server default applies',
503
+ 'loop.wire': 'The server does not take that field retrying with it adjusted ({무엇})',
504
+ 'loop.quotaAhead': 'Quota is empty waiting {}s before sending',
505
+ 'cost.quota': 'Server quota',
506
+ 'cost.quotaAge': 'as of {초}s ago',
507
+
508
+ // ── /context table ────────────────────────────────────────────────────
509
+ 'scr.context': 'Context',
510
+ 'unit.tokens': '{n} tokens',
511
+ 'ctx.system': 'System prompt',
512
+ 'ctx.rules': 'Rules ({이름})',
513
+ 'ctx.rulesNone': 'Rules (none)',
514
+ 'ctx.memory': 'Memory ({n} lines)',
515
+ 'ctx.learned': 'What it has learned here',
516
+ 'ctx.skills': 'Skill list ({실림}/{전체})',
517
+ 'ctx.tools': 'Tool definitions',
518
+ 'ctx.history': 'Conversation',
519
+ 'ctx.toolResults': 'Tool results ({n} files)',
520
+ 'ctx.left': 'Left',
521
+ 'ctx.compactHint': 'shrink the conversation',
522
+ 'ctx.clearHint': 'clear it all',
523
+ 'ctx.calibrated': 'Adjusted by {부호}{퍼센트}% against what the server reported ({번} samples).',
524
+ 'ctx.estimate': 'These are estimates — no exact tokenizer is used.',
525
+
526
+ // ── Fetching the key (safety/authcmd.js) ──────────────────────────────
527
+ 'auth.waiting': 'waiting for your corporate login…',
528
+ 'auth.got': 'Got a key — good for about {분} min',
529
+ 'auth.failed': 'Could not get a key — {왜}',
530
+ 'auth.from': 'fetched',
531
+ 'auth.fromPolicy': 'fetched (admin policy)',
532
+ 'auth.leftMin': '{분} min left',
533
+ 'auth.notYet': 'not fetched yet',
534
+
535
+ // ── Undo result lines ─────────────────────────────────────────────────
536
+ 'undo.wayRestored': 'restored',
537
+ 'undo.wayDeleted': 'deleted (did not exist before)',
538
+
539
+ // ── Common ────────────────────────────────────────────────────────────
540
+ 'common.unknownCommand': 'Unknown command',
541
+ 'common.seeHelp': 'Run /help for the list',
542
+ 'common.yes': 'yes',
543
+ 'common.no': 'no',
544
+ 'common.cfgSaveFailed': 'Could not write the setting to disk ({왜}) — it applies now but reverts on restart.',
545
+ };