@aiwayds/dsh-tui-pi 2.18.2 → 2.20.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 (106) hide show
  1. package/README.md +12 -43
  2. package/README.zh-CN.md +11 -42
  3. package/lib/agents.js +67 -52
  4. package/lib/agents.js.map +1 -1
  5. package/lib/ask-user.d.ts +122 -3
  6. package/lib/ask-user.js +335 -41
  7. package/lib/ask-user.js.map +1 -1
  8. package/lib/attachments.js +8 -3
  9. package/lib/attachments.js.map +1 -1
  10. package/lib/btw.d.ts +4 -2
  11. package/lib/btw.js +22 -16
  12. package/lib/btw.js.map +1 -1
  13. package/lib/custom-provider.js +34 -28
  14. package/lib/custom-provider.js.map +1 -1
  15. package/lib/footer.d.ts +9 -8
  16. package/lib/footer.js +36 -18
  17. package/lib/footer.js.map +1 -1
  18. package/lib/hard-exit.d.ts +36 -0
  19. package/lib/hard-exit.js +64 -0
  20. package/lib/hard-exit.js.map +1 -0
  21. package/lib/history-fork.d.ts +2 -2
  22. package/lib/history-fork.js +12 -9
  23. package/lib/history-fork.js.map +1 -1
  24. package/lib/history-turns.d.ts +4 -2
  25. package/lib/history-turns.js +7 -3
  26. package/lib/history-turns.js.map +1 -1
  27. package/lib/history.js +57 -45
  28. package/lib/history.js.map +1 -1
  29. package/lib/hotkeys.js +44 -33
  30. package/lib/hotkeys.js.map +1 -1
  31. package/lib/i18n/index.d.ts +54 -0
  32. package/lib/i18n/index.js +98 -0
  33. package/lib/i18n/index.js.map +1 -0
  34. package/lib/i18n/registry.d.ts +65 -0
  35. package/lib/i18n/registry.js +129 -0
  36. package/lib/i18n/registry.js.map +1 -0
  37. package/lib/index.js +219 -109
  38. package/lib/index.js.map +1 -1
  39. package/lib/language-ask.d.ts +98 -0
  40. package/lib/language-ask.js +118 -0
  41. package/lib/language-ask.js.map +1 -0
  42. package/lib/live-widgets.js +9 -8
  43. package/lib/live-widgets.js.map +1 -1
  44. package/lib/login.js +5 -4
  45. package/lib/login.js.map +1 -1
  46. package/lib/messages.d.ts +0 -4
  47. package/lib/messages.js +14 -15
  48. package/lib/messages.js.map +1 -1
  49. package/lib/model-profiles.js +32 -20
  50. package/lib/model-profiles.js.map +1 -1
  51. package/lib/panels.js +18 -17
  52. package/lib/panels.js.map +1 -1
  53. package/lib/preflight-projcache.js +9 -3
  54. package/lib/preflight-projcache.js.map +1 -1
  55. package/lib/preset-dialog.d.ts +3 -3
  56. package/lib/preset-dialog.js +20 -17
  57. package/lib/preset-dialog.js.map +1 -1
  58. package/lib/provider-catalog.d.ts +23 -7
  59. package/lib/provider-catalog.js +90 -68
  60. package/lib/provider-catalog.js.map +1 -1
  61. package/lib/queue-panel.d.ts +2 -2
  62. package/lib/queue-panel.js +13 -9
  63. package/lib/queue-panel.js.map +1 -1
  64. package/lib/repair-dialog.d.ts +4 -4
  65. package/lib/repair-dialog.js +23 -16
  66. package/lib/repair-dialog.js.map +1 -1
  67. package/lib/route-dialog.d.ts +3 -3
  68. package/lib/route-dialog.js +20 -14
  69. package/lib/route-dialog.js.map +1 -1
  70. package/lib/selectors.d.ts +15 -1
  71. package/lib/selectors.js +57 -23
  72. package/lib/selectors.js.map +1 -1
  73. package/lib/sessions.d.ts +47 -14
  74. package/lib/sessions.js +162 -53
  75. package/lib/sessions.js.map +1 -1
  76. package/lib/settings.d.ts +68 -9
  77. package/lib/settings.js +327 -78
  78. package/lib/settings.js.map +1 -1
  79. package/lib/skills-manager.js +27 -21
  80. package/lib/skills-manager.js.map +1 -1
  81. package/lib/skills.js +5 -4
  82. package/lib/skills.js.map +1 -1
  83. package/lib/startup-info.js +9 -3
  84. package/lib/startup-info.js.map +1 -1
  85. package/lib/steer-flow.d.ts +14 -4
  86. package/lib/steer-flow.js +24 -9
  87. package/lib/steer-flow.js.map +1 -1
  88. package/lib/stop-dialog.d.ts +2 -2
  89. package/lib/stop-dialog.js +16 -12
  90. package/lib/stop-dialog.js.map +1 -1
  91. package/lib/subagent-viewer.d.ts +3 -8
  92. package/lib/subagent-viewer.js +38 -62
  93. package/lib/subagent-viewer.js.map +1 -1
  94. package/lib/theme-preview.js +12 -11
  95. package/lib/theme-preview.js.map +1 -1
  96. package/lib/theme-settings.d.ts +44 -2
  97. package/lib/theme-settings.js +97 -54
  98. package/lib/theme-settings.js.map +1 -1
  99. package/lib/tui.js +2 -1
  100. package/lib/tui.js.map +1 -1
  101. package/locales/en.json +646 -0
  102. package/locales/ja.json +646 -0
  103. package/locales/ko.json +646 -0
  104. package/locales/zh-CN.json +646 -0
  105. package/package.json +2 -1
  106. package/skills/dsh-tui-pi-config/SKILL.md +14 -4
@@ -0,0 +1,646 @@
1
+ {
2
+ "name": "日本語",
3
+ "command.language.description": "UI 言語を切り替えます(/language は選択を尋ねます。/language <コード> で直接切り替え)",
4
+ "command.language.unknown": "不明な言語「{id}」です。インストール済み: {list}",
5
+ "command.language.switched": "言語を {name}({id})に切り替えました。次の再描画から適用されます。既存の会話ログは再構築されるまで旧言語のまま表示されます。",
6
+ "command.language.persistFailed": "このセッションでは切り替わりましたが、設定の保存に失敗しました: {error}",
7
+ "command.language.unchanged": "言語は変更されていません。",
8
+ "command.language.unavailable": "言語を選ぶための ask-user 応答側がありません。インストール済み: {list} — /language <コード> を使用してください。",
9
+ "command.language.askFailed": "言語の確認を要求できませんでした: {error}",
10
+ "settings.language.description": "UI 言語: locales/ 同梱ディレクトリまたは ~/.dsh/locales のロケール id(例: 'en'、'zh-CN')。不明な id は 'en' にフォールバックします。次の再描画で適用 — /language コマンドなら即時切り替え",
11
+ "settings.theme.description": "端末のカラースキーム('auto' は端末に追従、'light'/'dark' は GitHub パレット、その他の値は登録済みカスタムテーマ名)",
12
+ "settings.panelHeight.description": "思考/ツールパネルの高さ('1' = 1 行: 識別子 + 経過時間 + 最終行を右側で切り詰め。'5'/'7'/'10' = ボックスヘッダー + 内容行、枠線で +2 行。'all' = 全内容 — ストリーミング推論は 200 行のライブテール、ツール結果は 2000 行まで)",
13
+ "settings.maxAgents.description": "同時に実行できるサブエージェントの最大数(0 = 無制限)",
14
+ "settings.maxRounds.description": "TUI が要約リクエストを送るまでの、サブエージェントごとのアシスタントメッセージ数上限(0 = 無制限)",
15
+ "settings.maxRoundsGrace.description": "要約リクエスト後にサブエージェントが動き続けられるラウンド数。超えると TUI が強制停止します(0 = 警告のみ、強制停止なし)",
16
+ "settings.disableSubagent.description": "ネイティブの subagent ツールを無効化します(委譲は登録済みエージェント ~/.dsh/agents/*.md 経由の use_agent で行う)。subagent_fork/workflow/ralph は引き続き利用可",
17
+ "settings.registeredOnly.description": "use_agent 以外のすべてのスポーンツールを封鎖します: 委譲で作れるのは登録済みエージェント定義(~/.dsh/agents/*.md)に裏付けられたサブエージェントのみ。アドホックな経路(subagent、subagent_fork、workflow、ralph)はガードで拒否されます",
18
+ "settings.footerHints.description": "表示するフッターショートカットヒント(項目ごとに on/off を切り替え)",
19
+ "settings.footerHints.send.description": "フッターヒントバーに「Enter: 送信」を表示",
20
+ "settings.footerHints.stop.description": "フッターヒントバーに「Esc ×2: 停止」を表示",
21
+ "settings.footerHints.quit.description": "フッターヒントバーに「Ctrl+C ×2: 終了」を表示",
22
+ "settings.footerHints.quitEmpty.description": "フッターヒントバーに「Ctrl+D: 終了(空入力)」を表示",
23
+ "settings.footerHints.subagents.description": "フッターヒントバーに「Ctrl+G: サブエージェント」を表示",
24
+ "settings.footerHints.search.description": "フッターヒントバーに「Ctrl+Shift+F: 検索」を表示",
25
+ "settings.footerHints.history.description": "フッターヒントバーに「↑↓: 履歴」を表示",
26
+ "settings.cacheHitMode.description": "フッターの CH セグメントの集計範囲: 'lastMessage' = 直近のアシスタントメッセージ自体のヒット率(pi-tui のフッターと一致)。'session' = セッション全体の入力トラフィックの累積ヒット率。次回のフッター再描画で適用",
27
+ "settings.iconSet.description": "リスクのあるグリフのアイコンセット('auto' = 起動時に Nerd Font を検出したら nerdfont、なければ plain。'nerdfont' = powerline PUA グリフ(U+E0B0 区切り、停止、太丸)。plain = 安全な Unicode 代替(▸ ■ ●)— 推奨は auto)",
28
+ "settings.rememberPreset.description": "ワークスペースごとに最後の /preset 選択を記憶し、同じディレクトリでの次回起動時にそれを使います(サーバーデフォルトの代わり)。false は常にサーバー側のデフォルトプリセットで起動します",
29
+ "settings.favoriteModels.description": "お気に入りのモデル(provider/id キー)。/model ピッカーの先頭に固定表示します",
30
+ "settings.hiddenModels.description": "非表示のモデル(provider/id キー)。/model ピッカーの非表示セクションへ移動します",
31
+ "settings.retention.description": "起動時の ~/.dsh/sessions セッションログ清掃(ここに明示した値は DSH_TUI_RETENTION_* 環境変数より優先)",
32
+ "settings.retention.maxCount.description": "セッションログ保持: セッションは最大この数まで保持(<= 0 で清掃を無効化)。DSH_TUI_RETENTION_MAX_COUNT より優先。次回起動時に適用",
33
+ "settings.retention.maxAgeDays.description": "セッションログ保持: この日数以上触れられていないログを削除(> 0)。DSH_TUI_RETENTION_MAX_AGE_DAYS より優先。次回起動時に適用",
34
+ "settings.retention.minIdleHours.description": "セッションログ保持: 件数ルール専用のアイドル保護(時間単位、>= 0)。DSH_TUI_RETENTION_MIN_IDLE_HOURS より優先。次回起動時に適用",
35
+ "settings.resume.description": "再開ピッカーの表示フィルタ(ここに明示した値は DSH_TUI_RESUME_* 環境変数より優先)",
36
+ "settings.resume.maxAgeDays.description": "再開ピッカー: ログ活動がこの期間内のセッションのみ表示(> 0)。DSH_TUI_RESUME_MAX_AGE_DAYS より優先",
37
+ "settings.resume.minBytes.description": "再開ピッカー: 1 行あたりの最小圧縮ログサイズ(>= 0)。DSH_TUI_RESUME_MIN_BYTES より優先",
38
+ "settings.askUser.description": "Ask User 質問パネルのタイムアウト(ここに明示した値は DSH_TUI_ASK_USER_* 環境変数より優先)",
39
+ "settings.askUser.idleMinutes.description": "Ask User パネル: フォーカス中の質問にこの分数キー入力がなければ自動回答 — 未回答の質問は推奨オプション(リストの先頭)を採用し、プランが自動承認されることはありません。<= 0 で無入力ルールを無効化。DSH_TUI_ASK_USER_IDLE_MINUTES より優先",
40
+ "settings.askUser.absoluteMinutes.description": "Ask User パネル: 質問ごとのハード上限 — この分数を過ぎると操作を続けていても自動回答します(パネルが実行を拘束し続けることは許されない)。<= 0 で上限を無効化。DSH_TUI_ASK_USER_ABSOLUTE_MINUTES より優先",
41
+ "ask.language.header": "言語",
42
+ "ask.language.question": "TUI の UI 言語はどれにしますか?",
43
+ "ask.language.detail": "現在は {current} です。選ぶと即座に反映され(次の再描画から新言語、既存の会話ログは再構築まで旧言語のまま)、dsh-tui.language に保存されます。",
44
+ "ask.language.current": "現在",
45
+ "ask.sentinel": "何か入力してください。",
46
+ "ask.questionFallback": "質問 {n}",
47
+ "ask.confirmRow": "⏎ 回答を確定",
48
+ "ask.col.selection": "選択",
49
+ "ask.title.single": "● 質問",
50
+ "ask.title.multi": "● 質問({index}/{total})",
51
+ "ask.empty": "(質問なし)",
52
+ "ask.escHint": "もう一度 Esc で辞退",
53
+ "ask.footer.editing": "自由入力 · Enter 採用 · ↑↓ 移動 · Ctrl+T 折りたたみ · Esc 破棄",
54
+ "ask.footer.tabs": "←→ タブ切替 · ",
55
+ "ask.footer.navSelect": "↑↓ 移動 · Enter 選択 · 1-9 直接選択 · Ctrl+T 折りたたみ · Esc 辞退",
56
+ "ask.footer.navToggle": "↑↓ 移動 · Enter 切替 · 1-9 直接選択 · Ctrl+T 折りたたみ · Esc 辞退",
57
+ "ask.review.title": "● 回答の確認",
58
+ "ask.review.colQuestion": "質問",
59
+ "ask.review.colAnswer": "あなたの回答",
60
+ "ask.review.submit": "回答を送信",
61
+ "ask.review.ready": "✓ 準備完了",
62
+ "ask.review.incomplete": "— 未完了",
63
+ "ask.review.footer": "↑↓ 選択 · Enter で編集に戻る/送信 · Ctrl+T 折りたたみ",
64
+ "ask.review.noAnswer": "(未回答)",
65
+ "ask.collapsed.esc": "もう一度 Esc で辞退 · Ctrl+T 展開",
66
+ "ask.collapsed.review": "● 回答レビュー待ち · Ctrl+T 展開",
67
+ "ask.collapsed.question": "● 未回答の質問",
68
+ "ask.collapsed.questions": "● 質問({index}/{total} · {answered} 件回答済み)",
69
+ "ask.collapsed.expand": "Ctrl+T 展開",
70
+ "ask.autoIn": "{time} 後に自動回答",
71
+ "ask.incomplete": "先にすべての質問に回答してください",
72
+ "ask.copied": "コピーしました",
73
+ "ask.notice.timeoutReview": "ask_user_question: タイムアウト — 入力済みの回答を送信しました",
74
+ "ask.notice.timeoutAuto": "ask_user_question: タイムアウト — 未回答の質問には推奨オプションを採用しました(回答内に記載)",
75
+ "ask.settings.invalid": "設定 dsh-tui.askUser.{key}: 無効な値 {value} — 環境変数/デフォルトにフォールバックします",
76
+ "viewer.footer.running": "↑↓ スクロール · Esc 閉じる · x ×2 停止 · Enter 割り込み",
77
+ "viewer.footer.settled": "↑↓ スクロール · Esc 閉じる · x ×2 閉じる · Enter 割り込み",
78
+ "viewer.steer.footer": "Enter 送信 · Shift+Enter 改行 · Esc キャンセル",
79
+ "viewer.steer.sent": "割り込みメッセージを送信しました",
80
+ "viewer.steer.ended": "このサブエージェントは終了済みです — 割り込みできません",
81
+ "viewer.steer.title": "{label} に割り込み",
82
+ "viewer.steer.hint": "プラグイン発のユーザーメッセージとして送達されます。",
83
+ "viewer.title": "● サブエージェント",
84
+ "viewer.col.subagent": "サブエージェント",
85
+ "viewer.col.stats": "統計",
86
+ "viewer.pickerFooter": "↑↓ 移動 · Enter 開く · s ソート · K 全部停止 · Esc 閉じる",
87
+ "viewer.truncated": "…履歴を切り詰め(イベント上限 {cap})",
88
+ "viewer.hardStopped": "⏻ maxRounds ポリシーで強制停止(ラウンド {round} + 猶予消費、上限 {cap})",
89
+ "viewer.noEvents": " — イベントはまだありません —",
90
+ "viewer.canceling": "⏹ このサブエージェントをキャンセル中…",
91
+ "viewer.stopAllOne": "⏹ 全停止: サブエージェント 1 件をキャンセルしました",
92
+ "viewer.stopAllMany": "⏹ 全停止: サブエージェント {n} 件をキャンセルしました",
93
+ "viewer.header.child": "ⓘ サブエージェント {id}",
94
+ "viewer.status.running": "実行中",
95
+ "viewer.status.completed": "完了",
96
+ "viewer.status.failed": "失敗",
97
+ "viewer.status.cancelled": "キャンセル済み",
98
+ "viewer.route.think": "思考 {effort}",
99
+ "viewer.rounds": "ラウンド {count}{cap}",
100
+ "viewer.hardStoppedAt": "⏻ 強制停止 @{round}",
101
+ "viewer.injected": "⚡ 注入済み",
102
+ "viewer.stopped": "⏻ 停止済み",
103
+ "viewer.event.turnStart": "– ターン {n} 開始",
104
+ "viewer.event.turnEnd": "– ターン {n} 終了 · {detail}",
105
+ "viewer.event.error": "エラー",
106
+ "viewer.event.errorDetail": "エラー: {message}",
107
+ "viewer.event.subagent": "サブエージェント",
108
+ "viewer.event.todos": "☑ ToDo {done}/{total}: {summary}",
109
+ "agentsmg.error.integer": "非負の整数を期待しましたが「{text}」でした",
110
+ "agentsmg.inherit": "(継承)",
111
+ "agentsmg.inheritWord": "継承",
112
+ "agentsmg.model.title": "● モデル",
113
+ "agentsmg.picker.colModel": "モデル",
114
+ "agentsmg.picker.colProvider": "プロバイダー",
115
+ "agentsmg.openFailed": "✘ エージェントビューを開けませんでした: {message}",
116
+ "agentsmg.title": "● エージェント",
117
+ "agentsmg.col.name": "名前",
118
+ "agentsmg.col.model": "モデル",
119
+ "agentsmg.col.deep": "深度",
120
+ "agentsmg.col.description": "説明",
121
+ "agentsmg.tableFooter": "↑↓ 移動 · Enter 開く · Esc 戻る · l 制限",
122
+ "agentsmg.seededNote": " ({dir} から {n} 件取り込み)",
123
+ "agentsmg.updated": "エージェントを更新しました: {list}{note}",
124
+ "agentsmg.seededOnly": "{dir} からエージェント {n} 件を取り込みました — 変更はありません。",
125
+ "agentsmg.noDescription": "(説明なし)",
126
+ "agentsmg.target.profile": "model/think の変更はプロファイル「{name}」に適用されます(ワークスペース単位 — frontmatter のベースラインは変更しません)",
127
+ "agentsmg.target.frontmatter": "ワークスペースプロファイルのピン留めなし — 変更は frontmatter ベースライン(グローバル)に書き込みます",
128
+ "agentsmg.inheritDefault": "(継承 — デフォルトモデル)",
129
+ "agentsmg.fieldsFooter": "↑↓ 項目 · Enter 編集(m モデル · t 思考 · d 深度)· v 完全プロンプト · Esc 戻る",
130
+ "agentsmg.savedModel": "{name} → {model}{think}{scope} を保存",
131
+ "agentsmg.thinkSuffix": " · 思考 {effort}",
132
+ "agentsmg.scopeNote": " (プロファイル「{name}」)",
133
+ "agentsmg.error.noModel": "✘ モデルが未設定です — 先にモデルを選択してください(m)",
134
+ "agentsmg.error.noLlm": "✘ llm サービスが利用できません",
135
+ "agentsmg.error.noThinkLevels": "✘ {model} の思考レベルを解決できません",
136
+ "agentsmg.error.modelNoThink": "✘ {model} には思考レベルがありません",
137
+ "agentsmg.savedThink": "{name} → 思考 {effort}{scope} を保存",
138
+ "agentsmg.deep.title": "最大スポーン深度 — {name}",
139
+ "agentsmg.deep.subtitle": "0 = このエージェントはサブエージェントをスポーンしない · 無制限は不可",
140
+ "agentsmg.deep.saved": "最大深度 {n} を保存しました — このエージェントのスポーン時に有効になります",
141
+ "agentsmg.deep.status": "{name} → 最大深度 {n} を保存",
142
+ "agentsmg.body.title": "ⓘ {name} · システムプロンプト",
143
+ "agentsmg.body.footer": " Esc で閉じる",
144
+ "agentsmg.limits.maxAgents": "{n} · 同時に実行できる子エージェント数(0 = 無制限)",
145
+ "agentsmg.limits.maxRounds": "{n} · まとめまでのアシスタントメッセージ数(0 = 無制限)",
146
+ "agentsmg.limits.maxRoundsGrace": "{n} · 強制停止までのまとめラウンド数(0 = 警告のみ)",
147
+ "agentsmg.limits.disableSubagent": "{value} · ネイティブ subagent ツール",
148
+ "agentsmg.limits.registeredOnly": "{value} · use_agent のみスポーン可(subagent/fork/workflow/ralph を封鎖)",
149
+ "agentsmg.on": "オン",
150
+ "agentsmg.off": "オフ",
151
+ "agentsmg.limits.title": "⚙ サブエージェント",
152
+ "agentsmg.limits.footer": "↑↓ 項目 · Enter 編集(0 = 無制限)· d subagent 切替 · r 登録済みのみ · Esc 戻る",
153
+ "agentsmg.limits.intro": "サブエージェント委譲の設定項目 — スポーン/ターン判定のたびにリアルタイムで読み込まれます",
154
+ "agentsmg.limits.runtime": "ランタイム: 実行中 {live} · 許可 {allowed} · 拒否 {denied} · 削除 {pruned} · 進行中 {inFlight}(TUI 起動以降)",
155
+ "agentsmg.limits.noAgents": "{dir} にはまだエージェントがありません — markdown ファイルを置くと定義になります",
156
+ "agentsmg.limits.broken": "壊れたファイル {n} 件を無視しました",
157
+ "agentsmg.limit.title": "{key} — サブエージェント委譲上限(現在 {current})",
158
+ "agentsmg.limit.subtitle": "非負の整数 · 0 = 無制限 · 空欄で現在値を維持",
159
+ "agentsmg.limit.saved": "{key} → {n} を保存しました — 今後のサブエージェントのスポーンに適用されます",
160
+ "agentsmg.subagent.disabled": "subagent ツールを無効化しました — 今後のサブエージェントのスポーンに適用されます",
161
+ "agentsmg.subagent.enabled": "subagent ツールを有効化しました — 今後のサブエージェントのスポーンに適用されます",
162
+ "agentsmg.fence.on": "登録済みのみ制限 ON — use_agent だけがスポーンできます",
163
+ "agentsmg.fence.off": "登録済みのみ制限 OFF — アドホックなスポーンツールが利用できます",
164
+ "queue.footer": "↑↓ 選択 · d 削除 · s 今すぐ割り込み · Esc 閉じる",
165
+ "queue.refreshFailed": "キュー状態の更新に失敗しました — 下のリストは古くなっている可能性があります。",
166
+ "queue.target.steer": "↪ 割り込み",
167
+ "queue.target.queued": "⏳ キュー待ち",
168
+ "queue.title": "送信待ちメッセージ",
169
+ "queue.empty": "— 送信待ちメッセージはありません —",
170
+ "skillsmgr.reason.notSymlink": "シンボリックリンクではない",
171
+ "skillsmgr.reason.differentSource": "リンク元が異なる",
172
+ "skillsmgr.reason.sourceMissing": "リンク元がない",
173
+ "skillsmgr.reason.destMissing": "リンク先がない",
174
+ "skillsmgr.reason.failed": "失敗",
175
+ "skillsmgr.summary.more": " ほか {n} 件",
176
+ "skillsmgr.summary.ok": "成功: {list}",
177
+ "skillsmgr.summary.applied": "{ok}/{total} 件に適用 — {okPart}失敗: {failed}",
178
+ "skillsmgr.title": "⚙ スキルマネージャー",
179
+ "skillsmgr.unsaved": " (未保存 {n} 件)",
180
+ "skillsmgr.noMatches": "「{query}」に一致するスキルはありません",
181
+ "skillsmgr.col.on": "有効",
182
+ "skillsmgr.col.skill": "スキル",
183
+ "skillsmgr.footer.confirm": "未保存の変更を破棄しますか? Y/N",
184
+ "skillsmgr.footer.filter": "フィルタ: {query} · Backspace クリア · Esc フィルタ解除",
185
+ "skillsmgr.footer.dirty": "↑↓ 移動 · Space 切替 · Enter 適用 · Esc 破棄",
186
+ "skillsmgr.footer.idle": "↑↓ 移動 · PgUp/PgDn ページ · Home/End ジャンプ · Space 切替 · Enter 適用 · Esc 戻る",
187
+ "skillsmgr.scanning": "公開スキルを走査中…",
188
+ "skillsmgr.empty": "~/.agents/skills/ に公開スキルが見つかりません。",
189
+ "skillsmgr.readError": "~/.agents/skills/ を読み込めません。",
190
+ "skills.error.cannotRead": "スキルファイルを読み込めません: {path}",
191
+ "skills.error.missingFrontmatter": "frontmatter がありません(ファイルは `---` で始まる必要があります)",
192
+ "skills.error.missingCloseFence": "frontmatter の閉じフェンスがありません",
193
+ "skills.error.cannotWrite": "スキルファイルに書き込めません: {message}",
194
+ "btw.error.noQuestion": "/btw --model の後に質問がありません。",
195
+ "btw.error.invalidModel": "無効な --model「{model}」 — provider/model の形式が必要です。",
196
+ "btw.queueFull": "btw キューが満杯です({cap})",
197
+ "btw.error.unknownStream": "不明なモデルストリームエラーです。",
198
+ "btw.error.maxTokens": "回答が出力トークンの上限に達しました。",
199
+ "btw.error.toolCalls": "サイドモデルが予期せずツールを要求しました。",
200
+ "btw.error.unsupportedFinish": "未対応のストリーム終了種別: {kind}",
201
+ "btw.error.noFinish": "モデルストリームが finish チャンクなしで終了しました。",
202
+ "btw.error.noModel": "モデルが未選択のため btw を実行できません。",
203
+ "btw.error.modelUnavailable": "btw モデル「{model}」は利用できません。",
204
+ "btw.background": "btw がバックグラウンドで実行中 — /btw で回答を表示します。",
205
+ "btw.failed": "btw が失敗しました: {message}",
206
+ "btw.notice.idle": "/btw はターン実行中に並行して質問するためのものです — 今はメインラインがアイドルなので、直接質問してください。",
207
+ "btw.notice.usage": "使い方: /btw <質問> — メインタスクの実行中に補助質問をします。回答は一時オーバーレイにストリーミング表示され、セッションには保存されません。",
208
+ "misc.attachment.loading": "🖼 {name} — 読み込み中({width}×{height})",
209
+ "misc.attachment.more": "🖼 +{n} 枚の画像は未表示",
210
+ "misc.attachment.unavailable": "🖼 {name} — 利用不可{code}",
211
+ "misc.todos.title": "● ToDo ",
212
+ "misc.todos.showing": " · {ranges} を表示",
213
+ "misc.todos.task": "タスク",
214
+ "misc.agent.rounds": "ラウンド {n}{cap}",
215
+ "misc.agent.fallbackName": "サブエージェント",
216
+ "misc.pending.queued": "⏳ キュー待ち",
217
+ "misc.pending.steer": "↪ 割り込み",
218
+ "misc.pending.canceled": "✕ キャンセル済み",
219
+ "misc.pending.notDelivered": "✘ 未送達",
220
+ "misc.turnFailed": "ターン失敗",
221
+ "misc.interrupted": "中断",
222
+ "misc.tokenLimit": "⚠ 出力トークン上限に到達",
223
+ "stop.confirm.title": "● すべての LLM 処理を停止しますか?",
224
+ "stop.confirm.mainRunning": "メインターンが応答を生成中",
225
+ "stop.confirm.childrenOne": "サブエージェント {count} 件が実行中",
226
+ "stop.confirm.childrenMany": "サブエージェント {count} 件が実行中",
227
+ "stop.confirm.joiner": "、",
228
+ "stop.confirm.situation": "現在、{parts}。",
229
+ "stop.confirm.idle": "現在実行中の処理はありません。",
230
+ "stop.confirm.reassure": "確定すると、メインターンと実行中のすべてのサブエージェントをキャンセルします。キュー待ちのメッセージは保持され、セッションは再開できます。",
231
+ "stop.option.stop": "すべて停止 — メインターンと全サブエージェントをキャンセル",
232
+ "stop.option.cancel": "キャンセル — すべて実行を続ける",
233
+ "stop.footer": "↑↓ 選択 · 1/2 直接選択 · Enter 確定 · Esc 実行継続",
234
+ "repair.confirm.title": "● 再開ログが破損しています",
235
+ "repair.confirm.body": "再開ログが破損しています(過去の二重書き込みが原因の可能性)。その場で修復しますか? 元のログは .corrupt-bak として残ります。",
236
+ "repair.option.repair": "修復して再開",
237
+ "repair.option.repairHint": "ログをその場で再構築し、セッションに入ります",
238
+ "repair.option.cancel": "キャンセル",
239
+ "repair.option.cancelHint": "ログはそのまま変更しません",
240
+ "repair.footer": "↑↓ 選択 · 1/2 直接選択 · Enter 確定 · Esc キャンセル",
241
+ "presetdlg.title.switch": "● プリセットを {name} に切り替えますか?",
242
+ "presetdlg.title.restart": "● {name} でセッションを再スタートしますか?",
243
+ "presetdlg.fork.switch": "フォークして切替 — {name} 上で新セッションを作成し、この会話を引き継ぎます",
244
+ "presetdlg.fork.restart": "フォークして再スタート — {name} 上で新セッションを作成し、この会話を引き継ぎます",
245
+ "presetdlg.fresh.switch": "新規スタート — {name} 上で新しい空セッションを作成します",
246
+ "presetdlg.fresh.restart": "今すぐ再スタート — {name} 上で新しい空セッションを作成します",
247
+ "presetdlg.point.switch": "切り替えると {name} 上で新しいセッションを開始します。",
248
+ "presetdlg.point.restart": "再スタートすると {name} 上で新しいセッションを開始します。",
249
+ "presetdlg.option.cancel": "キャンセル — 現在のセッションに留まります",
250
+ "presetdlg.carry": "フォークはこの会話を新しいセッションに引き継ぎます(圧縮済みコンテキストを含む)— 新規スタートは空の状態から始まります。",
251
+ "presetdlg.footer": "↑↓ 選択 · 1/2/3 直接選択 · Enter 確定 · Esc キャンセル",
252
+ "presetdlg.echo.unchanged": "プリセット未変更 — 現在のセッションのままです。",
253
+ "presetdlg.echo.forked": "プリセット → {name} — この会話からフォークした新セッションを作成しました。",
254
+ "presetdlg.echo.fresh": "プリセット → {name} — その上で新しい空セッションを開始しました。",
255
+ "presetdlg.echo.direct": "プリセット → {name} — その上で新セッションを開始しました。",
256
+ "route.title": "エージェントが実行中 — このメッセージの行き先を選択してください",
257
+ "route.preview.empty": "(空メッセージ)",
258
+ "route.option.followup": "フォローアップとしてキューへ追加",
259
+ "route.option.followupHint": "現在のターン終了時に送達",
260
+ "route.option.steer": "今すぐ割り込み",
261
+ "route.option.steerHint": "次のステップ境界で注入",
262
+ "route.footer": "↑↓ 選択 · 1/2 直接選択 · Enter 確定 · Esc キャンセル",
263
+ "fork.title": "● ターン {turn} でフォークしますか?",
264
+ "fork.body.carry": "新しいセッションはターン {turn} まで(全 {total} ターン中)を引き継ぎます。それ以降のターンは現在のセッションに残ります。",
265
+ "fork.body.resume": "現在のセッションは /resume で再開できます。",
266
+ "fork.body.detach": "実行中のセッション {id} は切り離されます — /resume で再開できます。",
267
+ "fork.option.fork": "今すぐフォーク — ターン {turn} までの新セッションを作成します",
268
+ "fork.option.cancel": "キャンセル",
269
+ "fork.footer": "↑↓ 選択 · 1/2 直接選択 · Enter 確定 · Esc キャンセル",
270
+ "steer.notice.unavailable": "割り込みは利用できませんでした — メッセージはフォローアップとしてキューに残っています。",
271
+ "steer.notice.turnEnded": "割り込みが届く前にターンが終了しました — 代わりにフォローアップとしてキューに入れました。",
272
+ "steer.notice.removed": "送信待ちキューから削除しました。",
273
+ "steer.notice.promoted": "繰り上げました — 現在のターンに割り込みます。",
274
+ "steer.notice.notFound": "すでに処理済みまたは削除済みです — リストを更新しました。",
275
+ "steer.notice.error": "✘ {error}",
276
+ "steer.notice.orphaned": "{error} — メッセージはキューから出ましたが送達されていません。もう一度送信してください。",
277
+ "history.footer": "↑↓ 移動 · Enter/c コピー · f フォーク · → 詳細 · s セッション · / フィルタ · Esc 閉じる",
278
+ "history.noText": "(テキストなし)",
279
+ "history.listTitle": "● 履歴 · {id}",
280
+ "history.liveTag": "(ライブ)",
281
+ "history.moreLines": "… +{count} 行",
282
+ "history.turnFailed": "ターン失敗",
283
+ "history.interrupted": "中断",
284
+ "history.maxTokens": "出力トークン上限に到達",
285
+ "history.truncated": "… 残り {count} 行は切り詰め — {pointer}で完全なターンを表示",
286
+ "history.emptyTurn": "(このターンにはプロンプト/応答テキストがありません)",
287
+ "history.title": "履歴",
288
+ "history.turnTitle": "ターン {turn}",
289
+ "history.liveSnapshot": "ライブスナップショット",
290
+ "history.selectTurn": "左側でターンを選択してください。",
291
+ "history.lineOne": "{count} 行",
292
+ "history.lineMany": "{count} 行",
293
+ "history.linesRange": "{start}–{end}/{total} 行",
294
+ "history.detailFooterFocused": "← 一覧 · ↑↓ スクロール · [ / ] ページ · {window}",
295
+ "history.detailFooterIdle": "[ / ] ページ · {window}",
296
+ "history.corruptLog": "⚠ {id}: セッションログが破損しています — /resume {id} で修復できます。",
297
+ "history.cannotRead": "{id} を読み込めません: {message}",
298
+ "history.noPersistence": "このプロファイルではセッション永続化が設定されていません。",
299
+ "history.noCwd": "cwd なし",
300
+ "history.col.turn": "ターン",
301
+ "history.col.prompt": "プロンプト",
302
+ "history.col.updated": "更新",
303
+ "history.col.dir": "ディレクトリ",
304
+ "history.col.session": "セッション",
305
+ "history.empty": "完了したターンはありません",
306
+ "history.closed": "履歴を閉じました。",
307
+ "history.nothingToCopy": "コピーするものがありません — このターンにはユーザープロンプトがありません。",
308
+ "history.copied": "プロンプトをエディターにコピーしました。",
309
+ "history.pickerTitle": "● セッションを閲覧",
310
+ "history.pickerFooter": "↑↓ 移動 · Enter 閲覧 · / フィルタ · Esc 戻る",
311
+ "history.noMatching": "一致するセッションはありません",
312
+ "history.forked": "ターン {turn} でフォークしました — 新しいセッションを開いています。",
313
+ "history.forkFailed": "フォークに失敗しました: {message}",
314
+ "history.forkAtTurnFailed": "ターン {turn} でのフォークに失敗しました: {message}",
315
+ "history.noStored": "閲覧できる保存済みセッションがありません。",
316
+ "history.noActive": "アクティブなセッションがありません — /history <sessionId> で保存済みセッションを閲覧してください。",
317
+ "history.openFailed": "履歴ビューアーを開けませんでした。",
318
+ "turns.toolCallOne": "件のツール呼び出し",
319
+ "turns.toolCallMany": "件のツール呼び出し",
320
+ "resume.title": "● セッションを再開",
321
+ "resume.headingTitle": "ⓘ {title} · トークン: 現在のルート",
322
+ "resume.headingPlain": "ⓘ セッション · トークン: 現在のルート",
323
+ "resume.empty": "アクティブなセッションがありません — プロンプトを送信するか /resume で再開してください",
324
+ "resume.field.session": "セッション",
325
+ "resume.field.cwd": "cwd",
326
+ "resume.field.created": "作成",
327
+ "resume.field.model": "モデル",
328
+ "resume.field.think": "思考",
329
+ "resume.field.status": "状態",
330
+ "resume.field.messages": "メッセージ",
331
+ "resume.field.toolcalls": "ツール呼び出し",
332
+ "resume.field.tokensin": "入力トークン",
333
+ "resume.field.tokensout": "出力トークン",
334
+ "resume.field.cacheread": "キャッシュ読込",
335
+ "resume.field.cachewrite": "キャッシュ書込",
336
+ "resume.field.events": "イベント",
337
+ "resume.field.parent": "親",
338
+ "resume.col.field": "項目",
339
+ "resume.col.value": "値",
340
+ "resume.col.updated": "更新",
341
+ "resume.col.dir": "ディレクトリ",
342
+ "resume.col.session": "セッション",
343
+ "resume.hintEdit": "Enter 保存 · Esc キャンセル",
344
+ "resume.renameEmpty": "名前変更 ▸ {cursor}(タイトルを入力)",
345
+ "resume.renameEdit": "名前変更 ▸ {buffer}{cursor}",
346
+ "resume.hintRename": "r 名前変更 · Esc で閉じる",
347
+ "resume.hintClose": "Esc で閉じる",
348
+ "resume.titleEmpty": "タイトルが空です",
349
+ "resume.noBackend": "セッション永続化が open() も inspect() も公開していません。",
350
+ "resume.noPersistence": "このプロファイルではセッション永続化が設定されていません。",
351
+ "resume.settingInvalid": "設定 dsh-tui.resume.{key}: 無効な値 {value} — 環境変数/デフォルトにフォールバックします",
352
+ "resume.listFailed": "保存済みセッションの一覧取得に失敗しました: {message}",
353
+ "resume.noCwd": "cwd なし",
354
+ "tui.esc.armStop": "もう一度 Esc ですべての LLM 処理を停止",
355
+ "tui.esc.quitArmed": "{icon} Ctrl+C ×2 — 終了中…",
356
+ "tui.esc.quitAborted": "終了を取り消しました — Ctrl+C は長押しで、ダブルプレスではありませんでした",
357
+ "tui.stop.stopping": "{icon} すべての LLM 処理を停止中…",
358
+ "tui.stop.nothingRunning": "キャンセルする実行中の処理がありません。",
359
+ "tui.keys.warningPrefix": "キーバインド: {warning}",
360
+ "tui.status.working": "作業中…",
361
+ "tui.takeover.writeLock": "書き込みロックを取得 — フォローアップを送信しました。",
362
+ "tui.session.none": "アクティブなセッションはありません。",
363
+ "tui.session.infoShown": "セッション情報を表示しました。",
364
+ "tui.session.renamed": "「{title}」に名前を変更しました",
365
+ "tui.session.titleEmpty": "タイトルは正規化すると空になります",
366
+ "tui.session.effortDefault": "プロバイダーのデフォルト",
367
+ "tui.btw.noLlm": "LLM サービスを利用できません。",
368
+ "tui.btw.backOnScreen": "btw — 実行中の回答が画面に戻りました。",
369
+ "tui.btw.lastShown": "最後の btw のやり取りを表示しました。",
370
+ "tui.btw.started": "btw — メインタスクと並行して回答します。",
371
+ "tui.btw.queued": "btw をキューに入れました({position} 番目)。",
372
+ "tui.btw.rejected": "btw は拒否されました — {reason}。",
373
+ "tui.model.unchanged": "モデルは未変更です。",
374
+ "tui.agents.unchanged": "エージェントは未変更です。",
375
+ "tui.subagents.viewerClosed": "サブエージェントビューアーを閉じました。",
376
+ "tui.model.selected": "モデル: {id}",
377
+ "tui.model.selectedThink": "モデル: {id} · 思考 {effort}",
378
+ "tui.persist.failed": "{text} · ⚠ 永続化されませんでした: {error}",
379
+ "tui.think.noModel": "モデルが未選択です — 先に /model で選択してください。",
380
+ "tui.think.unsupported": "{id} には選択可能な思考レベルがありません。",
381
+ "tui.think.unchanged": "思考レベルは未変更です。",
382
+ "tui.think.providerDefault": "思考: プロバイダーのデフォルト({id})。",
383
+ "tui.think.set": "思考: {effort}({id})。",
384
+ "tui.preset.memorySaveFailed": "プリセットメモリを保存できませんでした: {error}",
385
+ "tui.preset.none": "利用できるエージェントプリセットがありません。",
386
+ "tui.preset.unknown": "不明なプリセット: {name}",
387
+ "tui.preset.unchanged": "プリセットは未変更です。",
388
+ "tui.resume.noneOther": "再開できる他の保存済みセッションはありません。",
389
+ "tui.resume.windowEmpty": "再開ウィンドウ内にセッションがありません({days} 日、≥{floor})— dsh-tui.resume.* を調整するとさらに表示されます。",
390
+ "tui.resume.cancelled": "再開をキャンセルしました。",
391
+ "tui.resume.watching": "{id} を監視中(読み取り専用 · 別プロセスが駆動)。切り替えるには /resume または /new。",
392
+ "tui.resume.watchFailed": "{id} を読み取り専用で監視できません: {error}",
393
+ "tui.resume.failed": "再開に失敗しました: {error} — 前のセッションは閉じられました。次のプロンプトで新しいセッションを開始します。",
394
+ "tui.resume.done": "{id} を再開しました · イベント {count} 件。",
395
+ "tui.resume.cannot": "{id} を再開できません: {error}",
396
+ "tui.repair.logMissing": "修復に失敗しました: {id} のログがディスク上に見つかりません — ログは未変更",
397
+ "tui.repair.failed": "修復に失敗しました: {error} — ログは未変更",
398
+ "tui.boot.resumeFailed": "--resume {id}: {error} — 新しく開始します。",
399
+ "tui.export.noSession": "エクスポートするアクティブなセッションがありません。",
400
+ "tui.export.done": "{count} 件のイベントを {path} へエクスポートしました",
401
+ "tui.new.done": "新しいセッションを開始しました。",
402
+ "tui.settings.unavailable": "設定サービスを利用できません。",
403
+ "tui.settings.noNamespaces": "登録されている設定の名前空間がありません。",
404
+ "tui.settings.noChanges": "設定: 変更はありません。",
405
+ "tui.settings.appliedOne": "設定: {count} 件の変更を適用しました。",
406
+ "tui.settings.appliedMany": "設定: {count} 件の変更を適用しました。",
407
+ "tui.skills.opened": "スキルマネージャーを開きました。",
408
+ "tui.theme.unchanged": "テーマは未変更です。",
409
+ "tui.theme.pinned": "テーマ設定を保存しました — 表示は DSH_TUI_THEME={value} で固定されています",
410
+ "tui.theme.applied": "テーマ: {name} — 適用しました。",
411
+ "tui.hotkeys.unchanged": "キーバインドは未変更です。",
412
+ "tui.login.unknownProvider": "不明なプロバイダー「{name}」です — /login を実行してディレクトリから選択してください。",
413
+ "tui.login.cancelled": "ログインをキャンセルしました。",
414
+ "tui.login.configured": "プロバイダー {name} を設定しました。",
415
+ "tui.logout.none": "削除できる保存済み資格情報がありません。",
416
+ "tui.logout.cancelled": "ログアウトをキャンセルしました。",
417
+ "tui.logout.failed": "{name} の保存済み API キーの削除に失敗しました{cause}。",
418
+ "tui.logout.incomplete": "{name} の API キーを削除しましたが、プロバイダー設定は残っています: {error} — ログアウトを完了するには /settings でそのプロバイダーを削除してください。",
419
+ "tui.logout.keyOnly": "{name} の API キーを削除しました。手動宣言のルートのため設定は残ります。モデルも削除するには /settings でそのプロバイダーを削除してください。",
420
+ "tui.logout.done": "{name} をログアウトしました — API キーとプロバイダー設定を削除しました。",
421
+ "tui.permission.unchanged": "権限は未変更です。",
422
+ "tui.steer.queuedFollowup": "フォローアップをキューに入れました — 書き込みロックの解放後に自動送信します。",
423
+ "tui.steer.noSession": "アクティブなセッションがありません — メッセージは送達されませんでした。",
424
+ "tui.exit.resumeHint": "このセッションを再開するには: {command}",
425
+ "tui.cmd.btw.description": "メインタスクの実行中に補助質問をする(一時オーバーレイ、保存されない)",
426
+ "tui.cmd.model.description": "この会話のモデル(思考レベルも)を選択する",
427
+ "tui.cmd.agents.description": "markdown ファイルからエージェント定義を管理する(モデル、思考レベル、スポーン深度)",
428
+ "tui.cmd.subagents.description": "サブエージェントを閲覧し、ライブの会話ログを確認する",
429
+ "tui.cmd.think.description": "現在のモデルの思考(推論)レベルを切り替える",
430
+ "tui.cmd.preset.description": "エージェントプリセットを切り替える(その上で新セッションを開始。/preset next で順送り)",
431
+ "tui.cmd.session.description": "現在のセッション情報(id、タイトル、統計)を表示し、名前を変更する(r)",
432
+ "tui.cmd.resume.description": "保存済みセッションを再開する",
433
+ "tui.cmd.history.description": "セッションの過去ターンを閲覧する(読み取り専用。保存済みは /history <id>)",
434
+ "tui.cmd.export.description": "このセッションログを JSONL としてエクスポートする",
435
+ "tui.cmd.new.description": "新しいセッションを開始する",
436
+ "tui.cmd.settings.description": "設定を閲覧・編集する(名前空間、値、リセット)",
437
+ "tui.cmd.skills.description": "ユーザースキルを管理する(インストール済みと利用可能)",
438
+ "tui.cmd.theme.description": "端末のカラースキームを設定する(即時適用)",
439
+ "tui.cmd.reload.description": "現在のソースから TUI を再読込する(dsh を再起動せずにコード変更を適用)",
440
+ "tui.cmd.hotkeys.description": "現在のキーバインドを表示する(カスタムファイル: ~/.dsh/keybindings.json)",
441
+ "tui.cmd.login.description": "プロバイダーディレクトリ経由でプロバイダー資格情報(API キー)を登録する",
442
+ "tui.cmd.logout.description": "プロバイダーをログアウトする(API キーとプロバイダー設定を削除)",
443
+ "settingsui.group.subagent": "サブエージェント",
444
+ "settingsui.title": "⚙ 設定",
445
+ "settingsui.category.dsh-tui": "TUI",
446
+ "settingsui.category.general": "一般",
447
+ "settingsui.category.models": "モデル",
448
+ "settingsui.category.plugins": "プラグイン",
449
+ "settingsui.category.agent": "エージェントプリセット",
450
+ "settingsui.category.other": "その他",
451
+ "settingsui.summary.namespaces": "{count} 個の名前空間",
452
+ "settingsui.fields.count": "{count} 個の項目",
453
+ "settingsui.ns.applies": "適用タイミング: {applies}",
454
+ "settingsui.value.unset": "(未設定)",
455
+ "settingsui.value.items": "[{count} 項目]",
456
+ "settingsui.value.keys": "{count} 個のキー",
457
+ "settingsui.dict.one": "辞書 · {count} 件",
458
+ "settingsui.dict.many": "辞書 · {count} 件",
459
+ "settingsui.meta.required": "必須",
460
+ "settingsui.meta.default": "デフォルト: {value}",
461
+ "settingsui.meta.min": "最小: {value}",
462
+ "settingsui.meta.max": "最大: {value}",
463
+ "settingsui.meta.step": "ステップ: {value}",
464
+ "settingsui.meta.pattern": "パターン: {value}",
465
+ "settingsui.meta.secret": "シークレット",
466
+ "settingsui.meta.disabled": "無効",
467
+ "settingsui.meta.userSet": "ユーザー設定値",
468
+ "settingsui.edit.footer": "Enter 保存 · Esc 戻る",
469
+ "settingsui.edit.secret": "シークレット — 現在値を維持するには空欄のままにしてください",
470
+ "settingsui.edit.current": "現在: {value}",
471
+ "settingsui.parse.number": "数値を期待しましたが「{text}」でした",
472
+ "settingsui.parse.json": "JSON 値(数値、真偽値、文字列など)を指定してください",
473
+ "settingsui.parse.type": "{type} 型の値は編集できません",
474
+ "settingsui.reset.working": "リセット中…",
475
+ "settingsui.reset.hints": "Enter: デフォルトにリセット · Esc: キャンセル",
476
+ "settingsui.reset.namespace": "この名前空間をデフォルトにリセット",
477
+ "settingsui.reset.path": "{path} をデフォルトにリセット",
478
+ "settingsui.reset.ns": "「{ns}」をデフォルトにリセット",
479
+ "settingsui.addKey.label": "+ キーを追加…",
480
+ "settingsui.addKey.title": "{path} にキーを追加",
481
+ "settingsui.addKey.subtitle": "デフォルト: {default} · Enter で追加 · Esc でキャンセル",
482
+ "settingsui.addKey.empty": "キーは空にできません",
483
+ "settingsui.addKey.exists": "キー「{key}」はすでに存在します",
484
+ "settingsui.addProvider.title": "⚙ プロバイダーを追加",
485
+ "settingsui.addProvider.empty": "内蔵プロバイダーはすべて設定済みです。",
486
+ "settingsui.escClose": "Esc で閉じる",
487
+ "settingsui.addProvider.keyTitle": "{name} の API キー",
488
+ "settingsui.addProvider.keySubtitle": "{ref} として保存 — settings.yaml には書き込みません",
489
+ "settingsui.addProvider.keyRequired": "API キーは空にできません",
490
+ "settingsui.commit.noCredentials": "プロバイダーを追加しました — このプロセスには資格情報サービスがありません: 利用するには {ref} を export してください",
491
+ "settingsui.commit.keyFailed": "API キーを保存できませんでした: {cause} — プロバイダーは追加済み。利用するには {ref}=<キー> を export してください",
492
+ "settingsui.models.title": "⚙ モデル",
493
+ "settingsui.models.readonly": "TUI 内では読み取り専用 — 変更するには設定ドキュメントを編集してください",
494
+ "settingsui.models.deepseek": "DeepSeek(公式)",
495
+ "settingsui.models.defaultModel": "デフォルトモデル",
496
+ "settingsui.models.add": "+ プロバイダーを追加…",
497
+ "settingsui.models.addDesc": "API キーで内蔵プロバイダーを設定します",
498
+ "settingsui.route.think": "{provider}/{model} · 思考 {effort}",
499
+ "themepv.title": "● テーマ",
500
+ "themepv.col.theme": "テーマ",
501
+ "themepv.footer": "↑↓ 移動 · Enter 選択 · Esc 戻る",
502
+ "themepv.desc.auto": "端末のライト/ダーク信号に追従",
503
+ "themepv.desc.githubLight": "GitHub ライトパレット",
504
+ "themepv.desc.githubDark": "GitHub ダークパレット",
505
+ "themepv.origin.user": "ユーザーテーマ",
506
+ "themepv.origin.builtin": "内蔵",
507
+ "themepv.auto.follows": "テーマは端末に追従します。",
508
+ "themepv.auto.pick": "ライト/ダークまたは名前付きテーマを選ぶとプレビューします。",
509
+ "themepv.input.placeholder": "メッセージを入力…",
510
+ "sel.effort.default": "(プロバイダーのデフォルト)",
511
+ "sel.effort.defaultDesc": "アダプターのデフォルト動作 — 思考レベルの上書きを解除します",
512
+ "sel.col.description": "説明",
513
+ "sel.col.effort": "レベル",
514
+ "sel.col.language": "言語",
515
+ "sel.col.model": "モデル",
516
+ "sel.col.provider": "プロバイダー",
517
+ "sel.col.preset": "プリセット",
518
+ "sel.title.effort": "● 思考レベル",
519
+ "sel.title.language": "● 言語",
520
+ "sel.title.model": "● モデル",
521
+ "sel.title.permission": "● 権限プリセット",
522
+ "sel.title.preset": "● エージェントプリセット",
523
+ "sel.hidden.header": "─ 非表示({count})─",
524
+ "sel.footer.model": "↑↓ 移動 · Enter 選択 · f お気に入り · h 非表示 · / フィルタ · Esc 戻る",
525
+ "sel.status.saveFailed": "✘ 保存に失敗しました: {message}",
526
+ "sel.preset.shipped": "同梱プリセット",
527
+ "sel.preset.user": "ユーザープリセット",
528
+ "modelprof.error.nameEmpty": "プロファイル名は空にできません",
529
+ "modelprof.error.exists": "「{name}」という名前のプロファイルはすでに存在します",
530
+ "modelprof.error.notFound": "「{name}」という名前のプロファイルはありません",
531
+ "modelprof.error.lastProfile": "最後のプロファイルは削除できません",
532
+ "modelprof.error.pinEmpty": "ファイルにプロファイル名がありません",
533
+ "modelprof.error.pinOverwrite": "{file} を上書きしません — 手動編集のため(切り替えは今回のみライブ適用)",
534
+ "modelprof.error.pinRemove": "{file} を削除しません — 手動編集のため(自分で削除してください)",
535
+ "modelprof.route.notSet": "(未設定)",
536
+ "modelprof.route.plain": "{provider}/{model}",
537
+ "modelprof.route.think": "{provider}/{model} · 思考 {effort}",
538
+ "modelprof.review.profile": "プロファイル: {name}",
539
+ "modelprof.review.current": "現在",
540
+ "modelprof.review.defaultModel": "デフォルトモデル: {route}",
541
+ "modelprof.review.none": "エージェント: 記録なし — /profile-cfg でモデルを選択するか、s で現在の設定を保存してください",
542
+ "modelprof.review.agents": "エージェント({count} 件):",
543
+ "modelprof.review.notSaved": "(未保存 — 適用しても変更しません)",
544
+ "modelprof.review.inherit": "(継承)",
545
+ "modelprof.review.inheritWord": "継承",
546
+ "modelprof.review.think": "思考 {effort}",
547
+ "modelprof.review.fileMissing": "ファイルなし",
548
+ "custprov.entry.name": "カスタムプロバイダー…",
549
+ "custprov.entry.hint": "ベース URL + API キー + モデル — 任意の OpenAI/Anthropic 互換ゲートウェイ",
550
+ "custprov.hint.declared": "手動宣言のルート",
551
+ "custprov.step.title": "カスタムプロバイダー {current}/{total} · {label}",
552
+ "custprov.step.id": "プロバイダー ID",
553
+ "custprov.step.idHint": "settings.yaml のルートキー — 資格情報参照もここから派生します(例: acme-gateway → ACME_GATEWAY_API_KEY)",
554
+ "custprov.step.displayName": "表示名(省略可)",
555
+ "custprov.step.displayNameHint": "/model と Models に表示 — 空欄ではルート id を使用",
556
+ "custprov.step.protocol": "API プロトコル",
557
+ "custprov.step.protocolHint": "{list} のいずれか — 空欄では {default} を使用",
558
+ "custprov.step.baseUrl": "ベース URL",
559
+ "custprov.step.baseUrlHint": "ゲートウェイのエンドポイント。例: https://gateway.internal.example/v1",
560
+ "custprov.step.models": "モデル",
561
+ "custprov.step.modelsHint": "カンマ区切りの API 上モデル id。例: acme-large, acme-think",
562
+ "custprov.step.apiKey": "API キー",
563
+ "custprov.step.apiKeyHint": "派生した参照として保存 — settings.yaml には書き込みません",
564
+ "custprov.error.idEmpty": "プロバイダー ID は空にできません",
565
+ "custprov.error.idLength": "プロバイダー ID は 2–40 文字にしてください",
566
+ "custprov.error.idChars": "使えるのは小文字英字、数字、ハイフンのみです(ドットと空白は不可)",
567
+ "custprov.error.idTaken": "「{id}」はすでに存在します — 別のルート id を指定してください",
568
+ "custprov.error.nameLength": "表示名は最大 40 文字です",
569
+ "custprov.error.protocol": "プロトコルは次のいずれかである必要があります: {list}",
570
+ "custprov.error.baseUrlEmpty": "ベース URL は空にできません",
571
+ "custprov.error.baseUrlFormat": "ベース URL は http:// または https:// で始まり、空白を含まない必要があります",
572
+ "custprov.error.modelsEmpty": "モデル id を 1 つ以上列挙してください(カンマ区切り)",
573
+ "custprov.error.modelLength": "各モデル id は最大 80 文字です",
574
+ "custprov.error.modelsMax": "初期リストのモデルは最大 50 個です",
575
+ "custprov.error.keyEmpty": "API キーは空にできません",
576
+ "provcatalog.hint.apiKey": "API キー",
577
+ "provcatalog.hint.aws": "AWS 資格情報またはベアラートークン",
578
+ "provcatalog.hint.copilot": "GitHub Copilot トークン",
579
+ "provcatalog.hint.googleCloud": "Google Cloud 資格情報",
580
+ "provcatalog.hint.huggingface": "Hugging Face トークン",
581
+ "provcatalog.hint.apiKey.gateway": "API キー · OpenAI 互換ゲートウェイ",
582
+ "provcatalog.status.set": "API キー設定済み",
583
+ "provcatalog.status.missing": "API キーなし",
584
+ "provcatalog.status.notConfigured": "API キー未設定",
585
+ "login.title.logout": "● ログアウト",
586
+ "login.col.provider": "プロバイダー",
587
+ "login.col.keyRef": "キー参照",
588
+ "login.error.removeFailed": "{name} の保存済みキーの削除に失敗しました{cause}",
589
+ "login.error.removeIncomplete": "{name} の保存済みキーを削除しましたが、プロバイダー設定は削除できませんでした: {error}",
590
+ "footer.hint.default": "⌨ Enter: 送信 · Esc ×2: 停止 · Ctrl+C ×2: 終了 · Ctrl+D: 終了(空入力)· Ctrl+G: サブエージェント · Ctrl+Shift+F: 検索 · /preset: 切替 · ↑↓: 履歴",
591
+ "footer.hint.send": "Enter: 送信",
592
+ "footer.hint.stop": "Esc ×2: 停止",
593
+ "footer.hint.quit": "Ctrl+C ×2: 終了",
594
+ "footer.hint.quitEmpty": "Ctrl+D: 終了(空入力)",
595
+ "footer.hint.subagents": "Ctrl+G: サブエージェント",
596
+ "footer.hint.search": "Ctrl+Shift+F: 検索",
597
+ "footer.hint.preset": "/preset: 切替",
598
+ "footer.hint.history": "↑↓: 履歴",
599
+ "footer.seg.msgs": "💬 {count} 件のメッセージ",
600
+ "footer.seg.tools": "🔧 {count} 個のツール",
601
+ "panel.empty.models": "一致するモデルはありません",
602
+ "panel.empty.settings": "一致する設定はありません",
603
+ "panel.filter.input": "フィルタ: {query}_",
604
+ "panel.filter.active": "フィルタ: {query}",
605
+ "panel.filter.hint": "フィルタ: {query} · Backspace クリア · Esc フィルタ解除",
606
+ "panel.footer.filtering": "Enter 適用 · Esc フィルタ解除",
607
+ "panel.footer.navigate": "↑↓ 移動 · Enter 選択 · Esc 戻る",
608
+ "panel.footer.search": "↑↓ 移動 · Enter 選択 · 入力で検索 · Esc 戻る",
609
+ "panel.footer.field": "↑↓ 項目 · Enter 編集 · Esc 戻る",
610
+ "panel.col.field": "項目",
611
+ "panel.col.value": "値",
612
+ "panel.col.setting": "設定",
613
+ "panel.viewer.more": "… ほか {count} 行",
614
+ "panel.viewer.close": "Esc で閉じる",
615
+ "startup.plugin.disabled": "{label}(無効)",
616
+ "startup.tree.base": "└─ dsh-base({count})",
617
+ "startup.summary": "mcp {mcp} · スキル {installed}/{total} · プラグイン {plugins}",
618
+ "hotkeys.title": "⚙ キーバインド",
619
+ "hotkeys.updated": "キーバインドを更新しました。",
620
+ "hotkeys.openFailed": "✘ キーバインドビューを開けませんでした: {message}",
621
+ "hotkeys.footer": "↑↓ キー選択 · Enter 変更 · Esc 閉じる",
622
+ "hotkeys.action.escape": "現在のタスクを停止 — 2 回押しが必要(1 回目で待機状態、500ms 以内の 2 回目で発動)",
623
+ "hotkeys.action.ctrlC": "実行中: ターンをキャンセル · アイドル時: エディターをクリア · 2 回押しで終了",
624
+ "hotkeys.action.ctrlD": "終了 — エディターが空のときのみ有効",
625
+ "hotkeys.action.modelPicker": "モデル/思考ピッカーを開く",
626
+ "hotkeys.action.subagentViewer": "サブエージェントピッカー/ビューアーを開く",
627
+ "hotkeys.action.queuePanel": "送信待ちメッセージキューを開く(d 削除 · s 今すぐ割り込み)",
628
+ "hotkeys.custom.many": "カスタム: {path}({count} 件の上書き)",
629
+ "hotkeys.custom.one": "カスタム: {path}(1 件の上書き)",
630
+ "hotkeys.custom.missing": "カスタム: {path}(見つかりません — デフォルトを使用)",
631
+ "hotkeys.formatHint": "書式: ctrl/shift/alt/super+キー · Enter で編集 · 空入力でデフォルトに戻す",
632
+ "hotkeys.editorHint": "エディター: pi-tui デフォルト — 方向キー · Ctrl+B/F · Alt+←→ 単語単位 · Home/End · Ctrl+W/U/K 削除 · Ctrl+- 元に戻す",
633
+ "hotkeys.warn.invalidJson": "{label}: 無効な JSON — {error}",
634
+ "hotkeys.warn.notObject": "{label}: アプリキー → キー id の JSON オブジェクトを指定してください",
635
+ "hotkeys.warn.invalidKey": "{label}: 「{field}」= {value} は有効なキー id ではありません — デフォルトを維持します",
636
+ "hotkeys.warn.unknownField": "{label}: 不明なフィールド「{field}」 — 無視しました",
637
+ "hotkeys.file.notObject": "{label}: JSON オブジェクトを指定してください — ファイルを修正または削除してから再試行してください",
638
+ "hotkeys.file.parseError": "{label}: {error} — ファイルを修正または削除してから再試行してください",
639
+ "hotkeys.file.writeError": "{label}: 書き込めません — {error}",
640
+ "hotkeys.parse.notKeyId": "キー id ではありません — ctrl/shift/alt/super + キー(例: ctrl+x、f5、escape)",
641
+ "hotkeys.edit.title": "{field} のキー — デフォルト {defaultValue}",
642
+ "hotkeys.edit.titleCustom": "{field} のキー — デフォルト {defaultValue} · カスタム {custom}",
643
+ "hotkeys.edit.subtitle": "ctrl/shift/alt/super + キー · 空入力でデフォルトに戻す",
644
+ "hotkeys.status.reset": "{field} → デフォルト({defaultValue})— 適用しました",
645
+ "hotkeys.status.set": "{field} → {id} — 適用しました"
646
+ }