@xopcai/xopc 0.0.171 → 0.0.173
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-BLz30jWq.js → activity-store-ByVA0N5n.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BKZO0EFn.js → agent-avatar-dicebear-CJ5HvqE7.js} +1 -1
- package/dist/gateway/static/root/assets/agents--TQ9jM_1.js +2 -0
- package/dist/gateway/static/root/assets/{api-N2qKY-WI.js → api-BZtCKzg4.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CNZkpXCD.js → app-management-settings-panel-B0oNNcFn.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Drf5a563.js → appearance-settings-DbIj4NQ1.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BDsoZDEn.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-ChVwOXE5.js → archive-plugin-BICLQFWJ.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BVK3Y2d9.js → attachment-load-DV3PteSU.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-DH4N0SYR.js → automation-suggestion-card-CZUImis0.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-CHrNcppN.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CeHY6VVP.js → binary-plugins-D6zkab6N.js} +1 -1
- package/dist/gateway/static/root/assets/block-editor-zCzoQI-g.js +184 -0
- package/dist/gateway/static/root/assets/browser-settings-page-BQoRuQzH.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-femCtfpo.js → browser-workflow-inputs-CY3X83xQ.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-o0GVE_aF.js → browser-workflows-page-DDRtZLuM.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BOcU0qeM.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-Bx-JJC0R.js → capability-presets-api-pYLW6P7g.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CJ1F_hlX.js +1 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-CTw3ibx4.js → channel-recipient-api-DxyOH3BO.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-C4vDwRil.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-B0Pgq5x2.js +1 -0
- package/dist/gateway/static/root/assets/connector-logo-BgANwjt-.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-D6JEqDEj.js +2 -0
- package/dist/gateway/static/root/assets/desktop-pet-BPjQbPeA.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CIeH4VyP.js → desktop-pet-settings-8CaU1Mhm.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-Ddgt6c3K.js → directory-picker-path-field-BtNRUvzM.js} +1 -1
- package/dist/gateway/static/root/assets/dreaming-settings-Byv-h8XZ.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-CJGwUaQX.js → extension-debug-page-DFjTfx6f.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B3zHKJAB.js → extension-page-NyEYtWWg.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-Cj9rrSr1.js → extension-settings-page-BynTCfgf.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-BdmtlJRP.js → gateway-config-api-BzOWImvU.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-C2RwKIsl.js → gateway-settings-DXepE_Jw.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-mcMq_uu_.js → gateway-startup-retry-C2JXXtwg.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-5Ryd_rx4.js → goal-create-dialog-ClOZyG52.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-UbZB77De.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-CAO1J4jn.js → goals-config-api-CU3JR9MI.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-GMqV8Fwv.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-Boj2izKZ.js → goals-settings-DSZguLEx.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DbPC9a_y.js → heartbeat-settings-KRkYziEF.js} +1 -1
- package/dist/gateway/static/root/assets/{image-generation-api-DrLCLTXn.js → image-generation-api-Y-n6TaZ_.js} +1 -1
- package/dist/gateway/static/root/assets/index-BCkNJ5cR.css +1 -0
- package/dist/gateway/static/root/assets/{index-vHb2z7VS.js → index-CAZ9343h.js} +67 -67
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BrxfptgY.js → keyboard-shortcuts-settings-CwrQv952.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BP0_Ih0e.js → local-app-workbench-page-m5HEyrHT.js} +2 -2
- package/dist/gateway/static/root/assets/{local-apps-page-DNCRlfFs.js → local-apps-page-DtITcS4K.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-CzIfXqm8.js → locale-store-Ccv7tH8B.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Bf_nk75f.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-CIUH9Lor.js → markdown-split-D1oZlq1m.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DX4AgkCs.js → media-plugins-BKz5V32t.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-CKZuaOeG.js → messages-DWrg3c4K.js} +2 -2
- package/dist/gateway/static/root/assets/{notes-page-D1KprtxL.js → notes-page-DLekBQPa.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-BTDmprHM.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-DjZPJGf6.js → page-tabs-pT4nLfqS.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DNiJTpwZ.js → preview-open-alternatives-OtAiaJm2.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CNfR17-g.js → product-open-page-CfryBKD9.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-C7kntu4H.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-3ubcbqHr.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DoUkN3ik.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BGZFVO9S.js → save-bar-controls-nP1SB3Lf.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-BAZiHtds.js → schedule-field-OEQTsUNz.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CesBcwJH.js → schema-form-DIcAa7CJ.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-ElAAlZ-R.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CQn_KBqr.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-Bxc54BLj.js → settings-form-section-BxNcTbYO.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-CYrho7Db.js → settings-loading-skeleton-Dpdxu4sf.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-C03X5fkh.js → settings-page-DwPeOm1c.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-CZAJbv4E.js → settings-page-layout-CqirFmMn.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-Jv8_bcOD.js → setup-status-panel-DX_LdcTN.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-DSC7tKKG.js → share-preview-page-D72gYeux.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-nSfe-5xK.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-1tYpZrJf.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-BUJl8LJG.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BO89zw5H.js → system-settings-panel-U0tBgW46.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-1OkdVC8l.js → theme-store-DCKDVPFF.js} +1 -1
- package/dist/gateway/static/root/assets/time-picker-BpiBF5-d.js +1 -0
- package/dist/gateway/static/root/assets/{typed-models-lib-D-_vct_y.js → typed-models-lib-D0XCOCAM.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-VlFtjlET.js → use-channel-catalog-mq_Inao2.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-BOC6Hn19.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-BhDk-UV_.js → voice-api-key-field-CKaDitO6.js} +1 -1
- package/dist/gateway/static/root/assets/work-discovery-page-DWGYp5yV.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-CpeWcpSp.js +1 -0
- package/dist/gateway/static/root/assets/work-page-MsEKzmSt.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-uVw4Yoej.js → workflow-run-setup-panel-s_kS_FYA.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-ByhHaUHB.js +11 -0
- package/dist/gateway/static/root/index.html +7 -7
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +3 -1
- package/dist/src/agent/agent-manager.js +4 -3
- package/dist/src/agent/capabilities/definitions.d.ts +2 -1
- package/dist/src/agent/capabilities/definitions.js +3 -1
- package/dist/src/agent/memory/builtin-provider.js +4 -4
- package/dist/src/agent/memory/manager.d.ts +4 -1
- package/dist/src/agent/memory/manager.js +8 -3
- package/dist/src/agent/memory/understanding/service.d.ts +2 -0
- package/dist/src/agent/memory/understanding/service.js +11 -9
- package/dist/src/agent/prompt/sections/tooling.js +4 -0
- package/dist/src/agent/service.d.ts +3 -1
- package/dist/src/agent/service.js +29 -0
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/install-target.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.d.ts +64 -0
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +27 -18
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +1 -1
- package/dist/src/agent/skills/marketplace/search.d.ts +46 -0
- package/dist/src/agent/skills/marketplace/search.js +193 -0
- package/dist/src/agent/skills/skill-tool-gating.js +2 -1
- package/dist/src/agent/tools/delegate-tool.js +2 -0
- package/dist/src/agent/tools/factory.d.ts +4 -2
- package/dist/src/agent/tools/factory.js +11 -5
- package/dist/src/agent/tools/index.d.ts +2 -1
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/skill-install-tool.d.ts +17 -0
- package/dist/src/agent/tools/skill-install-tool.js +76 -8
- package/dist/src/agent/tools/skills-marketplace-search-tool.d.ts +17 -0
- package/dist/src/agent/tools/skills-marketplace-search-tool.js +77 -0
- package/dist/src/automations/domain/validation.d.ts +8 -8
- package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/capabilities/store-connector.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/connectors/composio-sessions.d.ts +1 -0
- package/dist/src/connectors/composio-sessions.js +14 -5
- package/dist/src/connectors/composio-triggers.d.ts +1 -1
- package/dist/src/connectors/composio-triggers.js +4 -3
- package/dist/src/connectors/composio.js +1 -0
- package/dist/src/connectors/{connector-memory-sync.d.ts → connected-source-ingestion.d.ts} +11 -4
- package/dist/src/connectors/{connector-memory-sync.js → connected-source-ingestion.js} +49 -101
- package/dist/src/connectors/connected-source-normalizers.d.ts +15 -0
- package/dist/src/connectors/connected-source-normalizers.js +186 -0
- package/dist/src/connectors/connector-identity.d.ts +2 -0
- package/dist/src/connectors/connector-identity.js +29 -0
- package/dist/src/connectors/learning-coordinator.d.ts +25 -0
- package/dist/src/connectors/learning-coordinator.js +214 -0
- package/dist/src/connectors/learning-recipes.d.ts +22 -0
- package/dist/src/connectors/learning-recipes.js +121 -0
- package/dist/src/connectors/runtime-status.d.ts +1 -8
- package/dist/src/connectors/runtime-status.js +4 -29
- package/dist/src/extensions/api.js +1 -1
- package/dist/src/extensions/install.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +2 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +2 -2
- package/dist/src/gateway/hono/routes/connectors.js +76 -118
- package/dist/src/gateway/hono/routes/local-apps.js +1 -1
- package/dist/src/gateway/hono/routes/models.js +24 -0
- package/dist/src/gateway/hono/routes/public-gateway.js +3 -2
- package/dist/src/gateway/hono/routes/you.js +86 -5
- package/dist/src/gateway/service/marketplace-service.js +1 -1
- package/dist/src/gateway/service.d.ts +5 -2
- package/dist/src/gateway/service.js +18 -13
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/knowledge/connected-understanding-pipeline.d.ts +19 -0
- package/dist/src/knowledge/connected-understanding-pipeline.js +268 -0
- package/dist/src/knowledge/index.d.ts +1 -0
- package/dist/src/knowledge/index.js +2 -1
- package/dist/src/knowledge/ingestion-service.d.ts +6 -4
- package/dist/src/knowledge/ingestion-service.js +13 -10
- package/dist/src/knowledge/local-folder-adapter.js +1 -0
- package/dist/src/knowledge/people-graph.js +43 -110
- package/dist/src/knowledge/types.d.ts +3 -0
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/providers/xopc-cloud-account-service.d.ts +40 -0
- package/dist/src/providers/xopc-cloud-account-service.js +65 -0
- package/dist/src/storage/sqlite/connector-learning-repository.d.ts +47 -0
- package/dist/src/storage/sqlite/connector-learning-repository.js +110 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -1
- package/dist/src/storage/sqlite/index.js +4 -2
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +4 -2
- package/dist/src/storage/sqlite/knowledge-repository.js +24 -13
- package/dist/src/storage/sqlite/migrations/062_connector_learning_jobs.sql +27 -0
- package/dist/src/storage/sqlite/migrations/063_knowledge_collection_scopes.sql +14 -0
- package/dist/src/storage/sqlite/migrations/064_user_claims.sql +60 -0
- package/dist/src/storage/sqlite/migrations/065_knowledge_item_scope_identity.sql +116 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/user-claims-repository.d.ts +101 -0
- package/dist/src/storage/sqlite/user-claims-repository.js +241 -0
- package/dist/src/user-context/projection.d.ts +36 -1
- package/dist/src/user-context/projection.js +84 -6
- package/dist/src/work-discovery/service.js +1 -0
- package/package.json +1 -1
- package/skills/tools/find-skills/SKILL.md +18 -428
- package/dist/gateway/static/root/assets/agents-ZCIC8mhO.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-DJmgBaAm.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-Ddot8-Md.js +0 -6
- package/dist/gateway/static/root/assets/block-editor-D3GIllO3.js +0 -184
- package/dist/gateway/static/root/assets/browser-settings-page-DvETvRcg.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-ChXIYbys.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUekXsJy.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CkhveNsQ.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DRTb8DBk.js +0 -1
- package/dist/gateway/static/root/assets/connector-logo-CQznQcd4.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DkSGIxWP.js +0 -2
- package/dist/gateway/static/root/assets/desktop-pet-BtP-xUQ9.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-gd9W6SLj.js +0 -3
- package/dist/gateway/static/root/assets/goal-detail-page-DizZ6Cpl.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-Dqry_hi2.js +0 -2
- package/dist/gateway/static/root/assets/index-DEdyUjxM.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-mT48mcF4.js +0 -7
- package/dist/gateway/static/root/assets/notes-workbench-wgt2Osyk.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CDjHvxJm.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-kJZwQXfC.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-MJdI9ek_.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BqC7GDC_.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CYwz8MfF.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-h8tGDkA3.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-D2DGvRUn.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-vqhjSMhZ.js +0 -2
- package/dist/gateway/static/root/assets/time-picker-mtD64kFB.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-BgF0WxjM.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-CP0Daig-.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-NEWZPKB_.js +0 -1
- package/dist/gateway/static/root/assets/work-page-BkWntcQh.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DRvhNQGe.js +0 -11
- package/dist/src/connectors/memory-sync-coordinator.d.ts +0 -28
- package/dist/src/connectors/memory-sync-coordinator.js +0 -162
- package/dist/src/connectors/memory-sync-profile.d.ts +0 -13
- package/dist/src/connectors/memory-sync-profile.js +0 -73
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=20260713-1" />
|
|
12
12
|
<link rel="manifest" href="/site.webmanifest?v=20260713-1" />
|
|
13
13
|
<title>XOPC — Turn goals into loops. Keep what matters moving.</title>
|
|
14
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
+
<script type="module" crossorigin src="/assets/index-CAZ9343h.js"></script>
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/vendor-react-BOUWij0V.js">
|
|
@@ -24,17 +24,17 @@
|
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/check-DUBLcKHA.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/circle-alert-BEjgurr2.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/middleware-Pd0e8Igk.js">
|
|
27
|
-
<link rel="modulepreload" crossorigin href="/assets/messages-
|
|
28
|
-
<link rel="modulepreload" crossorigin href="/assets/locale-store-
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/messages-DWrg3c4K.js">
|
|
28
|
+
<link rel="modulepreload" crossorigin href="/assets/locale-store-Ccv7tH8B.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/cn-JdwAhgNB.js">
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/assets/schemas-DgQq6Z5S.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/product-delivery-BTRT9kCS.js">
|
|
32
32
|
<link rel="modulepreload" crossorigin href="/assets/config-reload-event-Bjh2zoKp.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/copy-to-clipboard-HOJ79TWv.js">
|
|
34
|
-
<link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-
|
|
35
|
-
<link rel="modulepreload" crossorigin href="/assets/activity-store-
|
|
36
|
-
<link rel="modulepreload" crossorigin href="/assets/theme-store-
|
|
37
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
34
|
+
<link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-C2JXXtwg.js">
|
|
35
|
+
<link rel="modulepreload" crossorigin href="/assets/activity-store-ByVA0N5n.js">
|
|
36
|
+
<link rel="modulepreload" crossorigin href="/assets/theme-store-DCKDVPFF.js">
|
|
37
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BCkNJ5cR.css">
|
|
38
38
|
</head>
|
|
39
39
|
<body>
|
|
40
40
|
<div id="root"></div>
|
package/dist/package.js
CHANGED
|
@@ -9,7 +9,7 @@ import type { AgentInstanceGateway } from './agent-instance-gateway.js';
|
|
|
9
9
|
import { type Config } from '../config/schema.js';
|
|
10
10
|
import { type EffectiveAgentProfile } from '../config/agent-profile.js';
|
|
11
11
|
import type { ModelManager } from './models/manager.js';
|
|
12
|
-
import type { SkillInstallToolOptions, SkillInstallToolResult } from './tools/skill-install-tool.js';
|
|
12
|
+
import type { SkillInstallToolOptions, SkillInstallToolResult, MarketplaceSkillInstallToolOptions, MarketplaceSkillInstallToolResult } from './tools/skill-install-tool.js';
|
|
13
13
|
import { type AgentCapabilityCatalogEntry, type AgentCapabilitySessionState } from './capabilities/index.js';
|
|
14
14
|
import type { GatewayClarifyRequestFn } from './tools/clarify-tool.js';
|
|
15
15
|
import type { ExtensionRegistryImpl as ExtensionRegistry } from '../extensions/index.js';
|
|
@@ -98,6 +98,8 @@ export interface AgentManagerConfig {
|
|
|
98
98
|
}) => void;
|
|
99
99
|
/** Install a managed skill from an explicit source and refresh runtime state. */
|
|
100
100
|
installSkillFromSource?: (opts: SkillInstallToolOptions) => Promise<SkillInstallToolResult>;
|
|
101
|
+
/** Install a managed skill from Store or ClawHub and refresh runtime state. */
|
|
102
|
+
installSkillFromMarketplace?: (opts: MarketplaceSkillInstallToolOptions) => Promise<MarketplaceSkillInstallToolResult>;
|
|
101
103
|
/** Dynamic workspace verification context injected into the system prompt when edits are pending. */
|
|
102
104
|
getSelfVerifyPromptContext?: (sessionKey: string, agentId?: string) => string;
|
|
103
105
|
/**
|
|
@@ -18,6 +18,9 @@ import { resolveBootstrapContextSync } from "./bootstrap/bootstrap-files.js";
|
|
|
18
18
|
import { loadProjectAgentsContextFile } from "./bootstrap/project-agents-context.js";
|
|
19
19
|
import { createSkillConfigManager, isSkillEnabled, resolveSkillConfig } from "./skills/config.js";
|
|
20
20
|
import { resolveWorkspaceSkillsDir, resolveWorkspaceSkillsLockPath } from "./skills/workspace-skills-dir.js";
|
|
21
|
+
import { isValidSkillEnvVarName } from "./skills/required-env-vars.js";
|
|
22
|
+
import { loadSkillsLock } from "./skills/hub-lock.js";
|
|
23
|
+
import { isUnderManagedSkillsDir } from "./skills/managed-store.js";
|
|
21
24
|
import { isMemorySubsystemEnabled, shouldRegisterCuratedMemoryTool } from "./memory/memory-config.js";
|
|
22
25
|
import { resolveDreamingRoot } from "./memory/dreaming/scope.js";
|
|
23
26
|
import { createAgentCapabilitySessionState, resolveAgentCapabilityCatalog } from "./capabilities/registry.js";
|
|
@@ -27,9 +30,6 @@ import { parseMcpToolName } from "./mcp/bundle-mcp-policy.js";
|
|
|
27
30
|
import { disposeAllSessionMcpRuntimes, retireSessionMcpRuntimeForSessionKey } from "./mcp/bundle-mcp-runtime.js";
|
|
28
31
|
import "./mcp/bundle-mcp-tools.js";
|
|
29
32
|
import { evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner } from "./embedded/session-runner.js";
|
|
30
|
-
import { isValidSkillEnvVarName } from "./skills/required-env-vars.js";
|
|
31
|
-
import { loadSkillsLock } from "./skills/hub-lock.js";
|
|
32
|
-
import { isUnderManagedSkillsDir } from "./skills/managed-store.js";
|
|
33
33
|
import { UserContextCoordinator } from "./memory/user-context-coordinator.js";
|
|
34
34
|
import { WorkspaceRuntimeRegistry } from "./workspace-runtime/registry.js";
|
|
35
35
|
import { BackgroundReviewCoordinator } from "./background-review/coordinator.js";
|
|
@@ -262,6 +262,7 @@ var AgentManager = class {
|
|
|
262
262
|
for (const n of names) if (isValidSkillEnvVarName(n)) inst.skillEnvPassthroughKeys.add(n.trim());
|
|
263
263
|
},
|
|
264
264
|
installSkillFromSource: this.config.installSkillFromSource,
|
|
265
|
+
installSkillFromMarketplace: this.config.installSkillFromMarketplace,
|
|
265
266
|
getCodeIntelligenceRuntime: (workspace) => this.workspaceRuntimes.getOrCreate(workspace, resolveEffectiveAgentProfileForSession(this.config.config, this.config.getCurrentContext?.()?.sessionKey).agentId).codeIntelligence
|
|
266
267
|
};
|
|
267
268
|
}
|
|
@@ -113,7 +113,7 @@ export declare const AGENT_CAPABILITY_DEFINITIONS: readonly [{
|
|
|
113
113
|
readonly label: "Skill installation";
|
|
114
114
|
readonly description: "Find, install, and update xopc skills from explicit sources.";
|
|
115
115
|
readonly category: "authoring";
|
|
116
|
-
readonly tools: readonly ["skills_list", "skill_view", "skill_install"];
|
|
116
|
+
readonly tools: readonly ["skills_list", "skill_view", "skills_marketplace_search", "skill_install"];
|
|
117
117
|
readonly activation: {
|
|
118
118
|
readonly mode: "explicit";
|
|
119
119
|
readonly ttl: "turn";
|
|
@@ -121,6 +121,7 @@ export declare const AGENT_CAPABILITY_DEFINITIONS: readonly [{
|
|
|
121
121
|
readonly permissions: {
|
|
122
122
|
readonly writesFiles: true;
|
|
123
123
|
readonly usesNetwork: true;
|
|
124
|
+
readonly requiresConfirm: true;
|
|
124
125
|
};
|
|
125
126
|
}, {
|
|
126
127
|
readonly id: "visual-asset-authoring";
|
|
@@ -96,6 +96,7 @@ const AGENT_CAPABILITY_DEFINITIONS = [
|
|
|
96
96
|
tools: [
|
|
97
97
|
"skills_list",
|
|
98
98
|
"skill_view",
|
|
99
|
+
"skills_marketplace_search",
|
|
99
100
|
"skill_install"
|
|
100
101
|
],
|
|
101
102
|
activation: {
|
|
@@ -104,7 +105,8 @@ const AGENT_CAPABILITY_DEFINITIONS = [
|
|
|
104
105
|
},
|
|
105
106
|
permissions: {
|
|
106
107
|
writesFiles: true,
|
|
107
|
-
usesNetwork: true
|
|
108
|
+
usesNetwork: true,
|
|
109
|
+
requiresConfirm: true
|
|
108
110
|
}
|
|
109
111
|
},
|
|
110
112
|
{
|
|
@@ -170,8 +170,8 @@ var BuiltinMemoryProvider = class {
|
|
|
170
170
|
projectId: request.scope?.projectId,
|
|
171
171
|
content: request.content,
|
|
172
172
|
source: {
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
provider: this.id,
|
|
174
|
+
...request.source ?? {}
|
|
175
175
|
},
|
|
176
176
|
confidence: request.confidence,
|
|
177
177
|
tags: request.tags,
|
|
@@ -208,9 +208,9 @@ var BuiltinMemoryProvider = class {
|
|
|
208
208
|
sessionKey: request.scope?.sessionKey,
|
|
209
209
|
content: request.content,
|
|
210
210
|
source: {
|
|
211
|
-
...request.source ?? {},
|
|
212
211
|
provider: this.id,
|
|
213
|
-
path: sourcePathForTarget(target)
|
|
212
|
+
path: sourcePathForTarget(target),
|
|
213
|
+
...request.source ?? {}
|
|
214
214
|
},
|
|
215
215
|
tags: request.tags,
|
|
216
216
|
canonicalKey: request.canonicalKey,
|
|
@@ -53,9 +53,12 @@ export declare class MemoryManager {
|
|
|
53
53
|
applyUnderstandingCandidates(candidates: UnderstandingCandidate[], context?: {
|
|
54
54
|
agentId?: string;
|
|
55
55
|
sessionKey?: string;
|
|
56
|
+
sourceItemId?: string;
|
|
57
|
+
sourceItemIds?: string[];
|
|
56
58
|
sourceText?: string;
|
|
59
|
+
source?: MemoryRecord['source'];
|
|
57
60
|
reviewSource?: 'turn' | 'background';
|
|
58
|
-
}): Promise<
|
|
61
|
+
}): Promise<import('./understanding/types.js').UnderstandingReviewResult>;
|
|
59
62
|
getAdditionalTools(): AgentTool[];
|
|
60
63
|
handleToolCall(toolName: string, args: Record<string, unknown>): Promise<string>;
|
|
61
64
|
search(request: MemorySearchRequest): Promise<MemorySearchResult[]>;
|
|
@@ -130,13 +130,18 @@ var MemoryManager = class {
|
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
async applyUnderstandingCandidates(candidates, context = {}) {
|
|
133
|
-
const sourceItemId = context.sessionKey ? this.lastTurnSourceItem.get(context.sessionKey) : void 0;
|
|
134
|
-
await this.understanding.applyCandidates(candidates, {
|
|
133
|
+
const sourceItemId = context.sourceItemId ?? (context.sessionKey ? this.lastTurnSourceItem.get(context.sessionKey) : void 0);
|
|
134
|
+
const result = await this.understanding.applyCandidates(candidates, {
|
|
135
135
|
...context,
|
|
136
136
|
agentId: context.agentId ?? this.understandingAgentId,
|
|
137
137
|
sourceItemId
|
|
138
138
|
});
|
|
139
|
-
|
|
139
|
+
const sourceItemIds = [...new Set([...sourceItemId ? [sourceItemId] : [], ...context.sourceItemIds ?? []])];
|
|
140
|
+
if (sourceItemIds.length) setKnowledgeSourceItemSynthesisStatus(sourceItemIds, "completed");
|
|
141
|
+
return {
|
|
142
|
+
...result,
|
|
143
|
+
...sourceItemId ? { sourceItemId } : {}
|
|
144
|
+
};
|
|
140
145
|
}
|
|
141
146
|
getAdditionalTools() {
|
|
142
147
|
const out = [];
|
|
@@ -19,7 +19,9 @@ export declare class UserUnderstandingService {
|
|
|
19
19
|
agentId?: string;
|
|
20
20
|
sessionKey?: string;
|
|
21
21
|
sourceItemId?: string;
|
|
22
|
+
sourceItemIds?: string[];
|
|
22
23
|
sourceText?: string;
|
|
24
|
+
source?: MemoryRecord['source'];
|
|
23
25
|
reviewSource?: 'turn' | 'background';
|
|
24
26
|
supersedesRecordIds?: string[];
|
|
25
27
|
}): Promise<Omit<UnderstandingReviewResult, 'sourceItemId'>>;
|
|
@@ -92,6 +92,7 @@ var UserUnderstandingService = class {
|
|
|
92
92
|
const contentHash = createHash("sha256").update(sourceText).digest("hex");
|
|
93
93
|
const sourceItemId = upsertKnowledgeSourceItems([{
|
|
94
94
|
sourceInstanceId: params.sessionKey ? `session:${params.sessionKey}` : "session:unknown",
|
|
95
|
+
collectionScope: "conversation",
|
|
95
96
|
externalId: contentHash,
|
|
96
97
|
itemType: "conversation_turn",
|
|
97
98
|
authorRole: "user",
|
|
@@ -136,20 +137,21 @@ var UserUnderstandingService = class {
|
|
|
136
137
|
const key = candidate.canonicalKey ?? canonicalKey(candidate.kind, content);
|
|
137
138
|
const supersedesRecordId = correctionTargets.length === 1 ? correctionTargets[0] : void 0;
|
|
138
139
|
const existing = await this.options.list(key);
|
|
139
|
-
const
|
|
140
|
-
|
|
140
|
+
const sourceItemIds = [...new Set([...context.sourceItemId ? [context.sourceItemId] : [], ...context.sourceItemIds ?? []])];
|
|
141
|
+
const evidence = (sourceItemIds.length ? sourceItemIds : [void 0]).map((sourceItemId) => ({
|
|
142
|
+
...sourceItemId ? { sourceItemId } : {},
|
|
141
143
|
relation: "supports",
|
|
142
144
|
...context.sessionKey ? { sessionKey: context.sessionKey } : {},
|
|
143
145
|
...evidenceText ? { sourceText: evidenceText } : {},
|
|
144
146
|
observedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
145
147
|
confidence: candidate.confidence
|
|
146
|
-
};
|
|
148
|
+
}));
|
|
147
149
|
if (existing[0]) {
|
|
148
150
|
deduplicated += 1;
|
|
149
151
|
recordIds.push(existing[0].id);
|
|
150
|
-
|
|
152
|
+
for (const sourceItemId of sourceItemIds) attachMemoryEvidence({
|
|
151
153
|
recordId: existing[0].id,
|
|
152
|
-
sourceItemId
|
|
154
|
+
sourceItemId,
|
|
153
155
|
relation: "supports",
|
|
154
156
|
excerpt: evidenceText,
|
|
155
157
|
confidence: candidate.confidence
|
|
@@ -166,7 +168,7 @@ var UserUnderstandingService = class {
|
|
|
166
168
|
} : void 0,
|
|
167
169
|
target: candidate.kind === "preference" ? "user" : "memory",
|
|
168
170
|
tags: [...new Set(["user-understanding", ...candidate.tags ?? []])],
|
|
169
|
-
source: { provider: "user-understanding" },
|
|
171
|
+
source: context.source ?? { provider: "user-understanding" },
|
|
170
172
|
confidence: candidate.confidence,
|
|
171
173
|
status: "candidate",
|
|
172
174
|
sensitivity,
|
|
@@ -174,7 +176,7 @@ var UserUnderstandingService = class {
|
|
|
174
176
|
durability: candidate.durability,
|
|
175
177
|
importance: candidate.importance,
|
|
176
178
|
disclosurePolicy: candidate.disclosurePolicy,
|
|
177
|
-
evidence
|
|
179
|
+
evidence,
|
|
178
180
|
validFrom: candidate.validFrom,
|
|
179
181
|
validTo: candidate.validTo,
|
|
180
182
|
reviewAfter: nextMemoryReviewAt({
|
|
@@ -194,9 +196,9 @@ var UserUnderstandingService = class {
|
|
|
194
196
|
kind: write.record.kind
|
|
195
197
|
});
|
|
196
198
|
}
|
|
197
|
-
|
|
199
|
+
for (const sourceItemId of write.record ? sourceItemIds : []) attachMemoryEvidence({
|
|
198
200
|
recordId: write.record.id,
|
|
199
|
-
sourceItemId
|
|
201
|
+
sourceItemId,
|
|
200
202
|
relation: "supports",
|
|
201
203
|
excerpt: evidenceText,
|
|
202
204
|
confidence: candidate.confidence
|
|
@@ -31,6 +31,8 @@ const CORE_TOOL_ORDER = [
|
|
|
31
31
|
"skills_list",
|
|
32
32
|
"skill_view",
|
|
33
33
|
"skill_manage",
|
|
34
|
+
"skills_marketplace_search",
|
|
35
|
+
"skill_install",
|
|
34
36
|
"todo",
|
|
35
37
|
"clarify",
|
|
36
38
|
"text_to_speech",
|
|
@@ -71,6 +73,8 @@ const CORE_TOOL_SUMMARIES = {
|
|
|
71
73
|
skills_list: "List available skills",
|
|
72
74
|
skill_view: "Load a skill SKILL.md or sub-documents",
|
|
73
75
|
skill_manage: "Create or update skills on disk",
|
|
76
|
+
skills_marketplace_search: "Search and rank skills across Store, ClawHub, and skills.sh without installing",
|
|
77
|
+
skill_install: "Install a skill from an explicit Git, archive, file, or local source after confirmation",
|
|
74
78
|
todo: "Manage in-session todo items",
|
|
75
79
|
clarify: "Ask the user a blocking clarification question",
|
|
76
80
|
text_to_speech: "Send a standalone voice message",
|
|
@@ -10,7 +10,7 @@ import type { SkillMarkdownPreviewPayload } from './skills/types.js';
|
|
|
10
10
|
import type { AgentCapabilityCatalogEntry } from './capabilities/index.js';
|
|
11
11
|
import type { AgentServiceConfig, StreamHandle } from './service.types.js';
|
|
12
12
|
import { PersistentGoalService } from './goals/persistent-goal-service.js';
|
|
13
|
-
import type { SkillInstallToolOptions, SkillInstallToolResult } from './tools/skill-install-tool.js';
|
|
13
|
+
import type { SkillInstallToolOptions, SkillInstallToolResult, MarketplaceSkillInstallToolOptions, MarketplaceSkillInstallToolResult } from './tools/skill-install-tool.js';
|
|
14
14
|
import { type InboundAttachmentInput, type MediaRef } from '../channels/attachments/inbound-persist.js';
|
|
15
15
|
export type { AgentServiceConfig, AgentContext, StreamHandle } from './service.types.js';
|
|
16
16
|
export declare class AgentService {
|
|
@@ -114,9 +114,11 @@ export declare class AgentService {
|
|
|
114
114
|
getSkillMarkdownSource(skillName: string): SkillMarkdownPreviewPayload | null;
|
|
115
115
|
refreshSkillsAfterDiskChange(): void;
|
|
116
116
|
installSkillFromSource(opts: SkillInstallToolOptions): Promise<SkillInstallToolResult>;
|
|
117
|
+
installSkillFromMarketplace(opts: MarketplaceSkillInstallToolOptions): Promise<MarketplaceSkillInstallToolResult>;
|
|
117
118
|
refreshSkillsAfterSkillConfigChange(): void;
|
|
118
119
|
refreshActionTrustPolicy(): void;
|
|
119
120
|
refreshUserProfileContext(): void;
|
|
121
|
+
getMemoryManager(): import("./memory/manager.js").MemoryManager;
|
|
120
122
|
getModelForSession(sessionKey: string): string;
|
|
121
123
|
switchModelForSession(sessionKey: string, modelId: string): Promise<boolean>;
|
|
122
124
|
/**
|
|
@@ -10,6 +10,8 @@ import { extractTextContent } from "./context/workspace.js";
|
|
|
10
10
|
import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
|
|
11
11
|
import { getProjectForSession } from "../projects/workspace.js";
|
|
12
12
|
import { resolveWorkspaceSkillsDir, resolveWorkspaceSkillsLockPath } from "./skills/workspace-skills-dir.js";
|
|
13
|
+
import { removeSkillsLockEntry } from "./skills/hub-lock.js";
|
|
14
|
+
import { installSkillFromZip } from "./skills/managed-store.js";
|
|
13
15
|
import { normalizeSkillInstallTarget } from "./skills/install-target.js";
|
|
14
16
|
import { onSessionTranscriptUpdate } from "../session/transcript-events.js";
|
|
15
17
|
import { persistInboundAttachments } from "../channels/attachments/inbound-persist.js";
|
|
@@ -246,6 +248,7 @@ var AgentService = class {
|
|
|
246
248
|
getWorkflowRunService: config.getWorkflowRunService,
|
|
247
249
|
onSkillsUpdated: config.onSkillsUpdated,
|
|
248
250
|
installSkillFromSource: (opts) => this.installSkillFromSource(opts),
|
|
251
|
+
installSkillFromMarketplace: (opts) => this.installSkillFromMarketplace(opts),
|
|
249
252
|
isWorkspaceTrusted: config.isWorkspaceTrusted,
|
|
250
253
|
getSelfVerifyPromptContext: (sessionKey, agentId) => [this.selfVerifyMiddleware.getPendingVerificationContext(sessionKey, agentId), this.turnDiffTracker.buildFinalGuardContext(sessionKey)].filter(Boolean).join("\n\n")
|
|
251
254
|
});
|
|
@@ -547,6 +550,29 @@ var AgentService = class {
|
|
|
547
550
|
target
|
|
548
551
|
};
|
|
549
552
|
}
|
|
553
|
+
async installSkillFromMarketplace(opts) {
|
|
554
|
+
const config = this.effectiveAppConfig();
|
|
555
|
+
const target = normalizeSkillInstallTarget(opts.target);
|
|
556
|
+
const workspace = (opts.sessionKey ? this.agentManager.getResolvedWorkspaceForSession(opts.sessionKey) : void 0) || this.workspaceDir;
|
|
557
|
+
const rootDir = target === "workspace" ? resolveWorkspaceSkillsDir(workspace) : void 0;
|
|
558
|
+
const lockPath = target === "workspace" ? resolveWorkspaceSkillsLockPath(workspace) : void 0;
|
|
559
|
+
const { downloadFromMarketplace } = await import("./skills/skills-marketplace.js");
|
|
560
|
+
const downloaded = await downloadFromMarketplace(config, opts.name, opts.version, opts.provider);
|
|
561
|
+
const result = installSkillFromZip(downloaded.buffer, {
|
|
562
|
+
skillId: downloaded.skillId,
|
|
563
|
+
overwrite: opts.force ?? false,
|
|
564
|
+
rootDir
|
|
565
|
+
});
|
|
566
|
+
removeSkillsLockEntry(result.skillId, lockPath);
|
|
567
|
+
this.refreshSkillsAfterDiskChange();
|
|
568
|
+
return {
|
|
569
|
+
...result,
|
|
570
|
+
provider: opts.provider,
|
|
571
|
+
name: opts.name,
|
|
572
|
+
version: downloaded.version,
|
|
573
|
+
target
|
|
574
|
+
};
|
|
575
|
+
}
|
|
550
576
|
refreshSkillsAfterSkillConfigChange() {
|
|
551
577
|
this.agentManager.refreshSkillsAfterSkillConfigChange();
|
|
552
578
|
}
|
|
@@ -556,6 +582,9 @@ var AgentService = class {
|
|
|
556
582
|
refreshUserProfileContext() {
|
|
557
583
|
this.agentManager.refreshUserProfileContext();
|
|
558
584
|
}
|
|
585
|
+
getMemoryManager() {
|
|
586
|
+
return this.agentManager.getMemoryManager();
|
|
587
|
+
}
|
|
559
588
|
getModelForSession(sessionKey) {
|
|
560
589
|
return this.modelManager.getModelForSession(sessionKey);
|
|
561
590
|
}
|
|
@@ -8,8 +8,8 @@ import { basename, dirname, join, normalize, resolve, sep } from "node:path";
|
|
|
8
8
|
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
10
10
|
import { execFileSync } from "node:child_process";
|
|
11
|
-
import { fetch } from "undici";
|
|
12
11
|
import AdmZip from "adm-zip";
|
|
12
|
+
import { fetch } from "undici";
|
|
13
13
|
//#region src/agent/skills/hub-pull.ts
|
|
14
14
|
/**
|
|
15
15
|
* CLI / hub: install or update skills from git or archive (zip / tar.gz) into ~/.xopc/skills.
|
|
@@ -9,8 +9,8 @@ import { collectSkillInstallWarnings, formatScanSummary, scanSkillDirectory } fr
|
|
|
9
9
|
import { resolveWorkspaceSkillsDir } from "./workspace-skills-dir.js";
|
|
10
10
|
import { parseSkillToolConditions } from "./skill-tool-gating.js";
|
|
11
11
|
import { parseRequiredEnvVarNames } from "./required-env-vars.js";
|
|
12
|
-
import { formatSkillsForPrompt } from "./format-skills-prompt.js";
|
|
13
12
|
import { parseSkillMetadata } from "./parse-skill-metadata.js";
|
|
13
|
+
import { formatSkillsForPrompt } from "./format-skills-prompt.js";
|
|
14
14
|
import { SkillTestFramework, SkillTestRunner, formatTestResults, formatTestResultsJson, formatTestResultsTap } from "./test-framework.js";
|
|
15
15
|
import { basename, dirname, join, relative, sep } from "path";
|
|
16
16
|
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/agent/skills/install-target.ts
|
|
2
2
|
function normalizeSkillInstallTarget(value) {
|
|
3
|
-
return value === "
|
|
3
|
+
return value === "workspace" ? "workspace" : "global";
|
|
4
4
|
}
|
|
5
5
|
function isSkillInstallTarget(value) {
|
|
6
6
|
return value === "workspace" || value === "global";
|
|
@@ -2,4 +2,68 @@
|
|
|
2
2
|
* ClawHub (clawhub.ai) skills marketplace adapter.
|
|
3
3
|
*/
|
|
4
4
|
import type { SkillsMarketplaceAdapter } from '../../adapter.types.js';
|
|
5
|
+
export interface ClawHubSearchResultItem {
|
|
6
|
+
id?: string;
|
|
7
|
+
score?: number;
|
|
8
|
+
slug: string;
|
|
9
|
+
source?: string;
|
|
10
|
+
downloads?: number;
|
|
11
|
+
canonicalUrl?: string;
|
|
12
|
+
install?: {
|
|
13
|
+
kind?: string;
|
|
14
|
+
reference?: string;
|
|
15
|
+
sourceUrl?: string | null;
|
|
16
|
+
};
|
|
17
|
+
links?: {
|
|
18
|
+
canonical?: string | null;
|
|
19
|
+
source?: string | null;
|
|
20
|
+
};
|
|
21
|
+
sourceIdentity?: {
|
|
22
|
+
owner?: string | null;
|
|
23
|
+
repo?: string | null;
|
|
24
|
+
};
|
|
25
|
+
publisher?: {
|
|
26
|
+
handle?: string | null;
|
|
27
|
+
displayName?: string | null;
|
|
28
|
+
avatarUrl?: string | null;
|
|
29
|
+
};
|
|
30
|
+
metrics?: {
|
|
31
|
+
bookmarks?: number;
|
|
32
|
+
updatedAt?: number;
|
|
33
|
+
};
|
|
34
|
+
trust?: {
|
|
35
|
+
clawHubVerdict?: string | null;
|
|
36
|
+
installability?: string | null;
|
|
37
|
+
upstreamScanners?: Record<string, {
|
|
38
|
+
status?: string | null;
|
|
39
|
+
sourceCheckedAt?: string | null;
|
|
40
|
+
sourceUrl?: string | null;
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
43
|
+
native?: {
|
|
44
|
+
skill?: {
|
|
45
|
+
stats?: {
|
|
46
|
+
downloads?: number;
|
|
47
|
+
stars?: number;
|
|
48
|
+
};
|
|
49
|
+
tags?: Record<string, string>;
|
|
50
|
+
categories?: string[];
|
|
51
|
+
};
|
|
52
|
+
} | null;
|
|
53
|
+
displayName?: string;
|
|
54
|
+
summary?: string;
|
|
55
|
+
version?: string | null;
|
|
56
|
+
updatedAt?: number;
|
|
57
|
+
ownerHandle?: string;
|
|
58
|
+
owner?: {
|
|
59
|
+
handle: string;
|
|
60
|
+
displayName: string;
|
|
61
|
+
image: string | null;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export interface ClawHubSearchResponse {
|
|
65
|
+
results: ClawHubSearchResultItem[];
|
|
66
|
+
}
|
|
67
|
+
/** Public federated search used by the read-only marketplace discovery tool. */
|
|
68
|
+
export declare function searchClawHubFederatedSkills(query: string, limit?: number): Promise<ClawHubSearchResponse>;
|
|
5
69
|
export declare const clawHubMarketplaceAdapter: SkillsMarketplaceAdapter;
|
|
@@ -53,6 +53,10 @@ async function searchClawHubSkills(query, limit) {
|
|
|
53
53
|
assertOk(res, "search");
|
|
54
54
|
return await res.json();
|
|
55
55
|
}
|
|
56
|
+
/** Public federated search used by the read-only marketplace discovery tool. */
|
|
57
|
+
async function searchClawHubFederatedSkills(query, limit) {
|
|
58
|
+
return cachedSearchClawHubSkills(query, limit);
|
|
59
|
+
}
|
|
56
60
|
async function getClawHubSkillDetail(slug) {
|
|
57
61
|
const res = await clawHubFetch(`/api/v1/skills/${encodeURIComponent(slug.trim())}`);
|
|
58
62
|
assertOk(res, `skill detail [${slug}]`);
|
|
@@ -73,10 +77,15 @@ async function getClawHubSkillFileText(slug, filePath, version) {
|
|
|
73
77
|
const text = await res.text();
|
|
74
78
|
return text.length > MAX_CLAWHUB_FILE_BYTES ? text.slice(0, MAX_CLAWHUB_FILE_BYTES) : text;
|
|
75
79
|
}
|
|
76
|
-
async function downloadClawHubSkillZip(
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
+
async function downloadClawHubSkillZip(reference, version) {
|
|
81
|
+
const parts = reference.trim().replace(/^@/, "").split("/").filter(Boolean);
|
|
82
|
+
const ownerHandle = parts.length === 2 ? parts[0] : void 0;
|
|
83
|
+
const slug = parts.length === 2 ? parts[1] : parts.length === 1 ? parts[0] : "";
|
|
84
|
+
if (!isValidSkillId(slug) || ownerHandle && !isValidSkillId(ownerHandle)) throw new Error(`Invalid ClawHub install reference: ${reference}`);
|
|
85
|
+
const sp = new URLSearchParams({ slug });
|
|
86
|
+
if (ownerHandle) sp.set("ownerHandle", ownerHandle);
|
|
87
|
+
if (version?.trim()) sp.set("version", version.trim());
|
|
88
|
+
const url = `${resolveClawHubBaseUrl()}/api/v1/download?${sp.toString()}`;
|
|
80
89
|
const res = await fetch(url, { redirect: "follow" });
|
|
81
90
|
if (!res.ok) {
|
|
82
91
|
const body = await res.text().catch(() => "");
|
|
@@ -88,7 +97,8 @@ async function downloadClawHubSkillZip(slug, version) {
|
|
|
88
97
|
if (arrayBuf.byteLength > MAX_SKILL_ZIP_BYTES) throw new Error(`ClawHub download [${slug}] exceeds size limit (${arrayBuf.byteLength} > ${MAX_SKILL_ZIP_BYTES})`);
|
|
89
98
|
return {
|
|
90
99
|
buffer: Buffer.from(arrayBuf),
|
|
91
|
-
version: version?.trim() || "latest"
|
|
100
|
+
version: version?.trim() || "latest",
|
|
101
|
+
slug
|
|
92
102
|
};
|
|
93
103
|
}
|
|
94
104
|
function pickClawHubDocFilePath(files) {
|
|
@@ -192,20 +202,20 @@ function convertListItemToPackageItem(item) {
|
|
|
192
202
|
}
|
|
193
203
|
function convertSearchResultToPackageItem(item, enrichment) {
|
|
194
204
|
return {
|
|
195
|
-
id: item.slug,
|
|
205
|
+
id: item.id ?? item.install?.reference ?? item.slug,
|
|
196
206
|
name: item.displayName || item.slug,
|
|
197
207
|
type: "skill",
|
|
198
208
|
description: item.summary || "",
|
|
199
|
-
downloads: enrichment?.stats.downloads ?? 0,
|
|
209
|
+
downloads: item.downloads ?? item.native?.skill?.stats?.downloads ?? enrichment?.stats.downloads ?? 0,
|
|
200
210
|
author: {
|
|
201
|
-
username: item.owner?.handle ?? item.ownerHandle ?? "clawhub",
|
|
202
|
-
avatarUrl: item.owner?.image ?? null
|
|
211
|
+
username: item.publisher?.handle ?? item.sourceIdentity?.owner ?? item.owner?.handle ?? item.ownerHandle ?? "clawhub",
|
|
212
|
+
avatarUrl: item.publisher?.avatarUrl ?? item.owner?.image ?? null
|
|
203
213
|
},
|
|
204
214
|
latestVersion: item.version ?? enrichment?.latestVersion?.version ?? "1.0.0",
|
|
205
|
-
updatedAt: String(item.updatedAt),
|
|
206
|
-
categories: enrichment?.metadata?.os ?? [],
|
|
207
|
-
stars: enrichment?.stats.stars ?? 0,
|
|
208
|
-
sourceLabel: "ClawHub"
|
|
215
|
+
updatedAt: String(item.metrics?.updatedAt ?? item.updatedAt ?? ""),
|
|
216
|
+
categories: item.native?.skill?.categories ?? enrichment?.metadata?.os ?? [],
|
|
217
|
+
stars: item.native?.skill?.stats?.stars ?? item.metrics?.bookmarks ?? enrichment?.stats.stars ?? 0,
|
|
218
|
+
sourceLabel: item.source === "skills-sh" ? "skills.sh" : "ClawHub"
|
|
209
219
|
};
|
|
210
220
|
}
|
|
211
221
|
function mapSortParam(sort) {
|
|
@@ -230,7 +240,7 @@ const clawHubMarketplaceAdapter = {
|
|
|
230
240
|
if (searchResponse.status === "rejected") throw searchResponse.reason;
|
|
231
241
|
const enrichmentBySlug = /* @__PURE__ */ new Map();
|
|
232
242
|
if (listSettled.status === "fulfilled") for (const it of listSettled.value.items) enrichmentBySlug.set(it.slug, it);
|
|
233
|
-
let rows = searchResponse.value.results.map((r) => convertSearchResultToPackageItem(r, enrichmentBySlug.get(r.slug)));
|
|
243
|
+
let rows = searchResponse.value.results.filter((r) => !r.source || r.source === "clawhub").map((r) => convertSearchResultToPackageItem(r, enrichmentBySlug.get(r.slug)));
|
|
234
244
|
if (params.sort === "downloads") rows = [...rows].sort((a, b) => b.downloads - a.downloads);
|
|
235
245
|
else if (params.sort === "newest") rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
|
|
236
246
|
const total = rows.length;
|
|
@@ -304,11 +314,10 @@ const clawHubMarketplaceAdapter = {
|
|
|
304
314
|
};
|
|
305
315
|
},
|
|
306
316
|
async downloadPackage(_config, packageName, version) {
|
|
307
|
-
const
|
|
308
|
-
const result = await downloadClawHubSkillZip(slug, version);
|
|
317
|
+
const result = await downloadClawHubSkillZip(packageName, version);
|
|
309
318
|
return {
|
|
310
319
|
buffer: result.buffer,
|
|
311
|
-
skillId:
|
|
320
|
+
skillId: result.slug,
|
|
312
321
|
version: result.version
|
|
313
322
|
};
|
|
314
323
|
}
|
|
@@ -318,4 +327,4 @@ registerMarketplaceAdapter({
|
|
|
318
327
|
displayName: "ClawHub"
|
|
319
328
|
});
|
|
320
329
|
//#endregion
|
|
321
|
-
export { clawHubMarketplaceAdapter };
|
|
330
|
+
export { clawHubMarketplaceAdapter, searchClawHubFederatedSkills };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { registerMarketplaceAdapter } from "../../registry.js";
|
|
2
|
-
import { downloadSkillZipBuffer, fetchMarketplacePackageDetail, listSkillPackages, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 } from "./store-api-client.js";
|
|
3
2
|
import { buildSkillMarkdownPreviewFromRaw } from "../../../skill-markdown-preview-from-raw.js";
|
|
3
|
+
import { downloadSkillZipBuffer, fetchMarketplacePackageDetail, 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",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MAX_SKILL_ZIP_BYTES, isValidSkillId } from "../../../managed-store.js";
|
|
2
1
|
import { MAX_EXTENSION_STORE_ZIP_BYTES } from "../../../../../extensions/store-zip-limits.js";
|
|
2
|
+
import { MAX_SKILL_ZIP_BYTES, isValidSkillId } from "../../../managed-store.js";
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
4
|
//#region src/agent/skills/marketplace/adapters/store/store-api-client.ts
|
|
5
5
|
/**
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Config } from '../../../config/schema.js';
|
|
2
|
+
export declare const SKILL_MARKETPLACE_SEARCH_SOURCES: readonly ["store", "clawhub", "skills-sh"];
|
|
3
|
+
export type SkillsMarketplaceSearchSource = (typeof SKILL_MARKETPLACE_SEARCH_SOURCES)[number];
|
|
4
|
+
export interface SkillsMarketplaceSearchResult {
|
|
5
|
+
id: string;
|
|
6
|
+
provider: 'store' | 'clawhub';
|
|
7
|
+
source: SkillsMarketplaceSearchSource;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
author: string;
|
|
11
|
+
downloads: number;
|
|
12
|
+
stars: number;
|
|
13
|
+
updatedAt: string | null;
|
|
14
|
+
canonicalUrl: string | null;
|
|
15
|
+
install: {
|
|
16
|
+
kind: string;
|
|
17
|
+
reference: string;
|
|
18
|
+
sourceUrl: string | null;
|
|
19
|
+
};
|
|
20
|
+
security: {
|
|
21
|
+
status: 'pass' | 'warn' | 'fail' | 'unknown';
|
|
22
|
+
scanners: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
status: 'pass' | 'warn' | 'fail' | 'unknown';
|
|
25
|
+
checkedAt: string | null;
|
|
26
|
+
url: string | null;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
valueScore: number;
|
|
30
|
+
}
|
|
31
|
+
export interface SkillMarketplaceSourceStatus {
|
|
32
|
+
source: SkillsMarketplaceSearchSource;
|
|
33
|
+
ok: boolean;
|
|
34
|
+
count: number;
|
|
35
|
+
via?: 'clawhub';
|
|
36
|
+
error?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function searchSkillMarketplaces(params: {
|
|
39
|
+
config: Config;
|
|
40
|
+
query: string;
|
|
41
|
+
sources?: SkillsMarketplaceSearchSource[];
|
|
42
|
+
limit?: number;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
results: SkillsMarketplaceSearchResult[];
|
|
45
|
+
sources: SkillMarketplaceSourceStatus[];
|
|
46
|
+
}>;
|