@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,407 @@
1
+ import{W as Le,a as Re,u as F,A as qe,b as He,s as ze,g as _e,c as je,d as de}from"./index-C5-XUOS7.js";function ve(t){return JSON.stringify(t).replace(/</g,"\\u003c")}function Ve(t,e){const n=ve(t),r=ve(e);return["<script data-dt-bridge>","(() => {",` const streamId = ${n};`,` const token = ${r};`," let requestCounter = 0;"," const pending = new Map();"," const actionHandlers = new Map();"," const REQUEST_TIMEOUT_MS = 30000;",""," function createError(message) {"," return message instanceof Error ? message : new Error(String(message));"," }",""," function normalizeExecArgs(programOrShell, argsOrOpts, maybeOpts) {",' if (typeof programOrShell === "string" && /\\s/.test(programOrShell)'," && (argsOrOpts === undefined || argsOrOpts === null",' || (typeof argsOrOpts === "object" && !Array.isArray(argsOrOpts)))) {'," return {",' program: "sh",',' args: ["-c", programOrShell],',' options: (typeof argsOrOpts === "object" && argsOrOpts !== null) ? argsOrOpts : {},'," };"," }"," return {"," program: programOrShell,"," args: Array.isArray(argsOrOpts) ? argsOrOpts : [],"," options: (Array.isArray(argsOrOpts) ? maybeOpts : argsOrOpts) || {},"," };"," }",""," function request(kind, payload) {"," return new Promise((resolve, reject) => {"," const requestId = `dt-bridge-${Date.now()}-${++requestCounter}`;"," const timeout = window.setTimeout(() => {"," pending.delete(requestId);"," reject(new Error('DeskTalk bridge request timed out.'));"," }, REQUEST_TIMEOUT_MS);",""," pending.set(requestId, { resolve, reject, timeout });"," window.parent.postMessage({"," type: 'desktalk:bridge-request',"," streamId,"," token,"," requestId,"," kind,"," payload,"," }, '*');"," });"," }",""," function createCollectionStorage(name) {"," return Object.freeze({"," insert(params) {"," return request('storage', { action: 'collection.insert', collection: name, params }).then(() => undefined);"," },"," update(id, params) {"," return request('storage', { action: 'collection.update', collection: name, id, params }).then(() => undefined);"," },"," delete(id) {"," return request('storage', { action: 'collection.delete', collection: name, id }).then(() => undefined);"," },"," findById(id) {"," return request('storage', { action: 'collection.findById', collection: name, id }).then((result) => result.record);"," },"," find(filter, options) {"," return request('storage', { action: 'collection.find', collection: name, filter, options }).then((result) => result.records);"," },"," findAll() {"," return request('storage', { action: 'collection.findAll', collection: name }).then((result) => result.records);"," },"," count(filter) {"," return request('storage', { action: 'collection.count', collection: name, filter }).then((result) => result.count);"," },"," compact() {"," return request('storage', { action: 'collection.compact', collection: name }).then(() => undefined);"," },"," });"," }",""," const actions = Object.freeze({"," register(definition) {",' if (!definition || typeof definition !== "object") {',' throw new Error("DeskTalk.actions.register requires an action definition object.");'," }",' const name = typeof definition.name === "string" ? definition.name.trim() : "";'," if (!name) {",' throw new Error("DeskTalk.actions.register requires a non-empty action name.");'," }",' if (typeof definition.handler !== "function") {',' throw new Error(`DeskTalk.actions.register("${name}") requires a handler function.`);'," }"," actionHandlers.set(name, definition.handler);",' return request("actions", {',' action: "register",'," name,",' description: typeof definition.description === "string" ? definition.description : "",',' params: definition.params && typeof definition.params === "object" ? definition.params : undefined,'," }).then(() => undefined);"," },"," unregister(name) {",' const normalizedName = typeof name === "string" ? name.trim() : "";'," if (!normalizedName) {",' throw new Error("DeskTalk.actions.unregister requires a non-empty action name.");'," }"," actionHandlers.delete(normalizedName);",' return request("actions", { action: "unregister", name: normalizedName }).then(() => undefined);'," },"," clear() {"," actionHandlers.clear();",' return request("actions", { action: "clear" }).then(() => undefined);'," },"," });",""," const storage = Object.freeze({"," get(name) {"," return request('storage', { action: 'kv.get', name }).then((result) => result.value);"," },"," set(name, value) {"," return request('storage', { action: 'kv.set', name, value }).then(() => undefined);"," },"," delete(name) {"," return request('storage', { action: 'kv.delete', name }).then((result) => result.deleted);"," },"," list() {"," return request('storage', { action: 'kv.list' }).then((result) => result.names);"," },"," collection(name) {"," return createCollectionStorage(name);"," },"," });",""," window.addEventListener('message', (event) => {"," const message = event.data;"," if (!message || message.streamId !== streamId || message.token !== token) return;"," if (message.type === 'desktalk:bridge-response') {"," const pendingRequest = pending.get(message.requestId);"," if (!pendingRequest) return;"," pending.delete(message.requestId);"," window.clearTimeout(pendingRequest.timeout);"," if (message.ok) {"," pendingRequest.resolve(message.result);"," return;"," }",' pendingRequest.reject(createError(message.error || "DeskTalk bridge request failed."));'," return;"," }"," if (message.type !== 'desktalk:invoke-action') return;"," const handler = actionHandlers.get(message.actionName);"," if (!handler) {"," window.parent.postMessage({"," type: 'desktalk:invoke-action-result',"," streamId,"," token,"," requestId: message.requestId,"," ok: false,",' error: `Action "${String(message.actionName || "")}" is not registered.`,'," }, '*');"," return;"," }"," Promise.resolve()"," .then(() => handler(message.params || {}))"," .then((result) => {"," window.parent.postMessage({"," type: 'desktalk:invoke-action-result',"," streamId,"," token,"," requestId: message.requestId,"," ok: true,"," result,"," }, '*');"," })"," .catch((error) => {"," window.parent.postMessage({"," type: 'desktalk:invoke-action-result',"," streamId,"," token,"," requestId: message.requestId,"," ok: false,"," error: error instanceof Error ? error.message : String(error),"," }, '*');"," });"," });",""," window.DeskTalk = Object.freeze({"," getState(selector) {"," return request('getState', { selector });"," },"," request(url, options) {"," return request('request', { url, options: options || {} });"," },"," exec(programOrShell, argsOrOpts, maybeOpts) {"," const n = normalizeExecArgs(programOrShell, argsOrOpts, maybeOpts);"," return request('exec', { program: n.program, args: n.args, options: n.options });"," },"," execute(programOrShell, argsOrOpts, maybeOpts) {"," const n = normalizeExecArgs(programOrShell, argsOrOpts, maybeOpts);"," return request('exec', { program: n.program, args: n.args, options: n.options });"," },"," actions,"," storage,"," });","})();","<\/script>"].join(`
2
+ `)}(()=>{if(typeof document>"u")return;const t="desktalk-style-desktalk-miniapp-preview-1p9nnor";if(document.getElementById(t))return;const e=document.createElement("style");e.id=t,e.textContent=`/* src/components/PreviewToolbar.module.css */
3
+ .PreviewToolbar_toolbar {
4
+ display: flex;
5
+ flex-shrink: 0;
6
+ align-items: center;
7
+ gap: 12px;
8
+ padding: 8px 12px;
9
+ border-bottom: 1px solid var(--dt-border);
10
+ min-width: 0;
11
+ }
12
+ .PreviewToolbar_toolbarGroup {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 4px;
16
+ }
17
+ .PreviewToolbar_toolBtn {
18
+ display: flex;
19
+ width: 28px;
20
+ height: 28px;
21
+ flex-shrink: 0;
22
+ align-items: center;
23
+ justify-content: center;
24
+ padding: 0;
25
+ border: 1px solid var(--dt-border);
26
+ border-radius: 6px;
27
+ background: var(--dt-surface);
28
+ color: var(--dt-text);
29
+ cursor: pointer;
30
+ font-size: 14px;
31
+ line-height: 1;
32
+ transition:
33
+ background 0.15s,
34
+ border-color 0.15s,
35
+ color 0.15s;
36
+ }
37
+ .PreviewToolbar_toolBtn:hover:not(:disabled) {
38
+ border-color: var(--dt-accent);
39
+ background: var(--dt-surface-hover);
40
+ color: var(--dt-accent);
41
+ }
42
+ .PreviewToolbar_toolBtn:disabled {
43
+ cursor: default;
44
+ opacity: 0.35;
45
+ }
46
+ .PreviewToolbar_filename {
47
+ flex: 1;
48
+ overflow: hidden;
49
+ font-size: 13px;
50
+ font-weight: 500;
51
+ text-align: center;
52
+ text-overflow: ellipsis;
53
+ white-space: nowrap;
54
+ }
55
+ .PreviewToolbar_zoomIndicator {
56
+ min-width: 44px;
57
+ color: var(--dt-text-muted);
58
+ font-size: 12px;
59
+ font-variant-numeric: tabular-nums;
60
+ text-align: center;
61
+ }
62
+ .PreviewToolbar_browserNavGroup {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 4px;
66
+ flex-shrink: 0;
67
+ }
68
+ .PreviewToolbar_browserNavBtn {
69
+ display: flex;
70
+ width: 28px;
71
+ height: 28px;
72
+ align-items: center;
73
+ justify-content: center;
74
+ padding: 0;
75
+ border: 1px solid var(--dt-border);
76
+ border-radius: 6px;
77
+ background: var(--dt-surface);
78
+ color: var(--dt-text-secondary);
79
+ cursor: pointer;
80
+ transition:
81
+ background 0.15s,
82
+ border-color 0.15s,
83
+ color 0.15s;
84
+ }
85
+ .PreviewToolbar_browserNavBtn:hover:not(:disabled) {
86
+ border-color: var(--dt-accent);
87
+ background: var(--dt-surface-hover);
88
+ color: var(--dt-accent);
89
+ }
90
+ .PreviewToolbar_browserNavBtn:disabled {
91
+ cursor: default;
92
+ opacity: 0.3;
93
+ }
94
+ .PreviewToolbar_browserActionSpacer {
95
+ width: 28px;
96
+ height: 28px;
97
+ }
98
+ .PreviewToolbar_addressBar {
99
+ display: flex;
100
+ flex: 1;
101
+ align-items: center;
102
+ gap: 8px;
103
+ padding: 6px 12px;
104
+ border: 1px solid var(--dt-border);
105
+ border-radius: 20px;
106
+ background: var(--dt-bg-subtle);
107
+ min-width: 0;
108
+ overflow: hidden;
109
+ }
110
+ .PreviewToolbar_lockIcon {
111
+ flex-shrink: 0;
112
+ color: var(--dt-text-muted);
113
+ }
114
+ .PreviewToolbar_addressText {
115
+ flex: 1;
116
+ overflow: hidden;
117
+ color: var(--dt-text);
118
+ font-size: 13px;
119
+ text-overflow: ellipsis;
120
+ white-space: nowrap;
121
+ }
122
+ .PreviewToolbar_streamingIndicator {
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 8px;
126
+ width: 100%;
127
+ justify-content: center;
128
+ color: var(--dt-text-secondary);
129
+ font-size: 13px;
130
+ font-weight: 500;
131
+ }
132
+ .PreviewToolbar_streamingDot {
133
+ width: 8px;
134
+ height: 8px;
135
+ border-radius: 50%;
136
+ background: #22c55e;
137
+ animation: PreviewToolbar_pulse 1.5s ease-in-out infinite;
138
+ }
139
+ @keyframes PreviewToolbar_pulse {
140
+ 0%, 100% {
141
+ opacity: 1;
142
+ }
143
+ 50% {
144
+ opacity: 0.4;
145
+ }
146
+ }
147
+
148
+ /* src/components/ImageViewport.module.css */
149
+ .ImageViewport_viewport {
150
+ display: flex;
151
+ flex: 1;
152
+ width: 100%;
153
+ height: 100%;
154
+ min-height: 0;
155
+ align-items: center;
156
+ justify-content: center;
157
+ overflow: hidden;
158
+ outline: none;
159
+ }
160
+ .ImageViewport_image {
161
+ max-width: none;
162
+ max-height: none;
163
+ transform-origin: center center;
164
+ -webkit-user-select: none;
165
+ user-select: none;
166
+ pointer-events: none;
167
+ }
168
+
169
+ /* src/components/HtmlViewport.module.css */
170
+ .HtmlViewport_viewportContainer {
171
+ position: relative;
172
+ display: flex;
173
+ width: 100%;
174
+ height: 100%;
175
+ flex: 1;
176
+ min-height: 0;
177
+ }
178
+ .HtmlViewport_htmlViewport {
179
+ display: block;
180
+ width: 100%;
181
+ height: 100%;
182
+ flex: 1;
183
+ min-height: 0;
184
+ border: none;
185
+ }
186
+ .HtmlViewport_shimmerOverlay {
187
+ position: absolute;
188
+ inset: 0;
189
+ z-index: 1;
190
+ pointer-events: none;
191
+ background:
192
+ linear-gradient(
193
+ 110deg,
194
+ transparent 0%,
195
+ color-mix(in srgb, var(--dt-accent) 10%, transparent) 40%,
196
+ color-mix(in srgb, white 14%, transparent) 50%,
197
+ color-mix(in srgb, var(--dt-accent) 10%, transparent) 60%,
198
+ transparent 100%);
199
+ background-size: 220% 100%;
200
+ animation: HtmlViewport_viewportShimmer 1.8s ease-in-out infinite;
201
+ }
202
+ @keyframes HtmlViewport_viewportShimmer {
203
+ 0% {
204
+ background-position: 200% 0;
205
+ }
206
+ 100% {
207
+ background-position: -200% 0;
208
+ }
209
+ }
210
+
211
+ /* src/components/BridgeConfirmDialog.module.css */
212
+ .BridgeConfirmDialog_dialogOverlay {
213
+ position: fixed;
214
+ inset: 0;
215
+ z-index: 1000;
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ background: color-mix(in oklab, var(--dt-overlay) 78%, transparent);
220
+ }
221
+ .BridgeConfirmDialog_dialogCard {
222
+ width: min(520px, calc(100vw - 32px));
223
+ padding: 20px;
224
+ border: 1px solid var(--dt-border-strong);
225
+ border-radius: 16px;
226
+ background: var(--dt-surface);
227
+ box-shadow: 0 24px 60px var(--dt-shadow-color);
228
+ }
229
+ .BridgeConfirmDialog_dialogHeader {
230
+ display: flex;
231
+ align-items: flex-start;
232
+ gap: 12px;
233
+ margin-bottom: 16px;
234
+ }
235
+ .BridgeConfirmDialog_dialogIcon {
236
+ display: inline-flex;
237
+ width: 32px;
238
+ height: 32px;
239
+ align-items: center;
240
+ justify-content: center;
241
+ border-radius: 999px;
242
+ background: var(--dt-warning-subtle);
243
+ color: var(--dt-warning);
244
+ font-size: 18px;
245
+ }
246
+ .BridgeConfirmDialog_dialogTitle {
247
+ color: var(--dt-text);
248
+ font-size: 16px;
249
+ font-weight: 600;
250
+ }
251
+ .BridgeConfirmDialog_dialogSubtitle {
252
+ margin-top: 2px;
253
+ color: var(--dt-text-secondary);
254
+ font-size: 13px;
255
+ }
256
+ .BridgeConfirmDialog_dialogLabel {
257
+ margin-top: 12px;
258
+ margin-bottom: 6px;
259
+ color: var(--dt-text-muted);
260
+ font-size: 12px;
261
+ font-weight: 600;
262
+ letter-spacing: 0.04em;
263
+ text-transform: uppercase;
264
+ }
265
+ .BridgeConfirmDialog_dialogCode {
266
+ overflow-wrap: anywhere;
267
+ padding: 10px 12px;
268
+ border: 1px solid var(--dt-border-subtle);
269
+ border-radius: 10px;
270
+ background: var(--dt-bg-subtle);
271
+ color: var(--dt-text);
272
+ font-family: var(--font-mono);
273
+ font-size: 12px;
274
+ line-height: 1.5;
275
+ }
276
+ .BridgeConfirmDialog_dialogRisk {
277
+ margin-top: 14px;
278
+ color: var(--dt-text-secondary);
279
+ font-size: 13px;
280
+ line-height: 1.5;
281
+ }
282
+ .BridgeConfirmDialog_dialogActions {
283
+ display: flex;
284
+ justify-content: flex-end;
285
+ gap: 10px;
286
+ margin-top: 18px;
287
+ }
288
+ .BridgeConfirmDialog_dialogCancelButton,
289
+ .BridgeConfirmDialog_dialogConfirmButton {
290
+ border-radius: 10px;
291
+ padding: 9px 14px;
292
+ font: inherit;
293
+ cursor: pointer;
294
+ }
295
+ .BridgeConfirmDialog_dialogCancelButton {
296
+ border: 1px solid var(--dt-border);
297
+ background: var(--dt-surface);
298
+ color: var(--dt-text);
299
+ }
300
+ .BridgeConfirmDialog_dialogConfirmButton {
301
+ border: 1px solid var(--dt-warning);
302
+ background: var(--dt-warning);
303
+ color: var(--dt-text-on-accent);
304
+ font-weight: 600;
305
+ }
306
+
307
+ /* src/components/HtmlPreviewPane.module.css */
308
+ .HtmlPreviewPane_emptyState {
309
+ display: flex;
310
+ height: 100%;
311
+ align-items: center;
312
+ justify-content: center;
313
+ color: var(--dt-text-muted);
314
+ font-size: 14px;
315
+ }
316
+ .HtmlPreviewPane_errorState {
317
+ display: flex;
318
+ height: 100%;
319
+ flex-direction: column;
320
+ align-items: center;
321
+ justify-content: center;
322
+ gap: 8px;
323
+ color: var(--dt-text-muted);
324
+ font-size: 14px;
325
+ }
326
+ .HtmlPreviewPane_errorIcon {
327
+ font-size: 32px;
328
+ opacity: 0.5;
329
+ }
330
+
331
+ /* src/PreviewApp.module.css */
332
+ .PreviewApp_root {
333
+ display: flex;
334
+ height: 100%;
335
+ min-height: 0;
336
+ flex-direction: column;
337
+ overflow: hidden;
338
+ background: var(--dt-window-body);
339
+ color: var(--dt-text);
340
+ font-family: var(--font-sans);
341
+ }
342
+ .PreviewApp_imageViewportWrap {
343
+ display: flex;
344
+ flex: 1;
345
+ min-height: 0;
346
+ overflow: hidden;
347
+ }
348
+ .PreviewApp_emptyState {
349
+ display: flex;
350
+ height: 100%;
351
+ align-items: center;
352
+ justify-content: center;
353
+ color: var(--dt-text-muted);
354
+ font-size: 14px;
355
+ }
356
+ .PreviewApp_errorState {
357
+ display: flex;
358
+ height: 100%;
359
+ flex-direction: column;
360
+ align-items: center;
361
+ justify-content: center;
362
+ gap: 8px;
363
+ color: var(--dt-text-muted);
364
+ font-size: 14px;
365
+ }
366
+ .PreviewApp_errorIcon {
367
+ font-size: 32px;
368
+ opacity: 0.5;
369
+ }
370
+ /*# sourceMappingURL=frontend.css.map */
371
+ `,document.head.appendChild(e)})();var S=window.React,ce=S;S.Children;S.Component;S.Fragment;S.Profiler;S.PureComponent;S.StrictMode;S.Suspense;S.cloneElement;S.createContext;S.createElement;S.createRef;var Fe=S.forwardRef;S.isValidElement;S.lazy;S.memo;S.startTransition;var c=S.useCallback;S.useContext;S.useDebugValue;S.useDeferredValue;var L=S.useEffect;S.useId;var $e=S.useImperativeHandle;S.useInsertionEffect;S.useLayoutEffect;var ge=S.useMemo;S.useReducer;var W=S.useRef,$=S.useState;S.useSyncExternalStore;S.useTransition;S.version;var Ce=window.ReactDOM,We=Ce.createRoot;Ce.hydrateRoot;var we=t=>{let e;const n=new Set,r=(p,f)=>{const x=typeof p=="function"?p(e):p;if(!Object.is(x,e)){const A=e;e=f??(typeof x!="object"||x===null)?x:Object.assign({},e,x),n.forEach(D=>D(e,A))}},s=()=>e,w={setState:r,getState:s,getInitialState:()=>B,subscribe:p=>(n.add(p),()=>n.delete(p))},B=e=t(r,s,w);return w},Ge=t=>t?we(t):we,Ue=t=>t;function le(t,e=Ue){const n=ce.useSyncExternalStore(t.subscribe,ce.useCallback(()=>e(t.getState()),[t,e]),ce.useCallback(()=>e(t.getInitialState()),[t,e]));return ce.useDebugValue(n),n}var T={toolbar:"PreviewToolbar_toolbar",toolbarGroup:"PreviewToolbar_toolbarGroup",toolBtn:"PreviewToolbar_toolBtn",filename:"PreviewToolbar_filename",zoomIndicator:"PreviewToolbar_zoomIndicator",browserNavGroup:"PreviewToolbar_browserNavGroup",browserNavBtn:"PreviewToolbar_browserNavBtn",browserActionSpacer:"PreviewToolbar_browserActionSpacer",addressBar:"PreviewToolbar_addressBar",lockIcon:"PreviewToolbar_lockIcon",addressText:"PreviewToolbar_addressText",streamingIndicator:"PreviewToolbar_streamingIndicator",streamingDot:"PreviewToolbar_streamingDot"},ue=window.__desktalk_jsx_runtime,i=ue.jsx,O=ue.jsxs;ue.jsxDEV;var me=ue.Fragment;function he({filename:t,filepath:e,mode:n,zoomPercent:r,canGoPrev:s,canGoNext:b,onZoomIn:_,onZoomOut:w,onFitToWindow:B,onActualSize:p,onPrevious:f,onNext:x,streaming:A,onRefreshFromFile:D,onEditSource:a}){return n==="html"||n==="stream"?O("div",{className:T.toolbar,children:[i("div",{className:T.browserNavGroup,children:!A&&D?i("button",{className:T.browserNavBtn,onClick:D,title:"Refresh","aria-label":"Refresh",children:O("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[i("polyline",{points:"23 4 23 10 17 10"}),i("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]})}):i("button",{className:T.browserNavBtn,disabled:!0,"aria-hidden":"true",children:O("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[i("polyline",{points:"23 4 23 10 17 10"}),i("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]})})}),i("div",{className:T.addressBar,children:A?O("div",{className:T.streamingIndicator,children:[i("span",{className:T.streamingDot}),i("span",{children:"Streaming..."})]}):O(me,{children:[O("svg",{className:T.lockIcon,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[i("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),i("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]}),O("span",{className:T.addressText,title:e||t,children:["file://",ze(e||t)]})]})}),i("div",{className:T.browserNavGroup,children:a&&!A?i("button",{className:T.browserNavBtn,onClick:a,title:"Edit in TextEdit","aria-label":"Edit in TextEdit",children:O("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[i("path",{d:"M12 20h9"}),i("path",{d:"M16.5 3.5a2.12 2.12 0 1 1 3 3L7 19l-4 1 1-4Z"})]})}):i("div",{className:T.browserActionSpacer,"aria-hidden":"true"})})]}):O("div",{className:T.toolbar,children:[O("div",{className:T.toolbarGroup,children:[i("button",{className:T.toolBtn,onClick:f,disabled:!s,title:"Previous image",children:"◀"}),i("button",{className:T.toolBtn,onClick:x,disabled:!b,title:"Next image",children:"▶"})]}),i("span",{className:T.filename,title:t,children:t}),O("div",{className:T.toolbarGroup,children:[i("button",{className:T.toolBtn,onClick:w,title:"Zoom out",children:"−"}),O("span",{className:T.zoomIndicator,children:[r??100,"%"]}),i("button",{className:T.toolBtn,onClick:_,title:"Zoom in",children:"+"}),i("button",{className:T.toolBtn,onClick:B,title:"Fit to window",children:"⤢"}),i("button",{className:T.toolBtn,onClick:p,title:"Actual size (1:1)",children:"1:1"})]})]})}var ke={viewport:"ImageViewport_viewport",image:"ImageViewport_image"},re=50;function Ze({dataUrl:t,zoom:e,onZoomChange:n}){const r=W(null),[s,b]=$(0),[_,w]=$(0),[B,p]=$(!1),f=W({x:0,y:0,panX:0,panY:0});L(()=>{b(0),w(0)},[t]);const x=c(l=>{l.preventDefault();const u=l.deltaY>0?-.1:.1,I=Math.max(.1,Math.min(10,e+u));n(I)},[e,n]);L(()=>{const l=r.current;if(l)return l.addEventListener("wheel",x,{passive:!1}),()=>l.removeEventListener("wheel",x)},[x]);const A=c(l=>{l.button===0&&(p(!0),f.current={x:l.clientX,y:l.clientY,panX:s,panY:_})},[s,_]),D=c(l=>{if(!B)return;const u=l.clientX-f.current.x,I=l.clientY-f.current.y;b(f.current.panX+u),w(f.current.panY+I)},[B]),a=c(()=>{p(!1)},[]);L(()=>{const l=r.current;if(!l)return;const u=I=>{switch(I.key){case"ArrowUp":I.preventDefault(),w(E=>E+re);break;case"ArrowDown":I.preventDefault(),w(E=>E-re);break;case"ArrowLeft":I.preventDefault(),b(E=>E+re);break;case"ArrowRight":I.preventDefault(),b(E=>E-re);break}};return l.addEventListener("keydown",u),()=>l.removeEventListener("keydown",u)},[]);const g=c(l=>{switch(l){case"up":w(u=>u+re);break;case"down":w(u=>u-re);break;case"left":b(u=>u+re);break;case"right":b(u=>u-re);break}},[]);return L(()=>{const l=r.current;l&&(l.panInDirection=g)},[g]),i("div",{ref:r,className:ke.viewport,onMouseDown:A,onMouseMove:D,onMouseUp:a,onMouseLeave:a,tabIndex:0,style:{cursor:B?"grabbing":"grab"},children:i("img",{className:ke.image,src:t,alt:"",draggable:!1,style:{transform:`translate(${s}px, ${_}px) scale(${e})`}})})}var pe={viewportContainer:"HtmlViewport_viewportContainer",htmlViewport:"HtmlViewport_htmlViewport",shimmerOverlay:"HtmlViewport_shimmerOverlay"},be="#f7f7fa",ye="#101114",Ee=Fe(function({html:e,src:n,streaming:r,onBridgeRequest:s,onInvokeActionResult:b,onLoad:_,theme:w},B){const p=W(null),f=W(0),x=W(!1),A=W(!!r),D=c(()=>{const a=p.current;if(!a||!w)return;const g=w.mode==="dark"?ye:be;a.style.backgroundColor=g;const l=a.contentDocument;l?.documentElement&&(l.documentElement.dataset.theme=w.mode,l.documentElement.style.colorScheme=w.mode,l.documentElement.style.backgroundColor=g),l?.body&&(l.body.style.backgroundColor=g);const u={type:"desktalk:theme-update",accentColor:w.accentColor,mode:w.mode};a.contentWindow?.postMessage(u,"*")},[w]);return $e(B,()=>({postInvokeAction(a){p.current?.contentWindow?.postMessage(a,"*")}}),[]),L(()=>{if(!s&&!b)return;const a=g=>{const l=p.current;if(!l||g.source!==l.contentWindow)return;const u=g.data;if(u){if(u.type==="desktalk:bridge-request"){if(!s)return;s(u,I=>{l.contentWindow?.postMessage(I,"*")});return}u.type==="desktalk:invoke-action-result"&&b?.(u)}};return window.addEventListener("message",a),()=>window.removeEventListener("message",a)},[s,b]),L(()=>{D()},[D]),L(()=>{if(n){p.current?.contentDocument?.close(),f.current=0,x.current=!1,A.current=!1;return}if(e===void 0)return;const a=p.current;if(!a)return;const g=a.contentDocument;if(!g)return;const l=A.current;if(A.current=!!r,!r){if(l&&x.current){const I=e.slice(f.current);I.length>0&&(g.write(I),f.current=e.length),g.close(),x.current=!1;return}g.open(),g.write(e),g.close(),f.current=e.length,x.current=!1;return}x.current||(g.open(),x.current=!0,f.current=0);const u=e.slice(f.current);u.length>0&&(g.write(u),f.current=e.length)},[e,n,r]),O("div",{className:pe.viewportContainer,children:[r?i("div",{className:pe.shimmerOverlay,"aria-hidden":"true"}):null,i("iframe",{ref:p,className:pe.htmlViewport,sandbox:r?"allow-same-origin":"allow-scripts allow-same-origin",title:"HTML Preview",src:n,onLoad:()=>{D(),_?.()},style:{backgroundColor:w?.mode==="dark"?ye:be}})]})});function ae(t){return t?t.replace(/\\/g,"/"):null}function Ye(t,e){const r=(ae(t)??t).split("/").filter(Boolean).map(_=>encodeURIComponent(_)).join("/"),s=new URLSearchParams;e?.streamId&&s.set("streamId",e.streamId),e?.token&&s.set("token",e.token),e?.accentColor&&s.set("accent",e.accentColor),e?.theme&&s.set("theme",e.theme),e?.cacheBust&&s.set("t",e.cacheBust);const b=s.toString();return b?`/@dtfs/${r}?${b}`:`/@dtfs/${r}`}function Xe(t){const e=ae(t);return e?e===".data/liveapps"||e.startsWith(".data/liveapps/"):!1}function Ie(t,e){const n=ae(t),r=ae(e);return!n||!r?!1:n===r||n.endsWith(`/${r}`)}var U={dialogOverlay:"BridgeConfirmDialog_dialogOverlay",dialogCard:"BridgeConfirmDialog_dialogCard",dialogHeader:"BridgeConfirmDialog_dialogHeader",dialogIcon:"BridgeConfirmDialog_dialogIcon",dialogTitle:"BridgeConfirmDialog_dialogTitle",dialogSubtitle:"BridgeConfirmDialog_dialogSubtitle",dialogLabel:"BridgeConfirmDialog_dialogLabel",dialogCode:"BridgeConfirmDialog_dialogCode",dialogRisk:"BridgeConfirmDialog_dialogRisk",dialogActions:"BridgeConfirmDialog_dialogActions",dialogCancelButton:"BridgeConfirmDialog_dialogCancelButton",dialogConfirmButton:"BridgeConfirmDialog_dialogConfirmButton"};function Ae({command:t,cwd:e,risk:n,onConfirm:r,onCancel:s}){return i("div",{className:U.dialogOverlay,onClick:s,children:O("div",{className:U.dialogCard,onClick:b=>b.stopPropagation(),children:[O("div",{className:U.dialogHeader,children:[i("span",{className:U.dialogIcon,children:"⚠"}),O("div",{children:[i("div",{className:U.dialogTitle,children:"Confirm command execution"}),i("div",{className:U.dialogSubtitle,children:"This generated page is requesting a risky command."})]})]}),i("div",{className:U.dialogLabel,children:"Command"}),i("div",{className:U.dialogCode,children:t}),i("div",{className:U.dialogLabel,children:"Working directory"}),i("div",{className:U.dialogCode,children:e}),i("div",{className:U.dialogRisk,children:n}),O("div",{className:U.dialogActions,children:[i("button",{type:"button",className:U.dialogCancelButton,onClick:s,children:"Cancel"}),i("button",{type:"button",className:U.dialogConfirmButton,onClick:r,children:"Run command"})]})]})})}var Ke={emptyState:"HtmlPreviewPane_emptyState"};function Je(t){let e,n=null,r=!1;if(window.dispatchEvent(new CustomEvent("desktalk:bridge:get-state",{detail:{selector:t,resolve:s=>{r=!0,e=s},reject:s=>{n=new Error(s)}}})),n)throw n;if(!r)throw new Error("DeskTalk core state bridge is unavailable.");return e}function Qe(t){const e=ae(t);return e?e.split("/").filter(Boolean).at(-1)??e:null}function et({initialPath:t,liveAppId:e,bridgeToken:n,theme:r,onActionStateChange:s,onLiveAppActionsChange:b,onLiveAppActionInvokerChange:_}){const w=_e(),B=je(),p=W(null),f=W(new Map),x=W(new Map),[A,D]=$(0),[a,g]=$(null),l=F("preview.bridge.registerSession"),u=F("preview.bridge.exec"),I=F("preview.bridge.exec.confirm"),E=F("preview.bridge.storage"),Z=F("preview.bridge.request"),M=ae(t),j=ge(()=>Qe(t),[t]),C=!!(e&&n&&Xe(t)),z=!!(C&&M),R=c(()=>{b(Array.from(f.current.values()))},[b]),q=c(d=>{for(const N of x.current.values())clearTimeout(N.timeout),N.reject(new Error(d));x.current.clear()},[]),V=c(()=>{f.current.clear(),R()},[R]),te=ge(()=>M?Ye(M,{streamId:C?e:void 0,token:C?n:void 0,accentColor:C?r.accentColor:void 0,theme:C?r.mode:void 0,cacheBust:A>0?String(A):void 0}):null,[n,e,M,A,C,r]);de("preview.file-changed",d=>{Ie(d.filePath,M)&&(V(),q("LiveApp reloaded before the action completed."),D(Date.now()))}),L(()=>{!C||!e||!n||l({streamId:e,token:n}).catch(d=>{console.error("Failed to register preview bridge session:",d)})},[n,e,l,C]);const ee=c(d=>{switch(d.selector){case"desktop.summary":case"desktop.windows":case"desktop.focusedWindow":case"theme.current":return Je(d.selector);case"preview.context":return{windowId:w,mode:"html",liveAppId:e,title:j,path:M};default:throw new Error(`Unsupported DeskTalk bridge selector: ${String(d.selector)}`)}},[j,e,M,w]),K=c((d,N)=>{if(!C||!e||!n)return Promise.reject(new Error("DeskTalk LiveApp actions are unavailable."));if(!p.current)return Promise.reject(new Error("LiveApp viewport is not ready."));const P=`liveapp-action-${Date.now()}-${Math.random().toString(36).slice(2,10)}`;return new Promise((m,o)=>{const y=setTimeout(()=>{x.current.delete(P),o(new Error(`LiveApp action "${d}" timed out.`))},1e4);x.current.set(P,{resolve:m,reject:o,timeout:y}),p.current?.postInvokeAction({type:"desktalk:invoke-action",streamId:e,token:n,requestId:P,actionName:d,params:N??null})})},[n,e,C]);L(()=>{if(!C){_(null),b([]);return}return _(K),()=>{_(null)}},[K,_,b,C]),L(()=>()=>{q("LiveApp action invocation was interrupted."),V(),_(null)},[V,_,q]);const Y=c(d=>{if(!C||d.streamId!==e||d.token!==n)return;const N=x.current.get(d.requestId);if(N){if(clearTimeout(N.timeout),x.current.delete(d.requestId),d.ok){N.resolve(d.result);return}N.reject(new Error(d.error||"LiveApp action failed."))}},[n,e,C]),G=c(()=>{C&&(V(),q("LiveApp reloaded before the action completed."))},[V,q,C]),J=c((d,N)=>{const P=m=>{N({type:"desktalk:bridge-response",streamId:d.streamId,token:d.token,requestId:d.requestId,...m})};if(!C||!e||!n){P({ok:!1,error:"DeskTalk bridge is only available for LiveApps."});return}if(d.streamId!==e||d.token!==n){P({ok:!1,error:"DeskTalk bridge token mismatch."});return}if(d.kind==="getState"){try{P({ok:!0,result:ee(d.payload)})}catch(m){P({ok:!1,error:m.message})}return}if(d.kind==="storage"){E({streamId:e,token:n,liveAppId:e,request:d.payload}).then(m=>{P({ok:!0,result:m})}).catch(m=>{P({ok:!1,error:m.message})});return}if(d.kind==="request"){Z({streamId:e,token:n,request:d.payload}).then(m=>{P({ok:!0,result:m})}).catch(m=>{P({ok:!1,error:m.message})});return}if(d.kind==="actions"){const m=d.payload;if(m.action==="register"){f.current.set(m.name,{name:m.name,description:m.description,params:m.params}),R(),P({ok:!0,result:{ok:!0}});return}if(m.action==="unregister"){f.current.delete(m.name),R(),P({ok:!0,result:{ok:!0}});return}if(m.action==="clear"){V(),P({ok:!0,result:{ok:!0}});return}P({ok:!1,error:"Unsupported DeskTalk actions request."});return}if(d.kind!=="exec"){P({ok:!1,error:`Unsupported DeskTalk bridge request: ${d.kind}`});return}if(a){P({ok:!1,error:"A command confirmation is already waiting for user input."});return}u({...d.payload,streamId:e,token:n}).then(m=>{if(m.status==="completed"){P({ok:!0,result:m.result});return}if(m.status==="requires_confirmation"){g({confirmationRequestId:m.requestId,bridgeRequestId:d.requestId,commandPreview:m.commandPreview,cwd:m.cwd,reason:m.reason,respond:N});return}P({ok:!1,error:m.reason})}).catch(m=>{P({ok:!1,error:m.message})})},[n,u,e,a,Z,R,V,ee,C,E]),ne=c(async d=>{if(!a||!n||!e)return;const N=a.respond,P=a.bridgeRequestId,m=a.confirmationRequestId;g(null);try{const o=await I({requestId:m,confirmed:d});N({type:"desktalk:bridge-response",streamId:e,token:n,requestId:P,ok:o.status==="completed",result:o.status==="completed"?o.result:void 0,error:o.status==="completed"?void 0:o.reason})}catch(o){N({type:"desktalk:bridge-response",streamId:e,token:n,requestId:P,ok:!1,error:o.message})}},[n,I,e,a]),ie=c(()=>{!M||!C||B("text-edit",{path:M})},[M,B,C]);return L(()=>{s({mode:"html",streaming:!1,file:M&&j?{name:j,path:M,kind:"html"}:null})},[j,M,s]),te&&j?O(me,{children:[i(he,{filename:j,filepath:M??void 0,mode:"html",onEditSource:z?ie:void 0}),i(Ee,{ref:p,src:te,theme:r,onBridgeRequest:C?J:void 0,onInvokeActionResult:C?Y:void 0,onLoad:C?G:void 0}),a?i(Ae,{command:a.commandPreview,cwd:a.cwd,risk:a.reason,onConfirm:()=>{ne(!0)},onCancel:()=>{ne(!1)}}):null]}):i("div",{className:Ke.emptyState,children:"Loading HTML..."})}function tt({children:t,state:e,onFileOpened:n,onZoomIn:r,onZoomOut:s,onFitToWindow:b,onActualSize:_,onPan:w,onPrevious:B,onNext:p,liveAppActions:f,onInvokeLiveAppAction:x}){const A=F("preview.open"),D=c(async z=>{const R=z?.path;if(!R)return{error:"path parameter is required"};const q=await A({path:R});return n(q),q},[A,n]),a=c(async()=>e,[e]),g=c(async()=>{r()},[r]),l=c(async()=>{s()},[s]),u=c(async()=>{b()},[b]),I=c(async()=>{_()},[_]),E=c(async z=>{const R=z?.direction;if(!R)return{error:"direction parameter is required"};w(R)},[w]),Z=c(async()=>{B()},[B]),M=c(async()=>{p()},[p]),j=e.mode==="image",C=ge(()=>{const z=[{name:"Get State",description:"Get the current preview mode and opened file",handler:a},{name:"Open File",description:"Open an image or HTML file for preview",params:{path:{type:"string",description:"Path to the file",required:!0}},handler:D}];j&&z.push({name:"Zoom In",description:"Increase zoom level by one step",handler:g},{name:"Zoom Out",description:"Decrease zoom level by one step",handler:l},{name:"Fit to Window",description:"Scale image to fit the viewport",handler:u},{name:"Actual Size",description:"Display image at 1:1 pixel ratio",handler:I},{name:"Pan",description:"Pan the viewport in a direction",params:{direction:{type:"string",description:'Direction to pan: "up", "down", "left", or "right"',required:!0}},handler:E},{name:"Previous File",description:"Navigate to previous image in directory",handler:Z},{name:"Next File",description:"Navigate to next image in directory",handler:M});const R=new Map;for(const q of z)R.set(q.name,q);for(const q of f)R.set(q.name,{...q,handler:async V=>x(q.name,V)});return Array.from(R.values())},[I,u,a,M,D,E,Z,g,l,j,f,x]);return O(qe,{children:[C.map(z=>i(He,{name:z.name,description:z.description,params:z.params,handler:z.handler},z.name)),t]})}var nt=/\s*<link\b[^>]*\bdata-dt-theme\b[^>]*>\s*/gi,rt=/\s*<script\b[^>]*\bdata-dt-theme-sync\b[^>]*>[\s\S]*?<\/script>\s*/gi,ot=/\s*<script\b[^>]*\bdata-dt-ui\b[^>]*><\/script>\s*/gi,it=/\s*<script\b[^>]*\bdata-dt-bridge\b[^>]*>[\s\S]*?<\/script>\s*/gi,at=/^\s*<!DOCTYPE html><html><head>\s*(?=<!DOCTYPE html>)/i;function st(t){return t.replace(nt,`
372
+ `).replace(rt,`
373
+ `).replace(ot,`
374
+ `).replace(it,`
375
+ `).replace(at,"").trimStart()}var lt='<script src="/api/ui/desktalk-ui.js" data-dt-ui><\/script>';function ct(t,e){return`<link rel="stylesheet" href="/api/ui/desktalk-theme.css?${new URLSearchParams({accent:t,theme:e}).toString()}" data-dt-theme>`}function dt(t,e){return`<script data-dt-theme-sync>
376
+ (() => {
377
+ const THEME_MESSAGE = 'desktalk:theme-update';
378
+ const THEME_SELECTOR = 'link[data-dt-theme]';
379
+ const updateTheme = (nextAccent, nextMode) => {
380
+ const params = new URLSearchParams({ accent: nextAccent, theme: nextMode });
381
+ const href = '/api/ui/desktalk-theme.css?' + params.toString();
382
+ let link = document.querySelector(THEME_SELECTOR);
383
+ if (!link) {
384
+ link = document.createElement('link');
385
+ link.rel = 'stylesheet';
386
+ link.setAttribute('data-dt-theme', '');
387
+ document.head.prepend(link);
388
+ }
389
+ link.href = href;
390
+ document.documentElement.dataset.theme = nextMode;
391
+ document.documentElement.style.colorScheme = nextMode;
392
+ document.documentElement.style.backgroundColor = nextMode === 'dark' ? '#101114' : '#f7f7fa';
393
+ document.body?.style.setProperty('background-color', nextMode === 'dark' ? '#101114' : '#f7f7fa');
394
+ };
395
+ updateTheme(${JSON.stringify(t)}, ${JSON.stringify(e)});
396
+ window.addEventListener('message', (event) => {
397
+ const data = event.data;
398
+ if (!data || data.type !== THEME_MESSAGE) return;
399
+ updateTheme(data.accentColor, data.mode === 'light' ? 'light' : 'dark');
400
+ });
401
+ })();
402
+ <\/script>`}function ut(t,e){const n=t.match(/<head(\s[^>]*)?>|<head>/i);if(n&&n.index!==void 0){const r=n.index+n[0].length;return t.slice(0,r)+`
403
+ `+e+`
404
+ `+t.slice(r)}return e+`
405
+ `+t}function fe(t,e){const n=st(t),r=[ct(e.theme.accentColor,e.theme.mode),dt(e.theme.accentColor,e.theme.mode),lt,Ve(e.streamId,e.bridgeToken)].join(`
406
+ `);return ut(n,r)}function mt(t){return t.trim().toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9._-]/g,"")||"preview"}function pt(t,e){return`${mt(e)}_${t}`}function ft(t){let e,n=null,r=!1;if(window.dispatchEvent(new CustomEvent("desktalk:bridge:get-state",{detail:{selector:t,resolve:s=>{r=!0,e=s},reject:s=>{n=new Error(s)}}})),n)throw n;if(!r)throw new Error("DeskTalk core state bridge is unavailable.");return e}function gt({previewStore:t,streamId:e,streamTitle:n,bridgeToken:r,theme:s,onActionStateChange:b,onLiveAppActionsChange:_,onLiveAppActionInvokerChange:w}){const B=_e(),p=le(t,o=>o.streaming),f=W(null),[x,A]=$(""),[D,a]=$(null),[g,l]=$(null),u=W(x),I=W(new Map),E=W(new Map),Z=F("preview.stream.load-html"),M=F("preview.stream.save-html"),j=F("preview.bridge.registerSession"),C=F("preview.bridge.exec"),z=F("preview.bridge.exec.confirm"),R=F("preview.bridge.storage"),q=F("preview.bridge.request"),V=pt(e,n),te=c(()=>{t.getState().switchToHtmlMode(`.data/liveapps/${V}/index.html`,V)},[V,t]),ee=c(o=>{t.getState().setStreaming(o)},[t]),K=c(()=>{_(Array.from(I.current.values()))},[_]),Y=c(o=>{for(const y of E.current.values())clearTimeout(y.timeout),y.reject(new Error(o));E.current.clear()},[]),G=c(()=>{I.current.clear(),K()},[K]);L(()=>{u.current=x},[x]),L(()=>{b({mode:"stream",streaming:p,file:{name:D?.name??n,path:D?.path??null,kind:"stream"}})},[b,D,n,p]),de("preview.file-changed",o=>{if(!Ie(o.filePath,D?.path))return;G(),Y("LiveApp reloaded before the action completed.");const y=r?fe(o.content,{theme:s,streamId:e,bridgeToken:r}):o.content;A(y),u.current=y,ee(!1),a(h=>h&&{...h,content:o.content}),te()}),de("preview.html-chunk",o=>{o.streamId===e&&A(y=>{const h=y+o.chunk;return u.current=h,h})}),de("preview.html-done",o=>{if(o.streamId!==e)return;G(),Y("LiveApp reloaded before the action completed."),ee(!1);const y=typeof o.html=="string"?o.html:u.current;M({streamId:e,title:n,content:y}).then(h=>{a(h),te()}).catch(h=>{console.error("Failed to save LiveApp HTML:",h)})}),L(()=>{let o=!1;return Z({streamId:e,title:n}).then(y=>{if(o||!y)return;G(),Y("LiveApp reloaded before the action completed.");const h=r?fe(y.content,{theme:s,streamId:e,bridgeToken:r}):y.content;A(h),u.current=h,a(y),ee(!1),te()}).catch(y=>{o||console.error("Failed to load LiveApp HTML snapshot:",y)}),()=>{o=!0}},[r,Z,ee,e,n,te,s]),L(()=>{if(!r){w(null),_([]);return}j({streamId:e,token:r}).catch(o=>{console.error("Failed to register preview bridge session:",o)})},[r,w,_,j,e]);const J=c(o=>{switch(o.selector){case"desktop.summary":case"desktop.windows":case"desktop.focusedWindow":case"theme.current":return ft(o.selector);case"preview.context":return{windowId:B,mode:"stream",streamId:e,title:n,path:null};default:throw new Error(`Unsupported DeskTalk bridge selector: ${String(o.selector)}`)}},[e,n,B]),ne=c((o,y)=>{if(!r)return Promise.reject(new Error("DeskTalk LiveApp actions are unavailable."));if(!f.current)return Promise.reject(new Error("LiveApp viewport is not ready."));const h=`liveapp-action-${Date.now()}-${Math.random().toString(36).slice(2,10)}`;return new Promise((k,oe)=>{const X=setTimeout(()=>{E.current.delete(h),oe(new Error(`LiveApp action "${o}" timed out.`))},1e4);E.current.set(h,{resolve:k,reject:oe,timeout:X}),f.current?.postInvokeAction({type:"desktalk:invoke-action",streamId:e,token:r,requestId:h,actionName:o,params:y??null})})},[r,e]);L(()=>{if(r)return w(ne),()=>{w(null)}},[r,ne,w]),L(()=>()=>{Y("LiveApp action invocation was interrupted."),G(),w(null)},[G,w,Y]);const ie=c(o=>{if(!r||o.streamId!==e||o.token!==r)return;const y=E.current.get(o.requestId);if(y){if(clearTimeout(y.timeout),E.current.delete(o.requestId),o.ok){y.resolve(o.result);return}y.reject(new Error(o.error||"LiveApp action failed."))}},[r,e]),d=c(()=>{r&&(G(),Y("LiveApp reloaded before the action completed."))},[r,G,Y]),N=c((o,y)=>{const h=k=>{y({type:"desktalk:bridge-response",streamId:o.streamId,token:o.token,requestId:o.requestId,...k})};if(!r){h({ok:!1,error:"DeskTalk bridge is only available for generated HTML previews."});return}if(o.streamId!==e||o.token!==r){h({ok:!1,error:"DeskTalk bridge token mismatch."});return}if(o.kind==="getState"){try{h({ok:!0,result:J(o.payload)})}catch(k){h({ok:!1,error:k.message})}return}if(o.kind==="storage"){R({streamId:e,token:r,liveAppId:V,request:o.payload}).then(k=>{h({ok:!0,result:k})}).catch(k=>{h({ok:!1,error:k.message})});return}if(o.kind==="request"){q({streamId:e,token:r,request:o.payload}).then(k=>{h({ok:!0,result:k})}).catch(k=>{h({ok:!1,error:k.message})});return}if(o.kind==="actions"){const k=o.payload;if(k.action==="register"){I.current.set(k.name,{name:k.name,description:k.description,params:k.params}),K(),h({ok:!0,result:{ok:!0}});return}if(k.action==="unregister"){I.current.delete(k.name),K(),h({ok:!0,result:{ok:!0}});return}if(k.action==="clear"){G(),h({ok:!0,result:{ok:!0}});return}h({ok:!1,error:"Unsupported DeskTalk actions request."});return}if(o.kind!=="exec"){h({ok:!1,error:`Unsupported DeskTalk bridge request: ${o.kind}`});return}if(g){h({ok:!1,error:"A command confirmation is already waiting for user input."});return}C({...o.payload,streamId:e,token:r}).then(k=>{if(k.status==="completed"){h({ok:!0,result:k.result});return}if(k.status==="requires_confirmation"){l({confirmationRequestId:k.requestId,bridgeRequestId:o.requestId,commandPreview:k.commandPreview,cwd:k.cwd,reason:k.reason,respond:y});return}h({ok:!1,error:k.reason})}).catch(k=>{h({ok:!1,error:k.message})})},[r,C,V,g,q,K,G,J,R,e]),P=c(async o=>{if(!g||!r)return;const y=g.respond,h=g.bridgeRequestId,k=r,oe=g.confirmationRequestId;l(null);try{const X=await z({requestId:oe,confirmed:o});y({type:"desktalk:bridge-response",streamId:e,token:k,requestId:h,ok:X.status==="completed",result:X.status==="completed"?X.result:void 0,error:X.status==="completed"?void 0:X.reason})}catch(X){y({type:"desktalk:bridge-response",streamId:e,token:k,requestId:h,ok:!1,error:X.message})}},[r,z,g,e]),m=c(()=>{Z({streamId:e,title:n}).then(o=>{if(!o)throw new Error("Saved LiveApp HTML file was not found.");const y=r?fe(o.content,{theme:s,streamId:e,bridgeToken:r}):o.content;A(y),u.current=y,a(o)}).catch(o=>{console.error("Failed to refresh LiveApp HTML from file:",o)})},[r,Z,e,n,s]);return O(me,{children:[i(he,{filename:n,filepath:D?.path,mode:"stream",streaming:p,onRefreshFromFile:!p&&D?m:void 0}),i(Ee,{ref:f,html:x,streaming:p,theme:s,onBridgeRequest:N,onInvokeActionResult:ie,onLoad:d}),g?i(Ae,{command:g.commandPreview,cwd:g.cwd,risk:g.reason,onConfirm:()=>{P(!0)},onCancel:()=>{P(!1)}}):null]})}function ht(t,e=null,n=null){return Ge(r=>({mode:t,streaming:t==="stream",resolvedHtmlPath:t==="html"?e:null,resolvedLiveAppId:t==="html"?n:null,setStreaming(s){r({streaming:s})},switchToHtmlMode(s,b){r({mode:"html",streaming:!1,resolvedHtmlPath:s,resolvedLiveAppId:b??null})}}))}var se={root:"PreviewApp_root",imageViewportWrap:"PreviewApp_imageViewportWrap",emptyState:"PreviewApp_emptyState",errorState:"PreviewApp_errorState",errorIcon:"PreviewApp_errorIcon"},xe=.25,Se=.1,Pe=10;function vt(t){if(t?.streamId&&typeof t.streamId=="string")return"stream";if(typeof t?.path=="string"){const e=t.path.toLowerCase();if(e.endsWith(".html")||e.endsWith(".htm"))return"html"}return"image"}function wt({initialPath:t,initialMode:e,liveAppId:n,streamId:r,streamTitle:s,bridgeToken:b,theme:_,windowId:w}){const B=W(null);B.current||(B.current=ht(e,t??null,n??null));const p=B.current,f=le(p,v=>v.mode),x=le(p,v=>v.streaming),A=le(p,v=>v.resolvedHtmlPath),D=le(p,v=>v.resolvedLiveAppId),[a,g]=$(null),[l,u]=$(null),[I,E]=$(1),[Z,M]=$(null),j=W(null),C=W(null),[z,R]=$({mode:"html",streaming:!1,file:null}),[q,V]=$({mode:"stream",streaming:e==="stream",file:s?{name:s,path:null,kind:"stream"}:null}),[te,ee]=$([]),[K,Y]=$(_);L(()=>{Y(_)},[_]),L(()=>{const v=H=>{const Q=H.detail;!Q||Q.windowId!==w||Q.miniAppId!=="preview"||Y({accentColor:Q.theme.accentColor,mode:Q.theme.mode==="light"?"light":"dark"})};return window.addEventListener("desktalk:theme-update",v),()=>window.removeEventListener("desktalk:theme-update",v)},[w]);const G=F("preview.open"),J=F("preview.siblings"),ne=F("preview.next"),ie=F("preview.previous"),d=c(v=>{M(null),g(v),E(1),J({path:v.path}).then(u).catch(console.error)},[J]);L(()=>{t&&f==="image"&&G({path:t}).then(d).catch(console.error)},[d,t,f,G]);const N=c(()=>{E(v=>Math.min(Pe,v+xe))},[]),P=c(()=>{E(v=>Math.max(Se,v-xe))},[]),m=c(()=>{if(!a||!j.current){E(1);return}const H=j.current.getBoundingClientRect(),Q=H.width/a.width,Me=H.height/a.height;E(Math.min(Q,Me,1))},[a]),o=c(()=>{E(1)},[]),y=c(v=>{E(Math.max(Se,Math.min(Pe,v)))},[]),h=c(v=>{const H=document.querySelector("[data-preview-viewport]");H&&H.panInDirection?.(v)},[]),k=c(async()=>{if(a)try{const v=await ne({currentPath:a.path});g(v),E(1);const H=await J({path:v.path});u(H)}catch(v){console.error("Failed to load next file:",v)}},[a,ne,J]),oe=c(async()=>{if(a)try{const v=await ie({currentPath:a.path});g(v),E(1);const H=await J({path:v.path});u(H)}catch(v){console.error("Failed to load previous file:",v)}},[a,ie,J]),X=c(v=>{C.current=v},[]),Be=c(async(v,H)=>{const Q=C.current;if(!Q)throw new Error(`LiveApp action "${v}" is unavailable.`);return Q(v,H)},[]);L(()=>{if(f!=="image")return;const v=H=>{if(!(H.target instanceof HTMLInputElement||H.target instanceof HTMLTextAreaElement))switch(H.key){case"+":case"=":H.preventDefault(),N();break;case"-":H.preventDefault(),P();break;case"0":H.preventDefault(),m();break}};return window.addEventListener("keydown",v),()=>window.removeEventListener("keydown",v)},[f,N,P,m]);const De=l!==null&&l.files.length>1,Te=l!==null&&l.files.length>1,Ne=Math.round(I*100),Oe=f==="image"?{mode:f,streaming:!1,file:a?{name:a.name,path:a.path,kind:"image",mimeType:a.mimeType}:null}:f==="html"?z:{...q,streaming:x};return i(tt,{state:Oe,onFileOpened:d,onZoomIn:N,onZoomOut:P,onFitToWindow:m,onActualSize:o,onPan:h,onPrevious:oe,onNext:k,liveAppActions:te,onInvokeLiveAppAction:Be,children:i("div",{className:se.root,children:f==="image"?a?O(me,{children:[i(he,{filename:a.name,mode:"image",zoomPercent:Ne,canGoPrev:De,canGoNext:Te,onZoomIn:N,onZoomOut:P,onFitToWindow:m,onActualSize:o,onPrevious:oe,onNext:k}),i("div",{ref:j,"data-preview-viewport":"",className:se.imageViewportWrap,children:i(Ze,{dataUrl:a.dataUrl,zoom:I,onZoomChange:y})})]}):Z?O("div",{className:se.errorState,children:[i("span",{className:se.errorIcon,children:"⚠"}),i("span",{children:Z})]}):i("div",{className:se.emptyState,children:"No image open"}):f==="html"?i(et,{initialPath:A??t,liveAppId:D??n,bridgeToken:b,theme:K,onActionStateChange:R,onLiveAppActionsChange:ee,onLiveAppActionInvokerChange:X}):i(gt,{previewStore:p,streamId:r,streamTitle:s??"HTML Preview",bridgeToken:b,theme:K,onActionStateChange:V,onLiveAppActionsChange:ee,onLiveAppActionInvokerChange:X})})})}function bt(t){const e=t,n=vt(t.args),r=typeof t.args?.path=="string"?t.args.path:void 0,s=typeof t.args?.liveAppId=="string"?t.args.liveAppId:void 0,b=typeof t.args?.streamId=="string"?t.args.streamId:void 0,_=typeof t.args?.title=="string"?t.args.title:void 0,w=typeof t.args?.bridgeToken=="string"?t.args.bridgeToken:void 0,B={accentColor:e.theme?.accentColor??"#7c6ff7",mode:e.theme?.mode==="light"?"light":"dark"},p=We(t.root);return p.render(i(Le,{windowId:t.windowId,children:i(Re,{miniAppId:t.miniAppId,children:i(wt,{initialPath:r,initialMode:n,liveAppId:s,streamId:b,streamTitle:_,bridgeToken:w,theme:B,windowId:t.windowId})})})),{deactivate(){p.unmount()}}}export{bt as activate};
407
+ //# sourceMappingURL=frontend-Dx41dEM9.js.map