@xopcai/xopc 0.0.412 → 0.0.414

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 (280) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BrGZdh5N.js → agent-avatar-dicebear-ClobpdW3.js} +1 -1
  4. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-mf0jgEPE.js +1 -0
  5. package/dist/gateway/static/root/assets/agents-CKhZ4UYQ.js +77 -0
  6. package/dist/gateway/static/root/assets/{agents-admin-api-uGDeJR1f.js → agents-admin-api-CeBkHnl8.js} +1 -1
  7. package/dist/gateway/static/root/assets/app-management-settings-panel-CLunLNGp.js +1 -0
  8. package/dist/gateway/static/root/assets/app-window-DXFNqt_0.js +1 -0
  9. package/dist/gateway/static/root/assets/appearance-settings-DBEgoE9g.js +1 -0
  10. package/dist/gateway/static/root/assets/apps-page-BZ_MaQJf.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-DAmsio91.js → archive-plugin-JElK4Goq.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-page-BVutrwON.js → automations-page-CZ0UqwyU.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-workspace-CHUDHNVL.js +8 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-41QCRAxz.js → binary-plugins-CXFawow6.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-BQ8AA-Ot.js → block-editor-BoduwSYI.js} +30 -30
  16. package/dist/gateway/static/root/assets/{browser-automation-inputs-D4-vQc4g.js → browser-automation-inputs-D1pDgMJu.js} +1 -1
  17. package/dist/gateway/static/root/assets/browser-automations-page-DStDm9y1.js +3 -0
  18. package/dist/gateway/static/root/assets/browser-settings-page-6I4oetKt.js +3 -0
  19. package/dist/gateway/static/root/assets/capabilities-Bpeh6E22.js +1 -0
  20. package/dist/gateway/static/root/assets/capabilities-page-C-EecWbS.js +2 -0
  21. package/dist/gateway/static/root/assets/capabilities-settings-panel-BQoCPk3x.js +8 -0
  22. package/dist/gateway/static/root/assets/{capability-header-actions-CDgI-YZF.js → capability-header-actions-BasrAWA0.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-BKf_-Mdt.js +1 -0
  24. package/dist/gateway/static/root/assets/{chat-terminal-dock-CUkCx_9x.js → chat-terminal-dock-CwQbzcZ_.js} +2 -2
  25. package/dist/gateway/static/root/assets/chevron-down-ccbiQQz_.js +1 -0
  26. package/dist/gateway/static/root/assets/computer-settings-page-DNWeJKfF.js +1 -0
  27. package/dist/gateway/static/root/assets/{connector-service-page-49mgdRET.js → connector-service-page-CxHgC5RM.js} +1 -1
  28. package/dist/gateway/static/root/assets/connectors-page-CUBg8spT.js +1 -0
  29. package/dist/gateway/static/root/assets/{date-picker-BpBjADAk.js → date-picker-CXxLbLJb.js} +1 -1
  30. package/dist/gateway/static/root/assets/dependency-picker-DVuWMrSj.js +1 -0
  31. package/dist/gateway/static/root/assets/desktop-pet-KbVLtAlO.js +1 -0
  32. package/dist/gateway/static/root/assets/desktop-pet-settings-BDlg9g4s.js +1 -0
  33. package/dist/gateway/static/root/assets/device-pairing-wizard-PmP_vGem.js +1 -0
  34. package/dist/gateway/static/root/assets/{directory-picker-path-field-DwXqp_iu.js → directory-picker-path-field-a7xEodzo.js} +1 -1
  35. package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +1 -0
  36. package/dist/gateway/static/root/assets/extension-debug-page-CHelH5u_.js +1 -0
  37. package/dist/gateway/static/root/assets/{extension-page-Bri62YsN.js → extension-page-CrVHmS9-.js} +1 -1
  38. package/dist/gateway/static/root/assets/extension-settings-page-CiMybi0r.js +1 -0
  39. package/dist/gateway/static/root/assets/eye-CABVeTq0.js +1 -0
  40. package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +1 -0
  41. package/dist/gateway/static/root/assets/{gateway-config-swr-BVqYVaGy.js → gateway-config-swr-DF_HV6NP.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-realtime-CY1LBGBS.js → gateway-realtime-DMAzNlm-.js} +1 -1
  43. package/dist/gateway/static/root/assets/gateway-realtime-store-CoIgC1Al.js +1 -0
  44. package/dist/gateway/static/root/assets/gateway-settings-DnrQ28E2.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-CPKGkr6D.js → gateway-startup-retry-B91CBTzO.js} +1 -1
  46. package/dist/gateway/static/root/assets/highlight-code-AMjU04kR.js +1 -0
  47. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-Ci1QpkBn.js → highlighted-body-KQOG7T2V-8ACAVktj.js} +1 -1
  48. package/dist/gateway/static/root/assets/home-page-pTwVME-g.js +2 -0
  49. package/dist/gateway/static/root/assets/{image-generation-api-N5MYXlxr.js → image-generation-api-CVBaWmrV.js} +1 -1
  50. package/dist/gateway/static/root/assets/imports-page-C5IP3e6d.js +1 -0
  51. package/dist/gateway/static/root/assets/index-BLL0wKRZ.css +1 -0
  52. package/dist/gateway/static/root/assets/index-ygkHNYyo.js +710 -0
  53. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BhU6VYvd.js +1 -0
  54. package/dist/gateway/static/root/assets/local-app-workbench-page-Cwl6EvuX.js +1 -0
  55. package/dist/gateway/static/root/assets/{local-apps-page-BjzaB1ls.js → local-apps-page-DcP1Bdlk.js} +1 -1
  56. package/dist/gateway/static/root/assets/{local-session-drafts-BCaC-1rH.js → local-session-drafts-DvmwiLUx.js} +1 -1
  57. package/dist/gateway/static/root/assets/{locale-store-DAgpZxAS.js → locale-store-JogcXC4J.js} +1 -1
  58. package/dist/gateway/static/root/assets/logs-page-CS3hcTOq.js +2 -0
  59. package/dist/gateway/static/root/assets/management-settings-DC-Y_-GP.js +1 -0
  60. package/dist/gateway/static/root/assets/{media-plugins-8mlDAjD6.js → media-plugins-BnPpcJ2J.js} +1 -1
  61. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-vckgHpON.js +1 -0
  62. package/dist/gateway/static/root/assets/{messages-DMXSIJUO.js → messages-RzwPiQNL.js} +2 -2
  63. package/dist/gateway/static/root/assets/note-detail-panel-C7u4dxEk.js +5 -0
  64. package/dist/gateway/static/root/assets/note-image-lightbox-jvqYtySx.js +1 -0
  65. package/dist/gateway/static/root/assets/notes-page-Bs7F5Hpf.js +8 -0
  66. package/dist/gateway/static/root/assets/page-context-capture-button-DO_yhXS1.js +1 -0
  67. package/dist/gateway/static/root/assets/personal-page-BexL2-PQ.js +1 -0
  68. package/dist/gateway/static/root/assets/personal-settings-panel-BKA4fbYH.js +1 -0
  69. package/dist/gateway/static/root/assets/phone-dependencies-card-ChFtdFhA.js +1 -0
  70. package/dist/gateway/static/root/assets/phone-model-picker-CZoIAQ1j.js +1 -0
  71. package/dist/gateway/static/root/assets/phone-settings-page-DRyK0nHH.js +1 -0
  72. package/dist/gateway/static/root/assets/plugin-details-dialog-B-N61jJH.js +1 -0
  73. package/dist/gateway/static/root/assets/{preview-open-alternatives-n6Shdp3u.js → preview-open-alternatives-FGqN-mQx.js} +1 -1
  74. package/dist/gateway/static/root/assets/{product-open-page-BPF5rRTI.js → product-open-page-CwnHLfdL.js} +1 -1
  75. package/dist/gateway/static/root/assets/{product-preview-content-BOsGPNbw.js → product-preview-content-BD6k5hF9.js} +1 -1
  76. package/dist/gateway/static/root/assets/project-detail-page-DtKmFBml.js +7 -0
  77. package/dist/gateway/static/root/assets/projects-page-CFZIz9mc.js +1 -0
  78. package/dist/gateway/static/root/assets/{registry-api-B6kqbuw8.js → registry-api-BGqSwITi.js} +1 -1
  79. package/dist/gateway/static/root/assets/remote-access-hub-CWEc7W0m.js +1 -0
  80. package/dist/gateway/static/root/assets/runtime-tools-api-CSm5SpnR.js +5 -0
  81. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-q_oswAdV.js +1 -0
  82. package/dist/gateway/static/root/assets/{schema-form-cXD1BC02.js → schema-form-DoVn5jJK.js} +1 -1
  83. package/dist/gateway/static/root/assets/{session-api-D6-Vz8xK.js → session-api-DTxZyMta.js} +1 -1
  84. package/dist/gateway/static/root/assets/{session-manager-DWbcMHcj.js → session-manager-B2HDomj4.js} +1 -1
  85. package/dist/gateway/static/root/assets/sessions-page-BuPqNxpd.js +1 -0
  86. package/dist/gateway/static/root/assets/settings-advanced-gate-QTVDCGJG.js +1 -0
  87. package/dist/gateway/static/root/assets/{settings-form-section-BXeszXR7.js → settings-form-section-Ce8vVv-9.js} +1 -1
  88. package/dist/gateway/static/root/assets/{settings-page-CNmh4YmR.js → settings-page-DP2w3ejC.js} +1 -1
  89. package/dist/gateway/static/root/assets/{settings-page-layout-Dx5S-Msc.js → settings-page-header-CYpuTXUW.js} +1 -1
  90. package/dist/gateway/static/root/assets/settings-page-layout-B20AfmFG.js +1 -0
  91. package/dist/gateway/static/root/assets/setup-status-panel-ZmlE8jIE.js +1 -0
  92. package/dist/gateway/static/root/assets/{share-preview-page-CS9cOCgX.js → share-preview-page-DV4dKrmG.js} +1 -1
  93. package/dist/gateway/static/root/assets/shares-settings-CtNxWqW-.js +1 -0
  94. package/dist/gateway/static/root/assets/{skill-api-B5lDCuOH.js → skill-api-DTdejInH.js} +1 -1
  95. package/dist/gateway/static/root/assets/skill-reload-api-Egaf8PqZ.js +1 -0
  96. package/dist/gateway/static/root/assets/skills-page-C6FKxf4J.js +2 -0
  97. package/dist/gateway/static/root/assets/system-settings-panel-Baxkhov7.js +1 -0
  98. package/dist/gateway/static/root/assets/task-detail-page-C77-rpkt.js +2 -0
  99. package/dist/gateway/static/root/assets/{task-result-evidence-HJO1BlJm.js → task-result-evidence-DIGSC4qF.js} +1 -1
  100. package/dist/gateway/static/root/assets/tracing-settings-page-BaU8frtc.js +1 -0
  101. package/dist/gateway/static/root/assets/{tunnel-api-DXU94F2Y.js → tunnel-api-BCcOUsqu.js} +1 -1
  102. package/dist/gateway/static/root/assets/usage-page-BFeIbpbi.js +1 -0
  103. package/dist/gateway/static/root/assets/{use-autosave-B1z_TIBu.js → use-autosave-C1X47WVb.js} +1 -1
  104. package/dist/gateway/static/root/assets/user-model-page-u8zY5jea.js +2 -0
  105. package/dist/gateway/static/root/assets/{voice-api-key-field-HOLjEhh3.js → voice-api-key-field-Bk4DQMTw.js} +1 -1
  106. package/dist/gateway/static/root/assets/{voice-config-api-CPKzUb4R.js → voice-config-api-D7xsWrdh.js} +1 -1
  107. package/dist/gateway/static/root/assets/{work-discovery-overlay-C9RklDaR.js → work-discovery-overlay-B7_NmTB5.js} +1 -1
  108. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CWwGTBib.js → xopc-cloud-account-card-CJ_akAvc.js} +1 -1
  109. package/dist/gateway/static/root/index.html +19 -14
  110. package/dist/package.js +1 -1
  111. package/dist/packages/gateway-contract/src/capabilities.js +1 -0
  112. package/dist/src/agent/background-review/prompts.js +4 -3
  113. package/dist/src/agent/embedded/run-turn.js +1 -1
  114. package/dist/src/agent/embedded/xopc-stream-bridge.js +7 -3
  115. package/dist/src/agent/prompt/system-prompt.js +1 -1
  116. package/dist/src/agent/tool-manuals/index.js +7 -0
  117. package/dist/src/agent/tool-manuals/phone.d.ts +1 -0
  118. package/dist/src/agent/tool-manuals/phone.js +16 -0
  119. package/dist/src/agent/tools/factory.js +15 -0
  120. package/dist/src/agent/tools/knowledge-memory-tool.js +1 -1
  121. package/dist/src/agent/tools/personal-task-tool.d.ts +2 -1
  122. package/dist/src/agent/tools/personal-task-tool.js +43 -20
  123. package/dist/src/agent/tools/phone-use-tool.d.ts +8 -0
  124. package/dist/src/agent/tools/phone-use-tool.js +49 -0
  125. package/dist/src/agent/tools/session-recall-tool.js +2 -1
  126. package/dist/src/agent/tools/session-search-tool.js +11 -5
  127. package/dist/src/agent/tools/user-context-tool.js +1 -1
  128. package/dist/src/agent-config/index.js +2 -2
  129. package/dist/src/agent-config/resolver.js +5 -0
  130. package/dist/src/agent-config/schema.d.ts +24 -0
  131. package/dist/src/agent-config/schema.js +5 -2
  132. package/dist/src/cli/command-manifest.js +1 -1
  133. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  134. package/dist/src/cli/commands/extension.js +2 -2
  135. package/dist/src/cli/commands/runtime.js +32 -4
  136. package/dist/src/computer/diagnostics.d.ts +1 -1
  137. package/dist/src/config/models-json.d.ts +36 -0
  138. package/dist/src/config/models-json.js +9 -0
  139. package/dist/src/config/schema.d.ts +12 -0
  140. package/dist/src/config/schema.js +6 -2
  141. package/dist/src/extensions/update.js +1 -1
  142. package/dist/src/gateway/agent-builtin-tools.d.ts +7 -1
  143. package/dist/src/gateway/agent-builtin-tools.js +7 -0
  144. package/dist/src/gateway/global-defaults-admin.js +2 -0
  145. package/dist/src/gateway/hono/lib/config-payload.d.ts +8 -0
  146. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  147. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  148. package/dist/src/gateway/hono/routes/models.js +3 -0
  149. package/dist/src/gateway/hono/routes/phone-dependencies.d.ts +3 -0
  150. package/dist/src/gateway/hono/routes/phone-dependencies.js +137 -0
  151. package/dist/src/gateway/hono/routes/phone.d.ts +4 -0
  152. package/dist/src/gateway/hono/routes/phone.js +466 -0
  153. package/dist/src/gateway/hono/routes/runtime-tools.js +2 -0
  154. package/dist/src/gateway/server.js +1 -0
  155. package/dist/src/gateway/service/config-coordinator.d.ts +8 -0
  156. package/dist/src/gateway/service/config-coordinator.js +1 -1
  157. package/dist/src/gateway/service.d.ts +2 -0
  158. package/dist/src/gateway/service.js +12 -7
  159. package/dist/src/infra/update-runner.js +1 -1
  160. package/dist/src/knowledge-memory/repository.js +5 -0
  161. package/dist/src/memory-learning/forget-capture.js +12 -3
  162. package/dist/src/memory-learning/forgotten-history.d.ts +4 -0
  163. package/dist/src/memory-learning/forgotten-history.js +71 -4
  164. package/dist/src/memory-learning/work-capture.d.ts +1 -0
  165. package/dist/src/memory-learning/work-capture.js +28 -17
  166. package/dist/src/personal-agent/prompts.js +3 -2
  167. package/dist/src/phone/adb-driver.d.ts +38 -0
  168. package/dist/src/phone/adb-driver.js +392 -0
  169. package/dist/src/phone/app-access.d.ts +10 -0
  170. package/dist/src/phone/app-access.js +21 -0
  171. package/dist/src/phone/applications.d.ts +4 -0
  172. package/dist/src/phone/applications.js +49 -0
  173. package/dist/src/phone/cloud-adb.d.ts +35 -0
  174. package/dist/src/phone/cloud-adb.js +273 -0
  175. package/dist/src/phone/cloud-phones.d.ts +29 -0
  176. package/dist/src/phone/cloud-phones.js +142 -0
  177. package/dist/src/phone/cloud-scrcpy.d.ts +20 -0
  178. package/dist/src/phone/cloud-scrcpy.js +123 -0
  179. package/dist/src/phone/contracts.d.ts +212 -0
  180. package/dist/src/phone/contracts.js +116 -0
  181. package/dist/src/phone/interactive-session.d.ts +34 -0
  182. package/dist/src/phone/interactive-session.js +164 -0
  183. package/dist/src/phone/live-provider.d.ts +57 -0
  184. package/dist/src/phone/live-provider.js +18 -0
  185. package/dist/src/phone/live-state.d.ts +28 -0
  186. package/dist/src/phone/live-state.js +71 -0
  187. package/dist/src/phone/model-adapter.d.ts +31 -0
  188. package/dist/src/phone/model-adapter.js +350 -0
  189. package/dist/src/phone/repository.d.ts +19 -0
  190. package/dist/src/phone/repository.js +101 -0
  191. package/dist/src/phone/runtime.d.ts +88 -0
  192. package/dist/src/phone/runtime.js +924 -0
  193. package/dist/src/phone/scrcpy-assets.d.ts +4 -0
  194. package/dist/src/phone/scrcpy-assets.js +16 -0
  195. package/dist/src/phone/scrcpy.d.ts +59 -0
  196. package/dist/src/phone/scrcpy.js +337 -0
  197. package/dist/src/phone/stream-gateway.d.ts +26 -0
  198. package/dist/src/phone/stream-gateway.js +210 -0
  199. package/dist/src/process/phone-process.d.ts +4 -0
  200. package/dist/src/process/phone-process.js +38 -0
  201. package/dist/src/providers/extension-stream-bridge.js +8 -1
  202. package/dist/src/providers/model-call.js +6 -2
  203. package/dist/src/providers/model-catalog-persistence.js +3 -0
  204. package/dist/src/providers/model-catalog-types.d.ts +3 -0
  205. package/dist/src/providers/model-reference-auditor.js +5 -1
  206. package/dist/src/providers/model-registry.js +3 -0
  207. package/dist/src/runtime-tools/archive.d.ts +2 -2
  208. package/dist/src/runtime-tools/downloader.d.ts +2 -2
  209. package/dist/src/runtime-tools/errors.d.ts +3 -3
  210. package/dist/src/runtime-tools/phone-dependencies.d.ts +40 -0
  211. package/dist/src/runtime-tools/phone-dependencies.js +188 -0
  212. package/dist/src/runtime-tools/phone-dependency-catalog.d.ts +16 -0
  213. package/dist/src/runtime-tools/phone-dependency-catalog.js +51 -0
  214. package/dist/src/runtime-tools/types.d.ts +1 -0
  215. package/dist/src/storage/sqlite/context-extraction-repository.d.ts +1 -0
  216. package/dist/src/storage/sqlite/context-extraction-repository.js +12 -2
  217. package/dist/src/tasks/task-research-result.js +19 -2
  218. package/dist/src/usage/cloud-receipts.d.ts +5 -1
  219. package/dist/src/usage/cloud-receipts.js +10 -4
  220. package/dist/src/usage/cloud-wire.d.ts +37 -0
  221. package/dist/src/usage/cloud-wire.js +181 -0
  222. package/dist/src/usage/recorder.js +5 -4
  223. package/dist/src/user-model/capture/semantic.js +2 -2
  224. package/dist/src/voice/platform-catalog.d.ts +3 -0
  225. package/package.json +10 -5
  226. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BjZpom5V.js +0 -1
  227. package/dist/gateway/static/root/assets/agents-s3ws5Qi-.js +0 -77
  228. package/dist/gateway/static/root/assets/app-management-settings-panel-C6DHuX0L.js +0 -1
  229. package/dist/gateway/static/root/assets/appearance-settings-DYGY92Yr.js +0 -1
  230. package/dist/gateway/static/root/assets/apps-page-PpT_YMmD.js +0 -1
  231. package/dist/gateway/static/root/assets/automations-workspace-G6-9IYbR.js +0 -8
  232. package/dist/gateway/static/root/assets/browser-automations-page-o3jNFlCb.js +0 -3
  233. package/dist/gateway/static/root/assets/browser-settings-page-G0dVwiX4.js +0 -3
  234. package/dist/gateway/static/root/assets/capabilities-B9b5KCBb.js +0 -1
  235. package/dist/gateway/static/root/assets/capabilities-page-BZQanmZY.js +0 -2
  236. package/dist/gateway/static/root/assets/capabilities-settings-panel-D-YadSx_.js +0 -8
  237. package/dist/gateway/static/root/assets/channels-3WX3f0bR.js +0 -1
  238. package/dist/gateway/static/root/assets/computer-settings-page-CuZrL9gL.js +0 -1
  239. package/dist/gateway/static/root/assets/connectors-page-Bjj2wAeG.js +0 -1
  240. package/dist/gateway/static/root/assets/dependency-picker-R8kdHLr3.js +0 -1
  241. package/dist/gateway/static/root/assets/desktop-pet-BpiosRqb.js +0 -1
  242. package/dist/gateway/static/root/assets/desktop-pet-settings-9h6evrKB.js +0 -1
  243. package/dist/gateway/static/root/assets/device-pairing-wizard-CZ5lwiLE.js +0 -1
  244. package/dist/gateway/static/root/assets/extension-debug-page-Bj93A2Gn.js +0 -1
  245. package/dist/gateway/static/root/assets/extension-settings-page-BSo6vRhS.js +0 -1
  246. package/dist/gateway/static/root/assets/gateway-realtime-store-Dafw95ol.js +0 -1
  247. package/dist/gateway/static/root/assets/gateway-settings-DgEwWJwz.js +0 -1
  248. package/dist/gateway/static/root/assets/highlight-code-CSFBakwF.js +0 -1
  249. package/dist/gateway/static/root/assets/home-page-BKj-aPsL.js +0 -2
  250. package/dist/gateway/static/root/assets/imports-page-YfaRnpk1.js +0 -1
  251. package/dist/gateway/static/root/assets/index-CiDVRMmX.js +0 -710
  252. package/dist/gateway/static/root/assets/index-caRW34rg.css +0 -1
  253. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BTQcPOix.js +0 -1
  254. package/dist/gateway/static/root/assets/local-app-workbench-page-kCZ_fbSZ.js +0 -1
  255. package/dist/gateway/static/root/assets/logs-page-5Jt3uqYt.js +0 -2
  256. package/dist/gateway/static/root/assets/management-settings-DOQMLPrI.js +0 -1
  257. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-B4nztFE4.js +0 -1
  258. package/dist/gateway/static/root/assets/note-detail-panel-1wsKlkk3.js +0 -5
  259. package/dist/gateway/static/root/assets/note-image-lightbox-B82cToeV.js +0 -1
  260. package/dist/gateway/static/root/assets/notes-page-DKREWOku.js +0 -8
  261. package/dist/gateway/static/root/assets/page-context-capture-button-oSJIFF3E.js +0 -1
  262. package/dist/gateway/static/root/assets/personal-page-CoqQTkkS.js +0 -1
  263. package/dist/gateway/static/root/assets/personal-settings-panel-BgcJLmZN.js +0 -1
  264. package/dist/gateway/static/root/assets/plugin-details-dialog-CdOJ3Tir.js +0 -1
  265. package/dist/gateway/static/root/assets/project-detail-page-ZADyvA7-.js +0 -7
  266. package/dist/gateway/static/root/assets/projects-page-BkRe6Z8S.js +0 -1
  267. package/dist/gateway/static/root/assets/remote-access-hub-CCGf5kF4.js +0 -1
  268. package/dist/gateway/static/root/assets/runtime-tools-api-CY3R7unQ.js +0 -5
  269. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-BxaxVlwM.js +0 -1
  270. package/dist/gateway/static/root/assets/sessions-page-B81rRu2-.js +0 -1
  271. package/dist/gateway/static/root/assets/settings-advanced-gate-DLHGV-I-.js +0 -1
  272. package/dist/gateway/static/root/assets/setup-status-panel-gEqkJWyw.js +0 -1
  273. package/dist/gateway/static/root/assets/shares-settings-D9Ul96XW.js +0 -1
  274. package/dist/gateway/static/root/assets/skill-reload-api-NLAaNaDn.js +0 -1
  275. package/dist/gateway/static/root/assets/skills-page-dWeFt-6J.js +0 -2
  276. package/dist/gateway/static/root/assets/system-settings-panel-DdDsFdCh.js +0 -1
  277. package/dist/gateway/static/root/assets/task-detail-page-DO3FM--W.js +0 -2
  278. package/dist/gateway/static/root/assets/tracing-settings-page-Dm3yToJ1.js +0 -1
  279. package/dist/gateway/static/root/assets/usage-page-DJJhACRJ.js +0 -1
  280. package/dist/gateway/static/root/assets/user-model-page-DnZ4qFaO.js +0 -2
@@ -0,0 +1,10 @@
1
+ export type PhoneAppAccess = {
2
+ appAccess?: 'all' | 'selected';
3
+ allowedApps: string[];
4
+ };
5
+ /** Preserve legacy allowlists while new connections default to all applications. */
6
+ export declare function phoneAppAccess(device: PhoneAppAccess): 'all' | 'selected';
7
+ export declare function phoneAllowsApp(device: PhoneAppAccess, application: string): boolean;
8
+ export declare function normalizePhoneAppAccess<T extends PhoneAppAccess>(device: T): T & {
9
+ appAccess: 'all' | 'selected';
10
+ };
@@ -0,0 +1,21 @@
1
+ import { PhoneError, init_contracts } from "./contracts.js";
2
+ //#region src/phone/app-access.ts
3
+ init_contracts();
4
+ /** Preserve legacy allowlists while new connections default to all applications. */
5
+ function phoneAppAccess(device) {
6
+ return device.appAccess ?? (device.allowedApps.length ? "selected" : "all");
7
+ }
8
+ function phoneAllowsApp(device, application) {
9
+ return phoneAppAccess(device) === "all" || device.allowedApps.includes(application);
10
+ }
11
+ function normalizePhoneAppAccess(device) {
12
+ const appAccess = phoneAppAccess(device);
13
+ if (appAccess === "selected" && !device.allowedApps.length) throw new PhoneError("PHONE_APPS_REQUIRED", "Select at least one application");
14
+ return {
15
+ ...device,
16
+ appAccess,
17
+ allowedApps: appAccess === "all" ? [] : [...new Set(device.allowedApps)]
18
+ };
19
+ }
20
+ //#endregion
21
+ export { normalizePhoneAppAccess, phoneAllowsApp, phoneAppAccess };
@@ -0,0 +1,4 @@
1
+ import { type PhoneApplication } from './contracts.js';
2
+ export declare function phoneApplicationsCommand(remote: string): string[];
3
+ /** Parse the pinned scrcpy server's app list, including wrapped long labels. */
4
+ export declare function parsePhoneApplications(raw: string): PhoneApplication[];
@@ -0,0 +1,49 @@
1
+ import { PhoneError, init_contracts } from "./contracts.js";
2
+ import { SCRCPY_VERSION } from "../runtime-tools/phone-dependency-catalog.js";
3
+ //#region src/phone/applications.ts
4
+ init_contracts();
5
+ const packageName = /^[a-zA-Z]\w*(?:\.\w+)+$/;
6
+ function phoneApplicationsCommand(remote) {
7
+ return [
8
+ "env",
9
+ `CLASSPATH=${remote}`,
10
+ "app_process",
11
+ "/",
12
+ "com.genymobile.scrcpy.Server",
13
+ SCRCPY_VERSION,
14
+ "list_apps=true",
15
+ "video=false",
16
+ "audio=false",
17
+ "control=false"
18
+ ];
19
+ }
20
+ /** Parse the pinned scrcpy server's app list, including wrapped long labels. */
21
+ function parsePhoneApplications(raw) {
22
+ const text = raw.replace(/\u001b\[[\d;]*m/g, "");
23
+ if (text.length > 1024 * 1024 || !text.includes("List of apps:")) throw new PhoneError("PHONE_APPS_UNAVAILABLE", "Unable to read the phone application list. Check the phone connection and scrcpy dependency.");
24
+ const apps = /* @__PURE__ */ new Map();
25
+ let pending;
26
+ for (const line of text.split(/\r?\n/)) {
27
+ const entry = /^\s*[*-]\s+(.+)$/.exec(line);
28
+ if (entry) {
29
+ const match = /^(.*?)\s+([a-zA-Z]\w*(?:\.\w+)+)$/.exec(entry[1].trim());
30
+ if (match) {
31
+ pending = void 0;
32
+ apps.set(match[2], {
33
+ packageName: match[2],
34
+ label: match[1].trim().slice(0, 120) || match[2]
35
+ });
36
+ } else pending = entry[1].trim().slice(0, 120);
37
+ } else if (pending && packageName.test(line.trim())) {
38
+ apps.set(line.trim(), {
39
+ packageName: line.trim(),
40
+ label: pending
41
+ });
42
+ pending = void 0;
43
+ }
44
+ if (apps.size > 500) throw new PhoneError("PHONE_APPS_LIMIT", "Phone application list exceeds 500 entries");
45
+ }
46
+ return [...apps.values()].sort((a, b) => a.label.localeCompare(b.label));
47
+ }
48
+ //#endregion
49
+ export { parsePhoneApplications, phoneApplicationsCommand };
@@ -0,0 +1,35 @@
1
+ import { Adb } from '@yume-chan/adb';
2
+ import { AdbPhoneDriver } from './adb-driver.js';
3
+ /** Accept only an explicit TCP endpoint, never URLs, paths or ADB commands. */
4
+ export declare function parseCloudEndpoint(value: string): {
5
+ host: string;
6
+ port: number;
7
+ endpoint: string;
8
+ };
9
+ export declare function parseCloudPrivateKey(pem: string): Buffer;
10
+ export declare class PhoneCloudKeyStore {
11
+ private root;
12
+ constructor(root?: string);
13
+ private path;
14
+ save(key: Buffer): Promise<string>;
15
+ load(id: string): Promise<Buffer>;
16
+ remove(id: string): Promise<void>;
17
+ }
18
+ /** Direct daemon transport never starts or modifies the host ADB server. */
19
+ export declare class CloudAdbConnection {
20
+ readonly endpoint: string;
21
+ private key;
22
+ private socket?;
23
+ private adb?;
24
+ private pending?;
25
+ private idle?;
26
+ constructor(endpoint: string, key: Buffer);
27
+ close(): void;
28
+ dispose(): void;
29
+ /** A dedicated media connection can multiplex sync, video and control sockets. */
30
+ client(): Promise<Adb>;
31
+ private open;
32
+ command(_path: string, args: string[], signal?: AbortSignal, timeout?: number): Promise<Buffer>;
33
+ applications(signal: AbortSignal): Promise<import("./contracts.js").PhoneApplication[]>;
34
+ driver(): AdbPhoneDriver;
35
+ }
@@ -0,0 +1,273 @@
1
+ import { init_paths, resolveCredentialsDir } from "../config/paths.js";
2
+ import { PhoneError, init_contracts } from "./contracts.js";
3
+ import { readScrcpyServer } from "./scrcpy-assets.js";
4
+ import { parsePhoneApplications, phoneApplicationsCommand } from "./applications.js";
5
+ import { AdbPhoneDriver } from "./adb-driver.js";
6
+ import { join } from "node:path";
7
+ import { createPrivateKey, randomUUID } from "node:crypto";
8
+ import { chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
9
+ import { connect } from "node:net";
10
+ import { Adb, AdbDaemonTransport, AdbPacket, AdbPacketSerializeStream, AdbSignatureAuthenticator } from "@yume-chan/adb";
11
+ import { Consumable, ReadableStream, StructDeserializeStream } from "@yume-chan/stream-extra";
12
+ //#region src/phone/cloud-adb.ts
13
+ init_paths();
14
+ init_contracts();
15
+ /** Accept only an explicit TCP endpoint, never URLs, paths or ADB commands. */
16
+ function parseCloudEndpoint(value) {
17
+ const match = /^(\[[a-fA-F0-9:]+\]|[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?):([0-9]{1,5})$/.exec(value.trim());
18
+ if (!match || Number(match[2]) < 1 || Number(match[2]) > 65535) throw new PhoneError("PHONE_ENDPOINT_INVALID", "Enter the cloud ADB address as host:port");
19
+ return {
20
+ host: match[1].replace(/^\[|\]$/g, ""),
21
+ port: Number(match[2]),
22
+ endpoint: `${match[1].toLowerCase()}:${Number(match[2])}`
23
+ };
24
+ }
25
+ function parseCloudPrivateKey(pem) {
26
+ try {
27
+ if (Buffer.byteLength(pem) > 16384) throw new Error();
28
+ const key = createPrivateKey(pem);
29
+ if (key.asymmetricKeyType !== "rsa" || key.asymmetricKeyDetails?.modulusLength !== 2048 || key.asymmetricKeyDetails?.publicExponent !== 65537n) throw new Error();
30
+ return key.export({
31
+ format: "der",
32
+ type: "pkcs8"
33
+ });
34
+ } catch {
35
+ throw new PhoneError("PHONE_KEY_INVALID", "Upload the unencrypted RSA 2048 private adbkey downloaded from the cloud console");
36
+ }
37
+ }
38
+ var PhoneCloudKeyStore = class {
39
+ constructor(root = join(resolveCredentialsDir(), "phone-adb")) {
40
+ this.root = root;
41
+ }
42
+ path(id) {
43
+ if (!/^[0-9a-f-]{36}$/i.test(id)) throw new PhoneError("PHONE_KEY_INVALID", "Invalid phone credential reference");
44
+ return join(this.root, `${id}.der`);
45
+ }
46
+ async save(key) {
47
+ await mkdir(this.root, {
48
+ recursive: true,
49
+ mode: 448
50
+ });
51
+ await chmod(this.root, 448);
52
+ const id = randomUUID();
53
+ await writeFile(this.path(id), key, {
54
+ mode: 384,
55
+ flag: "wx"
56
+ });
57
+ return id;
58
+ }
59
+ async load(id) {
60
+ try {
61
+ return await readFile(this.path(id));
62
+ } catch {
63
+ throw new PhoneError("PHONE_KEY_MISSING", "Phone private key is unavailable. Remove this connection and add it again.");
64
+ }
65
+ }
66
+ async remove(id) {
67
+ await rm(this.path(id), { force: true });
68
+ }
69
+ };
70
+ /** Direct daemon transport never starts or modifies the host ADB server. */
71
+ var CloudAdbConnection = class CloudAdbConnection {
72
+ socket;
73
+ adb;
74
+ pending;
75
+ idle;
76
+ constructor(endpoint, key) {
77
+ this.endpoint = endpoint;
78
+ this.key = key;
79
+ parseCloudEndpoint(endpoint);
80
+ }
81
+ close() {
82
+ clearTimeout(this.idle);
83
+ this.socket?.destroy();
84
+ this.socket = void 0;
85
+ this.adb = void 0;
86
+ }
87
+ dispose() {
88
+ this.close();
89
+ this.key.fill(0);
90
+ }
91
+ /** A dedicated media connection can multiplex sync, video and control sockets. */
92
+ async client() {
93
+ if (this.adb) return this.adb;
94
+ if (this.pending) return this.pending;
95
+ const opening = this.open();
96
+ this.pending = opening;
97
+ try {
98
+ return await opening;
99
+ } finally {
100
+ if (this.pending === opening) this.pending = void 0;
101
+ }
102
+ }
103
+ async open() {
104
+ const { host, port } = parseCloudEndpoint(this.endpoint);
105
+ const socket = connect({
106
+ host,
107
+ port
108
+ });
109
+ this.socket = socket;
110
+ socket.setNoDelay(true);
111
+ socket.on("error", () => {});
112
+ try {
113
+ await new Promise((resolve, reject) => {
114
+ socket.once("connect", resolve);
115
+ socket.once("error", reject);
116
+ socket.once("close", () => reject(/* @__PURE__ */ new Error("closed")));
117
+ });
118
+ const iterator = socket[Symbol.asyncIterator]();
119
+ const raw = new ReadableStream({
120
+ async pull(controller) {
121
+ const next = await iterator.next();
122
+ if (next.done) controller.close();
123
+ else controller.enqueue(next.value);
124
+ },
125
+ cancel() {
126
+ socket.destroy();
127
+ }
128
+ });
129
+ const serializer = new AdbPacketSerializeStream();
130
+ serializer.readable.pipeTo(new Consumable.WritableStream({
131
+ write(chunk) {
132
+ return new Promise((resolve, reject) => socket.write(chunk, (error) => error ? reject(error) : resolve()));
133
+ },
134
+ close() {
135
+ socket.destroy();
136
+ },
137
+ abort() {
138
+ socket.destroy();
139
+ }
140
+ })).catch(() => {
141
+ socket.destroy();
142
+ });
143
+ const key = this.key;
144
+ const transport = await AdbDaemonTransport.authenticate({
145
+ serial: this.endpoint,
146
+ connection: {
147
+ readable: raw.pipeThrough(new StructDeserializeStream(AdbPacket)),
148
+ writable: serializer.writable
149
+ },
150
+ credentialStore: {
151
+ *iterateKeys() {
152
+ yield {
153
+ buffer: key,
154
+ name: "xopc-cloud-phone"
155
+ };
156
+ },
157
+ generateKey() {
158
+ throw new Error("Key generation disabled");
159
+ }
160
+ },
161
+ authenticators: [AdbSignatureAuthenticator]
162
+ });
163
+ if (socket.destroyed) {
164
+ await transport.close();
165
+ throw new Error("closed");
166
+ }
167
+ const adb = new Adb(transport);
168
+ this.adb = adb;
169
+ adb.disconnected.catch(() => {}).finally(() => {
170
+ if (this.adb === adb) this.close();
171
+ });
172
+ return adb;
173
+ } catch {
174
+ socket.destroy();
175
+ throw new PhoneError("PHONE_CLOUD_AUTH_FAILED", "Cloud ADB connection failed. Check address, network access and the bound private key.", 502);
176
+ }
177
+ }
178
+ async command(_path, args, signal, timeout = 15e3) {
179
+ const combined = AbortSignal.any([...signal ? [signal] : [], AbortSignal.timeout(timeout)]);
180
+ combined.throwIfAborted();
181
+ let abort;
182
+ const cancelled = new Promise((_resolve, reject) => {
183
+ abort = () => {
184
+ this.close();
185
+ reject(new PhoneError("PHONE_CLOUD_TIMEOUT", "Cloud phone connection stopped or timed out. Check its ADB address and network.", 502));
186
+ };
187
+ combined.addEventListener("abort", abort, { once: true });
188
+ });
189
+ try {
190
+ return await Promise.race([cancelled, (async () => {
191
+ const adb = await this.client();
192
+ if (args[0] === "devices") return Buffer.from(`List of devices attached\n${this.endpoint}\tdevice model:${adb.banner.model ?? "Cloud_Phone"}\n`);
193
+ if (args[0] !== "-s" || args[1] !== this.endpoint || !["shell", "exec-out"].includes(args[2])) throw new PhoneError("PHONE_CLOUD_COMMAND_INVALID", "Unsupported cloud ADB command");
194
+ const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
195
+ const channel = await adb.createSocket(`${args[2] === "exec-out" ? "exec" : "shell"}:${args.slice(3).map(quote).join(" ")}`);
196
+ const chunks = [];
197
+ let length = 0;
198
+ try {
199
+ for await (const chunk of channel.readable) {
200
+ length += chunk.length;
201
+ if (length > 16 * 1024 * 1024) throw new Error("Output exceeded");
202
+ chunks.push(Buffer.from(chunk));
203
+ }
204
+ return Buffer.concat(chunks);
205
+ } finally {
206
+ await channel.close();
207
+ }
208
+ })()]);
209
+ } catch (error) {
210
+ this.close();
211
+ if (error instanceof PhoneError) throw error;
212
+ throw new PhoneError("PHONE_CLOUD_ADB_FAILED", "Cloud phone operation failed. Reconnect or run diagnostics.", 502);
213
+ } finally {
214
+ combined.removeEventListener("abort", abort);
215
+ clearTimeout(this.idle);
216
+ this.idle = setTimeout(() => this.close(), 3e4);
217
+ this.idle.unref();
218
+ }
219
+ }
220
+ async applications(signal) {
221
+ const combined = AbortSignal.any([signal, AbortSignal.timeout(3e4)]);
222
+ const abort = () => this.close();
223
+ combined.addEventListener("abort", abort, { once: true });
224
+ const remote = `/data/local/tmp/xopc-apps-${randomUUID()}.jar`;
225
+ try {
226
+ combined.throwIfAborted();
227
+ const binary = await readScrcpyServer();
228
+ const adb = await this.client();
229
+ combined.throwIfAborted();
230
+ const sync = await adb.sync();
231
+ try {
232
+ await sync.write({
233
+ filename: remote,
234
+ permission: 384,
235
+ file: new ReadableStream({ start(controller) {
236
+ controller.enqueue(binary);
237
+ controller.close();
238
+ } })
239
+ });
240
+ } finally {
241
+ await sync.dispose();
242
+ }
243
+ return parsePhoneApplications((await this.command("", [
244
+ "-s",
245
+ this.endpoint,
246
+ "shell",
247
+ ...phoneApplicationsCommand(remote)
248
+ ], combined)).toString());
249
+ } finally {
250
+ combined.removeEventListener("abort", abort);
251
+ await this.command("", [
252
+ "-s",
253
+ this.endpoint,
254
+ "shell",
255
+ "rm",
256
+ "-f",
257
+ remote
258
+ ], void 0, 3e3).catch(() => {});
259
+ }
260
+ }
261
+ driver() {
262
+ return new AdbPhoneDriver("", this.command.bind(this), false, async (signal) => {
263
+ const listing = new CloudAdbConnection(this.endpoint, Buffer.from(this.key));
264
+ try {
265
+ return await listing.applications(signal);
266
+ } finally {
267
+ listing.dispose();
268
+ }
269
+ });
270
+ }
271
+ };
272
+ //#endregion
273
+ export { CloudAdbConnection, PhoneCloudKeyStore, parseCloudEndpoint, parseCloudPrivateKey };
@@ -0,0 +1,29 @@
1
+ import { CloudAdbConnection, PhoneCloudKeyStore } from './cloud-adb.js';
2
+ import { CloudScrcpyProvider } from './cloud-scrcpy.js';
3
+ import { type PhoneDevice } from './contracts.js';
4
+ import type { PhoneRepository } from './repository.js';
5
+ export declare class CloudPhones {
6
+ private repository;
7
+ private keys;
8
+ private connect;
9
+ private drafts;
10
+ private connections;
11
+ constructor(repository: PhoneRepository, keys?: PhoneCloudKeyStore, connect?: (endpoint: string, key: Buffer) => CloudAdbConnection);
12
+ private discard;
13
+ test(owner: string, address: string, pem: string, signal: AbortSignal): Promise<{
14
+ token: `${string}-${string}-${string}-${string}-${string}`;
15
+ expiresAt: number;
16
+ model: string;
17
+ androidVersion: string;
18
+ screenshot: string;
19
+ endpoint: string;
20
+ media: "snapshot";
21
+ }>;
22
+ add(owner: string, token: string, name: string, makeDefault: boolean): Promise<PhoneDevice>;
23
+ cancel(owner: string, token: string): void;
24
+ driver(device: PhoneDevice): Promise<import("./adb-driver.js").AdbPhoneDriver>;
25
+ interactive(device: PhoneDevice, failed: () => void): Promise<CloudScrcpyProvider>;
26
+ disconnect(id: string): void;
27
+ remove(device: PhoneDevice): Promise<void>;
28
+ close(): void;
29
+ }
@@ -0,0 +1,142 @@
1
+ import { PhoneError, init_contracts } from "./contracts.js";
2
+ import { CloudAdbConnection, PhoneCloudKeyStore, parseCloudEndpoint, parseCloudPrivateKey } from "./cloud-adb.js";
3
+ import { CloudScrcpyProvider } from "./cloud-scrcpy.js";
4
+ import { randomUUID } from "node:crypto";
5
+ import sharp from "sharp";
6
+ //#region src/phone/cloud-phones.ts
7
+ init_contracts();
8
+ var CloudPhones = class {
9
+ drafts = /* @__PURE__ */ new Map();
10
+ connections = /* @__PURE__ */ new Map();
11
+ constructor(repository, keys = new PhoneCloudKeyStore(), connect = (endpoint, key) => new CloudAdbConnection(endpoint, key)) {
12
+ this.repository = repository;
13
+ this.keys = keys;
14
+ this.connect = connect;
15
+ }
16
+ discard(token) {
17
+ const draft = this.drafts.get(token);
18
+ if (draft) {
19
+ clearTimeout(draft.timer);
20
+ draft.key.fill(0);
21
+ this.drafts.delete(token);
22
+ }
23
+ }
24
+ async test(owner, address, pem, signal) {
25
+ if (this.drafts.size >= 10) throw new PhoneError("PHONE_SETUP_BUSY", "Too many pending phone connections. Try again later.", 409);
26
+ const { endpoint } = parseCloudEndpoint(address);
27
+ const key = parseCloudPrivateKey(pem);
28
+ let lease;
29
+ try {
30
+ lease = this.repository.acquire(endpoint);
31
+ } catch (error) {
32
+ key.fill(0);
33
+ throw error;
34
+ }
35
+ const connection = this.connect(endpoint, Buffer.from(key));
36
+ try {
37
+ const command = (...args) => connection.command("", [
38
+ "-s",
39
+ endpoint,
40
+ ...args
41
+ ], signal, 2e4);
42
+ const model = (await command("shell", "getprop", "ro.product.model")).toString().trim().slice(0, 100);
43
+ const androidVersion = (await command("shell", "getprop", "ro.build.version.release")).toString().trim().slice(0, 50);
44
+ const pixels = await command("exec-out", "screencap", "-p");
45
+ let screenshot;
46
+ try {
47
+ screenshot = `data:image/jpeg;base64,${(await sharp(pixels, { limitInputPixels: 16e6 }).resize({
48
+ width: 360,
49
+ withoutEnlargement: true
50
+ }).jpeg({ quality: 70 }).toBuffer()).toString("base64")}`;
51
+ } finally {
52
+ pixels.fill(0);
53
+ }
54
+ signal.throwIfAborted();
55
+ const token = randomUUID();
56
+ const expiresAt = Date.now() + 6e5;
57
+ const timer = setTimeout(() => this.discard(token), 6e5);
58
+ timer.unref();
59
+ this.drafts.set(token, {
60
+ owner,
61
+ endpoint,
62
+ key: Buffer.from(key),
63
+ expiresAt,
64
+ timer
65
+ });
66
+ return {
67
+ token,
68
+ expiresAt,
69
+ model,
70
+ androidVersion,
71
+ screenshot,
72
+ endpoint,
73
+ media: "snapshot"
74
+ };
75
+ } finally {
76
+ key.fill(0);
77
+ connection.dispose();
78
+ this.repository.release(endpoint, lease);
79
+ }
80
+ }
81
+ async add(owner, token, name, makeDefault) {
82
+ const draft = this.drafts.get(token);
83
+ if (!draft || draft.owner !== owner || draft.expiresAt < Date.now()) throw new PhoneError("PHONE_SETUP_EXPIRED", "Connection test expired. Test the connection again.", 409);
84
+ this.drafts.delete(token);
85
+ clearTimeout(draft.timer);
86
+ let credentialId;
87
+ try {
88
+ credentialId = await this.keys.save(draft.key);
89
+ const device = this.repository.save({
90
+ serial: draft.endpoint,
91
+ name,
92
+ enabled: true,
93
+ appAccess: "all",
94
+ allowedApps: [],
95
+ connection: {
96
+ kind: "aliyun-adb",
97
+ endpoint: draft.endpoint,
98
+ credentialId
99
+ }
100
+ });
101
+ if (makeDefault || !this.repository.defaultDevice()) this.repository.setDefault(device.id);
102
+ return device;
103
+ } catch (error) {
104
+ if (credentialId) await this.keys.remove(credentialId);
105
+ throw error;
106
+ } finally {
107
+ draft.key.fill(0);
108
+ }
109
+ }
110
+ cancel(owner, token) {
111
+ if (this.drafts.get(token)?.owner === owner) this.discard(token);
112
+ }
113
+ async driver(device) {
114
+ const binding = device.connection;
115
+ if (!binding) throw new PhoneError("PHONE_CONNECTION_INVALID", "Missing cloud connection");
116
+ let connection = this.connections.get(device.id);
117
+ if (!connection) {
118
+ connection = this.connect(binding.endpoint, await this.keys.load(binding.credentialId));
119
+ this.connections.set(device.id, connection);
120
+ }
121
+ return connection.driver();
122
+ }
123
+ async interactive(device, failed) {
124
+ const binding = device.connection;
125
+ if (!binding) throw new PhoneError("PHONE_CONNECTION_INVALID", "Missing cloud connection");
126
+ return new CloudScrcpyProvider(binding.endpoint, await this.keys.load(binding.credentialId), failed, this.connect);
127
+ }
128
+ disconnect(id) {
129
+ this.connections.get(id)?.dispose();
130
+ this.connections.delete(id);
131
+ }
132
+ async remove(device) {
133
+ this.disconnect(device.id);
134
+ if (device.connection) await this.keys.remove(device.connection.credentialId);
135
+ }
136
+ close() {
137
+ for (const token of this.drafts.keys()) this.discard(token);
138
+ for (const id of this.connections.keys()) this.disconnect(id);
139
+ }
140
+ };
141
+ //#endregion
142
+ export { CloudPhones };
@@ -0,0 +1,20 @@
1
+ import { CloudAdbConnection } from './cloud-adb.js';
2
+ import { ScrcpyProvider } from './scrcpy.js';
3
+ /** Dedicated authenticated ADB transport: no host ADB key, server or port forwarding. */
4
+ export declare class CloudScrcpyProvider extends ScrcpyProvider {
5
+ private endpoint;
6
+ private connection;
7
+ private process?;
8
+ private video?;
9
+ private control?;
10
+ private writer?;
11
+ private remote;
12
+ private scid;
13
+ constructor(endpoint: string, key: Buffer, onFailure: () => void, connect?: (address: string, credential: Buffer) => CloudAdbConnection);
14
+ foreground(signal: AbortSignal): Promise<string>;
15
+ protected startTransport(): Promise<void>;
16
+ private drain;
17
+ private readVideo;
18
+ protected write(buffer: Buffer): Promise<void>;
19
+ protected cleanup(): Promise<void>;
20
+ }