@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.
- package/README.md +57 -52
- package/README.zh-CN.md +56 -49
- package/dist/agent/__tests__/media-processing.test.d.ts +6 -0
- package/dist/agent/__tests__/media-processing.test.js +385 -0
- package/dist/agent/__tests__/media-processing.test.js.map +1 -0
- package/dist/agent/fallback/__tests__/index.test.js +16 -5
- package/dist/agent/fallback/__tests__/index.test.js.map +1 -1
- package/dist/agent/fallback/candidates.d.ts +2 -4
- package/dist/agent/fallback/candidates.js +19 -26
- package/dist/agent/fallback/candidates.js.map +1 -1
- package/dist/agent/helpers.d.ts +1 -0
- package/dist/agent/helpers.js.map +1 -1
- package/dist/agent/index.d.ts +6 -1
- package/dist/agent/index.js +10 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/models/compat.d.ts +35 -0
- package/dist/agent/models/compat.js +110 -0
- package/dist/agent/models/compat.js.map +1 -0
- package/dist/agent/models/fallback.d.ts +38 -0
- package/dist/agent/models/fallback.js +133 -0
- package/dist/agent/models/fallback.js.map +1 -0
- package/dist/agent/models/index.d.ts +10 -0
- package/dist/agent/models/index.js +11 -0
- package/dist/agent/models/index.js.map +1 -0
- package/dist/agent/{model-manager.d.ts → models/manager.d.ts} +2 -8
- package/dist/agent/{model-manager.js → models/manager.js} +38 -24
- package/dist/agent/models/manager.js.map +1 -0
- package/dist/agent/models/scan.d.ts +46 -0
- package/dist/agent/models/scan.js +177 -0
- package/dist/agent/models/scan.js.map +1 -0
- package/dist/agent/models/selection.d.ts +44 -0
- package/dist/agent/models/selection.js +141 -0
- package/dist/agent/models/selection.js.map +1 -0
- package/dist/agent/prompt/index.js +1 -1
- package/dist/agent/prompt/index.js.map +1 -1
- package/dist/agent/service.js +34 -16
- package/dist/agent/service.js.map +1 -1
- package/dist/agent/skills/__tests__/test-framework.test.js +15 -7
- package/dist/agent/skills/__tests__/test-framework.test.js.map +1 -1
- package/dist/agent/skills/config.d.ts +1 -1
- package/dist/agent/skills/config.js +2 -2
- package/dist/agent/skills/config.js.map +1 -1
- package/dist/agent/skills/index.js +15 -28
- package/dist/agent/skills/index.js.map +1 -1
- package/dist/agent/skills/installer.d.ts +1 -1
- package/dist/agent/skills/installer.js +1 -1
- package/dist/agent/skills/scanner.d.ts +1 -1
- package/dist/agent/skills/scanner.js +1 -1
- package/dist/agent/skills/test-framework.js +24 -23
- package/dist/agent/skills/test-framework.js.map +1 -1
- package/dist/agent/skills/types.d.ts +3 -3
- package/dist/agent/skills/types.js +1 -1
- package/dist/agent/skills/watcher.d.ts +1 -1
- package/dist/agent/skills/watcher.js +1 -1
- package/dist/agent/system-prompt.d.ts +67 -0
- package/dist/agent/system-prompt.js +351 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/tools/__tests__/send-media.test.d.ts +6 -0
- package/dist/agent/tools/__tests__/send-media.test.js +251 -0
- package/dist/agent/tools/__tests__/send-media.test.js.map +1 -0
- package/dist/agent/types.agent-defaults.d.ts +48 -0
- package/dist/agent/types.agent-defaults.js +5 -0
- package/dist/agent/types.agent-defaults.js.map +1 -0
- package/dist/agent/types.d.ts +14 -6
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/workspace.d.ts +94 -0
- package/dist/agent/workspace.js +625 -0
- package/dist/agent/workspace.js.map +1 -0
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth/index.d.ts +1 -0
- package/dist/auth/oauth/index.js +1 -0
- package/dist/auth/oauth/index.js.map +1 -1
- package/dist/auth/oauth/kimi.d.ts +2 -1
- package/dist/auth/oauth/kimi.js +51 -48
- package/dist/auth/oauth/kimi.js.map +1 -1
- package/dist/auth/oauth/minimax-cn.d.ts +12 -0
- package/dist/auth/oauth/minimax-cn.js +111 -0
- package/dist/auth/oauth/minimax-cn.js.map +1 -0
- package/dist/auth/oauth/qwen.d.ts +5 -0
- package/dist/auth/oauth/qwen.js +54 -84
- package/dist/auth/oauth/qwen.js.map +1 -1
- package/dist/auth/profiles/index.d.ts +0 -2
- package/dist/auth/profiles/index.js +0 -2
- package/dist/auth/profiles/index.js.map +1 -1
- package/dist/auth/storage.js +7 -1
- package/dist/auth/storage.js.map +1 -1
- package/dist/channels/__tests__/media-integration.test.d.ts +6 -0
- package/dist/channels/__tests__/media-integration.test.js +398 -0
- package/dist/channels/__tests__/media-integration.test.js.map +1 -0
- package/dist/channels/__tests__/media.test.d.ts +6 -0
- package/dist/channels/__tests__/media.test.js +251 -0
- package/dist/channels/__tests__/media.test.js.map +1 -0
- package/dist/channels/access-control.d.ts +1 -1
- package/dist/channels/access-control.js +1 -1
- package/dist/channels/draft-stream.d.ts +1 -1
- package/dist/channels/draft-stream.js +1 -1
- package/dist/channels/format.d.ts +1 -1
- package/dist/channels/format.js +1 -1
- package/dist/channels/telegram/command-handler.js +15 -48
- package/dist/channels/telegram/command-handler.js.map +1 -1
- package/dist/channels/telegram/plugin.js +3 -2
- package/dist/channels/telegram/plugin.js.map +1 -1
- package/dist/channels/telegram/webhook.d.ts +1 -1
- package/dist/channels/telegram/webhook.js +1 -1
- package/dist/channels/types.d.ts +1 -1
- package/dist/channels/types.js +1 -1
- package/dist/channels/update-offset-store.d.ts +1 -1
- package/dist/channels/update-offset-store.js +1 -1
- package/dist/cli/commands/auth.js +8 -23
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/gateway.js +9 -1
- package/dist/cli/commands/gateway.js.map +1 -1
- package/dist/cli/commands/models.js +35 -29
- package/dist/cli/commands/models.js.map +1 -1
- package/dist/cli/commands/onboard.js +166 -115
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/setup.js +123 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/templates.d.ts +2 -0
- package/dist/cli/templates.js +1 -1
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/defaults.d.ts +19 -0
- package/dist/config/defaults.js +168 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/integration.d.ts +12 -0
- package/dist/config/integration.js +14 -0
- package/dist/config/integration.js.map +1 -0
- package/dist/config/models-json.d.ts +454 -0
- package/dist/config/models-json.js +323 -0
- package/dist/config/models-json.js.map +1 -0
- package/dist/config/paths.d.ts +2 -0
- package/dist/config/paths.js +4 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/reload.d.ts +1 -1
- package/dist/config/reload.js +3 -3
- package/dist/config/reload.js.map +1 -1
- package/dist/config/resolve-config-value.d.ts +36 -0
- package/dist/config/resolve-config-value.js +218 -0
- package/dist/config/resolve-config-value.js.map +1 -0
- package/dist/config/rules.js +3 -2
- package/dist/config/rules.js.map +1 -1
- package/dist/config/schema.d.ts +17 -884
- package/dist/config/schema.js +36 -312
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.models.d.ts +54 -0
- package/dist/config/types.models.js +2 -0
- package/dist/config/types.models.js.map +1 -0
- package/dist/cron/validation.d.ts +4 -4
- package/dist/gateway/hono/app.js +232 -78
- package/dist/gateway/hono/app.js.map +1 -1
- package/dist/gateway/hono/oauth-async.d.ts +14 -0
- package/dist/gateway/hono/oauth-async.js +285 -0
- package/dist/gateway/hono/oauth-async.js.map +1 -0
- package/dist/gateway/hono/oauth.d.ts +9 -0
- package/dist/gateway/hono/oauth.js +157 -0
- package/dist/gateway/hono/oauth.js.map +1 -0
- package/dist/gateway/hono/sse.js +5 -2
- package/dist/gateway/hono/sse.js.map +1 -1
- package/dist/gateway/process-manager.js +12 -10
- package/dist/gateway/process-manager.js.map +1 -1
- package/dist/gateway/service.d.ts +6 -2
- package/dist/gateway/service.js +20 -6
- package/dist/gateway/service.js.map +1 -1
- package/dist/gateway/static/root/assets/flow-BqIEBwW6.js +2 -0
- package/dist/gateway/static/root/assets/flow-BqIEBwW6.js.map +1 -0
- package/dist/gateway/static/root/assets/main-Br2tw-87.js +5168 -0
- package/dist/gateway/static/root/assets/main-Br2tw-87.js.map +1 -0
- package/dist/gateway/static/root/assets/main-DwlbPf8Z.css +1 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/plugins/index.d.ts +0 -2
- package/dist/plugins/index.js +0 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/types.d.ts +0 -2
- package/dist/plugins/types.js +0 -2
- package/dist/plugins/types.js.map +1 -1
- package/dist/providers/index.d.ts +50 -22
- package/dist/providers/index.js +276 -50
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/model-registry.d.ts +84 -0
- package/dist/providers/model-registry.js +385 -0
- package/dist/providers/model-registry.js.map +1 -0
- package/dist/types/providers.d.ts +2 -63
- package/dist/types/providers.js +1 -1
- package/dist/utils/__tests__/frontmatter.test.d.ts +4 -0
- package/dist/utils/__tests__/frontmatter.test.js +150 -0
- package/dist/utils/__tests__/frontmatter.test.js.map +1 -0
- package/dist/utils/diagnostic-events.d.ts +230 -0
- package/dist/utils/diagnostic-events.js +189 -0
- package/dist/utils/diagnostic-events.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +0 -1
- package/dist/utils/frontmatter.js +15 -79
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/log-stream.d.ts +95 -0
- package/dist/utils/log-stream.js +229 -0
- package/dist/utils/log-stream.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/redact.d.ts +73 -0
- package/dist/utils/redact.js +245 -0
- package/dist/utils/redact.js.map +1 -0
- package/package.json +6 -4
- package/skills/find-skills/SKILL.md +0 -9
- package/dist/__tests__/core.test.js +0 -72
- package/dist/__tests__/core.test.js.map +0 -1
- package/dist/agent/model-manager.js.map +0 -1
- package/dist/cli/commands/configure.d.ts +0 -1
- package/dist/cli/commands/configure.js +0 -173
- package/dist/cli/commands/configure.js.map +0 -1
- package/dist/cli/commands/gateway-daemon.d.ts +0 -1
- package/dist/cli/commands/gateway-daemon.js +0 -141
- package/dist/cli/commands/gateway-daemon.js.map +0 -1
- package/dist/config/__tests__/diff.test.d.ts +0 -1
- package/dist/config/__tests__/diff.test.js +0 -192
- package/dist/config/__tests__/diff.test.js.map +0 -1
- package/dist/config/__tests__/loader.test.d.ts +0 -1
- package/dist/config/__tests__/loader.test.js +0 -356
- package/dist/config/__tests__/loader.test.js.map +0 -1
- package/dist/config/__tests__/paths.test.d.ts +0 -1
- package/dist/config/__tests__/paths.test.js +0 -192
- package/dist/config/__tests__/paths.test.js.map +0 -1
- package/dist/config/__tests__/reload.test.d.ts +0 -1
- package/dist/config/__tests__/reload.test.js +0 -374
- package/dist/config/__tests__/reload.test.js.map +0 -1
- package/dist/config/__tests__/rules.test.d.ts +0 -1
- package/dist/config/__tests__/rules.test.js +0 -204
- package/dist/config/__tests__/rules.test.js.map +0 -1
- package/dist/config/__tests__/schema.test.d.ts +0 -1
- package/dist/config/__tests__/schema.test.js +0 -672
- package/dist/config/__tests__/schema.test.js.map +0 -1
- package/dist/daemon/background-start.d.ts +0 -33
- package/dist/daemon/background-start.js +0 -89
- package/dist/daemon/background-start.js.map +0 -1
- package/dist/daemon/gateway-manager.d.ts +0 -87
- package/dist/daemon/gateway-manager.js +0 -324
- package/dist/daemon/gateway-manager.js.map +0 -1
- package/dist/daemon/index.d.ts +0 -5
- package/dist/daemon/index.js +0 -6
- package/dist/daemon/index.js.map +0 -1
- package/dist/gateway/static/root/assets/main-DevbZW9K.js +0 -2227
- package/dist/gateway/static/root/assets/main-DevbZW9K.js.map +0 -1
- package/dist/gateway/static/root/assets/main-DxZg1Nmz.css +0 -1
- package/dist/providers/__tests__/registry.test.d.ts +0 -1
- package/dist/providers/__tests__/registry.test.js +0 -110
- package/dist/providers/__tests__/registry.test.js.map +0 -1
- package/dist/providers/api-strategies.d.ts +0 -15
- package/dist/providers/api-strategies.js +0 -96
- package/dist/providers/api-strategies.js.map +0 -1
- package/dist/providers/auto-discovery.d.ts +0 -84
- package/dist/providers/auto-discovery.js +0 -236
- package/dist/providers/auto-discovery.js.map +0 -1
- package/dist/providers/config.d.ts +0 -25
- package/dist/providers/config.js +0 -42
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/model-catalog.d.ts +0 -205
- package/dist/providers/model-catalog.js +0 -1071
- package/dist/providers/model-catalog.js.map +0 -1
- package/dist/providers/models-dev-data.d.ts +0 -11
- package/dist/providers/models-dev-data.js +0 -1035
- package/dist/providers/models-dev-data.js.map +0 -1
- package/dist/providers/models-dev.d.ts +0 -30
- package/dist/providers/models-dev.js +0 -42
- package/dist/providers/models-dev.js.map +0 -1
- package/dist/providers/pi-ai.d.ts +0 -62
- package/dist/providers/pi-ai.js +0 -221
- package/dist/providers/pi-ai.js.map +0 -1
- package/dist/providers/provider-catalog.d.ts +0 -173
- package/dist/providers/provider-catalog.js +0 -834
- package/dist/providers/provider-catalog.js.map +0 -1
- package/dist/providers/registry.d.ts +0 -155
- package/dist/providers/registry.js +0 -524
- package/dist/providers/registry.js.map +0 -1
- package/dist/providers/types.d.ts +0 -95
- package/dist/providers/types.js +0 -7
- package/dist/providers/types.js.map +0 -1
- package/dist/session/chat-manager.d.ts +0 -49
- package/dist/session/chat-manager.js +0 -167
- package/dist/session/chat-manager.js.map +0 -1
- package/dist/session/chat-types.d.ts +0 -53
- package/dist/session/chat-types.js +0 -63
- package/dist/session/chat-types.js.map +0 -1
- /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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.agent-defaults.js","sourceRoot":"","sources":["../../src/agent/types.agent-defaults.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/agent/types.d.ts
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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';
|
package/dist/agent/types.js
CHANGED
package/dist/agent/types.js.map
CHANGED
|
@@ -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[];
|