@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.
- package/dist/browser-ext/dist/background.js +184 -2
- package/dist/browser-ext/dist/sidepanel.js +9 -0
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-CKrylgib.js → activity-store-CvJ9rdwP.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Dv5Rda4y.js → agent-avatar-dicebear-CFP6g4w7.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-display-B1ycycx2.js → agent-avatar-display-BHBe88Gu.js} +2 -2
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-D285zy0S.js → agent-defaults-settings-panel-DlGRuKMv.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-D3yCqVan.js → agent-plugin-dialog-C_Dm-u6_.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-DyAuR3rG.js → agents-BdVJHOiK.js} +3 -3
- package/dist/gateway/static/root/assets/{agents-admin-api-CASGzvkW.js → agents-admin-api-Do1Pza0R.js} +1 -1
- package/dist/gateway/static/root/assets/{api-Uk05lF9i.js → api-BQv5dLcH.js} +1 -1
- package/dist/gateway/static/root/assets/{api-C4LxuNzq.js → api-ONg37_fH.js} +1 -1
- package/dist/gateway/static/root/assets/app-link-1j40sJ-z.js +1 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CDnZNKHt.js → app-management-settings-panel-B4Wqhf4J.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-CmCF7PZ5.js → appearance-settings-Dm1kRzKL.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BR9qoA2P.js → apps-page-D1MMk1P7.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-nuHYYVty.js → archive-plugin-p_yLkyaC.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-api-DtJfd1QM.js → automation-api-DQaWBR03.js} +1 -1
- package/dist/gateway/static/root/assets/automation-result-state-CO_243JM.js +1 -0
- package/dist/gateway/static/root/assets/automation-task-card-D2p9qlYE.js +3 -0
- package/dist/gateway/static/root/assets/{automations-page-DM4IdUJh.js → automations-page-Ba64H37d.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-BkzC3oIM.js +9 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CHCAr8jt.js → binary-plugins-B-6kyqtt.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-B0v8KxsO.js → block-editor-B5ysJ96n.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automation-inputs-DjUW7PEB.js → browser-automation-inputs-C2A3NIt3.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-Cf8AoQz1.js → browser-automations-page-CnbXFw1_.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-control-api-C6NZgaA1.js → browser-control-api-Aj_seKE9.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-DV2FNEDf.js → browser-settings-page-C7fxPq_z.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-CwdjWz2r.js → capabilities-BgtCwC_E.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-D0-HCZ5J.js → capabilities-DOTgaSgA.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-page-DwDkritH.js → capabilities-page-m3b9sLFG.js} +2 -2
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-mme16Fbp.js → capabilities-settings-panel-pYWZtPeU.js} +3 -3
- package/dist/gateway/static/root/assets/{channels-lKFLu8p-.js → channels-DGpRM6pj.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-agents-api-l80cvSac.js → chat-agents-api-EvJ_Wvuc.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-chart-block-BwP5QXEk.js → chat-chart-block-BQDbHLcw.js} +1 -1
- package/dist/gateway/static/root/assets/chat-page-GF9NIuZN.js +72 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-D2bV9YUL.js → chat-terminal-dock-DHFTGoEp.js} +2 -2
- package/dist/gateway/static/root/assets/{command-palette-api-CtapG8ck.js → command-palette-api-DPA_yEuy.js} +1 -1
- package/dist/gateway/static/root/assets/{composer-payload-handoff-DYuhKZRC.js → composer-payload-handoff-BTjauSNp.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-DZtMuihL.js → computer-settings-page-BFSSQfcx.js} +1 -1
- package/dist/gateway/static/root/assets/{connected-providers-grid-BQH5k3iC.js → connected-providers-grid-DM2glQN3.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-DrvFdP3G.js → connector-service-page-CFvg58qa.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-api-BzkgVBYC.js → connectors-api-CbC6Yht5.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-BtRNVCFy.js → connectors-page-D7pipFHA.js} +1 -1
- package/dist/gateway/static/root/assets/date-picker-Dd3MbG0x.js +1 -0
- package/dist/gateway/static/root/assets/{dependency-picker-Dh8hPmsT.js → dependency-picker-DcsHg2ml.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-CFz8bqyI.js → desktop-pet-DldzQT2h.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-COaboNn1.js → desktop-pet-settings-CYdI4KxB.js} +1 -1
- package/dist/gateway/static/root/assets/{dev-view-store-D8XYHVqG.js → dev-view-store-JiJv585f.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-D8cLc41G.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-Cjv7rdo3.js → directory-picker-path-field-8WOXv8zw.js} +1 -1
- package/dist/gateway/static/root/assets/{discussion-annotation-sync-YvlVw17j.js → discussion-annotation-sync-B-grSe0w.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CXx3m5-B.js → extension-debug-page-EEQkTNEu.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-iframe-host-CnOdNwbo.js → extension-iframe-host-vlZVeMCY.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-marketplace-api-BABmUY2s.js → extension-marketplace-api-_o2In_al.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C1nGr4DD.js → extension-page-CPrT111s.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-BA0Y2Rvs.js → extension-provider-B2Mf3FBu.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-QIPI8e7k.js → extension-settings-page-CznJEgWV.js} +1 -1
- package/dist/gateway/static/root/assets/{file-preview-surface-BsB7bnFH.js → file-preview-surface-7h8_fZul.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-Bt8w0Iio.js → gateway-config-swr-DbbNEOKj.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-CyCCNUxm.js → gateway-realtime-D20ZrAuM.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-C6sMzYDT.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-restart-Ty4AzDxa.js → gateway-restart-5ut-lhJm.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-BvKq7vuz.js → gateway-settings-BCf_cibp.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-N3k-C7c2.js → gateway-startup-retry-DlHL0DpH.js} +1 -1
- package/dist/gateway/static/root/assets/{global-defaults-api-D8EB2vfY.js → global-defaults-api-CmODomcV.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-eRuAzi58.js → home-page-uz22TRB-.js} +2 -2
- package/dist/gateway/static/root/assets/{image-generation-api-C99Fsofm.js → image-generation-api-dzPnpUFu.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-Cp9RquVb.js → imports-page-ChBoNMyE.js} +1 -1
- package/dist/gateway/static/root/assets/index-CSIg7V1A.js +11 -0
- package/dist/gateway/static/root/assets/index-Dv8mUlNN.css +1 -0
- package/dist/gateway/static/root/assets/{install-connector-dialog-CsoAidXp.js → install-connector-dialog-CNcdQDX0.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DFhOP2aD.js → keyboard-shortcuts-settings-CRbYq2_g.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-DbtU_A-l.js → local-app-workbench-page-04cX5TJu.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-rjhHfLpe.js → local-apps-page-fWM0FEhN.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-DHM4vWDO.js → local-session-drafts-ClrSe5mH.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-5Hf8J8-_.js → locale-store-VNjH18Dj.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-Dx_JIOpF.js → logs-page-6GanGLrm.js} +1 -1
- package/dist/gateway/static/root/assets/management-settings-BxD_lc4E.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-pzSRu7av.js → markdown-view-DLCBYWtx.js} +2 -2
- package/dist/gateway/static/root/assets/{media-plugins-3cJuHbO7.js → media-plugins-BvtNwKFb.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-uXxg5p54.js → messages-Btr7C0hF.js} +2 -2
- package/dist/gateway/static/root/assets/{model-selector-ksLo-5B_.js → model-selector-DYUnp917.js} +1 -1
- package/dist/gateway/static/root/assets/{models-hub-cache-DhZng2nF.js → models-hub-cache-_qE7L-_H.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-panel-B6RbjwJq.js → note-detail-panel-bjRZesmS.js} +3 -3
- package/dist/gateway/static/root/assets/note-image-lightbox-D7Jqb75C.js +1 -0
- package/dist/gateway/static/root/assets/{notes-api-DocbsBbT.js → notes-api-Bxa11X3a.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-B7889s6-.js → notes-page-D2QpJ3WZ.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-api-CCFIPbA0.js → oauth-api-DIE4UpP7.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-provider-connect-GxkF0vWJ.js → oauth-provider-connect-B95tiddN.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-CvWLVeRA.js → page-context-capture-button-C-QbbwmN.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-draft-CMRDNv4d.js → page-context-draft-BHmOfksL.js} +1 -1
- package/dist/gateway/static/root/assets/page-header-store-bPV8_tKL.js +1 -0
- package/dist/gateway/static/root/assets/{personal-avatar-CqNJ48Ge.js → personal-avatar-nXrmMfrV.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-BCwlYT3F.js +1 -0
- package/dist/gateway/static/root/assets/{personal-settings-panel-DAcl8DU4.js → personal-settings-panel-vkYmXK8h.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-dependencies-card-DLWblGj7.js → phone-dependencies-card-CZDAxTWv.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-model-picker-ugrT9GJu.js → phone-model-picker-4Snfs8Hq.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-settings-page-DIIt7JOE.js → phone-settings-page-D8HperfA.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-workspace-store-mawKT5kV.js → phone-workspace-store-Di9R9Ux5.js} +1 -1
- package/dist/gateway/static/root/assets/{plugin-details-dialog-BdueMT3q.js → plugin-details-dialog-DJsDu-_8.js} +1 -1
- package/dist/gateway/static/root/assets/{preference-select-fields-CmLZNwbm.js → preference-select-fields-C6abaM3k.js} +1 -1
- package/dist/gateway/static/root/assets/{product-automation-feedback-DYwhL37Y.js → product-automation-feedback-C74s9Mjz.js} +1 -1
- package/dist/gateway/static/root/assets/product-delivery-DRyD9_Xq.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-B5G4X71t.js → product-open-page-AbDP5w1c.js} +1 -1
- package/dist/gateway/static/root/assets/product-preview-content-CktjvFbc.js +1 -0
- package/dist/gateway/static/root/assets/product-preview-modal-CzsqLwB4.js +2 -0
- package/dist/gateway/static/root/assets/{project-detail-page-CRJb69vP.js → project-detail-page-Cf3tggGP.js} +2 -2
- package/dist/gateway/static/root/assets/{project-understanding-D3w8cZEm.js → project-understanding-jmhFbHch.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-CkifzKjz.js → projects-page-jMgZiFnO.js} +1 -1
- package/dist/gateway/static/root/assets/{providers-api-CKFg2PZQ.js → providers-api-CJBYFKAK.js} +1 -1
- package/dist/gateway/static/root/assets/{recording-upload-ZkmRf0GR.js → recording-upload-Dl9a5yOV.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-B1Mh3bNo.js → registry-api-BwkbPUYu.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-Dw5rG-aA.js → remote-access-hub-CBQ_bOy9.js} +1 -1
- package/dist/gateway/static/root/assets/{resource-unavailable-BUWsH3fp.js → resource-unavailable-35wBZxmz.js} +1 -1
- package/dist/gateway/static/root/assets/route-preload-BcA6SPeC.js +2 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-BXvn5ImA.js → runtime-tools-api-BF28JDAO.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BALcypHp.js → runtime-tools-settings-panel-Bq2xQ2qd.js} +1 -1
- package/dist/gateway/static/root/assets/{service-recommendation-list-CpVUnz89.js → service-recommendation-list-CdaS4MPF.js} +1 -1
- package/dist/gateway/static/root/assets/{session-api-VquhIBHI.js → session-api-zJXYlRPt.js} +1 -1
- package/dist/gateway/static/root/assets/session-manager-wWxpzSo0.js +23 -0
- package/dist/gateway/static/root/assets/{sessions-page-DlvPkE5Y.js → sessions-page-BkjD_dUD.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BUMCEtA_.js +1 -0
- package/dist/gateway/static/root/assets/{settings-advanced-section-c9_iZ-46.js → settings-advanced-section-C84IghdL.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-mode-store-Dem6-TBe.js → settings-mode-store-CtQBJvbO.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-B_wNfFQe.js → settings-page-eEIz9InP.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-header-C8a_oOyw.js → settings-page-header-CsPAYlqV.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-CTSRWljG.js → settings-page-layout-lPLeJQoV.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-BNZoqF40.js → setup-status-panel-BSU5WpaE.js} +1 -1
- package/dist/gateway/static/root/assets/{share-link-dialog-C5JTTxsy.js → share-link-dialog-NaM6jvIz.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-D-KxzXgm.js → share-preview-page-CHjZn27s.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-api-CztKbxdd.js → shares-api-B9rVcV1y.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-CzR21j6e.js → shares-settings-5sB15V5v.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-api-B7kWl6LK.js → skill-api-D6zVfEuK.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-list-api-Cn07P6qZ.js → skill-list-api-SLmTBYF5.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-Bhl0u16_.js → skill-reload-api-UQkq2orI.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-BmkuxHZe.js → skills-page-Ca0pYZ4i.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-Ce6zIcki.js → system-settings-panel-BARWbjRN.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-CysJhG3B.js → task-detail-page-roqAsGue.js} +2 -2
- package/dist/gateway/static/root/assets/{task-result-evidence-CGZKMnNo.js → task-result-evidence-Bb1F7nAM.js} +1 -1
- package/dist/gateway/static/root/assets/{terminal-panel-store-YwLUkuyV.js → terminal-panel-store-DYDeXXAg.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-DOJ9tu-j.js → theme-store-DbStcH89.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-BplBpTdL.js → tracing-settings-page-YfkNCxbP.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-B5-Ypvqa.js → tunnel-api-BK_ivyIb.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-activity-store-CmwtE8Kd.js → understanding-activity-store-p7Z7oq8z.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-refresh-store-9apSmAVL.js → understanding-refresh-store-D-U6rcwZ.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-cPbirpXX.js → usage-page-URFSiswS.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-B3p2QWaF.js → use-autosave-B7cbumro.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-D-AEYC85.js → use-composer-attachments-DAtiwLsE.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-CO4SC-LX.js → use-file-preview-expanded-B8erpWsX.js} +2 -2
- package/dist/gateway/static/root/assets/{use-personal-profile-DocmhC9I.js → use-personal-profile-DDW29nm-.js} +1 -1
- package/dist/gateway/static/root/assets/{use-workspace-tree-VraTGKx-.js → use-workspace-tree-DCoTf22f.js} +1 -1
- package/dist/gateway/static/root/assets/{user-model-page-DuRALzhe.js → user-model-page-DSV5NkNj.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-DbSQHZZW.js → voice-api-key-field-DzYdJZN4.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-D9iNJSvm.js → voice-config-api-wotvT6Hw.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-input-shortcut-events-hso9_VvT.js → voice-input-shortcut-events-BI6PuiIB.js} +1 -1
- package/dist/gateway/static/root/assets/voice-transcribe-api-DAK9eLRr.js +1 -0
- package/dist/gateway/static/root/assets/{work-discovery-overlay-fsL9RJqB.js → work-discovery-overlay-BzmB9Rub.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-page-DAQPKVDs.js → work-discovery-page-CmGjxUIT.js} +1 -1
- package/dist/gateway/static/root/assets/{working-directory-picker-modal-Ta73QrNw.js → working-directory-picker-modal-B-EHm52-.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-CgrcNyBc.js → workspace-api-uhiEMPpK.js} +2 -2
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-DrPVyikA.js +1 -0
- package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-B7uBuPtA.js → workspace-file-preview-dialog-BDm06MZm.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-open-location-menu-Bi2vRvaQ.js → workspace-open-location-menu-Bv83uoqu.js} +1 -1
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CCOOBG-7.js → xopc-cloud-account-card-Cd5GdpGL.js} +1 -1
- package/dist/gateway/static/root/index.html +84 -84
- package/dist/gateway/static/root/notification-sw.js +21 -7
- package/dist/package.js +1 -1
- package/dist/packages/endpoint-tools-protocol/src/context.js +115 -0
- package/dist/packages/endpoint-tools-protocol/src/index.js +4 -0
- package/dist/packages/endpoint-tools-protocol/src/location-sharing.js +51 -0
- package/dist/packages/gateway-contract/src/gateway-scopes.js +5 -1
- package/dist/packages/gateway-contract/src/index.js +2 -0
- package/dist/packages/gateway-contract/src/phone-workspace.js +6 -0
- package/dist/packages/gateway-contract/src/product-delivery.js +9 -3
- package/dist/src/agent/embedded/external-tool-discovery.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +2 -2
- package/dist/src/agent/embedded/run-turn.js +72 -9
- package/dist/src/agent/embedded/session-runner.js +2 -1
- package/dist/src/agent/embedded/types.d.ts +1 -1
- package/dist/src/agent/prompt/system-prompt.js +1 -0
- package/dist/src/agent/service/direct-turn-helpers.d.ts +0 -7
- package/dist/src/agent/service/direct-turn-helpers.js +3 -2
- package/dist/src/agent/service/process-direct-streaming.js +2 -1
- package/dist/src/agent/source-context/device-environment.d.ts +3 -0
- package/dist/src/agent/source-context/device-environment.js +38 -0
- package/dist/src/agent/source-context/injector.js +2 -1
- package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
- package/dist/src/agent/tool-manuals/phone.js +1 -1
- package/dist/src/agent/tools/automation-tool.js +3 -2
- package/dist/src/agent/tools/factory.js +1 -1
- package/dist/src/agent/tools/personal-read-tool.js +1 -1
- package/dist/src/agent/tools/phone-use-tool.js +46 -2
- package/dist/src/agent/tools/xopc-use-tool.js +1 -0
- package/dist/src/computer/runtime.d.ts +1 -1
- package/dist/src/config/schema.d.ts +1 -0
- package/dist/src/endpoint-tools/context-store.d.ts +29 -0
- package/dist/src/endpoint-tools/context-store.js +138 -0
- package/dist/src/endpoint-tools/location-sharing.d.ts +42 -0
- package/dist/src/endpoint-tools/location-sharing.js +203 -0
- package/dist/src/endpoint-tools/runtime.d.ts +4 -0
- package/dist/src/endpoint-tools/runtime.js +8 -0
- package/dist/src/endpoint-tools/turn-context.d.ts +2 -1
- package/dist/src/endpoint-tools/turn-context.js +4 -2
- package/dist/src/gateway/hono/middleware/auth.js +1 -1
- package/dist/src/gateway/hono/routes/devices.js +1 -0
- package/dist/src/gateway/hono/routes/endpoint-compatibility.js +4 -0
- package/dist/src/gateway/hono/routes/endpoint-environment.d.ts +3 -0
- package/dist/src/gateway/hono/routes/endpoint-environment.js +98 -0
- package/dist/src/gateway/hono/routes/endpoint-tools.js +1 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js +16 -0
- package/dist/src/gateway/hono/routes/location-sharing.d.ts +3 -0
- package/dist/src/gateway/hono/routes/location-sharing.js +164 -0
- package/dist/src/gateway/hono/routes/phone.js +246 -34
- package/dist/src/gateway/hono/routes/session-command-handler.js +1 -1
- package/dist/src/gateway/hono/routes/session-input-handler.js +2 -1
- package/dist/src/gateway/hono/routes/tunnel.js +10 -0
- package/dist/src/gateway/security/gateway-scopes.js +6 -0
- package/dist/src/gateway/security/phone-access.d.ts +4 -0
- package/dist/src/gateway/security/phone-access.js +20 -0
- package/dist/src/gateway/service/agent-runner.js +3 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +2 -1
- package/dist/src/gateway/service/session-input-coordinator.d.ts +3 -0
- package/dist/src/gateway/service/session-input-coordinator.js +50 -2
- package/dist/src/gateway/service.d.ts +1 -0
- package/dist/src/gateway/service.js +8 -0
- package/dist/src/gateway/session-reset-service.js +4 -0
- package/dist/src/notifications/planner.js +6 -6
- package/dist/src/phone/assistance-service.d.ts +6 -0
- package/dist/src/phone/assistance-service.js +32 -0
- package/dist/src/phone/assistance.d.ts +40 -0
- package/dist/src/phone/assistance.js +273 -0
- package/dist/src/phone/cloud-phones.d.ts +5 -0
- package/dist/src/phone/cloud-phones.js +14 -0
- package/dist/src/phone/contracts.d.ts +7 -1
- package/dist/src/phone/contracts.js +5 -0
- package/dist/src/phone/environment-adapter.d.ts +3 -0
- package/dist/src/phone/environment-adapter.js +11 -0
- package/dist/src/phone/location-baseline-store.d.ts +9 -0
- package/dist/src/phone/location-baseline-store.js +61 -0
- package/dist/src/phone/location-environment.d.ts +61 -0
- package/dist/src/phone/location-environment.js +157 -0
- package/dist/src/phone/model-adapter.js +16 -5
- package/dist/src/phone/runtime.d.ts +17 -2
- package/dist/src/phone/runtime.js +203 -20
- package/dist/src/phone/stream-gateway.d.ts +5 -0
- package/dist/src/phone/stream-gateway.js +85 -51
- package/dist/src/phone/wuying-location.d.ts +18 -0
- package/dist/src/phone/wuying-location.js +86 -0
- package/dist/src/storage/sqlite/device-access-repository.d.ts +4 -0
- package/dist/src/storage/sqlite/device-access-repository.js +18 -1
- package/dist/src/tunnel/broker-client.d.ts +8 -0
- package/dist/src/tunnel/broker-client.js +18 -1
- package/dist/src/voice/realtime/runtime.js +1 -1
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/app-link-CytZ5zkp.js +0 -1
- package/dist/gateway/static/root/assets/automation-display-BlGt8MAC.js +0 -2
- package/dist/gateway/static/root/assets/automation-task-card-Cp3RIw5d.js +0 -2
- package/dist/gateway/static/root/assets/automations-workspace-CXLu04I-.js +0 -9
- package/dist/gateway/static/root/assets/chat-page-CT3K7lFT.js +0 -71
- package/dist/gateway/static/root/assets/date-picker-ByTasrfl.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-BKMpLdIA.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-0gmDfPeP.js +0 -1
- package/dist/gateway/static/root/assets/index-6vVrWfwM.js +0 -11
- package/dist/gateway/static/root/assets/index-DDGK6klk.css +0 -1
- package/dist/gateway/static/root/assets/management-settings-CuSzixOw.js +0 -1
- package/dist/gateway/static/root/assets/note-image-lightbox-BCjvBqwy.js +0 -1
- package/dist/gateway/static/root/assets/page-header-store-reh1es-3.js +0 -1
- package/dist/gateway/static/root/assets/personal-page-D95FHaw9.js +0 -1
- package/dist/gateway/static/root/assets/product-delivery-BU_H84jL.js +0 -1
- package/dist/gateway/static/root/assets/product-preview-content-BUheyLqt.js +0 -1
- package/dist/gateway/static/root/assets/product-preview-modal-Cj_Zxu4G.js +0 -2
- package/dist/gateway/static/root/assets/route-preload-CRKbVwQ1.js +0 -2
- package/dist/gateway/static/root/assets/session-manager-DNMosCtW.js +0 -23
- package/dist/gateway/static/root/assets/settings-advanced-gate-Ckc1aCLG.js +0 -1
- package/dist/gateway/static/root/assets/voice-transcribe-api-BqIs0jgv.js +0 -1
- 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([
|
|
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:
|
|
140
|
-
zh:
|
|
139
|
+
en: `${run.automationName} · Completed`,
|
|
140
|
+
zh: `${run.automationName} · 已完成`
|
|
141
141
|
} : {
|
|
142
|
-
en:
|
|
143
|
-
zh:
|
|
142
|
+
en: `${run.automationName} · Needs attention`,
|
|
143
|
+
zh: `${run.automationName} · 需要处理`
|
|
144
144
|
},
|
|
145
145
|
body: {
|
|
146
|
-
en:
|
|
147
|
-
zh:
|
|
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;
|