@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 @@
1
+ @charset "UTF-8";._dockIcon_1xw56_1{display:flex;width:48px;height:48px;align-items:center;justify-content:center;font-size:20px;transition:box-shadow .2s ease,transform .2s ease,border-color .2s ease}._dockIconImage_1xw56_11{width:100%;height:100%;border-radius:inherit;object-fit:cover;display:block}._panel_uttta_1{position:fixed;z-index:10050;display:grid;grid-template-columns:repeat(auto-fill,100px);gap:8px;min-width:340px;max-width:580px;padding:16px;border:1px solid var(--dt-glass-border);border-radius:8px;background:var(--dt-dock-bg);backdrop-filter:blur(20px) saturate(160%);-webkit-backdrop-filter:blur(20px) saturate(160%);box-shadow:0 8px 28px var(--dt-shadow-color),0 1px 0 var(--dt-glass-highlight) inset,0 0 0 1px oklch(from var(--dt-accent) l c h/.3),0 0 6px 1px oklch(from var(--dt-accent) l c h/.15)}._empty_uttta_18{grid-column:1/-1;padding:12px 8px;color:var(--dt-text-muted);font-size:12px}._item_uttta_25{display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 8px;border:0;border-radius:8px;background:transparent;color:var(--dt-text);cursor:pointer;font-family:inherit;font-size:12px;text-align:center;transition:background .12s ease}._item_uttta_25:hover{background:var(--dt-accent-ghost)}._icon_uttta_45{width:48px;height:48px;flex-shrink:0;font-size:28px}._label_uttta_52{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}._actionsBar_1otoq_2{display:flex;align-items:center;gap:6px;height:100%;padding:0 12px;overflow:visible;background:var(--dt-actions-bar-bg);border-bottom:1px solid color-mix(in oklab,var(--dt-accent) 40%,transparent);color:var(--dt-text);font-size:13px;position:relative;z-index:10000}._launcherWrapper_1otoq_18{position:relative}._appName_1otoq_22{margin-right:12px;padding:4px 10px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--dt-text);cursor:pointer;font-family:inherit;font-size:13px;font-weight:700;white-space:nowrap;transition:background .15s ease,border-color .15s ease}._appName_1otoq_22:hover{background:color-mix(in oklab,var(--dt-surface) 64%,transparent);border-color:var(--dt-border-subtle)}._appNameActive_1otoq_41{background:color-mix(in oklab,var(--dt-surface) 80%,transparent);border-color:var(--dt-border)}._splitToggle_1otoq_47{display:flex;align-items:center;justify-content:center;width:26px;height:26px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--dt-text);cursor:pointer;opacity:.72;transition:background .15s ease,border-color .15s ease,color .15s ease,opacity .15s ease}._splitToggle_1otoq_47:hover{background:color-mix(in oklab,var(--dt-surface) 64%,transparent);border-color:var(--dt-border-subtle);opacity:1}._splitToggleActive_1otoq_68{border-color:color-mix(in oklab,var(--dt-accent) 50%,transparent);color:var(--dt-accent);opacity:1}._splitToggleActive_1otoq_68:hover{background:var(--dt-accent-ghost);border-color:var(--dt-accent)}._separator_1otoq_79{width:1px;height:16px;margin:0 6px;background:var(--dt-border-subtle)}._action_1otoq_2{padding:4px 10px;border:1px solid var(--dt-border);border-radius:12px;background:color-mix(in oklab,var(--dt-surface) 64%,transparent);color:var(--dt-text);cursor:pointer;font-family:inherit;font-size:12px;white-space:nowrap;transition:background .15s ease,border-color .15s ease,color .15s ease}._action_1otoq_2:hover{border-color:var(--dt-accent);background:var(--dt-accent-ghost);color:var(--dt-accent)}._glowing_1otoq_104{animation:_accent-pulse_1otoq_1 1.2s ease-out}@keyframes _accent-pulse_1otoq_1{0%{border-color:var(--dt-accent)}to{border-color:var(--dt-border)}}._builtinAction_1otoq_116{opacity:.92}._builtinAction_1otoq_116:hover{opacity:1}._overlay_196os_1{position:absolute;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;padding:24px;background:color-mix(in srgb,var(--dt-bg) 58%,transparent);backdrop-filter:blur(10px) saturate(.84)}._card_196os_13{display:flex;flex-direction:column;align-items:center;gap:12px;min-width:min(320px,100vw - 48px);padding:24px 28px;border:1px solid color-mix(in srgb,var(--dt-border) 88%,transparent);border-radius:18px;background:color-mix(in srgb,var(--dt-surface) 84%,transparent);box-shadow:0 20px 48px color-mix(in srgb,var(--dt-bg) 55%,transparent);text-align:center}._spinner_196os_27{width:28px;height:28px;border:3px solid color-mix(in srgb,var(--dt-border) 75%,transparent);border-top-color:var(--dt-accent);border-radius:999px;animation:_spin_196os_27 .9s linear infinite}._title_196os_36{color:var(--dt-text);font-size:18px;font-weight:600}._subtitle_196os_42{color:var(--dt-text-muted);font-size:13px;line-height:1.5;max-width:32ch}@keyframes _spin_196os_27{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._resizer_z2l6k_1{z-index:10;display:flex;align-items:center;justify-content:center;min-width:0;min-height:0;background:transparent}._horizontal_z2l6k_11{cursor:col-resize;flex-direction:row;width:100%;height:100%}._vertical_z2l6k_18{cursor:row-resize;flex-direction:column;width:100%;height:100%}._bar_z2l6k_25{border-radius:1px;opacity:.22;transition:opacity .15s ease,background-color .15s ease}._horizontal_z2l6k_11 ._bar_z2l6k_25{width:2px;height:100%;background:var(--dt-accent)}._vertical_z2l6k_18 ._bar_z2l6k_25{width:100%;height:2px;background:var(--dt-accent)}._resizer_z2l6k_1:hover ._bar_z2l6k_25,._resizer_z2l6k_1:active ._bar_z2l6k_25{opacity:.72}._overlay_19iyv_1{position:absolute;inset:0;z-index:15;pointer-events:none}._tileZone_19iyv_8{position:absolute;pointer-events:all}._highlight_19iyv_13{position:absolute;background:color-mix(in oklab,var(--dt-accent) 20%,transparent);border:2px dashed var(--dt-accent);border-radius:2px;transition:left .1s ease,top .1s ease,right .1s ease,bottom .1s ease,width .1s ease,height .1s ease;pointer-events:none}@keyframes sd-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes sd-blurIn{0%{opacity:0;filter:blur(4px)}to{opacity:1;filter:blur(0)}}@keyframes sd-slideUp{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}[data-sd-animate]{animation:var(--sd-animation, sd-fadeIn) var(--sd-duration, .15s) var(--sd-easing, ease) both}._thinkingBlock_x27ux_1{margin-bottom:8px;border:1px dashed color-mix(in oklab,var(--dt-border) 60%,transparent);border-radius:6px;background:color-mix(in oklab,var(--dt-surface) 30%,var(--dt-bg));overflow:hidden}._thinkingToggle_x27ux_9{display:flex;align-items:center;gap:6px;width:100%;padding:6px 0;border:none;background:none;color:var(--dt-text-muted);font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.03em;cursor:pointer;user-select:none}._thinkingChevron_x27ux_26{display:inline-block;font-size:10px;transition:transform .15s ease;transform:rotate(0)}._thinkingChevronOpen_x27ux_33{transform:rotate(90deg)}._thinkingContent_x27ux_37{padding:6px 10px 8px;border-top:1px dashed color-mix(in oklab,var(--dt-border) 40%,transparent);font-family:var(--font-mono);font-size:11px;line-height:1.4;color:var(--dt-text-muted);max-height:300px;overflow-y:auto;word-break:break-word}._thinkingContent_x27ux_37>:first-child{margin-top:0}._thinkingContent_x27ux_37>:last-child{margin-bottom:0}._thinkingContent_x27ux_37 p,._thinkingContent_x27ux_37 ul,._thinkingContent_x27ux_37 ol,._thinkingContent_x27ux_37 pre,._thinkingContent_x27ux_37 blockquote,._thinkingContent_x27ux_37 table,._thinkingContent_x27ux_37 h1,._thinkingContent_x27ux_37 h2,._thinkingContent_x27ux_37 h3,._thinkingContent_x27ux_37 h4,._thinkingContent_x27ux_37 h5,._thinkingContent_x27ux_37 h6{margin:0 0 .75em}._thinkingContent_x27ux_37 ul,._thinkingContent_x27ux_37 ol{padding-left:1.25em}._thinkingContent_x27ux_37 li+li{margin-top:.25em}._thinkingContent_x27ux_37 code{padding:.15em .4em;border-radius:6px;background:color-mix(in oklab,var(--dt-bg) 85%,transparent);font-family:var(--font-mono);font-size:.92em}._thinkingContent_x27ux_37 pre{overflow-x:auto;padding:.8em .95em;border:1px solid var(--dt-border-subtle);border-radius:12px;background:color-mix(in oklab,var(--dt-bg) 92%,transparent)}._thinkingContent_x27ux_37 pre code{padding:0;background:transparent}._thinkingContent_x27ux_37 blockquote{padding-left:.9em;border-left:3px solid var(--dt-border-subtle);color:var(--dt-text-secondary)}._thinkingContent_x27ux_37 a{color:var(--dt-accent);text-decoration:underline;text-underline-offset:.16em}._thinkingContent_x27ux_37 table{width:100%;border-collapse:collapse}._thinkingContent_x27ux_37 th,._thinkingContent_x27ux_37 td{padding:.45em .55em;border:1px solid var(--dt-border-subtle);text-align:left}._thinkingContent_x27ux_37 hr{margin:.9em 0;border:0;border-top:1px solid var(--dt-border-subtle)}._thinkingStreamingDot_x27ux_119{display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--dt-text-muted);animation:_thinkingBounce_x27ux_1 1.4s ease-in-out infinite;vertical-align:middle;margin-left:4px}@keyframes _thinkingBounce_x27ux_1{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}._message_100r6_1{padding:12px 16px;font-family:var(--font-mono);font-size:12px;line-height:1.3;color:color-mix(in oklab,var(--dt-text) 85%,var(--dt-text-secondary))}._messageUser_100r6_9{background:color-mix(in oklab,var(--dt-accent) 8%,var(--dt-bg));border-left:3px solid color-mix(in oklab,var(--dt-accent) 75%,var(--dt-border))}._messageAssistant_100r6_15{background:color-mix(in oklab,var(--dt-info) 6%,var(--dt-bg));border-left:3px solid color-mix(in oklab,var(--dt-info) 75%,var(--dt-border))}._messageToolCall_100r6_21{display:flex;align-items:center;gap:6px;padding:4px 16px;font-family:var(--font-mono);font-size:11px;line-height:1.4;color:var(--dt-text-muted);background:color-mix(in oklab,var(--dt-surface) 40%,var(--dt-bg));border-left:3px solid color-mix(in oklab,var(--dt-text-secondary) 55%,var(--dt-bg))}._toolCallLabel_100r6_34{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._messageHeader_100r6_40{display:flex;align-items:center;gap:8px;margin-bottom:8px}._messageSpeaker_100r6_47{font-weight:700;font-size:12px;letter-spacing:.05em}._messageUser_100r6_9 ._messageSpeaker_100r6_47{color:color-mix(in oklab,var(--dt-accent) 70%,var(--dt-text))}._messageAssistant_100r6_15 ._messageSpeaker_100r6_47{color:color-mix(in oklab,var(--dt-info) 70%,var(--dt-text))}._voiceSourceBadge_100r6_61{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;background:var(--dt-surface);color:var(--dt-text-muted);font-size:10px;font-weight:600;letter-spacing:.03em;text-transform:lowercase;font-family:var(--font-mono)}._markdownContent_100r6_75{word-break:break-word}._markdownContent_100r6_75>:first-child{margin-top:0}._markdownContent_100r6_75>:last-child{margin-bottom:0}._markdownContent_100r6_75 p,._markdownContent_100r6_75 ul,._markdownContent_100r6_75 ol,._markdownContent_100r6_75 pre,._markdownContent_100r6_75 blockquote,._markdownContent_100r6_75 table,._markdownContent_100r6_75 h1,._markdownContent_100r6_75 h2,._markdownContent_100r6_75 h3,._markdownContent_100r6_75 h4,._markdownContent_100r6_75 h5,._markdownContent_100r6_75 h6{margin:0 0 .75em}._markdownContent_100r6_75 ul,._markdownContent_100r6_75 ol{padding-left:1.25em}._markdownContent_100r6_75 li+li{margin-top:.25em}._markdownContent_100r6_75 code{padding:.15em .4em;border-radius:6px;background:color-mix(in oklab,var(--dt-bg) 85%,transparent);font-family:var(--font-mono);font-size:.92em}._markdownContent_100r6_75 pre{overflow-x:auto;padding:.8em .95em;border:1px solid var(--dt-border-subtle);border-radius:12px;background:color-mix(in oklab,var(--dt-bg) 92%,transparent)}._markdownContent_100r6_75 pre code{padding:0;background:transparent}._markdownContent_100r6_75 blockquote{padding-left:.9em;border-left:3px solid var(--dt-accent-subtle);color:var(--dt-text-secondary)}._markdownContent_100r6_75 a{color:var(--dt-accent);text-decoration:underline;text-underline-offset:.16em}._markdownContent_100r6_75 table{width:100%;border-collapse:collapse;font-size:12px}._markdownContent_100r6_75 th,._markdownContent_100r6_75 td{padding:.45em .55em;border:1px solid var(--dt-border-subtle);text-align:left}._markdownContent_100r6_75 hr{margin:.9em 0;border:0;border-top:1px solid var(--dt-border-subtle)}._thinkingIndicator_100r6_150{display:flex;align-items:center;gap:4px;padding:4px 0}._thinkingDot_100r6_157{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--dt-text-muted);animation:_thinkingBounce_100r6_1 1.4s ease-in-out infinite}._thinkingDot_100r6_157:nth-child(2){animation-delay:.2s}._thinkingDot_100r6_157:nth-child(3){animation-delay:.4s}@keyframes _thinkingBounce_100r6_1{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}._controlFrame_1mi1b_2{position:relative;border-top:1px solid var(--dt-border-subtle);background:var(--dt-bg)}._slashMenu_1mi1b_9{position:absolute;bottom:100%;left:0;right:0;margin:0;padding:4px;list-style:none;background:var(--dt-surface);border:1px solid var(--dt-border);border-bottom:none;border-radius:8px 8px 0 0;box-shadow:0 -4px 16px #0000001f;font-family:var(--font-mono);font-size:13px;z-index:10}._slashMenuItem_1mi1b_27{display:flex;align-items:baseline;gap:10px;padding:6px 10px;border-radius:6px;cursor:pointer;transition:background .1s}._slashMenuItemActive_1mi1b_37{background:var(--dt-accent-ghost)}._slashMenuName_1mi1b_41{color:var(--dt-accent);font-weight:600;white-space:nowrap}._slashMenuDesc_1mi1b_47{color:var(--dt-text-muted);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._inputRow_1mi1b_55{display:flex;align-items:flex-end;gap:8px;padding:12px 16px}._input_1mi1b_55{flex:1;padding:8px 0;border:none;border-bottom:2px solid var(--dt-border);border-radius:0;outline:none;background:transparent;color:var(--dt-text);font-family:var(--font-mono);font-size:14px;line-height:1.4;resize:none;transition:border-color .2s}._input_1mi1b_55::placeholder{color:var(--dt-text-muted)}._input_1mi1b_55:focus{border-color:var(--dt-accent)}._input_1mi1b_55:disabled{opacity:.6;cursor:not-allowed}._statusRow_1mi1b_88{display:flex;align-items:center;gap:12px;padding:6px 16px 8px;border-top:1px solid var(--dt-border-subtle);background:var(--dt-bg-subtle);font-family:var(--font-mono);font-size:11px}._statusItem_1mi1b_99{color:var(--dt-text-muted)}._statusDivider_1mi1b_103{color:var(--dt-border);user-select:none}._voiceButton_1mi1b_108{display:flex;width:36px;height:36px;flex-shrink:0;align-items:center;justify-content:center;border:1px solid var(--dt-border);border-radius:4px;background:var(--dt-surface);color:var(--dt-text-secondary);cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease}._voiceButton_1mi1b_108:hover{border-color:var(--dt-accent);background:var(--dt-accent-ghost);color:var(--dt-accent)}._voiceButtonActive_1mi1b_128{background:var(--dt-danger-subtle);border-color:var(--dt-danger);color:var(--dt-danger)}._voiceButtonActive_1mi1b_128:hover{background:color-mix(in oklab,var(--dt-danger) 15%,var(--dt-surface));border-color:var(--dt-danger);color:var(--dt-danger)}@keyframes _voicePulse_1mi1b_1{0%,to{box-shadow:0 0 color-mix(in oklab,var(--dt-danger) 22%,transparent)}50%{box-shadow:0 0 0 6px color-mix(in oklab,var(--dt-danger) 0%,transparent)}}._infoPanel_1fshd_1{display:flex;height:100%;flex-direction:column;overflow:hidden;border-left:1px solid var(--dt-border-subtle);background:color-mix(in oklab,var(--dt-info-panel-bg) 88%,transparent);backdrop-filter:blur(20px) saturate(160%);-webkit-backdrop-filter:blur(20px) saturate(160%)}._header_1fshd_12{display:flex;align-items:center;justify-content:space-between;padding:10px 8px;border-bottom:1px solid var(--dt-border-subtle);background:var(--dt-bg-subtle);color:var(--dt-text);font-family:var(--font-mono);font-size:12px;font-weight:700;letter-spacing:.05em;text-transform:uppercase}._headerPrimary_1fshd_27{position:relative;display:flex;flex:1;min-width:0;align-items:center;gap:12px}._sessionControls_1fshd_36{position:relative;display:flex;flex:1;min-width:0;align-items:center;gap:8px}._sessionControls_1fshd_36 dt-select{flex:1 1 0%;min-width:0}._newSessionButton_1fshd_49{border:1px solid var(--dt-border-subtle);background:color-mix(in oklab,var(--dt-surface) 88%,transparent);color:var(--dt-text);transition:border-color .14s ease,background-color .14s ease,color .14s ease}._newSessionButton_1fshd_49:hover:not(:disabled){border-color:color-mix(in oklab,var(--dt-accent) 35%,var(--dt-border-subtle));background:color-mix(in oklab,var(--dt-surface) 94%,var(--dt-accent-ghost))}._newSessionButton_1fshd_49:disabled{cursor:not-allowed;opacity:.5}._newSessionButton_1fshd_49{display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;border-radius:999px;font-size:16px;line-height:1}._headerControls_1fshd_75{display:flex;align-items:center;gap:12px}._tokenCount_1fshd_81{color:var(--dt-text-muted);font-size:11px;font-weight:500}@media(max-width:640px){._header_1fshd_12{align-items:flex-start;flex-direction:column;gap:8px}._headerPrimary_1fshd_27{width:100%;flex-direction:column;align-items:flex-start}._sessionControls_1fshd_36{width:100%}._headerControls_1fshd_75{width:100%;justify-content:space-between}}._messages_1fshd_106{display:flex;flex:1;flex-direction:column;overflow-y:auto;padding:0}._placeholder_1fshd_114{display:flex;flex:1;align-items:center;justify-content:center;padding:20px;color:var(--dt-text-muted);font-size:13px;text-align:center}._queuedMessage_1fshd_125{padding:12px 16px;border-left:3px solid color-mix(in oklab,var(--dt-warning, var(--dt-accent)) 70%,var(--dt-border));background:color-mix(in oklab,var(--dt-warning, var(--dt-accent)) 8%,var(--dt-bg));color:color-mix(in oklab,var(--dt-text) 85%,var(--dt-text-secondary));font-family:var(--font-mono);font-size:12px;line-height:1.3;opacity:.9}._queuedMessageHeader_1fshd_136{display:flex;align-items:center;gap:8px;margin-bottom:8px}._queuedSpeaker_1fshd_143{color:color-mix(in oklab,var(--dt-warning, var(--dt-accent)) 70%,var(--dt-text));font-size:12px;font-weight:700;letter-spacing:.05em}._queuedBadge_1fshd_150{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;background:var(--dt-surface);color:var(--dt-text-muted);font-size:10px;font-weight:600;letter-spacing:.03em;text-transform:lowercase}._queuedMessageBody_1fshd_163{word-break:break-word}._partialTranscript_1fshd_167{display:flex;align-items:center;gap:8px;padding:10px 14px;border:1px solid color-mix(in oklab,var(--dt-accent) 35%,var(--dt-border));border-radius:12px;background:var(--dt-accent-ghost);color:var(--dt-text-secondary);font-size:13px;font-style:italic}._partialDot_1fshd_180{display:inline-block;width:8px;height:8px;flex-shrink:0;border-radius:50%;background:var(--dt-accent);animation:_statusBlink_1fshd_1 .6s ease-in-out infinite}._voiceListening_1fshd_190,._voiceSpeaking_1fshd_191,._voiceProcessing_1fshd_192{display:flex;align-items:center;gap:8px;padding:8px 14px;font-size:12px}._voiceListening_1fshd_190{color:var(--dt-text-muted)}._listeningDot_1fshd_204{display:inline-block;width:8px;height:8px;flex-shrink:0;border-radius:50%;background:var(--dt-success);animation:_statusBlink_1fshd_1 2s ease-in-out infinite}._voiceSpeaking_1fshd_191{color:var(--dt-danger)}._speakingWave_1fshd_218{display:inline-block;width:12px;height:12px;flex-shrink:0;border-radius:50%;background:color-mix(in oklab,var(--dt-danger) 70%,transparent);animation:_speakingPulse_1fshd_1 .8s ease-in-out infinite}@keyframes _speakingPulse_1fshd_1{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.3)}}._voiceProcessing_1fshd_192{color:var(--dt-info)}._voiceError_1fshd_242{padding:10px 14px;border:1px solid color-mix(in oklab,var(--dt-danger) 40%,var(--dt-border));border-radius:12px;background:var(--dt-danger-subtle);color:var(--dt-danger);font-size:12px}._compactPanel_11w4u_1{position:fixed;top:16px;right:16px;width:360px;max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);z-index:30;display:flex;flex-direction:column;background:color-mix(in srgb,var(--dt-bg) 92%,transparent);backdrop-filter:blur(20px) saturate(160%);border:1px solid var(--dt-border);border-radius:12px;box-shadow:0 8px 32px color-mix(in oklab,black 40%,transparent),0 2px 8px color-mix(in oklab,black 20%,transparent);animation:_slideIn_11w4u_1 .2s cubic-bezier(.2,.9,.2,1);user-select:none}@keyframes _slideIn_11w4u_1{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}._dragHandle_11w4u_30{height:24px;display:flex;align-items:center;justify-content:center;cursor:grab;border-bottom:1px solid var(--dt-border);background:color-mix(in srgb,var(--dt-fg) 4%,transparent);border-radius:12px 12px 0 0;transition:background .15s ease}._dragHandle_11w4u_30:hover{background:color-mix(in srgb,var(--dt-fg) 8%,transparent)}._dragHandle_11w4u_30:active{cursor:grabbing}._dragHandleLine_11w4u_50{width:32px;height:3px;background:color-mix(in srgb,var(--dt-fg) 30%,transparent);border-radius:2px}._messageArea_11w4u_57{flex:1;overflow-y:auto;padding:12px 16px;max-height:300px}._placeholder_11w4u_64{padding:20px;text-align:center;color:color-mix(in srgb,var(--dt-fg) 50%,transparent);font-size:13px}._partialTranscript_11w4u_71{display:flex;align-items:center;gap:8px;padding:8px 12px;margin-top:8px;background:color-mix(in srgb,var(--dt-accent) 10%,transparent);border-radius:6px;font-size:13px;color:var(--dt-fg)}._partialDot_11w4u_83{width:6px;height:6px;background:var(--dt-accent);border-radius:50%;animation:_pulse_11w4u_1 1s ease-in-out infinite}@keyframes _pulse_11w4u_1{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.2)}}._voiceListening_11w4u_101,._voiceSpeaking_11w4u_102,._voiceProcessing_11w4u_103{display:flex;align-items:center;gap:8px;padding:8px 12px;margin-top:8px;font-size:13px;color:color-mix(in srgb,var(--dt-fg) 70%,transparent)}._listeningDot_11w4u_113,._speakingWave_11w4u_114{width:6px;height:6px;background:var(--dt-accent);border-radius:50%}._listeningDot_11w4u_113{animation:_pulse_11w4u_1 1s ease-in-out infinite}._speakingWave_11w4u_114{animation:_wave_11w4u_1 .8s ease-in-out infinite}@keyframes _wave_11w4u_1{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:.6}}._voiceProcessing_11w4u_103{background:color-mix(in srgb,var(--dt-fg) 5%,transparent);border-radius:6px}._commandInputWrapper_11w4u_144{border-top:1px solid var(--dt-border);padding:12px 16px 16px;background:color-mix(in srgb,var(--dt-fg) 2%,transparent);border-radius:0 0 12px 12px}._messageArea_11w4u_57::-webkit-scrollbar{width:6px}._messageArea_11w4u_57::-webkit-scrollbar-track{background:transparent}._messageArea_11w4u_57::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--dt-fg) 20%,transparent);border-radius:3px}._messageArea_11w4u_57::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--dt-fg) 30%,transparent)}._window_k9cdu_1{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;border:1px solid color-mix(in oklab,var(--dt-accent) 60%,var(--dt-border));border-radius:2px;box-shadow:0 4px 20px color-mix(in oklab,black 60%,transparent);transition:border-color .2s ease,box-shadow .2s ease}._windowFocused_k9cdu_16{border-color:color-mix(in oklab,var(--dt-accent) 80%,var(--dt-border));box-shadow:0 4px 24px color-mix(in oklab,black 70%,transparent),0 0 12px color-mix(in oklab,var(--dt-accent) 15%,transparent)}._windowDragging_k9cdu_21{opacity:.5;border:1px dashed color-mix(in oklab,var(--dt-accent) 60%,var(--dt-border));box-shadow:none;transition:opacity .15s ease,border-color .15s ease}._windowFullscreen_k9cdu_28{position:fixed;top:calc(var(--actions-bar-height) + 58px);right:64px;bottom:64px;left:64px;width:auto;height:auto;z-index:25;border-radius:2px;border:1px solid color-mix(in oklab,var(--dt-accent) 60%,var(--dt-border));box-shadow:0 24px 72px color-mix(in oklab,black 80%,transparent),0 0 20px color-mix(in oklab,var(--dt-accent) 20%,transparent);transform-origin:center center;animation:_maximizeZoomIn_k9cdu_1 .22s cubic-bezier(.2,.9,.2,1)}@keyframes _maximizeZoomIn_k9cdu_1{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}._chrome_k9cdu_54{display:flex;height:24px;flex-shrink:0;align-items:center;padding:0 10px;background:color-mix(in oklab,var(--dt-surface) 70%,black);border-bottom:1px solid color-mix(in oklab,var(--dt-accent) 40%,var(--dt-border));user-select:none}._trafficLights_k9cdu_65{display:flex;gap:6px;margin-right:10px}._trafficLight_k9cdu_65{width:10px;height:10px;padding:0;border:1px solid currentColor;border-radius:2px;cursor:pointer;background:transparent;color:var(--dt-text-muted);transition:all .1s ease}._trafficLight_k9cdu_65:hover{color:var(--dt-accent);border-color:var(--dt-accent);background:var(--dt-accent)}._trafficLightClose_k9cdu_88{color:var(--dt-danger);border-color:var(--dt-danger)}._trafficLightClose_k9cdu_88:hover{color:var(--dt-text-on-accent);background:var(--dt-danger);border-color:var(--dt-danger)}._trafficLightFullscreen_k9cdu_99{color:var(--dt-success);border-color:var(--dt-success)}._trafficLightFullscreen_k9cdu_99:hover{color:var(--dt-text-on-accent);background:var(--dt-success);border-color:var(--dt-success)}._title_k9cdu_110{flex:1;overflow:hidden;color:color-mix(in oklab,var(--dt-accent) 70%,var(--dt-text-muted));font-family:var(--font-mono, "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, monospace);font-size:10px;font-weight:600;letter-spacing:.08em;text-align:center;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}._body_k9cdu_124{flex:1;min-height:0;overflow:auto;background:color-mix(in oklab,var(--dt-bg) 85%,black)}._tileSplit_zwnh1_1{display:grid;width:100%;height:100%;min-width:0;min-height:0}._tileSplitHorizontal_zwnh1_9{grid-template-rows:minmax(0,1fr);align-items:stretch}._tileSplitVertical_zwnh1_14{grid-template-columns:minmax(0,1fr);align-items:stretch}._tilePane_zwnh1_19,._tileLeaf_zwnh1_20{min-width:0;min-height:0}._tileLeaf_zwnh1_20{width:100%;height:100%}._shell_1jqjo_1{display:flex;flex-direction:column;width:100vw;height:100vh;background:var(--dt-wallpaper) center/cover no-repeat;position:fixed;top:0;left:0}._actionsBar_1jqjo_12{flex:0 0 var(--actions-bar-height);min-height:42px;position:relative;z-index:30}._content_1jqjo_19{display:grid;flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden}._desktop_1jqjo_28{flex:1 1 auto;position:relative;overflow:hidden;min-width:0;min-height:0}._assistantPane_1jqjo_36{min-width:0;min-height:0;overflow:hidden}._maximizedMask_1jqjo_42{position:absolute;inset:0;z-index:20;background:color-mix(in srgb,var(--dt-bg) 46%,transparent);backdrop-filter:blur(4px) saturate(.84);pointer-events:none}._page_1nc9w_1{display:flex;align-items:center;justify-content:center;width:100vw;height:100vh;background:var(--dt-wallpaper) center/cover no-repeat}._logo_1nc9w_10{font-size:28px;font-weight:700;color:var(--dt-text);letter-spacing:-.5px}._form_1nc9w_17{display:flex;flex-direction:column;gap:16px;width:100%}._field_1nc9w_24{display:flex;flex-direction:column;gap:6px}._label_1nc9w_30{font-size:12px;font-weight:500;color:var(--dt-text-secondary);text-transform:uppercase;letter-spacing:.5px}._input_1nc9w_38{padding:10px 12px;font-size:14px;font-family:var(--font-ui);color:var(--dt-text);background:var(--dt-surface);border:1px solid var(--dt-border);border-radius:2px;outline:none;transition:border-color .15s ease}._input_1nc9w_38:focus{border-color:var(--dt-accent)}._input_1nc9w_38::placeholder{color:var(--dt-text-muted)}._error_1nc9w_56{font-size:13px;color:var(--dt-danger);text-align:center;min-height:1.4em}._modal_2xb7m_1{display:flex;flex-direction:column;gap:24px;padding:40px 36px 36px;max-width:90vw;background:var(--dt-bg);border:1px solid var(--dt-border);border-radius:4px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f}._small_2xb7m_13{width:360px}._medium_2xb7m_17{width:560px}._large_2xb7m_21{width:720px}@media(max-width:640px){._modal_2xb7m_1{width:min(92vw,560px);padding:28px 20px 20px}._small_2xb7m_13{width:min(92vw,360px)}._medium_2xb7m_17{width:min(92vw,560px)}._large_2xb7m_21{width:min(92vw,720px)}}._page_1q807_1{display:flex;align-items:center;justify-content:center;width:100vw;height:100vh;background:var(--dt-wallpaper) center/cover no-repeat}._header_1q807_10{text-align:center}._title_1q807_14{font-size:22px;font-weight:700;color:var(--dt-text);margin-bottom:4px}._subtitle_1q807_21{font-size:14px;color:var(--dt-text-secondary)}._stepIndicator_1q807_26{display:flex;justify-content:center;gap:8px}._dot_1q807_32{width:8px;height:8px;border-radius:50%;background:var(--dt-border);transition:background .2s ease}._dotActive_1q807_40{background:var(--dt-accent)}._dotCompleted_1q807_45{background:var(--dt-accent-subtle)}._body_1q807_50{display:flex;flex-direction:column;gap:16px}._providerList_1q807_56{display:flex;flex-direction:column;gap:12px}._providerCard_1q807_62{margin:0}._providerCard_1q807_62 dt-card{display:block;margin:0}._providerCardBody_1q807_71{display:flex;flex-direction:column;gap:14px}._providerCardHeader_1q807_77{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}._providerCardTitleRow_1q807_84{display:flex;align-items:center;gap:8px}._providerCardTitle_1q807_84{font-size:14px;font-weight:600;color:var(--dt-text)}._providerCardActions_1q807_96{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}._providerButtonWrap_1q807_103,._providerActionButtonWrap_1q807_104{display:inline-flex}._providerButtonWrap_1q807_103 dt-button,._providerActionButtonWrap_1q807_104 dt-button{display:inline-flex}._providerSelectWrap_1q807_113{width:100%}._providerSelectWrap_1q807_113 dt-select{display:block;width:100%}._providerFieldGrid_1q807_122{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}._field_1q807_128{display:flex;flex-direction:column;gap:6px}._label_1q807_134{font-size:12px;font-weight:500;color:var(--dt-text-secondary);text-transform:uppercase;letter-spacing:.5px}._input_1q807_142{padding:10px 12px;font-size:14px;font-family:var(--font-ui);color:var(--dt-text);background:var(--dt-surface);border:1px solid var(--dt-border);border-radius:2px;outline:none;transition:border-color .15s ease,background .15s ease}._input_1q807_142:focus{border-color:var(--dt-accent);background:var(--dt-bg)}._input_1q807_142::placeholder{color:var(--dt-text-muted)}._footer_1q807_161{display:flex;justify-content:space-between;gap:12px}._error_1q807_167{font-size:13px;color:var(--dt-danger);text-align:center;min-height:1.4em}._welcomeText_1q807_174{font-size:14px;line-height:1.6;color:var(--dt-text-secondary);text-align:center}._hintText_1q807_181{font-size:13px;line-height:1.5;color:var(--dt-text-secondary);text-align:center;margin:0}._doneText_1q807_189{font-size:15px;line-height:1.6;color:var(--dt-text);text-align:center}._footerActions_1q807_196{display:flex;gap:8px;margin-left:auto}@media(max-width:640px){._providerCardHeader_1q807_77,._providerCardActions_1q807_96,._footer_1q807_161,._footerActions_1q807_196{flex-direction:column}._providerCardActions_1q807_96,._footerActions_1q807_196{margin-left:0}._providerButtonWrap_1q807_103,._providerActionButtonWrap_1q807_104{width:100%}._providerFieldGrid_1q807_122{grid-template-columns:1fr}._providerButtonWrap_1q807_103 dt-button,._providerActionButtonWrap_1q807_104 dt-button{width:100%;margin-left:0}}:root{--dt-accent-h: 286;--dt-accent-c: .234;--dt-accent-l: .623;--dt-mode-sign: -1;--dt-scale-50: oklch(.98 .005 286);--dt-scale-100: oklch(.94 .01 286);--dt-scale-150: oklch(.88 .015 286);--dt-scale-200: oklch(.8 .02 286);--dt-scale-300: oklch(.7 .025 286);--dt-scale-400: oklch(.6 .03 286);--dt-scale-500: oklch(.5 .04 286);--dt-scale-600: oklch(.4 .03 286);--dt-scale-700: oklch(.32 .025 286);--dt-scale-800: oklch(.24 .03 286);--dt-scale-850: oklch(.2 .035 286);--dt-scale-900: oklch(.16 .04 286);--dt-scale-950: oklch(.12 .05 286);--dt-bg: var(--dt-scale-50);--dt-bg-subtle: var(--dt-scale-100);--dt-surface: var(--dt-scale-100);--dt-surface-hover: var(--dt-scale-150);--dt-surface-active: var(--dt-scale-200);--dt-overlay: oklch(.98 .005 286 / .85);--dt-text: var(--dt-scale-950);--dt-text-secondary: var(--dt-scale-600);--dt-text-muted: var(--dt-scale-500);--dt-text-on-accent: var(--dt-scale-50);--dt-border: var(--dt-scale-200);--dt-border-subtle: oklch(.88 .015 286 / .6);--dt-border-strong: var(--dt-scale-300);--dt-accent: oklch(.623 .234 286);--dt-accent-hover: oklch(.573 .234 286);--dt-accent-active: oklch(.523 .234 286);--dt-accent-subtle: oklch(.623 .234 286 / .15);--dt-accent-ghost: oklch(.623 .234 286 / .08);--dt-danger: oklch(.45 .18 25);--dt-danger-subtle: oklch(.45 .18 25 / .15);--dt-success: oklch(.45 .18 155);--dt-success-subtle: oklch(.45 .18 155 / .15);--dt-warning: oklch(.45 .18 80);--dt-warning-subtle: oklch(.45 .18 80 / .15);--dt-info: oklch(.45 .18 250);--dt-info-subtle: oklch(.45 .18 250 / .15);--dt-dock-bg: var(--dt-overlay);--dt-actions-bar-bg: var(--dt-bg-subtle);--dt-window-chrome: var(--dt-surface);--dt-window-body: var(--dt-bg);--dt-info-panel-bg: var(--dt-bg-subtle);--dt-wallpaper: linear-gradient( 135deg, oklch(.85 .06 286) 0%, oklch(.8 .08 286) 50%, oklch(.75 .03 316) 100% );--dt-glass: oklch(.94 .01 286 / .7);--dt-glass-border: oklch(.12 .05 286 / .12);--dt-glass-highlight: oklch(.98 .005 286 / .45);--dt-shadow-color: oklch(.12 .05 286 / .15);--color-bg: var(--dt-bg);--color-surface: var(--dt-surface);--color-surface-hover: var(--dt-surface-hover);--color-border: var(--dt-border);--color-border-subtle: var(--dt-border-subtle);--color-text: var(--dt-text);--color-text-muted: var(--dt-text-muted);--color-accent: var(--dt-accent);--color-accent-hover: var(--dt-accent-hover);--color-danger: var(--dt-danger);--color-success: var(--dt-success);--color-warning: var(--dt-warning);--color-warning-bg: var(--dt-warning-subtle);--color-info: var(--dt-info);--color-dock-bg: var(--dt-dock-bg);--color-actions-bar-bg: var(--dt-actions-bar-bg);--color-window-chrome: var(--dt-window-chrome);--color-window-body: var(--dt-window-body);--color-top-bar-bg: var(--dt-actions-bar-bg);--color-top-bar-text: var(--dt-text);--color-top-bar-text-shadow: none;--desktop-wallpaper: var(--dt-wallpaper);--desktop-window-bg: var(--dt-info-panel-bg);--font-display: "Sora", system-ui, -apple-system, sans-serif;--font-ui: "Work Sans", system-ui, -apple-system, sans-serif;--font-sans: var(--font-ui);--font-mono: "SF Mono", "Fira Code", "Cascadia Code", monospace;--dock-height: 64px;--actions-bar-height: 36px;--info-panel-width: 320px;--window-chrome-height: 36px;--border-radius: 8px}*{margin:0;padding:0;box-sizing:border-box}html,body,#root{width:100%;height:100%;overflow:hidden;font-family:var(--font-sans);font-size:14px;color:var(--dt-text);background:var(--dt-bg)}:root[data-theme=light]{color-scheme:light}:root[data-theme=dark]{color-scheme:dark}
@@ -0,0 +1,22 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>DeskTalk</title>
7
+ <link rel="stylesheet" href="/api/ui/fonts/fonts.css" />
8
+ <style>
9
+ /* Prevent flash of unstyled content */
10
+ html,
11
+ body {
12
+ background: #1e1e2e;
13
+ margin: 0;
14
+ }
15
+ </style>
16
+ <script type="module" crossorigin src="/assets/index-C5-XUOS7.js"></script>
17
+ <link rel="stylesheet" crossorigin href="/assets/index-C_e3_6yE.css">
18
+ </head>
19
+ <body>
20
+ <div id="root"></div>
21
+ </body>
22
+ </html>
@@ -0,0 +1,65 @@
1
+ /**
2
+ * AudioWorklet processor that captures microphone audio and resamples
3
+ * to 16kHz mono 16-bit PCM (s16le) for speech-to-text processing.
4
+ *
5
+ * This file runs in the AudioWorklet thread and must be plain JavaScript
6
+ * (no imports, no TypeScript). It is served as a static file.
7
+ */
8
+
9
+ class PcmCaptureProcessor extends AudioWorkletProcessor {
10
+ constructor() {
11
+ super();
12
+ this._buffer = [];
13
+ this._targetSampleRate = 16000;
14
+ // sampleRate is a global in AudioWorkletGlobalScope
15
+ this._sourceSampleRate = sampleRate;
16
+ this._ratio = this._sourceSampleRate / this._targetSampleRate;
17
+ // Accumulates fractional sample position for resampling
18
+ this._resampleOffset = 0;
19
+ }
20
+
21
+ process(inputs) {
22
+ const input = inputs[0];
23
+ if (!input || input.length === 0) return true;
24
+
25
+ // Take first channel (mono)
26
+ const channelData = input[0];
27
+ if (!channelData || channelData.length === 0) return true;
28
+
29
+ // Resample from source rate to 16kHz using linear interpolation
30
+ const ratio = this._ratio;
31
+ let offset = this._resampleOffset;
32
+ const resampled = [];
33
+
34
+ while (offset < channelData.length) {
35
+ const index = Math.floor(offset);
36
+ const frac = offset - index;
37
+
38
+ let sample;
39
+ if (index + 1 < channelData.length) {
40
+ // Linear interpolation between adjacent samples
41
+ sample = channelData[index] * (1 - frac) + channelData[index + 1] * frac;
42
+ } else {
43
+ sample = channelData[index];
44
+ }
45
+
46
+ // Clamp to [-1, 1] then convert to 16-bit integer
47
+ sample = Math.max(-1, Math.min(1, sample));
48
+ resampled.push(Math.round(sample * 32767));
49
+ offset += ratio;
50
+ }
51
+
52
+ // Save fractional remainder for next process() call
53
+ this._resampleOffset = offset - channelData.length;
54
+
55
+ if (resampled.length > 0) {
56
+ // Convert to Int16Array for efficient binary transfer
57
+ const pcmData = new Int16Array(resampled);
58
+ this.port.postMessage(pcmData.buffer, [pcmData.buffer]);
59
+ }
60
+
61
+ return true;
62
+ }
63
+ }
64
+
65
+ registerProcessor('pcm-capture-processor', PcmCaptureProcessor);
@@ -0,0 +1,34 @@
1
+ {
2
+ "packageName": "@desktalk/core",
3
+ "packageScope": "core",
4
+ "locales": [
5
+ "zh-CN"
6
+ ],
7
+ "messages": [
8
+ {
9
+ "key": "applications",
10
+ "defaultText": "Applications",
11
+ "placeholders": []
12
+ },
13
+ {
14
+ "key": "close",
15
+ "defaultText": "Close",
16
+ "placeholders": []
17
+ },
18
+ {
19
+ "key": "split.mode",
20
+ "defaultText": "Split mode",
21
+ "placeholders": []
22
+ },
23
+ {
24
+ "key": "window.fullscreen",
25
+ "defaultText": "Fullscreen",
26
+ "placeholders": []
27
+ },
28
+ {
29
+ "key": "window.restore",
30
+ "defaultText": "Restore",
31
+ "placeholders": []
32
+ }
33
+ ]
34
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "applications": "应用程序",
3
+ "close": "关闭",
4
+ "miniapp.loading": "正在加载 MiniApp...",
5
+ "window.maximize": "最大化",
6
+ "window.restore": "还原"
7
+ }
@@ -0,0 +1,6 @@
1
+ export { initWorkspace, getWorkspacePaths, resolveMiniAppPaths } from './services/workspace.js';
2
+ export { registry, registerBuiltinMiniApps } from './services/miniapp-registry.js';
3
+ export type { MiniAppBackendModule, MiniAppEntry } from './services/miniapp-registry.js';
4
+ export { createServer } from './server/index.js';
5
+ export type { ServerOptions } from './server/index.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // @desktalk/core — Main application shell
2
+ // Re-export services for programmatic use
3
+ export { initWorkspace, getWorkspacePaths, resolveMiniAppPaths } from './services/workspace.js';
4
+ export { registry, registerBuiltinMiniApps } from './services/miniapp-registry.js';
5
+ export { createServer } from './server/index.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,0CAA0C;AAE1C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Fastify plugin that registers admin-only user management routes.
3
+ *
4
+ * All routes require an authenticated user with role === 'admin'.
5
+ *
6
+ * GET /api/admin/users
7
+ * POST /api/admin/users
8
+ * DELETE /api/admin/users/:username
9
+ * PUT /api/admin/users/:username/role
10
+ * PUT /api/admin/users/:username/password
11
+ */
12
+ import type { FastifyInstance } from 'fastify';
13
+ export declare function adminRoutes(app: FastifyInstance): Promise<void>;
14
+ //# sourceMappingURL=admin-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-routes.d.ts","sourceRoot":"","sources":["../../src/server/admin-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAgB7E,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoIrE"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Fastify plugin that registers admin-only user management routes.
3
+ *
4
+ * All routes require an authenticated user with role === 'admin'.
5
+ *
6
+ * GET /api/admin/users
7
+ * POST /api/admin/users
8
+ * DELETE /api/admin/users/:username
9
+ * PUT /api/admin/users/:username/role
10
+ * PUT /api/admin/users/:username/password
11
+ */
12
+ import { listUsers, findUser, createUser, deleteUser, updateUserRole, updateUserPassword, deleteUserSessions, } from '../services/user-db.js';
13
+ import { rmSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { getWorkspacePaths, ensureUserHome } from '../services/workspace.js';
16
+ export async function adminRoutes(app) {
17
+ // Admin guard — applied to all routes in this plugin
18
+ app.addHook('onRequest', async (req, reply) => {
19
+ const user = req.user;
20
+ if (!user || user.role !== 'admin') {
21
+ reply.code(403);
22
+ reply.send({ error: 'Admin access required.' });
23
+ }
24
+ });
25
+ // ─── GET /api/admin/users ───────────────────────────────────────────
26
+ app.get('/api/admin/users', async () => {
27
+ return listUsers();
28
+ });
29
+ // ─── POST /api/admin/users ──────────────────────────────────────────
30
+ app.post('/api/admin/users', async (req, reply) => {
31
+ const { username, password, role, displayName } = req.body ?? {};
32
+ if (!username || !password) {
33
+ reply.code(400);
34
+ return { error: 'Username and password are required.' };
35
+ }
36
+ if (!/^[a-zA-Z0-9_-]{1,32}$/.test(username)) {
37
+ reply.code(400);
38
+ return { error: 'Username must be 1-32 alphanumeric characters, hyphens, or underscores.' };
39
+ }
40
+ if (password.length < 8) {
41
+ reply.code(400);
42
+ return { error: 'Password must be at least 8 characters.' };
43
+ }
44
+ if (role && role !== 'admin' && role !== 'user') {
45
+ reply.code(400);
46
+ return { error: 'Role must be "admin" or "user".' };
47
+ }
48
+ if (findUser(username)) {
49
+ reply.code(409);
50
+ return { error: `User "${username}" already exists.` };
51
+ }
52
+ const user = createUser(username, password, role ?? 'user', displayName);
53
+ ensureUserHome(username);
54
+ return user;
55
+ });
56
+ // ─── DELETE /api/admin/users/:username ──────────────────────────────
57
+ app.delete('/api/admin/users/:username', async (req, reply) => {
58
+ const { username } = req.params;
59
+ const currentUser = req.user;
60
+ if (username === currentUser.username) {
61
+ reply.code(400);
62
+ return { error: 'Cannot delete your own account.' };
63
+ }
64
+ const target = findUser(username);
65
+ if (!target) {
66
+ reply.code(404);
67
+ return { error: `User "${username}" not found.` };
68
+ }
69
+ // Delete sessions, then user, then home directory
70
+ deleteUserSessions(username);
71
+ deleteUser(username);
72
+ // Remove the user's home directory
73
+ const ws = getWorkspacePaths();
74
+ const homeDir = join(ws.data, 'home', username);
75
+ try {
76
+ rmSync(homeDir, { recursive: true, force: true });
77
+ }
78
+ catch {
79
+ // Best-effort cleanup
80
+ }
81
+ return { ok: true, deleted: username };
82
+ });
83
+ // ─── PUT /api/admin/users/:username/role ────────────────────────────
84
+ app.put('/api/admin/users/:username/role', async (req, reply) => {
85
+ const { username } = req.params;
86
+ const { role } = req.body ?? {};
87
+ if (!role || (role !== 'admin' && role !== 'user')) {
88
+ reply.code(400);
89
+ return { error: 'Role must be "admin" or "user".' };
90
+ }
91
+ const target = findUser(username);
92
+ if (!target) {
93
+ reply.code(404);
94
+ return { error: `User "${username}" not found.` };
95
+ }
96
+ updateUserRole(username, role);
97
+ return { ok: true, username, role };
98
+ });
99
+ // ─── PUT /api/admin/users/:username/password ────────────────────────
100
+ app.put('/api/admin/users/:username/password', async (req, reply) => {
101
+ const { username } = req.params;
102
+ const { newPassword } = req.body ?? {};
103
+ if (!newPassword || newPassword.length < 8) {
104
+ reply.code(400);
105
+ return { error: 'Password must be at least 8 characters.' };
106
+ }
107
+ const target = findUser(username);
108
+ if (!target) {
109
+ reply.code(404);
110
+ return { error: `User "${username}" not found.` };
111
+ }
112
+ updateUserPassword(username, newPassword);
113
+ // Invalidate all existing sessions for the target user
114
+ deleteUserSessions(username);
115
+ return { ok: true, username };
116
+ });
117
+ }
118
+ //# sourceMappingURL=admin-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-routes.js","sourceRoot":"","sources":["../../src/server/admin-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { PiSessionService } from '../services/ai/pi-session-service.js';
3
+ export interface ApiRoutesOptions {
4
+ corePackageRoot: string;
5
+ piSessionService: PiSessionService;
6
+ }
7
+ export declare function apiRoutes(app: FastifyInstance, options: ApiRoutesOptions): Promise<void>;
8
+ //# sourceMappingURL=api-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-routes.d.ts","sourceRoot":"","sources":["../../src/server/api-routes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAyB1E,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiP9F"}
@@ -0,0 +1,203 @@
1
+ import fastifyStatic from '@fastify/static';
2
+ import { createReadStream } from 'node:fs';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { createRequire } from 'node:module';
5
+ import { dirname, join } from 'node:path';
6
+ import sharp from 'sharp';
7
+ import { loadMergedLocaleMessages } from '../services/i18n.js';
8
+ import { LIVEAPP_ICON_CACHE_CONTROL, LIVEAPP_ICON_SIZES, parseLiveAppIconSize, } from '../services/liveapp-icon.js';
9
+ import { listLiveApps } from '../services/liveapps.js';
10
+ import { MINIAPP_ICON_CACHE_CONTROL, MINIAPP_ICON_SIZES, parseMiniAppIconSize, } from '../services/miniapp-icon.js';
11
+ import { registry } from '../services/miniapp-registry.js';
12
+ import { getStoredPreference, getStoredPreferenceForUser } from '../services/preferences.js';
13
+ import { DEFAULT_THEME_PREFERENCES, FONT_FACES_CSS, generateThemeCSS, HTML_BASE_STYLESHEET, } from '@desktalk/ui/theme-css';
14
+ import { getUserHomeDir } from '../services/workspace.js';
15
+ import { validateSession } from '../services/user-db.js';
16
+ import { COOKIE_NAME } from './auth-routes.js';
17
+ export async function apiRoutes(app, options) {
18
+ const require = createRequire(import.meta.url);
19
+ const uiPackageDir = dirname(require.resolve('@desktalk/ui/package.json'));
20
+ const uiDistDir = join(uiPackageDir, 'dist');
21
+ const uiFontsDir = join(uiPackageDir, 'src', 'fonts');
22
+ const uiBundleCache = new Map();
23
+ const themeCssCache = new Map();
24
+ const hostedFontFacesCss = FONT_FACES_CSS.replaceAll(/url\('([^']+)'\)/g, "url('/api/ui/fonts/$1')");
25
+ await app.register(fastifyStatic, {
26
+ root: uiFontsDir,
27
+ prefix: '/api/ui/fonts/',
28
+ decorateReply: false,
29
+ cacheControl: true,
30
+ immutable: true,
31
+ maxAge: '1d',
32
+ });
33
+ async function getUiBundle(fileName, cacheKey) {
34
+ const cached = uiBundleCache.get(cacheKey);
35
+ if (cached)
36
+ return cached;
37
+ const body = await readFile(join(uiDistDir, fileName));
38
+ const etag = `"${cacheKey}-${body.length.toString(36)}"`;
39
+ const next = { body, etag };
40
+ uiBundleCache.set(cacheKey, next);
41
+ return next;
42
+ }
43
+ app.get('/api/miniapps', async () => {
44
+ return registry.getManifests();
45
+ });
46
+ app.get('/api/liveapps', async (req) => {
47
+ const username = req.user.username;
48
+ return listLiveApps(getUserHomeDir(username));
49
+ });
50
+ app.get('/api/liveapps/:id/icon', async (req, reply) => {
51
+ const username = req.user.username;
52
+ const iconFilePath = join(getUserHomeDir(username), '.data', 'liveapps', req.params.id, 'icon.png');
53
+ try {
54
+ await readFile(iconFilePath);
55
+ }
56
+ catch {
57
+ reply.code(404);
58
+ return { error: 'LiveApp icon not found' };
59
+ }
60
+ const size = parseLiveAppIconSize(req.query.size);
61
+ if (req.query.size !== undefined && size === undefined) {
62
+ reply.code(400);
63
+ return {
64
+ error: `Invalid icon size. Supported sizes: ${LIVEAPP_ICON_SIZES.join(', ')}`,
65
+ };
66
+ }
67
+ reply.header('Cache-Control', LIVEAPP_ICON_CACHE_CONTROL);
68
+ reply.type('image/png');
69
+ if (size === undefined) {
70
+ return reply.send(createReadStream(iconFilePath));
71
+ }
72
+ const image = await sharp(iconFilePath)
73
+ .resize({
74
+ width: size,
75
+ height: size,
76
+ fit: 'cover',
77
+ withoutEnlargement: true,
78
+ })
79
+ .png()
80
+ .toBuffer();
81
+ return reply.send(image);
82
+ });
83
+ app.get('/api/miniapps/:id/icon', async (req, reply) => {
84
+ const entry = registry.getEntry(req.params.id);
85
+ if (!entry?.iconFilePath) {
86
+ reply.code(404);
87
+ return { error: 'MiniApp icon not found' };
88
+ }
89
+ const size = parseMiniAppIconSize(req.query.size);
90
+ if (req.query.size !== undefined && size === undefined) {
91
+ reply.code(400);
92
+ return {
93
+ error: `Invalid icon size. Supported sizes: ${MINIAPP_ICON_SIZES.join(', ')}`,
94
+ };
95
+ }
96
+ reply.header('Cache-Control', MINIAPP_ICON_CACHE_CONTROL);
97
+ reply.type('image/png');
98
+ if (size === undefined) {
99
+ return reply.send(createReadStream(entry.iconFilePath));
100
+ }
101
+ const image = await sharp(entry.iconFilePath)
102
+ .resize({
103
+ width: size,
104
+ height: size,
105
+ fit: 'cover',
106
+ withoutEnlargement: true,
107
+ })
108
+ .png()
109
+ .toBuffer();
110
+ return reply.send(image);
111
+ });
112
+ app.get('/api/ui/:file(^[^/]+\\.js$)', async (req, reply) => {
113
+ const fileName = req.params.file;
114
+ if (!fileName ||
115
+ fileName.includes('/') ||
116
+ fileName.includes('\\') ||
117
+ fileName.endsWith('.map')) {
118
+ reply.code(404);
119
+ return { error: 'Not found' };
120
+ }
121
+ let bundle;
122
+ try {
123
+ bundle = await getUiBundle(fileName, fileName);
124
+ }
125
+ catch (error) {
126
+ if (error.code === 'ENOENT') {
127
+ reply.code(404);
128
+ return { error: 'Not found' };
129
+ }
130
+ throw error;
131
+ }
132
+ const { body, etag } = bundle;
133
+ reply.header('Content-Type', 'application/javascript; charset=utf-8');
134
+ reply.header('Cache-Control', 'public, max-age=86400, immutable');
135
+ reply.header('ETag', etag);
136
+ return reply.send(body);
137
+ });
138
+ app.get('/api/ui/desktalk-theme.css', async (req, reply) => {
139
+ const accent = req.query.accent ?? DEFAULT_THEME_PREFERENCES.accentColor;
140
+ const theme = req.query.theme === 'light' ? 'light' : DEFAULT_THEME_PREFERENCES.theme;
141
+ const cacheKey = `${accent}|${theme}`;
142
+ let cached = themeCssCache.get(cacheKey);
143
+ if (!cached) {
144
+ const themeCSS = generateThemeCSS({ accentColor: accent, theme });
145
+ const body = `${hostedFontFacesCss}\n${themeCSS}\n${HTML_BASE_STYLESHEET}`;
146
+ const etag = `"theme-${Buffer.byteLength(body).toString(36)}"`;
147
+ cached = { body, etag };
148
+ themeCssCache.set(cacheKey, cached);
149
+ }
150
+ reply.header('Content-Type', 'text/css; charset=utf-8');
151
+ reply.header('Cache-Control', 'public, max-age=86400, immutable');
152
+ reply.header('ETag', cached.etag);
153
+ return reply.send(cached.body);
154
+ });
155
+ app.get('/api/preferences/public', async (req) => {
156
+ const requestUser = req.user;
157
+ const token = req.cookies[COOKIE_NAME];
158
+ const user = requestUser ?? (token ? validateSession(token) : undefined);
159
+ const getPreference = (key) => user ? getStoredPreferenceForUser(user.username, key) : getStoredPreference(key);
160
+ return {
161
+ theme: getPreference('general.theme') === 'light' ? 'light' : DEFAULT_THEME_PREFERENCES.theme,
162
+ accentColor: String(getPreference('general.accentColor') ?? '#7c6ff7'),
163
+ };
164
+ });
165
+ app.get('/api/ai/providers', async () => {
166
+ return options.piSessionService.getProviderOptions();
167
+ });
168
+ app.get('/api/i18n/catalog', async (req) => {
169
+ const locale = String(req.query.locale ?? getStoredPreference('general.language') ?? 'en');
170
+ const packages = [
171
+ { packageRoot: options.corePackageRoot, packageScope: 'core' },
172
+ ...registry.getIds().flatMap((id) => {
173
+ const entry = registry.getEntry(id);
174
+ return entry
175
+ ? [
176
+ {
177
+ packageRoot: entry.packageRoot,
178
+ packageScope: entry.manifest.id,
179
+ },
180
+ ]
181
+ : [];
182
+ }),
183
+ ];
184
+ return {
185
+ locale,
186
+ messages: loadMergedLocaleMessages(packages, locale),
187
+ };
188
+ });
189
+ app.post('/api/miniapps/:id/activate', async (req) => {
190
+ const { id } = req.params;
191
+ const username = req.user.username;
192
+ const launchArgs = req.body?.args ? [req.body.args] : [];
193
+ await registry.activate(id, username, { launchArgs });
194
+ return { id, activated: true };
195
+ });
196
+ app.post('/api/miniapps/:id/deactivate', async (req) => {
197
+ const { id } = req.params;
198
+ const username = req.user.username;
199
+ await registry.deactivate(id, username);
200
+ return { id, deactivated: true };
201
+ });
202
+ }
203
+ //# sourceMappingURL=api-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-routes.js","sourceRoot":"","sources":["../../src/server/api-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Fastify plugin that registers authentication and setup routes.
3
+ *
4
+ * Public routes (no session required):
5
+ * POST /api/auth/login
6
+ * GET /api/auth/me
7
+ * GET /api/setup/status
8
+ * POST /api/setup
9
+ *
10
+ * Authenticated routes:
11
+ * POST /api/auth/logout
12
+ * PUT /api/auth/me/password
13
+ */
14
+ import type { FastifyInstance } from 'fastify';
15
+ import '@fastify/cookie';
16
+ declare const COOKIE_NAME = "desktalk_session";
17
+ export declare function authRoutes(app: FastifyInstance): Promise<void>;
18
+ export { COOKIE_NAME };
19
+ //# sourceMappingURL=auth-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-routes.d.ts","sourceRoot":"","sources":["../../src/server/auth-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAC/D,OAAO,iBAAiB,CAAC;AAezB,QAAA,MAAM,WAAW,qBAAqB,CAAC;AAYvC,wBAAsB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoLpE;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}