@xopcai/xopcbot 0.1.0

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 (535) hide show
  1. package/README.md +132 -0
  2. package/README.zh-CN.md +130 -0
  3. package/dist/__tests__/core.test.d.ts +1 -0
  4. package/dist/__tests__/core.test.js +72 -0
  5. package/dist/__tests__/core.test.js.map +1 -0
  6. package/dist/agent/fallback/__tests__/index.test.d.ts +1 -0
  7. package/dist/agent/fallback/__tests__/index.test.js +111 -0
  8. package/dist/agent/fallback/__tests__/index.test.js.map +1 -0
  9. package/dist/agent/fallback/candidates.d.ts +23 -0
  10. package/dist/agent/fallback/candidates.js +62 -0
  11. package/dist/agent/fallback/candidates.js.map +1 -0
  12. package/dist/agent/fallback/error.d.ts +22 -0
  13. package/dist/agent/fallback/error.js +27 -0
  14. package/dist/agent/fallback/error.js.map +1 -0
  15. package/dist/agent/fallback/index.d.ts +6 -0
  16. package/dist/agent/fallback/index.js +5 -0
  17. package/dist/agent/fallback/index.js.map +1 -0
  18. package/dist/agent/fallback/reason.d.ts +7 -0
  19. package/dist/agent/fallback/reason.js +78 -0
  20. package/dist/agent/fallback/reason.js.map +1 -0
  21. package/dist/agent/fallback/runner.d.ts +22 -0
  22. package/dist/agent/fallback/runner.js +34 -0
  23. package/dist/agent/fallback/runner.js.map +1 -0
  24. package/dist/agent/helpers.d.ts +38 -0
  25. package/dist/agent/helpers.js +122 -0
  26. package/dist/agent/helpers.js.map +1 -0
  27. package/dist/agent/index.d.ts +7 -0
  28. package/dist/agent/index.js +7 -0
  29. package/dist/agent/index.js.map +1 -0
  30. package/dist/agent/memory/compaction.d.ts +63 -0
  31. package/dist/agent/memory/compaction.js +233 -0
  32. package/dist/agent/memory/compaction.js.map +1 -0
  33. package/dist/agent/memory/window.d.ts +29 -0
  34. package/dist/agent/memory/window.js +64 -0
  35. package/dist/agent/memory/window.js.map +1 -0
  36. package/dist/agent/model-manager.d.ts +80 -0
  37. package/dist/agent/model-manager.js +213 -0
  38. package/dist/agent/model-manager.js.map +1 -0
  39. package/dist/agent/prompt/heartbeat.d.ts +97 -0
  40. package/dist/agent/prompt/heartbeat.js +313 -0
  41. package/dist/agent/prompt/heartbeat.js.map +1 -0
  42. package/dist/agent/prompt/index.d.ts +65 -0
  43. package/dist/agent/prompt/index.js +215 -0
  44. package/dist/agent/prompt/index.js.map +1 -0
  45. package/dist/agent/prompt/memory/index.d.ts +37 -0
  46. package/dist/agent/prompt/memory/index.js +241 -0
  47. package/dist/agent/prompt/memory/index.js.map +1 -0
  48. package/dist/agent/prompt/modes.d.ts +44 -0
  49. package/dist/agent/prompt/modes.js +167 -0
  50. package/dist/agent/prompt/modes.js.map +1 -0
  51. package/dist/agent/prompt/safety.d.ts +88 -0
  52. package/dist/agent/prompt/safety.js +290 -0
  53. package/dist/agent/prompt/safety.js.map +1 -0
  54. package/dist/agent/service.d.ts +91 -0
  55. package/dist/agent/service.js +641 -0
  56. package/dist/agent/service.js.map +1 -0
  57. package/dist/agent/session-tracker.d.ts +73 -0
  58. package/dist/agent/session-tracker.js +137 -0
  59. package/dist/agent/session-tracker.js.map +1 -0
  60. package/dist/agent/skills/__tests__/test-framework.test.d.ts +4 -0
  61. package/dist/agent/skills/__tests__/test-framework.test.js +343 -0
  62. package/dist/agent/skills/__tests__/test-framework.test.js.map +1 -0
  63. package/dist/agent/skills/config.d.ts +58 -0
  64. package/dist/agent/skills/config.js +212 -0
  65. package/dist/agent/skills/config.js.map +1 -0
  66. package/dist/agent/skills/index.d.ts +25 -0
  67. package/dist/agent/skills/index.js +349 -0
  68. package/dist/agent/skills/index.js.map +1 -0
  69. package/dist/agent/skills/installer.d.ts +38 -0
  70. package/dist/agent/skills/installer.js +352 -0
  71. package/dist/agent/skills/installer.js.map +1 -0
  72. package/dist/agent/skills/scanner.d.ts +32 -0
  73. package/dist/agent/skills/scanner.js +265 -0
  74. package/dist/agent/skills/scanner.js.map +1 -0
  75. package/dist/agent/skills/test-framework.d.ts +107 -0
  76. package/dist/agent/skills/test-framework.js +607 -0
  77. package/dist/agent/skills/test-framework.js.map +1 -0
  78. package/dist/agent/skills/types.d.ts +181 -0
  79. package/dist/agent/skills/types.js +7 -0
  80. package/dist/agent/skills/types.js.map +1 -0
  81. package/dist/agent/skills/watcher.d.ts +37 -0
  82. package/dist/agent/skills/watcher.js +124 -0
  83. package/dist/agent/skills/watcher.js.map +1 -0
  84. package/dist/agent/tools/communication.d.ts +18 -0
  85. package/dist/agent/tools/communication.js +56 -0
  86. package/dist/agent/tools/communication.js.map +1 -0
  87. package/dist/agent/tools/edit-diff.d.ts +21 -0
  88. package/dist/agent/tools/edit-diff.js +69 -0
  89. package/dist/agent/tools/edit-diff.js.map +1 -0
  90. package/dist/agent/tools/edit.d.ts +13 -0
  91. package/dist/agent/tools/edit.js +65 -0
  92. package/dist/agent/tools/edit.js.map +1 -0
  93. package/dist/agent/tools/find.d.ts +24 -0
  94. package/dist/agent/tools/find.js +99 -0
  95. package/dist/agent/tools/find.js.map +1 -0
  96. package/dist/agent/tools/grep.d.ts +33 -0
  97. package/dist/agent/tools/grep.js +183 -0
  98. package/dist/agent/tools/grep.js.map +1 -0
  99. package/dist/agent/tools/index.d.ts +13 -0
  100. package/dist/agent/tools/index.js +18 -0
  101. package/dist/agent/tools/index.js.map +1 -0
  102. package/dist/agent/tools/list-dir.d.ts +6 -0
  103. package/dist/agent/tools/list-dir.js +37 -0
  104. package/dist/agent/tools/list-dir.js.map +1 -0
  105. package/dist/agent/tools/memory-tool.d.ts +14 -0
  106. package/dist/agent/tools/memory-tool.js +81 -0
  107. package/dist/agent/tools/memory-tool.js.map +1 -0
  108. package/dist/agent/tools/path-utils.d.ts +4 -0
  109. package/dist/agent/tools/path-utils.js +13 -0
  110. package/dist/agent/tools/path-utils.js.map +1 -0
  111. package/dist/agent/tools/read.d.ts +7 -0
  112. package/dist/agent/tools/read.js +47 -0
  113. package/dist/agent/tools/read.js.map +1 -0
  114. package/dist/agent/tools/send-media.d.ts +18 -0
  115. package/dist/agent/tools/send-media.js +104 -0
  116. package/dist/agent/tools/send-media.js.map +1 -0
  117. package/dist/agent/tools/shell.d.ts +13 -0
  118. package/dist/agent/tools/shell.js +114 -0
  119. package/dist/agent/tools/shell.js.map +1 -0
  120. package/dist/agent/tools/truncate.d.ts +36 -0
  121. package/dist/agent/tools/truncate.js +98 -0
  122. package/dist/agent/tools/truncate.js.map +1 -0
  123. package/dist/agent/tools/web.d.ts +14 -0
  124. package/dist/agent/tools/web.js +109 -0
  125. package/dist/agent/tools/web.js.map +1 -0
  126. package/dist/agent/tools/write.d.ts +7 -0
  127. package/dist/agent/tools/write.js +35 -0
  128. package/dist/agent/tools/write.js.map +1 -0
  129. package/dist/agent/types.d.ts +8 -0
  130. package/dist/agent/types.js +2 -0
  131. package/dist/agent/types.js.map +1 -0
  132. package/dist/agent/typing.d.ts +9 -0
  133. package/dist/agent/typing.js +32 -0
  134. package/dist/agent/typing.js.map +1 -0
  135. package/dist/auth/index.d.ts +12 -0
  136. package/dist/auth/index.js +14 -0
  137. package/dist/auth/index.js.map +1 -0
  138. package/dist/auth/oauth/anthropic.d.ts +7 -0
  139. package/dist/auth/oauth/anthropic.js +89 -0
  140. package/dist/auth/oauth/anthropic.js.map +1 -0
  141. package/dist/auth/oauth/github-copilot.d.ts +8 -0
  142. package/dist/auth/oauth/github-copilot.js +35 -0
  143. package/dist/auth/oauth/github-copilot.js.map +1 -0
  144. package/dist/auth/oauth/google-antigravity.d.ts +7 -0
  145. package/dist/auth/oauth/google-antigravity.js +27 -0
  146. package/dist/auth/oauth/google-antigravity.js.map +1 -0
  147. package/dist/auth/oauth/google-gemini-cli.d.ts +7 -0
  148. package/dist/auth/oauth/google-gemini-cli.js +28 -0
  149. package/dist/auth/oauth/google-gemini-cli.js.map +1 -0
  150. package/dist/auth/oauth/index.d.ts +14 -0
  151. package/dist/auth/oauth/index.js +15 -0
  152. package/dist/auth/oauth/index.js.map +1 -0
  153. package/dist/auth/oauth/kimi.d.ts +8 -0
  154. package/dist/auth/oauth/kimi.js +104 -0
  155. package/dist/auth/oauth/kimi.js.map +1 -0
  156. package/dist/auth/oauth/minimax.d.ts +8 -0
  157. package/dist/auth/oauth/minimax.js +109 -0
  158. package/dist/auth/oauth/minimax.js.map +1 -0
  159. package/dist/auth/oauth/openai-codex.d.ts +7 -0
  160. package/dist/auth/oauth/openai-codex.js +33 -0
  161. package/dist/auth/oauth/openai-codex.js.map +1 -0
  162. package/dist/auth/oauth/pkce.d.ts +8 -0
  163. package/dist/auth/oauth/pkce.js +22 -0
  164. package/dist/auth/oauth/pkce.js.map +1 -0
  165. package/dist/auth/oauth/qwen.d.ts +7 -0
  166. package/dist/auth/oauth/qwen.js +114 -0
  167. package/dist/auth/oauth/qwen.js.map +1 -0
  168. package/dist/auth/oauth/types.d.ts +46 -0
  169. package/dist/auth/oauth/types.js +7 -0
  170. package/dist/auth/oauth/types.js.map +1 -0
  171. package/dist/auth/profiles/index.d.ts +16 -0
  172. package/dist/auth/profiles/index.js +17 -0
  173. package/dist/auth/profiles/index.js.map +1 -0
  174. package/dist/auth/profiles/oauth.d.ts +12 -0
  175. package/dist/auth/profiles/oauth.js +106 -0
  176. package/dist/auth/profiles/oauth.js.map +1 -0
  177. package/dist/auth/profiles/order.d.ts +19 -0
  178. package/dist/auth/profiles/order.js +63 -0
  179. package/dist/auth/profiles/order.js.map +1 -0
  180. package/dist/auth/profiles/profiles.d.ts +27 -0
  181. package/dist/auth/profiles/profiles.js +110 -0
  182. package/dist/auth/profiles/profiles.js.map +1 -0
  183. package/dist/auth/profiles/store.d.ts +17 -0
  184. package/dist/auth/profiles/store.js +234 -0
  185. package/dist/auth/profiles/store.js.map +1 -0
  186. package/dist/auth/profiles/types.d.ts +64 -0
  187. package/dist/auth/profiles/types.js +7 -0
  188. package/dist/auth/profiles/types.js.map +1 -0
  189. package/dist/auth/profiles/usage.d.ts +24 -0
  190. package/dist/auth/profiles/usage.js +99 -0
  191. package/dist/auth/profiles/usage.js.map +1 -0
  192. package/dist/auth/storage.d.ts +99 -0
  193. package/dist/auth/storage.js +315 -0
  194. package/dist/auth/storage.js.map +1 -0
  195. package/dist/bus/index.d.ts +3 -0
  196. package/dist/bus/index.js +2 -0
  197. package/dist/bus/index.js.map +1 -0
  198. package/dist/bus/queue.d.ts +20 -0
  199. package/dist/bus/queue.js +57 -0
  200. package/dist/bus/queue.js.map +1 -0
  201. package/dist/channels/__tests__/access-control.test.d.ts +4 -0
  202. package/dist/channels/__tests__/access-control.test.js +310 -0
  203. package/dist/channels/__tests__/access-control.test.js.map +1 -0
  204. package/dist/channels/__tests__/draft-stream.test.d.ts +4 -0
  205. package/dist/channels/__tests__/draft-stream.test.js +243 -0
  206. package/dist/channels/__tests__/draft-stream.test.js.map +1 -0
  207. package/dist/channels/__tests__/format.test.d.ts +4 -0
  208. package/dist/channels/__tests__/format.test.js +146 -0
  209. package/dist/channels/__tests__/format.test.js.map +1 -0
  210. package/dist/channels/__tests__/manager.test.d.ts +6 -0
  211. package/dist/channels/__tests__/manager.test.js +34 -0
  212. package/dist/channels/__tests__/manager.test.js.map +1 -0
  213. package/dist/channels/__tests__/typing-controller.test.d.ts +4 -0
  214. package/dist/channels/__tests__/typing-controller.test.js +109 -0
  215. package/dist/channels/__tests__/typing-controller.test.js.map +1 -0
  216. package/dist/channels/__tests__/update-offset-store.test.d.ts +7 -0
  217. package/dist/channels/__tests__/update-offset-store.test.js +35 -0
  218. package/dist/channels/__tests__/update-offset-store.test.js.map +1 -0
  219. package/dist/channels/access-control.d.ts +93 -0
  220. package/dist/channels/access-control.js +201 -0
  221. package/dist/channels/access-control.js.map +1 -0
  222. package/dist/channels/draft-stream.d.ts +55 -0
  223. package/dist/channels/draft-stream.js +211 -0
  224. package/dist/channels/draft-stream.js.map +1 -0
  225. package/dist/channels/format.d.ts +38 -0
  226. package/dist/channels/format.js +187 -0
  227. package/dist/channels/format.js.map +1 -0
  228. package/dist/channels/index.d.ts +22 -0
  229. package/dist/channels/index.js +23 -0
  230. package/dist/channels/index.js.map +1 -0
  231. package/dist/channels/manager.d.ts +30 -0
  232. package/dist/channels/manager.js +125 -0
  233. package/dist/channels/manager.js.map +1 -0
  234. package/dist/channels/telegram/__tests__/index.test.d.ts +4 -0
  235. package/dist/channels/telegram/__tests__/index.test.js +153 -0
  236. package/dist/channels/telegram/__tests__/index.test.js.map +1 -0
  237. package/dist/channels/telegram/__tests__/inline-keyboards.test.d.ts +4 -0
  238. package/dist/channels/telegram/__tests__/inline-keyboards.test.js +99 -0
  239. package/dist/channels/telegram/__tests__/inline-keyboards.test.js.map +1 -0
  240. package/dist/channels/telegram/client.d.ts +48 -0
  241. package/dist/channels/telegram/client.js +177 -0
  242. package/dist/channels/telegram/client.js.map +1 -0
  243. package/dist/channels/telegram/command-handler.d.ts +28 -0
  244. package/dist/channels/telegram/command-handler.js +209 -0
  245. package/dist/channels/telegram/command-handler.js.map +1 -0
  246. package/dist/channels/telegram/index.d.ts +8 -0
  247. package/dist/channels/telegram/index.js +9 -0
  248. package/dist/channels/telegram/index.js.map +1 -0
  249. package/dist/channels/telegram/inline-keyboards.d.ts +20 -0
  250. package/dist/channels/telegram/inline-keyboards.js +38 -0
  251. package/dist/channels/telegram/inline-keyboards.js.map +1 -0
  252. package/dist/channels/telegram/plugin.d.ts +33 -0
  253. package/dist/channels/telegram/plugin.js +640 -0
  254. package/dist/channels/telegram/plugin.js.map +1 -0
  255. package/dist/channels/telegram/webhook.d.ts +31 -0
  256. package/dist/channels/telegram/webhook.js +129 -0
  257. package/dist/channels/telegram/webhook.js.map +1 -0
  258. package/dist/channels/types.d.ts +186 -0
  259. package/dist/channels/types.js +7 -0
  260. package/dist/channels/types.js.map +1 -0
  261. package/dist/channels/typing-controller.d.ts +47 -0
  262. package/dist/channels/typing-controller.js +117 -0
  263. package/dist/channels/typing-controller.js.map +1 -0
  264. package/dist/channels/update-offset-store.d.ts +37 -0
  265. package/dist/channels/update-offset-store.js +165 -0
  266. package/dist/channels/update-offset-store.js.map +1 -0
  267. package/dist/channels/whatsapp/index.d.ts +4 -0
  268. package/dist/channels/whatsapp/index.js +5 -0
  269. package/dist/channels/whatsapp/index.js.map +1 -0
  270. package/dist/channels/whatsapp/plugin.d.ts +27 -0
  271. package/dist/channels/whatsapp/plugin.js +66 -0
  272. package/dist/channels/whatsapp/plugin.js.map +1 -0
  273. package/dist/cli/__tests__/registry.test.d.ts +1 -0
  274. package/dist/cli/__tests__/registry.test.js +366 -0
  275. package/dist/cli/__tests__/registry.test.js.map +1 -0
  276. package/dist/cli/commands/agent.d.ts +1 -0
  277. package/dist/cli/commands/agent.js +216 -0
  278. package/dist/cli/commands/agent.js.map +1 -0
  279. package/dist/cli/commands/auth.d.ts +6 -0
  280. package/dist/cli/commands/auth.js +440 -0
  281. package/dist/cli/commands/auth.js.map +1 -0
  282. package/dist/cli/commands/config.d.ts +1 -0
  283. package/dist/cli/commands/config.js +135 -0
  284. package/dist/cli/commands/config.js.map +1 -0
  285. package/dist/cli/commands/configure.d.ts +1 -0
  286. package/dist/cli/commands/configure.js +173 -0
  287. package/dist/cli/commands/configure.js.map +1 -0
  288. package/dist/cli/commands/cron.d.ts +1 -0
  289. package/dist/cli/commands/cron.js +81 -0
  290. package/dist/cli/commands/cron.js.map +1 -0
  291. package/dist/cli/commands/gateway.d.ts +1 -0
  292. package/dist/cli/commands/gateway.js +91 -0
  293. package/dist/cli/commands/gateway.js.map +1 -0
  294. package/dist/cli/commands/index.d.ts +0 -0
  295. package/dist/cli/commands/index.js +2 -0
  296. package/dist/cli/commands/index.js.map +1 -0
  297. package/dist/cli/commands/models.d.ts +1 -0
  298. package/dist/cli/commands/models.js +79 -0
  299. package/dist/cli/commands/models.js.map +1 -0
  300. package/dist/cli/commands/onboard.d.ts +1 -0
  301. package/dist/cli/commands/onboard.js +621 -0
  302. package/dist/cli/commands/onboard.js.map +1 -0
  303. package/dist/cli/commands/plugin.d.ts +1 -0
  304. package/dist/cli/commands/plugin.js +341 -0
  305. package/dist/cli/commands/plugin.js.map +1 -0
  306. package/dist/cli/commands/session.d.ts +1 -0
  307. package/dist/cli/commands/session.js +450 -0
  308. package/dist/cli/commands/session.js.map +1 -0
  309. package/dist/cli/commands/skills-test.d.ts +9 -0
  310. package/dist/cli/commands/skills-test.js +195 -0
  311. package/dist/cli/commands/skills-test.js.map +1 -0
  312. package/dist/cli/commands/skills.d.ts +9 -0
  313. package/dist/cli/commands/skills.js +385 -0
  314. package/dist/cli/commands/skills.js.map +1 -0
  315. package/dist/cli/index.d.ts +19 -0
  316. package/dist/cli/index.js +40 -0
  317. package/dist/cli/index.js.map +1 -0
  318. package/dist/cli/registry.d.ts +43 -0
  319. package/dist/cli/registry.js +82 -0
  320. package/dist/cli/registry.js.map +1 -0
  321. package/dist/cli/templates.d.ts +19 -0
  322. package/dist/cli/templates.js +191 -0
  323. package/dist/cli/templates.js.map +1 -0
  324. package/dist/cli/utils/colors.d.ts +13 -0
  325. package/dist/cli/utils/colors.js +16 -0
  326. package/dist/cli/utils/colors.js.map +1 -0
  327. package/dist/config/__tests__/diff.test.d.ts +1 -0
  328. package/dist/config/__tests__/diff.test.js +192 -0
  329. package/dist/config/__tests__/diff.test.js.map +1 -0
  330. package/dist/config/__tests__/loader.test.d.ts +1 -0
  331. package/dist/config/__tests__/loader.test.js +356 -0
  332. package/dist/config/__tests__/loader.test.js.map +1 -0
  333. package/dist/config/__tests__/paths.test.d.ts +1 -0
  334. package/dist/config/__tests__/paths.test.js +192 -0
  335. package/dist/config/__tests__/paths.test.js.map +1 -0
  336. package/dist/config/__tests__/reload.test.d.ts +1 -0
  337. package/dist/config/__tests__/reload.test.js +374 -0
  338. package/dist/config/__tests__/reload.test.js.map +1 -0
  339. package/dist/config/__tests__/rules.test.d.ts +1 -0
  340. package/dist/config/__tests__/rules.test.js +204 -0
  341. package/dist/config/__tests__/rules.test.js.map +1 -0
  342. package/dist/config/__tests__/schema.test.d.ts +1 -0
  343. package/dist/config/__tests__/schema.test.js +672 -0
  344. package/dist/config/__tests__/schema.test.js.map +1 -0
  345. package/dist/config/diff.d.ts +7 -0
  346. package/dist/config/diff.js +46 -0
  347. package/dist/config/diff.js.map +1 -0
  348. package/dist/config/index.d.ts +6 -0
  349. package/dist/config/index.js +7 -0
  350. package/dist/config/index.js.map +1 -0
  351. package/dist/config/loader.d.ts +5 -0
  352. package/dist/config/loader.js +81 -0
  353. package/dist/config/loader.js.map +1 -0
  354. package/dist/config/paths.d.ts +35 -0
  355. package/dist/config/paths.js +79 -0
  356. package/dist/config/paths.js.map +1 -0
  357. package/dist/config/reload.d.ts +78 -0
  358. package/dist/config/reload.js +190 -0
  359. package/dist/config/reload.js.map +1 -0
  360. package/dist/config/rules.d.ts +42 -0
  361. package/dist/config/rules.js +114 -0
  362. package/dist/config/rules.js.map +1 -0
  363. package/dist/config/schema.d.ts +1340 -0
  364. package/dist/config/schema.js +611 -0
  365. package/dist/config/schema.js.map +1 -0
  366. package/dist/cron/executor.d.ts +54 -0
  367. package/dist/cron/executor.js +364 -0
  368. package/dist/cron/executor.js.map +1 -0
  369. package/dist/cron/index.d.ts +5 -0
  370. package/dist/cron/index.js +6 -0
  371. package/dist/cron/index.js.map +1 -0
  372. package/dist/cron/persistence.d.ts +61 -0
  373. package/dist/cron/persistence.js +188 -0
  374. package/dist/cron/persistence.js.map +1 -0
  375. package/dist/cron/service.d.ts +94 -0
  376. package/dist/cron/service.js +382 -0
  377. package/dist/cron/service.js.map +1 -0
  378. package/dist/cron/types.d.ts +119 -0
  379. package/dist/cron/types.js +3 -0
  380. package/dist/cron/types.js.map +1 -0
  381. package/dist/cron/validation.d.ts +144 -0
  382. package/dist/cron/validation.js +113 -0
  383. package/dist/cron/validation.js.map +1 -0
  384. package/dist/errors/__tests__/index.test.d.ts +1 -0
  385. package/dist/errors/__tests__/index.test.js +301 -0
  386. package/dist/errors/__tests__/index.test.js.map +1 -0
  387. package/dist/errors/index.d.ts +114 -0
  388. package/dist/errors/index.js +278 -0
  389. package/dist/errors/index.js.map +1 -0
  390. package/dist/gateway/hono/app.d.ts +7 -0
  391. package/dist/gateway/hono/app.js +668 -0
  392. package/dist/gateway/hono/app.js.map +1 -0
  393. package/dist/gateway/hono/index.d.ts +2 -0
  394. package/dist/gateway/hono/index.js +3 -0
  395. package/dist/gateway/hono/index.js.map +1 -0
  396. package/dist/gateway/hono/middleware/auth.d.ts +18 -0
  397. package/dist/gateway/hono/middleware/auth.js +79 -0
  398. package/dist/gateway/hono/middleware/auth.js.map +1 -0
  399. package/dist/gateway/hono/middleware/logger.d.ts +1 -0
  400. package/dist/gateway/hono/middleware/logger.js +17 -0
  401. package/dist/gateway/hono/middleware/logger.js.map +1 -0
  402. package/dist/gateway/hono/sse.d.ts +55 -0
  403. package/dist/gateway/hono/sse.js +224 -0
  404. package/dist/gateway/hono/sse.js.map +1 -0
  405. package/dist/gateway/index.d.ts +4 -0
  406. package/dist/gateway/index.js +5 -0
  407. package/dist/gateway/index.js.map +1 -0
  408. package/dist/gateway/protocol.d.ts +28 -0
  409. package/dist/gateway/protocol.js +14 -0
  410. package/dist/gateway/protocol.js.map +1 -0
  411. package/dist/gateway/server.d.ts +19 -0
  412. package/dist/gateway/server.js +64 -0
  413. package/dist/gateway/server.js.map +1 -0
  414. package/dist/gateway/service.d.ts +265 -0
  415. package/dist/gateway/service.js +621 -0
  416. package/dist/gateway/service.js.map +1 -0
  417. package/dist/gateway/static/root/assets/main-CfIxL-cL.js +2105 -0
  418. package/dist/gateway/static/root/assets/main-CfIxL-cL.js.map +1 -0
  419. package/dist/gateway/static/root/assets/main-DndcTCgX.css +1 -0
  420. package/dist/gateway/static/root/index.html +116 -0
  421. package/dist/heartbeat/index.d.ts +1 -0
  422. package/dist/heartbeat/index.js +2 -0
  423. package/dist/heartbeat/index.js.map +1 -0
  424. package/dist/heartbeat/service.d.ts +19 -0
  425. package/dist/heartbeat/service.js +61 -0
  426. package/dist/heartbeat/service.js.map +1 -0
  427. package/dist/plugin-sdk/index.d.ts +21 -0
  428. package/dist/plugin-sdk/index.js +12 -0
  429. package/dist/plugin-sdk/index.js.map +1 -0
  430. package/dist/plugins/__tests__/api.test.d.ts +1 -0
  431. package/dist/plugins/__tests__/api.test.js +164 -0
  432. package/dist/plugins/__tests__/api.test.js.map +1 -0
  433. package/dist/plugins/__tests__/hooks.test.d.ts +1 -0
  434. package/dist/plugins/__tests__/hooks.test.js +159 -0
  435. package/dist/plugins/__tests__/hooks.test.js.map +1 -0
  436. package/dist/plugins/__tests__/loader.test.d.ts +1 -0
  437. package/dist/plugins/__tests__/loader.test.js +120 -0
  438. package/dist/plugins/__tests__/loader.test.js.map +1 -0
  439. package/dist/plugins/api.d.ts +41 -0
  440. package/dist/plugins/api.js +131 -0
  441. package/dist/plugins/api.js.map +1 -0
  442. package/dist/plugins/hooks.d.ts +153 -0
  443. package/dist/plugins/hooks.js +172 -0
  444. package/dist/plugins/hooks.js.map +1 -0
  445. package/dist/plugins/index.d.ts +11 -0
  446. package/dist/plugins/index.js +16 -0
  447. package/dist/plugins/index.js.map +1 -0
  448. package/dist/plugins/install.d.ts +59 -0
  449. package/dist/plugins/install.js +324 -0
  450. package/dist/plugins/install.js.map +1 -0
  451. package/dist/plugins/loader.d.ts +84 -0
  452. package/dist/plugins/loader.js +545 -0
  453. package/dist/plugins/loader.js.map +1 -0
  454. package/dist/plugins/types.d.ts +190 -0
  455. package/dist/plugins/types.js +7 -0
  456. package/dist/plugins/types.js.map +1 -0
  457. package/dist/providers/__tests__/registry.test.d.ts +1 -0
  458. package/dist/providers/__tests__/registry.test.js +110 -0
  459. package/dist/providers/__tests__/registry.test.js.map +1 -0
  460. package/dist/providers/api-strategies.d.ts +15 -0
  461. package/dist/providers/api-strategies.js +96 -0
  462. package/dist/providers/api-strategies.js.map +1 -0
  463. package/dist/providers/auto-discovery.d.ts +84 -0
  464. package/dist/providers/auto-discovery.js +236 -0
  465. package/dist/providers/auto-discovery.js.map +1 -0
  466. package/dist/providers/config.d.ts +25 -0
  467. package/dist/providers/config.js +42 -0
  468. package/dist/providers/config.js.map +1 -0
  469. package/dist/providers/index.d.ts +25 -0
  470. package/dist/providers/index.js +55 -0
  471. package/dist/providers/index.js.map +1 -0
  472. package/dist/providers/model-catalog.d.ts +205 -0
  473. package/dist/providers/model-catalog.js +1071 -0
  474. package/dist/providers/model-catalog.js.map +1 -0
  475. package/dist/providers/models-dev-data.d.ts +11 -0
  476. package/dist/providers/models-dev-data.js +1035 -0
  477. package/dist/providers/models-dev-data.js.map +1 -0
  478. package/dist/providers/models-dev.d.ts +30 -0
  479. package/dist/providers/models-dev.js +42 -0
  480. package/dist/providers/models-dev.js.map +1 -0
  481. package/dist/providers/pi-ai.d.ts +62 -0
  482. package/dist/providers/pi-ai.js +221 -0
  483. package/dist/providers/pi-ai.js.map +1 -0
  484. package/dist/providers/provider-catalog.d.ts +173 -0
  485. package/dist/providers/provider-catalog.js +834 -0
  486. package/dist/providers/provider-catalog.js.map +1 -0
  487. package/dist/providers/registry.d.ts +155 -0
  488. package/dist/providers/registry.js +524 -0
  489. package/dist/providers/registry.js.map +1 -0
  490. package/dist/providers/types.d.ts +95 -0
  491. package/dist/providers/types.js +7 -0
  492. package/dist/providers/types.js.map +1 -0
  493. package/dist/session/chat-manager.d.ts +49 -0
  494. package/dist/session/chat-manager.js +167 -0
  495. package/dist/session/chat-manager.js.map +1 -0
  496. package/dist/session/chat-types.d.ts +53 -0
  497. package/dist/session/chat-types.js +63 -0
  498. package/dist/session/chat-types.js.map +1 -0
  499. package/dist/session/index.d.ts +5 -0
  500. package/dist/session/index.js +5 -0
  501. package/dist/session/index.js.map +1 -0
  502. package/dist/session/manager.d.ts +103 -0
  503. package/dist/session/manager.js +200 -0
  504. package/dist/session/manager.js.map +1 -0
  505. package/dist/session/store.d.ts +114 -0
  506. package/dist/session/store.js +687 -0
  507. package/dist/session/store.js.map +1 -0
  508. package/dist/session/types.d.ts +88 -0
  509. package/dist/session/types.js +10 -0
  510. package/dist/session/types.js.map +1 -0
  511. package/dist/types/index.d.ts +177 -0
  512. package/dist/types/index.js +4 -0
  513. package/dist/types/index.js.map +1 -0
  514. package/dist/types/providers.d.ts +67 -0
  515. package/dist/types/providers.js +7 -0
  516. package/dist/types/providers.js.map +1 -0
  517. package/dist/utils/frontmatter.d.ts +17 -0
  518. package/dist/utils/frontmatter.js +104 -0
  519. package/dist/utils/frontmatter.js.map +1 -0
  520. package/dist/utils/helpers.d.ts +5 -0
  521. package/dist/utils/helpers.js +36 -0
  522. package/dist/utils/helpers.js.map +1 -0
  523. package/dist/utils/index.d.ts +2 -0
  524. package/dist/utils/index.js +3 -0
  525. package/dist/utils/index.js.map +1 -0
  526. package/dist/utils/log-store.d.ts +78 -0
  527. package/dist/utils/log-store.js +432 -0
  528. package/dist/utils/log-store.js.map +1 -0
  529. package/dist/utils/logger.d.ts +127 -0
  530. package/dist/utils/logger.js +481 -0
  531. package/dist/utils/logger.js.map +1 -0
  532. package/dist/utils/logger.types.d.ts +152 -0
  533. package/dist/utils/logger.types.js +30 -0
  534. package/dist/utils/logger.types.js.map +1 -0
  535. package/package.json +93 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Skill Configuration Manager
3
+ *
4
+ * Handles skill-specific configuration and environment variables.
5
+ * Inspired by openclaw's skills config system
6
+ */
7
+ import type { SkillConfig, SkillsConfig, Skill } from './types.js';
8
+ /**
9
+ * Resolve skill configuration from multiple sources
10
+ *
11
+ * Priority (highest to lowest):
12
+ * 1. Environment variable overrides (XOPCBOT_SKILL_<NAME>_<KEY>)
13
+ * 2. Config file entries
14
+ * 3. Skill defaults
15
+ */
16
+ export declare function resolveSkillConfig(skill: Skill, skillsConfig?: SkillsConfig): SkillConfig;
17
+ /**
18
+ * Apply environment variable overrides to a skill's environment
19
+ */
20
+ export declare function applySkillEnvOverrides(skill: Skill, baseEnv?: Record<string, string>, skillConfig?: SkillConfig): Record<string, string>;
21
+ /**
22
+ * Get the effective environment for a skill
23
+ */
24
+ export declare function getSkillEnvironment(skill: Skill, skillsConfig?: SkillsConfig): Record<string, string>;
25
+ /**
26
+ * Skill configuration file manager
27
+ */
28
+ export interface SkillConfigFile {
29
+ /** Path to the config file */
30
+ configPath: string;
31
+ /** Load configuration */
32
+ load: () => SkillsConfig;
33
+ /** Save configuration */
34
+ save: (config: SkillsConfig) => void;
35
+ /** Get skill-specific config */
36
+ getSkillConfig: (skillName: string) => SkillConfig | undefined;
37
+ /** Update skill configuration */
38
+ updateSkillConfig: (skillName: string, config: Partial<SkillConfig>) => void;
39
+ /** Enable/disable a skill */
40
+ setSkillEnabled: (skillName: string, enabled: boolean) => void;
41
+ /** Set skill API key */
42
+ setSkillApiKey: (skillName: string, apiKey: string) => void;
43
+ }
44
+ /**
45
+ * Create a skill configuration file manager
46
+ */
47
+ export declare function createSkillConfigManager(configDir: string): SkillConfigFile;
48
+ /**
49
+ * Check if a skill is enabled
50
+ */
51
+ export declare function isSkillEnabled(skill: Skill, skillsConfig?: SkillsConfig): boolean;
52
+ /**
53
+ * Validate skill configuration
54
+ */
55
+ export declare function validateSkillConfig(config: SkillsConfig): {
56
+ valid: boolean;
57
+ errors: string[];
58
+ };
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Skill Configuration Manager
3
+ *
4
+ * Handles skill-specific configuration and environment variables.
5
+ * Inspired by openclaw's skills config system
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { createLogger } from '../../utils/logger.js';
10
+ const log = createLogger('SkillConfig');
11
+ /**
12
+ * Resolve skill configuration from multiple sources
13
+ *
14
+ * Priority (highest to lowest):
15
+ * 1. Environment variable overrides (XOPCBOT_SKILL_<NAME>_<KEY>)
16
+ * 2. Config file entries
17
+ * 3. Skill defaults
18
+ */
19
+ export function resolveSkillConfig(skill, skillsConfig) {
20
+ const config = {};
21
+ // Start with config file entries
22
+ const entryConfig = skillsConfig?.entries?.[skill.name];
23
+ if (entryConfig) {
24
+ config.enabled = entryConfig.enabled;
25
+ config.apiKey = entryConfig.apiKey;
26
+ config.env = entryConfig.env ? { ...entryConfig.env } : undefined;
27
+ config.config = entryConfig.config ? { ...entryConfig.config } : undefined;
28
+ }
29
+ // Apply environment variable overrides
30
+ const envPrefix = `XOPCBOT_SKILL_${skill.name.toUpperCase().replace(/-/g, '_')}`;
31
+ // Check for enabled override
32
+ const enabledEnv = process.env[`${envPrefix}_ENABLED`];
33
+ if (enabledEnv !== undefined) {
34
+ config.enabled = enabledEnv.toLowerCase() === 'true' || enabledEnv === '1';
35
+ }
36
+ // Check for API key override
37
+ const apiKeyEnv = process.env[`${envPrefix}_API_KEY`];
38
+ if (apiKeyEnv) {
39
+ config.apiKey = apiKeyEnv;
40
+ }
41
+ // Check for environment variable overrides
42
+ for (const [key, value] of Object.entries(process.env)) {
43
+ if (key.startsWith(`${envPrefix}_ENV_`)) {
44
+ const envKey = key.slice(`${envPrefix}_ENV_`.length);
45
+ if (!config.env) {
46
+ config.env = {};
47
+ }
48
+ config.env[envKey] = value;
49
+ }
50
+ }
51
+ return config;
52
+ }
53
+ /**
54
+ * Apply environment variable overrides to a skill's environment
55
+ */
56
+ export function applySkillEnvOverrides(skill, baseEnv = {}, skillConfig) {
57
+ const env = { ...baseEnv };
58
+ // Apply config env
59
+ if (skillConfig?.env) {
60
+ for (const [key, value] of Object.entries(skillConfig.env)) {
61
+ env[key] = value;
62
+ }
63
+ }
64
+ // Apply environment variable overrides
65
+ const envPrefix = `XOPCBOT_SKILL_${skill.name.toUpperCase().replace(/-/g, '_')}`;
66
+ for (const [key, value] of Object.entries(process.env)) {
67
+ if (key.startsWith(`${envPrefix}_ENV_`)) {
68
+ const envKey = key.slice(`${envPrefix}_ENV_`.length);
69
+ env[envKey] = value;
70
+ }
71
+ }
72
+ return env;
73
+ }
74
+ /**
75
+ * Get the effective environment for a skill
76
+ */
77
+ export function getSkillEnvironment(skill, skillsConfig) {
78
+ const config = resolveSkillConfig(skill, skillsConfig);
79
+ return applySkillEnvOverrides(skill, process.env, config);
80
+ }
81
+ /**
82
+ * Create a skill configuration file manager
83
+ */
84
+ export function createSkillConfigManager(configDir) {
85
+ const configPath = join(configDir, 'skills.json');
86
+ function loadConfig() {
87
+ if (!existsSync(configPath)) {
88
+ return {};
89
+ }
90
+ try {
91
+ const content = readFileSync(configPath, 'utf-8');
92
+ return JSON.parse(content);
93
+ }
94
+ catch (err) {
95
+ log.warn({ error: err }, 'Failed to load skills config, using defaults');
96
+ return {};
97
+ }
98
+ }
99
+ function saveConfig(config) {
100
+ try {
101
+ writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
102
+ log.info('Saved skills config');
103
+ }
104
+ catch (err) {
105
+ log.error({ error: err }, 'Failed to save skills config');
106
+ }
107
+ }
108
+ return {
109
+ configPath,
110
+ load: loadConfig,
111
+ save: saveConfig,
112
+ getSkillConfig: (skillName) => {
113
+ const config = loadConfig();
114
+ return config.entries?.[skillName];
115
+ },
116
+ updateSkillConfig: (skillName, updates) => {
117
+ const config = loadConfig();
118
+ if (!config.entries) {
119
+ config.entries = {};
120
+ }
121
+ const existing = config.entries[skillName] || {};
122
+ config.entries[skillName] = {
123
+ ...existing,
124
+ ...updates,
125
+ };
126
+ saveConfig(config);
127
+ },
128
+ setSkillEnabled: (skillName, enabled) => {
129
+ const config = loadConfig();
130
+ if (!config.entries) {
131
+ config.entries = {};
132
+ }
133
+ const existing = config.entries[skillName] || {};
134
+ config.entries[skillName] = {
135
+ ...existing,
136
+ enabled,
137
+ };
138
+ saveConfig(config);
139
+ log.info({ skillName, enabled }, 'Updated skill enabled state');
140
+ },
141
+ setSkillApiKey: (skillName, apiKey) => {
142
+ const config = loadConfig();
143
+ if (!config.entries) {
144
+ config.entries = {};
145
+ }
146
+ const existing = config.entries[skillName] || {};
147
+ config.entries[skillName] = {
148
+ ...existing,
149
+ apiKey,
150
+ };
151
+ saveConfig(config);
152
+ log.info({ skillName }, 'Updated skill API key');
153
+ },
154
+ };
155
+ }
156
+ /**
157
+ * Check if a skill is enabled
158
+ */
159
+ export function isSkillEnabled(skill, skillsConfig) {
160
+ const config = resolveSkillConfig(skill, skillsConfig);
161
+ // Explicitly disabled
162
+ if (config.enabled === false) {
163
+ return false;
164
+ }
165
+ // Check if skill has requirements that are not met
166
+ const requires = skill.metadata.requires || skill.metadata.openclaw?.requires;
167
+ if (requires?.bins) {
168
+ const { hasBinary } = require('./installer.js');
169
+ for (const bin of requires.bins) {
170
+ if (!hasBinary(bin)) {
171
+ log.debug({ skill: skill.name, bin }, 'Skill requirement not met');
172
+ return false;
173
+ }
174
+ }
175
+ }
176
+ return true;
177
+ }
178
+ /**
179
+ * Validate skill configuration
180
+ */
181
+ export function validateSkillConfig(config) {
182
+ const errors = [];
183
+ // Validate limits
184
+ const limits = config.limits;
185
+ if (limits) {
186
+ if (limits.maxCandidatesPerRoot !== undefined && limits.maxCandidatesPerRoot < 1) {
187
+ errors.push('limits.maxCandidatesPerRoot must be at least 1');
188
+ }
189
+ if (limits.maxSkillsLoadedPerSource !== undefined && limits.maxSkillsLoadedPerSource < 1) {
190
+ errors.push('limits.maxSkillsLoadedPerSource must be at least 1');
191
+ }
192
+ if (limits.maxSkillsInPrompt !== undefined && limits.maxSkillsInPrompt < 1) {
193
+ errors.push('limits.maxSkillsInPrompt must be at least 1');
194
+ }
195
+ }
196
+ // Validate entries
197
+ if (config.entries) {
198
+ for (const [skillName, skillConfig] of Object.entries(config.entries)) {
199
+ if (skillConfig.apiKey && typeof skillConfig.apiKey !== 'string') {
200
+ errors.push(`entries.${skillName}.apiKey must be a string`);
201
+ }
202
+ if (skillConfig.env && typeof skillConfig.env !== 'object') {
203
+ errors.push(`entries.${skillName}.env must be an object`);
204
+ }
205
+ }
206
+ }
207
+ return {
208
+ valid: errors.length === 0,
209
+ errors,
210
+ };
211
+ }
212
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/agent/skills/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Skill, SkillDiagnostic, LoadSkillsResult, SkillConfig } from './types.js';
2
+ export declare function loadSkills(options: {
3
+ workspaceDir?: string;
4
+ globalDir?: string;
5
+ builtinDir?: string;
6
+ extraDirs?: string[];
7
+ }): LoadSkillsResult;
8
+ export interface SkillLoader {
9
+ init: (workspace: string, builtin: string | null) => LoadSkillsResult;
10
+ load: () => LoadSkillsResult;
11
+ reload: () => LoadSkillsResult;
12
+ getSkills: () => Skill[];
13
+ getPrompt: () => string;
14
+ getDiagnostics: () => SkillDiagnostic[];
15
+ getLastLoadTime: () => number;
16
+ getSkillByName: (name: string) => Skill | undefined;
17
+ getEnabledSkills: (config?: Record<string, SkillConfig>) => Skill[];
18
+ }
19
+ export declare function createSkillLoader(): SkillLoader;
20
+ export type { Skill, SkillMetadata, SkillConfig, SkillInstallSpec, SkillInstallResult, SkillInstallRequest, LoadSkillsResult, SkillDiagnostic, SkillSnapshot, } from './types.js';
21
+ export { installSkill, findInstallSpec, hasBinary, getDefaultInstallerPreferences, type InstallerPreferences, type InstallContext, } from './installer.js';
22
+ export { scanSkillDirectory, formatScanSummary, collectSkillInstallWarnings, type ScanSummary, type SecurityFinding, type Severity, } from './scanner.js';
23
+ export { resolveSkillConfig, applySkillEnvOverrides, getSkillEnvironment, createSkillConfigManager, isSkillEnabled, validateSkillConfig, type SkillConfigFile, } from './config.js';
24
+ export { createSkillWatcher, createWatcherFromLoader, type SkillWatcher, type SkillWatcherOptions, } from './watcher.js';
25
+ export { SkillTestFramework, SkillTestRunner, formatTestResults, formatTestResultsJson, formatTestResultsTap, type TestResult, type TestStatus, type SkillTestReport, type TestOptions, type TestRunnerOptions, } from './test-framework.js';
@@ -0,0 +1,349 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'fs';
2
+ import { basename, dirname, join, relative, sep } from 'path';
3
+ import { parseFrontmatter } from '../../utils/frontmatter.js';
4
+ import { DEFAULT_BASE_DIR } from '../../config/paths.js';
5
+ import { createLogger } from '../../utils/logger.js';
6
+ const log = createLogger('SkillLoader');
7
+ const IGNORE_FILES = ['.gitignore', '.ignore', '.fdignore'];
8
+ function toPosixPath(p) {
9
+ return p.split(sep).join('/');
10
+ }
11
+ function prefixIgnorePattern(line, prefix) {
12
+ const trimmed = line.trim();
13
+ if (!trimmed)
14
+ return null;
15
+ if (trimmed.startsWith('#') && !trimmed.startsWith('\\#'))
16
+ return null;
17
+ let pattern = line;
18
+ let negated = false;
19
+ if (pattern.startsWith('!')) {
20
+ negated = true;
21
+ pattern = pattern.slice(1);
22
+ }
23
+ else if (pattern.startsWith('\\!')) {
24
+ pattern = pattern.slice(1);
25
+ }
26
+ if (pattern.startsWith('/')) {
27
+ pattern = pattern.slice(1);
28
+ }
29
+ const prefixed = prefix ? `${prefix}${pattern}` : pattern;
30
+ return negated ? `!${prefixed}` : prefixed;
31
+ }
32
+ function loadIgnoreRules(dir, rootDir) {
33
+ const ignoredPaths = new Set();
34
+ const relativeDir = relative(rootDir, dir);
35
+ const prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : '';
36
+ for (const filename of IGNORE_FILES) {
37
+ const ignorePath = join(dir, filename);
38
+ if (!existsSync(ignorePath))
39
+ continue;
40
+ try {
41
+ const content = readFileSync(ignorePath, 'utf-8');
42
+ for (const line of content.split(/\r?\n/)) {
43
+ const pattern = prefixIgnorePattern(line, prefix);
44
+ if (pattern) {
45
+ const fullPattern = pattern.startsWith('!')
46
+ ? `!${prefix}${pattern.slice(1)}`
47
+ : `${prefix}${pattern}`;
48
+ ignoredPaths.add(fullPattern);
49
+ }
50
+ }
51
+ }
52
+ catch { }
53
+ }
54
+ return ignoredPaths;
55
+ }
56
+ function shouldIgnore(path, ignoredPaths) {
57
+ for (const pattern of ignoredPaths) {
58
+ if (pattern.startsWith('!')) {
59
+ const positive = pattern.slice(1);
60
+ if (path === positive || path.startsWith(`${positive}/`)) {
61
+ return false;
62
+ }
63
+ }
64
+ else {
65
+ if (path === pattern || path.startsWith(`${pattern}/`)) {
66
+ return true;
67
+ }
68
+ }
69
+ }
70
+ return false;
71
+ }
72
+ function escapeXml(str) {
73
+ return str
74
+ .replace(/&/g, '&amp;')
75
+ .replace(/</g, '&lt;')
76
+ .replace(/>/g, '&gt;')
77
+ .replace(/"/g, '&quot;')
78
+ .replace(/'/g, '&apos;');
79
+ }
80
+ function formatSkillXml(skill) {
81
+ const emoji = skill.metadata.emoji || skill.metadata.openclaw?.emoji || '';
82
+ const emojiStr = emoji ? `${emoji} ` : '';
83
+ return [
84
+ ' <skill>',
85
+ ` <name>${escapeXml(skill.name)}</name>`,
86
+ ` <description>${emojiStr}${escapeXml(skill.description)}</description>`,
87
+ ` <location>${escapeXml(skill.filePath)}</location>`,
88
+ ' </skill>',
89
+ ].join('\n');
90
+ }
91
+ function formatSkillsForPrompt(skills) {
92
+ const visibleSkills = skills.filter(s => !s.disableModelInvocation);
93
+ if (visibleSkills.length === 0)
94
+ return '';
95
+ const lines = [
96
+ '\n\n<available_skills>',
97
+ 'Skills are folders of instructions, scripts, and resources.',
98
+ 'Use the read tool to load a skill\'s file when the task matches its description.',
99
+ '',
100
+ ];
101
+ for (const skill of visibleSkills) {
102
+ lines.push(formatSkillXml(skill));
103
+ }
104
+ lines.push('</available_skills>');
105
+ return lines.join('\n');
106
+ }
107
+ function discoverSkills(dir, source) {
108
+ const skills = [];
109
+ if (!existsSync(dir))
110
+ return skills;
111
+ function scan(currentDir, currentIgnoredPaths) {
112
+ try {
113
+ const entries = readdirSync(currentDir, { withFileTypes: true });
114
+ for (const entry of entries) {
115
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
116
+ continue;
117
+ const fullPath = join(currentDir, entry.name);
118
+ const relPath = toPosixPath(relative(dir, fullPath));
119
+ if (shouldIgnore(relPath, currentIgnoredPaths))
120
+ continue;
121
+ if (entry.isDirectory()) {
122
+ const skillMdPath = join(fullPath, 'SKILL.md');
123
+ const skillRelPath = `${relPath}/`;
124
+ const subIgnoredPaths = new Set(currentIgnoredPaths);
125
+ const subIgnoreFile = join(fullPath, '.gitignore');
126
+ if (existsSync(subIgnoreFile)) {
127
+ const subRules = loadIgnoreRules(fullPath, dir);
128
+ for (const rule of subRules) {
129
+ subIgnoredPaths.add(`${skillRelPath}${rule}`);
130
+ }
131
+ }
132
+ if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {
133
+ const skill = loadSkillFromFile(skillMdPath, source);
134
+ if (skill)
135
+ skills.push(skill);
136
+ }
137
+ scan(fullPath, subIgnoredPaths);
138
+ }
139
+ }
140
+ }
141
+ catch { }
142
+ }
143
+ scan(dir, loadIgnoreRules(dir, dir));
144
+ return skills;
145
+ }
146
+ function parseSkillMetadata(frontmatter) {
147
+ // Support both direct metadata and openclaw-compatible nested metadata
148
+ const metadata = {
149
+ name: frontmatter.name || '',
150
+ description: frontmatter.description || '',
151
+ emoji: frontmatter.emoji || undefined,
152
+ homepage: frontmatter.homepage || undefined,
153
+ os: frontmatter.os || undefined,
154
+ requires: frontmatter.requires || undefined,
155
+ install: frontmatter.install || undefined,
156
+ };
157
+ // Support openclaw-compatible nested metadata
158
+ const openclawMeta = frontmatter.metadata;
159
+ if (openclawMeta?.openclaw) {
160
+ const oc = openclawMeta.openclaw;
161
+ metadata.openclaw = {
162
+ emoji: oc.emoji || undefined,
163
+ requires: oc.requires || undefined,
164
+ install: oc.install || undefined,
165
+ os: oc.os || undefined,
166
+ };
167
+ // Merge openclaw metadata if direct metadata is missing
168
+ if (!metadata.emoji && metadata.openclaw.emoji) {
169
+ metadata.emoji = metadata.openclaw.emoji;
170
+ }
171
+ if (!metadata.requires && metadata.openclaw.requires) {
172
+ metadata.requires = metadata.openclaw.requires;
173
+ }
174
+ if (!metadata.install && metadata.openclaw.install) {
175
+ metadata.install = metadata.openclaw.install;
176
+ }
177
+ if (!metadata.os && metadata.openclaw.os) {
178
+ metadata.os = metadata.openclaw.os;
179
+ }
180
+ }
181
+ return metadata;
182
+ }
183
+ function loadSkillFromFile(filePath, source) {
184
+ try {
185
+ const rawContent = readFileSync(filePath, 'utf-8');
186
+ const { frontmatter, content } = parseFrontmatter(rawContent);
187
+ const skillDir = dirname(filePath);
188
+ const parentDirName = basename(skillDir);
189
+ const name = frontmatter.name || parentDirName;
190
+ const description = frontmatter.description;
191
+ if (!description?.trim())
192
+ return null;
193
+ const metadata = parseSkillMetadata(frontmatter);
194
+ return {
195
+ name,
196
+ description: description.trim(),
197
+ filePath,
198
+ baseDir: skillDir,
199
+ source,
200
+ disableModelInvocation: frontmatter['disable-model-invocation'] === true,
201
+ metadata,
202
+ content,
203
+ };
204
+ }
205
+ catch {
206
+ return null;
207
+ }
208
+ }
209
+ export function loadSkills(options) {
210
+ const { workspaceDir, builtinDir, extraDirs = [] } = options;
211
+ const skillMap = new Map();
212
+ const diagnostics = [];
213
+ if (builtinDir) {
214
+ for (const skill of discoverSkills(builtinDir, 'builtin')) {
215
+ const existing = skillMap.get(skill.name);
216
+ if (existing) {
217
+ diagnostics.push({
218
+ type: 'collision',
219
+ skillName: skill.name,
220
+ message: `Skill "${skill.name}" collision: ${existing.source} overrides ${skill.source}`,
221
+ path: skill.filePath,
222
+ });
223
+ }
224
+ else {
225
+ skillMap.set(skill.name, skill);
226
+ }
227
+ }
228
+ }
229
+ const globalDirs = [
230
+ options.globalDir,
231
+ join(DEFAULT_BASE_DIR, 'skills'),
232
+ join(process.env.HOME || '', '.agents', 'skills'),
233
+ ].filter((d) => !!d && existsSync(d));
234
+ for (const dir of globalDirs) {
235
+ for (const skill of discoverSkills(dir, 'global')) {
236
+ const existing = skillMap.get(skill.name);
237
+ if (existing) {
238
+ diagnostics.push({
239
+ type: 'collision',
240
+ skillName: skill.name,
241
+ message: `Skill "${skill.name}" collision: ${existing.source} overrides ${skill.source}`,
242
+ path: skill.filePath,
243
+ });
244
+ }
245
+ else {
246
+ skillMap.set(skill.name, skill);
247
+ }
248
+ }
249
+ }
250
+ if (workspaceDir) {
251
+ const workspaceSkills = discoverSkills(join(workspaceDir, 'skills'), 'workspace');
252
+ for (const skill of workspaceSkills) {
253
+ const existing = skillMap.get(skill.name);
254
+ if (existing) {
255
+ diagnostics.push({
256
+ type: 'collision',
257
+ skillName: skill.name,
258
+ message: `Skill "${skill.name}" collision: ${skill.source} overrides ${existing.source}`,
259
+ path: skill.filePath,
260
+ });
261
+ }
262
+ skillMap.set(skill.name, skill);
263
+ }
264
+ }
265
+ // Scan extra directories
266
+ for (const extraDir of extraDirs) {
267
+ if (existsSync(extraDir)) {
268
+ for (const skill of discoverSkills(extraDir, 'global')) {
269
+ const existing = skillMap.get(skill.name);
270
+ if (existing) {
271
+ diagnostics.push({
272
+ type: 'collision',
273
+ skillName: skill.name,
274
+ message: `Skill "${skill.name}" collision: ${existing.source} overrides ${skill.source}`,
275
+ path: skill.filePath,
276
+ });
277
+ }
278
+ else {
279
+ skillMap.set(skill.name, skill);
280
+ }
281
+ }
282
+ }
283
+ }
284
+ return {
285
+ skills: Array.from(skillMap.values()),
286
+ prompt: formatSkillsForPrompt(Array.from(skillMap.values())),
287
+ diagnostics,
288
+ };
289
+ }
290
+ export function createSkillLoader() {
291
+ let cachedSkills = [];
292
+ let cachedPrompt = '';
293
+ let cachedDiagnostics = [];
294
+ let lastLoadTime = 0;
295
+ let workspaceDir;
296
+ let builtinDir;
297
+ let extraDirs = [];
298
+ function updateCache(result) {
299
+ cachedSkills = result.skills;
300
+ cachedPrompt = result.prompt;
301
+ cachedDiagnostics = result.diagnostics;
302
+ lastLoadTime = Date.now();
303
+ return result;
304
+ }
305
+ return {
306
+ init: (workspace, builtin) => {
307
+ workspaceDir = workspace;
308
+ builtinDir = builtin || undefined;
309
+ return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));
310
+ },
311
+ load: () => {
312
+ return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));
313
+ },
314
+ reload: () => {
315
+ log.info('Reloading skills');
316
+ return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));
317
+ },
318
+ getSkills: () => cachedSkills,
319
+ getPrompt: () => cachedPrompt,
320
+ getDiagnostics: () => cachedDiagnostics,
321
+ getLastLoadTime: () => lastLoadTime,
322
+ getSkillByName: (name) => {
323
+ return cachedSkills.find(s => s.name === name);
324
+ },
325
+ getEnabledSkills: (config) => {
326
+ if (!config) {
327
+ return cachedSkills.filter(s => !s.disableModelInvocation);
328
+ }
329
+ return cachedSkills.filter(skill => {
330
+ const skillConfig = config[skill.name];
331
+ if (skillConfig?.enabled === false) {
332
+ return false;
333
+ }
334
+ return !skill.disableModelInvocation;
335
+ });
336
+ },
337
+ };
338
+ }
339
+ // Re-export installer
340
+ export { installSkill, findInstallSpec, hasBinary, getDefaultInstallerPreferences, } from './installer.js';
341
+ // Re-export scanner
342
+ export { scanSkillDirectory, formatScanSummary, collectSkillInstallWarnings, } from './scanner.js';
343
+ // Re-export config manager
344
+ export { resolveSkillConfig, applySkillEnvOverrides, getSkillEnvironment, createSkillConfigManager, isSkillEnabled, validateSkillConfig, } from './config.js';
345
+ // Re-export watcher
346
+ export { createSkillWatcher, createWatcherFromLoader, } from './watcher.js';
347
+ // Re-export test framework
348
+ export { SkillTestFramework, SkillTestRunner, formatTestResults, formatTestResultsJson, formatTestResultsTap, } from './test-framework.js';
349
+ //# sourceMappingURL=index.js.map