@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.
Files changed (362) hide show
  1. package/README.md +5 -5
  2. package/README.zh-CN.md +5 -5
  3. package/dist/browser-ext/dist/sidepanel.js +11 -0
  4. package/dist/browser-ext/manifest.json +1 -1
  5. package/dist/extensions/telegram/xopc.extension.json +1 -1
  6. package/dist/gateway/static/root/assets/{activity-store-BpYGrRXw.js → activity-store-Cwn_CNwl.js} +1 -1
  7. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DTgOSv6G.js → agent-avatar-dicebear-Cd23LnJJ.js} +1 -1
  8. package/dist/gateway/static/root/assets/{agent-avatar-display-BUH7ljEo.js → agent-avatar-display-ByzM7u9S.js} +2 -2
  9. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-B_FAikHA.js → agent-defaults-settings-panel-B0i37diS.js} +1 -1
  10. package/dist/gateway/static/root/assets/{agent-plugin-dialog-DPabZaSE.js → agent-plugin-dialog-XN-tZ-Ox.js} +1 -1
  11. package/dist/gateway/static/root/assets/{agents-BAPYP1Ka.js → agents-ZDA1OaLv.js} +3 -3
  12. package/dist/gateway/static/root/assets/{agents-admin-api-CXCAHNPj.js → agents-admin-api-B5lKH_ps.js} +1 -1
  13. package/dist/gateway/static/root/assets/{api-oIK4hYkJ.js → api-B9fZL-V8.js} +1 -1
  14. package/dist/gateway/static/root/assets/{api-DMbimMEi.js → api-Djju8qIR.js} +1 -1
  15. package/dist/gateway/static/root/assets/{app-management-settings-panel-BZ3Fy8ZR.js → app-management-settings-panel-IlyzDPJu.js} +1 -1
  16. package/dist/gateway/static/root/assets/{appearance-settings-DsRTj1by.js → appearance-settings-BxdFGob3.js} +1 -1
  17. package/dist/gateway/static/root/assets/apps-page-CxEKiOTA.js +1 -0
  18. package/dist/gateway/static/root/assets/{archive-plugin-Bg1VTieK.js → archive-plugin-4gEvotPr.js} +1 -1
  19. package/dist/gateway/static/root/assets/{automation-api-CLPsgcQN.js → automation-api-4fVKv9PJ.js} +1 -1
  20. package/dist/gateway/static/root/assets/{automation-result-state-CKVnR4KG.js → automation-result-state-m7PeK2kl.js} +1 -1
  21. package/dist/gateway/static/root/assets/automation-run-list-CJOdy_R2.js +1 -0
  22. package/dist/gateway/static/root/assets/{automation-task-card-D27Mw66U.js → automation-task-card-DZWhCWJa.js} +3 -3
  23. package/dist/gateway/static/root/assets/{automations-page-DGNTJ8lN.js → automations-page-BjbM15eY.js} +1 -1
  24. package/dist/gateway/static/root/assets/automations-workspace-CqurzLYX.js +9 -0
  25. package/dist/gateway/static/root/assets/{binary-plugins-CuwSdCG5.js → binary-plugins-69WyJLNW.js} +1 -1
  26. package/dist/gateway/static/root/assets/{block-editor-Dtl2BG3t.js → block-editor-DUONDIZR.js} +1 -1
  27. package/dist/gateway/static/root/assets/{browser-automation-inputs-uGK086ag.js → browser-automation-inputs-DL4YPCuN.js} +1 -1
  28. package/dist/gateway/static/root/assets/{browser-automations-page-Da_edNNS.js → browser-automations-page-1Aq6XmRs.js} +1 -1
  29. package/dist/gateway/static/root/assets/{browser-control-api-k3OOX3bS.js → browser-control-api-yjru8E7R.js} +1 -1
  30. package/dist/gateway/static/root/assets/{browser-settings-page-C1bSw-Jq.js → browser-settings-page-CvwpT8Um.js} +1 -1
  31. package/dist/gateway/static/root/assets/{capabilities-DlHPLld_.js → capabilities-C7lnwKKm.js} +1 -1
  32. package/dist/gateway/static/root/assets/{capabilities-CoeuLRt6.js → capabilities-DaeQXJT4.js} +1 -1
  33. package/dist/gateway/static/root/assets/capabilities-page-B5avAOUM.js +2 -0
  34. package/dist/gateway/static/root/assets/{capabilities-settings-panel-CtY-bGIi.js → capabilities-settings-panel-_9yCS78i.js} +1 -1
  35. package/dist/gateway/static/root/assets/capability-links-DeO34GIF.js +1 -0
  36. package/dist/gateway/static/root/assets/{channels-Cn1MWBL_.js → channels-CoQb4HOF.js} +1 -1
  37. package/dist/gateway/static/root/assets/{chat-agents-api-BB0biwc7.js → chat-agents-api-BUi_7GRo.js} +1 -1
  38. package/dist/gateway/static/root/assets/{chat-chart-block-QSvjx4w6.js → chat-chart-block-CcVcKsDZ.js} +1 -1
  39. package/dist/gateway/static/root/assets/chat-page--wcFhTjW.js +72 -0
  40. package/dist/gateway/static/root/assets/{chat-terminal-dock-Cd51G9eG.js → chat-terminal-dock-BMXJpPuH.js} +1 -1
  41. package/dist/gateway/static/root/assets/{command-palette-api-CEG10uE-.js → command-palette-api-luUjQPsh.js} +1 -1
  42. package/dist/gateway/static/root/assets/{composer-payload-handoff-Bogdq9Hy.js → composer-payload-handoff-B5XNxNCb.js} +1 -1
  43. package/dist/gateway/static/root/assets/computer-settings-page-CWtdyEJH.js +1 -0
  44. package/dist/gateway/static/root/assets/connected-providers-grid-2idMtk65.js +1 -0
  45. package/dist/gateway/static/root/assets/connection-usage-Cm_McddI.js +1 -0
  46. package/dist/gateway/static/root/assets/connection-usage-guide-Ddh0bfkj.js +1 -0
  47. package/dist/gateway/static/root/assets/{connector-service-page-k2rjyjrp.js → connector-service-page-C3msXaBk.js} +1 -1
  48. package/dist/gateway/static/root/assets/{connectors-api-DtvB9Cjm.js → connectors-api-NcWECWKg.js} +1 -1
  49. package/dist/gateway/static/root/assets/connectors-page-Crb6DILX.js +1 -0
  50. package/dist/gateway/static/root/assets/{date-picker-CAankdQw.js → date-picker-Cfjq1hD_.js} +1 -1
  51. package/dist/gateway/static/root/assets/{desktop-pet-DjM73fir.js → desktop-pet-ChFn9v-3.js} +1 -1
  52. package/dist/gateway/static/root/assets/{desktop-pet-settings-Rmh-GxHl.js → desktop-pet-settings-DvnVIv25.js} +1 -1
  53. package/dist/gateway/static/root/assets/{dev-view-store-BgW2Riyk.js → dev-view-store-DQJ61P5L.js} +1 -1
  54. package/dist/gateway/static/root/assets/{device-pairing-wizard-UdzSpNa5.js → device-pairing-wizard-KxaIL-OX.js} +1 -1
  55. package/dist/gateway/static/root/assets/{directory-picker-path-field-Rkw3f7lG.js → directory-picker-path-field-Drv864uE.js} +1 -1
  56. package/dist/gateway/static/root/assets/{discussion-annotation-sync-Dudoj_Fz.js → discussion-annotation-sync-DfBRkWtw.js} +1 -1
  57. package/dist/gateway/static/root/assets/{extension-debug-page-DxIGAO23.js → extension-debug-page-DAlBIt_R.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-iframe-host-63KpX6IP.js → extension-iframe-host-Bds-5kY_.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-marketplace-api-yXNUkQDA.js → extension-marketplace-api-CZg8nBwW.js} +1 -1
  60. package/dist/gateway/static/root/assets/{extension-page-C811A_Ww.js → extension-page-ZTw-oucT.js} +1 -1
  61. package/dist/gateway/static/root/assets/{extension-provider-C4jLFIgh.js → extension-provider-NKWfjpdP.js} +1 -1
  62. package/dist/gateway/static/root/assets/{extension-settings-page-WJSw5MT0.js → extension-settings-page-CT7PPt_q.js} +1 -1
  63. package/dist/gateway/static/root/assets/{file-preview-surface-zE9AcaHM.js → file-preview-surface-BcLeaSNe.js} +1 -1
  64. package/dist/gateway/static/root/assets/{gateway-config-swr-D6cc6W6E.js → gateway-config-swr-Cq-ByXL4.js} +1 -1
  65. package/dist/gateway/static/root/assets/{gateway-realtime-BSRNLciy.js → gateway-realtime-DwMd2PCt.js} +1 -1
  66. package/dist/gateway/static/root/assets/gateway-realtime-store-CHrf6-nR.js +1 -0
  67. package/dist/gateway/static/root/assets/{gateway-restart-Unun5hRL.js → gateway-restart-DdiVzbkL.js} +1 -1
  68. package/dist/gateway/static/root/assets/{gateway-settings-DP-DV-e5.js → gateway-settings-1QUdNwrZ.js} +1 -1
  69. package/dist/gateway/static/root/assets/{gateway-startup-retry-C8g666Ja.js → gateway-startup-retry-PMJi5mX4.js} +1 -1
  70. package/dist/gateway/static/root/assets/{global-defaults-api-BObi-1ww.js → global-defaults-api-DgzZh3wX.js} +1 -1
  71. package/dist/gateway/static/root/assets/{home-page-CIcs7Mzy.js → home-page-Chn7YTiD.js} +2 -2
  72. package/dist/gateway/static/root/assets/{image-generation-api-C2SqYNyD.js → image-generation-api-CjVpsckq.js} +1 -1
  73. package/dist/gateway/static/root/assets/{imports-page-C8ezUkOJ.js → imports-page-CJCvZFaQ.js} +1 -1
  74. package/dist/gateway/static/root/assets/index-8xLWo0Tt.js +11 -0
  75. package/dist/gateway/static/root/assets/index-iukJWzxG.css +1 -0
  76. package/dist/gateway/static/root/assets/install-connector-dialog-Bo06Ry3H.js +1 -0
  77. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BRaY4-wA.js → keyboard-shortcuts-settings-BylFJeGu.js} +1 -1
  78. package/dist/gateway/static/root/assets/{local-app-workbench-page-BZtVcjF3.js → local-app-workbench-page-B3MSSFsr.js} +1 -1
  79. package/dist/gateway/static/root/assets/{local-apps-page-MqP4EnJm.js → local-apps-page-BeV86rMJ.js} +1 -1
  80. package/dist/gateway/static/root/assets/{local-session-drafts-DTq9776a.js → local-session-drafts-jgw8UGsO.js} +2 -2
  81. package/dist/gateway/static/root/assets/{locale-store-B6OrWgY1.js → locale-store-CAZaC05J.js} +1 -1
  82. package/dist/gateway/static/root/assets/{logs-page-hkHBjblX.js → logs-page-BMmSsUP5.js} +1 -1
  83. package/dist/gateway/static/root/assets/{management-settings-DoX4eTM3.js → management-settings-Bu7T8ewk.js} +1 -1
  84. package/dist/gateway/static/root/assets/{markdown-view-DrhYZSmg.js → markdown-view-BatP4qeK.js} +1 -1
  85. package/dist/gateway/static/root/assets/{mcp-conversation-setup-page-BEp5E6TD.js → mcp-conversation-setup-page-rROtr0UN.js} +1 -1
  86. package/dist/gateway/static/root/assets/{media-plugins-D987i9Gc.js → media-plugins-88OV72YE.js} +1 -1
  87. package/dist/gateway/static/root/assets/messages-C7fckbyG.js +3 -0
  88. package/dist/gateway/static/root/assets/{model-selector-DXm4NS1_.js → model-selector-raBRBkN_.js} +1 -1
  89. package/dist/gateway/static/root/assets/{models-hub-cache-BLcha5rx.js → models-hub-cache-CzC9y3D0.js} +1 -1
  90. package/dist/gateway/static/root/assets/{note-detail-panel-Cl851ivY.js → note-detail-panel-BvA8Vkbm.js} +3 -3
  91. package/dist/gateway/static/root/assets/note-image-lightbox-D6kUDDd5.js +1 -0
  92. package/dist/gateway/static/root/assets/{notes-api-Ddsf7FVg.js → notes-api-zXpV6UXu.js} +1 -1
  93. package/dist/gateway/static/root/assets/{notes-page-DSwA1MU1.js → notes-page-CjYH9Kle.js} +1 -1
  94. package/dist/gateway/static/root/assets/{oauth-api-CMmu4DzH.js → oauth-api-DmxSaxM1.js} +1 -1
  95. package/dist/gateway/static/root/assets/{oauth-provider-connect-BkhnftBq.js → oauth-provider-connect-D4Gfs-Ba.js} +1 -1
  96. package/dist/gateway/static/root/assets/{page-context-capture-button-urhQBRaN.js → page-context-capture-button-Mig3d0UX.js} +1 -1
  97. package/dist/gateway/static/root/assets/{page-context-draft-BuNUerth.js → page-context-draft-C4IIZaKd.js} +1 -1
  98. package/dist/gateway/static/root/assets/page-header-store-D7G5utVi.js +1 -0
  99. package/dist/gateway/static/root/assets/{personal-avatar-B49ueeZO.js → personal-avatar-DLa-CpaK.js} +1 -1
  100. package/dist/gateway/static/root/assets/{personal-page-f05ceuFn.js → personal-page-BhuT79Wd.js} +1 -1
  101. package/dist/gateway/static/root/assets/{personal-settings-panel-DLQxzPYr.js → personal-settings-panel-XSUkgcr2.js} +1 -1
  102. package/dist/gateway/static/root/assets/phone-dependencies-card-DYwnuVh3.js +1 -0
  103. package/dist/gateway/static/root/assets/phone-model-connection-2F32QTHA.js +1 -0
  104. package/dist/gateway/static/root/assets/phone-model-picker-DCVzIr0s.js +1 -0
  105. package/dist/gateway/static/root/assets/phone-settings-page-DJttE4id.js +1 -0
  106. package/dist/gateway/static/root/assets/{phone-workspace-store-DbqktZbO.js → phone-workspace-store-Dxp-KhFP.js} +1 -1
  107. package/dist/gateway/static/root/assets/plugin-details-dialog-tyjAjFjA.js +1 -0
  108. package/dist/gateway/static/root/assets/{preference-select-fields-BZWqG7pu.js → preference-select-fields-BVP3MhGK.js} +1 -1
  109. package/dist/gateway/static/root/assets/{product-automation-feedback-DDQUsag7.js → product-automation-feedback-DbJvv92z.js} +1 -1
  110. package/dist/gateway/static/root/assets/{product-open-page-BkRP_HmA.js → product-open-page-RImqlhCD.js} +1 -1
  111. package/dist/gateway/static/root/assets/{product-preview-content-o2Y3VNE7.js → product-preview-content-DxSqrKsg.js} +1 -1
  112. package/dist/gateway/static/root/assets/{product-preview-modal-7Ohx-7OR.js → product-preview-modal-Cw8Q8Uom.js} +2 -2
  113. package/dist/gateway/static/root/assets/{project-detail-page-B2RsSHya.js → project-detail-page-CuugOYfe.js} +1 -1
  114. package/dist/gateway/static/root/assets/{project-understanding-BIMouiYX.js → project-understanding-BMKcoUW5.js} +1 -1
  115. package/dist/gateway/static/root/assets/{projects-page-C9R5u3tF.js → projects-page-CFsABLvs.js} +1 -1
  116. package/dist/gateway/static/root/assets/{providers-api-BOCkRZ7X.js → providers-api-CAeXbJNF.js} +1 -1
  117. package/dist/gateway/static/root/assets/{recording-upload-C6muEHEO.js → recording-upload-CfpllTe5.js} +1 -1
  118. package/dist/gateway/static/root/assets/{registry-api-Bl2guMRg.js → registry-api-fLOqFyrz.js} +1 -1
  119. package/dist/gateway/static/root/assets/{remote-access-hub-BceSMbCs.js → remote-access-hub-BvKOxy0L.js} +1 -1
  120. package/dist/gateway/static/root/assets/{resource-unavailable-CUNbPkdj.js → resource-unavailable-D15jzjV_.js} +1 -1
  121. package/dist/gateway/static/root/assets/route-preload-BQapekpy.js +2 -0
  122. package/dist/gateway/static/root/assets/{runtime-tools-api-LopLjgvu.js → runtime-tools-api-D0Nrvuqv.js} +1 -1
  123. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-9HIPerDP.js → runtime-tools-settings-panel-CA27XgL2.js} +1 -1
  124. package/dist/gateway/static/root/assets/{service-recommendation-list-CoMI6MB1.js → service-recommendation-list-B0RoYLVT.js} +1 -1
  125. package/dist/gateway/static/root/assets/session-api-CHRP5Lwf.js +1 -0
  126. package/dist/gateway/static/root/assets/session-channel-icon-D1ktvt1P.js +1 -0
  127. package/dist/gateway/static/root/assets/session-identity-label-BP7OIYth.js +1 -0
  128. package/dist/gateway/static/root/assets/session-manager-DRRWwKE4.js +25 -0
  129. package/dist/gateway/static/root/assets/{sessions-page-BT0GdXdS.js → sessions-page-uJHS3-6F.js} +1 -1
  130. package/dist/gateway/static/root/assets/settings-advanced-gate-CZ4J3Kuy.js +1 -0
  131. package/dist/gateway/static/root/assets/{settings-advanced-section-CEorDLUp.js → settings-advanced-section-D-llwfSj.js} +1 -1
  132. package/dist/gateway/static/root/assets/{settings-mode-store-C2LZqBES.js → settings-mode-store-BspMKc9N.js} +1 -1
  133. package/dist/gateway/static/root/assets/{settings-page-C_Np_6qZ.js → settings-page-CedwaHM0.js} +1 -1
  134. package/dist/gateway/static/root/assets/{settings-page-header-BAN34UQi.js → settings-page-header-LuOJvqNa.js} +1 -1
  135. package/dist/gateway/static/root/assets/{settings-page-layout-B5TVFBV2.js → settings-page-layout-CduQ8w4a.js} +1 -1
  136. package/dist/gateway/static/root/assets/{setup-interaction-page-BYvTJW3_.js → setup-interaction-page-ujpPGl84.js} +1 -1
  137. package/dist/gateway/static/root/assets/{setup-status-panel-UY2dH-sK.js → setup-status-panel-BN2aCJUN.js} +1 -1
  138. package/dist/gateway/static/root/assets/{share-link-dialog-BMcXyzr2.js → share-link-dialog-CTATUaa4.js} +1 -1
  139. package/dist/gateway/static/root/assets/{share-preview-page-UQ6eUM2_.js → share-preview-page-Dq0J3VgS.js} +1 -1
  140. package/dist/gateway/static/root/assets/{shares-api-DOeDN6Tm.js → shares-api-zegE8pSE.js} +1 -1
  141. package/dist/gateway/static/root/assets/{shares-settings-W8XhuAoL.js → shares-settings-DXpvsRXq.js} +1 -1
  142. package/dist/gateway/static/root/assets/{skill-api-Do_c0d9n.js → skill-api-DCL1EN7f.js} +1 -1
  143. package/dist/gateway/static/root/assets/{skill-list-api-DpHaXI2l.js → skill-list-api-Bv0mmHbu.js} +1 -1
  144. package/dist/gateway/static/root/assets/{skill-reload-api-DDRd9IJ2.js → skill-reload-api-DPZbadiO.js} +1 -1
  145. package/dist/gateway/static/root/assets/{skills-page-CaeJVKhO.js → skills-page-DMC7Gaku.js} +1 -1
  146. package/dist/gateway/static/root/assets/{system-settings-panel-DYWlWPJL.js → system-settings-panel-BYFUhlqG.js} +1 -1
  147. package/dist/gateway/static/root/assets/{task-detail-page-De0qD7xw.js → task-detail-page-_Og3plZL.js} +3 -3
  148. package/dist/gateway/static/root/assets/{task-result-evidence-CICR5K1t.js → task-result-evidence-Bxm8-H0B.js} +1 -1
  149. package/dist/gateway/static/root/assets/{terminal-panel-store-BbWUcQe7.js → terminal-panel-store-Djf9l2qZ.js} +1 -1
  150. package/dist/gateway/static/root/assets/{theme-store-TkG5mo0p.js → theme-store-8GFVtotZ.js} +1 -1
  151. package/dist/gateway/static/root/assets/{tracing-settings-page-CYXEy4EG.js → tracing-settings-page-oWW3SBZ4.js} +1 -1
  152. package/dist/gateway/static/root/assets/{tunnel-api-DquDm6U2.js → tunnel-api-D-mEsSGF.js} +1 -1
  153. package/dist/gateway/static/root/assets/{understanding-activity-store-Ot3wZ3oQ.js → understanding-activity-store-CvDjsd0I.js} +1 -1
  154. package/dist/gateway/static/root/assets/{understanding-refresh-store-C5KYFMaC.js → understanding-refresh-store-DzOZJm7A.js} +1 -1
  155. package/dist/gateway/static/root/assets/{usage-page-1xFO4smo.js → usage-page-z-o6Uuev.js} +1 -1
  156. package/dist/gateway/static/root/assets/{use-autosave-HL8XRNR8.js → use-autosave-BVYS8UoK.js} +1 -1
  157. package/dist/gateway/static/root/assets/{use-composer-attachments-XRlQBdNF.js → use-composer-attachments-lecOV2q5.js} +1 -1
  158. package/dist/gateway/static/root/assets/{use-file-preview-expanded-CW956CXS.js → use-file-preview-expanded-nd_CuFsd.js} +2 -2
  159. package/dist/gateway/static/root/assets/{use-personal-profile-202s6tJt.js → use-personal-profile-CQi2ZCxV.js} +1 -1
  160. package/dist/gateway/static/root/assets/{use-workspace-tree-CjydkmH1.js → use-workspace-tree-BiaddkzX.js} +1 -1
  161. package/dist/gateway/static/root/assets/{user-model-page-OGPXx3pe.js → user-model-page-Bks1n0Nj.js} +1 -1
  162. package/dist/gateway/static/root/assets/{voice-api-key-field-CxFu4MEA.js → voice-api-key-field-BbW8NFeZ.js} +1 -1
  163. package/dist/gateway/static/root/assets/{voice-config-api-MHe5Pn-A.js → voice-config-api-jSMzZWWy.js} +1 -1
  164. package/dist/gateway/static/root/assets/{voice-input-shortcut-events-B9xc1oK8.js → voice-input-shortcut-events-_SgYmx7X.js} +1 -1
  165. package/dist/gateway/static/root/assets/{voice-transcribe-api-CVEcB6Pe.js → voice-transcribe-api-BJCfiRFU.js} +1 -1
  166. package/dist/gateway/static/root/assets/{work-discovery-overlay-C-JoAg2D.js → work-discovery-overlay-DSTSNyU7.js} +1 -1
  167. package/dist/gateway/static/root/assets/{work-discovery-page-B5Kx29Ru.js → work-discovery-page-Dd_QJJvb.js} +1 -1
  168. package/dist/gateway/static/root/assets/{working-directory-picker-modal-DGp9cNzH.js → working-directory-picker-modal-q39BUcJ6.js} +1 -1
  169. package/dist/gateway/static/root/assets/{workspace-api-HBXn8pL9.js → workspace-api-Di2OmCvz.js} +2 -2
  170. package/dist/gateway/static/root/assets/workspace-editor-agent-store-B2r9wlix.js +1 -0
  171. package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-3cpwSG2w.js → workspace-file-preview-dialog-BUGNT765.js} +1 -1
  172. package/dist/gateway/static/root/assets/{workspace-open-location-menu-D0VOFvuP.js → workspace-open-location-menu-bMSvmQW7.js} +1 -1
  173. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-BkdW2p3v.js → xopc-cloud-account-card-Bbe19Del.js} +1 -1
  174. package/dist/gateway/static/root/index.html +87 -85
  175. package/dist/package.js +1 -1
  176. package/dist/packages/computer-control-contract/src/index.js +33 -3
  177. package/dist/packages/gateway-contract/src/session-identity.js +2 -1
  178. package/dist/packages/gateway-contract/src/session-input-command.js +19 -2
  179. package/dist/packages/gateway-contract/src/specialists.js +1 -0
  180. package/dist/src/agent/embedded/execution-tool-policy.d.ts +1 -1
  181. package/dist/src/agent/embedded/execution-tool-policy.js +2 -2
  182. package/dist/src/agent/embedded/run-for-session.js +23 -8
  183. package/dist/src/agent/embedded/run-turn.js +30 -7
  184. package/dist/src/agent/embedded/runs.d.ts +2 -2
  185. package/dist/src/agent/embedded/runs.js +4 -4
  186. package/dist/src/agent/embedded/session-runner.js +26 -11
  187. package/dist/src/agent/embedded/tool-search-extension.d.ts +8 -2
  188. package/dist/src/agent/embedded/tool-search-extension.js +122 -30
  189. package/dist/src/agent/external-tools/cliProvider.d.ts +10 -9
  190. package/dist/src/agent/external-tools/cliProvider.js +24 -4
  191. package/dist/src/agent/external-tools/composio-provider.d.ts +3 -3
  192. package/dist/src/agent/external-tools/composio-provider.js +6 -3
  193. package/dist/src/agent/external-tools/discovery.d.ts +47 -0
  194. package/dist/src/agent/external-tools/discovery.js +56 -0
  195. package/dist/src/agent/external-tools/gateway-tools.js +26 -46
  196. package/dist/src/agent/external-tools/index.d.ts +1 -0
  197. package/dist/src/agent/external-tools/index.js +7 -0
  198. package/dist/src/agent/external-tools/personal-request-scope.d.ts +7 -0
  199. package/dist/src/agent/external-tools/personal-request-scope.js +83 -0
  200. package/dist/src/agent/external-tools/read-policy.js +5 -4
  201. package/dist/src/agent/external-tools/service.d.ts +2 -0
  202. package/dist/src/agent/external-tools/service.js +22 -3
  203. package/dist/src/agent/external-tools/tool-registry.d.ts +6 -0
  204. package/dist/src/agent/external-tools/types.d.ts +7 -2
  205. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -1
  206. package/dist/src/agent/inbound/turn-dispatcher.js +3 -2
  207. package/dist/src/agent/orchestration/llm-turn-retry.d.ts +1 -1
  208. package/dist/src/agent/orchestration/llm-turn-retry.js +13 -8
  209. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +1 -0
  210. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +3 -1
  211. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  212. package/dist/src/agent/tool-manuals/computer.d.ts +1 -1
  213. package/dist/src/agent/tool-manuals/computer.js +6 -4
  214. package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
  215. package/dist/src/agent/tool-manuals/phone.js +4 -4
  216. package/dist/src/agent/tool-manuals/xopc-configuration.d.ts +1 -1
  217. package/dist/src/agent/tool-manuals/xopc-configuration.js +4 -2
  218. package/dist/src/agent/tools/computer-use-tool.js +7 -6
  219. package/dist/src/agent/tools/delegation-policy.js +1 -0
  220. package/dist/src/agent/tools/factory.js +4 -2
  221. package/dist/src/agent/tools/phone-use-tool.js +2 -2
  222. package/dist/src/agent/tools/web.js +22 -3
  223. package/dist/src/agent-matching/service.js +2 -2
  224. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  225. package/dist/src/computer/batch.d.ts +108 -0
  226. package/dist/src/computer/batch.js +125 -0
  227. package/dist/src/computer/broker.d.ts +30 -2
  228. package/dist/src/computer/broker.js +109 -17
  229. package/dist/src/computer/diagnostics.d.ts +5 -1
  230. package/dist/src/computer/diagnostics.js +22 -3
  231. package/dist/src/computer/errors.d.ts +15 -0
  232. package/dist/src/computer/errors.js +59 -3
  233. package/dist/src/computer/model-adapter.d.ts +58 -0
  234. package/dist/src/computer/model-adapter.js +112 -66
  235. package/dist/src/computer/native-errors.d.ts +2 -0
  236. package/dist/src/computer/native-errors.js +13 -0
  237. package/dist/src/computer/program-runtime.d.ts +1 -1
  238. package/dist/src/computer/program-runtime.js +1 -0
  239. package/dist/src/computer/runtime.d.ts +11 -0
  240. package/dist/src/computer/runtime.js +102 -34
  241. package/dist/src/computer/semantic-actions.js +4 -0
  242. package/dist/src/config/schema.d.ts +6 -0
  243. package/dist/src/extensions/agent-plugins/formats.js +2 -1
  244. package/dist/src/extensions/agent-plugins/inventory.d.ts +2 -0
  245. package/dist/src/extensions/agent-plugins/inventory.js +4 -1
  246. package/dist/src/extensions/agent-plugins/validation.d.ts +1 -0
  247. package/dist/src/extensions/agent-plugins/validation.js +2 -1
  248. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  249. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  250. package/dist/src/gateway/hono/routes/phone-dependencies.js +26 -5
  251. package/dist/src/gateway/hono/routes/phone-setup.js +42 -16
  252. package/dist/src/gateway/hono/routes/phone.js +22 -7
  253. package/dist/src/gateway/hono/routes/session-command-handler.js +9 -0
  254. package/dist/src/gateway/hono/routes/session-input-control.d.ts +3 -0
  255. package/dist/src/gateway/hono/routes/session-input-control.js +37 -0
  256. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +12 -0
  257. package/dist/src/gateway/hono/routes/session-input-handler.js +22 -0
  258. package/dist/src/gateway/hono/routes/sessions.js +4 -0
  259. package/dist/src/gateway/service/agent-runner.js +5 -4
  260. package/dist/src/gateway/service/config-coordinator.d.ts +6 -0
  261. package/dist/src/gateway/service/session-input-coordinator.d.ts +6 -3
  262. package/dist/src/gateway/service/session-input-coordinator.js +47 -6
  263. package/dist/src/gateway/service.d.ts +1 -0
  264. package/dist/src/gateway/service.js +8 -5
  265. package/dist/src/home-intelligence/host.js +2 -2
  266. package/dist/src/personal-agent/capability-service.js +1 -1
  267. package/dist/src/personal-agent/request-access.d.ts +2 -0
  268. package/dist/src/personal-agent/request-access.js +22 -2
  269. package/dist/src/personal-agent/request-service.js +2 -2
  270. package/dist/src/personal-agent/specialist-capabilities.d.ts +2 -0
  271. package/dist/src/personal-agent/specialist-capabilities.js +9 -3
  272. package/dist/src/phone/adb-driver.d.ts +3 -0
  273. package/dist/src/phone/adb-driver.js +29 -0
  274. package/dist/src/phone/contracts.d.ts +14 -2
  275. package/dist/src/phone/contracts.js +8 -1
  276. package/dist/src/phone/gui-protocol.js +1 -1
  277. package/dist/src/phone/hdc-driver.d.ts +30 -0
  278. package/dist/src/phone/hdc-driver.js +331 -0
  279. package/dist/src/phone/hdc-video-bridge.d.ts +2 -0
  280. package/dist/src/phone/hdc-video-bridge.js +91 -0
  281. package/dist/src/phone/hdc-video-tools.d.ts +15 -0
  282. package/dist/src/phone/hdc-video-tools.js +123 -0
  283. package/dist/src/phone/hdc-video.d.ts +69 -0
  284. package/dist/src/phone/hdc-video.js +350 -0
  285. package/dist/src/phone/interactive-session.js +1 -1
  286. package/dist/src/phone/live-provider.d.ts +6 -0
  287. package/dist/src/phone/live-provider.js +1 -0
  288. package/dist/src/phone/model-adapter.d.ts +3 -0
  289. package/dist/src/phone/model-adapter.js +5 -3
  290. package/dist/src/phone/repository.js +2 -1
  291. package/dist/src/phone/runtime.d.ts +10 -4
  292. package/dist/src/phone/runtime.js +151 -85
  293. package/dist/src/phone/setup/service.d.ts +8 -6
  294. package/dist/src/phone/setup/service.js +33 -16
  295. package/dist/src/platform/client.d.ts +1 -1
  296. package/dist/src/platform/contracts.d.ts +1 -1
  297. package/dist/src/process/phone-process.d.ts +1 -1
  298. package/dist/src/process/phone-process.js +2 -2
  299. package/dist/src/runtime-tools/downloader.d.ts +1 -0
  300. package/dist/src/runtime-tools/downloader.js +8 -4
  301. package/dist/src/runtime-tools/harmony-dependencies.d.ts +24 -0
  302. package/dist/src/runtime-tools/harmony-dependencies.js +272 -0
  303. package/dist/src/runtime-tools/harmony-dependency-catalog.d.ts +4 -0
  304. package/dist/src/runtime-tools/harmony-dependency-catalog.js +54 -0
  305. package/dist/src/runtime-tools/harmony-paths.d.ts +9 -0
  306. package/dist/src/runtime-tools/harmony-paths.js +15 -0
  307. package/dist/src/runtime-tools/hdc-dependency-catalog.d.ts +8 -0
  308. package/dist/src/runtime-tools/hdc-dependency-catalog.js +83 -0
  309. package/dist/src/runtime-tools/hdc-files.d.ts +14 -0
  310. package/dist/src/runtime-tools/hdc-files.js +87 -0
  311. package/dist/src/runtime-tools/phone-dependencies.d.ts +6 -1
  312. package/dist/src/runtime-tools/phone-dependencies.js +20 -2
  313. package/dist/src/runtime-tools/phone-dependency-catalog.d.ts +10 -1
  314. package/dist/src/runtime-tools/phone-dependency-catalog.js +2 -0
  315. package/dist/src/runtime-tools/types.d.ts +1 -1
  316. package/dist/src/storage/sqlite/schema.d.ts +2 -2
  317. package/dist/src/storage/sqlite/schema.js +7 -7
  318. package/dist/src/storage/sqlite/schema.sql +16 -0
  319. package/dist/src/storage/sqlite/session-creation-repository.js +3 -0
  320. package/dist/src/storage/sqlite/session-input-control-repository.d.ts +12 -0
  321. package/dist/src/storage/sqlite/session-input-control-repository.js +83 -0
  322. package/dist/src/storage/sqlite/session-input-repository.d.ts +2 -0
  323. package/dist/src/storage/sqlite/session-input-repository.js +17 -5
  324. package/dist/src/storage/sqlite/session-repository.js +1 -0
  325. package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +2 -0
  326. package/dist/src/storage/sqlite/session-turn-replace-repository.js +14 -2
  327. package/dist/src/storage/sqlite/upgrades/262_session_input_control.sql +15 -0
  328. package/package.json +2 -2
  329. package/skills/tools/configure-xopc/SKILL.md +2 -2
  330. package/skills/tools/configure-xopc/references/phone/acceptance.md +3 -2
  331. package/skills/tools/configure-xopc/references/phone/dependencies.md +18 -2
  332. package/skills/tools/configure-xopc/references/phone/harmonyos.md +16 -0
  333. package/skills/tools/configure-xopc/references/phone/overview.md +2 -2
  334. package/skills/tools/configure-xopc/references/scene-index.md +2 -2
  335. package/dist/gateway/static/root/assets/apps-page-D-n71lO1.js +0 -1
  336. package/dist/gateway/static/root/assets/automations-workspace-DWDWy-SG.js +0 -9
  337. package/dist/gateway/static/root/assets/capabilities-page-IcwojmJK.js +0 -2
  338. package/dist/gateway/static/root/assets/capability-links-DzQWK1Fh.js +0 -1
  339. package/dist/gateway/static/root/assets/chat-page-CwP4OMdW.js +0 -72
  340. package/dist/gateway/static/root/assets/computer-settings-page-DyAlOzqY.js +0 -1
  341. package/dist/gateway/static/root/assets/connected-providers-grid-D0lXg22c.js +0 -1
  342. package/dist/gateway/static/root/assets/connectors-page-DI_Q0CKz.js +0 -1
  343. package/dist/gateway/static/root/assets/gateway-realtime-store-BFeFfApQ.js +0 -1
  344. package/dist/gateway/static/root/assets/index-Cz-VjTNd.css +0 -1
  345. package/dist/gateway/static/root/assets/index-D1_PUrJf.js +0 -11
  346. package/dist/gateway/static/root/assets/install-connector-dialog-Cn4nRSyt.js +0 -1
  347. package/dist/gateway/static/root/assets/list-tree-B0OMswgM.js +0 -1
  348. package/dist/gateway/static/root/assets/messages-jwdBhfL9.js +0 -3
  349. package/dist/gateway/static/root/assets/note-image-lightbox-DGYRJS03.js +0 -1
  350. package/dist/gateway/static/root/assets/page-header-store-CEn_kPsn.js +0 -1
  351. package/dist/gateway/static/root/assets/phone-dependencies-card-DjmC1Z5j.js +0 -1
  352. package/dist/gateway/static/root/assets/phone-model-connection-BRjHSgYn.js +0 -1
  353. package/dist/gateway/static/root/assets/phone-model-picker-DgIiWLhR.js +0 -1
  354. package/dist/gateway/static/root/assets/phone-settings-page-DCZGCL_z.js +0 -1
  355. package/dist/gateway/static/root/assets/plugin-details-dialog-D4tGKip4.js +0 -1
  356. package/dist/gateway/static/root/assets/route-preload-C1BKDjnu.js +0 -2
  357. package/dist/gateway/static/root/assets/session-api-Bfmlmn9F.js +0 -1
  358. package/dist/gateway/static/root/assets/session-channel-icon-SsY70Z6t.js +0 -1
  359. package/dist/gateway/static/root/assets/session-identity-label-B7sgG1PE.js +0 -1
  360. package/dist/gateway/static/root/assets/session-manager-X4UHOjjO.js +0 -25
  361. package/dist/gateway/static/root/assets/settings-advanced-gate-Dk9c-Z5e.js +0 -1
  362. 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: number;
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 = await driver.discover(signal);
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 ADB");
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 = (async () => {
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 this.publish(session);
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 this.publish(session);
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 this.publish(session);
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 this.publish(session);
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 this.publish(session);
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 this.publish(session);
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 (!context.config.phone.batchReadings || !session.adapter.readFields || !session.report.task?.requestedOutputs.some((request) => !request.selector)) await this.readScreen(session, observation, input.goal, context, signal);
1260
- if (epoch !== session.report.controlEpoch || session.report.controlOwner !== "agent") return this.publish(session);
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 this.publish(session);
1264
+ return await finish();
1271
1265
  }
1272
- return this.publish(session);
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 this.publish(session);
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 this.publish(session);
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 this.publish(session);
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 this.publish(session);
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.connection ? await this.cloud.interactive(session.device, failed) : this.interactiveFactory(session.adbPath, session.device.serial, failed);
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.stream = void 0;
1915
- await stream.close();
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;