@xopcai/xopcbot 0.1.3 → 0.2.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 (292) hide show
  1. package/README.md +57 -52
  2. package/README.zh-CN.md +56 -49
  3. package/dist/agent/__tests__/media-processing.test.d.ts +6 -0
  4. package/dist/agent/__tests__/media-processing.test.js +385 -0
  5. package/dist/agent/__tests__/media-processing.test.js.map +1 -0
  6. package/dist/agent/fallback/__tests__/index.test.js +16 -5
  7. package/dist/agent/fallback/__tests__/index.test.js.map +1 -1
  8. package/dist/agent/fallback/candidates.d.ts +2 -4
  9. package/dist/agent/fallback/candidates.js +19 -26
  10. package/dist/agent/fallback/candidates.js.map +1 -1
  11. package/dist/agent/helpers.d.ts +1 -0
  12. package/dist/agent/helpers.js.map +1 -1
  13. package/dist/agent/index.d.ts +6 -1
  14. package/dist/agent/index.js +10 -1
  15. package/dist/agent/index.js.map +1 -1
  16. package/dist/agent/models/compat.d.ts +35 -0
  17. package/dist/agent/models/compat.js +110 -0
  18. package/dist/agent/models/compat.js.map +1 -0
  19. package/dist/agent/models/fallback.d.ts +38 -0
  20. package/dist/agent/models/fallback.js +133 -0
  21. package/dist/agent/models/fallback.js.map +1 -0
  22. package/dist/agent/models/index.d.ts +10 -0
  23. package/dist/agent/models/index.js +11 -0
  24. package/dist/agent/models/index.js.map +1 -0
  25. package/dist/agent/{model-manager.d.ts → models/manager.d.ts} +2 -8
  26. package/dist/agent/{model-manager.js → models/manager.js} +38 -24
  27. package/dist/agent/models/manager.js.map +1 -0
  28. package/dist/agent/models/scan.d.ts +46 -0
  29. package/dist/agent/models/scan.js +177 -0
  30. package/dist/agent/models/scan.js.map +1 -0
  31. package/dist/agent/models/selection.d.ts +44 -0
  32. package/dist/agent/models/selection.js +141 -0
  33. package/dist/agent/models/selection.js.map +1 -0
  34. package/dist/agent/prompt/index.js +1 -1
  35. package/dist/agent/prompt/index.js.map +1 -1
  36. package/dist/agent/service.js +34 -16
  37. package/dist/agent/service.js.map +1 -1
  38. package/dist/agent/skills/__tests__/test-framework.test.js +15 -7
  39. package/dist/agent/skills/__tests__/test-framework.test.js.map +1 -1
  40. package/dist/agent/skills/config.d.ts +1 -1
  41. package/dist/agent/skills/config.js +2 -2
  42. package/dist/agent/skills/config.js.map +1 -1
  43. package/dist/agent/skills/index.js +15 -28
  44. package/dist/agent/skills/index.js.map +1 -1
  45. package/dist/agent/skills/installer.d.ts +1 -1
  46. package/dist/agent/skills/installer.js +1 -1
  47. package/dist/agent/skills/scanner.d.ts +1 -1
  48. package/dist/agent/skills/scanner.js +1 -1
  49. package/dist/agent/skills/test-framework.js +24 -23
  50. package/dist/agent/skills/test-framework.js.map +1 -1
  51. package/dist/agent/skills/types.d.ts +3 -3
  52. package/dist/agent/skills/types.js +1 -1
  53. package/dist/agent/skills/watcher.d.ts +1 -1
  54. package/dist/agent/skills/watcher.js +1 -1
  55. package/dist/agent/system-prompt.d.ts +67 -0
  56. package/dist/agent/system-prompt.js +351 -0
  57. package/dist/agent/system-prompt.js.map +1 -0
  58. package/dist/agent/tools/__tests__/send-media.test.d.ts +6 -0
  59. package/dist/agent/tools/__tests__/send-media.test.js +251 -0
  60. package/dist/agent/tools/__tests__/send-media.test.js.map +1 -0
  61. package/dist/agent/types.agent-defaults.d.ts +48 -0
  62. package/dist/agent/types.agent-defaults.js +5 -0
  63. package/dist/agent/types.agent-defaults.js.map +1 -0
  64. package/dist/agent/types.d.ts +14 -6
  65. package/dist/agent/types.js +5 -0
  66. package/dist/agent/types.js.map +1 -1
  67. package/dist/agent/workspace.d.ts +94 -0
  68. package/dist/agent/workspace.js +625 -0
  69. package/dist/agent/workspace.js.map +1 -0
  70. package/dist/auth/index.js +1 -1
  71. package/dist/auth/index.js.map +1 -1
  72. package/dist/auth/oauth/index.d.ts +1 -0
  73. package/dist/auth/oauth/index.js +1 -0
  74. package/dist/auth/oauth/index.js.map +1 -1
  75. package/dist/auth/oauth/kimi.d.ts +2 -1
  76. package/dist/auth/oauth/kimi.js +51 -48
  77. package/dist/auth/oauth/kimi.js.map +1 -1
  78. package/dist/auth/oauth/minimax-cn.d.ts +12 -0
  79. package/dist/auth/oauth/minimax-cn.js +111 -0
  80. package/dist/auth/oauth/minimax-cn.js.map +1 -0
  81. package/dist/auth/oauth/qwen.d.ts +5 -0
  82. package/dist/auth/oauth/qwen.js +54 -84
  83. package/dist/auth/oauth/qwen.js.map +1 -1
  84. package/dist/auth/profiles/index.d.ts +0 -2
  85. package/dist/auth/profiles/index.js +0 -2
  86. package/dist/auth/profiles/index.js.map +1 -1
  87. package/dist/auth/storage.js +7 -1
  88. package/dist/auth/storage.js.map +1 -1
  89. package/dist/channels/__tests__/media-integration.test.d.ts +6 -0
  90. package/dist/channels/__tests__/media-integration.test.js +398 -0
  91. package/dist/channels/__tests__/media-integration.test.js.map +1 -0
  92. package/dist/channels/__tests__/media.test.d.ts +6 -0
  93. package/dist/channels/__tests__/media.test.js +251 -0
  94. package/dist/channels/__tests__/media.test.js.map +1 -0
  95. package/dist/channels/access-control.d.ts +1 -1
  96. package/dist/channels/access-control.js +1 -1
  97. package/dist/channels/draft-stream.d.ts +1 -1
  98. package/dist/channels/draft-stream.js +1 -1
  99. package/dist/channels/format.d.ts +1 -1
  100. package/dist/channels/format.js +1 -1
  101. package/dist/channels/telegram/command-handler.js +15 -48
  102. package/dist/channels/telegram/command-handler.js.map +1 -1
  103. package/dist/channels/telegram/plugin.js +3 -2
  104. package/dist/channels/telegram/plugin.js.map +1 -1
  105. package/dist/channels/telegram/webhook.d.ts +1 -1
  106. package/dist/channels/telegram/webhook.js +1 -1
  107. package/dist/channels/types.d.ts +1 -1
  108. package/dist/channels/types.js +1 -1
  109. package/dist/channels/update-offset-store.d.ts +1 -1
  110. package/dist/channels/update-offset-store.js +1 -1
  111. package/dist/cli/commands/auth.js +8 -23
  112. package/dist/cli/commands/auth.js.map +1 -1
  113. package/dist/cli/commands/gateway.js +9 -1
  114. package/dist/cli/commands/gateway.js.map +1 -1
  115. package/dist/cli/commands/models.js +35 -29
  116. package/dist/cli/commands/models.js.map +1 -1
  117. package/dist/cli/commands/onboard.js +166 -115
  118. package/dist/cli/commands/onboard.js.map +1 -1
  119. package/dist/cli/commands/setup.js +123 -0
  120. package/dist/cli/commands/setup.js.map +1 -0
  121. package/dist/cli/commands/skills.js +6 -6
  122. package/dist/cli/commands/skills.js.map +1 -1
  123. package/dist/cli/index.d.ts +1 -1
  124. package/dist/cli/index.js +1 -1
  125. package/dist/cli/index.js.map +1 -1
  126. package/dist/cli/templates.d.ts +2 -0
  127. package/dist/cli/templates.js +1 -1
  128. package/dist/cli/templates.js.map +1 -1
  129. package/dist/config/defaults.d.ts +19 -0
  130. package/dist/config/defaults.js +168 -0
  131. package/dist/config/defaults.js.map +1 -0
  132. package/dist/config/index.d.ts +5 -0
  133. package/dist/config/index.js +4 -0
  134. package/dist/config/index.js.map +1 -1
  135. package/dist/config/integration.d.ts +12 -0
  136. package/dist/config/integration.js +14 -0
  137. package/dist/config/integration.js.map +1 -0
  138. package/dist/config/models-json.d.ts +454 -0
  139. package/dist/config/models-json.js +323 -0
  140. package/dist/config/models-json.js.map +1 -0
  141. package/dist/config/paths.d.ts +2 -0
  142. package/dist/config/paths.js +4 -0
  143. package/dist/config/paths.js.map +1 -1
  144. package/dist/config/reload.d.ts +1 -1
  145. package/dist/config/reload.js +3 -3
  146. package/dist/config/reload.js.map +1 -1
  147. package/dist/config/resolve-config-value.d.ts +36 -0
  148. package/dist/config/resolve-config-value.js +218 -0
  149. package/dist/config/resolve-config-value.js.map +1 -0
  150. package/dist/config/rules.js +3 -2
  151. package/dist/config/rules.js.map +1 -1
  152. package/dist/config/schema.d.ts +17 -884
  153. package/dist/config/schema.js +36 -312
  154. package/dist/config/schema.js.map +1 -1
  155. package/dist/config/types.models.d.ts +54 -0
  156. package/dist/config/types.models.js +2 -0
  157. package/dist/config/types.models.js.map +1 -0
  158. package/dist/cron/validation.d.ts +4 -4
  159. package/dist/gateway/hono/app.js +232 -78
  160. package/dist/gateway/hono/app.js.map +1 -1
  161. package/dist/gateway/hono/oauth-async.d.ts +14 -0
  162. package/dist/gateway/hono/oauth-async.js +285 -0
  163. package/dist/gateway/hono/oauth-async.js.map +1 -0
  164. package/dist/gateway/hono/oauth.d.ts +9 -0
  165. package/dist/gateway/hono/oauth.js +157 -0
  166. package/dist/gateway/hono/oauth.js.map +1 -0
  167. package/dist/gateway/hono/sse.js +5 -2
  168. package/dist/gateway/hono/sse.js.map +1 -1
  169. package/dist/gateway/process-manager.js +12 -10
  170. package/dist/gateway/process-manager.js.map +1 -1
  171. package/dist/gateway/service.d.ts +6 -2
  172. package/dist/gateway/service.js +20 -6
  173. package/dist/gateway/service.js.map +1 -1
  174. package/dist/gateway/static/root/assets/flow-BqIEBwW6.js +2 -0
  175. package/dist/gateway/static/root/assets/flow-BqIEBwW6.js.map +1 -0
  176. package/dist/gateway/static/root/assets/main-Br2tw-87.js +5168 -0
  177. package/dist/gateway/static/root/assets/main-Br2tw-87.js.map +1 -0
  178. package/dist/gateway/static/root/assets/main-DwlbPf8Z.css +1 -0
  179. package/dist/gateway/static/root/index.html +2 -2
  180. package/dist/plugins/index.d.ts +0 -2
  181. package/dist/plugins/index.js +0 -2
  182. package/dist/plugins/index.js.map +1 -1
  183. package/dist/plugins/types.d.ts +0 -2
  184. package/dist/plugins/types.js +0 -2
  185. package/dist/plugins/types.js.map +1 -1
  186. package/dist/providers/index.d.ts +50 -22
  187. package/dist/providers/index.js +276 -50
  188. package/dist/providers/index.js.map +1 -1
  189. package/dist/providers/model-registry.d.ts +84 -0
  190. package/dist/providers/model-registry.js +385 -0
  191. package/dist/providers/model-registry.js.map +1 -0
  192. package/dist/types/providers.d.ts +2 -63
  193. package/dist/types/providers.js +1 -1
  194. package/dist/utils/__tests__/frontmatter.test.d.ts +4 -0
  195. package/dist/utils/__tests__/frontmatter.test.js +150 -0
  196. package/dist/utils/__tests__/frontmatter.test.js.map +1 -0
  197. package/dist/utils/diagnostic-events.d.ts +230 -0
  198. package/dist/utils/diagnostic-events.js +189 -0
  199. package/dist/utils/diagnostic-events.js.map +1 -0
  200. package/dist/utils/frontmatter.d.ts +0 -1
  201. package/dist/utils/frontmatter.js +15 -79
  202. package/dist/utils/frontmatter.js.map +1 -1
  203. package/dist/utils/log-stream.d.ts +95 -0
  204. package/dist/utils/log-stream.js +229 -0
  205. package/dist/utils/log-stream.js.map +1 -0
  206. package/dist/utils/logger.d.ts +5 -0
  207. package/dist/utils/logger.js +25 -0
  208. package/dist/utils/logger.js.map +1 -1
  209. package/dist/utils/redact.d.ts +73 -0
  210. package/dist/utils/redact.js +245 -0
  211. package/dist/utils/redact.js.map +1 -0
  212. package/package.json +6 -4
  213. package/skills/find-skills/SKILL.md +0 -9
  214. package/dist/__tests__/core.test.js +0 -72
  215. package/dist/__tests__/core.test.js.map +0 -1
  216. package/dist/agent/model-manager.js.map +0 -1
  217. package/dist/cli/commands/configure.d.ts +0 -1
  218. package/dist/cli/commands/configure.js +0 -173
  219. package/dist/cli/commands/configure.js.map +0 -1
  220. package/dist/cli/commands/gateway-daemon.d.ts +0 -1
  221. package/dist/cli/commands/gateway-daemon.js +0 -141
  222. package/dist/cli/commands/gateway-daemon.js.map +0 -1
  223. package/dist/config/__tests__/diff.test.d.ts +0 -1
  224. package/dist/config/__tests__/diff.test.js +0 -192
  225. package/dist/config/__tests__/diff.test.js.map +0 -1
  226. package/dist/config/__tests__/loader.test.d.ts +0 -1
  227. package/dist/config/__tests__/loader.test.js +0 -356
  228. package/dist/config/__tests__/loader.test.js.map +0 -1
  229. package/dist/config/__tests__/paths.test.d.ts +0 -1
  230. package/dist/config/__tests__/paths.test.js +0 -192
  231. package/dist/config/__tests__/paths.test.js.map +0 -1
  232. package/dist/config/__tests__/reload.test.d.ts +0 -1
  233. package/dist/config/__tests__/reload.test.js +0 -374
  234. package/dist/config/__tests__/reload.test.js.map +0 -1
  235. package/dist/config/__tests__/rules.test.d.ts +0 -1
  236. package/dist/config/__tests__/rules.test.js +0 -204
  237. package/dist/config/__tests__/rules.test.js.map +0 -1
  238. package/dist/config/__tests__/schema.test.d.ts +0 -1
  239. package/dist/config/__tests__/schema.test.js +0 -672
  240. package/dist/config/__tests__/schema.test.js.map +0 -1
  241. package/dist/daemon/background-start.d.ts +0 -33
  242. package/dist/daemon/background-start.js +0 -89
  243. package/dist/daemon/background-start.js.map +0 -1
  244. package/dist/daemon/gateway-manager.d.ts +0 -87
  245. package/dist/daemon/gateway-manager.js +0 -324
  246. package/dist/daemon/gateway-manager.js.map +0 -1
  247. package/dist/daemon/index.d.ts +0 -5
  248. package/dist/daemon/index.js +0 -6
  249. package/dist/daemon/index.js.map +0 -1
  250. package/dist/gateway/static/root/assets/main-DevbZW9K.js +0 -2227
  251. package/dist/gateway/static/root/assets/main-DevbZW9K.js.map +0 -1
  252. package/dist/gateway/static/root/assets/main-DxZg1Nmz.css +0 -1
  253. package/dist/providers/__tests__/registry.test.d.ts +0 -1
  254. package/dist/providers/__tests__/registry.test.js +0 -110
  255. package/dist/providers/__tests__/registry.test.js.map +0 -1
  256. package/dist/providers/api-strategies.d.ts +0 -15
  257. package/dist/providers/api-strategies.js +0 -96
  258. package/dist/providers/api-strategies.js.map +0 -1
  259. package/dist/providers/auto-discovery.d.ts +0 -84
  260. package/dist/providers/auto-discovery.js +0 -236
  261. package/dist/providers/auto-discovery.js.map +0 -1
  262. package/dist/providers/config.d.ts +0 -25
  263. package/dist/providers/config.js +0 -42
  264. package/dist/providers/config.js.map +0 -1
  265. package/dist/providers/model-catalog.d.ts +0 -205
  266. package/dist/providers/model-catalog.js +0 -1071
  267. package/dist/providers/model-catalog.js.map +0 -1
  268. package/dist/providers/models-dev-data.d.ts +0 -11
  269. package/dist/providers/models-dev-data.js +0 -1035
  270. package/dist/providers/models-dev-data.js.map +0 -1
  271. package/dist/providers/models-dev.d.ts +0 -30
  272. package/dist/providers/models-dev.js +0 -42
  273. package/dist/providers/models-dev.js.map +0 -1
  274. package/dist/providers/pi-ai.d.ts +0 -62
  275. package/dist/providers/pi-ai.js +0 -221
  276. package/dist/providers/pi-ai.js.map +0 -1
  277. package/dist/providers/provider-catalog.d.ts +0 -173
  278. package/dist/providers/provider-catalog.js +0 -834
  279. package/dist/providers/provider-catalog.js.map +0 -1
  280. package/dist/providers/registry.d.ts +0 -155
  281. package/dist/providers/registry.js +0 -524
  282. package/dist/providers/registry.js.map +0 -1
  283. package/dist/providers/types.d.ts +0 -95
  284. package/dist/providers/types.js +0 -7
  285. package/dist/providers/types.js.map +0 -1
  286. package/dist/session/chat-manager.d.ts +0 -49
  287. package/dist/session/chat-manager.js +0 -167
  288. package/dist/session/chat-manager.js.map +0 -1
  289. package/dist/session/chat-types.d.ts +0 -53
  290. package/dist/session/chat-types.js +0 -63
  291. package/dist/session/chat-types.js.map +0 -1
  292. /package/dist/{__tests__/core.test.d.ts → cli/commands/setup.d.ts} +0 -0
@@ -1,192 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { diffConfigPaths } from '../diff.js';
3
- describe('diffConfigPaths', () => {
4
- it('should return empty array for identical values', () => {
5
- const obj = { a: 1, b: 'test' };
6
- expect(diffConfigPaths(obj, obj)).toEqual([]);
7
- });
8
- it('should return empty array for same primitive values', () => {
9
- expect(diffConfigPaths(1, 1)).toEqual([]);
10
- expect(diffConfigPaths('test', 'test')).toEqual([]);
11
- expect(diffConfigPaths(null, null)).toEqual([]);
12
- expect(diffConfigPaths(undefined, undefined)).toEqual([]);
13
- });
14
- it('should detect primitive value changes', () => {
15
- expect(diffConfigPaths(1, 2)).toEqual(['<root>']);
16
- expect(diffConfigPaths('a', 'b')).toEqual(['<root>']);
17
- expect(diffConfigPaths(true, false)).toEqual(['<root>']);
18
- expect(diffConfigPaths(null, undefined)).toEqual(['<root>']);
19
- });
20
- it('should detect object property changes', () => {
21
- const prev = { a: 1, b: 'test' };
22
- const next = { a: 2, b: 'test' };
23
- expect(diffConfigPaths(prev, next)).toEqual(['a']);
24
- });
25
- it('should detect multiple property changes', () => {
26
- const prev = { a: 1, b: 'test', c: true };
27
- const next = { a: 2, b: 'changed', c: false };
28
- const paths = diffConfigPaths(prev, next);
29
- expect(paths).toContain('a');
30
- expect(paths).toContain('b');
31
- expect(paths).toContain('c');
32
- });
33
- it('should detect added properties', () => {
34
- const prev = { a: 1 };
35
- const next = { a: 1, b: 2 };
36
- expect(diffConfigPaths(prev, next)).toEqual(['b']);
37
- });
38
- it('should detect removed properties', () => {
39
- const prev = { a: 1, b: 2 };
40
- const next = { a: 1 };
41
- expect(diffConfigPaths(prev, next)).toEqual(['b']);
42
- });
43
- it('should handle nested objects', () => {
44
- const prev = { a: { b: { c: 1 } } };
45
- const next = { a: { b: { c: 2 } } };
46
- expect(diffConfigPaths(prev, next)).toEqual(['a.b.c']);
47
- });
48
- it('should handle deeply nested changes', () => {
49
- const prev = {
50
- agents: {
51
- defaults: {
52
- model: 'model-a',
53
- temperature: 0.5,
54
- },
55
- },
56
- };
57
- const next = {
58
- agents: {
59
- defaults: {
60
- model: 'model-b',
61
- temperature: 0.5,
62
- },
63
- },
64
- };
65
- expect(diffConfigPaths(prev, next)).toEqual(['agents.defaults.model']);
66
- });
67
- it('should handle multiple nested changes', () => {
68
- const prev = {
69
- providers: {
70
- openai: { apiKey: 'key1' },
71
- anthropic: { apiKey: 'key2' },
72
- },
73
- };
74
- const next = {
75
- providers: {
76
- openai: { apiKey: 'key1-new' },
77
- anthropic: { apiKey: 'key2' },
78
- },
79
- };
80
- expect(diffConfigPaths(prev, next)).toEqual(['providers.openai.apiKey']);
81
- });
82
- it('should handle array changes', () => {
83
- const prev = { items: [1, 2, 3] };
84
- const next = { items: [1, 2, 4] };
85
- expect(diffConfigPaths(prev, next)).toEqual(['items']);
86
- });
87
- it('should detect array length changes', () => {
88
- const prev = { items: [1, 2] };
89
- const next = { items: [1, 2, 3] };
90
- expect(diffConfigPaths(prev, next)).toEqual(['items']);
91
- });
92
- it('should return empty array for identical arrays', () => {
93
- const prev = { items: [1, 2, 3] };
94
- const next = { items: [1, 2, 3] };
95
- expect(diffConfigPaths(prev, next)).toEqual([]);
96
- });
97
- it('should handle mixed nested structures', () => {
98
- const prev = {
99
- a: 1,
100
- b: {
101
- c: [1, 2],
102
- d: { e: 'test' },
103
- },
104
- };
105
- const next = {
106
- a: 1,
107
- b: {
108
- c: [1, 3],
109
- d: { e: 'test' },
110
- },
111
- };
112
- expect(diffConfigPaths(prev, next)).toEqual(['b.c']);
113
- });
114
- it('should handle null to object changes', () => {
115
- const prev = { a: null };
116
- const next = { a: { b: 1 } };
117
- expect(diffConfigPaths(prev, next)).toEqual(['a']);
118
- });
119
- it('should handle object to null changes', () => {
120
- const prev = { a: { b: 1 } };
121
- const next = { a: null };
122
- expect(diffConfigPaths(prev, next)).toEqual(['a']);
123
- });
124
- it('should handle undefined values', () => {
125
- const prev = { a: undefined };
126
- const next = { a: 1 };
127
- expect(diffConfigPaths(prev, next)).toEqual(['a']);
128
- });
129
- it('should handle empty objects', () => {
130
- const prev = {};
131
- const next = { a: 1 };
132
- expect(diffConfigPaths(prev, next)).toEqual(['a']);
133
- });
134
- it('should handle custom prefix', () => {
135
- const prev = { a: 1 };
136
- const next = { a: 2 };
137
- expect(diffConfigPaths(prev, next, 'config')).toEqual(['config.a']);
138
- });
139
- it('should handle empty prefix', () => {
140
- const prev = { a: 1 };
141
- const next = { a: 2 };
142
- expect(diffConfigPaths(prev, next, '')).toEqual(['a']);
143
- });
144
- it('should handle complex config-like structures', () => {
145
- const prev = {
146
- agents: {
147
- defaults: {
148
- model: 'anthropic/claude-sonnet-4-5',
149
- maxTokens: 8192,
150
- temperature: 0.7,
151
- },
152
- },
153
- providers: {
154
- openai: { apiKey: 'key1' },
155
- },
156
- gateway: {
157
- port: 18790,
158
- },
159
- };
160
- const next = {
161
- agents: {
162
- defaults: {
163
- model: 'openai/gpt-4o',
164
- maxTokens: 8192,
165
- temperature: 0.8,
166
- },
167
- },
168
- providers: {
169
- openai: { apiKey: 'key2' },
170
- },
171
- gateway: {
172
- port: 18790,
173
- },
174
- };
175
- const paths = diffConfigPaths(prev, next);
176
- expect(paths).toContain('agents.defaults.model');
177
- expect(paths).toContain('agents.defaults.temperature');
178
- expect(paths).toContain('providers.openai.apiKey');
179
- expect(paths).not.toContain('gateway.port');
180
- });
181
- it('should not recurse into non-plain objects', () => {
182
- const date1 = new Date('2024-01-01');
183
- const date2 = new Date('2024-01-02');
184
- expect(diffConfigPaths(date1, date2)).toEqual(['<root>']);
185
- });
186
- it('should handle arrays vs non-arrays', () => {
187
- const prev = { a: [1, 2, 3] };
188
- const next = { a: { b: 1 } };
189
- expect(diffConfigPaths(prev, next)).toEqual(['a']);
190
- });
191
- });
192
- //# sourceMappingURL=diff.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diff.test.js","sourceRoot":"","sources":["../../../src/config/__tests__/diff.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,356 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { loadConfig, saveConfig, DEFAULT_PATHS } from '../loader.js';
3
- import { getDefaultConfigPath } from '../paths.js';
4
- import { ConfigSchema } from '../schema.js';
5
- // Mock fs module
6
- vi.mock('fs', async (importOriginal) => {
7
- const actual = await importOriginal();
8
- return {
9
- ...actual,
10
- existsSync: vi.fn(),
11
- readFileSync: vi.fn(),
12
- writeFileSync: vi.fn(),
13
- mkdirSync: vi.fn(),
14
- copyFileSync: vi.fn(),
15
- promises: {
16
- unlink: vi.fn().mockResolvedValue(undefined),
17
- rename: vi.fn().mockResolvedValue(undefined),
18
- copyFile: vi.fn().mockResolvedValue(undefined),
19
- writeFile: vi.fn().mockResolvedValue(undefined),
20
- },
21
- };
22
- });
23
- // Mock os module
24
- vi.mock('os', () => ({
25
- homedir: vi.fn(() => '/tmp/test-home'),
26
- }));
27
- // Mock dotenv
28
- vi.mock('dotenv', () => ({
29
- config: vi.fn(),
30
- }));
31
- import * as fs from 'fs';
32
- describe('loadConfig', () => {
33
- beforeEach(() => {
34
- vi.clearAllMocks();
35
- delete process.env.CONFIG_PATH;
36
- });
37
- it('should return default config when file does not exist', () => {
38
- vi.mocked(fs.existsSync).mockReturnValue(false);
39
- const config = loadConfig();
40
- expect(config).toBeDefined();
41
- expect(config.agents?.defaults?.model).toBe('anthropic/claude-sonnet-4-5');
42
- expect(config.agents?.defaults?.maxToolIterations).toBe(20);
43
- });
44
- it('should load and parse existing config file', () => {
45
- const mockConfig = {
46
- agents: {
47
- defaults: {
48
- model: 'openai/gpt-4o',
49
- temperature: 0.5,
50
- },
51
- },
52
- };
53
- vi.mocked(fs.existsSync).mockReturnValue(true);
54
- vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig));
55
- const config = loadConfig();
56
- expect(config.agents?.defaults?.model).toBe('openai/gpt-4o');
57
- expect(config.agents?.defaults?.temperature).toBe(0.5);
58
- // Should merge with defaults
59
- expect(config.agents?.defaults?.maxToolIterations).toBe(20);
60
- });
61
- it('should handle custom config path from argument', () => {
62
- const customPath = '/custom/path/config.json';
63
- const mockConfig = { agents: { defaults: { model: 'test-model' } } };
64
- vi.mocked(fs.existsSync).mockImplementation((path) => path === customPath);
65
- vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig));
66
- const config = loadConfig(customPath);
67
- expect(fs.readFileSync).toHaveBeenCalledWith(customPath, 'utf-8');
68
- expect(config.agents?.defaults?.model).toBe('test-model');
69
- });
70
- it('should handle custom config path from env var', () => {
71
- const envPath = '/env/path/config.json';
72
- process.env.CONFIG_PATH = envPath;
73
- const mockConfig = { agents: { defaults: { model: 'env-model' } } };
74
- vi.mocked(fs.existsSync).mockImplementation((path) => path === envPath);
75
- vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig));
76
- const config = loadConfig();
77
- expect(fs.readFileSync).toHaveBeenCalledWith(envPath, 'utf-8');
78
- expect(config.agents?.defaults?.model).toBe('env-model');
79
- delete process.env.CONFIG_PATH;
80
- });
81
- it('should return default config when file has invalid JSON', () => {
82
- vi.mocked(fs.existsSync).mockReturnValue(true);
83
- vi.mocked(fs.readFileSync).mockReturnValue('not valid json');
84
- const config = loadConfig();
85
- expect(config).toBeDefined();
86
- expect(config.agents?.defaults?.model).toBe('anthropic/claude-sonnet-4-5');
87
- });
88
- it('should use default path when no custom path provided', () => {
89
- vi.mocked(fs.existsSync).mockReturnValue(false);
90
- loadConfig();
91
- expect(fs.existsSync).toHaveBeenCalledWith('/tmp/test-home/.xopcbot/config.json');
92
- });
93
- });
94
- describe('saveConfig', () => {
95
- beforeEach(() => {
96
- vi.clearAllMocks();
97
- delete process.env.CONFIG_PATH;
98
- });
99
- it('should save config to file', async () => {
100
- const config = ConfigSchema.parse({
101
- agents: {
102
- defaults: {
103
- model: 'test-model',
104
- },
105
- },
106
- });
107
- vi.mocked(fs.existsSync).mockReturnValue(true);
108
- vi.mocked(fs.mkdirSync).mockReturnValue(undefined);
109
- await saveConfig(config);
110
- expect(fs.promises.writeFile).toHaveBeenCalledWith('/tmp/test-home/.xopcbot/config.json', expect.stringContaining('test-model'), 'utf-8');
111
- });
112
- it('should create parent directories if they do not exist', async () => {
113
- const config = ConfigSchema.parse({});
114
- vi.mocked(fs.existsSync).mockReturnValue(false);
115
- vi.mocked(fs.mkdirSync).mockReturnValue(undefined);
116
- await saveConfig(config);
117
- expect(fs.mkdirSync).toHaveBeenCalledWith('/tmp/test-home/.xopcbot', { recursive: true });
118
- expect(fs.promises.writeFile).toHaveBeenCalled();
119
- });
120
- it('should handle custom config path', async () => {
121
- const customPath = '/custom/path/config.json';
122
- const config = ConfigSchema.parse({});
123
- vi.mocked(fs.existsSync).mockReturnValue(true);
124
- vi.mocked(fs.mkdirSync).mockReturnValue(undefined);
125
- await saveConfig(config, customPath);
126
- expect(fs.promises.writeFile).toHaveBeenCalledWith(customPath, expect.any(String), 'utf-8');
127
- });
128
- it('should write pretty-printed JSON', async () => {
129
- const config = ConfigSchema.parse({ agents: { defaults: { model: 'test' } } });
130
- vi.mocked(fs.existsSync).mockReturnValue(true);
131
- vi.mocked(fs.mkdirSync).mockReturnValue(undefined);
132
- await saveConfig(config);
133
- const writtenContent = vi.mocked(fs.promises.writeFile).mock.calls[0][1];
134
- // Should be indented JSON
135
- expect(writtenContent).toContain('\n');
136
- expect(() => JSON.parse(writtenContent)).not.toThrow();
137
- });
138
- it('should backup existing config before writing', async () => {
139
- const config = ConfigSchema.parse({ agents: { defaults: { model: 'test' } } });
140
- vi.mocked(fs.existsSync).mockReturnValue(true);
141
- vi.mocked(fs.mkdirSync).mockReturnValue(undefined);
142
- await saveConfig(config);
143
- // Should copy existing config to .bak
144
- expect(fs.promises.copyFile).toHaveBeenCalledWith('/tmp/test-home/.xopcbot/config.json', '/tmp/test-home/.xopcbot/config.json.bak');
145
- });
146
- });
147
- describe('getDefaultConfigPath', () => {
148
- beforeEach(() => {
149
- delete process.env.XOPCBOT_CONFIG;
150
- });
151
- afterEach(() => {
152
- delete process.env.XOPCBOT_CONFIG;
153
- });
154
- it('should return default path', () => {
155
- const path = getDefaultConfigPath();
156
- expect(path).toBe('/tmp/test-home/.xopcbot/config.json');
157
- });
158
- it('should return env var path when set', () => {
159
- process.env.XOPCBOT_CONFIG = '/env/config.json';
160
- const path = getDefaultConfigPath();
161
- expect(path).toBe('/env/config.json');
162
- delete process.env.XOPCBOT_CONFIG;
163
- });
164
- });
165
- describe('loadConfig edge cases', () => {
166
- beforeEach(() => {
167
- vi.clearAllMocks();
168
- delete process.env.CONFIG_PATH;
169
- });
170
- it('should handle config with missing sections', () => {
171
- const mockConfig = {
172
- providers: {
173
- openai: { apiKey: 'test-key' },
174
- },
175
- };
176
- vi.mocked(fs.existsSync).mockReturnValue(true);
177
- vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig));
178
- const config = loadConfig();
179
- expect(config.providers?.openai?.apiKey).toBe('test-key');
180
- expect(config.agents?.defaults?.model).toBe('anthropic/claude-sonnet-4-5');
181
- });
182
- it('should handle empty config file', () => {
183
- vi.mocked(fs.existsSync).mockReturnValue(true);
184
- vi.mocked(fs.readFileSync).mockReturnValue('{}');
185
- const config = loadConfig();
186
- expect(config).toBeDefined();
187
- expect(config.agents?.defaults).toBeDefined();
188
- });
189
- it('should handle config with extra unknown fields', () => {
190
- const mockConfig = {
191
- agents: {
192
- defaults: {
193
- model: 'test-model',
194
- },
195
- },
196
- unknownField: 'unknown fields are stripped by Zod',
197
- };
198
- vi.mocked(fs.existsSync).mockReturnValue(true);
199
- vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig));
200
- // ConfigSchema doesn't use .strict(), so unknown fields are stripped
201
- // Known fields are still parsed correctly
202
- const config = loadConfig();
203
- // Known fields should be parsed
204
- expect(config.agents?.defaults?.model).toBe('test-model');
205
- // Unknown fields are ignored (not accessible on the typed result)
206
- });
207
- it('should handle partial provider config', () => {
208
- const mockConfig = {
209
- providers: {
210
- openai: { apiKey: 'test' },
211
- // anthropic and ollama are not provided, will be undefined
212
- },
213
- };
214
- vi.mocked(fs.existsSync).mockReturnValue(true);
215
- vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig));
216
- const config = loadConfig();
217
- expect(config.providers?.openai?.apiKey).toBe('test');
218
- // Unspecified providers are undefined (not merged with defaults)
219
- expect(config.providers?.anthropic).toBeUndefined();
220
- expect(config.providers?.ollama).toBeUndefined();
221
- });
222
- it('should handle whitespace-only JSON', () => {
223
- vi.mocked(fs.existsSync).mockReturnValue(true);
224
- vi.mocked(fs.readFileSync).mockReturnValue(' \n\t ');
225
- const config = loadConfig();
226
- expect(config).toBeDefined();
227
- expect(config.agents?.defaults?.model).toBe('anthropic/claude-sonnet-4-5');
228
- });
229
- it('should handle JSON with comments-like content (invalid JSON)', () => {
230
- vi.mocked(fs.existsSync).mockReturnValue(true);
231
- vi.mocked(fs.readFileSync).mockReturnValue('// comment\n{"agents": {}}');
232
- const config = loadConfig();
233
- // Should fall back to defaults since this is invalid JSON
234
- expect(config.agents?.defaults?.model).toBe('anthropic/claude-sonnet-4-5');
235
- });
236
- it('should handle deeply nested invalid config', () => {
237
- const mockConfig = {
238
- agents: {
239
- defaults: {
240
- temperature: 'invalid-string',
241
- },
242
- },
243
- };
244
- vi.mocked(fs.existsSync).mockReturnValue(true);
245
- vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig));
246
- // Should fall back to defaults on validation error
247
- const config = loadConfig();
248
- expect(config.agents?.defaults?.temperature).toBe(0.7);
249
- });
250
- });
251
- describe('saveConfig edge cases', () => {
252
- beforeEach(() => {
253
- vi.clearAllMocks();
254
- delete process.env.CONFIG_PATH;
255
- });
256
- it('should save config with all sections', async () => {
257
- const config = ConfigSchema.parse({
258
- agents: {
259
- defaults: {
260
- model: 'test-model',
261
- maxTokens: 4096,
262
- },
263
- },
264
- providers: {
265
- openai: { apiKey: 'test-key' },
266
- },
267
- gateway: {
268
- port: 3000,
269
- },
270
- });
271
- vi.mocked(fs.existsSync).mockReturnValue(true);
272
- await saveConfig(config);
273
- const writtenContent = vi.mocked(fs.promises.writeFile).mock.calls[0][1];
274
- const parsed = JSON.parse(writtenContent);
275
- expect(parsed.agents.defaults.model).toBe('test-model');
276
- expect(parsed.providers.openai.apiKey).toBe('test-key');
277
- expect(parsed.gateway.port).toBe(3000);
278
- });
279
- it('should use env var CONFIG_PATH when set', async () => {
280
- process.env.CONFIG_PATH = '/env/config.json';
281
- const config = ConfigSchema.parse({});
282
- vi.mocked(fs.existsSync).mockReturnValue(true);
283
- await saveConfig(config);
284
- expect(fs.promises.writeFile).toHaveBeenCalledWith('/env/config.json', expect.any(String), 'utf-8');
285
- delete process.env.CONFIG_PATH;
286
- });
287
- it('should handle argument path taking precedence over env var', async () => {
288
- process.env.CONFIG_PATH = '/env/config.json';
289
- const argPath = '/arg/config.json';
290
- const config = ConfigSchema.parse({});
291
- vi.mocked(fs.existsSync).mockReturnValue(true);
292
- await saveConfig(config, argPath);
293
- expect(fs.promises.writeFile).toHaveBeenCalledWith(argPath, expect.any(String), 'utf-8');
294
- delete process.env.CONFIG_PATH;
295
- });
296
- it('should serialize config with proper structure', async () => {
297
- const config = ConfigSchema.parse({});
298
- vi.mocked(fs.existsSync).mockReturnValue(true);
299
- await saveConfig(config);
300
- const writtenContent = vi.mocked(fs.promises.writeFile).mock.calls[0][1];
301
- const parsed = JSON.parse(writtenContent);
302
- expect(parsed).toHaveProperty('agents');
303
- expect(parsed).toHaveProperty('providers');
304
- expect(parsed).toHaveProperty('channels');
305
- expect(parsed).toHaveProperty('gateway');
306
- expect(parsed).toHaveProperty('tools');
307
- expect(parsed).toHaveProperty('cron');
308
- });
309
- it('should handle special characters in config values', async () => {
310
- const config = ConfigSchema.parse({
311
- agents: {
312
- defaults: {
313
- workspace: '~/workspace with spaces',
314
- },
315
- },
316
- providers: {
317
- openai: { apiKey: 'sk-key-with-special-chars_123' },
318
- },
319
- });
320
- vi.mocked(fs.existsSync).mockReturnValue(true);
321
- await saveConfig(config);
322
- const writtenContent = vi.mocked(fs.promises.writeFile).mock.calls[0][1];
323
- expect(() => JSON.parse(writtenContent)).not.toThrow();
324
- });
325
- it('should not backup when config file does not exist', async () => {
326
- const config = ConfigSchema.parse({ agents: { defaults: { model: 'test' } } });
327
- vi.mocked(fs.existsSync).mockReturnValue(false);
328
- vi.mocked(fs.mkdirSync).mockReturnValue(undefined);
329
- await saveConfig(config);
330
- // Should not try to copy when file doesn't exist
331
- expect(fs.promises.copyFile).not.toHaveBeenCalled();
332
- expect(fs.promises.writeFile).toHaveBeenCalled();
333
- });
334
- });
335
- describe('DEFAULT_PATHS export', () => {
336
- it('should export DEFAULT_PATHS from loader', () => {
337
- expect(DEFAULT_PATHS).toBeDefined();
338
- expect(DEFAULT_PATHS.config).toBeDefined();
339
- expect(DEFAULT_PATHS.workspace).toBeDefined();
340
- });
341
- it('should have consistent paths', () => {
342
- expect(DEFAULT_PATHS.config).toContain('.xopcbot');
343
- expect(DEFAULT_PATHS.config).toContain('config.json');
344
- });
345
- });
346
- describe('dotenv integration', () => {
347
- it('should call dotenv config on loadConfig', async () => {
348
- const dotenv = await import('dotenv');
349
- vi.mocked(fs.existsSync).mockReturnValue(false);
350
- vi.mocked(dotenv.config).mockClear();
351
- loadConfig();
352
- // dotenv.config should be called
353
- expect(dotenv.config).toHaveBeenCalled();
354
- });
355
- });
356
- //# sourceMappingURL=loader.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../src/config/__tests__/loader.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};