@xopcai/xopc 0.0.433 → 0.0.434

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 (403) 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-CmxICTM4.js} +1 -1
  24. package/dist/gateway/static/root/assets/automations-workspace-R6YNDdAO.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-BJ8PlDjZ.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-DWQ4LbBn.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-l9_vYfdJ.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-BbyV8EiG.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-BWpw9qxc.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-XJXcnE1_.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-DvX9JoEd.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/agent-manager.js +1 -1
  181. package/dist/src/agent/background-review/run-background-review.js +1 -1
  182. package/dist/src/agent/embedded/execution-tool-policy.d.ts +1 -1
  183. package/dist/src/agent/embedded/execution-tool-policy.js +2 -2
  184. package/dist/src/agent/embedded/run-for-session.js +23 -8
  185. package/dist/src/agent/embedded/run-turn.js +30 -7
  186. package/dist/src/agent/embedded/runs.d.ts +2 -2
  187. package/dist/src/agent/embedded/runs.js +4 -4
  188. package/dist/src/agent/embedded/session-runner.js +26 -11
  189. package/dist/src/agent/embedded/tool-search-extension.d.ts +8 -2
  190. package/dist/src/agent/embedded/tool-search-extension.js +122 -30
  191. package/dist/src/agent/external-tools/cliProvider.d.ts +10 -9
  192. package/dist/src/agent/external-tools/cliProvider.js +26 -6
  193. package/dist/src/agent/external-tools/composio-provider.d.ts +3 -3
  194. package/dist/src/agent/external-tools/composio-provider.js +8 -5
  195. package/dist/src/agent/external-tools/discovery.d.ts +47 -0
  196. package/dist/src/agent/external-tools/discovery.js +56 -0
  197. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  198. package/dist/src/agent/external-tools/gateway-tools.js +26 -46
  199. package/dist/src/agent/external-tools/index.d.ts +1 -0
  200. package/dist/src/agent/external-tools/index.js +7 -0
  201. package/dist/src/agent/external-tools/personal-request-scope.d.ts +7 -0
  202. package/dist/src/agent/external-tools/personal-request-scope.js +83 -0
  203. package/dist/src/agent/external-tools/read-policy.js +5 -4
  204. package/dist/src/agent/external-tools/service.d.ts +2 -0
  205. package/dist/src/agent/external-tools/service.js +22 -3
  206. package/dist/src/agent/external-tools/tool-registry.d.ts +6 -0
  207. package/dist/src/agent/external-tools/types.d.ts +7 -2
  208. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -1
  209. package/dist/src/agent/inbound/turn-dispatcher.js +3 -2
  210. package/dist/src/agent/orchestration/llm-turn-retry.d.ts +1 -1
  211. package/dist/src/agent/orchestration/llm-turn-retry.js +13 -8
  212. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +1 -0
  213. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +3 -1
  214. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  215. package/dist/src/agent/service.js +1 -1
  216. package/dist/src/agent/skills/index.js +1 -1
  217. package/dist/src/agent/skills/managed-store.js +1 -1
  218. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  219. package/dist/src/agent/tool-manuals/computer.d.ts +1 -1
  220. package/dist/src/agent/tool-manuals/computer.js +6 -4
  221. package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
  222. package/dist/src/agent/tool-manuals/phone.js +4 -4
  223. package/dist/src/agent/tool-manuals/xopc-configuration.d.ts +1 -1
  224. package/dist/src/agent/tool-manuals/xopc-configuration.js +4 -2
  225. package/dist/src/agent/tools/computer-use-tool.js +7 -6
  226. package/dist/src/agent/tools/delegation-policy.js +1 -0
  227. package/dist/src/agent/tools/factory.js +4 -2
  228. package/dist/src/agent/tools/personal-read-tool.js +1 -1
  229. package/dist/src/agent/tools/phone-use-tool.js +2 -2
  230. package/dist/src/agent/tools/web.js +22 -3
  231. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  232. package/dist/src/agent-catalog/capabilities.js +2 -2
  233. package/dist/src/agent-catalog/repository.js +1 -1
  234. package/dist/src/agent-matching/service.js +2 -2
  235. package/dist/src/automations/api/routes.js +2 -2
  236. package/dist/src/automations/capabilities/drafts.js +1 -1
  237. package/dist/src/automations/capabilities/write.js +1 -1
  238. package/dist/src/automations/configuration-conversation.js +1 -1
  239. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  240. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  241. package/dist/src/capabilities/runtime/product.js +1 -1
  242. package/dist/src/cli/commands/agents.js +1 -1
  243. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  244. package/dist/src/cli/commands/models.js +1 -1
  245. package/dist/src/cli/commands/onboard/model.js +1 -1
  246. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  247. package/dist/src/computer/batch.d.ts +108 -0
  248. package/dist/src/computer/batch.js +125 -0
  249. package/dist/src/computer/broker.d.ts +28 -2
  250. package/dist/src/computer/broker.js +95 -17
  251. package/dist/src/computer/diagnostics.d.ts +5 -1
  252. package/dist/src/computer/diagnostics.js +22 -3
  253. package/dist/src/computer/errors.d.ts +15 -0
  254. package/dist/src/computer/errors.js +59 -3
  255. package/dist/src/computer/model-adapter.d.ts +58 -0
  256. package/dist/src/computer/model-adapter.js +112 -66
  257. package/dist/src/computer/native-errors.d.ts +2 -0
  258. package/dist/src/computer/native-errors.js +13 -0
  259. package/dist/src/computer/program-runtime.d.ts +1 -1
  260. package/dist/src/computer/program-runtime.js +1 -0
  261. package/dist/src/computer/runtime.d.ts +11 -0
  262. package/dist/src/computer/runtime.js +102 -34
  263. package/dist/src/computer/semantic-actions.js +4 -0
  264. package/dist/src/config/agent-profile.js +1 -1
  265. package/dist/src/config/schema.d.ts +6 -0
  266. package/dist/src/execution-environments/local-worktree-manager.js +1 -1
  267. package/dist/src/extensions/agent-plugins/formats.js +2 -1
  268. package/dist/src/extensions/agent-plugins/inventory.d.ts +2 -0
  269. package/dist/src/extensions/agent-plugins/inventory.js +4 -1
  270. package/dist/src/extensions/agent-plugins/skill-catalog.js +1 -1
  271. package/dist/src/extensions/agent-plugins/validation.d.ts +1 -0
  272. package/dist/src/extensions/agent-plugins/validation.js +3 -2
  273. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  274. package/dist/src/gateway/agents-admin.js +1 -1
  275. package/dist/src/gateway/global-defaults-admin.js +1 -1
  276. package/dist/src/gateway/hono/routes/agents.js +1 -1
  277. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  278. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  279. package/dist/src/gateway/hono/routes/notes.js +2 -2
  280. package/dist/src/gateway/hono/routes/phone-dependencies.js +26 -5
  281. package/dist/src/gateway/hono/routes/phone-setup.js +43 -17
  282. package/dist/src/gateway/hono/routes/phone.js +22 -7
  283. package/dist/src/gateway/hono/routes/projects.js +2 -2
  284. package/dist/src/gateway/hono/routes/session-command-handler.js +9 -0
  285. package/dist/src/gateway/hono/routes/session-input-control.d.ts +3 -0
  286. package/dist/src/gateway/hono/routes/session-input-control.js +37 -0
  287. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +12 -0
  288. package/dist/src/gateway/hono/routes/session-input-handler.js +23 -1
  289. package/dist/src/gateway/hono/routes/sessions.js +4 -0
  290. package/dist/src/gateway/hono/routes/tasks.js +1 -1
  291. package/dist/src/gateway/image-generation-setup.js +1 -1
  292. package/dist/src/gateway/service/agent-runner.js +5 -4
  293. package/dist/src/gateway/service/config-coordinator.d.ts +6 -0
  294. package/dist/src/gateway/service/session-input-coordinator.d.ts +6 -3
  295. package/dist/src/gateway/service/session-input-coordinator.js +47 -6
  296. package/dist/src/gateway/service.d.ts +1 -0
  297. package/dist/src/gateway/service.js +4 -1
  298. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  299. package/dist/src/imports/importService.js +1 -1
  300. package/dist/src/local-apps/service.js +1 -1
  301. package/dist/src/personal-agent/capability-service.js +1 -1
  302. package/dist/src/personal-agent/request-access.d.ts +2 -0
  303. package/dist/src/personal-agent/request-access.js +22 -2
  304. package/dist/src/personal-agent/request-service.js +2 -2
  305. package/dist/src/personal-agent/service.js +1 -1
  306. package/dist/src/personal-agent/specialist-capabilities.d.ts +2 -0
  307. package/dist/src/personal-agent/specialist-capabilities.js +9 -3
  308. package/dist/src/phone/adb-driver.d.ts +3 -0
  309. package/dist/src/phone/adb-driver.js +29 -0
  310. package/dist/src/phone/contracts.d.ts +14 -2
  311. package/dist/src/phone/contracts.js +8 -1
  312. package/dist/src/phone/gui-protocol.js +1 -1
  313. package/dist/src/phone/hdc-driver.d.ts +30 -0
  314. package/dist/src/phone/hdc-driver.js +331 -0
  315. package/dist/src/phone/hdc-video-bridge.d.ts +2 -0
  316. package/dist/src/phone/hdc-video-bridge.js +91 -0
  317. package/dist/src/phone/hdc-video-tools.d.ts +15 -0
  318. package/dist/src/phone/hdc-video-tools.js +123 -0
  319. package/dist/src/phone/hdc-video.d.ts +69 -0
  320. package/dist/src/phone/hdc-video.js +350 -0
  321. package/dist/src/phone/interactive-session.js +1 -1
  322. package/dist/src/phone/live-provider.d.ts +6 -0
  323. package/dist/src/phone/live-provider.js +1 -0
  324. package/dist/src/phone/model-adapter.d.ts +3 -0
  325. package/dist/src/phone/model-adapter.js +5 -3
  326. package/dist/src/phone/repository.js +2 -1
  327. package/dist/src/phone/runtime.d.ts +10 -4
  328. package/dist/src/phone/runtime.js +151 -85
  329. package/dist/src/phone/setup/service.d.ts +8 -6
  330. package/dist/src/phone/setup/service.js +33 -16
  331. package/dist/src/platform/client.d.ts +1 -1
  332. package/dist/src/platform/contracts.d.ts +1 -1
  333. package/dist/src/process/phone-process.d.ts +1 -1
  334. package/dist/src/process/phone-process.js +2 -2
  335. package/dist/src/runtime-tools/archive.js +1 -1
  336. package/dist/src/runtime-tools/downloader.d.ts +1 -0
  337. package/dist/src/runtime-tools/downloader.js +8 -4
  338. package/dist/src/runtime-tools/harmony-dependencies.d.ts +24 -0
  339. package/dist/src/runtime-tools/harmony-dependencies.js +272 -0
  340. package/dist/src/runtime-tools/harmony-dependency-catalog.d.ts +4 -0
  341. package/dist/src/runtime-tools/harmony-dependency-catalog.js +54 -0
  342. package/dist/src/runtime-tools/harmony-paths.d.ts +9 -0
  343. package/dist/src/runtime-tools/harmony-paths.js +15 -0
  344. package/dist/src/runtime-tools/hdc-dependency-catalog.d.ts +8 -0
  345. package/dist/src/runtime-tools/hdc-dependency-catalog.js +83 -0
  346. package/dist/src/runtime-tools/hdc-files.d.ts +14 -0
  347. package/dist/src/runtime-tools/hdc-files.js +87 -0
  348. package/dist/src/runtime-tools/phone-dependencies.d.ts +6 -1
  349. package/dist/src/runtime-tools/phone-dependencies.js +20 -2
  350. package/dist/src/runtime-tools/phone-dependency-catalog.d.ts +10 -1
  351. package/dist/src/runtime-tools/phone-dependency-catalog.js +2 -0
  352. package/dist/src/runtime-tools/types.d.ts +1 -1
  353. package/dist/src/storage/sqlite/schema.d.ts +2 -2
  354. package/dist/src/storage/sqlite/schema.js +7 -7
  355. package/dist/src/storage/sqlite/schema.sql +16 -0
  356. package/dist/src/storage/sqlite/session-creation-repository.js +3 -0
  357. package/dist/src/storage/sqlite/session-input-control-repository.d.ts +12 -0
  358. package/dist/src/storage/sqlite/session-input-control-repository.js +83 -0
  359. package/dist/src/storage/sqlite/session-input-repository.d.ts +2 -0
  360. package/dist/src/storage/sqlite/session-input-repository.js +17 -5
  361. package/dist/src/storage/sqlite/session-repository.js +1 -0
  362. package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +2 -0
  363. package/dist/src/storage/sqlite/session-turn-replace-repository.js +14 -2
  364. package/dist/src/storage/sqlite/upgrades/262_session_input_control.sql +15 -0
  365. package/dist/src/tasks/capabilities/read.js +2 -2
  366. package/dist/src/tasks/capabilities/write.js +1 -1
  367. package/dist/src/tui/backends/embedded-backend.js +1 -1
  368. package/dist/src/voice/realtime/persona-context.js +1 -1
  369. package/package.json +2 -2
  370. package/skills/tools/configure-xopc/SKILL.md +2 -2
  371. package/skills/tools/configure-xopc/references/phone/acceptance.md +3 -2
  372. package/skills/tools/configure-xopc/references/phone/dependencies.md +18 -2
  373. package/skills/tools/configure-xopc/references/phone/harmonyos.md +16 -0
  374. package/skills/tools/configure-xopc/references/phone/overview.md +2 -2
  375. package/skills/tools/configure-xopc/references/scene-index.md +2 -2
  376. package/dist/gateway/static/root/assets/apps-page-D-n71lO1.js +0 -1
  377. package/dist/gateway/static/root/assets/automations-workspace-DWDWy-SG.js +0 -9
  378. package/dist/gateway/static/root/assets/capabilities-page-IcwojmJK.js +0 -2
  379. package/dist/gateway/static/root/assets/capability-links-DzQWK1Fh.js +0 -1
  380. package/dist/gateway/static/root/assets/chat-page-CwP4OMdW.js +0 -72
  381. package/dist/gateway/static/root/assets/computer-settings-page-DyAlOzqY.js +0 -1
  382. package/dist/gateway/static/root/assets/connected-providers-grid-D0lXg22c.js +0 -1
  383. package/dist/gateway/static/root/assets/connectors-page-DI_Q0CKz.js +0 -1
  384. package/dist/gateway/static/root/assets/gateway-realtime-store-BFeFfApQ.js +0 -1
  385. package/dist/gateway/static/root/assets/index-Cz-VjTNd.css +0 -1
  386. package/dist/gateway/static/root/assets/index-D1_PUrJf.js +0 -11
  387. package/dist/gateway/static/root/assets/install-connector-dialog-Cn4nRSyt.js +0 -1
  388. package/dist/gateway/static/root/assets/list-tree-B0OMswgM.js +0 -1
  389. package/dist/gateway/static/root/assets/messages-jwdBhfL9.js +0 -3
  390. package/dist/gateway/static/root/assets/note-image-lightbox-DGYRJS03.js +0 -1
  391. package/dist/gateway/static/root/assets/page-header-store-CEn_kPsn.js +0 -1
  392. package/dist/gateway/static/root/assets/phone-dependencies-card-DjmC1Z5j.js +0 -1
  393. package/dist/gateway/static/root/assets/phone-model-connection-BRjHSgYn.js +0 -1
  394. package/dist/gateway/static/root/assets/phone-model-picker-DgIiWLhR.js +0 -1
  395. package/dist/gateway/static/root/assets/phone-settings-page-DCZGCL_z.js +0 -1
  396. package/dist/gateway/static/root/assets/plugin-details-dialog-D4tGKip4.js +0 -1
  397. package/dist/gateway/static/root/assets/route-preload-C1BKDjnu.js +0 -2
  398. package/dist/gateway/static/root/assets/session-api-Bfmlmn9F.js +0 -1
  399. package/dist/gateway/static/root/assets/session-channel-icon-SsY70Z6t.js +0 -1
  400. package/dist/gateway/static/root/assets/session-identity-label-B7sgG1PE.js +0 -1
  401. package/dist/gateway/static/root/assets/session-manager-X4UHOjjO.js +0 -25
  402. package/dist/gateway/static/root/assets/settings-advanced-gate-Dk9c-Z5e.js +0 -1
  403. package/dist/gateway/static/root/assets/workspace-editor-agent-store-msZa42fU.js +0 -1
@@ -0,0 +1,331 @@
1
+ import { PhoneError, init_contracts } from "./contracts.js";
2
+ import { runPhoneCommandBuffer } from "../process/phone-process.js";
3
+ import { managedHdcPath } from "../runtime-tools/harmony-paths.js";
4
+ import { homedir, tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { existsSync } from "node:fs";
7
+ import { randomUUID } from "node:crypto";
8
+ import { mkdtemp, readFile, rm } from "node:fs/promises";
9
+ import { setTimeout } from "node:timers/promises";
10
+ import sharp from "sharp";
11
+ //#region src/phone/hdc-driver.ts
12
+ init_contracts();
13
+ function resolveHdcPath(configured, stateDir) {
14
+ if (configured) return configured;
15
+ const roots = [
16
+ process.env.HARMONYOS_SDK_HOME,
17
+ process.env.DEVECO_SDK_HOME,
18
+ "/Applications/DevEco-Studio.app/Contents/sdk/default",
19
+ join(homedir(), "Library/Huawei/Sdk")
20
+ ];
21
+ for (const root of roots) if (root) for (const suffix of ["openharmony/toolchains", "toolchains"]) {
22
+ const candidate = join(root, suffix, process.platform === "win32" ? "hdc.exe" : "hdc");
23
+ if (existsSync(candidate)) return candidate;
24
+ }
25
+ const managed = managedHdcPath(stateDir);
26
+ return existsSync(managed) ? managed : "hdc";
27
+ }
28
+ function parseHdcDevices(raw) {
29
+ return raw.split(/\r?\n/).flatMap((line) => {
30
+ const fields = line.trim().split(/\s+/);
31
+ if (fields.length < 3 || fields[1] !== "USB") return [];
32
+ const state = fields[2] === "Connected" ? "device" : /unauth/i.test(fields[2]) ? "unauthorized" : "offline";
33
+ return [{
34
+ serial: fields[0],
35
+ name: `HarmonyOS ${fields[0]}`,
36
+ state,
37
+ emulator: false,
38
+ platform: "harmonyos"
39
+ }];
40
+ });
41
+ }
42
+ const bundlePattern = /^[a-zA-Z]\w*(?:\.\w+)+$/;
43
+ const flag = (value) => value === true || value === "true";
44
+ function parseHarmonyLayout(raw, windowId) {
45
+ const active = (JSON.parse(raw).children ?? []).filter((node) => String(node.attributes?.hostWindowId) === windowId && bundlePattern.test(String(node.attributes?.bundleName)));
46
+ if (active.length !== 1) throw new PhoneError("PHONE_APP_UNKNOWN", "Unable to identify the focused HarmonyOS window", 409);
47
+ const displayId = active[0].attributes?.displayId;
48
+ if (displayId !== void 0 && displayId !== "" && String(displayId) !== "0") throw new PhoneError("PHONE_UI_UNAVAILABLE", "HarmonyOS USB observation supports the primary display only", 409);
49
+ const elements = [];
50
+ let visited = 0;
51
+ const visit = (node, depth, sensitive = false) => {
52
+ if (++visited > 1e4 || depth > 100) throw new PhoneError("PHONE_UI_UNAVAILABLE", "HarmonyOS UI tree exceeds observation limits", 502);
53
+ const a = node.attributes ?? {};
54
+ if (a.visible === false || a.visible === "false") return;
55
+ const bounds = /^\[(-?\d+),(-?\d+)\]\[(-?\d+),(-?\d+)\]$/.exec(String(a.bounds ?? ""));
56
+ const editable = /^(TextInput|TextArea|Search)$/.test(String(a.type));
57
+ const password = sensitive || flag(a.password) || flag(a.isPassword) || editable && a.password !== false && a.password !== "false";
58
+ if (bounds && elements.length < 500) elements.push({
59
+ text: password ? "" : String(a.text ?? "").slice(0, 500),
60
+ description: password ? "" : String(a.description ?? "").slice(0, 300),
61
+ resourceId: String(a.id || a.key || ""),
62
+ clickable: flag(a.clickable),
63
+ focused: flag(a.focused),
64
+ editable,
65
+ password,
66
+ bounds: bounds.slice(1).map(Number)
67
+ });
68
+ if (Array.isArray(node.children)) for (const child of node.children) visit(child, depth + 1, password);
69
+ };
70
+ visit(active[0], 0);
71
+ return {
72
+ package: String(active[0].attributes.bundleName),
73
+ elements
74
+ };
75
+ }
76
+ function parseHarmonyLaunch(raw) {
77
+ const start = raw.indexOf("{");
78
+ if (start < 0) throw new PhoneError("PHONE_APP_UNAVAILABLE", "Unable to read HarmonyOS bundle information");
79
+ const entries = (JSON.parse(raw.slice(start)).hapModuleInfos ?? []).flatMap((module) => (module.abilityInfos ?? []).flatMap((ability) => ability.skills?.some((skill) => skill.entities?.includes("entity.system.home")) && /^[\w.$]+$/.test(ability.name ?? "") && /^[\w.]+$/.test(module.moduleName ?? "") ? [{
80
+ ability: ability.name,
81
+ module: module.moduleName
82
+ }] : []));
83
+ if (entries.length !== 1) throw new PhoneError("PHONE_APP_UNAVAILABLE", "The HarmonyOS app has no unique launcher ability");
84
+ return entries[0];
85
+ }
86
+ var HdcPhoneDriver = class {
87
+ constructor(path = resolveHdcPath(), command = runPhoneCommandBuffer) {
88
+ this.path = path;
89
+ this.command = command;
90
+ }
91
+ async run(args, signal) {
92
+ signal?.throwIfAborted();
93
+ try {
94
+ const output = await this.command(this.path, args, signal);
95
+ if (/^(?:\[Fail\]|error:|Error:|ErrorCode:|Failed to|Missing parameter|usage:|Permission denied|.*: not found|Unknown command)/im.test(output.toString())) throw new Error("HDC rejected command");
96
+ return output;
97
+ } catch (error) {
98
+ signal?.throwIfAborted();
99
+ if (error instanceof PhoneError) throw error;
100
+ throw new PhoneError("PHONE_HDC_FAILED", "HDC operation failed. Check the SDK path, USB authorization and UiTest availability.", 502);
101
+ }
102
+ }
103
+ async shell(serial, args, signal) {
104
+ return (await this.run([
105
+ "-t",
106
+ serial,
107
+ "shell",
108
+ ...args
109
+ ], signal)).toString();
110
+ }
111
+ async discover(signal) {
112
+ return parseHdcDevices((await this.run([
113
+ "list",
114
+ "targets",
115
+ "-v"
116
+ ], signal)).toString());
117
+ }
118
+ async applications(serial, signal) {
119
+ const raw = await this.shell(serial, [
120
+ "bm",
121
+ "dump",
122
+ "-a"
123
+ ], signal);
124
+ return [...new Set(raw.split(/\s+/).filter((name) => bundlePattern.test(name)))].slice(0, 500).map((packageName) => ({
125
+ packageName,
126
+ label: packageName
127
+ }));
128
+ }
129
+ async textInputStatus(_serial, _signal) {
130
+ return {
131
+ unicode: "unsupported",
132
+ method: "hdc-uitest",
133
+ keyboardRequired: false
134
+ };
135
+ }
136
+ async foreground(serial, signal) {
137
+ const raw = await this.shell(serial, [
138
+ "hidumper",
139
+ "-s",
140
+ "WindowManagerService",
141
+ "-a",
142
+ "-a"
143
+ ], signal);
144
+ const focus = /^Focus window:\s*(\d+)\s*$/m.exec(raw)?.[1];
145
+ const row = raw.split(/\r?\n/).map((line) => line.trim().split(/\s+/)).find((parts) => parts[3] === focus && /^\d+$/.test(parts[2]) && parts[1] === "0");
146
+ if (!row) throw new PhoneError("PHONE_APP_UNKNOWN", "Unable to identify the focused HarmonyOS process", 409);
147
+ const bundle = (await this.shell(serial, ["cat", `/proc/${row[2]}/cmdline`], signal)).split("\0")[0].split(":")[0];
148
+ if (!bundlePattern.test(bundle)) throw new PhoneError("PHONE_APP_UNKNOWN", "Unable to identify the focused HarmonyOS app", 409);
149
+ return bundle;
150
+ }
151
+ async window(serial, signal) {
152
+ const raw = await this.shell(serial, [
153
+ "hidumper",
154
+ "-s",
155
+ "WindowManagerService",
156
+ "-a",
157
+ "-a"
158
+ ], signal);
159
+ const id = /^Focus window:\s*(\d+)\s*$/m.exec(raw)?.[1];
160
+ if (!id || id === "0") throw new PhoneError("PHONE_APP_UNKNOWN", "No focused HarmonyOS window", 409);
161
+ return id;
162
+ }
163
+ async rotation(serial, signal) {
164
+ const screen = (await this.shell(serial, [
165
+ "hidumper",
166
+ "-s",
167
+ "DisplayManagerService",
168
+ "-a",
169
+ "-a"
170
+ ], signal)).split(/-+ Screen ID: 0 -+/)[1]?.split(/-+ Screen ID:/)[0];
171
+ const rotation = screen && /^Rotation:\s*(0|1|2|3|90|180|270)\s*$/m.exec(screen)?.[1];
172
+ if (rotation === void 0) throw new PhoneError("PHONE_UI_UNAVAILABLE", "Unable to identify HarmonyOS display rotation", 502);
173
+ const value = Number(rotation);
174
+ return value > 3 ? value / 90 : value;
175
+ }
176
+ async observe(serial, signal) {
177
+ const directory = await mkdtemp(join(tmpdir(), "xopc-hdc-"));
178
+ const prefix = `/data/local/tmp/xopc-phone-${randomUUID()}`;
179
+ let frame;
180
+ try {
181
+ const windowId = await this.window(serial, signal);
182
+ const rotation = await this.rotation(serial, signal);
183
+ await this.shell(serial, [
184
+ "uitest",
185
+ "dumpLayout",
186
+ "-p",
187
+ `${prefix}.json`
188
+ ], signal);
189
+ await this.run([
190
+ "-t",
191
+ serial,
192
+ "file",
193
+ "recv",
194
+ `${prefix}.json`,
195
+ join(directory, "layout.json")
196
+ ], signal);
197
+ const native = parseHarmonyLayout(await readFile(join(directory, "layout.json"), "utf8"), windowId);
198
+ const capturedAt = Date.now();
199
+ try {
200
+ await this.shell(serial, [
201
+ "uitest",
202
+ "screenCap",
203
+ "-p",
204
+ `${prefix}.png`
205
+ ], signal);
206
+ await this.run([
207
+ "-t",
208
+ serial,
209
+ "file",
210
+ "recv",
211
+ `${prefix}.png`,
212
+ join(directory, "screen.png")
213
+ ], signal);
214
+ } catch {
215
+ signal.throwIfAborted();
216
+ await this.shell(serial, [
217
+ "snapshot_display",
218
+ "-f",
219
+ `${prefix}.jpeg`
220
+ ], signal);
221
+ await this.run([
222
+ "-t",
223
+ serial,
224
+ "file",
225
+ "recv",
226
+ `${prefix}.jpeg`,
227
+ join(directory, "screen.jpeg")
228
+ ], signal);
229
+ const jpeg = await readFile(join(directory, "screen.jpeg"));
230
+ try {
231
+ await sharp(jpeg, { limitInputPixels: 16e6 }).png().toFile(join(directory, "screen.png"));
232
+ } finally {
233
+ jpeg.fill(0);
234
+ }
235
+ }
236
+ frame = await readFile(join(directory, "screen.png"));
237
+ if (await this.window(serial, signal) !== windowId || await this.rotation(serial, signal) !== rotation) throw new PhoneError("PHONE_FRAME_CHANGED", "HarmonyOS foreground changed during capture; observe again", 409);
238
+ const info = await sharp(frame, { limitInputPixels: 16e6 }).metadata();
239
+ if (info.format !== "png" || !info.width || !info.height) throw new PhoneError("PHONE_UI_UNAVAILABLE", "Invalid HarmonyOS screenshot", 502);
240
+ return {
241
+ platform: "harmonyos",
242
+ frameId: randomUUID(),
243
+ capturedAt,
244
+ width: info.width,
245
+ height: info.height,
246
+ rotation,
247
+ package: native.package,
248
+ frame,
249
+ elements: native.elements
250
+ };
251
+ } catch (error) {
252
+ frame?.fill(0);
253
+ throw error;
254
+ } finally {
255
+ await this.shell(serial, [
256
+ "rm",
257
+ "-f",
258
+ `${prefix}.json`,
259
+ `${prefix}.png`,
260
+ `${prefix}.jpeg`
261
+ ], AbortSignal.timeout(3e3)).catch(() => {});
262
+ await rm(directory, {
263
+ recursive: true,
264
+ force: true
265
+ });
266
+ }
267
+ }
268
+ async execute(serial, action, observation, signal, options) {
269
+ const point = ([x, y]) => [String(Math.max(0, Math.min(observation.width - 1, Math.round(x * observation.width / 1e3)))), String(Math.max(0, Math.min(observation.height - 1, Math.round(y * observation.height / 1e3))))];
270
+ const input = (args) => this.shell(serial, [
271
+ "uitest",
272
+ "uiInput",
273
+ ...args
274
+ ], signal);
275
+ switch (action.type) {
276
+ case "tap":
277
+ await input(["click", ...point(action.point)]);
278
+ break;
279
+ case "doubleTap":
280
+ await input(["doubleClick", ...point(action.point)]);
281
+ break;
282
+ case "longPress":
283
+ await input(["longClick", ...point(action.point)]);
284
+ break;
285
+ case "swipe": {
286
+ const distance = Math.hypot((action.end[0] - action.start[0]) * observation.width / 1e3, (action.end[1] - action.start[1]) * observation.height / 1e3);
287
+ const velocity = Math.max(200, Math.min(4e4, Math.round(distance * 1e3 / action.durationMs)));
288
+ await input([
289
+ "swipe",
290
+ ...point(action.start),
291
+ ...point(action.end),
292
+ String(velocity)
293
+ ]);
294
+ break;
295
+ }
296
+ case "back":
297
+ case "home":
298
+ await input(["keyEvent", action.type === "back" ? "Back" : "Home"]);
299
+ break;
300
+ case "launch": {
301
+ if (!bundlePattern.test(action.package)) throw new PhoneError("PHONE_INVALID_INPUT", "Invalid HarmonyOS bundle name");
302
+ const entry = parseHarmonyLaunch(await this.shell(serial, [
303
+ "bm",
304
+ "dump",
305
+ "-n",
306
+ action.package
307
+ ], signal));
308
+ const output = await this.shell(serial, [
309
+ "aa",
310
+ "start",
311
+ "-b",
312
+ action.package,
313
+ "-m",
314
+ entry.module,
315
+ "-a",
316
+ entry.ability
317
+ ], signal);
318
+ if (!/start ability successfully/i.test(output)) throw new PhoneError("PHONE_LAUNCH_FAILED", "HarmonyOS app launch was not confirmed", 502);
319
+ break;
320
+ }
321
+ case "typeText": throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "This HarmonyOS connection requires text entry with the phone keyboard. Take over, enter text on the phone, then hand back.", 409);
322
+ case "tapElement": throw new PhoneError("PHONE_SEMANTIC_UNRESOLVED", "Resolve the native element before dispatch", 409);
323
+ case "wait":
324
+ await setTimeout(action.durationMs, void 0, { signal });
325
+ return;
326
+ }
327
+ await setTimeout(options?.settleMs ?? 350, void 0, { signal });
328
+ }
329
+ };
330
+ //#endregion
331
+ export { HdcPhoneDriver, parseHarmonyLaunch, parseHarmonyLayout, parseHdcDevices, resolveHdcPath };
@@ -0,0 +1,2 @@
1
+ /** Compiled against the user's DevEco libraries; no vendor binaries are redistributed. */
2
+ export declare const HDC_VIDEO_BRIDGE_SOURCE: string;
@@ -0,0 +1,91 @@
1
+ //#region src/phone/hdc-video-bridge.ts
2
+ /** Compiled against the user's DevEco libraries; no vendor binaries are redistributed. */
3
+ const HDC_VIDEO_BRIDGE_SOURCE = String.raw`
4
+ import com.huawei.hosscrcpy.api.HosRemoteConfig;
5
+ import com.huawei.hosscrcpy.api.HosRemoteDevice;
6
+ import com.huawei.hosscrcpy.api.ScreenCapCallback;
7
+ import java.io.*;
8
+ import java.nio.ByteBuffer;
9
+ import java.util.jar.*;
10
+ import java.util.Enumeration;
11
+ import java.util.concurrent.atomic.AtomicBoolean;
12
+
13
+ public final class XopcHdcVideo {
14
+ private static final DataOutputStream WIRE = new DataOutputStream(new FileOutputStream(FileDescriptor.out));
15
+ private static final AtomicBoolean STOPPED = new AtomicBoolean(false);
16
+ private static HosRemoteDevice device;
17
+ private static synchronized void emit(int kind, byte[] bytes) {
18
+ if (STOPPED.get()) return;
19
+ try {
20
+ if (bytes.length > 4 * 1024 * 1024) throw new IOException("Video packet exceeds limit");
21
+ WIRE.writeByte(kind); WIRE.writeInt(bytes.length); WIRE.write(bytes); WIRE.flush();
22
+ } catch (IOException error) { STOPPED.set(true); System.exit(2); }
23
+ }
24
+ private static void stop() {
25
+ if (!STOPPED.compareAndSet(false, true)) return;
26
+ if (device != null) {
27
+ Thread cleanup = new Thread(() -> { try { device.stopCaptureScreen(); } catch (Throwable ignored) {} });
28
+ cleanup.setDaemon(true); cleanup.start();
29
+ try { cleanup.join(3000); } catch (InterruptedException ignored) { Thread.currentThread().interrupt(); }
30
+ }
31
+ }
32
+ private static String className(InputStream stream) throws IOException {
33
+ DataInputStream input = new DataInputStream(stream);
34
+ if (input.readInt() != 0xcafebabe) throw new IOException("Invalid library class");
35
+ input.readInt(); int count = input.readUnsignedShort(); Object[] pool = new Object[count];
36
+ for (int index = 1; index < count; index++) {
37
+ switch (input.readUnsignedByte()) {
38
+ case 1: pool[index] = input.readUTF(); break;
39
+ case 7: pool[index] = input.readUnsignedShort(); break;
40
+ case 8: case 16: case 19: case 20: input.skipNBytes(2); break;
41
+ case 3: case 4: case 9: case 10: case 11: case 12: case 17: case 18: input.skipNBytes(4); break;
42
+ case 5: case 6: input.skipNBytes(8); index++; break;
43
+ case 15: input.skipNBytes(3); break;
44
+ default: throw new IOException("Unsupported library class");
45
+ }
46
+ }
47
+ input.readUnsignedShort(); return (String) pool[(Integer) pool[input.readUnsignedShort()]];
48
+ }
49
+ private static boolean validLibrary(String path) throws IOException {
50
+ try (JarFile jar = new JarFile(path)) {
51
+ Enumeration<JarEntry> entries = jar.entries();
52
+ while (entries.hasMoreElements()) {
53
+ JarEntry entry = entries.nextElement(); String name = entry.getName();
54
+ // Some DevEco distributions contain incorrectly cased obfuscated class entries.
55
+ if (!name.endsWith(".class") || !(name.startsWith("com/a/") || name.startsWith("com/huawei/hosscrcpy/"))) continue;
56
+ try (InputStream input = jar.getInputStream(entry)) { if (!name.equals(className(input) + ".class")) return false; }
57
+ }
58
+ }
59
+ return true;
60
+ }
61
+ public static void main(String[] args) throws Exception {
62
+ // Vendor diagnostics must never corrupt the framed stdout transport.
63
+ System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.err), true, "UTF-8"));
64
+ Runtime.getRuntime().addShutdownHook(new Thread(XopcHdcVideo::stop));
65
+ if (!validLibrary(args[2])) { emit(4, new byte[0]); stop(); System.exit(2); }
66
+ if (args[0].equals("--probe")) { HosRemoteConfig.class.getDeclaredMethods(); HosRemoteDevice.class.getDeclaredMethods(); ScreenCapCallback.class.getDeclaredMethods(); stop(); System.exit(0); }
67
+ HosRemoteConfig config = new HosRemoteConfig(args[0]);
68
+ config.setHdcPath(args[1]); config.setIp("127.0.0.1");
69
+ config.setScale(2); config.setFrameRate(24); config.setBitRate(2); config.setIFrameInterval(1);
70
+ device = new HosRemoteDevice(config);
71
+ Thread capture = new Thread(() -> {
72
+ try {
73
+ device.startCaptureScreen(new ScreenCapCallback() {
74
+ public void onReady() { emit(2, new byte[0]); }
75
+ public void onData(ByteBuffer source) {
76
+ if (source.remaining() > 4 * 1024 * 1024) { emit(3, new byte[0]); return; }
77
+ byte[] bytes = new byte[source.remaining()]; source.get(bytes); emit(1, bytes);
78
+ }
79
+ public void onException(Throwable error) { error.printStackTrace(System.err); emit(3, new byte[0]); }
80
+ });
81
+ } catch (Throwable error) { error.printStackTrace(System.err); emit(3, new byte[0]); }
82
+ });
83
+ capture.setDaemon(true); capture.start();
84
+ // A private pipe owns this bridge. EOF, explicit close and parent death stop capture.
85
+ while (System.in.read() != -1) { break; }
86
+ stop(); System.exit(0);
87
+ }
88
+ }
89
+ `;
90
+ //#endregion
91
+ export { HDC_VIDEO_BRIDGE_SOURCE };
@@ -0,0 +1,15 @@
1
+ import type { PhoneConfig } from './contracts.js';
2
+ export type HdcVideoTools = {
3
+ java: string;
4
+ javac: string;
5
+ classpath: string;
6
+ jar: string;
7
+ };
8
+ export declare function hdcJavaHomes(config: Pick<PhoneConfig, 'hdcVideo' | 'hdcPath'>, stateDir?: string): string[];
9
+ export declare function resolveHdcJavaHome(config: Pick<PhoneConfig, 'hdcVideo' | 'hdcPath'>, stateDir?: string): string | undefined;
10
+ export declare function resolveHdcVideoTools(config: Pick<PhoneConfig, 'hdcPath' | 'hdcVideo'>, stateDir?: string): HdcVideoTools | undefined;
11
+ export declare function compileHdcVideoBridge(tools: HdcVideoTools, signal: AbortSignal): Promise<{
12
+ program: string;
13
+ args: string[];
14
+ cleanup: () => Promise<void>;
15
+ }>;
@@ -0,0 +1,123 @@
1
+ import { PhoneError, init_contracts } from "./contracts.js";
2
+ import { runPhoneCommandBuffer } from "../process/phone-process.js";
3
+ import { managedHosJar, managedJavaHome } from "../runtime-tools/harmony-paths.js";
4
+ import { resolveHdcPath } from "./hdc-driver.js";
5
+ import { HDC_VIDEO_BRIDGE_SOURCE } from "./hdc-video-bridge.js";
6
+ import { tmpdir } from "node:os";
7
+ import { delimiter, dirname, join } from "node:path";
8
+ import { existsSync, readdirSync, realpathSync } from "node:fs";
9
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
10
+ //#region src/phone/hdc-video-tools.ts
11
+ init_contracts();
12
+ function hdcJavaHomes(config, stateDir) {
13
+ const inferred = resolveHdcPath(config.hdcPath, stateDir).split(/[\\/]sdk[\\/]/)[0];
14
+ const roots = [
15
+ config.hdcVideo?.devecoPath,
16
+ process.env.DEVECO_HOME,
17
+ inferred,
18
+ "/Applications/DevEco-Studio.app/Contents",
19
+ "C:/Program Files/Huawei/DevEco Studio"
20
+ ];
21
+ const suffix = process.platform === "win32" ? ".exe" : "";
22
+ const pathHomes = (process.env.PATH ?? "").split(delimiter).filter(Boolean).slice(0, 64).flatMap((directory) => {
23
+ try {
24
+ return [dirname(dirname(realpathSync(join(directory, `java${suffix}`))))];
25
+ } catch {
26
+ return [];
27
+ }
28
+ });
29
+ return [
30
+ config.hdcVideo?.javaHome,
31
+ managedJavaHome(stateDir),
32
+ process.env.JAVA_HOME,
33
+ ...roots.flatMap((candidate) => {
34
+ if (!candidate) return [];
35
+ const root = existsSync(join(candidate, "Contents")) ? join(candidate, "Contents") : candidate;
36
+ return [join(root, "jbr", "Contents", "Home"), join(root, "jbr")];
37
+ }),
38
+ ...pathHomes
39
+ ].filter((home) => Boolean(home));
40
+ }
41
+ function resolveHdcJavaHome(config, stateDir) {
42
+ const suffix = process.platform === "win32" ? ".exe" : "";
43
+ return hdcJavaHomes(config, stateDir).find((home) => existsSync(join(home, "bin", `java${suffix}`)) && existsSync(join(home, "bin", `javac${suffix}`)));
44
+ }
45
+ function resolveHdcVideoTools(config, stateDir) {
46
+ const home = resolveHdcJavaHome(config, stateDir);
47
+ if (!home) return void 0;
48
+ const suffix = process.platform === "win32" ? ".exe" : "";
49
+ const executables = {
50
+ java: join(home, "bin", `java${suffix}`),
51
+ javac: join(home, "bin", `javac${suffix}`)
52
+ };
53
+ const standalone = config.hdcVideo?.sdkJar ?? (existsSync(managedHosJar(stateDir)) ? managedHosJar(stateDir) : void 0);
54
+ if (standalone) return existsSync(standalone) ? {
55
+ ...executables,
56
+ jar: standalone,
57
+ classpath: standalone
58
+ } : void 0;
59
+ const inferred = resolveHdcPath(config.hdcPath, stateDir).split(/[\\/]sdk[\\/]/)[0];
60
+ const roots = [
61
+ config.hdcVideo?.devecoPath,
62
+ process.env.DEVECO_HOME,
63
+ inferred,
64
+ "/Applications/DevEco-Studio.app/Contents",
65
+ "C:/Program Files/Huawei/DevEco Studio"
66
+ ];
67
+ for (const candidate of roots) {
68
+ if (!candidate) continue;
69
+ const root = existsSync(join(candidate, "Contents")) ? join(candidate, "Contents") : candidate;
70
+ const lib = join(root, "plugins", "screen-mirroring", "lib");
71
+ if (!existsSync(lib)) continue;
72
+ const jar = readdirSync(lib).find((name) => /^hosScrcpy-[\w.-]+\.jar$/.test(name));
73
+ if (jar) {
74
+ const sdkJar = join(lib, jar);
75
+ return {
76
+ ...executables,
77
+ jar: sdkJar,
78
+ classpath: [
79
+ sdkJar,
80
+ join(root, "plugins", "harmony", "lib", "*"),
81
+ join(root, "lib", "*")
82
+ ].join(delimiter)
83
+ };
84
+ }
85
+ }
86
+ }
87
+ async function compileHdcVideoBridge(tools, signal) {
88
+ const directory = await mkdtemp(join(tmpdir(), "xopc-hdc-video-"));
89
+ try {
90
+ await writeFile(join(directory, "XopcHdcVideo.java"), HDC_VIDEO_BRIDGE_SOURCE, { mode: 384 });
91
+ await runPhoneCommandBuffer(tools.javac, [
92
+ "-proc:none",
93
+ "--release",
94
+ "17",
95
+ "-cp",
96
+ tools.classpath,
97
+ "-d",
98
+ directory,
99
+ join(directory, "XopcHdcVideo.java")
100
+ ], signal, 2e4);
101
+ return {
102
+ program: tools.java,
103
+ args: [
104
+ "-cp",
105
+ `${directory}${delimiter}${tools.classpath}`,
106
+ "XopcHdcVideo"
107
+ ],
108
+ cleanup: () => rm(directory, {
109
+ recursive: true,
110
+ force: true
111
+ })
112
+ };
113
+ } catch {
114
+ await rm(directory, {
115
+ recursive: true,
116
+ force: true
117
+ });
118
+ signal.throwIfAborted();
119
+ throw new PhoneError("PHONE_HDC_VIDEO_DEPENDENCY", `Unable to compile the HarmonyOS video bridge. Check the full JDK 17+ and compatible HOScrcpy library (${dirname(tools.jar)}).`, 502);
120
+ }
121
+ }
122
+ //#endregion
123
+ export { compileHdcVideoBridge, hdcJavaHomes, resolveHdcJavaHome, resolveHdcVideoTools };
@@ -0,0 +1,69 @@
1
+ import { runPhoneCommandBuffer, spawnPhoneInteractiveCommand } from '../process/phone-process.js';
2
+ import { HdcPhoneDriver } from './hdc-driver.js';
3
+ import { type PhoneConfig } from './contracts.js';
4
+ import type { PhoneInteractiveProvider, PhonePointer, PhoneVideoGeometry, PhoneVideoPacket } from './live-provider.js';
5
+ import { compileHdcVideoBridge, resolveHdcVideoTools } from './hdc-video-tools.js';
6
+ /** Each bridge callback carries one complete Annex-B encoded buffer. */
7
+ export declare class HdcVideoParser {
8
+ geometry: PhoneVideoGeometry;
9
+ private sps?;
10
+ private pps?;
11
+ private configuration?;
12
+ push(bytes: Buffer, emit: (packet: PhoneVideoPacket) => void): void;
13
+ }
14
+ /** Binary pipe framing prevents vendor logs or partial writes from becoming video. */
15
+ export declare class HdcBridgeParser {
16
+ private buffer;
17
+ push(bytes: Buffer, emit: (kind: number, bytes: Buffer) => void): void;
18
+ }
19
+ type Dependencies = {
20
+ driver?: HdcPhoneDriver;
21
+ compile?: typeof compileHdcVideoBridge;
22
+ spawn?: typeof spawnPhoneInteractiveCommand;
23
+ command?: typeof runPhoneCommandBuffer;
24
+ tools?: typeof resolveHdcVideoTools;
25
+ validateScreen?: (app: string) => void;
26
+ };
27
+ /** H.264 video with completed-gesture input: cancellation never creates a tap. */
28
+ export declare class HdcVideoProvider implements PhoneInteractiveProvider {
29
+ private serial;
30
+ private configOptions;
31
+ private onFailure;
32
+ private deps;
33
+ readonly descriptor: {
34
+ readonly kind: "hdc-h264";
35
+ readonly protocolVersion: 1;
36
+ readonly continuousTouch: false;
37
+ readonly maxPointers: 1;
38
+ };
39
+ private parser;
40
+ get geometry(): PhoneVideoGeometry;
41
+ private driver;
42
+ private listeners;
43
+ private config?;
44
+ private process?;
45
+ private bridge?;
46
+ private controller;
47
+ private inputController;
48
+ private opening?;
49
+ private started?;
50
+ private closing?;
51
+ private closed;
52
+ private input;
53
+ private inputEpoch;
54
+ private gesture?;
55
+ private forwards;
56
+ private ownedForwards;
57
+ private path;
58
+ constructor(serial: string, configOptions: PhoneConfig, onFailure: () => void, deps?: Dependencies);
59
+ foreground(signal: AbortSignal): Promise<string>;
60
+ private listForwards;
61
+ start(): Promise<void>;
62
+ private open;
63
+ subscribe(listener: (packet: PhoneVideoPacket) => void): () => void;
64
+ refresh(): void;
65
+ pointer(pointer: PhonePointer): Promise<void>;
66
+ revoke(): Promise<void>;
67
+ close(): Promise<void>;
68
+ }
69
+ export {};