@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Cogitator Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# @cogitator-ai/core
|
|
2
|
+
|
|
3
|
+
Core runtime for Cogitator AI agents. Build and run LLM-powered agents with tool calling, streaming, and multi-provider support.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @cogitator-ai/core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Cogitator, Agent, tool } from '@cogitator-ai/core';
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
|
|
17
|
+
// Create a tool
|
|
18
|
+
const calculator = tool({
|
|
19
|
+
name: 'calculator',
|
|
20
|
+
description: 'Evaluate a math expression',
|
|
21
|
+
parameters: z.object({
|
|
22
|
+
expression: z.string(),
|
|
23
|
+
}),
|
|
24
|
+
execute: async ({ expression }) => {
|
|
25
|
+
return { result: eval(expression) };
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Create an agent
|
|
30
|
+
const agent = new Agent({
|
|
31
|
+
name: 'math-assistant',
|
|
32
|
+
instructions: 'You are a helpful math assistant',
|
|
33
|
+
model: 'ollama/llama3.2:3b',
|
|
34
|
+
tools: [calculator],
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Run the agent
|
|
38
|
+
const cog = new Cogitator();
|
|
39
|
+
const result = await cog.run(agent, {
|
|
40
|
+
input: 'What is 25 * 4?',
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
console.log(result.output);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Features
|
|
47
|
+
|
|
48
|
+
- Multiple LLM backends (Ollama, OpenAI, Anthropic, Google)
|
|
49
|
+
- Type-safe tool definitions with Zod
|
|
50
|
+
- Streaming responses
|
|
51
|
+
- Memory integration
|
|
52
|
+
- Built-in tools (calculator, datetime, filesystem, HTTP, etc.)
|
|
53
|
+
|
|
54
|
+
## LLM Backends
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// Ollama (default)
|
|
58
|
+
const cog = new Cogitator({ defaultModel: 'ollama/llama3.2:3b' });
|
|
59
|
+
|
|
60
|
+
// OpenAI
|
|
61
|
+
const cog = new Cogitator({ defaultModel: 'openai/gpt-4o' });
|
|
62
|
+
|
|
63
|
+
// Anthropic
|
|
64
|
+
const cog = new Cogitator({ defaultModel: 'anthropic/claude-sonnet-4-20250514' });
|
|
65
|
+
|
|
66
|
+
// Google
|
|
67
|
+
const cog = new Cogitator({ defaultModel: 'google/gemini-1.5-flash' });
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Documentation
|
|
71
|
+
|
|
72
|
+
See the [Cogitator documentation](https://github.com/eL1fe/cogitator) for full API reference.
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { Agent } from '../agent';
|
|
4
|
+
import { tool } from '../tool';
|
|
5
|
+
describe('Agent', () => {
|
|
6
|
+
const createBasicConfig = () => ({
|
|
7
|
+
name: 'test-agent',
|
|
8
|
+
model: 'ollama/llama3.1:8b',
|
|
9
|
+
instructions: 'You are a helpful assistant.',
|
|
10
|
+
});
|
|
11
|
+
describe('constructor', () => {
|
|
12
|
+
it('creates an agent with required config', () => {
|
|
13
|
+
const agent = new Agent(createBasicConfig());
|
|
14
|
+
expect(agent.name).toBe('test-agent');
|
|
15
|
+
expect(agent.model).toBe('ollama/llama3.1:8b');
|
|
16
|
+
expect(agent.instructions).toBe('You are a helpful assistant.');
|
|
17
|
+
});
|
|
18
|
+
it('generates a unique id', () => {
|
|
19
|
+
const agent1 = new Agent(createBasicConfig());
|
|
20
|
+
const agent2 = new Agent(createBasicConfig());
|
|
21
|
+
expect(agent1.id).toMatch(/^agent_/);
|
|
22
|
+
expect(agent2.id).toMatch(/^agent_/);
|
|
23
|
+
expect(agent1.id).not.toBe(agent2.id);
|
|
24
|
+
});
|
|
25
|
+
it('applies default values for temperature, maxIterations, timeout', () => {
|
|
26
|
+
const agent = new Agent(createBasicConfig());
|
|
27
|
+
expect(agent.config.temperature).toBe(0.7);
|
|
28
|
+
expect(agent.config.maxIterations).toBe(10);
|
|
29
|
+
expect(agent.config.timeout).toBe(120_000);
|
|
30
|
+
});
|
|
31
|
+
it('allows overriding default values', () => {
|
|
32
|
+
const agent = new Agent({
|
|
33
|
+
...createBasicConfig(),
|
|
34
|
+
temperature: 0.9,
|
|
35
|
+
maxIterations: 5,
|
|
36
|
+
timeout: 60_000,
|
|
37
|
+
});
|
|
38
|
+
expect(agent.config.temperature).toBe(0.9);
|
|
39
|
+
expect(agent.config.maxIterations).toBe(5);
|
|
40
|
+
expect(agent.config.timeout).toBe(60_000);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('tools', () => {
|
|
44
|
+
it('returns empty array when no tools configured', () => {
|
|
45
|
+
const agent = new Agent(createBasicConfig());
|
|
46
|
+
expect(agent.tools).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
it('returns configured tools', () => {
|
|
49
|
+
const myTool = tool({
|
|
50
|
+
name: 'my-tool',
|
|
51
|
+
description: 'A test tool',
|
|
52
|
+
parameters: z.object({ x: z.string() }),
|
|
53
|
+
execute: () => Promise.resolve('result'),
|
|
54
|
+
});
|
|
55
|
+
const agent = new Agent({
|
|
56
|
+
...createBasicConfig(),
|
|
57
|
+
tools: [myTool],
|
|
58
|
+
});
|
|
59
|
+
expect(agent.tools).toHaveLength(1);
|
|
60
|
+
expect(agent.tools[0].name).toBe('my-tool');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('clone()', () => {
|
|
64
|
+
it('creates a new agent with the same config', () => {
|
|
65
|
+
const original = new Agent({
|
|
66
|
+
...createBasicConfig(),
|
|
67
|
+
temperature: 0.5,
|
|
68
|
+
});
|
|
69
|
+
const cloned = original.clone({});
|
|
70
|
+
expect(cloned.id).not.toBe(original.id);
|
|
71
|
+
expect(cloned.name).toBe(original.name);
|
|
72
|
+
expect(cloned.model).toBe(original.model);
|
|
73
|
+
expect(cloned.config.temperature).toBe(0.5);
|
|
74
|
+
});
|
|
75
|
+
it('applies overrides to the cloned agent', () => {
|
|
76
|
+
const original = new Agent({
|
|
77
|
+
...createBasicConfig(),
|
|
78
|
+
temperature: 0.5,
|
|
79
|
+
});
|
|
80
|
+
const cloned = original.clone({
|
|
81
|
+
name: 'cloned-agent',
|
|
82
|
+
temperature: 0.9,
|
|
83
|
+
});
|
|
84
|
+
expect(cloned.name).toBe('cloned-agent');
|
|
85
|
+
expect(cloned.config.temperature).toBe(0.9);
|
|
86
|
+
expect(original.name).toBe('test-agent');
|
|
87
|
+
expect(original.config.temperature).toBe(0.5);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=agent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.js","sourceRoot":"","sources":["../../src/__tests__/agent.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/base64.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { base64Encode, base64Decode } from '../tools/base64';
|
|
3
|
+
const mockContext = {
|
|
4
|
+
agentId: 'agent_test',
|
|
5
|
+
runId: 'run_test',
|
|
6
|
+
signal: new AbortController().signal,
|
|
7
|
+
};
|
|
8
|
+
describe('base64Encode tool', () => {
|
|
9
|
+
it('encodes string to base64', async () => {
|
|
10
|
+
const result = await base64Encode.execute({ data: 'Hello, World!' }, mockContext);
|
|
11
|
+
expect(result).toHaveProperty('result', 'SGVsbG8sIFdvcmxkIQ==');
|
|
12
|
+
expect(result).toHaveProperty('urlSafe', false);
|
|
13
|
+
});
|
|
14
|
+
it('encodes empty string', async () => {
|
|
15
|
+
const result = await base64Encode.execute({ data: '' }, mockContext);
|
|
16
|
+
expect(result.result).toBe('');
|
|
17
|
+
});
|
|
18
|
+
it('encodes unicode characters', async () => {
|
|
19
|
+
const result = await base64Encode.execute({ data: '🎉 Party!' }, mockContext);
|
|
20
|
+
expect(result.result).toBe('8J+OiSBQYXJ0eSE=');
|
|
21
|
+
});
|
|
22
|
+
it('produces URL-safe encoding', async () => {
|
|
23
|
+
const result = await base64Encode.execute({ data: '>>>???', urlSafe: true }, mockContext);
|
|
24
|
+
const encoded = result.result;
|
|
25
|
+
expect(encoded).not.toContain('+');
|
|
26
|
+
expect(encoded).not.toContain('/');
|
|
27
|
+
expect(encoded).not.toContain('=');
|
|
28
|
+
expect(result).toHaveProperty('urlSafe', true);
|
|
29
|
+
});
|
|
30
|
+
it('has correct metadata', () => {
|
|
31
|
+
expect(base64Encode.name).toBe('base64_encode');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('base64Decode tool', () => {
|
|
35
|
+
it('decodes base64 to string', async () => {
|
|
36
|
+
const result = await base64Decode.execute({ data: 'SGVsbG8sIFdvcmxkIQ==' }, mockContext);
|
|
37
|
+
expect(result).toHaveProperty('result', 'Hello, World!');
|
|
38
|
+
});
|
|
39
|
+
it('decodes empty string', async () => {
|
|
40
|
+
const result = await base64Decode.execute({ data: '' }, mockContext);
|
|
41
|
+
expect(result.result).toBe('');
|
|
42
|
+
});
|
|
43
|
+
it('decodes unicode characters', async () => {
|
|
44
|
+
const result = await base64Decode.execute({ data: '8J+OiSBQYXJ0eSE=' }, mockContext);
|
|
45
|
+
expect(result.result).toBe('🎉 Party!');
|
|
46
|
+
});
|
|
47
|
+
it('decodes URL-safe encoding', async () => {
|
|
48
|
+
const encoded = await base64Encode.execute({ data: '>>>???', urlSafe: true }, mockContext);
|
|
49
|
+
const decoded = await base64Decode.execute({ data: encoded.result, urlSafe: true }, mockContext);
|
|
50
|
+
expect(decoded.result).toBe('>>>???');
|
|
51
|
+
});
|
|
52
|
+
it('round-trips correctly', async () => {
|
|
53
|
+
const original = 'Test data with special chars: 日本語 🚀';
|
|
54
|
+
const encoded = await base64Encode.execute({ data: original }, mockContext);
|
|
55
|
+
const decoded = await base64Decode.execute({ data: encoded.result }, mockContext);
|
|
56
|
+
expect(decoded.result).toBe(original);
|
|
57
|
+
});
|
|
58
|
+
it('has correct metadata', () => {
|
|
59
|
+
expect(base64Decode.name).toBe('base64_decode');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=base64.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.test.js","sourceRoot":"","sources":["../../src/__tests__/base64.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/calculator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { calculator } from '../tools/calculator';
|
|
3
|
+
const mockContext = {
|
|
4
|
+
agentId: 'agent_test',
|
|
5
|
+
runId: 'run_test',
|
|
6
|
+
signal: new AbortController().signal,
|
|
7
|
+
};
|
|
8
|
+
describe('calculator tool', () => {
|
|
9
|
+
describe('basic arithmetic', () => {
|
|
10
|
+
it('evaluates addition', async () => {
|
|
11
|
+
const result = await calculator.execute({ expression: '2 + 3' }, mockContext);
|
|
12
|
+
expect(result).toEqual({ result: 5, expression: '2 + 3' });
|
|
13
|
+
});
|
|
14
|
+
it('evaluates subtraction', async () => {
|
|
15
|
+
const result = await calculator.execute({ expression: '10 - 4' }, mockContext);
|
|
16
|
+
expect(result).toEqual({ result: 6, expression: '10 - 4' });
|
|
17
|
+
});
|
|
18
|
+
it('evaluates multiplication', async () => {
|
|
19
|
+
const result = await calculator.execute({ expression: '6 * 7' }, mockContext);
|
|
20
|
+
expect(result).toEqual({ result: 42, expression: '6 * 7' });
|
|
21
|
+
});
|
|
22
|
+
it('evaluates division', async () => {
|
|
23
|
+
const result = await calculator.execute({ expression: '20 / 4' }, mockContext);
|
|
24
|
+
expect(result).toEqual({ result: 5, expression: '20 / 4' });
|
|
25
|
+
});
|
|
26
|
+
it('handles negative numbers', async () => {
|
|
27
|
+
const result = await calculator.execute({ expression: '-5 + 3' }, mockContext);
|
|
28
|
+
expect(result).toEqual({ result: -2, expression: '-5 + 3' });
|
|
29
|
+
});
|
|
30
|
+
it('handles decimals', async () => {
|
|
31
|
+
const result = await calculator.execute({ expression: '3.14 * 2' }, mockContext);
|
|
32
|
+
expect(result).toEqual({ result: 6.28, expression: '3.14 * 2' });
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('operator precedence', () => {
|
|
36
|
+
it('respects multiplication over addition', async () => {
|
|
37
|
+
const result = await calculator.execute({ expression: '2 + 3 * 4' }, mockContext);
|
|
38
|
+
expect(result).toEqual({ result: 14, expression: '2 + 3 * 4' });
|
|
39
|
+
});
|
|
40
|
+
it('respects parentheses', async () => {
|
|
41
|
+
const result = await calculator.execute({ expression: '(2 + 3) * 4' }, mockContext);
|
|
42
|
+
expect(result).toEqual({ result: 20, expression: '(2 + 3) * 4' });
|
|
43
|
+
});
|
|
44
|
+
it('handles nested parentheses', async () => {
|
|
45
|
+
const result = await calculator.execute({ expression: '((2 + 3) * (4 - 1))' }, mockContext);
|
|
46
|
+
expect(result).toEqual({ result: 15, expression: '((2 + 3) * (4 - 1))' });
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('power operator', () => {
|
|
50
|
+
it('evaluates power', async () => {
|
|
51
|
+
const result = await calculator.execute({ expression: '2^3' }, mockContext);
|
|
52
|
+
expect(result).toEqual({ result: 8, expression: '2^3' });
|
|
53
|
+
});
|
|
54
|
+
it('handles right-associative power', async () => {
|
|
55
|
+
const result = await calculator.execute({ expression: '2^2^3' }, mockContext);
|
|
56
|
+
expect(result).toEqual({ result: 256, expression: '2^2^3' });
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('mathematical functions', () => {
|
|
60
|
+
it('evaluates sqrt', async () => {
|
|
61
|
+
const result = await calculator.execute({ expression: 'sqrt(16)' }, mockContext);
|
|
62
|
+
expect(result).toEqual({ result: 4, expression: 'sqrt(16)' });
|
|
63
|
+
});
|
|
64
|
+
it('evaluates abs', async () => {
|
|
65
|
+
const result = await calculator.execute({ expression: 'abs(-5)' }, mockContext);
|
|
66
|
+
expect(result).toEqual({ result: 5, expression: 'abs(-5)' });
|
|
67
|
+
});
|
|
68
|
+
it('evaluates round', async () => {
|
|
69
|
+
const result = await calculator.execute({ expression: 'round(3.7)' }, mockContext);
|
|
70
|
+
expect(result).toEqual({ result: 4, expression: 'round(3.7)' });
|
|
71
|
+
});
|
|
72
|
+
it('evaluates floor', async () => {
|
|
73
|
+
const result = await calculator.execute({ expression: 'floor(3.9)' }, mockContext);
|
|
74
|
+
expect(result).toEqual({ result: 3, expression: 'floor(3.9)' });
|
|
75
|
+
});
|
|
76
|
+
it('evaluates ceil', async () => {
|
|
77
|
+
const result = await calculator.execute({ expression: 'ceil(3.1)' }, mockContext);
|
|
78
|
+
expect(result).toEqual({ result: 4, expression: 'ceil(3.1)' });
|
|
79
|
+
});
|
|
80
|
+
it('evaluates sin', async () => {
|
|
81
|
+
const result = (await calculator.execute({ expression: 'sin(0)' }, mockContext));
|
|
82
|
+
expect(result.result).toBeCloseTo(0);
|
|
83
|
+
});
|
|
84
|
+
it('evaluates cos', async () => {
|
|
85
|
+
const result = (await calculator.execute({ expression: 'cos(0)' }, mockContext));
|
|
86
|
+
expect(result.result).toBeCloseTo(1);
|
|
87
|
+
});
|
|
88
|
+
it('evaluates log', async () => {
|
|
89
|
+
const result = (await calculator.execute({ expression: 'log(e)' }, mockContext));
|
|
90
|
+
expect(result.result).toBeCloseTo(1);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('constants', () => {
|
|
94
|
+
it('supports pi', async () => {
|
|
95
|
+
const result = (await calculator.execute({ expression: 'pi' }, mockContext));
|
|
96
|
+
expect(result.result).toBeCloseTo(Math.PI);
|
|
97
|
+
});
|
|
98
|
+
it('supports e', async () => {
|
|
99
|
+
const result = (await calculator.execute({ expression: 'e' }, mockContext));
|
|
100
|
+
expect(result.result).toBeCloseTo(Math.E);
|
|
101
|
+
});
|
|
102
|
+
it('uses pi in expressions', async () => {
|
|
103
|
+
const result = (await calculator.execute({ expression: '2 * pi' }, mockContext));
|
|
104
|
+
expect(result.result).toBeCloseTo(2 * Math.PI);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('complex expressions', () => {
|
|
108
|
+
it('evaluates compound expression', async () => {
|
|
109
|
+
const result = await calculator.execute({ expression: 'sqrt(16) + 2^3 - 4' }, mockContext);
|
|
110
|
+
expect(result).toEqual({ result: 8, expression: 'sqrt(16) + 2^3 - 4' });
|
|
111
|
+
});
|
|
112
|
+
it('handles function with expression argument', async () => {
|
|
113
|
+
const result = await calculator.execute({ expression: 'sqrt(9 + 16)' }, mockContext);
|
|
114
|
+
expect(result).toEqual({ result: 5, expression: 'sqrt(9 + 16)' });
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('error handling', () => {
|
|
118
|
+
it('returns error for invalid characters', async () => {
|
|
119
|
+
const result = (await calculator.execute({ expression: '2 + x' }, mockContext));
|
|
120
|
+
expect(result.error).toContain('Unknown character');
|
|
121
|
+
});
|
|
122
|
+
it('returns error for division by zero (Infinity)', async () => {
|
|
123
|
+
const result = (await calculator.execute({ expression: '1 / 0' }, mockContext));
|
|
124
|
+
expect(result.error).toContain('not a finite number');
|
|
125
|
+
});
|
|
126
|
+
it('returns error for missing function parentheses', async () => {
|
|
127
|
+
const result = (await calculator.execute({ expression: 'sqrt 16' }, mockContext));
|
|
128
|
+
expect(result.error).toContain("Expected '(' after function");
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('tool metadata', () => {
|
|
132
|
+
it('has correct name', () => {
|
|
133
|
+
expect(calculator.name).toBe('calculator');
|
|
134
|
+
});
|
|
135
|
+
it('has description', () => {
|
|
136
|
+
expect(calculator.description).toContain('mathematical expressions');
|
|
137
|
+
});
|
|
138
|
+
it('returns valid JSON schema', () => {
|
|
139
|
+
const schema = calculator.toJSON();
|
|
140
|
+
expect(schema.name).toBe('calculator');
|
|
141
|
+
expect(schema.parameters.type).toBe('object');
|
|
142
|
+
expect(schema.parameters.properties).toHaveProperty('expression');
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=calculator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculator.test.js","sourceRoot":"","sources":["../../src/__tests__/calculator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cogitator-memory.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cogitator-memory.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { Cogitator } from '../cogitator';
|
|
3
|
+
import { Agent } from '../agent';
|
|
4
|
+
const mockResponses = [];
|
|
5
|
+
let responseIndex = 0;
|
|
6
|
+
vi.mock('../llm/index.js', () => ({
|
|
7
|
+
createLLMBackend: () => ({
|
|
8
|
+
chat: vi.fn().mockImplementation(() => {
|
|
9
|
+
const content = mockResponses[responseIndex]?.content ?? 'Mock response';
|
|
10
|
+
responseIndex++;
|
|
11
|
+
return Promise.resolve({
|
|
12
|
+
id: 'mock-id',
|
|
13
|
+
content,
|
|
14
|
+
finishReason: 'stop',
|
|
15
|
+
usage: { inputTokens: 10, outputTokens: 10, totalTokens: 20 },
|
|
16
|
+
});
|
|
17
|
+
}),
|
|
18
|
+
chatStream: vi.fn(),
|
|
19
|
+
}),
|
|
20
|
+
parseModel: (model) => ({
|
|
21
|
+
provider: 'ollama',
|
|
22
|
+
model: model.replace('ollama/', ''),
|
|
23
|
+
}),
|
|
24
|
+
}));
|
|
25
|
+
describe('Cogitator with Memory', () => {
|
|
26
|
+
let cog;
|
|
27
|
+
let agent;
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
responseIndex = 0;
|
|
30
|
+
mockResponses.length = 0;
|
|
31
|
+
});
|
|
32
|
+
afterEach(async () => {
|
|
33
|
+
if (cog) {
|
|
34
|
+
await cog.close();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
describe('without memory configured', () => {
|
|
38
|
+
it('works without memory', async () => {
|
|
39
|
+
cog = new Cogitator();
|
|
40
|
+
agent = new Agent({
|
|
41
|
+
id: 'test-agent',
|
|
42
|
+
name: 'Test Agent',
|
|
43
|
+
model: 'ollama/llama3.1:8b',
|
|
44
|
+
instructions: 'You are helpful.',
|
|
45
|
+
});
|
|
46
|
+
mockResponses.push({ role: 'assistant', content: 'Hello!' });
|
|
47
|
+
const result = await cog.run(agent, { input: 'Hi' });
|
|
48
|
+
expect(result.output).toBe('Hello!');
|
|
49
|
+
expect(result.threadId).toMatch(/^thread_/);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('with memory configured', () => {
|
|
53
|
+
const memoryConfig = {
|
|
54
|
+
memory: {
|
|
55
|
+
adapter: 'memory',
|
|
56
|
+
inMemory: { maxEntries: 1000 },
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
it('initializes memory adapter on first run', async () => {
|
|
60
|
+
cog = new Cogitator(memoryConfig);
|
|
61
|
+
agent = new Agent({
|
|
62
|
+
id: 'test-agent',
|
|
63
|
+
name: 'Test Agent',
|
|
64
|
+
model: 'ollama/llama3.1:8b',
|
|
65
|
+
instructions: 'You are helpful.',
|
|
66
|
+
});
|
|
67
|
+
mockResponses.push({ role: 'assistant', content: 'Hello!' });
|
|
68
|
+
const result = await cog.run(agent, { input: 'Hi', threadId: 'thread_test1' });
|
|
69
|
+
expect(result.output).toBe('Hello!');
|
|
70
|
+
expect(result.threadId).toBe('thread_test1');
|
|
71
|
+
});
|
|
72
|
+
it('persists messages across runs with same threadId', async () => {
|
|
73
|
+
cog = new Cogitator(memoryConfig);
|
|
74
|
+
agent = new Agent({
|
|
75
|
+
id: 'test-agent',
|
|
76
|
+
name: 'Test Agent',
|
|
77
|
+
model: 'ollama/llama3.1:8b',
|
|
78
|
+
instructions: 'You are helpful.',
|
|
79
|
+
});
|
|
80
|
+
const threadId = 'thread_persist';
|
|
81
|
+
mockResponses.push({ role: 'assistant', content: 'Nice to meet you, Alex!' });
|
|
82
|
+
await cog.run(agent, { input: 'My name is Alex', threadId });
|
|
83
|
+
mockResponses.push({ role: 'assistant', content: 'Your name is Alex!' });
|
|
84
|
+
const result2 = await cog.run(agent, { input: "What's my name?", threadId });
|
|
85
|
+
expect(result2.output).toBe('Your name is Alex!');
|
|
86
|
+
expect(result2.messages.length).toBeGreaterThan(2);
|
|
87
|
+
});
|
|
88
|
+
it('uses separate history for different threadIds', async () => {
|
|
89
|
+
cog = new Cogitator(memoryConfig);
|
|
90
|
+
agent = new Agent({
|
|
91
|
+
id: 'test-agent',
|
|
92
|
+
name: 'Test Agent',
|
|
93
|
+
model: 'ollama/llama3.1:8b',
|
|
94
|
+
instructions: 'You are helpful.',
|
|
95
|
+
});
|
|
96
|
+
mockResponses.push({ role: 'assistant', content: 'Hello Thread 1!' });
|
|
97
|
+
await cog.run(agent, { input: 'Thread 1 message', threadId: 'thread_1' });
|
|
98
|
+
mockResponses.push({ role: 'assistant', content: 'Hello Thread 2!' });
|
|
99
|
+
const result2 = await cog.run(agent, { input: 'Thread 2 message', threadId: 'thread_2' });
|
|
100
|
+
expect(result2.messages.filter((m) => m.role === 'user').length).toBe(1);
|
|
101
|
+
});
|
|
102
|
+
it('respects useMemory=false option', async () => {
|
|
103
|
+
cog = new Cogitator(memoryConfig);
|
|
104
|
+
agent = new Agent({
|
|
105
|
+
id: 'test-agent',
|
|
106
|
+
name: 'Test Agent',
|
|
107
|
+
model: 'ollama/llama3.1:8b',
|
|
108
|
+
instructions: 'You are helpful.',
|
|
109
|
+
});
|
|
110
|
+
const threadId = 'thread_nomem';
|
|
111
|
+
mockResponses.push({ role: 'assistant', content: 'First response' });
|
|
112
|
+
await cog.run(agent, { input: 'First message', threadId });
|
|
113
|
+
mockResponses.push({ role: 'assistant', content: 'Second response' });
|
|
114
|
+
const result2 = await cog.run(agent, {
|
|
115
|
+
input: 'Second message',
|
|
116
|
+
threadId,
|
|
117
|
+
useMemory: false,
|
|
118
|
+
});
|
|
119
|
+
expect(result2.messages.length).toBe(3);
|
|
120
|
+
});
|
|
121
|
+
it('respects saveHistory=false option', async () => {
|
|
122
|
+
cog = new Cogitator(memoryConfig);
|
|
123
|
+
agent = new Agent({
|
|
124
|
+
id: 'test-agent',
|
|
125
|
+
name: 'Test Agent',
|
|
126
|
+
model: 'ollama/llama3.1:8b',
|
|
127
|
+
instructions: 'You are helpful.',
|
|
128
|
+
});
|
|
129
|
+
const threadId = 'thread_nosave';
|
|
130
|
+
mockResponses.push({ role: 'assistant', content: 'Not saved' });
|
|
131
|
+
await cog.run(agent, { input: 'Temp message', threadId, saveHistory: false });
|
|
132
|
+
mockResponses.push({ role: 'assistant', content: 'Fresh start' });
|
|
133
|
+
const result2 = await cog.run(agent, { input: 'New message', threadId });
|
|
134
|
+
expect(result2.messages.length).toBe(3);
|
|
135
|
+
});
|
|
136
|
+
it('closes memory adapter properly', async () => {
|
|
137
|
+
cog = new Cogitator(memoryConfig);
|
|
138
|
+
agent = new Agent({
|
|
139
|
+
id: 'test-agent',
|
|
140
|
+
name: 'Test Agent',
|
|
141
|
+
model: 'ollama/llama3.1:8b',
|
|
142
|
+
instructions: 'You are helpful.',
|
|
143
|
+
});
|
|
144
|
+
mockResponses.push({ role: 'assistant', content: 'Test' });
|
|
145
|
+
await cog.run(agent, { input: 'Test', threadId: 'thread_close' });
|
|
146
|
+
await expect(cog.close()).resolves.not.toThrow();
|
|
147
|
+
await expect(cog.close()).resolves.not.toThrow();
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe('with context builder', () => {
|
|
151
|
+
const configWithBuilder = {
|
|
152
|
+
memory: {
|
|
153
|
+
adapter: 'memory',
|
|
154
|
+
inMemory: { maxEntries: 1000 },
|
|
155
|
+
contextBuilder: {
|
|
156
|
+
maxTokens: 1000,
|
|
157
|
+
strategy: 'recent',
|
|
158
|
+
includeSystemPrompt: true,
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
it('uses context builder when configured', async () => {
|
|
163
|
+
cog = new Cogitator(configWithBuilder);
|
|
164
|
+
agent = new Agent({
|
|
165
|
+
id: 'test-agent',
|
|
166
|
+
name: 'Test Agent',
|
|
167
|
+
model: 'ollama/llama3.1:8b',
|
|
168
|
+
instructions: 'You are helpful.',
|
|
169
|
+
});
|
|
170
|
+
mockResponses.push({ role: 'assistant', content: 'Built with context!' });
|
|
171
|
+
const result = await cog.run(agent, { input: 'Hi', threadId: 'thread_ctx' });
|
|
172
|
+
expect(result.output).toBe('Built with context!');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=cogitator-memory.test.js.map
|