@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
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { ManagedRuntimeManager } from "../../runtime-tools/manager.js";
|
|
4
|
+
import { buildRuntimeEnvironment } from "../../runtime-tools/environment.js";
|
|
5
|
+
import { prepareSafeToolEnv } from "../sandbox/sanitize-env-vars.js";
|
|
3
6
|
import { delimiter, join } from "path";
|
|
4
7
|
import { accessSync, constants, existsSync } from "fs";
|
|
8
|
+
import { access, mkdir, writeFile } from "fs/promises";
|
|
5
9
|
import { promisify } from "util";
|
|
6
|
-
import {
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { execFile } from "child_process";
|
|
7
12
|
//#region src/agent/skills/installer.ts
|
|
8
13
|
/**
|
|
9
14
|
* Skill Installer
|
|
@@ -12,7 +17,7 @@ import { exec } from "child_process";
|
|
|
12
17
|
*
|
|
13
18
|
*/
|
|
14
19
|
init_logger();
|
|
15
|
-
const
|
|
20
|
+
const execFileAsync = promisify(execFile);
|
|
16
21
|
const log = createLogger("SkillInstaller");
|
|
17
22
|
/**
|
|
18
23
|
* Check if a binary exists
|
|
@@ -39,64 +44,47 @@ function resolveBrewExecutable() {
|
|
|
39
44
|
/**
|
|
40
45
|
* Build install command for Node.js packages
|
|
41
46
|
*/
|
|
42
|
-
function buildNodeInstallCommand(packageName,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"--ignore-scripts",
|
|
56
|
-
packageName
|
|
57
|
-
];
|
|
58
|
-
case "bun": return [
|
|
59
|
-
"bun",
|
|
60
|
-
"add",
|
|
61
|
-
"-g",
|
|
62
|
-
"--ignore-scripts",
|
|
63
|
-
packageName
|
|
64
|
-
];
|
|
65
|
-
default: return [
|
|
66
|
-
"npm",
|
|
67
|
-
"install",
|
|
68
|
-
"-g",
|
|
69
|
-
"--ignore-scripts",
|
|
70
|
-
packageName
|
|
71
|
-
];
|
|
72
|
-
}
|
|
47
|
+
function buildNodeInstallCommand(packageName, environmentDir) {
|
|
48
|
+
return [
|
|
49
|
+
"npm",
|
|
50
|
+
"install",
|
|
51
|
+
"--prefix",
|
|
52
|
+
environmentDir,
|
|
53
|
+
"--ignore-scripts",
|
|
54
|
+
"--",
|
|
55
|
+
packageName
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
function invalidInstallTarget(value) {
|
|
59
|
+
return !value || value.startsWith("-") || value.includes("\0");
|
|
73
60
|
}
|
|
74
61
|
/**
|
|
75
62
|
* Build install command from spec
|
|
76
63
|
*/
|
|
77
|
-
function buildInstallCommand(spec,
|
|
64
|
+
function buildInstallCommand(spec, environmentDir) {
|
|
78
65
|
switch (spec.kind) {
|
|
79
66
|
case "brew":
|
|
80
|
-
if (
|
|
67
|
+
if (invalidInstallTarget(spec.formula)) return {
|
|
81
68
|
argv: null,
|
|
82
69
|
error: "Missing brew formula"
|
|
83
70
|
};
|
|
84
71
|
return { argv: [
|
|
85
72
|
"brew",
|
|
86
73
|
"install",
|
|
74
|
+
"--formula",
|
|
87
75
|
spec.formula
|
|
88
76
|
] };
|
|
89
77
|
case "pnpm":
|
|
90
78
|
case "npm":
|
|
91
79
|
case "yarn":
|
|
92
80
|
case "bun":
|
|
93
|
-
if (
|
|
81
|
+
if (invalidInstallTarget(spec.package)) return {
|
|
94
82
|
argv: null,
|
|
95
83
|
error: "Missing package name"
|
|
96
84
|
};
|
|
97
|
-
return { argv: buildNodeInstallCommand(spec.package,
|
|
85
|
+
return { argv: buildNodeInstallCommand(spec.package, environmentDir) };
|
|
98
86
|
case "go":
|
|
99
|
-
if (
|
|
87
|
+
if (invalidInstallTarget(spec.module)) return {
|
|
100
88
|
argv: null,
|
|
101
89
|
error: "Missing go module"
|
|
102
90
|
};
|
|
@@ -106,7 +94,7 @@ function buildInstallCommand(spec, prefs) {
|
|
|
106
94
|
spec.module
|
|
107
95
|
] };
|
|
108
96
|
case "uv":
|
|
109
|
-
if (
|
|
97
|
+
if (invalidInstallTarget(spec.package)) return {
|
|
110
98
|
argv: null,
|
|
111
99
|
error: "Missing uv package"
|
|
112
100
|
};
|
|
@@ -114,6 +102,11 @@ function buildInstallCommand(spec, prefs) {
|
|
|
114
102
|
"uv",
|
|
115
103
|
"tool",
|
|
116
104
|
"install",
|
|
105
|
+
"--tool-dir",
|
|
106
|
+
join(environmentDir, "tools"),
|
|
107
|
+
"--bin-dir",
|
|
108
|
+
join(environmentDir, "bin"),
|
|
109
|
+
"--",
|
|
117
110
|
spec.package
|
|
118
111
|
] };
|
|
119
112
|
case "download": return {
|
|
@@ -133,8 +126,13 @@ function buildInstallCommand(spec, prefs) {
|
|
|
133
126
|
*/
|
|
134
127
|
async function runCommandWithTimeout(argv, timeoutMs, env) {
|
|
135
128
|
const [cmd, ...args] = argv;
|
|
129
|
+
if (!cmd) return {
|
|
130
|
+
code: null,
|
|
131
|
+
stdout: "",
|
|
132
|
+
stderr: "Missing executable"
|
|
133
|
+
};
|
|
136
134
|
try {
|
|
137
|
-
const { stdout, stderr } = await
|
|
135
|
+
const { stdout, stderr } = await execFileAsync(cmd, args, {
|
|
138
136
|
timeout: timeoutMs,
|
|
139
137
|
env,
|
|
140
138
|
maxBuffer: 10 * 1024 * 1024
|
|
@@ -161,92 +159,6 @@ async function runCommandWithTimeout(argv, timeoutMs, env) {
|
|
|
161
159
|
}
|
|
162
160
|
}
|
|
163
161
|
/**
|
|
164
|
-
* Ensure uv is installed
|
|
165
|
-
*/
|
|
166
|
-
async function ensureUvInstalled(timeoutMs) {
|
|
167
|
-
if (hasBinary("uv")) return;
|
|
168
|
-
const brewExe = resolveBrewExecutable();
|
|
169
|
-
if (!brewExe) return {
|
|
170
|
-
ok: false,
|
|
171
|
-
message: "uv not installed — install manually: https://docs.astral.sh/uv/getting-started/installation/",
|
|
172
|
-
stdout: "",
|
|
173
|
-
stderr: "",
|
|
174
|
-
code: null
|
|
175
|
-
};
|
|
176
|
-
const result = await runCommandWithTimeout([
|
|
177
|
-
brewExe,
|
|
178
|
-
"install",
|
|
179
|
-
"uv"
|
|
180
|
-
], timeoutMs);
|
|
181
|
-
if (result.code === 0) return;
|
|
182
|
-
return {
|
|
183
|
-
ok: false,
|
|
184
|
-
message: "Failed to install uv (brew)",
|
|
185
|
-
stdout: result.stdout,
|
|
186
|
-
stderr: result.stderr,
|
|
187
|
-
code: result.code
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Ensure Go is installed
|
|
192
|
-
*/
|
|
193
|
-
async function ensureGoInstalled(timeoutMs) {
|
|
194
|
-
if (hasBinary("go")) return;
|
|
195
|
-
const brewExe = resolveBrewExecutable();
|
|
196
|
-
if (brewExe) {
|
|
197
|
-
const result = await runCommandWithTimeout([
|
|
198
|
-
brewExe,
|
|
199
|
-
"install",
|
|
200
|
-
"go"
|
|
201
|
-
], timeoutMs);
|
|
202
|
-
if (result.code === 0) return;
|
|
203
|
-
return {
|
|
204
|
-
ok: false,
|
|
205
|
-
message: "Failed to install go (brew)",
|
|
206
|
-
stdout: result.stdout,
|
|
207
|
-
stderr: result.stderr,
|
|
208
|
-
code: result.code
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
if (hasBinary("apt-get")) {
|
|
212
|
-
const isRoot = process.getuid?.() === 0;
|
|
213
|
-
const aptCmd = isRoot ? [
|
|
214
|
-
"apt-get",
|
|
215
|
-
"install",
|
|
216
|
-
"-y",
|
|
217
|
-
"golang-go"
|
|
218
|
-
] : [
|
|
219
|
-
"sudo",
|
|
220
|
-
"apt-get",
|
|
221
|
-
"install",
|
|
222
|
-
"-y",
|
|
223
|
-
"golang-go"
|
|
224
|
-
];
|
|
225
|
-
if (!isRoot) await runCommandWithTimeout([
|
|
226
|
-
"sudo",
|
|
227
|
-
"apt-get",
|
|
228
|
-
"update",
|
|
229
|
-
"-qq"
|
|
230
|
-
], Math.min(timeoutMs, 3e4));
|
|
231
|
-
const result = await runCommandWithTimeout(aptCmd, timeoutMs);
|
|
232
|
-
if (result.code === 0) return;
|
|
233
|
-
return {
|
|
234
|
-
ok: false,
|
|
235
|
-
message: "go not installed — automatic install via apt failed. Install manually: https://go.dev/doc/install",
|
|
236
|
-
stdout: result.stdout,
|
|
237
|
-
stderr: result.stderr,
|
|
238
|
-
code: result.code
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
return {
|
|
242
|
-
ok: false,
|
|
243
|
-
message: "go not installed — install manually: https://go.dev/doc/install",
|
|
244
|
-
stdout: "",
|
|
245
|
-
stderr: "",
|
|
246
|
-
code: null
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
162
|
* Create install failure result
|
|
251
163
|
*/
|
|
252
164
|
function createInstallFailure(params) {
|
|
@@ -281,41 +193,81 @@ function findInstallSpec(entry, installId) {
|
|
|
281
193
|
* Install a skill dependency
|
|
282
194
|
*/
|
|
283
195
|
async function installSkill(ctx) {
|
|
284
|
-
const { installSpec, timeoutMs
|
|
196
|
+
const { installSpec, timeoutMs } = ctx;
|
|
285
197
|
log.info({
|
|
286
198
|
skill: ctx.skillEntry.skill.name,
|
|
287
199
|
kind: installSpec.kind
|
|
288
200
|
}, "Installing skill dependency");
|
|
289
201
|
if (installSpec.kind === "download") return createInstallFailure({ message: "Download installer not yet implemented" });
|
|
290
|
-
if (installSpec.kind === "uv") {
|
|
291
|
-
const uvFailure = await ensureUvInstalled(timeoutMs);
|
|
292
|
-
if (uvFailure) return uvFailure;
|
|
293
|
-
}
|
|
294
202
|
if (installSpec.kind === "go") {
|
|
295
|
-
|
|
296
|
-
if (goFailure) return goFailure;
|
|
203
|
+
if (!hasBinary("go")) return createInstallFailure({ message: "go not installed — install it explicitly from https://go.dev/doc/install" });
|
|
297
204
|
}
|
|
298
|
-
const
|
|
205
|
+
const environmentId = createHash("sha256").update(JSON.stringify({
|
|
206
|
+
skill: ctx.skillEntry.skill.name,
|
|
207
|
+
path: ctx.skillEntry.skill.filePath,
|
|
208
|
+
installSpec
|
|
209
|
+
})).digest("hex").slice(0, 24);
|
|
210
|
+
const environmentDir = join(ctx.stateDir, "tools", "environments", "skills", environmentId);
|
|
211
|
+
await mkdir(environmentDir, { recursive: true });
|
|
212
|
+
if ([
|
|
213
|
+
"npm",
|
|
214
|
+
"pnpm",
|
|
215
|
+
"yarn",
|
|
216
|
+
"bun"
|
|
217
|
+
].includes(installSpec.kind)) await writeFile(join(environmentDir, "package.json"), `${JSON.stringify({
|
|
218
|
+
private: true,
|
|
219
|
+
name: `xopc-skill-${environmentId}`
|
|
220
|
+
}, null, 2)}\n`, { flag: "wx" }).catch((error) => {
|
|
221
|
+
if (error.code !== "EEXIST") throw error;
|
|
222
|
+
});
|
|
223
|
+
const command = buildInstallCommand(installSpec, environmentDir);
|
|
299
224
|
if (command.error) return createInstallFailure({ message: command.error });
|
|
300
225
|
if (!command.argv) return createInstallFailure({ message: "Invalid install command" });
|
|
301
226
|
let argv = [...command.argv];
|
|
227
|
+
const runtimeManager = new ManagedRuntimeManager({
|
|
228
|
+
stateDir: ctx.stateDir,
|
|
229
|
+
config: ctx.runtimeConfig
|
|
230
|
+
});
|
|
231
|
+
if (installSpec.kind === "uv") argv[0] = (await runtimeManager.resolve({
|
|
232
|
+
runtime: "uv",
|
|
233
|
+
allowProvision: true
|
|
234
|
+
})).executable;
|
|
235
|
+
else if ([
|
|
236
|
+
"npm",
|
|
237
|
+
"pnpm",
|
|
238
|
+
"yarn",
|
|
239
|
+
"bun"
|
|
240
|
+
].includes(installSpec.kind)) {
|
|
241
|
+
const node = await runtimeManager.resolve({
|
|
242
|
+
runtime: "node",
|
|
243
|
+
allowProvision: true
|
|
244
|
+
});
|
|
245
|
+
if (node.installDir) {
|
|
246
|
+
const npmCli = process.platform === "win32" ? join(node.installDir, "node_modules", "npm", "bin", "npm-cli.js") : join(node.installDir, "lib", "node_modules", "npm", "bin", "npm-cli.js");
|
|
247
|
+
try {
|
|
248
|
+
await access(npmCli);
|
|
249
|
+
} catch {
|
|
250
|
+
return createInstallFailure({ message: "Managed Node.js does not include npm-cli.js" });
|
|
251
|
+
}
|
|
252
|
+
argv.splice(0, 1, node.executable, npmCli);
|
|
253
|
+
} else if (process.platform === "win32") return createInstallFailure({ message: "Isolated package installation on Windows requires managed Node.js" });
|
|
254
|
+
else argv[0] = node.executables.npm ?? "npm";
|
|
255
|
+
}
|
|
302
256
|
if (installSpec.kind === "brew") {
|
|
303
257
|
const brewExe = resolveBrewExecutable();
|
|
304
258
|
if (!brewExe) return createInstallFailure({ message: `brew not installed — ${process.platform === "linux" ? "Homebrew is not installed. Install it from https://brew.sh or use your system package manager." : "Homebrew is not installed. Install it from https://brew.sh"}` });
|
|
305
259
|
argv[0] = brewExe;
|
|
306
260
|
}
|
|
307
|
-
let env
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
} catch {}
|
|
318
|
-
}
|
|
261
|
+
let env = (await buildRuntimeEnvironment({
|
|
262
|
+
stateDir: ctx.stateDir,
|
|
263
|
+
config: ctx.runtimeConfig,
|
|
264
|
+
baseEnv: prepareSafeToolEnv(process.env),
|
|
265
|
+
extraBinDirs: [join(environmentDir, "bin"), join(environmentDir, "node_modules", ".bin")]
|
|
266
|
+
})).env;
|
|
267
|
+
if (installSpec.kind === "go") env = {
|
|
268
|
+
...env,
|
|
269
|
+
GOBIN: join(environmentDir, "bin")
|
|
270
|
+
};
|
|
319
271
|
const result = await runCommandWithTimeout(argv, timeoutMs, env);
|
|
320
272
|
if (result.code === 0) {
|
|
321
273
|
log.info({ skill: ctx.skillEntry.skill.name }, "Skill dependency installed successfully");
|
|
@@ -332,14 +284,5 @@ async function installSkill(ctx) {
|
|
|
332
284
|
code: result.code
|
|
333
285
|
});
|
|
334
286
|
}
|
|
335
|
-
/**
|
|
336
|
-
* Get default installer preferences from config
|
|
337
|
-
*/
|
|
338
|
-
function getDefaultInstallerPreferences() {
|
|
339
|
-
return {
|
|
340
|
-
preferBrew: true,
|
|
341
|
-
nodeManager: "pnpm"
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
287
|
//#endregion
|
|
345
|
-
export { findInstallSpec,
|
|
288
|
+
export { findInstallSpec, hasBinary, installSkill, resolveBrewExecutable };
|
|
@@ -7,7 +7,9 @@ export interface SkillsMarketplaceAdapter {
|
|
|
7
7
|
/** Unique adapter identifier. Built-in: 'store' | 'skillhub' | 'clawhub'. Extensions may add arbitrary ids. */
|
|
8
8
|
readonly id: string;
|
|
9
9
|
/** Filter chips for the current provider (may be empty). */
|
|
10
|
-
listCategories(config: Config
|
|
10
|
+
listCategories(config: Config, options?: {
|
|
11
|
+
locale?: string;
|
|
12
|
+
}): Promise<MarketplaceCategoryOption[]>;
|
|
11
13
|
listPackages(config: Config, params: SkillsStoreListParams): Promise<UnifiedMarketplaceListResponse>;
|
|
12
14
|
getPackageDetail(config: Config, packageName: string): Promise<UnifiedMarketplacePackageDetail>;
|
|
13
15
|
downloadPackage(config: Config, packageName: string, version?: string): Promise<{
|
|
@@ -77,6 +77,12 @@ async function getClawHubSkillFileText(slug, filePath, version) {
|
|
|
77
77
|
const text = await res.text();
|
|
78
78
|
return text.length > MAX_CLAWHUB_FILE_BYTES ? text.slice(0, MAX_CLAWHUB_FILE_BYTES) : text;
|
|
79
79
|
}
|
|
80
|
+
function versionFromDownloadDisposition(value, slug) {
|
|
81
|
+
const filename = value?.match(/filename="?([^";]+)"?/i)?.[1]?.trim();
|
|
82
|
+
const prefix = `${slug}-`;
|
|
83
|
+
if (!filename?.startsWith(prefix) || !filename.toLowerCase().endsWith(".zip")) return void 0;
|
|
84
|
+
return filename.slice(prefix.length, -4).trim() || void 0;
|
|
85
|
+
}
|
|
80
86
|
async function downloadClawHubSkillZip(reference, version) {
|
|
81
87
|
const parts = reference.trim().replace(/^@/, "").split("/").filter(Boolean);
|
|
82
88
|
const ownerHandle = parts.length === 2 ? parts[0] : void 0;
|
|
@@ -95,9 +101,10 @@ async function downloadClawHubSkillZip(reference, version) {
|
|
|
95
101
|
if (!contentType.includes("zip") && !contentType.includes("octet-stream")) throw new Error(`ClawHub download [${slug}] unexpected content-type: ${contentType}`);
|
|
96
102
|
const arrayBuf = await res.arrayBuffer();
|
|
97
103
|
if (arrayBuf.byteLength > MAX_SKILL_ZIP_BYTES) throw new Error(`ClawHub download [${slug}] exceeds size limit (${arrayBuf.byteLength} > ${MAX_SKILL_ZIP_BYTES})`);
|
|
104
|
+
const resolvedVersion = version?.trim() || versionFromDownloadDisposition(res.headers.get("content-disposition"), slug) || "latest";
|
|
98
105
|
return {
|
|
99
106
|
buffer: Buffer.from(arrayBuf),
|
|
100
|
-
version:
|
|
107
|
+
version: resolvedVersion,
|
|
101
108
|
slug
|
|
102
109
|
};
|
|
103
110
|
}
|
|
@@ -202,7 +209,7 @@ function convertListItemToPackageItem(item) {
|
|
|
202
209
|
}
|
|
203
210
|
function convertSearchResultToPackageItem(item, enrichment) {
|
|
204
211
|
return {
|
|
205
|
-
id: item.
|
|
212
|
+
id: item.slug,
|
|
206
213
|
name: item.displayName || item.slug,
|
|
207
214
|
type: "skill",
|
|
208
215
|
description: item.summary || "",
|
|
@@ -215,9 +222,27 @@ function convertSearchResultToPackageItem(item, enrichment) {
|
|
|
215
222
|
updatedAt: String(item.metrics?.updatedAt ?? item.updatedAt ?? ""),
|
|
216
223
|
categories: item.native?.skill?.categories ?? enrichment?.metadata?.os ?? [],
|
|
217
224
|
stars: item.native?.skill?.stats?.stars ?? item.metrics?.bookmarks ?? enrichment?.stats.stars ?? 0,
|
|
218
|
-
sourceLabel: item.source === "skills-sh" ? "skills.sh" : "ClawHub"
|
|
225
|
+
sourceLabel: item.source === "skills-sh" ? "skills.sh" : "ClawHub",
|
|
226
|
+
searchScore: typeof item.score === "number" && Number.isFinite(item.score) ? item.score : void 0
|
|
219
227
|
};
|
|
220
228
|
}
|
|
229
|
+
function sortClawHubSearchRows(rows, sort) {
|
|
230
|
+
return [...rows].sort((a, b) => {
|
|
231
|
+
const aScore = a.searchScore;
|
|
232
|
+
const bScore = b.searchScore;
|
|
233
|
+
if (aScore !== void 0 || bScore !== void 0) {
|
|
234
|
+
const relevanceDiff = (bScore ?? Number.NEGATIVE_INFINITY) - (aScore ?? Number.NEGATIVE_INFINITY);
|
|
235
|
+
if (relevanceDiff !== 0) return relevanceDiff;
|
|
236
|
+
}
|
|
237
|
+
if (sort === "downloads") return b.downloads - a.downloads;
|
|
238
|
+
if (sort === "newest") return Number(b.updatedAt) - Number(a.updatedAt);
|
|
239
|
+
return 0;
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
function publicPackageItem(row) {
|
|
243
|
+
const { searchScore: _searchScore, ...item } = row;
|
|
244
|
+
return item;
|
|
245
|
+
}
|
|
221
246
|
function mapSortParam(sort) {
|
|
222
247
|
if (sort === "downloads") return "downloads";
|
|
223
248
|
if (sort === "newest") return "newest";
|
|
@@ -241,12 +266,11 @@ const clawHubMarketplaceAdapter = {
|
|
|
241
266
|
const enrichmentBySlug = /* @__PURE__ */ new Map();
|
|
242
267
|
if (listSettled.status === "fulfilled") for (const it of listSettled.value.items) enrichmentBySlug.set(it.slug, it);
|
|
243
268
|
let rows = searchResponse.value.results.filter((r) => !r.source || r.source === "clawhub").map((r) => convertSearchResultToPackageItem(r, enrichmentBySlug.get(r.slug)));
|
|
244
|
-
|
|
245
|
-
else if (params.sort === "newest") rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
|
|
269
|
+
rows = sortClawHubSearchRows(rows, params.sort);
|
|
246
270
|
const total = rows.length;
|
|
247
271
|
const start = (page - 1) * pageSize;
|
|
248
272
|
return {
|
|
249
|
-
items: rows.slice(start, start + pageSize),
|
|
273
|
+
items: rows.slice(start, start + pageSize).map(publicPackageItem),
|
|
250
274
|
meta: {
|
|
251
275
|
page,
|
|
252
276
|
pageSize,
|
|
@@ -385,9 +385,27 @@ function lightmakeHitToPackageItem(hit) {
|
|
|
385
385
|
updatedAt: String(updated),
|
|
386
386
|
categories: cat ? [cat] : [],
|
|
387
387
|
stars: typeof hit.stars === "number" ? hit.stars : void 0,
|
|
388
|
-
sourceLabel: sourceLabelFromSkillSource(hit.source) ?? "Lightmake"
|
|
388
|
+
sourceLabel: sourceLabelFromSkillSource(hit.source) ?? "Lightmake",
|
|
389
|
+
searchScore: typeof hit.score === "number" && Number.isFinite(hit.score) ? hit.score : void 0
|
|
389
390
|
};
|
|
390
391
|
}
|
|
392
|
+
function sortSkillHubSearchRows(rows, sort) {
|
|
393
|
+
return [...rows].sort((a, b) => {
|
|
394
|
+
const aScore = a.searchScore;
|
|
395
|
+
const bScore = b.searchScore;
|
|
396
|
+
if (aScore !== void 0 || bScore !== void 0) {
|
|
397
|
+
const relevanceDiff = (bScore ?? Number.NEGATIVE_INFINITY) - (aScore ?? Number.NEGATIVE_INFINITY);
|
|
398
|
+
if (relevanceDiff !== 0) return relevanceDiff;
|
|
399
|
+
}
|
|
400
|
+
if (sort === "downloads") return b.downloads - a.downloads;
|
|
401
|
+
if (sort === "newest") return Number(b.updatedAt) - Number(a.updatedAt);
|
|
402
|
+
return 0;
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
function publicPackageItem(row) {
|
|
406
|
+
const { searchScore: _searchScore, ...item } = row;
|
|
407
|
+
return item;
|
|
408
|
+
}
|
|
391
409
|
async function searchSkillHubLightmake(urls, query, limit, timeoutMs = 4e3) {
|
|
392
410
|
const q = query.trim().toLowerCase();
|
|
393
411
|
if (!q) return [];
|
|
@@ -665,12 +683,11 @@ const skillHubMarketplaceAdapter = {
|
|
|
665
683
|
}
|
|
666
684
|
}
|
|
667
685
|
rows = filterByCategory(rows, params.category);
|
|
668
|
-
|
|
669
|
-
else if (params.sort === "newest") rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
|
|
686
|
+
rows = sortSkillHubSearchRows(rows, params.sort);
|
|
670
687
|
const total = rows.length;
|
|
671
688
|
const start = (page - 1) * pageSize;
|
|
672
689
|
return {
|
|
673
|
-
items: rows.slice(start, start + pageSize),
|
|
690
|
+
items: rows.slice(start, start + pageSize).map(publicPackageItem),
|
|
674
691
|
meta: {
|
|
675
692
|
page,
|
|
676
693
|
pageSize,
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { registerMarketplaceAdapter } from "../../registry.js";
|
|
2
2
|
import { buildSkillMarkdownPreviewFromRaw } from "../../../skill-markdown-preview-from-raw.js";
|
|
3
|
-
import { downloadSkillZipBuffer, fetchMarketplacePackageDetail, listSkillPackages, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 } from "./store-api-client.js";
|
|
3
|
+
import { downloadSkillZipBuffer, fetchMarketplacePackageDetail, listSkillCategories, listSkillPackages, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 } from "./store-api-client.js";
|
|
4
4
|
//#region src/agent/skills/marketplace/adapters/store/adapter.ts
|
|
5
5
|
const storeMarketplaceAdapter = {
|
|
6
6
|
id: "store",
|
|
7
|
-
async listCategories(
|
|
8
|
-
return
|
|
7
|
+
async listCategories(config, options) {
|
|
8
|
+
return listSkillCategories(resolveSkillsStoreBaseUrl(config), options?.locale);
|
|
9
9
|
},
|
|
10
10
|
async listPackages(config, params) {
|
|
11
11
|
const response = await listSkillPackages(resolveSkillsStoreBaseUrl(config), params);
|
|
12
12
|
return {
|
|
13
|
-
items: response.items
|
|
13
|
+
items: response.items.map((item) => ({
|
|
14
|
+
...item,
|
|
15
|
+
categories: item.category ? [item.category] : []
|
|
16
|
+
})),
|
|
14
17
|
meta: response.meta,
|
|
15
18
|
provider: "store"
|
|
16
19
|
};
|
|
@@ -38,6 +38,8 @@ export interface SkillsStorePackageListItem {
|
|
|
38
38
|
};
|
|
39
39
|
latestVersion?: string;
|
|
40
40
|
updatedAt: string;
|
|
41
|
+
/** Stable primary category id from XOPC Store. */
|
|
42
|
+
category?: string | null;
|
|
41
43
|
/** Taxonomy / tags from the marketplace (adapter-specific). */
|
|
42
44
|
categories?: string[];
|
|
43
45
|
tags?: string[];
|
|
@@ -70,6 +72,7 @@ export declare function getStoreOrigin(baseUrl: string): string;
|
|
|
70
72
|
*/
|
|
71
73
|
export declare function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL;
|
|
72
74
|
export declare function listSkillPackages(storeBaseUrl: string, params: SkillsStoreListParams): Promise<SkillsStoreListResponse>;
|
|
75
|
+
export declare function listSkillCategories(storeBaseUrl: string, locale?: string): Promise<MarketplaceCategoryOption[]>;
|
|
73
76
|
/** Public connector catalog exposed by xopc-store. */
|
|
74
77
|
export declare function listConnectorPackages(storeBaseUrl: string, params: SkillsStoreListParams): Promise<SkillsStoreListResponse>;
|
|
75
78
|
/** GET /api/v1/packages/:name — published skill package (public). */
|
|
@@ -94,6 +94,12 @@ async function listSkillPackages(storeBaseUrl, params) {
|
|
|
94
94
|
if (params.category?.trim()) sp.set("category", params.category.trim());
|
|
95
95
|
return fetchJson(`${base}/api/v1/packages?${sp.toString()}`);
|
|
96
96
|
}
|
|
97
|
+
async function listSkillCategories(storeBaseUrl, locale) {
|
|
98
|
+
const base = normalizeBaseUrl(storeBaseUrl);
|
|
99
|
+
const sp = new URLSearchParams({ type: "skill" });
|
|
100
|
+
if (locale?.trim()) sp.set("locale", locale.trim());
|
|
101
|
+
return (await fetchJson(`${base}/api/v1/packages/categories?${sp.toString()}`)).items;
|
|
102
|
+
}
|
|
97
103
|
/** Public connector catalog exposed by xopc-store. */
|
|
98
104
|
async function listConnectorPackages(storeBaseUrl, params) {
|
|
99
105
|
const base = normalizeBaseUrl(storeBaseUrl);
|
|
@@ -224,4 +230,4 @@ function skillIdForMarketplaceInstall(packageName) {
|
|
|
224
230
|
return isValidSkillId(trimmed) ? trimmed : void 0;
|
|
225
231
|
}
|
|
226
232
|
//#endregion
|
|
227
|
-
export { MAX_EXTENSION_STORE_ZIP_BYTES, assertDownloadUrlAllowed, downloadConnectorStoreZipBuffer, downloadExtensionStoreZipBuffer, downloadSkillZipBuffer, fetchMarketplacePackageDetail, fetchStoreConnectorPackageDetail, getStoreOrigin, listConnectorPackages, listSkillPackages, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 };
|
|
233
|
+
export { MAX_EXTENSION_STORE_ZIP_BYTES, assertDownloadUrlAllowed, downloadConnectorStoreZipBuffer, downloadExtensionStoreZipBuffer, downloadSkillZipBuffer, fetchMarketplacePackageDetail, fetchStoreConnectorPackageDetail, getStoreOrigin, listConnectorPackages, listSkillCategories, listSkillPackages, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { Config } from '../../../config/schema.js';
|
|
2
|
-
export declare const SKILL_MARKETPLACE_SEARCH_SOURCES: readonly ["store", "clawhub", "skills-sh"];
|
|
2
|
+
export declare const SKILL_MARKETPLACE_SEARCH_SOURCES: readonly ["store", "skillhub", "clawhub", "skills-sh"];
|
|
3
3
|
export type SkillsMarketplaceSearchSource = (typeof SKILL_MARKETPLACE_SEARCH_SOURCES)[number];
|
|
4
4
|
export interface SkillsMarketplaceSearchResult {
|
|
5
5
|
id: string;
|
|
6
|
-
provider: 'store' | 'clawhub';
|
|
6
|
+
provider: 'store' | 'skillhub' | 'clawhub';
|
|
7
7
|
source: SkillsMarketplaceSearchSource;
|
|
8
8
|
name: string;
|
|
9
9
|
description: string;
|
|
@@ -3,6 +3,7 @@ import { listMarketplacePackages } from "../skills-marketplace.js";
|
|
|
3
3
|
//#region src/agent/skills/marketplace/search.ts
|
|
4
4
|
const SKILL_MARKETPLACE_SEARCH_SOURCES = [
|
|
5
5
|
"store",
|
|
6
|
+
"skillhub",
|
|
6
7
|
"clawhub",
|
|
7
8
|
"skills-sh"
|
|
8
9
|
];
|
|
@@ -94,6 +95,34 @@ function fromClawHub(item) {
|
|
|
94
95
|
valueScore: 0
|
|
95
96
|
};
|
|
96
97
|
}
|
|
98
|
+
function absoluteSkillHubUrl(slug) {
|
|
99
|
+
const normalized = slug.trim();
|
|
100
|
+
return normalized ? `https://skillhub.cn/skills/${encodeURIComponent(normalized)}` : null;
|
|
101
|
+
}
|
|
102
|
+
function fromMarketplacePackage(provider, item) {
|
|
103
|
+
return {
|
|
104
|
+
id: item.id,
|
|
105
|
+
provider,
|
|
106
|
+
source: provider,
|
|
107
|
+
name: item.name,
|
|
108
|
+
description: item.description,
|
|
109
|
+
author: item.author.username,
|
|
110
|
+
downloads: boundedNumber(item.downloads),
|
|
111
|
+
stars: boundedNumber(item.stars),
|
|
112
|
+
updatedAt: normalizeDate(item.updatedAt),
|
|
113
|
+
canonicalUrl: provider === "skillhub" ? absoluteSkillHubUrl(item.id) : null,
|
|
114
|
+
install: {
|
|
115
|
+
kind: provider,
|
|
116
|
+
reference: provider === "store" ? item.name : item.id,
|
|
117
|
+
sourceUrl: null
|
|
118
|
+
},
|
|
119
|
+
security: {
|
|
120
|
+
status: "unknown",
|
|
121
|
+
scanners: []
|
|
122
|
+
},
|
|
123
|
+
valueScore: 0
|
|
124
|
+
};
|
|
125
|
+
}
|
|
97
126
|
function dedupeAndRank(query, rows) {
|
|
98
127
|
const unique = /* @__PURE__ */ new Map();
|
|
99
128
|
for (const row of rows) {
|
|
@@ -121,36 +150,38 @@ async function searchSkillMarketplaces(params) {
|
|
|
121
150
|
pageSize: fetchLimit,
|
|
122
151
|
sort: "downloads"
|
|
123
152
|
}, "store");
|
|
124
|
-
for (const item of response.items) rows.push(
|
|
125
|
-
|
|
126
|
-
provider: "store",
|
|
153
|
+
for (const item of response.items) rows.push(fromMarketplacePackage("store", item));
|
|
154
|
+
statuses.push({
|
|
127
155
|
source: "store",
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
author: item.author.username,
|
|
131
|
-
downloads: boundedNumber(item.downloads),
|
|
132
|
-
stars: boundedNumber(item.stars),
|
|
133
|
-
updatedAt: normalizeDate(item.updatedAt),
|
|
134
|
-
canonicalUrl: null,
|
|
135
|
-
install: {
|
|
136
|
-
kind: "store",
|
|
137
|
-
reference: item.name,
|
|
138
|
-
sourceUrl: null
|
|
139
|
-
},
|
|
140
|
-
security: {
|
|
141
|
-
status: "unknown",
|
|
142
|
-
scanners: []
|
|
143
|
-
},
|
|
144
|
-
valueScore: 0
|
|
156
|
+
ok: true,
|
|
157
|
+
count: response.items.length
|
|
145
158
|
});
|
|
159
|
+
} catch (error) {
|
|
146
160
|
statuses.push({
|
|
147
161
|
source: "store",
|
|
162
|
+
ok: false,
|
|
163
|
+
count: 0,
|
|
164
|
+
error: String(error)
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
})());
|
|
168
|
+
if (requested.has("skillhub")) jobs.push((async () => {
|
|
169
|
+
try {
|
|
170
|
+
const response = await listMarketplacePackages(params.config, {
|
|
171
|
+
q: params.query,
|
|
172
|
+
page: 1,
|
|
173
|
+
pageSize: fetchLimit,
|
|
174
|
+
sort: "downloads"
|
|
175
|
+
}, "skillhub");
|
|
176
|
+
for (const item of response.items) rows.push(fromMarketplacePackage("skillhub", item));
|
|
177
|
+
statuses.push({
|
|
178
|
+
source: "skillhub",
|
|
148
179
|
ok: true,
|
|
149
180
|
count: response.items.length
|
|
150
181
|
});
|
|
151
182
|
} catch (error) {
|
|
152
183
|
statuses.push({
|
|
153
|
-
source: "
|
|
184
|
+
source: "skillhub",
|
|
154
185
|
ok: false,
|
|
155
186
|
count: 0,
|
|
156
187
|
error: String(error)
|
|
@@ -10,7 +10,7 @@ export { getMarketplaceAdapter, getMarketplaceProviderDisplayName, resolveSkills
|
|
|
10
10
|
export { registerMarketplaceAdapter } from './marketplace/registry.js';
|
|
11
11
|
export type { MarketplaceAdapterRegistration } from './marketplace/registry.js';
|
|
12
12
|
export type { MarketplaceCategoryOption, MarketplacePackageDetail, SkillsStoreListParams, SkillsStoreListResponse, UnifiedMarketplaceListResponse, UnifiedMarketplacePackageDetail, } from './marketplace/adapters/store/store-api-client.js';
|
|
13
|
-
export declare function listMarketplaceCategories(config: Config, provider?: string): Promise<{
|
|
13
|
+
export declare function listMarketplaceCategories(config: Config, provider?: string, locale?: string): Promise<{
|
|
14
14
|
items: MarketplaceCategoryOption[];
|
|
15
15
|
}>;
|
|
16
16
|
export declare function listMarketplacePackages(config: Config, params: SkillsStoreListParams, provider?: string): Promise<UnifiedMarketplaceListResponse>;
|