@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,282 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
function emptyPersistedState() {
|
|
4
|
+
return {
|
|
5
|
+
version: 2,
|
|
6
|
+
windows: [],
|
|
7
|
+
tree: null,
|
|
8
|
+
focusedWindowId: null,
|
|
9
|
+
fullscreenWindowId: null,
|
|
10
|
+
windowIdCounter: 0,
|
|
11
|
+
nextSplitDirection: 'auto',
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function toPersistedWindow(window) {
|
|
15
|
+
return {
|
|
16
|
+
id: window.id,
|
|
17
|
+
miniAppId: window.miniAppId,
|
|
18
|
+
title: window.title,
|
|
19
|
+
args: window.args,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function isPersistedWindow(value) {
|
|
23
|
+
if (!value || typeof value !== 'object') {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const candidate = value;
|
|
27
|
+
return (typeof candidate.id === 'string' &&
|
|
28
|
+
typeof candidate.miniAppId === 'string' &&
|
|
29
|
+
typeof candidate.title === 'string');
|
|
30
|
+
}
|
|
31
|
+
function migratePersistedState(parsed) {
|
|
32
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const candidate = parsed;
|
|
36
|
+
const windows = Array.isArray(candidate.windows) ? candidate.windows : [];
|
|
37
|
+
const focusedWindowId = typeof candidate.focusedWindowId === 'string' ? candidate.focusedWindowId : null;
|
|
38
|
+
const fullscreenWindowId = typeof candidate.fullscreenWindowId === 'string' ? candidate.fullscreenWindowId : null;
|
|
39
|
+
const windowIdCounter = typeof candidate.windowIdCounter === 'number' ? candidate.windowIdCounter : windows.length;
|
|
40
|
+
const nextSplitDirection = candidate.nextSplitDirection === 'horizontal' ||
|
|
41
|
+
candidate.nextSplitDirection === 'vertical' ||
|
|
42
|
+
candidate.nextSplitDirection === 'auto'
|
|
43
|
+
? candidate.nextSplitDirection
|
|
44
|
+
: 'auto';
|
|
45
|
+
if (candidate.version === 2) {
|
|
46
|
+
return {
|
|
47
|
+
version: 2,
|
|
48
|
+
windows: windows.filter(isPersistedWindow),
|
|
49
|
+
tree: candidate.tree ?? null,
|
|
50
|
+
focusedWindowId,
|
|
51
|
+
fullscreenWindowId,
|
|
52
|
+
windowIdCounter,
|
|
53
|
+
nextSplitDirection,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const legacy = candidate;
|
|
57
|
+
return {
|
|
58
|
+
version: 2,
|
|
59
|
+
windows: windows
|
|
60
|
+
.filter(isPersistedWindow)
|
|
61
|
+
.map((window) => toPersistedWindow(window)),
|
|
62
|
+
tree: legacy.tree ?? null,
|
|
63
|
+
focusedWindowId,
|
|
64
|
+
fullscreenWindowId,
|
|
65
|
+
windowIdCounter,
|
|
66
|
+
nextSplitDirection,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function readPersistedState(filePath) {
|
|
70
|
+
if (!existsSync(filePath)) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
return migratePersistedState(JSON.parse(readFileSync(filePath, 'utf-8')));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function writePersistedState(filePath, state) {
|
|
81
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
82
|
+
writeFileSync(filePath, JSON.stringify(state, null, 2), 'utf-8');
|
|
83
|
+
}
|
|
84
|
+
/** Collect all window IDs from a tiling tree in traversal order. */
|
|
85
|
+
function getLeafIds(node) {
|
|
86
|
+
if (node.type === 'leaf')
|
|
87
|
+
return [node.windowId];
|
|
88
|
+
return [...getLeafIds(node.children[0]), ...getLeafIds(node.children[1])];
|
|
89
|
+
}
|
|
90
|
+
/** Build a human-readable description of the tiling layout for AI context. */
|
|
91
|
+
function describeLayout(node, titles, focusedId, indent = 0) {
|
|
92
|
+
const pad = ' '.repeat(indent);
|
|
93
|
+
if (node.type === 'leaf') {
|
|
94
|
+
const title = titles[node.windowId] ?? node.windowId;
|
|
95
|
+
const focus = node.windowId === focusedId ? ' (focused)' : '';
|
|
96
|
+
return `${pad}${title}${focus}`;
|
|
97
|
+
}
|
|
98
|
+
const pctFirst = Math.round(node.ratio * 100);
|
|
99
|
+
const pctSecond = 100 - pctFirst;
|
|
100
|
+
const header = `${pad}${node.split} split (${pctFirst}/${pctSecond})`;
|
|
101
|
+
const first = describeLayout(node.children[0], titles, focusedId, indent + 1);
|
|
102
|
+
const second = describeLayout(node.children[1], titles, focusedId, indent + 1);
|
|
103
|
+
return `${header}\n${first}\n${second}`;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Backend window manager service — persistence-only.
|
|
107
|
+
*
|
|
108
|
+
* The frontend Zustand store is the live source of truth.
|
|
109
|
+
* This service:
|
|
110
|
+
* - Loads persisted state on startup for the initial `window:state` message
|
|
111
|
+
* - Receives synced state from the frontend and persists it
|
|
112
|
+
* - Keeps window actions metadata for the AI system prompt
|
|
113
|
+
* - Provides `getSystemPromptContext()` for dynamic AI prompt injection
|
|
114
|
+
*/
|
|
115
|
+
export class WindowManagerService {
|
|
116
|
+
state = emptyPersistedState();
|
|
117
|
+
windowActions = {};
|
|
118
|
+
filePath;
|
|
119
|
+
constructor(filePath) {
|
|
120
|
+
this.filePath = filePath;
|
|
121
|
+
this.load();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Switch the backing file path (e.g. when a different user connects)
|
|
125
|
+
* and reload persisted state from the new location.
|
|
126
|
+
*/
|
|
127
|
+
switchUser(newFilePath) {
|
|
128
|
+
this.filePath = newFilePath;
|
|
129
|
+
this.state = emptyPersistedState();
|
|
130
|
+
this.load();
|
|
131
|
+
}
|
|
132
|
+
load() {
|
|
133
|
+
const persisted = readPersistedState(this.filePath);
|
|
134
|
+
if (!persisted) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this.state = {
|
|
138
|
+
version: 2,
|
|
139
|
+
windows: Array.isArray(persisted.windows) ? persisted.windows : [],
|
|
140
|
+
tree: persisted.tree ?? null,
|
|
141
|
+
focusedWindowId: typeof persisted.focusedWindowId === 'string' ? persisted.focusedWindowId : null,
|
|
142
|
+
fullscreenWindowId: typeof persisted.fullscreenWindowId === 'string' ? persisted.fullscreenWindowId : null,
|
|
143
|
+
windowIdCounter: typeof persisted.windowIdCounter === 'number'
|
|
144
|
+
? persisted.windowIdCounter
|
|
145
|
+
: (persisted.windows?.length ?? 0),
|
|
146
|
+
nextSplitDirection: persisted.nextSplitDirection === 'horizontal' ||
|
|
147
|
+
persisted.nextSplitDirection === 'vertical' ||
|
|
148
|
+
persisted.nextSplitDirection === 'auto'
|
|
149
|
+
? persisted.nextSplitDirection
|
|
150
|
+
: 'auto',
|
|
151
|
+
};
|
|
152
|
+
writePersistedState(this.filePath, this.state);
|
|
153
|
+
// Ensure at least one window is focused on load
|
|
154
|
+
if (this.state.windows.length > 0 && !this.state.focusedWindowId) {
|
|
155
|
+
if (this.state.tree) {
|
|
156
|
+
const leafIds = getLeafIds(this.state.tree);
|
|
157
|
+
if (leafIds.length > 0) {
|
|
158
|
+
this.state.focusedWindowId = leafIds[0];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get the persisted state to send to the frontend on initial connect.
|
|
165
|
+
*/
|
|
166
|
+
getPersistedState() {
|
|
167
|
+
return this.state;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Receive the full state from the frontend and persist it.
|
|
171
|
+
* Called when the frontend sends `window:sync`.
|
|
172
|
+
*/
|
|
173
|
+
syncState(payload) {
|
|
174
|
+
this.state = {
|
|
175
|
+
version: 2,
|
|
176
|
+
windows: Array.isArray(payload.windows) ? payload.windows : [],
|
|
177
|
+
tree: payload.tree ?? null,
|
|
178
|
+
focusedWindowId: typeof payload.focusedWindowId === 'string' ? payload.focusedWindowId : null,
|
|
179
|
+
fullscreenWindowId: typeof payload.fullscreenWindowId === 'string' ? payload.fullscreenWindowId : null,
|
|
180
|
+
windowIdCounter: typeof payload.windowIdCounter === 'number' ? payload.windowIdCounter : 0,
|
|
181
|
+
nextSplitDirection: payload.nextSplitDirection === 'horizontal' ||
|
|
182
|
+
payload.nextSplitDirection === 'vertical' ||
|
|
183
|
+
payload.nextSplitDirection === 'auto'
|
|
184
|
+
? payload.nextSplitDirection
|
|
185
|
+
: 'auto',
|
|
186
|
+
};
|
|
187
|
+
writePersistedState(this.filePath, this.state);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get the current windows (from last synced state).
|
|
191
|
+
*/
|
|
192
|
+
getWindows() {
|
|
193
|
+
return this.state.windows;
|
|
194
|
+
}
|
|
195
|
+
getFocusedWindow() {
|
|
196
|
+
return this.state.windows.find((w) => w.id === this.state.focusedWindowId);
|
|
197
|
+
}
|
|
198
|
+
getWindowActions(windowId) {
|
|
199
|
+
return this.windowActions[windowId] ?? [];
|
|
200
|
+
}
|
|
201
|
+
setWindowActions(windowId, actions) {
|
|
202
|
+
this.windowActions[windowId] = actions;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Activate persisted MiniApps on startup.
|
|
206
|
+
*/
|
|
207
|
+
async activatePersistedMiniApps(activate) {
|
|
208
|
+
const windowsByMiniApp = new Map();
|
|
209
|
+
for (const window of this.state.windows) {
|
|
210
|
+
const launchArgs = windowsByMiniApp.get(window.miniAppId) ?? [];
|
|
211
|
+
launchArgs.push(window.args ?? {});
|
|
212
|
+
windowsByMiniApp.set(window.miniAppId, launchArgs);
|
|
213
|
+
}
|
|
214
|
+
for (const [miniAppId, launchArgs] of windowsByMiniApp) {
|
|
215
|
+
await activate(miniAppId, launchArgs);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Build a dynamic desktop context block to prepend to user messages.
|
|
220
|
+
*
|
|
221
|
+
* This is injected per-prompt so the AI always sees the latest state
|
|
222
|
+
* without polluting the cacheable system prompt.
|
|
223
|
+
*/
|
|
224
|
+
getDesktopContext(availableMiniApps, availableLiveApps, userHomeDir) {
|
|
225
|
+
const focusedWindow = this.getFocusedWindow();
|
|
226
|
+
// ─── Layout ───────────────────────────────────────────────────────────
|
|
227
|
+
const layoutLines = [];
|
|
228
|
+
if (this.state.tree) {
|
|
229
|
+
const titles = {};
|
|
230
|
+
for (const w of this.state.windows) {
|
|
231
|
+
titles[w.id] = `${w.title} (${w.id}, miniapp: ${w.miniAppId})`;
|
|
232
|
+
}
|
|
233
|
+
layoutLines.push('Layout:', describeLayout(this.state.tree, titles, this.state.focusedWindowId, 1));
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
layoutLines.push('Layout: (empty)');
|
|
237
|
+
}
|
|
238
|
+
// ─── MiniApps ─────────────────────────────────────────────────────────
|
|
239
|
+
const miniAppLines = availableMiniApps.length
|
|
240
|
+
? availableMiniApps.map((m) => ` ${m.id}: ${m.name}`)
|
|
241
|
+
: [' (none)'];
|
|
242
|
+
const liveAppLines = availableLiveApps.length
|
|
243
|
+
? availableLiveApps.map((app) => ` ${app.id}: ${app.name}`)
|
|
244
|
+
: [' (none)'];
|
|
245
|
+
// ─── Actions on focused window ────────────────────────────────────────
|
|
246
|
+
const actionLines = [];
|
|
247
|
+
if (focusedWindow) {
|
|
248
|
+
const actions = this.windowActions[focusedWindow.id] ?? [];
|
|
249
|
+
for (const action of actions) {
|
|
250
|
+
const paramEntries = action.params ? Object.entries(action.params) : [];
|
|
251
|
+
if (paramEntries.length === 0) {
|
|
252
|
+
actionLines.push(` ${action.name}: ${action.description} (no params)`);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const paramDescs = paramEntries
|
|
256
|
+
.map(([key, p]) => {
|
|
257
|
+
const req = p.required ? 'required' : 'optional';
|
|
258
|
+
const desc = p.description ? ` — ${p.description}` : '';
|
|
259
|
+
return `${key}: ${p.type} (${req}${desc})`;
|
|
260
|
+
})
|
|
261
|
+
.join(', ');
|
|
262
|
+
actionLines.push(` ${action.name}: ${action.description} | params: {${paramDescs}}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return [
|
|
267
|
+
'[Desktop Context]',
|
|
268
|
+
`Home: ${userHomeDir}`,
|
|
269
|
+
`Focused: ${focusedWindow ? `"${focusedWindow.title}" (${focusedWindow.id}, miniapp: ${focusedWindow.miniAppId})` : 'none'}`,
|
|
270
|
+
...layoutLines,
|
|
271
|
+
'MiniApps:',
|
|
272
|
+
...miniAppLines,
|
|
273
|
+
'LiveApps:',
|
|
274
|
+
...liveAppLines,
|
|
275
|
+
...(actionLines.length > 0
|
|
276
|
+
? [`Actions (${focusedWindow.id}):`, ...actionLines]
|
|
277
|
+
: ['Actions: (none — no focused window or no actions registered)']),
|
|
278
|
+
'[/Desktop Context]',
|
|
279
|
+
].join('\n');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=window-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window-manager.js","sourceRoot":"","sources":["../../src/services/window-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { MiniAppPaths } from '@desktalk/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Platform-resolved workspace paths for DeskTalk.
|
|
4
|
+
* Uses env-paths to follow XDG on Linux, Application Support on macOS, %APPDATA% on Windows.
|
|
5
|
+
*/
|
|
6
|
+
export interface WorkspacePaths {
|
|
7
|
+
config: string;
|
|
8
|
+
data: string;
|
|
9
|
+
log: string;
|
|
10
|
+
cache: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Initialize workspace directories. Creates them if they don't exist.
|
|
14
|
+
* Called once at startup.
|
|
15
|
+
*/
|
|
16
|
+
export declare function initWorkspace(): WorkspacePaths;
|
|
17
|
+
/**
|
|
18
|
+
* Get the current workspace paths. Throws if not initialized.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getWorkspacePaths(): WorkspacePaths;
|
|
21
|
+
/**
|
|
22
|
+
* Get the home directory for a user.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getUserHomeDir(username: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Ensure a user's home directory and its dot-prefixed subdirectories exist.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ensureUserHome(username: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve platform paths for a specific MiniApp, scoped to a user's home directory.
|
|
31
|
+
*
|
|
32
|
+
* Before (single user):
|
|
33
|
+
* ctx.paths.data = '<data>/data/note/'
|
|
34
|
+
*
|
|
35
|
+
* After (multi-user):
|
|
36
|
+
* ctx.paths.data = '<data>/home/alice/.data/note/'
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveMiniAppPaths(miniAppId: string, username: string): MiniAppPaths;
|
|
39
|
+
/**
|
|
40
|
+
* Migrate existing single-user data to the admin user's home directory.
|
|
41
|
+
*
|
|
42
|
+
* Detects legacy layout (`<data>/data/`, `<data>/storage/`) and moves
|
|
43
|
+
* everything into `<data>/home/admin/.data/` and `<data>/home/admin/.storage/`.
|
|
44
|
+
* This is a one-time, non-destructive migration for installations that
|
|
45
|
+
* previously used the hardcoded 'admin' account.
|
|
46
|
+
*
|
|
47
|
+
* New installations (that go through the onboarding flow) will never have
|
|
48
|
+
* these legacy directories, so this function is a no-op for them.
|
|
49
|
+
*/
|
|
50
|
+
export declare function migrateToMultiUser(): void;
|
|
51
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/services/workspace.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAID;;;GAGG;AACH,wBAAgB,aAAa,IAAI,cAAc,CAqB9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAiBrF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAqDzC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import envPaths from 'env-paths';
|
|
2
|
+
import { mkdirSync, existsSync, renameSync, readdirSync, rmSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
let workspacePaths = null;
|
|
5
|
+
/**
|
|
6
|
+
* Initialize workspace directories. Creates them if they don't exist.
|
|
7
|
+
* Called once at startup.
|
|
8
|
+
*/
|
|
9
|
+
export function initWorkspace() {
|
|
10
|
+
const paths = envPaths('desktalk', { suffix: '' });
|
|
11
|
+
workspacePaths = {
|
|
12
|
+
config: paths.config,
|
|
13
|
+
data: paths.data,
|
|
14
|
+
log: paths.log,
|
|
15
|
+
cache: paths.cache,
|
|
16
|
+
};
|
|
17
|
+
// Create top-level directories
|
|
18
|
+
ensureDir(workspacePaths.config);
|
|
19
|
+
ensureDir(workspacePaths.data);
|
|
20
|
+
ensureDir(workspacePaths.log);
|
|
21
|
+
ensureDir(workspacePaths.cache);
|
|
22
|
+
// Create data subdirectories
|
|
23
|
+
ensureDir(join(workspacePaths.data, 'home'));
|
|
24
|
+
ensureDir(join(workspacePaths.data, 'miniapps'));
|
|
25
|
+
return workspacePaths;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the current workspace paths. Throws if not initialized.
|
|
29
|
+
*/
|
|
30
|
+
export function getWorkspacePaths() {
|
|
31
|
+
if (!workspacePaths) {
|
|
32
|
+
throw new Error('Workspace not initialized. Call initWorkspace() first.');
|
|
33
|
+
}
|
|
34
|
+
return workspacePaths;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the home directory for a user.
|
|
38
|
+
*/
|
|
39
|
+
export function getUserHomeDir(username) {
|
|
40
|
+
const ws = getWorkspacePaths();
|
|
41
|
+
return join(ws.data, 'home', username);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Ensure a user's home directory and its dot-prefixed subdirectories exist.
|
|
45
|
+
*/
|
|
46
|
+
export function ensureUserHome(username) {
|
|
47
|
+
const home = getUserHomeDir(username);
|
|
48
|
+
ensureDir(home);
|
|
49
|
+
ensureDir(join(home, '.data'));
|
|
50
|
+
ensureDir(join(home, '.storage'));
|
|
51
|
+
ensureDir(join(home, '.cache'));
|
|
52
|
+
ensureDir(join(home, '.ai-sessions'));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve platform paths for a specific MiniApp, scoped to a user's home directory.
|
|
56
|
+
*
|
|
57
|
+
* Before (single user):
|
|
58
|
+
* ctx.paths.data = '<data>/data/note/'
|
|
59
|
+
*
|
|
60
|
+
* After (multi-user):
|
|
61
|
+
* ctx.paths.data = '<data>/home/alice/.data/note/'
|
|
62
|
+
*/
|
|
63
|
+
export function resolveMiniAppPaths(miniAppId, username) {
|
|
64
|
+
const ws = getWorkspacePaths();
|
|
65
|
+
const home = join(ws.data, 'home', username);
|
|
66
|
+
const paths = {
|
|
67
|
+
home,
|
|
68
|
+
data: join(home, '.data', miniAppId),
|
|
69
|
+
storage: join(home, '.storage', `${miniAppId}.json`),
|
|
70
|
+
log: join(ws.log, username, `${miniAppId}.log`),
|
|
71
|
+
cache: join(home, '.cache', miniAppId),
|
|
72
|
+
};
|
|
73
|
+
// Ensure MiniApp-specific directories exist
|
|
74
|
+
ensureDir(paths.data);
|
|
75
|
+
ensureDir(join(ws.log, username));
|
|
76
|
+
ensureDir(paths.cache);
|
|
77
|
+
return paths;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Migrate existing single-user data to the admin user's home directory.
|
|
81
|
+
*
|
|
82
|
+
* Detects legacy layout (`<data>/data/`, `<data>/storage/`) and moves
|
|
83
|
+
* everything into `<data>/home/admin/.data/` and `<data>/home/admin/.storage/`.
|
|
84
|
+
* This is a one-time, non-destructive migration for installations that
|
|
85
|
+
* previously used the hardcoded 'admin' account.
|
|
86
|
+
*
|
|
87
|
+
* New installations (that go through the onboarding flow) will never have
|
|
88
|
+
* these legacy directories, so this function is a no-op for them.
|
|
89
|
+
*/
|
|
90
|
+
export function migrateToMultiUser() {
|
|
91
|
+
const ws = getWorkspacePaths();
|
|
92
|
+
const legacyDataDir = join(ws.data, 'data');
|
|
93
|
+
const legacyStorageDir = join(ws.data, 'storage');
|
|
94
|
+
// Only migrate if the legacy directories exist and have content
|
|
95
|
+
const hasLegacyData = existsSync(legacyDataDir) && readdirSync(legacyDataDir).length > 0;
|
|
96
|
+
const hasLegacyStorage = existsSync(legacyStorageDir) && readdirSync(legacyStorageDir).length > 0;
|
|
97
|
+
if (!hasLegacyData && !hasLegacyStorage) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const adminHome = join(ws.data, 'home', 'admin');
|
|
101
|
+
ensureDir(adminHome);
|
|
102
|
+
// Move legacy data/* → home/admin/.data/*
|
|
103
|
+
if (hasLegacyData) {
|
|
104
|
+
const targetDataDir = join(adminHome, '.data');
|
|
105
|
+
ensureDir(targetDataDir);
|
|
106
|
+
for (const entry of readdirSync(legacyDataDir)) {
|
|
107
|
+
const src = join(legacyDataDir, entry);
|
|
108
|
+
const dest = join(targetDataDir, entry);
|
|
109
|
+
if (!existsSync(dest)) {
|
|
110
|
+
renameSync(src, dest);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Remove the now-empty legacy directory
|
|
114
|
+
try {
|
|
115
|
+
if (readdirSync(legacyDataDir).length === 0) {
|
|
116
|
+
rmSync(legacyDataDir, { recursive: true });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// best-effort
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Move legacy storage/* → home/admin/.storage/*
|
|
124
|
+
if (hasLegacyStorage) {
|
|
125
|
+
const targetStorageDir = join(adminHome, '.storage');
|
|
126
|
+
ensureDir(targetStorageDir);
|
|
127
|
+
for (const entry of readdirSync(legacyStorageDir)) {
|
|
128
|
+
const src = join(legacyStorageDir, entry);
|
|
129
|
+
const dest = join(targetStorageDir, entry);
|
|
130
|
+
if (!existsSync(dest)) {
|
|
131
|
+
renameSync(src, dest);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Ensure remaining admin home subdirs exist
|
|
136
|
+
ensureDir(join(adminHome, '.cache'));
|
|
137
|
+
ensureDir(join(adminHome, '.ai-sessions'));
|
|
138
|
+
}
|
|
139
|
+
function ensureDir(dir) {
|
|
140
|
+
if (!existsSync(dir)) {
|
|
141
|
+
mkdirSync(dir, { recursive: true });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/services/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,IAAI,cAAc,GAA0B,IAAI,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAEnD,cAAc,GAAG;QACf,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;IAEF,+BAA+B;IAC/B,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/B,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9B,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAEhC,6BAA6B;IAC7B,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAClC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,QAAgB;IACrE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAiB;QAC1B,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;QACpC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,SAAS,OAAO,CAAC;QACpD,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,SAAS,MAAM,CAAC;QAC/C,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC;KACvC,CAAC;IAEF,4CAA4C;IAC5C,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEvB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAElD,gEAAgE;IAChE,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACzF,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAElG,IAAI,CAAC,aAAa,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,SAAS,CAAC,SAAS,CAAC,CAAC;IAErB,0CAA0C;IAC1C,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,SAAS,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,wCAAwC;QACxC,IAAI,CAAC;YACH,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@desktalk/core",
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
|
+
"description": "DeskTalk application shell, CLI, and backend server.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/vincentdchan/DeskTalk.git",
|
|
10
|
+
"directory": "packages/core"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"desktalk": "./dist/cli/index.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"main": "./dist/index.js",
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@fastify/cookie": "^11.0.2",
|
|
31
|
+
"@fastify/static": "^8.0.0",
|
|
32
|
+
"@fastify/websocket": "^11.0.0",
|
|
33
|
+
"@mariozechner/pi-ai": "^0.62.0",
|
|
34
|
+
"@mariozechner/pi-coding-agent": "^0.62.0",
|
|
35
|
+
"@sinclair/typebox": "^0.34.48",
|
|
36
|
+
"ahooks": "^3.9.6",
|
|
37
|
+
"axios": "^1.13.6",
|
|
38
|
+
"bcryptjs": "^3.0.3",
|
|
39
|
+
"better-sqlite3": "^12.8.0",
|
|
40
|
+
"commander": "^13.0.0",
|
|
41
|
+
"culori": "^4.0.2",
|
|
42
|
+
"env-paths": "^3.0.0",
|
|
43
|
+
"fastify": "^5.0.0",
|
|
44
|
+
"monaco-editor": "^0.52.0",
|
|
45
|
+
"partial-json": "^0.1.7",
|
|
46
|
+
"pino": "^10.3.1",
|
|
47
|
+
"sharp": "^0.34.5",
|
|
48
|
+
"undici": "^7.24.1",
|
|
49
|
+
"@desktalk/miniapp-file-explorer": "0.1.0-alpha.1",
|
|
50
|
+
"@desktalk/miniapp-note": "0.1.0-alpha.1",
|
|
51
|
+
"@desktalk/miniapp-player": "0.1.0-alpha.1",
|
|
52
|
+
"@desktalk/miniapp-preview": "0.1.0-alpha.1",
|
|
53
|
+
"@desktalk/miniapp-text-edit": "0.1.0-alpha.1",
|
|
54
|
+
"@desktalk/miniapp-preference": "0.1.0-alpha.1",
|
|
55
|
+
"@desktalk/ui": "0.1.0-alpha.1",
|
|
56
|
+
"@desktalk/miniapp-terminal": "0.1.0-alpha.1",
|
|
57
|
+
"@desktalk/sdk": "0.1.0-alpha.1"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
61
|
+
"@types/culori": "^4.0.1",
|
|
62
|
+
"@types/node": "^22.0.0",
|
|
63
|
+
"@types/react": "^19.0.0",
|
|
64
|
+
"@types/react-dom": "^19.0.0",
|
|
65
|
+
"@types/ws": "^8.18.1",
|
|
66
|
+
"@vitejs/plugin-react": "^5.2.0",
|
|
67
|
+
"magic-string": "^0.30.17",
|
|
68
|
+
"pino-pretty": "^13.1.3",
|
|
69
|
+
"react": "^19.0.0",
|
|
70
|
+
"react-dom": "^19.0.0",
|
|
71
|
+
"sass": "^1.86.3",
|
|
72
|
+
"streamdown": "^2.4.0",
|
|
73
|
+
"typescript": "^5.7.0",
|
|
74
|
+
"vite": "^7.3.1",
|
|
75
|
+
"vitest": "^3.0.0",
|
|
76
|
+
"zustand": "^5.0.0"
|
|
77
|
+
},
|
|
78
|
+
"scripts": {
|
|
79
|
+
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json --resolve-full-paths --resolve-full-extension .js && node ./scripts/copy-manual-pages.mjs && vite build",
|
|
80
|
+
"build:server": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json --resolve-full-paths --resolve-full-extension .js && node ./scripts/copy-manual-pages.mjs",
|
|
81
|
+
"build:frontend": "vite build",
|
|
82
|
+
"start": "node dist/cli/index.js start",
|
|
83
|
+
"dev": "pnpm run build:server && pnpm run --parallel \"/dev:/\"",
|
|
84
|
+
"dev:backend": "node dist/cli/index.js start --dev",
|
|
85
|
+
"dev:frontend": "vite",
|
|
86
|
+
"clean": "rm -rf dist",
|
|
87
|
+
"unit:test": "vitest run"
|
|
88
|
+
}
|
|
89
|
+
}
|