@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
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Send Media Tool Tests
3
+ *
4
+ * Tests for send_media tool functionality.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { readFile } from 'fs/promises';
8
+ // Mock fs/promises
9
+ vi.mock('fs/promises', () => ({
10
+ readFile: vi.fn(),
11
+ }));
12
+ describe('SendMediaTool', () => {
13
+ const mockReadFile = readFile;
14
+ beforeEach(() => {
15
+ mockReadFile.mockClear();
16
+ });
17
+ afterEach(() => {
18
+ vi.restoreAllMocks();
19
+ });
20
+ describe('SendMediaSchema', () => {
21
+ it('should validate required parameters', () => {
22
+ const params = {
23
+ filePath: '/path/to/image.jpg',
24
+ };
25
+ expect(params.filePath).toBeDefined();
26
+ expect(params.filePath).toBe('/path/to/image.jpg');
27
+ });
28
+ it('should accept optional parameters', () => {
29
+ const params = {
30
+ filePath: '/path/to/video.mp4',
31
+ mediaType: 'video',
32
+ caption: 'Check out this video!',
33
+ };
34
+ expect(params.filePath).toBe('/path/to/video.mp4');
35
+ expect(params.mediaType).toBe('video');
36
+ expect(params.caption).toBe('Check out this video!');
37
+ });
38
+ it('should handle media type enum values', () => {
39
+ const validTypes = ['photo', 'video', 'audio', 'document'];
40
+ validTypes.forEach(type => {
41
+ const params = { filePath: '/test/file', mediaType: type };
42
+ expect(params.mediaType).toBe(type);
43
+ });
44
+ });
45
+ });
46
+ describe('Media Type Detection', () => {
47
+ const detectMediaType = (filePath) => {
48
+ const ext = filePath.split('.').pop()?.toLowerCase();
49
+ const imageExts = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg'];
50
+ const videoExts = ['mp4', 'mov', 'avi', 'webm', 'mkv'];
51
+ const audioExts = ['mp3', 'wav', 'ogg', 'm4a', 'flac'];
52
+ if (imageExts.includes(ext || ''))
53
+ return 'photo';
54
+ if (videoExts.includes(ext || ''))
55
+ return 'video';
56
+ if (audioExts.includes(ext || ''))
57
+ return 'audio';
58
+ return 'document';
59
+ };
60
+ it('should auto-detect image files', () => {
61
+ expect(detectMediaType('/path/to/photo.jpg')).toBe('photo');
62
+ expect(detectMediaType('/path/to/photo.png')).toBe('photo');
63
+ expect(detectMediaType('/path/to/image.gif')).toBe('photo');
64
+ });
65
+ it('should auto-detect video files', () => {
66
+ expect(detectMediaType('/path/to/video.mp4')).toBe('video');
67
+ expect(detectMediaType('/path/to/clip.mov')).toBe('video');
68
+ });
69
+ it('should auto-detect audio files', () => {
70
+ expect(detectMediaType('/path/to/audio.mp3')).toBe('audio');
71
+ expect(detectMediaType('/path/to/sound.wav')).toBe('audio');
72
+ });
73
+ it('should default to document for unknown types', () => {
74
+ expect(detectMediaType('/path/to/file.pdf')).toBe('document');
75
+ expect(detectMediaType('/path/to/file.txt')).toBe('document');
76
+ expect(detectMediaType('/path/to/file')).toBe('document');
77
+ });
78
+ });
79
+ describe('MIME Type Detection', () => {
80
+ const detectMimeType = (filePath) => {
81
+ const ext = filePath.split('.').pop()?.toLowerCase();
82
+ const mimeMap = {
83
+ jpg: 'image/jpeg',
84
+ jpeg: 'image/jpeg',
85
+ png: 'image/png',
86
+ gif: 'image/gif',
87
+ webp: 'image/webp',
88
+ bmp: 'image/bmp',
89
+ svg: 'image/svg+xml',
90
+ mp4: 'video/mp4',
91
+ mov: 'video/quicktime',
92
+ avi: 'video/x-msvideo',
93
+ webm: 'video/webm',
94
+ mp3: 'audio/mpeg',
95
+ wav: 'audio/wav',
96
+ ogg: 'audio/ogg',
97
+ m4a: 'audio/mp4',
98
+ flac: 'audio/flac',
99
+ pdf: 'application/pdf',
100
+ doc: 'application/msword',
101
+ docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
102
+ txt: 'text/plain',
103
+ zip: 'application/zip',
104
+ };
105
+ return mimeMap[ext || ''] || 'application/octet-stream';
106
+ };
107
+ it('should detect image MIME types', () => {
108
+ expect(detectMimeType('image.jpg')).toBe('image/jpeg');
109
+ expect(detectMimeType('image.png')).toBe('image/png');
110
+ expect(detectMimeType('image.gif')).toBe('image/gif');
111
+ expect(detectMimeType('image.webp')).toBe('image/webp');
112
+ });
113
+ it('should detect video MIME types', () => {
114
+ expect(detectMimeType('video.mp4')).toBe('video/mp4');
115
+ expect(detectMimeType('video.mov')).toBe('video/quicktime');
116
+ });
117
+ it('should detect audio MIME types', () => {
118
+ expect(detectMimeType('audio.mp3')).toBe('audio/mpeg');
119
+ expect(detectMimeType('audio.wav')).toBe('audio/wav');
120
+ });
121
+ it('should detect document MIME types', () => {
122
+ expect(detectMimeType('doc.pdf')).toBe('application/pdf');
123
+ expect(detectMimeType('doc.docx')).toBe('application/vnd.openxmlformats-officedocument.wordprocessingml.document');
124
+ });
125
+ });
126
+ describe('File Reading and Conversion', () => {
127
+ it('should read file and convert to base64', async () => {
128
+ const mockBuffer = Buffer.from('Hello World');
129
+ mockReadFile.mockResolvedValue(mockBuffer);
130
+ const filePath = '/test/image.jpg';
131
+ const fileBuffer = await readFile(filePath);
132
+ const base64 = fileBuffer.toString('base64');
133
+ expect(mockReadFile).toHaveBeenCalledWith(filePath);
134
+ expect(base64).toBe('SGVsbG8gV29ybGQ=');
135
+ });
136
+ it('should handle file read errors', async () => {
137
+ mockReadFile.mockRejectedValue(new Error('ENOENT: file not found'));
138
+ try {
139
+ await readFile('/nonexistent/file.jpg');
140
+ expect.fail('Should have thrown error');
141
+ }
142
+ catch (error) {
143
+ expect(error).toBeInstanceOf(Error);
144
+ expect(error.message).toContain('ENOENT');
145
+ }
146
+ });
147
+ it('should create data URL from file', async () => {
148
+ const mockBuffer = Buffer.from([0xFF, 0xD8, 0xFF, 0xE0]); // JPEG magic bytes
149
+ mockReadFile.mockResolvedValue(mockBuffer);
150
+ const filePath = '/test/image.jpg';
151
+ const fileBuffer = await readFile(filePath);
152
+ const base64 = fileBuffer.toString('base64');
153
+ const mimeType = 'image/jpeg';
154
+ const dataUrl = `data:${mimeType};base64,${base64}`;
155
+ expect(dataUrl).toBe('data:image/jpeg;base64,/9j/4A==');
156
+ });
157
+ });
158
+ describe('OutboundMessage Construction', () => {
159
+ it('should create OutboundMessage with media', () => {
160
+ const dataUrl = 'data:image/jpeg;base64,/9j/4AA=';
161
+ const caption = 'Test caption';
162
+ const msg = {
163
+ channel: 'telegram',
164
+ chat_id: '123456',
165
+ content: caption,
166
+ mediaUrl: dataUrl,
167
+ mediaType: 'photo',
168
+ };
169
+ expect(msg.mediaUrl).toBe(dataUrl);
170
+ expect(msg.mediaType).toBe('photo');
171
+ expect(msg.content).toBe(caption);
172
+ });
173
+ it('should handle message without caption', () => {
174
+ const msg = {
175
+ channel: 'telegram',
176
+ chat_id: '123456',
177
+ content: '',
178
+ mediaUrl: 'data:image/png;base64,abc123',
179
+ mediaType: 'photo',
180
+ };
181
+ expect(msg.content).toBe('');
182
+ expect(msg.mediaUrl).toBeDefined();
183
+ });
184
+ });
185
+ describe('Tool Execution Result', () => {
186
+ it('should return success result', async () => {
187
+ const mockBuffer = Buffer.from('test data');
188
+ mockReadFile.mockResolvedValue(mockBuffer);
189
+ const filePath = '/test/success.jpg';
190
+ const fileName = filePath.split('/').pop() || filePath;
191
+ await readFile(filePath);
192
+ const result = {
193
+ content: [{ type: 'text', text: `✅ Media sent: ${fileName} (photo)` }],
194
+ details: { filePath, mediaType: 'photo' },
195
+ };
196
+ expect(result.content[0].text).toContain('✅ Media sent');
197
+ expect(result.content[0].text).toContain('success.jpg');
198
+ expect(result.content[0].text).toContain('photo');
199
+ });
200
+ it('should return error result on failure', () => {
201
+ const errorMessage = 'Error sending media: ENOENT: no such file';
202
+ const result = {
203
+ content: [{ type: 'text', text: errorMessage }],
204
+ details: { error: errorMessage },
205
+ };
206
+ expect(result.content[0].text).toContain('Error sending media');
207
+ });
208
+ });
209
+ describe('Context Validation', () => {
210
+ it('should error when no active context', () => {
211
+ const ctx = null;
212
+ if (!ctx) {
213
+ const result = {
214
+ content: [{ type: 'text', text: 'Error: No active conversation context' }],
215
+ details: {},
216
+ };
217
+ expect(result.content[0].text).toContain('No active conversation context');
218
+ }
219
+ });
220
+ it('should proceed when context is available', () => {
221
+ const ctx = {
222
+ channel: 'telegram',
223
+ chatId: '123456',
224
+ };
225
+ expect(ctx).not.toBeNull();
226
+ expect(ctx.channel).toBe('telegram');
227
+ expect(ctx.chatId).toBe('123456');
228
+ });
229
+ });
230
+ describe('File Name Extraction', () => {
231
+ it('should extract file name from path', () => {
232
+ const testCases = [
233
+ { path: '/path/to/file.jpg', expected: 'file.jpg' },
234
+ { path: '/home/user/documents/report.pdf', expected: 'report.pdf' },
235
+ { path: 'relative/path/image.png', expected: 'image.png' },
236
+ { path: 'simple.txt', expected: 'simple.txt' },
237
+ ];
238
+ testCases.forEach(({ path, expected }) => {
239
+ const fileName = path.split('/').pop() || path;
240
+ expect(fileName).toBe(expected);
241
+ });
242
+ });
243
+ it('should handle edge cases', () => {
244
+ const path1 = '/'; // root
245
+ const path2 = ''; // empty
246
+ expect(path1.split('/').pop()).toBe('');
247
+ expect(path2.split('/').pop()).toBe('');
248
+ });
249
+ });
250
+ });
251
+ //# sourceMappingURL=send-media.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-media.test.js","sourceRoot":"","sources":["../../../../src/agent/tools/__tests__/send-media.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,mBAAmB;AACnB,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;CAClB,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,YAAY,GAAG,QAA+C,CAAC;IAErE,UAAU,CAAC,GAAG,EAAE;QACd,YAAY,CAAC,SAAS,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG;gBACb,QAAQ,EAAE,oBAAoB;aAC/B,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAG;gBACb,QAAQ,EAAE,oBAAoB;gBAC9B,SAAS,EAAE,OAAgB;gBAC3B,OAAO,EAAE,uBAAuB;aACjC,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;YAEpE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACxB,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC3D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAA4C,EAAE;YACrF,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAEvD,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;gBAAE,OAAO,OAAO,CAAC;YAClD,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;gBAAE,OAAO,OAAO,CAAC;YAClD,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;gBAAE,OAAO,OAAO,CAAC;YAClD,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC;QAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9D,MAAM,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9D,MAAM,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAU,EAAE;YAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;YACrD,MAAM,OAAO,GAA2B;gBACtC,GAAG,EAAE,YAAY;gBACjB,IAAI,EAAE,YAAY;gBAClB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,WAAW;gBAChB,IAAI,EAAE,YAAY;gBAClB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,eAAe;gBACpB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,iBAAiB;gBACtB,GAAG,EAAE,iBAAiB;gBACtB,IAAI,EAAE,YAAY;gBAClB,GAAG,EAAE,YAAY;gBACjB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,WAAW;gBAChB,IAAI,EAAE,YAAY;gBAClB,GAAG,EAAE,iBAAiB;gBACtB,GAAG,EAAE,oBAAoB;gBACzB,IAAI,EAAE,yEAAyE;gBAC/E,GAAG,EAAE,YAAY;gBACjB,GAAG,EAAE,iBAAiB;aACvB,CAAC;YACF,OAAO,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,0BAA0B,CAAC;QAC1D,CAAC,CAAC;QAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QACrH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACnC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAE7C,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,YAAY,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAEpE,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,mBAAmB;YAC7E,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACnC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC9B,MAAM,OAAO,GAAG,QAAQ,QAAQ,WAAW,MAAM,EAAE,CAAC;YAEpD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAAG,iCAAiC,CAAC;YAClD,MAAM,OAAO,GAAG,cAAc,CAAC;YAE/B,MAAM,GAAG,GAAG;gBACV,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,QAAQ;gBACjB,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,OAAO;aACnB,CAAC;YAEF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,GAAG,GAAG;gBACV,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,QAAQ;gBACjB,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,8BAA8B;gBACxC,SAAS,EAAE,OAAO;aACnB,CAAC;YAEF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5C,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;YAEvD,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEzB,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,QAAQ,UAAU,EAAE,CAAC;gBACtE,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE;aAC1C,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,YAAY,GAAG,2CAA2C,CAAC;YAEjE,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBAC/C,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;aACjC,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC;YAEjB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,MAAM,GAAG;oBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC;oBAC1E,OAAO,EAAE,EAAE;iBACZ,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,GAAG,GAAG;gBACV,OAAO,EAAE,UAAU;gBACnB,MAAM,EAAE,QAAQ;aACjB,CAAC;YAEF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,SAAS,GAAG;gBAChB,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE;gBACnD,EAAE,IAAI,EAAE,iCAAiC,EAAE,QAAQ,EAAE,YAAY,EAAE;gBACnE,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,WAAW,EAAE;gBAC1D,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE;aAC/C,CAAC;YAEF,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;gBAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO;YAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,QAAQ;YAE1B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Agent Defaults Types
3
+ */
4
+ export type ModelRef = string;
5
+ export interface ModelEntry {
6
+ alias?: string;
7
+ params?: Record<string, unknown>;
8
+ }
9
+ export type ModelList = Record<string, ModelEntry | undefined>;
10
+ export type ContextPruningMode = 'off' | 'eager' | 'lazy' | 'cache-ttl';
11
+ export interface ContextPruningConfig {
12
+ mode?: ContextPruningMode;
13
+ ttl?: string;
14
+ eagerMaxTokens?: number;
15
+ eagerThreshold?: number;
16
+ eagerKeepAtLeast?: number;
17
+ eagerKeepAtMost?: number;
18
+ }
19
+ export interface HeartbeatConfig {
20
+ every?: string;
21
+ enabled?: boolean;
22
+ target?: string;
23
+ on?: string[];
24
+ }
25
+ export type CompactionMode = 'off' | 'eager' | 'lazy' | 'safeguard';
26
+ export interface CompactionConfig {
27
+ mode?: CompactionMode;
28
+ eagerThreshold?: number;
29
+ eagerKeepAtLeast?: number;
30
+ eagerKeepAtMost?: number;
31
+ }
32
+ export interface AgentConcurrencyConfig {
33
+ maxConcurrent?: number;
34
+ }
35
+ export interface AgentDefaults {
36
+ model?: ModelRef | {
37
+ primary?: ModelRef;
38
+ fallbacks?: ModelRef[];
39
+ };
40
+ models?: ModelList;
41
+ maxConcurrent?: number;
42
+ subagents?: AgentConcurrencyConfig;
43
+ contextPruning?: ContextPruningConfig;
44
+ heartbeat?: HeartbeatConfig;
45
+ compaction?: CompactionConfig;
46
+ temperature?: number;
47
+ maxTokens?: number;
48
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Agent Defaults Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.agent-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.agent-defaults.js","sourceRoot":"","sources":["../../src/agent/types.agent-defaults.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,8 +1,16 @@
1
- import type { AgentMessage as BaseAgentMessage } from '@mariozechner/pi-agent-core';
2
- export type { BaseAgentMessage };
1
+ /**
2
+ * Agent Types
3
+ *
4
+ * Core type definitions for agent configuration
5
+ */
6
+ import type { AgentDefaults } from './types.agent-defaults.js';
3
7
  export interface AgentConfig {
4
- workspace: string;
5
- model?: string;
6
- systemPrompt?: string;
8
+ defaults?: AgentDefaults;
9
+ list?: Record<string, AgentDefaults>;
10
+ }
11
+ export interface AgentRuntimeState {
12
+ sessionKey: string;
13
+ currentModel?: string;
14
+ messageCount: number;
15
+ lastActivity: number;
7
16
  }
8
- export type { AgentMessage } from '@mariozechner/pi-agent-core';
@@ -1,2 +1,7 @@
1
+ /**
2
+ * Agent Types
3
+ *
4
+ * Core type definitions for agent configuration
5
+ */
1
6
  export {};
2
7
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Workspace Management - Core bootstrap file handling
3
+ *
4
+ * Workspace architecture for xopcbot:
5
+ * - Default filenames constants
6
+ * - File caching with mtime invalidation
7
+ * - Template loading and seeding
8
+ * - Bootstrap file loading with filtering
9
+ */
10
+ export declare const DEFAULT_AGENTS_FILENAME = "AGENTS.md";
11
+ export declare const DEFAULT_SOUL_FILENAME = "SOUL.md";
12
+ export declare const DEFAULT_TOOLS_FILENAME = "TOOLS.md";
13
+ export declare const DEFAULT_IDENTITY_FILENAME = "IDENTITY.md";
14
+ export declare const DEFAULT_USER_FILENAME = "USER.md";
15
+ export declare const DEFAULT_HEARTBEAT_FILENAME = "HEARTBEAT.md";
16
+ export declare const DEFAULT_BOOTSTRAP_FILENAME = "BOOTSTRAP.md";
17
+ export declare const DEFAULT_MEMORY_FILENAME = "MEMORY.md";
18
+ export declare const DEFAULT_MEMORY_ALT_FILENAME = "memory.md";
19
+ export declare const DEFAULT_WORKSPACE_STATE_DIR = ".xopcbot";
20
+ export declare const DEFAULT_WORKSPACE_STATE_FILE = "workspace-state.json";
21
+ export type WorkspaceBootstrapFileName = typeof DEFAULT_AGENTS_FILENAME | typeof DEFAULT_SOUL_FILENAME | typeof DEFAULT_TOOLS_FILENAME | typeof DEFAULT_IDENTITY_FILENAME | typeof DEFAULT_USER_FILENAME | typeof DEFAULT_HEARTBEAT_FILENAME | typeof DEFAULT_BOOTSTRAP_FILENAME | typeof DEFAULT_MEMORY_FILENAME | typeof DEFAULT_MEMORY_ALT_FILENAME;
22
+ export interface WorkspaceBootstrapFile {
23
+ name: WorkspaceBootstrapFileName;
24
+ path: string;
25
+ content?: string;
26
+ missing: boolean;
27
+ }
28
+ export interface WorkspaceBootstrapOptions {
29
+ ensureBootstrapFiles?: boolean;
30
+ templateDir?: string;
31
+ }
32
+ export interface WorkspaceOnboardingState {
33
+ version: number;
34
+ bootstrapSeededAt?: string;
35
+ onboardingCompletedAt?: string;
36
+ }
37
+ export declare function isValidBootstrapFileName(name: string): boolean;
38
+ /**
39
+ * Read file with caching based on mtime. Returns cached content if file
40
+ * hasn't changed, otherwise reads from disk and updates cache.
41
+ *
42
+ * Performance optimization approach.
43
+ */
44
+ export declare function readFileWithCache(filePath: string): Promise<string>;
45
+ /**
46
+ * Invalidate cache for a specific file
47
+ */
48
+ export declare function invalidateCache(filePath: string): void;
49
+ /**
50
+ * Clear entire workspace file cache
51
+ */
52
+ export declare function clearWorkspaceCache(): void;
53
+ /**
54
+ * Check if file exists
55
+ */
56
+ export declare function fileExists(filePath: string): Promise<boolean>;
57
+ /**
58
+ * Strip YAML front matter from markdown content.
59
+ * Removes the --- header if present.
60
+ */
61
+ export declare function stripFrontMatter(content: string): string;
62
+ /**
63
+ * Load workspace template from bundled templates
64
+ */
65
+ export declare function loadTemplate(name: string): Promise<string>;
66
+ export declare function isWorkspaceOnboardingCompleted(dir: string): Promise<boolean>;
67
+ /**
68
+ * Ensure workspace directory exists
69
+ */
70
+ export declare function ensureWorkspaceDir(dir: string): Promise<string>;
71
+ /**
72
+ * Ensure workspace has bootstrap files, seeding from templates if needed
73
+ */
74
+ export declare function ensureBootstrapFiles(dir: string, options?: WorkspaceBootstrapOptions): Promise<{
75
+ dir: string;
76
+ agentsPath?: string;
77
+ soulPath?: string;
78
+ toolsPath?: string;
79
+ identityPath?: string;
80
+ userPath?: string;
81
+ heartbeatPath?: string;
82
+ bootstrapPath?: string;
83
+ memoryPath?: string;
84
+ }>;
85
+ /**
86
+ * Load all workspace bootstrap files
87
+ */
88
+ export declare function loadWorkspaceBootstrapFiles(dir: string): Promise<WorkspaceBootstrapFile[]>;
89
+ /**
90
+ * Filter bootstrap files for session type (subagent/cron vs main)
91
+ *
92
+ * Subagents and cron jobs only get minimal files for security
93
+ */
94
+ export declare function filterBootstrapFilesForSession(files: WorkspaceBootstrapFile[], isSubagentOrCron: boolean): WorkspaceBootstrapFile[];