@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
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { getBrowserTabBinding, init_browser_tab_binding_repository } from "../../storage/sqlite/browser-tab-binding-repository.js";
|
|
4
|
+
import "../../../packages/browser-control-contract/src/index.js";
|
|
5
|
+
import { createBrowserSetup, findBrowserSetup, readBrowserSetup, saveBrowserSetup } from "./repository.js";
|
|
6
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
7
|
+
//#region src/browser/setup/service.ts
|
|
8
|
+
init_browser_tab_binding_repository();
|
|
9
|
+
init_logger();
|
|
10
|
+
const log = createLogger("BrowserSetup");
|
|
11
|
+
const VERSION = "1";
|
|
12
|
+
const MAX_ACTIONS = 12;
|
|
13
|
+
const VERIFY_MS = 12e4;
|
|
14
|
+
const ref = (name, section) => ({
|
|
15
|
+
sceneId: "browser",
|
|
16
|
+
path: `references/browser/${name}.md`,
|
|
17
|
+
resourceVersion: VERSION,
|
|
18
|
+
...section ? { section } : {}
|
|
19
|
+
});
|
|
20
|
+
const browserConfigRevision = (config) => createHash("sha256").update(JSON.stringify(config.browser)).digest("hex");
|
|
21
|
+
/** Mutations require a local-owner grant created by the product UI, never model-supplied identity. */
|
|
22
|
+
var BrowserSetupService = class {
|
|
23
|
+
preparing = /* @__PURE__ */ new Set();
|
|
24
|
+
constructor(deps) {
|
|
25
|
+
this.deps = deps;
|
|
26
|
+
}
|
|
27
|
+
policyRevision(agentId) {
|
|
28
|
+
return this.deps.policyRevision?.(agentId) ?? String(this.deps.canUseBrowser(agentId));
|
|
29
|
+
}
|
|
30
|
+
endpoints() {
|
|
31
|
+
return this.deps.endpoints.registry.list().filter((e) => e.kind === "browser" && e.tools.some((t) => t.descriptor.name === "browser.control")).map((e) => ({
|
|
32
|
+
endpointId: e.endpointId,
|
|
33
|
+
principalId: e.principalId,
|
|
34
|
+
displayName: e.displayName,
|
|
35
|
+
appVersion: e.appVersion
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
owned(id, conversationId, agentId) {
|
|
39
|
+
const setup = readBrowserSetup(id);
|
|
40
|
+
if (!setup || setup.conversationId !== conversationId || setup.agentId !== agentId) throw new Error("SETUP_NOT_FOUND");
|
|
41
|
+
return setup;
|
|
42
|
+
}
|
|
43
|
+
view(setup) {
|
|
44
|
+
if (setup.state === "verifying" && setup.attempt && Date.now() > setup.attempt.expiresAt) setup = {
|
|
45
|
+
...setup,
|
|
46
|
+
state: "needs_attention",
|
|
47
|
+
error: "VERIFICATION_EXPIRED: Release the demo session before starting a new test."
|
|
48
|
+
};
|
|
49
|
+
const attempt = setup.attempt ? (({ observation: _observation, ...summary }) => summary)(setup.attempt) : void 0;
|
|
50
|
+
const endpoint = setup.attempt ? this.endpoints().find((e) => e.endpointId === setup.attempt.endpointId) : void 0;
|
|
51
|
+
const changed = setup.configRevision !== browserConfigRevision(this.deps.getConfig()) || Boolean(setup.attempt && (setup.attempt.policyRevision !== this.policyRevision(setup.agentId) || !this.deps.canUseBrowser(setup.agentId) || endpoint && (endpoint.principalId !== setup.attempt.principalId || endpoint.appVersion !== setup.attempt.appVersion)));
|
|
52
|
+
return {
|
|
53
|
+
...setup,
|
|
54
|
+
attempt: setup.attempt ? attempt : void 0,
|
|
55
|
+
sceneId: "browser",
|
|
56
|
+
skillName: "configure-xopc",
|
|
57
|
+
resourceVersion: VERSION,
|
|
58
|
+
stale: changed,
|
|
59
|
+
toolPermission: this.deps.canUseBrowser(setup.agentId) ? "allowed" : "denied",
|
|
60
|
+
currentDriverKind: this.deps.getConfig().browser.driver.kind,
|
|
61
|
+
endpoints: this.endpoints(),
|
|
62
|
+
settingsPath: `/settings/agent-browser?browserSetup=${setup.id}&conversationId=${setup.conversationId}`,
|
|
63
|
+
checks: {
|
|
64
|
+
configured: this.deps.getConfig().browser.enabled && this.deps.getConfig().browser.driver.kind === "extension",
|
|
65
|
+
read: setup.attempt?.read ?? false,
|
|
66
|
+
clicked: setup.attempt?.clicked ?? false,
|
|
67
|
+
filled: setup.attempt?.filled ?? false,
|
|
68
|
+
released: setup.attempt?.released ?? false
|
|
69
|
+
},
|
|
70
|
+
guidanceRefs: [ref(setup.state === "verifying" || setup.state === "completed" ? "acceptance" : setup.error ? "troubleshooting" : "chrome-extension")],
|
|
71
|
+
allowedActions: setup.state === "cancelled" ? ["get"] : setup.state === "completed" ? ["get", "verification_report"] : [
|
|
72
|
+
"get",
|
|
73
|
+
"recheck",
|
|
74
|
+
"cancel",
|
|
75
|
+
...setup.approvedBy && !changed ? ["advance"] : []
|
|
76
|
+
]
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async inspect(conversationId, agentId) {
|
|
80
|
+
const config = this.deps.getConfig();
|
|
81
|
+
const existing = findBrowserSetup(conversationId, agentId);
|
|
82
|
+
const installation = await this.deps.doctor();
|
|
83
|
+
return {
|
|
84
|
+
sceneId: "browser",
|
|
85
|
+
supportedConnection: "extension",
|
|
86
|
+
configRevision: browserConfigRevision(config),
|
|
87
|
+
installation: {
|
|
88
|
+
installed: installation.installed,
|
|
89
|
+
needsRefresh: installation.needsRefresh ?? false,
|
|
90
|
+
nativeHostInstalled: installation.nativeHost?.installed === true
|
|
91
|
+
},
|
|
92
|
+
toolPermission: this.deps.canUseBrowser(agentId) ? "allowed" : "denied",
|
|
93
|
+
enabled: config.browser.enabled,
|
|
94
|
+
driverKind: config.browser.driver.kind,
|
|
95
|
+
sharedScope: "gateway",
|
|
96
|
+
endpoints: this.endpoints(),
|
|
97
|
+
setup: existing ? this.view(existing) : null,
|
|
98
|
+
guidanceRefs: [ref("overview")],
|
|
99
|
+
ownerActionRequired: true,
|
|
100
|
+
supportedActions: [
|
|
101
|
+
"inspect",
|
|
102
|
+
"preview",
|
|
103
|
+
"start",
|
|
104
|
+
"get",
|
|
105
|
+
"advance",
|
|
106
|
+
"recheck",
|
|
107
|
+
"request_interaction",
|
|
108
|
+
"begin_verification",
|
|
109
|
+
"verification_report",
|
|
110
|
+
"cancel"
|
|
111
|
+
]
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
async command(command, args, context, dryRun = false) {
|
|
115
|
+
if (command === "inspect" || command === "preview") return this.inspect(context.conversationId, context.agentId);
|
|
116
|
+
if (dryRun) return {
|
|
117
|
+
dryRun: true,
|
|
118
|
+
...await this.inspect(context.conversationId, context.agentId),
|
|
119
|
+
message: "No changes made. Open the product setup panel to approve installation."
|
|
120
|
+
};
|
|
121
|
+
if (command === "start") {
|
|
122
|
+
const previous = findBrowserSetup(context.conversationId, context.agentId);
|
|
123
|
+
if (previous?.attempt && !previous.attempt.released) return this.view(previous);
|
|
124
|
+
if (previous && this.view(previous).stale && (!previous.attempt || previous.attempt.released)) this.cancel(previous);
|
|
125
|
+
return this.view(createBrowserSetup(context.conversationId, context.agentId, browserConfigRevision(this.deps.getConfig())));
|
|
126
|
+
}
|
|
127
|
+
if (typeof args.setupId !== "string") throw new Error("setupId is required");
|
|
128
|
+
const setup = this.owned(args.setupId, context.conversationId, context.agentId);
|
|
129
|
+
if (command === "get" || command === "verification_report" || command === "request_interaction") return this.view(setup);
|
|
130
|
+
if (command === "recheck") return this.view(await this.recheck(setup));
|
|
131
|
+
if (command === "advance") {
|
|
132
|
+
if (!setup.approvedBy) return {
|
|
133
|
+
...this.view(setup),
|
|
134
|
+
message: "Approve this plan in the local-owner setup panel first."
|
|
135
|
+
};
|
|
136
|
+
return this.view(await this.prepare(setup));
|
|
137
|
+
}
|
|
138
|
+
if (command === "begin_verification") return {
|
|
139
|
+
...this.view(setup),
|
|
140
|
+
message: "Select Chrome and start the test in the local-owner setup panel. The test uses normal browser_use calls."
|
|
141
|
+
};
|
|
142
|
+
if (command === "cancel") return this.view(this.cancel(setup));
|
|
143
|
+
throw new Error("Unsupported browser_setup command");
|
|
144
|
+
}
|
|
145
|
+
approve(setup, principalId, revision) {
|
|
146
|
+
this.revision(setup, revision);
|
|
147
|
+
if (setup.state === "cancelled" || setup.state === "verifying" || setup.state === "completed") throw new Error("SETUP_STATE_CHANGED");
|
|
148
|
+
if (setup.configRevision !== browserConfigRevision(this.deps.getConfig())) throw new Error("CONFIG_CHANGED: Review the current configuration before approving.");
|
|
149
|
+
return saveBrowserSetup({
|
|
150
|
+
...setup,
|
|
151
|
+
approvedBy: principalId,
|
|
152
|
+
error: void 0
|
|
153
|
+
}, setup.revision);
|
|
154
|
+
}
|
|
155
|
+
revision(setup, revision) {
|
|
156
|
+
if (setup.revision !== revision) throw new Error("SETUP_CONFLICT: Read the current progress.");
|
|
157
|
+
}
|
|
158
|
+
async prepare(setup) {
|
|
159
|
+
if (!setup.approvedBy || setup.state === "cancelled" || setup.state === "verifying" || setup.state === "completed") throw new Error("OWNER_APPROVAL_REQUIRED");
|
|
160
|
+
if (setup.attempt && !setup.attempt.released) throw new Error("CONTROL_RELEASE_REQUIRED");
|
|
161
|
+
if (this.preparing.has(setup.id)) return readBrowserSetup(setup.id);
|
|
162
|
+
if (["waiting_extension", "ready_for_verification"].includes(setup.state) && !setup.error) return this.recheck(setup);
|
|
163
|
+
const config = this.deps.getConfig();
|
|
164
|
+
if (setup.configRevision !== browserConfigRevision(config)) throw new Error("CONFIG_CHANGED: Review a new plan.");
|
|
165
|
+
if (config.browser.enabled && config.browser.driver.kind !== "extension" && this.deps.canSwitchDriver?.(setup.conversationId) === false) return saveBrowserSetup({
|
|
166
|
+
...setup,
|
|
167
|
+
state: "needs_attention",
|
|
168
|
+
error: "BROWSER_BUSY: Release existing browser sessions and wait for other runs before switching the shared driver."
|
|
169
|
+
}, setup.revision);
|
|
170
|
+
this.preparing.add(setup.id);
|
|
171
|
+
let current = saveBrowserSetup({
|
|
172
|
+
...setup,
|
|
173
|
+
state: "preparing",
|
|
174
|
+
error: void 0,
|
|
175
|
+
operation: {
|
|
176
|
+
key: setup.operation?.key ?? randomUUID(),
|
|
177
|
+
startedAt: Date.now()
|
|
178
|
+
}
|
|
179
|
+
}, setup.revision);
|
|
180
|
+
try {
|
|
181
|
+
const next = structuredClone(config);
|
|
182
|
+
next.browser.enabled = true;
|
|
183
|
+
next.browser.driver = { kind: "extension" };
|
|
184
|
+
if (browserConfigRevision(next) !== browserConfigRevision(config)) {
|
|
185
|
+
if (!(await this.deps.saveConfig(next, config)).saved) throw new Error("CONFIG_CHANGED: Configuration was not saved. Review the current settings.");
|
|
186
|
+
}
|
|
187
|
+
current = readBrowserSetup(setup.id);
|
|
188
|
+
if (current.state === "cancelled") return current;
|
|
189
|
+
current = saveBrowserSetup({
|
|
190
|
+
...current,
|
|
191
|
+
configRevision: browserConfigRevision(this.deps.getConfig())
|
|
192
|
+
}, current.revision);
|
|
193
|
+
await this.deps.prepare();
|
|
194
|
+
current = readBrowserSetup(setup.id);
|
|
195
|
+
if (current.state === "cancelled") return current;
|
|
196
|
+
this.preparing.delete(setup.id);
|
|
197
|
+
return await this.recheck(saveBrowserSetup({
|
|
198
|
+
...current,
|
|
199
|
+
state: "waiting_extension",
|
|
200
|
+
operation: void 0
|
|
201
|
+
}, current.revision));
|
|
202
|
+
} catch (error) {
|
|
203
|
+
log.warn({
|
|
204
|
+
err: error,
|
|
205
|
+
setupId: setup.id
|
|
206
|
+
}, "Browser setup preparation failed");
|
|
207
|
+
current = readBrowserSetup(setup.id);
|
|
208
|
+
if (current.state === "cancelled") return current;
|
|
209
|
+
return saveBrowserSetup({
|
|
210
|
+
...current,
|
|
211
|
+
state: "needs_attention",
|
|
212
|
+
operation: void 0,
|
|
213
|
+
error: "PREPARE_FAILED: Check the local installation and retry. Existing settings and files may have been prepared."
|
|
214
|
+
}, current.revision);
|
|
215
|
+
} finally {
|
|
216
|
+
this.preparing.delete(setup.id);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async recheck(setup) {
|
|
220
|
+
if (setup.state === "cancelled" || setup.state === "completed" || setup.state === "verifying" || this.preparing.has(setup.id)) return setup;
|
|
221
|
+
if (!setup.approvedBy || setup.attempt && !setup.attempt.released) return setup;
|
|
222
|
+
if (setup.configRevision !== browserConfigRevision(this.deps.getConfig())) return saveBrowserSetup({
|
|
223
|
+
...setup,
|
|
224
|
+
state: "needs_attention",
|
|
225
|
+
approvedBy: void 0,
|
|
226
|
+
error: "CONFIG_CHANGED: Restart the plan using the current settings."
|
|
227
|
+
}, setup.revision);
|
|
228
|
+
const doctor = await this.deps.doctor();
|
|
229
|
+
const current = readBrowserSetup(setup.id);
|
|
230
|
+
if (current.revision !== setup.revision) return current;
|
|
231
|
+
const ready = doctor.installed && !doctor.needsRefresh && doctor.nativeHost?.installed === true;
|
|
232
|
+
return saveBrowserSetup({
|
|
233
|
+
...setup,
|
|
234
|
+
state: ready ? this.endpoints().length ? "ready_for_verification" : "waiting_extension" : "needs_attention",
|
|
235
|
+
operation: void 0,
|
|
236
|
+
error: ready ? void 0 : "INSTALLATION_REQUIRED: Prepare or repair the local extension files."
|
|
237
|
+
}, setup.revision);
|
|
238
|
+
}
|
|
239
|
+
async open(setup, action) {
|
|
240
|
+
if (!setup.approvedBy || setup.state === "cancelled") throw new Error("OWNER_APPROVAL_REQUIRED");
|
|
241
|
+
return this.deps.open(action);
|
|
242
|
+
}
|
|
243
|
+
begin(setup, endpointId, origin, revision) {
|
|
244
|
+
this.revision(setup, revision);
|
|
245
|
+
if (!setup.approvedBy || setup.state !== "ready_for_verification") throw new Error("SETUP_NOT_READY");
|
|
246
|
+
if (setup.configRevision !== browserConfigRevision(this.deps.getConfig())) throw new Error("CONFIG_CHANGED");
|
|
247
|
+
if (setup.attempt && !setup.attempt.released) throw new Error("CONTROL_RELEASE_REQUIRED");
|
|
248
|
+
if (!this.deps.canUseBrowser(setup.agentId)) throw new Error("AGENT_BROWSER_DENIED: Enable browser_use for this Agent and start a refreshed turn.");
|
|
249
|
+
if (getBrowserTabBinding(setup.conversationId)) throw new Error("TAB_ALREADY_ATTACHED: Release the existing tab before starting this test.");
|
|
250
|
+
const endpoint = this.endpoints().find((e) => e.endpointId === endpointId);
|
|
251
|
+
if (!endpoint) throw new Error("ENDPOINT_OFFLINE");
|
|
252
|
+
const url = new URL(origin);
|
|
253
|
+
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password) throw new Error("INVALID_ORIGIN");
|
|
254
|
+
const id = randomUUID();
|
|
255
|
+
const marker = `XOPC-${randomUUID()}`;
|
|
256
|
+
return saveBrowserSetup({
|
|
257
|
+
...setup,
|
|
258
|
+
state: "verifying",
|
|
259
|
+
error: void 0,
|
|
260
|
+
attempt: {
|
|
261
|
+
id,
|
|
262
|
+
endpointId,
|
|
263
|
+
principalId: endpoint.principalId,
|
|
264
|
+
appVersion: endpoint.appVersion,
|
|
265
|
+
policyRevision: this.policyRevision(setup.agentId),
|
|
266
|
+
fixtureUrl: `${url.origin}/browser-setup-test.html#${marker}`,
|
|
267
|
+
marker,
|
|
268
|
+
sample: `Hello-${id.slice(0, 8)}`,
|
|
269
|
+
sessionId: randomUUID(),
|
|
270
|
+
expiresAt: Date.now() + VERIFY_MS,
|
|
271
|
+
actions: 0,
|
|
272
|
+
read: false,
|
|
273
|
+
clicked: false,
|
|
274
|
+
filled: false,
|
|
275
|
+
released: false
|
|
276
|
+
}
|
|
277
|
+
}, setup.revision);
|
|
278
|
+
}
|
|
279
|
+
cancel(setup) {
|
|
280
|
+
if (setup.state === "cancelled") return setup;
|
|
281
|
+
return saveBrowserSetup({
|
|
282
|
+
...setup,
|
|
283
|
+
state: "cancelled",
|
|
284
|
+
approvedBy: void 0,
|
|
285
|
+
error: setup.attempt && !setup.attempt.released ? "CONTROL_RELEASE_REQUIRED: Close the verification browser session; cancellation does not prove release." : void 0
|
|
286
|
+
}, setup.revision);
|
|
287
|
+
}
|
|
288
|
+
async release(setup) {
|
|
289
|
+
if (!setup.attempt || setup.attempt.released) return setup;
|
|
290
|
+
const endpoint = this.endpoints().find((e) => e.endpointId === setup.attempt.endpointId);
|
|
291
|
+
if (!endpoint || endpoint.principalId !== setup.attempt.principalId) throw new Error("ENDPOINT_OFFLINE: Control release cannot be confirmed.");
|
|
292
|
+
const result = await this.deps.release(setup.attempt.endpointId, setup.attempt.sessionId);
|
|
293
|
+
return this.afterAction(setup.id, setup.attempt.id, { action: "close" }, result) ?? readBrowserSetup(setup.id);
|
|
294
|
+
}
|
|
295
|
+
canRestoreSession(taskKey, sessionId) {
|
|
296
|
+
const [prefix, setupId, attemptId] = taskKey.split(":");
|
|
297
|
+
if (prefix !== "browser-setup" || !setupId) return false;
|
|
298
|
+
const setup = readBrowserSetup(setupId);
|
|
299
|
+
return Boolean(setup?.attempt?.id === attemptId && setup.attempt.sessionId === sessionId && !setup.attempt.released);
|
|
300
|
+
}
|
|
301
|
+
allowsVerificationUrl(taskKey, url) {
|
|
302
|
+
const [prefix, setupId, attemptId] = taskKey.split(":");
|
|
303
|
+
if (prefix !== "browser-setup" || !setupId) return false;
|
|
304
|
+
const setup = readBrowserSetup(setupId);
|
|
305
|
+
return Boolean(setup?.approvedBy && setup.state === "verifying" && setup.attempt?.id === attemptId && setup.attempt.fixtureUrl === url && Date.now() <= setup.attempt.expiresAt && setup.configRevision === browserConfigRevision(this.deps.getConfig()));
|
|
306
|
+
}
|
|
307
|
+
/** Called only by the real Agent browser tool, before its normal runtime/policy path. */
|
|
308
|
+
beforeAction(conversationId, agentId, input) {
|
|
309
|
+
let setup = findBrowserSetup(conversationId, agentId);
|
|
310
|
+
if (setup?.attempt?.released && input.action === "close" && input.sessionId === setup.attempt.sessionId) throw new Error("VERIFICATION_ALREADY_RELEASED");
|
|
311
|
+
if (!setup?.attempt || setup.attempt.released || ![
|
|
312
|
+
"verifying",
|
|
313
|
+
"needs_attention",
|
|
314
|
+
"cancelled"
|
|
315
|
+
].includes(setup.state)) return void 0;
|
|
316
|
+
const a = setup.attempt;
|
|
317
|
+
if (!(input.action === "close")) {
|
|
318
|
+
if (setup.state !== "verifying") throw new Error("VERIFICATION_STOPPED: Close the verification session first.");
|
|
319
|
+
if (Date.now() > a.expiresAt || a.actions >= MAX_ACTIONS) throw new Error("VERIFICATION_BUDGET_EXCEEDED: Close the verification session.");
|
|
320
|
+
if (setup.configRevision !== browserConfigRevision(this.deps.getConfig()) || a.policyRevision !== this.policyRevision(setup.agentId)) throw new Error("CONFIG_CHANGED: Close the verification session.");
|
|
321
|
+
const endpoint = this.endpoints().find((e) => e.endpointId === a.endpointId);
|
|
322
|
+
if (!endpoint || endpoint.principalId !== a.principalId || endpoint.appVersion !== a.appVersion) throw new Error("ENDPOINT_CHANGED");
|
|
323
|
+
const node = "ref" in input ? a.observation?.nodes.find((n) => n.ref === input.ref) : void 0;
|
|
324
|
+
if (!(input.action === "navigate" ? !a.tabId && input.url === a.fixtureUrl : input.action === "observe" ? Boolean(a.sessionId) : input.action === "click" ? a.read && !a.clicked && node?.role === "button" && node.name === "Test click" && input.revision === a.observation?.revision : input.action === "fill" ? a.clicked && !a.filled && node?.name === "Test input" && input.value === a.sample && input.submit !== true && input.revision === a.observation?.revision : false)) throw new Error("VERIFICATION_ACTION_DENIED: Follow the test instructions using fresh observation refs.");
|
|
325
|
+
}
|
|
326
|
+
if (input.sessionId && input.sessionId !== a.sessionId) throw new Error("VERIFICATION_SESSION_MISMATCH");
|
|
327
|
+
setup = saveBrowserSetup({
|
|
328
|
+
...setup,
|
|
329
|
+
attempt: {
|
|
330
|
+
...a,
|
|
331
|
+
actions: a.actions + 1
|
|
332
|
+
}
|
|
333
|
+
}, setup.revision);
|
|
334
|
+
return {
|
|
335
|
+
setupId: setup.id,
|
|
336
|
+
attemptId: a.id,
|
|
337
|
+
taskKey: `browser-setup:${setup.id}:${a.id}`,
|
|
338
|
+
input: {
|
|
339
|
+
...input,
|
|
340
|
+
...a.sessionId ? { sessionId: a.sessionId } : {},
|
|
341
|
+
target: {
|
|
342
|
+
kind: "endpoint",
|
|
343
|
+
endpointId: a.endpointId
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
afterAction(setupId, attemptId, input, result) {
|
|
349
|
+
const setup = readBrowserSetup(setupId);
|
|
350
|
+
if (!setup?.attempt || setup.attempt.id !== attemptId) return;
|
|
351
|
+
const a = { ...setup.attempt };
|
|
352
|
+
if (input.action === "close" && result.ok && result.receipt.action === "close" && result.receipt.verified) {
|
|
353
|
+
a.released = true;
|
|
354
|
+
delete a.observation;
|
|
355
|
+
const complete = setup.state === "verifying" && setup.configRevision === browserConfigRevision(this.deps.getConfig()) && Date.now() <= a.expiresAt && a.policyRevision === this.policyRevision(setup.agentId) && this.deps.canUseBrowser(setup.agentId) && a.read && a.clicked && a.filled;
|
|
356
|
+
return saveBrowserSetup({
|
|
357
|
+
...setup,
|
|
358
|
+
attempt: a,
|
|
359
|
+
state: setup.state === "cancelled" ? "cancelled" : complete ? "completed" : "needs_attention",
|
|
360
|
+
error: complete || setup.state === "cancelled" ? void 0 : setup.error?.startsWith("BROWSER_CONTROL_REVOKED") ? setup.error : "VERIFICATION_INCOMPLETE: Review the checks and start a new test."
|
|
361
|
+
}, setup.revision);
|
|
362
|
+
}
|
|
363
|
+
if ("error" in result) return saveBrowserSetup({
|
|
364
|
+
...setup,
|
|
365
|
+
state: setup.state === "cancelled" ? "cancelled" : "needs_attention",
|
|
366
|
+
error: result.error.message.includes("BROWSER_CONTROL_REVOKED") ? "BROWSER_CONTROL_REVOKED: Chrome control was stopped by the user. Release the demo, then resume control in the extension before starting a new test." : "BROWSER_ACTION_FAILED: Close the verification session before retrying."
|
|
367
|
+
}, setup.revision);
|
|
368
|
+
if (result.receipt.action !== input.action) return saveBrowserSetup({
|
|
369
|
+
...setup,
|
|
370
|
+
state: setup.state === "cancelled" ? "cancelled" : "needs_attention",
|
|
371
|
+
error: "VERIFICATION_RECEIPT_MISMATCH: Release the demo session."
|
|
372
|
+
}, setup.revision);
|
|
373
|
+
const o = result.receipt.observation;
|
|
374
|
+
if (!o || !result.receipt.verified) return;
|
|
375
|
+
if (o.url !== a.fixtureUrl || a.tabId && o.tabId !== a.tabId || a.documentId && o.documentId !== a.documentId || a.sessionId && o.sessionId !== a.sessionId) return saveBrowserSetup({
|
|
376
|
+
...setup,
|
|
377
|
+
state: setup.state === "cancelled" ? "cancelled" : "needs_attention",
|
|
378
|
+
error: "VERIFICATION_TARGET_CHANGED: Close the verification session."
|
|
379
|
+
}, setup.revision);
|
|
380
|
+
a.sessionId = o.sessionId;
|
|
381
|
+
a.tabId = o.tabId;
|
|
382
|
+
a.documentId = o.documentId;
|
|
383
|
+
a.observation = {
|
|
384
|
+
revision: o.revision,
|
|
385
|
+
nodes: o.nodes.map(({ ref, role, name, value, states }) => ({
|
|
386
|
+
ref,
|
|
387
|
+
role,
|
|
388
|
+
name,
|
|
389
|
+
value,
|
|
390
|
+
states
|
|
391
|
+
}))
|
|
392
|
+
};
|
|
393
|
+
const names = o.nodes.map((n) => n.name);
|
|
394
|
+
if (names.includes(`Read check: ${a.marker}`)) a.read = true;
|
|
395
|
+
if (input.action === "click" && names.includes(`Click passed: ${a.marker}`)) a.clicked = true;
|
|
396
|
+
if (input.action === "fill" && a.clicked && names.includes(`Input passed: ${a.sample}`)) a.filled = true;
|
|
397
|
+
return saveBrowserSetup({
|
|
398
|
+
...setup,
|
|
399
|
+
attempt: a
|
|
400
|
+
}, setup.revision);
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
//#endregion
|
|
404
|
+
export { BrowserSetupService, browserConfigRevision };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { BrowserObservation } from '@xopcai/browser-control-contract';
|
|
2
|
+
export type SetupState = 'plan_ready' | 'preparing' | 'waiting_extension' | 'ready_for_verification' | 'verifying' | 'needs_attention' | 'completed' | 'cancelled';
|
|
3
|
+
export interface BrowserSetup {
|
|
4
|
+
id: string;
|
|
5
|
+
conversationId: string;
|
|
6
|
+
agentId: string;
|
|
7
|
+
revision: number;
|
|
8
|
+
state: SetupState;
|
|
9
|
+
configRevision: string;
|
|
10
|
+
approvedBy?: string;
|
|
11
|
+
createdAt: number;
|
|
12
|
+
updatedAt: number;
|
|
13
|
+
operation?: {
|
|
14
|
+
key: string;
|
|
15
|
+
startedAt: number;
|
|
16
|
+
};
|
|
17
|
+
error?: string;
|
|
18
|
+
attempt?: {
|
|
19
|
+
id: string;
|
|
20
|
+
endpointId: string;
|
|
21
|
+
principalId: string;
|
|
22
|
+
appVersion: string;
|
|
23
|
+
policyRevision: string;
|
|
24
|
+
fixtureUrl: string;
|
|
25
|
+
marker: string;
|
|
26
|
+
sample: string;
|
|
27
|
+
expiresAt: number;
|
|
28
|
+
actions: number;
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
tabId?: string;
|
|
31
|
+
documentId?: string;
|
|
32
|
+
observation?: Pick<BrowserObservation, 'revision' | 'nodes'>;
|
|
33
|
+
read: boolean;
|
|
34
|
+
clicked: boolean;
|
|
35
|
+
filled: boolean;
|
|
36
|
+
released: boolean;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -32,7 +32,7 @@ async function checkDatabaseSchema(ctx) {
|
|
|
32
32
|
id: "database-schema",
|
|
33
33
|
label: "Database schema",
|
|
34
34
|
status: "pass",
|
|
35
|
-
message: `SQLite schema v${readSchemaVersion(getSqliteDatabase())} (current release
|
|
35
|
+
message: `SQLite schema v${readSchemaVersion(getSqliteDatabase())} (current release v260).`,
|
|
36
36
|
hints: []
|
|
37
37
|
};
|
|
38
38
|
}
|
|
@@ -4,17 +4,17 @@ import { AgentPluginStore } from "../../extensions/agent-plugins/store.js";
|
|
|
4
4
|
import { downloadExtensionStoreZipBuffer, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, verifyStoreArtifactSha256 } from "../../agent/skills/marketplace/adapters/store/store-api-client.js";
|
|
5
5
|
import { loadConfig } from "../../config/loader.js";
|
|
6
6
|
import { getContextWithOpts } from "../context.js";
|
|
7
|
-
import { isAgentPluginArchive } from "../../extensions/agent-plugins/sources.js";
|
|
8
|
-
import { fetchRegistry, findExtension, getExtensionMarketplaceStoreBaseUrl, listExtensions, searchExtensions } from "../../extensions/marketplace.js";
|
|
9
7
|
import { peekExtensionManifestFromStoreZip } from "../../extensions/install.js";
|
|
10
8
|
import { commitStagedExtensionInstall, finalizeStagedExtensionInstall, rollbackStagedExtensionInstall, stageExtensionLocal, stageExtensionNpm, stageExtensionStoreZip } from "../../extensions/install-transaction.js";
|
|
9
|
+
import { fetchRegistry, findExtension, getExtensionMarketplaceStoreBaseUrl, listExtensions, searchExtensions } from "../../extensions/marketplace.js";
|
|
10
|
+
import { isAgentPluginArchive } from "../../extensions/agent-plugins/sources.js";
|
|
11
11
|
import { colors } from "../utils/colors.js";
|
|
12
12
|
import { installAgentPluginFromCli, isAgentPluginSource } from "./extension-agent-plugin.js";
|
|
13
13
|
import { validateExtensionPackageDirectory } from "./extension-pack.js";
|
|
14
14
|
import { join, resolve } from "node:path";
|
|
15
15
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
16
|
-
import { execSync } from "node:child_process";
|
|
17
16
|
import { createHash } from "node:crypto";
|
|
17
|
+
import { execSync } from "node:child_process";
|
|
18
18
|
import semver from "semver";
|
|
19
19
|
import { confirm } from "@inquirer/prompts";
|
|
20
20
|
import { Command } from "commander";
|
|
@@ -7,8 +7,8 @@ import { collectExtensionPackageDependencyIssues } from "../../extensions/packag
|
|
|
7
7
|
import { colors } from "../utils/colors.js";
|
|
8
8
|
import { basename, join, relative, resolve } from "node:path";
|
|
9
9
|
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
10
|
-
import { execSync } from "node:child_process";
|
|
11
10
|
import { createHash } from "node:crypto";
|
|
11
|
+
import { execSync } from "node:child_process";
|
|
12
12
|
import AdmZip from "adm-zip";
|
|
13
13
|
import { Command } from "commander";
|
|
14
14
|
//#region src/cli/commands/extension-pack.ts
|
|
@@ -8,9 +8,9 @@ import { checkEngineCompatibility } from "../../extensions/engine-check.js";
|
|
|
8
8
|
import { ExtensionLoader } from "../../extensions/loader.js";
|
|
9
9
|
import { loadConfig, saveConfig } from "../../config/loader.js";
|
|
10
10
|
import { getContextWithOpts } from "../context.js";
|
|
11
|
-
import { withAgentPluginSource } from "../../extensions/agent-plugins/sources.js";
|
|
12
|
-
import { collectExtensionPackageDependencyIssues } from "../../extensions/package-contract.js";
|
|
13
11
|
import { checkAllExtensionsHealth, getExtensionHealthChecker } from "../../extensions/health.js";
|
|
12
|
+
import { collectExtensionPackageDependencyIssues } from "../../extensions/package-contract.js";
|
|
13
|
+
import { withAgentPluginSource } from "../../extensions/agent-plugins/sources.js";
|
|
14
14
|
import { colors } from "../utils/colors.js";
|
|
15
15
|
import { addAgentPluginLifecycleCommands, isAgentPluginSource } from "./extension-agent-plugin.js";
|
|
16
16
|
import { createExtensionCreateCommand } from "./extension-create.js";
|
|
@@ -1781,6 +1781,8 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
1781
1781
|
phone: z.ZodPrefault<z.ZodObject<{
|
|
1782
1782
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
1783
1783
|
adbPath: z.ZodOptional<z.ZodString>;
|
|
1784
|
+
semanticControls: z.ZodDefault<z.ZodBoolean>;
|
|
1785
|
+
hierarchicalPlanning: z.ZodDefault<z.ZodBoolean>;
|
|
1784
1786
|
maxActionsPerSession: z.ZodDefault<z.ZodNumber>;
|
|
1785
1787
|
maxModelRequests: z.ZodDefault<z.ZodNumber>;
|
|
1786
1788
|
maxOperationDurationMs: z.ZodDefault<z.ZodNumber>;
|
|
@@ -6,9 +6,9 @@ import { MAX_EXTENSION_STORE_ZIP_BYTES } from "./store-zip-limits.js";
|
|
|
6
6
|
import { checkEngineCompatibility } from "./engine-check.js";
|
|
7
7
|
import { EXTENSION_API_VERSION, EXTENSION_UI_API_VERSION, checkExtensionApiCompatibility } from "./api-version.js";
|
|
8
8
|
import { collectExtensionPackageDependencyIssues } from "./package-contract.js";
|
|
9
|
-
import { execFileSync } from "node:child_process";
|
|
10
9
|
import { dirname, isAbsolute, join, resolve, sep } from "path";
|
|
11
10
|
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from "fs";
|
|
11
|
+
import { execFileSync } from "node:child_process";
|
|
12
12
|
import AdmZip from "adm-zip";
|
|
13
13
|
import semver from "semver";
|
|
14
14
|
import { tmpdir } from "os";
|
|
@@ -4,8 +4,8 @@ import { init_paths, resolveBundledExtensionsDir, resolveExtensionsDir } from ".
|
|
|
4
4
|
import { computeExtensionDirectoryIntegrity, getExtensionLockfileManager } from "./lockfile.js";
|
|
5
5
|
import { downloadExtensionStoreZipBuffer, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, verifyStoreArtifactSha256 } from "../agent/skills/marketplace/adapters/store/store-api-client.js";
|
|
6
6
|
import { loadConfig } from "../config/loader.js";
|
|
7
|
-
import { findExtension } from "./marketplace.js";
|
|
8
7
|
import { commitStagedExtensionInstall, finalizeStagedExtensionInstall, rollbackStagedExtensionInstall, stageExtensionNpm, stageExtensionStoreZip } from "./install-transaction.js";
|
|
8
|
+
import { findExtension } from "./marketplace.js";
|
|
9
9
|
import { join } from "node:path";
|
|
10
10
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
11
11
|
import { createHash } from "node:crypto";
|
|
@@ -277,4 +277,4 @@ export declare const GATEWAY_BUILTIN_TOOLS: readonly [{
|
|
|
277
277
|
readonly zh: "使用已验证的参数执行选定的外部工具。";
|
|
278
278
|
};
|
|
279
279
|
}];
|
|
280
|
-
export declare const GATEWAY_BUILTIN_TOOL_IDS: ("automation" | "find" | "image" | "knowledge_search" | "knowledge_get" | "knowledge_write" | "user_context_search" | "user_context_get" | "user_context_update" | "web_search" | "web_fetch" | "browser_use" | "grep" | "session_search" | "read_file" | "list_dir" | "write_file" | "apply_patch" | "exec_command" | "update_plan" | "todo" | "web_extract" | "clarify" | "xopc_tool_execute" | "tool_manual" | "session_status" | "read_media" | "xopc_tool_search" | "xopc_tool_describe" | "phone_use" | "
|
|
280
|
+
export declare const GATEWAY_BUILTIN_TOOL_IDS: ("automation" | "find" | "image" | "knowledge_search" | "knowledge_get" | "knowledge_write" | "user_context_search" | "user_context_get" | "user_context_update" | "web_search" | "web_fetch" | "browser_use" | "grep" | "session_search" | "read_file" | "list_dir" | "write_file" | "apply_patch" | "exec_command" | "update_plan" | "todo" | "web_extract" | "clarify" | "xopc_tool_execute" | "tool_manual" | "session_status" | "read_media" | "xopc_tool_search" | "xopc_tool_describe" | "phone_use" | "skill_view" | "skills_list" | "image_generate" | "skill_manage" | "skills_marketplace_search" | "computer_use" | "send_message" | "text_to_speech" | "execute_code" | "send_media" | "create_share" | "memory_maintenance" | "delegate_task" | "skill_install" | "create_desktop_pet")[];
|
|
@@ -2,8 +2,8 @@ import { getAllModels, getAvailableModels, init_providers } from "../../../provi
|
|
|
2
2
|
import { ActivationPlanner } from "../../../extensions/activation-planner.js";
|
|
3
3
|
import { mergeActivationContext } from "../../../extensions/activation-context.js";
|
|
4
4
|
import { validateExtensionConfig } from "../../../extensions/config-validation.js";
|
|
5
|
-
import { listAgentPluginInventory } from "../../../extensions/agent-plugins/inventory.js";
|
|
6
5
|
import { fetchRegistry, listExtensions, searchExtensions } from "../../../extensions/marketplace.js";
|
|
6
|
+
import { listAgentPluginInventory } from "../../../extensions/agent-plugins/inventory.js";
|
|
7
7
|
import { createOAuthAsyncHandler } from "../oauth-async.js";
|
|
8
8
|
import { createOAuthHandler } from "../oauth.js";
|
|
9
9
|
import { extensionAssetMimeType } from "../lib/extension-assets.js";
|