@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.
- package/README.md +153 -82
- package/dist/main/api.d.ts +6 -2
- package/dist/main/api.js +5 -2
- package/dist/main/app/app.d.ts +1 -1
- package/dist/main/app/app.js +71 -36
- package/dist/main/app/launch.d.ts +2 -2
- package/dist/main/app/launch.js +6 -3
- package/dist/main/index.bundle.js +1074 -289
- package/dist/main/ipc/app.d.ts +2 -1
- package/dist/main/ipc/app.js +5 -4
- package/dist/main/ipc/index.d.ts +5 -4
- package/dist/main/ipc/index.js +5 -4
- package/dist/main/ipc/panels.d.ts +2 -1
- package/dist/main/ipc/panels.js +14 -9
- package/dist/main/ipc/popover.d.ts +4 -1
- package/dist/main/ipc/popover.js +15 -5
- package/dist/main/ipc/projects.d.ts +4 -1
- package/dist/main/ipc/projects.js +42 -5
- package/dist/main/ipc/session.d.ts +4 -1
- package/dist/main/ipc/session.js +26 -6
- package/dist/main/ipc/settings.d.ts +4 -1
- package/dist/main/ipc/settings.js +30 -17
- package/dist/main/ipc/simulator-module.d.ts +8 -0
- package/dist/main/ipc/simulator-module.js +19 -0
- package/dist/main/ipc/simulator.d.ts +2 -1
- package/dist/main/ipc/simulator.js +29 -15
- package/dist/main/ipc/toolbar.d.ts +2 -1
- package/dist/main/ipc/toolbar.js +3 -2
- package/dist/main/services/automation/index.js +88 -13
- package/dist/main/services/mcp/server.d.ts +2 -1
- package/dist/main/services/mcp/server.js +5 -0
- package/dist/main/services/module.d.ts +18 -0
- package/dist/main/services/module.js +2 -0
- package/dist/main/services/notifications/renderer-notifier.d.ts +2 -0
- package/dist/main/services/projects/project-repository.d.ts +1 -0
- package/dist/main/services/projects/project-repository.js +3 -0
- package/dist/main/services/settings/index.d.ts +4 -0
- package/dist/main/services/settings/index.js +12 -1
- package/dist/main/services/simulator/custom-apis.d.ts +10 -0
- package/dist/main/services/simulator/custom-apis.js +26 -0
- package/dist/main/services/simulator-storage/index.d.ts +22 -1
- package/dist/main/services/simulator-storage/index.js +365 -98
- package/dist/main/services/update/update-manager.d.ts +16 -1
- package/dist/main/services/update/update-manager.js +18 -15
- package/dist/main/services/views/view-manager.d.ts +4 -0
- package/dist/main/services/views/view-manager.js +33 -2
- package/dist/main/services/window-service.d.ts +24 -0
- package/dist/main/services/window-service.js +26 -0
- package/dist/main/services/workbench-context.d.ts +15 -0
- package/dist/main/services/workbench-context.js +6 -0
- package/dist/main/services/workspace/workspace-service.d.ts +1 -0
- package/dist/main/services/workspace/workspace-service.js +7 -3
- package/dist/main/simulator-apis.d.ts +23 -0
- package/dist/main/simulator-apis.js +24 -0
- package/dist/main/utils/disposable.d.ts +13 -0
- package/dist/main/utils/disposable.js +60 -0
- package/dist/main/utils/ipc-registry.d.ts +39 -0
- package/dist/main/utils/ipc-registry.js +109 -0
- package/dist/main/utils/ipc-schema.d.ts +28 -0
- package/dist/main/utils/ipc-schema.js +38 -0
- package/dist/main/utils/paths.d.ts +6 -0
- package/dist/main/utils/paths.js +6 -0
- package/dist/main/utils/sender-policy.d.ts +23 -0
- package/dist/main/utils/sender-policy.js +42 -0
- package/dist/main/windows/main-window/create.d.ts +6 -0
- package/dist/main/windows/main-window/create.js +65 -9
- package/dist/main/windows/main-window/events.d.ts +2 -1
- package/dist/main/windows/main-window/events.js +25 -2
- package/dist/main/windows/navigation-hardening.d.ts +24 -0
- package/dist/main/windows/navigation-hardening.js +55 -0
- package/dist/main/windows/settings-window/create.js +11 -1
- package/dist/preload/index.d.ts +19 -0
- package/dist/preload/index.js +18 -0
- package/dist/preload/instrumentation/app-data.js +178 -19
- package/dist/preload/runtime/custom-apis.d.ts +6 -0
- package/dist/preload/runtime/custom-apis.js +18 -0
- package/dist/preload/runtime/host.d.ts +1 -0
- package/dist/preload/runtime/host.js +13 -0
- package/dist/preload/windows/main.cjs +47 -0
- package/dist/preload/windows/main.cjs.map +7 -0
- package/dist/preload/windows/simulator.js +174 -18
- package/dist/renderer/assets/index-DW_0thr-.js +46 -0
- package/dist/renderer/assets/{input-DxfYnzX_.js → input-C5M5Wxn6.js} +2 -2
- package/dist/renderer/assets/{ipc-transport-ClIvDcYY.js → ipc-transport-CUsl-fS2.js} +2 -2
- package/dist/renderer/assets/ipc-transport-CltRuvhi.css +1 -0
- package/dist/renderer/assets/{popover-CtXcBJtM.js → popover-BSBPVO0o.js} +2 -2
- package/dist/renderer/assets/{select-DMfp49f1.js → select-B1tF3UAc.js} +2 -2
- package/dist/renderer/assets/{settings-DteGraEU.js → settings-7w54H6p-.js} +2 -2
- package/dist/renderer/assets/settings-api-BjJalghB.js +2 -0
- package/dist/renderer/assets/workbenchSettings-q2_-nc8t.js +8 -0
- package/dist/renderer/entries/main/index.html +12 -5
- package/dist/renderer/entries/popover/index.html +7 -5
- package/dist/renderer/entries/settings/index.html +7 -5
- package/dist/renderer/entries/workbench-settings/index.html +6 -4
- package/dist/shared/ipc-channels.d.ts +22 -0
- package/dist/shared/ipc-channels.js +23 -0
- package/dist/shared/ipc-schemas.d.ts +113 -0
- package/dist/shared/ipc-schemas.js +128 -0
- package/dist/shared/types.d.ts +2 -0
- package/dist/simulator/assets/simulator-DL6kOCq-.js +9 -0
- package/dist/simulator/simulator.html +1 -1
- package/package.json +11 -27
- package/dist/preload/windows/main.d.ts +0 -6
- package/dist/preload/windows/main.js +0 -6
- package/dist/renderer/assets/index-D1p6crtf.js +0 -46
- package/dist/renderer/assets/ipc-transport-EiWxu_hG.css +0 -1
- package/dist/renderer/assets/settings-api-CY84UMpN.js +0 -2
- package/dist/renderer/assets/workbenchSettings-DjELLnSJ.js +0 -8
- package/dist/simulator/assets/simulator-C1eHXnuq.js +0 -9
package/dist/main/app/app.js
CHANGED
|
@@ -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,
|
|
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
|
|
24
|
-
projects:
|
|
25
|
-
session:
|
|
26
|
-
simulator:
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 (
|
|
149
|
-
|
|
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
|
|
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
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
package/dist/main/app/launch.js
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
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();
|