@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,119 @@
1
+ import { StringEnum } from '@mariozechner/pi-ai';
2
+ import { Type } from '@sinclair/typebox';
3
+ const appControlSchema = Type.Object({
4
+ action: StringEnum(['list', 'launch', 'quit']),
5
+ miniAppId: Type.Optional(Type.String({ description: 'MiniApp ID to launch or quit' })),
6
+ });
7
+ function stringify(data) {
8
+ return JSON.stringify(data, null, 2);
9
+ }
10
+ function requireValue(value, message) {
11
+ if (value === undefined || value === null || value === '') {
12
+ throw new Error(message);
13
+ }
14
+ return value;
15
+ }
16
+ export function createAppControlTool(options) {
17
+ const { windowManager, getMiniApps, activateMiniApp, deactivateMiniApp, isActivated, sendAiCommand, } = options;
18
+ return {
19
+ name: 'app_control',
20
+ label: 'App Control',
21
+ description: 'Manage DeskTalk MiniApp lifecycle: list all available apps with their status, launch an app, or quit an app (closes all its windows and deactivates it).',
22
+ promptSnippet: 'Manage MiniApp lifecycle — list installed apps, launch them, or quit running apps.',
23
+ promptGuidelines: [
24
+ 'Use action="list" to see all available apps and whether they are running.',
25
+ 'Use action="launch" to start a MiniApp — this activates it and opens a window.',
26
+ 'Use action="quit" to stop a MiniApp — this closes all its windows and deactivates it.',
27
+ 'Prefer app_control for app lifecycle; use window_control for spatial window operations (focus, minimize, maximize, move).',
28
+ ],
29
+ parameters: appControlSchema,
30
+ async execute(_toolCallId, params) {
31
+ const input = params;
32
+ switch (input.action) {
33
+ case 'list': {
34
+ const manifests = getMiniApps();
35
+ const windows = windowManager.getWindows();
36
+ const apps = manifests.map((manifest) => {
37
+ const appWindows = windows.filter((w) => w.miniAppId === manifest.id);
38
+ return {
39
+ id: manifest.id,
40
+ name: manifest.name,
41
+ activated: isActivated(manifest.id),
42
+ windowCount: appWindows.length,
43
+ windowIds: appWindows.map((w) => w.id),
44
+ };
45
+ });
46
+ const payload = { apps };
47
+ return {
48
+ content: [{ type: 'text', text: stringify(payload) }],
49
+ details: payload,
50
+ };
51
+ }
52
+ case 'launch': {
53
+ const miniAppId = requireValue(input.miniAppId, 'miniAppId is required for action="launch"');
54
+ const manifest = getMiniApps().find((m) => m.id === miniAppId);
55
+ if (!manifest) {
56
+ throw new Error(`Unknown MiniApp: ${miniAppId}`);
57
+ }
58
+ activateMiniApp(miniAppId);
59
+ const commandResult = await sendAiCommand({
60
+ action: 'open',
61
+ miniAppId,
62
+ title: manifest.name,
63
+ });
64
+ if (!commandResult.ok) {
65
+ throw new Error(commandResult.error ?? 'Failed to launch app');
66
+ }
67
+ const result = {
68
+ ok: true,
69
+ action: input.action,
70
+ miniAppId,
71
+ name: manifest.name,
72
+ windowId: commandResult.windowId,
73
+ };
74
+ return {
75
+ content: [{ type: 'text', text: stringify(result) }],
76
+ details: result,
77
+ };
78
+ }
79
+ case 'quit': {
80
+ const miniAppId = requireValue(input.miniAppId, 'miniAppId is required for action="quit"');
81
+ const manifest = getMiniApps().find((m) => m.id === miniAppId);
82
+ if (!manifest) {
83
+ throw new Error(`Unknown MiniApp: ${miniAppId}`);
84
+ }
85
+ // Close all windows belonging to this miniapp
86
+ const windows = windowManager.getWindows();
87
+ const appWindows = windows.filter((w) => w.miniAppId === miniAppId);
88
+ const closeResults = [];
89
+ for (const win of appWindows) {
90
+ const commandResult = await sendAiCommand({ action: 'close', windowId: win.id });
91
+ closeResults.push({
92
+ windowId: win.id,
93
+ ok: commandResult.ok,
94
+ error: commandResult.error,
95
+ });
96
+ }
97
+ // Deactivate the miniapp backend
98
+ deactivateMiniApp(miniAppId);
99
+ const failedCloses = closeResults.filter((r) => !r.ok);
100
+ const result = {
101
+ ok: failedCloses.length === 0,
102
+ action: input.action,
103
+ miniAppId,
104
+ name: manifest.name,
105
+ windowsClosed: closeResults.length,
106
+ ...(failedCloses.length > 0 ? { failedCloses } : {}),
107
+ };
108
+ return {
109
+ content: [{ type: 'text', text: stringify(result) }],
110
+ details: result,
111
+ };
112
+ }
113
+ default:
114
+ throw new Error(`Unsupported app action: ${String(input.action)}`);
115
+ }
116
+ },
117
+ };
118
+ }
119
+ //# sourceMappingURL=app-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-tools.js","sourceRoot":"","sources":["../../../src/services/ai/app-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type AiRole = 'system' | 'user' | 'assistant';
2
+ export interface AiMessage {
3
+ role: AiRole;
4
+ content: string;
5
+ }
6
+ export interface AiConfig {
7
+ provider: string;
8
+ model: string;
9
+ apiKey?: string;
10
+ baseUrl?: string;
11
+ maxTokens: number;
12
+ }
13
+ export interface AiUsage {
14
+ inputTokens?: number;
15
+ outputTokens?: number;
16
+ totalTokens?: number;
17
+ }
18
+ export interface AiResult {
19
+ text: string;
20
+ provider: string;
21
+ model: string;
22
+ usage?: AiUsage;
23
+ }
24
+ export declare class AiChatService {
25
+ chat(config: AiConfig, messages: AiMessage[]): Promise<AiResult>;
26
+ }
27
+ //# sourceMappingURL=chat-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-service.d.ts","sourceRoot":"","sources":["../../../src/services/ai/chat-service.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAgPD,qBAAa,aAAa;IAClB,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;CAkBvE"}
@@ -0,0 +1,213 @@
1
+ function resolveBaseUrl(provider, baseUrl) {
2
+ if (baseUrl)
3
+ return baseUrl.replace(/\/+$/, '');
4
+ switch (provider) {
5
+ case 'openai':
6
+ return 'https://api.openai.com/v1';
7
+ case 'xai':
8
+ return 'https://api.x.ai/v1';
9
+ case 'openrouter':
10
+ return 'https://openrouter.ai/api/v1';
11
+ case 'ollama':
12
+ return 'http://localhost:11434/v1';
13
+ case 'mistral':
14
+ return 'https://api.mistral.ai/v1';
15
+ case 'anthropic':
16
+ return 'https://api.anthropic.com/v1';
17
+ case 'google':
18
+ return 'https://generativelanguage.googleapis.com/v1beta';
19
+ default:
20
+ return '';
21
+ }
22
+ }
23
+ function requireModel(config) {
24
+ if (!config.model.trim()) {
25
+ throw new Error('No AI model configured. Set Preferences -> AI -> Model.');
26
+ }
27
+ }
28
+ function requireApiKey(config) {
29
+ if (config.provider !== 'ollama' && !config.apiKey?.trim()) {
30
+ throw new Error('No AI API key configured. Set Preferences -> AI -> API Key.');
31
+ }
32
+ }
33
+ function getTextContent(content) {
34
+ if (typeof content === 'string')
35
+ return content;
36
+ if (Array.isArray(content)) {
37
+ return content
38
+ .map((part) => {
39
+ if (typeof part === 'string')
40
+ return part;
41
+ if (part && typeof part === 'object' && 'text' in part && typeof part.text === 'string') {
42
+ return part.text;
43
+ }
44
+ return '';
45
+ })
46
+ .join('')
47
+ .trim();
48
+ }
49
+ return '';
50
+ }
51
+ async function chatOpenAICompatible(config, messages) {
52
+ requireModel(config);
53
+ requireApiKey(config);
54
+ const baseUrl = resolveBaseUrl(config.provider, config.baseUrl);
55
+ if (!baseUrl) {
56
+ throw new Error(`Unsupported AI provider: ${config.provider}`);
57
+ }
58
+ const headers = {
59
+ 'Content-Type': 'application/json',
60
+ };
61
+ if (config.apiKey?.trim()) {
62
+ headers.Authorization = `Bearer ${config.apiKey}`;
63
+ }
64
+ const response = await fetch(`${baseUrl}/chat/completions`, {
65
+ method: 'POST',
66
+ headers,
67
+ body: JSON.stringify({
68
+ model: config.model,
69
+ messages,
70
+ max_tokens: config.maxTokens,
71
+ }),
72
+ });
73
+ if (!response.ok) {
74
+ throw new Error(`${config.provider} API error (${response.status}): ${await response.text()}`);
75
+ }
76
+ const result = (await response.json());
77
+ const text = getTextContent(result.choices?.[0]?.message?.content).trim();
78
+ if (!text) {
79
+ throw new Error(`${config.provider} returned an empty response.`);
80
+ }
81
+ return {
82
+ text,
83
+ provider: config.provider,
84
+ model: config.model,
85
+ usage: {
86
+ inputTokens: result.usage?.prompt_tokens,
87
+ outputTokens: result.usage?.completion_tokens,
88
+ totalTokens: result.usage?.total_tokens,
89
+ },
90
+ };
91
+ }
92
+ async function chatAnthropic(config, messages) {
93
+ requireModel(config);
94
+ requireApiKey(config);
95
+ const baseUrl = resolveBaseUrl(config.provider, config.baseUrl);
96
+ const system = messages
97
+ .filter((message) => message.role === 'system')
98
+ .map((message) => message.content)
99
+ .join('\n\n')
100
+ .trim();
101
+ const anthropicMessages = messages
102
+ .filter((message) => message.role !== 'system')
103
+ .map((message) => ({ role: message.role, content: message.content }));
104
+ const response = await fetch(`${baseUrl}/messages`, {
105
+ method: 'POST',
106
+ headers: {
107
+ 'Content-Type': 'application/json',
108
+ 'x-api-key': config.apiKey,
109
+ 'anthropic-version': '2023-06-01',
110
+ },
111
+ body: JSON.stringify({
112
+ model: config.model,
113
+ max_tokens: config.maxTokens,
114
+ ...(system ? { system } : {}),
115
+ messages: anthropicMessages,
116
+ }),
117
+ });
118
+ if (!response.ok) {
119
+ throw new Error(`anthropic API error (${response.status}): ${await response.text()}`);
120
+ }
121
+ const result = (await response.json());
122
+ const text = (result.content ?? [])
123
+ .filter((part) => part.type === 'text' && typeof part.text === 'string')
124
+ .map((part) => part.text)
125
+ .join('')
126
+ .trim();
127
+ if (!text) {
128
+ throw new Error('anthropic returned an empty response.');
129
+ }
130
+ return {
131
+ text,
132
+ provider: config.provider,
133
+ model: config.model,
134
+ usage: {
135
+ inputTokens: result.usage?.input_tokens,
136
+ outputTokens: result.usage?.output_tokens,
137
+ totalTokens: (result.usage?.input_tokens ?? 0) + (result.usage?.output_tokens ?? 0) || undefined,
138
+ },
139
+ };
140
+ }
141
+ async function chatGoogle(config, messages) {
142
+ requireModel(config);
143
+ requireApiKey(config);
144
+ const baseUrl = resolveBaseUrl(config.provider, config.baseUrl);
145
+ const systemInstruction = messages
146
+ .filter((message) => message.role === 'system')
147
+ .map((message) => message.content)
148
+ .join('\n\n')
149
+ .trim();
150
+ const contents = messages
151
+ .filter((message) => message.role !== 'system')
152
+ .map((message) => ({
153
+ role: message.role === 'assistant' ? 'model' : 'user',
154
+ parts: [{ text: message.content }],
155
+ }));
156
+ const response = await fetch(`${baseUrl}/models/${encodeURIComponent(config.model)}:generateContent?key=${encodeURIComponent(config.apiKey)}`, {
157
+ method: 'POST',
158
+ headers: {
159
+ 'Content-Type': 'application/json',
160
+ },
161
+ body: JSON.stringify({
162
+ ...(systemInstruction
163
+ ? { systemInstruction: { parts: [{ text: systemInstruction }] } }
164
+ : {}),
165
+ contents,
166
+ generationConfig: {
167
+ maxOutputTokens: config.maxTokens,
168
+ },
169
+ }),
170
+ });
171
+ if (!response.ok) {
172
+ throw new Error(`google API error (${response.status}): ${await response.text()}`);
173
+ }
174
+ const result = (await response.json());
175
+ const text = (result.candidates?.[0]?.content?.parts ?? [])
176
+ .map((part) => part.text ?? '')
177
+ .join('')
178
+ .trim();
179
+ if (!text) {
180
+ throw new Error('google returned an empty response.');
181
+ }
182
+ return {
183
+ text,
184
+ provider: config.provider,
185
+ model: config.model,
186
+ usage: {
187
+ inputTokens: result.usageMetadata?.promptTokenCount,
188
+ outputTokens: result.usageMetadata?.candidatesTokenCount,
189
+ totalTokens: result.usageMetadata?.totalTokenCount,
190
+ },
191
+ };
192
+ }
193
+ export class AiChatService {
194
+ async chat(config, messages) {
195
+ switch (config.provider) {
196
+ case 'openai':
197
+ case 'xai':
198
+ case 'openrouter':
199
+ case 'ollama':
200
+ case 'mistral':
201
+ return chatOpenAICompatible(config, messages);
202
+ case 'anthropic':
203
+ return chatAnthropic(config, messages);
204
+ case 'google':
205
+ return chatGoogle(config, messages);
206
+ case 'bedrock':
207
+ throw new Error('Bedrock is not implemented yet in DeskTalk AI integration.');
208
+ default:
209
+ throw new Error(`Unsupported AI provider: ${config.provider}`);
210
+ }
211
+ }
212
+ }
213
+ //# sourceMappingURL=chat-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-service.js","sourceRoot":"","sources":["../../../src/services/ai/chat-service.ts"],"names":[],"mappings":"AA4BA,SAAS,cAAc,CAAC,QAAgB,EAAE,OAAgB;IACxD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEhD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,2BAA2B,CAAC;QACrC,KAAK,KAAK;YACR,OAAO,qBAAqB,CAAC;QAC/B,KAAK,YAAY;YACf,OAAO,8BAA8B,CAAC;QACxC,KAAK,QAAQ;YACX,OAAO,2BAA2B,CAAC;QACrC,KAAK,SAAS;YACZ,OAAO,2BAA2B,CAAC;QACrC,KAAK,WAAW;YACd,OAAO,8BAA8B,CAAC;QACxC,KAAK,QAAQ;YACX,OAAO,kDAAkD,CAAC;QAC5D;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB;IACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,MAAgB;IACrC,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAgB;IACtC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1C,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxF,OAAO,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC;aACR,IAAI,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,MAAgB,EAAE,QAAqB;IACzE,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ;YACR,UAAU,EAAE,MAAM,CAAC,SAAS;SAC7B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,eAAe,QAAQ,CAAC,MAAM,MAAM,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGpC,CAAC;IAEF,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,8BAA8B,CAAC,CAAC;IACpE,CAAC;IAED,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE;YACL,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa;YACxC,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,iBAAiB;YAC7C,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY;SACxC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAgB,EAAE,QAAqB;IAClE,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,QAAQ;SACpB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC9C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SACjC,IAAI,CAAC,MAAM,CAAC;SACZ,IAAI,EAAE,CAAC;IAEV,MAAM,iBAAiB,GAAG,QAAQ;SAC/B,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC9C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAExE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE;QAClD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,MAAM,CAAC,MAAO;YAC3B,mBAAmB,EAAE,YAAY;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,QAAQ,EAAE,iBAAiB;SAC5B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,MAAM,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGpC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;SACvE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,IAAI,CAAC,EAAE,CAAC;SACR,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE;YACL,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY;YACvC,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa;YACzC,WAAW,EACT,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC,IAAI,SAAS;SACtF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAgB,EAAE,QAAqB;IAC/D,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG,QAAQ;SAC/B,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC9C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SACjC,IAAI,CAAC,MAAM,CAAC;SACZ,IAAI,EAAE,CAAC;IAEV,MAAM,QAAQ,GAAG,QAAQ;SACtB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC9C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjB,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACrD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;KACnC,CAAC,CAAC,CAAC;IAEN,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,OAAO,WAAW,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,kBAAkB,CAAC,MAAM,CAAC,MAAO,CAAC,EAAE,EACjH;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,GAAG,CAAC,iBAAiB;gBACnB,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,EAAE;gBACjE,CAAC,CAAC,EAAE,CAAC;YACP,QAAQ;YACR,gBAAgB,EAAE;gBAChB,eAAe,EAAE,MAAM,CAAC,SAAS;aAClC;SACF,CAAC;KACH,CACF,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAOpC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;SACxD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;SAC9B,IAAI,CAAC,EAAE,CAAC;SACR,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE;YACL,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,gBAAgB;YACnD,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,oBAAoB;YACxD,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,eAAe;SACnD;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,IAAI,CAAC,MAAgB,EAAE,QAAqB;QAChD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,QAAQ,CAAC;YACd,KAAK,KAAK,CAAC;YACX,KAAK,YAAY,CAAC;YAClB,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAChD,KAAK,WAAW;gBACd,OAAO,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzC,KAAK,QAAQ;gBACX,OAAO,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACtC,KAAK,SAAS;gBACZ,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAChF;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { ToolDefinition } from '@mariozechner/pi-coding-agent';
2
+ import type { SendAiCommand } from './desktop-tool.js';
3
+ import type { HtmlStreamCoordinator } from './html-stream-coordinator.js';
4
+ type PreferenceValue = string | number | boolean;
5
+ type PreferenceReader = (key: string) => PreferenceValue | undefined | Promise<PreferenceValue | undefined>;
6
+ interface CreateLiveAppToolOptions {
7
+ sendAiCommand: SendAiCommand;
8
+ activateMiniApp: (miniAppId: string) => void;
9
+ getPreference: PreferenceReader;
10
+ /** Shared coordinator for streaming HTML content from toolcall_delta events. */
11
+ streamCoordinator: HtmlStreamCoordinator;
12
+ }
13
+ export declare function createLiveAppTool(options: CreateLiveAppToolOptions): ToolDefinition;
14
+ export {};
15
+ //# sourceMappingURL=create-liveapp-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-liveapp-tool.d.ts","sourceRoot":"","sources":["../../../src/services/ai/create-liveapp-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAOpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAcvE,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACjD,KAAK,gBAAgB,GAAG,CACtB,GAAG,EAAE,MAAM,KACR,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;AAExE,UAAU,wBAAwB;IAChC,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,gBAAgB,CAAC;IAChC,gFAAgF;IAChF,iBAAiB,EAAE,qBAAqB,CAAC;CAC1C;AAsDD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,cAAc,CAqGnF"}
@@ -0,0 +1,142 @@
1
+ import { Type } from '@sinclair/typebox';
2
+ import { broadcastEvent } from '../messaging.js';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { DEFAULT_THEME_PREFERENCES } from '@desktalk/ui/theme-css';
5
+ import { createHtmlBridgeScript } from './html-bridge-script.js';
6
+ import { createThemeLinkTag } from './html-theme-link.js';
7
+ import { UI_BUNDLE_SCRIPT_TAG } from './html-ui-script.js';
8
+ const createLiveAppSchema = Type.Object({
9
+ title: Type.String({ description: 'Window title for the generated LiveApp' }),
10
+ content: Type.String({
11
+ description: 'Complete HTML content for the LiveApp. Must be a self-contained HTML document.',
12
+ }),
13
+ });
14
+ let streamCounter = 0;
15
+ function nextStreamId() {
16
+ return `html-stream-${++streamCounter}-${Date.now()}`;
17
+ }
18
+ /**
19
+ * Read the current theme preferences from the preference store.
20
+ */
21
+ async function readThemePreferences(getPreference) {
22
+ const accentColor = await getPreference('general.accentColor');
23
+ const theme = await getPreference('general.theme');
24
+ return {
25
+ accentColor: typeof accentColor === 'string' && accentColor
26
+ ? accentColor
27
+ : DEFAULT_THEME_PREFERENCES.accentColor,
28
+ theme: theme === 'light' ? 'light' : DEFAULT_THEME_PREFERENCES.theme,
29
+ };
30
+ }
31
+ /**
32
+ * Inject the DeskTalk theme CSS `<link>` tag into AI-generated HTML.
33
+ *
34
+ * Strategy: insert a `<link>` right after the opening `<head>` tag.
35
+ * If there is no `<head>`, prepend it before the content.
36
+ */
37
+ function injectThemeIntoHtml(html, themePreferences) {
38
+ const themeLink = createThemeLinkTag(themePreferences.accentColor, themePreferences.theme);
39
+ // Try to inject after <head> or <head ...>
40
+ const headMatch = html.match(/<head(\s[^>]*)?>|<head>/i);
41
+ if (headMatch && headMatch.index !== undefined) {
42
+ const insertPos = headMatch.index + headMatch[0].length;
43
+ return html.slice(0, insertPos) + '\n' + themeLink + '\n' + html.slice(insertPos);
44
+ }
45
+ // No <head> tag found — prepend the link before the entire content
46
+ return themeLink + '\n' + html;
47
+ }
48
+ function injectIntoHtmlHead(html, snippet) {
49
+ const headMatch = html.match(/<head(\s[^>]*)?>|<head>/i);
50
+ if (headMatch && headMatch.index !== undefined) {
51
+ const insertPos = headMatch.index + headMatch[0].length;
52
+ return html.slice(0, insertPos) + '\n' + snippet + '\n' + html.slice(insertPos);
53
+ }
54
+ return snippet + '\n' + html;
55
+ }
56
+ export function createLiveAppTool(options) {
57
+ const { sendAiCommand, activateMiniApp, getPreference, streamCoordinator } = options;
58
+ return {
59
+ name: 'create_liveapp',
60
+ label: 'Create LiveApp',
61
+ description: 'Create a persistent LiveApp and display it in a Preview window. Use this when the user asks to show something visually — charts, diagrams, styled layouts, interactive widgets, dashboards, or tools.',
62
+ promptSnippet: 'Create and display a persistent LiveApp in a Preview window.',
63
+ promptGuidelines: [
64
+ 'Use this tool when the user asks you to show, visualize, display, or render something visually.',
65
+ 'Provide a complete, self-contained HTML document including <html>, <head>, and <body> tags.',
66
+ 'Follow DeskTalk HTML manual guidance for `<dt-card>` usage, layout rules, and pre-styled typography.',
67
+ 'Created LiveApps automatically receive a `window.DeskTalk` bridge for reading safe desktop state, persisting app data, and running constrained commands.',
68
+ 'Use `window.DeskTalk.storage` for persistent app data. Prefer KV storage for settings and `storage.collection(name)` for user-editable records such as tasks, rows, or bookmarks.',
69
+ 'Use `window.DeskTalk.request(url, options)` for external HTTP APIs instead of relying on plain browser `fetch()` across origins.',
70
+ 'The bridge also exposes `exec` / `execute` — both accept either a shell string (`window.DeskTalk.exec("ls -la")`) or explicit arguments (`window.DeskTalk.exec("ls", ["-la"])`).',
71
+ 'Call `read_manual` with pages such as `html/tokens`, `html/components`, `html/layouts`, `html/bridge`, `html/actions`, `html/storage`, or `html/examples` when you need the full DeskTalk reference.',
72
+ ],
73
+ parameters: createLiveAppSchema,
74
+ async execute(_toolCallId, params) {
75
+ const input = params;
76
+ // ── Streaming path ──────────────────────────────────────────────
77
+ // If the coordinator already streamed content via toolcall_delta,
78
+ // finalize the stream with any remaining content.
79
+ const activeSession = streamCoordinator.getActiveSession();
80
+ if (activeSession && activeSession.state === 'streaming' && activeSession.windowOpened) {
81
+ const session = await streamCoordinator.finalize(input.content);
82
+ if (session) {
83
+ const result = {
84
+ ok: true,
85
+ windowId: session.windowId,
86
+ title: input.title,
87
+ streamId: session.streamId,
88
+ contentLength: input.content.length,
89
+ streamed: true,
90
+ };
91
+ return {
92
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
93
+ details: result,
94
+ };
95
+ }
96
+ }
97
+ // ── Fallback: non-streaming path ────────────────────────────────
98
+ // Abort any partially-started session that didn't fully open.
99
+ streamCoordinator.abort();
100
+ const streamId = nextStreamId();
101
+ const bridgeToken = randomUUID();
102
+ // Read current theme preferences and inject into the HTML
103
+ const themePreferences = await readThemePreferences(getPreference);
104
+ const themedHtml = injectThemeIntoHtml(input.content, themePreferences);
105
+ const bridgedHtml = injectIntoHtmlHead(themedHtml, UI_BUNDLE_SCRIPT_TAG + '\n' + createHtmlBridgeScript(streamId, bridgeToken));
106
+ // Ensure the preview MiniApp is activated
107
+ activateMiniApp('preview');
108
+ // Open a Preview window in stream mode
109
+ const commandResult = await sendAiCommand({
110
+ action: 'open',
111
+ miniAppId: 'preview',
112
+ title: input.title,
113
+ args: { streamId, title: input.title, bridgeToken },
114
+ });
115
+ if (!commandResult.ok) {
116
+ throw new Error(commandResult.error ?? 'Failed to open Preview window');
117
+ }
118
+ // Small delay to let the frontend mount and register event listeners
119
+ await new Promise((resolve) => setTimeout(resolve, 100));
120
+ // Broadcast the themed HTML content as a single chunk
121
+ broadcastEvent('preview', 'preview.html-chunk', {
122
+ streamId,
123
+ chunk: bridgedHtml,
124
+ });
125
+ // Signal that streaming is complete
126
+ broadcastEvent('preview', 'preview.html-done', { streamId, html: input.content });
127
+ const result = {
128
+ ok: true,
129
+ windowId: commandResult.windowId,
130
+ title: input.title,
131
+ streamId,
132
+ contentLength: bridgedHtml.length,
133
+ streamed: false,
134
+ };
135
+ return {
136
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
137
+ details: result,
138
+ };
139
+ },
140
+ };
141
+ }
142
+ //# sourceMappingURL=create-liveapp-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-liveapp-tool.js","sourceRoot":"","sources":["../../../src/services/ai/create-liveapp-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ToolDefinition } from '@mariozechner/pi-coding-agent';
2
+ import type { MiniAppManifest } from '@desktalk/sdk';
3
+ import type { WindowManagerService } from '../window-manager.js';
4
+ export type SendAiCommand = (command: {
5
+ action: string;
6
+ windowId?: string;
7
+ miniAppId?: string;
8
+ title?: string;
9
+ args?: Record<string, unknown>;
10
+ }) => Promise<{
11
+ ok: boolean;
12
+ windowId?: string;
13
+ error?: string;
14
+ }>;
15
+ interface DesktopToolOptions {
16
+ windowManager: WindowManagerService;
17
+ getMiniApps: () => MiniAppManifest[];
18
+ getLiveApps: () => Array<{
19
+ id: string;
20
+ name: string;
21
+ }>;
22
+ activateMiniApp: (miniAppId: string) => void;
23
+ sendAiCommand: SendAiCommand;
24
+ }
25
+ export declare function createDesktopTool(options: DesktopToolOptions): ToolDefinition;
26
+ export {};
27
+ //# sourceMappingURL=desktop-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-tool.d.ts","sourceRoot":"","sources":["../../../src/services/ai/desktop-tool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,KAAK,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAoBlE,UAAU,kBAAkB;IAC1B,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,MAAM,eAAe,EAAE,CAAC;IACrC,WAAW,EAAE,MAAM,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,aAAa,CAAC;CAC9B;AAaD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,cAAc,CA0F7E"}