@xopcai/xopc 0.0.415 → 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 (251) 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-CJFwitU2.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/{app-management-settings-panel-DgwqNi5i.js → app-management-settings-panel-D4-n1uBg.js} +1 -1
  13. package/dist/gateway/static/root/assets/{appearance-settings-C0wJfFyz.js → appearance-settings-Cgn4eNsX.js} +1 -1
  14. package/dist/gateway/static/root/assets/apps-page-BOYzD7Zz.js +1 -0
  15. package/dist/gateway/static/root/assets/{archive-plugin-Ch7wolHE.js → archive-plugin-B4btCsiV.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automations-page-DK7AU79v.js → automations-page-yb1EL_3N.js} +1 -1
  17. package/dist/gateway/static/root/assets/automations-workspace-J7LJ4RuV.js +8 -0
  18. package/dist/gateway/static/root/assets/{binary-plugins-B4HcHYsC.js → binary-plugins-DQT9e258.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-BQAWEZF-.js → block-editor-B50rU9tL.js} +4 -4
  20. package/dist/gateway/static/root/assets/browser-automations-page-BiQz6lJA.js +3 -0
  21. package/dist/gateway/static/root/assets/browser-settings-page-W9kuxBbE.js +3 -0
  22. package/dist/gateway/static/root/assets/capabilities-page-iXe87MdG.js +2 -0
  23. package/dist/gateway/static/root/assets/capabilities-settings-panel-CRLSXe7Z.js +8 -0
  24. package/dist/gateway/static/root/assets/{capability-header-actions-D4Yq35fD.js → capability-header-actions-BMnbzHms.js} +1 -1
  25. package/dist/gateway/static/root/assets/channels-CrRJkOKX.js +1 -0
  26. package/dist/gateway/static/root/assets/{chat-terminal-dock-zdMySdMm.js → chat-terminal-dock-Bd3af4gL.js} +2 -2
  27. package/dist/gateway/static/root/assets/{computer-settings-page-C5Z6Jr0p.js → computer-settings-page-DXfqy7xh.js} +1 -1
  28. package/dist/gateway/static/root/assets/{connector-service-page-Cxus0qrZ.js → connector-service-page-B-cw0CPU.js} +1 -1
  29. package/dist/gateway/static/root/assets/connectors-page-DbFxc0Fd.js +1 -0
  30. package/dist/gateway/static/root/assets/{date-picker-DuyyD6jz.js → date-picker-CqzXevH6.js} +1 -1
  31. package/dist/gateway/static/root/assets/{dependency-picker-BZN72rrk.js → dependency-picker-pgT4Gyaf.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-settings-BcyP7Z6v.js → desktop-pet-settings-Dy_-i2L8.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-BtvTIDCi.js → desktop-pet-zICeqw9c.js} +1 -1
  34. package/dist/gateway/static/root/assets/device-pairing-wizard-ByGbxqkg.js +1 -0
  35. package/dist/gateway/static/root/assets/{directory-picker-path-field-DOusKz-O.js → directory-picker-path-field-C-aQ7qoM.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-debug-page-Bt4FwsFu.js → extension-debug-page-2NwpYkS5.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-0vsxX3FB.js → extension-page-y9J0z7_Q.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-settings-page-5Pt5_ELc.js → extension-settings-page-BtowusUh.js} +1 -1
  39. package/dist/gateway/static/root/assets/gateway-realtime-C52ghnBK.js +1 -0
  40. package/dist/gateway/static/root/assets/gateway-settings-BYSKzUMR.js +1 -0
  41. package/dist/gateway/static/root/assets/highlight-code-Cz6eeDH5.js +1 -0
  42. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-Cbk7eMlg.js → highlighted-body-KQOG7T2V-BiAa8HKC.js} +1 -1
  43. package/dist/gateway/static/root/assets/home-page-Cd1BjYHj.js +2 -0
  44. package/dist/gateway/static/root/assets/{image-generation-api-CAS8QVla.js → image-generation-api-gBFro48x.js} +1 -1
  45. package/dist/gateway/static/root/assets/{imports-page-BCLBYzV1.js → imports-page-BZQpXgjj.js} +1 -1
  46. package/dist/gateway/static/root/assets/index-Cy16gQST.css +1 -0
  47. package/dist/gateway/static/root/assets/index-DRyGCING.js +710 -0
  48. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CM_kt5XN.js → keyboard-shortcuts-settings-CYunR34k.js} +1 -1
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-B_Ac1lly.js +1 -0
  50. package/dist/gateway/static/root/assets/{local-apps-page-BTSOChhk.js → local-apps-page-w-J5bY02.js} +1 -1
  51. package/dist/gateway/static/root/assets/logs-page-Dnjvvx2i.js +2 -0
  52. package/dist/gateway/static/root/assets/management-settings-w1EDwgLW.js +1 -0
  53. package/dist/gateway/static/root/assets/{media-plugins-DYQDjCVQ.js → media-plugins-CIx1koXw.js} +1 -1
  54. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-DISkHmEC.js +1 -0
  55. package/dist/gateway/static/root/assets/note-detail-panel-CNkxMTFU.js +5 -0
  56. package/dist/gateway/static/root/assets/note-image-lightbox-D5GH2wuC.js +1 -0
  57. package/dist/gateway/static/root/assets/notes-page-DZgKqFBG.js +8 -0
  58. package/dist/gateway/static/root/assets/{page-context-capture-button-DVn_dU83.js → page-context-capture-button-DusR2Itk.js} +1 -1
  59. package/dist/gateway/static/root/assets/personal-page-CR5JFkQ9.js +1 -0
  60. package/dist/gateway/static/root/assets/{personal-settings-panel-C16Iqe7X.js → personal-settings-panel-B7undvlr.js} +1 -1
  61. package/dist/gateway/static/root/assets/phone-model-picker-fWDltRUJ.js +1 -0
  62. package/dist/gateway/static/root/assets/phone-settings-page-CsOirAiy.js +1 -0
  63. package/dist/gateway/static/root/assets/plugin-details-dialog-BOBVIB3j.js +1 -0
  64. package/dist/gateway/static/root/assets/{preview-open-alternatives-RlHk76TI.js → preview-open-alternatives-CMxjsKSw.js} +1 -1
  65. package/dist/gateway/static/root/assets/{product-open-page-Dh-HqLrE.js → product-open-page-CrlyJx5M.js} +1 -1
  66. package/dist/gateway/static/root/assets/{product-preview-content-c3K-4DWc.js → product-preview-content-B-Jhzi7W.js} +1 -1
  67. package/dist/gateway/static/root/assets/project-detail-page-DoYUbtcI.js +7 -0
  68. package/dist/gateway/static/root/assets/{projects-page-B8HAt9sD.js → projects-page-xGQd9oAZ.js} +1 -1
  69. package/dist/gateway/static/root/assets/refresh-cw-BRlGaq2w.js +1 -0
  70. package/dist/gateway/static/root/assets/remote-access-hub-Gs0Xkws9.js +1 -0
  71. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bwg7U7TR.js +1 -0
  72. package/dist/gateway/static/root/assets/{schema-form-CXO1B1k4.js → schema-form-ByzTNR_C.js} +1 -1
  73. package/dist/gateway/static/root/assets/{session-manager-CA1NkTR_.js → session-manager-B_h0jlLb.js} +1 -1
  74. package/dist/gateway/static/root/assets/sessions-page-XzK1ftbR.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-D_8Mvnog.js +1 -0
  76. package/dist/gateway/static/root/assets/{settings-form-section-BQxKmbbJ.js → settings-form-section-Brgd8IOV.js} +1 -1
  77. package/dist/gateway/static/root/assets/{settings-page-DvVMpKiA.js → settings-page-B6Mv02eg.js} +1 -1
  78. package/dist/gateway/static/root/assets/settings-page-header-BWyxJKOG.js +1 -0
  79. package/dist/gateway/static/root/assets/{settings-page-layout-B20AfmFG.js → settings-page-layout-DLHcS-0T.js} +1 -1
  80. package/dist/gateway/static/root/assets/setup-status-panel-DSCj5yis.js +1 -0
  81. package/dist/gateway/static/root/assets/{share-preview-page-XgZk8Oa1.js → share-preview-page-DF8Of0aZ.js} +1 -1
  82. package/dist/gateway/static/root/assets/shares-settings-DXNPe4Tl.js +1 -0
  83. package/dist/gateway/static/root/assets/{skill-api-CV-WT2hj.js → skill-api-CKCDCHLq.js} +1 -1
  84. package/dist/gateway/static/root/assets/skill-reload-api-BH0WF6Br.js +1 -0
  85. package/dist/gateway/static/root/assets/skills-page-DFWMVRW4.js +2 -0
  86. package/dist/gateway/static/root/assets/system-settings-panel-DB-ttubV.js +1 -0
  87. package/dist/gateway/static/root/assets/task-detail-page-BJY7c8wb.js +2 -0
  88. package/dist/gateway/static/root/assets/{task-result-evidence-D-gGKNX9.js → task-result-evidence-B-vt1BgK.js} +1 -1
  89. package/dist/gateway/static/root/assets/{tracing-settings-page-CQw3G-FB.js → tracing-settings-page-Dt51Z_ws.js} +1 -1
  90. package/dist/gateway/static/root/assets/{tunnel-api-B2HnCi0U.js → tunnel-api-Dok3t7Qe.js} +1 -1
  91. package/dist/gateway/static/root/assets/usage-page-lJym5G7F.js +1 -0
  92. package/dist/gateway/static/root/assets/{use-autosave-Dc0nwUpX.js → use-autosave-D4EMIB-V.js} +1 -1
  93. package/dist/gateway/static/root/assets/user-model-page-BXdNkITp.js +2 -0
  94. package/dist/gateway/static/root/assets/{voice-api-key-field-BSWXZkGa.js → voice-api-key-field-CO3KuanA.js} +1 -1
  95. package/dist/gateway/static/root/assets/{work-discovery-overlay-H3cdwq3l.js → work-discovery-overlay-BJRtgQM3.js} +1 -1
  96. package/dist/gateway/static/root/assets/wrench-DFb4r8bH.js +1 -0
  97. package/dist/gateway/static/root/assets/xopc-cloud-account-card-CS-_GxHV.js +1 -0
  98. package/dist/gateway/static/root/browser-setup-test.html +5 -0
  99. package/dist/gateway/static/root/browser-setup-test.js +7 -0
  100. package/dist/gateway/static/root/index.html +7 -4
  101. package/dist/package.js +1 -1
  102. package/dist/packages/gateway-contract/src/browser-setup.js +6 -0
  103. package/dist/packages/gateway-contract/src/index.js +4 -0
  104. package/dist/packages/gateway-contract/src/phone-setup.js +6 -0
  105. package/dist/packages/realtime-client/src/index.js +1 -0
  106. package/dist/packages/realtime-protocol/src/index.js +1 -0
  107. package/dist/src/agent/agent-manager.d.ts +4 -0
  108. package/dist/src/agent/agent-manager.js +12 -1
  109. package/dist/src/agent/embedded/tool-search-extension.js +14 -1
  110. package/dist/src/agent/service.d.ts +1 -0
  111. package/dist/src/agent/service.js +5 -0
  112. package/dist/src/agent/service.types.d.ts +2 -0
  113. package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
  114. package/dist/src/agent/tool-manuals/phone.js +1 -1
  115. package/dist/src/agent/tool-manuals/xopc-configuration.d.ts +2 -0
  116. package/dist/src/agent/tool-manuals/xopc-configuration.js +25 -0
  117. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +2 -0
  118. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +6 -2
  119. package/dist/src/agent/tools/factory.d.ts +3 -0
  120. package/dist/src/agent/tools/factory.js +11 -1
  121. package/dist/src/agent/tools/phone-use-tool.d.ts +1 -0
  122. package/dist/src/agent/tools/phone-use-tool.js +9 -1
  123. package/dist/src/agent/tools/tool-manual-tool.d.ts +1 -1
  124. package/dist/src/agent/tools/tool-manual-tool.js +3 -1
  125. package/dist/src/agent/tools/toolExposure.js +3 -0
  126. package/dist/src/agent/tools/xopc-use-tool.d.ts +4 -2
  127. package/dist/src/agent/tools/xopc-use-tool.js +40 -2
  128. package/dist/src/browser/drivers/browser-driver.d.ts +2 -2
  129. package/dist/src/browser/drivers/extension-driver.d.ts +2 -2
  130. package/dist/src/browser/drivers/extension-driver.js +6 -3
  131. package/dist/src/browser/providers/browser-ext-install.js +2 -1
  132. package/dist/src/browser/runtime/browser-runtime.d.ts +4 -1
  133. package/dist/src/browser/runtime/browser-runtime.js +29 -17
  134. package/dist/src/browser/setup/repository.d.ts +5 -0
  135. package/dist/src/browser/setup/repository.js +42 -0
  136. package/dist/src/browser/setup/service.d.ts +152 -0
  137. package/dist/src/browser/setup/service.js +404 -0
  138. package/dist/src/browser/setup/types.d.ts +38 -0
  139. package/dist/src/browser/setup/types.js +1 -0
  140. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  141. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  142. package/dist/src/config/schema.d.ts +2 -0
  143. package/dist/src/connectors/connected-source-understanding.js +1 -1
  144. package/dist/src/connectors/learning-coordinator.js +1 -1
  145. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  146. package/dist/src/gateway/hono/routes/browser-setup.d.ts +3 -0
  147. package/dist/src/gateway/hono/routes/browser-setup.js +114 -0
  148. package/dist/src/gateway/hono/routes/browser.d.ts +2 -1
  149. package/dist/src/gateway/hono/routes/browser.js +1 -1
  150. package/dist/src/gateway/hono/routes/connectors.js +7 -7
  151. package/dist/src/gateway/hono/routes/home.js +1 -1
  152. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  153. package/dist/src/gateway/hono/routes/phone-dependencies.js +1 -1
  154. package/dist/src/gateway/hono/routes/phone-setup.d.ts +7 -0
  155. package/dist/src/gateway/hono/routes/phone-setup.js +162 -0
  156. package/dist/src/gateway/hono/routes/phone.js +3 -7
  157. package/dist/src/gateway/hono/routes/public-gateway.js +3 -1
  158. package/dist/src/gateway/provider-model-setup.js +1 -1
  159. package/dist/src/gateway/service/config-coordinator.d.ts +2 -0
  160. package/dist/src/gateway/service.d.ts +5 -0
  161. package/dist/src/gateway/service.js +57 -12
  162. package/dist/src/gateway/xopc-cloud-capability-setup.js +7 -1
  163. package/dist/src/home-intelligence/host.js +2 -2
  164. package/dist/src/infra/update-restart.js +1 -1
  165. package/dist/src/phone/adb-driver.d.ts +2 -0
  166. package/dist/src/phone/adb-driver.js +35 -17
  167. package/dist/src/phone/contracts.d.ts +40 -0
  168. package/dist/src/phone/contracts.js +17 -4
  169. package/dist/src/phone/model-adapter.d.ts +59 -2
  170. package/dist/src/phone/model-adapter.js +107 -13
  171. package/dist/src/phone/numeric-entry.d.ts +31 -0
  172. package/dist/src/phone/numeric-entry.js +126 -0
  173. package/dist/src/phone/planning.d.ts +27 -0
  174. package/dist/src/phone/planning.js +79 -0
  175. package/dist/src/phone/recovery.d.ts +37 -0
  176. package/dist/src/phone/recovery.js +81 -0
  177. package/dist/src/phone/repository.d.ts +1 -0
  178. package/dist/src/phone/repository.js +3 -0
  179. package/dist/src/phone/runtime.js +232 -54
  180. package/dist/src/phone/semantic-controls.d.ts +13 -0
  181. package/dist/src/phone/semantic-controls.js +76 -0
  182. package/dist/src/phone/setup/service.d.ts +148 -0
  183. package/dist/src/phone/setup/service.js +251 -0
  184. package/dist/src/providers/presentation.js +2 -2
  185. package/dist/src/providers/xopc-cloud-model-source.js +6 -2
  186. package/dist/src/realtime/runtime.js +1 -1
  187. package/dist/src/storage/sqlite/schema.d.ts +2 -2
  188. package/dist/src/storage/sqlite/schema.js +7 -7
  189. package/dist/src/storage/sqlite/schema.sql +10 -0
  190. package/dist/src/storage/sqlite/upgrades/260_browser_setup.sql +9 -0
  191. package/dist/src/user-context/sources/index.js +1 -1
  192. package/dist/src/work-discovery/service.js +2 -2
  193. package/package.json +6 -6
  194. package/skills/tools/configure-xopc/SKILL.md +47 -0
  195. package/skills/tools/configure-xopc/references/browser/acceptance.md +31 -0
  196. package/skills/tools/configure-xopc/references/browser/chrome-extension.md +19 -0
  197. package/skills/tools/configure-xopc/references/browser/overview.md +22 -0
  198. package/skills/tools/configure-xopc/references/browser/permissions.md +25 -0
  199. package/skills/tools/configure-xopc/references/browser/troubleshooting.md +24 -0
  200. package/skills/tools/configure-xopc/references/phone/acceptance.md +25 -0
  201. package/skills/tools/configure-xopc/references/phone/aliyun.md +29 -0
  202. package/skills/tools/configure-xopc/references/phone/dependencies.md +18 -0
  203. package/skills/tools/configure-xopc/references/phone/local.md +19 -0
  204. package/skills/tools/configure-xopc/references/phone/models.md +18 -0
  205. package/skills/tools/configure-xopc/references/phone/overview.md +30 -0
  206. package/skills/tools/configure-xopc/references/phone/troubleshooting.md +24 -0
  207. package/skills/tools/configure-xopc/references/scene-index.md +12 -0
  208. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DclyJr1N.js +0 -1
  209. package/dist/gateway/static/root/assets/agents-jhErNtzi.js +0 -77
  210. package/dist/gateway/static/root/assets/apps-page-C0LcnI4h.js +0 -1
  211. package/dist/gateway/static/root/assets/automations-workspace-CBxiV34x.js +0 -8
  212. package/dist/gateway/static/root/assets/browser-automations-page-vJIrTxdi.js +0 -3
  213. package/dist/gateway/static/root/assets/browser-settings-page-in5Roh_E.js +0 -3
  214. package/dist/gateway/static/root/assets/capabilities-page-CiGx8wpQ.js +0 -2
  215. package/dist/gateway/static/root/assets/capabilities-settings-panel-a8kqjzQu.js +0 -8
  216. package/dist/gateway/static/root/assets/channels-C_CxcjKT.js +0 -1
  217. package/dist/gateway/static/root/assets/connectors-page-DCBO2CxK.js +0 -1
  218. package/dist/gateway/static/root/assets/device-pairing-wizard-Ctbgr50F.js +0 -1
  219. package/dist/gateway/static/root/assets/gateway-realtime-DkWCHVzI.js +0 -1
  220. package/dist/gateway/static/root/assets/gateway-settings-BsVOcmV5.js +0 -1
  221. package/dist/gateway/static/root/assets/highlight-code-C8eS9949.js +0 -1
  222. package/dist/gateway/static/root/assets/home-page-BZDZnmyc.js +0 -2
  223. package/dist/gateway/static/root/assets/index-Bys6njTY.js +0 -710
  224. package/dist/gateway/static/root/assets/index-Vsf0bj5e.css +0 -1
  225. package/dist/gateway/static/root/assets/local-app-workbench-page-Dk87jtcc.js +0 -1
  226. package/dist/gateway/static/root/assets/logs-page-D3gVdm8S.js +0 -2
  227. package/dist/gateway/static/root/assets/management-settings-BQNYFE4J.js +0 -1
  228. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-ChweJKTv.js +0 -1
  229. package/dist/gateway/static/root/assets/note-detail-panel-CYKwUCte.js +0 -5
  230. package/dist/gateway/static/root/assets/note-image-lightbox-BTSZb9ZT.js +0 -1
  231. package/dist/gateway/static/root/assets/notes-page-CJ5nhWfL.js +0 -8
  232. package/dist/gateway/static/root/assets/personal-page-DcW14lqn.js +0 -1
  233. package/dist/gateway/static/root/assets/phone-dependencies-card-D3l9uPFM.js +0 -1
  234. package/dist/gateway/static/root/assets/phone-model-picker-DOv38vBn.js +0 -1
  235. package/dist/gateway/static/root/assets/phone-settings-page-DUHp1q_9.js +0 -1
  236. package/dist/gateway/static/root/assets/plugin-details-dialog-BpfgDlVa.js +0 -1
  237. package/dist/gateway/static/root/assets/project-detail-page-GD8TxKad.js +0 -7
  238. package/dist/gateway/static/root/assets/remote-access-hub-D3el7lHK.js +0 -1
  239. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Dbskk6RG.js +0 -1
  240. package/dist/gateway/static/root/assets/sessions-page-07liaSHH.js +0 -1
  241. package/dist/gateway/static/root/assets/settings-advanced-gate-BGjU8rfN.js +0 -1
  242. package/dist/gateway/static/root/assets/settings-page-header-CYpuTXUW.js +0 -1
  243. package/dist/gateway/static/root/assets/setup-status-panel-DKo_VTx-.js +0 -1
  244. package/dist/gateway/static/root/assets/shares-settings-BODFqK8k.js +0 -1
  245. package/dist/gateway/static/root/assets/skill-reload-api-Ce6OUk2C.js +0 -1
  246. package/dist/gateway/static/root/assets/skills-page-B7ehOIML.js +0 -2
  247. package/dist/gateway/static/root/assets/system-settings-panel-CxJkZRT4.js +0 -1
  248. package/dist/gateway/static/root/assets/task-detail-page-CxRR0QuW.js +0 -2
  249. package/dist/gateway/static/root/assets/usage-page-uUEkO38r.js +0 -1
  250. package/dist/gateway/static/root/assets/user-model-page-ICUutbKL.js +0 -2
  251. package/dist/gateway/static/root/assets/xopc-cloud-account-card-CvT_W6YS.js +0 -1
@@ -0,0 +1,114 @@
1
+ import { getSessionMetadata, init_session_read_repository } from "../../../storage/sqlite/session-read-repository.js";
2
+ import { readBrowserSetup } from "../../../browser/setup/repository.js";
3
+ import { getGatewayPrincipal } from "../../security/gateway-principal.js";
4
+ import { isLocalOwnerRequest } from "./browser.js";
5
+ import { z } from "zod";
6
+ //#region src/gateway/hono/routes/browser-setup.ts
7
+ init_session_read_repository();
8
+ const requestSchema = z.strictObject({
9
+ conversationId: z.string().uuid(),
10
+ setupId: z.string().uuid().optional(),
11
+ action: z.enum([
12
+ "inspect",
13
+ "start",
14
+ "get",
15
+ "approve",
16
+ "prepare",
17
+ "recheck",
18
+ "open",
19
+ "begin_verification",
20
+ "cancel",
21
+ "release"
22
+ ]),
23
+ expectedRevision: z.number().int().positive().optional(),
24
+ endpointId: z.string().min(1).max(500).optional(),
25
+ open: z.enum([
26
+ "chrome",
27
+ "folder",
28
+ "both"
29
+ ]).optional()
30
+ });
31
+ function registerBrowserSetupRoutes(app, deps) {
32
+ app.post("/api/browser/setup", deps.strictRateLimitMiddleware, async (c) => {
33
+ if (!isLocalOwnerRequest(c, deps.service)) return c.json({
34
+ ok: false,
35
+ error: "LOCAL_OWNER_REQUIRED: Open setup on the Gateway computer. Remote pairing is available in Device access."
36
+ }, 403);
37
+ const parsed = requestSchema.safeParse(await c.req.json().catch(() => null));
38
+ if (!parsed.success) return c.json({
39
+ ok: false,
40
+ error: "Invalid setup request"
41
+ }, 400);
42
+ const body = parsed.data;
43
+ const metadata = getSessionMetadata(body.conversationId);
44
+ if (!metadata) return c.json({
45
+ ok: false,
46
+ error: "Conversation not found"
47
+ }, 404);
48
+ const service = deps.service.browserSetup;
49
+ const context = {
50
+ conversationId: body.conversationId,
51
+ agentId: metadata.agentId
52
+ };
53
+ try {
54
+ if (body.action === "inspect" || body.action === "start") return c.json({
55
+ ok: true,
56
+ payload: await service.command(body.action, {}, context)
57
+ });
58
+ if (!body.setupId) return c.json({
59
+ ok: false,
60
+ error: "setupId is required"
61
+ }, 400);
62
+ const setup = service.owned(body.setupId, context.conversationId, context.agentId);
63
+ if (body.action === "get" || body.action === "recheck" || body.action === "cancel") return c.json({
64
+ ok: true,
65
+ payload: await service.command(body.action, { setupId: setup.id }, context)
66
+ });
67
+ const principalId = getGatewayPrincipal(c).principalId;
68
+ if (body.action === "approve") {
69
+ if (!body.expectedRevision) throw new Error("expectedRevision is required");
70
+ return c.json({
71
+ ok: true,
72
+ payload: service.view(service.approve(setup, principalId, body.expectedRevision))
73
+ });
74
+ }
75
+ if (body.action === "release") return c.json({
76
+ ok: true,
77
+ payload: service.view(await service.release(setup))
78
+ });
79
+ if (setup.approvedBy !== principalId) return c.json({
80
+ ok: false,
81
+ error: "Plan must be approved by this owner"
82
+ }, 403);
83
+ if (body.action === "prepare") return c.json({
84
+ ok: true,
85
+ payload: service.view(await service.prepare(setup))
86
+ });
87
+ if (body.action === "open") {
88
+ await service.open(setup, body.open ?? "both");
89
+ return c.json({
90
+ ok: true,
91
+ payload: service.view(readBrowserSetup(setup.id))
92
+ });
93
+ }
94
+ if (body.action === "begin_verification") {
95
+ if (!body.endpointId || !body.expectedRevision) throw new Error("Select an endpoint and provide expectedRevision");
96
+ return c.json({
97
+ ok: true,
98
+ payload: service.view(service.begin(setup, body.endpointId, new URL(c.req.url).origin, body.expectedRevision))
99
+ });
100
+ }
101
+ return c.json({
102
+ ok: false,
103
+ error: "Unsupported action"
104
+ }, 400);
105
+ } catch (error) {
106
+ return c.json({
107
+ ok: false,
108
+ error: error instanceof Error ? error.message : "Browser setup failed"
109
+ }, 409);
110
+ }
111
+ });
112
+ }
113
+ //#endregion
114
+ export { registerBrowserSetupRoutes };
@@ -1,3 +1,4 @@
1
- import type { Hono } from 'hono';
1
+ import type { Context, Hono } from 'hono';
2
2
  import type { AuthenticatedRouteDeps } from './deps.js';
3
+ export declare function isLocalOwnerRequest(c: Context, service: AuthenticatedRouteDeps['service']): boolean;
3
4
  export declare function registerBrowserRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void;
@@ -348,4 +348,4 @@ function registerBrowserRoutes(authenticated, deps) {
348
348
  });
349
349
  }
350
350
  //#endregion
351
- export { registerBrowserRoutes };
351
+ export { isLocalOwnerRequest, registerBrowserRoutes };
@@ -21,17 +21,17 @@ import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
21
21
  import { getConnectorInstance, getInstalledConnectorDefinition, listConnectorInstances } from "../../../connectors/instances.js";
22
22
  import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
23
23
  import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
24
- import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
25
- import { testConnectorInstance } from "../../../connectors/health.js";
26
- import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
27
- import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
28
- import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
29
- import { getGatewayPrincipal } from "../../security/gateway-principal.js";
30
- import { composioLogoResponse } from "../../../connectors/composio-logo.js";
31
24
  import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
32
25
  import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
26
+ import { composioLogoResponse } from "../../../connectors/composio-logo.js";
27
+ import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
28
+ import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
29
+ import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
30
+ import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
31
+ import { testConnectorInstance } from "../../../connectors/health.js";
33
32
  import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
34
33
  import { projectComposioConnectionStatus } from "../../../connectors/runtime-status.js";
34
+ import { getGatewayPrincipal } from "../../security/gateway-principal.js";
35
35
  import { registerCliConnectorRoutes } from "./cli-connectors.js";
36
36
  //#region src/gateway/hono/routes/connectors.ts
37
37
  init_logger();
@@ -4,8 +4,8 @@ import { acknowledgeHomeAttention } from "../../../storage/sqlite/home-attention
4
4
  import { decideConnectorApproval } from "../../../storage/sqlite/connector-repository.js";
5
5
  import { init_sqlite } from "../../../storage/sqlite/index.js";
6
6
  import { HomeQueryService, buildHomeWorkbench, decisionFromTask } from "../../../tasks/home-query-service.js";
7
- import { HomeOpportunityActionError, HomeOpportunityNotFoundError } from "../../../home-intelligence/application-service.js";
8
7
  import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
8
+ import { HomeOpportunityActionError, HomeOpportunityNotFoundError } from "../../../home-intelligence/application-service.js";
9
9
  //#region src/gateway/hono/routes/home.ts
10
10
  init_src();
11
11
  init_sqlite();
@@ -163,6 +163,14 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
163
163
  return { register: registerBrowserAutomationRoutes };
164
164
  }
165
165
  },
166
+ {
167
+ id: "browser-setup",
168
+ match: (path) => path === "/api/browser/setup",
169
+ load: async () => {
170
+ const { registerBrowserSetupRoutes } = await import("./browser-setup.js");
171
+ return { register: registerBrowserSetupRoutes };
172
+ }
173
+ },
166
174
  {
167
175
  id: "browser",
168
176
  match: (path) => startsWithAny(path, ["/api/browser"]),
@@ -2,8 +2,8 @@ import { init_paths_state, resolveStateDir } from "../../../config/paths-state.j
2
2
  import { resolveAdbPath } from "../../../phone/adb-driver.js";
3
3
  import { getPhoneRuntime } from "../../../phone/runtime.js";
4
4
  import { RuntimeError } from "../../../runtime-tools/errors.js";
5
- import { getGatewayPrincipal } from "../../security/gateway-principal.js";
6
5
  import { PhoneDependencyManager, probePhoneAdb } from "../../../runtime-tools/phone-dependencies.js";
6
+ import { getGatewayPrincipal } from "../../security/gateway-principal.js";
7
7
  import { z } from "zod";
8
8
  import { Hono } from "hono";
9
9
  import { bodyLimit } from "hono/body-limit";
@@ -0,0 +1,7 @@
1
+ import type { Hono } from 'hono';
2
+ import { PhoneSetupService } from '../../../phone/setup/service.js';
3
+ import type { GatewayService } from '../../service.js';
4
+ import type { AuthenticatedRouteDeps } from './deps.js';
5
+ export declare function createPhoneSetupService(service: GatewayService): PhoneSetupService;
6
+ /** Registered inside the existing Phone admin route group. */
7
+ export declare function registerPhoneSetupRoutes(app: Hono, deps: AuthenticatedRouteDeps): void;
@@ -0,0 +1,162 @@
1
+ import { resolveStateDir } from "../../../config/paths-state.js";
2
+ import { getSessionMetadata, init_session_read_repository } from "../../../storage/sqlite/session-read-repository.js";
3
+ import { init_paths } from "../../../config/paths.js";
4
+ import { resolveEffectiveAgentConfigForAgent } from "../../../config/agent-profile.js";
5
+ import { getModelRegistry, init_model_registry } from "../../../providers/model-registry.js";
6
+ import { init_providers, isProviderConfiguredSync } from "../../../providers/index.js";
7
+ import { phoneAllowsApp } from "../../../phone/app-access.js";
8
+ import { phoneModelProfile } from "../../../phone/model-adapter.js";
9
+ import { getPhoneRuntime } from "../../../phone/runtime.js";
10
+ import { PhoneSetupService } from "../../../phone/setup/service.js";
11
+ import { PhoneDependencyManager } from "../../../runtime-tools/phone-dependencies.js";
12
+ import { createHash } from "node:crypto";
13
+ import { z } from "zod";
14
+ //#region src/gateway/hono/routes/phone-setup.ts
15
+ init_paths();
16
+ init_model_registry();
17
+ init_providers();
18
+ init_session_read_repository();
19
+ function createPhoneSetupService(service) {
20
+ const runtime = getPhoneRuntime();
21
+ return new PhoneSetupService({
22
+ runtime,
23
+ revision: (context, deviceId) => {
24
+ const agent = resolveEffectiveAgentConfigForAgent(context.agentId).config;
25
+ const device = runtime.repository.list().find((device) => device.id === deviceId);
26
+ const model = agent.models.phoneUse?.primary ? getModelRegistry().resolve(agent.models.phoneUse.primary) : void 0;
27
+ return createHash("sha256").update(JSON.stringify([
28
+ service.currentConfig.phone,
29
+ agent.models.phoneUse,
30
+ agent.tools.phone_use,
31
+ agent.toolAllowlist,
32
+ device,
33
+ model && [
34
+ model.api,
35
+ model.baseUrl,
36
+ model.input,
37
+ phoneModelProfile(model)
38
+ ]
39
+ ])).digest("hex");
40
+ },
41
+ leaseActive: (deviceId) => {
42
+ const device = runtime.repository.list().find((device) => device.id === deviceId);
43
+ return device ? runtime.repository.leaseActive(device.serial) : false;
44
+ },
45
+ connected: async (deviceId, signal) => {
46
+ const device = runtime.repository.get(deviceId);
47
+ return (await (await runtime.driverFor(device, service.currentConfig)).discover(signal)).some((found) => found.serial === device.serial && found.state === "device");
48
+ },
49
+ inspect: async (context, source) => {
50
+ const config = service.currentConfig;
51
+ const resolved = resolveEffectiveAgentConfigForAgent(context.agentId);
52
+ const agent = resolved.config;
53
+ const ref = agent.models.phoneUse?.primary;
54
+ const model = ref ? getModelRegistry().resolve(ref) : void 0;
55
+ const dependencies = await new PhoneDependencyManager({
56
+ stateDir: resolveStateDir(),
57
+ config: config.runtimeTools,
58
+ adbPath: config.phone.adbPath
59
+ }).status();
60
+ let localDiscovery = [];
61
+ let diagnostic;
62
+ if (source === "local" && dependencies.some((item) => item.kind === "adb" && item.state === "ready")) try {
63
+ localDiscovery = (await runtime.discover(config)).map(({ name, state, emulator }) => ({
64
+ name,
65
+ state,
66
+ emulator
67
+ }));
68
+ } catch {
69
+ diagnostic = "PHONE_SETUP_DISCOVERY_FAILED";
70
+ }
71
+ return {
72
+ enabled: config.phone.enabled,
73
+ toolAllowed: agent.tools.phone_use?.mode !== "deny" && (!agent.toolAllowlist || agent.toolAllowlist.includes("phone_use")),
74
+ model: {
75
+ ref,
76
+ source: resolved.sources["models.phoneUse.primary"],
77
+ chatRef: agent.models.chat?.primary,
78
+ supported: Boolean(model && phoneModelProfile(model)),
79
+ configured: Boolean(model && isProviderConfiguredSync(model.provider))
80
+ },
81
+ dependencies: dependencies.map(({ kind, state, version, canInstall }) => ({
82
+ kind,
83
+ state,
84
+ version,
85
+ canInstall
86
+ })),
87
+ devices: runtime.repository.list().map((device) => ({
88
+ id: device.id,
89
+ name: device.name,
90
+ source: device.connection ? "aliyun" : "local",
91
+ enabled: device.enabled,
92
+ settingsAllowed: phoneAllowsApp(device, "com.android.settings")
93
+ })),
94
+ localDiscovery,
95
+ diagnostic
96
+ };
97
+ }
98
+ });
99
+ }
100
+ /** Registered inside the existing Phone admin route group. */
101
+ function registerPhoneSetupRoutes(app, deps) {
102
+ const schema = z.strictObject({
103
+ conversationId: z.string().uuid(),
104
+ setupId: z.string().uuid().optional(),
105
+ action: z.enum([
106
+ "inspect",
107
+ "start",
108
+ "get",
109
+ "recheck",
110
+ "source",
111
+ "begin_verification",
112
+ "release",
113
+ "cancel"
114
+ ]),
115
+ source: z.enum(["local", "aliyun"]).optional(),
116
+ deviceId: z.string().uuid().optional(),
117
+ expectedRevision: z.number().int().positive().optional()
118
+ });
119
+ app.post("/api/phone/setup", deps.strictRateLimitMiddleware, async (c) => {
120
+ const parsed = schema.safeParse(await c.req.json().catch(() => null));
121
+ if (!parsed.success) return c.json({
122
+ ok: false,
123
+ error: "Invalid phone setup request"
124
+ }, 400);
125
+ const body = parsed.data;
126
+ const metadata = getSessionMetadata(body.conversationId);
127
+ if (!metadata) return c.json({
128
+ ok: false,
129
+ error: "Conversation not found"
130
+ }, 404);
131
+ const context = {
132
+ conversationId: body.conversationId,
133
+ agentId: metadata.agentId
134
+ };
135
+ const setup = deps.service.phoneSetup;
136
+ try {
137
+ let payload;
138
+ if (body.action === "source") {
139
+ if (!body.setupId || !body.source || !body.expectedRevision) throw new Error("Choose a source and refresh current progress");
140
+ payload = await setup.source(context, body.setupId, body.source, body.expectedRevision);
141
+ } else if (body.action === "begin_verification") {
142
+ if (!body.setupId || !body.deviceId || !body.expectedRevision) throw new Error("Select a phone and approve the current test");
143
+ payload = await setup.begin(context, body.setupId, body.deviceId, body.expectedRevision, c.req.raw.signal);
144
+ } else if (body.action === "release") {
145
+ if (!body.setupId) throw new Error("setupId is required");
146
+ payload = await setup.release(context, body.setupId);
147
+ } else payload = await setup.command(body.action, { setupId: body.setupId }, context);
148
+ c.header("Cache-Control", "no-store");
149
+ return c.json({
150
+ ok: true,
151
+ payload
152
+ });
153
+ } catch (error) {
154
+ return c.json({
155
+ ok: false,
156
+ error: error instanceof Error ? error.message : "Phone setup failed"
157
+ }, 409);
158
+ }
159
+ });
160
+ }
161
+ //#endregion
162
+ export { createPhoneSetupService, registerPhoneSetupRoutes };
@@ -7,6 +7,7 @@ import { init_providers, isProviderConfiguredSync } from "../../../providers/ind
7
7
  import { normalizePhoneAppAccess, phoneAppAccess } from "../../../phone/app-access.js";
8
8
  import { createPhoneModel, phoneModelProfile } from "../../../phone/model-adapter.js";
9
9
  import { getPhoneRuntime, phoneExecutionContext } from "../../../phone/runtime.js";
10
+ import { registerPhoneSetupRoutes } from "./phone-setup.js";
10
11
  import { getGatewayPrincipal } from "../../security/gateway-principal.js";
11
12
  import { randomUUID } from "node:crypto";
12
13
  import { z } from "zod";
@@ -53,6 +54,7 @@ function registerPhoneRoutes(parent, deps, runtime = getPhoneRuntime()) {
53
54
  }, 403);
54
55
  return next();
55
56
  });
57
+ registerPhoneSetupRoutes(app, deps);
56
58
  app.use("/api/phone/cloud/aliyun/*", bodyLimit({
57
59
  maxSize: 24 * 1024,
58
60
  onError: (c) => c.json({
@@ -217,13 +219,7 @@ function registerPhoneRoutes(parent, deps, runtime = getPhoneRuntime()) {
217
219
  });
218
220
  app.get("/api/phone/models", (c) => c.json({
219
221
  ok: true,
220
- payload: { models: [{
221
- id: MOCK_PHONE_MODEL,
222
- name: "Mock · Android Settings test",
223
- profile: "mock-settings-about",
224
- mock: true,
225
- configured: true
226
- }, ...getModelRegistry().getAll().flatMap((model) => {
222
+ payload: { models: [...getModelRegistry().getAll().flatMap((model) => {
227
223
  const profile = phoneModelProfile(model);
228
224
  return profile ? [{
229
225
  id: `${model.provider}/${model.id}`,
@@ -2,14 +2,16 @@ import { PACKAGE_VERSION, init_package_version } from "../../../package-version.
2
2
  import { claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, releaseConnectorWebhookDelivery } from "../../../storage/sqlite/connector-repository.js";
3
3
  import { init_sqlite } from "../../../storage/sqlite/index.js";
4
4
  import { resolveAutomationWebhookSecret } from "../../../automations/webhook-secrets.js";
5
- import { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, normalizeComposioTriggerPayload, verifyComposioWebhook } from "../../../connectors/composio-triggers.js";
6
5
  import { composioLogoResponse } from "../../../connectors/composio-logo.js";
6
+ import { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, normalizeComposioTriggerPayload, verifyComposioWebhook } from "../../../connectors/composio-triggers.js";
7
7
  import { serveStaticFile } from "../lib/static-ui.js";
8
8
  import { createHash, timingSafeEqual } from "node:crypto";
9
9
  //#region src/gateway/hono/routes/public-gateway.ts
10
10
  init_package_version();
11
11
  init_sqlite();
12
12
  const PUBLIC_UI_ROOT_ASSETS = [
13
+ "browser-setup-test.html",
14
+ "browser-setup-test.js",
13
15
  "apple-touch-icon.png",
14
16
  "favicon-16x16.png",
15
17
  "favicon-32x32.png",
@@ -19,7 +19,7 @@ async function loadProviderSetupSnapshot(provider, config) {
19
19
  }
20
20
  function readProviderSetupSnapshot(provider, configured, config) {
21
21
  const languageProvider = getAllProviders().includes(provider);
22
- const models = (languageProvider ? getModelsByProvider(provider) : []).filter((model) => !("computerUse" in model && model.computerUse));
22
+ const models = (languageProvider ? getModelsByProvider(provider) : []).filter((model) => !("computerUse" in model && model.computerUse) && !("phoneUse" in model && model.phoneUse));
23
23
  const recommended = new Set((languageProvider ? getRecommendedModelsForProvider(provider) : []).map((model) => model.ref));
24
24
  const source = getModelCatalogStore().getSource(provider);
25
25
  const image = getImageGenerationProvider(provider);
@@ -325,6 +325,8 @@ export declare class GatewayConfigCoordinator {
325
325
  };
326
326
  phone: {
327
327
  enabled: boolean;
328
+ semanticControls: boolean;
329
+ hierarchicalPlanning: boolean;
328
330
  maxActionsPerSession: number;
329
331
  maxModelRequests: number;
330
332
  maxOperationDurationMs: number;
@@ -1,3 +1,4 @@
1
+ import { BrowserSetupService } from '../browser/setup/service.js';
1
2
  import type { ClarificationSubmission } from '@xopcai/gateway-contract';
2
3
  import { PhoneStreamGateway } from '../phone/stream-gateway.js';
3
4
  import { WorkDiscoveryService } from '../work-discovery/service.js';
@@ -60,6 +61,10 @@ export declare class GatewayService {
60
61
  readonly voiceRealtime: VoiceRealtimeRuntime;
61
62
  getConfig(): Config;
62
63
  getModelCatalogSync(): ModelCatalogSyncService;
64
+ private _phoneSetup?;
65
+ get phoneSetup(): import("../phone/setup/service.js").PhoneSetupService;
66
+ private _browserSetup?;
67
+ get browserSetup(): BrowserSetupService;
63
68
  get browserAutomations(): BrowserAutomationService;
64
69
  private stopGatewayUpdateCheck;
65
70
  /** When set (e.g. by `GatewayServer`), `triggerGatewayProcessRestart` can stop HTTP then exit. */
@@ -29,7 +29,7 @@ import { init_session_key, resolveConversationId, sanitizeSegment } from "../rou
29
29
  import { listKnowledgeItems } from "../knowledge-memory/repository.js";
30
30
  import "../knowledge-memory/index.js";
31
31
  import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
32
- import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
32
+ import { resolveEffectiveAgentConfigForAgent, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
33
33
  import { prewarmModelRegistry } from "../providers/model-registry.js";
34
34
  import { init_providers, providers_exports } from "../providers/index.js";
35
35
  import { AI_USAGE_RETENTION_MS, markStaleAiUsageEventsUnknown, pruneAiUsageEvents } from "../storage/sqlite/ai-usage-repository.js";
@@ -95,15 +95,20 @@ import { DiscussionSealer } from "../discussions/sealer.js";
95
95
  import "../discussions/index.js";
96
96
  import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
97
97
  import "../endpoint-tools/index.js";
98
- import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
99
- import { HomeAdviceGenerator } from "../home-intelligence/generator.js";
100
- import { HomeIntelligenceHost } from "../home-intelligence/host.js";
101
- import { HomeSnapshotBuilder } from "../home-intelligence/snapshot.js";
98
+ import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
99
+ import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
100
+ import "../knowledge/index.js";
101
+ import { PersonalReplyComposer } from "../personal-agent/reply-composer.js";
102
+ import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
103
+ import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
104
+ import { startConnectorSupervisor } from "../connectors/supervisor.js";
102
105
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
103
106
  import { prepareAutomationAgentSession } from "./automation-agent-session.js";
104
107
  import { stopTailscaleExposure } from "./tailscale-lifecycle.js";
105
108
  import { getGatewayFileSpaceService } from "./file-space-service.js";
106
109
  import { reconcileHomeIntelligenceAutomation } from "./home-intelligence-automation-reconciler.js";
110
+ import { createPhoneSetupService } from "./hono/routes/phone-setup.js";
111
+ import { BrowserSetupService } from "../browser/setup/service.js";
107
112
  import { PhoneStreamGateway } from "../phone/stream-gateway.js";
108
113
  import { PersonalProactivityService } from "../personal-agent/proactivity/service.js";
109
114
  import { reconcilePersonalProactivityAutomation } from "../personal-agent/proactivity/automation.js";
@@ -112,8 +117,6 @@ import { buildFileAgentContext } from "../agent/source-context/file-context.js";
112
117
  import { buildSessionAgentContext } from "../agent/source-context/session-context.js";
113
118
  import { buildBrowserTabAgentContext } from "../agent/source-context/browser-tab.js";
114
119
  import { WorkDiscoveryService } from "../work-discovery/service.js";
115
- import { PersonalReplyComposer } from "../personal-agent/reply-composer.js";
116
- import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
117
120
  import { buildVoiceMemoryContext } from "../voice/realtime/memory-context.js";
118
121
  import { buildVoicePersonaContext } from "../voice/realtime/persona-context.js";
119
122
  import { voiceMemoryBudget, voicePersonaBudget } from "../voice/realtime/conversation-context.js";
@@ -151,10 +154,6 @@ import { DurableVoiceAgentBroker } from "../voice/realtime/agentBroker.js";
151
154
  import { reconcileMemoryMaintenanceAutomations } from "./memory-maintenance-automation-reconciler.js";
152
155
  import { GatewayReadiness } from "./startup-readiness.js";
153
156
  import { createGatewayStartupTrace } from "./startup-trace.js";
154
- import { startConnectorSupervisor } from "../connectors/supervisor.js";
155
- import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
156
- import "../knowledge/index.js";
157
- import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
158
157
  import { TaskCollaborationDelivery } from "../tasks/task-collaboration-delivery.js";
159
158
  import { TaskMainUpdateExhaustedError } from "../tasks/task-main-update-retry.js";
160
159
  import { TaskMainUpdateDelivery } from "../tasks/task-main-update-delivery.js";
@@ -162,8 +161,11 @@ import { allowsPersonalTaskNotification, personalReplyNotification, personalRunD
162
161
  import { TaskMainUpdateDecisionService } from "../tasks/task-main-update-decision-service.js";
163
162
  import { selectTaskMainUpdateAttempt, submitAndConfirmTaskMainUpdate } from "../tasks/task-main-update-input.js";
164
163
  import { checkAppContextAccess, prepareAppContext } from "./service/app-context-access.js";
165
- import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
166
164
  import { applyAutomaticVoiceLanguage, inferProductLanguageFromEnvironment, initializeVoiceDefaults } from "../voice/language-profile.js";
165
+ import { HomeAdviceGenerator } from "../home-intelligence/generator.js";
166
+ import { HomeIntelligenceHost } from "../home-intelligence/host.js";
167
+ import { HomeSnapshotBuilder } from "../home-intelligence/snapshot.js";
168
+ import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
167
169
  import crypto from "node:crypto";
168
170
  //#region src/gateway/service.ts
169
171
  init_session_repository();
@@ -303,6 +305,47 @@ var GatewayService = class {
303
305
  getModelCatalogSync() {
304
306
  return this.modelCatalogSync;
305
307
  }
308
+ _phoneSetup;
309
+ get phoneSetup() {
310
+ return this._phoneSetup ??= createPhoneSetupService(this);
311
+ }
312
+ _browserSetup;
313
+ get browserSetup() {
314
+ return this._browserSetup ??= new BrowserSetupService({
315
+ getConfig: () => this.currentConfig,
316
+ saveConfig: (next, expected) => this.saveConfig(next, expected),
317
+ endpoints: this.endpointTools,
318
+ canSwitchDriver: (conversationId) => !this._agentService?.hasBrowserSessions() && !this.agentRunner.listActiveRuns().some((run) => run.conversationId !== conversationId),
319
+ policyRevision: (agentId) => {
320
+ const effective = resolveEffectiveAgentConfigForAgent(agentId).config;
321
+ return crypto.createHash("sha256").update(JSON.stringify({
322
+ policy: effective.tools.browser_use,
323
+ allowlist: effective.toolAllowlist
324
+ })).digest("hex");
325
+ },
326
+ canUseBrowser: (agentId) => {
327
+ const effective = resolveEffectiveAgentConfigForAgent(agentId).config;
328
+ return effective.tools.browser_use?.mode !== "deny" && (!effective.toolAllowlist || effective.toolAllowlist.includes("browser_use"));
329
+ },
330
+ release: async (endpointId, sessionId) => (await new RealtimeExtensionBrowserProvider(this.endpointTools).send({
331
+ action: "close",
332
+ sessionId,
333
+ target: {
334
+ kind: "endpoint",
335
+ endpointId
336
+ }
337
+ })).result,
338
+ doctor: async () => (await import("../browser/providers/browser-ext-install.js")).browserExtDoctor(),
339
+ prepare: async () => {
340
+ const installer = await import("../browser/providers/browser-ext-install.js");
341
+ return {
342
+ files: await installer.ensureBrowserExtensionArtifacts(),
343
+ nativeHost: await installer.installBrowserNativeMessagingHost({ configPath: this.getHealth().configPath })
344
+ };
345
+ },
346
+ open: async (action) => (await import("../browser/providers/browser-ext-install.js")).openBrowserExtensionInstallUi({ action })
347
+ });
348
+ }
306
349
  get browserAutomations() {
307
350
  if (!this.browserAutomationService) this.browserAutomationService = createRuntimeBrowserAutomationService({
308
351
  getConfig: () => this.config,
@@ -682,6 +725,8 @@ var GatewayService = class {
682
725
  endpointTools: this.endpointTools,
683
726
  getAutomationService: () => this.automationService,
684
727
  getBrowserAutomationService: () => this.browserAutomations,
728
+ getBrowserSetupService: () => this.browserSetup,
729
+ getPhoneSetupService: () => this.phoneSetup,
685
730
  emitBrowserEvent: (type, payload) => this.emit(type, payload),
686
731
  getNotesService: () => this.notesService,
687
732
  getProjectService: () => this.projects,
@@ -7,6 +7,7 @@ import { init_model_policy, isComputerModel, isDedicatedComputerProfile } from "
7
7
  import { voiceSupportsMode } from "../../packages/realtime-protocol/src/voice-catalog.js";
8
8
  import { init_voice } from "../../packages/realtime-protocol/src/voice.js";
9
9
  import { getModelCatalogStore, init_model_catalog_store } from "../providers/model-catalog-store.js";
10
+ import { phoneModelProfile } from "../phone/model-adapter.js";
10
11
  import { compareCatalogModels } from "../providers/model-catalog-ranking.js";
11
12
  import { prepareUpdateGlobalDefaults } from "./global-defaults-admin.js";
12
13
  //#region src/gateway/xopc-cloud-capability-setup.ts
@@ -17,7 +18,7 @@ init_agent_config();
17
18
  init_repository();
18
19
  init_model_catalog_store();
19
20
  function supportsCapability(model, capability) {
20
- if (model.availability !== "available" || isDedicatedComputerProfile(model.computerUse?.profile)) return false;
21
+ if (model.availability !== "available" || model.phoneUse || isDedicatedComputerProfile(model.computerUse?.profile)) return false;
21
22
  if (capability === "chat") return model.kind === "language" && (model.operations.includes("chat.completions") || model.operations.includes("responses"));
22
23
  if (capability === "vision") return model.kind === "language" && model.input.includes("image");
23
24
  if (capability === "image-generation") return model.kind === "image" && model.operations.includes("images.generate");
@@ -100,6 +101,11 @@ function completeXopcCloudModelRoutes(models, source) {
100
101
  api: source.api
101
102
  })).sort((left, right) => compareCatalogModels(left, right))[0];
102
103
  if (computer) next.computerUse ??= route(computer);
104
+ const phone = source.models.filter((model) => model.availability === "available" && phoneModelProfile({
105
+ ...model,
106
+ api: source.api
107
+ })).sort((left, right) => compareCatalogModels(left, right, "phone"))[0];
108
+ if (phone) next.phoneUse ??= route(phone);
103
109
  return next;
104
110
  }
105
111
  /** Build one atomic config update for the managed XOPC Cloud chat and media capabilities. */
@@ -1,10 +1,10 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { HomeAdviceBudgetExceededError, isHomeProseLocalized } from "./generator.js";
3
4
  import { homePatternKey } from "./strategy.js";
5
+ import { HomeAdvicePolicy } from "./policy.js";
4
6
  import { HomeIntelligenceRepository } from "./repository.js";
5
7
  import { HomeOpportunityApplicationService } from "./application-service.js";
6
- import { HomeAdvicePolicy } from "./policy.js";
7
- import { HomeAdviceBudgetExceededError, isHomeProseLocalized } from "./generator.js";
8
8
  import { buildHomeOpportunityNotification } from "./notification.js";
9
9
  import { createHash } from "node:crypto";
10
10
  //#region src/home-intelligence/host.ts
@@ -2,8 +2,8 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { init_paths, resolveConfigPath } from "../config/paths.js";
4
4
  import { loadConfig } from "../config/loader.js";
5
- import { resolveGatewayService } from "../daemon/service.js";
6
5
  import { isRestartEnabled } from "../config/commands.flags.js";
6
+ import { resolveGatewayService } from "../daemon/service.js";
7
7
  import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "./restart.js";
8
8
  import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
9
9
  import { refreshGatewayServiceAfterUpdate } from "./update-service-refresh.js";
@@ -14,6 +14,7 @@ export interface PhoneDriver {
14
14
  execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
15
15
  settleMs: number;
16
16
  resetTask?: boolean;
17
+ settingsPage?: 'about-phone';
17
18
  }): Promise<void>;
18
19
  }
19
20
  /** Read only the active native editor, never historical input-method entries. */
@@ -38,5 +39,6 @@ export declare class AdbPhoneDriver implements PhoneDriver {
38
39
  execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
39
40
  settleMs: number;
40
41
  resetTask?: boolean;
42
+ settingsPage?: 'about-phone';
41
43
  }): Promise<void>;
42
44
  }