@dimina-kit/devtools 0.3.2-dev.20260601115343 → 0.3.2-dev.20260610114009

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 (189) hide show
  1. package/README.md +49 -59
  2. package/dist/main/api.d.ts +1 -2
  3. package/dist/main/api.js +5 -1
  4. package/dist/main/app/app.d.ts +15 -5
  5. package/dist/main/app/app.js +249 -122
  6. package/dist/main/app/bootstrap.d.ts +16 -0
  7. package/dist/main/app/bootstrap.js +20 -0
  8. package/dist/main/app/launch.d.ts +8 -4
  9. package/dist/main/app/launch.js +9 -4
  10. package/dist/main/index.bundle.js +6071 -1863
  11. package/dist/main/index.js +9 -1
  12. package/dist/main/ipc/app.d.ts +1 -1
  13. package/dist/main/ipc/bridge-router.d.ts +61 -0
  14. package/dist/main/ipc/bridge-router.js +1333 -0
  15. package/dist/main/ipc/panels.d.ts +1 -1
  16. package/dist/main/ipc/panels.js +6 -2
  17. package/dist/main/ipc/popover.d.ts +1 -1
  18. package/dist/main/ipc/project-fs.d.ts +1 -1
  19. package/dist/main/ipc/projects.d.ts +1 -1
  20. package/dist/main/ipc/session.d.ts +1 -1
  21. package/dist/main/ipc/settings.d.ts +1 -1
  22. package/dist/main/ipc/simulator-module.d.ts +6 -0
  23. package/dist/main/ipc/simulator-module.js +9 -1
  24. package/dist/main/ipc/simulator.d.ts +2 -2
  25. package/dist/main/ipc/simulator.js +29 -5
  26. package/dist/main/ipc/toolbar.d.ts +1 -1
  27. package/dist/main/ipc/views.d.ts +1 -1
  28. package/dist/main/ipc/views.js +40 -2
  29. package/dist/main/runtime/devtools-backend.d.ts +17 -0
  30. package/dist/main/runtime/devtools-backend.js +49 -0
  31. package/dist/main/runtime/miniapp-runtime.d.ts +39 -0
  32. package/dist/main/runtime/miniapp-runtime.js +17 -0
  33. package/dist/main/services/automation/exec.d.ts +27 -2
  34. package/dist/main/services/automation/exec.js +37 -3
  35. package/dist/main/services/automation/handlers/app.js +127 -11
  36. package/dist/main/services/automation/handlers/page.js +36 -19
  37. package/dist/main/services/automation/index.js +40 -13
  38. package/dist/main/services/automation/wait-active-page.d.ts +56 -0
  39. package/dist/main/services/automation/wait-active-page.js +71 -0
  40. package/dist/main/services/console-forward/index.d.ts +36 -0
  41. package/dist/main/services/console-forward/index.js +81 -0
  42. package/dist/main/services/dimina-resource-server.d.ts +7 -0
  43. package/dist/main/services/dimina-resource-server.js +99 -0
  44. package/dist/main/services/elements-forward/index.d.ts +66 -0
  45. package/dist/main/services/elements-forward/index.js +583 -0
  46. package/dist/main/services/layout/index.d.ts +22 -0
  47. package/dist/main/services/layout/index.js +25 -0
  48. package/dist/main/services/mcp/index.d.ts +1 -0
  49. package/dist/main/services/mcp/index.js +3 -0
  50. package/dist/main/services/mcp/server.d.ts +1 -1
  51. package/dist/main/services/mcp/server.js +1 -1
  52. package/dist/main/services/mcp/target-manager.d.ts +35 -0
  53. package/dist/main/services/mcp/target-manager.js +63 -1
  54. package/dist/main/services/mcp/tools/context-tools.js +15 -1
  55. package/dist/main/services/module.d.ts +1 -1
  56. package/dist/main/services/network-forward/index.d.ts +190 -0
  57. package/dist/main/services/network-forward/index.js +765 -0
  58. package/dist/main/services/notifications/renderer-notifier.d.ts +11 -0
  59. package/dist/main/services/notifications/renderer-notifier.js +7 -1
  60. package/dist/main/services/render-inspect/index.d.ts +41 -0
  61. package/dist/main/services/render-inspect/index.js +88 -0
  62. package/dist/main/services/safe-area/index.d.ts +17 -0
  63. package/dist/main/services/safe-area/index.js +59 -0
  64. package/dist/main/services/service-host-pool/pool.d.ts +197 -0
  65. package/dist/main/services/service-host-pool/pool.js +364 -0
  66. package/dist/main/services/simulator/custom-apis.d.ts +34 -0
  67. package/dist/main/services/simulator/custom-apis.js +22 -0
  68. package/dist/main/services/simulator-appdata/index.d.ts +35 -0
  69. package/dist/main/services/simulator-appdata/index.js +71 -0
  70. package/dist/main/services/simulator-current-page/index.d.ts +24 -0
  71. package/dist/main/services/simulator-current-page/index.js +19 -0
  72. package/dist/main/services/simulator-storage/index.d.ts +37 -2
  73. package/dist/main/services/simulator-storage/index.js +209 -32
  74. package/dist/main/services/simulator-storage/service-storage-ops.d.ts +40 -0
  75. package/dist/main/services/simulator-storage/service-storage-ops.js +67 -0
  76. package/dist/main/services/simulator-temp-files/index.d.ts +1 -1
  77. package/dist/main/services/simulator-temp-files/index.js +39 -17
  78. package/dist/main/services/simulator-wxml/index.d.ts +29 -0
  79. package/dist/main/services/simulator-wxml/index.js +28 -0
  80. package/dist/main/services/toolbar/toolbar-store.d.ts +3 -3
  81. package/dist/main/services/toolbar/toolbar-store.js +1 -18
  82. package/dist/main/services/views/devtools-tabs.d.ts +47 -0
  83. package/dist/main/services/views/devtools-tabs.js +95 -0
  84. package/dist/main/services/views/miniapp-partition.d.ts +80 -0
  85. package/dist/main/services/views/miniapp-partition.js +138 -0
  86. package/dist/main/services/views/simulator-session-policy.d.ts +28 -0
  87. package/dist/main/services/views/simulator-session-policy.js +82 -0
  88. package/dist/main/services/views/view-manager.d.ts +125 -0
  89. package/dist/main/services/views/view-manager.js +852 -4
  90. package/dist/main/services/workbench-context.d.ts +67 -7
  91. package/dist/main/services/workbench-context.js +6 -1
  92. package/dist/main/services/workspace/workspace-service.js +7 -13
  93. package/dist/main/utils/ipc-registry.d.ts +1 -1
  94. package/dist/main/utils/ipc-registry.js +21 -4
  95. package/dist/main/utils/paths.d.ts +15 -0
  96. package/dist/main/utils/paths.js +19 -0
  97. package/dist/main/utils/sender-policy.d.ts +9 -3
  98. package/dist/main/utils/sender-policy.js +18 -4
  99. package/dist/main/utils/theme.d.ts +1 -1
  100. package/dist/main/utils/theme.js +1 -1
  101. package/dist/main/windows/main-window/create.d.ts +0 -6
  102. package/dist/main/windows/main-window/create.js +6 -80
  103. package/dist/main/windows/main-window/events.d.ts +1 -1
  104. package/dist/main/windows/main-window/events.js +1 -1
  105. package/dist/main/windows/service-host-window/create.d.ts +67 -0
  106. package/dist/main/windows/service-host-window/create.js +138 -0
  107. package/dist/native-host/common/common.js +368 -0
  108. package/dist/native-host/container/pageFrame.css +1 -0
  109. package/dist/native-host/render/render.js +9334 -0
  110. package/dist/native-host/service/service.js +6 -0
  111. package/dist/preload/index.d.ts +2 -0
  112. package/dist/preload/index.js +6 -0
  113. package/dist/preload/instrumentation/app-data.d.ts +18 -20
  114. package/dist/preload/instrumentation/app-data.js +23 -160
  115. package/dist/preload/instrumentation/wxml-extract.d.ts +1 -1
  116. package/dist/preload/instrumentation/wxml-extract.js +1 -1
  117. package/dist/preload/runtime/bridge.d.ts +3 -8
  118. package/dist/preload/runtime/bridge.js +2 -32
  119. package/dist/preload/runtime/custom-apis.js +20 -17
  120. package/dist/preload/runtime/host-toolbar-advertiser.d.ts +27 -0
  121. package/dist/preload/runtime/host-toolbar-advertiser.js +55 -0
  122. package/dist/preload/runtime/main-api-runner.d.ts +9 -0
  123. package/dist/preload/runtime/main-api-runner.js +85 -0
  124. package/dist/preload/runtime/native-host.d.ts +43 -0
  125. package/dist/preload/runtime/native-host.js +83 -0
  126. package/dist/preload/shared/expose.d.ts +10 -5
  127. package/dist/preload/shared/expose.js +30 -12
  128. package/dist/preload/shared/sid-registry.d.ts +11 -0
  129. package/dist/preload/shared/sid-registry.js +38 -0
  130. package/dist/preload/windows/host-toolbar.cjs +161 -0
  131. package/dist/preload/windows/host-toolbar.cjs.map +7 -0
  132. package/dist/preload/windows/host-toolbar.d.ts +2 -0
  133. package/dist/preload/windows/host-toolbar.js +12 -0
  134. package/dist/preload/windows/main.cjs +1935 -0
  135. package/dist/preload/windows/main.cjs.map +4 -4
  136. package/dist/preload/windows/simulator.cjs +925 -0
  137. package/dist/preload/windows/simulator.cjs.map +7 -0
  138. package/dist/preload/windows/simulator.js +244 -574
  139. package/dist/render-host/pageFrame.html +29 -0
  140. package/dist/render-host/preload.cjs +154 -0
  141. package/dist/render-host/render-inspect.js +295 -0
  142. package/dist/renderer/assets/index-CcJKzatF.js +50 -0
  143. package/dist/renderer/assets/{input-CCYS8Ave.js → input-QGx6FFX1.js} +2 -2
  144. package/dist/renderer/assets/ipc-transport-BT4QYQqu.css +1 -0
  145. package/dist/renderer/assets/{ipc-transport-Bn4KXvhu.js → ipc-transport-DvZvwK-Z.js} +2 -2
  146. package/dist/renderer/assets/{popover-CH4rwpdt.js → popover-BOH1If1J.js} +2 -2
  147. package/dist/renderer/assets/select-C7JQ8G5N.js +2 -0
  148. package/dist/renderer/assets/{settings-CMTB-t0x.js → settings-DpAbTJyF.js} +2 -2
  149. package/dist/renderer/assets/{settings-api-Csdngf9Z.js → settings-api-RD2IZF53.js} +2 -2
  150. package/dist/renderer/assets/{workbenchSettings-CODFCzOg.js → workbenchSettings-CNJX4Qna.js} +2 -2
  151. package/dist/renderer/entries/main/index.html +5 -5
  152. package/dist/renderer/entries/popover/index.html +5 -5
  153. package/dist/renderer/entries/settings/index.html +5 -5
  154. package/dist/renderer/entries/workbench-settings/index.html +4 -4
  155. package/dist/service-host/preload.cjs +254 -0
  156. package/dist/service-host/service.html +10 -0
  157. package/dist/service-host/sourcemap-rewrite.cjs +58 -0
  158. package/dist/service-host/sync-api-patch.js +20 -0
  159. package/dist/service-host/sync-impls/menu-button-geometry.js +8 -0
  160. package/dist/service-host/sync-impls/menu-button.js +16 -0
  161. package/dist/service-host/sync-impls/storage.js +50 -0
  162. package/dist/service-host/sync-impls/system-info.js +54 -0
  163. package/dist/shared/appdata-accumulator.d.ts +95 -0
  164. package/dist/shared/appdata-accumulator.js +213 -0
  165. package/dist/shared/bridge-channels.d.ts +378 -0
  166. package/dist/shared/bridge-channels.js +81 -0
  167. package/dist/shared/ipc-channels.d.ts +84 -1
  168. package/dist/shared/ipc-channels.js +90 -10
  169. package/dist/shared/ipc-schemas.d.ts +59 -2
  170. package/dist/shared/ipc-schemas.js +64 -3
  171. package/dist/shared/open-in-editor.d.ts +71 -0
  172. package/dist/shared/open-in-editor.js +138 -0
  173. package/dist/shared/simulator-api-metadata.d.ts +21 -0
  174. package/dist/shared/simulator-api-metadata.js +23 -0
  175. package/dist/shared/types.d.ts +2 -39
  176. package/dist/simulator/assets/device-shell-DsdcNEkt.css +1 -0
  177. package/dist/simulator/assets/device-shell-fH2cI-3q.js +2 -0
  178. package/dist/simulator/assets/jsx-runtime-P6ZegaOf.js +2 -0
  179. package/dist/simulator/assets/simulator-DHylZf9Z.js +10 -0
  180. package/dist/simulator/assets/simulator-mini-app-BDNu5n26.js +2 -0
  181. package/dist/simulator/device-shell/menu-button-geometry.js +8 -0
  182. package/dist/simulator/simulator.html +2 -112
  183. package/package.json +12 -12
  184. package/dist/main/utils/disposable.d.ts +0 -18
  185. package/dist/main/utils/disposable.js +0 -67
  186. package/dist/renderer/assets/index-BDMxXUfn.js +0 -50
  187. package/dist/renderer/assets/ipc-transport-Cu7tubyg.css +0 -1
  188. package/dist/renderer/assets/select-Ct4-sijm.js +0 -2
  189. package/dist/simulator/assets/simulator-B4e3c6_O.js +0 -9
package/README.md CHANGED
@@ -2,16 +2,18 @@
2
2
 
3
3
  基于 Electron 的小程序开发者工具。提供模拟器、Chrome DevTools 面板、WXML/AppData/Storage 面板、编译配置等功能。
4
4
 
5
- 下游 host 通过 [`@dimina-kit/workbench`](../workbench) `workbench(config)` fluent API 集成并定制 devtools。扩展模型设计见 [`docs/workbench-model.md`](docs/workbench-model.md)
5
+ 下游 host 通过 `launch(config)` 集成并定制 devtools(零配置直接 `launch()`,配置驱动 `launch({...})`;见下方「两种用法」)。两种用法都经领域中立的 [`@dimina-kit/electron-deck`](../electron-deck) 框架编排——框架接管 Electron 进程生命周期(whenReady / will-quit)、wire/trust 原语,devtools 作为 `RuntimeBackend` 注入完整运行时(见 [`framework-extraction-v2.md`](../electron-deck/docs/framework-extraction-v2.md))。
6
6
 
7
7
  ---
8
8
 
9
- ## 两种接入方式
9
+ ## 两种用法
10
10
 
11
- | 级别 | 入口 | 控制力 | 适合场景 |
11
+ 单一入口 `launch(config?)`——不传配置即零配置直接运行,传 `WorkbenchAppConfig` 即配置驱动定制。
12
+
13
+ | 用法 | 调用 | 控制力 | 适合场景 |
12
14
  | ------------ | ---------------------- | --------------------- | -------------- |
13
15
  | **零配置** | `launch()` | 无 | 直接运行 |
14
- | **配置驱动** | `createWorkbenchApp()` | 配置 Provider + 扩展点 | 品牌化、深度定制 |
16
+ | **配置驱动** | `launch({...})` | 配置 Provider + 扩展点 | 品牌化、深度定制 |
15
17
 
16
18
  ### 零配置
17
19
 
@@ -22,17 +24,17 @@ launch()
22
24
 
23
25
  ### 配置驱动
24
26
 
25
- 扩展点分两类:**配置 Provider**(构造期、一对一,替换某个内置能力)走 `createWorkbenchApp` 配置字段;**Contribution**(`onSetup` 期、一对多,添加多个同类条目)走 `onSetup(instance)` 上的 typed 方法。所有 Contribution 都 per-context,随 context 自动销毁。
27
+ 扩展点分两类:**配置 Provider**(构造期、一对一,替换某个内置能力)走 `launch` 配置字段;**Contribution**(`onSetup` 期、一对多,添加多个同类条目)走 `onSetup(instance)` 上的 typed 方法。所有 Contribution 都 per-context,随 context 自动销毁。
26
28
 
27
29
  ```typescript
28
30
  import { suppressEpipe } from '@dimina-kit/devtools/bootstrap'
29
- import { createWorkbenchApp } from '@dimina-kit/devtools/app'
31
+ import { launch } from '@dimina-kit/devtools'
30
32
  import { rendererDir } from '@dimina-kit/devtools/paths'
31
33
  import { Menu } from 'electron'
32
34
 
33
35
  suppressEpipe()
34
36
 
35
- createWorkbenchApp({
37
+ launch({
36
38
  // ── 配置 Provider(构造期,一对一)──
37
39
  appName: '我的开发工具',
38
40
  adapter: myAdapter,
@@ -53,14 +55,10 @@ createWorkbenchApp({
53
55
  instance.registerSimulatorApi('login', (params) => myLogin(params))
54
56
 
55
57
  // 工具栏:整表替换,随 host 状态(如登录态)重算时再 set 一次
56
- const refreshToolbar = () => {
57
- const currentUser = getCurrentUser()
58
- instance.toolbar.set([
59
- { id: 'account', label: '当前用户', kind: 'avatar', placement: 'leading', displayInitial: currentUser?.name, avatarUrl: currentUser?.avatar, handler: () => showAccount() },
60
- { id: 'preview', label: '预览', placement: 'primary', handler: () => preview() },
61
- { id: 'deploy', label: '发布', placement: 'trailing', handler: () => deploy() },
62
- ])
63
- }
58
+ const refreshToolbar = () => instance.toolbar.set([
59
+ { id: 'deploy', label: '发布', handler: () => deploy() },
60
+ { id: 'preview', label: '预览', handler: () => preview() },
61
+ ])
64
62
  refreshToolbar()
65
63
 
66
64
  // 自定义 IPC:经 gated 的 IpcRegistry,不再裸 ipcMain.handle
@@ -70,16 +68,10 @@ createWorkbenchApp({
70
68
  // const win = createDialogWindow(/* ... */)
71
69
  // instance.registerTrustedWindow(win)
72
70
  },
73
- onBeforeOpenProject: async ({ projectPath, instance }) => {
74
- const ok = await canOpenProject(projectPath)
75
- return ok
76
- ? { allow: true }
77
- : { allow: false, reason: '当前账号没有项目权限' }
78
- },
79
71
  onBeforeClose: ({ context }) => {
80
72
  // 窗口关闭前的自定义清理;session 关闭和 view 销毁由框架自动处理
81
73
  },
82
- }).start()
74
+ })
83
75
  ```
84
76
 
85
77
  > Contribution 注册物全部自动进 `context.registry`,host 无需手写 cleanup。devtools 内部仍用 `WorkbenchModule` 组织内置 IPC 模块,但这是实现细节,不再作为对外接入方式导出。
@@ -98,7 +90,7 @@ src/
98
90
  api.ts # 公共 API 聚合入口(package main)
99
91
  app/
100
92
  launch.ts # 零配置入口
101
- app.ts # createWorkbenchApp 工厂
93
+ app.ts # createDevtoolsRuntime 装配体 + runDevtoolsBootstrap
102
94
  bootstrap.ts # suppressEpipe / setupCdpPort
103
95
  lifecycle.ts # Electron app 生命周期注册
104
96
  ipc/ # 只做 handler 注册,不写业务
@@ -128,8 +120,7 @@ src/
128
120
  default-adapter.ts # 默认 CompilationAdapter
129
121
  menu/ # 应用菜单
130
122
  utils/
131
- paths.ts # rendererDir / defaultPreloadPath / simulatorDir
132
- disposable.ts # DisposableRegistry + AggregateError 聚合
123
+ paths.ts # rendererDir / defaultPreloadPath / simulatorDir / cjsSiblingPreloadPath
133
124
  ipc-registry.ts # ipcMain.handle 包装 + SenderPolicy 闸门
134
125
  sender-policy.ts # sender webContents id 白名单
135
126
  ipc-schema.ts # zod schema 校验工具
@@ -141,7 +132,7 @@ src/
141
132
  preload/ # 按注入目标分
142
133
  windows/ # contextBridge 类型 preload
143
134
  main.ts # workbench 三窗口 preload,仅暴露 window.devtools.ipc
144
- simulator.ts # simulator webview 的默认 preload
135
+ simulator.ts # simulator(WCV)frame preload(native-host 跑其 .cjs sibling)
145
136
  shared/ # preload 之间共享
146
137
  api-compat.ts # setupApiCompatHook
147
138
  constants.ts
@@ -150,7 +141,6 @@ src/
150
141
  console.ts # 控制台拦截
151
142
  app-data.ts # Worker setData 拦截 → createAppDataSource
152
143
  wxml.ts # Vue 组件树提取 → createWxmlSource
153
- disposable.ts # instrumentation 共用的清理工具
154
144
  miniapp-snapshot/ # 面板数据统一快照框架(docs/miniapp-snapshot.md)
155
145
  types.ts # MiniappSnapshotSource / SnapshotEnvelope
156
146
  host.ts # createMiniappSnapshotHost → push/pull/__miniappSnapshot
@@ -191,21 +181,21 @@ src/
191
181
 
192
182
  ### WorkbenchConfig
193
183
 
194
- `launch()` 和 `createWorkbenchApp()` 共用:
184
+ `launch()` 接受的基础字段(`WorkbenchConfig`):
195
185
 
196
186
  | 字段 | 类型 | 默认值 | 说明 |
197
187
  | ------------------ | -------------------- | ------------------- | ---------------------------------- |
198
188
  | `appName` | `string` | `'Dimina DevTools'` | 窗口标题 |
199
189
  | `adapter` | `CompilationAdapter` | 内置 | 项目编译适配器 |
200
190
  | `panels` | `BuiltinPanelId[]` | 全部四个 | 显示哪些内置面板 |
201
- | `preloadPath` | `string` | 内置 | 自定义 preload 脚本路径 |
191
+ | `preloadPath` | `string` | 内置 | 统一的 host 级 preload 入口;native-host simulator(WCV)自动跑其 `.cjs` sibling(`cjsSiblingPreloadPath`) |
202
192
  | `apiNamespaces` | `string[]` | `[]` | 自定义 API 命名空间(如 `['qd']`) |
203
193
  | `brandingProvider` | `() => { appName }` | — | 品牌信息 provider |
204
194
  | `headerHeight` | `number` | `40` | 头部栏高度(px),同步下发 main + renderer |
205
195
 
206
196
  ### WorkbenchAppConfig(扩展 WorkbenchConfig)
207
197
 
208
- `createWorkbenchApp()` 额外支持:
198
+ `launch()` 完整接受的 `WorkbenchAppConfig` 额外支持:
209
199
 
210
200
  | 字段 | 类型 | 默认值 | 说明 |
211
201
  | --------------- | ------------------------------------------- | ----------- | ------------------------------------------------- |
@@ -213,9 +203,8 @@ src/
213
203
  | `rendererDir` | `string` | 内置 | 自定义 renderer HTML 目录 |
214
204
  | `icon` | `string` | — | 窗口/任务栏图标路径(macOS 使用 app bundle 图标) |
215
205
  | `menuBuilder` | `(mainWindow, menuContext: MenuContext) => void` | 内置菜单 | 自定义菜单构建器;`menuContext` 为收窄后的 `MenuContext`,不含 `registry`/`senderPolicy` 等内部管线 |
216
- | `onSetup` | `(instance) => void \| Promise<void>` | — | 窗口和 context 创建后的回调,用于注册 Contribution(见下文)|
217
- | `onBeforeOpenProject` | `({ projectPath, instance }) => BeforeOpenProjectResult \| Promise<BeforeOpenProjectResult>` | — | 项目目录校验通过后、关闭当前 session 和编译新项目之前的宿主准入钩子 |
218
- | `onBeforeClose` | `(instance) => void \| Promise<void>` | — | 窗口关闭前的回调,session 关闭由框架自动处理 |
206
+ | `onSetup` | `(instance) => void` | — | 窗口和 context 创建后的回调,用于注册 Contribution(见下文)|
207
+ | `onBeforeClose` | `(instance) => void` | — | 窗口关闭前的回调,session 关闭由框架自动处理 |
219
208
  | `window` | `WorkbenchWindowConfig` | — | 窗口尺寸覆盖 |
220
209
  | `updateChecker` | `UpdateChecker` | — | 自定义更新检查器;提供后启用"检查更新"功能 |
221
210
  | `updateOptions` | `{ checkInterval?, initialDelay?, getCurrentVersion? }` | — | 仅当 `updateChecker` 提供时生效,默认 1h / 5s |
@@ -231,8 +220,6 @@ src/
231
220
  | `instance.ipc` | `IpcRegistry` 实例,`instance.ipc.handle(channel, fn)` 注册自定义 IPC;已绑定 `senderPolicy` 网关 |
232
221
  | `instance.registerTrustedWindow(win)` | 把 host 自有弹窗 `BrowserWindow` 加入受信 sender 集,否则其发起的 `instance.ipc` 调用会被网关拒绝。窗口关闭即移除 |
233
222
 
234
- `onSetup` 可以返回 Promise;`createWorkbenchApp().start()` 会等待 `onSetup` 解析完成后才继续后续启动流程,因此宿主在 `onSetup` 内注册的 simulator API 会早于 simulator `<webview>` 首次枚举自定义 API。
235
-
236
223
  ### 内置面板 ID
237
224
 
238
225
  `'wxml'` \| `'console'` \| `'appdata'` \| `'storage'`
@@ -245,7 +232,7 @@ src/
245
232
 
246
233
  ## Embedding & Extending the Project Panel
247
234
 
248
- 宿主(如 qdmp)通过 `createWorkbenchApp({...})` 嵌入 devtools 时,可对项目面板做三个正交扩展:
235
+ 宿主(如 qdmp)通过 `launch({...})` 嵌入 devtools 时,可对项目面板做三个正交扩展:
249
236
 
250
237
  | 扩展点 | 用途 |
251
238
  | --- | --- |
@@ -264,7 +251,7 @@ src/
264
251
  ### 最小示例
265
252
 
266
253
  ```typescript
267
- import { createWorkbenchApp } from '@dimina-kit/devtools/app'
254
+ import { launch } from '@dimina-kit/devtools'
268
255
  import type { ProjectsProvider, ProjectTemplate } from '@dimina-kit/devtools/projects-provider'
269
256
  import { BrowserWindow } from 'electron'
270
257
 
@@ -306,7 +293,7 @@ const qdmpBlank: ProjectTemplate = {
306
293
  source: { type: 'directory', path: '/abs/path/to/template' },
307
294
  }
308
295
 
309
- createWorkbenchApp({
296
+ launch({
310
297
  projectsProvider: provider,
311
298
  projectTemplates: [qdmpBlank],
312
299
  builtinTemplates: ['taro-todo'], // 只保留 taro-todo,干掉默认 blank
@@ -325,7 +312,7 @@ createWorkbenchApp({
325
312
  win.on('closed', () => resolve(null))
326
313
  })
327
314
  },
328
- }).start()
315
+ })
329
316
  ```
330
317
 
331
318
  ### `customCreateProjectDialog` 返回值
@@ -389,13 +376,13 @@ const myAdapter: CompilationAdapter = {
389
376
 
390
377
  ## Preload Instrumentation
391
378
 
392
- 模拟器 webview 注入 preload 脚本,在 webview 全局上安装两类东西:**桥接**(把数据通道暴露到 webview)+ **instrumentation**(监听运行时事件并写入桥接)。内置 preload 见 `src/preload/windows/simulator.ts`。
379
+ 模拟器 frame 注入 preload 脚本,在其全局上安装两类东西:**桥接**(把数据通道暴露到运行时全局)+ **instrumentation**(监听运行时事件并写入桥接)。内置 preload 见 `src/preload/windows/simulator.ts`(native-host simulator 跑其 `.cjs` sibling)。
393
380
 
394
381
  ### 必装:桥接
395
382
 
396
383
  | 函数 | 作用 | 不装会怎样 |
397
384
  | --- | --- | --- |
398
- | `installSimulatorBridge()` | 暴露 `window.__simulatorData`,承载 `highlightElement` / `unhighlightElement` / `getAppdata` / `getWxml` / `getStorageSnapshot` 等只读 API(供主进程 `executeJavaScript` 拉取) | 元素选区 overlay 不显示;automation `Page.getData` 返回空对象;MCP `simulator_get_overview` 在 hints 中追加 `simulator bridge not ready (window.__simulatorData missing)`。注:Storage 面板走主进程 CDP,不受影响;Console/AppData/WXML 推送走 `sendToHost`,也不受影响 |
385
+ | `installSimulatorBridge()` | 暴露 `window.__simulatorData`,承载 `highlightElement` / `unhighlightElement` / `getAppdata` / `getWxml` / `getStorageSnapshot` 等只读 API(供主进程 `executeJavaScript` 拉取) | 元素选区 overlay 不显示;automation `Page.getData` 返回空对象;MCP `simulator_get_overview` 在 hints 中追加 `simulator bridge not ready (window.__simulatorData missing)`。注:三个右侧面板的数据都另有来源(Storage 走主进程 CDPAppData/WXML 走主进程 `SimulatorAppDataChannel` / `SimulatorWxmlChannel`;Console 走 render-host/service-host guest preload → 主进程 `consoleLog`),均不依赖 `window.__simulatorData`,不受影响 |
399
386
  | `installCustomApisBridge()` | 暴露 `window.__diminaCustomApis`,承载 `list` / `invoke`,让模拟器侧把主进程注册的 API 代理回小程序 runtime | `registerSimulatorApi` 注册的业务 API 在小程序里调用全部 no-op(参见下方 "Simulator 自定义 API") |
400
387
  | `setupApiCompatHook()` | 兼容上游 API 名称变更 | 部分 API 调用兼容性问题 |
401
388
 
@@ -403,14 +390,16 @@ const myAdapter: CompilationAdapter = {
403
390
 
404
391
  ### 按需:instrumentation
405
392
 
406
- Console 是独立 instrumentation;AppData 与 WXML 已迁移到 **miniappSnapshot** 框架——各自实现一个 `MiniappSnapshotSource`,由 `MiniappSnapshotHost` 统一负责推送 / 拉取 / reload 重同步(详见 `docs/miniapp-snapshot.md`)。
393
+ 这些探针是**可组合的 preload API**:`@dimina-kit/devtools/preload` 把它们导出,供下游自己拼装自定义 preload。下表是各探针自身的契约(捕获什么 + 推到哪个通道)。
407
394
 
408
395
  | 探针 | 捕获内容 | 数据通道 |
409
396
  | --- | --- | --- |
410
- | `installConsoleInstrumentation()` | `console.*`、`window.onerror`、未捕获 rejection | `sendToHost` |
397
+ | `installConsoleInstrumentation()` | `console.*`、`window.onerror`、未捕获 rejection | `sendToHost`(guest → embedder) |
411
398
  | `createAppDataSource()` | Worker `ub` 消息、setData / page init | miniappSnapshot 框架(`miniapp-snapshot:push`) |
412
399
  | `createWxmlSource()` | Vue 组件树提取、MutationObserver 自动更新 | miniappSnapshot 框架(`miniapp-snapshot:push`) |
413
400
 
401
+ > ⚠️ **内置 native-host 运行时并不靠这条 `miniapp-snapshot:push` 通道喂面板**:右侧 WXML / AppData 面板的数据由主进程服务(`SimulatorWxmlChannel` / `SimulatorAppDataChannel`)直接供给(见下方「数据流」)。内置 simulator preload 仍调用 `createAppDataSource().start()`,但只为副作用(填 `window.__simulatorData.getAppdata()` 供 automation / MCP 读取),并**不**把它 wrap 进 `MiniappSnapshotHost`——所以 `miniapp-snapshot:push` 在内置路径下无消费者。该框架契约(含 `createWxmlSource`)仍为外部/组合式 preload 保留导出(详见 `docs/miniapp-snapshot.md`)。
402
+
414
403
  > Storage 面板的数据由主进程通过 CDP `DOMStorage` 域抓取(`src/main/services/simulator-storage`),**不需要 preload 侧 instrumentation**。
415
404
 
416
405
  各面板的数据流详见下方 "数据流" 章节。
@@ -476,7 +465,7 @@ launch({ preloadPath: '/absolute/path/to/my-preload.js' })
476
465
  | `wx.getStorage(...)` 覆盖内置 | `'getStorage'`(小心:这会**屏蔽** dimina 容器的实现) |
477
466
 
478
467
  ```typescript
479
- createWorkbenchApp({
468
+ launch({
480
469
  onSetup: (instance) => {
481
470
  // 提供 wx.login 的实现(dimina 容器默认未实现,注册后才能用)
482
471
  const dispose = instance.registerSimulatorApi('login', async ({ success }) => {
@@ -508,13 +497,12 @@ createWorkbenchApp({
508
497
  `@dimina-kit/devtools` 的公共入口。`api.ts`(根入口)聚合了所有公共 API,优先从根入口导入。
509
498
 
510
499
  ```
511
- @dimina-kit/devtools launch, createWorkbenchApp, buildDefaultMenu,
500
+ @dimina-kit/devtools launch, buildDefaultMenu,
512
501
  openSettingsWindow, suppressEpipe, setupCdpPort,
513
502
  createWorkbenchContext, createMainWindow,
514
503
  createViewManager, IpcRegistry,
515
504
  UpdateManager, createGitHubReleaseChecker, ...
516
505
  @dimina-kit/devtools/launch launch(config?), buildDefaultMenu, openSettingsWindow
517
- @dimina-kit/devtools/app createWorkbenchApp(config?)
518
506
  @dimina-kit/devtools/types TypeScript 类型定义
519
507
  @dimina-kit/devtools/bootstrap suppressEpipe(), setupCdpPort()
520
508
  @dimina-kit/devtools/context createWorkbenchContext(opts),
@@ -587,21 +575,23 @@ interface WorkbenchContext {
587
575
  flowchart TB
588
576
  subgraph BW["BrowserWindow"]
589
577
  direction TB
590
- Z3["⑤ popoverView &nbsp;[z=3,顶层]<br/>entries/popover/index.html<br/>全屏透明遮罩 + 编译配置表单"]
591
- Z2["④ settingsView &nbsp;[z=2]<br/>entries/settings/index.html<br/>固定宽度 320px,右侧对齐"]
592
- Z1["② simulatorView &nbsp;[z=1]<br/>Chrome DevTools 面板"]
593
- subgraph Z0["① mainWindow &nbsp;[z=0,底层]&nbsp;entries/main/index.html"]
578
+ Z4["⑤ popoverView &nbsp;[顶层]<br/>entries/popover/index.html<br/>全屏透明遮罩 + 编译配置表单"]
579
+ Z3["④ settingsView<br/>entries/settings/index.html<br/>固定宽度 320px,右侧对齐"]
580
+ Z2["② simulatorView<br/>Chrome DevTools 面板(绑到活跃 render-host guest / service host)"]
581
+ Z1["① nativeSimulatorView : WebContentsView<br/>模拟器主进程顶层 WCV(跑 simulator/main.tsx 的 DeviceShell)<br/>partition=persist:simulator,托管每页 render-host &lt;webview&gt; guest"]
582
+ subgraph Z0["⓪ mainWindow &nbsp;[底层]&nbsp;entries/main/index.html"]
594
583
  direction LR
595
- SIM["模拟器 &lt;webview&gt;<br/>拖拽分割线"]
584
+ SIM["&lt;SimulatorPanel&gt; 占位 / 锚点<br/>(仅 nativeSimulatorView 的 bounds target,无 webview)"]
596
585
  PNL["WXML / AppData / Storage<br/>React 中直接渲染"]
597
586
  end
587
+ Z4 -. 覆盖 .-> Z3
598
588
  Z3 -. 覆盖 .-> Z2
599
589
  Z2 -. 覆盖 .-> Z1
600
590
  Z1 -. 覆盖 .-> Z0
601
591
  end
602
592
  ```
603
593
 
604
- 层级由 `addChildView()` 调用顺序决定,后添加的 View 在上层。内置面板(WXML / AppData / Storage)不使用独立 WebContentsView,直接在主窗口 React 中渲染;只有 Chrome DevTools / settings / popover 需要 View 覆盖。
594
+ 层级由 `addChildView()` 调用顺序决定,后添加的 View 在上层。overlay 栈里有**两个不同的** simulator 相关 view:`nativeSimulatorView`(模拟器本体,主进程顶层 `WebContentsView`,跑 `simulator/main.tsx` 的 DeviceShell,内部托管每页 render-host `<webview>` guest)和 `simulatorView`(Chrome DevTools 面板本身,绑到活跃 render-host guest / service host)。模拟器**不是** mainWindow renderer 里的 `<webview>`——主 renderer 的 `<SimulatorPanel>` 只画一个空占位 div 当 `nativeSimulatorView` 的 bounds 锚点(手机框 / 圆角 / 刘海 / 页面 `<webview>` 都在那个 WCV 内部的 DeviceShell 里)。内置面板(WXML / AppData / Storage)不使用独立 WebContentsView,直接在主窗口 React 中渲染;只有 nativeSimulator / Chrome DevTools / settings / popover 需要 View 覆盖。
605
595
 
606
596
  ### 数据流
607
597
 
@@ -609,10 +599,10 @@ flowchart TB
609
599
 
610
600
  | 面板 / 场景 | 模式 | 路径 |
611
601
  | --- | --- | --- |
612
- | Console | 推送 | `installConsoleInstrumentation` `runtime/host.ts:sendToHost` → webview `ipcRenderer.sendToHost` 推到宿主renderer 监听 `ipc-message` |
613
- | AppData / WXML 树 | 推送 + 拉取 | **miniappSnapshot 框架**:preload `MiniappSnapshotHost` 经 `miniapp-snapshot:push` 推全量快照,renderer `useMiniappSnapshot` 整份投影;面板「刷新」走 `miniapp-snapshot:pull`(详见 `docs/miniapp-snapshot.md`) |
602
+ | Console | 推送 | render-host / service-host preload monkeypatch `console.*`主进程 `consoleLog` 容器消息bridge-router `ctx.guestConsole.emit` → `services/console-forward`。render(视图)层条目以 `[视图]` 前缀注入挂在 service host 上的 Chrome DevTools,service 层本就原生显示在同一面板;automation WS 等外部订阅者也从这里 fan-out |
603
+ | AppData / WXML 树 | 推送 + 拉取 | 主进程服务,镜像 Storage 的 main→renderer 契约:WXML 由 `services/simulator-wxml` 经 render-inspect 从活跃 render-host `<webview>` guest 拉树(`SimulatorWxmlChannel.GetSnapshot`),render 活动时推 `SimulatorWxmlChannel.Event`;AppData `services/simulator-appdata` bridge-router 里 tap service→render 的 setData 流,推 `SimulatorAppDataChannel.Event` |
614
604
  | Storage | 拉取 + 推送 | renderer `ipcInvoke(SimulatorStorageChannel.GetSnapshot)` → 主进程 CDP `DOMStorage` 域;变更事件由主进程通过 `SimulatorStorageChannel.Event` 推回 renderer |
615
- | 元素选区 / `Page.getData` / MCP overview | 拉取 | 主进程 `webContents.executeJavaScript(...)` 或 `Runtime.evaluate(...)` 读 `window.__simulatorData.*`(由 `installSimulatorBridge` 暴露);面板快照亦可经 `window.__miniappSnapshot.get(id)` 同步读取(由 `MiniappSnapshotHost` 暴露) |
605
+ | 元素选区 / `Page.getData` / MCP overview | 拉取 | 主进程 `webContents.executeJavaScript(...)` 或 `Runtime.evaluate(...)` 读 `window.__simulatorData.*`(由 `installSimulatorBridge` 暴露) |
616
606
 
617
607
  > `src/main/ipc/panels.ts` 暴露 `panel:eval` handler 供外部 host 自定义面板复用,内置 renderer 不消费它。
618
608
 
@@ -630,14 +620,14 @@ Electron 对 `chrome.devtools.panels.create()` 的支持**长期不稳定**。
630
620
 
631
621
  **影响范围**:从 Electron 7 到 39 均有报告([#23662](https://github.com/electron/electron/issues/23662)、[#41613](https://github.com/electron/electron/issues/41613)、[#48705](https://github.com/electron/electron/issues/48705)),非特定版本 bug,而是系统性实现缺陷。官方文档声称完全支持,但实际因竞态条件和实现不完整导致面板无法可靠渲染。Electron 团队无修复计划。
632
622
 
633
- **当前方案**:内置面板(WXML / AppData / Storage)直接在主窗口 React 中渲染,通过 `panel:eval` IPC 调用 `webContents.executeJavaScript()` simulator 拉取数据;Chrome DevTools 仍作为独立 `WebContentsView` 通过 `setDevToolsWebContents()` 挂载。面板切换由 renderer toolbar 的 tab 栏控制,主进程负责 simulator/settings/popover View 的创建、定位和显隐。详见 `src/main/ipc/panels.ts` 和 `src/main/ipc/simulator.ts`。
623
+ **当前方案**:内置面板(WXML / AppData / Storage)直接在主窗口 React 中渲染,数据由主进程服务直接供给——WXML / AppData 走 `SimulatorWxmlChannel` / `SimulatorAppDataChannel`(main → renderer 的 seed `GetSnapshot` + push `Event`),Storage 走 CDP `DOMStorage` 域(详见上方「数据流」);Chrome DevTools 仍作为独立 `WebContentsView` 通过 `setDevToolsWebContents()` 挂载。面板切换由 renderer toolbar 的 tab 栏控制,主进程负责 nativeSimulator/settings/popover View 的创建、定位和显隐。详见 `src/main/ipc/panels.ts` 和 `src/main/ipc/simulator.ts`。
634
624
 
635
625
  ---
636
626
 
637
627
  ## 调试
638
628
 
639
629
  - **Cmd+Shift+I** / **Ctrl+Shift+I** — 打开 mainWindow 的 Electron DevTools(调试 React 渲染层)
640
- - 模拟器 webview 的 Chrome DevTools 在编译完成、`dom-ready` 后自动打开
630
+ - 模拟器活跃 render-host `<webview>` guest 的 Chrome DevTools 在编译完成、`dom-ready` 后自动打开
641
631
  - 开发模式(`!app.isPackaged`)下 mainWindow DevTools 自动以 detach 模式打开
642
632
 
643
633
  ---
@@ -661,7 +651,7 @@ pnpm test # 运行测试
661
651
  本工具仅用于本地开发调试。当前的安全配置:
662
652
 
663
653
  - **Workbench 窗口**(main / settings / popover overlay)均启用 `contextIsolation` 并禁用 `nodeIntegration`;renderer 通过 main preload 经 `contextBridge` 拿到 `window.devtools.ipc`,每个 IPC handler 经 sender whitelist 校验调用方
664
- - **Simulator 加载的小程序代码** 运行在独立 `<webview>` 中(`partition='persist:simulator'`、`nodeIntegration=false`),preload 由 `session.registerPreloadScript` session 层固定,渲染进程无法替换
654
+ - **Simulator 本体** 是主进程顶层 `WebContentsView`(`nativeSimulatorView`,`partition='persist:simulator'`、`nodeIntegration=false`),其 preload 由 `webPreferences.preload = cjsSiblingPreloadPath(ctx.preloadPath)` 在创建时(`attachNativeSimulator`)固定;session 层的 `configureSimulatorSession()` 只设 Referer/CORS 头,不注册 frame preload。**小程序的每页代码** 运行在该 WCV 内部 DeviceShell 托管的 render-host `<webview>` guest 里(同 `persist:simulator` partition、`nodeIntegration=false`),承载逐页沙箱;guest 的 contextIsolation/sandbox 由主进程 `will-attach-webview` 钉死,渲染进程无法替换
665
655
  - **renderer 入口** 启用了保守 CSP;`will-navigate` / `setWindowOpenHandler` 屏蔽外部跳转
666
656
 
667
657
  仍然不要在 devtools 窗口中加载不受信任的远程内容;本工具不打算在非本地环境部署。
@@ -670,6 +660,6 @@ pnpm test # 运行测试
670
660
 
671
661
  内置的 MCP server 默认关闭,由 `startMcpServer` 入口显式启动,或通过 workbench 设置中的 `mcp.enabled` 开启。开启后会在本机监听 SSE 端点,向任何可以连接到该端点的 MCP 客户端暴露一组工具,能力包括:读取 DOM 结构、截屏、拉取网络日志、触发导航等。
672
662
 
673
- `workbench_evaluate` 已从 MCP 工具集中移除,workbench 只暴露只读诊断工具(截屏、console 日志、DOM、网络日志等)。`simulator_evaluate` 仍然保留,但 simulator 使用 `<webview>`、`nodeIntegration=false`,其 `evaluate` 仅在页面 JS 上下文执行,不具备 Node API 访问能力。
663
+ `workbench_evaluate` 已从 MCP 工具集中移除,workbench 只暴露只读诊断工具(截屏、console 日志、DOM、网络日志等)。`simulator_evaluate` 仍然保留,但小程序页面跑在 render-host `<webview>` guest 里(`nodeIntegration=false`),其 `evaluate` 仅在页面 JS 上下文执行,不具备 Node API 访问能力。
674
664
 
675
665
  仅在连接到可信的本机 MCP 客户端或被信任的 AI 工具时启用该功能;不要在公共 WiFi、共享机器或存在远程 SSH 端口转发的场景下开启,以免监听端口被非预期的客户端访问。
@@ -1,5 +1,4 @@
1
1
  export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
2
- export { createWorkbenchApp } from './app/app.js';
3
2
  export type { WorkbenchAppInstance } from './app/app.js';
4
3
  export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
5
4
  export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
@@ -15,5 +14,5 @@ export { IpcRegistry } from './utils/ipc-registry.js';
15
14
  export type { SenderPolicy } from './utils/ipc-registry.js';
16
15
  export { UpdateManager, createGitHubReleaseChecker } from './services/update/index.js';
17
16
  export type { UpdateManagerOptions, GitHubReleaseCheckerOptions, PickAssetContext, VersionScheme, } from './services/update/index.js';
18
- export type { BeforeOpenProjectHook, BeforeOpenProjectResult, WorkbenchConfig, WorkbenchAppConfig, CompilationAdapter, ProjectSession, ToolbarAction, ToolbarActionInput, ToolbarActionKind, ToolbarActionPlacement, BuiltinPanelId, BuiltinModuleId, UpdateChecker, UpdateInfo, } from '../shared/types.js';
17
+ export type { WorkbenchConfig, WorkbenchAppConfig, CompilationAdapter, ProjectSession, ToolbarAction, BuiltinPanelId, BuiltinModuleId, UpdateChecker, UpdateInfo, } from '../shared/types.js';
19
18
  //# sourceMappingURL=api.d.ts.map
package/dist/main/api.js CHANGED
@@ -1,6 +1,10 @@
1
1
  // ── Primary API ──────────────────────────────────────────────────────────
2
+ // `launch` boots through the @dimina-kit/electron-deck framework
3
+ // (process-lifecycle gate + wire/trust) with the devtools RuntimeBackend
4
+ // supplying the full runtime. The instance builder (`createDevtoolsRuntime`) is
5
+ // internal — hosts integrate via `launch(config)`; the `WorkbenchAppInstance`
6
+ // type (what `onSetup(instance)` receives) is re-exported for typing host callbacks.
2
7
  export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
3
- export { createWorkbenchApp } from './app/app.js';
4
8
  // ── Bootstrap utilities ──────────────────────────────────────────────────
5
9
  export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
6
10
  // ── Context & views (for module-assembly consumers) ──────────────────────
@@ -4,7 +4,7 @@ import type { SimulatorApiHandler } from '../services/simulator/custom-apis.js';
4
4
  import { type WorkbenchContext } from '../services/workbench-context.js';
5
5
  import { type AutomationServer } from '../services/automation/index.js';
6
6
  import { UpdateManager } from '../services/update/index.js';
7
- import { type Disposable } from '../utils/disposable.js';
7
+ import { type Disposable } from '@dimina-kit/electron-deck/main';
8
8
  import { IpcRegistry } from '../utils/ipc-registry.js';
9
9
  export interface WorkbenchAppInstance {
10
10
  mainWindow: BrowserWindow;
@@ -23,8 +23,18 @@ export interface WorkbenchAppInstance {
23
23
  updateManager?: UpdateManager;
24
24
  dispose: () => Promise<void>;
25
25
  }
26
- export declare function createWorkbenchApp(config?: WorkbenchAppConfig): {
27
- setup: () => Promise<WorkbenchAppInstance>;
28
- start: () => Promise<void>;
29
- };
26
+ /**
27
+ * Pre-ready bootstrap side effects (app name, CDP port, CSP suppression,
28
+ * privileged scheme). MUST run before `app.whenReady()`. Extracted so the `RuntimeBackend.beforeReady` hook (which launch()
29
+ * routes through) runs it before the framework awaits app.whenReady().
30
+ */
31
+ export declare function runDevtoolsBootstrap(config?: WorkbenchAppConfig): void;
32
+ /**
33
+ * Domain runtime assembly — the post-whenReady body. Builds the main window +
34
+ * context, registers IPC modules, stands up simulator/storage/CDP/native-host
35
+ * services, and returns the fat {@link WorkbenchAppInstance}. Extracted so the
36
+ * v2 `RuntimeBackend.assemble` reuses the exact same body (parity by shared
37
+ * implementation, not behavioural re-creation).
38
+ */
39
+ export declare function createDevtoolsRuntime(config?: WorkbenchAppConfig): Promise<WorkbenchAppInstance>;
30
40
  //# sourceMappingURL=app.d.ts.map