@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,144 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { dirname, join, normalize } from 'node:path';
4
+ import { resolveMiniAppPaths } from './workspace.js';
5
+ import { getStoredPreference } from './preferences.js';
6
+ import { processManager } from './backend-process-manager.js';
7
+ import { buildMiniAppIconUrl } from './miniapp-icon.js';
8
+ function resolveMetadataIconPath(packageRoot, iconFile) {
9
+ const normalized = normalize(iconFile);
10
+ const relative = normalized.replace(/\\/g, '/');
11
+ if (relative === '..' || relative.startsWith('../')) {
12
+ return undefined;
13
+ }
14
+ const resolved = join(packageRoot, normalized);
15
+ return existsSync(resolved) ? resolved : undefined;
16
+ }
17
+ function readMiniAppMetadata(packageRoot) {
18
+ const metadataPath = join(packageRoot, 'dist', 'meta.json');
19
+ if (!existsSync(metadataPath)) {
20
+ return {};
21
+ }
22
+ try {
23
+ return JSON.parse(readFileSync(metadataPath, 'utf8'));
24
+ }
25
+ catch {
26
+ return {};
27
+ }
28
+ }
29
+ /**
30
+ * Registry that manages MiniApp discovery, activation, and deactivation.
31
+ *
32
+ * Activation now spawns an isolated child process per MiniApp via the
33
+ * BackendProcessManager. The main process never runs backend code directly.
34
+ */
35
+ class MiniAppRegistry {
36
+ entries = new Map();
37
+ normalizeLaunchArgs(launchArgs) {
38
+ return Array.isArray(launchArgs) ? launchArgs : [];
39
+ }
40
+ /**
41
+ * Register a MiniApp module (built-in or third-party).
42
+ */
43
+ register(manifest, packageRoot, backendPath) {
44
+ if (this.entries.has(manifest.id)) {
45
+ throw new Error(`MiniApp already registered: ${manifest.id}`);
46
+ }
47
+ const metadata = readMiniAppMetadata(packageRoot);
48
+ const iconFilePath = typeof metadata.iconFile === 'string'
49
+ ? resolveMetadataIconPath(packageRoot, metadata.iconFile)
50
+ : undefined;
51
+ this.entries.set(manifest.id, {
52
+ manifest: {
53
+ ...manifest,
54
+ ...(iconFilePath ? { iconPng: buildMiniAppIconUrl(manifest.id) } : {}),
55
+ },
56
+ packageRoot,
57
+ backendPath,
58
+ iconFilePath,
59
+ });
60
+ }
61
+ /**
62
+ * Activate a MiniApp for a specific user — spawns an isolated child process.
63
+ * The process is keyed by `miniAppId:username` so each user gets their own
64
+ * backend instance with isolated data paths.
65
+ */
66
+ async activate(id, username, options) {
67
+ const entry = this.entries.get(id);
68
+ if (!entry) {
69
+ throw new Error(`MiniApp not found: ${id}`);
70
+ }
71
+ const processKey = `${id}:${username}`;
72
+ if (processManager.isRunning(processKey)) {
73
+ return;
74
+ }
75
+ const paths = resolveMiniAppPaths(id, username);
76
+ const locale = String(getStoredPreference('general.language') ?? 'en');
77
+ await processManager.spawn(processKey, entry.backendPath, entry.packageRoot, paths, locale, id, this.normalizeLaunchArgs(options?.launchArgs));
78
+ }
79
+ /**
80
+ * Deactivate a MiniApp for a specific user — stops its child process.
81
+ */
82
+ async deactivate(id, username) {
83
+ const processKey = `${id}:${username}`;
84
+ await processManager.kill(processKey);
85
+ }
86
+ /**
87
+ * Check if a MiniApp is activated for a specific user.
88
+ */
89
+ isActivated(id, username) {
90
+ const processKey = `${id}:${username}`;
91
+ return processManager.isRunning(processKey);
92
+ }
93
+ /**
94
+ * Get all registered manifests (for the Dock).
95
+ */
96
+ getManifests() {
97
+ return Array.from(this.entries.values()).map((e) => e.manifest);
98
+ }
99
+ /**
100
+ * Get a specific entry.
101
+ */
102
+ getEntry(id) {
103
+ return this.entries.get(id);
104
+ }
105
+ /**
106
+ * Get all registered IDs.
107
+ */
108
+ getIds() {
109
+ return Array.from(this.entries.keys());
110
+ }
111
+ }
112
+ /**
113
+ * Singleton registry instance.
114
+ */
115
+ export const registry = new MiniAppRegistry();
116
+ /**
117
+ * Register built-in MiniApps from their backend entries.
118
+ */
119
+ export async function registerBuiltinMiniApps(logger) {
120
+ // Built-in MiniApps are imported dynamically from their backend sub-path.
121
+ // During development, these resolve via pnpm workspace links.
122
+ const builtins = [
123
+ '@desktalk/miniapp-note/backend',
124
+ '@desktalk/miniapp-file-explorer/backend',
125
+ '@desktalk/miniapp-preference/backend',
126
+ '@desktalk/miniapp-preview/backend',
127
+ '@desktalk/miniapp-player/backend',
128
+ '@desktalk/miniapp-terminal/backend',
129
+ '@desktalk/miniapp-text-edit/backend',
130
+ ];
131
+ for (const specifier of builtins) {
132
+ try {
133
+ const mod = (await import(specifier));
134
+ const backendFile = fileURLToPath(import.meta.resolve(specifier));
135
+ const packageRoot = join(dirname(backendFile), '..');
136
+ registry.register(mod.manifest, packageRoot, specifier);
137
+ }
138
+ catch (err) {
139
+ // Built-in MiniApp not available yet — skip during early development
140
+ logger?.warn({ specifier, err: err.message }, 'could not load built-in MiniApp');
141
+ }
142
+ }
143
+ }
144
+ //# sourceMappingURL=miniapp-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miniapp-registry.js","sourceRoot":"","sources":["../../src/services/miniapp-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Writes AI and Voice provider settings chosen during onboarding into the
3
+ * preference storage file so they are immediately available to the core's
4
+ * preference reader and the Preference MiniApp.
5
+ *
6
+ * The file format matches what `ctx.storage.set('config', ...)` produces in
7
+ * the Preference MiniApp backend — a JSON object with a top-level `config`
8
+ * key containing the flat key-value map.
9
+ */
10
+ export interface AiOnboardingConfig {
11
+ defaultProvider: string;
12
+ providers: Array<{
13
+ provider: string;
14
+ apiKey?: string;
15
+ model?: string;
16
+ baseUrl?: string;
17
+ }>;
18
+ }
19
+ export interface VoiceOnboardingConfig {
20
+ defaultProvider: string;
21
+ providers: Array<{
22
+ provider: string;
23
+ apiKey?: string;
24
+ model?: string;
25
+ baseUrl?: string;
26
+ azureDeployment?: string;
27
+ azureApiVersion?: string;
28
+ }>;
29
+ }
30
+ /**
31
+ * Persist provider settings from onboarding into the user's preference.json.
32
+ *
33
+ * This is called immediately after `ensureUserHome()` so the `.storage`
34
+ * directory already exists.
35
+ */
36
+ export declare function saveOnboardingConfig(username: string, aiConfig?: AiOnboardingConfig, voiceConfig?: VoiceOnboardingConfig): void;
37
+ //# sourceMappingURL=onboarding-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-config.d.ts","sourceRoot":"","sources":["../../src/services/onboarding-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,kBAAkB,EAC7B,WAAW,CAAC,EAAE,qBAAqB,GAClC,IAAI,CA8DN"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Writes AI and Voice provider settings chosen during onboarding into the
3
+ * preference storage file so they are immediately available to the core's
4
+ * preference reader and the Preference MiniApp.
5
+ *
6
+ * The file format matches what `ctx.storage.set('config', ...)` produces in
7
+ * the Preference MiniApp backend — a JSON object with a top-level `config`
8
+ * key containing the flat key-value map.
9
+ */
10
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { getUserHomeDir } from './workspace.js';
13
+ /**
14
+ * Persist provider settings from onboarding into the user's preference.json.
15
+ *
16
+ * This is called immediately after `ensureUserHome()` so the `.storage`
17
+ * directory already exists.
18
+ */
19
+ export function saveOnboardingConfig(username, aiConfig, voiceConfig) {
20
+ if (!aiConfig && !voiceConfig)
21
+ return;
22
+ const storagePath = join(getUserHomeDir(username), '.storage', 'preference.json');
23
+ // Read existing store (may already contain defaults from a migration)
24
+ let store = {};
25
+ if (existsSync(storagePath)) {
26
+ try {
27
+ store = JSON.parse(readFileSync(storagePath, 'utf-8'));
28
+ }
29
+ catch {
30
+ // Corrupt or empty file — start fresh
31
+ }
32
+ }
33
+ const config = store.config ?? {};
34
+ if (aiConfig) {
35
+ const enabledProviders = aiConfig.providers.map((provider) => provider.provider).join(',');
36
+ config['ai.enabledProviders'] = enabledProviders;
37
+ config['ai.defaultProvider'] = aiConfig.defaultProvider;
38
+ for (const provider of aiConfig.providers) {
39
+ if (provider.apiKey) {
40
+ config[`ai.providers.${provider.provider}.apiKey`] = provider.apiKey;
41
+ }
42
+ if (provider.model) {
43
+ config[`ai.providers.${provider.provider}.model`] = provider.model;
44
+ }
45
+ if (provider.baseUrl) {
46
+ config[`ai.providers.${provider.provider}.baseUrl`] = provider.baseUrl;
47
+ }
48
+ }
49
+ }
50
+ if (voiceConfig) {
51
+ config['voice.enabledProviders'] = voiceConfig.providers
52
+ .map((provider) => provider.provider)
53
+ .join(',');
54
+ config['voice.defaultProvider'] = voiceConfig.defaultProvider;
55
+ for (const provider of voiceConfig.providers) {
56
+ if (provider.apiKey) {
57
+ config[`voice.providers.${provider.provider}.apiKey`] = provider.apiKey;
58
+ }
59
+ if (provider.model) {
60
+ config[`voice.providers.${provider.provider}.model`] = provider.model;
61
+ }
62
+ if (provider.baseUrl) {
63
+ config[`voice.providers.${provider.provider}.baseUrl`] = provider.baseUrl;
64
+ }
65
+ if (provider.azureDeployment) {
66
+ config[`voice.providers.${provider.provider}.azureDeployment`] = provider.azureDeployment;
67
+ }
68
+ if (provider.azureApiVersion) {
69
+ config[`voice.providers.${provider.provider}.azureApiVersion`] = provider.azureApiVersion;
70
+ }
71
+ }
72
+ }
73
+ store.config = config;
74
+ writeFileSync(storagePath, JSON.stringify(store, null, 2), 'utf-8');
75
+ }
76
+ //# sourceMappingURL=onboarding-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-config.js","sourceRoot":"","sources":["../../src/services/onboarding-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ type PreferenceValue = string | number | boolean;
2
+ /**
3
+ * Set the active user for preference reads.
4
+ * Called when a WebSocket user authenticates.
5
+ */
6
+ export declare function setPreferenceUser(username: string): void;
7
+ export declare function getStoredPreference(key: string): PreferenceValue | undefined;
8
+ export declare function getStoredPreferenceForUser(username: string, key: string): PreferenceValue | undefined;
9
+ export {};
10
+ //# sourceMappingURL=preferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../../src/services/preferences.ts"],"names":[],"mappings":"AAIA,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AASjD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAExD;AAkCD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE5E;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,eAAe,GAAG,SAAS,CAE7B"}
@@ -0,0 +1,48 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { getWorkspacePaths, getUserHomeDir } from './workspace.js';
4
+ /** The username whose preferences should be read. Defaults to 'admin'. */
5
+ let currentPreferenceUser = 'admin';
6
+ /**
7
+ * Set the active user for preference reads.
8
+ * Called when a WebSocket user authenticates.
9
+ */
10
+ export function setPreferenceUser(username) {
11
+ currentPreferenceUser = username;
12
+ }
13
+ function readPreferenceStoreForUser(username) {
14
+ const workspace = getWorkspacePaths();
15
+ // Try the per-user path first
16
+ const userPath = join(getUserHomeDir(username), '.storage', 'preference.json');
17
+ if (existsSync(userPath)) {
18
+ try {
19
+ const parsed = JSON.parse(readFileSync(userPath, 'utf-8'));
20
+ return parsed.config ?? {};
21
+ }
22
+ catch {
23
+ // Fall through to legacy path
24
+ }
25
+ }
26
+ // Fallback to legacy global path (pre-migration)
27
+ const legacyPath = join(workspace.data, 'storage', 'preference.json');
28
+ if (!existsSync(legacyPath)) {
29
+ return {};
30
+ }
31
+ try {
32
+ const parsed = JSON.parse(readFileSync(legacyPath, 'utf-8'));
33
+ return parsed.config ?? {};
34
+ }
35
+ catch {
36
+ return {};
37
+ }
38
+ }
39
+ function readPreferenceStore() {
40
+ return readPreferenceStoreForUser(currentPreferenceUser);
41
+ }
42
+ export function getStoredPreference(key) {
43
+ return readPreferenceStore()[key];
44
+ }
45
+ export function getStoredPreferenceForUser(username, key) {
46
+ return readPreferenceStoreForUser(username)[key];
47
+ }
48
+ //# sourceMappingURL=preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../src/services/preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQhE,0EAA0E;AAC1E,IAAI,qBAAqB,GAAG,OAAO,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,qBAAqB,GAAG,QAAQ,CAAC;AACnC,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAgB;IAClD,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IAEtC,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC/E,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAwB,CAAC;YAClF,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACtE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAwB,CAAC;QACpF,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAgB,EAChB,GAAW;IAEX,OAAO,0BAA0B,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Global proxy dispatcher for Node.js fetch().
3
+ *
4
+ * When HTTP_PROXY / HTTPS_PROXY (or their lowercase variants) are set in the
5
+ * environment, this module installs an undici `EnvHttpProxyAgent` as the
6
+ * global dispatcher so that **every** `fetch()` call in the process
7
+ * automatically routes through the configured proxy.
8
+ *
9
+ * `EnvHttpProxyAgent` honours the standard env vars:
10
+ * HTTP_PROXY / http_proxy
11
+ * HTTPS_PROXY / https_proxy
12
+ * NO_PROXY / no_proxy
13
+ *
14
+ * Call `initGlobalProxyDispatcher()` once, early in the process lifecycle
15
+ * (before any outbound HTTP traffic), e.g. in the CLI start command.
16
+ */
17
+ export declare function initGlobalProxyDispatcher(): void;
18
+ //# sourceMappingURL=proxy-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-dispatcher.d.ts","sourceRoot":"","sources":["../../src/services/proxy-dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,wBAAgB,yBAAyB,IAAI,IAAI,CAehD"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Global proxy dispatcher for Node.js fetch().
3
+ *
4
+ * When HTTP_PROXY / HTTPS_PROXY (or their lowercase variants) are set in the
5
+ * environment, this module installs an undici `EnvHttpProxyAgent` as the
6
+ * global dispatcher so that **every** `fetch()` call in the process
7
+ * automatically routes through the configured proxy.
8
+ *
9
+ * `EnvHttpProxyAgent` honours the standard env vars:
10
+ * HTTP_PROXY / http_proxy
11
+ * HTTPS_PROXY / https_proxy
12
+ * NO_PROXY / no_proxy
13
+ *
14
+ * Call `initGlobalProxyDispatcher()` once, early in the process lifecycle
15
+ * (before any outbound HTTP traffic), e.g. in the CLI start command.
16
+ */
17
+ import { EnvHttpProxyAgent, setGlobalDispatcher } from 'undici';
18
+ let initialized = false;
19
+ export function initGlobalProxyDispatcher() {
20
+ if (initialized)
21
+ return;
22
+ initialized = true;
23
+ const proxyUrl = process.env.HTTPS_PROXY ??
24
+ process.env.https_proxy ??
25
+ process.env.HTTP_PROXY ??
26
+ process.env.http_proxy;
27
+ if (!proxyUrl)
28
+ return;
29
+ // EnvHttpProxyAgent reads HTTP(S)_PROXY and NO_PROXY from process.env
30
+ // internally, so we don't need to pass the URL explicitly.
31
+ setGlobalDispatcher(new EnvHttpProxyAgent());
32
+ }
33
+ //# sourceMappingURL=proxy-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-dispatcher.js","sourceRoot":"","sources":["../../src/services/proxy-dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAEhE,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,UAAU,yBAAyB;IACvC,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IAEnB,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAEzB,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,sEAAsE;IACtE,2DAA2D;IAC3D,mBAAmB,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { StorageHook } from '@desktalk/sdk';
2
+ /**
3
+ * Creates a scoped key-value storage hook for a MiniApp.
4
+ * Data is persisted as a JSON file at the given path.
5
+ */
6
+ export declare function createStorageHook(storagePath: string): StorageHook;
7
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/services/storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAyDlE"}
@@ -0,0 +1,55 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ /**
3
+ * Creates a scoped key-value storage hook for a MiniApp.
4
+ * Data is persisted as a JSON file at the given path.
5
+ */
6
+ export function createStorageHook(storagePath) {
7
+ function readStore() {
8
+ if (!existsSync(storagePath)) {
9
+ return {};
10
+ }
11
+ try {
12
+ const raw = readFileSync(storagePath, 'utf-8');
13
+ return JSON.parse(raw);
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ }
19
+ function writeStore(store) {
20
+ writeFileSync(storagePath, JSON.stringify(store, null, 2), 'utf-8');
21
+ }
22
+ return {
23
+ async get(key) {
24
+ const store = readStore();
25
+ return store[key];
26
+ },
27
+ async set(key, value) {
28
+ const store = readStore();
29
+ store[key] = value;
30
+ writeStore(store);
31
+ },
32
+ async delete(key) {
33
+ const store = readStore();
34
+ delete store[key];
35
+ writeStore(store);
36
+ },
37
+ async list() {
38
+ const store = readStore();
39
+ return Object.keys(store);
40
+ },
41
+ async query(options) {
42
+ const store = readStore();
43
+ let entries = Object.entries(store);
44
+ if (options.prefix) {
45
+ entries = entries.filter(([key]) => key.startsWith(options.prefix));
46
+ }
47
+ let values = entries.map(([, value]) => value);
48
+ if (options.filter) {
49
+ values = values.filter(options.filter);
50
+ }
51
+ return values;
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/services/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGlE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,SAAS,SAAS;QAChB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,SAAS,UAAU,CAAC,KAA8B;QAChD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,KAAK,CAAC,GAAG,CAAI,GAAW;YACtB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,GAAG,CAAkB,CAAC;QACrC,CAAC;QAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ;YAChC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACnB,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,GAAW;YACtB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,IAAI;YACR,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,KAAK,CAAI,OAAwD;YACrE,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAEpC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,MAAO,CAAC,CAAC,CAAC;YACvE,CAAC;YAED,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAU,CAAC,CAAC;YAEpD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type ThemeMode = 'light' | 'dark';
2
+ export interface ThemePreferences {
3
+ accentColor: string;
4
+ theme: ThemeMode;
5
+ }
6
+ export declare const DEFAULT_THEME_PREFERENCES: ThemePreferences;
7
+ /**
8
+ * Generate the full `:root { --dt-* }` CSS text for the given theme preferences.
9
+ *
10
+ * This is the single source of truth for the DeskTalk color system.
11
+ */
12
+ export declare function generateThemeCSS(preferences: ThemePreferences): string;
13
+ /**
14
+ * Base stylesheet for AI-generated HTML.
15
+ *
16
+ * Provides sensible defaults for body, headings, tables, cards, buttons, and
17
+ * code blocks — all using semantic `--dt-*` tokens. This ensures generated HTML
18
+ * looks native to DeskTalk without the AI needing to emit its own reset/base styles.
19
+ */
20
+ export declare const HTML_BASE_STYLESHEET: string;
21
+ //# sourceMappingURL=theme-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-css.d.ts","sourceRoot":"","sources":["../../src/services/theme-css.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;CAClB;AA6BD,eAAO,MAAM,yBAAyB,EAAE,gBAGvC,CAAC;AA0CF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM,CA4EtE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QA4EzB,CAAC"}