@xopcai/xopc 0.0.190 → 0.0.192

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) 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-DstnJCS5.js → activity-store-B-tzXpDD.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-9vAbkroX.js → agent-avatar-dicebear-xOu0qNwc.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-CxuwvDk0.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-BTL9kayv.js → api-fMItZb-h.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DkFeIdBf.js → app-management-settings-panel-D6Rv3OWI.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-Bxs8Fpaj.js → appearance-settings-CKoNCwco.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-wAb5dnHZ.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-Ch2RmLCC.js → archive-plugin-BokNQBwH.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-BhMQM_Ky.js → attachment-load-Dx1HglsM.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-Drgazevs.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-D6CqlymH.js → binary-plugins-CPYAflIG.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-ClL6HEg9.js → block-editor-BFLgl8SS.js} +47 -47
  15. package/dist/gateway/static/root/assets/browser-settings-page-DmYlFJW7.js +8 -0
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BYy48VhN.js → browser-workflow-inputs-CqLnqA9z.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-zgLibuMH.js → browser-workflows-page-Db5v3HtE.js} +2 -2
  18. package/dist/gateway/static/root/assets/capabilities-settings-panel-D7Z8T0o5.js +7 -0
  19. package/dist/gateway/static/root/assets/capability-presets-api-lov0J9A2.js +1 -0
  20. package/dist/gateway/static/root/assets/capability-presets-settings-panel-COjnwO0U.js +3 -0
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-BThDGiO3.js → channel-recipient-api-DSJznouK.js} +1 -1
  22. package/dist/gateway/static/root/assets/channels-settings-DcRYBNN7.js +1 -0
  23. package/dist/gateway/static/root/assets/channels-status-swr-C2UYdebT.js +1 -0
  24. package/dist/gateway/static/root/assets/{code-editor-D4_k-6QN.js → code-editor-dFzqyDXS.js} +1 -1
  25. package/dist/gateway/static/root/assets/{connectors-api-DS9ED-EL.js → connectors-api-3ccRyS3L.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-FVmvBG9H.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-CkgsvhtW.js → cron-expression-C9hhCiuo.js} +1 -1
  28. package/dist/gateway/static/root/assets/dependency-picker-CTtZFZug.js +1 -0
  29. package/dist/gateway/static/root/assets/{desktop-pet-Cv8rGhYW.js → desktop-pet-DOUeNVmC.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-CIeJdwfV.js → desktop-pet-settings-D4704vtl.js} +1 -1
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-D8jXEiAY.js → directory-picker-path-field-DJDXeA1B.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-CCZ9u6TZ.js → extension-debug-page-C0n2NMF1.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-CV36ILRG.js → extension-page-vG-xxRNs.js} +1 -1
  34. package/dist/gateway/static/root/assets/extension-settings-page-CtuY2THd.js +1 -0
  35. package/dist/gateway/static/root/assets/{gateway-config-api-D4_r5iJM.js → gateway-config-api-CZra7GuI.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-CYlntpBH.js → gateway-settings-Cz33jRkR.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-startup-retry-EO9mKvzE.js → gateway-startup-retry-BbVV0udv.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-settings-D4SyWob8.js → heartbeat-settings-D2XMlA_U.js} +1 -1
  39. package/dist/gateway/static/root/assets/home-page-CPrHkPN6.js +3 -0
  40. package/dist/gateway/static/root/assets/html-workspace-editor-bXK5tq64.js +1 -0
  41. package/dist/gateway/static/root/assets/{image-generation-api-Bu7PyVSh.js → image-generation-api-BgrOvhaJ.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-Cg7Xnlu3.css +1 -0
  43. package/dist/gateway/static/root/assets/index-DzmbmOGA.js +150 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BMhCuVBZ.js → keyboard-shortcuts-settings-BfyAEG1G.js} +1 -1
  45. package/dist/gateway/static/root/assets/local-app-workbench-page-Clz47vSr.js +2 -0
  46. package/dist/gateway/static/root/assets/{local-apps-page-ijIe7_y2.js → local-apps-page-BYalcRSY.js} +1 -1
  47. package/dist/gateway/static/root/assets/{locale-store-deR2zRaE.js → locale-store-VOY1wMO9.js} +1 -1
  48. package/dist/gateway/static/root/assets/logs-page-Cxq9WMf5.js +2 -0
  49. package/dist/gateway/static/root/assets/{management-settings--V_fovKD.js → management-settings-BQf-6s32.js} +1 -1
  50. package/dist/gateway/static/root/assets/{markdown-editor-BvUebh3C.js → markdown-editor-TWGaF7Xa.js} +2 -2
  51. package/dist/gateway/static/root/assets/{markdown-split-Dt9-in6W.js → markdown-split-Cy_2SN1Q.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-B3pj_iO0.js → media-plugins-CkDupqb2.js} +1 -1
  53. package/dist/gateway/static/root/assets/messages-DMJ-6-1m.js +3 -0
  54. package/dist/gateway/static/root/assets/{notes-page-DZ366lIT.js → notes-page-kiGRR9jo.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-DkYkPGyB.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-C5ge434C.js → page-tabs-CvzSdYVj.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-BFa9DgSV.js → preview-open-alternatives-kZ0nco7e.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-Dc9CcWdu.js → product-open-page-DgoieqQC.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-CeSjJd-N.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-fZ1rm4b9.js +1 -0
  61. package/dist/gateway/static/root/assets/remote-access-hub-CbYI6KC8.js +1 -0
  62. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bud_NTEZ.js +5 -0
  63. package/dist/gateway/static/root/assets/{schema-form-B84DckWe.js → schema-form-GlbsCBmv.js} +1 -1
  64. package/dist/gateway/static/root/assets/sessions-page-sOJ_TnLm.js +1 -0
  65. package/dist/gateway/static/root/assets/settings-advanced-gate-BI0u77dt.js +1 -0
  66. package/dist/gateway/static/root/assets/{settings-form-section-Dp9itvdy.js → settings-form-section-CKLns16d.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-loading-skeleton-CCtlhoy7.js → settings-loading-skeleton-BDzpxgk0.js} +1 -1
  68. package/dist/gateway/static/root/assets/settings-page-BH0pF7QB.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-page-layout-EQIOJa_L.js → settings-page-layout-J793iqfm.js} +1 -1
  70. package/dist/gateway/static/root/assets/{setup-status-panel-Cwi-SPja.js → setup-status-panel-CGsml89P.js} +1 -1
  71. package/dist/gateway/static/root/assets/{share-preview-page-C4_B2jvf.js → share-preview-page-UTm_7r0l.js} +1 -1
  72. package/dist/gateway/static/root/assets/shares-settings-BM--lgUS.js +1 -0
  73. package/dist/gateway/static/root/assets/skill-reload-api-CGCOC-rV.js +1 -0
  74. package/dist/gateway/static/root/assets/skills-page-iLyaOl48.js +2 -0
  75. package/dist/gateway/static/root/assets/skills-page.utils-Bwid1TGB.js +1 -0
  76. package/dist/gateway/static/root/assets/style-TIDOdKy0.js +7 -0
  77. package/dist/gateway/static/root/assets/{system-settings-panel-Dpx2ags2.js → system-settings-panel-BcB3p1e3.js} +1 -1
  78. package/dist/gateway/static/root/assets/task-detail-page-DQYEf08v.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-DnBOcGXi.js → theme-store-GVZOImyb.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-DULmTHUB.js → typed-models-lib-CT2c85Ju.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-autosave-BrjVk5VH.js → use-autosave-CcvY7DTh.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-CGI41bfO.js +1 -0
  83. package/dist/gateway/static/root/assets/{vendor-codemirror--gTq3YAI.js → vendor-codemirror-DRr7hFaD.js} +16 -16
  84. package/dist/gateway/static/root/assets/voice-api-key-field-Ricc3QGo.js +1 -0
  85. package/dist/gateway/static/root/assets/{work-discovery-overlay-Wr-uF7VA.js → work-discovery-overlay-BoomfqhX.js} +1 -1
  86. package/dist/gateway/static/root/assets/{work-discovery-page-BWds95sL.js → work-discovery-page-mbnepbQk.js} +1 -1
  87. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DSWG2xqL.js +3 -0
  88. package/dist/gateway/static/root/assets/workflows-page-DtV0ruyk.js +5 -0
  89. package/dist/gateway/static/root/index.html +7 -7
  90. package/dist/package.js +1 -1
  91. package/dist/src/agent/agent-manager.d.ts +2 -0
  92. package/dist/src/agent/agent-manager.js +76 -0
  93. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  94. package/dist/src/agent/background-review/prompts.js +1 -1
  95. package/dist/src/agent/background-review/run-background-review.js +3 -12
  96. package/dist/src/agent/embedded/run-for-session.js +3 -0
  97. package/dist/src/agent/embedded/run-turn.js +4 -1
  98. package/dist/src/agent/embedded/session-runner.js +3 -4
  99. package/dist/src/agent/embedded/types.d.ts +10 -1
  100. package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -2
  101. package/dist/src/agent/external-tools/mcp-provider.d.ts +1 -0
  102. package/dist/src/agent/external-tools/mcp-provider.js +21 -6
  103. package/dist/src/agent/image/generation/openai-images-provider.d.ts +1 -1
  104. package/dist/src/agent/image/generation/openai-images-provider.js +1 -1
  105. package/dist/src/agent/image/generation/provider-registry.d.ts +2 -0
  106. package/dist/src/agent/image/generation/provider-registry.js +21 -10
  107. package/dist/src/agent/image/generation/providers/dashscope.js +20 -0
  108. package/dist/src/agent/image/generation/providers/fal.d.ts +1 -1
  109. package/dist/src/agent/image/generation/providers/fal.js +12 -6
  110. package/dist/src/agent/image/generation/providers/google.js +8 -0
  111. package/dist/src/agent/image/generation/providers/minimax.js +20 -0
  112. package/dist/src/agent/image/generation/providers/openai.js +36 -26
  113. package/dist/src/agent/image/generation/providers/xopc-cloud.d.ts +2 -0
  114. package/dist/src/agent/image/generation/providers/xopc-cloud.js +74 -0
  115. package/dist/src/agent/image/generation/types.d.ts +15 -2
  116. package/dist/src/agent/mcp/bundle-mcp-gateway.d.ts +1 -0
  117. package/dist/src/agent/mcp/bundle-mcp-gateway.js +2 -1
  118. package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +5 -1
  119. package/dist/src/agent/mcp/bundle-mcp-policy.js +11 -3
  120. package/dist/src/agent/mcp/bundle-mcp-runtime.js +3 -2
  121. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +2 -1
  122. package/dist/src/agent/mcp/index.js +2 -2
  123. package/dist/src/agent/mcp/mcp-stdio-transport.js +1 -1
  124. package/dist/src/agent/mcp/mcp-transport.d.ts +2 -1
  125. package/dist/src/agent/mcp/mcp-transport.js +22 -4
  126. package/dist/src/agent/memory/compaction.js +19 -17
  127. package/dist/src/agent/memory/context-budget.js +2 -3
  128. package/dist/src/agent/memory/understanding/service.d.ts +1 -0
  129. package/dist/src/agent/memory/understanding/service.js +49 -20
  130. package/dist/src/agent/memory/understanding/types.d.ts +1 -0
  131. package/dist/src/agent/memory/user-context-coordinator.js +6 -0
  132. package/dist/src/agent/orchestration/agent-orchestrator.js +15 -1
  133. package/dist/src/agent/service/direct-turn-helpers.js +14 -5
  134. package/dist/src/agent/skills/index.d.ts +1 -1
  135. package/dist/src/agent/skills/index.js +2 -2
  136. package/dist/src/agent/skills/installer.d.ts +3 -10
  137. package/dist/src/agent/skills/installer.js +99 -156
  138. package/dist/src/agent/skills/marketplace/adapter.types.d.ts +3 -1
  139. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +30 -6
  140. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +21 -4
  141. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +7 -4
  142. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +3 -0
  143. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +7 -1
  144. package/dist/src/agent/skills/marketplace/search.d.ts +2 -2
  145. package/dist/src/agent/skills/marketplace/search.js +52 -21
  146. package/dist/src/agent/skills/skills-marketplace.d.ts +1 -1
  147. package/dist/src/agent/skills/skills-marketplace.js +2 -2
  148. package/dist/src/agent/skills/types.d.ts +0 -8
  149. package/dist/src/agent/tools/exec-command.d.ts +1 -0
  150. package/dist/src/agent/tools/exec-command.js +2 -1
  151. package/dist/src/agent/tools/factory.d.ts +1 -0
  152. package/dist/src/agent/tools/factory.js +17 -2
  153. package/dist/src/agent/tools/managed-job-tool.d.ts +1 -1
  154. package/dist/src/agent/tools/managed-job-tool.js +3 -2
  155. package/dist/src/agent/tools/skill-install-tool.d.ts +2 -2
  156. package/dist/src/agent/tools/skill-install-tool.js +8 -4
  157. package/dist/src/agent/tools/skills-marketplace-search-tool.js +3 -2
  158. package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
  159. package/dist/src/agent/tools/workflow-tool.js +14 -4
  160. package/dist/src/agent-manifest/schema.d.ts +20 -0
  161. package/dist/src/agent-manifest/schema.js +6 -1
  162. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  163. package/dist/src/cli/command-loaders.js +1 -0
  164. package/dist/src/cli/command-manifest.js +4 -0
  165. package/dist/src/cli/commands/doctor/checks/node-version.js +3 -3
  166. package/dist/src/cli/commands/doctor/checks/tool-runtimes.d.ts +2 -0
  167. package/dist/src/cli/commands/doctor/checks/tool-runtimes.js +36 -0
  168. package/dist/src/cli/commands/doctor/flow.js +2 -0
  169. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  170. package/dist/src/cli/commands/models.js +0 -1
  171. package/dist/src/cli/commands/onboard/model.d.ts +18 -0
  172. package/dist/src/cli/commands/onboard/model.js +81 -5
  173. package/dist/src/cli/commands/onboard.js +13 -1
  174. package/dist/src/cli/commands/runtime.d.ts +1 -0
  175. package/dist/src/cli/commands/runtime.js +77 -0
  176. package/dist/src/cli/commands/setup.js +15 -1
  177. package/dist/src/cli/commands/skills.js +7 -4
  178. package/dist/src/config/agent-profile.js +1 -1
  179. package/dist/src/config/index.js +2 -2
  180. package/dist/src/config/schema.d.ts +125 -0
  181. package/dist/src/config/schema.js +77 -2
  182. package/dist/src/config/voice.d.ts +6 -0
  183. package/dist/src/config/voice.js +17 -0
  184. package/dist/src/extensions/install.js +1 -1
  185. package/dist/src/extensions/types/providers.d.ts +4 -0
  186. package/dist/src/gateway/agents-admin.js +1 -1
  187. package/dist/src/gateway/capability-presets-admin.d.ts +9 -0
  188. package/dist/src/gateway/capability-presets-admin.js +24 -6
  189. package/dist/src/gateway/chat-stream/mapper.js +8 -4
  190. package/dist/src/gateway/chat-stream/protocol.d.ts +10 -1
  191. package/dist/src/gateway/heartbeat/service.js +1 -1
  192. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
  193. package/dist/src/gateway/hono/routes/commands-skills.js +2 -1
  194. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  195. package/dist/src/gateway/hono/routes/models.js +11 -11
  196. package/dist/src/gateway/hono/routes/runtime-tools.d.ts +3 -0
  197. package/dist/src/gateway/hono/routes/runtime-tools.js +142 -0
  198. package/dist/src/gateway/hono/routes/understanding-sources.js +2 -1
  199. package/dist/src/gateway/hono/routes/voice.js +43 -2
  200. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  201. package/dist/src/gateway/hono/routes/you.js +22 -25
  202. package/dist/src/gateway/image-generation-setup.d.ts +2 -3
  203. package/dist/src/gateway/image-generation-setup.js +39 -8
  204. package/dist/src/gateway/service/marketplace-service.d.ts +1 -1
  205. package/dist/src/gateway/service/marketplace-service.js +2 -2
  206. package/dist/src/heartbeat/index.js +1 -1
  207. package/dist/src/infra/update-global.js +1 -1
  208. package/dist/src/providers/extension-stream-bridge.js +8 -7
  209. package/dist/src/providers/model-catalog-store.d.ts +35 -0
  210. package/dist/src/providers/model-catalog-store.js +25 -1
  211. package/dist/src/providers/model-catalog-sync-service.js +6 -0
  212. package/dist/src/providers/model-registry.js +4 -4
  213. package/dist/src/providers/prompt-cache-payload.d.ts +13 -0
  214. package/dist/src/providers/prompt-cache-payload.js +110 -0
  215. package/dist/src/providers/register-runtime-providers.js +4 -4
  216. package/dist/src/providers/xopc-cloud-model-source.js +101 -8
  217. package/dist/src/runtime-tools/archive.d.ts +8 -0
  218. package/dist/src/runtime-tools/archive.js +99 -0
  219. package/dist/src/runtime-tools/bootstrap.d.ts +16 -0
  220. package/dist/src/runtime-tools/bootstrap.js +33 -0
  221. package/dist/src/runtime-tools/catalog.d.ts +19 -0
  222. package/dist/src/runtime-tools/catalog.js +59 -0
  223. package/dist/src/runtime-tools/command.d.ts +15 -0
  224. package/dist/src/runtime-tools/command.js +59 -0
  225. package/dist/src/runtime-tools/download-source.d.ts +24 -0
  226. package/dist/src/runtime-tools/download-source.js +125 -0
  227. package/dist/src/runtime-tools/downloader.d.ts +21 -0
  228. package/dist/src/runtime-tools/downloader.js +137 -0
  229. package/dist/src/runtime-tools/environment.d.ts +20 -0
  230. package/dist/src/runtime-tools/environment.js +113 -0
  231. package/dist/src/runtime-tools/errors.d.ts +10 -0
  232. package/dist/src/runtime-tools/errors.js +14 -0
  233. package/dist/src/runtime-tools/index.d.ts +7 -0
  234. package/dist/src/runtime-tools/index.js +7 -0
  235. package/dist/src/runtime-tools/install-lock.d.ts +1 -0
  236. package/dist/src/runtime-tools/install-lock.js +50 -0
  237. package/dist/src/runtime-tools/manager.d.ts +20 -0
  238. package/dist/src/runtime-tools/manager.js +641 -0
  239. package/dist/src/runtime-tools/manifest-store.d.ts +3 -0
  240. package/dist/src/runtime-tools/manifest-store.js +26 -0
  241. package/dist/src/runtime-tools/network.d.ts +9 -0
  242. package/dist/src/runtime-tools/network.js +41 -0
  243. package/dist/src/runtime-tools/offline-bundle.d.ts +16 -0
  244. package/dist/src/runtime-tools/offline-bundle.js +41 -0
  245. package/dist/src/runtime-tools/paths.d.ts +7 -0
  246. package/dist/src/runtime-tools/paths.js +22 -0
  247. package/dist/src/runtime-tools/probe.d.ts +7 -0
  248. package/dist/src/runtime-tools/probe.js +71 -0
  249. package/dist/src/runtime-tools/prune.d.ts +10 -0
  250. package/dist/src/runtime-tools/prune.js +93 -0
  251. package/dist/src/runtime-tools/types.d.ts +70 -0
  252. package/dist/src/runtime-tools/types.js +1 -0
  253. package/dist/src/share/share-zip.js +1 -1
  254. package/dist/src/storage/sqlite/migrations/113_memory_evidence_single_source.sql +42 -20
  255. package/dist/src/tasks/home-query-service.js +1 -5
  256. package/dist/src/tasks/index.js +2 -2
  257. package/dist/src/tasks/project-operating-view-service.d.ts +2 -1
  258. package/dist/src/tasks/project-operating-view-service.js +6 -4
  259. package/dist/src/tasks/task-dependency-service.d.ts +2 -1
  260. package/dist/src/tasks/task-dependency-service.js +15 -0
  261. package/dist/src/tunnel/frpc-binary.js +1 -1
  262. package/dist/src/user-context/domain.d.ts +2 -1
  263. package/dist/src/user-context/domain.js +12 -1
  264. package/dist/src/user-context/manual-understanding.js +8 -10
  265. package/dist/src/user-context/planner.js +1 -6
  266. package/dist/src/user-context/sources/activity-clustering.d.ts +5 -0
  267. package/dist/src/user-context/sources/activity-clustering.js +130 -0
  268. package/dist/src/user-context/sources/catalog.js +26 -0
  269. package/dist/src/user-context/sources/local-source-contract.d.ts +3 -0
  270. package/dist/src/user-context/sources/local-source-contract.js +15 -0
  271. package/dist/src/user-context/sources/repository.js +7 -1
  272. package/dist/src/user-context/sources/types.d.ts +7 -1
  273. package/dist/src/user-context/understanding.d.ts +15 -0
  274. package/dist/src/user-context/understanding.js +24 -0
  275. package/dist/src/voice/local/model-files.js +1 -1
  276. package/dist/src/voice/metadata/builtin.js +99 -32
  277. package/dist/src/voice/metadata/types.d.ts +3 -0
  278. package/dist/src/voice/stt/availability.js +4 -1
  279. package/dist/src/voice/stt/config-slice.d.ts +0 -2
  280. package/dist/src/voice/stt/config-slice.js +1 -6
  281. package/dist/src/voice/stt/factory.js +2 -2
  282. package/dist/src/voice/stt/index.d.ts +2 -3
  283. package/dist/src/voice/stt/list-providers.js +1 -1
  284. package/dist/src/voice/stt/providers/alibaba-transcription.d.ts +0 -19
  285. package/dist/src/voice/stt/providers/alibaba-transcription.js +59 -132
  286. package/dist/src/voice/stt/providers/index.d.ts +1 -0
  287. package/dist/src/voice/stt/providers/index.js +2 -1
  288. package/dist/src/voice/stt/providers/openai-transcription.d.ts +2 -2
  289. package/dist/src/voice/stt/providers/openai-transcription.js +4 -4
  290. package/dist/src/voice/stt/providers/xopc-cloud-transcription.d.ts +2 -0
  291. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +49 -0
  292. package/dist/src/voice/stt/types.js +2 -2
  293. package/dist/src/voice/tts/providers/index.d.ts +1 -0
  294. package/dist/src/voice/tts/providers/index.js +2 -1
  295. package/dist/src/voice/tts/providers/xopc-cloud-speech.d.ts +2 -0
  296. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +113 -0
  297. package/dist/src/voice/tts/types.d.ts +1 -1
  298. package/dist/src/work-discovery/analyzer.js +9 -4
  299. package/dist/src/work-discovery/candidate-discovery.d.ts +1 -0
  300. package/dist/src/work-discovery/candidate-discovery.js +3 -3
  301. package/dist/src/work-discovery/index.js +2 -2
  302. package/dist/src/work-discovery/service.d.ts +2 -1
  303. package/dist/src/work-discovery/service.js +126 -37
  304. package/dist/src/work-discovery/types.d.ts +1 -0
  305. package/dist/src/workflows/service/workflow-run-service.js +8 -0
  306. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  307. package/package.json +1 -1
  308. package/dist/gateway/static/root/assets/agents-D1t4SfMQ.js +0 -68
  309. package/dist/gateway/static/root/assets/apps-page-Cgrgu5OW.js +0 -1
  310. package/dist/gateway/static/root/assets/automations-page-CtJxstKh.js +0 -6
  311. package/dist/gateway/static/root/assets/browser-settings-page-DW99iDmD.js +0 -8
  312. package/dist/gateway/static/root/assets/capabilities-settings-panel-CHUrT9EB.js +0 -7
  313. package/dist/gateway/static/root/assets/capability-presets-api-BB8t4Ja7.js +0 -1
  314. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Cycrv0YV.js +0 -1
  315. package/dist/gateway/static/root/assets/channels-settings-V96gPUAU.js +0 -1
  316. package/dist/gateway/static/root/assets/channels-status-swr-Cz7SAAkm.js +0 -1
  317. package/dist/gateway/static/root/assets/connectors-page-BhlyQoQI.js +0 -2
  318. package/dist/gateway/static/root/assets/extension-settings-page-IyQrSILY.js +0 -1
  319. package/dist/gateway/static/root/assets/home-page-B2Kagoh8.js +0 -3
  320. package/dist/gateway/static/root/assets/html-workspace-editor-C3DKAkMc.js +0 -1
  321. package/dist/gateway/static/root/assets/index-CYT5DOzr.js +0 -150
  322. package/dist/gateway/static/root/assets/index-D6e3tPL-.css +0 -1
  323. package/dist/gateway/static/root/assets/local-app-workbench-page-BHYbFjqy.js +0 -2
  324. package/dist/gateway/static/root/assets/logs-page-IIn8Tess.js +0 -2
  325. package/dist/gateway/static/root/assets/messages-B4XqB8I6.js +0 -3
  326. package/dist/gateway/static/root/assets/notes-workbench-S2sBVOLw.js +0 -4
  327. package/dist/gateway/static/root/assets/project-detail-page-BilzoCJ7.js +0 -1
  328. package/dist/gateway/static/root/assets/projects-page-BoQUyacP.js +0 -1
  329. package/dist/gateway/static/root/assets/remote-access-hub-DUyUaCRF.js +0 -1
  330. package/dist/gateway/static/root/assets/sessions-page-Dzxlq1F0.js +0 -1
  331. package/dist/gateway/static/root/assets/settings-advanced-gate-TzwlZxU6.js +0 -1
  332. package/dist/gateway/static/root/assets/settings-page-DQmMKf8r.js +0 -1
  333. package/dist/gateway/static/root/assets/shares-settings-CkyuGlZK.js +0 -1
  334. package/dist/gateway/static/root/assets/skill-reload-api-BJCePQK5.js +0 -1
  335. package/dist/gateway/static/root/assets/skills-page-BYWLfmJi.js +0 -2
  336. package/dist/gateway/static/root/assets/skills-page.utils-Jhm24i4h.js +0 -1
  337. package/dist/gateway/static/root/assets/task-detail-page-DLAdxI6e.js +0 -1
  338. package/dist/gateway/static/root/assets/user-context-page-9AAFpGAL.js +0 -1
  339. package/dist/gateway/static/root/assets/voice-api-key-field-BISTPfq_.js +0 -1
  340. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DHqHP8_6.js +0 -3
  341. package/dist/gateway/static/root/assets/workflows-page-0b4_DFHr.js +0 -11
  342. /package/dist/gateway/static/root/assets/{workflows-page-DLioOiRN.css → style-DLioOiRN.css} +0 -0
@@ -1,9 +1,14 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { ManagedRuntimeManager } from "../../runtime-tools/manager.js";
4
+ import { buildRuntimeEnvironment } from "../../runtime-tools/environment.js";
5
+ import { prepareSafeToolEnv } from "../sandbox/sanitize-env-vars.js";
3
6
  import { delimiter, join } from "path";
4
7
  import { accessSync, constants, existsSync } from "fs";
8
+ import { access, mkdir, writeFile } from "fs/promises";
5
9
  import { promisify } from "util";
6
- import { exec } from "child_process";
10
+ import { createHash } from "node:crypto";
11
+ import { execFile } from "child_process";
7
12
  //#region src/agent/skills/installer.ts
8
13
  /**
9
14
  * Skill Installer
@@ -12,7 +17,7 @@ import { exec } from "child_process";
12
17
  *
13
18
  */
14
19
  init_logger();
15
- const execAsync = promisify(exec);
20
+ const execFileAsync = promisify(execFile);
16
21
  const log = createLogger("SkillInstaller");
17
22
  /**
18
23
  * Check if a binary exists
@@ -39,64 +44,47 @@ function resolveBrewExecutable() {
39
44
  /**
40
45
  * Build install command for Node.js packages
41
46
  */
42
- function buildNodeInstallCommand(packageName, manager) {
43
- switch (manager) {
44
- case "pnpm": return [
45
- "pnpm",
46
- "add",
47
- "-g",
48
- "--ignore-scripts",
49
- packageName
50
- ];
51
- case "yarn": return [
52
- "yarn",
53
- "global",
54
- "add",
55
- "--ignore-scripts",
56
- packageName
57
- ];
58
- case "bun": return [
59
- "bun",
60
- "add",
61
- "-g",
62
- "--ignore-scripts",
63
- packageName
64
- ];
65
- default: return [
66
- "npm",
67
- "install",
68
- "-g",
69
- "--ignore-scripts",
70
- packageName
71
- ];
72
- }
47
+ function buildNodeInstallCommand(packageName, environmentDir) {
48
+ return [
49
+ "npm",
50
+ "install",
51
+ "--prefix",
52
+ environmentDir,
53
+ "--ignore-scripts",
54
+ "--",
55
+ packageName
56
+ ];
57
+ }
58
+ function invalidInstallTarget(value) {
59
+ return !value || value.startsWith("-") || value.includes("\0");
73
60
  }
74
61
  /**
75
62
  * Build install command from spec
76
63
  */
77
- function buildInstallCommand(spec, prefs) {
64
+ function buildInstallCommand(spec, environmentDir) {
78
65
  switch (spec.kind) {
79
66
  case "brew":
80
- if (!spec.formula) return {
67
+ if (invalidInstallTarget(spec.formula)) return {
81
68
  argv: null,
82
69
  error: "Missing brew formula"
83
70
  };
84
71
  return { argv: [
85
72
  "brew",
86
73
  "install",
74
+ "--formula",
87
75
  spec.formula
88
76
  ] };
89
77
  case "pnpm":
90
78
  case "npm":
91
79
  case "yarn":
92
80
  case "bun":
93
- if (!spec.package) return {
81
+ if (invalidInstallTarget(spec.package)) return {
94
82
  argv: null,
95
83
  error: "Missing package name"
96
84
  };
97
- return { argv: buildNodeInstallCommand(spec.package, prefs.nodeManager) };
85
+ return { argv: buildNodeInstallCommand(spec.package, environmentDir) };
98
86
  case "go":
99
- if (!spec.module) return {
87
+ if (invalidInstallTarget(spec.module)) return {
100
88
  argv: null,
101
89
  error: "Missing go module"
102
90
  };
@@ -106,7 +94,7 @@ function buildInstallCommand(spec, prefs) {
106
94
  spec.module
107
95
  ] };
108
96
  case "uv":
109
- if (!spec.package) return {
97
+ if (invalidInstallTarget(spec.package)) return {
110
98
  argv: null,
111
99
  error: "Missing uv package"
112
100
  };
@@ -114,6 +102,11 @@ function buildInstallCommand(spec, prefs) {
114
102
  "uv",
115
103
  "tool",
116
104
  "install",
105
+ "--tool-dir",
106
+ join(environmentDir, "tools"),
107
+ "--bin-dir",
108
+ join(environmentDir, "bin"),
109
+ "--",
117
110
  spec.package
118
111
  ] };
119
112
  case "download": return {
@@ -133,8 +126,13 @@ function buildInstallCommand(spec, prefs) {
133
126
  */
134
127
  async function runCommandWithTimeout(argv, timeoutMs, env) {
135
128
  const [cmd, ...args] = argv;
129
+ if (!cmd) return {
130
+ code: null,
131
+ stdout: "",
132
+ stderr: "Missing executable"
133
+ };
136
134
  try {
137
- const { stdout, stderr } = await execAsync(`${cmd} ${args.join(" ")}`, {
135
+ const { stdout, stderr } = await execFileAsync(cmd, args, {
138
136
  timeout: timeoutMs,
139
137
  env,
140
138
  maxBuffer: 10 * 1024 * 1024
@@ -161,92 +159,6 @@ async function runCommandWithTimeout(argv, timeoutMs, env) {
161
159
  }
162
160
  }
163
161
  /**
164
- * Ensure uv is installed
165
- */
166
- async function ensureUvInstalled(timeoutMs) {
167
- if (hasBinary("uv")) return;
168
- const brewExe = resolveBrewExecutable();
169
- if (!brewExe) return {
170
- ok: false,
171
- message: "uv not installed — install manually: https://docs.astral.sh/uv/getting-started/installation/",
172
- stdout: "",
173
- stderr: "",
174
- code: null
175
- };
176
- const result = await runCommandWithTimeout([
177
- brewExe,
178
- "install",
179
- "uv"
180
- ], timeoutMs);
181
- if (result.code === 0) return;
182
- return {
183
- ok: false,
184
- message: "Failed to install uv (brew)",
185
- stdout: result.stdout,
186
- stderr: result.stderr,
187
- code: result.code
188
- };
189
- }
190
- /**
191
- * Ensure Go is installed
192
- */
193
- async function ensureGoInstalled(timeoutMs) {
194
- if (hasBinary("go")) return;
195
- const brewExe = resolveBrewExecutable();
196
- if (brewExe) {
197
- const result = await runCommandWithTimeout([
198
- brewExe,
199
- "install",
200
- "go"
201
- ], timeoutMs);
202
- if (result.code === 0) return;
203
- return {
204
- ok: false,
205
- message: "Failed to install go (brew)",
206
- stdout: result.stdout,
207
- stderr: result.stderr,
208
- code: result.code
209
- };
210
- }
211
- if (hasBinary("apt-get")) {
212
- const isRoot = process.getuid?.() === 0;
213
- const aptCmd = isRoot ? [
214
- "apt-get",
215
- "install",
216
- "-y",
217
- "golang-go"
218
- ] : [
219
- "sudo",
220
- "apt-get",
221
- "install",
222
- "-y",
223
- "golang-go"
224
- ];
225
- if (!isRoot) await runCommandWithTimeout([
226
- "sudo",
227
- "apt-get",
228
- "update",
229
- "-qq"
230
- ], Math.min(timeoutMs, 3e4));
231
- const result = await runCommandWithTimeout(aptCmd, timeoutMs);
232
- if (result.code === 0) return;
233
- return {
234
- ok: false,
235
- message: "go not installed — automatic install via apt failed. Install manually: https://go.dev/doc/install",
236
- stdout: result.stdout,
237
- stderr: result.stderr,
238
- code: result.code
239
- };
240
- }
241
- return {
242
- ok: false,
243
- message: "go not installed — install manually: https://go.dev/doc/install",
244
- stdout: "",
245
- stderr: "",
246
- code: null
247
- };
248
- }
249
- /**
250
162
  * Create install failure result
251
163
  */
252
164
  function createInstallFailure(params) {
@@ -281,41 +193,81 @@ function findInstallSpec(entry, installId) {
281
193
  * Install a skill dependency
282
194
  */
283
195
  async function installSkill(ctx) {
284
- const { installSpec, timeoutMs, preferences } = ctx;
196
+ const { installSpec, timeoutMs } = ctx;
285
197
  log.info({
286
198
  skill: ctx.skillEntry.skill.name,
287
199
  kind: installSpec.kind
288
200
  }, "Installing skill dependency");
289
201
  if (installSpec.kind === "download") return createInstallFailure({ message: "Download installer not yet implemented" });
290
- if (installSpec.kind === "uv") {
291
- const uvFailure = await ensureUvInstalled(timeoutMs);
292
- if (uvFailure) return uvFailure;
293
- }
294
202
  if (installSpec.kind === "go") {
295
- const goFailure = await ensureGoInstalled(timeoutMs);
296
- if (goFailure) return goFailure;
203
+ if (!hasBinary("go")) return createInstallFailure({ message: "go not installed — install it explicitly from https://go.dev/doc/install" });
297
204
  }
298
- const command = buildInstallCommand(installSpec, preferences);
205
+ const environmentId = createHash("sha256").update(JSON.stringify({
206
+ skill: ctx.skillEntry.skill.name,
207
+ path: ctx.skillEntry.skill.filePath,
208
+ installSpec
209
+ })).digest("hex").slice(0, 24);
210
+ const environmentDir = join(ctx.stateDir, "tools", "environments", "skills", environmentId);
211
+ await mkdir(environmentDir, { recursive: true });
212
+ if ([
213
+ "npm",
214
+ "pnpm",
215
+ "yarn",
216
+ "bun"
217
+ ].includes(installSpec.kind)) await writeFile(join(environmentDir, "package.json"), `${JSON.stringify({
218
+ private: true,
219
+ name: `xopc-skill-${environmentId}`
220
+ }, null, 2)}\n`, { flag: "wx" }).catch((error) => {
221
+ if (error.code !== "EEXIST") throw error;
222
+ });
223
+ const command = buildInstallCommand(installSpec, environmentDir);
299
224
  if (command.error) return createInstallFailure({ message: command.error });
300
225
  if (!command.argv) return createInstallFailure({ message: "Invalid install command" });
301
226
  let argv = [...command.argv];
227
+ const runtimeManager = new ManagedRuntimeManager({
228
+ stateDir: ctx.stateDir,
229
+ config: ctx.runtimeConfig
230
+ });
231
+ if (installSpec.kind === "uv") argv[0] = (await runtimeManager.resolve({
232
+ runtime: "uv",
233
+ allowProvision: true
234
+ })).executable;
235
+ else if ([
236
+ "npm",
237
+ "pnpm",
238
+ "yarn",
239
+ "bun"
240
+ ].includes(installSpec.kind)) {
241
+ const node = await runtimeManager.resolve({
242
+ runtime: "node",
243
+ allowProvision: true
244
+ });
245
+ if (node.installDir) {
246
+ const npmCli = process.platform === "win32" ? join(node.installDir, "node_modules", "npm", "bin", "npm-cli.js") : join(node.installDir, "lib", "node_modules", "npm", "bin", "npm-cli.js");
247
+ try {
248
+ await access(npmCli);
249
+ } catch {
250
+ return createInstallFailure({ message: "Managed Node.js does not include npm-cli.js" });
251
+ }
252
+ argv.splice(0, 1, node.executable, npmCli);
253
+ } else if (process.platform === "win32") return createInstallFailure({ message: "Isolated package installation on Windows requires managed Node.js" });
254
+ else argv[0] = node.executables.npm ?? "npm";
255
+ }
302
256
  if (installSpec.kind === "brew") {
303
257
  const brewExe = resolveBrewExecutable();
304
258
  if (!brewExe) return createInstallFailure({ message: `brew not installed — ${process.platform === "linux" ? "Homebrew is not installed. Install it from https://brew.sh or use your system package manager." : "Homebrew is not installed. Install it from https://brew.sh"}` });
305
259
  argv[0] = brewExe;
306
260
  }
307
- let env;
308
- if (installSpec.kind === "go") {
309
- const brewExe = resolveBrewExecutable();
310
- if (brewExe) try {
311
- const { stdout } = await execAsync(`${brewExe} --prefix`);
312
- const prefix = stdout.trim();
313
- if (prefix) env = {
314
- ...process.env,
315
- GOBIN: join(prefix, "bin")
316
- };
317
- } catch {}
318
- }
261
+ let env = (await buildRuntimeEnvironment({
262
+ stateDir: ctx.stateDir,
263
+ config: ctx.runtimeConfig,
264
+ baseEnv: prepareSafeToolEnv(process.env),
265
+ extraBinDirs: [join(environmentDir, "bin"), join(environmentDir, "node_modules", ".bin")]
266
+ })).env;
267
+ if (installSpec.kind === "go") env = {
268
+ ...env,
269
+ GOBIN: join(environmentDir, "bin")
270
+ };
319
271
  const result = await runCommandWithTimeout(argv, timeoutMs, env);
320
272
  if (result.code === 0) {
321
273
  log.info({ skill: ctx.skillEntry.skill.name }, "Skill dependency installed successfully");
@@ -332,14 +284,5 @@ async function installSkill(ctx) {
332
284
  code: result.code
333
285
  });
334
286
  }
335
- /**
336
- * Get default installer preferences from config
337
- */
338
- function getDefaultInstallerPreferences() {
339
- return {
340
- preferBrew: true,
341
- nodeManager: "pnpm"
342
- };
343
- }
344
287
  //#endregion
345
- export { findInstallSpec, getDefaultInstallerPreferences, hasBinary, installSkill, resolveBrewExecutable };
288
+ export { findInstallSpec, hasBinary, installSkill, resolveBrewExecutable };
@@ -7,7 +7,9 @@ export interface SkillsMarketplaceAdapter {
7
7
  /** Unique adapter identifier. Built-in: 'store' | 'skillhub' | 'clawhub'. Extensions may add arbitrary ids. */
8
8
  readonly id: string;
9
9
  /** Filter chips for the current provider (may be empty). */
10
- listCategories(config: Config): Promise<MarketplaceCategoryOption[]>;
10
+ listCategories(config: Config, options?: {
11
+ locale?: string;
12
+ }): Promise<MarketplaceCategoryOption[]>;
11
13
  listPackages(config: Config, params: SkillsStoreListParams): Promise<UnifiedMarketplaceListResponse>;
12
14
  getPackageDetail(config: Config, packageName: string): Promise<UnifiedMarketplacePackageDetail>;
13
15
  downloadPackage(config: Config, packageName: string, version?: string): Promise<{
@@ -77,6 +77,12 @@ async function getClawHubSkillFileText(slug, filePath, version) {
77
77
  const text = await res.text();
78
78
  return text.length > MAX_CLAWHUB_FILE_BYTES ? text.slice(0, MAX_CLAWHUB_FILE_BYTES) : text;
79
79
  }
80
+ function versionFromDownloadDisposition(value, slug) {
81
+ const filename = value?.match(/filename="?([^";]+)"?/i)?.[1]?.trim();
82
+ const prefix = `${slug}-`;
83
+ if (!filename?.startsWith(prefix) || !filename.toLowerCase().endsWith(".zip")) return void 0;
84
+ return filename.slice(prefix.length, -4).trim() || void 0;
85
+ }
80
86
  async function downloadClawHubSkillZip(reference, version) {
81
87
  const parts = reference.trim().replace(/^@/, "").split("/").filter(Boolean);
82
88
  const ownerHandle = parts.length === 2 ? parts[0] : void 0;
@@ -95,9 +101,10 @@ async function downloadClawHubSkillZip(reference, version) {
95
101
  if (!contentType.includes("zip") && !contentType.includes("octet-stream")) throw new Error(`ClawHub download [${slug}] unexpected content-type: ${contentType}`);
96
102
  const arrayBuf = await res.arrayBuffer();
97
103
  if (arrayBuf.byteLength > MAX_SKILL_ZIP_BYTES) throw new Error(`ClawHub download [${slug}] exceeds size limit (${arrayBuf.byteLength} > ${MAX_SKILL_ZIP_BYTES})`);
104
+ const resolvedVersion = version?.trim() || versionFromDownloadDisposition(res.headers.get("content-disposition"), slug) || "latest";
98
105
  return {
99
106
  buffer: Buffer.from(arrayBuf),
100
- version: version?.trim() || "latest",
107
+ version: resolvedVersion,
101
108
  slug
102
109
  };
103
110
  }
@@ -202,7 +209,7 @@ function convertListItemToPackageItem(item) {
202
209
  }
203
210
  function convertSearchResultToPackageItem(item, enrichment) {
204
211
  return {
205
- id: item.install?.reference ?? item.slug,
212
+ id: item.slug,
206
213
  name: item.displayName || item.slug,
207
214
  type: "skill",
208
215
  description: item.summary || "",
@@ -215,9 +222,27 @@ function convertSearchResultToPackageItem(item, enrichment) {
215
222
  updatedAt: String(item.metrics?.updatedAt ?? item.updatedAt ?? ""),
216
223
  categories: item.native?.skill?.categories ?? enrichment?.metadata?.os ?? [],
217
224
  stars: item.native?.skill?.stats?.stars ?? item.metrics?.bookmarks ?? enrichment?.stats.stars ?? 0,
218
- sourceLabel: item.source === "skills-sh" ? "skills.sh" : "ClawHub"
225
+ sourceLabel: item.source === "skills-sh" ? "skills.sh" : "ClawHub",
226
+ searchScore: typeof item.score === "number" && Number.isFinite(item.score) ? item.score : void 0
219
227
  };
220
228
  }
229
+ function sortClawHubSearchRows(rows, sort) {
230
+ return [...rows].sort((a, b) => {
231
+ const aScore = a.searchScore;
232
+ const bScore = b.searchScore;
233
+ if (aScore !== void 0 || bScore !== void 0) {
234
+ const relevanceDiff = (bScore ?? Number.NEGATIVE_INFINITY) - (aScore ?? Number.NEGATIVE_INFINITY);
235
+ if (relevanceDiff !== 0) return relevanceDiff;
236
+ }
237
+ if (sort === "downloads") return b.downloads - a.downloads;
238
+ if (sort === "newest") return Number(b.updatedAt) - Number(a.updatedAt);
239
+ return 0;
240
+ });
241
+ }
242
+ function publicPackageItem(row) {
243
+ const { searchScore: _searchScore, ...item } = row;
244
+ return item;
245
+ }
221
246
  function mapSortParam(sort) {
222
247
  if (sort === "downloads") return "downloads";
223
248
  if (sort === "newest") return "newest";
@@ -241,12 +266,11 @@ const clawHubMarketplaceAdapter = {
241
266
  const enrichmentBySlug = /* @__PURE__ */ new Map();
242
267
  if (listSettled.status === "fulfilled") for (const it of listSettled.value.items) enrichmentBySlug.set(it.slug, it);
243
268
  let rows = searchResponse.value.results.filter((r) => !r.source || r.source === "clawhub").map((r) => convertSearchResultToPackageItem(r, enrichmentBySlug.get(r.slug)));
244
- if (params.sort === "downloads") rows = [...rows].sort((a, b) => b.downloads - a.downloads);
245
- else if (params.sort === "newest") rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
269
+ rows = sortClawHubSearchRows(rows, params.sort);
246
270
  const total = rows.length;
247
271
  const start = (page - 1) * pageSize;
248
272
  return {
249
- items: rows.slice(start, start + pageSize),
273
+ items: rows.slice(start, start + pageSize).map(publicPackageItem),
250
274
  meta: {
251
275
  page,
252
276
  pageSize,
@@ -385,9 +385,27 @@ function lightmakeHitToPackageItem(hit) {
385
385
  updatedAt: String(updated),
386
386
  categories: cat ? [cat] : [],
387
387
  stars: typeof hit.stars === "number" ? hit.stars : void 0,
388
- sourceLabel: sourceLabelFromSkillSource(hit.source) ?? "Lightmake"
388
+ sourceLabel: sourceLabelFromSkillSource(hit.source) ?? "Lightmake",
389
+ searchScore: typeof hit.score === "number" && Number.isFinite(hit.score) ? hit.score : void 0
389
390
  };
390
391
  }
392
+ function sortSkillHubSearchRows(rows, sort) {
393
+ return [...rows].sort((a, b) => {
394
+ const aScore = a.searchScore;
395
+ const bScore = b.searchScore;
396
+ if (aScore !== void 0 || bScore !== void 0) {
397
+ const relevanceDiff = (bScore ?? Number.NEGATIVE_INFINITY) - (aScore ?? Number.NEGATIVE_INFINITY);
398
+ if (relevanceDiff !== 0) return relevanceDiff;
399
+ }
400
+ if (sort === "downloads") return b.downloads - a.downloads;
401
+ if (sort === "newest") return Number(b.updatedAt) - Number(a.updatedAt);
402
+ return 0;
403
+ });
404
+ }
405
+ function publicPackageItem(row) {
406
+ const { searchScore: _searchScore, ...item } = row;
407
+ return item;
408
+ }
391
409
  async function searchSkillHubLightmake(urls, query, limit, timeoutMs = 4e3) {
392
410
  const q = query.trim().toLowerCase();
393
411
  if (!q) return [];
@@ -665,12 +683,11 @@ const skillHubMarketplaceAdapter = {
665
683
  }
666
684
  }
667
685
  rows = filterByCategory(rows, params.category);
668
- if (params.sort === "downloads") rows = [...rows].sort((a, b) => b.downloads - a.downloads);
669
- else if (params.sort === "newest") rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
686
+ rows = sortSkillHubSearchRows(rows, params.sort);
670
687
  const total = rows.length;
671
688
  const start = (page - 1) * pageSize;
672
689
  return {
673
- items: rows.slice(start, start + pageSize),
690
+ items: rows.slice(start, start + pageSize).map(publicPackageItem),
674
691
  meta: {
675
692
  page,
676
693
  pageSize,
@@ -1,16 +1,19 @@
1
1
  import { registerMarketplaceAdapter } from "../../registry.js";
2
2
  import { buildSkillMarkdownPreviewFromRaw } from "../../../skill-markdown-preview-from-raw.js";
3
- import { downloadSkillZipBuffer, fetchMarketplacePackageDetail, listSkillPackages, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 } from "./store-api-client.js";
3
+ import { downloadSkillZipBuffer, fetchMarketplacePackageDetail, listSkillCategories, listSkillPackages, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 } from "./store-api-client.js";
4
4
  //#region src/agent/skills/marketplace/adapters/store/adapter.ts
5
5
  const storeMarketplaceAdapter = {
6
6
  id: "store",
7
- async listCategories(_config) {
8
- return [];
7
+ async listCategories(config, options) {
8
+ return listSkillCategories(resolveSkillsStoreBaseUrl(config), options?.locale);
9
9
  },
10
10
  async listPackages(config, params) {
11
11
  const response = await listSkillPackages(resolveSkillsStoreBaseUrl(config), params);
12
12
  return {
13
- items: response.items,
13
+ items: response.items.map((item) => ({
14
+ ...item,
15
+ categories: item.category ? [item.category] : []
16
+ })),
14
17
  meta: response.meta,
15
18
  provider: "store"
16
19
  };
@@ -38,6 +38,8 @@ export interface SkillsStorePackageListItem {
38
38
  };
39
39
  latestVersion?: string;
40
40
  updatedAt: string;
41
+ /** Stable primary category id from XOPC Store. */
42
+ category?: string | null;
41
43
  /** Taxonomy / tags from the marketplace (adapter-specific). */
42
44
  categories?: string[];
43
45
  tags?: string[];
@@ -70,6 +72,7 @@ export declare function getStoreOrigin(baseUrl: string): string;
70
72
  */
71
73
  export declare function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL;
72
74
  export declare function listSkillPackages(storeBaseUrl: string, params: SkillsStoreListParams): Promise<SkillsStoreListResponse>;
75
+ export declare function listSkillCategories(storeBaseUrl: string, locale?: string): Promise<MarketplaceCategoryOption[]>;
73
76
  /** Public connector catalog exposed by xopc-store. */
74
77
  export declare function listConnectorPackages(storeBaseUrl: string, params: SkillsStoreListParams): Promise<SkillsStoreListResponse>;
75
78
  /** GET /api/v1/packages/:name — published skill package (public). */
@@ -94,6 +94,12 @@ async function listSkillPackages(storeBaseUrl, params) {
94
94
  if (params.category?.trim()) sp.set("category", params.category.trim());
95
95
  return fetchJson(`${base}/api/v1/packages?${sp.toString()}`);
96
96
  }
97
+ async function listSkillCategories(storeBaseUrl, locale) {
98
+ const base = normalizeBaseUrl(storeBaseUrl);
99
+ const sp = new URLSearchParams({ type: "skill" });
100
+ if (locale?.trim()) sp.set("locale", locale.trim());
101
+ return (await fetchJson(`${base}/api/v1/packages/categories?${sp.toString()}`)).items;
102
+ }
97
103
  /** Public connector catalog exposed by xopc-store. */
98
104
  async function listConnectorPackages(storeBaseUrl, params) {
99
105
  const base = normalizeBaseUrl(storeBaseUrl);
@@ -224,4 +230,4 @@ function skillIdForMarketplaceInstall(packageName) {
224
230
  return isValidSkillId(trimmed) ? trimmed : void 0;
225
231
  }
226
232
  //#endregion
227
- export { MAX_EXTENSION_STORE_ZIP_BYTES, assertDownloadUrlAllowed, downloadConnectorStoreZipBuffer, downloadExtensionStoreZipBuffer, downloadSkillZipBuffer, fetchMarketplacePackageDetail, fetchStoreConnectorPackageDetail, getStoreOrigin, listConnectorPackages, listSkillPackages, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 };
233
+ export { MAX_EXTENSION_STORE_ZIP_BYTES, assertDownloadUrlAllowed, downloadConnectorStoreZipBuffer, downloadExtensionStoreZipBuffer, downloadSkillZipBuffer, fetchMarketplacePackageDetail, fetchStoreConnectorPackageDetail, getStoreOrigin, listConnectorPackages, listSkillCategories, listSkillPackages, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall, verifyStoreArtifactSha256 };
@@ -1,9 +1,9 @@
1
1
  import type { Config } from '../../../config/schema.js';
2
- export declare const SKILL_MARKETPLACE_SEARCH_SOURCES: readonly ["store", "clawhub", "skills-sh"];
2
+ export declare const SKILL_MARKETPLACE_SEARCH_SOURCES: readonly ["store", "skillhub", "clawhub", "skills-sh"];
3
3
  export type SkillsMarketplaceSearchSource = (typeof SKILL_MARKETPLACE_SEARCH_SOURCES)[number];
4
4
  export interface SkillsMarketplaceSearchResult {
5
5
  id: string;
6
- provider: 'store' | 'clawhub';
6
+ provider: 'store' | 'skillhub' | 'clawhub';
7
7
  source: SkillsMarketplaceSearchSource;
8
8
  name: string;
9
9
  description: string;
@@ -3,6 +3,7 @@ import { listMarketplacePackages } from "../skills-marketplace.js";
3
3
  //#region src/agent/skills/marketplace/search.ts
4
4
  const SKILL_MARKETPLACE_SEARCH_SOURCES = [
5
5
  "store",
6
+ "skillhub",
6
7
  "clawhub",
7
8
  "skills-sh"
8
9
  ];
@@ -94,6 +95,34 @@ function fromClawHub(item) {
94
95
  valueScore: 0
95
96
  };
96
97
  }
98
+ function absoluteSkillHubUrl(slug) {
99
+ const normalized = slug.trim();
100
+ return normalized ? `https://skillhub.cn/skills/${encodeURIComponent(normalized)}` : null;
101
+ }
102
+ function fromMarketplacePackage(provider, item) {
103
+ return {
104
+ id: item.id,
105
+ provider,
106
+ source: provider,
107
+ name: item.name,
108
+ description: item.description,
109
+ author: item.author.username,
110
+ downloads: boundedNumber(item.downloads),
111
+ stars: boundedNumber(item.stars),
112
+ updatedAt: normalizeDate(item.updatedAt),
113
+ canonicalUrl: provider === "skillhub" ? absoluteSkillHubUrl(item.id) : null,
114
+ install: {
115
+ kind: provider,
116
+ reference: provider === "store" ? item.name : item.id,
117
+ sourceUrl: null
118
+ },
119
+ security: {
120
+ status: "unknown",
121
+ scanners: []
122
+ },
123
+ valueScore: 0
124
+ };
125
+ }
97
126
  function dedupeAndRank(query, rows) {
98
127
  const unique = /* @__PURE__ */ new Map();
99
128
  for (const row of rows) {
@@ -121,36 +150,38 @@ async function searchSkillMarketplaces(params) {
121
150
  pageSize: fetchLimit,
122
151
  sort: "downloads"
123
152
  }, "store");
124
- for (const item of response.items) rows.push({
125
- id: item.id,
126
- provider: "store",
153
+ for (const item of response.items) rows.push(fromMarketplacePackage("store", item));
154
+ statuses.push({
127
155
  source: "store",
128
- name: item.name,
129
- description: item.description,
130
- author: item.author.username,
131
- downloads: boundedNumber(item.downloads),
132
- stars: boundedNumber(item.stars),
133
- updatedAt: normalizeDate(item.updatedAt),
134
- canonicalUrl: null,
135
- install: {
136
- kind: "store",
137
- reference: item.name,
138
- sourceUrl: null
139
- },
140
- security: {
141
- status: "unknown",
142
- scanners: []
143
- },
144
- valueScore: 0
156
+ ok: true,
157
+ count: response.items.length
145
158
  });
159
+ } catch (error) {
146
160
  statuses.push({
147
161
  source: "store",
162
+ ok: false,
163
+ count: 0,
164
+ error: String(error)
165
+ });
166
+ }
167
+ })());
168
+ if (requested.has("skillhub")) jobs.push((async () => {
169
+ try {
170
+ const response = await listMarketplacePackages(params.config, {
171
+ q: params.query,
172
+ page: 1,
173
+ pageSize: fetchLimit,
174
+ sort: "downloads"
175
+ }, "skillhub");
176
+ for (const item of response.items) rows.push(fromMarketplacePackage("skillhub", item));
177
+ statuses.push({
178
+ source: "skillhub",
148
179
  ok: true,
149
180
  count: response.items.length
150
181
  });
151
182
  } catch (error) {
152
183
  statuses.push({
153
- source: "store",
184
+ source: "skillhub",
154
185
  ok: false,
155
186
  count: 0,
156
187
  error: String(error)
@@ -10,7 +10,7 @@ export { getMarketplaceAdapter, getMarketplaceProviderDisplayName, resolveSkills
10
10
  export { registerMarketplaceAdapter } from './marketplace/registry.js';
11
11
  export type { MarketplaceAdapterRegistration } from './marketplace/registry.js';
12
12
  export type { MarketplaceCategoryOption, MarketplacePackageDetail, SkillsStoreListParams, SkillsStoreListResponse, UnifiedMarketplaceListResponse, UnifiedMarketplacePackageDetail, } from './marketplace/adapters/store/store-api-client.js';
13
- export declare function listMarketplaceCategories(config: Config, provider?: string): Promise<{
13
+ export declare function listMarketplaceCategories(config: Config, provider?: string, locale?: string): Promise<{
14
14
  items: MarketplaceCategoryOption[];
15
15
  }>;
16
16
  export declare function listMarketplacePackages(config: Config, params: SkillsStoreListParams, provider?: string): Promise<UnifiedMarketplaceListResponse>;