dsh-ssh-tui 0.3.8 → 0.3.9
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.en.md +31 -22
- package/README.md +15 -9
- package/lib/i18n/en.js +429 -0
- package/lib/i18n/en.js.map +1 -0
- package/lib/i18n/index.js +94 -0
- package/lib/i18n/index.js.map +1 -0
- package/lib/i18n/zh.js +429 -0
- package/lib/i18n/zh.js.map +1 -0
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -1
- package/lib/picker.js +5 -4
- package/lib/picker.js.map +1 -1
- package/lib/session-list.js +46 -0
- package/lib/session-list.js.map +1 -1
- package/lib/session-lock.js +3 -6
- package/lib/session-lock.js.map +1 -1
- package/lib/subagent-model.js +44 -2
- package/lib/subagent-model.js.map +1 -1
- package/lib/supergrok-token.js +7 -3
- package/lib/supergrok-token.js.map +1 -1
- package/lib/tui.js +821 -333
- package/lib/tui.js.map +1 -1
- package/lib/types/i18n/en.d.ts +2 -0
- package/lib/types/i18n/index.d.ts +28 -0
- package/lib/types/i18n/zh.d.ts +2 -0
- package/lib/types/session-list.d.ts +16 -0
- package/lib/types/subagent-model.d.ts +24 -0
- package/lib/types/tui.d.ts +115 -4
- package/lib/update-check.js +2 -1
- package/lib/update-check.js.map +1 -1
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -110,13 +110,17 @@ approvals) and prints `tmux attach`. Locks live under `$DSH_HOME/tui-locks/`;
|
|
|
110
110
|
a leftover file from a crash is stolen if the pid is dead.
|
|
111
111
|
`DSH_TUI_NO_SESSION_LOCK=1` skips this.
|
|
112
112
|
|
|
113
|
+
New sessions inherit the directory you launched from. Resuming a session
|
|
114
|
+
`chdir`s into that session's recorded working directory. The footer shows
|
|
115
|
+
`目录:srv` (last path segment); click it to print the full path.
|
|
116
|
+
|
|
113
117
|
On start the TUI checks npm for a newer `dsh-ssh-tui` and **notifies only**:
|
|
114
118
|
|
|
115
119
|
```text
|
|
116
120
|
发现新版本 dsh-ssh-tui 0.3.5(当前 0.3.4)。更新:dsh plugin --profile tui add dsh-ssh-tui
|
|
117
121
|
```
|
|
118
122
|
|
|
119
|
-
Set `DSH_TUI_NO_UPDATE_CHECK=1` to skip. `/status` also shows the plugin version.
|
|
123
|
+
Set `DSH_TUI_NO_UPDATE_CHECK=1` to skip. `/status` also shows the plugin version, the link chip, the quota window, and whether the subagent model is in the same family as the parent route.
|
|
120
124
|
|
|
121
125
|
From git:
|
|
122
126
|
|
|
@@ -222,7 +226,7 @@ The plugin runs on Linux, macOS, and Windows (Node ≥ 22.19):
|
|
|
222
226
|
|
|
223
227
|
| Key | Action |
|
|
224
228
|
| --- | --- |
|
|
225
|
-
| `Enter` | send; while running, steer; with empty input, toggle the selected card |
|
|
229
|
+
| `Enter` | send; while running, steer; with empty input, toggle the selected card. Oversized tool bodies open a dedicated inspect view; `Esc` returns |
|
|
226
230
|
| `Tab` | complete the highlighted slash command |
|
|
227
231
|
| `↑` / `↓` | empty input: move among cards; otherwise history. Same as `Ctrl+N` / `Ctrl+P` |
|
|
228
232
|
| `Ctrl+R` | expand or collapse all cards |
|
|
@@ -238,11 +242,14 @@ The plugin runs on Linux, macOS, and Windows (Node ≥ 22.19):
|
|
|
238
242
|
| `1..9` + `Enter` | answer an `ask_user_question` dialog |
|
|
239
243
|
|
|
240
244
|
Type `/` to see slash-command suggestions — the panel merges the TUI's own
|
|
241
|
-
commands (`/find`, `/model`, `/provider`, `/help`, ...) with every command the harness
|
|
245
|
+
commands (`/find`, `/model`, `/provider`, `/language`, `/help`, ...) with every command the harness
|
|
242
246
|
registers (`/goal`, `/plan`, `/compact`, `/permission`, `/feedback`, ...).
|
|
243
247
|
`/compact` shows a spinning 「压缩上下文」 card and footer until it
|
|
244
248
|
finishes, then the tokens recovered. `Tab` completes, `Enter` runs.
|
|
245
|
-
`/help` lists everything.
|
|
249
|
+
`/help` lists everything. `/language` (alias `/lang`) opens a picker, or
|
|
250
|
+
`/language zh` / `/language en` switches immediately. `DSH_TUI_LANG` wins,
|
|
251
|
+
then `ssh-tui.language` in `$DSH_HOME/settings.yaml`, then `LANG` /
|
|
252
|
+
`LC_MESSAGES`. Unknown and `C` locales stay Chinese.
|
|
246
253
|
|
|
247
254
|
`/model` lists models for the **current** provider only. On SuperGrok that
|
|
248
255
|
is `grok-4.6` / `grok-4.5` plus reasoning effort (`xhigh` on 4.6). `/provider`
|
|
@@ -300,10 +307,12 @@ labelled `(images ok)` in the command list and completion hints.
|
|
|
300
307
|
- **OpenCode Zen** is metered — the TUI points at `https://opencode.ai/zen`.
|
|
301
308
|
|
|
302
309
|
OpenCode Go / SuperGrok quota is fetched silently at start and on a
|
|
303
|
-
window-based cadence; the footer shows
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
310
|
+
window-based cadence; the footer shows plan name + remaining bar + percent,
|
|
311
|
+
and on a narrow row drops the plan name first so the bar and percent stay.
|
|
312
|
+
DeepSeek official balance stays on `/balance` and never occupies the footer.
|
|
313
|
+
A ⚠ transcript line appears only when remaining crosses 50% / 25% / 10% / 5%.
|
|
314
|
+
`/usage` or `/balance` still prints the full snapshot. Cadence: every 10 turns
|
|
315
|
+
for a 5-hour cap (every 4 when near), every 50 for weekly (every 10 when near),
|
|
307
316
|
every 80 for monthly (every 20 when near).
|
|
308
317
|
|
|
309
318
|
The startup screen shows the official DeepSeek whale logo (rendered from the
|
|
@@ -321,7 +330,9 @@ the raw reasoning as it arrives. Assistant replies render in bold white with
|
|
|
321
330
|
terminal markdown support: heading levels (H1 enlarged/underlined, H2
|
|
322
331
|
underlined, H3 colored), bold, italic, inline code, fenced code blocks,
|
|
323
332
|
lists, quotes, and links all get ANSI styling while remaining
|
|
324
|
-
width-wrapped for the terminal.
|
|
333
|
+
width-wrapped for the terminal. System-prompt / `<system-reminder>` / `AGENTS.md` injections collapse to a
|
|
334
|
+
`提示词注入:系统预设 AGENTS.MD` card (sources joined when several match).
|
|
335
|
+
Reasoning, tool, subagent, plan, question, and prompt cards are
|
|
325
336
|
each expandable/collapsible independently. Empty input: `↑`/`↓` (same as
|
|
326
337
|
`Ctrl+N`/`Ctrl+P`) move the highlight, `Enter` toggles, `Ctrl+R` toggles all,
|
|
327
338
|
`Esc` drops the selection. Click a card header to toggle it. Subagent cards
|
|
@@ -338,19 +349,17 @@ animated spinner plus `运行中 · 工具 N` while working, `✓ 已完成` for
|
|
|
338
349
|
seconds after completion, and `待命` when idle. A terminal bell rings on
|
|
339
350
|
completion (`DSH_TUI_NO_BELL=1` disables it).
|
|
340
351
|
|
|
341
|
-
Tool calls render as compact cards instead of raw argument JSON. The
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
`…` when long); expand to reveal output or the result body. Expanded generic
|
|
353
|
-
calls convert their JSON arguments and JSON results into readable indented
|
|
352
|
+
Tool calls render as compact cards instead of raw argument JSON. The title
|
|
353
|
+
stays the default foreground; only the status dot and `[ok]` / `[error]` /
|
|
354
|
+
`[running…]` (plus `[退出码 N]` / `[信号 X]`) are yellow / green / red.
|
|
355
|
+
Shell tools show the command as dim-grey `$ command`. File mutations
|
|
356
|
+
(`edit` / `write` / `str_replace_editor`) render the applied change
|
|
357
|
+
git-style: a path header, `-` lines on a dark-red background, `+` lines on
|
|
358
|
+
a dark-green background, and a `└ +N -M · K file(s)` footer. Expanding a
|
|
359
|
+
card whose body fits the workspace shows it in place; if it would overflow,
|
|
360
|
+
a dedicated inspect view opens (`Esc` returns to the session). Other tools
|
|
361
|
+
show a short argument summary and start collapsed. Expanded generic calls
|
|
362
|
+
convert their JSON arguments and JSON results into readable indented
|
|
354
363
|
content — key/value fields, bullet lists, and multiline blocks for
|
|
355
364
|
code/content — instead of raw JSON text.
|
|
356
365
|
|
package/README.md
CHANGED
|
@@ -51,12 +51,14 @@ dsh --profile tui
|
|
|
51
51
|
`▸ 已思考 · N 行`,可单独展开;思考过程中也能实时展开/收起查看原文;
|
|
52
52
|
- 工作区支持 markdown 渲染:多级标题(H1 放大/下划线、H2 下划线、H3 着色)、
|
|
53
53
|
粗体、斜体、行内代码、代码块、列表、引用与链接;模型最终回复以粗体白色显示;
|
|
54
|
-
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
- 系统提示词 / `system-reminder` / `AGENTS.md` 等注入折叠为「提示词注入:系统预设 AGENTS.MD」卡片,默认收起,Enter 展开看全文;
|
|
55
|
+
- 工具调用卡片化:标题默认色,只把状态点与 `[ok]`/`[error]` 染成黄/绿/红;
|
|
56
|
+
shell 命令浅灰、路径 cyan;编辑工具 git 风格 diff(`-` 暗红底 / `+` 暗绿底 /
|
|
57
|
+
文件统计)。正文超出窗口时单独全览(Esc 返回),放得下就在工作区展开;JSON 参数与结果自动转可读内容;
|
|
57
58
|
- 转录区滚动回看(`PgUp`/`PgDn`、鼠标滚轮),点击思考/工具标题行直接展开收起;
|
|
58
59
|
- 输入框下方两行底栏:第一行链路芯片 + 按宽度丢组的会话数字(轮次、入/出 token、速度);
|
|
59
|
-
第二行只留一个活动词(运行中 / 工具 N / 子代理 N /
|
|
60
|
+
第二行只留一个活动词(运行中 / 工具 N / 子代理 N / 压缩中…),身份收到右侧(含 `目录:srv`;点击打印完整工作目录);
|
|
61
|
+
- 恢复旧会话会切到该会话记录的工作目录;新建会话用启动时的当前目录;
|
|
60
62
|
- 历史会话启动选择器:`dsh --profile tui --resume`(或 `resume`)先选会话再进入;
|
|
61
63
|
- 终端窗口标题栏:运行中旋转图标 + `运行中 · 工具 N`,完成后 `✓ 已完成`,并响
|
|
62
64
|
一声终端铃(`DSH_TUI_NO_BELL=1` 关闭);
|
|
@@ -119,7 +121,7 @@ tmux attach -t dsh
|
|
|
119
121
|
发现新版本 dsh-ssh-tui 0.3.5(当前 0.3.4)。更新:dsh plugin --profile tui add dsh-ssh-tui
|
|
120
122
|
```
|
|
121
123
|
|
|
122
|
-
`DSH_TUI_NO_UPDATE_CHECK=1` 可关掉。`/status`
|
|
124
|
+
`DSH_TUI_NO_UPDATE_CHECK=1` 可关掉。`/status` 里也能看到当前插件版本、链路芯片、额度窗口,以及子代理模型是否与父路由同族。
|
|
123
125
|
|
|
124
126
|
仓库内也可:`bash scripts/smoke-headless.sh`(记录出口摘要,不打印 token)。
|
|
125
127
|
|
|
@@ -192,12 +194,12 @@ dsh --profile tui --no-color
|
|
|
192
194
|
|
|
193
195
|
| 键 | 作用 |
|
|
194
196
|
| --- | --- |
|
|
195
|
-
| `Enter` |
|
|
197
|
+
| `Enter` | 发送;运行中则插入指示;空输入且已选卡片时展开/收起。工具正文超出窗口则单独全览,`Esc` 返回 |
|
|
196
198
|
| `↑` / `↓` | 空输入:在卡片间移动;有输入:历史。与 `Ctrl+N` / `Ctrl+P` 相同 |
|
|
197
199
|
| `Ctrl+R` | 全部展开或全部收起 |
|
|
198
200
|
| `Ctrl+T` | 折叠输入框(只影响显示) |
|
|
199
201
|
| `Alt+1` / `2` / `3` / `4` | 跳到最新思考 / 计划 / 子代理 / 回复 |
|
|
200
|
-
| `/find [类] 关键字` | 搜索并跳到该条完整消息(反色高亮)。类:`思考` `计划` `子代理`
|
|
202
|
+
| `/find [类] 关键字` | 搜索并跳到该条完整消息(反色高亮)。类:`思考` `计划` `子代理` `回复` `提示词`。`Ctrl+/` 或 `Alt+/` 打开 |
|
|
201
203
|
| `Ctrl+G` / `Alt+N` | 下一条搜索结果;`Alt+P` 上一条 |
|
|
202
204
|
| 鼠标左键 | 点击卡片标题展开/收起 |
|
|
203
205
|
| `PgUp` / `PgDn`、滚轮 | 转录回看 |
|
|
@@ -208,8 +210,9 @@ dsh --profile tui --no-color
|
|
|
208
210
|
|
|
209
211
|
`/mode` 切换官方 preset:标准 (`standard`)、PTC (`ptc`;dsh 0.1.1 上仍是 `code`)、极简 (`minimal`)、创造 (`cordis`),以及本地安装的其它模式。
|
|
210
212
|
|
|
211
|
-
斜杠命令:`/help`、`/find`、`/model`、`/provider`、`/submodel`、`/subeffort`、`/mode`、`/resume`、
|
|
213
|
+
斜杠命令:`/help`、`/find`、`/model`、`/provider`、`/language`(`/lang`)、`/submodel`、`/subeffort`、`/mode`、`/resume`、
|
|
212
214
|
`/status`、`/subagents`、`/usage`(`/balance` 同义)、`/setup`、`/clear`,
|
|
215
|
+
界面语言:`/language` 打开选择器,或 `/language zh` / `/language en` 直接切。优先 `DSH_TUI_LANG`,其次 `$DSH_HOME/settings.yaml` 的 `ssh-tui.language`,再跟 `LANG`/`LC_MESSAGES`。未知和 `C` locale 默认中文。
|
|
213
216
|
以及 harness 自带命令(`/goal`、`/plan`、`/compact` 等)。`/compact` 进行中会显示
|
|
214
217
|
「压缩上下文」卡片和底栏转圈,结束时写出回收的 token 数。模型请求失败会显示重试
|
|
215
218
|
进度;会话标题由模型生成后写到窗口标题。harness 命令若声明
|
|
@@ -256,7 +259,7 @@ API Key 提供商,不会冲掉其它路由。SuperGrok / X Premium 走本机 O
|
|
|
256
259
|
- **OpenCode Go**:官方 `/v1/usage`,滚动 5 小时 / 本周 / 本月剩余%;
|
|
257
260
|
- **OpenCode Zen**:按量计费、没有固定额度,提示到 `https://opencode.ai/zen`。
|
|
258
261
|
|
|
259
|
-
OpenCode Go / SuperGrok
|
|
262
|
+
OpenCode Go / SuperGrok 启动和运行中都静默查询,底栏显示套餐名 + 剩余条 + 百分比;窄屏先丢掉套餐名,只留条和百分比。DeepSeek 官方余额只出现在 `/balance`,不进底栏。跨过 50% / 25% / 10% / 5% 才往工作区打 ⚠。`/usage` 或 `/balance` 仍打印完整结果。查询节奏按最紧窗口:5 小时额度每 10 轮(接近改 4 轮),周额度每 50 轮(接近改 10 轮),月额度每 80 轮(接近改 20 轮)。
|
|
260
263
|
|
|
261
264
|
## 配置
|
|
262
265
|
|
|
@@ -273,6 +276,8 @@ ssh-tui-subagent:
|
|
|
273
276
|
model: deepseek-v4-flash
|
|
274
277
|
# provider 可省略:省略时子代理跟随父会话提供方
|
|
275
278
|
# reasoningEffort 可省略:省略时跟随提供商/模型默认
|
|
279
|
+
ssh-tui:
|
|
280
|
+
language: zh # 或 en;/language 写入这里。DSH_TUI_LANG 优先
|
|
276
281
|
```
|
|
277
282
|
|
|
278
283
|
`/model`、`/mode`、`/submodel` 与 `/subeffort` 的修改会写回这里,
|
|
@@ -335,6 +340,7 @@ src/session-list.ts 历史会话扫描与标签(共享给 /resume)
|
|
|
335
340
|
src/session-lock.ts 同会话防双开
|
|
336
341
|
src/update-check.ts npm 最新版提示(不自动升级)
|
|
337
342
|
src/tui.ts 终端渲染、交互、统计、标题/铃声
|
|
343
|
+
src/i18n/ 中英界面字典(/language、DSH_TUI_LANG)
|
|
338
344
|
cordis.patch.yml dsh bundle patch(挂载 TUI 与 agent-presets)
|
|
339
345
|
scripts/ 安装 / 卸载 / 验证脚本
|
|
340
346
|
```
|
package/lib/i18n/en.js
ADDED
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
/** English UI catalog. Keys match `zh.ts`. */
|
|
2
|
+
export const en = {
|
|
3
|
+
'route.deepseek': 'DeepSeek official',
|
|
4
|
+
'route.supergrokKind': 'SuperGrok / X Premium subscription',
|
|
5
|
+
'route.supergrokShort': 'SuperGrok',
|
|
6
|
+
'route.go': 'OpenCode Go',
|
|
7
|
+
'route.zen': 'OpenCode Zen',
|
|
8
|
+
'route.registered': 'Registered provider',
|
|
9
|
+
'paint.localMs': 'Local paint {ms}ms',
|
|
10
|
+
'paint.sshMs': 'SSH paint {ms}ms',
|
|
11
|
+
'paint.sshMsUnprobed': 'SSH paint {ms}ms (RTT not measured)',
|
|
12
|
+
'paint.localChip': 'Local {pips}',
|
|
13
|
+
'paint.sshChip': 'SSH {pips} {delay}',
|
|
14
|
+
'footer.turnsSteps': '{turns} turns · {steps} steps',
|
|
15
|
+
'footer.tokens': 'in {input} · out {output}',
|
|
16
|
+
'footer.ttft': 'TTFT {duration}',
|
|
17
|
+
'footer.llmMs': 'model {duration}',
|
|
18
|
+
'footer.toolMs': 'tools {duration}',
|
|
19
|
+
'footer.cacheHit': 'cache hit {percent}%',
|
|
20
|
+
'footer.planReview': 'plan review',
|
|
21
|
+
'footer.waiting': 'waiting',
|
|
22
|
+
'footer.compacting': 'compacting',
|
|
23
|
+
'footer.retry': 'retry {retry}/{max}',
|
|
24
|
+
'footer.subagents': 'subagents {count}',
|
|
25
|
+
'footer.tools': 'tools {count}',
|
|
26
|
+
'footer.planOpen': 'turn left open',
|
|
27
|
+
'footer.planSwitching': 'switching plan',
|
|
28
|
+
'footer.planMode': 'plan mode',
|
|
29
|
+
'footer.goalActive': 'goal active',
|
|
30
|
+
'footer.goalPaused': 'goal paused',
|
|
31
|
+
'footer.goalBlocked': 'goal blocked',
|
|
32
|
+
'footer.waitSeconds': 'waiting {seconds}s',
|
|
33
|
+
'footer.running': 'running',
|
|
34
|
+
'footer.idle': 'idle',
|
|
35
|
+
'footer.search': 'search {index}/{total}',
|
|
36
|
+
'footer.inputFolded': 'input folded',
|
|
37
|
+
'footer.multiLine': 'multiline',
|
|
38
|
+
'footer.queued': 'queued {count}',
|
|
39
|
+
'footer.cwdChip': 'dir:{name}',
|
|
40
|
+
'footer.effortDefault': 'follow provider default',
|
|
41
|
+
'status.quotaNone': 'quota: none',
|
|
42
|
+
'status.quotaLine': 'quota: {plan} {parts}',
|
|
43
|
+
'status.questionsWaiting': 'questions: waiting {count}',
|
|
44
|
+
'status.questionsNone': 'questions: none',
|
|
45
|
+
'status.planOff': 'off',
|
|
46
|
+
'status.planPending': 'pending',
|
|
47
|
+
'status.planOn': 'on',
|
|
48
|
+
'sub.followParent': 'follow parent',
|
|
49
|
+
'sub.pinned': 'pinned {provider}',
|
|
50
|
+
'sub.sameFamily': 'same family',
|
|
51
|
+
'sub.crossFamily': 'cross-family',
|
|
52
|
+
'sub.light': 'light',
|
|
53
|
+
'sub.expensiveNoLight': 'expensive (no light model)',
|
|
54
|
+
'sub.expensive': 'expensive',
|
|
55
|
+
'sub.line': 'subagent: {model} · {follow} · {fit}',
|
|
56
|
+
'quota.alert': '⚠ {plan} {period} quota is down to {percent}%{reset}. Plan remaining usage.',
|
|
57
|
+
'quota.periodHourly': '5-hour',
|
|
58
|
+
'quota.periodWeekly': 'weekly',
|
|
59
|
+
'quota.periodMonthly': 'monthly',
|
|
60
|
+
'quota.periodUnknown': 'cycle',
|
|
61
|
+
'quota.resetIn': 'resets in ~{duration}',
|
|
62
|
+
'quota.resetAt': 'reset at {when}',
|
|
63
|
+
'quota.resetInParen': ' (resets in ~{duration})',
|
|
64
|
+
'quota.throttled': 'throttled',
|
|
65
|
+
'quota.ok': 'ok',
|
|
66
|
+
'quota.unknown': 'unknown',
|
|
67
|
+
'quota.windowHourly': 'rolling 5h',
|
|
68
|
+
'quota.windowWeekly': 'this week',
|
|
69
|
+
'quota.windowMonthly': 'this month',
|
|
70
|
+
'quota.snapshotHeader': '{plan} quota ({provider})',
|
|
71
|
+
'quota.snapshotWindow': ' {label} · {bar} remaining {percent}%{reset}',
|
|
72
|
+
'quota.unrecognized': 'quota payload was not recognized',
|
|
73
|
+
'quota.supergrokUnrecognized': 'SuperGrok quota payload was not recognized',
|
|
74
|
+
'quota.deepseekUnrecognized': 'DeepSeek balance payload was not recognized',
|
|
75
|
+
'balance.available': 'available',
|
|
76
|
+
'balance.granted': 'granted',
|
|
77
|
+
'balance.topped': 'topped up',
|
|
78
|
+
'balance.remaining': 'remaining',
|
|
79
|
+
'balance.total': 'total',
|
|
80
|
+
'balance.used': 'used',
|
|
81
|
+
'balance.hard': 'hard limit',
|
|
82
|
+
'balance.soft': 'soft limit',
|
|
83
|
+
'balance.generic': 'balance',
|
|
84
|
+
'balance.header': '{plan} balance ({provider})',
|
|
85
|
+
'balance.unavailable': 'account currently unavailable',
|
|
86
|
+
'balance.source': ' source {path}',
|
|
87
|
+
'toolTitle.edit': 'edit',
|
|
88
|
+
'toolTitle.write': 'write',
|
|
89
|
+
'toolTitle.str_replace_editor': 'replace',
|
|
90
|
+
'toolTitle.fetch': 'fetch',
|
|
91
|
+
'toolTitle.list_files': 'list files',
|
|
92
|
+
'toolTitle.list': 'list files',
|
|
93
|
+
'toolTitle.ls': 'list files',
|
|
94
|
+
'toolTitle.find': 'find files',
|
|
95
|
+
'toolTitle.search': 'web search',
|
|
96
|
+
'toolTitle.delete': 'delete',
|
|
97
|
+
'toolTitle.rm': 'delete',
|
|
98
|
+
'toolTitle.rename': 'rename',
|
|
99
|
+
'toolTitle.mv': 'rename',
|
|
100
|
+
'toolTitle.mkdir': 'mkdir',
|
|
101
|
+
'toolTitle.skills': 'skills',
|
|
102
|
+
'toolTitle.create_goal': 'create goal',
|
|
103
|
+
'toolTitle.update_goal': 'update goal',
|
|
104
|
+
'toolTitle.complete_goal': 'complete goal',
|
|
105
|
+
'toolTitle.clear_goal': 'clear goal',
|
|
106
|
+
'toolTitle.pause_goal': 'pause goal',
|
|
107
|
+
'toolTitle.resume_goal': 'resume goal',
|
|
108
|
+
'toolTitle.todo_write': 'update todos',
|
|
109
|
+
'toolTitle.todo': 'update todos',
|
|
110
|
+
'toolTitle.compact': 'compact',
|
|
111
|
+
'toolTitle.glob': 'glob',
|
|
112
|
+
'toolTitle.grep': 'search',
|
|
113
|
+
'toolTitle.read': 'read',
|
|
114
|
+
'toolTitle.web_search': 'web search',
|
|
115
|
+
'toolTitle.web_fetch': 'fetch',
|
|
116
|
+
'toolTitle.subagent': 'subagent',
|
|
117
|
+
'toolTitle.subagent_fork': 'subagent fork',
|
|
118
|
+
'toolTitle.ask_user_question': 'ask user',
|
|
119
|
+
'toolTitle.exit_plan_mode': 'submit plan',
|
|
120
|
+
'toolTitle.get_goal': 'view goal',
|
|
121
|
+
'card.thinking': 'thinking',
|
|
122
|
+
'card.plan': 'plan',
|
|
123
|
+
'card.subagent': 'subagent',
|
|
124
|
+
'card.reply': 'reply',
|
|
125
|
+
'card.tool': 'tool',
|
|
126
|
+
'card.question': 'question',
|
|
127
|
+
'card.goal': 'goal',
|
|
128
|
+
'card.prompt': 'prompt',
|
|
129
|
+
'card.expand': ' · Enter to expand',
|
|
130
|
+
'prompt.systemPreset': 'system preset',
|
|
131
|
+
'prompt.context': 'context',
|
|
132
|
+
'prompt.inject': 'prompt inject',
|
|
133
|
+
'prompt.injectWith': 'prompt inject:{sources}',
|
|
134
|
+
'plan.nudge': 'The plan strip still has unfinished todos at turn end. Call todo_write once now: mark finished items completed and leave the rest pending. Do not add new tasks.',
|
|
135
|
+
'plan.leftOpen': 'Turn left open: {count} todos remaining (session log unchanged).',
|
|
136
|
+
'plan.pendingNext': 'Mode switch takes effect on the next step.',
|
|
137
|
+
'plan.planningOnly': 'Plan only, no code changes until you confirm.',
|
|
138
|
+
'plan.executing': 'Executing the plan.',
|
|
139
|
+
'plan.allDone': 'All plan tasks completed.',
|
|
140
|
+
'plan.stillOpen': 'Plan still open; not everything is done.',
|
|
141
|
+
'plan.closed': 'Plan mode is off. Use /plan to re-enter.',
|
|
142
|
+
'plan.todoDone': '{count} done',
|
|
143
|
+
'plan.todoActive': '{count} in progress',
|
|
144
|
+
'plan.todoPending': '{count} pending',
|
|
145
|
+
'plan.list': 'todo list',
|
|
146
|
+
'plan.todoSummary': '{done}/{total} done',
|
|
147
|
+
'plan.waitConfirm': 'waiting to confirm the plan',
|
|
148
|
+
'plan.emptyBody': 'plan body is empty',
|
|
149
|
+
'plan.reviewing': 'plan review',
|
|
150
|
+
'plan.switching': 'switching',
|
|
151
|
+
'plan.complete': 'plan done',
|
|
152
|
+
'plan.archived': 'archived',
|
|
153
|
+
'plan.header': 'plan · {summary}',
|
|
154
|
+
'plan.moreLines': ' … {count} more plan lines',
|
|
155
|
+
'plan.noTodos': ' no todo list yet',
|
|
156
|
+
'plan.noTasks': 'no tasks yet',
|
|
157
|
+
'plan.entered': 'Entered plan mode: plan first, wait for confirmation, then change code. /plan off to exit.',
|
|
158
|
+
'plan.exited': 'Left plan mode; you can apply changes.',
|
|
159
|
+
'plan.requestOn': 'Requested plan mode.',
|
|
160
|
+
'plan.requestOff': 'Requested leaving plan mode.',
|
|
161
|
+
'plan.enterMode': 'enter plan mode',
|
|
162
|
+
'plan.exitMode': 'leave plan mode',
|
|
163
|
+
'plan.nudgeQueued': 'Asked the model to close leftover todos (once this turn).',
|
|
164
|
+
'plan.nudgeFailed': 'Failed to nudge todos: {error}',
|
|
165
|
+
'todo.list': 'todos',
|
|
166
|
+
'todo.empty': 'no tasks yet',
|
|
167
|
+
'todo.doneMark': 'done',
|
|
168
|
+
'todo.interrupted': 'interrupted',
|
|
169
|
+
'todo.failed': 'failed',
|
|
170
|
+
'ask.multi': '{text} ({count} questions)',
|
|
171
|
+
'tool.signal': ' [signal {signal}]',
|
|
172
|
+
'tool.exitCode': ' [exit {code}]',
|
|
173
|
+
'tool.noOutput': '(no output)',
|
|
174
|
+
'tool.args': 'args',
|
|
175
|
+
'tool.result': 'result',
|
|
176
|
+
'tool.reading': 'reading…',
|
|
177
|
+
'tool.inspectTitle': 'full tool · {title}',
|
|
178
|
+
'tool.inspectHint': 'PgUp/PgDn/wheel to scroll · Esc back to session',
|
|
179
|
+
'tool.inspectFooter': 'full {pos} · Esc to return',
|
|
180
|
+
'mode.standard': 'standard',
|
|
181
|
+
'boot.help': 'Type /help for keys · /find searches thinking/plan/subagent/reply · empty ↑/↓ selects cards',
|
|
182
|
+
'cwd.entered': 'Entered session working directory {cwd}',
|
|
183
|
+
'cwd.notAbsolute': 'Session working directory is not absolute: {path}',
|
|
184
|
+
'cwd.missing': 'Session working directory does not exist: {path}',
|
|
185
|
+
'cwd.failed': 'Could not enter session working directory {path}: {error}',
|
|
186
|
+
'cwd.full': 'working directory {cwd}',
|
|
187
|
+
'onboard.checkFailed': 'First-run setup check failed: {error}',
|
|
188
|
+
'onboard.syncSubFailed': 'Failed to sync subagent model: {error}',
|
|
189
|
+
'onboard.oauthHint': 'This is {kind} ({provider}) using local SuperGrok / X Premium OAuth — no API key. /model switches Grok model and effort; /provider switches to official or OpenCode. Use /setup only to add an API-key provider.',
|
|
190
|
+
'onboard.envInUse': 'Using {env} (environment / launch env file). /setup anytime to change it.',
|
|
191
|
+
'onboard.envStale': 'System already injected {env} (it may be stale). First-run wizard will overwrite your key; restart the TUI after save.',
|
|
192
|
+
'onboard.needSetup': 'First launch: configure a provider and API key (/setup anytime).',
|
|
193
|
+
'onboard.title': 'First-run wizard — pick a provider (same as the official Models page)',
|
|
194
|
+
'onboard.opt1': ' 1 DeepSeek official (api.deepseek.com)',
|
|
195
|
+
'onboard.opt2': ' 2 OpenCode Go (opencode.ai/zen/go, Responses)',
|
|
196
|
+
'onboard.opt3': ' 3 Custom OpenAI-compatible gateway (Completions)',
|
|
197
|
+
'onboard.opt4': ' 4 Custom OpenAI Responses gateway',
|
|
198
|
+
'onboard.opt5': ' 5 Anthropic Messages-compatible gateway',
|
|
199
|
+
'onboard.pickHint': ' Press 1-5, Esc to cancel',
|
|
200
|
+
'onboard.providerLine': 'Provider: {label}',
|
|
201
|
+
'onboard.idPrompt': 'Provider ID (lowercase letters/digits/hyphens, permanent):',
|
|
202
|
+
'onboard.default': ' default: {value}',
|
|
203
|
+
'onboard.enterEsc': ' Enter to confirm, Esc to cancel',
|
|
204
|
+
'onboard.keyPrompt': 'API Key (shown as •):',
|
|
205
|
+
'onboard.basePrompt': 'Base URL (empty uses {fallback}):',
|
|
206
|
+
'onboard.baseFallback': 'official/template default',
|
|
207
|
+
'onboard.modelsPrompt': 'Model IDs (comma or space separated):',
|
|
208
|
+
'onboard.modelsFetched': ' fetched ({count}): {list}',
|
|
209
|
+
'onboard.ctrlF': ' Ctrl+F = fetch model list from endpoint',
|
|
210
|
+
'onboard.confirmTitle': 'Save this configuration?',
|
|
211
|
+
'onboard.confirmProvider': ' provider: {label}',
|
|
212
|
+
'onboard.confirmBase': ' Base URL: {url}',
|
|
213
|
+
'onboard.confirmApi': ' API: {api}',
|
|
214
|
+
'onboard.confirmModels': ' models: {list}',
|
|
215
|
+
'onboard.confirmKey': ' API Key: {head}…{tail} (length {length})',
|
|
216
|
+
'onboard.confirmHint': ' y = save, n = redo, Esc = cancel',
|
|
217
|
+
'onboard.defaultParen': '(default)',
|
|
218
|
+
'onboard.providerCompletions': 'Custom OpenAI-compatible gateway (Completions)',
|
|
219
|
+
'onboard.providerResponses': 'Custom OpenAI Responses gateway',
|
|
220
|
+
'onboard.providerAnthropic': 'Anthropic Messages-compatible gateway',
|
|
221
|
+
'onboard.providerGo': 'OpenCode Go (opencode.ai/zen/go)',
|
|
222
|
+
'onboard.idInvalid': 'Provider ID may only contain lowercase letters, digits, and hyphens, and must not start with a hyphen.',
|
|
223
|
+
'onboard.keyEmpty': 'API Key cannot be empty.',
|
|
224
|
+
'onboard.needModel': 'At least one model ID is required.',
|
|
225
|
+
'onboard.needBase': 'Fill in the Base URL before fetching models.',
|
|
226
|
+
'onboard.fetchingModels': 'Fetching models from the endpoint…',
|
|
227
|
+
'onboard.llmMissing': 'llm service is unavailable',
|
|
228
|
+
'onboard.noModels': 'Endpoint returned no models; enter IDs manually.',
|
|
229
|
+
'onboard.fetchedModels': 'Fetched {count} models: {list} (Enter to confirm, or keep editing).',
|
|
230
|
+
'onboard.fetchFailed': 'Failed to fetch models: {error}',
|
|
231
|
+
'onboard.baseSaved': 'Base URL saved → {path}',
|
|
232
|
+
'onboard.officialDone': 'Saved deepseek-official / {model}. /provider switches other saved routes without /setup.',
|
|
233
|
+
'onboard.settingsMissing': 'settings service unavailable; custom provider was not saved.',
|
|
234
|
+
'onboard.providerSaved': 'Provider {id} saved → {path}',
|
|
235
|
+
'onboard.customDone': 'Saved {id} / {model}. Other providers keep their models and keys; /provider switches on the next request.',
|
|
236
|
+
'onboard.saveFailed': 'Failed to save config: {error}',
|
|
237
|
+
'onboard.credSaved': '{env} saved → {path}',
|
|
238
|
+
'onboard.envShadowWin': 'Environment variable {env} already wins; overwrote via setx + env.cmd. Open a new terminal.',
|
|
239
|
+
'onboard.envShadowUnix': 'Environment variable {env} already wins; wrote a launch-env override. Open a new terminal.',
|
|
240
|
+
'onboard.credMissing': 'credentials service unavailable; wrote a launch-env override → {path}',
|
|
241
|
+
'dialog.planReview': 'plan review {index}/{total}',
|
|
242
|
+
'dialog.ask': 'ask user {index}/{total}: {question}',
|
|
243
|
+
'dialog.recommended': ' (recommended)',
|
|
244
|
+
'dialog.freeform': ' (freeform: type below and press Enter)',
|
|
245
|
+
'dialog.multiHint': ' digits/letters toggle, Enter submits, Esc cancels',
|
|
246
|
+
'dialog.singleHint': ' digits/letters select, Enter submits, Esc cancels',
|
|
247
|
+
'dialog.scrolled': '↑ scrolled {count} lines · PgUp/PgDn/wheel · Esc to bottom',
|
|
248
|
+
'reason.done': '{marker} thought · {lines} lines',
|
|
249
|
+
'reason.live': '{marker} thinking {spinner} · {chars} chars',
|
|
250
|
+
'reason.elapsed': ' · {seconds}s',
|
|
251
|
+
'sub.cardWait': ' waiting for subagent output…',
|
|
252
|
+
'sub.cardEmpty': ' no visible output',
|
|
253
|
+
'sub.cardSession': ' session {id} · {provider}{external}',
|
|
254
|
+
'sub.external': ' · external process',
|
|
255
|
+
'sub.stopReason': ' stop reason: {reason}',
|
|
256
|
+
'sub.started': 'started',
|
|
257
|
+
'sub.startedDetail': 'started ({provider}{external})',
|
|
258
|
+
'sub.ended': 'ended ({reason})',
|
|
259
|
+
'sub.label': 'subagent {provider}',
|
|
260
|
+
'sub.turnEnd': 'turn ended ({reason})',
|
|
261
|
+
'sub.approval': 'waiting for approval: {tool}',
|
|
262
|
+
'sub.listLine': '▶ {label} {id} ({provider}) running {seconds}s [{run}]{activity}',
|
|
263
|
+
'sub.listHint': '{lines}\nEmpty ↑/↓ selects cards, Enter expands; Alt+3 jumps to the latest subagent.',
|
|
264
|
+
'sub.none': 'No active subagents.',
|
|
265
|
+
'sub.killNeedId': '/subagents kill <session-id> — missing subagent session id',
|
|
266
|
+
'sub.killRequested': 'Requested release of subagents: {ids}',
|
|
267
|
+
'sub.unknownAction': '/subagents unknown action "{action}" (list / kill <id>)',
|
|
268
|
+
'sub.followed': 'Subagent followed provider {provider}; model is now {model}{sessionOnly}',
|
|
269
|
+
'sub.sessionOnly': ' (this session only)',
|
|
270
|
+
'sub.settingsMissing': 'settings service unavailable; subagent choice is this session only.',
|
|
271
|
+
'sub.fetchingModels': 'Fetching subagent models ({provider})…',
|
|
272
|
+
'sub.modelFollow': 'Subagent model: {model} (provider follows parent {provider}).',
|
|
273
|
+
'sub.modelPinned': 'Subagent model: {model} (provider {provider}).',
|
|
274
|
+
'sub.effortUnset': 'Model {provider}/{model} declares no reasoning effort; kept the provider default. Do not set high/max by hand.',
|
|
275
|
+
'sub.pickEffort': 'Subagent reasoning effort ({provider}/{model})',
|
|
276
|
+
'sub.effortFollowHint': 'Clear custom effort; follow provider/model default',
|
|
277
|
+
'sub.effortRestored': 'Subagent effort restored to the provider default.',
|
|
278
|
+
'sub.effortSet': 'Subagent effort: {id}.',
|
|
279
|
+
'goal.active': 'active',
|
|
280
|
+
'goal.paused': 'paused',
|
|
281
|
+
'goal.blocked': 'blocked',
|
|
282
|
+
'goal.complete': 'complete',
|
|
283
|
+
'goal.cleared': 'cleared',
|
|
284
|
+
'goal.header': '● goal{spinner} · {phase} · {objective}',
|
|
285
|
+
'goal.help': ' Use /goal to view, pause, resume, or clear the current goal.',
|
|
286
|
+
'goal.unnamed': '(unnamed goal)',
|
|
287
|
+
'goal.clearedLabel': '(cleared)',
|
|
288
|
+
'goal.clearedNotice': 'Current goal cleared.',
|
|
289
|
+
'goal.set': 'Goal set',
|
|
290
|
+
'goal.pausedNotice': 'Goal paused',
|
|
291
|
+
'goal.blockedNotice': 'Goal blocked',
|
|
292
|
+
'goal.doneNotice': 'Goal complete',
|
|
293
|
+
'question.waiting': 'waiting',
|
|
294
|
+
'question.answered': 'answered',
|
|
295
|
+
'question.cancelled': 'cancelled',
|
|
296
|
+
'question.planTitle': 'plan review',
|
|
297
|
+
'question.askTitle': 'ask user',
|
|
298
|
+
'question.dialogHint': ' Use the dialog below; digits/letters select, Enter submits, Esc cancels.',
|
|
299
|
+
'compact.recoverTokens': 'recovered {tokens} tokens',
|
|
300
|
+
'compact.pruneChunks': 'pruned {count} chunks',
|
|
301
|
+
'compact.prepare': 'preparing summary',
|
|
302
|
+
'compact.running': 'compacting · {detail}',
|
|
303
|
+
'compact.failed': 'compact failed · {error}',
|
|
304
|
+
'compact.done': 'compacted · {detail}',
|
|
305
|
+
'compact.status': 'compacting…',
|
|
306
|
+
'compact.bodyRunning': ' Compacting session context; old tool results will be replaced by a summary.',
|
|
307
|
+
'compact.bodyError': ' {error}',
|
|
308
|
+
'compact.bodyDone': ' Compact wrote to the session log; the next turn sees a shorter history.',
|
|
309
|
+
'compact.finished': 'Context compact finished.',
|
|
310
|
+
'compact.failedNotice': 'Context compact failed: {error}',
|
|
311
|
+
'compact.short': 'compact',
|
|
312
|
+
'jump.planDock': 'Jumped to {category} (plan strip).',
|
|
313
|
+
'jump.missing': 'No {category} card right now.',
|
|
314
|
+
'jump.latest': 'Jumped to the latest {category}.',
|
|
315
|
+
'find.none': 'Nothing to search.',
|
|
316
|
+
'find.noMatch': 'No cards matching “{query}”.',
|
|
317
|
+
'find.hits': 'Found {count}{query} · {count}/{count} ({where}). Ctrl+G / Alt+N next, Alt+P previous.',
|
|
318
|
+
'find.empty': 'No search hits yet. /find thinking padAnsi, or Ctrl+/ to search.',
|
|
319
|
+
'find.step': 'Search “{query}” · {index}/{total} ({where}).',
|
|
320
|
+
'title.done': '\x1b]0;dsh ✓ done{suffix}\x07',
|
|
321
|
+
'title.waitAnswer': 'waiting for answer',
|
|
322
|
+
'title.subagents': 'running · subagents {count}',
|
|
323
|
+
'title.tools': 'running · tools {count}',
|
|
324
|
+
'title.idle': '\x1b]0;dsh idle{suffix}\x07',
|
|
325
|
+
'stall.warning': 'Model/tools silent for a long time. Esc or Ctrl+C cancels the turn.',
|
|
326
|
+
'stream.interrupted': ' ⚠ interrupted',
|
|
327
|
+
'stream.interruptedEmpty': 'Turn interrupted; nothing visible.',
|
|
328
|
+
'retry.generatingTitle': 'Generating a session title…',
|
|
329
|
+
'retry.busy': 'Model request failed, retrying',
|
|
330
|
+
'retry.progress': 'Model request failed, retry {retry}/{max} in {ms}ms: {message}',
|
|
331
|
+
'retry.started': 'Starting retry {retry}.',
|
|
332
|
+
'team.event': '[team] {type}',
|
|
333
|
+
'command.failed': 'Command failed.',
|
|
334
|
+
'command.images': ' (images ok)',
|
|
335
|
+
'approval.prompt': 'Allow tool "{tool}"? ({agent}){reason}',
|
|
336
|
+
'approval.hint': 'y = allow once, n = deny, Esc = cancel',
|
|
337
|
+
'approval.thisSession': 'this session',
|
|
338
|
+
'steer.queued': '⚡ {text} (queued while running; Esc/Ctrl+C cancels)',
|
|
339
|
+
'cancel.esc': 'Requested cancel of the current turn…',
|
|
340
|
+
'cancel.ctrlC': 'Requested cancel of the current turn… (Ctrl+C)',
|
|
341
|
+
'clear.transcript': 'Transcript cleared. Subagent, plan, and question cards reappear when new events arrive.',
|
|
342
|
+
'model.added': 'Model {model} added to provider {provider}.',
|
|
343
|
+
'model.addFailed': 'Could not write model {model} into the provider config: {error}',
|
|
344
|
+
'model.prevPage': '« previous',
|
|
345
|
+
'model.nextPage': '» next',
|
|
346
|
+
'model.current': 'current',
|
|
347
|
+
'model.pick': 'Pick a model (provider {provider} · {source}{pages})',
|
|
348
|
+
'model.configured': 'configured list',
|
|
349
|
+
'model.fetching': 'Fetching {provider} models from the endpoint…',
|
|
350
|
+
'model.live': 'live endpoint list',
|
|
351
|
+
'model.xaiCatalog': 'SuperGrok catalog',
|
|
352
|
+
'model.switched': 'Switched to {kind}: {provider}/{model} (effort {effort}{undeclared}); next request.',
|
|
353
|
+
'model.effortDefault': 'default',
|
|
354
|
+
'model.undeclared': ', this model declares no effort options',
|
|
355
|
+
'model.pickEffort': 'Reasoning effort ({model})',
|
|
356
|
+
'model.persistFailSettings': 'Could not persist the default: agentDefaultModel unavailable and settings write failed ({error}). This session only; restart falls back.',
|
|
357
|
+
'model.persistFailNone': 'Could not persist the default: settings service unavailable. This session only.',
|
|
358
|
+
'provider.none': 'No providers to switch. /setup an API-key route first.',
|
|
359
|
+
'provider.pick': 'Pick a provider',
|
|
360
|
+
'provider.currentKind': '{kind} · current',
|
|
361
|
+
'mode.pick': 'Pick a mode',
|
|
362
|
+
'mode.currentPrefix': 'current · ',
|
|
363
|
+
'mode.switched': 'Mode: {name} (this session).',
|
|
364
|
+
'mode.remembered': 'This session already has work; cannot switch mid-session. Remembered {name} for next launch.',
|
|
365
|
+
'mode.missingService': 'agentPresets service is unavailable.',
|
|
366
|
+
'mode.none': 'No modes (presets) available.',
|
|
367
|
+
'resume.running': 'A turn is running. Wait or Esc/cancel before switching sessions.',
|
|
368
|
+
'resume.same': 'Already on this session.',
|
|
369
|
+
'resume.noCallback': 'Session switch callback unavailable; cannot /resume.',
|
|
370
|
+
'resume.switching': 'Switching to session {id}…',
|
|
371
|
+
'resume.noPersistence': 'sessionPersistence service is unavailable.',
|
|
372
|
+
'resume.none': 'No resumable sessions (or /resume <session-id>).',
|
|
373
|
+
'resume.pick': 'Pick a session to resume',
|
|
374
|
+
'resume.unreadable': '⚠ unreadable · ',
|
|
375
|
+
'resume.cancelled': 'Session picker cancelled.',
|
|
376
|
+
'picker.title': 'DeepSeek Harness — pick a session to resume',
|
|
377
|
+
'picker.new': 'new session',
|
|
378
|
+
'picker.cancel': 'cancel',
|
|
379
|
+
'picker.noPersistence': 'dsh-ssh-tui: sessionPersistence service is unavailable\n',
|
|
380
|
+
'picker.none': 'dsh-ssh-tui: no resumable history sessions; starting a fresh session.\n',
|
|
381
|
+
'usage.querying': 'checking quota…',
|
|
382
|
+
'usage.none': 'Provider {provider} has no balance/quota API. DeepSeek official uses /user/balance; OpenAI-compatible gateways probe credit_grants; OpenCode Go and SuperGrok use subscription quota.',
|
|
383
|
+
'usage.sessionTokens': 'This session billed tokens: in {input} · out {output} (session stats, not invoice).',
|
|
384
|
+
'usage.sessionNone': 'No token usage recorded in this session yet.',
|
|
385
|
+
'usage.zenHeader': 'OpenCode Zen is metered ({provider})',
|
|
386
|
+
'usage.zenBody': 'Zen has no fixed quota. Check balance and invoices at https://opencode.ai/zen.',
|
|
387
|
+
'usage.noDeepseekKey': 'DEEPSEEK_API_KEY not found',
|
|
388
|
+
'usage.noCred': 'credential {env} not found',
|
|
389
|
+
'usage.pathBad': '{path}: unrecognized payload',
|
|
390
|
+
'usage.noGateway': 'OpenAI-compatible gateway had no balance API ({errors})',
|
|
391
|
+
'usage.noGrokToken': 'SuperGrok OAuth token not found (~/.grok-bridge/auth.json)',
|
|
392
|
+
'usage.noGoCred': 'OpenCode Go credential {env} not found',
|
|
393
|
+
'usage.fetchFail': 'Cannot reach {label} quota API: {error}',
|
|
394
|
+
'usage.http': '{label} quota API returned HTTP {status}',
|
|
395
|
+
'usage.goFetchFail': 'Cannot reach OpenCode quota API: {error}',
|
|
396
|
+
'usage.go401': 'OpenCode Go API key invalid or unauthorized (401){detail}',
|
|
397
|
+
'usage.go403': 'This key is not subscribed to OpenCode Go, or quota is unavailable (403){detail}',
|
|
398
|
+
'usage.goHttp': 'OpenCode Go quota API returned HTTP {status}{detail}',
|
|
399
|
+
'help.intro1': 'Enter steers while running; Esc drops selection or the turn; idle Ctrl+C exits.',
|
|
400
|
+
'help.intro2': 'Empty ↑/↓ selects cards (same as Ctrl+N/P); Enter expands (oversized bodies open a full view, Esc returns); Ctrl+R expands/collapses all; Ctrl+T folds input.',
|
|
401
|
+
'help.intro3': 'Alt+1 latest thinking · Alt+2 plan · Alt+3 subagent · Alt+4 latest reply.',
|
|
402
|
+
'help.intro4': '/find [thinking|plan|subagent|reply|prompt] query; Ctrl+/ or Alt+/ opens search, Ctrl+G / Alt+N next.',
|
|
403
|
+
'help.intro5': '/model changes model and effort for the current provider. /provider switches provider (then model); next request, no restart.',
|
|
404
|
+
'help.intro6': '/setup adds or updates one API-key provider without wiping others. SuperGrok uses local OAuth; no key.',
|
|
405
|
+
'help.intro7': '/status labels DeepSeek official, SuperGrok, OpenCode Go / Zen, plus link, quota window, and subagent family fit.',
|
|
406
|
+
'help.modelCancel': 'Model picker cancelled.',
|
|
407
|
+
'help.providerCancel': 'Provider picker cancelled.',
|
|
408
|
+
'help.submodelCancel': 'Subagent model picker cancelled.',
|
|
409
|
+
'help.subeffortCancel': 'Subagent effort picker cancelled.',
|
|
410
|
+
'help.modeCancel': 'Mode picker cancelled.',
|
|
411
|
+
'models.ellipsis': '{text}… ({count} total)',
|
|
412
|
+
'lock.held': 'Session {session} is already running as pid {pid}{tty}.\nDo not open a second TUI. If SSH dropped: tmux attach -t dsh\nIf that process is dead, delete the matching file in $DSH_HOME/tui-locks/ and start again.',
|
|
413
|
+
'lock.busy': 'Could not take session lock {path}',
|
|
414
|
+
'update.notice': 'New dsh-ssh-tui {latest} (current {current}). Update: dsh plugin --profile tui add dsh-ssh-tui',
|
|
415
|
+
'grok.refreshFail': 'SuperGrok token refresh failed (HTTP {status}{detail})',
|
|
416
|
+
'grok.writeFail': 'Could not write SuperGrok token ({path})',
|
|
417
|
+
'grok.noRefresh': 'SuperGrok token has no refresh_token; run dsh-llm-xai-oauth login --force',
|
|
418
|
+
'lang.pick': 'Interface language',
|
|
419
|
+
'lang.zh': '中文',
|
|
420
|
+
'lang.en': 'English',
|
|
421
|
+
'lang.zhDesc': 'Chinese UI (default for jump-host SSH)',
|
|
422
|
+
'lang.enDesc': 'English UI',
|
|
423
|
+
'lang.current': 'current',
|
|
424
|
+
'lang.switched': 'Interface language: {name}.',
|
|
425
|
+
'lang.unknown': 'Unknown language "{id}". Use zh or en.',
|
|
426
|
+
'lang.settingsMissing': 'settings service unavailable; language is this session only.',
|
|
427
|
+
'lang.cmd': 'switch UI language (zh / en); empty opens a picker',
|
|
428
|
+
};
|
|
429
|
+
//# sourceMappingURL=en.js.map
|