@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
|
@@ -17,11 +17,14 @@ var ExtensionDriver = class {
|
|
|
17
17
|
async createSession(_sessionId) {
|
|
18
18
|
await this.connect();
|
|
19
19
|
}
|
|
20
|
-
async closeSession(sessionId) {
|
|
21
|
-
await this.send({
|
|
20
|
+
async closeSession(sessionId, target) {
|
|
21
|
+
const result = await this.send({
|
|
22
22
|
action: "close",
|
|
23
|
-
sessionId
|
|
23
|
+
sessionId,
|
|
24
|
+
...target ? { target } : {}
|
|
24
25
|
});
|
|
26
|
+
if ("error" in result) throw new Error(result.error.message);
|
|
27
|
+
if (!result.receipt.verified) throw new Error("Browser control release was not verified");
|
|
25
28
|
}
|
|
26
29
|
navigate(sessionId, input, signal) {
|
|
27
30
|
return this.send({
|
|
@@ -9,10 +9,10 @@ import { BROWSER_EXTENSION_ID, BROWSER_NATIVE_HOST_NAME } from "../extension-ide
|
|
|
9
9
|
import "../native-messaging-host.js";
|
|
10
10
|
import { resolvePackageRoot } from "../../infra/update-check.js";
|
|
11
11
|
import { dirname, join } from "node:path";
|
|
12
|
-
import { chmodSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
12
|
+
import { accessSync, chmodSync, constants, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
13
13
|
import { fileURLToPath } from "node:url";
|
|
14
|
-
import { execFileSync, spawn } from "node:child_process";
|
|
15
14
|
import { createHash } from "node:crypto";
|
|
15
|
+
import { execFileSync, spawn } from "node:child_process";
|
|
16
16
|
import { readFile, readdir, rm } from "node:fs/promises";
|
|
17
17
|
import AdmZip from "adm-zip";
|
|
18
18
|
//#region src/browser/providers/browser-ext-install.ts
|
|
@@ -384,6 +384,7 @@ function browserNativeHostDoctor(platform = process.platform, home = process.env
|
|
|
384
384
|
const manifestPaths = (platform === "win32" ? windowsRegisteredNativeManifests() : directories.map((directory) => join(directory, `${BROWSER_NATIVE_HOST_NAME}.json`))).filter((manifestPath) => {
|
|
385
385
|
try {
|
|
386
386
|
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
387
|
+
if (typeof manifest.path === "string" && platform !== "win32") accessSync(manifest.path, constants.X_OK);
|
|
387
388
|
return manifest.name === "ai.xopc.browser" && typeof manifest.path === "string" && existsSync(manifest.path) && Array.isArray(manifest.allowed_origins) && manifest.allowed_origins.includes(`chrome-extension://gopbfhaojnnhiheiikblejnpgmfmkmgd/`);
|
|
388
389
|
} catch {
|
|
389
390
|
return false;
|
|
@@ -5,6 +5,8 @@ export interface BrowserRuntimeOptions {
|
|
|
5
5
|
getConfig: () => Config['browser'];
|
|
6
6
|
createDriver: () => Promise<BrowserDriver>;
|
|
7
7
|
allowedUploadRoots?: string[];
|
|
8
|
+
canRestoreSetupSession?: (taskKey: string, sessionId: string) => boolean;
|
|
9
|
+
isTrustedSetupUrl?: (taskKey: string, url: string) => boolean;
|
|
8
10
|
emit?: (type: string, payload: unknown) => void;
|
|
9
11
|
resolveTarget?: (taskKey: string) => BrowserTarget | undefined;
|
|
10
12
|
}
|
|
@@ -14,8 +16,9 @@ export declare class BrowserRuntime {
|
|
|
14
16
|
private sessionsByTask;
|
|
15
17
|
constructor(options: BrowserRuntimeOptions);
|
|
16
18
|
execute(taskKey: string, input: BrowserActionInput, signal?: AbortSignal): Promise<BrowserControlResult>;
|
|
19
|
+
hasSessions(): boolean;
|
|
17
20
|
shutdown(): Promise<void>;
|
|
18
|
-
closeTaskSession(taskKey: string): Promise<void>;
|
|
21
|
+
closeTaskSession(taskKey: string, target?: BrowserTarget): Promise<void>;
|
|
19
22
|
private dispatch;
|
|
20
23
|
private executeSequence;
|
|
21
24
|
private actionDenied;
|
|
@@ -11,7 +11,7 @@ var BrowserRuntime = class {
|
|
|
11
11
|
}
|
|
12
12
|
async execute(taskKey, input, signal) {
|
|
13
13
|
this.evictExpiredSessions();
|
|
14
|
-
if (!this.options.getConfig().enabled) return failure("DRIVER_UNAVAILABLE", "Browser Control is disabled.");
|
|
14
|
+
if (!this.options.getConfig().enabled && input.action !== "close") return failure("DRIVER_UNAVAILABLE", "Browser Control is disabled.");
|
|
15
15
|
if (signal?.aborted) return failure("ABORTED", "Operation was aborted.");
|
|
16
16
|
const resolvedTarget = input.target ? void 0 : this.options.resolveTarget?.(taskKey);
|
|
17
17
|
const effectiveInput = input.target || !resolvedTarget ? input : {
|
|
@@ -55,21 +55,24 @@ var BrowserRuntime = class {
|
|
|
55
55
|
}
|
|
56
56
|
return result;
|
|
57
57
|
}
|
|
58
|
+
hasSessions() {
|
|
59
|
+
return this.sessionsByTask.size > 0;
|
|
60
|
+
}
|
|
58
61
|
async shutdown() {
|
|
59
62
|
await this.driver?.disconnect();
|
|
60
63
|
this.driver = null;
|
|
61
64
|
this.sessionsByTask.clear();
|
|
62
65
|
}
|
|
63
|
-
async closeTaskSession(taskKey) {
|
|
66
|
+
async closeTaskSession(taskKey, target) {
|
|
64
67
|
const session = this.sessionsByTask.get(taskKey);
|
|
65
68
|
if (!session) return;
|
|
66
|
-
await this.driver?.closeSession(session.id);
|
|
69
|
+
await this.driver?.closeSession(session.id, target);
|
|
67
70
|
this.sessionsByTask.delete(taskKey);
|
|
68
71
|
this.options.emit?.("browser.session.closed", { sessionId: session.id });
|
|
69
72
|
}
|
|
70
73
|
async dispatch(driver, session, input, signal) {
|
|
71
74
|
if (input.action === "close") {
|
|
72
|
-
await this.closeTaskSession(session.taskKey);
|
|
75
|
+
await this.closeTaskSession(session.taskKey, input.target);
|
|
73
76
|
return {
|
|
74
77
|
ok: true,
|
|
75
78
|
receipt: {
|
|
@@ -91,22 +94,22 @@ var BrowserRuntime = class {
|
|
|
91
94
|
}
|
|
92
95
|
};
|
|
93
96
|
if (input.action === "navigate") {
|
|
94
|
-
const blocked = this.validateUrl(input.url);
|
|
97
|
+
const blocked = this.validateUrl(input.url, session.taskKey);
|
|
95
98
|
if (blocked) return failure("BLOCKED_URL", blocked);
|
|
96
99
|
if (this.crossDomainPolicy(session.observation?.url, input.url) === "deny") return failure("BLOCKED_URL", "Cross-domain navigation is denied by policy.");
|
|
97
100
|
const result = await driver.navigate(session.id, input, signal);
|
|
98
|
-
return this.validateRedirect(input.url, result);
|
|
101
|
+
return this.validateRedirect(input.url, result, session.taskKey);
|
|
99
102
|
}
|
|
100
103
|
if (input.action === "tabs") {
|
|
101
104
|
if (input.url) {
|
|
102
|
-
const blocked = this.validateUrl(input.url);
|
|
105
|
+
const blocked = this.validateUrl(input.url, session.taskKey);
|
|
103
106
|
if (blocked) return failure("BLOCKED_URL", blocked);
|
|
104
107
|
if (this.crossDomainPolicy(session.observation?.url, input.url) === "deny") return failure("BLOCKED_URL", "Cross-domain navigation is denied by policy.");
|
|
105
108
|
}
|
|
106
109
|
const result = await driver.tabs(session.id, input, signal);
|
|
107
110
|
if (!input.url || !result.ok) return result;
|
|
108
111
|
const finalUrl = result.receipt.tabs?.find((tab) => tab.active)?.url;
|
|
109
|
-
const blocked = finalUrl ? this.blockedRedirect(finalUrl) : "The created tab did not report its final URL.";
|
|
112
|
+
const blocked = finalUrl ? this.blockedRedirect(finalUrl, session.taskKey) : "The created tab did not report its final URL.";
|
|
110
113
|
return blocked ? failure("BLOCKED_URL", blocked) : result;
|
|
111
114
|
}
|
|
112
115
|
if (input.action === "sequence") return this.executeSequence(driver, session, input, signal);
|
|
@@ -119,12 +122,12 @@ var BrowserRuntime = class {
|
|
|
119
122
|
}
|
|
120
123
|
if (this.actionDenied(input, risk)) return failure("INVALID_INPUT", `Browser action is denied by policy (${risk}).`);
|
|
121
124
|
if (input.action === "click" && target?.href) {
|
|
122
|
-
const blocked = this.validateUrl(target.href);
|
|
125
|
+
const blocked = this.validateUrl(target.href, session.taskKey);
|
|
123
126
|
if (blocked) return failure("BLOCKED_URL", blocked);
|
|
124
127
|
if (this.crossDomainPolicy(session.observation?.url, target.href) === "deny") return failure("BLOCKED_URL", "Cross-domain navigation is denied by policy.");
|
|
125
128
|
}
|
|
126
129
|
const result = await driver.perform(session.id, input, signal);
|
|
127
|
-
return withRisk(this.validateRedirect(session.observation?.url ?? "", result), risk);
|
|
130
|
+
return withRisk(this.validateRedirect(session.observation?.url ?? "", result, session.taskKey), risk);
|
|
128
131
|
}
|
|
129
132
|
async executeSequence(driver, session, input, signal) {
|
|
130
133
|
const config = this.options.getConfig();
|
|
@@ -171,27 +174,27 @@ var BrowserRuntime = class {
|
|
|
171
174
|
"sensitive"
|
|
172
175
|
].includes(risk);
|
|
173
176
|
}
|
|
174
|
-
validateUrl(url) {
|
|
177
|
+
validateUrl(url, taskKey) {
|
|
175
178
|
if (containsApiKeyPattern(url)) return "URL contains a credential-like value.";
|
|
176
179
|
try {
|
|
177
180
|
const host = new URL(url).hostname.toLowerCase();
|
|
178
|
-
assertBrowserUrlAllowed(url, { privateHostAllowed: this.options.getConfig().security.allowedPrivateHosts.some((candidate) => candidate.toLowerCase() === host) });
|
|
181
|
+
assertBrowserUrlAllowed(url, { privateHostAllowed: this.options.getConfig().security.allowedPrivateHosts.some((candidate) => candidate.toLowerCase() === host) || this.options.isTrustedSetupUrl?.(taskKey, url) === true });
|
|
179
182
|
return null;
|
|
180
183
|
} catch (error) {
|
|
181
184
|
return error instanceof Error ? error.message : String(error);
|
|
182
185
|
}
|
|
183
186
|
}
|
|
184
|
-
validateRedirect(requestedUrl, result) {
|
|
187
|
+
validateRedirect(requestedUrl, result, taskKey) {
|
|
185
188
|
if (!result.ok || !result.receipt.observation) return result;
|
|
186
189
|
const finalUrl = result.receipt.observation.url;
|
|
187
190
|
if (finalUrl === requestedUrl) return result;
|
|
188
|
-
const blocked = this.blockedRedirect(finalUrl);
|
|
191
|
+
const blocked = this.blockedRedirect(finalUrl, taskKey);
|
|
189
192
|
return blocked ? failure("BLOCKED_URL", blocked, result.receipt.observation) : result;
|
|
190
193
|
}
|
|
191
|
-
blockedRedirect(finalUrl) {
|
|
194
|
+
blockedRedirect(finalUrl, taskKey) {
|
|
192
195
|
try {
|
|
193
196
|
const host = new URL(finalUrl).hostname.toLowerCase();
|
|
194
|
-
return checkPostRedirectUrl(finalUrl, { privateHostAllowed: this.options.getConfig().security.allowedPrivateHosts.some((candidate) => candidate.toLowerCase() === host) });
|
|
197
|
+
return checkPostRedirectUrl(finalUrl, { privateHostAllowed: this.options.getConfig().security.allowedPrivateHosts.some((candidate) => candidate.toLowerCase() === host) || this.options.isTrustedSetupUrl?.(taskKey, finalUrl) === true });
|
|
195
198
|
} catch {
|
|
196
199
|
return "Browser returned an invalid final URL.";
|
|
197
200
|
}
|
|
@@ -222,7 +225,16 @@ var BrowserRuntime = class {
|
|
|
222
225
|
async resolveSession(taskKey, requestedId) {
|
|
223
226
|
const existing = this.sessionsByTask.get(taskKey);
|
|
224
227
|
if (existing) return !requestedId || requestedId === existing.id ? existing : null;
|
|
225
|
-
if (requestedId)
|
|
228
|
+
if (requestedId) {
|
|
229
|
+
if (!this.options.canRestoreSetupSession?.(taskKey, requestedId)) return null;
|
|
230
|
+
const restored = {
|
|
231
|
+
id: requestedId,
|
|
232
|
+
taskKey,
|
|
233
|
+
lastUsedAt: Date.now()
|
|
234
|
+
};
|
|
235
|
+
this.sessionsByTask.set(taskKey, restored);
|
|
236
|
+
return restored;
|
|
237
|
+
}
|
|
226
238
|
const session = {
|
|
227
239
|
id: randomUUID(),
|
|
228
240
|
taskKey,
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BrowserSetup } from './types.js';
|
|
2
|
+
export declare function readBrowserSetup(id: string): BrowserSetup | undefined;
|
|
3
|
+
export declare function findBrowserSetup(conversationId: string, agentId: string): BrowserSetup | undefined;
|
|
4
|
+
export declare function createBrowserSetup(conversationId: string, agentId: string, configRevision: string): BrowserSetup;
|
|
5
|
+
export declare function saveBrowserSetup(next: BrowserSetup, expectedRevision: number): BrowserSetup;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
//#region src/browser/setup/repository.ts
|
|
4
|
+
init_transaction();
|
|
5
|
+
function readBrowserSetup(id) {
|
|
6
|
+
const row = getSqliteDatabase().prepare("SELECT payload_json FROM browser_setup_runs WHERE id = ?").get(id);
|
|
7
|
+
return row ? JSON.parse(row.payload_json) : void 0;
|
|
8
|
+
}
|
|
9
|
+
function findBrowserSetup(conversationId, agentId) {
|
|
10
|
+
const row = getSqliteDatabase().prepare("SELECT payload_json FROM browser_setup_runs WHERE conversation_id = ? AND agent_id = ? ORDER BY updated_at DESC, rowid DESC LIMIT 1").get(conversationId, agentId);
|
|
11
|
+
return row ? JSON.parse(row.payload_json) : void 0;
|
|
12
|
+
}
|
|
13
|
+
function createBrowserSetup(conversationId, agentId, configRevision) {
|
|
14
|
+
return runSqliteWriteTransaction((db) => {
|
|
15
|
+
const existing = findBrowserSetup(conversationId, agentId);
|
|
16
|
+
if (existing && existing.state !== "cancelled" && existing.state !== "completed") return existing;
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
const setup = {
|
|
19
|
+
id: randomUUID(),
|
|
20
|
+
conversationId,
|
|
21
|
+
agentId,
|
|
22
|
+
configRevision,
|
|
23
|
+
state: "plan_ready",
|
|
24
|
+
revision: 1,
|
|
25
|
+
createdAt: now,
|
|
26
|
+
updatedAt: now
|
|
27
|
+
};
|
|
28
|
+
db.prepare("INSERT INTO browser_setup_runs (id, conversation_id, agent_id, revision, updated_at, payload_json) VALUES (?, ?, ?, ?, ?, ?)").run(setup.id, conversationId, agentId, setup.revision, now, JSON.stringify(setup));
|
|
29
|
+
return setup;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function saveBrowserSetup(next, expectedRevision) {
|
|
33
|
+
next = {
|
|
34
|
+
...next,
|
|
35
|
+
revision: expectedRevision + 1,
|
|
36
|
+
updatedAt: Date.now()
|
|
37
|
+
};
|
|
38
|
+
if (getSqliteDatabase().prepare("UPDATE browser_setup_runs SET revision = ?, updated_at = ?, payload_json = ? WHERE id = ? AND revision = ?").run(next.revision, next.updatedAt, JSON.stringify(next), next.id, expectedRevision).changes !== 1) throw new Error("SETUP_CONFLICT: Configuration progress changed. Read it again.");
|
|
39
|
+
return next;
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { createBrowserSetup, findBrowserSetup, readBrowserSetup, saveBrowserSetup };
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { type BrowserActionInput, type BrowserControlResult } from '@xopcai/browser-control-contract';
|
|
2
|
+
import type { BrowserSetupView } from '@xopcai/gateway-contract';
|
|
3
|
+
import type { Config } from '../../config/schema.js';
|
|
4
|
+
import type { EndpointToolRuntime } from '../../endpoint-tools/index.js';
|
|
5
|
+
import type { BrowserSetup } from './types.js';
|
|
6
|
+
export declare const browserConfigRevision: (config: Config) => string;
|
|
7
|
+
export interface BrowserSetupDeps {
|
|
8
|
+
getConfig: () => Config;
|
|
9
|
+
saveConfig: (next: Config, expected: Config) => Promise<{
|
|
10
|
+
saved: boolean;
|
|
11
|
+
error?: string;
|
|
12
|
+
}>;
|
|
13
|
+
endpoints: EndpointToolRuntime;
|
|
14
|
+
canUseBrowser: (agentId: string) => boolean;
|
|
15
|
+
canSwitchDriver?: (conversationId: string) => boolean;
|
|
16
|
+
policyRevision?: (agentId: string) => string;
|
|
17
|
+
prepare: () => Promise<unknown>;
|
|
18
|
+
release: (endpointId: string, sessionId: string) => Promise<BrowserControlResult>;
|
|
19
|
+
open: (action: 'chrome' | 'folder' | 'both') => Promise<unknown>;
|
|
20
|
+
doctor: () => Promise<{
|
|
21
|
+
installed: boolean;
|
|
22
|
+
needsRefresh?: boolean;
|
|
23
|
+
extensionDir?: string;
|
|
24
|
+
nativeHost?: {
|
|
25
|
+
installed: boolean;
|
|
26
|
+
};
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
/** Mutations require a local-owner grant created by the product UI, never model-supplied identity. */
|
|
30
|
+
export declare class BrowserSetupService {
|
|
31
|
+
private readonly deps;
|
|
32
|
+
private readonly preparing;
|
|
33
|
+
constructor(deps: BrowserSetupDeps);
|
|
34
|
+
private policyRevision;
|
|
35
|
+
endpoints(): {
|
|
36
|
+
endpointId: string;
|
|
37
|
+
principalId: string;
|
|
38
|
+
displayName: string;
|
|
39
|
+
appVersion: string;
|
|
40
|
+
}[];
|
|
41
|
+
owned(id: string, conversationId: string, agentId: string): BrowserSetup;
|
|
42
|
+
view(setup: BrowserSetup): BrowserSetupView & Record<string, unknown>;
|
|
43
|
+
inspect(conversationId: string, agentId: string): Promise<{
|
|
44
|
+
sceneId: string;
|
|
45
|
+
supportedConnection: string;
|
|
46
|
+
configRevision: string;
|
|
47
|
+
installation: {
|
|
48
|
+
installed: boolean;
|
|
49
|
+
needsRefresh: boolean;
|
|
50
|
+
nativeHostInstalled: boolean;
|
|
51
|
+
};
|
|
52
|
+
toolPermission: string;
|
|
53
|
+
enabled: boolean;
|
|
54
|
+
driverKind: "extension" | "playwright" | "cdp" | "remote";
|
|
55
|
+
sharedScope: string;
|
|
56
|
+
endpoints: {
|
|
57
|
+
endpointId: string;
|
|
58
|
+
principalId: string;
|
|
59
|
+
displayName: string;
|
|
60
|
+
appVersion: string;
|
|
61
|
+
}[];
|
|
62
|
+
setup: BrowserSetupView & Record<string, unknown>;
|
|
63
|
+
guidanceRefs: {
|
|
64
|
+
section?: string;
|
|
65
|
+
sceneId: string;
|
|
66
|
+
path: string;
|
|
67
|
+
resourceVersion: string;
|
|
68
|
+
}[];
|
|
69
|
+
ownerActionRequired: boolean;
|
|
70
|
+
supportedActions: string[];
|
|
71
|
+
}>;
|
|
72
|
+
command(command: string, args: Record<string, unknown>, context: {
|
|
73
|
+
conversationId: string;
|
|
74
|
+
agentId: string;
|
|
75
|
+
}, dryRun?: boolean): Promise<(BrowserSetupView & Record<string, unknown>) | {
|
|
76
|
+
sceneId: string;
|
|
77
|
+
supportedConnection: string;
|
|
78
|
+
configRevision: string;
|
|
79
|
+
installation: {
|
|
80
|
+
installed: boolean;
|
|
81
|
+
needsRefresh: boolean;
|
|
82
|
+
nativeHostInstalled: boolean;
|
|
83
|
+
};
|
|
84
|
+
toolPermission: string;
|
|
85
|
+
enabled: boolean;
|
|
86
|
+
driverKind: "extension" | "playwright" | "cdp" | "remote";
|
|
87
|
+
sharedScope: string;
|
|
88
|
+
endpoints: {
|
|
89
|
+
endpointId: string;
|
|
90
|
+
principalId: string;
|
|
91
|
+
displayName: string;
|
|
92
|
+
appVersion: string;
|
|
93
|
+
}[];
|
|
94
|
+
setup: BrowserSetupView & Record<string, unknown>;
|
|
95
|
+
guidanceRefs: {
|
|
96
|
+
section?: string;
|
|
97
|
+
sceneId: string;
|
|
98
|
+
path: string;
|
|
99
|
+
resourceVersion: string;
|
|
100
|
+
}[];
|
|
101
|
+
ownerActionRequired: boolean;
|
|
102
|
+
supportedActions: string[];
|
|
103
|
+
} | {
|
|
104
|
+
message: string;
|
|
105
|
+
sceneId: string;
|
|
106
|
+
supportedConnection: string;
|
|
107
|
+
configRevision: string;
|
|
108
|
+
installation: {
|
|
109
|
+
installed: boolean;
|
|
110
|
+
needsRefresh: boolean;
|
|
111
|
+
nativeHostInstalled: boolean;
|
|
112
|
+
};
|
|
113
|
+
toolPermission: string;
|
|
114
|
+
enabled: boolean;
|
|
115
|
+
driverKind: "extension" | "playwright" | "cdp" | "remote";
|
|
116
|
+
sharedScope: string;
|
|
117
|
+
endpoints: {
|
|
118
|
+
endpointId: string;
|
|
119
|
+
principalId: string;
|
|
120
|
+
displayName: string;
|
|
121
|
+
appVersion: string;
|
|
122
|
+
}[];
|
|
123
|
+
setup: BrowserSetupView & Record<string, unknown>;
|
|
124
|
+
guidanceRefs: {
|
|
125
|
+
section?: string;
|
|
126
|
+
sceneId: string;
|
|
127
|
+
path: string;
|
|
128
|
+
resourceVersion: string;
|
|
129
|
+
}[];
|
|
130
|
+
ownerActionRequired: boolean;
|
|
131
|
+
supportedActions: string[];
|
|
132
|
+
dryRun: boolean;
|
|
133
|
+
}>;
|
|
134
|
+
approve(setup: BrowserSetup, principalId: string, revision: number): BrowserSetup;
|
|
135
|
+
private revision;
|
|
136
|
+
prepare(setup: BrowserSetup): Promise<BrowserSetup>;
|
|
137
|
+
recheck(setup: BrowserSetup): Promise<BrowserSetup>;
|
|
138
|
+
open(setup: BrowserSetup, action: 'chrome' | 'folder' | 'both'): Promise<unknown>;
|
|
139
|
+
begin(setup: BrowserSetup, endpointId: string, origin: string, revision: number): BrowserSetup;
|
|
140
|
+
cancel(setup: BrowserSetup): BrowserSetup;
|
|
141
|
+
release(setup: BrowserSetup): Promise<BrowserSetup>;
|
|
142
|
+
canRestoreSession(taskKey: string, sessionId: string): boolean;
|
|
143
|
+
allowsVerificationUrl(taskKey: string, url: string): boolean;
|
|
144
|
+
/** Called only by the real Agent browser tool, before its normal runtime/policy path. */
|
|
145
|
+
beforeAction(conversationId: string, agentId: string, input: BrowserActionInput): {
|
|
146
|
+
setupId: string;
|
|
147
|
+
attemptId: string;
|
|
148
|
+
taskKey: string;
|
|
149
|
+
input: BrowserActionInput;
|
|
150
|
+
};
|
|
151
|
+
afterAction(setupId: string, attemptId: string, input: BrowserActionInput, result: BrowserControlResult): BrowserSetup;
|
|
152
|
+
}
|