@xopcai/xopc 0.0.420 → 0.0.422
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-ext/dist/background.js +184 -2
- package/dist/browser-ext/dist/sidepanel.js +9 -0
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-DnqOM8GN.js → activity-store-CvJ9rdwP.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-1UABT2KS.js → agent-avatar-dicebear-CFP6g4w7.js} +1 -1
- package/dist/gateway/static/root/assets/agent-avatar-display-BHBe88Gu.js +2 -0
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DlGRuKMv.js +1 -0
- package/dist/gateway/static/root/assets/agent-plugin-dialog-C_Dm-u6_.js +1 -0
- package/dist/gateway/static/root/assets/{agents-O7mago-m.js → agents-BdVJHOiK.js} +5 -5
- package/dist/gateway/static/root/assets/{agents-admin-api-CyjykMEh.js → agents-admin-api-Do1Pza0R.js} +1 -1
- package/dist/gateway/static/root/assets/{api-Ddrs70xV.js → api-BQv5dLcH.js} +1 -1
- package/dist/gateway/static/root/assets/{api-C1dxxDZx.js → api-ONg37_fH.js} +1 -1
- package/dist/gateway/static/root/assets/app-link-1j40sJ-z.js +1 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-B4Wqhf4J.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-Dm1kRzKL.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-D1MMk1P7.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-n5lPr79c.js → archive-plugin-p_yLkyaC.js} +1 -1
- package/dist/gateway/static/root/assets/automation-api-DQaWBR03.js +1 -0
- package/dist/gateway/static/root/assets/automation-result-state-CO_243JM.js +1 -0
- package/dist/gateway/static/root/assets/automation-task-card-D2p9qlYE.js +3 -0
- package/dist/gateway/static/root/assets/{automations-page-oLsNzu_6.js → automations-page-Ba64H37d.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-BkzC3oIM.js +9 -0
- package/dist/gateway/static/root/assets/{binary-plugins-D9VW7dWP.js → binary-plugins-B-6kyqtt.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C477bTtO.js → block-editor-B5ysJ96n.js} +4 -4
- package/dist/gateway/static/root/assets/{browser-automation-inputs-CCiYXxmh.js → browser-automation-inputs-C2A3NIt3.js} +1 -1
- package/dist/gateway/static/root/assets/browser-automations-page-CnbXFw1_.js +3 -0
- package/dist/gateway/static/root/assets/{browser-control-api-Y3fvmeBk.js → browser-control-api-Aj_seKE9.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-DjkGahlz.js → browser-settings-page-C7fxPq_z.js} +2 -2
- package/dist/gateway/static/root/assets/{capabilities-DAyA681v.js → capabilities-BgtCwC_E.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-DRVXLssH.js → capabilities-DOTgaSgA.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-m3b9sLFG.js +2 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-pYWZtPeU.js +8 -0
- package/dist/gateway/static/root/assets/channels-DGpRM6pj.js +1 -0
- package/dist/gateway/static/root/assets/{chat-agents-api-D5nR_JVe.js → chat-agents-api-EvJ_Wvuc.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-chart-block-K2t333qv.js → chat-chart-block-BQDbHLcw.js} +1 -1
- package/dist/gateway/static/root/assets/chat-page-GF9NIuZN.js +72 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-CkFG6mA3.js → chat-terminal-dock-DHFTGoEp.js} +2 -2
- package/dist/gateway/static/root/assets/{list-filter-COkzTdOz.js → clipboard-copy-DuJk5WD6.js} +1 -1
- package/dist/gateway/static/root/assets/{command-palette-api-Do_66X1B.js → command-palette-api-DPA_yEuy.js} +1 -1
- package/dist/gateway/static/root/assets/composer-payload-handoff-BTjauSNp.js +1 -0
- package/dist/gateway/static/root/assets/{computer-settings-page-DBxOcMko.js → computer-settings-page-BFSSQfcx.js} +1 -1
- package/dist/gateway/static/root/assets/connected-providers-grid-DM2glQN3.js +1 -0
- package/dist/gateway/static/root/assets/{connector-service-page-rWpnchb3.js → connector-service-page-CFvg58qa.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-api-DIBG72k4.js → connectors-api-CbC6Yht5.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-D7pipFHA.js +1 -0
- package/dist/gateway/static/root/assets/date-picker-Dd3MbG0x.js +1 -0
- package/dist/gateway/static/root/assets/{dependency-picker-7SpSfDSg.js → dependency-picker-DcsHg2ml.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-DldzQT2h.js +1 -0
- package/dist/gateway/static/root/assets/desktop-pet-settings-CYdI4KxB.js +1 -0
- package/dist/gateway/static/root/assets/{dev-view-store-57HgVuZ6.js → dev-view-store-JiJv585f.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-D8cLc41G.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-D4jMhpka.js → directory-picker-path-field-8WOXv8zw.js} +1 -1
- package/dist/gateway/static/root/assets/discussion-annotation-sync-B-grSe0w.js +1 -0
- package/dist/gateway/static/root/assets/{dist-DNCdG_qB.js → dist-D3lWNSe7.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BsK2LMXQ.js → extension-debug-page-EEQkTNEu.js} +1 -1
- package/dist/gateway/static/root/assets/extension-iframe-host-vlZVeMCY.js +1 -0
- package/dist/gateway/static/root/assets/{extension-marketplace-api-CVJPqJOB.js → extension-marketplace-api-_o2In_al.js} +1 -1
- package/dist/gateway/static/root/assets/extension-page-CPrT111s.js +1 -0
- package/dist/gateway/static/root/assets/{extension-provider-Byrd8Sor.js → extension-provider-B2Mf3FBu.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CznJEgWV.js +1 -0
- package/dist/gateway/static/root/assets/{file-preview-surface-BlprUrIs.js → file-preview-surface-7h8_fZul.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BAmUhiP1.js → gateway-config-swr-DbbNEOKj.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-CsykKL4l.js → gateway-realtime-D20ZrAuM.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-C6sMzYDT.js +1 -0
- package/dist/gateway/static/root/assets/gateway-restart-5ut-lhJm.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-BA5-Uuwx.js → gateway-settings-BCf_cibp.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CtUB3g6N.js → gateway-startup-retry-DlHL0DpH.js} +1 -1
- package/dist/gateway/static/root/assets/{global-defaults-api-CINf-C6a.js → global-defaults-api-CmODomcV.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-uz22TRB-.js +2 -0
- package/dist/gateway/static/root/assets/image-generation-api-dzPnpUFu.js +1 -0
- package/dist/gateway/static/root/assets/{imports-page-BWShtGRQ.js → imports-page-ChBoNMyE.js} +1 -1
- package/dist/gateway/static/root/assets/index-CSIg7V1A.js +11 -0
- package/dist/gateway/static/root/assets/index-Dv8mUlNN.css +1 -0
- package/dist/gateway/static/root/assets/install-connector-dialog-CNcdQDX0.js +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CdM4BQwp.js → keyboard-shortcuts-settings-CRbYq2_g.js} +1 -1
- package/dist/gateway/static/root/assets/list-filter-CIPvpfLA.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-04cX5TJu.js +1 -0
- package/dist/gateway/static/root/assets/{local-apps-page-CxyRVfjD.js → local-apps-page-fWM0FEhN.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-B9ZPwotC.js → local-session-drafts-ClrSe5mH.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-lIXD1FMw.js → locale-store-VNjH18Dj.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-6GanGLrm.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-BxD_lc4E.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-CJt-i2Dp.js → markdown-view-DLCBYWtx.js} +4 -4
- package/dist/gateway/static/root/assets/{media-plugins-D_bR23mA.js → media-plugins-BvtNwKFb.js} +1 -1
- package/dist/gateway/static/root/assets/messages-Btr7C0hF.js +3 -0
- package/dist/gateway/static/root/assets/model-selector-DYUnp917.js +1 -0
- package/dist/gateway/static/root/assets/{models-hub-cache-za2fWJLg.js → models-hub-cache-_qE7L-_H.js} +1 -1
- package/dist/gateway/static/root/assets/navigation-D62kPsA9.js +1 -0
- package/dist/gateway/static/root/assets/note-detail-panel-bjRZesmS.js +5 -0
- package/dist/gateway/static/root/assets/note-image-lightbox-D7Jqb75C.js +1 -0
- package/dist/gateway/static/root/assets/{notes-api-C_458rv5.js → notes-api-Bxa11X3a.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-D2QpJ3WZ.js +8 -0
- package/dist/gateway/static/root/assets/{oauth-api-C3X9FLYw.js → oauth-api-DIE4UpP7.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-provider-connect-H81se_3n.js → oauth-provider-connect-B95tiddN.js} +1 -1
- package/dist/gateway/static/root/assets/open-capability-settings-Cvb65hQB.js +1 -0
- package/dist/gateway/static/root/assets/{page-context-capture-button-BkAlQ7cB.js → page-context-capture-button-C-QbbwmN.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-draft-ClLgaOaD.js → page-context-draft-BHmOfksL.js} +1 -1
- package/dist/gateway/static/root/assets/page-header-store-bPV8_tKL.js +1 -0
- package/dist/gateway/static/root/assets/{personal-avatar-BLtHt8fV.js → personal-avatar-nXrmMfrV.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-BCwlYT3F.js +1 -0
- package/dist/gateway/static/root/assets/personal-settings-panel-vkYmXK8h.js +1 -0
- package/dist/gateway/static/root/assets/{phone-dependencies-card-DISHarj8.js → phone-dependencies-card-CZDAxTWv.js} +1 -1
- package/dist/gateway/static/root/assets/phone-model-picker-4Snfs8Hq.js +1 -0
- package/dist/gateway/static/root/assets/phone-settings-page-D8HperfA.js +1 -0
- package/dist/gateway/static/root/assets/{phone-workspace-store-fhnZrgy_.js → phone-workspace-store-Di9R9Ux5.js} +1 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-DJsDu-_8.js +1 -0
- package/dist/gateway/static/root/assets/popover-select-DD8fmrxH.js +1 -0
- package/dist/gateway/static/root/assets/preference-select-fields-C6abaM3k.js +1 -0
- package/dist/gateway/static/root/assets/product-automation-feedback-C74s9Mjz.js +7 -0
- package/dist/gateway/static/root/assets/product-delivery-DRyD9_Xq.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-xn9G4hSI.js → product-open-page-AbDP5w1c.js} +1 -1
- package/dist/gateway/static/root/assets/product-preview-content-CktjvFbc.js +1 -0
- package/dist/gateway/static/root/assets/product-preview-modal-CzsqLwB4.js +2 -0
- package/dist/gateway/static/root/assets/project-detail-page-Cf3tggGP.js +7 -0
- package/dist/gateway/static/root/assets/project-understanding-jmhFbHch.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-jMgZiFnO.js +1 -0
- package/dist/gateway/static/root/assets/{providers-api-CzVkFKFg.js → providers-api-CJBYFKAK.js} +1 -1
- package/dist/gateway/static/root/assets/{recording-upload-0jxahBMo.js → recording-upload-Dl9a5yOV.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-n8TwtJ_j.js → registry-api-BwkbPUYu.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-cZpBi4Rk.js → remote-access-hub-CBQ_bOy9.js} +1 -1
- package/dist/gateway/static/root/assets/resource-unavailable-35wBZxmz.js +1 -0
- package/dist/gateway/static/root/assets/route-preload-BcA6SPeC.js +2 -0
- package/dist/gateway/static/root/assets/runtime-impact-DbySfhdp.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-D-8KjYK6.js → runtime-tools-api-BF28JDAO.js} +1 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bq2xQ2qd.js +1 -0
- package/dist/gateway/static/root/assets/schema-form-BKeP5G7b.js +1 -0
- package/dist/gateway/static/root/assets/service-recommendation-list-CdaS4MPF.js +1 -0
- package/dist/gateway/static/root/assets/{session-api-CsCoI2im.js → session-api-zJXYlRPt.js} +1 -1
- package/dist/gateway/static/root/assets/session-manager-wWxpzSo0.js +23 -0
- package/dist/gateway/static/root/assets/sessions-page-BkjD_dUD.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BUMCEtA_.js +1 -0
- package/dist/gateway/static/root/assets/{settings-advanced-section-BqoVSko2.js → settings-advanced-section-C84IghdL.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-mode-store-CBsJ-Qg2.js → settings-mode-store-CtQBJvbO.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DROUGyJl.js → settings-page-eEIz9InP.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-header-Bv-kQFTm.js → settings-page-header-CsPAYlqV.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-DHP6MrrL.js → settings-page-layout-lPLeJQoV.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BSU5WpaE.js +1 -0
- package/dist/gateway/static/root/assets/{share-link-dialog-BJHRQVKC.js → share-link-dialog-NaM6jvIz.js} +1 -1
- package/dist/gateway/static/root/assets/share-preview-page-CHjZn27s.js +2 -0
- package/dist/gateway/static/root/assets/{shares-api-rtWVHA_d.js → shares-api-B9rVcV1y.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-5sB15V5v.js +1 -0
- package/dist/gateway/static/root/assets/skill-api-D6zVfEuK.js +1 -0
- package/dist/gateway/static/root/assets/{skill-list-api-BzlKXPsE.js → skill-list-api-SLmTBYF5.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-Cff2GgZb.js → skill-reload-api-UQkq2orI.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-Ca0pYZ4i.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BeQeUUMH.js → system-settings-panel-BARWbjRN.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-roqAsGue.js +2 -0
- package/dist/gateway/static/root/assets/task-result-evidence-Bb1F7nAM.js +1 -0
- package/dist/gateway/static/root/assets/{terminal-panel-store-5Fzctajw.js → terminal-panel-store-DYDeXXAg.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-DW45fWYQ.js → theme-store-DbStcH89.js} +1 -1
- package/dist/gateway/static/root/assets/tracing-settings-page-YfkNCxbP.js +1 -0
- package/dist/gateway/static/root/assets/tunnel-api-BK_ivyIb.js +1 -0
- package/dist/gateway/static/root/assets/{understanding-activity-store-CTe6TFB0.js → understanding-activity-store-p7Z7oq8z.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-refresh-store-mE9OKG6q.js → understanding-refresh-store-D-U6rcwZ.js} +1 -1
- package/dist/gateway/static/root/assets/usage-page-URFSiswS.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-Cs2Ga_Y_.js → use-autosave-B7cbumro.js} +1 -1
- package/dist/gateway/static/root/assets/use-composer-attachments-DAtiwLsE.js +2 -0
- package/dist/gateway/static/root/assets/use-file-preview-expanded-B8erpWsX.js +2 -0
- package/dist/gateway/static/root/assets/{use-personal-profile-BHL2AxWU.js → use-personal-profile-DDW29nm-.js} +1 -1
- package/dist/gateway/static/root/assets/{use-workspace-tree-CnmPZrpx.js → use-workspace-tree-DCoTf22f.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-DSV5NkNj.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-3gyc2UV3.js → voice-api-key-field-DzYdJZN4.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-Cda2uBIC.js → voice-config-api-wotvT6Hw.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-input-shortcut-events-DtYHsPLF.js → voice-input-shortcut-events-BI6PuiIB.js} +1 -1
- package/dist/gateway/static/root/assets/voice-transcribe-api-DAK9eLRr.js +1 -0
- package/dist/gateway/static/root/assets/{work-discovery-overlay-Dqu5CQCS.js → work-discovery-overlay-BzmB9Rub.js} +1 -1
- package/dist/gateway/static/root/assets/work-discovery-page-CmGjxUIT.js +1 -0
- package/dist/gateway/static/root/assets/{working-directory-picker-modal-DHl2cZY1.js → working-directory-picker-modal-B-EHm52-.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-CtDbI6T7.js → workspace-api-uhiEMPpK.js} +2 -2
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-DrPVyikA.js +1 -0
- package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-CTIbUfKb.js → workspace-file-preview-dialog-BDm06MZm.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-open-location-menu-BwxouqdZ.js → workspace-open-location-menu-Bv83uoqu.js} +1 -1
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CFb-23rS.js → xopc-cloud-account-card-Cd5GdpGL.js} +1 -1
- package/dist/gateway/static/root/index.html +91 -86
- package/dist/gateway/static/root/notification-sw.js +21 -7
- package/dist/package.js +1 -1
- package/dist/packages/endpoint-tools-protocol/src/context.js +115 -0
- package/dist/packages/endpoint-tools-protocol/src/index.js +4 -0
- package/dist/packages/endpoint-tools-protocol/src/location-sharing.js +51 -0
- package/dist/packages/gateway-contract/src/gateway-scopes.js +5 -1
- package/dist/packages/gateway-contract/src/index.js +4 -0
- package/dist/packages/gateway-contract/src/phone-workspace.js +6 -0
- package/dist/packages/gateway-contract/src/product-delivery.js +9 -3
- package/dist/packages/gateway-contract/src/task-display.js +14 -0
- package/dist/src/agent/agent-manager.js +1 -1
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/context/execution-scope.js +10 -5
- package/dist/src/agent/embedded/external-tool-discovery.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +2 -2
- package/dist/src/agent/embedded/run-turn.js +72 -9
- package/dist/src/agent/embedded/session-runner.js +2 -1
- package/dist/src/agent/embedded/types.d.ts +1 -1
- package/dist/src/agent/external-tools/cliProvider.js +2 -2
- package/dist/src/agent/external-tools/composio-provider.js +2 -2
- package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
- package/dist/src/agent/prompt/system-prompt.js +1 -0
- package/dist/src/agent/service/direct-turn-helpers.d.ts +0 -7
- package/dist/src/agent/service/direct-turn-helpers.js +3 -2
- package/dist/src/agent/service/process-direct-streaming.js +2 -1
- package/dist/src/agent/service.js +1 -1
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/source-context/device-environment.d.ts +3 -0
- package/dist/src/agent/source-context/device-environment.js +38 -0
- package/dist/src/agent/source-context/injector.js +2 -1
- package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
- package/dist/src/agent/tool-manuals/phone.js +1 -1
- package/dist/src/agent/tools/automation-tool.d.ts +2 -1
- package/dist/src/agent/tools/automation-tool.js +13 -5
- package/dist/src/agent/tools/factory.js +2 -1
- package/dist/src/agent/tools/personal-read-tool.js +2 -2
- package/dist/src/agent/tools/personal-task-tool.js +2 -1
- package/dist/src/agent/tools/phone-use-tool.js +46 -2
- package/dist/src/agent/tools/xopc-use-tool.js +8 -5
- package/dist/src/agent-catalog/capabilities.js +2 -2
- package/dist/src/agent-catalog/repository.js +1 -1
- package/dist/src/automations/api/routes.js +38 -0
- package/dist/src/automations/capabilities/drafts.js +1 -1
- package/dist/src/automations/capabilities/write.js +25 -9
- package/dist/src/automations/configuration-conversation.d.ts +16 -0
- package/dist/src/automations/configuration-conversation.js +120 -0
- package/dist/src/automations/delivery/delivery-router.d.ts +2 -0
- package/dist/src/automations/delivery/delivery-router.js +30 -9
- package/dist/src/automations/domain/types.d.ts +1 -0
- package/dist/src/automations/index.js +5 -5
- package/dist/src/automations/service/action-executor.js +41 -12
- package/dist/src/automations/service/automation-service.d.ts +6 -0
- package/dist/src/automations/service/automation-service.js +47 -12
- package/dist/src/automations/service/index.js +2 -2
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/capabilities/runtime/dispatcher.js +1 -1
- package/dist/src/capabilities/runtime/product.js +1 -1
- package/dist/src/cli/commands/agents.js +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/onboard/model.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +1 -1
- package/dist/src/computer/broker.js +16 -3
- package/dist/src/computer/diagnostics.js +1 -1
- package/dist/src/computer/errors.js +4 -0
- package/dist/src/computer/runtime.d.ts +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/schema.d.ts +1 -0
- package/dist/src/endpoint-tools/context-store.d.ts +29 -0
- package/dist/src/endpoint-tools/context-store.js +138 -0
- package/dist/src/endpoint-tools/location-sharing.d.ts +42 -0
- package/dist/src/endpoint-tools/location-sharing.js +203 -0
- package/dist/src/endpoint-tools/runtime.d.ts +4 -0
- package/dist/src/endpoint-tools/runtime.js +8 -0
- package/dist/src/endpoint-tools/turn-context.d.ts +2 -1
- package/dist/src/endpoint-tools/turn-context.js +4 -2
- package/dist/src/execution-environments/local-worktree-manager.js +1 -1
- package/dist/src/extensions/agent-plugins/skill-catalog.js +1 -1
- package/dist/src/extensions/agent-plugins/validation.js +1 -1
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/automation-completion-delivery.d.ts +4 -0
- package/dist/src/gateway/automation-completion-delivery.js +14 -0
- package/dist/src/gateway/global-defaults-admin.js +1 -1
- package/dist/src/gateway/hono/middleware/auth.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/devices.js +1 -0
- package/dist/src/gateway/hono/routes/endpoint-compatibility.js +4 -0
- package/dist/src/gateway/hono/routes/endpoint-environment.d.ts +3 -0
- package/dist/src/gateway/hono/routes/endpoint-environment.js +98 -0
- package/dist/src/gateway/hono/routes/endpoint-tools.js +1 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js +16 -0
- package/dist/src/gateway/hono/routes/location-sharing.d.ts +3 -0
- package/dist/src/gateway/hono/routes/location-sharing.js +164 -0
- package/dist/src/gateway/hono/routes/notes.js +2 -2
- package/dist/src/gateway/hono/routes/phone-setup.js +1 -1
- package/dist/src/gateway/hono/routes/phone.js +246 -34
- package/dist/src/gateway/hono/routes/projects.js +2 -2
- package/dist/src/gateway/hono/routes/session-command-handler.js +1 -1
- package/dist/src/gateway/hono/routes/session-input-handler.js +3 -2
- package/dist/src/gateway/hono/routes/tasks.js +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +10 -0
- package/dist/src/gateway/image-generation-setup.js +1 -1
- package/dist/src/gateway/respawn.js +2 -1
- package/dist/src/gateway/security/gateway-scopes.js +6 -0
- package/dist/src/gateway/security/phone-access.d.ts +4 -0
- package/dist/src/gateway/security/phone-access.js +20 -0
- package/dist/src/gateway/service/agent-runner.js +3 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +2 -1
- package/dist/src/gateway/service/session-input-coordinator.d.ts +3 -0
- package/dist/src/gateway/service/session-input-coordinator.js +50 -2
- package/dist/src/gateway/service.d.ts +1 -0
- package/dist/src/gateway/service.js +12 -4
- package/dist/src/gateway/session-reset-service.js +4 -0
- package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
- package/dist/src/imports/importService.js +1 -1
- package/dist/src/local-apps/service.js +1 -1
- package/dist/src/notifications/planner.js +6 -6
- package/dist/src/observability/store.d.ts +9 -0
- package/dist/src/observability/store.js +77 -32
- package/dist/src/personal-agent/communication.d.ts +1 -1
- package/dist/src/personal-agent/communication.js +3 -6
- package/dist/src/personal-agent/request-service.js +2 -1
- package/dist/src/personal-agent/service.js +1 -1
- package/dist/src/phone/assistance-service.d.ts +6 -0
- package/dist/src/phone/assistance-service.js +32 -0
- package/dist/src/phone/assistance.d.ts +40 -0
- package/dist/src/phone/assistance.js +273 -0
- package/dist/src/phone/cloud-phones.d.ts +5 -0
- package/dist/src/phone/cloud-phones.js +14 -0
- package/dist/src/phone/contracts.d.ts +7 -1
- package/dist/src/phone/contracts.js +5 -0
- package/dist/src/phone/environment-adapter.d.ts +3 -0
- package/dist/src/phone/environment-adapter.js +11 -0
- package/dist/src/phone/location-baseline-store.d.ts +9 -0
- package/dist/src/phone/location-baseline-store.js +61 -0
- package/dist/src/phone/location-environment.d.ts +61 -0
- package/dist/src/phone/location-environment.js +157 -0
- package/dist/src/phone/model-adapter.js +16 -5
- package/dist/src/phone/runtime.d.ts +17 -2
- package/dist/src/phone/runtime.js +203 -20
- package/dist/src/phone/stream-gateway.d.ts +5 -0
- package/dist/src/phone/stream-gateway.js +85 -51
- package/dist/src/phone/wuying-location.d.ts +18 -0
- package/dist/src/phone/wuying-location.js +86 -0
- package/dist/src/runtime-tools/archive.js +1 -1
- package/dist/src/storage/sqlite/device-access-repository.d.ts +4 -0
- package/dist/src/storage/sqlite/device-access-repository.js +18 -1
- package/dist/src/tasks/capabilities/read.js +2 -2
- package/dist/src/tasks/capabilities/write.js +1 -1
- package/dist/src/tasks/task-contract-planner.js +2 -1
- package/dist/src/tui/backends/embedded-backend.js +1 -1
- package/dist/src/tunnel/broker-client.d.ts +8 -0
- package/dist/src/tunnel/broker-client.js +18 -1
- package/dist/src/voice/realtime/persona-context.js +1 -1
- package/dist/src/voice/realtime/runtime.js +1 -1
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/agent-avatar-display-Cy50vjbq.js +0 -2
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-V4NX_cWz.js +0 -1
- package/dist/gateway/static/root/assets/agent-plugin-dialog-CQ5LLDMO.js +0 -1
- package/dist/gateway/static/root/assets/app-link-CytZ5zkp.js +0 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-C1Zs-eha.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-lIfGokbz.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-CUvtsRYD.js +0 -1
- package/dist/gateway/static/root/assets/automation-api-Bld8blNl.js +0 -1
- package/dist/gateway/static/root/assets/automation-display-BcfZOQTC.js +0 -2
- package/dist/gateway/static/root/assets/automations-workspace-BgtYY2Mm.js +0 -8
- package/dist/gateway/static/root/assets/browser-automations-page-DIUNY94X.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-page-DFW4Y0x8.js +0 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-uOHSMQPZ.js +0 -8
- package/dist/gateway/static/root/assets/channels-D2a69dSt.js +0 -1
- package/dist/gateway/static/root/assets/chat-page-CG38tCHE.js +0 -71
- package/dist/gateway/static/root/assets/composer-payload-handoff-BU3B-C26.js +0 -1
- package/dist/gateway/static/root/assets/connected-providers-grid-Dmnu2zle.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DT_WrC1y.js +0 -1
- package/dist/gateway/static/root/assets/date-picker-CE-cZFCU.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-lorocS9j.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-CEcohlZq.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-CLCPuf4R.js +0 -1
- package/dist/gateway/static/root/assets/discussion-annotation-sync-BKjf9gWe.js +0 -1
- package/dist/gateway/static/root/assets/extension-iframe-host-Dhkk5JV2.js +0 -1
- package/dist/gateway/static/root/assets/extension-page-Brps2XDP.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CHY68DpG.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-DQqMBruB.js +0 -1
- package/dist/gateway/static/root/assets/gateway-restart-Ch128Lrr.js +0 -1
- package/dist/gateway/static/root/assets/home-page-DaMFBYo1.js +0 -2
- package/dist/gateway/static/root/assets/image-generation-api-I_JgLL_m.js +0 -1
- package/dist/gateway/static/root/assets/index-DY2Y83b9.css +0 -1
- package/dist/gateway/static/root/assets/index-UCOlAnf-.js +0 -11
- package/dist/gateway/static/root/assets/install-connector-dialog-DU1Tz7B3.js +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-qPflPuQD.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-CbY1N-zi.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-Diy12JfQ.js +0 -1
- package/dist/gateway/static/root/assets/messages-DRR9N3HC.js +0 -3
- package/dist/gateway/static/root/assets/model-selector-DCYA_ntf.js +0 -1
- package/dist/gateway/static/root/assets/navigation-BkjnOw30.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-DBs1yHLy.js +0 -5
- package/dist/gateway/static/root/assets/note-image-lightbox-CivkB6LB.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-DL3c-41a.js +0 -8
- package/dist/gateway/static/root/assets/page-header-store-DH8K0xii.js +0 -1
- package/dist/gateway/static/root/assets/personal-page-B5DP3lO-.js +0 -1
- package/dist/gateway/static/root/assets/personal-settings-panel-DjDc5Kaz.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-picker-u8YIQCgo.js +0 -1
- package/dist/gateway/static/root/assets/phone-settings-page-el3pT0PD.js +0 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-CTBs1Jde.js +0 -1
- package/dist/gateway/static/root/assets/popover-select-DniHw2dy.js +0 -1
- package/dist/gateway/static/root/assets/preference-select-fields-D7oluyHN.js +0 -1
- package/dist/gateway/static/root/assets/product-automation-feedback-DsUSqCOX.js +0 -7
- package/dist/gateway/static/root/assets/product-delivery-BU_H84jL.js +0 -1
- package/dist/gateway/static/root/assets/product-preview-content-DcoK-iZe.js +0 -1
- package/dist/gateway/static/root/assets/product-preview-modal-Ruw9WSKK.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-BKvWLiMw.js +0 -7
- package/dist/gateway/static/root/assets/project-understanding-BCQr0AZ_.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-D4g7bB7X.js +0 -1
- package/dist/gateway/static/root/assets/route-preload-B5UiReO7.js +0 -2
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-MKlLFuow.js +0 -1
- package/dist/gateway/static/root/assets/schema-form-v4N4lawq.js +0 -1
- package/dist/gateway/static/root/assets/service-recommendation-list-B1xuVT3N.js +0 -1
- package/dist/gateway/static/root/assets/session-manager-5l9q0cd5.js +0 -16
- package/dist/gateway/static/root/assets/sessions-page-DsLw2aMD.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-B5lQeVNi.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-MJE3B_LX.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-Bsrv_zOQ.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-CfIRv4uX.js +0 -1
- package/dist/gateway/static/root/assets/skill-api-B_W1K3sv.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DtBloYeU.js +0 -2
- package/dist/gateway/static/root/assets/task-detail-page-Drrv-Hp0.js +0 -2
- package/dist/gateway/static/root/assets/task-result-evidence-D1Kyskm_.js +0 -1
- package/dist/gateway/static/root/assets/tracing-settings-page-B12u5D9A.js +0 -1
- package/dist/gateway/static/root/assets/tunnel-api-DGO56LQU.js +0 -1
- package/dist/gateway/static/root/assets/usage-page-Ud2U9UG1.js +0 -1
- package/dist/gateway/static/root/assets/use-composer-attachments-BCbMj-MN.js +0 -2
- package/dist/gateway/static/root/assets/use-file-preview-expanded-DSpCRXUW.js +0 -2
- package/dist/gateway/static/root/assets/user-model-page-p5iPfnwl.js +0 -2
- package/dist/gateway/static/root/assets/voice-transcribe-api-TInEfIYo.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-p-8ciZ0i.js +0 -1
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-B94Q2nN8.js +0 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { init_connection, isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
|
|
2
|
+
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
3
|
+
import { init_session_instance_repository, readCurrentTranscriptId } from "../storage/sqlite/session-instance-repository.js";
|
|
4
|
+
import { findSessionInputByRunId, getSessionInputById, init_session_input_repository, insertSessionInput } from "../storage/sqlite/session-input-repository.js";
|
|
5
|
+
import { TaskRunRepository, init_task_run_repository } from "../tasks/task-run-repository.js";
|
|
6
|
+
import { PhoneError, init_contracts } from "./contracts.js";
|
|
7
|
+
import { DurableState } from "../storage/sqlite/durable-state.js";
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
//#region src/phone/assistance.ts
|
|
10
|
+
init_connection();
|
|
11
|
+
init_transaction();
|
|
12
|
+
init_session_instance_repository();
|
|
13
|
+
init_session_input_repository();
|
|
14
|
+
init_contracts();
|
|
15
|
+
init_task_run_repository();
|
|
16
|
+
const waits = new DurableState("phone.assistance");
|
|
17
|
+
function markTaskWaiting(wait) {
|
|
18
|
+
if (!wait.taskRunId) return;
|
|
19
|
+
const runs = new TaskRunRepository();
|
|
20
|
+
const run = runs.get(wait.taskRunId);
|
|
21
|
+
if (run?.status !== "running") return;
|
|
22
|
+
if (!runs.listActiveWaits(run.taskId).some((item) => item.taskRunId === run.id && item.condition.phoneTaskId === wait.checkpoint.task.taskId)) runs.createWait({
|
|
23
|
+
taskId: run.taskId,
|
|
24
|
+
taskRunId: run.id,
|
|
25
|
+
kind: "user_input",
|
|
26
|
+
reason: "Phone requires manual operation",
|
|
27
|
+
condition: {
|
|
28
|
+
phoneAssistanceId: wait.id,
|
|
29
|
+
phoneTaskId: wait.checkpoint.task.taskId
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
runs.setStatus({
|
|
33
|
+
runId: run.id,
|
|
34
|
+
expectedVersion: run.version,
|
|
35
|
+
from: ["running"],
|
|
36
|
+
to: "waiting",
|
|
37
|
+
actor: { kind: "system" }
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function phoneAssistance(conversationId) {
|
|
41
|
+
if (!isXopcDatabaseOpen()) return void 0;
|
|
42
|
+
const wait = waits.get(conversationId);
|
|
43
|
+
if (wait && readCurrentTranscriptId(getSqliteDatabase(), conversationId) !== wait.transcriptId) {
|
|
44
|
+
waits.delete(conversationId);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
return wait;
|
|
48
|
+
}
|
|
49
|
+
function pendingPhoneAssistance() {
|
|
50
|
+
return isXopcDatabaseOpen() ? waits.values().filter((wait) => ["open", "queued"].includes(wait.status) && phoneAssistance(wait.conversationId)?.id === wait.id) : [];
|
|
51
|
+
}
|
|
52
|
+
function isPhoneAssistanceSuspended(conversationId, runId) {
|
|
53
|
+
return phoneAssistance(conversationId)?.originRunId === runId;
|
|
54
|
+
}
|
|
55
|
+
function requirePhoneAssistance(conversationId, runId, toolCallId, checkpoint) {
|
|
56
|
+
return runSqliteWriteTransaction((db) => {
|
|
57
|
+
const transcriptId = readCurrentTranscriptId(db, conversationId);
|
|
58
|
+
if (!transcriptId) throw new PhoneError("PHONE_CONVERSATION_NOT_FOUND", "Phone assistance requires a saved conversation", 409);
|
|
59
|
+
const current = phoneAssistance(conversationId);
|
|
60
|
+
if (current?.originRunId === runId && current.toolCallId === toolCallId) return current;
|
|
61
|
+
const origin = findSessionInputByRunId(conversationId, runId);
|
|
62
|
+
const wait = {
|
|
63
|
+
id: randomUUID(),
|
|
64
|
+
conversationId,
|
|
65
|
+
transcriptId,
|
|
66
|
+
originRunId: runId,
|
|
67
|
+
toolCallId,
|
|
68
|
+
checkpoint,
|
|
69
|
+
status: "open",
|
|
70
|
+
version: 1,
|
|
71
|
+
createdAt: Date.now(),
|
|
72
|
+
taskRunId: origin?.taskRunId,
|
|
73
|
+
objectiveInputId: current?.queuedInputId === origin?.id ? current?.objectiveInputId : origin?.id
|
|
74
|
+
};
|
|
75
|
+
markTaskWaiting(wait);
|
|
76
|
+
waits.set(conversationId, wait);
|
|
77
|
+
return wait;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function cancelPhoneAssistance(conversationId) {
|
|
81
|
+
if (!isXopcDatabaseOpen()) return;
|
|
82
|
+
runSqliteWriteTransaction(() => {
|
|
83
|
+
const wait = isXopcDatabaseOpen() ? waits.get(conversationId) : void 0;
|
|
84
|
+
if (!wait) return;
|
|
85
|
+
if (wait.taskRunId && [
|
|
86
|
+
"open",
|
|
87
|
+
"queued",
|
|
88
|
+
"resuming"
|
|
89
|
+
].includes(wait.status)) {
|
|
90
|
+
const runs = new TaskRunRepository();
|
|
91
|
+
const run = runs.get(wait.taskRunId);
|
|
92
|
+
if (run && [
|
|
93
|
+
"queued",
|
|
94
|
+
"running",
|
|
95
|
+
"waiting",
|
|
96
|
+
"verifying"
|
|
97
|
+
].includes(run.status)) {
|
|
98
|
+
for (const item of runs.listActiveWaits(run.taskId)) if (item.condition.phoneTaskId === wait.checkpoint.task.taskId) runs.resolveWait({
|
|
99
|
+
waitId: item.id,
|
|
100
|
+
actor: { kind: "user" },
|
|
101
|
+
resolution: { cancelled: true }
|
|
102
|
+
});
|
|
103
|
+
runs.finalize({
|
|
104
|
+
runId: run.id,
|
|
105
|
+
expectedVersion: run.version,
|
|
106
|
+
actor: { kind: "user" },
|
|
107
|
+
terminalCode: "cancelled_by_user",
|
|
108
|
+
receipt: {
|
|
109
|
+
status: "cancelled",
|
|
110
|
+
summary: "Phone task cancelled",
|
|
111
|
+
changes: [],
|
|
112
|
+
evidence: [],
|
|
113
|
+
verification: {
|
|
114
|
+
status: "unverified",
|
|
115
|
+
checks: []
|
|
116
|
+
},
|
|
117
|
+
remainingWork: [],
|
|
118
|
+
needsUser: false,
|
|
119
|
+
completionVerdict: "not_achieved"
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
waits.set(conversationId, {
|
|
125
|
+
...wait,
|
|
126
|
+
status: "cancelled",
|
|
127
|
+
version: wait.version + 1
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/** The wait and its deduplicated continuation commit together, even while the old run is closing. */
|
|
132
|
+
function queuePhoneAssistance(conversationId, waitId) {
|
|
133
|
+
return runSqliteWriteTransaction(() => {
|
|
134
|
+
const wait = phoneAssistance(conversationId);
|
|
135
|
+
if (!wait || wait.id !== waitId || wait.status === "cancelled") throw new PhoneError("PHONE_ASSISTANCE_CHANGED", "The phone task changed. Refresh before continuing.", 409);
|
|
136
|
+
if (wait.status !== "open") return wait;
|
|
137
|
+
const original = (wait.objectiveInputId ? getSessionInputById(conversationId, wait.objectiveInputId) : void 0) ?? findSessionInputByRunId(conversationId, wait.originRunId);
|
|
138
|
+
const input = insertSessionInput({
|
|
139
|
+
id: randomUUID(),
|
|
140
|
+
conversationId,
|
|
141
|
+
expectedTranscriptId: wait.transcriptId,
|
|
142
|
+
clientMessageId: `phone-assistance:${wait.id}`,
|
|
143
|
+
requestedDelivery: "next",
|
|
144
|
+
effectiveDelivery: "next",
|
|
145
|
+
status: "queued",
|
|
146
|
+
content: `用户已完成手机上的人工操作,请继续原任务。原请求时间:${new Date(original?.createdAtMs ?? wait.createdAt).toISOString()};原目标:${original?.content ?? wait.checkpoint.task.goal}。相对日期沿用原请求时间。先观察当前页面,不重复已完成操作,沿用 taskId 和剩余预算。手机片段:${JSON.stringify(wait.checkpoint.task)}`,
|
|
147
|
+
origin: {
|
|
148
|
+
type: "system",
|
|
149
|
+
source: "internal"
|
|
150
|
+
},
|
|
151
|
+
thinking: original?.thinking,
|
|
152
|
+
taskRunId: original?.taskRunId,
|
|
153
|
+
contextRefs: original?.contextRefs,
|
|
154
|
+
contextSnapshots: original?.contextSnapshots
|
|
155
|
+
});
|
|
156
|
+
if (input.origin.type !== "system" || input.origin.source !== "internal" || input.status !== "queued") throw new PhoneError("PHONE_ASSISTANCE_CHANGED", "The continuation request changed. Refresh before continuing.", 409);
|
|
157
|
+
const next = {
|
|
158
|
+
...wait,
|
|
159
|
+
status: "queued",
|
|
160
|
+
queuedInputId: input.id,
|
|
161
|
+
version: wait.version + 1
|
|
162
|
+
};
|
|
163
|
+
waits.set(conversationId, next);
|
|
164
|
+
return next;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function consumePhoneAssistance(input) {
|
|
168
|
+
if (!input.clientMessageId.startsWith("phone-assistance:")) return true;
|
|
169
|
+
return runSqliteWriteTransaction(() => {
|
|
170
|
+
const wait = phoneAssistance(input.conversationId);
|
|
171
|
+
if (!wait || wait.queuedInputId !== input.id || wait.status !== "queued" || input.origin.type !== "system" || input.origin.source !== "internal") return false;
|
|
172
|
+
if (wait.taskRunId) {
|
|
173
|
+
const runs = new TaskRunRepository();
|
|
174
|
+
const run = runs.get(wait.taskRunId);
|
|
175
|
+
if (!run || run.status !== "waiting") return false;
|
|
176
|
+
const active = runs.listActiveWaits(run.taskId).filter((item) => item.taskRunId === run.id);
|
|
177
|
+
if (active.some((item) => item.condition.phoneTaskId !== wait.checkpoint.task.taskId)) return false;
|
|
178
|
+
for (const item of active) runs.resolveWait({
|
|
179
|
+
waitId: item.id,
|
|
180
|
+
actor: { kind: "system" },
|
|
181
|
+
resolution: { phoneAssistanceId: wait.id }
|
|
182
|
+
});
|
|
183
|
+
runs.setStatus({
|
|
184
|
+
runId: run.id,
|
|
185
|
+
expectedVersion: run.version,
|
|
186
|
+
from: ["waiting"],
|
|
187
|
+
to: "running",
|
|
188
|
+
actor: { kind: "system" }
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
waits.set(input.conversationId, {
|
|
192
|
+
...wait,
|
|
193
|
+
status: "resuming",
|
|
194
|
+
version: wait.version + 1
|
|
195
|
+
});
|
|
196
|
+
return true;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
function updatePhoneCheckpoint(conversationId, checkpoint) {
|
|
200
|
+
const wait = phoneAssistance(conversationId);
|
|
201
|
+
if (wait?.status === "resuming" && wait.checkpoint.task.taskId === checkpoint.task.taskId) waits.set(conversationId, {
|
|
202
|
+
...wait,
|
|
203
|
+
checkpoint
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function phoneResumeForRun(conversationId, runId) {
|
|
207
|
+
const wait = phoneAssistance(conversationId);
|
|
208
|
+
if (!wait?.queuedInputId || wait.status !== "resuming") return void 0;
|
|
209
|
+
return getSessionInputById(conversationId, wait.queuedInputId)?.runId === runId ? wait : void 0;
|
|
210
|
+
}
|
|
211
|
+
/** Interrupted continuations require another explicit handback, never automatic replay after restart. */
|
|
212
|
+
function reconcilePhoneAssistance() {
|
|
213
|
+
if (!isXopcDatabaseOpen()) return [];
|
|
214
|
+
const conversations = [];
|
|
215
|
+
for (const wait of waits.values()) {
|
|
216
|
+
if (phoneAssistance(wait.conversationId)?.id !== wait.id) continue;
|
|
217
|
+
const input = wait.queuedInputId ? getSessionInputById(wait.conversationId, wait.queuedInputId) : void 0;
|
|
218
|
+
if (wait.status === "resuming" || wait.status === "queued" && input?.status !== "queued") {
|
|
219
|
+
const next = {
|
|
220
|
+
...wait,
|
|
221
|
+
status: "open",
|
|
222
|
+
queuedInputId: void 0,
|
|
223
|
+
id: randomUUID(),
|
|
224
|
+
version: wait.version + 1
|
|
225
|
+
};
|
|
226
|
+
markTaskWaiting(next);
|
|
227
|
+
waits.set(wait.conversationId, next);
|
|
228
|
+
} else if (wait.status === "queued") conversations.push(wait.conversationId);
|
|
229
|
+
}
|
|
230
|
+
return conversations;
|
|
231
|
+
}
|
|
232
|
+
function finishPhoneAssistance(input, succeeded) {
|
|
233
|
+
if (!isXopcDatabaseOpen()) return;
|
|
234
|
+
runSqliteWriteTransaction(() => {
|
|
235
|
+
const wait = phoneAssistance(input.conversationId);
|
|
236
|
+
if (wait?.queuedInputId !== input.id || !["queued", "resuming"].includes(wait.status)) return;
|
|
237
|
+
const next = {
|
|
238
|
+
...wait,
|
|
239
|
+
status: succeeded ? "completed" : "open",
|
|
240
|
+
...succeeded ? {} : {
|
|
241
|
+
id: randomUUID(),
|
|
242
|
+
queuedInputId: void 0
|
|
243
|
+
},
|
|
244
|
+
version: wait.version + 1
|
|
245
|
+
};
|
|
246
|
+
if (!succeeded) markTaskWaiting(next);
|
|
247
|
+
waits.set(input.conversationId, next);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
function phoneAssistanceReport(wait) {
|
|
251
|
+
return {
|
|
252
|
+
...wait.checkpoint.report,
|
|
253
|
+
assistanceId: wait.id,
|
|
254
|
+
reconnectRequired: true,
|
|
255
|
+
mock: false,
|
|
256
|
+
mode: "control",
|
|
257
|
+
status: wait.status === "completed" ? "completed" : "needs_user",
|
|
258
|
+
controlOwner: "none",
|
|
259
|
+
controlEpoch: 1,
|
|
260
|
+
handoff: "idle",
|
|
261
|
+
actions: wait.checkpoint.usage.actions,
|
|
262
|
+
modelRequests: wait.checkpoint.usage.modelRequests,
|
|
263
|
+
createdAt: wait.createdAt,
|
|
264
|
+
updatedAt: wait.createdAt,
|
|
265
|
+
verified: false,
|
|
266
|
+
verificationLevel: "none",
|
|
267
|
+
steps: [],
|
|
268
|
+
stopReason: "user_takeover",
|
|
269
|
+
message: "任务进度已保留。请接管手机完成操作,然后继续任务。"
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
//#endregion
|
|
273
|
+
export { cancelPhoneAssistance, consumePhoneAssistance, finishPhoneAssistance, isPhoneAssistanceSuspended, pendingPhoneAssistance, phoneAssistance, phoneAssistanceReport, phoneResumeForRun, queuePhoneAssistance, reconcilePhoneAssistance, requirePhoneAssistance, updatePhoneCheckpoint };
|
|
@@ -2,6 +2,7 @@ import { CloudAdbConnection, PhoneCloudKeyStore } from './cloud-adb.js';
|
|
|
2
2
|
import { CloudScrcpyProvider } from './cloud-scrcpy.js';
|
|
3
3
|
import { type PhoneDevice } from './contracts.js';
|
|
4
4
|
import type { PhoneRepository } from './repository.js';
|
|
5
|
+
import { WuyingLocationAdapter } from './wuying-location.js';
|
|
5
6
|
export declare class CloudPhones {
|
|
6
7
|
private repository;
|
|
7
8
|
private keys;
|
|
@@ -23,6 +24,10 @@ export declare class CloudPhones {
|
|
|
23
24
|
cancel(owner: string, token: string): void;
|
|
24
25
|
driver(device: PhoneDevice): Promise<import("./adb-driver.js").AdbPhoneDriver>;
|
|
25
26
|
interactive(device: PhoneDevice, failed: () => void): Promise<CloudScrcpyProvider>;
|
|
27
|
+
locationAdapter(device: PhoneDevice): Promise<{
|
|
28
|
+
adapter: WuyingLocationAdapter;
|
|
29
|
+
close: () => void;
|
|
30
|
+
}>;
|
|
26
31
|
disconnect(id: string): void;
|
|
27
32
|
remove(device: PhoneDevice): Promise<void>;
|
|
28
33
|
close(): void;
|
|
@@ -2,6 +2,7 @@ import { PhoneError, init_contracts } from "./contracts.js";
|
|
|
2
2
|
import { PhoneCloudKeyStore, parseCloudEndpoint, parseCloudPrivateKey } from "./cloud-adb-connection.js";
|
|
3
3
|
import { CloudAdbConnection } from "./cloud-adb.js";
|
|
4
4
|
import { CloudScrcpyProvider } from "./cloud-scrcpy.js";
|
|
5
|
+
import { WuyingLocationAdapter } from "./wuying-location.js";
|
|
5
6
|
import { randomUUID } from "node:crypto";
|
|
6
7
|
import sharp from "sharp";
|
|
7
8
|
//#region src/phone/cloud-phones.ts
|
|
@@ -126,6 +127,19 @@ var CloudPhones = class {
|
|
|
126
127
|
if (!binding) throw new PhoneError("PHONE_CONNECTION_INVALID", "Missing cloud connection");
|
|
127
128
|
return new CloudScrcpyProvider(binding.endpoint, await this.keys.load(binding.credentialId), failed, this.connect);
|
|
128
129
|
}
|
|
130
|
+
async locationAdapter(device) {
|
|
131
|
+
if (device.connection?.kind !== "aliyun-adb") throw new PhoneError("PHONE_ENV_UNSUPPORTED", "Choose an Alibaba cloud phone", 409);
|
|
132
|
+
const connection = this.connect(device.connection.endpoint, await this.keys.load(device.connection.credentialId));
|
|
133
|
+
return {
|
|
134
|
+
adapter: new WuyingLocationAdapter(async (args, signal) => (await connection.command("", [
|
|
135
|
+
"-s",
|
|
136
|
+
device.connection.endpoint,
|
|
137
|
+
"shell",
|
|
138
|
+
...args
|
|
139
|
+
], signal, 15e3)).toString()),
|
|
140
|
+
close: () => connection.dispose()
|
|
141
|
+
};
|
|
142
|
+
}
|
|
129
143
|
disconnect(id) {
|
|
130
144
|
this.connections.get(id)?.dispose();
|
|
131
145
|
this.connections.delete(id);
|
|
@@ -27,6 +27,7 @@ export declare const PhoneConfigSchema: z.ZodPrefault<z.ZodObject<{
|
|
|
27
27
|
hierarchicalPlanning: z.ZodDefault<z.ZodBoolean>;
|
|
28
28
|
maxActionsPerSession: z.ZodDefault<z.ZodNumber>;
|
|
29
29
|
maxModelRequests: z.ZodDefault<z.ZodNumber>;
|
|
30
|
+
modelRequestTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
30
31
|
maxOperationDurationMs: z.ZodDefault<z.ZodNumber>;
|
|
31
32
|
maxSessionDurationMs: z.ZodDefault<z.ZodNumber>;
|
|
32
33
|
idleDisconnectMs: z.ZodDefault<z.ZodNumber>;
|
|
@@ -292,6 +293,9 @@ export type PhoneTaskFeedback = {
|
|
|
292
293
|
nextAction: 'wait' | 'replan' | 'inspect' | 'user' | 'done';
|
|
293
294
|
};
|
|
294
295
|
export declare const PhoneInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
296
|
+
op: z.ZodLiteral<"request_user">;
|
|
297
|
+
reason: z.ZodString;
|
|
298
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
295
299
|
op: z.ZodLiteral<"discover">;
|
|
296
300
|
}, z.core.$strict>, z.ZodObject<{
|
|
297
301
|
op: z.ZodLiteral<"set_mode">;
|
|
@@ -304,8 +308,8 @@ export declare const PhoneInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
304
308
|
op: z.ZodLiteral<"open">;
|
|
305
309
|
deviceId: z.ZodOptional<z.ZodString>;
|
|
306
310
|
mode: z.ZodEnum<{
|
|
307
|
-
observe: "observe";
|
|
308
311
|
control: "control";
|
|
312
|
+
observe: "observe";
|
|
309
313
|
}>;
|
|
310
314
|
appPackage: z.ZodOptional<z.ZodString>;
|
|
311
315
|
settingsPage: z.ZodOptional<z.ZodLiteral<"about-phone">>;
|
|
@@ -371,6 +375,8 @@ export type PhoneReading = {
|
|
|
371
375
|
reason?: string;
|
|
372
376
|
};
|
|
373
377
|
export type PhoneReport = {
|
|
378
|
+
assistanceId?: string;
|
|
379
|
+
reconnectRequired?: boolean;
|
|
374
380
|
sessionId: string;
|
|
375
381
|
deviceId: string;
|
|
376
382
|
deviceName: string;
|
|
@@ -16,6 +16,7 @@ var init_contracts = __esmMin((() => {
|
|
|
16
16
|
hierarchicalPlanning: z.boolean().default(false),
|
|
17
17
|
maxActionsPerSession: z.number().int().min(1).max(80).default(40),
|
|
18
18
|
maxModelRequests: z.number().int().min(1).max(120).default(60),
|
|
19
|
+
modelRequestTimeoutMs: z.number().int().min(1e3).max(3e5).default(45e3),
|
|
19
20
|
maxOperationDurationMs: z.number().int().min(1e3).max(9e5).default(3e5),
|
|
20
21
|
maxSessionDurationMs: z.number().int().min(1e3).max(9e5).default(9e5),
|
|
21
22
|
idleDisconnectMs: z.number().int().min(0).max(864e5).default(0)
|
|
@@ -130,6 +131,10 @@ var init_contracts = __esmMin((() => {
|
|
|
130
131
|
requestedOutputs: z.array(PhoneRequestedOutputSchema).max(8).refine((items) => new Set(items.map((item) => item.key)).size === items.length, "Output keys must be unique").optional()
|
|
131
132
|
};
|
|
132
133
|
PhoneInputSchema = z.discriminatedUnion("op", [
|
|
134
|
+
z.object({
|
|
135
|
+
op: z.literal("request_user"),
|
|
136
|
+
reason: z.string().trim().min(1).max(1e3)
|
|
137
|
+
}).strict(),
|
|
133
138
|
z.object({ op: z.literal("discover") }).strict(),
|
|
134
139
|
z.object({
|
|
135
140
|
op: z.literal("set_mode"),
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/phone/environment-adapter.ts
|
|
2
|
+
/** No environment writes until provider format, grants and cleanup are verified. */
|
|
3
|
+
const unsupportedPhoneEnvironmentAdapter = {
|
|
4
|
+
supportedFields: [],
|
|
5
|
+
async apply(_request, signal) {
|
|
6
|
+
signal.throwIfAborted();
|
|
7
|
+
return { status: "unsupported" };
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { unsupportedPhoneEnvironmentAdapter };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Only the pre-sharing phone baseline is persisted; source-device location never enters this store. */
|
|
2
|
+
export declare class LocationBaselineCipher {
|
|
3
|
+
private readonly root;
|
|
4
|
+
private key?;
|
|
5
|
+
constructor(root?: string);
|
|
6
|
+
private loadKey;
|
|
7
|
+
seal(value: string, phoneId: string): Promise<string>;
|
|
8
|
+
open(value: string, phoneId: string): Promise<string>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { resolveStateDir } from "../config/paths-state.js";
|
|
2
|
+
import { init_paths } from "../config/paths.js";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
|
|
5
|
+
import { mkdir, open, readFile } from "node:fs/promises";
|
|
6
|
+
//#region src/phone/location-baseline-store.ts
|
|
7
|
+
init_paths();
|
|
8
|
+
/** Only the pre-sharing phone baseline is persisted; source-device location never enters this store. */
|
|
9
|
+
var LocationBaselineCipher = class {
|
|
10
|
+
key;
|
|
11
|
+
constructor(root = join(resolveStateDir(), "credentials")) {
|
|
12
|
+
this.root = root;
|
|
13
|
+
}
|
|
14
|
+
loadKey() {
|
|
15
|
+
return this.key ??= (async () => {
|
|
16
|
+
await mkdir(this.root, {
|
|
17
|
+
recursive: true,
|
|
18
|
+
mode: 448
|
|
19
|
+
});
|
|
20
|
+
const path = join(this.root, "phone-location-baseline.key");
|
|
21
|
+
const candidate = randomBytes(32);
|
|
22
|
+
try {
|
|
23
|
+
const file = await open(path, "wx", 384);
|
|
24
|
+
try {
|
|
25
|
+
await file.writeFile(candidate);
|
|
26
|
+
await file.sync();
|
|
27
|
+
} finally {
|
|
28
|
+
await file.close();
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
if (error.code !== "EEXIST") throw error;
|
|
32
|
+
} finally {
|
|
33
|
+
candidate.fill(0);
|
|
34
|
+
}
|
|
35
|
+
const key = await readFile(path);
|
|
36
|
+
if (key.length !== 32) throw new Error("Invalid phone baseline key");
|
|
37
|
+
return key;
|
|
38
|
+
})();
|
|
39
|
+
}
|
|
40
|
+
async seal(value, phoneId) {
|
|
41
|
+
const iv = randomBytes(12);
|
|
42
|
+
const cipher = createCipheriv("aes-256-gcm", await this.loadKey(), iv);
|
|
43
|
+
cipher.setAAD(Buffer.from(phoneId));
|
|
44
|
+
const encrypted = Buffer.concat([cipher.update(value, "utf8"), cipher.final()]);
|
|
45
|
+
return Buffer.concat([
|
|
46
|
+
iv,
|
|
47
|
+
cipher.getAuthTag(),
|
|
48
|
+
encrypted
|
|
49
|
+
]).toString("base64");
|
|
50
|
+
}
|
|
51
|
+
async open(value, phoneId) {
|
|
52
|
+
const bytes = Buffer.from(value, "base64");
|
|
53
|
+
if (bytes.length < 29 || bytes.length > 4096) throw new Error("Invalid phone baseline");
|
|
54
|
+
const cipher = createDecipheriv("aes-256-gcm", await this.loadKey(), bytes.subarray(0, 12));
|
|
55
|
+
cipher.setAAD(Buffer.from(phoneId));
|
|
56
|
+
cipher.setAuthTag(bytes.subarray(12, 28));
|
|
57
|
+
return Buffer.concat([cipher.update(bytes.subarray(28)), cipher.final()]).toString("utf8");
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
//#endregion
|
|
61
|
+
export { LocationBaselineCipher };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { DurableState } from '../storage/sqlite/durable-state.js';
|
|
2
|
+
import type { LocationConsumer } from '../endpoint-tools/location-sharing.js';
|
|
3
|
+
import { type PhoneDevice } from './contracts.js';
|
|
4
|
+
import type { PhoneRepository } from './repository.js';
|
|
5
|
+
import { LocationBaselineCipher } from './location-baseline-store.js';
|
|
6
|
+
import type { WuyingLocationAdapter } from './wuying-location.js';
|
|
7
|
+
export interface PhoneLocationJournal {
|
|
8
|
+
id: string;
|
|
9
|
+
phoneId: string;
|
|
10
|
+
shareId: string;
|
|
11
|
+
conversationId: string;
|
|
12
|
+
deviceRevision: number;
|
|
13
|
+
baseline: string;
|
|
14
|
+
phase: 'pending' | 'applied' | 'cleanup_pending';
|
|
15
|
+
validUntil: number;
|
|
16
|
+
}
|
|
17
|
+
interface EnvironmentAccess {
|
|
18
|
+
adapter(device: PhoneDevice): Promise<{
|
|
19
|
+
adapter: WuyingLocationAdapter;
|
|
20
|
+
close(): void;
|
|
21
|
+
}>;
|
|
22
|
+
exclusive<T>(phoneId: string, owner: string, cleanup: boolean, action: () => Promise<T>): Promise<T>;
|
|
23
|
+
}
|
|
24
|
+
/** Write-ahead cleanup journal; an interrupted application quarantines the phone until recovery. */
|
|
25
|
+
export declare class PhoneLocationEnvironment implements LocationConsumer {
|
|
26
|
+
private readonly repository;
|
|
27
|
+
private readonly access;
|
|
28
|
+
private readonly cipher;
|
|
29
|
+
private readonly now;
|
|
30
|
+
private readonly journal;
|
|
31
|
+
private readonly active;
|
|
32
|
+
private readonly required;
|
|
33
|
+
private readonly ended;
|
|
34
|
+
private readonly verified;
|
|
35
|
+
private readonly operations;
|
|
36
|
+
private readonly timer;
|
|
37
|
+
private readonly cleaning;
|
|
38
|
+
constructor(repository: PhoneRepository, access: EnvironmentAccess, cipher?: LocationBaselineCipher, now?: () => number, journal?: Pick<DurableState<PhoneLocationJournal>, 'get' | 'set' | 'delete' | 'values'>);
|
|
39
|
+
sweep(): Promise<void>;
|
|
40
|
+
hasVerified(phoneId: string, owner: string): boolean;
|
|
41
|
+
status(phoneId: string): {
|
|
42
|
+
status: "pending" | "applied" | "cleanup_pending";
|
|
43
|
+
shareId: string;
|
|
44
|
+
validUntil: number;
|
|
45
|
+
recoveryRequired: boolean;
|
|
46
|
+
} | {
|
|
47
|
+
status: string;
|
|
48
|
+
shareId?: undefined;
|
|
49
|
+
validUntil?: undefined;
|
|
50
|
+
recoveryRequired?: undefined;
|
|
51
|
+
};
|
|
52
|
+
assertAllowed(phoneId: string, owner: string): void;
|
|
53
|
+
recover(phoneId: string, force?: boolean): Promise<void>;
|
|
54
|
+
apply(input: Parameters<LocationConsumer['apply']>[0], signal: AbortSignal): Promise<void>;
|
|
55
|
+
clear(shareId: string, phoneId: string): Promise<boolean>;
|
|
56
|
+
private cleanup;
|
|
57
|
+
releaseOwner(owner: string): Promise<void>;
|
|
58
|
+
releaseDevice(phoneId: string): Promise<void>;
|
|
59
|
+
close(): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
export {};
|