@dimina-kit/devtools 0.4.0 → 0.5.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.
Files changed (507) hide show
  1. package/README.md +51 -660
  2. package/dist/main/api.d.ts +2 -1
  3. package/dist/main/app/app.d.ts +41 -12
  4. package/dist/main/app/app.js +299 -514
  5. package/dist/main/app/bootstrap.d.ts +8 -5
  6. package/dist/main/app/bootstrap.js +15 -15
  7. package/dist/main/app/editor-view.d.ts +21 -0
  8. package/dist/main/app/editor-view.js +71 -0
  9. package/dist/main/app/global-mirrors.d.ts +23 -0
  10. package/dist/main/app/global-mirrors.js +37 -0
  11. package/dist/main/app/host-sidebar-default.d.ts +19 -0
  12. package/dist/main/app/host-sidebar-default.js +44 -0
  13. package/dist/main/app/lifecycle.d.ts +12 -1
  14. package/dist/main/app/lifecycle.js +27 -1
  15. package/dist/main/app/menu-setup.d.ts +13 -0
  16. package/dist/main/app/menu-setup.js +49 -0
  17. package/dist/main/app/native-overview.d.ts +1 -1
  18. package/dist/main/app/open-project-ipc.d.ts +13 -0
  19. package/dist/main/app/open-project-ipc.js +21 -0
  20. package/dist/main/app/project-list-surface.d.ts +31 -0
  21. package/dist/main/app/project-list-surface.js +20 -0
  22. package/dist/main/app/project-window.d.ts +36 -0
  23. package/dist/main/app/project-window.js +93 -0
  24. package/dist/main/app/servers.d.ts +17 -0
  25. package/dist/main/app/servers.js +60 -0
  26. package/dist/main/app/ui-extension-targets.d.ts +42 -0
  27. package/dist/main/app/ui-extension-targets.js +101 -0
  28. package/dist/main/app/window-close-reveal.harness.d.ts +34 -0
  29. package/dist/main/app/window-close-reveal.harness.js +65 -0
  30. package/dist/main/app/window-events.d.ts +15 -0
  31. package/dist/main/app/window-events.js +45 -0
  32. package/dist/main/app/window-runtime-services.d.ts +41 -0
  33. package/dist/main/app/window-runtime-services.js +197 -0
  34. package/dist/main/app/workbench-modules.d.ts +24 -0
  35. package/dist/main/app/workbench-modules.js +51 -0
  36. package/dist/main/app/workbench-window.d.ts +85 -0
  37. package/dist/main/app/workbench-window.js +310 -0
  38. package/dist/main/index.bundle.js +11712 -9986
  39. package/dist/main/index.js +49 -1
  40. package/dist/main/ipc/app-lifecycle.d.ts +1 -31
  41. package/dist/main/ipc/app-lifecycle.js +1 -53
  42. package/dist/main/ipc/app.d.ts +4 -1
  43. package/dist/main/ipc/app.js +4 -3
  44. package/dist/main/ipc/bridge-router.d.ts +19 -116
  45. package/dist/main/ipc/bridge-router.js +28 -2128
  46. package/dist/main/ipc/device-picker.d.ts +16 -0
  47. package/dist/main/ipc/device-picker.js +27 -0
  48. package/dist/main/ipc/index.d.ts +5 -0
  49. package/dist/main/ipc/index.js +5 -0
  50. package/dist/main/ipc/internal-devtools.d.ts +16 -0
  51. package/dist/main/ipc/internal-devtools.js +10 -0
  52. package/dist/main/ipc/page-scroll.d.ts +1 -13
  53. package/dist/main/ipc/page-scroll.js +1 -16
  54. package/dist/main/ipc/popover.d.ts +4 -1
  55. package/dist/main/ipc/popover.js +26 -19
  56. package/dist/main/ipc/project-create.d.ts +16 -0
  57. package/dist/main/ipc/project-create.js +27 -0
  58. package/dist/main/ipc/project-fs.d.ts +38 -3
  59. package/dist/main/ipc/project-fs.js +53 -22
  60. package/dist/main/ipc/projects.d.ts +3 -3
  61. package/dist/main/ipc/projects.js +47 -11
  62. package/dist/main/ipc/session-listener-bag.d.ts +1 -40
  63. package/dist/main/ipc/session-listener-bag.js +1 -39
  64. package/dist/main/ipc/session.d.ts +4 -1
  65. package/dist/main/ipc/session.js +26 -26
  66. package/dist/main/ipc/settings.d.ts +4 -1
  67. package/dist/main/ipc/settings.js +17 -19
  68. package/dist/main/ipc/simulator-module.d.ts +9 -3
  69. package/dist/main/ipc/simulator-module.js +13 -10
  70. package/dist/main/ipc/simulator.d.ts +4 -1
  71. package/dist/main/ipc/simulator.js +12 -18
  72. package/dist/main/ipc/tooltip.d.ts +14 -0
  73. package/dist/main/ipc/tooltip.js +29 -0
  74. package/dist/main/ipc/views.d.ts +19 -2
  75. package/dist/main/ipc/views.js +76 -8
  76. package/dist/main/runtime/devtools-backend-before-quit.harness.d.ts +43 -0
  77. package/dist/main/runtime/devtools-backend-before-quit.harness.js +87 -0
  78. package/dist/main/runtime/devtools-backend.js +60 -4
  79. package/dist/main/runtime/devtools-runtime-mock.harness.d.ts +21 -0
  80. package/dist/main/runtime/devtools-runtime-mock.harness.js +313 -0
  81. package/dist/main/runtime/miniapp-runtime.d.ts +91 -22
  82. package/dist/main/services/app-services.d.ts +62 -0
  83. package/dist/main/services/app-services.js +64 -0
  84. package/dist/main/services/automation/connection-target.d.ts +36 -0
  85. package/dist/main/services/automation/connection-target.js +29 -0
  86. package/dist/main/services/automation/console-bridge.d.ts +28 -0
  87. package/dist/main/services/automation/console-bridge.js +91 -0
  88. package/dist/main/services/automation/handlers/app.js +4 -4
  89. package/dist/main/services/automation/handlers/element.js +55 -21
  90. package/dist/main/services/automation/index.d.ts +12 -1
  91. package/dist/main/services/automation/index.js +54 -133
  92. package/dist/main/services/cdp-session/index.d.ts +87 -0
  93. package/dist/main/services/cdp-session/index.js +173 -0
  94. package/dist/main/services/compile-standby.js +4 -0
  95. package/dist/main/services/console-forward/cdp-inject.d.ts +18 -0
  96. package/dist/main/services/console-forward/cdp-inject.js +30 -0
  97. package/dist/main/services/console-forward/global-console-mirror.d.ts +33 -0
  98. package/dist/main/services/console-forward/global-console-mirror.js +71 -0
  99. package/dist/main/services/console-forward/global-diagnostics-mirror.d.ts +33 -0
  100. package/dist/main/services/console-forward/global-diagnostics-mirror.js +73 -0
  101. package/dist/main/services/console-forward/index.d.ts +1 -46
  102. package/dist/main/services/console-forward/index.js +1 -185
  103. package/dist/main/services/console-forward/internal-log.d.ts +2 -0
  104. package/dist/main/services/console-forward/internal-log.js +2 -0
  105. package/dist/main/services/console-forward/open-gated-relay.d.ts +67 -0
  106. package/dist/main/services/console-forward/open-gated-relay.js +55 -0
  107. package/dist/main/services/default-adapter.js +1 -1
  108. package/dist/main/services/diagnostics/index.d.ts +1 -48
  109. package/dist/main/services/diagnostics/index.js +1 -60
  110. package/dist/main/services/dimina-resource-server.d.ts +1 -6
  111. package/dist/main/services/dimina-resource-server.js +1 -98
  112. package/dist/main/services/elements-forward/index.d.ts +132 -15
  113. package/dist/main/services/elements-forward/index.js +155 -304
  114. package/dist/main/services/fs-bridge-protocol.d.ts +61 -0
  115. package/dist/main/services/fs-bridge-protocol.js +34 -0
  116. package/dist/main/services/fs-watch-sse.d.ts +40 -0
  117. package/dist/main/services/fs-watch-sse.js +113 -0
  118. package/dist/main/services/http-json.d.ts +9 -0
  119. package/dist/main/services/http-json.js +6 -0
  120. package/dist/main/services/layout/index.d.ts +11 -0
  121. package/dist/main/services/layout/index.js +23 -0
  122. package/dist/main/services/mcp/connection-owner.d.ts +38 -0
  123. package/dist/main/services/mcp/connection-owner.js +79 -0
  124. package/dist/main/services/mcp/index.d.ts +3 -1
  125. package/dist/main/services/mcp/index.js +4 -3
  126. package/dist/main/services/mcp/opened-project.d.ts +88 -0
  127. package/dist/main/services/mcp/opened-project.js +60 -0
  128. package/dist/main/services/mcp/server.d.ts +2 -1
  129. package/dist/main/services/mcp/server.js +29 -4
  130. package/dist/main/services/mcp/target-manager.d.ts +71 -23
  131. package/dist/main/services/mcp/target-manager.js +269 -138
  132. package/dist/main/services/mcp/target-selection.d.ts +47 -0
  133. package/dist/main/services/mcp/target-selection.js +71 -0
  134. package/dist/main/services/mcp/tools/context-tools.js +20 -5
  135. package/dist/main/services/mcp/tools/project-tools.d.ts +72 -0
  136. package/dist/main/services/mcp/tools/project-tools.js +133 -0
  137. package/dist/main/services/module.d.ts +13 -5
  138. package/dist/main/services/network-forward/body-cache.d.ts +72 -0
  139. package/dist/main/services/network-forward/body-cache.js +179 -0
  140. package/dist/main/services/network-forward/frontend-dispatch.d.ts +91 -0
  141. package/dist/main/services/network-forward/frontend-dispatch.js +148 -0
  142. package/dist/main/services/network-forward/global-body-gate.d.ts +46 -0
  143. package/dist/main/services/network-forward/global-body-gate.js +93 -0
  144. package/dist/main/services/network-forward/global-mirror-test-fixtures.d.ts +48 -0
  145. package/dist/main/services/network-forward/global-mirror-test-fixtures.js +96 -0
  146. package/dist/main/services/network-forward/http.d.ts +47 -0
  147. package/dist/main/services/network-forward/http.js +162 -0
  148. package/dist/main/services/network-forward/index.d.ts +135 -15
  149. package/dist/main/services/network-forward/index.js +854 -224
  150. package/dist/main/services/network-forward/request-ids.d.ts +5 -0
  151. package/dist/main/services/network-forward/request-ids.js +5 -0
  152. package/dist/main/services/network-forward/user-facing.d.ts +21 -0
  153. package/dist/main/services/network-forward/user-facing.js +50 -0
  154. package/dist/main/services/network-forward/websocket.d.ts +36 -0
  155. package/dist/main/services/network-forward/websocket.js +120 -0
  156. package/dist/main/services/notifications/renderer-notifier.d.ts +71 -9
  157. package/dist/main/services/notifications/renderer-notifier.js +45 -8
  158. package/dist/main/services/projects/create-project-service.js +19 -5
  159. package/dist/main/services/projects/local-provider.js +8 -4
  160. package/dist/main/services/projects/project-repository.d.ts +59 -7
  161. package/dist/main/services/projects/project-repository.js +285 -51
  162. package/dist/main/services/projects/types.d.ts +44 -34
  163. package/dist/main/services/render-inspect/index.d.ts +12 -2
  164. package/dist/main/services/render-inspect/index.js +21 -102
  165. package/dist/main/services/safe-area/index.d.ts +21 -6
  166. package/dist/main/services/safe-area/index.js +92 -46
  167. package/dist/main/services/service-host-pool/pool.d.ts +1 -196
  168. package/dist/main/services/service-host-pool/pool.js +1 -363
  169. package/dist/main/services/settings/index.d.ts +7 -1
  170. package/dist/main/services/settings/index.js +22 -2
  171. package/dist/main/services/simulator/custom-apis.d.ts +1 -42
  172. package/dist/main/services/simulator/custom-apis.js +1 -46
  173. package/dist/main/services/simulator/referer.d.ts +1 -9
  174. package/dist/main/services/simulator/referer.js +1 -19
  175. package/dist/main/services/simulator/ui-extensions.d.ts +21 -0
  176. package/dist/main/services/simulator/ui-extensions.js +176 -0
  177. package/dist/main/services/simulator-appdata/index.d.ts +6 -0
  178. package/dist/main/services/simulator-appdata/index.js +21 -2
  179. package/dist/main/services/simulator-current-page/index.d.ts +5 -3
  180. package/dist/main/services/simulator-current-page/index.js +8 -1
  181. package/dist/main/services/simulator-storage/index.d.ts +34 -5
  182. package/dist/main/services/simulator-storage/index.js +73 -71
  183. package/dist/main/services/simulator-storage/service-storage-ops.d.ts +1 -39
  184. package/dist/main/services/simulator-storage/service-storage-ops.js +1 -66
  185. package/dist/main/services/simulator-storage/window-scope.d.ts +20 -0
  186. package/dist/main/services/simulator-storage/window-scope.js +20 -0
  187. package/dist/main/services/simulator-temp-files/disk.d.ts +1 -54
  188. package/dist/main/services/simulator-temp-files/disk.js +1 -237
  189. package/dist/main/services/simulator-temp-files/fs-channels.d.ts +1 -68
  190. package/dist/main/services/simulator-temp-files/fs-channels.js +1 -107
  191. package/dist/main/services/simulator-temp-files/index.d.ts +1 -32
  192. package/dist/main/services/simulator-temp-files/index.js +1 -181
  193. package/dist/main/services/simulator-temp-files/request-handler.d.ts +1 -29
  194. package/dist/main/services/simulator-temp-files/request-handler.js +1 -177
  195. package/dist/main/services/simulator-temp-files/resolver.d.ts +1 -21
  196. package/dist/main/services/simulator-temp-files/resolver.js +1 -21
  197. package/dist/main/services/simulator-temp-files/store.d.ts +1 -13
  198. package/dist/main/services/simulator-temp-files/store.js +1 -23
  199. package/dist/main/services/update/github-release-checker.js +22 -3
  200. package/dist/main/services/update/update-manager.d.ts +21 -4
  201. package/dist/main/services/update/update-manager.js +55 -11
  202. package/dist/main/services/views/clear-console-filter.d.ts +44 -0
  203. package/dist/main/services/views/clear-console-filter.js +86 -0
  204. package/dist/main/services/views/console-filter-test-fixtures.d.ts +94 -0
  205. package/dist/main/services/views/console-filter-test-fixtures.js +82 -0
  206. package/dist/main/services/views/console-filter.d.ts +94 -0
  207. package/dist/main/services/views/console-filter.js +190 -0
  208. package/dist/main/services/views/devtools-tabs.d.ts +24 -4
  209. package/dist/main/services/views/devtools-tabs.js +40 -21
  210. package/dist/main/services/views/frontend-bootstrap-gate.d.ts +59 -0
  211. package/dist/main/services/views/frontend-bootstrap-gate.js +117 -0
  212. package/dist/main/services/views/host-dialog-port-channel.d.ts +18 -0
  213. package/dist/main/services/views/host-dialog-port-channel.js +15 -0
  214. package/dist/main/services/views/host-dialog-session-runtime.d.ts +10 -0
  215. package/dist/main/services/views/host-dialog-session-runtime.js +17 -0
  216. package/dist/main/services/views/host-dialog-view.d.ts +95 -0
  217. package/dist/main/services/views/host-dialog-view.js +147 -0
  218. package/dist/main/services/views/host-sidebar-port-channel.d.ts +18 -0
  219. package/dist/main/services/views/host-sidebar-port-channel.js +15 -0
  220. package/dist/main/services/views/host-sidebar-session-runtime.d.ts +10 -0
  221. package/dist/main/services/views/host-sidebar-session-runtime.js +17 -0
  222. package/dist/main/services/views/host-sidebar-view.d.ts +59 -0
  223. package/dist/main/services/views/host-sidebar-view.js +44 -0
  224. package/dist/main/services/views/host-slot-port-channel.d.ts +124 -0
  225. package/dist/main/services/views/host-slot-port-channel.js +289 -0
  226. package/dist/main/services/views/host-slot-session-runtime.d.ts +40 -0
  227. package/dist/main/services/views/host-slot-session-runtime.js +50 -0
  228. package/dist/main/services/views/host-slot-view.d.ts +109 -0
  229. package/dist/main/services/views/host-slot-view.js +147 -0
  230. package/dist/main/services/views/host-toolbar-port-channel.d.ts +6 -91
  231. package/dist/main/services/views/host-toolbar-port-channel.js +10 -243
  232. package/dist/main/services/views/host-toolbar-session-runtime.d.ts +5 -30
  233. package/dist/main/services/views/host-toolbar-session-runtime.js +9 -47
  234. package/dist/main/services/views/host-toolbar-view.d.ts +34 -7
  235. package/dist/main/services/views/host-toolbar-view.js +30 -237
  236. package/dist/main/services/views/managed-web-contents-view.d.ts +48 -0
  237. package/dist/main/services/views/managed-web-contents-view.js +143 -0
  238. package/dist/main/services/views/miniapp-partition.d.ts +1 -89
  239. package/dist/main/services/views/miniapp-partition.js +1 -158
  240. package/dist/main/services/views/native-simulator-devtools-host.js +206 -68
  241. package/dist/main/services/views/native-simulator-view.d.ts +6 -0
  242. package/dist/main/services/views/native-simulator-view.js +47 -40
  243. package/dist/main/services/views/native-view-tree.d.ts +25 -0
  244. package/dist/main/services/views/native-view-tree.js +69 -0
  245. package/dist/main/services/views/overlay-panels-view.d.ts +63 -4
  246. package/dist/main/services/views/overlay-panels-view.js +257 -108
  247. package/dist/main/services/views/placement-reconciler.d.ts +18 -18
  248. package/dist/main/services/views/placement-reconciler.js +91 -29
  249. package/dist/main/services/views/placement-test-driver.d.ts +27 -0
  250. package/dist/main/services/views/placement-test-driver.js +29 -0
  251. package/dist/main/services/views/refresh-styles.d.ts +10 -0
  252. package/dist/main/services/views/refresh-styles.js +57 -0
  253. package/dist/main/services/views/simulator-session-policy.d.ts +1 -27
  254. package/dist/main/services/views/simulator-session-policy.js +1 -98
  255. package/dist/main/services/views/view-manager-devtools-host-test-fixtures.d.ts +76 -0
  256. package/dist/main/services/views/view-manager-devtools-host-test-fixtures.js +184 -0
  257. package/dist/main/services/views/view-manager.d.ts +69 -88
  258. package/dist/main/services/views/view-manager.js +62 -7
  259. package/dist/main/services/views/workbench-view.d.ts +2 -0
  260. package/dist/main/services/views/workbench-view.js +104 -17
  261. package/dist/main/services/window-contexts/context-router.d.ts +36 -0
  262. package/dist/main/services/window-contexts/context-router.js +55 -0
  263. package/dist/main/services/workbench-coi-host.d.ts +52 -0
  264. package/dist/main/services/workbench-coi-host.js +227 -0
  265. package/dist/main/services/workbench-coi-server.d.ts +11 -0
  266. package/dist/main/services/workbench-coi-server.js +126 -126
  267. package/dist/main/services/workbench-coi-shutdown.d.ts +40 -0
  268. package/dist/main/services/workbench-coi-shutdown.js +69 -0
  269. package/dist/main/services/workbench-coi-static.d.ts +23 -0
  270. package/dist/main/services/workbench-coi-static.js +87 -0
  271. package/dist/main/services/workbench-context.d.ts +88 -8
  272. package/dist/main/services/workbench-context.js +54 -6
  273. package/dist/main/services/workspace/compile-log-buffer.d.ts +40 -0
  274. package/dist/main/services/workspace/compile-log-buffer.js +41 -0
  275. package/dist/main/services/workspace/compile-mode-adapter.d.ts +18 -0
  276. package/dist/main/services/workspace/compile-mode-adapter.js +57 -0
  277. package/dist/main/services/workspace/compile-mode-store.d.ts +25 -0
  278. package/dist/main/services/workspace/compile-mode-store.js +71 -0
  279. package/dist/main/services/workspace/open-project-guards.d.ts +16 -0
  280. package/dist/main/services/workspace/open-project-guards.js +42 -0
  281. package/dist/main/services/workspace/rebuild-status.d.ts +37 -0
  282. package/dist/main/services/workspace/rebuild-status.js +36 -0
  283. package/dist/main/services/workspace/session-status-store.d.ts +47 -0
  284. package/dist/main/services/workspace/session-status-store.js +73 -0
  285. package/dist/main/services/workspace/status-tap.d.ts +20 -0
  286. package/dist/main/services/workspace/status-tap.js +32 -0
  287. package/dist/main/services/workspace/workspace-compile-modes.d.ts +59 -0
  288. package/dist/main/services/workspace/workspace-compile-modes.js +93 -0
  289. package/dist/main/services/workspace/workspace-lifecycle-race.testutil.d.ts +22 -0
  290. package/dist/main/services/workspace/workspace-lifecycle-race.testutil.js +62 -0
  291. package/dist/main/services/workspace/workspace-referer.d.ts +17 -0
  292. package/dist/main/services/workspace/workspace-referer.js +26 -0
  293. package/dist/main/services/workspace/workspace-service.d.ts +7 -5
  294. package/dist/main/services/workspace/workspace-service.js +96 -135
  295. package/dist/main/services/workspace/workspace-thumbnails.d.ts +22 -0
  296. package/dist/main/services/workspace/workspace-thumbnails.js +67 -0
  297. package/dist/main/utils/ipc-context-source.d.ts +40 -0
  298. package/dist/main/utils/ipc-context-source.js +23 -0
  299. package/dist/main/utils/ipc-registry.d.ts +46 -21
  300. package/dist/main/utils/ipc-registry.js +166 -76
  301. package/dist/main/utils/paths.d.ts +18 -0
  302. package/dist/main/utils/paths.js +18 -0
  303. package/dist/main/utils/sender-policy.d.ts +10 -1
  304. package/dist/main/utils/sender-policy.js +42 -4
  305. package/dist/main/utils/theme.d.ts +18 -8
  306. package/dist/main/utils/theme.js +19 -9
  307. package/dist/main/windows/internal-devtools-window/index.d.ts +66 -0
  308. package/dist/main/windows/internal-devtools-window/index.js +160 -0
  309. package/dist/main/windows/main-window/create.d.ts +16 -0
  310. package/dist/main/windows/main-window/create.js +19 -11
  311. package/dist/main/windows/main-window/events.d.ts +1 -1
  312. package/dist/main/windows/main-window/events.js +26 -13
  313. package/dist/main/windows/main-window/index.d.ts +1 -1
  314. package/dist/main/windows/main-window/index.js +1 -1
  315. package/dist/main/windows/service-host-window/create.d.ts +1 -92
  316. package/dist/main/windows/service-host-window/create.js +1 -154
  317. package/dist/native-host/common/common.js +173 -53
  318. package/dist/native-host/container/pageFrame.css +1 -1
  319. package/dist/native-host/render/render.js +8278 -3659
  320. package/dist/native-host/service/service.js +2 -2
  321. package/dist/preload/index.d.ts +2 -0
  322. package/dist/preload/index.js +1 -0
  323. package/dist/preload/instrumentation/app-data.d.ts +2 -2
  324. package/dist/preload/instrumentation/app-data.js +1 -1
  325. package/dist/preload/instrumentation/wxml.js +1 -1
  326. package/dist/preload/runtime/bridge.d.ts +3 -3
  327. package/dist/preload/runtime/bridge.js +2 -2
  328. package/dist/preload/runtime/clipboard.d.ts +6 -0
  329. package/dist/preload/runtime/clipboard.js +12 -0
  330. package/dist/preload/runtime/host-dialog-advertiser.d.ts +22 -0
  331. package/dist/preload/runtime/host-dialog-advertiser.js +37 -0
  332. package/dist/preload/runtime/host-dialog-port.d.ts +44 -0
  333. package/dist/preload/runtime/host-dialog-port.js +53 -0
  334. package/dist/preload/runtime/host-dialog-runtime.d.ts +28 -0
  335. package/dist/preload/runtime/host-dialog-runtime.js +36 -0
  336. package/dist/preload/runtime/host-sidebar-advertiser.d.ts +19 -0
  337. package/dist/preload/runtime/host-sidebar-advertiser.js +35 -0
  338. package/dist/preload/runtime/host-sidebar-port.d.ts +44 -0
  339. package/dist/preload/runtime/host-sidebar-port.js +53 -0
  340. package/dist/preload/runtime/host-sidebar-runtime.d.ts +28 -0
  341. package/dist/preload/runtime/host-sidebar-runtime.js +36 -0
  342. package/dist/preload/runtime/host-slot-port-bridge.d.ts +18 -0
  343. package/dist/preload/runtime/host-slot-port-bridge.js +112 -0
  344. package/dist/preload/runtime/host-toolbar-advertiser.d.ts +5 -13
  345. package/dist/preload/runtime/host-toolbar-advertiser.js +18 -38
  346. package/dist/preload/runtime/host-toolbar-port.d.ts +9 -0
  347. package/dist/preload/runtime/host-toolbar-port.js +11 -95
  348. package/dist/preload/runtime/native-host.d.ts +14 -0
  349. package/dist/preload/runtime/native-host.js +5 -8
  350. package/dist/preload/runtime/node-bindings.d.ts +18 -0
  351. package/dist/preload/runtime/node-bindings.js +44 -0
  352. package/dist/preload/runtime/temp-files.js +9 -2
  353. package/dist/preload/runtime/wait-for-slot-root.d.ts +23 -0
  354. package/dist/preload/runtime/wait-for-slot-root.js +80 -0
  355. package/dist/preload/shared/api-compat.js +63 -41
  356. package/dist/preload/windows/host-dialog-runtime.cjs +360 -0
  357. package/dist/preload/windows/host-dialog-runtime.cjs.map +7 -0
  358. package/dist/preload/windows/host-dialog-runtime.d.ts +2 -0
  359. package/dist/preload/windows/host-dialog-runtime.js +13 -0
  360. package/dist/preload/windows/host-sidebar-runtime.cjs +361 -0
  361. package/dist/preload/windows/host-sidebar-runtime.cjs.map +7 -0
  362. package/dist/preload/windows/host-sidebar-runtime.d.ts +2 -0
  363. package/dist/preload/windows/host-sidebar-runtime.js +13 -0
  364. package/dist/preload/windows/host-toolbar-runtime.cjs +142 -52
  365. package/dist/preload/windows/host-toolbar-runtime.cjs.map +3 -3
  366. package/dist/preload/windows/main.cjs +4922 -1246
  367. package/dist/preload/windows/main.cjs.map +4 -4
  368. package/dist/preload/windows/main.css +428 -0
  369. package/dist/preload/windows/main.css.map +7 -0
  370. package/dist/preload/windows/simulator.cjs +376 -322
  371. package/dist/preload/windows/simulator.cjs.map +4 -4
  372. package/dist/preload/windows/simulator.js +376 -322
  373. package/dist/render-host/pageFrame.html +4 -4
  374. package/dist/render-host/preload.cjs +30 -0
  375. package/dist/render-host/render-inspect.js +184 -115
  376. package/dist/renderer/assets/button-CB2MWjHY.js +2 -0
  377. package/dist/renderer/assets/constants-CkoGPQTS.js +2 -0
  378. package/dist/renderer/assets/constants-zQZ2-y21.js +2 -0
  379. package/dist/renderer/assets/createLucideIcon-cZ9FlZZw.js +2 -0
  380. package/dist/renderer/assets/devicePicker-H2eIO4e1.js +2 -0
  381. package/dist/renderer/assets/dialog-pHzEA8Vx.js +46 -0
  382. package/dist/renderer/assets/dist-B5HADirS.js +2 -0
  383. package/dist/renderer/assets/dist-DIFlRMKe.js +2 -0
  384. package/dist/renderer/assets/hostSidebarDefault-DRWh6OCt.js +2 -0
  385. package/dist/renderer/assets/index-CEL_XFge.js +2 -0
  386. package/dist/renderer/assets/input-CAObw95L.js +2 -0
  387. package/dist/renderer/assets/ipc-channels-overlays-gIPUFnqc.js +2 -0
  388. package/dist/renderer/assets/jsx-runtime-DICEQH_0.css +1 -0
  389. package/dist/renderer/assets/jsx-runtime-DIw5wnYl.js +9 -0
  390. package/dist/renderer/assets/plus-BQ9u5EbL.js +2 -0
  391. package/dist/renderer/assets/popover-Cw7G2Ctp.js +2 -0
  392. package/dist/renderer/assets/presets-DMZOb9ay.js +2 -0
  393. package/dist/renderer/assets/project-api-YTOr_Yvo.js +2 -0
  394. package/dist/renderer/assets/projectCreateDialog-BmLqiYxn.js +2 -0
  395. package/dist/renderer/assets/search-BMvuYF48.js +2 -0
  396. package/dist/renderer/assets/select-nFP95TxM.js +2 -0
  397. package/dist/renderer/assets/settings-CnpVfSWt.js +2 -0
  398. package/dist/renderer/assets/settings-api-Ccsf-Nsj.js +2 -0
  399. package/dist/renderer/assets/settings-tab-bar-CAzrv32m.js +2 -0
  400. package/dist/renderer/assets/smartphone-Bb2GdIKy.js +2 -0
  401. package/dist/renderer/assets/tabs-CPKN3Mmq.js +2 -0
  402. package/dist/renderer/assets/tooltip-D6AxXRk5.js +2 -0
  403. package/dist/renderer/assets/types-Bh0hA7El.js +2 -0
  404. package/dist/renderer/assets/updateDialog-CwndJ0Bl.js +2 -0
  405. package/dist/renderer/assets/utils-sEB5OZEQ.js +2 -0
  406. package/dist/renderer/assets/view-api-B-2zPBR5.js +2 -0
  407. package/dist/renderer/assets/view-ids-BfaDVV5P.js +2 -0
  408. package/dist/renderer/assets/workbench-C0Jkdlps.js +5 -0
  409. package/dist/renderer/assets/workbenchSettings-YD0Ctbm_.js +8 -0
  410. package/dist/renderer/entries/device-picker/index.html +28 -0
  411. package/dist/renderer/entries/host-sidebar-default/index.html +22 -0
  412. package/dist/renderer/entries/main/index.html +16 -7
  413. package/dist/renderer/entries/popover/index.html +16 -6
  414. package/dist/renderer/entries/project-create-dialog/index.html +27 -0
  415. package/dist/renderer/entries/settings/index.html +10 -5
  416. package/dist/renderer/entries/tooltip/index.html +21 -0
  417. package/dist/renderer/entries/update-dialog/index.html +25 -0
  418. package/dist/renderer/entries/workbench/index.html +49 -0
  419. package/dist/renderer/entries/workbench-settings/index.html +12 -5
  420. package/dist/service-host/appdata-set-data.cjs +39 -0
  421. package/dist/service-host/host-env-update.cjs +23 -0
  422. package/dist/service-host/preload.cjs +54 -48
  423. package/dist/service-host/service-message-queue.cjs +71 -0
  424. package/dist/service-host/sync-impls/menu-button-geometry.js +16 -5
  425. package/dist/service-host/sync-impls/menu-button.js +5 -3
  426. package/dist/service-host/sync-impls/system-info.js +31 -9
  427. package/dist/shared/bridge-channels.d.ts +1 -416
  428. package/dist/shared/bridge-channels.js +1 -89
  429. package/dist/shared/compile-mode-state.d.ts +73 -0
  430. package/dist/shared/compile-mode-state.js +100 -0
  431. package/dist/shared/compile-modes.d.ts +152 -0
  432. package/dist/shared/compile-modes.js +237 -0
  433. package/dist/shared/constants.d.ts +22 -0
  434. package/dist/shared/constants.js +22 -0
  435. package/dist/shared/dmb-resource-url.d.ts +2 -0
  436. package/dist/shared/dmb-resource-url.js +2 -0
  437. package/dist/shared/ipc-channels-overlays.d.ts +162 -0
  438. package/dist/shared/ipc-channels-overlays.js +203 -0
  439. package/dist/shared/ipc-channels.d.ts +24 -154
  440. package/dist/shared/ipc-channels.js +48 -96
  441. package/dist/shared/ipc-schemas.d.ts +143 -54
  442. package/dist/shared/ipc-schemas.js +137 -45
  443. package/dist/shared/node-bindings.d.ts +2 -0
  444. package/dist/shared/node-bindings.js +2 -0
  445. package/dist/shared/project-window-types.d.ts +42 -0
  446. package/dist/shared/project-window-types.js +2 -0
  447. package/dist/shared/simulator-route.d.ts +8 -0
  448. package/dist/shared/simulator-route.js +15 -0
  449. package/dist/shared/simulator-ui.d.ts +61 -0
  450. package/dist/shared/simulator-ui.js +12 -0
  451. package/dist/shared/types.d.ts +126 -41
  452. package/dist/shared/view-ids.d.ts +10 -0
  453. package/dist/shared/view-ids.js +23 -0
  454. package/dist/simulator/assets/bridge-channels-B3JAmRfl.js +2 -0
  455. package/dist/simulator/assets/device-shell-ATEhHV2_.css +1 -0
  456. package/dist/simulator/assets/device-shell-DucLepkm.js +431 -0
  457. package/dist/simulator/assets/simulator-B4rbcOVt.js +10 -0
  458. package/dist/simulator/assets/simulator-mini-app-DFo7fhi5.js +2 -0
  459. package/dist/simulator/assets/simulator-ui-BupATgKo.css +1 -0
  460. package/dist/simulator/assets/simulator-ui-i3GCc7YJ.js +2 -0
  461. package/dist/simulator/simulator.html +4 -3
  462. package/dist/simulator/temp-files.d.ts +35 -0
  463. package/dist/simulator/temp-files.js +121 -0
  464. package/dist/simulator/types.d.ts +50 -0
  465. package/dist/simulator/types.js +2 -0
  466. package/dist/vscode-workbench/assets/__vite-browser-external-JIkWewFf.js +1 -0
  467. package/dist/vscode-workbench/assets/{dist-TpGpmMGi.js → dist-CXG-u1VB.js} +3 -3
  468. package/dist/vscode-workbench/assets/fs-core-worker-urls-DZ1nod84.js +1 -0
  469. package/dist/vscode-workbench/assets/fs-core.worker-Bnmpp6fo.js +1 -0
  470. package/dist/vscode-workbench/assets/fs-query.worker-cZ-7Fjch.js +2 -0
  471. package/dist/vscode-workbench/assets/{iconv-lite-umd-C9tiCAJa.js → iconv-lite-umd-Dxx9Qyb4.js} +1 -1
  472. package/dist/vscode-workbench/assets/{index-DJ1HyMZ7.js → index-6VJMsaWj.js} +475 -475
  473. package/dist/vscode-workbench/assets/{jschardet-DE1jV513.js → jschardet-Ba3D16vt.js} +1 -1
  474. package/dist/vscode-workbench/index.html +21 -1
  475. package/package.json +23 -13
  476. package/dist/main/services/views/destroy-child-view.d.ts +0 -9
  477. package/dist/main/services/views/destroy-child-view.js +0 -23
  478. package/dist/preload/instrumentation/wxml-extract.d.ts +0 -11
  479. package/dist/preload/instrumentation/wxml-extract.js +0 -382
  480. package/dist/preload/shared/sid-registry.d.ts +0 -11
  481. package/dist/preload/shared/sid-registry.js +0 -38
  482. package/dist/renderer/assets/constants-EAMiwL9_.js +0 -2
  483. package/dist/renderer/assets/index-BMqyDx71.js +0 -49
  484. package/dist/renderer/assets/input-CDAEwpBO.js +0 -2
  485. package/dist/renderer/assets/ipc-transport-B7eFOR68.css +0 -1
  486. package/dist/renderer/assets/ipc-transport-_G1k5V1p.js +0 -9
  487. package/dist/renderer/assets/popover-DEdjK14m.js +0 -2
  488. package/dist/renderer/assets/select-DpKPCh3y.js +0 -2
  489. package/dist/renderer/assets/settings-M5q2elUr.js +0 -2
  490. package/dist/renderer/assets/settings-api-CDlZoHiO.js +0 -2
  491. package/dist/renderer/assets/workbenchSettings-CT_H1WhV.js +0 -8
  492. package/dist/shared/appdata-accumulator.d.ts +0 -95
  493. package/dist/shared/appdata-accumulator.js +0 -218
  494. package/dist/shared/request-core.d.ts +0 -84
  495. package/dist/shared/request-core.js +0 -168
  496. package/dist/shared/simulator-api-metadata.d.ts +0 -26
  497. package/dist/shared/simulator-api-metadata.js +0 -59
  498. package/dist/shared/vpath.d.ts +0 -42
  499. package/dist/shared/vpath.js +0 -105
  500. package/dist/simulator/assets/bridge-channels-zhsumfky.js +0 -2
  501. package/dist/simulator/assets/device-shell-C-wcFq3Z.js +0 -2
  502. package/dist/simulator/assets/device-shell-CS1rqAQz.css +0 -1
  503. package/dist/simulator/assets/jsx-runtime-BDTY6fEq.js +0 -2
  504. package/dist/simulator/assets/simulator-DU3-fS3v.js +0 -10
  505. package/dist/simulator/assets/simulator-mini-app-DzfMfnVM.js +0 -2
  506. package/dist/simulator/device-shell/menu-button-geometry.js +0 -8
  507. package/dist/vscode-workbench/assets/__vite-browser-external-CXi6Kz9W.js +0 -1
@@ -1,16 +1,11 @@
1
- import { z } from 'zod';
1
+ import { createCompileModeManager, openCompileModeStoreAfterCompile } from './workspace-compile-modes.js';
2
+ import { rejectInvalidAppId, validateProjectDirSafe } from './open-project-guards.js';
2
3
  import * as repo from '../projects/project-repository.js';
3
- import { DEFAULT_COMPILE_CONFIG } from '../projects/types.js';
4
- import { clearSimulatorServicewechatReferer, setSimulatorServicewechatReferer, } from '../simulator/referer.js';
4
+ import { reportRebuildStatus } from './rebuild-status.js';
5
+ import { applyRefererForSession, clearRefererForSession } from './workspace-referer.js';
5
6
  import { loadWorkbenchSettings } from '../settings/index.js';
6
7
  import { createOpLock } from './op-lock.js';
7
- /**
8
- * Runtime guard for the adapter-return boundary: `session.appInfo` must carry a
9
- * NON-EMPTY string `appId` (the renderer scopes IPC by it; the bridge's
10
- * handleSpawn also rejects empty appIds, so accepting `''` would desync layers).
11
- * Loose: extra fields pass through — only the contract-critical `appId` is enforced.
12
- */
13
- const SessionAppInfoSchema = z.looseObject({ appId: z.string().min(1) });
8
+ import { createThumbnailOps } from './workspace-thumbnails.js';
14
9
  /** Build a workspace service bound to the given workbench context. */
15
10
  export function createWorkspaceService(ctx) {
16
11
  let currentSession = null;
@@ -75,7 +70,7 @@ export function createWorkspaceService(ctx) {
75
70
  try {
76
71
  if (!opLock.isOwner(mySeq))
77
72
  return true;
78
- clearSimulatorServicewechatReferer();
73
+ clearRefererForSession(currentSession, currentProjectPath);
79
74
  // Switching projects tears down the embedded workbench editor (mirrors one
80
75
  // project's disk; saves would else hit the wrong project) AND the native
81
76
  // simulator (its 'destroyed' hook owns the bridge session). Back-to-list
@@ -87,6 +82,8 @@ export function createWorkspaceService(ctx) {
87
82
  // Invalidate the outgoing onLog generation before teardown so the dying
88
83
  // worker's buffered lines can't pollute the incoming compile timeline.
89
84
  logGeneration++;
85
+ // Dies with the outgoing session — no-op when none is open.
86
+ compileModes.disposeCurrent();
90
87
  await disposeSession();
91
88
  currentProjectPath = '';
92
89
  lastClosedProjectPath = '';
@@ -97,17 +94,22 @@ export function createWorkspaceService(ctx) {
97
94
  }
98
95
  }
99
96
  /**
100
- * openProject critical section 2 — commit the new session under the lock, only
101
- * if still the latest request. Returns false when superseded (caller discards
102
- * the freshly-opened session instead of clobbering the newer one).
97
+ * openProject critical section 2 — commit the new session (and its
98
+ * compile-mode store handle) under the lock, only if still the latest
99
+ * request. Returns false when superseded (caller discards the
100
+ * freshly-opened session and store instead of clobbering the newer
101
+ * request's). `compileModes.adopt` must only run here, alongside
102
+ * `currentSession`/`currentProjectPath`, so the "current store" and
103
+ * "current session" always switch together.
103
104
  */
104
- async function runOpenCommit(mySeq, session, projectPath) {
105
+ async function runOpenCommit(mySeq, session, projectPath, store) {
105
106
  const release = await opLock.acquire();
106
107
  try {
107
108
  if (!opLock.isOwner(mySeq))
108
109
  return false;
109
110
  currentSession = session;
110
111
  currentProjectPath = projectPath;
112
+ compileModes.adopt(store);
111
113
  return true;
112
114
  }
113
115
  finally {
@@ -120,21 +122,16 @@ export function createWorkspaceService(ctx) {
120
122
  * a superseded session's buffered lines.
121
123
  */
122
124
  async function runCompile(projectPath, sessionGeneration) {
123
- const { compile } = loadWorkbenchSettings();
125
+ const { compile, preview } = loadWorkbenchSettings();
124
126
  try {
125
127
  const session = await ctx.adapter.openProject({
126
128
  projectPath,
127
129
  sourcemap: true,
128
130
  fileTypes: ctx.fileTypes,
129
- watch: compile.watch,
130
- onRebuild: () => {
131
- // getProjectPages never throws — failure yields the empty-pages
132
- // shape. Empty means "read failed or degenerate project" (a valid
133
- // app.json names ≥1 page) and is withheld so the renderer keeps its
134
- // previous dropdown instead of blanking; the push is never blocked.
135
- const { pages } = repo.getProjectPages(projectPath);
136
- sendStatus('ready', '编译完成,已重启', true, pages.length ? pages : undefined);
137
- },
131
+ // Two independent gates: autoBuild = recompile on save; autoReload = reflect the rebuild in the simulator afterwards (off ⇒ page/form state survives). A style-only rebuild takes the in-place stylesheet hot-swap path (see reportRebuildStatus); any other change does a full reload.
132
+ watch: compile.autoBuild,
133
+ autoReload: preview.autoReload,
134
+ onRebuild: info => reportRebuildStatus(info, { projectPath, repo, autoReload: preview.autoReload, refreshSimulatorStyles: ctx.views.refreshSimulatorStyles, sendStatus }),
138
135
  onBuildError: (err) => sendStatus('error', String(err)),
139
136
  // Watcher died mid-session (EMFILE, permission loss, …): non-fatal, so 'ready' stays but `watcher: 'dead'` flags that saves no longer auto-rebuild.
140
137
  onWatcherError: () => sendStatus('ready', '文件监听已停止,保存不再触发自动编译', false, undefined, true),
@@ -147,46 +144,46 @@ export function createWorkspaceService(ctx) {
147
144
  return { session };
148
145
  }
149
146
  catch (err) {
150
- clearSimulatorServicewechatReferer();
147
+ // No appId resolved for this attempt; the outgoing project's own entry
148
+ // was already cleared by runOpenTeardown, so there is nothing to clear.
151
149
  return { error: String(err) };
152
150
  }
153
151
  }
154
- /**
155
- * Adapter-return boundary: a session without a string appId can't be driven by
156
- * the renderer, so it must never become active. Close the live resources the
157
- * adapter already spun up (best-effort) and return the error message; null when
158
- * valid.
159
- */
160
- async function rejectInvalidAppId(session) {
161
- if (SessionAppInfoSchema.safeParse(session.appInfo).success)
162
- return null;
163
- try {
164
- await session.close();
165
- }
166
- catch (closeErr) {
167
- console.warn('[workspace] closing appId-less adapter session failed (non-fatal):', closeErr);
168
- }
169
- return 'adapter returned session.appInfo without a string appId — '
170
- + 'the CompilationAdapter must supply appInfo.appId';
171
- }
172
- function applyRefererFromSession(session) {
173
- const appInfo = session.appInfo;
174
- if (appInfo && typeof appInfo.appId === 'string' && appInfo.appId.length > 0) {
175
- setSimulatorServicewechatReferer(appInfo.appId, typeof appInfo.version === 'string' ? appInfo.version : undefined);
176
- }
177
- }
178
152
  // Delegate to the host-injected (or default LocalProjectsProvider)
179
153
  // ProjectsProvider on the context. When the host omits an optional method,
180
154
  // we apply a safe documented default — never silently fall back to
181
155
  // `repo.*`, because a remote provider's project paths are not on the local
182
156
  // filesystem.
183
157
  const provider = ctx.projectsProvider;
158
+ // Owner of whichever project's compile modes are currently open; disposed/
159
+ // replaced alongside the session (teardown, openProject failures, close).
160
+ const compileModes = createCompileModeManager(provider, (change) => ctx.notify.compileModesChanged(change));
161
+ const thumbnails = createThumbnailOps({
162
+ ctx,
163
+ provider,
164
+ getSession: () => currentSession,
165
+ getProjectPath: () => currentProjectPath,
166
+ });
184
167
  return {
185
168
  listProjects: async () => provider.listProjects(),
186
169
  addProject: async (dirPath) => provider.addProject(dirPath),
187
170
  removeProject: async (dirPath) => {
188
171
  await provider.removeProject(dirPath);
189
172
  },
173
+ updateProject: async (dirPath, patch) => {
174
+ const projects = await provider.listProjects();
175
+ const existing = projects.find((p) => p.path === dirPath);
176
+ if (!existing)
177
+ throw new Error(`No such project: ${dirPath}`);
178
+ // A provider without `updateProject` cannot persist the edit. Returning
179
+ // the record unchanged would look like a successful save to the
180
+ // renderer (dialog closes, list reloads) while silently discarding the
181
+ // user's input, so this must fail loudly instead.
182
+ if (!provider.updateProject) {
183
+ throw new Error('当前宿主不支持编辑项目');
184
+ }
185
+ return provider.updateProject(dirPath, patch);
186
+ },
190
187
  hasProject: async (dirPath) => {
191
188
  const projects = await provider.listProjects();
192
189
  return projects.some((p) => p.path === dirPath);
@@ -215,7 +212,14 @@ export function createWorkspaceService(ctx) {
215
212
  // in-flight one; ownerSeq only grows, so a late-resolving earlier request
216
213
  // can't clobber a later one that already took over).
217
214
  opLock.takeOwnership(mySeq);
215
+ // Defer the workbench editor's heavy attach while this open's
216
+ // boot-critical window (old-session teardown + first compile) runs.
217
+ // The release is idempotent and bound to this hold, so every exit path
218
+ // below releases unconditionally; the gate's own cap timer backstops
219
+ // any future path that forgets to.
220
+ const releaseWorkbenchHold = ctx.views.holdWorkbenchAttach();
218
221
  if (await runOpenTeardown(mySeq)) {
222
+ releaseWorkbenchHold();
219
223
  return { success: false, error: 'superseded by a newer project open/close' };
220
224
  }
221
225
  // Reject obviously broken projects up front so we never spin up a
@@ -225,10 +229,9 @@ export function createWorkspaceService(ctx) {
225
229
  // `fetch(…).then(r=>r.text()).then(JSON.parse)` pipeline dies on the
226
230
  // dev server's HTML SPA fallback with
227
231
  // `SyntaxError: Unexpected token '<', "<!doctype "…`.
228
- const dirError = provider.validateProjectDir
229
- ? await provider.validateProjectDir(projectPath)
230
- : null;
232
+ const dirError = await validateProjectDirSafe(provider, projectPath);
231
233
  if (dirError) {
234
+ releaseWorkbenchHold();
232
235
  sendStatus('error', dirError);
233
236
  return { success: false, error: dirError };
234
237
  }
@@ -237,20 +240,35 @@ export function createWorkspaceService(ctx) {
237
240
  // generation — runCompile's onLog closure checks it per line.
238
241
  const sessionGeneration = ++logGeneration;
239
242
  const compiled = await runCompile(projectPath, sessionGeneration);
243
+ // The compile settling — success OR failure — ends the boot-critical
244
+ // window (a failed compile is when the user needs the editor most).
245
+ releaseWorkbenchHold();
240
246
  if ('error' in compiled) {
241
247
  sendStatus('error', compiled.error);
242
248
  return { success: false, error: compiled.error };
243
249
  }
244
250
  const session = compiled.session;
251
+ // Opened right after compile as a standalone handle — not yet current;
252
+ // every failure branch below disposes THIS handle, never the current
253
+ // store, since this open may no longer own "current" by the time it
254
+ // gets here.
255
+ const opened = await openCompileModeStoreAfterCompile(compileModes, projectPath, session);
256
+ if ('error' in opened) {
257
+ sendStatus('error', opened.error);
258
+ return { success: false, error: opened.error };
259
+ }
260
+ const store = opened.store;
245
261
  const appIdError = await rejectInvalidAppId(session);
246
262
  if (appIdError) {
263
+ store.dispose();
247
264
  sendStatus('error', appIdError);
248
265
  return { success: false, error: appIdError };
249
266
  }
250
- if (!(await runOpenCommit(mySeq, session, projectPath))) {
251
- // Superseded during the compile above — discard the freshly-opened
252
- // session (close its live compile/dev-server) rather than clobber the
253
- // newer request.
267
+ if (!(await runOpenCommit(mySeq, session, projectPath, store))) {
268
+ // Superseded — discard the freshly-opened session and its own store
269
+ // handle rather than clobber the newer request's (already-adopted)
270
+ // current store.
271
+ store.dispose();
254
272
  try {
255
273
  await session.close();
256
274
  }
@@ -264,7 +282,7 @@ export function createWorkspaceService(ctx) {
264
282
  provider.updateLastOpened(projectPath);
265
283
  });
266
284
  bestEffort('sendStatus', () => sendStatus('ready', '编译完成'));
267
- bestEffort('applyReferer', () => applyRefererFromSession(session));
285
+ bestEffort('applyReferer', () => applyRefererForSession(session, projectPath));
268
286
  return {
269
287
  success: true,
270
288
  port: session.port,
@@ -273,9 +291,9 @@ export function createWorkspaceService(ctx) {
273
291
  },
274
292
  async closeProject() {
275
293
  // Claim a request seq and take ownership immediately (close has no veto),
276
- // then serialize against a concurrent openProject: disposeAll() must not
277
- // run while an open is mid-teardown/commit (it would tear down the views
278
- // the open is building).
294
+ // then serialize against a concurrent openProject: disposeProjectViews()
295
+ // must not run while an open is mid-teardown/commit (it would tear down
296
+ // the views the open is building).
279
297
  const mySeq = opLock.nextSeq();
280
298
  opLock.takeOwnership(mySeq);
281
299
  const release = await opLock.acquire();
@@ -286,6 +304,11 @@ export function createWorkspaceService(ctx) {
286
304
  // we meant to close.
287
305
  if (!opLock.isOwner(mySeq))
288
306
  return;
307
+ // Void any in-flight open's workbench attach hold BEFORE the teardown
308
+ // awaits below: the superseded open's compile can settle mid-close, and
309
+ // its release (or the gate's cap) must not rebuild the editor view for
310
+ // a project that is being closed.
311
+ ctx.views.cancelWorkbenchAttachHold();
289
312
  // Mark the close in progress BEFORE disposeSession nulls currentSession,
290
313
  // so bridge getters refuse to resolve the dying session during the
291
314
  // session.close() await (cleared in the finally once views are gone).
@@ -293,14 +316,18 @@ export function createWorkspaceService(ctx) {
293
316
  // Invalidate the active session's onLog BEFORE teardown starts — lines
294
317
  // flushed by the dying compile worker must not reach the panel.
295
318
  logGeneration++;
296
- clearSimulatorServicewechatReferer();
319
+ compileModes.disposeCurrent(); // dies with the session
320
+ clearRefererForSession(currentSession, currentProjectPath);
297
321
  await disposeSession();
298
322
  // Record the root being torn down BEFORE clearing it, so a teardown/
299
323
  // debounced write already in flight can still be accepted against it.
300
324
  if (currentProjectPath !== '')
301
325
  lastClosedProjectPath = currentProjectPath;
302
326
  currentProjectPath = '';
303
- ctx.views.disposeAll();
327
+ // Project-scoped views only. The host toolbar is HOST-scoped and must
328
+ // survive closing a project — its full teardown (disposeAll) runs from
329
+ // the context registry at app teardown instead.
330
+ ctx.views.disposeProjectViews();
304
331
  }
305
332
  finally {
306
333
  closing = false;
@@ -312,85 +339,19 @@ export function createWorkspaceService(ctx) {
312
339
  getLastClosedProjectPath: () => lastClosedProjectPath,
313
340
  hasActiveSession: () => currentSession !== null,
314
341
  isClosing: () => closing,
315
- async captureThumbnail(projectPath) {
316
- if (!currentSession || projectPath !== currentProjectPath)
317
- return null;
318
- const simulatorWc = ctx.views.getSimulatorWebContents();
319
- if (!simulatorWc)
320
- return null;
321
- if (ctx.views.getSimulatorProjectPath() !== projectPath)
322
- return null;
323
- const session = currentSession;
324
- // Capture the active render-host guest (the mini-program content); the
325
- // simulator WCV only holds the device-shell chrome. In native-host with no
326
- // active guest (not mounted / mid page-switch / destroyed) return null
327
- // rather than persist a device-shell frame as the page — that wrong-content
328
- // frame is the bug this path exists to avoid. Non-native-host: the sim WCV.
329
- const bridge = ctx.bridge;
330
- const nativeHost = bridge?.isNativeHost() ?? false;
331
- const renderGuest = nativeHost ? (bridge?.getActiveRenderWc() ?? null) : null;
332
- if (nativeHost && !renderGuest)
333
- return null;
334
- const captureTarget = renderGuest ?? simulatorWc;
335
- // A destroyed target means teardown is in flight (no valid frame) — return
336
- // null rather than let capturePage() throw indistinguishably into the catch.
337
- if (captureTarget.isDestroyed())
338
- return null;
339
- try {
340
- const image = await captureTarget.capturePage();
341
- if (currentSession !== session
342
- || currentProjectPath !== projectPath
343
- || ctx.views.getSimulatorWebContents() !== simulatorWc
344
- || ctx.views.getSimulatorProjectPath() !== projectPath
345
- // Captured target must still be the live one: a guest that navigated
346
- // mid-capture would otherwise persist a frame from the wrong page.
347
- || (nativeHost ? (bridge?.getActiveRenderWc() ?? null) : simulatorWc) !== captureTarget) {
348
- return null;
349
- }
350
- const dataUrl = `data:image/png;base64,${image.toPNG().toString('base64')}`;
351
- if (provider.saveThumbnail) {
352
- await provider.saveThumbnail(projectPath, dataUrl);
353
- }
354
- // Always hand the renderer back the freshly-captured frame so the
355
- // UI updates immediately even if the host's saveThumbnail is
356
- // async or stores out-of-band.
357
- return dataUrl;
358
- }
359
- catch {
360
- return null;
361
- }
362
- },
363
- async getThumbnail(projectPath) {
364
- if (provider.getThumbnail) {
365
- return (await provider.getThumbnail(projectPath)) ?? null;
366
- }
367
- return null;
368
- },
342
+ captureThumbnail: thumbnails.captureThumbnail,
343
+ getThumbnail: thumbnails.getThumbnail,
369
344
  // `getProjectPages` reads the project's own `app.json` from disk and is
370
345
  // independent of the project registry — it stays on the repo helper.
371
346
  getProjectPages: (projectPath) => repo.getProjectPages(projectPath),
372
- getCompileConfig: async (projectPath) => (provider.getCompileConfig
373
- ? await provider.getCompileConfig(projectPath)
374
- : DEFAULT_COMPILE_CONFIG),
375
- saveCompileConfig: async (projectPath, config) => {
376
- if (provider.saveCompileConfig) {
377
- await provider.saveCompileConfig(projectPath, config);
378
- }
379
- // No persistence when the host opts out; the renderer's edits then
380
- // do not survive a reload, matching the documented contract.
381
- },
347
+ getCompileConfig: (projectPath) => compileModes.getCompileConfig(projectPath),
348
+ saveCompileConfig: (projectPath, config) => compileModes.saveCompileConfig(projectPath, config),
349
+ getCompileModeState: (projectPath) => compileModes.getCompileModeState(projectPath),
350
+ applyCompileModeCommand: (command) => compileModes.applyCompileModeCommand(command),
382
351
  // Per-project settings (uploadWithSourceMap etc.) live in the project's
383
352
  // own `project.config.json`, not the registry — keep direct repo calls.
384
353
  getProjectSettings: (projectPath) => repo.getProjectSettings(projectPath),
385
354
  updateProjectSettings: (projectPath, patch) => repo.updateProjectSettings(projectPath, patch),
386
- getLaunchConfigs: async (p) => (provider.getLaunchConfigs ? await provider.getLaunchConfigs(p) : []),
387
- saveLaunchConfigs: async (p, c) => { if (provider.saveLaunchConfigs)
388
- await provider.saveLaunchConfigs(p, c); },
389
- getActiveLaunchConfigId: async (p) => provider.getActiveLaunchConfigId ? await provider.getActiveLaunchConfigId(p) : null,
390
- saveActiveLaunchConfigId: async (p, id) => {
391
- if (provider.saveActiveLaunchConfigId)
392
- await provider.saveActiveLaunchConfigId(p, id);
393
- },
394
355
  };
395
356
  }
396
357
  //# sourceMappingURL=workspace-service.js.map
@@ -0,0 +1,22 @@
1
+ import type { ProjectSession } from '../../../shared/types.js';
2
+ import type { BridgeRouterHandle } from '../../ipc/bridge-router.js';
3
+ import type { ViewManager } from '../views/view-manager.js';
4
+ import type { ProjectsProvider } from '../projects/types.js';
5
+ import type { WorkspaceService } from './workspace-service.js';
6
+ /**
7
+ * `captureThumbnail`/`getThumbnail` split out of WorkspaceService purely to keep
8
+ * workspace-service.ts under the repo's file-length gate — the semantics (session/
9
+ * project-path ownership, provider round-trip) still belong entirely to that service.
10
+ * Takes a narrow slice of WorkbenchContext (views + bridge) rather than the whole
11
+ * grab-bag type, so this split doesn't grow the WorkbenchContext-import ratchet.
12
+ */
13
+ export declare function createThumbnailOps(input: {
14
+ ctx: {
15
+ views: Pick<ViewManager, 'getSimulatorWebContents' | 'getSimulatorProjectPath'>;
16
+ bridge?: BridgeRouterHandle;
17
+ };
18
+ provider: ProjectsProvider;
19
+ getSession(): ProjectSession | null;
20
+ getProjectPath(): string;
21
+ }): Pick<WorkspaceService, 'captureThumbnail' | 'getThumbnail'>;
22
+ //# sourceMappingURL=workspace-thumbnails.d.ts.map
@@ -0,0 +1,67 @@
1
+ /**
2
+ * `captureThumbnail`/`getThumbnail` split out of WorkspaceService purely to keep
3
+ * workspace-service.ts under the repo's file-length gate — the semantics (session/
4
+ * project-path ownership, provider round-trip) still belong entirely to that service.
5
+ * Takes a narrow slice of WorkbenchContext (views + bridge) rather than the whole
6
+ * grab-bag type, so this split doesn't grow the WorkbenchContext-import ratchet.
7
+ */
8
+ export function createThumbnailOps(input) {
9
+ const { ctx, provider, getSession, getProjectPath } = input;
10
+ return {
11
+ async captureThumbnail(projectPath) {
12
+ if (!getSession() || projectPath !== getProjectPath())
13
+ return null;
14
+ const simulatorWc = ctx.views.getSimulatorWebContents();
15
+ if (!simulatorWc)
16
+ return null;
17
+ if (ctx.views.getSimulatorProjectPath() !== projectPath)
18
+ return null;
19
+ const session = getSession();
20
+ // Capture the active render-host guest (the mini-program content); the
21
+ // simulator WCV only holds the device-shell chrome. In native-host with no
22
+ // active guest (not mounted / mid page-switch / destroyed) return null
23
+ // rather than persist a device-shell frame as the page — that wrong-content
24
+ // frame is the bug this path exists to avoid. Non-native-host: the sim WCV.
25
+ const bridge = ctx.bridge;
26
+ const nativeHost = bridge?.isNativeHost() ?? false;
27
+ const renderGuest = nativeHost ? (bridge?.getActiveRenderWc() ?? null) : null;
28
+ if (nativeHost && !renderGuest)
29
+ return null;
30
+ const captureTarget = renderGuest ?? simulatorWc;
31
+ // A destroyed target means teardown is in flight (no valid frame) — return
32
+ // null rather than let capturePage() throw indistinguishably into the catch.
33
+ if (captureTarget.isDestroyed())
34
+ return null;
35
+ try {
36
+ const image = await captureTarget.capturePage();
37
+ if (getSession() !== session
38
+ || getProjectPath() !== projectPath
39
+ || ctx.views.getSimulatorWebContents() !== simulatorWc
40
+ || ctx.views.getSimulatorProjectPath() !== projectPath
41
+ // Captured target must still be the live one: a guest that navigated
42
+ // mid-capture would otherwise persist a frame from the wrong page.
43
+ || (nativeHost ? (bridge?.getActiveRenderWc() ?? null) : simulatorWc) !== captureTarget) {
44
+ return null;
45
+ }
46
+ const dataUrl = `data:image/png;base64,${image.toPNG().toString('base64')}`;
47
+ if (provider.saveThumbnail) {
48
+ await provider.saveThumbnail(projectPath, dataUrl);
49
+ }
50
+ // Always hand the renderer back the freshly-captured frame so the
51
+ // UI updates immediately even if the host's saveThumbnail is
52
+ // async or stores out-of-band.
53
+ return dataUrl;
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ },
59
+ async getThumbnail(projectPath) {
60
+ if (provider.getThumbnail) {
61
+ return (await provider.getThumbnail(projectPath)) ?? null;
62
+ }
63
+ return null;
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=workspace-thumbnails.js.map
@@ -0,0 +1,40 @@
1
+ import type { WebContents } from 'electron';
2
+ import type { SenderPolicy } from './ipc-registry.js';
3
+ /**
4
+ * Resolves which window context owns an incoming IPC sender.
5
+ *
6
+ * `register*Ipc` takes one of these instead of a bare context so a single
7
+ * handler body serves both shapes: one window (every accepted sender maps to
8
+ * that window's context) and several windows (each message is answered by the
9
+ * context of the window it actually came from).
10
+ */
11
+ export interface IpcContextSource<T> {
12
+ /**
13
+ * Set only by the adapter over a context that carries no `senderPolicy` —
14
+ * narrow test contexts. It keeps {@link IpcRegistry} in its policy-less mode
15
+ * (accept every sender, skip the main-frame check), so wrapping such a
16
+ * context in a source is not itself a trust change.
17
+ */
18
+ readonly ungated?: boolean;
19
+ /** The context owning `sender`, or null when no context claims it. */
20
+ resolve(sender: WebContents): T | null;
21
+ /** Every context this source can hand out. */
22
+ list(): T[];
23
+ }
24
+ /**
25
+ * What every `register*Ipc` accepts: a router covering all live windows, or a
26
+ * single context standing in for itself.
27
+ */
28
+ export type IpcInput<T> = T | IpcContextSource<T>;
29
+ /** Structural test: a source exposes both members, a context exposes neither. */
30
+ export declare function isIpcContextSource<T>(value: unknown): value is IpcContextSource<T>;
31
+ /**
32
+ * Accept either a source or a single context. A single context gates on its
33
+ * own `senderPolicy` — the same predicate a policy-only registry applies — and
34
+ * owns every sender that predicate accepts. A context without a policy stays
35
+ * ungated so narrow test contexts keep the behaviour a bare registry gave them.
36
+ */
37
+ export declare function toIpcContextSource<T extends {
38
+ senderPolicy?: SenderPolicy;
39
+ }>(input: T | IpcContextSource<T>): IpcContextSource<T>;
40
+ //# sourceMappingURL=ipc-context-source.d.ts.map
@@ -0,0 +1,23 @@
1
+ /** Structural test: a source exposes both members, a context exposes neither. */
2
+ export function isIpcContextSource(value) {
3
+ if (value == null || typeof value !== 'object')
4
+ return false;
5
+ const candidate = value;
6
+ return typeof candidate.resolve === 'function' && typeof candidate.list === 'function';
7
+ }
8
+ /**
9
+ * Accept either a source or a single context. A single context gates on its
10
+ * own `senderPolicy` — the same predicate a policy-only registry applies — and
11
+ * owns every sender that predicate accepts. A context without a policy stays
12
+ * ungated so narrow test contexts keep the behaviour a bare registry gave them.
13
+ */
14
+ export function toIpcContextSource(input) {
15
+ if (isIpcContextSource(input))
16
+ return input;
17
+ const ctx = input;
18
+ const policy = ctx.senderPolicy;
19
+ if (!policy)
20
+ return { ungated: true, resolve: () => ctx, list: () => [ctx] };
21
+ return { resolve: (sender) => (policy(sender) ? ctx : null), list: () => [ctx] };
22
+ }
23
+ //# sourceMappingURL=ipc-context-source.js.map
@@ -1,6 +1,7 @@
1
- import type { IpcMainEvent, WebContents } from 'electron';
1
+ import type { IpcMainEvent, IpcMainInvokeEvent } from 'electron';
2
2
  import { ipcMain } from 'electron';
3
- import { type Disposable } from '@dimina-kit/electron-deck/main';
3
+ import { type Disposable, type IpcSenderPolicy } from '@dimina-kit/electron-deck/main';
4
+ import type { IpcContextSource } from './ipc-context-source.js';
4
5
  type HandleFn = Parameters<typeof ipcMain.handle>[1];
5
6
  type ListenerFn = Parameters<typeof ipcMain.on>[1];
6
7
  /**
@@ -9,39 +10,63 @@ type ListenerFn = Parameters<typeof ipcMain.on>[1];
9
10
  * Returns true when the calling WebContents is allowed to invoke / emit on
10
11
  * the channel, false otherwise.
11
12
  */
12
- export type SenderPolicy = (sender: WebContents) => boolean;
13
+ export type SenderPolicy = IpcSenderPolicy;
13
14
  /**
14
15
  * Tiny fluent helper that wraps every `ipcMain.handle` / `ipcMain.on` with a
15
16
  * matching removeHandler/removeListener registered into an internal registry.
16
17
  *
17
- * Each `register*Ipc(ctx)` returns one of these as a Disposable so the
18
+ * Each `register*Ipc(...)` returns one of these as a Disposable so the
18
19
  * workbench-level registry can dispose all built-in handlers in one shot.
19
20
  *
20
- * If a {@link SenderPolicy} is provided, every incoming invocation is gated:
21
- * - `handle`: rejected senders cause the invoke promise to reject with
22
- * `Error('IPC sender rejected for channel <channel>')`.
23
- * - `on`: rejected senders are silently dropped (the original listener is
24
- * never called).
25
- * In both cases a single `console.warn` is emitted with the channel name
26
- * and a short sender summary. Without a policy the wrapper is a no-op,
27
- * preserving backwards compatibility for unit tests and callers that
28
- * opted out.
21
+ * The constructor takes either a {@link SenderPolicy} (trust only: is this
22
+ * sender allowed?) or an {@link IpcContextSource} (trust plus ownership: which
23
+ * window context does this sender belong to?). With either, every incoming
24
+ * invocation is gated:
25
+ * - `handle` / `handleRouted`: rejected senders cause the invoke promise to
26
+ * reject with `Error('IPC sender rejected for channel <channel>')`.
27
+ * - `on` / `onRouted`: rejected senders are silently dropped (the original
28
+ * listener is never called).
29
+ * - `handleSync` / `handleSyncRouted`: rejected senders get a structured
30
+ * `{ ok: false, code: 'EREJECTED', … }` returnValue, because sendSync blocks
31
+ * the renderer until one is set.
32
+ * In every case a single `console.warn` is emitted with the channel name and a
33
+ * short sender summary. With no policy — or a source that declares itself
34
+ * `ungated` — the wrapper is a pass-through, preserving backwards
35
+ * compatibility for unit tests and callers that opted out.
36
+ *
37
+ * The `*Routed` variants hand the owning context to the handler as its first
38
+ * argument. `TCtx` is `never` unless the registry was built from a source, so
39
+ * they are unusable (and unreachable) on a policy-only registry.
29
40
  */
30
- export declare class IpcRegistry implements Disposable {
31
- private policy?;
32
- private registry;
33
- constructor(policy?: SenderPolicy | undefined);
41
+ export declare class IpcRegistry<TCtx = never> implements Disposable {
42
+ private cleanups;
43
+ private _disposed;
44
+ private readonly policy;
45
+ private readonly source;
46
+ /** False reproduces the policy-less pass-through exactly: no main-frame
47
+ * check, and a synchronous handler keeps its synchronous return value. */
48
+ private readonly gated;
49
+ constructor(policyOrSource?: SenderPolicy | IpcContextSource<TCtx>);
50
+ /** Trust gate and owner resolution for one incoming message. */
51
+ private admit;
52
+ private warnRejected;
53
+ private addInvokeHandler;
34
54
  handle(channel: string, fn: HandleFn): this;
55
+ /** {@link handle} answered by the context that owns the calling sender. */
56
+ handleRouted(channel: string, fn: (ctx: TCtx, event: IpcMainInvokeEvent, ...args: unknown[]) => unknown): this;
57
+ private addSyncHandler;
35
58
  /**
36
59
  * Register a SYNCHRONOUS `ipcRenderer.sendSync` handler. Unlike {@link on}
37
60
  * (fire-and-forget), the renderer is blocked until we set `event.returnValue`,
38
- * so `fn` MUST be synchronous and return the value to hand back. The sender
39
- * policy gates it like {@link handle}; a rejected sender or a thrown error
40
- * yields a structured `{ ok: false, code, message }` returnValue instead of
41
- * the silent drop `on` uses, so the blocked renderer always gets an answer.
61
+ * so `fn` MUST be synchronous and return the value to hand back.
42
62
  */
43
63
  handleSync(channel: string, fn: (event: IpcMainEvent, ...args: unknown[]) => unknown): this;
64
+ /** {@link handleSync} answered by the context that owns the calling sender. */
65
+ handleSyncRouted(channel: string, fn: (ctx: TCtx, event: IpcMainEvent, ...args: unknown[]) => unknown): this;
66
+ private addListener;
44
67
  on(channel: string, fn: ListenerFn): this;
68
+ /** {@link on} answered by the context that owns the calling sender. */
69
+ onRouted(channel: string, fn: (ctx: TCtx, event: IpcMainEvent, ...args: unknown[]) => unknown): this;
45
70
  dispose(): Promise<void>;
46
71
  }
47
72
  export {};