@xopcai/xopc 0.0.414 → 0.0.416

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 (359) hide show
  1. package/dist/browser-ext/_locales/en/messages.json +4 -1
  2. package/dist/browser-ext/_locales/zh_CN/messages.json +4 -1
  3. package/dist/browser-ext/dist/assets/{page-context-MuzjMBlJ.js → page-context-CVvmTWZb.js} +33 -9
  4. package/dist/browser-ext/dist/background.js +39 -10
  5. package/dist/browser-ext/dist/sidepanel.html +1 -1
  6. package/dist/browser-ext/dist/sidepanel.js +22 -3
  7. package/dist/browser-ext/manifest.json +1 -1
  8. package/dist/extensions/telegram/xopc.extension.json +1 -1
  9. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-ClobpdW3.js → agent-avatar-dicebear-CufU7cqe.js} +1 -1
  10. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DHDAcss8.js +1 -0
  11. package/dist/gateway/static/root/assets/agents-BV3dAoa0.js +77 -0
  12. package/dist/gateway/static/root/assets/{agents-admin-api-CeBkHnl8.js → agents-admin-api-B1p-ghg9.js} +1 -1
  13. package/dist/gateway/static/root/assets/{app-management-settings-panel-CLunLNGp.js → app-management-settings-panel-D4-n1uBg.js} +1 -1
  14. package/dist/gateway/static/root/assets/{appearance-settings-DBEgoE9g.js → appearance-settings-Cgn4eNsX.js} +1 -1
  15. package/dist/gateway/static/root/assets/apps-page-BOYzD7Zz.js +1 -0
  16. package/dist/gateway/static/root/assets/{archive-plugin-JElK4Goq.js → archive-plugin-B4btCsiV.js} +1 -1
  17. package/dist/gateway/static/root/assets/{automations-page-CZ0UqwyU.js → automations-page-yb1EL_3N.js} +1 -1
  18. package/dist/gateway/static/root/assets/automations-workspace-J7LJ4RuV.js +8 -0
  19. package/dist/gateway/static/root/assets/{binary-plugins-CXFawow6.js → binary-plugins-DQT9e258.js} +1 -1
  20. package/dist/gateway/static/root/assets/{block-editor-BoduwSYI.js → block-editor-B50rU9tL.js} +30 -30
  21. package/dist/gateway/static/root/assets/{browser-automation-inputs-D1pDgMJu.js → browser-automation-inputs-D6AccXaA.js} +1 -1
  22. package/dist/gateway/static/root/assets/browser-automations-page-BiQz6lJA.js +3 -0
  23. package/dist/gateway/static/root/assets/browser-settings-page-W9kuxBbE.js +3 -0
  24. package/dist/gateway/static/root/assets/{capabilities-Bpeh6E22.js → capabilities-BlxF36t-.js} +1 -1
  25. package/dist/gateway/static/root/assets/capabilities-page-iXe87MdG.js +2 -0
  26. package/dist/gateway/static/root/assets/capabilities-settings-panel-CRLSXe7Z.js +8 -0
  27. package/dist/gateway/static/root/assets/{capability-header-actions-BasrAWA0.js → capability-header-actions-BMnbzHms.js} +1 -1
  28. package/dist/gateway/static/root/assets/channels-CrRJkOKX.js +1 -0
  29. package/dist/gateway/static/root/assets/{chat-terminal-dock-CwQbzcZ_.js → chat-terminal-dock-Bd3af4gL.js} +2 -2
  30. package/dist/gateway/static/root/assets/{computer-settings-page-DNWeJKfF.js → computer-settings-page-DXfqy7xh.js} +1 -1
  31. package/dist/gateway/static/root/assets/{connector-service-page-CxHgC5RM.js → connector-service-page-B-cw0CPU.js} +1 -1
  32. package/dist/gateway/static/root/assets/connectors-page-DbFxc0Fd.js +1 -0
  33. package/dist/gateway/static/root/assets/{date-picker-CXxLbLJb.js → date-picker-CqzXevH6.js} +1 -1
  34. package/dist/gateway/static/root/assets/{dependency-picker-DVuWMrSj.js → dependency-picker-pgT4Gyaf.js} +1 -1
  35. package/dist/gateway/static/root/assets/{desktop-pet-settings-BDlg9g4s.js → desktop-pet-settings-Dy_-i2L8.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-KbVLtAlO.js → desktop-pet-zICeqw9c.js} +1 -1
  37. package/dist/gateway/static/root/assets/device-pairing-wizard-ByGbxqkg.js +1 -0
  38. package/dist/gateway/static/root/assets/{directory-picker-path-field-a7xEodzo.js → directory-picker-path-field-C-aQ7qoM.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-debug-page-CHelH5u_.js → extension-debug-page-2NwpYkS5.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-page-CrVHmS9-.js → extension-page-y9J0z7_Q.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-settings-page-CiMybi0r.js → extension-settings-page-BtowusUh.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-config-swr-DF_HV6NP.js → gateway-config-swr-fQKBHBi1.js} +1 -1
  43. package/dist/gateway/static/root/assets/gateway-realtime-C52ghnBK.js +1 -0
  44. package/dist/gateway/static/root/assets/gateway-realtime-store-Bx9KCID-.js +1 -0
  45. package/dist/gateway/static/root/assets/gateway-settings-BYSKzUMR.js +1 -0
  46. package/dist/gateway/static/root/assets/{gateway-startup-retry-B91CBTzO.js → gateway-startup-retry-Cfwxof4k.js} +1 -1
  47. package/dist/gateway/static/root/assets/highlight-code-Cz6eeDH5.js +1 -0
  48. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-8ACAVktj.js → highlighted-body-KQOG7T2V-BiAa8HKC.js} +1 -1
  49. package/dist/gateway/static/root/assets/home-page-Cd1BjYHj.js +2 -0
  50. package/dist/gateway/static/root/assets/{image-generation-api-CVBaWmrV.js → image-generation-api-gBFro48x.js} +1 -1
  51. package/dist/gateway/static/root/assets/{imports-page-C5IP3e6d.js → imports-page-BZQpXgjj.js} +1 -1
  52. package/dist/gateway/static/root/assets/index-Cy16gQST.css +1 -0
  53. package/dist/gateway/static/root/assets/index-DRyGCING.js +710 -0
  54. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BhU6VYvd.js → keyboard-shortcuts-settings-CYunR34k.js} +1 -1
  55. package/dist/gateway/static/root/assets/local-app-workbench-page-B_Ac1lly.js +1 -0
  56. package/dist/gateway/static/root/assets/{local-apps-page-DcP1Bdlk.js → local-apps-page-w-J5bY02.js} +1 -1
  57. package/dist/gateway/static/root/assets/{local-session-drafts-DvmwiLUx.js → local-session-drafts-iGX_6O0O.js} +1 -1
  58. package/dist/gateway/static/root/assets/{locale-store-JogcXC4J.js → locale-store-B7s2Hb35.js} +1 -1
  59. package/dist/gateway/static/root/assets/logs-page-Dnjvvx2i.js +2 -0
  60. package/dist/gateway/static/root/assets/management-settings-w1EDwgLW.js +1 -0
  61. package/dist/gateway/static/root/assets/{media-plugins-BnPpcJ2J.js → media-plugins-CIx1koXw.js} +1 -1
  62. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-DISkHmEC.js +1 -0
  63. package/dist/gateway/static/root/assets/{messages-RzwPiQNL.js → messages-BYq0cPbn.js} +2 -2
  64. package/dist/gateway/static/root/assets/note-detail-panel-CNkxMTFU.js +5 -0
  65. package/dist/gateway/static/root/assets/note-image-lightbox-D5GH2wuC.js +1 -0
  66. package/dist/gateway/static/root/assets/notes-page-DZgKqFBG.js +8 -0
  67. package/dist/gateway/static/root/assets/page-context-capture-button-DusR2Itk.js +1 -0
  68. package/dist/gateway/static/root/assets/personal-page-CR5JFkQ9.js +1 -0
  69. package/dist/gateway/static/root/assets/personal-settings-panel-B7undvlr.js +1 -0
  70. package/dist/gateway/static/root/assets/phone-model-picker-fWDltRUJ.js +1 -0
  71. package/dist/gateway/static/root/assets/phone-settings-page-CsOirAiy.js +1 -0
  72. package/dist/gateway/static/root/assets/plugin-details-dialog-BOBVIB3j.js +1 -0
  73. package/dist/gateway/static/root/assets/{preview-open-alternatives-FGqN-mQx.js → preview-open-alternatives-CMxjsKSw.js} +1 -1
  74. package/dist/gateway/static/root/assets/{product-open-page-CwnHLfdL.js → product-open-page-CrlyJx5M.js} +1 -1
  75. package/dist/gateway/static/root/assets/{product-preview-content-BD6k5hF9.js → product-preview-content-B-Jhzi7W.js} +1 -1
  76. package/dist/gateway/static/root/assets/project-detail-page-DoYUbtcI.js +7 -0
  77. package/dist/gateway/static/root/assets/projects-page-xGQd9oAZ.js +1 -0
  78. package/dist/gateway/static/root/assets/refresh-cw-BRlGaq2w.js +1 -0
  79. package/dist/gateway/static/root/assets/{registry-api-BGqSwITi.js → registry-api-BcfoLEna.js} +1 -1
  80. package/dist/gateway/static/root/assets/remote-access-hub-Gs0Xkws9.js +1 -0
  81. package/dist/gateway/static/root/assets/{runtime-tools-api-CSm5SpnR.js → runtime-tools-api-DesqGCnE.js} +1 -1
  82. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bwg7U7TR.js +1 -0
  83. package/dist/gateway/static/root/assets/{schema-form-DoVn5jJK.js → schema-form-ByzTNR_C.js} +1 -1
  84. package/dist/gateway/static/root/assets/{session-api-DTxZyMta.js → session-api-DdQnMwkl.js} +1 -1
  85. package/dist/gateway/static/root/assets/{session-manager-B2HDomj4.js → session-manager-B_h0jlLb.js} +1 -1
  86. package/dist/gateway/static/root/assets/sessions-page-XzK1ftbR.js +1 -0
  87. package/dist/gateway/static/root/assets/settings-advanced-gate-D_8Mvnog.js +1 -0
  88. package/dist/gateway/static/root/assets/{settings-form-section-Ce8vVv-9.js → settings-form-section-Brgd8IOV.js} +1 -1
  89. package/dist/gateway/static/root/assets/{settings-page-DP2w3ejC.js → settings-page-B6Mv02eg.js} +1 -1
  90. package/dist/gateway/static/root/assets/settings-page-header-BWyxJKOG.js +1 -0
  91. package/dist/gateway/static/root/assets/{settings-page-layout-B20AfmFG.js → settings-page-layout-DLHcS-0T.js} +1 -1
  92. package/dist/gateway/static/root/assets/setup-status-panel-DSCj5yis.js +1 -0
  93. package/dist/gateway/static/root/assets/{share-preview-page-DV4dKrmG.js → share-preview-page-DF8Of0aZ.js} +1 -1
  94. package/dist/gateway/static/root/assets/shares-settings-DXNPe4Tl.js +1 -0
  95. package/dist/gateway/static/root/assets/{skill-api-DTdejInH.js → skill-api-CKCDCHLq.js} +1 -1
  96. package/dist/gateway/static/root/assets/skill-reload-api-BH0WF6Br.js +1 -0
  97. package/dist/gateway/static/root/assets/skills-page-DFWMVRW4.js +2 -0
  98. package/dist/gateway/static/root/assets/system-settings-panel-DB-ttubV.js +1 -0
  99. package/dist/gateway/static/root/assets/task-detail-page-BJY7c8wb.js +2 -0
  100. package/dist/gateway/static/root/assets/{task-result-evidence-DIGSC4qF.js → task-result-evidence-B-vt1BgK.js} +1 -1
  101. package/dist/gateway/static/root/assets/{tracing-settings-page-BaU8frtc.js → tracing-settings-page-Dt51Z_ws.js} +1 -1
  102. package/dist/gateway/static/root/assets/{tunnel-api-BCcOUsqu.js → tunnel-api-Dok3t7Qe.js} +1 -1
  103. package/dist/gateway/static/root/assets/usage-page-lJym5G7F.js +1 -0
  104. package/dist/gateway/static/root/assets/{use-autosave-C1X47WVb.js → use-autosave-D4EMIB-V.js} +1 -1
  105. package/dist/gateway/static/root/assets/user-model-page-BXdNkITp.js +2 -0
  106. package/dist/gateway/static/root/assets/{voice-api-key-field-Bk4DQMTw.js → voice-api-key-field-CO3KuanA.js} +1 -1
  107. package/dist/gateway/static/root/assets/{voice-config-api-D7xsWrdh.js → voice-config-api-BkUlN7GH.js} +1 -1
  108. package/dist/gateway/static/root/assets/{work-discovery-overlay-B7_NmTB5.js → work-discovery-overlay-BJRtgQM3.js} +1 -1
  109. package/dist/gateway/static/root/assets/wrench-DFb4r8bH.js +1 -0
  110. package/dist/gateway/static/root/assets/xopc-cloud-account-card-CS-_GxHV.js +1 -0
  111. package/dist/gateway/static/root/browser-setup-test.html +5 -0
  112. package/dist/gateway/static/root/browser-setup-test.js +7 -0
  113. package/dist/gateway/static/root/index.html +17 -14
  114. package/dist/package.js +1 -1
  115. package/dist/packages/gateway-contract/src/browser-setup.js +6 -0
  116. package/dist/packages/gateway-contract/src/index.js +4 -0
  117. package/dist/packages/gateway-contract/src/phone-setup.js +6 -0
  118. package/dist/packages/realtime-client/src/index.js +1 -0
  119. package/dist/packages/realtime-protocol/src/index.js +1 -0
  120. package/dist/src/agent/agent-manager.d.ts +4 -0
  121. package/dist/src/agent/agent-manager.js +12 -1
  122. package/dist/src/agent/coding/workspace-revision.js +1 -1
  123. package/dist/src/agent/commands/command-registry.js +1 -1
  124. package/dist/src/agent/embedded/tool-search-extension.js +14 -1
  125. package/dist/src/agent/memory/context-recovery.d.ts +1 -1
  126. package/dist/src/agent/service.d.ts +1 -0
  127. package/dist/src/agent/service.js +5 -0
  128. package/dist/src/agent/service.types.d.ts +2 -0
  129. package/dist/src/agent/skills/installer.js +3 -3
  130. package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
  131. package/dist/src/agent/tool-manuals/phone.js +4 -2
  132. package/dist/src/agent/tool-manuals/xopc-configuration.d.ts +2 -0
  133. package/dist/src/agent/tool-manuals/xopc-configuration.js +25 -0
  134. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +2 -0
  135. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +6 -2
  136. package/dist/src/agent/tools/factory.d.ts +3 -0
  137. package/dist/src/agent/tools/factory.js +11 -1
  138. package/dist/src/agent/tools/personal-task-tool.d.ts +1 -1
  139. package/dist/src/agent/tools/personal-task-tool.js +23 -21
  140. package/dist/src/agent/tools/phone-use-tool.d.ts +1 -0
  141. package/dist/src/agent/tools/phone-use-tool.js +29 -1
  142. package/dist/src/agent/tools/tool-manual-tool.d.ts +1 -1
  143. package/dist/src/agent/tools/tool-manual-tool.js +3 -1
  144. package/dist/src/agent/tools/toolExposure.js +3 -0
  145. package/dist/src/agent/tools/xopc-use-tool.d.ts +4 -2
  146. package/dist/src/agent/tools/xopc-use-tool.js +40 -2
  147. package/dist/src/backup/archive.js +2 -1
  148. package/dist/src/browser/drivers/browser-driver.d.ts +2 -2
  149. package/dist/src/browser/drivers/extension-driver.d.ts +2 -2
  150. package/dist/src/browser/drivers/extension-driver.js +6 -3
  151. package/dist/src/browser/providers/browser-ext-install.js +3 -2
  152. package/dist/src/browser/runtime/browser-runtime.d.ts +4 -1
  153. package/dist/src/browser/runtime/browser-runtime.js +29 -17
  154. package/dist/src/browser/setup/repository.d.ts +5 -0
  155. package/dist/src/browser/setup/repository.js +42 -0
  156. package/dist/src/browser/setup/service.d.ts +152 -0
  157. package/dist/src/browser/setup/service.js +404 -0
  158. package/dist/src/browser/setup/types.d.ts +38 -0
  159. package/dist/src/browser/setup/types.js +1 -0
  160. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  161. package/dist/src/cli/commands/extension-marketplace.js +3 -3
  162. package/dist/src/cli/commands/extension-pack.js +1 -1
  163. package/dist/src/cli/commands/extension.js +2 -2
  164. package/dist/src/config/schema.d.ts +2 -0
  165. package/dist/src/extensions/install.js +1 -1
  166. package/dist/src/extensions/update.js +1 -1
  167. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  168. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  169. package/dist/src/gateway/hono/routes/browser-setup.d.ts +3 -0
  170. package/dist/src/gateway/hono/routes/browser-setup.js +114 -0
  171. package/dist/src/gateway/hono/routes/browser.d.ts +2 -1
  172. package/dist/src/gateway/hono/routes/browser.js +1 -1
  173. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  174. package/dist/src/gateway/hono/routes/phone-dependencies.js +1 -1
  175. package/dist/src/gateway/hono/routes/phone-setup.d.ts +7 -0
  176. package/dist/src/gateway/hono/routes/phone-setup.js +162 -0
  177. package/dist/src/gateway/hono/routes/phone.js +11 -7
  178. package/dist/src/gateway/hono/routes/public-gateway.js +2 -0
  179. package/dist/src/gateway/provider-model-setup.js +1 -1
  180. package/dist/src/gateway/service/config-coordinator.d.ts +2 -0
  181. package/dist/src/gateway/service/config-coordinator.js +1 -1
  182. package/dist/src/gateway/service/session-input-coordinator.js +1 -1
  183. package/dist/src/gateway/service.d.ts +5 -0
  184. package/dist/src/gateway/service.js +52 -7
  185. package/dist/src/gateway/xopc-cloud-capability-setup.js +7 -1
  186. package/dist/src/home-intelligence/host.js +2 -2
  187. package/dist/src/infra/unhandled-rejections.js +2 -2
  188. package/dist/src/infra/update-runner.js +1 -1
  189. package/dist/src/personal-agent/prompts.js +1 -1
  190. package/dist/src/phone/adb-driver.d.ts +8 -2
  191. package/dist/src/phone/adb-driver.js +124 -54
  192. package/dist/src/phone/cloud-adb.js +8 -0
  193. package/dist/src/phone/cloud-scrcpy.d.ts +3 -1
  194. package/dist/src/phone/cloud-scrcpy.js +17 -3
  195. package/dist/src/phone/contracts.d.ts +85 -0
  196. package/dist/src/phone/contracts.js +31 -5
  197. package/dist/src/phone/model-adapter.d.ts +141 -2
  198. package/dist/src/phone/model-adapter.js +176 -24
  199. package/dist/src/phone/numeric-entry.d.ts +31 -0
  200. package/dist/src/phone/numeric-entry.js +126 -0
  201. package/dist/src/phone/planning.d.ts +27 -0
  202. package/dist/src/phone/planning.js +79 -0
  203. package/dist/src/phone/recovery.d.ts +37 -0
  204. package/dist/src/phone/recovery.js +81 -0
  205. package/dist/src/phone/reliability.d.ts +7 -0
  206. package/dist/src/phone/reliability.js +66 -0
  207. package/dist/src/phone/repository.d.ts +1 -0
  208. package/dist/src/phone/repository.js +3 -0
  209. package/dist/src/phone/runtime.d.ts +8 -0
  210. package/dist/src/phone/runtime.js +387 -41
  211. package/dist/src/phone/scrcpy-text.d.ts +11 -0
  212. package/dist/src/phone/scrcpy-text.js +72 -0
  213. package/dist/src/phone/scrcpy.d.ts +5 -1
  214. package/dist/src/phone/scrcpy.js +48 -3
  215. package/dist/src/phone/semantic-controls.d.ts +13 -0
  216. package/dist/src/phone/semantic-controls.js +76 -0
  217. package/dist/src/phone/setup/service.d.ts +148 -0
  218. package/dist/src/phone/setup/service.js +251 -0
  219. package/dist/src/providers/presentation.js +2 -2
  220. package/dist/src/providers/xopc-cloud-model-source.js +6 -2
  221. package/dist/src/realtime/runtime.js +1 -1
  222. package/dist/src/storage/sqlite/connection.js +2 -2
  223. package/dist/src/storage/sqlite/offline-access.js +13 -7
  224. package/dist/src/storage/sqlite/schema-errors.d.ts +12 -0
  225. package/dist/src/storage/sqlite/schema-errors.js +21 -3
  226. package/dist/src/storage/sqlite/schema-upgrade.d.ts +4 -0
  227. package/dist/src/storage/sqlite/schema-upgrade.js +78 -0
  228. package/dist/src/storage/sqlite/schema.d.ts +4 -3
  229. package/dist/src/storage/sqlite/schema.js +14 -8
  230. package/dist/src/storage/sqlite/schema.sql +10 -0
  231. package/dist/src/storage/sqlite/upgrades/203_remove_retired_proactive_contracts.sql +70 -0
  232. package/dist/src/storage/sqlite/upgrades/204_home_intelligence.sql +78 -0
  233. package/dist/src/storage/sqlite/upgrades/205_agent_catalog.sql +66 -0
  234. package/dist/src/storage/sqlite/upgrades/206_home_advice_strategy_version.sql +2 -0
  235. package/dist/src/storage/sqlite/upgrades/207_user_model_policy_contract.sql +121 -0
  236. package/dist/src/storage/sqlite/upgrades/208_automation_management.sql +2 -0
  237. package/dist/src/storage/sqlite/upgrades/209_automation_event_hub.sql +48 -0
  238. package/dist/src/storage/sqlite/upgrades/210_remove_legacy_automation_timeout.sql +14 -0
  239. package/dist/src/storage/sqlite/upgrades/211_automation_result_deliveries.sql +16 -0
  240. package/dist/src/storage/sqlite/upgrades/212_automation_delivery_policy.sql +30 -0
  241. package/dist/src/storage/sqlite/upgrades/213_automation_reliability_contract.sql +188 -0
  242. package/dist/src/storage/sqlite/upgrades/214_ai_usage_ledger.sql +41 -0
  243. package/dist/src/storage/sqlite/upgrades/215_scene_execution_adapters.sql +6 -0
  244. package/dist/src/storage/sqlite/upgrades/216_remove_scene_model_usage.sql +1 -0
  245. package/dist/src/storage/sqlite/upgrades/217_remove_legacy_memory_tables.sql +4 -0
  246. package/dist/src/storage/sqlite/upgrades/218_core_relation_indexes.sql +26 -0
  247. package/dist/src/storage/sqlite/upgrades/219_json_contracts.sql +123 -0
  248. package/dist/src/storage/sqlite/upgrades/220_normalize_timestamps.sql +339 -0
  249. package/dist/src/storage/sqlite/upgrades/221_ai_usage_retention_index.sql +2 -0
  250. package/dist/src/storage/sqlite/upgrades/222_session_config_authority.sql +13 -0
  251. package/dist/src/storage/sqlite/upgrades/223_session_creation_receipts.sql +59 -0
  252. package/dist/src/storage/sqlite/upgrades/224_task_origin_links.sql +8 -0
  253. package/dist/src/storage/sqlite/upgrades/225_task_collaboration.sql +32 -0
  254. package/dist/src/storage/sqlite/upgrades/226_task_main_updates.sql +9 -0
  255. package/dist/src/storage/sqlite/upgrades/227_task_main_update_decisions.sql +8 -0
  256. package/dist/src/storage/sqlite/upgrades/228_task_main_agent_links.sql +14 -0
  257. package/dist/src/storage/sqlite/upgrades/229_task_criterion_reviews.sql +12 -0
  258. package/dist/src/storage/sqlite/upgrades/230_personal_agent_onboarding.sql +8 -0
  259. package/dist/src/storage/sqlite/upgrades/231_task_result_deliveries.sql +32 -0
  260. package/dist/src/storage/sqlite/upgrades/232_personal_requests.sql +28 -0
  261. package/dist/src/storage/sqlite/upgrades/233_observability_usage_links.sql +3 -0
  262. package/dist/src/storage/sqlite/upgrades/234_task_result_reply.sql +14 -0
  263. package/dist/src/storage/sqlite/upgrades/235_personal_conversation_priority.sql +3 -0
  264. package/dist/src/storage/sqlite/upgrades/236_personal_proactivity.sql +53 -0
  265. package/dist/src/storage/sqlite/upgrades/237_personal_strategy_versions.sql +18 -0
  266. package/dist/src/storage/sqlite/upgrades/238_browser_record_replay.sql +45 -0
  267. package/dist/src/storage/sqlite/upgrades/239_clarification_notifications.sql +26 -0
  268. package/dist/src/storage/sqlite/upgrades/240_device_settings.sql +5 -0
  269. package/dist/src/storage/sqlite/upgrades/241_device_grant_audit.sql +13 -0
  270. package/dist/src/storage/sqlite/upgrades/242_cloud_usage_receipts.sql +5 -0
  271. package/dist/src/storage/sqlite/upgrades/243_voice_opening_greetings.sql +12 -0
  272. package/dist/src/storage/sqlite/upgrades/244_device_request_proofs.sql +8 -0
  273. package/dist/src/storage/sqlite/upgrades/245_memory_learning.sql +125 -0
  274. package/dist/src/storage/sqlite/upgrades/246_personal_session_thinking.sql +22 -0
  275. package/dist/src/storage/sqlite/upgrades/247_agent_selection_records.sql +32 -0
  276. package/dist/src/storage/sqlite/upgrades/248_next_turn_suggestions.sql +20 -0
  277. package/dist/src/storage/sqlite/upgrades/249_task_allocations.sql +17 -0
  278. package/dist/src/storage/sqlite/upgrades/250_research_checkpoints.sql +15 -0
  279. package/dist/src/storage/sqlite/upgrades/251_personal_result_reads.sql +40 -0
  280. package/dist/src/storage/sqlite/upgrades/252_task_work_revisions.sql +15 -0
  281. package/dist/src/storage/sqlite/upgrades/253_discussion_processing_recovery.sql +20 -0
  282. package/dist/src/storage/sqlite/upgrades/254_discussion_annotations.sql +17 -0
  283. package/dist/src/storage/sqlite/upgrades/255_discussion_chapter_progress.sql +10 -0
  284. package/dist/src/storage/sqlite/upgrades/256_task_main_update_retries.sql +21 -0
  285. package/dist/src/storage/sqlite/upgrades/257_session_composer_history.sql +11 -0
  286. package/dist/src/storage/sqlite/upgrades/258_task_phase_changes.sql +20 -0
  287. package/dist/src/storage/sqlite/upgrades/259_personal_default_style.sql +10 -0
  288. package/dist/src/storage/sqlite/upgrades/260_browser_setup.sql +9 -0
  289. package/dist/src/storage/sqlite/windows-database-owners.js +33 -28
  290. package/dist/src/tasks/capabilities/relations.d.ts +2 -2
  291. package/dist/src/tui/clipboard-image.js +1 -1
  292. package/dist/src/tui/tui.js +1 -1
  293. package/dist/src/utils/index.js +1 -1
  294. package/dist/src/utils/logger/index.js +1 -1
  295. package/dist/src/utils/logger.js +1 -1
  296. package/dist/src/work-discovery/probe.js +1 -1
  297. package/package.json +3 -3
  298. package/skills/tools/configure-xopc/SKILL.md +47 -0
  299. package/skills/tools/configure-xopc/references/browser/acceptance.md +31 -0
  300. package/skills/tools/configure-xopc/references/browser/chrome-extension.md +19 -0
  301. package/skills/tools/configure-xopc/references/browser/overview.md +22 -0
  302. package/skills/tools/configure-xopc/references/browser/permissions.md +25 -0
  303. package/skills/tools/configure-xopc/references/browser/troubleshooting.md +24 -0
  304. package/skills/tools/configure-xopc/references/phone/acceptance.md +25 -0
  305. package/skills/tools/configure-xopc/references/phone/aliyun.md +29 -0
  306. package/skills/tools/configure-xopc/references/phone/dependencies.md +18 -0
  307. package/skills/tools/configure-xopc/references/phone/local.md +19 -0
  308. package/skills/tools/configure-xopc/references/phone/models.md +18 -0
  309. package/skills/tools/configure-xopc/references/phone/overview.md +30 -0
  310. package/skills/tools/configure-xopc/references/phone/troubleshooting.md +24 -0
  311. package/skills/tools/configure-xopc/references/scene-index.md +12 -0
  312. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-mf0jgEPE.js +0 -1
  313. package/dist/gateway/static/root/assets/agents-CKhZ4UYQ.js +0 -77
  314. package/dist/gateway/static/root/assets/apps-page-BZ_MaQJf.js +0 -1
  315. package/dist/gateway/static/root/assets/automations-workspace-CHUDHNVL.js +0 -8
  316. package/dist/gateway/static/root/assets/browser-automations-page-DStDm9y1.js +0 -3
  317. package/dist/gateway/static/root/assets/browser-settings-page-6I4oetKt.js +0 -3
  318. package/dist/gateway/static/root/assets/capabilities-page-C-EecWbS.js +0 -2
  319. package/dist/gateway/static/root/assets/capabilities-settings-panel-BQoCPk3x.js +0 -8
  320. package/dist/gateway/static/root/assets/channels-BKf_-Mdt.js +0 -1
  321. package/dist/gateway/static/root/assets/connectors-page-CUBg8spT.js +0 -1
  322. package/dist/gateway/static/root/assets/device-pairing-wizard-PmP_vGem.js +0 -1
  323. package/dist/gateway/static/root/assets/gateway-realtime-DMAzNlm-.js +0 -1
  324. package/dist/gateway/static/root/assets/gateway-realtime-store-CoIgC1Al.js +0 -1
  325. package/dist/gateway/static/root/assets/gateway-settings-DnrQ28E2.js +0 -1
  326. package/dist/gateway/static/root/assets/highlight-code-AMjU04kR.js +0 -1
  327. package/dist/gateway/static/root/assets/home-page-pTwVME-g.js +0 -2
  328. package/dist/gateway/static/root/assets/index-BLL0wKRZ.css +0 -1
  329. package/dist/gateway/static/root/assets/index-ygkHNYyo.js +0 -710
  330. package/dist/gateway/static/root/assets/local-app-workbench-page-Cwl6EvuX.js +0 -1
  331. package/dist/gateway/static/root/assets/logs-page-CS3hcTOq.js +0 -2
  332. package/dist/gateway/static/root/assets/management-settings-DC-Y_-GP.js +0 -1
  333. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-vckgHpON.js +0 -1
  334. package/dist/gateway/static/root/assets/note-detail-panel-C7u4dxEk.js +0 -5
  335. package/dist/gateway/static/root/assets/note-image-lightbox-jvqYtySx.js +0 -1
  336. package/dist/gateway/static/root/assets/notes-page-Bs7F5Hpf.js +0 -8
  337. package/dist/gateway/static/root/assets/page-context-capture-button-DO_yhXS1.js +0 -1
  338. package/dist/gateway/static/root/assets/personal-page-BexL2-PQ.js +0 -1
  339. package/dist/gateway/static/root/assets/personal-settings-panel-BKA4fbYH.js +0 -1
  340. package/dist/gateway/static/root/assets/phone-dependencies-card-ChFtdFhA.js +0 -1
  341. package/dist/gateway/static/root/assets/phone-model-picker-CZoIAQ1j.js +0 -1
  342. package/dist/gateway/static/root/assets/phone-settings-page-DRyK0nHH.js +0 -1
  343. package/dist/gateway/static/root/assets/plugin-details-dialog-B-N61jJH.js +0 -1
  344. package/dist/gateway/static/root/assets/project-detail-page-DtKmFBml.js +0 -7
  345. package/dist/gateway/static/root/assets/projects-page-CFZIz9mc.js +0 -1
  346. package/dist/gateway/static/root/assets/remote-access-hub-CWEc7W0m.js +0 -1
  347. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-q_oswAdV.js +0 -1
  348. package/dist/gateway/static/root/assets/sessions-page-BuPqNxpd.js +0 -1
  349. package/dist/gateway/static/root/assets/settings-advanced-gate-QTVDCGJG.js +0 -1
  350. package/dist/gateway/static/root/assets/settings-page-header-CYpuTXUW.js +0 -1
  351. package/dist/gateway/static/root/assets/setup-status-panel-ZmlE8jIE.js +0 -1
  352. package/dist/gateway/static/root/assets/shares-settings-CtNxWqW-.js +0 -1
  353. package/dist/gateway/static/root/assets/skill-reload-api-Egaf8PqZ.js +0 -1
  354. package/dist/gateway/static/root/assets/skills-page-C6FKxf4J.js +0 -2
  355. package/dist/gateway/static/root/assets/system-settings-panel-Baxkhov7.js +0 -1
  356. package/dist/gateway/static/root/assets/task-detail-page-C77-rpkt.js +0 -2
  357. package/dist/gateway/static/root/assets/usage-page-BFeIbpbi.js +0 -1
  358. package/dist/gateway/static/root/assets/user-model-page-u8zY5jea.js +0 -2
  359. package/dist/gateway/static/root/assets/xopc-cloud-account-card-CJ_akAvc.js +0 -1
@@ -1,4 +1,4 @@
1
- import { type PhoneApplication, type DiscoveredPhone, type PhoneAction, type PhoneElement, type PhoneObservation } from './contracts.js';
1
+ import { type PhoneApplication, type PhoneTextInputStatus, type DiscoveredPhone, type PhoneAction, type PhoneElement, type PhoneObservation } from './contracts.js';
2
2
  export declare function resolveAdbPath(configured?: string, stateDir?: string): string;
3
3
  export declare function runAdb(path: string, args: string[], signal?: AbortSignal, timeout?: number): Promise<Buffer>;
4
4
  export declare function parseAdbDevices(text: string): DiscoveredPhone[];
@@ -7,12 +7,14 @@ export declare function parseAndroidLayout(raw: string): PhoneElement[];
7
7
  export interface PhoneDriver {
8
8
  discover(signal?: AbortSignal): Promise<DiscoveredPhone[]>;
9
9
  applications?(serial: string, signal: AbortSignal): Promise<PhoneApplication[]>;
10
+ textInputStatus?(serial: string, signal: AbortSignal): Promise<PhoneTextInputStatus>;
10
11
  observe(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
11
12
  capture?(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
12
13
  observeForText?(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
13
14
  execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
14
15
  settleMs: number;
15
16
  resetTask?: boolean;
17
+ settingsPage?: 'about-phone';
16
18
  }): Promise<void>;
17
19
  }
18
20
  /** Read only the active native editor, never historical input-method entries. */
@@ -22,7 +24,9 @@ export declare class AdbPhoneDriver implements PhoneDriver {
22
24
  private readonly command;
23
25
  private readonly useAndroidCli;
24
26
  private readonly readApplications?;
25
- constructor(adbPath?: string, command?: typeof runAdb, useAndroidCli?: boolean, readApplications?: (signal: AbortSignal) => Promise<PhoneApplication[]>);
27
+ private readonly pasteText?;
28
+ constructor(adbPath?: string, command?: typeof runAdb, useAndroidCli?: boolean, readApplications?: (signal: AbortSignal) => Promise<PhoneApplication[]>, pasteText?: (text: string, signal: AbortSignal) => Promise<void>);
29
+ textInputStatus(serial: string, signal: AbortSignal): Promise<PhoneTextInputStatus>;
26
30
  discover(signal?: AbortSignal): Promise<DiscoveredPhone[]>;
27
31
  applications(serial: string, signal: AbortSignal): Promise<PhoneApplication[]>;
28
32
  foreground(serial: string, signal: AbortSignal): Promise<string>;
@@ -31,8 +35,10 @@ export declare class AdbPhoneDriver implements PhoneDriver {
31
35
  observeForText(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
32
36
  /** Pixel capture avoids accessibility dumps on the human interaction path. */
33
37
  capture(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
38
+ private confirmText;
34
39
  execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
35
40
  settleMs: number;
36
41
  resetTask?: boolean;
42
+ settingsPage?: 'about-phone';
37
43
  }): Promise<void>;
38
44
  }
@@ -132,12 +132,32 @@ function parseAndroidFocusedEditor(raw, app) {
132
132
  };
133
133
  }
134
134
  }
135
+ function sameTextEditor(target, node) {
136
+ return node.focused && Boolean(node.editable) && !node.password && (target.resourceId ? node.resourceId === target.resourceId : node.bounds.every((value, index) => value === target.bounds[index]));
137
+ }
135
138
  var AdbPhoneDriver = class {
136
- constructor(adbPath = resolveAdbPath(), command = runAdb, useAndroidCli = true, readApplications) {
139
+ constructor(adbPath = resolveAdbPath(), command = runAdb, useAndroidCli = true, readApplications, pasteText) {
137
140
  this.adbPath = adbPath;
138
141
  this.command = command;
139
142
  this.useAndroidCli = useAndroidCli;
140
143
  this.readApplications = readApplications;
144
+ this.pasteText = pasteText;
145
+ }
146
+ async textInputStatus(serial, signal) {
147
+ const androidSdk = Number((await this.shell(serial, ["getprop", "ro.build.version.sdk"], signal)).trim()) || 0;
148
+ let ready = false;
149
+ try {
150
+ await readScrcpyServer();
151
+ ready = true;
152
+ } catch {
153
+ signal.throwIfAborted();
154
+ }
155
+ return {
156
+ androidSdk,
157
+ unicode: androidSdk < 24 ? "unsupported" : ready ? "available" : "setup_required",
158
+ method: "scrcpy-clipboard",
159
+ keyboardRequired: false
160
+ };
141
161
  }
142
162
  async discover(signal) {
143
163
  return parseAdbDevices((await this.command(this.adbPath, ["devices", "-l"], signal)).toString());
@@ -198,25 +218,29 @@ var AdbPhoneDriver = class {
198
218
  }
199
219
  if (!elements.length) await setTimeout(350, void 0, { signal });
200
220
  }
201
- if (!elements.length) try {
202
- const path = `/data/local/tmp/xopc-phone-${randomUUID()}.xml`;
221
+ if (!elements.length) for (const flags of [[], ["--compressed"]]) {
203
222
  try {
204
- await this.shell(serial, [
205
- "uiautomator",
206
- "dump",
207
- path
208
- ], signal);
209
- elements = parsePhoneUi(await this.shell(serial, ["cat", path], signal));
210
- } finally {
211
- await this.shell(serial, [
212
- "rm",
213
- "-f",
214
- path
215
- ], signal).catch(() => {});
223
+ const path = `/data/local/tmp/xopc-phone-${randomUUID()}.xml`;
224
+ try {
225
+ await this.shell(serial, [
226
+ "uiautomator",
227
+ "dump",
228
+ ...flags,
229
+ path
230
+ ], signal);
231
+ elements = parsePhoneUi(await this.shell(serial, ["cat", path], signal));
232
+ } finally {
233
+ await this.shell(serial, [
234
+ "rm",
235
+ "-f",
236
+ path
237
+ ], signal).catch(() => {});
238
+ }
239
+ } catch (error) {
240
+ signal.throwIfAborted();
241
+ if (error instanceof Error && error.message === "PHONE_UI_INVALID") throw error;
216
242
  }
217
- } catch (error) {
218
- signal.throwIfAborted();
219
- if (error instanceof Error && error.message === "PHONE_UI_INVALID") throw error;
243
+ if (elements.length) break;
220
244
  }
221
245
  return {
222
246
  ...await this.capture(serial, signal),
@@ -285,11 +309,40 @@ var AdbPhoneDriver = class {
285
309
  throw error;
286
310
  }
287
311
  }
312
+ async confirmText(serial, app, target, matches, signal) {
313
+ for (let attempt = 0; attempt < 3; attempt++) {
314
+ await setTimeout(150, void 0, { signal });
315
+ const after = await this.observe(serial, signal);
316
+ try {
317
+ if (after.package !== app) break;
318
+ const candidates = after.elements.filter((node) => target.resourceId === "android:active-editor" ? node.focused && node.editable && !node.password : sameTextEditor(target, node));
319
+ if (candidates.length === 1 && matches(candidates[0].text)) return;
320
+ if (candidates.length !== 1) break;
321
+ } finally {
322
+ after.frame.fill(0);
323
+ }
324
+ }
325
+ throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text was sent but the target field value could not be verified. Take over and inspect the input field before retrying.", 409);
326
+ }
288
327
  async execute(serial, action, observation, signal, options) {
289
328
  const point = ([x, y]) => [String(Math.min(observation.width - 1, Math.round(x * observation.width / 1e3))), String(Math.min(observation.height - 1, Math.round(y * observation.height / 1e3)))];
290
329
  const input = (args) => this.shell(serial, ["input", ...args], signal);
291
330
  switch (action.type) {
331
+ case "tapElement": throw new PhoneError("PHONE_SEMANTIC_UNRESOLVED", "Resolve the native element against a fresh observation before dispatch", 409);
292
332
  case "launch": {
333
+ if (options?.settingsPage) {
334
+ if (action.package !== "com.android.settings") throw new PhoneError("PHONE_APP_DENIED", "About phone requires the Settings application");
335
+ const output = await this.shell(serial, [
336
+ "am",
337
+ "start",
338
+ "-a",
339
+ "android.settings.DEVICE_INFO_SETTINGS",
340
+ "-p",
341
+ action.package
342
+ ], signal);
343
+ if (/Error|Exception/.test(output)) throw new PhoneError("PHONE_LAUNCH_FAILED", "Unable to open About phone");
344
+ break;
345
+ }
293
346
  const component = (await this.shell(serial, [
294
347
  "cmd",
295
348
  "package",
@@ -334,47 +387,64 @@ var AdbPhoneDriver = class {
334
387
  String(action.durationMs)
335
388
  ]);
336
389
  break;
337
- case "typeText":
338
- if (!observation.elements.some((node) => node.focused && node.editable && !node.password)) throw new PhoneError("PHONE_INPUT_NOT_FOCUSED", "Focus a non-password editable field before typing");
339
- if (/^[a-zA-Z0-9 .,_@+-]+$/.test(action.text) && !action.text.includes("%")) await input(["text", action.text.replaceAll(" ", "%s")]);
340
- else {
341
- const previous = (await this.shell(serial, [
342
- "settings",
343
- "get",
344
- "secure",
345
- "default_input_method"
346
- ], signal)).trim();
347
- const keyboard = "com.android.adbkeyboard/.AdbIME";
348
- if (!(await this.shell(serial, [
349
- "ime",
350
- "list",
351
- "-s"
352
- ], signal)).split(/\s+/).includes(keyboard)) throw new PhoneError("PHONE_KEYBOARD_REQUIRED", "Unicode input requires ADB Keyboard. Install and enable it on the device first.");
390
+ case "typeText": {
391
+ const editors = observation.elements.filter((node) => node.focused && node.editable && !node.password);
392
+ if (editors.length !== 1) throw new PhoneError("PHONE_INPUT_NOT_FOCUSED", "Focus one non-password editable field before typing");
393
+ const ascii = /^[a-zA-Z0-9 .,_@+-]+$/.test(action.text) && !action.text.includes("%");
394
+ if (!ascii) {
395
+ if ((await this.textInputStatus(serial, signal)).unicode !== "available") throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Automatic text input is unavailable. Check Phone settings or take over and type with the phone keyboard.", 409);
396
+ }
397
+ let target = editors[0];
398
+ if (action.mode === "replace") {
399
+ if (target.resourceId === "android:active-editor") throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Replacing text requires a visible editable field. Take over and inspect the field.", 409);
400
+ const fresh = await this.observe(serial, signal);
353
401
  try {
354
- await this.shell(serial, [
355
- "ime",
356
- "set",
357
- keyboard
358
- ], signal);
359
- const result = await this.shell(serial, [
360
- "am",
361
- "broadcast",
362
- "-a",
363
- "ADB_INPUT_B64",
364
- "--es",
365
- "msg",
366
- Buffer.from(action.text).toString("base64")
367
- ], signal);
368
- if (!/Broadcast completed/.test(result)) throw new PhoneError("PHONE_INPUT_FAILED", "Keyboard input was not acknowledged");
402
+ const current = fresh.elements.filter((node) => sameTextEditor(target, node));
403
+ if (fresh.package !== observation.package || current.length !== 1) throw new PhoneError("PHONE_INPUT_NOT_FOCUSED", "The focused input field changed before replacement", 409);
404
+ target = current[0];
369
405
  } finally {
370
- if (/^[\w.]+\/[\w.$]+$/.test(previous)) await this.shell(serial, [
371
- "ime",
372
- "set",
373
- previous
374
- ], AbortSignal.timeout(3e3));
406
+ fresh.frame.fill(0);
407
+ }
408
+ if (target.text) {
409
+ if (!(await this.shell(serial, ["input"], signal)).includes("keycombination")) throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "This phone cannot safely select all text. Take over and replace the field manually.", 409);
410
+ try {
411
+ await input([
412
+ "keycombination",
413
+ "KEYCODE_CTRL_LEFT",
414
+ "KEYCODE_A"
415
+ ]);
416
+ const selected = await this.observe(serial, signal);
417
+ try {
418
+ if (selected.package !== observation.package || selected.elements.filter((node) => sameTextEditor(target, node) && node.text === target.text).length !== 1) throw new Error("Editor changed during selection");
419
+ } finally {
420
+ selected.frame.fill(0);
421
+ }
422
+ } catch {
423
+ signal.throwIfAborted();
424
+ throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text selection started but the target field could not be verified. Take over and inspect the input field before retrying.", 409);
425
+ }
375
426
  }
376
427
  }
428
+ try {
429
+ if (ascii) await input(["text", action.text.replaceAll(" ", "%s")]);
430
+ else if (this.pasteText) await this.pasteText(action.text, signal);
431
+ else {
432
+ const { LocalScrcpyProvider } = await import("./scrcpy.js");
433
+ const provider = new LocalScrcpyProvider(this.adbPath, serial, () => {}, void 0, true);
434
+ try {
435
+ await provider.pasteText(action.text, signal);
436
+ } finally {
437
+ await provider.close();
438
+ }
439
+ }
440
+ await this.confirmText(serial, observation.package, target, (text) => action.mode === "replace" ? text === action.text : text.includes(action.text), signal);
441
+ } catch (error) {
442
+ signal.throwIfAborted();
443
+ if (error instanceof PhoneError && error.code === "PHONE_TEXT_INPUT_UNCONFIRMED") throw error;
444
+ throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text may have been sent but insertion could not be verified. Take over and inspect the input field before retrying.", 409);
445
+ }
377
446
  break;
447
+ }
378
448
  case "home":
379
449
  await input(["keyevent", "KEYCODE_HOME"]);
380
450
  break;
@@ -266,6 +266,14 @@ var CloudAdbConnection = class CloudAdbConnection {
266
266
  } finally {
267
267
  listing.dispose();
268
268
  }
269
+ }, async (text, signal) => {
270
+ const { CloudScrcpyProvider } = await import("./cloud-scrcpy.js");
271
+ const provider = new CloudScrcpyProvider(this.endpoint, Buffer.from(this.key), () => {}, void 0, true);
272
+ try {
273
+ await provider.pasteText(text, signal);
274
+ } finally {
275
+ await provider.close();
276
+ }
269
277
  });
270
278
  }
271
279
  };
@@ -3,6 +3,7 @@ import { ScrcpyProvider } from './scrcpy.js';
3
3
  /** Dedicated authenticated ADB transport: no host ADB key, server or port forwarding. */
4
4
  export declare class CloudScrcpyProvider extends ScrcpyProvider {
5
5
  private endpoint;
6
+ private textOnly;
6
7
  private connection;
7
8
  private process?;
8
9
  private video?;
@@ -10,11 +11,12 @@ export declare class CloudScrcpyProvider extends ScrcpyProvider {
10
11
  private writer?;
11
12
  private remote;
12
13
  private scid;
13
- constructor(endpoint: string, key: Buffer, onFailure: () => void, connect?: (address: string, credential: Buffer) => CloudAdbConnection);
14
+ constructor(endpoint: string, key: Buffer, onFailure: () => void, connect?: (address: string, credential: Buffer) => CloudAdbConnection, textOnly?: boolean);
14
15
  foreground(signal: AbortSignal): Promise<string>;
15
16
  protected startTransport(): Promise<void>;
16
17
  private drain;
17
18
  private readVideo;
19
+ private readControl;
18
20
  protected write(buffer: Buffer): Promise<void>;
19
21
  protected cleanup(): Promise<void>;
20
22
  }
@@ -17,9 +17,10 @@ var CloudScrcpyProvider = class extends ScrcpyProvider {
17
17
  writer;
18
18
  remote = "";
19
19
  scid = "";
20
- constructor(endpoint, key, onFailure, connect = (address, credential) => new CloudAdbConnection(address, credential)) {
20
+ constructor(endpoint, key, onFailure, connect = (address, credential) => new CloudAdbConnection(address, credential), textOnly = false) {
21
21
  super(onFailure);
22
22
  this.endpoint = endpoint;
23
+ this.textOnly = textOnly;
23
24
  this.connection = connect(endpoint, key);
24
25
  }
25
26
  foreground(signal) {
@@ -48,7 +49,7 @@ var CloudScrcpyProvider = class extends ScrcpyProvider {
48
49
  await sync.dispose();
49
50
  }
50
51
  if (this.closing) throw new Error("Video closed");
51
- this.process = await adb.createSocket(`exec:CLASSPATH=${this.remote} app_process / com.genymobile.scrcpy.Server ${SCRCPY_VERSION} scid=${this.scid} tunnel_forward=true audio=false control=true cleanup=false max_size=960 max_fps=30 video_bit_rate=2000000 video_codec=h264 video_codec_options=i-frame-interval=1 send_dummy_byte=false send_device_meta=false send_codec_meta=true send_frame_meta=true clipboard_autosync=false`);
52
+ this.process = await adb.createSocket(`exec:CLASSPATH=${this.remote} app_process / com.genymobile.scrcpy.Server ${SCRCPY_VERSION} scid=${this.scid} tunnel_forward=true audio=false control=true cleanup=false max_size=960 max_fps=30 video_bit_rate=2000000 video_codec=h264 video_codec_options=i-frame-interval=1 send_dummy_byte=false send_device_meta=false send_codec_meta=true send_frame_meta=true clipboard_autosync=false${this.textOnly ? " video=false power_on=false" : ""}`);
52
53
  this.drain(this.process);
53
54
  for (let attempt = 0; attempt < 60; attempt++) {
54
55
  if (this.closing) throw new Error("Video closed");
@@ -60,9 +61,16 @@ var CloudScrcpyProvider = class extends ScrcpyProvider {
60
61
  }
61
62
  }
62
63
  if (!this.video) throw new Error("Scrcpy connection timed out");
64
+ if (this.textOnly) {
65
+ this.control = this.video;
66
+ this.video = void 0;
67
+ this.writer = this.control.writable.getWriter();
68
+ this.readControl(this.control);
69
+ return;
70
+ }
63
71
  this.control = await adb.createSocket(`localabstract:${socketName}`);
64
72
  this.writer = this.control.writable.getWriter();
65
- this.drain(this.control);
73
+ this.readControl(this.control);
66
74
  this.readVideo(this.video);
67
75
  } finally {
68
76
  clearTimeout(timer);
@@ -81,6 +89,12 @@ var CloudScrcpyProvider = class extends ScrcpyProvider {
81
89
  } catch {}
82
90
  if (!this.closing) this.fail();
83
91
  }
92
+ async readControl(socket) {
93
+ try {
94
+ for await (const chunk of socket.readable) this.textChannel.receive(Buffer.from(chunk));
95
+ } catch {}
96
+ if (!this.closing) this.fail();
97
+ }
84
98
  async write(buffer) {
85
99
  if (!this.writer) throw new PhoneError("PHONE_INPUT_DISCONNECTED", "Cloud phone input channel unavailable");
86
100
  const timer = setTimeout(() => this.connection.close(), 2e3);
@@ -14,6 +14,8 @@ export declare const MOCK_PHONE_GOAL = "Open Android Settings and inspect About
14
14
  export declare const PhoneConfigSchema: z.ZodPrefault<z.ZodObject<{
15
15
  enabled: z.ZodDefault<z.ZodBoolean>;
16
16
  adbPath: z.ZodOptional<z.ZodString>;
17
+ semanticControls: z.ZodDefault<z.ZodBoolean>;
18
+ hierarchicalPlanning: z.ZodDefault<z.ZodBoolean>;
17
19
  maxActionsPerSession: z.ZodDefault<z.ZodNumber>;
18
20
  maxModelRequests: z.ZodDefault<z.ZodNumber>;
19
21
  maxOperationDurationMs: z.ZodDefault<z.ZodNumber>;
@@ -29,6 +31,10 @@ export declare const PhoneDeviceSchema: z.ZodObject<{
29
31
  all: "all";
30
32
  selected: "selected";
31
33
  }>>;
34
+ textInput: z.ZodOptional<z.ZodEnum<{
35
+ manual: "manual";
36
+ auto: "auto";
37
+ }>>;
32
38
  allowedApps: z.ZodDefault<z.ZodArray<z.ZodString>>;
33
39
  connection: z.ZodOptional<z.ZodObject<{
34
40
  kind: z.ZodLiteral<"aliyun-adb">;
@@ -43,18 +49,42 @@ export type PhoneApplication = {
43
49
  packageName: string;
44
50
  label: string;
45
51
  };
52
+ export type PhoneTextInputStatus = {
53
+ androidSdk: number;
54
+ unicode: 'available' | 'setup_required' | 'unsupported';
55
+ method: 'scrcpy-clipboard' | 'provider-native';
56
+ keyboardRequired: false;
57
+ };
46
58
  export type DiscoveredPhone = {
47
59
  serial: string;
48
60
  state: string;
49
61
  name: string;
50
62
  emulator: boolean;
51
63
  };
64
+ export declare const PhoneElementSelectorSchema: z.ZodObject<{
65
+ resourceId: z.ZodOptional<z.ZodString>;
66
+ text: z.ZodOptional<z.ZodString>;
67
+ description: z.ZodOptional<z.ZodString>;
68
+ }, z.core.$strict>;
69
+ export type PhoneElementSelector = z.infer<typeof PhoneElementSelectorSchema>;
70
+ export type PhoneCapabilities = {
71
+ semanticControls?: boolean;
72
+ hierarchicalPlanning?: boolean;
73
+ };
52
74
  export declare const PhoneActionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
53
75
  type: z.ZodLiteral<"launch">;
54
76
  package: z.ZodString;
55
77
  }, z.core.$strict>, z.ZodObject<{
56
78
  type: z.ZodLiteral<"tap">;
57
79
  point: z.ZodArray<z.ZodNumber>;
80
+ }, z.core.$strict>, z.ZodObject<{
81
+ type: z.ZodLiteral<"tapElement">;
82
+ frameId: z.ZodString;
83
+ selector: z.ZodObject<{
84
+ resourceId: z.ZodOptional<z.ZodString>;
85
+ text: z.ZodOptional<z.ZodString>;
86
+ description: z.ZodOptional<z.ZodString>;
87
+ }, z.core.$strict>;
58
88
  }, z.core.$strict>, z.ZodObject<{
59
89
  type: z.ZodLiteral<"doubleTap">;
60
90
  point: z.ZodArray<z.ZodNumber>;
@@ -70,6 +100,10 @@ export declare const PhoneActionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
70
100
  }, z.core.$strict>, z.ZodObject<{
71
101
  type: z.ZodLiteral<"typeText">;
72
102
  text: z.ZodString;
103
+ mode: z.ZodOptional<z.ZodEnum<{
104
+ replace: "replace";
105
+ insert: "insert";
106
+ }>>;
73
107
  }, z.core.$strict>, z.ZodObject<{
74
108
  type: z.ZodEnum<{
75
109
  home: "home";
@@ -88,6 +122,14 @@ export declare const PhoneDecisionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
88
122
  }, z.core.$strict>, z.ZodObject<{
89
123
  type: z.ZodLiteral<"tap">;
90
124
  point: z.ZodArray<z.ZodNumber>;
125
+ }, z.core.$strict>, z.ZodObject<{
126
+ type: z.ZodLiteral<"tapElement">;
127
+ frameId: z.ZodString;
128
+ selector: z.ZodObject<{
129
+ resourceId: z.ZodOptional<z.ZodString>;
130
+ text: z.ZodOptional<z.ZodString>;
131
+ description: z.ZodOptional<z.ZodString>;
132
+ }, z.core.$strict>;
91
133
  }, z.core.$strict>, z.ZodObject<{
92
134
  type: z.ZodLiteral<"doubleTap">;
93
135
  point: z.ZodArray<z.ZodNumber>;
@@ -103,6 +145,10 @@ export declare const PhoneDecisionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
103
145
  }, z.core.$strict>, z.ZodObject<{
104
146
  type: z.ZodLiteral<"typeText">;
105
147
  text: z.ZodString;
148
+ mode: z.ZodOptional<z.ZodEnum<{
149
+ replace: "replace";
150
+ insert: "insert";
151
+ }>>;
106
152
  }, z.core.$strict>, z.ZodObject<{
107
153
  type: z.ZodEnum<{
108
154
  home: "home";
@@ -140,6 +186,17 @@ export type PhoneObservation = {
140
186
  frame: Buffer;
141
187
  elements: PhoneElement[];
142
188
  };
189
+ export declare const PhoneCompletionSchema: z.ZodObject<{
190
+ appPackage: z.ZodOptional<z.ZodString>;
191
+ textAny: z.ZodOptional<z.ZodArray<z.ZodString>>;
192
+ textAll: z.ZodOptional<z.ZodArray<z.ZodString>>;
193
+ field: z.ZodOptional<z.ZodObject<{
194
+ resourceId: z.ZodString;
195
+ value: z.ZodString;
196
+ }, z.core.$strict>>;
197
+ requireChange: z.ZodOptional<z.ZodBoolean>;
198
+ }, z.core.$strict>;
199
+ export type PhoneCompletion = z.infer<typeof PhoneCompletionSchema>;
143
200
  export declare const PhoneInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
144
201
  op: z.ZodLiteral<"discover">;
145
202
  }, z.core.$strict>, z.ZodObject<{
@@ -150,6 +207,7 @@ export declare const PhoneInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
150
207
  control: "control";
151
208
  }>;
152
209
  appPackage: z.ZodOptional<z.ZodString>;
210
+ settingsPage: z.ZodOptional<z.ZodLiteral<"about-phone">>;
153
211
  }, z.core.$strict>, z.ZodObject<{
154
212
  op: z.ZodLiteral<"observe">;
155
213
  }, z.core.$strict>, z.ZodObject<{
@@ -160,6 +218,16 @@ export declare const PhoneInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
160
218
  goal: z.ZodString;
161
219
  scenario: z.ZodOptional<z.ZodLiteral<"settings-about">>;
162
220
  expectText: z.ZodOptional<z.ZodString>;
221
+ completion: z.ZodOptional<z.ZodObject<{
222
+ appPackage: z.ZodOptional<z.ZodString>;
223
+ textAny: z.ZodOptional<z.ZodArray<z.ZodString>>;
224
+ textAll: z.ZodOptional<z.ZodArray<z.ZodString>>;
225
+ field: z.ZodOptional<z.ZodObject<{
226
+ resourceId: z.ZodString;
227
+ value: z.ZodString;
228
+ }, z.core.$strict>>;
229
+ requireChange: z.ZodOptional<z.ZodBoolean>;
230
+ }, z.core.$strict>>;
163
231
  maxActions: z.ZodDefault<z.ZodNumber>;
164
232
  }, z.core.$strict>, z.ZodObject<{
165
233
  op: z.ZodEnum<{
@@ -204,6 +272,23 @@ export type PhoneReport = {
204
272
  controlEpoch?: number;
205
273
  handoff?: 'idle' | 'acquiring' | 'returning';
206
274
  currentAction?: PhoneAction['type'];
275
+ diagnostics?: {
276
+ stalePredictions: number;
277
+ protocolRepairs: number;
278
+ unchangedActions: number;
279
+ completionCorrections: number;
280
+ semanticActions?: number;
281
+ semanticRejections?: number;
282
+ plannedSubgoals?: number;
283
+ completedSubgoals?: number;
284
+ backReplans?: number;
285
+ focusReplans?: number;
286
+ focusRecoveries?: number;
287
+ resumedTextInputs?: number;
288
+ numericActions?: number;
289
+ numericConfirmedSteps?: number;
290
+ numericMismatches?: number;
291
+ };
207
292
  };
208
293
  export declare class PhoneError extends Error {
209
294
  readonly code: string;
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { z } from "zod";
3
3
  //#region src/phone/contracts.ts
4
- var PhoneProfileSchema, PhoneModelMetadataSchema, MOCK_PHONE_MODEL, MOCK_PHONE_GOAL, PhoneConfigSchema, PhoneDeviceSchema, Point, PhoneActionSchema, PhoneDecisionSchema, PhoneInputSchema, PhoneError;
4
+ var PhoneProfileSchema, PhoneModelMetadataSchema, MOCK_PHONE_MODEL, MOCK_PHONE_GOAL, PhoneConfigSchema, PhoneDeviceSchema, Point, PhoneElementSelectorSchema, PhoneActionSchema, PhoneDecisionSchema, PhoneCompletionSchema, PhoneInputSchema, PhoneError;
5
5
  var init_contracts = __esmMin((() => {
6
6
  PhoneProfileSchema = z.enum(["autoglm-phone-v1", "structured-phone-v1"]);
7
7
  PhoneModelMetadataSchema = z.object({ profile: PhoneProfileSchema }).strict();
@@ -10,6 +10,8 @@ var init_contracts = __esmMin((() => {
10
10
  PhoneConfigSchema = z.object({
11
11
  enabled: z.boolean().default(false),
12
12
  adbPath: z.string().min(1).optional(),
13
+ semanticControls: z.boolean().default(false),
14
+ hierarchicalPlanning: z.boolean().default(false),
13
15
  maxActionsPerSession: z.number().int().min(1).max(80).default(40),
14
16
  maxModelRequests: z.number().int().min(1).max(120).default(60),
15
17
  maxOperationDurationMs: z.number().int().min(1e3).max(9e5).default(3e5),
@@ -21,6 +23,7 @@ var init_contracts = __esmMin((() => {
21
23
  name: z.string().trim().min(1).max(100),
22
24
  enabled: z.boolean().default(true),
23
25
  appAccess: z.enum(["all", "selected"]).optional(),
26
+ textInput: z.enum(["auto", "manual"]).optional(),
24
27
  allowedApps: z.array(z.string().regex(/^[a-zA-Z][\w]*(?:\.[\w]+)+$/)).max(500).default([]),
25
28
  connection: z.object({
26
29
  kind: z.literal("aliyun-adb"),
@@ -31,6 +34,11 @@ var init_contracts = __esmMin((() => {
31
34
  revision: z.number().int().positive()
32
35
  }).strict();
33
36
  Point = z.array(z.number().finite().min(0).max(1e3)).length(2);
37
+ PhoneElementSelectorSchema = z.object({
38
+ resourceId: z.string().min(1).max(300).optional(),
39
+ text: z.string().min(1).max(4e3).optional(),
40
+ description: z.string().min(1).max(1e3).optional()
41
+ }).strict().refine((value) => Boolean(value.resourceId || value.text || value.description), "Specify an exact native element identity");
34
42
  PhoneActionSchema = z.discriminatedUnion("type", [
35
43
  z.object({
36
44
  type: z.literal("launch"),
@@ -40,6 +48,11 @@ var init_contracts = __esmMin((() => {
40
48
  type: z.literal("tap"),
41
49
  point: Point
42
50
  }).strict(),
51
+ z.object({
52
+ type: z.literal("tapElement"),
53
+ frameId: z.string().min(1).max(200),
54
+ selector: PhoneElementSelectorSchema
55
+ }).strict(),
43
56
  z.object({
44
57
  type: z.literal("doubleTap"),
45
58
  point: Point
@@ -57,7 +70,8 @@ var init_contracts = __esmMin((() => {
57
70
  }).strict(),
58
71
  z.object({
59
72
  type: z.literal("typeText"),
60
- text: z.string().min(1).max(4e3)
73
+ text: z.string().min(1).max(4e3),
74
+ mode: z.enum(["insert", "replace"]).optional()
61
75
  }).strict(),
62
76
  z.object({ type: z.enum(["back", "home"]) }).strict(),
63
77
  z.object({
@@ -79,20 +93,32 @@ var init_contracts = __esmMin((() => {
79
93
  reason: z.string().max(1e3)
80
94
  }).strict()
81
95
  ]);
96
+ PhoneCompletionSchema = z.object({
97
+ appPackage: z.string().regex(/^[a-zA-Z][\w]*(?:\.[\w]+)+$/).optional(),
98
+ textAny: z.array(z.string().min(1).max(200)).min(1).max(20).optional(),
99
+ textAll: z.array(z.string().min(1).max(200)).min(1).max(20).optional(),
100
+ field: z.object({
101
+ resourceId: z.string().min(1).max(300),
102
+ value: z.string().max(4e3)
103
+ }).strict().optional(),
104
+ requireChange: z.boolean().optional()
105
+ }).strict().refine((value) => value.appPackage || value.textAny || value.textAll || value.field, "Specify at least one UI condition");
82
106
  PhoneInputSchema = z.discriminatedUnion("op", [
83
107
  z.object({ op: z.literal("discover") }).strict(),
84
108
  z.object({
85
109
  op: z.literal("open"),
86
110
  deviceId: z.string().uuid().optional(),
87
111
  mode: z.enum(["observe", "control"]),
88
- appPackage: z.string().regex(/^[a-zA-Z][\w]*(?:\.[\w]+)+$/).optional()
89
- }).strict(),
112
+ appPackage: z.string().regex(/^[a-zA-Z][\w]*(?:\.[\w]+)+$/).optional(),
113
+ settingsPage: z.literal("about-phone").optional()
114
+ }).strict().refine((input) => !input.settingsPage || input.mode === "control" && input.appPackage === "com.android.settings", "About phone requires authorized Settings control"),
90
115
  z.object({ op: z.literal("observe") }).strict(),
91
116
  z.object({
92
117
  op: z.enum(["run", "step"]),
93
118
  goal: z.string().trim().min(1).max(2e3),
94
119
  scenario: z.literal("settings-about").optional(),
95
120
  expectText: z.string().min(1).max(200).optional(),
121
+ completion: PhoneCompletionSchema.optional(),
96
122
  maxActions: z.number().int().min(1).max(12).default(6)
97
123
  }).strict(),
98
124
  z.object({ op: z.enum([
@@ -113,4 +139,4 @@ var init_contracts = __esmMin((() => {
113
139
  }));
114
140
  //#endregion
115
141
  init_contracts();
116
- export { MOCK_PHONE_GOAL, MOCK_PHONE_MODEL, PhoneActionSchema, PhoneConfigSchema, PhoneDecisionSchema, PhoneDeviceSchema, PhoneError, PhoneInputSchema, PhoneModelMetadataSchema, PhoneProfileSchema, init_contracts };
142
+ export { MOCK_PHONE_GOAL, MOCK_PHONE_MODEL, PhoneActionSchema, PhoneCompletionSchema, PhoneConfigSchema, PhoneDecisionSchema, PhoneDeviceSchema, PhoneElementSelectorSchema, PhoneError, PhoneInputSchema, PhoneModelMetadataSchema, PhoneProfileSchema, init_contracts };