@dsh-workbench/core 0.3.9 → 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.
Files changed (84) hide show
  1. package/README.md +19 -7
  2. package/bin/dsh-workbench +2 -2
  3. package/client.js +1687 -1022
  4. package/cordis.patch.yml +60 -35
  5. package/dist/client/client.body.js +1687 -1022
  6. package/dist/client/index.js +1372 -707
  7. package/dist/host/index.js +2897 -2335
  8. package/dist/types/app/client.d.ts +2 -1
  9. package/dist/types/app/layouts/env-gate/boot-gate.d.ts +1 -1
  10. package/dist/types/app/layouts/market/use-module-versions.d.ts +13 -2
  11. package/dist/types/app/layouts/rightbar/MarketView.d.ts +6 -3
  12. package/dist/types/app/layouts/rightbar/market-act.d.ts +6 -3
  13. package/dist/types/app/layouts/rightbar/market-rows.d.ts +1 -1
  14. package/dist/types/app/layouts/rightbar/market-settle-hold.d.ts +2 -0
  15. package/dist/types/app/layouts/rightbar/market-settle.d.ts +20 -0
  16. package/dist/types/app/layouts/rightbar/market-shared-rows.d.ts +0 -1
  17. package/dist/types/app/layouts/rightbar/market-update-verdict.d.ts +41 -0
  18. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +4 -1
  19. package/dist/types/app/layouts/rightbar/store.d.ts +14 -0
  20. package/dist/types/app/layouts/sidebar/LongTaskDot.d.ts +12 -0
  21. package/dist/types/app/layouts/sidebar/LongTaskHover.d.ts +12 -0
  22. package/dist/types/app/layouts/sidebar/edition-boot.d.ts +24 -0
  23. package/dist/types/app/layouts/sidebar/edition.d.ts +22 -0
  24. package/dist/types/app/layouts/workbench-settings/ConfigSyncItem.d.ts +5 -0
  25. package/dist/types/app/layouts/workbench-settings/SettingsItem.d.ts +17 -0
  26. package/dist/types/app/layouts/workbench-settings/SidebarEditionItem.d.ts +11 -0
  27. package/dist/types/app/layouts/workbench-settings/WorkbenchSettingsSection.d.ts +11 -0
  28. package/dist/types/modules/panels/model/approval.d.ts +12 -4
  29. package/dist/types/modules/panels/model/diy-browser-tools.d.ts +1 -1
  30. package/dist/types/modules/panels/model/diy-context.d.ts +31 -14
  31. package/dist/types/modules/panels/model/diy-page.d.ts +3 -2
  32. package/dist/types/modules/panels/model/diy-record.d.ts +3 -3
  33. package/dist/types/modules/panels/model/diy-report.d.ts +6 -7
  34. package/dist/types/modules/panels/model/market-dependency-update.d.ts +21 -0
  35. package/dist/types/modules/panels/model/market-dispatch.d.ts +1 -0
  36. package/dist/types/modules/panels/model/market-types.d.ts +1 -0
  37. package/dist/types/modules/panels/model/market-update-bundle.d.ts +25 -0
  38. package/dist/types/modules/panels/model/market-verify.d.ts +31 -0
  39. package/dist/types/modules/panels/unit.d.ts +3 -4
  40. package/dist/types/shared/api/bundle-install.d.ts +13 -0
  41. package/dist/types/shared/api/host/approval-gate.d.ts +39 -0
  42. package/dist/types/shared/api/host/bundle-routes.d.ts +2 -1
  43. package/dist/types/shared/api/host/diy-artifacts.d.ts +14 -0
  44. package/dist/types/shared/api/host/diy-modules.d.ts +41 -0
  45. package/dist/types/shared/api/host/host-routes.d.ts +13 -0
  46. package/dist/types/shared/api/host/permission-mode.d.ts +9 -0
  47. package/dist/types/shared/api/host/runtime-seed.d.ts +2 -0
  48. package/dist/types/shared/api/host/self-update.d.ts +9 -2
  49. package/dist/types/shared/api/host/sidebar-edition.d.ts +46 -0
  50. package/dist/types/shared/api/host/workspace-root.d.ts +13 -0
  51. package/dist/types/shared/api/sidebar-edition.d.ts +14 -0
  52. package/dist/types/shared/api/unit-board.d.ts +20 -0
  53. package/dist/types/shared/api/write-outcome.d.ts +15 -0
  54. package/dist/types/shared/components/IconModules.d.ts +8 -0
  55. package/dist/types/shared/components/blocker-action.d.ts +16 -0
  56. package/dist/types/shared/hooks/sidebar-edition.d.ts +7 -0
  57. package/dist/types/shared/hooks/use-capabilities.d.ts +5 -0
  58. package/dist/types/shared/hooks/use-capability-gate.d.ts +1 -2
  59. package/dist/types/shared/hooks/use-host-write.d.ts +1 -1
  60. package/dist/types/shared/hooks/use-unit-board.d.ts +1 -1
  61. package/docs/HANDOFF.md +3 -3
  62. package/docs/OPERATIONS.md +16 -5
  63. package/package.json +3 -3
  64. package/preset/diy.patch.yml +2 -2
  65. package/profile/isolation.patch.yml +11 -0
  66. package/skills/workbench-module-diy/BUILD.md +62 -131
  67. package/skills/workbench-module-diy/COPY.md +89 -0
  68. package/skills/workbench-module-diy/DATASOURCE.md +84 -112
  69. package/skills/workbench-module-diy/DESIGN.md +75 -109
  70. package/skills/workbench-module-diy/FAMILY.md +70 -54
  71. package/skills/workbench-module-diy/KIT.md +77 -133
  72. package/skills/workbench-module-diy/LINKAGE.md +66 -105
  73. package/skills/workbench-module-diy/PANEL.md +79 -171
  74. package/skills/workbench-module-diy/REVIEW.md +67 -81
  75. package/skills/workbench-module-diy/SKILL.md +57 -96
  76. package/skills/workbench-module-diy/STEPS.md +66 -69
  77. package/skills/workbench-module-diy/TOOLING.md +34 -51
  78. package/skills/workbench-module-diy/TOOLS.md +110 -103
  79. package/skills/workbench-module-diy/WIRING.md +51 -83
  80. package/skills/workbench-module-diy/WRITES.md +89 -142
  81. package/dist/types/app/layouts/config-sync/ConfigSyncSection.d.ts +0 -5
  82. package/dist/types/shared/api/host/diy-workshop.d.ts +0 -23
  83. package/dist/types/shared/api/host/workshop-root.d.ts +0 -16
  84. /package/dist/types/shared/{api/host/diy-workshop.test.d.ts → components/blocker-action.test.d.ts} +0 -0
package/cordis.patch.yml CHANGED
@@ -1,7 +1,6 @@
1
- # 工作台 bundle 的补丁层。做三件事:
2
- # 1. 关掉出厂的左栏 ui-sidebar —— 由我们接管 sidebar 槽;
3
- # 2. 打开宿主的模块监听 —— 让 `npm run dev` 重建后宿主插件能热换;
4
- # 3. 插入工作台插件本体。
1
+ # 工作台 bundle 的补丁层。做两件事:
2
+ # 1. 打开宿主的模块监听 —— 让 `npm run dev` 重建后宿主插件能热换;
3
+ # 2. 插入工作台插件本体。
5
4
  #
6
5
  # 组合顺序(实测):
7
6
  # 1. bundle 层(dsh.profile.bundles 顺序) ← 本文件在这里
@@ -9,20 +8,53 @@
9
8
  # 3. 机器公共层($DSH_HOME/cordis.patch.yml,对所有 profile 生效)
10
9
  # 4. --patch 叠加层
11
10
  #
12
- # 我们排在 bundle 列表最后,所以能覆盖 dsh-web-app 插入的 ui-sidebar 行。
11
+ # 我们排在 bundle 列表最后,所以能覆盖 dsh-web-app 插入的行。
13
12
 
14
- # ── 为什么必须"关掉"而不是"运行时遮蔽" ────────────────────────────────
15
- # sidebar 是 single 槽,理论上可以用更低的 priority 遮蔽 ui-sidebar 的
16
- # SidebarRoot。但子座位(sidebar.panellist / sidebar.settings / …)的声明
17
- # 是**独占 claim**,SlotSpec 里没有 priority:两个 entry 声明同一批座位,
18
- # 后一个会抛错,导致 ui-sidebar 整个 entry 激活失败、前端直接白屏报
19
- # "Failed to load plugins"。
13
+ # ── 左栏二选一:官方 ui-sidebar / 工作台自己的 ─────────────────────────
20
14
  #
21
- # 所以正确做法是在组合层把它摘掉,让工作台插件成为 sidebar 槽的唯一
22
- # 注册者。这也正是 profile 隔离的价值:只影响工作台,dsh web 一点不动。
23
- - id: ui-sidebar
24
- name: '@deepseek-ai/dsh-client-ui-sidebar'
25
- disabled: true
15
+ # 默认是**官方**左栏(这一层不再摘 ui-sidebar)。Guest 的「设置 → 工作台设置 →
16
+ # 会话列表」选「自定义」时,往 **profile 用户层**(profiles/<name>/cordis.patch.yml)
17
+ # 写一行 `- id: ui-sidebar` + `disabled: true`;dsh-hmr 盯着 profile patch,
18
+ # 变了会重组,刷新页面即生效(不用重启进程)。
19
+ #
20
+ # 为什么不能运行时遮蔽:sidebar 的子座位(sidebar.panellist / .settings / …)是
21
+ # **独占 claim**,两个 entry 声明同一批座位会抛错;而运行时只给声明了 children 的
22
+ # entry 发 `renderSlot`。所以两套左栏不能同时在场,只能按组合层二选一。
23
+ # 证据:.scratch/sidebar-edition/spec.md §3。
24
+
25
+ # ── 权限预设:多给一档「全盘写 + 保留审批」 ────────────────────────────
26
+ # dsh 出厂只有「工作区内修改」(workspace-write + ask)与「完全权限」
27
+ # (danger-full-access + never)。中间那档「文件边界全开、但审批策略仍是 ask」
28
+ # 不在表里,用户选不到;这里把它加进选择器。
29
+ #
30
+ # 这一档是 dsh 层的权限档,不绑任何产品:名字与描述都不带产品字样。
31
+ # 它只改变两个旋钮,谁读这两个旋钮(写闸门、升权审批、插件命令……)
32
+ # 各自按自己的规则响应。
33
+ #
34
+ # `config` 是整体替换、不深合并:dsh 出厂那三档必须一起写全。
35
+ # `defaultPreset` 不写,保持 dsh 按组合默认值推断(通常是 workspace-write)。
36
+ #
37
+ # id 用 `danger-full-access-ask`,不覆盖 `danger-full-access`:后者要留给
38
+ # 真正「不问审批」的完全权限。代价是 dsh 客户端只对 `danger-full-access` /
39
+ # `auto` 两个 id 弹全盘风险确认、也只给那四个内置 id 图标 —— 这一档点了直接切、
40
+ # 而且没有图标(2026-10-22 明确接受)。
41
+ - id: permission
42
+ config:
43
+ presets:
44
+ read-only:
45
+ sandbox: read-only
46
+ approval: ask
47
+ workspace-write:
48
+ sandbox: workspace-write
49
+ approval: ask
50
+ danger-full-access:
51
+ sandbox: danger-full-access
52
+ approval: never
53
+ danger-full-access-ask:
54
+ sandbox: danger-full-access
55
+ approval: ask
56
+ name: 完全权限(保留审批)
57
+ description: 允许写工作区外;需要审批的操作仍会继续询问。
26
58
 
27
59
  # ── 宿主侧热更新 ──────────────────────────────────────────────────────
28
60
  # 出厂默认 `root: []` = 不监听任何模块目录,改了宿主代码只能重启。
@@ -94,27 +126,20 @@
94
126
  - '*(../)**/node_modules'
95
127
  - '*(../)**/.*'
96
128
 
97
- # ── 工作台运行时的**可写根**:让外壳在**任意 profile** 里自足 ──────────────
129
+ # ── 可写根**不在这里**(2026-10-22 挪走)──────────────────────────────────
98
130
  #
99
- # 这一行与 `--patch profile/sandbox.patch.yml` 是同一件事(启动器每次启动都叠那一层)。
100
- # 为什么这里还要再来一份:外壳现在可以被**直接装进别人的 profile**(dsh web 的
101
- # Plugins 页 → Add plugin → `@dsh-workbench/core`)。那条路上没有启动器,
102
- # 而少了这一行,插件发起的命令(启动体检装隔离 opencli、市场装 opencli 插件、
103
- # opencli 自己的 trace / browser-profile 写入)全都撞文件沙箱 —— 可写根是
104
- # dsh-base 出厂那句 `process.cwd()`,`$DSH_HOME/workbench` 不在它下面。
131
+ # 这一格曾经有一行 `sandbox-policy`(`workspaceRoot` → `$DSH_HOME/workbench`),
132
+ # 为的是"装进别人的 profile 也就地放行"。它被挪走了,因为 **bundle 层是在线启用时
133
+ # 才生效的**:dsh 0.2.1 的在线重组在改这一行时会重建 `session-controller`,与
134
+ # `file-upload` 注销 resolver 赛跑 —— 启用当场把 session-controller 打成 failed,
135
+ # 之后每次新建会话都是 `gateway/service-unavailable`(连 toggle 都救不回来,只能重启)。
105
136
  #
106
- # 为什么放**组合层**而不是让宿主自己改策略:`sandboxPolicy` 的 workspaceRoot 是
107
- # 启动时读的部署策略,插件没有正当入口改它(改服务字段是绕过策略,不是声明策略)。
108
- # bundle 层正好在 profile 用户层**下面** —— 所以"装了就生效"与"用户自己写一行就
109
- # 覆盖它"同时成立,这正是这一层该有的位置。
110
- #
111
- # 代价写在明处(ADR-0037):这个 profile 里**无会话的**插件命令,可写根从
112
- # `process.cwd()` 变成 `$DSH_HOME/workbench`。有会话的命令不受影响(会话用自己的
113
- # cwd),工作台自己的命令本来也只该写这一棵树。
114
- - id: sandbox-policy
115
- config:
116
- mode: !!js process.env.DSH_PERMISSION_MODE ?? 'workspace-write'
117
- workspaceRoot: !!js dshHomePath('workbench')
137
+ # 证据与 A/B:ADR-0037 的 2026-10-22 补记。自带 profile 的可写根仍有两处:启动器每次启动
138
+ # 叠的 `--patch profile/sandbox.patch.yml`,以及 `profile/isolation.patch.yml` 里同值的那一行
139
+ # (seed-profile.sh 追加进 profile,给不带启动器的 `dsh workbench`)。装进别人的 profile 时,
140
+ # 请把那一行写进那个 profile 的 `cordis.patch.yml` 再**重启**(在线写同一行也会撞同一个竞态)。
141
+ # 少了它只会让"无会话的插件命令"被沙箱挡,不会再动会话接口;宿主启动时会就此打一条 warn
142
+ # (见 runtime-seed 的 coversWritableRoot)。
118
143
 
119
144
  - insert:
120
145
  - id: workbench