@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.
Files changed (228) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-BLz30jWq.js → activity-store-ByVA0N5n.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BKZO0EFn.js → agent-avatar-dicebear-CJ5HvqE7.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents--TQ9jM_1.js +2 -0
  6. package/dist/gateway/static/root/assets/{api-N2qKY-WI.js → api-BZtCKzg4.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-CNZkpXCD.js → app-management-settings-panel-B0oNNcFn.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-Drf5a563.js → appearance-settings-DbIj4NQ1.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-BDsoZDEn.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-ChVwOXE5.js → archive-plugin-BICLQFWJ.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-BVK3Y2d9.js → attachment-load-DV3PteSU.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automation-suggestion-card-DH4N0SYR.js → automation-suggestion-card-CZUImis0.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-page-CHrNcppN.js +6 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-CeHY6VVP.js → binary-plugins-D6zkab6N.js} +1 -1
  15. package/dist/gateway/static/root/assets/block-editor-zCzoQI-g.js +184 -0
  16. package/dist/gateway/static/root/assets/browser-settings-page-BQoRuQzH.js +8 -0
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-femCtfpo.js → browser-workflow-inputs-CY3X83xQ.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-o0GVE_aF.js → browser-workflows-page-DDRtZLuM.js} +2 -2
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-BOcU0qeM.js +7 -0
  20. package/dist/gateway/static/root/assets/{capability-presets-api-Bx-JJC0R.js → capability-presets-api-pYLW6P7g.js} +1 -1
  21. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CJ1F_hlX.js +1 -0
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-CTw3ibx4.js → channel-recipient-api-DxyOH3BO.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-settings-C4vDwRil.js +1 -0
  24. package/dist/gateway/static/root/assets/channels-status-swr-B0Pgq5x2.js +1 -0
  25. package/dist/gateway/static/root/assets/connector-logo-BgANwjt-.js +1 -0
  26. package/dist/gateway/static/root/assets/connectors-page-D6JEqDEj.js +2 -0
  27. package/dist/gateway/static/root/assets/desktop-pet-BPjQbPeA.js +1 -0
  28. package/dist/gateway/static/root/assets/{desktop-pet-settings-CIeH4VyP.js → desktop-pet-settings-8CaU1Mhm.js} +1 -1
  29. package/dist/gateway/static/root/assets/{directory-picker-path-field-Ddgt6c3K.js → directory-picker-path-field-BtNRUvzM.js} +1 -1
  30. package/dist/gateway/static/root/assets/dreaming-settings-Byv-h8XZ.js +3 -0
  31. package/dist/gateway/static/root/assets/{extension-debug-page-CJGwUaQX.js → extension-debug-page-DFjTfx6f.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-page-B3zHKJAB.js → extension-page-NyEYtWWg.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-settings-page-Cj9rrSr1.js → extension-settings-page-BynTCfgf.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-BdmtlJRP.js → gateway-config-api-BzOWImvU.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-settings-C2RwKIsl.js → gateway-settings-DXepE_Jw.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-mcMq_uu_.js → gateway-startup-retry-C2JXXtwg.js} +1 -1
  37. package/dist/gateway/static/root/assets/{goal-create-dialog-5Ryd_rx4.js → goal-create-dialog-ClOZyG52.js} +1 -1
  38. package/dist/gateway/static/root/assets/goal-detail-page-UbZB77De.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-CAO1J4jn.js → goals-config-api-CU3JR9MI.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-GMqV8Fwv.js +2 -0
  41. package/dist/gateway/static/root/assets/{goals-settings-Boj2izKZ.js → goals-settings-DSZguLEx.js} +1 -1
  42. package/dist/gateway/static/root/assets/{heartbeat-settings-DbPC9a_y.js → heartbeat-settings-KRkYziEF.js} +1 -1
  43. package/dist/gateway/static/root/assets/{image-generation-api-DrLCLTXn.js → image-generation-api-Y-n6TaZ_.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-BCkNJ5cR.css +1 -0
  45. package/dist/gateway/static/root/assets/{index-vHb2z7VS.js → index-CAZ9343h.js} +67 -67
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BrxfptgY.js → keyboard-shortcuts-settings-CwrQv952.js} +1 -1
  47. package/dist/gateway/static/root/assets/{local-app-workbench-page-BP0_Ih0e.js → local-app-workbench-page-m5HEyrHT.js} +2 -2
  48. package/dist/gateway/static/root/assets/{local-apps-page-DNCRlfFs.js → local-apps-page-DtITcS4K.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-CzIfXqm8.js → locale-store-Ccv7tH8B.js} +1 -1
  50. package/dist/gateway/static/root/assets/logs-page-Bf_nk75f.js +7 -0
  51. package/dist/gateway/static/root/assets/{markdown-split-CIUH9Lor.js → markdown-split-D1oZlq1m.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-DX4AgkCs.js → media-plugins-BKz5V32t.js} +1 -1
  53. package/dist/gateway/static/root/assets/{messages-CKZuaOeG.js → messages-DWrg3c4K.js} +2 -2
  54. package/dist/gateway/static/root/assets/{notes-page-D1KprtxL.js → notes-page-DLekBQPa.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-BTDmprHM.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-DjZPJGf6.js → page-tabs-pT4nLfqS.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-DNiJTpwZ.js → preview-open-alternatives-OtAiaJm2.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-CNfR17-g.js → product-open-page-CfryBKD9.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-C7kntu4H.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-3ubcbqHr.js +1 -0
  61. package/dist/gateway/static/root/assets/remote-access-hub-DoUkN3ik.js +1 -0
  62. package/dist/gateway/static/root/assets/{save-bar-controls-BGZFVO9S.js → save-bar-controls-nP1SB3Lf.js} +1 -1
  63. package/dist/gateway/static/root/assets/{schedule-field-BAZiHtds.js → schedule-field-OEQTsUNz.js} +1 -1
  64. package/dist/gateway/static/root/assets/{schema-form-CesBcwJH.js → schema-form-DIcAa7CJ.js} +1 -1
  65. package/dist/gateway/static/root/assets/sessions-page-ElAAlZ-R.js +1 -0
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-CQn_KBqr.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-Bxc54BLj.js → settings-form-section-BxNcTbYO.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-loading-skeleton-CYrho7Db.js → settings-loading-skeleton-Dpdxu4sf.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-page-C03X5fkh.js → settings-page-DwPeOm1c.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-layout-CZAJbv4E.js → settings-page-layout-CqirFmMn.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-Jv8_bcOD.js → setup-status-panel-DX_LdcTN.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-DSC7tKKG.js → share-preview-page-D72gYeux.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-nSfe-5xK.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-1tYpZrJf.js +1 -0
  75. package/dist/gateway/static/root/assets/skills-page-BUJl8LJG.js +2 -0
  76. package/dist/gateway/static/root/assets/{system-settings-panel-BO89zw5H.js → system-settings-panel-U0tBgW46.js} +1 -1
  77. package/dist/gateway/static/root/assets/{theme-store-1OkdVC8l.js → theme-store-DCKDVPFF.js} +1 -1
  78. package/dist/gateway/static/root/assets/time-picker-BpiBF5-d.js +1 -0
  79. package/dist/gateway/static/root/assets/{typed-models-lib-D-_vct_y.js → typed-models-lib-D0XCOCAM.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-channel-catalog-VlFtjlET.js → use-channel-catalog-mq_Inao2.js} +1 -1
  81. package/dist/gateway/static/root/assets/user-context-page-BOC6Hn19.js +1 -0
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-BhDk-UV_.js → voice-api-key-field-CKaDitO6.js} +1 -1
  83. package/dist/gateway/static/root/assets/work-discovery-page-DWGYp5yV.js +1 -0
  84. package/dist/gateway/static/root/assets/work-item-detail-page-CpeWcpSp.js +1 -0
  85. package/dist/gateway/static/root/assets/work-page-MsEKzmSt.js +1 -0
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-uVw4Yoej.js → workflow-run-setup-panel-s_kS_FYA.js} +2 -2
  87. package/dist/gateway/static/root/assets/workflows-page-ByhHaUHB.js +11 -0
  88. package/dist/gateway/static/root/index.html +7 -7
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.d.ts +3 -1
  91. package/dist/src/agent/agent-manager.js +4 -3
  92. package/dist/src/agent/capabilities/definitions.d.ts +2 -1
  93. package/dist/src/agent/capabilities/definitions.js +3 -1
  94. package/dist/src/agent/memory/builtin-provider.js +4 -4
  95. package/dist/src/agent/memory/manager.d.ts +4 -1
  96. package/dist/src/agent/memory/manager.js +8 -3
  97. package/dist/src/agent/memory/understanding/service.d.ts +2 -0
  98. package/dist/src/agent/memory/understanding/service.js +11 -9
  99. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  100. package/dist/src/agent/service.d.ts +3 -1
  101. package/dist/src/agent/service.js +29 -0
  102. package/dist/src/agent/skills/hub-pull.js +1 -1
  103. package/dist/src/agent/skills/index.js +1 -1
  104. package/dist/src/agent/skills/install-target.js +1 -1
  105. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.d.ts +64 -0
  106. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +27 -18
  107. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +1 -1
  108. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +1 -1
  109. package/dist/src/agent/skills/marketplace/search.d.ts +46 -0
  110. package/dist/src/agent/skills/marketplace/search.js +193 -0
  111. package/dist/src/agent/skills/skill-tool-gating.js +2 -1
  112. package/dist/src/agent/tools/delegate-tool.js +2 -0
  113. package/dist/src/agent/tools/factory.d.ts +4 -2
  114. package/dist/src/agent/tools/factory.js +11 -5
  115. package/dist/src/agent/tools/index.d.ts +2 -1
  116. package/dist/src/agent/tools/index.js +2 -1
  117. package/dist/src/agent/tools/skill-install-tool.d.ts +17 -0
  118. package/dist/src/agent/tools/skill-install-tool.js +76 -8
  119. package/dist/src/agent/tools/skills-marketplace-search-tool.d.ts +17 -0
  120. package/dist/src/agent/tools/skills-marketplace-search-tool.js +77 -0
  121. package/dist/src/automations/domain/validation.d.ts +8 -8
  122. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -1
  123. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  124. package/dist/src/capabilities/store-connector.js +1 -1
  125. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  126. package/dist/src/config/agent-profile.js +1 -1
  127. package/dist/src/connectors/composio-sessions.d.ts +1 -0
  128. package/dist/src/connectors/composio-sessions.js +14 -5
  129. package/dist/src/connectors/composio-triggers.d.ts +1 -1
  130. package/dist/src/connectors/composio-triggers.js +4 -3
  131. package/dist/src/connectors/composio.js +1 -0
  132. package/dist/src/connectors/{connector-memory-sync.d.ts → connected-source-ingestion.d.ts} +11 -4
  133. package/dist/src/connectors/{connector-memory-sync.js → connected-source-ingestion.js} +49 -101
  134. package/dist/src/connectors/connected-source-normalizers.d.ts +15 -0
  135. package/dist/src/connectors/connected-source-normalizers.js +186 -0
  136. package/dist/src/connectors/connector-identity.d.ts +2 -0
  137. package/dist/src/connectors/connector-identity.js +29 -0
  138. package/dist/src/connectors/learning-coordinator.d.ts +25 -0
  139. package/dist/src/connectors/learning-coordinator.js +214 -0
  140. package/dist/src/connectors/learning-recipes.d.ts +22 -0
  141. package/dist/src/connectors/learning-recipes.js +121 -0
  142. package/dist/src/connectors/runtime-status.d.ts +1 -8
  143. package/dist/src/connectors/runtime-status.js +4 -29
  144. package/dist/src/extensions/api.js +1 -1
  145. package/dist/src/extensions/install.js +1 -1
  146. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  147. package/dist/src/gateway/agent-builtin-tools.js +2 -0
  148. package/dist/src/gateway/agents-admin.js +1 -1
  149. package/dist/src/gateway/heartbeat/service.js +1 -1
  150. package/dist/src/gateway/hono/routes/commands-skills.js +2 -2
  151. package/dist/src/gateway/hono/routes/connectors.js +76 -118
  152. package/dist/src/gateway/hono/routes/local-apps.js +1 -1
  153. package/dist/src/gateway/hono/routes/models.js +24 -0
  154. package/dist/src/gateway/hono/routes/public-gateway.js +3 -2
  155. package/dist/src/gateway/hono/routes/you.js +86 -5
  156. package/dist/src/gateway/service/marketplace-service.js +1 -1
  157. package/dist/src/gateway/service.d.ts +5 -2
  158. package/dist/src/gateway/service.js +18 -13
  159. package/dist/src/heartbeat/index.js +1 -1
  160. package/dist/src/knowledge/connected-understanding-pipeline.d.ts +19 -0
  161. package/dist/src/knowledge/connected-understanding-pipeline.js +268 -0
  162. package/dist/src/knowledge/index.d.ts +1 -0
  163. package/dist/src/knowledge/index.js +2 -1
  164. package/dist/src/knowledge/ingestion-service.d.ts +6 -4
  165. package/dist/src/knowledge/ingestion-service.js +13 -10
  166. package/dist/src/knowledge/local-folder-adapter.js +1 -0
  167. package/dist/src/knowledge/people-graph.js +43 -110
  168. package/dist/src/knowledge/types.d.ts +3 -0
  169. package/dist/src/mcp/channel-bridge.js +1 -1
  170. package/dist/src/providers/xopc-cloud-account-service.d.ts +40 -0
  171. package/dist/src/providers/xopc-cloud-account-service.js +65 -0
  172. package/dist/src/storage/sqlite/connector-learning-repository.d.ts +47 -0
  173. package/dist/src/storage/sqlite/connector-learning-repository.js +110 -0
  174. package/dist/src/storage/sqlite/index.d.ts +3 -1
  175. package/dist/src/storage/sqlite/index.js +4 -2
  176. package/dist/src/storage/sqlite/knowledge-repository.d.ts +4 -2
  177. package/dist/src/storage/sqlite/knowledge-repository.js +24 -13
  178. package/dist/src/storage/sqlite/migrations/062_connector_learning_jobs.sql +27 -0
  179. package/dist/src/storage/sqlite/migrations/063_knowledge_collection_scopes.sql +14 -0
  180. package/dist/src/storage/sqlite/migrations/064_user_claims.sql +60 -0
  181. package/dist/src/storage/sqlite/migrations/065_knowledge_item_scope_identity.sql +116 -0
  182. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  183. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  184. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  185. package/dist/src/storage/sqlite/schema.js +1 -1
  186. package/dist/src/storage/sqlite/user-claims-repository.d.ts +101 -0
  187. package/dist/src/storage/sqlite/user-claims-repository.js +241 -0
  188. package/dist/src/user-context/projection.d.ts +36 -1
  189. package/dist/src/user-context/projection.js +84 -6
  190. package/dist/src/work-discovery/service.js +1 -0
  191. package/package.json +1 -1
  192. package/skills/tools/find-skills/SKILL.md +18 -428
  193. package/dist/gateway/static/root/assets/agents-ZCIC8mhO.js +0 -2
  194. package/dist/gateway/static/root/assets/apps-page-DJmgBaAm.js +0 -1
  195. package/dist/gateway/static/root/assets/automations-page-Ddot8-Md.js +0 -6
  196. package/dist/gateway/static/root/assets/block-editor-D3GIllO3.js +0 -184
  197. package/dist/gateway/static/root/assets/browser-settings-page-DvETvRcg.js +0 -8
  198. package/dist/gateway/static/root/assets/capabilities-settings-panel-ChXIYbys.js +0 -7
  199. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUekXsJy.js +0 -1
  200. package/dist/gateway/static/root/assets/channels-settings-CkhveNsQ.js +0 -1
  201. package/dist/gateway/static/root/assets/channels-status-swr-DRTb8DBk.js +0 -1
  202. package/dist/gateway/static/root/assets/connector-logo-CQznQcd4.js +0 -1
  203. package/dist/gateway/static/root/assets/connectors-page-DkSGIxWP.js +0 -2
  204. package/dist/gateway/static/root/assets/desktop-pet-BtP-xUQ9.js +0 -1
  205. package/dist/gateway/static/root/assets/dreaming-settings-gd9W6SLj.js +0 -3
  206. package/dist/gateway/static/root/assets/goal-detail-page-DizZ6Cpl.js +0 -4
  207. package/dist/gateway/static/root/assets/goals-page-Dqry_hi2.js +0 -2
  208. package/dist/gateway/static/root/assets/index-DEdyUjxM.css +0 -1
  209. package/dist/gateway/static/root/assets/logs-page-mT48mcF4.js +0 -7
  210. package/dist/gateway/static/root/assets/notes-workbench-wgt2Osyk.js +0 -4
  211. package/dist/gateway/static/root/assets/project-detail-page-CDjHvxJm.js +0 -1
  212. package/dist/gateway/static/root/assets/projects-page-kJZwQXfC.js +0 -1
  213. package/dist/gateway/static/root/assets/remote-access-hub-MJdI9ek_.js +0 -1
  214. package/dist/gateway/static/root/assets/sessions-page-BqC7GDC_.js +0 -1
  215. package/dist/gateway/static/root/assets/settings-advanced-gate-CYwz8MfF.js +0 -1
  216. package/dist/gateway/static/root/assets/shares-settings-h8tGDkA3.js +0 -1
  217. package/dist/gateway/static/root/assets/skill-reload-api-D2DGvRUn.js +0 -1
  218. package/dist/gateway/static/root/assets/skills-page-vqhjSMhZ.js +0 -2
  219. package/dist/gateway/static/root/assets/time-picker-mtD64kFB.js +0 -1
  220. package/dist/gateway/static/root/assets/user-context-page-BgF0WxjM.js +0 -1
  221. package/dist/gateway/static/root/assets/work-discovery-page-CP0Daig-.js +0 -1
  222. package/dist/gateway/static/root/assets/work-item-detail-page-NEWZPKB_.js +0 -1
  223. package/dist/gateway/static/root/assets/work-page-BkWntcQh.js +0 -1
  224. package/dist/gateway/static/root/assets/workflows-page-DRvhNQGe.js +0 -11
  225. package/dist/src/connectors/memory-sync-coordinator.d.ts +0 -28
  226. package/dist/src/connectors/memory-sync-coordinator.js +0 -162
  227. package/dist/src/connectors/memory-sync-profile.d.ts +0 -13
  228. 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-vHb2z7VS.js"></script>
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-CKZuaOeG.js">
28
- <link rel="modulepreload" crossorigin href="/assets/locale-store-CzIfXqm8.js">
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-mcMq_uu_.js">
35
- <link rel="modulepreload" crossorigin href="/assets/activity-store-BLz30jWq.js">
36
- <link rel="modulepreload" crossorigin href="/assets/theme-store-1OkdVC8l.js">
37
- <link rel="stylesheet" crossorigin href="/assets/index-DEdyUjxM.css">
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
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.0.171";
2
+ var version = "0.0.173";
3
3
  //#endregion
4
4
  export { version };
@@ -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
- ...request.source ?? {},
174
- provider: this.id
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<void>;
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
- if (sourceItemId) setKnowledgeSourceItemSynthesisStatus([sourceItemId], "completed");
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 evidence = {
140
- ...context.sourceItemId ? { sourceItemId: context.sourceItemId } : {},
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
- if (context.sourceItemId) attachMemoryEvidence({
152
+ for (const sourceItemId of sourceItemIds) attachMemoryEvidence({
151
153
  recordId: existing[0].id,
152
- sourceItemId: context.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: [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
- if (write.record && context.sourceItemId) attachMemoryEvidence({
199
+ for (const sourceItemId of write.record ? sourceItemIds : []) attachMemoryEvidence({
198
200
  recordId: write.record.id,
199
- sourceItemId: context.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 === "global" ? "global" : "workspace";
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(slug, version) {
77
- const enc = encodeURIComponent(slug.trim());
78
- const sp = version?.trim() ? `?version=${encodeURIComponent(version.trim())}` : "";
79
- const url = `${resolveClawHubBaseUrl()}/api/v1/packages/${enc}/download${sp}`;
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 slug = packageName.trim();
308
- const result = await downloadClawHubSkillZip(slug, version);
317
+ const result = await downloadClawHubSkillZip(packageName, version);
309
318
  return {
310
319
  buffer: result.buffer,
311
- skillId: isValidSkillId(slug) ? slug : "unknown",
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
+ }>;