@dsh-workbench/core 0.3.10 → 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +148 -105
- package/bin/dsh-workbench +132 -31
- package/bin/dsh-workbench.cmd +5 -0
- package/bin/opencli-isolated +3 -2
- package/bin/opencli-isolated.mjs +44 -0
- package/bin/opencli-node-mode.cjs +1 -0
- package/bin/seed-workshop-windows.mjs +307 -0
- package/client.js +8192 -4904
- package/cordis.patch.yml +62 -37
- package/dist/client/client.body.js +8192 -4904
- package/dist/client/index.js +7186 -3898
- package/dist/host/index.js +7277 -6956
- package/dist/types/app/client.d.ts +3 -1
- package/dist/types/app/host.d.ts +2 -1
- package/dist/types/app/layouts/approval-detail.d.ts +3 -0
- package/dist/types/app/layouts/env-gate/boot-gate.d.ts +1 -12
- package/dist/types/app/layouts/env-gate/gate-text.d.ts +2 -1
- package/dist/types/app/layouts/market/DiscoverPanel.d.ts +8 -0
- package/dist/types/app/layouts/market/add-module-text.d.ts +1 -1
- package/dist/types/app/layouts/market/discover-categories.d.ts +8 -0
- package/dist/types/app/layouts/market/discover-confirm.d.ts +14 -0
- package/dist/types/app/layouts/market/discover-detail.d.ts +12 -0
- package/dist/types/app/layouts/market/discover-dialogs.d.ts +7 -0
- package/dist/types/app/layouts/market/discover-doc.d.ts +18 -0
- package/dist/types/app/layouts/market/discover-init-dialog.d.ts +10 -0
- package/dist/types/app/layouts/market/discover-rows.d.ts +24 -0
- package/dist/types/app/layouts/market/discover-sources-dialog.d.ts +16 -0
- package/dist/types/app/layouts/market/discover-states.d.ts +22 -0
- package/dist/types/app/layouts/market/discover-toolbar.d.ts +23 -0
- package/dist/types/app/layouts/market/discover-versions.d.ts +9 -0
- package/dist/types/app/layouts/market/discover-view.d.ts +38 -0
- package/dist/types/app/layouts/market/market-header.d.ts +13 -0
- package/dist/types/app/layouts/market/panel.d.ts +1 -1
- package/dist/types/app/layouts/market/use-add-module.d.ts +1 -1
- package/dist/types/app/layouts/market/use-discover.d.ts +72 -0
- package/dist/types/app/layouts/market/use-module-versions.d.ts +6 -2
- package/dist/types/app/layouts/rightbar/MarketView.d.ts +6 -3
- package/dist/types/app/layouts/rightbar/Rightbar.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/board-shape.d.ts +1 -14
- package/dist/types/app/layouts/rightbar/market-act.d.ts +6 -3
- package/dist/types/app/layouts/rightbar/market-busy.d.ts +0 -22
- package/dist/types/app/layouts/rightbar/market-change.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-hint.d.ts +1 -7
- package/dist/types/app/layouts/rightbar/market-plugin-rows.d.ts +0 -7
- package/dist/types/app/layouts/rightbar/market-row-icon.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-row-types.d.ts +2 -2
- package/dist/types/app/layouts/rightbar/market-rows.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-settle-hold.d.ts +2 -0
- package/dist/types/app/layouts/rightbar/market-settle.d.ts +17 -0
- package/dist/types/app/layouts/rightbar/market-shared-rows.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-update-verdict.d.ts +31 -0
- package/dist/types/app/layouts/rightbar/market-view-text.d.ts +8 -1
- package/dist/types/app/layouts/rightbar/market-workbench-row.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/store.d.ts +2 -0
- package/dist/types/app/layouts/sidebar/LongTaskDot.d.ts +6 -0
- package/dist/types/app/layouts/sidebar/LongTaskHover.d.ts +6 -0
- package/dist/types/app/layouts/sidebar/edition-boot.d.ts +6 -0
- package/dist/types/app/layouts/sidebar/edition.d.ts +5 -0
- package/dist/types/app/layouts/sidebar/use-attention.d.ts +0 -4
- package/dist/types/app/layouts/sidebar/workshop-preset.d.ts +2 -0
- package/dist/types/app/layouts/workbench-settings/AdapterSetItem.d.ts +5 -0
- package/dist/types/app/layouts/workbench-settings/ConfigSyncItem.d.ts +5 -0
- package/dist/types/app/layouts/workbench-settings/ConfigSyncRows.d.ts +11 -0
- package/dist/types/app/layouts/workbench-settings/NewWorkbenchItem.d.ts +5 -0
- package/dist/types/app/layouts/workbench-settings/SettingsItem.d.ts +8 -0
- package/dist/types/app/layouts/workbench-settings/SidebarEditionItem.d.ts +5 -0
- package/dist/types/app/layouts/workbench-settings/WorkbenchSettingsSection.d.ts +5 -0
- package/dist/types/app/units/manifests.d.ts +1 -1
- package/dist/types/{app/units → kernel/client}/registry.d.ts +1 -1
- package/dist/types/kernel/contract/bundle-install.d.ts +2 -0
- package/dist/types/kernel/contract/config-sync.d.ts +2 -0
- package/dist/types/kernel/contract/diy.d.ts +1 -0
- package/dist/types/kernel/contract/dsh-plugins.d.ts +2 -0
- package/dist/types/kernel/contract/index.d.ts +4 -0
- package/dist/types/kernel/contract/long-tasks.d.ts +2 -0
- package/dist/types/kernel/contract/market-index.d.ts +2 -0
- package/dist/types/kernel/contract/platform.d.ts +1 -0
- package/dist/types/kernel/contract/preflight-wake.d.ts +2 -0
- package/dist/types/kernel/contract/profile-create.d.ts +2 -0
- package/dist/types/kernel/contract/sidebar-edition.d.ts +2 -0
- package/dist/types/kernel/contract/unit-manifests.d.ts +2 -0
- package/dist/types/{shared/api → kernel}/host/mount-units.d.ts +2 -1
- package/dist/types/modules/panels/client.d.ts +1 -1
- package/dist/types/modules/panels/model/approval.d.ts +4 -8
- package/dist/types/modules/panels/model/diy-browser-tools.d.ts +1 -1
- package/dist/types/modules/panels/model/diy-changelog.d.ts +2 -0
- package/dist/types/modules/panels/model/diy-context.d.ts +20 -18
- package/dist/types/modules/panels/model/diy-page.d.ts +4 -2
- package/dist/types/modules/panels/model/diy-record-open.d.ts +0 -15
- package/dist/types/modules/panels/model/diy-record-text.d.ts +0 -2
- package/dist/types/modules/panels/model/diy-record.d.ts +1 -31
- package/dist/types/modules/panels/model/diy-report.d.ts +6 -7
- package/dist/types/modules/panels/model/diy-tools.d.ts +1 -0
- package/dist/types/modules/panels/model/long-task-tools.d.ts +0 -11
- package/dist/types/modules/panels/model/market-dependency-update.d.ts +15 -0
- package/dist/types/modules/panels/model/market-dependency.d.ts +15 -10
- package/dist/types/modules/panels/model/market-discover-routes.d.ts +3 -0
- package/dist/types/modules/panels/model/market-discover.d.ts +33 -0
- package/dist/types/modules/panels/model/market-dispatch.d.ts +4 -3
- package/dist/types/modules/panels/model/market-env.d.ts +2 -3
- package/dist/types/modules/panels/model/market-registry.d.ts +3 -3
- package/dist/types/modules/panels/model/market-restart.d.ts +1 -1
- package/dist/types/modules/panels/model/market-route.d.ts +5 -3
- package/dist/types/modules/panels/model/market-sources-act.d.ts +9 -0
- package/dist/types/modules/panels/model/market-types.d.ts +7 -13
- package/dist/types/modules/panels/model/market-update-bundle.d.ts +19 -0
- package/dist/types/modules/panels/model/market-verify.d.ts +15 -0
- package/dist/types/modules/panels/model/market-workbench-update.d.ts +3 -2
- package/dist/types/modules/panels/model/market.d.ts +6 -5
- package/dist/types/modules/panels/model/plugin-actions.d.ts +2 -1
- package/dist/types/modules/panels/model/plugin-section.d.ts +3 -1
- package/dist/types/modules/panels/model/publish-preview-routes.d.ts +2 -0
- package/dist/types/modules/panels/unit.d.ts +8 -5
- package/dist/types/modules/sessions/model/attention.d.ts +0 -11
- package/dist/types/modules/sessions/model/session-node.d.ts +0 -10
- package/dist/types/shared/api/diy.d.ts +6 -4
- package/dist/types/shared/api/host/approval-call.d.ts +0 -9
- package/dist/types/shared/api/host/approval-gate.d.ts +26 -0
- package/dist/types/shared/api/host/bundle-routes.d.ts +2 -1
- package/dist/types/shared/api/host/diy-artifacts.d.ts +3 -0
- package/dist/types/shared/api/host/diy-changelog.d.ts +13 -0
- package/dist/types/shared/api/host/diy-components.d.ts +2 -3
- package/dist/types/shared/api/host/diy-modules.d.ts +25 -0
- package/dist/types/shared/api/host/diy-publish-preview.d.ts +4 -0
- package/dist/types/shared/api/host/diy-recon-fs.d.ts +2 -2
- package/dist/types/shared/api/host/diy-tokens.d.ts +8 -0
- package/dist/types/shared/api/host/host-routes.d.ts +10 -0
- package/dist/types/shared/api/host/long-task-notice.d.ts +0 -20
- package/dist/types/shared/api/host/long-tasks.d.ts +1 -8
- package/dist/types/shared/api/host/market-doc.d.ts +21 -0
- package/dist/types/shared/api/host/market-index-fetch.d.ts +37 -0
- package/dist/types/shared/api/host/market-source-init.d.ts +22 -0
- package/dist/types/shared/api/host/market-sources-store.d.ts +15 -0
- package/dist/types/shared/api/host/permission-mode.d.ts +4 -0
- package/dist/types/shared/api/host/post-channels.d.ts +1 -1
- package/dist/types/shared/api/host/sidebar-edition.d.ts +14 -0
- package/dist/types/shared/api/host/unit-roster-facts.d.ts +1 -1
- package/dist/types/shared/api/host/workspace-root.d.ts +6 -0
- package/dist/types/shared/api/platform/client.d.ts +10 -0
- package/dist/types/shared/api/unit-board.d.ts +4 -0
- package/dist/types/shared/api/write-outcome.d.ts +3 -0
- package/dist/types/shared/components/IconModules.d.ts +2 -0
- package/dist/types/shared/components/PanelFoot.d.ts +0 -9
- package/dist/types/shared/components/blocker-action.d.ts +3 -0
- package/dist/types/shared/dev-surface/index.d.ts +5 -0
- package/dist/types/shared/dev-surface/types.d.ts +79 -0
- package/dist/types/shared/hooks/bundle-queries.d.ts +1 -13
- package/dist/types/shared/hooks/fact-transport.d.ts +4 -0
- package/dist/types/shared/hooks/fact-transports.d.ts +0 -4
- package/dist/types/shared/hooks/market-queries.d.ts +11 -0
- package/dist/types/shared/hooks/panel-state-report.d.ts +0 -12
- package/dist/types/shared/hooks/sidebar-edition.d.ts +2 -0
- package/dist/types/shared/hooks/use-blocker-actions.d.ts +0 -8
- package/dist/types/shared/hooks/use-capabilities.d.ts +1 -55
- package/dist/types/shared/hooks/use-capability-gate.d.ts +1 -2
- package/dist/types/shared/hooks/use-diy-debug.d.ts +0 -13
- package/dist/types/shared/hooks/use-diy-record.d.ts +0 -13
- package/dist/types/shared/hooks/use-host-write.d.ts +1 -1
- package/dist/types/shared/hooks/use-shell-long-tasks.d.ts +1 -7
- package/dist/types/shared/hooks/use-unit-board.d.ts +1 -1
- package/icon.svg +17 -28
- package/package.json +33 -13
- package/preset/diy.patch.yml +3 -3
- package/profile/isolation.patch.yml +18 -7
- package/profile/sandbox.patch.yml +2 -2
- package/scripts/clone-profile.mjs +268 -0
- package/scripts/create-workbench.mjs +166 -0
- package/scripts/seed-profile.sh +22 -10
- package/scripts/seed-workshop.sh +17 -19
- package/skills/workbench-module-diy/BUILD.md +57 -133
- package/skills/workbench-module-diy/COPY.md +89 -0
- package/skills/workbench-module-diy/DATASOURCE.md +173 -116
- package/skills/workbench-module-diy/DESIGN.md +76 -109
- package/skills/workbench-module-diy/FAMILY.md +48 -52
- package/skills/workbench-module-diy/KIT.md +78 -133
- package/skills/workbench-module-diy/LINKAGE.md +66 -105
- package/skills/workbench-module-diy/PANEL.md +81 -171
- package/skills/workbench-module-diy/REVIEW.md +67 -81
- package/skills/workbench-module-diy/SKILL.md +66 -96
- package/skills/workbench-module-diy/STEPS.md +66 -69
- package/skills/workbench-module-diy/TOOLS.md +134 -103
- package/skills/workbench-module-diy/WIRING.md +64 -84
- package/skills/workbench-module-diy/WRITES.md +115 -142
- package/dist/types/app/layouts/config-sync/ConfigSyncSection.d.ts +0 -5
- package/dist/types/shared/api/bundle-install.d.ts +0 -123
- package/dist/types/shared/api/config-sync.d.ts +0 -35
- package/dist/types/shared/api/dsh-plugins.d.ts +0 -11
- package/dist/types/shared/api/host/bundle-manager.d.ts +0 -11
- package/dist/types/shared/api/host/config-sync.d.ts +0 -46
- package/dist/types/shared/api/host/diy-preset-health.d.ts +0 -35
- package/dist/types/shared/api/host/diy-workshop.d.ts +0 -23
- package/dist/types/shared/api/host/dsh-plugins.d.ts +0 -5
- package/dist/types/shared/api/host/installed-module.d.ts +0 -54
- package/dist/types/shared/api/host/installed-module.test.d.ts +0 -1
- package/dist/types/shared/api/host/opencli-command.d.ts +0 -10
- package/dist/types/shared/api/host/opencli-command.test.d.ts +0 -1
- package/dist/types/shared/api/host/opencli.test.d.ts +0 -1
- package/dist/types/shared/api/host/package-content.d.ts +0 -6
- package/dist/types/shared/api/host/package-content.test.d.ts +0 -1
- package/dist/types/shared/api/host/package-kind.d.ts +0 -21
- package/dist/types/shared/api/host/package-kind.test.d.ts +0 -1
- package/dist/types/shared/api/host/package-route.d.ts +0 -23
- package/dist/types/shared/api/host/package-route.test.d.ts +0 -1
- package/dist/types/shared/api/host/plugin-catalog.d.ts +0 -65
- package/dist/types/shared/api/host/plugin-login-hint.d.ts +0 -2
- package/dist/types/shared/api/host/plugin-tools.d.ts +0 -14
- package/dist/types/shared/api/host/plugin-units.d.ts +0 -48
- package/dist/types/shared/api/host/preflight-route.d.ts +0 -15
- package/dist/types/shared/api/host/preflight.d.ts +0 -75
- package/dist/types/shared/api/host/probe-cache.d.ts +0 -6
- package/dist/types/shared/api/host/probe-libs.d.ts +0 -11
- package/dist/types/shared/api/host/probe-units.d.ts +0 -17
- package/dist/types/shared/api/host/probe-verdict.d.ts +0 -7
- package/dist/types/shared/api/host/profile-registries.d.ts +0 -21
- package/dist/types/shared/api/host/registry-declaration.d.ts +0 -23
- package/dist/types/shared/api/host/release.d.ts +0 -24
- package/dist/types/shared/api/host/runtime-seed.d.ts +0 -38
- package/dist/types/shared/api/host/self-update.d.ts +0 -45
- package/dist/types/shared/api/host/version-range.d.ts +0 -2
- package/dist/types/shared/api/host/workshop-root.d.ts +0 -16
- package/dist/types/shared/api/long-tasks.d.ts +0 -19
- package/dist/types/shared/api/unit-manifests.d.ts +0 -6
- package/docs/HANDOFF.md +0 -333
- package/docs/OPERATIONS.md +0 -229
- package/skills/workbench-module-diy/TOOLING.md +0 -55
- /package/dist/types/{app/layouts/rightbar/registry.d.ts → kernel/client/board-registry.d.ts} +0 -0
- /package/dist/types/{app/layouts/rightbar/registry.test.d.ts → kernel/contract/contracts.test.d.ts} +0 -0
- /package/dist/types/{shared/api/host/bundle-manager.test.d.ts → kernel/contract/index.test.d.ts} +0 -0
- /package/dist/types/{shared/api → kernel}/host/unit-readiness.d.ts +0 -0
- /package/dist/types/{shared/api → kernel}/host/unit-registry.d.ts +0 -0
- /package/dist/types/shared/{api/host/diy-workshop.test.d.ts → components/blocker-action.test.d.ts} +0 -0
- /package/dist/types/shared/{api/host/dsh-plugins.test.d.ts → dev-surface/install.d.ts} +0 -0
|
@@ -1,131 +1,162 @@
|
|
|
1
|
-
# agent
|
|
1
|
+
# agent 能力:划分、入参返回、审批
|
|
2
2
|
|
|
3
|
-
步骤 2
|
|
3
|
+
步骤 2 的参考。
|
|
4
4
|
|
|
5
|
-
## 1
|
|
5
|
+
## 1 能力划分
|
|
6
6
|
|
|
7
|
-
| 情况 |
|
|
7
|
+
| 情况 | 处理 |
|
|
8
8
|
|---|---|
|
|
9
|
-
|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
9
|
+
| 同一件事、同一份数据,只是要不要展开明细 | 一件事 + 一个"展开"选项 |
|
|
10
|
+
| 动作或后果不同(看 vs 改) | 拆开 |
|
|
11
|
+
| 用户反复做、每次都要点头 | 封成一个动作(一个按钮 + 一件事),不拆成多个小工具 |
|
|
12
12
|
|
|
13
|
-
每件事都要能回答:"
|
|
13
|
+
每件事都要能回答:"用户会怎么对 agent 说这件事?"
|
|
14
14
|
|
|
15
|
-
## 2
|
|
15
|
+
## 2 入参
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
描述、返回、报错的语言口径见 [COPY.md](COPY.md) §4–§5。
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
- **上限**:要多少给多少,**不悄悄截**;超了说清上限;截断要说清截了什么、完整那份在哪。
|
|
21
|
-
- **该先问谁**:要先拿到别的东西,就在描述里指给 agent 看("先调 X")。
|
|
22
|
-
- **会改变行为的话要留着**:默认只预览、要点头、别连刷、同一个做了一半的接着问。
|
|
19
|
+
能力 = 真实调用(参数 JSON)+ 真实返回正文(照抄)+ schema。能连平台就真跑一遍。
|
|
23
20
|
|
|
24
|
-
|
|
21
|
+
- 字段名用人和 agent 都懂的话,不用平台内部名。
|
|
22
|
+
- 默认值、取值范围、给错时的修法都写明。
|
|
23
|
+
- 上限写清;要多少给多少,不悄悄截;截断写清截了什么、完整版在哪。
|
|
24
|
+
- 有前置依赖就在描述里指路("先调 X")。
|
|
25
|
+
- 保留会改变行为的话:默认只预览、需点头、不可连刷、半途可续。
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
- 口径复述、"这是最后一批"这类全删;**总数读不到就说读不到**,不拿这一页冒充实测总数;每页都能往下走(能接着问的标识 + 还有多少 + 下一批怎么要)。
|
|
28
|
-
- 长编号原样保留(别让它被当成数字)。
|
|
27
|
+
## 3 返回
|
|
29
28
|
|
|
30
|
-
|
|
29
|
+
- 只放 agent 推不出的事实:口径 + 数字 / 每行 + 平台链接 + "要明细该调哪个能力"。
|
|
30
|
+
- 删掉口径复述、"这是最后一批";总数读不到就说读不到,不用当前页冒充。
|
|
31
|
+
- 每页可续:续取标识 + 剩余量 + 下一批怎么取。
|
|
32
|
+
- 长编号按字符串保留。
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
## 4 全场景(每格必填,写真实返回或真实报错原文)
|
|
33
35
|
|
|
34
|
-
| 情况 |
|
|
36
|
+
| 情况 | 内容 |
|
|
35
37
|
|---|---|
|
|
36
38
|
| 正常 | 口径 + 数字 / 行 + 链接 |
|
|
37
39
|
| 没有 | 说"没有"并给依据(不是报错)+ 下一步 |
|
|
38
|
-
| 分不清是哪一份 |
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
40
|
+
| 分不清是哪一份 | 列出候选让用户选;不猜、不退回默认 |
|
|
41
|
+
| 参数错 / 超上限 | 指名字段与合法值 / 拒绝并给上限 |
|
|
42
|
+
| 能力未装好 | 缺哪件 + 去哪更新 |
|
|
43
|
+
| 要登录 / 超时 | 分开报 + 重试或去登录 |
|
|
44
|
+
| 下一批 / 截断 | 本页内容 + 续取方式 / 截了什么、多少、完整版在哪 |
|
|
45
|
+
| 没有当前项目 | 说明按哪个项目取数 |
|
|
44
46
|
|
|
45
|
-
## 5
|
|
47
|
+
## 5 写操作:两拍
|
|
46
48
|
|
|
47
|
-
1.
|
|
48
|
-
2.
|
|
49
|
+
1. 预览:说清对象、值、去向,等确认。用户判断"要不要做"。
|
|
50
|
+
2. 执行:确认后动平台,回报结果。
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
一个动作一条链路:用户按按钮与 agent 调用是同一件事;重复发起要幂等(先查是否已有,进行中则续看)。
|
|
53
|
+
用户自按入口不点头:最小确认条(将要做什么 + 取消 / 执行),按下变"正在做…",失败留在条内说明。
|
|
51
54
|
|
|
52
|
-
## 6
|
|
55
|
+
## 6 审批范围
|
|
53
56
|
|
|
54
|
-
|
|
57
|
+
命中任一就审批:① 改平台;② 改这台机器(装 / 卸 / 更新);③ 改用户面板(加 / 收 / 排序 / 清空)。
|
|
55
58
|
|
|
56
|
-
|
|
59
|
+
审批内容必须是这次的具体后果:对象、值 / 版本、环境、影响数量。不写"这个操作会写数据"。
|
|
60
|
+
说不出后果就不发起审批:停止,把原因交给 agent 去查。
|
|
57
61
|
|
|
58
|
-
### 6.1
|
|
62
|
+
### 6.1 声明写法(缺一个 `contracts` 判据红)
|
|
59
63
|
|
|
60
|
-
|
|
64
|
+
清单 `tools[]` 一条(`writes: true` + `key`),加 `needsApproval(call)` 与 `approvalDetail(call)`。
|
|
61
65
|
|
|
62
|
-
- `key
|
|
63
|
-
|
|
64
|
-
- `
|
|
65
|
-
|
|
66
|
+
- `key` 用 lowerCamelCase;跑 `dsh-wb-module sync` 生成 `src/declared-tools.ts`,代码写
|
|
67
|
+
`DECLARED_TOOLS.rebuild.name`。工具名字面量只留清单一处;键错编译错,生成物过期 / 半写 / 又写字面量都红。
|
|
68
|
+
- `needsApproval` 返回:
|
|
69
|
+
`{ kind: 'read' }` 不问;`{ kind: 'ask', question, fallback }` 要问;
|
|
70
|
+
`{ kind: 'deny', reason }` 拒绝(reason 交给 agent;只放策略同步可判的事实)。`writes: true` 未认领 = deny。
|
|
71
|
+
`question` / `fallback` 需 zh / en。
|
|
72
|
+
- `approvalDetail` 拿不到材料时返回 `{ blocked: '…' }` = 不弹。标题与详情形状见 [DESIGN.md](DESIGN.md) §3 末节:
|
|
73
|
+
标题一句;`approvalDetail` → 仅无详情表的族,≤20 字一行;长内容走客户端 `approval.render` 的 `ApprovalPlan`。
|
|
74
|
+
宿主数据到不了浏览器,事实从工具参数重建。
|
|
66
75
|
|
|
67
|
-
## 7
|
|
76
|
+
## 7 审批全场景
|
|
68
77
|
|
|
69
|
-
| 情况 |
|
|
78
|
+
| 情况 | 用户看到 | agent 得到 |
|
|
70
79
|
|---|---|---|
|
|
71
|
-
| 预览 |
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
## 8
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
80
|
+
| 预览 | 不弹 | 预览内容 |
|
|
81
|
+
| 执行且材料齐 | 这次会发生什么 + 允许吗 | 等待回答 |
|
|
82
|
+
| 材料不齐 / 项目不符 / 能力关闭 | 不弹 | 停止原因 / 项目说明 |
|
|
83
|
+
| 拒绝 / 点头后中途变化 | 关闭 / 当时那份材料 | 拒绝或失败原因,可照做 |
|
|
84
|
+
| 本轮中断 / 后台 | 消失 / 不弹 | 本轮结束 / 自动禁止 |
|
|
85
|
+
| 连发多件 | 逐条询问 | 逐条等待 |
|
|
86
|
+
|
|
87
|
+
按钮与弹窗由外壳提供;模块只决定明细画什么:一行一个事实。
|
|
88
|
+
|
|
89
|
+
## 8 外部供给
|
|
90
|
+
|
|
91
|
+
`needs` 声明能力依赖,外壳按 `kind` 去探、去装,状态见 `workbench_modules_list`。
|
|
92
|
+
|
|
93
|
+
四种 `kind`:`bin`(机器上的命令)/ `extension`(运行时插件)/ `lib`(共用 npm 依赖)/ `env`(环境变量)。
|
|
94
|
+
每条必写 `purpose`(给用户看的那半句);`required: false` 只降级、不挡卡片。
|
|
95
|
+
|
|
96
|
+
```jsonc
|
|
97
|
+
"needs": [
|
|
98
|
+
{
|
|
99
|
+
"kind": "extension",
|
|
100
|
+
"runtime": "opencli",
|
|
101
|
+
"name": "acme-workflow",
|
|
102
|
+
"commands": ["acme-read", "acme-write"],
|
|
103
|
+
"purpose": "读写工单",
|
|
104
|
+
"sources": [
|
|
105
|
+
{ "kind": "npm", "package": "opencli-plugin-acme", "registryEnv": "ACME_REGISTRY" },
|
|
106
|
+
{ "kind": "git", "url": "git@internal:plugin-acme.git" },
|
|
107
|
+
{ "kind": "local", "env": "ACME_PLUGIN_PATH" }
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
{ "kind": "lib", "name": "opencli-workflow", "purpose": "发布编排" },
|
|
111
|
+
{ "kind": "bin", "name": "acme", "purpose": "平台命令" },
|
|
112
|
+
{ "kind": "env", "name": "ACME_TOKEN", "purpose": "访问令牌", "secret": true }
|
|
113
|
+
]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- `sources` 按顺序试(本地 → 私有 → 公共)。没写 `sources` 就是「我自己装,你只帮我判」——外壳只探不代装。
|
|
117
|
+
- `extension` 的 `sources[].kind` 只有 `npm` / `git` / `local`;`lib` 只认 `npm`。
|
|
118
|
+
未知 `kind` 或 `source.kind` 判红;need 里未知字段只警告,`x-` 前缀忽略。
|
|
119
|
+
- 未装好文案由模块写:`libInstallCommand({ need, source })`(`@dsh-workbench/shared/host`)拼好源与缓存目录,
|
|
120
|
+
原样输出;放进失败态。
|
|
121
|
+
- `contracts` 判据:`apiVersion` 必须是 2;`needs` 走同一份 `NEED_KINDS` 注册表校验(`purpose` 必填、
|
|
122
|
+
`bin`/`env` 不许带 `sources`、`lib` 只认 npm 源);声明了 `lib` 必须用 `libInstallCommand`。
|
|
123
|
+
未知 `runtime` 不判红:探针会给「这个运行时工作台还不认识」的 `unchecked`,等运行时 provider 补上。
|
|
124
|
+
|
|
125
|
+
## 9 长任务
|
|
126
|
+
|
|
127
|
+
耗时几十秒以上的操作做成长任务。宿主侧用 `mount` deps 的 `longTasks`,并挂回返回值:
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
longTasks.create({ key, run, step, outcome, view, stopped })
|
|
131
|
+
// run({ payload, onStep, signal }):onStep({ kind: 'start', text }) 报步骤;return 结果
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
- 来源:在工具里 `runs.start({ …, session: sessionIdOf(exec) ?? undefined })`(`sessionIdOf` 来自
|
|
135
|
+
`@dsh-workbench/shared/host`)。不记 = 用户按的 → 停止需审批。
|
|
136
|
+
- 浏览器侧:`useLongTask` → `feed.runs` / `feed.stop(id)` / `feed.stopping` / `feed.stopFailed`;
|
|
137
|
+
画 `LongTaskRow`(五态:`running` / `needs-login` / `stopped` / `ok` / `failed`)。
|
|
138
|
+
- 停止:`run` 收到 `signal` 被 abort = 有人按停止;在循环点与每条子命令前后查 `signal.aborted`。
|
|
139
|
+
不认 signal 就不要画停止钮。画钮传 `stop`(`onStop: () => feed.stop(run.id)`、`busy: feed.stopping === run.id`、
|
|
140
|
+
`failed: feed.stopFailed`、`label: 停止任务 {label}`、`askLabel: '确认停止'`);失败文案画在行下,
|
|
141
|
+
不写"停止失败"。两按确认归组件;未传 `stop` 的行不变。
|
|
142
|
+
- `feed.stopping` / `feed.stopFailed` 只有一格(最后一次)。多行并行时要分行状态就按 id 自记。
|
|
143
|
+
- 外壳自带 `workbench_long_tasks_list`(读)与 `workbench_long_tasks_stop`(写)。自己起的免审批;
|
|
144
|
+
别人的 / 用户按的 / 没记来源的要审批;跨工作区直接拒。被停时外壳向起它的会话发 notice(完成 / 失败不发)。
|
|
145
|
+
- `contracts` 查形状:注册表七个方法(含 `stop` / `live`)、`create` 的 `key` / `run` / `view`、
|
|
146
|
+
产物含 `useLongTask` / `LongTaskRow` 之一。是否真响应 signal 不在射程内。
|
|
147
|
+
- 左栏 loading 点由外壳按 `live()` 驱动,模块不做。
|
|
148
|
+
- 用 `stop` / `session` / 外壳长任务工具需把 `@dsh-workbench/core` peer 下限抬到含它们的版本(`check --only kit` 查)。
|
|
149
|
+
|
|
150
|
+
## 12 按工作区 / 模式收窄工具
|
|
151
|
+
|
|
152
|
+
工具是机器级的;不同项目需要不同工具。不要运行时返回"此项目不可用"—— 从清单移除。
|
|
153
|
+
`gate: { deniedTools(context), subscribe(listener) }` 挂进 `mount` 返回值:
|
|
154
|
+
|
|
155
|
+
- `deniedTools({ workspace, preset })` 返回该会话不存在的工具名(与 `registerTools()` 一致;二者可为 `null`)。
|
|
156
|
+
`subscribe` 在状态变化时通知外壳重算;不接则等重启。
|
|
157
|
+
- 两个轴:`workspace` = 用户在看哪个项目;`preset` = 该会话被授权做什么。外壳两者都用。
|
|
158
|
+
模块工具按工作区是否有这张卡收窄;DIY 族按模式收窄。
|
|
159
|
+
- 外壳双重执行:清单不出现 + 调用时拒。
|
|
160
|
+
|
|
161
|
+
"哪些工作区出现"不由模块声明:用户用 `workbench_panels_show` / `_hide` 控制,卡片与全部工具同判。
|
|
162
|
+
`deniedTools` 可选。
|
|
@@ -1,98 +1,78 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 接外壳:依赖、禁区、安装、热换、发布
|
|
2
2
|
|
|
3
|
-
[BUILD.md](BUILD.md)
|
|
4
|
-
怎么装上、改一行怎么看到它变、怎么发出去。
|
|
3
|
+
[BUILD.md](BUILD.md) 的后半。设计见 [DESIGN.md](DESIGN.md) / [STEPS.md](STEPS.md);门禁见 [REVIEW.md](REVIEW.md)。
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
## 1 依赖
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
| 要什么 | 从哪拿 |
|
|
7
|
+
| 需要 | 来源 |
|
|
11
8
|
|---|---|
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
| kit
|
|
15
|
-
| 类型 | `import type`
|
|
16
|
-
|
|
|
9
|
+
| 宿主侧纯函数 / 常量 | `@dsh-workbench/shared/host`(`dependencies`) |
|
|
10
|
+
| 浏览器侧 hooks / 组件 / 图标 / 文案工具 | `@dsh-workbench/core/client` 的 `kit` |
|
|
11
|
+
| kit 没有的 dsh 控件 / 图标 | `@deepseek-ai/dsh-client-ui-primitives`(`dsh.client.external` + 精确版 devDependency;[KIT.md](KIT.md) §8) |
|
|
12
|
+
| 类型 | `import type` |
|
|
13
|
+
| 外壳 | `@dsh-workbench/core`(peer,安装时比版本) |
|
|
17
14
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
`client.js` 里那一份,不是另抄的清单,所以永远和用户手上那版一致。
|
|
15
|
+
成员清单用命令取,不手抄:`check --only kit`(当前安装的外壳真实产物)、`check --only primitives`
|
|
16
|
+
(dsh 原语导出、与 kit 求交、需写入 `package.json` 的两行)。
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
(`--all` 全表 / `--json` 机器档)列装机那份的导出、与 kit 求交、并给出该写进 `package.json`
|
|
24
|
-
的两行。两边都是"取真产物",没有手抄清单(口径见 ADR-0063 · `.scratch/dsh-primitives-face/spec.md`)。
|
|
18
|
+
⚠️ 共享包入口按运行时分离(`source` 判据):
|
|
25
19
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
宿主侧正相反:`@dsh-workbench/shared` 与 `/host` 都在 external 里,直接 import 才对。
|
|
20
|
+
- 根入口只许 `import type`。浏览器侧取运行值会打包进产物(第二份实例);宿主侧取运行值会使 `dist/host.js`
|
|
21
|
+
无法 import(根 barrel 拉到 dsh 浏览器件)。浏览器运行值走 `kit`。
|
|
22
|
+
- `@dsh-workbench/shared/host` 仅宿主侧。含 `node:*`;浏览器侧纯函数走 `kit`。
|
|
23
|
+
- 契约类型(`Translate` / `ApiError`…)从根入口取,允许。
|
|
31
24
|
|
|
32
|
-
|
|
33
|
-
(各打一份的症状不是报错,而是"agent 改完面板不自己刷新")。它们只能从 `kit` 拿。
|
|
25
|
+
单例只能一份:kit 的 hooks 与容器组件不得复制进模块,否则表现为"agent 改完面板不自动刷新"。
|
|
34
26
|
|
|
35
|
-
## 2
|
|
27
|
+
## 2 会被门禁拦的写法
|
|
36
28
|
|
|
37
|
-
|
|
|
29
|
+
| 写法 | 结果 |
|
|
38
30
|
|---|---|
|
|
39
|
-
|
|
|
40
|
-
| `import
|
|
41
|
-
| `import
|
|
42
|
-
|
|
|
43
|
-
|
|
44
|
-
另外两条不是"被拦",是纪律:**样式走 `*.module.css`,类名别带 `wb-` 前缀**(`wb-*` 是外壳的**全局**
|
|
45
|
-
类名:模块定义它、或借契约里没有的那一个,`check --only style` 都判红;模块自己的类名由构建**按文件路径
|
|
46
|
-
哈希**,天然不会跟谁撞。要借外壳契约里的类,写 `:global(.wb-…)`,且那个类必须在契约里);
|
|
47
|
-
**`src/**` 里只许 JSDoc、且贴着导出**(用法归声明;`//`、实现里的解释与 `.css` 注释都不许)——
|
|
48
|
-
为什么写进 `README.md` 或 spec。
|
|
49
|
-
|
|
50
|
-
## 3 装上、上板
|
|
51
|
-
|
|
52
|
-
模块造好、门禁绿了,**装这一步你自己做** —— 用 `workbench_diy_install`(`unit=<单元 id>`):
|
|
53
|
-
|
|
54
|
-
- 它只认**工坊里造好的**那个模块(按 unit 在工坊里查,不接任何路径)。
|
|
55
|
-
- 装完顺手在**当前会话这个工作区**的面板上把它打开。
|
|
56
|
-
- 装是这台机器上的持久变更,**但它不问审批**(工坊整族都是这个口径)—— 不会弹审批屏、也不用等他点头:
|
|
57
|
-
别对他说"请你点一下确认"。
|
|
58
|
-
- 会话的审批被关成 `never` 时**拒的是"真回了 `ask`"的那些调用**(比如开始调试那次 `workbench_diy_debug_start`)——
|
|
59
|
-
装 / 上板是 `allow`,`never` 下照样过,不用让用户去把审批开回来。判据与构建不受影响。
|
|
60
|
-
|
|
61
|
-
两个必须记住的后果:
|
|
62
|
-
|
|
63
|
-
- **那一跳一辈子只该走一次。** 包名一旦在 profile 里,**再调它不会再装**(会告诉你"已经装过了"),
|
|
64
|
-
改源码 + `dsh-wb-module build` 就行;同名重装本来就只会得到"要重启",而那一支连重载都不做。
|
|
65
|
-
- **装 ≠ 上板**:面板默认是空的,得在面板配置里把它打开 —— 那一跳顺手做掉了。
|
|
66
|
-
只有在"要重启才生效"或它还没登记进外壳时才会没打开,那时返回里会说清:
|
|
67
|
-
等它生效后调 `workbench_diy_show`(`unit=<单元 id>`)—— 它只上板、不装,也不会多要一次点头。
|
|
68
|
-
- **拿不准它现在走到哪一步就问 `workbench_diy_status`**:装了没 / 面板认得没 / 这个项目上开着没 / 产物齐不齐 /
|
|
69
|
-
源码是否比产物新,外加一句"下一步做什么"。这五件事别自己去 panels、profile、工坊目录三处拼 ——
|
|
70
|
-
实测会拼错(把"要重启才注册"读成"没装上",或者源码改了没 build 却去重装一遍)。
|
|
71
|
-
- **已经装过、只是没上板**:`workbench_diy_show`(只上板,不装)。
|
|
72
|
-
|
|
73
|
-
工坊那一族 `workbench_diy_*`(33 把:14 把枚举的 opencli + 12 把看/装/探 + 4 把调试约定 + 3 把录制交接,
|
|
74
|
-
全表见 [FAMILY.md](FAMILY.md))**只在工坊那个会话里**(工具清单按工作区收窄,别处连它都不在),
|
|
75
|
-
落在别的项目里调用会被当场拒 —— 这就是"DIY 模式"在工具面上的样子。
|
|
76
|
-
普通项目里装别的东西是另一套工具:`workbench_modules_install` / `workbench_modules_uninstall` 等(见 TOOLS.md)。
|
|
77
|
-
|
|
78
|
-
## 4 改一行,看到它变
|
|
79
|
-
|
|
80
|
-
装完之后**不要再装一遍**。改源码 → `dsh-wb-module build` → 用户面板上那张卡自己变。
|
|
81
|
-
|
|
82
|
-
- **宿主侧**(`src/host.ts` / `balance.ts` … → `dist/host.js`):**秒级热换**,不重启、不刷新
|
|
83
|
-
(加一行探针 → build → 3 秒内接口就返回新内容)。`cordis.patch.yml` 里 hmr 那两件都不能去掉:
|
|
84
|
-
`followSymlinks: false`(跟着软链会把文件描述符用光),以及 `ignored` 里那两条 `*(../)`
|
|
85
|
-
extglob(工坊那个根在外壳包目录之外,相对路径以 `..` 打头,而 picomatch 的 `**` 不吃 `..` ——
|
|
86
|
-
少了它工坊 `node_modules` 的实目录会整棵进监听表)。为什么、实测数字与边界见仓内 ADR-0034 §3。
|
|
87
|
-
- **客户端侧**(`src/client.tsx` / CSS → `client.js`):浏览器**不会自己**换,**刷新一下页面**即可
|
|
88
|
-
(实测:重建后 60 秒页面没有任何反应)。`*.module.css` 的改动是就地改写那一份 `<style>`,刷新即生效。
|
|
89
|
-
- **改 `cordis.patch.yml`、改 `package.json` 里的 `dsh.client` / `exports["./client"]` 需要重启。**
|
|
90
|
-
这些是"模块怎么被装上"的声明,不是模块的内容。
|
|
91
|
-
- 重启操作只有在极少数情况下才需要用户做。真需要时,说清**为什么**、**要重启哪个**。
|
|
31
|
+
| DOM + CSS 重画 dsh 已有控件(按钮、弹窗、输入框、图标) | 第二份材质与交互;先从 `kit` 取 |
|
|
32
|
+
| `import '@deepseek-ai/dsh-client-ui-primitives'` | 允许,需三处齐:仅浏览器侧、`dsh.client.external` 声明、产物中为 `require`(否则被内联,`primitives` 红) |
|
|
33
|
+
| `import '@/shared/…'`、`../../core/src/…` | `@/` 只指自己 `src/`;跨包用包名 |
|
|
34
|
+
| 公开包写内网地址 / 域名 / 企业名 | `markers` 红 |
|
|
92
35
|
|
|
93
|
-
|
|
36
|
+
纪律:样式走 `*.module.css`,类名不带 `wb-` 前缀(外壳全局类;借契约类写 `:global(.wb-…)`);
|
|
37
|
+
`src/**` 零注释;说明写 `README.md` 或 spec。
|
|
38
|
+
|
|
39
|
+
## 3 安装、上板
|
|
40
|
+
|
|
41
|
+
`workbench_diy_install`(`unit=<id>`):只认当前工作区造好的模块;装后在当前工作区面板打开;不弹审批。
|
|
42
|
+
|
|
43
|
+
- 只装一次。包名已在 profile 后再次调用会返回"已装过";迭代用 `dsh-wb-module build`。
|
|
44
|
+
- 装 ≠ 上板。返回里说未打开时,待生效后调 `workbench_diy_show`(只上板)。
|
|
45
|
+
- 状态不明问 `workbench_diy_status`(`unit=…`):装没装 / 面板认没认 / 项目内开没开 / 产物齐不齐 /
|
|
46
|
+
源码是否新于产物 / 下一步。不要自行拼 panels、profile、目录三处。
|
|
47
|
+
- 用户选「完全权限」时,需审批的调用直接过;未认领的写与 `{blocked}` 仍拒。
|
|
94
48
|
|
|
95
|
-
|
|
49
|
+
DIY 族仅在选了 DIY 模式的会话出现(按模式,不按工作区);全表 [FAMILY.md](FAMILY.md)。
|
|
50
|
+
普通项目安装用 `workbench_modules_install` / `workbench_modules_uninstall`。
|
|
51
|
+
|
|
52
|
+
## 4 热换
|
|
53
|
+
|
|
54
|
+
装后不再安装。改源码 → `dsh-wb-module build`:
|
|
55
|
+
|
|
56
|
+
- 宿主侧 → `dist/host.js`:秒级热换,不重启、不刷新。
|
|
57
|
+
- 客户端侧 → `client.js`:刷新页面;`*.module.css` 就地改写 `<style>`,刷新生效。
|
|
58
|
+
- 改 `cordis.patch.yml`、`package.json` 的 `dsh.client` / `exports["./client"]`:需重启(安装声明变更)。
|
|
59
|
+
- 必须重启时说明原因与重启对象。
|
|
60
|
+
|
|
61
|
+
## 5 发布
|
|
96
62
|
|
|
97
|
-
|
|
98
|
-
|
|
63
|
+
默认 `private: true`,不发任何源。用户说「帮我发布」时,**不要手改 `package.json`、不要让他看 npm**,
|
|
64
|
+
走 `workbench_diy_publish`(`unit=…`):
|
|
65
|
+
|
|
66
|
+
1. 先确认他已经在真卡片上说过「没问题」,并已跑过 `design accept`(验收 N/N 全勾)。
|
|
67
|
+
还要把这一版写进 `CHANGELOG.md`:调 `workbench_diy_changelog`(`unit=…`,`note=…`);
|
|
68
|
+
没有这一版的记录(或包里没带 `CHANGELOG.md`)时 `release` 会拦下,并给出补的命令。
|
|
69
|
+
2. 工具一次做完预检(登录 / license / git 远端 / 工作区)→ 全门禁 → 按出口发布 → 发后核包。
|
|
70
|
+
发布审批屏会把这一版的更新日志按 markdown 展示给用户。
|
|
71
|
+
3. 出口只有四种:团队源(配了私源时默认)、公网 npm(必须用户明确说“公开”)、安装包(没私源时默认,
|
|
72
|
+
零凭据)、git(提交构建产物 + tag + push)。只问「给团队用、公开发、还是先给你一个安装包」;
|
|
73
|
+
凭据细节由预检接管。
|
|
74
|
+
4. 工具回 `needsUser` 时,照它那句 `text` 对用户说一句,给能照抄的命令,等他说「好了」再跑;
|
|
75
|
+
**不在对话里要 token / OTP**,不把红字贴给用户。`otp` 交接后用 `workbench_diy_publish` 的 `verify=true`
|
|
76
|
+
(或 `release --verify`)只核不发。
|
|
77
|
+
5. `dsh-wb-module publish` 仍是**发货前清单**(只 dry run);`release --dry-run` 只预览;
|
|
78
|
+
`--verify` 只核已发布的包。公网源必须显式 `--target public` + license,默认只认团队源 / 安装包。
|