@xopcai/xopcbot 0.1.5 → 0.2.1

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 (285) hide show
  1. package/README.md +6 -6
  2. package/README.zh-CN.md +6 -6
  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 +21 -20
  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 +17 -49
  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 +73 -58
  118. package/dist/cli/commands/onboard.js.map +1 -1
  119. package/dist/cli/commands/skills.js +6 -6
  120. package/dist/cli/commands/skills.js.map +1 -1
  121. package/dist/cli/index.js +0 -0
  122. package/dist/cli/templates.d.ts +2 -0
  123. package/dist/cli/templates.js +1 -1
  124. package/dist/cli/templates.js.map +1 -1
  125. package/dist/config/defaults.d.ts +19 -0
  126. package/dist/config/defaults.js +168 -0
  127. package/dist/config/defaults.js.map +1 -0
  128. package/dist/config/index.d.ts +5 -0
  129. package/dist/config/index.js +4 -0
  130. package/dist/config/index.js.map +1 -1
  131. package/dist/config/integration.d.ts +12 -0
  132. package/dist/config/integration.js +14 -0
  133. package/dist/config/integration.js.map +1 -0
  134. package/dist/config/models-json.d.ts +454 -0
  135. package/dist/config/models-json.js +323 -0
  136. package/dist/config/models-json.js.map +1 -0
  137. package/dist/config/paths.d.ts +2 -0
  138. package/dist/config/paths.js +4 -0
  139. package/dist/config/paths.js.map +1 -1
  140. package/dist/config/reload.d.ts +1 -1
  141. package/dist/config/reload.js +3 -3
  142. package/dist/config/reload.js.map +1 -1
  143. package/dist/config/resolve-config-value.d.ts +36 -0
  144. package/dist/config/resolve-config-value.js +218 -0
  145. package/dist/config/resolve-config-value.js.map +1 -0
  146. package/dist/config/rules.js +3 -2
  147. package/dist/config/rules.js.map +1 -1
  148. package/dist/config/schema.d.ts +17 -884
  149. package/dist/config/schema.js +36 -312
  150. package/dist/config/schema.js.map +1 -1
  151. package/dist/config/types.models.d.ts +54 -0
  152. package/dist/config/types.models.js +2 -0
  153. package/dist/config/types.models.js.map +1 -0
  154. package/dist/cron/validation.d.ts +4 -4
  155. package/dist/gateway/hono/app.js +230 -78
  156. package/dist/gateway/hono/app.js.map +1 -1
  157. package/dist/gateway/hono/oauth-async.d.ts +14 -0
  158. package/dist/gateway/hono/oauth-async.js +285 -0
  159. package/dist/gateway/hono/oauth-async.js.map +1 -0
  160. package/dist/gateway/hono/oauth.d.ts +9 -0
  161. package/dist/gateway/hono/oauth.js +157 -0
  162. package/dist/gateway/hono/oauth.js.map +1 -0
  163. package/dist/gateway/hono/sse.js +5 -2
  164. package/dist/gateway/hono/sse.js.map +1 -1
  165. package/dist/gateway/service.d.ts +6 -2
  166. package/dist/gateway/service.js +20 -6
  167. package/dist/gateway/service.js.map +1 -1
  168. package/dist/gateway/static/root/assets/flow-BqIEBwW6.js +2 -0
  169. package/dist/gateway/static/root/assets/flow-BqIEBwW6.js.map +1 -0
  170. package/dist/gateway/static/root/assets/main-Br2tw-87.js +5168 -0
  171. package/dist/gateway/static/root/assets/main-Br2tw-87.js.map +1 -0
  172. package/dist/gateway/static/root/assets/main-DwlbPf8Z.css +1 -0
  173. package/dist/gateway/static/root/index.html +2 -2
  174. package/dist/plugins/index.d.ts +0 -2
  175. package/dist/plugins/index.js +0 -2
  176. package/dist/plugins/index.js.map +1 -1
  177. package/dist/plugins/types.d.ts +0 -2
  178. package/dist/plugins/types.js +0 -2
  179. package/dist/plugins/types.js.map +1 -1
  180. package/dist/providers/index.d.ts +50 -22
  181. package/dist/providers/index.js +276 -50
  182. package/dist/providers/index.js.map +1 -1
  183. package/dist/providers/model-registry.d.ts +84 -0
  184. package/dist/providers/model-registry.js +385 -0
  185. package/dist/providers/model-registry.js.map +1 -0
  186. package/dist/types/providers.d.ts +2 -63
  187. package/dist/types/providers.js +1 -1
  188. package/dist/utils/__tests__/frontmatter.test.js +4 -3
  189. package/dist/utils/__tests__/frontmatter.test.js.map +1 -1
  190. package/dist/utils/diagnostic-events.d.ts +230 -0
  191. package/dist/utils/diagnostic-events.js +189 -0
  192. package/dist/utils/diagnostic-events.js.map +1 -0
  193. package/dist/utils/frontmatter.d.ts +0 -1
  194. package/dist/utils/frontmatter.js +13 -77
  195. package/dist/utils/frontmatter.js.map +1 -1
  196. package/dist/utils/log-stream.d.ts +95 -0
  197. package/dist/utils/log-stream.js +229 -0
  198. package/dist/utils/log-stream.js.map +1 -0
  199. package/dist/utils/logger.d.ts +5 -0
  200. package/dist/utils/logger.js +25 -0
  201. package/dist/utils/logger.js.map +1 -1
  202. package/dist/utils/redact.d.ts +73 -0
  203. package/dist/utils/redact.js +245 -0
  204. package/dist/utils/redact.js.map +1 -0
  205. package/package.json +6 -4
  206. package/skills/find-skills/SKILL.md +0 -9
  207. package/dist/__tests__/core.test.d.ts +0 -1
  208. package/dist/__tests__/core.test.js +0 -72
  209. package/dist/__tests__/core.test.js.map +0 -1
  210. package/dist/agent/model-manager.js.map +0 -1
  211. package/dist/cli/commands/configure.d.ts +0 -1
  212. package/dist/cli/commands/configure.js +0 -171
  213. package/dist/cli/commands/configure.js.map +0 -1
  214. package/dist/cli/commands/gateway-daemon.d.ts +0 -1
  215. package/dist/cli/commands/gateway-daemon.js +0 -141
  216. package/dist/cli/commands/gateway-daemon.js.map +0 -1
  217. package/dist/config/__tests__/diff.test.d.ts +0 -1
  218. package/dist/config/__tests__/diff.test.js +0 -192
  219. package/dist/config/__tests__/diff.test.js.map +0 -1
  220. package/dist/config/__tests__/loader.test.d.ts +0 -1
  221. package/dist/config/__tests__/loader.test.js +0 -356
  222. package/dist/config/__tests__/loader.test.js.map +0 -1
  223. package/dist/config/__tests__/paths.test.d.ts +0 -1
  224. package/dist/config/__tests__/paths.test.js +0 -192
  225. package/dist/config/__tests__/paths.test.js.map +0 -1
  226. package/dist/config/__tests__/reload.test.d.ts +0 -1
  227. package/dist/config/__tests__/reload.test.js +0 -374
  228. package/dist/config/__tests__/reload.test.js.map +0 -1
  229. package/dist/config/__tests__/rules.test.d.ts +0 -1
  230. package/dist/config/__tests__/rules.test.js +0 -204
  231. package/dist/config/__tests__/rules.test.js.map +0 -1
  232. package/dist/config/__tests__/schema.test.d.ts +0 -1
  233. package/dist/config/__tests__/schema.test.js +0 -672
  234. package/dist/config/__tests__/schema.test.js.map +0 -1
  235. package/dist/daemon/background-start.d.ts +0 -33
  236. package/dist/daemon/background-start.js +0 -89
  237. package/dist/daemon/background-start.js.map +0 -1
  238. package/dist/daemon/gateway-manager.d.ts +0 -87
  239. package/dist/daemon/gateway-manager.js +0 -324
  240. package/dist/daemon/gateway-manager.js.map +0 -1
  241. package/dist/daemon/index.d.ts +0 -5
  242. package/dist/daemon/index.js +0 -6
  243. package/dist/daemon/index.js.map +0 -1
  244. package/dist/gateway/static/root/assets/main-DevbZW9K.js +0 -2227
  245. package/dist/gateway/static/root/assets/main-DevbZW9K.js.map +0 -1
  246. package/dist/gateway/static/root/assets/main-DxZg1Nmz.css +0 -1
  247. package/dist/providers/__tests__/registry.test.d.ts +0 -1
  248. package/dist/providers/__tests__/registry.test.js +0 -110
  249. package/dist/providers/__tests__/registry.test.js.map +0 -1
  250. package/dist/providers/api-strategies.d.ts +0 -15
  251. package/dist/providers/api-strategies.js +0 -96
  252. package/dist/providers/api-strategies.js.map +0 -1
  253. package/dist/providers/auto-discovery.d.ts +0 -39
  254. package/dist/providers/auto-discovery.js +0 -189
  255. package/dist/providers/auto-discovery.js.map +0 -1
  256. package/dist/providers/config.d.ts +0 -25
  257. package/dist/providers/config.js +0 -42
  258. package/dist/providers/config.js.map +0 -1
  259. package/dist/providers/model-catalog.d.ts +0 -92
  260. package/dist/providers/model-catalog.js +0 -998
  261. package/dist/providers/model-catalog.js.map +0 -1
  262. package/dist/providers/models-dev-data.d.ts +0 -11
  263. package/dist/providers/models-dev-data.js +0 -1035
  264. package/dist/providers/models-dev-data.js.map +0 -1
  265. package/dist/providers/models-dev.d.ts +0 -34
  266. package/dist/providers/models-dev.js +0 -33
  267. package/dist/providers/models-dev.js.map +0 -1
  268. package/dist/providers/pi-ai.d.ts +0 -62
  269. package/dist/providers/pi-ai.js +0 -221
  270. package/dist/providers/pi-ai.js.map +0 -1
  271. package/dist/providers/provider-catalog.d.ts +0 -91
  272. package/dist/providers/provider-catalog.js +0 -791
  273. package/dist/providers/provider-catalog.js.map +0 -1
  274. package/dist/providers/registry.d.ts +0 -135
  275. package/dist/providers/registry.js +0 -475
  276. package/dist/providers/registry.js.map +0 -1
  277. package/dist/providers/types.d.ts +0 -95
  278. package/dist/providers/types.js +0 -7
  279. package/dist/providers/types.js.map +0 -1
  280. package/dist/session/chat-manager.d.ts +0 -49
  281. package/dist/session/chat-manager.js +0 -167
  282. package/dist/session/chat-manager.js.map +0 -1
  283. package/dist/session/chat-types.d.ts +0 -53
  284. package/dist/session/chat-types.js +0 -63
  285. package/dist/session/chat-types.js.map +0 -1
package/README.md CHANGED
@@ -55,14 +55,14 @@ npm install -g @xopcai/xopcbot
55
55
 
56
56
  # Or from source
57
57
  git clone https://github.com/xopcai/xopcbot.git
58
- cd xopcbot && pnpm install && pnpm build
58
+ cd xopcbot && npm install && npm build
59
59
  ```
60
60
 
61
61
  ### 2️⃣ Setup (interactive wizard)
62
62
 
63
63
  ```bash
64
64
  xopcbot onboard
65
- # or: pnpm run dev -- onboard
65
+ # or: npm run dev -- onboard
66
66
  ```
67
67
 
68
68
  The wizard will guide you through:
@@ -111,16 +111,16 @@ xopcbot agent -m "Hello!" --channel telegram --chat-id 123456
111
111
 
112
112
  ```bash
113
113
  # Development (with hot reload)
114
- pnpm run dev
114
+ npm run dev
115
115
 
116
116
  # Build for production
117
- pnpm run build
117
+ npm run build
118
118
 
119
119
  # Run tests
120
- pnpm test
120
+ npm test
121
121
 
122
122
  # Lint
123
- pnpm run lint
123
+ npm run lint
124
124
  ```
125
125
 
126
126
  ---
package/README.zh-CN.md CHANGED
@@ -55,14 +55,14 @@ npm install -g @xopcai/xopcbot
55
55
 
56
56
  # 或从源码构建
57
57
  git clone https://github.com/xopcai/xopcbot.git
58
- cd xopcbot && pnpm install && pnpm build
58
+ cd xopcbot && npm install && npm build
59
59
  ```
60
60
 
61
61
  ### 2️⃣ 配置(交互式向导)
62
62
 
63
63
  ```bash
64
64
  xopcbot onboard
65
- # 或: pnpm run dev -- onboard
65
+ # 或: npm run dev -- onboard
66
66
  ```
67
67
 
68
68
  向导会引导你完成:
@@ -111,16 +111,16 @@ xopcbot agent -m "你好!" --channel telegram --chat-id 123456
111
111
 
112
112
  ```bash
113
113
  # 开发模式(热重载)
114
- pnpm run dev
114
+ npm run dev
115
115
 
116
116
  # 构建生产版本
117
- pnpm run build
117
+ npm run build
118
118
 
119
119
  # 运行测试
120
- pnpm test
120
+ npm test
121
121
 
122
122
  # 代码检查
123
- pnpm run lint
123
+ npm run lint
124
124
  ```
125
125
 
126
126
  ---
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Agent Media Processing Tests
3
+ *
4
+ * Tests for media message handling in AgentService.
5
+ */
6
+ export {};
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Agent Media Processing Tests
3
+ *
4
+ * Tests for media message handling in AgentService.
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ describe('Agent Message Content Building', () => {
8
+ describe('MessageContent Array Construction', () => {
9
+ it('should build message content with only text', () => {
10
+ const expandedContent = 'Hello world';
11
+ const attachments = [];
12
+ const messageContent = [];
13
+ if (expandedContent.trim()) {
14
+ messageContent.push({ type: 'text', text: expandedContent });
15
+ }
16
+ if (attachments && attachments.length > 0) {
17
+ for (const att of attachments) {
18
+ if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
19
+ messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
20
+ }
21
+ else {
22
+ const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
23
+ messageContent.push({ type: 'text', text: fileInfo });
24
+ }
25
+ }
26
+ }
27
+ expect(messageContent).toHaveLength(1);
28
+ expect(messageContent[0]).toEqual({ type: 'text', text: 'Hello world' });
29
+ });
30
+ it('should build message content with text and single image', () => {
31
+ const expandedContent = 'Check this photo';
32
+ const attachments = [
33
+ {
34
+ type: 'photo',
35
+ mimeType: 'image/jpeg',
36
+ data: '/9j/4AAQSkZJRgABAQ==',
37
+ name: 'photo.jpg',
38
+ size: 1024,
39
+ },
40
+ ];
41
+ const messageContent = [];
42
+ if (expandedContent.trim()) {
43
+ messageContent.push({ type: 'text', text: expandedContent });
44
+ }
45
+ if (attachments && attachments.length > 0) {
46
+ for (const att of attachments) {
47
+ if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
48
+ messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
49
+ }
50
+ else {
51
+ const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
52
+ messageContent.push({ type: 'text', text: fileInfo });
53
+ }
54
+ }
55
+ }
56
+ expect(messageContent).toHaveLength(2);
57
+ expect(messageContent[0]).toEqual({ type: 'text', text: 'Check this photo' });
58
+ expect(messageContent[1]).toEqual({
59
+ type: 'image',
60
+ data: '/9j/4AAQSkZJRgABAQ==',
61
+ mimeType: 'image/jpeg'
62
+ });
63
+ });
64
+ it('should build message content with multiple images', () => {
65
+ const expandedContent = 'Here are photos';
66
+ const attachments = [
67
+ { type: 'photo', mimeType: 'image/jpeg', data: 'data1', name: 'photo1.jpg', size: 1000 },
68
+ { type: 'photo', mimeType: 'image/png', data: 'data2', name: 'photo2.png', size: 2000 },
69
+ { type: 'photo', mimeType: 'image/webp', data: 'data3', name: 'photo3.webp', size: 1500 },
70
+ ];
71
+ const messageContent = [];
72
+ if (expandedContent.trim()) {
73
+ messageContent.push({ type: 'text', text: expandedContent });
74
+ }
75
+ if (attachments && attachments.length > 0) {
76
+ for (const att of attachments) {
77
+ if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
78
+ messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
79
+ }
80
+ else {
81
+ const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
82
+ messageContent.push({ type: 'text', text: fileInfo });
83
+ }
84
+ }
85
+ }
86
+ expect(messageContent).toHaveLength(4);
87
+ expect(messageContent[0].type).toBe('text');
88
+ expect(messageContent[1]).toEqual({ type: 'image', data: 'data1', mimeType: 'image/jpeg' });
89
+ expect(messageContent[2]).toEqual({ type: 'image', data: 'data2', mimeType: 'image/png' });
90
+ expect(messageContent[3]).toEqual({ type: 'image', data: 'data3', mimeType: 'image/webp' });
91
+ });
92
+ it('should convert non-image attachments to text description', () => {
93
+ const expandedContent = 'Here is a file';
94
+ const attachments = [
95
+ {
96
+ type: 'document',
97
+ mimeType: 'application/pdf',
98
+ data: 'pdfdata123',
99
+ name: 'document.pdf',
100
+ size: 102400,
101
+ },
102
+ ];
103
+ const messageContent = [];
104
+ if (expandedContent.trim()) {
105
+ messageContent.push({ type: 'text', text: expandedContent });
106
+ }
107
+ if (attachments && attachments.length > 0) {
108
+ for (const att of attachments) {
109
+ if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
110
+ messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
111
+ }
112
+ else {
113
+ const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
114
+ messageContent.push({ type: 'text', text: fileInfo });
115
+ }
116
+ }
117
+ }
118
+ expect(messageContent).toHaveLength(2);
119
+ expect(messageContent[0]).toEqual({ type: 'text', text: 'Here is a file' });
120
+ expect(messageContent[1]).toEqual({
121
+ type: 'text',
122
+ text: '[File: document.pdf (application/pdf, 102400 bytes)]'
123
+ });
124
+ });
125
+ it('should handle mixed image and non-image attachments', () => {
126
+ const expandedContent = 'Mixed content';
127
+ const attachments = [
128
+ { type: 'photo', mimeType: 'image/jpeg', data: 'img1', name: 'photo.jpg', size: 1000 },
129
+ { type: 'document', mimeType: 'application/pdf', data: 'pdf1', name: 'doc.pdf', size: 5000 },
130
+ { type: 'photo', mimeType: 'image/png', data: 'img2', name: 'screenshot.png', size: 2000 },
131
+ { type: 'audio', mimeType: 'audio/mpeg', data: 'audio1', name: 'voice.mp3', size: 3000 },
132
+ ];
133
+ const messageContent = [];
134
+ if (expandedContent.trim()) {
135
+ messageContent.push({ type: 'text', text: expandedContent });
136
+ }
137
+ if (attachments && attachments.length > 0) {
138
+ for (const att of attachments) {
139
+ if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
140
+ messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
141
+ }
142
+ else {
143
+ const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
144
+ messageContent.push({ type: 'text', text: fileInfo });
145
+ }
146
+ }
147
+ }
148
+ expect(messageContent).toHaveLength(5);
149
+ expect(messageContent[0]).toEqual({ type: 'text', text: 'Mixed content' });
150
+ expect(messageContent[1]).toEqual({ type: 'image', data: 'img1', mimeType: 'image/jpeg' });
151
+ expect(messageContent[2]).toEqual({ type: 'text', text: '[File: doc.pdf (application/pdf, 5000 bytes)]' });
152
+ expect(messageContent[3]).toEqual({ type: 'image', data: 'img2', mimeType: 'image/png' });
153
+ expect(messageContent[4]).toEqual({ type: 'text', text: '[File: voice.mp3 (audio/mpeg, 3000 bytes)]' });
154
+ });
155
+ it('should handle empty content with only attachments', () => {
156
+ const expandedContent = '';
157
+ const attachments = [
158
+ { type: 'photo', mimeType: 'image/jpeg', data: 'imgdata', name: 'photo.jpg', size: 1000 },
159
+ ];
160
+ const messageContent = [];
161
+ if (expandedContent.trim()) {
162
+ messageContent.push({ type: 'text', text: expandedContent });
163
+ }
164
+ if (attachments && attachments.length > 0) {
165
+ for (const att of attachments) {
166
+ if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
167
+ messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
168
+ }
169
+ else {
170
+ const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
171
+ messageContent.push({ type: 'text', text: fileInfo });
172
+ }
173
+ }
174
+ }
175
+ expect(messageContent).toHaveLength(1);
176
+ expect(messageContent[0]).toEqual({ type: 'image', data: 'imgdata', mimeType: 'image/jpeg' });
177
+ });
178
+ it('should handle webp images correctly', () => {
179
+ const expandedContent = 'WebP image';
180
+ const attachments = [
181
+ { type: 'photo', mimeType: 'image/webp', data: 'webpdata', name: 'sticker.webp', size: 500 },
182
+ ];
183
+ const messageContent = [];
184
+ if (expandedContent.trim()) {
185
+ messageContent.push({ type: 'text', text: expandedContent });
186
+ }
187
+ if (attachments && attachments.length > 0) {
188
+ for (const att of attachments) {
189
+ if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
190
+ messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
191
+ }
192
+ else {
193
+ const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
194
+ messageContent.push({ type: 'text', text: fileInfo });
195
+ }
196
+ }
197
+ }
198
+ expect(messageContent).toHaveLength(2);
199
+ expect(messageContent[1]).toEqual({ type: 'image', data: 'webpdata', mimeType: 'image/webp' });
200
+ });
201
+ it('should handle gif images correctly', () => {
202
+ const expandedContent = 'GIF image';
203
+ const attachments = [
204
+ { type: 'document', mimeType: 'image/gif', data: 'gifdata', name: 'animation.gif', size: 2000 },
205
+ ];
206
+ const messageContent = [];
207
+ if (expandedContent.trim()) {
208
+ messageContent.push({ type: 'text', text: expandedContent });
209
+ }
210
+ if (attachments && attachments.length > 0) {
211
+ for (const att of attachments) {
212
+ if (att.type === 'photo' || att.mimeType?.startsWith('image/')) {
213
+ messageContent.push({ type: 'image', data: att.data, mimeType: att.mimeType });
214
+ }
215
+ else {
216
+ const fileInfo = `[File: ${att.name || att.type} (${att.mimeType || 'unknown type'}, ${att.size || 0} bytes)]`;
217
+ messageContent.push({ type: 'text', text: fileInfo });
218
+ }
219
+ }
220
+ }
221
+ expect(messageContent).toHaveLength(2);
222
+ expect(messageContent[1]).toEqual({ type: 'image', data: 'gifdata', mimeType: 'image/gif' });
223
+ });
224
+ });
225
+ describe('UserMessage Construction', () => {
226
+ it('should create valid AgentMessage with content array', () => {
227
+ const messageContent = [
228
+ { type: 'text', text: 'Hello' },
229
+ { type: 'image', data: 'imagedata', mimeType: 'image/jpeg' },
230
+ ];
231
+ const userMessage = {
232
+ role: 'user',
233
+ content: messageContent,
234
+ timestamp: Date.now(),
235
+ };
236
+ expect(userMessage.role).toBe('user');
237
+ expect(Array.isArray(userMessage.content)).toBe(true);
238
+ expect(userMessage.content).toHaveLength(2);
239
+ expect(userMessage.timestamp).toBeGreaterThan(0);
240
+ });
241
+ it('should handle message with only images', () => {
242
+ const messageContent = [
243
+ { type: 'image', data: 'img1', mimeType: 'image/jpeg' },
244
+ { type: 'image', data: 'img2', mimeType: 'image/png' },
245
+ ];
246
+ const userMessage = {
247
+ role: 'user',
248
+ content: messageContent,
249
+ timestamp: 1234567890,
250
+ };
251
+ expect(userMessage.content).toHaveLength(2);
252
+ expect(userMessage.content[0].type).toBe('image');
253
+ expect(userMessage.content[1].type).toBe('image');
254
+ });
255
+ });
256
+ });
257
+ describe('Outbound Media Message', () => {
258
+ it('should create OutboundMessage with mediaUrl', () => {
259
+ const reply = {
260
+ channel: 'telegram',
261
+ chat_id: '987654321',
262
+ content: 'Here is the image you requested',
263
+ mediaUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==',
264
+ mediaType: 'photo',
265
+ type: 'message',
266
+ };
267
+ expect(reply.mediaUrl).toBeTruthy();
268
+ expect(reply.mediaUrl.startsWith('data:image/png;base64,')).toBe(true);
269
+ expect(reply.mediaType).toBe('photo');
270
+ });
271
+ it('should handle data URL construction for different media types', () => {
272
+ const testCases = [
273
+ { mimeType: 'image/jpeg', base64: '/9j/4AAQSkZJRg==', type: 'photo' },
274
+ { mimeType: 'image/png', base64: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==', type: 'photo' },
275
+ { mimeType: 'video/mp4', base64: 'AAAAFGZ0eXBtcDQyAAAAAG1wNDJpc29tYXZjMQ==', type: 'video' },
276
+ ];
277
+ testCases.forEach(({ mimeType, base64, type }) => {
278
+ const dataUrl = `data:${mimeType};base64,${base64}`;
279
+ expect(dataUrl.startsWith(`data:${mimeType};base64,`)).toBe(true);
280
+ const reply = {
281
+ channel: 'telegram',
282
+ chat_id: '123',
283
+ content: 'Media',
284
+ mediaUrl: dataUrl,
285
+ mediaType: type,
286
+ };
287
+ expect(reply.mediaType).toBe(type);
288
+ });
289
+ });
290
+ });
291
+ describe('SendMedia Tool', () => {
292
+ describe('Media Type Detection', () => {
293
+ const detectMediaType = (filePath) => {
294
+ const ext = filePath.split('.').pop()?.toLowerCase();
295
+ const imageExts = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg'];
296
+ const videoExts = ['mp4', 'mov', 'avi', 'webm', 'mkv'];
297
+ const audioExts = ['mp3', 'wav', 'ogg', 'm4a', 'flac'];
298
+ if (imageExts.includes(ext || ''))
299
+ return 'photo';
300
+ if (videoExts.includes(ext || ''))
301
+ return 'video';
302
+ if (audioExts.includes(ext || ''))
303
+ return 'audio';
304
+ return 'document';
305
+ };
306
+ it('should detect photo files', () => {
307
+ expect(detectMediaType('image.jpg')).toBe('photo');
308
+ expect(detectMediaType('image.jpeg')).toBe('photo');
309
+ expect(detectMediaType('image.png')).toBe('photo');
310
+ expect(detectMediaType('image.gif')).toBe('photo');
311
+ expect(detectMediaType('image.webp')).toBe('photo');
312
+ expect(detectMediaType('image.bmp')).toBe('photo');
313
+ expect(detectMediaType('image.svg')).toBe('photo');
314
+ });
315
+ it('should detect video files', () => {
316
+ expect(detectMediaType('clip.mp4')).toBe('video');
317
+ expect(detectMediaType('clip.mov')).toBe('video');
318
+ expect(detectMediaType('clip.avi')).toBe('video');
319
+ expect(detectMediaType('clip.webm')).toBe('video');
320
+ expect(detectMediaType('clip.mkv')).toBe('video');
321
+ });
322
+ it('should detect audio files', () => {
323
+ expect(detectMediaType('sound.mp3')).toBe('audio');
324
+ expect(detectMediaType('sound.wav')).toBe('audio');
325
+ expect(detectMediaType('sound.ogg')).toBe('audio');
326
+ expect(detectMediaType('sound.m4a')).toBe('audio');
327
+ expect(detectMediaType('sound.flac')).toBe('audio');
328
+ });
329
+ it('should default to document for unknown extensions', () => {
330
+ expect(detectMediaType('file.pdf')).toBe('document');
331
+ expect(detectMediaType('file.txt')).toBe('document');
332
+ expect(detectMediaType('file.zip')).toBe('document');
333
+ expect(detectMediaType('file.xyz')).toBe('document');
334
+ expect(detectMediaType('file')).toBe('document');
335
+ });
336
+ });
337
+ describe('MIME Type Detection', () => {
338
+ const detectMimeType = (filePath) => {
339
+ const ext = filePath.split('.').pop()?.toLowerCase();
340
+ const mimeMap = {
341
+ jpg: 'image/jpeg',
342
+ jpeg: 'image/jpeg',
343
+ png: 'image/png',
344
+ gif: 'image/gif',
345
+ webp: 'image/webp',
346
+ bmp: 'image/bmp',
347
+ svg: 'image/svg+xml',
348
+ mp4: 'video/mp4',
349
+ mov: 'video/quicktime',
350
+ avi: 'video/x-msvideo',
351
+ webm: 'video/webm',
352
+ mp3: 'audio/mpeg',
353
+ wav: 'audio/wav',
354
+ ogg: 'audio/ogg',
355
+ m4a: 'audio/mp4',
356
+ flac: 'audio/flac',
357
+ pdf: 'application/pdf',
358
+ doc: 'application/msword',
359
+ docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
360
+ txt: 'text/plain',
361
+ zip: 'application/zip',
362
+ };
363
+ return mimeMap[ext || ''] || 'application/octet-stream';
364
+ };
365
+ it('should return correct MIME type for images', () => {
366
+ expect(detectMimeType('photo.jpg')).toBe('image/jpeg');
367
+ expect(detectMimeType('photo.png')).toBe('image/png');
368
+ expect(detectMimeType('photo.gif')).toBe('image/gif');
369
+ expect(detectMimeType('photo.webp')).toBe('image/webp');
370
+ expect(detectMimeType('photo.svg')).toBe('image/svg+xml');
371
+ });
372
+ it('should return correct MIME type for documents', () => {
373
+ expect(detectMimeType('doc.pdf')).toBe('application/pdf');
374
+ expect(detectMimeType('doc.doc')).toBe('application/msword');
375
+ expect(detectMimeType('doc.docx')).toBe('application/vnd.openxmlformats-officedocument.wordprocessingml.document');
376
+ expect(detectMimeType('doc.txt')).toBe('text/plain');
377
+ expect(detectMimeType('doc.zip')).toBe('application/zip');
378
+ });
379
+ it('should return octet-stream for unknown types', () => {
380
+ expect(detectMimeType('file.xyz')).toBe('application/octet-stream');
381
+ expect(detectMimeType('file')).toBe('application/octet-stream');
382
+ });
383
+ });
384
+ });
385
+ //# sourceMappingURL=media-processing.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-processing.test.js","sourceRoot":"","sources":["../../../src/agent/__tests__/media-processing.test.ts"],"names":[],"mappings":"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"}
@@ -54,14 +54,18 @@ describe('FailoverError', () => {
54
54
  });
55
55
  describe('resolveFallbackCandidates', () => {
56
56
  it('returns single candidate with no config', () => {
57
- const candidates = resolveFallbackCandidates({ cfg: undefined, provider: 'anthropic', model: 'claude-sonnet-4-5' });
57
+ // With no config and no API keys in env, no candidates should be returned
58
+ const candidates = resolveFallbackCandidates({ cfg: {}, provider: 'anthropic', model: 'claude-sonnet-4-5' });
58
59
  expect(candidates).toEqual([]);
59
60
  });
60
61
  it('includes fallbacks from config', () => {
61
62
  const candidates = resolveFallbackCandidates({
62
63
  cfg: {
63
64
  agents: { defaults: { model: { primary: 'anthropic/claude-sonnet-4-5', fallbacks: ['openai/gpt-4o'] } } },
64
- providers: { anthropic: { apiKey: 'test-key' }, openai: { apiKey: 'test-key' } },
65
+ providers: {
66
+ anthropic: 'test-key',
67
+ openai: 'test-key',
68
+ },
65
69
  },
66
70
  provider: 'anthropic',
67
71
  model: 'claude-sonnet-4-5',
@@ -73,7 +77,10 @@ describe('resolveFallbackCandidates', () => {
73
77
  const candidates = resolveFallbackCandidates({
74
78
  cfg: {
75
79
  agents: { defaults: { model: { primary: 'anthropic/claude-sonnet-4-5', fallbacks: ['openai/gpt-4o'] } } },
76
- providers: { anthropic: { apiKey: 'test-key' }, minimax: { apiKey: 'test-key' } },
80
+ providers: {
81
+ anthropic: 'test-key',
82
+ minimax: 'test-key',
83
+ },
77
84
  },
78
85
  provider: 'anthropic',
79
86
  model: 'claude-sonnet-4-5',
@@ -86,7 +93,9 @@ describe('resolveFallbackCandidates', () => {
86
93
  const candidates = resolveFallbackCandidates({
87
94
  cfg: {
88
95
  agents: { defaults: { model: { primary: 'anthropic/claude-sonnet-4-5', fallbacks: ['anthropic/claude-sonnet-4-5'] } } },
89
- providers: { anthropic: { apiKey: 'test-key' } },
96
+ providers: {
97
+ anthropic: 'test-key',
98
+ },
90
99
  },
91
100
  provider: 'anthropic',
92
101
  model: 'claude-sonnet-4-5',
@@ -98,7 +107,9 @@ describe('resolveFallbackCandidates', () => {
98
107
  const candidates = resolveFallbackCandidates({
99
108
  cfg: {
100
109
  agents: { defaults: { model: { primary: 'anthropic/claude-sonnet-4-5', fallbacks: ['openai/gpt-4o', 'unconfigured/model'] } } },
101
- providers: { anthropic: { apiKey: 'test-key' } }, // openai not configured
110
+ providers: {
111
+ anthropic: 'test-key',
112
+ },
102
113
  },
103
114
  provider: 'anthropic',
104
115
  model: 'claude-sonnet-4-5',
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/agent/fallback/__tests__/index.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/agent/fallback/__tests__/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { Config } from '../../config/schema.js';
2
+ import { isProviderConfigured } from '../../config/schema.js';
2
3
  export interface ModelCandidate {
3
4
  provider: string;
4
5
  model: string;
@@ -11,10 +12,7 @@ export interface FallbackAttempt {
11
12
  status?: number;
12
13
  code?: string;
13
14
  }
14
- /**
15
- * Check if a provider is configured (has API key or is enabled for local providers)
16
- */
17
- export declare function isProviderConfigured(cfg: Config | undefined, provider: string): boolean;
15
+ export { isProviderConfigured };
18
16
  export declare function resolveFallbackCandidates(params: {
19
17
  cfg: Config | undefined;
20
18
  provider: string;