deel-local-cli 1.6.3 → 1.8.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.
- package/README.ko.md +1182 -0
- package/README.md +850 -636
- package/bin/deel.js +44 -3
- package/package.json +3 -3
- package/src/acp/map.js +1 -1
- package/src/acp/serve.js +25 -2
- package/src/agent/loop.js +41 -9
- package/src/agent/session.js +15 -9
- package/src/backend/adapter.js +277 -4
- package/src/backend/ctxsize.js +16 -2
- package/src/backend/detect.js +104 -6
- package/src/backend/price.js +197 -0
- package/src/backend/retry.js +3 -0
- package/src/backend/scanui.js +2 -1
- package/src/backend/vision.js +26 -4
- package/src/commands.js +141 -38
- package/src/completion.js +21 -2
- package/src/i18n/en.js +160 -1
- package/src/i18n/index.js +22 -0
- package/src/i18n/ja.js +152 -1
- package/src/i18n/ko.js +173 -1
- package/src/i18n/zh.js +152 -1
- package/src/oneshot.js +39 -6
- package/src/pack/selfpack.js +1 -1
- package/src/providers/anthropic.js +48 -0
- package/src/providers/bedrock.js +102 -0
- package/src/providers/custom.js +65 -0
- package/src/providers/gemini.js +64 -0
- package/src/providers/index.js +121 -0
- package/src/providers/openai.js +68 -0
- package/src/repl.js +198 -33
- package/src/report.js +3 -2
- package/src/reset.js +397 -0
- package/src/safety/audit.js +5 -2
- package/src/safety/authcmd.js +305 -0
- package/src/safety/keystore.js +53 -0
- package/src/safety/runmode.js +123 -0
- package/src/safety/secrets.js +61 -0
- package/src/safety/undo.js +3 -2
- package/src/setup.js +215 -12
- package/src/tools/desc.en.js +19 -14
- package/src/tools/index.js +141 -43
- package/src/tools/jobs.js +17 -13
- package/src/tools/lsp.js +5 -4
- package/src/tools/outline.js +7 -3
- package/src/tools/task.js +10 -6
- package/src/tools/todo.js +9 -2
- package/src/tools/verify.js +9 -3
- package/src/tools/webfetch.js +2 -1
- package/src/ui/export.js +1 -1
- package/src/ui/histline.js +67 -0
- package/src/ui/status.js +88 -3
- package/README.en.md +0 -1025
package/src/i18n/en.js
CHANGED
|
@@ -112,8 +112,12 @@ export const en = {
|
|
|
112
112
|
'consult.empty': 'The reply came back empty. That model may not answer without tools.',
|
|
113
113
|
'consult.added': 'Added that answer to the conversation, labelled with who said it.',
|
|
114
114
|
// ── Startup header ────────────────────────────────────────────────────
|
|
115
|
-
'head.spec.ollama': '
|
|
115
|
+
'head.spec.ollama': "Ollama's own API",
|
|
116
116
|
'head.spec.openai': 'OpenAI-compatible API',
|
|
117
|
+
'head.spec.anthropic': 'Anthropic API',
|
|
118
|
+
'head.mode.default': 'inside (default)',
|
|
119
|
+
'head.mode.online': 'outside (online)',
|
|
120
|
+
'head.mode.offline': 'sealed (offline)',
|
|
117
121
|
'head.model': 'model',
|
|
118
122
|
'head.tokens': 'tokens',
|
|
119
123
|
'head.grade': 'class',
|
|
@@ -152,6 +156,7 @@ export const en = {
|
|
|
152
156
|
|
|
153
157
|
// ── Status bar segments ───────────────────────────────────────────────
|
|
154
158
|
'seg.dir': 'working folder (the ⌂/↗ in front says where your source goes)',
|
|
159
|
+
'seg.ver': 'version',
|
|
155
160
|
'seg.thread': 'thread',
|
|
156
161
|
'seg.model': 'model name',
|
|
157
162
|
'seg.grade': 'model class (how much it does on its own)',
|
|
@@ -163,6 +168,7 @@ export const en = {
|
|
|
163
168
|
'seg.verify': 'what was actually verified',
|
|
164
169
|
'seg.undoable': 'turns you can still undo',
|
|
165
170
|
'seg.tok': 'tokens in/out',
|
|
171
|
+
'seg.cost': 'money spent (only when the price is known)',
|
|
166
172
|
'seg.tools': 'tool calls',
|
|
167
173
|
'seg.skills': 'skills found on this machine',
|
|
168
174
|
'seg.time': 'time since start',
|
|
@@ -299,6 +305,159 @@ export const en = {
|
|
|
299
305
|
'loop.backoff': 'The server pushed back ({무엇}) — calling again in {초}s ({n}/{max})',
|
|
300
306
|
'cost.retries': 'retries',
|
|
301
307
|
|
|
308
|
+
// ── Counted things ────────────────────────────────────────────────────
|
|
309
|
+
// Singular keys exist because English needs them; Korean reuses one word.
|
|
310
|
+
'unit.files': '{n} files',
|
|
311
|
+
'unit.files1': '1 file',
|
|
312
|
+
'unit.hits': '{n} hits',
|
|
313
|
+
'unit.hits1': '1 hit',
|
|
314
|
+
'unit.lines': '{n} lines',
|
|
315
|
+
'unit.lines1': '1 line',
|
|
316
|
+
'unit.spots': '{n} spots',
|
|
317
|
+
'unit.spots1': '1 spot',
|
|
318
|
+
'unit.places': '{n} places',
|
|
319
|
+
'unit.places1': '1 place',
|
|
320
|
+
'unit.count': '{n}',
|
|
321
|
+
'unit.count1': '1',
|
|
322
|
+
'unit.chars': '{n} chars',
|
|
323
|
+
'unit.kchars': '{n}k chars',
|
|
324
|
+
'unit.calls': '{n} calls',
|
|
325
|
+
'unit.sec': '{n}s',
|
|
326
|
+
'unit.min': '{n} min',
|
|
327
|
+
|
|
328
|
+
// ── Tool result line ──────────────────────────────────────────────────
|
|
329
|
+
'sum.done': 'done',
|
|
330
|
+
'sum.ok': 'ok',
|
|
331
|
+
'sum.exitCode': 'exit {code}',
|
|
332
|
+
'sum.killedBy': 'killed by {시그널}',
|
|
333
|
+
'sum.partial': 'partial',
|
|
334
|
+
'sum.cut': 'truncated',
|
|
335
|
+
'sum.notAllSeen': 'not all scanned',
|
|
336
|
+
'sum.filesFailed': '{n} failed',
|
|
337
|
+
'sum.spotsFailed': '{n} spots failed',
|
|
338
|
+
'sum.moved': '{n} moved',
|
|
339
|
+
'sum.total': '{줄} total',
|
|
340
|
+
'sum.addedLines': '+{줄}',
|
|
341
|
+
'sum.noVision': 'this model cannot see images',
|
|
342
|
+
'sum.emptyAnswer': 'empty answer',
|
|
343
|
+
'sum.unread': '{n} unreadable',
|
|
344
|
+
'sum.doneOf': '{끝}/{전체} done',
|
|
345
|
+
'sum.justDone': '{n} just now',
|
|
346
|
+
'sum.noChange': 'unchanged',
|
|
347
|
+
'sum.verified': '{n} checked',
|
|
348
|
+
'sum.readAs': 'read via {쓴것}',
|
|
349
|
+
'sum.linesOf': '{준}/{전체} lines',
|
|
350
|
+
'sum.countOf': '{n}/{전체}',
|
|
351
|
+
'sum.remembered': 'remembered ({n} lines)',
|
|
352
|
+
'sum.rememberFull': 'dropped the oldest to make room',
|
|
353
|
+
'sum.recall': '{맞음} of {전체} from past sessions',
|
|
354
|
+
'sum.jobStarted': 'started as job {n}',
|
|
355
|
+
'sum.jobRunning': 'running',
|
|
356
|
+
'sum.jobEndedAlready': 'already finished',
|
|
357
|
+
'sum.jobStopped': 'stopped',
|
|
358
|
+
|
|
359
|
+
'tier.exact': 'exact match',
|
|
360
|
+
'tier.trail': 'ignoring trailing spaces and line endings',
|
|
361
|
+
'tier.indent': 'ignoring indentation',
|
|
362
|
+
'tier.space': 'ignoring all whitespace',
|
|
363
|
+
|
|
364
|
+
'sum.image': 'image',
|
|
365
|
+
'sum.imageDropped': 'dropped {크기} of images',
|
|
366
|
+
|
|
367
|
+
'sum.broken': '{n} broken',
|
|
368
|
+
'sum.unverified': '{n} unchecked',
|
|
369
|
+
'lsp.noDef': 'no definition found. Try Grep.',
|
|
370
|
+
'lsp.defs': 'defined in {n}',
|
|
371
|
+
'lsp.noRefs': 'not used anywhere.',
|
|
372
|
+
'lsp.refs': 'used in {자리} across {파일}',
|
|
373
|
+
|
|
374
|
+
'sum.nothingToCheck': 'nothing to check',
|
|
375
|
+
'job.no': 'job {n}',
|
|
376
|
+
'job.stop': 'stop',
|
|
377
|
+
'more.files': 'and {n} more',
|
|
378
|
+
'more.spots': 'and {n} more spots',
|
|
379
|
+
|
|
380
|
+
// ── Tool errors ───────────────────────────────────────────────────────
|
|
381
|
+
'err.noSuchFile': 'No such file: {경로}',
|
|
382
|
+
'err.alreadyThere': 'Already there: {경로}',
|
|
383
|
+
'err.overwriteHint': 'Pass overwrite: true to replace it.',
|
|
384
|
+
|
|
385
|
+
// ── Chat screen ───────────────────────────────────────────────────────
|
|
386
|
+
'run.ctxProbe': 'Checking the context length this model was started with…',
|
|
387
|
+
'run.noStream': 'No streaming — the answer arrives all at once',
|
|
388
|
+
'run.hintHelp': '/help commands',
|
|
389
|
+
'run.hintEsc': 'ESC stop',
|
|
390
|
+
'run.hintQuit': 'Ctrl+C stop / quit',
|
|
391
|
+
'run.thinking': 'thinking…',
|
|
392
|
+
'run.thinkingChars': 'thinking… {n} chars',
|
|
393
|
+
'run.turnFoot': '{초}s · {n} tool calls · ↑{입력} ↓{출력}',
|
|
394
|
+
'run.bye': 'Bye.',
|
|
395
|
+
'run.byeStats': '{n} model calls · {초}s in tools · ↑{입력} ↓{출력}',
|
|
396
|
+
'run.notMade': '— was not created',
|
|
397
|
+
|
|
398
|
+
'stage.plan': 'deciding',
|
|
399
|
+
'stage.work': 'continuing',
|
|
400
|
+
'stage.fix': 'stuck',
|
|
401
|
+
|
|
402
|
+
// ── /tools · /status · /cost ──────────────────────────────────────────
|
|
403
|
+
'scr.tools': 'Tools',
|
|
404
|
+
'scr.conn': 'Connection',
|
|
405
|
+
'scr.session': 'This session',
|
|
406
|
+
'status.kind': 'API',
|
|
407
|
+
'status.url': 'URL',
|
|
408
|
+
'status.proxy': 'Proxy',
|
|
409
|
+
'status.proxyOff': 'unusable',
|
|
410
|
+
'status.model': 'Model',
|
|
411
|
+
'status.root': 'Work folder',
|
|
412
|
+
'status.shell': 'Shell',
|
|
413
|
+
'status.keyStore': 'Key store',
|
|
414
|
+
'status.rules': 'Rules',
|
|
415
|
+
'status.noRules': 'none (/init creates one)',
|
|
416
|
+
'status.caps': 'Supports',
|
|
417
|
+
'status.capTools': 'tools',
|
|
418
|
+
'status.capStream': 'stream',
|
|
419
|
+
'status.capSchema': 'schema',
|
|
420
|
+
'status.capThink': 'reasoning',
|
|
421
|
+
'cost.calls': 'Model calls',
|
|
422
|
+
'cost.tokIn': 'Input tokens',
|
|
423
|
+
'cost.tokOut': 'Output tokens',
|
|
424
|
+
'cost.toolMs': 'Time in tools',
|
|
425
|
+
'cost.elapsed': 'Elapsed',
|
|
426
|
+
'cost.money': 'Cost',
|
|
427
|
+
'cost.quota': 'Server quota',
|
|
428
|
+
'cost.quotaAge': 'as of {초}s ago',
|
|
429
|
+
|
|
430
|
+
// ── /context table ────────────────────────────────────────────────────
|
|
431
|
+
'scr.context': 'Context',
|
|
432
|
+
'unit.tokens': '{n} tokens',
|
|
433
|
+
'ctx.system': 'System prompt',
|
|
434
|
+
'ctx.rules': 'Rules ({이름})',
|
|
435
|
+
'ctx.rulesNone': 'Rules (none)',
|
|
436
|
+
'ctx.memory': 'Memory ({n} lines)',
|
|
437
|
+
'ctx.learned': 'What it has learned here',
|
|
438
|
+
'ctx.skills': 'Skill list ({실림}/{전체})',
|
|
439
|
+
'ctx.tools': 'Tool definitions',
|
|
440
|
+
'ctx.history': 'Conversation',
|
|
441
|
+
'ctx.toolResults': 'Tool results ({n} files)',
|
|
442
|
+
'ctx.left': 'Left',
|
|
443
|
+
'ctx.compactHint': 'shrink the conversation',
|
|
444
|
+
'ctx.clearHint': 'clear it all',
|
|
445
|
+
'ctx.calibrated': 'Adjusted by {부호}{퍼센트}% against what the server reported ({번} samples).',
|
|
446
|
+
'ctx.estimate': 'These are estimates — no exact tokenizer is used.',
|
|
447
|
+
|
|
448
|
+
// ── Fetching the key (safety/authcmd.js) ──────────────────────────────
|
|
449
|
+
'auth.waiting': 'waiting for your corporate login…',
|
|
450
|
+
'auth.got': 'Got a key — good for about {분} min',
|
|
451
|
+
'auth.failed': 'Could not get a key — {왜}',
|
|
452
|
+
'auth.from': 'fetched',
|
|
453
|
+
'auth.fromPolicy': 'fetched (admin policy)',
|
|
454
|
+
'auth.leftMin': '{분} min left',
|
|
455
|
+
'auth.notYet': 'not fetched yet',
|
|
456
|
+
|
|
457
|
+
// ── Undo result lines ─────────────────────────────────────────────────
|
|
458
|
+
'undo.wayRestored': 'restored',
|
|
459
|
+
'undo.wayDeleted': 'deleted (did not exist before)',
|
|
460
|
+
|
|
302
461
|
// ── Common ────────────────────────────────────────────────────────────
|
|
303
462
|
'common.unknownCommand': 'Unknown command',
|
|
304
463
|
'common.seeHelp': 'Run /help for the list',
|
package/src/i18n/index.js
CHANGED
|
@@ -201,6 +201,28 @@ export function 말(열쇠, 채움 = null) {
|
|
|
201
201
|
});
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
+
/*
|
|
205
|
+
* 세는 말 한 조각 — `3개 파일` · `1건` · `12줄`.
|
|
206
|
+
*
|
|
207
|
+
* 도구 결과 한 줄은 이 조각들을 ` · ` 로 이어 만든다. 왜 통짜 문장으로
|
|
208
|
+
* 안 두는지는 ko.js 의 '세는 말' 묶음에 적어 두었다.
|
|
209
|
+
*
|
|
210
|
+
* **하나일 때 열쇠가 갈린다.** 한국어는 「1개 파일」 로 끝이지만 영어는
|
|
211
|
+
* `1 files` 가 나오면 그 줄 전체가 대충 만든 것으로 읽힌다. 그래서 홑을
|
|
212
|
+
* 따로 두는 갈래만 모아 뒀다 — 여기 없는 갈래(자·회·초)는 영어에서도
|
|
213
|
+
* 홑복수가 안 갈려서 열쇠를 늘릴 까닭이 없다.
|
|
214
|
+
*
|
|
215
|
+
* 숫자는 여기서 toLocaleString() 을 거친다. 부르는 쪽마다 하면 어디선가
|
|
216
|
+
* 빠져서 `50700` 과 `50,700` 이 한 화면에 같이 뜬다.
|
|
217
|
+
*/
|
|
218
|
+
const 홑이따로인것 = new Set(['files', 'hits', 'lines', 'spots', 'places', 'count', 'turns']);
|
|
219
|
+
|
|
220
|
+
export function 세말(갈래, n) {
|
|
221
|
+
const 수 = Number(n);
|
|
222
|
+
const 홑 = 홑이따로인것.has(갈래) && 수 === 1;
|
|
223
|
+
return 말(`unit.${갈래}${홑 ? '1' : ''}`, { n: Number.isFinite(수) ? 수.toLocaleString() : String(n) });
|
|
224
|
+
}
|
|
225
|
+
|
|
204
226
|
/** 이 열쇠가 지금 언어로 옮겨져 있나. 검사와 /lang 이 본다. */
|
|
205
227
|
export function 옮겨졌나(열쇠, 언어이름 = 지금) {
|
|
206
228
|
return Object.prototype.hasOwnProperty.call(표[언어이름] ?? {}, String(열쇠));
|
package/src/i18n/ja.js
CHANGED
|
@@ -94,8 +94,12 @@ export const ja = {
|
|
|
94
94
|
'consult.failed': '訊けませんでした — {왜}',
|
|
95
95
|
'consult.empty': '返答が空でした。そのモデルは道具なしでは答えないのかもしれません。',
|
|
96
96
|
'consult.added': 'その答えを、誰が言ったか付けて会話に足しました。',
|
|
97
|
-
'head.spec.ollama': 'Ollama
|
|
97
|
+
'head.spec.ollama': 'Ollama 独自規格',
|
|
98
98
|
'head.spec.openai': 'OpenAI 互換 API',
|
|
99
|
+
'head.spec.anthropic': 'Anthropic API',
|
|
100
|
+
'head.mode.default': 'この中(既定)',
|
|
101
|
+
'head.mode.online': '外(online)',
|
|
102
|
+
'head.mode.offline': '封印(offline)',
|
|
99
103
|
'head.model': 'モデル',
|
|
100
104
|
'head.tokens': 'トークン',
|
|
101
105
|
'head.grade': '階級',
|
|
@@ -131,6 +135,7 @@ export const ja = {
|
|
|
131
135
|
'grade.large': '大',
|
|
132
136
|
'head.gradeSuffix': ' · {급} {급이름}{짐작}',
|
|
133
137
|
'seg.dir': '作業フォルダ (前の ⌂/↗ が、書いたものがどこへ行くかを表します)',
|
|
138
|
+
'seg.ver': 'バージョン',
|
|
134
139
|
'seg.thread': 'スレッド',
|
|
135
140
|
'seg.model': 'モデル名',
|
|
136
141
|
'seg.grade': 'モデルの階級 (どこまで自力でやるか)',
|
|
@@ -142,6 +147,7 @@ export const ja = {
|
|
|
142
147
|
'seg.verify': '実際に確かめたもの',
|
|
143
148
|
'seg.undoable': 'まだ戻せるターン',
|
|
144
149
|
'seg.tok': '入出力トークン',
|
|
150
|
+
'seg.cost': '使った金額(料金が分かるときだけ)',
|
|
145
151
|
'seg.tools': '道具の呼び出し',
|
|
146
152
|
'seg.skills': 'このPCで見つかったスキル',
|
|
147
153
|
'seg.time': '始めてからの時間',
|
|
@@ -259,6 +265,151 @@ export const ja = {
|
|
|
259
265
|
'ask.freePrompt': '答え',
|
|
260
266
|
'loop.backoff': 'サーバーに押し返されました ({무엇}) — {초} 秒後にもう一度 ({n}/{max})',
|
|
261
267
|
'cost.retries': '再試行',
|
|
268
|
+
// ── 数える言葉 ────────────────────────────────────────────────────────
|
|
269
|
+
'unit.files': 'ファイル{n}個',
|
|
270
|
+
'unit.files1': 'ファイル1個',
|
|
271
|
+
'unit.hits': '{n}件',
|
|
272
|
+
'unit.hits1': '1件',
|
|
273
|
+
'unit.lines': '{n}行',
|
|
274
|
+
'unit.lines1': '1行',
|
|
275
|
+
'unit.spots': '{n}箇所',
|
|
276
|
+
'unit.spots1': '1箇所',
|
|
277
|
+
'unit.places': '{n}箇所',
|
|
278
|
+
'unit.places1': '1箇所',
|
|
279
|
+
'unit.count': '{n}個',
|
|
280
|
+
'unit.count1': '1個',
|
|
281
|
+
'unit.chars': '{n}文字',
|
|
282
|
+
'unit.kchars': '{n}k文字',
|
|
283
|
+
'unit.calls': '{n}回',
|
|
284
|
+
'unit.sec': '{n}秒',
|
|
285
|
+
'unit.min': '{n}分',
|
|
286
|
+
|
|
287
|
+
'sum.done': '完了',
|
|
288
|
+
'sum.ok': '成功',
|
|
289
|
+
'sum.exitCode': '終了コード {code}',
|
|
290
|
+
'sum.killedBy': '{시그널} で終了',
|
|
291
|
+
'sum.partial': '一部のみ',
|
|
292
|
+
'sum.cut': '一部省略',
|
|
293
|
+
'sum.notAllSeen': '全部は見ていない',
|
|
294
|
+
'sum.filesFailed': '{n}個失敗',
|
|
295
|
+
'sum.spotsFailed': '{n}箇所失敗',
|
|
296
|
+
'sum.moved': '{n}個移動',
|
|
297
|
+
'sum.total': '全体{줄}',
|
|
298
|
+
'sum.addedLines': '+{줄}',
|
|
299
|
+
'sum.noVision': 'このモデルは画像を見られません',
|
|
300
|
+
'sum.emptyAnswer': '空の返答',
|
|
301
|
+
'sum.unread': '読めず{n}個',
|
|
302
|
+
'sum.doneOf': '{끝}/{전체} 完了',
|
|
303
|
+
'sum.justDone': 'たった今{n}個',
|
|
304
|
+
'sum.noChange': '変更なし',
|
|
305
|
+
'sum.verified': '確認{n}個',
|
|
306
|
+
'sum.readAs': '{쓴것} で変換して読み込み',
|
|
307
|
+
'sum.linesOf': '{준}/{전체}行',
|
|
308
|
+
'sum.countOf': '{n}/{전체}個',
|
|
309
|
+
'sum.remembered': '覚えました({n}行)',
|
|
310
|
+
'sum.rememberFull': '場所が埋まったので古いものを外しました',
|
|
311
|
+
'sum.recall': '過去の会話 {전체}件中 {맞음}件',
|
|
312
|
+
'sum.jobStarted': '{n}番で起動',
|
|
313
|
+
'sum.jobRunning': '実行中',
|
|
314
|
+
'sum.jobEndedAlready': 'すでに終了',
|
|
315
|
+
'sum.jobStopped': '終了',
|
|
316
|
+
|
|
317
|
+
'tier.exact': '完全一致',
|
|
318
|
+
'tier.trail': '行末の空白・改行の違いを無視',
|
|
319
|
+
'tier.indent': 'インデントの違いを無視',
|
|
320
|
+
'tier.space': 'すべての空白の違いを無視',
|
|
321
|
+
|
|
322
|
+
'sum.image': '画像',
|
|
323
|
+
'sum.imageDropped': '画像 {크기} を省略',
|
|
324
|
+
|
|
325
|
+
'sum.broken': '不具合{n}件',
|
|
326
|
+
'sum.unverified': '未確認{n}件',
|
|
327
|
+
'lsp.noDef': '定義が見つかりません。Grep で探してください。',
|
|
328
|
+
'lsp.defs': '定義 {n}',
|
|
329
|
+
'lsp.noRefs': '使っている場所がありません。',
|
|
330
|
+
'lsp.refs': '使用箇所 {자리} · ファイル {파일}',
|
|
331
|
+
|
|
332
|
+
'sum.nothingToCheck': '確かめるものがありませんでした',
|
|
333
|
+
'job.no': '{n}番',
|
|
334
|
+
'job.stop': '終了',
|
|
335
|
+
'more.files': 'ほか{n}個',
|
|
336
|
+
'more.spots': 'ほか{n}箇所',
|
|
337
|
+
|
|
338
|
+
'err.noSuchFile': 'ファイルがありません: {경로}',
|
|
339
|
+
'err.alreadyThere': 'すでにあります: {경로}',
|
|
340
|
+
'err.overwriteHint': '上書きするには overwrite: true を指定してください。',
|
|
341
|
+
|
|
342
|
+
'run.ctxProbe': 'モデルに設定されたコンテキスト長を確認中…',
|
|
343
|
+
'run.noStream': 'ストリーミングがないので返答は一度に出ます',
|
|
344
|
+
'run.hintHelp': '/help コマンド一覧',
|
|
345
|
+
'run.hintEsc': 'ESC 中断',
|
|
346
|
+
'run.hintQuit': 'Ctrl+C 中断・終了',
|
|
347
|
+
'run.thinking': '考え中…',
|
|
348
|
+
'run.thinkingChars': '考え中… {n}文字',
|
|
349
|
+
'run.turnFoot': '{초}秒 · ツール{n}回 · ↑{입력} ↓{출력}',
|
|
350
|
+
'run.bye': '終了します。',
|
|
351
|
+
'run.byeStats': 'モデル呼び出し{n}回 · ツール時間{초}秒 · ↑{입력} ↓{출력}',
|
|
352
|
+
'run.notMade': '— 作られませんでした',
|
|
353
|
+
|
|
354
|
+
'stage.plan': '最初の判断',
|
|
355
|
+
'stage.work': '続き',
|
|
356
|
+
'stage.fix': '詰まったとき',
|
|
357
|
+
|
|
358
|
+
'scr.tools': 'ツール',
|
|
359
|
+
'scr.conn': '接続',
|
|
360
|
+
'scr.session': 'このセッション',
|
|
361
|
+
'status.kind': '規格',
|
|
362
|
+
'status.url': 'アドレス',
|
|
363
|
+
'status.proxy': 'プロキシ',
|
|
364
|
+
'status.proxyOff': '使えません',
|
|
365
|
+
'status.model': 'モデル',
|
|
366
|
+
'status.root': '作業フォルダ',
|
|
367
|
+
'status.shell': 'シェル',
|
|
368
|
+
'status.keyStore': '鍵の保管',
|
|
369
|
+
'status.rules': 'ルール',
|
|
370
|
+
'status.noRules': 'なし(/init で作れます)',
|
|
371
|
+
'status.caps': '対応',
|
|
372
|
+
'status.capTools': 'ツール',
|
|
373
|
+
'status.capStream': 'ストリーム',
|
|
374
|
+
'status.capSchema': 'スキーマ',
|
|
375
|
+
'status.capThink': '推論',
|
|
376
|
+
'cost.calls': 'モデル呼び出し',
|
|
377
|
+
'cost.tokIn': '入力トークン',
|
|
378
|
+
'cost.tokOut': '出力トークン',
|
|
379
|
+
'cost.toolMs': 'ツール時間',
|
|
380
|
+
'cost.elapsed': '経過',
|
|
381
|
+
'cost.money': '料金',
|
|
382
|
+
'cost.quota': 'サーバー残量',
|
|
383
|
+
'cost.quotaAge': '{초}秒前の応答基準',
|
|
384
|
+
|
|
385
|
+
'scr.context': 'コンテキスト',
|
|
386
|
+
'unit.tokens': '{n} トークン',
|
|
387
|
+
'ctx.system': 'システムプロンプト',
|
|
388
|
+
'ctx.rules': 'ルール ({이름})',
|
|
389
|
+
'ctx.rulesNone': 'ルール (なし)',
|
|
390
|
+
'ctx.memory': '記憶 ({n}行)',
|
|
391
|
+
'ctx.learned': 'ここで分かったこと',
|
|
392
|
+
'ctx.skills': 'スキル一覧 ({실림}/{전체})',
|
|
393
|
+
'ctx.tools': '道具の定義',
|
|
394
|
+
'ctx.history': '会話の履歴',
|
|
395
|
+
'ctx.toolResults': '道具の結果 (ファイル{n}個)',
|
|
396
|
+
'ctx.left': '残り',
|
|
397
|
+
'ctx.compactHint': '会話を畳む',
|
|
398
|
+
'ctx.clearHint': 'まるごと消す',
|
|
399
|
+
'ctx.calibrated': 'サーバーの実測値に合わせて {부호}{퍼센트}% 補正しました ({번}回計測)。',
|
|
400
|
+
'ctx.estimate': '数字は推定です — 正確なトークナイザーは使っていません。',
|
|
401
|
+
|
|
402
|
+
'auth.waiting': '社内ログインを待っています…',
|
|
403
|
+
'auth.got': '鍵を受け取りました — 約{분}分使えます',
|
|
404
|
+
'auth.failed': '鍵を受け取れませんでした — {왜}',
|
|
405
|
+
'auth.from': '取得',
|
|
406
|
+
'auth.fromPolicy': '取得(管理ポリシー)',
|
|
407
|
+
'auth.leftMin': '残り{분}分',
|
|
408
|
+
'auth.notYet': 'まだ取得していません',
|
|
409
|
+
|
|
410
|
+
'undo.wayRestored': '戻しました',
|
|
411
|
+
'undo.wayDeleted': '削除(元々なかったファイル)',
|
|
412
|
+
|
|
262
413
|
'common.unknownCommand': '知らないコマンド',
|
|
263
414
|
'common.seeHelp': '/help で一覧が出ます',
|
|
264
415
|
'common.yes': 'はい',
|
package/src/i18n/ko.js
CHANGED
|
@@ -99,8 +99,12 @@ export const ko = {
|
|
|
99
99
|
'consult.empty': '빈 답이 왔습니다. 그 모델이 도구 없이 답을 못 내는 것일 수 있습니다.',
|
|
100
100
|
'consult.added': '이 답을 대화에도 넣었습니다 — 누가 한 말인지 표를 달아서.',
|
|
101
101
|
// ── 켤 때 머리말 ──────────────────────────────────────────────────────
|
|
102
|
-
'head.spec.ollama': 'Ollama 규격',
|
|
102
|
+
'head.spec.ollama': 'Ollama 자체 규격',
|
|
103
103
|
'head.spec.openai': 'OpenAI 호환 규격',
|
|
104
|
+
'head.spec.anthropic': 'Anthropic 규격',
|
|
105
|
+
'head.mode.default': '이 안 (기본)',
|
|
106
|
+
'head.mode.online': '바깥 (online)',
|
|
107
|
+
'head.mode.offline': '봉인 (offline)',
|
|
104
108
|
'head.model': '모델',
|
|
105
109
|
'head.tokens': '토큰',
|
|
106
110
|
'head.grade': '급',
|
|
@@ -139,6 +143,7 @@ export const ko = {
|
|
|
139
143
|
|
|
140
144
|
// ── 상태줄 조각 이름 (/status 와 설정이 본다) ─────────────────────────
|
|
141
145
|
'seg.dir': '작업 폴더 (앞의 ⌂/↗ 는 소스가 어디로 나가나)',
|
|
146
|
+
'seg.ver': '판 번호',
|
|
142
147
|
'seg.thread': '대화 갈래',
|
|
143
148
|
'seg.model': '모델 이름',
|
|
144
149
|
'seg.grade': '모델 급 (얼마나 알아서 하나)',
|
|
@@ -150,6 +155,7 @@ export const ko = {
|
|
|
150
155
|
'seg.verify': '확인한 것 (Verify)',
|
|
151
156
|
'seg.undoable': '되돌릴 수 있는 턴',
|
|
152
157
|
'seg.tok': '주고받은 토큰',
|
|
158
|
+
'seg.cost': '여태 쓴 돈 (요금을 알 때만)',
|
|
153
159
|
'seg.tools': '도구 호출 수',
|
|
154
160
|
'seg.skills': '이 PC 에서 찾은 스킬',
|
|
155
161
|
'seg.time': '켠 지 얼마나',
|
|
@@ -286,6 +292,172 @@ export const ko = {
|
|
|
286
292
|
'loop.backoff': '서버가 잠시 막았습니다 ({무엇}) — {초}초 뒤 다시 부릅니다 ({n}/{max})',
|
|
287
293
|
'cost.retries': '다시 부름',
|
|
288
294
|
|
|
295
|
+
/*
|
|
296
|
+
* ── 세는 말 ───────────────────────────────────────────────────────────
|
|
297
|
+
*
|
|
298
|
+
* 도구 결과 한 줄(`└ 1개 파일 · 3건 · rg`)은 이 조각들을 ` · ` 로 이어
|
|
299
|
+
* 만든다. 통짜 문장으로 안 두는 까닭은, 같은 조각이 열두 자리에서 다른
|
|
300
|
+
* 순서로 섞이기 때문이다 — 통짜로 두면 열쇠가 마흔 개가 되고, 그러면
|
|
301
|
+
* 새 자리를 만들 때마다 표를 네 번 고쳐야 해서 결국 아무도 안 고친다.
|
|
302
|
+
*
|
|
303
|
+
* 영어는 단수·복수를 갈라야 해서 {n} 하나로는 모자란 자리가 있다.
|
|
304
|
+
* 그런 자리는 열쇠를 둘로 나눠 뒀다(files/file1 처럼). 부르는 쪽에서
|
|
305
|
+
* n === 1 을 보고 고른다 — 한국어 표에서는 두 열쇠가 같은 값이라
|
|
306
|
+
* 한국어 화면은 한 글자도 안 바뀐다.
|
|
307
|
+
*/
|
|
308
|
+
'unit.files': '{n}개 파일',
|
|
309
|
+
'unit.files1': '1개 파일',
|
|
310
|
+
'unit.hits': '{n}건',
|
|
311
|
+
'unit.hits1': '1건',
|
|
312
|
+
'unit.lines': '{n}줄',
|
|
313
|
+
'unit.lines1': '1줄',
|
|
314
|
+
'unit.spots': '{n}군데',
|
|
315
|
+
'unit.spots1': '1군데',
|
|
316
|
+
'unit.places': '{n}곳',
|
|
317
|
+
'unit.places1': '1곳',
|
|
318
|
+
'unit.count': '{n}개',
|
|
319
|
+
'unit.count1': '1개',
|
|
320
|
+
'unit.chars': '{n}자',
|
|
321
|
+
'unit.kchars': '{n}k자',
|
|
322
|
+
'unit.calls': '{n}회',
|
|
323
|
+
'unit.sec': '{n}초',
|
|
324
|
+
'unit.min': '{n}분',
|
|
325
|
+
|
|
326
|
+
// ── 도구 결과 한 줄 ──────────────────────────────────────────────────
|
|
327
|
+
'sum.done': '완료',
|
|
328
|
+
'sum.ok': '성공',
|
|
329
|
+
'sum.exitCode': '종료코드 {code}',
|
|
330
|
+
'sum.killedBy': '{시그널} 로 죽음',
|
|
331
|
+
'sum.partial': '일부만',
|
|
332
|
+
'sum.cut': '일부 잘림',
|
|
333
|
+
'sum.notAllSeen': '다 못 봄',
|
|
334
|
+
'sum.filesFailed': '{n}개 실패',
|
|
335
|
+
'sum.spotsFailed': '{n}군데 실패',
|
|
336
|
+
'sum.moved': '{n}개 옮김',
|
|
337
|
+
'sum.total': '전체 {줄}',
|
|
338
|
+
'sum.addedLines': '+{줄}',
|
|
339
|
+
'sum.noVision': '이 모델은 못 봄',
|
|
340
|
+
'sum.emptyAnswer': '빈 답',
|
|
341
|
+
'sum.unread': '못 읽음 {n}개',
|
|
342
|
+
'sum.doneOf': '{끝}/{전체} 완료',
|
|
343
|
+
'sum.justDone': '방금 {n}개',
|
|
344
|
+
'sum.noChange': '그대로 (바뀐 것 없음)',
|
|
345
|
+
'sum.verified': '확인 {n}개',
|
|
346
|
+
'sum.readAs': '{쓴것} 로 바꿔 읽음',
|
|
347
|
+
'sum.linesOf': '{준}/{전체}줄',
|
|
348
|
+
'sum.countOf': '{n}/{전체}개',
|
|
349
|
+
'sum.remembered': '기억했습니다 ({n}줄)',
|
|
350
|
+
'sum.rememberFull': '자리가 차서 오래된 것을 뺐습니다',
|
|
351
|
+
'sum.recall': '지난 대화에서 {전체}건 중 {맞음}건',
|
|
352
|
+
'sum.jobStarted': '{n}번으로 띄움',
|
|
353
|
+
'sum.jobRunning': '도는중',
|
|
354
|
+
'sum.jobEndedAlready': '이미 끝남',
|
|
355
|
+
'sum.jobStopped': '끝냄',
|
|
356
|
+
|
|
357
|
+
// Edit 이 어떤 느슨함으로 자리를 찾았나 (tools/edit-match.js 의 TIERS).
|
|
358
|
+
'tier.exact': '정확히 일치',
|
|
359
|
+
'tier.trail': '줄 끝 공백·줄바꿈 차이 무시',
|
|
360
|
+
'tier.indent': '들여쓰기 차이 무시',
|
|
361
|
+
'tier.space': '모든 공백 차이 무시',
|
|
362
|
+
|
|
363
|
+
'sum.image': '그림',
|
|
364
|
+
'sum.imageDropped': '그림 {크기} 생략',
|
|
365
|
+
|
|
366
|
+
'sum.broken': '탈 {n}개',
|
|
367
|
+
'sum.unverified': '못 확인 {n}개',
|
|
368
|
+
'lsp.noDef': '정의를 못 찾았습니다. Grep 으로 찾아보세요.',
|
|
369
|
+
'lsp.defs': '정의 {n}',
|
|
370
|
+
'lsp.noRefs': '쓰는 자리가 없습니다.',
|
|
371
|
+
'lsp.refs': '쓰는 자리 {자리} · 파일 {파일}',
|
|
372
|
+
|
|
373
|
+
'sum.nothingToCheck': '확인할 것이 없었습니다',
|
|
374
|
+
'job.no': '{n}번',
|
|
375
|
+
'job.stop': '끝내기',
|
|
376
|
+
'more.files': '외 {n}개',
|
|
377
|
+
'more.spots': '외 {n}군데',
|
|
378
|
+
|
|
379
|
+
// ── 도구 오류 ────────────────────────────────────────────────────────
|
|
380
|
+
'err.noSuchFile': '파일이 없습니다: {경로}',
|
|
381
|
+
'err.alreadyThere': '이미 있습니다: {경로}',
|
|
382
|
+
'err.overwriteHint': '덮어쓰려면 overwrite: true 를 주세요.',
|
|
383
|
+
|
|
384
|
+
// ── 대화 화면 ────────────────────────────────────────────────────────
|
|
385
|
+
'run.ctxProbe': '모델에 걸린 컨텍스트 길이를 확인하는 중…',
|
|
386
|
+
'run.noStream': '스트리밍이 없어 응답이 한 번에 나옵니다',
|
|
387
|
+
'run.hintHelp': '/help 명령 목록',
|
|
388
|
+
'run.hintEsc': 'ESC 중단',
|
|
389
|
+
'run.hintQuit': 'Ctrl+C 중단·끝내기',
|
|
390
|
+
'run.thinking': '생각 중…',
|
|
391
|
+
'run.thinkingChars': '생각 중… {n}자',
|
|
392
|
+
'run.turnFoot': '{초}초 · 도구 {n}회 · ↑{입력} ↓{출력}',
|
|
393
|
+
'run.bye': '끝냅니다.',
|
|
394
|
+
'run.byeStats': '모델 호출 {n}회 · 도구 시간 {초}초 · ↑{입력} ↓{출력}',
|
|
395
|
+
'run.notMade': '— 만들어지지 않았습니다',
|
|
396
|
+
|
|
397
|
+
// 생각 중 앞에 붙는 단계 꼬리표 (agent/effort.js 의 STAGES).
|
|
398
|
+
'stage.plan': '첫 판단',
|
|
399
|
+
'stage.work': '이어가기',
|
|
400
|
+
'stage.fix': '막혔을 때',
|
|
401
|
+
|
|
402
|
+
// ── /tools · /status · /cost 화면 ────────────────────────────────────
|
|
403
|
+
'scr.tools': '도구',
|
|
404
|
+
'scr.conn': '연결',
|
|
405
|
+
'scr.session': '이번 세션',
|
|
406
|
+
'status.kind': '규격',
|
|
407
|
+
'status.url': '주소',
|
|
408
|
+
'status.proxy': '프록시',
|
|
409
|
+
'status.proxyOff': '못 씀',
|
|
410
|
+
'status.model': '모델',
|
|
411
|
+
'status.root': '작업 폴더',
|
|
412
|
+
'status.shell': '셸',
|
|
413
|
+
'status.keyStore': '열쇠 보관',
|
|
414
|
+
'status.rules': '규칙',
|
|
415
|
+
'status.noRules': '없음 (/init 으로 만들 수 있습니다)',
|
|
416
|
+
'status.caps': '지원',
|
|
417
|
+
'status.capTools': '도구',
|
|
418
|
+
'status.capStream': '스트림',
|
|
419
|
+
'status.capSchema': '스키마',
|
|
420
|
+
'status.capThink': '추론',
|
|
421
|
+
'cost.calls': '모델 호출',
|
|
422
|
+
'cost.tokIn': '입력 토큰',
|
|
423
|
+
'cost.tokOut': '출력 토큰',
|
|
424
|
+
'cost.toolMs': '도구 시간',
|
|
425
|
+
'cost.elapsed': '경과',
|
|
426
|
+
'cost.money': '요금',
|
|
427
|
+
'cost.quota': '서버 할당량',
|
|
428
|
+
'cost.quotaAge': '{초}초 전 응답 기준',
|
|
429
|
+
|
|
430
|
+
// ── /context 표 ──────────────────────────────────────────────────────
|
|
431
|
+
'scr.context': '컨텍스트',
|
|
432
|
+
'unit.tokens': '{n} 토큰',
|
|
433
|
+
'ctx.system': '시스템 프롬프트',
|
|
434
|
+
'ctx.rules': '규칙 ({이름})',
|
|
435
|
+
'ctx.rulesNone': '규칙 (없음)',
|
|
436
|
+
'ctx.memory': '기억 ({n}줄)',
|
|
437
|
+
'ctx.learned': '겪어 본 것',
|
|
438
|
+
'ctx.skills': '스킬 목록 ({실림}/{전체}개)',
|
|
439
|
+
'ctx.tools': '도구 정의',
|
|
440
|
+
'ctx.history': '대화 이력',
|
|
441
|
+
'ctx.toolResults': '도구 결과 (파일 {n}개)',
|
|
442
|
+
'ctx.left': '남음',
|
|
443
|
+
'ctx.compactHint': '대화 줄이기',
|
|
444
|
+
'ctx.clearHint': '통째로 비우기',
|
|
445
|
+
'ctx.calibrated': '서버가 알려 준 실제값에 맞춰 {부호}{퍼센트}% 보정했습니다 ({번}번 재봄).',
|
|
446
|
+
'ctx.estimate': '숫자는 추정입니다 — 정확한 토크나이저를 쓰지 않습니다.',
|
|
447
|
+
|
|
448
|
+
// ── 열쇠받기 (safety/authcmd.js) ─────────────────────────────────────
|
|
449
|
+
'auth.waiting': '회사 로그인을 기다리는 중…',
|
|
450
|
+
'auth.got': '열쇠를 받았습니다 — {분}분쯤 씁니다',
|
|
451
|
+
'auth.failed': '열쇠를 못 받았습니다 — {왜}',
|
|
452
|
+
'auth.from': '받아 옴',
|
|
453
|
+
'auth.fromPolicy': '받아 옴 (관리 정책)',
|
|
454
|
+
'auth.leftMin': '{분}분 남음',
|
|
455
|
+
'auth.notYet': '아직 안 받음',
|
|
456
|
+
|
|
457
|
+
// ── 되돌리기 결과 줄 ─────────────────────────────────────────────────
|
|
458
|
+
'undo.wayRestored': '되돌림',
|
|
459
|
+
'undo.wayDeleted': '삭제됨(원래 없던 파일)',
|
|
460
|
+
|
|
289
461
|
// ── 자주 나오는 것 ────────────────────────────────────────────────────
|
|
290
462
|
'common.unknownCommand': '모르는 명령입니다',
|
|
291
463
|
'common.seeHelp': '명령 목록은 /help',
|