botmux 2.85.1 → 2.87.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.en.md +26 -0
- package/README.md +26 -0
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +12 -1
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
- package/dist/adapters/backend/pty-backend.js +4 -1
- package/dist/adapters/backend/pty-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +22 -9
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +9 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.js +1 -1
- package/dist/adapters/backend/zellij-backend.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +8 -5
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +2 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +25 -3
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/bot-registry.d.ts +10 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +6 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +362 -16
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +215 -5
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +7 -106
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +285 -2
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/maintenance.d.ts +18 -0
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +58 -30
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/per-bot-env.d.ts +38 -0
- package/dist/core/per-bot-env.d.ts.map +1 -0
- package/dist/core/per-bot-env.js +79 -0
- package/dist/core/per-bot-env.js.map +1 -0
- package/dist/core/role-resolver.d.ts +1 -0
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +14 -0
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +70 -6
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/skills/discovery.d.ts +7 -0
- package/dist/core/skills/discovery.d.ts.map +1 -1
- package/dist/core/skills/discovery.js +51 -0
- package/dist/core/skills/discovery.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +5 -2
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/update-check.d.ts +67 -0
- package/dist/core/update-check.d.ts.map +1 -0
- package/dist/core/update-check.js +159 -0
- package/dist/core/update-check.js.map +1 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +4 -0
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +29 -6
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +1 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +1 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/skill-install-request.d.ts +10 -0
- package/dist/dashboard/skill-install-request.d.ts.map +1 -1
- package/dist/dashboard/skill-install-request.js +17 -0
- package/dist/dashboard/skill-install-request.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +43 -4
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +178 -1
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/groups.d.ts +2 -0
- package/dist/dashboard/web/groups.d.ts.map +1 -1
- package/dist/dashboard/web/groups.js +419 -3
- package/dist/dashboard/web/groups.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +745 -3
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/insights.d.ts +2 -0
- package/dist/dashboard/web/insights.d.ts.map +1 -0
- package/dist/dashboard/web/insights.js +1523 -0
- package/dist/dashboard/web/insights.js.map +1 -0
- package/dist/dashboard/web/role-profile-match.d.ts +31 -0
- package/dist/dashboard/web/role-profile-match.d.ts.map +1 -0
- package/dist/dashboard/web/role-profile-match.js +58 -0
- package/dist/dashboard/web/role-profile-match.js.map +1 -0
- package/dist/dashboard/web/roles.d.ts +1 -0
- package/dist/dashboard/web/roles.d.ts.map +1 -1
- package/dist/dashboard/web/roles.js +520 -27
- package/dist/dashboard/web/roles.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +84 -0
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings.d.ts.map +1 -1
- package/dist/dashboard/web/settings.js +289 -0
- package/dist/dashboard/web/settings.js.map +1 -1
- package/dist/dashboard/web/skills.d.ts.map +1 -1
- package/dist/dashboard/web/skills.js +183 -10
- package/dist/dashboard/web/skills.js.map +1 -1
- package/dist/dashboard/web/whiteboards.d.ts +2 -0
- package/dist/dashboard/web/whiteboards.d.ts.map +1 -0
- package/dist/dashboard/web/whiteboards.js +267 -0
- package/dist/dashboard/web/whiteboards.js.map +1 -0
- package/dist/dashboard-web/app.js +1406 -833
- package/dist/dashboard-web/index.html +3 -1
- package/dist/dashboard-web/style.css +1382 -30
- package/dist/dashboard.js +474 -6
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +6 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +12 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +34 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +34 -1
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +7 -3
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +19 -0
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/group-creator.d.ts +6 -0
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +54 -5
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/insight/antigravity-span-reader.d.ts +3 -0
- package/dist/services/insight/antigravity-span-reader.d.ts.map +1 -0
- package/dist/services/insight/antigravity-span-reader.js +249 -0
- package/dist/services/insight/antigravity-span-reader.js.map +1 -0
- package/dist/services/insight/classify.d.ts +7 -0
- package/dist/services/insight/classify.d.ts.map +1 -0
- package/dist/services/insight/classify.js +46 -0
- package/dist/services/insight/classify.js.map +1 -0
- package/dist/services/insight/claude-span-reader.d.ts +3 -0
- package/dist/services/insight/claude-span-reader.d.ts.map +1 -0
- package/dist/services/insight/claude-span-reader.js +257 -0
- package/dist/services/insight/claude-span-reader.js.map +1 -0
- package/dist/services/insight/codex-span-reader.d.ts +3 -0
- package/dist/services/insight/codex-span-reader.d.ts.map +1 -0
- package/dist/services/insight/codex-span-reader.js +290 -0
- package/dist/services/insight/codex-span-reader.js.map +1 -0
- package/dist/services/insight/intent.d.ts +5 -0
- package/dist/services/insight/intent.d.ts.map +1 -0
- package/dist/services/insight/intent.js +145 -0
- package/dist/services/insight/intent.js.map +1 -0
- package/dist/services/insight/jsonl.d.ts +10 -0
- package/dist/services/insight/jsonl.d.ts.map +1 -0
- package/dist/services/insight/jsonl.js +36 -0
- package/dist/services/insight/jsonl.js.map +1 -0
- package/dist/services/insight/prompt.d.ts +3 -0
- package/dist/services/insight/prompt.d.ts.map +1 -0
- package/dist/services/insight/prompt.js +99 -0
- package/dist/services/insight/prompt.js.map +1 -0
- package/dist/services/insight/redact.d.ts +4 -0
- package/dist/services/insight/redact.d.ts.map +1 -0
- package/dist/services/insight/redact.js +67 -0
- package/dist/services/insight/redact.js.map +1 -0
- package/dist/services/insight/report.d.ts +29 -0
- package/dist/services/insight/report.d.ts.map +1 -0
- package/dist/services/insight/report.js +1126 -0
- package/dist/services/insight/report.js.map +1 -0
- package/dist/services/insight/safe-detail.d.ts +5 -0
- package/dist/services/insight/safe-detail.d.ts.map +1 -0
- package/dist/services/insight/safe-detail.js +59 -0
- package/dist/services/insight/safe-detail.js.map +1 -0
- package/dist/services/insight/scrub.d.ts +22 -0
- package/dist/services/insight/scrub.d.ts.map +1 -0
- package/dist/services/insight/scrub.js +70 -0
- package/dist/services/insight/scrub.js.map +1 -0
- package/dist/services/insight/types.d.ts +394 -0
- package/dist/services/insight/types.d.ts.map +1 -0
- package/dist/services/insight/types.js +2 -0
- package/dist/services/insight/types.js.map +1 -0
- package/dist/services/resumable-session-discovery.d.ts.map +1 -1
- package/dist/services/resumable-session-discovery.js +21 -4
- package/dist/services/resumable-session-discovery.js.map +1 -1
- package/dist/services/role-profile-store.d.ts +25 -0
- package/dist/services/role-profile-store.d.ts.map +1 -0
- package/dist/services/role-profile-store.js +171 -0
- package/dist/services/role-profile-store.js.map +1 -0
- package/dist/services/skill-registry-store.d.ts +1 -0
- package/dist/services/skill-registry-store.d.ts.map +1 -1
- package/dist/services/skill-registry-store.js +32 -0
- package/dist/services/skill-registry-store.js.map +1 -1
- package/dist/services/transcript-resolver.d.ts +26 -0
- package/dist/services/transcript-resolver.d.ts.map +1 -0
- package/dist/services/transcript-resolver.js +111 -0
- package/dist/services/transcript-resolver.js.map +1 -0
- package/dist/services/whiteboard-store.d.ts +67 -0
- package/dist/services/whiteboard-store.d.ts.map +1 -0
- package/dist/services/whiteboard-store.js +450 -0
- package/dist/services/whiteboard-store.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts +8 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +9 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +118 -0
- package/dist/skills/definitions.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/install-diagnostics.d.ts +52 -0
- package/dist/utils/install-diagnostics.d.ts.map +1 -0
- package/dist/utils/install-diagnostics.js +155 -0
- package/dist/utils/install-diagnostics.js.map +1 -0
- package/dist/utils/install-info.d.ts +4 -0
- package/dist/utils/install-info.d.ts.map +1 -1
- package/dist/utils/install-info.js +6 -0
- package/dist/utils/install-info.js.map +1 -1
- package/dist/worker.js +12 -0
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -154,6 +154,237 @@ const zh = {
|
|
|
154
154
|
'sessions.landApplied': '已落盘',
|
|
155
155
|
'sessions.landFailed': '落盘失败',
|
|
156
156
|
'sessions.landDiscarded': '已丢弃(沙盒副本未应用)。',
|
|
157
|
+
'sessions.insight': '洞察',
|
|
158
|
+
'sessions.insightLoading': '分析中…',
|
|
159
|
+
'sessions.insightUnavailable': '无法分析',
|
|
160
|
+
'sessions.insightEmpty': '本会话还没有可分析的工具 span。',
|
|
161
|
+
'sessions.insightMetrics': 'span {total} · 失败 {failed} · 慢 {slow} · 读改比 {rw} · 压缩 {compactions}',
|
|
162
|
+
'sessions.insightSuggestions': '建议',
|
|
163
|
+
'sessions.insightSpans': '动作 span',
|
|
164
|
+
'sessions.insightCapped': '仅显示前 {shown}/{total} 条',
|
|
165
|
+
'sessions.insightAsOf': '截至 {asOf}',
|
|
166
|
+
'sessions.insightPartial': '(可能不含进行中的最新一轮)',
|
|
167
|
+
'nav.insights': '洞察',
|
|
168
|
+
'insights.title': '工作流洞察',
|
|
169
|
+
'insights.subtitle': '只读分析本机 Claude Code / Codex 会话的动作轨迹、失败与摩擦,给出规则型优化建议。',
|
|
170
|
+
'insights.refresh': '刷新',
|
|
171
|
+
'insights.search': '搜索会话 / bot / 目录…',
|
|
172
|
+
'insights.filter': '筛选',
|
|
173
|
+
'insights.filterAll': '全部',
|
|
174
|
+
'insights.filterReview': '值得复盘',
|
|
175
|
+
'insights.filterFailed': '有失败',
|
|
176
|
+
'insights.filterSlow': '有慢 span',
|
|
177
|
+
'insights.loading': '分析中…',
|
|
178
|
+
'insights.loaded': '已分析 {count} 个会话',
|
|
179
|
+
'insights.unavailable': '加载失败',
|
|
180
|
+
'insights.listCount': '显示 {shown}/{total}',
|
|
181
|
+
'insights.sessions': '会话',
|
|
182
|
+
'insights.empty': '没有匹配的会话。',
|
|
183
|
+
'insights.selectSession': '从左侧选一个会话,查看动作 span 与建议。',
|
|
184
|
+
'insights.detailLoading': '加载会话详情…',
|
|
185
|
+
'insights.recommendations': '优化建议',
|
|
186
|
+
'insights.recommendationsHint': '基于规则的跨会话汇总,每条可追溯到指标。',
|
|
187
|
+
'insights.noRecommendations': '暂无建议。',
|
|
188
|
+
'insights.seenInSessions': '出现在 {count} 个会话',
|
|
189
|
+
'insights.toolFailures': '高频工具失败',
|
|
190
|
+
'insights.toolFailuresHint': '按工具汇总失败 span。',
|
|
191
|
+
'insights.noFailures': '没有失败 span。',
|
|
192
|
+
'insights.metricSessions': '会话',
|
|
193
|
+
'insights.metricAnalyzed': '已分析 {count}',
|
|
194
|
+
'insights.metricSpans': 'span',
|
|
195
|
+
'insights.metricSafe': '已脱敏',
|
|
196
|
+
'insights.metricFailed': '失败 span',
|
|
197
|
+
'insights.metricSlow': '慢 span',
|
|
198
|
+
'insights.metricRw': '读改比',
|
|
199
|
+
'insights.metricCompactions': '压缩 {count}',
|
|
200
|
+
'insights.spansShort': 'span ',
|
|
201
|
+
'insights.failedShort': '失败 ',
|
|
202
|
+
'insights.slowShort': '慢 ',
|
|
203
|
+
'insights.rwShort': '读改 ',
|
|
204
|
+
'insights.unsupported': '该 CLI 暂不支持',
|
|
205
|
+
'insights.noTranscript': '暂无 transcript',
|
|
206
|
+
'insights.parseError': '解析失败',
|
|
207
|
+
'insights.noSpans': '暂无可分析 span。',
|
|
208
|
+
'insights.sevBad': '严重',
|
|
209
|
+
'insights.sevWarn': '注意',
|
|
210
|
+
'insights.sevInfo': '提示',
|
|
211
|
+
'insights.phase.research': '研究',
|
|
212
|
+
'insights.phase.edit': '修改',
|
|
213
|
+
'insights.phase.run': '运行',
|
|
214
|
+
'insights.phase.delegate': '委派',
|
|
215
|
+
'insights.phase.discuss': '讨论',
|
|
216
|
+
'insights.trace': '动作 span',
|
|
217
|
+
'insights.ledger': '逐轮对账',
|
|
218
|
+
'insights.detailTabs': '观测明细',
|
|
219
|
+
'insights.spanStatus': '状态',
|
|
220
|
+
'insights.spanTool': '工具',
|
|
221
|
+
'insights.spanPhase': '阶段',
|
|
222
|
+
'insights.spanDuration': '耗时',
|
|
223
|
+
'insights.spanTurn': '轮',
|
|
224
|
+
'insights.spanSummary': '摘要',
|
|
225
|
+
'insights.ledgerMore': '展开另外 {count} 条摘要',
|
|
226
|
+
'insights.ledgerOmitted': '还有 {count} 条已折叠',
|
|
227
|
+
'insights.ledgerNoContent': '本轮没有可展示的脱敏摘要。',
|
|
228
|
+
'insights.diagShow': '查看证据',
|
|
229
|
+
'insights.diagActive': '正在查看',
|
|
230
|
+
'insights.evMatched': '命中 {count} 条证据',
|
|
231
|
+
'insights.evMatchedCapped': '命中 {matched} 条,显示前 {shown} 条',
|
|
232
|
+
'insights.evDefault': '重点 {shown} / 共 {total} 条',
|
|
233
|
+
'insights.evShowAll': '显示全部 {count} 条',
|
|
234
|
+
'insights.evBackToEvidence': '只看重点',
|
|
235
|
+
'insights.intent.run_script': '运行脚本',
|
|
236
|
+
'insights.intent.test': '测试',
|
|
237
|
+
'insights.intent.typecheck': '类型检查',
|
|
238
|
+
'insights.intent.lint': 'Lint',
|
|
239
|
+
'insights.intent.git': 'Git',
|
|
240
|
+
'insights.intent.search': '搜索',
|
|
241
|
+
'insights.intent.read_file': '读文件',
|
|
242
|
+
'insights.intent.edit_file': '改文件',
|
|
243
|
+
'insights.intent.write_file': '写文件',
|
|
244
|
+
'insights.intent.delegate': '委派',
|
|
245
|
+
'insights.intent.unknown': '操作',
|
|
246
|
+
'insights.result.ok': '成功',
|
|
247
|
+
'insights.result.tool_error': '工具报错',
|
|
248
|
+
'insights.result.test_failed': '测试失败',
|
|
249
|
+
'insights.result.typecheck_failed': '类型检查失败',
|
|
250
|
+
'insights.result.lint_failed': 'Lint 失败',
|
|
251
|
+
'insights.result.command_failed': '命令失败',
|
|
252
|
+
'insights.result.timeout': '超时',
|
|
253
|
+
'insights.result.no_output': '无输出',
|
|
254
|
+
'insights.result.unknown': '未知',
|
|
255
|
+
'insights.tag.failure': '失败',
|
|
256
|
+
'insights.tag.slow': '慢',
|
|
257
|
+
'insights.tag.retry': '返工',
|
|
258
|
+
'insights.tag.read_write_imbalance': '读改失衡',
|
|
259
|
+
'insights.tag.diagnostic': '诊断',
|
|
260
|
+
'insights.tag.normal': '正常',
|
|
261
|
+
'insights.turnHeadline.turn_has_failures': '本轮 {failures} 次失败',
|
|
262
|
+
'insights.turnHeadline.turn_has_slow_spans': '本轮有耗时偏长的操作',
|
|
263
|
+
'insights.turnHeadline.turn_has_retries': '本轮反复重试同一操作',
|
|
264
|
+
'insights.turnHeadline.turn_read_write_imbalance': '本轮改多读少(改 {edits} / 读 {reads})',
|
|
265
|
+
'insights.evTimeline': '全部 {count} 条 span 时间线',
|
|
266
|
+
'insights.evNoFlags': '没有被标记为失败 / 慢 / 返工的 span',
|
|
267
|
+
'insights.turnAllNormal': '{count} 个轮次都正常,没有值得复盘的',
|
|
268
|
+
'insights.turnEvidence': '查看本轮 {count} 条证据',
|
|
269
|
+
'insights.turnHiddenNormal': '另有 {count} 个正常轮次(已隐藏)',
|
|
270
|
+
'insights.mReads': '读',
|
|
271
|
+
'insights.mEdits': '改',
|
|
272
|
+
'insights.mRuns': '跑',
|
|
273
|
+
'insights.mFailures': '失败',
|
|
274
|
+
'insights.mDur': '耗时',
|
|
275
|
+
'insights.turnHeadline.turn_normal': '正常',
|
|
276
|
+
'insights.rec.fix_repeated_tool_failures': '反复失败的命令需要收敛',
|
|
277
|
+
'insights.rec.split_slow_operation': '慢操作拖慢了整个会话',
|
|
278
|
+
'insights.rec.add_read_pass_before_edit': '改之前读得太少',
|
|
279
|
+
'insights.rec.preserve_context_checkpoints': '上下文被压缩,注意留存档',
|
|
280
|
+
'insights.impact.impact_failed_spans': '{failedSpans} 个动作失败(最多:{topTool} ×{topToolFailures})',
|
|
281
|
+
'insights.impact.impact_slow_spans': '{slowSpansTotal} 个慢动作拖慢进度',
|
|
282
|
+
'insights.impact.impact_low_read_write_ratio': '改了 {writeSpans} 处,只读了 {readSpans} 处',
|
|
283
|
+
'insights.impact.impact_context_compaction': '本会话发生 {compactions} 次上下文压缩',
|
|
284
|
+
'insights.why.why_tool_failure_concentrated': '失败集中在 {topTool}(共 {topToolFailures} 次),多半是同一类问题',
|
|
285
|
+
'insights.why.why_slow_span_dominates': '少数耗时动作占了大头,最慢的是 {slowestTool}',
|
|
286
|
+
'insights.why.why_edits_outpaced_reads': '读写比 {readWriteRatio},改得比读得多容易踩坑返工',
|
|
287
|
+
'insights.why.why_context_compaction_happened': '长会话被压缩,早期的决策/上下文可能已丢失',
|
|
288
|
+
'insights.action.inspect_failed_span_details': '逐个看失败动作的详情,定位根因',
|
|
289
|
+
'insights.action.add_preflight_or_timeout': '给高频失败的命令加前置检查或超时控制',
|
|
290
|
+
'insights.action.narrow_or_split_slow_operation': '把慢操作收窄或拆小(如只跑定向用例)',
|
|
291
|
+
'insights.action.surface_timeout_or_progress': '更早暴露超时/进度,别让它默默卡住',
|
|
292
|
+
'insights.action.read_or_search_before_editing': '改陌生文件前先读一遍或搜一下',
|
|
293
|
+
'insights.action.verify_assumptions_before_running': '动手前先验证假设,减少盲改',
|
|
294
|
+
'insights.action.write_checkpoints_for_long_tasks': '长任务把决策和检查点落到笔记里',
|
|
295
|
+
'insights.struct.shell': 'shell 命令',
|
|
296
|
+
'insights.struct.fileEdit': '文件编辑',
|
|
297
|
+
'insights.struct.readSearch': '读取/搜索',
|
|
298
|
+
'insights.struct.agentTask': '子 agent 任务',
|
|
299
|
+
'insights.struct.toolInput': '工具输入',
|
|
300
|
+
'insights.struct.toolResult': '工具输出',
|
|
301
|
+
'insights.struct.toolError': '工具报错',
|
|
302
|
+
'insights.struct.patchFailed': '补丁失败',
|
|
303
|
+
'insights.struct.patchApplied': '补丁已应用',
|
|
304
|
+
'insights.struct.exit': 'exit {code}',
|
|
305
|
+
'insights.spanAll': '全部',
|
|
306
|
+
'insights.dDetail': '详情',
|
|
307
|
+
'insights.dCollapse': '收起',
|
|
308
|
+
'insights.dPhase': '阶段',
|
|
309
|
+
'insights.dStart': '起始',
|
|
310
|
+
'insights.dDur': '耗时',
|
|
311
|
+
'insights.dIntent': '意图',
|
|
312
|
+
'insights.dResult': '结果',
|
|
313
|
+
'insights.dIn': '输入',
|
|
314
|
+
'insights.dOut': '输出',
|
|
315
|
+
'insights.dTags': '标签',
|
|
316
|
+
'insights.dTurnContext': '第 {turn} 轮上下文',
|
|
317
|
+
'insights.advice.failure': '💡 看清报错再动手,别盲目重试',
|
|
318
|
+
'insights.advice.retry': '💡 同一步反复重试——先定位根因再继续',
|
|
319
|
+
'insights.advice.read_write_imbalance': '💡 改之前先读相关文件,减少返工',
|
|
320
|
+
'insights.advice.slow': '💡 慢操作:考虑跑定向用例或拆小',
|
|
321
|
+
'insights.turnPrompt': '用户',
|
|
322
|
+
'insights.turnExpand': '展开 {count} 步',
|
|
323
|
+
'insights.turnCollapse': '收起',
|
|
324
|
+
'insights.turnRail': '会话轨迹',
|
|
325
|
+
'insights.gantt': '工作时序',
|
|
326
|
+
'insights.ganttCaption': '{span} 个动作 · 跨度 {dur} · 活跃 {active}',
|
|
327
|
+
'insights.ctxCurve': '上下文曲线',
|
|
328
|
+
'insights.ctxCaption': '每轮峰值 in+cache · 峰值 {peak} · {turns} 轮',
|
|
329
|
+
'insights.ctxTurn': '轮 {n}',
|
|
330
|
+
'insights.railSubagent': '子代理',
|
|
331
|
+
'insights.railSubagents': '{n} 个子代理',
|
|
332
|
+
'insights.turnPromptExpand': '展开',
|
|
333
|
+
'insights.turnPromptCollapse': '收起',
|
|
334
|
+
'insights.turnPromptRaw': '原文',
|
|
335
|
+
'insights.turnPromptRendered': '渲染',
|
|
336
|
+
'insights.srcMentions': '提到',
|
|
337
|
+
'insights.senderHuman': '用户',
|
|
338
|
+
'insights.senderA2A': 'A2A',
|
|
339
|
+
'insights.senderOther': '其他',
|
|
340
|
+
'insights.senderSystem': '系统',
|
|
341
|
+
'insights.turnPromptFull': '全文',
|
|
342
|
+
'insights.modalClose': '关闭',
|
|
343
|
+
'insights.promptTruncated': '内容较长,已截断',
|
|
344
|
+
'insights.replay': '对话回放',
|
|
345
|
+
'insights.replayAgent': 'agent 操作',
|
|
346
|
+
'insights.replaySearch': '搜索对话内容…',
|
|
347
|
+
'insights.replayBy': '发起人',
|
|
348
|
+
'insights.replayState': '状态',
|
|
349
|
+
'insights.replayLoadMore': '加载更多({shown}/{total})',
|
|
350
|
+
'insights.replayAllLoaded': '已全部加载(共 {total} 条)',
|
|
351
|
+
'insights.replayEmpty': '没有匹配的消息',
|
|
352
|
+
'insights.replayNoText': '(无正文,见操作)',
|
|
353
|
+
'insights.replayOps': '{count} 步操作',
|
|
354
|
+
'insights.wsFiles': '文件改动 · {n}',
|
|
355
|
+
'insights.wsCmds': '跑过的命令 · {n}',
|
|
356
|
+
'insights.wsReads': '读 {n}',
|
|
357
|
+
'insights.wsEdits': '改 {n}',
|
|
358
|
+
'insights.wsFail': '失败 {n}',
|
|
359
|
+
'insights.wsNoFiles': '无文件改动',
|
|
360
|
+
'insights.wsNoCmds': '无命令记录',
|
|
361
|
+
'insights.turnSummary': '共 {total} 轮 · {flagged} 轮需关注',
|
|
362
|
+
'insights.dCommand': '命令',
|
|
363
|
+
'insights.dCmdOutput': '执行结果',
|
|
364
|
+
'insights.ledgerNormal': '正常排序',
|
|
365
|
+
'insights.ledgerGrouped': '按建议分类',
|
|
366
|
+
'insights.ledgerOther': '其他轮次',
|
|
367
|
+
'insights.ledgerGroupCount': '{count} 轮',
|
|
368
|
+
'insights.turnsCapped': '仅含前 {shown}/{total} 个动作,时间线可能不完整',
|
|
369
|
+
'insights.suggestion.high_tool_failure.title': '工具失败偏多',
|
|
370
|
+
'insights.suggestion.high_tool_failure.action': '优先看失败 span,把高频失败命令做前置检查或超时控制。',
|
|
371
|
+
'insights.suggestion.tool_failure_present.title': '存在工具调用失败',
|
|
372
|
+
'insights.suggestion.tool_failure_present.action': '重复执行工作流前,先复盘失败 span。',
|
|
373
|
+
'insights.suggestion.slow_span.title': '慢动作主导会话',
|
|
374
|
+
'insights.suggestion.slow_span.action': '拆分或限制慢操作,并更早暴露超时、进度反馈。',
|
|
375
|
+
'insights.suggestion.low_read_write_ratio.title': '修改多于阅读',
|
|
376
|
+
'insights.suggestion.low_read_write_ratio.action': '改陌生文件前先补一次读取或搜索。',
|
|
377
|
+
'insights.suggestion.context_compaction.title': '发生上下文压缩',
|
|
378
|
+
'insights.suggestion.context_compaction.action': '长任务建议把决策和检查点落到持久笔记或拆成更小子任务。',
|
|
379
|
+
'insights.suggestion.no_major_friction.title': '未发现明显摩擦',
|
|
380
|
+
'insights.suggestion.no_major_friction.action': '可用动作时间线做抽查,或与更慢的会话对比。',
|
|
381
|
+
'insights.evidence.failedSpans': '{count} 个失败 span',
|
|
382
|
+
'insights.evidence.toolFailedTimes': '{tool} 失败 {count} 次',
|
|
383
|
+
'insights.evidence.multipleToolsFailed': '多个工具发生失败',
|
|
384
|
+
'insights.evidence.toolRanSeconds': '{tool} 运行 {seconds}s',
|
|
385
|
+
'insights.evidence.readWriteRatio': '读改比 {ratio}',
|
|
386
|
+
'insights.evidence.compactions': '上下文压缩 {count} 次',
|
|
387
|
+
'insights.evidence.spansAnalyzed': '已分析 {count} 个 span',
|
|
157
388
|
'connectors.lede': '让外部系统(监控告警、CI、工单…)通过一个 webhook 触发机器人在群里说话或跑工作流。',
|
|
158
389
|
'connectors.createTitle': '新建 Webhook',
|
|
159
390
|
'connectors.fName': '名称',
|
|
@@ -393,14 +624,55 @@ const zh = {
|
|
|
393
624
|
'groups.chat': '群聊',
|
|
394
625
|
'groups.actions': '操作',
|
|
395
626
|
'groups.addBots': '添加 bot',
|
|
627
|
+
'groups.saveAsProfile': '保存为 Profile',
|
|
396
628
|
'groups.manage': '管理',
|
|
397
629
|
'groups.empty': '没有符合条件的群聊。',
|
|
630
|
+
'groups.profileStatusFull': '完整匹配 {name}({matched}/{total})',
|
|
631
|
+
'groups.profileStatusFullChat': '本群 Role 完整匹配 {name}({matched}/{total})',
|
|
632
|
+
'groups.profileStatusPartial': '部分匹配 {name}({matched}/{total})',
|
|
633
|
+
'groups.profileStatusUnmatched': '未匹配任何 Profile',
|
|
634
|
+
'groups.saveProfileTitle': '保存为 Profile',
|
|
635
|
+
'groups.saveProfileIntro': '将「{name}」里的 {count} 个群内 bot 配置保存为 profile 快照。',
|
|
636
|
+
'groups.saveProfileScope': '保存范围',
|
|
637
|
+
'groups.saveProfileScopeHelp': '群内 bot 配置快照',
|
|
638
|
+
'groups.saveProfileBotCount': '群内 bot',
|
|
639
|
+
'groups.saveProfileLoadFailed': '读取失败',
|
|
640
|
+
'groups.saveProfileStatus.entry': '生成 entry',
|
|
641
|
+
'groups.saveProfileStatus.error': '读取失败',
|
|
642
|
+
'groups.saveProfileMode': '保存方式',
|
|
643
|
+
'groups.saveProfileNew': '新建 Profile',
|
|
644
|
+
'groups.saveProfileNewHelp': '默认创建一个新的快照;如果 id 已存在,会覆盖同 bot entry。',
|
|
645
|
+
'groups.saveProfileOverwrite': '覆盖已有 Profile',
|
|
646
|
+
'groups.saveProfileOverwriteHelp': '从列表中选择一个已有 profile,覆盖其中同 bot 的 entry。',
|
|
647
|
+
'groups.saveProfileExistingMeta': '{count} 个 entry',
|
|
648
|
+
'groups.saveProfileIdLabel': 'Profile id',
|
|
649
|
+
'groups.saveProfileExistingLabel': '已有 Profile',
|
|
650
|
+
'groups.saveProfileExistingEmpty': '暂无已有 Profile',
|
|
651
|
+
'groups.saveProfileTarget': '目标 Profile',
|
|
652
|
+
'groups.saveProfileTargetNew': '将新建或更新这个 Profile 的群内 bot 快照',
|
|
653
|
+
'groups.saveProfileTargetOverwrite': '将覆盖已有 Profile 中这些 bot 的 entry',
|
|
654
|
+
'groups.saveProfileEntrySummary': '将为 {count} 个群内 bot 生成 profile entry。',
|
|
655
|
+
'groups.saveProfileEntrySummaryWithEmpty': '将为 {count} 个群内 bot 生成 profile entry;其中 {emptyCount} 个当前未读到 role 内容,会保存为空 entry。',
|
|
656
|
+
'groups.saveProfileFailedLoadSummary': '有 {count} 个 bot 配置读取失败,暂不保存,避免生成不完整快照。',
|
|
657
|
+
'groups.saveProfileSubmit': '保存 Profile',
|
|
658
|
+
'groups.saveProfileOverwriteSubmit': '覆盖保存',
|
|
659
|
+
'groups.saveProfileInvalid': 'Profile id 只能包含字母、数字、点、下划线、短横线,最长 64,且不能是 . 或 ..',
|
|
660
|
+
'groups.saveProfileNoRoles': '这个群里没有可保存的 bot 配置。',
|
|
661
|
+
'groups.saveProfileSaving': '保存中…',
|
|
662
|
+
'groups.saveProfileDone': '已保存 {count} 个 entry 到 {name}',
|
|
663
|
+
'groups.saveProfileFailed': '只保存了 {saved}/{total} 个 entry,请检查离线 bot 或权限。',
|
|
398
664
|
'groups.createTitle': '新建群聊',
|
|
399
665
|
'groups.createHelp': '选择要邀请的 bot。dashboard 会自动选择在线 daemon 作为创建者。',
|
|
400
666
|
'groups.name': '群名',
|
|
401
667
|
'groups.namePlaceholder': '例如 AI ChangeLog',
|
|
402
668
|
'groups.bindDir': '绑定目录',
|
|
403
669
|
'groups.bindDirHelp': '新话题直接用该目录启动 CLI,跳过 repo 选择。',
|
|
670
|
+
'groups.roleProfile': 'Profile',
|
|
671
|
+
'groups.roleProfileNone': '不使用',
|
|
672
|
+
'groups.roleProfileHelp': '创建后在新群里发送 profile apply bootstrap 命令。',
|
|
673
|
+
'groups.roleProfileBootstrapSent': 'Profile:{name};bootstrap 消息已发送:{messageId}',
|
|
674
|
+
'groups.roleProfileBootstrapDone': 'Profile:{name};bootstrap 已完成,无需发送 peer bootstrap 消息。',
|
|
675
|
+
'groups.roleProfileBootstrapFailed': 'Profile:{name};bootstrap 失败:{reason}',
|
|
404
676
|
'groups.botPicker': 'Bot',
|
|
405
677
|
'groups.createSubmit': '创建',
|
|
406
678
|
'groups.cancel': '取消',
|
|
@@ -466,6 +738,45 @@ const zh = {
|
|
|
466
738
|
'settings.autoRestartHelp': '默认关闭,需先开启自动更新。自动更新装到新版本后,若没有进行中的会话则自动重启以生效(撞上忙碌会话则跳到次日)。',
|
|
467
739
|
'settings.autoUpdateLocalDev': '当前为本地开发安装(从源码运行),自动更新不可用。',
|
|
468
740
|
'settings.maintenanceTime': '时间',
|
|
741
|
+
'update.section': '版本与更新',
|
|
742
|
+
'update.loginRequired': '登录后可检查版本、执行更新或重启。',
|
|
743
|
+
'update.loading': '检查中…',
|
|
744
|
+
'update.checkFailed': '检查失败',
|
|
745
|
+
'update.current': '当前版本',
|
|
746
|
+
'update.upToDate': '已是最新版本',
|
|
747
|
+
'update.newAvailable': '发现新版本 {version}',
|
|
748
|
+
'update.checkUnavailable': '无法获取最新版本(离线或受网络限制)',
|
|
749
|
+
'update.nodeWarn': '当前 Node 版本 {version} 过低,更新要求 ≥ {required},请先升级 Node。',
|
|
750
|
+
'update.localDev': '当前为本地开发安装(从源码运行),「更新到最新版」不可用;请用 git pull + 构建后重启。',
|
|
751
|
+
'update.multiInstallWarn': '检测到多个 botmux 安装,npm 更新只会更新 npm 全局那个,可能不是当前生效的版本:',
|
|
752
|
+
'update.kindNpm': 'npm 全局',
|
|
753
|
+
'update.kindSource': '源码 checkout',
|
|
754
|
+
'update.kindUnknown': '未知',
|
|
755
|
+
'update.btnCheck': '检查更新',
|
|
756
|
+
'update.btnChangelog': '查看更新内容',
|
|
757
|
+
'update.btnChangelogHide': '收起更新内容',
|
|
758
|
+
'update.btnUpdate': '更新到最新版',
|
|
759
|
+
'update.btnRestart': '重启 botmux',
|
|
760
|
+
'update.changelogLoading': '加载更新内容…',
|
|
761
|
+
'update.changelogEmpty': '没有比当前版本更新的发布说明。',
|
|
762
|
+
'update.changelogFailed': '无法加载更新内容(离线或受网络限制)。',
|
|
763
|
+
'update.changelogRateLimited': 'GitHub 接口请求超限(未登录每小时每 IP 60 次,共享网络易触发),暂时拿不到更新内容。',
|
|
764
|
+
'update.changelogViewOnGitHub': '前往 GitHub Releases 查看',
|
|
765
|
+
'update.navBadgeTitle': '有新版本 {version}',
|
|
766
|
+
'update.confirmMultiInstall': '检测到多个 botmux 安装:\n{paths}\n\nnpm 更新只会更新 npm 全局那个,可能不是当前生效的版本。仍要继续?',
|
|
767
|
+
'update.confirmUpdate': '将运行 npm install -g botmux@latest,更新到 {version}。确认继续?',
|
|
768
|
+
'update.confirmUpdateNoVer': '将运行 npm install -g botmux@latest 更新到最新版。确认继续?',
|
|
769
|
+
'update.nodeTooOldAlert': '当前 Node 版本 {version} 过低(要求 ≥ {required}),请先升级 Node 再更新。',
|
|
770
|
+
'update.updating': '正在更新(npm install -g botmux@latest),请稍候…',
|
|
771
|
+
'update.updatedChanged': '已更新 {old} → {new}。',
|
|
772
|
+
'update.confirmRestart': '需要重启 botmux 以应用新版本。现在重启?(所有会话会冷恢复,仪表盘会短暂断开并自动重连)',
|
|
773
|
+
'update.alreadyLatestRun': '已是最新版本({version}),无需更新。',
|
|
774
|
+
'update.updateFailed': '更新失败:{detail}',
|
|
775
|
+
'update.noRestartHint': '更新完成。稍后请手动重启(botmux restart)以应用新版本。',
|
|
776
|
+
'update.confirmPlainRestart': '重启 botmux?所有会话会冷恢复,仪表盘会短暂断开并自动重连。',
|
|
777
|
+
'update.restarting': '正在重启 botmux,等待重连…',
|
|
778
|
+
'update.restartSlow': '重启耗时较长,请稍后手动刷新页面。',
|
|
779
|
+
'update.restartFailed': '重启失败:{detail}',
|
|
469
780
|
'skills.title': 'Skill 管理',
|
|
470
781
|
'skills.subtitle': '管理 botmux 的 CLI 无关 Skill 资产,并按 bot 选择优先披露。',
|
|
471
782
|
'skills.installed': '已安装 Skills',
|
|
@@ -484,6 +795,26 @@ const zh = {
|
|
|
484
795
|
'skills.sourceHelpRemote': '可粘贴 Skill 目录页面或仓库地址;仓库地址需填写仓库内路径。',
|
|
485
796
|
'skills.sourceHelpLocalLabel': '本机 CLI Skill 目录: ',
|
|
486
797
|
'skills.sourceHelpLocal': '直接引用原地址,不复制到 botmux store。',
|
|
798
|
+
'skills.discover': '发现 Skill',
|
|
799
|
+
'skills.discoverTitle': '发现本机 CLI Skill',
|
|
800
|
+
'skills.discoverHelp': '扫描当前部署中已配置 bot 对应的 CLI Skill 目录;选中后注册为本地引用,不复制文件。',
|
|
801
|
+
'skills.discoverEmpty': '没有在本机 CLI skill 目录中发现可注册的 Skill。',
|
|
802
|
+
'skills.discoverGroupEmpty': '这个 CLI 目录下没有可注册的 Skill。',
|
|
803
|
+
'skills.discoverRegistered': '已注册',
|
|
804
|
+
'skills.discoverSelectAll': '全选未注册',
|
|
805
|
+
'skills.discoverClearSelection': '取消全选',
|
|
806
|
+
'skills.discoverRegister': '注册选中',
|
|
807
|
+
'skills.discoverClose': '关闭',
|
|
808
|
+
'skills.discoverNothingSelected': '请选择至少一个未注册的 Skill。',
|
|
809
|
+
'skills.discoverRegisteringBatch': '正在批量注册 {total} 个 Skill',
|
|
810
|
+
'skills.sourceCodex': '本机 Codex',
|
|
811
|
+
'skills.sourceClaude': '本机 Claude',
|
|
812
|
+
'skills.sourceTrae': '本机 Trae',
|
|
813
|
+
'skills.sourceCursor': '本机 Cursor',
|
|
814
|
+
'skills.sourceGemini': '本机 Gemini',
|
|
815
|
+
'skills.sourceOpenCode': '本机 OpenCode',
|
|
816
|
+
'skills.sourceLocalLink': '本机引用',
|
|
817
|
+
'skills.sourceBotmuxCopy': 'botmux store',
|
|
487
818
|
'skills.path': '仓库内路径(可选)',
|
|
488
819
|
'skills.pathPlaceholder': '留空则使用 GitHub URL 中的路径',
|
|
489
820
|
'skills.ref': 'Ref(可选)',
|
|
@@ -496,6 +827,7 @@ const zh = {
|
|
|
496
827
|
'skills.prevPage': '上一页',
|
|
497
828
|
'skills.nextPage': '下一页',
|
|
498
829
|
'skills.empty': '暂无已安装 skill。可以从本机目录、Git 或 GitHub 安装。',
|
|
830
|
+
'skills.apiUnavailable': '当前 Dashboard 后端不支持 Skill API,通常是前端已更新但 botmux 进程未重启。请重启 botmux 后刷新页面。',
|
|
499
831
|
'skills.globalDefaults': '全局 Skill 注入配置',
|
|
500
832
|
'skills.globalProject': '工作区 Skill',
|
|
501
833
|
'skills.globalProjectOff': '忽略工作区 Skill',
|
|
@@ -579,6 +911,12 @@ const zh = {
|
|
|
579
911
|
'botDefaults.roleSaved': '已保存',
|
|
580
912
|
'botDefaults.roleDeleted': '已删除',
|
|
581
913
|
'botDefaults.roleLoadErr': '角色加载失败',
|
|
914
|
+
'botDefaults.profileRoles': 'Profile 角色',
|
|
915
|
+
'botDefaults.profileRolesHelp': '该 bot 在各个 Profile 中的角色条目;默认折叠,展开后读取详情。',
|
|
916
|
+
'botDefaults.profileRolesEmpty': '这个 bot 暂无 Profile 角色。',
|
|
917
|
+
'botDefaults.profileRolesLoadFailed': 'Profile 角色加载失败:{error}',
|
|
918
|
+
'botDefaults.profileRoleClickToLoad': '展开后加载角色详情。',
|
|
919
|
+
'botDefaults.profileRoleDetailLoadFailed': '角色详情加载失败:{error}',
|
|
582
920
|
'botDefaults.sectionAutoStart': '主动开工',
|
|
583
921
|
'botDefaults.autoStartJoin': '被拉进新群自动开工',
|
|
584
922
|
'botDefaults.autoStartJoinHelp': '开启后,机器人一被拉进新群(群里有授权用户 allowedUsers 时)就自动开一个会话开始工作,无需 @。在机器人的默认工作目录启动;未配置默认目录时先弹仓库选择卡让你选。前提:需在飞书开放平台为本应用订阅「机器人进群」事件 im.chat.member.bot.added_v1,并开通群成员读取权限。',
|
|
@@ -630,9 +968,17 @@ const zh = {
|
|
|
630
968
|
'botDefaults.startupCommandsHelp': '开会话后、首条消息之前,自动按顺序发给 CLI 的命令(每条独立回车),如 /effort ultracode。逗号或换行分隔,每行一条,可带参数;留空=不发。下个新会话起效,且每次新会话(含 resume)都重放——所以 /effort ultracode 这类只对当前会话生效的设置不会因 resume 丢失。仅对原生 CLI 会话生效,adopt 接管的会话不发。',
|
|
631
969
|
'botDefaults.startupCommandsPlaceholder': '每行一条,如 /effort ultracode',
|
|
632
970
|
'botDefaults.startupCommandsSave': '保存启动命令',
|
|
971
|
+
'botDefaults.sectionEnv': '环境变量',
|
|
972
|
+
'botDefaults.envHelp': '注入到本 bot CLI 进程的环境变量(JSON 对象)。典型用途:让某个 bot 走 GLM / 第三方 Anthropic·OpenAI 兼容服务商——填 ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN(GLM 国际站 https://api.z.ai/api/anthropic,国内站 https://open.bigmodel.cn/api/anthropic),或设 HTTPS_PROXY、CLI 专属开关。值仅接受字符串/数字/布尔;BOTMUX_ / LARK_APP_ 等 botmux 保留键会被忽略。下个新会话起效,按会话注入到 CLI 进程(不进共享 tmux server 全局,不会串到别的 bot)。留空=清除。注意:值以明文存于 bots.json,不是密钥保险箱。',
|
|
973
|
+
'botDefaults.envPlaceholder': '{\n "ANTHROPIC_BASE_URL": "https://api.z.ai/api/anthropic",\n "ANTHROPIC_AUTH_TOKEN": "你的 GLM Coding Plan key"\n}',
|
|
974
|
+
'botDefaults.envSave': '保存环境变量',
|
|
633
975
|
'nav.roles': '角色管理',
|
|
976
|
+
'nav.groupRoles': '群角色',
|
|
977
|
+
'nav.roleProfiles': 'Profiles',
|
|
634
978
|
'roles.title': '角色管理',
|
|
635
|
-
'roles.subtitle': '
|
|
979
|
+
'roles.subtitle': '管理每个群的 Bot 角色,并维护可复用的 Profiles。',
|
|
980
|
+
'roleProfiles.title': 'Profiles',
|
|
981
|
+
'roleProfiles.subtitle': '维护可复用的多 Bot Profiles,并快速预览或应用到目标群。',
|
|
636
982
|
'roles.search': '搜索群名/Bot/ID',
|
|
637
983
|
'roles.refresh': '刷新',
|
|
638
984
|
'roles.selectHint': '← 展开群组,选择一个 Bot 来编辑角色',
|
|
@@ -649,6 +995,31 @@ const zh = {
|
|
|
649
995
|
'roles.botsWithRoles': '个 Bot 已配置角色',
|
|
650
996
|
'roles.emptyError': '角色内容不能为空,请先输入内容',
|
|
651
997
|
'roles.saveFailed': '保存失败,请重试',
|
|
998
|
+
'roles.tabGroups': '按群组',
|
|
999
|
+
'roles.tabProfiles': 'Profiles',
|
|
1000
|
+
'roles.profileIdPlaceholder': 'profile id,如 collab-main',
|
|
1001
|
+
'roles.profileIdInvalid': 'Profile id 只能包含字母、数字、点、下划线、短横线,最长 64,且不能是 . 或 ..',
|
|
1002
|
+
'roles.openProfile': '打开',
|
|
1003
|
+
'roles.profileSearch': '搜索 profile',
|
|
1004
|
+
'roles.profileSelectHint': '← 选择或输入一个 profile 来编辑',
|
|
1005
|
+
'roles.profileEmpty': '暂无 Profiles',
|
|
1006
|
+
'roles.profileEntries': '个 entry',
|
|
1007
|
+
'roles.profileMissing': '缺失',
|
|
1008
|
+
'roles.profileRuntimeHint': 'Profile 只是可复用套装;Apply 后写成本群 Role,不增加运行时层级。',
|
|
1009
|
+
'roles.profileBots': 'Bot Entries',
|
|
1010
|
+
'roles.profileEditorPlaceholder': '输入当前 bot 在该 profile 下的 Markdown role...',
|
|
1011
|
+
'roles.saveEntry': '保存 Entry',
|
|
1012
|
+
'roles.profileBotSelectHint': '选择一个 Bot 来编辑它在该 profile 里的 entry',
|
|
1013
|
+
'roles.applyToGroup': 'Apply 到群组',
|
|
1014
|
+
'roles.applyForce': '覆盖已有本群 Role',
|
|
1015
|
+
'roles.previewApply': '预览 Apply',
|
|
1016
|
+
'roles.applyProfile': 'Apply Profile',
|
|
1017
|
+
'roles.applyPickBots': '请选择至少一个 Bot',
|
|
1018
|
+
'roles.applyWouldRefuse': '会拒绝(已有本群 Role)',
|
|
1019
|
+
'roles.applyPreviewOk': '可应用',
|
|
1020
|
+
'roles.applyOk': '已应用',
|
|
1021
|
+
'roles.applyFailed': '失败',
|
|
1022
|
+
'roles.confirmDeleteProfileEntry': '确认删除该 Bot 在此 profile 里的 entry?',
|
|
652
1023
|
'common.none': '无',
|
|
653
1024
|
'common.loading': '加载中…',
|
|
654
1025
|
'common.unknown': '未知',
|
|
@@ -986,6 +1357,237 @@ const en = {
|
|
|
986
1357
|
'sessions.landApplied': 'Landed',
|
|
987
1358
|
'sessions.landFailed': 'Land failed',
|
|
988
1359
|
'sessions.landDiscarded': 'Discarded (sandbox clone not applied).',
|
|
1360
|
+
'sessions.insight': 'Insight',
|
|
1361
|
+
'sessions.insightLoading': 'Analyzing…',
|
|
1362
|
+
'sessions.insightUnavailable': 'Insight unavailable',
|
|
1363
|
+
'sessions.insightEmpty': 'No analyzable tool spans in this session yet.',
|
|
1364
|
+
'sessions.insightMetrics': 'spans {total} · failed {failed} · slow {slow} · read/write {rw} · compactions {compactions}',
|
|
1365
|
+
'sessions.insightSuggestions': 'Suggestions',
|
|
1366
|
+
'sessions.insightSpans': 'Action spans',
|
|
1367
|
+
'sessions.insightCapped': 'showing first {shown}/{total}',
|
|
1368
|
+
'sessions.insightAsOf': 'as of {asOf}',
|
|
1369
|
+
'sessions.insightPartial': '(may exclude the in-flight latest turn)',
|
|
1370
|
+
'nav.insights': 'Insight',
|
|
1371
|
+
'insights.title': 'Workflow Insight',
|
|
1372
|
+
'insights.subtitle': 'Read-only analysis of local Claude Code / Codex sessions — action trace, failures, friction, with rule-based optimization tips.',
|
|
1373
|
+
'insights.refresh': 'Refresh',
|
|
1374
|
+
'insights.search': 'Search session / bot / dir…',
|
|
1375
|
+
'insights.filter': 'Filter',
|
|
1376
|
+
'insights.filterAll': 'All',
|
|
1377
|
+
'insights.filterReview': 'Worth review',
|
|
1378
|
+
'insights.filterFailed': 'Has failures',
|
|
1379
|
+
'insights.filterSlow': 'Has slow spans',
|
|
1380
|
+
'insights.loading': 'Analyzing…',
|
|
1381
|
+
'insights.loaded': 'Analyzed {count} sessions',
|
|
1382
|
+
'insights.unavailable': 'Load failed',
|
|
1383
|
+
'insights.listCount': 'showing {shown}/{total}',
|
|
1384
|
+
'insights.sessions': 'Sessions',
|
|
1385
|
+
'insights.empty': 'No matching sessions.',
|
|
1386
|
+
'insights.selectSession': 'Pick a session on the left to see action spans and suggestions.',
|
|
1387
|
+
'insights.detailLoading': 'Loading session detail…',
|
|
1388
|
+
'insights.recommendations': 'Suggestions',
|
|
1389
|
+
'insights.recommendationsHint': 'Rule-based cross-session rollup, each traceable to a metric.',
|
|
1390
|
+
'insights.noRecommendations': 'No suggestions.',
|
|
1391
|
+
'insights.seenInSessions': 'seen in {count} sessions',
|
|
1392
|
+
'insights.toolFailures': 'Top tool failures',
|
|
1393
|
+
'insights.toolFailuresHint': 'Failed spans grouped by tool.',
|
|
1394
|
+
'insights.noFailures': 'No failed spans.',
|
|
1395
|
+
'insights.metricSessions': 'Sessions',
|
|
1396
|
+
'insights.metricAnalyzed': '{count} analyzed',
|
|
1397
|
+
'insights.metricSpans': 'Spans',
|
|
1398
|
+
'insights.metricSafe': 'redacted',
|
|
1399
|
+
'insights.metricFailed': 'Failed spans',
|
|
1400
|
+
'insights.metricSlow': 'Slow spans',
|
|
1401
|
+
'insights.metricRw': 'Read/write',
|
|
1402
|
+
'insights.metricCompactions': 'compactions {count}',
|
|
1403
|
+
'insights.spansShort': 'span ',
|
|
1404
|
+
'insights.failedShort': 'fail ',
|
|
1405
|
+
'insights.slowShort': 'slow ',
|
|
1406
|
+
'insights.rwShort': 'r/w ',
|
|
1407
|
+
'insights.unsupported': 'CLI not supported',
|
|
1408
|
+
'insights.noTranscript': 'No transcript',
|
|
1409
|
+
'insights.parseError': 'Parse failed',
|
|
1410
|
+
'insights.noSpans': 'No analyzable spans.',
|
|
1411
|
+
'insights.sevBad': 'Critical',
|
|
1412
|
+
'insights.sevWarn': 'Warn',
|
|
1413
|
+
'insights.sevInfo': 'Info',
|
|
1414
|
+
'insights.phase.research': 'Research',
|
|
1415
|
+
'insights.phase.edit': 'Edit',
|
|
1416
|
+
'insights.phase.run': 'Run',
|
|
1417
|
+
'insights.phase.delegate': 'Delegate',
|
|
1418
|
+
'insights.phase.discuss': 'Discuss',
|
|
1419
|
+
'insights.trace': 'Action spans',
|
|
1420
|
+
'insights.ledger': 'Per-turn ledger',
|
|
1421
|
+
'insights.detailTabs': 'Detail views',
|
|
1422
|
+
'insights.spanStatus': 'Status',
|
|
1423
|
+
'insights.spanTool': 'Tool',
|
|
1424
|
+
'insights.spanPhase': 'Phase',
|
|
1425
|
+
'insights.spanDuration': 'Duration',
|
|
1426
|
+
'insights.spanTurn': 'Turn',
|
|
1427
|
+
'insights.spanSummary': 'Summary',
|
|
1428
|
+
'insights.ledgerMore': 'Show {count} more summaries',
|
|
1429
|
+
'insights.ledgerOmitted': '{count} more hidden',
|
|
1430
|
+
'insights.ledgerNoContent': 'No redacted summary for this turn.',
|
|
1431
|
+
'insights.diagShow': 'Show evidence',
|
|
1432
|
+
'insights.diagActive': 'Viewing',
|
|
1433
|
+
'insights.evMatched': '{count} matching spans',
|
|
1434
|
+
'insights.evMatchedCapped': '{matched} matched · showing {shown}',
|
|
1435
|
+
'insights.evDefault': '{shown} of {total} spans (focused)',
|
|
1436
|
+
'insights.evShowAll': 'Show all {count}',
|
|
1437
|
+
'insights.evBackToEvidence': 'Focused view',
|
|
1438
|
+
'insights.intent.run_script': 'Run script',
|
|
1439
|
+
'insights.intent.test': 'Test',
|
|
1440
|
+
'insights.intent.typecheck': 'Typecheck',
|
|
1441
|
+
'insights.intent.lint': 'Lint',
|
|
1442
|
+
'insights.intent.git': 'Git',
|
|
1443
|
+
'insights.intent.search': 'Search',
|
|
1444
|
+
'insights.intent.read_file': 'Read',
|
|
1445
|
+
'insights.intent.edit_file': 'Edit',
|
|
1446
|
+
'insights.intent.write_file': 'Write',
|
|
1447
|
+
'insights.intent.delegate': 'Delegate',
|
|
1448
|
+
'insights.intent.unknown': 'Action',
|
|
1449
|
+
'insights.result.ok': 'OK',
|
|
1450
|
+
'insights.result.tool_error': 'Tool error',
|
|
1451
|
+
'insights.result.test_failed': 'Test failed',
|
|
1452
|
+
'insights.result.typecheck_failed': 'Typecheck failed',
|
|
1453
|
+
'insights.result.lint_failed': 'Lint failed',
|
|
1454
|
+
'insights.result.command_failed': 'Command failed',
|
|
1455
|
+
'insights.result.timeout': 'Timeout',
|
|
1456
|
+
'insights.result.no_output': 'No output',
|
|
1457
|
+
'insights.result.unknown': 'Unknown',
|
|
1458
|
+
'insights.tag.failure': 'Failures',
|
|
1459
|
+
'insights.tag.slow': 'Slow',
|
|
1460
|
+
'insights.tag.retry': 'Retries',
|
|
1461
|
+
'insights.tag.read_write_imbalance': 'Read/write imbalance',
|
|
1462
|
+
'insights.tag.diagnostic': 'Diagnostic',
|
|
1463
|
+
'insights.tag.normal': 'Normal',
|
|
1464
|
+
'insights.turnHeadline.turn_has_failures': '{failures} failures this turn',
|
|
1465
|
+
'insights.turnHeadline.turn_has_slow_spans': 'Slow operations this turn',
|
|
1466
|
+
'insights.turnHeadline.turn_has_retries': 'Retried the same action repeatedly',
|
|
1467
|
+
'insights.turnHeadline.turn_read_write_imbalance': 'Edit-heavy turn (edits {edits} / reads {reads})',
|
|
1468
|
+
'insights.evTimeline': 'Full timeline ({count} spans)',
|
|
1469
|
+
'insights.evNoFlags': 'No spans flagged as failure / slow / retry',
|
|
1470
|
+
'insights.turnAllNormal': 'All {count} turns look normal — nothing to review',
|
|
1471
|
+
'insights.turnEvidence': 'View {count} evidence spans',
|
|
1472
|
+
'insights.turnHiddenNormal': '{count} normal turns hidden',
|
|
1473
|
+
'insights.mReads': 'Read',
|
|
1474
|
+
'insights.mEdits': 'Edit',
|
|
1475
|
+
'insights.mRuns': 'Run',
|
|
1476
|
+
'insights.mFailures': 'Fail',
|
|
1477
|
+
'insights.mDur': 'Time',
|
|
1478
|
+
'insights.turnHeadline.turn_normal': 'Normal',
|
|
1479
|
+
'insights.rec.fix_repeated_tool_failures': 'Repeated command failures need to converge',
|
|
1480
|
+
'insights.rec.split_slow_operation': 'Slow operations dragged the whole session',
|
|
1481
|
+
'insights.rec.add_read_pass_before_edit': 'Too little reading before editing',
|
|
1482
|
+
'insights.rec.preserve_context_checkpoints': 'Context was compacted — keep checkpoints',
|
|
1483
|
+
'insights.impact.impact_failed_spans': '{failedSpans} actions failed (top: {topTool} ×{topToolFailures})',
|
|
1484
|
+
'insights.impact.impact_slow_spans': '{slowSpansTotal} slow operations slowed progress',
|
|
1485
|
+
'insights.impact.impact_low_read_write_ratio': 'Edited {writeSpans}, read only {readSpans}',
|
|
1486
|
+
'insights.impact.impact_context_compaction': '{compactions} context compactions this session',
|
|
1487
|
+
'insights.why.why_tool_failure_concentrated': 'Failures concentrate on {topTool} ({topToolFailures}×) — likely one root cause',
|
|
1488
|
+
'insights.why.why_slow_span_dominates': 'A few long operations dominate; slowest is {slowestTool}',
|
|
1489
|
+
'insights.why.why_edits_outpaced_reads': 'Read/write ratio {readWriteRatio}; editing more than reading invites rework',
|
|
1490
|
+
'insights.why.why_context_compaction_happened': 'Long session was compacted; early decisions/context may be lost',
|
|
1491
|
+
'insights.action.inspect_failed_span_details': 'Open each failed action’s detail to find the root cause',
|
|
1492
|
+
'insights.action.add_preflight_or_timeout': 'Add preflight checks or timeouts to frequently failing commands',
|
|
1493
|
+
'insights.action.narrow_or_split_slow_operation': 'Narrow or split slow operations (e.g. run targeted tests)',
|
|
1494
|
+
'insights.action.surface_timeout_or_progress': 'Surface timeouts/progress earlier instead of silently hanging',
|
|
1495
|
+
'insights.action.read_or_search_before_editing': 'Read or search an unfamiliar file before editing it',
|
|
1496
|
+
'insights.action.verify_assumptions_before_running': 'Verify assumptions before acting to avoid blind edits',
|
|
1497
|
+
'insights.action.write_checkpoints_for_long_tasks': 'Write decisions and checkpoints to notes for long tasks',
|
|
1498
|
+
'insights.struct.shell': 'shell command',
|
|
1499
|
+
'insights.struct.fileEdit': 'file edit',
|
|
1500
|
+
'insights.struct.readSearch': 'read/search',
|
|
1501
|
+
'insights.struct.agentTask': 'agent task',
|
|
1502
|
+
'insights.struct.toolInput': 'tool input',
|
|
1503
|
+
'insights.struct.toolResult': 'tool result',
|
|
1504
|
+
'insights.struct.toolError': 'tool error',
|
|
1505
|
+
'insights.struct.patchFailed': 'patch failed',
|
|
1506
|
+
'insights.struct.patchApplied': 'patch applied',
|
|
1507
|
+
'insights.struct.exit': 'exit {code}',
|
|
1508
|
+
'insights.spanAll': 'All',
|
|
1509
|
+
'insights.dDetail': 'Detail',
|
|
1510
|
+
'insights.dCollapse': 'Hide',
|
|
1511
|
+
'insights.dPhase': 'Phase',
|
|
1512
|
+
'insights.dStart': 'Start',
|
|
1513
|
+
'insights.dDur': 'Duration',
|
|
1514
|
+
'insights.dIntent': 'Intent',
|
|
1515
|
+
'insights.dResult': 'Result',
|
|
1516
|
+
'insights.dIn': 'Input',
|
|
1517
|
+
'insights.dOut': 'Output',
|
|
1518
|
+
'insights.dTags': 'Tags',
|
|
1519
|
+
'insights.dTurnContext': 'Turn {turn} context',
|
|
1520
|
+
'insights.advice.failure': '💡 Read the error before retrying — don’t retry blindly',
|
|
1521
|
+
'insights.advice.retry': '💡 Same step retried repeatedly — find the root cause first',
|
|
1522
|
+
'insights.advice.read_write_imbalance': '💡 Read the relevant files before editing to avoid rework',
|
|
1523
|
+
'insights.advice.slow': '💡 Slow op: run targeted tests or split it up',
|
|
1524
|
+
'insights.turnPrompt': 'User',
|
|
1525
|
+
'insights.turnExpand': 'Expand {count} steps',
|
|
1526
|
+
'insights.turnCollapse': 'Collapse',
|
|
1527
|
+
'insights.turnRail': 'Session trace',
|
|
1528
|
+
'insights.gantt': 'Work timeline',
|
|
1529
|
+
'insights.ganttCaption': '{span} actions · {dur} elapsed · {active} active',
|
|
1530
|
+
'insights.ctxCurve': 'Context curve',
|
|
1531
|
+
'insights.ctxCaption': 'Per-turn in+cache peak · max {peak} · {turns} turns',
|
|
1532
|
+
'insights.ctxTurn': 'Turn {n}',
|
|
1533
|
+
'insights.railSubagent': 'Subagent',
|
|
1534
|
+
'insights.railSubagents': '{n} subagents',
|
|
1535
|
+
'insights.turnPromptExpand': 'Expand',
|
|
1536
|
+
'insights.turnPromptCollapse': 'Collapse',
|
|
1537
|
+
'insights.turnPromptRaw': 'Raw',
|
|
1538
|
+
'insights.turnPromptRendered': 'Rendered',
|
|
1539
|
+
'insights.srcMentions': 'mentions',
|
|
1540
|
+
'insights.senderHuman': 'User',
|
|
1541
|
+
'insights.senderA2A': 'A2A',
|
|
1542
|
+
'insights.senderOther': 'Other',
|
|
1543
|
+
'insights.senderSystem': 'System',
|
|
1544
|
+
'insights.turnPromptFull': 'Full text',
|
|
1545
|
+
'insights.modalClose': 'Close',
|
|
1546
|
+
'insights.promptTruncated': 'Long content, truncated',
|
|
1547
|
+
'insights.replay': 'Replay',
|
|
1548
|
+
'insights.replayAgent': 'agent ops',
|
|
1549
|
+
'insights.replaySearch': 'Search conversation…',
|
|
1550
|
+
'insights.replayBy': 'From',
|
|
1551
|
+
'insights.replayState': 'State',
|
|
1552
|
+
'insights.replayLoadMore': 'Load more ({shown}/{total})',
|
|
1553
|
+
'insights.replayAllLoaded': 'All loaded ({total})',
|
|
1554
|
+
'insights.replayEmpty': 'No matching messages',
|
|
1555
|
+
'insights.replayNoText': '(no text — see ops)',
|
|
1556
|
+
'insights.replayOps': '{count} ops',
|
|
1557
|
+
'insights.wsFiles': 'File changes · {n}',
|
|
1558
|
+
'insights.wsCmds': 'Commands · {n}',
|
|
1559
|
+
'insights.wsReads': 'read {n}',
|
|
1560
|
+
'insights.wsEdits': 'edit {n}',
|
|
1561
|
+
'insights.wsFail': '{n} failed',
|
|
1562
|
+
'insights.wsNoFiles': 'No file changes',
|
|
1563
|
+
'insights.wsNoCmds': 'No commands',
|
|
1564
|
+
'insights.turnSummary': '{total} turns · {flagged} need attention',
|
|
1565
|
+
'insights.dCommand': 'Command',
|
|
1566
|
+
'insights.dCmdOutput': 'Output',
|
|
1567
|
+
'insights.ledgerNormal': 'By order',
|
|
1568
|
+
'insights.ledgerGrouped': 'By recommendation',
|
|
1569
|
+
'insights.ledgerOther': 'Other turns',
|
|
1570
|
+
'insights.ledgerGroupCount': '{count} turns',
|
|
1571
|
+
'insights.turnsCapped': 'Only first {shown}/{total} actions — timeline may be incomplete',
|
|
1572
|
+
'insights.suggestion.high_tool_failure.title': 'Tool failures are concentrated',
|
|
1573
|
+
'insights.suggestion.high_tool_failure.action': 'Check failed spans first, then add preflight checks or timeout control for repeated failing commands.',
|
|
1574
|
+
'insights.suggestion.tool_failure_present.title': 'Some tool calls failed',
|
|
1575
|
+
'insights.suggestion.tool_failure_present.action': 'Review failed spans before repeating the workflow.',
|
|
1576
|
+
'insights.suggestion.slow_span.title': 'A slow span dominates the session',
|
|
1577
|
+
'insights.suggestion.slow_span.action': 'Split or bound the slow operation, and surface timeout or progress feedback earlier.',
|
|
1578
|
+
'insights.suggestion.low_read_write_ratio.title': 'Edits outpaced reads',
|
|
1579
|
+
'insights.suggestion.low_read_write_ratio.action': 'Add a read/search pass before edits when changing unfamiliar files.',
|
|
1580
|
+
'insights.suggestion.context_compaction.title': 'Context compaction happened',
|
|
1581
|
+
'insights.suggestion.context_compaction.action': 'For long tasks, preserve decisions and checkpoints in durable notes or smaller subtasks.',
|
|
1582
|
+
'insights.suggestion.no_major_friction.title': 'No major trace friction detected',
|
|
1583
|
+
'insights.suggestion.no_major_friction.action': 'Use the span timeline for spot checks or compare against slower sessions.',
|
|
1584
|
+
'insights.evidence.failedSpans': '{count} failed spans',
|
|
1585
|
+
'insights.evidence.toolFailedTimes': '{tool} failed {count} times',
|
|
1586
|
+
'insights.evidence.multipleToolsFailed': 'multiple tools failed',
|
|
1587
|
+
'insights.evidence.toolRanSeconds': '{tool} ran for {seconds}s',
|
|
1588
|
+
'insights.evidence.readWriteRatio': 'read/write ratio {ratio}',
|
|
1589
|
+
'insights.evidence.compactions': 'compactions {count}',
|
|
1590
|
+
'insights.evidence.spansAnalyzed': '{count} spans analyzed',
|
|
989
1591
|
'connectors.lede': 'Let external systems (alerts, CI, tickets…) trigger a bot to speak in a group or run a workflow via one webhook.',
|
|
990
1592
|
'connectors.createTitle': 'New Webhook',
|
|
991
1593
|
'connectors.fName': 'Name',
|
|
@@ -1225,14 +1827,55 @@ const en = {
|
|
|
1225
1827
|
'groups.chat': 'Chat',
|
|
1226
1828
|
'groups.actions': 'Actions',
|
|
1227
1829
|
'groups.addBots': 'Add Bots',
|
|
1830
|
+
'groups.saveAsProfile': 'Save as Profile',
|
|
1228
1831
|
'groups.manage': 'Manage',
|
|
1229
1832
|
'groups.empty': 'No chats match the filters.',
|
|
1833
|
+
'groups.profileStatusFull': 'Fully matches {name} ({matched}/{total})',
|
|
1834
|
+
'groups.profileStatusFullChat': 'Group roles fully match {name} ({matched}/{total})',
|
|
1835
|
+
'groups.profileStatusPartial': 'Partially matches {name} ({matched}/{total})',
|
|
1836
|
+
'groups.profileStatusUnmatched': 'No profile match',
|
|
1837
|
+
'groups.saveProfileTitle': 'Save as Profile',
|
|
1838
|
+
'groups.saveProfileIntro': 'Save {count} in-chat bot configs from "{name}" as a profile snapshot.',
|
|
1839
|
+
'groups.saveProfileScope': 'Save scope',
|
|
1840
|
+
'groups.saveProfileScopeHelp': 'In-chat bot config snapshot',
|
|
1841
|
+
'groups.saveProfileBotCount': 'Bots in chat',
|
|
1842
|
+
'groups.saveProfileLoadFailed': 'Load failed',
|
|
1843
|
+
'groups.saveProfileStatus.entry': 'Create entry',
|
|
1844
|
+
'groups.saveProfileStatus.error': 'Load failed',
|
|
1845
|
+
'groups.saveProfileMode': 'Save mode',
|
|
1846
|
+
'groups.saveProfileNew': 'New Profile',
|
|
1847
|
+
'groups.saveProfileNewHelp': 'Create a new snapshot by default; if the id exists, matching bot entries are overwritten.',
|
|
1848
|
+
'groups.saveProfileOverwrite': 'Overwrite Existing Profile',
|
|
1849
|
+
'groups.saveProfileOverwriteHelp': 'Pick an existing profile and overwrite entries for the same bots.',
|
|
1850
|
+
'groups.saveProfileExistingMeta': '{count} entries',
|
|
1851
|
+
'groups.saveProfileIdLabel': 'Profile id',
|
|
1852
|
+
'groups.saveProfileExistingLabel': 'Existing Profile',
|
|
1853
|
+
'groups.saveProfileExistingEmpty': 'No existing profiles',
|
|
1854
|
+
'groups.saveProfileTarget': 'Target Profile',
|
|
1855
|
+
'groups.saveProfileTargetNew': 'Will create or update this profile with the in-chat bot snapshot',
|
|
1856
|
+
'groups.saveProfileTargetOverwrite': 'Will overwrite entries for these bots in the existing profile',
|
|
1857
|
+
'groups.saveProfileEntrySummary': 'Will create profile entries for {count} in-chat bots.',
|
|
1858
|
+
'groups.saveProfileEntrySummaryWithEmpty': 'Will create profile entries for {count} in-chat bots; {emptyCount} currently have no returned role content and will be saved as empty entries.',
|
|
1859
|
+
'groups.saveProfileFailedLoadSummary': '{count} bot configs failed to load. Saving is paused to avoid an incomplete snapshot.',
|
|
1860
|
+
'groups.saveProfileSubmit': 'Save Profile',
|
|
1861
|
+
'groups.saveProfileOverwriteSubmit': 'Overwrite Save',
|
|
1862
|
+
'groups.saveProfileInvalid': 'Profile id may contain letters, numbers, dots, underscores, and hyphens only; max 64; cannot be . or ..',
|
|
1863
|
+
'groups.saveProfileNoRoles': 'This chat has no bot configs to save.',
|
|
1864
|
+
'groups.saveProfileSaving': 'Saving…',
|
|
1865
|
+
'groups.saveProfileDone': 'Saved {count} entries into {name}',
|
|
1866
|
+
'groups.saveProfileFailed': 'Saved only {saved}/{total} entries. Check offline bots or permissions.',
|
|
1230
1867
|
'groups.createTitle': 'Create New Group',
|
|
1231
1868
|
'groups.createHelp': 'Pick bots to invite. The dashboard chooses an online daemon as creator.',
|
|
1232
1869
|
'groups.name': 'Group Name',
|
|
1233
1870
|
'groups.namePlaceholder': 'e.g. AI ChangeLog',
|
|
1234
1871
|
'groups.bindDir': 'Bind Directory',
|
|
1235
1872
|
'groups.bindDirHelp': 'New topics start the CLI here and skip repo selection.',
|
|
1873
|
+
'groups.roleProfile': 'Profile',
|
|
1874
|
+
'groups.roleProfileNone': 'None',
|
|
1875
|
+
'groups.roleProfileHelp': 'After creation, send a profile apply bootstrap command in the new group.',
|
|
1876
|
+
'groups.roleProfileBootstrapSent': 'Profile: {name}; bootstrap message sent: {messageId}',
|
|
1877
|
+
'groups.roleProfileBootstrapDone': 'Profile: {name}; bootstrap completed with no peer bootstrap message needed.',
|
|
1878
|
+
'groups.roleProfileBootstrapFailed': 'Profile: {name}; bootstrap failed: {reason}',
|
|
1236
1879
|
'groups.botPicker': 'Bots',
|
|
1237
1880
|
'groups.createSubmit': 'Create',
|
|
1238
1881
|
'groups.cancel': 'Cancel',
|
|
@@ -1298,6 +1941,45 @@ const en = {
|
|
|
1298
1941
|
'settings.autoRestartHelp': 'Off by default; requires auto-update. After auto-update installs a newer version, restart to apply it if no session is in progress (busy ⇒ slips to the next day).',
|
|
1299
1942
|
'settings.autoUpdateLocalDev': 'This is a local-dev install (running from source); auto-update is unavailable.',
|
|
1300
1943
|
'settings.maintenanceTime': 'Time',
|
|
1944
|
+
'update.section': 'Version & Update',
|
|
1945
|
+
'update.loginRequired': 'Sign in to check the version, update, or restart.',
|
|
1946
|
+
'update.loading': 'Checking…',
|
|
1947
|
+
'update.checkFailed': 'Check failed',
|
|
1948
|
+
'update.current': 'Current version',
|
|
1949
|
+
'update.upToDate': 'Up to date',
|
|
1950
|
+
'update.newAvailable': 'New version {version} available',
|
|
1951
|
+
'update.checkUnavailable': "Couldn't fetch the latest version (offline or network-restricted)",
|
|
1952
|
+
'update.nodeWarn': 'Node {version} is too old; update requires ≥ {required}. Please upgrade Node first.',
|
|
1953
|
+
'update.localDev': 'This is a local-dev install (running from source); "Update to latest" is unavailable — use git pull + build, then restart.',
|
|
1954
|
+
'update.multiInstallWarn': 'Multiple botmux installs detected. npm only updates the npm-global one, which may not be the active version:',
|
|
1955
|
+
'update.kindNpm': 'npm-global',
|
|
1956
|
+
'update.kindSource': 'source checkout',
|
|
1957
|
+
'update.kindUnknown': 'unknown',
|
|
1958
|
+
'update.btnCheck': 'Check for updates',
|
|
1959
|
+
'update.btnChangelog': "View what's new",
|
|
1960
|
+
'update.btnChangelogHide': 'Hide changelog',
|
|
1961
|
+
'update.btnUpdate': 'Update to latest',
|
|
1962
|
+
'update.btnRestart': 'Restart botmux',
|
|
1963
|
+
'update.changelogLoading': 'Loading changelog…',
|
|
1964
|
+
'update.changelogEmpty': 'No release notes newer than the current version.',
|
|
1965
|
+
'update.changelogFailed': "Couldn't load the changelog (offline or network-restricted).",
|
|
1966
|
+
'update.changelogRateLimited': 'GitHub API rate limit hit (60 req/h per IP unauthenticated, easily tripped on shared networks). Try again later.',
|
|
1967
|
+
'update.changelogViewOnGitHub': 'View on GitHub Releases',
|
|
1968
|
+
'update.navBadgeTitle': 'New version {version} available',
|
|
1969
|
+
'update.confirmMultiInstall': 'Multiple botmux installs detected:\n{paths}\n\nnpm only updates the npm-global one, which may not be the active version. Continue anyway?',
|
|
1970
|
+
'update.confirmUpdate': 'This will run npm install -g botmux@latest to update to {version}. Continue?',
|
|
1971
|
+
'update.confirmUpdateNoVer': 'This will run npm install -g botmux@latest to update to the latest version. Continue?',
|
|
1972
|
+
'update.nodeTooOldAlert': 'Node {version} is too old (requires ≥ {required}). Please upgrade Node before updating.',
|
|
1973
|
+
'update.updating': 'Updating (npm install -g botmux@latest)…',
|
|
1974
|
+
'update.updatedChanged': 'Updated {old} → {new}.',
|
|
1975
|
+
'update.confirmRestart': 'A restart is required to apply the new version. Restart now? (Sessions cold-resume; the dashboard briefly disconnects and reconnects.)',
|
|
1976
|
+
'update.alreadyLatestRun': 'Already on the latest version ({version}); nothing to update.',
|
|
1977
|
+
'update.updateFailed': 'Update failed: {detail}',
|
|
1978
|
+
'update.noRestartHint': 'Update installed. Restart later (botmux restart) to apply the new version.',
|
|
1979
|
+
'update.confirmPlainRestart': 'Restart botmux? Sessions cold-resume; the dashboard briefly disconnects and reconnects.',
|
|
1980
|
+
'update.restarting': 'Restarting botmux, waiting to reconnect…',
|
|
1981
|
+
'update.restartSlow': 'Restart is taking a while; please refresh the page manually.',
|
|
1982
|
+
'update.restartFailed': 'Restart failed: {detail}',
|
|
1301
1983
|
'skills.title': 'Skill Management',
|
|
1302
1984
|
'skills.subtitle': 'Manage CLI-neutral botmux Skill assets and choose priority disclosure per bot.',
|
|
1303
1985
|
'skills.installed': 'Installed Skills',
|
|
@@ -1316,6 +1998,26 @@ const en = {
|
|
|
1316
1998
|
'skills.sourceHelpRemote': 'Paste a Skill directory page or repository URL; repository URLs need a repo path.',
|
|
1317
1999
|
'skills.sourceHelpLocalLabel': 'Local CLI Skill directory: ',
|
|
1318
2000
|
'skills.sourceHelpLocal': 'Referenced in place without copying into the botmux store.',
|
|
2001
|
+
'skills.discover': 'Discover Skills',
|
|
2002
|
+
'skills.discoverTitle': 'Discover Local CLI Skills',
|
|
2003
|
+
'skills.discoverHelp': 'Scan CLI Skill directories used by bots configured in this deployment. Selected Skills are registered as local links without copying files.',
|
|
2004
|
+
'skills.discoverEmpty': 'No registerable Skills were found in local CLI skill directories.',
|
|
2005
|
+
'skills.discoverGroupEmpty': 'No registerable Skills were found in this CLI directory.',
|
|
2006
|
+
'skills.discoverRegistered': 'Registered',
|
|
2007
|
+
'skills.discoverSelectAll': 'Select unregistered',
|
|
2008
|
+
'skills.discoverClearSelection': 'Clear selection',
|
|
2009
|
+
'skills.discoverRegister': 'Register selected',
|
|
2010
|
+
'skills.discoverClose': 'Close',
|
|
2011
|
+
'skills.discoverNothingSelected': 'Select at least one unregistered Skill.',
|
|
2012
|
+
'skills.discoverRegisteringBatch': 'Registering {total} Skills',
|
|
2013
|
+
'skills.sourceCodex': 'Local Codex',
|
|
2014
|
+
'skills.sourceClaude': 'Local Claude',
|
|
2015
|
+
'skills.sourceTrae': 'Local Trae',
|
|
2016
|
+
'skills.sourceCursor': 'Local Cursor',
|
|
2017
|
+
'skills.sourceGemini': 'Local Gemini',
|
|
2018
|
+
'skills.sourceOpenCode': 'Local OpenCode',
|
|
2019
|
+
'skills.sourceLocalLink': 'Local link',
|
|
2020
|
+
'skills.sourceBotmuxCopy': 'botmux store',
|
|
1319
2021
|
'skills.path': 'Repo Path (optional)',
|
|
1320
2022
|
'skills.pathPlaceholder': 'Blank uses the path from the GitHub URL',
|
|
1321
2023
|
'skills.ref': 'Ref (optional)',
|
|
@@ -1328,6 +2030,7 @@ const en = {
|
|
|
1328
2030
|
'skills.prevPage': 'Previous page',
|
|
1329
2031
|
'skills.nextPage': 'Next page',
|
|
1330
2032
|
'skills.empty': 'No installed skills yet. Install from a local directory, Git, or GitHub.',
|
|
2033
|
+
'skills.apiUnavailable': 'This Dashboard backend does not expose the Skill API. Usually the frontend was updated before the botmux process restarted. Restart botmux, then refresh this page.',
|
|
1331
2034
|
'skills.globalDefaults': 'Global Skill Delivery',
|
|
1332
2035
|
'skills.globalProject': 'Workspace Skills',
|
|
1333
2036
|
'skills.globalProjectOff': 'Ignore workspace Skills',
|
|
@@ -1411,6 +2114,12 @@ const en = {
|
|
|
1411
2114
|
'botDefaults.roleSaved': 'Saved',
|
|
1412
2115
|
'botDefaults.roleDeleted': 'Deleted',
|
|
1413
2116
|
'botDefaults.roleLoadErr': 'Failed to load role',
|
|
2117
|
+
'botDefaults.profileRoles': 'Profile Roles',
|
|
2118
|
+
'botDefaults.profileRolesHelp': 'Role entries this bot has in Profiles. Collapsed by default; expand a profile to load details.',
|
|
2119
|
+
'botDefaults.profileRolesEmpty': 'This bot has no profile roles.',
|
|
2120
|
+
'botDefaults.profileRolesLoadFailed': 'Failed to load profile roles: {error}',
|
|
2121
|
+
'botDefaults.profileRoleClickToLoad': 'Expand to load role details.',
|
|
2122
|
+
'botDefaults.profileRoleDetailLoadFailed': 'Failed to load role detail: {error}',
|
|
1414
2123
|
'botDefaults.sectionAutoStart': 'Proactive Start',
|
|
1415
2124
|
'botDefaults.autoStartJoin': 'Auto-start when added to a new chat',
|
|
1416
2125
|
'botDefaults.autoStartJoinHelp': 'When enabled, the bot auto-starts a session and gets to work the moment it is added to a new chat (when an authorized user / allowedUsers is a member), no @ needed. It launches in the bot default working dir; if none is configured it shows a repo-select card first. Prerequisite: subscribe the "bot joined chat" event im.chat.member.bot.added_v1 for this app and grant the member-read scope in the Feishu console.',
|
|
@@ -1462,9 +2171,17 @@ const en = {
|
|
|
1462
2171
|
'botDefaults.startupCommandsHelp': 'Commands auto-sent to the CLI in order after launch, before the first message (each its own Enter), e.g. /effort ultracode. Comma- or newline-separated, one per line, arguments allowed; empty = none. Takes effect from the next session, and replays on every new session (incl. resume) — so session-only settings like /effort ultracode survive a resume. Native CLI sessions only; adopted sessions are not driven.',
|
|
1463
2172
|
'botDefaults.startupCommandsPlaceholder': 'One per line, e.g. /effort ultracode',
|
|
1464
2173
|
'botDefaults.startupCommandsSave': 'Save startup commands',
|
|
1465
|
-
'
|
|
2174
|
+
'botDefaults.sectionEnv': 'Environment variables',
|
|
2175
|
+
'botDefaults.envHelp': 'Environment variables injected into THIS bot\'s CLI process (a JSON object). Typical use: run a bot on GLM / a third-party Anthropic·OpenAI-compatible provider — set ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN (GLM: https://api.z.ai/api/anthropic, or https://open.bigmodel.cn/api/anthropic in China), or set HTTPS_PROXY / a CLI feature flag. Values accept string/number/boolean only; botmux-reserved keys (BOTMUX_, LARK_APP_, …) are ignored. Takes effect from the next session, injected per-session into the CLI process (never into the shared tmux server env, so it can\'t leak across bots). Empty = clear. Note: values live in bots.json in plaintext — not a secret vault.',
|
|
2176
|
+
'botDefaults.envPlaceholder': '{\n "ANTHROPIC_BASE_URL": "https://api.z.ai/api/anthropic",\n "ANTHROPIC_AUTH_TOKEN": "your GLM Coding Plan key"\n}',
|
|
2177
|
+
'botDefaults.envSave': 'Save environment variables',
|
|
2178
|
+
'nav.roles': 'Role Management',
|
|
2179
|
+
'nav.groupRoles': 'Group Roles',
|
|
2180
|
+
'nav.roleProfiles': 'Profiles',
|
|
1466
2181
|
'roles.title': 'Role Management',
|
|
1467
|
-
'roles.subtitle': '
|
|
2182
|
+
'roles.subtitle': 'Manage per-group bot roles and reusable Profiles.',
|
|
2183
|
+
'roleProfiles.title': 'Profiles',
|
|
2184
|
+
'roleProfiles.subtitle': 'Maintain reusable multi-bot Profiles, then preview or apply them to target groups.',
|
|
1468
2185
|
'roles.search': 'Search group / bot / ID',
|
|
1469
2186
|
'roles.refresh': 'Refresh',
|
|
1470
2187
|
'roles.selectHint': '← Expand a group and select a bot to edit its role',
|
|
@@ -1481,6 +2198,31 @@ const en = {
|
|
|
1481
2198
|
'roles.botsWithRoles': 'bots configured',
|
|
1482
2199
|
'roles.emptyError': 'Role content cannot be empty',
|
|
1483
2200
|
'roles.saveFailed': 'Save failed, please retry',
|
|
2201
|
+
'roles.tabGroups': 'By Group',
|
|
2202
|
+
'roles.tabProfiles': 'Profiles',
|
|
2203
|
+
'roles.profileIdPlaceholder': 'profile id, e.g. collab-main',
|
|
2204
|
+
'roles.profileIdInvalid': 'Profile id may contain letters, numbers, dots, underscores, and hyphens only; max 64; cannot be . or ..',
|
|
2205
|
+
'roles.openProfile': 'Open',
|
|
2206
|
+
'roles.profileSearch': 'Search profile',
|
|
2207
|
+
'roles.profileSelectHint': '← Select or enter a profile to edit',
|
|
2208
|
+
'roles.profileEmpty': 'No Profiles',
|
|
2209
|
+
'roles.profileEntries': 'entries',
|
|
2210
|
+
'roles.profileMissing': 'Missing',
|
|
2211
|
+
'roles.profileRuntimeHint': 'Profiles are reusable suites; applying one writes a group role, not a new runtime layer.',
|
|
2212
|
+
'roles.profileBots': 'Bot Entries',
|
|
2213
|
+
'roles.profileEditorPlaceholder': 'Enter this bot\'s Markdown role for this profile...',
|
|
2214
|
+
'roles.saveEntry': 'Save Entry',
|
|
2215
|
+
'roles.profileBotSelectHint': 'Select a bot to edit its entry in this profile',
|
|
2216
|
+
'roles.applyToGroup': 'Apply To Group',
|
|
2217
|
+
'roles.applyForce': 'Overwrite existing group roles',
|
|
2218
|
+
'roles.previewApply': 'Preview Apply',
|
|
2219
|
+
'roles.applyProfile': 'Apply Profile',
|
|
2220
|
+
'roles.applyPickBots': 'Select at least one bot',
|
|
2221
|
+
'roles.applyWouldRefuse': 'Would refuse (group role exists)',
|
|
2222
|
+
'roles.applyPreviewOk': 'Can apply',
|
|
2223
|
+
'roles.applyOk': 'Applied',
|
|
2224
|
+
'roles.applyFailed': 'Failed',
|
|
2225
|
+
'roles.confirmDeleteProfileEntry': 'Delete this bot entry from the profile?',
|
|
1484
2226
|
'common.none': 'None',
|
|
1485
2227
|
'common.loading': 'Loading…',
|
|
1486
2228
|
'common.unknown': 'Unknown',
|