@xopcai/xopc 0.0.29 → 0.0.31

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 (632) hide show
  1. package/dist/extensions/telegram/src/adapters/config-surface.js +3 -1
  2. package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
  3. package/dist/extensions/telegram/src/adapters/onboard-cli.js +23 -21
  4. package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
  5. package/dist/extensions/telegram/src/adapters/setup-wizard.js +3 -4
  6. package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +1 -1
  7. package/dist/extensions/telegram/src/config-schema.d.ts +0 -1
  8. package/dist/extensions/telegram/src/config-schema.js +17 -4
  9. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  10. package/dist/extensions/telegram/src/plugin.js +4 -17
  11. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  14. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  16. package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js +216 -0
  17. package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js.map +1 -0
  18. package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js → apps-page-CWegY6Kp.js} +2 -2
  19. package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js.map → apps-page-CWegY6Kp.js.map} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js +9 -0
  21. package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js.map +1 -0
  22. package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js +3 -0
  23. package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js.map +1 -0
  24. package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js +2 -0
  25. package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js.map +1 -0
  26. package/dist/gateway/static/root/assets/dist-D0jxbvuz.js +2 -0
  27. package/dist/gateway/static/root/assets/{dist--p2HQ2QF.js.map → dist-D0jxbvuz.js.map} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js → extension-debug-page-DB630cW8.js} +2 -2
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js.map → extension-debug-page-DB630cW8.js.map} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js → extension-page-CnoPUBul.js} +2 -2
  31. package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js.map → extension-page-CnoPUBul.js.map} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js → extension-settings-page-BsiOkvBe.js} +2 -2
  33. package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js.map → extension-settings-page-BsiOkvBe.js.map} +1 -1
  34. package/dist/gateway/static/root/assets/{index-CR8zUHGR.js → index-DHLmAIQl.js} +63 -63
  35. package/dist/gateway/static/root/assets/{index-CR8zUHGR.js.map → index-DHLmAIQl.js.map} +1 -1
  36. package/dist/gateway/static/root/assets/index-DoPwy4aU.css +1 -0
  37. package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js +2 -0
  38. package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js.map +1 -0
  39. package/dist/gateway/static/root/assets/sessions-page-Q201-_lP.js +2 -0
  40. package/dist/gateway/static/root/assets/{sessions-page-Be5kIGl_.js.map → sessions-page-Q201-_lP.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js +2 -0
  42. package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js.map +1 -0
  43. package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js +3 -0
  44. package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js.map +1 -0
  45. package/dist/gateway/static/root/index.html +2 -2
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-manager.d.ts +5 -7
  48. package/dist/src/agent/agent-manager.js +21 -19
  49. package/dist/src/agent/agent-manager.js.map +1 -1
  50. package/dist/src/agent/ipc/inbox.js +4 -2
  51. package/dist/src/agent/ipc/inbox.js.map +1 -1
  52. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  53. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  54. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  55. package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
  56. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  57. package/dist/src/agent/prompt/system-prompt.d.ts +0 -2
  58. package/dist/src/agent/prompt/system-prompt.js +3 -17
  59. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  60. package/dist/src/agent/service/btw-query.d.ts +16 -0
  61. package/dist/src/agent/service/btw-query.js +88 -0
  62. package/dist/src/agent/service/btw-query.js.map +1 -0
  63. package/dist/src/agent/service/build-direct-message-content.d.ts +30 -0
  64. package/dist/src/agent/service/build-direct-message-content.js +75 -0
  65. package/dist/src/agent/service/build-direct-message-content.js.map +1 -0
  66. package/dist/src/agent/service/parse-outbound-session-key.d.ts +8 -0
  67. package/dist/src/agent/service/parse-outbound-session-key.js +41 -0
  68. package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -0
  69. package/dist/src/agent/service/process-direct-one-shot.d.ts +34 -0
  70. package/dist/src/agent/service/process-direct-one-shot.js +67 -0
  71. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -0
  72. package/dist/src/agent/service/process-direct-streaming.js +12 -1
  73. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  74. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +6 -0
  75. package/dist/src/agent/service/reconcile-dreaming-cron.js +70 -0
  76. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -0
  77. package/dist/src/agent/service/session-context-report.d.ts +19 -0
  78. package/dist/src/agent/service/session-context-report.js +47 -0
  79. package/dist/src/agent/service/session-context-report.js.map +1 -0
  80. package/dist/src/agent/service/webchat-tts.d.ts +28 -0
  81. package/dist/src/agent/service/webchat-tts.js +73 -0
  82. package/dist/src/agent/service/webchat-tts.js.map +1 -0
  83. package/dist/src/agent/service.d.ts +8 -12
  84. package/dist/src/agent/service.js +74 -379
  85. package/dist/src/agent/service.js.map +1 -1
  86. package/dist/src/agent/skills/config.js +4 -3
  87. package/dist/src/agent/skills/config.js.map +1 -1
  88. package/dist/src/agent/skills/format-skills-prompt.d.ts +0 -2
  89. package/dist/src/agent/skills/format-skills-prompt.js +3 -24
  90. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  91. package/dist/src/agent/skills/hub-lock.js +4 -5
  92. package/dist/src/agent/skills/hub-lock.js.map +1 -1
  93. package/dist/src/agent/skills/index.js +9 -21
  94. package/dist/src/agent/skills/index.js.map +1 -1
  95. package/dist/src/agent/skills/marketplace/adapter.types.d.ts +17 -0
  96. package/dist/src/agent/skills/marketplace/adapter.types.js +1 -0
  97. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.d.ts +2 -0
  98. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +292 -0
  99. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -0
  100. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.d.ts +73 -0
  101. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js +200 -0
  102. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js.map +1 -0
  103. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.d.ts +137 -0
  104. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js +217 -0
  105. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js.map +1 -0
  106. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.d.ts +12 -0
  107. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js +90 -0
  108. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js.map +1 -0
  109. package/dist/src/agent/skills/marketplace/adapters/store/adapter.d.ts +2 -0
  110. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +35 -0
  111. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -0
  112. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +124 -0
  113. package/dist/src/agent/skills/{skills-store-client.js → marketplace/adapters/store/store-api-client.js} +4 -3
  114. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -0
  115. package/dist/src/agent/skills/marketplace/resolve-adapter.d.ts +6 -0
  116. package/dist/src/agent/skills/marketplace/resolve-adapter.js +26 -0
  117. package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -0
  118. package/dist/src/agent/skills/parse-skill-metadata.d.ts +5 -0
  119. package/dist/src/agent/skills/parse-skill-metadata.js +27 -0
  120. package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -0
  121. package/dist/src/agent/skills/skill-markdown-preview-from-raw.d.ts +6 -0
  122. package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +64 -0
  123. package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +1 -0
  124. package/dist/src/agent/skills/skill-view-path.d.ts +17 -1
  125. package/dist/src/agent/skills/skill-view-path.js +66 -3
  126. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  127. package/dist/src/agent/skills/skills-marketplace.d.ts +21 -0
  128. package/dist/src/agent/skills/skills-marketplace.js +18 -0
  129. package/dist/src/agent/skills/skills-marketplace.js.map +1 -0
  130. package/dist/src/agent/skills/test-framework.d.ts +0 -1
  131. package/dist/src/agent/skills/test-framework.js +2 -20
  132. package/dist/src/agent/skills/test-framework.js.map +1 -1
  133. package/dist/src/agent/skills/types.d.ts +12 -6
  134. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  135. package/dist/src/agent/tools/image-generate-tool.js +2 -2
  136. package/dist/src/auth/credentials.js +8 -6
  137. package/dist/src/auth/credentials.js.map +1 -1
  138. package/dist/src/auth/profiles/store.js +5 -3
  139. package/dist/src/auth/profiles/store.js.map +1 -1
  140. package/dist/src/channels/manager.js +1 -1
  141. package/dist/src/channels/outbound/persist-store.js +4 -4
  142. package/dist/src/channels/outbound/persist-store.js.map +1 -1
  143. package/dist/src/cli/commands/config.js +8 -6
  144. package/dist/src/cli/commands/config.js.map +1 -1
  145. package/dist/src/cli/commands/doctor/checks/channel-config.js +3 -4
  146. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  147. package/dist/src/cli/commands/init.js +4 -2
  148. package/dist/src/cli/commands/init.js.map +1 -1
  149. package/dist/src/config/loader.js +3 -1
  150. package/dist/src/config/loader.js.map +1 -1
  151. package/dist/src/config/models-json.js +4 -5
  152. package/dist/src/config/models-json.js.map +1 -1
  153. package/dist/src/config/schema.d.ts +12 -4
  154. package/dist/src/config/schema.js +31 -5
  155. package/dist/src/config/schema.js.map +1 -1
  156. package/dist/src/cron/persistence.d.ts +1 -3
  157. package/dist/src/cron/persistence.js +6 -17
  158. package/dist/src/cron/persistence.js.map +1 -1
  159. package/dist/src/cron/validation.js +1 -1
  160. package/dist/src/cron/validation.js.map +1 -1
  161. package/dist/src/extensions/activation-context.js +0 -1
  162. package/dist/src/extensions/activation-context.js.map +1 -1
  163. package/dist/src/extensions/lockfile.js +4 -2
  164. package/dist/src/extensions/lockfile.js.map +1 -1
  165. package/dist/src/gateway/auth.d.ts +0 -9
  166. package/dist/src/gateway/auth.js +1 -12
  167. package/dist/src/gateway/auth.js.map +1 -1
  168. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
  169. package/dist/src/gateway/hono/lib/extension-store.js +4 -4
  170. package/dist/src/gateway/hono/lib/extension-store.js.map +1 -1
  171. package/dist/src/gateway/hono/routes/channels.js +5 -3
  172. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  173. package/dist/src/gateway/hono/routes/commands-skills.js +28 -3
  174. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  175. package/dist/src/gateway/hono/routes/config.js +23 -2
  176. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  177. package/dist/src/gateway/hono/routes/sessions.js +124 -2
  178. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  179. package/dist/src/gateway/hono/sse.js +9 -2
  180. package/dist/src/gateway/hono/sse.js.map +1 -1
  181. package/dist/src/gateway/index.js +2 -2
  182. package/dist/src/gateway/lock.js +1 -1
  183. package/dist/src/gateway/service/run-gateway-agent.d.ts +37 -0
  184. package/dist/src/gateway/service/run-gateway-agent.js +163 -0
  185. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -0
  186. package/dist/src/gateway/service/save-webchat-user-message.d.ts +9 -0
  187. package/dist/src/gateway/service/save-webchat-user-message.js +34 -0
  188. package/dist/src/gateway/service/save-webchat-user-message.js.map +1 -0
  189. package/dist/src/gateway/service/session-chat-ids.d.ts +9 -0
  190. package/dist/src/gateway/service/session-chat-ids.js +33 -0
  191. package/dist/src/gateway/service/session-chat-ids.js.map +1 -0
  192. package/dist/src/gateway/service/sse-hub.d.ts +10 -0
  193. package/dist/src/gateway/service/sse-hub.js +55 -0
  194. package/dist/src/gateway/service/sse-hub.js.map +1 -0
  195. package/dist/src/gateway/service/types.d.ts +9 -0
  196. package/dist/src/gateway/service/types.js +1 -0
  197. package/dist/src/gateway/service.d.ts +42 -33
  198. package/dist/src/gateway/service.js +92 -246
  199. package/dist/src/gateway/service.js.map +1 -1
  200. package/dist/src/infra/update-lock.js +4 -2
  201. package/dist/src/infra/update-lock.js.map +1 -1
  202. package/dist/src/infra/update-startup.js +5 -14
  203. package/dist/src/infra/update-startup.js.map +1 -1
  204. package/dist/src/infra/write-file-atomic.d.ts +18 -0
  205. package/dist/src/infra/write-file-atomic.js +115 -0
  206. package/dist/src/infra/write-file-atomic.js.map +1 -0
  207. package/dist/src/session/abort-cutoff.d.ts +6 -0
  208. package/dist/src/session/abort-cutoff.js +10 -0
  209. package/dist/src/session/abort-cutoff.js.map +1 -0
  210. package/dist/src/session/compaction-checkpoints.d.ts +8 -0
  211. package/dist/src/session/compaction-checkpoints.js +21 -0
  212. package/dist/src/session/compaction-checkpoints.js.map +1 -0
  213. package/dist/src/session/config-store.js +4 -2
  214. package/dist/src/session/config-store.js.map +1 -1
  215. package/dist/src/session/index.d.ts +8 -1
  216. package/dist/src/session/index.js +7 -1
  217. package/dist/src/session/manager.d.ts +26 -1
  218. package/dist/src/session/manager.js +39 -2
  219. package/dist/src/session/manager.js.map +1 -1
  220. package/dist/src/session/patch-metadata.d.ts +12 -0
  221. package/dist/src/session/patch-metadata.js +23 -0
  222. package/dist/src/session/patch-metadata.js.map +1 -0
  223. package/dist/src/session/search-index.d.ts +2 -0
  224. package/dist/src/session/search-index.js +30 -2
  225. package/dist/src/session/search-index.js.map +1 -1
  226. package/dist/src/session/session-context-for-llm.d.ts +32 -0
  227. package/dist/src/session/session-context-for-llm.js +60 -0
  228. package/dist/src/session/session-context-for-llm.js.map +1 -0
  229. package/dist/src/session/store.d.ts +53 -2
  230. package/dist/src/session/store.js +427 -145
  231. package/dist/src/session/store.js.map +1 -1
  232. package/dist/src/session/strip-webchat-early-save.d.ts +5 -0
  233. package/dist/src/session/strip-webchat-early-save.js +17 -0
  234. package/dist/src/session/strip-webchat-early-save.js.map +1 -0
  235. package/dist/src/session/transcript-format.d.ts +46 -0
  236. package/dist/src/session/transcript-format.js +88 -0
  237. package/dist/src/session/transcript-format.js.map +1 -0
  238. package/dist/src/session/types.d.ts +37 -0
  239. package/dist/src/session/types.js.map +1 -1
  240. package/dist/src/utils/logger/log-store.js +4 -3
  241. package/dist/src/utils/logger/log-store.js.map +1 -1
  242. package/dist/src/voice/tts/merge-config.js +0 -1
  243. package/dist/src/voice/tts/merge-config.js.map +1 -1
  244. package/dist/src/voice/tts/service.js +1 -2
  245. package/dist/src/voice/tts/service.js.map +1 -1
  246. package/package.json +1 -1
  247. package/skills/business/company-values/SKILL-zh.md +80 -0
  248. package/skills/business/company-values/SKILL.md +80 -0
  249. package/skills/business/find-community/SKILL-zh.md +50 -0
  250. package/skills/business/find-community/SKILL.md +50 -0
  251. package/skills/business/first-customers/SKILL-zh.md +76 -0
  252. package/skills/business/first-customers/SKILL.md +76 -0
  253. package/skills/business/grow-sustainably/SKILL-zh.md +92 -0
  254. package/skills/business/grow-sustainably/SKILL.md +92 -0
  255. package/skills/business/marketing-plan/SKILL-zh.md +100 -0
  256. package/skills/business/marketing-plan/SKILL.md +100 -0
  257. package/skills/business/minimalist-review/SKILL-zh.md +82 -0
  258. package/skills/business/minimalist-review/SKILL.md +82 -0
  259. package/skills/business/mvp/SKILL-zh.md +81 -0
  260. package/skills/business/mvp/SKILL.md +81 -0
  261. package/skills/business/pricing/SKILL-zh.md +64 -0
  262. package/skills/business/pricing/SKILL.md +64 -0
  263. package/skills/business/processize/SKILL-zh.md +91 -0
  264. package/skills/business/processize/SKILL.md +91 -0
  265. package/skills/business/validate-idea/SKILL-zh.md +68 -0
  266. package/skills/business/validate-idea/SKILL.md +68 -0
  267. package/skills/{skill-creator → creative/algorithmic-art}/LICENSE.txt +1 -1
  268. package/skills/creative/algorithmic-art/SKILL-zh.md +405 -0
  269. package/skills/creative/algorithmic-art/SKILL.md +405 -0
  270. package/skills/creative/algorithmic-art/templates/generator_template.js +223 -0
  271. package/skills/creative/algorithmic-art/templates/viewer.html +599 -0
  272. package/skills/creative/canvas-design/LICENSE.txt +202 -0
  273. package/skills/creative/canvas-design/SKILL-zh.md +130 -0
  274. package/skills/creative/canvas-design/SKILL.md +130 -0
  275. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  276. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  277. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  278. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  279. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  280. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  281. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  282. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  283. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  284. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  285. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  286. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  287. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  288. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  289. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  290. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  291. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  292. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  293. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  294. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  295. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  296. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  297. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  298. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  299. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  300. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  301. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  302. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  303. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  304. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  305. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  306. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  307. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  308. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  309. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  310. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  311. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  312. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  313. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  314. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  315. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  316. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  317. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  318. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  319. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  320. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  321. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  322. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  323. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  324. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  325. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  326. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  327. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  328. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  329. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  330. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  331. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  332. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  333. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  334. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  335. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  336. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  337. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  338. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  339. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  340. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  341. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  342. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  343. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  344. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  345. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  346. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  347. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  348. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  349. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  350. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  351. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  352. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  353. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  354. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  355. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  356. package/skills/creative/frontend-design/LICENSE.txt +177 -0
  357. package/skills/creative/frontend-design/SKILL-zh.md +42 -0
  358. package/skills/creative/frontend-design/SKILL.md +42 -0
  359. package/skills/creative/theme-factory/LICENSE.txt +202 -0
  360. package/skills/creative/theme-factory/SKILL-zh.md +59 -0
  361. package/skills/creative/theme-factory/SKILL.md +59 -0
  362. package/skills/creative/theme-factory/theme-showcase.pdf +0 -0
  363. package/skills/creative/theme-factory/themes/arctic-frost.md +19 -0
  364. package/skills/creative/theme-factory/themes/botanical-garden.md +19 -0
  365. package/skills/creative/theme-factory/themes/desert-rose.md +19 -0
  366. package/skills/creative/theme-factory/themes/forest-canopy.md +19 -0
  367. package/skills/creative/theme-factory/themes/golden-hour.md +19 -0
  368. package/skills/creative/theme-factory/themes/midnight-galaxy.md +19 -0
  369. package/skills/creative/theme-factory/themes/modern-minimalist.md +19 -0
  370. package/skills/creative/theme-factory/themes/ocean-depths.md +19 -0
  371. package/skills/creative/theme-factory/themes/sunset-boulevard.md +19 -0
  372. package/skills/creative/theme-factory/themes/tech-innovation.md +19 -0
  373. package/skills/creative/web-artifacts-builder/LICENSE.txt +202 -0
  374. package/skills/creative/web-artifacts-builder/SKILL-zh.md +74 -0
  375. package/skills/creative/web-artifacts-builder/SKILL.md +74 -0
  376. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  377. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  378. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  379. package/skills/documents/doc-coauthoring/SKILL-zh.md +375 -0
  380. package/skills/documents/doc-coauthoring/SKILL.md +375 -0
  381. package/skills/documents/docx/SKILL-zh.md +590 -0
  382. package/skills/{docx → documents/docx}/SKILL.md +11 -11
  383. package/skills/{docx → documents/docx}/scripts/comment.py +2 -2
  384. package/skills/{docx → documents/docx}/scripts/office/helpers/simplify_redlines.py +1 -1
  385. package/skills/{docx → documents/docx}/scripts/office/pack.py +2 -2
  386. package/skills/{xlsx → documents/docx}/scripts/office/validate.py +2 -2
  387. package/skills/{xlsx → documents/docx}/scripts/office/validators/redlining.py +1 -1
  388. package/skills/documents/pdf/SKILL-zh.md +314 -0
  389. package/skills/documents/pptx/SKILL-zh.md +232 -0
  390. package/skills/{pptx → documents/pptx}/editing.md +3 -3
  391. package/skills/{pptx → documents/pptx}/scripts/office/helpers/simplify_redlines.py +1 -1
  392. package/skills/{xlsx → documents/pptx}/scripts/office/pack.py +2 -2
  393. package/skills/{pptx → documents/pptx}/scripts/office/validate.py +2 -2
  394. package/skills/{docx → documents/pptx}/scripts/office/validators/redlining.py +1 -1
  395. package/skills/documents/xlsx/SKILL-zh.md +292 -0
  396. package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/simplify_redlines.py +1 -1
  397. package/skills/{pptx → documents/xlsx}/scripts/office/pack.py +2 -2
  398. package/skills/{docx → documents/xlsx}/scripts/office/validate.py +2 -2
  399. package/skills/{pptx → documents/xlsx}/scripts/office/validators/redlining.py +1 -1
  400. package/skills/meta/skill-creator/LICENSE.txt +202 -0
  401. package/skills/meta/skill-creator/SKILL-zh.md +483 -0
  402. package/skills/{skill-creator → meta/skill-creator}/SKILL.md +0 -1
  403. package/skills/tools/find-skills/SKILL-zh.md +440 -0
  404. package/skills/tools/github/SKILL-zh.md +48 -0
  405. package/skills/tools/internal-comms/LICENSE.txt +202 -0
  406. package/skills/tools/internal-comms/SKILL-zh.md +32 -0
  407. package/skills/tools/internal-comms/SKILL.md +32 -0
  408. package/skills/tools/internal-comms/examples/3p-updates.md +47 -0
  409. package/skills/tools/internal-comms/examples/company-newsletter.md +65 -0
  410. package/skills/tools/internal-comms/examples/faq-answers.md +30 -0
  411. package/skills/tools/internal-comms/examples/general-comms.md +16 -0
  412. package/skills/tools/summarize/SKILL-zh.md +47 -0
  413. package/skills/tools/weather/SKILL-zh.md +46 -0
  414. package/skills/tools/webapp-testing/LICENSE.txt +202 -0
  415. package/skills/tools/webapp-testing/SKILL-zh.md +96 -0
  416. package/skills/tools/webapp-testing/SKILL.md +96 -0
  417. package/skills/tools/webapp-testing/examples/console_logging.py +35 -0
  418. package/skills/tools/webapp-testing/examples/element_discovery.py +40 -0
  419. package/skills/tools/webapp-testing/examples/static_html_automation.py +33 -0
  420. package/skills/tools/webapp-testing/scripts/with_server.py +106 -0
  421. package/dist/gateway/static/root/assets/agents-CkgFSiCY.js +0 -216
  422. package/dist/gateway/static/root/assets/agents-CkgFSiCY.js.map +0 -1
  423. package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js +0 -9
  424. package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js.map +0 -1
  425. package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js +0 -2
  426. package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js.map +0 -1
  427. package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js +0 -3
  428. package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js.map +0 -1
  429. package/dist/gateway/static/root/assets/dist--p2HQ2QF.js +0 -2
  430. package/dist/gateway/static/root/assets/index-Dnfha4O2.css +0 -1
  431. package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js +0 -2
  432. package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js.map +0 -1
  433. package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js +0 -2
  434. package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js +0 -2
  435. package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js.map +0 -1
  436. package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js +0 -3
  437. package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js.map +0 -1
  438. package/dist/src/agent/skills/skills-store-client.d.ts +0 -66
  439. package/dist/src/agent/skills/skills-store-client.js.map +0 -1
  440. package/dist/src/stt/index.d.ts +0 -1
  441. package/dist/src/stt/index.js +0 -8
  442. /package/skills/{docx → documents/docx}/LICENSE.txt +0 -0
  443. /package/skills/{docx → documents/docx}/scripts/__init__.py +0 -0
  444. /package/skills/{docx → documents/docx}/scripts/accept_changes.py +0 -0
  445. /package/skills/{docx → documents/docx}/scripts/office/helpers/__init__.py +0 -0
  446. /package/skills/{docx → documents/docx}/scripts/office/helpers/merge_runs.py +0 -0
  447. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  448. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  449. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  450. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  451. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  452. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  453. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  454. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  455. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  456. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  457. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  458. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  459. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  460. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  461. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  462. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  463. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  464. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  465. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  466. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  467. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  468. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  469. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  470. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  471. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  472. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  473. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  474. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  475. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  476. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  477. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  478. /package/skills/{docx → documents/docx}/scripts/office/schemas/mce/mc.xsd +0 -0
  479. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  480. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  481. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  482. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  483. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  484. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  485. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  486. /package/skills/{docx → documents/docx}/scripts/office/soffice.py +0 -0
  487. /package/skills/{docx → documents/docx}/scripts/office/unpack.py +0 -0
  488. /package/skills/{docx → documents/docx}/scripts/office/validators/__init__.py +0 -0
  489. /package/skills/{docx → documents/docx}/scripts/office/validators/base.py +0 -0
  490. /package/skills/{docx → documents/docx}/scripts/office/validators/docx.py +0 -0
  491. /package/skills/{docx → documents/docx}/scripts/office/validators/pptx.py +0 -0
  492. /package/skills/{docx → documents/docx}/scripts/templates/comments.xml +0 -0
  493. /package/skills/{docx → documents/docx}/scripts/templates/commentsExtended.xml +0 -0
  494. /package/skills/{docx → documents/docx}/scripts/templates/commentsExtensible.xml +0 -0
  495. /package/skills/{docx → documents/docx}/scripts/templates/commentsIds.xml +0 -0
  496. /package/skills/{docx → documents/docx}/scripts/templates/people.xml +0 -0
  497. /package/skills/{pdf → documents/pdf}/LICENSE.txt +0 -0
  498. /package/skills/{pdf → documents/pdf}/SKILL.md +0 -0
  499. /package/skills/{pdf → documents/pdf}/forms.md +0 -0
  500. /package/skills/{pdf → documents/pdf}/reference.md +0 -0
  501. /package/skills/{pdf → documents/pdf}/scripts/check_bounding_boxes.py +0 -0
  502. /package/skills/{pdf → documents/pdf}/scripts/check_fillable_fields.py +0 -0
  503. /package/skills/{pdf → documents/pdf}/scripts/convert_pdf_to_images.py +0 -0
  504. /package/skills/{pdf → documents/pdf}/scripts/create_validation_image.py +0 -0
  505. /package/skills/{pdf → documents/pdf}/scripts/extract_form_field_info.py +0 -0
  506. /package/skills/{pdf → documents/pdf}/scripts/extract_form_structure.py +0 -0
  507. /package/skills/{pdf → documents/pdf}/scripts/fill_fillable_fields.py +0 -0
  508. /package/skills/{pdf → documents/pdf}/scripts/fill_pdf_form_with_annotations.py +0 -0
  509. /package/skills/{pptx → documents/pptx}/LICENSE.txt +0 -0
  510. /package/skills/{pptx → documents/pptx}/SKILL.md +0 -0
  511. /package/skills/{pptx → documents/pptx}/pptxgenjs.md +0 -0
  512. /package/skills/{pptx → documents/pptx}/scripts/__init__.py +0 -0
  513. /package/skills/{pptx → documents/pptx}/scripts/add_slide.py +0 -0
  514. /package/skills/{pptx → documents/pptx}/scripts/clean.py +0 -0
  515. /package/skills/{pptx → documents/pptx}/scripts/office/helpers/__init__.py +0 -0
  516. /package/skills/{pptx → documents/pptx}/scripts/office/helpers/merge_runs.py +0 -0
  517. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  518. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  519. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  520. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  521. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  522. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  523. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  524. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  525. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  526. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  527. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  528. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  529. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  530. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  531. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  532. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  533. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  534. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  535. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  536. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  537. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  538. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  539. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  540. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  541. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  542. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  543. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  544. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  545. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  546. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  547. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  548. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/mce/mc.xsd +0 -0
  549. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  550. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  551. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  552. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  553. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  554. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  555. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  556. /package/skills/{pptx → documents/pptx}/scripts/office/soffice.py +0 -0
  557. /package/skills/{pptx → documents/pptx}/scripts/office/unpack.py +0 -0
  558. /package/skills/{pptx → documents/pptx}/scripts/office/validators/__init__.py +0 -0
  559. /package/skills/{pptx → documents/pptx}/scripts/office/validators/base.py +0 -0
  560. /package/skills/{pptx → documents/pptx}/scripts/office/validators/docx.py +0 -0
  561. /package/skills/{pptx → documents/pptx}/scripts/office/validators/pptx.py +0 -0
  562. /package/skills/{pptx → documents/pptx}/scripts/thumbnail.py +0 -0
  563. /package/skills/{xlsx → documents/xlsx}/LICENSE.txt +0 -0
  564. /package/skills/{xlsx → documents/xlsx}/SKILL.md +0 -0
  565. /package/skills/{skill-creator/scripts → documents/xlsx/scripts/office/helpers}/__init__.py +0 -0
  566. /package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/merge_runs.py +0 -0
  567. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  568. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  569. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  570. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  571. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  572. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  573. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  574. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  575. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  576. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  577. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  578. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  579. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  580. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  581. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  582. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  583. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  584. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  585. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  586. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  587. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  588. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  589. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  590. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  591. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  592. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  593. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  594. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  595. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  596. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  597. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  598. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/mce/mc.xsd +0 -0
  599. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  600. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  601. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  602. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  603. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  604. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  605. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  606. /package/skills/{xlsx → documents/xlsx}/scripts/office/soffice.py +0 -0
  607. /package/skills/{xlsx → documents/xlsx}/scripts/office/unpack.py +0 -0
  608. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/__init__.py +0 -0
  609. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/base.py +0 -0
  610. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/docx.py +0 -0
  611. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/pptx.py +0 -0
  612. /package/skills/{xlsx → documents/xlsx}/scripts/recalc.py +0 -0
  613. /package/skills/{skill-creator → meta/skill-creator}/agents/analyzer.md +0 -0
  614. /package/skills/{skill-creator → meta/skill-creator}/agents/comparator.md +0 -0
  615. /package/skills/{skill-creator → meta/skill-creator}/agents/grader.md +0 -0
  616. /package/skills/{skill-creator → meta/skill-creator}/assets/eval_review.html +0 -0
  617. /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/generate_review.py +0 -0
  618. /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/viewer.html +0 -0
  619. /package/skills/{skill-creator → meta/skill-creator}/references/schemas.md +0 -0
  620. /package/skills/{xlsx/scripts/office/helpers → meta/skill-creator/scripts}/__init__.py +0 -0
  621. /package/skills/{skill-creator → meta/skill-creator}/scripts/aggregate_benchmark.py +0 -0
  622. /package/skills/{skill-creator → meta/skill-creator}/scripts/generate_report.py +0 -0
  623. /package/skills/{skill-creator → meta/skill-creator}/scripts/improve_description.py +0 -0
  624. /package/skills/{skill-creator → meta/skill-creator}/scripts/package_skill.py +0 -0
  625. /package/skills/{skill-creator → meta/skill-creator}/scripts/quick_validate.py +0 -0
  626. /package/skills/{skill-creator → meta/skill-creator}/scripts/run_eval.py +0 -0
  627. /package/skills/{skill-creator → meta/skill-creator}/scripts/run_loop.py +0 -0
  628. /package/skills/{skill-creator → meta/skill-creator}/scripts/utils.py +0 -0
  629. /package/skills/{find-skills → tools/find-skills}/SKILL.md +0 -0
  630. /package/skills/{github → tools/github}/SKILL.md +0 -0
  631. /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
  632. /package/skills/{weather → tools/weather}/SKILL.md +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/skillhub/registry-client.ts"],"sourcesContent":["/**\n * HTTP client for api.skillhub.cn (registry: detail, files, versions, batch, skillsets, download).\n */\n\nimport { fetch } from 'undici';\nimport { MAX_SKILL_ZIP_BYTES } from '../../../managed-store.js';\n\nconst SKILLHUB_API_BASE = 'https://api.skillhub.cn';\n\n/** Max bytes when fetching SKILL.md / README for marketplace preview (redirects to COS). */\nexport const MAX_SKILLHUB_README_BYTES = 512 * 1024;\n\nfunction basenameSkillPath(p: string): string {\n const norm = p.replace(/\\\\/g, '/');\n const parts = norm.split('/');\n return parts[parts.length - 1] || norm;\n}\n\n/**\n * Prefer SKILL.md, then README.md, then HOW_TO_USE.md (basename match, any directory depth).\n */\nexport function pickSkillHubDocFilePath(files: SkillHubFile[]): string | null {\n const rows = files.map((f) => ({\n path: f.path.replace(/\\\\/g, '/'),\n base: basenameSkillPath(f.path).toLowerCase(),\n }));\n const firstBase = (name: string) => rows.find((r) => r.base === name.toLowerCase());\n const skillMd = firstBase('SKILL.md') ?? firstBase('skill.md');\n if (skillMd) return skillMd.path;\n const readme = firstBase('README.md') ?? firstBase('readme.md');\n if (readme) return readme.path;\n const how = firstBase('HOW_TO_USE.md');\n if (how) return how.path;\n return null;\n}\n\nfunction assertSkillHubReadmeResponseUrl(finalUrl: string): void {\n let u: URL;\n try {\n u = new URL(finalUrl);\n } catch {\n throw new Error('Invalid SkillHub file response URL');\n }\n if (u.protocol !== 'https:') {\n throw new Error('SkillHub file response must use HTTPS');\n }\n const host = u.hostname.toLowerCase();\n if (host === 'api.skillhub.cn') return;\n if (host.endsWith('.myqcloud.com')) return;\n throw new Error('SkillHub file redirect host is not allowlisted');\n}\n\n/**\n * Fetches a single text file from the registry (follows redirect to COS when applicable).\n */\nexport async function getSkillHubSkillFileText(\n slug: string,\n filePath: string,\n version?: string,\n): Promise<string> {\n const enc = encodeURIComponent(slug.trim());\n const normPath = filePath.replace(/\\\\/g, '/');\n const sp = new URLSearchParams({ path: normPath });\n if (version?.trim()) sp.set('version', version.trim());\n const url = `${SKILLHUB_API_BASE}/api/v1/skills/${enc}/file?${sp.toString()}`;\n const res = await fetch(url, {\n redirect: 'follow',\n headers: { Accept: 'text/markdown,text/plain,*/*' },\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n let msg = `SkillHub file request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { message?: string; error?: string };\n if (typeof j.message === 'string') msg = j.message;\n else if (typeof j.error === 'string') msg = j.error;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n assertSkillHubReadmeResponseUrl(res.url);\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILLHUB_README_BYTES) {\n throw new Error(`SkillHub file exceeds maximum size (${MAX_SKILLHUB_README_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n if (ab.byteLength > MAX_SKILLHUB_README_BYTES) {\n throw new Error(`SkillHub file exceeds maximum size (${MAX_SKILLHUB_README_BYTES} bytes)`);\n }\n return new TextDecoder('utf-8').decode(ab);\n}\n\n/** skillhub.cn skill metadata */\nexport interface SkillHubSkill {\n slug: string;\n displayName: string;\n summary: string;\n summary_zh?: string;\n category: string;\n iconUrl: string | null;\n source: string;\n labels: {\n requires_api_key?: string;\n };\n stats: {\n downloads: number;\n installs: number;\n stars: number;\n comments: number;\n versions: number;\n };\n createdAt: number;\n updatedAt: number;\n tags: Record<string, string>;\n}\n\nexport interface SkillHubSkillDetail {\n skill: SkillHubSkill;\n latestVersion: {\n version: string;\n changelog: string | null;\n createdAt: number;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n };\n owner: {\n handle: string;\n displayName: string;\n image: string | null;\n };\n}\n\nexport interface SkillHubFile {\n path: string;\n sha256: string;\n size: number;\n}\n\nexport interface SkillHubVersion {\n slug: string;\n version: string;\n createdAt: number;\n changelog: string | null;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n}\n\nexport interface SkillHubSkillset {\n id: number;\n slug: string;\n displayName: string;\n summary: string;\n scene: string;\n subScene: string;\n content: string;\n skillSlugs: string[];\n skillCount: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SkillHubSkillsetListResponse {\n skillSets: SkillHubSkillset[];\n total: number;\n}\n\n/** Official taxonomy from GET /api/v1/categories (registry). */\nexport interface SkillHubRegistryCategoryItem {\n key: string;\n name: string;\n nameEn: string;\n sortOrder: number;\n active: boolean;\n}\n\n/**\n * SkillHub registry category taxonomy (ids align with {@link SkillHubSkill.category}).\n */\nexport async function listSkillHubRegistryCategories(): Promise<SkillHubRegistryCategoryItem[]> {\n const raw = await fetchJson<{ count?: number; items?: SkillHubRegistryCategoryItem[] }>(\n `${SKILLHUB_API_BASE}/api/v1/categories`,\n );\n const items = Array.isArray(raw.items) ? raw.items : [];\n return items.filter(\n (c) =>\n c &&\n typeof c.key === 'string' &&\n c.key.trim().length > 0 &&\n (c as SkillHubRegistryCategoryItem).active !== false,\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function fetchJson<T>(url: string, init?: any): Promise<T> {\n const res = await fetch(url, {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(init?.headers as Record<string, string> | undefined),\n },\n });\n const text = await res.text();\n if (!res.ok) {\n let msg = `SkillHub request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { message?: string; error?: string };\n if (j.message) msg = j.message;\n else if (j.error) msg = j.error;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error('SkillHub returned invalid JSON');\n }\n}\n\nexport async function getSkillHubSkill(slug: string): Promise<SkillHubSkillDetail> {\n const enc = encodeURIComponent(slug.trim());\n const url = `${SKILLHUB_API_BASE}/api/v1/skills/${enc}`;\n return fetchJson<SkillHubSkillDetail>(url);\n}\n\nexport async function getSkillHubSkillFiles(\n slug: string,\n version?: string,\n): Promise<{ files: SkillHubFile[]; version: string }> {\n const enc = encodeURIComponent(slug.trim());\n const sp = version ? `?version=${encodeURIComponent(version)}` : '';\n const url = `${SKILLHUB_API_BASE}/api/v1/skills/${enc}/files${sp}`;\n return fetchJson<{ files: SkillHubFile[]; version: string }>(url);\n}\n\nexport async function getSkillHubSkillVersions(slug: string): Promise<SkillHubVersion[]> {\n const enc = encodeURIComponent(slug.trim());\n const url = `${SKILLHUB_API_BASE}/api/v1/skills/${enc}/versions`;\n return fetchJson<SkillHubVersion[]>(url);\n}\n\nexport async function downloadSkillHubZipBuffer(\n slug: string,\n version?: string,\n): Promise<{ buffer: Buffer; version: string }> {\n const enc = encodeURIComponent(slug.trim());\n let url = `${SKILLHUB_API_BASE}/api/v1/download?slug=${enc}`;\n if (version?.trim()) {\n url += `&version=${encodeURIComponent(version.trim())}`;\n }\n\n const res = await fetch(url, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download skill archive (${res.status})`);\n }\n\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n }\n\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n\n let resolvedVersion = version ?? '1.0.0';\n if (!version?.trim()) {\n try {\n const files = await getSkillHubSkillFiles(slug);\n resolvedVersion = files.version;\n } catch {\n // Use default version\n }\n }\n\n return { buffer: buf, version: resolvedVersion };\n}\n\nexport interface SkillHubSkillsetListParams {\n page?: number;\n pageSize?: number;\n keyword?: string;\n scene?: string;\n}\n\nexport async function listSkillHubSkillsets(\n opts: SkillHubSkillsetListParams = {},\n): Promise<SkillHubSkillsetListResponse> {\n const page = opts.page ?? 1;\n const pageSize = opts.pageSize ?? 20;\n const sp = new URLSearchParams({ page: String(page), pageSize: String(pageSize) });\n if (opts.keyword?.trim()) sp.set('keyword', opts.keyword.trim());\n if (opts.scene?.trim()) sp.set('scene', opts.scene.trim());\n const url = `${SKILLHUB_API_BASE}/api/v1/skillsets?${sp.toString()}`;\n return fetchJson<SkillHubSkillsetListResponse>(url);\n}\n\nexport async function getSkillHubSkillset(slug: string): Promise<SkillHubSkillset> {\n const enc = encodeURIComponent(slug.trim());\n const url = `${SKILLHUB_API_BASE}/api/v1/skillsets/${enc}`;\n return fetchJson<SkillHubSkillset>(url);\n}\n\nexport async function batchGetSkillHubSkills(slugs: string[]): Promise<SkillHubSkillDetail[]> {\n if (slugs.length === 0) return [];\n\n const response = await fetchJson<{ count: number; items: SkillHubSkillDetail[]; missing: string[] }>(\n `${SKILLHUB_API_BASE}/api/v1/skills/batch`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ slugs }),\n },\n );\n return response.items ?? [];\n}\n\nconst SKILLSET_DISCOVERY_PAGE_CAP = 25;\nconst MAX_DEFAULT_SLUGS = 200;\n\nexport async function getDefaultSkillSlugs(): Promise<string[]> {\n const slugs = new Set<string>();\n let page = 1;\n const pageSize = 50;\n let total = Infinity;\n while (page <= SKILLSET_DISCOVERY_PAGE_CAP && slugs.size < MAX_DEFAULT_SLUGS) {\n const response = await listSkillHubSkillsets({ page, pageSize });\n total = response.total;\n for (const skillset of response.skillSets) {\n for (const slug of skillset.skillSlugs) {\n slugs.add(slug);\n }\n }\n if (page * pageSize >= total) break;\n page += 1;\n }\n return Array.from(slugs).slice(0, MAX_DEFAULT_SLUGS);\n}\n\nexport async function searchSkillHubSkills(\n query: string,\n maxSlugs = 200,\n): Promise<{ slugs: string[]; total: number }> {\n const keyword = query.trim();\n if (!keyword) {\n return { slugs: [], total: 0 };\n }\n\n const slugs: string[] = [];\n const seen = new Set<string>();\n let page = 1;\n const batchSize = 50;\n\n while (page <= SKILLSET_DISCOVERY_PAGE_CAP) {\n const response = await listSkillHubSkillsets({ page, pageSize: batchSize, keyword });\n const totalSkillsets = response.total;\n for (const skillset of response.skillSets) {\n for (const slug of skillset.skillSlugs) {\n if (!seen.has(slug)) {\n seen.add(slug);\n slugs.push(slug);\n }\n }\n }\n if (page * batchSize >= totalSkillsets) break;\n page += 1;\n }\n\n const capped = slugs.slice(0, maxSlugs);\n return { slugs: capped, total: capped.length };\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * In-memory TTL cache for SkillHub HTTP reads used by the marketplace adapter
3
+ * (curated index, default slug discovery, batch skill metadata, registry category taxonomy).
4
+ *
5
+ * `XOPC_SKILLHUB_CACHE_MS`: TTL in milliseconds (default 300_000). Set to `0` to disable.
6
+ */
7
+ import type { SkillHubCuratedIndex, SkillHubEcosystemUrls } from './ecosystem-client.js';
8
+ import type { SkillHubRegistryCategoryItem, SkillHubSkillDetail } from './registry-client.js';
9
+ export declare function cachedFetchSkillHubCuratedIndex(urls: SkillHubEcosystemUrls): Promise<SkillHubCuratedIndex>;
10
+ export declare function cachedGetDefaultSkillSlugs(): Promise<string[]>;
11
+ export declare function cachedListSkillHubRegistryCategories(): Promise<SkillHubRegistryCategoryItem[]>;
12
+ export declare function cachedBatchGetSkillHubSkills(slugs: string[]): Promise<SkillHubSkillDetail[]>;
@@ -0,0 +1,90 @@
1
+ import { fetchSkillHubCuratedIndex } from "./ecosystem-client.js";
2
+ import { batchGetSkillHubSkills, getDefaultSkillSlugs, listSkillHubRegistryCategories } from "./registry-client.js";
3
+ //#region src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.ts
4
+ const DEFAULT_CACHE_MS = 300 * 1e3;
5
+ const MAX_BATCH_CACHE_KEYS = 48;
6
+ function cacheTtlMs() {
7
+ const raw = process.env.XOPC_SKILLHUB_CACHE_MS?.trim();
8
+ if (raw === "0" || raw === "false") return 0;
9
+ const n = Number(raw);
10
+ if (!Number.isFinite(n) || n < 0) return DEFAULT_CACHE_MS;
11
+ return n;
12
+ }
13
+ const curatedByIndexUrl = /* @__PURE__ */ new Map();
14
+ let defaultSlugsEntry;
15
+ let registryCategoriesEntry;
16
+ const batchBySlugsKey = /* @__PURE__ */ new Map();
17
+ function getFresh(entry) {
18
+ if (!entry || entry.expiresAt <= Date.now()) return void 0;
19
+ return entry.value;
20
+ }
21
+ function evictOldestBatchKey() {
22
+ const first = batchBySlugsKey.keys().next().value;
23
+ if (first !== void 0) batchBySlugsKey.delete(first);
24
+ }
25
+ function batchSlugsCacheKey(slugs) {
26
+ if (slugs.length === 0) return "";
27
+ return [...slugs].sort().join("\n");
28
+ }
29
+ async function cachedFetchSkillHubCuratedIndex(urls) {
30
+ const ttl = cacheTtlMs();
31
+ const key = urls.skillsIndexUrl;
32
+ if (ttl > 0) {
33
+ const hit = getFresh(curatedByIndexUrl.get(key));
34
+ if (hit) return hit;
35
+ }
36
+ const value = await fetchSkillHubCuratedIndex(urls);
37
+ if (ttl > 0) curatedByIndexUrl.set(key, {
38
+ value,
39
+ expiresAt: Date.now() + ttl
40
+ });
41
+ return value;
42
+ }
43
+ async function cachedGetDefaultSkillSlugs() {
44
+ const ttl = cacheTtlMs();
45
+ if (ttl > 0) {
46
+ const hit = getFresh(defaultSlugsEntry);
47
+ if (hit) return hit;
48
+ }
49
+ const value = await getDefaultSkillSlugs();
50
+ if (ttl > 0) defaultSlugsEntry = {
51
+ value,
52
+ expiresAt: Date.now() + ttl
53
+ };
54
+ return value;
55
+ }
56
+ async function cachedListSkillHubRegistryCategories() {
57
+ const ttl = cacheTtlMs();
58
+ if (ttl > 0) {
59
+ const hit = getFresh(registryCategoriesEntry);
60
+ if (hit) return hit;
61
+ }
62
+ const value = await listSkillHubRegistryCategories();
63
+ if (ttl > 0) registryCategoriesEntry = {
64
+ value,
65
+ expiresAt: Date.now() + ttl
66
+ };
67
+ return value;
68
+ }
69
+ async function cachedBatchGetSkillHubSkills(slugs) {
70
+ if (slugs.length === 0) return [];
71
+ const ttl = cacheTtlMs();
72
+ const key = batchSlugsCacheKey(slugs);
73
+ if (ttl > 0) {
74
+ const hit = getFresh(batchBySlugsKey.get(key));
75
+ if (hit) return hit;
76
+ }
77
+ const value = await batchGetSkillHubSkills(slugs);
78
+ if (ttl > 0) {
79
+ while (batchBySlugsKey.size >= MAX_BATCH_CACHE_KEYS) evictOldestBatchKey();
80
+ batchBySlugsKey.set(key, {
81
+ value,
82
+ expiresAt: Date.now() + ttl
83
+ });
84
+ }
85
+ return value;
86
+ }
87
+ //#endregion
88
+ export { cachedBatchGetSkillHubSkills, cachedFetchSkillHubCuratedIndex, cachedGetDefaultSkillSlugs, cachedListSkillHubRegistryCategories };
89
+
90
+ //# sourceMappingURL=skillhub-fetch-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillhub-fetch-cache.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.ts"],"sourcesContent":["/**\n * In-memory TTL cache for SkillHub HTTP reads used by the marketplace adapter\n * (curated index, default slug discovery, batch skill metadata, registry category taxonomy).\n *\n * `XOPC_SKILLHUB_CACHE_MS`: TTL in milliseconds (default 300_000). Set to `0` to disable.\n */\n\nimport type { SkillHubCuratedIndex, SkillHubEcosystemUrls } from './ecosystem-client.js';\nimport { fetchSkillHubCuratedIndex } from './ecosystem-client.js';\nimport type { SkillHubRegistryCategoryItem, SkillHubSkillDetail } from './registry-client.js';\nimport {\n batchGetSkillHubSkills,\n getDefaultSkillSlugs,\n listSkillHubRegistryCategories,\n} from './registry-client.js';\n\nconst DEFAULT_CACHE_MS = 5 * 60 * 1000;\nconst MAX_BATCH_CACHE_KEYS = 48;\n\ntype CacheEntry<T> = { value: T; expiresAt: number };\n\nfunction cacheTtlMs(): number {\n const raw = process.env.XOPC_SKILLHUB_CACHE_MS?.trim();\n if (raw === '0' || raw === 'false') return 0;\n const n = Number(raw);\n if (!Number.isFinite(n) || n < 0) return DEFAULT_CACHE_MS;\n return n;\n}\n\nconst curatedByIndexUrl = new Map<string, CacheEntry<SkillHubCuratedIndex>>();\nlet defaultSlugsEntry: CacheEntry<string[]> | undefined;\nlet registryCategoriesEntry: CacheEntry<SkillHubRegistryCategoryItem[]> | undefined;\nconst batchBySlugsKey = new Map<string, CacheEntry<SkillHubSkillDetail[]>>();\n\nfunction getFresh<T>(entry: CacheEntry<T> | undefined): T | undefined {\n if (!entry || entry.expiresAt <= Date.now()) return undefined;\n return entry.value;\n}\n\nfunction evictOldestBatchKey(): void {\n const first = batchBySlugsKey.keys().next().value;\n if (first !== undefined) batchBySlugsKey.delete(first);\n}\n\nfunction batchSlugsCacheKey(slugs: string[]): string {\n if (slugs.length === 0) return '';\n return [...slugs].sort().join('\\n');\n}\n\nexport async function cachedFetchSkillHubCuratedIndex(urls: SkillHubEcosystemUrls): Promise<SkillHubCuratedIndex> {\n const ttl = cacheTtlMs();\n const key = urls.skillsIndexUrl;\n if (ttl > 0) {\n const hit = getFresh(curatedByIndexUrl.get(key));\n if (hit) return hit;\n }\n const value = await fetchSkillHubCuratedIndex(urls);\n if (ttl > 0) curatedByIndexUrl.set(key, { value, expiresAt: Date.now() + ttl });\n return value;\n}\n\nexport async function cachedGetDefaultSkillSlugs(): Promise<string[]> {\n const ttl = cacheTtlMs();\n if (ttl > 0) {\n const hit = getFresh(defaultSlugsEntry);\n if (hit) return hit;\n }\n const value = await getDefaultSkillSlugs();\n if (ttl > 0) defaultSlugsEntry = { value, expiresAt: Date.now() + ttl };\n return value;\n}\n\nexport async function cachedListSkillHubRegistryCategories(): Promise<SkillHubRegistryCategoryItem[]> {\n const ttl = cacheTtlMs();\n if (ttl > 0) {\n const hit = getFresh(registryCategoriesEntry);\n if (hit) return hit;\n }\n const value = await listSkillHubRegistryCategories();\n if (ttl > 0) registryCategoriesEntry = { value, expiresAt: Date.now() + ttl };\n return value;\n}\n\nexport async function cachedBatchGetSkillHubSkills(slugs: string[]): Promise<SkillHubSkillDetail[]> {\n if (slugs.length === 0) return [];\n const ttl = cacheTtlMs();\n const key = batchSlugsCacheKey(slugs);\n if (ttl > 0) {\n const hit = getFresh(batchBySlugsKey.get(key));\n if (hit) return hit;\n }\n const value = await batchGetSkillHubSkills(slugs);\n if (ttl > 0) {\n while (batchBySlugsKey.size >= MAX_BATCH_CACHE_KEYS) evictOldestBatchKey();\n batchBySlugsKey.set(key, { value, expiresAt: Date.now() + ttl });\n }\n return value;\n}\n"],"mappings":";;;AAgBA,MAAM,mBAAmB,MAAS;AAClC,MAAM,uBAAuB;AAI7B,SAAS,aAAqB;CAC5B,MAAM,MAAM,QAAQ,IAAI,wBAAwB,MAAM;AACtD,KAAI,QAAQ,OAAO,QAAQ,QAAS,QAAO;CAC3C,MAAM,IAAI,OAAO,IAAI;AACrB,KAAI,CAAC,OAAO,SAAS,EAAE,IAAI,IAAI,EAAG,QAAO;AACzC,QAAO;;AAGT,MAAM,oCAAoB,IAAI,KAA+C;AAC7E,IAAI;AACJ,IAAI;AACJ,MAAM,kCAAkB,IAAI,KAAgD;AAE5E,SAAS,SAAY,OAAiD;AACpE,KAAI,CAAC,SAAS,MAAM,aAAa,KAAK,KAAK,CAAE,QAAO,KAAA;AACpD,QAAO,MAAM;;AAGf,SAAS,sBAA4B;CACnC,MAAM,QAAQ,gBAAgB,MAAM,CAAC,MAAM,CAAC;AAC5C,KAAI,UAAU,KAAA,EAAW,iBAAgB,OAAO,MAAM;;AAGxD,SAAS,mBAAmB,OAAyB;AACnD,KAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK;;AAGrC,eAAsB,gCAAgC,MAA4D;CAChH,MAAM,MAAM,YAAY;CACxB,MAAM,MAAM,KAAK;AACjB,KAAI,MAAM,GAAG;EACX,MAAM,MAAM,SAAS,kBAAkB,IAAI,IAAI,CAAC;AAChD,MAAI,IAAK,QAAO;;CAElB,MAAM,QAAQ,MAAM,0BAA0B,KAAK;AACnD,KAAI,MAAM,EAAG,mBAAkB,IAAI,KAAK;EAAE;EAAO,WAAW,KAAK,KAAK,GAAG;EAAK,CAAC;AAC/E,QAAO;;AAGT,eAAsB,6BAAgD;CACpE,MAAM,MAAM,YAAY;AACxB,KAAI,MAAM,GAAG;EACX,MAAM,MAAM,SAAS,kBAAkB;AACvC,MAAI,IAAK,QAAO;;CAElB,MAAM,QAAQ,MAAM,sBAAsB;AAC1C,KAAI,MAAM,EAAG,qBAAoB;EAAE;EAAO,WAAW,KAAK,KAAK,GAAG;EAAK;AACvE,QAAO;;AAGT,eAAsB,uCAAgF;CACpG,MAAM,MAAM,YAAY;AACxB,KAAI,MAAM,GAAG;EACX,MAAM,MAAM,SAAS,wBAAwB;AAC7C,MAAI,IAAK,QAAO;;CAElB,MAAM,QAAQ,MAAM,gCAAgC;AACpD,KAAI,MAAM,EAAG,2BAA0B;EAAE;EAAO,WAAW,KAAK,KAAK,GAAG;EAAK;AAC7E,QAAO;;AAGT,eAAsB,6BAA6B,OAAiD;AAClG,KAAI,MAAM,WAAW,EAAG,QAAO,EAAE;CACjC,MAAM,MAAM,YAAY;CACxB,MAAM,MAAM,mBAAmB,MAAM;AACrC,KAAI,MAAM,GAAG;EACX,MAAM,MAAM,SAAS,gBAAgB,IAAI,IAAI,CAAC;AAC9C,MAAI,IAAK,QAAO;;CAElB,MAAM,QAAQ,MAAM,uBAAuB,MAAM;AACjD,KAAI,MAAM,GAAG;AACX,SAAO,gBAAgB,QAAQ,qBAAsB,sBAAqB;AAC1E,kBAAgB,IAAI,KAAK;GAAE;GAAO,WAAW,KAAK,KAAK,GAAG;GAAK,CAAC;;AAElE,QAAO"}
@@ -0,0 +1,2 @@
1
+ import type { SkillsMarketplaceAdapter } from '../../adapter.types.js';
2
+ export declare const storeMarketplaceAdapter: SkillsMarketplaceAdapter;
@@ -0,0 +1,35 @@
1
+ import { downloadSkillZipBuffer, fetchMarketplacePackageDetail, listSkillPackages, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall } from "./store-api-client.js";
2
+ //#region src/agent/skills/marketplace/adapters/store/adapter.ts
3
+ const storeMarketplaceAdapter = {
4
+ id: "store",
5
+ async listCategories(_config) {
6
+ return [];
7
+ },
8
+ async listPackages(config, params) {
9
+ const response = await listSkillPackages(resolveSkillsStoreBaseUrl(config), params);
10
+ return {
11
+ items: response.items,
12
+ meta: response.meta,
13
+ provider: "store"
14
+ };
15
+ },
16
+ async getPackageDetail(config, packageName) {
17
+ return {
18
+ ...await fetchMarketplacePackageDetail(resolveSkillsStoreBaseUrl(config), packageName),
19
+ provider: "store"
20
+ };
21
+ },
22
+ async downloadPackage(config, packageName, version) {
23
+ const base = resolveSkillsStoreBaseUrl(config);
24
+ const { downloadUrl, version: resolvedVersion } = await resolveSkillZipDownloadUrl(base, packageName, version);
25
+ return {
26
+ buffer: await downloadSkillZipBuffer(base, downloadUrl),
27
+ skillId: skillIdForMarketplaceInstall(packageName) ?? packageName,
28
+ version: resolvedVersion
29
+ };
30
+ }
31
+ };
32
+ //#endregion
33
+ export { storeMarketplaceAdapter };
34
+
35
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/adapter.ts"],"sourcesContent":["import type { Config } from '../../../../../config/schema.js';\nimport {\n downloadSkillZipBuffer,\n fetchMarketplacePackageDetail,\n listSkillPackages,\n resolveSkillZipDownloadUrl,\n resolveSkillsStoreBaseUrl,\n skillIdForMarketplaceInstall,\n} from './store-api-client.js';\n\nimport type { SkillsMarketplaceAdapter } from '../../adapter.types.js';\n\nexport const storeMarketplaceAdapter: SkillsMarketplaceAdapter = {\n id: 'store',\n\n async listCategories(_config) {\n return [];\n },\n\n async listPackages(config, params) {\n const base = resolveSkillsStoreBaseUrl(config);\n const response = await listSkillPackages(base, params);\n return {\n items: response.items,\n meta: response.meta,\n provider: 'store',\n };\n },\n\n async getPackageDetail(config, packageName) {\n const base = resolveSkillsStoreBaseUrl(config);\n const detail = await fetchMarketplacePackageDetail(base, packageName);\n return { ...detail, provider: 'store' };\n },\n\n async downloadPackage(config, packageName, version) {\n const base = resolveSkillsStoreBaseUrl(config);\n const { downloadUrl, version: resolvedVersion } = await resolveSkillZipDownloadUrl(\n base,\n packageName,\n version,\n );\n const buffer = await downloadSkillZipBuffer(base, downloadUrl);\n return {\n buffer,\n skillId: skillIdForMarketplaceInstall(packageName) ?? packageName,\n version: resolvedVersion,\n };\n },\n};\n"],"mappings":";;AAYA,MAAa,0BAAoD;CAC/D,IAAI;CAEJ,MAAM,eAAe,SAAS;AAC5B,SAAO,EAAE;;CAGX,MAAM,aAAa,QAAQ,QAAQ;EAEjC,MAAM,WAAW,MAAM,kBADV,0BAA0B,OACM,EAAE,OAAO;AACtD,SAAO;GACL,OAAO,SAAS;GAChB,MAAM,SAAS;GACf,UAAU;GACX;;CAGH,MAAM,iBAAiB,QAAQ,aAAa;AAG1C,SAAO;GAAE,GAAG,MADS,8BADR,0BAA0B,OACgB,EAAE,YAAY;GACjD,UAAU;GAAS;;CAGzC,MAAM,gBAAgB,QAAQ,aAAa,SAAS;EAClD,MAAM,OAAO,0BAA0B,OAAO;EAC9C,MAAM,EAAE,aAAa,SAAS,oBAAoB,MAAM,2BACtD,MACA,aACA,QACD;AAED,SAAO;GACL,QAAA,MAFmB,uBAAuB,MAAM,YAAY;GAG5D,SAAS,6BAA6B,YAAY,IAAI;GACtD,SAAS;GACV;;CAEJ"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * HTTP client for the public xopc-store-compatible REST API (packages list, detail, zip download).
3
+ * Used by the store marketplace adapter and SSRF-safe download helpers.
4
+ *
5
+ * Facade: {@link ../../../skills-marketplace.js}.
6
+ */
7
+ import type { Config } from '../../../../../config/schema.js';
8
+ import type { SkillMarkdownPreviewPayload } from '../../../types.js';
9
+ export type SkillsMarketplaceProvider = 'store' | 'skillhub';
10
+ export interface SkillsStoreListParams {
11
+ q?: string;
12
+ page?: number;
13
+ pageSize?: number;
14
+ sort?: 'downloads' | 'newest';
15
+ /** Adapter-defined category id (exact match against package `categories`). */
16
+ category?: string;
17
+ }
18
+ /** Category option for marketplace filter chips (from adapter). */
19
+ export interface MarketplaceCategoryOption {
20
+ id: string;
21
+ label: string;
22
+ }
23
+ /** Mirrors xopc-store GET /api/v1/packages list response (subset used by UI). */
24
+ export interface SkillsStorePackageListItem {
25
+ id: string;
26
+ name: string;
27
+ type: string;
28
+ description: string;
29
+ downloads: number;
30
+ author: {
31
+ username: string;
32
+ avatarUrl: string | null;
33
+ };
34
+ latestVersion?: string;
35
+ updatedAt: string;
36
+ /** Taxonomy / tags from the marketplace (adapter-specific). */
37
+ categories?: string[];
38
+ tags?: string[];
39
+ stars?: number;
40
+ /** Short provenance label for the row (e.g. ClawHub). */
41
+ sourceLabel?: string;
42
+ }
43
+ /** Unified marketplace package list item (works for all adapters). */
44
+ export type MarketplacePackageListItem = SkillsStorePackageListItem;
45
+ export interface SkillsStoreListResponse {
46
+ items: SkillsStorePackageListItem[];
47
+ meta: {
48
+ page: number;
49
+ pageSize: number;
50
+ total: number;
51
+ totalPages: number;
52
+ };
53
+ }
54
+ export declare function resolveSkillsStoreBaseUrl(config: Config): string;
55
+ export declare function getStoreOrigin(baseUrl: string): string;
56
+ /**
57
+ * Allow only HTTPS URLs whose origin matches the configured store base (SSRF guard).
58
+ */
59
+ export declare function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL;
60
+ export declare function listSkillPackages(storeBaseUrl: string, params: SkillsStoreListParams): Promise<SkillsStoreListResponse>;
61
+ /** GET /api/v1/packages/:name — published skill package (public). */
62
+ export interface MarketplacePackageDetail {
63
+ id: string;
64
+ name: string;
65
+ type: string;
66
+ description: string;
67
+ readme: string | null;
68
+ downloads: number;
69
+ author: {
70
+ username: string;
71
+ avatarUrl: string | null;
72
+ };
73
+ latestVersion: {
74
+ version: string;
75
+ changelog: string | null;
76
+ publishedAt: string;
77
+ };
78
+ }
79
+ export declare function fetchMarketplacePackageDetail(storeBaseUrl: string, packageName: string): Promise<MarketplacePackageDetail>;
80
+ export declare function resolveSkillZipDownloadUrl(storeBaseUrl: string, packageName: string, version?: string): Promise<{
81
+ downloadUrl: string;
82
+ version: string;
83
+ }>;
84
+ export declare function downloadSkillZipBuffer(storeBaseUrl: string, downloadUrl: string): Promise<Buffer>;
85
+ export declare function skillIdForMarketplaceInstall(packageName: string): string | undefined;
86
+ /**
87
+ * Unified marketplace list response (adapter fills `provider`).
88
+ */
89
+ export interface UnifiedMarketplaceListResponse {
90
+ items: MarketplacePackageListItem[];
91
+ meta: {
92
+ page: number;
93
+ pageSize: number;
94
+ total: number;
95
+ totalPages: number;
96
+ };
97
+ provider: SkillsMarketplaceProvider;
98
+ }
99
+ /**
100
+ * Unified marketplace package detail response.
101
+ */
102
+ export interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {
103
+ provider: SkillsMarketplaceProvider;
104
+ /** When set (e.g. SkillHub SKILL.md), gateway console renders structured meta + body like installed skills. */
105
+ skillDocPreview?: SkillMarkdownPreviewPayload;
106
+ /** SkillHub-specific fields */
107
+ skillHubInfo?: {
108
+ category: string;
109
+ installs: number;
110
+ stars: number;
111
+ securityReports?: {
112
+ keen?: {
113
+ status: string;
114
+ statusText: string;
115
+ reportUrl?: string;
116
+ };
117
+ sanbu?: {
118
+ status: string;
119
+ statusText: string;
120
+ reportUrl?: string;
121
+ };
122
+ };
123
+ };
124
+ }
@@ -1,5 +1,5 @@
1
- import { MAX_SKILL_ZIP_BYTES, isValidSkillId } from "./managed-store.js";
2
- //#region src/agent/skills/skills-store-client.ts
1
+ import { MAX_SKILL_ZIP_BYTES, isValidSkillId } from "../../../managed-store.js";
2
+ //#region src/agent/skills/marketplace/adapters/store/store-api-client.ts
3
3
  const DEFAULT_STORE_BASE = "https://store.xopc.ai";
4
4
  function resolveSkillsStoreBaseUrl(config) {
5
5
  const env = process.env.XOPC_SKILLS_STORE_URL?.trim();
@@ -69,6 +69,7 @@ async function listSkillPackages(storeBaseUrl, params) {
69
69
  if (params.page != null) sp.set("page", String(params.page));
70
70
  if (params.pageSize != null) sp.set("pageSize", String(params.pageSize));
71
71
  if (params.sort) sp.set("sort", params.sort);
72
+ if (params.category?.trim()) sp.set("category", params.category.trim());
72
73
  return fetchJson(`${base}/api/v1/packages?${sp.toString()}`);
73
74
  }
74
75
  async function fetchMarketplacePackageDetail(storeBaseUrl, packageName) {
@@ -116,4 +117,4 @@ function skillIdForMarketplaceInstall(packageName) {
116
117
  //#endregion
117
118
  export { assertDownloadUrlAllowed, downloadSkillZipBuffer, fetchMarketplacePackageDetail, getStoreOrigin, listSkillPackages, resolveSkillZipDownloadUrl, resolveSkillsStoreBaseUrl, skillIdForMarketplaceInstall };
118
119
 
119
- //# sourceMappingURL=skills-store-client.js.map
120
+ //# sourceMappingURL=store-api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-api-client.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/store-api-client.ts"],"sourcesContent":["/**\n * HTTP client for the public xopc-store-compatible REST API (packages list, detail, zip download).\n * Used by the store marketplace adapter and SSRF-safe download helpers.\n *\n * Facade: {@link ../../../skills-marketplace.js}.\n */\n\nimport type { Config } from '../../../../../config/schema.js';\nimport { isValidSkillId, MAX_SKILL_ZIP_BYTES } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\n\nconst DEFAULT_STORE_BASE = 'https://store.xopc.ai';\n\nexport type SkillsMarketplaceProvider = 'store' | 'skillhub';\n\nexport interface SkillsStoreListParams {\n q?: string;\n page?: number;\n pageSize?: number;\n sort?: 'downloads' | 'newest';\n /** Adapter-defined category id (exact match against package `categories`). */\n category?: string;\n}\n\n/** Category option for marketplace filter chips (from adapter). */\nexport interface MarketplaceCategoryOption {\n id: string;\n label: string;\n}\n\n/** Mirrors xopc-store GET /api/v1/packages list response (subset used by UI). */\nexport interface SkillsStorePackageListItem {\n id: string;\n name: string;\n type: string;\n description: string;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion?: string;\n updatedAt: string;\n /** Taxonomy / tags from the marketplace (adapter-specific). */\n categories?: string[];\n tags?: string[];\n stars?: number;\n /** Short provenance label for the row (e.g. ClawHub). */\n sourceLabel?: string;\n}\n\n/** Unified marketplace package list item (works for all adapters). */\nexport type MarketplacePackageListItem = SkillsStorePackageListItem;\n\nexport interface SkillsStoreListResponse {\n items: SkillsStorePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n}\n\nexport function resolveSkillsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_SKILLS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n const fromConfig = config.gateway?.skillsStoreBaseUrl?.trim();\n if (fromConfig) {\n try {\n return normalizeBaseUrl(new URL(fromConfig).toString());\n } catch {\n return DEFAULT_STORE_BASE;\n }\n }\n return DEFAULT_STORE_BASE;\n}\n\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nexport function getStoreOrigin(baseUrl: string): string {\n const u = new URL(baseUrl);\n return `${u.protocol}//${u.host}`;\n}\n\n/**\n * Allow only HTTPS URLs whose origin matches the configured store base (SSRF guard).\n */\nexport function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL {\n let u: URL;\n try {\n u = new URL(downloadUrl);\n } catch {\n throw new Error('Invalid download URL from store');\n }\n if (u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTPS');\n }\n const allowed = new URL(storeBaseUrl);\n if (u.host !== allowed.host) {\n throw new Error('Download URL host does not match skills store');\n }\n return u;\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n headers: { Accept: 'application/json', ...init?.headers },\n });\n const text = await res.text();\n if (!res.ok) {\n let msg = `Store request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { error?: { message?: string } };\n if (j.error?.message) msg = j.error.message;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error('Store returned invalid JSON');\n }\n}\n\nexport async function listSkillPackages(\n storeBaseUrl: string,\n params: SkillsStoreListParams,\n): Promise<SkillsStoreListResponse> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const sp = new URLSearchParams();\n sp.set('type', 'skill');\n if (params.q?.trim()) sp.set('q', params.q.trim());\n if (params.page != null) sp.set('page', String(params.page));\n if (params.pageSize != null) sp.set('pageSize', String(params.pageSize));\n if (params.sort) sp.set('sort', params.sort);\n if (params.category?.trim()) sp.set('category', params.category.trim());\n\n const url = `${base}/api/v1/packages?${sp.toString()}`;\n return fetchJson<SkillsStoreListResponse>(url);\n}\n\n/** GET /api/v1/packages/:name — published skill package (public). */\nexport interface MarketplacePackageDetail {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n}\n\nexport async function fetchMarketplacePackageDetail(\n storeBaseUrl: string,\n packageName: string,\n): Promise<MarketplacePackageDetail> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n return fetchJson<MarketplacePackageDetail>(`${base}/api/v1/packages/${enc}`);\n}\n\nexport async function resolveSkillZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName);\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n\n const pkg = await fetchJson<{\n name: string;\n latestVersion: { downloadUrl: string; version: string };\n }>(`${base}/api/v1/packages/${enc}`);\n if (!pkg.latestVersion?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(pkg.latestVersion.downloadUrl, base);\n return {\n downloadUrl: pkg.latestVersion.downloadUrl,\n version: pkg.latestVersion.version,\n };\n}\n\nexport async function downloadSkillZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download skill archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\nexport function skillIdForMarketplaceInstall(packageName: string): string | undefined {\n const trimmed = packageName.trim();\n if (!trimmed) return undefined;\n return isValidSkillId(trimmed) ? trimmed : undefined;\n}\n\n/**\n * Unified marketplace list response (adapter fills `provider`).\n */\nexport interface UnifiedMarketplaceListResponse {\n items: MarketplacePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider: SkillsMarketplaceProvider;\n}\n\n/**\n * Unified marketplace package detail response.\n */\nexport interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {\n provider: SkillsMarketplaceProvider;\n /** When set (e.g. SkillHub SKILL.md), gateway console renders structured meta + body like installed skills. */\n skillDocPreview?: SkillMarkdownPreviewPayload;\n /** SkillHub-specific fields */\n skillHubInfo?: {\n category: string;\n installs: number;\n stars: number;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Config } from '../../../config/schema.js';
2
+ import type { SkillsMarketplaceProvider } from './adapters/store/store-api-client.js';
3
+ import type { SkillsMarketplaceAdapter } from './adapter.types.js';
4
+ export declare function resolveSkillsMarketplaceProvider(config: Config): SkillsMarketplaceProvider;
5
+ export declare function getMarketplaceProviderDisplayName(provider: SkillsMarketplaceProvider): string;
6
+ export declare function getMarketplaceAdapter(config: Config): SkillsMarketplaceAdapter;
@@ -0,0 +1,26 @@
1
+ import { skillhubMarketplaceAdapter } from "./adapters/skillhub/adapter.js";
2
+ import { storeMarketplaceAdapter } from "./adapters/store/adapter.js";
3
+ //#region src/agent/skills/marketplace/resolve-adapter.ts
4
+ function resolveSkillsMarketplaceProvider(config) {
5
+ const env = process.env.XOPC_SKILLS_MARKETPLACE_PROVIDER?.trim().toLowerCase();
6
+ if (env === "skillhub" || env === "store") return env;
7
+ const fromConfig = config.gateway?.skillsMarketplaceProvider;
8
+ if (fromConfig === "skillhub" || fromConfig === "store") return fromConfig;
9
+ return "skillhub";
10
+ }
11
+ function getMarketplaceProviderDisplayName(provider) {
12
+ switch (provider) {
13
+ case "skillhub": return "SkillHub (skillhub.cn)";
14
+ default: return "xopc Store (store.xopc.ai)";
15
+ }
16
+ }
17
+ function getMarketplaceAdapter(config) {
18
+ switch (resolveSkillsMarketplaceProvider(config)) {
19
+ case "skillhub": return skillhubMarketplaceAdapter;
20
+ default: return storeMarketplaceAdapter;
21
+ }
22
+ }
23
+ //#endregion
24
+ export { getMarketplaceAdapter, getMarketplaceProviderDisplayName, resolveSkillsMarketplaceProvider };
25
+
26
+ //# sourceMappingURL=resolve-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-adapter.js","names":[],"sources":["../../../../../src/agent/skills/marketplace/resolve-adapter.ts"],"sourcesContent":["import type { Config } from '../../../config/schema.js';\nimport type { SkillsMarketplaceProvider } from './adapters/store/store-api-client.js';\n\nimport type { SkillsMarketplaceAdapter } from './adapter.types.js';\nimport { skillhubMarketplaceAdapter } from './adapters/skillhub/adapter.js';\nimport { storeMarketplaceAdapter } from './adapters/store/adapter.js';\n\nexport function resolveSkillsMarketplaceProvider(config: Config): SkillsMarketplaceProvider {\n const env = process.env.XOPC_SKILLS_MARKETPLACE_PROVIDER?.trim().toLowerCase();\n if (env === 'skillhub' || env === 'store') {\n return env;\n }\n const fromConfig = config.gateway?.skillsMarketplaceProvider;\n if (fromConfig === 'skillhub' || fromConfig === 'store') {\n return fromConfig;\n }\n return 'skillhub';\n}\n\nexport function getMarketplaceProviderDisplayName(provider: SkillsMarketplaceProvider): string {\n switch (provider) {\n case 'skillhub':\n return 'SkillHub (skillhub.cn)';\n case 'store':\n default:\n return 'xopc Store (store.xopc.ai)';\n }\n}\n\nexport function getMarketplaceAdapter(config: Config): SkillsMarketplaceAdapter {\n const id = resolveSkillsMarketplaceProvider(config);\n switch (id) {\n case 'skillhub':\n return skillhubMarketplaceAdapter;\n default:\n return storeMarketplaceAdapter;\n }\n}\n"],"mappings":";;;AAOA,SAAgB,iCAAiC,QAA2C;CAC1F,MAAM,MAAM,QAAQ,IAAI,kCAAkC,MAAM,CAAC,aAAa;AAC9E,KAAI,QAAQ,cAAc,QAAQ,QAChC,QAAO;CAET,MAAM,aAAa,OAAO,SAAS;AACnC,KAAI,eAAe,cAAc,eAAe,QAC9C,QAAO;AAET,QAAO;;AAGT,SAAgB,kCAAkC,UAA6C;AAC7F,SAAQ,UAAR;EACE,KAAK,WACH,QAAO;EAET,QACE,QAAO;;;AAIb,SAAgB,sBAAsB,QAA0C;AAE9E,SADW,iCAAiC,OAClC,EAAV;EACE,KAAK,WACH,QAAO;EACT,QACE,QAAO"}
@@ -0,0 +1,5 @@
1
+ import type { SkillMetadata } from './types.js';
2
+ /**
3
+ * Maps SKILL.md YAML frontmatter to {@link SkillMetadata} (Hermes / xopc shapes).
4
+ */
5
+ export declare function parseSkillMetadata(frontmatter: Record<string, unknown>): SkillMetadata;
@@ -0,0 +1,27 @@
1
+ //#region src/agent/skills/parse-skill-metadata.ts
2
+ /**
3
+ * Maps SKILL.md YAML frontmatter to {@link SkillMetadata} (Hermes / xopc shapes).
4
+ */
5
+ function parseSkillMetadata(frontmatter) {
6
+ const xopcMeta = frontmatter.metadata?.xopc;
7
+ const metadata = {
8
+ name: frontmatter.name || "",
9
+ description: frontmatter.description || "",
10
+ emoji: xopcMeta?.emoji || frontmatter.emoji || void 0,
11
+ homepage: frontmatter.homepage || void 0,
12
+ os: xopcMeta?.os || frontmatter.os || void 0,
13
+ requires: xopcMeta?.requires || frontmatter.requires || void 0,
14
+ install: xopcMeta?.install || frontmatter.install || void 0
15
+ };
16
+ if (xopcMeta) metadata.xopc = {
17
+ emoji: xopcMeta.emoji,
18
+ requires: xopcMeta.requires,
19
+ install: xopcMeta.install,
20
+ os: xopcMeta.os
21
+ };
22
+ return metadata;
23
+ }
24
+ //#endregion
25
+ export { parseSkillMetadata };
26
+
27
+ //# sourceMappingURL=parse-skill-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-skill-metadata.js","names":[],"sources":["../../../../src/agent/skills/parse-skill-metadata.ts"],"sourcesContent":["import type { SkillInstallSpec, SkillMetadata, SkillRequires } from './types.js';\n\n/**\n * Maps SKILL.md YAML frontmatter to {@link SkillMetadata} (Hermes / xopc shapes).\n */\nexport function parseSkillMetadata(frontmatter: Record<string, unknown>): SkillMetadata {\n const meta = frontmatter.metadata as Record<string, unknown> | undefined;\n const xopcMeta = meta?.xopc as Record<string, unknown> | undefined;\n\n const metadata: SkillMetadata = {\n name: (frontmatter.name as string) || '',\n description: (frontmatter.description as string) || '',\n emoji: (xopcMeta?.emoji as string) || (frontmatter.emoji as string) || undefined,\n homepage: (frontmatter.homepage as string) || undefined,\n os:\n (xopcMeta?.os as Array<'darwin' | 'linux' | 'win32'>) ||\n (frontmatter.os as Array<'darwin' | 'linux' | 'win32'>) ||\n undefined,\n requires:\n (xopcMeta?.requires as SkillRequires) || (frontmatter.requires as SkillRequires) || undefined,\n install:\n (xopcMeta?.install as SkillInstallSpec[]) || (frontmatter.install as SkillInstallSpec[]) || undefined,\n };\n\n if (xopcMeta) {\n metadata.xopc = {\n emoji: xopcMeta.emoji as string | undefined,\n requires: xopcMeta.requires as SkillRequires | undefined,\n install: xopcMeta.install as SkillInstallSpec[] | undefined,\n os: xopcMeta.os as Array<'darwin' | 'linux' | 'win32'> | undefined,\n };\n }\n\n return metadata;\n}\n"],"mappings":";;;;AAKA,SAAgB,mBAAmB,aAAqD;CAEtF,MAAM,WADO,YAAY,UACF;CAEvB,MAAM,WAA0B;EAC9B,MAAO,YAAY,QAAmB;EACtC,aAAc,YAAY,eAA0B;EACpD,OAAQ,UAAU,SAAqB,YAAY,SAAoB,KAAA;EACvE,UAAW,YAAY,YAAuB,KAAA;EAC9C,IACG,UAAU,MACV,YAAY,MACb,KAAA;EACF,UACG,UAAU,YAA+B,YAAY,YAA8B,KAAA;EACtF,SACG,UAAU,WAAmC,YAAY,WAAkC,KAAA;EAC/F;AAED,KAAI,SACF,UAAS,OAAO;EACd,OAAO,SAAS;EAChB,UAAU,SAAS;EACnB,SAAS,SAAS;EAClB,IAAI,SAAS;EACd;AAGH,QAAO"}
@@ -0,0 +1,6 @@
1
+ import type { SkillMarkdownPreviewPayload } from './types.js';
2
+ /** Same payload shape as `getSkillMarkdownSource`, built from raw SKILL.md text only. */
3
+ export declare function buildSkillMarkdownPreviewFromRaw(raw: string, fallback: {
4
+ name: string;
5
+ description: string;
6
+ }): SkillMarkdownPreviewPayload;
@@ -0,0 +1,64 @@
1
+ import { parseFrontmatter } from "../../markdown/frontmatter.js";
2
+ import { parseSkillToolConditions } from "./skill-tool-gating.js";
3
+ import { parseRequiredEnvVarNames } from "./required-env-vars.js";
4
+ import { parseSkillMetadata } from "./parse-skill-metadata.js";
5
+ //#region src/agent/skills/skill-markdown-preview-from-raw.ts
6
+ /**
7
+ * SkillHub / hand-authored SKILL.md sometimes uses a single first line:
8
+ * `name: slug description: long text...` without `---` YAML fences.
9
+ */
10
+ function splitFlatNameDescriptionFirstLine(raw) {
11
+ const trimmed = raw.trim();
12
+ if (!trimmed) return null;
13
+ const nl = trimmed.indexOf("\n");
14
+ const firstLine = (nl === -1 ? trimmed : trimmed.slice(0, nl)).trim();
15
+ const rest = nl === -1 ? "" : trimmed.slice(nl + 1).trim();
16
+ const m = firstLine.match(/^name:\s+(\S+)\s+description:\s+(.+)$/i);
17
+ if (!m) return null;
18
+ return {
19
+ name: m[1],
20
+ description: m[2].trim(),
21
+ body: rest
22
+ };
23
+ }
24
+ /** Same payload shape as `getSkillMarkdownSource`, built from raw SKILL.md text only. */
25
+ function buildSkillMarkdownPreviewFromRaw(raw, fallback) {
26
+ const flat = splitFlatNameDescriptionFirstLine(raw);
27
+ if (flat) {
28
+ const metadata = parseSkillMetadata({
29
+ name: flat.name,
30
+ description: flat.description
31
+ });
32
+ return {
33
+ name: flat.name,
34
+ description: flat.description || fallback.description.trim(),
35
+ bodyMarkdown: flat.body.trim(),
36
+ disableModelInvocation: false,
37
+ metadata,
38
+ toolConditions: void 0,
39
+ requiredEnvVarNames: void 0
40
+ };
41
+ }
42
+ const { frontmatter, content } = parseFrontmatter(raw.trim());
43
+ const fm = frontmatter;
44
+ const name = typeof fm.name === "string" && fm.name.trim() || fallback.name;
45
+ const description = (typeof fm.description === "string" ? fm.description.trim() : "") || fallback.description.trim() || "";
46
+ const metadata = parseSkillMetadata(fm);
47
+ if (!metadata.name.trim()) metadata.name = name;
48
+ if (!metadata.description.trim()) metadata.description = description;
49
+ const toolConditions = parseSkillToolConditions(fm);
50
+ const requiredEnvVarNames = parseRequiredEnvVarNames(fm);
51
+ return {
52
+ name,
53
+ description,
54
+ bodyMarkdown: content.trim(),
55
+ disableModelInvocation: fm["disable-model-invocation"] === true,
56
+ metadata,
57
+ toolConditions,
58
+ requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : void 0
59
+ };
60
+ }
61
+ //#endregion
62
+ export { buildSkillMarkdownPreviewFromRaw };
63
+
64
+ //# sourceMappingURL=skill-markdown-preview-from-raw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-markdown-preview-from-raw.js","names":[],"sources":["../../../../src/agent/skills/skill-markdown-preview-from-raw.ts"],"sourcesContent":["import { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { parseRequiredEnvVarNames } from './required-env-vars.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { parseSkillToolConditions } from './skill-tool-gating.js';\nimport type { SkillMarkdownPreviewPayload } from './types.js';\n\n/**\n * SkillHub / hand-authored SKILL.md sometimes uses a single first line:\n * `name: slug description: long text...` without `---` YAML fences.\n */\nfunction splitFlatNameDescriptionFirstLine(raw: string): { name: string; description: string; body: string } | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n const nl = trimmed.indexOf('\\n');\n const firstLine = (nl === -1 ? trimmed : trimmed.slice(0, nl)).trim();\n const rest = nl === -1 ? '' : trimmed.slice(nl + 1).trim();\n const m = firstLine.match(/^name:\\s+(\\S+)\\s+description:\\s+(.+)$/i);\n if (!m) return null;\n return { name: m[1], description: m[2].trim(), body: rest };\n}\n\n/** Same payload shape as `getSkillMarkdownSource`, built from raw SKILL.md text only. */\nexport function buildSkillMarkdownPreviewFromRaw(\n raw: string,\n fallback: { name: string; description: string },\n): SkillMarkdownPreviewPayload {\n const flat = splitFlatNameDescriptionFirstLine(raw);\n if (flat) {\n const fm = { name: flat.name, description: flat.description };\n const metadata = parseSkillMetadata(fm);\n return {\n name: flat.name,\n description: flat.description || fallback.description.trim(),\n bodyMarkdown: flat.body.trim(),\n disableModelInvocation: false,\n metadata,\n toolConditions: undefined,\n requiredEnvVarNames: undefined,\n };\n }\n\n const { frontmatter, content } = parseFrontmatter(raw.trim());\n const fm = frontmatter as Record<string, unknown>;\n const name = (typeof fm.name === 'string' && fm.name.trim()) || fallback.name;\n const descFromFm = typeof fm.description === 'string' ? fm.description.trim() : '';\n const description = descFromFm || fallback.description.trim() || '';\n const metadata = parseSkillMetadata(fm);\n if (!metadata.name.trim()) metadata.name = name;\n if (!metadata.description.trim()) metadata.description = description;\n\n const toolConditions = parseSkillToolConditions(fm);\n const requiredEnvVarNames = parseRequiredEnvVarNames(fm);\n\n return {\n name,\n description,\n bodyMarkdown: content.trim(),\n disableModelInvocation: fm['disable-model-invocation'] === true,\n metadata,\n toolConditions,\n requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : undefined,\n };\n}\n"],"mappings":";;;;;;;;;AAUA,SAAS,kCAAkC,KAAyE;CAClH,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,CAAC,QAAS,QAAO;CACrB,MAAM,KAAK,QAAQ,QAAQ,KAAK;CAChC,MAAM,aAAa,OAAO,KAAK,UAAU,QAAQ,MAAM,GAAG,GAAG,EAAE,MAAM;CACrE,MAAM,OAAO,OAAO,KAAK,KAAK,QAAQ,MAAM,KAAK,EAAE,CAAC,MAAM;CAC1D,MAAM,IAAI,UAAU,MAAM,yCAAyC;AACnE,KAAI,CAAC,EAAG,QAAO;AACf,QAAO;EAAE,MAAM,EAAE;EAAI,aAAa,EAAE,GAAG,MAAM;EAAE,MAAM;EAAM;;;AAI7D,SAAgB,iCACd,KACA,UAC6B;CAC7B,MAAM,OAAO,kCAAkC,IAAI;AACnD,KAAI,MAAM;EAER,MAAM,WAAW,mBAAmB;GADvB,MAAM,KAAK;GAAM,aAAa,KAAK;GACV,CAAC;AACvC,SAAO;GACL,MAAM,KAAK;GACX,aAAa,KAAK,eAAe,SAAS,YAAY,MAAM;GAC5D,cAAc,KAAK,KAAK,MAAM;GAC9B,wBAAwB;GACxB;GACA,gBAAgB,KAAA;GAChB,qBAAqB,KAAA;GACtB;;CAGH,MAAM,EAAE,aAAa,YAAY,iBAAiB,IAAI,MAAM,CAAC;CAC7D,MAAM,KAAK;CACX,MAAM,OAAQ,OAAO,GAAG,SAAS,YAAY,GAAG,KAAK,MAAM,IAAK,SAAS;CAEzE,MAAM,eADa,OAAO,GAAG,gBAAgB,WAAW,GAAG,YAAY,MAAM,GAAG,OAC9C,SAAS,YAAY,MAAM,IAAI;CACjE,MAAM,WAAW,mBAAmB,GAAG;AACvC,KAAI,CAAC,SAAS,KAAK,MAAM,CAAE,UAAS,OAAO;AAC3C,KAAI,CAAC,SAAS,YAAY,MAAM,CAAE,UAAS,cAAc;CAEzD,MAAM,iBAAiB,yBAAyB,GAAG;CACnD,MAAM,sBAAsB,yBAAyB,GAAG;AAExD,QAAO;EACL;EACA;EACA,cAAc,QAAQ,MAAM;EAC5B,wBAAwB,GAAG,gCAAgC;EAC3D;EACA;EACA,qBAAqB,oBAAoB,SAAS,IAAI,sBAAsB,KAAA;EAC7E"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Resolve safe paths for skill_view: only SKILL.md (default) or files under allowlisted subdirs.
3
+ * Also provides localized SKILL.md resolution for multi-language display.
3
4
  */
4
- import type { Skill } from './types.js';
5
+ import type { Skill, SkillMarkdownPreviewPayload } from './types.js';
5
6
  export type ResolveSkillFileResult = {
6
7
  ok: true;
7
8
  absolutePath: string;
@@ -14,3 +15,18 @@ export type ResolveSkillFileResult = {
14
15
  * Other paths must live under references/, templates/, scripts/, or assets/.
15
16
  */
16
17
  export declare function resolveSkillReadablePath(skill: Skill, subPath: string | undefined): ResolveSkillFileResult;
18
+ /**
19
+ * Resolve a localized SKILL.md for display (e.g. SKILL-zh.md, SKILL-en.md).
20
+ * Falls back to the base SKILL.md content if no localized file exists.
21
+ *
22
+ * This is the **display** path — execution always reads the base SKILL.md.
23
+ */
24
+ export declare function resolveLocalizedSkillMarkdown(skill: Skill, lang?: string): SkillMarkdownPreviewPayload | null;
25
+ /**
26
+ * Lightweight localized name/description lookup (frontmatter only) for list views.
27
+ * Reuses the same SKILL-{lang}.md resolution as {@link resolveLocalizedSkillMarkdown}.
28
+ */
29
+ export declare function resolveLocalizedSkillMeta(skill: Skill, lang: string): {
30
+ name: string;
31
+ description: string;
32
+ } | null;