@cogitator-ai/test-utils 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/fixtures/agents.d.ts +9 -0
  2. package/dist/fixtures/agents.d.ts.map +1 -0
  3. package/dist/fixtures/agents.js +46 -0
  4. package/dist/fixtures/index.d.ts +5 -0
  5. package/dist/fixtures/index.d.ts.map +1 -0
  6. package/dist/fixtures/index.js +4 -0
  7. package/dist/fixtures/messages.d.ts +14 -0
  8. package/dist/fixtures/messages.d.ts.map +1 -0
  9. package/dist/fixtures/messages.js +45 -0
  10. package/dist/fixtures/run-results.d.ts +8 -0
  11. package/dist/fixtures/run-results.d.ts.map +1 -0
  12. package/dist/fixtures/run-results.js +35 -0
  13. package/dist/fixtures/tools.d.ts +20 -0
  14. package/dist/fixtures/tools.d.ts.map +1 -0
  15. package/dist/fixtures/tools.js +106 -0
  16. package/dist/helpers/async.d.ts +11 -0
  17. package/dist/helpers/async.d.ts.map +1 -0
  18. package/dist/helpers/async.js +37 -0
  19. package/dist/helpers/index.d.ts +3 -0
  20. package/dist/helpers/index.d.ts.map +1 -0
  21. package/dist/helpers/index.js +2 -0
  22. package/dist/helpers/streams.d.ts +9 -0
  23. package/dist/helpers/streams.d.ts.map +1 -0
  24. package/dist/helpers/streams.js +46 -0
  25. package/dist/index.d.ts +4 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +3 -0
  28. package/dist/mocks/index.d.ts +4 -0
  29. package/dist/mocks/index.d.ts.map +1 -0
  30. package/dist/mocks/index.js +2 -0
  31. package/dist/mocks/mock-llm-backend.d.ts +39 -0
  32. package/dist/mocks/mock-llm-backend.d.ts.map +1 -0
  33. package/dist/mocks/mock-llm-backend.js +149 -0
  34. package/dist/mocks/mock-memory-adapter.d.ts +31 -0
  35. package/dist/mocks/mock-memory-adapter.d.ts.map +1 -0
  36. package/dist/mocks/mock-memory-adapter.js +128 -0
  37. package/package.json +43 -0
@@ -0,0 +1,9 @@
1
+ import type { Agent, AgentConfig } from '@cogitator-ai/types';
2
+ export interface TestAgentConfig extends Partial<AgentConfig> {
3
+ name?: string;
4
+ model?: string;
5
+ instructions?: string;
6
+ }
7
+ export declare function createTestAgentConfig(overrides?: TestAgentConfig): AgentConfig;
8
+ export declare function createTestAgent(overrides?: TestAgentConfig): Agent;
9
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/fixtures/agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAQ,MAAM,qBAAqB,CAAC;AAEpE,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,WAAW,CAAC;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,WAAW,CAY9E;AAED,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,KAAK,CAgClE"}
@@ -0,0 +1,46 @@
1
+ import { nanoid } from 'nanoid';
2
+ export function createTestAgentConfig(overrides) {
3
+ return {
4
+ id: `agent_${nanoid(8)}`,
5
+ name: 'test-agent',
6
+ model: 'mock/test-model',
7
+ instructions: 'You are a helpful test assistant.',
8
+ temperature: 0.7,
9
+ maxIterations: 10,
10
+ timeout: 30000,
11
+ tools: [],
12
+ ...overrides,
13
+ };
14
+ }
15
+ export function createTestAgent(overrides) {
16
+ const config = createTestAgentConfig(overrides);
17
+ return {
18
+ id: config.id,
19
+ name: config.name,
20
+ model: config.model,
21
+ instructions: config.instructions,
22
+ tools: config.tools ?? [],
23
+ config,
24
+ clone(cloneOverrides) {
25
+ return createTestAgent({ ...config, ...cloneOverrides, id: undefined });
26
+ },
27
+ serialize() {
28
+ return {
29
+ version: '1.0',
30
+ id: config.id,
31
+ name: config.name,
32
+ config: {
33
+ model: config.model,
34
+ instructions: config.instructions,
35
+ tools: (config.tools ?? []).map((t) => t.name),
36
+ temperature: config.temperature,
37
+ maxIterations: config.maxIterations,
38
+ timeout: config.timeout,
39
+ },
40
+ metadata: {
41
+ serializedAt: new Date().toISOString(),
42
+ },
43
+ };
44
+ },
45
+ };
46
+ }
@@ -0,0 +1,5 @@
1
+ export { createTestAgent, createTestAgentConfig, type TestAgentConfig } from './agents';
2
+ export { createUserMessage, createAssistantMessage, createSystemMessage, createToolMessage, createMultimodalMessage, createImageUrlMessage, createToolCall, createToolResult, createConversation, } from './messages';
3
+ export { createTestTool, createCalculatorTool, createWeatherTool, createFailingTool, createSlowTool, createToolSchema, type TestToolOptions, type SimpleTool, } from './tools';
4
+ export { createMockRunResult, createRunResultWithToolCalls, createRunResultWithMessages, type TestRunResultOptions, } from './run-results';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAExF,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,mBAAmB,EACnB,4BAA4B,EAC5B,2BAA2B,EAC3B,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createTestAgent, createTestAgentConfig } from './agents';
2
+ export { createUserMessage, createAssistantMessage, createSystemMessage, createToolMessage, createMultimodalMessage, createImageUrlMessage, createToolCall, createToolResult, createConversation, } from './messages';
3
+ export { createTestTool, createCalculatorTool, createWeatherTool, createFailingTool, createSlowTool, createToolSchema, } from './tools';
4
+ export { createMockRunResult, createRunResultWithToolCalls, createRunResultWithMessages, } from './run-results';
@@ -0,0 +1,14 @@
1
+ import type { Message, ToolCall, ToolResult, ContentPart } from '@cogitator-ai/types';
2
+ export declare function createUserMessage(content: string): Message;
3
+ export declare function createAssistantMessage(content: string): Message;
4
+ export declare function createSystemMessage(content: string): Message;
5
+ export declare function createToolMessage(toolCallId: string, content: string, name?: string): Message;
6
+ export declare function createMultimodalMessage(parts: ContentPart[]): Message;
7
+ export declare function createImageUrlMessage(text: string, imageUrl: string): Message;
8
+ export declare function createToolCall(name: string, args?: Record<string, unknown>): ToolCall;
9
+ export declare function createToolResult(toolCall: ToolCall, result: unknown, error?: string): ToolResult;
10
+ export declare function createConversation(...messages: Array<{
11
+ role: 'user' | 'assistant';
12
+ content: string;
13
+ }>): Message[];
14
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/fixtures/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGtF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAO7F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAErE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK7E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,QAAQ,CAMzF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAOhG;AAED,wBAAgB,kBAAkB,CAChC,GAAG,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAClE,OAAO,EAAE,CAIX"}
@@ -0,0 +1,45 @@
1
+ import { nanoid } from 'nanoid';
2
+ export function createUserMessage(content) {
3
+ return { role: 'user', content };
4
+ }
5
+ export function createAssistantMessage(content) {
6
+ return { role: 'assistant', content };
7
+ }
8
+ export function createSystemMessage(content) {
9
+ return { role: 'system', content };
10
+ }
11
+ export function createToolMessage(toolCallId, content, name) {
12
+ return {
13
+ role: 'tool',
14
+ content,
15
+ toolCallId,
16
+ name,
17
+ };
18
+ }
19
+ export function createMultimodalMessage(parts) {
20
+ return { role: 'user', content: parts };
21
+ }
22
+ export function createImageUrlMessage(text, imageUrl) {
23
+ return createMultimodalMessage([
24
+ { type: 'text', text },
25
+ { type: 'image_url', image_url: { url: imageUrl } },
26
+ ]);
27
+ }
28
+ export function createToolCall(name, args = {}) {
29
+ return {
30
+ id: `call_${nanoid(8)}`,
31
+ name,
32
+ arguments: args,
33
+ };
34
+ }
35
+ export function createToolResult(toolCall, result, error) {
36
+ return {
37
+ callId: toolCall.id,
38
+ name: toolCall.name,
39
+ result,
40
+ error,
41
+ };
42
+ }
43
+ export function createConversation(...messages) {
44
+ return messages.map((m) => m.role === 'user' ? createUserMessage(m.content) : createAssistantMessage(m.content));
45
+ }
@@ -0,0 +1,8 @@
1
+ import type { RunResult, ToolCall, Message } from '@cogitator-ai/types';
2
+ export interface TestRunResultOptions extends Partial<Omit<RunResult, 'output'>> {
3
+ output?: string;
4
+ }
5
+ export declare function createMockRunResult(output: string, options?: TestRunResultOptions): RunResult;
6
+ export declare function createRunResultWithToolCalls(output: string, toolCalls: readonly ToolCall[], options?: Partial<RunResult>): RunResult;
7
+ export declare function createRunResultWithMessages(output: string, messages: readonly Message[], options?: Partial<RunResult>): RunResult;
8
+ //# sourceMappingURL=run-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-results.d.ts","sourceRoot":"","sources":["../../src/fixtures/run-results.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAExE,MAAM,WAAW,oBAAqB,SAAQ,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAqB7F;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAC3B,SAAS,CAKX;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAC3B,SAAS,CAKX"}
@@ -0,0 +1,35 @@
1
+ import { nanoid } from 'nanoid';
2
+ export function createMockRunResult(output, options) {
3
+ return {
4
+ output,
5
+ runId: options?.runId ?? `run_${nanoid(8)}`,
6
+ agentId: options?.agentId ?? `agent_${nanoid(8)}`,
7
+ threadId: options?.threadId ?? `thread_${nanoid(8)}`,
8
+ usage: options?.usage ?? {
9
+ inputTokens: 100,
10
+ outputTokens: 50,
11
+ totalTokens: 150,
12
+ cost: 0.001,
13
+ duration: 100,
14
+ },
15
+ toolCalls: options?.toolCalls ?? [],
16
+ messages: options?.messages ?? [],
17
+ trace: options?.trace ?? {
18
+ traceId: `trace_${nanoid(12)}`,
19
+ spans: [],
20
+ },
21
+ ...options,
22
+ };
23
+ }
24
+ export function createRunResultWithToolCalls(output, toolCalls, options) {
25
+ return createMockRunResult(output, {
26
+ ...options,
27
+ toolCalls,
28
+ });
29
+ }
30
+ export function createRunResultWithMessages(output, messages, options) {
31
+ return createMockRunResult(output, {
32
+ ...options,
33
+ messages,
34
+ });
35
+ }
@@ -0,0 +1,20 @@
1
+ import type { ToolSchema, ToolContext } from '@cogitator-ai/types';
2
+ export interface TestToolOptions {
3
+ name?: string;
4
+ description?: string;
5
+ parameters?: ToolSchema['parameters'];
6
+ execute?: (args: Record<string, unknown>, context: ToolContext) => Promise<unknown>;
7
+ }
8
+ export interface SimpleTool {
9
+ name: string;
10
+ description: string;
11
+ parameters: ToolSchema['parameters'];
12
+ execute: (args: Record<string, unknown>, context: ToolContext) => Promise<unknown>;
13
+ }
14
+ export declare function createTestTool(options?: TestToolOptions): SimpleTool;
15
+ export declare function createCalculatorTool(): SimpleTool;
16
+ export declare function createWeatherTool(): SimpleTool;
17
+ export declare function createFailingTool(errorMessage?: string): SimpleTool;
18
+ export declare function createSlowTool(delayMs?: number): SimpleTool;
19
+ export declare function createToolSchema(name: string, description?: string): ToolSchema;
20
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/fixtures/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACpF;AAED,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,UAAU,CAiBpE;AAED,wBAAgB,oBAAoB,IAAI,UAAU,CA8BjD;AAED,wBAAgB,iBAAiB,IAAI,UAAU,CAuB9C;AAED,wBAAgB,iBAAiB,CAAC,YAAY,SAA0B,GAAG,UAAU,CAQpF;AAED,wBAAgB,cAAc,CAAC,OAAO,SAAO,GAAG,UAAU,CASzD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAY/E"}
@@ -0,0 +1,106 @@
1
+ import { nanoid } from 'nanoid';
2
+ export function createTestTool(options) {
3
+ const name = options?.name ?? `test_tool_${nanoid(4)}`;
4
+ return {
5
+ name,
6
+ description: options?.description ?? `A test tool called ${name}`,
7
+ parameters: options?.parameters ?? {
8
+ type: 'object',
9
+ properties: {
10
+ input: { type: 'string', description: 'Test input' },
11
+ },
12
+ required: ['input'],
13
+ },
14
+ execute: options?.execute ??
15
+ (async (args) => ({ result: `Executed ${name} with ${JSON.stringify(args)}` })),
16
+ };
17
+ }
18
+ export function createCalculatorTool() {
19
+ return createTestTool({
20
+ name: 'calculator',
21
+ description: 'Perform mathematical calculations',
22
+ parameters: {
23
+ type: 'object',
24
+ properties: {
25
+ expression: { type: 'string', description: 'Mathematical expression to evaluate' },
26
+ },
27
+ required: ['expression'],
28
+ },
29
+ execute: async (args) => {
30
+ try {
31
+ const expression = args.expression;
32
+ const ops = {
33
+ '+': (a, b) => a + b,
34
+ '-': (a, b) => a - b,
35
+ '*': (a, b) => a * b,
36
+ '/': (a, b) => a / b,
37
+ };
38
+ const match = /^(\d+)\s*([+\-*/])\s*(\d+)$/.exec(expression);
39
+ if (!match)
40
+ return { error: 'Invalid expression' };
41
+ const [, a, op, b] = match;
42
+ const result = ops[op](Number(a), Number(b));
43
+ return { result };
44
+ }
45
+ catch {
46
+ return { error: 'Invalid expression' };
47
+ }
48
+ },
49
+ });
50
+ }
51
+ export function createWeatherTool() {
52
+ return createTestTool({
53
+ name: 'get_weather',
54
+ description: 'Get the current weather for a location',
55
+ parameters: {
56
+ type: 'object',
57
+ properties: {
58
+ city: { type: 'string', description: 'City name' },
59
+ units: {
60
+ type: 'string',
61
+ enum: ['celsius', 'fahrenheit'],
62
+ description: 'Temperature units',
63
+ },
64
+ },
65
+ required: ['city'],
66
+ },
67
+ execute: async ({ city, units = 'celsius' }) => ({
68
+ city,
69
+ temperature: units === 'celsius' ? 22 : 72,
70
+ condition: 'sunny',
71
+ units,
72
+ }),
73
+ });
74
+ }
75
+ export function createFailingTool(errorMessage = 'Tool execution failed') {
76
+ return createTestTool({
77
+ name: 'failing_tool',
78
+ description: 'A tool that always fails',
79
+ execute: async () => {
80
+ throw new Error(errorMessage);
81
+ },
82
+ });
83
+ }
84
+ export function createSlowTool(delayMs = 1000) {
85
+ return createTestTool({
86
+ name: 'slow_tool',
87
+ description: 'A tool that takes time to execute',
88
+ execute: async (args) => {
89
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
90
+ return { result: 'completed', delay: delayMs, args };
91
+ },
92
+ });
93
+ }
94
+ export function createToolSchema(name, description) {
95
+ return {
96
+ name,
97
+ description: description ?? `Schema for ${name}`,
98
+ parameters: {
99
+ type: 'object',
100
+ properties: {
101
+ input: { type: 'string' },
102
+ },
103
+ required: ['input'],
104
+ },
105
+ };
106
+ }
@@ -0,0 +1,11 @@
1
+ export declare function waitFor<T>(condition: () => T | Promise<T>, options?: {
2
+ timeout?: number;
3
+ interval?: number;
4
+ }): Promise<T>;
5
+ export declare function eventually(assertion: () => void | Promise<void>, options?: {
6
+ timeout?: number;
7
+ interval?: number;
8
+ }): Promise<void>;
9
+ export declare function delay(ms: number): Promise<void>;
10
+ export declare function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T>;
11
+ //# sourceMappingURL=async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/helpers/async.ts"],"names":[],"mappings":"AAAA,wBAAsB,OAAO,CAAC,CAAC,EAC7B,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC/B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACrC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAKhF"}
@@ -0,0 +1,37 @@
1
+ export async function waitFor(condition, options) {
2
+ const timeout = options?.timeout ?? 5000;
3
+ const interval = options?.interval ?? 50;
4
+ const startTime = Date.now();
5
+ while (Date.now() - startTime < timeout) {
6
+ const result = await condition();
7
+ if (result) {
8
+ return result;
9
+ }
10
+ await new Promise((resolve) => setTimeout(resolve, interval));
11
+ }
12
+ throw new Error(`waitFor timed out after ${timeout}ms`);
13
+ }
14
+ export async function eventually(assertion, options) {
15
+ const timeout = options?.timeout ?? 5000;
16
+ const interval = options?.interval ?? 50;
17
+ const startTime = Date.now();
18
+ let lastError;
19
+ while (Date.now() - startTime < timeout) {
20
+ try {
21
+ await assertion();
22
+ return;
23
+ }
24
+ catch (error) {
25
+ lastError = error;
26
+ await new Promise((resolve) => setTimeout(resolve, interval));
27
+ }
28
+ }
29
+ throw lastError ?? new Error(`eventually timed out after ${timeout}ms`);
30
+ }
31
+ export function delay(ms) {
32
+ return new Promise((resolve) => setTimeout(resolve, ms));
33
+ }
34
+ export async function withTimeout(promise, ms) {
35
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`Operation timed out after ${ms}ms`)), ms));
36
+ return Promise.race([promise, timeoutPromise]);
37
+ }
@@ -0,0 +1,3 @@
1
+ export { collectStreamContent, collectStreamChunks, collectStreamToolCalls, createMockReadableStream, } from './streams';
2
+ export { waitFor, eventually, delay, withTimeout } from './async';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { collectStreamContent, collectStreamChunks, collectStreamToolCalls, createMockReadableStream, } from './streams';
2
+ export { waitFor, eventually, delay, withTimeout } from './async';
@@ -0,0 +1,9 @@
1
+ import type { ChatStreamChunk } from '@cogitator-ai/types';
2
+ export declare function collectStreamContent(stream: AsyncGenerator<ChatStreamChunk>): Promise<string>;
3
+ export declare function collectStreamChunks(stream: AsyncGenerator<ChatStreamChunk>): Promise<ChatStreamChunk[]>;
4
+ export declare function collectStreamToolCalls(stream: AsyncGenerator<ChatStreamChunk>): Promise<Array<{
5
+ name: string;
6
+ arguments: Record<string, unknown>;
7
+ }>>;
8
+ export declare function createMockReadableStream(chunks: string[]): ReadableStream<Uint8Array>;
9
+ //# sourceMappingURL=streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../src/helpers/streams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC,CAM5B;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,GACtC,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC,CAiBtE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAarF"}
@@ -0,0 +1,46 @@
1
+ export async function collectStreamContent(stream) {
2
+ let content = '';
3
+ for await (const chunk of stream) {
4
+ if (chunk.delta.content) {
5
+ content += chunk.delta.content;
6
+ }
7
+ }
8
+ return content;
9
+ }
10
+ export async function collectStreamChunks(stream) {
11
+ const chunks = [];
12
+ for await (const chunk of stream) {
13
+ chunks.push(chunk);
14
+ }
15
+ return chunks;
16
+ }
17
+ export async function collectStreamToolCalls(stream) {
18
+ const toolCalls = [];
19
+ for await (const chunk of stream) {
20
+ if (chunk.delta.toolCalls) {
21
+ for (const tc of chunk.delta.toolCalls) {
22
+ if (tc.name && tc.arguments) {
23
+ toolCalls.push({
24
+ name: tc.name,
25
+ arguments: tc.arguments,
26
+ });
27
+ }
28
+ }
29
+ }
30
+ }
31
+ return toolCalls;
32
+ }
33
+ export function createMockReadableStream(chunks) {
34
+ const encoder = new TextEncoder();
35
+ let index = 0;
36
+ return new ReadableStream({
37
+ pull(controller) {
38
+ if (index < chunks.length) {
39
+ controller.enqueue(encoder.encode(chunks[index++]));
40
+ }
41
+ else {
42
+ controller.close();
43
+ }
44
+ },
45
+ });
46
+ }
@@ -0,0 +1,4 @@
1
+ export * from './mocks';
2
+ export * from './fixtures';
3
+ export * from './helpers';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './mocks';
2
+ export * from './fixtures';
3
+ export * from './helpers';
@@ -0,0 +1,4 @@
1
+ export { MockLLMBackend, createMockLLMBackend } from './mock-llm-backend';
2
+ export type { MockChatResponse, MockStreamChunk } from './mock-llm-backend';
3
+ export { MockMemoryAdapter, createMockMemoryAdapter } from './mock-memory-adapter';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { MockLLMBackend, createMockLLMBackend } from './mock-llm-backend';
2
+ export { MockMemoryAdapter, createMockMemoryAdapter } from './mock-memory-adapter';
@@ -0,0 +1,39 @@
1
+ import type { LLMBackend, LLMProvider, ChatRequest, ChatResponse, ChatStreamChunk, ToolCall } from '@cogitator-ai/types';
2
+ export interface MockChatResponse extends Partial<ChatResponse> {
3
+ content?: string;
4
+ toolCalls?: ToolCall[];
5
+ finishReason?: ChatResponse['finishReason'];
6
+ error?: Error;
7
+ delay?: number;
8
+ }
9
+ export interface MockStreamChunk {
10
+ content?: string;
11
+ toolCalls?: Partial<ToolCall>[];
12
+ finishReason?: ChatStreamChunk['finishReason'];
13
+ delay?: number;
14
+ }
15
+ export declare class MockLLMBackend implements LLMBackend {
16
+ readonly provider: LLMProvider;
17
+ private responses;
18
+ private streamChunks;
19
+ private _calls;
20
+ private responseIndex;
21
+ private streamIndex;
22
+ private defaultDelay;
23
+ setResponse(response: MockChatResponse): this;
24
+ setResponses(responses: MockChatResponse[]): this;
25
+ setToolCallResponse(toolCalls: ToolCall[], content?: string): this;
26
+ setStreamChunks(chunks: MockStreamChunk[]): this;
27
+ setMultipleStreamChunks(chunksArray: MockStreamChunk[][]): this;
28
+ setDefaultDelay(ms: number): this;
29
+ getCalls(): ChatRequest[];
30
+ getLastCall(): ChatRequest | undefined;
31
+ getCallCount(): number;
32
+ wasCalledWith(predicate: (req: ChatRequest) => boolean): boolean;
33
+ reset(): void;
34
+ chat(request: ChatRequest): Promise<ChatResponse>;
35
+ chatStream(request: ChatRequest): AsyncGenerator<ChatStreamChunk>;
36
+ private estimateTokens;
37
+ }
38
+ export declare function createMockLLMBackend(): MockLLMBackend;
39
+ //# sourceMappingURL=mock-llm-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-llm-backend.d.ts","sourceRoot":"","sources":["../../src/mocks/mock-llm-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,gBAAiB,SAAQ,OAAO,CAAC,YAAY,CAAC;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,cAAe,YAAW,UAAU;IAC/C,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAY;IAE1C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;IAEzB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAM7C,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAMjD,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,SAAK,GAAG,IAAI;IAQ9D,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI;IAMhD,uBAAuB,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,GAAG,IAAI;IAM/D,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKjC,QAAQ,IAAI,WAAW,EAAE;IAIzB,WAAW,IAAI,WAAW,GAAG,SAAS;IAItC,YAAY,IAAI,MAAM;IAItB,aAAa,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO;IAIhE,KAAK,IAAI,IAAI;IAQP,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAuChD,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,eAAe,CAAC;IAsDxE,OAAO,CAAC,cAAc;CASvB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
@@ -0,0 +1,149 @@
1
+ import { nanoid } from 'nanoid';
2
+ export class MockLLMBackend {
3
+ provider = 'openai';
4
+ responses = [];
5
+ streamChunks = [];
6
+ _calls = [];
7
+ responseIndex = 0;
8
+ streamIndex = 0;
9
+ defaultDelay = 0;
10
+ setResponse(response) {
11
+ this.responses = [response];
12
+ this.responseIndex = 0;
13
+ return this;
14
+ }
15
+ setResponses(responses) {
16
+ this.responses = responses;
17
+ this.responseIndex = 0;
18
+ return this;
19
+ }
20
+ setToolCallResponse(toolCalls, content = '') {
21
+ return this.setResponse({
22
+ content,
23
+ toolCalls,
24
+ finishReason: 'tool_calls',
25
+ });
26
+ }
27
+ setStreamChunks(chunks) {
28
+ this.streamChunks = [chunks];
29
+ this.streamIndex = 0;
30
+ return this;
31
+ }
32
+ setMultipleStreamChunks(chunksArray) {
33
+ this.streamChunks = chunksArray;
34
+ this.streamIndex = 0;
35
+ return this;
36
+ }
37
+ setDefaultDelay(ms) {
38
+ this.defaultDelay = ms;
39
+ return this;
40
+ }
41
+ getCalls() {
42
+ return [...this._calls];
43
+ }
44
+ getLastCall() {
45
+ return this._calls[this._calls.length - 1];
46
+ }
47
+ getCallCount() {
48
+ return this._calls.length;
49
+ }
50
+ wasCalledWith(predicate) {
51
+ return this._calls.some(predicate);
52
+ }
53
+ reset() {
54
+ this._calls = [];
55
+ this.responses = [];
56
+ this.streamChunks = [];
57
+ this.responseIndex = 0;
58
+ this.streamIndex = 0;
59
+ }
60
+ async chat(request) {
61
+ this._calls.push(request);
62
+ const mockResponse = this.responses[this.responseIndex] ?? this.responses[0];
63
+ if (this.responseIndex < this.responses.length - 1) {
64
+ this.responseIndex++;
65
+ }
66
+ if (mockResponse?.error) {
67
+ throw mockResponse.error;
68
+ }
69
+ const delay = mockResponse?.delay ?? this.defaultDelay;
70
+ if (delay > 0) {
71
+ await new Promise((resolve) => setTimeout(resolve, delay));
72
+ }
73
+ const id = `mock_${nanoid(8)}`;
74
+ const content = mockResponse?.content ?? '';
75
+ const toolCalls = mockResponse?.toolCalls;
76
+ const finishReason = mockResponse?.finishReason ?? (toolCalls ? 'tool_calls' : 'stop');
77
+ const inputTokens = mockResponse?.usage?.inputTokens ?? this.estimateTokens(request.messages);
78
+ const outputTokens = mockResponse?.usage?.outputTokens ?? Math.ceil(content.length / 4);
79
+ return {
80
+ id,
81
+ content,
82
+ toolCalls,
83
+ finishReason,
84
+ usage: {
85
+ inputTokens,
86
+ outputTokens,
87
+ totalTokens: inputTokens + outputTokens,
88
+ ...mockResponse?.usage,
89
+ },
90
+ };
91
+ }
92
+ async *chatStream(request) {
93
+ this._calls.push(request);
94
+ const chunks = this.streamChunks[this.streamIndex] ?? this.streamChunks[0] ?? [];
95
+ if (this.streamIndex < this.streamChunks.length - 1) {
96
+ this.streamIndex++;
97
+ }
98
+ const id = `mock_stream_${nanoid(8)}`;
99
+ let totalContent = '';
100
+ for (let i = 0; i < chunks.length; i++) {
101
+ const chunk = chunks[i];
102
+ const delay = chunk.delay ?? this.defaultDelay;
103
+ if (delay > 0) {
104
+ await new Promise((resolve) => setTimeout(resolve, delay));
105
+ }
106
+ if (chunk.content) {
107
+ totalContent += chunk.content;
108
+ }
109
+ const isLast = i === chunks.length - 1;
110
+ const inputTokens = this.estimateTokens(request.messages);
111
+ const outputTokens = Math.ceil(totalContent.length / 4);
112
+ yield {
113
+ id,
114
+ delta: {
115
+ content: chunk.content,
116
+ toolCalls: chunk.toolCalls,
117
+ },
118
+ finishReason: isLast ? (chunk.finishReason ?? 'stop') : undefined,
119
+ usage: isLast
120
+ ? {
121
+ inputTokens,
122
+ outputTokens,
123
+ totalTokens: inputTokens + outputTokens,
124
+ }
125
+ : undefined,
126
+ };
127
+ }
128
+ if (chunks.length === 0) {
129
+ yield {
130
+ id,
131
+ delta: { content: '' },
132
+ finishReason: 'stop',
133
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
134
+ };
135
+ }
136
+ }
137
+ estimateTokens(messages) {
138
+ let total = 0;
139
+ for (const msg of messages) {
140
+ if (typeof msg.content === 'string') {
141
+ total += Math.ceil(msg.content.length / 4);
142
+ }
143
+ }
144
+ return Math.max(total, 1);
145
+ }
146
+ }
147
+ export function createMockLLMBackend() {
148
+ return new MockLLMBackend();
149
+ }
@@ -0,0 +1,31 @@
1
+ import type { MemoryAdapter, MemoryEntry, Thread, MemoryResult, MemoryProvider, MemoryQueryOptions } from '@cogitator-ai/types';
2
+ export declare class MockMemoryAdapter implements MemoryAdapter {
3
+ readonly provider: MemoryProvider;
4
+ private threads;
5
+ private entries;
6
+ private _connected;
7
+ private _calls;
8
+ connect(): Promise<MemoryResult<void>>;
9
+ disconnect(): Promise<MemoryResult<void>>;
10
+ isConnected(): boolean;
11
+ createThread(agentId: string, metadata?: Record<string, unknown>, threadId?: string): Promise<MemoryResult<Thread>>;
12
+ getThread(threadId: string): Promise<MemoryResult<Thread | null>>;
13
+ updateThread(threadId: string, metadata: Record<string, unknown>): Promise<MemoryResult<Thread>>;
14
+ deleteThread(threadId: string): Promise<MemoryResult<void>>;
15
+ addEntry(entry: Omit<MemoryEntry, 'id' | 'createdAt'>): Promise<MemoryResult<MemoryEntry>>;
16
+ getEntries(options: MemoryQueryOptions): Promise<MemoryResult<MemoryEntry[]>>;
17
+ getEntry(entryId: string): Promise<MemoryResult<MemoryEntry | null>>;
18
+ deleteEntry(entryId: string): Promise<MemoryResult<void>>;
19
+ clearThread(threadId: string): Promise<MemoryResult<void>>;
20
+ getCalls(): Array<{
21
+ method: string;
22
+ args: unknown[];
23
+ }>;
24
+ getCallsFor(method: string): Array<{
25
+ method: string;
26
+ args: unknown[];
27
+ }>;
28
+ reset(): void;
29
+ }
30
+ export declare function createMockMemoryAdapter(): MockMemoryAdapter;
31
+ //# sourceMappingURL=mock-memory-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-memory-adapter.d.ts","sourceRoot":"","sources":["../../src/mocks/mock-memory-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,MAAM,EACN,YAAY,EACZ,cAAc,EACd,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAY;IAE7C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAkD;IAE1D,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAMtC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAM/C,WAAW,IAAI,OAAO;IAIhB,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAiB1B,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAMjE,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAc1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAO3D,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAqB1F,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAoB7E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAapE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAezD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAMhE,QAAQ,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAItD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAIvE,KAAK,IAAI,IAAI;CAMd;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
@@ -0,0 +1,128 @@
1
+ import { nanoid } from 'nanoid';
2
+ export class MockMemoryAdapter {
3
+ provider = 'memory';
4
+ threads = new Map();
5
+ entries = new Map();
6
+ _connected = false;
7
+ _calls = [];
8
+ async connect() {
9
+ this._calls.push({ method: 'connect', args: [] });
10
+ this._connected = true;
11
+ return { success: true, data: undefined };
12
+ }
13
+ async disconnect() {
14
+ this._calls.push({ method: 'disconnect', args: [] });
15
+ this._connected = false;
16
+ return { success: true, data: undefined };
17
+ }
18
+ isConnected() {
19
+ return this._connected;
20
+ }
21
+ async createThread(agentId, metadata, threadId) {
22
+ this._calls.push({ method: 'createThread', args: [agentId, metadata, threadId] });
23
+ const thread = {
24
+ id: threadId ?? `thread_${nanoid(8)}`,
25
+ agentId,
26
+ createdAt: new Date(),
27
+ updatedAt: new Date(),
28
+ metadata: metadata ?? {},
29
+ };
30
+ this.threads.set(thread.id, thread);
31
+ this.entries.set(thread.id, []);
32
+ return { success: true, data: thread };
33
+ }
34
+ async getThread(threadId) {
35
+ this._calls.push({ method: 'getThread', args: [threadId] });
36
+ const thread = this.threads.get(threadId) ?? null;
37
+ return { success: true, data: thread };
38
+ }
39
+ async updateThread(threadId, metadata) {
40
+ this._calls.push({ method: 'updateThread', args: [threadId, metadata] });
41
+ const thread = this.threads.get(threadId);
42
+ if (!thread) {
43
+ return { success: false, error: `Thread ${threadId} not found` };
44
+ }
45
+ thread.metadata = { ...thread.metadata, ...metadata };
46
+ thread.updatedAt = new Date();
47
+ return { success: true, data: thread };
48
+ }
49
+ async deleteThread(threadId) {
50
+ this._calls.push({ method: 'deleteThread', args: [threadId] });
51
+ this.threads.delete(threadId);
52
+ this.entries.delete(threadId);
53
+ return { success: true, data: undefined };
54
+ }
55
+ async addEntry(entry) {
56
+ this._calls.push({ method: 'addEntry', args: [entry] });
57
+ const memoryEntry = {
58
+ id: `entry_${nanoid(8)}`,
59
+ threadId: entry.threadId,
60
+ message: entry.message,
61
+ tokenCount: entry.tokenCount ?? 0,
62
+ createdAt: new Date(),
63
+ toolCalls: entry.toolCalls,
64
+ toolResults: entry.toolResults,
65
+ metadata: entry.metadata,
66
+ };
67
+ const threadEntries = this.entries.get(entry.threadId) ?? [];
68
+ threadEntries.push(memoryEntry);
69
+ this.entries.set(entry.threadId, threadEntries);
70
+ return { success: true, data: memoryEntry };
71
+ }
72
+ async getEntries(options) {
73
+ this._calls.push({ method: 'getEntries', args: [options] });
74
+ let entries = this.entries.get(options.threadId) ?? [];
75
+ if (options.before) {
76
+ entries = entries.filter((e) => e.createdAt < options.before);
77
+ }
78
+ if (options.after) {
79
+ entries = entries.filter((e) => e.createdAt > options.after);
80
+ }
81
+ if (options.limit) {
82
+ entries = entries.slice(-options.limit);
83
+ }
84
+ return { success: true, data: entries };
85
+ }
86
+ async getEntry(entryId) {
87
+ this._calls.push({ method: 'getEntry', args: [entryId] });
88
+ for (const threadEntries of this.entries.values()) {
89
+ const entry = threadEntries.find((e) => e.id === entryId);
90
+ if (entry) {
91
+ return { success: true, data: entry };
92
+ }
93
+ }
94
+ return { success: true, data: null };
95
+ }
96
+ async deleteEntry(entryId) {
97
+ this._calls.push({ method: 'deleteEntry', args: [entryId] });
98
+ for (const [threadId, threadEntries] of this.entries.entries()) {
99
+ const index = threadEntries.findIndex((e) => e.id === entryId);
100
+ if (index !== -1) {
101
+ threadEntries.splice(index, 1);
102
+ this.entries.set(threadId, threadEntries);
103
+ break;
104
+ }
105
+ }
106
+ return { success: true, data: undefined };
107
+ }
108
+ async clearThread(threadId) {
109
+ this._calls.push({ method: 'clearThread', args: [threadId] });
110
+ this.entries.set(threadId, []);
111
+ return { success: true, data: undefined };
112
+ }
113
+ getCalls() {
114
+ return [...this._calls];
115
+ }
116
+ getCallsFor(method) {
117
+ return this._calls.filter((c) => c.method === method);
118
+ }
119
+ reset() {
120
+ this.threads.clear();
121
+ this.entries.clear();
122
+ this._calls = [];
123
+ this._connected = false;
124
+ }
125
+ }
126
+ export function createMockMemoryAdapter() {
127
+ return new MockMemoryAdapter();
128
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@cogitator-ai/test-utils",
3
+ "version": "0.1.3",
4
+ "description": "Shared testing utilities for Cogitator packages",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "clean": "rm -rf dist",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest"
24
+ },
25
+ "dependencies": {
26
+ "@cogitator-ai/types": "workspace:*",
27
+ "nanoid": "^5.0.4"
28
+ },
29
+ "devDependencies": {
30
+ "typescript": "^5.3.0",
31
+ "vitest": "^4.0.18"
32
+ },
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/cogitator-ai/Cogitator-AI.git",
36
+ "directory": "packages/test-utils"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public",
40
+ "registry": "https://npm.pkg.github.com"
41
+ },
42
+ "license": "MIT"
43
+ }