@xopcai/xopc 0.0.190 → 0.0.192
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/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-DstnJCS5.js → activity-store-B-tzXpDD.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-9vAbkroX.js → agent-avatar-dicebear-xOu0qNwc.js} +1 -1
- package/dist/gateway/static/root/assets/agents-CxuwvDk0.js +68 -0
- package/dist/gateway/static/root/assets/{api-BTL9kayv.js → api-fMItZb-h.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-DkFeIdBf.js → app-management-settings-panel-D6Rv3OWI.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Bxs8Fpaj.js → appearance-settings-CKoNCwco.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-wAb5dnHZ.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-Ch2RmLCC.js → archive-plugin-BokNQBwH.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BhMQM_Ky.js → attachment-load-Dx1HglsM.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-Drgazevs.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-D6CqlymH.js → binary-plugins-CPYAflIG.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-ClL6HEg9.js → block-editor-BFLgl8SS.js} +47 -47
- package/dist/gateway/static/root/assets/browser-settings-page-DmYlFJW7.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-BYy48VhN.js → browser-workflow-inputs-CqLnqA9z.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-zgLibuMH.js → browser-workflows-page-Db5v3HtE.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-D7Z8T0o5.js +7 -0
- package/dist/gateway/static/root/assets/capability-presets-api-lov0J9A2.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-COjnwO0U.js +3 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-BThDGiO3.js → channel-recipient-api-DSJznouK.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-DcRYBNN7.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-C2UYdebT.js +1 -0
- package/dist/gateway/static/root/assets/{code-editor-D4_k-6QN.js → code-editor-dFzqyDXS.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-api-DS9ED-EL.js → connectors-api-3ccRyS3L.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-FVmvBG9H.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-CkgsvhtW.js → cron-expression-C9hhCiuo.js} +1 -1
- package/dist/gateway/static/root/assets/dependency-picker-CTtZFZug.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-Cv8rGhYW.js → desktop-pet-DOUeNVmC.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CIeJdwfV.js → desktop-pet-settings-D4704vtl.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-D8jXEiAY.js → directory-picker-path-field-DJDXeA1B.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CCZ9u6TZ.js → extension-debug-page-C0n2NMF1.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CV36ILRG.js → extension-page-vG-xxRNs.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CtuY2THd.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-api-D4_r5iJM.js → gateway-config-api-CZra7GuI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-CYlntpBH.js → gateway-settings-Cz33jRkR.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-EO9mKvzE.js → gateway-startup-retry-BbVV0udv.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-D4SyWob8.js → heartbeat-settings-D2XMlA_U.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-CPrHkPN6.js +3 -0
- package/dist/gateway/static/root/assets/html-workspace-editor-bXK5tq64.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-Bu7PyVSh.js → image-generation-api-BgrOvhaJ.js} +1 -1
- package/dist/gateway/static/root/assets/index-Cg7Xnlu3.css +1 -0
- package/dist/gateway/static/root/assets/index-DzmbmOGA.js +150 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BMhCuVBZ.js → keyboard-shortcuts-settings-BfyAEG1G.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-Clz47vSr.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-ijIe7_y2.js → local-apps-page-BYalcRSY.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-deR2zRaE.js → locale-store-VOY1wMO9.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Cxq9WMf5.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings--V_fovKD.js → management-settings-BQf-6s32.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-editor-BvUebh3C.js → markdown-editor-TWGaF7Xa.js} +2 -2
- package/dist/gateway/static/root/assets/{markdown-split-Dt9-in6W.js → markdown-split-Cy_2SN1Q.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-B3pj_iO0.js → media-plugins-CkDupqb2.js} +1 -1
- package/dist/gateway/static/root/assets/messages-DMJ-6-1m.js +3 -0
- package/dist/gateway/static/root/assets/{notes-page-DZ366lIT.js → notes-page-kiGRR9jo.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-DkYkPGyB.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-C5ge434C.js → page-tabs-CvzSdYVj.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BFa9DgSV.js → preview-open-alternatives-kZ0nco7e.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-Dc9CcWdu.js → product-open-page-DgoieqQC.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CeSjJd-N.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-fZ1rm4b9.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-CbYI6KC8.js +1 -0
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bud_NTEZ.js +5 -0
- package/dist/gateway/static/root/assets/{schema-form-B84DckWe.js → schema-form-GlbsCBmv.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-sOJ_TnLm.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BI0u77dt.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-Dp9itvdy.js → settings-form-section-CKLns16d.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-CCtlhoy7.js → settings-loading-skeleton-BDzpxgk0.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-BH0pF7QB.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-EQIOJa_L.js → settings-page-layout-J793iqfm.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-Cwi-SPja.js → setup-status-panel-CGsml89P.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-C4_B2jvf.js → share-preview-page-UTm_7r0l.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-BM--lgUS.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CGCOC-rV.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-iLyaOl48.js +2 -0
- package/dist/gateway/static/root/assets/skills-page.utils-Bwid1TGB.js +1 -0
- package/dist/gateway/static/root/assets/style-TIDOdKy0.js +7 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-Dpx2ags2.js → system-settings-panel-BcB3p1e3.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-DQYEf08v.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-DnBOcGXi.js → theme-store-GVZOImyb.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-DULmTHUB.js → typed-models-lib-CT2c85Ju.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-BrjVk5VH.js → use-autosave-CcvY7DTh.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-CGI41bfO.js +1 -0
- package/dist/gateway/static/root/assets/{vendor-codemirror--gTq3YAI.js → vendor-codemirror-DRr7hFaD.js} +16 -16
- package/dist/gateway/static/root/assets/voice-api-key-field-Ricc3QGo.js +1 -0
- package/dist/gateway/static/root/assets/{work-discovery-overlay-Wr-uF7VA.js → work-discovery-overlay-BoomfqhX.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-page-BWds95sL.js → work-discovery-page-mbnepbQk.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-DSWG2xqL.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-DtV0ruyk.js +5 -0
- package/dist/gateway/static/root/index.html +7 -7
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +76 -0
- package/dist/src/agent/background-review/prompts.d.ts +1 -1
- package/dist/src/agent/background-review/prompts.js +1 -1
- package/dist/src/agent/background-review/run-background-review.js +3 -12
- package/dist/src/agent/embedded/run-for-session.js +3 -0
- package/dist/src/agent/embedded/run-turn.js +4 -1
- package/dist/src/agent/embedded/session-runner.js +3 -4
- package/dist/src/agent/embedded/types.d.ts +10 -1
- package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -2
- package/dist/src/agent/external-tools/mcp-provider.d.ts +1 -0
- package/dist/src/agent/external-tools/mcp-provider.js +21 -6
- package/dist/src/agent/image/generation/openai-images-provider.d.ts +1 -1
- package/dist/src/agent/image/generation/openai-images-provider.js +1 -1
- package/dist/src/agent/image/generation/provider-registry.d.ts +2 -0
- package/dist/src/agent/image/generation/provider-registry.js +21 -10
- package/dist/src/agent/image/generation/providers/dashscope.js +20 -0
- package/dist/src/agent/image/generation/providers/fal.d.ts +1 -1
- package/dist/src/agent/image/generation/providers/fal.js +12 -6
- package/dist/src/agent/image/generation/providers/google.js +8 -0
- package/dist/src/agent/image/generation/providers/minimax.js +20 -0
- package/dist/src/agent/image/generation/providers/openai.js +36 -26
- package/dist/src/agent/image/generation/providers/xopc-cloud.d.ts +2 -0
- package/dist/src/agent/image/generation/providers/xopc-cloud.js +74 -0
- package/dist/src/agent/image/generation/types.d.ts +15 -2
- package/dist/src/agent/mcp/bundle-mcp-gateway.d.ts +1 -0
- package/dist/src/agent/mcp/bundle-mcp-gateway.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +5 -1
- package/dist/src/agent/mcp/bundle-mcp-policy.js +11 -3
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +3 -2
- package/dist/src/agent/mcp/bundle-mcp-types.d.ts +2 -1
- package/dist/src/agent/mcp/index.js +2 -2
- package/dist/src/agent/mcp/mcp-stdio-transport.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.d.ts +2 -1
- package/dist/src/agent/mcp/mcp-transport.js +22 -4
- package/dist/src/agent/memory/compaction.js +19 -17
- package/dist/src/agent/memory/context-budget.js +2 -3
- package/dist/src/agent/memory/understanding/service.d.ts +1 -0
- package/dist/src/agent/memory/understanding/service.js +49 -20
- package/dist/src/agent/memory/understanding/types.d.ts +1 -0
- package/dist/src/agent/memory/user-context-coordinator.js +6 -0
- package/dist/src/agent/orchestration/agent-orchestrator.js +15 -1
- package/dist/src/agent/service/direct-turn-helpers.js +14 -5
- package/dist/src/agent/skills/index.d.ts +1 -1
- package/dist/src/agent/skills/index.js +2 -2
- package/dist/src/agent/skills/installer.d.ts +3 -10
- package/dist/src/agent/skills/installer.js +99 -156
- package/dist/src/agent/skills/marketplace/adapter.types.d.ts +3 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +30 -6
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +21 -4
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +7 -4
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +3 -0
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +7 -1
- package/dist/src/agent/skills/marketplace/search.d.ts +2 -2
- package/dist/src/agent/skills/marketplace/search.js +52 -21
- package/dist/src/agent/skills/skills-marketplace.d.ts +1 -1
- package/dist/src/agent/skills/skills-marketplace.js +2 -2
- package/dist/src/agent/skills/types.d.ts +0 -8
- package/dist/src/agent/tools/exec-command.d.ts +1 -0
- package/dist/src/agent/tools/exec-command.js +2 -1
- package/dist/src/agent/tools/factory.d.ts +1 -0
- package/dist/src/agent/tools/factory.js +17 -2
- package/dist/src/agent/tools/managed-job-tool.d.ts +1 -1
- package/dist/src/agent/tools/managed-job-tool.js +3 -2
- package/dist/src/agent/tools/skill-install-tool.d.ts +2 -2
- package/dist/src/agent/tools/skill-install-tool.js +8 -4
- package/dist/src/agent/tools/skills-marketplace-search-tool.js +3 -2
- package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
- package/dist/src/agent/tools/workflow-tool.js +14 -4
- package/dist/src/agent-manifest/schema.d.ts +20 -0
- package/dist/src/agent-manifest/schema.js +6 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/cli/command-loaders.js +1 -0
- package/dist/src/cli/command-manifest.js +4 -0
- package/dist/src/cli/commands/doctor/checks/node-version.js +3 -3
- package/dist/src/cli/commands/doctor/checks/tool-runtimes.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/tool-runtimes.js +36 -0
- package/dist/src/cli/commands/doctor/flow.js +2 -0
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/models.js +0 -1
- package/dist/src/cli/commands/onboard/model.d.ts +18 -0
- package/dist/src/cli/commands/onboard/model.js +81 -5
- package/dist/src/cli/commands/onboard.js +13 -1
- package/dist/src/cli/commands/runtime.d.ts +1 -0
- package/dist/src/cli/commands/runtime.js +77 -0
- package/dist/src/cli/commands/setup.js +15 -1
- package/dist/src/cli/commands/skills.js +7 -4
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/schema.d.ts +125 -0
- package/dist/src/config/schema.js +77 -2
- package/dist/src/config/voice.d.ts +6 -0
- package/dist/src/config/voice.js +17 -0
- package/dist/src/extensions/install.js +1 -1
- package/dist/src/extensions/types/providers.d.ts +4 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +9 -0
- package/dist/src/gateway/capability-presets-admin.js +24 -6
- package/dist/src/gateway/chat-stream/mapper.js +8 -4
- package/dist/src/gateway/chat-stream/protocol.d.ts +10 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +2 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/models.js +11 -11
- package/dist/src/gateway/hono/routes/runtime-tools.d.ts +3 -0
- package/dist/src/gateway/hono/routes/runtime-tools.js +142 -0
- package/dist/src/gateway/hono/routes/understanding-sources.js +2 -1
- package/dist/src/gateway/hono/routes/voice.js +43 -2
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/you.js +22 -25
- package/dist/src/gateway/image-generation-setup.d.ts +2 -3
- package/dist/src/gateway/image-generation-setup.js +39 -8
- package/dist/src/gateway/service/marketplace-service.d.ts +1 -1
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/providers/extension-stream-bridge.js +8 -7
- package/dist/src/providers/model-catalog-store.d.ts +35 -0
- package/dist/src/providers/model-catalog-store.js +25 -1
- package/dist/src/providers/model-catalog-sync-service.js +6 -0
- package/dist/src/providers/model-registry.js +4 -4
- package/dist/src/providers/prompt-cache-payload.d.ts +13 -0
- package/dist/src/providers/prompt-cache-payload.js +110 -0
- package/dist/src/providers/register-runtime-providers.js +4 -4
- package/dist/src/providers/xopc-cloud-model-source.js +101 -8
- package/dist/src/runtime-tools/archive.d.ts +8 -0
- package/dist/src/runtime-tools/archive.js +99 -0
- package/dist/src/runtime-tools/bootstrap.d.ts +16 -0
- package/dist/src/runtime-tools/bootstrap.js +33 -0
- package/dist/src/runtime-tools/catalog.d.ts +19 -0
- package/dist/src/runtime-tools/catalog.js +59 -0
- package/dist/src/runtime-tools/command.d.ts +15 -0
- package/dist/src/runtime-tools/command.js +59 -0
- package/dist/src/runtime-tools/download-source.d.ts +24 -0
- package/dist/src/runtime-tools/download-source.js +125 -0
- package/dist/src/runtime-tools/downloader.d.ts +21 -0
- package/dist/src/runtime-tools/downloader.js +137 -0
- package/dist/src/runtime-tools/environment.d.ts +20 -0
- package/dist/src/runtime-tools/environment.js +113 -0
- package/dist/src/runtime-tools/errors.d.ts +10 -0
- package/dist/src/runtime-tools/errors.js +14 -0
- package/dist/src/runtime-tools/index.d.ts +7 -0
- package/dist/src/runtime-tools/index.js +7 -0
- package/dist/src/runtime-tools/install-lock.d.ts +1 -0
- package/dist/src/runtime-tools/install-lock.js +50 -0
- package/dist/src/runtime-tools/manager.d.ts +20 -0
- package/dist/src/runtime-tools/manager.js +641 -0
- package/dist/src/runtime-tools/manifest-store.d.ts +3 -0
- package/dist/src/runtime-tools/manifest-store.js +26 -0
- package/dist/src/runtime-tools/network.d.ts +9 -0
- package/dist/src/runtime-tools/network.js +41 -0
- package/dist/src/runtime-tools/offline-bundle.d.ts +16 -0
- package/dist/src/runtime-tools/offline-bundle.js +41 -0
- package/dist/src/runtime-tools/paths.d.ts +7 -0
- package/dist/src/runtime-tools/paths.js +22 -0
- package/dist/src/runtime-tools/probe.d.ts +7 -0
- package/dist/src/runtime-tools/probe.js +71 -0
- package/dist/src/runtime-tools/prune.d.ts +10 -0
- package/dist/src/runtime-tools/prune.js +93 -0
- package/dist/src/runtime-tools/types.d.ts +70 -0
- package/dist/src/runtime-tools/types.js +1 -0
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/storage/sqlite/migrations/113_memory_evidence_single_source.sql +42 -20
- package/dist/src/tasks/home-query-service.js +1 -5
- package/dist/src/tasks/index.js +2 -2
- package/dist/src/tasks/project-operating-view-service.d.ts +2 -1
- package/dist/src/tasks/project-operating-view-service.js +6 -4
- package/dist/src/tasks/task-dependency-service.d.ts +2 -1
- package/dist/src/tasks/task-dependency-service.js +15 -0
- package/dist/src/tunnel/frpc-binary.js +1 -1
- package/dist/src/user-context/domain.d.ts +2 -1
- package/dist/src/user-context/domain.js +12 -1
- package/dist/src/user-context/manual-understanding.js +8 -10
- package/dist/src/user-context/planner.js +1 -6
- package/dist/src/user-context/sources/activity-clustering.d.ts +5 -0
- package/dist/src/user-context/sources/activity-clustering.js +130 -0
- package/dist/src/user-context/sources/catalog.js +26 -0
- package/dist/src/user-context/sources/local-source-contract.d.ts +3 -0
- package/dist/src/user-context/sources/local-source-contract.js +15 -0
- package/dist/src/user-context/sources/repository.js +7 -1
- package/dist/src/user-context/sources/types.d.ts +7 -1
- package/dist/src/user-context/understanding.d.ts +15 -0
- package/dist/src/user-context/understanding.js +24 -0
- package/dist/src/voice/local/model-files.js +1 -1
- package/dist/src/voice/metadata/builtin.js +99 -32
- package/dist/src/voice/metadata/types.d.ts +3 -0
- package/dist/src/voice/stt/availability.js +4 -1
- package/dist/src/voice/stt/config-slice.d.ts +0 -2
- package/dist/src/voice/stt/config-slice.js +1 -6
- package/dist/src/voice/stt/factory.js +2 -2
- package/dist/src/voice/stt/index.d.ts +2 -3
- package/dist/src/voice/stt/list-providers.js +1 -1
- package/dist/src/voice/stt/providers/alibaba-transcription.d.ts +0 -19
- package/dist/src/voice/stt/providers/alibaba-transcription.js +59 -132
- package/dist/src/voice/stt/providers/index.d.ts +1 -0
- package/dist/src/voice/stt/providers/index.js +2 -1
- package/dist/src/voice/stt/providers/openai-transcription.d.ts +2 -2
- package/dist/src/voice/stt/providers/openai-transcription.js +4 -4
- package/dist/src/voice/stt/providers/xopc-cloud-transcription.d.ts +2 -0
- package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +49 -0
- package/dist/src/voice/stt/types.js +2 -2
- package/dist/src/voice/tts/providers/index.d.ts +1 -0
- package/dist/src/voice/tts/providers/index.js +2 -1
- package/dist/src/voice/tts/providers/xopc-cloud-speech.d.ts +2 -0
- package/dist/src/voice/tts/providers/xopc-cloud-speech.js +113 -0
- package/dist/src/voice/tts/types.d.ts +1 -1
- package/dist/src/work-discovery/analyzer.js +9 -4
- package/dist/src/work-discovery/candidate-discovery.d.ts +1 -0
- package/dist/src/work-discovery/candidate-discovery.js +3 -3
- package/dist/src/work-discovery/index.js +2 -2
- package/dist/src/work-discovery/service.d.ts +2 -1
- package/dist/src/work-discovery/service.js +126 -37
- package/dist/src/work-discovery/types.d.ts +1 -0
- package/dist/src/workflows/service/workflow-run-service.js +8 -0
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agents-D1t4SfMQ.js +0 -68
- package/dist/gateway/static/root/assets/apps-page-Cgrgu5OW.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-CtJxstKh.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-DW99iDmD.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CHUrT9EB.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-api-BB8t4Ja7.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-Cycrv0YV.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-V96gPUAU.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-Cz7SAAkm.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BhlyQoQI.js +0 -2
- package/dist/gateway/static/root/assets/extension-settings-page-IyQrSILY.js +0 -1
- package/dist/gateway/static/root/assets/home-page-B2Kagoh8.js +0 -3
- package/dist/gateway/static/root/assets/html-workspace-editor-C3DKAkMc.js +0 -1
- package/dist/gateway/static/root/assets/index-CYT5DOzr.js +0 -150
- package/dist/gateway/static/root/assets/index-D6e3tPL-.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-BHYbFjqy.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-IIn8Tess.js +0 -2
- package/dist/gateway/static/root/assets/messages-B4XqB8I6.js +0 -3
- package/dist/gateway/static/root/assets/notes-workbench-S2sBVOLw.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-BilzoCJ7.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BoQUyacP.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DUyUaCRF.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Dzxlq1F0.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-TzwlZxU6.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DQmMKf8r.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CkyuGlZK.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BJCePQK5.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BYWLfmJi.js +0 -2
- package/dist/gateway/static/root/assets/skills-page.utils-Jhm24i4h.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-DLAdxI6e.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-9AAFpGAL.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BISTPfq_.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-DHqHP8_6.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-0b4_DFHr.js +0 -11
- /package/dist/gateway/static/root/assets/{workflows-page-DLioOiRN.css → style-DLioOiRN.css} +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { ResolvedRuntime, RuntimeKind, RuntimeManagerOptions, RuntimeRequest, RuntimeStatus } from './types.js';
|
|
3
|
+
export declare class ManagedRuntimeManager extends EventEmitter {
|
|
4
|
+
private readonly options;
|
|
5
|
+
private readonly inFlight;
|
|
6
|
+
constructor(options: RuntimeManagerOptions);
|
|
7
|
+
defaultVersion(runtime: RuntimeKind): string;
|
|
8
|
+
resolve(request: RuntimeRequest): Promise<ResolvedRuntime>;
|
|
9
|
+
private resolveUncached;
|
|
10
|
+
probeManaged(runtime: RuntimeKind, requestedVersion: string): Promise<ResolvedRuntime | null>;
|
|
11
|
+
install(runtime: RuntimeKind, version?: string, signal?: AbortSignal): Promise<ResolvedRuntime>;
|
|
12
|
+
private installDistribution;
|
|
13
|
+
private installPython;
|
|
14
|
+
private installBundledPython;
|
|
15
|
+
private uvEnvironment;
|
|
16
|
+
status(runtime: RuntimeKind): Promise<RuntimeStatus>;
|
|
17
|
+
statusAll(): Promise<RuntimeStatus[]>;
|
|
18
|
+
repair(runtime: RuntimeKind): Promise<ResolvedRuntime>;
|
|
19
|
+
private progress;
|
|
20
|
+
}
|
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { RuntimeError } from "./errors.js";
|
|
4
|
+
import { atomicInstallRuntime, extractRuntimeArchive } from "./archive.js";
|
|
5
|
+
import { runRuntimeCommand } from "./command.js";
|
|
6
|
+
import { DEFAULT_RUNTIME_VERSIONS, RUNTIME_CATALOG_VERSION, detectRuntimePlatform, resolveRuntimeAsset } from "./catalog.js";
|
|
7
|
+
import { canFallbackRuntimeDownload, downloadVerifiedArchive } from "./downloader.js";
|
|
8
|
+
import { canFallbackPythonInstall, resolveRuntimeDownloadSource, runtimeGatewayPythonMirror } from "./download-source.js";
|
|
9
|
+
import { withInstallLock } from "./install-lock.js";
|
|
10
|
+
import { runtimeDownloadPath, runtimeLockPath, runtimeStagingDir, runtimeToolsRoot, runtimeVersionDir } from "./paths.js";
|
|
11
|
+
import { readRuntimeManifest, writeRuntimeManifest } from "./manifest-store.js";
|
|
12
|
+
import { bundledPythonArchiveName, resolveOfflineBundleArtifact } from "./offline-bundle.js";
|
|
13
|
+
import { parseRuntimeVersion, probeSystemRuntime, versionSatisfies } from "./probe.js";
|
|
14
|
+
import { dirname, join } from "node:path";
|
|
15
|
+
import { randomUUID } from "node:crypto";
|
|
16
|
+
import { access, mkdir, realpath, rename, rm } from "node:fs/promises";
|
|
17
|
+
import { EventEmitter } from "node:events";
|
|
18
|
+
//#region src/runtime-tools/manager.ts
|
|
19
|
+
init_logger();
|
|
20
|
+
const log = createLogger("RuntimeManager");
|
|
21
|
+
function executableName(name) {
|
|
22
|
+
return process.platform === "win32" ? `${name}.exe` : name;
|
|
23
|
+
}
|
|
24
|
+
function nodeExecutables(installDir) {
|
|
25
|
+
if (process.platform === "win32") return {
|
|
26
|
+
primary: join(installDir, "node.exe"),
|
|
27
|
+
node: join(installDir, "node.exe"),
|
|
28
|
+
npm: join(installDir, "npm.cmd"),
|
|
29
|
+
npx: join(installDir, "npx.cmd"),
|
|
30
|
+
corepack: join(installDir, "corepack.cmd")
|
|
31
|
+
};
|
|
32
|
+
const bin = join(installDir, "bin");
|
|
33
|
+
return {
|
|
34
|
+
primary: join(bin, "node"),
|
|
35
|
+
node: join(bin, "node"),
|
|
36
|
+
npm: join(bin, "npm"),
|
|
37
|
+
npx: join(bin, "npx"),
|
|
38
|
+
corepack: join(bin, "corepack")
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function uvExecutables(installDir) {
|
|
42
|
+
const uv = join(installDir, executableName("uv"));
|
|
43
|
+
return {
|
|
44
|
+
primary: uv,
|
|
45
|
+
uv,
|
|
46
|
+
uvx: join(installDir, executableName("uvx"))
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function runtimeConfig(options, runtime) {
|
|
50
|
+
if (runtime === "node") return options.config.node;
|
|
51
|
+
if (runtime === "python") return options.config.python;
|
|
52
|
+
return {
|
|
53
|
+
enabled: options.config.uv.enabled,
|
|
54
|
+
version: options.config.uv.version,
|
|
55
|
+
preference: "managed-only",
|
|
56
|
+
provision: "eager"
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
var ManagedRuntimeManager = class extends EventEmitter {
|
|
60
|
+
inFlight = /* @__PURE__ */ new Map();
|
|
61
|
+
constructor(options) {
|
|
62
|
+
super();
|
|
63
|
+
this.options = options;
|
|
64
|
+
}
|
|
65
|
+
defaultVersion(runtime) {
|
|
66
|
+
return runtimeConfig(this.options, runtime).version ?? DEFAULT_RUNTIME_VERSIONS[runtime];
|
|
67
|
+
}
|
|
68
|
+
async resolve(request) {
|
|
69
|
+
const config = runtimeConfig(this.options, request.runtime);
|
|
70
|
+
const requestedVersion = request.version ?? this.defaultVersion(request.runtime);
|
|
71
|
+
if (!this.options.config.enabled || !config.enabled) throw new RuntimeError(`${request.runtime} runtime is disabled`, "RUNTIME_DISABLED", request.runtime, "resolve", false);
|
|
72
|
+
const key = `${request.runtime}:${requestedVersion}:${request.allowProvision === true}`;
|
|
73
|
+
const existing = this.inFlight.get(key);
|
|
74
|
+
if (existing) return await existing;
|
|
75
|
+
const operation = this.resolveUncached(request.runtime, requestedVersion, request);
|
|
76
|
+
this.inFlight.set(key, operation);
|
|
77
|
+
try {
|
|
78
|
+
return await operation;
|
|
79
|
+
} finally {
|
|
80
|
+
this.inFlight.delete(key);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async resolveUncached(runtime, requestedVersion, request) {
|
|
84
|
+
const config = runtimeConfig(this.options, runtime);
|
|
85
|
+
const order = config.preference.startsWith("system") ? ["system", "managed"] : ["managed", "system"];
|
|
86
|
+
const allowed = config.preference.endsWith("only") ? order.slice(0, 1) : order;
|
|
87
|
+
for (const source of allowed) if (source === "managed") {
|
|
88
|
+
const managed = await this.probeManaged(runtime, requestedVersion);
|
|
89
|
+
if (managed) return managed;
|
|
90
|
+
if (request.allowProvision && config.provision !== "disabled") try {
|
|
91
|
+
return await this.install(runtime, requestedVersion, request.signal);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
if (allowed.length === 1) throw error;
|
|
94
|
+
log.warn({
|
|
95
|
+
err: error,
|
|
96
|
+
runtime,
|
|
97
|
+
requestedVersion,
|
|
98
|
+
phase: "managed_install"
|
|
99
|
+
}, `Managed ${runtime} installation failed; checking the system runtime`);
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
const system = await probeSystemRuntime(runtime, requestedVersion);
|
|
103
|
+
if (system) return {
|
|
104
|
+
runtime,
|
|
105
|
+
version: system.version,
|
|
106
|
+
source: "system",
|
|
107
|
+
executable: system.executables.primary,
|
|
108
|
+
executables: system.executables
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
throw new RuntimeError(`${runtime} ${requestedVersion} is not available`, "RUNTIME_NOT_FOUND", runtime, "resolve", true, [`Run xopc runtime install ${runtime}`]);
|
|
112
|
+
}
|
|
113
|
+
async probeManaged(runtime, requestedVersion) {
|
|
114
|
+
const manifest = await readRuntimeManifest(this.options.stateDir, runtime);
|
|
115
|
+
if (!manifest || !versionSatisfies(manifest.version, requestedVersion)) return null;
|
|
116
|
+
try {
|
|
117
|
+
const toolsRoot = await realpath(runtimeToolsRoot(this.options.stateDir));
|
|
118
|
+
const installDir = await realpath(manifest.installDir);
|
|
119
|
+
if (installDir !== toolsRoot && !installDir.startsWith(`${toolsRoot}${process.platform === "win32" ? "\\" : "/"}`)) return null;
|
|
120
|
+
await access(manifest.executables.primary);
|
|
121
|
+
const result = await runRuntimeCommand({
|
|
122
|
+
command: manifest.executables.primary,
|
|
123
|
+
args: ["--version"]
|
|
124
|
+
});
|
|
125
|
+
const version = parseRuntimeVersion(`${result.stdout}\n${result.stderr}`);
|
|
126
|
+
if (!result.ok || !version || !versionSatisfies(version, requestedVersion)) return null;
|
|
127
|
+
if (runtime === "node") {
|
|
128
|
+
const npm = manifest.executables.npm;
|
|
129
|
+
const npx = manifest.executables.npx;
|
|
130
|
+
if (!npm || !npx) return null;
|
|
131
|
+
const [npmProbe, npxProbe] = await Promise.all([runRuntimeCommand({
|
|
132
|
+
command: npm,
|
|
133
|
+
args: ["--version"]
|
|
134
|
+
}), runRuntimeCommand({
|
|
135
|
+
command: npx,
|
|
136
|
+
args: ["--version"]
|
|
137
|
+
})]);
|
|
138
|
+
if (!npmProbe.ok || !npxProbe.ok) return null;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
runtime,
|
|
142
|
+
version,
|
|
143
|
+
source: "managed",
|
|
144
|
+
executable: manifest.executables.primary,
|
|
145
|
+
executables: manifest.executables,
|
|
146
|
+
installDir: manifest.installDir
|
|
147
|
+
};
|
|
148
|
+
} catch {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async install(runtime, version = this.defaultVersion(runtime), signal) {
|
|
153
|
+
const config = runtimeConfig(this.options, runtime);
|
|
154
|
+
if (!this.options.config.enabled || !config.enabled) throw new RuntimeError(`${runtime} runtime is disabled`, "RUNTIME_DISABLED", runtime, "install", false);
|
|
155
|
+
if (runtime === "python") return await this.installPython(version, signal);
|
|
156
|
+
return await this.installDistribution(runtime, version, signal);
|
|
157
|
+
}
|
|
158
|
+
async installDistribution(runtime, version, signal) {
|
|
159
|
+
const platform = detectRuntimePlatform();
|
|
160
|
+
if (!platform) throw new RuntimeError(`Managed ${runtime} is not supported on ${process.platform}-${process.arch}`, "RUNTIME_UNSUPPORTED", runtime, "resolve_asset", false);
|
|
161
|
+
const operationId = randomUUID();
|
|
162
|
+
const asset = resolveRuntimeAsset({
|
|
163
|
+
runtime,
|
|
164
|
+
version,
|
|
165
|
+
platform
|
|
166
|
+
});
|
|
167
|
+
const installDir = runtimeVersionDir(this.options.stateDir, runtime, version);
|
|
168
|
+
return await withInstallLock(runtimeLockPath(this.options.stateDir, runtime, version), {
|
|
169
|
+
operationId,
|
|
170
|
+
runtime,
|
|
171
|
+
version
|
|
172
|
+
}, async () => {
|
|
173
|
+
const ready = await this.probeManaged(runtime, version);
|
|
174
|
+
if (ready) return ready;
|
|
175
|
+
this.progress({
|
|
176
|
+
operationId,
|
|
177
|
+
runtime,
|
|
178
|
+
phase: "resolve",
|
|
179
|
+
message: `Preparing ${runtime} ${version}`
|
|
180
|
+
});
|
|
181
|
+
const offline = this.options.config.download.bundleDir ? await resolveOfflineBundleArtifact({
|
|
182
|
+
bundleDir: this.options.config.download.bundleDir,
|
|
183
|
+
runtime,
|
|
184
|
+
archiveFile: asset.archiveFile
|
|
185
|
+
}) : null;
|
|
186
|
+
let selectedDownload = offline ? null : await resolveRuntimeDownloadSource({
|
|
187
|
+
asset,
|
|
188
|
+
platform,
|
|
189
|
+
config: this.options.config.download,
|
|
190
|
+
signal,
|
|
191
|
+
onFallback: (message) => this.progress({
|
|
192
|
+
operationId,
|
|
193
|
+
runtime,
|
|
194
|
+
phase: "resolve",
|
|
195
|
+
message
|
|
196
|
+
})
|
|
197
|
+
});
|
|
198
|
+
let expectedSha256 = offline?.sha256 ?? selectedDownload.sha256;
|
|
199
|
+
let archivePath;
|
|
200
|
+
if (offline) archivePath = offline.archivePath;
|
|
201
|
+
else {
|
|
202
|
+
const download = async () => await downloadVerifiedArchive({
|
|
203
|
+
runtime,
|
|
204
|
+
url: selectedDownload.url,
|
|
205
|
+
targetPath: runtimeDownloadPath(this.options.stateDir, asset.archiveFile),
|
|
206
|
+
expectedSha256,
|
|
207
|
+
timeoutMs: this.options.config.download.timeoutMs,
|
|
208
|
+
proxy: this.options.config.download.proxy,
|
|
209
|
+
signal,
|
|
210
|
+
onProgress: (downloadedBytes, totalBytes) => this.progress({
|
|
211
|
+
operationId,
|
|
212
|
+
runtime,
|
|
213
|
+
phase: "download",
|
|
214
|
+
message: `Downloading ${runtime} ${version}`,
|
|
215
|
+
downloadedBytes,
|
|
216
|
+
totalBytes
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
try {
|
|
220
|
+
archivePath = await download();
|
|
221
|
+
} catch (error) {
|
|
222
|
+
if (signal?.aborted || this.options.config.download.source !== "auto" || selectedDownload.source !== "website" || !canFallbackRuntimeDownload(error)) throw error;
|
|
223
|
+
this.progress({
|
|
224
|
+
operationId,
|
|
225
|
+
runtime,
|
|
226
|
+
phase: "resolve",
|
|
227
|
+
message: `Runtime gateway download failed; downloading ${runtime} directly`
|
|
228
|
+
});
|
|
229
|
+
selectedDownload = await resolveRuntimeDownloadSource({
|
|
230
|
+
asset,
|
|
231
|
+
platform,
|
|
232
|
+
config: {
|
|
233
|
+
...this.options.config.download,
|
|
234
|
+
source: "direct-only"
|
|
235
|
+
},
|
|
236
|
+
signal
|
|
237
|
+
});
|
|
238
|
+
expectedSha256 = selectedDownload.sha256;
|
|
239
|
+
archivePath = await download();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const stagingDir = runtimeStagingDir(this.options.stateDir, runtime, version, operationId);
|
|
243
|
+
this.progress({
|
|
244
|
+
operationId,
|
|
245
|
+
runtime,
|
|
246
|
+
phase: "extract",
|
|
247
|
+
message: `Extracting ${runtime} ${version}`
|
|
248
|
+
});
|
|
249
|
+
await atomicInstallRuntime(await extractRuntimeArchive({
|
|
250
|
+
runtime,
|
|
251
|
+
archivePath,
|
|
252
|
+
archiveType: asset.archiveType,
|
|
253
|
+
stagingDir
|
|
254
|
+
}), installDir);
|
|
255
|
+
await rm(stagingDir, {
|
|
256
|
+
recursive: true,
|
|
257
|
+
force: true
|
|
258
|
+
});
|
|
259
|
+
const executables = runtime === "node" ? nodeExecutables(installDir) : uvExecutables(installDir);
|
|
260
|
+
const probe = await runRuntimeCommand({
|
|
261
|
+
command: executables.primary,
|
|
262
|
+
args: ["--version"]
|
|
263
|
+
});
|
|
264
|
+
const actualVersion = parseRuntimeVersion(`${probe.stdout}\n${probe.stderr}`);
|
|
265
|
+
if (!probe.ok || !actualVersion || !versionSatisfies(actualVersion, version)) {
|
|
266
|
+
await rm(installDir, {
|
|
267
|
+
recursive: true,
|
|
268
|
+
force: true
|
|
269
|
+
});
|
|
270
|
+
throw new RuntimeError(`${runtime} ${version} failed its installation probe`, "RUNTIME_PROBE_FAILED", runtime, "probe", true);
|
|
271
|
+
}
|
|
272
|
+
let packageManagerVersion;
|
|
273
|
+
if (runtime === "node") {
|
|
274
|
+
const npmProbe = await runRuntimeCommand({
|
|
275
|
+
command: executables.npm,
|
|
276
|
+
args: ["--version"]
|
|
277
|
+
});
|
|
278
|
+
const npxProbe = await runRuntimeCommand({
|
|
279
|
+
command: executables.npx,
|
|
280
|
+
args: ["--version"]
|
|
281
|
+
});
|
|
282
|
+
if (!npmProbe.ok || !npxProbe.ok) {
|
|
283
|
+
await rm(installDir, {
|
|
284
|
+
recursive: true,
|
|
285
|
+
force: true
|
|
286
|
+
});
|
|
287
|
+
throw new RuntimeError(`Node ${version} is missing npm or npx`, "RUNTIME_PROBE_FAILED", runtime, "probe_package_manager", true);
|
|
288
|
+
}
|
|
289
|
+
packageManagerVersion = npmProbe.stdout;
|
|
290
|
+
}
|
|
291
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
292
|
+
const manifest = {
|
|
293
|
+
schemaVersion: 1,
|
|
294
|
+
runtime,
|
|
295
|
+
version: actualVersion,
|
|
296
|
+
source: "managed",
|
|
297
|
+
platform: process.platform,
|
|
298
|
+
arch: process.arch,
|
|
299
|
+
installDir,
|
|
300
|
+
executables,
|
|
301
|
+
installedAt: now,
|
|
302
|
+
verifiedAt: now,
|
|
303
|
+
distribution: {
|
|
304
|
+
url: offline ? `offline:${asset.archiveFile}` : selectedDownload.url,
|
|
305
|
+
sha256: expectedSha256,
|
|
306
|
+
archiveFile: asset.archiveFile,
|
|
307
|
+
catalogVersion: RUNTIME_CATALOG_VERSION
|
|
308
|
+
},
|
|
309
|
+
probe: {
|
|
310
|
+
versionOutput: probe.stdout || probe.stderr,
|
|
311
|
+
packageManagerVersion
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
await writeRuntimeManifest(this.options.stateDir, manifest);
|
|
315
|
+
this.progress({
|
|
316
|
+
operationId,
|
|
317
|
+
runtime,
|
|
318
|
+
phase: "complete",
|
|
319
|
+
message: `${runtime} ${actualVersion} is ready`
|
|
320
|
+
});
|
|
321
|
+
return {
|
|
322
|
+
runtime,
|
|
323
|
+
version: actualVersion,
|
|
324
|
+
source: "managed",
|
|
325
|
+
executable: executables.primary,
|
|
326
|
+
executables,
|
|
327
|
+
installDir
|
|
328
|
+
};
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
async installPython(version, signal) {
|
|
332
|
+
const operationId = randomUUID();
|
|
333
|
+
const installDir = runtimeVersionDir(this.options.stateDir, "python", version);
|
|
334
|
+
return await withInstallLock(runtimeLockPath(this.options.stateDir, "python", version), {
|
|
335
|
+
operationId,
|
|
336
|
+
runtime: "python",
|
|
337
|
+
version
|
|
338
|
+
}, async () => {
|
|
339
|
+
const ready = await this.probeManaged("python", version);
|
|
340
|
+
if (ready) return ready;
|
|
341
|
+
if (this.options.config.download.bundleDir) return await this.installBundledPython({
|
|
342
|
+
version,
|
|
343
|
+
operationId,
|
|
344
|
+
installDir,
|
|
345
|
+
bundleDir: this.options.config.download.bundleDir
|
|
346
|
+
});
|
|
347
|
+
const uv = await this.resolve({
|
|
348
|
+
runtime: "uv",
|
|
349
|
+
allowProvision: true,
|
|
350
|
+
signal
|
|
351
|
+
});
|
|
352
|
+
await mkdir(dirname(installDir), { recursive: true });
|
|
353
|
+
const uvEnv = this.uvEnvironment(installDir);
|
|
354
|
+
this.progress({
|
|
355
|
+
operationId,
|
|
356
|
+
runtime: "python",
|
|
357
|
+
phase: "install",
|
|
358
|
+
message: `Installing Python ${version}`
|
|
359
|
+
});
|
|
360
|
+
const installArgs = [
|
|
361
|
+
"python",
|
|
362
|
+
"install",
|
|
363
|
+
version,
|
|
364
|
+
"--install-dir",
|
|
365
|
+
installDir,
|
|
366
|
+
"--no-config"
|
|
367
|
+
];
|
|
368
|
+
const runInstall = async (env) => await runRuntimeCommand({
|
|
369
|
+
command: uv.executable,
|
|
370
|
+
args: installArgs,
|
|
371
|
+
env,
|
|
372
|
+
timeoutMs: this.options.config.download.timeoutMs,
|
|
373
|
+
signal
|
|
374
|
+
});
|
|
375
|
+
let installProbe = this.options.config.download.source === "direct-only" ? await runInstall(uvEnv) : await runInstall({
|
|
376
|
+
...uvEnv,
|
|
377
|
+
UV_PYTHON_INSTALL_MIRROR: runtimeGatewayPythonMirror(this.options.config.download.gatewayBaseUrl)
|
|
378
|
+
});
|
|
379
|
+
if (!installProbe.ok && !installProbe.aborted && this.options.config.download.source === "auto" && canFallbackPythonInstall(`${installProbe.stdout}\n${installProbe.stderr}`, installProbe.timedOut)) {
|
|
380
|
+
this.progress({
|
|
381
|
+
operationId,
|
|
382
|
+
runtime: "python",
|
|
383
|
+
phase: "install",
|
|
384
|
+
message: `Runtime gateway unavailable; installing Python ${version} directly`
|
|
385
|
+
});
|
|
386
|
+
installProbe = await runInstall(uvEnv);
|
|
387
|
+
}
|
|
388
|
+
if (!installProbe.ok) throw new RuntimeError(`Python ${version} installation failed: ${installProbe.stderr || installProbe.stdout}`, "RUNTIME_PROBE_FAILED", "python", "install", true);
|
|
389
|
+
const findProbe = await runRuntimeCommand({
|
|
390
|
+
command: uv.executable,
|
|
391
|
+
args: [
|
|
392
|
+
"python",
|
|
393
|
+
"find",
|
|
394
|
+
version,
|
|
395
|
+
"--managed-python",
|
|
396
|
+
"--no-config"
|
|
397
|
+
],
|
|
398
|
+
env: uvEnv
|
|
399
|
+
});
|
|
400
|
+
const python = findProbe.stdout.split(/\r?\n/).find(Boolean)?.trim();
|
|
401
|
+
if (!findProbe.ok || !python) throw new RuntimeError(`Python ${version} executable was not found after installation`, "RUNTIME_PROBE_FAILED", "python", "find", true);
|
|
402
|
+
const versionProbe = await runRuntimeCommand({
|
|
403
|
+
command: python,
|
|
404
|
+
args: ["-I", "--version"],
|
|
405
|
+
env: uvEnv
|
|
406
|
+
});
|
|
407
|
+
const actualVersion = parseRuntimeVersion(`${versionProbe.stdout}\n${versionProbe.stderr}`);
|
|
408
|
+
if (!versionProbe.ok || !actualVersion || !versionSatisfies(actualVersion, version)) throw new RuntimeError(`Python ${version} failed its installation probe`, "RUNTIME_PROBE_FAILED", "python", "probe", true);
|
|
409
|
+
const executables = {
|
|
410
|
+
primary: python,
|
|
411
|
+
python
|
|
412
|
+
};
|
|
413
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
414
|
+
await writeRuntimeManifest(this.options.stateDir, {
|
|
415
|
+
schemaVersion: 1,
|
|
416
|
+
runtime: "python",
|
|
417
|
+
version: actualVersion,
|
|
418
|
+
source: "managed",
|
|
419
|
+
platform: process.platform,
|
|
420
|
+
arch: process.arch,
|
|
421
|
+
installDir,
|
|
422
|
+
executables,
|
|
423
|
+
installedAt: now,
|
|
424
|
+
verifiedAt: now,
|
|
425
|
+
probe: { versionOutput: versionProbe.stdout || versionProbe.stderr }
|
|
426
|
+
});
|
|
427
|
+
this.progress({
|
|
428
|
+
operationId,
|
|
429
|
+
runtime: "python",
|
|
430
|
+
phase: "complete",
|
|
431
|
+
message: `Python ${actualVersion} is ready`
|
|
432
|
+
});
|
|
433
|
+
return {
|
|
434
|
+
runtime: "python",
|
|
435
|
+
version: actualVersion,
|
|
436
|
+
source: "managed",
|
|
437
|
+
executable: python,
|
|
438
|
+
executables,
|
|
439
|
+
installDir
|
|
440
|
+
};
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
async installBundledPython(params) {
|
|
444
|
+
const platform = detectRuntimePlatform();
|
|
445
|
+
if (!platform) throw new RuntimeError(`Managed python is not supported on ${process.platform}-${process.arch}`, "RUNTIME_UNSUPPORTED", "python", "offline_bundle", false);
|
|
446
|
+
const archiveFile = bundledPythonArchiveName({
|
|
447
|
+
version: params.version,
|
|
448
|
+
platform
|
|
449
|
+
});
|
|
450
|
+
const artifact = await resolveOfflineBundleArtifact({
|
|
451
|
+
bundleDir: params.bundleDir,
|
|
452
|
+
runtime: "python",
|
|
453
|
+
archiveFile
|
|
454
|
+
});
|
|
455
|
+
const stagingDir = runtimeStagingDir(this.options.stateDir, "python", params.version, params.operationId);
|
|
456
|
+
this.progress({
|
|
457
|
+
operationId: params.operationId,
|
|
458
|
+
runtime: "python",
|
|
459
|
+
phase: "extract",
|
|
460
|
+
message: `Extracting Python ${params.version} from offline bundle`
|
|
461
|
+
});
|
|
462
|
+
await atomicInstallRuntime(await extractRuntimeArchive({
|
|
463
|
+
runtime: "python",
|
|
464
|
+
archivePath: artifact.archivePath,
|
|
465
|
+
archiveType: artifact.archiveType,
|
|
466
|
+
stagingDir
|
|
467
|
+
}), params.installDir);
|
|
468
|
+
await rm(stagingDir, {
|
|
469
|
+
recursive: true,
|
|
470
|
+
force: true
|
|
471
|
+
});
|
|
472
|
+
const candidates = process.platform === "win32" ? [join(params.installDir, "python.exe")] : [join(params.installDir, "bin", "python3"), join(params.installDir, "bin", "python")];
|
|
473
|
+
let python;
|
|
474
|
+
for (const candidate of candidates) try {
|
|
475
|
+
await access(candidate);
|
|
476
|
+
python = candidate;
|
|
477
|
+
break;
|
|
478
|
+
} catch {}
|
|
479
|
+
if (!python) {
|
|
480
|
+
await rm(params.installDir, {
|
|
481
|
+
recursive: true,
|
|
482
|
+
force: true
|
|
483
|
+
});
|
|
484
|
+
throw new RuntimeError(`Offline Python ${params.version} has no Python executable`, "RUNTIME_PROBE_FAILED", "python", "probe", true);
|
|
485
|
+
}
|
|
486
|
+
const probe = await runRuntimeCommand({
|
|
487
|
+
command: python,
|
|
488
|
+
args: ["-I", "--version"]
|
|
489
|
+
});
|
|
490
|
+
const actualVersion = parseRuntimeVersion(`${probe.stdout}\n${probe.stderr}`);
|
|
491
|
+
if (!probe.ok || !actualVersion || !versionSatisfies(actualVersion, params.version)) {
|
|
492
|
+
await rm(params.installDir, {
|
|
493
|
+
recursive: true,
|
|
494
|
+
force: true
|
|
495
|
+
});
|
|
496
|
+
throw new RuntimeError(`Offline Python ${params.version} failed its installation probe`, "RUNTIME_PROBE_FAILED", "python", "probe", true);
|
|
497
|
+
}
|
|
498
|
+
const executables = {
|
|
499
|
+
primary: python,
|
|
500
|
+
python
|
|
501
|
+
};
|
|
502
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
503
|
+
await writeRuntimeManifest(this.options.stateDir, {
|
|
504
|
+
schemaVersion: 1,
|
|
505
|
+
runtime: "python",
|
|
506
|
+
version: actualVersion,
|
|
507
|
+
source: "managed",
|
|
508
|
+
platform: process.platform,
|
|
509
|
+
arch: process.arch,
|
|
510
|
+
installDir: params.installDir,
|
|
511
|
+
executables,
|
|
512
|
+
installedAt: now,
|
|
513
|
+
verifiedAt: now,
|
|
514
|
+
distribution: {
|
|
515
|
+
url: `offline:${artifact.archiveFile}`,
|
|
516
|
+
sha256: artifact.sha256,
|
|
517
|
+
archiveFile: artifact.archiveFile,
|
|
518
|
+
catalogVersion: RUNTIME_CATALOG_VERSION
|
|
519
|
+
},
|
|
520
|
+
probe: { versionOutput: probe.stdout || probe.stderr }
|
|
521
|
+
});
|
|
522
|
+
this.progress({
|
|
523
|
+
operationId: params.operationId,
|
|
524
|
+
runtime: "python",
|
|
525
|
+
phase: "complete",
|
|
526
|
+
message: `Python ${actualVersion} is ready`
|
|
527
|
+
});
|
|
528
|
+
return {
|
|
529
|
+
runtime: "python",
|
|
530
|
+
version: actualVersion,
|
|
531
|
+
source: "managed",
|
|
532
|
+
executable: python,
|
|
533
|
+
executables,
|
|
534
|
+
installDir: params.installDir
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
uvEnvironment(pythonInstallDir) {
|
|
538
|
+
const toolsRoot = runtimeToolsRoot(this.options.stateDir);
|
|
539
|
+
const env = {
|
|
540
|
+
...process.env,
|
|
541
|
+
UV_PYTHON_INSTALL_DIR: pythonInstallDir,
|
|
542
|
+
UV_PYTHON_BIN_DIR: join(toolsRoot, "python", "bin"),
|
|
543
|
+
UV_CACHE_DIR: join(toolsRoot, "cache", "uv"),
|
|
544
|
+
UV_MANAGED_PYTHON: "1",
|
|
545
|
+
UV_NO_CONFIG: "1",
|
|
546
|
+
UV_HTTP_TIMEOUT: String(Math.ceil(this.options.config.download.timeoutMs / 1e3))
|
|
547
|
+
};
|
|
548
|
+
delete env.UV_PYTHON_INSTALL_MIRROR;
|
|
549
|
+
if (this.options.config.download.proxy) {
|
|
550
|
+
env.HTTP_PROXY = this.options.config.download.proxy;
|
|
551
|
+
env.HTTPS_PROXY = this.options.config.download.proxy;
|
|
552
|
+
}
|
|
553
|
+
return env;
|
|
554
|
+
}
|
|
555
|
+
async status(runtime) {
|
|
556
|
+
const config = runtimeConfig(this.options, runtime);
|
|
557
|
+
const requestedVersion = this.defaultVersion(runtime);
|
|
558
|
+
if (!this.options.config.enabled || !config.enabled) return {
|
|
559
|
+
runtime,
|
|
560
|
+
state: "disabled",
|
|
561
|
+
requestedVersion,
|
|
562
|
+
message: "Runtime is disabled",
|
|
563
|
+
repairable: false
|
|
564
|
+
};
|
|
565
|
+
try {
|
|
566
|
+
const resolved = await this.resolve({
|
|
567
|
+
runtime,
|
|
568
|
+
version: requestedVersion,
|
|
569
|
+
allowProvision: false
|
|
570
|
+
});
|
|
571
|
+
return {
|
|
572
|
+
runtime,
|
|
573
|
+
state: "ready",
|
|
574
|
+
requestedVersion,
|
|
575
|
+
resolved,
|
|
576
|
+
message: `${runtime} ${resolved.version} is ready (${resolved.source})`,
|
|
577
|
+
repairable: false
|
|
578
|
+
};
|
|
579
|
+
} catch {}
|
|
580
|
+
if (await readRuntimeManifest(this.options.stateDir, runtime)) return {
|
|
581
|
+
runtime,
|
|
582
|
+
state: "corrupted",
|
|
583
|
+
requestedVersion,
|
|
584
|
+
message: `${runtime} managed installation is incomplete or invalid`,
|
|
585
|
+
repairable: true
|
|
586
|
+
};
|
|
587
|
+
return {
|
|
588
|
+
runtime,
|
|
589
|
+
state: "absent",
|
|
590
|
+
requestedVersion,
|
|
591
|
+
message: `${runtime} ${requestedVersion} is not installed`,
|
|
592
|
+
repairable: true
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
async statusAll() {
|
|
596
|
+
return await Promise.all([
|
|
597
|
+
"node",
|
|
598
|
+
"uv",
|
|
599
|
+
"python"
|
|
600
|
+
].map((runtime) => this.status(runtime)));
|
|
601
|
+
}
|
|
602
|
+
async repair(runtime) {
|
|
603
|
+
const version = this.defaultVersion(runtime);
|
|
604
|
+
const installDir = runtimeVersionDir(this.options.stateDir, runtime, version);
|
|
605
|
+
const backupDir = `${installDir}.repair-backup-${randomUUID()}`;
|
|
606
|
+
let hasBackup = false;
|
|
607
|
+
try {
|
|
608
|
+
await rename(installDir, backupDir);
|
|
609
|
+
hasBackup = true;
|
|
610
|
+
} catch {}
|
|
611
|
+
try {
|
|
612
|
+
const resolved = await this.install(runtime, version);
|
|
613
|
+
if (hasBackup) await rm(backupDir, {
|
|
614
|
+
recursive: true,
|
|
615
|
+
force: true
|
|
616
|
+
});
|
|
617
|
+
return resolved;
|
|
618
|
+
} catch (error) {
|
|
619
|
+
if (hasBackup) {
|
|
620
|
+
await rm(installDir, {
|
|
621
|
+
recursive: true,
|
|
622
|
+
force: true
|
|
623
|
+
});
|
|
624
|
+
await rename(backupDir, installDir);
|
|
625
|
+
}
|
|
626
|
+
throw error;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
progress(event) {
|
|
630
|
+
this.emit("progress", event);
|
|
631
|
+
log.info({
|
|
632
|
+
operationId: event.operationId,
|
|
633
|
+
runtime: event.runtime,
|
|
634
|
+
phase: event.phase,
|
|
635
|
+
downloadedBytes: event.downloadedBytes,
|
|
636
|
+
totalBytes: event.totalBytes
|
|
637
|
+
}, event.message);
|
|
638
|
+
}
|
|
639
|
+
};
|
|
640
|
+
//#endregion
|
|
641
|
+
export { ManagedRuntimeManager };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { InstalledRuntimeManifest, RuntimeKind } from './types.js';
|
|
2
|
+
export declare function readRuntimeManifest(stateDir: string, runtime: RuntimeKind): Promise<InstalledRuntimeManifest | null>;
|
|
3
|
+
export declare function writeRuntimeManifest(stateDir: string, manifest: InstalledRuntimeManifest): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { runtimeManifestPath } from "./paths.js";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
4
|
+
//#region src/runtime-tools/manifest-store.ts
|
|
5
|
+
function isManifest(value, runtime) {
|
|
6
|
+
if (!value || typeof value !== "object") return false;
|
|
7
|
+
const item = value;
|
|
8
|
+
return item.schemaVersion === 1 && item.runtime === runtime && typeof item.version === "string" && typeof item.installDir === "string" && !!item.executables && typeof item.executables.primary === "string";
|
|
9
|
+
}
|
|
10
|
+
async function readRuntimeManifest(stateDir, runtime) {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(await readFile(runtimeManifestPath(stateDir, runtime), "utf8"));
|
|
13
|
+
return isManifest(parsed, runtime) ? parsed : null;
|
|
14
|
+
} catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function writeRuntimeManifest(stateDir, manifest) {
|
|
19
|
+
const target = runtimeManifestPath(stateDir, manifest.runtime);
|
|
20
|
+
await mkdir(dirname(target), { recursive: true });
|
|
21
|
+
const temporary = `${target}.${process.pid}.tmp`;
|
|
22
|
+
await writeFile(temporary, `${JSON.stringify(manifest, null, 2)}\n`, { mode: 384 });
|
|
23
|
+
await rename(temporary, target);
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { readRuntimeManifest, writeRuntimeManifest };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type RequestInit, type Response } from 'undici';
|
|
2
|
+
export declare function fetchRuntimeResource(params: {
|
|
3
|
+
url: string;
|
|
4
|
+
timeoutMs: number;
|
|
5
|
+
proxy?: string;
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
init?: Omit<RequestInit, 'dispatcher' | 'signal'>;
|
|
8
|
+
}): Promise<Response>;
|
|
9
|
+
export declare function readRuntimeResponseText(response: Response, maxBytes: number): Promise<string>;
|