@xopcai/xopc 0.0.412 → 0.0.414

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BrGZdh5N.js → agent-avatar-dicebear-ClobpdW3.js} +1 -1
  4. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-mf0jgEPE.js +1 -0
  5. package/dist/gateway/static/root/assets/agents-CKhZ4UYQ.js +77 -0
  6. package/dist/gateway/static/root/assets/{agents-admin-api-uGDeJR1f.js → agents-admin-api-CeBkHnl8.js} +1 -1
  7. package/dist/gateway/static/root/assets/app-management-settings-panel-CLunLNGp.js +1 -0
  8. package/dist/gateway/static/root/assets/app-window-DXFNqt_0.js +1 -0
  9. package/dist/gateway/static/root/assets/appearance-settings-DBEgoE9g.js +1 -0
  10. package/dist/gateway/static/root/assets/apps-page-BZ_MaQJf.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-DAmsio91.js → archive-plugin-JElK4Goq.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-page-BVutrwON.js → automations-page-CZ0UqwyU.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-workspace-CHUDHNVL.js +8 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-41QCRAxz.js → binary-plugins-CXFawow6.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-BQ8AA-Ot.js → block-editor-BoduwSYI.js} +30 -30
  16. package/dist/gateway/static/root/assets/{browser-automation-inputs-D4-vQc4g.js → browser-automation-inputs-D1pDgMJu.js} +1 -1
  17. package/dist/gateway/static/root/assets/browser-automations-page-DStDm9y1.js +3 -0
  18. package/dist/gateway/static/root/assets/browser-settings-page-6I4oetKt.js +3 -0
  19. package/dist/gateway/static/root/assets/capabilities-Bpeh6E22.js +1 -0
  20. package/dist/gateway/static/root/assets/capabilities-page-C-EecWbS.js +2 -0
  21. package/dist/gateway/static/root/assets/capabilities-settings-panel-BQoCPk3x.js +8 -0
  22. package/dist/gateway/static/root/assets/{capability-header-actions-CDgI-YZF.js → capability-header-actions-BasrAWA0.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-BKf_-Mdt.js +1 -0
  24. package/dist/gateway/static/root/assets/{chat-terminal-dock-CUkCx_9x.js → chat-terminal-dock-CwQbzcZ_.js} +2 -2
  25. package/dist/gateway/static/root/assets/chevron-down-ccbiQQz_.js +1 -0
  26. package/dist/gateway/static/root/assets/computer-settings-page-DNWeJKfF.js +1 -0
  27. package/dist/gateway/static/root/assets/{connector-service-page-49mgdRET.js → connector-service-page-CxHgC5RM.js} +1 -1
  28. package/dist/gateway/static/root/assets/connectors-page-CUBg8spT.js +1 -0
  29. package/dist/gateway/static/root/assets/{date-picker-BpBjADAk.js → date-picker-CXxLbLJb.js} +1 -1
  30. package/dist/gateway/static/root/assets/dependency-picker-DVuWMrSj.js +1 -0
  31. package/dist/gateway/static/root/assets/desktop-pet-KbVLtAlO.js +1 -0
  32. package/dist/gateway/static/root/assets/desktop-pet-settings-BDlg9g4s.js +1 -0
  33. package/dist/gateway/static/root/assets/device-pairing-wizard-PmP_vGem.js +1 -0
  34. package/dist/gateway/static/root/assets/{directory-picker-path-field-DwXqp_iu.js → directory-picker-path-field-a7xEodzo.js} +1 -1
  35. package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +1 -0
  36. package/dist/gateway/static/root/assets/extension-debug-page-CHelH5u_.js +1 -0
  37. package/dist/gateway/static/root/assets/{extension-page-Bri62YsN.js → extension-page-CrVHmS9-.js} +1 -1
  38. package/dist/gateway/static/root/assets/extension-settings-page-CiMybi0r.js +1 -0
  39. package/dist/gateway/static/root/assets/eye-CABVeTq0.js +1 -0
  40. package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +1 -0
  41. package/dist/gateway/static/root/assets/{gateway-config-swr-BVqYVaGy.js → gateway-config-swr-DF_HV6NP.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-realtime-CY1LBGBS.js → gateway-realtime-DMAzNlm-.js} +1 -1
  43. package/dist/gateway/static/root/assets/gateway-realtime-store-CoIgC1Al.js +1 -0
  44. package/dist/gateway/static/root/assets/gateway-settings-DnrQ28E2.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-CPKGkr6D.js → gateway-startup-retry-B91CBTzO.js} +1 -1
  46. package/dist/gateway/static/root/assets/highlight-code-AMjU04kR.js +1 -0
  47. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-Ci1QpkBn.js → highlighted-body-KQOG7T2V-8ACAVktj.js} +1 -1
  48. package/dist/gateway/static/root/assets/home-page-pTwVME-g.js +2 -0
  49. package/dist/gateway/static/root/assets/{image-generation-api-N5MYXlxr.js → image-generation-api-CVBaWmrV.js} +1 -1
  50. package/dist/gateway/static/root/assets/imports-page-C5IP3e6d.js +1 -0
  51. package/dist/gateway/static/root/assets/index-BLL0wKRZ.css +1 -0
  52. package/dist/gateway/static/root/assets/index-ygkHNYyo.js +710 -0
  53. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BhU6VYvd.js +1 -0
  54. package/dist/gateway/static/root/assets/local-app-workbench-page-Cwl6EvuX.js +1 -0
  55. package/dist/gateway/static/root/assets/{local-apps-page-BjzaB1ls.js → local-apps-page-DcP1Bdlk.js} +1 -1
  56. package/dist/gateway/static/root/assets/{local-session-drafts-BCaC-1rH.js → local-session-drafts-DvmwiLUx.js} +1 -1
  57. package/dist/gateway/static/root/assets/{locale-store-DAgpZxAS.js → locale-store-JogcXC4J.js} +1 -1
  58. package/dist/gateway/static/root/assets/logs-page-CS3hcTOq.js +2 -0
  59. package/dist/gateway/static/root/assets/management-settings-DC-Y_-GP.js +1 -0
  60. package/dist/gateway/static/root/assets/{media-plugins-8mlDAjD6.js → media-plugins-BnPpcJ2J.js} +1 -1
  61. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-vckgHpON.js +1 -0
  62. package/dist/gateway/static/root/assets/{messages-DMXSIJUO.js → messages-RzwPiQNL.js} +2 -2
  63. package/dist/gateway/static/root/assets/note-detail-panel-C7u4dxEk.js +5 -0
  64. package/dist/gateway/static/root/assets/note-image-lightbox-jvqYtySx.js +1 -0
  65. package/dist/gateway/static/root/assets/notes-page-Bs7F5Hpf.js +8 -0
  66. package/dist/gateway/static/root/assets/page-context-capture-button-DO_yhXS1.js +1 -0
  67. package/dist/gateway/static/root/assets/personal-page-BexL2-PQ.js +1 -0
  68. package/dist/gateway/static/root/assets/personal-settings-panel-BKA4fbYH.js +1 -0
  69. package/dist/gateway/static/root/assets/phone-dependencies-card-ChFtdFhA.js +1 -0
  70. package/dist/gateway/static/root/assets/phone-model-picker-CZoIAQ1j.js +1 -0
  71. package/dist/gateway/static/root/assets/phone-settings-page-DRyK0nHH.js +1 -0
  72. package/dist/gateway/static/root/assets/plugin-details-dialog-B-N61jJH.js +1 -0
  73. package/dist/gateway/static/root/assets/{preview-open-alternatives-n6Shdp3u.js → preview-open-alternatives-FGqN-mQx.js} +1 -1
  74. package/dist/gateway/static/root/assets/{product-open-page-BPF5rRTI.js → product-open-page-CwnHLfdL.js} +1 -1
  75. package/dist/gateway/static/root/assets/{product-preview-content-BOsGPNbw.js → product-preview-content-BD6k5hF9.js} +1 -1
  76. package/dist/gateway/static/root/assets/project-detail-page-DtKmFBml.js +7 -0
  77. package/dist/gateway/static/root/assets/projects-page-CFZIz9mc.js +1 -0
  78. package/dist/gateway/static/root/assets/{registry-api-B6kqbuw8.js → registry-api-BGqSwITi.js} +1 -1
  79. package/dist/gateway/static/root/assets/remote-access-hub-CWEc7W0m.js +1 -0
  80. package/dist/gateway/static/root/assets/runtime-tools-api-CSm5SpnR.js +5 -0
  81. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-q_oswAdV.js +1 -0
  82. package/dist/gateway/static/root/assets/{schema-form-cXD1BC02.js → schema-form-DoVn5jJK.js} +1 -1
  83. package/dist/gateway/static/root/assets/{session-api-D6-Vz8xK.js → session-api-DTxZyMta.js} +1 -1
  84. package/dist/gateway/static/root/assets/{session-manager-DWbcMHcj.js → session-manager-B2HDomj4.js} +1 -1
  85. package/dist/gateway/static/root/assets/sessions-page-BuPqNxpd.js +1 -0
  86. package/dist/gateway/static/root/assets/settings-advanced-gate-QTVDCGJG.js +1 -0
  87. package/dist/gateway/static/root/assets/{settings-form-section-BXeszXR7.js → settings-form-section-Ce8vVv-9.js} +1 -1
  88. package/dist/gateway/static/root/assets/{settings-page-CNmh4YmR.js → settings-page-DP2w3ejC.js} +1 -1
  89. package/dist/gateway/static/root/assets/{settings-page-layout-Dx5S-Msc.js → settings-page-header-CYpuTXUW.js} +1 -1
  90. package/dist/gateway/static/root/assets/settings-page-layout-B20AfmFG.js +1 -0
  91. package/dist/gateway/static/root/assets/setup-status-panel-ZmlE8jIE.js +1 -0
  92. package/dist/gateway/static/root/assets/{share-preview-page-CS9cOCgX.js → share-preview-page-DV4dKrmG.js} +1 -1
  93. package/dist/gateway/static/root/assets/shares-settings-CtNxWqW-.js +1 -0
  94. package/dist/gateway/static/root/assets/{skill-api-B5lDCuOH.js → skill-api-DTdejInH.js} +1 -1
  95. package/dist/gateway/static/root/assets/skill-reload-api-Egaf8PqZ.js +1 -0
  96. package/dist/gateway/static/root/assets/skills-page-C6FKxf4J.js +2 -0
  97. package/dist/gateway/static/root/assets/system-settings-panel-Baxkhov7.js +1 -0
  98. package/dist/gateway/static/root/assets/task-detail-page-C77-rpkt.js +2 -0
  99. package/dist/gateway/static/root/assets/{task-result-evidence-HJO1BlJm.js → task-result-evidence-DIGSC4qF.js} +1 -1
  100. package/dist/gateway/static/root/assets/tracing-settings-page-BaU8frtc.js +1 -0
  101. package/dist/gateway/static/root/assets/{tunnel-api-DXU94F2Y.js → tunnel-api-BCcOUsqu.js} +1 -1
  102. package/dist/gateway/static/root/assets/usage-page-BFeIbpbi.js +1 -0
  103. package/dist/gateway/static/root/assets/{use-autosave-B1z_TIBu.js → use-autosave-C1X47WVb.js} +1 -1
  104. package/dist/gateway/static/root/assets/user-model-page-u8zY5jea.js +2 -0
  105. package/dist/gateway/static/root/assets/{voice-api-key-field-HOLjEhh3.js → voice-api-key-field-Bk4DQMTw.js} +1 -1
  106. package/dist/gateway/static/root/assets/{voice-config-api-CPKzUb4R.js → voice-config-api-D7xsWrdh.js} +1 -1
  107. package/dist/gateway/static/root/assets/{work-discovery-overlay-C9RklDaR.js → work-discovery-overlay-B7_NmTB5.js} +1 -1
  108. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CWwGTBib.js → xopc-cloud-account-card-CJ_akAvc.js} +1 -1
  109. package/dist/gateway/static/root/index.html +19 -14
  110. package/dist/package.js +1 -1
  111. package/dist/packages/gateway-contract/src/capabilities.js +1 -0
  112. package/dist/src/agent/background-review/prompts.js +4 -3
  113. package/dist/src/agent/embedded/run-turn.js +1 -1
  114. package/dist/src/agent/embedded/xopc-stream-bridge.js +7 -3
  115. package/dist/src/agent/prompt/system-prompt.js +1 -1
  116. package/dist/src/agent/tool-manuals/index.js +7 -0
  117. package/dist/src/agent/tool-manuals/phone.d.ts +1 -0
  118. package/dist/src/agent/tool-manuals/phone.js +16 -0
  119. package/dist/src/agent/tools/factory.js +15 -0
  120. package/dist/src/agent/tools/knowledge-memory-tool.js +1 -1
  121. package/dist/src/agent/tools/personal-task-tool.d.ts +2 -1
  122. package/dist/src/agent/tools/personal-task-tool.js +43 -20
  123. package/dist/src/agent/tools/phone-use-tool.d.ts +8 -0
  124. package/dist/src/agent/tools/phone-use-tool.js +49 -0
  125. package/dist/src/agent/tools/session-recall-tool.js +2 -1
  126. package/dist/src/agent/tools/session-search-tool.js +11 -5
  127. package/dist/src/agent/tools/user-context-tool.js +1 -1
  128. package/dist/src/agent-config/index.js +2 -2
  129. package/dist/src/agent-config/resolver.js +5 -0
  130. package/dist/src/agent-config/schema.d.ts +24 -0
  131. package/dist/src/agent-config/schema.js +5 -2
  132. package/dist/src/cli/command-manifest.js +1 -1
  133. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  134. package/dist/src/cli/commands/extension.js +2 -2
  135. package/dist/src/cli/commands/runtime.js +32 -4
  136. package/dist/src/computer/diagnostics.d.ts +1 -1
  137. package/dist/src/config/models-json.d.ts +36 -0
  138. package/dist/src/config/models-json.js +9 -0
  139. package/dist/src/config/schema.d.ts +12 -0
  140. package/dist/src/config/schema.js +6 -2
  141. package/dist/src/extensions/update.js +1 -1
  142. package/dist/src/gateway/agent-builtin-tools.d.ts +7 -1
  143. package/dist/src/gateway/agent-builtin-tools.js +7 -0
  144. package/dist/src/gateway/global-defaults-admin.js +2 -0
  145. package/dist/src/gateway/hono/lib/config-payload.d.ts +8 -0
  146. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  147. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  148. package/dist/src/gateway/hono/routes/models.js +3 -0
  149. package/dist/src/gateway/hono/routes/phone-dependencies.d.ts +3 -0
  150. package/dist/src/gateway/hono/routes/phone-dependencies.js +137 -0
  151. package/dist/src/gateway/hono/routes/phone.d.ts +4 -0
  152. package/dist/src/gateway/hono/routes/phone.js +466 -0
  153. package/dist/src/gateway/hono/routes/runtime-tools.js +2 -0
  154. package/dist/src/gateway/server.js +1 -0
  155. package/dist/src/gateway/service/config-coordinator.d.ts +8 -0
  156. package/dist/src/gateway/service/config-coordinator.js +1 -1
  157. package/dist/src/gateway/service.d.ts +2 -0
  158. package/dist/src/gateway/service.js +12 -7
  159. package/dist/src/infra/update-runner.js +1 -1
  160. package/dist/src/knowledge-memory/repository.js +5 -0
  161. package/dist/src/memory-learning/forget-capture.js +12 -3
  162. package/dist/src/memory-learning/forgotten-history.d.ts +4 -0
  163. package/dist/src/memory-learning/forgotten-history.js +71 -4
  164. package/dist/src/memory-learning/work-capture.d.ts +1 -0
  165. package/dist/src/memory-learning/work-capture.js +28 -17
  166. package/dist/src/personal-agent/prompts.js +3 -2
  167. package/dist/src/phone/adb-driver.d.ts +38 -0
  168. package/dist/src/phone/adb-driver.js +392 -0
  169. package/dist/src/phone/app-access.d.ts +10 -0
  170. package/dist/src/phone/app-access.js +21 -0
  171. package/dist/src/phone/applications.d.ts +4 -0
  172. package/dist/src/phone/applications.js +49 -0
  173. package/dist/src/phone/cloud-adb.d.ts +35 -0
  174. package/dist/src/phone/cloud-adb.js +273 -0
  175. package/dist/src/phone/cloud-phones.d.ts +29 -0
  176. package/dist/src/phone/cloud-phones.js +142 -0
  177. package/dist/src/phone/cloud-scrcpy.d.ts +20 -0
  178. package/dist/src/phone/cloud-scrcpy.js +123 -0
  179. package/dist/src/phone/contracts.d.ts +212 -0
  180. package/dist/src/phone/contracts.js +116 -0
  181. package/dist/src/phone/interactive-session.d.ts +34 -0
  182. package/dist/src/phone/interactive-session.js +164 -0
  183. package/dist/src/phone/live-provider.d.ts +57 -0
  184. package/dist/src/phone/live-provider.js +18 -0
  185. package/dist/src/phone/live-state.d.ts +28 -0
  186. package/dist/src/phone/live-state.js +71 -0
  187. package/dist/src/phone/model-adapter.d.ts +31 -0
  188. package/dist/src/phone/model-adapter.js +350 -0
  189. package/dist/src/phone/repository.d.ts +19 -0
  190. package/dist/src/phone/repository.js +101 -0
  191. package/dist/src/phone/runtime.d.ts +88 -0
  192. package/dist/src/phone/runtime.js +924 -0
  193. package/dist/src/phone/scrcpy-assets.d.ts +4 -0
  194. package/dist/src/phone/scrcpy-assets.js +16 -0
  195. package/dist/src/phone/scrcpy.d.ts +59 -0
  196. package/dist/src/phone/scrcpy.js +337 -0
  197. package/dist/src/phone/stream-gateway.d.ts +26 -0
  198. package/dist/src/phone/stream-gateway.js +210 -0
  199. package/dist/src/process/phone-process.d.ts +4 -0
  200. package/dist/src/process/phone-process.js +38 -0
  201. package/dist/src/providers/extension-stream-bridge.js +8 -1
  202. package/dist/src/providers/model-call.js +6 -2
  203. package/dist/src/providers/model-catalog-persistence.js +3 -0
  204. package/dist/src/providers/model-catalog-types.d.ts +3 -0
  205. package/dist/src/providers/model-reference-auditor.js +5 -1
  206. package/dist/src/providers/model-registry.js +3 -0
  207. package/dist/src/runtime-tools/archive.d.ts +2 -2
  208. package/dist/src/runtime-tools/downloader.d.ts +2 -2
  209. package/dist/src/runtime-tools/errors.d.ts +3 -3
  210. package/dist/src/runtime-tools/phone-dependencies.d.ts +40 -0
  211. package/dist/src/runtime-tools/phone-dependencies.js +188 -0
  212. package/dist/src/runtime-tools/phone-dependency-catalog.d.ts +16 -0
  213. package/dist/src/runtime-tools/phone-dependency-catalog.js +51 -0
  214. package/dist/src/runtime-tools/types.d.ts +1 -0
  215. package/dist/src/storage/sqlite/context-extraction-repository.d.ts +1 -0
  216. package/dist/src/storage/sqlite/context-extraction-repository.js +12 -2
  217. package/dist/src/tasks/task-research-result.js +19 -2
  218. package/dist/src/usage/cloud-receipts.d.ts +5 -1
  219. package/dist/src/usage/cloud-receipts.js +10 -4
  220. package/dist/src/usage/cloud-wire.d.ts +37 -0
  221. package/dist/src/usage/cloud-wire.js +181 -0
  222. package/dist/src/usage/recorder.js +5 -4
  223. package/dist/src/user-model/capture/semantic.js +2 -2
  224. package/dist/src/voice/platform-catalog.d.ts +3 -0
  225. package/package.json +10 -5
  226. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BjZpom5V.js +0 -1
  227. package/dist/gateway/static/root/assets/agents-s3ws5Qi-.js +0 -77
  228. package/dist/gateway/static/root/assets/app-management-settings-panel-C6DHuX0L.js +0 -1
  229. package/dist/gateway/static/root/assets/appearance-settings-DYGY92Yr.js +0 -1
  230. package/dist/gateway/static/root/assets/apps-page-PpT_YMmD.js +0 -1
  231. package/dist/gateway/static/root/assets/automations-workspace-G6-9IYbR.js +0 -8
  232. package/dist/gateway/static/root/assets/browser-automations-page-o3jNFlCb.js +0 -3
  233. package/dist/gateway/static/root/assets/browser-settings-page-G0dVwiX4.js +0 -3
  234. package/dist/gateway/static/root/assets/capabilities-B9b5KCBb.js +0 -1
  235. package/dist/gateway/static/root/assets/capabilities-page-BZQanmZY.js +0 -2
  236. package/dist/gateway/static/root/assets/capabilities-settings-panel-D-YadSx_.js +0 -8
  237. package/dist/gateway/static/root/assets/channels-3WX3f0bR.js +0 -1
  238. package/dist/gateway/static/root/assets/computer-settings-page-CuZrL9gL.js +0 -1
  239. package/dist/gateway/static/root/assets/connectors-page-Bjj2wAeG.js +0 -1
  240. package/dist/gateway/static/root/assets/dependency-picker-R8kdHLr3.js +0 -1
  241. package/dist/gateway/static/root/assets/desktop-pet-BpiosRqb.js +0 -1
  242. package/dist/gateway/static/root/assets/desktop-pet-settings-9h6evrKB.js +0 -1
  243. package/dist/gateway/static/root/assets/device-pairing-wizard-CZ5lwiLE.js +0 -1
  244. package/dist/gateway/static/root/assets/extension-debug-page-Bj93A2Gn.js +0 -1
  245. package/dist/gateway/static/root/assets/extension-settings-page-BSo6vRhS.js +0 -1
  246. package/dist/gateway/static/root/assets/gateway-realtime-store-Dafw95ol.js +0 -1
  247. package/dist/gateway/static/root/assets/gateway-settings-DgEwWJwz.js +0 -1
  248. package/dist/gateway/static/root/assets/highlight-code-CSFBakwF.js +0 -1
  249. package/dist/gateway/static/root/assets/home-page-BKj-aPsL.js +0 -2
  250. package/dist/gateway/static/root/assets/imports-page-YfaRnpk1.js +0 -1
  251. package/dist/gateway/static/root/assets/index-CiDVRMmX.js +0 -710
  252. package/dist/gateway/static/root/assets/index-caRW34rg.css +0 -1
  253. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BTQcPOix.js +0 -1
  254. package/dist/gateway/static/root/assets/local-app-workbench-page-kCZ_fbSZ.js +0 -1
  255. package/dist/gateway/static/root/assets/logs-page-5Jt3uqYt.js +0 -2
  256. package/dist/gateway/static/root/assets/management-settings-DOQMLPrI.js +0 -1
  257. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-B4nztFE4.js +0 -1
  258. package/dist/gateway/static/root/assets/note-detail-panel-1wsKlkk3.js +0 -5
  259. package/dist/gateway/static/root/assets/note-image-lightbox-B82cToeV.js +0 -1
  260. package/dist/gateway/static/root/assets/notes-page-DKREWOku.js +0 -8
  261. package/dist/gateway/static/root/assets/page-context-capture-button-oSJIFF3E.js +0 -1
  262. package/dist/gateway/static/root/assets/personal-page-CoqQTkkS.js +0 -1
  263. package/dist/gateway/static/root/assets/personal-settings-panel-BgcJLmZN.js +0 -1
  264. package/dist/gateway/static/root/assets/plugin-details-dialog-CdOJ3Tir.js +0 -1
  265. package/dist/gateway/static/root/assets/project-detail-page-ZADyvA7-.js +0 -7
  266. package/dist/gateway/static/root/assets/projects-page-BkRe6Z8S.js +0 -1
  267. package/dist/gateway/static/root/assets/remote-access-hub-CCGf5kF4.js +0 -1
  268. package/dist/gateway/static/root/assets/runtime-tools-api-CY3R7unQ.js +0 -5
  269. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-BxaxVlwM.js +0 -1
  270. package/dist/gateway/static/root/assets/sessions-page-B81rRu2-.js +0 -1
  271. package/dist/gateway/static/root/assets/settings-advanced-gate-DLHGV-I-.js +0 -1
  272. package/dist/gateway/static/root/assets/setup-status-panel-gEqkJWyw.js +0 -1
  273. package/dist/gateway/static/root/assets/shares-settings-D9Ul96XW.js +0 -1
  274. package/dist/gateway/static/root/assets/skill-reload-api-NLAaNaDn.js +0 -1
  275. package/dist/gateway/static/root/assets/skills-page-dWeFt-6J.js +0 -2
  276. package/dist/gateway/static/root/assets/system-settings-panel-DdDsFdCh.js +0 -1
  277. package/dist/gateway/static/root/assets/task-detail-page-DO3FM--W.js +0 -2
  278. package/dist/gateway/static/root/assets/tracing-settings-page-Dm3yToJ1.js +0 -1
  279. package/dist/gateway/static/root/assets/usage-page-DJJhACRJ.js +0 -1
  280. package/dist/gateway/static/root/assets/user-model-page-DnZ4qFaO.js +0 -2
@@ -0,0 +1,466 @@
1
+ import { createLogger } from "../../../utils/logger/index.js";
2
+ import { init_logger } from "../../../utils/logger.js";
3
+ import { MOCK_PHONE_MODEL, PhoneActionSchema, PhoneConfigSchema, PhoneDeviceSchema, PhoneError, PhoneInputSchema, init_contracts } from "../../../phone/contracts.js";
4
+ import { getDefaultAgentId, init_resolve_route } from "../../../routing/resolve-route.js";
5
+ import { getModelRegistry, init_model_registry } from "../../../providers/model-registry.js";
6
+ import { init_providers, isProviderConfiguredSync } from "../../../providers/index.js";
7
+ import { normalizePhoneAppAccess, phoneAppAccess } from "../../../phone/app-access.js";
8
+ import { createPhoneModel, phoneModelProfile } from "../../../phone/model-adapter.js";
9
+ import { getPhoneRuntime, phoneExecutionContext } from "../../../phone/runtime.js";
10
+ import { getGatewayPrincipal } from "../../security/gateway-principal.js";
11
+ import { randomUUID } from "node:crypto";
12
+ import { z } from "zod";
13
+ import { Hono } from "hono";
14
+ import { bodyLimit } from "hono/body-limit";
15
+ //#region src/gateway/hono/routes/phone.ts
16
+ init_resolve_route();
17
+ init_model_registry();
18
+ init_providers();
19
+ init_contracts();
20
+ init_logger();
21
+ const log = createLogger("Hono:Phone");
22
+ const deviceInput = PhoneDeviceSchema.omit({
23
+ id: true,
24
+ createdAt: true,
25
+ revision: true,
26
+ connection: true
27
+ });
28
+ function registerPhoneRoutes(parent, deps, runtime = getPhoneRuntime()) {
29
+ const app = new Hono();
30
+ app.onError((error, c) => {
31
+ const code = error instanceof PhoneError ? error.code : error instanceof z.ZodError ? "PHONE_INVALID_INPUT" : "PHONE_OPERATION_FAILED";
32
+ if (!(error instanceof PhoneError) && !(error instanceof z.ZodError)) log.warn({
33
+ phase: "phone_route",
34
+ errorCode: code
35
+ }, "Phone operation failed");
36
+ return c.json({
37
+ ok: false,
38
+ error: {
39
+ code,
40
+ message: error instanceof PhoneError ? error.message : error instanceof z.ZodError ? "Invalid phone request" : "Phone operation failed. Check device diagnostics."
41
+ }
42
+ }, error instanceof PhoneError ? error.status : error instanceof z.ZodError ? 400 : 500);
43
+ });
44
+ const { service, strictRateLimitMiddleware } = deps;
45
+ app.use("/api/phone/*", async (c, next) => {
46
+ const principal = getGatewayPrincipal(c);
47
+ if (principal.kind !== "owner" && principal.kind !== "trusted-proxy" || !principal.scopes.includes("gateway.admin")) return c.json({
48
+ ok: false,
49
+ error: {
50
+ code: "PHONE_ADMIN_REQUIRED",
51
+ message: "Phone settings require Gateway administrator access"
52
+ }
53
+ }, 403);
54
+ return next();
55
+ });
56
+ app.use("/api/phone/cloud/aliyun/*", bodyLimit({
57
+ maxSize: 24 * 1024,
58
+ onError: (c) => c.json({
59
+ ok: false,
60
+ error: {
61
+ code: "PHONE_UPLOAD_TOO_LARGE",
62
+ message: "Phone key upload exceeds 24 KB"
63
+ }
64
+ }, 413)
65
+ }));
66
+ app.post("/api/phone/cloud/aliyun/test", strictRateLimitMiddleware, async (c) => {
67
+ const input = z.object({
68
+ endpoint: z.string().max(200),
69
+ privateKey: z.string().max(16384)
70
+ }).strict().parse(await c.req.json());
71
+ const payload = await runtime.cloud.test(getGatewayPrincipal(c).principalId, input.endpoint, input.privateKey, c.req.raw.signal);
72
+ c.header("Cache-Control", "no-store");
73
+ return c.json({
74
+ ok: true,
75
+ payload
76
+ });
77
+ });
78
+ app.post("/api/phone/cloud/aliyun/add", strictRateLimitMiddleware, async (c) => {
79
+ const input = z.object({
80
+ token: z.string().uuid(),
81
+ name: z.string().trim().min(1).max(100),
82
+ makeDefault: z.boolean().default(false)
83
+ }).strict().parse(await c.req.json());
84
+ const payload = await runtime.cloud.add(getGatewayPrincipal(c).principalId, input.token, input.name, input.makeDefault);
85
+ c.header("Cache-Control", "no-store");
86
+ return c.json({
87
+ ok: true,
88
+ payload
89
+ }, 201);
90
+ });
91
+ app.delete("/api/phone/cloud/aliyun/tests/:token", (c) => {
92
+ runtime.cloud.cancel(getGatewayPrincipal(c).principalId, z.string().uuid().parse(c.req.param("token")));
93
+ return c.json({ ok: true });
94
+ });
95
+ app.get("/api/phone/settings", (c) => c.json({
96
+ ok: true,
97
+ payload: {
98
+ config: service.currentConfig.phone,
99
+ defaultDeviceId: runtime.repository.defaultDevice(),
100
+ runner: "gateway-local",
101
+ agentId: getDefaultAgentId()
102
+ }
103
+ }));
104
+ app.patch("/api/phone/settings", strictRateLimitMiddleware, async (c) => {
105
+ const config = PhoneConfigSchema.parse(await c.req.json());
106
+ await runtime.shutdown();
107
+ const next = structuredClone(service.currentConfig);
108
+ next.phone = config;
109
+ if (!(await service.saveConfig(next)).saved) throw new PhoneError("PHONE_CONFIG_SAVE_FAILED", "Unable to save Phone Use settings");
110
+ return c.json({
111
+ ok: true,
112
+ payload: { config }
113
+ });
114
+ });
115
+ app.get("/api/phone/devices", async (c) => {
116
+ let discovery = [];
117
+ let diagnostic;
118
+ try {
119
+ discovery = await runtime.discover(service.currentConfig, c.req.raw.signal);
120
+ } catch (error) {
121
+ diagnostic = error instanceof PhoneError ? error.code : "PHONE_ADB_UNAVAILABLE";
122
+ }
123
+ return c.json({
124
+ ok: true,
125
+ payload: {
126
+ devices: runtime.repository.list(),
127
+ discovery,
128
+ diagnostic,
129
+ defaultDeviceId: runtime.repository.defaultDevice()
130
+ }
131
+ });
132
+ });
133
+ app.get("/api/phone/apps", async (c) => {
134
+ const input = z.object({ serial: z.string().min(1).max(200) }).strict().parse(c.req.query());
135
+ const applications = await runtime.applications(input, service.currentConfig, c.req.raw.signal);
136
+ c.header("Cache-Control", "no-store");
137
+ return c.json({
138
+ ok: true,
139
+ payload: { applications }
140
+ });
141
+ });
142
+ app.get("/api/phone/devices/:id/apps", async (c) => {
143
+ const applications = await runtime.applications({ deviceId: c.req.param("id") }, service.currentConfig, c.req.raw.signal);
144
+ c.header("Cache-Control", "no-store");
145
+ return c.json({
146
+ ok: true,
147
+ payload: { applications }
148
+ });
149
+ });
150
+ app.post("/api/phone/devices", strictRateLimitMiddleware, async (c) => {
151
+ const input = deviceInput.parse(await c.req.json());
152
+ if (!(await runtime.discover(service.currentConfig, c.req.raw.signal)).some((device) => device.serial === input.serial && device.state === "device")) throw new PhoneError("PHONE_DEVICE_OFFLINE", "Choose a connected and authorized ADB device");
153
+ const device = runtime.repository.save(input);
154
+ if (!runtime.repository.defaultDevice()) runtime.repository.setDefault(device.id);
155
+ return c.json({
156
+ ok: true,
157
+ payload: device
158
+ }, 201);
159
+ });
160
+ app.patch("/api/phone/devices/:id", strictRateLimitMiddleware, async (c) => {
161
+ const id = c.req.param("id");
162
+ const previous = runtime.repository.get(id);
163
+ const patch = deviceInput.omit({ serial: true }).partial().parse(await c.req.json());
164
+ const next = normalizePhoneAppAccess({
165
+ ...previous,
166
+ ...patch,
167
+ ...patch.allowedApps && patch.appAccess === void 0 ? { appAccess: "selected" } : {}
168
+ });
169
+ await runtime.stopDevice(id);
170
+ return c.json({
171
+ ok: true,
172
+ payload: runtime.repository.save(next, id)
173
+ });
174
+ });
175
+ app.delete("/api/phone/devices/:id", strictRateLimitMiddleware, async (c) => {
176
+ const id = c.req.param("id");
177
+ const device = runtime.repository.get(id);
178
+ await runtime.stopDevice(id);
179
+ await runtime.cloud.remove(device);
180
+ runtime.repository.remove(id);
181
+ return c.json({ ok: true });
182
+ });
183
+ app.post("/api/phone/devices/:id/default", strictRateLimitMiddleware, (c) => {
184
+ runtime.repository.setDefault(c.req.param("id"));
185
+ return c.json({ ok: true });
186
+ });
187
+ app.post("/api/phone/devices/:id/diagnostics", strictRateLimitMiddleware, async (c) => {
188
+ const device = runtime.repository.get(c.req.param("id"));
189
+ const found = (await (await runtime.driverFor(device, service.currentConfig)).discover(c.req.raw.signal)).find((item) => item.serial === device.serial);
190
+ return c.json({
191
+ ok: true,
192
+ payload: {
193
+ state: found?.state ?? "disconnected",
194
+ emulator: found?.emulator ?? false,
195
+ runner: "gateway-local",
196
+ appAccess: phoneAppAccess(device),
197
+ allowedApps: device.allowedApps
198
+ }
199
+ });
200
+ });
201
+ app.get("/api/phone/devices/:id/screen", async (c) => {
202
+ const observation = await runtime.preview(c.req.param("id"), service.currentConfig, c.req.raw.signal);
203
+ const bytes = Uint8Array.from(observation.frame);
204
+ observation.frame.fill(0);
205
+ c.header("Cache-Control", "no-store");
206
+ c.header("Content-Type", "image/png");
207
+ c.header("X-Content-Type-Options", "nosniff");
208
+ return c.body(bytes);
209
+ });
210
+ app.get("/api/phone/models", (c) => c.json({
211
+ ok: true,
212
+ payload: { models: [{
213
+ id: MOCK_PHONE_MODEL,
214
+ name: "Mock · Android Settings test",
215
+ profile: "mock-settings-about",
216
+ mock: true,
217
+ configured: true
218
+ }, ...getModelRegistry().getAll().flatMap((model) => {
219
+ const profile = phoneModelProfile(model);
220
+ return profile ? [{
221
+ id: `${model.provider}/${model.id}`,
222
+ name: model.name,
223
+ profile,
224
+ mock: false,
225
+ configured: isProviderConfiguredSync(model.provider)
226
+ }] : [];
227
+ })] }
228
+ }));
229
+ app.post("/api/phone/models/diagnostics", strictRateLimitMiddleware, async (c) => {
230
+ const body = z.object({
231
+ modelRef: z.string().min(1),
232
+ agentId: z.string().optional()
233
+ }).strict().parse(await c.req.json());
234
+ const adapter = await createPhoneModel(body.modelRef, service.currentConfig, body.agentId ?? getDefaultAgentId());
235
+ const { default: sharp } = await import("sharp");
236
+ const frame = await sharp(Buffer.from("<svg width=\"600\" height=\"1000\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"600\" height=\"1000\" fill=\"white\"/><text x=\"60\" y=\"100\" font-size=\"26\">Phone Use connection test</text><rect x=\"100\" y=\"400\" width=\"400\" height=\"160\" fill=\"#2563eb\"/><text x=\"200\" y=\"495\" font-size=\"36\" fill=\"white\">Continue</text></svg>")).png().toBuffer();
237
+ try {
238
+ const decision = await adapter.predict({
239
+ goal: "Tap the blue Continue button. This is a synthetic test image; no phone action will be executed.",
240
+ allowedApps: ["com.android.settings"],
241
+ history: [],
242
+ scenario: body.modelRef === "phone-mock/settings-about" ? "settings-about" : void 0,
243
+ observation: {
244
+ frameId: randomUUID(),
245
+ capturedAt: Date.now(),
246
+ width: 600,
247
+ height: 1e3,
248
+ rotation: 0,
249
+ package: "com.android.settings",
250
+ frame,
251
+ elements: []
252
+ }
253
+ }, c.req.raw.signal);
254
+ const grounded = decision.kind === "action" && decision.action.type === "tap" && decision.action.point[0] >= 167 && decision.action.point[0] <= 833 && decision.action.point[1] >= 400 && decision.action.point[1] <= 560;
255
+ return c.json({
256
+ ok: true,
257
+ payload: {
258
+ protocolValid: true,
259
+ groundingVerified: grounded,
260
+ mock: body.modelRef === MOCK_PHONE_MODEL,
261
+ deviceActions: 0
262
+ }
263
+ });
264
+ } finally {
265
+ frame.fill(0);
266
+ }
267
+ });
268
+ const liveClient = z.string().uuid();
269
+ const liveControlInput = z.object({
270
+ clientId: liveClient,
271
+ operationId: z.string().uuid(),
272
+ epoch: z.number().int().positive(),
273
+ op: z.enum([
274
+ "takeover",
275
+ "release",
276
+ "handback",
277
+ "pause",
278
+ "cancel",
279
+ "heartbeat",
280
+ "input",
281
+ "recover"
282
+ ]),
283
+ frameSeq: z.number().int().positive().optional(),
284
+ geometry: z.number().int().positive().optional(),
285
+ action: PhoneActionSchema.optional()
286
+ }).strict();
287
+ async function conversationPhone(conversationId, requestedSessionId) {
288
+ z.string().uuid().parse(conversationId);
289
+ const conversation = await service.sessions.getSession(conversationId);
290
+ if (!conversation) throw new PhoneError("PHONE_CONVERSATION_NOT_FOUND", "Conversation not found", 404);
291
+ const report = runtime.status(conversationId);
292
+ if (requestedSessionId && report?.sessionId !== requestedSessionId) throw new PhoneError("PHONE_SESSION_NOT_FOUND", "Phone session not found", 404);
293
+ if (report && report.agentId !== conversation.agentId) throw new PhoneError("PHONE_ACCESS_CHANGED", "Conversation Agent changed", 403);
294
+ return {
295
+ report,
296
+ transcriptId: conversation.transcriptId,
297
+ context: phoneExecutionContext(service.currentConfig, conversation.agentId)
298
+ };
299
+ }
300
+ app.get("/api/phone/conversations/:conversationId", async (c) => {
301
+ const owner = c.req.param("conversationId");
302
+ const client = liveClient.parse(c.req.query("clientId"));
303
+ const { report, context } = await conversationPhone(owner);
304
+ c.header("Cache-Control", "no-store");
305
+ return c.json({
306
+ ok: true,
307
+ payload: report ? runtime.liveStatus(owner, report.sessionId, context, `${getGatewayPrincipal(c).principalId}:${client}`) : null
308
+ });
309
+ });
310
+ app.get("/api/phone/conversations/:conversationId/:sessionId/frame", async (c) => {
311
+ const owner = c.req.param("conversationId");
312
+ const id = c.req.param("sessionId");
313
+ const { context } = await conversationPhone(owner, id);
314
+ const frame = await runtime.liveFrame(owner, id, context, c.req.raw.signal);
315
+ c.header("Cache-Control", "no-store");
316
+ c.header("Content-Type", "image/png");
317
+ c.header("X-Content-Type-Options", "nosniff");
318
+ c.header("X-Phone-Frame-Seq", String(frame.seq));
319
+ c.header("X-Phone-Captured-At", String(frame.capturedAt));
320
+ c.header("X-Phone-Width", String(frame.width));
321
+ c.header("X-Phone-Height", String(frame.height));
322
+ c.header("X-Phone-Rotation", String(frame.rotation));
323
+ const bytes = Uint8Array.from(frame.frame);
324
+ frame.frame.fill(0);
325
+ return c.body(bytes);
326
+ });
327
+ app.post("/api/phone/conversations/:conversationId/:sessionId/video-ticket", strictRateLimitMiddleware, async (c) => {
328
+ const owner = c.req.param("conversationId");
329
+ const id = c.req.param("sessionId");
330
+ const { clientId } = z.object({ clientId: liveClient }).strict().parse(await c.req.json());
331
+ await conversationPhone(owner, id);
332
+ const principal = getGatewayPrincipal(c);
333
+ const client = `${principal.principalId}:${clientId}`;
334
+ const validate = async () => {
335
+ const { context } = await conversationPhone(owner, id);
336
+ runtime.liveStatus(owner, id, context, client);
337
+ };
338
+ const issued = service.phoneStreams.issue({
339
+ origin: new URL(c.req.url).origin,
340
+ principal: principal.principalId,
341
+ client,
342
+ validate,
343
+ connect: async () => {
344
+ const { context } = await conversationPhone(owner, id);
345
+ return runtime.liveVideo(owner, id, context);
346
+ },
347
+ disconnect: () => runtime.disconnectVideo(owner, id, client)
348
+ });
349
+ c.header("Cache-Control", "no-store");
350
+ return c.json({
351
+ ok: true,
352
+ payload: {
353
+ ...issued,
354
+ transport: "scrcpy-h264",
355
+ protocolVersion: 1
356
+ }
357
+ });
358
+ });
359
+ app.post("/api/phone/conversations/:conversationId/:sessionId/control", async (c) => {
360
+ const owner = c.req.param("conversationId");
361
+ const id = c.req.param("sessionId");
362
+ const { context, transcriptId } = await conversationPhone(owner, id);
363
+ const { clientId, ...input } = liveControlInput.parse(await c.req.json());
364
+ const result = await runtime.liveControl(owner, id, context, `${getGatewayPrincipal(c).principalId}:${clientId}`, input);
365
+ if (input.op === "handback" && result.resumeTurnRequired && !service.sessions.getActiveRun(owner).active) {
366
+ if (!(await service.submitSessionInput({
367
+ conversationId: owner,
368
+ expectedTranscriptId: transcriptId,
369
+ clientMessageId: input.operationId,
370
+ delivery: "next",
371
+ content: "手机已交还,请先确认当前页面,继续未完成的任务;已完成的步骤不要重复,结束后关闭手机会话。",
372
+ origin: {
373
+ type: "system",
374
+ source: "internal"
375
+ }
376
+ })).ok) throw new PhoneError("PHONE_RESUME_FAILED", "Phone control returned. Send Continue in chat to resume the task.", 409);
377
+ }
378
+ c.header("Cache-Control", "no-store");
379
+ return c.json({
380
+ ok: true,
381
+ payload: result
382
+ });
383
+ });
384
+ const ownerFor = (principalId, id) => `phone-settings:${principalId}:${id}`;
385
+ app.get("/api/phone/sessions", (c) => c.json({
386
+ ok: true,
387
+ payload: {
388
+ sessions: runtime.reports(),
389
+ history: runtime.repository.history()
390
+ }
391
+ }));
392
+ app.post("/api/phone/sessions", strictRateLimitMiddleware, async (c) => {
393
+ const body = z.object({
394
+ deviceId: z.string().uuid().optional(),
395
+ agentId: z.string().optional(),
396
+ mode: z.enum(["observe", "control"]),
397
+ appPackage: z.string().optional()
398
+ }).strict().parse(await c.req.json());
399
+ const id = randomUUID();
400
+ const owner = ownerFor(getGatewayPrincipal(c).principalId, id);
401
+ const { agentId = getDefaultAgentId(), ...input } = body;
402
+ const report = await runtime.execute(owner, {
403
+ op: "open",
404
+ ...input
405
+ }, phoneExecutionContext(service.currentConfig, agentId), c.req.raw.signal);
406
+ return c.json({
407
+ ok: true,
408
+ payload: {
409
+ id,
410
+ report
411
+ }
412
+ }, 201);
413
+ });
414
+ app.get("/api/phone/sessions/:id", (c) => {
415
+ const owner = ownerFor(getGatewayPrincipal(c).principalId, c.req.param("id"));
416
+ const report = runtime.status(owner);
417
+ if (!report) throw new PhoneError("PHONE_SESSION_NOT_FOUND", "Phone session not found", 404);
418
+ return c.json({
419
+ ok: true,
420
+ payload: report
421
+ });
422
+ });
423
+ app.get("/api/phone/sessions/:id/screen", async (c) => {
424
+ const owner = ownerFor(getGatewayPrincipal(c).principalId, c.req.param("id"));
425
+ const report = runtime.status(owner);
426
+ if (!report) throw new PhoneError("PHONE_SESSION_NOT_FOUND", "Phone session not found", 404);
427
+ const observation = await runtime.previewSession(owner, phoneExecutionContext(service.currentConfig, report.agentId), c.req.raw.signal);
428
+ const bytes = Uint8Array.from(observation.frame);
429
+ observation.frame.fill(0);
430
+ c.header("Cache-Control", "no-store");
431
+ c.header("Content-Type", "image/png");
432
+ c.header("X-Content-Type-Options", "nosniff");
433
+ return c.body(bytes);
434
+ });
435
+ app.post("/api/phone/sessions/:id/execute", strictRateLimitMiddleware, async (c) => {
436
+ const owner = ownerFor(getGatewayPrincipal(c).principalId, c.req.param("id"));
437
+ const report = runtime.status(owner);
438
+ if (!report) throw new PhoneError("PHONE_SESSION_NOT_FOUND", "Phone session not found", 404);
439
+ const input = PhoneInputSchema.parse(await c.req.json());
440
+ if (["open", "discover"].includes(input.op)) throw new PhoneError("PHONE_INVALID_OPERATION", "Use the phone discovery and session creation endpoints");
441
+ const operation = runtime.execute(owner, input, phoneExecutionContext(service.currentConfig, report.agentId));
442
+ if (input.op === "run" || input.op === "step") {
443
+ let immediateError;
444
+ operation.catch((error) => {
445
+ immediateError = error;
446
+ log.info({
447
+ sessionId: report.sessionId,
448
+ errorCode: error instanceof PhoneError ? error.code : "PHONE_OPERATION_FAILED"
449
+ }, "Phone execution stopped");
450
+ });
451
+ await Promise.resolve();
452
+ if (immediateError) throw immediateError;
453
+ return c.json({
454
+ ok: true,
455
+ payload: runtime.status(owner)
456
+ }, 202);
457
+ }
458
+ return c.json({
459
+ ok: true,
460
+ payload: await operation
461
+ });
462
+ });
463
+ parent.route("/", app);
464
+ }
465
+ //#endregion
466
+ export { registerPhoneRoutes };
@@ -4,6 +4,7 @@ import { normalizeRuntimeVersionRequest } from "../../../runtime-tools/probe.js"
4
4
  import { ManagedRuntimeManager } from "../../../runtime-tools/manager.js";
5
5
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
6
6
  import { pruneRuntimeTools } from "../../../runtime-tools/prune.js";
7
+ import { registerPhoneDependencyRoutes } from "./phone-dependencies.js";
7
8
  import { streamSSE } from "hono/streaming";
8
9
  //#region src/gateway/hono/routes/runtime-tools.ts
9
10
  init_paths_state();
@@ -32,6 +33,7 @@ async function readJson(c) {
32
33
  }
33
34
  function registerRuntimeToolsRoutes(authenticated, deps) {
34
35
  const { service, strictRateLimitMiddleware } = deps;
36
+ registerPhoneDependencyRoutes(authenticated, deps);
35
37
  authenticated.get("/api/runtime-tools", async (c) => {
36
38
  const statuses = await runtimeManager(service.currentConfig).statusAll();
37
39
  return c.json({
@@ -69,6 +69,7 @@ var GatewayServer = class {
69
69
  inner.on("upgrade", (req, socket, head) => {
70
70
  try {
71
71
  if (this.service.voiceRealtime.handleUpgrade(req, socket, head)) return;
72
+ if (this.service.phoneStreams.handleUpgrade(req, socket, head)) return;
72
73
  if (this.service.realtime.handleUpgrade(req, socket, head)) return;
73
74
  if (handleSiteShareUpgrade(this.service, req, socket, head)) return;
74
75
  socket.destroy();
@@ -323,6 +323,14 @@ export declare class GatewayConfigCoordinator {
323
323
  maxSessionDurationMs: number;
324
324
  idleGrantTtlMs: number;
325
325
  };
326
+ phone: {
327
+ enabled: boolean;
328
+ maxActionsPerSession: number;
329
+ maxModelRequests: number;
330
+ maxOperationDurationMs: number;
331
+ maxSessionDurationMs: number;
332
+ adbPath?: string;
333
+ };
326
334
  tools: {
327
335
  web?: {
328
336
  region?: "global" | "cn";
@@ -8,8 +8,8 @@ import { reloadImageGenerationProviders } from "../../agent/image/generation/pro
8
8
  import { loadConfig, saveConfig } from "../../config/loader.js";
9
9
  import { ConfigHotReloader } from "../../config/reload.js";
10
10
  import "../../config/index.js";
11
- import { computeExtensionActivationPatch } from "../../extensions/bundled-extension-activation.js";
12
11
  import { sanitizeTunnelConfig } from "../../tunnel/tunnel-config.js";
12
+ import { computeExtensionActivationPatch } from "../../extensions/bundled-extension-activation.js";
13
13
  import { isDeepStrictEqual } from "node:util";
14
14
  //#region src/gateway/service/config-coordinator.ts
15
15
  /**
@@ -1,4 +1,5 @@
1
1
  import type { ClarificationSubmission } from '@xopcai/gateway-contract';
2
+ import { PhoneStreamGateway } from '../phone/stream-gateway.js';
2
3
  import { WorkDiscoveryService } from '../work-discovery/service.js';
3
4
  import { ConnectionRecoveryService } from '../connectors/connection-recovery-service.js';
4
5
  import { AgentService } from '../agent/service.js';
@@ -55,6 +56,7 @@ export declare class GatewayService {
55
56
  readonly endpointTools: EndpointToolRuntime;
56
57
  private isRealtimePrincipalActive;
57
58
  readonly realtime: RealtimeRuntime;
59
+ readonly phoneStreams: PhoneStreamGateway;
58
60
  readonly voiceRealtime: VoiceRealtimeRuntime;
59
61
  getConfig(): Config;
60
62
  getModelCatalogSync(): ModelCatalogSyncService;
@@ -32,8 +32,8 @@ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.
32
32
  import { 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
- import { flushTracing } from "../observability/runtime.js";
36
35
  import { AI_USAGE_RETENTION_MS, markStaleAiUsageEventsUnknown, pruneAiUsageEvents } from "../storage/sqlite/ai-usage-repository.js";
36
+ import { flushTracing } from "../observability/runtime.js";
37
37
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
38
38
  import { getPersonalAgentByConversation } from "../personal-agent/repository.js";
39
39
  import { onSessionTranscriptUpdate } from "../session/transcript-events.js";
@@ -87,6 +87,12 @@ import { ChatPreviewService } from "../chat-previews/service.js";
87
87
  import "../chat-previews/index.js";
88
88
  import { configureGatewayHttpProxy } from "../infra/http-proxy-env.js";
89
89
  import "../config/index.js";
90
+ import { DiscussionService } from "../discussions/service.js";
91
+ import { DiscussionOrganizer } from "../discussions/organizer.js";
92
+ import { DiscussionLiveWorker } from "../discussions/live-worker.js";
93
+ import { DiscussionOrganizerWorker } from "../discussions/organizer-worker.js";
94
+ import { DiscussionSealer } from "../discussions/sealer.js";
95
+ import "../discussions/index.js";
90
96
  import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
91
97
  import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
92
98
  import "../knowledge/index.js";
@@ -94,12 +100,6 @@ import { PersonalReplyComposer } from "../personal-agent/reply-composer.js";
94
100
  import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
95
101
  import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
96
102
  import { startConnectorSupervisor } from "../connectors/supervisor.js";
97
- import { DiscussionService } from "../discussions/service.js";
98
- import { DiscussionOrganizer } from "../discussions/organizer.js";
99
- import { DiscussionLiveWorker } from "../discussions/live-worker.js";
100
- import { DiscussionOrganizerWorker } from "../discussions/organizer-worker.js";
101
- import { DiscussionSealer } from "../discussions/sealer.js";
102
- import "../discussions/index.js";
103
103
  import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
104
104
  import "../endpoint-tools/index.js";
105
105
  import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
@@ -111,6 +111,7 @@ import { prepareAutomationAgentSession } from "./automation-agent-session.js";
111
111
  import { stopTailscaleExposure } from "./tailscale-lifecycle.js";
112
112
  import { getGatewayFileSpaceService } from "./file-space-service.js";
113
113
  import { reconcileHomeIntelligenceAutomation } from "./home-intelligence-automation-reconciler.js";
114
+ import { PhoneStreamGateway } from "../phone/stream-gateway.js";
114
115
  import { PersonalProactivityService } from "../personal-agent/proactivity/service.js";
115
116
  import { reconcilePersonalProactivityAutomation } from "../personal-agent/proactivity/automation.js";
116
117
  import { createBackgroundTask } from "../infra/background-task.js";
@@ -220,6 +221,7 @@ var GatewayService = class {
220
221
  }
221
222
  };
222
223
  realtime = new RealtimeRuntime(this.endpointTools, this.isRealtimePrincipalActive);
224
+ phoneStreams = new PhoneStreamGateway(this.isRealtimePrincipalActive);
223
225
  voiceRealtime = new VoiceRealtimeRuntime({
224
226
  isPrincipalActive: this.isRealtimePrincipalActive,
225
227
  getConversationContext: async (conversationId, expectedTranscriptId) => {
@@ -1565,6 +1567,9 @@ var GatewayService = class {
1565
1567
  await flushTracing();
1566
1568
  if (!this.running) return;
1567
1569
  this.stopping = true;
1570
+ const { getPhoneRuntime } = await import("../phone/runtime.js");
1571
+ await getPhoneRuntime().shutdown();
1572
+ this.phoneStreams.close();
1568
1573
  const { cancelAllPluginCliAuthorizations } = await import("../extensions/agent-plugins/cli-authorization.js");
1569
1574
  cancelAllPluginCliAuthorizations();
1570
1575
  this.taskAllocationDispatcher?.stop();
@@ -1,5 +1,4 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
2
- import { runPostUpdateExtensionSync } from "../extensions/update.js";
3
2
  import "./update-channels.js";
4
3
  import { compareSemver, resolveNpmChannelTag } from "./update-check.js";
5
4
  import { readPackageName, readPackageVersion } from "./package-json.js";
@@ -9,6 +8,7 @@ import { runGlobalPackageUpdateSteps } from "./package-update-steps.js";
9
8
  import { resolveStableNodePath } from "./stable-node-path.js";
10
9
  import { trimLogTail } from "./update-log.js";
11
10
  import { maybeRestartGatewayAfterUpdate, prepareGatewayRestart } from "./update-restart.js";
11
+ import { runPostUpdateExtensionSync } from "../extensions/update.js";
12
12
  import path from "node:path";
13
13
  import fs from "node:fs/promises";
14
14
  //#region src/infra/update-runner.ts
@@ -362,6 +362,11 @@ function deleteKnowledgeItem(id, now = Date.now(), options = {}) {
362
362
  ) SELECT * FROM knowledge_items WHERE knowledge_id IN (SELECT id FROM deleted)`).all(id, options.includeRelated === false ? 0 : 1);
363
363
  for (const row of rows) {
364
364
  const item = fromRow(row);
365
+ const revisions = db.prepare("SELECT content FROM knowledge_revisions WHERE knowledge_id = ?").all(item.id);
366
+ for (const revision of revisions) suppressMemory(db, knowledgeFingerprints({
367
+ ...item,
368
+ content: revision.content
369
+ }), now);
365
370
  suppressMemory(db, knowledgeFingerprints(item), now);
366
371
  clearMemoryAudit(db, "knowledge", item.id);
367
372
  if (item.recordClass === "source_index" && typeof item.source.sourceItemId === "string") db.prepare("DELETE FROM knowledge_source_chunks WHERE source_item_id = ?").run(item.source.sourceItemId);
@@ -68,7 +68,7 @@ function applyKnowledgeDeletions(input) {
68
68
  FROM context_evidence e WHERE e.conversation_id IS NOT NULL AND e.message_id IS NOT NULL
69
69
  AND (e.evidence_id IN (SELECT evidence_id FROM knowledge_evidence_links WHERE knowledge_id=?)
70
70
  OR e.message_id IN (SELECT value FROM knowledge_revisions r, json_each(r.source_json, '$.evidenceRefs')
71
- WHERE r.knowledge_id=?))`).all(item.id, item.id).flatMap((entry) => [`${entry.conversation_id}:${entry.message_id}`, `${entry.conversation_id}:*`])).concat(targets.length && input.context.conversationId ? [`${input.context.conversationId}:*`] : []);
71
+ WHERE r.knowledge_id=?))`).all(item.id, item.id).flatMap((entry) => [`${entry.conversation_id}:${entry.message_id}`, `${entry.conversation_id}:*`])).concat((targets.length || !operation.targetKnowledgeIds.length && operation.reread) && input.context.conversationId ? [`${input.context.conversationId}:*`] : []);
72
72
  for (const item of targets) {
73
73
  deleteKnowledgeItem(item.id, Date.now(), { includeRelated: false });
74
74
  outputs.push({
@@ -78,7 +78,15 @@ function applyKnowledgeDeletions(input) {
78
78
  outcome: "rejected"
79
79
  });
80
80
  }
81
- for (const scope of new Map(targets.map((item) => [JSON.stringify(item.scope), item.scope])).values()) {
81
+ const scopes = targets.map((item) => item.scope);
82
+ if (!operation.targetKnowledgeIds.length && operation.reread && input.context.workspaceId) scopes.push(input.context.projectId ? {
83
+ type: "project",
84
+ id: input.context.projectId
85
+ } : {
86
+ type: "workspace",
87
+ id: input.context.workspaceId
88
+ });
89
+ for (const scope of new Map(scopes.map((scope) => [JSON.stringify(scope), scope])).values()) {
82
90
  if (scope.type === "agent") continue;
83
91
  if (!listCollaborationRules().some((rule) => rule.category === "boundary" && rule.status === "active" && JSON.stringify(rule.scope) === JSON.stringify(scope) && rule.statement === operation.boundary && forgottenEntries.every((entry) => Array.isArray(rule.conditions.forgottenHistoryEntries) && rule.conditions.forgottenHistoryEntries.includes(entry)))) createCollaborationRule({
84
92
  category: "boundary",
@@ -87,7 +95,8 @@ function applyKnowledgeDeletions(input) {
87
95
  conditions: {
88
96
  enforcementLevel: "prompt",
89
97
  forgottenHistoryEntries: [...new Set(forgottenEntries)],
90
- reread: operation.reread
98
+ reread: operation.reread,
99
+ ...operation.reread ? { unadmittedFieldCoverage: true } : {}
91
100
  },
92
101
  statement: operation.boundary,
93
102
  status: "active"
@@ -4,6 +4,10 @@ export declare function explicitlyReadsOriginalHistory(text: string): boolean;
4
4
  /** A value-free, per-request notice makes legitimate original reads distinguishable from automatic recall. */
5
5
  export declare function originalReadAuthorizationNotice(context: CaptureScopeContext, userText?: string): string;
6
6
  export declare function forgottenHistoryEntries(context: CaptureScopeContext, userText?: string): Set<string>;
7
+ /** Apply value-free scoped field boundaries even when a source fact was never admitted.
8
+ * Ambiguous mixed sentences are conservative: all values of that field are withheld.
9
+ */
10
+ export declare function projectUnadmittedForgottenFields<T>(value: T, context: CaptureScopeContext, userText?: string): T;
7
11
  /** Project provenance for model consumption without changing the retained audit source. */
8
12
  export declare function projectForgottenEvidence<T>(source: T, context: CaptureScopeContext, userText?: string, provenanceRefs?: string[]): T;
9
13
  /** Remove earlier materialized reads from active history, retaining this turn and system context. */