@dimina-kit/devtools 0.3.2-dev.20260611060732 → 0.3.2-dev.20260611135124

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 (83) hide show
  1. package/README.md +51 -25
  2. package/dist/main/api.d.ts +4 -2
  3. package/dist/main/api.js +5 -1
  4. package/dist/main/app/app.d.ts +1 -5
  5. package/dist/main/app/app.js +4 -16
  6. package/dist/main/index.bundle.js +233 -366
  7. package/dist/main/ipc/app.d.ts +1 -1
  8. package/dist/main/ipc/app.js +0 -7
  9. package/dist/main/ipc/index.d.ts +0 -2
  10. package/dist/main/ipc/index.js +0 -2
  11. package/dist/main/ipc/settings.d.ts +1 -1
  12. package/dist/main/ipc/settings.js +1 -13
  13. package/dist/main/ipc/simulator-module.d.ts +3 -3
  14. package/dist/main/ipc/simulator-module.js +3 -7
  15. package/dist/main/ipc/simulator.js +1 -12
  16. package/dist/main/runtime/miniapp-runtime.d.ts +138 -28
  17. package/dist/main/runtime/miniapp-runtime.js +6 -11
  18. package/dist/main/services/layout/index.d.ts +0 -11
  19. package/dist/main/services/layout/index.js +0 -23
  20. package/dist/main/services/notifications/renderer-notifier.d.ts +0 -6
  21. package/dist/main/services/notifications/renderer-notifier.js +1 -10
  22. package/dist/main/services/service-host-pool/pool.d.ts +5 -4
  23. package/dist/main/services/views/host-toolbar-port-channel.d.ts +93 -0
  24. package/dist/main/services/views/host-toolbar-port-channel.js +169 -0
  25. package/dist/main/services/views/host-toolbar-session-runtime.d.ts +35 -0
  26. package/dist/main/services/views/host-toolbar-session-runtime.js +55 -0
  27. package/dist/main/services/views/view-manager.d.ts +68 -39
  28. package/dist/main/services/views/view-manager.js +143 -182
  29. package/dist/main/services/workbench-context.d.ts +5 -20
  30. package/dist/main/services/workbench-context.js +0 -14
  31. package/dist/main/utils/paths.d.ts +11 -2
  32. package/dist/main/utils/paths.js +11 -2
  33. package/dist/preload/index.d.ts +15 -0
  34. package/dist/preload/index.js +15 -0
  35. package/dist/preload/runtime/host-toolbar-port.d.ts +44 -0
  36. package/dist/preload/runtime/host-toolbar-port.js +127 -0
  37. package/dist/preload/runtime/host-toolbar-runtime.d.ts +41 -0
  38. package/dist/preload/runtime/host-toolbar-runtime.js +49 -0
  39. package/dist/preload/windows/{host-toolbar.cjs → host-toolbar-runtime.cjs} +94 -3
  40. package/dist/preload/windows/host-toolbar-runtime.cjs.map +7 -0
  41. package/dist/preload/windows/host-toolbar-runtime.d.ts +2 -0
  42. package/dist/preload/windows/host-toolbar-runtime.js +13 -0
  43. package/dist/preload/windows/simulator.cjs +0 -2
  44. package/dist/preload/windows/simulator.cjs.map +2 -2
  45. package/dist/preload/windows/simulator.js +0 -2
  46. package/dist/renderer/assets/constants-DI382mTP.js +2 -0
  47. package/dist/renderer/assets/index-DLzjz1wv.js +50 -0
  48. package/dist/renderer/assets/{input-QGx6FFX1.js → input-6fpCXV-n.js} +2 -2
  49. package/dist/renderer/assets/ipc-transport-Bs8Sf1B2.css +1 -0
  50. package/dist/renderer/assets/{ipc-transport-DvZvwK-Z.js → ipc-transport-D22e4dv7.js} +6 -6
  51. package/dist/renderer/assets/popover-CdGdKkkc.js +2 -0
  52. package/dist/renderer/assets/select-X0sbjwdP.js +2 -0
  53. package/dist/renderer/assets/{settings-DpAbTJyF.js → settings-CS4jYaCw.js} +2 -2
  54. package/dist/renderer/assets/settings-api-CCWTAao_.js +2 -0
  55. package/dist/renderer/assets/workbenchSettings-Bpzaj3bm.js +8 -0
  56. package/dist/renderer/entries/main/index.html +7 -6
  57. package/dist/renderer/entries/popover/index.html +6 -6
  58. package/dist/renderer/entries/settings/index.html +5 -5
  59. package/dist/renderer/entries/workbench-settings/index.html +5 -5
  60. package/dist/shared/constants.d.ts +18 -0
  61. package/dist/shared/constants.js +18 -0
  62. package/dist/shared/ipc-channels.d.ts +10 -23
  63. package/dist/shared/ipc-channels.js +13 -34
  64. package/dist/shared/ipc-schemas.d.ts +0 -12
  65. package/dist/shared/ipc-schemas.js +0 -12
  66. package/dist/shared/types.d.ts +14 -30
  67. package/package.json +8 -8
  68. package/dist/main/ipc/panels.d.ts +0 -4
  69. package/dist/main/ipc/panels.js +0 -46
  70. package/dist/main/ipc/toolbar.d.ts +0 -4
  71. package/dist/main/ipc/toolbar.js +0 -21
  72. package/dist/main/services/toolbar/toolbar-store.d.ts +0 -23
  73. package/dist/main/services/toolbar/toolbar-store.js +0 -23
  74. package/dist/preload/windows/host-toolbar.cjs.map +0 -7
  75. package/dist/preload/windows/host-toolbar.d.ts +0 -2
  76. package/dist/preload/windows/host-toolbar.js +0 -12
  77. package/dist/renderer/assets/constants-CLAQX6VZ.js +0 -2
  78. package/dist/renderer/assets/index-CcJKzatF.js +0 -50
  79. package/dist/renderer/assets/ipc-transport-BT4QYQqu.css +0 -1
  80. package/dist/renderer/assets/popover-BOH1If1J.js +0 -2
  81. package/dist/renderer/assets/select-C7JQ8G5N.js +0 -2
  82. package/dist/renderer/assets/settings-api-RD2IZF53.js +0 -2
  83. package/dist/renderer/assets/workbenchSettings-CNJX4Qna.js +0 -8
package/README.md CHANGED
@@ -41,7 +41,6 @@ launch({
41
41
  preloadPath: '/path/to/my-preload.js',
42
42
  rendererDir,
43
43
  apiNamespaces: ['my'],
44
- headerHeight: 72,
45
44
  brandingProvider: () => ({ appName: '我的开发工具' }),
46
45
  icon: '/path/to/icon.png',
47
46
  menuBuilder: (mainWindow, menuCtx) => {
@@ -54,13 +53,6 @@ launch({
54
53
  // simulator 自定义 API:per-context
55
54
  instance.registerSimulatorApi('login', (params) => myLogin(params))
56
55
 
57
- // 工具栏:整表替换,随 host 状态(如登录态)重算时再 set 一次
58
- const refreshToolbar = () => instance.toolbar.set([
59
- { id: 'deploy', label: '发布', handler: () => deploy() },
60
- { id: 'preview', label: '预览', handler: () => preview() },
61
- ])
62
- refreshToolbar()
63
-
64
56
  // 自定义 IPC:经 gated 的 IpcRegistry,不再裸 ipcMain.handle
65
57
  instance.ipc.handle('my:action', () => collectStats())
66
58
 
@@ -95,9 +87,7 @@ src/
95
87
  lifecycle.ts # Electron app 生命周期注册
96
88
  ipc/ # 只做 handler 注册,不写业务
97
89
  index.ts # 聚合 register 函数导出
98
- simulator.ts # simulator attach/detach/resize
99
- panels.ts # panel:list / panel:eval / selectSimulator
100
- toolbar.ts # 品牌 / 工具栏配置
90
+ simulator.ts # simulator attach/detach/设备信息/custom-api invoke
101
91
  popover.ts # 编译配置弹窗
102
92
  settings.ts # 项目设置 + workbench 设置
103
93
  projects.ts # 项目列表管理
@@ -187,11 +177,11 @@ src/
187
177
  | ------------------ | -------------------- | ------------------- | ---------------------------------- |
188
178
  | `appName` | `string` | `'Dimina DevTools'` | 窗口标题 |
189
179
  | `adapter` | `CompilationAdapter` | 内置 | 项目编译适配器 |
190
- | `panels` | `BuiltinPanelId[]` | 全部四个 | 显示哪些内置面板 |
180
+ | `panels` | `BuiltinPanelId[]` | | **已废弃,运行时忽略**:界面恒显示全部四个内置面板;保留字段仅为兼容仍传它的 host |
191
181
  | `preloadPath` | `string` | 内置 | 统一的 host 级 preload 入口;native-host simulator(WCV)自动跑其 `.cjs` sibling(`cjsSiblingPreloadPath`) |
192
182
  | `apiNamespaces` | `string[]` | `[]` | 自定义 API 命名空间(如 `['qd']`) |
193
183
  | `brandingProvider` | `() => { appName }` | — | 品牌信息 provider |
194
- | `headerHeight` | `number` | `40` | 头部栏高度(px),同步下发 main + renderer |
184
+ | `headerHeight` | `number` | | **已废弃,运行时忽略**:头部栏恒为 40px(`HEADER_H`);需要自定义工具栏请用 host toolbar WCV |
195
185
 
196
186
  ### WorkbenchAppConfig(扩展 WorkbenchConfig)
197
187
 
@@ -216,7 +206,6 @@ src/
216
206
  | 方法 | 说明 |
217
207
  | --- | --- |
218
208
  | `instance.registerSimulatorApi(name, handler)` | 注册 simulator 自定义 API,小程序里 `wx.<name>()` 调用(详见下方"Simulator 自定义 API")。返回 `Disposable` |
219
- | `instance.toolbar.set(actions)` | 原子整表替换工具栏;`actions` 为 `ToolbarActionInput[]`(`{ id, label, handler }`),`id` 重复抛错。host 状态变化(如登录态)时构造新表再 `set` 一次 |
220
209
  | `instance.ipc` | `IpcRegistry` 实例,`instance.ipc.handle(channel, fn)` 注册自定义 IPC;已绑定 `senderPolicy` 网关 |
221
210
  | `instance.registerTrustedWindow(win)` | 把 host 自有弹窗 `BrowserWindow` 加入受信 sender 集,否则其发起的 `instance.ipc` 调用会被网关拒绝。窗口关闭即移除 |
222
211
 
@@ -492,6 +481,33 @@ launch({
492
481
 
493
482
  ---
494
483
 
484
+ ## Host Toolbar(宿主自定义工具栏)
485
+
486
+ 下游通过 `instance.context.views.hostToolbar` 拥有 devtools 头部下方的工具栏条(一个 WebContentsView):`loadURL` / `loadFile` 加载自己的内容,`setPreloadPath` 注入自己的 preload,`setHeightMode` 钉死或自动跟随内容高度(自动模式要求内容自带 shrink-to-fit 的 `[data-host-toolbar-root]` 包裹元素)。
487
+
488
+ ### 双向消息:onMessage / send
489
+
490
+ 主进程与工具栏页面之间有一条门控窄通道(按 load 握手的 MessagePort,信封 `{ channel, payload }`):
491
+
492
+ - `hostToolbar.onMessage(channel, handler): { dispose() }` — 接收页面消息。控制面级注册:可在 view 创建前调用,且跨页面 reload 自动续接,无需重新注册。空串/非 string channel 抛错。
493
+ - `hostToolbar.send(channel, payload): boolean` — 发消息给页面。门控不排队:没有活的工具栏 webContents、本次 load 的握手未完成、或正处于换文档导航窗口期(`loadURL`/`loadFile` 发起后、以及页面自发的主框架跨文档导航开始后,直到新文档握手完成)时返回 `false`(不投递、不建 view);返回 `true` 即已发出。返回值本身就是就绪信号,下游不再需要拿 `getHostToolbarWebContentsId()` 手工判断工具栏是否就绪(该 API 保留)。
494
+
495
+ 页面侧由框架自动注入 `window.diminaHostToolbar`(仅 `{ send, onMessage }` 两个函数;握手前的 `send` 进队列、握手后按序送达。队列上限 128 条:超限丢弃最新一条、首次超限 console.warn 一次,不抛错):
496
+
497
+ ```js
498
+ // 工具栏页面内
499
+ window.diminaHostToolbar.onMessage('host:cmd', (payload) => { /* ... */ })
500
+ window.diminaHostToolbar.send('page:event', { clicked: 'compile' })
501
+ ```
502
+
503
+ ```ts
504
+ // 主进程(onSetup 内)
505
+ const sub = instance.context.views.hostToolbar.onMessage('page:event', (payload) => { /* ... */ })
506
+ instance.context.views.hostToolbar.send('host:cmd', { theme: 'dark' }) // false = 未送达
507
+ ```
508
+
509
+ ---
510
+
495
511
  ## 模块导出一览
496
512
 
497
513
  `@dimina-kit/devtools` 的公共入口。`api.ts`(根入口)聚合了所有公共 API,优先从根入口导入。
@@ -499,14 +515,14 @@ launch({
499
515
  ```
500
516
  @dimina-kit/devtools launch, buildDefaultMenu,
501
517
  openSettingsWindow, suppressEpipe, setupCdpPort,
518
+ asMiniappRuntime, MiniappRuntime(type),
502
519
  createWorkbenchContext, createMainWindow,
503
520
  createViewManager, IpcRegistry,
504
521
  UpdateManager, createGitHubReleaseChecker, ...
505
522
  @dimina-kit/devtools/launch launch(config?), buildDefaultMenu, openSettingsWindow
506
523
  @dimina-kit/devtools/types TypeScript 类型定义
507
524
  @dimina-kit/devtools/bootstrap suppressEpipe(), setupCdpPort()
508
- @dimina-kit/devtools/context createWorkbenchContext(opts),
509
- hasBuiltinPanel(ctx, panelId), getDefaultTab(ctx)
525
+ @dimina-kit/devtools/context createWorkbenchContext(opts)
510
526
  @dimina-kit/devtools/create-window createMainWindow(opts)
511
527
  @dimina-kit/devtools/paths rendererDir, defaultPreloadPath, simulatorDir,
512
528
  getRendererDir, getPreloadDir, getRendererHtml
@@ -527,19 +543,32 @@ launch({
527
543
 
528
544
  ---
529
545
 
546
+ ## MiniappRuntime(宿主集成推荐契约)
547
+
548
+ 下游宿主(如 qdmp)集成时,推荐依赖手写的稳定契约 `MiniappRuntime`,而不是整个 `WorkbenchContext`——后者携带全部内部 service 类型,内部重构会直接破坏下游编译。`asMiniappRuntime(ctx)` 恒等返回(typed view,非拷贝),宿主对 `runtime.workspace.openProject` 的 monkey-patch 会落在真实对象上:
549
+
550
+ ```typescript
551
+ import { asMiniappRuntime, type MiniappRuntime } from '@dimina-kit/devtools'
552
+
553
+ const runtime: MiniappRuntime = asMiniappRuntime(instance.context)
554
+ runtime.workspace.openProject = gated(runtime.workspace.openProject) // 权限闸(契约保证可写)
555
+ runtime.views.hostToolbar.send('host:cmd', { theme: 'dark' })
556
+ runtime.notify.projectStatus({ status: 'ready', message: '编译完成' })
557
+ ```
558
+
559
+ 契约面:`rendererDir` / `views.hostToolbar`(6 成员,无 `webContents`)/ `workspace`(7 方法)/ `notify.projectStatus` / `registry.add` / `windows`(不透明句柄)。零 Electron 类型。
560
+
530
561
  ## WorkbenchContext
531
562
 
532
- `WorkbenchContext` 是所有扩展点的唯一容器。配置字段直接暴露,运行时状态通过 service 访问。host hook 拿到的 `instance.context` 即此类型;`menuBuilder` 拿到的是收窄后的 `MenuContext`(剔除 `registry` / `senderPolicy` / `trustedWindowSenderIds` / `simulatorApis` / `toolbar` 等内部管线)。
563
+ `WorkbenchContext` 是所有扩展点的唯一容器。配置字段直接暴露,运行时状态通过 service 访问。host hook 拿到的 `instance.context` 即此类型;`menuBuilder` 拿到的是收窄后的 `MenuContext`(剔除 `registry` / `senderPolicy` / `trustedWindowSenderIds` / `simulatorApis` 等内部管线)。
533
564
 
534
565
  ```typescript
535
566
  interface WorkbenchContext {
536
567
  adapter: CompilationAdapter
537
568
  preloadPath: string
538
569
  rendererDir: string
539
- panels: string[]
540
570
  apiNamespaces: string[]
541
571
  appName: string
542
- headerHeight: number
543
572
  brandingProvider?: () => Promise<{ appName: string }> | { appName: string }
544
573
 
545
574
  // ── Services(运行时状态封装在内部,通过方法访问)──
@@ -550,7 +579,6 @@ interface WorkbenchContext {
550
579
 
551
580
  // ── 扩展容器(host 通过 instance 上的方法写入,不直接操作)──
552
581
  simulatorApis: SimulatorApiRegistry // instance.registerSimulatorApi 写入
553
- toolbar: ToolbarStore // instance.toolbar.set 写入
554
582
  trustedWindowSenderIds: Map<number, number> // instance.registerTrustedWindow 写入(webContents.id → 引用计数)
555
583
 
556
584
  // ── Internal lifecycle / security (host 不直接消费) ──
@@ -562,7 +590,7 @@ interface WorkbenchContext {
562
590
  会话和视图状态封装在对应 service 的私有闭包中,通过方法访问,例如:
563
591
 
564
592
  - `ctx.workspace.getProjectPath()` / `ctx.workspace.getSession()` / `ctx.workspace.hasActiveSession()`
565
- - `ctx.views.getSimulatorWebContentsId()` / `ctx.views.isSimulatorAdded()` / `ctx.views.getLastSimWidth()`
593
+ - `ctx.views.getSimulatorWebContentsId()` / `ctx.views.getSimulatorWebContents()`
566
594
  - `ctx.windows.mainWindow` / `ctx.windows.settingsWindow`
567
595
 
568
596
  ---
@@ -604,13 +632,11 @@ flowchart TB
604
632
  | Storage | 拉取 + 推送 | renderer `ipcInvoke(SimulatorStorageChannel.GetSnapshot)` → 主进程 CDP `DOMStorage` 域;变更事件由主进程通过 `SimulatorStorageChannel.Event` 推回 renderer |
605
633
  | 元素选区 / `Page.getData` / MCP overview | 拉取 | 主进程 `webContents.executeJavaScript(...)` 或 `Runtime.evaluate(...)` 读 `window.__simulatorData.*`(由 `installSimulatorBridge` 暴露) |
606
634
 
607
- > `src/main/ipc/panels.ts` 暴露 `panel:eval` handler 供外部 host 自定义面板复用,内置 renderer 不消费它。
608
-
609
635
  ---
610
636
 
611
637
  ## IPC 通信总览
612
638
 
613
- IPC 频道名常量集中定义在 `src/shared/ipc-channels.ts`,按域分组(`SimulatorChannel` / `ProjectChannel` / `PanelChannel` / `WorkbenchSettingsChannel` 等)。该文件是频道清单的唯一真相源;此处不再维护手抄表,以免与代码漂移。
639
+ IPC 频道名常量集中定义在 `src/shared/ipc-channels.ts`,按域分组(`SimulatorChannel` / `ProjectChannel` / `WorkbenchSettingsChannel` 等)。该文件是频道清单的唯一真相源;此处不再维护手抄表,以免与代码漂移。
614
640
 
615
641
  ---
616
642
 
@@ -620,7 +646,7 @@ Electron 对 `chrome.devtools.panels.create()` 的支持**长期不稳定**。
620
646
 
621
647
  **影响范围**:从 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 团队无修复计划。
622
648
 
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`。
649
+ **当前方案**:内置面板(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/simulator.ts`。
624
650
 
625
651
  ---
626
652
 
@@ -1,7 +1,9 @@
1
1
  export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
2
2
  export type { WorkbenchAppInstance } from './app/app.js';
3
3
  export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
4
- export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
4
+ export { asMiniappRuntime } from './runtime/miniapp-runtime.js';
5
+ export type { MiniappRuntime } from './runtime/miniapp-runtime.js';
6
+ export { createWorkbenchContext } from './services/workbench-context.js';
5
7
  export type { WorkbenchContext, CreateContextOptions } from './services/workbench-context.js';
6
8
  export { createMainWindow } from './windows/main-window/index.js';
7
9
  export { createViewManager } from './services/views/view-manager.js';
@@ -14,5 +16,5 @@ export { IpcRegistry } from './utils/ipc-registry.js';
14
16
  export type { SenderPolicy } from './utils/ipc-registry.js';
15
17
  export { UpdateManager, createGitHubReleaseChecker } from './services/update/index.js';
16
18
  export type { UpdateManagerOptions, GitHubReleaseCheckerOptions, PickAssetContext, VersionScheme, } from './services/update/index.js';
17
- export type { WorkbenchConfig, WorkbenchAppConfig, CompilationAdapter, ProjectSession, ToolbarAction, BuiltinPanelId, BuiltinModuleId, UpdateChecker, UpdateInfo, } from '../shared/types.js';
19
+ export type { WorkbenchConfig, WorkbenchAppConfig, CompilationAdapter, ProjectSession, BuiltinPanelId, BuiltinModuleId, UpdateChecker, UpdateInfo, } from '../shared/types.js';
18
20
  //# sourceMappingURL=api.d.ts.map
package/dist/main/api.js CHANGED
@@ -7,8 +7,12 @@
7
7
  export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
8
8
  // ── Bootstrap utilities ──────────────────────────────────────────────────
9
9
  export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
10
+ // ── Miniapp runtime contract (host-facing, stable) ───────────────────────
11
+ // The hand-written kernel surface a downstream host consumes; prefer this
12
+ // over depending on the full `WorkbenchContext`.
13
+ export { asMiniappRuntime } from './runtime/miniapp-runtime.js';
10
14
  // ── Context & views (for module-assembly consumers) ──────────────────────
11
- export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
15
+ export { createWorkbenchContext } from './services/workbench-context.js';
12
16
  export { createMainWindow } from './windows/main-window/index.js';
13
17
  export { createViewManager } from './services/views/view-manager.js';
14
18
  // ── Paths ────────────────────────────────────────────────────────────────
@@ -1,5 +1,5 @@
1
1
  import { BrowserWindow } from 'electron';
2
- import type { ToolbarActionInput, WorkbenchAppConfig } from '../../shared/types.js';
2
+ import type { WorkbenchAppConfig } from '../../shared/types.js';
3
3
  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';
@@ -15,10 +15,6 @@ export interface WorkbenchAppInstance {
15
15
  registerTrustedWindow: (win: BrowserWindow) => Disposable;
16
16
  /** Registers a simulator custom API into this context's registry. */
17
17
  registerSimulatorApi: (name: string, handler: SimulatorApiHandler) => Disposable;
18
- /** Per-context toolbar surface — `set()` atomically replaces the table. */
19
- readonly toolbar: {
20
- set(actions: ToolbarActionInput[]): void;
21
- };
22
18
  automationServer?: AutomationServer;
23
19
  updateManager?: UpdateManager;
24
20
  dispose: () => Promise<void>;
@@ -145,10 +145,8 @@ function createContext(config, mainWindow, rendererDir) {
145
145
  adapter: config.adapter,
146
146
  preloadPath: config.preloadPath ?? defaultPreloadPath,
147
147
  rendererDir,
148
- panels: config.panels,
149
148
  appName: config.appName,
150
149
  apiNamespaces: config.apiNamespaces,
151
- headerHeight: config.headerHeight,
152
150
  brandingProvider: config.brandingProvider,
153
151
  // The host-supplied ProjectsProvider / template types in `shared/types`
154
152
  // are structurally compatible with the main-process equivalents —
@@ -169,7 +167,7 @@ function registerBuiltinModules(config, context) {
169
167
  }
170
168
  /**
171
169
  * Strip the internal-plumbing fields a host menu builder must not reach
172
- * (registry / senderPolicy / trustedWindowSenderIds / simulatorApis / toolbar)
170
+ * (registry / senderPolicy / trustedWindowSenderIds / simulatorApis)
173
171
  * so `menuBuilder` receives the narrowed `MenuContext` its contract promises —
174
172
  * at runtime, not just at the type level.
175
173
  */
@@ -181,7 +179,6 @@ function toMenuContext(context) {
181
179
  delete menuContext.senderPolicy;
182
180
  delete menuContext.trustedWindowSenderIds;
183
181
  delete menuContext.simulatorApis;
184
- delete menuContext.toolbar;
185
182
  return menuContext;
186
183
  }
187
184
  function installMenu(config, mainWindow, context) {
@@ -345,15 +342,6 @@ export async function createDevtoolsRuntime(config = {}) {
345
342
  // teardown, so a single dispose leaves no dead entry behind.
346
343
  registerTrustedWindow: (win) => context.registry.add(registerTrustedWindow(context, win)),
347
344
  registerSimulatorApi: (name, handler) => context.registry.add(toDisposable(context.simulatorApis.register(name, handler))),
348
- toolbar: {
349
- set: (actions) => {
350
- // `context.toolbar.set` validates id-uniqueness and throws on a
351
- // duplicate BEFORE mutating, so a rejected batch never reaches
352
- // the notify below — no phantom ActionsChanged.
353
- context.toolbar.set(actions);
354
- context.notify.toolbarActionsChanged();
355
- },
356
- },
357
345
  dispose: () => disposeContext(context),
358
346
  };
359
347
  if (config.onSetup) {
@@ -470,9 +458,9 @@ export async function createDevtoolsRuntime(config = {}) {
470
458
  // upload run there, not in the service host) in the embedded DevTools by
471
459
  // injecting its raw Network.* CDP events into the DevTools front-end so the
472
460
  // native Network tab renders them (service-host console line is the
473
- // fallback). The ViewManager calls attachSimulator + setDevtoolsHost from
474
- // attachNativeSimulator once the simulator WCV + DevTools host exist;
475
- // getServiceWc here is the fallback sink target.
461
+ // fallback). The ViewManager calls the forwarder's attachSimulator +
462
+ // setDevtoolsHost from attachNativeSimulator once the simulator WCV +
463
+ // DevTools host exist; getServiceWc here is the fallback sink target.
476
464
  const networkForward = createNetworkForwarder({
477
465
  getServiceWc: (appId) => context.bridge?.getServiceWc(appId) ?? null,
478
466
  connections: context.connections,