@desktalk/core 0.1.0-alpha.1
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/LICENSE +21 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/frontend/assets/frontend-B3QNYf3p.js +413 -0
- package/dist/frontend/assets/frontend-B3QNYf3p.js.map +1 -0
- package/dist/frontend/assets/frontend-B4aeXn9d.js +416 -0
- package/dist/frontend/assets/frontend-B4aeXn9d.js.map +1 -0
- package/dist/frontend/assets/frontend-BwyRSlHp.js +6513 -0
- package/dist/frontend/assets/frontend-BwyRSlHp.js.map +1 -0
- package/dist/frontend/assets/frontend-Dix2OWTT.js +229 -0
- package/dist/frontend/assets/frontend-Dix2OWTT.js.map +1 -0
- package/dist/frontend/assets/frontend-Dx41dEM9.js +407 -0
- package/dist/frontend/assets/frontend-Dx41dEM9.js.map +1 -0
- package/dist/frontend/assets/frontend-WpQng8Mt.js +1991 -0
- package/dist/frontend/assets/frontend-WpQng8Mt.js.map +1 -0
- package/dist/frontend/assets/frontend-rTwBdJbn.js +2123 -0
- package/dist/frontend/assets/frontend-rTwBdJbn.js.map +1 -0
- package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js +2 -0
- package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js.map +1 -0
- package/dist/frontend/assets/index-C5-XUOS7.js +1863 -0
- package/dist/frontend/assets/index-C5-XUOS7.js.map +1 -0
- package/dist/frontend/assets/index-C_e3_6yE.css +1 -0
- package/dist/frontend/index.html +22 -0
- package/dist/frontend/pcm-capture-processor.js +65 -0
- package/dist/i18n/manifest.json +34 -0
- package/dist/i18n/zh-CN.json +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server/admin-routes.d.ts +14 -0
- package/dist/server/admin-routes.d.ts.map +1 -0
- package/dist/server/admin-routes.js +118 -0
- package/dist/server/admin-routes.js.map +1 -0
- package/dist/server/api-routes.d.ts +8 -0
- package/dist/server/api-routes.d.ts.map +1 -0
- package/dist/server/api-routes.js +203 -0
- package/dist/server/api-routes.js.map +1 -0
- package/dist/server/auth-routes.d.ts +19 -0
- package/dist/server/auth-routes.d.ts.map +1 -0
- package/dist/server/auth-routes.js +155 -0
- package/dist/server/auth-routes.js.map +1 -0
- package/dist/server/dtfs-routes.d.ts +3 -0
- package/dist/server/dtfs-routes.d.ts.map +1 -0
- package/dist/server/dtfs-routes.js +183 -0
- package/dist/server/dtfs-routes.js.map +1 -0
- package/dist/server/index.d.ts +15 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +158 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/monaco-routes.d.ts +3 -0
- package/dist/server/monaco-routes.d.ts.map +1 -0
- package/dist/server/monaco-routes.js +45 -0
- package/dist/server/monaco-routes.js.map +1 -0
- package/dist/server/voice-routes.d.ts +7 -0
- package/dist/server/voice-routes.d.ts.map +1 -0
- package/dist/server/voice-routes.js +142 -0
- package/dist/server/voice-routes.js.map +1 -0
- package/dist/server/ws-routes.d.ts +29 -0
- package/dist/server/ws-routes.d.ts.map +1 -0
- package/dist/server/ws-routes.js +334 -0
- package/dist/server/ws-routes.js.map +1 -0
- package/dist/services/ai/action-tool.d.ts +9 -0
- package/dist/services/ai/action-tool.d.ts.map +1 -0
- package/dist/services/ai/action-tool.js +51 -0
- package/dist/services/ai/action-tool.js.map +1 -0
- package/dist/services/ai/app-tools.d.ts +15 -0
- package/dist/services/ai/app-tools.d.ts.map +1 -0
- package/dist/services/ai/app-tools.js +119 -0
- package/dist/services/ai/app-tools.js.map +1 -0
- package/dist/services/ai/chat-service.d.ts +27 -0
- package/dist/services/ai/chat-service.d.ts.map +1 -0
- package/dist/services/ai/chat-service.js +213 -0
- package/dist/services/ai/chat-service.js.map +1 -0
- package/dist/services/ai/create-liveapp-tool.d.ts +15 -0
- package/dist/services/ai/create-liveapp-tool.d.ts.map +1 -0
- package/dist/services/ai/create-liveapp-tool.js +142 -0
- package/dist/services/ai/create-liveapp-tool.js.map +1 -0
- package/dist/services/ai/desktop-tool.d.ts +27 -0
- package/dist/services/ai/desktop-tool.d.ts.map +1 -0
- package/dist/services/ai/desktop-tool.js +106 -0
- package/dist/services/ai/desktop-tool.js.map +1 -0
- package/dist/services/ai/edit-history.d.ts +16 -0
- package/dist/services/ai/edit-history.d.ts.map +1 -0
- package/dist/services/ai/edit-history.js +137 -0
- package/dist/services/ai/edit-history.js.map +1 -0
- package/dist/services/ai/edit-tool.d.ts +9 -0
- package/dist/services/ai/edit-tool.d.ts.map +1 -0
- package/dist/services/ai/edit-tool.js +113 -0
- package/dist/services/ai/edit-tool.js.map +1 -0
- package/dist/services/ai/generate-html-tool.d.ts +15 -0
- package/dist/services/ai/generate-html-tool.d.ts.map +1 -0
- package/dist/services/ai/generate-html-tool.js +140 -0
- package/dist/services/ai/generate-html-tool.js.map +1 -0
- package/dist/services/ai/generate-icon-tool.d.ts +10 -0
- package/dist/services/ai/generate-icon-tool.d.ts.map +1 -0
- package/dist/services/ai/generate-icon-tool.js +58 -0
- package/dist/services/ai/generate-icon-tool.js.map +1 -0
- package/dist/services/ai/html-bridge-script.d.ts +2 -0
- package/dist/services/ai/html-bridge-script.d.ts.map +1 -0
- package/dist/services/ai/html-bridge-script.js +2 -0
- package/dist/services/ai/html-bridge-script.js.map +1 -0
- package/dist/services/ai/html-guidelines-tool.d.ts +3 -0
- package/dist/services/ai/html-guidelines-tool.d.ts.map +1 -0
- package/dist/services/ai/html-guidelines-tool.js +157 -0
- package/dist/services/ai/html-guidelines-tool.js.map +1 -0
- package/dist/services/ai/html-stream-coordinator.d.ts +92 -0
- package/dist/services/ai/html-stream-coordinator.d.ts.map +1 -0
- package/dist/services/ai/html-stream-coordinator.js +314 -0
- package/dist/services/ai/html-stream-coordinator.js.map +1 -0
- package/dist/services/ai/html-theme-link.d.ts +9 -0
- package/dist/services/ai/html-theme-link.d.ts.map +1 -0
- package/dist/services/ai/html-theme-link.js +12 -0
- package/dist/services/ai/html-theme-link.js.map +1 -0
- package/dist/services/ai/html-ui-script.d.ts +9 -0
- package/dist/services/ai/html-ui-script.d.ts.map +1 -0
- package/dist/services/ai/html-ui-script.js +9 -0
- package/dist/services/ai/html-ui-script.js.map +1 -0
- package/dist/services/ai/image-generation-service.d.ts +26 -0
- package/dist/services/ai/image-generation-service.d.ts.map +1 -0
- package/dist/services/ai/image-generation-service.js +205 -0
- package/dist/services/ai/image-generation-service.js.map +1 -0
- package/dist/services/ai/manual-pages/desktop-actions.md +36 -0
- package/dist/services/ai/manual-pages/desktop-windows.md +24 -0
- package/dist/services/ai/manual-pages/dt-badge.md +36 -0
- package/dist/services/ai/manual-pages/dt-button.md +38 -0
- package/dist/services/ai/manual-pages/dt-card.md +22 -0
- package/dist/services/ai/manual-pages/dt-chart.md +261 -0
- package/dist/services/ai/manual-pages/dt-divider.md +25 -0
- package/dist/services/ai/manual-pages/dt-grid.md +29 -0
- package/dist/services/ai/manual-pages/dt-list-view.md +96 -0
- package/dist/services/ai/manual-pages/dt-markdown-editor.md +90 -0
- package/dist/services/ai/manual-pages/dt-markdown.md +86 -0
- package/dist/services/ai/manual-pages/dt-select.md +21 -0
- package/dist/services/ai/manual-pages/dt-stack.md +31 -0
- package/dist/services/ai/manual-pages/dt-stat.md +43 -0
- package/dist/services/ai/manual-pages/dt-table-view.md +120 -0
- package/dist/services/ai/manual-pages/dt-tooltip.md +18 -0
- package/dist/services/ai/manual-pages/editing-preview.md +25 -0
- package/dist/services/ai/manual-pages/html-actions.md +74 -0
- package/dist/services/ai/manual-pages/html-bridge.md +187 -0
- package/dist/services/ai/manual-pages/html-components.md +66 -0
- package/dist/services/ai/manual-pages/html-examples.md +185 -0
- package/dist/services/ai/manual-pages/html-layouts.md +128 -0
- package/dist/services/ai/manual-pages/html-storage.md +153 -0
- package/dist/services/ai/manual-pages/html-tokens.md +26 -0
- package/dist/services/ai/manual-pages/index.d.ts +10 -0
- package/dist/services/ai/manual-pages/index.d.ts.map +1 -0
- package/dist/services/ai/manual-pages/index.js +186 -0
- package/dist/services/ai/manual-pages/index.js.map +1 -0
- package/dist/services/ai/manual-tool.d.ts +3 -0
- package/dist/services/ai/manual-tool.d.ts.map +1 -0
- package/dist/services/ai/manual-tool.js +104 -0
- package/dist/services/ai/manual-tool.js.map +1 -0
- package/dist/services/ai/pi-session-service.d.ts +101 -0
- package/dist/services/ai/pi-session-service.d.ts.map +1 -0
- package/dist/services/ai/pi-session-service.js +697 -0
- package/dist/services/ai/pi-session-service.js.map +1 -0
- package/dist/services/ai/providers.d.ts +21 -0
- package/dist/services/ai/providers.d.ts.map +1 -0
- package/dist/services/ai/providers.js +93 -0
- package/dist/services/ai/providers.js.map +1 -0
- package/dist/services/ai/redo-edit-tool.d.ts +9 -0
- package/dist/services/ai/redo-edit-tool.d.ts.map +1 -0
- package/dist/services/ai/redo-edit-tool.js +44 -0
- package/dist/services/ai/redo-edit-tool.js.map +1 -0
- package/dist/services/ai/system-prompt.d.ts +7 -0
- package/dist/services/ai/system-prompt.d.ts.map +1 -0
- package/dist/services/ai/system-prompt.js +72 -0
- package/dist/services/ai/system-prompt.js.map +1 -0
- package/dist/services/ai/undo-edit-tool.d.ts +9 -0
- package/dist/services/ai/undo-edit-tool.d.ts.map +1 -0
- package/dist/services/ai/undo-edit-tool.js +44 -0
- package/dist/services/ai/undo-edit-tool.js.map +1 -0
- package/dist/services/ai/window-tools.d.ts +27 -0
- package/dist/services/ai/window-tools.d.ts.map +1 -0
- package/dist/services/ai/window-tools.js +155 -0
- package/dist/services/ai/window-tools.js.map +1 -0
- package/dist/services/backend-host.d.ts +10 -0
- package/dist/services/backend-host.d.ts.map +1 -0
- package/dist/services/backend-host.js +117 -0
- package/dist/services/backend-host.js.map +1 -0
- package/dist/services/backend-ipc.d.ts +60 -0
- package/dist/services/backend-ipc.d.ts.map +1 -0
- package/dist/services/backend-ipc.js +2 -0
- package/dist/services/backend-ipc.js.map +1 -0
- package/dist/services/backend-process-manager.d.ts +60 -0
- package/dist/services/backend-process-manager.d.ts.map +1 -0
- package/dist/services/backend-process-manager.js +203 -0
- package/dist/services/backend-process-manager.js.map +1 -0
- package/dist/services/filesystem.d.ts +8 -0
- package/dist/services/filesystem.d.ts.map +1 -0
- package/dist/services/filesystem.js +94 -0
- package/dist/services/filesystem.js.map +1 -0
- package/dist/services/i18n.d.ts +28 -0
- package/dist/services/i18n.d.ts.map +1 -0
- package/dist/services/i18n.js +76 -0
- package/dist/services/i18n.js.map +1 -0
- package/dist/services/liveapp-icon.d.ts +9 -0
- package/dist/services/liveapp-icon.d.ts.map +1 -0
- package/dist/services/liveapp-icon.js +28 -0
- package/dist/services/liveapp-icon.js.map +1 -0
- package/dist/services/liveapps.d.ts +12 -0
- package/dist/services/liveapps.d.ts.map +1 -0
- package/dist/services/liveapps.js +84 -0
- package/dist/services/liveapps.js.map +1 -0
- package/dist/services/logger.d.ts +34 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +74 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/messaging.d.ts +14 -0
- package/dist/services/messaging.d.ts.map +1 -0
- package/dist/services/messaging.js +41 -0
- package/dist/services/messaging.js.map +1 -0
- package/dist/services/miniapp-icon.d.ts +9 -0
- package/dist/services/miniapp-icon.d.ts.map +1 -0
- package/dist/services/miniapp-icon.js +25 -0
- package/dist/services/miniapp-icon.js.map +1 -0
- package/dist/services/miniapp-registry.d.ts +73 -0
- package/dist/services/miniapp-registry.d.ts.map +1 -0
- package/dist/services/miniapp-registry.js +144 -0
- package/dist/services/miniapp-registry.js.map +1 -0
- package/dist/services/onboarding-config.d.ts +37 -0
- package/dist/services/onboarding-config.d.ts.map +1 -0
- package/dist/services/onboarding-config.js +76 -0
- package/dist/services/onboarding-config.js.map +1 -0
- package/dist/services/preferences.d.ts +10 -0
- package/dist/services/preferences.d.ts.map +1 -0
- package/dist/services/preferences.js +48 -0
- package/dist/services/preferences.js.map +1 -0
- package/dist/services/proxy-dispatcher.d.ts +18 -0
- package/dist/services/proxy-dispatcher.d.ts.map +1 -0
- package/dist/services/proxy-dispatcher.js +33 -0
- package/dist/services/proxy-dispatcher.js.map +1 -0
- package/dist/services/storage.d.ts +7 -0
- package/dist/services/storage.d.ts.map +1 -0
- package/dist/services/storage.js +55 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/theme-css.d.ts +21 -0
- package/dist/services/theme-css.d.ts.map +1 -0
- package/dist/services/theme-css.js +213 -0
- package/dist/services/theme-css.js.map +1 -0
- package/dist/services/user-db.d.ts +69 -0
- package/dist/services/user-db.d.ts.map +1 -0
- package/dist/services/user-db.js +175 -0
- package/dist/services/user-db.js.map +1 -0
- package/dist/services/voice/audio-format.d.ts +5 -0
- package/dist/services/voice/audio-format.d.ts.map +1 -0
- package/dist/services/voice/audio-format.js +27 -0
- package/dist/services/voice/audio-format.js.map +1 -0
- package/dist/services/voice/azure-openai-whisper-adapter.d.ts +23 -0
- package/dist/services/voice/azure-openai-whisper-adapter.d.ts.map +1 -0
- package/dist/services/voice/azure-openai-whisper-adapter.js +60 -0
- package/dist/services/voice/azure-openai-whisper-adapter.js.map +1 -0
- package/dist/services/voice/openai-whisper-adapter.d.ts +22 -0
- package/dist/services/voice/openai-whisper-adapter.d.ts.map +1 -0
- package/dist/services/voice/openai-whisper-adapter.js +61 -0
- package/dist/services/voice/openai-whisper-adapter.js.map +1 -0
- package/dist/services/voice/stt-adapter.d.ts +31 -0
- package/dist/services/voice/stt-adapter.d.ts.map +1 -0
- package/dist/services/voice/stt-adapter.js +8 -0
- package/dist/services/voice/stt-adapter.js.map +1 -0
- package/dist/services/voice/vad-segmenter.d.ts +68 -0
- package/dist/services/voice/vad-segmenter.d.ts.map +1 -0
- package/dist/services/voice/vad-segmenter.js +159 -0
- package/dist/services/voice/vad-segmenter.js.map +1 -0
- package/dist/services/voice/voice-session.d.ts +54 -0
- package/dist/services/voice/voice-session.d.ts.map +1 -0
- package/dist/services/voice/voice-session.js +137 -0
- package/dist/services/voice/voice-session.js.map +1 -0
- package/dist/services/window-manager.d.ts +94 -0
- package/dist/services/window-manager.d.ts.map +1 -0
- package/dist/services/window-manager.js +282 -0
- package/dist/services/window-manager.js.map +1 -0
- package/dist/services/workspace.d.ts +51 -0
- package/dist/services/workspace.d.ts.map +1 -0
- package/dist/services/workspace.js +144 -0
- package/dist/services/workspace.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child-process entry point for an isolated MiniApp backend.
|
|
3
|
+
*
|
|
4
|
+
* Spawned by BackendProcessManager via `child_process.fork()`.
|
|
5
|
+
* Receives an "activate" message over IPC, imports the backend module,
|
|
6
|
+
* wires up a local MessagingHook that bridges commands/events through IPC,
|
|
7
|
+
* then signals "ready" back to the main process.
|
|
8
|
+
*/
|
|
9
|
+
import { dirname } from 'node:path';
|
|
10
|
+
import { createStorageHook } from './storage.js';
|
|
11
|
+
import { createFileSystemHook } from './filesystem.js';
|
|
12
|
+
import { createChildLogger } from './logger.js';
|
|
13
|
+
import { createPackageLocalizer } from './i18n.js';
|
|
14
|
+
// ─── Per-process state ──────────────────────────────────────────────────────
|
|
15
|
+
const commandHandlers = new Map();
|
|
16
|
+
let deactivateFn = null;
|
|
17
|
+
let subscriptions = [];
|
|
18
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
19
|
+
function sendToMain(msg) {
|
|
20
|
+
if (process.send) {
|
|
21
|
+
process.send(msg);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Creates a MessagingHook that lives entirely inside this child process.
|
|
26
|
+
* - onCommand: registers a handler in the local map.
|
|
27
|
+
* - emit: forwards the event to the main process via IPC.
|
|
28
|
+
*/
|
|
29
|
+
function createChildMessagingHook(miniAppId) {
|
|
30
|
+
return {
|
|
31
|
+
onCommand(command, handler) {
|
|
32
|
+
commandHandlers.set(command, handler);
|
|
33
|
+
return {
|
|
34
|
+
dispose() {
|
|
35
|
+
commandHandlers.delete(command);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
emit(event, data) {
|
|
40
|
+
sendToMain({ type: 'event', miniAppId, event, data });
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function resolveUserHomeDir(miniAppDataDir) {
|
|
45
|
+
return dirname(dirname(miniAppDataDir));
|
|
46
|
+
}
|
|
47
|
+
// ─── Message handlers ───────────────────────────────────────────────────────
|
|
48
|
+
async function handleActivate(msg) {
|
|
49
|
+
const mod = await import(msg.backendPath);
|
|
50
|
+
const context = {
|
|
51
|
+
paths: msg.paths,
|
|
52
|
+
launchArgs: Array.isArray(msg.launchArgs) ? msg.launchArgs : [],
|
|
53
|
+
storage: createStorageHook(msg.paths.storage),
|
|
54
|
+
fs: createFileSystemHook(resolveUserHomeDir(msg.paths.data)),
|
|
55
|
+
messaging: createChildMessagingHook(msg.miniAppId),
|
|
56
|
+
subscriptions: [],
|
|
57
|
+
logger: createChildLogger(msg.loggerConfig, msg.miniAppId),
|
|
58
|
+
i18n: createPackageLocalizer({
|
|
59
|
+
packageRoot: msg.packageRoot,
|
|
60
|
+
defaultScope: msg.miniAppId,
|
|
61
|
+
locale: msg.locale,
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
subscriptions = context.subscriptions;
|
|
65
|
+
deactivateFn = () => mod.deactivate();
|
|
66
|
+
mod.activate(context);
|
|
67
|
+
sendToMain({ type: 'ready', miniAppId: msg.miniAppId });
|
|
68
|
+
}
|
|
69
|
+
async function handleCommandInvoke(requestId, command, data) {
|
|
70
|
+
const handler = commandHandlers.get(command);
|
|
71
|
+
if (!handler) {
|
|
72
|
+
sendToMain({
|
|
73
|
+
type: 'command:response',
|
|
74
|
+
requestId,
|
|
75
|
+
error: `No handler registered for command: ${command}`,
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const result = await handler(data);
|
|
81
|
+
sendToMain({ type: 'command:response', requestId, data: result });
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
sendToMain({
|
|
85
|
+
type: 'command:response',
|
|
86
|
+
requestId,
|
|
87
|
+
error: err.message,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function handleDeactivate() {
|
|
92
|
+
for (const sub of subscriptions) {
|
|
93
|
+
sub.dispose();
|
|
94
|
+
}
|
|
95
|
+
deactivateFn?.();
|
|
96
|
+
process.exit(0);
|
|
97
|
+
}
|
|
98
|
+
// ─── IPC listener ───────────────────────────────────────────────────────────
|
|
99
|
+
process.on('message', async (msg) => {
|
|
100
|
+
try {
|
|
101
|
+
switch (msg.type) {
|
|
102
|
+
case 'activate':
|
|
103
|
+
await handleActivate(msg);
|
|
104
|
+
break;
|
|
105
|
+
case 'command:invoke':
|
|
106
|
+
await handleCommandInvoke(msg.requestId, msg.command, msg.data);
|
|
107
|
+
break;
|
|
108
|
+
case 'deactivate':
|
|
109
|
+
handleDeactivate();
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
sendToMain({ type: 'error', message: err.message });
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=backend-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-host.js","sourceRoot":"","sources":["../../src/services/backend-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { MiniAppPaths } from '@desktalk/sdk';
|
|
2
|
+
import type { LoggerConfig } from './logger.js';
|
|
3
|
+
export interface LaunchWindowArgs {
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
/** Tell the child process to import and activate a MiniApp backend. */
|
|
7
|
+
export interface ActivateMessage {
|
|
8
|
+
type: 'activate';
|
|
9
|
+
miniAppId: string;
|
|
10
|
+
/** Resolved file-URL or bare specifier the child can `import()`. */
|
|
11
|
+
backendPath: string;
|
|
12
|
+
/** Absolute path to the MiniApp package root (for i18n). */
|
|
13
|
+
packageRoot: string;
|
|
14
|
+
/** Pre-resolved MiniApp paths (data, storage, log, cache). */
|
|
15
|
+
paths: MiniAppPaths;
|
|
16
|
+
/** Launch args for the active or restored windows of this MiniApp. */
|
|
17
|
+
launchArgs: LaunchWindowArgs[];
|
|
18
|
+
/** Locale string (e.g. "en", "zh-CN"). */
|
|
19
|
+
locale: string;
|
|
20
|
+
/** Logger configuration so the child can recreate an equivalent pino instance. */
|
|
21
|
+
loggerConfig: LoggerConfig;
|
|
22
|
+
}
|
|
23
|
+
/** Forward a command:invoke from the renderer to the child. */
|
|
24
|
+
export interface CommandInvokeMessage {
|
|
25
|
+
type: 'command:invoke';
|
|
26
|
+
requestId: string;
|
|
27
|
+
command: string;
|
|
28
|
+
data: unknown;
|
|
29
|
+
}
|
|
30
|
+
/** Tell the child process to deactivate and exit. */
|
|
31
|
+
export interface DeactivateMessage {
|
|
32
|
+
type: 'deactivate';
|
|
33
|
+
}
|
|
34
|
+
export type MainToChildMessage = ActivateMessage | CommandInvokeMessage | DeactivateMessage;
|
|
35
|
+
/** The child has finished activation and is ready to accept commands. */
|
|
36
|
+
export interface ReadyMessage {
|
|
37
|
+
type: 'ready';
|
|
38
|
+
miniAppId: string;
|
|
39
|
+
}
|
|
40
|
+
/** Result (or error) for a previously forwarded command. */
|
|
41
|
+
export interface CommandResponseMessage {
|
|
42
|
+
type: 'command:response';
|
|
43
|
+
requestId: string;
|
|
44
|
+
data?: unknown;
|
|
45
|
+
error?: string;
|
|
46
|
+
}
|
|
47
|
+
/** The MiniApp backend emitted an event that should be broadcast to renderers. */
|
|
48
|
+
export interface EventBroadcastMessage {
|
|
49
|
+
type: 'event';
|
|
50
|
+
miniAppId: string;
|
|
51
|
+
event: string;
|
|
52
|
+
data: unknown;
|
|
53
|
+
}
|
|
54
|
+
/** Unrecoverable error in the child process. */
|
|
55
|
+
export interface ChildErrorMessage {
|
|
56
|
+
type: 'error';
|
|
57
|
+
message: string;
|
|
58
|
+
}
|
|
59
|
+
export type ChildToMainMessage = ReadyMessage | CommandResponseMessage | EventBroadcastMessage | ChildErrorMessage;
|
|
60
|
+
//# sourceMappingURL=backend-ipc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-ipc.d.ts","sourceRoot":"","sources":["../../src/services/backend-ipc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,KAAK,EAAE,YAAY,CAAC;IACpB,sEAAsE;IACtE,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,+DAA+D;AAC/D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,oBAAoB,GAAG,iBAAiB,CAAC;AAI5F,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kFAAkF;AAClF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,sBAAsB,GACtB,qBAAqB,GACrB,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-ipc.js","sourceRoot":"","sources":["../../src/services/backend-ipc.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages one child process per MiniApp backend.
|
|
3
|
+
*
|
|
4
|
+
* Each process is spawned via `child_process.fork()` and runs
|
|
5
|
+
* `backend-host.js`, which imports the actual MiniApp backend module,
|
|
6
|
+
* creates its context, and handles commands/events via Node IPC.
|
|
7
|
+
*
|
|
8
|
+
* The main process routes incoming WebSocket commands to the correct
|
|
9
|
+
* child and relays events from children back to connected clients.
|
|
10
|
+
*/
|
|
11
|
+
import type { MiniAppPaths } from '@desktalk/sdk';
|
|
12
|
+
import type pino from 'pino';
|
|
13
|
+
import type { LoggerConfig } from './logger.js';
|
|
14
|
+
/**
|
|
15
|
+
* Singleton manager that owns every backend child process.
|
|
16
|
+
*/
|
|
17
|
+
declare class BackendProcessManager {
|
|
18
|
+
private processes;
|
|
19
|
+
private pendingRequests;
|
|
20
|
+
/** Absolute path to the compiled backend-host entry file. */
|
|
21
|
+
private readonly hostPath;
|
|
22
|
+
private logger;
|
|
23
|
+
private loggerConfig;
|
|
24
|
+
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Inject the logger and its serializable config.
|
|
27
|
+
* Must be called once before any spawn().
|
|
28
|
+
*/
|
|
29
|
+
init(logger: pino.Logger, loggerConfig: LoggerConfig): void;
|
|
30
|
+
/**
|
|
31
|
+
* Spawn an isolated child process and wait until it reports "ready"
|
|
32
|
+
* (i.e. the backend's activate() has returned).
|
|
33
|
+
*
|
|
34
|
+
* @param processKey Unique key for this process instance (e.g. "note:admin").
|
|
35
|
+
* @param backendPath Import specifier for the MiniApp backend module.
|
|
36
|
+
* @param packageRoot Absolute path to the MiniApp package root.
|
|
37
|
+
* @param paths Pre-resolved MiniApp paths scoped to the current user.
|
|
38
|
+
* @param locale Locale string (e.g. "en", "zh-CN").
|
|
39
|
+
* @param miniAppId Original MiniApp ID (e.g. "note"). If omitted, uses processKey.
|
|
40
|
+
*/
|
|
41
|
+
spawn(processKey: string, backendPath: string, packageRoot: string, paths: MiniAppPaths, locale: string, miniAppId?: string, launchArgs?: Array<Record<string, unknown>>): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Send a command to the child process identified by `processKey` and
|
|
44
|
+
* return the result (or throw on error / timeout).
|
|
45
|
+
*/
|
|
46
|
+
sendCommand(processKey: string, command: string, data: unknown): Promise<unknown>;
|
|
47
|
+
/**
|
|
48
|
+
* Gracefully deactivate and stop the child process identified by `processKey`.
|
|
49
|
+
*/
|
|
50
|
+
kill(processKey: string): Promise<void>;
|
|
51
|
+
/** Check whether a child process is running for `processKey`. */
|
|
52
|
+
isRunning(processKey: string): boolean;
|
|
53
|
+
/** Gracefully shut down every child process. */
|
|
54
|
+
killAll(): Promise<void>;
|
|
55
|
+
private handleChildMessage;
|
|
56
|
+
}
|
|
57
|
+
/** Singleton process manager instance. */
|
|
58
|
+
export declare const processManager: BackendProcessManager;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=backend-process-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-process-manager.d.ts","sourceRoot":"","sources":["../../src/services/backend-process-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA2B7C;;GAEG;AACH,cAAM,qBAAqB;IACzB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,eAAe,CAAqC;IAC5D,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,YAAY,CAA6B;;IAMjD;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI;IAO3D;;;;;;;;;;OAUG;IACG,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,GAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GAC9C,OAAO,CAAC,IAAI,CAAC;IAyEhB;;;OAGG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCvF;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB7C,iEAAiE;IACjE,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAItC,gDAAgD;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,OAAO,CAAC,kBAAkB;CA0B3B;AAED,0CAA0C;AAC1C,eAAO,MAAM,cAAc,uBAA8B,CAAC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages one child process per MiniApp backend.
|
|
3
|
+
*
|
|
4
|
+
* Each process is spawned via `child_process.fork()` and runs
|
|
5
|
+
* `backend-host.js`, which imports the actual MiniApp backend module,
|
|
6
|
+
* creates its context, and handles commands/events via Node IPC.
|
|
7
|
+
*
|
|
8
|
+
* The main process routes incoming WebSocket commands to the correct
|
|
9
|
+
* child and relays events from children back to connected clients.
|
|
10
|
+
*/
|
|
11
|
+
import { fork } from 'node:child_process';
|
|
12
|
+
import { join, dirname } from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
import { randomUUID } from 'node:crypto';
|
|
15
|
+
import { broadcastEvent } from './messaging.js';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
const COMMAND_TIMEOUT_MS = 30_000;
|
|
19
|
+
const DEACTIVATE_TIMEOUT_MS = 5_000;
|
|
20
|
+
/**
|
|
21
|
+
* Singleton manager that owns every backend child process.
|
|
22
|
+
*/
|
|
23
|
+
class BackendProcessManager {
|
|
24
|
+
processes = new Map();
|
|
25
|
+
pendingRequests = new Map();
|
|
26
|
+
/** Absolute path to the compiled backend-host entry file. */
|
|
27
|
+
hostPath;
|
|
28
|
+
logger = null;
|
|
29
|
+
loggerConfig = null;
|
|
30
|
+
constructor() {
|
|
31
|
+
this.hostPath = join(__dirname, 'backend-host.js');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Inject the logger and its serializable config.
|
|
35
|
+
* Must be called once before any spawn().
|
|
36
|
+
*/
|
|
37
|
+
init(logger, loggerConfig) {
|
|
38
|
+
this.logger = logger;
|
|
39
|
+
this.loggerConfig = loggerConfig;
|
|
40
|
+
}
|
|
41
|
+
// ─── Lifecycle ──────────────────────────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Spawn an isolated child process and wait until it reports "ready"
|
|
44
|
+
* (i.e. the backend's activate() has returned).
|
|
45
|
+
*
|
|
46
|
+
* @param processKey Unique key for this process instance (e.g. "note:admin").
|
|
47
|
+
* @param backendPath Import specifier for the MiniApp backend module.
|
|
48
|
+
* @param packageRoot Absolute path to the MiniApp package root.
|
|
49
|
+
* @param paths Pre-resolved MiniApp paths scoped to the current user.
|
|
50
|
+
* @param locale Locale string (e.g. "en", "zh-CN").
|
|
51
|
+
* @param miniAppId Original MiniApp ID (e.g. "note"). If omitted, uses processKey.
|
|
52
|
+
*/
|
|
53
|
+
async spawn(processKey, backendPath, packageRoot, paths, locale, miniAppId, launchArgs = []) {
|
|
54
|
+
if (this.processes.has(processKey)) {
|
|
55
|
+
return; // already running
|
|
56
|
+
}
|
|
57
|
+
const actualMiniAppId = miniAppId ?? processKey;
|
|
58
|
+
const child = fork(this.hostPath, [], {
|
|
59
|
+
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
|
|
60
|
+
});
|
|
61
|
+
let resolveReady;
|
|
62
|
+
let rejectReady;
|
|
63
|
+
const readyPromise = new Promise((resolve, reject) => {
|
|
64
|
+
resolveReady = resolve;
|
|
65
|
+
rejectReady = reject;
|
|
66
|
+
});
|
|
67
|
+
const managed = {
|
|
68
|
+
child,
|
|
69
|
+
processKey,
|
|
70
|
+
miniAppId: actualMiniAppId,
|
|
71
|
+
ready: false,
|
|
72
|
+
readyPromise,
|
|
73
|
+
};
|
|
74
|
+
this.processes.set(processKey, managed);
|
|
75
|
+
// Relay messages from child
|
|
76
|
+
child.on('message', (msg) => {
|
|
77
|
+
this.handleChildMessage(processKey, msg);
|
|
78
|
+
if (msg.type === 'ready') {
|
|
79
|
+
managed.ready = true;
|
|
80
|
+
resolveReady();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
child.on('exit', (code, signal) => {
|
|
84
|
+
this.logger?.info({ processKey, code, signal }, 'child process exited');
|
|
85
|
+
this.processes.delete(processKey);
|
|
86
|
+
});
|
|
87
|
+
child.on('error', (err) => {
|
|
88
|
+
this.logger?.error({ processKey, err: err.message }, 'child process error');
|
|
89
|
+
rejectReady(err);
|
|
90
|
+
});
|
|
91
|
+
// Forward child stdout / stderr so operator can see backend logs
|
|
92
|
+
child.stdout?.on('data', (data) => {
|
|
93
|
+
process.stdout.write(`[${processKey}] ${data.toString()}`);
|
|
94
|
+
});
|
|
95
|
+
child.stderr?.on('data', (data) => {
|
|
96
|
+
process.stderr.write(`[${processKey}] ${data.toString()}`);
|
|
97
|
+
});
|
|
98
|
+
// Ask the child to activate — use the original miniAppId, not the process key
|
|
99
|
+
const activateMsg = {
|
|
100
|
+
type: 'activate',
|
|
101
|
+
miniAppId: actualMiniAppId,
|
|
102
|
+
backendPath,
|
|
103
|
+
packageRoot,
|
|
104
|
+
paths,
|
|
105
|
+
launchArgs,
|
|
106
|
+
locale,
|
|
107
|
+
loggerConfig: this.loggerConfig,
|
|
108
|
+
};
|
|
109
|
+
child.send(activateMsg);
|
|
110
|
+
await readyPromise;
|
|
111
|
+
}
|
|
112
|
+
// ─── Command routing ────────────────────────────────────────────────────
|
|
113
|
+
/**
|
|
114
|
+
* Send a command to the child process identified by `processKey` and
|
|
115
|
+
* return the result (or throw on error / timeout).
|
|
116
|
+
*/
|
|
117
|
+
async sendCommand(processKey, command, data) {
|
|
118
|
+
const managed = this.processes.get(processKey);
|
|
119
|
+
if (!managed) {
|
|
120
|
+
throw new Error(`No running process for key: ${processKey}`);
|
|
121
|
+
}
|
|
122
|
+
if (!managed.ready) {
|
|
123
|
+
await managed.readyPromise;
|
|
124
|
+
}
|
|
125
|
+
const requestId = `cmd-${randomUUID()}`;
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
const timeout = setTimeout(() => {
|
|
128
|
+
this.pendingRequests.delete(requestId);
|
|
129
|
+
reject(new Error(`Command timed out: ${command} (process: ${processKey})`));
|
|
130
|
+
}, COMMAND_TIMEOUT_MS);
|
|
131
|
+
this.pendingRequests.set(requestId, { resolve, reject, timeout });
|
|
132
|
+
const msg = {
|
|
133
|
+
type: 'command:invoke',
|
|
134
|
+
requestId,
|
|
135
|
+
command,
|
|
136
|
+
data,
|
|
137
|
+
};
|
|
138
|
+
managed.child.send(msg);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
// ─── Teardown ───────────────────────────────────────────────────────────
|
|
142
|
+
/**
|
|
143
|
+
* Gracefully deactivate and stop the child process identified by `processKey`.
|
|
144
|
+
*/
|
|
145
|
+
async kill(processKey) {
|
|
146
|
+
const managed = this.processes.get(processKey);
|
|
147
|
+
if (!managed) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
managed.child.send({ type: 'deactivate' });
|
|
151
|
+
await new Promise((resolve) => {
|
|
152
|
+
const timeout = setTimeout(() => {
|
|
153
|
+
managed.child.kill();
|
|
154
|
+
resolve();
|
|
155
|
+
}, DEACTIVATE_TIMEOUT_MS);
|
|
156
|
+
managed.child.on('exit', () => {
|
|
157
|
+
clearTimeout(timeout);
|
|
158
|
+
resolve();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
this.processes.delete(processKey);
|
|
162
|
+
}
|
|
163
|
+
/** Check whether a child process is running for `processKey`. */
|
|
164
|
+
isRunning(processKey) {
|
|
165
|
+
return this.processes.has(processKey);
|
|
166
|
+
}
|
|
167
|
+
/** Gracefully shut down every child process. */
|
|
168
|
+
async killAll() {
|
|
169
|
+
const ids = Array.from(this.processes.keys());
|
|
170
|
+
await Promise.all(ids.map((id) => this.kill(id)));
|
|
171
|
+
}
|
|
172
|
+
// ─── Internal ───────────────────────────────────────────────────────────
|
|
173
|
+
handleChildMessage(processKey, msg) {
|
|
174
|
+
switch (msg.type) {
|
|
175
|
+
case 'command:response': {
|
|
176
|
+
const pending = this.pendingRequests.get(msg.requestId);
|
|
177
|
+
if (pending) {
|
|
178
|
+
clearTimeout(pending.timeout);
|
|
179
|
+
this.pendingRequests.delete(msg.requestId);
|
|
180
|
+
if (msg.error) {
|
|
181
|
+
pending.reject(new Error(msg.error));
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
pending.resolve(msg.data);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
case 'event':
|
|
190
|
+
broadcastEvent(msg.miniAppId, msg.event, msg.data);
|
|
191
|
+
break;
|
|
192
|
+
case 'error':
|
|
193
|
+
this.logger?.error({ processKey, err: msg.message }, 'child process reported error');
|
|
194
|
+
break;
|
|
195
|
+
case 'ready':
|
|
196
|
+
// Handled inline in spawn()
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/** Singleton process manager instance. */
|
|
202
|
+
export const processManager = new BackendProcessManager();
|
|
203
|
+
//# sourceMappingURL=backend-process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-process-manager.js","sourceRoot":"","sources":["../../src/services/backend-process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FileSystemHook } from '@desktalk/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a scoped filesystem hook for a MiniApp.
|
|
4
|
+
* All paths are resolved relative to the authenticated user's home directory.
|
|
5
|
+
* Path traversal outside the root is prevented.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createFileSystemHook(rootDir: string): FileSystemHook;
|
|
8
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/services/filesystem.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAuB,MAAM,eAAe,CAAC;AAEzE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAgGpE"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, unlinkSync, renameSync, rmSync, readdirSync, mkdirSync, statSync, existsSync, } from 'node:fs';
|
|
2
|
+
import { join, resolve, relative } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a scoped filesystem hook for a MiniApp.
|
|
5
|
+
* All paths are resolved relative to the authenticated user's home directory.
|
|
6
|
+
* Path traversal outside the root is prevented.
|
|
7
|
+
*/
|
|
8
|
+
export function createFileSystemHook(rootDir) {
|
|
9
|
+
/**
|
|
10
|
+
* Resolve a relative path to an absolute path within the root.
|
|
11
|
+
* Throws if the resolved path escapes the root directory.
|
|
12
|
+
*/
|
|
13
|
+
function safePath(relPath) {
|
|
14
|
+
const resolved = resolve(rootDir, relPath);
|
|
15
|
+
const rel = relative(rootDir, resolved);
|
|
16
|
+
if (rel.startsWith('..') || resolve(rootDir, rel) !== resolved) {
|
|
17
|
+
throw new Error(`Path traversal not allowed: ${relPath}`);
|
|
18
|
+
}
|
|
19
|
+
return resolved;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
async readFile(path) {
|
|
23
|
+
const abs = safePath(path);
|
|
24
|
+
return readFileSync(abs, 'utf-8');
|
|
25
|
+
},
|
|
26
|
+
async readFileBase64(path) {
|
|
27
|
+
const abs = safePath(path);
|
|
28
|
+
return readFileSync(abs).toString('base64');
|
|
29
|
+
},
|
|
30
|
+
async writeFile(path, content) {
|
|
31
|
+
const abs = safePath(path);
|
|
32
|
+
// Ensure parent directory exists
|
|
33
|
+
const parent = resolve(abs, '..');
|
|
34
|
+
if (!existsSync(parent)) {
|
|
35
|
+
mkdirSync(parent, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
writeFileSync(abs, content, 'utf-8');
|
|
38
|
+
},
|
|
39
|
+
async writeFileBase64(path, contentBase64) {
|
|
40
|
+
const abs = safePath(path);
|
|
41
|
+
const parent = resolve(abs, '..');
|
|
42
|
+
if (!existsSync(parent)) {
|
|
43
|
+
mkdirSync(parent, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
writeFileSync(abs, Buffer.from(contentBase64, 'base64'));
|
|
46
|
+
},
|
|
47
|
+
async deleteFile(path) {
|
|
48
|
+
const abs = safePath(path);
|
|
49
|
+
const stat = statSync(abs);
|
|
50
|
+
if (stat.isDirectory()) {
|
|
51
|
+
rmSync(abs, { recursive: true, force: true });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
unlinkSync(abs);
|
|
55
|
+
},
|
|
56
|
+
async rename(oldPath, newPath) {
|
|
57
|
+
const oldAbs = safePath(oldPath);
|
|
58
|
+
const newAbs = safePath(newPath);
|
|
59
|
+
const parent = resolve(newAbs, '..');
|
|
60
|
+
if (!existsSync(parent)) {
|
|
61
|
+
mkdirSync(parent, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
renameSync(oldAbs, newAbs);
|
|
64
|
+
},
|
|
65
|
+
async readDir(path) {
|
|
66
|
+
const abs = safePath(path);
|
|
67
|
+
const entries = readdirSync(abs, { withFileTypes: true });
|
|
68
|
+
return entries.map((entry) => ({
|
|
69
|
+
name: entry.name,
|
|
70
|
+
path: join(path, entry.name),
|
|
71
|
+
type: entry.isDirectory() ? 'directory' : 'file',
|
|
72
|
+
}));
|
|
73
|
+
},
|
|
74
|
+
async mkdir(path) {
|
|
75
|
+
const abs = safePath(path);
|
|
76
|
+
mkdirSync(abs, { recursive: true });
|
|
77
|
+
},
|
|
78
|
+
async stat(path) {
|
|
79
|
+
const abs = safePath(path);
|
|
80
|
+
const s = statSync(abs);
|
|
81
|
+
return {
|
|
82
|
+
size: s.size,
|
|
83
|
+
type: s.isDirectory() ? 'directory' : 'file',
|
|
84
|
+
createdAt: s.birthtime.toISOString(),
|
|
85
|
+
modifiedAt: s.mtime.toISOString(),
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
async exists(path) {
|
|
89
|
+
const abs = safePath(path);
|
|
90
|
+
return existsSync(abs);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/services/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type LocaleMessages = Record<string, Record<string, string>>;
|
|
2
|
+
export interface Localizer {
|
|
3
|
+
t(key: string, defaultText: string, params?: Record<string, string | number | boolean | null | undefined>): string;
|
|
4
|
+
locale(): string;
|
|
5
|
+
}
|
|
6
|
+
export interface PackageI18nManifest {
|
|
7
|
+
packageName: string;
|
|
8
|
+
packageScope: string;
|
|
9
|
+
locales: string[];
|
|
10
|
+
messages: Array<{
|
|
11
|
+
key: string;
|
|
12
|
+
defaultText: string;
|
|
13
|
+
placeholders: string[];
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export interface PackageI18nSource {
|
|
17
|
+
packageRoot: string;
|
|
18
|
+
packageScope: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function readPackageI18nManifest(packageRoot: string): PackageI18nManifest | null;
|
|
21
|
+
export declare function loadPackageLocaleMessages(packageRoot: string, packageScope: string, locale: string): LocaleMessages;
|
|
22
|
+
export declare function loadMergedLocaleMessages(packages: PackageI18nSource[], locale: string): LocaleMessages;
|
|
23
|
+
export declare function createPackageLocalizer(options: {
|
|
24
|
+
packageRoot: string;
|
|
25
|
+
defaultScope: string;
|
|
26
|
+
locale: string;
|
|
27
|
+
}): Localizer;
|
|
28
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/services/i18n.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACpE,MAAM,WAAW,SAAS;IACxB,CAAC,CACC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GACpE,MAAM,CAAC;IACV,MAAM,IAAI,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAwBD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAOvF;AA0BD,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GACb,cAAc,CAQhB;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,MAAM,EAAE,MAAM,GACb,cAAc,CAchB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,SAAS,CAgBZ"}
|