@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.
- package/LICENSE +21 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/frontend/assets/frontend-B3QNYf3p.js +413 -0
- package/dist/frontend/assets/frontend-B3QNYf3p.js.map +1 -0
- package/dist/frontend/assets/frontend-B4aeXn9d.js +416 -0
- package/dist/frontend/assets/frontend-B4aeXn9d.js.map +1 -0
- package/dist/frontend/assets/frontend-BwyRSlHp.js +6513 -0
- package/dist/frontend/assets/frontend-BwyRSlHp.js.map +1 -0
- package/dist/frontend/assets/frontend-Dix2OWTT.js +229 -0
- package/dist/frontend/assets/frontend-Dix2OWTT.js.map +1 -0
- package/dist/frontend/assets/frontend-Dx41dEM9.js +407 -0
- package/dist/frontend/assets/frontend-Dx41dEM9.js.map +1 -0
- package/dist/frontend/assets/frontend-WpQng8Mt.js +1991 -0
- package/dist/frontend/assets/frontend-WpQng8Mt.js.map +1 -0
- package/dist/frontend/assets/frontend-rTwBdJbn.js +2123 -0
- package/dist/frontend/assets/frontend-rTwBdJbn.js.map +1 -0
- package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js +2 -0
- package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js.map +1 -0
- package/dist/frontend/assets/index-C5-XUOS7.js +1863 -0
- package/dist/frontend/assets/index-C5-XUOS7.js.map +1 -0
- package/dist/frontend/assets/index-C_e3_6yE.css +1 -0
- package/dist/frontend/index.html +22 -0
- package/dist/frontend/pcm-capture-processor.js +65 -0
- package/dist/i18n/manifest.json +34 -0
- package/dist/i18n/zh-CN.json +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server/admin-routes.d.ts +14 -0
- package/dist/server/admin-routes.d.ts.map +1 -0
- package/dist/server/admin-routes.js +118 -0
- package/dist/server/admin-routes.js.map +1 -0
- package/dist/server/api-routes.d.ts +8 -0
- package/dist/server/api-routes.d.ts.map +1 -0
- package/dist/server/api-routes.js +203 -0
- package/dist/server/api-routes.js.map +1 -0
- package/dist/server/auth-routes.d.ts +19 -0
- package/dist/server/auth-routes.d.ts.map +1 -0
- package/dist/server/auth-routes.js +155 -0
- package/dist/server/auth-routes.js.map +1 -0
- package/dist/server/dtfs-routes.d.ts +3 -0
- package/dist/server/dtfs-routes.d.ts.map +1 -0
- package/dist/server/dtfs-routes.js +183 -0
- package/dist/server/dtfs-routes.js.map +1 -0
- package/dist/server/index.d.ts +15 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +158 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/monaco-routes.d.ts +3 -0
- package/dist/server/monaco-routes.d.ts.map +1 -0
- package/dist/server/monaco-routes.js +45 -0
- package/dist/server/monaco-routes.js.map +1 -0
- package/dist/server/voice-routes.d.ts +7 -0
- package/dist/server/voice-routes.d.ts.map +1 -0
- package/dist/server/voice-routes.js +142 -0
- package/dist/server/voice-routes.js.map +1 -0
- package/dist/server/ws-routes.d.ts +29 -0
- package/dist/server/ws-routes.d.ts.map +1 -0
- package/dist/server/ws-routes.js +334 -0
- package/dist/server/ws-routes.js.map +1 -0
- package/dist/services/ai/action-tool.d.ts +9 -0
- package/dist/services/ai/action-tool.d.ts.map +1 -0
- package/dist/services/ai/action-tool.js +51 -0
- package/dist/services/ai/action-tool.js.map +1 -0
- package/dist/services/ai/app-tools.d.ts +15 -0
- package/dist/services/ai/app-tools.d.ts.map +1 -0
- package/dist/services/ai/app-tools.js +119 -0
- package/dist/services/ai/app-tools.js.map +1 -0
- package/dist/services/ai/chat-service.d.ts +27 -0
- package/dist/services/ai/chat-service.d.ts.map +1 -0
- package/dist/services/ai/chat-service.js +213 -0
- package/dist/services/ai/chat-service.js.map +1 -0
- package/dist/services/ai/create-liveapp-tool.d.ts +15 -0
- package/dist/services/ai/create-liveapp-tool.d.ts.map +1 -0
- package/dist/services/ai/create-liveapp-tool.js +142 -0
- package/dist/services/ai/create-liveapp-tool.js.map +1 -0
- package/dist/services/ai/desktop-tool.d.ts +27 -0
- package/dist/services/ai/desktop-tool.d.ts.map +1 -0
- package/dist/services/ai/desktop-tool.js +106 -0
- package/dist/services/ai/desktop-tool.js.map +1 -0
- package/dist/services/ai/edit-history.d.ts +16 -0
- package/dist/services/ai/edit-history.d.ts.map +1 -0
- package/dist/services/ai/edit-history.js +137 -0
- package/dist/services/ai/edit-history.js.map +1 -0
- package/dist/services/ai/edit-tool.d.ts +9 -0
- package/dist/services/ai/edit-tool.d.ts.map +1 -0
- package/dist/services/ai/edit-tool.js +113 -0
- package/dist/services/ai/edit-tool.js.map +1 -0
- package/dist/services/ai/generate-html-tool.d.ts +15 -0
- package/dist/services/ai/generate-html-tool.d.ts.map +1 -0
- package/dist/services/ai/generate-html-tool.js +140 -0
- package/dist/services/ai/generate-html-tool.js.map +1 -0
- package/dist/services/ai/generate-icon-tool.d.ts +10 -0
- package/dist/services/ai/generate-icon-tool.d.ts.map +1 -0
- package/dist/services/ai/generate-icon-tool.js +58 -0
- package/dist/services/ai/generate-icon-tool.js.map +1 -0
- package/dist/services/ai/html-bridge-script.d.ts +2 -0
- package/dist/services/ai/html-bridge-script.d.ts.map +1 -0
- package/dist/services/ai/html-bridge-script.js +2 -0
- package/dist/services/ai/html-bridge-script.js.map +1 -0
- package/dist/services/ai/html-guidelines-tool.d.ts +3 -0
- package/dist/services/ai/html-guidelines-tool.d.ts.map +1 -0
- package/dist/services/ai/html-guidelines-tool.js +157 -0
- package/dist/services/ai/html-guidelines-tool.js.map +1 -0
- package/dist/services/ai/html-stream-coordinator.d.ts +92 -0
- package/dist/services/ai/html-stream-coordinator.d.ts.map +1 -0
- package/dist/services/ai/html-stream-coordinator.js +314 -0
- package/dist/services/ai/html-stream-coordinator.js.map +1 -0
- package/dist/services/ai/html-theme-link.d.ts +9 -0
- package/dist/services/ai/html-theme-link.d.ts.map +1 -0
- package/dist/services/ai/html-theme-link.js +12 -0
- package/dist/services/ai/html-theme-link.js.map +1 -0
- package/dist/services/ai/html-ui-script.d.ts +9 -0
- package/dist/services/ai/html-ui-script.d.ts.map +1 -0
- package/dist/services/ai/html-ui-script.js +9 -0
- package/dist/services/ai/html-ui-script.js.map +1 -0
- package/dist/services/ai/image-generation-service.d.ts +26 -0
- package/dist/services/ai/image-generation-service.d.ts.map +1 -0
- package/dist/services/ai/image-generation-service.js +205 -0
- package/dist/services/ai/image-generation-service.js.map +1 -0
- package/dist/services/ai/manual-pages/desktop-actions.md +36 -0
- package/dist/services/ai/manual-pages/desktop-windows.md +24 -0
- package/dist/services/ai/manual-pages/dt-badge.md +36 -0
- package/dist/services/ai/manual-pages/dt-button.md +38 -0
- package/dist/services/ai/manual-pages/dt-card.md +22 -0
- package/dist/services/ai/manual-pages/dt-chart.md +261 -0
- package/dist/services/ai/manual-pages/dt-divider.md +25 -0
- package/dist/services/ai/manual-pages/dt-grid.md +29 -0
- package/dist/services/ai/manual-pages/dt-list-view.md +96 -0
- package/dist/services/ai/manual-pages/dt-markdown-editor.md +90 -0
- package/dist/services/ai/manual-pages/dt-markdown.md +86 -0
- package/dist/services/ai/manual-pages/dt-select.md +21 -0
- package/dist/services/ai/manual-pages/dt-stack.md +31 -0
- package/dist/services/ai/manual-pages/dt-stat.md +43 -0
- package/dist/services/ai/manual-pages/dt-table-view.md +120 -0
- package/dist/services/ai/manual-pages/dt-tooltip.md +18 -0
- package/dist/services/ai/manual-pages/editing-preview.md +25 -0
- package/dist/services/ai/manual-pages/html-actions.md +74 -0
- package/dist/services/ai/manual-pages/html-bridge.md +187 -0
- package/dist/services/ai/manual-pages/html-components.md +66 -0
- package/dist/services/ai/manual-pages/html-examples.md +185 -0
- package/dist/services/ai/manual-pages/html-layouts.md +128 -0
- package/dist/services/ai/manual-pages/html-storage.md +153 -0
- package/dist/services/ai/manual-pages/html-tokens.md +26 -0
- package/dist/services/ai/manual-pages/index.d.ts +10 -0
- package/dist/services/ai/manual-pages/index.d.ts.map +1 -0
- package/dist/services/ai/manual-pages/index.js +186 -0
- package/dist/services/ai/manual-pages/index.js.map +1 -0
- package/dist/services/ai/manual-tool.d.ts +3 -0
- package/dist/services/ai/manual-tool.d.ts.map +1 -0
- package/dist/services/ai/manual-tool.js +104 -0
- package/dist/services/ai/manual-tool.js.map +1 -0
- package/dist/services/ai/pi-session-service.d.ts +101 -0
- package/dist/services/ai/pi-session-service.d.ts.map +1 -0
- package/dist/services/ai/pi-session-service.js +697 -0
- package/dist/services/ai/pi-session-service.js.map +1 -0
- package/dist/services/ai/providers.d.ts +21 -0
- package/dist/services/ai/providers.d.ts.map +1 -0
- package/dist/services/ai/providers.js +93 -0
- package/dist/services/ai/providers.js.map +1 -0
- package/dist/services/ai/redo-edit-tool.d.ts +9 -0
- package/dist/services/ai/redo-edit-tool.d.ts.map +1 -0
- package/dist/services/ai/redo-edit-tool.js +44 -0
- package/dist/services/ai/redo-edit-tool.js.map +1 -0
- package/dist/services/ai/system-prompt.d.ts +7 -0
- package/dist/services/ai/system-prompt.d.ts.map +1 -0
- package/dist/services/ai/system-prompt.js +72 -0
- package/dist/services/ai/system-prompt.js.map +1 -0
- package/dist/services/ai/undo-edit-tool.d.ts +9 -0
- package/dist/services/ai/undo-edit-tool.d.ts.map +1 -0
- package/dist/services/ai/undo-edit-tool.js +44 -0
- package/dist/services/ai/undo-edit-tool.js.map +1 -0
- package/dist/services/ai/window-tools.d.ts +27 -0
- package/dist/services/ai/window-tools.d.ts.map +1 -0
- package/dist/services/ai/window-tools.js +155 -0
- package/dist/services/ai/window-tools.js.map +1 -0
- package/dist/services/backend-host.d.ts +10 -0
- package/dist/services/backend-host.d.ts.map +1 -0
- package/dist/services/backend-host.js +117 -0
- package/dist/services/backend-host.js.map +1 -0
- package/dist/services/backend-ipc.d.ts +60 -0
- package/dist/services/backend-ipc.d.ts.map +1 -0
- package/dist/services/backend-ipc.js +2 -0
- package/dist/services/backend-ipc.js.map +1 -0
- package/dist/services/backend-process-manager.d.ts +60 -0
- package/dist/services/backend-process-manager.d.ts.map +1 -0
- package/dist/services/backend-process-manager.js +203 -0
- package/dist/services/backend-process-manager.js.map +1 -0
- package/dist/services/filesystem.d.ts +8 -0
- package/dist/services/filesystem.d.ts.map +1 -0
- package/dist/services/filesystem.js +94 -0
- package/dist/services/filesystem.js.map +1 -0
- package/dist/services/i18n.d.ts +28 -0
- package/dist/services/i18n.d.ts.map +1 -0
- package/dist/services/i18n.js +76 -0
- package/dist/services/i18n.js.map +1 -0
- package/dist/services/liveapp-icon.d.ts +9 -0
- package/dist/services/liveapp-icon.d.ts.map +1 -0
- package/dist/services/liveapp-icon.js +28 -0
- package/dist/services/liveapp-icon.js.map +1 -0
- package/dist/services/liveapps.d.ts +12 -0
- package/dist/services/liveapps.d.ts.map +1 -0
- package/dist/services/liveapps.js +84 -0
- package/dist/services/liveapps.js.map +1 -0
- package/dist/services/logger.d.ts +34 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +74 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/messaging.d.ts +14 -0
- package/dist/services/messaging.d.ts.map +1 -0
- package/dist/services/messaging.js +41 -0
- package/dist/services/messaging.js.map +1 -0
- package/dist/services/miniapp-icon.d.ts +9 -0
- package/dist/services/miniapp-icon.d.ts.map +1 -0
- package/dist/services/miniapp-icon.js +25 -0
- package/dist/services/miniapp-icon.js.map +1 -0
- package/dist/services/miniapp-registry.d.ts +73 -0
- package/dist/services/miniapp-registry.d.ts.map +1 -0
- package/dist/services/miniapp-registry.js +144 -0
- package/dist/services/miniapp-registry.js.map +1 -0
- package/dist/services/onboarding-config.d.ts +37 -0
- package/dist/services/onboarding-config.d.ts.map +1 -0
- package/dist/services/onboarding-config.js +76 -0
- package/dist/services/onboarding-config.js.map +1 -0
- package/dist/services/preferences.d.ts +10 -0
- package/dist/services/preferences.d.ts.map +1 -0
- package/dist/services/preferences.js +48 -0
- package/dist/services/preferences.js.map +1 -0
- package/dist/services/proxy-dispatcher.d.ts +18 -0
- package/dist/services/proxy-dispatcher.d.ts.map +1 -0
- package/dist/services/proxy-dispatcher.js +33 -0
- package/dist/services/proxy-dispatcher.js.map +1 -0
- package/dist/services/storage.d.ts +7 -0
- package/dist/services/storage.d.ts.map +1 -0
- package/dist/services/storage.js +55 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/theme-css.d.ts +21 -0
- package/dist/services/theme-css.d.ts.map +1 -0
- package/dist/services/theme-css.js +213 -0
- package/dist/services/theme-css.js.map +1 -0
- package/dist/services/user-db.d.ts +69 -0
- package/dist/services/user-db.d.ts.map +1 -0
- package/dist/services/user-db.js +175 -0
- package/dist/services/user-db.js.map +1 -0
- package/dist/services/voice/audio-format.d.ts +5 -0
- package/dist/services/voice/audio-format.d.ts.map +1 -0
- package/dist/services/voice/audio-format.js +27 -0
- package/dist/services/voice/audio-format.js.map +1 -0
- package/dist/services/voice/azure-openai-whisper-adapter.d.ts +23 -0
- package/dist/services/voice/azure-openai-whisper-adapter.d.ts.map +1 -0
- package/dist/services/voice/azure-openai-whisper-adapter.js +60 -0
- package/dist/services/voice/azure-openai-whisper-adapter.js.map +1 -0
- package/dist/services/voice/openai-whisper-adapter.d.ts +22 -0
- package/dist/services/voice/openai-whisper-adapter.d.ts.map +1 -0
- package/dist/services/voice/openai-whisper-adapter.js +61 -0
- package/dist/services/voice/openai-whisper-adapter.js.map +1 -0
- package/dist/services/voice/stt-adapter.d.ts +31 -0
- package/dist/services/voice/stt-adapter.d.ts.map +1 -0
- package/dist/services/voice/stt-adapter.js +8 -0
- package/dist/services/voice/stt-adapter.js.map +1 -0
- package/dist/services/voice/vad-segmenter.d.ts +68 -0
- package/dist/services/voice/vad-segmenter.d.ts.map +1 -0
- package/dist/services/voice/vad-segmenter.js +159 -0
- package/dist/services/voice/vad-segmenter.js.map +1 -0
- package/dist/services/voice/voice-session.d.ts +54 -0
- package/dist/services/voice/voice-session.d.ts.map +1 -0
- package/dist/services/voice/voice-session.js +137 -0
- package/dist/services/voice/voice-session.js.map +1 -0
- package/dist/services/window-manager.d.ts +94 -0
- package/dist/services/window-manager.d.ts.map +1 -0
- package/dist/services/window-manager.js +282 -0
- package/dist/services/window-manager.js.map +1 -0
- package/dist/services/workspace.d.ts +51 -0
- package/dist/services/workspace.d.ts.map +1 -0
- package/dist/services/workspace.js +144 -0
- package/dist/services/workspace.js.map +1 -0
- 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
|