@linxin666/dsh-client-ui-task-board 0.4.3 → 0.4.5
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 +56 -18
- package/README.zh.md +56 -18
- package/lib/client.js +6242 -958
- package/lib/client.js.map +1 -1
- package/lib/index.js +3475 -234
- package/lib/types/client/PluginSettingsCard.d.ts +7 -0
- package/lib/types/client/TaskBoardSettingsCard.d.ts +19 -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 +23 -2
- 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/preset-label.d.ts +22 -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/board-card-seat.d.ts +34 -0
- package/lib/types/client/host-api.d.ts +24 -1
- package/lib/types/client/index.d.ts +19 -0
- package/lib/types/client/locales.d.ts +141 -3
- package/lib/types/client/native-panel.d.ts +6 -20
- package/lib/types/client/schedule-zone.d.ts +47 -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 +38 -1
- package/lib/types/core/degraded-reason.d.ts +46 -0
- 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/package-name.d.ts +9 -0
- package/lib/types/core/schedule.d.ts +95 -20
- package/lib/types/core/subtask.d.ts +30 -11
- package/lib/types/core/tasks.d.ts +110 -5
- package/lib/types/core/use-cases/task-create.d.ts +2 -1
- package/lib/types/core/use-cases/task-schedule.d.ts +8 -4
- 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.d.ts +386 -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 +71 -0
- package/lib/types/host/verification-runner.d.ts +108 -0
- package/lib/types/host/workspace-evidence.d.ts +53 -0
- package/lib/types/host-ledger.d.ts +107 -11
- package/lib/types/host-runner.d.ts +99 -4
- package/lib/types/host-service.d.ts +114 -2
- package/lib/types/index.d.ts +80 -26
- package/lib/types/protocol.d.ts +53 -3
- package/lib/types/tool-surface.d.ts +71 -0
- package/package.json +27 -26
- package/src/client/PluginSettingsCard.tsx +9 -0
- package/src/client/TaskBoardSettingsCard.tsx +304 -65
- 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 +30 -15
- package/src/client/board/NewTaskModal.tsx +288 -151
- package/src/client/board/TagManagerModal.tsx +235 -0
- package/src/client/board/TaskBoard.tsx +259 -103
- package/src/client/board/TaskCard.tsx +238 -86
- package/src/client/board/TaskDetail.tsx +154 -59
- package/src/client/board/TaskForm.tsx +61 -6
- package/src/client/board/VerificationReport.tsx +203 -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/preset-label.ts +44 -0
- package/src/client/board/status-key.ts +27 -0
- package/src/client/board/task-markdown.module.css +137 -0
- package/src/client/board/task-markdown.tsx +106 -0
- package/src/client/board-card-seat.ts +102 -0
- package/src/client/board-settings.module.css +66 -0
- package/src/client/board.module.css +602 -68
- package/src/client/host-api.ts +109 -6
- package/src/client/index.ts +48 -6
- package/src/client/locales.ts +290 -12
- package/src/client/native-panel.tsx +18 -2
- package/src/client/schedule-zone.ts +135 -0
- 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 +101 -5
- package/src/core/degraded-reason.ts +81 -0
- 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/package-name.ts +9 -0
- package/src/core/schedule.ts +211 -55
- package/src/core/store.ts +26 -1
- package/src/core/subtask.ts +77 -22
- package/src/core/tasks.ts +138 -10
- package/src/core/use-cases/task-create.ts +14 -2
- package/src/core/use-cases/task-parent.ts +3 -2
- package/src/core/use-cases/task-schedule.ts +17 -6
- package/src/core/use-cases/task-tag.ts +110 -0
- package/src/core/use-cases/task-update.ts +13 -4
- package/src/core/verification.ts +826 -0
- package/src/core/workspace-target.ts +59 -0
- package/src/host/agent-tools.ts +58 -24
- package/src/host/extension-registry.ts +509 -0
- package/src/host/llm-dispatch.ts +87 -0
- package/src/host/verification-gate.ts +331 -0
- package/src/host/verification-runner.ts +535 -0
- package/src/host/workspace-evidence.ts +176 -0
- package/src/host-ai.ts +15 -9
- package/src/host-ledger.ts +342 -51
- package/src/host-routes.ts +15 -2
- package/src/host-runner.ts +219 -20
- package/src/host-service.ts +346 -26
- package/src/index.ts +204 -16
- package/src/protocol.ts +122 -9
- package/src/tool-surface.ts +95 -0
- package/lib/types/host/run-guarded.d.ts +0 -39
- package/src/host/run-guarded.ts +0 -76
package/src/client/locales.ts
CHANGED
|
@@ -26,11 +26,13 @@ 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
|
-
'board.hostError.notMounted': '
|
|
31
|
+
'board.hostError.notMounted': '任务看板的后台接口没有挂载:宿主没有加载这个插件(可能未安装、未启用,或该行启动失败)。重启 DSH 服务后再试',
|
|
32
|
+
'board.hostError.ledgerLocked': '任务看板的账本已被另一个 DSH 进程占用(占用者 pid {pid}),本实例没有注册后台接口:关闭那个 DSH 实例,或等它退出后再点重试——反复重启本实例无效(宿主原因:{detail})',
|
|
33
|
+
'board.hostError.degraded': '任务看板这一行在启动时降级,后台接口没有注册(宿主原因:{detail})',
|
|
33
34
|
'board.hostError.unauthorized': '登录状态已失效,请刷新页面后重试',
|
|
35
|
+
'board.hostError.forbidden': '当前环境未通过同源校验:桌面外壳或反向代理可能未传递浏览器标记,也没有携带宿主认证凭据',
|
|
34
36
|
'board.hostError.locked': '任务看板的后台数据被占用:{detail}',
|
|
35
37
|
'board.hostError.timeout': '后台 {seconds} 秒内没有响应,请稍后重试',
|
|
36
38
|
'board.hostError.unreachable': '连接不上本机 DSH 服务,请确认它仍在运行',
|
|
@@ -55,6 +57,20 @@ export const zh = {
|
|
|
55
57
|
'new.aiParseFailed': '解析失败:{error}',
|
|
56
58
|
'board.retryHost': '重试连接 Host',
|
|
57
59
|
'board.hostMeta': 'Host 时区 {timeZone} · revision {revision}',
|
|
60
|
+
// 新建/编辑对话框的区域分组:折叠后每个区域仍以一行摘要显示当前配置。
|
|
61
|
+
'new.section.parse': 'AI 解析',
|
|
62
|
+
'new.section.content': '任务内容',
|
|
63
|
+
'new.section.labels': '标签',
|
|
64
|
+
'new.section.execution': '执行设置',
|
|
65
|
+
'new.section.run': '运行方式',
|
|
66
|
+
'new.section.handover': '交接与续跑',
|
|
67
|
+
'new.section.schedule': '定时运行',
|
|
68
|
+
'new.summary.none': '未设置',
|
|
69
|
+
'new.summary.labelCount': '{count} 个标签',
|
|
70
|
+
'new.summary.filled': '已填写',
|
|
71
|
+
'new.summary.scheduleOff': '未启用',
|
|
72
|
+
'new.summary.multiRound': '多轮 /goal',
|
|
73
|
+
'new.summary.singleRound': '单轮',
|
|
58
74
|
'new.title': '标题',
|
|
59
75
|
'new.titlePlaceholder': '一句话描述要做什么',
|
|
60
76
|
'new.description': '描述',
|
|
@@ -91,6 +107,22 @@ export const zh = {
|
|
|
91
107
|
'board.tagFilter': '按标签筛选',
|
|
92
108
|
'board.tagFilterClear': '清除标签筛选',
|
|
93
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': '完成',
|
|
94
126
|
'detail.permissionPending': '权限待确认:本卡有效权限({permission})高于会话默认,手动执行与定时调度都会被拒绝,需人工确认后才能运行。',
|
|
95
127
|
'detail.permissionConfirm': '确认权限绑定',
|
|
96
128
|
'detail.permissionConfirmed': '已确认权限绑定 · {time}',
|
|
@@ -106,6 +138,8 @@ export const zh = {
|
|
|
106
138
|
'new.archiveOriginal': '创建后归档原任务',
|
|
107
139
|
'detail.prompt': '执行 Prompt',
|
|
108
140
|
'detail.description': '描述',
|
|
141
|
+
'detail.expand': '展开全文',
|
|
142
|
+
'detail.collapse': '收起',
|
|
109
143
|
'detail.execution': '执行记录',
|
|
110
144
|
'detail.noExecution': '尚未执行',
|
|
111
145
|
'detail.run': '执行',
|
|
@@ -129,6 +163,9 @@ export const zh = {
|
|
|
129
163
|
'delete.cancel': '取消',
|
|
130
164
|
'status.move.backlog': '移到待规划',
|
|
131
165
|
'status.move.todo': '移到待办',
|
|
166
|
+
'status.move.running': '移到进行中',
|
|
167
|
+
'status.move.done': '移到已完成',
|
|
168
|
+
'status.move.failed': '移到已失败',
|
|
132
169
|
'exec.error.noWorkspace': '没有可用工作区,无法执行任务',
|
|
133
170
|
'exec.error.promptRejected': 'Prompt 被拒绝',
|
|
134
171
|
'run.failed': '执行失败:{error}',
|
|
@@ -146,13 +183,31 @@ export const zh = {
|
|
|
146
183
|
'detail.schedule.invalid': 'Cron 表达式无效',
|
|
147
184
|
'detail.schedule.notScheduled': '尚未排程',
|
|
148
185
|
'detail.schedule.dueSoon': '即将运行',
|
|
186
|
+
'detail.schedule.timeZone': '时区',
|
|
187
|
+
'detail.schedule.timeZoneHost': 'Host 时区({timeZone})',
|
|
188
|
+
'detail.schedule.timeZoneHostUnknown': 'Host 时区(未知)',
|
|
189
|
+
'detail.schedule.timeZoneHint': 'Cron 的墙上时间按此时区解读;夏令时跳变会跳过不存在的时刻,重复的时刻只触发一次。',
|
|
190
|
+
'detail.schedule.timeZoneSearch': '搜索时区…',
|
|
191
|
+
'detail.schedule.timeZoneNone': '没有匹配的时区',
|
|
192
|
+
'detail.schedule.nextRunOverdue': '已逾期 {duration}',
|
|
193
|
+
'detail.schedule.duration.days': '{count} 天',
|
|
194
|
+
'detail.schedule.duration.hours': '{count} 小时',
|
|
195
|
+
'detail.schedule.duration.minutes': '{count} 分钟',
|
|
196
|
+
'detail.schedule.duration.seconds': '{count} 秒',
|
|
149
197
|
'card.scheduled': '定时',
|
|
150
198
|
'new.workspace': '工作区',
|
|
151
|
-
'new.
|
|
199
|
+
'new.agentPreset': 'Agent 预设',
|
|
152
200
|
'new.permission': '权限',
|
|
153
201
|
'new.model': '模型',
|
|
154
202
|
'exec.workspace.recent': '最近使用(默认)',
|
|
155
|
-
'exec.mode.
|
|
203
|
+
'exec.mode.inherit': '继承(部署默认)',
|
|
204
|
+
'exec.mode.inheritWith': '继承(部署默认:{preset})',
|
|
205
|
+
'exec.mode.builtinGroup': '内置预设',
|
|
206
|
+
'exec.mode.customGroup': '自定义预设',
|
|
207
|
+
'preset.builtin.standard': '标准',
|
|
208
|
+
'preset.builtin.ptc': 'PTC(程序化工具调用)',
|
|
209
|
+
'preset.builtin.minimal': '极简',
|
|
210
|
+
'preset.builtin.cordis': 'Cordis',
|
|
156
211
|
'exec.mode.defaultSuffix': '(默认)',
|
|
157
212
|
'exec.mode.brokenSuffix': '(不可用)',
|
|
158
213
|
'exec.mode.removed': '(已移除)',
|
|
@@ -168,12 +223,17 @@ export const zh = {
|
|
|
168
223
|
'exec.teamRunHint': '开启后:执行本任务只启动一个 Leader 会话,每个子任务由它派生为 teammate 并在该会话内并行工作(子任务自身的权限钉住不适用)。关闭则每个成员各开独立会话。',
|
|
169
224
|
'exec.teamRunUnavailable': '当前部署未提供 Agent Teams 服务,无法启用。',
|
|
170
225
|
'exec.reuseSessionHint': '开启后,本任务的后续执行在上一次会话里继续(该会话空闲且仍存在时),不再每次新建对话;每次复用时都会重新应用上面钉住的权限与模型。',
|
|
226
|
+
'exec.goalRun': '以 dsh 内置的 /goal 开始执行任务',
|
|
227
|
+
'exec.goalRunHint': '默认开启:执行时把任务目标作为持久目标交给 dsh 内置的 /goal,会话会自动续跑多轮,直到 agent 标记目标完成;看板在该目标真正结束后才结算本次执行。关闭则只执行一轮普通对话。',
|
|
228
|
+
'exec.skipVerification': '跳过本任务的验收',
|
|
229
|
+
'exec.skipVerificationHint': '默认关闭:勾选后本任务以 goal 形式执行时不再拦截 update_goal 标记完成,也不要求通过验收;执行记录会标注「该卡片跳过验收」。仅对之后新开的执行生效,验收总开关关闭时本项无意义。',
|
|
171
230
|
'detail.executionSettings': '执行设置',
|
|
172
|
-
'exec.hint': '
|
|
231
|
+
'exec.hint': '执行时生效:工作区决定执行会话落在哪个工作区;Agent 预设决定会话的组合(工具面与提示词段);权限经 /permission 命令应用到会话。留空则继承部署默认。',
|
|
173
232
|
// 插件设置卡片(settings.plugin.item 席位)。
|
|
174
233
|
'settings.title': '任务看板',
|
|
175
|
-
'settings.description': '
|
|
234
|
+
'settings.description': '任务编排、agent 播报与目标验收。',
|
|
176
235
|
'settings.enabled': '启用任务看板',
|
|
236
|
+
'settings.enabledCardHint': '总开关、播报、睡眠保护与子任务层级。',
|
|
177
237
|
'settings.enabledHint': '关闭后隐藏侧边栏入口与看板视图,并注销 task_board_* agent 工具;开启时任何会话都可以通过这些工具读写看板、子任务与定时计划。',
|
|
178
238
|
'settings.announceToAgent': '向 agent 播报任务看板',
|
|
179
239
|
'settings.announceToAgentHint': '开启:每条 agent 系统提示都会包含本看板的说明;关闭:不播报,agent 仅在用户主动提及时了解看板。',
|
|
@@ -201,6 +261,65 @@ export const zh = {
|
|
|
201
261
|
'settings.maxSubtaskDepth': '子任务深度上限',
|
|
202
262
|
'settings.maxSubtaskDepthHint': '默认 1:一个任务只允许一层子任务,子任务不能再创建或关联子任务。最大 3。执行父任务会并发执行它的整棵子任务树,层级越深,一次执行开启的会话越多。',
|
|
203
263
|
'settings.maxSubtaskDepthOption': '{depth} 层',
|
|
264
|
+
'settings.goalVerificationTitle': '任务验收',
|
|
265
|
+
'settings.goalVerification': '启用任务验收',
|
|
266
|
+
'settings.goalVerificationCardHint': '验收开关、裁判模型与判据阈值。',
|
|
267
|
+
'settings.goalVerificationHint': '默认打开:以 goal 形式执行的任务在 update_goal 标记完成前必须先通过一次验收(三项 coding 判据(本分区面向工程任务)、阈值 0.65、每项两轮且交换 A/B 位置,实际工作须胜过空工作基线)。首次不通过会把总分、逐项分数与可定位问题反馈给 agent 修复,同一执行最多两次验收;第二次仍不通过则本次执行判失败。仅作用于本插件以 goal 形式执行的任务,不影响普通聊天,也不影响显式 goalRun:false 的单回合任务。每次验收都会真实调用裁判模型并消耗额度。',
|
|
268
|
+
'settings.goalVerificationModel': '验收模型',
|
|
269
|
+
'settings.goalVerificationModelHint': '留空即继承宿主:使用宿主模型目录的默认路由,而不是任务卡钉住的执行模型。',
|
|
270
|
+
'settings.goalVerificationModelInherit': '继承宿主({model})',
|
|
271
|
+
'settings.goalVerificationModelInheritUnknown': '继承宿主(宿主未提供模型目录)',
|
|
272
|
+
'settings.goalVerificationEffort': '推理强度',
|
|
273
|
+
'settings.goalVerificationEffortHint': '留空即继承宿主默认档位。目标模型不支持所选档位时不会盲传:验收改用该模型自己的默认档位,并在下方标注回退。',
|
|
274
|
+
'settings.goalVerificationEffortInherit': '继承宿主({effort})',
|
|
275
|
+
'settings.goalVerificationEffortInheritUnknown': '继承宿主(模型默认档位)',
|
|
276
|
+
'settings.goalVerificationResolved': '实际解析后的验收配置',
|
|
277
|
+
'settings.goalVerificationResolvedModel': '裁判模型:{model}',
|
|
278
|
+
'settings.goalVerificationResolvedEffort': '推理强度:{effort}',
|
|
279
|
+
'settings.goalVerificationResolvedNoEffort': '推理强度:不显式传参(用模型自身默认)',
|
|
280
|
+
'settings.goalVerificationResolvedSource': '来源:{source}',
|
|
281
|
+
'settings.goalVerificationSourceInherit': '继承宿主',
|
|
282
|
+
'settings.goalVerificationSourceExplicit': '显式配置',
|
|
283
|
+
'settings.goalVerificationResolvedPreset': '判据:coding(Specification Adherence / Output Match / Error Signal Detection),阈值 {threshold}',
|
|
284
|
+
'settings.goalVerificationRouteMissing': '宿主未提供模型目录,无法解析验收模型:开启后 goal 任务的完成声明会被拒绝并记录为验收异常。',
|
|
285
|
+
'settings.goalVerificationEffortFallback': '所选推理强度 {requested} 不被目标模型支持,已回退为 {resolved}。',
|
|
286
|
+
'settings.goalVerificationEffortFallbackNone': '所选推理强度 {requested} 不被目标模型支持,已回退为该模型默认档位(不显式传参)。',
|
|
287
|
+
'settings.goalVerificationModelInvalid': '配置的验收模型不是 provider/model 形式,已回退宿主默认。',
|
|
288
|
+
'running.executing': '执行中',
|
|
289
|
+
'running.verifying': '验收中',
|
|
290
|
+
'running.repairing': '验收未通过修复中',
|
|
291
|
+
'running.verificationPassed': '验收通过',
|
|
292
|
+
'running.verificationFailed': '验收未通过',
|
|
293
|
+
'verify.title': '验收报告',
|
|
294
|
+
'verify.status.passed': '通过',
|
|
295
|
+
'verify.status.failed': '未通过',
|
|
296
|
+
'verify.status.exception': '异常',
|
|
297
|
+
'verify.status.verifying': '验收中',
|
|
298
|
+
'verify.status.pending': '待验收',
|
|
299
|
+
'verify.status.off': '本次执行未启用验收',
|
|
300
|
+
'verify.summary': '总分 {score}(阈值 {threshold})· 空工作基线 {baseline}',
|
|
301
|
+
'verify.criteria': '逐项判据',
|
|
302
|
+
'verify.criterion': '{name}:{score}(阈值 {threshold})',
|
|
303
|
+
'verify.rounds': '每项 {rounds} 轮,交换 A/B 位置后取平均',
|
|
304
|
+
'verify.judge': '裁判模型 {model}(推理强度 {effort})',
|
|
305
|
+
'verify.judgeNoEffort': '裁判模型 {model}(推理强度:不显式传参)',
|
|
306
|
+
'verify.judgeInherited': '裁判模型 {model}(继承宿主)',
|
|
307
|
+
'verify.attempt': '第 {index} 次验收',
|
|
308
|
+
'verify.attemptException': '第 {index} 次验收异常',
|
|
309
|
+
'verify.counts': '质量验收 {quality}/{max} · 验收异常 {exceptions}/{max}',
|
|
310
|
+
'verify.findings': '问题反馈',
|
|
311
|
+
'verify.noFindings': '本次裁判没有报告可定位的问题',
|
|
312
|
+
'verify.evidence': '证据范围:{chars} 字符 · {entries} 条轨迹 · 截断 {omitted} 字符',
|
|
313
|
+
'verify.workspaceEvidence': '其中 {files} 个文件变更取自宿主自身观察',
|
|
314
|
+
'verify.usage': '用量:请求 {calls} 次 · 输入 {input} · 输出 {output} · 推理 {reasoning} tokens',
|
|
315
|
+
'verify.usageIncomplete': '(至少一次请求的用量未知,以上为下限)',
|
|
316
|
+
'verify.finalFailure': '判定依据:{reason}',
|
|
317
|
+
'verify.applicability.disabled': '本次执行启动时验收开关关闭,按原有回合判定结算。',
|
|
318
|
+
'verify.applicability.goalUnavailable': '本次执行未成为 goal 执行(/goal 被拒绝或不可用),验收未强制执行。',
|
|
319
|
+
'verify.applicability.skipped': '该任务卡勾选了「跳过验收」,本次执行未经验收判定。',
|
|
320
|
+
'verify.applicability.teamMember': '团队执行成员:由 Lead 的团队汇总证据统一验收。',
|
|
321
|
+
'verify.effortFallback': '推理强度回退:{requested} → {resolved}',
|
|
322
|
+
'verify.thresholdValue': '{value}%',
|
|
204
323
|
// 子任务(父子关系、级联执行、关联/解除关联)。
|
|
205
324
|
'detail.parent': '父任务',
|
|
206
325
|
'detail.parent.open': '打开父任务',
|
|
@@ -225,6 +344,25 @@ export const zh = {
|
|
|
225
344
|
'card.subtasksFailed': '{count} 失败',
|
|
226
345
|
'card.subtasksRunning': '{count} 运行中',
|
|
227
346
|
'card.subtasksBreakdown': '子任务 {total}:已完成 {done},运行中 {running},失败 {failed}',
|
|
347
|
+
'card.result.succeeded': '最近成功',
|
|
348
|
+
'card.result.failed': '最近失败',
|
|
349
|
+
'card.result.cancelled': '最近取消',
|
|
350
|
+
'card.declared': '手动结算',
|
|
351
|
+
'card.declaredHint': '卡片所在列与最近一次执行结果不一致:该列由人工移动或外部系统(如 Issue 关闭)设置,而不是这次执行的结算。',
|
|
352
|
+
'card.openSession': '打开最近执行的会话',
|
|
353
|
+
'card.tagsLabel': '标签 {tags}',
|
|
354
|
+
'card.time.created': '创建于 {time}',
|
|
355
|
+
'card.time.started': '已运行 {time}',
|
|
356
|
+
'card.time.settled': '结算于 {time}',
|
|
357
|
+
'card.time.archived': '归档于 {time}',
|
|
358
|
+
'card.time.updated': '更新于 {time}',
|
|
359
|
+
'board.density.compact': '切换为紧凑卡片',
|
|
360
|
+
'board.density.comfortable': '切换为完整卡片',
|
|
361
|
+
'board.group.today': '今天',
|
|
362
|
+
'board.group.week': '近 7 天',
|
|
363
|
+
'board.group.earlier': '更早',
|
|
364
|
+
'board.group.expand': '展开 {count} 张',
|
|
365
|
+
'board.group.collapse': '收起',
|
|
228
366
|
'board.hideSubtasks': '隐藏子任务',
|
|
229
367
|
'board.showSubtasks': '显示子任务',
|
|
230
368
|
'board.subtaskFilterHint': '看板默认只显示父任务;搜索或按标签筛选时会自动展开子任务。',
|
|
@@ -251,11 +389,13 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
251
389
|
'board.status.failed': 'Failed',
|
|
252
390
|
'board.runs': 'runs',
|
|
253
391
|
'board.pending': 'Submitting',
|
|
254
|
-
'board.updated': 'Updated',
|
|
255
392
|
'board.created': 'Created',
|
|
256
393
|
'board.hostError': 'Host action failed: {error}',
|
|
257
|
-
'board.hostError.notMounted': 'The task board Host API is not mounted: the Host
|
|
394
|
+
'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',
|
|
395
|
+
'board.hostError.ledgerLocked': 'Another DSH process (pid {pid}) holds the task board ledger, so this instance registered no Host API: close that DSH instance, or wait for it to exit and retry. Restarting this instance cannot help (reason: {detail})',
|
|
396
|
+
'board.hostError.degraded': 'The task board row degraded during start, so its Host API was not registered: {detail}',
|
|
258
397
|
'board.hostError.unauthorized': 'This session is no longer signed in; reload the page and try again',
|
|
398
|
+
'board.hostError.forbidden': 'The request did not pass the same-origin fence: the desktop shell or reverse proxy may not have forwarded browser credentials',
|
|
259
399
|
'board.hostError.locked': 'The task board ledger is locked: {detail}',
|
|
260
400
|
'board.hostError.timeout': 'The Host did not answer within {seconds}s; try again shortly',
|
|
261
401
|
'board.hostError.unreachable': 'Cannot reach the local DSH service; make sure it is still running',
|
|
@@ -280,6 +420,20 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
280
420
|
'new.aiParseFailed': 'Parsing failed: {error}',
|
|
281
421
|
'board.retryHost': 'Retry Host connection',
|
|
282
422
|
'board.hostMeta': 'Host time zone {timeZone} · revision {revision}',
|
|
423
|
+
// Create/edit dialog regions: a collapsed region still shows a one-line summary of its values.
|
|
424
|
+
'new.section.parse': 'AI Parse',
|
|
425
|
+
'new.section.content': 'Task Content',
|
|
426
|
+
'new.section.labels': 'Tags',
|
|
427
|
+
'new.section.execution': 'Execution Settings',
|
|
428
|
+
'new.section.run': 'Run Mode',
|
|
429
|
+
'new.section.handover': 'Handover',
|
|
430
|
+
'new.section.schedule': 'Scheduled Runs',
|
|
431
|
+
'new.summary.none': 'Not set',
|
|
432
|
+
'new.summary.labelCount': '{count} tags',
|
|
433
|
+
'new.summary.filled': 'Filled',
|
|
434
|
+
'new.summary.scheduleOff': 'Off',
|
|
435
|
+
'new.summary.multiRound': 'multi-round /goal',
|
|
436
|
+
'new.summary.singleRound': 'single round',
|
|
283
437
|
'new.title': 'Title',
|
|
284
438
|
'new.titlePlaceholder': 'What should be done, in one line',
|
|
285
439
|
'new.description': 'Description',
|
|
@@ -316,6 +470,22 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
316
470
|
'board.tagFilter': 'Filter by tag',
|
|
317
471
|
'board.tagFilterClear': 'Clear tag filter',
|
|
318
472
|
'board.tagEmpty': 'No task carries all of these tags',
|
|
473
|
+
'board.tagManage': 'Manage labels',
|
|
474
|
+
'tags.title': 'Label manager',
|
|
475
|
+
'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.',
|
|
476
|
+
'tags.empty': 'No labels are in use.',
|
|
477
|
+
'tags.usage': '{count} tasks',
|
|
478
|
+
'tags.rename': 'Rename',
|
|
479
|
+
'tags.renameLabel': 'Rename the label {name}',
|
|
480
|
+
'tags.delete': 'Delete',
|
|
481
|
+
'tags.deleteTitle': 'Delete label',
|
|
482
|
+
'tags.deleteConfirm': 'Remove the label "{name}" from {count} task(s)? Its execution hint is removed with it; the tasks themselves are unaffected.',
|
|
483
|
+
'tags.deleteOk': 'Delete',
|
|
484
|
+
'tags.save': 'Save',
|
|
485
|
+
'tags.mergeHint': 'Merges into the existing label "{name}"',
|
|
486
|
+
'tags.renameFailed': 'The rename was not accepted.',
|
|
487
|
+
'tags.deleteFailed': 'The deletion was not accepted.',
|
|
488
|
+
'tags.done': 'Done',
|
|
319
489
|
'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.',
|
|
320
490
|
'detail.permissionConfirm': 'Confirm permission binding',
|
|
321
491
|
'detail.permissionConfirmed': 'Permission confirmed · {time}',
|
|
@@ -331,6 +501,8 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
331
501
|
'new.archiveOriginal': 'Archive original task upon creation',
|
|
332
502
|
'detail.prompt': 'Run Prompt',
|
|
333
503
|
'detail.description': 'Description',
|
|
504
|
+
'detail.expand': 'Show more',
|
|
505
|
+
'detail.collapse': 'Show less',
|
|
334
506
|
'detail.execution': 'Execution History',
|
|
335
507
|
'detail.noExecution': 'Not executed yet',
|
|
336
508
|
'detail.run': 'Run',
|
|
@@ -354,6 +526,9 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
354
526
|
'delete.cancel': 'Cancel',
|
|
355
527
|
'status.move.backlog': 'Move to Backlog',
|
|
356
528
|
'status.move.todo': 'Move to To Do',
|
|
529
|
+
'status.move.running': 'Move to Running',
|
|
530
|
+
'status.move.done': 'Move to Done',
|
|
531
|
+
'status.move.failed': 'Move to Failed',
|
|
357
532
|
'exec.error.noWorkspace': 'No workspace is available to run the task',
|
|
358
533
|
'exec.error.promptRejected': 'Prompt rejected',
|
|
359
534
|
'run.failed': 'Run failed: {error}',
|
|
@@ -371,13 +546,31 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
371
546
|
'detail.schedule.invalid': 'Invalid cron expression',
|
|
372
547
|
'detail.schedule.notScheduled': 'Not scheduled yet',
|
|
373
548
|
'detail.schedule.dueSoon': 'Due soon',
|
|
549
|
+
'detail.schedule.timeZone': 'Time zone',
|
|
550
|
+
'detail.schedule.timeZoneHost': 'Host time zone ({timeZone})',
|
|
551
|
+
'detail.schedule.timeZoneHostUnknown': 'Host time zone (unknown)',
|
|
552
|
+
'detail.schedule.timeZoneHint': 'The cron wall clock is read in this zone; daylight-saving gaps are skipped and a repeated time fires once.',
|
|
553
|
+
'detail.schedule.timeZoneSearch': 'Search time zones…',
|
|
554
|
+
'detail.schedule.timeZoneNone': 'No matching time zone',
|
|
555
|
+
'detail.schedule.nextRunOverdue': 'Overdue by {duration}',
|
|
556
|
+
'detail.schedule.duration.days': '{count}d',
|
|
557
|
+
'detail.schedule.duration.hours': '{count}h',
|
|
558
|
+
'detail.schedule.duration.minutes': '{count}m',
|
|
559
|
+
'detail.schedule.duration.seconds': '{count}s',
|
|
374
560
|
'card.scheduled': 'scheduled',
|
|
375
561
|
'new.workspace': 'Workspace',
|
|
376
|
-
'new.
|
|
562
|
+
'new.agentPreset': 'Agent preset',
|
|
377
563
|
'new.permission': 'Permission',
|
|
378
564
|
'new.model': 'Model',
|
|
379
565
|
'exec.workspace.recent': 'Most recent (default)',
|
|
380
|
-
'exec.mode.
|
|
566
|
+
'exec.mode.inherit': 'Inherit (deployment default)',
|
|
567
|
+
'exec.mode.inheritWith': 'Inherit (deployment default: {preset})',
|
|
568
|
+
'exec.mode.builtinGroup': 'Built-in presets',
|
|
569
|
+
'exec.mode.customGroup': 'Custom presets',
|
|
570
|
+
'preset.builtin.standard': 'Standard',
|
|
571
|
+
'preset.builtin.ptc': 'PTC (programmatic tool calling)',
|
|
572
|
+
'preset.builtin.minimal': 'Minimal',
|
|
573
|
+
'preset.builtin.cordis': 'Cordis',
|
|
381
574
|
'exec.mode.defaultSuffix': ' (default)',
|
|
382
575
|
'exec.mode.brokenSuffix': ' (unavailable)',
|
|
383
576
|
'exec.mode.removed': ' (removed)',
|
|
@@ -393,12 +586,17 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
393
586
|
'exec.teamRunHint': 'On: running this task starts one Lead session and spawns a teammate per subtask inside it, working in parallel (a subtask permission pin does not apply). Off: every member gets its own independent session.',
|
|
394
587
|
'exec.teamRunUnavailable': 'This deployment serves no Agent Teams service, so team runs cannot be enabled.',
|
|
395
588
|
'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.',
|
|
589
|
+
'exec.goalRun': "Start the run with dsh's built-in /goal",
|
|
590
|
+
'exec.goalRunHint': 'On by default: 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. Off: one plain turn.',
|
|
591
|
+
'exec.skipVerification': 'Skip acceptance for this task',
|
|
592
|
+
'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.',
|
|
396
593
|
'detail.executionSettings': 'Execution Settings',
|
|
397
|
-
'exec.hint': 'Applied when the task runs: the workspace decides where the execution session lands; the
|
|
594
|
+
'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.',
|
|
398
595
|
// Plugin settings card (the `settings.plugin.item` seat).
|
|
399
596
|
'settings.title': 'Task Board',
|
|
400
|
-
'settings.description': '
|
|
597
|
+
'settings.description': 'Task orchestration, agent announcement and goal acceptance.',
|
|
401
598
|
'settings.enabled': 'Enable the task board',
|
|
599
|
+
'settings.enabledCardHint': 'Master switch, announcement, sleep protection and subtask depth.',
|
|
402
600
|
'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.',
|
|
403
601
|
'settings.announceToAgent': 'Announce the task board to agents',
|
|
404
602
|
'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.',
|
|
@@ -426,6 +624,65 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
426
624
|
'settings.maxSubtaskDepth': 'Subtask depth limit',
|
|
427
625
|
'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.',
|
|
428
626
|
'settings.maxSubtaskDepthOption': '{depth} levels',
|
|
627
|
+
'settings.goalVerificationTitle': 'Task acceptance',
|
|
628
|
+
'settings.goalVerification': 'Enable task acceptance',
|
|
629
|
+
'settings.goalVerificationCardHint': 'The switch, the judge model and the criteria threshold.',
|
|
630
|
+
'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.',
|
|
631
|
+
'settings.goalVerificationModel': 'Judge model',
|
|
632
|
+
'settings.goalVerificationModelHint': 'Blank inherits the host: the default route of the host model catalog, never the card pinned execution model.',
|
|
633
|
+
'settings.goalVerificationModelInherit': 'Inherit host ({model})',
|
|
634
|
+
'settings.goalVerificationModelInheritUnknown': 'Inherit host (no model catalog)',
|
|
635
|
+
'settings.goalVerificationEffort': 'Reasoning effort',
|
|
636
|
+
'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.',
|
|
637
|
+
'settings.goalVerificationEffortInherit': 'Inherit host ({effort})',
|
|
638
|
+
'settings.goalVerificationEffortInheritUnknown': 'Inherit host (model default level)',
|
|
639
|
+
'settings.goalVerificationResolved': 'Resolved acceptance configuration',
|
|
640
|
+
'settings.goalVerificationResolvedModel': 'Judge model: {model}',
|
|
641
|
+
'settings.goalVerificationResolvedEffort': 'Reasoning effort: {effort}',
|
|
642
|
+
'settings.goalVerificationResolvedNoEffort': 'Reasoning effort: not sent explicitly (the model default)',
|
|
643
|
+
'settings.goalVerificationResolvedSource': 'Source: {source}',
|
|
644
|
+
'settings.goalVerificationSourceInherit': 'inherited from the host',
|
|
645
|
+
'settings.goalVerificationSourceExplicit': 'explicit configuration',
|
|
646
|
+
'settings.goalVerificationResolvedPreset': 'Rubric: coding (Specification Adherence / Output Match / Error Signal Detection), threshold {threshold}',
|
|
647
|
+
'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.',
|
|
648
|
+
'settings.goalVerificationEffortFallback': 'The selected reasoning effort {requested} is not supported by the target model; it falls back to {resolved}.',
|
|
649
|
+
'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).',
|
|
650
|
+
'settings.goalVerificationModelInvalid': 'The configured judge model is not a provider/model route; the host default is used instead.',
|
|
651
|
+
'running.executing': 'Executing',
|
|
652
|
+
'running.verifying': 'Verifying',
|
|
653
|
+
'running.repairing': 'Fixing a failed acceptance',
|
|
654
|
+
'running.verificationPassed': 'Acceptance passed',
|
|
655
|
+
'running.verificationFailed': 'Acceptance failed',
|
|
656
|
+
'verify.title': 'Acceptance report',
|
|
657
|
+
'verify.status.passed': 'Passed',
|
|
658
|
+
'verify.status.failed': 'Failed',
|
|
659
|
+
'verify.status.exception': 'Anomaly',
|
|
660
|
+
'verify.status.verifying': 'Verifying',
|
|
661
|
+
'verify.status.pending': 'Not yet verified',
|
|
662
|
+
'verify.status.off': 'Acceptance was off for this execution',
|
|
663
|
+
'verify.summary': 'Total {score} (threshold {threshold}) · empty-work baseline {baseline}',
|
|
664
|
+
'verify.criteria': 'Per-criterion scores',
|
|
665
|
+
'verify.criterion': '{name}: {score} (threshold {threshold})',
|
|
666
|
+
'verify.rounds': '{rounds} rounds per criterion, A/B slots swapped, averaged',
|
|
667
|
+
'verify.judge': 'Judge {model} (reasoning effort {effort})',
|
|
668
|
+
'verify.judgeNoEffort': 'Judge {model} (reasoning effort: not sent explicitly)',
|
|
669
|
+
'verify.judgeInherited': 'Judge {model} (inherited from the host)',
|
|
670
|
+
'verify.attempt': 'Acceptance {index}',
|
|
671
|
+
'verify.attemptException': 'Acceptance anomaly {index}',
|
|
672
|
+
'verify.counts': 'Quality verdicts {quality}/{max} · anomalies {exceptions}/{max}',
|
|
673
|
+
'verify.findings': 'Findings',
|
|
674
|
+
'verify.noFindings': 'The judge reported no locatable finding',
|
|
675
|
+
'verify.evidence': 'Evidence: {chars} characters · {entries} trace entries · {omitted} characters truncated',
|
|
676
|
+
'verify.workspaceEvidence': '{files} changed file(s) observed by the host',
|
|
677
|
+
'verify.usage': 'Usage: {calls} requests · {input} input · {output} output · {reasoning} reasoning tokens',
|
|
678
|
+
'verify.usageIncomplete': ' (at least one request usage is unknown; these counts are a floor)',
|
|
679
|
+
'verify.finalFailure': 'Verdict basis: {reason}',
|
|
680
|
+
'verify.applicability.disabled': 'Acceptance was off when this execution started; it settles on the historical verdict.',
|
|
681
|
+
'verify.applicability.goalUnavailable': 'This execution never became a goal run (/goal was refused or unavailable), so acceptance was not enforced.',
|
|
682
|
+
'verify.applicability.skipped': 'This card checked Skip acceptance, so the execution was never judged.',
|
|
683
|
+
'verify.applicability.teamMember': 'Team member: the Lead team-summary evidence is accepted as one execution.',
|
|
684
|
+
'verify.effortFallback': 'Reasoning effort fallback: {requested} → {resolved}',
|
|
685
|
+
'verify.thresholdValue': '{value}%',
|
|
429
686
|
// Subtasks (parent/child links, cascade runs, link/detach).
|
|
430
687
|
'detail.parent': 'Parent task',
|
|
431
688
|
'detail.parent.open': 'Open parent task',
|
|
@@ -450,11 +707,32 @@ export const en: Record<keyof typeof zh, string> = {
|
|
|
450
707
|
'card.subtasksFailed': '{count} failed',
|
|
451
708
|
'card.subtasksRunning': '{count} running',
|
|
452
709
|
'card.subtasksBreakdown': 'Subtasks {total}: {done} done, {running} running, {failed} failed',
|
|
710
|
+
'card.result.succeeded': 'last succeeded',
|
|
711
|
+
'card.result.failed': 'last failed',
|
|
712
|
+
'card.result.cancelled': 'last cancelled',
|
|
713
|
+
'card.declared': 'set by hand',
|
|
714
|
+
'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.',
|
|
715
|
+
'card.openSession': 'Open the latest execution session',
|
|
716
|
+
'card.tagsLabel': 'labels {tags}',
|
|
717
|
+
'card.time.created': 'Created {time}',
|
|
718
|
+
'card.time.started': 'Running {time}',
|
|
719
|
+
'card.time.settled': 'Settled {time}',
|
|
720
|
+
'card.time.archived': 'Archived {time}',
|
|
721
|
+
'card.time.updated': 'Updated {time}',
|
|
722
|
+
'board.density.compact': 'Switch to compact cards',
|
|
723
|
+
'board.density.comfortable': 'Switch to full cards',
|
|
724
|
+
'board.group.today': 'Today',
|
|
725
|
+
'board.group.week': 'Last 7 days',
|
|
726
|
+
'board.group.earlier': 'Earlier',
|
|
727
|
+
'board.group.expand': 'Show {count}',
|
|
728
|
+
'board.group.collapse': 'Collapse',
|
|
453
729
|
'board.hideSubtasks': 'Hide subtasks',
|
|
454
730
|
'board.showSubtasks': 'Show subtasks',
|
|
455
731
|
'board.subtaskFilterHint': 'The board shows parent tasks only; a text or label filter reveals the subtasks automatically.',
|
|
456
732
|
}
|
|
457
733
|
|
|
734
|
+
/** The dictionary key union. */
|
|
735
|
+
|
|
458
736
|
/** The dictionary key union. */
|
|
459
737
|
export type TaskBoardKey = keyof typeof zh
|
|
460
738
|
|
|
@@ -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
|
|