@xopcai/xopc 0.0.415 → 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-CJFwitU2.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/{app-management-settings-panel-DgwqNi5i.js → app-management-settings-panel-D4-n1uBg.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-C0wJfFyz.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-Ch7wolHE.js → archive-plugin-B4btCsiV.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-DK7AU79v.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-B4HcHYsC.js → binary-plugins-DQT9e258.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BQAWEZF-.js → block-editor-B50rU9tL.js} +4 -4
- 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-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-D4Yq35fD.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-zdMySdMm.js → chat-terminal-dock-Bd3af4gL.js} +2 -2
- package/dist/gateway/static/root/assets/{computer-settings-page-C5Z6Jr0p.js → computer-settings-page-DXfqy7xh.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-Cxus0qrZ.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-DuyyD6jz.js → date-picker-CqzXevH6.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-BZN72rrk.js → dependency-picker-pgT4Gyaf.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-BcyP7Z6v.js → desktop-pet-settings-Dy_-i2L8.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-BtvTIDCi.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-DOusKz-O.js → directory-picker-path-field-C-aQ7qoM.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-Bt4FwsFu.js → extension-debug-page-2NwpYkS5.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-0vsxX3FB.js → extension-page-y9J0z7_Q.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-5Pt5_ELc.js → extension-settings-page-BtowusUh.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-C52ghnBK.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-BYSKzUMR.js +1 -0
- package/dist/gateway/static/root/assets/highlight-code-Cz6eeDH5.js +1 -0
- package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-Cbk7eMlg.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-CAS8QVla.js → image-generation-api-gBFro48x.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-BCLBYzV1.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-CM_kt5XN.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-BTSOChhk.js → local-apps-page-w-J5bY02.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-DYQDjCVQ.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/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-DVn_dU83.js → page-context-capture-button-DusR2Itk.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-CR5JFkQ9.js +1 -0
- package/dist/gateway/static/root/assets/{personal-settings-panel-C16Iqe7X.js → personal-settings-panel-B7undvlr.js} +1 -1
- 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-RlHk76TI.js → preview-open-alternatives-CMxjsKSw.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-Dh-HqLrE.js → product-open-page-CrlyJx5M.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-c3K-4DWc.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-B8HAt9sD.js → projects-page-xGQd9oAZ.js} +1 -1
- package/dist/gateway/static/root/assets/refresh-cw-BRlGaq2w.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-Gs0Xkws9.js +1 -0
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bwg7U7TR.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-CXO1B1k4.js → schema-form-ByzTNR_C.js} +1 -1
- package/dist/gateway/static/root/assets/{session-manager-CA1NkTR_.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-BQxKmbbJ.js → settings-form-section-Brgd8IOV.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DvVMpKiA.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-XgZk8Oa1.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-CV-WT2hj.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-D-gGKNX9.js → task-result-evidence-B-vt1BgK.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-CQw3G-FB.js → tracing-settings-page-Dt51Z_ws.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-B2HnCi0U.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-Dc0nwUpX.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-BSWXZkGa.js → voice-api-key-field-CO3KuanA.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-H3cdwq3l.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 +7 -4
- 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/embedded/tool-search-extension.js +14 -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/tool-manuals/phone.d.ts +1 -1
- package/dist/src/agent/tool-manuals/phone.js +1 -1
- 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/phone-use-tool.d.ts +1 -0
- package/dist/src/agent/tools/phone-use-tool.js +9 -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/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 +2 -1
- 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/gateway/lifecycle.js +1 -1
- package/dist/src/config/schema.d.ts +2 -0
- package/dist/src/connectors/connected-source-understanding.js +1 -1
- package/dist/src/connectors/learning-coordinator.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +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/connectors.js +7 -7
- package/dist/src/gateway/hono/routes/home.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 +3 -7
- package/dist/src/gateway/hono/routes/public-gateway.js +3 -1
- 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.d.ts +5 -0
- package/dist/src/gateway/service.js +57 -12
- package/dist/src/gateway/xopc-cloud-capability-setup.js +7 -1
- package/dist/src/home-intelligence/host.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/phone/adb-driver.d.ts +2 -0
- package/dist/src/phone/adb-driver.js +35 -17
- package/dist/src/phone/contracts.d.ts +40 -0
- package/dist/src/phone/contracts.js +17 -4
- package/dist/src/phone/model-adapter.d.ts +59 -2
- package/dist/src/phone/model-adapter.js +107 -13
- 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/repository.d.ts +1 -0
- package/dist/src/phone/repository.js +3 -0
- package/dist/src/phone/runtime.js +232 -54
- 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/schema.d.ts +2 -2
- package/dist/src/storage/sqlite/schema.js +7 -7
- package/dist/src/storage/sqlite/schema.sql +10 -0
- package/dist/src/storage/sqlite/upgrades/260_browser_setup.sql +9 -0
- package/dist/src/user-context/sources/index.js +1 -1
- package/dist/src/work-discovery/service.js +2 -2
- package/package.json +6 -6
- 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-DclyJr1N.js +0 -1
- package/dist/gateway/static/root/assets/agents-jhErNtzi.js +0 -77
- package/dist/gateway/static/root/assets/apps-page-C0LcnI4h.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-CBxiV34x.js +0 -8
- package/dist/gateway/static/root/assets/browser-automations-page-vJIrTxdi.js +0 -3
- package/dist/gateway/static/root/assets/browser-settings-page-in5Roh_E.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-page-CiGx8wpQ.js +0 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-a8kqjzQu.js +0 -8
- package/dist/gateway/static/root/assets/channels-C_CxcjKT.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DCBO2CxK.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-Ctbgr50F.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-DkWCHVzI.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BsVOcmV5.js +0 -1
- package/dist/gateway/static/root/assets/highlight-code-C8eS9949.js +0 -1
- package/dist/gateway/static/root/assets/home-page-BZDZnmyc.js +0 -2
- package/dist/gateway/static/root/assets/index-Bys6njTY.js +0 -710
- package/dist/gateway/static/root/assets/index-Vsf0bj5e.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-Dk87jtcc.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-D3gVdm8S.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-BQNYFE4J.js +0 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-ChweJKTv.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-CYKwUCte.js +0 -5
- package/dist/gateway/static/root/assets/note-image-lightbox-BTSZb9ZT.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-CJ5nhWfL.js +0 -8
- package/dist/gateway/static/root/assets/personal-page-DcW14lqn.js +0 -1
- package/dist/gateway/static/root/assets/phone-dependencies-card-D3l9uPFM.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-picker-DOv38vBn.js +0 -1
- package/dist/gateway/static/root/assets/phone-settings-page-DUHp1q_9.js +0 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-BpfgDlVa.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-GD8TxKad.js +0 -7
- package/dist/gateway/static/root/assets/remote-access-hub-D3el7lHK.js +0 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Dbskk6RG.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-07liaSHH.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BGjU8rfN.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-DKo_VTx-.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BODFqK8k.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-Ce6OUk2C.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-B7ehOIML.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-CxJkZRT4.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-CxRR0QuW.js +0 -2
- package/dist/gateway/static/root/assets/usage-page-uUEkO38r.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-ICUutbKL.js +0 -2
- package/dist/gateway/static/root/assets/xopc-cloud-account-card-CvT_W6YS.js +0 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { getSessionMetadata, init_session_read_repository } from "../../../storage/sqlite/session-read-repository.js";
|
|
2
|
+
import { readBrowserSetup } from "../../../browser/setup/repository.js";
|
|
3
|
+
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
4
|
+
import { isLocalOwnerRequest } from "./browser.js";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
//#region src/gateway/hono/routes/browser-setup.ts
|
|
7
|
+
init_session_read_repository();
|
|
8
|
+
const requestSchema = z.strictObject({
|
|
9
|
+
conversationId: z.string().uuid(),
|
|
10
|
+
setupId: z.string().uuid().optional(),
|
|
11
|
+
action: z.enum([
|
|
12
|
+
"inspect",
|
|
13
|
+
"start",
|
|
14
|
+
"get",
|
|
15
|
+
"approve",
|
|
16
|
+
"prepare",
|
|
17
|
+
"recheck",
|
|
18
|
+
"open",
|
|
19
|
+
"begin_verification",
|
|
20
|
+
"cancel",
|
|
21
|
+
"release"
|
|
22
|
+
]),
|
|
23
|
+
expectedRevision: z.number().int().positive().optional(),
|
|
24
|
+
endpointId: z.string().min(1).max(500).optional(),
|
|
25
|
+
open: z.enum([
|
|
26
|
+
"chrome",
|
|
27
|
+
"folder",
|
|
28
|
+
"both"
|
|
29
|
+
]).optional()
|
|
30
|
+
});
|
|
31
|
+
function registerBrowserSetupRoutes(app, deps) {
|
|
32
|
+
app.post("/api/browser/setup", deps.strictRateLimitMiddleware, async (c) => {
|
|
33
|
+
if (!isLocalOwnerRequest(c, deps.service)) return c.json({
|
|
34
|
+
ok: false,
|
|
35
|
+
error: "LOCAL_OWNER_REQUIRED: Open setup on the Gateway computer. Remote pairing is available in Device access."
|
|
36
|
+
}, 403);
|
|
37
|
+
const parsed = requestSchema.safeParse(await c.req.json().catch(() => null));
|
|
38
|
+
if (!parsed.success) return c.json({
|
|
39
|
+
ok: false,
|
|
40
|
+
error: "Invalid setup request"
|
|
41
|
+
}, 400);
|
|
42
|
+
const body = parsed.data;
|
|
43
|
+
const metadata = getSessionMetadata(body.conversationId);
|
|
44
|
+
if (!metadata) return c.json({
|
|
45
|
+
ok: false,
|
|
46
|
+
error: "Conversation not found"
|
|
47
|
+
}, 404);
|
|
48
|
+
const service = deps.service.browserSetup;
|
|
49
|
+
const context = {
|
|
50
|
+
conversationId: body.conversationId,
|
|
51
|
+
agentId: metadata.agentId
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
if (body.action === "inspect" || body.action === "start") return c.json({
|
|
55
|
+
ok: true,
|
|
56
|
+
payload: await service.command(body.action, {}, context)
|
|
57
|
+
});
|
|
58
|
+
if (!body.setupId) return c.json({
|
|
59
|
+
ok: false,
|
|
60
|
+
error: "setupId is required"
|
|
61
|
+
}, 400);
|
|
62
|
+
const setup = service.owned(body.setupId, context.conversationId, context.agentId);
|
|
63
|
+
if (body.action === "get" || body.action === "recheck" || body.action === "cancel") return c.json({
|
|
64
|
+
ok: true,
|
|
65
|
+
payload: await service.command(body.action, { setupId: setup.id }, context)
|
|
66
|
+
});
|
|
67
|
+
const principalId = getGatewayPrincipal(c).principalId;
|
|
68
|
+
if (body.action === "approve") {
|
|
69
|
+
if (!body.expectedRevision) throw new Error("expectedRevision is required");
|
|
70
|
+
return c.json({
|
|
71
|
+
ok: true,
|
|
72
|
+
payload: service.view(service.approve(setup, principalId, body.expectedRevision))
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (body.action === "release") return c.json({
|
|
76
|
+
ok: true,
|
|
77
|
+
payload: service.view(await service.release(setup))
|
|
78
|
+
});
|
|
79
|
+
if (setup.approvedBy !== principalId) return c.json({
|
|
80
|
+
ok: false,
|
|
81
|
+
error: "Plan must be approved by this owner"
|
|
82
|
+
}, 403);
|
|
83
|
+
if (body.action === "prepare") return c.json({
|
|
84
|
+
ok: true,
|
|
85
|
+
payload: service.view(await service.prepare(setup))
|
|
86
|
+
});
|
|
87
|
+
if (body.action === "open") {
|
|
88
|
+
await service.open(setup, body.open ?? "both");
|
|
89
|
+
return c.json({
|
|
90
|
+
ok: true,
|
|
91
|
+
payload: service.view(readBrowserSetup(setup.id))
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (body.action === "begin_verification") {
|
|
95
|
+
if (!body.endpointId || !body.expectedRevision) throw new Error("Select an endpoint and provide expectedRevision");
|
|
96
|
+
return c.json({
|
|
97
|
+
ok: true,
|
|
98
|
+
payload: service.view(service.begin(setup, body.endpointId, new URL(c.req.url).origin, body.expectedRevision))
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return c.json({
|
|
102
|
+
ok: false,
|
|
103
|
+
error: "Unsupported action"
|
|
104
|
+
}, 400);
|
|
105
|
+
} catch (error) {
|
|
106
|
+
return c.json({
|
|
107
|
+
ok: false,
|
|
108
|
+
error: error instanceof Error ? error.message : "Browser setup failed"
|
|
109
|
+
}, 409);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
export { registerBrowserSetupRoutes };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { Hono } from 'hono';
|
|
1
|
+
import type { Context, Hono } from 'hono';
|
|
2
2
|
import type { AuthenticatedRouteDeps } from './deps.js';
|
|
3
|
+
export declare function isLocalOwnerRequest(c: Context, service: AuthenticatedRouteDeps['service']): boolean;
|
|
3
4
|
export declare function registerBrowserRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void;
|
|
@@ -21,17 +21,17 @@ import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
|
|
|
21
21
|
import { getConnectorInstance, getInstalledConnectorDefinition, listConnectorInstances } from "../../../connectors/instances.js";
|
|
22
22
|
import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
|
|
23
23
|
import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
|
|
24
|
-
import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
|
|
25
|
-
import { testConnectorInstance } from "../../../connectors/health.js";
|
|
26
|
-
import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
|
|
27
|
-
import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
|
|
28
|
-
import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
|
|
29
|
-
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
30
|
-
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
31
24
|
import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
|
|
32
25
|
import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
|
|
26
|
+
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
27
|
+
import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
|
|
28
|
+
import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
|
|
29
|
+
import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
|
|
30
|
+
import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
|
|
31
|
+
import { testConnectorInstance } from "../../../connectors/health.js";
|
|
33
32
|
import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
|
|
34
33
|
import { projectComposioConnectionStatus } from "../../../connectors/runtime-status.js";
|
|
34
|
+
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
35
35
|
import { registerCliConnectorRoutes } from "./cli-connectors.js";
|
|
36
36
|
//#region src/gateway/hono/routes/connectors.ts
|
|
37
37
|
init_logger();
|
|
@@ -4,8 +4,8 @@ import { acknowledgeHomeAttention } from "../../../storage/sqlite/home-attention
|
|
|
4
4
|
import { decideConnectorApproval } from "../../../storage/sqlite/connector-repository.js";
|
|
5
5
|
import { init_sqlite } from "../../../storage/sqlite/index.js";
|
|
6
6
|
import { HomeQueryService, buildHomeWorkbench, decisionFromTask } from "../../../tasks/home-query-service.js";
|
|
7
|
-
import { HomeOpportunityActionError, HomeOpportunityNotFoundError } from "../../../home-intelligence/application-service.js";
|
|
8
7
|
import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
|
|
8
|
+
import { HomeOpportunityActionError, HomeOpportunityNotFoundError } from "../../../home-intelligence/application-service.js";
|
|
9
9
|
//#region src/gateway/hono/routes/home.ts
|
|
10
10
|
init_src();
|
|
11
11
|
init_sqlite();
|
|
@@ -163,6 +163,14 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
|
|
|
163
163
|
return { register: registerBrowserAutomationRoutes };
|
|
164
164
|
}
|
|
165
165
|
},
|
|
166
|
+
{
|
|
167
|
+
id: "browser-setup",
|
|
168
|
+
match: (path) => path === "/api/browser/setup",
|
|
169
|
+
load: async () => {
|
|
170
|
+
const { registerBrowserSetupRoutes } = await import("./browser-setup.js");
|
|
171
|
+
return { register: registerBrowserSetupRoutes };
|
|
172
|
+
}
|
|
173
|
+
},
|
|
166
174
|
{
|
|
167
175
|
id: "browser",
|
|
168
176
|
match: (path) => startsWithAny(path, ["/api/browser"]),
|
|
@@ -2,8 +2,8 @@ import { init_paths_state, resolveStateDir } from "../../../config/paths-state.j
|
|
|
2
2
|
import { resolveAdbPath } from "../../../phone/adb-driver.js";
|
|
3
3
|
import { getPhoneRuntime } from "../../../phone/runtime.js";
|
|
4
4
|
import { RuntimeError } from "../../../runtime-tools/errors.js";
|
|
5
|
-
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
6
5
|
import { PhoneDependencyManager, probePhoneAdb } from "../../../runtime-tools/phone-dependencies.js";
|
|
6
|
+
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
7
7
|
import { z } from "zod";
|
|
8
8
|
import { Hono } from "hono";
|
|
9
9
|
import { bodyLimit } from "hono/body-limit";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Hono } from 'hono';
|
|
2
|
+
import { PhoneSetupService } from '../../../phone/setup/service.js';
|
|
3
|
+
import type { GatewayService } from '../../service.js';
|
|
4
|
+
import type { AuthenticatedRouteDeps } from './deps.js';
|
|
5
|
+
export declare function createPhoneSetupService(service: GatewayService): PhoneSetupService;
|
|
6
|
+
/** Registered inside the existing Phone admin route group. */
|
|
7
|
+
export declare function registerPhoneSetupRoutes(app: Hono, deps: AuthenticatedRouteDeps): void;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { resolveStateDir } from "../../../config/paths-state.js";
|
|
2
|
+
import { getSessionMetadata, init_session_read_repository } from "../../../storage/sqlite/session-read-repository.js";
|
|
3
|
+
import { init_paths } from "../../../config/paths.js";
|
|
4
|
+
import { resolveEffectiveAgentConfigForAgent } from "../../../config/agent-profile.js";
|
|
5
|
+
import { getModelRegistry, init_model_registry } from "../../../providers/model-registry.js";
|
|
6
|
+
import { init_providers, isProviderConfiguredSync } from "../../../providers/index.js";
|
|
7
|
+
import { phoneAllowsApp } from "../../../phone/app-access.js";
|
|
8
|
+
import { phoneModelProfile } from "../../../phone/model-adapter.js";
|
|
9
|
+
import { getPhoneRuntime } from "../../../phone/runtime.js";
|
|
10
|
+
import { PhoneSetupService } from "../../../phone/setup/service.js";
|
|
11
|
+
import { PhoneDependencyManager } from "../../../runtime-tools/phone-dependencies.js";
|
|
12
|
+
import { createHash } from "node:crypto";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
//#region src/gateway/hono/routes/phone-setup.ts
|
|
15
|
+
init_paths();
|
|
16
|
+
init_model_registry();
|
|
17
|
+
init_providers();
|
|
18
|
+
init_session_read_repository();
|
|
19
|
+
function createPhoneSetupService(service) {
|
|
20
|
+
const runtime = getPhoneRuntime();
|
|
21
|
+
return new PhoneSetupService({
|
|
22
|
+
runtime,
|
|
23
|
+
revision: (context, deviceId) => {
|
|
24
|
+
const agent = resolveEffectiveAgentConfigForAgent(context.agentId).config;
|
|
25
|
+
const device = runtime.repository.list().find((device) => device.id === deviceId);
|
|
26
|
+
const model = agent.models.phoneUse?.primary ? getModelRegistry().resolve(agent.models.phoneUse.primary) : void 0;
|
|
27
|
+
return createHash("sha256").update(JSON.stringify([
|
|
28
|
+
service.currentConfig.phone,
|
|
29
|
+
agent.models.phoneUse,
|
|
30
|
+
agent.tools.phone_use,
|
|
31
|
+
agent.toolAllowlist,
|
|
32
|
+
device,
|
|
33
|
+
model && [
|
|
34
|
+
model.api,
|
|
35
|
+
model.baseUrl,
|
|
36
|
+
model.input,
|
|
37
|
+
phoneModelProfile(model)
|
|
38
|
+
]
|
|
39
|
+
])).digest("hex");
|
|
40
|
+
},
|
|
41
|
+
leaseActive: (deviceId) => {
|
|
42
|
+
const device = runtime.repository.list().find((device) => device.id === deviceId);
|
|
43
|
+
return device ? runtime.repository.leaseActive(device.serial) : false;
|
|
44
|
+
},
|
|
45
|
+
connected: async (deviceId, signal) => {
|
|
46
|
+
const device = runtime.repository.get(deviceId);
|
|
47
|
+
return (await (await runtime.driverFor(device, service.currentConfig)).discover(signal)).some((found) => found.serial === device.serial && found.state === "device");
|
|
48
|
+
},
|
|
49
|
+
inspect: async (context, source) => {
|
|
50
|
+
const config = service.currentConfig;
|
|
51
|
+
const resolved = resolveEffectiveAgentConfigForAgent(context.agentId);
|
|
52
|
+
const agent = resolved.config;
|
|
53
|
+
const ref = agent.models.phoneUse?.primary;
|
|
54
|
+
const model = ref ? getModelRegistry().resolve(ref) : void 0;
|
|
55
|
+
const dependencies = await new PhoneDependencyManager({
|
|
56
|
+
stateDir: resolveStateDir(),
|
|
57
|
+
config: config.runtimeTools,
|
|
58
|
+
adbPath: config.phone.adbPath
|
|
59
|
+
}).status();
|
|
60
|
+
let localDiscovery = [];
|
|
61
|
+
let diagnostic;
|
|
62
|
+
if (source === "local" && dependencies.some((item) => item.kind === "adb" && item.state === "ready")) try {
|
|
63
|
+
localDiscovery = (await runtime.discover(config)).map(({ name, state, emulator }) => ({
|
|
64
|
+
name,
|
|
65
|
+
state,
|
|
66
|
+
emulator
|
|
67
|
+
}));
|
|
68
|
+
} catch {
|
|
69
|
+
diagnostic = "PHONE_SETUP_DISCOVERY_FAILED";
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
enabled: config.phone.enabled,
|
|
73
|
+
toolAllowed: agent.tools.phone_use?.mode !== "deny" && (!agent.toolAllowlist || agent.toolAllowlist.includes("phone_use")),
|
|
74
|
+
model: {
|
|
75
|
+
ref,
|
|
76
|
+
source: resolved.sources["models.phoneUse.primary"],
|
|
77
|
+
chatRef: agent.models.chat?.primary,
|
|
78
|
+
supported: Boolean(model && phoneModelProfile(model)),
|
|
79
|
+
configured: Boolean(model && isProviderConfiguredSync(model.provider))
|
|
80
|
+
},
|
|
81
|
+
dependencies: dependencies.map(({ kind, state, version, canInstall }) => ({
|
|
82
|
+
kind,
|
|
83
|
+
state,
|
|
84
|
+
version,
|
|
85
|
+
canInstall
|
|
86
|
+
})),
|
|
87
|
+
devices: runtime.repository.list().map((device) => ({
|
|
88
|
+
id: device.id,
|
|
89
|
+
name: device.name,
|
|
90
|
+
source: device.connection ? "aliyun" : "local",
|
|
91
|
+
enabled: device.enabled,
|
|
92
|
+
settingsAllowed: phoneAllowsApp(device, "com.android.settings")
|
|
93
|
+
})),
|
|
94
|
+
localDiscovery,
|
|
95
|
+
diagnostic
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/** Registered inside the existing Phone admin route group. */
|
|
101
|
+
function registerPhoneSetupRoutes(app, deps) {
|
|
102
|
+
const schema = z.strictObject({
|
|
103
|
+
conversationId: z.string().uuid(),
|
|
104
|
+
setupId: z.string().uuid().optional(),
|
|
105
|
+
action: z.enum([
|
|
106
|
+
"inspect",
|
|
107
|
+
"start",
|
|
108
|
+
"get",
|
|
109
|
+
"recheck",
|
|
110
|
+
"source",
|
|
111
|
+
"begin_verification",
|
|
112
|
+
"release",
|
|
113
|
+
"cancel"
|
|
114
|
+
]),
|
|
115
|
+
source: z.enum(["local", "aliyun"]).optional(),
|
|
116
|
+
deviceId: z.string().uuid().optional(),
|
|
117
|
+
expectedRevision: z.number().int().positive().optional()
|
|
118
|
+
});
|
|
119
|
+
app.post("/api/phone/setup", deps.strictRateLimitMiddleware, async (c) => {
|
|
120
|
+
const parsed = schema.safeParse(await c.req.json().catch(() => null));
|
|
121
|
+
if (!parsed.success) return c.json({
|
|
122
|
+
ok: false,
|
|
123
|
+
error: "Invalid phone setup request"
|
|
124
|
+
}, 400);
|
|
125
|
+
const body = parsed.data;
|
|
126
|
+
const metadata = getSessionMetadata(body.conversationId);
|
|
127
|
+
if (!metadata) return c.json({
|
|
128
|
+
ok: false,
|
|
129
|
+
error: "Conversation not found"
|
|
130
|
+
}, 404);
|
|
131
|
+
const context = {
|
|
132
|
+
conversationId: body.conversationId,
|
|
133
|
+
agentId: metadata.agentId
|
|
134
|
+
};
|
|
135
|
+
const setup = deps.service.phoneSetup;
|
|
136
|
+
try {
|
|
137
|
+
let payload;
|
|
138
|
+
if (body.action === "source") {
|
|
139
|
+
if (!body.setupId || !body.source || !body.expectedRevision) throw new Error("Choose a source and refresh current progress");
|
|
140
|
+
payload = await setup.source(context, body.setupId, body.source, body.expectedRevision);
|
|
141
|
+
} else if (body.action === "begin_verification") {
|
|
142
|
+
if (!body.setupId || !body.deviceId || !body.expectedRevision) throw new Error("Select a phone and approve the current test");
|
|
143
|
+
payload = await setup.begin(context, body.setupId, body.deviceId, body.expectedRevision, c.req.raw.signal);
|
|
144
|
+
} else if (body.action === "release") {
|
|
145
|
+
if (!body.setupId) throw new Error("setupId is required");
|
|
146
|
+
payload = await setup.release(context, body.setupId);
|
|
147
|
+
} else payload = await setup.command(body.action, { setupId: body.setupId }, context);
|
|
148
|
+
c.header("Cache-Control", "no-store");
|
|
149
|
+
return c.json({
|
|
150
|
+
ok: true,
|
|
151
|
+
payload
|
|
152
|
+
});
|
|
153
|
+
} catch (error) {
|
|
154
|
+
return c.json({
|
|
155
|
+
ok: false,
|
|
156
|
+
error: error instanceof Error ? error.message : "Phone setup failed"
|
|
157
|
+
}, 409);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
//#endregion
|
|
162
|
+
export { createPhoneSetupService, registerPhoneSetupRoutes };
|
|
@@ -7,6 +7,7 @@ import { init_providers, isProviderConfiguredSync } from "../../../providers/ind
|
|
|
7
7
|
import { normalizePhoneAppAccess, phoneAppAccess } from "../../../phone/app-access.js";
|
|
8
8
|
import { createPhoneModel, phoneModelProfile } from "../../../phone/model-adapter.js";
|
|
9
9
|
import { getPhoneRuntime, phoneExecutionContext } from "../../../phone/runtime.js";
|
|
10
|
+
import { registerPhoneSetupRoutes } from "./phone-setup.js";
|
|
10
11
|
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
11
12
|
import { randomUUID } from "node:crypto";
|
|
12
13
|
import { z } from "zod";
|
|
@@ -53,6 +54,7 @@ function registerPhoneRoutes(parent, deps, runtime = getPhoneRuntime()) {
|
|
|
53
54
|
}, 403);
|
|
54
55
|
return next();
|
|
55
56
|
});
|
|
57
|
+
registerPhoneSetupRoutes(app, deps);
|
|
56
58
|
app.use("/api/phone/cloud/aliyun/*", bodyLimit({
|
|
57
59
|
maxSize: 24 * 1024,
|
|
58
60
|
onError: (c) => c.json({
|
|
@@ -217,13 +219,7 @@ function registerPhoneRoutes(parent, deps, runtime = getPhoneRuntime()) {
|
|
|
217
219
|
});
|
|
218
220
|
app.get("/api/phone/models", (c) => c.json({
|
|
219
221
|
ok: true,
|
|
220
|
-
payload: { models: [{
|
|
221
|
-
id: MOCK_PHONE_MODEL,
|
|
222
|
-
name: "Mock · Android Settings test",
|
|
223
|
-
profile: "mock-settings-about",
|
|
224
|
-
mock: true,
|
|
225
|
-
configured: true
|
|
226
|
-
}, ...getModelRegistry().getAll().flatMap((model) => {
|
|
222
|
+
payload: { models: [...getModelRegistry().getAll().flatMap((model) => {
|
|
227
223
|
const profile = phoneModelProfile(model);
|
|
228
224
|
return profile ? [{
|
|
229
225
|
id: `${model.provider}/${model.id}`,
|
|
@@ -2,14 +2,16 @@ import { PACKAGE_VERSION, init_package_version } from "../../../package-version.
|
|
|
2
2
|
import { claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, releaseConnectorWebhookDelivery } from "../../../storage/sqlite/connector-repository.js";
|
|
3
3
|
import { init_sqlite } from "../../../storage/sqlite/index.js";
|
|
4
4
|
import { resolveAutomationWebhookSecret } from "../../../automations/webhook-secrets.js";
|
|
5
|
-
import { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, normalizeComposioTriggerPayload, verifyComposioWebhook } from "../../../connectors/composio-triggers.js";
|
|
6
5
|
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
6
|
+
import { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, normalizeComposioTriggerPayload, verifyComposioWebhook } from "../../../connectors/composio-triggers.js";
|
|
7
7
|
import { serveStaticFile } from "../lib/static-ui.js";
|
|
8
8
|
import { createHash, timingSafeEqual } from "node:crypto";
|
|
9
9
|
//#region src/gateway/hono/routes/public-gateway.ts
|
|
10
10
|
init_package_version();
|
|
11
11
|
init_sqlite();
|
|
12
12
|
const PUBLIC_UI_ROOT_ASSETS = [
|
|
13
|
+
"browser-setup-test.html",
|
|
14
|
+
"browser-setup-test.js",
|
|
13
15
|
"apple-touch-icon.png",
|
|
14
16
|
"favicon-16x16.png",
|
|
15
17
|
"favicon-32x32.png",
|
|
@@ -19,7 +19,7 @@ async function loadProviderSetupSnapshot(provider, config) {
|
|
|
19
19
|
}
|
|
20
20
|
function readProviderSetupSnapshot(provider, configured, config) {
|
|
21
21
|
const languageProvider = getAllProviders().includes(provider);
|
|
22
|
-
const models = (languageProvider ? getModelsByProvider(provider) : []).filter((model) => !("computerUse" in model && model.computerUse));
|
|
22
|
+
const models = (languageProvider ? getModelsByProvider(provider) : []).filter((model) => !("computerUse" in model && model.computerUse) && !("phoneUse" in model && model.phoneUse));
|
|
23
23
|
const recommended = new Set((languageProvider ? getRecommendedModelsForProvider(provider) : []).map((model) => model.ref));
|
|
24
24
|
const source = getModelCatalogStore().getSource(provider);
|
|
25
25
|
const image = getImageGenerationProvider(provider);
|
|
@@ -325,6 +325,8 @@ export declare class GatewayConfigCoordinator {
|
|
|
325
325
|
};
|
|
326
326
|
phone: {
|
|
327
327
|
enabled: boolean;
|
|
328
|
+
semanticControls: boolean;
|
|
329
|
+
hierarchicalPlanning: boolean;
|
|
328
330
|
maxActionsPerSession: number;
|
|
329
331
|
maxModelRequests: number;
|
|
330
332
|
maxOperationDurationMs: number;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BrowserSetupService } from '../browser/setup/service.js';
|
|
1
2
|
import type { ClarificationSubmission } from '@xopcai/gateway-contract';
|
|
2
3
|
import { PhoneStreamGateway } from '../phone/stream-gateway.js';
|
|
3
4
|
import { WorkDiscoveryService } from '../work-discovery/service.js';
|
|
@@ -60,6 +61,10 @@ export declare class GatewayService {
|
|
|
60
61
|
readonly voiceRealtime: VoiceRealtimeRuntime;
|
|
61
62
|
getConfig(): Config;
|
|
62
63
|
getModelCatalogSync(): ModelCatalogSyncService;
|
|
64
|
+
private _phoneSetup?;
|
|
65
|
+
get phoneSetup(): import("../phone/setup/service.js").PhoneSetupService;
|
|
66
|
+
private _browserSetup?;
|
|
67
|
+
get browserSetup(): BrowserSetupService;
|
|
63
68
|
get browserAutomations(): BrowserAutomationService;
|
|
64
69
|
private stopGatewayUpdateCheck;
|
|
65
70
|
/** When set (e.g. by `GatewayServer`), `triggerGatewayProcessRestart` can stop HTTP then exit. */
|
|
@@ -29,7 +29,7 @@ import { init_session_key, resolveConversationId, sanitizeSegment } from "../rou
|
|
|
29
29
|
import { listKnowledgeItems } from "../knowledge-memory/repository.js";
|
|
30
30
|
import "../knowledge-memory/index.js";
|
|
31
31
|
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
32
|
-
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
32
|
+
import { resolveEffectiveAgentConfigForAgent, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
33
33
|
import { prewarmModelRegistry } from "../providers/model-registry.js";
|
|
34
34
|
import { init_providers, providers_exports } from "../providers/index.js";
|
|
35
35
|
import { AI_USAGE_RETENTION_MS, markStaleAiUsageEventsUnknown, pruneAiUsageEvents } from "../storage/sqlite/ai-usage-repository.js";
|
|
@@ -95,15 +95,20 @@ import { DiscussionSealer } from "../discussions/sealer.js";
|
|
|
95
95
|
import "../discussions/index.js";
|
|
96
96
|
import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
|
|
97
97
|
import "../endpoint-tools/index.js";
|
|
98
|
-
import {
|
|
99
|
-
import {
|
|
100
|
-
import
|
|
101
|
-
import {
|
|
98
|
+
import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
|
|
99
|
+
import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
|
|
100
|
+
import "../knowledge/index.js";
|
|
101
|
+
import { PersonalReplyComposer } from "../personal-agent/reply-composer.js";
|
|
102
|
+
import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
|
|
103
|
+
import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
|
|
104
|
+
import { startConnectorSupervisor } from "../connectors/supervisor.js";
|
|
102
105
|
import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
|
|
103
106
|
import { prepareAutomationAgentSession } from "./automation-agent-session.js";
|
|
104
107
|
import { stopTailscaleExposure } from "./tailscale-lifecycle.js";
|
|
105
108
|
import { getGatewayFileSpaceService } from "./file-space-service.js";
|
|
106
109
|
import { reconcileHomeIntelligenceAutomation } from "./home-intelligence-automation-reconciler.js";
|
|
110
|
+
import { createPhoneSetupService } from "./hono/routes/phone-setup.js";
|
|
111
|
+
import { BrowserSetupService } from "../browser/setup/service.js";
|
|
107
112
|
import { PhoneStreamGateway } from "../phone/stream-gateway.js";
|
|
108
113
|
import { PersonalProactivityService } from "../personal-agent/proactivity/service.js";
|
|
109
114
|
import { reconcilePersonalProactivityAutomation } from "../personal-agent/proactivity/automation.js";
|
|
@@ -112,8 +117,6 @@ import { buildFileAgentContext } from "../agent/source-context/file-context.js";
|
|
|
112
117
|
import { buildSessionAgentContext } from "../agent/source-context/session-context.js";
|
|
113
118
|
import { buildBrowserTabAgentContext } from "../agent/source-context/browser-tab.js";
|
|
114
119
|
import { WorkDiscoveryService } from "../work-discovery/service.js";
|
|
115
|
-
import { PersonalReplyComposer } from "../personal-agent/reply-composer.js";
|
|
116
|
-
import { ConnectionRecoveryService } from "../connectors/connection-recovery-service.js";
|
|
117
120
|
import { buildVoiceMemoryContext } from "../voice/realtime/memory-context.js";
|
|
118
121
|
import { buildVoicePersonaContext } from "../voice/realtime/persona-context.js";
|
|
119
122
|
import { voiceMemoryBudget, voicePersonaBudget } from "../voice/realtime/conversation-context.js";
|
|
@@ -151,10 +154,6 @@ import { DurableVoiceAgentBroker } from "../voice/realtime/agentBroker.js";
|
|
|
151
154
|
import { reconcileMemoryMaintenanceAutomations } from "./memory-maintenance-automation-reconciler.js";
|
|
152
155
|
import { GatewayReadiness } from "./startup-readiness.js";
|
|
153
156
|
import { createGatewayStartupTrace } from "./startup-trace.js";
|
|
154
|
-
import { startConnectorSupervisor } from "../connectors/supervisor.js";
|
|
155
|
-
import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
|
|
156
|
-
import "../knowledge/index.js";
|
|
157
|
-
import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
|
|
158
157
|
import { TaskCollaborationDelivery } from "../tasks/task-collaboration-delivery.js";
|
|
159
158
|
import { TaskMainUpdateExhaustedError } from "../tasks/task-main-update-retry.js";
|
|
160
159
|
import { TaskMainUpdateDelivery } from "../tasks/task-main-update-delivery.js";
|
|
@@ -162,8 +161,11 @@ import { allowsPersonalTaskNotification, personalReplyNotification, personalRunD
|
|
|
162
161
|
import { TaskMainUpdateDecisionService } from "../tasks/task-main-update-decision-service.js";
|
|
163
162
|
import { selectTaskMainUpdateAttempt, submitAndConfirmTaskMainUpdate } from "../tasks/task-main-update-input.js";
|
|
164
163
|
import { checkAppContextAccess, prepareAppContext } from "./service/app-context-access.js";
|
|
165
|
-
import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
|
|
166
164
|
import { applyAutomaticVoiceLanguage, inferProductLanguageFromEnvironment, initializeVoiceDefaults } from "../voice/language-profile.js";
|
|
165
|
+
import { HomeAdviceGenerator } from "../home-intelligence/generator.js";
|
|
166
|
+
import { HomeIntelligenceHost } from "../home-intelligence/host.js";
|
|
167
|
+
import { HomeSnapshotBuilder } from "../home-intelligence/snapshot.js";
|
|
168
|
+
import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
|
|
167
169
|
import crypto from "node:crypto";
|
|
168
170
|
//#region src/gateway/service.ts
|
|
169
171
|
init_session_repository();
|
|
@@ -303,6 +305,47 @@ var GatewayService = class {
|
|
|
303
305
|
getModelCatalogSync() {
|
|
304
306
|
return this.modelCatalogSync;
|
|
305
307
|
}
|
|
308
|
+
_phoneSetup;
|
|
309
|
+
get phoneSetup() {
|
|
310
|
+
return this._phoneSetup ??= createPhoneSetupService(this);
|
|
311
|
+
}
|
|
312
|
+
_browserSetup;
|
|
313
|
+
get browserSetup() {
|
|
314
|
+
return this._browserSetup ??= new BrowserSetupService({
|
|
315
|
+
getConfig: () => this.currentConfig,
|
|
316
|
+
saveConfig: (next, expected) => this.saveConfig(next, expected),
|
|
317
|
+
endpoints: this.endpointTools,
|
|
318
|
+
canSwitchDriver: (conversationId) => !this._agentService?.hasBrowserSessions() && !this.agentRunner.listActiveRuns().some((run) => run.conversationId !== conversationId),
|
|
319
|
+
policyRevision: (agentId) => {
|
|
320
|
+
const effective = resolveEffectiveAgentConfigForAgent(agentId).config;
|
|
321
|
+
return crypto.createHash("sha256").update(JSON.stringify({
|
|
322
|
+
policy: effective.tools.browser_use,
|
|
323
|
+
allowlist: effective.toolAllowlist
|
|
324
|
+
})).digest("hex");
|
|
325
|
+
},
|
|
326
|
+
canUseBrowser: (agentId) => {
|
|
327
|
+
const effective = resolveEffectiveAgentConfigForAgent(agentId).config;
|
|
328
|
+
return effective.tools.browser_use?.mode !== "deny" && (!effective.toolAllowlist || effective.toolAllowlist.includes("browser_use"));
|
|
329
|
+
},
|
|
330
|
+
release: async (endpointId, sessionId) => (await new RealtimeExtensionBrowserProvider(this.endpointTools).send({
|
|
331
|
+
action: "close",
|
|
332
|
+
sessionId,
|
|
333
|
+
target: {
|
|
334
|
+
kind: "endpoint",
|
|
335
|
+
endpointId
|
|
336
|
+
}
|
|
337
|
+
})).result,
|
|
338
|
+
doctor: async () => (await import("../browser/providers/browser-ext-install.js")).browserExtDoctor(),
|
|
339
|
+
prepare: async () => {
|
|
340
|
+
const installer = await import("../browser/providers/browser-ext-install.js");
|
|
341
|
+
return {
|
|
342
|
+
files: await installer.ensureBrowserExtensionArtifacts(),
|
|
343
|
+
nativeHost: await installer.installBrowserNativeMessagingHost({ configPath: this.getHealth().configPath })
|
|
344
|
+
};
|
|
345
|
+
},
|
|
346
|
+
open: async (action) => (await import("../browser/providers/browser-ext-install.js")).openBrowserExtensionInstallUi({ action })
|
|
347
|
+
});
|
|
348
|
+
}
|
|
306
349
|
get browserAutomations() {
|
|
307
350
|
if (!this.browserAutomationService) this.browserAutomationService = createRuntimeBrowserAutomationService({
|
|
308
351
|
getConfig: () => this.config,
|
|
@@ -682,6 +725,8 @@ var GatewayService = class {
|
|
|
682
725
|
endpointTools: this.endpointTools,
|
|
683
726
|
getAutomationService: () => this.automationService,
|
|
684
727
|
getBrowserAutomationService: () => this.browserAutomations,
|
|
728
|
+
getBrowserSetupService: () => this.browserSetup,
|
|
729
|
+
getPhoneSetupService: () => this.phoneSetup,
|
|
685
730
|
emitBrowserEvent: (type, payload) => this.emit(type, payload),
|
|
686
731
|
getNotesService: () => this.notesService,
|
|
687
732
|
getProjectService: () => this.projects,
|
|
@@ -7,6 +7,7 @@ import { init_model_policy, isComputerModel, isDedicatedComputerProfile } from "
|
|
|
7
7
|
import { voiceSupportsMode } from "../../packages/realtime-protocol/src/voice-catalog.js";
|
|
8
8
|
import { init_voice } from "../../packages/realtime-protocol/src/voice.js";
|
|
9
9
|
import { getModelCatalogStore, init_model_catalog_store } from "../providers/model-catalog-store.js";
|
|
10
|
+
import { phoneModelProfile } from "../phone/model-adapter.js";
|
|
10
11
|
import { compareCatalogModels } from "../providers/model-catalog-ranking.js";
|
|
11
12
|
import { prepareUpdateGlobalDefaults } from "./global-defaults-admin.js";
|
|
12
13
|
//#region src/gateway/xopc-cloud-capability-setup.ts
|
|
@@ -17,7 +18,7 @@ init_agent_config();
|
|
|
17
18
|
init_repository();
|
|
18
19
|
init_model_catalog_store();
|
|
19
20
|
function supportsCapability(model, capability) {
|
|
20
|
-
if (model.availability !== "available" || isDedicatedComputerProfile(model.computerUse?.profile)) return false;
|
|
21
|
+
if (model.availability !== "available" || model.phoneUse || isDedicatedComputerProfile(model.computerUse?.profile)) return false;
|
|
21
22
|
if (capability === "chat") return model.kind === "language" && (model.operations.includes("chat.completions") || model.operations.includes("responses"));
|
|
22
23
|
if (capability === "vision") return model.kind === "language" && model.input.includes("image");
|
|
23
24
|
if (capability === "image-generation") return model.kind === "image" && model.operations.includes("images.generate");
|
|
@@ -100,6 +101,11 @@ function completeXopcCloudModelRoutes(models, source) {
|
|
|
100
101
|
api: source.api
|
|
101
102
|
})).sort((left, right) => compareCatalogModels(left, right))[0];
|
|
102
103
|
if (computer) next.computerUse ??= route(computer);
|
|
104
|
+
const phone = source.models.filter((model) => model.availability === "available" && phoneModelProfile({
|
|
105
|
+
...model,
|
|
106
|
+
api: source.api
|
|
107
|
+
})).sort((left, right) => compareCatalogModels(left, right, "phone"))[0];
|
|
108
|
+
if (phone) next.phoneUse ??= route(phone);
|
|
103
109
|
return next;
|
|
104
110
|
}
|
|
105
111
|
/** Build one atomic config update for the managed XOPC Cloud chat and media capabilities. */
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { HomeAdviceBudgetExceededError, isHomeProseLocalized } from "./generator.js";
|
|
3
4
|
import { homePatternKey } from "./strategy.js";
|
|
5
|
+
import { HomeAdvicePolicy } from "./policy.js";
|
|
4
6
|
import { HomeIntelligenceRepository } from "./repository.js";
|
|
5
7
|
import { HomeOpportunityApplicationService } from "./application-service.js";
|
|
6
|
-
import { HomeAdvicePolicy } from "./policy.js";
|
|
7
|
-
import { HomeAdviceBudgetExceededError, isHomeProseLocalized } from "./generator.js";
|
|
8
8
|
import { buildHomeOpportunityNotification } from "./notification.js";
|
|
9
9
|
import { createHash } from "node:crypto";
|
|
10
10
|
//#region src/home-intelligence/host.ts
|
|
@@ -2,8 +2,8 @@ import { createLogger } from "../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { init_paths, resolveConfigPath } from "../config/paths.js";
|
|
4
4
|
import { loadConfig } from "../config/loader.js";
|
|
5
|
-
import { resolveGatewayService } from "../daemon/service.js";
|
|
6
5
|
import { isRestartEnabled } from "../config/commands.flags.js";
|
|
6
|
+
import { resolveGatewayService } from "../daemon/service.js";
|
|
7
7
|
import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "./restart.js";
|
|
8
8
|
import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
|
|
9
9
|
import { refreshGatewayServiceAfterUpdate } from "./update-service-refresh.js";
|
|
@@ -14,6 +14,7 @@ export interface PhoneDriver {
|
|
|
14
14
|
execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
|
|
15
15
|
settleMs: number;
|
|
16
16
|
resetTask?: boolean;
|
|
17
|
+
settingsPage?: 'about-phone';
|
|
17
18
|
}): Promise<void>;
|
|
18
19
|
}
|
|
19
20
|
/** Read only the active native editor, never historical input-method entries. */
|
|
@@ -38,5 +39,6 @@ export declare class AdbPhoneDriver implements PhoneDriver {
|
|
|
38
39
|
execute(serial: string, action: PhoneAction, observation: PhoneObservation, signal: AbortSignal, options?: {
|
|
39
40
|
settleMs: number;
|
|
40
41
|
resetTask?: boolean;
|
|
42
|
+
settingsPage?: 'about-phone';
|
|
41
43
|
}): Promise<void>;
|
|
42
44
|
}
|