@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,76 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ function formatMessage(message, params) {
4
+ if (!params) {
5
+ return message;
6
+ }
7
+ return message.replace(/\{([A-Za-z_$][\w$]*)\}/g, (_match, name) => {
8
+ const value = params[name];
9
+ return value == null ? '' : String(value);
10
+ });
11
+ }
12
+ function getManifestPath(packageRoot) {
13
+ return join(packageRoot, 'dist', 'i18n', 'manifest.json');
14
+ }
15
+ function getLocalePath(packageRoot, locale) {
16
+ return join(packageRoot, 'dist', 'i18n', `${locale}.json`);
17
+ }
18
+ export function readPackageI18nManifest(packageRoot) {
19
+ const manifestPath = getManifestPath(packageRoot);
20
+ if (!existsSync(manifestPath)) {
21
+ return null;
22
+ }
23
+ return JSON.parse(readFileSync(manifestPath, 'utf8'));
24
+ }
25
+ function readLocaleFile(packageRoot, locale) {
26
+ const localePath = getLocalePath(packageRoot, locale);
27
+ if (!existsSync(localePath)) {
28
+ return {};
29
+ }
30
+ return JSON.parse(readFileSync(localePath, 'utf8'));
31
+ }
32
+ function getLocaleChain(locale) {
33
+ const trimmed = locale.trim();
34
+ if (!trimmed) {
35
+ return [];
36
+ }
37
+ const normalized = trimmed.split('_').join('-');
38
+ const segments = normalized.split('-');
39
+ if (segments.length <= 1) {
40
+ return [normalized];
41
+ }
42
+ return [segments[0], normalized];
43
+ }
44
+ export function loadPackageLocaleMessages(packageRoot, packageScope, locale) {
45
+ const scopeMessages = {};
46
+ for (const candidate of getLocaleChain(locale)) {
47
+ Object.assign(scopeMessages, readLocaleFile(packageRoot, candidate));
48
+ }
49
+ return Object.keys(scopeMessages).length > 0 ? { [packageScope]: scopeMessages } : {};
50
+ }
51
+ export function loadMergedLocaleMessages(packages, locale) {
52
+ const merged = {};
53
+ for (const pkg of packages) {
54
+ const scopedMessages = loadPackageLocaleMessages(pkg.packageRoot, pkg.packageScope, locale);
55
+ if (scopedMessages[pkg.packageScope]) {
56
+ merged[pkg.packageScope] = {
57
+ ...(merged[pkg.packageScope] ?? {}),
58
+ ...scopedMessages[pkg.packageScope],
59
+ };
60
+ }
61
+ }
62
+ return merged;
63
+ }
64
+ export function createPackageLocalizer(options) {
65
+ const messages = loadPackageLocaleMessages(options.packageRoot, options.defaultScope, options.locale);
66
+ return {
67
+ t(key, defaultText, params) {
68
+ const template = messages[options.defaultScope]?.[key] ?? defaultText;
69
+ return formatMessage(template, params);
70
+ },
71
+ locale() {
72
+ return options.locale;
73
+ },
74
+ };
75
+ }
76
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/services/i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ declare const LIVEAPP_ICON_SIZES: readonly [32, 64, 128, 256, 1024];
2
+ declare const DEFAULT_LIVEAPP_ICON_SIZE = 128;
3
+ declare const LIVEAPP_ICON_CACHE_CONTROL = "public, max-age=86400, stale-while-revalidate=604800";
4
+ type LiveAppIconSize = (typeof LIVEAPP_ICON_SIZES)[number];
5
+ declare function parseLiveAppIconSize(value: unknown): LiveAppIconSize | undefined;
6
+ declare function buildLiveAppIconUrl(id: string, version?: number, size?: LiveAppIconSize): string;
7
+ export { DEFAULT_LIVEAPP_ICON_SIZE, LIVEAPP_ICON_CACHE_CONTROL, LIVEAPP_ICON_SIZES, buildLiveAppIconUrl, parseLiveAppIconSize, };
8
+ export type { LiveAppIconSize };
9
+ //# sourceMappingURL=liveapp-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveapp-icon.d.ts","sourceRoot":"","sources":["../../src/services/liveapp-icon.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,kBAAkB,mCAAoC,CAAC;AAE7D,QAAA,MAAM,yBAAyB,MAAM,CAAC;AAEtC,QAAA,MAAM,0BAA0B,yDAAyD,CAAC;AAE1F,KAAK,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAM3D,iBAAS,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAezE;AAED,iBAAS,mBAAmB,CAC1B,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,EAChB,IAAI,GAAE,eAA2C,GAChD,MAAM,CAMR;AAED,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ const LIVEAPP_ICON_SIZES = [32, 64, 128, 256, 1024];
2
+ const DEFAULT_LIVEAPP_ICON_SIZE = 128;
3
+ const LIVEAPP_ICON_CACHE_CONTROL = 'public, max-age=86400, stale-while-revalidate=604800';
4
+ function isLiveAppIconSize(size) {
5
+ return LIVEAPP_ICON_SIZES.includes(size);
6
+ }
7
+ function parseLiveAppIconSize(value) {
8
+ if (value === undefined) {
9
+ return undefined;
10
+ }
11
+ if (typeof value !== 'string' || value.trim().length === 0) {
12
+ return undefined;
13
+ }
14
+ const parsed = Number.parseInt(value, 10);
15
+ if (!Number.isInteger(parsed) || !isLiveAppIconSize(parsed)) {
16
+ return undefined;
17
+ }
18
+ return parsed;
19
+ }
20
+ function buildLiveAppIconUrl(id, version, size = DEFAULT_LIVEAPP_ICON_SIZE) {
21
+ const params = new URLSearchParams({ size: String(size) });
22
+ if (typeof version === 'number' && Number.isFinite(version)) {
23
+ params.set('v', String(version));
24
+ }
25
+ return `/api/liveapps/${encodeURIComponent(id)}/icon?${params.toString()}`;
26
+ }
27
+ export { DEFAULT_LIVEAPP_ICON_SIZE, LIVEAPP_ICON_CACHE_CONTROL, LIVEAPP_ICON_SIZES, buildLiveAppIconUrl, parseLiveAppIconSize, };
28
+ //# sourceMappingURL=liveapp-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveapp-icon.js","sourceRoot":"","sources":["../../src/services/liveapp-icon.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAU,CAAC;AAE7D,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC,MAAM,0BAA0B,GAAG,sDAAsD,CAAC;AAI1F,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAQ,kBAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAC1B,EAAU,EACV,OAAgB,EAChB,OAAwB,yBAAyB;IAEjD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,iBAAiB,kBAAkB,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { MiniAppManifest } from '@desktalk/sdk';
2
+ export interface LiveAppEntry {
3
+ id: string;
4
+ name: string;
5
+ path: string;
6
+ icon: string;
7
+ iconPng?: string;
8
+ }
9
+ export declare function extractLiveAppTitle(html: string): string | null;
10
+ export declare function listLiveApps(userHomeDir: string): LiveAppEntry[];
11
+ export declare function toLiveAppManifest(entry: LiveAppEntry): MiniAppManifest;
12
+ //# sourceMappingURL=liveapps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveapps.d.ts","sourceRoot":"","sources":["../../src/services/liveapps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQrD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ/D;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE,CAqDhE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,CAQtE"}
@@ -0,0 +1,84 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { buildLiveAppIconUrl } from './liveapp-icon.js';
4
+ const LIVEAPP_DEFAULT_ICON = '📄';
5
+ const LIVEAPP_TITLE_RE = /<title[^>]*>([\s\S]*?)<\/title>/i;
6
+ function decodeHtmlEntities(value) {
7
+ return value
8
+ .replace(/&amp;/g, '&')
9
+ .replace(/&lt;/g, '<')
10
+ .replace(/&gt;/g, '>')
11
+ .replace(/&quot;/g, '"')
12
+ .replace(/&#39;/g, "'")
13
+ .replace(/&#x27;/gi, "'");
14
+ }
15
+ export function extractLiveAppTitle(html) {
16
+ const match = html.match(LIVEAPP_TITLE_RE);
17
+ if (!match) {
18
+ return null;
19
+ }
20
+ const title = decodeHtmlEntities(match[1].replace(/\s+/g, ' ').trim());
21
+ return title || null;
22
+ }
23
+ export function listLiveApps(userHomeDir) {
24
+ const liveAppsDir = join(userHomeDir, '.data', 'liveapps');
25
+ let entries = [];
26
+ try {
27
+ entries = readdirSync(liveAppsDir);
28
+ }
29
+ catch {
30
+ return [];
31
+ }
32
+ return entries
33
+ .map((entryName) => {
34
+ const directoryPath = join(liveAppsDir, entryName);
35
+ let stats;
36
+ try {
37
+ stats = statSync(directoryPath);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ if (!stats.isDirectory()) {
43
+ return null;
44
+ }
45
+ const absoluteHtmlPath = join(directoryPath, 'index.html');
46
+ let html;
47
+ try {
48
+ html = readFileSync(absoluteHtmlPath, 'utf8');
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ const title = extractLiveAppTitle(html) ?? entryName;
54
+ const iconPath = join(directoryPath, 'icon.png');
55
+ let iconPng;
56
+ if (existsSync(iconPath)) {
57
+ try {
58
+ iconPng = buildLiveAppIconUrl(entryName, statSync(iconPath).mtimeMs);
59
+ }
60
+ catch {
61
+ iconPng = buildLiveAppIconUrl(entryName);
62
+ }
63
+ }
64
+ return {
65
+ id: entryName,
66
+ name: title,
67
+ path: `.data/liveapps/${entryName}/index.html`,
68
+ icon: LIVEAPP_DEFAULT_ICON,
69
+ ...(iconPng ? { iconPng } : {}),
70
+ };
71
+ })
72
+ .filter((entry) => entry !== null)
73
+ .sort((a, b) => a.name.localeCompare(b.name));
74
+ }
75
+ export function toLiveAppManifest(entry) {
76
+ return {
77
+ id: entry.id,
78
+ name: entry.name,
79
+ icon: entry.icon,
80
+ version: '0.0.0',
81
+ description: 'AI-generated LiveApp',
82
+ };
83
+ }
84
+ //# sourceMappingURL=liveapps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveapps.js","sourceRoot":"","sources":["../../src/services/liveapps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import pino from 'pino';
2
+ /**
3
+ * Serializable logger configuration passed to child processes via IPC.
4
+ */
5
+ export interface LoggerConfig {
6
+ dev: boolean;
7
+ level: string;
8
+ logDir: string;
9
+ }
10
+ /**
11
+ * Creates the root pino logger.
12
+ *
13
+ * - Dev mode: pretty-printed to stdout via pino-pretty.
14
+ * - Prod mode: structured JSON written to <logDir>/desktalk.log.
15
+ */
16
+ export declare function createRootLogger(opts: {
17
+ dev: boolean;
18
+ logDir: string;
19
+ }): pino.Logger;
20
+ /**
21
+ * Creates a pino logger in a child process from the serialized config.
22
+ * Used by backend-host.ts — each MiniApp child recreates its own logger.
23
+ */
24
+ export declare function createChildLogger(config: LoggerConfig, scope: string): pino.Logger;
25
+ /**
26
+ * Extracts a serializable LoggerConfig from a root logger's setup.
27
+ * Passed over IPC to child processes so they can recreate an equivalent logger.
28
+ */
29
+ export declare function getLoggerConfig(opts: {
30
+ dev: boolean;
31
+ level: string;
32
+ logDir: string;
33
+ }): LoggerConfig;
34
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/services/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,MAAM,CA4BpF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CA6BlF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,YAAY,CAMf"}
@@ -0,0 +1,74 @@
1
+ import pino from 'pino';
2
+ import { join } from 'node:path';
3
+ import { mkdirSync, existsSync } from 'node:fs';
4
+ /**
5
+ * Creates the root pino logger.
6
+ *
7
+ * - Dev mode: pretty-printed to stdout via pino-pretty.
8
+ * - Prod mode: structured JSON written to <logDir>/desktalk.log.
9
+ */
10
+ export function createRootLogger(opts) {
11
+ if (opts.dev) {
12
+ return pino({
13
+ level: 'debug',
14
+ transport: {
15
+ target: 'pino-pretty',
16
+ options: {
17
+ colorize: true,
18
+ translateTime: 'HH:MM:ss.l',
19
+ ignore: 'pid,hostname',
20
+ },
21
+ },
22
+ });
23
+ }
24
+ // Ensure log directory exists
25
+ if (!existsSync(opts.logDir)) {
26
+ mkdirSync(opts.logDir, { recursive: true });
27
+ }
28
+ return pino({ level: 'info' }, pino.destination({
29
+ dest: join(opts.logDir, 'desktalk.log'),
30
+ mkdir: true,
31
+ sync: false,
32
+ }));
33
+ }
34
+ /**
35
+ * Creates a pino logger in a child process from the serialized config.
36
+ * Used by backend-host.ts — each MiniApp child recreates its own logger.
37
+ */
38
+ export function createChildLogger(config, scope) {
39
+ if (config.dev) {
40
+ return pino({
41
+ level: config.level,
42
+ base: { scope },
43
+ transport: {
44
+ target: 'pino-pretty',
45
+ options: {
46
+ colorize: true,
47
+ translateTime: 'HH:MM:ss.l',
48
+ ignore: 'pid,hostname',
49
+ },
50
+ },
51
+ });
52
+ }
53
+ // Ensure log directory exists
54
+ if (!existsSync(config.logDir)) {
55
+ mkdirSync(config.logDir, { recursive: true });
56
+ }
57
+ return pino({ level: config.level, base: { scope } }, pino.destination({
58
+ dest: join(config.logDir, 'desktalk.log'),
59
+ mkdir: true,
60
+ sync: false,
61
+ }));
62
+ }
63
+ /**
64
+ * Extracts a serializable LoggerConfig from a root logger's setup.
65
+ * Passed over IPC to child processes so they can recreate an equivalent logger.
66
+ */
67
+ export function getLoggerConfig(opts) {
68
+ return {
69
+ dev: opts.dev,
70
+ level: opts.level,
71
+ logDir: opts.logDir,
72
+ };
73
+ }
74
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/services/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAWhD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAsC;IACrE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,SAAS,EAAE;gBACT,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE;oBACP,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,YAAY;oBAC3B,MAAM,EAAE,cAAc;iBACvB;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,MAAM,EAAE,EACjB,IAAI,CAAC,WAAW,CAAC;QACf,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;QACvC,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,KAAK;KACZ,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB,EAAE,KAAa;IACnE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;YACV,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,EAAE,KAAK,EAAE;YACf,SAAS,EAAE;gBACT,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE;oBACP,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,YAAY;oBAC3B,MAAM,EAAE,cAAc;iBACvB;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EACxC,IAAI,CAAC,WAAW,CAAC;QACf,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;QACzC,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,KAAK;KACZ,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAI/B;IACC,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { WebSocket } from 'ws';
2
+ /**
3
+ * Register a WebSocket client for receiving events.
4
+ */
5
+ export declare function addClient(ws: WebSocket): void;
6
+ /**
7
+ * Broadcast an event to all connected clients.
8
+ */
9
+ export declare function broadcastEvent(miniAppId: string, event: string, data: unknown): void;
10
+ /**
11
+ * Broadcast a raw message to all connected clients (for AI events, etc.).
12
+ */
13
+ export declare function broadcastRaw(message: unknown): void;
14
+ //# sourceMappingURL=messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/services/messaging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAOpC;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAK7C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAapF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAOnD"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Set of connected WebSocket clients.
3
+ */
4
+ const connectedClients = new Set();
5
+ /**
6
+ * Register a WebSocket client for receiving events.
7
+ */
8
+ export function addClient(ws) {
9
+ connectedClients.add(ws);
10
+ ws.on('close', () => {
11
+ connectedClients.delete(ws);
12
+ });
13
+ }
14
+ /**
15
+ * Broadcast an event to all connected clients.
16
+ */
17
+ export function broadcastEvent(miniAppId, event, data) {
18
+ const message = JSON.stringify({
19
+ type: 'event',
20
+ miniAppId,
21
+ event,
22
+ data,
23
+ });
24
+ for (const client of connectedClients) {
25
+ if (client.readyState === 1 /* WebSocket.OPEN */) {
26
+ client.send(message);
27
+ }
28
+ }
29
+ }
30
+ /**
31
+ * Broadcast a raw message to all connected clients (for AI events, etc.).
32
+ */
33
+ export function broadcastRaw(message) {
34
+ const raw = JSON.stringify(message);
35
+ for (const client of connectedClients) {
36
+ if (client.readyState === 1) {
37
+ client.send(raw);
38
+ }
39
+ }
40
+ }
41
+ //# sourceMappingURL=messaging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/services/messaging.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,EAAa;IACrC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,KAAa,EAAE,IAAa;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,EAAE,OAAO;QACb,SAAS;QACT,KAAK;QACL,IAAI;KACL,CAAC,CAAC;IAEH,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC,oBAAoB,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ declare const MINIAPP_ICON_SIZES: readonly [32, 64, 128, 256, 1025];
2
+ declare const DEFAULT_MINIAPP_ICON_SIZE = 128;
3
+ declare const MINIAPP_ICON_CACHE_CONTROL = "public, max-age=86400, stale-while-revalidate=604800";
4
+ type MiniAppIconSize = (typeof MINIAPP_ICON_SIZES)[number];
5
+ declare function parseMiniAppIconSize(value: unknown): MiniAppIconSize | undefined;
6
+ declare function buildMiniAppIconUrl(id: string, size?: MiniAppIconSize): string;
7
+ export { DEFAULT_MINIAPP_ICON_SIZE, MINIAPP_ICON_CACHE_CONTROL, MINIAPP_ICON_SIZES, buildMiniAppIconUrl, parseMiniAppIconSize, };
8
+ export type { MiniAppIconSize };
9
+ //# sourceMappingURL=miniapp-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miniapp-icon.d.ts","sourceRoot":"","sources":["../../src/services/miniapp-icon.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,kBAAkB,mCAAoC,CAAC;AAE7D,QAAA,MAAM,yBAAyB,MAAM,CAAC;AAEtC,QAAA,MAAM,0BAA0B,yDAAyD,CAAC;AAE1F,KAAK,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAM3D,iBAAS,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAezE;AAED,iBAAS,mBAAmB,CAC1B,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,eAA2C,GAChD,MAAM,CAGR;AAED,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ const MINIAPP_ICON_SIZES = [32, 64, 128, 256, 1025];
2
+ const DEFAULT_MINIAPP_ICON_SIZE = 128;
3
+ const MINIAPP_ICON_CACHE_CONTROL = 'public, max-age=86400, stale-while-revalidate=604800';
4
+ function isMiniAppIconSize(size) {
5
+ return MINIAPP_ICON_SIZES.includes(size);
6
+ }
7
+ function parseMiniAppIconSize(value) {
8
+ if (value === undefined) {
9
+ return undefined;
10
+ }
11
+ if (typeof value !== 'string' || value.trim().length === 0) {
12
+ return undefined;
13
+ }
14
+ const parsed = Number.parseInt(value, 10);
15
+ if (!Number.isInteger(parsed) || !isMiniAppIconSize(parsed)) {
16
+ return undefined;
17
+ }
18
+ return parsed;
19
+ }
20
+ function buildMiniAppIconUrl(id, size = DEFAULT_MINIAPP_ICON_SIZE) {
21
+ const params = new URLSearchParams({ size: String(size) });
22
+ return `/api/miniapps/${encodeURIComponent(id)}/icon?${params.toString()}`;
23
+ }
24
+ export { DEFAULT_MINIAPP_ICON_SIZE, MINIAPP_ICON_CACHE_CONTROL, MINIAPP_ICON_SIZES, buildMiniAppIconUrl, parseMiniAppIconSize, };
25
+ //# sourceMappingURL=miniapp-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miniapp-icon.js","sourceRoot":"","sources":["../../src/services/miniapp-icon.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAU,CAAC;AAE7D,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAEtC,MAAM,0BAA0B,GAAG,sDAAsD,CAAC;AAI1F,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAQ,kBAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAC1B,EAAU,EACV,OAAwB,yBAAyB;IAEjD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,iBAAiB,kBAAkB,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { MiniAppManifest, MiniAppBackendActivation } from '@desktalk/sdk';
2
+ import type pino from 'pino';
3
+ /**
4
+ * MiniApp backend module — what a MiniApp's backend entry exports.
5
+ * Only manifest is used in the main process; the full module runs in a child.
6
+ */
7
+ export interface MiniAppBackendModule {
8
+ manifest: MiniAppManifest;
9
+ activate(ctx: unknown): MiniAppBackendActivation;
10
+ deactivate(): void;
11
+ }
12
+ /**
13
+ * Runtime entry for a registered MiniApp.
14
+ */
15
+ export interface MiniAppEntry {
16
+ manifest: MiniAppManifest;
17
+ packageRoot: string;
18
+ /** Resolved import specifier the child process can use to load the module. */
19
+ backendPath: string;
20
+ iconFilePath?: string;
21
+ }
22
+ /**
23
+ * Registry that manages MiniApp discovery, activation, and deactivation.
24
+ *
25
+ * Activation now spawns an isolated child process per MiniApp via the
26
+ * BackendProcessManager. The main process never runs backend code directly.
27
+ */
28
+ declare class MiniAppRegistry {
29
+ private entries;
30
+ private normalizeLaunchArgs;
31
+ /**
32
+ * Register a MiniApp module (built-in or third-party).
33
+ */
34
+ register(manifest: MiniAppManifest, packageRoot: string, backendPath: string): void;
35
+ /**
36
+ * Activate a MiniApp for a specific user — spawns an isolated child process.
37
+ * The process is keyed by `miniAppId:username` so each user gets their own
38
+ * backend instance with isolated data paths.
39
+ */
40
+ activate(id: string, username: string, options?: {
41
+ launchArgs?: Array<Record<string, unknown>>;
42
+ }): Promise<void>;
43
+ /**
44
+ * Deactivate a MiniApp for a specific user — stops its child process.
45
+ */
46
+ deactivate(id: string, username: string): Promise<void>;
47
+ /**
48
+ * Check if a MiniApp is activated for a specific user.
49
+ */
50
+ isActivated(id: string, username: string): boolean;
51
+ /**
52
+ * Get all registered manifests (for the Dock).
53
+ */
54
+ getManifests(): MiniAppManifest[];
55
+ /**
56
+ * Get a specific entry.
57
+ */
58
+ getEntry(id: string): MiniAppEntry | undefined;
59
+ /**
60
+ * Get all registered IDs.
61
+ */
62
+ getIds(): string[];
63
+ }
64
+ /**
65
+ * Singleton registry instance.
66
+ */
67
+ export declare const registry: MiniAppRegistry;
68
+ /**
69
+ * Register built-in MiniApps from their backend entries.
70
+ */
71
+ export declare function registerBuiltinMiniApps(logger?: pino.Logger): Promise<void>;
72
+ export {};
73
+ //# sourceMappingURL=miniapp-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miniapp-registry.d.ts","sourceRoot":"","sources":["../../src/services/miniapp-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAI/E,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAM7B;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAAC;IACjD,UAAU,IAAI,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA8BD;;;;;GAKG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,OAAO,CAAmC;IAElD,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAoBnF;;;;OAIG;IACG,QAAQ,CACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,GACxD,OAAO,CAAC,IAAI,CAAC;IAyBhB;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKlD;;OAEG;IACH,YAAY,IAAI,eAAe,EAAE;IAIjC;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9C;;OAEG;IACH,MAAM,IAAI,MAAM,EAAE;CAGnB;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,iBAAwB,CAAC;AAE9C;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjF"}