@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.
Files changed (281) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +82 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/frontend/assets/frontend-B3QNYf3p.js +413 -0
  7. package/dist/frontend/assets/frontend-B3QNYf3p.js.map +1 -0
  8. package/dist/frontend/assets/frontend-B4aeXn9d.js +416 -0
  9. package/dist/frontend/assets/frontend-B4aeXn9d.js.map +1 -0
  10. package/dist/frontend/assets/frontend-BwyRSlHp.js +6513 -0
  11. package/dist/frontend/assets/frontend-BwyRSlHp.js.map +1 -0
  12. package/dist/frontend/assets/frontend-Dix2OWTT.js +229 -0
  13. package/dist/frontend/assets/frontend-Dix2OWTT.js.map +1 -0
  14. package/dist/frontend/assets/frontend-Dx41dEM9.js +407 -0
  15. package/dist/frontend/assets/frontend-Dx41dEM9.js.map +1 -0
  16. package/dist/frontend/assets/frontend-WpQng8Mt.js +1991 -0
  17. package/dist/frontend/assets/frontend-WpQng8Mt.js.map +1 -0
  18. package/dist/frontend/assets/frontend-rTwBdJbn.js +2123 -0
  19. package/dist/frontend/assets/frontend-rTwBdJbn.js.map +1 -0
  20. package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js +2 -0
  21. package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js.map +1 -0
  22. package/dist/frontend/assets/index-C5-XUOS7.js +1863 -0
  23. package/dist/frontend/assets/index-C5-XUOS7.js.map +1 -0
  24. package/dist/frontend/assets/index-C_e3_6yE.css +1 -0
  25. package/dist/frontend/index.html +22 -0
  26. package/dist/frontend/pcm-capture-processor.js +65 -0
  27. package/dist/i18n/manifest.json +34 -0
  28. package/dist/i18n/zh-CN.json +7 -0
  29. package/dist/index.d.ts +6 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +6 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/server/admin-routes.d.ts +14 -0
  34. package/dist/server/admin-routes.d.ts.map +1 -0
  35. package/dist/server/admin-routes.js +118 -0
  36. package/dist/server/admin-routes.js.map +1 -0
  37. package/dist/server/api-routes.d.ts +8 -0
  38. package/dist/server/api-routes.d.ts.map +1 -0
  39. package/dist/server/api-routes.js +203 -0
  40. package/dist/server/api-routes.js.map +1 -0
  41. package/dist/server/auth-routes.d.ts +19 -0
  42. package/dist/server/auth-routes.d.ts.map +1 -0
  43. package/dist/server/auth-routes.js +155 -0
  44. package/dist/server/auth-routes.js.map +1 -0
  45. package/dist/server/dtfs-routes.d.ts +3 -0
  46. package/dist/server/dtfs-routes.d.ts.map +1 -0
  47. package/dist/server/dtfs-routes.js +183 -0
  48. package/dist/server/dtfs-routes.js.map +1 -0
  49. package/dist/server/index.d.ts +15 -0
  50. package/dist/server/index.d.ts.map +1 -0
  51. package/dist/server/index.js +158 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/monaco-routes.d.ts +3 -0
  54. package/dist/server/monaco-routes.d.ts.map +1 -0
  55. package/dist/server/monaco-routes.js +45 -0
  56. package/dist/server/monaco-routes.js.map +1 -0
  57. package/dist/server/voice-routes.d.ts +7 -0
  58. package/dist/server/voice-routes.d.ts.map +1 -0
  59. package/dist/server/voice-routes.js +142 -0
  60. package/dist/server/voice-routes.js.map +1 -0
  61. package/dist/server/ws-routes.d.ts +29 -0
  62. package/dist/server/ws-routes.d.ts.map +1 -0
  63. package/dist/server/ws-routes.js +334 -0
  64. package/dist/server/ws-routes.js.map +1 -0
  65. package/dist/services/ai/action-tool.d.ts +9 -0
  66. package/dist/services/ai/action-tool.d.ts.map +1 -0
  67. package/dist/services/ai/action-tool.js +51 -0
  68. package/dist/services/ai/action-tool.js.map +1 -0
  69. package/dist/services/ai/app-tools.d.ts +15 -0
  70. package/dist/services/ai/app-tools.d.ts.map +1 -0
  71. package/dist/services/ai/app-tools.js +119 -0
  72. package/dist/services/ai/app-tools.js.map +1 -0
  73. package/dist/services/ai/chat-service.d.ts +27 -0
  74. package/dist/services/ai/chat-service.d.ts.map +1 -0
  75. package/dist/services/ai/chat-service.js +213 -0
  76. package/dist/services/ai/chat-service.js.map +1 -0
  77. package/dist/services/ai/create-liveapp-tool.d.ts +15 -0
  78. package/dist/services/ai/create-liveapp-tool.d.ts.map +1 -0
  79. package/dist/services/ai/create-liveapp-tool.js +142 -0
  80. package/dist/services/ai/create-liveapp-tool.js.map +1 -0
  81. package/dist/services/ai/desktop-tool.d.ts +27 -0
  82. package/dist/services/ai/desktop-tool.d.ts.map +1 -0
  83. package/dist/services/ai/desktop-tool.js +106 -0
  84. package/dist/services/ai/desktop-tool.js.map +1 -0
  85. package/dist/services/ai/edit-history.d.ts +16 -0
  86. package/dist/services/ai/edit-history.d.ts.map +1 -0
  87. package/dist/services/ai/edit-history.js +137 -0
  88. package/dist/services/ai/edit-history.js.map +1 -0
  89. package/dist/services/ai/edit-tool.d.ts +9 -0
  90. package/dist/services/ai/edit-tool.d.ts.map +1 -0
  91. package/dist/services/ai/edit-tool.js +113 -0
  92. package/dist/services/ai/edit-tool.js.map +1 -0
  93. package/dist/services/ai/generate-html-tool.d.ts +15 -0
  94. package/dist/services/ai/generate-html-tool.d.ts.map +1 -0
  95. package/dist/services/ai/generate-html-tool.js +140 -0
  96. package/dist/services/ai/generate-html-tool.js.map +1 -0
  97. package/dist/services/ai/generate-icon-tool.d.ts +10 -0
  98. package/dist/services/ai/generate-icon-tool.d.ts.map +1 -0
  99. package/dist/services/ai/generate-icon-tool.js +58 -0
  100. package/dist/services/ai/generate-icon-tool.js.map +1 -0
  101. package/dist/services/ai/html-bridge-script.d.ts +2 -0
  102. package/dist/services/ai/html-bridge-script.d.ts.map +1 -0
  103. package/dist/services/ai/html-bridge-script.js +2 -0
  104. package/dist/services/ai/html-bridge-script.js.map +1 -0
  105. package/dist/services/ai/html-guidelines-tool.d.ts +3 -0
  106. package/dist/services/ai/html-guidelines-tool.d.ts.map +1 -0
  107. package/dist/services/ai/html-guidelines-tool.js +157 -0
  108. package/dist/services/ai/html-guidelines-tool.js.map +1 -0
  109. package/dist/services/ai/html-stream-coordinator.d.ts +92 -0
  110. package/dist/services/ai/html-stream-coordinator.d.ts.map +1 -0
  111. package/dist/services/ai/html-stream-coordinator.js +314 -0
  112. package/dist/services/ai/html-stream-coordinator.js.map +1 -0
  113. package/dist/services/ai/html-theme-link.d.ts +9 -0
  114. package/dist/services/ai/html-theme-link.d.ts.map +1 -0
  115. package/dist/services/ai/html-theme-link.js +12 -0
  116. package/dist/services/ai/html-theme-link.js.map +1 -0
  117. package/dist/services/ai/html-ui-script.d.ts +9 -0
  118. package/dist/services/ai/html-ui-script.d.ts.map +1 -0
  119. package/dist/services/ai/html-ui-script.js +9 -0
  120. package/dist/services/ai/html-ui-script.js.map +1 -0
  121. package/dist/services/ai/image-generation-service.d.ts +26 -0
  122. package/dist/services/ai/image-generation-service.d.ts.map +1 -0
  123. package/dist/services/ai/image-generation-service.js +205 -0
  124. package/dist/services/ai/image-generation-service.js.map +1 -0
  125. package/dist/services/ai/manual-pages/desktop-actions.md +36 -0
  126. package/dist/services/ai/manual-pages/desktop-windows.md +24 -0
  127. package/dist/services/ai/manual-pages/dt-badge.md +36 -0
  128. package/dist/services/ai/manual-pages/dt-button.md +38 -0
  129. package/dist/services/ai/manual-pages/dt-card.md +22 -0
  130. package/dist/services/ai/manual-pages/dt-chart.md +261 -0
  131. package/dist/services/ai/manual-pages/dt-divider.md +25 -0
  132. package/dist/services/ai/manual-pages/dt-grid.md +29 -0
  133. package/dist/services/ai/manual-pages/dt-list-view.md +96 -0
  134. package/dist/services/ai/manual-pages/dt-markdown-editor.md +90 -0
  135. package/dist/services/ai/manual-pages/dt-markdown.md +86 -0
  136. package/dist/services/ai/manual-pages/dt-select.md +21 -0
  137. package/dist/services/ai/manual-pages/dt-stack.md +31 -0
  138. package/dist/services/ai/manual-pages/dt-stat.md +43 -0
  139. package/dist/services/ai/manual-pages/dt-table-view.md +120 -0
  140. package/dist/services/ai/manual-pages/dt-tooltip.md +18 -0
  141. package/dist/services/ai/manual-pages/editing-preview.md +25 -0
  142. package/dist/services/ai/manual-pages/html-actions.md +74 -0
  143. package/dist/services/ai/manual-pages/html-bridge.md +187 -0
  144. package/dist/services/ai/manual-pages/html-components.md +66 -0
  145. package/dist/services/ai/manual-pages/html-examples.md +185 -0
  146. package/dist/services/ai/manual-pages/html-layouts.md +128 -0
  147. package/dist/services/ai/manual-pages/html-storage.md +153 -0
  148. package/dist/services/ai/manual-pages/html-tokens.md +26 -0
  149. package/dist/services/ai/manual-pages/index.d.ts +10 -0
  150. package/dist/services/ai/manual-pages/index.d.ts.map +1 -0
  151. package/dist/services/ai/manual-pages/index.js +186 -0
  152. package/dist/services/ai/manual-pages/index.js.map +1 -0
  153. package/dist/services/ai/manual-tool.d.ts +3 -0
  154. package/dist/services/ai/manual-tool.d.ts.map +1 -0
  155. package/dist/services/ai/manual-tool.js +104 -0
  156. package/dist/services/ai/manual-tool.js.map +1 -0
  157. package/dist/services/ai/pi-session-service.d.ts +101 -0
  158. package/dist/services/ai/pi-session-service.d.ts.map +1 -0
  159. package/dist/services/ai/pi-session-service.js +697 -0
  160. package/dist/services/ai/pi-session-service.js.map +1 -0
  161. package/dist/services/ai/providers.d.ts +21 -0
  162. package/dist/services/ai/providers.d.ts.map +1 -0
  163. package/dist/services/ai/providers.js +93 -0
  164. package/dist/services/ai/providers.js.map +1 -0
  165. package/dist/services/ai/redo-edit-tool.d.ts +9 -0
  166. package/dist/services/ai/redo-edit-tool.d.ts.map +1 -0
  167. package/dist/services/ai/redo-edit-tool.js +44 -0
  168. package/dist/services/ai/redo-edit-tool.js.map +1 -0
  169. package/dist/services/ai/system-prompt.d.ts +7 -0
  170. package/dist/services/ai/system-prompt.d.ts.map +1 -0
  171. package/dist/services/ai/system-prompt.js +72 -0
  172. package/dist/services/ai/system-prompt.js.map +1 -0
  173. package/dist/services/ai/undo-edit-tool.d.ts +9 -0
  174. package/dist/services/ai/undo-edit-tool.d.ts.map +1 -0
  175. package/dist/services/ai/undo-edit-tool.js +44 -0
  176. package/dist/services/ai/undo-edit-tool.js.map +1 -0
  177. package/dist/services/ai/window-tools.d.ts +27 -0
  178. package/dist/services/ai/window-tools.d.ts.map +1 -0
  179. package/dist/services/ai/window-tools.js +155 -0
  180. package/dist/services/ai/window-tools.js.map +1 -0
  181. package/dist/services/backend-host.d.ts +10 -0
  182. package/dist/services/backend-host.d.ts.map +1 -0
  183. package/dist/services/backend-host.js +117 -0
  184. package/dist/services/backend-host.js.map +1 -0
  185. package/dist/services/backend-ipc.d.ts +60 -0
  186. package/dist/services/backend-ipc.d.ts.map +1 -0
  187. package/dist/services/backend-ipc.js +2 -0
  188. package/dist/services/backend-ipc.js.map +1 -0
  189. package/dist/services/backend-process-manager.d.ts +60 -0
  190. package/dist/services/backend-process-manager.d.ts.map +1 -0
  191. package/dist/services/backend-process-manager.js +203 -0
  192. package/dist/services/backend-process-manager.js.map +1 -0
  193. package/dist/services/filesystem.d.ts +8 -0
  194. package/dist/services/filesystem.d.ts.map +1 -0
  195. package/dist/services/filesystem.js +94 -0
  196. package/dist/services/filesystem.js.map +1 -0
  197. package/dist/services/i18n.d.ts +28 -0
  198. package/dist/services/i18n.d.ts.map +1 -0
  199. package/dist/services/i18n.js +76 -0
  200. package/dist/services/i18n.js.map +1 -0
  201. package/dist/services/liveapp-icon.d.ts +9 -0
  202. package/dist/services/liveapp-icon.d.ts.map +1 -0
  203. package/dist/services/liveapp-icon.js +28 -0
  204. package/dist/services/liveapp-icon.js.map +1 -0
  205. package/dist/services/liveapps.d.ts +12 -0
  206. package/dist/services/liveapps.d.ts.map +1 -0
  207. package/dist/services/liveapps.js +84 -0
  208. package/dist/services/liveapps.js.map +1 -0
  209. package/dist/services/logger.d.ts +34 -0
  210. package/dist/services/logger.d.ts.map +1 -0
  211. package/dist/services/logger.js +74 -0
  212. package/dist/services/logger.js.map +1 -0
  213. package/dist/services/messaging.d.ts +14 -0
  214. package/dist/services/messaging.d.ts.map +1 -0
  215. package/dist/services/messaging.js +41 -0
  216. package/dist/services/messaging.js.map +1 -0
  217. package/dist/services/miniapp-icon.d.ts +9 -0
  218. package/dist/services/miniapp-icon.d.ts.map +1 -0
  219. package/dist/services/miniapp-icon.js +25 -0
  220. package/dist/services/miniapp-icon.js.map +1 -0
  221. package/dist/services/miniapp-registry.d.ts +73 -0
  222. package/dist/services/miniapp-registry.d.ts.map +1 -0
  223. package/dist/services/miniapp-registry.js +144 -0
  224. package/dist/services/miniapp-registry.js.map +1 -0
  225. package/dist/services/onboarding-config.d.ts +37 -0
  226. package/dist/services/onboarding-config.d.ts.map +1 -0
  227. package/dist/services/onboarding-config.js +76 -0
  228. package/dist/services/onboarding-config.js.map +1 -0
  229. package/dist/services/preferences.d.ts +10 -0
  230. package/dist/services/preferences.d.ts.map +1 -0
  231. package/dist/services/preferences.js +48 -0
  232. package/dist/services/preferences.js.map +1 -0
  233. package/dist/services/proxy-dispatcher.d.ts +18 -0
  234. package/dist/services/proxy-dispatcher.d.ts.map +1 -0
  235. package/dist/services/proxy-dispatcher.js +33 -0
  236. package/dist/services/proxy-dispatcher.js.map +1 -0
  237. package/dist/services/storage.d.ts +7 -0
  238. package/dist/services/storage.d.ts.map +1 -0
  239. package/dist/services/storage.js +55 -0
  240. package/dist/services/storage.js.map +1 -0
  241. package/dist/services/theme-css.d.ts +21 -0
  242. package/dist/services/theme-css.d.ts.map +1 -0
  243. package/dist/services/theme-css.js +213 -0
  244. package/dist/services/theme-css.js.map +1 -0
  245. package/dist/services/user-db.d.ts +69 -0
  246. package/dist/services/user-db.d.ts.map +1 -0
  247. package/dist/services/user-db.js +175 -0
  248. package/dist/services/user-db.js.map +1 -0
  249. package/dist/services/voice/audio-format.d.ts +5 -0
  250. package/dist/services/voice/audio-format.d.ts.map +1 -0
  251. package/dist/services/voice/audio-format.js +27 -0
  252. package/dist/services/voice/audio-format.js.map +1 -0
  253. package/dist/services/voice/azure-openai-whisper-adapter.d.ts +23 -0
  254. package/dist/services/voice/azure-openai-whisper-adapter.d.ts.map +1 -0
  255. package/dist/services/voice/azure-openai-whisper-adapter.js +60 -0
  256. package/dist/services/voice/azure-openai-whisper-adapter.js.map +1 -0
  257. package/dist/services/voice/openai-whisper-adapter.d.ts +22 -0
  258. package/dist/services/voice/openai-whisper-adapter.d.ts.map +1 -0
  259. package/dist/services/voice/openai-whisper-adapter.js +61 -0
  260. package/dist/services/voice/openai-whisper-adapter.js.map +1 -0
  261. package/dist/services/voice/stt-adapter.d.ts +31 -0
  262. package/dist/services/voice/stt-adapter.d.ts.map +1 -0
  263. package/dist/services/voice/stt-adapter.js +8 -0
  264. package/dist/services/voice/stt-adapter.js.map +1 -0
  265. package/dist/services/voice/vad-segmenter.d.ts +68 -0
  266. package/dist/services/voice/vad-segmenter.d.ts.map +1 -0
  267. package/dist/services/voice/vad-segmenter.js +159 -0
  268. package/dist/services/voice/vad-segmenter.js.map +1 -0
  269. package/dist/services/voice/voice-session.d.ts +54 -0
  270. package/dist/services/voice/voice-session.d.ts.map +1 -0
  271. package/dist/services/voice/voice-session.js +137 -0
  272. package/dist/services/voice/voice-session.js.map +1 -0
  273. package/dist/services/window-manager.d.ts +94 -0
  274. package/dist/services/window-manager.d.ts.map +1 -0
  275. package/dist/services/window-manager.js +282 -0
  276. package/dist/services/window-manager.js.map +1 -0
  277. package/dist/services/workspace.d.ts +51 -0
  278. package/dist/services/workspace.d.ts.map +1 -0
  279. package/dist/services/workspace.js +144 -0
  280. package/dist/services/workspace.js.map +1 -0
  281. 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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmEpC,SAAS,mBAAmB;IAC1B,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,IAAI;QACV,eAAe,EAAE,IAAI;QACrB,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,CAAC;QAClB,kBAAkB,EAAE,MAAM;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAyB;IAClD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,OAAO,CACL,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ;QAChC,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,CACpC,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAe;IAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,MAAiC,CAAC;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,eAAe,GACnB,OAAO,SAAS,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IACnF,MAAM,kBAAkB,GACtB,OAAO,SAAS,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,MAAM,eAAe,GACnB,OAAO,SAAS,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7F,MAAM,kBAAkB,GACtB,SAAS,CAAC,kBAAkB,KAAK,YAAY;QAC7C,SAAS,CAAC,kBAAkB,KAAK,UAAU;QAC3C,SAAS,CAAC,kBAAkB,KAAK,MAAM;QACrC,CAAC,CAAC,SAAS,CAAC,kBAAkB;QAC9B,CAAC,CAAC,MAAM,CAAC;IAEb,IAAI,SAAS,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC1C,IAAI,EAAG,SAAS,CAAC,IAAsC,IAAI,IAAI;YAC/D,eAAe;YACf,kBAAkB;YAClB,eAAe;YACf,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,SAAuC,CAAC;IACvD,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,OAAO;aACb,MAAM,CAAC,iBAAiB,CAAC;aACzB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAA2B,CAAC,CAAC;QAClE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,eAAe;QACf,kBAAkB;QAClB,eAAe;QACf,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,KAA2B;IACxE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,oEAAoE;AACpE,SAAS,UAAU,CAAC,IAAgB;IAClC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc,CACrB,IAAgB,EAChB,MAA8B,EAC9B,SAAwB,EACxB,MAAM,GAAG,CAAC;IAEV,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEhC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,GAAG,GAAG,QAAQ,CAAC;IACjC,MAAM,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,WAAW,QAAQ,IAAI,SAAS,GAAG,CAAC;IACtE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/E,OAAO,GAAG,MAAM,KAAK,KAAK,KAAK,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,oBAAoB;IACvB,KAAK,GAAyB,mBAAmB,EAAE,CAAC;IAC3C,aAAa,GAAmD,EAAE,CAAC;IAC5E,QAAQ,CAAS;IAEzB,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,WAAmB;QAC5B,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,mBAAmB,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,IAAI;QACV,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,GAAG;YACX,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAClE,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,IAAI;YAC5B,eAAe,EACb,OAAO,SAAS,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;YAClF,kBAAkB,EAChB,OAAO,SAAS,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI;YACxF,eAAe,EACb,OAAO,SAAS,CAAC,eAAe,KAAK,QAAQ;gBAC3C,CAAC,CAAC,SAAS,CAAC,eAAe;gBAC3B,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;YACtC,kBAAkB,EAChB,SAAS,CAAC,kBAAkB,KAAK,YAAY;gBAC7C,SAAS,CAAC,kBAAkB,KAAK,UAAU;gBAC3C,SAAS,CAAC,kBAAkB,KAAK,MAAM;gBACrC,CAAC,CAAC,SAAS,CAAC,kBAAkB;gBAC9B,CAAC,CAAC,MAAM;SACb,CAAC;QAEF,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/C,gDAAgD;QAChD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YACjE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACpB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,OAA6B;QACrC,IAAI,CAAC,KAAK,GAAG;YACX,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC9D,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,eAAe,EAAE,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;YAC7F,kBAAkB,EAChB,OAAO,OAAO,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI;YACpF,eAAe,EAAE,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1F,kBAAkB,EAChB,OAAO,CAAC,kBAAkB,KAAK,YAAY;gBAC3C,OAAO,CAAC,kBAAkB,KAAK,UAAU;gBACzC,OAAO,CAAC,kBAAkB,KAAK,MAAM;gBACnC,CAAC,CAAC,OAAO,CAAC,kBAAkB;gBAC5B,CAAC,CAAC,MAAM;SACb,CAAC;QACF,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC7E,CAAC;IAED,gBAAgB,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,gBAAgB,CAAC,QAAgB,EAAE,OAAuC;QACxE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,yBAAyB,CAC7B,QAA0F;QAE1F,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA0C,CAAC;QAE3E,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAChE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACnC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;QAED,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACvD,MAAM,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CACf,iBAAsD,EACtD,iBAAsD,EACtD,WAAmB;QAEnB,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9C,yEAAyE;QACzE,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,SAAS,GAAG,CAAC;YACjE,CAAC;YACD,WAAW,CAAC,IAAI,CACd,SAAS,EACT,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CACvE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtC,CAAC;QAED,yEAAyE;QACzE,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM;YAC3C,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACjB,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM;YAC3C,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5D,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAEjB,yEAAyE;QACzE,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC3D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,WAAW,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,WAAW,cAAc,CAAC,CAAC;gBAC1E,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,GAAG,YAAY;yBAC5B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;wBAChB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;wBACjD,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxD,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,GAAG,CAAC;oBAC7C,CAAC,CAAC;yBACD,IAAI,CAAC,IAAI,CAAC,CAAC;oBACd,WAAW,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,WAAW,eAAe,UAAU,GAAG,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,mBAAmB;YACnB,SAAS,WAAW,EAAE;YACtB,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,KAAK,MAAM,aAAa,CAAC,EAAE,cAAc,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE;YAC5H,GAAG,WAAW;YACd,WAAW;YACX,GAAG,YAAY;YACf,WAAW;YACX,GAAG,YAAY;YACf,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBACxB,CAAC,CAAC,CAAC,YAAY,aAAc,CAAC,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;gBACrD,CAAC,CAAC,CAAC,8DAA8D,CAAC,CAAC;YACrE,oBAAoB;SACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF"}
@@ -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":"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"}
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
+ }