@linxin666/dsh-client-ui-task-board 0.4.4 → 0.4.6
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.i18n.yaml +2 -2
- package/README.md +59 -20
- package/README.zh.md +59 -20
- package/lib/client.js +6208 -624
- package/lib/client.js.map +1 -1
- package/lib/index.js +4774 -493
- package/lib/types/client/PluginSettingsCard.d.ts +7 -0
- package/lib/types/client/TaskBoardSettingsCard.d.ts +31 -3
- package/lib/types/client/board/ClampedMarkdown.d.ts +3 -0
- package/lib/types/client/board/ConfirmDialog.d.ts +4 -1
- package/lib/types/client/board/EditTaskModal.d.ts +5 -2
- package/lib/types/client/board/LinkSubtaskModal.d.ts +5 -2
- package/lib/types/client/board/NewTaskModal.d.ts +4 -1
- package/lib/types/client/board/TagManagerModal.d.ts +26 -0
- package/lib/types/client/board/TaskBoard.d.ts +10 -1
- package/lib/types/client/board/TaskCard.d.ts +14 -1
- package/lib/types/client/board/TaskDetail.d.ts +3 -1
- package/lib/types/client/board/TaskForm.d.ts +4 -1
- package/lib/types/client/board/VerificationReport.d.ts +23 -0
- package/lib/types/client/board/card-view.d.ts +113 -0
- package/lib/types/client/board/icons.d.ts +32 -0
- package/lib/types/client/board/overlay.d.ts +69 -0
- package/lib/types/client/board/status-key.d.ts +15 -0
- package/lib/types/client/board/task-markdown.d.ts +19 -0
- package/lib/types/client/index.d.ts +23 -5
- package/lib/types/client/locales.d.ts +168 -1
- package/lib/types/client/native-panel.d.ts +6 -20
- package/lib/types/client/plugin-card-seat.d.ts +5 -0
- package/lib/types/client/schedule-zone.d.ts +50 -0
- package/lib/types/client/seats.d.ts +18 -0
- package/lib/types/client/service.d.ts +32 -0
- package/lib/types/client/settings-form.d.ts +16 -0
- package/lib/types/core/controller.d.ts +46 -11
- package/lib/types/core/extension.d.ts +283 -0
- package/lib/types/core/handover.d.ts +13 -1
- package/lib/types/core/issue-form.d.ts +16 -0
- package/lib/types/core/poll-cadence.d.ts +31 -0
- package/lib/types/core/tasks.d.ts +228 -17
- package/lib/types/core/use-cases/task-schedule.d.ts +68 -10
- package/lib/types/core/use-cases/task-tag.d.ts +48 -0
- package/lib/types/core/use-cases/task-update.d.ts +5 -3
- package/lib/types/core/verification-budget.d.ts +52 -0
- package/lib/types/core/verification.d.ts +753 -0
- package/lib/types/core/workspace-target.d.ts +41 -0
- package/lib/types/host/agent-tools.d.ts +1 -1
- package/lib/types/host/extension-registry.d.ts +111 -0
- package/lib/types/host/llm-dispatch.d.ts +63 -0
- package/lib/types/host/verification-gate.d.ts +95 -0
- package/lib/types/host/verification-runner.d.ts +139 -0
- package/lib/types/host/workspace-evidence.d.ts +53 -0
- package/lib/types/host-ledger.d.ts +133 -14
- package/lib/types/host-runner.d.ts +55 -10
- package/lib/types/host-service.d.ts +205 -11
- package/lib/types/index.d.ts +134 -26
- package/lib/types/protocol.d.ts +92 -10
- package/lib/types/tool-surface.d.ts +71 -0
- package/package.json +28 -31
- package/src/client/PluginSettingsCard.tsx +9 -0
- package/src/client/TaskBoardSettingsCard.tsx +378 -66
- package/src/client/board/ClampedMarkdown.tsx +69 -0
- package/src/client/board/ConfirmDialog.tsx +7 -3
- package/src/client/board/EditTaskModal.tsx +5 -2
- package/src/client/board/LinkSubtaskModal.tsx +12 -7
- package/src/client/board/NewTaskModal.tsx +168 -21
- package/src/client/board/TagManagerModal.tsx +235 -0
- package/src/client/board/TaskBoard.tsx +259 -103
- package/src/client/board/TaskCard.tsx +214 -81
- package/src/client/board/TaskDetail.tsx +289 -43
- package/src/client/board/TaskForm.tsx +13 -3
- package/src/client/board/VerificationReport.tsx +322 -0
- package/src/client/board/card-view.ts +220 -0
- package/src/client/board/icons.tsx +89 -0
- package/src/client/board/overlay.tsx +189 -0
- package/src/client/board/status-key.ts +30 -0
- package/src/client/board/task-markdown.module.css +137 -0
- package/src/client/board/task-markdown.tsx +106 -0
- package/src/client/board-settings.module.css +66 -0
- package/src/client/board.module.css +488 -63
- package/src/client/index.ts +82 -51
- package/src/client/locales.ts +343 -6
- package/src/client/native-panel.tsx +18 -2
- package/src/client/plugin-card-seat.ts +7 -0
- package/src/client/schedule-zone.ts +100 -2
- package/src/client/seats.tsx +58 -0
- package/src/client/service.ts +94 -0
- package/src/client/settings-card.module.css +31 -5
- package/src/client/settings-form.ts +27 -1
- package/src/core/controller.ts +105 -10
- package/src/core/extension.ts +376 -0
- package/src/core/freeze-snapshot.ts +2 -2
- package/src/core/handover.ts +16 -1
- package/src/core/issue-form.ts +19 -0
- package/src/core/poll-cadence.ts +41 -0
- package/src/core/store.ts +80 -15
- package/src/core/tasks.ts +293 -45
- package/src/core/use-cases/task-create.ts +30 -9
- package/src/core/use-cases/task-parent.ts +3 -2
- package/src/core/use-cases/task-schedule.ts +190 -25
- package/src/core/use-cases/task-tag.ts +110 -0
- package/src/core/use-cases/task-update.ts +13 -7
- package/src/core/verification-budget.ts +115 -0
- package/src/core/verification.ts +1594 -0
- package/src/core/workspace-target.ts +59 -0
- package/src/host/agent-tools.ts +125 -38
- package/src/host/extension-registry.ts +509 -0
- package/src/host/llm-dispatch.ts +87 -0
- package/src/host/verification-gate.ts +487 -0
- package/src/host/verification-runner.ts +702 -0
- package/src/host/workspace-evidence.ts +176 -0
- package/src/host-ai.ts +15 -9
- package/src/host-ledger.ts +468 -71
- package/src/host-routes.ts +15 -2
- package/src/host-runner.ts +106 -24
- package/src/host-service.ts +546 -40
- package/src/index.ts +305 -21
- package/src/protocol.ts +226 -28
- package/src/tool-surface.ts +95 -0
- package/lib/invariant.js +0 -6
- package/lib/types/invariant.d.ts +0 -3
- package/src/invariant.ts +0 -4
package/src/client/locales.ts
CHANGED
|
@@ -26,7 +26,6 @@ export const zh = {
|
|
|
26
26
|
'board.status.failed': '已失败',
|
|
27
27
|
'board.runs': '次执行',
|
|
28
28
|
'board.pending': '正在提交',
|
|
29
|
-
'board.updated': '更新于',
|
|
30
29
|
'board.created': '创建于',
|
|
31
30
|
'board.hostError': 'Host 操作失败:{error}',
|
|
32
31
|
'board.hostError.notMounted': '任务看板的后台接口没有挂载:宿主没有加载这个插件(可能未安装、未启用,或该行启动失败)。重启 DSH 服务后再试',
|
|
@@ -108,6 +107,22 @@ export const zh = {
|
|
|
108
107
|
'board.tagFilter': '按标签筛选',
|
|
109
108
|
'board.tagFilterClear': '清除标签筛选',
|
|
110
109
|
'board.tagEmpty': '没有同时带这些标签的任务',
|
|
110
|
+
'board.tagManage': '管理标签',
|
|
111
|
+
'tags.title': '标签管理',
|
|
112
|
+
'tags.hint': '标签是顶栏筛选与卡片徽章的来源。重命名会写到所有卡片上(与已有同名标签合并),删除会从全部任务(含已归档)上移除;任务本身不受影响。',
|
|
113
|
+
'tags.empty': '当前没有任何标签在使用。',
|
|
114
|
+
'tags.usage': '{count} 个任务',
|
|
115
|
+
'tags.rename': '重命名',
|
|
116
|
+
'tags.renameLabel': '重命名标签 {name}',
|
|
117
|
+
'tags.delete': '删除',
|
|
118
|
+
'tags.deleteTitle': '删除标签',
|
|
119
|
+
'tags.deleteConfirm': '从 {count} 个任务上移除标签「{name}」?该标签的执行提示会一并移除,任务本身不受影响。',
|
|
120
|
+
'tags.deleteOk': '删除',
|
|
121
|
+
'tags.save': '保存',
|
|
122
|
+
'tags.mergeHint': '将合并进已有标签「{name}」',
|
|
123
|
+
'tags.renameFailed': '重命名未被接受。',
|
|
124
|
+
'tags.deleteFailed': '删除未被接受。',
|
|
125
|
+
'tags.done': '完成',
|
|
111
126
|
'detail.permissionPending': '权限待确认:本卡有效权限({permission})高于会话默认,手动执行与定时调度都会被拒绝,需人工确认后才能运行。',
|
|
112
127
|
'detail.permissionConfirm': '确认权限绑定',
|
|
113
128
|
'detail.permissionConfirmed': '已确认权限绑定 · {time}',
|
|
@@ -123,6 +138,8 @@ export const zh = {
|
|
|
123
138
|
'new.archiveOriginal': '创建后归档原任务',
|
|
124
139
|
'detail.prompt': '执行 Prompt',
|
|
125
140
|
'detail.description': '描述',
|
|
141
|
+
'detail.expand': '展开全文',
|
|
142
|
+
'detail.collapse': '收起',
|
|
126
143
|
'detail.execution': '执行记录',
|
|
127
144
|
'detail.noExecution': '尚未执行',
|
|
128
145
|
'detail.run': '执行',
|
|
@@ -135,6 +152,7 @@ export const zh = {
|
|
|
135
152
|
'detail.noSession': '暂无会话',
|
|
136
153
|
'detail.executionStarted': '已启动',
|
|
137
154
|
'detail.execution.initiator': '发起会话 {session}',
|
|
155
|
+
'detail.execution.external': 'Host 之外完成:{agent}',
|
|
138
156
|
'detail.executionEnded': '已结束',
|
|
139
157
|
'detail.result.succeeded': '成功',
|
|
140
158
|
'detail.result.failed': '失败',
|
|
@@ -146,6 +164,9 @@ export const zh = {
|
|
|
146
164
|
'delete.cancel': '取消',
|
|
147
165
|
'status.move.backlog': '移到待规划',
|
|
148
166
|
'status.move.todo': '移到待办',
|
|
167
|
+
'status.move.running': '移到进行中',
|
|
168
|
+
'status.move.done': '移到已完成',
|
|
169
|
+
'status.move.failed': '移到已失败',
|
|
149
170
|
'exec.error.noWorkspace': '没有可用工作区,无法执行任务',
|
|
150
171
|
'exec.error.promptRejected': 'Prompt 被拒绝',
|
|
151
172
|
'run.failed': '执行失败:{error}',
|
|
@@ -174,7 +195,35 @@ export const zh = {
|
|
|
174
195
|
'detail.schedule.duration.hours': '{count} 小时',
|
|
175
196
|
'detail.schedule.duration.minutes': '{count} 分钟',
|
|
176
197
|
'detail.schedule.duration.seconds': '{count} 秒',
|
|
198
|
+
// 调度方式:单次计划与循环规则是两类计划,不是同一 cron 的日期限定写法。
|
|
199
|
+
'detail.schedule.mode': '调度方式',
|
|
200
|
+
'detail.schedule.mode.cron': '循环',
|
|
201
|
+
'detail.schedule.mode.once': '单次',
|
|
202
|
+
'detail.schedule.at': '执行时间',
|
|
203
|
+
'detail.schedule.atHint': '按所选时区解读的计划时刻;必须是未来时间。',
|
|
204
|
+
'detail.schedule.atInvalid': '请选择未来的有效时间',
|
|
205
|
+
'detail.schedule.plannedAt': '计划时间',
|
|
206
|
+
'detail.schedule.zoneOnceHint': '所选时刻按此时区解读。',
|
|
207
|
+
'detail.schedule.maxRuns': '次数上限',
|
|
208
|
+
'detail.schedule.maxRunsUnlimited': '不限次数',
|
|
209
|
+
'detail.schedule.maxRunsValue': '最多 {count} 次',
|
|
210
|
+
'detail.schedule.maxRunsCustom': '自定义',
|
|
211
|
+
'detail.schedule.maxRunsInvalid': '次数上限必须是正整数',
|
|
212
|
+
'detail.schedule.runs': '已执行 {done}/{total} 次',
|
|
213
|
+
'detail.schedule.runsUnlimited': '已执行 {done} 次',
|
|
214
|
+
'detail.schedule.remaining': '剩余 {count} 次',
|
|
215
|
+
'detail.schedule.cancel': '关闭调度',
|
|
216
|
+
'detail.schedule.ended': '调度已结束:{reason}',
|
|
217
|
+
'detail.schedule.skipped': '上次跳过:{reason}',
|
|
218
|
+
'detail.schedule.stop.fired': '单次计划已执行',
|
|
219
|
+
'detail.schedule.stop.limit': '已达次数上限',
|
|
220
|
+
'detail.schedule.stop.no-target': '计划已无可执行时刻',
|
|
221
|
+
'detail.schedule.stop.missed': '错过执行时刻,已跳过',
|
|
222
|
+
'detail.schedule.stop.busy': '触发时任务正在运行,已跳过',
|
|
223
|
+
'detail.schedule.stop.permission': '权限待人工确认,已跳过',
|
|
224
|
+
'detail.schedule.stop.launch-failed': '启动失败未创建执行,次数已退回',
|
|
177
225
|
'card.scheduled': '定时',
|
|
226
|
+
'card.scheduledOnce': '单次',
|
|
178
227
|
'new.workspace': '工作区',
|
|
179
228
|
'new.agentPreset': 'Agent 预设',
|
|
180
229
|
'new.permission': '权限',
|
|
@@ -204,13 +253,16 @@ export const zh = {
|
|
|
204
253
|
'exec.teamRunUnavailable': '当前部署未提供 Agent Teams 服务,无法启用。',
|
|
205
254
|
'exec.reuseSessionHint': '开启后,本任务的后续执行在上一次会话里继续(该会话空闲且仍存在时),不再每次新建对话;每次复用时都会重新应用上面钉住的权限与模型。',
|
|
206
255
|
'exec.goalRun': '以 dsh 内置的 /goal 开始执行任务',
|
|
207
|
-
'exec.goalRunHint': '
|
|
256
|
+
'exec.goalRunHint': '默认关闭:勾选后执行时把任务目标作为持久目标交给 dsh 内置的 /goal,会话会自动续跑多轮,直到 agent 标记目标完成;看板在该目标真正结束后才结算本次执行。不勾选则只执行一轮普通对话。',
|
|
257
|
+
'exec.skipVerification': '跳过本任务的验收',
|
|
258
|
+
'exec.skipVerificationHint': '默认关闭:勾选后本任务以 goal 形式执行时不再拦截 update_goal 标记完成,也不要求通过验收;执行记录会标注「该卡片跳过验收」。仅对之后新开的执行生效,验收总开关关闭时本项无意义。',
|
|
208
259
|
'detail.executionSettings': '执行设置',
|
|
209
260
|
'exec.hint': '执行时生效:工作区决定执行会话落在哪个工作区;Agent 预设决定会话的组合(工具面与提示词段);权限经 /permission 命令应用到会话。留空则继承部署默认。',
|
|
210
261
|
// 插件设置卡片(settings.plugin.item 席位)。
|
|
211
262
|
'settings.title': '任务看板',
|
|
212
|
-
'settings.description': '
|
|
263
|
+
'settings.description': '任务编排、agent 播报与目标验收。',
|
|
213
264
|
'settings.enabled': '启用任务看板',
|
|
265
|
+
'settings.enabledCardHint': '总开关、播报、睡眠保护与子任务层级。',
|
|
214
266
|
'settings.enabledHint': '关闭后隐藏侧边栏入口与看板视图,并注销 task_board_* agent 工具;开启时任何会话都可以通过这些工具读写看板、子任务与定时计划。',
|
|
215
267
|
'settings.announceToAgent': '向 agent 播报任务看板',
|
|
216
268
|
'settings.announceToAgentHint': '开启:每条 agent 系统提示都会包含本看板的说明;关闭:不播报,agent 仅在用户主动提及时了解看板。',
|
|
@@ -235,9 +287,105 @@ export const zh = {
|
|
|
235
287
|
'settings.unsaved': '未保存',
|
|
236
288
|
'settings.saveFailed': '部署未接受这些值,已保留供你修改。',
|
|
237
289
|
'settings.invalidNumber': '请输入数字,留空则使用默认值。',
|
|
290
|
+
'settings.sessionPollSeconds': '会话轮询间隔(秒)',
|
|
291
|
+
'settings.sessionPollSecondsHint': '默认 5 秒。仅在看板有需要核对的事情——运行中的卡片或未结算的执行——时才读取会话名册;两者都没有时不再轮询,Host 不会持续扫描持久化会话目录。取值 1–300 秒:间隔越短结算越快、Host 负载越高。',
|
|
238
292
|
'settings.maxSubtaskDepth': '子任务深度上限',
|
|
239
293
|
'settings.maxSubtaskDepthHint': '默认 1:一个任务只允许一层子任务,子任务不能再创建或关联子任务。最大 3。执行父任务会并发执行它的整棵子任务树,层级越深,一次执行开启的会话越多。',
|
|
240
294
|
'settings.maxSubtaskDepthOption': '{depth} 层',
|
|
295
|
+
'settings.runBehaviorTitle': '运行行为',
|
|
296
|
+
'settings.runBehaviorCardHint': '全局原生 /goal 执行开关(总开关,默认关闭)。',
|
|
297
|
+
'settings.goalRunGlobal': '全局启用 DSH 原生 /goal 执行',
|
|
298
|
+
'settings.goalRunGlobalHint': '默认关闭。关闭时所有任务都按普通单回合执行,不调用 dsh 内置的 /goal;只有这里开启、且任务级「以 /goal 开始执行」被勾选时,才执行原生 /goal。任务级勾选始终可操作、也不会被这里的开关改写,总开关只决定它是否生效。开关按执行启动时冻结,只影响之后新开的执行。',
|
|
299
|
+
'settings.goalRunGlobalDisabledTaskOption': '全局「原生 /goal 执行」总开关已关闭:任务级选项仍可随时勾选或取消,但暂不生效,你保存的偏好也不会被改写;开启总开关后即按该偏好执行。本次执行按普通单回合进行,未执行 goal 验收。',
|
|
300
|
+
'settings.goalVerificationTitle': '任务验收',
|
|
301
|
+
'settings.goalVerification': '启用任务验收',
|
|
302
|
+
'settings.goalVerificationCardHint': '验收开关、裁判模型与判据阈值。',
|
|
303
|
+
'settings.goalVerificationHint': '默认打开:以 goal 形式执行的任务在 update_goal 标记完成前必须先通过一次验收(三项 coding 判据(本分区面向工程任务)、阈值 0.65、每项两轮且交换 A/B 位置,实际工作须胜过空工作基线)。首次不通过会把总分、逐项分数与可定位问题反馈给 agent 修复,同一执行最多两次验收;第二次仍不通过则本次执行判失败。仅作用于本插件以 goal 形式执行的任务,不影响普通聊天,也不影响显式 goalRun:false 的单回合任务。每次验收都会真实调用裁判模型并消耗额度。',
|
|
304
|
+
'settings.goalVerificationModel': '验收模型',
|
|
305
|
+
'settings.goalVerificationModelHint': '留空即继承宿主:使用宿主模型目录的默认路由,而不是任务卡钉住的执行模型。',
|
|
306
|
+
'settings.goalVerificationModelInherit': '继承宿主({model})',
|
|
307
|
+
'settings.goalVerificationModelInheritUnknown': '继承宿主(宿主未提供模型目录)',
|
|
308
|
+
'settings.goalVerificationEffort': '推理强度',
|
|
309
|
+
'settings.goalVerificationEffortHint': '留空即继承宿主默认档位。目标模型不支持所选档位时不会盲传:验收改用该模型自己的默认档位,并在下方标注回退。',
|
|
310
|
+
'settings.goalVerificationEffortInherit': '继承宿主({effort})',
|
|
311
|
+
'settings.goalVerificationEffortInheritUnknown': '继承宿主(模型默认档位)',
|
|
312
|
+
'settings.goalVerificationResolved': '实际解析后的验收配置',
|
|
313
|
+
'settings.goalVerificationResolvedModel': '裁判模型:{model}',
|
|
314
|
+
'settings.goalVerificationResolvedEffort': '推理强度:{effort}',
|
|
315
|
+
'settings.goalVerificationResolvedNoEffort': '推理强度:不显式传参(用模型自身默认)',
|
|
316
|
+
'settings.goalVerificationResolvedSource': '来源:{source}',
|
|
317
|
+
'settings.goalVerificationSourceInherit': '继承宿主',
|
|
318
|
+
'settings.goalVerificationSourceExplicit': '显式配置',
|
|
319
|
+
'settings.goalVerificationResolvedPreset': '判据:coding(Specification Adherence / Output Match / Error Signal Detection),阈值 {threshold}',
|
|
320
|
+
'settings.goalVerificationRouteMissing': '宿主未提供模型目录,无法解析验收模型:开启后 goal 任务的完成声明会被拒绝并记录为验收异常。',
|
|
321
|
+
'settings.goalVerificationEffortFallback': '所选推理强度 {requested} 不被目标模型支持,已回退为 {resolved}。',
|
|
322
|
+
'settings.goalVerificationEffortFallbackNone': '所选推理强度 {requested} 不被目标模型支持,已回退为该模型默认档位(不显式传参)。',
|
|
323
|
+
'settings.goalVerificationModelInvalid': '配置的验收模型不是 provider/model 形式,已回退宿主默认。',
|
|
324
|
+
'running.executing': '执行中',
|
|
325
|
+
'running.verifying': '验收中',
|
|
326
|
+
'running.repairing': '验收未通过修复中',
|
|
327
|
+
'running.verificationPassed': '验收通过',
|
|
328
|
+
'running.verificationFailed': '验收未通过',
|
|
329
|
+
'running.verificationInvalid': '验收无效,等待处理',
|
|
330
|
+
'verify.title': '验收报告',
|
|
331
|
+
'verify.status.passed': '通过',
|
|
332
|
+
'verify.status.failed': '未通过',
|
|
333
|
+
'verify.status.exception': '异常',
|
|
334
|
+
'verify.status.verifying': '验收中',
|
|
335
|
+
'verify.status.pending': '待验收',
|
|
336
|
+
'verify.status.off': '本次执行未启用验收',
|
|
337
|
+
'verify.status.invalid': '验收无效',
|
|
338
|
+
'verify.status.invalidHeld': '验收无效,等待人工处理',
|
|
339
|
+
'verify.attemptInvalid': '第 {index} 次验收无效',
|
|
340
|
+
'verify.invalidReason.missing-finding': '未达标的判据没有对应的结构化问题反馈',
|
|
341
|
+
'verify.invalidReason.unlocatable-quote': '问题反馈引用的位置不存在于本次裁判所见的证据中',
|
|
342
|
+
'verify.invalidReason.baseline-finding': '问题反馈指向空工作基线,而不是本次执行的工作',
|
|
343
|
+
'verify.invalidReason.vacuous-finding': '问题反馈为空或空泛评价,没有说明实际观测与差异',
|
|
344
|
+
'verify.invalidReason.insufficient-evidence': '裁判看到的证据不足(例如轨迹被截断),无法支撑否决',
|
|
345
|
+
'verify.invalidReason.unknown': '未产生可用的质量判定',
|
|
346
|
+
'verify.invalidCounts': '有效质量判定 {quality}/{max} · 无效验收 {invalid}/{maxInvalid} · 验收异常 {exceptions}/{max}',
|
|
347
|
+
'verify.invalidDetail': '无效原因:{reason}',
|
|
348
|
+
'verify.criterionFindings': '结构化问题反馈(判据 · 引用位置 · 实际引用)',
|
|
349
|
+
'verify.criterionFinding': '{criterion} · {location}:“{quote}”',
|
|
350
|
+
'verify.criterionFindingFull': '{criterion} · {location}:“{quote}” 要求:{requirement} 观测:{observation} 差异:{gap}',
|
|
351
|
+
'verify.location.task': '任务要求',
|
|
352
|
+
'verify.location.trajectory': '执行轨迹',
|
|
353
|
+
'verify.location.workspace': '宿主记录的变更',
|
|
354
|
+
'verify.location.baseline': '空工作基线(不构成否决证据)',
|
|
355
|
+
'verify.location.unknown': '未标明位置',
|
|
356
|
+
'verify.detailRemoved': '本条验收的详细材料已在通过并成功结算后自动清理(不是裁判未举证)。',
|
|
357
|
+
'verify.cleanup.cleaned': '本次执行的验收专用详细材料已在通过并成功结算后自动清理;以下为保留的轻量审计凭据。',
|
|
358
|
+
'verify.cleanup.pending': '验收专用详细材料待清理(将通过并结算后启动)。',
|
|
359
|
+
'verify.cleanup.failed': '验收详细材料清理失败(已重试 {attempts} 次):{error};通过记录仍然有效,宿主重启后会补清。',
|
|
360
|
+
'verify.cleanup.audit': '保留凭据:第 {index} 次 · {stage} · 分数 {score} · 证据哈希 {hash}',
|
|
361
|
+
'verify.cleanup.stage.quality': '质量判定',
|
|
362
|
+
'verify.cleanup.stage.invalid': '无效验收',
|
|
363
|
+
'verify.cleanup.stage.exception': '验收异常',
|
|
364
|
+
'verify.cleanup.stage.budget': '时间预算耗尽',
|
|
365
|
+
'verify.summary': '总分 {score}(阈值 {threshold})· 空工作基线 {baseline}',
|
|
366
|
+
'verify.criteria': '逐项判据',
|
|
367
|
+
'verify.criterion': '{name}:{score}(阈值 {threshold})',
|
|
368
|
+
'verify.rounds': '每项 {rounds} 轮,交换 A/B 位置后取平均',
|
|
369
|
+
'verify.judge': '裁判模型 {model}(推理强度 {effort})',
|
|
370
|
+
'verify.judgeNoEffort': '裁判模型 {model}(推理强度:不显式传参)',
|
|
371
|
+
'verify.judgeInherited': '裁判模型 {model}(继承宿主)',
|
|
372
|
+
'verify.attempt': '第 {index} 次验收',
|
|
373
|
+
'verify.attemptException': '第 {index} 次验收异常',
|
|
374
|
+
'verify.counts': '质量验收 {quality}/{max} · 验收异常 {exceptions}/{max}',
|
|
375
|
+
'verify.findings': '问题反馈',
|
|
376
|
+
'verify.noFindings': '本次裁判没有报告可定位的问题',
|
|
377
|
+
'verify.evidence': '证据范围:{chars} 字符 · {entries} 条轨迹 · 截断 {omitted} 字符',
|
|
378
|
+
'verify.workspaceEvidence': '其中 {files} 个文件变更取自宿主自身观察',
|
|
379
|
+
'verify.usage': '用量:请求 {calls} 次 · 输入 {input} · 输出 {output} · 推理 {reasoning} tokens',
|
|
380
|
+
'verify.usageIncomplete': '(至少一次请求的用量未知,以上为下限)',
|
|
381
|
+
'verify.finalFailure': '判定依据:{reason}',
|
|
382
|
+
'verify.applicability.disabled': '本次执行启动时验收开关关闭,按原有回合判定结算。',
|
|
383
|
+
'verify.applicability.goalUnavailable': '本次执行未成为 goal 执行(卡片未勾选「以 /goal 开始执行任务」,或 /goal 被拒绝/不可用),验收未强制执行。',
|
|
384
|
+
'verify.applicability.skipped': '该任务卡勾选了「跳过验收」,本次执行未经验收判定。',
|
|
385
|
+
'verify.applicability.teamMember': '团队执行成员:由 Lead 的团队汇总证据统一验收。',
|
|
386
|
+
'verify.applicability.goalDisabled': '本次执行启动时全局「原生 /goal 执行」总开关关闭,按普通单回合执行:本次未执行 goal 验收,既不算已验收通过,也不因此判失败。',
|
|
387
|
+
'verify.effortFallback': '推理强度回退:{requested} → {resolved}',
|
|
388
|
+
'verify.thresholdValue': '{value}%',
|
|
241
389
|
// 子任务(父子关系、级联执行、关联/解除关联)。
|
|
242
390
|
'detail.parent': '父任务',
|
|
243
391
|
'detail.parent.open': '打开父任务',
|
|
@@ -262,6 +410,25 @@ export const zh = {
|
|
|
262
410
|
'card.subtasksFailed': '{count} 失败',
|
|
263
411
|
'card.subtasksRunning': '{count} 运行中',
|
|
264
412
|
'card.subtasksBreakdown': '子任务 {total}:已完成 {done},运行中 {running},失败 {failed}',
|
|
413
|
+
'card.result.succeeded': '最近成功',
|
|
414
|
+
'card.result.failed': '最近失败',
|
|
415
|
+
'card.result.cancelled': '最近取消',
|
|
416
|
+
'card.declared': '手动结算',
|
|
417
|
+
'card.declaredHint': '卡片所在列与最近一次执行结果不一致:该列由人工移动或外部系统(如 Issue 关闭)设置,而不是这次执行的结算。',
|
|
418
|
+
'card.openSession': '打开最近执行的会话',
|
|
419
|
+
'card.tagsLabel': '标签 {tags}',
|
|
420
|
+
'card.time.created': '创建于 {time}',
|
|
421
|
+
'card.time.started': '已运行 {time}',
|
|
422
|
+
'card.time.settled': '结算于 {time}',
|
|
423
|
+
'card.time.archived': '归档于 {time}',
|
|
424
|
+
'card.time.updated': '更新于 {time}',
|
|
425
|
+
'board.density.compact': '切换为紧凑卡片',
|
|
426
|
+
'board.density.comfortable': '切换为完整卡片',
|
|
427
|
+
'board.group.today': '今天',
|
|
428
|
+
'board.group.week': '近 7 天',
|
|
429
|
+
'board.group.earlier': '更早',
|
|
430
|
+
'board.group.expand': '展开 {count} 张',
|
|
431
|
+
'board.group.collapse': '收起',
|
|
265
432
|
'board.hideSubtasks': '隐藏子任务',
|
|
266
433
|
'board.showSubtasks': '显示子任务',
|
|
267
434
|
'board.subtaskFilterHint': '看板默认只显示父任务;搜索或按标签筛选时会自动展开子任务。',
|
|
@@ -288,7 +455,6 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
288
455
|
'board.status.failed': 'Failed',
|
|
289
456
|
'board.runs': 'runs',
|
|
290
457
|
'board.pending': 'Submitting',
|
|
291
|
-
'board.updated': 'Updated',
|
|
292
458
|
'board.created': 'Created',
|
|
293
459
|
'board.hostError': 'Host action failed: {error}',
|
|
294
460
|
'board.hostError.notMounted': 'The task board Host API is not mounted: the Host did not load this plugin (not installed, disabled, or its row failed to start). Restart the DSH service and try again',
|
|
@@ -370,6 +536,22 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
370
536
|
'board.tagFilter': 'Filter by tag',
|
|
371
537
|
'board.tagFilterClear': 'Clear tag filter',
|
|
372
538
|
'board.tagEmpty': 'No task carries all of these tags',
|
|
539
|
+
'board.tagManage': 'Manage labels',
|
|
540
|
+
'tags.title': 'Label manager',
|
|
541
|
+
'tags.hint': 'Labels feed the board filter and the card badges. Renaming writes to every card (merging into a label that already exists), and deleting removes the label from every task including archived ones; the tasks themselves are untouched.',
|
|
542
|
+
'tags.empty': 'No labels are in use.',
|
|
543
|
+
'tags.usage': '{count} tasks',
|
|
544
|
+
'tags.rename': 'Rename',
|
|
545
|
+
'tags.renameLabel': 'Rename the label {name}',
|
|
546
|
+
'tags.delete': 'Delete',
|
|
547
|
+
'tags.deleteTitle': 'Delete label',
|
|
548
|
+
'tags.deleteConfirm': 'Remove the label "{name}" from {count} task(s)? Its execution hint is removed with it; the tasks themselves are unaffected.',
|
|
549
|
+
'tags.deleteOk': 'Delete',
|
|
550
|
+
'tags.save': 'Save',
|
|
551
|
+
'tags.mergeHint': 'Merges into the existing label "{name}"',
|
|
552
|
+
'tags.renameFailed': 'The rename was not accepted.',
|
|
553
|
+
'tags.deleteFailed': 'The deletion was not accepted.',
|
|
554
|
+
'tags.done': 'Done',
|
|
373
555
|
'detail.permissionPending': 'Permission pending confirmation: this card\'s effective permission ({permission}) is above the session default; manual runs and cron are refused until a human confirms.',
|
|
374
556
|
'detail.permissionConfirm': 'Confirm permission binding',
|
|
375
557
|
'detail.permissionConfirmed': 'Permission confirmed · {time}',
|
|
@@ -385,6 +567,8 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
385
567
|
'new.archiveOriginal': 'Archive original task upon creation',
|
|
386
568
|
'detail.prompt': 'Run Prompt',
|
|
387
569
|
'detail.description': 'Description',
|
|
570
|
+
'detail.expand': 'Show more',
|
|
571
|
+
'detail.collapse': 'Show less',
|
|
388
572
|
'detail.execution': 'Execution History',
|
|
389
573
|
'detail.noExecution': 'Not executed yet',
|
|
390
574
|
'detail.run': 'Run',
|
|
@@ -397,6 +581,7 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
397
581
|
'detail.noSession': 'No session',
|
|
398
582
|
'detail.executionStarted': 'Started',
|
|
399
583
|
'detail.execution.initiator': 'Initiated by session {session}',
|
|
584
|
+
'detail.execution.external': 'Completed outside this Host by {agent}',
|
|
400
585
|
'detail.executionEnded': 'Ended',
|
|
401
586
|
'detail.result.succeeded': 'Succeeded',
|
|
402
587
|
'detail.result.failed': 'Failed',
|
|
@@ -408,6 +593,9 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
408
593
|
'delete.cancel': 'Cancel',
|
|
409
594
|
'status.move.backlog': 'Move to Backlog',
|
|
410
595
|
'status.move.todo': 'Move to To Do',
|
|
596
|
+
'status.move.running': 'Move to Running',
|
|
597
|
+
'status.move.done': 'Move to Done',
|
|
598
|
+
'status.move.failed': 'Move to Failed',
|
|
411
599
|
'exec.error.noWorkspace': 'No workspace is available to run the task',
|
|
412
600
|
'exec.error.promptRejected': 'Prompt rejected',
|
|
413
601
|
'run.failed': 'Run failed: {error}',
|
|
@@ -436,7 +624,36 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
436
624
|
'detail.schedule.duration.hours': '{count}h',
|
|
437
625
|
'detail.schedule.duration.minutes': '{count}m',
|
|
438
626
|
'detail.schedule.duration.seconds': '{count}s',
|
|
627
|
+
// Scheduling mode: a one-shot and a recurring rule are two kinds of plan,
|
|
628
|
+
// not the same cron expression restricted to a date.
|
|
629
|
+
'detail.schedule.mode': 'Mode',
|
|
630
|
+
'detail.schedule.mode.cron': 'Recurring',
|
|
631
|
+
'detail.schedule.mode.once': 'Once',
|
|
632
|
+
'detail.schedule.at': 'Run at',
|
|
633
|
+
'detail.schedule.atHint': 'Planned instant, read in the selected zone; it must be in the future.',
|
|
634
|
+
'detail.schedule.atInvalid': 'Choose a valid future time',
|
|
635
|
+
'detail.schedule.plannedAt': 'Planned time',
|
|
636
|
+
'detail.schedule.zoneOnceHint': 'The chosen instant is read in this zone.',
|
|
637
|
+
'detail.schedule.maxRuns': 'Run limit',
|
|
638
|
+
'detail.schedule.maxRunsUnlimited': 'Unlimited',
|
|
639
|
+
'detail.schedule.maxRunsValue': 'At most {count} runs',
|
|
640
|
+
'detail.schedule.maxRunsCustom': 'Custom',
|
|
641
|
+
'detail.schedule.maxRunsInvalid': 'The run limit must be a positive whole number',
|
|
642
|
+
'detail.schedule.runs': 'Ran {done}/{total}',
|
|
643
|
+
'detail.schedule.runsUnlimited': 'Ran {done}',
|
|
644
|
+
'detail.schedule.remaining': '{count} left',
|
|
645
|
+
'detail.schedule.cancel': 'Cancel schedule',
|
|
646
|
+
'detail.schedule.ended': 'Schedule ended: {reason}',
|
|
647
|
+
'detail.schedule.skipped': 'Last skip: {reason}',
|
|
648
|
+
'detail.schedule.stop.fired': 'the one-shot ran',
|
|
649
|
+
'detail.schedule.stop.limit': 'the run limit was reached',
|
|
650
|
+
'detail.schedule.stop.no-target': 'the plan has no reachable occurrence',
|
|
651
|
+
'detail.schedule.stop.missed': 'the instant was missed and skipped',
|
|
652
|
+
'detail.schedule.stop.busy': 'the task was already running, so the occurrence was skipped',
|
|
653
|
+
'detail.schedule.stop.permission': 'a permission awaited human confirmation, so the occurrence was skipped',
|
|
654
|
+
'detail.schedule.stop.launch-failed': 'the launch failed before any execution existed, so the run was refunded',
|
|
439
655
|
'card.scheduled': 'scheduled',
|
|
656
|
+
'card.scheduledOnce': 'once',
|
|
440
657
|
'new.workspace': 'Workspace',
|
|
441
658
|
'new.agentPreset': 'Agent preset',
|
|
442
659
|
'new.permission': 'Permission',
|
|
@@ -466,13 +683,16 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
466
683
|
'exec.teamRunUnavailable': 'This deployment serves no Agent Teams service, so team runs cannot be enabled.',
|
|
467
684
|
'exec.reuseSessionHint': 'When on, later runs continue in the previous session (when that session is idle and still exists) instead of starting a new conversation each time; the pinned permission and model above are re-applied on every reuse.',
|
|
468
685
|
'exec.goalRun': "Start the run with dsh's built-in /goal",
|
|
469
|
-
'exec.goalRunHint': '
|
|
686
|
+
'exec.goalRunHint': 'Off by default: when checked, the run arms dsh built-in /goal with the task objective, so the session keeps working automatic continuation rounds until the agent marks the goal complete, and the board settles the execution only when that goal really ends. Unchecked: one plain turn.',
|
|
687
|
+
'exec.skipVerification': 'Skip acceptance for this task',
|
|
688
|
+
'exec.skipVerificationHint': 'Off by default: when checked, a goal-form run of this task no longer gates update_goal on a passing acceptance, and the execution record is marked as skipped. It applies only to executions started afterwards, and means nothing while the board-wide acceptance switch is off.',
|
|
470
689
|
'detail.executionSettings': 'Execution Settings',
|
|
471
690
|
'exec.hint': 'Applied when the task runs: the workspace decides where the execution session lands; the agent preset composes the session (tool face and prompt sections); the permission is applied through the /permission command. Blank inherits the deployment default.',
|
|
472
691
|
// Plugin settings card (the `settings.plugin.item` seat).
|
|
473
692
|
'settings.title': 'Task Board',
|
|
474
|
-
'settings.description': '
|
|
693
|
+
'settings.description': 'Task orchestration, agent announcement and goal acceptance.',
|
|
475
694
|
'settings.enabled': 'Enable the task board',
|
|
695
|
+
'settings.enabledCardHint': 'Master switch, announcement, sleep protection and subtask depth.',
|
|
476
696
|
'settings.enabledHint': 'When off, the sidebar entry and board view are hidden and the task_board_* agent tools are unregistered; while on, any session can read and drive the board, its subtasks and its schedules through those tools.',
|
|
477
697
|
'settings.announceToAgent': 'Announce the task board to agents',
|
|
478
698
|
'settings.announceToAgentHint': 'On: every agent system prompt includes a note about this board. Off: no announcement; agents learn about the board only when you mention it.',
|
|
@@ -497,9 +717,105 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
497
717
|
'settings.unsaved': 'Unsaved',
|
|
498
718
|
'settings.saveFailed': 'The deployment did not accept these values; they were left for you to correct.',
|
|
499
719
|
'settings.invalidNumber': 'Enter a number, or leave blank to use the default.',
|
|
720
|
+
'settings.sessionPollSeconds': 'Session poll interval (seconds)',
|
|
721
|
+
'settings.sessionPollSecondsHint': 'Default 5. The Host reads the DSH session roster only while the board has something to reconcile: a running card or an open execution. With neither it stops polling and never re-scans the persisted session directory. Range 1 to 300 seconds: a shorter interval settles runs sooner and costs the Host more.',
|
|
500
722
|
'settings.maxSubtaskDepth': 'Subtask depth limit',
|
|
501
723
|
'settings.maxSubtaskDepthHint': 'Default 1: a task may carry one level of subtasks, and a subtask cannot create or link further subtasks. Maximum 3. Running a task also runs its whole subtask tree concurrently, and every extra level opens more sessions per run.',
|
|
502
724
|
'settings.maxSubtaskDepthOption': '{depth} levels',
|
|
725
|
+
'settings.runBehaviorTitle': 'Run behavior',
|
|
726
|
+
'settings.runBehaviorCardHint': 'The global native /goal switch (master control, off by default).',
|
|
727
|
+
'settings.goalRunGlobal': 'Global: run tasks with dsh native /goal',
|
|
728
|
+
'settings.goalRunGlobalHint': 'Off by default. While off, every task runs one plain turn and never calls dsh built-in /goal; a run uses native /goal only when this is on AND the task-level option is checked (see the task option below). The task-level checkbox always stays operable and this switch never rewrites it: the master switch only decides whether that choice takes effect. The switch is frozen when an execution starts, so it only affects runs opened afterwards.',
|
|
729
|
+
'settings.goalRunGlobalDisabledTaskOption': 'The global native /goal switch is off: the task-level option can still be checked or cleared, but it has no effect right now and the preference you save is never rewritten; turning the global switch back on applies it. This execution runs one plain turn and performs no goal acceptance.',
|
|
730
|
+
'settings.goalVerificationTitle': 'Task acceptance',
|
|
731
|
+
'settings.goalVerification': 'Enable task acceptance',
|
|
732
|
+
'settings.goalVerificationCardHint': 'The switch, the judge model and the criteria threshold.',
|
|
733
|
+
'settings.goalVerificationHint': 'On by default: a task executed in goal form must pass one acceptance before update_goal may mark it complete (the three coding criteria, aimed at engineering tasks, a 0.65 threshold, two rounds per criterion with the A/B slots swapped, and the work must beat the empty-work baseline). A first failure returns the total, the per-criterion scores and the located findings to the fixing agent, and one execution may accept at most twice; a second failure fails that execution. It affects only this board goal-form executions, never plain chat and never a task pinned to goalRun: false. Every acceptance really calls the judge model and spends quota.',
|
|
734
|
+
'settings.goalVerificationModel': 'Judge model',
|
|
735
|
+
'settings.goalVerificationModelHint': 'Blank inherits the host: the default route of the host model catalog, never the card pinned execution model.',
|
|
736
|
+
'settings.goalVerificationModelInherit': 'Inherit host ({model})',
|
|
737
|
+
'settings.goalVerificationModelInheritUnknown': 'Inherit host (no model catalog)',
|
|
738
|
+
'settings.goalVerificationEffort': 'Reasoning effort',
|
|
739
|
+
'settings.goalVerificationEffortHint': 'Blank inherits the host default level. A level the target model does not declare is never sent blindly: the acceptance falls back to that model own default level, and the fallback is reported below.',
|
|
740
|
+
'settings.goalVerificationEffortInherit': 'Inherit host ({effort})',
|
|
741
|
+
'settings.goalVerificationEffortInheritUnknown': 'Inherit host (model default level)',
|
|
742
|
+
'settings.goalVerificationResolved': 'Resolved acceptance configuration',
|
|
743
|
+
'settings.goalVerificationResolvedModel': 'Judge model: {model}',
|
|
744
|
+
'settings.goalVerificationResolvedEffort': 'Reasoning effort: {effort}',
|
|
745
|
+
'settings.goalVerificationResolvedNoEffort': 'Reasoning effort: not sent explicitly (the model default)',
|
|
746
|
+
'settings.goalVerificationResolvedSource': 'Source: {source}',
|
|
747
|
+
'settings.goalVerificationSourceInherit': 'inherited from the host',
|
|
748
|
+
'settings.goalVerificationSourceExplicit': 'explicit configuration',
|
|
749
|
+
'settings.goalVerificationResolvedPreset': 'Rubric: coding (Specification Adherence / Output Match / Error Signal Detection), threshold {threshold}',
|
|
750
|
+
'settings.goalVerificationRouteMissing': 'The host serves no model catalog, so no judge route resolves: with acceptance on, a goal completion claim is refused and recorded as an acceptance anomaly.',
|
|
751
|
+
'settings.goalVerificationEffortFallback': 'The selected reasoning effort {requested} is not supported by the target model; it falls back to {resolved}.',
|
|
752
|
+
'settings.goalVerificationEffortFallbackNone': 'The selected reasoning effort {requested} is not supported by the target model; it falls back to that model default level (not sent explicitly).',
|
|
753
|
+
'settings.goalVerificationModelInvalid': 'The configured judge model is not a provider/model route; the host default is used instead.',
|
|
754
|
+
'running.executing': 'Executing',
|
|
755
|
+
'running.verifying': 'Verifying',
|
|
756
|
+
'running.repairing': 'Fixing a failed acceptance',
|
|
757
|
+
'running.verificationPassed': 'Acceptance passed',
|
|
758
|
+
'running.verificationFailed': 'Acceptance failed',
|
|
759
|
+
'running.verificationInvalid': 'Invalid acceptance, waiting for a human',
|
|
760
|
+
'verify.title': 'Acceptance report',
|
|
761
|
+
'verify.status.passed': 'Passed',
|
|
762
|
+
'verify.status.failed': 'Failed',
|
|
763
|
+
'verify.status.exception': 'Anomaly',
|
|
764
|
+
'verify.status.verifying': 'Verifying',
|
|
765
|
+
'verify.status.pending': 'Not yet verified',
|
|
766
|
+
'verify.status.off': 'Acceptance was off for this execution',
|
|
767
|
+
'verify.status.invalid': 'Invalid acceptance',
|
|
768
|
+
'verify.status.invalidHeld': 'Invalid acceptance, waiting for a human',
|
|
769
|
+
'verify.attemptInvalid': 'Invalid acceptance {index}',
|
|
770
|
+
'verify.invalidReason.missing-finding': 'A failing criterion carries no structured finding of its own',
|
|
771
|
+
'verify.invalidReason.unlocatable-quote': 'A finding cites a passage that is not in the evidence the judge saw',
|
|
772
|
+
'verify.invalidReason.baseline-finding': 'A finding points at the empty-work baseline instead of this execution\'s work',
|
|
773
|
+
'verify.invalidReason.vacuous-finding': 'A finding is empty or a generic evaluation with no observation or difference',
|
|
774
|
+
'verify.invalidReason.insufficient-evidence': 'The judge saw too little evidence (for example a truncated trace) to support a veto',
|
|
775
|
+
'verify.invalidReason.unknown': 'No usable quality verdict was produced',
|
|
776
|
+
'verify.invalidCounts': 'Valid quality verdicts {quality}/{max} · invalid acceptances {invalid}/{maxInvalid} · anomalies {exceptions}/{max}',
|
|
777
|
+
'verify.invalidDetail': 'Invalid because: {reason}',
|
|
778
|
+
'verify.criterionFindings': 'Structured findings (criterion · cited location · verbatim citation)',
|
|
779
|
+
'verify.criterionFinding': '{criterion} · {location}: "{quote}"',
|
|
780
|
+
'verify.criterionFindingFull': '{criterion} · {location}: "{quote}" requirement: {requirement} observed: {observation} gap: {gap}',
|
|
781
|
+
'verify.location.task': 'task statement',
|
|
782
|
+
'verify.location.trajectory': 'execution trajectory',
|
|
783
|
+
'verify.location.workspace': 'host-recorded changes',
|
|
784
|
+
'verify.location.baseline': 'empty-work baseline (not evidence against the work)',
|
|
785
|
+
'verify.location.unknown': 'location not named',
|
|
786
|
+
'verify.detailRemoved': 'This attempt detail was cleaned up automatically after the execution passed and settled (the judge did report evidence).',
|
|
787
|
+
'verify.cleanup.cleaned': 'The acceptance-only detail of this execution was cleaned up automatically after it passed and settled; what remains is the lightweight audit credential.',
|
|
788
|
+
'verify.cleanup.pending': 'The acceptance-only detail is pending cleanup (started once the execution passes and settles).',
|
|
789
|
+
'verify.cleanup.failed': 'Cleaning the acceptance detail failed after {attempts} attempts: {error}. The pass record is still valid and the host retries on its next start.',
|
|
790
|
+
'verify.cleanup.audit': 'Kept credential: attempt {index} · {stage} · score {score} · evidence hash {hash}',
|
|
791
|
+
'verify.cleanup.stage.quality': 'quality verdict',
|
|
792
|
+
'verify.cleanup.stage.invalid': 'invalid acceptance',
|
|
793
|
+
'verify.cleanup.stage.exception': 'acceptance anomaly',
|
|
794
|
+
'verify.cleanup.stage.budget': 'time budget exhausted',
|
|
795
|
+
'verify.summary': 'Total {score} (threshold {threshold}) · empty-work baseline {baseline}',
|
|
796
|
+
'verify.criteria': 'Per-criterion scores',
|
|
797
|
+
'verify.criterion': '{name}: {score} (threshold {threshold})',
|
|
798
|
+
'verify.rounds': '{rounds} rounds per criterion, A/B slots swapped, averaged',
|
|
799
|
+
'verify.judge': 'Judge {model} (reasoning effort {effort})',
|
|
800
|
+
'verify.judgeNoEffort': 'Judge {model} (reasoning effort: not sent explicitly)',
|
|
801
|
+
'verify.judgeInherited': 'Judge {model} (inherited from the host)',
|
|
802
|
+
'verify.attempt': 'Acceptance {index}',
|
|
803
|
+
'verify.attemptException': 'Acceptance anomaly {index}',
|
|
804
|
+
'verify.counts': 'Quality verdicts {quality}/{max} · anomalies {exceptions}/{max}',
|
|
805
|
+
'verify.findings': 'Findings',
|
|
806
|
+
'verify.noFindings': 'The judge reported no locatable finding',
|
|
807
|
+
'verify.evidence': 'Evidence: {chars} characters · {entries} trace entries · {omitted} characters truncated',
|
|
808
|
+
'verify.workspaceEvidence': '{files} changed file(s) observed by the host',
|
|
809
|
+
'verify.usage': 'Usage: {calls} requests · {input} input · {output} output · {reasoning} reasoning tokens',
|
|
810
|
+
'verify.usageIncomplete': ' (at least one request usage is unknown; these counts are a floor)',
|
|
811
|
+
'verify.finalFailure': 'Verdict basis: {reason}',
|
|
812
|
+
'verify.applicability.disabled': 'Acceptance was off when this execution started; it settles on the historical verdict.',
|
|
813
|
+
'verify.applicability.goalUnavailable': 'This execution never became a goal run (the card did not check Start with /goal, or /goal was refused or unavailable), so acceptance was not enforced.',
|
|
814
|
+
'verify.applicability.skipped': 'This card checked Skip acceptance, so the execution was never judged.',
|
|
815
|
+
'verify.applicability.teamMember': 'Team member: the Lead team-summary evidence is accepted as one execution.',
|
|
816
|
+
'verify.applicability.goalDisabled': 'The global native /goal switch was off when this execution started, so it ran one plain turn: no goal acceptance was performed, which neither counts as a pass nor fails the run.',
|
|
817
|
+
'verify.effortFallback': 'Reasoning effort fallback: {requested} → {resolved}',
|
|
818
|
+
'verify.thresholdValue': '{value}%',
|
|
503
819
|
// Subtasks (parent/child links, cascade runs, link/detach).
|
|
504
820
|
'detail.parent': 'Parent task',
|
|
505
821
|
'detail.parent.open': 'Open parent task',
|
|
@@ -524,11 +840,32 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
524
840
|
'card.subtasksFailed': '{count} failed',
|
|
525
841
|
'card.subtasksRunning': '{count} running',
|
|
526
842
|
'card.subtasksBreakdown': 'Subtasks {total}: {done} done, {running} running, {failed} failed',
|
|
843
|
+
'card.result.succeeded': 'last succeeded',
|
|
844
|
+
'card.result.failed': 'last failed',
|
|
845
|
+
'card.result.cancelled': 'last cancelled',
|
|
846
|
+
'card.declared': 'set by hand',
|
|
847
|
+
'card.declaredHint': 'The column disagrees with the latest run: it was set by a manual move or an external system (such as a closed issue), not by that run settling.',
|
|
848
|
+
'card.openSession': 'Open the latest execution session',
|
|
849
|
+
'card.tagsLabel': 'labels {tags}',
|
|
850
|
+
'card.time.created': 'Created {time}',
|
|
851
|
+
'card.time.started': 'Running {time}',
|
|
852
|
+
'card.time.settled': 'Settled {time}',
|
|
853
|
+
'card.time.archived': 'Archived {time}',
|
|
854
|
+
'card.time.updated': 'Updated {time}',
|
|
855
|
+
'board.density.compact': 'Switch to compact cards',
|
|
856
|
+
'board.density.comfortable': 'Switch to full cards',
|
|
857
|
+
'board.group.today': 'Today',
|
|
858
|
+
'board.group.week': 'Last 7 days',
|
|
859
|
+
'board.group.earlier': 'Earlier',
|
|
860
|
+
'board.group.expand': 'Show {count}',
|
|
861
|
+
'board.group.collapse': 'Collapse',
|
|
527
862
|
'board.hideSubtasks': 'Hide subtasks',
|
|
528
863
|
'board.showSubtasks': 'Show subtasks',
|
|
529
864
|
'board.subtaskFilterHint': 'The board shows parent tasks only; a text or label filter reveals the subtasks automatically.',
|
|
530
865
|
}
|
|
531
866
|
|
|
867
|
+
/** The dictionary key union. */
|
|
868
|
+
|
|
532
869
|
/** The dictionary key union. */
|
|
533
870
|
export type TaskBoardKey = keyof typeof zh
|
|
534
871
|
|
|
@@ -16,12 +16,15 @@
|
|
|
16
16
|
*
|
|
17
17
|
* @module @linxin666/dsh-client-ui-task-board/client
|
|
18
18
|
*/
|
|
19
|
+
import { useMemo } from 'react'
|
|
20
|
+
import type { ReactNode } from 'react'
|
|
19
21
|
import type { Context as ClientContext } from '@deepseek-ai/cordis'
|
|
20
22
|
import type {} from '@deepseek-ai/dsh-client-ui-slots'
|
|
21
23
|
import type {} from '@deepseek-ai/dsh-client-ui-layout/client'
|
|
22
24
|
import type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'
|
|
23
25
|
import { TASK_BOARD_PANEL_ID, type BoardController } from '../core/controller.ts'
|
|
24
26
|
import { TaskBoard } from './board/TaskBoard.tsx'
|
|
27
|
+
import { seatsFromRenderSlot, TaskBoardSeatsProvider, type SlotRenderBinding } from './seats.tsx'
|
|
25
28
|
import { t } from './locales.ts'
|
|
26
29
|
import css from './board.module.css'
|
|
27
30
|
|
|
@@ -72,10 +75,17 @@ export function TaskBoardPanelIcon({ size }: { size: number; active: boolean }):
|
|
|
72
75
|
* @param props - the framework main-slot share plus this entry's injected face.
|
|
73
76
|
* @returns the board page.
|
|
74
77
|
*/
|
|
75
|
-
export function TaskBoardPanel({ controller
|
|
78
|
+
export function TaskBoardPanel({ controller, renderSlot }: {
|
|
79
|
+
controller: BoardController
|
|
80
|
+
/** Child-slot renderer the registration declares (detail + card decoration). */
|
|
81
|
+
renderSlot?: SlotRenderBinding
|
|
82
|
+
}): ReactNode {
|
|
83
|
+
const seats = useMemo(() => seatsFromRenderSlot(renderSlot), [renderSlot])
|
|
76
84
|
return (
|
|
77
85
|
<div className={css.panel} data-dsh-taskboard-view="" data-dsh-plugin="task-board">
|
|
78
|
-
<
|
|
86
|
+
<TaskBoardSeatsProvider value={seats}>
|
|
87
|
+
<TaskBoard controller={controller} />
|
|
88
|
+
</TaskBoardSeatsProvider>
|
|
79
89
|
</div>
|
|
80
90
|
)
|
|
81
91
|
}
|
|
@@ -115,6 +125,12 @@ export function registerTaskBoardPanel(ctx: ClientContext, controller: BoardCont
|
|
|
115
125
|
disposers.push(slots.inject('main', () => slots.register({
|
|
116
126
|
name: 'main',
|
|
117
127
|
key: TASK_BOARD_PANEL_ID,
|
|
128
|
+
// The board declares the provider child seats here; a provider registers
|
|
129
|
+
// into them and this entry renders them through the injected renderSlot.
|
|
130
|
+
children: {
|
|
131
|
+
'task-board.detail.section': { kind: 'list', scope: 'root' },
|
|
132
|
+
'task-board.card.decoration': { kind: 'list', scope: 'root' },
|
|
133
|
+
},
|
|
118
134
|
inject: (): PanelFace => ({ controller }),
|
|
119
135
|
}, TaskBoardPanel as never)))
|
|
120
136
|
|
|
@@ -86,6 +86,11 @@ export interface PluginCardSeat {
|
|
|
86
86
|
label?: () => string
|
|
87
87
|
/** Locale namespace the card renders with. */
|
|
88
88
|
locale: string
|
|
89
|
+
/**
|
|
90
|
+
* Child slots this card declares and renders. Forwarded to whichever seat
|
|
91
|
+
* the host renders; absent for a card that declares none.
|
|
92
|
+
*/
|
|
93
|
+
children?: Record<string, unknown>
|
|
89
94
|
/** Business-face factory of the registration. */
|
|
90
95
|
inject?: () => object
|
|
91
96
|
/**
|
|
@@ -162,12 +167,14 @@ export function installPluginCard(ctx: PluginCardContext, seat: PluginCardSeat):
|
|
|
162
167
|
...(seat.order === undefined ? {} : { order: seat.order }),
|
|
163
168
|
...(seat.label === undefined ? {} : { label: seat.label }),
|
|
164
169
|
locale: seat.locale,
|
|
170
|
+
...(seat.children === undefined ? {} : { children: seat.children }),
|
|
165
171
|
...(seat.inject === undefined ? {} : { inject }),
|
|
166
172
|
}
|
|
167
173
|
: {
|
|
168
174
|
name: OFFICIAL_PLUGIN_CARD_SEAT,
|
|
169
175
|
key: seat.bundle,
|
|
170
176
|
locale: seat.locale,
|
|
177
|
+
...(seat.children === undefined ? {} : { children: seat.children }),
|
|
171
178
|
...(seat.inject === undefined ? {} : { inject }),
|
|
172
179
|
}) as never, component) as () => void
|
|
173
180
|
current = target
|