@xopcai/xopc 0.0.421 → 0.0.422

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 (279) hide show
  1. package/dist/browser-ext/dist/background.js +184 -2
  2. package/dist/browser-ext/dist/sidepanel.js +9 -0
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{activity-store-CKrylgib.js → activity-store-CvJ9rdwP.js} +1 -1
  6. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Dv5Rda4y.js → agent-avatar-dicebear-CFP6g4w7.js} +1 -1
  7. package/dist/gateway/static/root/assets/{agent-avatar-display-B1ycycx2.js → agent-avatar-display-BHBe88Gu.js} +2 -2
  8. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-D285zy0S.js → agent-defaults-settings-panel-DlGRuKMv.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-plugin-dialog-D3yCqVan.js → agent-plugin-dialog-C_Dm-u6_.js} +1 -1
  10. package/dist/gateway/static/root/assets/{agents-DyAuR3rG.js → agents-BdVJHOiK.js} +3 -3
  11. package/dist/gateway/static/root/assets/{agents-admin-api-CASGzvkW.js → agents-admin-api-Do1Pza0R.js} +1 -1
  12. package/dist/gateway/static/root/assets/{api-Uk05lF9i.js → api-BQv5dLcH.js} +1 -1
  13. package/dist/gateway/static/root/assets/{api-C4LxuNzq.js → api-ONg37_fH.js} +1 -1
  14. package/dist/gateway/static/root/assets/app-link-1j40sJ-z.js +1 -0
  15. package/dist/gateway/static/root/assets/{app-management-settings-panel-CDnZNKHt.js → app-management-settings-panel-B4Wqhf4J.js} +1 -1
  16. package/dist/gateway/static/root/assets/{appearance-settings-CmCF7PZ5.js → appearance-settings-Dm1kRzKL.js} +1 -1
  17. package/dist/gateway/static/root/assets/{apps-page-BR9qoA2P.js → apps-page-D1MMk1P7.js} +1 -1
  18. package/dist/gateway/static/root/assets/{archive-plugin-nuHYYVty.js → archive-plugin-p_yLkyaC.js} +1 -1
  19. package/dist/gateway/static/root/assets/{automation-api-DtJfd1QM.js → automation-api-DQaWBR03.js} +1 -1
  20. package/dist/gateway/static/root/assets/automation-result-state-CO_243JM.js +1 -0
  21. package/dist/gateway/static/root/assets/automation-task-card-D2p9qlYE.js +3 -0
  22. package/dist/gateway/static/root/assets/{automations-page-DM4IdUJh.js → automations-page-Ba64H37d.js} +1 -1
  23. package/dist/gateway/static/root/assets/automations-workspace-BkzC3oIM.js +9 -0
  24. package/dist/gateway/static/root/assets/{binary-plugins-CHCAr8jt.js → binary-plugins-B-6kyqtt.js} +1 -1
  25. package/dist/gateway/static/root/assets/{block-editor-B0v8KxsO.js → block-editor-B5ysJ96n.js} +1 -1
  26. package/dist/gateway/static/root/assets/{browser-automation-inputs-DjUW7PEB.js → browser-automation-inputs-C2A3NIt3.js} +1 -1
  27. package/dist/gateway/static/root/assets/{browser-automations-page-Cf8AoQz1.js → browser-automations-page-CnbXFw1_.js} +1 -1
  28. package/dist/gateway/static/root/assets/{browser-control-api-C6NZgaA1.js → browser-control-api-Aj_seKE9.js} +1 -1
  29. package/dist/gateway/static/root/assets/{browser-settings-page-DV2FNEDf.js → browser-settings-page-C7fxPq_z.js} +1 -1
  30. package/dist/gateway/static/root/assets/{capabilities-CwdjWz2r.js → capabilities-BgtCwC_E.js} +1 -1
  31. package/dist/gateway/static/root/assets/{capabilities-D0-HCZ5J.js → capabilities-DOTgaSgA.js} +1 -1
  32. package/dist/gateway/static/root/assets/{capabilities-page-DwDkritH.js → capabilities-page-m3b9sLFG.js} +2 -2
  33. package/dist/gateway/static/root/assets/{capabilities-settings-panel-mme16Fbp.js → capabilities-settings-panel-pYWZtPeU.js} +3 -3
  34. package/dist/gateway/static/root/assets/{channels-lKFLu8p-.js → channels-DGpRM6pj.js} +1 -1
  35. package/dist/gateway/static/root/assets/{chat-agents-api-l80cvSac.js → chat-agents-api-EvJ_Wvuc.js} +1 -1
  36. package/dist/gateway/static/root/assets/{chat-chart-block-BwP5QXEk.js → chat-chart-block-BQDbHLcw.js} +1 -1
  37. package/dist/gateway/static/root/assets/chat-page-GF9NIuZN.js +72 -0
  38. package/dist/gateway/static/root/assets/{chat-terminal-dock-D2bV9YUL.js → chat-terminal-dock-DHFTGoEp.js} +2 -2
  39. package/dist/gateway/static/root/assets/{command-palette-api-CtapG8ck.js → command-palette-api-DPA_yEuy.js} +1 -1
  40. package/dist/gateway/static/root/assets/{composer-payload-handoff-DYuhKZRC.js → composer-payload-handoff-BTjauSNp.js} +1 -1
  41. package/dist/gateway/static/root/assets/{computer-settings-page-DZtMuihL.js → computer-settings-page-BFSSQfcx.js} +1 -1
  42. package/dist/gateway/static/root/assets/{connected-providers-grid-BQH5k3iC.js → connected-providers-grid-DM2glQN3.js} +1 -1
  43. package/dist/gateway/static/root/assets/{connector-service-page-DrvFdP3G.js → connector-service-page-CFvg58qa.js} +1 -1
  44. package/dist/gateway/static/root/assets/{connectors-api-BzkgVBYC.js → connectors-api-CbC6Yht5.js} +1 -1
  45. package/dist/gateway/static/root/assets/{connectors-page-BtRNVCFy.js → connectors-page-D7pipFHA.js} +1 -1
  46. package/dist/gateway/static/root/assets/date-picker-Dd3MbG0x.js +1 -0
  47. package/dist/gateway/static/root/assets/{dependency-picker-Dh8hPmsT.js → dependency-picker-DcsHg2ml.js} +1 -1
  48. package/dist/gateway/static/root/assets/{desktop-pet-CFz8bqyI.js → desktop-pet-DldzQT2h.js} +1 -1
  49. package/dist/gateway/static/root/assets/{desktop-pet-settings-COaboNn1.js → desktop-pet-settings-CYdI4KxB.js} +1 -1
  50. package/dist/gateway/static/root/assets/{dev-view-store-D8XYHVqG.js → dev-view-store-JiJv585f.js} +1 -1
  51. package/dist/gateway/static/root/assets/device-pairing-wizard-D8cLc41G.js +1 -0
  52. package/dist/gateway/static/root/assets/{directory-picker-path-field-Cjv7rdo3.js → directory-picker-path-field-8WOXv8zw.js} +1 -1
  53. package/dist/gateway/static/root/assets/{discussion-annotation-sync-YvlVw17j.js → discussion-annotation-sync-B-grSe0w.js} +1 -1
  54. package/dist/gateway/static/root/assets/{extension-debug-page-CXx3m5-B.js → extension-debug-page-EEQkTNEu.js} +1 -1
  55. package/dist/gateway/static/root/assets/{extension-iframe-host-CnOdNwbo.js → extension-iframe-host-vlZVeMCY.js} +1 -1
  56. package/dist/gateway/static/root/assets/{extension-marketplace-api-BABmUY2s.js → extension-marketplace-api-_o2In_al.js} +1 -1
  57. package/dist/gateway/static/root/assets/{extension-page-C1nGr4DD.js → extension-page-CPrT111s.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-provider-BA0Y2Rvs.js → extension-provider-B2Mf3FBu.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-settings-page-QIPI8e7k.js → extension-settings-page-CznJEgWV.js} +1 -1
  60. package/dist/gateway/static/root/assets/{file-preview-surface-BsB7bnFH.js → file-preview-surface-7h8_fZul.js} +1 -1
  61. package/dist/gateway/static/root/assets/{gateway-config-swr-Bt8w0Iio.js → gateway-config-swr-DbbNEOKj.js} +1 -1
  62. package/dist/gateway/static/root/assets/{gateway-realtime-CyCCNUxm.js → gateway-realtime-D20ZrAuM.js} +1 -1
  63. package/dist/gateway/static/root/assets/gateway-realtime-store-C6sMzYDT.js +1 -0
  64. package/dist/gateway/static/root/assets/{gateway-restart-Ty4AzDxa.js → gateway-restart-5ut-lhJm.js} +1 -1
  65. package/dist/gateway/static/root/assets/{gateway-settings-BvKq7vuz.js → gateway-settings-BCf_cibp.js} +1 -1
  66. package/dist/gateway/static/root/assets/{gateway-startup-retry-N3k-C7c2.js → gateway-startup-retry-DlHL0DpH.js} +1 -1
  67. package/dist/gateway/static/root/assets/{global-defaults-api-D8EB2vfY.js → global-defaults-api-CmODomcV.js} +1 -1
  68. package/dist/gateway/static/root/assets/{home-page-eRuAzi58.js → home-page-uz22TRB-.js} +2 -2
  69. package/dist/gateway/static/root/assets/{image-generation-api-C99Fsofm.js → image-generation-api-dzPnpUFu.js} +1 -1
  70. package/dist/gateway/static/root/assets/{imports-page-Cp9RquVb.js → imports-page-ChBoNMyE.js} +1 -1
  71. package/dist/gateway/static/root/assets/index-CSIg7V1A.js +11 -0
  72. package/dist/gateway/static/root/assets/index-Dv8mUlNN.css +1 -0
  73. package/dist/gateway/static/root/assets/{install-connector-dialog-CsoAidXp.js → install-connector-dialog-CNcdQDX0.js} +1 -1
  74. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DFhOP2aD.js → keyboard-shortcuts-settings-CRbYq2_g.js} +1 -1
  75. package/dist/gateway/static/root/assets/{local-app-workbench-page-DbtU_A-l.js → local-app-workbench-page-04cX5TJu.js} +1 -1
  76. package/dist/gateway/static/root/assets/{local-apps-page-rjhHfLpe.js → local-apps-page-fWM0FEhN.js} +1 -1
  77. package/dist/gateway/static/root/assets/{local-session-drafts-DHM4vWDO.js → local-session-drafts-ClrSe5mH.js} +1 -1
  78. package/dist/gateway/static/root/assets/{locale-store-5Hf8J8-_.js → locale-store-VNjH18Dj.js} +1 -1
  79. package/dist/gateway/static/root/assets/{logs-page-Dx_JIOpF.js → logs-page-6GanGLrm.js} +1 -1
  80. package/dist/gateway/static/root/assets/management-settings-BxD_lc4E.js +1 -0
  81. package/dist/gateway/static/root/assets/{markdown-view-pzSRu7av.js → markdown-view-DLCBYWtx.js} +2 -2
  82. package/dist/gateway/static/root/assets/{media-plugins-3cJuHbO7.js → media-plugins-BvtNwKFb.js} +1 -1
  83. package/dist/gateway/static/root/assets/{messages-uXxg5p54.js → messages-Btr7C0hF.js} +2 -2
  84. package/dist/gateway/static/root/assets/{model-selector-ksLo-5B_.js → model-selector-DYUnp917.js} +1 -1
  85. package/dist/gateway/static/root/assets/{models-hub-cache-DhZng2nF.js → models-hub-cache-_qE7L-_H.js} +1 -1
  86. package/dist/gateway/static/root/assets/{note-detail-panel-B6RbjwJq.js → note-detail-panel-bjRZesmS.js} +3 -3
  87. package/dist/gateway/static/root/assets/note-image-lightbox-D7Jqb75C.js +1 -0
  88. package/dist/gateway/static/root/assets/{notes-api-DocbsBbT.js → notes-api-Bxa11X3a.js} +1 -1
  89. package/dist/gateway/static/root/assets/{notes-page-B7889s6-.js → notes-page-D2QpJ3WZ.js} +1 -1
  90. package/dist/gateway/static/root/assets/{oauth-api-CCFIPbA0.js → oauth-api-DIE4UpP7.js} +1 -1
  91. package/dist/gateway/static/root/assets/{oauth-provider-connect-GxkF0vWJ.js → oauth-provider-connect-B95tiddN.js} +1 -1
  92. package/dist/gateway/static/root/assets/{page-context-capture-button-CvWLVeRA.js → page-context-capture-button-C-QbbwmN.js} +1 -1
  93. package/dist/gateway/static/root/assets/{page-context-draft-CMRDNv4d.js → page-context-draft-BHmOfksL.js} +1 -1
  94. package/dist/gateway/static/root/assets/page-header-store-bPV8_tKL.js +1 -0
  95. package/dist/gateway/static/root/assets/{personal-avatar-CqNJ48Ge.js → personal-avatar-nXrmMfrV.js} +1 -1
  96. package/dist/gateway/static/root/assets/personal-page-BCwlYT3F.js +1 -0
  97. package/dist/gateway/static/root/assets/{personal-settings-panel-DAcl8DU4.js → personal-settings-panel-vkYmXK8h.js} +1 -1
  98. package/dist/gateway/static/root/assets/{phone-dependencies-card-DLWblGj7.js → phone-dependencies-card-CZDAxTWv.js} +1 -1
  99. package/dist/gateway/static/root/assets/{phone-model-picker-ugrT9GJu.js → phone-model-picker-4Snfs8Hq.js} +1 -1
  100. package/dist/gateway/static/root/assets/{phone-settings-page-DIIt7JOE.js → phone-settings-page-D8HperfA.js} +1 -1
  101. package/dist/gateway/static/root/assets/{phone-workspace-store-mawKT5kV.js → phone-workspace-store-Di9R9Ux5.js} +1 -1
  102. package/dist/gateway/static/root/assets/{plugin-details-dialog-BdueMT3q.js → plugin-details-dialog-DJsDu-_8.js} +1 -1
  103. package/dist/gateway/static/root/assets/{preference-select-fields-CmLZNwbm.js → preference-select-fields-C6abaM3k.js} +1 -1
  104. package/dist/gateway/static/root/assets/{product-automation-feedback-DYwhL37Y.js → product-automation-feedback-C74s9Mjz.js} +1 -1
  105. package/dist/gateway/static/root/assets/product-delivery-DRyD9_Xq.js +1 -0
  106. package/dist/gateway/static/root/assets/{product-open-page-B5G4X71t.js → product-open-page-AbDP5w1c.js} +1 -1
  107. package/dist/gateway/static/root/assets/product-preview-content-CktjvFbc.js +1 -0
  108. package/dist/gateway/static/root/assets/product-preview-modal-CzsqLwB4.js +2 -0
  109. package/dist/gateway/static/root/assets/{project-detail-page-CRJb69vP.js → project-detail-page-Cf3tggGP.js} +2 -2
  110. package/dist/gateway/static/root/assets/{project-understanding-D3w8cZEm.js → project-understanding-jmhFbHch.js} +1 -1
  111. package/dist/gateway/static/root/assets/{projects-page-CkifzKjz.js → projects-page-jMgZiFnO.js} +1 -1
  112. package/dist/gateway/static/root/assets/{providers-api-CKFg2PZQ.js → providers-api-CJBYFKAK.js} +1 -1
  113. package/dist/gateway/static/root/assets/{recording-upload-ZkmRf0GR.js → recording-upload-Dl9a5yOV.js} +1 -1
  114. package/dist/gateway/static/root/assets/{registry-api-B1Mh3bNo.js → registry-api-BwkbPUYu.js} +1 -1
  115. package/dist/gateway/static/root/assets/{remote-access-hub-Dw5rG-aA.js → remote-access-hub-CBQ_bOy9.js} +1 -1
  116. package/dist/gateway/static/root/assets/{resource-unavailable-BUWsH3fp.js → resource-unavailable-35wBZxmz.js} +1 -1
  117. package/dist/gateway/static/root/assets/route-preload-BcA6SPeC.js +2 -0
  118. package/dist/gateway/static/root/assets/{runtime-tools-api-BXvn5ImA.js → runtime-tools-api-BF28JDAO.js} +1 -1
  119. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BALcypHp.js → runtime-tools-settings-panel-Bq2xQ2qd.js} +1 -1
  120. package/dist/gateway/static/root/assets/{service-recommendation-list-CpVUnz89.js → service-recommendation-list-CdaS4MPF.js} +1 -1
  121. package/dist/gateway/static/root/assets/{session-api-VquhIBHI.js → session-api-zJXYlRPt.js} +1 -1
  122. package/dist/gateway/static/root/assets/session-manager-wWxpzSo0.js +23 -0
  123. package/dist/gateway/static/root/assets/{sessions-page-DlvPkE5Y.js → sessions-page-BkjD_dUD.js} +1 -1
  124. package/dist/gateway/static/root/assets/settings-advanced-gate-BUMCEtA_.js +1 -0
  125. package/dist/gateway/static/root/assets/{settings-advanced-section-c9_iZ-46.js → settings-advanced-section-C84IghdL.js} +1 -1
  126. package/dist/gateway/static/root/assets/{settings-mode-store-Dem6-TBe.js → settings-mode-store-CtQBJvbO.js} +1 -1
  127. package/dist/gateway/static/root/assets/{settings-page-B_wNfFQe.js → settings-page-eEIz9InP.js} +1 -1
  128. package/dist/gateway/static/root/assets/{settings-page-header-C8a_oOyw.js → settings-page-header-CsPAYlqV.js} +1 -1
  129. package/dist/gateway/static/root/assets/{settings-page-layout-CTSRWljG.js → settings-page-layout-lPLeJQoV.js} +1 -1
  130. package/dist/gateway/static/root/assets/{setup-status-panel-BNZoqF40.js → setup-status-panel-BSU5WpaE.js} +1 -1
  131. package/dist/gateway/static/root/assets/{share-link-dialog-C5JTTxsy.js → share-link-dialog-NaM6jvIz.js} +1 -1
  132. package/dist/gateway/static/root/assets/{share-preview-page-D-KxzXgm.js → share-preview-page-CHjZn27s.js} +1 -1
  133. package/dist/gateway/static/root/assets/{shares-api-CztKbxdd.js → shares-api-B9rVcV1y.js} +1 -1
  134. package/dist/gateway/static/root/assets/{shares-settings-CzR21j6e.js → shares-settings-5sB15V5v.js} +1 -1
  135. package/dist/gateway/static/root/assets/{skill-api-B7kWl6LK.js → skill-api-D6zVfEuK.js} +1 -1
  136. package/dist/gateway/static/root/assets/{skill-list-api-Cn07P6qZ.js → skill-list-api-SLmTBYF5.js} +1 -1
  137. package/dist/gateway/static/root/assets/{skill-reload-api-Bhl0u16_.js → skill-reload-api-UQkq2orI.js} +1 -1
  138. package/dist/gateway/static/root/assets/{skills-page-BmkuxHZe.js → skills-page-Ca0pYZ4i.js} +1 -1
  139. package/dist/gateway/static/root/assets/{system-settings-panel-Ce6zIcki.js → system-settings-panel-BARWbjRN.js} +1 -1
  140. package/dist/gateway/static/root/assets/{task-detail-page-CysJhG3B.js → task-detail-page-roqAsGue.js} +2 -2
  141. package/dist/gateway/static/root/assets/{task-result-evidence-CGZKMnNo.js → task-result-evidence-Bb1F7nAM.js} +1 -1
  142. package/dist/gateway/static/root/assets/{terminal-panel-store-YwLUkuyV.js → terminal-panel-store-DYDeXXAg.js} +1 -1
  143. package/dist/gateway/static/root/assets/{theme-store-DOJ9tu-j.js → theme-store-DbStcH89.js} +1 -1
  144. package/dist/gateway/static/root/assets/{tracing-settings-page-BplBpTdL.js → tracing-settings-page-YfkNCxbP.js} +1 -1
  145. package/dist/gateway/static/root/assets/{tunnel-api-B5-Ypvqa.js → tunnel-api-BK_ivyIb.js} +1 -1
  146. package/dist/gateway/static/root/assets/{understanding-activity-store-CmwtE8Kd.js → understanding-activity-store-p7Z7oq8z.js} +1 -1
  147. package/dist/gateway/static/root/assets/{understanding-refresh-store-9apSmAVL.js → understanding-refresh-store-D-U6rcwZ.js} +1 -1
  148. package/dist/gateway/static/root/assets/{usage-page-cPbirpXX.js → usage-page-URFSiswS.js} +1 -1
  149. package/dist/gateway/static/root/assets/{use-autosave-B3p2QWaF.js → use-autosave-B7cbumro.js} +1 -1
  150. package/dist/gateway/static/root/assets/{use-composer-attachments-D-AEYC85.js → use-composer-attachments-DAtiwLsE.js} +1 -1
  151. package/dist/gateway/static/root/assets/{use-file-preview-expanded-CO4SC-LX.js → use-file-preview-expanded-B8erpWsX.js} +2 -2
  152. package/dist/gateway/static/root/assets/{use-personal-profile-DocmhC9I.js → use-personal-profile-DDW29nm-.js} +1 -1
  153. package/dist/gateway/static/root/assets/{use-workspace-tree-VraTGKx-.js → use-workspace-tree-DCoTf22f.js} +1 -1
  154. package/dist/gateway/static/root/assets/{user-model-page-DuRALzhe.js → user-model-page-DSV5NkNj.js} +1 -1
  155. package/dist/gateway/static/root/assets/{voice-api-key-field-DbSQHZZW.js → voice-api-key-field-DzYdJZN4.js} +1 -1
  156. package/dist/gateway/static/root/assets/{voice-config-api-D9iNJSvm.js → voice-config-api-wotvT6Hw.js} +1 -1
  157. package/dist/gateway/static/root/assets/{voice-input-shortcut-events-hso9_VvT.js → voice-input-shortcut-events-BI6PuiIB.js} +1 -1
  158. package/dist/gateway/static/root/assets/voice-transcribe-api-DAK9eLRr.js +1 -0
  159. package/dist/gateway/static/root/assets/{work-discovery-overlay-fsL9RJqB.js → work-discovery-overlay-BzmB9Rub.js} +1 -1
  160. package/dist/gateway/static/root/assets/{work-discovery-page-DAQPKVDs.js → work-discovery-page-CmGjxUIT.js} +1 -1
  161. package/dist/gateway/static/root/assets/{working-directory-picker-modal-Ta73QrNw.js → working-directory-picker-modal-B-EHm52-.js} +1 -1
  162. package/dist/gateway/static/root/assets/{workspace-api-CgrcNyBc.js → workspace-api-uhiEMPpK.js} +2 -2
  163. package/dist/gateway/static/root/assets/workspace-editor-agent-store-DrPVyikA.js +1 -0
  164. package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-B7uBuPtA.js → workspace-file-preview-dialog-BDm06MZm.js} +1 -1
  165. package/dist/gateway/static/root/assets/{workspace-open-location-menu-Bi2vRvaQ.js → workspace-open-location-menu-Bv83uoqu.js} +1 -1
  166. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CCOOBG-7.js → xopc-cloud-account-card-Cd5GdpGL.js} +1 -1
  167. package/dist/gateway/static/root/index.html +84 -84
  168. package/dist/gateway/static/root/notification-sw.js +21 -7
  169. package/dist/package.js +1 -1
  170. package/dist/packages/endpoint-tools-protocol/src/context.js +115 -0
  171. package/dist/packages/endpoint-tools-protocol/src/index.js +4 -0
  172. package/dist/packages/endpoint-tools-protocol/src/location-sharing.js +51 -0
  173. package/dist/packages/gateway-contract/src/gateway-scopes.js +5 -1
  174. package/dist/packages/gateway-contract/src/index.js +2 -0
  175. package/dist/packages/gateway-contract/src/phone-workspace.js +6 -0
  176. package/dist/packages/gateway-contract/src/product-delivery.js +9 -3
  177. package/dist/src/agent/embedded/external-tool-discovery.js +1 -1
  178. package/dist/src/agent/embedded/run-for-session.js +2 -2
  179. package/dist/src/agent/embedded/run-turn.js +72 -9
  180. package/dist/src/agent/embedded/session-runner.js +2 -1
  181. package/dist/src/agent/embedded/types.d.ts +1 -1
  182. package/dist/src/agent/prompt/system-prompt.js +1 -0
  183. package/dist/src/agent/service/direct-turn-helpers.d.ts +0 -7
  184. package/dist/src/agent/service/direct-turn-helpers.js +3 -2
  185. package/dist/src/agent/service/process-direct-streaming.js +2 -1
  186. package/dist/src/agent/source-context/device-environment.d.ts +3 -0
  187. package/dist/src/agent/source-context/device-environment.js +38 -0
  188. package/dist/src/agent/source-context/injector.js +2 -1
  189. package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
  190. package/dist/src/agent/tool-manuals/phone.js +1 -1
  191. package/dist/src/agent/tools/automation-tool.js +3 -2
  192. package/dist/src/agent/tools/factory.js +1 -1
  193. package/dist/src/agent/tools/personal-read-tool.js +1 -1
  194. package/dist/src/agent/tools/phone-use-tool.js +46 -2
  195. package/dist/src/agent/tools/xopc-use-tool.js +1 -0
  196. package/dist/src/computer/runtime.d.ts +1 -1
  197. package/dist/src/config/schema.d.ts +1 -0
  198. package/dist/src/endpoint-tools/context-store.d.ts +29 -0
  199. package/dist/src/endpoint-tools/context-store.js +138 -0
  200. package/dist/src/endpoint-tools/location-sharing.d.ts +42 -0
  201. package/dist/src/endpoint-tools/location-sharing.js +203 -0
  202. package/dist/src/endpoint-tools/runtime.d.ts +4 -0
  203. package/dist/src/endpoint-tools/runtime.js +8 -0
  204. package/dist/src/endpoint-tools/turn-context.d.ts +2 -1
  205. package/dist/src/endpoint-tools/turn-context.js +4 -2
  206. package/dist/src/gateway/hono/middleware/auth.js +1 -1
  207. package/dist/src/gateway/hono/routes/devices.js +1 -0
  208. package/dist/src/gateway/hono/routes/endpoint-compatibility.js +4 -0
  209. package/dist/src/gateway/hono/routes/endpoint-environment.d.ts +3 -0
  210. package/dist/src/gateway/hono/routes/endpoint-environment.js +98 -0
  211. package/dist/src/gateway/hono/routes/endpoint-tools.js +1 -0
  212. package/dist/src/gateway/hono/routes/lazy-bundles.js +16 -0
  213. package/dist/src/gateway/hono/routes/location-sharing.d.ts +3 -0
  214. package/dist/src/gateway/hono/routes/location-sharing.js +164 -0
  215. package/dist/src/gateway/hono/routes/phone.js +246 -34
  216. package/dist/src/gateway/hono/routes/session-command-handler.js +1 -1
  217. package/dist/src/gateway/hono/routes/session-input-handler.js +2 -1
  218. package/dist/src/gateway/hono/routes/tunnel.js +10 -0
  219. package/dist/src/gateway/security/gateway-scopes.js +6 -0
  220. package/dist/src/gateway/security/phone-access.d.ts +4 -0
  221. package/dist/src/gateway/security/phone-access.js +20 -0
  222. package/dist/src/gateway/service/agent-runner.js +3 -1
  223. package/dist/src/gateway/service/config-coordinator.d.ts +1 -0
  224. package/dist/src/gateway/service/run-gateway-agent.js +2 -1
  225. package/dist/src/gateway/service/session-input-coordinator.d.ts +3 -0
  226. package/dist/src/gateway/service/session-input-coordinator.js +50 -2
  227. package/dist/src/gateway/service.d.ts +1 -0
  228. package/dist/src/gateway/service.js +8 -0
  229. package/dist/src/gateway/session-reset-service.js +4 -0
  230. package/dist/src/notifications/planner.js +6 -6
  231. package/dist/src/phone/assistance-service.d.ts +6 -0
  232. package/dist/src/phone/assistance-service.js +32 -0
  233. package/dist/src/phone/assistance.d.ts +40 -0
  234. package/dist/src/phone/assistance.js +273 -0
  235. package/dist/src/phone/cloud-phones.d.ts +5 -0
  236. package/dist/src/phone/cloud-phones.js +14 -0
  237. package/dist/src/phone/contracts.d.ts +7 -1
  238. package/dist/src/phone/contracts.js +5 -0
  239. package/dist/src/phone/environment-adapter.d.ts +3 -0
  240. package/dist/src/phone/environment-adapter.js +11 -0
  241. package/dist/src/phone/location-baseline-store.d.ts +9 -0
  242. package/dist/src/phone/location-baseline-store.js +61 -0
  243. package/dist/src/phone/location-environment.d.ts +61 -0
  244. package/dist/src/phone/location-environment.js +157 -0
  245. package/dist/src/phone/model-adapter.js +16 -5
  246. package/dist/src/phone/runtime.d.ts +17 -2
  247. package/dist/src/phone/runtime.js +203 -20
  248. package/dist/src/phone/stream-gateway.d.ts +5 -0
  249. package/dist/src/phone/stream-gateway.js +85 -51
  250. package/dist/src/phone/wuying-location.d.ts +18 -0
  251. package/dist/src/phone/wuying-location.js +86 -0
  252. package/dist/src/storage/sqlite/device-access-repository.d.ts +4 -0
  253. package/dist/src/storage/sqlite/device-access-repository.js +18 -1
  254. package/dist/src/tunnel/broker-client.d.ts +8 -0
  255. package/dist/src/tunnel/broker-client.js +18 -1
  256. package/dist/src/voice/realtime/runtime.js +1 -1
  257. package/package.json +4 -3
  258. package/dist/gateway/static/root/assets/app-link-CytZ5zkp.js +0 -1
  259. package/dist/gateway/static/root/assets/automation-display-BlGt8MAC.js +0 -2
  260. package/dist/gateway/static/root/assets/automation-task-card-Cp3RIw5d.js +0 -2
  261. package/dist/gateway/static/root/assets/automations-workspace-CXLu04I-.js +0 -9
  262. package/dist/gateway/static/root/assets/chat-page-CT3K7lFT.js +0 -71
  263. package/dist/gateway/static/root/assets/date-picker-ByTasrfl.js +0 -1
  264. package/dist/gateway/static/root/assets/device-pairing-wizard-BKMpLdIA.js +0 -1
  265. package/dist/gateway/static/root/assets/gateway-realtime-store-0gmDfPeP.js +0 -1
  266. package/dist/gateway/static/root/assets/index-6vVrWfwM.js +0 -11
  267. package/dist/gateway/static/root/assets/index-DDGK6klk.css +0 -1
  268. package/dist/gateway/static/root/assets/management-settings-CuSzixOw.js +0 -1
  269. package/dist/gateway/static/root/assets/note-image-lightbox-BCjvBqwy.js +0 -1
  270. package/dist/gateway/static/root/assets/page-header-store-reh1es-3.js +0 -1
  271. package/dist/gateway/static/root/assets/personal-page-D95FHaw9.js +0 -1
  272. package/dist/gateway/static/root/assets/product-delivery-BU_H84jL.js +0 -1
  273. package/dist/gateway/static/root/assets/product-preview-content-BUheyLqt.js +0 -1
  274. package/dist/gateway/static/root/assets/product-preview-modal-Cj_Zxu4G.js +0 -2
  275. package/dist/gateway/static/root/assets/route-preload-CRKbVwQ1.js +0 -2
  276. package/dist/gateway/static/root/assets/session-manager-DNMosCtW.js +0 -23
  277. package/dist/gateway/static/root/assets/settings-advanced-gate-Ckc1aCLG.js +0 -1
  278. package/dist/gateway/static/root/assets/voice-transcribe-api-BqIs0jgv.js +0 -1
  279. package/dist/gateway/static/root/assets/workspace-editor-agent-store-Dw6wtadX.js +0 -1
@@ -0,0 +1,20 @@
1
+ import { getDevice, isDeviceAccessSessionActive } from "../../storage/sqlite/device-access-repository.js";
2
+ import { PhoneError, init_contracts } from "../../phone/contracts.js";
3
+ //#region src/gateway/security/phone-access.ts
4
+ init_contracts();
5
+ function phoneAdministrator(principal) {
6
+ return principal.kind !== "device" && principal.scopes.includes("gateway.admin");
7
+ }
8
+ /** Reload mutable device grants even for already established streams. */
9
+ function authorizePhoneAccess(principal, control = false) {
10
+ if (phoneAdministrator(principal)) return;
11
+ const device = principal.deviceId ? getDevice(principal.deviceId) : void 0;
12
+ if (principal.kind !== "device" || !device || device.platform === "chrome" || !principal.accessSessionId || !isDeviceAccessSessionActive(device.id, principal.accessSessionId)) throw new PhoneError("PHONE_ACCESS_REVOKED", "Phone access is unavailable for this device", 403);
13
+ if (![
14
+ "sessions.read",
15
+ "phone.view",
16
+ ...control ? ["sessions.write", "phone.control"] : []
17
+ ].every((scope) => device.scopes.includes(scope))) throw new PhoneError("PHONE_PERMISSION_REQUIRED", "Authorize phone access in Gateway device settings", 403);
18
+ }
19
+ //#endregion
20
+ export { authorizePhoneAccess, phoneAdministrator };
@@ -15,6 +15,7 @@ import { TaskCollaborationRepository } from "../../tasks/task-collaboration-repo
15
15
  import { reserveEmbeddedRunCancellation } from "../../agent/embedded/runs.js";
16
16
  import { TaskApplicationService } from "../../tasks/task-application-service.js";
17
17
  import { EphemeralClarificationWaiter } from "../ephemeral-clarification-waiter.js";
18
+ import { completePhoneAssistanceFromUser, preparePhoneContinuation } from "../../phone/assistance-service.js";
18
19
  import { describeActiveExecution } from "./active-execution.js";
19
20
  import { runGatewayAgent } from "./run-gateway-agent.js";
20
21
  import { NextTurnSuggestionService } from "../next-turn-suggestions/service.js";
@@ -67,9 +68,10 @@ var GatewayAgentRunner = class {
67
68
  });
68
69
  });
69
70
  this.inputs = new SessionInputCoordinator({
70
- beforeExecute: opts.validateConnectionResume,
71
+ beforeExecute: async (input) => (await opts.validateConnectionResume?.(input) ?? true) && await preparePhoneContinuation(input, opts.getConfig()),
71
72
  continueConnection: opts.continueConnection,
72
73
  cancelConnection: opts.cancelConnection,
74
+ completePhone: (wait) => completePhoneAssistanceFromUser(wait, opts.getConfig()),
73
75
  prioritizeInput: (input) => (input.origin.type !== "system" || input.origin.source === "cli") && isPersonalConversation(input.conversationId),
74
76
  interrupt: async (conversationId, runId, reason) => {
75
77
  const execution = this.activeExecutionBySession.get(conversationId);
@@ -330,6 +330,7 @@ export declare class GatewayConfigCoordinator {
330
330
  hierarchicalPlanning: boolean;
331
331
  maxActionsPerSession: number;
332
332
  maxModelRequests: number;
333
+ modelRequestTimeoutMs: number;
333
334
  maxOperationDurationMs: number;
334
335
  maxSessionDurationMs: number;
335
336
  idleDisconnectMs: number;
@@ -13,6 +13,7 @@ import { getConversationRouting } from "../../storage/sqlite/conversation-reposi
13
13
  import { init_session_key } from "../../routing/session-key.js";
14
14
  import { resolveAgentTurnTimeoutMs } from "../../agent/orchestration/run-agent-turn-with-timeout.js";
15
15
  import { isPersonalConversation } from "../../personal-agent/repository.js";
16
+ import { isPhoneAssistanceSuspended } from "../../phone/assistance.js";
16
17
  import { recordPersonalPerformance } from "../../personal-agent/performance.js";
17
18
  import { resolveExecutionContext } from "../../tasks/execution-context.js";
18
19
  import { TaskRunCoordinator } from "../../tasks/task-run-coordinator.js";
@@ -224,7 +225,7 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
224
225
  for await (const event of coalesceThinkingDeltas(mappedEvents)) yield* emitAndYield([event]);
225
226
  const connectionSuspended = isConnectionSuspended(conversationId, runId);
226
227
  const clarificationSuspended = isClarificationSuspended(conversationId, runId);
227
- const suspended = connectionSuspended || clarificationSuspended;
228
+ const suspended = connectionSuspended || clarificationSuspended || isPhoneAssistanceSuspended(conversationId, runId);
228
229
  const cancelled = mergedSignal.aborted || embeddedAborted;
229
230
  const endStatus = cancelled ? "cancelled" : suspended ? "suspended" : streamError ? "error" : "success";
230
231
  const endSummary = cancelled ? "Interrupted" : connectionSuspended ? "Waiting for connection" : clarificationSuspended ? "Waiting for user input" : streamError ?? "Message processed successfully";
@@ -1,3 +1,4 @@
1
+ import { type PhoneAssistance } from '../../phone/assistance.js';
1
2
  import type { TurnOrigin } from '@xopcai/endpoint-tools-protocol';
2
3
  import type { ConnectionWait } from '@xopcai/gateway-contract';
3
4
  import { type SessionInput } from '../../storage/sqlite/session-input-repository.js';
@@ -36,6 +37,7 @@ export declare class SessionInputCoordinator {
36
37
  beforeExecute?: (input: SessionInput) => Promise<boolean>;
37
38
  continueConnection?: (wait: ConnectionWait, idempotencyKey: string) => Promise<void>;
38
39
  cancelConnection?: (wait: ConnectionWait) => void;
40
+ completePhone?: (wait: PhoneAssistance) => Promise<void>;
39
41
  sessionExists: (conversationId: string) => Promise<boolean>;
40
42
  execute: (input: {
41
43
  inputReceivedAtMs?: number;
@@ -58,6 +60,7 @@ export declare class SessionInputCoordinator {
58
60
  });
59
61
  isAcceptingInput(conversationId: string): boolean;
60
62
  snapshot(conversationId: string): SessionInputState;
63
+ resumePhone(conversationId: string, waitId: string): void;
61
64
  private connectionTarget;
62
65
  prepareInput(input: SubmitSessionInput): Promise<{
63
66
  payload?: import("../../storage/sqlite/session-input-repository.js").SessionInputPayload;
@@ -10,6 +10,7 @@ import { cancelConnectionObjective, consumeConnectionResume, getActiveConnection
10
10
  import { appendTranscriptEntry } from "../../storage/sqlite/transcript-repository.js";
11
11
  import "../../storage/sqlite/index.js";
12
12
  import { emitSessionTranscriptUpdate } from "../../session/transcript-events.js";
13
+ import { consumePhoneAssistance, finishPhoneAssistance, phoneAssistance, queuePhoneAssistance, reconcilePhoneAssistance } from "../../phone/assistance.js";
13
14
  import { summarizeSourceContext } from "../../agent/source-context/types.js";
14
15
  import { TaskApplicationService } from "../../tasks/task-application-service.js";
15
16
  import { injectSourceContextsIntoUserMessage } from "../../agent/source-context/injector.js";
@@ -91,6 +92,11 @@ var SessionInputCoordinator = class {
91
92
  snapshot(conversationId) {
92
93
  return getSessionInputState(conversationId);
93
94
  }
95
+ resumePhone(conversationId, waitId) {
96
+ queuePhoneAssistance(conversationId, waitId);
97
+ this.publish(conversationId);
98
+ this.drain(conversationId);
99
+ }
94
100
  connectionTarget(conversationId, runtime = this.snapshot(conversationId)) {
95
101
  const active = runtime.activeInputId ? getSessionInputById(conversationId, runtime.activeInputId) : void 0;
96
102
  return getActiveConnectionWait(conversationId) ?? (active?.kind === "connection_resume" && active.payload ? getConnectionWait(active.payload.waitId) : void 0);
@@ -346,6 +352,41 @@ var SessionInputCoordinator = class {
346
352
  };
347
353
  }
348
354
  const runtime = this.snapshot(conversationId);
355
+ const phoneWait = phoneAssistance(conversationId);
356
+ if (/^(?:我已(?:完成|登录|登陆|输入验证码)[,,、\s]*(?:请)?继续(?:原任务|任务)?|(?:登录|登陆|验证码|手机操作)(?:已)?完成[了]?[,,、\s]*(?:请)?继续(?:原任务|任务)?|好了[,,、\s]*继续(?:原任务|任务)?|(?:i(?: have|'ve) )?(?:logged in|finished on the phone|completed the phone action)[,\s]+(?:please )?(?:continue|resume)(?: the task)?)[。.!!\s]*$/iu.test(content) && phoneWait?.status === "open" && this.deps.completePhone && input.origin.type !== "system" && !attachments?.length && !input.contextRefs?.length && !getActiveConnectionWait(conversationId) && !getActiveClarification(conversationId)) {
357
+ if (input.expectedTranscriptId && input.expectedTranscriptId !== phoneWait.transcriptId) return {
358
+ ok: false,
359
+ code: "SESSION_CHANGED"
360
+ };
361
+ await this.deps.completePhone(phoneWait);
362
+ runSqliteWriteTransaction(() => {
363
+ const row = insertSessionInput({
364
+ id: crypto.randomUUID(),
365
+ conversationId,
366
+ clientMessageId,
367
+ expectedTranscriptId: phoneWait.transcriptId,
368
+ content,
369
+ requestedDelivery: "next",
370
+ effectiveDelivery: "next",
371
+ status: "queued",
372
+ origin: input.origin
373
+ });
374
+ queuePhoneAssistance(conversationId, phoneWait.id);
375
+ appendTranscriptEntry(conversationId, {
376
+ role: "user",
377
+ content,
378
+ timestamp: row.createdAtMs
379
+ });
380
+ setSessionInputStatus(row.id, "completed");
381
+ });
382
+ emitSessionTranscriptUpdate({ conversationId });
383
+ this.drain(conversationId);
384
+ return {
385
+ ok: true,
386
+ effectiveDelivery: "next",
387
+ state: this.publish(conversationId)
388
+ };
389
+ }
349
390
  const wait = this.connectionTarget(conversationId, runtime);
350
391
  const control = wait?.principalId === "local-owner" ? connectionControl(input, wait) : void 0;
351
392
  const payload = connectionInputPayload(wait, control);
@@ -436,7 +477,7 @@ var SessionInputCoordinator = class {
436
477
  this.publish(conversationId);
437
478
  continue;
438
479
  }
439
- allowed = allowed && consumeConnectionResume(input) && consumeClarificationResume(input);
480
+ allowed = allowed && consumeConnectionResume(input) && consumeClarificationResume(input) && consumePhoneAssistance(input);
440
481
  } catch (err) {
441
482
  log.warn({
442
483
  err,
@@ -444,6 +485,7 @@ var SessionInputCoordinator = class {
444
485
  runId,
445
486
  inputId: input.id
446
487
  }, "Session input preflight failed");
488
+ finishPhoneAssistance(input, false);
447
489
  finishSessionInputRun(conversationId, runId, "failed", "Input preflight failed");
448
490
  if (input.kind === "connection_resume") reconcileConnectionWaits();
449
491
  this.publish(conversationId);
@@ -451,6 +493,7 @@ var SessionInputCoordinator = class {
451
493
  }
452
494
  if (!allowed) {
453
495
  finishSessionInputRun(conversationId, runId, "cancelled");
496
+ finishPhoneAssistance(input, false);
454
497
  this.publish(conversationId);
455
498
  continue;
456
499
  }
@@ -513,6 +556,7 @@ var SessionInputCoordinator = class {
513
556
  }
514
557
  const terminal = cancelled ? "cancelled" : result.status === "suspended" ? "suspended" : result.status === "ok" ? "completed" : result.status === "aborted" ? "cancelled" : "failed";
515
558
  finishSessionInputRun(conversationId, runId, terminal, terminal === "failed" ? result.summary : void 0);
559
+ finishPhoneAssistance(input, terminal === "completed");
516
560
  this.publish(conversationId);
517
561
  }
518
562
  } finally {
@@ -664,7 +708,11 @@ var SessionInputCoordinator = class {
664
708
  recover() {
665
709
  const interrupted = recoverSessionInputState();
666
710
  new TaskRunRepository().reconcileCancelledRuns();
667
- for (const conversationId of new Set([...interrupted, ...reconcileConnectionWaits(true)])) {
711
+ for (const conversationId of new Set([
712
+ ...interrupted,
713
+ ...reconcileConnectionWaits(true),
714
+ ...reconcilePhoneAssistance()
715
+ ])) {
668
716
  this.publish(conversationId);
669
717
  this.drain(conversationId);
670
718
  }
@@ -155,6 +155,7 @@ export declare class GatewayService {
155
155
  ok: false;
156
156
  code: "BAD_REQUEST" | "QUEUE_FULL" | "CONTEXT_UNAVAILABLE" | "SESSION_CHANGED";
157
157
  }>;
158
+ resumePhoneAssistance(conversationId: string, waitId: string): void;
158
159
  withSessionInputSubmission<T>(conversationId: string, operation: () => Promise<T>): Promise<T>;
159
160
  prepareSessionCommandInput(input: Parameters<GatewayAgentRunner['inputs']['prepareInput']>[0]): Promise<{
160
161
  payload?: import("../storage/sqlite/session-input-repository.js").SessionInputPayload;
@@ -1093,6 +1093,9 @@ var GatewayService = class {
1093
1093
  submitSessionInput(...args) {
1094
1094
  return this.agentRunner.submitSessionInput(...args);
1095
1095
  }
1096
+ resumePhoneAssistance(conversationId, waitId) {
1097
+ this.agentRunner.inputs.resumePhone(conversationId, waitId);
1098
+ }
1096
1099
  withSessionInputSubmission(conversationId, operation) {
1097
1100
  return this.agentRunner.inputs.withSubmission(conversationId, operation);
1098
1101
  }
@@ -1320,6 +1323,10 @@ var GatewayService = class {
1320
1323
  await this.localApps.recoverPendingReleases();
1321
1324
  const { recoverCapabilityImports } = await import("../imports/runtime.js");
1322
1325
  await recoverCapabilityImports();
1326
+ if (getSqliteDatabase().prepare("SELECT 1 FROM durable_state WHERE namespace = 'phone.location-environment' LIMIT 1").get()) {
1327
+ const { getPhoneRuntime } = await import("../phone/runtime.js");
1328
+ getPhoneRuntime().environment.sweep().catch(() => log.warn({ phase: "phone_location_recovery" }, "Phone location recovery remains pending"));
1329
+ }
1323
1330
  this.createNotificationService().start();
1324
1331
  this.startTime = Date.now();
1325
1332
  this.running = true;
@@ -1631,6 +1638,7 @@ var GatewayService = class {
1631
1638
  log.debug("Stopping gateway service...");
1632
1639
  await this._workDiscovery?.stop();
1633
1640
  this.readiness.markStarting();
1641
+ await this.endpointTools.locations.close();
1634
1642
  this.endpointTools.close();
1635
1643
  await this.sideChats.disposeAll();
1636
1644
  this.homeIntelligenceHost?.stop();
@@ -1,6 +1,8 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { isPersonalConversation } from "../personal-agent/repository.js";
4
+ import { cancelPhoneAssistance } from "../phone/assistance.js";
5
+ import { getPhoneRuntime } from "../phone/runtime.js";
4
6
  import { abortEmbeddedRun } from "../agent/embedded/runs.js";
5
7
  //#region src/gateway/session-reset-service.ts
6
8
  init_logger();
@@ -26,6 +28,8 @@ async function performSessionReset(conversationId, deps) {
26
28
  ok: false,
27
29
  error: "Session not found"
28
30
  };
31
+ cancelPhoneAssistance(key);
32
+ await getPhoneRuntime().stop(key, "cancel");
29
33
  try {
30
34
  deps.getAgentService().evictSessionAgent(key);
31
35
  } catch (err) {
@@ -136,15 +136,15 @@ function automationPlan(payload) {
136
136
  },
137
137
  priority: completed ? "normal" : "high",
138
138
  title: completed ? {
139
- en: "Automation completed",
140
- zh: "自动化已完成"
139
+ en: `${run.automationName} · Completed`,
140
+ zh: `${run.automationName} · 已完成`
141
141
  } : {
142
- en: "Automation needs attention",
143
- zh: "自动化需要处理"
142
+ en: `${run.automationName} · Needs attention`,
143
+ zh: `${run.automationName} · 需要处理`
144
144
  },
145
145
  body: {
146
- en: (run.error || run.summary || run.automationName).slice(0, 180),
147
- zh: (run.error || run.summary || run.automationName).slice(0, 180)
146
+ en: completed ? (run.summary || run.automationName).slice(0, 180) : "This run did not finish. Open it to see the reason and fix it in chat.",
147
+ zh: completed ? (run.summary || run.automationName).slice(0, 180) : "这次运行未完成,打开查看原因,或通过对话修复。"
148
148
  },
149
149
  payload: {
150
150
  automationId: run.automationId,
@@ -0,0 +1,6 @@
1
+ import type { Config } from '../config/schema.js';
2
+ import type { SessionInput } from '../storage/sqlite/session-input-repository.js';
3
+ import { type PhoneAssistance } from './assistance.js';
4
+ import { type PhoneRuntime } from './runtime.js';
5
+ export declare function completePhoneAssistanceFromUser(wait: PhoneAssistance, config: Config, runtime?: PhoneRuntime): Promise<void>;
6
+ export declare function preparePhoneContinuation(input: SessionInput, config: Config, runtime?: PhoneRuntime): Promise<boolean>;
@@ -0,0 +1,32 @@
1
+ import { getSessionMetadata } from "../storage/sqlite/session-read-repository.js";
2
+ import { init_session_repository } from "../storage/sqlite/session-repository.js";
3
+ import { PhoneError, init_contracts } from "./contracts.js";
4
+ import { phoneAssistance } from "./assistance.js";
5
+ import { getPhoneRuntime, phoneExecutionContext } from "./runtime.js";
6
+ import { randomUUID } from "node:crypto";
7
+ //#region src/phone/assistance-service.ts
8
+ init_session_repository();
9
+ init_contracts();
10
+ async function completePhoneAssistanceFromUser(wait, config, runtime = getPhoneRuntime()) {
11
+ if (getSessionMetadata(wait.conversationId)?.agentId !== wait.checkpoint.report.agentId) throw new PhoneError("PHONE_ACCESS_CHANGED", "The conversation Agent changed", 409);
12
+ const context = phoneExecutionContext(config, wait.checkpoint.report.agentId);
13
+ await runtime.restoreAssistance(wait.checkpoint, context, void 0, wait.id);
14
+ await runtime.completeAssistanceForUser(wait.conversationId, context);
15
+ }
16
+ async function preparePhoneContinuation(input, config, runtime = getPhoneRuntime()) {
17
+ if (!input.clientMessageId.startsWith("phone-assistance:")) return true;
18
+ const wait = phoneAssistance(input.conversationId);
19
+ if (!wait || wait.queuedInputId !== input.id || wait.status !== "queued") return false;
20
+ if (getSessionMetadata(input.conversationId)?.agentId !== wait.checkpoint.report.agentId) throw new PhoneError("PHONE_ACCESS_CHANGED", "The conversation Agent changed. Inspect the original task before continuing.", 409);
21
+ const context = phoneExecutionContext(config, wait.checkpoint.report.agentId);
22
+ const report = await runtime.restoreAssistance(wait.checkpoint, context, void 0, wait.id);
23
+ if (report.controlOwner === "human") throw new PhoneError("PHONE_PAUSED", "The user is still operating the phone. Finish and continue again.", 409);
24
+ if (report.status === "needs_user" || report.status === "paused") await runtime.liveControl(input.conversationId, report.sessionId, context, `phone-resume:${wait.id}`, {
25
+ op: "handback",
26
+ epoch: report.controlEpoch,
27
+ operationId: randomUUID()
28
+ });
29
+ return true;
30
+ }
31
+ //#endregion
32
+ export { completePhoneAssistanceFromUser, preparePhoneContinuation };
@@ -0,0 +1,40 @@
1
+ import { type SessionInput } from '../storage/sqlite/session-input-repository.js';
2
+ import { type PhoneReport, type PhoneTaskContract } from './contracts.js';
3
+ export type PhoneCheckpoint = {
4
+ report: Pick<PhoneReport, 'sessionId' | 'deviceId' | 'deviceName' | 'owner' | 'agentId' | 'modelRef' | 'executionMode'>;
5
+ deviceRevision: number;
6
+ task: PhoneTaskContract;
7
+ usage: {
8
+ actions: number;
9
+ modelRequests: number;
10
+ activeDurationMs: number;
11
+ };
12
+ };
13
+ export type PhoneAssistance = {
14
+ id: string;
15
+ conversationId: string;
16
+ transcriptId: string;
17
+ originRunId: string;
18
+ toolCallId: string;
19
+ checkpoint: PhoneCheckpoint;
20
+ version: number;
21
+ createdAt: number;
22
+ status: 'open' | 'queued' | 'resuming' | 'completed' | 'cancelled';
23
+ queuedInputId?: string;
24
+ taskRunId?: string;
25
+ objectiveInputId?: string;
26
+ };
27
+ export declare function phoneAssistance(conversationId: string): PhoneAssistance | undefined;
28
+ export declare function pendingPhoneAssistance(): PhoneAssistance[];
29
+ export declare function isPhoneAssistanceSuspended(conversationId: string, runId: string): boolean;
30
+ export declare function requirePhoneAssistance(conversationId: string, runId: string, toolCallId: string, checkpoint: PhoneCheckpoint): PhoneAssistance;
31
+ export declare function cancelPhoneAssistance(conversationId: string): void;
32
+ /** The wait and its deduplicated continuation commit together, even while the old run is closing. */
33
+ export declare function queuePhoneAssistance(conversationId: string, waitId: string): PhoneAssistance;
34
+ export declare function consumePhoneAssistance(input: SessionInput): boolean;
35
+ export declare function updatePhoneCheckpoint(conversationId: string, checkpoint: PhoneCheckpoint): void;
36
+ export declare function phoneResumeForRun(conversationId: string, runId: string): PhoneAssistance | undefined;
37
+ /** Interrupted continuations require another explicit handback, never automatic replay after restart. */
38
+ export declare function reconcilePhoneAssistance(): string[];
39
+ export declare function finishPhoneAssistance(input: SessionInput, succeeded: boolean): void;
40
+ export declare function phoneAssistanceReport(wait: PhoneAssistance): PhoneReport;
@@ -0,0 +1,273 @@
1
+ import { init_connection, isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
2
+ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
3
+ import { init_session_instance_repository, readCurrentTranscriptId } from "../storage/sqlite/session-instance-repository.js";
4
+ import { findSessionInputByRunId, getSessionInputById, init_session_input_repository, insertSessionInput } from "../storage/sqlite/session-input-repository.js";
5
+ import { TaskRunRepository, init_task_run_repository } from "../tasks/task-run-repository.js";
6
+ import { PhoneError, init_contracts } from "./contracts.js";
7
+ import { DurableState } from "../storage/sqlite/durable-state.js";
8
+ import { randomUUID } from "node:crypto";
9
+ //#region src/phone/assistance.ts
10
+ init_connection();
11
+ init_transaction();
12
+ init_session_instance_repository();
13
+ init_session_input_repository();
14
+ init_contracts();
15
+ init_task_run_repository();
16
+ const waits = new DurableState("phone.assistance");
17
+ function markTaskWaiting(wait) {
18
+ if (!wait.taskRunId) return;
19
+ const runs = new TaskRunRepository();
20
+ const run = runs.get(wait.taskRunId);
21
+ if (run?.status !== "running") return;
22
+ if (!runs.listActiveWaits(run.taskId).some((item) => item.taskRunId === run.id && item.condition.phoneTaskId === wait.checkpoint.task.taskId)) runs.createWait({
23
+ taskId: run.taskId,
24
+ taskRunId: run.id,
25
+ kind: "user_input",
26
+ reason: "Phone requires manual operation",
27
+ condition: {
28
+ phoneAssistanceId: wait.id,
29
+ phoneTaskId: wait.checkpoint.task.taskId
30
+ }
31
+ });
32
+ runs.setStatus({
33
+ runId: run.id,
34
+ expectedVersion: run.version,
35
+ from: ["running"],
36
+ to: "waiting",
37
+ actor: { kind: "system" }
38
+ });
39
+ }
40
+ function phoneAssistance(conversationId) {
41
+ if (!isXopcDatabaseOpen()) return void 0;
42
+ const wait = waits.get(conversationId);
43
+ if (wait && readCurrentTranscriptId(getSqliteDatabase(), conversationId) !== wait.transcriptId) {
44
+ waits.delete(conversationId);
45
+ return;
46
+ }
47
+ return wait;
48
+ }
49
+ function pendingPhoneAssistance() {
50
+ return isXopcDatabaseOpen() ? waits.values().filter((wait) => ["open", "queued"].includes(wait.status) && phoneAssistance(wait.conversationId)?.id === wait.id) : [];
51
+ }
52
+ function isPhoneAssistanceSuspended(conversationId, runId) {
53
+ return phoneAssistance(conversationId)?.originRunId === runId;
54
+ }
55
+ function requirePhoneAssistance(conversationId, runId, toolCallId, checkpoint) {
56
+ return runSqliteWriteTransaction((db) => {
57
+ const transcriptId = readCurrentTranscriptId(db, conversationId);
58
+ if (!transcriptId) throw new PhoneError("PHONE_CONVERSATION_NOT_FOUND", "Phone assistance requires a saved conversation", 409);
59
+ const current = phoneAssistance(conversationId);
60
+ if (current?.originRunId === runId && current.toolCallId === toolCallId) return current;
61
+ const origin = findSessionInputByRunId(conversationId, runId);
62
+ const wait = {
63
+ id: randomUUID(),
64
+ conversationId,
65
+ transcriptId,
66
+ originRunId: runId,
67
+ toolCallId,
68
+ checkpoint,
69
+ status: "open",
70
+ version: 1,
71
+ createdAt: Date.now(),
72
+ taskRunId: origin?.taskRunId,
73
+ objectiveInputId: current?.queuedInputId === origin?.id ? current?.objectiveInputId : origin?.id
74
+ };
75
+ markTaskWaiting(wait);
76
+ waits.set(conversationId, wait);
77
+ return wait;
78
+ });
79
+ }
80
+ function cancelPhoneAssistance(conversationId) {
81
+ if (!isXopcDatabaseOpen()) return;
82
+ runSqliteWriteTransaction(() => {
83
+ const wait = isXopcDatabaseOpen() ? waits.get(conversationId) : void 0;
84
+ if (!wait) return;
85
+ if (wait.taskRunId && [
86
+ "open",
87
+ "queued",
88
+ "resuming"
89
+ ].includes(wait.status)) {
90
+ const runs = new TaskRunRepository();
91
+ const run = runs.get(wait.taskRunId);
92
+ if (run && [
93
+ "queued",
94
+ "running",
95
+ "waiting",
96
+ "verifying"
97
+ ].includes(run.status)) {
98
+ for (const item of runs.listActiveWaits(run.taskId)) if (item.condition.phoneTaskId === wait.checkpoint.task.taskId) runs.resolveWait({
99
+ waitId: item.id,
100
+ actor: { kind: "user" },
101
+ resolution: { cancelled: true }
102
+ });
103
+ runs.finalize({
104
+ runId: run.id,
105
+ expectedVersion: run.version,
106
+ actor: { kind: "user" },
107
+ terminalCode: "cancelled_by_user",
108
+ receipt: {
109
+ status: "cancelled",
110
+ summary: "Phone task cancelled",
111
+ changes: [],
112
+ evidence: [],
113
+ verification: {
114
+ status: "unverified",
115
+ checks: []
116
+ },
117
+ remainingWork: [],
118
+ needsUser: false,
119
+ completionVerdict: "not_achieved"
120
+ }
121
+ });
122
+ }
123
+ }
124
+ waits.set(conversationId, {
125
+ ...wait,
126
+ status: "cancelled",
127
+ version: wait.version + 1
128
+ });
129
+ });
130
+ }
131
+ /** The wait and its deduplicated continuation commit together, even while the old run is closing. */
132
+ function queuePhoneAssistance(conversationId, waitId) {
133
+ return runSqliteWriteTransaction(() => {
134
+ const wait = phoneAssistance(conversationId);
135
+ if (!wait || wait.id !== waitId || wait.status === "cancelled") throw new PhoneError("PHONE_ASSISTANCE_CHANGED", "The phone task changed. Refresh before continuing.", 409);
136
+ if (wait.status !== "open") return wait;
137
+ const original = (wait.objectiveInputId ? getSessionInputById(conversationId, wait.objectiveInputId) : void 0) ?? findSessionInputByRunId(conversationId, wait.originRunId);
138
+ const input = insertSessionInput({
139
+ id: randomUUID(),
140
+ conversationId,
141
+ expectedTranscriptId: wait.transcriptId,
142
+ clientMessageId: `phone-assistance:${wait.id}`,
143
+ requestedDelivery: "next",
144
+ effectiveDelivery: "next",
145
+ status: "queued",
146
+ content: `用户已完成手机上的人工操作,请继续原任务。原请求时间:${new Date(original?.createdAtMs ?? wait.createdAt).toISOString()};原目标:${original?.content ?? wait.checkpoint.task.goal}。相对日期沿用原请求时间。先观察当前页面,不重复已完成操作,沿用 taskId 和剩余预算。手机片段:${JSON.stringify(wait.checkpoint.task)}`,
147
+ origin: {
148
+ type: "system",
149
+ source: "internal"
150
+ },
151
+ thinking: original?.thinking,
152
+ taskRunId: original?.taskRunId,
153
+ contextRefs: original?.contextRefs,
154
+ contextSnapshots: original?.contextSnapshots
155
+ });
156
+ if (input.origin.type !== "system" || input.origin.source !== "internal" || input.status !== "queued") throw new PhoneError("PHONE_ASSISTANCE_CHANGED", "The continuation request changed. Refresh before continuing.", 409);
157
+ const next = {
158
+ ...wait,
159
+ status: "queued",
160
+ queuedInputId: input.id,
161
+ version: wait.version + 1
162
+ };
163
+ waits.set(conversationId, next);
164
+ return next;
165
+ });
166
+ }
167
+ function consumePhoneAssistance(input) {
168
+ if (!input.clientMessageId.startsWith("phone-assistance:")) return true;
169
+ return runSqliteWriteTransaction(() => {
170
+ const wait = phoneAssistance(input.conversationId);
171
+ if (!wait || wait.queuedInputId !== input.id || wait.status !== "queued" || input.origin.type !== "system" || input.origin.source !== "internal") return false;
172
+ if (wait.taskRunId) {
173
+ const runs = new TaskRunRepository();
174
+ const run = runs.get(wait.taskRunId);
175
+ if (!run || run.status !== "waiting") return false;
176
+ const active = runs.listActiveWaits(run.taskId).filter((item) => item.taskRunId === run.id);
177
+ if (active.some((item) => item.condition.phoneTaskId !== wait.checkpoint.task.taskId)) return false;
178
+ for (const item of active) runs.resolveWait({
179
+ waitId: item.id,
180
+ actor: { kind: "system" },
181
+ resolution: { phoneAssistanceId: wait.id }
182
+ });
183
+ runs.setStatus({
184
+ runId: run.id,
185
+ expectedVersion: run.version,
186
+ from: ["waiting"],
187
+ to: "running",
188
+ actor: { kind: "system" }
189
+ });
190
+ }
191
+ waits.set(input.conversationId, {
192
+ ...wait,
193
+ status: "resuming",
194
+ version: wait.version + 1
195
+ });
196
+ return true;
197
+ });
198
+ }
199
+ function updatePhoneCheckpoint(conversationId, checkpoint) {
200
+ const wait = phoneAssistance(conversationId);
201
+ if (wait?.status === "resuming" && wait.checkpoint.task.taskId === checkpoint.task.taskId) waits.set(conversationId, {
202
+ ...wait,
203
+ checkpoint
204
+ });
205
+ }
206
+ function phoneResumeForRun(conversationId, runId) {
207
+ const wait = phoneAssistance(conversationId);
208
+ if (!wait?.queuedInputId || wait.status !== "resuming") return void 0;
209
+ return getSessionInputById(conversationId, wait.queuedInputId)?.runId === runId ? wait : void 0;
210
+ }
211
+ /** Interrupted continuations require another explicit handback, never automatic replay after restart. */
212
+ function reconcilePhoneAssistance() {
213
+ if (!isXopcDatabaseOpen()) return [];
214
+ const conversations = [];
215
+ for (const wait of waits.values()) {
216
+ if (phoneAssistance(wait.conversationId)?.id !== wait.id) continue;
217
+ const input = wait.queuedInputId ? getSessionInputById(wait.conversationId, wait.queuedInputId) : void 0;
218
+ if (wait.status === "resuming" || wait.status === "queued" && input?.status !== "queued") {
219
+ const next = {
220
+ ...wait,
221
+ status: "open",
222
+ queuedInputId: void 0,
223
+ id: randomUUID(),
224
+ version: wait.version + 1
225
+ };
226
+ markTaskWaiting(next);
227
+ waits.set(wait.conversationId, next);
228
+ } else if (wait.status === "queued") conversations.push(wait.conversationId);
229
+ }
230
+ return conversations;
231
+ }
232
+ function finishPhoneAssistance(input, succeeded) {
233
+ if (!isXopcDatabaseOpen()) return;
234
+ runSqliteWriteTransaction(() => {
235
+ const wait = phoneAssistance(input.conversationId);
236
+ if (wait?.queuedInputId !== input.id || !["queued", "resuming"].includes(wait.status)) return;
237
+ const next = {
238
+ ...wait,
239
+ status: succeeded ? "completed" : "open",
240
+ ...succeeded ? {} : {
241
+ id: randomUUID(),
242
+ queuedInputId: void 0
243
+ },
244
+ version: wait.version + 1
245
+ };
246
+ if (!succeeded) markTaskWaiting(next);
247
+ waits.set(input.conversationId, next);
248
+ });
249
+ }
250
+ function phoneAssistanceReport(wait) {
251
+ return {
252
+ ...wait.checkpoint.report,
253
+ assistanceId: wait.id,
254
+ reconnectRequired: true,
255
+ mock: false,
256
+ mode: "control",
257
+ status: wait.status === "completed" ? "completed" : "needs_user",
258
+ controlOwner: "none",
259
+ controlEpoch: 1,
260
+ handoff: "idle",
261
+ actions: wait.checkpoint.usage.actions,
262
+ modelRequests: wait.checkpoint.usage.modelRequests,
263
+ createdAt: wait.createdAt,
264
+ updatedAt: wait.createdAt,
265
+ verified: false,
266
+ verificationLevel: "none",
267
+ steps: [],
268
+ stopReason: "user_takeover",
269
+ message: "任务进度已保留。请接管手机完成操作,然后继续任务。"
270
+ };
271
+ }
272
+ //#endregion
273
+ export { cancelPhoneAssistance, consumePhoneAssistance, finishPhoneAssistance, isPhoneAssistanceSuspended, pendingPhoneAssistance, phoneAssistance, phoneAssistanceReport, phoneResumeForRun, queuePhoneAssistance, reconcilePhoneAssistance, requirePhoneAssistance, updatePhoneCheckpoint };
@@ -2,6 +2,7 @@ import { CloudAdbConnection, PhoneCloudKeyStore } from './cloud-adb.js';
2
2
  import { CloudScrcpyProvider } from './cloud-scrcpy.js';
3
3
  import { type PhoneDevice } from './contracts.js';
4
4
  import type { PhoneRepository } from './repository.js';
5
+ import { WuyingLocationAdapter } from './wuying-location.js';
5
6
  export declare class CloudPhones {
6
7
  private repository;
7
8
  private keys;
@@ -23,6 +24,10 @@ export declare class CloudPhones {
23
24
  cancel(owner: string, token: string): void;
24
25
  driver(device: PhoneDevice): Promise<import("./adb-driver.js").AdbPhoneDriver>;
25
26
  interactive(device: PhoneDevice, failed: () => void): Promise<CloudScrcpyProvider>;
27
+ locationAdapter(device: PhoneDevice): Promise<{
28
+ adapter: WuyingLocationAdapter;
29
+ close: () => void;
30
+ }>;
26
31
  disconnect(id: string): void;
27
32
  remove(device: PhoneDevice): Promise<void>;
28
33
  close(): void;