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