@desktalk/core 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +82 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/frontend/assets/frontend-B3QNYf3p.js +413 -0
  7. package/dist/frontend/assets/frontend-B3QNYf3p.js.map +1 -0
  8. package/dist/frontend/assets/frontend-B4aeXn9d.js +416 -0
  9. package/dist/frontend/assets/frontend-B4aeXn9d.js.map +1 -0
  10. package/dist/frontend/assets/frontend-BwyRSlHp.js +6513 -0
  11. package/dist/frontend/assets/frontend-BwyRSlHp.js.map +1 -0
  12. package/dist/frontend/assets/frontend-Dix2OWTT.js +229 -0
  13. package/dist/frontend/assets/frontend-Dix2OWTT.js.map +1 -0
  14. package/dist/frontend/assets/frontend-Dx41dEM9.js +407 -0
  15. package/dist/frontend/assets/frontend-Dx41dEM9.js.map +1 -0
  16. package/dist/frontend/assets/frontend-WpQng8Mt.js +1991 -0
  17. package/dist/frontend/assets/frontend-WpQng8Mt.js.map +1 -0
  18. package/dist/frontend/assets/frontend-rTwBdJbn.js +2123 -0
  19. package/dist/frontend/assets/frontend-rTwBdJbn.js.map +1 -0
  20. package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js +2 -0
  21. package/dist/frontend/assets/highlighted-body-TPN3WLV5-DD4wpkf4.js.map +1 -0
  22. package/dist/frontend/assets/index-C5-XUOS7.js +1863 -0
  23. package/dist/frontend/assets/index-C5-XUOS7.js.map +1 -0
  24. package/dist/frontend/assets/index-C_e3_6yE.css +1 -0
  25. package/dist/frontend/index.html +22 -0
  26. package/dist/frontend/pcm-capture-processor.js +65 -0
  27. package/dist/i18n/manifest.json +34 -0
  28. package/dist/i18n/zh-CN.json +7 -0
  29. package/dist/index.d.ts +6 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +6 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/server/admin-routes.d.ts +14 -0
  34. package/dist/server/admin-routes.d.ts.map +1 -0
  35. package/dist/server/admin-routes.js +118 -0
  36. package/dist/server/admin-routes.js.map +1 -0
  37. package/dist/server/api-routes.d.ts +8 -0
  38. package/dist/server/api-routes.d.ts.map +1 -0
  39. package/dist/server/api-routes.js +203 -0
  40. package/dist/server/api-routes.js.map +1 -0
  41. package/dist/server/auth-routes.d.ts +19 -0
  42. package/dist/server/auth-routes.d.ts.map +1 -0
  43. package/dist/server/auth-routes.js +155 -0
  44. package/dist/server/auth-routes.js.map +1 -0
  45. package/dist/server/dtfs-routes.d.ts +3 -0
  46. package/dist/server/dtfs-routes.d.ts.map +1 -0
  47. package/dist/server/dtfs-routes.js +183 -0
  48. package/dist/server/dtfs-routes.js.map +1 -0
  49. package/dist/server/index.d.ts +15 -0
  50. package/dist/server/index.d.ts.map +1 -0
  51. package/dist/server/index.js +158 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/monaco-routes.d.ts +3 -0
  54. package/dist/server/monaco-routes.d.ts.map +1 -0
  55. package/dist/server/monaco-routes.js +45 -0
  56. package/dist/server/monaco-routes.js.map +1 -0
  57. package/dist/server/voice-routes.d.ts +7 -0
  58. package/dist/server/voice-routes.d.ts.map +1 -0
  59. package/dist/server/voice-routes.js +142 -0
  60. package/dist/server/voice-routes.js.map +1 -0
  61. package/dist/server/ws-routes.d.ts +29 -0
  62. package/dist/server/ws-routes.d.ts.map +1 -0
  63. package/dist/server/ws-routes.js +334 -0
  64. package/dist/server/ws-routes.js.map +1 -0
  65. package/dist/services/ai/action-tool.d.ts +9 -0
  66. package/dist/services/ai/action-tool.d.ts.map +1 -0
  67. package/dist/services/ai/action-tool.js +51 -0
  68. package/dist/services/ai/action-tool.js.map +1 -0
  69. package/dist/services/ai/app-tools.d.ts +15 -0
  70. package/dist/services/ai/app-tools.d.ts.map +1 -0
  71. package/dist/services/ai/app-tools.js +119 -0
  72. package/dist/services/ai/app-tools.js.map +1 -0
  73. package/dist/services/ai/chat-service.d.ts +27 -0
  74. package/dist/services/ai/chat-service.d.ts.map +1 -0
  75. package/dist/services/ai/chat-service.js +213 -0
  76. package/dist/services/ai/chat-service.js.map +1 -0
  77. package/dist/services/ai/create-liveapp-tool.d.ts +15 -0
  78. package/dist/services/ai/create-liveapp-tool.d.ts.map +1 -0
  79. package/dist/services/ai/create-liveapp-tool.js +142 -0
  80. package/dist/services/ai/create-liveapp-tool.js.map +1 -0
  81. package/dist/services/ai/desktop-tool.d.ts +27 -0
  82. package/dist/services/ai/desktop-tool.d.ts.map +1 -0
  83. package/dist/services/ai/desktop-tool.js +106 -0
  84. package/dist/services/ai/desktop-tool.js.map +1 -0
  85. package/dist/services/ai/edit-history.d.ts +16 -0
  86. package/dist/services/ai/edit-history.d.ts.map +1 -0
  87. package/dist/services/ai/edit-history.js +137 -0
  88. package/dist/services/ai/edit-history.js.map +1 -0
  89. package/dist/services/ai/edit-tool.d.ts +9 -0
  90. package/dist/services/ai/edit-tool.d.ts.map +1 -0
  91. package/dist/services/ai/edit-tool.js +113 -0
  92. package/dist/services/ai/edit-tool.js.map +1 -0
  93. package/dist/services/ai/generate-html-tool.d.ts +15 -0
  94. package/dist/services/ai/generate-html-tool.d.ts.map +1 -0
  95. package/dist/services/ai/generate-html-tool.js +140 -0
  96. package/dist/services/ai/generate-html-tool.js.map +1 -0
  97. package/dist/services/ai/generate-icon-tool.d.ts +10 -0
  98. package/dist/services/ai/generate-icon-tool.d.ts.map +1 -0
  99. package/dist/services/ai/generate-icon-tool.js +58 -0
  100. package/dist/services/ai/generate-icon-tool.js.map +1 -0
  101. package/dist/services/ai/html-bridge-script.d.ts +2 -0
  102. package/dist/services/ai/html-bridge-script.d.ts.map +1 -0
  103. package/dist/services/ai/html-bridge-script.js +2 -0
  104. package/dist/services/ai/html-bridge-script.js.map +1 -0
  105. package/dist/services/ai/html-guidelines-tool.d.ts +3 -0
  106. package/dist/services/ai/html-guidelines-tool.d.ts.map +1 -0
  107. package/dist/services/ai/html-guidelines-tool.js +157 -0
  108. package/dist/services/ai/html-guidelines-tool.js.map +1 -0
  109. package/dist/services/ai/html-stream-coordinator.d.ts +92 -0
  110. package/dist/services/ai/html-stream-coordinator.d.ts.map +1 -0
  111. package/dist/services/ai/html-stream-coordinator.js +314 -0
  112. package/dist/services/ai/html-stream-coordinator.js.map +1 -0
  113. package/dist/services/ai/html-theme-link.d.ts +9 -0
  114. package/dist/services/ai/html-theme-link.d.ts.map +1 -0
  115. package/dist/services/ai/html-theme-link.js +12 -0
  116. package/dist/services/ai/html-theme-link.js.map +1 -0
  117. package/dist/services/ai/html-ui-script.d.ts +9 -0
  118. package/dist/services/ai/html-ui-script.d.ts.map +1 -0
  119. package/dist/services/ai/html-ui-script.js +9 -0
  120. package/dist/services/ai/html-ui-script.js.map +1 -0
  121. package/dist/services/ai/image-generation-service.d.ts +26 -0
  122. package/dist/services/ai/image-generation-service.d.ts.map +1 -0
  123. package/dist/services/ai/image-generation-service.js +205 -0
  124. package/dist/services/ai/image-generation-service.js.map +1 -0
  125. package/dist/services/ai/manual-pages/desktop-actions.md +36 -0
  126. package/dist/services/ai/manual-pages/desktop-windows.md +24 -0
  127. package/dist/services/ai/manual-pages/dt-badge.md +36 -0
  128. package/dist/services/ai/manual-pages/dt-button.md +38 -0
  129. package/dist/services/ai/manual-pages/dt-card.md +22 -0
  130. package/dist/services/ai/manual-pages/dt-chart.md +261 -0
  131. package/dist/services/ai/manual-pages/dt-divider.md +25 -0
  132. package/dist/services/ai/manual-pages/dt-grid.md +29 -0
  133. package/dist/services/ai/manual-pages/dt-list-view.md +96 -0
  134. package/dist/services/ai/manual-pages/dt-markdown-editor.md +90 -0
  135. package/dist/services/ai/manual-pages/dt-markdown.md +86 -0
  136. package/dist/services/ai/manual-pages/dt-select.md +21 -0
  137. package/dist/services/ai/manual-pages/dt-stack.md +31 -0
  138. package/dist/services/ai/manual-pages/dt-stat.md +43 -0
  139. package/dist/services/ai/manual-pages/dt-table-view.md +120 -0
  140. package/dist/services/ai/manual-pages/dt-tooltip.md +18 -0
  141. package/dist/services/ai/manual-pages/editing-preview.md +25 -0
  142. package/dist/services/ai/manual-pages/html-actions.md +74 -0
  143. package/dist/services/ai/manual-pages/html-bridge.md +187 -0
  144. package/dist/services/ai/manual-pages/html-components.md +66 -0
  145. package/dist/services/ai/manual-pages/html-examples.md +185 -0
  146. package/dist/services/ai/manual-pages/html-layouts.md +128 -0
  147. package/dist/services/ai/manual-pages/html-storage.md +153 -0
  148. package/dist/services/ai/manual-pages/html-tokens.md +26 -0
  149. package/dist/services/ai/manual-pages/index.d.ts +10 -0
  150. package/dist/services/ai/manual-pages/index.d.ts.map +1 -0
  151. package/dist/services/ai/manual-pages/index.js +186 -0
  152. package/dist/services/ai/manual-pages/index.js.map +1 -0
  153. package/dist/services/ai/manual-tool.d.ts +3 -0
  154. package/dist/services/ai/manual-tool.d.ts.map +1 -0
  155. package/dist/services/ai/manual-tool.js +104 -0
  156. package/dist/services/ai/manual-tool.js.map +1 -0
  157. package/dist/services/ai/pi-session-service.d.ts +101 -0
  158. package/dist/services/ai/pi-session-service.d.ts.map +1 -0
  159. package/dist/services/ai/pi-session-service.js +697 -0
  160. package/dist/services/ai/pi-session-service.js.map +1 -0
  161. package/dist/services/ai/providers.d.ts +21 -0
  162. package/dist/services/ai/providers.d.ts.map +1 -0
  163. package/dist/services/ai/providers.js +93 -0
  164. package/dist/services/ai/providers.js.map +1 -0
  165. package/dist/services/ai/redo-edit-tool.d.ts +9 -0
  166. package/dist/services/ai/redo-edit-tool.d.ts.map +1 -0
  167. package/dist/services/ai/redo-edit-tool.js +44 -0
  168. package/dist/services/ai/redo-edit-tool.js.map +1 -0
  169. package/dist/services/ai/system-prompt.d.ts +7 -0
  170. package/dist/services/ai/system-prompt.d.ts.map +1 -0
  171. package/dist/services/ai/system-prompt.js +72 -0
  172. package/dist/services/ai/system-prompt.js.map +1 -0
  173. package/dist/services/ai/undo-edit-tool.d.ts +9 -0
  174. package/dist/services/ai/undo-edit-tool.d.ts.map +1 -0
  175. package/dist/services/ai/undo-edit-tool.js +44 -0
  176. package/dist/services/ai/undo-edit-tool.js.map +1 -0
  177. package/dist/services/ai/window-tools.d.ts +27 -0
  178. package/dist/services/ai/window-tools.d.ts.map +1 -0
  179. package/dist/services/ai/window-tools.js +155 -0
  180. package/dist/services/ai/window-tools.js.map +1 -0
  181. package/dist/services/backend-host.d.ts +10 -0
  182. package/dist/services/backend-host.d.ts.map +1 -0
  183. package/dist/services/backend-host.js +117 -0
  184. package/dist/services/backend-host.js.map +1 -0
  185. package/dist/services/backend-ipc.d.ts +60 -0
  186. package/dist/services/backend-ipc.d.ts.map +1 -0
  187. package/dist/services/backend-ipc.js +2 -0
  188. package/dist/services/backend-ipc.js.map +1 -0
  189. package/dist/services/backend-process-manager.d.ts +60 -0
  190. package/dist/services/backend-process-manager.d.ts.map +1 -0
  191. package/dist/services/backend-process-manager.js +203 -0
  192. package/dist/services/backend-process-manager.js.map +1 -0
  193. package/dist/services/filesystem.d.ts +8 -0
  194. package/dist/services/filesystem.d.ts.map +1 -0
  195. package/dist/services/filesystem.js +94 -0
  196. package/dist/services/filesystem.js.map +1 -0
  197. package/dist/services/i18n.d.ts +28 -0
  198. package/dist/services/i18n.d.ts.map +1 -0
  199. package/dist/services/i18n.js +76 -0
  200. package/dist/services/i18n.js.map +1 -0
  201. package/dist/services/liveapp-icon.d.ts +9 -0
  202. package/dist/services/liveapp-icon.d.ts.map +1 -0
  203. package/dist/services/liveapp-icon.js +28 -0
  204. package/dist/services/liveapp-icon.js.map +1 -0
  205. package/dist/services/liveapps.d.ts +12 -0
  206. package/dist/services/liveapps.d.ts.map +1 -0
  207. package/dist/services/liveapps.js +84 -0
  208. package/dist/services/liveapps.js.map +1 -0
  209. package/dist/services/logger.d.ts +34 -0
  210. package/dist/services/logger.d.ts.map +1 -0
  211. package/dist/services/logger.js +74 -0
  212. package/dist/services/logger.js.map +1 -0
  213. package/dist/services/messaging.d.ts +14 -0
  214. package/dist/services/messaging.d.ts.map +1 -0
  215. package/dist/services/messaging.js +41 -0
  216. package/dist/services/messaging.js.map +1 -0
  217. package/dist/services/miniapp-icon.d.ts +9 -0
  218. package/dist/services/miniapp-icon.d.ts.map +1 -0
  219. package/dist/services/miniapp-icon.js +25 -0
  220. package/dist/services/miniapp-icon.js.map +1 -0
  221. package/dist/services/miniapp-registry.d.ts +73 -0
  222. package/dist/services/miniapp-registry.d.ts.map +1 -0
  223. package/dist/services/miniapp-registry.js +144 -0
  224. package/dist/services/miniapp-registry.js.map +1 -0
  225. package/dist/services/onboarding-config.d.ts +37 -0
  226. package/dist/services/onboarding-config.d.ts.map +1 -0
  227. package/dist/services/onboarding-config.js +76 -0
  228. package/dist/services/onboarding-config.js.map +1 -0
  229. package/dist/services/preferences.d.ts +10 -0
  230. package/dist/services/preferences.d.ts.map +1 -0
  231. package/dist/services/preferences.js +48 -0
  232. package/dist/services/preferences.js.map +1 -0
  233. package/dist/services/proxy-dispatcher.d.ts +18 -0
  234. package/dist/services/proxy-dispatcher.d.ts.map +1 -0
  235. package/dist/services/proxy-dispatcher.js +33 -0
  236. package/dist/services/proxy-dispatcher.js.map +1 -0
  237. package/dist/services/storage.d.ts +7 -0
  238. package/dist/services/storage.d.ts.map +1 -0
  239. package/dist/services/storage.js +55 -0
  240. package/dist/services/storage.js.map +1 -0
  241. package/dist/services/theme-css.d.ts +21 -0
  242. package/dist/services/theme-css.d.ts.map +1 -0
  243. package/dist/services/theme-css.js +213 -0
  244. package/dist/services/theme-css.js.map +1 -0
  245. package/dist/services/user-db.d.ts +69 -0
  246. package/dist/services/user-db.d.ts.map +1 -0
  247. package/dist/services/user-db.js +175 -0
  248. package/dist/services/user-db.js.map +1 -0
  249. package/dist/services/voice/audio-format.d.ts +5 -0
  250. package/dist/services/voice/audio-format.d.ts.map +1 -0
  251. package/dist/services/voice/audio-format.js +27 -0
  252. package/dist/services/voice/audio-format.js.map +1 -0
  253. package/dist/services/voice/azure-openai-whisper-adapter.d.ts +23 -0
  254. package/dist/services/voice/azure-openai-whisper-adapter.d.ts.map +1 -0
  255. package/dist/services/voice/azure-openai-whisper-adapter.js +60 -0
  256. package/dist/services/voice/azure-openai-whisper-adapter.js.map +1 -0
  257. package/dist/services/voice/openai-whisper-adapter.d.ts +22 -0
  258. package/dist/services/voice/openai-whisper-adapter.d.ts.map +1 -0
  259. package/dist/services/voice/openai-whisper-adapter.js +61 -0
  260. package/dist/services/voice/openai-whisper-adapter.js.map +1 -0
  261. package/dist/services/voice/stt-adapter.d.ts +31 -0
  262. package/dist/services/voice/stt-adapter.d.ts.map +1 -0
  263. package/dist/services/voice/stt-adapter.js +8 -0
  264. package/dist/services/voice/stt-adapter.js.map +1 -0
  265. package/dist/services/voice/vad-segmenter.d.ts +68 -0
  266. package/dist/services/voice/vad-segmenter.d.ts.map +1 -0
  267. package/dist/services/voice/vad-segmenter.js +159 -0
  268. package/dist/services/voice/vad-segmenter.js.map +1 -0
  269. package/dist/services/voice/voice-session.d.ts +54 -0
  270. package/dist/services/voice/voice-session.d.ts.map +1 -0
  271. package/dist/services/voice/voice-session.js +137 -0
  272. package/dist/services/voice/voice-session.js.map +1 -0
  273. package/dist/services/window-manager.d.ts +94 -0
  274. package/dist/services/window-manager.d.ts.map +1 -0
  275. package/dist/services/window-manager.js +282 -0
  276. package/dist/services/window-manager.js.map +1 -0
  277. package/dist/services/workspace.d.ts +51 -0
  278. package/dist/services/workspace.d.ts.map +1 -0
  279. package/dist/services/workspace.js +144 -0
  280. package/dist/services/workspace.js.map +1 -0
  281. package/package.json +89 -0
@@ -0,0 +1,229 @@
1
+ import{W as oe,a as ie,u as z,A as le,b as k}from"./index-C5-XUOS7.js";(()=>{if(typeof document>"u")return;const o="desktalk-style-desktalk-miniapp-player-lat2sd";if(document.getElementById(o))return;const i=document.createElement("style");i.id=o,i.textContent=`/* src/PlayerApp.module.css */
2
+ .PlayerApp_root {
3
+ display: flex;
4
+ height: 100%;
5
+ flex-direction: column;
6
+ overflow: hidden;
7
+ background:
8
+ linear-gradient(
9
+ 180deg,
10
+ #131922 0%,
11
+ #0d1118 100%);
12
+ color: #f4f7fb;
13
+ }
14
+ .PlayerApp_viewport {
15
+ flex: 1;
16
+ min-height: 0;
17
+ }
18
+ .PlayerApp_emptyState,
19
+ .PlayerApp_errorState {
20
+ display: flex;
21
+ height: 100%;
22
+ min-height: 240px;
23
+ flex-direction: column;
24
+ align-items: center;
25
+ justify-content: center;
26
+ gap: 10px;
27
+ padding: 24px;
28
+ color: rgba(244, 247, 251, 0.78);
29
+ text-align: center;
30
+ }
31
+ .PlayerApp_errorState {
32
+ color: #ffd0d0;
33
+ }
34
+ .PlayerApp_errorIcon {
35
+ font-size: 28px;
36
+ }
37
+ .PlayerApp_hint {
38
+ max-width: 420px;
39
+ font-size: 13px;
40
+ line-height: 1.5;
41
+ }
42
+
43
+ /* src/components/AudioPlayer.module.css */
44
+ .AudioPlayer_shell {
45
+ display: flex;
46
+ height: 100%;
47
+ flex-direction: column;
48
+ align-items: center;
49
+ justify-content: center;
50
+ gap: 22px;
51
+ padding: 32px 20px 40px;
52
+ background:
53
+ radial-gradient(
54
+ circle at top,
55
+ rgba(126, 224, 186, 0.15),
56
+ transparent 42%),
57
+ linear-gradient(
58
+ 180deg,
59
+ rgba(255, 255, 255, 0.02),
60
+ rgba(255, 255, 255, 0));
61
+ }
62
+ .AudioPlayer_hero {
63
+ display: flex;
64
+ width: min(100%, 460px);
65
+ flex-direction: column;
66
+ align-items: center;
67
+ gap: 12px;
68
+ text-align: center;
69
+ }
70
+ .AudioPlayer_icon {
71
+ display: flex;
72
+ width: 132px;
73
+ height: 132px;
74
+ align-items: center;
75
+ justify-content: center;
76
+ border: 1px solid rgba(255, 255, 255, 0.09);
77
+ border-radius: 28px;
78
+ background:
79
+ linear-gradient(
80
+ 145deg,
81
+ rgba(126, 224, 186, 0.18),
82
+ rgba(88, 124, 255, 0.12));
83
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.28);
84
+ font-size: 52px;
85
+ }
86
+ .AudioPlayer_title {
87
+ max-width: 100%;
88
+ overflow: hidden;
89
+ font-size: 24px;
90
+ font-weight: 700;
91
+ text-overflow: ellipsis;
92
+ white-space: nowrap;
93
+ }
94
+ .AudioPlayer_seekGroup,
95
+ .AudioPlayer_volumeGroup {
96
+ display: flex;
97
+ width: min(100%, 460px);
98
+ align-items: center;
99
+ gap: 12px;
100
+ }
101
+ .AudioPlayer_time {
102
+ width: 42px;
103
+ color: rgba(244, 247, 251, 0.72);
104
+ font-size: 12px;
105
+ font-variant-numeric: tabular-nums;
106
+ }
107
+ .AudioPlayer_time:last-child {
108
+ text-align: right;
109
+ }
110
+ .AudioPlayer_slider {
111
+ width: 100%;
112
+ }
113
+ .AudioPlayer_controls {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 12px;
117
+ }
118
+ .AudioPlayer_transportButton,
119
+ .AudioPlayer_playButton,
120
+ .AudioPlayer_muteButton {
121
+ display: inline-flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ border: none;
125
+ color: inherit;
126
+ cursor: pointer;
127
+ }
128
+ .AudioPlayer_transportButton,
129
+ .AudioPlayer_muteButton {
130
+ width: 42px;
131
+ height: 42px;
132
+ border-radius: 999px;
133
+ background: rgba(255, 255, 255, 0.08);
134
+ font-size: 16px;
135
+ }
136
+ .AudioPlayer_playButton {
137
+ width: 58px;
138
+ height: 58px;
139
+ border-radius: 999px;
140
+ background:
141
+ linear-gradient(
142
+ 135deg,
143
+ #7ee0ba,
144
+ #5f9cff);
145
+ color: #081018;
146
+ font-size: 22px;
147
+ font-weight: 700;
148
+ }
149
+ .AudioPlayer_label {
150
+ width: 56px;
151
+ color: rgba(244, 247, 251, 0.72);
152
+ font-size: 12px;
153
+ text-transform: uppercase;
154
+ letter-spacing: 0.08em;
155
+ }
156
+ .AudioPlayer_transportButton:disabled,
157
+ .AudioPlayer_playButton:disabled,
158
+ .AudioPlayer_muteButton:disabled {
159
+ cursor: default;
160
+ opacity: 0.4;
161
+ }
162
+
163
+ /* src/components/PlayerToolbar.module.css */
164
+ .PlayerToolbar_toolbar {
165
+ display: flex;
166
+ flex-shrink: 0;
167
+ align-items: center;
168
+ gap: 10px;
169
+ padding: 12px 14px;
170
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
171
+ background: rgba(7, 10, 16, 0.72);
172
+ backdrop-filter: blur(10px);
173
+ }
174
+ .PlayerToolbar_navButton {
175
+ display: inline-flex;
176
+ width: 30px;
177
+ height: 30px;
178
+ align-items: center;
179
+ justify-content: center;
180
+ border: 1px solid rgba(255, 255, 255, 0.12);
181
+ border-radius: 999px;
182
+ background: rgba(255, 255, 255, 0.06);
183
+ color: inherit;
184
+ cursor: pointer;
185
+ font-size: 14px;
186
+ transition:
187
+ background 0.15s,
188
+ border-color 0.15s,
189
+ opacity 0.15s;
190
+ }
191
+ .PlayerToolbar_navButton:hover:not(:disabled) {
192
+ border-color: rgba(126, 224, 186, 0.65);
193
+ background: rgba(126, 224, 186, 0.14);
194
+ }
195
+ .PlayerToolbar_navButton:disabled {
196
+ cursor: default;
197
+ opacity: 0.35;
198
+ }
199
+ .PlayerToolbar_title {
200
+ min-width: 0;
201
+ overflow: hidden;
202
+ font-size: 14px;
203
+ font-weight: 600;
204
+ text-overflow: ellipsis;
205
+ white-space: nowrap;
206
+ }
207
+
208
+ /* src/components/VideoPlayer.module.css */
209
+ .VideoPlayer_frame {
210
+ display: flex;
211
+ height: 100%;
212
+ align-items: center;
213
+ justify-content: center;
214
+ background:
215
+ radial-gradient(
216
+ circle at top,
217
+ rgba(95, 156, 255, 0.16),
218
+ transparent 40%),
219
+ #05070c;
220
+ }
221
+ .VideoPlayer_video {
222
+ width: 100%;
223
+ height: 100%;
224
+ object-fit: contain;
225
+ background: #000;
226
+ }
227
+ /*# sourceMappingURL=frontend.css.map */
228
+ `,document.head.appendChild(i)})();var a=window.React;a.Children;a.Component;a.Fragment;a.Profiler;a.PureComponent;a.StrictMode;a.Suspense;a.cloneElement;a.createContext;a.createElement;a.createRef;a.forwardRef;a.isValidElement;a.lazy;a.memo;a.startTransition;var u=a.useCallback;a.useContext;a.useDebugValue;a.useDeferredValue;var $=a.useEffect;a.useId;a.useImperativeHandle;a.useInsertionEffect;a.useLayoutEffect;a.useMemo;a.useReducer;var Q=a.useRef,P=a.useState;a.useSyncExternalStore;a.useTransition;a.version;var ne=window.ReactDOM,se=ne.createRoot;ne.hydrateRoot;var N={root:"PlayerApp_root",viewport:"PlayerApp_viewport",emptyState:"PlayerApp_emptyState",errorState:"PlayerApp_errorState",errorIcon:"PlayerApp_errorIcon",hint:"PlayerApp_hint"},s={shell:"AudioPlayer_shell",hero:"AudioPlayer_hero",icon:"AudioPlayer_icon",title:"AudioPlayer_title",seekGroup:"AudioPlayer_seekGroup",volumeGroup:"AudioPlayer_volumeGroup",time:"AudioPlayer_time",slider:"AudioPlayer_slider",controls:"AudioPlayer_controls",transportButton:"AudioPlayer_transportButton",playButton:"AudioPlayer_playButton",muteButton:"AudioPlayer_muteButton",label:"AudioPlayer_label"},O=window.__desktalk_jsx_runtime,t=O.jsx,y=O.jsxs;O.jsxDEV;O.Fragment;function X(o){if(!Number.isFinite(o)||o<0)return"0:00";const i=Math.floor(o),l=Math.floor(i/60),c=i%60;return`${l}:${String(c).padStart(2,"0")}`}function de({fileName:o,src:i,playing:l,currentTime:c,duration:p,volume:r,muted:h,canGoPrevious:T,canGoNext:g,audioRef:x,onLoadedMetadata:m,onTimeUpdate:K,onPlay:v,onPause:U,onSeek:w,onTogglePlayback:E,onToggleMute:F,onVolumeChange:B,onPrevious:M,onNext:R}){const _=Number.isFinite(p)&&p>0?p:0,A=Math.min(c,_);return y("div",{className:s.shell,children:[t("audio",{ref:x,src:i,preload:"metadata",onLoadedMetadata:m,onTimeUpdate:K,onPlay:v,onPause:U}),y("div",{className:s.hero,children:[t("div",{className:s.icon,children:"🎵"}),t("div",{className:s.title,children:o})]}),y("div",{className:s.seekGroup,children:[t("span",{className:s.time,children:X(c)}),t("input",{className:s.slider,type:"range",min:0,max:_||0,step:.1,value:A,onChange:b=>w(Number(b.target.value))}),t("span",{className:s.time,children:X(p)})]}),y("div",{className:s.controls,children:[t("button",{type:"button",className:s.transportButton,onClick:M,disabled:!T,title:"Previous file",children:"⏮"}),t("button",{type:"button",className:s.playButton,onClick:E,children:l?"⏸":"▶"}),t("button",{type:"button",className:s.transportButton,onClick:R,disabled:!g,title:"Next file",children:"⏭"})]}),y("div",{className:s.volumeGroup,children:[t("span",{className:s.label,children:"Volume"}),t("button",{type:"button",className:s.muteButton,onClick:F,title:"Mute",children:h||r===0?"🔇":"🔊"}),t("input",{className:s.slider,type:"range",min:0,max:1,step:.01,value:h?0:r,onChange:b=>B(Number(b.target.value))})]})]})}function ue({children:o,state:i,onOpenFile:l,onPlay:c,onPause:p,onPrevious:r,onNext:h}){const T=u(async()=>i,[i]),g=u(async x=>{const m=typeof x?.path=="string"?x.path:"";return m?l(m):{error:"path parameter is required"}},[l]);return y(le,{children:[t(k,{name:"Get State",description:"Return the current player state",handler:T}),t(k,{name:"Open File",description:"Open a supported audio or video file",params:{path:{type:"string",description:"Relative media file path",required:!0}},handler:g}),t(k,{name:"Play",description:"Start or resume playback",handler:c}),t(k,{name:"Pause",description:"Pause playback",handler:p}),t(k,{name:"Previous File",description:"Open the previous sibling media file",handler:r}),t(k,{name:"Next File",description:"Open the next sibling media file",handler:h}),o]})}var L={toolbar:"PlayerToolbar_toolbar",navButton:"PlayerToolbar_navButton",title:"PlayerToolbar_title"};function ce({filename:o,canGoPrevious:i,canGoNext:l,onPrevious:c,onNext:p}){return y("div",{className:L.toolbar,children:[t("button",{type:"button",className:L.navButton,onClick:c,disabled:!i,title:"Previous file",children:"‹"}),t("button",{type:"button",className:L.navButton,onClick:p,disabled:!l,title:"Next file",children:"›"}),t("div",{className:L.title,children:o})]})}var Y={frame:"VideoPlayer_frame",video:"VideoPlayer_video"};function pe({src:o,videoRef:i,onLoadedMetadata:l,onTimeUpdate:c,onPlay:p,onPause:r}){return t("div",{className:Y.frame,children:t("video",{ref:i,className:Y.video,src:o,controls:!0,autoPlay:!0,preload:"metadata",onLoadedMetadata:l,onTimeUpdate:c,onPlay:p,onPause:r})})}var Z=5,ee=.1;function S(o,i){return{mode:o?.kind??"audio",playing:i,file:o?{name:o.name,path:o.path,kind:o.kind,mimeType:o.mimeType}:null}}function me({initialPath:o}){const i=z("player.open"),l=z("player.siblings"),c=z("player.next"),p=z("player.previous"),[r,h]=P(null),[T,g]=P(null),[x,m]=P(!1),[K,v]=P(0),[U,w]=P(0),[E,F]=P(1),[B,M]=P(!1),[R,_]=P(null),A=Q(null),b=Q(null),f=u(()=>r?.kind==="video"?b.current:A.current,[r?.kind]),V=u(()=>{const e=r?.kind==="video"?b.current:A.current;e&&(v(e.currentTime||0),w(Number.isFinite(e.duration)?e.duration:0),F(e.volume),M(e.muted))},[r?.kind]),J=u(async e=>{const n=await i({path:e});h(n),_(null),v(0),w(0);const d=await l({path:n.path});return g(d),n},[l,i]),H=u(async e=>{try{const n=await J(e);return S(n,!1)}catch(n){return h(null),g(null),m(!1),_(n instanceof Error?n.message:"Failed to open media file."),{error:n instanceof Error?n.message:"Failed to open media file."}}},[J]);$(()=>{o&&H(o)},[o,H]),$(()=>{if(!r)return;const e=r.kind==="video"?b.current:A.current;if(!e)return;e.currentTime=0,e.muted=B,e.volume=E;const n=e.play();n&&typeof n.catch=="function"&&n.catch(()=>{m(!1)})},[r,B,E]);const C=u(async()=>{if(!r)return{error:"No media file is open."};try{const e=await p({currentPath:r.path});return h(e),_(null),m(!1),v(0),w(0),g(await l({path:e.path})),S(e,!1)}catch(e){return{error:e instanceof Error?e.message:"Failed to open previous file."}}},[r,l,p]),D=u(async()=>{if(!r)return{error:"No media file is open."};try{const e=await c({currentPath:r.path});return h(e),_(null),m(!1),v(0),w(0),g(await l({path:e.path})),S(e,!1)}catch(e){return{error:e instanceof Error?e.message:"Failed to open next file."}}},[r,l,c]),q=u(async()=>{const e=f();e&&(e.paused?await e.play():e.pause())},[f]),te=u(async()=>{const e=f();return e?(await e.play(),S(r,!0)):{error:"No media file is open."}},[r,f]),re=u(async()=>{const e=f();return e?(e.pause(),S(r,!1)):{error:"No media file is open."}},[r,f]),I=u(e=>{const n=f();n&&(n.currentTime=e,v(e))},[f]),G=u(e=>{const n=f(),d=Math.max(0,Math.min(1,e));n&&(n.volume=d,n.muted=d===0),F(d),M(d===0)},[f]),W=u(()=>{const e=f();if(!e)return;const n=!e.muted;e.muted=n,M(n)},[f]);$(()=>{const e=n=>{if(!r||n.target instanceof HTMLInputElement||n.target instanceof HTMLTextAreaElement||n.metaKey||n.ctrlKey||n.altKey)return;if(n.shiftKey&&n.key==="ArrowLeft"){n.preventDefault(),C();return}if(n.shiftKey&&n.key==="ArrowRight"){n.preventDefault(),D();return}if(n.key===" "){n.preventDefault(),q();return}if(r.kind!=="audio")return;const d=A.current;d&&(n.key==="ArrowLeft"?(n.preventDefault(),I(Math.max(0,d.currentTime-Z))):n.key==="ArrowRight"?(n.preventDefault(),I(Math.min(d.duration||0,d.currentTime+Z))):n.key==="ArrowUp"?(n.preventDefault(),G((d.muted?0:d.volume)+ee)):n.key==="ArrowDown"?(n.preventDefault(),G((d.muted?0:d.volume)-ee)):n.key.toLowerCase()==="m"&&(n.preventDefault(),W()))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[r,D,C,I,W,G,q]);const j=(T?.files.length??0)>1,ae=S(r,x);return t(ue,{state:ae,onOpenFile:H,onPlay:te,onPause:re,onPrevious:C,onNext:D,children:y("div",{className:N.root,children:[t(ce,{filename:r?.name??"Player",canGoPrevious:j,canGoNext:j,onPrevious:()=>{C()},onNext:()=>{D()}}),t("div",{className:N.viewport,children:r?r.kind==="audio"?t(de,{fileName:r.name,src:r.dataUrl,playing:x,currentTime:K,duration:U,volume:E,muted:B,canGoPrevious:j,canGoNext:j,audioRef:A,onLoadedMetadata:V,onTimeUpdate:V,onPlay:()=>m(!0),onPause:()=>m(!1),onSeek:I,onTogglePlayback:()=>{q()},onToggleMute:W,onVolumeChange:G,onPrevious:()=>{C()},onNext:()=>{D()}}):t(pe,{src:r.dataUrl,videoRef:b,onLoadedMetadata:V,onTimeUpdate:V,onPlay:()=>m(!0),onPause:()=>m(!1)}):R?y("div",{className:N.errorState,children:[t("div",{className:N.errorIcon,children:"⚠"}),t("div",{children:R})]}):y("div",{className:N.emptyState,children:[t("div",{children:"No media file open"}),t("div",{className:N.hint,children:"Open a supported audio or video file from File Explorer, or launch Player with a `path` argument."})]})})]})})}function ye(o){const i=typeof o.args?.path=="string"?o.args.path:void 0,l=se(o.root);return l.render(t(oe,{windowId:o.windowId,children:t(ie,{miniAppId:o.miniAppId,children:t(me,{initialPath:i})})})),{deactivate(){l.unmount()}}}export{ye as activate};
229
+ //# sourceMappingURL=frontend-Dix2OWTT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend-Dix2OWTT.js","sources":["../../../../miniapp-player/dist/frontend.js"],"sourcesContent":["(() => {\n if (typeof document === 'undefined') return;\n const styleId = \"desktalk-style-desktalk-miniapp-player-lat2sd\";\n if (document.getElementById(styleId)) return;\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = \"/* src/PlayerApp.module.css */\\n.PlayerApp_root {\\n display: flex;\\n height: 100%;\\n flex-direction: column;\\n overflow: hidden;\\n background:\\n linear-gradient(\\n 180deg,\\n #131922 0%,\\n #0d1118 100%);\\n color: #f4f7fb;\\n}\\n.PlayerApp_viewport {\\n flex: 1;\\n min-height: 0;\\n}\\n.PlayerApp_emptyState,\\n.PlayerApp_errorState {\\n display: flex;\\n height: 100%;\\n min-height: 240px;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n gap: 10px;\\n padding: 24px;\\n color: rgba(244, 247, 251, 0.78);\\n text-align: center;\\n}\\n.PlayerApp_errorState {\\n color: #ffd0d0;\\n}\\n.PlayerApp_errorIcon {\\n font-size: 28px;\\n}\\n.PlayerApp_hint {\\n max-width: 420px;\\n font-size: 13px;\\n line-height: 1.5;\\n}\\n\\n/* src/components/AudioPlayer.module.css */\\n.AudioPlayer_shell {\\n display: flex;\\n height: 100%;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n gap: 22px;\\n padding: 32px 20px 40px;\\n background:\\n radial-gradient(\\n circle at top,\\n rgba(126, 224, 186, 0.15),\\n transparent 42%),\\n linear-gradient(\\n 180deg,\\n rgba(255, 255, 255, 0.02),\\n rgba(255, 255, 255, 0));\\n}\\n.AudioPlayer_hero {\\n display: flex;\\n width: min(100%, 460px);\\n flex-direction: column;\\n align-items: center;\\n gap: 12px;\\n text-align: center;\\n}\\n.AudioPlayer_icon {\\n display: flex;\\n width: 132px;\\n height: 132px;\\n align-items: center;\\n justify-content: center;\\n border: 1px solid rgba(255, 255, 255, 0.09);\\n border-radius: 28px;\\n background:\\n linear-gradient(\\n 145deg,\\n rgba(126, 224, 186, 0.18),\\n rgba(88, 124, 255, 0.12));\\n box-shadow: 0 20px 50px rgba(0, 0, 0, 0.28);\\n font-size: 52px;\\n}\\n.AudioPlayer_title {\\n max-width: 100%;\\n overflow: hidden;\\n font-size: 24px;\\n font-weight: 700;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.AudioPlayer_seekGroup,\\n.AudioPlayer_volumeGroup {\\n display: flex;\\n width: min(100%, 460px);\\n align-items: center;\\n gap: 12px;\\n}\\n.AudioPlayer_time {\\n width: 42px;\\n color: rgba(244, 247, 251, 0.72);\\n font-size: 12px;\\n font-variant-numeric: tabular-nums;\\n}\\n.AudioPlayer_time:last-child {\\n text-align: right;\\n}\\n.AudioPlayer_slider {\\n width: 100%;\\n}\\n.AudioPlayer_controls {\\n display: flex;\\n align-items: center;\\n gap: 12px;\\n}\\n.AudioPlayer_transportButton,\\n.AudioPlayer_playButton,\\n.AudioPlayer_muteButton {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n color: inherit;\\n cursor: pointer;\\n}\\n.AudioPlayer_transportButton,\\n.AudioPlayer_muteButton {\\n width: 42px;\\n height: 42px;\\n border-radius: 999px;\\n background: rgba(255, 255, 255, 0.08);\\n font-size: 16px;\\n}\\n.AudioPlayer_playButton {\\n width: 58px;\\n height: 58px;\\n border-radius: 999px;\\n background:\\n linear-gradient(\\n 135deg,\\n #7ee0ba,\\n #5f9cff);\\n color: #081018;\\n font-size: 22px;\\n font-weight: 700;\\n}\\n.AudioPlayer_label {\\n width: 56px;\\n color: rgba(244, 247, 251, 0.72);\\n font-size: 12px;\\n text-transform: uppercase;\\n letter-spacing: 0.08em;\\n}\\n.AudioPlayer_transportButton:disabled,\\n.AudioPlayer_playButton:disabled,\\n.AudioPlayer_muteButton:disabled {\\n cursor: default;\\n opacity: 0.4;\\n}\\n\\n/* src/components/PlayerToolbar.module.css */\\n.PlayerToolbar_toolbar {\\n display: flex;\\n flex-shrink: 0;\\n align-items: center;\\n gap: 10px;\\n padding: 12px 14px;\\n border-bottom: 1px solid rgba(255, 255, 255, 0.08);\\n background: rgba(7, 10, 16, 0.72);\\n backdrop-filter: blur(10px);\\n}\\n.PlayerToolbar_navButton {\\n display: inline-flex;\\n width: 30px;\\n height: 30px;\\n align-items: center;\\n justify-content: center;\\n border: 1px solid rgba(255, 255, 255, 0.12);\\n border-radius: 999px;\\n background: rgba(255, 255, 255, 0.06);\\n color: inherit;\\n cursor: pointer;\\n font-size: 14px;\\n transition:\\n background 0.15s,\\n border-color 0.15s,\\n opacity 0.15s;\\n}\\n.PlayerToolbar_navButton:hover:not(:disabled) {\\n border-color: rgba(126, 224, 186, 0.65);\\n background: rgba(126, 224, 186, 0.14);\\n}\\n.PlayerToolbar_navButton:disabled {\\n cursor: default;\\n opacity: 0.35;\\n}\\n.PlayerToolbar_title {\\n min-width: 0;\\n overflow: hidden;\\n font-size: 14px;\\n font-weight: 600;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n/* src/components/VideoPlayer.module.css */\\n.VideoPlayer_frame {\\n display: flex;\\n height: 100%;\\n align-items: center;\\n justify-content: center;\\n background:\\n radial-gradient(\\n circle at top,\\n rgba(95, 156, 255, 0.16),\\n transparent 40%),\\n #05070c;\\n}\\n.VideoPlayer_video {\\n width: 100%;\\n height: 100%;\\n object-fit: contain;\\n background: #000;\\n}\\n/*# sourceMappingURL=frontend.css.map */\\n\";\n document.head.appendChild(style);\n})();\n\n// desktalk-global:react\nvar _mod = window.React;\nvar Children = _mod.Children;\nvar Component = _mod.Component;\nvar Fragment = _mod.Fragment;\nvar Profiler = _mod.Profiler;\nvar PureComponent = _mod.PureComponent;\nvar StrictMode = _mod.StrictMode;\nvar Suspense = _mod.Suspense;\nvar cloneElement = _mod.cloneElement;\nvar createContext = _mod.createContext;\nvar createElement = _mod.createElement;\nvar createRef = _mod.createRef;\nvar forwardRef = _mod.forwardRef;\nvar isValidElement = _mod.isValidElement;\nvar lazy = _mod.lazy;\nvar memo = _mod.memo;\nvar startTransition = _mod.startTransition;\nvar useCallback = _mod.useCallback;\nvar useContext = _mod.useContext;\nvar useDebugValue = _mod.useDebugValue;\nvar useDeferredValue = _mod.useDeferredValue;\nvar useEffect = _mod.useEffect;\nvar useId = _mod.useId;\nvar useImperativeHandle = _mod.useImperativeHandle;\nvar useInsertionEffect = _mod.useInsertionEffect;\nvar useLayoutEffect = _mod.useLayoutEffect;\nvar useMemo = _mod.useMemo;\nvar useReducer = _mod.useReducer;\nvar useRef = _mod.useRef;\nvar useState = _mod.useState;\nvar useSyncExternalStore = _mod.useSyncExternalStore;\nvar useTransition = _mod.useTransition;\nvar version = _mod.version;\n\n// desktalk-global:react-dom/client\nvar _mod2 = window.ReactDOM;\nvar createRoot = _mod2.createRoot;\nvar hydrateRoot = _mod2.hydrateRoot;\n\n// src/frontend.tsx\nimport { MiniAppIdProvider, WindowIdProvider, useCommand } from \"@desktalk/sdk\";\n\n// src/PlayerApp.module.css\nvar PlayerApp_default = {\n root: \"PlayerApp_root\",\n viewport: \"PlayerApp_viewport\",\n emptyState: \"PlayerApp_emptyState\",\n errorState: \"PlayerApp_errorState\",\n errorIcon: \"PlayerApp_errorIcon\",\n hint: \"PlayerApp_hint\"\n};\n\n// src/components/AudioPlayer.module.css\nvar AudioPlayer_default = {\n shell: \"AudioPlayer_shell\",\n hero: \"AudioPlayer_hero\",\n icon: \"AudioPlayer_icon\",\n title: \"AudioPlayer_title\",\n seekGroup: \"AudioPlayer_seekGroup\",\n volumeGroup: \"AudioPlayer_volumeGroup\",\n time: \"AudioPlayer_time\",\n slider: \"AudioPlayer_slider\",\n controls: \"AudioPlayer_controls\",\n transportButton: \"AudioPlayer_transportButton\",\n playButton: \"AudioPlayer_playButton\",\n muteButton: \"AudioPlayer_muteButton\",\n label: \"AudioPlayer_label\"\n};\n\n// desktalk-global:react/jsx-runtime\nvar _mod3 = window.__desktalk_jsx_runtime;\nvar jsx = _mod3.jsx;\nvar jsxs = _mod3.jsxs;\nvar jsxDEV = _mod3.jsxDEV;\nvar Fragment2 = _mod3.Fragment;\n\n// src/components/AudioPlayer.tsx\nfunction formatTime(seconds) {\n if (!Number.isFinite(seconds) || seconds < 0) {\n return \"0:00\";\n }\n const totalSeconds = Math.floor(seconds);\n const minutes = Math.floor(totalSeconds / 60);\n const remainder = totalSeconds % 60;\n return `${minutes}:${String(remainder).padStart(2, \"0\")}`;\n}\nfunction AudioPlayer({\n fileName,\n src,\n playing,\n currentTime,\n duration,\n volume,\n muted,\n canGoPrevious,\n canGoNext,\n audioRef,\n onLoadedMetadata,\n onTimeUpdate,\n onPlay,\n onPause,\n onSeek,\n onTogglePlayback,\n onToggleMute,\n onVolumeChange,\n onPrevious,\n onNext\n}) {\n const safeDuration = Number.isFinite(duration) && duration > 0 ? duration : 0;\n const seekValue = Math.min(currentTime, safeDuration);\n return /* @__PURE__ */ jsxs(\"div\", { className: AudioPlayer_default.shell, children: [\n /* @__PURE__ */ jsx(\n \"audio\",\n {\n ref: audioRef,\n src,\n preload: \"metadata\",\n onLoadedMetadata,\n onTimeUpdate,\n onPlay,\n onPause\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { className: AudioPlayer_default.hero, children: [\n /* @__PURE__ */ jsx(\"div\", { className: AudioPlayer_default.icon, children: \"\\u{1F3B5}\" }),\n /* @__PURE__ */ jsx(\"div\", { className: AudioPlayer_default.title, children: fileName })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: AudioPlayer_default.seekGroup, children: [\n /* @__PURE__ */ jsx(\"span\", { className: AudioPlayer_default.time, children: formatTime(currentTime) }),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n className: AudioPlayer_default.slider,\n type: \"range\",\n min: 0,\n max: safeDuration || 0,\n step: 0.1,\n value: seekValue,\n onChange: (event) => onSeek(Number(event.target.value))\n }\n ),\n /* @__PURE__ */ jsx(\"span\", { className: AudioPlayer_default.time, children: formatTime(duration) })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: AudioPlayer_default.controls, children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n className: AudioPlayer_default.transportButton,\n onClick: onPrevious,\n disabled: !canGoPrevious,\n title: \"Previous file\",\n children: \"\\u23EE\"\n }\n ),\n /* @__PURE__ */ jsx(\"button\", { type: \"button\", className: AudioPlayer_default.playButton, onClick: onTogglePlayback, children: playing ? \"\\u23F8\" : \"\\u25B6\" }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n className: AudioPlayer_default.transportButton,\n onClick: onNext,\n disabled: !canGoNext,\n title: \"Next file\",\n children: \"\\u23ED\"\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: AudioPlayer_default.volumeGroup, children: [\n /* @__PURE__ */ jsx(\"span\", { className: AudioPlayer_default.label, children: \"Volume\" }),\n /* @__PURE__ */ jsx(\"button\", { type: \"button\", className: AudioPlayer_default.muteButton, onClick: onToggleMute, title: \"Mute\", children: muted || volume === 0 ? \"\\u{1F507}\" : \"\\u{1F50A}\" }),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n className: AudioPlayer_default.slider,\n type: \"range\",\n min: 0,\n max: 1,\n step: 0.01,\n value: muted ? 0 : volume,\n onChange: (event) => onVolumeChange(Number(event.target.value))\n }\n )\n ] })\n ] });\n}\n\n// src/components/PlayerActions.tsx\nimport { Action, ActionsProvider } from \"@desktalk/sdk\";\nfunction PlayerActions({\n children,\n state,\n onOpenFile,\n onPlay,\n onPause,\n onPrevious,\n onNext\n}) {\n const handleGetState = useCallback(async () => state, [state]);\n const handleOpenFile = useCallback(\n async (params) => {\n const path = typeof params?.path === \"string\" ? params.path : \"\";\n if (!path) {\n return { error: \"path parameter is required\" };\n }\n return onOpenFile(path);\n },\n [onOpenFile]\n );\n return /* @__PURE__ */ jsxs(ActionsProvider, { children: [\n /* @__PURE__ */ jsx(\n Action,\n {\n name: \"Get State\",\n description: \"Return the current player state\",\n handler: handleGetState\n }\n ),\n /* @__PURE__ */ jsx(\n Action,\n {\n name: \"Open File\",\n description: \"Open a supported audio or video file\",\n params: {\n path: { type: \"string\", description: \"Relative media file path\", required: true }\n },\n handler: handleOpenFile\n }\n ),\n /* @__PURE__ */ jsx(Action, { name: \"Play\", description: \"Start or resume playback\", handler: onPlay }),\n /* @__PURE__ */ jsx(Action, { name: \"Pause\", description: \"Pause playback\", handler: onPause }),\n /* @__PURE__ */ jsx(\n Action,\n {\n name: \"Previous File\",\n description: \"Open the previous sibling media file\",\n handler: onPrevious\n }\n ),\n /* @__PURE__ */ jsx(Action, { name: \"Next File\", description: \"Open the next sibling media file\", handler: onNext }),\n children\n ] });\n}\n\n// src/components/PlayerToolbar.module.css\nvar PlayerToolbar_default = {\n toolbar: \"PlayerToolbar_toolbar\",\n navButton: \"PlayerToolbar_navButton\",\n title: \"PlayerToolbar_title\"\n};\n\n// src/components/PlayerToolbar.tsx\nfunction PlayerToolbar({\n filename,\n canGoPrevious,\n canGoNext,\n onPrevious,\n onNext\n}) {\n return /* @__PURE__ */ jsxs(\"div\", { className: PlayerToolbar_default.toolbar, children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n className: PlayerToolbar_default.navButton,\n onClick: onPrevious,\n disabled: !canGoPrevious,\n title: \"Previous file\",\n children: \"\\u2039\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n className: PlayerToolbar_default.navButton,\n onClick: onNext,\n disabled: !canGoNext,\n title: \"Next file\",\n children: \"\\u203A\"\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: PlayerToolbar_default.title, children: filename })\n ] });\n}\n\n// src/components/VideoPlayer.module.css\nvar VideoPlayer_default = {\n frame: \"VideoPlayer_frame\",\n video: \"VideoPlayer_video\"\n};\n\n// src/components/VideoPlayer.tsx\nfunction VideoPlayer({\n src,\n videoRef,\n onLoadedMetadata,\n onTimeUpdate,\n onPlay,\n onPause\n}) {\n return /* @__PURE__ */ jsx(\"div\", { className: VideoPlayer_default.frame, children: /* @__PURE__ */ jsx(\n \"video\",\n {\n ref: videoRef,\n className: VideoPlayer_default.video,\n src,\n controls: true,\n autoPlay: true,\n preload: \"metadata\",\n onLoadedMetadata,\n onTimeUpdate,\n onPlay,\n onPause\n }\n ) });\n}\n\n// src/frontend.tsx\nvar SEEK_STEP_SECONDS = 5;\nvar VOLUME_STEP = 0.1;\nfunction createActionState(currentFile, playing) {\n return {\n mode: currentFile?.kind ?? \"audio\",\n playing,\n file: currentFile ? {\n name: currentFile.name,\n path: currentFile.path,\n kind: currentFile.kind,\n mimeType: currentFile.mimeType\n } : null\n };\n}\nfunction PlayerApp({ initialPath }) {\n const openFile = useCommand(\"player.open\");\n const getSiblings = useCommand(\"player.siblings\");\n const nextFile = useCommand(\"player.next\");\n const previousFile = useCommand(\"player.previous\");\n const [currentFile, setCurrentFile] = useState(null);\n const [siblings, setSiblings] = useState(null);\n const [playing, setPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [muted, setMuted] = useState(false);\n const [error, setError] = useState(null);\n const audioRef = useRef(null);\n const videoRef = useRef(null);\n const getActiveMediaElement = useCallback(() => {\n return currentFile?.kind === \"video\" ? videoRef.current : audioRef.current;\n }, [currentFile?.kind]);\n const syncPlaybackMetrics = useCallback(() => {\n const media = currentFile?.kind === \"video\" ? videoRef.current : audioRef.current;\n if (!media) return;\n setCurrentTime(media.currentTime || 0);\n setDuration(Number.isFinite(media.duration) ? media.duration : 0);\n setVolume(media.volume);\n setMuted(media.muted);\n }, [currentFile?.kind]);\n const loadMedia = useCallback(\n async (path) => {\n const file = await openFile({ path });\n setCurrentFile(file);\n setError(null);\n setCurrentTime(0);\n setDuration(0);\n const nextSiblings = await getSiblings({ path: file.path });\n setSiblings(nextSiblings);\n return file;\n },\n [getSiblings, openFile]\n );\n const loadMediaSafe = useCallback(\n async (path) => {\n try {\n const file = await loadMedia(path);\n return createActionState(file, false);\n } catch (err) {\n setCurrentFile(null);\n setSiblings(null);\n setPlaying(false);\n setError(err instanceof Error ? err.message : \"Failed to open media file.\");\n return { error: err instanceof Error ? err.message : \"Failed to open media file.\" };\n }\n },\n [loadMedia]\n );\n useEffect(() => {\n if (!initialPath) return;\n void loadMediaSafe(initialPath);\n }, [initialPath, loadMediaSafe]);\n useEffect(() => {\n if (!currentFile) return;\n const media = currentFile.kind === \"video\" ? videoRef.current : audioRef.current;\n if (!media) return;\n media.currentTime = 0;\n media.muted = muted;\n media.volume = volume;\n const playPromise = media.play();\n if (playPromise && typeof playPromise.catch === \"function\") {\n playPromise.catch(() => {\n setPlaying(false);\n });\n }\n }, [currentFile, muted, volume]);\n const handlePrevious = useCallback(async () => {\n if (!currentFile) {\n return { error: \"No media file is open.\" };\n }\n try {\n const file = await previousFile({ currentPath: currentFile.path });\n setCurrentFile(file);\n setError(null);\n setPlaying(false);\n setCurrentTime(0);\n setDuration(0);\n setSiblings(await getSiblings({ path: file.path }));\n return createActionState(file, false);\n } catch (err) {\n return { error: err instanceof Error ? err.message : \"Failed to open previous file.\" };\n }\n }, [currentFile, getSiblings, previousFile]);\n const handleNext = useCallback(async () => {\n if (!currentFile) {\n return { error: \"No media file is open.\" };\n }\n try {\n const file = await nextFile({ currentPath: currentFile.path });\n setCurrentFile(file);\n setError(null);\n setPlaying(false);\n setCurrentTime(0);\n setDuration(0);\n setSiblings(await getSiblings({ path: file.path }));\n return createActionState(file, false);\n } catch (err) {\n return { error: err instanceof Error ? err.message : \"Failed to open next file.\" };\n }\n }, [currentFile, getSiblings, nextFile]);\n const togglePlayback = useCallback(async () => {\n const media = getActiveMediaElement();\n if (!media) return;\n if (media.paused) {\n await media.play();\n } else {\n media.pause();\n }\n }, [getActiveMediaElement]);\n const handlePlay = useCallback(async () => {\n const media = getActiveMediaElement();\n if (!media) return { error: \"No media file is open.\" };\n await media.play();\n return createActionState(currentFile, true);\n }, [currentFile, getActiveMediaElement]);\n const handlePause = useCallback(async () => {\n const media = getActiveMediaElement();\n if (!media) return { error: \"No media file is open.\" };\n media.pause();\n return createActionState(currentFile, false);\n }, [currentFile, getActiveMediaElement]);\n const handleSeek = useCallback(\n (time) => {\n const media = getActiveMediaElement();\n if (!media) return;\n media.currentTime = time;\n setCurrentTime(time);\n },\n [getActiveMediaElement]\n );\n const handleVolumeChange = useCallback(\n (nextVolume) => {\n const media = getActiveMediaElement();\n const normalized = Math.max(0, Math.min(1, nextVolume));\n if (media) {\n media.volume = normalized;\n media.muted = normalized === 0;\n }\n setVolume(normalized);\n setMuted(normalized === 0);\n },\n [getActiveMediaElement]\n );\n const handleToggleMute = useCallback(() => {\n const media = getActiveMediaElement();\n if (!media) return;\n const nextMuted = !media.muted;\n media.muted = nextMuted;\n setMuted(nextMuted);\n }, [getActiveMediaElement]);\n useEffect(() => {\n const handleKeyDown = (event) => {\n if (!currentFile) return;\n if (event.target instanceof HTMLInputElement || event.target instanceof HTMLTextAreaElement)\n return;\n if (event.metaKey || event.ctrlKey || event.altKey) return;\n if (event.shiftKey && event.key === \"ArrowLeft\") {\n event.preventDefault();\n void handlePrevious();\n return;\n }\n if (event.shiftKey && event.key === \"ArrowRight\") {\n event.preventDefault();\n void handleNext();\n return;\n }\n if (event.key === \" \") {\n event.preventDefault();\n void togglePlayback();\n return;\n }\n if (currentFile.kind !== \"audio\") {\n return;\n }\n const media = audioRef.current;\n if (!media) return;\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n handleSeek(Math.max(0, media.currentTime - SEEK_STEP_SECONDS));\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n handleSeek(Math.min(media.duration || 0, media.currentTime + SEEK_STEP_SECONDS));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n handleVolumeChange((media.muted ? 0 : media.volume) + VOLUME_STEP);\n } else if (event.key === \"ArrowDown\") {\n event.preventDefault();\n handleVolumeChange((media.muted ? 0 : media.volume) - VOLUME_STEP);\n } else if (event.key.toLowerCase() === \"m\") {\n event.preventDefault();\n handleToggleMute();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [\n currentFile,\n handleNext,\n handlePrevious,\n handleSeek,\n handleToggleMute,\n handleVolumeChange,\n togglePlayback\n ]);\n const canNavigate = (siblings?.files.length ?? 0) > 1;\n const actionState = createActionState(currentFile, playing);\n return /* @__PURE__ */ jsx(\n PlayerActions,\n {\n state: actionState,\n onOpenFile: loadMediaSafe,\n onPlay: handlePlay,\n onPause: handlePause,\n onPrevious: handlePrevious,\n onNext: handleNext,\n children: /* @__PURE__ */ jsxs(\"div\", { className: PlayerApp_default.root, children: [\n /* @__PURE__ */ jsx(\n PlayerToolbar,\n {\n filename: currentFile?.name ?? \"Player\",\n canGoPrevious: canNavigate,\n canGoNext: canNavigate,\n onPrevious: () => {\n void handlePrevious();\n },\n onNext: () => {\n void handleNext();\n }\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: PlayerApp_default.viewport, children: currentFile ? currentFile.kind === \"audio\" ? /* @__PURE__ */ jsx(\n AudioPlayer,\n {\n fileName: currentFile.name,\n src: currentFile.dataUrl,\n playing,\n currentTime,\n duration,\n volume,\n muted,\n canGoPrevious: canNavigate,\n canGoNext: canNavigate,\n audioRef,\n onLoadedMetadata: syncPlaybackMetrics,\n onTimeUpdate: syncPlaybackMetrics,\n onPlay: () => setPlaying(true),\n onPause: () => setPlaying(false),\n onSeek: handleSeek,\n onTogglePlayback: () => {\n void togglePlayback();\n },\n onToggleMute: handleToggleMute,\n onVolumeChange: handleVolumeChange,\n onPrevious: () => {\n void handlePrevious();\n },\n onNext: () => {\n void handleNext();\n }\n }\n ) : /* @__PURE__ */ jsx(\n VideoPlayer,\n {\n src: currentFile.dataUrl,\n videoRef,\n onLoadedMetadata: syncPlaybackMetrics,\n onTimeUpdate: syncPlaybackMetrics,\n onPlay: () => setPlaying(true),\n onPause: () => setPlaying(false)\n }\n ) : error ? /* @__PURE__ */ jsxs(\"div\", { className: PlayerApp_default.errorState, children: [\n /* @__PURE__ */ jsx(\"div\", { className: PlayerApp_default.errorIcon, children: \"\\u26A0\" }),\n /* @__PURE__ */ jsx(\"div\", { children: error })\n ] }) : /* @__PURE__ */ jsxs(\"div\", { className: PlayerApp_default.emptyState, children: [\n /* @__PURE__ */ jsx(\"div\", { children: \"No media file open\" }),\n /* @__PURE__ */ jsx(\"div\", { className: PlayerApp_default.hint, children: \"Open a supported audio or video file from File Explorer, or launch Player with a `path` argument.\" })\n ] }) })\n ] })\n }\n );\n}\nfunction activate(ctx) {\n const initialPath = typeof ctx.args?.path === \"string\" ? ctx.args.path : void 0;\n const root = createRoot(ctx.root);\n root.render(\n /* @__PURE__ */ jsx(WindowIdProvider, { windowId: ctx.windowId, children: /* @__PURE__ */ jsx(MiniAppIdProvider, { miniAppId: ctx.miniAppId, children: /* @__PURE__ */ jsx(PlayerApp, { initialPath }) }) })\n );\n return {\n deactivate() {\n root.unmount();\n }\n };\n}\nexport {\n activate\n};\n//# sourceMappingURL=frontend.js.map\n"],"names":["styleId","style","_mod","useCallback","useEffect","useRef","useState","_mod2","createRoot","PlayerApp_default","AudioPlayer_default","_mod3","jsx","jsxs","formatTime","seconds","totalSeconds","minutes","remainder","AudioPlayer","fileName","src","playing","currentTime","duration","volume","muted","canGoPrevious","canGoNext","audioRef","onLoadedMetadata","onTimeUpdate","onPlay","onPause","onSeek","onTogglePlayback","onToggleMute","onVolumeChange","onPrevious","onNext","safeDuration","seekValue","event","PlayerActions","children","state","onOpenFile","handleGetState","handleOpenFile","params","path","ActionsProvider","Action","PlayerToolbar_default","PlayerToolbar","filename","VideoPlayer_default","VideoPlayer","videoRef","SEEK_STEP_SECONDS","VOLUME_STEP","createActionState","currentFile","PlayerApp","initialPath","openFile","useCommand","getSiblings","nextFile","previousFile","setCurrentFile","siblings","setSiblings","setPlaying","setCurrentTime","setDuration","setVolume","setMuted","error","setError","getActiveMediaElement","syncPlaybackMetrics","media","loadMedia","file","nextSiblings","loadMediaSafe","err","playPromise","handlePrevious","handleNext","togglePlayback","handlePlay","handlePause","handleSeek","time","handleVolumeChange","nextVolume","normalized","handleToggleMute","nextMuted","handleKeyDown","canNavigate","actionState","activate","ctx","root","WindowIdProvider","MiniAppIdProvider"],"mappings":"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"}