@xopcai/xopc 0.0.433 → 0.0.435
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/README.md +5 -5
- package/README.zh-CN.md +5 -5
- package/dist/browser-ext/dist/sidepanel.js +11 -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-BpYGrRXw.js → activity-store-Cwn_CNwl.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DTgOSv6G.js → agent-avatar-dicebear-Cd23LnJJ.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-display-BUH7ljEo.js → agent-avatar-display-ByzM7u9S.js} +2 -2
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-B_FAikHA.js → agent-defaults-settings-panel-B0i37diS.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-DPabZaSE.js → agent-plugin-dialog-XN-tZ-Ox.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-BAPYP1Ka.js → agents-ZDA1OaLv.js} +3 -3
- package/dist/gateway/static/root/assets/{agents-admin-api-CXCAHNPj.js → agents-admin-api-B5lKH_ps.js} +1 -1
- package/dist/gateway/static/root/assets/{api-oIK4hYkJ.js → api-B9fZL-V8.js} +1 -1
- package/dist/gateway/static/root/assets/{api-DMbimMEi.js → api-Djju8qIR.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BZ3Fy8ZR.js → app-management-settings-panel-IlyzDPJu.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DsRTj1by.js → appearance-settings-BxdFGob3.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CxEKiOTA.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-Bg1VTieK.js → archive-plugin-4gEvotPr.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-api-CLPsgcQN.js → automation-api-4fVKv9PJ.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-result-state-CKVnR4KG.js → automation-result-state-m7PeK2kl.js} +1 -1
- package/dist/gateway/static/root/assets/automation-run-list-CJOdy_R2.js +1 -0
- package/dist/gateway/static/root/assets/{automation-task-card-D27Mw66U.js → automation-task-card-DZWhCWJa.js} +3 -3
- package/dist/gateway/static/root/assets/{automations-page-DGNTJ8lN.js → automations-page-BjbM15eY.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-CqurzLYX.js +9 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CuwSdCG5.js → binary-plugins-69WyJLNW.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Dtl2BG3t.js → block-editor-DUONDIZR.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automation-inputs-uGK086ag.js → browser-automation-inputs-DL4YPCuN.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-Da_edNNS.js → browser-automations-page-1Aq6XmRs.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-control-api-k3OOX3bS.js → browser-control-api-yjru8E7R.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-C1bSw-Jq.js → browser-settings-page-CvwpT8Um.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-DlHPLld_.js → capabilities-C7lnwKKm.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-CoeuLRt6.js → capabilities-DaeQXJT4.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-B5avAOUM.js +2 -0
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-CtY-bGIi.js → capabilities-settings-panel-_9yCS78i.js} +1 -1
- package/dist/gateway/static/root/assets/capability-links-DeO34GIF.js +1 -0
- package/dist/gateway/static/root/assets/{channels-Cn1MWBL_.js → channels-CoQb4HOF.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-agents-api-BB0biwc7.js → chat-agents-api-BUi_7GRo.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-chart-block-QSvjx4w6.js → chat-chart-block-CcVcKsDZ.js} +1 -1
- package/dist/gateway/static/root/assets/chat-page--wcFhTjW.js +72 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-Cd51G9eG.js → chat-terminal-dock-BMXJpPuH.js} +1 -1
- package/dist/gateway/static/root/assets/{command-palette-api-CEG10uE-.js → command-palette-api-luUjQPsh.js} +1 -1
- package/dist/gateway/static/root/assets/{composer-payload-handoff-Bogdq9Hy.js → composer-payload-handoff-B5XNxNCb.js} +1 -1
- package/dist/gateway/static/root/assets/computer-settings-page-CWtdyEJH.js +1 -0
- package/dist/gateway/static/root/assets/connected-providers-grid-2idMtk65.js +1 -0
- package/dist/gateway/static/root/assets/connection-usage-Cm_McddI.js +1 -0
- package/dist/gateway/static/root/assets/connection-usage-guide-Ddh0bfkj.js +1 -0
- package/dist/gateway/static/root/assets/{connector-service-page-k2rjyjrp.js → connector-service-page-C3msXaBk.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-api-DtvB9Cjm.js → connectors-api-NcWECWKg.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-Crb6DILX.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-CAankdQw.js → date-picker-Cfjq1hD_.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-DjM73fir.js → desktop-pet-ChFn9v-3.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-Rmh-GxHl.js → desktop-pet-settings-DvnVIv25.js} +1 -1
- package/dist/gateway/static/root/assets/{dev-view-store-BgW2Riyk.js → dev-view-store-DQJ61P5L.js} +1 -1
- package/dist/gateway/static/root/assets/{device-pairing-wizard-UdzSpNa5.js → device-pairing-wizard-KxaIL-OX.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-Rkw3f7lG.js → directory-picker-path-field-Drv864uE.js} +1 -1
- package/dist/gateway/static/root/assets/{discussion-annotation-sync-Dudoj_Fz.js → discussion-annotation-sync-DfBRkWtw.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DxIGAO23.js → extension-debug-page-DAlBIt_R.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-iframe-host-63KpX6IP.js → extension-iframe-host-Bds-5kY_.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-marketplace-api-yXNUkQDA.js → extension-marketplace-api-CZg8nBwW.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C811A_Ww.js → extension-page-ZTw-oucT.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-C4jLFIgh.js → extension-provider-NKWfjpdP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-WJSw5MT0.js → extension-settings-page-CT7PPt_q.js} +1 -1
- package/dist/gateway/static/root/assets/{file-preview-surface-zE9AcaHM.js → file-preview-surface-BcLeaSNe.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-D6cc6W6E.js → gateway-config-swr-Cq-ByXL4.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-BSRNLciy.js → gateway-realtime-DwMd2PCt.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-CHrf6-nR.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-restart-Unun5hRL.js → gateway-restart-DdiVzbkL.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DP-DV-e5.js → gateway-settings-1QUdNwrZ.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-C8g666Ja.js → gateway-startup-retry-PMJi5mX4.js} +1 -1
- package/dist/gateway/static/root/assets/{global-defaults-api-BObi-1ww.js → global-defaults-api-DgzZh3wX.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-CIcs7Mzy.js → home-page-Chn7YTiD.js} +2 -2
- package/dist/gateway/static/root/assets/{image-generation-api-C2SqYNyD.js → image-generation-api-CjVpsckq.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-C8ezUkOJ.js → imports-page-CJCvZFaQ.js} +1 -1
- package/dist/gateway/static/root/assets/index-8xLWo0Tt.js +11 -0
- package/dist/gateway/static/root/assets/index-iukJWzxG.css +1 -0
- package/dist/gateway/static/root/assets/install-connector-dialog-Bo06Ry3H.js +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BRaY4-wA.js → keyboard-shortcuts-settings-BylFJeGu.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BZtVcjF3.js → local-app-workbench-page-B3MSSFsr.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-MqP4EnJm.js → local-apps-page-BeV86rMJ.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-DTq9776a.js → local-session-drafts-jgw8UGsO.js} +2 -2
- package/dist/gateway/static/root/assets/{locale-store-B6OrWgY1.js → locale-store-CAZaC05J.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-hkHBjblX.js → logs-page-BMmSsUP5.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-DoX4eTM3.js → management-settings-Bu7T8ewk.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-DrhYZSmg.js → markdown-view-BatP4qeK.js} +1 -1
- package/dist/gateway/static/root/assets/{mcp-conversation-setup-page-BEp5E6TD.js → mcp-conversation-setup-page-rROtr0UN.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D987i9Gc.js → media-plugins-88OV72YE.js} +1 -1
- package/dist/gateway/static/root/assets/messages-C7fckbyG.js +3 -0
- package/dist/gateway/static/root/assets/{model-selector-DXm4NS1_.js → model-selector-raBRBkN_.js} +1 -1
- package/dist/gateway/static/root/assets/{models-hub-cache-BLcha5rx.js → models-hub-cache-CzC9y3D0.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-panel-Cl851ivY.js → note-detail-panel-BvA8Vkbm.js} +3 -3
- package/dist/gateway/static/root/assets/note-image-lightbox-D6kUDDd5.js +1 -0
- package/dist/gateway/static/root/assets/{notes-api-Ddsf7FVg.js → notes-api-zXpV6UXu.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-DSwA1MU1.js → notes-page-CjYH9Kle.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-api-CMmu4DzH.js → oauth-api-DmxSaxM1.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-provider-connect-BkhnftBq.js → oauth-provider-connect-D4Gfs-Ba.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-urhQBRaN.js → page-context-capture-button-Mig3d0UX.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-draft-BuNUerth.js → page-context-draft-C4IIZaKd.js} +1 -1
- package/dist/gateway/static/root/assets/page-header-store-D7G5utVi.js +1 -0
- package/dist/gateway/static/root/assets/{personal-avatar-B49ueeZO.js → personal-avatar-DLa-CpaK.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-page-f05ceuFn.js → personal-page-BhuT79Wd.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-settings-panel-DLQxzPYr.js → personal-settings-panel-XSUkgcr2.js} +1 -1
- package/dist/gateway/static/root/assets/phone-dependencies-card-DYwnuVh3.js +1 -0
- package/dist/gateway/static/root/assets/phone-model-connection-2F32QTHA.js +1 -0
- package/dist/gateway/static/root/assets/phone-model-picker-DCVzIr0s.js +1 -0
- package/dist/gateway/static/root/assets/phone-settings-page-DJttE4id.js +1 -0
- package/dist/gateway/static/root/assets/{phone-workspace-store-DbqktZbO.js → phone-workspace-store-Dxp-KhFP.js} +1 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-tyjAjFjA.js +1 -0
- package/dist/gateway/static/root/assets/{preference-select-fields-BZWqG7pu.js → preference-select-fields-BVP3MhGK.js} +1 -1
- package/dist/gateway/static/root/assets/{product-automation-feedback-DDQUsag7.js → product-automation-feedback-DbJvv92z.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-BkRP_HmA.js → product-open-page-RImqlhCD.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-o2Y3VNE7.js → product-preview-content-DxSqrKsg.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-modal-7Ohx-7OR.js → product-preview-modal-Cw8Q8Uom.js} +2 -2
- package/dist/gateway/static/root/assets/{project-detail-page-B2RsSHya.js → project-detail-page-CuugOYfe.js} +1 -1
- package/dist/gateway/static/root/assets/{project-understanding-BIMouiYX.js → project-understanding-BMKcoUW5.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-C9R5u3tF.js → projects-page-CFsABLvs.js} +1 -1
- package/dist/gateway/static/root/assets/{providers-api-BOCkRZ7X.js → providers-api-CAeXbJNF.js} +1 -1
- package/dist/gateway/static/root/assets/{recording-upload-C6muEHEO.js → recording-upload-CfpllTe5.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-Bl2guMRg.js → registry-api-fLOqFyrz.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-BceSMbCs.js → remote-access-hub-BvKOxy0L.js} +1 -1
- package/dist/gateway/static/root/assets/{resource-unavailable-CUNbPkdj.js → resource-unavailable-D15jzjV_.js} +1 -1
- package/dist/gateway/static/root/assets/route-preload-BQapekpy.js +2 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-LopLjgvu.js → runtime-tools-api-D0Nrvuqv.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-9HIPerDP.js → runtime-tools-settings-panel-CA27XgL2.js} +1 -1
- package/dist/gateway/static/root/assets/{service-recommendation-list-CoMI6MB1.js → service-recommendation-list-B0RoYLVT.js} +1 -1
- package/dist/gateway/static/root/assets/session-api-CHRP5Lwf.js +1 -0
- package/dist/gateway/static/root/assets/session-channel-icon-D1ktvt1P.js +1 -0
- package/dist/gateway/static/root/assets/session-identity-label-BP7OIYth.js +1 -0
- package/dist/gateway/static/root/assets/session-manager-DRRWwKE4.js +25 -0
- package/dist/gateway/static/root/assets/{sessions-page-BT0GdXdS.js → sessions-page-uJHS3-6F.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CZ4J3Kuy.js +1 -0
- package/dist/gateway/static/root/assets/{settings-advanced-section-CEorDLUp.js → settings-advanced-section-D-llwfSj.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-mode-store-C2LZqBES.js → settings-mode-store-BspMKc9N.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-C_Np_6qZ.js → settings-page-CedwaHM0.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-header-BAN34UQi.js → settings-page-header-LuOJvqNa.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-B5TVFBV2.js → settings-page-layout-CduQ8w4a.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-interaction-page-BYvTJW3_.js → setup-interaction-page-ujpPGl84.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-UY2dH-sK.js → setup-status-panel-BN2aCJUN.js} +1 -1
- package/dist/gateway/static/root/assets/{share-link-dialog-BMcXyzr2.js → share-link-dialog-CTATUaa4.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-UQ6eUM2_.js → share-preview-page-Dq0J3VgS.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-api-DOeDN6Tm.js → shares-api-zegE8pSE.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-W8XhuAoL.js → shares-settings-DXpvsRXq.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-api-Do_c0d9n.js → skill-api-DCL1EN7f.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-list-api-DpHaXI2l.js → skill-list-api-Bv0mmHbu.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-DDRd9IJ2.js → skill-reload-api-DPZbadiO.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-CaeJVKhO.js → skills-page-DMC7Gaku.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-DYWlWPJL.js → system-settings-panel-BYFUhlqG.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-De0qD7xw.js → task-detail-page-_Og3plZL.js} +3 -3
- package/dist/gateway/static/root/assets/{task-result-evidence-CICR5K1t.js → task-result-evidence-Bxm8-H0B.js} +1 -1
- package/dist/gateway/static/root/assets/{terminal-panel-store-BbWUcQe7.js → terminal-panel-store-Djf9l2qZ.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-TkG5mo0p.js → theme-store-8GFVtotZ.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-CYXEy4EG.js → tracing-settings-page-oWW3SBZ4.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-DquDm6U2.js → tunnel-api-D-mEsSGF.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-activity-store-Ot3wZ3oQ.js → understanding-activity-store-CvDjsd0I.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-refresh-store-C5KYFMaC.js → understanding-refresh-store-DzOZJm7A.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-1xFO4smo.js → usage-page-z-o6Uuev.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-HL8XRNR8.js → use-autosave-BVYS8UoK.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-XRlQBdNF.js → use-composer-attachments-lecOV2q5.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-CW956CXS.js → use-file-preview-expanded-nd_CuFsd.js} +2 -2
- package/dist/gateway/static/root/assets/{use-personal-profile-202s6tJt.js → use-personal-profile-CQi2ZCxV.js} +1 -1
- package/dist/gateway/static/root/assets/{use-workspace-tree-CjydkmH1.js → use-workspace-tree-BiaddkzX.js} +1 -1
- package/dist/gateway/static/root/assets/{user-model-page-OGPXx3pe.js → user-model-page-Bks1n0Nj.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CxFu4MEA.js → voice-api-key-field-BbW8NFeZ.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-MHe5Pn-A.js → voice-config-api-jSMzZWWy.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-input-shortcut-events-B9xc1oK8.js → voice-input-shortcut-events-_SgYmx7X.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-transcribe-api-CVEcB6Pe.js → voice-transcribe-api-BJCfiRFU.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-C-JoAg2D.js → work-discovery-overlay-DSTSNyU7.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-page-B5Kx29Ru.js → work-discovery-page-Dd_QJJvb.js} +1 -1
- package/dist/gateway/static/root/assets/{working-directory-picker-modal-DGp9cNzH.js → working-directory-picker-modal-q39BUcJ6.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-HBXn8pL9.js → workspace-api-Di2OmCvz.js} +2 -2
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-B2r9wlix.js +1 -0
- package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-3cpwSG2w.js → workspace-file-preview-dialog-BUGNT765.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-open-location-menu-D0VOFvuP.js → workspace-open-location-menu-bMSvmQW7.js} +1 -1
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-BkdW2p3v.js → xopc-cloud-account-card-Bbe19Del.js} +1 -1
- package/dist/gateway/static/root/index.html +87 -85
- package/dist/package.js +1 -1
- package/dist/packages/computer-control-contract/src/index.js +33 -3
- package/dist/packages/gateway-contract/src/session-identity.js +2 -1
- package/dist/packages/gateway-contract/src/session-input-command.js +19 -2
- package/dist/packages/gateway-contract/src/specialists.js +1 -0
- package/dist/src/agent/embedded/execution-tool-policy.d.ts +1 -1
- package/dist/src/agent/embedded/execution-tool-policy.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +23 -8
- package/dist/src/agent/embedded/run-turn.js +30 -7
- package/dist/src/agent/embedded/runs.d.ts +2 -2
- package/dist/src/agent/embedded/runs.js +4 -4
- package/dist/src/agent/embedded/session-runner.js +26 -11
- package/dist/src/agent/embedded/tool-search-extension.d.ts +8 -2
- package/dist/src/agent/embedded/tool-search-extension.js +122 -30
- package/dist/src/agent/external-tools/cliProvider.d.ts +10 -9
- package/dist/src/agent/external-tools/cliProvider.js +24 -4
- package/dist/src/agent/external-tools/composio-provider.d.ts +3 -3
- package/dist/src/agent/external-tools/composio-provider.js +6 -3
- package/dist/src/agent/external-tools/discovery.d.ts +47 -0
- package/dist/src/agent/external-tools/discovery.js +56 -0
- package/dist/src/agent/external-tools/gateway-tools.js +26 -46
- package/dist/src/agent/external-tools/index.d.ts +1 -0
- package/dist/src/agent/external-tools/index.js +7 -0
- package/dist/src/agent/external-tools/personal-request-scope.d.ts +7 -0
- package/dist/src/agent/external-tools/personal-request-scope.js +83 -0
- package/dist/src/agent/external-tools/read-policy.js +5 -4
- package/dist/src/agent/external-tools/service.d.ts +2 -0
- package/dist/src/agent/external-tools/service.js +22 -3
- package/dist/src/agent/external-tools/tool-registry.d.ts +6 -0
- package/dist/src/agent/external-tools/types.d.ts +7 -2
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.js +3 -2
- package/dist/src/agent/orchestration/llm-turn-retry.d.ts +1 -1
- package/dist/src/agent/orchestration/llm-turn-retry.js +13 -8
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +1 -0
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +3 -1
- package/dist/src/agent/prompt/sections/tooling.js +1 -1
- package/dist/src/agent/tool-manuals/computer.d.ts +1 -1
- package/dist/src/agent/tool-manuals/computer.js +6 -4
- package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
- package/dist/src/agent/tool-manuals/phone.js +4 -4
- package/dist/src/agent/tool-manuals/xopc-configuration.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-configuration.js +4 -2
- package/dist/src/agent/tools/computer-use-tool.js +7 -6
- package/dist/src/agent/tools/delegation-policy.js +1 -0
- package/dist/src/agent/tools/factory.js +4 -2
- package/dist/src/agent/tools/phone-use-tool.js +2 -2
- package/dist/src/agent/tools/web.js +22 -3
- package/dist/src/agent-matching/service.js +2 -2
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/computer/batch.d.ts +108 -0
- package/dist/src/computer/batch.js +125 -0
- package/dist/src/computer/broker.d.ts +30 -2
- package/dist/src/computer/broker.js +109 -17
- package/dist/src/computer/diagnostics.d.ts +5 -1
- package/dist/src/computer/diagnostics.js +22 -3
- package/dist/src/computer/errors.d.ts +15 -0
- package/dist/src/computer/errors.js +59 -3
- package/dist/src/computer/model-adapter.d.ts +58 -0
- package/dist/src/computer/model-adapter.js +112 -66
- package/dist/src/computer/native-errors.d.ts +2 -0
- package/dist/src/computer/native-errors.js +13 -0
- package/dist/src/computer/program-runtime.d.ts +1 -1
- package/dist/src/computer/program-runtime.js +1 -0
- package/dist/src/computer/runtime.d.ts +11 -0
- package/dist/src/computer/runtime.js +102 -34
- package/dist/src/computer/semantic-actions.js +4 -0
- package/dist/src/config/schema.d.ts +6 -0
- package/dist/src/extensions/agent-plugins/formats.js +2 -1
- package/dist/src/extensions/agent-plugins/inventory.d.ts +2 -0
- package/dist/src/extensions/agent-plugins/inventory.js +4 -1
- package/dist/src/extensions/agent-plugins/validation.d.ts +1 -0
- package/dist/src/extensions/agent-plugins/validation.js +2 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/phone-dependencies.js +26 -5
- package/dist/src/gateway/hono/routes/phone-setup.js +42 -16
- package/dist/src/gateway/hono/routes/phone.js +22 -7
- package/dist/src/gateway/hono/routes/session-command-handler.js +9 -0
- package/dist/src/gateway/hono/routes/session-input-control.d.ts +3 -0
- package/dist/src/gateway/hono/routes/session-input-control.js +37 -0
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +12 -0
- package/dist/src/gateway/hono/routes/session-input-handler.js +22 -0
- package/dist/src/gateway/hono/routes/sessions.js +4 -0
- package/dist/src/gateway/service/agent-runner.js +5 -4
- package/dist/src/gateway/service/config-coordinator.d.ts +6 -0
- package/dist/src/gateway/service/session-input-coordinator.d.ts +6 -3
- package/dist/src/gateway/service/session-input-coordinator.js +47 -6
- package/dist/src/gateway/service.d.ts +1 -0
- package/dist/src/gateway/service.js +8 -5
- package/dist/src/home-intelligence/host.js +2 -2
- package/dist/src/personal-agent/capability-service.js +1 -1
- package/dist/src/personal-agent/request-access.d.ts +2 -0
- package/dist/src/personal-agent/request-access.js +22 -2
- package/dist/src/personal-agent/request-service.js +2 -2
- package/dist/src/personal-agent/specialist-capabilities.d.ts +2 -0
- package/dist/src/personal-agent/specialist-capabilities.js +9 -3
- package/dist/src/phone/adb-driver.d.ts +3 -0
- package/dist/src/phone/adb-driver.js +29 -0
- package/dist/src/phone/contracts.d.ts +14 -2
- package/dist/src/phone/contracts.js +8 -1
- package/dist/src/phone/gui-protocol.js +1 -1
- package/dist/src/phone/hdc-driver.d.ts +30 -0
- package/dist/src/phone/hdc-driver.js +331 -0
- package/dist/src/phone/hdc-video-bridge.d.ts +2 -0
- package/dist/src/phone/hdc-video-bridge.js +91 -0
- package/dist/src/phone/hdc-video-tools.d.ts +15 -0
- package/dist/src/phone/hdc-video-tools.js +123 -0
- package/dist/src/phone/hdc-video.d.ts +69 -0
- package/dist/src/phone/hdc-video.js +350 -0
- package/dist/src/phone/interactive-session.js +1 -1
- package/dist/src/phone/live-provider.d.ts +6 -0
- package/dist/src/phone/live-provider.js +1 -0
- package/dist/src/phone/model-adapter.d.ts +3 -0
- package/dist/src/phone/model-adapter.js +5 -3
- package/dist/src/phone/repository.js +2 -1
- package/dist/src/phone/runtime.d.ts +10 -4
- package/dist/src/phone/runtime.js +151 -85
- package/dist/src/phone/setup/service.d.ts +8 -6
- package/dist/src/phone/setup/service.js +33 -16
- package/dist/src/platform/client.d.ts +1 -1
- package/dist/src/platform/contracts.d.ts +1 -1
- package/dist/src/process/phone-process.d.ts +1 -1
- package/dist/src/process/phone-process.js +2 -2
- package/dist/src/runtime-tools/downloader.d.ts +1 -0
- package/dist/src/runtime-tools/downloader.js +8 -4
- package/dist/src/runtime-tools/harmony-dependencies.d.ts +24 -0
- package/dist/src/runtime-tools/harmony-dependencies.js +272 -0
- package/dist/src/runtime-tools/harmony-dependency-catalog.d.ts +4 -0
- package/dist/src/runtime-tools/harmony-dependency-catalog.js +54 -0
- package/dist/src/runtime-tools/harmony-paths.d.ts +9 -0
- package/dist/src/runtime-tools/harmony-paths.js +15 -0
- package/dist/src/runtime-tools/hdc-dependency-catalog.d.ts +8 -0
- package/dist/src/runtime-tools/hdc-dependency-catalog.js +83 -0
- package/dist/src/runtime-tools/hdc-files.d.ts +14 -0
- package/dist/src/runtime-tools/hdc-files.js +87 -0
- package/dist/src/runtime-tools/phone-dependencies.d.ts +6 -1
- package/dist/src/runtime-tools/phone-dependencies.js +20 -2
- package/dist/src/runtime-tools/phone-dependency-catalog.d.ts +10 -1
- package/dist/src/runtime-tools/phone-dependency-catalog.js +2 -0
- package/dist/src/runtime-tools/types.d.ts +1 -1
- package/dist/src/storage/sqlite/schema.d.ts +2 -2
- package/dist/src/storage/sqlite/schema.js +7 -7
- package/dist/src/storage/sqlite/schema.sql +16 -0
- package/dist/src/storage/sqlite/session-creation-repository.js +3 -0
- package/dist/src/storage/sqlite/session-input-control-repository.d.ts +12 -0
- package/dist/src/storage/sqlite/session-input-control-repository.js +83 -0
- package/dist/src/storage/sqlite/session-input-repository.d.ts +2 -0
- package/dist/src/storage/sqlite/session-input-repository.js +17 -5
- package/dist/src/storage/sqlite/session-repository.js +1 -0
- package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +2 -0
- package/dist/src/storage/sqlite/session-turn-replace-repository.js +14 -2
- package/dist/src/storage/sqlite/upgrades/262_session_input_control.sql +15 -0
- package/package.json +2 -2
- package/skills/tools/configure-xopc/SKILL.md +2 -2
- package/skills/tools/configure-xopc/references/phone/acceptance.md +3 -2
- package/skills/tools/configure-xopc/references/phone/dependencies.md +18 -2
- package/skills/tools/configure-xopc/references/phone/harmonyos.md +16 -0
- package/skills/tools/configure-xopc/references/phone/overview.md +2 -2
- package/skills/tools/configure-xopc/references/scene-index.md +2 -2
- package/dist/gateway/static/root/assets/apps-page-D-n71lO1.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-DWDWy-SG.js +0 -9
- package/dist/gateway/static/root/assets/capabilities-page-IcwojmJK.js +0 -2
- package/dist/gateway/static/root/assets/capability-links-DzQWK1Fh.js +0 -1
- package/dist/gateway/static/root/assets/chat-page-CwP4OMdW.js +0 -72
- package/dist/gateway/static/root/assets/computer-settings-page-DyAlOzqY.js +0 -1
- package/dist/gateway/static/root/assets/connected-providers-grid-D0lXg22c.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DI_Q0CKz.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BFeFfApQ.js +0 -1
- package/dist/gateway/static/root/assets/index-Cz-VjTNd.css +0 -1
- package/dist/gateway/static/root/assets/index-D1_PUrJf.js +0 -11
- package/dist/gateway/static/root/assets/install-connector-dialog-Cn4nRSyt.js +0 -1
- package/dist/gateway/static/root/assets/list-tree-B0OMswgM.js +0 -1
- package/dist/gateway/static/root/assets/messages-jwdBhfL9.js +0 -3
- package/dist/gateway/static/root/assets/note-image-lightbox-DGYRJS03.js +0 -1
- package/dist/gateway/static/root/assets/page-header-store-CEn_kPsn.js +0 -1
- package/dist/gateway/static/root/assets/phone-dependencies-card-DjmC1Z5j.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-connection-BRjHSgYn.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-picker-DgIiWLhR.js +0 -1
- package/dist/gateway/static/root/assets/phone-settings-page-DCZGCL_z.js +0 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-D4tGKip4.js +0 -1
- package/dist/gateway/static/root/assets/route-preload-C1BKDjnu.js +0 -2
- package/dist/gateway/static/root/assets/session-api-Bfmlmn9F.js +0 -1
- package/dist/gateway/static/root/assets/session-channel-icon-SsY70Z6t.js +0 -1
- package/dist/gateway/static/root/assets/session-identity-label-B7sgG1PE.js +0 -1
- package/dist/gateway/static/root/assets/session-manager-X4UHOjjO.js +0 -25
- package/dist/gateway/static/root/assets/settings-advanced-gate-Dk9c-Z5e.js +0 -1
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-msZa42fU.js +0 -1
|
@@ -25,6 +25,8 @@ export declare class PhoneRuntime {
|
|
|
25
25
|
private modelFactory;
|
|
26
26
|
private interactiveFactory;
|
|
27
27
|
readonly wireless: WirelessPhones;
|
|
28
|
+
private harmonyDriverFactory;
|
|
29
|
+
private harmonyVideoFactory;
|
|
28
30
|
private reconnecting;
|
|
29
31
|
private reconnectAfter;
|
|
30
32
|
private cloudPhones?;
|
|
@@ -38,9 +40,9 @@ export declare class PhoneRuntime {
|
|
|
38
40
|
private openings;
|
|
39
41
|
private deviceOpenings;
|
|
40
42
|
private maintenance?;
|
|
41
|
-
constructor(repository?: PhoneRepository, driverFactory?: (path: string) => PhoneDriver, modelFactory?: typeof createPhoneModel, interactiveFactory?: (adb: string, serial: string, failed: () => void) => PhoneInteractiveProvider, wireless?: WirelessPhones);
|
|
43
|
+
constructor(repository?: PhoneRepository, driverFactory?: (path: string) => PhoneDriver, modelFactory?: typeof createPhoneModel, interactiveFactory?: (adb: string, serial: string, failed: () => void) => PhoneInteractiveProvider, wireless?: WirelessPhones, harmonyDriverFactory?: (path: string) => PhoneDriver, harmonyVideoFactory?: (serial: string, config: Config['phone'], failed: () => void, validateScreen: (app: string) => void) => PhoneInteractiveProvider);
|
|
42
44
|
driverFor(device: PhoneDevice, config: Config): Promise<PhoneDriver>;
|
|
43
|
-
discover(config: Config, signal?: AbortSignal): Promise<import("./contracts.js").DiscoveredPhone[]>;
|
|
45
|
+
discover(config: Config, signal?: AbortSignal, platform?: 'android' | 'harmonyos'): Promise<import("./contracts.js").DiscoveredPhone[]>;
|
|
44
46
|
reconnectWireless(id: string, config: Config, signal?: AbortSignal, endpoint?: {
|
|
45
47
|
host: string;
|
|
46
48
|
port: number;
|
|
@@ -48,12 +50,13 @@ export declare class PhoneRuntime {
|
|
|
48
50
|
applications(input: {
|
|
49
51
|
deviceId?: string;
|
|
50
52
|
serial?: string;
|
|
53
|
+
platform?: 'android' | 'harmonyos';
|
|
51
54
|
}, config: Config, signal: AbortSignal): Promise<PhoneApplication[]>;
|
|
52
55
|
textInputStatus(id: string, config: Config, signal: AbortSignal): Promise<{
|
|
53
56
|
policy: "manual" | "auto";
|
|
54
|
-
androidSdk
|
|
57
|
+
androidSdk?: number;
|
|
55
58
|
unicode: "available" | "setup_required" | "unsupported";
|
|
56
|
-
method: "scrcpy-clipboard" | "provider-native";
|
|
59
|
+
method: "scrcpy-clipboard" | "provider-native" | "hdc-uitest";
|
|
57
60
|
keyboardRequired: false;
|
|
58
61
|
}>;
|
|
59
62
|
preview(id: string, config: Config, signal: AbortSignal): Promise<PhoneObservation>;
|
|
@@ -76,6 +79,7 @@ export declare class PhoneRuntime {
|
|
|
76
79
|
private busy;
|
|
77
80
|
private finishTask;
|
|
78
81
|
private perform;
|
|
82
|
+
private collectOutputs;
|
|
79
83
|
private recordObservation;
|
|
80
84
|
private modelRequestLimit;
|
|
81
85
|
private readOutputFields;
|
|
@@ -160,6 +164,7 @@ export declare class PhoneRuntime {
|
|
|
160
164
|
allowedApps: string[];
|
|
161
165
|
appAccess: "all" | "selected";
|
|
162
166
|
textInput: "manual" | "auto";
|
|
167
|
+
media: "snapshot" | "hdc-h264";
|
|
163
168
|
frame: {
|
|
164
169
|
seq: number;
|
|
165
170
|
capturedAt: number;
|
|
@@ -172,6 +177,7 @@ export declare class PhoneRuntime {
|
|
|
172
177
|
private expireHuman;
|
|
173
178
|
liveFrame(owner: string, id: string, context: ExecutionContext, signal: AbortSignal): Promise<{
|
|
174
179
|
frame: Buffer<ArrayBuffer>;
|
|
180
|
+
platform?: "android" | "harmonyos";
|
|
175
181
|
height: number;
|
|
176
182
|
capturedAt: number;
|
|
177
183
|
package: string;
|
|
@@ -9,12 +9,15 @@ import { PhoneFrameCache, PhoneOperationBudget } from "./live-state.js";
|
|
|
9
9
|
import { PhoneInteractiveSession } from "./interactive-session.js";
|
|
10
10
|
import { LocalScrcpyProvider } from "./scrcpy.js";
|
|
11
11
|
import { pendingPhoneAssistance, phoneAssistance, updatePhoneCheckpoint } from "./assistance.js";
|
|
12
|
+
import { canDispatchPhoneAction, observationSignature, phoneCompletionSatisfied } from "./reliability.js";
|
|
12
13
|
import { AdbPhoneDriver, resolveAdbPath } from "./adb-driver.js";
|
|
13
14
|
import { CloudPhones } from "./cloud-phones.js";
|
|
14
15
|
import { PhoneLocationEnvironment } from "./location-environment.js";
|
|
15
16
|
import { WirelessPhones } from "./wireless.js";
|
|
17
|
+
import { HdcPhoneDriver, resolveHdcPath } from "./hdc-driver.js";
|
|
18
|
+
import { resolveHdcVideoTools } from "./hdc-video-tools.js";
|
|
19
|
+
import { HdcVideoProvider } from "./hdc-video.js";
|
|
16
20
|
import { advancePhonePlan, buildPhonePlan, createPhonePlanState } from "./planning.js";
|
|
17
|
-
import { canDispatchPhoneAction, observationSignature, phoneCompletionSatisfied } from "./reliability.js";
|
|
18
21
|
import { groundPhoneCoordinateAction, resolvePhoneSemanticAction } from "./semantic-controls.js";
|
|
19
22
|
import { createPhoneModel, isAboutScreen } from "./model-adapter.js";
|
|
20
23
|
import { PhoneRepository } from "./repository.js";
|
|
@@ -22,7 +25,7 @@ import { phoneCompletionGuidance, phoneCompletionRecoveryHint } from "./completi
|
|
|
22
25
|
import { confirmPhoneFocusRecovery, phoneBackRecovery, phoneUnfocusedTypingHint, preparePhoneFocusRecovery } from "./recovery.js";
|
|
23
26
|
import { createPhoneNumericEntry, nextPhoneNumericEntry } from "./numeric-entry.js";
|
|
24
27
|
import { createHash, randomUUID } from "node:crypto";
|
|
25
|
-
import { setTimeout } from "node:timers/promises";
|
|
28
|
+
import { setTimeout as setTimeout$1 } from "node:timers/promises";
|
|
26
29
|
//#region src/phone/runtime.ts
|
|
27
30
|
init_logger();
|
|
28
31
|
init_contracts();
|
|
@@ -82,19 +85,29 @@ var PhoneRuntime = class {
|
|
|
82
85
|
openings = /* @__PURE__ */ new Map();
|
|
83
86
|
deviceOpenings = /* @__PURE__ */ new Map();
|
|
84
87
|
maintenance;
|
|
85
|
-
constructor(repository = new PhoneRepository(), driverFactory = (path) => new AdbPhoneDriver(path), modelFactory = createPhoneModel, interactiveFactory = (adb, serial, failed) => new LocalScrcpyProvider(adb, serial, failed), wireless = new WirelessPhones()) {
|
|
88
|
+
constructor(repository = new PhoneRepository(), driverFactory = (path) => new AdbPhoneDriver(path), modelFactory = createPhoneModel, interactiveFactory = (adb, serial, failed) => new LocalScrcpyProvider(adb, serial, failed), wireless = new WirelessPhones(), harmonyDriverFactory = (path) => new HdcPhoneDriver(path), harmonyVideoFactory = (serial, config, failed, validateScreen) => new HdcVideoProvider(serial, config, failed, { validateScreen })) {
|
|
86
89
|
this.repository = repository;
|
|
87
90
|
this.driverFactory = driverFactory;
|
|
88
91
|
this.modelFactory = modelFactory;
|
|
89
92
|
this.interactiveFactory = interactiveFactory;
|
|
90
93
|
this.wireless = wireless;
|
|
94
|
+
this.harmonyDriverFactory = harmonyDriverFactory;
|
|
95
|
+
this.harmonyVideoFactory = harmonyVideoFactory;
|
|
91
96
|
}
|
|
92
97
|
async driverFor(device, config) {
|
|
93
|
-
return device.connection ? this.cloud.driver(device) : this.driverFactory(resolveAdbPath(config.phone.adbPath));
|
|
98
|
+
return device.platform === "harmonyos" ? this.harmonyDriverFactory(resolveHdcPath(config.phone.hdcPath)) : device.connection ? this.cloud.driver(device) : this.driverFactory(resolveAdbPath(config.phone.adbPath));
|
|
94
99
|
}
|
|
95
|
-
async discover(config, signal) {
|
|
100
|
+
async discover(config, signal, platform) {
|
|
101
|
+
if (platform === "harmonyos") return this.harmonyDriverFactory(resolveHdcPath(config.phone.hdcPath)).discover(signal);
|
|
96
102
|
const driver = this.driverFactory(resolveAdbPath(config.phone.adbPath));
|
|
97
|
-
let devices =
|
|
103
|
+
let devices = [];
|
|
104
|
+
let adbError;
|
|
105
|
+
try {
|
|
106
|
+
devices = await driver.discover(signal);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
signal?.throwIfAborted();
|
|
109
|
+
adbError = error;
|
|
110
|
+
}
|
|
98
111
|
const missing = this.repository.list().filter((device) => device.enabled && device.wireless && !devices.some((item) => item.serial === device.serial && item.state === "device") && (this.reconnectAfter.get(device.id) ?? 0) < Date.now()).slice(0, 2);
|
|
99
112
|
const reconnectSignal = AbortSignal.any([AbortSignal.timeout(5e3), ...signal ? [signal] : []]);
|
|
100
113
|
await Promise.all(missing.map(async (device) => {
|
|
@@ -104,6 +117,15 @@ var PhoneRuntime = class {
|
|
|
104
117
|
});
|
|
105
118
|
}));
|
|
106
119
|
if (missing.length) devices = await driver.discover(signal);
|
|
120
|
+
let hdcAvailable = false;
|
|
121
|
+
if (platform !== "android" && (config.phone.hdcPath || this.repository.list().some((device) => device.platform === "harmonyos"))) try {
|
|
122
|
+
devices = [...devices, ...await this.harmonyDriverFactory(resolveHdcPath(config.phone.hdcPath)).discover(signal)];
|
|
123
|
+
hdcAvailable = true;
|
|
124
|
+
} catch (error) {
|
|
125
|
+
signal?.throwIfAborted();
|
|
126
|
+
if (!devices.length && this.repository.list().some((device) => device.platform === "harmonyos")) throw error;
|
|
127
|
+
}
|
|
128
|
+
if (adbError && !devices.length && !hdcAvailable) throw adbError;
|
|
107
129
|
return devices;
|
|
108
130
|
}
|
|
109
131
|
reconnectWireless(id, config, signal, endpoint) {
|
|
@@ -136,9 +158,9 @@ var PhoneRuntime = class {
|
|
|
136
158
|
driver = await this.driverFor(device, config);
|
|
137
159
|
serial = device.serial;
|
|
138
160
|
} else {
|
|
139
|
-
const found = (await this.discover(config, signal)).find((device) => device.serial === input.serial && device.state === "device");
|
|
161
|
+
const found = (await this.discover(config, signal, input.platform)).find((device) => (device.platform ?? "android") === (input.platform ?? "android") && device.serial === input.serial && device.state === "device");
|
|
140
162
|
if (!found) throw new PhoneError("PHONE_DEVICE_OFFLINE", "Choose a connected and authorized phone");
|
|
141
|
-
driver = this.driverFactory(resolveAdbPath(config.phone.adbPath));
|
|
163
|
+
driver = found.platform === "harmonyos" ? this.harmonyDriverFactory(resolveHdcPath(config.phone.hdcPath)) : this.driverFactory(resolveAdbPath(config.phone.adbPath));
|
|
142
164
|
serial = found.serial;
|
|
143
165
|
}
|
|
144
166
|
if (!driver.applications) throw new PhoneError("PHONE_APPS_UNAVAILABLE", "The phone provider cannot list applications");
|
|
@@ -571,7 +593,7 @@ var PhoneRuntime = class {
|
|
|
571
593
|
device = await this.reconnectWireless(device.id, context.config, signal);
|
|
572
594
|
found = (await driver.discover(signal)).find((item) => item.serial === device.serial);
|
|
573
595
|
}
|
|
574
|
-
if (found?.state !== "device") throw new PhoneError("PHONE_DEVICE_OFFLINE", "Phone is offline or has not authorized
|
|
596
|
+
if (found?.state !== "device") throw new PhoneError("PHONE_DEVICE_OFFLINE", "Phone is offline or has not authorized USB debugging");
|
|
575
597
|
if (modelRef === "phone-mock/settings-about" && !found.emulator) throw new PhoneError("PHONE_MOCK_EMULATOR_ONLY", "The deterministic mock model is only enabled for local Android emulators");
|
|
576
598
|
const lease = this.repository.acquire(device.serial);
|
|
577
599
|
try {
|
|
@@ -776,55 +798,7 @@ var PhoneRuntime = class {
|
|
|
776
798
|
session.controller.signal,
|
|
777
799
|
session.budget.controller.signal
|
|
778
800
|
]);
|
|
779
|
-
const operation = (
|
|
780
|
-
await this.perform(session, input, context, combined);
|
|
781
|
-
if ((input.op === "run" || input.op === "step") && ["ready", "completed"].includes(session.report.status) && session.report.task?.requestedOutputs.length) {
|
|
782
|
-
const observation = await this.observe(session, combined);
|
|
783
|
-
try {
|
|
784
|
-
this.guard(session, context);
|
|
785
|
-
this.allowedScreen(session, observation);
|
|
786
|
-
this.recordObservation(session, observation);
|
|
787
|
-
const conditions = input.completion || input.expectText ? {
|
|
788
|
-
...input.completion,
|
|
789
|
-
requireChange: false,
|
|
790
|
-
textAll: [...input.completion?.textAll ?? [], ...input.expectText ? [input.expectText] : []]
|
|
791
|
-
} : void 0;
|
|
792
|
-
if (session.report.verified && conditions && !phoneCompletionSatisfied({
|
|
793
|
-
...conditions,
|
|
794
|
-
textAll: conditions.textAll.length ? conditions.textAll : void 0
|
|
795
|
-
}, observation, true)) {
|
|
796
|
-
session.report.verified = false;
|
|
797
|
-
session.report.verificationLevel = "none";
|
|
798
|
-
session.report.status = "ready";
|
|
799
|
-
session.report.stopReason = "completion_changed";
|
|
800
|
-
}
|
|
801
|
-
const epoch = session.report.controlEpoch;
|
|
802
|
-
const visualOutputs = session.report.task.requestedOutputs.filter((request) => !request.selector);
|
|
803
|
-
if (visualOutputs.length > 1 && context.config.phone.batchReadings && session.adapter.readFields) await this.readOutputFields(session, observation, visualOutputs, context, combined);
|
|
804
|
-
for (const request of session.report.task.requestedOutputs) {
|
|
805
|
-
if (visualOutputs.length > 1 && context.config.phone.batchReadings && session.adapter.readFields) break;
|
|
806
|
-
if (request.selector) continue;
|
|
807
|
-
await this.readScreen(session, observation, request.description, context, combined);
|
|
808
|
-
if (epoch !== session.report.controlEpoch || session.report.controlOwner !== "agent") break;
|
|
809
|
-
const reading = session.report.readings?.at(-1);
|
|
810
|
-
if (reading?.source === "screenshot") {
|
|
811
|
-
const output = session.report.feedback.outputs.find((output) => output.key === request.key);
|
|
812
|
-
Object.assign(output, {
|
|
813
|
-
value: reading.text.join("\n") || void 0,
|
|
814
|
-
source: reading.source,
|
|
815
|
-
verification: reading.verification,
|
|
816
|
-
frameId: reading.frameId,
|
|
817
|
-
capturedAt: reading.capturedAt,
|
|
818
|
-
reason: reading.reason
|
|
819
|
-
});
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
this.publish(session);
|
|
823
|
-
} finally {
|
|
824
|
-
observation.frame.fill(0);
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
})();
|
|
801
|
+
const operation = this.perform(session, input, context, combined);
|
|
828
802
|
session.active = operation;
|
|
829
803
|
try {
|
|
830
804
|
await operation;
|
|
@@ -978,6 +952,16 @@ var PhoneRuntime = class {
|
|
|
978
952
|
let observation;
|
|
979
953
|
let heartbeat;
|
|
980
954
|
const startedAt = Date.now();
|
|
955
|
+
const finish = async () => {
|
|
956
|
+
if (observation && (input.op === "run" || input.op === "step") && ["ready", "completed"].includes(session.report.status) && session.report.task?.requestedOutputs.length) {
|
|
957
|
+
const status = session.report.status;
|
|
958
|
+
const epoch = session.report.controlEpoch;
|
|
959
|
+
session.report.status = "running";
|
|
960
|
+
await this.collectOutputs(session, input, observation, context, signal);
|
|
961
|
+
if (session.report.status === "running" && session.report.controlEpoch === epoch && session.report.controlOwner === "agent") session.report.status = status;
|
|
962
|
+
}
|
|
963
|
+
return this.publish(session);
|
|
964
|
+
};
|
|
981
965
|
session.report.errorCode = void 0;
|
|
982
966
|
session.report.verified = false;
|
|
983
967
|
session.report.verificationLevel = "none";
|
|
@@ -1003,7 +987,7 @@ var PhoneRuntime = class {
|
|
|
1003
987
|
this.recordObservation(session, observation);
|
|
1004
988
|
if (!session.report.facts?.length || input.goal) await this.readScreen(session, observation, input.goal ?? "Read the visible page text and values", context, signal);
|
|
1005
989
|
if (session.report.controlOwner === "agent" && !signal.aborted) session.report.status = "ready";
|
|
1006
|
-
return
|
|
990
|
+
return await finish();
|
|
1007
991
|
}
|
|
1008
992
|
if (input.op !== "run" && input.op !== "step") throw new PhoneError("PHONE_INVALID_OPERATION", "Unsupported operation");
|
|
1009
993
|
if (session.report.mode !== "control") throw new PhoneError("PHONE_OBSERVE_ONLY", "Reopen the phone in control mode to execute actions");
|
|
@@ -1076,7 +1060,7 @@ var PhoneRuntime = class {
|
|
|
1076
1060
|
if (numericIntent) {
|
|
1077
1061
|
let next = nextPhoneNumericEntry(numericIntent, observation, numericPending);
|
|
1078
1062
|
for (let poll = 0; numericPending && next.kind === "blocked" && poll < 2; poll++) {
|
|
1079
|
-
await setTimeout(150, void 0, { signal });
|
|
1063
|
+
await setTimeout$1(150, void 0, { signal });
|
|
1080
1064
|
observation.frame.fill(0);
|
|
1081
1065
|
observation = await this.observe(session, signal);
|
|
1082
1066
|
this.guard(session, context);
|
|
@@ -1095,7 +1079,7 @@ var PhoneRuntime = class {
|
|
|
1095
1079
|
session.report.message = "Numeric input was not confirmed. Inspect the displayed value before continuing; no key was retried.";
|
|
1096
1080
|
session.budget?.pause();
|
|
1097
1081
|
await session.stream?.revoke();
|
|
1098
|
-
return
|
|
1082
|
+
return await finish();
|
|
1099
1083
|
}
|
|
1100
1084
|
if (numericPending) session.report.diagnostics.numericConfirmedSteps = (session.report.diagnostics.numericConfirmedSteps ?? 0) + 1;
|
|
1101
1085
|
numericPending = void 0;
|
|
@@ -1119,11 +1103,13 @@ var PhoneRuntime = class {
|
|
|
1119
1103
|
planning = advancePhonePlan(planning, confirmation);
|
|
1120
1104
|
session.report.diagnostics.completedSubgoals = planning.verifiedSteps;
|
|
1121
1105
|
}
|
|
1106
|
+
observation.frame.fill(0);
|
|
1107
|
+
observation = confirmation;
|
|
1122
1108
|
session.report.verified = true;
|
|
1123
1109
|
session.report.verificationLevel = "ui";
|
|
1124
1110
|
session.report.status = "completed";
|
|
1125
1111
|
session.report.stopReason = actions ? "condition_satisfied" : "condition_present";
|
|
1126
|
-
return
|
|
1112
|
+
return await finish();
|
|
1127
1113
|
} finally {
|
|
1128
1114
|
if (observation !== confirmation) confirmation.frame.fill(0);
|
|
1129
1115
|
}
|
|
@@ -1131,12 +1117,12 @@ var PhoneRuntime = class {
|
|
|
1131
1117
|
if (session.report.actions - (session.report.humanActions ?? 0) - (session.taskStart?.actions ?? 0) >= (session.report.task?.budget?.maxActions ?? 80)) {
|
|
1132
1118
|
session.report.status = "ready";
|
|
1133
1119
|
session.report.stopReason = "task_action_limit";
|
|
1134
|
-
return
|
|
1120
|
+
return await finish();
|
|
1135
1121
|
}
|
|
1136
1122
|
if (actions >= maxActions) {
|
|
1137
1123
|
session.report.status = "ready";
|
|
1138
1124
|
session.report.stopReason = "action_limit";
|
|
1139
|
-
return
|
|
1125
|
+
return await finish();
|
|
1140
1126
|
}
|
|
1141
1127
|
let decision = numericStep ? {
|
|
1142
1128
|
kind: "action",
|
|
@@ -1251,13 +1237,21 @@ var PhoneRuntime = class {
|
|
|
1251
1237
|
session.report.message = "The required native UI conditions are still unmet. Inspect the current screen before resuming; no action was generated from the completion conditions.";
|
|
1252
1238
|
session.budget?.pause();
|
|
1253
1239
|
await session.stream?.revoke();
|
|
1254
|
-
return
|
|
1240
|
+
return await finish();
|
|
1255
1241
|
}
|
|
1256
1242
|
session.report.message = decision.kind === "needsUser" ? decision.reason : decision.summary;
|
|
1257
1243
|
if (decision.kind === "complete") {
|
|
1244
|
+
if (session.report.task?.requestedOutputs.length) {
|
|
1245
|
+
observation.frame.fill(0);
|
|
1246
|
+
observation = await this.observe(session, signal);
|
|
1247
|
+
signal.throwIfAborted();
|
|
1248
|
+
this.guard(session, context);
|
|
1249
|
+
this.allowedScreen(session, observation);
|
|
1250
|
+
if (epoch !== session.report.controlEpoch || session.report.controlOwner !== "agent") continue;
|
|
1251
|
+
}
|
|
1258
1252
|
this.recordObservation(session, observation);
|
|
1259
|
-
if (!
|
|
1260
|
-
if (epoch !== session.report.controlEpoch || session.report.controlOwner !== "agent") return
|
|
1253
|
+
if (!session.report.task?.requestedOutputs.length) await this.readScreen(session, observation, input.goal, context, signal);
|
|
1254
|
+
if (epoch !== session.report.controlEpoch || session.report.controlOwner !== "agent") return await finish();
|
|
1261
1255
|
}
|
|
1262
1256
|
session.report.status = decision.kind === "needsUser" ? "needs_user" : "completed";
|
|
1263
1257
|
session.report.stopReason = decision.kind === "needsUser" ? "user_takeover" : "model_finished_unverified";
|
|
@@ -1267,9 +1261,9 @@ var PhoneRuntime = class {
|
|
|
1267
1261
|
session.budget?.pause();
|
|
1268
1262
|
session.report.assistanceId = context.onNeedsUser?.(this.checkpoint(session));
|
|
1269
1263
|
await session.stream?.revoke();
|
|
1270
|
-
return
|
|
1264
|
+
return await finish();
|
|
1271
1265
|
}
|
|
1272
|
-
return
|
|
1266
|
+
return await finish();
|
|
1273
1267
|
}
|
|
1274
1268
|
let preparedFocus;
|
|
1275
1269
|
if (enhancements.hierarchicalPlanning) {
|
|
@@ -1291,7 +1285,7 @@ var PhoneRuntime = class {
|
|
|
1291
1285
|
session.report.message = back.hint;
|
|
1292
1286
|
session.budget?.pause();
|
|
1293
1287
|
await session.stream?.revoke();
|
|
1294
|
-
return
|
|
1288
|
+
return await finish();
|
|
1295
1289
|
}
|
|
1296
1290
|
recoveryHint = back.hint;
|
|
1297
1291
|
observation.frame.fill(0);
|
|
@@ -1316,14 +1310,17 @@ var PhoneRuntime = class {
|
|
|
1316
1310
|
}
|
|
1317
1311
|
}
|
|
1318
1312
|
}
|
|
1319
|
-
const fresh = await this.observe(session, signal
|
|
1313
|
+
const fresh = await this.observe(session, signal, false, {
|
|
1314
|
+
observation,
|
|
1315
|
+
action: decision.action
|
|
1316
|
+
});
|
|
1320
1317
|
try {
|
|
1321
1318
|
this.allowedScreen(session, fresh);
|
|
1322
1319
|
if (decision.action.type !== "tapElement" && !canDispatchPhoneAction(decision.action, observation, fresh)) {
|
|
1323
1320
|
session.report.diagnostics.stalePredictions++;
|
|
1324
1321
|
recoveryHint = "The proposed action was not dispatched because its target changed. Locate it again on the fresh screen.";
|
|
1325
1322
|
observation.frame.fill(0);
|
|
1326
|
-
observation = fresh;
|
|
1323
|
+
observation = fresh.frame.length ? fresh : await this.observe(session, signal);
|
|
1327
1324
|
continue;
|
|
1328
1325
|
}
|
|
1329
1326
|
let action = enhancements.semanticControls ? groundPhoneCoordinateAction(decision.action, observation) : decision.action;
|
|
@@ -1337,7 +1334,7 @@ var PhoneRuntime = class {
|
|
|
1337
1334
|
session.report.diagnostics.semanticRejections = (session.report.diagnostics.semanticRejections ?? 0) + 1;
|
|
1338
1335
|
recoveryHint = "The semantic target was not dispatched: select one unique fully visible non-password control from the fresh native UI.";
|
|
1339
1336
|
observation.frame.fill(0);
|
|
1340
|
-
observation = fresh;
|
|
1337
|
+
observation = fresh.frame.length ? fresh : await this.observe(session, signal);
|
|
1341
1338
|
continue;
|
|
1342
1339
|
}
|
|
1343
1340
|
}
|
|
@@ -1345,7 +1342,7 @@ var PhoneRuntime = class {
|
|
|
1345
1342
|
session.report.diagnostics.stalePredictions++;
|
|
1346
1343
|
recoveryHint = "The proposed action was not dispatched because its target changed. Locate it again on the fresh screen.";
|
|
1347
1344
|
observation.frame.fill(0);
|
|
1348
|
-
observation = fresh;
|
|
1345
|
+
observation = fresh.frame.length ? fresh : await this.observe(session, signal);
|
|
1349
1346
|
continue;
|
|
1350
1347
|
}
|
|
1351
1348
|
if (epoch !== session.report.controlEpoch || session.report.controlOwner !== "agent") continue;
|
|
@@ -1359,7 +1356,7 @@ var PhoneRuntime = class {
|
|
|
1359
1356
|
session.report.message = "Repeated actions made no progress. Inspect the phone and hand back before continuing.";
|
|
1360
1357
|
session.budget?.pause();
|
|
1361
1358
|
await session.stream?.revoke();
|
|
1362
|
-
return
|
|
1359
|
+
return await finish();
|
|
1363
1360
|
}
|
|
1364
1361
|
attempts.set(attemptKey, repetitions + 1);
|
|
1365
1362
|
if (await this.dispatch(session, action, fresh, context, signal, epoch)) {
|
|
@@ -1406,7 +1403,7 @@ var PhoneRuntime = class {
|
|
|
1406
1403
|
session.budget?.pause();
|
|
1407
1404
|
session.report.assistanceId = context.onNeedsUser?.(this.checkpoint(session));
|
|
1408
1405
|
await session.stream?.revoke();
|
|
1409
|
-
return
|
|
1406
|
+
return await finish();
|
|
1410
1407
|
}
|
|
1411
1408
|
if (failure instanceof PhoneError && failure.code === "PHONE_OPERATION_TIMEOUT" && !terminal.has(session.report.status) && session.report.status !== "paused" && session.report.status !== "outcome_unknown") {
|
|
1412
1409
|
session.report.status = "paused";
|
|
@@ -1427,7 +1424,7 @@ var PhoneRuntime = class {
|
|
|
1427
1424
|
errorCode: failure.code,
|
|
1428
1425
|
phase: "goal_timeout"
|
|
1429
1426
|
}, "Phone goal timed out; session remains paused for inspection");
|
|
1430
|
-
return
|
|
1427
|
+
return await finish();
|
|
1431
1428
|
}
|
|
1432
1429
|
log.warn({
|
|
1433
1430
|
sessionId: session.report.sessionId,
|
|
@@ -1466,6 +1463,48 @@ var PhoneRuntime = class {
|
|
|
1466
1463
|
}, "Phone goal finished");
|
|
1467
1464
|
}
|
|
1468
1465
|
}
|
|
1466
|
+
async collectOutputs(session, input, observation, context, signal) {
|
|
1467
|
+
this.guard(session, context);
|
|
1468
|
+
this.allowedScreen(session, observation);
|
|
1469
|
+
this.recordObservation(session, observation);
|
|
1470
|
+
const conditions = input.completion || input.expectText ? {
|
|
1471
|
+
...input.completion,
|
|
1472
|
+
requireChange: false,
|
|
1473
|
+
textAll: [...input.completion?.textAll ?? [], ...input.expectText ? [input.expectText] : []]
|
|
1474
|
+
} : void 0;
|
|
1475
|
+
if (session.report.verified && conditions && !phoneCompletionSatisfied({
|
|
1476
|
+
...conditions,
|
|
1477
|
+
textAll: conditions.textAll.length ? conditions.textAll : void 0
|
|
1478
|
+
}, observation, true)) {
|
|
1479
|
+
session.report.verified = false;
|
|
1480
|
+
session.report.verificationLevel = "none";
|
|
1481
|
+
session.report.status = "ready";
|
|
1482
|
+
session.report.stopReason = "completion_changed";
|
|
1483
|
+
}
|
|
1484
|
+
const epoch = session.report.controlEpoch;
|
|
1485
|
+
signal.throwIfAborted();
|
|
1486
|
+
const visualOutputs = session.report.task.requestedOutputs.filter((request) => !request.selector);
|
|
1487
|
+
if (visualOutputs.length > 1 && context.config.phone.batchReadings && session.adapter.readFields) {
|
|
1488
|
+
await this.readOutputFields(session, observation, visualOutputs, context, signal);
|
|
1489
|
+
return;
|
|
1490
|
+
}
|
|
1491
|
+
for (const request of visualOutputs) {
|
|
1492
|
+
await this.readScreen(session, observation, request.description, context, signal);
|
|
1493
|
+
if (epoch !== session.report.controlEpoch || session.report.controlOwner !== "agent") break;
|
|
1494
|
+
const reading = session.report.readings?.at(-1);
|
|
1495
|
+
if (reading?.source === "screenshot") {
|
|
1496
|
+
const output = session.report.feedback.outputs.find((output) => output.key === request.key);
|
|
1497
|
+
Object.assign(output, {
|
|
1498
|
+
value: reading.text.join("\n") || void 0,
|
|
1499
|
+
source: reading.source,
|
|
1500
|
+
verification: reading.verification,
|
|
1501
|
+
frameId: reading.frameId,
|
|
1502
|
+
capturedAt: reading.capturedAt,
|
|
1503
|
+
reason: reading.reason
|
|
1504
|
+
});
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1469
1508
|
recordObservation(session, observation) {
|
|
1470
1509
|
if (session.report.task && session.report.feedback) session.report.feedback.outputs = session.report.task.requestedOutputs.map((output) => nativePhoneOutput(output, observation));
|
|
1471
1510
|
session.report.foregroundApp = observation.package;
|
|
@@ -1590,7 +1629,7 @@ var PhoneRuntime = class {
|
|
|
1590
1629
|
if (session.human && (session.report.humanActions ?? 0) >= 1200) throw new PhoneError("PHONE_ACTION_LIMIT", "Manual input limit reached; reopen the session");
|
|
1591
1630
|
if (action.type === "launch" && !phoneAllowsApp(session.device, action.package)) throw new PhoneError("PHONE_APP_DENIED", "Application is not authorized");
|
|
1592
1631
|
if (action.type === "home" && phoneAppAccess(session.device) !== "all") throw new PhoneError("PHONE_APP_DENIED", "Home leaves the app allowlist");
|
|
1593
|
-
if (action.type === "typeText" && session.device.textInput === "manual") throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Automatic text input is disabled for this phone. Ask the user to take over and type with the phone keyboard.", 409);
|
|
1632
|
+
if (action.type === "typeText" && (session.device.platform === "harmonyos" || session.device.textInput === "manual")) throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Automatic text input is disabled for this phone. Ask the user to take over and type with the phone keyboard.", 409);
|
|
1594
1633
|
if (action.type === "typeText" && !observation.elements.some((node) => node.focused && node.editable && !node.password)) throw new PhoneError("PHONE_INPUT_NOT_FOCUSED", "Focus a non-password editable field before typing", 409);
|
|
1595
1634
|
const step = {
|
|
1596
1635
|
action: action.type,
|
|
@@ -1674,8 +1713,10 @@ var PhoneRuntime = class {
|
|
|
1674
1713
|
session.report.controlEpoch++;
|
|
1675
1714
|
if (op === "pause") await session.stream?.revoke();
|
|
1676
1715
|
else {
|
|
1716
|
+
clearTimeout(session.videoIdleTimer);
|
|
1677
1717
|
session.videoGeneration = void 0;
|
|
1678
1718
|
await session.stream?.close();
|
|
1719
|
+
await session.streamClosing;
|
|
1679
1720
|
session.stream = void 0;
|
|
1680
1721
|
}
|
|
1681
1722
|
for (const wake of session.wake) wake();
|
|
@@ -1730,13 +1771,13 @@ var PhoneRuntime = class {
|
|
|
1730
1771
|
session.io = operation.catch(() => {});
|
|
1731
1772
|
return operation;
|
|
1732
1773
|
}
|
|
1733
|
-
async observe(session, signal, forText = false) {
|
|
1774
|
+
async observe(session, signal, forText = false, dispatchFrom) {
|
|
1734
1775
|
return this.io(session, async () => {
|
|
1735
1776
|
signal.throwIfAborted();
|
|
1736
1777
|
const observe = forText && session.driver.observeForText ? session.driver.observeForText : session.driver.observe;
|
|
1737
|
-
const observation = await measurePhonePhase("observation", () => observe.call(session.driver, session.device.serial, signal));
|
|
1778
|
+
const observation = await measurePhonePhase("observation", () => dispatchFrom && session.driver.observeForDispatch ? session.driver.observeForDispatch(session.device.serial, dispatchFrom.observation, dispatchFrom.action, signal) : observe.call(session.driver, session.device.serial, signal));
|
|
1738
1779
|
if (phoneAllowsApp(session.device, observation.package)) {
|
|
1739
|
-
if (Date.now() - session.viewedAt < 3e4 && !terminal.has(session.report.status)) session.frames.set(observation);
|
|
1780
|
+
if (observation.frame.length && Date.now() - session.viewedAt < 3e4 && !terminal.has(session.report.status)) session.frames.set(observation);
|
|
1740
1781
|
} else session.frames.clear();
|
|
1741
1782
|
return observation;
|
|
1742
1783
|
});
|
|
@@ -1790,6 +1831,7 @@ var PhoneRuntime = class {
|
|
|
1790
1831
|
this.maintenance = setInterval(() => {
|
|
1791
1832
|
for (const session of this.sessions.values()) {
|
|
1792
1833
|
if (terminal.has(session.report.status)) {
|
|
1834
|
+
clearTimeout(session.videoIdleTimer);
|
|
1793
1835
|
session.frames.clear();
|
|
1794
1836
|
const stream = session.stream;
|
|
1795
1837
|
session.stream = void 0;
|
|
@@ -1837,7 +1879,8 @@ var PhoneRuntime = class {
|
|
|
1837
1879
|
ownControl: Boolean(session.human === client),
|
|
1838
1880
|
allowedApps: [...session.device.allowedApps],
|
|
1839
1881
|
appAccess: phoneAppAccess(session.device),
|
|
1840
|
-
textInput: session.device.textInput ?? "auto",
|
|
1882
|
+
textInput: session.device.platform === "harmonyos" ? "manual" : session.device.textInput ?? "auto",
|
|
1883
|
+
media: session.device.platform === "harmonyos" ? resolveHdcVideoTools(context.config.phone) ? "hdc-h264" : "snapshot" : void 0,
|
|
1841
1884
|
frame: session.frames.get() ? {
|
|
1842
1885
|
seq: session.frames.get().seq,
|
|
1843
1886
|
capturedAt: session.frames.get().capturedAt
|
|
@@ -1846,6 +1889,8 @@ var PhoneRuntime = class {
|
|
|
1846
1889
|
}
|
|
1847
1890
|
async liveVideo(owner, id, context) {
|
|
1848
1891
|
const session = this.liveSession(owner, id, context);
|
|
1892
|
+
clearTimeout(session.videoIdleTimer);
|
|
1893
|
+
await session.streamClosing;
|
|
1849
1894
|
if (terminal.has(session.report.status)) throw new PhoneError("PHONE_OPEN_REQUIRED", "Phone session ended", 409);
|
|
1850
1895
|
if (session.streamOpening) return session.streamOpening;
|
|
1851
1896
|
const opening = this.openLiveVideo(session);
|
|
@@ -1867,7 +1912,10 @@ var PhoneRuntime = class {
|
|
|
1867
1912
|
session.videoGeneration = void 0;
|
|
1868
1913
|
this.stop(session.report.owner, "pause");
|
|
1869
1914
|
};
|
|
1870
|
-
const provider = session.device.
|
|
1915
|
+
const provider = session.device.platform === "harmonyos" ? this.harmonyVideoFactory(session.device.serial, session.context.config.phone, failed, (app) => {
|
|
1916
|
+
this.guard(session, session.context, false);
|
|
1917
|
+
if (!phoneAllowsApp(session.device, app)) throw new PhoneError("PHONE_APP_DENIED", "Current page is outside the authorized applications", 403);
|
|
1918
|
+
}) : session.device.connection ? await this.cloud.interactive(session.device, failed) : this.interactiveFactory(session.adbPath, session.device.serial, failed);
|
|
1871
1919
|
if (terminal.has(session.report.status)) {
|
|
1872
1920
|
await provider.close();
|
|
1873
1921
|
throw new PhoneError("PHONE_VIDEO_ENDED", "Phone session ended", 409);
|
|
@@ -1911,8 +1959,26 @@ var PhoneRuntime = class {
|
|
|
1911
1959
|
if (!session || session.report.sessionId !== id) return;
|
|
1912
1960
|
if (session.stream?.viewerCount === 0) {
|
|
1913
1961
|
const stream = session.stream;
|
|
1914
|
-
session.
|
|
1915
|
-
|
|
1962
|
+
if (session.device.platform === "harmonyos") {
|
|
1963
|
+
clearTimeout(session.videoIdleTimer);
|
|
1964
|
+
session.videoIdleTimer = setTimeout(() => {
|
|
1965
|
+
if (session.stream !== stream || stream.viewerCount) return;
|
|
1966
|
+
session.stream = void 0;
|
|
1967
|
+
const closing = stream.close();
|
|
1968
|
+
session.streamClosing = closing;
|
|
1969
|
+
closing.catch((err) => log.warn({
|
|
1970
|
+
err,
|
|
1971
|
+
conversationId: owner,
|
|
1972
|
+
phase: "video_cleanup"
|
|
1973
|
+
}, "HarmonyOS video cleanup failed")).finally(() => {
|
|
1974
|
+
if (session.streamClosing === closing) session.streamClosing = void 0;
|
|
1975
|
+
});
|
|
1976
|
+
}, 1500);
|
|
1977
|
+
session.videoIdleTimer.unref();
|
|
1978
|
+
} else {
|
|
1979
|
+
session.stream = void 0;
|
|
1980
|
+
await stream.close();
|
|
1981
|
+
}
|
|
1916
1982
|
}
|
|
1917
1983
|
}
|
|
1918
1984
|
async clearExpiredHuman(session) {
|
|
@@ -22,7 +22,7 @@ export interface PhoneSetupMutation {
|
|
|
22
22
|
}
|
|
23
23
|
export interface PhoneSetupDeps {
|
|
24
24
|
runtime: PhoneRuntime;
|
|
25
|
-
inspect(context: Context, source?: 'local' | 'aliyun'): Promise<PhoneSetupView['readiness']>;
|
|
25
|
+
inspect(context: Context, source?: 'local' | 'aliyun' | 'harmonyos'): Promise<PhoneSetupView['readiness']>;
|
|
26
26
|
revision(context: Context, deviceId: string): string;
|
|
27
27
|
connected(deviceId: string, signal?: AbortSignal): Promise<boolean>;
|
|
28
28
|
leaseActive(deviceId: string): boolean;
|
|
@@ -33,8 +33,8 @@ export interface PhoneSetupDeps {
|
|
|
33
33
|
configured: boolean;
|
|
34
34
|
}>;
|
|
35
35
|
configure?: (enabled: boolean, mutation?: PhoneSetupMutation) => Promise<void>;
|
|
36
|
-
install?: (kind: 'adb' | 'scrcpy', repair: boolean, mutation?: PhoneSetupMutation) => Promise<void>;
|
|
37
|
-
registerLocal?: (serial: string, name?: string, mutation?: PhoneSetupMutation) => Promise<void>;
|
|
36
|
+
install?: (kind: 'adb' | 'scrcpy' | 'hdc' | 'hoscrcpy' | 'java', repair: boolean, mutation?: PhoneSetupMutation) => Promise<void>;
|
|
37
|
+
registerLocal?: (serial: string, name?: string, mutation?: PhoneSetupMutation, platform?: 'android' | 'harmonyos') => Promise<void>;
|
|
38
38
|
}
|
|
39
39
|
/** Bounded product actions automate setup; credentials remain in secure product forms. */
|
|
40
40
|
export declare class PhoneSetupService {
|
|
@@ -63,15 +63,17 @@ export declare class PhoneSetupService {
|
|
|
63
63
|
configured: boolean;
|
|
64
64
|
};
|
|
65
65
|
dependencies: Array<{
|
|
66
|
-
kind: "adb" | "scrcpy";
|
|
66
|
+
kind: "adb" | "scrcpy" | "hdc" | "hoscrcpy" | "java";
|
|
67
67
|
state: string;
|
|
68
68
|
version?: string;
|
|
69
69
|
canInstall: boolean;
|
|
70
|
+
distribution?: string;
|
|
71
|
+
downloadUrl?: string;
|
|
70
72
|
}>;
|
|
71
73
|
devices: Array<{
|
|
72
74
|
id: string;
|
|
73
75
|
name: string;
|
|
74
|
-
source: "local" | "aliyun";
|
|
76
|
+
source: "local" | "aliyun" | "harmonyos";
|
|
75
77
|
enabled: boolean;
|
|
76
78
|
settingsAllowed: boolean;
|
|
77
79
|
}>;
|
|
@@ -98,7 +100,7 @@ export declare class PhoneSetupService {
|
|
|
98
100
|
configured: boolean;
|
|
99
101
|
}[];
|
|
100
102
|
}>;
|
|
101
|
-
source(context: Context, id: string, source: 'local' | 'aliyun', revision: number): Promise<PhoneSetupView>;
|
|
103
|
+
source(context: Context, id: string, source: 'local' | 'aliyun' | 'harmonyos', revision: number): Promise<PhoneSetupView>;
|
|
102
104
|
begin(context: Context, id: string, deviceId: string, revision: number, signal?: AbortSignal): Promise<PhoneSetupView>;
|
|
103
105
|
beforeInput(context: Context, input: PhoneInput): {
|
|
104
106
|
owner: string;
|