codexmate 0.1.8 → 0.1.10
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/cli.js +63 -2696
- package/package.json +1 -1
- package/web-ui/app.js +27 -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.index.mjs +1 -3
- package/web-ui/modules/app.methods.navigation.mjs +1 -2
- package/web-ui/modules/app.methods.session-actions.mjs +146 -21
- package/web-ui/modules/app.methods.session-browser.mjs +5 -0
- package/web-ui/modules/app.methods.web-ui-preferences.mjs +20 -9
- package/web-ui/modules/i18n/locales/en.mjs +14 -265
- package/web-ui/modules/i18n/locales/ja.mjs +14 -265
- package/web-ui/modules/i18n/locales/vi.mjs +14 -266
- package/web-ui/modules/i18n/locales/zh-tw.mjs +14 -265
- package/web-ui/modules/i18n/locales/zh.mjs +14 -265
- package/web-ui/partials/index/layout-header.html +0 -48
- package/web-ui/partials/index/panel-dashboard.html +0 -21
- package/web-ui/partials/index/panel-sessions.html +30 -2
- package/web-ui/res/web-ui-render.precompiled.js +105 -1193
- package/web-ui/session-helpers.mjs +3 -16
- package/web-ui/styles/sessions-list.css +96 -0
- 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
|
@@ -135,7 +135,6 @@ const zh = Object.freeze({
|
|
|
135
135
|
'tab.config.opencode': 'OpenCode',
|
|
136
136
|
'tab.sessions': '会话',
|
|
137
137
|
'tab.usage': '用量',
|
|
138
|
-
'tab.orchestration': '任务',
|
|
139
138
|
'tab.market': 'Skills',
|
|
140
139
|
'tab.plugins': '插件',
|
|
141
140
|
'tab.settings': '设置',
|
|
@@ -151,7 +150,6 @@ const zh = Object.freeze({
|
|
|
151
150
|
'side.prompts.meta': '提示词文件与预设',
|
|
152
151
|
'side.plugins': '插件',
|
|
153
152
|
'side.system': '系统',
|
|
154
|
-
'side.orchestration': '任务',
|
|
155
153
|
'side.skills': 'Skills',
|
|
156
154
|
'side.collapse': '收起侧边栏',
|
|
157
155
|
'side.expand': '展开侧边栏',
|
|
@@ -200,7 +198,6 @@ const zh = Object.freeze({
|
|
|
200
198
|
'kicker.config': 'Configuration',
|
|
201
199
|
'kicker.sessions': 'Sessions',
|
|
202
200
|
'kicker.usage': 'Usage',
|
|
203
|
-
'kicker.orchestration': 'Tasks',
|
|
204
201
|
'kicker.market': 'Skills',
|
|
205
202
|
'kicker.plugins': 'Plugins',
|
|
206
203
|
'kicker.docs': 'Docs',
|
|
@@ -212,7 +209,6 @@ const zh = Object.freeze({
|
|
|
212
209
|
'title.config': '本地配置控制台',
|
|
213
210
|
'title.sessions': '会话与导出',
|
|
214
211
|
'title.usage': '本地用量与趋势',
|
|
215
|
-
'title.orchestration': '任务线程',
|
|
216
212
|
'title.market': 'Skills 安装与同步',
|
|
217
213
|
'title.plugins': '插件与模板',
|
|
218
214
|
'title.docs': 'CLI 安装与文档',
|
|
@@ -223,7 +219,6 @@ const zh = Object.freeze({
|
|
|
223
219
|
'subtitle.config': '管理本地配置与模型。',
|
|
224
220
|
'subtitle.sessions': '浏览与导出会话。',
|
|
225
221
|
'subtitle.usage': '查看近 7 / 30 天用量。',
|
|
226
|
-
'subtitle.orchestration': '像聊天一样整理任务,准备好后发送 /plan。',
|
|
227
222
|
'subtitle.market': '管理本地 Skills。',
|
|
228
223
|
'subtitle.plugins': '管理模板化 prompt 与可复用插件。',
|
|
229
224
|
'subtitle.docs': '查看 CLI 安装命令与排障。',
|
|
@@ -231,7 +226,7 @@ const zh = Object.freeze({
|
|
|
231
226
|
'subtitle.prompts': '编辑 AGENTS.md 与 CLAUDE.md。',
|
|
232
227
|
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
233
228
|
'prompts.subTab.project': 'CLAUDE.md',
|
|
234
|
-
'prompts.subTab.system': 'System Prompt',
|
|
229
|
+
'prompts.subTab.system': 'System Prompt (Pi)',
|
|
235
230
|
'prompts.subTab.presets': '预设池',
|
|
236
231
|
'prompts.presets.title': '预设池',
|
|
237
232
|
'prompts.presets.hint': '管理预设。',
|
|
@@ -305,15 +300,12 @@ const zh = Object.freeze({
|
|
|
305
300
|
'dashboard.card.config': '配置',
|
|
306
301
|
'dashboard.card.sessions': '会话',
|
|
307
302
|
'dashboard.card.usage': '用量',
|
|
308
|
-
'dashboard.card.tasks': '任务',
|
|
309
303
|
'dashboard.card.skills': 'Skills',
|
|
310
304
|
'dashboard.kv.model': '模型',
|
|
311
305
|
'dashboard.kv.issue': '异常',
|
|
312
306
|
'dashboard.kv.active': '当前',
|
|
313
307
|
'dashboard.kv.sessions': '会话数',
|
|
314
308
|
'dashboard.kv.missingModel': '缺失模型',
|
|
315
|
-
'dashboard.kv.blockers': '阻塞',
|
|
316
|
-
'dashboard.kv.runs': '运行',
|
|
317
309
|
'dashboard.kv.target': '目标',
|
|
318
310
|
'dashboard.kv.root': '目录',
|
|
319
311
|
'dashboard.status.health': '健康',
|
|
@@ -325,7 +317,6 @@ const zh = Object.freeze({
|
|
|
325
317
|
'dashboard.busy.configApply': '配置应用',
|
|
326
318
|
'dashboard.busy.agents': 'AGENTS 保存',
|
|
327
319
|
'dashboard.busy.skills': 'Skills 管理',
|
|
328
|
-
'dashboard.busy.tasks': '任务编排',
|
|
329
320
|
'dashboard.busy.idle': '空闲',
|
|
330
321
|
'dashboard.message.none': '暂无提示',
|
|
331
322
|
'dashboard.sessionSource.codex': 'Codex',
|
|
@@ -352,7 +343,6 @@ const zh = Object.freeze({
|
|
|
352
343
|
'dashboard.none': '无',
|
|
353
344
|
'dashboard.sessions.count': '{count} 条会话',
|
|
354
345
|
'dashboard.usage.range': '范围 {value}',
|
|
355
|
-
'dashboard.tasks.queue': 'run {running} / queue {queued}',
|
|
356
346
|
'dashboard.skills.count': 'installed {installed} / import {importable}',
|
|
357
347
|
'dashboard.providersHealth.title': 'Provider 健康状态',
|
|
358
348
|
'dashboard.providersHealth.current': '(当前)',
|
|
@@ -663,6 +653,19 @@ const zh = Object.freeze({
|
|
|
663
653
|
'sessions.copyResume': '复制恢复命令',
|
|
664
654
|
'sessions.preview.refresh': '刷新内容',
|
|
665
655
|
'sessions.preview.loading': '加载中...',
|
|
656
|
+
'sessions.batch.select': '批量删除',
|
|
657
|
+
'sessions.batch.exit': '退出选择',
|
|
658
|
+
'sessions.batch.selectAll': '全选',
|
|
659
|
+
'sessions.batch.unselectAll': '取消全选',
|
|
660
|
+
'sessions.batch.deleteSelected': '删除选中',
|
|
661
|
+
'sessions.batch.deleteSelectedN': '删除选中({count})',
|
|
662
|
+
'sessions.batch.deletingSelected': '删除中...',
|
|
663
|
+
'sessions.batch.deleteConfirm': '确定删除选中的 {count} 个会话吗?',
|
|
664
|
+
'sessions.batch.deleteConfirmHard': '确定永久删除选中的 {count} 个会话吗?该操作不可恢复。',
|
|
665
|
+
'sessions.batch.deleteHint': '已选 {count} 个',
|
|
666
|
+
'sessions.batch.emptySelection': '请先选择要删除的会话',
|
|
667
|
+
'sessions.batch.partialFail': '其中 {failed} 个删除失败,已保留选中',
|
|
668
|
+
'sessions.batch.allFail': '删除失败,请重试',
|
|
666
669
|
'sessions.preview.deleteHard': '直接删除',
|
|
667
670
|
'sessions.preview.moveToTrash': '移入回收站',
|
|
668
671
|
'sessions.preview.deleting': '删除中...',
|
|
@@ -995,254 +998,6 @@ const zh = Object.freeze({
|
|
|
995
998
|
'usage.range.all': '全部',
|
|
996
999
|
'usage.range.7d.short': '近 7 天',
|
|
997
1000
|
'usage.range.30d.short': '近 30 天',
|
|
998
|
-
'orchestration.queueStats': '队列 {running} 运行中 · {queued} 等待中',
|
|
999
|
-
'orchestration.rebuilding.status': '暂停开放',
|
|
1000
|
-
'orchestration.rebuilding.title': '重建中',
|
|
1001
|
-
'orchestration.rebuilding.body': '任务编排入口暂时保留展示,但当前不可点击。',
|
|
1002
|
-
'orchestration.hero.kicker': '任务编排',
|
|
1003
|
-
'orchestration.hero.title': '任务编排',
|
|
1004
|
-
'orchestration.hero.subtitle': '规划、执行并追踪任务,保留工作区与线程上下文。',
|
|
1005
|
-
'orchestration.quick.kicker': '任务输入',
|
|
1006
|
-
'orchestration.quick.title': '输入任务目标',
|
|
1007
|
-
'orchestration.quick.subtitle': '描述目标、约束和验收标准。执行前可用 /plan 预览计划。',
|
|
1008
|
-
'orchestration.quick.caption': 'Enter 追加需求;/plan 预览计划;开始执行会生成计划并运行。',
|
|
1009
|
-
'orchestration.quick.templates.reviewFix.meta': '处理 review 反馈并补回归验证。',
|
|
1010
|
-
'orchestration.quick.templates.planOnly.meta': '先排查规划,不写入文件。',
|
|
1011
|
-
'orchestration.quick.templates.workflowBatch.meta': '复用本地 Workflow 跑固定检查。',
|
|
1012
|
-
'orchestration.chat.input.label': '任务消息',
|
|
1013
|
-
'orchestration.chat.input.placeholder': '描述目标、约束和验收标准;输入 /plan 预览计划。',
|
|
1014
|
-
'orchestration.chat.input.hint': '工作区、线程和运行模式可在高级设置中调整。',
|
|
1015
|
-
'orchestration.chat.context.aria': '任务上下文',
|
|
1016
|
-
'orchestration.chat.context.workspace.auto': '工作区自动推断',
|
|
1017
|
-
'orchestration.chat.context.workspace.value': '工作区 {value}',
|
|
1018
|
-
'orchestration.chat.context.thread.auto': '线程自动生成',
|
|
1019
|
-
'orchestration.chat.context.thread.value': '线程 {value}',
|
|
1020
|
-
'orchestration.chat.context.sequence.empty': '顺序:等待需求 1',
|
|
1021
|
-
'orchestration.chat.context.sequence.value': '顺序:{count} 条需求',
|
|
1022
|
-
'orchestration.privacy.workspace.selected': '已选择工作区',
|
|
1023
|
-
'orchestration.privacy.thread.selected': '已选择线程',
|
|
1024
|
-
'orchestration.chat.thread.aria': '任务对话',
|
|
1025
|
-
'orchestration.chat.input.send': '追加需求',
|
|
1026
|
-
'orchestration.chat.input.discuss': '预览计划',
|
|
1027
|
-
'orchestration.chat.input.work': '开始执行',
|
|
1028
|
-
'orchestration.chat.input.firstHint': '这会成为需求 1。',
|
|
1029
|
-
'orchestration.chat.input.workHint': '执行前会先合并当前输入。',
|
|
1030
|
-
'orchestration.chat.input.workCaption': 'Enter 追加需求;/plan 只预览;开始执行会规划并运行。',
|
|
1031
|
-
'orchestration.chat.input.sequenceHint': '现在发送会成为需求 {count}。',
|
|
1032
|
-
'orchestration.chat.assistant.contextLabel': '上一轮上下文',
|
|
1033
|
-
'orchestration.chat.assistant.contextFallback': '已选中一个历史任务,继续时会继承它的线程和工作区。',
|
|
1034
|
-
'orchestration.chat.assistant.resultLabel': '实现结果',
|
|
1035
|
-
'orchestration.chat.assistant.filesSummary': '文件操作:{files}',
|
|
1036
|
-
'orchestration.chat.assistant.readyLabel': 'Codexmate',
|
|
1037
|
-
'orchestration.chat.assistant.empty': '输入任务目标。多条需求会按顺序执行并保留上下文。',
|
|
1038
|
-
'orchestration.chat.assistant.planLabel': '计划预览',
|
|
1039
|
-
'orchestration.chat.assistant.planSummary': '计划已生成:{nodes} 个节点,{waves} 个批次。',
|
|
1040
|
-
'orchestration.chat.assistant.sequenceReady': '已收到多条需求;执行时会先完成需求 1,再带着上下文继续后续需求。',
|
|
1041
|
-
'orchestration.chat.assistant.singleReady': '已收到需求。可继续追加,或输入 /plan 预览计划。',
|
|
1042
|
-
'orchestration.chat.user.step': '需求 {count}',
|
|
1043
|
-
'orchestration.chat.meta.thread': '线程 {value}',
|
|
1044
|
-
'orchestration.chat.meta.workspace': '工作区 {value}',
|
|
1045
|
-
'orchestration.chat.meta.order': '顺序执行 · 保留上下文',
|
|
1046
|
-
'orchestration.chat.meta.first': '先完成这一条',
|
|
1047
|
-
'orchestration.chat.meta.afterPrevious': '等待前一条完成后继续',
|
|
1048
|
-
'orchestration.chat.meta.contextKept': '上下文会随线程保留',
|
|
1049
|
-
'orchestration.chat.meta.previewNext': '下一步:/plan 预览',
|
|
1050
|
-
'orchestration.quick.checklist.title': '执行检查',
|
|
1051
|
-
'orchestration.quick.checklist.subtitle': '只保留真正影响执行的阻塞项。',
|
|
1052
|
-
'orchestration.agent.aria': '任务编排状态',
|
|
1053
|
-
'orchestration.agent.kicker': '任务编排',
|
|
1054
|
-
'orchestration.agent.title': '任务编排控制台',
|
|
1055
|
-
'orchestration.agent.subtitle': '选择工作区与会话,执行任务,并查看运行详情。',
|
|
1056
|
-
'orchestration.agent.state.ready': 'Ready',
|
|
1057
|
-
'orchestration.agent.state.planning': 'Planning',
|
|
1058
|
-
'orchestration.agent.state.running': 'Running',
|
|
1059
|
-
'orchestration.agent.surface.workspace': 'Workspace',
|
|
1060
|
-
'orchestration.agent.surface.session': '上下文',
|
|
1061
|
-
'orchestration.agent.surface.mode': 'Mode',
|
|
1062
|
-
'orchestration.agent.surface.trace': 'Trace',
|
|
1063
|
-
'orchestration.agent.surface.runs': 'runs',
|
|
1064
|
-
'orchestration.agent.surface.queue': 'queued',
|
|
1065
|
-
'orchestration.agent.trace.title': 'Live trace',
|
|
1066
|
-
'orchestration.agent.trace.plan': 'Plan nodes',
|
|
1067
|
-
'orchestration.agent.trace.queue': 'Queue',
|
|
1068
|
-
'orchestration.agent.trace.runs': 'Runs',
|
|
1069
|
-
'orchestration.agent.trace.nodes': 'Run nodes',
|
|
1070
|
-
'orchestration.quick.status.title': '当前草稿',
|
|
1071
|
-
'orchestration.workspace.aria': '工作区与会话',
|
|
1072
|
-
'orchestration.workspace.title': '工作区',
|
|
1073
|
-
'orchestration.workspace.subtitle': '选择项目,再为该项目新建或恢复会话。',
|
|
1074
|
-
'orchestration.workspace.selector': '工作区选择',
|
|
1075
|
-
'orchestration.workspace.counts': '{runs} runs · {queue} queue',
|
|
1076
|
-
'orchestration.workspace.newSession': '+ 新建',
|
|
1077
|
-
'orchestration.workspace.sessions.title': '记录',
|
|
1078
|
-
'orchestration.workspace.sessions.empty.title': '暂无记录',
|
|
1079
|
-
'orchestration.workspace.sessions.empty.subtitle': '新建记录,或刷新后选择已有运行记录。',
|
|
1080
|
-
'orchestration.workspace.sessions.queueTitle': '排队项',
|
|
1081
|
-
'orchestration.workspace.sessions.runTitle': '运行记录',
|
|
1082
|
-
'orchestration.workspace.sessions.detailsHidden': '详情已隐藏',
|
|
1083
|
-
'orchestration.workspace.pathHidden': '路径已隐藏',
|
|
1084
|
-
'orchestration.draft.reset': '重置草稿',
|
|
1085
|
-
'orchestration.summary.aria': '任务编排概览',
|
|
1086
|
-
'orchestration.summary.running': '运行中',
|
|
1087
|
-
'orchestration.summary.queued': '排队中',
|
|
1088
|
-
'orchestration.summary.runs': '运行记录',
|
|
1089
|
-
'orchestration.readiness.target.label': '任务目标',
|
|
1090
|
-
'orchestration.readiness.target.done': '已填写目标',
|
|
1091
|
-
'orchestration.readiness.target.missing': '未填写目标',
|
|
1092
|
-
'orchestration.readiness.sequence.label': '顺序',
|
|
1093
|
-
'orchestration.readiness.sequence.missing': '先发送需求 1',
|
|
1094
|
-
'orchestration.readiness.sequence.single': '当前只有需求 1;继续发送会变成需求 2。',
|
|
1095
|
-
'orchestration.readiness.sequence.multiple': '{count} 条需求会按顺序执行:先完成需求 1,再继续需求 2。',
|
|
1096
|
-
'orchestration.readiness.engine.label': '执行策略',
|
|
1097
|
-
'orchestration.readiness.engine.openaiChat': '使用 OpenAI Chat-compatible 节点',
|
|
1098
|
-
'orchestration.readiness.workflow.done': '已选 {count} 个 Workflow',
|
|
1099
|
-
'orchestration.readiness.workflow.missing': '还没选 Workflow ID',
|
|
1100
|
-
'orchestration.readiness.scope.label': '边界',
|
|
1101
|
-
'orchestration.readiness.scope.done': '已补充说明',
|
|
1102
|
-
'orchestration.readiness.scope.writeHint': '建议补说明后再写入',
|
|
1103
|
-
'orchestration.readiness.scope.readonlyHint': '当前是只读,可直接试',
|
|
1104
|
-
'orchestration.readiness.preview.label': '预览',
|
|
1105
|
-
'orchestration.readiness.preview.missing': '还没发送 /plan',
|
|
1106
|
-
'orchestration.readiness.preview.blocked': '有 {count} 个阻塞项',
|
|
1107
|
-
'orchestration.readiness.preview.ready': '计划可用,{count} 个节点',
|
|
1108
|
-
'orchestration.readiness.empty.title': '填写任务目标',
|
|
1109
|
-
'orchestration.readiness.empty.summary': '先明确目标、约束和验收标准。',
|
|
1110
|
-
'orchestration.readiness.workflow.title': '缺少 Workflow',
|
|
1111
|
-
'orchestration.readiness.workflow.summary': '你已经选了 Workflow 模式,但还没指定可复用流程。',
|
|
1112
|
-
'orchestration.readiness.preview.title': '建议预览计划',
|
|
1113
|
-
'orchestration.readiness.preview.summary': '目标已填写。可用 /plan 确认节点和依赖。',
|
|
1114
|
-
'orchestration.readiness.preview.sequenceSummary': '草稿已成形,已锁定 {count} 条顺序需求:先完成需求 1,再继续需求 2。',
|
|
1115
|
-
'orchestration.readiness.blocked.title': '预览有阻塞',
|
|
1116
|
-
'orchestration.readiness.blocked.summary': '当前计划里还有 {count} 个阻塞项,先处理它们。',
|
|
1117
|
-
'orchestration.readiness.warn.title': '可以执行,但有提醒',
|
|
1118
|
-
'orchestration.readiness.warn.summary': '/plan 方案已生成,但还有 {count} 条提醒值得先看一眼。',
|
|
1119
|
-
'orchestration.readiness.dryRun.title': '适合先预演',
|
|
1120
|
-
'orchestration.readiness.dryRun.summary': '现在可以安全地跑一次仅预演,先看结果再决定是否真实执行。',
|
|
1121
|
-
'orchestration.readiness.ready.title': '可以执行',
|
|
1122
|
-
'orchestration.readiness.ready.withFollowUps': '已锁定 {count} 条顺序需求:先完成需求 1,再带上下文继续需求 2。',
|
|
1123
|
-
'orchestration.readiness.ready.summary': '目标清晰,可以执行或入队。',
|
|
1124
|
-
'orchestration.step1.title': '先把结果写清楚',
|
|
1125
|
-
'orchestration.step1.subtitle': '只写会影响执行的内容。',
|
|
1126
|
-
'orchestration.templates.title': '快捷示例',
|
|
1127
|
-
'orchestration.templates.reviewFix.label': '修 review + 回归',
|
|
1128
|
-
'orchestration.templates.reviewFix.target': '修复当前 PR review 评论,并补对应回归测试',
|
|
1129
|
-
'orchestration.templates.reviewFix.notes': '不要改动无关模块;需要给出验证结果',
|
|
1130
|
-
'orchestration.templates.reviewFix.followUps': '继续处理新增 review 评论\n最后更新 PR 摘要',
|
|
1131
|
-
'orchestration.templates.planOnly.label': '只做排查规划',
|
|
1132
|
-
'orchestration.templates.planOnly.target': '先排查问题根因并给出执行计划,不直接修改代码',
|
|
1133
|
-
'orchestration.templates.planOnly.notes': '优先定位根因、影响范围和风险点',
|
|
1134
|
-
'orchestration.templates.workflowBatch.label': 'Workflow 批处理',
|
|
1135
|
-
'orchestration.templates.workflowBatch.target': '用 Workflow 跑一组固定检查并整理结果',
|
|
1136
|
-
'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
|
|
1137
|
-
'orchestration.templates.workflowBatch.notes': '输出统一结论,避免重复描述',
|
|
1138
|
-
'orchestration.fields.target': '任务消息',
|
|
1139
|
-
'orchestration.fields.target.placeholder': '例如:修复当前 PR review 评论,补对应回归测试,并避免改无关模块',
|
|
1140
|
-
'orchestration.fields.target.hint': '像发消息一样写清结果、边界和验收标准就够了。',
|
|
1141
|
-
'orchestration.engine.openaiChat': 'OpenAI Chat',
|
|
1142
|
-
'orchestration.engine.workflow': 'Workflow',
|
|
1143
|
-
'orchestration.runMode.write': '写入',
|
|
1144
|
-
'orchestration.runMode.readOnly': '只读',
|
|
1145
|
-
'orchestration.runMode.dryRun': '仅预演',
|
|
1146
|
-
'orchestration.pills.sequenceCount': '顺序需求 {count}',
|
|
1147
|
-
'orchestration.pills.hasTitle': '标题已设',
|
|
1148
|
-
'orchestration.pills.workflowCount': 'Workflow {count}',
|
|
1149
|
-
'orchestration.pills.planNodes': '计划 {count} 节点',
|
|
1150
|
-
'orchestration.step2.title': '选择执行方式',
|
|
1151
|
-
'orchestration.step2.subtitle': '常用项默认展开,其余放高级设置。',
|
|
1152
|
-
'orchestration.fields.engine': '引擎',
|
|
1153
|
-
'orchestration.fields.runMode': '运行模式',
|
|
1154
|
-
'orchestration.advanced.title': '高级设置',
|
|
1155
|
-
'orchestration.advanced.open': '设置',
|
|
1156
|
-
'orchestration.fields.title': '标题',
|
|
1157
|
-
'orchestration.fields.title.placeholder': '可选,默认从目标自动提取',
|
|
1158
|
-
'orchestration.fields.notes': '说明',
|
|
1159
|
-
'orchestration.fields.notes.placeholder': '例如:不要重写现有架构,只做增量实现',
|
|
1160
|
-
'orchestration.fields.notes.hint': '补边界、禁区、风格要求或验证要求。',
|
|
1161
|
-
'orchestration.fields.workspacePath': '工作区路径',
|
|
1162
|
-
'orchestration.fields.workspacePath.placeholder': '例如:/home/me/project',
|
|
1163
|
-
'orchestration.fields.workspacePath.hint': '计划、执行和队列都会使用这个 cwd;留空则使用服务当前目录。',
|
|
1164
|
-
'orchestration.fields.threadId': '任务线程 ID',
|
|
1165
|
-
'orchestration.fields.threadId.placeholder': '可选;留空自动生成',
|
|
1166
|
-
'orchestration.fields.threadId.hint': '同一线程用于连续追加要求、重试和队列追踪。',
|
|
1167
|
-
'orchestration.fields.followUps': '后续动作(每行一条)',
|
|
1168
|
-
'orchestration.fields.followUps.placeholder': '例如:\n继续处理 review 评论\n最后补回归测试',
|
|
1169
|
-
'orchestration.fields.concurrency': '并发',
|
|
1170
|
-
'orchestration.fields.concurrency.hint': '复杂任务先从 1~2 开始更稳。',
|
|
1171
|
-
'orchestration.fields.autoFixRounds': '自动修复',
|
|
1172
|
-
'orchestration.fields.autoFixRounds.hint': '失败后自动再试几轮。',
|
|
1173
|
-
'orchestration.fields.workflowIds': 'Workflow ID(每行一条)',
|
|
1174
|
-
'orchestration.fields.workflowIds.placeholder': '例如:\ndiagnose-config\nsafe-provider-switch',
|
|
1175
|
-
'orchestration.fields.workflowIds.hint': '仅 Workflow 模式需要。当前本地可用 {count} 个。',
|
|
1176
|
-
'orchestration.workflow.stepCount': '{count} 步',
|
|
1177
|
-
'orchestration.step3.title': '先预览,再执行',
|
|
1178
|
-
'orchestration.step3.subtitle': '先确认计划,再决定立即执行还是入队。',
|
|
1179
|
-
'orchestration.actions.planning': '规划中...',
|
|
1180
|
-
'orchestration.actions.previewOnly': '仅预览',
|
|
1181
|
-
'orchestration.actions.preparing': '准备中...',
|
|
1182
|
-
'orchestration.actions.generatePlan': '发送 /plan',
|
|
1183
|
-
'orchestration.actions.planAndRun': '预览 /plan 并执行',
|
|
1184
|
-
'orchestration.actions.processing': '处理中...',
|
|
1185
|
-
'orchestration.actions.queueAndStart': '入队并开始',
|
|
1186
|
-
'orchestration.actions.caption': '执行前会按需刷新计划;批量任务可入队运行。',
|
|
1187
|
-
'orchestration.stage.title': '任务阶段',
|
|
1188
|
-
'orchestration.stage.subtitle': '填写目标、预览计划,然后执行。',
|
|
1189
|
-
'orchestration.stage.pill.target': '写任务消息',
|
|
1190
|
-
'orchestration.stage.pill.preview': '预览',
|
|
1191
|
-
'orchestration.stage.pill.run': '执行或入队',
|
|
1192
|
-
'orchestration.plan.title': '计划预览',
|
|
1193
|
-
'orchestration.plan.subtitle': '确认节点、批次和依赖关系。',
|
|
1194
|
-
'orchestration.plan.summary.nodes': '节点数',
|
|
1195
|
-
'orchestration.plan.summary.waves': '波次',
|
|
1196
|
-
'orchestration.plan.summary.engine': '引擎',
|
|
1197
|
-
'orchestration.plan.summary.threadId': '线程 ID',
|
|
1198
|
-
'orchestration.plan.summary.cwd': '工作区',
|
|
1199
|
-
'orchestration.plan.node.write': 'write',
|
|
1200
|
-
'orchestration.plan.node.readOnly': 'read-only',
|
|
1201
|
-
'orchestration.labels.dependencies': '依赖:',
|
|
1202
|
-
'orchestration.labels.error': '错误:',
|
|
1203
|
-
'orchestration.workbench.title': '执行工作台',
|
|
1204
|
-
'orchestration.workbench.subtitle': '显示队列、运行记录和节点详情。',
|
|
1205
|
-
'orchestration.queue.start': '开始队列',
|
|
1206
|
-
'orchestration.queue.starting': '启动中...',
|
|
1207
|
-
'orchestration.workbench.tabs.aria': '任务编排工作台视图',
|
|
1208
|
-
'orchestration.workbench.tabs.queue': '队列 {count}',
|
|
1209
|
-
'orchestration.workbench.tabs.runs': '运行记录 {count}',
|
|
1210
|
-
'orchestration.workbench.tabs.detail': '运行详情',
|
|
1211
|
-
'orchestration.workbench.queueCount': '{count} 个排队中',
|
|
1212
|
-
'orchestration.workbench.ready': '就绪',
|
|
1213
|
-
'orchestration.queue.empty.title': '当前没有排队任务',
|
|
1214
|
-
'orchestration.queue.empty.subtitle': '批量任务可先入队,再启动队列。',
|
|
1215
|
-
'orchestration.runs.empty.title': '还没有运行记录',
|
|
1216
|
-
'orchestration.runs.empty.subtitle': '执行后会显示最近运行记录。',
|
|
1217
|
-
'orchestration.detail.refresh': '刷新详情',
|
|
1218
|
-
'orchestration.detail.retry': '重试',
|
|
1219
|
-
'orchestration.detail.retrying': '重试中...',
|
|
1220
|
-
'orchestration.detail.continueThread': '继续此线程',
|
|
1221
|
-
'orchestration.detail.empty.title': '选择一条运行记录查看详情',
|
|
1222
|
-
'orchestration.detail.empty.subtitle': '这里会显示节点状态、摘要和日志。',
|
|
1223
|
-
'orchestration.detail.summary.status': '状态',
|
|
1224
|
-
'orchestration.detail.summary.duration': '耗时',
|
|
1225
|
-
'orchestration.detail.summary.nodes': '节点数',
|
|
1226
|
-
'orchestration.detail.summary.summary': '摘要',
|
|
1227
|
-
'orchestration.detail.context.aria': '任务运行上下文',
|
|
1228
|
-
'orchestration.detail.context.run': 'Run ID',
|
|
1229
|
-
'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
|
|
1230
|
-
'orchestration.openai.status.title': 'OpenAI Chat 运行配置',
|
|
1231
|
-
'orchestration.openai.status.subtitle': '任务节点使用当前 OpenClaw provider;执行前会检查 base URL、API key 和模型。',
|
|
1232
|
-
'orchestration.openai.status.provider': 'Provider',
|
|
1233
|
-
'orchestration.openai.status.model': '模型',
|
|
1234
|
-
'orchestration.openai.status.endpoint': 'Endpoint',
|
|
1235
|
-
'orchestration.openai.status.apiKey': 'API Key',
|
|
1236
|
-
'orchestration.openai.status.headers': '额外 headers',
|
|
1237
|
-
'orchestration.openai.status.configured': '已配置',
|
|
1238
|
-
'orchestration.openai.status.missing': '缺失',
|
|
1239
|
-
'orchestration.openai.status.notSet': '未设置',
|
|
1240
|
-
'orchestration.openai.status.notLoaded': '刷新后加载 OpenAI Chat 就绪状态。',
|
|
1241
|
-
'orchestration.openai.status.configure': '配置 OpenAI Chat',
|
|
1242
|
-
'orchestration.detail.node.output': 'AI 输出',
|
|
1243
|
-
'orchestration.detail.node.endpoint': 'Endpoint:',
|
|
1244
|
-
'orchestration.detail.node.materializedFiles': '物化文件:',
|
|
1245
|
-
'orchestration.detail.node.workspaceFiles': '工作区文件:',
|
|
1246
1001
|
'skills.localLabel': '{target} / 本地 Skills',
|
|
1247
1002
|
'skills.counts': '已装 {installed} · 可导入 {importable}',
|
|
1248
1003
|
|
|
@@ -1252,11 +1007,6 @@ const zh = Object.freeze({
|
|
|
1252
1007
|
'status.range': '统计范围',
|
|
1253
1008
|
'status.totalSessions': '总会话数',
|
|
1254
1009
|
'status.totalMessages': '总消息数',
|
|
1255
|
-
'status.engine': '引擎',
|
|
1256
|
-
'status.concurrency': '并发度',
|
|
1257
|
-
'status.running': '运行中',
|
|
1258
|
-
'status.queued': '排队中',
|
|
1259
|
-
'status.runs': '历史 Runs',
|
|
1260
1010
|
'status.currentTarget': '当前目标',
|
|
1261
1011
|
'status.localSkills': '本地 Skills',
|
|
1262
1012
|
'status.importable': '可导入',
|
|
@@ -1276,7 +1026,6 @@ const zh = Object.freeze({
|
|
|
1276
1026
|
'status.currentModel': '当前模型',
|
|
1277
1027
|
'status.quickSwitchProvider': '快速切换提供商',
|
|
1278
1028
|
'side.usage.meta': '本地统计 / 趋势',
|
|
1279
|
-
'side.orchestration.meta': '计划 / 队列 / Runs',
|
|
1280
1029
|
|
|
1281
1030
|
// Settings panel
|
|
1282
1031
|
'settings.tab.general': '通用',
|
|
@@ -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"
|
|
@@ -311,23 +302,6 @@
|
|
|
311
302
|
</button>
|
|
312
303
|
</div>
|
|
313
304
|
|
|
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
305
|
|
|
332
306
|
<div class="side-section" role="navigation" :aria-label="t('side.skills')">
|
|
333
307
|
<div class="side-section-title">{{ t('side.skills') }}</div>
|
|
@@ -520,28 +494,6 @@
|
|
|
520
494
|
<span class="value">{{ sessionUsageSummaryCards[1] ? sessionUsageSummaryCards[1].value : 0 }}</span>
|
|
521
495
|
</div>
|
|
522
496
|
</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
497
|
<div class="status-strip" v-else-if="!sessionStandalone && mainTab === 'market'">
|
|
546
498
|
<div class="status-chip">
|
|
547
499
|
<span class="label">{{ t('status.currentTarget') }}</span>
|
|
@@ -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">
|
|
@@ -103,6 +103,22 @@
|
|
|
103
103
|
<button class="btn-tool btn-tool-compact" type="button" @click="clearSessionFilters" :disabled="sessionsLoading">
|
|
104
104
|
{{ t('common.resetFilters') }}
|
|
105
105
|
</button>
|
|
106
|
+
<button v-if="!sessionBatchSelectMode" class="btn-tool btn-tool-compact btn-tool-batch" type="button" @click="enterSessionBatchSelectMode" :disabled="sessionsLoading" :title="t('sessions.batch.select')">
|
|
107
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M7 6V4a2 2 0 012-2h6a2 2 0 012 2v2M10 11v6M14 11v6"/><path d="M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14"/></svg>
|
|
108
|
+
<span>{{ t('sessions.batch.select') }}</span>
|
|
109
|
+
</button>
|
|
110
|
+
<template v-else>
|
|
111
|
+
<button class="btn-tool btn-tool-compact" type="button" @click="toggleSelectAllVisibleForBatch" :disabled="sessionsLoading" :title="isAllVisibleBatchSelected() ? t('sessions.batch.unselectAll') : t('sessions.batch.selectAll')">
|
|
112
|
+
{{ isAllVisibleBatchSelected() ? t('sessions.batch.unselectAll') : t('sessions.batch.selectAll') }}
|
|
113
|
+
</button>
|
|
114
|
+
<button class="btn-tool btn-tool-compact btn-tool-batch-delete" type="button" @click="deleteSelectedSessions" :disabled="sessionsLoading || sessionDeletingSelected || getSelectedBatchCount() === 0" :title="getSelectedBatchCount() > 0 ? t('sessions.batch.deleteSelectedN', { count: getSelectedBatchCount() }) : t('sessions.batch.emptySelection')">
|
|
115
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M7 6V4a2 2 0 012-2h6a2 2 0 012 2v2M10 11v6M14 11v6"/><path d="M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14"/></svg>
|
|
116
|
+
<span>{{ sessionDeletingSelected ? t('sessions.batch.deletingSelected') : (getSelectedBatchCount() > 0 ? t('sessions.batch.deleteSelectedN', { count: getSelectedBatchCount() }) : t('sessions.batch.deleteSelected')) }}</span>
|
|
117
|
+
</button>
|
|
118
|
+
<button class="btn-tool btn-tool-compact" type="button" @click="exitSessionBatchSelectMode" :disabled="sessionDeletingSelected" :title="t('sessions.batch.exit')">
|
|
119
|
+
{{ t('sessions.batch.exit') }}
|
|
120
|
+
</button>
|
|
121
|
+
</template>
|
|
106
122
|
</div>
|
|
107
123
|
</div>
|
|
108
124
|
<div v-if="hasActiveSessionFilters()" class="session-filter-chips" :aria-label="t('sessions.filters.copyLink')">
|
|
@@ -137,12 +153,14 @@
|
|
|
137
153
|
<div
|
|
138
154
|
v-for="session in visibleSessionsList"
|
|
139
155
|
:key="session.source + '-' + session.sessionId + '-' + session.filePath"
|
|
140
|
-
v-memo="[activeSessionExportKey === getSessionExportKey(session), session.messageCount, session.updatedAt, session.title, session.sourceLabel, session.cwd, isSessionPinned(session), sessionsLoading, session.match && session.match.count]"
|
|
156
|
+
v-memo="[activeSessionExportKey === getSessionExportKey(session), session.messageCount, session.updatedAt, session.title, session.sourceLabel, session.cwd, isSessionPinned(session), sessionsLoading, session.match && session.match.count, sessionBatchSelectMode, isSessionSelectedForBatch(session)]"
|
|
141
157
|
:class="[
|
|
142
158
|
'session-item',
|
|
143
159
|
{
|
|
144
160
|
active: activeSessionExportKey === getSessionExportKey(session),
|
|
145
|
-
pinned: isSessionPinned(session)
|
|
161
|
+
pinned: isSessionPinned(session),
|
|
162
|
+
'batch-selected': sessionBatchSelectMode && isSessionSelectedForBatch(session),
|
|
163
|
+
'batch-selectable': sessionBatchSelectMode
|
|
146
164
|
}
|
|
147
165
|
]"
|
|
148
166
|
@click="selectSession(session)"
|
|
@@ -152,6 +170,16 @@
|
|
|
152
170
|
role="button"
|
|
153
171
|
:aria-current="activeSessionExportKey === getSessionExportKey(session) ? 'true' : null">
|
|
154
172
|
<div class="session-item-header">
|
|
173
|
+
<label v-if="sessionBatchSelectMode" class="session-batch-check" @click.stop :data-session-key="getSessionExportKey(session)">
|
|
174
|
+
<input
|
|
175
|
+
type="checkbox"
|
|
176
|
+
:checked="isSessionSelectedForBatch(session)"
|
|
177
|
+
:disabled="sessionsLoading || sessionDeletingSelected || sessionDeleting[getSessionExportKey(session)] || !isSessionBatchSelectable(session)"
|
|
178
|
+
@change="toggleSessionSelectionForBatch(session)"
|
|
179
|
+
@click.stop
|
|
180
|
+
:aria-label="t('sessions.batch.select')">
|
|
181
|
+
<span class="session-batch-check-mark"></span>
|
|
182
|
+
</label>
|
|
155
183
|
<div class="session-item-main">
|
|
156
184
|
<div class="session-item-title">{{ session.title || session.sessionId }}</div>
|
|
157
185
|
<span class="session-count-badge">{{ session.messageCount == null ? '...' : session.messageCount }}</span>
|