@xopcai/xopc 0.0.424 → 0.0.425
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-AI081rxe.js → activity-store-CMw8qBuC.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DupnTbL7.js → agent-avatar-dicebear-JI0YWOIm.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-display-CmEj6Uqy.js → agent-avatar-display-YqmwzOSa.js} +2 -2
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-IEV5yKuu.js → agent-defaults-settings-panel-DlvjxWg6.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-D_njOuFA.js → agent-plugin-dialog-OBueuQSc.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-B_yg9nA3.js → agents-Cp6_5OOQ.js} +3 -3
- package/dist/gateway/static/root/assets/{agents-admin-api-CUZUolwG.js → agents-admin-api-DLnmdC1h.js} +1 -1
- package/dist/gateway/static/root/assets/{api-bpQ7yR10.js → api-Boc-CVh7.js} +1 -1
- package/dist/gateway/static/root/assets/{api-CWWEVThO.js → api-bL7sxjAF.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-C0_hxwgg.js → app-management-settings-panel-jIG5i7KE.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-CLh-qnCC.js → appearance-settings-BnaQW9Xd.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-Bjtm3Rgi.js → apps-page-C2WKUwtN.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-dGnstkhB.js → archive-plugin-DjboG3kA.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-api-MB2xCoFF.js → automation-api-CZqL9l_d.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-result-state-DJQflY78.js → automation-result-state-DRd-X_Ai.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-task-card-DXgBxVE2.js → automation-task-card-wbnR5i6N.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-D3O7M2FH.js → automations-page-HyBQIfmn.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-workspace-Dk3FVWoX.js → automations-workspace-D6cTOKr7.js} +2 -2
- package/dist/gateway/static/root/assets/{binary-plugins-BrVJXmYf.js → binary-plugins-Bg8ARZUH.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Dok4sfT3.js → block-editor-DKohqFAW.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automation-inputs-PJbT3CxW.js → browser-automation-inputs-YeibTzw4.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-kkpX1Q7K.js → browser-automations-page-BWNcbuz2.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-control-api-Bg4wnkeA.js → browser-control-api-CDeuxy2x.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-BrgX_Yb2.js → browser-settings-page-L0nBjfhG.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-Cs6Jt5Gl.js → capabilities-BcQa8c9n.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-BMaJizw4.js → capabilities-aT-QjNTl.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-page-D5hvAG6D.js → capabilities-page-DlpuHdHi.js} +2 -2
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-BrEvm4IH.js → capabilities-settings-panel-pvqkN2-2.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-1jQgGVc9.js → channels-BUPtawh6.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-agents-api-BAOWaUJf.js → chat-agents-api-B8JO6Tcj.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-chart-block-DeWrb9XR.js → chat-chart-block-DRtuFfF1.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-page-CafkCKOj.js → chat-page-BP0huA-W.js} +31 -31
- package/dist/gateway/static/root/assets/{chat-terminal-dock-C544n0-R.js → chat-terminal-dock-Dkqq5FSL.js} +1 -1
- package/dist/gateway/static/root/assets/{command-palette-api-D9PXzY8b.js → command-palette-api-qujvNqkK.js} +1 -1
- package/dist/gateway/static/root/assets/{composer-payload-handoff-CYXfjpem.js → composer-payload-handoff-CYIhcczq.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-DJmod8-w.js → computer-settings-page-8q4hRmoo.js} +1 -1
- package/dist/gateway/static/root/assets/{connected-providers-grid-b46VH4uy.js → connected-providers-grid-CKZfhHSD.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-BqDbTOTp.js → connector-service-page-DQaTI21R.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-api-CwRuUnH4.js → connectors-api-BjypBp2g.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-Mq9Bvoax.js → connectors-page-Lf1ZzaVn.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-DWaT0IC0.js → date-picker-D_PSHGpe.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-DV9XAt6F.js → dependency-picker-UqKVJ9dv.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-Dffq2NxL.js → desktop-pet-1Et9VqkM.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-narrative-CS8qJpNO.js → desktop-pet-narrative-rADKU0FX.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CrB1ICax.js → desktop-pet-settings-0fCGgaG7.js} +1 -1
- package/dist/gateway/static/root/assets/{dev-view-store-liRgSkcT.js → dev-view-store-TTj_djD8.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-ByEL5lvM.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-EKqQLQrE.js → directory-picker-path-field-C07a7wYX.js} +1 -1
- package/dist/gateway/static/root/assets/{discussion-annotation-sync-D-b1X6ro.js → discussion-annotation-sync-BFqKm9ky.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-wD97GeG0.js → extension-debug-page-DFaVlqas.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-iframe-host-B4Q1CjvW.js → extension-iframe-host-BfzPfXBq.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-marketplace-api-ak1_K3u8.js → extension-marketplace-api-ow0K1Y4_.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DWFI4iIh.js → extension-page-CrDADV5W.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-BZwcaU5Y.js → extension-provider-mnRoa63o.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-cn4KS42C.js → extension-settings-page-BLl02GFY.js} +1 -1
- package/dist/gateway/static/root/assets/{file-preview-surface-c3gDD9sM.js → file-preview-surface-TGdKqhCf.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-Dmt5JhZU.js → gateway-config-swr-DfPQIHOL.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-CJtDXQCt.js → gateway-realtime-67vWg_M2.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-Bkt1z-xo.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-restart-DInvvT5u.js → gateway-restart-CLtR2wkL.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-BZXdv2FE.js → gateway-settings-COvC3r-l.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-s2KcWekp.js → gateway-startup-retry-9YQllbw2.js} +1 -1
- package/dist/gateway/static/root/assets/{global-defaults-api-DtnmDd87.js → global-defaults-api-DYMRjGvd.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-CAVjA5rO.js → home-page-k9LFXcVa.js} +2 -2
- package/dist/gateway/static/root/assets/{image-generation-api-RQQokgE9.js → image-generation-api-Dzydfvy8.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-BP_4TubV.js → imports-page-Csd_YZXZ.js} +1 -1
- package/dist/gateway/static/root/assets/index-CpwPxKQ8.css +1 -0
- package/dist/gateway/static/root/assets/index-DKW7BeT_.js +11 -0
- package/dist/gateway/static/root/assets/{install-connector-dialog-BNzNuXJ8.js → install-connector-dialog-CTQAKTPv.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DNRQFepg.js → keyboard-shortcuts-settings-B201bMIa.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-CvY5XxbX.js → local-app-workbench-page-CD_8_gd_.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-DfwEvd8G.js → local-apps-page-BOwqNH0L.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-CuDdIyxR.js → local-session-drafts-DjmK-SM9.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-TQcz_Vjt.js → locale-store-Bg_XR36n.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-eq49F1Rt.js → logs-page-gw3E9CMQ.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-BaYXDMOJ.js → management-settings-t_Z2mCyw.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-D4nII6Zv.js → markdown-view-BUpXJUPv.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-MvlAY405.js → media-plugins-_shnaEMY.js} +1 -1
- package/dist/gateway/static/root/assets/messages-DG4HLOER.js +3 -0
- package/dist/gateway/static/root/assets/{model-selector-nsoNHqif.js → model-selector-a7PIT1Lk.js} +1 -1
- package/dist/gateway/static/root/assets/{models-hub-cache-CFIazNIF.js → models-hub-cache-KOJC3z6Q.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-panel-KPzbHiEW.js → note-detail-panel-BsHYUFgk.js} +3 -3
- package/dist/gateway/static/root/assets/note-image-lightbox-B-bEtjhj.js +1 -0
- package/dist/gateway/static/root/assets/{notes-api-HVxR5bRD.js → notes-api-BSmikUKI.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-yShJeR3i.js → notes-page-CA0NRL8O.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-api-CfKjRVnb.js → oauth-api-D2t9HXoC.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-provider-connect-D4uqONWr.js → oauth-provider-connect-DGGGGtcB.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-B98nlKTc.js → page-context-capture-button-BH54VO0V.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-draft-HcuK45iu.js → page-context-draft-BS5y8Cx9.js} +1 -1
- package/dist/gateway/static/root/assets/page-header-store-BdZnUh-D.js +1 -0
- package/dist/gateway/static/root/assets/{personal-avatar-_d72UP_d.js → personal-avatar-D8DtpDTa.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-page-B19h_3WQ.js → personal-page-KJezmTKP.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-settings-panel-CfwtGyue.js → personal-settings-panel-9uDaNJy5.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-dependencies-card-D8bqsDk_.js → phone-dependencies-card-DLYrI0C4.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-model-picker-CL_Zn6Xd.js → phone-model-picker-BbA2iI-3.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-settings-page-C5Jia8eQ.js → phone-settings-page-Cg_BPss4.js} +1 -1
- package/dist/gateway/static/root/assets/{phone-workspace-store-FBfrfkYq.js → phone-workspace-store-CVDk80Bf.js} +1 -1
- package/dist/gateway/static/root/assets/{plugin-details-dialog-gAq2KPzK.js → plugin-details-dialog-DgibLkc3.js} +1 -1
- package/dist/gateway/static/root/assets/{preference-select-fields-Ck8GAX_y.js → preference-select-fields-BVoN-lAv.js} +1 -1
- package/dist/gateway/static/root/assets/{product-automation-feedback-BJ9oTnNs.js → product-automation-feedback-DCo90zGh.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-Dw9hUdxP.js → product-open-page-OWl8IAoY.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-C0iPzmSm.js → product-preview-content-Cjas7UNe.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-modal-COFtHoh6.js → product-preview-modal-CPWRvBI9.js} +2 -2
- package/dist/gateway/static/root/assets/{project-detail-page-C5Amjah-.js → project-detail-page-B_HlZux_.js} +1 -1
- package/dist/gateway/static/root/assets/{project-understanding-DpL9ADQU.js → project-understanding-Ba02SFzB.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-gGg9nM2t.js → projects-page-CdfKjp95.js} +1 -1
- package/dist/gateway/static/root/assets/{providers-api-D6JJRlJb.js → providers-api-rwQ4LWzr.js} +1 -1
- package/dist/gateway/static/root/assets/{recording-upload-DxX1xKyt.js → recording-upload-BSmvRrZQ.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-BfXzBR1D.js → registry-api-Vy7LfH6E.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-BZA4StwC.js → remote-access-hub-UXrnpGev.js} +1 -1
- package/dist/gateway/static/root/assets/{resource-unavailable-X-SIrZYI.js → resource-unavailable-f9OzSi4W.js} +1 -1
- package/dist/gateway/static/root/assets/{route-preload-CWRb0UCt.js → route-preload-BtObM-co.js} +2 -2
- package/dist/gateway/static/root/assets/{runtime-tools-api-1DjsPyQ5.js → runtime-tools-api-Bt8t37z5.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BnCtyORj.js → runtime-tools-settings-panel-DU4UXnBm.js} +1 -1
- package/dist/gateway/static/root/assets/{service-recommendation-list-ChSOfHHh.js → service-recommendation-list-CuYsRcBB.js} +1 -1
- package/dist/gateway/static/root/assets/{session-api-rvY5aWw8.js → session-api-DJI9eSgw.js} +1 -1
- package/dist/gateway/static/root/assets/session-manager-CtKgACGl.js +23 -0
- package/dist/gateway/static/root/assets/{sessions-page-DAS2IUGT.js → sessions-page-BAsKzRHt.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CjAFqg2U.js +1 -0
- package/dist/gateway/static/root/assets/{settings-advanced-section-ZKRIuk7h.js → settings-advanced-section-BxUuF_yi.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-mode-store-CtJ8pEfm.js → settings-mode-store-CaoRh2gt.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-header-DuNCn8i-.js → settings-page-header-CyUHrn7c.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-DeNC8YHJ.js → settings-page-layout-DGVqXrlp.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-B3pUce-_.js → settings-page-qQ8-6dJ_.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-Fc3vuz_h.js → setup-status-panel-BpaPb625.js} +1 -1
- package/dist/gateway/static/root/assets/{share-link-dialog-B3hwjVAx.js → share-link-dialog-CQJ6Ykm2.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-D_9oFzGS.js → share-preview-page-Cem96FbB.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-api-BoUpXmxq.js → shares-api-Dowes16l.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-Drfuvepz.js → shares-settings-DZEkZDR0.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-api-By2HhJ9O.js → skill-api-D8ZwFEVe.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-list-api-TaUCzS8Y.js → skill-list-api-B4gp00-f.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-CN2fpS1n.js → skill-reload-api-ClmaaDXo.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-LzGLique.js → skills-page-CV0X9rvG.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-Cuyg8Ml3.js → system-settings-panel-D095uacX.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-CY2C4AM2.js +2 -0
- package/dist/gateway/static/root/assets/{task-result-evidence-DDubAU_5.js → task-result-evidence-LUrJlUhb.js} +1 -1
- package/dist/gateway/static/root/assets/{terminal-panel-store-BNs75Wdr.js → terminal-panel-store-BqEDB1Vl.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-DB1ZfBUm.js → theme-store-gAcojLgP.js} +1 -1
- package/dist/gateway/static/root/assets/tool-friendly-title-o6sxGVUu.js +1 -0
- package/dist/gateway/static/root/assets/{tracing-settings-page-TvtX4Goh.js → tracing-settings-page-B1ZRh-Is.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-COoVEdV9.js → tunnel-api-C9u9E3UQ.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-activity-store-Dr_MLgYe.js → understanding-activity-store-BTrzsR6_.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-refresh-store-DGmLGEqw.js → understanding-refresh-store-5Qava3jh.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-DP6eb6ed.js → usage-page-DFMLYKAc.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-itwjDYUb.js → use-autosave-3O-X7x15.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-hjIGlI_2.js → use-composer-attachments-BLc4dBfe.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-ClLa0g8D.js → use-file-preview-expanded-BaOmTXsT.js} +2 -2
- package/dist/gateway/static/root/assets/{use-personal-profile-vhWk6tTU.js → use-personal-profile-MusPgljM.js} +1 -1
- package/dist/gateway/static/root/assets/{use-workspace-tree-dfXXjA2-.js → use-workspace-tree-Ck_U2yTw.js} +1 -1
- package/dist/gateway/static/root/assets/{user-model-page-D8dswPWd.js → user-model-page-Den5Lg-k.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-BIfBySnN.js → voice-api-key-field-C5zJApoa.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-J4o59ICE.js → voice-config-api-DC1bYDt1.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-input-shortcut-events-B1mlpUdC.js → voice-input-shortcut-events-0SZjJdVV.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-transcribe-api-xxaSOOmq.js → voice-transcribe-api-CxVeANPX.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DqwT1E5u.js → work-discovery-overlay-DAQ8McVe.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-page-BzYQmPLT.js → work-discovery-page-DUQysEyb.js} +1 -1
- package/dist/gateway/static/root/assets/{working-directory-picker-modal-D2Zf3GOG.js → working-directory-picker-modal-BO9qdJyZ.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-Bnx3eS2M.js → workspace-api-ZrN6yUER.js} +2 -2
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-Bo5dwoWP.js +1 -0
- package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-D13qHzVr.js → workspace-file-preview-dialog-Yj_kBWSb.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-open-location-menu-Cou-ig1H.js → workspace-open-location-menu-yxT7wajO.js} +1 -1
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-DQGPKxHA.js → xopc-cloud-account-card-IcH9KDzx.js} +1 -1
- package/dist/gateway/static/root/index.html +81 -81
- package/dist/package.js +1 -1
- package/dist/packages/computer-control-contract/src/index.js +33 -3
- package/dist/src/agent/embedded/run-turn.js +64 -4
- package/dist/src/agent/tool-manuals/computer.d.ts +1 -1
- package/dist/src/agent/tool-manuals/computer.js +6 -0
- package/dist/src/agent/tools/computer-use-tool.js +18 -5
- package/dist/src/agent/tools/phone-use-tool.js +12 -2
- package/dist/src/cli/commands/backup.js +1 -1
- package/dist/src/computer/agent-context.d.ts +21 -0
- package/dist/src/computer/agent-context.js +107 -0
- package/dist/src/computer/broker.d.ts +4 -2
- package/dist/src/computer/broker.js +26 -11
- package/dist/src/computer/diagnostics.d.ts +60 -6
- package/dist/src/computer/diagnostics.js +45 -4
- package/dist/src/computer/errors.d.ts +1 -1
- package/dist/src/computer/errors.js +4 -0
- package/dist/src/computer/evaluation.d.ts +2 -2
- package/dist/src/computer/native-timing.d.ts +15 -0
- package/dist/src/computer/native-timing.js +49 -0
- package/dist/src/computer/program-runtime.d.ts +22 -0
- package/dist/src/computer/program-runtime.js +105 -0
- package/dist/src/computer/runtime.d.ts +36 -2
- package/dist/src/computer/runtime.js +269 -58
- package/dist/src/config/schema.d.ts +18 -0
- package/dist/src/gateway/global-defaults-admin.js +1 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +6 -0
- package/dist/src/phone/adb-driver.d.ts +15 -1
- package/dist/src/phone/adb-driver.js +104 -41
- package/dist/src/phone/autoglm-protocol.d.ts +36 -0
- package/dist/src/phone/autoglm-protocol.js +88 -0
- package/dist/src/phone/autoglm-upstream-prompt.d.ts +2 -0
- package/dist/src/phone/autoglm-upstream-prompt.js +5 -0
- package/dist/src/phone/autoglm-upstream.LICENSE +201 -0
- package/dist/src/phone/cloud-adb-connection.d.ts +3 -0
- package/dist/src/phone/cloud-adb-connection.js +102 -31
- package/dist/src/phone/cloud-adb.js +18 -6
- package/dist/src/phone/completion-recovery.d.ts +6 -0
- package/dist/src/phone/completion-recovery.js +30 -0
- package/dist/src/phone/contracts.d.ts +20 -0
- package/dist/src/phone/contracts.js +6 -0
- package/dist/src/phone/execution-trace.d.ts +51 -0
- package/dist/src/phone/execution-trace.js +78 -0
- package/dist/src/phone/model-adapter.d.ts +9 -1
- package/dist/src/phone/model-adapter.js +132 -61
- package/dist/src/phone/model-response.d.ts +5 -0
- package/dist/src/phone/model-response.js +118 -0
- package/dist/src/phone/runtime.d.ts +4 -0
- package/dist/src/phone/runtime.js +146 -16
- package/dist/src/phone/text-session.d.ts +14 -0
- package/dist/src/phone/text-session.js +39 -0
- package/dist/src/phone/ui-dump-binary.d.ts +1 -1
- package/dist/src/phone/ui-dump-binary.js +1 -1
- package/dist/src/phone/ui-session.d.ts +22 -0
- package/dist/src/phone/ui-session.js +191 -0
- package/dist/src/process/phone-process.d.ts +1 -0
- package/dist/src/process/phone-process.js +11 -1
- package/package.json +2 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-1du1hfi5.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-DcsZyYEa.js +0 -1
- package/dist/gateway/static/root/assets/index-BS9mjvSL.js +0 -11
- package/dist/gateway/static/root/assets/index-pT-m6l6b.css +0 -1
- package/dist/gateway/static/root/assets/messages-DaLmc4W1.js +0 -3
- package/dist/gateway/static/root/assets/note-image-lightbox-DticJxxh.js +0 -1
- package/dist/gateway/static/root/assets/page-header-store-D6SzJ9Ch.js +0 -1
- package/dist/gateway/static/root/assets/session-manager-D2rbRfX3.js +0 -23
- package/dist/gateway/static/root/assets/settings-advanced-gate-CYDQybNF.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-6A9337pK.js +0 -2
- package/dist/gateway/static/root/assets/tool-friendly-title-DGmi7rCQ.js +0 -1
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-COUVwj-p.js +0 -1
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { resolveEffectiveAgentConfigForSession } from "../config/agent-profile.js";
|
|
4
|
-
import { COMPUTER_CONTROL_TOOL, ComputerAppSchema, ComputerObservationSchema, ComputerWindowSchema, init_src } from "../../packages/computer-control-contract/src/index.js";
|
|
4
|
+
import { COMPUTER_CONTROL_TOOL, ComputerActionSchema, ComputerAppSchema, ComputerObservationSchema, ComputerTransportTimingSchema, ComputerWindowSchema, init_src } from "../../packages/computer-control-contract/src/index.js";
|
|
5
5
|
import { ComputerServiceLimitsSchema, computerModelProfile, init_model_policy } from "./model-policy.js";
|
|
6
6
|
import { getApiKey, init_providers, resolveModel } from "../providers/index.js";
|
|
7
7
|
import { rejectUnbudgetedCloudTransport } from "../providers/xopc-cloud-credit-budget.js";
|
|
8
8
|
import { enterComputerControl, leaveComputerControl } from "./control-guard.js";
|
|
9
|
+
import { clearComputerFrames, computerAgentTurn, retainComputerFrame } from "./agent-context.js";
|
|
9
10
|
import { ComputerDiagnosticSchema, ComputerOperationError, computerDiagnostic, computerRecovery } from "./errors.js";
|
|
10
11
|
import { createComputerModelAdapter, predictComputerStep, readComputerJson } from "./model-adapter.js";
|
|
11
12
|
import { groundComputerAction } from "./semantic-actions.js";
|
|
12
13
|
import { ComputerFlowCapture, ComputerFlowStore, computerFlowHint, computerFlowMetadata } from "./flows.js";
|
|
13
14
|
import { ComputerNativeTimingSchema, ComputerSessionDiagnostics } from "./diagnostics.js";
|
|
15
|
+
import { executeComputerProgram } from "./program-runtime.js";
|
|
14
16
|
import { ComputerExpectationSchema, ComputerTaskState, verifyComputerExpectation } from "./task-state.js";
|
|
15
17
|
import { randomUUID } from "node:crypto";
|
|
16
18
|
import { z } from "zod";
|
|
@@ -36,6 +38,7 @@ const Reply = z.object({
|
|
|
36
38
|
grantId: z.string().optional(),
|
|
37
39
|
observation: ComputerObservationSchema.optional(),
|
|
38
40
|
nativeMs: ComputerNativeTimingSchema.optional(),
|
|
41
|
+
transportTiming: ComputerTransportTimingSchema.optional(),
|
|
39
42
|
errorCode: z.string().optional(),
|
|
40
43
|
diagnostic: ComputerDiagnosticSchema.optional(),
|
|
41
44
|
apps: z.array(ComputerAppSchema).max(100).optional(),
|
|
@@ -72,7 +75,8 @@ const ComputerUseInputSchema = z.discriminatedUnion("op", [
|
|
|
72
75
|
appRef: z.string().min(1).max(200),
|
|
73
76
|
windowRef: z.string().min(1).max(200).optional(),
|
|
74
77
|
mode: z.enum(["observe", "control"]),
|
|
75
|
-
prepare: z.boolean()
|
|
78
|
+
prepare: z.boolean(),
|
|
79
|
+
planner: z.enum(["gui", "agent"]).optional()
|
|
76
80
|
}).strict(),
|
|
77
81
|
z.object({
|
|
78
82
|
op: z.literal("observe"),
|
|
@@ -85,6 +89,12 @@ const ComputerUseInputSchema = z.discriminatedUnion("op", [
|
|
|
85
89
|
expect: ComputerExpectationSchema.optional(),
|
|
86
90
|
flowId: z.uuid().optional()
|
|
87
91
|
}).strict(),
|
|
92
|
+
z.object({
|
|
93
|
+
op: z.literal("exec"),
|
|
94
|
+
code: z.string().max(65536),
|
|
95
|
+
maxActions: z.number().int().min(1).max(12).optional(),
|
|
96
|
+
timeoutMs: z.number().int().min(100).max(12e4).optional()
|
|
97
|
+
}).strict(),
|
|
88
98
|
z.object({
|
|
89
99
|
op: z.literal("run"),
|
|
90
100
|
goal: z.string().min(1).max(4e3),
|
|
@@ -113,7 +123,7 @@ var ComputerRuntime = class {
|
|
|
113
123
|
this.getTurnEndpoint = getTurnEndpoint;
|
|
114
124
|
this.flowStore = flowStore;
|
|
115
125
|
}
|
|
116
|
-
async execute(owner, input, signal) {
|
|
126
|
+
async execute(owner, input, signal, execution) {
|
|
117
127
|
input = ComputerUseInputSchema.parse(input);
|
|
118
128
|
if (!owner) throw new Error("COMPUTER_CONVERSATION_REQUIRED");
|
|
119
129
|
if (input.op === "flows" || input.op === "forget_flow") {
|
|
@@ -207,7 +217,7 @@ var ComputerRuntime = class {
|
|
|
207
217
|
if (diagnostics) this.openingReports.set(owner, diagnostics);
|
|
208
218
|
try {
|
|
209
219
|
const operationSignal = signal ? AbortSignal.any([signal, operation.signal]) : operation.signal;
|
|
210
|
-
const result = input.op === "run" ? await this.executeGoal(owner, input, operationSignal, diagnostics) : await this.executeInput(owner, input, operationSignal, diagnostics);
|
|
220
|
+
const result = input.op === "exec" ? await this.executeProgram(owner, input, operationSignal, execution) : input.op === "run" ? await this.executeGoal(owner, input, operationSignal, diagnostics) : await this.executeInput(owner, input, operationSignal, diagnostics);
|
|
211
221
|
if (result.errorCode) diagnostics?.fail(new Error(result.errorCode), diagnostics.phase, result.receipt?.dispatch ?? "notStarted");
|
|
212
222
|
if (diagnostics && !this.sessions.has(owner)) this.retainReport(owner, diagnostics);
|
|
213
223
|
return {
|
|
@@ -242,6 +252,182 @@ var ComputerRuntime = class {
|
|
|
242
252
|
const effective = resolveEffectiveAgentConfigForSession(owner).config;
|
|
243
253
|
return JSON.stringify([effective.id, effective.workspace]);
|
|
244
254
|
}
|
|
255
|
+
async executeProgram(owner, input, signal, execution) {
|
|
256
|
+
const s = this.sessions.get(owner);
|
|
257
|
+
if (!s) throw new Error("COMPUTER_OPEN_REQUIRED");
|
|
258
|
+
if (!("planner" in s.binding) || s.binding.planner !== "agent" || !execution) throw new Error("COMPUTER_PLANNER_MISMATCH");
|
|
259
|
+
const turn = computerAgentTurn(owner);
|
|
260
|
+
if (JSON.stringify(turn.binding) !== JSON.stringify(s.binding)) {
|
|
261
|
+
await this.close(owner);
|
|
262
|
+
throw new Error("COMPUTER_AGENT_MODEL_CHANGED");
|
|
263
|
+
}
|
|
264
|
+
const combined = AbortSignal.any([signal, s.controller.signal]);
|
|
265
|
+
let current;
|
|
266
|
+
let actions = 0;
|
|
267
|
+
let imageRef;
|
|
268
|
+
const observe = async (observationSignal = combined) => {
|
|
269
|
+
current?.frame?.fill(0);
|
|
270
|
+
current = await this.send(s, {
|
|
271
|
+
op: "observe",
|
|
272
|
+
sessionId: s.id,
|
|
273
|
+
owner
|
|
274
|
+
}, observationSignal);
|
|
275
|
+
if (current.value.status !== "ready" || current.value.errorCode || !current.value.observation) throw new Error(current.value.errorCode ?? "COMPUTER_NOT_READY");
|
|
276
|
+
const observation = current.value.observation;
|
|
277
|
+
let data;
|
|
278
|
+
try {
|
|
279
|
+
data = JSON.parse(observation.summary);
|
|
280
|
+
} catch {
|
|
281
|
+
data = {
|
|
282
|
+
text: observation.summary,
|
|
283
|
+
elements: [],
|
|
284
|
+
truncated: true
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
snapshotId: observation.id,
|
|
289
|
+
...data
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
const snapshot = (id) => {
|
|
293
|
+
const observation = current?.value.observation;
|
|
294
|
+
if (!observation || observation.id !== id || Date.now() - observation.capturedAt > 5e3) throw new Error("COMPUTER_STALE_OBSERVATION");
|
|
295
|
+
return observation;
|
|
296
|
+
};
|
|
297
|
+
try {
|
|
298
|
+
const result = await executeComputerProgram(input.code, async (method, args, callSignal) => {
|
|
299
|
+
callSignal.throwIfAborted();
|
|
300
|
+
if (!this.getConfig().computer.enabled || Date.now() - s.createdAt >= this.getConfig().computer.maxSessionDurationMs) throw new Error("COMPUTER_SESSION_BUDGET");
|
|
301
|
+
if (JSON.stringify(computerAgentTurn(owner).binding) !== JSON.stringify(s.binding)) throw new Error("COMPUTER_AGENT_MODEL_CHANGED");
|
|
302
|
+
await turn.authorize?.(method, args);
|
|
303
|
+
const hostResult = await (async () => {
|
|
304
|
+
if (method === "observe") {
|
|
305
|
+
const options = z.object({ visual: z.boolean().optional() }).strict().parse(args ?? {});
|
|
306
|
+
const state = await observe(callSignal);
|
|
307
|
+
if (options.visual && current?.frame && current.mimeType) imageRef = retainComputerFrame(owner, execution.toolCallId, current.frame, current.mimeType);
|
|
308
|
+
return state;
|
|
309
|
+
}
|
|
310
|
+
if (method === "emitScreenshot") {
|
|
311
|
+
snapshot(z.object({ snapshotId: z.string() }).strict().parse(args).snapshotId);
|
|
312
|
+
if (!current?.frame || !current.mimeType) throw new Error("COMPUTER_FRAME_REQUIRED");
|
|
313
|
+
imageRef = retainComputerFrame(owner, execution.toolCallId, current.frame, current.mimeType);
|
|
314
|
+
return { imageRef };
|
|
315
|
+
}
|
|
316
|
+
if (method === "resolve") {
|
|
317
|
+
const value = z.object({
|
|
318
|
+
snapshotId: z.string(),
|
|
319
|
+
role: z.string().max(100),
|
|
320
|
+
label: z.string().max(300)
|
|
321
|
+
}).strict().parse(args);
|
|
322
|
+
const data = JSON.parse(snapshot(value.snapshotId).summary);
|
|
323
|
+
if (data.truncated || !Array.isArray(data.elements)) throw new Error("COMPUTER_ELEMENT_REF_REQUIRED");
|
|
324
|
+
const candidates = data.elements.filter((e) => e.role === value.role && e.label === value.label && e.in_web_content !== true);
|
|
325
|
+
if (candidates.length !== 1 || typeof candidates[0].ref !== "string") throw new Error("COMPUTER_ELEMENT_REF_REQUIRED");
|
|
326
|
+
return candidates[0];
|
|
327
|
+
}
|
|
328
|
+
if (method === "verify" || method === "waitFor") {
|
|
329
|
+
const value = z.object({
|
|
330
|
+
expect: ComputerExpectationSchema,
|
|
331
|
+
timeoutMs: z.number().int().min(0).max(5e3).optional()
|
|
332
|
+
}).strict().parse(args);
|
|
333
|
+
const deadline = Date.now() + (method === "waitFor" ? value.timeoutMs ?? 2e3 : 0);
|
|
334
|
+
for (let sample = 0; sample < 20; sample++) {
|
|
335
|
+
const state = await observe(callSignal);
|
|
336
|
+
const verification = verifyComputerExpectation(value.expect, current.value.observation);
|
|
337
|
+
s.diagnostics.verify(verification);
|
|
338
|
+
if (verification?.status === "satisfied" || Date.now() >= deadline || sample === 19) return {
|
|
339
|
+
...state,
|
|
340
|
+
verification
|
|
341
|
+
};
|
|
342
|
+
await setTimeout(100, void 0, { signal: callSignal });
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (method === "act") {
|
|
346
|
+
if (s.mode === "observe") throw new Error("COMPUTER_READ_ONLY");
|
|
347
|
+
const value = z.object({
|
|
348
|
+
snapshotId: z.string(),
|
|
349
|
+
action: ComputerActionSchema,
|
|
350
|
+
expect: ComputerExpectationSchema.optional()
|
|
351
|
+
}).strict().parse(args);
|
|
352
|
+
const before = snapshot(value.snapshotId);
|
|
353
|
+
if (++actions > (input.maxActions ?? 6)) throw new Error("COMPUTER_ACTION_BUDGET");
|
|
354
|
+
const action = groundComputerAction(value.action, before);
|
|
355
|
+
s.task.assertProgress(action, before);
|
|
356
|
+
s.pendingContext = {
|
|
357
|
+
goal: "Authorized main-agent UI program",
|
|
358
|
+
before,
|
|
359
|
+
expectation: value.expect
|
|
360
|
+
};
|
|
361
|
+
const envelope = {
|
|
362
|
+
actionId: randomUUID(),
|
|
363
|
+
sessionId: s.id,
|
|
364
|
+
observationId: before.id,
|
|
365
|
+
brokerEpoch: before.brokerEpoch,
|
|
366
|
+
generation: before.generation,
|
|
367
|
+
grantId: current.value.grantId,
|
|
368
|
+
deadlineAt: Date.now() + 12e4,
|
|
369
|
+
action
|
|
370
|
+
};
|
|
371
|
+
const context = {
|
|
372
|
+
observationsReused: 0,
|
|
373
|
+
stabilityObservations: 0,
|
|
374
|
+
actionsRemaining: 1,
|
|
375
|
+
nativeMs: {
|
|
376
|
+
precheckMs: 0,
|
|
377
|
+
inputMs: 0,
|
|
378
|
+
postObserveMs: 0
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
clearComputerFrames(owner);
|
|
382
|
+
imageRef = void 0;
|
|
383
|
+
current?.frame?.fill(0);
|
|
384
|
+
current = void 0;
|
|
385
|
+
const authorizationDeadline = Date.now() + 6e4;
|
|
386
|
+
let reply = await this.dispatchAction(s, envelope, callSignal, context);
|
|
387
|
+
while (reply.status === "pending_action") {
|
|
388
|
+
if (Date.now() >= authorizationDeadline) throw new Error("COMPUTER_AUTHORIZATION_TIMEOUT");
|
|
389
|
+
await setTimeout(250, void 0, { signal: callSignal });
|
|
390
|
+
reply = await this.dispatchAction(s, envelope, callSignal, context);
|
|
391
|
+
}
|
|
392
|
+
current = context.observation;
|
|
393
|
+
if (reply.errorCode || reply.receipt?.dispatch !== "completed") throw new Error(reply.errorCode ?? "COMPUTER_NATIVE_ACTION_FAILED");
|
|
394
|
+
let state = {};
|
|
395
|
+
try {
|
|
396
|
+
state = JSON.parse(current?.value.observation?.summary ?? "{}");
|
|
397
|
+
} catch {
|
|
398
|
+
state = { truncated: true };
|
|
399
|
+
}
|
|
400
|
+
return {
|
|
401
|
+
...state,
|
|
402
|
+
receipt: reply.receipt,
|
|
403
|
+
verification: reply.verification,
|
|
404
|
+
snapshotId: current?.value.observation?.id
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
throw new Error("COMPUTER_INVALID_INPUT");
|
|
408
|
+
})();
|
|
409
|
+
return await turn.complete?.(method, hostResult) ?? hostResult;
|
|
410
|
+
}, s.programStore ??= Object.create(null), combined, input.timeoutMs);
|
|
411
|
+
if (result.status === "program_error") {
|
|
412
|
+
await this.close(owner);
|
|
413
|
+
return {
|
|
414
|
+
...result,
|
|
415
|
+
sessionId: s.id
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
return {
|
|
419
|
+
...result,
|
|
420
|
+
sessionId: s.id,
|
|
421
|
+
...imageRef ? { imageRef } : {},
|
|
422
|
+
budget: this.budget(s)
|
|
423
|
+
};
|
|
424
|
+
} catch (error) {
|
|
425
|
+
await this.close(owner);
|
|
426
|
+
throw error;
|
|
427
|
+
} finally {
|
|
428
|
+
current?.frame?.fill(0);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
245
431
|
async executeGoal(owner, input, signal, diagnostics) {
|
|
246
432
|
const startedAt = Date.now();
|
|
247
433
|
const phasesBefore = diagnostics?.snapshot().phaseMs;
|
|
@@ -310,7 +496,7 @@ var ComputerRuntime = class {
|
|
|
310
496
|
} finally {
|
|
311
497
|
context.observation?.frame?.fill(0);
|
|
312
498
|
context.observation = void 0;
|
|
313
|
-
this.sessions.get(owner)?.adapter
|
|
499
|
+
this.sessions.get(owner)?.adapter?.reset?.();
|
|
314
500
|
}
|
|
315
501
|
}
|
|
316
502
|
async executeInput(owner, input, signal, diagnostics, goalContext) {
|
|
@@ -321,7 +507,7 @@ var ComputerRuntime = class {
|
|
|
321
507
|
throw new Error("COMPUTER_DISABLED");
|
|
322
508
|
}
|
|
323
509
|
let s = this.sessions.get(owner);
|
|
324
|
-
if (s
|
|
510
|
+
if (s && !("planner" in s.binding) && s.binding.modelRef.startsWith("xopc-cloud/")) rejectUnbudgetedCloudTransport("computer use");
|
|
325
511
|
if (input.op === "discover") {
|
|
326
512
|
const endpoint = this.resolveEndpoint(owner);
|
|
327
513
|
const id = randomUUID();
|
|
@@ -340,49 +526,66 @@ var ComputerRuntime = class {
|
|
|
340
526
|
if (input.op === "open" && !s) {
|
|
341
527
|
const endpoint = this.resolveEndpoint(owner);
|
|
342
528
|
const effective = resolveEffectiveAgentConfigForSession(owner).config;
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
const model = resolveModel(ref);
|
|
346
|
-
const profile = computerModelProfile(model);
|
|
347
|
-
if (!profile) throw new Error("COMPUTER_MODEL_CAPABILITY_REQUIRED");
|
|
348
|
-
const apiKey = await getApiKey(model.provider, {
|
|
349
|
-
agentId: effective.id,
|
|
350
|
-
appConfig: config
|
|
351
|
-
});
|
|
352
|
-
if (!apiKey) throw new Error("COMPUTER_MODEL_KEY_MISSING");
|
|
353
|
-
let deployment;
|
|
529
|
+
let adapter;
|
|
530
|
+
let binding;
|
|
354
531
|
let serviceLimits;
|
|
355
|
-
if (
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
532
|
+
if (input.planner === "agent") {
|
|
533
|
+
const turn = computerAgentTurn(owner);
|
|
534
|
+
binding = turn.binding;
|
|
535
|
+
turn.cleanup = async () => {
|
|
536
|
+
await this.close(owner);
|
|
537
|
+
};
|
|
538
|
+
} else {
|
|
539
|
+
const ref = effective.models.computerUse?.primary;
|
|
540
|
+
if (!ref) throw new Error("COMPUTER_MODEL_REQUIRED");
|
|
541
|
+
const model = resolveModel(ref);
|
|
542
|
+
const profile = computerModelProfile(model);
|
|
543
|
+
if (!profile) throw new Error("COMPUTER_MODEL_CAPABILITY_REQUIRED");
|
|
544
|
+
const apiKey = await getApiKey(model.provider, {
|
|
545
|
+
agentId: effective.id,
|
|
546
|
+
appConfig: config
|
|
361
547
|
});
|
|
362
|
-
if (!
|
|
363
|
-
|
|
364
|
-
|
|
548
|
+
if (!apiKey) throw new Error("COMPUTER_MODEL_KEY_MISSING");
|
|
549
|
+
let deployment;
|
|
550
|
+
if (model.provider === "xopc-cloud") {
|
|
551
|
+
rejectUnbudgetedCloudTransport("computer use");
|
|
552
|
+
const response = await fetch(`${model.baseUrl.replace(/\/$/, "")}/models`, {
|
|
553
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
554
|
+
redirect: "error",
|
|
555
|
+
signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(15e3)]) : AbortSignal.timeout(15e3)
|
|
556
|
+
});
|
|
557
|
+
if (!response.ok) {
|
|
558
|
+
await response.body?.cancel();
|
|
559
|
+
throw new Error("COMPUTER_DEPLOYMENT_UNAVAILABLE");
|
|
560
|
+
}
|
|
561
|
+
const metadata = (await readComputerJson(response, 2 * 1024 * 1024)).data?.find((item) => item.id === model.id)?.xopc;
|
|
562
|
+
const parsedDeployment = z.object({
|
|
563
|
+
revision: z.string().regex(/^[a-f0-9]{64}$/),
|
|
564
|
+
origin: z.string().url().optional()
|
|
565
|
+
}).safeParse(metadata?.computerDeployment);
|
|
566
|
+
const parsedLimits = ComputerServiceLimitsSchema.optional().safeParse(metadata?.computerLimits);
|
|
567
|
+
if (!parsedDeployment.success || !parsedLimits.success) throw new Error("COMPUTER_DEPLOYMENT_UNAVAILABLE");
|
|
568
|
+
deployment = parsedDeployment.data;
|
|
569
|
+
serviceLimits = parsedLimits.data;
|
|
365
570
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
571
|
+
adapter = createComputerModelAdapter({
|
|
572
|
+
modelId: model.id,
|
|
573
|
+
baseUrl: model.baseUrl,
|
|
574
|
+
api: model.api,
|
|
575
|
+
apiKey,
|
|
576
|
+
profile,
|
|
577
|
+
headers: model.headers,
|
|
578
|
+
deploymentRevision: deployment?.revision,
|
|
579
|
+
maxOutputTokens: Math.min(2048, model.maxTokens ?? 2048, serviceLimits?.maxOutputTokens ?? 2048)
|
|
580
|
+
});
|
|
581
|
+
binding = {
|
|
582
|
+
modelRef: ref,
|
|
583
|
+
profile,
|
|
584
|
+
origin: new URL(model.baseUrl).origin,
|
|
585
|
+
runtimeLocation: "unknown",
|
|
586
|
+
...deployment?.origin ? { upstreamOrigin: deployment.origin } : {}
|
|
587
|
+
};
|
|
375
588
|
}
|
|
376
|
-
const adapter = createComputerModelAdapter({
|
|
377
|
-
modelId: model.id,
|
|
378
|
-
baseUrl: model.baseUrl,
|
|
379
|
-
api: model.api,
|
|
380
|
-
apiKey,
|
|
381
|
-
profile,
|
|
382
|
-
headers: model.headers,
|
|
383
|
-
deploymentRevision: deployment?.revision,
|
|
384
|
-
maxOutputTokens: Math.min(2048, model.maxTokens ?? 2048, serviceLimits?.maxOutputTokens ?? 2048)
|
|
385
|
-
});
|
|
386
589
|
signal.throwIfAborted();
|
|
387
590
|
s = {
|
|
388
591
|
id: randomUUID(),
|
|
@@ -393,13 +596,7 @@ var ComputerRuntime = class {
|
|
|
393
596
|
windowRef: input.windowRef,
|
|
394
597
|
endpointId: endpoint.endpointId,
|
|
395
598
|
adapter,
|
|
396
|
-
binding
|
|
397
|
-
modelRef: ref,
|
|
398
|
-
profile,
|
|
399
|
-
origin: new URL(model.baseUrl).origin,
|
|
400
|
-
runtimeLocation: "unknown",
|
|
401
|
-
...deployment?.origin ? { upstreamOrigin: deployment.origin } : {}
|
|
402
|
-
},
|
|
599
|
+
binding,
|
|
403
600
|
createdAt: Date.now(),
|
|
404
601
|
actions: 0,
|
|
405
602
|
modelRequests: 0,
|
|
@@ -430,7 +627,7 @@ var ComputerRuntime = class {
|
|
|
430
627
|
s.diagnostics.phase = "observe";
|
|
431
628
|
try {
|
|
432
629
|
if (input.op === "open") {
|
|
433
|
-
if (input.appRef !== s.appRef || input.windowRef !== s.windowRef || input.mode !== s.mode || input.prepare !== s.prepare) throw new Error("COMPUTER_CLOSE_BEFORE_TARGET_CHANGE");
|
|
630
|
+
if (input.planner === "agent" !== "planner" in s.binding || input.appRef !== s.appRef || input.windowRef !== s.windowRef || input.mode !== s.mode || input.prepare !== s.prepare) throw new Error("COMPUTER_CLOSE_BEFORE_TARGET_CHANGE");
|
|
434
631
|
const reply = await this.send(s, {
|
|
435
632
|
op: "open",
|
|
436
633
|
sessionId: s.id,
|
|
@@ -474,7 +671,7 @@ var ComputerRuntime = class {
|
|
|
474
671
|
this.reserveRescue(s, signal);
|
|
475
672
|
} else if (status.value.status !== "ready") return this.present(status.value);
|
|
476
673
|
if (input.op === "step") {
|
|
477
|
-
if (input.flowId || s.lastFlowId) s.adapter
|
|
674
|
+
if (input.flowId || s.lastFlowId) s.adapter?.reset?.();
|
|
478
675
|
s.lastFlowId = input.flowId;
|
|
479
676
|
}
|
|
480
677
|
while (true) {
|
|
@@ -513,7 +710,7 @@ var ComputerRuntime = class {
|
|
|
513
710
|
};
|
|
514
711
|
if (input.op === "step" && input.expect?.kind !== "text" && verification?.status === "satisfied") {
|
|
515
712
|
s.diagnostics.verify(verification);
|
|
516
|
-
s.adapter
|
|
713
|
+
s.adapter?.reset?.();
|
|
517
714
|
return {
|
|
518
715
|
status: "condition_satisfied",
|
|
519
716
|
sessionId: s.id,
|
|
@@ -536,6 +733,7 @@ var ComputerRuntime = class {
|
|
|
536
733
|
}
|
|
537
734
|
phase = "model";
|
|
538
735
|
const predictionInput = input;
|
|
736
|
+
if (!s.adapter) throw new Error("COMPUTER_PLANNER_MISMATCH");
|
|
539
737
|
const proposal = await s.diagnostics.measure("model", () => predictComputerStep(s.adapter, {
|
|
540
738
|
goal: predictionInput.op === "observe" ? predictionInput.question : predictionInput.goal,
|
|
541
739
|
readOnly: predictionInput.op === "observe",
|
|
@@ -636,7 +834,7 @@ var ComputerRuntime = class {
|
|
|
636
834
|
}
|
|
637
835
|
s.rescues++;
|
|
638
836
|
s.diagnostics.count("rescueAttempts");
|
|
639
|
-
s.adapter
|
|
837
|
+
s.adapter?.reset?.();
|
|
640
838
|
}
|
|
641
839
|
async dispatchAction(s, envelope, signal, goalContext) {
|
|
642
840
|
if (!s.pending) {
|
|
@@ -655,7 +853,7 @@ var ComputerRuntime = class {
|
|
|
655
853
|
reply.frame?.fill(0);
|
|
656
854
|
throw new Error("COMPUTER_RECEIPT_MISMATCH");
|
|
657
855
|
}
|
|
658
|
-
if (goalContext && s.adapter
|
|
856
|
+
if (goalContext && s.adapter?.hasPendingPlan && reply.value.status === "ready" && !reply.value.errorCode && reply.value.receipt?.dispatch === "completed" && reply.value.observation) {
|
|
659
857
|
const receipt = reply.value.receipt;
|
|
660
858
|
const nativeMs = reply.value.nativeMs;
|
|
661
859
|
let stable = false;
|
|
@@ -686,7 +884,7 @@ var ComputerRuntime = class {
|
|
|
686
884
|
if (stable || next.value.status !== "ready" || next.value.errorCode) break;
|
|
687
885
|
}
|
|
688
886
|
if (!stable && !reply.value.errorCode) reply.value.errorCode = "COMPUTER_UI_UNSTABLE";
|
|
689
|
-
} catch
|
|
887
|
+
} catch {
|
|
690
888
|
reply.frame?.fill(0);
|
|
691
889
|
reply = { value: {
|
|
692
890
|
...reply.value,
|
|
@@ -800,7 +998,9 @@ var ComputerRuntime = class {
|
|
|
800
998
|
});
|
|
801
999
|
const phase = command.op === "open" ? "open" : command.op === "act" ? "dispatch" : command.op === "observe" ? "observe" : command.op === "release" ? "release" : void 0;
|
|
802
1000
|
if (command.op === "observe") s.diagnostics?.count("observations");
|
|
1001
|
+
const startedAt = performance.now();
|
|
803
1002
|
const reply = s.diagnostics && phase ? await s.diagnostics.measure(phase, invoke) : await invoke();
|
|
1003
|
+
const endpointRoundTripMs = performance.now() - startedAt;
|
|
804
1004
|
const file = reply.content.find((item) => item.type === "file");
|
|
805
1005
|
let frame;
|
|
806
1006
|
if (file?.type === "file" && reply.invocationId) frame = this.endpoints.uploads.takeComputerFrame(file.fileId, reply.invocationId);
|
|
@@ -809,6 +1009,13 @@ var ComputerRuntime = class {
|
|
|
809
1009
|
const json = reply.content.find((item) => item.type === "json");
|
|
810
1010
|
const value = Reply.parse(json?.type === "json" ? json.value : void 0);
|
|
811
1011
|
if (value.sessionId !== s.id) throw new Error("COMPUTER_SESSION_MISMATCH");
|
|
1012
|
+
if (command.op === "act" && value.receipt?.actionId === command.envelope.actionId && (value.nativeMs || value.transportTiming)) s.diagnostics?.timing({
|
|
1013
|
+
actionId: value.receipt.actionId,
|
|
1014
|
+
kind: command.envelope.action.kind,
|
|
1015
|
+
nativeMs: value.nativeMs,
|
|
1016
|
+
transport: value.transportTiming,
|
|
1017
|
+
endpointRoundTripMs
|
|
1018
|
+
});
|
|
812
1019
|
if (file && !frame || value.observation && !frame && !value.errorCode) throw new Error("COMPUTER_FRAME_HANDOFF_FAILED");
|
|
813
1020
|
if (frame && (!value.observation || !["observe", "act"].includes(command.op))) throw new Error("COMPUTER_UNEXPECTED_FRAME");
|
|
814
1021
|
return {
|
|
@@ -827,14 +1034,18 @@ var ComputerRuntime = class {
|
|
|
827
1034
|
leaveComputerControl(s.owner);
|
|
828
1035
|
s.diagnostics.finish(true);
|
|
829
1036
|
this.retainReport(s.owner, s.diagnostics);
|
|
1037
|
+
clearComputerFrames(s.owner);
|
|
1038
|
+
s.programStore = void 0;
|
|
830
1039
|
s.task.clear();
|
|
831
1040
|
s.pendingContext = void 0;
|
|
832
1041
|
s.controller.abort();
|
|
833
1042
|
}
|
|
834
1043
|
async close(owner) {
|
|
835
1044
|
this.operations.get(owner)?.abort();
|
|
1045
|
+
clearComputerFrames(owner);
|
|
836
1046
|
const s = this.sessions.get(owner);
|
|
837
1047
|
if (!s) return true;
|
|
1048
|
+
s.programStore = void 0;
|
|
838
1049
|
s.task.clear();
|
|
839
1050
|
s.pendingContext = void 0;
|
|
840
1051
|
s.controller.abort();
|
|
@@ -1785,6 +1785,24 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
1785
1785
|
direct: "direct";
|
|
1786
1786
|
}>>;
|
|
1787
1787
|
adbPath: z.ZodOptional<z.ZodString>;
|
|
1788
|
+
autoGlmPrompt: z.ZodDefault<z.ZodEnum<{
|
|
1789
|
+
current: "current";
|
|
1790
|
+
upstream: "upstream";
|
|
1791
|
+
}>>;
|
|
1792
|
+
autoGlmProtocol: z.ZodDefault<z.ZodEnum<{
|
|
1793
|
+
current: "current";
|
|
1794
|
+
upstream: "upstream";
|
|
1795
|
+
}>>;
|
|
1796
|
+
autoGlmSampling: z.ZodDefault<z.ZodEnum<{
|
|
1797
|
+
current: "current";
|
|
1798
|
+
upstream: "upstream";
|
|
1799
|
+
}>>;
|
|
1800
|
+
modelResponseMode: z.ZodDefault<z.ZodEnum<{
|
|
1801
|
+
json: "json";
|
|
1802
|
+
stream: "stream";
|
|
1803
|
+
}>>;
|
|
1804
|
+
batchReadings: z.ZodDefault<z.ZodBoolean>;
|
|
1805
|
+
modelRepetitionGuard: z.ZodDefault<z.ZodBoolean>;
|
|
1788
1806
|
semanticControls: z.ZodDefault<z.ZodBoolean>;
|
|
1789
1807
|
hierarchicalPlanning: z.ZodDefault<z.ZodBoolean>;
|
|
1790
1808
|
maxActionsPerSession: z.ZodDefault<z.ZodNumber>;
|
|
@@ -3,8 +3,8 @@ import { init_agent_config } from "../agent-config/index.js";
|
|
|
3
3
|
import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
|
|
4
4
|
import { validatePhoneModelChange } from "../phone/model-adapter.js";
|
|
5
5
|
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
6
|
-
import { validateComputerModelChange } from "../computer/model-config.js";
|
|
7
6
|
import { GATEWAY_BUILTIN_TOOLS } from "./agent-builtin-tools.js";
|
|
7
|
+
import { validateComputerModelChange } from "../computer/model-config.js";
|
|
8
8
|
import { isDeepStrictEqual } from "node:util";
|
|
9
9
|
//#region src/gateway/global-defaults-admin.ts
|
|
10
10
|
init_agent_config();
|
|
@@ -326,6 +326,12 @@ export declare class GatewayConfigCoordinator {
|
|
|
326
326
|
phone: {
|
|
327
327
|
enabled: boolean;
|
|
328
328
|
executionMode: "collaborative" | "direct";
|
|
329
|
+
autoGlmPrompt: "current" | "upstream";
|
|
330
|
+
autoGlmProtocol: "current" | "upstream";
|
|
331
|
+
autoGlmSampling: "current" | "upstream";
|
|
332
|
+
modelResponseMode: "json" | "stream";
|
|
333
|
+
batchReadings: boolean;
|
|
334
|
+
modelRepetitionGuard: boolean;
|
|
329
335
|
semanticControls: boolean;
|
|
330
336
|
hierarchicalPlanning: boolean;
|
|
331
337
|
maxActionsPerSession: number;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { PhoneUiSession } from './ui-session.js';
|
|
2
|
+
import { type PhoneTextProvider } from './text-session.js';
|
|
1
3
|
import { type PhoneApplication, type PhoneTextInputStatus, type DiscoveredPhone, type PhoneAction, type PhoneElement, type PhoneObservation } from './contracts.js';
|
|
2
4
|
import { runAdb } from './adb-command.js';
|
|
3
5
|
export { runAdb } from './adb-command.js';
|
|
@@ -10,6 +12,7 @@ export interface PhoneDriver {
|
|
|
10
12
|
applications?(serial: string, signal: AbortSignal): Promise<PhoneApplication[]>;
|
|
11
13
|
textInputStatus?(serial: string, signal: AbortSignal): Promise<PhoneTextInputStatus>;
|
|
12
14
|
observe(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
15
|
+
releaseInput?(): Promise<void>;
|
|
13
16
|
capture?(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
14
17
|
observeForText?(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
15
18
|
execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
|
|
@@ -27,16 +30,27 @@ export declare class AdbPhoneDriver implements PhoneDriver {
|
|
|
27
30
|
private readonly readApplications?;
|
|
28
31
|
private readonly pasteText?;
|
|
29
32
|
private readonly readHierarchy?;
|
|
30
|
-
|
|
33
|
+
private readonly createTextProvider?;
|
|
34
|
+
private readonly createObserver?;
|
|
35
|
+
private observers;
|
|
36
|
+
private openingObservers;
|
|
37
|
+
private observerEpoch;
|
|
38
|
+
private observer;
|
|
39
|
+
private textSessions;
|
|
40
|
+
releaseInput(): Promise<void>;
|
|
41
|
+
private paste;
|
|
42
|
+
constructor(adbPath?: string, command?: typeof runAdb, useAndroidCli?: boolean, readApplications?: (signal: AbortSignal) => Promise<PhoneApplication[]>, pasteText?: (text: string, signal: AbortSignal) => Promise<void>, readHierarchy?: (signal: AbortSignal) => Promise<string>, createTextProvider?: (serial: string, failed: () => void) => Promise<PhoneTextProvider>, createObserver?: (signal: AbortSignal) => Promise<PhoneUiSession>);
|
|
31
43
|
textInputStatus(serial: string, signal: AbortSignal): Promise<PhoneTextInputStatus>;
|
|
32
44
|
discover(signal?: AbortSignal): Promise<DiscoveredPhone[]>;
|
|
33
45
|
applications(serial: string, signal: AbortSignal): Promise<PhoneApplication[]>;
|
|
34
46
|
foreground(serial: string, signal: AbortSignal): Promise<string>;
|
|
35
47
|
private shell;
|
|
36
48
|
observe(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
49
|
+
private hierarchy;
|
|
37
50
|
observeForText(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
38
51
|
/** Pixel capture avoids accessibility dumps on the human interaction path. */
|
|
39
52
|
capture(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
53
|
+
private captureRaw;
|
|
40
54
|
private confirmText;
|
|
41
55
|
execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
|
|
42
56
|
settleMs: number;
|