@dsh-workbench/core 0.3.10 → 0.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -7
- package/bin/dsh-workbench +2 -2
- package/client.js +1648 -973
- package/cordis.patch.yml +60 -35
- package/dist/client/client.body.js +1648 -973
- package/dist/client/index.js +1333 -658
- package/dist/host/index.js +2896 -2334
- package/dist/types/app/client.d.ts +2 -1
- package/dist/types/app/layouts/env-gate/boot-gate.d.ts +1 -1
- package/dist/types/app/layouts/market/use-module-versions.d.ts +13 -2
- package/dist/types/app/layouts/rightbar/MarketView.d.ts +6 -3
- package/dist/types/app/layouts/rightbar/market-act.d.ts +6 -3
- package/dist/types/app/layouts/rightbar/market-settle-hold.d.ts +2 -0
- package/dist/types/app/layouts/rightbar/market-settle.d.ts +20 -0
- package/dist/types/app/layouts/rightbar/market-update-verdict.d.ts +41 -0
- package/dist/types/app/layouts/rightbar/market-view-text.d.ts +4 -1
- package/dist/types/app/layouts/rightbar/store.d.ts +14 -0
- package/dist/types/app/layouts/sidebar/LongTaskDot.d.ts +12 -0
- package/dist/types/app/layouts/sidebar/LongTaskHover.d.ts +12 -0
- package/dist/types/app/layouts/sidebar/edition-boot.d.ts +24 -0
- package/dist/types/app/layouts/sidebar/edition.d.ts +22 -0
- package/dist/types/app/layouts/workbench-settings/ConfigSyncItem.d.ts +5 -0
- package/dist/types/app/layouts/workbench-settings/SettingsItem.d.ts +17 -0
- package/dist/types/app/layouts/workbench-settings/SidebarEditionItem.d.ts +11 -0
- package/dist/types/app/layouts/workbench-settings/WorkbenchSettingsSection.d.ts +11 -0
- package/dist/types/modules/panels/model/approval.d.ts +12 -4
- package/dist/types/modules/panels/model/diy-browser-tools.d.ts +1 -1
- package/dist/types/modules/panels/model/diy-context.d.ts +31 -14
- package/dist/types/modules/panels/model/diy-page.d.ts +3 -2
- package/dist/types/modules/panels/model/diy-record.d.ts +3 -3
- package/dist/types/modules/panels/model/diy-report.d.ts +6 -7
- package/dist/types/modules/panels/model/market-dependency-update.d.ts +21 -0
- package/dist/types/modules/panels/model/market-dispatch.d.ts +1 -0
- package/dist/types/modules/panels/model/market-types.d.ts +1 -0
- package/dist/types/modules/panels/model/market-update-bundle.d.ts +25 -0
- package/dist/types/modules/panels/model/market-verify.d.ts +31 -0
- package/dist/types/modules/panels/unit.d.ts +3 -4
- package/dist/types/shared/api/bundle-install.d.ts +13 -0
- package/dist/types/shared/api/host/approval-gate.d.ts +39 -0
- package/dist/types/shared/api/host/bundle-routes.d.ts +2 -1
- package/dist/types/shared/api/host/diy-artifacts.d.ts +14 -0
- package/dist/types/shared/api/host/diy-modules.d.ts +41 -0
- package/dist/types/shared/api/host/host-routes.d.ts +13 -0
- package/dist/types/shared/api/host/permission-mode.d.ts +9 -0
- package/dist/types/shared/api/host/runtime-seed.d.ts +2 -0
- package/dist/types/shared/api/host/self-update.d.ts +9 -2
- package/dist/types/shared/api/host/sidebar-edition.d.ts +46 -0
- package/dist/types/shared/api/host/workspace-root.d.ts +13 -0
- package/dist/types/shared/api/sidebar-edition.d.ts +14 -0
- package/dist/types/shared/api/unit-board.d.ts +20 -0
- package/dist/types/shared/api/write-outcome.d.ts +15 -0
- package/dist/types/shared/components/IconModules.d.ts +8 -0
- package/dist/types/shared/components/blocker-action.d.ts +16 -0
- package/dist/types/shared/hooks/sidebar-edition.d.ts +7 -0
- package/dist/types/shared/hooks/use-capabilities.d.ts +5 -0
- package/dist/types/shared/hooks/use-capability-gate.d.ts +1 -2
- package/dist/types/shared/hooks/use-host-write.d.ts +1 -1
- package/dist/types/shared/hooks/use-unit-board.d.ts +1 -1
- package/docs/HANDOFF.md +3 -3
- package/docs/OPERATIONS.md +16 -5
- package/package.json +3 -3
- package/preset/diy.patch.yml +2 -2
- package/profile/isolation.patch.yml +11 -0
- package/skills/workbench-module-diy/BUILD.md +62 -131
- package/skills/workbench-module-diy/COPY.md +89 -0
- package/skills/workbench-module-diy/DATASOURCE.md +84 -112
- package/skills/workbench-module-diy/DESIGN.md +75 -109
- package/skills/workbench-module-diy/FAMILY.md +70 -54
- package/skills/workbench-module-diy/KIT.md +77 -133
- package/skills/workbench-module-diy/LINKAGE.md +66 -105
- package/skills/workbench-module-diy/PANEL.md +79 -171
- package/skills/workbench-module-diy/REVIEW.md +67 -81
- package/skills/workbench-module-diy/SKILL.md +57 -96
- package/skills/workbench-module-diy/STEPS.md +66 -69
- package/skills/workbench-module-diy/TOOLING.md +34 -51
- package/skills/workbench-module-diy/TOOLS.md +110 -103
- package/skills/workbench-module-diy/WIRING.md +51 -83
- package/skills/workbench-module-diy/WRITES.md +89 -142
- package/dist/types/app/layouts/config-sync/ConfigSyncSection.d.ts +0 -5
- package/dist/types/shared/api/host/diy-workshop.d.ts +0 -23
- package/dist/types/shared/api/host/workshop-root.d.ts +0 -16
- /package/dist/types/shared/{api/host/diy-workshop.test.d.ts → components/blocker-action.test.d.ts} +0 -0
|
@@ -1,131 +1,138 @@
|
|
|
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
|
-
- `deniedTools(workspace)`
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
参数、如实边界,全表在 [FAMILY.md](FAMILY.md) —— 这一份讲**你写的模块**的能力怎么写;
|
|
131
|
-
那一份讲**工坊会话里 agent 手上真实有什么**。为什么按 opencli 子命令枚举见仓内 ADR-0062(这里不链仓内路径)。
|
|
80
|
+
| 预览 | 不弹 | 预览内容 |
|
|
81
|
+
| 执行且材料齐 | 这次会发生什么 + 允许吗 | 等待回答 |
|
|
82
|
+
| 材料不齐 / 项目不符 / 能力关闭 | 不弹 | 停止原因 / 项目说明 |
|
|
83
|
+
| 拒绝 / 点头后中途变化 | 关闭 / 当时那份材料 | 拒绝或失败原因,可照做 |
|
|
84
|
+
| 本轮中断 / 后台 | 消失 / 不弹 | 本轮结束 / 自动禁止 |
|
|
85
|
+
| 连发多件 | 逐条询问 | 逐条等待 |
|
|
86
|
+
|
|
87
|
+
按钮与弹窗由外壳提供;模块只决定明细画什么:一行一个事实。
|
|
88
|
+
|
|
89
|
+
## 8 外部供给
|
|
90
|
+
|
|
91
|
+
`env` 声明能力依赖,外壳隔离运行时按它装、探,状态见 `workbench_modules_list`。
|
|
92
|
+
形状:`env: { command, libs: [{ name, registryEnv, registryDefault, purpose }], plugins: [{ name, commands, installSource }] }`。
|
|
93
|
+
|
|
94
|
+
- `libs[]` 四项必填:`registryEnv` 让用户源覆盖 `registryDefault`;`purpose` 是给用户的一句用途。
|
|
95
|
+
`installSource`:`{kind:'npm', package, registryEnv}` / `{kind:'git', url}` / `{kind:'local', env}`。
|
|
96
|
+
- 未装好文案由模块写:`libInstallCommand({ need })`(`@dsh-workbench/shared/host`)拼好源与缓存目录,原样输出;
|
|
97
|
+
放进失败态。
|
|
98
|
+
- `contracts` 判据:`env` 非空;`libs` 缺 `purpose` / `registryEnv`、`registryDefault` 非 `http(s)://` 或 `file://`、
|
|
99
|
+
`installSource` 错误都红;声明 `libs` 必须用 `libInstallCommand`。
|
|
100
|
+
|
|
101
|
+
## 9 长任务
|
|
102
|
+
|
|
103
|
+
耗时几十秒以上的操作做成长任务。宿主侧用 `mount` deps 的 `longTasks`,并挂回返回值:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
longTasks.create({ key, run, step, outcome, view, stopped })
|
|
107
|
+
// run({ payload, onStep, signal }):onStep({ kind: 'start', text }) 报步骤;return 结果
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- 来源:在工具里 `runs.start({ …, session: sessionIdOf(exec) ?? undefined })`(`sessionIdOf` 来自
|
|
111
|
+
`@dsh-workbench/shared/host`)。不记 = 用户按的 → 停止需审批。
|
|
112
|
+
- 浏览器侧:`useLongTask` → `feed.runs` / `feed.stop(id)` / `feed.stopping` / `feed.stopFailed`;
|
|
113
|
+
画 `LongTaskRow`(五态:`running` / `needs-login` / `stopped` / `ok` / `failed`)。
|
|
114
|
+
- 停止:`run` 收到 `signal` 被 abort = 有人按停止;在循环点与每条子命令前后查 `signal.aborted`。
|
|
115
|
+
不认 signal 就不要画停止钮。画钮传 `stop`(`onStop: () => feed.stop(run.id)`、`busy: feed.stopping === run.id`、
|
|
116
|
+
`failed: feed.stopFailed`、`label: 停止任务 {label}`、`askLabel: '确认停止'`);失败文案画在行下,
|
|
117
|
+
不写"停止失败"。两按确认归组件;未传 `stop` 的行不变。
|
|
118
|
+
- `feed.stopping` / `feed.stopFailed` 只有一格(最后一次)。多行并行时要分行状态就按 id 自记。
|
|
119
|
+
- 外壳自带 `workbench_long_tasks_list`(读)与 `workbench_long_tasks_stop`(写)。自己起的免审批;
|
|
120
|
+
别人的 / 用户按的 / 没记来源的要审批;跨工作区直接拒。被停时外壳向起它的会话发 notice(完成 / 失败不发)。
|
|
121
|
+
- `contracts` 查形状:注册表七个方法(含 `stop` / `live`)、`create` 的 `key` / `run` / `view`、
|
|
122
|
+
产物含 `useLongTask` / `LongTaskRow` 之一。是否真响应 signal 不在射程内。
|
|
123
|
+
- 左栏 loading 点由外壳按 `live()` 驱动,模块不做。
|
|
124
|
+
- 用 `stop` / `session` / 外壳长任务工具需把 `@dsh-workbench/core` peer 下限抬到含它们的版本(`check --only kit` 查)。
|
|
125
|
+
|
|
126
|
+
## 12 按工作区 / 模式收窄工具
|
|
127
|
+
|
|
128
|
+
工具是机器级的;不同项目需要不同工具。不要运行时返回"此项目不可用"—— 从清单移除。
|
|
129
|
+
`gate: { deniedTools(context), subscribe(listener) }` 挂进 `mount` 返回值:
|
|
130
|
+
|
|
131
|
+
- `deniedTools({ workspace, preset })` 返回该会话不存在的工具名(与 `registerTools()` 一致;二者可为 `null`)。
|
|
132
|
+
`subscribe` 在状态变化时通知外壳重算;不接则等重启。
|
|
133
|
+
- 两个轴:`workspace` = 用户在看哪个项目;`preset` = 该会话被授权做什么。外壳两者都用。
|
|
134
|
+
模块工具按工作区是否有这张卡收窄;DIY 族按模式收窄。
|
|
135
|
+
- 外壳双重执行:清单不出现 + 调用时拒。
|
|
136
|
+
|
|
137
|
+
"哪些工作区出现"不由模块声明:用户用 `workbench_panels_show` / `_hide` 控制,卡片与全部工具同判。
|
|
138
|
+
`deniedTools` 可选。
|
|
@@ -1,98 +1,66 @@
|
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
-
|
|
66
|
-
|
|
67
|
-
|
|
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/…'`、`../../workbench/src/…` | `@/` 只指自己 `src/`;跨包用包名 |
|
|
34
|
+
| 公开包写内网地址 / 域名 / 企业名 | `markers` 红 |
|
|
35
|
+
|
|
36
|
+
纪律:样式走 `*.module.css`,类名不带 `wb-` 前缀(外壳全局类;借契约类写 `:global(.wb-…)`);
|
|
37
|
+
`src/**` 只许贴导出的 JSDoc。
|
|
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}` 仍拒。
|
|
48
|
+
|
|
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
|
+
- 必须重启时说明原因与重启对象。
|
|
92
60
|
|
|
93
61
|
## 5 发布
|
|
94
62
|
|
|
95
|
-
|
|
63
|
+
DIY 模块 `private: true`,不发任何源。
|
|
96
64
|
|
|
97
|
-
|
|
98
|
-
|
|
65
|
+
需要发布时:`pnpm exec dsh-wb-module publish`(门禁 + 三张表 + `files` 漏项,仅 dry run);
|
|
66
|
+
通过后移除 `private`,显式写 `publishConfig.access` 或内网 `publishConfig.registry`。
|