@xopcai/xopc 0.0.414 → 0.0.416
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/_locales/en/messages.json +4 -1
- package/dist/browser-ext/_locales/zh_CN/messages.json +4 -1
- package/dist/browser-ext/dist/assets/{page-context-MuzjMBlJ.js → page-context-CVvmTWZb.js} +33 -9
- package/dist/browser-ext/dist/background.js +39 -10
- package/dist/browser-ext/dist/sidepanel.html +1 -1
- package/dist/browser-ext/dist/sidepanel.js +22 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-ClobpdW3.js → agent-avatar-dicebear-CufU7cqe.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DHDAcss8.js +1 -0
- package/dist/gateway/static/root/assets/agents-BV3dAoa0.js +77 -0
- package/dist/gateway/static/root/assets/{agents-admin-api-CeBkHnl8.js → agents-admin-api-B1p-ghg9.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CLunLNGp.js → app-management-settings-panel-D4-n1uBg.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DBEgoE9g.js → appearance-settings-Cgn4eNsX.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BOYzD7Zz.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-JElK4Goq.js → archive-plugin-B4btCsiV.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-CZ0UqwyU.js → automations-page-yb1EL_3N.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-J7LJ4RuV.js +8 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CXFawow6.js → binary-plugins-DQT9e258.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BoduwSYI.js → block-editor-B50rU9tL.js} +30 -30
- package/dist/gateway/static/root/assets/{browser-automation-inputs-D1pDgMJu.js → browser-automation-inputs-D6AccXaA.js} +1 -1
- package/dist/gateway/static/root/assets/browser-automations-page-BiQz6lJA.js +3 -0
- package/dist/gateway/static/root/assets/browser-settings-page-W9kuxBbE.js +3 -0
- package/dist/gateway/static/root/assets/{capabilities-Bpeh6E22.js → capabilities-BlxF36t-.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-iXe87MdG.js +2 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CRLSXe7Z.js +8 -0
- package/dist/gateway/static/root/assets/{capability-header-actions-BasrAWA0.js → capability-header-actions-BMnbzHms.js} +1 -1
- package/dist/gateway/static/root/assets/channels-CrRJkOKX.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-CwQbzcZ_.js → chat-terminal-dock-Bd3af4gL.js} +2 -2
- package/dist/gateway/static/root/assets/{computer-settings-page-DNWeJKfF.js → computer-settings-page-DXfqy7xh.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-CxHgC5RM.js → connector-service-page-B-cw0CPU.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DbFxc0Fd.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-CXxLbLJb.js → date-picker-CqzXevH6.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-DVuWMrSj.js → dependency-picker-pgT4Gyaf.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-BDlg9g4s.js → desktop-pet-settings-Dy_-i2L8.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-KbVLtAlO.js → desktop-pet-zICeqw9c.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-ByGbxqkg.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-a7xEodzo.js → directory-picker-path-field-C-aQ7qoM.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CHelH5u_.js → extension-debug-page-2NwpYkS5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CrVHmS9-.js → extension-page-y9J0z7_Q.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CiMybi0r.js → extension-settings-page-BtowusUh.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-DF_HV6NP.js → gateway-config-swr-fQKBHBi1.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-C52ghnBK.js +1 -0
- package/dist/gateway/static/root/assets/gateway-realtime-store-Bx9KCID-.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-BYSKzUMR.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-B91CBTzO.js → gateway-startup-retry-Cfwxof4k.js} +1 -1
- package/dist/gateway/static/root/assets/highlight-code-Cz6eeDH5.js +1 -0
- package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-8ACAVktj.js → highlighted-body-KQOG7T2V-BiAa8HKC.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-Cd1BjYHj.js +2 -0
- package/dist/gateway/static/root/assets/{image-generation-api-CVBaWmrV.js → image-generation-api-gBFro48x.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-C5IP3e6d.js → imports-page-BZQpXgjj.js} +1 -1
- package/dist/gateway/static/root/assets/index-Cy16gQST.css +1 -0
- package/dist/gateway/static/root/assets/index-DRyGCING.js +710 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BhU6VYvd.js → keyboard-shortcuts-settings-CYunR34k.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-B_Ac1lly.js +1 -0
- package/dist/gateway/static/root/assets/{local-apps-page-DcP1Bdlk.js → local-apps-page-w-J5bY02.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-DvmwiLUx.js → local-session-drafts-iGX_6O0O.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-JogcXC4J.js → locale-store-B7s2Hb35.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Dnjvvx2i.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-w1EDwgLW.js +1 -0
- package/dist/gateway/static/root/assets/{media-plugins-BnPpcJ2J.js → media-plugins-CIx1koXw.js} +1 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-DISkHmEC.js +1 -0
- package/dist/gateway/static/root/assets/{messages-RzwPiQNL.js → messages-BYq0cPbn.js} +2 -2
- package/dist/gateway/static/root/assets/note-detail-panel-CNkxMTFU.js +5 -0
- package/dist/gateway/static/root/assets/note-image-lightbox-D5GH2wuC.js +1 -0
- package/dist/gateway/static/root/assets/notes-page-DZgKqFBG.js +8 -0
- package/dist/gateway/static/root/assets/page-context-capture-button-DusR2Itk.js +1 -0
- package/dist/gateway/static/root/assets/personal-page-CR5JFkQ9.js +1 -0
- package/dist/gateway/static/root/assets/personal-settings-panel-B7undvlr.js +1 -0
- package/dist/gateway/static/root/assets/phone-model-picker-fWDltRUJ.js +1 -0
- package/dist/gateway/static/root/assets/phone-settings-page-CsOirAiy.js +1 -0
- package/dist/gateway/static/root/assets/plugin-details-dialog-BOBVIB3j.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-FGqN-mQx.js → preview-open-alternatives-CMxjsKSw.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CwnHLfdL.js → product-open-page-CrlyJx5M.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-BD6k5hF9.js → product-preview-content-B-Jhzi7W.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DoYUbtcI.js +7 -0
- package/dist/gateway/static/root/assets/projects-page-xGQd9oAZ.js +1 -0
- package/dist/gateway/static/root/assets/refresh-cw-BRlGaq2w.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-BGqSwITi.js → registry-api-BcfoLEna.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Gs0Xkws9.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-CSm5SpnR.js → runtime-tools-api-DesqGCnE.js} +1 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bwg7U7TR.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-DoVn5jJK.js → schema-form-ByzTNR_C.js} +1 -1
- package/dist/gateway/static/root/assets/{session-api-DTxZyMta.js → session-api-DdQnMwkl.js} +1 -1
- package/dist/gateway/static/root/assets/{session-manager-B2HDomj4.js → session-manager-B_h0jlLb.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-XzK1ftbR.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-D_8Mvnog.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-Ce8vVv-9.js → settings-form-section-Brgd8IOV.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DP2w3ejC.js → settings-page-B6Mv02eg.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-header-BWyxJKOG.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-B20AfmFG.js → settings-page-layout-DLHcS-0T.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DSCj5yis.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-DV4dKrmG.js → share-preview-page-DF8Of0aZ.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DXNPe4Tl.js +1 -0
- package/dist/gateway/static/root/assets/{skill-api-DTdejInH.js → skill-api-CKCDCHLq.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BH0WF6Br.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DFWMVRW4.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-DB-ttubV.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-BJY7c8wb.js +2 -0
- package/dist/gateway/static/root/assets/{task-result-evidence-DIGSC4qF.js → task-result-evidence-B-vt1BgK.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-BaU8frtc.js → tracing-settings-page-Dt51Z_ws.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-BCcOUsqu.js → tunnel-api-Dok3t7Qe.js} +1 -1
- package/dist/gateway/static/root/assets/usage-page-lJym5G7F.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-C1X47WVb.js → use-autosave-D4EMIB-V.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-BXdNkITp.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-Bk4DQMTw.js → voice-api-key-field-CO3KuanA.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-D7xsWrdh.js → voice-config-api-BkUlN7GH.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-B7_NmTB5.js → work-discovery-overlay-BJRtgQM3.js} +1 -1
- package/dist/gateway/static/root/assets/wrench-DFb4r8bH.js +1 -0
- package/dist/gateway/static/root/assets/xopc-cloud-account-card-CS-_GxHV.js +1 -0
- package/dist/gateway/static/root/browser-setup-test.html +5 -0
- package/dist/gateway/static/root/browser-setup-test.js +7 -0
- package/dist/gateway/static/root/index.html +17 -14
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/browser-setup.js +6 -0
- package/dist/packages/gateway-contract/src/index.js +4 -0
- package/dist/packages/gateway-contract/src/phone-setup.js +6 -0
- package/dist/packages/realtime-client/src/index.js +1 -0
- package/dist/packages/realtime-protocol/src/index.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +4 -0
- package/dist/src/agent/agent-manager.js +12 -1
- package/dist/src/agent/coding/workspace-revision.js +1 -1
- package/dist/src/agent/commands/command-registry.js +1 -1
- package/dist/src/agent/embedded/tool-search-extension.js +14 -1
- package/dist/src/agent/memory/context-recovery.d.ts +1 -1
- package/dist/src/agent/service.d.ts +1 -0
- package/dist/src/agent/service.js +5 -0
- package/dist/src/agent/service.types.d.ts +2 -0
- package/dist/src/agent/skills/installer.js +3 -3
- package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
- package/dist/src/agent/tool-manuals/phone.js +4 -2
- package/dist/src/agent/tool-manuals/xopc-configuration.d.ts +2 -0
- package/dist/src/agent/tool-manuals/xopc-configuration.js +25 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +2 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +6 -2
- package/dist/src/agent/tools/factory.d.ts +3 -0
- package/dist/src/agent/tools/factory.js +11 -1
- package/dist/src/agent/tools/personal-task-tool.d.ts +1 -1
- package/dist/src/agent/tools/personal-task-tool.js +23 -21
- package/dist/src/agent/tools/phone-use-tool.d.ts +1 -0
- package/dist/src/agent/tools/phone-use-tool.js +29 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +1 -1
- package/dist/src/agent/tools/tool-manual-tool.js +3 -1
- package/dist/src/agent/tools/toolExposure.js +3 -0
- package/dist/src/agent/tools/xopc-use-tool.d.ts +4 -2
- package/dist/src/agent/tools/xopc-use-tool.js +40 -2
- package/dist/src/backup/archive.js +2 -1
- package/dist/src/browser/drivers/browser-driver.d.ts +2 -2
- package/dist/src/browser/drivers/extension-driver.d.ts +2 -2
- package/dist/src/browser/drivers/extension-driver.js +6 -3
- package/dist/src/browser/providers/browser-ext-install.js +3 -2
- package/dist/src/browser/runtime/browser-runtime.d.ts +4 -1
- package/dist/src/browser/runtime/browser-runtime.js +29 -17
- package/dist/src/browser/setup/repository.d.ts +5 -0
- package/dist/src/browser/setup/repository.js +42 -0
- package/dist/src/browser/setup/service.d.ts +152 -0
- package/dist/src/browser/setup/service.js +404 -0
- package/dist/src/browser/setup/types.d.ts +38 -0
- package/dist/src/browser/setup/types.js +1 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +3 -3
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/extension.js +2 -2
- package/dist/src/config/schema.d.ts +2 -0
- package/dist/src/extensions/install.js +1 -1
- package/dist/src/extensions/update.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/browser-setup.d.ts +3 -0
- package/dist/src/gateway/hono/routes/browser-setup.js +114 -0
- package/dist/src/gateway/hono/routes/browser.d.ts +2 -1
- package/dist/src/gateway/hono/routes/browser.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/phone-dependencies.js +1 -1
- package/dist/src/gateway/hono/routes/phone-setup.d.ts +7 -0
- package/dist/src/gateway/hono/routes/phone-setup.js +162 -0
- package/dist/src/gateway/hono/routes/phone.js +11 -7
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -0
- package/dist/src/gateway/provider-model-setup.js +1 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +2 -0
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/session-input-coordinator.js +1 -1
- package/dist/src/gateway/service.d.ts +5 -0
- package/dist/src/gateway/service.js +52 -7
- package/dist/src/gateway/xopc-cloud-capability-setup.js +7 -1
- package/dist/src/home-intelligence/host.js +2 -2
- package/dist/src/infra/unhandled-rejections.js +2 -2
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/personal-agent/prompts.js +1 -1
- package/dist/src/phone/adb-driver.d.ts +8 -2
- package/dist/src/phone/adb-driver.js +124 -54
- package/dist/src/phone/cloud-adb.js +8 -0
- package/dist/src/phone/cloud-scrcpy.d.ts +3 -1
- package/dist/src/phone/cloud-scrcpy.js +17 -3
- package/dist/src/phone/contracts.d.ts +85 -0
- package/dist/src/phone/contracts.js +31 -5
- package/dist/src/phone/model-adapter.d.ts +141 -2
- package/dist/src/phone/model-adapter.js +176 -24
- package/dist/src/phone/numeric-entry.d.ts +31 -0
- package/dist/src/phone/numeric-entry.js +126 -0
- package/dist/src/phone/planning.d.ts +27 -0
- package/dist/src/phone/planning.js +79 -0
- package/dist/src/phone/recovery.d.ts +37 -0
- package/dist/src/phone/recovery.js +81 -0
- package/dist/src/phone/reliability.d.ts +7 -0
- package/dist/src/phone/reliability.js +66 -0
- package/dist/src/phone/repository.d.ts +1 -0
- package/dist/src/phone/repository.js +3 -0
- package/dist/src/phone/runtime.d.ts +8 -0
- package/dist/src/phone/runtime.js +387 -41
- package/dist/src/phone/scrcpy-text.d.ts +11 -0
- package/dist/src/phone/scrcpy-text.js +72 -0
- package/dist/src/phone/scrcpy.d.ts +5 -1
- package/dist/src/phone/scrcpy.js +48 -3
- package/dist/src/phone/semantic-controls.d.ts +13 -0
- package/dist/src/phone/semantic-controls.js +76 -0
- package/dist/src/phone/setup/service.d.ts +148 -0
- package/dist/src/phone/setup/service.js +251 -0
- package/dist/src/providers/presentation.js +2 -2
- package/dist/src/providers/xopc-cloud-model-source.js +6 -2
- package/dist/src/realtime/runtime.js +1 -1
- package/dist/src/storage/sqlite/connection.js +2 -2
- package/dist/src/storage/sqlite/offline-access.js +13 -7
- package/dist/src/storage/sqlite/schema-errors.d.ts +12 -0
- package/dist/src/storage/sqlite/schema-errors.js +21 -3
- package/dist/src/storage/sqlite/schema-upgrade.d.ts +4 -0
- package/dist/src/storage/sqlite/schema-upgrade.js +78 -0
- package/dist/src/storage/sqlite/schema.d.ts +4 -3
- package/dist/src/storage/sqlite/schema.js +14 -8
- package/dist/src/storage/sqlite/schema.sql +10 -0
- package/dist/src/storage/sqlite/upgrades/203_remove_retired_proactive_contracts.sql +70 -0
- package/dist/src/storage/sqlite/upgrades/204_home_intelligence.sql +78 -0
- package/dist/src/storage/sqlite/upgrades/205_agent_catalog.sql +66 -0
- package/dist/src/storage/sqlite/upgrades/206_home_advice_strategy_version.sql +2 -0
- package/dist/src/storage/sqlite/upgrades/207_user_model_policy_contract.sql +121 -0
- package/dist/src/storage/sqlite/upgrades/208_automation_management.sql +2 -0
- package/dist/src/storage/sqlite/upgrades/209_automation_event_hub.sql +48 -0
- package/dist/src/storage/sqlite/upgrades/210_remove_legacy_automation_timeout.sql +14 -0
- package/dist/src/storage/sqlite/upgrades/211_automation_result_deliveries.sql +16 -0
- package/dist/src/storage/sqlite/upgrades/212_automation_delivery_policy.sql +30 -0
- package/dist/src/storage/sqlite/upgrades/213_automation_reliability_contract.sql +188 -0
- package/dist/src/storage/sqlite/upgrades/214_ai_usage_ledger.sql +41 -0
- package/dist/src/storage/sqlite/upgrades/215_scene_execution_adapters.sql +6 -0
- package/dist/src/storage/sqlite/upgrades/216_remove_scene_model_usage.sql +1 -0
- package/dist/src/storage/sqlite/upgrades/217_remove_legacy_memory_tables.sql +4 -0
- package/dist/src/storage/sqlite/upgrades/218_core_relation_indexes.sql +26 -0
- package/dist/src/storage/sqlite/upgrades/219_json_contracts.sql +123 -0
- package/dist/src/storage/sqlite/upgrades/220_normalize_timestamps.sql +339 -0
- package/dist/src/storage/sqlite/upgrades/221_ai_usage_retention_index.sql +2 -0
- package/dist/src/storage/sqlite/upgrades/222_session_config_authority.sql +13 -0
- package/dist/src/storage/sqlite/upgrades/223_session_creation_receipts.sql +59 -0
- package/dist/src/storage/sqlite/upgrades/224_task_origin_links.sql +8 -0
- package/dist/src/storage/sqlite/upgrades/225_task_collaboration.sql +32 -0
- package/dist/src/storage/sqlite/upgrades/226_task_main_updates.sql +9 -0
- package/dist/src/storage/sqlite/upgrades/227_task_main_update_decisions.sql +8 -0
- package/dist/src/storage/sqlite/upgrades/228_task_main_agent_links.sql +14 -0
- package/dist/src/storage/sqlite/upgrades/229_task_criterion_reviews.sql +12 -0
- package/dist/src/storage/sqlite/upgrades/230_personal_agent_onboarding.sql +8 -0
- package/dist/src/storage/sqlite/upgrades/231_task_result_deliveries.sql +32 -0
- package/dist/src/storage/sqlite/upgrades/232_personal_requests.sql +28 -0
- package/dist/src/storage/sqlite/upgrades/233_observability_usage_links.sql +3 -0
- package/dist/src/storage/sqlite/upgrades/234_task_result_reply.sql +14 -0
- package/dist/src/storage/sqlite/upgrades/235_personal_conversation_priority.sql +3 -0
- package/dist/src/storage/sqlite/upgrades/236_personal_proactivity.sql +53 -0
- package/dist/src/storage/sqlite/upgrades/237_personal_strategy_versions.sql +18 -0
- package/dist/src/storage/sqlite/upgrades/238_browser_record_replay.sql +45 -0
- package/dist/src/storage/sqlite/upgrades/239_clarification_notifications.sql +26 -0
- package/dist/src/storage/sqlite/upgrades/240_device_settings.sql +5 -0
- package/dist/src/storage/sqlite/upgrades/241_device_grant_audit.sql +13 -0
- package/dist/src/storage/sqlite/upgrades/242_cloud_usage_receipts.sql +5 -0
- package/dist/src/storage/sqlite/upgrades/243_voice_opening_greetings.sql +12 -0
- package/dist/src/storage/sqlite/upgrades/244_device_request_proofs.sql +8 -0
- package/dist/src/storage/sqlite/upgrades/245_memory_learning.sql +125 -0
- package/dist/src/storage/sqlite/upgrades/246_personal_session_thinking.sql +22 -0
- package/dist/src/storage/sqlite/upgrades/247_agent_selection_records.sql +32 -0
- package/dist/src/storage/sqlite/upgrades/248_next_turn_suggestions.sql +20 -0
- package/dist/src/storage/sqlite/upgrades/249_task_allocations.sql +17 -0
- package/dist/src/storage/sqlite/upgrades/250_research_checkpoints.sql +15 -0
- package/dist/src/storage/sqlite/upgrades/251_personal_result_reads.sql +40 -0
- package/dist/src/storage/sqlite/upgrades/252_task_work_revisions.sql +15 -0
- package/dist/src/storage/sqlite/upgrades/253_discussion_processing_recovery.sql +20 -0
- package/dist/src/storage/sqlite/upgrades/254_discussion_annotations.sql +17 -0
- package/dist/src/storage/sqlite/upgrades/255_discussion_chapter_progress.sql +10 -0
- package/dist/src/storage/sqlite/upgrades/256_task_main_update_retries.sql +21 -0
- package/dist/src/storage/sqlite/upgrades/257_session_composer_history.sql +11 -0
- package/dist/src/storage/sqlite/upgrades/258_task_phase_changes.sql +20 -0
- package/dist/src/storage/sqlite/upgrades/259_personal_default_style.sql +10 -0
- package/dist/src/storage/sqlite/upgrades/260_browser_setup.sql +9 -0
- package/dist/src/storage/sqlite/windows-database-owners.js +33 -28
- package/dist/src/tasks/capabilities/relations.d.ts +2 -2
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/work-discovery/probe.js +1 -1
- package/package.json +3 -3
- package/skills/tools/configure-xopc/SKILL.md +47 -0
- package/skills/tools/configure-xopc/references/browser/acceptance.md +31 -0
- package/skills/tools/configure-xopc/references/browser/chrome-extension.md +19 -0
- package/skills/tools/configure-xopc/references/browser/overview.md +22 -0
- package/skills/tools/configure-xopc/references/browser/permissions.md +25 -0
- package/skills/tools/configure-xopc/references/browser/troubleshooting.md +24 -0
- package/skills/tools/configure-xopc/references/phone/acceptance.md +25 -0
- package/skills/tools/configure-xopc/references/phone/aliyun.md +29 -0
- package/skills/tools/configure-xopc/references/phone/dependencies.md +18 -0
- package/skills/tools/configure-xopc/references/phone/local.md +19 -0
- package/skills/tools/configure-xopc/references/phone/models.md +18 -0
- package/skills/tools/configure-xopc/references/phone/overview.md +30 -0
- package/skills/tools/configure-xopc/references/phone/troubleshooting.md +24 -0
- package/skills/tools/configure-xopc/references/scene-index.md +12 -0
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-mf0jgEPE.js +0 -1
- package/dist/gateway/static/root/assets/agents-CKhZ4UYQ.js +0 -77
- package/dist/gateway/static/root/assets/apps-page-BZ_MaQJf.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-CHUDHNVL.js +0 -8
- package/dist/gateway/static/root/assets/browser-automations-page-DStDm9y1.js +0 -3
- package/dist/gateway/static/root/assets/browser-settings-page-6I4oetKt.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-page-C-EecWbS.js +0 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BQoCPk3x.js +0 -8
- package/dist/gateway/static/root/assets/channels-BKf_-Mdt.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-CUBg8spT.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-PmP_vGem.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-DMAzNlm-.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-CoIgC1Al.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DnrQ28E2.js +0 -1
- package/dist/gateway/static/root/assets/highlight-code-AMjU04kR.js +0 -1
- package/dist/gateway/static/root/assets/home-page-pTwVME-g.js +0 -2
- package/dist/gateway/static/root/assets/index-BLL0wKRZ.css +0 -1
- package/dist/gateway/static/root/assets/index-ygkHNYyo.js +0 -710
- package/dist/gateway/static/root/assets/local-app-workbench-page-Cwl6EvuX.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-CS3hcTOq.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-DC-Y_-GP.js +0 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-vckgHpON.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-C7u4dxEk.js +0 -5
- package/dist/gateway/static/root/assets/note-image-lightbox-jvqYtySx.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-Bs7F5Hpf.js +0 -8
- package/dist/gateway/static/root/assets/page-context-capture-button-DO_yhXS1.js +0 -1
- package/dist/gateway/static/root/assets/personal-page-BexL2-PQ.js +0 -1
- package/dist/gateway/static/root/assets/personal-settings-panel-BKA4fbYH.js +0 -1
- package/dist/gateway/static/root/assets/phone-dependencies-card-ChFtdFhA.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-picker-CZoIAQ1j.js +0 -1
- package/dist/gateway/static/root/assets/phone-settings-page-DRyK0nHH.js +0 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-B-N61jJH.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-DtKmFBml.js +0 -7
- package/dist/gateway/static/root/assets/projects-page-CFZIz9mc.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CWEc7W0m.js +0 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-q_oswAdV.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BuPqNxpd.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-QTVDCGJG.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-header-CYpuTXUW.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-ZmlE8jIE.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CtNxWqW-.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-Egaf8PqZ.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-C6FKxf4J.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-Baxkhov7.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-C77-rpkt.js +0 -2
- package/dist/gateway/static/root/assets/usage-page-BFeIbpbi.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-u8zY5jea.js +0 -2
- package/dist/gateway/static/root/assets/xopc-cloud-account-card-CJ_akAvc.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type PhoneApplication, type DiscoveredPhone, type PhoneAction, type PhoneElement, type PhoneObservation } from './contracts.js';
|
|
1
|
+
import { type PhoneApplication, type PhoneTextInputStatus, type DiscoveredPhone, type PhoneAction, type PhoneElement, type PhoneObservation } from './contracts.js';
|
|
2
2
|
export declare function resolveAdbPath(configured?: string, stateDir?: string): string;
|
|
3
3
|
export declare function runAdb(path: string, args: string[], signal?: AbortSignal, timeout?: number): Promise<Buffer>;
|
|
4
4
|
export declare function parseAdbDevices(text: string): DiscoveredPhone[];
|
|
@@ -7,12 +7,14 @@ export declare function parseAndroidLayout(raw: string): PhoneElement[];
|
|
|
7
7
|
export interface PhoneDriver {
|
|
8
8
|
discover(signal?: AbortSignal): Promise<DiscoveredPhone[]>;
|
|
9
9
|
applications?(serial: string, signal: AbortSignal): Promise<PhoneApplication[]>;
|
|
10
|
+
textInputStatus?(serial: string, signal: AbortSignal): Promise<PhoneTextInputStatus>;
|
|
10
11
|
observe(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
11
12
|
capture?(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
12
13
|
observeForText?(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
13
14
|
execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
|
|
14
15
|
settleMs: number;
|
|
15
16
|
resetTask?: boolean;
|
|
17
|
+
settingsPage?: 'about-phone';
|
|
16
18
|
}): Promise<void>;
|
|
17
19
|
}
|
|
18
20
|
/** Read only the active native editor, never historical input-method entries. */
|
|
@@ -22,7 +24,9 @@ export declare class AdbPhoneDriver implements PhoneDriver {
|
|
|
22
24
|
private readonly command;
|
|
23
25
|
private readonly useAndroidCli;
|
|
24
26
|
private readonly readApplications?;
|
|
25
|
-
|
|
27
|
+
private readonly pasteText?;
|
|
28
|
+
constructor(adbPath?: string, command?: typeof runAdb, useAndroidCli?: boolean, readApplications?: (signal: AbortSignal) => Promise<PhoneApplication[]>, pasteText?: (text: string, signal: AbortSignal) => Promise<void>);
|
|
29
|
+
textInputStatus(serial: string, signal: AbortSignal): Promise<PhoneTextInputStatus>;
|
|
26
30
|
discover(signal?: AbortSignal): Promise<DiscoveredPhone[]>;
|
|
27
31
|
applications(serial: string, signal: AbortSignal): Promise<PhoneApplication[]>;
|
|
28
32
|
foreground(serial: string, signal: AbortSignal): Promise<string>;
|
|
@@ -31,8 +35,10 @@ export declare class AdbPhoneDriver implements PhoneDriver {
|
|
|
31
35
|
observeForText(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
32
36
|
/** Pixel capture avoids accessibility dumps on the human interaction path. */
|
|
33
37
|
capture(serial: string, signal: AbortSignal): Promise<PhoneObservation>;
|
|
38
|
+
private confirmText;
|
|
34
39
|
execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
|
|
35
40
|
settleMs: number;
|
|
36
41
|
resetTask?: boolean;
|
|
42
|
+
settingsPage?: 'about-phone';
|
|
37
43
|
}): Promise<void>;
|
|
38
44
|
}
|
|
@@ -132,12 +132,32 @@ function parseAndroidFocusedEditor(raw, app) {
|
|
|
132
132
|
};
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
+
function sameTextEditor(target, node) {
|
|
136
|
+
return node.focused && Boolean(node.editable) && !node.password && (target.resourceId ? node.resourceId === target.resourceId : node.bounds.every((value, index) => value === target.bounds[index]));
|
|
137
|
+
}
|
|
135
138
|
var AdbPhoneDriver = class {
|
|
136
|
-
constructor(adbPath = resolveAdbPath(), command = runAdb, useAndroidCli = true, readApplications) {
|
|
139
|
+
constructor(adbPath = resolveAdbPath(), command = runAdb, useAndroidCli = true, readApplications, pasteText) {
|
|
137
140
|
this.adbPath = adbPath;
|
|
138
141
|
this.command = command;
|
|
139
142
|
this.useAndroidCli = useAndroidCli;
|
|
140
143
|
this.readApplications = readApplications;
|
|
144
|
+
this.pasteText = pasteText;
|
|
145
|
+
}
|
|
146
|
+
async textInputStatus(serial, signal) {
|
|
147
|
+
const androidSdk = Number((await this.shell(serial, ["getprop", "ro.build.version.sdk"], signal)).trim()) || 0;
|
|
148
|
+
let ready = false;
|
|
149
|
+
try {
|
|
150
|
+
await readScrcpyServer();
|
|
151
|
+
ready = true;
|
|
152
|
+
} catch {
|
|
153
|
+
signal.throwIfAborted();
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
androidSdk,
|
|
157
|
+
unicode: androidSdk < 24 ? "unsupported" : ready ? "available" : "setup_required",
|
|
158
|
+
method: "scrcpy-clipboard",
|
|
159
|
+
keyboardRequired: false
|
|
160
|
+
};
|
|
141
161
|
}
|
|
142
162
|
async discover(signal) {
|
|
143
163
|
return parseAdbDevices((await this.command(this.adbPath, ["devices", "-l"], signal)).toString());
|
|
@@ -198,25 +218,29 @@ var AdbPhoneDriver = class {
|
|
|
198
218
|
}
|
|
199
219
|
if (!elements.length) await setTimeout(350, void 0, { signal });
|
|
200
220
|
}
|
|
201
|
-
if (!elements.length)
|
|
202
|
-
const path = `/data/local/tmp/xopc-phone-${randomUUID()}.xml`;
|
|
221
|
+
if (!elements.length) for (const flags of [[], ["--compressed"]]) {
|
|
203
222
|
try {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
"
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
223
|
+
const path = `/data/local/tmp/xopc-phone-${randomUUID()}.xml`;
|
|
224
|
+
try {
|
|
225
|
+
await this.shell(serial, [
|
|
226
|
+
"uiautomator",
|
|
227
|
+
"dump",
|
|
228
|
+
...flags,
|
|
229
|
+
path
|
|
230
|
+
], signal);
|
|
231
|
+
elements = parsePhoneUi(await this.shell(serial, ["cat", path], signal));
|
|
232
|
+
} finally {
|
|
233
|
+
await this.shell(serial, [
|
|
234
|
+
"rm",
|
|
235
|
+
"-f",
|
|
236
|
+
path
|
|
237
|
+
], signal).catch(() => {});
|
|
238
|
+
}
|
|
239
|
+
} catch (error) {
|
|
240
|
+
signal.throwIfAborted();
|
|
241
|
+
if (error instanceof Error && error.message === "PHONE_UI_INVALID") throw error;
|
|
216
242
|
}
|
|
217
|
-
|
|
218
|
-
signal.throwIfAborted();
|
|
219
|
-
if (error instanceof Error && error.message === "PHONE_UI_INVALID") throw error;
|
|
243
|
+
if (elements.length) break;
|
|
220
244
|
}
|
|
221
245
|
return {
|
|
222
246
|
...await this.capture(serial, signal),
|
|
@@ -285,11 +309,40 @@ var AdbPhoneDriver = class {
|
|
|
285
309
|
throw error;
|
|
286
310
|
}
|
|
287
311
|
}
|
|
312
|
+
async confirmText(serial, app, target, matches, signal) {
|
|
313
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
314
|
+
await setTimeout(150, void 0, { signal });
|
|
315
|
+
const after = await this.observe(serial, signal);
|
|
316
|
+
try {
|
|
317
|
+
if (after.package !== app) break;
|
|
318
|
+
const candidates = after.elements.filter((node) => target.resourceId === "android:active-editor" ? node.focused && node.editable && !node.password : sameTextEditor(target, node));
|
|
319
|
+
if (candidates.length === 1 && matches(candidates[0].text)) return;
|
|
320
|
+
if (candidates.length !== 1) break;
|
|
321
|
+
} finally {
|
|
322
|
+
after.frame.fill(0);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text was sent but the target field value could not be verified. Take over and inspect the input field before retrying.", 409);
|
|
326
|
+
}
|
|
288
327
|
async execute(serial, action, observation, signal, options) {
|
|
289
328
|
const point = ([x, y]) => [String(Math.min(observation.width - 1, Math.round(x * observation.width / 1e3))), String(Math.min(observation.height - 1, Math.round(y * observation.height / 1e3)))];
|
|
290
329
|
const input = (args) => this.shell(serial, ["input", ...args], signal);
|
|
291
330
|
switch (action.type) {
|
|
331
|
+
case "tapElement": throw new PhoneError("PHONE_SEMANTIC_UNRESOLVED", "Resolve the native element against a fresh observation before dispatch", 409);
|
|
292
332
|
case "launch": {
|
|
333
|
+
if (options?.settingsPage) {
|
|
334
|
+
if (action.package !== "com.android.settings") throw new PhoneError("PHONE_APP_DENIED", "About phone requires the Settings application");
|
|
335
|
+
const output = await this.shell(serial, [
|
|
336
|
+
"am",
|
|
337
|
+
"start",
|
|
338
|
+
"-a",
|
|
339
|
+
"android.settings.DEVICE_INFO_SETTINGS",
|
|
340
|
+
"-p",
|
|
341
|
+
action.package
|
|
342
|
+
], signal);
|
|
343
|
+
if (/Error|Exception/.test(output)) throw new PhoneError("PHONE_LAUNCH_FAILED", "Unable to open About phone");
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
293
346
|
const component = (await this.shell(serial, [
|
|
294
347
|
"cmd",
|
|
295
348
|
"package",
|
|
@@ -334,47 +387,64 @@ var AdbPhoneDriver = class {
|
|
|
334
387
|
String(action.durationMs)
|
|
335
388
|
]);
|
|
336
389
|
break;
|
|
337
|
-
case "typeText":
|
|
338
|
-
|
|
339
|
-
if (
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
const
|
|
348
|
-
if (!(await this.shell(serial, [
|
|
349
|
-
"ime",
|
|
350
|
-
"list",
|
|
351
|
-
"-s"
|
|
352
|
-
], signal)).split(/\s+/).includes(keyboard)) throw new PhoneError("PHONE_KEYBOARD_REQUIRED", "Unicode input requires ADB Keyboard. Install and enable it on the device first.");
|
|
390
|
+
case "typeText": {
|
|
391
|
+
const editors = observation.elements.filter((node) => node.focused && node.editable && !node.password);
|
|
392
|
+
if (editors.length !== 1) throw new PhoneError("PHONE_INPUT_NOT_FOCUSED", "Focus one non-password editable field before typing");
|
|
393
|
+
const ascii = /^[a-zA-Z0-9 .,_@+-]+$/.test(action.text) && !action.text.includes("%");
|
|
394
|
+
if (!ascii) {
|
|
395
|
+
if ((await this.textInputStatus(serial, signal)).unicode !== "available") throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Automatic text input is unavailable. Check Phone settings or take over and type with the phone keyboard.", 409);
|
|
396
|
+
}
|
|
397
|
+
let target = editors[0];
|
|
398
|
+
if (action.mode === "replace") {
|
|
399
|
+
if (target.resourceId === "android:active-editor") throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "Replacing text requires a visible editable field. Take over and inspect the field.", 409);
|
|
400
|
+
const fresh = await this.observe(serial, signal);
|
|
353
401
|
try {
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
keyboard
|
|
358
|
-
], signal);
|
|
359
|
-
const result = await this.shell(serial, [
|
|
360
|
-
"am",
|
|
361
|
-
"broadcast",
|
|
362
|
-
"-a",
|
|
363
|
-
"ADB_INPUT_B64",
|
|
364
|
-
"--es",
|
|
365
|
-
"msg",
|
|
366
|
-
Buffer.from(action.text).toString("base64")
|
|
367
|
-
], signal);
|
|
368
|
-
if (!/Broadcast completed/.test(result)) throw new PhoneError("PHONE_INPUT_FAILED", "Keyboard input was not acknowledged");
|
|
402
|
+
const current = fresh.elements.filter((node) => sameTextEditor(target, node));
|
|
403
|
+
if (fresh.package !== observation.package || current.length !== 1) throw new PhoneError("PHONE_INPUT_NOT_FOCUSED", "The focused input field changed before replacement", 409);
|
|
404
|
+
target = current[0];
|
|
369
405
|
} finally {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
406
|
+
fresh.frame.fill(0);
|
|
407
|
+
}
|
|
408
|
+
if (target.text) {
|
|
409
|
+
if (!(await this.shell(serial, ["input"], signal)).includes("keycombination")) throw new PhoneError("PHONE_TEXT_INPUT_UNAVAILABLE", "This phone cannot safely select all text. Take over and replace the field manually.", 409);
|
|
410
|
+
try {
|
|
411
|
+
await input([
|
|
412
|
+
"keycombination",
|
|
413
|
+
"KEYCODE_CTRL_LEFT",
|
|
414
|
+
"KEYCODE_A"
|
|
415
|
+
]);
|
|
416
|
+
const selected = await this.observe(serial, signal);
|
|
417
|
+
try {
|
|
418
|
+
if (selected.package !== observation.package || selected.elements.filter((node) => sameTextEditor(target, node) && node.text === target.text).length !== 1) throw new Error("Editor changed during selection");
|
|
419
|
+
} finally {
|
|
420
|
+
selected.frame.fill(0);
|
|
421
|
+
}
|
|
422
|
+
} catch {
|
|
423
|
+
signal.throwIfAborted();
|
|
424
|
+
throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text selection started but the target field could not be verified. Take over and inspect the input field before retrying.", 409);
|
|
425
|
+
}
|
|
375
426
|
}
|
|
376
427
|
}
|
|
428
|
+
try {
|
|
429
|
+
if (ascii) await input(["text", action.text.replaceAll(" ", "%s")]);
|
|
430
|
+
else if (this.pasteText) await this.pasteText(action.text, signal);
|
|
431
|
+
else {
|
|
432
|
+
const { LocalScrcpyProvider } = await import("./scrcpy.js");
|
|
433
|
+
const provider = new LocalScrcpyProvider(this.adbPath, serial, () => {}, void 0, true);
|
|
434
|
+
try {
|
|
435
|
+
await provider.pasteText(action.text, signal);
|
|
436
|
+
} finally {
|
|
437
|
+
await provider.close();
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
await this.confirmText(serial, observation.package, target, (text) => action.mode === "replace" ? text === action.text : text.includes(action.text), signal);
|
|
441
|
+
} catch (error) {
|
|
442
|
+
signal.throwIfAborted();
|
|
443
|
+
if (error instanceof PhoneError && error.code === "PHONE_TEXT_INPUT_UNCONFIRMED") throw error;
|
|
444
|
+
throw new PhoneError("PHONE_TEXT_INPUT_UNCONFIRMED", "Text may have been sent but insertion could not be verified. Take over and inspect the input field before retrying.", 409);
|
|
445
|
+
}
|
|
377
446
|
break;
|
|
447
|
+
}
|
|
378
448
|
case "home":
|
|
379
449
|
await input(["keyevent", "KEYCODE_HOME"]);
|
|
380
450
|
break;
|
|
@@ -266,6 +266,14 @@ var CloudAdbConnection = class CloudAdbConnection {
|
|
|
266
266
|
} finally {
|
|
267
267
|
listing.dispose();
|
|
268
268
|
}
|
|
269
|
+
}, async (text, signal) => {
|
|
270
|
+
const { CloudScrcpyProvider } = await import("./cloud-scrcpy.js");
|
|
271
|
+
const provider = new CloudScrcpyProvider(this.endpoint, Buffer.from(this.key), () => {}, void 0, true);
|
|
272
|
+
try {
|
|
273
|
+
await provider.pasteText(text, signal);
|
|
274
|
+
} finally {
|
|
275
|
+
await provider.close();
|
|
276
|
+
}
|
|
269
277
|
});
|
|
270
278
|
}
|
|
271
279
|
};
|
|
@@ -3,6 +3,7 @@ import { ScrcpyProvider } from './scrcpy.js';
|
|
|
3
3
|
/** Dedicated authenticated ADB transport: no host ADB key, server or port forwarding. */
|
|
4
4
|
export declare class CloudScrcpyProvider extends ScrcpyProvider {
|
|
5
5
|
private endpoint;
|
|
6
|
+
private textOnly;
|
|
6
7
|
private connection;
|
|
7
8
|
private process?;
|
|
8
9
|
private video?;
|
|
@@ -10,11 +11,12 @@ export declare class CloudScrcpyProvider extends ScrcpyProvider {
|
|
|
10
11
|
private writer?;
|
|
11
12
|
private remote;
|
|
12
13
|
private scid;
|
|
13
|
-
constructor(endpoint: string, key: Buffer, onFailure: () => void, connect?: (address: string, credential: Buffer) => CloudAdbConnection);
|
|
14
|
+
constructor(endpoint: string, key: Buffer, onFailure: () => void, connect?: (address: string, credential: Buffer) => CloudAdbConnection, textOnly?: boolean);
|
|
14
15
|
foreground(signal: AbortSignal): Promise<string>;
|
|
15
16
|
protected startTransport(): Promise<void>;
|
|
16
17
|
private drain;
|
|
17
18
|
private readVideo;
|
|
19
|
+
private readControl;
|
|
18
20
|
protected write(buffer: Buffer): Promise<void>;
|
|
19
21
|
protected cleanup(): Promise<void>;
|
|
20
22
|
}
|
|
@@ -17,9 +17,10 @@ var CloudScrcpyProvider = class extends ScrcpyProvider {
|
|
|
17
17
|
writer;
|
|
18
18
|
remote = "";
|
|
19
19
|
scid = "";
|
|
20
|
-
constructor(endpoint, key, onFailure, connect = (address, credential) => new CloudAdbConnection(address, credential)) {
|
|
20
|
+
constructor(endpoint, key, onFailure, connect = (address, credential) => new CloudAdbConnection(address, credential), textOnly = false) {
|
|
21
21
|
super(onFailure);
|
|
22
22
|
this.endpoint = endpoint;
|
|
23
|
+
this.textOnly = textOnly;
|
|
23
24
|
this.connection = connect(endpoint, key);
|
|
24
25
|
}
|
|
25
26
|
foreground(signal) {
|
|
@@ -48,7 +49,7 @@ var CloudScrcpyProvider = class extends ScrcpyProvider {
|
|
|
48
49
|
await sync.dispose();
|
|
49
50
|
}
|
|
50
51
|
if (this.closing) throw new Error("Video closed");
|
|
51
|
-
this.process = await adb.createSocket(`exec:CLASSPATH=${this.remote} app_process / com.genymobile.scrcpy.Server ${SCRCPY_VERSION} scid=${this.scid} tunnel_forward=true audio=false control=true cleanup=false max_size=960 max_fps=30 video_bit_rate=2000000 video_codec=h264 video_codec_options=i-frame-interval=1 send_dummy_byte=false send_device_meta=false send_codec_meta=true send_frame_meta=true clipboard_autosync=false`);
|
|
52
|
+
this.process = await adb.createSocket(`exec:CLASSPATH=${this.remote} app_process / com.genymobile.scrcpy.Server ${SCRCPY_VERSION} scid=${this.scid} tunnel_forward=true audio=false control=true cleanup=false max_size=960 max_fps=30 video_bit_rate=2000000 video_codec=h264 video_codec_options=i-frame-interval=1 send_dummy_byte=false send_device_meta=false send_codec_meta=true send_frame_meta=true clipboard_autosync=false${this.textOnly ? " video=false power_on=false" : ""}`);
|
|
52
53
|
this.drain(this.process);
|
|
53
54
|
for (let attempt = 0; attempt < 60; attempt++) {
|
|
54
55
|
if (this.closing) throw new Error("Video closed");
|
|
@@ -60,9 +61,16 @@ var CloudScrcpyProvider = class extends ScrcpyProvider {
|
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
if (!this.video) throw new Error("Scrcpy connection timed out");
|
|
64
|
+
if (this.textOnly) {
|
|
65
|
+
this.control = this.video;
|
|
66
|
+
this.video = void 0;
|
|
67
|
+
this.writer = this.control.writable.getWriter();
|
|
68
|
+
this.readControl(this.control);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
63
71
|
this.control = await adb.createSocket(`localabstract:${socketName}`);
|
|
64
72
|
this.writer = this.control.writable.getWriter();
|
|
65
|
-
this.
|
|
73
|
+
this.readControl(this.control);
|
|
66
74
|
this.readVideo(this.video);
|
|
67
75
|
} finally {
|
|
68
76
|
clearTimeout(timer);
|
|
@@ -81,6 +89,12 @@ var CloudScrcpyProvider = class extends ScrcpyProvider {
|
|
|
81
89
|
} catch {}
|
|
82
90
|
if (!this.closing) this.fail();
|
|
83
91
|
}
|
|
92
|
+
async readControl(socket) {
|
|
93
|
+
try {
|
|
94
|
+
for await (const chunk of socket.readable) this.textChannel.receive(Buffer.from(chunk));
|
|
95
|
+
} catch {}
|
|
96
|
+
if (!this.closing) this.fail();
|
|
97
|
+
}
|
|
84
98
|
async write(buffer) {
|
|
85
99
|
if (!this.writer) throw new PhoneError("PHONE_INPUT_DISCONNECTED", "Cloud phone input channel unavailable");
|
|
86
100
|
const timer = setTimeout(() => this.connection.close(), 2e3);
|
|
@@ -14,6 +14,8 @@ export declare const MOCK_PHONE_GOAL = "Open Android Settings and inspect About
|
|
|
14
14
|
export declare const PhoneConfigSchema: z.ZodPrefault<z.ZodObject<{
|
|
15
15
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
16
16
|
adbPath: z.ZodOptional<z.ZodString>;
|
|
17
|
+
semanticControls: z.ZodDefault<z.ZodBoolean>;
|
|
18
|
+
hierarchicalPlanning: z.ZodDefault<z.ZodBoolean>;
|
|
17
19
|
maxActionsPerSession: z.ZodDefault<z.ZodNumber>;
|
|
18
20
|
maxModelRequests: z.ZodDefault<z.ZodNumber>;
|
|
19
21
|
maxOperationDurationMs: z.ZodDefault<z.ZodNumber>;
|
|
@@ -29,6 +31,10 @@ export declare const PhoneDeviceSchema: z.ZodObject<{
|
|
|
29
31
|
all: "all";
|
|
30
32
|
selected: "selected";
|
|
31
33
|
}>>;
|
|
34
|
+
textInput: z.ZodOptional<z.ZodEnum<{
|
|
35
|
+
manual: "manual";
|
|
36
|
+
auto: "auto";
|
|
37
|
+
}>>;
|
|
32
38
|
allowedApps: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
33
39
|
connection: z.ZodOptional<z.ZodObject<{
|
|
34
40
|
kind: z.ZodLiteral<"aliyun-adb">;
|
|
@@ -43,18 +49,42 @@ export type PhoneApplication = {
|
|
|
43
49
|
packageName: string;
|
|
44
50
|
label: string;
|
|
45
51
|
};
|
|
52
|
+
export type PhoneTextInputStatus = {
|
|
53
|
+
androidSdk: number;
|
|
54
|
+
unicode: 'available' | 'setup_required' | 'unsupported';
|
|
55
|
+
method: 'scrcpy-clipboard' | 'provider-native';
|
|
56
|
+
keyboardRequired: false;
|
|
57
|
+
};
|
|
46
58
|
export type DiscoveredPhone = {
|
|
47
59
|
serial: string;
|
|
48
60
|
state: string;
|
|
49
61
|
name: string;
|
|
50
62
|
emulator: boolean;
|
|
51
63
|
};
|
|
64
|
+
export declare const PhoneElementSelectorSchema: z.ZodObject<{
|
|
65
|
+
resourceId: z.ZodOptional<z.ZodString>;
|
|
66
|
+
text: z.ZodOptional<z.ZodString>;
|
|
67
|
+
description: z.ZodOptional<z.ZodString>;
|
|
68
|
+
}, z.core.$strict>;
|
|
69
|
+
export type PhoneElementSelector = z.infer<typeof PhoneElementSelectorSchema>;
|
|
70
|
+
export type PhoneCapabilities = {
|
|
71
|
+
semanticControls?: boolean;
|
|
72
|
+
hierarchicalPlanning?: boolean;
|
|
73
|
+
};
|
|
52
74
|
export declare const PhoneActionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
53
75
|
type: z.ZodLiteral<"launch">;
|
|
54
76
|
package: z.ZodString;
|
|
55
77
|
}, z.core.$strict>, z.ZodObject<{
|
|
56
78
|
type: z.ZodLiteral<"tap">;
|
|
57
79
|
point: z.ZodArray<z.ZodNumber>;
|
|
80
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
81
|
+
type: z.ZodLiteral<"tapElement">;
|
|
82
|
+
frameId: z.ZodString;
|
|
83
|
+
selector: z.ZodObject<{
|
|
84
|
+
resourceId: z.ZodOptional<z.ZodString>;
|
|
85
|
+
text: z.ZodOptional<z.ZodString>;
|
|
86
|
+
description: z.ZodOptional<z.ZodString>;
|
|
87
|
+
}, z.core.$strict>;
|
|
58
88
|
}, z.core.$strict>, z.ZodObject<{
|
|
59
89
|
type: z.ZodLiteral<"doubleTap">;
|
|
60
90
|
point: z.ZodArray<z.ZodNumber>;
|
|
@@ -70,6 +100,10 @@ export declare const PhoneActionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
70
100
|
}, z.core.$strict>, z.ZodObject<{
|
|
71
101
|
type: z.ZodLiteral<"typeText">;
|
|
72
102
|
text: z.ZodString;
|
|
103
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
104
|
+
replace: "replace";
|
|
105
|
+
insert: "insert";
|
|
106
|
+
}>>;
|
|
73
107
|
}, z.core.$strict>, z.ZodObject<{
|
|
74
108
|
type: z.ZodEnum<{
|
|
75
109
|
home: "home";
|
|
@@ -88,6 +122,14 @@ export declare const PhoneDecisionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
88
122
|
}, z.core.$strict>, z.ZodObject<{
|
|
89
123
|
type: z.ZodLiteral<"tap">;
|
|
90
124
|
point: z.ZodArray<z.ZodNumber>;
|
|
125
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
126
|
+
type: z.ZodLiteral<"tapElement">;
|
|
127
|
+
frameId: z.ZodString;
|
|
128
|
+
selector: z.ZodObject<{
|
|
129
|
+
resourceId: z.ZodOptional<z.ZodString>;
|
|
130
|
+
text: z.ZodOptional<z.ZodString>;
|
|
131
|
+
description: z.ZodOptional<z.ZodString>;
|
|
132
|
+
}, z.core.$strict>;
|
|
91
133
|
}, z.core.$strict>, z.ZodObject<{
|
|
92
134
|
type: z.ZodLiteral<"doubleTap">;
|
|
93
135
|
point: z.ZodArray<z.ZodNumber>;
|
|
@@ -103,6 +145,10 @@ export declare const PhoneDecisionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
103
145
|
}, z.core.$strict>, z.ZodObject<{
|
|
104
146
|
type: z.ZodLiteral<"typeText">;
|
|
105
147
|
text: z.ZodString;
|
|
148
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
149
|
+
replace: "replace";
|
|
150
|
+
insert: "insert";
|
|
151
|
+
}>>;
|
|
106
152
|
}, z.core.$strict>, z.ZodObject<{
|
|
107
153
|
type: z.ZodEnum<{
|
|
108
154
|
home: "home";
|
|
@@ -140,6 +186,17 @@ export type PhoneObservation = {
|
|
|
140
186
|
frame: Buffer;
|
|
141
187
|
elements: PhoneElement[];
|
|
142
188
|
};
|
|
189
|
+
export declare const PhoneCompletionSchema: z.ZodObject<{
|
|
190
|
+
appPackage: z.ZodOptional<z.ZodString>;
|
|
191
|
+
textAny: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
192
|
+
textAll: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
193
|
+
field: z.ZodOptional<z.ZodObject<{
|
|
194
|
+
resourceId: z.ZodString;
|
|
195
|
+
value: z.ZodString;
|
|
196
|
+
}, z.core.$strict>>;
|
|
197
|
+
requireChange: z.ZodOptional<z.ZodBoolean>;
|
|
198
|
+
}, z.core.$strict>;
|
|
199
|
+
export type PhoneCompletion = z.infer<typeof PhoneCompletionSchema>;
|
|
143
200
|
export declare const PhoneInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
144
201
|
op: z.ZodLiteral<"discover">;
|
|
145
202
|
}, z.core.$strict>, z.ZodObject<{
|
|
@@ -150,6 +207,7 @@ export declare const PhoneInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
150
207
|
control: "control";
|
|
151
208
|
}>;
|
|
152
209
|
appPackage: z.ZodOptional<z.ZodString>;
|
|
210
|
+
settingsPage: z.ZodOptional<z.ZodLiteral<"about-phone">>;
|
|
153
211
|
}, z.core.$strict>, z.ZodObject<{
|
|
154
212
|
op: z.ZodLiteral<"observe">;
|
|
155
213
|
}, z.core.$strict>, z.ZodObject<{
|
|
@@ -160,6 +218,16 @@ export declare const PhoneInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
160
218
|
goal: z.ZodString;
|
|
161
219
|
scenario: z.ZodOptional<z.ZodLiteral<"settings-about">>;
|
|
162
220
|
expectText: z.ZodOptional<z.ZodString>;
|
|
221
|
+
completion: z.ZodOptional<z.ZodObject<{
|
|
222
|
+
appPackage: z.ZodOptional<z.ZodString>;
|
|
223
|
+
textAny: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
224
|
+
textAll: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
225
|
+
field: z.ZodOptional<z.ZodObject<{
|
|
226
|
+
resourceId: z.ZodString;
|
|
227
|
+
value: z.ZodString;
|
|
228
|
+
}, z.core.$strict>>;
|
|
229
|
+
requireChange: z.ZodOptional<z.ZodBoolean>;
|
|
230
|
+
}, z.core.$strict>>;
|
|
163
231
|
maxActions: z.ZodDefault<z.ZodNumber>;
|
|
164
232
|
}, z.core.$strict>, z.ZodObject<{
|
|
165
233
|
op: z.ZodEnum<{
|
|
@@ -204,6 +272,23 @@ export type PhoneReport = {
|
|
|
204
272
|
controlEpoch?: number;
|
|
205
273
|
handoff?: 'idle' | 'acquiring' | 'returning';
|
|
206
274
|
currentAction?: PhoneAction['type'];
|
|
275
|
+
diagnostics?: {
|
|
276
|
+
stalePredictions: number;
|
|
277
|
+
protocolRepairs: number;
|
|
278
|
+
unchangedActions: number;
|
|
279
|
+
completionCorrections: number;
|
|
280
|
+
semanticActions?: number;
|
|
281
|
+
semanticRejections?: number;
|
|
282
|
+
plannedSubgoals?: number;
|
|
283
|
+
completedSubgoals?: number;
|
|
284
|
+
backReplans?: number;
|
|
285
|
+
focusReplans?: number;
|
|
286
|
+
focusRecoveries?: number;
|
|
287
|
+
resumedTextInputs?: number;
|
|
288
|
+
numericActions?: number;
|
|
289
|
+
numericConfirmedSteps?: number;
|
|
290
|
+
numericMismatches?: number;
|
|
291
|
+
};
|
|
207
292
|
};
|
|
208
293
|
export declare class PhoneError extends Error {
|
|
209
294
|
readonly code: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
//#region src/phone/contracts.ts
|
|
4
|
-
var PhoneProfileSchema, PhoneModelMetadataSchema, MOCK_PHONE_MODEL, MOCK_PHONE_GOAL, PhoneConfigSchema, PhoneDeviceSchema, Point, PhoneActionSchema, PhoneDecisionSchema, PhoneInputSchema, PhoneError;
|
|
4
|
+
var PhoneProfileSchema, PhoneModelMetadataSchema, MOCK_PHONE_MODEL, MOCK_PHONE_GOAL, PhoneConfigSchema, PhoneDeviceSchema, Point, PhoneElementSelectorSchema, PhoneActionSchema, PhoneDecisionSchema, PhoneCompletionSchema, PhoneInputSchema, PhoneError;
|
|
5
5
|
var init_contracts = __esmMin((() => {
|
|
6
6
|
PhoneProfileSchema = z.enum(["autoglm-phone-v1", "structured-phone-v1"]);
|
|
7
7
|
PhoneModelMetadataSchema = z.object({ profile: PhoneProfileSchema }).strict();
|
|
@@ -10,6 +10,8 @@ var init_contracts = __esmMin((() => {
|
|
|
10
10
|
PhoneConfigSchema = z.object({
|
|
11
11
|
enabled: z.boolean().default(false),
|
|
12
12
|
adbPath: z.string().min(1).optional(),
|
|
13
|
+
semanticControls: z.boolean().default(false),
|
|
14
|
+
hierarchicalPlanning: z.boolean().default(false),
|
|
13
15
|
maxActionsPerSession: z.number().int().min(1).max(80).default(40),
|
|
14
16
|
maxModelRequests: z.number().int().min(1).max(120).default(60),
|
|
15
17
|
maxOperationDurationMs: z.number().int().min(1e3).max(9e5).default(3e5),
|
|
@@ -21,6 +23,7 @@ var init_contracts = __esmMin((() => {
|
|
|
21
23
|
name: z.string().trim().min(1).max(100),
|
|
22
24
|
enabled: z.boolean().default(true),
|
|
23
25
|
appAccess: z.enum(["all", "selected"]).optional(),
|
|
26
|
+
textInput: z.enum(["auto", "manual"]).optional(),
|
|
24
27
|
allowedApps: z.array(z.string().regex(/^[a-zA-Z][\w]*(?:\.[\w]+)+$/)).max(500).default([]),
|
|
25
28
|
connection: z.object({
|
|
26
29
|
kind: z.literal("aliyun-adb"),
|
|
@@ -31,6 +34,11 @@ var init_contracts = __esmMin((() => {
|
|
|
31
34
|
revision: z.number().int().positive()
|
|
32
35
|
}).strict();
|
|
33
36
|
Point = z.array(z.number().finite().min(0).max(1e3)).length(2);
|
|
37
|
+
PhoneElementSelectorSchema = z.object({
|
|
38
|
+
resourceId: z.string().min(1).max(300).optional(),
|
|
39
|
+
text: z.string().min(1).max(4e3).optional(),
|
|
40
|
+
description: z.string().min(1).max(1e3).optional()
|
|
41
|
+
}).strict().refine((value) => Boolean(value.resourceId || value.text || value.description), "Specify an exact native element identity");
|
|
34
42
|
PhoneActionSchema = z.discriminatedUnion("type", [
|
|
35
43
|
z.object({
|
|
36
44
|
type: z.literal("launch"),
|
|
@@ -40,6 +48,11 @@ var init_contracts = __esmMin((() => {
|
|
|
40
48
|
type: z.literal("tap"),
|
|
41
49
|
point: Point
|
|
42
50
|
}).strict(),
|
|
51
|
+
z.object({
|
|
52
|
+
type: z.literal("tapElement"),
|
|
53
|
+
frameId: z.string().min(1).max(200),
|
|
54
|
+
selector: PhoneElementSelectorSchema
|
|
55
|
+
}).strict(),
|
|
43
56
|
z.object({
|
|
44
57
|
type: z.literal("doubleTap"),
|
|
45
58
|
point: Point
|
|
@@ -57,7 +70,8 @@ var init_contracts = __esmMin((() => {
|
|
|
57
70
|
}).strict(),
|
|
58
71
|
z.object({
|
|
59
72
|
type: z.literal("typeText"),
|
|
60
|
-
text: z.string().min(1).max(4e3)
|
|
73
|
+
text: z.string().min(1).max(4e3),
|
|
74
|
+
mode: z.enum(["insert", "replace"]).optional()
|
|
61
75
|
}).strict(),
|
|
62
76
|
z.object({ type: z.enum(["back", "home"]) }).strict(),
|
|
63
77
|
z.object({
|
|
@@ -79,20 +93,32 @@ var init_contracts = __esmMin((() => {
|
|
|
79
93
|
reason: z.string().max(1e3)
|
|
80
94
|
}).strict()
|
|
81
95
|
]);
|
|
96
|
+
PhoneCompletionSchema = z.object({
|
|
97
|
+
appPackage: z.string().regex(/^[a-zA-Z][\w]*(?:\.[\w]+)+$/).optional(),
|
|
98
|
+
textAny: z.array(z.string().min(1).max(200)).min(1).max(20).optional(),
|
|
99
|
+
textAll: z.array(z.string().min(1).max(200)).min(1).max(20).optional(),
|
|
100
|
+
field: z.object({
|
|
101
|
+
resourceId: z.string().min(1).max(300),
|
|
102
|
+
value: z.string().max(4e3)
|
|
103
|
+
}).strict().optional(),
|
|
104
|
+
requireChange: z.boolean().optional()
|
|
105
|
+
}).strict().refine((value) => value.appPackage || value.textAny || value.textAll || value.field, "Specify at least one UI condition");
|
|
82
106
|
PhoneInputSchema = z.discriminatedUnion("op", [
|
|
83
107
|
z.object({ op: z.literal("discover") }).strict(),
|
|
84
108
|
z.object({
|
|
85
109
|
op: z.literal("open"),
|
|
86
110
|
deviceId: z.string().uuid().optional(),
|
|
87
111
|
mode: z.enum(["observe", "control"]),
|
|
88
|
-
appPackage: z.string().regex(/^[a-zA-Z][\w]*(?:\.[\w]+)+$/).optional()
|
|
89
|
-
|
|
112
|
+
appPackage: z.string().regex(/^[a-zA-Z][\w]*(?:\.[\w]+)+$/).optional(),
|
|
113
|
+
settingsPage: z.literal("about-phone").optional()
|
|
114
|
+
}).strict().refine((input) => !input.settingsPage || input.mode === "control" && input.appPackage === "com.android.settings", "About phone requires authorized Settings control"),
|
|
90
115
|
z.object({ op: z.literal("observe") }).strict(),
|
|
91
116
|
z.object({
|
|
92
117
|
op: z.enum(["run", "step"]),
|
|
93
118
|
goal: z.string().trim().min(1).max(2e3),
|
|
94
119
|
scenario: z.literal("settings-about").optional(),
|
|
95
120
|
expectText: z.string().min(1).max(200).optional(),
|
|
121
|
+
completion: PhoneCompletionSchema.optional(),
|
|
96
122
|
maxActions: z.number().int().min(1).max(12).default(6)
|
|
97
123
|
}).strict(),
|
|
98
124
|
z.object({ op: z.enum([
|
|
@@ -113,4 +139,4 @@ var init_contracts = __esmMin((() => {
|
|
|
113
139
|
}));
|
|
114
140
|
//#endregion
|
|
115
141
|
init_contracts();
|
|
116
|
-
export { MOCK_PHONE_GOAL, MOCK_PHONE_MODEL, PhoneActionSchema, PhoneConfigSchema, PhoneDecisionSchema, PhoneDeviceSchema, PhoneError, PhoneInputSchema, PhoneModelMetadataSchema, PhoneProfileSchema, init_contracts };
|
|
142
|
+
export { MOCK_PHONE_GOAL, MOCK_PHONE_MODEL, PhoneActionSchema, PhoneCompletionSchema, PhoneConfigSchema, PhoneDecisionSchema, PhoneDeviceSchema, PhoneElementSelectorSchema, PhoneError, PhoneInputSchema, PhoneModelMetadataSchema, PhoneProfileSchema, init_contracts };
|