@xopcai/xopc 0.0.251 → 0.0.252
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/README.md +8 -5
- package/README.zh-CN.md +8 -5
- package/dist/browser-ext/dist/background.js +358 -768
- package/dist/browser-ext/manifest.json +1 -2
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-DfBjTSo9.js → activity-store-w3eq3YpP.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bo_dmLv8.js → agent-avatar-dicebear-k039rbUz.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-kILWelNb.js → agent-defaults-settings-panel-D4J4oq8p.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-yuUn8n-f.js → agents-Bmth_bSQ.js} +1 -1
- package/dist/gateway/static/root/assets/{api-zxpcJfgj.js → api-2joIfbrH.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-Cz56nrVF.js → app-management-settings-panel-ByJ4kiD0.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DxSws5U4.js → appearance-settings-BK2Jga-B.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-B3ky7cWU.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-7k15-hqo.js → archive-plugin-DMDKtYpi.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-B-SFpjd9.js → attachment-load-B764Ql3Z.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-Qy36j19q.js → automations-page-D-sO8CZe.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-Ds5-_-9z.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CPOZQt8F.js → binary-plugins-fxtzYRpv.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DhvVlIp9.js → block-editor-Bcjtvckh.js} +3 -3
- package/dist/gateway/static/root/assets/browser-automation-inputs-BSmnusjD.js +1 -0
- package/dist/gateway/static/root/assets/browser-automations-page-DC_OQIBk.js +3 -0
- package/dist/gateway/static/root/assets/browser-settings-page-C1FojyG6.js +3 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-Bs59UCut.js +7 -0
- package/dist/gateway/static/root/assets/channels-settings-CM9vNmoo.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-CX-yWwLD.js → channels-status-swr-BuWjIG_a.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-1PJoxRuV.js → chat-terminal-dock-5SevEo_I.js} +2 -2
- package/dist/gateway/static/root/assets/connectors-page-BPZ44D-V.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-CBCc6zFA.js → cron-expression-DtsfalBM.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-u8K5Kt_N.js → date-picker-tDEQV5TP.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-y_i_cnpz.js → dependency-picker-HhNwg0Y2.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-DyL0JxLm.js → desktop-pet-acU4Li-C.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-d2d_IsyP.js → desktop-pet-settings-R84AR0Pe.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DqIBKJwl.js → extension-debug-page-CrLlRkSN.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DUW1xxj2.js → extension-page-BH5lmZXE.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BHY9qaNw.js → extension-settings-page-BscjNAd1.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-CMNbl0FZ.js → gateway-config-swr-9HidFZUd.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-BxLcW6ij.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CR7Xg8As.js → gateway-startup-retry-DRCPXONr.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-7CD9iPR7.js → heartbeat-settings-K5Zhl2rx.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-CZAg9RBv.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-C5mn73ca.js → image-generation-api-CR6Kle8H.js} +1 -1
- package/dist/gateway/static/root/assets/index-D4Ykja-U.js +72 -0
- package/dist/gateway/static/root/assets/index-zIJ3AXgR.css +2 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BtlqMleF.js → keyboard-shortcuts-settings-B1QR49-7.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BjxfkjxE.js → local-app-workbench-page-wicoV-ti.js} +2 -2
- package/dist/gateway/static/root/assets/{local-apps-page-B7xqQe2s.js → local-apps-page-C74It-T8.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-CF4erhjB.js → locale-store-BfZGZKSs.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-kACaPZKL.js → logs-page-xX-7S49A.js} +2 -2
- package/dist/gateway/static/root/assets/{management-settings-A432siER.js → management-settings-1kNnYL97.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-CQvzsE24.js → markdown-view-DjiwT28p.js} +2 -2
- package/dist/gateway/static/root/assets/{media-plugins-CpvYiauZ.js → media-plugins-B5c0AoS1.js} +1 -1
- package/dist/gateway/static/root/assets/messages-DaIwVWar.js +3 -0
- package/dist/gateway/static/root/assets/{mobile-pairing-wizard-DyjVGngO.js → mobile-pairing-wizard-CsIZqK51.js} +1 -1
- package/dist/gateway/static/root/assets/note-detail-panel-CfWxopl4.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-CYN-LCHJ.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-B3FKzjR6.js → page-tabs-CqJN6Ljz.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DnjrwAHD.js → preview-open-alternatives-DqRIGxf4.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-COcr_NUJ.js → product-open-page-DE2nPE_K.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-B5G3LzDq.js +1 -0
- package/dist/gateway/static/root/assets/{projects-page-BzH8pjEz.js → projects-page-CuVK2mKu.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-BsRBlji7.js → registry-api-Bpy8XX-5.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Dnd73xWt.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-LO4wZ_dO.js → runtime-tools-settings-panel-Bb4b74-P.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-crcj4-Pm.js → schema-form-DoPU5j3J.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-XL4LyKZe.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-0ForzDSS.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-Bl4MvTmq.js → settings-form-section-Ci-9WajJ.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DplrjZ6x.js → settings-page-CL_2F95D.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DVws6XZc.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-CJP1kURj.js → share-preview-page-XUA3oKQX.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-BwDvcacF.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-BJjrATqE.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-DsjcKg9Q.js → skills-page-sXXAZDc9.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-D6gWBbvy.js → skills-page.utils-DD79Bl1I.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-_eCXfqCo.js → system-settings-panel-BEH64qBV.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-0jxMi75O.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-BOgkc_9D.js → theme-store-CISSxU1c.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-W5mktxl1.js → tunnel-api-DrKDhnJm.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-Na2DYzT3.js → use-autosave-CPYePL-Q.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-B6zLDfDl.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-OXweUxS_.js → voice-api-key-field-DKqzrCXx.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-C-ryeIxj.js → voice-config-api-e9xWjwBX.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-BqOsO47I.js → work-discovery-overlay-kTQug6bq.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-B9S_lfT1.js → workflow-run-setup-panel-m9SKj_GT.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-Bcd1XqP7.js +5 -0
- package/dist/gateway/static/root/index.html +10 -10
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/new-session.js +9 -0
- package/dist/src/agent/agent-manager.d.ts +2 -1
- package/dist/src/agent/agent-manager.js +6 -5
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/coding/repository-instructions.js +2 -2
- package/dist/src/agent/coding/workspace-revision.js +2 -2
- package/dist/src/agent/commands/command-isolation.js +2 -2
- package/dist/src/agent/embedded/model-runtime.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/external-tools/composio-provider.d.ts +1 -0
- package/dist/src/agent/external-tools/composio-provider.js +64 -34
- package/dist/src/agent/external-tools/search-error.js +5 -3
- package/dist/src/agent/image/tool-model-config.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
- package/dist/src/agent/service.js +4 -3
- package/dist/src/agent/service.types.d.ts +2 -1
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -0
- package/dist/src/agent/tasks/task-judge-service.js +3 -3
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
- package/dist/src/agent/tool-manuals/browser.js +15 -226
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -21
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +48 -165
- package/dist/src/agent/tools/browser/tool/schemas.d.ts +203 -16
- package/dist/src/agent/tools/browser/tool/schemas.js +146 -16
- package/dist/src/agent/tools/browser-automation-tool.d.ts +121 -0
- package/dist/src/agent/tools/browser-automation-tool.js +197 -0
- package/dist/src/agent/tools/factory.d.ts +6 -9
- package/dist/src/agent/tools/factory.js +28 -55
- package/dist/src/agent/tools/index.d.ts +2 -2
- package/dist/src/agent/tools/index.js +3 -3
- package/dist/src/agent/tools/review-workspace.js +2 -2
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/oauth/xopc-cloud.js +3 -1
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +2 -2
- package/dist/src/automations/domain/defaults.js +1 -1
- package/dist/src/automations/domain/types.d.ts +5 -5
- package/dist/src/automations/domain/validation.d.ts +12 -12
- package/dist/src/automations/domain/validation.js +3 -3
- package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
- package/dist/src/automations/draft/automation-draft-validator.js +1 -1
- package/dist/src/automations/service/action-executor.d.ts +1 -1
- package/dist/src/automations/service/action-executor.js +7 -7
- package/dist/src/browser/{recipes → automations}/index.d.ts +1 -0
- package/dist/src/browser/automations/index.js +4 -0
- package/dist/src/browser/automations/repository.d.ts +13 -0
- package/dist/src/browser/automations/repository.js +60 -0
- package/dist/src/browser/automations/runner.d.ts +17 -0
- package/dist/src/browser/automations/runner.js +173 -0
- package/dist/src/browser/automations/runtime-service.d.ts +6 -0
- package/dist/src/browser/automations/runtime-service.js +37 -0
- package/dist/src/browser/automations/schema.d.ts +144 -0
- package/dist/src/browser/automations/schema.js +135 -0
- package/dist/src/browser/automations/service.d.ts +146 -0
- package/dist/src/browser/automations/service.js +168 -0
- package/dist/src/browser/automations/types.d.ts +90 -0
- package/dist/src/browser/cache-dir-policy.d.ts +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -4
- package/dist/src/browser/drivers/browser-driver.d.ts +17 -0
- package/dist/src/browser/drivers/create-driver.d.ts +3 -0
- package/dist/src/browser/drivers/create-driver.js +84 -0
- package/dist/src/browser/drivers/extension-driver.d.ts +20 -0
- package/dist/src/browser/drivers/extension-driver.js +47 -0
- package/dist/src/browser/drivers/playwright-driver.d.ts +38 -0
- package/dist/src/browser/drivers/playwright-driver.js +406 -0
- package/dist/src/browser/index.d.ts +10 -15
- package/dist/src/browser/index.js +10 -15
- package/dist/src/browser/install-lock.d.ts +1 -2
- package/dist/src/browser/install-lock.js +3 -9
- package/dist/src/browser/install-progress.d.ts +1 -1
- package/dist/src/browser/observation/format.d.ts +2 -0
- package/dist/src/browser/observation/format.js +26 -0
- package/dist/src/browser/policy/approval-store.d.ts +17 -0
- package/dist/src/browser/policy/approval-store.js +62 -0
- package/dist/src/browser/policy/browser-policy.d.ts +3 -0
- package/dist/src/browser/policy/browser-policy.js +27 -0
- package/dist/src/browser/providers/browser-ext-install.d.ts +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -6
- package/dist/src/browser/providers/browser-use.js +1 -1
- package/dist/src/browser/providers/browserbase.js +1 -1
- package/dist/src/browser/providers/extension-ws-acquire.d.ts +1 -4
- package/dist/src/browser/providers/extension-ws-acquire.js +1 -13
- package/dist/src/browser/providers/extension.d.ts +3 -22
- package/dist/src/browser/providers/extension.js +7 -15
- package/dist/src/browser/providers/index.d.ts +2 -2
- package/dist/src/browser/providers/index.js +3 -3
- package/dist/src/browser/providers/types.d.ts +0 -94
- package/dist/src/browser/readiness.d.ts +4 -22
- package/dist/src/browser/readiness.js +55 -118
- package/dist/src/browser/runtime/browser-runtime.d.ts +30 -0
- package/dist/src/browser/runtime/browser-runtime.js +362 -0
- package/dist/src/browser/url-policy.d.ts +3 -3
- package/dist/src/browser/url-policy.js +7 -6
- package/dist/src/browser/verification/expectation.d.ts +2 -0
- package/dist/src/browser/verification/expectation.js +17 -0
- package/dist/src/cli/command-loaders.js +1 -0
- package/dist/src/cli/command-manifest.js +5 -1
- package/dist/src/cli/commands/browser-cli-helpers.d.ts +0 -6
- package/dist/src/cli/commands/browser-cli-helpers.js +11 -144
- package/dist/src/cli/commands/browser.d.ts +0 -5
- package/dist/src/cli/commands/browser.js +11 -152
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/node-version.js +25 -9
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/platform.d.ts +1 -0
- package/dist/src/cli/commands/platform.js +111 -0
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +10 -4
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +131 -84
- package/dist/src/config/schema.js +112 -59
- package/dist/src/connectors/composio-sessions.js +1 -3
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/extensions/marketplace.js +4 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +12 -26
- package/dist/src/gateway/hono/lib/config-payload.js +11 -40
- package/dist/src/gateway/hono/routes/browser-automations.d.ts +3 -0
- package/dist/src/gateway/hono/routes/browser-automations.js +77 -0
- package/dist/src/gateway/hono/routes/browser-install.js +0 -32
- package/dist/src/gateway/hono/routes/browser.d.ts +0 -17
- package/dist/src/gateway/hono/routes/browser.js +46 -568
- package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -1
- package/dist/src/gateway/hono/routes/config.js +0 -11
- package/dist/src/gateway/hono/routes/lazy-bundles.js +5 -5
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service.d.ts +4 -6
- package/dist/src/gateway/service.js +24 -27
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/platform/client.d.ts +121 -0
- package/dist/src/platform/client.js +108 -0
- package/dist/src/platform/contracts.d.ts +194 -0
- package/dist/src/platform/contracts.js +150 -0
- package/dist/src/platform/index.d.ts +4 -0
- package/dist/src/platform/index.js +9 -0
- package/dist/src/platform/resolution.d.ts +4 -0
- package/dist/src/platform/resolution.js +16 -0
- package/dist/src/platform/worker.d.ts +6 -0
- package/dist/src/platform/worker.js +75 -0
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/providers/register-runtime-providers.js +1 -1
- package/dist/src/providers/xopc-cloud-config.js +3 -1
- package/dist/src/session/session-context-for-llm.js +41 -1
- package/dist/src/share/hosted-session-share.js +3 -1
- package/dist/src/share/share-thumbnail.js +1 -1
- package/dist/src/storage/sqlite/migrations/153_browser_control_v2.sql +45 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +16 -20
- package/dist/src/tasks/home-query-service.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/tunnel/env.js +3 -1
- package/dist/src/work-discovery/service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/package.json +6 -6
- package/dist/gateway/static/root/assets/apps-page-BnizTdgs.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-CZRKqSqY.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-pN5LbChY.js +0 -8
- package/dist/gateway/static/root/assets/browser-workflow-inputs-BX1-uM9L.js +0 -1
- package/dist/gateway/static/root/assets/browser-workflows-page-C65MI57t.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CJw2e16J.js +0 -7
- package/dist/gateway/static/root/assets/channels-settings-CRgjb4Ck.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-Dcpdy06y.js +0 -2
- package/dist/gateway/static/root/assets/gateway-config-api-e3BRcgDx.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-Cheo0Rkc.js +0 -1
- package/dist/gateway/static/root/assets/home-page-DVrTRqNc.js +0 -1
- package/dist/gateway/static/root/assets/index-B7CX4Qob.css +0 -2
- package/dist/gateway/static/root/assets/index-BHrpyJ4t.js +0 -72
- package/dist/gateway/static/root/assets/messages-Cf5hpZE6.js +0 -3
- package/dist/gateway/static/root/assets/note-detail-panel-CUd8O4K7.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-BLQwd39W.js +0 -8
- package/dist/gateway/static/root/assets/project-detail-page-NttW338u.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BxpjSDnL.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BLMaibOb.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BRvvKhoH.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DTOsxQC1.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CemgzEi4.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BWYanBlQ.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-D0Z_K5JT.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-B_-SNat-.js +0 -2
- package/dist/gateway/static/root/assets/workflows-page-CNOT2Coo.js +0 -5
- package/dist/src/agent/tools/browser-recipe-tool.d.ts +0 -12
- package/dist/src/agent/tools/browser-recipe-tool.js +0 -113
- package/dist/src/browser/actions/extension-registry-bridge.d.ts +0 -5
- package/dist/src/browser/actions/extension-registry-bridge.js +0 -312
- package/dist/src/browser/actions/registry.d.ts +0 -5
- package/dist/src/browser/actions/registry.js +0 -741
- package/dist/src/browser/actions/types.d.ts +0 -65
- package/dist/src/browser/backend-from-config.d.ts +0 -22
- package/dist/src/browser/backend-from-config.js +0 -99
- package/dist/src/browser/browser-command-timeout.d.ts +0 -2
- package/dist/src/browser/browser-command-timeout.js +0 -11
- package/dist/src/browser/cdp-local-launcher.d.ts +0 -35
- package/dist/src/browser/cdp-local-launcher.js +0 -154
- package/dist/src/browser/cdp-supervisor.d.ts +0 -58
- package/dist/src/browser/cdp-supervisor.js +0 -133
- package/dist/src/browser/humanize.d.ts +0 -80
- package/dist/src/browser/humanize.js +0 -363
- package/dist/src/browser/manager.d.ts +0 -50
- package/dist/src/browser/manager.js +0 -251
- package/dist/src/browser/pipeline/output.d.ts +0 -35
- package/dist/src/browser/pipeline/output.js +0 -74
- package/dist/src/browser/pipeline/runner.d.ts +0 -27
- package/dist/src/browser/pipeline/runner.js +0 -453
- package/dist/src/browser/pipeline/schema.d.ts +0 -42
- package/dist/src/browser/pipeline/schema.js +0 -116
- package/dist/src/browser/pipeline/template.d.ts +0 -30
- package/dist/src/browser/pipeline/template.js +0 -112
- package/dist/src/browser/providers/cloakbrowser.d.ts +0 -83
- package/dist/src/browser/providers/cloakbrowser.js +0 -612
- package/dist/src/browser/recipes/index.js +0 -3
- package/dist/src/browser/recipes/repository.d.ts +0 -13
- package/dist/src/browser/recipes/repository.js +0 -81
- package/dist/src/browser/recipes/runtime-service.d.ts +0 -6
- package/dist/src/browser/recipes/runtime-service.js +0 -30
- package/dist/src/browser/recipes/service.d.ts +0 -36
- package/dist/src/browser/recipes/service.js +0 -186
- package/dist/src/browser/recipes/types.d.ts +0 -36
- package/dist/src/browser/schemas.d.ts +0 -53
- package/dist/src/browser/schemas.js +0 -68
- package/dist/src/browser/session-lifecycle.d.ts +0 -40
- package/dist/src/browser/session-lifecycle.js +0 -136
- package/dist/src/browser/snapshot-helpers.d.ts +0 -24
- package/dist/src/browser/snapshot-helpers.js +0 -70
- package/dist/src/browser/stealth.d.ts +0 -46
- package/dist/src/browser/stealth.js +0 -163
- package/dist/src/gateway/hono/routes/browser-workflows.d.ts +0 -3
- package/dist/src/gateway/hono/routes/browser-workflows.js +0 -78
- /package/dist/src/browser/{actions → automations}/types.js +0 -0
- /package/dist/src/browser/{recipes/types.js → drivers/browser-driver.js} +0 -0
|
@@ -1,152 +1,19 @@
|
|
|
1
1
|
import { init_loader, loadConfig } from "../../config/loader.js";
|
|
2
|
-
import {
|
|
3
|
-
import { BrowserManager } from "../../browser/manager.js";
|
|
4
|
-
import { resolveBrowserBackendFromConfig } from "../../browser/backend-from-config.js";
|
|
5
|
-
import { createBrowserActionRegistry } from "../../browser/actions/registry.js";
|
|
6
|
-
import { runBrowserPipeline, validateBrowserPipeline } from "../../browser/pipeline/runner.js";
|
|
7
|
-
import "../../browser/index.js";
|
|
8
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { checkBrowserReadiness } from "../../browser/readiness.js";
|
|
9
3
|
//#region src/cli/commands/browser-cli-helpers.ts
|
|
10
4
|
init_loader();
|
|
11
|
-
|
|
12
|
-
/** When set, `xopc browser open --headless` overrides config for this CLI invocation. */
|
|
13
|
-
let browserCliHeadlessOverride;
|
|
14
|
-
async function getManager() {
|
|
15
|
-
if (_manager) return _manager;
|
|
5
|
+
async function doctorCli() {
|
|
16
6
|
const config = await loadConfig();
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
getBackend: () => resolveBrowserBackendFromConfig(config)
|
|
23
|
-
});
|
|
24
|
-
return _manager;
|
|
25
|
-
}
|
|
26
|
-
async function getActionContext() {
|
|
27
|
-
const manager = await getManager();
|
|
28
|
-
await manager.ensureConnected();
|
|
29
|
-
return {
|
|
30
|
-
page: manager.getExtensionProvider() ? null : await manager.getPage("cli"),
|
|
31
|
-
manager,
|
|
32
|
-
config: await loadConfig(),
|
|
33
|
-
taskId: "cli"
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
async function executeBrowserCliAction(action, args) {
|
|
37
|
-
const prevOverride = browserCliHeadlessOverride;
|
|
38
|
-
if (typeof args.headless === "boolean") browserCliHeadlessOverride = args.headless;
|
|
39
|
-
try {
|
|
40
|
-
const registry = createBrowserActionRegistry();
|
|
41
|
-
const ctx = await getActionContext();
|
|
42
|
-
const result = await registry.execute(action, ctx, args);
|
|
43
|
-
if (result.ok) {
|
|
44
|
-
if (result.text) console.log(result.text);
|
|
45
|
-
if (result.data && !result.text) console.log(JSON.stringify(result.data, null, 2));
|
|
46
|
-
} else {
|
|
47
|
-
console.error(`[${result.error?.code}] ${result.error?.message}`);
|
|
48
|
-
process.exitCode = 1;
|
|
49
|
-
}
|
|
50
|
-
if (action === "close") {
|
|
51
|
-
await _manager?.shutdown();
|
|
52
|
-
_manager = null;
|
|
53
|
-
}
|
|
54
|
-
} finally {
|
|
55
|
-
browserCliHeadlessOverride = prevOverride;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
async function validatePipelineCli(file) {
|
|
59
|
-
let yamlSource;
|
|
60
|
-
try {
|
|
61
|
-
yamlSource = await readFile(file, "utf8");
|
|
62
|
-
} catch (e) {
|
|
63
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
64
|
-
console.error(`Failed to read pipeline source: ${msg}`);
|
|
65
|
-
process.exitCode = 1;
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const registry = createBrowserActionRegistry();
|
|
69
|
-
const result = validateBrowserPipeline(yamlSource, registry);
|
|
70
|
-
if (result.ok) console.log(`✓ Pipeline "${result.document.name}" is valid (${result.document.pipeline.length} steps).`);
|
|
71
|
-
else {
|
|
72
|
-
console.error("✗ Pipeline validation failed:");
|
|
73
|
-
for (const err of result.errors) console.error(` ${err.path}: ${err.message}`);
|
|
74
|
-
process.exitCode = 1;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
async function runPipelineCli(file, args) {
|
|
78
|
-
let yamlSource;
|
|
79
|
-
try {
|
|
80
|
-
yamlSource = await readFile(file, "utf8");
|
|
81
|
-
} catch (e) {
|
|
82
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
83
|
-
console.error(`Failed to read pipeline source: ${msg}`);
|
|
84
|
-
process.exitCode = 1;
|
|
7
|
+
const readiness = await checkBrowserReadiness(config);
|
|
8
|
+
console.log("Browser Control v2");
|
|
9
|
+
console.log(`Driver: ${config.browser.driver.kind}`);
|
|
10
|
+
if (!readiness) {
|
|
11
|
+
console.log("Status: ready");
|
|
85
12
|
return;
|
|
86
13
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (result.ok) {
|
|
91
|
-
if (result.text) console.log(result.text);
|
|
92
|
-
if (result.data && !result.text) console.log(JSON.stringify(result.data, null, 2));
|
|
93
|
-
} else {
|
|
94
|
-
console.error(`Pipeline failed: [${result.error?.code}] ${result.error?.message}`);
|
|
95
|
-
if (result.diagnostics?.snapshot) console.error(`Snapshot:\n${result.diagnostics.snapshot.slice(0, 2e3)}`);
|
|
96
|
-
process.exitCode = 1;
|
|
97
|
-
}
|
|
98
|
-
await _manager?.shutdown();
|
|
99
|
-
_manager = null;
|
|
100
|
-
}
|
|
101
|
-
async function doctorCli() {
|
|
102
|
-
console.log("Browser Doctor");
|
|
103
|
-
console.log("──────────────");
|
|
104
|
-
try {
|
|
105
|
-
const pw = await loadPlaywrightCoreModule();
|
|
106
|
-
const chromium = pw.chromium ?? pw.default?.chromium;
|
|
107
|
-
if (chromium) {
|
|
108
|
-
console.log("✓ playwright-core installed");
|
|
109
|
-
const execPath = chromium.executablePath?.();
|
|
110
|
-
if (execPath) console.log(` Chromium path: ${execPath}`);
|
|
111
|
-
else console.log(" ⚠ No default Chromium path detected. Run: npx playwright install chromium");
|
|
112
|
-
} else console.log("✗ playwright-core chromium not available");
|
|
113
|
-
} catch {
|
|
114
|
-
console.log("✗ playwright-core not installed");
|
|
115
|
-
}
|
|
116
|
-
try {
|
|
117
|
-
await loadConfig();
|
|
118
|
-
console.log(`\nConfig:`);
|
|
119
|
-
console.log(` enabled: true`);
|
|
120
|
-
console.log(` headless: false`);
|
|
121
|
-
console.log(` backend: extension`);
|
|
122
|
-
console.log(` provider: local`);
|
|
123
|
-
{
|
|
124
|
-
const port = 19820;
|
|
125
|
-
const host = "127.0.0.1";
|
|
126
|
-
console.log(`\nExtension Bridge:`);
|
|
127
|
-
console.log(` endpoint: ws://${host}:${port}/browser-ext`);
|
|
128
|
-
try {
|
|
129
|
-
const { browserExtDoctor } = await import("../../browser/providers/browser-ext-install.js");
|
|
130
|
-
const artifacts = await browserExtDoctor();
|
|
131
|
-
console.log(` artifacts: ${artifacts.installed ? "✓ installed" : "✗ not installed"}`);
|
|
132
|
-
if (artifacts.extensionDir) console.log(` path: ${artifacts.extensionDir}`);
|
|
133
|
-
if (artifacts.needsRefresh) console.log(` refresh: ⚠ bundled update available`);
|
|
134
|
-
} catch {
|
|
135
|
-
console.log(` artifacts: ⚠ could not check`);
|
|
136
|
-
}
|
|
137
|
-
try {
|
|
138
|
-
const data = await (await fetch(`http://${host}:${port}/`)).json();
|
|
139
|
-
if (data.ok) {
|
|
140
|
-
console.log(` server: ✓ running`);
|
|
141
|
-
console.log(` extension: ${data.connected ? "✓ connected" : "⚠ waiting for connection"}`);
|
|
142
|
-
}
|
|
143
|
-
} catch {
|
|
144
|
-
console.log(` server: ✗ not running (start xopc with backend: 'extension' to enable)`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
} catch {
|
|
148
|
-
console.log("\n⚠ Could not load config");
|
|
149
|
-
}
|
|
14
|
+
console.error(`Status: ${readiness.hint.reason}`);
|
|
15
|
+
if (readiness.hint.detail) console.error(`Detail: ${readiness.hint.detail}`);
|
|
16
|
+
process.exitCode = 1;
|
|
150
17
|
}
|
|
151
18
|
//#endregion
|
|
152
|
-
export { doctorCli
|
|
19
|
+
export { doctorCli };
|
|
@@ -1,170 +1,29 @@
|
|
|
1
1
|
import { register } from "../registry.js";
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
//#region src/cli/commands/browser.ts
|
|
4
|
-
/**
|
|
5
|
-
* CLI: `xopc browser` — browser automation commands.
|
|
6
|
-
*
|
|
7
|
-
* Shares the same action registry and pipeline runner as the `browser_use` AgentTool.
|
|
8
|
-
*/
|
|
9
4
|
function createBrowserCommand(_ctx) {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
const { executeBrowserCliAction } = await import("./browser-cli-helpers.js");
|
|
13
|
-
await executeBrowserCliAction("open", {
|
|
14
|
-
url,
|
|
15
|
-
...opts
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
cmd.command("state").description("Get current page state (URL, title, ARIA snapshot)").option("--selector <selector>", "CSS selector to scope snapshot").action(async (opts) => {
|
|
19
|
-
const { executeBrowserCliAction } = await import("./browser-cli-helpers.js");
|
|
20
|
-
await executeBrowserCliAction("state", opts);
|
|
21
|
-
});
|
|
22
|
-
cmd.command("click").description("Click an element").option("--selector <selector>", "CSS selector").option("--text <text>", "Visible text").option("--role <role>", "ARIA role:name (e.g. button:Submit)").action(async (opts) => {
|
|
23
|
-
const { executeBrowserCliAction } = await import("./browser-cli-helpers.js");
|
|
24
|
-
await executeBrowserCliAction("click", opts);
|
|
25
|
-
});
|
|
26
|
-
cmd.command("type").description("Type text into an input").option("--selector <selector>", "CSS selector").option("--label <label>", "Label text").requiredOption("--text <text>", "Text to type").option("--enter", "Press Enter after typing").action(async (opts) => {
|
|
27
|
-
const { executeBrowserCliAction } = await import("./browser-cli-helpers.js");
|
|
28
|
-
await executeBrowserCliAction("type", {
|
|
29
|
-
...opts,
|
|
30
|
-
pressEnter: opts.enter
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
cmd.command("screenshot [path]").description("Take a screenshot").option("--selector <selector>", "CSS selector").option("--full-page", "Full page screenshot").action(async (path, opts) => {
|
|
34
|
-
const { executeBrowserCliAction } = await import("./browser-cli-helpers.js");
|
|
35
|
-
await executeBrowserCliAction("screenshot", {
|
|
36
|
-
path: path ?? "./screenshot.png",
|
|
37
|
-
...opts,
|
|
38
|
-
full_page: opts.fullPage
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
cmd.command("validate <file>").description("Validate a Browser Recipe v1 YAML file without executing").action(async (file) => {
|
|
42
|
-
const { validatePipelineCli } = await import("./browser-cli-helpers.js");
|
|
43
|
-
await validatePipelineCli(file);
|
|
44
|
-
});
|
|
45
|
-
cmd.command("run <file>").description("Run a Browser Recipe v1 YAML file").option("--arg <args...>", "Recipe args (key=<JSON value>)").action(async (file, opts) => {
|
|
46
|
-
const { runPipelineCli } = await import("./browser-cli-helpers.js");
|
|
47
|
-
const args = {};
|
|
48
|
-
if (opts.arg) for (const a of opts.arg) {
|
|
49
|
-
const eq = a.indexOf("=");
|
|
50
|
-
if (eq <= 0) throw new Error(`Invalid --arg: ${a}`);
|
|
51
|
-
args[a.slice(0, eq)] = JSON.parse(a.slice(eq + 1));
|
|
52
|
-
}
|
|
53
|
-
await runPipelineCli(file, args);
|
|
54
|
-
});
|
|
55
|
-
cmd.command("doctor").description("Check browser environment (Playwright, Chromium)").action(async () => {
|
|
5
|
+
const command = new Command("browser").description("Browser Control v2 diagnostics and extension setup");
|
|
6
|
+
command.command("doctor").description("Check the configured browser driver").action(async () => {
|
|
56
7
|
const { doctorCli } = await import("./browser-cli-helpers.js");
|
|
57
8
|
await doctorCli();
|
|
58
9
|
});
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
await executeBrowserCliAction("close", {});
|
|
62
|
-
});
|
|
63
|
-
const cloakCmd = cmd.command("cloakbrowser").description("CloakBrowser anti-fingerprint browser management");
|
|
64
|
-
cloakCmd.command("doctor").description("Check CloakBrowser installation status and version").action(async () => {
|
|
65
|
-
const { cloakBrowserDoctor } = await import("../../browser/providers/cloakbrowser.js");
|
|
66
|
-
const result = await cloakBrowserDoctor();
|
|
67
|
-
console.log("\n CloakBrowser Status\n");
|
|
68
|
-
console.log(` Installed: ${result.installed ? "✓ yes" : "✗ no"}`);
|
|
69
|
-
console.log(` Platform: ${result.platform}`);
|
|
70
|
-
console.log(` Version: ${result.version ?? "(not installed)"}`);
|
|
71
|
-
console.log(` Binary: ${result.binaryPath ?? "(not found)"}`);
|
|
72
|
-
console.log(` Cache dir: ${result.cacheDir}`);
|
|
73
|
-
console.log("");
|
|
74
|
-
if (!result.installed) console.log(" Run \"xopc browser cloakbrowser install\" to download CloakBrowser.\n");
|
|
75
|
-
});
|
|
76
|
-
cloakCmd.command("install").description("Download and install CloakBrowser binary").option("--cache-dir <dir>", "Custom cache directory for the binary").action(async (opts) => {
|
|
77
|
-
console.log("\n Downloading CloakBrowser...\n");
|
|
78
|
-
try {
|
|
79
|
-
const { launchCloakBrowser, cleanupCloakBrowser } = await import("../../browser/providers/cloakbrowser.js");
|
|
80
|
-
const result = await launchCloakBrowser({
|
|
81
|
-
headless: true,
|
|
82
|
-
temporaryProfile: true,
|
|
83
|
-
keepOpen: false,
|
|
84
|
-
cacheDir: opts.cacheDir
|
|
85
|
-
});
|
|
86
|
-
await result.browser.close().catch(() => {});
|
|
87
|
-
await cleanupCloakBrowser(result.childProcess, result.temporaryProfileDir);
|
|
88
|
-
console.log(" ✓ CloakBrowser installed successfully.\n");
|
|
89
|
-
} catch (e) {
|
|
90
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
91
|
-
console.error(` ✗ Installation failed: ${msg}\n`);
|
|
92
|
-
process.exitCode = 1;
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
const extensionCmd = cmd.command("extension").description("xopc Chrome extension (browser bridge) management");
|
|
96
|
-
extensionCmd.command("doctor").description("Check bundled extension install status").option("--cache-dir <dir>", "Custom bin cache directory").action(async (opts) => {
|
|
10
|
+
const extension = command.command("extension").description("Chrome extension setup");
|
|
11
|
+
extension.command("doctor").description("Check extension artifacts").action(async () => {
|
|
97
12
|
const { browserExtDoctor } = await import("../../browser/providers/browser-ext-install.js");
|
|
98
|
-
|
|
99
|
-
console.log("\n Chrome Extension Artifacts\n");
|
|
100
|
-
console.log(` Bundled: ${result.bundledAvailable ? "✓ yes" : "✗ no"}`);
|
|
101
|
-
console.log(` Installed: ${result.installed ? "✓ yes" : "✗ no"}`);
|
|
102
|
-
console.log(` xopc ver: ${result.xopcVersion}`);
|
|
103
|
-
console.log(` Installed: ${result.installedVersion ?? "(none)"}`);
|
|
104
|
-
console.log(` Manifest: ${result.manifestVersion ?? "(none)"}`);
|
|
105
|
-
console.log(` Directory: ${result.extensionDir ?? "(not installed)"}`);
|
|
106
|
-
console.log(` Cache dir: ${result.cacheDir}`);
|
|
107
|
-
console.log(` Refresh: ${result.needsRefresh ? "needed" : "up to date"}`);
|
|
108
|
-
if (result.needsChromeReload) console.log(" ⚠ Chrome reload required (extension runtime version mismatch)");
|
|
109
|
-
console.log("");
|
|
110
|
-
if (!result.installed) console.log(" Run \"xopc browser extension install\" to copy bundled artifacts.\n");
|
|
111
|
-
});
|
|
112
|
-
extensionCmd.command("install").description("Copy bundled Chrome extension to the local bin directory").option("--cache-dir <dir>", "Custom bin cache directory").option("--force", "Force reinstall even when up to date").action(async (opts) => {
|
|
113
|
-
console.log("\n Installing Chrome extension artifacts...\n");
|
|
114
|
-
try {
|
|
115
|
-
const { ensureBrowserExtensionArtifacts } = await import("../../browser/providers/browser-ext-install.js");
|
|
116
|
-
const result = await ensureBrowserExtensionArtifacts({
|
|
117
|
-
cacheDir: opts.cacheDir,
|
|
118
|
-
force: opts.force
|
|
119
|
-
});
|
|
120
|
-
console.log(` ✓ ${result.copied ? "Installed" : "Already up to date"}`);
|
|
121
|
-
console.log(` Directory: ${result.extensionDir}\n`);
|
|
122
|
-
console.log(" Next steps:");
|
|
123
|
-
console.log(" 1. Open chrome://extensions");
|
|
124
|
-
console.log(" 2. Enable Developer mode");
|
|
125
|
-
console.log(" 3. Load unpacked → select the directory above");
|
|
126
|
-
console.log(" 4. Run \"xopc browser extension open\" to open Chrome and reveal the folder\n");
|
|
127
|
-
} catch (e) {
|
|
128
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
129
|
-
console.error(` ✗ Installation failed: ${msg}\n`);
|
|
130
|
-
process.exitCode = 1;
|
|
131
|
-
}
|
|
13
|
+
console.log(JSON.stringify(await browserExtDoctor(), null, 2));
|
|
132
14
|
});
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const { extensionDir } = await openBrowserExtensionInstallUi({
|
|
137
|
-
action: "both",
|
|
138
|
-
cacheDir: opts.cacheDir
|
|
139
|
-
});
|
|
140
|
-
console.log(`Opened Chrome extensions page and folder:\n ${extensionDir}`);
|
|
141
|
-
} catch (e) {
|
|
142
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
143
|
-
console.error(` ✗ ${msg}\n`);
|
|
144
|
-
process.exitCode = 1;
|
|
145
|
-
}
|
|
15
|
+
extension.command("install").description("Install extension artifacts").action(async () => {
|
|
16
|
+
const { ensureBrowserExtensionArtifacts } = await import("../../browser/providers/browser-ext-install.js");
|
|
17
|
+
console.log(JSON.stringify(await ensureBrowserExtensionArtifacts(), null, 2));
|
|
146
18
|
});
|
|
147
|
-
return
|
|
19
|
+
return command;
|
|
148
20
|
}
|
|
149
21
|
register({
|
|
150
22
|
id: "browser",
|
|
151
23
|
name: "browser",
|
|
152
|
-
description: "Browser
|
|
24
|
+
description: "Browser Control v2 diagnostics and extension setup",
|
|
153
25
|
factory: createBrowserCommand,
|
|
154
|
-
metadata: {
|
|
155
|
-
category: "utility",
|
|
156
|
-
examples: [
|
|
157
|
-
"xopc browser open https://example.com",
|
|
158
|
-
"xopc browser validate ./flow.yaml",
|
|
159
|
-
"xopc browser run ./flow.yaml",
|
|
160
|
-
"xopc browser doctor",
|
|
161
|
-
"xopc browser cloakbrowser doctor",
|
|
162
|
-
"xopc browser cloakbrowser install",
|
|
163
|
-
"xopc browser extension doctor",
|
|
164
|
-
"xopc browser extension install",
|
|
165
|
-
"xopc browser extension open"
|
|
166
|
-
]
|
|
167
|
-
}
|
|
26
|
+
metadata: { category: "utility" }
|
|
168
27
|
});
|
|
169
28
|
//#endregion
|
|
170
29
|
export {};
|
|
@@ -52,7 +52,7 @@ async function checkDatabaseSchema(ctx) {
|
|
|
52
52
|
id: "database-schema",
|
|
53
53
|
label: "Database schema",
|
|
54
54
|
status: "pass",
|
|
55
|
-
message: `SQLite schema v${status.dbVersion} (current release
|
|
55
|
+
message: `SQLite schema v${status.dbVersion} (current release v153).`,
|
|
56
56
|
hints: []
|
|
57
57
|
};
|
|
58
58
|
}
|
|
@@ -1,29 +1,45 @@
|
|
|
1
1
|
//#region src/cli/commands/doctor/checks/node-version.ts
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
const MINIMUM_NODE_VERSION = [
|
|
3
|
+
22,
|
|
4
|
+
22,
|
|
5
|
+
3
|
|
6
|
+
];
|
|
7
|
+
function parseNodeVersion() {
|
|
8
|
+
const match = process.version.match(/^v(\d+)\.(\d+)\.(\d+)/);
|
|
9
|
+
return match ? [
|
|
10
|
+
Number.parseInt(match[1], 10),
|
|
11
|
+
Number.parseInt(match[2], 10),
|
|
12
|
+
Number.parseInt(match[3], 10)
|
|
13
|
+
] : void 0;
|
|
14
|
+
}
|
|
15
|
+
function meetsMinimumVersion(version) {
|
|
16
|
+
for (const [index, minimum] of MINIMUM_NODE_VERSION.entries()) {
|
|
17
|
+
if (version[index] > minimum) return true;
|
|
18
|
+
if (version[index] < minimum) return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
5
21
|
}
|
|
6
22
|
async function checkNodeVersion(_ctx) {
|
|
7
|
-
const
|
|
8
|
-
if (
|
|
23
|
+
const version = parseNodeVersion();
|
|
24
|
+
if (!version) return {
|
|
9
25
|
id: "node-version",
|
|
10
26
|
label: "Host Node.js",
|
|
11
27
|
status: "warn",
|
|
12
28
|
message: "Could not parse Node.js version.",
|
|
13
29
|
hints: [`process.version=${process.version}`]
|
|
14
30
|
};
|
|
15
|
-
if (
|
|
31
|
+
if (!meetsMinimumVersion(version)) return {
|
|
16
32
|
id: "node-version",
|
|
17
33
|
label: "Host Node.js",
|
|
18
34
|
status: "fail",
|
|
19
|
-
message: `Node ${
|
|
20
|
-
hints: ["Install Node.js 22+ from https://nodejs.org/"]
|
|
35
|
+
message: `Node.js ${process.version} is below the required minimum (22.22.3).`,
|
|
36
|
+
hints: ["Install Node.js 22.22.3+ from https://nodejs.org/"]
|
|
21
37
|
};
|
|
22
38
|
return {
|
|
23
39
|
id: "node-version",
|
|
24
40
|
label: "Host Node.js",
|
|
25
41
|
status: "pass",
|
|
26
|
-
message: `Node.js ${process.version} meets the project requirement (>= 22).`,
|
|
42
|
+
message: `Node.js ${process.version} meets the project requirement (>= 22.22.3).`,
|
|
27
43
|
hints: []
|
|
28
44
|
};
|
|
29
45
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getAgentDefaultModelRef, init_schema, parseModelRef } from "../../../../config/schema.js";
|
|
2
|
-
import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
|
|
3
2
|
import { init_loader, loadConfig } from "../../../../config/loader.js";
|
|
3
|
+
import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
//#region src/cli/commands/doctor/checks/provider-auth.ts
|
|
6
6
|
init_loader();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
2
|
-
import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
|
|
3
2
|
import { loadConfig, saveConfig } from "../../config/loader.js";
|
|
3
|
+
import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
|
|
4
4
|
import { getAllModels, getAvailableModels, getConfiguredProviders, getProviderAuthState, getProviderDisplayName, init_providers, isProviderConfigured, providerSupportsApiKey, providerSupportsOAuth, resolveModel } from "../../providers/index.js";
|
|
5
5
|
import { formatExamples, register } from "../registry.js";
|
|
6
6
|
import { getContextWithOpts } from "../context.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { loadConfig, saveConfig } from "../../config/loader.js";
|
|
2
|
+
import { formatExamples, register } from "../registry.js";
|
|
3
|
+
import "../../config/index.js";
|
|
4
|
+
import { PLATFORM_RUNTIME_PROFILE, PLATFORM_RUNTIME_PROVIDER, PlatformRuntimeClient, discoverPlatform } from "../../platform/client.js";
|
|
5
|
+
import "../../platform/index.js";
|
|
6
|
+
import { getProfile, upsertAuthProfile } from "../../auth/profiles/profiles.js";
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
//#region src/cli/commands/platform.ts
|
|
9
|
+
async function readStdin() {
|
|
10
|
+
const chunks = [];
|
|
11
|
+
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
12
|
+
return Buffer.concat(chunks).toString("utf8").trim();
|
|
13
|
+
}
|
|
14
|
+
async function readRuntimeToken(value, fromStdin) {
|
|
15
|
+
if (value?.trim()) return value.trim();
|
|
16
|
+
if (fromStdin) return readStdin();
|
|
17
|
+
if (process.stdin.isTTY) {
|
|
18
|
+
const { password } = await import("@inquirer/prompts");
|
|
19
|
+
return (await password({
|
|
20
|
+
message: "Platform runtime token",
|
|
21
|
+
mask: "*"
|
|
22
|
+
})).trim();
|
|
23
|
+
}
|
|
24
|
+
throw new Error("Provide a runtime token, pass --stdin, or run interactively.");
|
|
25
|
+
}
|
|
26
|
+
function runtimeToken() {
|
|
27
|
+
const fromEnv = process.env.XOPC_PLATFORM_RUNTIME_TOKEN?.trim();
|
|
28
|
+
if (fromEnv) return fromEnv;
|
|
29
|
+
const credential = getProfile(PLATFORM_RUNTIME_PROFILE);
|
|
30
|
+
if (credential?.type === "token" && credential.provider === "xopc-platform-runtime") return credential.token;
|
|
31
|
+
throw new Error("Runtime token is not configured. Run `xopc platform runtime token set`.");
|
|
32
|
+
}
|
|
33
|
+
function connectedConfig(ctx) {
|
|
34
|
+
const config = loadConfig(ctx.configPath);
|
|
35
|
+
if (config.platform.mode !== "connected") throw new Error("XOPC is in standalone mode. Run `xopc platform connect <url>`.");
|
|
36
|
+
return {
|
|
37
|
+
config,
|
|
38
|
+
platform: config.platform
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function createPlatformCommand(ctx) {
|
|
42
|
+
const command = new Command("platform").description("Connect to XOPC Cloud or an enterprise platform").addHelpText("after", formatExamples([
|
|
43
|
+
"xopc platform connect https://console.xopc.ai",
|
|
44
|
+
"xopc platform status --refresh",
|
|
45
|
+
"xopc platform runtime token set --stdin",
|
|
46
|
+
"xopc platform runtime heartbeat"
|
|
47
|
+
]));
|
|
48
|
+
command.command("connect").argument("<url>", "Platform base URL").option("--workspace <id>", "Default workspace ID").action(async (url, options) => {
|
|
49
|
+
const discovery = await discoverPlatform(url);
|
|
50
|
+
const config = loadConfig(ctx.configPath);
|
|
51
|
+
config.platform = {
|
|
52
|
+
mode: "connected",
|
|
53
|
+
url: new URL(url).toString().replace(/\/+$/, ""),
|
|
54
|
+
workspaceId: options.workspace,
|
|
55
|
+
discovery
|
|
56
|
+
};
|
|
57
|
+
await saveConfig(config, ctx.configPath);
|
|
58
|
+
console.log(`Connected to ${discovery.displayName} (${discovery.deploymentMode}, ${discovery.region})`);
|
|
59
|
+
});
|
|
60
|
+
command.command("disconnect").description("Return to standalone mode").action(async () => {
|
|
61
|
+
const config = loadConfig(ctx.configPath);
|
|
62
|
+
config.platform = { mode: "standalone" };
|
|
63
|
+
await saveConfig(config, ctx.configPath);
|
|
64
|
+
console.log("XOPC is now in standalone mode.");
|
|
65
|
+
});
|
|
66
|
+
command.command("status").option("--refresh", "Refresh discovery before printing status").option("--json", "Output JSON").action(async (options) => {
|
|
67
|
+
const config = loadConfig(ctx.configPath);
|
|
68
|
+
if (config.platform.mode === "standalone") {
|
|
69
|
+
console.log(options.json ? JSON.stringify(config.platform) : "Mode: standalone");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (options.refresh) {
|
|
73
|
+
config.platform.discovery = await discoverPlatform(config.platform.url);
|
|
74
|
+
await saveConfig(config, ctx.configPath);
|
|
75
|
+
}
|
|
76
|
+
if (options.json) console.log(JSON.stringify(config.platform, null, 2));
|
|
77
|
+
else console.log(`Mode: connected\nPlatform: ${config.platform.discovery.displayName}\nURL: ${config.platform.url}`);
|
|
78
|
+
});
|
|
79
|
+
const runtime = command.command("runtime").description("Manage this XOPC runtime connection");
|
|
80
|
+
runtime.command("token").description("Store the one-time runtime registration token").command("set").argument("[token]").option("--stdin", "Read token from standard input").action(async (value, options) => {
|
|
81
|
+
const runtimeTokenValue = await readRuntimeToken(value, options.stdin ?? false);
|
|
82
|
+
if (!/^xopc_rt_[A-Za-z0-9_-]{43}$/.test(runtimeTokenValue)) throw new Error("Invalid platform runtime token.");
|
|
83
|
+
upsertAuthProfile({
|
|
84
|
+
profileId: PLATFORM_RUNTIME_PROFILE,
|
|
85
|
+
credential: {
|
|
86
|
+
type: "token",
|
|
87
|
+
provider: PLATFORM_RUNTIME_PROVIDER,
|
|
88
|
+
token: runtimeTokenValue
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
console.log("Platform runtime token stored in the credential store.");
|
|
92
|
+
});
|
|
93
|
+
runtime.command("heartbeat").description("Verify the outbound runtime connection and fetch current policy snapshots").option("--json", "Output JSON").action(async (options) => {
|
|
94
|
+
const { platform } = connectedConfig(ctx);
|
|
95
|
+
const result = await new PlatformRuntimeClient(platform.discovery, runtimeToken()).heartbeat({ capabilities: { engine: "xopc" } });
|
|
96
|
+
console.log(options.json ? JSON.stringify(result, null, 2) : "Runtime heartbeat accepted.");
|
|
97
|
+
});
|
|
98
|
+
return command;
|
|
99
|
+
}
|
|
100
|
+
register({
|
|
101
|
+
id: "platform",
|
|
102
|
+
name: "platform",
|
|
103
|
+
description: "Connect to XOPC Cloud or an enterprise platform",
|
|
104
|
+
factory: createPlatformCommand,
|
|
105
|
+
metadata: {
|
|
106
|
+
category: "runtime",
|
|
107
|
+
examples: ["xopc platform status"]
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
//#endregion
|
|
111
|
+
export {};
|
package/dist/src/config/index.js
CHANGED
|
@@ -2,15 +2,15 @@ import { ENV_VARS, XOPC_DB_FILENAME, resolveHomeDir, resolveStateDir, resolveXop
|
|
|
2
2
|
import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
|
|
3
3
|
import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
|
|
4
4
|
import { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GatewayWebchatConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpOAuthConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelCatalogConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, RuntimeToolsConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VoiceConfigSchema, VoiceRefinementConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
|
|
5
|
-
import {
|
|
5
|
+
import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
|
|
6
6
|
import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
|
|
7
7
|
import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
|
|
8
8
|
import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
|
|
9
|
+
import { extractProfileAgentId, resolveEffectiveAgentConfigForAgent, resolveEffectiveAgentConfigForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
|
|
9
10
|
import { FILENAMES, WORKSPACE_FILES, existsSync, hasBundledExtensionManifest, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMcpOAuthPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
|
|
10
|
-
import { CustomModelSchema, ImageGenerationCapabilitiesSchema, ImageGenerationModelSchema, ImageGenerationProviderSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
|
|
11
11
|
import { init_loader, loadConfig, saveConfig } from "./loader.js";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
|
|
13
|
+
import { CustomModelSchema, ImageGenerationCapabilitiesSchema, ImageGenerationModelSchema, ImageGenerationProviderSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
|
|
14
14
|
import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
|
|
15
15
|
import { formatThinkingLevels, listThinkingLevels, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, thinkLevelToNumber } from "../agent/transcript/thinking-types.js";
|
|
16
16
|
import { getWorkspacePath } from "./workspace-path-helpers.js";
|
|
@@ -2,13 +2,18 @@ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
|
2
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
4
|
import { ConfigSchema, init_schema } from "./schema.js";
|
|
5
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
6
5
|
import { init_paths, resolveConfigPath } from "./paths.js";
|
|
6
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
7
7
|
import { assertChannelPluginConfigs, init_validate_channel_configs } from "./validate-channel-configs.js";
|
|
8
|
+
import { init_resolution, setActivePlatformDiscovery } from "../platform/resolution.js";
|
|
8
9
|
import { dirname } from "path";
|
|
9
10
|
import { existsSync, mkdirSync, promises, readFileSync } from "fs";
|
|
10
11
|
import { config } from "dotenv";
|
|
11
12
|
//#region src/config/loader.ts
|
|
13
|
+
function activateConfig(configValue) {
|
|
14
|
+
setActivePlatformDiscovery(configValue.platform.mode === "connected" ? configValue.platform.discovery : void 0);
|
|
15
|
+
return configValue;
|
|
16
|
+
}
|
|
12
17
|
/**
|
|
13
18
|
* Rotate config backups before writing new config.
|
|
14
19
|
* Creates a backup chain: xopc.json.bak, xopc.json.bak.1, xopc.json.bak.2, etc.
|
|
@@ -39,7 +44,7 @@ function loadConfig(configPath) {
|
|
|
39
44
|
const json = JSON.parse(content);
|
|
40
45
|
const cfg = ConfigSchema.parse(json);
|
|
41
46
|
assertChannelPluginConfigs(cfg);
|
|
42
|
-
return cfg;
|
|
47
|
+
return activateConfig(cfg);
|
|
43
48
|
} catch (error) {
|
|
44
49
|
log.error({
|
|
45
50
|
err: error,
|
|
@@ -47,11 +52,11 @@ function loadConfig(configPath) {
|
|
|
47
52
|
}, `Failed to load config`);
|
|
48
53
|
const cfg = ConfigSchema.parse(void 0);
|
|
49
54
|
assertChannelPluginConfigs(cfg);
|
|
50
|
-
return cfg;
|
|
55
|
+
return activateConfig(cfg);
|
|
51
56
|
}
|
|
52
57
|
const cfg = ConfigSchema.parse(void 0);
|
|
53
58
|
assertChannelPluginConfigs(cfg);
|
|
54
|
-
return cfg;
|
|
59
|
+
return activateConfig(cfg);
|
|
55
60
|
}
|
|
56
61
|
/**
|
|
57
62
|
* Save configuration to file
|
|
@@ -80,6 +85,7 @@ var init_loader = __esmMin((() => {
|
|
|
80
85
|
init_paths();
|
|
81
86
|
init_logger();
|
|
82
87
|
init_validate_channel_configs();
|
|
88
|
+
init_resolution();
|
|
83
89
|
log = createLogger("ConfigLoader");
|
|
84
90
|
CONFIG_BACKUP_COUNT = 10;
|
|
85
91
|
}));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
|
|
3
2
|
import { init_paths, resolveModelsJsonPath } from "./paths.js";
|
|
3
|
+
import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
|
|
4
4
|
import { existsSync, readFileSync } from "fs";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
//#region src/config/models-json.ts
|