@dimina-kit/devtools 0.4.0-dev.20260729062524 → 0.4.0-dev.20260801163345

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 (104) hide show
  1. package/dist/main/app/app.js +7 -0
  2. package/dist/main/app/bootstrap.d.ts +8 -5
  3. package/dist/main/app/bootstrap.js +15 -15
  4. package/dist/main/index.bundle.js +2207 -5152
  5. package/dist/main/ipc/app-lifecycle.d.ts +1 -31
  6. package/dist/main/ipc/app-lifecycle.js +1 -53
  7. package/dist/main/ipc/bridge-router.d.ts +19 -152
  8. package/dist/main/ipc/bridge-router.js +28 -2186
  9. package/dist/main/ipc/page-scroll.d.ts +1 -13
  10. package/dist/main/ipc/page-scroll.js +1 -16
  11. package/dist/main/ipc/session-listener-bag.d.ts +1 -40
  12. package/dist/main/ipc/session-listener-bag.js +1 -39
  13. package/dist/main/services/console-forward/index.d.ts +1 -60
  14. package/dist/main/services/console-forward/index.js +1 -225
  15. package/dist/main/services/console-forward/internal-log.d.ts +1 -10
  16. package/dist/main/services/console-forward/internal-log.js +1 -22
  17. package/dist/main/services/diagnostics/index.d.ts +1 -58
  18. package/dist/main/services/diagnostics/index.js +1 -60
  19. package/dist/main/services/dimina-resource-server.d.ts +1 -6
  20. package/dist/main/services/dimina-resource-server.js +1 -98
  21. package/dist/main/services/mcp/target-manager.js +5 -1
  22. package/dist/main/services/network-forward/index.d.ts +15 -3
  23. package/dist/main/services/network-forward/index.js +30 -4
  24. package/dist/main/services/network-forward/websocket.d.ts +36 -0
  25. package/dist/main/services/network-forward/websocket.js +120 -0
  26. package/dist/main/services/service-host-pool/pool.d.ts +1 -196
  27. package/dist/main/services/service-host-pool/pool.js +1 -363
  28. package/dist/main/services/simulator/custom-apis.d.ts +1 -42
  29. package/dist/main/services/simulator/custom-apis.js +1 -46
  30. package/dist/main/services/simulator/referer.d.ts +1 -9
  31. package/dist/main/services/simulator/referer.js +1 -19
  32. package/dist/main/services/simulator-storage/service-storage-ops.d.ts +1 -39
  33. package/dist/main/services/simulator-storage/service-storage-ops.js +1 -66
  34. package/dist/main/services/simulator-temp-files/disk.d.ts +1 -54
  35. package/dist/main/services/simulator-temp-files/disk.js +1 -237
  36. package/dist/main/services/simulator-temp-files/fs-channels.d.ts +1 -68
  37. package/dist/main/services/simulator-temp-files/fs-channels.js +1 -107
  38. package/dist/main/services/simulator-temp-files/index.d.ts +1 -32
  39. package/dist/main/services/simulator-temp-files/index.js +1 -181
  40. package/dist/main/services/simulator-temp-files/request-handler.d.ts +1 -29
  41. package/dist/main/services/simulator-temp-files/request-handler.js +1 -177
  42. package/dist/main/services/simulator-temp-files/resolver.d.ts +1 -21
  43. package/dist/main/services/simulator-temp-files/resolver.js +1 -21
  44. package/dist/main/services/simulator-temp-files/store.d.ts +1 -13
  45. package/dist/main/services/simulator-temp-files/store.js +1 -23
  46. package/dist/main/services/views/miniapp-partition.d.ts +1 -89
  47. package/dist/main/services/views/miniapp-partition.js +1 -158
  48. package/dist/main/services/views/simulator-session-policy.d.ts +1 -27
  49. package/dist/main/services/views/simulator-session-policy.js +1 -98
  50. package/dist/main/services/workbench-context.d.ts +4 -1
  51. package/dist/main/services/workbench-context.js +17 -0
  52. package/dist/main/utils/ipc-registry.d.ts +21 -3
  53. package/dist/main/utils/ipc-registry.js +26 -23
  54. package/dist/main/utils/paths.d.ts +14 -0
  55. package/dist/main/utils/paths.js +14 -0
  56. package/dist/main/windows/service-host-window/create.d.ts +1 -92
  57. package/dist/main/windows/service-host-window/create.js +1 -154
  58. package/dist/native-host/common/common.js +154 -58
  59. package/dist/native-host/container/pageFrame.css +1 -1
  60. package/dist/native-host/render/render.js +6611 -3312
  61. package/dist/native-host/service/service.js +2 -2
  62. package/dist/preload/index.d.ts +2 -0
  63. package/dist/preload/index.js +1 -0
  64. package/dist/preload/runtime/clipboard.d.ts +6 -0
  65. package/dist/preload/runtime/clipboard.js +12 -0
  66. package/dist/preload/runtime/native-host.d.ts +2 -0
  67. package/dist/preload/runtime/native-host.js +5 -10
  68. package/dist/preload/runtime/node-bindings.d.ts +18 -0
  69. package/dist/preload/runtime/node-bindings.js +44 -0
  70. package/dist/preload/windows/host-toolbar-runtime.cjs.map +2 -2
  71. package/dist/preload/windows/main.cjs +1195 -897
  72. package/dist/preload/windows/main.cjs.map +4 -4
  73. package/dist/preload/windows/simulator.cjs +149 -60
  74. package/dist/preload/windows/simulator.cjs.map +4 -4
  75. package/dist/preload/windows/simulator.js +149 -60
  76. package/dist/render-host/pageFrame.html +3 -3
  77. package/dist/shared/bridge-channels.d.ts +1 -419
  78. package/dist/shared/bridge-channels.js +1 -89
  79. package/dist/shared/dmb-resource-url.d.ts +2 -0
  80. package/dist/shared/dmb-resource-url.js +2 -0
  81. package/dist/shared/ipc-channels.d.ts +2 -32
  82. package/dist/shared/ipc-channels.js +2 -5
  83. package/dist/shared/node-bindings.d.ts +2 -0
  84. package/dist/shared/node-bindings.js +2 -0
  85. package/dist/shared/request-core.d.ts +1 -83
  86. package/dist/shared/request-core.js +1 -167
  87. package/dist/simulator/assets/device-shell-Cw7c-IkG.js +2 -0
  88. package/dist/simulator/assets/{device-shell-BHz1v3Yo.css → device-shell-DbC5ccs8.css} +1 -1
  89. package/dist/simulator/assets/{jsx-runtime-hBv-rHqQ.js → jsx-runtime-DkKmJyBb.js} +2 -2
  90. package/dist/simulator/assets/simulator-COIE6R49.js +10 -0
  91. package/dist/simulator/assets/simulator-mini-app-BLn7XV8e.js +2 -0
  92. package/dist/simulator/simulator.html +2 -2
  93. package/dist/simulator/temp-files.d.ts +29 -0
  94. package/dist/simulator/temp-files.js +79 -0
  95. package/dist/simulator/types.d.ts +43 -0
  96. package/dist/simulator/types.js +2 -0
  97. package/package.json +6 -5
  98. package/dist/shared/simulator-api-metadata.d.ts +0 -26
  99. package/dist/shared/simulator-api-metadata.js +0 -59
  100. package/dist/shared/vpath.d.ts +0 -42
  101. package/dist/shared/vpath.js +0 -105
  102. package/dist/simulator/assets/device-shell-CH_DMYaz.js +0 -2
  103. package/dist/simulator/assets/simulator-DXraYerh.js +0 -10
  104. package/dist/simulator/assets/simulator-mini-app-w1Bhwkld.js +0 -2
@@ -1,4 +1,26 @@
1
1
  "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
2
24
 
3
25
  // src/preload/shared/expose.ts
4
26
  var import_electron = require("electron");
@@ -341,6 +363,49 @@ function installSimulatorBridge() {
341
363
  // src/preload/runtime/custom-apis.ts
342
364
  var import_electron2 = require("electron");
343
365
 
366
+ // ../dimina-electron-runtime/dist/shared/bridge-channels.js
367
+ var BRIDGE_CHANNELS = {
368
+ SPAWN: "dmb:spawn",
369
+ DISPOSE: "dmb:dispose",
370
+ PAGE_OPEN: "dmb:page:open",
371
+ PAGE_CLOSE: "dmb:page:close",
372
+ PAGE_LIFECYCLE: "dmb:page:lifecycle",
373
+ NAV_CALLBACK: "dmb:nav:callback",
374
+ SERVICE_INVOKE: "dmb:service:invoke",
375
+ SERVICE_PUBLISH: "dmb:service:publish",
376
+ RENDER_INVOKE: "dmb:render:invoke",
377
+ RENDER_PUBLISH: "dmb:render:publish",
378
+ TO_SERVICE: "dmb:to-service",
379
+ TO_RENDER: "dmb:to-render",
380
+ SIMULATOR_API: "dmb:simulator-api",
381
+ /** simulator → main: ack of an API_CALL request (carries success/fail args). */
382
+ API_RESPONSE: "dmb:api:response",
383
+ /**
384
+ * simulator webview preload → main (sendSync): "is native-host mode on?".
385
+ * The guest preload can't read the launch `process.env`, so it asks main
386
+ * (which can) at install time. Reply is `e.returnValue = boolean`.
387
+ */
388
+ NATIVE_HOST_ENABLED: "dmb:native-host-enabled",
389
+ /**
390
+ * simulator (DeviceShell) → main: the visible top-of-stack page bridgeId.
391
+ * Main has no z-order concept — the active page lives only in DeviceShell's
392
+ * ShellState — so devtools panels / automation that must target "the current
393
+ * page's render webContents" resolve it through this signal. Fire-and-forget.
394
+ */
395
+ ACTIVE_PAGE: "dmb:active-page",
396
+ /**
397
+ * simulator (DeviceShell) → main: the FULL ordered page stack (bottom→top)
398
+ * whenever it changes. Main has no stack of its own (it only learns the
399
+ * active bridgeId via ACTIVE_PAGE), so automation's `App.getPageStack` needs
400
+ * this to report multi-page stacks. Fire-and-forget.
401
+ */
402
+ PAGE_STACK: "dmb:page-stack"
403
+ };
404
+ var SimulatorCustomApiBridgeChannel = {
405
+ Request: "simulator:custom-apis:bridge-request",
406
+ Response: "simulator:custom-apis:bridge-response"
407
+ };
408
+
344
409
  // src/shared/ipc-channels.ts
345
410
  var SimulatorChannel = {
346
411
  // Ask main to create the simulator as a top-level WebContentsView (so nested
@@ -365,10 +430,6 @@ var SimulatorChannel = {
365
430
  // string (same bare format as `getCurrentPagePath`), or '' when unknown.
366
431
  CurrentPage: "simulator:current-page"
367
432
  };
368
- var SimulatorCustomApiBridgeChannel = {
369
- Request: "simulator:custom-apis:bridge-request",
370
- Response: "simulator:custom-apis:bridge-response"
371
- };
372
433
 
373
434
  // src/preload/runtime/custom-apis.ts
374
435
  var LIST_RETRY_INTERVAL_MS = 150;
@@ -446,6 +507,31 @@ function installCustomApisBridge() {
446
507
  return exposeOnMainWorld("__diminaCustomApis", bridge);
447
508
  }
448
509
 
510
+ // src/preload/runtime/node-bindings.ts
511
+ var import_node_fs = __toESM(require("node:fs"), 1);
512
+ var import_node_os = __toESM(require("node:os"), 1);
513
+ var import_node_path = __toESM(require("node:path"), 1);
514
+ var import_node_crypto = __toESM(require("node:crypto"), 1);
515
+ var import_node_buffer = __toESM(require("node:buffer"), 1);
516
+
517
+ // ../dimina-electron-runtime/dist/shared/node-bindings.js
518
+ var NODE_BINDINGS_GLOBAL = "__diminaNodeBindings";
519
+
520
+ // src/preload/runtime/node-bindings.ts
521
+ function installNodeBindings() {
522
+ const existing = Object.getOwnPropertyDescriptor(globalThis, NODE_BINDINGS_GLOBAL);
523
+ if (existing && !existing.configurable) {
524
+ return;
525
+ }
526
+ const bindings = Object.freeze({ fs: import_node_fs.default, os: import_node_os.default, path: import_node_path.default, crypto: import_node_crypto.default, buffer: import_node_buffer.default });
527
+ Object.defineProperty(globalThis, NODE_BINDINGS_GLOBAL, {
528
+ value: bindings,
529
+ writable: false,
530
+ configurable: false,
531
+ enumerable: true
532
+ });
533
+ }
534
+
449
535
  // src/preload/runtime/temp-files.ts
450
536
  var import_electron3 = require("electron");
451
537
 
@@ -458,18 +544,18 @@ function setTempFileSink(sink) {
458
544
  // src/preload/runtime/temp-files.ts
459
545
  function installTempFileBridge() {
460
546
  setTempFileSink({
461
- write(path, blob) {
547
+ write(path2, blob) {
462
548
  blob.arrayBuffer().then((bytes) => {
463
549
  import_electron3.ipcRenderer.send("simulator:temp-file:write", {
464
- path,
550
+ path: path2,
465
551
  mime: blob.type,
466
552
  bytes
467
553
  });
468
554
  }).catch(() => {
469
555
  });
470
556
  },
471
- revoke(path) {
472
- import_electron3.ipcRenderer.send("simulator:temp-file:revoke", { path });
557
+ revoke(path2) {
558
+ import_electron3.ipcRenderer.send("simulator:temp-file:revoke", { path: path2 });
473
559
  },
474
560
  revokeAll() {
475
561
  import_electron3.ipcRenderer.send("simulator:temp-file:revoke-all");
@@ -654,7 +740,7 @@ function createAppDataSource() {
654
740
  };
655
741
  }
656
742
 
657
- // src/shared/request-core.ts
743
+ // ../dimina-electron-runtime/dist/shared/request-core.js
658
744
  var DEFAULT_REQUEST_TIMEOUT_MS = 6e4;
659
745
  var MAX_TIMEOUT_MS = 2147483647;
660
746
  function resolveTimeoutBudgetMs(timeout) {
@@ -664,9 +750,11 @@ function resolveTimeoutBudgetMs(timeout) {
664
750
  function buildHeaders(header) {
665
751
  const headers = new Headers();
666
752
  for (const [key, value] of Object.entries(header ?? {})) {
667
- if (value != null) headers.set(key, String(value));
753
+ if (value != null)
754
+ headers.set(key, String(value));
668
755
  }
669
- if (!headers.has("content-type")) headers.set("content-type", "application/json");
756
+ if (!headers.has("content-type"))
757
+ headers.set("content-type", "application/json");
670
758
  return headers;
671
759
  }
672
760
  function appendQueryParams(url, data) {
@@ -678,7 +766,8 @@ function appendQueryParams(url, data) {
678
766
  return resolved.toString();
679
767
  }
680
768
  function encodeBody(data, contentType) {
681
- if (typeof data === "string") return data;
769
+ if (typeof data === "string")
770
+ return data;
682
771
  if (contentType.includes("application/x-www-form-urlencoded")) {
683
772
  const form = new URLSearchParams();
684
773
  for (const [key, value] of Object.entries(data)) {
@@ -693,7 +782,8 @@ async function decodeResponseData(response, dataType, responseType) {
693
782
  return response.arrayBuffer();
694
783
  }
695
784
  const text = await response.text();
696
- if (dataType !== "json") return text;
785
+ if (dataType !== "json")
786
+ return text;
697
787
  try {
698
788
  return JSON.parse(text);
699
789
  } catch {
@@ -717,14 +807,16 @@ function performRequest(opts, callbacks) {
717
807
  init.signal = controller.signal;
718
808
  let settled = false;
719
809
  function settleSuccess(res) {
720
- if (settled) return;
810
+ if (settled)
811
+ return;
721
812
  settled = true;
722
813
  clearTimeout(timer);
723
814
  callbacks.success?.(res);
724
815
  callbacks.complete?.(res);
725
816
  }
726
817
  function settleFail(err) {
727
- if (settled) return;
818
+ if (settled)
819
+ return;
728
820
  settled = true;
729
821
  clearTimeout(timer);
730
822
  callbacks.fail?.(err);
@@ -909,44 +1001,33 @@ function setupApiCompatHook() {
909
1001
  // src/preload/runtime/native-host.ts
910
1002
  var import_electron5 = require("electron");
911
1003
 
912
- // src/shared/bridge-channels.ts
913
- var BRIDGE_CHANNELS = {
914
- SPAWN: "dmb:spawn",
915
- DISPOSE: "dmb:dispose",
916
- PAGE_OPEN: "dmb:page:open",
917
- PAGE_CLOSE: "dmb:page:close",
918
- PAGE_LIFECYCLE: "dmb:page:lifecycle",
919
- NAV_CALLBACK: "dmb:nav:callback",
920
- SERVICE_INVOKE: "dmb:service:invoke",
921
- SERVICE_PUBLISH: "dmb:service:publish",
922
- RENDER_INVOKE: "dmb:render:invoke",
923
- RENDER_PUBLISH: "dmb:render:publish",
924
- TO_SERVICE: "dmb:to-service",
925
- TO_RENDER: "dmb:to-render",
926
- SIMULATOR_API: "dmb:simulator-api",
927
- /** simulator main: ack of an API_CALL request (carries success/fail args). */
928
- API_RESPONSE: "dmb:api:response",
929
- /**
930
- * simulator webview preload → main (sendSync): "is native-host mode on?".
931
- * The guest preload can't read the launch `process.env`, so it asks main
932
- * (which can) at install time. Reply is `e.returnValue = boolean`.
933
- */
934
- NATIVE_HOST_ENABLED: "dmb:native-host-enabled",
935
- /**
936
- * simulator (DeviceShell) → main: the visible top-of-stack page bridgeId.
937
- * Main has no z-order concept — the active page lives only in DeviceShell's
938
- * ShellState — so devtools panels / automation that must target "the current
939
- * page's render webContents" resolve it through this signal. Fire-and-forget.
940
- */
941
- ACTIVE_PAGE: "dmb:active-page",
942
- /**
943
- * simulator (DeviceShell) → main: the FULL ordered page stack (bottom→top)
944
- * whenever it changes. Main has no stack of its own (it only learns the
945
- * active bridgeId via ACTIVE_PAGE), so automation's `App.getPageStack` needs
946
- * this to report multi-page stacks. Fire-and-forget.
947
- */
948
- PAGE_STACK: "dmb:page-stack"
949
- };
1004
+ // ../dimina-electron-runtime/dist/shared/dmb-resource-url.js
1005
+ var DMB_PAGEFRAME_DOC_NAME = "__frame__.html";
1006
+ function buildRenderHostDocumentUrl(opts) {
1007
+ const PATH_SEPARATOR_RE = /[/\\]/;
1008
+ for (const [name, value] of [["appId", opts.appId], ["root", opts.root]]) {
1009
+ if (PATH_SEPARATOR_RE.test(value) || value === "." || value === "..") {
1010
+ throw new Error(`[dmb-resource-url] ${name} must be a single path segment, got ${JSON.stringify(value)}`);
1011
+ }
1012
+ }
1013
+ const pageDirSegments = opts.pagePath.split(PATH_SEPARATOR_RE).slice(0, -1).filter(Boolean);
1014
+ for (const segment of pageDirSegments) {
1015
+ if (segment === "." || segment === "..") {
1016
+ throw new Error(`[dmb-resource-url] pagePath must not contain '.'/'..' segments, got ${JSON.stringify(opts.pagePath)}`);
1017
+ }
1018
+ }
1019
+ const pathSegments = [opts.appId, opts.root, ...pageDirSegments, DMB_PAGEFRAME_DOC_NAME].map(encodeURIComponent);
1020
+ const url = new URL(`dmb-resource://${opts.bridgeId}/${pathSegments.join("/")}`);
1021
+ url.searchParams.set("bridgeId", opts.bridgeId);
1022
+ url.searchParams.set("appId", opts.appId);
1023
+ url.searchParams.set("root", opts.root);
1024
+ url.searchParams.set("pagePath", opts.pagePath);
1025
+ if (opts.isTab)
1026
+ url.searchParams.set("isTab", "1");
1027
+ if (opts.backgroundColor)
1028
+ url.searchParams.set("bgColor", opts.backgroundColor);
1029
+ return url.toString();
1030
+ }
950
1031
 
951
1032
  // src/preload/runtime/native-host.ts
952
1033
  function queryNativeHostConfig() {
@@ -990,13 +1071,7 @@ function buildBridge2(cfg) {
990
1071
  import_electron5.ipcRenderer.send(BRIDGE_CHANNELS.PAGE_STACK, payload);
991
1072
  },
992
1073
  createRenderHostUrl(opts) {
993
- const url = new URL(cfg.renderHostHtmlUrl);
994
- url.searchParams.set("bridgeId", opts.bridgeId);
995
- url.searchParams.set("appId", opts.appId);
996
- url.searchParams.set("pagePath", opts.pagePath);
997
- if (opts.isTab) url.searchParams.set("isTab", "1");
998
- if (opts.backgroundColor) url.searchParams.set("bgColor", opts.backgroundColor);
999
- return url.toString();
1074
+ return buildRenderHostDocumentUrl(opts);
1000
1075
  },
1001
1076
  renderPreloadUrl: cfg.renderPreloadUrl,
1002
1077
  device: cfg.device,
@@ -1017,12 +1092,26 @@ function installNativeHostBridge() {
1017
1092
  return exposeOnMainWorld("__diminaNativeHost", buildBridge2(cfg));
1018
1093
  }
1019
1094
 
1095
+ // src/preload/runtime/clipboard.ts
1096
+ var import_electron6 = require("electron");
1097
+ function buildBridge3() {
1098
+ return {
1099
+ readText: () => import_electron6.clipboard.readText(),
1100
+ writeText: (text) => import_electron6.clipboard.writeText(text)
1101
+ };
1102
+ }
1103
+ function installClipboardBridge() {
1104
+ return exposeOnMainWorld("__diminaClipboard", buildBridge3());
1105
+ }
1106
+
1020
1107
  // src/preload/windows/simulator.ts
1108
+ installNodeBindings();
1021
1109
  setupApiCompatHook();
1022
1110
  installSimulatorBridge();
1023
1111
  installCustomApisBridge();
1024
1112
  installTempFileBridge();
1025
1113
  installConsoleInstrumentation();
1114
+ installClipboardBridge();
1026
1115
  installNativeHostBridge();
1027
1116
  createAppDataSource().start(() => {
1028
1117
  });
@@ -12,17 +12,17 @@
12
12
  native-host render-host must load it too. build-native-host.mjs vendors it to
13
13
  ../native-host/container/ and rewrites this href (mirrors common.js/render.js).
14
14
  -->
15
- <link rel="stylesheet" href="../native-host/container/pageFrame.css" />
15
+ <link rel="stylesheet" href="/__sdk__/native-host/container/pageFrame.css" />
16
16
  <script>
17
17
  if (typeof globalThis.process === 'undefined') {
18
18
  globalThis.process = { env: { NODE_ENV: 'production' } };
19
19
  }
20
20
  </script>
21
21
  <script type="module">
22
- import { modDefine, modRequire } from '../native-host/common/common.js'
22
+ import { modDefine, modRequire } from '/__sdk__/native-host/common/common.js'
23
23
  window.modDefine = modDefine
24
24
  window.modRequire = modRequire
25
- await import('../native-host/render/render.js')
25
+ await import('/__sdk__/native-host/render/render.js')
26
26
  </script>
27
27
  </head>
28
28
  <body></body>