@axlsdk/testing 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -55,6 +55,12 @@ const provider = MockProvider.sequence([
55
55
  ]);
56
56
  ```
57
57
 
58
+ All model parameters (`thinking`, `temperature`, `maxTokens`, `toolChoice`, `stop`) flow through MockProvider transparently. They don't affect mock responses but are recorded in `provider.calls` for assertion:
59
+
60
+ ```typescript
61
+ expect(provider.calls[0].options.thinking).toBe('high');
62
+ ```
63
+
58
64
  ### `MockTool`
59
65
 
60
66
  Create a mock tool to intercept and record calls:
package/dist/index.cjs CHANGED
@@ -287,15 +287,7 @@ var AxlTestRuntime = class {
287
287
  }
288
288
  },
289
289
  onAgentCallComplete: (call) => {
290
- this._agentCalls.push({
291
- agent: call.agent,
292
- prompt: call.prompt,
293
- response: call.response,
294
- model: call.model,
295
- cost: call.cost,
296
- duration: call.duration,
297
- promptVersion: call.promptVersion
298
- });
290
+ this._agentCalls.push(call);
299
291
  }
300
292
  };
301
293
  const ctx = new import_axl.WorkflowContext(init);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/mock-provider.ts","../src/mock-tool.ts","../src/test-runtime.ts"],"sourcesContent":["export { AxlTestRuntime } from './test-runtime.js';\nexport type { RecordedToolCall, RecordedAgentCall, RecordedStep } from './test-runtime.js';\nexport { MockProvider } from './mock-provider.js';\nexport { MockTool } from './mock-tool.js';\n","import { readFileSync } from 'node:fs';\nimport type {\n ChatMessage,\n ChatOptions,\n ToolCallMessage,\n ProviderResponse,\n StreamChunk,\n Provider,\n} from '@axlsdk/axl';\n\nfunction randomAlphanumeric(length: number): string {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n}\n\nfunction generateFromSchema(schema: unknown): unknown {\n const def = (schema as Record<string, unknown> | null)?._def as\n | Record<string, unknown>\n | undefined;\n if (!def) return {};\n switch (def.typeName) {\n case 'ZodString': {\n const length = 8 + Math.floor(Math.random() * 13); // 8-20 chars\n return randomAlphanumeric(length);\n }\n case 'ZodNumber': {\n const checks: Array<{ kind: string; value: number }> =\n (def.checks as Array<{ kind: string; value: number }>) ?? [];\n let min = 0;\n let max = 100;\n for (const check of checks) {\n if (check.kind === 'min') min = check.value;\n if (check.kind === 'max') max = check.value;\n }\n return min + Math.random() * (max - min);\n }\n case 'ZodBoolean':\n return Math.random() < 0.5;\n case 'ZodArray': {\n const count = 1 + Math.floor(Math.random() * 3); // 1-3 items\n const items: unknown[] = [];\n for (let i = 0; i < count; i++) {\n items.push(generateFromSchema(def.type));\n }\n return items;\n }\n case 'ZodObject': {\n const shapeFn = def.shape as (() => Record<string, unknown>) | undefined;\n const shape = shapeFn?.() ?? {};\n const obj: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n obj[key] = generateFromSchema(value);\n }\n return obj;\n }\n case 'ZodOptional': {\n if (Math.random() < 0.5) return undefined;\n return generateFromSchema(def.innerType);\n }\n case 'ZodDefault':\n return (def.defaultValue as () => unknown)();\n case 'ZodEnum': {\n const values: unknown[] = (def.values as unknown[]) ?? [];\n if (values.length === 0) return '';\n return values[Math.floor(Math.random() * values.length)];\n }\n case 'ZodNullable':\n return null;\n default:\n return {};\n }\n}\n\nexport class MockProvider implements Provider {\n readonly name = 'mock';\n private _calls: { messages: ChatMessage[]; options: ChatOptions }[] = [];\n\n private constructor(\n private responseFn: (messages: ChatMessage[], callIndex: number) => ProviderResponse,\n ) {}\n\n get calls() {\n return this._calls;\n }\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n this._calls.push({ messages, options });\n return this.responseFn(messages, this._calls.length - 1);\n }\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const response = await this.chat(messages, options);\n yield { type: 'text_delta', content: response.content };\n yield { type: 'done', usage: response.usage };\n }\n\n static sequence(\n responses: Array<{ content: string; tool_calls?: ToolCallMessage[] }>,\n ): MockProvider {\n return new MockProvider((_messages, callIndex) => {\n if (callIndex >= responses.length) {\n throw new Error(\n `MockProvider.sequence: no response for call index ${callIndex}. Only ${responses.length} responses defined.`,\n );\n }\n return {\n content: responses[callIndex].content,\n tool_calls: responses[callIndex].tool_calls,\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n };\n });\n }\n\n static echo(): MockProvider {\n return new MockProvider((messages) => {\n const lastUser = [...messages].reverse().find((m) => m.role === 'user');\n return {\n content: lastUser?.content ?? '',\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n };\n });\n }\n\n static json(schema: unknown): MockProvider {\n return new MockProvider(() => ({\n content: JSON.stringify(generateFromSchema(schema)),\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n }));\n }\n\n static replay(source: string | ProviderResponse[]): MockProvider {\n const data =\n typeof source === 'string'\n ? (JSON.parse(readFileSync(source, 'utf-8')) as ProviderResponse[])\n : source;\n return new MockProvider((_messages, callIndex) => {\n if (callIndex >= data.length) {\n throw new Error(`MockProvider.replay: no recorded response for call index ${callIndex}`);\n }\n return data[callIndex];\n });\n }\n\n static fn(\n handler: (\n messages: ChatMessage[],\n callIndex: number,\n ) => { content: string; tool_calls?: ToolCallMessage[] },\n ): MockProvider {\n return new MockProvider((messages, callIndex) => ({\n ...handler(messages, callIndex),\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n }));\n }\n}\n","export class MockTool {\n private _calls: { input: unknown }[] = [];\n\n constructor(\n readonly name: string,\n private handler: (input: unknown) => unknown | Promise<unknown>,\n ) {}\n\n get calls() {\n return this._calls;\n }\n\n async execute(input: unknown): Promise<unknown> {\n this._calls.push({ input });\n return this.handler(input);\n }\n\n static create(name: string, handler: (input: unknown) => unknown | Promise<unknown>): MockTool {\n return new MockTool(name, handler);\n }\n}\n","import { MockProvider } from './mock-provider.js';\nimport { MockTool } from './mock-tool.js';\nimport type { TraceEvent, AwaitHumanOptions, HumanDecision, ProviderResponse } from '@axlsdk/axl';\nimport { WorkflowContext, MemoryStore, ProviderRegistry } from '@axlsdk/axl';\nimport type { WorkflowContextInit } from '@axlsdk/axl';\n\ninterface WorkflowLike {\n readonly name: string;\n readonly inputSchema: { parse: (input: unknown) => unknown };\n readonly outputSchema: { parse: (input: unknown) => unknown } | undefined;\n readonly handler: (ctx: WorkflowContext) => Promise<unknown>;\n}\n\nexport type RecordedToolCall = { name: string; args: unknown; result: unknown };\nexport type RecordedAgentCall = {\n agent: string;\n prompt: string;\n response: string;\n model?: string;\n cost?: number;\n duration?: number;\n promptVersion?: string;\n};\nexport type RecordedStep = { step: number; type: string; data: unknown };\n\nfunction generateExecutionId(): string {\n return `test-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport type AxlTestRuntimeOptions = {\n record?: string;\n humanDecisions?: (options: AwaitHumanOptions) => HumanDecision;\n};\n\nexport class AxlTestRuntime {\n private workflows = new Map<string, WorkflowLike>();\n private mockProviders = new Map<string, MockProvider>();\n private mockToolMap = new Map<string, MockTool>();\n private _toolCalls: RecordedToolCall[] = [];\n private _agentCalls: RecordedAgentCall[] = [];\n private _steps: RecordedStep[] = [];\n private _traceLog: TraceEvent[] = [];\n private _totalCost = 0;\n private _stepCounter = 0;\n private recordPath?: string;\n private recorded: ProviderResponse[] = [];\n private _executionId: string = generateExecutionId();\n private _humanDecisionHandler?: (options: AwaitHumanOptions) => HumanDecision;\n\n constructor(options?: AxlTestRuntimeOptions) {\n this.recordPath = options?.record;\n this._humanDecisionHandler = options?.humanDecisions;\n }\n\n register(workflow: WorkflowLike): void {\n this.workflows.set(workflow.name, workflow);\n }\n\n mockProvider(name: string, provider: MockProvider): void {\n this.mockProviders.set(name, provider);\n }\n\n mockTool(name: string, handler: (input: unknown) => unknown | Promise<unknown>): void {\n this.mockToolMap.set(name, MockTool.create(name, handler));\n }\n\n async execute(\n workflowName: string,\n input: unknown,\n options?: { metadata?: Record<string, unknown> },\n ): Promise<unknown> {\n const workflow = this.workflows.get(workflowName);\n if (!workflow) throw new Error(`Workflow \"${workflowName}\" not registered`);\n\n // Reset state between executions\n this._toolCalls = [];\n this._agentCalls = [];\n this._steps = [];\n this._traceLog = [];\n this._totalCost = 0;\n this._stepCounter = 0;\n this.recorded = [];\n this._executionId = generateExecutionId();\n\n const validated = workflow.inputSchema.parse(input);\n\n // Build ProviderRegistry from registered mock providers\n const registry = new ProviderRegistry();\n registry.clearFactories(); // Remove built-in factories; only use explicit mocks\n for (const [name, provider] of this.mockProviders) {\n registry.registerInstance(name, provider);\n }\n // Fallback resolution: 'default' key or single-provider\n const defaultProvider = this.mockProviders.get('default');\n if (defaultProvider) {\n registry.setFallback(defaultProvider);\n } else if (this.mockProviders.size === 1) {\n const onlyProvider = this.mockProviders.values().next().value!;\n registry.setFallback(onlyProvider);\n }\n\n // Build toolOverrides from mockToolMap\n const toolOverrides = new Map<string, (args: unknown) => Promise<unknown>>();\n for (const [name, mockTool] of this.mockToolMap) {\n toolOverrides.set(name, async (args: unknown) => {\n return mockTool.execute(args);\n });\n }\n\n // Record steps and traces via callbacks\n this._recordStep('workflow_start', { workflow: workflowName, input: validated });\n this._pushTrace({\n type: 'workflow_start',\n workflow: workflowName,\n data: { input: validated },\n });\n\n const init: WorkflowContextInit = {\n input: validated,\n executionId: this._executionId,\n metadata: options?.metadata,\n config: {},\n providerRegistry: registry,\n stateStore: new MemoryStore(),\n toolOverrides: toolOverrides.size > 0 ? toolOverrides : undefined,\n awaitHumanHandler: this._humanDecisionHandler\n ? (opts: AwaitHumanOptions) => this._humanDecisionHandler!(opts)\n : undefined,\n onTrace: (event: TraceEvent) => {\n this._traceLog.push(event);\n this._stepCounter++;\n this._steps.push({ step: this._stepCounter, type: event.type, data: event.data });\n\n if (event.type === 'tool_call' && event.data) {\n const { args, result } = event.data as { args: unknown; result: unknown };\n this._toolCalls.push({ name: event.tool!, args, result });\n }\n\n if (event.cost) {\n this._totalCost += event.cost;\n }\n\n // Track provider responses for recording\n if (event.type === 'agent_call' && event.data) {\n const { response } = event.data as { prompt?: string; response?: string };\n if (response !== undefined) {\n this.recorded.push({\n content: response,\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n cost: event.cost ?? 0,\n });\n }\n }\n },\n onAgentCallComplete: (call: {\n agent: string;\n prompt: string;\n response: string;\n model: string;\n cost: number;\n duration: number;\n promptVersion?: string;\n }) => {\n this._agentCalls.push({\n agent: call.agent,\n prompt: call.prompt,\n response: call.response,\n model: call.model,\n cost: call.cost,\n duration: call.duration,\n promptVersion: call.promptVersion,\n });\n },\n };\n\n const ctx = new WorkflowContext(init);\n const result = await workflow.handler(ctx);\n\n // Validate output schema if defined\n if (workflow.outputSchema) workflow.outputSchema.parse(result);\n\n this._recordStep('workflow_end', { workflow: workflowName, result });\n this._pushTrace({\n type: 'workflow_end',\n workflow: workflowName,\n data: { result },\n });\n\n if (this.recordPath) await this._writeRecording();\n return result;\n }\n\n toolCalls(name?: string): RecordedToolCall[] {\n return name ? this._toolCalls.filter((c) => c.name === name) : this._toolCalls;\n }\n\n agentCalls(name?: string): RecordedAgentCall[] {\n return name ? this._agentCalls.filter((c) => c.agent === name) : this._agentCalls;\n }\n\n totalCost(): number {\n return this._totalCost;\n }\n steps(): RecordedStep[] {\n return this._steps;\n }\n traceLog(): TraceEvent[] {\n return this._traceLog;\n }\n\n private _recordStep(type: string, data: unknown): void {\n this._stepCounter++;\n this._steps.push({ step: this._stepCounter, type, data });\n }\n\n private _pushTrace(partial: Omit<TraceEvent, 'executionId' | 'step' | 'timestamp'>): void {\n this._traceLog.push({\n executionId: this._executionId,\n step: this._stepCounter,\n timestamp: Date.now(),\n ...partial,\n });\n }\n\n private async _writeRecording(): Promise<void> {\n if (!this.recordPath) return;\n const { writeFile, mkdir } = await import('node:fs/promises');\n const { dirname } = await import('node:path');\n await mkdir(dirname(this.recordPath), { recursive: true });\n await writeFile(this.recordPath, JSON.stringify(this.recorded, null, 2), 'utf8');\n }\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/mock-provider.ts","../src/mock-tool.ts","../src/test-runtime.ts"],"sourcesContent":["export { AxlTestRuntime } from './test-runtime.js';\nexport type { RecordedToolCall, RecordedAgentCall, RecordedStep } from './test-runtime.js';\nexport { MockProvider } from './mock-provider.js';\nexport { MockTool } from './mock-tool.js';\n","import { readFileSync } from 'node:fs';\nimport type {\n ChatMessage,\n ChatOptions,\n ToolCallMessage,\n ProviderResponse,\n StreamChunk,\n Provider,\n} from '@axlsdk/axl';\n\nfunction randomAlphanumeric(length: number): string {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n}\n\nfunction generateFromSchema(schema: unknown): unknown {\n const def = (schema as Record<string, unknown> | null)?._def as\n | Record<string, unknown>\n | undefined;\n if (!def) return {};\n switch (def.typeName) {\n case 'ZodString': {\n const length = 8 + Math.floor(Math.random() * 13); // 8-20 chars\n return randomAlphanumeric(length);\n }\n case 'ZodNumber': {\n const checks: Array<{ kind: string; value: number }> =\n (def.checks as Array<{ kind: string; value: number }>) ?? [];\n let min = 0;\n let max = 100;\n for (const check of checks) {\n if (check.kind === 'min') min = check.value;\n if (check.kind === 'max') max = check.value;\n }\n return min + Math.random() * (max - min);\n }\n case 'ZodBoolean':\n return Math.random() < 0.5;\n case 'ZodArray': {\n const count = 1 + Math.floor(Math.random() * 3); // 1-3 items\n const items: unknown[] = [];\n for (let i = 0; i < count; i++) {\n items.push(generateFromSchema(def.type));\n }\n return items;\n }\n case 'ZodObject': {\n const shapeFn = def.shape as (() => Record<string, unknown>) | undefined;\n const shape = shapeFn?.() ?? {};\n const obj: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n obj[key] = generateFromSchema(value);\n }\n return obj;\n }\n case 'ZodOptional': {\n if (Math.random() < 0.5) return undefined;\n return generateFromSchema(def.innerType);\n }\n case 'ZodDefault':\n return (def.defaultValue as () => unknown)();\n case 'ZodEnum': {\n const values: unknown[] = (def.values as unknown[]) ?? [];\n if (values.length === 0) return '';\n return values[Math.floor(Math.random() * values.length)];\n }\n case 'ZodNullable':\n return null;\n default:\n return {};\n }\n}\n\nexport class MockProvider implements Provider {\n readonly name = 'mock';\n private _calls: { messages: ChatMessage[]; options: ChatOptions }[] = [];\n\n private constructor(\n private responseFn: (messages: ChatMessage[], callIndex: number) => ProviderResponse,\n ) {}\n\n get calls() {\n return this._calls;\n }\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n this._calls.push({ messages, options });\n return this.responseFn(messages, this._calls.length - 1);\n }\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const response = await this.chat(messages, options);\n yield { type: 'text_delta', content: response.content };\n yield { type: 'done', usage: response.usage };\n }\n\n static sequence(\n responses: Array<{ content: string; tool_calls?: ToolCallMessage[] }>,\n ): MockProvider {\n return new MockProvider((_messages, callIndex) => {\n if (callIndex >= responses.length) {\n throw new Error(\n `MockProvider.sequence: no response for call index ${callIndex}. Only ${responses.length} responses defined.`,\n );\n }\n return {\n content: responses[callIndex].content,\n tool_calls: responses[callIndex].tool_calls,\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n };\n });\n }\n\n static echo(): MockProvider {\n return new MockProvider((messages) => {\n const lastUser = [...messages].reverse().find((m) => m.role === 'user');\n return {\n content: lastUser?.content ?? '',\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n };\n });\n }\n\n static json(schema: unknown): MockProvider {\n return new MockProvider(() => ({\n content: JSON.stringify(generateFromSchema(schema)),\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n }));\n }\n\n static replay(source: string | ProviderResponse[]): MockProvider {\n const data =\n typeof source === 'string'\n ? (JSON.parse(readFileSync(source, 'utf-8')) as ProviderResponse[])\n : source;\n return new MockProvider((_messages, callIndex) => {\n if (callIndex >= data.length) {\n throw new Error(`MockProvider.replay: no recorded response for call index ${callIndex}`);\n }\n return data[callIndex];\n });\n }\n\n static fn(\n handler: (\n messages: ChatMessage[],\n callIndex: number,\n ) => { content: string; tool_calls?: ToolCallMessage[] },\n ): MockProvider {\n return new MockProvider((messages, callIndex) => ({\n ...handler(messages, callIndex),\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n }));\n }\n}\n","export class MockTool {\n private _calls: { input: unknown }[] = [];\n\n constructor(\n readonly name: string,\n private handler: (input: unknown) => unknown | Promise<unknown>,\n ) {}\n\n get calls() {\n return this._calls;\n }\n\n async execute(input: unknown): Promise<unknown> {\n this._calls.push({ input });\n return this.handler(input);\n }\n\n static create(name: string, handler: (input: unknown) => unknown | Promise<unknown>): MockTool {\n return new MockTool(name, handler);\n }\n}\n","import { MockProvider } from './mock-provider.js';\nimport { MockTool } from './mock-tool.js';\nimport type {\n TraceEvent,\n AwaitHumanOptions,\n HumanDecision,\n ProviderResponse,\n AgentCallInfo,\n} from '@axlsdk/axl';\nimport { WorkflowContext, MemoryStore, ProviderRegistry } from '@axlsdk/axl';\nimport type { WorkflowContextInit } from '@axlsdk/axl';\n\ninterface WorkflowLike {\n readonly name: string;\n readonly inputSchema: { parse: (input: unknown) => unknown };\n readonly outputSchema: { parse: (input: unknown) => unknown } | undefined;\n readonly handler: (ctx: WorkflowContext) => Promise<unknown>;\n}\n\nexport type RecordedToolCall = { name: string; args: unknown; result: unknown };\nexport type RecordedAgentCall = Partial<AgentCallInfo> &\n Pick<AgentCallInfo, 'agent' | 'prompt' | 'response'>;\nexport type RecordedStep = { step: number; type: string; data: unknown };\n\nfunction generateExecutionId(): string {\n return `test-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport type AxlTestRuntimeOptions = {\n record?: string;\n humanDecisions?: (options: AwaitHumanOptions) => HumanDecision;\n};\n\nexport class AxlTestRuntime {\n private workflows = new Map<string, WorkflowLike>();\n private mockProviders = new Map<string, MockProvider>();\n private mockToolMap = new Map<string, MockTool>();\n private _toolCalls: RecordedToolCall[] = [];\n private _agentCalls: RecordedAgentCall[] = [];\n private _steps: RecordedStep[] = [];\n private _traceLog: TraceEvent[] = [];\n private _totalCost = 0;\n private _stepCounter = 0;\n private recordPath?: string;\n private recorded: ProviderResponse[] = [];\n private _executionId: string = generateExecutionId();\n private _humanDecisionHandler?: (options: AwaitHumanOptions) => HumanDecision;\n\n constructor(options?: AxlTestRuntimeOptions) {\n this.recordPath = options?.record;\n this._humanDecisionHandler = options?.humanDecisions;\n }\n\n register(workflow: WorkflowLike): void {\n this.workflows.set(workflow.name, workflow);\n }\n\n mockProvider(name: string, provider: MockProvider): void {\n this.mockProviders.set(name, provider);\n }\n\n mockTool(name: string, handler: (input: unknown) => unknown | Promise<unknown>): void {\n this.mockToolMap.set(name, MockTool.create(name, handler));\n }\n\n async execute(\n workflowName: string,\n input: unknown,\n options?: { metadata?: Record<string, unknown> },\n ): Promise<unknown> {\n const workflow = this.workflows.get(workflowName);\n if (!workflow) throw new Error(`Workflow \"${workflowName}\" not registered`);\n\n // Reset state between executions\n this._toolCalls = [];\n this._agentCalls = [];\n this._steps = [];\n this._traceLog = [];\n this._totalCost = 0;\n this._stepCounter = 0;\n this.recorded = [];\n this._executionId = generateExecutionId();\n\n const validated = workflow.inputSchema.parse(input);\n\n // Build ProviderRegistry from registered mock providers\n const registry = new ProviderRegistry();\n registry.clearFactories(); // Remove built-in factories; only use explicit mocks\n for (const [name, provider] of this.mockProviders) {\n registry.registerInstance(name, provider);\n }\n // Fallback resolution: 'default' key or single-provider\n const defaultProvider = this.mockProviders.get('default');\n if (defaultProvider) {\n registry.setFallback(defaultProvider);\n } else if (this.mockProviders.size === 1) {\n const onlyProvider = this.mockProviders.values().next().value!;\n registry.setFallback(onlyProvider);\n }\n\n // Build toolOverrides from mockToolMap\n const toolOverrides = new Map<string, (args: unknown) => Promise<unknown>>();\n for (const [name, mockTool] of this.mockToolMap) {\n toolOverrides.set(name, async (args: unknown) => {\n return mockTool.execute(args);\n });\n }\n\n // Record steps and traces via callbacks\n this._recordStep('workflow_start', { workflow: workflowName, input: validated });\n this._pushTrace({\n type: 'workflow_start',\n workflow: workflowName,\n data: { input: validated },\n });\n\n const init: WorkflowContextInit = {\n input: validated,\n executionId: this._executionId,\n metadata: options?.metadata,\n config: {},\n providerRegistry: registry,\n stateStore: new MemoryStore(),\n toolOverrides: toolOverrides.size > 0 ? toolOverrides : undefined,\n awaitHumanHandler: this._humanDecisionHandler\n ? (opts: AwaitHumanOptions) => this._humanDecisionHandler!(opts)\n : undefined,\n onTrace: (event: TraceEvent) => {\n this._traceLog.push(event);\n this._stepCounter++;\n this._steps.push({ step: this._stepCounter, type: event.type, data: event.data });\n\n if (event.type === 'tool_call' && event.data) {\n const { args, result } = event.data as { args: unknown; result: unknown };\n this._toolCalls.push({ name: event.tool!, args, result });\n }\n\n if (event.cost) {\n this._totalCost += event.cost;\n }\n\n // Track provider responses for recording\n if (event.type === 'agent_call' && event.data) {\n const { response } = event.data as { prompt?: string; response?: string };\n if (response !== undefined) {\n this.recorded.push({\n content: response,\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n cost: event.cost ?? 0,\n });\n }\n }\n },\n onAgentCallComplete: (call: AgentCallInfo) => {\n this._agentCalls.push(call);\n },\n };\n\n const ctx = new WorkflowContext(init);\n const result = await workflow.handler(ctx);\n\n // Validate output schema if defined\n if (workflow.outputSchema) workflow.outputSchema.parse(result);\n\n this._recordStep('workflow_end', { workflow: workflowName, result });\n this._pushTrace({\n type: 'workflow_end',\n workflow: workflowName,\n data: { result },\n });\n\n if (this.recordPath) await this._writeRecording();\n return result;\n }\n\n toolCalls(name?: string): RecordedToolCall[] {\n return name ? this._toolCalls.filter((c) => c.name === name) : this._toolCalls;\n }\n\n agentCalls(name?: string): RecordedAgentCall[] {\n return name ? this._agentCalls.filter((c) => c.agent === name) : this._agentCalls;\n }\n\n totalCost(): number {\n return this._totalCost;\n }\n steps(): RecordedStep[] {\n return this._steps;\n }\n traceLog(): TraceEvent[] {\n return this._traceLog;\n }\n\n private _recordStep(type: string, data: unknown): void {\n this._stepCounter++;\n this._steps.push({ step: this._stepCounter, type, data });\n }\n\n private _pushTrace(partial: Omit<TraceEvent, 'executionId' | 'step' | 'timestamp'>): void {\n this._traceLog.push({\n executionId: this._executionId,\n step: this._stepCounter,\n timestamp: Date.now(),\n ...partial,\n });\n }\n\n private async _writeRecording(): Promise<void> {\n if (!this.recordPath) return;\n const { writeFile, mkdir } = await import('node:fs/promises');\n const { dirname } = await import('node:path');\n await mkdir(dirname(this.recordPath), { recursive: true });\n await writeFile(this.recordPath, JSON.stringify(this.recorded, null, 2), 'utf8');\n }\n}\n"],"mappings":"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","names":["result"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { Provider, ChatMessage, ChatOptions, ProviderResponse, StreamChunk, ToolCallMessage, AwaitHumanOptions, HumanDecision, WorkflowContext, TraceEvent } from '@axlsdk/axl';
1
+ import { Provider, ChatMessage, ChatOptions, ProviderResponse, StreamChunk, ToolCallMessage, AwaitHumanOptions, HumanDecision, WorkflowContext, AgentCallInfo, TraceEvent } from '@axlsdk/axl';
2
2
 
3
3
  declare class MockProvider implements Provider {
4
4
  private responseFn;
@@ -39,15 +39,7 @@ type RecordedToolCall = {
39
39
  args: unknown;
40
40
  result: unknown;
41
41
  };
42
- type RecordedAgentCall = {
43
- agent: string;
44
- prompt: string;
45
- response: string;
46
- model?: string;
47
- cost?: number;
48
- duration?: number;
49
- promptVersion?: string;
50
- };
42
+ type RecordedAgentCall = Partial<AgentCallInfo> & Pick<AgentCallInfo, 'agent' | 'prompt' | 'response'>;
51
43
  type RecordedStep = {
52
44
  step: number;
53
45
  type: string;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Provider, ChatMessage, ChatOptions, ProviderResponse, StreamChunk, ToolCallMessage, AwaitHumanOptions, HumanDecision, WorkflowContext, TraceEvent } from '@axlsdk/axl';
1
+ import { Provider, ChatMessage, ChatOptions, ProviderResponse, StreamChunk, ToolCallMessage, AwaitHumanOptions, HumanDecision, WorkflowContext, AgentCallInfo, TraceEvent } from '@axlsdk/axl';
2
2
 
3
3
  declare class MockProvider implements Provider {
4
4
  private responseFn;
@@ -39,15 +39,7 @@ type RecordedToolCall = {
39
39
  args: unknown;
40
40
  result: unknown;
41
41
  };
42
- type RecordedAgentCall = {
43
- agent: string;
44
- prompt: string;
45
- response: string;
46
- model?: string;
47
- cost?: number;
48
- duration?: number;
49
- promptVersion?: string;
50
- };
42
+ type RecordedAgentCall = Partial<AgentCallInfo> & Pick<AgentCallInfo, 'agent' | 'prompt' | 'response'>;
51
43
  type RecordedStep = {
52
44
  step: number;
53
45
  type: string;
package/dist/index.js CHANGED
@@ -249,15 +249,7 @@ var AxlTestRuntime = class {
249
249
  }
250
250
  },
251
251
  onAgentCallComplete: (call) => {
252
- this._agentCalls.push({
253
- agent: call.agent,
254
- prompt: call.prompt,
255
- response: call.response,
256
- model: call.model,
257
- cost: call.cost,
258
- duration: call.duration,
259
- promptVersion: call.promptVersion
260
- });
252
+ this._agentCalls.push(call);
261
253
  }
262
254
  };
263
255
  const ctx = new WorkflowContext(init);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mock-provider.ts","../src/mock-tool.ts","../src/test-runtime.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport type {\n ChatMessage,\n ChatOptions,\n ToolCallMessage,\n ProviderResponse,\n StreamChunk,\n Provider,\n} from '@axlsdk/axl';\n\nfunction randomAlphanumeric(length: number): string {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n}\n\nfunction generateFromSchema(schema: unknown): unknown {\n const def = (schema as Record<string, unknown> | null)?._def as\n | Record<string, unknown>\n | undefined;\n if (!def) return {};\n switch (def.typeName) {\n case 'ZodString': {\n const length = 8 + Math.floor(Math.random() * 13); // 8-20 chars\n return randomAlphanumeric(length);\n }\n case 'ZodNumber': {\n const checks: Array<{ kind: string; value: number }> =\n (def.checks as Array<{ kind: string; value: number }>) ?? [];\n let min = 0;\n let max = 100;\n for (const check of checks) {\n if (check.kind === 'min') min = check.value;\n if (check.kind === 'max') max = check.value;\n }\n return min + Math.random() * (max - min);\n }\n case 'ZodBoolean':\n return Math.random() < 0.5;\n case 'ZodArray': {\n const count = 1 + Math.floor(Math.random() * 3); // 1-3 items\n const items: unknown[] = [];\n for (let i = 0; i < count; i++) {\n items.push(generateFromSchema(def.type));\n }\n return items;\n }\n case 'ZodObject': {\n const shapeFn = def.shape as (() => Record<string, unknown>) | undefined;\n const shape = shapeFn?.() ?? {};\n const obj: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n obj[key] = generateFromSchema(value);\n }\n return obj;\n }\n case 'ZodOptional': {\n if (Math.random() < 0.5) return undefined;\n return generateFromSchema(def.innerType);\n }\n case 'ZodDefault':\n return (def.defaultValue as () => unknown)();\n case 'ZodEnum': {\n const values: unknown[] = (def.values as unknown[]) ?? [];\n if (values.length === 0) return '';\n return values[Math.floor(Math.random() * values.length)];\n }\n case 'ZodNullable':\n return null;\n default:\n return {};\n }\n}\n\nexport class MockProvider implements Provider {\n readonly name = 'mock';\n private _calls: { messages: ChatMessage[]; options: ChatOptions }[] = [];\n\n private constructor(\n private responseFn: (messages: ChatMessage[], callIndex: number) => ProviderResponse,\n ) {}\n\n get calls() {\n return this._calls;\n }\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n this._calls.push({ messages, options });\n return this.responseFn(messages, this._calls.length - 1);\n }\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const response = await this.chat(messages, options);\n yield { type: 'text_delta', content: response.content };\n yield { type: 'done', usage: response.usage };\n }\n\n static sequence(\n responses: Array<{ content: string; tool_calls?: ToolCallMessage[] }>,\n ): MockProvider {\n return new MockProvider((_messages, callIndex) => {\n if (callIndex >= responses.length) {\n throw new Error(\n `MockProvider.sequence: no response for call index ${callIndex}. Only ${responses.length} responses defined.`,\n );\n }\n return {\n content: responses[callIndex].content,\n tool_calls: responses[callIndex].tool_calls,\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n };\n });\n }\n\n static echo(): MockProvider {\n return new MockProvider((messages) => {\n const lastUser = [...messages].reverse().find((m) => m.role === 'user');\n return {\n content: lastUser?.content ?? '',\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n };\n });\n }\n\n static json(schema: unknown): MockProvider {\n return new MockProvider(() => ({\n content: JSON.stringify(generateFromSchema(schema)),\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n }));\n }\n\n static replay(source: string | ProviderResponse[]): MockProvider {\n const data =\n typeof source === 'string'\n ? (JSON.parse(readFileSync(source, 'utf-8')) as ProviderResponse[])\n : source;\n return new MockProvider((_messages, callIndex) => {\n if (callIndex >= data.length) {\n throw new Error(`MockProvider.replay: no recorded response for call index ${callIndex}`);\n }\n return data[callIndex];\n });\n }\n\n static fn(\n handler: (\n messages: ChatMessage[],\n callIndex: number,\n ) => { content: string; tool_calls?: ToolCallMessage[] },\n ): MockProvider {\n return new MockProvider((messages, callIndex) => ({\n ...handler(messages, callIndex),\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n }));\n }\n}\n","export class MockTool {\n private _calls: { input: unknown }[] = [];\n\n constructor(\n readonly name: string,\n private handler: (input: unknown) => unknown | Promise<unknown>,\n ) {}\n\n get calls() {\n return this._calls;\n }\n\n async execute(input: unknown): Promise<unknown> {\n this._calls.push({ input });\n return this.handler(input);\n }\n\n static create(name: string, handler: (input: unknown) => unknown | Promise<unknown>): MockTool {\n return new MockTool(name, handler);\n }\n}\n","import { MockProvider } from './mock-provider.js';\nimport { MockTool } from './mock-tool.js';\nimport type { TraceEvent, AwaitHumanOptions, HumanDecision, ProviderResponse } from '@axlsdk/axl';\nimport { WorkflowContext, MemoryStore, ProviderRegistry } from '@axlsdk/axl';\nimport type { WorkflowContextInit } from '@axlsdk/axl';\n\ninterface WorkflowLike {\n readonly name: string;\n readonly inputSchema: { parse: (input: unknown) => unknown };\n readonly outputSchema: { parse: (input: unknown) => unknown } | undefined;\n readonly handler: (ctx: WorkflowContext) => Promise<unknown>;\n}\n\nexport type RecordedToolCall = { name: string; args: unknown; result: unknown };\nexport type RecordedAgentCall = {\n agent: string;\n prompt: string;\n response: string;\n model?: string;\n cost?: number;\n duration?: number;\n promptVersion?: string;\n};\nexport type RecordedStep = { step: number; type: string; data: unknown };\n\nfunction generateExecutionId(): string {\n return `test-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport type AxlTestRuntimeOptions = {\n record?: string;\n humanDecisions?: (options: AwaitHumanOptions) => HumanDecision;\n};\n\nexport class AxlTestRuntime {\n private workflows = new Map<string, WorkflowLike>();\n private mockProviders = new Map<string, MockProvider>();\n private mockToolMap = new Map<string, MockTool>();\n private _toolCalls: RecordedToolCall[] = [];\n private _agentCalls: RecordedAgentCall[] = [];\n private _steps: RecordedStep[] = [];\n private _traceLog: TraceEvent[] = [];\n private _totalCost = 0;\n private _stepCounter = 0;\n private recordPath?: string;\n private recorded: ProviderResponse[] = [];\n private _executionId: string = generateExecutionId();\n private _humanDecisionHandler?: (options: AwaitHumanOptions) => HumanDecision;\n\n constructor(options?: AxlTestRuntimeOptions) {\n this.recordPath = options?.record;\n this._humanDecisionHandler = options?.humanDecisions;\n }\n\n register(workflow: WorkflowLike): void {\n this.workflows.set(workflow.name, workflow);\n }\n\n mockProvider(name: string, provider: MockProvider): void {\n this.mockProviders.set(name, provider);\n }\n\n mockTool(name: string, handler: (input: unknown) => unknown | Promise<unknown>): void {\n this.mockToolMap.set(name, MockTool.create(name, handler));\n }\n\n async execute(\n workflowName: string,\n input: unknown,\n options?: { metadata?: Record<string, unknown> },\n ): Promise<unknown> {\n const workflow = this.workflows.get(workflowName);\n if (!workflow) throw new Error(`Workflow \"${workflowName}\" not registered`);\n\n // Reset state between executions\n this._toolCalls = [];\n this._agentCalls = [];\n this._steps = [];\n this._traceLog = [];\n this._totalCost = 0;\n this._stepCounter = 0;\n this.recorded = [];\n this._executionId = generateExecutionId();\n\n const validated = workflow.inputSchema.parse(input);\n\n // Build ProviderRegistry from registered mock providers\n const registry = new ProviderRegistry();\n registry.clearFactories(); // Remove built-in factories; only use explicit mocks\n for (const [name, provider] of this.mockProviders) {\n registry.registerInstance(name, provider);\n }\n // Fallback resolution: 'default' key or single-provider\n const defaultProvider = this.mockProviders.get('default');\n if (defaultProvider) {\n registry.setFallback(defaultProvider);\n } else if (this.mockProviders.size === 1) {\n const onlyProvider = this.mockProviders.values().next().value!;\n registry.setFallback(onlyProvider);\n }\n\n // Build toolOverrides from mockToolMap\n const toolOverrides = new Map<string, (args: unknown) => Promise<unknown>>();\n for (const [name, mockTool] of this.mockToolMap) {\n toolOverrides.set(name, async (args: unknown) => {\n return mockTool.execute(args);\n });\n }\n\n // Record steps and traces via callbacks\n this._recordStep('workflow_start', { workflow: workflowName, input: validated });\n this._pushTrace({\n type: 'workflow_start',\n workflow: workflowName,\n data: { input: validated },\n });\n\n const init: WorkflowContextInit = {\n input: validated,\n executionId: this._executionId,\n metadata: options?.metadata,\n config: {},\n providerRegistry: registry,\n stateStore: new MemoryStore(),\n toolOverrides: toolOverrides.size > 0 ? toolOverrides : undefined,\n awaitHumanHandler: this._humanDecisionHandler\n ? (opts: AwaitHumanOptions) => this._humanDecisionHandler!(opts)\n : undefined,\n onTrace: (event: TraceEvent) => {\n this._traceLog.push(event);\n this._stepCounter++;\n this._steps.push({ step: this._stepCounter, type: event.type, data: event.data });\n\n if (event.type === 'tool_call' && event.data) {\n const { args, result } = event.data as { args: unknown; result: unknown };\n this._toolCalls.push({ name: event.tool!, args, result });\n }\n\n if (event.cost) {\n this._totalCost += event.cost;\n }\n\n // Track provider responses for recording\n if (event.type === 'agent_call' && event.data) {\n const { response } = event.data as { prompt?: string; response?: string };\n if (response !== undefined) {\n this.recorded.push({\n content: response,\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n cost: event.cost ?? 0,\n });\n }\n }\n },\n onAgentCallComplete: (call: {\n agent: string;\n prompt: string;\n response: string;\n model: string;\n cost: number;\n duration: number;\n promptVersion?: string;\n }) => {\n this._agentCalls.push({\n agent: call.agent,\n prompt: call.prompt,\n response: call.response,\n model: call.model,\n cost: call.cost,\n duration: call.duration,\n promptVersion: call.promptVersion,\n });\n },\n };\n\n const ctx = new WorkflowContext(init);\n const result = await workflow.handler(ctx);\n\n // Validate output schema if defined\n if (workflow.outputSchema) workflow.outputSchema.parse(result);\n\n this._recordStep('workflow_end', { workflow: workflowName, result });\n this._pushTrace({\n type: 'workflow_end',\n workflow: workflowName,\n data: { result },\n });\n\n if (this.recordPath) await this._writeRecording();\n return result;\n }\n\n toolCalls(name?: string): RecordedToolCall[] {\n return name ? this._toolCalls.filter((c) => c.name === name) : this._toolCalls;\n }\n\n agentCalls(name?: string): RecordedAgentCall[] {\n return name ? this._agentCalls.filter((c) => c.agent === name) : this._agentCalls;\n }\n\n totalCost(): number {\n return this._totalCost;\n }\n steps(): RecordedStep[] {\n return this._steps;\n }\n traceLog(): TraceEvent[] {\n return this._traceLog;\n }\n\n private _recordStep(type: string, data: unknown): void {\n this._stepCounter++;\n this._steps.push({ step: this._stepCounter, type, data });\n }\n\n private _pushTrace(partial: Omit<TraceEvent, 'executionId' | 'step' | 'timestamp'>): void {\n this._traceLog.push({\n executionId: this._executionId,\n step: this._stepCounter,\n timestamp: Date.now(),\n ...partial,\n });\n }\n\n private async _writeRecording(): Promise<void> {\n if (!this.recordPath) return;\n const { writeFile, mkdir } = await import('node:fs/promises');\n const { dirname } = await import('node:path');\n await mkdir(dirname(this.recordPath), { recursive: true });\n await writeFile(this.recordPath, JSON.stringify(this.recorded, null, 2), 'utf8');\n }\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../src/mock-provider.ts","../src/mock-tool.ts","../src/test-runtime.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport type {\n ChatMessage,\n ChatOptions,\n ToolCallMessage,\n ProviderResponse,\n StreamChunk,\n Provider,\n} from '@axlsdk/axl';\n\nfunction randomAlphanumeric(length: number): string {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n}\n\nfunction generateFromSchema(schema: unknown): unknown {\n const def = (schema as Record<string, unknown> | null)?._def as\n | Record<string, unknown>\n | undefined;\n if (!def) return {};\n switch (def.typeName) {\n case 'ZodString': {\n const length = 8 + Math.floor(Math.random() * 13); // 8-20 chars\n return randomAlphanumeric(length);\n }\n case 'ZodNumber': {\n const checks: Array<{ kind: string; value: number }> =\n (def.checks as Array<{ kind: string; value: number }>) ?? [];\n let min = 0;\n let max = 100;\n for (const check of checks) {\n if (check.kind === 'min') min = check.value;\n if (check.kind === 'max') max = check.value;\n }\n return min + Math.random() * (max - min);\n }\n case 'ZodBoolean':\n return Math.random() < 0.5;\n case 'ZodArray': {\n const count = 1 + Math.floor(Math.random() * 3); // 1-3 items\n const items: unknown[] = [];\n for (let i = 0; i < count; i++) {\n items.push(generateFromSchema(def.type));\n }\n return items;\n }\n case 'ZodObject': {\n const shapeFn = def.shape as (() => Record<string, unknown>) | undefined;\n const shape = shapeFn?.() ?? {};\n const obj: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n obj[key] = generateFromSchema(value);\n }\n return obj;\n }\n case 'ZodOptional': {\n if (Math.random() < 0.5) return undefined;\n return generateFromSchema(def.innerType);\n }\n case 'ZodDefault':\n return (def.defaultValue as () => unknown)();\n case 'ZodEnum': {\n const values: unknown[] = (def.values as unknown[]) ?? [];\n if (values.length === 0) return '';\n return values[Math.floor(Math.random() * values.length)];\n }\n case 'ZodNullable':\n return null;\n default:\n return {};\n }\n}\n\nexport class MockProvider implements Provider {\n readonly name = 'mock';\n private _calls: { messages: ChatMessage[]; options: ChatOptions }[] = [];\n\n private constructor(\n private responseFn: (messages: ChatMessage[], callIndex: number) => ProviderResponse,\n ) {}\n\n get calls() {\n return this._calls;\n }\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n this._calls.push({ messages, options });\n return this.responseFn(messages, this._calls.length - 1);\n }\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const response = await this.chat(messages, options);\n yield { type: 'text_delta', content: response.content };\n yield { type: 'done', usage: response.usage };\n }\n\n static sequence(\n responses: Array<{ content: string; tool_calls?: ToolCallMessage[] }>,\n ): MockProvider {\n return new MockProvider((_messages, callIndex) => {\n if (callIndex >= responses.length) {\n throw new Error(\n `MockProvider.sequence: no response for call index ${callIndex}. Only ${responses.length} responses defined.`,\n );\n }\n return {\n content: responses[callIndex].content,\n tool_calls: responses[callIndex].tool_calls,\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n };\n });\n }\n\n static echo(): MockProvider {\n return new MockProvider((messages) => {\n const lastUser = [...messages].reverse().find((m) => m.role === 'user');\n return {\n content: lastUser?.content ?? '',\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n };\n });\n }\n\n static json(schema: unknown): MockProvider {\n return new MockProvider(() => ({\n content: JSON.stringify(generateFromSchema(schema)),\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n }));\n }\n\n static replay(source: string | ProviderResponse[]): MockProvider {\n const data =\n typeof source === 'string'\n ? (JSON.parse(readFileSync(source, 'utf-8')) as ProviderResponse[])\n : source;\n return new MockProvider((_messages, callIndex) => {\n if (callIndex >= data.length) {\n throw new Error(`MockProvider.replay: no recorded response for call index ${callIndex}`);\n }\n return data[callIndex];\n });\n }\n\n static fn(\n handler: (\n messages: ChatMessage[],\n callIndex: number,\n ) => { content: string; tool_calls?: ToolCallMessage[] },\n ): MockProvider {\n return new MockProvider((messages, callIndex) => ({\n ...handler(messages, callIndex),\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n cost: 0,\n }));\n }\n}\n","export class MockTool {\n private _calls: { input: unknown }[] = [];\n\n constructor(\n readonly name: string,\n private handler: (input: unknown) => unknown | Promise<unknown>,\n ) {}\n\n get calls() {\n return this._calls;\n }\n\n async execute(input: unknown): Promise<unknown> {\n this._calls.push({ input });\n return this.handler(input);\n }\n\n static create(name: string, handler: (input: unknown) => unknown | Promise<unknown>): MockTool {\n return new MockTool(name, handler);\n }\n}\n","import { MockProvider } from './mock-provider.js';\nimport { MockTool } from './mock-tool.js';\nimport type {\n TraceEvent,\n AwaitHumanOptions,\n HumanDecision,\n ProviderResponse,\n AgentCallInfo,\n} from '@axlsdk/axl';\nimport { WorkflowContext, MemoryStore, ProviderRegistry } from '@axlsdk/axl';\nimport type { WorkflowContextInit } from '@axlsdk/axl';\n\ninterface WorkflowLike {\n readonly name: string;\n readonly inputSchema: { parse: (input: unknown) => unknown };\n readonly outputSchema: { parse: (input: unknown) => unknown } | undefined;\n readonly handler: (ctx: WorkflowContext) => Promise<unknown>;\n}\n\nexport type RecordedToolCall = { name: string; args: unknown; result: unknown };\nexport type RecordedAgentCall = Partial<AgentCallInfo> &\n Pick<AgentCallInfo, 'agent' | 'prompt' | 'response'>;\nexport type RecordedStep = { step: number; type: string; data: unknown };\n\nfunction generateExecutionId(): string {\n return `test-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport type AxlTestRuntimeOptions = {\n record?: string;\n humanDecisions?: (options: AwaitHumanOptions) => HumanDecision;\n};\n\nexport class AxlTestRuntime {\n private workflows = new Map<string, WorkflowLike>();\n private mockProviders = new Map<string, MockProvider>();\n private mockToolMap = new Map<string, MockTool>();\n private _toolCalls: RecordedToolCall[] = [];\n private _agentCalls: RecordedAgentCall[] = [];\n private _steps: RecordedStep[] = [];\n private _traceLog: TraceEvent[] = [];\n private _totalCost = 0;\n private _stepCounter = 0;\n private recordPath?: string;\n private recorded: ProviderResponse[] = [];\n private _executionId: string = generateExecutionId();\n private _humanDecisionHandler?: (options: AwaitHumanOptions) => HumanDecision;\n\n constructor(options?: AxlTestRuntimeOptions) {\n this.recordPath = options?.record;\n this._humanDecisionHandler = options?.humanDecisions;\n }\n\n register(workflow: WorkflowLike): void {\n this.workflows.set(workflow.name, workflow);\n }\n\n mockProvider(name: string, provider: MockProvider): void {\n this.mockProviders.set(name, provider);\n }\n\n mockTool(name: string, handler: (input: unknown) => unknown | Promise<unknown>): void {\n this.mockToolMap.set(name, MockTool.create(name, handler));\n }\n\n async execute(\n workflowName: string,\n input: unknown,\n options?: { metadata?: Record<string, unknown> },\n ): Promise<unknown> {\n const workflow = this.workflows.get(workflowName);\n if (!workflow) throw new Error(`Workflow \"${workflowName}\" not registered`);\n\n // Reset state between executions\n this._toolCalls = [];\n this._agentCalls = [];\n this._steps = [];\n this._traceLog = [];\n this._totalCost = 0;\n this._stepCounter = 0;\n this.recorded = [];\n this._executionId = generateExecutionId();\n\n const validated = workflow.inputSchema.parse(input);\n\n // Build ProviderRegistry from registered mock providers\n const registry = new ProviderRegistry();\n registry.clearFactories(); // Remove built-in factories; only use explicit mocks\n for (const [name, provider] of this.mockProviders) {\n registry.registerInstance(name, provider);\n }\n // Fallback resolution: 'default' key or single-provider\n const defaultProvider = this.mockProviders.get('default');\n if (defaultProvider) {\n registry.setFallback(defaultProvider);\n } else if (this.mockProviders.size === 1) {\n const onlyProvider = this.mockProviders.values().next().value!;\n registry.setFallback(onlyProvider);\n }\n\n // Build toolOverrides from mockToolMap\n const toolOverrides = new Map<string, (args: unknown) => Promise<unknown>>();\n for (const [name, mockTool] of this.mockToolMap) {\n toolOverrides.set(name, async (args: unknown) => {\n return mockTool.execute(args);\n });\n }\n\n // Record steps and traces via callbacks\n this._recordStep('workflow_start', { workflow: workflowName, input: validated });\n this._pushTrace({\n type: 'workflow_start',\n workflow: workflowName,\n data: { input: validated },\n });\n\n const init: WorkflowContextInit = {\n input: validated,\n executionId: this._executionId,\n metadata: options?.metadata,\n config: {},\n providerRegistry: registry,\n stateStore: new MemoryStore(),\n toolOverrides: toolOverrides.size > 0 ? toolOverrides : undefined,\n awaitHumanHandler: this._humanDecisionHandler\n ? (opts: AwaitHumanOptions) => this._humanDecisionHandler!(opts)\n : undefined,\n onTrace: (event: TraceEvent) => {\n this._traceLog.push(event);\n this._stepCounter++;\n this._steps.push({ step: this._stepCounter, type: event.type, data: event.data });\n\n if (event.type === 'tool_call' && event.data) {\n const { args, result } = event.data as { args: unknown; result: unknown };\n this._toolCalls.push({ name: event.tool!, args, result });\n }\n\n if (event.cost) {\n this._totalCost += event.cost;\n }\n\n // Track provider responses for recording\n if (event.type === 'agent_call' && event.data) {\n const { response } = event.data as { prompt?: string; response?: string };\n if (response !== undefined) {\n this.recorded.push({\n content: response,\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n cost: event.cost ?? 0,\n });\n }\n }\n },\n onAgentCallComplete: (call: AgentCallInfo) => {\n this._agentCalls.push(call);\n },\n };\n\n const ctx = new WorkflowContext(init);\n const result = await workflow.handler(ctx);\n\n // Validate output schema if defined\n if (workflow.outputSchema) workflow.outputSchema.parse(result);\n\n this._recordStep('workflow_end', { workflow: workflowName, result });\n this._pushTrace({\n type: 'workflow_end',\n workflow: workflowName,\n data: { result },\n });\n\n if (this.recordPath) await this._writeRecording();\n return result;\n }\n\n toolCalls(name?: string): RecordedToolCall[] {\n return name ? this._toolCalls.filter((c) => c.name === name) : this._toolCalls;\n }\n\n agentCalls(name?: string): RecordedAgentCall[] {\n return name ? this._agentCalls.filter((c) => c.agent === name) : this._agentCalls;\n }\n\n totalCost(): number {\n return this._totalCost;\n }\n steps(): RecordedStep[] {\n return this._steps;\n }\n traceLog(): TraceEvent[] {\n return this._traceLog;\n }\n\n private _recordStep(type: string, data: unknown): void {\n this._stepCounter++;\n this._steps.push({ step: this._stepCounter, type, data });\n }\n\n private _pushTrace(partial: Omit<TraceEvent, 'executionId' | 'step' | 'timestamp'>): void {\n this._traceLog.push({\n executionId: this._executionId,\n step: this._stepCounter,\n timestamp: Date.now(),\n ...partial,\n });\n }\n\n private async _writeRecording(): Promise<void> {\n if (!this.recordPath) return;\n const { writeFile, mkdir } = await import('node:fs/promises');\n const { dirname } = await import('node:path');\n await mkdir(dirname(this.recordPath), { recursive: true });\n await writeFile(this.recordPath, JSON.stringify(this.recorded, null, 2), 'utf8');\n }\n}\n"],"mappings":"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","names":["result"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axlsdk/testing",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Testing utilities for Axl agentic workflows",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -22,7 +22,7 @@
22
22
  "dist"
23
23
  ],
24
24
  "dependencies": {
25
- "@axlsdk/axl": "0.4.0"
25
+ "@axlsdk/axl": "0.5.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^25.2.3",