@cogitator-ai/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/__tests__/agent.test.d.ts +2 -0
- package/dist/__tests__/agent.test.d.ts.map +1 -0
- package/dist/__tests__/agent.test.js +91 -0
- package/dist/__tests__/agent.test.js.map +1 -0
- package/dist/__tests__/base64.test.d.ts +2 -0
- package/dist/__tests__/base64.test.d.ts.map +1 -0
- package/dist/__tests__/base64.test.js +62 -0
- package/dist/__tests__/base64.test.js.map +1 -0
- package/dist/__tests__/calculator.test.d.ts +2 -0
- package/dist/__tests__/calculator.test.d.ts.map +1 -0
- package/dist/__tests__/calculator.test.js +146 -0
- package/dist/__tests__/calculator.test.js.map +1 -0
- package/dist/__tests__/cogitator-memory.test.d.ts +2 -0
- package/dist/__tests__/cogitator-memory.test.d.ts.map +1 -0
- package/dist/__tests__/cogitator-memory.test.js +176 -0
- package/dist/__tests__/cogitator-memory.test.js.map +1 -0
- package/dist/__tests__/datetime.test.d.ts +2 -0
- package/dist/__tests__/datetime.test.d.ts.map +1 -0
- package/dist/__tests__/datetime.test.js +87 -0
- package/dist/__tests__/datetime.test.js.map +1 -0
- package/dist/__tests__/exec.test.d.ts +2 -0
- package/dist/__tests__/exec.test.d.ts.map +1 -0
- package/dist/__tests__/exec.test.js +59 -0
- package/dist/__tests__/exec.test.js.map +1 -0
- package/dist/__tests__/filesystem.test.d.ts +2 -0
- package/dist/__tests__/filesystem.test.d.ts.map +1 -0
- package/dist/__tests__/filesystem.test.js +148 -0
- package/dist/__tests__/filesystem.test.js.map +1 -0
- package/dist/__tests__/google-backend.test.d.ts +5 -0
- package/dist/__tests__/google-backend.test.d.ts.map +1 -0
- package/dist/__tests__/google-backend.test.js +429 -0
- package/dist/__tests__/google-backend.test.js.map +1 -0
- package/dist/__tests__/hash.test.d.ts +2 -0
- package/dist/__tests__/hash.test.d.ts.map +1 -0
- package/dist/__tests__/hash.test.js +50 -0
- package/dist/__tests__/hash.test.js.map +1 -0
- package/dist/__tests__/http.test.d.ts +2 -0
- package/dist/__tests__/http.test.d.ts.map +1 -0
- package/dist/__tests__/http.test.js +64 -0
- package/dist/__tests__/http.test.js.map +1 -0
- package/dist/__tests__/json.test.d.ts +2 -0
- package/dist/__tests__/json.test.d.ts.map +1 -0
- package/dist/__tests__/json.test.js +65 -0
- package/dist/__tests__/json.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +186 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/random.test.d.ts +2 -0
- package/dist/__tests__/random.test.d.ts.map +1 -0
- package/dist/__tests__/random.test.js +81 -0
- package/dist/__tests__/random.test.js.map +1 -0
- package/dist/__tests__/regex.test.d.ts +2 -0
- package/dist/__tests__/regex.test.d.ts.map +1 -0
- package/dist/__tests__/regex.test.js +75 -0
- package/dist/__tests__/regex.test.js.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +102 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/sleep.test.d.ts +2 -0
- package/dist/__tests__/sleep.test.d.ts.map +1 -0
- package/dist/__tests__/sleep.test.js +29 -0
- package/dist/__tests__/sleep.test.js.map +1 -0
- package/dist/__tests__/tool.test.d.ts +2 -0
- package/dist/__tests__/tool.test.d.ts.map +1 -0
- package/dist/__tests__/tool.test.js +103 -0
- package/dist/__tests__/tool.test.js.map +1 -0
- package/dist/__tests__/uuid.test.d.ts +2 -0
- package/dist/__tests__/uuid.test.d.ts.map +1 -0
- package/dist/__tests__/uuid.test.js +37 -0
- package/dist/__tests__/uuid.test.js.map +1 -0
- package/dist/agent.d.ts +15 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +35 -0
- package/dist/agent.js.map +1 -0
- package/dist/cogitator.d.ts +66 -0
- package/dist/cogitator.d.ts.map +1 -0
- package/dist/cogitator.js +538 -0
- package/dist/cogitator.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/anthropic.d.ts +19 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +188 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/base.d.ts +11 -0
- package/dist/llm/base.d.ts.map +1 -0
- package/dist/llm/base.js +9 -0
- package/dist/llm/base.js.map +1 -0
- package/dist/llm/google.d.ts +32 -0
- package/dist/llm/google.d.ts.map +1 -0
- package/dist/llm/google.js +282 -0
- package/dist/llm/google.js.map +1 -0
- package/dist/llm/index.d.ts +22 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +67 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/ollama.d.ts +20 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +134 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai.d.ts +21 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +154 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/logger.d.ts +48 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +118 -0
- package/dist/logger.js.map +1 -0
- package/dist/registry.d.ts +15 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +31 -0
- package/dist/registry.js.map +1 -0
- package/dist/tool.d.ts +13 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +44 -0
- package/dist/tool.js.map +1 -0
- package/dist/tools/base64.d.ts +23 -0
- package/dist/tools/base64.d.ts.map +1 -0
- package/dist/tools/base64.js +53 -0
- package/dist/tools/base64.js.map +1 -0
- package/dist/tools/calculator.d.ts +15 -0
- package/dist/tools/calculator.d.ts.map +1 -0
- package/dist/tools/calculator.js +193 -0
- package/dist/tools/calculator.js.map +1 -0
- package/dist/tools/datetime.d.ts +23 -0
- package/dist/tools/datetime.d.ts.map +1 -0
- package/dist/tools/datetime.js +95 -0
- package/dist/tools/datetime.js.map +1 -0
- package/dist/tools/exec.d.ts +46 -0
- package/dist/tools/exec.d.ts.map +1 -0
- package/dist/tools/exec.js +87 -0
- package/dist/tools/exec.js.map +1 -0
- package/dist/tools/filesystem.d.ts +100 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +186 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/hash.d.ts +19 -0
- package/dist/tools/hash.d.ts.map +1 -0
- package/dist/tools/hash.js +32 -0
- package/dist/tools/hash.js.map +1 -0
- package/dist/tools/http.d.ts +29 -0
- package/dist/tools/http.d.ts.map +1 -0
- package/dist/tools/http.js +82 -0
- package/dist/tools/http.js.map +1 -0
- package/dist/tools/index.d.ts +323 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +50 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/json.d.ts +28 -0
- package/dist/tools/json.d.ts.map +1 -0
- package/dist/tools/json.js +42 -0
- package/dist/tools/json.js.map +1 -0
- package/dist/tools/random.d.ts +29 -0
- package/dist/tools/random.d.ts.map +1 -0
- package/dist/tools/random.js +56 -0
- package/dist/tools/random.js.map +1 -0
- package/dist/tools/regex.d.ts +43 -0
- package/dist/tools/regex.d.ts.map +1 -0
- package/dist/tools/regex.js +68 -0
- package/dist/tools/regex.js.map +1 -0
- package/dist/tools/sleep.d.ts +10 -0
- package/dist/tools/sleep.d.ts.map +1 -0
- package/dist/tools/sleep.js +25 -0
- package/dist/tools/sleep.js.map +1 -0
- package/dist/tools/uuid.d.ts +15 -0
- package/dist/tools/uuid.d.ts.map +1 -0
- package/dist/tools/uuid.js +25 -0
- package/dist/tools/uuid.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +127 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +235 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/fallback.d.ts +66 -0
- package/dist/utils/fallback.d.ts.map +1 -0
- package/dist/utils/fallback.js +99 -0
- package/dist/utils/fallback.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/retry.d.ts +51 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +115 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { jsonParse, jsonStringify } from '../tools/json';
|
|
3
|
+
const mockContext = {
|
|
4
|
+
agentId: 'agent_test',
|
|
5
|
+
runId: 'run_test',
|
|
6
|
+
signal: new AbortController().signal,
|
|
7
|
+
};
|
|
8
|
+
describe('jsonParse tool', () => {
|
|
9
|
+
it('parses valid JSON object', async () => {
|
|
10
|
+
const result = await jsonParse.execute({ json: '{"name": "test", "value": 42}' }, mockContext);
|
|
11
|
+
expect(result).toHaveProperty('valid', true);
|
|
12
|
+
expect(result).toHaveProperty('result');
|
|
13
|
+
expect(result.result).toEqual({ name: 'test', value: 42 });
|
|
14
|
+
});
|
|
15
|
+
it('parses valid JSON array', async () => {
|
|
16
|
+
const result = await jsonParse.execute({ json: '[1, 2, 3]' }, mockContext);
|
|
17
|
+
expect(result.result).toEqual([1, 2, 3]);
|
|
18
|
+
});
|
|
19
|
+
it('parses JSON primitives', async () => {
|
|
20
|
+
expect((await jsonParse.execute({ json: '"hello"' }, mockContext)).result).toBe('hello');
|
|
21
|
+
expect((await jsonParse.execute({ json: '42' }, mockContext)).result).toBe(42);
|
|
22
|
+
expect((await jsonParse.execute({ json: 'true' }, mockContext)).result).toBe(true);
|
|
23
|
+
expect((await jsonParse.execute({ json: 'null' }, mockContext)).result).toBe(null);
|
|
24
|
+
});
|
|
25
|
+
it('returns error for invalid JSON', async () => {
|
|
26
|
+
const result = await jsonParse.execute({ json: '{invalid}' }, mockContext);
|
|
27
|
+
expect(result).toHaveProperty('valid', false);
|
|
28
|
+
expect(result).toHaveProperty('error');
|
|
29
|
+
});
|
|
30
|
+
it('returns error for incomplete JSON', async () => {
|
|
31
|
+
const result = await jsonParse.execute({ json: '{"unclosed": ' }, mockContext);
|
|
32
|
+
expect(result).toHaveProperty('valid', false);
|
|
33
|
+
});
|
|
34
|
+
it('has correct metadata', () => {
|
|
35
|
+
expect(jsonParse.name).toBe('json_parse');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('jsonStringify tool', () => {
|
|
39
|
+
it('stringifies object', async () => {
|
|
40
|
+
const result = await jsonStringify.execute({ data: { a: 1, b: 2 } }, mockContext);
|
|
41
|
+
expect(result.result).toBe('{"a":1,"b":2}');
|
|
42
|
+
expect(result).toHaveProperty('pretty', false);
|
|
43
|
+
});
|
|
44
|
+
it('stringifies with pretty formatting', async () => {
|
|
45
|
+
const result = await jsonStringify.execute({ data: { a: 1 }, pretty: true }, mockContext);
|
|
46
|
+
expect(result.result).toBe('{\n "a": 1\n}');
|
|
47
|
+
});
|
|
48
|
+
it('respects custom indent', async () => {
|
|
49
|
+
const result = await jsonStringify.execute({ data: { a: 1 }, pretty: true, indent: 4 }, mockContext);
|
|
50
|
+
expect(result.result).toBe('{\n "a": 1\n}');
|
|
51
|
+
});
|
|
52
|
+
it('stringifies arrays', async () => {
|
|
53
|
+
const result = await jsonStringify.execute({ data: [1, 2, 3] }, mockContext);
|
|
54
|
+
expect(result.result).toBe('[1,2,3]');
|
|
55
|
+
});
|
|
56
|
+
it('stringifies primitives', async () => {
|
|
57
|
+
expect((await jsonStringify.execute({ data: 'hello' }, mockContext)).result).toBe('"hello"');
|
|
58
|
+
expect((await jsonStringify.execute({ data: 42 }, mockContext)).result).toBe('42');
|
|
59
|
+
expect((await jsonStringify.execute({ data: null }, mockContext)).result).toBe('null');
|
|
60
|
+
});
|
|
61
|
+
it('has correct metadata', () => {
|
|
62
|
+
expect(jsonStringify.name).toBe('json_stringify');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=json.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.test.js","sourceRoot":"","sources":["../../src/__tests__/json.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/logger.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { Logger, createLogger, getLogger, setLogger } from '../logger';
|
|
3
|
+
describe('Logger', () => {
|
|
4
|
+
describe('log levels', () => {
|
|
5
|
+
it('respects minimum log level', () => {
|
|
6
|
+
const entries = [];
|
|
7
|
+
const logger = createLogger({
|
|
8
|
+
level: 'warn',
|
|
9
|
+
output: (entry) => entries.push(entry),
|
|
10
|
+
});
|
|
11
|
+
logger.debug('debug message');
|
|
12
|
+
logger.info('info message');
|
|
13
|
+
logger.warn('warn message');
|
|
14
|
+
logger.error('error message');
|
|
15
|
+
expect(entries).toHaveLength(2);
|
|
16
|
+
expect(entries[0].level).toBe('warn');
|
|
17
|
+
expect(entries[1].level).toBe('error');
|
|
18
|
+
});
|
|
19
|
+
it('outputs all levels when set to debug', () => {
|
|
20
|
+
const entries = [];
|
|
21
|
+
const logger = createLogger({
|
|
22
|
+
level: 'debug',
|
|
23
|
+
output: (entry) => entries.push(entry),
|
|
24
|
+
});
|
|
25
|
+
logger.debug('debug');
|
|
26
|
+
logger.info('info');
|
|
27
|
+
logger.warn('warn');
|
|
28
|
+
logger.error('error');
|
|
29
|
+
expect(entries).toHaveLength(4);
|
|
30
|
+
});
|
|
31
|
+
it('defaults to info level', () => {
|
|
32
|
+
const entries = [];
|
|
33
|
+
const logger = createLogger({
|
|
34
|
+
output: (entry) => entries.push(entry),
|
|
35
|
+
});
|
|
36
|
+
logger.debug('debug');
|
|
37
|
+
logger.info('info');
|
|
38
|
+
expect(entries).toHaveLength(1);
|
|
39
|
+
expect(entries[0].level).toBe('info');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('context', () => {
|
|
43
|
+
it('includes context in log entry', () => {
|
|
44
|
+
const entries = [];
|
|
45
|
+
const logger = createLogger({
|
|
46
|
+
level: 'debug',
|
|
47
|
+
output: (entry) => entries.push(entry),
|
|
48
|
+
});
|
|
49
|
+
logger.info('test message', { userId: '123', action: 'login' });
|
|
50
|
+
expect(entries[0].context).toEqual({ userId: '123', action: 'login' });
|
|
51
|
+
});
|
|
52
|
+
it('omits empty context', () => {
|
|
53
|
+
const entries = [];
|
|
54
|
+
const logger = createLogger({
|
|
55
|
+
level: 'debug',
|
|
56
|
+
output: (entry) => entries.push(entry),
|
|
57
|
+
});
|
|
58
|
+
logger.info('test message');
|
|
59
|
+
expect(entries[0].context).toBeUndefined();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('child logger', () => {
|
|
63
|
+
it('creates child with inherited context', () => {
|
|
64
|
+
const entries = [];
|
|
65
|
+
const parentWithContext = new Logger({ level: 'debug', output: (entry) => entries.push(entry) }, { service: 'api' });
|
|
66
|
+
const child = parentWithContext.child({ requestId: 'req-123' });
|
|
67
|
+
child.info('processing request');
|
|
68
|
+
expect(entries[0].context).toEqual({ service: 'api', requestId: 'req-123' });
|
|
69
|
+
});
|
|
70
|
+
it('can add call-time context to child', () => {
|
|
71
|
+
const entries = [];
|
|
72
|
+
const parent = new Logger({ level: 'debug', output: (entry) => entries.push(entry) }, { service: 'api' });
|
|
73
|
+
const child = parent.child({ requestId: 'req-123' });
|
|
74
|
+
child.info('operation', { operation: 'fetch' });
|
|
75
|
+
expect(entries[0].context).toEqual({
|
|
76
|
+
service: 'api',
|
|
77
|
+
requestId: 'req-123',
|
|
78
|
+
operation: 'fetch',
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('formatting', () => {
|
|
83
|
+
it('outputs JSON format', () => {
|
|
84
|
+
let formatted = '';
|
|
85
|
+
const logger = createLogger({
|
|
86
|
+
level: 'debug',
|
|
87
|
+
format: 'json',
|
|
88
|
+
output: (_, f) => (formatted = f),
|
|
89
|
+
});
|
|
90
|
+
logger.info('test', { key: 'value' });
|
|
91
|
+
const parsed = JSON.parse(formatted);
|
|
92
|
+
expect(parsed.level).toBe('info');
|
|
93
|
+
expect(parsed.message).toBe('test');
|
|
94
|
+
expect(parsed.context).toEqual({ key: 'value' });
|
|
95
|
+
expect(parsed.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
|
|
96
|
+
});
|
|
97
|
+
it('outputs pretty format', () => {
|
|
98
|
+
let formatted = '';
|
|
99
|
+
const logger = createLogger({
|
|
100
|
+
level: 'debug',
|
|
101
|
+
format: 'pretty',
|
|
102
|
+
output: (_, f) => (formatted = f),
|
|
103
|
+
});
|
|
104
|
+
logger.info('test message');
|
|
105
|
+
expect(formatted).toContain('INFO');
|
|
106
|
+
expect(formatted).toContain('test message');
|
|
107
|
+
});
|
|
108
|
+
it('includes context in pretty format', () => {
|
|
109
|
+
let formatted = '';
|
|
110
|
+
const logger = createLogger({
|
|
111
|
+
level: 'debug',
|
|
112
|
+
format: 'pretty',
|
|
113
|
+
output: (_, f) => (formatted = f),
|
|
114
|
+
});
|
|
115
|
+
logger.info('test', { userId: '123' });
|
|
116
|
+
expect(formatted).toContain('userId="123"');
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('timestamp', () => {
|
|
120
|
+
it('includes ISO timestamp', () => {
|
|
121
|
+
const entries = [];
|
|
122
|
+
const logger = createLogger({
|
|
123
|
+
level: 'debug',
|
|
124
|
+
output: (entry) => entries.push(entry),
|
|
125
|
+
});
|
|
126
|
+
logger.info('test');
|
|
127
|
+
expect(entries[0].timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('default logger', () => {
|
|
131
|
+
let originalEnv;
|
|
132
|
+
beforeEach(() => {
|
|
133
|
+
originalEnv = process.env.LOG_LEVEL;
|
|
134
|
+
});
|
|
135
|
+
afterEach(() => {
|
|
136
|
+
if (originalEnv !== undefined) {
|
|
137
|
+
process.env.LOG_LEVEL = originalEnv;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
process.env.LOG_LEVEL = undefined;
|
|
141
|
+
}
|
|
142
|
+
setLogger(createLogger());
|
|
143
|
+
});
|
|
144
|
+
it('getLogger returns singleton', () => {
|
|
145
|
+
const logger1 = getLogger();
|
|
146
|
+
const logger2 = getLogger();
|
|
147
|
+
expect(logger1).toBe(logger2);
|
|
148
|
+
});
|
|
149
|
+
it('setLogger replaces default', () => {
|
|
150
|
+
const entries = [];
|
|
151
|
+
const custom = createLogger({
|
|
152
|
+
level: 'debug',
|
|
153
|
+
output: (entry) => entries.push(entry),
|
|
154
|
+
});
|
|
155
|
+
setLogger(custom);
|
|
156
|
+
const retrieved = getLogger();
|
|
157
|
+
retrieved.info('test');
|
|
158
|
+
expect(entries).toHaveLength(1);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('console output', () => {
|
|
162
|
+
it('uses console.error for error level', () => {
|
|
163
|
+
const spy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
164
|
+
const logger = createLogger({ level: 'debug', format: 'pretty' });
|
|
165
|
+
logger.error('error message');
|
|
166
|
+
expect(spy).toHaveBeenCalled();
|
|
167
|
+
spy.mockRestore();
|
|
168
|
+
});
|
|
169
|
+
it('uses console.warn for warn level', () => {
|
|
170
|
+
const spy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
171
|
+
const logger = createLogger({ level: 'debug', format: 'pretty' });
|
|
172
|
+
logger.warn('warning');
|
|
173
|
+
expect(spy).toHaveBeenCalled();
|
|
174
|
+
spy.mockRestore();
|
|
175
|
+
});
|
|
176
|
+
it('uses console.log for info and debug', () => {
|
|
177
|
+
const spy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
178
|
+
const logger = createLogger({ level: 'debug', format: 'pretty' });
|
|
179
|
+
logger.info('info');
|
|
180
|
+
logger.debug('debug');
|
|
181
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
182
|
+
spy.mockRestore();
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=logger.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../src/__tests__/logger.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/random.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { randomNumber, randomString } from '../tools/random';
|
|
3
|
+
const mockContext = {
|
|
4
|
+
agentId: 'agent_test',
|
|
5
|
+
runId: 'run_test',
|
|
6
|
+
signal: new AbortController().signal,
|
|
7
|
+
};
|
|
8
|
+
describe('randomNumber tool', () => {
|
|
9
|
+
it('generates a number between 0 and 1 by default', async () => {
|
|
10
|
+
const result = await randomNumber.execute({}, mockContext);
|
|
11
|
+
expect(result).toHaveProperty('result');
|
|
12
|
+
const value = result.result;
|
|
13
|
+
expect(value).toBeGreaterThanOrEqual(0);
|
|
14
|
+
expect(value).toBeLessThan(1);
|
|
15
|
+
});
|
|
16
|
+
it('respects min and max bounds', async () => {
|
|
17
|
+
for (let i = 0; i < 20; i++) {
|
|
18
|
+
const result = await randomNumber.execute({ min: 10, max: 20 }, mockContext);
|
|
19
|
+
const value = result.result;
|
|
20
|
+
expect(value).toBeGreaterThanOrEqual(10);
|
|
21
|
+
expect(value).toBeLessThan(20);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
it('returns integers when specified', async () => {
|
|
25
|
+
for (let i = 0; i < 20; i++) {
|
|
26
|
+
const result = await randomNumber.execute({ min: 1, max: 100, integer: true }, mockContext);
|
|
27
|
+
const value = result.result;
|
|
28
|
+
expect(Number.isInteger(value)).toBe(true);
|
|
29
|
+
expect(value).toBeGreaterThanOrEqual(1);
|
|
30
|
+
expect(value).toBeLessThan(100);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
it('returns error when min >= max', async () => {
|
|
34
|
+
const result = await randomNumber.execute({ min: 10, max: 5 }, mockContext);
|
|
35
|
+
expect(result).toHaveProperty('error');
|
|
36
|
+
expect(result.error).toContain('min must be less than max');
|
|
37
|
+
});
|
|
38
|
+
it('has correct metadata', () => {
|
|
39
|
+
expect(randomNumber.name).toBe('random_number');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('randomString tool', () => {
|
|
43
|
+
it('generates alphanumeric string by default', async () => {
|
|
44
|
+
const result = await randomString.execute({ length: 20 }, mockContext);
|
|
45
|
+
expect(result).toHaveProperty('result');
|
|
46
|
+
const str = result.result;
|
|
47
|
+
expect(str).toHaveLength(20);
|
|
48
|
+
expect(str).toMatch(/^[A-Za-z0-9]+$/);
|
|
49
|
+
});
|
|
50
|
+
it('generates alpha-only string', async () => {
|
|
51
|
+
const result = await randomString.execute({ length: 20, charset: 'alpha' }, mockContext);
|
|
52
|
+
const str = result.result;
|
|
53
|
+
expect(str).toMatch(/^[A-Za-z]+$/);
|
|
54
|
+
});
|
|
55
|
+
it('generates numeric string', async () => {
|
|
56
|
+
const result = await randomString.execute({ length: 20, charset: 'numeric' }, mockContext);
|
|
57
|
+
const str = result.result;
|
|
58
|
+
expect(str).toMatch(/^[0-9]+$/);
|
|
59
|
+
});
|
|
60
|
+
it('generates hex string', async () => {
|
|
61
|
+
const result = await randomString.execute({ length: 32, charset: 'hex' }, mockContext);
|
|
62
|
+
const str = result.result;
|
|
63
|
+
expect(str).toMatch(/^[0-9a-f]+$/);
|
|
64
|
+
});
|
|
65
|
+
it('generates unique strings', async () => {
|
|
66
|
+
const strings = [];
|
|
67
|
+
for (let i = 0; i < 50; i++) {
|
|
68
|
+
const result = await randomString.execute({ length: 32 }, mockContext);
|
|
69
|
+
strings.push(result.result);
|
|
70
|
+
}
|
|
71
|
+
const unique = new Set(strings);
|
|
72
|
+
expect(unique.size).toBe(50);
|
|
73
|
+
});
|
|
74
|
+
it('has correct metadata', () => {
|
|
75
|
+
expect(randomString.name).toBe('random_string');
|
|
76
|
+
const schema = randomString.toJSON();
|
|
77
|
+
expect(schema.parameters.properties).toHaveProperty('length');
|
|
78
|
+
expect(schema.parameters.properties).toHaveProperty('charset');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=random.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.test.js","sourceRoot":"","sources":["../../src/__tests__/random.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/regex.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { regexMatch, regexReplace } from '../tools/regex';
|
|
3
|
+
const mockContext = {
|
|
4
|
+
agentId: 'agent_test',
|
|
5
|
+
runId: 'run_test',
|
|
6
|
+
signal: new AbortController().signal,
|
|
7
|
+
};
|
|
8
|
+
describe('regexMatch tool', () => {
|
|
9
|
+
it('finds all matches with global flag', async () => {
|
|
10
|
+
const result = await regexMatch.execute({ text: 'cat bat rat', pattern: '[cbr]at' }, mockContext);
|
|
11
|
+
expect(result).toHaveProperty('count', 3);
|
|
12
|
+
const matches = result.matches;
|
|
13
|
+
expect(matches.map((m) => m.match)).toEqual(['cat', 'bat', 'rat']);
|
|
14
|
+
});
|
|
15
|
+
it('returns match positions', async () => {
|
|
16
|
+
const result = await regexMatch.execute({ text: 'hello world', pattern: 'o' }, mockContext);
|
|
17
|
+
const matches = result.matches;
|
|
18
|
+
expect(matches[0]).toEqual({ match: 'o', index: 4, groups: undefined });
|
|
19
|
+
expect(matches[1]).toEqual({ match: 'o', index: 7, groups: undefined });
|
|
20
|
+
});
|
|
21
|
+
it('supports case-insensitive matching', async () => {
|
|
22
|
+
const result = await regexMatch.execute({ text: 'Hello HELLO hello', pattern: 'hello', flags: 'gi' }, mockContext);
|
|
23
|
+
expect(result).toHaveProperty('count', 3);
|
|
24
|
+
});
|
|
25
|
+
it('returns named groups', async () => {
|
|
26
|
+
const result = await regexMatch.execute({ text: 'John: 25, Jane: 30', pattern: '(?<name>\\w+): (?<age>\\d+)', flags: 'g' }, mockContext);
|
|
27
|
+
const matches = result.matches;
|
|
28
|
+
expect(matches[0].groups).toEqual({ name: 'John', age: '25' });
|
|
29
|
+
expect(matches[1].groups).toEqual({ name: 'Jane', age: '30' });
|
|
30
|
+
});
|
|
31
|
+
it('returns empty array for no matches', async () => {
|
|
32
|
+
const result = await regexMatch.execute({ text: 'hello', pattern: 'xyz' }, mockContext);
|
|
33
|
+
expect(result).toHaveProperty('count', 0);
|
|
34
|
+
expect(result.matches).toEqual([]);
|
|
35
|
+
});
|
|
36
|
+
it('handles invalid regex', async () => {
|
|
37
|
+
const result = await regexMatch.execute({ text: 'hello', pattern: '[invalid' }, mockContext);
|
|
38
|
+
expect(result).toHaveProperty('error');
|
|
39
|
+
});
|
|
40
|
+
it('works without global flag', async () => {
|
|
41
|
+
const result = await regexMatch.execute({ text: 'cat bat rat', pattern: '[cbr]at', flags: '' }, mockContext);
|
|
42
|
+
expect(result).toHaveProperty('count', 1);
|
|
43
|
+
});
|
|
44
|
+
it('has correct metadata', () => {
|
|
45
|
+
expect(regexMatch.name).toBe('regex_match');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('regexReplace tool', () => {
|
|
49
|
+
it('replaces all matches by default', async () => {
|
|
50
|
+
const result = await regexReplace.execute({ text: 'cat bat rat', pattern: '[cbr]at', replacement: 'dog' }, mockContext);
|
|
51
|
+
expect(result.result).toBe('dog dog dog');
|
|
52
|
+
expect(result).toHaveProperty('replacements', 3);
|
|
53
|
+
});
|
|
54
|
+
it('uses capture groups in replacement', async () => {
|
|
55
|
+
const result = await regexReplace.execute({ text: 'hello world', pattern: '(\\w+) (\\w+)', replacement: '$2 $1' }, mockContext);
|
|
56
|
+
expect(result.result).toBe('world hello');
|
|
57
|
+
});
|
|
58
|
+
it('replaces only first match without global flag', async () => {
|
|
59
|
+
const result = await regexReplace.execute({ text: 'cat bat rat', pattern: '[cbr]at', replacement: 'dog', flags: '' }, mockContext);
|
|
60
|
+
expect(result.result).toBe('dog bat rat');
|
|
61
|
+
});
|
|
62
|
+
it('handles no matches', async () => {
|
|
63
|
+
const result = await regexReplace.execute({ text: 'hello', pattern: 'xyz', replacement: 'abc' }, mockContext);
|
|
64
|
+
expect(result.result).toBe('hello');
|
|
65
|
+
expect(result).toHaveProperty('replacements', 0);
|
|
66
|
+
});
|
|
67
|
+
it('handles invalid regex', async () => {
|
|
68
|
+
const result = await regexReplace.execute({ text: 'hello', pattern: '[invalid', replacement: 'x' }, mockContext);
|
|
69
|
+
expect(result).toHaveProperty('error');
|
|
70
|
+
});
|
|
71
|
+
it('has correct metadata', () => {
|
|
72
|
+
expect(regexReplace.name).toBe('regex_replace');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=regex.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex.test.js","sourceRoot":"","sources":["../../src/__tests__/regex.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ToolRegistry } from '../registry';
|
|
4
|
+
import { tool } from '../tool';
|
|
5
|
+
describe('ToolRegistry', () => {
|
|
6
|
+
let registry;
|
|
7
|
+
const createMockTool = (name) => tool({
|
|
8
|
+
name,
|
|
9
|
+
description: `Test tool: ${name}`,
|
|
10
|
+
parameters: z.object({ input: z.string() }),
|
|
11
|
+
execute: () => Promise.resolve('result'),
|
|
12
|
+
});
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
registry = new ToolRegistry();
|
|
15
|
+
});
|
|
16
|
+
describe('register()', () => {
|
|
17
|
+
it('registers a single tool', () => {
|
|
18
|
+
const myTool = createMockTool('test-tool');
|
|
19
|
+
registry.register(myTool);
|
|
20
|
+
expect(registry.has('test-tool')).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it('overwrites existing tool with same name', () => {
|
|
23
|
+
const tool1 = createMockTool('same-name');
|
|
24
|
+
const tool2 = tool({
|
|
25
|
+
name: 'same-name',
|
|
26
|
+
description: 'Updated description',
|
|
27
|
+
parameters: z.object({ x: z.number() }),
|
|
28
|
+
execute: () => Promise.resolve(42),
|
|
29
|
+
});
|
|
30
|
+
registry.register(tool1);
|
|
31
|
+
registry.register(tool2);
|
|
32
|
+
const retrieved = registry.get('same-name');
|
|
33
|
+
expect(retrieved?.description).toBe('Updated description');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('registerMany()', () => {
|
|
37
|
+
it('registers multiple tools at once', () => {
|
|
38
|
+
const tools = [createMockTool('tool-1'), createMockTool('tool-2'), createMockTool('tool-3')];
|
|
39
|
+
registry.registerMany(tools);
|
|
40
|
+
expect(registry.has('tool-1')).toBe(true);
|
|
41
|
+
expect(registry.has('tool-2')).toBe(true);
|
|
42
|
+
expect(registry.has('tool-3')).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('get()', () => {
|
|
46
|
+
it('returns the tool if it exists', () => {
|
|
47
|
+
const myTool = createMockTool('my-tool');
|
|
48
|
+
registry.register(myTool);
|
|
49
|
+
const retrieved = registry.get('my-tool');
|
|
50
|
+
expect(retrieved).toBe(myTool);
|
|
51
|
+
});
|
|
52
|
+
it('returns undefined if tool does not exist', () => {
|
|
53
|
+
const retrieved = registry.get('non-existent');
|
|
54
|
+
expect(retrieved).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('has()', () => {
|
|
58
|
+
it('returns true if tool exists', () => {
|
|
59
|
+
registry.register(createMockTool('exists'));
|
|
60
|
+
expect(registry.has('exists')).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
it('returns false if tool does not exist', () => {
|
|
63
|
+
expect(registry.has('does-not-exist')).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('getAll()', () => {
|
|
67
|
+
it('returns empty array when no tools registered', () => {
|
|
68
|
+
expect(registry.getAll()).toEqual([]);
|
|
69
|
+
});
|
|
70
|
+
it('returns all registered tools', () => {
|
|
71
|
+
registry.registerMany([createMockTool('a'), createMockTool('b')]);
|
|
72
|
+
const all = registry.getAll();
|
|
73
|
+
expect(all).toHaveLength(2);
|
|
74
|
+
expect(all.map((t) => t.name).sort()).toEqual(['a', 'b']);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('getSchemas()', () => {
|
|
78
|
+
it('returns empty array when no tools registered', () => {
|
|
79
|
+
expect(registry.getSchemas()).toEqual([]);
|
|
80
|
+
});
|
|
81
|
+
it('returns JSON schemas for all tools', () => {
|
|
82
|
+
registry.registerMany([createMockTool('tool-a'), createMockTool('tool-b')]);
|
|
83
|
+
const schemas = registry.getSchemas();
|
|
84
|
+
expect(schemas).toHaveLength(2);
|
|
85
|
+
for (const schema of schemas) {
|
|
86
|
+
expect(schema).toHaveProperty('name');
|
|
87
|
+
expect(schema).toHaveProperty('description');
|
|
88
|
+
expect(schema).toHaveProperty('parameters');
|
|
89
|
+
expect(schema.parameters.type).toBe('object');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('clear()', () => {
|
|
94
|
+
it('removes all registered tools', () => {
|
|
95
|
+
registry.registerMany([createMockTool('x'), createMockTool('y')]);
|
|
96
|
+
expect(registry.getAll()).toHaveLength(2);
|
|
97
|
+
registry.clear();
|
|
98
|
+
expect(registry.getAll()).toHaveLength(0);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sleep.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { sleep } from '../tools/sleep';
|
|
3
|
+
const mockContext = {
|
|
4
|
+
agentId: 'agent_test',
|
|
5
|
+
runId: 'run_test',
|
|
6
|
+
signal: new AbortController().signal,
|
|
7
|
+
};
|
|
8
|
+
describe('sleep tool', () => {
|
|
9
|
+
it('sleeps for specified duration', async () => {
|
|
10
|
+
const start = Date.now();
|
|
11
|
+
const result = await sleep.execute({ ms: 100 }, mockContext);
|
|
12
|
+
const elapsed = Date.now() - start;
|
|
13
|
+
expect(result).toHaveProperty('requested', 100);
|
|
14
|
+
expect(result).toHaveProperty('slept');
|
|
15
|
+
expect(elapsed).toBeGreaterThanOrEqual(90);
|
|
16
|
+
expect(elapsed).toBeLessThan(200);
|
|
17
|
+
});
|
|
18
|
+
it('sleeps for 0ms', async () => {
|
|
19
|
+
const result = await sleep.execute({ ms: 0 }, mockContext);
|
|
20
|
+
expect(result).toHaveProperty('requested', 0);
|
|
21
|
+
});
|
|
22
|
+
it('has correct metadata', () => {
|
|
23
|
+
expect(sleep.name).toBe('sleep');
|
|
24
|
+
expect(sleep.description.toLowerCase()).toContain('pause');
|
|
25
|
+
const schema = sleep.toJSON();
|
|
26
|
+
expect(schema.parameters.properties).toHaveProperty('ms');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=sleep.test.js.map
|