@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,165 @@
1
+ /**
2
+ * Update Offset Store for Telegram Polling
3
+ *
4
+ * Persists last processed update ID to avoid duplicate message processing
5
+ * Inspired by openclaw's update-offset-store.ts
6
+ */
7
+ import { promises as fs } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { homedir } from 'node:os';
10
+ import { createLogger } from '../utils/logger.js';
11
+ const log = createLogger('UpdateOffsetStore');
12
+ const OFFSET_STORE_DIR = join(homedir(), '.xopcbot', 'state');
13
+ const OFFSET_STORE_FILE = 'telegram-offsets.json';
14
+ /**
15
+ * Get path to offset store file
16
+ */
17
+ function getOffsetStorePath() {
18
+ return join(OFFSET_STORE_DIR, OFFSET_STORE_FILE);
19
+ }
20
+ /**
21
+ * Ensure offset store directory exists
22
+ */
23
+ async function ensureStoreDir() {
24
+ await fs.mkdir(OFFSET_STORE_DIR, { recursive: true });
25
+ }
26
+ /**
27
+ * Load offset store from disk
28
+ */
29
+ async function loadOffsetStore() {
30
+ try {
31
+ const filePath = getOffsetStorePath();
32
+ const content = await fs.readFile(filePath, 'utf-8');
33
+ const data = JSON.parse(content);
34
+ return {
35
+ offsets: data.offsets ?? {},
36
+ lastUpdated: data.lastUpdated ?? Date.now(),
37
+ };
38
+ }
39
+ catch {
40
+ // File doesn't exist or is corrupted, return empty store
41
+ return {
42
+ offsets: {},
43
+ lastUpdated: Date.now(),
44
+ };
45
+ }
46
+ }
47
+ /**
48
+ * Save offset store to disk
49
+ */
50
+ async function saveOffsetStore(data) {
51
+ try {
52
+ await ensureStoreDir();
53
+ const filePath = getOffsetStorePath();
54
+ const content = JSON.stringify({
55
+ ...data,
56
+ lastUpdated: Date.now(),
57
+ }, null, 2);
58
+ await fs.writeFile(filePath, content, 'utf-8');
59
+ }
60
+ catch (err) {
61
+ log.error({ err }, 'Failed to save offset store');
62
+ }
63
+ }
64
+ /**
65
+ * Read update offset for an account
66
+ */
67
+ export async function readUpdateOffset(accountId) {
68
+ try {
69
+ const store = await loadOffsetStore();
70
+ const offset = store.offsets[accountId];
71
+ return typeof offset === 'number' ? offset : null;
72
+ }
73
+ catch (err) {
74
+ log.error({ err, accountId }, 'Failed to read update offset');
75
+ return null;
76
+ }
77
+ }
78
+ /**
79
+ * Write update offset for an account
80
+ */
81
+ export async function writeUpdateOffset(accountId, offset) {
82
+ try {
83
+ const store = await loadOffsetStore();
84
+ // Only update if offset is greater than current
85
+ const currentOffset = store.offsets[accountId] ?? 0;
86
+ if (offset <= currentOffset) {
87
+ return;
88
+ }
89
+ store.offsets[accountId] = offset;
90
+ await saveOffsetStore(store);
91
+ log.debug({ accountId, offset }, 'Update offset persisted');
92
+ }
93
+ catch (err) {
94
+ log.error({ err, accountId, offset }, 'Failed to write update offset');
95
+ }
96
+ }
97
+ /**
98
+ * Clear update offset for an account
99
+ */
100
+ export async function clearUpdateOffset(accountId) {
101
+ try {
102
+ const store = await loadOffsetStore();
103
+ delete store.offsets[accountId];
104
+ await saveOffsetStore(store);
105
+ log.debug({ accountId }, 'Update offset cleared');
106
+ }
107
+ catch (err) {
108
+ log.error({ err, accountId }, 'Failed to clear update offset');
109
+ }
110
+ }
111
+ /**
112
+ * Get all account offsets
113
+ */
114
+ export async function getAllOffsets() {
115
+ const store = await loadOffsetStore();
116
+ return { ...store.offsets };
117
+ }
118
+ /**
119
+ * In-memory cache for offset store (reduces disk I/O)
120
+ */
121
+ class OffsetStoreCache {
122
+ cache = new Map();
123
+ lastSync = 0;
124
+ syncInterval = 5000; // 5 seconds
125
+ async get(accountId) {
126
+ // Check cache first
127
+ if (this.cache.has(accountId)) {
128
+ return this.cache.get(accountId);
129
+ }
130
+ // Sync from disk if cache miss
131
+ await this.syncFromDisk();
132
+ return this.cache.get(accountId) ?? null;
133
+ }
134
+ async set(accountId, offset) {
135
+ const current = this.cache.get(accountId) ?? 0;
136
+ if (offset <= current) {
137
+ return;
138
+ }
139
+ this.cache.set(accountId, offset);
140
+ // Debounced write to disk
141
+ const now = Date.now();
142
+ if (now - this.lastSync > this.syncInterval) {
143
+ await this.syncToDisk();
144
+ }
145
+ }
146
+ async syncFromDisk() {
147
+ const store = await loadOffsetStore();
148
+ this.cache = new Map(Object.entries(store.offsets));
149
+ this.lastSync = Date.now();
150
+ }
151
+ async syncToDisk() {
152
+ const offsets = Object.fromEntries(this.cache);
153
+ await saveOffsetStore({
154
+ offsets,
155
+ lastUpdated: Date.now(),
156
+ });
157
+ this.lastSync = Date.now();
158
+ }
159
+ async flush() {
160
+ await this.syncToDisk();
161
+ }
162
+ }
163
+ // Export singleton instance for use across the application
164
+ export const offsetStoreCache = new OffsetStoreCache();
165
+ //# sourceMappingURL=update-offset-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-offset-store.js","sourceRoot":"","sources":["../../src/channels/update-offset-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * WhatsApp Channel Module
3
+ */
4
+ export { whatsappPlugin } from './plugin.js';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * WhatsApp Channel Module
3
+ */
4
+ export { whatsappPlugin } from './plugin.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/whatsapp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * WhatsApp Channel Plugin
3
+ *
4
+ * 插件模式实现(未来)
5
+ *
6
+ * TODO: 实现完整的 WhatsApp 插件支持
7
+ * - 多账户支持
8
+ * - 群组管理
9
+ * - 媒体处理
10
+ * - 消息加密
11
+ */
12
+ import type { ChannelPlugin, ChannelInitOptions, ChannelStartOptions, ChannelSendOptions, ChannelSendStreamOptions, ChannelSendResult, ChannelStatus, ChannelMetadata } from '../types.js';
13
+ export declare class WhatsAppChannelPlugin implements ChannelPlugin {
14
+ id: "whatsapp";
15
+ meta: ChannelMetadata;
16
+ init(options: ChannelInitOptions): Promise<void>;
17
+ start(_options?: ChannelStartOptions): Promise<void>;
18
+ stop(_accountId?: string): Promise<void>;
19
+ send(_options: ChannelSendOptions): Promise<ChannelSendResult>;
20
+ startStream(_options: ChannelSendStreamOptions): ReturnType<ChannelPlugin['startStream']>;
21
+ getStatus(_accountId?: string): ChannelStatus;
22
+ testConnection(): Promise<{
23
+ success: boolean;
24
+ error?: string;
25
+ }>;
26
+ }
27
+ export declare const whatsappPlugin: WhatsAppChannelPlugin;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * WhatsApp Channel Plugin
3
+ *
4
+ * 插件模式实现(未来)
5
+ *
6
+ * TODO: 实现完整的 WhatsApp 插件支持
7
+ * - 多账户支持
8
+ * - 群组管理
9
+ * - 媒体处理
10
+ * - 消息加密
11
+ */
12
+ import { createLogger } from '../../utils/logger.js';
13
+ const log = createLogger('WhatsAppPlugin');
14
+ export class WhatsAppChannelPlugin {
15
+ id = 'whatsapp';
16
+ meta = {
17
+ id: 'whatsapp',
18
+ name: 'WhatsApp',
19
+ description: 'WhatsApp messaging channel',
20
+ capabilities: {
21
+ chatTypes: ['direct', 'group'],
22
+ reactions: true,
23
+ threads: false,
24
+ media: true,
25
+ polls: false,
26
+ nativeCommands: false,
27
+ blockStreaming: false,
28
+ },
29
+ };
30
+ async init(options) {
31
+ const whatsappConfig = options.config.channels?.whatsapp;
32
+ if (!whatsappConfig?.enabled) {
33
+ log.info('WhatsApp channel disabled in config');
34
+ return;
35
+ }
36
+ log.warn('WhatsApp plugin not yet implemented');
37
+ log.info('Install @whiskeysockets/baileys to enable WhatsApp support');
38
+ }
39
+ async start(_options) {
40
+ log.warn('WhatsApp plugin start not implemented');
41
+ }
42
+ async stop(_accountId) {
43
+ log.warn('WhatsApp plugin stop not implemented');
44
+ }
45
+ async send(_options) {
46
+ log.warn('WhatsApp send not implemented');
47
+ return { messageId: '', chatId: '', success: false, error: 'WhatsApp not implemented' };
48
+ }
49
+ startStream(_options) {
50
+ log.warn('WhatsApp streaming not implemented');
51
+ return {
52
+ update: () => { },
53
+ end: async () => { },
54
+ abort: async () => { },
55
+ messageId: () => undefined,
56
+ };
57
+ }
58
+ getStatus(_accountId) {
59
+ return { accountId: 'default', running: false, mode: 'stopped' };
60
+ }
61
+ async testConnection() {
62
+ return { success: false, error: 'WhatsApp not implemented' };
63
+ }
64
+ }
65
+ export const whatsappPlugin = new WhatsAppChannelPlugin();
66
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/channels/whatsapp/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAE3C,MAAM,OAAO,qBAAqB;IAChC,EAAE,GAAG,UAAmB,CAAC;IAEzB,IAAI,GAAoB;QACtB,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,4BAA4B;QACzC,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;YAC9B,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,KAAK;YACZ,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;SACtB;KACF,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,OAA2B;QACpC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACzD,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAA8B;QACxC,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAmB;QAC5B,GAAG,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAA4B;QACrC,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC1C,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAC1F,CAAC;IAED,WAAW,CAAC,QAAkC;QAC5C,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAC/C,OAAO;YACL,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;YAChB,GAAG,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YACnB,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YACrB,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;SAC3B,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,UAAmB;QAC3B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,366 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { CommandRegistry, register, formatExamples, createDefaultContext } from '../registry.js';
3
+ import { Command } from 'commander';
4
+ describe('CommandRegistry', () => {
5
+ let registry;
6
+ beforeEach(() => {
7
+ registry = new CommandRegistry();
8
+ });
9
+ describe('register', () => {
10
+ it('should register a command successfully', () => {
11
+ const factory = (_ctx) => new Command('test');
12
+ registry.register({
13
+ id: 'test-cmd',
14
+ name: 'test',
15
+ description: 'Test command',
16
+ factory,
17
+ });
18
+ expect(registry.getCommands()).toHaveLength(1);
19
+ expect(registry.findById('test-cmd')).toBeDefined();
20
+ });
21
+ it('should throw on duplicate id', () => {
22
+ const factory = (_ctx) => new Command('test');
23
+ registry.register({
24
+ id: 'test-cmd',
25
+ name: 'test',
26
+ description: 'Test command',
27
+ factory,
28
+ });
29
+ expect(() => {
30
+ registry.register({
31
+ id: 'test-cmd',
32
+ name: 'test2',
33
+ description: 'Another test',
34
+ factory,
35
+ });
36
+ }).toThrow('Command with id "test-cmd" already registered');
37
+ });
38
+ it('should throw on duplicate name', () => {
39
+ const factory = (_ctx) => new Command('test');
40
+ registry.register({
41
+ id: 'test-cmd-1',
42
+ name: 'test',
43
+ description: 'Test command',
44
+ factory,
45
+ });
46
+ expect(() => {
47
+ registry.register({
48
+ id: 'test-cmd-2',
49
+ name: 'test',
50
+ description: 'Another test',
51
+ factory,
52
+ });
53
+ }).toThrow('Command with name "test" already registered');
54
+ });
55
+ it('should allow registering commands with different ids and names', () => {
56
+ registry.register({
57
+ id: 'cmd-1',
58
+ name: 'cmd1',
59
+ description: 'Command 1',
60
+ factory: () => new Command('cmd1'),
61
+ });
62
+ registry.register({
63
+ id: 'cmd-2',
64
+ name: 'cmd2',
65
+ description: 'Command 2',
66
+ factory: () => new Command('cmd2'),
67
+ });
68
+ expect(registry.getCommands()).toHaveLength(2);
69
+ });
70
+ });
71
+ describe('getCommands', () => {
72
+ it('should return empty array when no commands registered', () => {
73
+ expect(registry.getCommands()).toEqual([]);
74
+ });
75
+ it('should return all registered commands', () => {
76
+ registry.register({
77
+ id: 'cmd-1',
78
+ name: 'cmd1',
79
+ description: 'Command 1',
80
+ factory: () => new Command('cmd1'),
81
+ });
82
+ registry.register({
83
+ id: 'cmd-2',
84
+ name: 'cmd2',
85
+ description: 'Command 2',
86
+ factory: () => new Command('cmd2'),
87
+ });
88
+ const commands = registry.getCommands();
89
+ expect(commands).toHaveLength(2);
90
+ expect(commands.map(c => c.id)).toContain('cmd-1');
91
+ expect(commands.map(c => c.id)).toContain('cmd-2');
92
+ });
93
+ it('should return readonly array', () => {
94
+ registry.register({
95
+ id: 'cmd-1',
96
+ name: 'cmd1',
97
+ description: 'Command 1',
98
+ factory: () => new Command('cmd1'),
99
+ });
100
+ const commands = registry.getCommands();
101
+ // Type check: should be ReadonlyArray
102
+ expect(Array.isArray(commands)).toBe(true);
103
+ // At runtime, we can't prevent push in JS, but the type system prevents it
104
+ // @ts-expect-error Testing readonly at type level
105
+ expect(() => commands.push({ id: 'test', name: 'test', description: 'test', factory: () => new Command('test') })).not.toThrow();
106
+ });
107
+ });
108
+ describe('getCommandsByCategory', () => {
109
+ it('should return commands filtered by category', () => {
110
+ registry.register({
111
+ id: 'setup-cmd',
112
+ name: 'setup',
113
+ description: 'Setup command',
114
+ factory: () => new Command('setup'),
115
+ metadata: { category: 'setup' },
116
+ });
117
+ registry.register({
118
+ id: 'runtime-cmd',
119
+ name: 'runtime',
120
+ description: 'Runtime command',
121
+ factory: () => new Command('runtime'),
122
+ metadata: { category: 'runtime' },
123
+ });
124
+ registry.register({
125
+ id: 'another-setup',
126
+ name: 'another-setup',
127
+ description: 'Another setup',
128
+ factory: () => new Command('another-setup'),
129
+ metadata: { category: 'setup' },
130
+ });
131
+ const setupCommands = registry.getCommandsByCategory('setup');
132
+ expect(setupCommands).toHaveLength(2);
133
+ expect(setupCommands.map(c => c.id)).toContain('setup-cmd');
134
+ expect(setupCommands.map(c => c.id)).toContain('another-setup');
135
+ });
136
+ it('should return empty array when no commands in category', () => {
137
+ registry.register({
138
+ id: 'cmd',
139
+ name: 'cmd',
140
+ description: 'Command',
141
+ factory: () => new Command('cmd'),
142
+ metadata: { category: 'runtime' },
143
+ });
144
+ const setupCommands = registry.getCommandsByCategory('setup');
145
+ expect(setupCommands).toHaveLength(0);
146
+ });
147
+ });
148
+ describe('findById', () => {
149
+ it('should find command by id', () => {
150
+ registry.register({
151
+ id: 'test-cmd',
152
+ name: 'test',
153
+ description: 'Test command',
154
+ factory: () => new Command('test'),
155
+ });
156
+ const found = registry.findById('test-cmd');
157
+ expect(found).toBeDefined();
158
+ expect(found?.name).toBe('test');
159
+ });
160
+ it('should return undefined for non-existent id', () => {
161
+ const found = registry.findById('non-existent');
162
+ expect(found).toBeUndefined();
163
+ });
164
+ });
165
+ describe('findByName', () => {
166
+ it('should find command by name', () => {
167
+ registry.register({
168
+ id: 'test-cmd',
169
+ name: 'test',
170
+ description: 'Test command',
171
+ factory: () => new Command('test'),
172
+ });
173
+ const found = registry.findByName('test');
174
+ expect(found).toBeDefined();
175
+ expect(found?.id).toBe('test-cmd');
176
+ });
177
+ it('should return undefined for non-existent name', () => {
178
+ const found = registry.findByName('non-existent');
179
+ expect(found).toBeUndefined();
180
+ });
181
+ });
182
+ describe('install', () => {
183
+ it('should install commands to commander program', () => {
184
+ const program = new Command();
185
+ const ctx = createDefaultContext();
186
+ registry.register({
187
+ id: 'test-cmd',
188
+ name: 'test',
189
+ description: 'Test command',
190
+ factory: () => new Command('test').description('Test'),
191
+ });
192
+ registry.install(program, ctx);
193
+ // Check if command was added
194
+ const commands = program.commands;
195
+ expect(commands.some(cmd => cmd.name() === 'test')).toBe(true);
196
+ });
197
+ it('should skip hidden commands', () => {
198
+ const program = new Command();
199
+ const ctx = createDefaultContext();
200
+ registry.register({
201
+ id: 'visible-cmd',
202
+ name: 'visible',
203
+ description: 'Visible command',
204
+ factory: () => new Command('visible'),
205
+ });
206
+ registry.register({
207
+ id: 'hidden-cmd',
208
+ name: 'hidden',
209
+ description: 'Hidden command',
210
+ factory: () => new Command('hidden'),
211
+ metadata: { hidden: true },
212
+ });
213
+ registry.install(program, ctx);
214
+ const commandNames = program.commands.map(cmd => cmd.name());
215
+ expect(commandNames).toContain('visible');
216
+ expect(commandNames).not.toContain('hidden');
217
+ });
218
+ it('should pass context to factory', () => {
219
+ const program = new Command();
220
+ const ctx = createDefaultContext(['node', 'xopcbot', '--verbose']);
221
+ const factorySpy = vi.fn(() => new Command('test'));
222
+ registry.register({
223
+ id: 'test-cmd',
224
+ name: 'test',
225
+ description: 'Test command',
226
+ factory: factorySpy,
227
+ });
228
+ registry.install(program, ctx, () => ctx);
229
+ expect(factorySpy).toHaveBeenCalledWith(ctx, expect.any(Function));
230
+ expect(ctx.isVerbose).toBe(true);
231
+ });
232
+ it('should sort commands by category', () => {
233
+ const program = new Command();
234
+ const ctx = createDefaultContext();
235
+ const installOrder = [];
236
+ registry.register({
237
+ id: 'utility-cmd',
238
+ name: 'utility',
239
+ description: 'Utility command',
240
+ factory: () => {
241
+ installOrder.push('utility');
242
+ return new Command('utility');
243
+ },
244
+ metadata: { category: 'utility' },
245
+ });
246
+ registry.register({
247
+ id: 'setup-cmd',
248
+ name: 'setup',
249
+ description: 'Setup command',
250
+ factory: () => {
251
+ installOrder.push('setup');
252
+ return new Command('setup');
253
+ },
254
+ metadata: { category: 'setup' },
255
+ });
256
+ registry.register({
257
+ id: 'runtime-cmd',
258
+ name: 'runtime',
259
+ description: 'Runtime command',
260
+ factory: () => {
261
+ installOrder.push('runtime');
262
+ return new Command('runtime');
263
+ },
264
+ metadata: { category: 'runtime' },
265
+ });
266
+ registry.install(program, ctx);
267
+ // Should be sorted: setup, runtime, utility
268
+ expect(installOrder).toEqual(['setup', 'runtime', 'utility']);
269
+ });
270
+ });
271
+ describe('getStats', () => {
272
+ it('should return correct statistics', () => {
273
+ registry.register({
274
+ id: 'setup-cmd',
275
+ name: 'setup',
276
+ description: 'Setup command',
277
+ factory: () => new Command('setup'),
278
+ metadata: { category: 'setup' },
279
+ });
280
+ registry.register({
281
+ id: 'runtime-cmd',
282
+ name: 'runtime',
283
+ description: 'Runtime command',
284
+ factory: () => new Command('runtime'),
285
+ metadata: { category: 'runtime' },
286
+ });
287
+ registry.register({
288
+ id: 'no-category',
289
+ name: 'nocat',
290
+ description: 'No category',
291
+ factory: () => new Command('nocat'),
292
+ });
293
+ const stats = registry.getStats();
294
+ expect(stats.total).toBe(3);
295
+ expect(stats.byCategory).toEqual({
296
+ setup: 1,
297
+ runtime: 1,
298
+ uncategorized: 1,
299
+ });
300
+ });
301
+ it('should return zero stats when empty', () => {
302
+ const stats = registry.getStats();
303
+ expect(stats.total).toBe(0);
304
+ expect(stats.byCategory).toEqual({});
305
+ });
306
+ });
307
+ });
308
+ describe('register helper', () => {
309
+ it('should register to global registry', async () => {
310
+ // Clear any previous registrations
311
+ const { registry: globalRegistry } = await import('../registry.js');
312
+ register({
313
+ id: 'global-test',
314
+ name: 'global-test',
315
+ description: 'Global test',
316
+ factory: () => new Command('global-test'),
317
+ });
318
+ expect(globalRegistry.findById('global-test')).toBeDefined();
319
+ });
320
+ });
321
+ describe('formatExamples', () => {
322
+ it('should format single example', () => {
323
+ const result = formatExamples(['xopcbot test']);
324
+ expect(result).toContain('Examples:');
325
+ expect(result).toContain('$ xopcbot test');
326
+ });
327
+ it('should format multiple examples', () => {
328
+ const result = formatExamples([
329
+ 'xopcbot test',
330
+ 'xopcbot test --option',
331
+ ]);
332
+ expect(result).toContain('$ xopcbot test');
333
+ expect(result).toContain('$ xopcbot test --option');
334
+ });
335
+ it('should return empty string for empty array', () => {
336
+ const result = formatExamples([]);
337
+ expect(result).toBe('');
338
+ });
339
+ });
340
+ describe('createDefaultContext', () => {
341
+ it('should create context with defaults', () => {
342
+ const ctx = createDefaultContext();
343
+ expect(ctx.configPath).toContain('.xopcbot/config.json');
344
+ expect(ctx.workspacePath).toContain('.xopcbot/workspace');
345
+ expect(ctx.isVerbose).toBe(false);
346
+ expect(ctx.argv).toEqual(process.argv);
347
+ });
348
+ it('should detect verbose flag', () => {
349
+ const ctx = createDefaultContext(['node', 'xopcbot', '--verbose']);
350
+ expect(ctx.isVerbose).toBe(true);
351
+ });
352
+ it('should detect short verbose flag', () => {
353
+ const ctx = createDefaultContext(['node', 'xopcbot', '-v']);
354
+ expect(ctx.isVerbose).toBe(true);
355
+ });
356
+ it('should use env vars when set', () => {
357
+ process.env.XOPCBOT_CONFIG = '/custom/config.json';
358
+ process.env.XOPCBOT_WORKSPACE = '/custom/workspace';
359
+ const ctx = createDefaultContext();
360
+ expect(ctx.configPath).toBe('/custom/config.json');
361
+ expect(ctx.workspacePath).toBe('/custom/workspace');
362
+ delete process.env.XOPCBOT_CONFIG;
363
+ delete process.env.XOPCBOT_WORKSPACE;
364
+ });
365
+ });
366
+ //# sourceMappingURL=registry.test.js.map