@dimina-kit/devtools 0.3.2-dev.20260525152421 → 0.3.2-dev.20260610082053

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 (295) hide show
  1. package/README.md +43 -40
  2. package/dist/main/api.d.ts +0 -1
  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 +247 -110
  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 +6607 -2102
  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 +1300 -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 +57 -0
  19. package/dist/main/ipc/project-fs.js +448 -0
  20. package/dist/main/ipc/projects.d.ts +1 -1
  21. package/dist/main/ipc/session.d.ts +1 -1
  22. package/dist/main/ipc/settings.d.ts +1 -1
  23. package/dist/main/ipc/simulator-module.d.ts +6 -0
  24. package/dist/main/ipc/simulator-module.js +11 -1
  25. package/dist/main/ipc/simulator.d.ts +2 -2
  26. package/dist/main/ipc/simulator.js +49 -5
  27. package/dist/main/ipc/toolbar.d.ts +1 -1
  28. package/dist/main/ipc/views.d.ts +19 -0
  29. package/dist/main/ipc/views.js +65 -0
  30. package/dist/main/runtime/devtools-backend.d.ts +17 -0
  31. package/dist/main/runtime/devtools-backend.js +49 -0
  32. package/dist/main/runtime/miniapp-runtime.d.ts +39 -0
  33. package/dist/main/runtime/miniapp-runtime.js +17 -0
  34. package/dist/main/services/automation/exec.d.ts +27 -2
  35. package/dist/main/services/automation/exec.js +37 -3
  36. package/dist/main/services/automation/handlers/app.js +127 -11
  37. package/dist/main/services/automation/handlers/page.js +36 -19
  38. package/dist/main/services/automation/index.js +40 -13
  39. package/dist/main/services/automation/wait-active-page.d.ts +56 -0
  40. package/dist/main/services/automation/wait-active-page.js +71 -0
  41. package/dist/main/services/console-forward/index.d.ts +36 -0
  42. package/dist/main/services/console-forward/index.js +81 -0
  43. package/dist/main/services/dimina-resource-server.d.ts +7 -0
  44. package/dist/main/services/dimina-resource-server.js +99 -0
  45. package/dist/main/services/elements-forward/index.d.ts +66 -0
  46. package/dist/main/services/elements-forward/index.js +583 -0
  47. package/dist/main/services/layout/index.d.ts +23 -1
  48. package/dist/main/services/layout/index.js +28 -3
  49. package/dist/main/services/mcp/index.d.ts +1 -0
  50. package/dist/main/services/mcp/index.js +3 -0
  51. package/dist/main/services/mcp/server.d.ts +1 -1
  52. package/dist/main/services/mcp/server.js +1 -1
  53. package/dist/main/services/mcp/target-manager.d.ts +35 -0
  54. package/dist/main/services/mcp/target-manager.js +63 -1
  55. package/dist/main/services/mcp/tools/context-tools.js +15 -1
  56. package/dist/main/services/module.d.ts +1 -1
  57. package/dist/main/services/network-forward/index.d.ts +190 -0
  58. package/dist/main/services/network-forward/index.js +765 -0
  59. package/dist/main/services/notifications/renderer-notifier.d.ts +11 -0
  60. package/dist/main/services/notifications/renderer-notifier.js +7 -1
  61. package/dist/main/services/render-inspect/index.d.ts +41 -0
  62. package/dist/main/services/render-inspect/index.js +88 -0
  63. package/dist/main/services/safe-area/index.d.ts +17 -0
  64. package/dist/main/services/safe-area/index.js +59 -0
  65. package/dist/main/services/service-host-pool/pool.d.ts +197 -0
  66. package/dist/main/services/service-host-pool/pool.js +364 -0
  67. package/dist/main/services/simulator/custom-apis.d.ts +34 -0
  68. package/dist/main/services/simulator/custom-apis.js +22 -0
  69. package/dist/main/services/simulator-appdata/index.d.ts +35 -0
  70. package/dist/main/services/simulator-appdata/index.js +71 -0
  71. package/dist/main/services/simulator-current-page/index.d.ts +24 -0
  72. package/dist/main/services/simulator-current-page/index.js +19 -0
  73. package/dist/main/services/simulator-storage/index.d.ts +37 -2
  74. package/dist/main/services/simulator-storage/index.js +209 -32
  75. package/dist/main/services/simulator-storage/service-storage-ops.d.ts +40 -0
  76. package/dist/main/services/simulator-storage/service-storage-ops.js +67 -0
  77. package/dist/main/services/simulator-temp-files/fs-channels.js +1 -1
  78. package/dist/main/services/simulator-temp-files/index.d.ts +1 -1
  79. package/dist/main/services/simulator-temp-files/index.js +1 -1
  80. package/dist/main/services/simulator-temp-files/request-handler.js +1 -1
  81. package/dist/main/services/simulator-wxml/index.d.ts +29 -0
  82. package/dist/main/services/simulator-wxml/index.js +28 -0
  83. package/dist/main/services/update/update-manager.d.ts +10 -0
  84. package/dist/main/services/update/update-manager.js +16 -3
  85. package/dist/main/services/views/devtools-tabs.d.ts +47 -0
  86. package/dist/main/services/views/devtools-tabs.js +95 -0
  87. package/dist/main/services/views/view-manager.d.ts +142 -4
  88. package/dist/main/services/views/view-manager.js +909 -17
  89. package/dist/main/services/workbench-context.d.ts +66 -1
  90. package/dist/main/services/workbench-context.js +6 -1
  91. package/dist/main/services/workspace/workspace-service.d.ts +8 -0
  92. package/dist/main/services/workspace/workspace-service.js +12 -0
  93. package/dist/main/utils/ipc-registry.d.ts +11 -2
  94. package/dist/main/utils/ipc-registry.js +63 -3
  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 +11 -59
  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 +52 -0
  106. package/dist/main/windows/service-host-window/create.js +112 -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 +29 -11
  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 +1939 -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 +243 -573
  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/abap-DiwvWnMr.js +2 -0
  143. package/dist/renderer/assets/apex-CmtZjKlf.js +2 -0
  144. package/dist/renderer/assets/azcli-DL2My_i-.js +2 -0
  145. package/dist/renderer/assets/bat-B-nC98wG.js +2 -0
  146. package/dist/renderer/assets/bicep-Ju5MwOgh.js +3 -0
  147. package/dist/renderer/assets/cameligo-8Eu1TyBr.js +2 -0
  148. package/dist/renderer/assets/chunk-DPI0Y_ll.js +1 -0
  149. package/dist/renderer/assets/clojure-u-RpMkH3.js +2 -0
  150. package/dist/renderer/assets/codicon-ngg6Pgfi.ttf +0 -0
  151. package/dist/renderer/assets/coffee-CdA7bbTe.js +2 -0
  152. package/dist/renderer/assets/constants-CLAQX6VZ.js +2 -0
  153. package/dist/renderer/assets/cpp-CzNFP8ks.js +2 -0
  154. package/dist/renderer/assets/csharp-j1LThmcE.js +2 -0
  155. package/dist/renderer/assets/csp-CLRC61y6.js +2 -0
  156. package/dist/renderer/assets/css-r6rC_7P2.js +4 -0
  157. package/dist/renderer/assets/css.worker-DyDu5ynT.js +90 -0
  158. package/dist/renderer/assets/cssMode-BCBgxrnA.js +2 -0
  159. package/dist/renderer/assets/cypher-CW08XVUh.js +2 -0
  160. package/dist/renderer/assets/dart-Cs9aL5T_.js +2 -0
  161. package/dist/renderer/assets/dockerfile-BWM0M184.js +2 -0
  162. package/dist/renderer/assets/ecl-MJJuer5P.js +2 -0
  163. package/dist/renderer/assets/editor-CWI9TnMM.css +1 -0
  164. package/dist/renderer/assets/editor.api2-BTaYmRq7.js +873 -0
  165. package/dist/renderer/assets/editor.worker-Dpt_xPrs.js +27 -0
  166. package/dist/renderer/assets/elixir-D2AIuXqn.js +2 -0
  167. package/dist/renderer/assets/flow9-B2H24giC.js +2 -0
  168. package/dist/renderer/assets/freemarker2-DGDGzimW.js +4 -0
  169. package/dist/renderer/assets/fsharp-CMk2OIJN.js +2 -0
  170. package/dist/renderer/assets/go-BrMkuJg0.js +2 -0
  171. package/dist/renderer/assets/graphql-PSR1UKGv.js +2 -0
  172. package/dist/renderer/assets/handlebars-bOHhw3EG.js +2 -0
  173. package/dist/renderer/assets/hcl-DAQrbDOW.js +2 -0
  174. package/dist/renderer/assets/html-BMyuX0_c.js +2 -0
  175. package/dist/renderer/assets/html.worker-IWNXhnIC.js +503 -0
  176. package/dist/renderer/assets/htmlMode-DR4kXJ7l.js +2 -0
  177. package/dist/renderer/assets/index-CcJKzatF.js +50 -0
  178. package/dist/renderer/assets/ini-0TG5BxW0.js +2 -0
  179. package/dist/renderer/assets/input-QGx6FFX1.js +2 -0
  180. package/dist/renderer/assets/ipc-transport-BT4QYQqu.css +1 -0
  181. package/dist/renderer/assets/{ipc-transport-BzPzxPwf.js → ipc-transport-DvZvwK-Z.js} +5 -5
  182. package/dist/renderer/assets/java-rgorz17v.js +2 -0
  183. package/dist/renderer/assets/javascript-Bu-tl1P7.js +2 -0
  184. package/dist/renderer/assets/json.worker-c4h5s80L.js +59 -0
  185. package/dist/renderer/assets/jsonMode-MQV_ffLR.js +8 -0
  186. package/dist/renderer/assets/julia-C8VMdHm8.js +2 -0
  187. package/dist/renderer/assets/kotlin-AhhC4Qhm.js +2 -0
  188. package/dist/renderer/assets/less-Cgca25AP.js +3 -0
  189. package/dist/renderer/assets/lexon-D0GHdBaw.js +2 -0
  190. package/dist/renderer/assets/liquid-ClkfOvhB.js +2 -0
  191. package/dist/renderer/assets/lspLanguageFeatures-Bke_4Ie9.js +5 -0
  192. package/dist/renderer/assets/lua-DmRsNG-P.js +2 -0
  193. package/dist/renderer/assets/m3-BgL5dNKT.js +2 -0
  194. package/dist/renderer/assets/markdown-BuJfycGS.js +2 -0
  195. package/dist/renderer/assets/mdx-RZdUskPu.js +2 -0
  196. package/dist/renderer/assets/mips-C9m_93PR.js +2 -0
  197. package/dist/renderer/assets/monaco.contribution-B7rUMaEv.js +3 -0
  198. package/dist/renderer/assets/msdax-CpFHC9OI.js +2 -0
  199. package/dist/renderer/assets/mysql-qFvltsqN.js +2 -0
  200. package/dist/renderer/assets/objective-c-Bnmr858J.js +2 -0
  201. package/dist/renderer/assets/pascal-WP0_D5AO.js +2 -0
  202. package/dist/renderer/assets/pascaligo-Blom4Rij.js +2 -0
  203. package/dist/renderer/assets/perl-B-vk8g64.js +2 -0
  204. package/dist/renderer/assets/pgsql-Cgvz6v67.js +2 -0
  205. package/dist/renderer/assets/php-8a3Lrw9m.js +2 -0
  206. package/dist/renderer/assets/pla-DuFqEZ8V.js +2 -0
  207. package/dist/renderer/assets/popover-BOH1If1J.js +2 -0
  208. package/dist/renderer/assets/postiats-DkLtSgkp.js +2 -0
  209. package/dist/renderer/assets/powerquery-BJ1aNepW.js +2 -0
  210. package/dist/renderer/assets/powershell-rE98k687.js +2 -0
  211. package/dist/renderer/assets/protobuf-CUheFacr.js +3 -0
  212. package/dist/renderer/assets/pug-LDcAMD8w.js +2 -0
  213. package/dist/renderer/assets/python-Cobrm_-8.js +2 -0
  214. package/dist/renderer/assets/qsharp-DUKSQoR1.js +2 -0
  215. package/dist/renderer/assets/r-D-QApv87.js +2 -0
  216. package/dist/renderer/assets/razor-BEUIQFNJ.js +2 -0
  217. package/dist/renderer/assets/redis-SXdDyWR9.js +2 -0
  218. package/dist/renderer/assets/redshift-Y6lsCryn.js +2 -0
  219. package/dist/renderer/assets/restructuredtext-edObr9a8.js +2 -0
  220. package/dist/renderer/assets/ruby-CNnUfF-8.js +2 -0
  221. package/dist/renderer/assets/rust-IHUZWzBr.js +2 -0
  222. package/dist/renderer/assets/sb-DrUvY44N.js +2 -0
  223. package/dist/renderer/assets/scala-B4hbXGLM.js +2 -0
  224. package/dist/renderer/assets/scheme-BGrd12j3.js +2 -0
  225. package/dist/renderer/assets/scss-x5G1ES4U.js +4 -0
  226. package/dist/renderer/assets/select-C7JQ8G5N.js +2 -0
  227. package/dist/renderer/assets/settings-DpAbTJyF.js +2 -0
  228. package/dist/renderer/assets/{settings-api-BXCw9vOZ.js → settings-api-RD2IZF53.js} +2 -2
  229. package/dist/renderer/assets/shell-DOehe2Y8.js +2 -0
  230. package/dist/renderer/assets/solidity-BeRvcwWV.js +2 -0
  231. package/dist/renderer/assets/sophia-DZbkUNjy.js +2 -0
  232. package/dist/renderer/assets/sparql-B7_oi5-h.js +2 -0
  233. package/dist/renderer/assets/sql-CTlsFWVE.js +2 -0
  234. package/dist/renderer/assets/st-DJVEJdPE.js +2 -0
  235. package/dist/renderer/assets/swift-CwhT3fYa.js +2 -0
  236. package/dist/renderer/assets/systemverilog-BQN63pkN.js +2 -0
  237. package/dist/renderer/assets/tcl-DqwfpskA.js +2 -0
  238. package/dist/renderer/assets/ts.worker-BwM5Ha3L.js +67720 -0
  239. package/dist/renderer/assets/tsMode-BHa7dl9v.js +12 -0
  240. package/dist/renderer/assets/twig-BiyenUgc.js +2 -0
  241. package/dist/renderer/assets/typescript-15aT0Yj8.js +2 -0
  242. package/dist/renderer/assets/typespec-CWOJribt.js +2 -0
  243. package/dist/renderer/assets/vb-Cq5F87m3.js +2 -0
  244. package/dist/renderer/assets/wgsl-BAvW2lVr.js +299 -0
  245. package/dist/renderer/assets/workbenchSettings-CNJX4Qna.js +8 -0
  246. package/dist/renderer/assets/workers-CRBS0W-v.js +2 -0
  247. package/dist/renderer/assets/xml-bR2Zh-HV.js +2 -0
  248. package/dist/renderer/assets/yaml-Bdk54Qrb.js +2 -0
  249. package/dist/renderer/entries/main/index.html +29 -6
  250. package/dist/renderer/entries/popover/index.html +7 -6
  251. package/dist/renderer/entries/settings/index.html +6 -5
  252. package/dist/renderer/entries/workbench-settings/index.html +6 -5
  253. package/dist/service-host/preload.cjs +254 -0
  254. package/dist/service-host/service.html +10 -0
  255. package/dist/service-host/sourcemap-rewrite.cjs +58 -0
  256. package/dist/service-host/sync-api-patch.js +20 -0
  257. package/dist/service-host/sync-impls/menu-button.js +16 -0
  258. package/dist/service-host/sync-impls/storage.js +50 -0
  259. package/dist/service-host/sync-impls/system-info.js +54 -0
  260. package/dist/shared/appdata-accumulator.d.ts +95 -0
  261. package/dist/shared/appdata-accumulator.js +213 -0
  262. package/dist/shared/bridge-channels.d.ts +364 -0
  263. package/dist/shared/bridge-channels.js +54 -0
  264. package/dist/shared/constants.d.ts +0 -4
  265. package/dist/shared/constants.js +0 -4
  266. package/dist/shared/ipc-channels.d.ts +108 -1
  267. package/dist/shared/ipc-channels.js +127 -10
  268. package/dist/shared/ipc-schemas.d.ts +65 -2
  269. package/dist/shared/ipc-schemas.js +79 -3
  270. package/dist/shared/open-in-editor.d.ts +71 -0
  271. package/dist/shared/open-in-editor.js +138 -0
  272. package/dist/shared/simulator-api-metadata.d.ts +21 -0
  273. package/dist/shared/simulator-api-metadata.js +23 -0
  274. package/dist/shared/types.d.ts +2 -2
  275. package/dist/shared/vpath.d.ts +42 -0
  276. package/dist/shared/vpath.js +105 -0
  277. package/dist/simulator/assets/device-shell-DsdcNEkt.css +1 -0
  278. package/dist/simulator/assets/device-shell-vwYSOVrh.js +2 -0
  279. package/dist/simulator/assets/jsx-runtime-P6ZegaOf.js +2 -0
  280. package/dist/simulator/assets/simulator-DddliUL5.js +10 -0
  281. package/dist/simulator/assets/simulator-mini-app-BDNu5n26.js +2 -0
  282. package/dist/simulator/device-shell/menu-button-geometry.js +8 -0
  283. package/dist/simulator/simulator.html +2 -112
  284. package/package.json +9 -9
  285. package/dist/main/utils/disposable.d.ts +0 -18
  286. package/dist/main/utils/disposable.js +0 -67
  287. package/dist/renderer/assets/constants-DI382mTP.js +0 -2
  288. package/dist/renderer/assets/index-4lkyF644.js +0 -46
  289. package/dist/renderer/assets/input-D4byFOLS.js +0 -2
  290. package/dist/renderer/assets/ipc-transport-DqbRdZNO.css +0 -1
  291. package/dist/renderer/assets/popover-cxKrg_os.js +0 -2
  292. package/dist/renderer/assets/select-BgSkkdHW.js +0 -2
  293. package/dist/renderer/assets/settings-oD2K1jdT.js +0 -2
  294. package/dist/renderer/assets/workbenchSettings-CTNBpTft.js +0 -8
  295. package/dist/simulator/assets/simulator-CVOFTpSj.js +0 -9
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+
3
+ // src/preload/runtime/host-toolbar-advertiser.ts
4
+ var import_electron = require("electron");
5
+
6
+ // ../view-anchor/src/measure-loop.ts
7
+ function createMeasureLoop(cfg) {
8
+ const { produce, same, sink } = cfg;
9
+ let rafId = null;
10
+ let active = false;
11
+ let disposed = false;
12
+ let last = null;
13
+ const cancel = () => {
14
+ if (rafId !== null) {
15
+ cancelAnimationFrame(rafId);
16
+ rafId = null;
17
+ }
18
+ };
19
+ return {
20
+ schedule() {
21
+ if (disposed || !active || rafId !== null) return;
22
+ rafId = requestAnimationFrame(() => {
23
+ rafId = null;
24
+ if (disposed || !active) return;
25
+ const value = produce();
26
+ if (value === null) return;
27
+ if (last !== null && same(value, last)) return;
28
+ last = value;
29
+ sink(value);
30
+ });
31
+ },
32
+ emitNow(value) {
33
+ if (disposed) return;
34
+ last = value;
35
+ sink(value);
36
+ },
37
+ setActive(on) {
38
+ active = on;
39
+ },
40
+ cancel,
41
+ dispose() {
42
+ if (disposed) return;
43
+ disposed = true;
44
+ cancel();
45
+ }
46
+ };
47
+ }
48
+
49
+ // ../view-anchor/src/size-advertiser.ts
50
+ function createSizeAdvertiser(target, opts) {
51
+ const axis = opts.axis;
52
+ let publish = opts.publish;
53
+ let observer = null;
54
+ let disposed = false;
55
+ let latest = null;
56
+ const produce = () => {
57
+ if (!latest) return null;
58
+ const raw = axis === "block" ? latest.blockSize : latest.inlineSize;
59
+ if (!Number.isFinite(raw)) return null;
60
+ return { axis, extent: Math.max(0, Math.round(raw)) };
61
+ };
62
+ const loop = createMeasureLoop({
63
+ produce,
64
+ same: (a, b) => a.extent === b.extent,
65
+ // axis is constant
66
+ sink: (size) => publish(size)
67
+ });
68
+ const onResize = (entries) => {
69
+ const entry = entries[entries.length - 1];
70
+ if (entry) {
71
+ latest = entry.borderBoxSize?.[0] ?? entry.contentBoxSize?.[0] ?? latest;
72
+ }
73
+ loop.schedule();
74
+ };
75
+ const doc = target.ownerDocument;
76
+ if (target === doc.body || target === doc.documentElement) {
77
+ console.warn(
78
+ `[view-anchor] size-advertiser: <${target === doc.body ? "body" : "html"}>'s ${axis} size is the host-given view size, not the content size \u2014 the advertiser will never shrink to content. Measure a shrink-to-fit wrapper. See bidirectional-design.md \xA74.`
79
+ );
80
+ }
81
+ loop.setActive(true);
82
+ observer = new ResizeObserver(onResize);
83
+ observer.observe(target);
84
+ return {
85
+ update(nextPublish) {
86
+ if (disposed) return;
87
+ publish = nextPublish;
88
+ const cur = produce();
89
+ if (cur) loop.emitNow(cur);
90
+ },
91
+ dispose() {
92
+ if (disposed) return;
93
+ disposed = true;
94
+ loop.cancel();
95
+ if (observer) {
96
+ observer.disconnect();
97
+ observer = null;
98
+ }
99
+ loop.dispose();
100
+ }
101
+ };
102
+ }
103
+
104
+ // src/shared/ipc-channels.ts
105
+ var ViewChannel = {
106
+ /** Update the simulator DevTools view's bounds (or hide if w/h = 0). */
107
+ SimulatorDevtoolsBounds: "view:simulator:devtools-bounds",
108
+ /**
109
+ * Host-controllable toolbar WebContentsView (sits ABOVE the devtools built-in
110
+ * header). Forward anchor: the main renderer reports the toolbar placeholder's
111
+ * bounds (or w/h=0 to hide). invoke.
112
+ */
113
+ HostToolbarBounds: "view:host-toolbar:bounds",
114
+ /**
115
+ * Reverse size-advertiser: the host-toolbar WCV's OWN renderer advertises its
116
+ * intrinsic content height so main reserves exactly that much. Payload
117
+ * `{ axis: 'block', extent }`. fire-and-forget (send), NOT invoke.
118
+ */
119
+ HostToolbarAdvertiseHeight: "view:host-toolbar:advertise-height",
120
+ /**
121
+ * main → main-window renderer: push the reserved host-toolbar height so the
122
+ * renderer placeholder div resizes (closing the dynamic-height loop).
123
+ */
124
+ HostToolbarHeightChanged: "view:host-toolbar:height-changed"
125
+ };
126
+
127
+ // src/preload/runtime/host-toolbar-advertiser.ts
128
+ function installHostToolbarAdvertiser() {
129
+ const root = document.querySelector("[data-host-toolbar-root]");
130
+ if (!root) {
131
+ console.warn(
132
+ "[host-toolbar-advertiser] no `[data-host-toolbar-root]` element found \u2014 not advertising a height. The toolbar content must wrap itself in a shrink-to-fit `[data-host-toolbar-root]` element so its block size is the content height, not the host-given view size."
133
+ );
134
+ return () => {
135
+ };
136
+ }
137
+ const advertiser = createSizeAdvertiser(root, {
138
+ axis: "block",
139
+ publish: (size) => {
140
+ import_electron.ipcRenderer.send(ViewChannel.HostToolbarAdvertiseHeight, size);
141
+ }
142
+ });
143
+ return () => advertiser.dispose();
144
+ }
145
+ function installHostToolbarAdvertiserWhenReady() {
146
+ if (document.readyState === "loading") {
147
+ document.addEventListener(
148
+ "DOMContentLoaded",
149
+ () => {
150
+ installHostToolbarAdvertiser();
151
+ },
152
+ { once: true }
153
+ );
154
+ } else {
155
+ installHostToolbarAdvertiser();
156
+ }
157
+ }
158
+
159
+ // src/preload/windows/host-toolbar.ts
160
+ installHostToolbarAdvertiserWhenReady();
161
+ //# sourceMappingURL=host-toolbar.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/preload/runtime/host-toolbar-advertiser.ts", "../../../../view-anchor/src/measure-loop.ts", "../../../../view-anchor/src/size-advertiser.ts", "../../../src/shared/ipc-channels.ts", "../../../src/preload/windows/host-toolbar.ts"],
4
+ "sourcesContent": ["/**\n * Reverse size-advertiser preload for the host-controllable toolbar\n * WebContentsView. Runs in that WCV's OWN renderer (the toolbar content's\n * preload), measures the toolbar's intrinsic block (height) extent and sends it\n * to the main process. Main pushes the value back to the main-window renderer as\n * `HostToolbarHeightChanged`, which resizes the toolbar placeholder, re-measures\n * the forward anchor, and re-overlays this WCV \u2014 closing the dynamic-height loop\n * (see `@dimina-kit/view-anchor` `createSizeAdvertiser`).\n */\n\nimport { ipcRenderer } from 'electron'\nimport { createSizeAdvertiser } from '@dimina-kit/view-anchor'\nimport { ViewChannel } from '../../shared/ipc-channels.js'\n\n/**\n * Attach the advertiser to the toolbar content's shrink-to-fit root\n * (`[data-host-toolbar-root]`). That element MUST be shrink-to-fit on the block\n * axis \u2014 its height must reflect the content, not the host-applied view height,\n * or the cross-process loop never converges (`createSizeAdvertiser`'s footgun).\n * If the element is missing we warn and no-op rather than measure `<body>`,\n * whose block size IS the view size and would advertise nonsense.\n *\n * Returns a disposer that tears the advertiser down.\n */\nexport function installHostToolbarAdvertiser(): () => void {\n const root = document.querySelector<HTMLElement>('[data-host-toolbar-root]')\n if (!root) {\n console.warn(\n '[host-toolbar-advertiser] no `[data-host-toolbar-root]` element found \u2014 ' +\n 'not advertising a height. The toolbar content must wrap itself in a ' +\n 'shrink-to-fit `[data-host-toolbar-root]` element so its block size is ' +\n 'the content height, not the host-given view size.',\n )\n return () => {}\n }\n\n const advertiser = createSizeAdvertiser(root, {\n axis: 'block',\n publish: (size) => {\n ipcRenderer.send(ViewChannel.HostToolbarAdvertiseHeight, size)\n },\n })\n\n return () => advertiser.dispose()\n}\n\n/**\n * Install once the DOM is ready (the root element must exist before we query).\n * Self-gating: if the document is already past `loading`, install synchronously;\n * otherwise wait for `DOMContentLoaded`.\n */\nexport function installHostToolbarAdvertiserWhenReady(): void {\n if (document.readyState === 'loading') {\n document.addEventListener(\n 'DOMContentLoaded',\n () => {\n installHostToolbarAdvertiser()\n },\n { once: true },\n )\n } else {\n installHostToolbarAdvertiser()\n }\n}\n", "/**\n * Internal \u2014 the RAF-coalesced measure/dedupe/dispose engine behind the REVERSE\n * primitive `createSizeAdvertiser`.\n *\n * The forward `createViewAnchor` deliberately does NOT use this: it publishes\n * SYNCHRONOUSLY (a native overlay's `setBounds` already lands a cross-process\n * frame late, and a RAF stacked a second frame of visible trailing). The\n * reverse direction is different \u2014 it is a cross-process FEEDBACK loop\n * (advertise \u2192 host resizes the view \u2192 content re-measures \u2192 re-advertise), so\n * the RAF's one-publish-per-frame coalescing is a useful damper. The two\n * directions thus have different optimal emit timing; this engine serves only\n * the reverse.\n *\n * NOT exported from the package: it is pure mechanism with no knowledge of\n * direction, the DOM, `ResizeObserver`, or the structure of the value `T` it\n * carries. The wrapping primitive injects `produce` / `same` / `sink` and\n * drives the lifecycle.\n *\n * - `schedule()` \u2014 coalesce a burst of triggers into ONE RAF; the frame\n * body re-`produce()`s, dedupes against the last emit (`same`), and `sink`s.\n * Bails if inactive or disposed (stale-RAF safe).\n * - `emitNow(v)` \u2014 explicit synchronous emit (create / update path). Always\n * fires, bypassing the dedupe check, and refreshes the dedupe baseline.\n * - `setActive` \u2014 gate the observer stream; a queued frame bails on `!active`.\n * - `cancel` \u2014 drop any in-flight RAF.\n * - `dispose` \u2014 cancel + go inert; after dispose nothing emits again.\n */\nexport interface MeasureLoop<T> {\n schedule(): void\n emitNow(value: T): void\n setActive(on: boolean): void\n cancel(): void\n dispose(): void\n}\n\nexport function createMeasureLoop<T>(cfg: {\n /** Produce the value to emit in the RAF body. Return `null` to decline the\n * frame entirely (no dedupe, no sink, baseline untouched) \u2014 e.g. a\n * non-finite or unavailable measurement. */\n produce: () => T | null\n same: (a: T, b: T) => boolean\n sink: (value: T) => void\n}): MeasureLoop<T> {\n const { produce, same, sink } = cfg\n let rafId: number | null = null\n let active = false\n let disposed = false\n let last: T | null = null\n\n const cancel = (): void => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n rafId = null\n }\n }\n\n return {\n schedule(): void {\n if (disposed || !active || rafId !== null) return\n rafId = requestAnimationFrame(() => {\n rafId = null\n if (disposed || !active) return\n const value = produce()\n if (value === null) return // producer declined this frame\n // last-value dedupe: a frame whose produced value equals the last one\n // we emitted costs nothing (no IPC / setBounds).\n if (last !== null && same(value, last)) return\n last = value\n sink(value)\n })\n },\n emitNow(value: T): void {\n if (disposed) return\n last = value\n sink(value)\n },\n setActive(on: boolean): void {\n active = on\n },\n cancel,\n dispose(): void {\n if (disposed) return\n disposed = true\n cancel()\n },\n }\n}\n", "import type {\n AdvertisedSize,\n SizeAdvertiserOptions,\n SizeAdvertiserHandle,\n} from './types.js'\nimport { createMeasureLoop } from './measure-loop.js'\n\n/**\n * Reverse of `createViewAnchor`: runs in a downstream WebContentsView's own\n * renderer, measures the content's own size on ONE owned axis (from the\n * `ResizeObserver` border-box \u2014 no `getBoundingClientRect`, no forced reflow),\n * and advertises it via the injected `publish`. Shares the forward primitive's\n * measure/coalesce/dedupe/dispose engine (`createMeasureLoop`).\n *\n * The extent is `Math.round`ed and clamped to `>= 0`; non-finite measurements\n * drop the frame.\n *\n * FOOTGUN \u2014 `target` must be shrink-to-fit on the owned axis: its owned-axis\n * size must NOT be driven by the host-applied view size, or the cross-process\n * loop (advertise \u2192 host resizes view \u2192 remeasure) never converges (it\n * oscillates or stays \"stable but wrong\"). Measuring `<body>`/`<html>` is the\n * classic mistake \u2014 their size *is* the view size. See\n * `docs/bidirectional-design.md` \u00A74/\u00A75.\n */\nexport function createSizeAdvertiser(\n target: HTMLElement,\n opts: SizeAdvertiserOptions,\n): SizeAdvertiserHandle {\n const axis = opts.axis // immutable for the advertiser's life\n let publish = opts.publish\n let observer: ResizeObserver | null = null\n let disposed = false\n // Latest border-box, stashed by the RO callback and read by `produce` in the\n // RAF body (keep the entry out of the shared, DOM-agnostic loop).\n let latest: ResizeObserverSize | null = null\n\n const produce = (): AdvertisedSize | null => {\n if (!latest) return null\n const raw = axis === 'block' ? latest.blockSize : latest.inlineSize\n if (!Number.isFinite(raw)) return null\n return { axis, extent: Math.max(0, Math.round(raw)) }\n }\n\n const loop = createMeasureLoop<AdvertisedSize>({\n produce,\n same: (a, b) => a.extent === b.extent, // axis is constant\n sink: (size) => publish(size),\n })\n\n const onResize: ResizeObserverCallback = (entries) => {\n const entry = entries[entries.length - 1]\n if (entry) {\n latest = entry.borderBoxSize?.[0] ?? entry.contentBoxSize?.[0] ?? latest\n }\n loop.schedule()\n }\n\n // One cheap, once-per-advertiser guard for the textbook feedback-loop footgun.\n const doc = target.ownerDocument\n if (target === doc.body || target === doc.documentElement) {\n console.warn(\n `[view-anchor] size-advertiser: <${target === doc.body ? 'body' : 'html'}>'s ` +\n `${axis} size is the host-given view size, not the content size \u2014 the ` +\n `advertiser will never shrink to content. Measure a shrink-to-fit wrapper. ` +\n `See bidirectional-design.md \u00A74.`,\n )\n }\n\n loop.setActive(true)\n observer = new ResizeObserver(onResize)\n observer.observe(target)\n\n return {\n update(nextPublish: (size: AdvertisedSize) => void): void {\n if (disposed) return\n publish = nextPublish\n // Re-advertise the current size to the new sink immediately (mirrors the\n // forward anchor's re-publish on update) so the new channel is not left\n // sizeless until the next ResizeObserver tick.\n const cur = produce()\n if (cur) loop.emitNow(cur)\n },\n dispose(): void {\n if (disposed) return\n disposed = true\n loop.cancel()\n if (observer) {\n observer.disconnect()\n observer = null\n }\n loop.dispose()\n },\n }\n}\n", "/**\n * Centralised IPC channel name constants for dimina-devtools.\n *\n * Every raw channel string used across main, renderer, preload and e2e code\n * should reference one of these constants so that renaming a channel only\n * requires a single edit.\n */\n\n// \u2500\u2500 Simulator (preload \u2192 host / renderer \u2194 main) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const SimulatorChannel = {\n // Ask main to create the simulator as a top-level WebContentsView (so nested\n // render-host <webview>s can attach). Native-host is the sole runtime.\n AttachNative: 'simulator:attach-native',\n // Renderer reports the device-bezel inner-screen rect (CSS px from content\n // top-left) + zoom so main can overlay the simulator WCV on it.\n SetNativeBounds: 'simulator:set-native-bounds',\n // Renderer pushes the selected device's LOGICAL metrics (screen size,\n // pixelRatio, statusBarHeight, \u2026) when the device dropdown changes. Main\n // maps it to a HostEnvSnapshot and live-updates the running service-host\n // window \u2014 the authoritative `wx.getSystemInfoSync()` source \u2014 so the\n // mini-app sees the selected device without a relaunch.\n SetDeviceInfo: 'simulator:set-device-info',\n Detach: 'simulator:detach',\n Resize: 'simulator:resize',\n SetVisible: 'simulator:setVisible',\n Console: 'simulator:console',\n // Main \u2192 renderer push of the visible top-of-stack page route whenever the\n // mini-app navigates (navigateTo / switchTab / back). Payload: the page path\n // string (same bare format as `getCurrentPagePath`), or '' when unknown.\n CurrentPage: 'simulator:current-page',\n} as const\n\n/** iPhone bezel cutout family driving the device-shell notch visual. */\nexport type NotchType = 'none' | 'notch' | 'dynamic-island'\n\n/** Per-device safe-area insets in CSS px (portrait). */\nexport interface SafeAreaInsets {\n top: number\n right: number\n bottom: number\n left: number\n}\n\n/**\n * Logical device metrics pushed by the renderer device dropdown under\n * native-host (`SimulatorChannel.SetDeviceInfo`). Mirrors a row of the renderer\n * `DEVICES` table; main maps it onto a `HostEnvSnapshot` for the service-host\n * window so `wx.getSystemInfoSync()` reflects the selected device, relays it to\n * the simulator WCV (DeviceShell: bezel size + status bar + notch), and drives\n * the CSS `env(safe-area-inset-*)` override on render-host guests.\n */\nexport interface NativeDeviceInfo {\n brand: string\n model: string\n system: string\n platform: string\n pixelRatio: number\n screenWidth: number\n screenHeight: number\n statusBarHeight: number\n safeAreaBottom: number\n notchType: NotchType\n safeAreaInsets: SafeAreaInsets\n}\n\n// \u2500\u2500 Service host (main \u2192 hidden service-host window) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const ServiceHostChannel = {\n /**\n * NATIVE-HOST ONLY. Live-update the service-host window's host-env snapshot\n * (device metrics) so subsequent `wx.getSystemInfoSync()` reflects a device\n * change without a relaunch. The service-host preload mutates\n * `__diminaSpawnContext.hostEnvSnapshot` in place (see `service-host/preload.cjs`).\n */\n HostEnvUpdate: 'service-host:host-env:update',\n} as const\n\n// \u2500\u2500 Custom simulator APIs (downstream-registered, main-process handlers) \u2500\u2500\n// list: simulator queries the names registered via instance.registerSimulatorApi().\n// invoke: simulator forwards an API call to the registry; result/reject propagates.\n//\n// These are ipcMain.handle channels invoked by the **main-window renderer**\n// only (trusted host). The simulator guest never reaches them directly \u2014 it\n// reaches the host via the bridge channels below, so the sender-policy can keep\n// the simulator off the IPC white-list.\nexport const SimulatorCustomApiChannel = {\n List: 'simulator:custom-apis:list',\n Invoke: 'simulator:custom-apis:invoke',\n} as const\n\n// \u2500\u2500 Custom APIs bridge (simulator \u2192 host) \u2500\u2500\n// payload = { id, op: 'list' } | { id, op: 'invoke', name, params } for Request,\n// { id, result } | { id, error } for Response. Transport (in\n// `src/preload/runtime/custom-apis.ts`): native-host \u2014 the simulator is a\n// top-level WebContentsView (no embedder), so Request goes via\n// `ipcRenderer.send` \u2192 `ipcMain.on` dispatcher bound to that simWc (view-manager\n// `attachNativeCustomApiBridge`) \u2192 Response via `simWc.send`. (The old\n// renderer-proxied `<webview>` transport, `ipcRenderer.sendToHost` \u2192\n// `<webview>.send`, no longer exists \u2014 native-host is the sole runtime.)\n//\n// Request/response are correlated by `id` so multiple concurrent invokes can\n// be in flight at once.\nexport const SimulatorCustomApiBridgeChannel = {\n Request: 'simulator:custom-apis:bridge-request',\n Response: 'simulator:custom-apis:bridge-response',\n} as const\n\n// \u2500\u2500 Storage (CDP-backed; main process attaches the debugger to the\n// simulator guest and forwards DOMStorage events to the renderer) \u2500\u2500\nexport const SimulatorStorageChannel = {\n GetSnapshot: 'simulator:storage:snapshot',\n GetActivePrefix: 'simulator:storage:activePrefix',\n Set: 'simulator:storage:set',\n Remove: 'simulator:storage:remove',\n Clear: 'simulator:storage:clear',\n ClearAll: 'simulator:storage:clearAll',\n Event: 'simulator:storage:event',\n} as const\n\nexport interface StorageItem { key: string; value: string }\nexport type StorageEvent =\n | { type: 'added'; key: string; newValue: string }\n | { type: 'updated'; key: string; oldValue: string; newValue: string }\n | { type: 'removed'; key: string }\n | { type: 'cleared' }\n\nexport type StorageWriteResult =\n | { ok: true }\n | { ok: false; error: string }\n\n// \u2500\u2500 Element inspection (CDP-backed; WXML tree nodes map to real DOM by sid) \u2500\u2500\nexport const SimulatorElementChannel = {\n Inspect: 'simulator:element:inspect',\n Clear: 'simulator:element:clear',\n} as const\n\n// \u2500\u2500 Workbench runtime info (renderer reads once to pick panel data sources) \u2500\u2500\n// Under native-host the page DOM / service logic live in separate webContents,\n// so WXML + AppData are sourced from the main process instead of the simulator\n// guest's miniappSnapshot transport. The renderer queries this flag once and\n// branches usePanelData accordingly.\nexport const WorkbenchRuntimeChannel = {\n GetNativeHost: 'workbench:runtime:native-host',\n} as const\n\n// \u2500\u2500 WXML tree (native-host: main pulls the tree from the active render-host\n// <webview> guest via render-inspect, and pushes/answers here \u2014 mirroring the\n// Storage panel's main\u2192renderer contract so the renderer panel is unchanged) \u2500\u2500\nexport const SimulatorWxmlChannel = {\n GetSnapshot: 'simulator:wxml:snapshot',\n Event: 'simulator:wxml:event',\n} as const\n\n// \u2500\u2500 AppData (native-host: main taps the service\u2192render setData stream in\n// bridge-router and pushes the cumulative snapshot here \u2014 the service logic runs\n// in the hidden service-host window, not a Worker in the simulator guest) \u2500\u2500\nexport const SimulatorAppDataChannel = {\n GetSnapshot: 'simulator:appdata:snapshot',\n Event: 'simulator:appdata:event',\n} as const\n\nexport interface ElementInspection {\n sid: string\n rect: {\n x: number\n y: number\n width: number\n height: number\n }\n style: {\n display: string\n position: string\n boxSizing: string\n margin: string\n padding: string\n color: string\n backgroundColor: string\n fontSize: string\n }\n}\n\n// \u2500\u2500 Workbench settings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const WorkbenchSettingsChannel = {\n Get: 'workbenchSettings:get',\n Save: 'workbenchSettings:save',\n SetTheme: 'workbenchSettings:setTheme',\n GetCdpStatus: 'workbenchSettings:getCdpStatus',\n GetMcpStatus: 'workbenchSettings:getMcpStatus',\n SetVisible: 'workbenchSettings:setVisible',\n Init: 'workbenchSettings:init',\n} as const\n\n// \u2500\u2500 Project session \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const ProjectChannel = {\n Open: 'project:open',\n Close: 'project:close',\n GetPages: 'project:getPages',\n GetCompileConfig: 'project:getCompileConfig',\n SaveCompileConfig: 'project:saveCompileConfig',\n Status: 'project:status',\n CaptureThumbnail: 'project:captureThumbnail',\n GetThumbnail: 'project:getThumbnail',\n} as const\n\n// \u2500\u2500 Project file system (sandboxed to active project root) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Read/write access to the active project's files, used by the in-renderer\n// Monaco editor. Every path is verified against the active project root in\n// the main process (see `services/project-fs`). Replaces the OpenSumi\n// editor's `editor:fs:*` bridge \u2014 same sandbox, callable from the main\n// renderer instead of a separate WebContentsView.\n\nexport const ProjectFsChannel = {\n GetRoot: 'project:fs:getRoot',\n ReadFile: 'project:fs:readFile',\n WriteFile: 'project:fs:writeFile',\n /**\n * Synchronous (blocking) write, used ONLY by the editor's `beforeunload`\n * flush: a hard window/app close tears the renderer down before an async\n * `WriteFile` IPC can round-trip, so the last in-debounce-window edit would\n * be lost. `sendSync` blocks page teardown until the bytes hit disk. Runs the\n * SAME sandbox as `WriteFile` (see project-fs `writeFileSync`).\n */\n WriteFileSync: 'project:fs:writeFileSync',\n ListFiles: 'project:fs:listFiles',\n} as const\n\n// \u2500\u2500 Editor (main \u2192 renderer) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Drives the in-renderer Monaco editor from the main process. Used by the\n// \"click a console file link \u2192 open the file at line:col\" pipeline: the\n// embedded DevTools front-end routes a source-link click through an open-\n// resource handler \u2192 Electron `devtools-open-url` on the service host \u2192 main\n// maps the resource URL to a project-relative path \u2192 this event opens it in\n// Monaco. Payload: `EditorOpenFilePayload`.\n\nexport const EditorChannel = {\n /** main \u2192 renderer: open `path` (project-relative POSIX) at `line`/`column`. */\n OpenFile: 'editor:openFile',\n} as const\n\n/** Payload for `editor:openFile`. `line`/`column` are 1-based for Monaco. */\nexport interface EditorOpenFilePayload {\n /** Project-relative POSIX path (the same key Monaco opens files by). */\n path: string\n /** 1-based line to reveal; omitted/<=0 means open without moving the cursor. */\n line?: number\n /** 1-based column to reveal; defaults to 1 when a line is given. */\n column?: number\n}\n\n// \u2500\u2500 Project list / workspace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const ProjectsChannel = {\n List: 'projects:list',\n Add: 'projects:add',\n Remove: 'projects:remove',\n /** Phase 3: merged + sanitized template catalog for the create-project dialog. */\n ListTemplates: 'projects:listTemplates',\n /** Phase 3: host-supplied create-project dialog hook (returns input or null). */\n OpenCreateDialog: 'projects:openCreateDialog',\n /** Phase 3: server-side scaffold + register (delegates to create-project-service). */\n Create: 'projects:create',\n /** Default values used to pre-fill the create-project dialog (baseDir). */\n GetCreateDefaults: 'projects:getCreateDefaults',\n} as const\n\n/** Renderer-facing payload for `projects:getCreateDefaults`. */\nexport interface ProjectCreateDefaults {\n /** Absolute directory used as the parent for new projects. */\n baseDir: string\n}\n\n// \u2500\u2500 Dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const DialogChannel = {\n OpenDirectory: 'dialog:openDirectory',\n} as const\n\n// \u2500\u2500 Panels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const PanelChannel = {\n List: 'panel:list',\n Eval: 'panel:eval',\n Select: 'panel:select',\n SelectSimulator: 'panel:selectSimulator',\n} as const\n\n// \u2500\u2500 Embedded views (renderer \u2192 main) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// The main window's React layout owns the *positions* of the editor +\n// simulator-DevTools WebContentsView overlays \u2014 each visible placeholder\n// `<div>` measures its client rect via ResizeObserver and pushes the\n// rectangle to the main process. The view manager caches the latest\n// payload per kind and applies it to the overlay; no payload means the\n// overlay is hidden.\n//\n// Payload (after schema validation): `{ x, y, width, height }` in CSS\n// pixels relative to the window's content area (origin = top-left,\n// not including the OS chrome).\nexport const ViewChannel = {\n /** Update the simulator DevTools view's bounds (or hide if w/h = 0). */\n SimulatorDevtoolsBounds: 'view:simulator:devtools-bounds',\n /**\n * Host-controllable toolbar WebContentsView (sits ABOVE the devtools built-in\n * header). Forward anchor: the main renderer reports the toolbar placeholder's\n * bounds (or w/h=0 to hide). invoke.\n */\n HostToolbarBounds: 'view:host-toolbar:bounds',\n /**\n * Reverse size-advertiser: the host-toolbar WCV's OWN renderer advertises its\n * intrinsic content height so main reserves exactly that much. Payload\n * `{ axis: 'block', extent }`. fire-and-forget (send), NOT invoke.\n */\n HostToolbarAdvertiseHeight: 'view:host-toolbar:advertise-height',\n /**\n * main \u2192 main-window renderer: push the reserved host-toolbar height so the\n * renderer placeholder div resizes (closing the dynamic-height loop).\n */\n HostToolbarHeightChanged: 'view:host-toolbar:height-changed',\n} as const\n\nexport interface ViewBounds {\n x: number\n y: number\n width: number\n height: number\n}\n\n// \u2500\u2500 Popover \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const PopoverChannel = {\n Show: 'popover:show',\n Hide: 'popover:hide',\n Relaunch: 'popover:relaunch',\n Closed: 'popover:closed',\n Init: 'popover:init',\n} as const\n\n// \u2500\u2500 Toolbar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const ToolbarChannel = {\n GetActions: 'toolbar:getActions',\n ActionsChanged: 'toolbar:actionsChanged',\n /** Invoke a toolbar action by id: `invoke(Invoke, actionId)`. */\n Invoke: 'toolbar:invoke',\n} as const\n\n// \u2500\u2500 Window \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const WindowChannel = {\n NavigateBack: 'window:navigateBack',\n} as const\n\n// \u2500\u2500 App \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const AppChannel = {\n GetPreloadPath: 'app:getPreloadPath',\n GetBranding: 'app:getBranding',\n GetHeaderHeight: 'app:getHeaderHeight',\n} as const\n\n// \u2500\u2500 miniappSnapshot (unified panel snapshot framework) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Two generic channels shared by every snapshot source (AppData, WXML, \u2026).\n// Adding a new panel needs no new channel.\n// Push: preload \u2192 renderer (`sendToHost`), payload: SnapshotEnvelope\n// Pull: renderer \u2192 preload (`webview.send`), payload: { id }\n\nexport const MiniappSnapshotChannel = {\n Push: 'miniapp-snapshot:push',\n Pull: 'miniapp-snapshot:pull',\n} as const\n\n// \u2500\u2500 Automation (WebSocket server) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const AutomationChannel = {\n GetPort: 'automation:port',\n} as const\n\n// \u2500\u2500 Embedded settings overlay \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const SettingsChannel = {\n SetVisible: 'settings:setVisible',\n ConfigChanged: 'settings:configChanged',\n ProjectSettingsChanged: 'settings:projectSettingsChanged',\n Init: 'settings:init',\n Closed: 'settings:closed',\n Changed: 'settings:changed',\n} as const\n\n// \u2500\u2500 Updates (UpdateManager) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// String values are FROZEN: shipped builds key off them. Add new entries\n// here, never rename existing ones.\nexport const UpdateChannel = {\n Check: 'updates:check',\n Download: 'updates:download',\n Install: 'updates:install',\n DownloadProgress: 'updates:downloadProgress',\n Available: 'updates:available',\n} as const\n", "// Preload for the host-controllable toolbar WebContentsView.\n//\n// Bundled into a single CJS file via build:preload (esbuild) and loaded as the\n// toolbar WCV's `preload`. Its only job is to run the reverse size-advertiser:\n// it measures the host content's intrinsic height (a shrink-to-fit element the\n// host marks `[data-host-toolbar-root]`) and posts it to main on the\n// `view:host-toolbar:advertise-height` channel, so the main renderer reserves\n// exactly that height and the toolbar tracks it (dynamic height, foundation\n// ViewAnchor reverse-advertiser).\nimport { installHostToolbarAdvertiserWhenReady } from '../runtime/host-toolbar-advertiser.js'\n\ninstallHostToolbarAdvertiserWhenReady()\n"],
5
+ "mappings": ";;;AAUA,sBAA4B;;;ACyBrB,SAAS,kBAAqB,KAOlB;AACjB,QAAM,EAAE,SAAS,MAAM,KAAK,IAAI;AAChC,MAAI,QAAuB;AAC3B,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,OAAiB;AAErB,QAAM,SAAS,MAAY;AACzB,QAAI,UAAU,MAAM;AAClB,2BAAqB,KAAK;AAC1B,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAiB;AACf,UAAI,YAAY,CAAC,UAAU,UAAU,KAAM;AAC3C,cAAQ,sBAAsB,MAAM;AAClC,gBAAQ;AACR,YAAI,YAAY,CAAC,OAAQ;AACzB,cAAM,QAAQ,QAAQ;AACtB,YAAI,UAAU,KAAM;AAGpB,YAAI,SAAS,QAAQ,KAAK,OAAO,IAAI,EAAG;AACxC,eAAO;AACP,aAAK,KAAK;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,OAAgB;AACtB,UAAI,SAAU;AACd,aAAO;AACP,WAAK,KAAK;AAAA,IACZ;AAAA,IACA,UAAU,IAAmB;AAC3B,eAAS;AAAA,IACX;AAAA,IACA;AAAA,IACA,UAAgB;AACd,UAAI,SAAU;AACd,iBAAW;AACX,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC9DO,SAAS,qBACd,QACA,MACsB;AACtB,QAAM,OAAO,KAAK;AAClB,MAAI,UAAU,KAAK;AACnB,MAAI,WAAkC;AACtC,MAAI,WAAW;AAGf,MAAI,SAAoC;AAExC,QAAM,UAAU,MAA6B;AAC3C,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,MAAM,SAAS,UAAU,OAAO,YAAY,OAAO;AACzD,QAAI,CAAC,OAAO,SAAS,GAAG,EAAG,QAAO;AAClC,WAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,GAAG,CAAC,EAAE;AAAA,EACtD;AAEA,QAAM,OAAO,kBAAkC;AAAA,IAC7C;AAAA,IACA,MAAM,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE;AAAA;AAAA,IAC/B,MAAM,CAAC,SAAS,QAAQ,IAAI;AAAA,EAC9B,CAAC;AAED,QAAM,WAAmC,CAAC,YAAY;AACpD,UAAM,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AACxC,QAAI,OAAO;AACT,eAAS,MAAM,gBAAgB,CAAC,KAAK,MAAM,iBAAiB,CAAC,KAAK;AAAA,IACpE;AACA,SAAK,SAAS;AAAA,EAChB;AAGA,QAAM,MAAM,OAAO;AACnB,MAAI,WAAW,IAAI,QAAQ,WAAW,IAAI,iBAAiB;AACzD,YAAQ;AAAA,MACN,mCAAmC,WAAW,IAAI,OAAO,SAAS,MAAM,OACnE,IAAI;AAAA,IAGX;AAAA,EACF;AAEA,OAAK,UAAU,IAAI;AACnB,aAAW,IAAI,eAAe,QAAQ;AACtC,WAAS,QAAQ,MAAM;AAEvB,SAAO;AAAA,IACL,OAAO,aAAmD;AACxD,UAAI,SAAU;AACd,gBAAU;AAIV,YAAM,MAAM,QAAQ;AACpB,UAAI,IAAK,MAAK,QAAQ,GAAG;AAAA,IAC3B;AAAA,IACA,UAAgB;AACd,UAAI,SAAU;AACd,iBAAW;AACX,WAAK,OAAO;AACZ,UAAI,UAAU;AACZ,iBAAS,WAAW;AACpB,mBAAW;AAAA,MACb;AACA,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AACF;;;ACkNO,IAAM,cAAc;AAAA;AAAA,EAEzB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,0BAA0B;AAC5B;;;AH3SO,SAAS,+BAA2C;AACzD,QAAM,OAAO,SAAS,cAA2B,0BAA0B;AAC3E,MAAI,CAAC,MAAM;AACT,YAAQ;AAAA,MACN;AAAA,IAIF;AACA,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,QAAM,aAAa,qBAAqB,MAAM;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS,CAAC,SAAS;AACjB,kCAAY,KAAK,YAAY,4BAA4B,IAAI;AAAA,IAC/D;AAAA,EACF,CAAC;AAED,SAAO,MAAM,WAAW,QAAQ;AAClC;AAOO,SAAS,wCAA8C;AAC5D,MAAI,SAAS,eAAe,WAAW;AACrC,aAAS;AAAA,MACP;AAAA,MACA,MAAM;AACJ,qCAA6B;AAAA,MAC/B;AAAA,MACA,EAAE,MAAM,KAAK;AAAA,IACf;AAAA,EACF,OAAO;AACL,iCAA6B;AAAA,EAC/B;AACF;;;AIpDA,sCAAsC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=host-toolbar.d.ts.map
@@ -0,0 +1,12 @@
1
+ // Preload for the host-controllable toolbar WebContentsView.
2
+ //
3
+ // Bundled into a single CJS file via build:preload (esbuild) and loaded as the
4
+ // toolbar WCV's `preload`. Its only job is to run the reverse size-advertiser:
5
+ // it measures the host content's intrinsic height (a shrink-to-fit element the
6
+ // host marks `[data-host-toolbar-root]`) and posts it to main on the
7
+ // `view:host-toolbar:advertise-height` channel, so the main renderer reserves
8
+ // exactly that height and the toolbar tracks it (dynamic height, foundation
9
+ // ViewAnchor reverse-advertiser).
10
+ import { installHostToolbarAdvertiserWhenReady } from '../runtime/host-toolbar-advertiser.js';
11
+ installHostToolbarAdvertiserWhenReady();
12
+ //# sourceMappingURL=host-toolbar.js.map