@dimina-kit/devtools 0.3.1-dev.20260513123738 → 0.3.1-dev.20260517100756

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 (109) hide show
  1. package/README.md +153 -82
  2. package/dist/main/api.d.ts +6 -2
  3. package/dist/main/api.js +5 -2
  4. package/dist/main/app/app.d.ts +1 -1
  5. package/dist/main/app/app.js +71 -36
  6. package/dist/main/app/launch.d.ts +2 -2
  7. package/dist/main/app/launch.js +6 -3
  8. package/dist/main/index.bundle.js +1074 -289
  9. package/dist/main/ipc/app.d.ts +2 -1
  10. package/dist/main/ipc/app.js +5 -4
  11. package/dist/main/ipc/index.d.ts +5 -4
  12. package/dist/main/ipc/index.js +5 -4
  13. package/dist/main/ipc/panels.d.ts +2 -1
  14. package/dist/main/ipc/panels.js +14 -9
  15. package/dist/main/ipc/popover.d.ts +4 -1
  16. package/dist/main/ipc/popover.js +15 -5
  17. package/dist/main/ipc/projects.d.ts +4 -1
  18. package/dist/main/ipc/projects.js +42 -5
  19. package/dist/main/ipc/session.d.ts +4 -1
  20. package/dist/main/ipc/session.js +26 -6
  21. package/dist/main/ipc/settings.d.ts +4 -1
  22. package/dist/main/ipc/settings.js +30 -17
  23. package/dist/main/ipc/simulator-module.d.ts +8 -0
  24. package/dist/main/ipc/simulator-module.js +19 -0
  25. package/dist/main/ipc/simulator.d.ts +2 -1
  26. package/dist/main/ipc/simulator.js +29 -15
  27. package/dist/main/ipc/toolbar.d.ts +2 -1
  28. package/dist/main/ipc/toolbar.js +3 -2
  29. package/dist/main/services/automation/index.js +88 -13
  30. package/dist/main/services/mcp/server.d.ts +2 -1
  31. package/dist/main/services/mcp/server.js +5 -0
  32. package/dist/main/services/module.d.ts +18 -0
  33. package/dist/main/services/module.js +2 -0
  34. package/dist/main/services/notifications/renderer-notifier.d.ts +2 -0
  35. package/dist/main/services/projects/project-repository.d.ts +1 -0
  36. package/dist/main/services/projects/project-repository.js +3 -0
  37. package/dist/main/services/settings/index.d.ts +4 -0
  38. package/dist/main/services/settings/index.js +12 -1
  39. package/dist/main/services/simulator/custom-apis.d.ts +10 -0
  40. package/dist/main/services/simulator/custom-apis.js +26 -0
  41. package/dist/main/services/simulator-storage/index.d.ts +22 -1
  42. package/dist/main/services/simulator-storage/index.js +365 -98
  43. package/dist/main/services/update/update-manager.d.ts +16 -1
  44. package/dist/main/services/update/update-manager.js +18 -15
  45. package/dist/main/services/views/view-manager.d.ts +4 -0
  46. package/dist/main/services/views/view-manager.js +33 -2
  47. package/dist/main/services/window-service.d.ts +24 -0
  48. package/dist/main/services/window-service.js +26 -0
  49. package/dist/main/services/workbench-context.d.ts +15 -0
  50. package/dist/main/services/workbench-context.js +6 -0
  51. package/dist/main/services/workspace/workspace-service.d.ts +1 -0
  52. package/dist/main/services/workspace/workspace-service.js +7 -3
  53. package/dist/main/simulator-apis.d.ts +23 -0
  54. package/dist/main/simulator-apis.js +24 -0
  55. package/dist/main/utils/disposable.d.ts +13 -0
  56. package/dist/main/utils/disposable.js +60 -0
  57. package/dist/main/utils/ipc-registry.d.ts +39 -0
  58. package/dist/main/utils/ipc-registry.js +109 -0
  59. package/dist/main/utils/ipc-schema.d.ts +28 -0
  60. package/dist/main/utils/ipc-schema.js +38 -0
  61. package/dist/main/utils/paths.d.ts +6 -0
  62. package/dist/main/utils/paths.js +6 -0
  63. package/dist/main/utils/sender-policy.d.ts +23 -0
  64. package/dist/main/utils/sender-policy.js +42 -0
  65. package/dist/main/windows/main-window/create.d.ts +6 -0
  66. package/dist/main/windows/main-window/create.js +65 -9
  67. package/dist/main/windows/main-window/events.d.ts +2 -1
  68. package/dist/main/windows/main-window/events.js +25 -2
  69. package/dist/main/windows/navigation-hardening.d.ts +24 -0
  70. package/dist/main/windows/navigation-hardening.js +55 -0
  71. package/dist/main/windows/settings-window/create.js +11 -1
  72. package/dist/preload/index.d.ts +19 -0
  73. package/dist/preload/index.js +18 -0
  74. package/dist/preload/instrumentation/app-data.js +178 -19
  75. package/dist/preload/runtime/custom-apis.d.ts +6 -0
  76. package/dist/preload/runtime/custom-apis.js +18 -0
  77. package/dist/preload/runtime/host.d.ts +1 -0
  78. package/dist/preload/runtime/host.js +13 -0
  79. package/dist/preload/windows/main.cjs +47 -0
  80. package/dist/preload/windows/main.cjs.map +7 -0
  81. package/dist/preload/windows/simulator.js +174 -18
  82. package/dist/renderer/assets/index-DW_0thr-.js +46 -0
  83. package/dist/renderer/assets/{input-DxfYnzX_.js → input-C5M5Wxn6.js} +2 -2
  84. package/dist/renderer/assets/{ipc-transport-ClIvDcYY.js → ipc-transport-CUsl-fS2.js} +2 -2
  85. package/dist/renderer/assets/ipc-transport-CltRuvhi.css +1 -0
  86. package/dist/renderer/assets/{popover-CtXcBJtM.js → popover-BSBPVO0o.js} +2 -2
  87. package/dist/renderer/assets/{select-DMfp49f1.js → select-B1tF3UAc.js} +2 -2
  88. package/dist/renderer/assets/{settings-DteGraEU.js → settings-7w54H6p-.js} +2 -2
  89. package/dist/renderer/assets/settings-api-BjJalghB.js +2 -0
  90. package/dist/renderer/assets/workbenchSettings-q2_-nc8t.js +8 -0
  91. package/dist/renderer/entries/main/index.html +12 -5
  92. package/dist/renderer/entries/popover/index.html +7 -5
  93. package/dist/renderer/entries/settings/index.html +7 -5
  94. package/dist/renderer/entries/workbench-settings/index.html +6 -4
  95. package/dist/shared/ipc-channels.d.ts +22 -0
  96. package/dist/shared/ipc-channels.js +23 -0
  97. package/dist/shared/ipc-schemas.d.ts +113 -0
  98. package/dist/shared/ipc-schemas.js +128 -0
  99. package/dist/shared/types.d.ts +2 -0
  100. package/dist/simulator/assets/simulator-DL6kOCq-.js +9 -0
  101. package/dist/simulator/simulator.html +1 -1
  102. package/package.json +11 -27
  103. package/dist/preload/windows/main.d.ts +0 -6
  104. package/dist/preload/windows/main.js +0 -6
  105. package/dist/renderer/assets/index-D1p6crtf.js +0 -46
  106. package/dist/renderer/assets/ipc-transport-EiWxu_hG.css +0 -1
  107. package/dist/renderer/assets/settings-api-CY84UMpN.js +0 -2
  108. package/dist/renderer/assets/workbenchSettings-DjELLnSJ.js +0 -8
  109. package/dist/simulator/assets/simulator-C1eHXnuq.js +0 -9
@@ -8,11 +8,12 @@ import { createMainWindow, wireMainWindowEvents } from '../windows/main-window/i
8
8
  import { createWorkbenchContext } from '../services/workbench-context.js';
9
9
  import { loadWorkbenchSettings, applyTheme } from '../services/settings/index.js';
10
10
  import { installAppMenu } from '../menu/index.js';
11
- import { registerAppIpc, registerSimulatorIpc, registerPanelsIpc, registerPopoverIpc, registerProjectsIpc, registerSessionIpc, registerSettingsIpc, registerToolbarIpc, } from '../ipc/index.js';
11
+ import { registerAppIpc, popoverModule, projectsModule, sessionModule, settingsModule, simulatorModule, } from '../ipc/index.js';
12
12
  import { startAutomationServer } from '../services/automation/index.js';
13
13
  import { startMcpServer } from '../services/mcp/index.js';
14
14
  import { setupSimulatorStorage } from '../services/simulator-storage/index.js';
15
15
  import { UpdateManager } from '../services/update/index.js';
16
+ import { toDisposable } from '../utils/disposable.js';
16
17
  const DEFAULT_MODULES = {
17
18
  projects: true,
18
19
  session: true,
@@ -20,16 +21,12 @@ const DEFAULT_MODULES = {
20
21
  popover: true,
21
22
  settings: true,
22
23
  };
23
- const MODULE_REGISTRARS = {
24
- projects: registerProjectsIpc,
25
- session: registerSessionIpc,
26
- simulator: (ctx) => {
27
- registerSimulatorIpc(ctx);
28
- registerPanelsIpc(ctx);
29
- registerToolbarIpc(ctx);
30
- },
31
- popover: registerPopoverIpc,
32
- settings: registerSettingsIpc,
24
+ const BUILTIN_MODULES = {
25
+ projects: projectsModule,
26
+ session: sessionModule,
27
+ simulator: simulatorModule,
28
+ popover: popoverModule,
29
+ settings: settingsModule,
33
30
  };
34
31
  /** Parse --auto, --auto-port, --project from process.argv. */
35
32
  function parseAutoArgs() {
@@ -58,9 +55,11 @@ function resolveModules(config) {
58
55
  ...config.modules,
59
56
  };
60
57
  }
61
- async function disposeContext(ctx, updateManager) {
62
- updateManager?.dispose();
58
+ async function disposeContext(ctx) {
63
59
  await ctx.workspace.closeProject();
60
+ await ctx.registry.dispose().catch((err) => {
61
+ console.warn('[workbench] dispose registry encountered errors:', err);
62
+ });
64
63
  }
65
64
  function createConfiguredMainWindow(config, rendererDir) {
66
65
  const mainWindow = createMainWindow({
@@ -70,6 +69,11 @@ function createConfiguredMainWindow(config, rendererDir) {
70
69
  height: config.window?.height,
71
70
  minWidth: config.window?.minWidth,
72
71
  minHeight: config.window?.minHeight,
72
+ // P1: pass the same preload path the workbench context stores on
73
+ // ctx.preloadPath so hosts that ship a custom simulator preload are the
74
+ // ones registered on the persist:simulator session — otherwise the
75
+ // backstop wouldn't be the host's script.
76
+ simulatorPreloadPath: config.preloadPath ?? defaultPreloadPath,
73
77
  });
74
78
  // Set window/taskbar icon if provided (Linux/Windows; macOS uses app bundle icon)
75
79
  if (config.icon) {
@@ -96,7 +100,7 @@ function registerBuiltinModules(config, context) {
96
100
  const modules = resolveModules(config);
97
101
  Object.keys(modules).forEach((moduleId) => {
98
102
  if (modules[moduleId])
99
- MODULE_REGISTRARS[moduleId](context);
103
+ context.registry.add(BUILTIN_MODULES[moduleId].setup(context));
100
104
  });
101
105
  }
102
106
  function installMenu(config, mainWindow, context) {
@@ -114,6 +118,7 @@ async function setupAutomation(instance) {
114
118
  if (autoArgs.auto) {
115
119
  const server = await startAutomationServer(instance.context, autoArgs.autoPort);
116
120
  instance.automationServer = server;
121
+ instance.context.registry.add(() => server.close());
117
122
  // Stable, parseable line for e2e harnesses that scrape stdout.
118
123
  console.log(`[automation] listening on ws://127.0.0.1:${server.port}`);
119
124
  }
@@ -121,42 +126,56 @@ async function setupAutomation(instance) {
121
126
  function setupMcp() {
122
127
  const settings = loadWorkbenchSettings();
123
128
  if (!settings.mcp.enabled)
124
- return;
129
+ return null;
125
130
  const cdpPortSwitch = app.commandLine.getSwitchValue('remote-debugging-port');
126
131
  const cdpPort = cdpPortSwitch ? parseInt(cdpPortSwitch, 10) : settings.cdp.port;
127
- startMcpServer(cdpPort, settings.mcp.port);
132
+ return startMcpServer(cdpPort, settings.mcp.port);
128
133
  }
129
134
  function wireAppWindowEvents(config, instance) {
130
135
  const { mainWindow, context } = instance;
131
- wireMainWindowEvents(mainWindow, {
136
+ return wireMainWindowEvents(mainWindow, {
132
137
  context,
133
138
  onResize: () => context.views.repositionAll(),
134
139
  onClose: async (e) => {
135
140
  if (!context.workspace.hasActiveSession())
136
141
  return;
142
+ // Close button while a project session is open: stay in the workbench
143
+ // and surface the project list. Tear down only the session — do NOT
144
+ // dispose `context.registry`, which owns every IPC handler (projects,
145
+ // dialog, settings…). Disposing it would leave the renderer alive but
146
+ // unable to invoke anything, so subsequent clicks on Import/etc. would
147
+ // raise `No handler registered for ...`.
137
148
  e.preventDefault();
138
149
  if (config.onBeforeClose) {
139
150
  await config.onBeforeClose(instance);
140
151
  }
141
- await disposeContext(context);
152
+ await context.workspace.closeProject();
142
153
  context.notify.windowNavigateBack();
143
154
  },
144
155
  });
145
156
  }
146
157
  function enableDevRendererAutoReload(rendererDir) {
147
158
  // Auto-reload renderer windows when dist files change during development
148
- if (!app.isPackaged) {
149
- let reloadTimer = null;
150
- fs.watch(rendererDir, { recursive: true }, () => {
151
- if (reloadTimer)
152
- clearTimeout(reloadTimer);
153
- reloadTimer = setTimeout(() => {
154
- for (const win of BrowserWindow.getAllWindows()) {
155
- win.webContents.reload();
156
- }
157
- }, 300);
158
- });
159
+ if (app.isPackaged) {
160
+ return toDisposable(() => { });
159
161
  }
162
+ let reloadTimer = null;
163
+ const watcher = fs.watch(rendererDir, { recursive: true }, () => {
164
+ if (reloadTimer)
165
+ clearTimeout(reloadTimer);
166
+ reloadTimer = setTimeout(() => {
167
+ for (const win of BrowserWindow.getAllWindows()) {
168
+ win.webContents.reload();
169
+ }
170
+ }, 300);
171
+ });
172
+ return toDisposable(() => {
173
+ if (reloadTimer) {
174
+ clearTimeout(reloadTimer);
175
+ reloadTimer = null;
176
+ }
177
+ watcher.close();
178
+ });
160
179
  }
161
180
  export function createWorkbenchApp(config = {}) {
162
181
  let setupPromise = null;
@@ -170,13 +189,13 @@ export function createWorkbenchApp(config = {}) {
170
189
  const rendererDir = config.rendererDir ?? defaultRendererDir;
171
190
  const mainWindow = createConfiguredMainWindow(config, rendererDir);
172
191
  const context = createContext(config, mainWindow, rendererDir);
173
- registerAppIpc(context);
192
+ context.registry.add(registerAppIpc(context));
174
193
  registerBuiltinModules(config, context);
175
194
  installMenu(config, mainWindow, context);
176
195
  const instance = {
177
196
  mainWindow,
178
197
  context,
179
- dispose: () => disposeContext(context, instance.updateManager),
198
+ dispose: () => disposeContext(context),
180
199
  };
181
200
  if (config.onSetup) {
182
201
  await config.onSetup(instance);
@@ -189,22 +208,38 @@ export function createWorkbenchApp(config = {}) {
189
208
  initialDelay: config.updateOptions?.initialDelay,
190
209
  getCurrentVersion: config.updateOptions?.getCurrentVersion,
191
210
  });
211
+ context.registry.add(() => instance.updateManager.dispose());
192
212
  }
193
213
  await setupAutomation(instance);
194
- setupMcp();
195
- setupSimulatorStorage(mainWindow.webContents);
196
- wireAppWindowEvents(config, instance);
197
- enableDevRendererAutoReload(rendererDir);
214
+ const mcp = setupMcp();
215
+ if (mcp)
216
+ context.registry.add(mcp);
217
+ context.registry.add(setupSimulatorStorage(mainWindow.webContents, {
218
+ senderPolicy: context.senderPolicy,
219
+ // Per-project filter for the simulator-storage panel: the simulator
220
+ // uses a fixed `persist:simulator` partition + a fixed simulator.html
221
+ // origin, so localStorage is shared across every project that has
222
+ // ever opened. The dimina runtime isolates writes with `${appId}_`
223
+ // prefixes; this callback lets the storage panel filter the CDP
224
+ // snapshot/event stream to the active appId.
225
+ getActiveAppId: () => {
226
+ const session = context.workspace.getSession();
227
+ const appInfo = session?.appInfo;
228
+ return appInfo?.appId ?? null;
229
+ },
230
+ }));
231
+ context.registry.add(wireAppWindowEvents(config, instance));
232
+ context.registry.add(enableDevRendererAutoReload(rendererDir));
198
233
  return instance;
199
234
  });
200
235
  return setupPromise;
201
236
  }
202
237
  function start() {
203
- void setup();
204
238
  if (!appEventsRegistered) {
205
239
  appEventsRegistered = true;
206
240
  registerAppLifecycle();
207
241
  }
242
+ return setup().then(() => undefined);
208
243
  }
209
244
  return {
210
245
  setup,
@@ -4,7 +4,7 @@ import type { WorkbenchContext } from '../services/workbench-context.js';
4
4
  * Convenience launcher for the default full-featured app.
5
5
  * Use createWorkbenchApp() when you want to customize modules or window setup.
6
6
  */
7
- export declare function launch(config?: WorkbenchConfig): void;
7
+ export declare function launch(config?: WorkbenchConfig): Promise<void>;
8
8
  export declare function buildDefaultMenu(ctx: WorkbenchContext): void;
9
- export declare function openSettingsWindow(ctx: Pick<WorkbenchContext, 'workbenchSettingsWindow' | 'mainWindow' | 'rendererDir' | 'notify'>): Promise<void>;
9
+ export declare function openSettingsWindow(ctx: Pick<WorkbenchContext, 'workbenchSettingsWindow' | 'mainWindow' | 'rendererDir' | 'notify' | 'windows'>): Promise<void>;
10
10
  //# sourceMappingURL=launch.d.ts.map
@@ -7,16 +7,19 @@ import { loadWorkbenchSettings } from '../services/settings/index.js';
7
7
  * Use createWorkbenchApp() when you want to customize modules or window setup.
8
8
  */
9
9
  export function launch(config = {}) {
10
- createWorkbenchApp(config).start();
10
+ return createWorkbenchApp(config).start();
11
11
  }
12
12
  export function buildDefaultMenu(ctx) {
13
13
  installAppMenu(ctx);
14
14
  }
15
15
  export async function openSettingsWindow(ctx) {
16
16
  if (!ctx.workbenchSettingsWindow || ctx.workbenchSettingsWindow.isDestroyed()) {
17
- ctx.workbenchSettingsWindow = await createSettingsWindow(ctx.mainWindow, ctx.rendererDir);
18
- wireSettingsWindowEvents(ctx.workbenchSettingsWindow, () => {
17
+ const win = await createSettingsWindow(ctx.mainWindow, ctx.rendererDir);
18
+ ctx.workbenchSettingsWindow = win;
19
+ ctx.windows.setSettingsWindow(win);
20
+ wireSettingsWindowEvents(win, () => {
19
21
  ctx.workbenchSettingsWindow = null;
22
+ ctx.windows.setSettingsWindow(null);
20
23
  });
21
24
  }
22
25
  ctx.workbenchSettingsWindow.show();