botmux 2.85.1 → 2.86.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/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +209 -1
- 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 +240 -2
- package/dist/core/dashboard-ipc-server.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/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/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +15 -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 +116 -0
- 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 +617 -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/app.js +1243 -831
- package/dist/dashboard-web/index.html +2 -1
- package/dist/dashboard-web/style.css +1085 -3
- package/dist/dashboard.js +215 -3
- package/dist/dashboard.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/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/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/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/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': '取消',
|
|
@@ -579,6 +851,12 @@ const zh = {
|
|
|
579
851
|
'botDefaults.roleSaved': '已保存',
|
|
580
852
|
'botDefaults.roleDeleted': '已删除',
|
|
581
853
|
'botDefaults.roleLoadErr': '角色加载失败',
|
|
854
|
+
'botDefaults.profileRoles': 'Profile 角色',
|
|
855
|
+
'botDefaults.profileRolesHelp': '该 bot 在各个 Profile 中的角色条目;默认折叠,展开后读取详情。',
|
|
856
|
+
'botDefaults.profileRolesEmpty': '这个 bot 暂无 Profile 角色。',
|
|
857
|
+
'botDefaults.profileRolesLoadFailed': 'Profile 角色加载失败:{error}',
|
|
858
|
+
'botDefaults.profileRoleClickToLoad': '展开后加载角色详情。',
|
|
859
|
+
'botDefaults.profileRoleDetailLoadFailed': '角色详情加载失败:{error}',
|
|
582
860
|
'botDefaults.sectionAutoStart': '主动开工',
|
|
583
861
|
'botDefaults.autoStartJoin': '被拉进新群自动开工',
|
|
584
862
|
'botDefaults.autoStartJoinHelp': '开启后,机器人一被拉进新群(群里有授权用户 allowedUsers 时)就自动开一个会话开始工作,无需 @。在机器人的默认工作目录启动;未配置默认目录时先弹仓库选择卡让你选。前提:需在飞书开放平台为本应用订阅「机器人进群」事件 im.chat.member.bot.added_v1,并开通群成员读取权限。',
|
|
@@ -631,8 +909,12 @@ const zh = {
|
|
|
631
909
|
'botDefaults.startupCommandsPlaceholder': '每行一条,如 /effort ultracode',
|
|
632
910
|
'botDefaults.startupCommandsSave': '保存启动命令',
|
|
633
911
|
'nav.roles': '角色管理',
|
|
912
|
+
'nav.groupRoles': '群角色',
|
|
913
|
+
'nav.roleProfiles': 'Profiles',
|
|
634
914
|
'roles.title': '角色管理',
|
|
635
|
-
'roles.subtitle': '
|
|
915
|
+
'roles.subtitle': '管理每个群的 Bot 角色,并维护可复用的 Profiles。',
|
|
916
|
+
'roleProfiles.title': 'Profiles',
|
|
917
|
+
'roleProfiles.subtitle': '维护可复用的多 Bot Profiles,并快速预览或应用到目标群。',
|
|
636
918
|
'roles.search': '搜索群名/Bot/ID',
|
|
637
919
|
'roles.refresh': '刷新',
|
|
638
920
|
'roles.selectHint': '← 展开群组,选择一个 Bot 来编辑角色',
|
|
@@ -649,6 +931,31 @@ const zh = {
|
|
|
649
931
|
'roles.botsWithRoles': '个 Bot 已配置角色',
|
|
650
932
|
'roles.emptyError': '角色内容不能为空,请先输入内容',
|
|
651
933
|
'roles.saveFailed': '保存失败,请重试',
|
|
934
|
+
'roles.tabGroups': '按群组',
|
|
935
|
+
'roles.tabProfiles': 'Profiles',
|
|
936
|
+
'roles.profileIdPlaceholder': 'profile id,如 collab-main',
|
|
937
|
+
'roles.profileIdInvalid': 'Profile id 只能包含字母、数字、点、下划线、短横线,最长 64,且不能是 . 或 ..',
|
|
938
|
+
'roles.openProfile': '打开',
|
|
939
|
+
'roles.profileSearch': '搜索 profile',
|
|
940
|
+
'roles.profileSelectHint': '← 选择或输入一个 profile 来编辑',
|
|
941
|
+
'roles.profileEmpty': '暂无 Profiles',
|
|
942
|
+
'roles.profileEntries': '个 entry',
|
|
943
|
+
'roles.profileMissing': '缺失',
|
|
944
|
+
'roles.profileRuntimeHint': 'Profile 只是可复用套装;Apply 后写成本群 Role,不增加运行时层级。',
|
|
945
|
+
'roles.profileBots': 'Bot Entries',
|
|
946
|
+
'roles.profileEditorPlaceholder': '输入当前 bot 在该 profile 下的 Markdown role...',
|
|
947
|
+
'roles.saveEntry': '保存 Entry',
|
|
948
|
+
'roles.profileBotSelectHint': '选择一个 Bot 来编辑它在该 profile 里的 entry',
|
|
949
|
+
'roles.applyToGroup': 'Apply 到群组',
|
|
950
|
+
'roles.applyForce': '覆盖已有本群 Role',
|
|
951
|
+
'roles.previewApply': '预览 Apply',
|
|
952
|
+
'roles.applyProfile': 'Apply Profile',
|
|
953
|
+
'roles.applyPickBots': '请选择至少一个 Bot',
|
|
954
|
+
'roles.applyWouldRefuse': '会拒绝(已有本群 Role)',
|
|
955
|
+
'roles.applyPreviewOk': '可应用',
|
|
956
|
+
'roles.applyOk': '已应用',
|
|
957
|
+
'roles.applyFailed': '失败',
|
|
958
|
+
'roles.confirmDeleteProfileEntry': '确认删除该 Bot 在此 profile 里的 entry?',
|
|
652
959
|
'common.none': '无',
|
|
653
960
|
'common.loading': '加载中…',
|
|
654
961
|
'common.unknown': '未知',
|
|
@@ -986,6 +1293,237 @@ const en = {
|
|
|
986
1293
|
'sessions.landApplied': 'Landed',
|
|
987
1294
|
'sessions.landFailed': 'Land failed',
|
|
988
1295
|
'sessions.landDiscarded': 'Discarded (sandbox clone not applied).',
|
|
1296
|
+
'sessions.insight': 'Insight',
|
|
1297
|
+
'sessions.insightLoading': 'Analyzing…',
|
|
1298
|
+
'sessions.insightUnavailable': 'Insight unavailable',
|
|
1299
|
+
'sessions.insightEmpty': 'No analyzable tool spans in this session yet.',
|
|
1300
|
+
'sessions.insightMetrics': 'spans {total} · failed {failed} · slow {slow} · read/write {rw} · compactions {compactions}',
|
|
1301
|
+
'sessions.insightSuggestions': 'Suggestions',
|
|
1302
|
+
'sessions.insightSpans': 'Action spans',
|
|
1303
|
+
'sessions.insightCapped': 'showing first {shown}/{total}',
|
|
1304
|
+
'sessions.insightAsOf': 'as of {asOf}',
|
|
1305
|
+
'sessions.insightPartial': '(may exclude the in-flight latest turn)',
|
|
1306
|
+
'nav.insights': 'Insight',
|
|
1307
|
+
'insights.title': 'Workflow Insight',
|
|
1308
|
+
'insights.subtitle': 'Read-only analysis of local Claude Code / Codex sessions — action trace, failures, friction, with rule-based optimization tips.',
|
|
1309
|
+
'insights.refresh': 'Refresh',
|
|
1310
|
+
'insights.search': 'Search session / bot / dir…',
|
|
1311
|
+
'insights.filter': 'Filter',
|
|
1312
|
+
'insights.filterAll': 'All',
|
|
1313
|
+
'insights.filterReview': 'Worth review',
|
|
1314
|
+
'insights.filterFailed': 'Has failures',
|
|
1315
|
+
'insights.filterSlow': 'Has slow spans',
|
|
1316
|
+
'insights.loading': 'Analyzing…',
|
|
1317
|
+
'insights.loaded': 'Analyzed {count} sessions',
|
|
1318
|
+
'insights.unavailable': 'Load failed',
|
|
1319
|
+
'insights.listCount': 'showing {shown}/{total}',
|
|
1320
|
+
'insights.sessions': 'Sessions',
|
|
1321
|
+
'insights.empty': 'No matching sessions.',
|
|
1322
|
+
'insights.selectSession': 'Pick a session on the left to see action spans and suggestions.',
|
|
1323
|
+
'insights.detailLoading': 'Loading session detail…',
|
|
1324
|
+
'insights.recommendations': 'Suggestions',
|
|
1325
|
+
'insights.recommendationsHint': 'Rule-based cross-session rollup, each traceable to a metric.',
|
|
1326
|
+
'insights.noRecommendations': 'No suggestions.',
|
|
1327
|
+
'insights.seenInSessions': 'seen in {count} sessions',
|
|
1328
|
+
'insights.toolFailures': 'Top tool failures',
|
|
1329
|
+
'insights.toolFailuresHint': 'Failed spans grouped by tool.',
|
|
1330
|
+
'insights.noFailures': 'No failed spans.',
|
|
1331
|
+
'insights.metricSessions': 'Sessions',
|
|
1332
|
+
'insights.metricAnalyzed': '{count} analyzed',
|
|
1333
|
+
'insights.metricSpans': 'Spans',
|
|
1334
|
+
'insights.metricSafe': 'redacted',
|
|
1335
|
+
'insights.metricFailed': 'Failed spans',
|
|
1336
|
+
'insights.metricSlow': 'Slow spans',
|
|
1337
|
+
'insights.metricRw': 'Read/write',
|
|
1338
|
+
'insights.metricCompactions': 'compactions {count}',
|
|
1339
|
+
'insights.spansShort': 'span ',
|
|
1340
|
+
'insights.failedShort': 'fail ',
|
|
1341
|
+
'insights.slowShort': 'slow ',
|
|
1342
|
+
'insights.rwShort': 'r/w ',
|
|
1343
|
+
'insights.unsupported': 'CLI not supported',
|
|
1344
|
+
'insights.noTranscript': 'No transcript',
|
|
1345
|
+
'insights.parseError': 'Parse failed',
|
|
1346
|
+
'insights.noSpans': 'No analyzable spans.',
|
|
1347
|
+
'insights.sevBad': 'Critical',
|
|
1348
|
+
'insights.sevWarn': 'Warn',
|
|
1349
|
+
'insights.sevInfo': 'Info',
|
|
1350
|
+
'insights.phase.research': 'Research',
|
|
1351
|
+
'insights.phase.edit': 'Edit',
|
|
1352
|
+
'insights.phase.run': 'Run',
|
|
1353
|
+
'insights.phase.delegate': 'Delegate',
|
|
1354
|
+
'insights.phase.discuss': 'Discuss',
|
|
1355
|
+
'insights.trace': 'Action spans',
|
|
1356
|
+
'insights.ledger': 'Per-turn ledger',
|
|
1357
|
+
'insights.detailTabs': 'Detail views',
|
|
1358
|
+
'insights.spanStatus': 'Status',
|
|
1359
|
+
'insights.spanTool': 'Tool',
|
|
1360
|
+
'insights.spanPhase': 'Phase',
|
|
1361
|
+
'insights.spanDuration': 'Duration',
|
|
1362
|
+
'insights.spanTurn': 'Turn',
|
|
1363
|
+
'insights.spanSummary': 'Summary',
|
|
1364
|
+
'insights.ledgerMore': 'Show {count} more summaries',
|
|
1365
|
+
'insights.ledgerOmitted': '{count} more hidden',
|
|
1366
|
+
'insights.ledgerNoContent': 'No redacted summary for this turn.',
|
|
1367
|
+
'insights.diagShow': 'Show evidence',
|
|
1368
|
+
'insights.diagActive': 'Viewing',
|
|
1369
|
+
'insights.evMatched': '{count} matching spans',
|
|
1370
|
+
'insights.evMatchedCapped': '{matched} matched · showing {shown}',
|
|
1371
|
+
'insights.evDefault': '{shown} of {total} spans (focused)',
|
|
1372
|
+
'insights.evShowAll': 'Show all {count}',
|
|
1373
|
+
'insights.evBackToEvidence': 'Focused view',
|
|
1374
|
+
'insights.intent.run_script': 'Run script',
|
|
1375
|
+
'insights.intent.test': 'Test',
|
|
1376
|
+
'insights.intent.typecheck': 'Typecheck',
|
|
1377
|
+
'insights.intent.lint': 'Lint',
|
|
1378
|
+
'insights.intent.git': 'Git',
|
|
1379
|
+
'insights.intent.search': 'Search',
|
|
1380
|
+
'insights.intent.read_file': 'Read',
|
|
1381
|
+
'insights.intent.edit_file': 'Edit',
|
|
1382
|
+
'insights.intent.write_file': 'Write',
|
|
1383
|
+
'insights.intent.delegate': 'Delegate',
|
|
1384
|
+
'insights.intent.unknown': 'Action',
|
|
1385
|
+
'insights.result.ok': 'OK',
|
|
1386
|
+
'insights.result.tool_error': 'Tool error',
|
|
1387
|
+
'insights.result.test_failed': 'Test failed',
|
|
1388
|
+
'insights.result.typecheck_failed': 'Typecheck failed',
|
|
1389
|
+
'insights.result.lint_failed': 'Lint failed',
|
|
1390
|
+
'insights.result.command_failed': 'Command failed',
|
|
1391
|
+
'insights.result.timeout': 'Timeout',
|
|
1392
|
+
'insights.result.no_output': 'No output',
|
|
1393
|
+
'insights.result.unknown': 'Unknown',
|
|
1394
|
+
'insights.tag.failure': 'Failures',
|
|
1395
|
+
'insights.tag.slow': 'Slow',
|
|
1396
|
+
'insights.tag.retry': 'Retries',
|
|
1397
|
+
'insights.tag.read_write_imbalance': 'Read/write imbalance',
|
|
1398
|
+
'insights.tag.diagnostic': 'Diagnostic',
|
|
1399
|
+
'insights.tag.normal': 'Normal',
|
|
1400
|
+
'insights.turnHeadline.turn_has_failures': '{failures} failures this turn',
|
|
1401
|
+
'insights.turnHeadline.turn_has_slow_spans': 'Slow operations this turn',
|
|
1402
|
+
'insights.turnHeadline.turn_has_retries': 'Retried the same action repeatedly',
|
|
1403
|
+
'insights.turnHeadline.turn_read_write_imbalance': 'Edit-heavy turn (edits {edits} / reads {reads})',
|
|
1404
|
+
'insights.evTimeline': 'Full timeline ({count} spans)',
|
|
1405
|
+
'insights.evNoFlags': 'No spans flagged as failure / slow / retry',
|
|
1406
|
+
'insights.turnAllNormal': 'All {count} turns look normal — nothing to review',
|
|
1407
|
+
'insights.turnEvidence': 'View {count} evidence spans',
|
|
1408
|
+
'insights.turnHiddenNormal': '{count} normal turns hidden',
|
|
1409
|
+
'insights.mReads': 'Read',
|
|
1410
|
+
'insights.mEdits': 'Edit',
|
|
1411
|
+
'insights.mRuns': 'Run',
|
|
1412
|
+
'insights.mFailures': 'Fail',
|
|
1413
|
+
'insights.mDur': 'Time',
|
|
1414
|
+
'insights.turnHeadline.turn_normal': 'Normal',
|
|
1415
|
+
'insights.rec.fix_repeated_tool_failures': 'Repeated command failures need to converge',
|
|
1416
|
+
'insights.rec.split_slow_operation': 'Slow operations dragged the whole session',
|
|
1417
|
+
'insights.rec.add_read_pass_before_edit': 'Too little reading before editing',
|
|
1418
|
+
'insights.rec.preserve_context_checkpoints': 'Context was compacted — keep checkpoints',
|
|
1419
|
+
'insights.impact.impact_failed_spans': '{failedSpans} actions failed (top: {topTool} ×{topToolFailures})',
|
|
1420
|
+
'insights.impact.impact_slow_spans': '{slowSpansTotal} slow operations slowed progress',
|
|
1421
|
+
'insights.impact.impact_low_read_write_ratio': 'Edited {writeSpans}, read only {readSpans}',
|
|
1422
|
+
'insights.impact.impact_context_compaction': '{compactions} context compactions this session',
|
|
1423
|
+
'insights.why.why_tool_failure_concentrated': 'Failures concentrate on {topTool} ({topToolFailures}×) — likely one root cause',
|
|
1424
|
+
'insights.why.why_slow_span_dominates': 'A few long operations dominate; slowest is {slowestTool}',
|
|
1425
|
+
'insights.why.why_edits_outpaced_reads': 'Read/write ratio {readWriteRatio}; editing more than reading invites rework',
|
|
1426
|
+
'insights.why.why_context_compaction_happened': 'Long session was compacted; early decisions/context may be lost',
|
|
1427
|
+
'insights.action.inspect_failed_span_details': 'Open each failed action’s detail to find the root cause',
|
|
1428
|
+
'insights.action.add_preflight_or_timeout': 'Add preflight checks or timeouts to frequently failing commands',
|
|
1429
|
+
'insights.action.narrow_or_split_slow_operation': 'Narrow or split slow operations (e.g. run targeted tests)',
|
|
1430
|
+
'insights.action.surface_timeout_or_progress': 'Surface timeouts/progress earlier instead of silently hanging',
|
|
1431
|
+
'insights.action.read_or_search_before_editing': 'Read or search an unfamiliar file before editing it',
|
|
1432
|
+
'insights.action.verify_assumptions_before_running': 'Verify assumptions before acting to avoid blind edits',
|
|
1433
|
+
'insights.action.write_checkpoints_for_long_tasks': 'Write decisions and checkpoints to notes for long tasks',
|
|
1434
|
+
'insights.struct.shell': 'shell command',
|
|
1435
|
+
'insights.struct.fileEdit': 'file edit',
|
|
1436
|
+
'insights.struct.readSearch': 'read/search',
|
|
1437
|
+
'insights.struct.agentTask': 'agent task',
|
|
1438
|
+
'insights.struct.toolInput': 'tool input',
|
|
1439
|
+
'insights.struct.toolResult': 'tool result',
|
|
1440
|
+
'insights.struct.toolError': 'tool error',
|
|
1441
|
+
'insights.struct.patchFailed': 'patch failed',
|
|
1442
|
+
'insights.struct.patchApplied': 'patch applied',
|
|
1443
|
+
'insights.struct.exit': 'exit {code}',
|
|
1444
|
+
'insights.spanAll': 'All',
|
|
1445
|
+
'insights.dDetail': 'Detail',
|
|
1446
|
+
'insights.dCollapse': 'Hide',
|
|
1447
|
+
'insights.dPhase': 'Phase',
|
|
1448
|
+
'insights.dStart': 'Start',
|
|
1449
|
+
'insights.dDur': 'Duration',
|
|
1450
|
+
'insights.dIntent': 'Intent',
|
|
1451
|
+
'insights.dResult': 'Result',
|
|
1452
|
+
'insights.dIn': 'Input',
|
|
1453
|
+
'insights.dOut': 'Output',
|
|
1454
|
+
'insights.dTags': 'Tags',
|
|
1455
|
+
'insights.dTurnContext': 'Turn {turn} context',
|
|
1456
|
+
'insights.advice.failure': '💡 Read the error before retrying — don’t retry blindly',
|
|
1457
|
+
'insights.advice.retry': '💡 Same step retried repeatedly — find the root cause first',
|
|
1458
|
+
'insights.advice.read_write_imbalance': '💡 Read the relevant files before editing to avoid rework',
|
|
1459
|
+
'insights.advice.slow': '💡 Slow op: run targeted tests or split it up',
|
|
1460
|
+
'insights.turnPrompt': 'User',
|
|
1461
|
+
'insights.turnExpand': 'Expand {count} steps',
|
|
1462
|
+
'insights.turnCollapse': 'Collapse',
|
|
1463
|
+
'insights.turnRail': 'Session trace',
|
|
1464
|
+
'insights.gantt': 'Work timeline',
|
|
1465
|
+
'insights.ganttCaption': '{span} actions · {dur} elapsed · {active} active',
|
|
1466
|
+
'insights.ctxCurve': 'Context curve',
|
|
1467
|
+
'insights.ctxCaption': 'Per-turn in+cache peak · max {peak} · {turns} turns',
|
|
1468
|
+
'insights.ctxTurn': 'Turn {n}',
|
|
1469
|
+
'insights.railSubagent': 'Subagent',
|
|
1470
|
+
'insights.railSubagents': '{n} subagents',
|
|
1471
|
+
'insights.turnPromptExpand': 'Expand',
|
|
1472
|
+
'insights.turnPromptCollapse': 'Collapse',
|
|
1473
|
+
'insights.turnPromptRaw': 'Raw',
|
|
1474
|
+
'insights.turnPromptRendered': 'Rendered',
|
|
1475
|
+
'insights.srcMentions': 'mentions',
|
|
1476
|
+
'insights.senderHuman': 'User',
|
|
1477
|
+
'insights.senderA2A': 'A2A',
|
|
1478
|
+
'insights.senderOther': 'Other',
|
|
1479
|
+
'insights.senderSystem': 'System',
|
|
1480
|
+
'insights.turnPromptFull': 'Full text',
|
|
1481
|
+
'insights.modalClose': 'Close',
|
|
1482
|
+
'insights.promptTruncated': 'Long content, truncated',
|
|
1483
|
+
'insights.replay': 'Replay',
|
|
1484
|
+
'insights.replayAgent': 'agent ops',
|
|
1485
|
+
'insights.replaySearch': 'Search conversation…',
|
|
1486
|
+
'insights.replayBy': 'From',
|
|
1487
|
+
'insights.replayState': 'State',
|
|
1488
|
+
'insights.replayLoadMore': 'Load more ({shown}/{total})',
|
|
1489
|
+
'insights.replayAllLoaded': 'All loaded ({total})',
|
|
1490
|
+
'insights.replayEmpty': 'No matching messages',
|
|
1491
|
+
'insights.replayNoText': '(no text — see ops)',
|
|
1492
|
+
'insights.replayOps': '{count} ops',
|
|
1493
|
+
'insights.wsFiles': 'File changes · {n}',
|
|
1494
|
+
'insights.wsCmds': 'Commands · {n}',
|
|
1495
|
+
'insights.wsReads': 'read {n}',
|
|
1496
|
+
'insights.wsEdits': 'edit {n}',
|
|
1497
|
+
'insights.wsFail': '{n} failed',
|
|
1498
|
+
'insights.wsNoFiles': 'No file changes',
|
|
1499
|
+
'insights.wsNoCmds': 'No commands',
|
|
1500
|
+
'insights.turnSummary': '{total} turns · {flagged} need attention',
|
|
1501
|
+
'insights.dCommand': 'Command',
|
|
1502
|
+
'insights.dCmdOutput': 'Output',
|
|
1503
|
+
'insights.ledgerNormal': 'By order',
|
|
1504
|
+
'insights.ledgerGrouped': 'By recommendation',
|
|
1505
|
+
'insights.ledgerOther': 'Other turns',
|
|
1506
|
+
'insights.ledgerGroupCount': '{count} turns',
|
|
1507
|
+
'insights.turnsCapped': 'Only first {shown}/{total} actions — timeline may be incomplete',
|
|
1508
|
+
'insights.suggestion.high_tool_failure.title': 'Tool failures are concentrated',
|
|
1509
|
+
'insights.suggestion.high_tool_failure.action': 'Check failed spans first, then add preflight checks or timeout control for repeated failing commands.',
|
|
1510
|
+
'insights.suggestion.tool_failure_present.title': 'Some tool calls failed',
|
|
1511
|
+
'insights.suggestion.tool_failure_present.action': 'Review failed spans before repeating the workflow.',
|
|
1512
|
+
'insights.suggestion.slow_span.title': 'A slow span dominates the session',
|
|
1513
|
+
'insights.suggestion.slow_span.action': 'Split or bound the slow operation, and surface timeout or progress feedback earlier.',
|
|
1514
|
+
'insights.suggestion.low_read_write_ratio.title': 'Edits outpaced reads',
|
|
1515
|
+
'insights.suggestion.low_read_write_ratio.action': 'Add a read/search pass before edits when changing unfamiliar files.',
|
|
1516
|
+
'insights.suggestion.context_compaction.title': 'Context compaction happened',
|
|
1517
|
+
'insights.suggestion.context_compaction.action': 'For long tasks, preserve decisions and checkpoints in durable notes or smaller subtasks.',
|
|
1518
|
+
'insights.suggestion.no_major_friction.title': 'No major trace friction detected',
|
|
1519
|
+
'insights.suggestion.no_major_friction.action': 'Use the span timeline for spot checks or compare against slower sessions.',
|
|
1520
|
+
'insights.evidence.failedSpans': '{count} failed spans',
|
|
1521
|
+
'insights.evidence.toolFailedTimes': '{tool} failed {count} times',
|
|
1522
|
+
'insights.evidence.multipleToolsFailed': 'multiple tools failed',
|
|
1523
|
+
'insights.evidence.toolRanSeconds': '{tool} ran for {seconds}s',
|
|
1524
|
+
'insights.evidence.readWriteRatio': 'read/write ratio {ratio}',
|
|
1525
|
+
'insights.evidence.compactions': 'compactions {count}',
|
|
1526
|
+
'insights.evidence.spansAnalyzed': '{count} spans analyzed',
|
|
989
1527
|
'connectors.lede': 'Let external systems (alerts, CI, tickets…) trigger a bot to speak in a group or run a workflow via one webhook.',
|
|
990
1528
|
'connectors.createTitle': 'New Webhook',
|
|
991
1529
|
'connectors.fName': 'Name',
|
|
@@ -1225,14 +1763,55 @@ const en = {
|
|
|
1225
1763
|
'groups.chat': 'Chat',
|
|
1226
1764
|
'groups.actions': 'Actions',
|
|
1227
1765
|
'groups.addBots': 'Add Bots',
|
|
1766
|
+
'groups.saveAsProfile': 'Save as Profile',
|
|
1228
1767
|
'groups.manage': 'Manage',
|
|
1229
1768
|
'groups.empty': 'No chats match the filters.',
|
|
1769
|
+
'groups.profileStatusFull': 'Fully matches {name} ({matched}/{total})',
|
|
1770
|
+
'groups.profileStatusFullChat': 'Group roles fully match {name} ({matched}/{total})',
|
|
1771
|
+
'groups.profileStatusPartial': 'Partially matches {name} ({matched}/{total})',
|
|
1772
|
+
'groups.profileStatusUnmatched': 'No profile match',
|
|
1773
|
+
'groups.saveProfileTitle': 'Save as Profile',
|
|
1774
|
+
'groups.saveProfileIntro': 'Save {count} in-chat bot configs from "{name}" as a profile snapshot.',
|
|
1775
|
+
'groups.saveProfileScope': 'Save scope',
|
|
1776
|
+
'groups.saveProfileScopeHelp': 'In-chat bot config snapshot',
|
|
1777
|
+
'groups.saveProfileBotCount': 'Bots in chat',
|
|
1778
|
+
'groups.saveProfileLoadFailed': 'Load failed',
|
|
1779
|
+
'groups.saveProfileStatus.entry': 'Create entry',
|
|
1780
|
+
'groups.saveProfileStatus.error': 'Load failed',
|
|
1781
|
+
'groups.saveProfileMode': 'Save mode',
|
|
1782
|
+
'groups.saveProfileNew': 'New Profile',
|
|
1783
|
+
'groups.saveProfileNewHelp': 'Create a new snapshot by default; if the id exists, matching bot entries are overwritten.',
|
|
1784
|
+
'groups.saveProfileOverwrite': 'Overwrite Existing Profile',
|
|
1785
|
+
'groups.saveProfileOverwriteHelp': 'Pick an existing profile and overwrite entries for the same bots.',
|
|
1786
|
+
'groups.saveProfileExistingMeta': '{count} entries',
|
|
1787
|
+
'groups.saveProfileIdLabel': 'Profile id',
|
|
1788
|
+
'groups.saveProfileExistingLabel': 'Existing Profile',
|
|
1789
|
+
'groups.saveProfileExistingEmpty': 'No existing profiles',
|
|
1790
|
+
'groups.saveProfileTarget': 'Target Profile',
|
|
1791
|
+
'groups.saveProfileTargetNew': 'Will create or update this profile with the in-chat bot snapshot',
|
|
1792
|
+
'groups.saveProfileTargetOverwrite': 'Will overwrite entries for these bots in the existing profile',
|
|
1793
|
+
'groups.saveProfileEntrySummary': 'Will create profile entries for {count} in-chat bots.',
|
|
1794
|
+
'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.',
|
|
1795
|
+
'groups.saveProfileFailedLoadSummary': '{count} bot configs failed to load. Saving is paused to avoid an incomplete snapshot.',
|
|
1796
|
+
'groups.saveProfileSubmit': 'Save Profile',
|
|
1797
|
+
'groups.saveProfileOverwriteSubmit': 'Overwrite Save',
|
|
1798
|
+
'groups.saveProfileInvalid': 'Profile id may contain letters, numbers, dots, underscores, and hyphens only; max 64; cannot be . or ..',
|
|
1799
|
+
'groups.saveProfileNoRoles': 'This chat has no bot configs to save.',
|
|
1800
|
+
'groups.saveProfileSaving': 'Saving…',
|
|
1801
|
+
'groups.saveProfileDone': 'Saved {count} entries into {name}',
|
|
1802
|
+
'groups.saveProfileFailed': 'Saved only {saved}/{total} entries. Check offline bots or permissions.',
|
|
1230
1803
|
'groups.createTitle': 'Create New Group',
|
|
1231
1804
|
'groups.createHelp': 'Pick bots to invite. The dashboard chooses an online daemon as creator.',
|
|
1232
1805
|
'groups.name': 'Group Name',
|
|
1233
1806
|
'groups.namePlaceholder': 'e.g. AI ChangeLog',
|
|
1234
1807
|
'groups.bindDir': 'Bind Directory',
|
|
1235
1808
|
'groups.bindDirHelp': 'New topics start the CLI here and skip repo selection.',
|
|
1809
|
+
'groups.roleProfile': 'Profile',
|
|
1810
|
+
'groups.roleProfileNone': 'None',
|
|
1811
|
+
'groups.roleProfileHelp': 'After creation, send a profile apply bootstrap command in the new group.',
|
|
1812
|
+
'groups.roleProfileBootstrapSent': 'Profile: {name}; bootstrap message sent: {messageId}',
|
|
1813
|
+
'groups.roleProfileBootstrapDone': 'Profile: {name}; bootstrap completed with no peer bootstrap message needed.',
|
|
1814
|
+
'groups.roleProfileBootstrapFailed': 'Profile: {name}; bootstrap failed: {reason}',
|
|
1236
1815
|
'groups.botPicker': 'Bots',
|
|
1237
1816
|
'groups.createSubmit': 'Create',
|
|
1238
1817
|
'groups.cancel': 'Cancel',
|
|
@@ -1411,6 +1990,12 @@ const en = {
|
|
|
1411
1990
|
'botDefaults.roleSaved': 'Saved',
|
|
1412
1991
|
'botDefaults.roleDeleted': 'Deleted',
|
|
1413
1992
|
'botDefaults.roleLoadErr': 'Failed to load role',
|
|
1993
|
+
'botDefaults.profileRoles': 'Profile Roles',
|
|
1994
|
+
'botDefaults.profileRolesHelp': 'Role entries this bot has in Profiles. Collapsed by default; expand a profile to load details.',
|
|
1995
|
+
'botDefaults.profileRolesEmpty': 'This bot has no profile roles.',
|
|
1996
|
+
'botDefaults.profileRolesLoadFailed': 'Failed to load profile roles: {error}',
|
|
1997
|
+
'botDefaults.profileRoleClickToLoad': 'Expand to load role details.',
|
|
1998
|
+
'botDefaults.profileRoleDetailLoadFailed': 'Failed to load role detail: {error}',
|
|
1414
1999
|
'botDefaults.sectionAutoStart': 'Proactive Start',
|
|
1415
2000
|
'botDefaults.autoStartJoin': 'Auto-start when added to a new chat',
|
|
1416
2001
|
'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 +2047,13 @@ const en = {
|
|
|
1462
2047
|
'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
2048
|
'botDefaults.startupCommandsPlaceholder': 'One per line, e.g. /effort ultracode',
|
|
1464
2049
|
'botDefaults.startupCommandsSave': 'Save startup commands',
|
|
1465
|
-
'nav.roles': '
|
|
2050
|
+
'nav.roles': 'Role Management',
|
|
2051
|
+
'nav.groupRoles': 'Group Roles',
|
|
2052
|
+
'nav.roleProfiles': 'Profiles',
|
|
1466
2053
|
'roles.title': 'Role Management',
|
|
1467
|
-
'roles.subtitle': '
|
|
2054
|
+
'roles.subtitle': 'Manage per-group bot roles and reusable Profiles.',
|
|
2055
|
+
'roleProfiles.title': 'Profiles',
|
|
2056
|
+
'roleProfiles.subtitle': 'Maintain reusable multi-bot Profiles, then preview or apply them to target groups.',
|
|
1468
2057
|
'roles.search': 'Search group / bot / ID',
|
|
1469
2058
|
'roles.refresh': 'Refresh',
|
|
1470
2059
|
'roles.selectHint': '← Expand a group and select a bot to edit its role',
|
|
@@ -1481,6 +2070,31 @@ const en = {
|
|
|
1481
2070
|
'roles.botsWithRoles': 'bots configured',
|
|
1482
2071
|
'roles.emptyError': 'Role content cannot be empty',
|
|
1483
2072
|
'roles.saveFailed': 'Save failed, please retry',
|
|
2073
|
+
'roles.tabGroups': 'By Group',
|
|
2074
|
+
'roles.tabProfiles': 'Profiles',
|
|
2075
|
+
'roles.profileIdPlaceholder': 'profile id, e.g. collab-main',
|
|
2076
|
+
'roles.profileIdInvalid': 'Profile id may contain letters, numbers, dots, underscores, and hyphens only; max 64; cannot be . or ..',
|
|
2077
|
+
'roles.openProfile': 'Open',
|
|
2078
|
+
'roles.profileSearch': 'Search profile',
|
|
2079
|
+
'roles.profileSelectHint': '← Select or enter a profile to edit',
|
|
2080
|
+
'roles.profileEmpty': 'No Profiles',
|
|
2081
|
+
'roles.profileEntries': 'entries',
|
|
2082
|
+
'roles.profileMissing': 'Missing',
|
|
2083
|
+
'roles.profileRuntimeHint': 'Profiles are reusable suites; applying one writes a group role, not a new runtime layer.',
|
|
2084
|
+
'roles.profileBots': 'Bot Entries',
|
|
2085
|
+
'roles.profileEditorPlaceholder': 'Enter this bot\'s Markdown role for this profile...',
|
|
2086
|
+
'roles.saveEntry': 'Save Entry',
|
|
2087
|
+
'roles.profileBotSelectHint': 'Select a bot to edit its entry in this profile',
|
|
2088
|
+
'roles.applyToGroup': 'Apply To Group',
|
|
2089
|
+
'roles.applyForce': 'Overwrite existing group roles',
|
|
2090
|
+
'roles.previewApply': 'Preview Apply',
|
|
2091
|
+
'roles.applyProfile': 'Apply Profile',
|
|
2092
|
+
'roles.applyPickBots': 'Select at least one bot',
|
|
2093
|
+
'roles.applyWouldRefuse': 'Would refuse (group role exists)',
|
|
2094
|
+
'roles.applyPreviewOk': 'Can apply',
|
|
2095
|
+
'roles.applyOk': 'Applied',
|
|
2096
|
+
'roles.applyFailed': 'Failed',
|
|
2097
|
+
'roles.confirmDeleteProfileEntry': 'Delete this bot entry from the profile?',
|
|
1484
2098
|
'common.none': 'None',
|
|
1485
2099
|
'common.loading': 'Loading…',
|
|
1486
2100
|
'common.unknown': 'Unknown',
|