codexmate 0.1.9 → 0.1.12
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.md +0 -4
- package/README.vi.md +0 -4
- package/README.zh.md +0 -4
- package/cli/agents-files.js +27 -3
- package/cli/prompt-history.js +171 -0
- package/cli/system-prompt-files.js +20 -2
- package/cli.js +83 -2694
- package/package.json +1 -1
- package/web-ui/app.js +39 -56
- package/web-ui/index.html +0 -1
- package/web-ui/modules/app.computed.dashboard.mjs +0 -3
- package/web-ui/modules/app.computed.main-tabs.mjs +0 -474
- package/web-ui/modules/app.methods.agents.mjs +90 -0
- package/web-ui/modules/app.methods.index.mjs +1 -3
- package/web-ui/modules/app.methods.navigation.mjs +8 -3
- package/web-ui/modules/app.methods.session-actions.mjs +57 -25
- package/web-ui/modules/app.methods.system-prompt.mjs +81 -0
- package/web-ui/modules/app.methods.web-ui-preferences.mjs +26 -9
- package/web-ui/modules/i18n/locales/en.mjs +10 -265
- package/web-ui/modules/i18n/locales/ja.mjs +10 -265
- package/web-ui/modules/i18n/locales/vi.mjs +10 -266
- package/web-ui/modules/i18n/locales/zh-tw.mjs +10 -265
- package/web-ui/modules/i18n/locales/zh.mjs +10 -265
- package/web-ui/partials/index/layout-header.html +5 -48
- package/web-ui/partials/index/panel-config-claude.html +3 -3
- package/web-ui/partials/index/panel-config-codex.html +3 -3
- package/web-ui/partials/index/panel-config-kilocode.html +5 -5
- package/web-ui/partials/index/panel-config-openclaw.html +3 -3
- package/web-ui/partials/index/panel-config-opencode.html +5 -5
- package/web-ui/partials/index/panel-dashboard.html +0 -21
- package/web-ui/partials/index/panel-prompts.html +52 -0
- package/web-ui/partials/index/panel-sessions.html +12 -0
- package/web-ui/partials/index/panel-settings.html +35 -0
- package/web-ui/res/web-ui-render.precompiled.js +543 -1376
- package/web-ui/session-helpers.mjs +0 -16
- package/web-ui/styles/modals-core.css +86 -0
- package/web-ui/styles/sessions-preview.css +38 -0
- package/web-ui/styles/titles-cards.css +2 -2
- package/web-ui/styles.css +0 -1
- package/lib/automation.js +0 -404
- package/lib/task-orchestrator.js +0 -938
- package/lib/task-workspace-chat.js +0 -292
- package/web-ui/modules/app.methods.task-orchestration.mjs +0 -895
- package/web-ui/partials/index/panel-orchestration.html +0 -598
- package/web-ui/styles/task-orchestration.css +0 -2979
|
@@ -34,6 +34,8 @@ const zh = Object.freeze({
|
|
|
34
34
|
'common.save': '保存',
|
|
35
35
|
'common.saveApply': '保存并应用',
|
|
36
36
|
'common.close': '关闭',
|
|
37
|
+
'common.history': '历史',
|
|
38
|
+
'common.restoreToEditor': '恢复到编辑器',
|
|
37
39
|
'common.delete': '删除',
|
|
38
40
|
'common.clear': '清空',
|
|
39
41
|
'common.show': '显示',
|
|
@@ -135,7 +137,6 @@ const zh = Object.freeze({
|
|
|
135
137
|
'tab.config.opencode': 'OpenCode',
|
|
136
138
|
'tab.sessions': '会话',
|
|
137
139
|
'tab.usage': '用量',
|
|
138
|
-
'tab.orchestration': '任务',
|
|
139
140
|
'tab.market': 'Skills',
|
|
140
141
|
'tab.plugins': '插件',
|
|
141
142
|
'tab.settings': '设置',
|
|
@@ -151,7 +152,6 @@ const zh = Object.freeze({
|
|
|
151
152
|
'side.prompts.meta': '提示词文件与预设',
|
|
152
153
|
'side.plugins': '插件',
|
|
153
154
|
'side.system': '系统',
|
|
154
|
-
'side.orchestration': '任务',
|
|
155
155
|
'side.skills': 'Skills',
|
|
156
156
|
'side.collapse': '收起侧边栏',
|
|
157
157
|
'side.expand': '展开侧边栏',
|
|
@@ -200,7 +200,6 @@ const zh = Object.freeze({
|
|
|
200
200
|
'kicker.config': 'Configuration',
|
|
201
201
|
'kicker.sessions': 'Sessions',
|
|
202
202
|
'kicker.usage': 'Usage',
|
|
203
|
-
'kicker.orchestration': 'Tasks',
|
|
204
203
|
'kicker.market': 'Skills',
|
|
205
204
|
'kicker.plugins': 'Plugins',
|
|
206
205
|
'kicker.docs': 'Docs',
|
|
@@ -212,7 +211,6 @@ const zh = Object.freeze({
|
|
|
212
211
|
'title.config': '本地配置控制台',
|
|
213
212
|
'title.sessions': '会话与导出',
|
|
214
213
|
'title.usage': '本地用量与趋势',
|
|
215
|
-
'title.orchestration': '任务线程',
|
|
216
214
|
'title.market': 'Skills 安装与同步',
|
|
217
215
|
'title.plugins': '插件与模板',
|
|
218
216
|
'title.docs': 'CLI 安装与文档',
|
|
@@ -223,7 +221,6 @@ const zh = Object.freeze({
|
|
|
223
221
|
'subtitle.config': '管理本地配置与模型。',
|
|
224
222
|
'subtitle.sessions': '浏览与导出会话。',
|
|
225
223
|
'subtitle.usage': '查看近 7 / 30 天用量。',
|
|
226
|
-
'subtitle.orchestration': '像聊天一样整理任务,准备好后发送 /plan。',
|
|
227
224
|
'subtitle.market': '管理本地 Skills。',
|
|
228
225
|
'subtitle.plugins': '管理模板化 prompt 与可复用插件。',
|
|
229
226
|
'subtitle.docs': '查看 CLI 安装命令与排障。',
|
|
@@ -231,7 +228,7 @@ const zh = Object.freeze({
|
|
|
231
228
|
'subtitle.prompts': '编辑 AGENTS.md 与 CLAUDE.md。',
|
|
232
229
|
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
233
230
|
'prompts.subTab.project': 'CLAUDE.md',
|
|
234
|
-
'prompts.subTab.system': 'System Prompt',
|
|
231
|
+
'prompts.subTab.system': 'System Prompt (Pi)',
|
|
235
232
|
'prompts.subTab.presets': '预设池',
|
|
236
233
|
'prompts.presets.title': '预设池',
|
|
237
234
|
'prompts.presets.hint': '管理预设。',
|
|
@@ -305,15 +302,12 @@ const zh = Object.freeze({
|
|
|
305
302
|
'dashboard.card.config': '配置',
|
|
306
303
|
'dashboard.card.sessions': '会话',
|
|
307
304
|
'dashboard.card.usage': '用量',
|
|
308
|
-
'dashboard.card.tasks': '任务',
|
|
309
305
|
'dashboard.card.skills': 'Skills',
|
|
310
306
|
'dashboard.kv.model': '模型',
|
|
311
307
|
'dashboard.kv.issue': '异常',
|
|
312
308
|
'dashboard.kv.active': '当前',
|
|
313
309
|
'dashboard.kv.sessions': '会话数',
|
|
314
310
|
'dashboard.kv.missingModel': '缺失模型',
|
|
315
|
-
'dashboard.kv.blockers': '阻塞',
|
|
316
|
-
'dashboard.kv.runs': '运行',
|
|
317
311
|
'dashboard.kv.target': '目标',
|
|
318
312
|
'dashboard.kv.root': '目录',
|
|
319
313
|
'dashboard.status.health': '健康',
|
|
@@ -325,7 +319,6 @@ const zh = Object.freeze({
|
|
|
325
319
|
'dashboard.busy.configApply': '配置应用',
|
|
326
320
|
'dashboard.busy.agents': 'AGENTS 保存',
|
|
327
321
|
'dashboard.busy.skills': 'Skills 管理',
|
|
328
|
-
'dashboard.busy.tasks': '任务编排',
|
|
329
322
|
'dashboard.busy.idle': '空闲',
|
|
330
323
|
'dashboard.message.none': '暂无提示',
|
|
331
324
|
'dashboard.sessionSource.codex': 'Codex',
|
|
@@ -352,7 +345,6 @@ const zh = Object.freeze({
|
|
|
352
345
|
'dashboard.none': '无',
|
|
353
346
|
'dashboard.sessions.count': '{count} 条会话',
|
|
354
347
|
'dashboard.usage.range': '范围 {value}',
|
|
355
|
-
'dashboard.tasks.queue': 'run {running} / queue {queued}',
|
|
356
348
|
'dashboard.skills.count': 'installed {installed} / import {importable}',
|
|
357
349
|
'dashboard.providersHealth.title': 'Provider 健康状态',
|
|
358
350
|
'dashboard.providersHealth.current': '(当前)',
|
|
@@ -477,6 +469,8 @@ const zh = Object.freeze({
|
|
|
477
469
|
'toast.health.noFailedProviderSelection': '请先选择至少一个失败提供商',
|
|
478
470
|
'toast.health.deleteFailedProvidersDone': '已删除 {count} 个失败提供商',
|
|
479
471
|
'toast.noChanges': '未检测到改动',
|
|
472
|
+
'toast.history.restored': '已恢复到编辑器,保存后生效',
|
|
473
|
+
'toast.history.empty': '暂无历史',
|
|
480
474
|
'toast.template.loadFail': '加载模板失败',
|
|
481
475
|
'toast.template.empty': '模板不能为空',
|
|
482
476
|
'toast.template.applied': '模板已应用',
|
|
@@ -701,6 +695,7 @@ const zh = Object.freeze({
|
|
|
701
695
|
'sessions.preview.importNative.failedWithReason': '导入原生目录失败:{reason}',
|
|
702
696
|
'sessions.preview.copyLink': '复制链接',
|
|
703
697
|
'sessions.preview.copyPath': '复制路径',
|
|
698
|
+
'sessions.preview.copyMessage': '复制记录',
|
|
704
699
|
'sessions.preview.openLink': '打开链接',
|
|
705
700
|
'sessions.preview.loadingBody': '正在加载会话内容...',
|
|
706
701
|
'sessions.preview.emptyMsgs': '当前会话暂无可展示消息',
|
|
@@ -1008,254 +1003,6 @@ const zh = Object.freeze({
|
|
|
1008
1003
|
'usage.range.all': '全部',
|
|
1009
1004
|
'usage.range.7d.short': '近 7 天',
|
|
1010
1005
|
'usage.range.30d.short': '近 30 天',
|
|
1011
|
-
'orchestration.queueStats': '队列 {running} 运行中 · {queued} 等待中',
|
|
1012
|
-
'orchestration.rebuilding.status': '暂停开放',
|
|
1013
|
-
'orchestration.rebuilding.title': '重建中',
|
|
1014
|
-
'orchestration.rebuilding.body': '任务编排入口暂时保留展示,但当前不可点击。',
|
|
1015
|
-
'orchestration.hero.kicker': '任务编排',
|
|
1016
|
-
'orchestration.hero.title': '任务编排',
|
|
1017
|
-
'orchestration.hero.subtitle': '规划、执行并追踪任务,保留工作区与线程上下文。',
|
|
1018
|
-
'orchestration.quick.kicker': '任务输入',
|
|
1019
|
-
'orchestration.quick.title': '输入任务目标',
|
|
1020
|
-
'orchestration.quick.subtitle': '描述目标、约束和验收标准。执行前可用 /plan 预览计划。',
|
|
1021
|
-
'orchestration.quick.caption': 'Enter 追加需求;/plan 预览计划;开始执行会生成计划并运行。',
|
|
1022
|
-
'orchestration.quick.templates.reviewFix.meta': '处理 review 反馈并补回归验证。',
|
|
1023
|
-
'orchestration.quick.templates.planOnly.meta': '先排查规划,不写入文件。',
|
|
1024
|
-
'orchestration.quick.templates.workflowBatch.meta': '复用本地 Workflow 跑固定检查。',
|
|
1025
|
-
'orchestration.chat.input.label': '任务消息',
|
|
1026
|
-
'orchestration.chat.input.placeholder': '描述目标、约束和验收标准;输入 /plan 预览计划。',
|
|
1027
|
-
'orchestration.chat.input.hint': '工作区、线程和运行模式可在高级设置中调整。',
|
|
1028
|
-
'orchestration.chat.context.aria': '任务上下文',
|
|
1029
|
-
'orchestration.chat.context.workspace.auto': '工作区自动推断',
|
|
1030
|
-
'orchestration.chat.context.workspace.value': '工作区 {value}',
|
|
1031
|
-
'orchestration.chat.context.thread.auto': '线程自动生成',
|
|
1032
|
-
'orchestration.chat.context.thread.value': '线程 {value}',
|
|
1033
|
-
'orchestration.chat.context.sequence.empty': '顺序:等待需求 1',
|
|
1034
|
-
'orchestration.chat.context.sequence.value': '顺序:{count} 条需求',
|
|
1035
|
-
'orchestration.privacy.workspace.selected': '已选择工作区',
|
|
1036
|
-
'orchestration.privacy.thread.selected': '已选择线程',
|
|
1037
|
-
'orchestration.chat.thread.aria': '任务对话',
|
|
1038
|
-
'orchestration.chat.input.send': '追加需求',
|
|
1039
|
-
'orchestration.chat.input.discuss': '预览计划',
|
|
1040
|
-
'orchestration.chat.input.work': '开始执行',
|
|
1041
|
-
'orchestration.chat.input.firstHint': '这会成为需求 1。',
|
|
1042
|
-
'orchestration.chat.input.workHint': '执行前会先合并当前输入。',
|
|
1043
|
-
'orchestration.chat.input.workCaption': 'Enter 追加需求;/plan 只预览;开始执行会规划并运行。',
|
|
1044
|
-
'orchestration.chat.input.sequenceHint': '现在发送会成为需求 {count}。',
|
|
1045
|
-
'orchestration.chat.assistant.contextLabel': '上一轮上下文',
|
|
1046
|
-
'orchestration.chat.assistant.contextFallback': '已选中一个历史任务,继续时会继承它的线程和工作区。',
|
|
1047
|
-
'orchestration.chat.assistant.resultLabel': '实现结果',
|
|
1048
|
-
'orchestration.chat.assistant.filesSummary': '文件操作:{files}',
|
|
1049
|
-
'orchestration.chat.assistant.readyLabel': 'Codexmate',
|
|
1050
|
-
'orchestration.chat.assistant.empty': '输入任务目标。多条需求会按顺序执行并保留上下文。',
|
|
1051
|
-
'orchestration.chat.assistant.planLabel': '计划预览',
|
|
1052
|
-
'orchestration.chat.assistant.planSummary': '计划已生成:{nodes} 个节点,{waves} 个批次。',
|
|
1053
|
-
'orchestration.chat.assistant.sequenceReady': '已收到多条需求;执行时会先完成需求 1,再带着上下文继续后续需求。',
|
|
1054
|
-
'orchestration.chat.assistant.singleReady': '已收到需求。可继续追加,或输入 /plan 预览计划。',
|
|
1055
|
-
'orchestration.chat.user.step': '需求 {count}',
|
|
1056
|
-
'orchestration.chat.meta.thread': '线程 {value}',
|
|
1057
|
-
'orchestration.chat.meta.workspace': '工作区 {value}',
|
|
1058
|
-
'orchestration.chat.meta.order': '顺序执行 · 保留上下文',
|
|
1059
|
-
'orchestration.chat.meta.first': '先完成这一条',
|
|
1060
|
-
'orchestration.chat.meta.afterPrevious': '等待前一条完成后继续',
|
|
1061
|
-
'orchestration.chat.meta.contextKept': '上下文会随线程保留',
|
|
1062
|
-
'orchestration.chat.meta.previewNext': '下一步:/plan 预览',
|
|
1063
|
-
'orchestration.quick.checklist.title': '执行检查',
|
|
1064
|
-
'orchestration.quick.checklist.subtitle': '只保留真正影响执行的阻塞项。',
|
|
1065
|
-
'orchestration.agent.aria': '任务编排状态',
|
|
1066
|
-
'orchestration.agent.kicker': '任务编排',
|
|
1067
|
-
'orchestration.agent.title': '任务编排控制台',
|
|
1068
|
-
'orchestration.agent.subtitle': '选择工作区与会话,执行任务,并查看运行详情。',
|
|
1069
|
-
'orchestration.agent.state.ready': 'Ready',
|
|
1070
|
-
'orchestration.agent.state.planning': 'Planning',
|
|
1071
|
-
'orchestration.agent.state.running': 'Running',
|
|
1072
|
-
'orchestration.agent.surface.workspace': 'Workspace',
|
|
1073
|
-
'orchestration.agent.surface.session': '上下文',
|
|
1074
|
-
'orchestration.agent.surface.mode': 'Mode',
|
|
1075
|
-
'orchestration.agent.surface.trace': 'Trace',
|
|
1076
|
-
'orchestration.agent.surface.runs': 'runs',
|
|
1077
|
-
'orchestration.agent.surface.queue': 'queued',
|
|
1078
|
-
'orchestration.agent.trace.title': 'Live trace',
|
|
1079
|
-
'orchestration.agent.trace.plan': 'Plan nodes',
|
|
1080
|
-
'orchestration.agent.trace.queue': 'Queue',
|
|
1081
|
-
'orchestration.agent.trace.runs': 'Runs',
|
|
1082
|
-
'orchestration.agent.trace.nodes': 'Run nodes',
|
|
1083
|
-
'orchestration.quick.status.title': '当前草稿',
|
|
1084
|
-
'orchestration.workspace.aria': '工作区与会话',
|
|
1085
|
-
'orchestration.workspace.title': '工作区',
|
|
1086
|
-
'orchestration.workspace.subtitle': '选择项目,再为该项目新建或恢复会话。',
|
|
1087
|
-
'orchestration.workspace.selector': '工作区选择',
|
|
1088
|
-
'orchestration.workspace.counts': '{runs} runs · {queue} queue',
|
|
1089
|
-
'orchestration.workspace.newSession': '+ 新建',
|
|
1090
|
-
'orchestration.workspace.sessions.title': '记录',
|
|
1091
|
-
'orchestration.workspace.sessions.empty.title': '暂无记录',
|
|
1092
|
-
'orchestration.workspace.sessions.empty.subtitle': '新建记录,或刷新后选择已有运行记录。',
|
|
1093
|
-
'orchestration.workspace.sessions.queueTitle': '排队项',
|
|
1094
|
-
'orchestration.workspace.sessions.runTitle': '运行记录',
|
|
1095
|
-
'orchestration.workspace.sessions.detailsHidden': '详情已隐藏',
|
|
1096
|
-
'orchestration.workspace.pathHidden': '路径已隐藏',
|
|
1097
|
-
'orchestration.draft.reset': '重置草稿',
|
|
1098
|
-
'orchestration.summary.aria': '任务编排概览',
|
|
1099
|
-
'orchestration.summary.running': '运行中',
|
|
1100
|
-
'orchestration.summary.queued': '排队中',
|
|
1101
|
-
'orchestration.summary.runs': '运行记录',
|
|
1102
|
-
'orchestration.readiness.target.label': '任务目标',
|
|
1103
|
-
'orchestration.readiness.target.done': '已填写目标',
|
|
1104
|
-
'orchestration.readiness.target.missing': '未填写目标',
|
|
1105
|
-
'orchestration.readiness.sequence.label': '顺序',
|
|
1106
|
-
'orchestration.readiness.sequence.missing': '先发送需求 1',
|
|
1107
|
-
'orchestration.readiness.sequence.single': '当前只有需求 1;继续发送会变成需求 2。',
|
|
1108
|
-
'orchestration.readiness.sequence.multiple': '{count} 条需求会按顺序执行:先完成需求 1,再继续需求 2。',
|
|
1109
|
-
'orchestration.readiness.engine.label': '执行策略',
|
|
1110
|
-
'orchestration.readiness.engine.openaiChat': '使用 OpenAI Chat-compatible 节点',
|
|
1111
|
-
'orchestration.readiness.workflow.done': '已选 {count} 个 Workflow',
|
|
1112
|
-
'orchestration.readiness.workflow.missing': '还没选 Workflow ID',
|
|
1113
|
-
'orchestration.readiness.scope.label': '边界',
|
|
1114
|
-
'orchestration.readiness.scope.done': '已补充说明',
|
|
1115
|
-
'orchestration.readiness.scope.writeHint': '建议补说明后再写入',
|
|
1116
|
-
'orchestration.readiness.scope.readonlyHint': '当前是只读,可直接试',
|
|
1117
|
-
'orchestration.readiness.preview.label': '预览',
|
|
1118
|
-
'orchestration.readiness.preview.missing': '还没发送 /plan',
|
|
1119
|
-
'orchestration.readiness.preview.blocked': '有 {count} 个阻塞项',
|
|
1120
|
-
'orchestration.readiness.preview.ready': '计划可用,{count} 个节点',
|
|
1121
|
-
'orchestration.readiness.empty.title': '填写任务目标',
|
|
1122
|
-
'orchestration.readiness.empty.summary': '先明确目标、约束和验收标准。',
|
|
1123
|
-
'orchestration.readiness.workflow.title': '缺少 Workflow',
|
|
1124
|
-
'orchestration.readiness.workflow.summary': '你已经选了 Workflow 模式,但还没指定可复用流程。',
|
|
1125
|
-
'orchestration.readiness.preview.title': '建议预览计划',
|
|
1126
|
-
'orchestration.readiness.preview.summary': '目标已填写。可用 /plan 确认节点和依赖。',
|
|
1127
|
-
'orchestration.readiness.preview.sequenceSummary': '草稿已成形,已锁定 {count} 条顺序需求:先完成需求 1,再继续需求 2。',
|
|
1128
|
-
'orchestration.readiness.blocked.title': '预览有阻塞',
|
|
1129
|
-
'orchestration.readiness.blocked.summary': '当前计划里还有 {count} 个阻塞项,先处理它们。',
|
|
1130
|
-
'orchestration.readiness.warn.title': '可以执行,但有提醒',
|
|
1131
|
-
'orchestration.readiness.warn.summary': '/plan 方案已生成,但还有 {count} 条提醒值得先看一眼。',
|
|
1132
|
-
'orchestration.readiness.dryRun.title': '适合先预演',
|
|
1133
|
-
'orchestration.readiness.dryRun.summary': '现在可以安全地跑一次仅预演,先看结果再决定是否真实执行。',
|
|
1134
|
-
'orchestration.readiness.ready.title': '可以执行',
|
|
1135
|
-
'orchestration.readiness.ready.withFollowUps': '已锁定 {count} 条顺序需求:先完成需求 1,再带上下文继续需求 2。',
|
|
1136
|
-
'orchestration.readiness.ready.summary': '目标清晰,可以执行或入队。',
|
|
1137
|
-
'orchestration.step1.title': '先把结果写清楚',
|
|
1138
|
-
'orchestration.step1.subtitle': '只写会影响执行的内容。',
|
|
1139
|
-
'orchestration.templates.title': '快捷示例',
|
|
1140
|
-
'orchestration.templates.reviewFix.label': '修 review + 回归',
|
|
1141
|
-
'orchestration.templates.reviewFix.target': '修复当前 PR review 评论,并补对应回归测试',
|
|
1142
|
-
'orchestration.templates.reviewFix.notes': '不要改动无关模块;需要给出验证结果',
|
|
1143
|
-
'orchestration.templates.reviewFix.followUps': '继续处理新增 review 评论\n最后更新 PR 摘要',
|
|
1144
|
-
'orchestration.templates.planOnly.label': '只做排查规划',
|
|
1145
|
-
'orchestration.templates.planOnly.target': '先排查问题根因并给出执行计划,不直接修改代码',
|
|
1146
|
-
'orchestration.templates.planOnly.notes': '优先定位根因、影响范围和风险点',
|
|
1147
|
-
'orchestration.templates.workflowBatch.label': 'Workflow 批处理',
|
|
1148
|
-
'orchestration.templates.workflowBatch.target': '用 Workflow 跑一组固定检查并整理结果',
|
|
1149
|
-
'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
|
|
1150
|
-
'orchestration.templates.workflowBatch.notes': '输出统一结论,避免重复描述',
|
|
1151
|
-
'orchestration.fields.target': '任务消息',
|
|
1152
|
-
'orchestration.fields.target.placeholder': '例如:修复当前 PR review 评论,补对应回归测试,并避免改无关模块',
|
|
1153
|
-
'orchestration.fields.target.hint': '像发消息一样写清结果、边界和验收标准就够了。',
|
|
1154
|
-
'orchestration.engine.openaiChat': 'OpenAI Chat',
|
|
1155
|
-
'orchestration.engine.workflow': 'Workflow',
|
|
1156
|
-
'orchestration.runMode.write': '写入',
|
|
1157
|
-
'orchestration.runMode.readOnly': '只读',
|
|
1158
|
-
'orchestration.runMode.dryRun': '仅预演',
|
|
1159
|
-
'orchestration.pills.sequenceCount': '顺序需求 {count}',
|
|
1160
|
-
'orchestration.pills.hasTitle': '标题已设',
|
|
1161
|
-
'orchestration.pills.workflowCount': 'Workflow {count}',
|
|
1162
|
-
'orchestration.pills.planNodes': '计划 {count} 节点',
|
|
1163
|
-
'orchestration.step2.title': '选择执行方式',
|
|
1164
|
-
'orchestration.step2.subtitle': '常用项默认展开,其余放高级设置。',
|
|
1165
|
-
'orchestration.fields.engine': '引擎',
|
|
1166
|
-
'orchestration.fields.runMode': '运行模式',
|
|
1167
|
-
'orchestration.advanced.title': '高级设置',
|
|
1168
|
-
'orchestration.advanced.open': '设置',
|
|
1169
|
-
'orchestration.fields.title': '标题',
|
|
1170
|
-
'orchestration.fields.title.placeholder': '可选,默认从目标自动提取',
|
|
1171
|
-
'orchestration.fields.notes': '说明',
|
|
1172
|
-
'orchestration.fields.notes.placeholder': '例如:不要重写现有架构,只做增量实现',
|
|
1173
|
-
'orchestration.fields.notes.hint': '补边界、禁区、风格要求或验证要求。',
|
|
1174
|
-
'orchestration.fields.workspacePath': '工作区路径',
|
|
1175
|
-
'orchestration.fields.workspacePath.placeholder': '例如:/home/me/project',
|
|
1176
|
-
'orchestration.fields.workspacePath.hint': '计划、执行和队列都会使用这个 cwd;留空则使用服务当前目录。',
|
|
1177
|
-
'orchestration.fields.threadId': '任务线程 ID',
|
|
1178
|
-
'orchestration.fields.threadId.placeholder': '可选;留空自动生成',
|
|
1179
|
-
'orchestration.fields.threadId.hint': '同一线程用于连续追加要求、重试和队列追踪。',
|
|
1180
|
-
'orchestration.fields.followUps': '后续动作(每行一条)',
|
|
1181
|
-
'orchestration.fields.followUps.placeholder': '例如:\n继续处理 review 评论\n最后补回归测试',
|
|
1182
|
-
'orchestration.fields.concurrency': '并发',
|
|
1183
|
-
'orchestration.fields.concurrency.hint': '复杂任务先从 1~2 开始更稳。',
|
|
1184
|
-
'orchestration.fields.autoFixRounds': '自动修复',
|
|
1185
|
-
'orchestration.fields.autoFixRounds.hint': '失败后自动再试几轮。',
|
|
1186
|
-
'orchestration.fields.workflowIds': 'Workflow ID(每行一条)',
|
|
1187
|
-
'orchestration.fields.workflowIds.placeholder': '例如:\ndiagnose-config\nsafe-provider-switch',
|
|
1188
|
-
'orchestration.fields.workflowIds.hint': '仅 Workflow 模式需要。当前本地可用 {count} 个。',
|
|
1189
|
-
'orchestration.workflow.stepCount': '{count} 步',
|
|
1190
|
-
'orchestration.step3.title': '先预览,再执行',
|
|
1191
|
-
'orchestration.step3.subtitle': '先确认计划,再决定立即执行还是入队。',
|
|
1192
|
-
'orchestration.actions.planning': '规划中...',
|
|
1193
|
-
'orchestration.actions.previewOnly': '仅预览',
|
|
1194
|
-
'orchestration.actions.preparing': '准备中...',
|
|
1195
|
-
'orchestration.actions.generatePlan': '发送 /plan',
|
|
1196
|
-
'orchestration.actions.planAndRun': '预览 /plan 并执行',
|
|
1197
|
-
'orchestration.actions.processing': '处理中...',
|
|
1198
|
-
'orchestration.actions.queueAndStart': '入队并开始',
|
|
1199
|
-
'orchestration.actions.caption': '执行前会按需刷新计划;批量任务可入队运行。',
|
|
1200
|
-
'orchestration.stage.title': '任务阶段',
|
|
1201
|
-
'orchestration.stage.subtitle': '填写目标、预览计划,然后执行。',
|
|
1202
|
-
'orchestration.stage.pill.target': '写任务消息',
|
|
1203
|
-
'orchestration.stage.pill.preview': '预览',
|
|
1204
|
-
'orchestration.stage.pill.run': '执行或入队',
|
|
1205
|
-
'orchestration.plan.title': '计划预览',
|
|
1206
|
-
'orchestration.plan.subtitle': '确认节点、批次和依赖关系。',
|
|
1207
|
-
'orchestration.plan.summary.nodes': '节点数',
|
|
1208
|
-
'orchestration.plan.summary.waves': '波次',
|
|
1209
|
-
'orchestration.plan.summary.engine': '引擎',
|
|
1210
|
-
'orchestration.plan.summary.threadId': '线程 ID',
|
|
1211
|
-
'orchestration.plan.summary.cwd': '工作区',
|
|
1212
|
-
'orchestration.plan.node.write': 'write',
|
|
1213
|
-
'orchestration.plan.node.readOnly': 'read-only',
|
|
1214
|
-
'orchestration.labels.dependencies': '依赖:',
|
|
1215
|
-
'orchestration.labels.error': '错误:',
|
|
1216
|
-
'orchestration.workbench.title': '执行工作台',
|
|
1217
|
-
'orchestration.workbench.subtitle': '显示队列、运行记录和节点详情。',
|
|
1218
|
-
'orchestration.queue.start': '开始队列',
|
|
1219
|
-
'orchestration.queue.starting': '启动中...',
|
|
1220
|
-
'orchestration.workbench.tabs.aria': '任务编排工作台视图',
|
|
1221
|
-
'orchestration.workbench.tabs.queue': '队列 {count}',
|
|
1222
|
-
'orchestration.workbench.tabs.runs': '运行记录 {count}',
|
|
1223
|
-
'orchestration.workbench.tabs.detail': '运行详情',
|
|
1224
|
-
'orchestration.workbench.queueCount': '{count} 个排队中',
|
|
1225
|
-
'orchestration.workbench.ready': '就绪',
|
|
1226
|
-
'orchestration.queue.empty.title': '当前没有排队任务',
|
|
1227
|
-
'orchestration.queue.empty.subtitle': '批量任务可先入队,再启动队列。',
|
|
1228
|
-
'orchestration.runs.empty.title': '还没有运行记录',
|
|
1229
|
-
'orchestration.runs.empty.subtitle': '执行后会显示最近运行记录。',
|
|
1230
|
-
'orchestration.detail.refresh': '刷新详情',
|
|
1231
|
-
'orchestration.detail.retry': '重试',
|
|
1232
|
-
'orchestration.detail.retrying': '重试中...',
|
|
1233
|
-
'orchestration.detail.continueThread': '继续此线程',
|
|
1234
|
-
'orchestration.detail.empty.title': '选择一条运行记录查看详情',
|
|
1235
|
-
'orchestration.detail.empty.subtitle': '这里会显示节点状态、摘要和日志。',
|
|
1236
|
-
'orchestration.detail.summary.status': '状态',
|
|
1237
|
-
'orchestration.detail.summary.duration': '耗时',
|
|
1238
|
-
'orchestration.detail.summary.nodes': '节点数',
|
|
1239
|
-
'orchestration.detail.summary.summary': '摘要',
|
|
1240
|
-
'orchestration.detail.context.aria': '任务运行上下文',
|
|
1241
|
-
'orchestration.detail.context.run': 'Run ID',
|
|
1242
|
-
'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
|
|
1243
|
-
'orchestration.openai.status.title': 'OpenAI Chat 运行配置',
|
|
1244
|
-
'orchestration.openai.status.subtitle': '任务节点使用当前 OpenClaw provider;执行前会检查 base URL、API key 和模型。',
|
|
1245
|
-
'orchestration.openai.status.provider': 'Provider',
|
|
1246
|
-
'orchestration.openai.status.model': '模型',
|
|
1247
|
-
'orchestration.openai.status.endpoint': 'Endpoint',
|
|
1248
|
-
'orchestration.openai.status.apiKey': 'API Key',
|
|
1249
|
-
'orchestration.openai.status.headers': '额外 headers',
|
|
1250
|
-
'orchestration.openai.status.configured': '已配置',
|
|
1251
|
-
'orchestration.openai.status.missing': '缺失',
|
|
1252
|
-
'orchestration.openai.status.notSet': '未设置',
|
|
1253
|
-
'orchestration.openai.status.notLoaded': '刷新后加载 OpenAI Chat 就绪状态。',
|
|
1254
|
-
'orchestration.openai.status.configure': '配置 OpenAI Chat',
|
|
1255
|
-
'orchestration.detail.node.output': 'AI 输出',
|
|
1256
|
-
'orchestration.detail.node.endpoint': 'Endpoint:',
|
|
1257
|
-
'orchestration.detail.node.materializedFiles': '物化文件:',
|
|
1258
|
-
'orchestration.detail.node.workspaceFiles': '工作区文件:',
|
|
1259
1006
|
'skills.localLabel': '{target} / 本地 Skills',
|
|
1260
1007
|
'skills.counts': '已装 {installed} · 可导入 {importable}',
|
|
1261
1008
|
|
|
@@ -1265,11 +1012,6 @@ const zh = Object.freeze({
|
|
|
1265
1012
|
'status.range': '统计范围',
|
|
1266
1013
|
'status.totalSessions': '总会话数',
|
|
1267
1014
|
'status.totalMessages': '总消息数',
|
|
1268
|
-
'status.engine': '引擎',
|
|
1269
|
-
'status.concurrency': '并发度',
|
|
1270
|
-
'status.running': '运行中',
|
|
1271
|
-
'status.queued': '排队中',
|
|
1272
|
-
'status.runs': '历史 Runs',
|
|
1273
1015
|
'status.currentTarget': '当前目标',
|
|
1274
1016
|
'status.localSkills': '本地 Skills',
|
|
1275
1017
|
'status.importable': '可导入',
|
|
@@ -1289,7 +1031,6 @@ const zh = Object.freeze({
|
|
|
1289
1031
|
'status.currentModel': '当前模型',
|
|
1290
1032
|
'status.quickSwitchProvider': '快速切换提供商',
|
|
1291
1033
|
'side.usage.meta': '本地统计 / 趋势',
|
|
1292
|
-
'side.orchestration.meta': '计划 / 队列 / Runs',
|
|
1293
1034
|
|
|
1294
1035
|
// Settings panel
|
|
1295
1036
|
'settings.tab.general': '通用',
|
|
@@ -1437,6 +1178,10 @@ const zh = Object.freeze({
|
|
|
1437
1178
|
'settings.timeline.style.dots': '点状',
|
|
1438
1179
|
'settings.timeline.style.bar': '条状',
|
|
1439
1180
|
'settings.timeline.style.hint': '点状适合快速定位,条状更直观显示进度',
|
|
1181
|
+
'settings.configTabs.title': '配置面板可见性',
|
|
1182
|
+
'settings.configTabs.meta': '控制侧栏中哪些配置子页面可见',
|
|
1183
|
+
'settings.configTabs.hint': '关闭后对应的配置子页面将不再显示,至少需保留一个',
|
|
1184
|
+
'settings.configTabs.minRequired': '至少需要保留一个可见的配置页面',
|
|
1440
1185
|
|
|
1441
1186
|
'settings.reset.title': '配置重置',
|
|
1442
1187
|
'settings.reset.meta': '谨慎操作',
|
|
@@ -63,15 +63,6 @@
|
|
|
63
63
|
:class="{ active: isMainTabNavActive('usage') }"
|
|
64
64
|
@pointerdown="onMainTabPointerDown('usage', $event)"
|
|
65
65
|
@click="onMainTabClick('usage', $event)">{{ t('tab.usage') }}</button>
|
|
66
|
-
<button v-if="taskOrchestrationTabEnabled" type="button" class="top-tab top-tab-disabled"
|
|
67
|
-
id="tab-orchestration"
|
|
68
|
-
role="tab"
|
|
69
|
-
data-main-tab="orchestration"
|
|
70
|
-
tabindex="-1"
|
|
71
|
-
aria-selected="false"
|
|
72
|
-
aria-disabled="true"
|
|
73
|
-
disabled
|
|
74
|
-
:title="t('orchestration.rebuilding.body')">{{ t('tab.orchestration') }}</button>
|
|
75
66
|
<button type="button" class="top-tab"
|
|
76
67
|
id="tab-market"
|
|
77
68
|
role="tab"
|
|
@@ -192,6 +183,7 @@
|
|
|
192
183
|
<div class="side-section" role="navigation" :aria-label="t('side.config')">
|
|
193
184
|
<div class="side-section-title">{{ t('side.config') }}</div>
|
|
194
185
|
<button
|
|
186
|
+
v-if="isConfigModeVisible('codex')"
|
|
195
187
|
id="side-tab-config-codex"
|
|
196
188
|
data-main-tab="config"
|
|
197
189
|
data-config-mode="codex"
|
|
@@ -206,6 +198,7 @@
|
|
|
206
198
|
</div>
|
|
207
199
|
</button>
|
|
208
200
|
<button
|
|
201
|
+
v-if="isConfigModeVisible('claude')"
|
|
209
202
|
id="side-tab-config-claude"
|
|
210
203
|
data-main-tab="config"
|
|
211
204
|
data-config-mode="claude"
|
|
@@ -220,6 +213,7 @@
|
|
|
220
213
|
</div>
|
|
221
214
|
</button>
|
|
222
215
|
<button
|
|
216
|
+
v-if="isConfigModeVisible('openclaw')"
|
|
223
217
|
id="side-tab-config-openclaw"
|
|
224
218
|
data-main-tab="config"
|
|
225
219
|
data-config-mode="openclaw"
|
|
@@ -234,6 +228,7 @@
|
|
|
234
228
|
</div>
|
|
235
229
|
</button>
|
|
236
230
|
<button
|
|
231
|
+
v-if="isConfigModeVisible('opencode')"
|
|
237
232
|
id="side-tab-config-opencode"
|
|
238
233
|
data-main-tab="config"
|
|
239
234
|
data-config-mode="opencode"
|
|
@@ -249,6 +244,7 @@
|
|
|
249
244
|
</button>
|
|
250
245
|
|
|
251
246
|
<button
|
|
247
|
+
v-if="isConfigModeVisible('kilocode')"
|
|
252
248
|
id="side-tab-config-kilocode"
|
|
253
249
|
data-main-tab="config"
|
|
254
250
|
data-config-mode="kilocode"
|
|
@@ -311,23 +307,6 @@
|
|
|
311
307
|
</button>
|
|
312
308
|
</div>
|
|
313
309
|
|
|
314
|
-
<div v-if="taskOrchestrationTabEnabled" class="side-section" role="navigation" :aria-label="t('side.orchestration')">
|
|
315
|
-
<div class="side-section-title">{{ t('side.orchestration') }}</div>
|
|
316
|
-
<button
|
|
317
|
-
id="side-tab-orchestration"
|
|
318
|
-
data-main-tab="orchestration"
|
|
319
|
-
class="side-item side-item-disabled"
|
|
320
|
-
aria-disabled="true"
|
|
321
|
-
disabled
|
|
322
|
-
:title="t('orchestration.rebuilding.body')">
|
|
323
|
-
<span class="side-item-icon" aria-hidden="true">T</span>
|
|
324
|
-
<div class="side-item-title">{{ t('tab.orchestration') }}</div>
|
|
325
|
-
<div class="side-item-meta">
|
|
326
|
-
<span>{{ t('orchestration.rebuilding.status') }}</span>
|
|
327
|
-
<span>{{ t('orchestration.rebuilding.title') }}</span>
|
|
328
|
-
</div>
|
|
329
|
-
</button>
|
|
330
|
-
</div>
|
|
331
310
|
|
|
332
311
|
<div class="side-section" role="navigation" :aria-label="t('side.skills')">
|
|
333
312
|
<div class="side-section-title">{{ t('side.skills') }}</div>
|
|
@@ -520,28 +499,6 @@
|
|
|
520
499
|
<span class="value">{{ sessionUsageSummaryCards[1] ? sessionUsageSummaryCards[1].value : 0 }}</span>
|
|
521
500
|
</div>
|
|
522
501
|
</div>
|
|
523
|
-
<div class="status-strip" v-else-if="!sessionStandalone && taskOrchestrationTabEnabled && mainTab === 'orchestration'">
|
|
524
|
-
<div class="status-chip">
|
|
525
|
-
<span class="label">{{ t('status.engine') }}</span>
|
|
526
|
-
<span class="value">{{ taskOrchestration.selectedEngine === 'workflow' ? 'Workflow' : 'Codex' }}</span>
|
|
527
|
-
</div>
|
|
528
|
-
<div class="status-chip">
|
|
529
|
-
<span class="label">{{ t('status.concurrency') }}</span>
|
|
530
|
-
<span class="value">{{ taskOrchestration.concurrency }}</span>
|
|
531
|
-
</div>
|
|
532
|
-
<div class="status-chip">
|
|
533
|
-
<span class="label">{{ t('status.running') }}</span>
|
|
534
|
-
<span class="value">{{ taskOrchestrationQueueStats.running }}</span>
|
|
535
|
-
</div>
|
|
536
|
-
<div class="status-chip">
|
|
537
|
-
<span class="label">{{ t('status.queued') }}</span>
|
|
538
|
-
<span class="value">{{ taskOrchestrationQueueStats.queued }}</span>
|
|
539
|
-
</div>
|
|
540
|
-
<div class="status-chip">
|
|
541
|
-
<span class="label">{{ t('status.runs') }}</span>
|
|
542
|
-
<span class="value">{{ taskOrchestration.runs.length }}</span>
|
|
543
|
-
</div>
|
|
544
|
-
</div>
|
|
545
502
|
<div class="status-strip" v-else-if="!sessionStandalone && mainTab === 'market'">
|
|
546
503
|
<div class="status-chip">
|
|
547
504
|
<span class="label">{{ t('status.currentTarget') }}</span>
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
role="tabpanel"
|
|
7
7
|
:aria-labelledby="forceCompactLayout ? 'tab-config' : 'side-tab-config-claude'">
|
|
8
8
|
<div v-if="forceCompactLayout && !sessionStandalone" class="segmented-control">
|
|
9
|
-
<button type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
-
<button type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
-
<button type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
9
|
+
<button v-if="isConfigModeVisible('codex')" type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
+
<button v-if="isConfigModeVisible('claude')" type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
+
<button v-if="isConfigModeVisible('openclaw')" type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
12
12
|
</div>
|
|
13
13
|
<template v-if="shouldShowCliInstallPlaceholder('claude')">
|
|
14
14
|
<div class="selector-section">
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
role="tabpanel"
|
|
7
7
|
:aria-labelledby="forceCompactLayout ? 'tab-config' : ('side-tab-config-' + configMode)">
|
|
8
8
|
<div v-if="forceCompactLayout && !sessionStandalone" class="segmented-control">
|
|
9
|
-
<button type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
-
<button type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
-
<button type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
9
|
+
<button v-if="isConfigModeVisible('codex')" type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
+
<button v-if="isConfigModeVisible('claude')" type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
+
<button v-if="isConfigModeVisible('openclaw')" type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
12
12
|
</div>
|
|
13
13
|
<template v-if="isCodexConfigMode && shouldShowCliInstallPlaceholder('codex')">
|
|
14
14
|
<div class="selector-section">
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
role="tabpanel"
|
|
7
7
|
:aria-labelledby="forceCompactLayout ? 'tab-config' : 'side-tab-config-kilocode'">
|
|
8
8
|
<div v-if="forceCompactLayout && !sessionStandalone" class="segmented-control">
|
|
9
|
-
<button type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
-
<button type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
-
<button type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
12
|
-
<button type="button" :class="['segment', { active: configMode === 'opencode' }]" @click="switchConfigMode('opencode')">{{ t('tab.config.opencode') }}</button>
|
|
13
|
-
<button type="button" :class="['segment', { active: configMode === 'kilocode' }]" @click="switchConfigMode('kilocode')">{{ t('tab.config.kilocode') }}</button>
|
|
9
|
+
<button v-if="isConfigModeVisible('codex')" type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
+
<button v-if="isConfigModeVisible('claude')" type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
+
<button v-if="isConfigModeVisible('openclaw')" type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
12
|
+
<button v-if="isConfigModeVisible('opencode')" type="button" :class="['segment', { active: configMode === 'opencode' }]" @click="switchConfigMode('opencode')">{{ t('tab.config.opencode') }}</button>
|
|
13
|
+
<button v-if="isConfigModeVisible('kilocode')" type="button" :class="['segment', { active: configMode === 'kilocode' }]" @click="switchConfigMode('kilocode')">{{ t('tab.config.kilocode') }}</button>
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
16
|
<section class="tool-config-write-card" :aria-label="t('toolConfig.kilocode.title')">
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
role="tabpanel"
|
|
7
7
|
:aria-labelledby="forceCompactLayout ? 'tab-config' : 'side-tab-config-openclaw'">
|
|
8
8
|
<div v-if="forceCompactLayout && !sessionStandalone" class="segmented-control">
|
|
9
|
-
<button type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
-
<button type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
-
<button type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
9
|
+
<button v-if="isConfigModeVisible('codex')" type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
+
<button v-if="isConfigModeVisible('claude')" type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
+
<button v-if="isConfigModeVisible('openclaw')" type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
12
12
|
</div>
|
|
13
13
|
<div class="openclaw-layout">
|
|
14
14
|
<section class="tool-config-write-card" :aria-label="t('toolConfig.openclaw.title')">
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
role="tabpanel"
|
|
7
7
|
:aria-labelledby="forceCompactLayout ? 'tab-config' : 'side-tab-config-opencode'">
|
|
8
8
|
<div v-if="forceCompactLayout && !sessionStandalone" class="segmented-control">
|
|
9
|
-
<button type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
-
<button type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
-
<button type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
12
|
-
<button type="button" :class="['segment', { active: configMode === 'opencode' }]" @click="switchConfigMode('opencode')">{{ t('tab.config.opencode') }}</button>
|
|
13
|
-
<button type="button" :class="['segment', { active: configMode === 'kilocode' }]" @click="switchConfigMode('kilocode')">{{ t('tab.config.kilocode') }}</button>
|
|
9
|
+
<button v-if="isConfigModeVisible('codex')" type="button" :class="['segment', { active: configMode === 'codex' }]" @click="switchConfigMode('codex')">{{ t('tab.config.codex') }}</button>
|
|
10
|
+
<button v-if="isConfigModeVisible('claude')" type="button" :class="['segment', { active: configMode === 'claude' }]" @click="switchConfigMode('claude')">{{ t('tab.config.claude') }}</button>
|
|
11
|
+
<button v-if="isConfigModeVisible('openclaw')" type="button" :class="['segment', { active: configMode === 'openclaw' }]" @click="switchConfigMode('openclaw')">{{ t('tab.config.openclaw') }}</button>
|
|
12
|
+
<button v-if="isConfigModeVisible('opencode')" type="button" :class="['segment', { active: configMode === 'opencode' }]" @click="switchConfigMode('opencode')">{{ t('tab.config.opencode') }}</button>
|
|
13
|
+
<button v-if="isConfigModeVisible('kilocode')" type="button" :class="['segment', { active: configMode === 'kilocode' }]" @click="switchConfigMode('kilocode')">{{ t('tab.config.kilocode') }}</button>
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
16
|
<section class="tool-config-write-card" :aria-label="t('opencode.writeAria')">
|
|
@@ -129,27 +129,6 @@
|
|
|
129
129
|
<span>{{ sessionsUsageList.filter(session => !(session && typeof session.model === 'string' && session.model.trim())).length }}</span>
|
|
130
130
|
</div>
|
|
131
131
|
</button>
|
|
132
|
-
<button
|
|
133
|
-
v-if="taskOrchestrationTabEnabled"
|
|
134
|
-
type="button"
|
|
135
|
-
class="doctor-card"
|
|
136
|
-
@click="switchMainTab('orchestration')"
|
|
137
|
-
:disabled="loading || !!initError">
|
|
138
|
-
<div class="doctor-card-title">{{ t('dashboard.card.tasks') }}</div>
|
|
139
|
-
<div class="doctor-card-meta">
|
|
140
|
-
<span>{{ taskOrchestration && taskOrchestration.loading ? t('dashboard.state.loading') : t('dashboard.state.ready') }}</span>
|
|
141
|
-
<span>·</span>
|
|
142
|
-
<span>{{ t('dashboard.tasks.queue', { running: taskOrchestrationQueueStats.running, queued: taskOrchestrationQueueStats.queued }) }}</span>
|
|
143
|
-
</div>
|
|
144
|
-
<div class="doctor-card-kv" v-if="taskOrchestration && taskOrchestration.planIssues && taskOrchestration.planIssues.length">
|
|
145
|
-
<span>{{ t('dashboard.kv.blockers') }}</span>
|
|
146
|
-
<span>{{ taskOrchestration.planIssues.length }}</span>
|
|
147
|
-
</div>
|
|
148
|
-
<div class="doctor-card-kv" v-else>
|
|
149
|
-
<span>{{ t('dashboard.kv.runs') }}</span>
|
|
150
|
-
<span>{{ taskOrchestration && taskOrchestration.runs ? taskOrchestration.runs.length : 0 }}</span>
|
|
151
|
-
</div>
|
|
152
|
-
</button>
|
|
153
132
|
<button type="button" class="doctor-card" @click="switchMainTab('market')" :disabled="loading || !!initError">
|
|
154
133
|
<div class="doctor-card-title">{{ t('dashboard.card.skills') }}</div>
|
|
155
134
|
<div class="doctor-card-meta">
|