@agtlantis/core 0.4.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/session/usage-extractors.ts","../../src/session/types.ts","../../src/testing/fixtures.ts","../../src/testing/helpers.ts","../../src/observability/logger.ts","../../src/execution/constants.ts","../../src/execution/utils.ts","../../src/execution/shared.ts","../../src/execution/streaming-host.ts","../../src/execution/simple-host.ts","../../src/provider/base-provider.ts","../../src/pricing/defaults.ts","../../src/pricing/config.ts","../../src/pricing/calculator.ts","../../src/session/simple-session.ts","../../src/session/streaming-session.ts","../../src/errors/utils.ts","../../src/errors/types.ts","../../src/provider/noop-file-manager.ts","../../src/testing/mock-provider.ts","../../src/testing/mock.ts","../../src/execution/testing/helpers.ts","../../src/execution/testing/fixtures.ts","../../src/testing/test-execution.ts"],"names":["globalConfig","aiGenerateText","aiStreamText","MockLanguageModelV3","createMockUsage","collectEvents"],"mappings":"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","file":"index.js","sourcesContent":["import type { LanguageModelUsage } from 'ai';\nimport type { ProviderType } from '@/pricing/types';\n\nexport type { ProviderType } from '@/pricing/types';\n\nexport function mergeUsages(usages: LanguageModelUsage[]): LanguageModelUsage {\n if (usages.length === 0) {\n return createZeroUsage();\n }\n\n let inputTokens = 0;\n let outputTokens = 0;\n let totalTokens = 0;\n let noCacheTokens = 0;\n let cacheReadTokens = 0;\n let cacheWriteTokens = 0;\n let textTokens = 0;\n let reasoningTokens = 0;\n\n for (const usage of usages) {\n inputTokens += usage.inputTokens ?? 0;\n outputTokens += usage.outputTokens ?? 0;\n totalTokens += usage.totalTokens ?? 0;\n\n noCacheTokens += usage.inputTokenDetails?.noCacheTokens ?? 0;\n cacheReadTokens += usage.inputTokenDetails?.cacheReadTokens ?? 0;\n cacheWriteTokens += usage.inputTokenDetails?.cacheWriteTokens ?? 0;\n\n textTokens += usage.outputTokenDetails?.textTokens ?? 0;\n reasoningTokens += usage.outputTokenDetails?.reasoningTokens ?? 0;\n }\n\n return {\n inputTokens,\n outputTokens,\n totalTokens,\n inputTokenDetails: {\n noCacheTokens,\n cacheReadTokens,\n cacheWriteTokens,\n },\n outputTokenDetails: {\n textTokens,\n reasoningTokens,\n },\n };\n}\n\nexport function createZeroUsage(): LanguageModelUsage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n inputTokenDetails: {\n noCacheTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n },\n outputTokenDetails: {\n textTokens: 0,\n reasoningTokens: 0,\n },\n };\n}\n\nexport function detectProviderType(modelId: string): ProviderType | undefined {\n const lowerModel = modelId.toLowerCase();\n\n if (\n lowerModel.startsWith('gpt-') ||\n lowerModel === 'o1' ||\n lowerModel.startsWith('o1-') ||\n lowerModel === 'o3' ||\n lowerModel.startsWith('o3-')\n ) {\n return 'openai';\n }\n\n if (lowerModel.startsWith('gemini')) {\n return 'google';\n }\n\n if (lowerModel.startsWith('claude')) {\n return 'anthropic';\n }\n\n return undefined;\n}\n","/**\n * Session module types for @agtlantis/core.\n * Provides interfaces for tracking LLM calls, tool calls, and session summaries.\n */\n\nimport type {\n LanguageModelUsage,\n generateText as aiGenerateText,\n streamText as aiStreamText,\n generateObject as aiGenerateObject,\n GenerateTextResult,\n StreamTextResult,\n ToolSet,\n} from 'ai';\nimport type { ExecutionMetadata } from '@/observability/types';\nimport type { ProviderType } from '@/pricing/types';\nimport { createZeroUsage } from './usage-extractors';\n\n/**\n * Structural interface matching AI SDK's internal Output<OUTPUT, PARTIAL>.\n *\n * AI SDK exports `output as Output` (runtime value), not the interface directly.\n * We define this compatible interface to enable structural typing.\n *\n * CRITICAL: Method signatures MUST exactly match AI SDK's internal interface\n * for generic type inference to work.\n *\n * @see AI SDK source: node_modules/ai/dist/index.d.ts lines 572-596\n */\nexport interface OutputSpec<OUTPUT = unknown, PARTIAL = unknown> {\n responseFormat: PromiseLike<unknown>;\n\n parseCompleteOutput(\n options: { text: string },\n context: { response: unknown; usage: unknown; finishReason: unknown }\n ): Promise<OUTPUT>;\n\n parsePartialOutput(options: { text: string }): Promise<{ partial: PARTIAL } | undefined>;\n}\n\nexport type DefaultOutput = OutputSpec<string, string>;\n\nexport type InferOutputComplete<T> = T extends OutputSpec<infer O, unknown> ? O : string;\n\nexport type GenerateTextResultTyped<\n TOOLS extends ToolSet,\n OUTPUT extends OutputSpec,\n> = Awaited<ReturnType<typeof aiGenerateText<TOOLS>>> & {\n output: InferOutputComplete<OUTPUT> | undefined;\n};\n\nexport type StreamTextResultTyped<\n TOOLS extends ToolSet,\n OUTPUT extends OutputSpec,\n> = ReturnType<typeof aiStreamText<TOOLS>> & {\n output: Promise<InferOutputComplete<OUTPUT> | undefined>;\n};\n\n/**\n * Parameters for session.generateText().\n * Mirrors AI SDK's generateText() with 'model' excluded (injected by session).\n */\nexport type GenerateTextParams<\n TOOLS extends ToolSet = {},\n OUTPUT extends OutputSpec = DefaultOutput,\n> = Omit<Parameters<typeof aiGenerateText<TOOLS>>[0], 'model' | 'output'> & {\n model?: string;\n output?: OUTPUT;\n};\n\nexport type { GenerateTextResult };\n\n/**\n * Parameters for session.streamText().\n * Mirrors AI SDK's streamText() with 'model' excluded (injected by session).\n */\nexport type StreamTextParams<\n TOOLS extends ToolSet = {},\n OUTPUT extends OutputSpec = DefaultOutput,\n> = Omit<Parameters<typeof aiStreamText<TOOLS>>[0], 'model' | 'output'> & {\n model?: string;\n output?: OUTPUT;\n};\n\nexport type { StreamTextResult };\n\n/**\n * @deprecated Use generateText with Output.object instead\n */\nexport type GenerateObjectParams = Omit<Parameters<typeof aiGenerateObject>[0], 'model'>;\n\nexport type { ToolSet };\n\nexport interface ToolCallSummary {\n name: string;\n duration?: number;\n success: boolean;\n error?: string;\n}\n\nexport type LLMCallType = 'generateText' | 'streamText' | 'generateObject' | 'manual';\n\nexport interface LLMCallRecord {\n startTime: number;\n endTime: number;\n duration: number;\n usage: LanguageModelUsage;\n type: LLMCallType;\n model: string;\n provider: ProviderType;\n}\n\n/**\n * Aggregated summary of all activity within an execution session.\n * Used for cost tracking, performance analysis, and metadata reporting.\n */\nexport interface AdditionalCost {\n type: string;\n cost: number;\n label?: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n}\n\n/**\n * Internal data structure for SessionSummary constructor.\n */\ninterface SessionSummaryData {\n totalLLMUsage: LanguageModelUsage;\n llmCalls: LLMCallRecord[];\n toolCalls: ToolCallSummary[];\n customRecords: Record<string, unknown>[];\n llmCost: number;\n additionalCosts: AdditionalCost[];\n metadata: Record<string, unknown>;\n costByModel: Record<string, number>;\n}\n\n/**\n * Aggregated summary of all activity within an execution session.\n * Used for cost tracking, performance analysis, and metadata reporting.\n *\n * This is an immutable Value Object. All mutation methods return new instances.\n */\nexport class SessionSummary {\n readonly totalLLMUsage: LanguageModelUsage;\n readonly llmCallCount: number;\n readonly llmCalls: readonly LLMCallRecord[];\n readonly toolCalls: readonly ToolCallSummary[];\n readonly customRecords: readonly Record<string, unknown>[];\n readonly llmCost: number;\n readonly additionalCosts: readonly AdditionalCost[];\n readonly metadata: Readonly<Record<string, unknown>>;\n /** Cost breakdown by model. Key format: `${provider}/${model}` */\n readonly costByModel: Readonly<Record<string, number>>;\n\n private readonly startTime: number;\n\n private constructor(data: SessionSummaryData, startTime: number) {\n this.startTime = startTime;\n this.totalLLMUsage = data.totalLLMUsage;\n this.llmCallCount = data.llmCalls.length;\n this.llmCalls = Object.freeze([...data.llmCalls]);\n this.toolCalls = Object.freeze([...data.toolCalls]);\n this.customRecords = Object.freeze([...data.customRecords]);\n this.llmCost = data.llmCost;\n this.additionalCosts = Object.freeze([...data.additionalCosts]);\n this.metadata = Object.freeze({ ...data.metadata });\n this.costByModel = Object.freeze({ ...data.costByModel });\n }\n\n /**\n * Total duration from session start to now (computed dynamically).\n */\n get totalDuration(): number {\n return Date.now() - this.startTime;\n }\n\n /**\n * Creates an empty SessionSummary.\n */\n static empty(startTime: number): SessionSummary {\n return new SessionSummary(\n {\n totalLLMUsage: createZeroUsage(),\n llmCalls: [],\n toolCalls: [],\n customRecords: [],\n llmCost: 0,\n additionalCosts: [],\n metadata: {},\n costByModel: {},\n },\n startTime\n );\n }\n\n /**\n * Creates a SessionSummary with custom data for testing purposes.\n * @internal For testing only - do not use in production code.\n */\n static forTest(data: Partial<SessionSummaryData> & { startTime?: number }): SessionSummary {\n const startTime = data.startTime ?? Date.now() - 1000;\n return new SessionSummary(\n {\n totalLLMUsage: data.totalLLMUsage ?? createZeroUsage(),\n llmCalls: data.llmCalls ?? [],\n toolCalls: data.toolCalls ?? [],\n customRecords: data.customRecords ?? [],\n llmCost: data.llmCost ?? 0,\n additionalCosts: data.additionalCosts ?? [],\n metadata: data.metadata ?? {},\n costByModel: data.costByModel ?? {},\n },\n startTime\n );\n }\n\n /**\n * Total cost of all additional (non-LLM) operations.\n */\n get totalAdditionalCost(): number {\n return this.additionalCosts.reduce((sum, c) => sum + c.cost, 0);\n }\n\n /**\n * Total cost including LLM and additional costs.\n */\n get totalCost(): number {\n return this.llmCost + this.totalAdditionalCost;\n }\n\n /**\n * Returns a new SessionSummary with an LLM call added.\n */\n withLLMCall(\n call: LLMCallRecord,\n newLlmCost: number,\n newCostByModel: Record<string, number>,\n newTotalUsage: LanguageModelUsage\n ): SessionSummary {\n return new SessionSummary(\n {\n totalLLMUsage: newTotalUsage,\n llmCalls: [...this.llmCalls, call],\n toolCalls: [...this.toolCalls],\n customRecords: [...this.customRecords],\n llmCost: newLlmCost,\n additionalCosts: [...this.additionalCosts],\n metadata: { ...this.metadata },\n costByModel: newCostByModel,\n },\n this.startTime\n );\n }\n\n /**\n * Returns a new SessionSummary with an additional cost recorded.\n */\n withAdditionalCost(cost: AdditionalCost): SessionSummary {\n return new SessionSummary(\n {\n totalLLMUsage: this.totalLLMUsage,\n llmCalls: [...this.llmCalls],\n toolCalls: [...this.toolCalls],\n customRecords: [...this.customRecords],\n llmCost: this.llmCost,\n additionalCosts: [...this.additionalCosts, cost],\n metadata: { ...this.metadata },\n costByModel: { ...this.costByModel },\n },\n this.startTime\n );\n }\n\n /**\n * Returns a new SessionSummary with metadata updated.\n */\n withMetadata(key: string, value: unknown): SessionSummary {\n return new SessionSummary(\n {\n totalLLMUsage: this.totalLLMUsage,\n llmCalls: [...this.llmCalls],\n toolCalls: [...this.toolCalls],\n customRecords: [...this.customRecords],\n llmCost: this.llmCost,\n additionalCosts: [...this.additionalCosts],\n metadata: { ...this.metadata, [key]: value },\n costByModel: { ...this.costByModel },\n },\n this.startTime\n );\n }\n\n /**\n * Returns a new SessionSummary with a tool call added.\n */\n withToolCall(call: ToolCallSummary): SessionSummary {\n return new SessionSummary(\n {\n totalLLMUsage: this.totalLLMUsage,\n llmCalls: [...this.llmCalls],\n toolCalls: [...this.toolCalls, call],\n customRecords: [...this.customRecords],\n llmCost: this.llmCost,\n additionalCosts: [...this.additionalCosts],\n metadata: { ...this.metadata },\n costByModel: { ...this.costByModel },\n },\n this.startTime\n );\n }\n\n /**\n * Returns a new SessionSummary with a custom record added.\n */\n withCustomRecord(record: Record<string, unknown>): SessionSummary {\n return new SessionSummary(\n {\n totalLLMUsage: this.totalLLMUsage,\n llmCalls: [...this.llmCalls],\n toolCalls: [...this.toolCalls],\n customRecords: [...this.customRecords, record],\n llmCost: this.llmCost,\n additionalCosts: [...this.additionalCosts],\n metadata: { ...this.metadata },\n costByModel: { ...this.costByModel },\n },\n this.startTime\n );\n }\n\n /**\n * Serializes to plain JSON object for database storage.\n */\n toJSON(): SessionSummaryJSON {\n return {\n totalDuration: this.totalDuration,\n totalLLMUsage: this.totalLLMUsage,\n llmCallCount: this.llmCallCount,\n llmCalls: [...this.llmCalls],\n toolCalls: [...this.toolCalls],\n customRecords: [...this.customRecords],\n llmCost: this.llmCost,\n additionalCosts: [...this.additionalCosts],\n metadata: { ...this.metadata },\n costByModel: { ...this.costByModel },\n totalCost: this.totalCost,\n totalAdditionalCost: this.totalAdditionalCost,\n };\n }\n}\n\n/**\n * JSON representation of SessionSummary for database storage.\n */\nexport interface SessionSummaryJSON {\n totalDuration: number;\n totalLLMUsage: LanguageModelUsage;\n llmCallCount: number;\n llmCalls: LLMCallRecord[];\n toolCalls: ToolCallSummary[];\n customRecords: Record<string, unknown>[];\n llmCost: number;\n additionalCosts: AdditionalCost[];\n metadata: Record<string, unknown>;\n costByModel: Record<string, number>;\n totalCost: number;\n totalAdditionalCost: number;\n}\n\n/**\n * Session for tracking LLM calls, tool calls, and custom records.\n * Provides AI SDK wrappers with auto-tracking and manual recording methods.\n */\nexport interface ExecutionSession {\n generateText(params: GenerateTextParams): Promise<Awaited<ReturnType<typeof aiGenerateText>>>;\n streamText(params: StreamTextParams): ReturnType<typeof aiStreamText>;\n generateObject<T>(\n params: GenerateObjectParams & { schema: import('zod').ZodType<T> }\n ): Promise<Awaited<ReturnType<typeof aiGenerateObject>>>;\n\n recordToolCall(summary: ToolCallSummary): void;\n recordLLMCall(record: Omit<LLMCallRecord, 'type'> & { type?: LLMCallType }): void;\n record(data: Record<string, unknown>): void;\n\n recordAdditionalCost(cost: Omit<AdditionalCost, 'timestamp'>): void;\n setMetadata(key: string, value: unknown): void;\n setMetadata(data: Record<string, unknown>): void;\n\n summary(): Promise<SessionSummary>;\n}\n\n/**\n * Metadata passed to done() and fail() in StreamGeneratorControl.\n * Union of SessionSummary and ExecutionMetadata for flexible usage.\n */\nexport type DoneMetadata = SessionSummary | ExecutionMetadata;\n","import type { CompletionEvent } from '@/execution/types';\nimport type { LanguageModelUsage } from '@/observability';\nimport { SessionSummary, type LLMCallRecord, type ToolCallSummary, type AdditionalCost } from '@/session/types';\n\nexport const TEST_API_KEY = 'test-api-key';\n\nexport function createMockUsage(overrides?: Partial<LanguageModelUsage>): LanguageModelUsage {\n const inputTokens = overrides?.inputTokens ?? 10;\n const outputTokens = overrides?.outputTokens ?? 5;\n\n return {\n inputTokens,\n outputTokens,\n totalTokens: overrides?.totalTokens ?? inputTokens + outputTokens,\n inputTokenDetails: {\n cacheReadTokens: undefined,\n cacheWriteTokens: undefined,\n noCacheTokens: undefined,\n ...overrides?.inputTokenDetails,\n },\n outputTokenDetails: {\n textTokens: undefined,\n reasoningTokens: undefined,\n ...overrides?.outputTokenDetails,\n },\n };\n}\n\nexport interface TestBaseEvent {\n type: string;\n message?: string;\n data?: string;\n}\n\nexport type TestEvent = TestBaseEvent | CompletionEvent<string>;\n\nexport interface TestResult {\n value: string;\n}\n\nexport function createTestEvent(\n type: string,\n overrides?: Partial<Omit<TestBaseEvent, 'type'>>\n): TestBaseEvent {\n return {\n type,\n ...overrides,\n };\n}\n\nexport interface MockSessionSummaryOptions {\n /** @deprecated Use startTime instead. totalDuration is computed from startTime. */\n totalDuration?: number;\n startTime?: number;\n totalLLMUsage?: LanguageModelUsage;\n /** @deprecated Provide llmCalls array instead. llmCallCount creates dummy records. */\n llmCallCount?: number;\n llmCalls?: LLMCallRecord[];\n toolCalls?: ToolCallSummary[];\n customRecords?: Record<string, unknown>[];\n /** @deprecated Use llmCost instead */\n totalCost?: number;\n llmCost?: number;\n additionalCosts?: AdditionalCost[];\n metadata?: Record<string, unknown>;\n costByModel?: Record<string, number>;\n}\n\nfunction createDummyLLMCall(): LLMCallRecord {\n return {\n startTime: Date.now() - 100,\n endTime: Date.now(),\n duration: 100,\n usage: createMockUsage(),\n type: 'generateText',\n model: 'test-model',\n provider: 'openai',\n };\n}\n\nexport function createMockSessionSummary(overrides?: MockSessionSummaryOptions): SessionSummary {\n // Compute startTime from totalDuration for backward compatibility\n let startTime = overrides?.startTime;\n if (startTime === undefined && overrides?.totalDuration !== undefined) {\n startTime = Date.now() - overrides.totalDuration;\n }\n\n // Support both llmCost and deprecated totalCost\n const llmCost = overrides?.llmCost ?? overrides?.totalCost ?? 0;\n\n // Support deprecated llmCallCount by creating dummy records\n let llmCalls = overrides?.llmCalls;\n if (!llmCalls && overrides?.llmCallCount !== undefined) {\n llmCalls = Array.from({ length: overrides.llmCallCount }, () => createDummyLLMCall());\n }\n\n return SessionSummary.forTest({\n startTime,\n totalLLMUsage: overrides?.totalLLMUsage ?? createMockUsage(),\n llmCalls: llmCalls ?? [],\n toolCalls: overrides?.toolCalls ?? [],\n customRecords: overrides?.customRecords ?? [],\n llmCost,\n additionalCosts: overrides?.additionalCosts ?? [],\n metadata: overrides?.metadata ?? {},\n costByModel: overrides?.costByModel ?? {},\n });\n}\n","import type { FileManager } from '@/provider';\nimport type { ErrorEvent, SessionEvent, StreamingExecution } from '@/execution/types';\n\n/**\n * Collects all events from a StreamingExecution into an array.\n * Works with both StreamingExecution (via .stream()) and raw AsyncIterable.\n */\nexport async function collectEvents<T extends { type: string }>(\n execution: StreamingExecution<T>\n): Promise<SessionEvent<T | ErrorEvent>[]>;\nexport async function collectEvents<T extends { type: string }>(\n execution: AsyncIterable<SessionEvent<T>>\n): Promise<SessionEvent<T>[]>;\nexport async function collectEvents<T extends { type: string }>(\n execution: StreamingExecution<T> | AsyncIterable<SessionEvent<T>>\n): Promise<Array<SessionEvent<T | ErrorEvent>>> {\n const events: Array<SessionEvent<T | ErrorEvent>> = [];\n\n // Check if it's a StreamingExecution (has stream method)\n const iterable =\n 'stream' in execution && typeof execution.stream === 'function'\n ? execution.stream()\n : (execution as AsyncIterable<SessionEvent<T | ErrorEvent>>);\n\n for await (const event of iterable) {\n events.push(event);\n }\n return events;\n}\n\n/**\n * Drains a StreamingExecution or AsyncIterable without storing events.\n */\nexport async function consumeExecution<T extends { type: string }>(\n execution: StreamingExecution<T> | AsyncIterable<SessionEvent<T>>\n): Promise<void> {\n const iterable =\n 'stream' in execution && typeof execution.stream === 'function'\n ? execution.stream()\n : (execution as AsyncIterable<SessionEvent<T>>);\n\n for await (const _event of iterable) {\n // intentionally empty - drains the async iterator\n }\n}\n\nexport function expectFileManagerInterface(obj: unknown): asserts obj is FileManager {\n const fm = obj as FileManager;\n const requiredMethods = ['upload', 'delete', 'clear', 'getUploadedFiles'] as const;\n\n for (const method of requiredMethods) {\n if (typeof fm[method] !== 'function') {\n throw new Error(\n `Expected FileManager.${method} to be a function, got ${typeof fm[method]}`\n );\n }\n }\n}\n","import type { LanguageModelUsage } from 'ai';\nimport type { SessionSummary } from '../session/types';\n\n/**\n * Logger interface for observability.\n * All methods are optional - implement only the events you care about.\n *\n * @example\n * ```typescript\n * const myLogger: Logger = {\n * onLLMCallEnd(event) {\n * console.log(`${event.modelId}: ${event.response.duration}ms`);\n * },\n * onExecutionDone(event) {\n * console.log('Total duration:', event.duration);\n * },\n * };\n * ```\n */\nexport interface Logger {\n onLLMCallStart?(event: LLMCallStartEvent): void;\n onLLMCallEnd?(event: LLMCallEndEvent): void;\n onExecutionStart?(event: ExecutionStartEvent): void;\n onExecutionEmit?<TEvent>(event: ExecutionEmitEvent<TEvent>): void;\n onExecutionDone?<TResult>(event: ExecutionDoneEvent<TResult>): void;\n onExecutionError?<TResult>(event: ExecutionErrorEvent<TResult>): void;\n log?(level: LogLevel, message: string, data?: Record<string, unknown>): void;\n}\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport type LLMCallLogType = 'generateText' | 'streamText';\n\n/**\n * Event emitted when an LLM call starts.\n *\n * @example\n * ```typescript\n * logger.onLLMCallStart?.({\n * type: 'llm_call_start',\n * callType: 'generateText',\n * modelId: 'gemini-2.5-flash',\n * timestamp: Date.now(),\n * request: { params: { prompt: 'Hello' } },\n * });\n * ```\n */\nexport interface LLMCallStartEvent {\n type: 'llm_call_start';\n callType: LLMCallLogType;\n modelId: string;\n timestamp: number;\n request: {\n params: Record<string, unknown>;\n };\n}\n\n/**\n * Event emitted when an LLM call ends (success or error).\n *\n * @example Success case:\n * ```typescript\n * logger.onLLMCallEnd?.({\n * type: 'llm_call_end',\n * callType: 'generateText',\n * modelId: 'gemini-2.5-flash',\n * timestamp: Date.now(),\n * response: {\n * duration: 1500,\n * usage: { inputTokens: 100, outputTokens: 50, totalTokens: 150 },\n * raw: result,\n * },\n * });\n * ```\n *\n * @example Error case:\n * ```typescript\n * logger.onLLMCallEnd?.({\n * type: 'llm_call_end',\n * callType: 'streamText',\n * modelId: 'gpt-4o',\n * timestamp: Date.now(),\n * response: {\n * duration: 500,\n * error: new Error('Rate limit exceeded'),\n * raw: null,\n * },\n * });\n * ```\n */\nexport interface LLMCallEndEvent {\n type: 'llm_call_end';\n callType: LLMCallLogType;\n modelId: string;\n timestamp: number;\n response: {\n duration: number;\n usage?: LanguageModelUsage;\n raw: unknown;\n error?: Error;\n };\n}\n\nexport interface ExecutionStartEvent {\n type: 'execution_start';\n timestamp: number;\n}\n\n/**\n * Event emitted for each intermediate event during execution.\n * @typeParam TEvent - The type of the emitted event (includes metrics)\n */\nexport interface ExecutionEmitEvent<TEvent = unknown> {\n type: 'execution_emit';\n event: TEvent;\n}\n\n/**\n * Event emitted when execution completes successfully.\n * @typeParam TResult - The type of the execution result\n */\nexport interface ExecutionDoneEvent<TResult = unknown> {\n type: 'execution_done';\n timestamp: number;\n duration: number;\n data: TResult;\n summary: SessionSummary;\n}\n\n/**\n * Event emitted when execution fails with an error.\n * @typeParam TResult - The type of partial result data (if available)\n */\nexport interface ExecutionErrorEvent<TResult = unknown> {\n type: 'execution_error';\n timestamp: number;\n duration: number;\n error: Error;\n data?: TResult;\n summary?: SessionSummary;\n}\n\n/**\n * No-op logger (default when no logger provided).\n *\n * @example\n * ```typescript\n * const provider = createGoogleProvider({\n * apiKey: 'xxx',\n * logger: noopLogger,\n * });\n * ```\n */\nexport const noopLogger: Logger = {};\n\n/**\n * Helper to create a logger with only the handlers you need.\n *\n * @example\n * ```typescript\n * const metricsLogger = createLogger({\n * onLLMCallEnd(event) {\n * metrics.recordLatency(event.response.duration);\n * },\n * onExecutionDone(event) {\n * metrics.recordTokens(event.summary.totalLLMUsage.totalTokens);\n * },\n * });\n * ```\n */\nexport function createLogger(handlers: Partial<Logger>): Logger {\n return handlers;\n}\n","export const ERRORS = {\n ALREADY_CONSUMED: 'Execution already consumed',\n METADATA_NOT_AVAILABLE:\n 'Metadata not available yet. Consume the execution first.',\n NO_RESULT: 'No result available',\n UNKNOWN_ERROR: 'Execution failed with unknown error',\n} as const;\n","/**\n * Calculate duration from start time in milliseconds.\n *\n * @param startTime - The start timestamp from Date.now()\n * @returns Duration in milliseconds\n */\nexport function getDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * Combine multiple AbortSignals into a single signal.\n * The combined signal aborts when ANY of the source signals abort.\n *\n * Node 18 compatible - doesn't use AbortSignal.any() which is Node 20+.\n *\n * @param signals - AbortSignals to combine\n * @returns A new AbortSignal that aborts when any input signal aborts\n *\n * @example\n * ```typescript\n * const userController = new AbortController();\n * const timeoutController = new AbortController();\n *\n * const combined = combineSignals(userController.signal, timeoutController.signal);\n *\n * // Either abort triggers the combined signal\n * userController.abort(); // combined.aborted === true\n * ```\n */\nexport function combineSignals(...signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n\n for (const signal of signals) {\n // If any signal is already aborted, immediately abort and return\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n\n // Listen for future aborts\n signal.addEventListener('abort', () => controller.abort(signal.reason), {\n once: true,\n });\n }\n\n return controller.signal;\n}\n\n/**\n * A Promise that can be resolved or rejected externally.\n *\n * Useful for bridging callback-based APIs to async/await patterns.\n * The resolve/reject functions are exposed as instance properties,\n * allowing external code to control when the promise settles.\n *\n * @typeParam T - The type of the resolved value (defaults to void)\n *\n * @example\n * ```typescript\n * const deferred = new Deferred<string>();\n *\n * // Later, in a callback:\n * someApi.onData((data) => deferred.resolve(data));\n * someApi.onError((err) => deferred.reject(err));\n *\n * // Await the result:\n * const result = await deferred.promise;\n * ```\n *\n * @example\n * ```typescript\n * // In async generator for event notification:\n * let pending = new Deferred<void>();\n * const subscriber = () => pending.resolve();\n *\n * while (!done) {\n * await pending.promise;\n * pending = new Deferred<void>(); // Reset for next wait\n * }\n * ```\n */\nexport class Deferred<T = void> {\n readonly promise: Promise<T>;\n readonly resolve: (value: T) => void;\n readonly reject: (error: Error) => void;\n\n constructor() {\n let res!: (value: T) => void;\n let rej!: (error: Error) => void;\n this.promise = new Promise<T>((resolve, reject) => {\n res = resolve;\n rej = reject;\n });\n this.resolve = res;\n this.reject = rej;\n }\n}\n","import type { ExecutionStatus } from './types';\n\n/**\n * Shared utilities for execution hosts.\n *\n * These functions extract common patterns from SimpleExecutionHost and\n * StreamingExecutionHost to reduce code duplication and ensure consistent\n * behavior across both implementations.\n */\n\n/**\n * Checks if an error is an abort-related error.\n *\n * An error is considered abort-related if either:\n * - The error has the name 'AbortError' (standard for AbortController)\n * - The signal has been aborted (covers edge cases where error name differs)\n *\n * @param error - The error to check\n * @param signal - The AbortSignal associated with the execution\n * @returns true if this is an abort-related error\n */\nexport function isAbortError(error: unknown, signal: AbortSignal): boolean {\n if (error instanceof Error && error.name === 'AbortError') {\n return true;\n }\n return signal.aborted;\n}\n\n/**\n * Normalizes an unknown error to an Error instance.\n *\n * If the error is already an Error instance, it's returned as-is.\n * Otherwise, it's converted to a string and wrapped in a new Error.\n *\n * @param error - The unknown error to normalize\n * @returns A proper Error instance\n */\nexport function normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Determines the execution status based on the execution state.\n *\n * Status determination priority:\n * 1. If user called cancel() OR the operation was aborted → 'canceled'\n * 2. If there's an error → 'failed'\n * 3. Otherwise → 'succeeded'\n *\n * Note: The 'aborted' flag takes precedence over 'hasError' because\n * AbortError is treated as a normal cancellation, not a failure.\n *\n * @param cancelRequested - Whether cancel() was explicitly called\n * @param aborted - Whether the signal was aborted (includes external abort)\n * @param hasError - Whether the execution ended with an error\n * @returns The appropriate execution status\n */\nexport function determineResultStatus(\n cancelRequested: boolean,\n aborted: boolean,\n hasError: boolean\n): ExecutionStatus {\n // Cancellation takes priority (abort errors are treated as cancellation)\n if (cancelRequested || aborted) {\n return 'canceled';\n }\n\n // Error state\n if (hasError) {\n return 'failed';\n }\n\n // Success\n return 'succeeded';\n}\n\n/**\n * Return type for createHookRunner utility.\n */\nexport type HookRunner = {\n /**\n * Ensures hooks run exactly once.\n * Safe to call multiple times - only executes on first call.\n */\n ensureRun: () => Promise<void>;\n /**\n * Check if hooks have already been run.\n */\n hasRun: () => boolean;\n};\n\n/**\n * Creates a hook runner that ensures hooks run exactly once.\n *\n * This utility encapsulates the common pattern of running cleanup hooks\n * with a guard flag to prevent double execution. Both SimpleExecutionHost\n * and StreamingExecutionHost use this pattern for onDone hooks.\n *\n * @param runHooks - The async function to run hooks\n * @returns Object with ensureRun() and hasRun() methods\n *\n * @example\n * ```typescript\n * const hookRunner = createHookRunner(async () => {\n * await session.runOnDoneHooks();\n * });\n *\n * // In finally block or cleanup:\n * await hookRunner.ensureRun();\n *\n * // Safe to call multiple times - only executes once\n * await hookRunner.ensureRun(); // no-op\n * ```\n */\nexport function createHookRunner(runHooks: () => Promise<void>): HookRunner {\n let ran = false;\n\n return {\n ensureRun: async () => {\n if (!ran) {\n ran = true;\n await runHooks();\n }\n },\n hasRun: () => ran,\n };\n}\n","import { SessionSummary } from '../session/types';\nimport type { StreamingSession } from '../session/streaming-session';\nimport type { ErrorEvent, ExtractResult, SessionEvent, SessionStreamGeneratorFn, StreamingExecution, StreamingResult } from './types';\nimport { ERRORS } from './constants';\nimport { combineSignals, Deferred } from './utils';\nimport { isAbortError, normalizeError, createHookRunner, type HookRunner } from './shared';\n\n/**\n * Internal result structure for tracking streaming execution outcome.\n */\ntype InternalStreamingResult<T> =\n | { success: true; result: T; summary: SessionSummary }\n | { success: false; error: Error; aborted: boolean; summary: SessionSummary };\n\n/**\n * Streaming execution host that uses StreamingSession.\n * Starts execution eagerly on construction - events are buffered automatically.\n *\n * @typeParam TEvent - User's pure domain event type with required `type` field (metrics added automatically)\n *\n * @example\n * ```typescript\n * const execution = new StreamingExecutionHost(\n * () => new StreamingSession({\n * defaultLanguageModel: provider.model,\n * fileManager: new GoogleFileManager(apiKey),\n * }),\n * async function* (session) {\n * session.onDone(() => session.fileManager.clear());\n * const result = await session.generateText({ prompt: 'Hello' });\n * yield session.emit({ type: 'progress', message: 'Working...' });\n * return session.done(result.text);\n * }\n * );\n * // ↑ Execution already started, events being buffered\n *\n * // Option 1: Stream events (buffered + real-time)\n * for await (const event of execution.stream()) {\n * console.log(event.type, event.metrics.elapsedMs);\n * }\n * const result = await execution.result();\n *\n * // Option 2: Skip streaming, events available in result\n * const result = await execution.result();\n * console.log(`Received ${result.events.length} events`);\n *\n * if (result.status === 'succeeded') {\n * console.log(result.value);\n * }\n * ```\n */\nexport class StreamingExecutionHost<\n TEvent extends { type: string },\n> implements StreamingExecution<TEvent> {\n private readonly abortController = new AbortController();\n private readonly effectiveSignal: AbortSignal;\n private readonly consumerPromise: Promise<InternalStreamingResult<ExtractResult<TEvent>>>;\n private readonly eventBuffer: SessionEvent<TEvent>[] = [];\n private readonly subscribers = new Set<(event: SessionEvent<TEvent>) => void>();\n private completed = false;\n private cleaned = false;\n private hookRunner: HookRunner | null = null;\n private cancelRequested = false;\n\n private extractedOutcome:\n | { type: 'result'; value: ExtractResult<TEvent> }\n | { type: 'error'; error: Error }\n | null = null;\n private extractedSummary: SessionSummary | null = null;\n\n constructor(\n private readonly createSession: (signal?: AbortSignal) => StreamingSession<TEvent>,\n private readonly generator: SessionStreamGeneratorFn<TEvent>,\n userSignal?: AbortSignal\n ) {\n // Combine user signal with internal controller for dual cancellation support\n this.effectiveSignal = userSignal\n ? combineSignals(userSignal, this.abortController.signal)\n : this.abortController.signal;\n\n // Eager start! Begin consuming immediately\n this.consumerPromise = this.startConsuming();\n }\n\n private hasDataField(event: SessionEvent<TEvent>): event is SessionEvent<TEvent> & { data: ExtractResult<TEvent> } {\n return 'data' in event && (event as { data?: unknown }).data !== undefined;\n }\n\n private hasSummaryField(event: SessionEvent<TEvent>): event is SessionEvent<TEvent> & { summary: SessionSummary } {\n return 'summary' in event && (event as { summary?: unknown }).summary !== undefined;\n }\n\n private hasErrorField(event: SessionEvent<TEvent>): event is SessionEvent<TEvent> & { error: Error } {\n return 'error' in event && (event as { error?: unknown }).error instanceof Error;\n }\n\n private extractResultAndMetadata(event: SessionEvent<TEvent>): void {\n const isCompleteOrError = event.type === 'complete' || event.type === 'error';\n\n if (!isCompleteOrError) {\n return;\n }\n\n // Extract outcome (error takes precedence if both present)\n if (this.hasErrorField(event)) {\n this.extractedOutcome = { type: 'error', error: event.error };\n } else if (this.hasDataField(event)) {\n this.extractedOutcome = { type: 'result', value: event.data };\n }\n\n if (this.hasSummaryField(event)) {\n this.extractedSummary = event.summary;\n }\n }\n\n private notifySubscribers(event: SessionEvent<TEvent>): void {\n this.subscribers.forEach(fn => fn(event));\n }\n\n private async startConsuming(): Promise<InternalStreamingResult<ExtractResult<TEvent>>> {\n // Pass the effective signal to session for AI SDK cancellation\n const session = this.createSession(this.effectiveSignal);\n this.hookRunner = createHookRunner(() => session.runOnDoneHooks());\n const gen = this.generator(session);\n\n try {\n let next = await gen.next();\n\n while (!next.done) {\n // Buffer and notify\n this.eventBuffer.push(next.value);\n this.notifySubscribers(next.value);\n\n // Auto-abort after terminal events to prevent further AI calls\n const isTerminal = next.value.type === 'complete' || next.value.type === 'error';\n if (isTerminal) {\n this.extractResultAndMetadata(next.value);\n this.abortController.abort();\n break;\n }\n\n if (this.abortController.signal.aborted) {\n break;\n }\n\n next = await gen.next();\n }\n\n // Handle return value from generator\n if (next.done && next.value !== undefined) {\n const finalEvent = await Promise.resolve(next.value);\n this.eventBuffer.push(finalEvent);\n this.notifySubscribers(finalEvent);\n this.extractResultAndMetadata(finalEvent);\n\n // Auto-abort after terminal event from return statement\n const isTerminal = finalEvent.type === 'complete' || finalEvent.type === 'error';\n if (isTerminal) {\n this.abortController.abort();\n }\n }\n\n return this.buildResult(session);\n } catch (error) {\n const errorObj = normalizeError(error);\n\n // AbortError is treated as normal cancellation\n if (isAbortError(error, this.abortController.signal)) {\n return {\n success: false,\n aborted: true,\n error: errorObj,\n summary: await session.getSummary(),\n };\n }\n\n // Generate error event via session.fail()\n const errorEvent = await session.fail(errorObj);\n this.eventBuffer.push(errorEvent);\n this.notifySubscribers(errorEvent);\n this.extractResultAndMetadata(errorEvent);\n\n // Auto-abort after error event\n this.abortController.abort();\n\n return this.buildResult(session);\n } finally {\n this.completed = true;\n // Note: Don't clear subscribers here - each stream() consumer\n // cleans up its own subscriber in its finally block to avoid orphaning\n\n await this.hookRunner?.ensureRun();\n\n await gen.return(undefined);\n }\n }\n\n private async buildResult(session: StreamingSession<TEvent>): Promise<InternalStreamingResult<ExtractResult<TEvent>>> {\n const summary = this.extractedSummary ?? await session.getSummary();\n\n // Use discriminated union for clean pattern matching\n if (this.extractedOutcome?.type === 'error') {\n return {\n success: false,\n aborted: false,\n error: this.extractedOutcome.error,\n summary,\n };\n }\n\n if (this.extractedOutcome?.type === 'result') {\n return {\n success: true,\n result: this.extractedOutcome.value,\n summary,\n };\n }\n\n // No result extracted - likely canceled or abnormal termination\n return {\n success: false,\n aborted: true,\n error: new Error(ERRORS.NO_RESULT),\n summary,\n };\n }\n\n /**\n * Get the event stream.\n * Returns buffered events first, then real-time events.\n * Can be called multiple times - replays buffer each time.\n */\n async *stream(): AsyncIterable<SessionEvent<TEvent | ErrorEvent>> {\n // 1. Yield buffered events first\n let index = 0;\n while (index < this.eventBuffer.length) {\n yield this.eventBuffer[index++];\n }\n\n // 2. If completed, we're done\n if (this.completed) {\n return;\n }\n\n // 3. Subscribe for real-time events using Deferred for clean async coordination\n const queue: SessionEvent<TEvent>[] = [];\n let pending = new Deferred<void>();\n\n const subscriber = (event: SessionEvent<TEvent>) => {\n queue.push(event);\n pending.resolve();\n };\n this.subscribers.add(subscriber);\n\n try {\n while (!this.completed || queue.length > 0) {\n if (queue.length > 0) {\n yield queue.shift()!;\n } else if (!this.completed) {\n await pending.promise;\n pending = new Deferred<void>(); // Reset for next wait\n }\n }\n } finally {\n this.subscribers.delete(subscriber);\n }\n }\n\n cancel(): void {\n this.cancelRequested = true;\n this.abortController.abort();\n }\n\n async cleanup(): Promise<void> {\n if (this.cleaned) {\n return;\n }\n this.cleaned = true;\n\n // Cancel if still running\n if (!this.completed) {\n this.cancel();\n await this.consumerPromise.catch(() => {});\n }\n\n // Clean up resources\n this.subscribers.clear();\n\n await this.hookRunner?.ensureRun();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.cleanup();\n }\n\n /**\n * Get the execution result with status, summary, and all events.\n * Never throws - returns a discriminated union with status.\n */\n async result(): Promise<StreamingResult<SessionEvent<TEvent | ErrorEvent>, ExtractResult<TEvent>>> {\n const internal = await this.consumerPromise;\n const events = Object.freeze([...this.eventBuffer]) as readonly SessionEvent<TEvent>[];\n\n // Success state\n if (internal.success) {\n return {\n status: 'succeeded',\n value: internal.result,\n summary: internal.summary,\n events,\n };\n }\n\n // Canceled state\n if (this.cancelRequested || internal.aborted) {\n return {\n status: 'canceled',\n summary: internal.summary,\n events,\n };\n }\n\n // Failed state\n return {\n status: 'failed',\n error: internal.error,\n summary: internal.summary,\n events,\n };\n }\n}\n","import { SessionSummary } from '../session/types';\nimport type { SimpleSession } from '../session/simple-session';\nimport type { SimpleExecution, SimpleResult } from './types';\nimport { combineSignals } from './utils';\nimport { isAbortError, normalizeError, createHookRunner } from './shared';\n\n/**\n * Internal result structure for tracking execution outcome.\n * Used to avoid throwing errors in the execution flow.\n */\ntype InternalResult<T> =\n | { success: true; result: T; summary: SessionSummary }\n | { success: false; error: Error; aborted: boolean; summary: SessionSummary };\n\n/**\n * SimpleExecutionHost implements the SimpleExecution interface for eager execution.\n *\n * Execution starts immediately on construction (eager evaluation).\n * Use result() to get the execution outcome with status and summary.\n *\n * Signal combination:\n * - If userSignal is provided, it's combined with internal AbortController\n * - Both cancel() and userSignal abort will trigger cancellation\n * - The combined signal is passed to SimpleSession for AI SDK calls\n *\n * @example\n * ```typescript\n * const execution = new SimpleExecutionHost(createSession, async (session) => {\n * return await session.generateText({ prompt: 'Hello' });\n * });\n *\n * const result = await execution.result();\n *\n * if (result.status === 'succeeded') {\n * console.log(result.value);\n * }\n * console.log(`Cost: $${result.summary.totalCost}`);\n * ```\n */\nexport class SimpleExecutionHost<TResult> implements SimpleExecution<TResult> {\n private readonly abortController = new AbortController();\n private readonly effectiveSignal: AbortSignal;\n private readonly consumerPromise: Promise<InternalResult<TResult>>;\n private cachedSession?: SimpleSession;\n private readonly startTime = Date.now();\n private cancelRequested = false;\n\n constructor(\n createSession: (signal?: AbortSignal) => SimpleSession,\n fn: (session: SimpleSession) => Promise<TResult>,\n userSignal?: AbortSignal\n ) {\n // Combine user signal with internal controller for dual cancellation support\n this.effectiveSignal = userSignal\n ? combineSignals(userSignal, this.abortController.signal)\n : this.abortController.signal;\n\n // Start execution immediately (eager evaluation)\n this.consumerPromise = this.execute(createSession, fn);\n }\n\n private async execute(\n createSession: (signal?: AbortSignal) => SimpleSession,\n fn: (session: SimpleSession) => Promise<TResult>\n ): Promise<InternalResult<TResult>> {\n const session = createSession(this.effectiveSignal);\n this.cachedSession = session;\n const hookRunner = createHookRunner(() => session.runOnDoneHooks());\n\n // Notify execution start\n session.notifyExecutionStart();\n\n try {\n const result = await fn(session);\n\n // Notify execution done\n await session.notifyExecutionDone(result, this.startTime);\n\n return {\n success: true,\n result,\n summary: await session.getSummary(),\n };\n } catch (error) {\n const errorObj = normalizeError(error);\n const isCancellation = isAbortError(error, this.abortController.signal);\n\n // Notify execution error (AbortError excluded - treated as normal cancellation)\n if (!isCancellation) {\n await session.notifyExecutionError(errorObj, this.startTime);\n }\n\n return {\n success: false,\n error: errorObj,\n aborted: isCancellation,\n summary: await session.getSummary(),\n };\n } finally {\n await hookRunner.ensureRun();\n }\n }\n\n /**\n * Request cancellation of the execution.\n * Aborts the current LLM call if in progress.\n * No-op if execution already completed.\n */\n cancel(): void {\n this.cancelRequested = true;\n this.abortController.abort();\n }\n\n /**\n * Get the execution result with status and summary.\n * Never throws - returns a discriminated union with status.\n */\n async result(): Promise<SimpleResult<TResult>> {\n const internal = await this.consumerPromise;\n\n // Success state\n if (internal.success) {\n return {\n status: 'succeeded',\n value: internal.result,\n summary: internal.summary,\n };\n }\n\n // Canceled state (user called cancel() or external signal aborted)\n if (this.cancelRequested || internal.aborted) {\n return {\n status: 'canceled',\n summary: internal.summary,\n };\n }\n\n // Failed state\n return {\n status: 'failed',\n error: internal.error,\n summary: internal.summary,\n };\n }\n\n /**\n * Cleanup resources.\n * For SimpleExecution, hooks are already run during execution,\n * so this is intentionally a no-op.\n */\n async cleanup(): Promise<void> {\n // SimpleExecution runs hooks in execute(), nothing to clean up\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.cleanup();\n }\n}\n","import type { Logger } from '@/observability/logger';\nimport type { ProviderPricing } from '@/pricing';\nimport type { SessionEvent, StreamingExecution, SimpleExecution, ExecutionOptions } from '../execution/types';\nimport { StreamingExecutionHost } from '../execution/streaming-host';\nimport { SimpleExecutionHost } from '../execution/simple-host';\nimport type { SimpleSession } from '../session/simple-session';\nimport type { StreamingSession } from '../session/streaming-session';\nimport type { Provider } from './types';\n\n/**\n * Abstract base class for AI providers.\n *\n * Provides common streamingExecution and simpleExecution implementation.\n * Subclasses implement session creation and fluent configuration methods.\n */\nexport abstract class BaseProvider implements Provider {\n /**\n * Create a SimpleSession for non-streaming execution.\n * @param signal - AbortSignal for cancellation support\n */\n protected abstract createSimpleSession(signal?: AbortSignal): SimpleSession;\n\n /**\n * Create a StreamingSession for streaming execution.\n * @param signal - AbortSignal for cancellation support\n */\n protected abstract createStreamingSession<\n TEvent extends { type: string },\n >(signal?: AbortSignal): StreamingSession<TEvent>;\n\n abstract withDefaultModel(modelId: string): Provider;\n\n abstract withLogger(logger: Logger): Provider;\n\n abstract withPricing(pricing: ProviderPricing): Provider;\n\n abstract withDefaultOptions(options: Record<string, unknown>): Provider;\n\n streamingExecution<TEvent extends { type: string }>(\n generator: (\n session: StreamingSession<TEvent>\n ) => AsyncGenerator<SessionEvent<TEvent>, SessionEvent<TEvent> | Promise<SessionEvent<TEvent>>>,\n options?: ExecutionOptions\n ): StreamingExecution<TEvent> {\n return new StreamingExecutionHost(\n (signal) => this.createStreamingSession<TEvent>(signal),\n generator,\n options?.signal\n );\n }\n\n /**\n * Execute a non-streaming function with cancellation support.\n * Returns immediately - execution starts in the background.\n */\n simpleExecution<TResult>(\n fn: (session: SimpleSession) => Promise<TResult>,\n options?: ExecutionOptions\n ): SimpleExecution<TResult> {\n return new SimpleExecutionHost(\n (signal) => this.createSimpleSession(signal),\n fn,\n options?.signal\n );\n }\n}\n","/**\n * Built-in pricing tables (USD per million tokens).\n *\n * These are the default prices for common models. They can be overridden\n * using `configurePricing()` (global) or `Provider.withPricing()` (per-provider).\n *\n * Last updated: January 2025\n *\n * @module pricing/defaults\n */\n\nimport type { ModelPricing, PricingConfig, ProviderPricing } from './types';\n\n/**\n * OpenAI model pricing.\n * @see https://openai.com/pricing\n */\nexport const OPENAI_PRICING: ProviderPricing = {\n 'gpt-4o': { inputPricePerMillion: 2.5, outputPricePerMillion: 10.0 },\n 'gpt-4o-mini': { inputPricePerMillion: 0.15, outputPricePerMillion: 0.6 },\n 'gpt-4-turbo': { inputPricePerMillion: 10.0, outputPricePerMillion: 30.0 },\n 'gpt-4-turbo-preview': {\n inputPricePerMillion: 10.0,\n outputPricePerMillion: 30.0,\n },\n 'gpt-4': { inputPricePerMillion: 30.0, outputPricePerMillion: 60.0 },\n 'gpt-4-32k': { inputPricePerMillion: 60.0, outputPricePerMillion: 120.0 },\n 'gpt-3.5-turbo': { inputPricePerMillion: 0.5, outputPricePerMillion: 1.5 },\n 'gpt-3.5-turbo-16k': {\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 4.0,\n },\n 'o1': { inputPricePerMillion: 15.0, outputPricePerMillion: 60.0 },\n 'o1-mini': { inputPricePerMillion: 3.0, outputPricePerMillion: 12.0 },\n 'o1-preview': { inputPricePerMillion: 15.0, outputPricePerMillion: 60.0 },\n 'o3': { inputPricePerMillion: 20.0, outputPricePerMillion: 80.0 },\n 'o3-mini': { inputPricePerMillion: 4.0, outputPricePerMillion: 16.0 },\n};\n\n/**\n * Google Gemini model pricing.\n * @see https://ai.google.dev/gemini-api/docs/pricing\n */\nexport const GOOGLE_PRICING: ProviderPricing = {\n 'gemini-2.5-flash': {\n inputPricePerMillion: 0.15,\n outputPricePerMillion: 0.6,\n cachedInputPricePerMillion: 0.0375,\n },\n 'gemini-2.5-flash-lite': {\n inputPricePerMillion: 0.075,\n outputPricePerMillion: 0.3,\n cachedInputPricePerMillion: 0.01875,\n },\n 'gemini-2.5-pro': {\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 10.0,\n cachedInputPricePerMillion: 0.3125,\n },\n 'gemini-2.0-flash': {\n inputPricePerMillion: 0.1,\n outputPricePerMillion: 0.4,\n cachedInputPricePerMillion: 0.025,\n },\n 'gemini-2.0-flash-lite': {\n inputPricePerMillion: 0.075,\n outputPricePerMillion: 0.3,\n cachedInputPricePerMillion: 0.01875,\n },\n 'gemini-1.5-pro': {\n inputPricePerMillion: 1.25,\n outputPricePerMillion: 5.0,\n cachedInputPricePerMillion: 0.3125,\n },\n 'gemini-1.5-flash': {\n inputPricePerMillion: 0.075,\n outputPricePerMillion: 0.3,\n cachedInputPricePerMillion: 0.01875,\n },\n 'gemini-1.5-flash-8b': {\n inputPricePerMillion: 0.0375,\n outputPricePerMillion: 0.15,\n cachedInputPricePerMillion: 0.01,\n },\n 'gemini-pro': { inputPricePerMillion: 0.5, outputPricePerMillion: 1.5 },\n};\n\n/**\n * Anthropic Claude model pricing.\n * @see https://www.anthropic.com/pricing\n */\nexport const ANTHROPIC_PRICING: ProviderPricing = {\n 'claude-opus-4-5-20250514': {\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 75.0,\n cachedInputPricePerMillion: 1.875,\n },\n 'claude-sonnet-4-20250514': {\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cachedInputPricePerMillion: 0.375,\n },\n 'claude-3-5-sonnet-20241022': {\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cachedInputPricePerMillion: 0.375,\n },\n 'claude-3-5-haiku-20241022': {\n inputPricePerMillion: 0.8,\n outputPricePerMillion: 4.0,\n cachedInputPricePerMillion: 0.1,\n },\n 'claude-3-opus-20240229': {\n inputPricePerMillion: 15.0,\n outputPricePerMillion: 75.0,\n cachedInputPricePerMillion: 1.875,\n },\n 'claude-3-sonnet-20240229': {\n inputPricePerMillion: 3.0,\n outputPricePerMillion: 15.0,\n cachedInputPricePerMillion: 0.375,\n },\n 'claude-3-haiku-20240307': {\n inputPricePerMillion: 0.25,\n outputPricePerMillion: 1.25,\n cachedInputPricePerMillion: 0.03,\n },\n};\n\nexport const DEFAULT_PRICING_CONFIG: Required<PricingConfig> = {\n providers: {\n openai: OPENAI_PRICING,\n google: GOOGLE_PRICING,\n anthropic: ANTHROPIC_PRICING,\n },\n fallback: {\n inputPricePerMillion: 1.0,\n outputPricePerMillion: 5.0,\n },\n};\n\nexport const DEFAULT_FALLBACK_PRICING: ModelPricing = {\n inputPricePerMillion: 1.0,\n outputPricePerMillion: 5.0,\n};\n","/**\n * Global pricing configuration.\n *\n * Priority order (highest to lowest):\n * 1. Provider.withPricing() - per-provider override\n * 2. configurePricing() - global override\n * 3. Built-in defaults (defaults.ts)\n * 4. Fallback pricing\n *\n * @module pricing/config\n */\n\nimport type { ModelPricing, PricingConfig, ProviderType } from './types';\nimport { validatePricingConfig } from './validator';\nimport { DEFAULT_PRICING_CONFIG, DEFAULT_FALLBACK_PRICING } from './defaults';\n\nlet globalConfig: PricingConfig | undefined;\n\n/**\n * Configure global pricing overrides.\n *\n * WARNING: This uses global mutable state and is not thread-safe.\n * For multi-tenant scenarios or concurrent requests with different pricing,\n * use `Provider.withPricing()` instead for proper isolation.\n *\n * @example\n * ```typescript\n * configurePricing({\n * providers: {\n * google: {\n * 'gemini-2.5-flash': { inputPricePerMillion: 0.5, outputPricePerMillion: 3.0 },\n * },\n * },\n * });\n *\n * // Reset to built-in defaults\n * configurePricing(undefined);\n * ```\n */\nexport function configurePricing(config: PricingConfig | undefined): void {\n if (config) {\n validatePricingConfig(config);\n }\n globalConfig = config;\n}\n\nexport function getPricingConfig(): PricingConfig | undefined {\n return globalConfig;\n}\n\n/**\n * Reset global pricing configuration.\n * Useful for testing to ensure clean state between tests.\n */\nexport function resetPricingConfig(): void {\n globalConfig = undefined;\n}\n\nexport type PricingSource = 'global' | 'default' | 'fallback';\n\nexport interface EffectivePricingResult {\n pricing: ModelPricing;\n source: PricingSource;\n}\n\n/**\n * Get effective pricing for a model with source information.\n * Useful for debugging to understand which pricing layer is applied.\n *\n * @example\n * ```typescript\n * const result = getEffectivePricing('gemini-2.5-flash', 'google');\n * console.log(result.source); // 'default' (using built-in pricing)\n *\n * configurePricing({ providers: { google: { 'gemini-2.5-flash': {...} } } });\n * const result2 = getEffectivePricing('gemini-2.5-flash', 'google');\n * console.log(result2.source); // 'global' (using configured override)\n * ```\n */\nexport function getEffectivePricing(\n model: string,\n provider: ProviderType\n): EffectivePricingResult {\n if (globalConfig?.providers?.[provider]?.[model]) {\n return {\n pricing: globalConfig.providers[provider]![model],\n source: 'global',\n };\n }\n\n const defaultPricing = DEFAULT_PRICING_CONFIG.providers[provider];\n if (defaultPricing?.[model]) {\n return {\n pricing: defaultPricing[model],\n source: 'default',\n };\n }\n\n return {\n pricing:\n globalConfig?.fallback ??\n DEFAULT_PRICING_CONFIG.fallback ??\n DEFAULT_FALLBACK_PRICING,\n source: 'fallback',\n };\n}\n","/**\n * Cost calculation functions.\n *\n * @module pricing/calculator\n *\n * NOTE: Cost calculations use standard JavaScript floating-point arithmetic.\n * For high-volume usage tracking, accumulated totals may have minor precision drift.\n * For financial reporting, consider rounding results to appropriate decimal places\n * (e.g., `Math.round(cost * 100) / 100` for cents).\n */\n\nimport type { LanguageModelUsage } from 'ai';\nimport type {\n CalculateCostParams,\n CostResult,\n ModelPricing,\n ProviderPricing,\n ProviderType,\n} from './types';\nimport { DEFAULT_PRICING_CONFIG, DEFAULT_FALLBACK_PRICING } from './defaults';\nimport { getPricingConfig } from './config';\n\nconst TOKENS_PER_MILLION = 1_000_000;\n\n/**\n * Get pricing for a specific model.\n *\n * Resolution order:\n * 1. Provider-level config (providerPricing param)\n * 2. Global config (configurePricing)\n * 3. Built-in defaults\n * 4. Fallback pricing\n */\nexport function getModelPricing(\n model: string,\n provider: ProviderType,\n providerPricing?: ProviderPricing\n): ModelPricing {\n if (providerPricing?.[model]) {\n return providerPricing[model];\n }\n\n const globalConfig = getPricingConfig();\n if (globalConfig?.providers?.[provider]?.[model]) {\n return globalConfig.providers[provider][model];\n }\n\n const defaultProviderPricing = DEFAULT_PRICING_CONFIG.providers[provider];\n if (defaultProviderPricing?.[model]) {\n return defaultProviderPricing[model];\n }\n\n return (\n globalConfig?.fallback ??\n DEFAULT_PRICING_CONFIG.fallback ??\n DEFAULT_FALLBACK_PRICING\n );\n}\n\nfunction validateCostParams(params: CalculateCostParams): void {\n const { inputTokens, outputTokens, cachedInputTokens = 0 } = params;\n\n if (inputTokens < 0 || outputTokens < 0 || cachedInputTokens < 0) {\n throw new Error('Token counts must be non-negative');\n }\n\n if (cachedInputTokens > inputTokens) {\n throw new Error('cachedInputTokens cannot exceed inputTokens');\n }\n\n if (\n !Number.isFinite(inputTokens) ||\n !Number.isFinite(outputTokens) ||\n !Number.isFinite(cachedInputTokens)\n ) {\n throw new Error('Token counts must be finite numbers');\n }\n}\n\n/**\n * Calculate cost from token counts.\n *\n * @throws Error if token counts are negative, non-finite, or if cachedInputTokens > inputTokens\n *\n * @example\n * ```typescript\n * const cost = calculateCost({\n * inputTokens: 1000,\n * outputTokens: 500,\n * cachedInputTokens: 200,\n * model: 'gemini-2.5-flash',\n * provider: 'google',\n * });\n * console.log(cost.total); // 0.000315\n * ```\n */\nexport function calculateCost(\n params: CalculateCostParams,\n providerPricing?: ProviderPricing\n): CostResult {\n validateCostParams(params);\n\n const {\n inputTokens,\n outputTokens,\n cachedInputTokens = 0,\n model,\n provider,\n } = params;\n\n const pricing = getModelPricing(model, provider, providerPricing);\n\n const nonCachedInputTokens = inputTokens - cachedInputTokens;\n const inputCost =\n (nonCachedInputTokens / TOKENS_PER_MILLION) * pricing.inputPricePerMillion;\n const outputCost =\n (outputTokens / TOKENS_PER_MILLION) * pricing.outputPricePerMillion;\n\n const cachedInputPricePerMillion =\n pricing.cachedInputPricePerMillion ?? pricing.inputPricePerMillion;\n const cachedInputCost =\n (cachedInputTokens / TOKENS_PER_MILLION) * cachedInputPricePerMillion;\n\n return {\n total: inputCost + outputCost + cachedInputCost,\n inputCost,\n outputCost,\n cachedInputCost,\n };\n}\n\n/**\n * Calculate cost from AI SDK LanguageModelUsage.\n *\n * Convenience function that extracts token counts from the\n * AI SDK's LanguageModelUsage type and calculates the cost.\n *\n * @example\n * ```typescript\n * const usage = await result.usage;\n * const cost = calculateCostFromUsage(usage, 'gemini-2.5-flash', 'google');\n * ```\n */\nexport function calculateCostFromUsage(\n usage: LanguageModelUsage,\n model: string,\n provider: ProviderType,\n providerPricing?: ProviderPricing\n): CostResult {\n return calculateCost(\n {\n inputTokens: usage.inputTokens ?? 0,\n outputTokens: usage.outputTokens ?? 0,\n cachedInputTokens: usage.inputTokenDetails?.cacheReadTokens ?? 0,\n model,\n provider,\n },\n providerPricing\n );\n}\n\n/**\n * Calculate total cost for multiple LLM calls.\n *\n * Aggregates costs from multiple calls, grouping by model.\n *\n * @returns Object with:\n * - `totalCost`: Sum of all call costs in USD\n * - `costByModel`: Map where key format is `${provider}/${model}`\n */\nexport function calculateTotalCost(\n calls: Array<{\n usage: LanguageModelUsage;\n model: string;\n provider: ProviderType;\n }>,\n providerPricing?: ProviderPricing\n): { totalCost: number; costByModel: Record<string, number> } {\n const costByModel: Record<string, number> = {};\n let totalCost = 0;\n\n for (const call of calls) {\n const cost = calculateCostFromUsage(\n call.usage,\n call.model,\n call.provider,\n providerPricing\n );\n totalCost += cost.total;\n\n const key = `${call.provider}/${call.model}`;\n costByModel[key] = (costByModel[key] ?? 0) + cost.total;\n }\n\n return { totalCost, costByModel };\n}\n","import {\n generateText as aiGenerateText,\n streamText as aiStreamText,\n} from 'ai';\nimport type {\n LanguageModel,\n LanguageModelUsage,\n ToolSet,\n} from 'ai';\nimport merge from 'lodash/merge';\nimport type { Logger } from '@/observability/logger';\nimport { noopLogger } from '@/observability/logger';\nimport type { FileManager } from '@/provider/types';\nimport type { ProviderType, ProviderPricing } from '@/pricing/types';\nimport { calculateTotalCost } from '@/pricing/calculator';\nimport {\n SessionSummary,\n type DefaultOutput,\n type GenerateTextParams,\n type GenerateTextResultTyped,\n type StreamTextParams,\n type StreamTextResultTyped,\n type LLMCallRecord,\n type LLMCallType,\n type ToolCallSummary,\n type OutputSpec,\n type AdditionalCost,\n} from './types';\nimport { mergeUsages, createZeroUsage } from './usage-extractors';\n\n/**\n * Provider-specific options type.\n * Maps provider names (e.g., 'google', 'openai') to their option objects.\n */\ntype ProviderOptions = Record<string, Record<string, unknown>>;\n\nexport interface SimpleSessionOptions {\n defaultLanguageModel?: LanguageModel | null;\n modelFactory?: (modelId: string) => LanguageModel;\n providerType: ProviderType;\n providerPricing?: ProviderPricing;\n fileManager: FileManager;\n logger?: Logger;\n startTime?: number;\n /**\n * AbortSignal for cancelling AI SDK calls.\n * When aborted, ongoing generateText/streamText calls will be cancelled.\n */\n signal?: AbortSignal;\n /**\n * Default provider-specific options to apply to all LLM calls.\n * These will be deep-merged with per-call providerOptions (per-call takes precedence).\n */\n defaultProviderOptions?: ProviderOptions;\n /**\n * Default tools to apply to all LLM calls (e.g., google_search, url_context).\n * These will be merged with per-call tools (per-call takes precedence).\n */\n defaultTools?: ToolSet;\n}\n\nexport class SimpleSession {\n private readonly defaultLanguageModel: LanguageModel | null;\n private readonly modelFactory: ((modelId: string) => LanguageModel) | null;\n private readonly providerType: ProviderType;\n private readonly providerPricing: ProviderPricing | undefined;\n private readonly defaultProviderOptions: ProviderOptions | undefined;\n private readonly defaultTools: ToolSet | undefined;\n private readonly _fileManager: FileManager;\n private readonly logger: Logger;\n private readonly sessionStartTime: number;\n private readonly signal?: AbortSignal;\n\n private summary!: SessionSummary;\n private readonly pendingUsagePromises: Promise<LanguageModelUsage | undefined>[] = [];\n\n private readonly onDoneFns: Array<() => Promise<void> | void> = [];\n\n constructor(options: SimpleSessionOptions) {\n this.defaultLanguageModel = options.defaultLanguageModel ?? null;\n this.modelFactory = options.modelFactory ?? null;\n this.providerType = options.providerType;\n this.providerPricing = options.providerPricing;\n this.defaultProviderOptions = options.defaultProviderOptions;\n this.defaultTools = options.defaultTools;\n this._fileManager = options.fileManager;\n this.logger = options.logger ?? noopLogger;\n this.sessionStartTime = options.startTime ?? Date.now();\n this.signal = options.signal;\n this.summary = SessionSummary.empty(this.sessionStartTime);\n }\n\n private getModel(requestedModelId?: string): LanguageModel {\n if (requestedModelId) {\n if (!this.modelFactory) {\n throw new Error(\n `Model '${requestedModelId}' requested but no modelFactory provided. ` +\n `Either use the default model or configure the provider with modelFactory.`\n );\n }\n return this.modelFactory(requestedModelId);\n }\n\n if (!this.defaultLanguageModel) {\n throw new Error(\n 'No model specified and no default model set. ' +\n 'Either specify a model in the call or configure the provider with withDefaultModel().'\n );\n }\n return this.defaultLanguageModel;\n }\n\n private extractModelId(model: LanguageModel): string {\n const modelWithId = model as unknown as { modelId?: string };\n if (!modelWithId.modelId) {\n console.warn(\n '[SimpleSession] Model does not have modelId property, using \"unknown\". ' +\n 'This may affect cost tracking accuracy.'\n );\n }\n return modelWithId.modelId ?? 'unknown';\n }\n\n async generateText<\n TOOLS extends ToolSet = {},\n OUTPUT extends OutputSpec = DefaultOutput,\n >(\n params: GenerateTextParams<TOOLS, OUTPUT>\n ): Promise<GenerateTextResultTyped<TOOLS, OUTPUT>> {\n const callStartTime = Date.now();\n const { model: requestedModel, providerOptions, tools, ...restParams } = params;\n const languageModel = this.getModel(requestedModel);\n const modelId = this.extractModelId(languageModel);\n\n // Deep merge default + per-call options (per-call takes precedence)\n const mergedProviderOptions = (this.defaultProviderOptions || providerOptions)\n ? merge({}, this.defaultProviderOptions ?? {}, providerOptions ?? {})\n : undefined;\n\n // Merge default tools with per-call tools (per-call takes precedence)\n const mergedTools = (this.defaultTools || tools)\n ? { ...this.defaultTools, ...tools }\n : undefined;\n\n this.logger.onLLMCallStart?.({\n type: 'llm_call_start',\n callType: 'generateText',\n modelId,\n timestamp: callStartTime,\n request: { params: restParams as Record<string, unknown> },\n });\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await aiGenerateText({\n ...restParams,\n tools: mergedTools,\n providerOptions: mergedProviderOptions,\n model: languageModel,\n abortSignal: this.signal,\n } as any);\n const callEndTime = Date.now();\n\n const call: LLMCallRecord = {\n startTime: callStartTime,\n endTime: callEndTime,\n duration: callEndTime - callStartTime,\n usage: result.usage ?? createZeroUsage(),\n type: 'generateText',\n model: modelId,\n provider: this.providerType,\n };\n this.updateSummaryWithLLMCall(call);\n\n this.logger.onLLMCallEnd?.({\n type: 'llm_call_end',\n callType: 'generateText',\n modelId,\n timestamp: callEndTime,\n response: {\n duration: callEndTime - callStartTime,\n usage: result.usage,\n raw: result,\n },\n });\n\n return result as unknown as GenerateTextResultTyped<TOOLS, OUTPUT>;\n } catch (error) {\n const callEndTime = Date.now();\n\n this.logger.onLLMCallEnd?.({\n type: 'llm_call_end',\n callType: 'generateText',\n modelId,\n timestamp: callEndTime,\n response: {\n duration: callEndTime - callStartTime,\n raw: null,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n });\n\n throw error;\n }\n }\n\n streamText<\n TOOLS extends ToolSet = {},\n OUTPUT extends OutputSpec = DefaultOutput,\n >(params: StreamTextParams<TOOLS, OUTPUT>): StreamTextResultTyped<TOOLS, OUTPUT> {\n const callStartTime = Date.now();\n const { model: requestedModel, providerOptions, tools, ...restParams } = params;\n const languageModel = this.getModel(requestedModel);\n const modelId = this.extractModelId(languageModel);\n\n // Deep merge default + per-call options (per-call takes precedence)\n const mergedProviderOptions = (this.defaultProviderOptions || providerOptions)\n ? merge({}, this.defaultProviderOptions ?? {}, providerOptions ?? {})\n : undefined;\n\n // Merge default tools with per-call tools (per-call takes precedence)\n const mergedTools = (this.defaultTools || tools)\n ? { ...this.defaultTools, ...tools }\n : undefined;\n\n this.logger.onLLMCallStart?.({\n type: 'llm_call_start',\n callType: 'streamText',\n modelId,\n timestamp: callStartTime,\n request: { params: restParams as Record<string, unknown> },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = aiStreamText({\n ...restParams,\n tools: mergedTools,\n providerOptions: mergedProviderOptions,\n model: languageModel,\n abortSignal: this.signal,\n } as any);\n\n const usagePromise = Promise.resolve(result.usage).then((usage) => {\n const callEndTime = Date.now();\n\n const call: LLMCallRecord = {\n startTime: callStartTime,\n endTime: callEndTime,\n duration: callEndTime - callStartTime,\n usage: usage ?? createZeroUsage(),\n type: 'streamText',\n model: modelId,\n provider: this.providerType,\n };\n this.updateSummaryWithLLMCall(call);\n\n this.logger.onLLMCallEnd?.({\n type: 'llm_call_end',\n callType: 'streamText',\n modelId,\n timestamp: callEndTime,\n response: {\n duration: callEndTime - callStartTime,\n usage,\n raw: result,\n },\n });\n\n return usage;\n });\n\n this.pendingUsagePromises.push(usagePromise);\n\n return result as unknown as StreamTextResultTyped<TOOLS, OUTPUT>;\n }\n\n get fileManager(): FileManager {\n return this._fileManager;\n }\n\n record(data: Record<string, unknown>): void {\n this.summary = this.summary.withCustomRecord(data);\n }\n\n recordToolCall(toolCallSummary: ToolCallSummary): void {\n this.summary = this.summary.withToolCall(toolCallSummary);\n }\n\n recordLLMCall(record: Omit<LLMCallRecord, 'type'> & { type?: LLMCallType }): void {\n const call: LLMCallRecord = {\n ...record,\n type: record.type ?? 'manual',\n };\n this.updateSummaryWithLLMCall(call);\n }\n\n recordAdditionalCost(cost: Omit<AdditionalCost, 'timestamp'>): void {\n this.summary = this.summary.withAdditionalCost({\n ...cost,\n timestamp: Date.now(),\n });\n }\n\n setMetadata(key: string, value: unknown): void;\n setMetadata(data: Record<string, unknown>): void;\n setMetadata(keyOrData: string | Record<string, unknown>, value?: unknown): void {\n if (typeof keyOrData === 'string') {\n this.summary = this.summary.withMetadata(keyOrData, value);\n } else {\n for (const [k, v] of Object.entries(keyOrData)) {\n this.summary = this.summary.withMetadata(k, v);\n }\n }\n }\n\n private updateSummaryWithLLMCall(call: LLMCallRecord): void {\n const newCalls = [...this.summary.llmCalls, call];\n const { totalCost: llmCost, costByModel } = calculateTotalCost(\n newCalls.map((c) => ({ usage: c.usage, model: c.model, provider: c.provider })),\n this.providerPricing\n );\n const newTotalUsage = mergeUsages(newCalls.map((c) => c.usage));\n\n this.summary = this.summary.withLLMCall(call, llmCost, costByModel, newTotalUsage);\n }\n\n onDone(fn: () => Promise<void> | void): void {\n this.onDoneFns.push(fn);\n }\n\n async runOnDoneHooks(): Promise<void> {\n const reversedHooks = [...this.onDoneFns].reverse();\n\n for (const fn of reversedHooks) {\n try {\n await fn();\n } catch (error) {\n console.error('[SimpleSession] onDone hook error:', error);\n }\n }\n }\n\n async getSummary(): Promise<SessionSummary> {\n await Promise.all(this.pendingUsagePromises);\n return this.summary;\n }\n\n /**\n * Notifies Logger of execution start.\n * @internal Called by SimpleExecutionHost - not intended for direct use.\n */\n notifyExecutionStart(): void {\n this._logger.onExecutionStart?.({\n type: 'execution_start',\n timestamp: Date.now(),\n });\n }\n\n /**\n * Notifies Logger of execution completion with result data and summary.\n * @param data - The execution result data\n * @param startTime - Execution start timestamp for duration calculation\n * @internal Called by SimpleExecutionHost - not intended for direct use.\n */\n async notifyExecutionDone<T>(data: T, startTime: number): Promise<void> {\n const summary = await this.getSummary();\n this._logger.onExecutionDone?.({\n type: 'execution_done',\n timestamp: Date.now(),\n duration: Date.now() - startTime,\n data,\n summary,\n });\n }\n\n /**\n * Notifies Logger of execution error with error details and summary (if available).\n * Gracefully handles getSummary() failures - summary will be undefined if it fails.\n * @param error - The error that occurred\n * @param startTime - Execution start timestamp for duration calculation\n * @internal Called by SimpleExecutionHost - not intended for direct use.\n */\n async notifyExecutionError(error: Error, startTime: number): Promise<void> {\n let summary: SessionSummary | undefined;\n try {\n summary = await this.getSummary();\n } catch {\n // Ignore summary errors on failure path\n }\n this._logger.onExecutionError?.({\n type: 'execution_error',\n timestamp: Date.now(),\n duration: Date.now() - startTime,\n error,\n summary,\n });\n }\n\n protected get _logger(): Logger {\n return this.logger;\n }\n\n protected get _startTime(): number {\n return this.sessionStartTime;\n }\n\n protected get _modelId(): string {\n if (!this.defaultLanguageModel) {\n return 'unknown';\n }\n return this.extractModelId(this.defaultLanguageModel);\n }\n}\n","import type { LanguageModel, ToolSet } from 'ai';\nimport type { EventMetrics } from '@/observability';\nimport type { Logger } from '@/observability/logger';\nimport { noopLogger } from '@/observability/logger';\nimport type { FileManager } from '@/provider/types';\nimport type { ProviderType, ProviderPricing } from '@/pricing/types';\nimport type { SessionSummary } from './types';\nimport { SimpleSession } from './simple-session';\nimport type { SessionEvent, EmittableEventInput, ExtractResult } from '@/execution/types';\n\ntype ProviderOptions = Record<string, Record<string, unknown>>;\n\nexport interface StreamingSessionOptions {\n defaultLanguageModel?: LanguageModel | null;\n modelFactory?: (modelId: string) => LanguageModel;\n providerType: ProviderType;\n providerPricing?: ProviderPricing;\n fileManager: FileManager;\n logger?: Logger;\n startTime?: number;\n signal?: AbortSignal;\n defaultProviderOptions?: ProviderOptions;\n defaultTools?: ToolSet;\n}\n\nexport class StreamingSession<TEvent extends { type: string }> extends SimpleSession {\n private lastEventTime: number;\n private _terminated = false;\n\n constructor(options: StreamingSessionOptions) {\n super({\n defaultLanguageModel: options.defaultLanguageModel,\n modelFactory: options.modelFactory,\n providerType: options.providerType,\n providerPricing: options.providerPricing,\n fileManager: options.fileManager,\n logger: options.logger,\n startTime: options.startTime,\n signal: options.signal,\n defaultProviderOptions: options.defaultProviderOptions,\n defaultTools: options.defaultTools,\n });\n\n this.lastEventTime = this._startTime;\n\n this._logger.onExecutionStart?.({\n type: 'execution_start',\n timestamp: Date.now(),\n });\n }\n\n /**\n * Emits a streaming event with automatically attached metrics.\n *\n * Reserved types ('complete', 'error') throw at runtime - use session.done()\n * or session.fail() instead.\n *\n * @param event - The event to emit (metrics will be added automatically)\n * @returns The complete event with metrics attached\n * @throws Error when attempting to emit reserved types ('complete', 'error')\n */\n emit(event: EmittableEventInput<TEvent>): SessionEvent<TEvent> {\n if (this._terminated) {\n throw new Error('Session already terminated. Cannot call emit() after a terminal operation.');\n }\n\n // Runtime check: prevent reserved types even when TypeScript is bypassed\n const eventType = (event as { type: string }).type;\n if (eventType === 'complete' || eventType === 'error') {\n throw new Error(\n `Cannot emit reserved type \"${eventType}\". ` +\n 'Use session.done() for completion or session.fail() for errors.'\n );\n }\n\n return this.emitInternal(event as TEvent);\n }\n\n /**\n * Internal emit method - bypasses reserved type check.\n * Used by done() and fail() to emit terminal events.\n */\n private emitInternal(event: TEvent): SessionEvent<TEvent> {\n const metrics = this.createMetrics();\n const fullEvent = { ...event, metrics } as SessionEvent<TEvent>;\n\n this._logger.onExecutionEmit?.({\n type: 'execution_emit',\n event: fullEvent,\n });\n\n return fullEvent;\n }\n\n /**\n * Signals successful completion of the streaming execution.\n * Emits a 'complete' event with the result data and session summary.\n * Also triggers Logger.onExecutionDone for observability.\n * @param data - The final result data\n * @returns The complete event with data and summary\n */\n async done(data: ExtractResult<TEvent>): Promise<SessionEvent<TEvent>> {\n if (this._terminated) {\n throw new Error('Session already terminated. Cannot call done() after a terminal operation.');\n }\n this._terminated = true;\n\n const summary = await this.getSummary();\n\n this._logger.onExecutionDone?.({\n type: 'execution_done',\n timestamp: Date.now(),\n duration: summary.totalDuration,\n data,\n summary,\n });\n\n // Use emitInternal to bypass reserved type check (internal only)\n return this.emitInternal({\n type: 'complete',\n data,\n summary,\n } as unknown as Extract<TEvent, { type: 'complete' }>);\n }\n\n /**\n * Signals that the streaming execution failed with an error.\n * Emits an 'error' event and triggers Logger.onExecutionError for observability.\n * Gracefully handles getSummary() failures - summary will be undefined if it fails.\n * @param error - The error that caused the failure\n * @param data - Optional partial result data (if any was produced before failure)\n * @returns The error event\n */\n async fail(error: Error, data?: ExtractResult<TEvent>): Promise<SessionEvent<TEvent>> {\n if (this._terminated) {\n throw new Error('Session already terminated. Cannot call fail() after a terminal operation.');\n }\n this._terminated = true;\n\n let summary: SessionSummary | undefined;\n try {\n summary = await this.getSummary();\n } catch {\n // Ignore summary errors on failure path\n }\n\n this._logger.onExecutionError?.({\n type: 'execution_error',\n timestamp: Date.now(),\n duration: summary?.totalDuration ?? (Date.now() - this._startTime),\n error,\n data,\n summary,\n });\n\n const errorEvent: Record<string, unknown> = {\n type: 'error',\n error,\n };\n\n if (summary) {\n errorEvent.summary = summary;\n }\n\n if (data !== undefined) {\n errorEvent.data = data;\n }\n\n // Use emitInternal to bypass reserved type check (internal only)\n return this.emitInternal(errorEvent as unknown as Extract<TEvent, { type: 'error' }>);\n }\n\n private createMetrics(): EventMetrics {\n const now = Date.now();\n const metrics: EventMetrics = {\n timestamp: now,\n elapsedMs: now - this._startTime,\n deltaMs: now - this.lastEventTime,\n };\n this.lastEventTime = now;\n return metrics;\n }\n}\n\nexport interface StreamingSessionInternal<TEvent extends { type: string }> {\n generateText: SimpleSession['generateText'];\n streamText: SimpleSession['streamText'];\n fileManager: FileManager;\n onDone: SimpleSession['onDone'];\n record: SimpleSession['record'];\n recordToolCall: SimpleSession['recordToolCall'];\n\n emit(event: EmittableEventInput<TEvent>): SessionEvent<TEvent>;\n done(data: ExtractResult<TEvent>): Promise<SessionEvent<TEvent>>;\n fail(error: Error, data?: ExtractResult<TEvent>): Promise<SessionEvent<TEvent>>;\n\n runOnDoneHooks(): Promise<void>;\n getSummary(): Promise<SessionSummary>;\n}\n\nexport interface CreateStreamingSessionOptions {\n defaultLanguageModel: LanguageModel;\n providerType: ProviderType;\n fileManager: FileManager;\n logger?: Logger;\n startTime?: number;\n signal?: AbortSignal;\n}\n\nexport function createStreamingSession<TEvent extends { type: string }>(\n options: CreateStreamingSessionOptions\n): StreamingSessionInternal<TEvent> {\n const session = new StreamingSession<TEvent>({\n defaultLanguageModel: options.defaultLanguageModel,\n providerType: options.providerType,\n fileManager: options.fileManager,\n logger: options.logger ?? noopLogger,\n startTime: options.startTime,\n signal: options.signal,\n });\n\n return session as unknown as StreamingSessionInternal<TEvent>;\n}\n","import type { AgtlantisError, AgtlantisErrorCode, AgtlantisErrorOptions } from './types';\n\n/**\n * Wraps an unknown error as a specific AgtlantisError subclass.\n * Internal utility - not part of public API.\n *\n * @param error - The unknown error to wrap\n * @param ErrorClass - The error class constructor to use\n * @param options - Error options including code and optional context\n * @returns A new instance of the specified error class\n *\n * @internal\n */\nexport function wrapAsError<\n T extends AgtlantisError<TCode>,\n TCode extends AgtlantisErrorCode\n>(\n error: unknown,\n ErrorClass: new (message: string, options: AgtlantisErrorOptions<TCode>) => T,\n options: { code: TCode; context?: Record<string, unknown> }\n): T {\n const cause = error instanceof Error ? error : new Error(String(error));\n return new ErrorClass(cause.message, { ...options, cause });\n}\n","import { wrapAsError } from './utils';\n\nexport enum ExecutionErrorCode {\n EXECUTION_ERROR = 'EXECUTION_ERROR',\n STREAM_ERROR = 'STREAM_ERROR',\n RESULT_EXTRACTION_ERROR = 'RESULT_EXTRACTION_ERROR',\n CANCELLED = 'CANCELLED',\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n}\n\nexport enum ConfigurationErrorCode {\n CONFIG_ERROR = 'CONFIG_ERROR',\n MISSING_API_KEY = 'MISSING_API_KEY',\n INVALID_CONFIG = 'INVALID_CONFIG',\n MISSING_REQUIRED = 'MISSING_REQUIRED',\n}\n\nexport enum FileErrorCode {\n FILE_ERROR = 'FILE_ERROR',\n UPLOAD_ERROR = 'UPLOAD_ERROR',\n DELETE_ERROR = 'DELETE_ERROR',\n NOT_FOUND = 'NOT_FOUND',\n TOO_LARGE = 'TOO_LARGE',\n UNSUPPORTED_TYPE = 'UNSUPPORTED_TYPE',\n}\n\nexport type AgtlantisErrorCode = ExecutionErrorCode | ConfigurationErrorCode | FileErrorCode;\n\nexport interface AgtlantisErrorOptions<TCode extends AgtlantisErrorCode = AgtlantisErrorCode> {\n code: TCode;\n cause?: Error;\n context?: Record<string, unknown>;\n}\n\nexport interface ErrorOptions<TCode extends AgtlantisErrorCode> {\n code?: TCode;\n cause?: Error;\n context?: Record<string, unknown>;\n}\n\nexport type ExecutionErrorOptions = ErrorOptions<ExecutionErrorCode>;\nexport type ConfigurationErrorOptions = ErrorOptions<ConfigurationErrorCode>;\nexport type FileErrorOptions = ErrorOptions<FileErrorCode>;\n\n/**\n * Base error class for all Agtlantis errors.\n * Provides structured error information including error code and optional context.\n */\nexport class AgtlantisError<TCode extends AgtlantisErrorCode = AgtlantisErrorCode> extends Error {\n readonly code: TCode;\n override readonly cause?: Error;\n readonly context?: Record<string, unknown>;\n\n constructor(message: string, options: AgtlantisErrorOptions<TCode>) {\n super(message);\n this.name = 'AgtlantisError';\n this.code = options.code;\n this.cause = options.cause;\n this.context = options.context;\n\n // V8-specific stack trace capture\n const ErrorWithCapture = Error as typeof Error & {\n captureStackTrace?: (targetObject: object, constructorOpt?: Function) => void;\n };\n ErrorWithCapture.captureStackTrace?.(this, this.constructor);\n }\n\n get isRetryable(): boolean {\n return false;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n isRetryable: this.isRetryable,\n context: this.context,\n cause: this.cause?.message,\n stack: this.stack,\n };\n }\n}\n\n/**\n * Error thrown during agent execution (streaming failures, result extraction, cancellation).\n */\nexport class ExecutionError extends AgtlantisError<ExecutionErrorCode> {\n constructor(message: string, options: ExecutionErrorOptions = {}) {\n super(message, {\n code: options.code ?? ExecutionErrorCode.EXECUTION_ERROR,\n cause: options.cause,\n context: options.context,\n });\n this.name = 'ExecutionError';\n }\n\n static from(\n error: unknown,\n code: ExecutionErrorCode = ExecutionErrorCode.EXECUTION_ERROR,\n context?: Record<string, unknown>\n ): ExecutionError {\n if (error instanceof ExecutionError) {\n return error;\n }\n return wrapAsError(error, ExecutionError, { code, context });\n }\n}\n\n/**\n * Error thrown when configuration is invalid or missing (API keys, model names).\n */\nexport class ConfigurationError extends AgtlantisError<ConfigurationErrorCode> {\n constructor(message: string, options: ConfigurationErrorOptions = {}) {\n super(message, {\n code: options.code ?? ConfigurationErrorCode.CONFIG_ERROR,\n cause: options.cause,\n context: options.context,\n });\n this.name = 'ConfigurationError';\n }\n\n static from(\n error: unknown,\n code: ConfigurationErrorCode = ConfigurationErrorCode.CONFIG_ERROR,\n context?: Record<string, unknown>\n ): ConfigurationError {\n if (error instanceof ConfigurationError) {\n return error;\n }\n return wrapAsError(error, ConfigurationError, { code, context });\n }\n}\n\n/**\n * Error thrown during file operations (upload, delete, not found, size limits).\n */\nexport class FileError extends AgtlantisError<FileErrorCode> {\n constructor(message: string, options: FileErrorOptions = {}) {\n super(message, {\n code: options.code ?? FileErrorCode.FILE_ERROR,\n cause: options.cause,\n context: options.context,\n });\n this.name = 'FileError';\n }\n\n static from(\n error: unknown,\n code: FileErrorCode = FileErrorCode.FILE_ERROR,\n context?: Record<string, unknown>\n ): FileError {\n if (error instanceof FileError) {\n return error;\n }\n return wrapAsError(error, FileError, { code, context });\n }\n}\n","import { FileError, FileErrorCode } from '../errors';\nimport type { FileManager, FileSource, UploadedFile } from './types';\n\n/** FileManager for providers without file upload support (throws on upload/delete) */\nexport class NoOpFileManager implements FileManager {\n upload(_files: FileSource[]): Promise<UploadedFile[]> {\n throw new FileError('File upload not supported by this provider', {\n code: FileErrorCode.UNSUPPORTED_TYPE,\n context: {\n provider: 'noop',\n suggestion: 'Use a provider with file support (e.g., Google) or pass files inline',\n },\n });\n }\n\n delete(_fileId: string): Promise<void> {\n throw new FileError('File delete not supported by this provider', {\n code: FileErrorCode.UNSUPPORTED_TYPE,\n context: {\n provider: 'noop',\n },\n });\n }\n\n clear(): Promise<void> {\n return Promise.resolve();\n }\n\n getUploadedFiles(): UploadedFile[] {\n return [];\n }\n}\n","/**\n * MockProvider - Test provider for @agtlantis/core.\n *\n * Extends BaseProvider to provide mock LLM responses with call tracking.\n * Use `mock.provider()` factory for convenient creation.\n *\n * @example\n * ```typescript\n * import { mock } from '@agtlantis/core/testing';\n *\n * const provider = mock.provider(mock.text('Hello!'));\n * const execution = provider.simpleExecution(async (session) => {\n * const { text } = await session.generateText({ prompt: 'Say hi' });\n * return text;\n * });\n *\n * expect(await execution.toResult()).toBe('Hello!');\n * expect(provider.getCalls()).toHaveLength(1);\n * ```\n */\n\nimport type { LanguageModel } from 'ai';\nimport { MockLanguageModelV3 } from 'ai/test';\nimport type { Logger } from '@/observability/logger';\nimport { noopLogger } from '@/observability/logger';\nimport type { ProviderPricing } from '@/pricing';\nimport { BaseProvider } from '@/provider/base-provider';\nimport { SimpleSession } from '@/session/simple-session';\nimport { StreamingSession } from '@/session/streaming-session';\nimport { NoOpFileManager } from '@/provider/noop-file-manager';\nimport type { FileManager } from '@/provider/types';\n\nexport type ModelFactory = (modelId: string) => MockLanguageModelV3;\n\nexport interface MockProviderConfig {\n model?: MockLanguageModelV3;\n modelFactory?: ModelFactory;\n fileManager?: FileManager;\n logger?: Logger;\n providerType?: string;\n}\n\nexport interface MockCall {\n modelId: string;\n type: 'generate' | 'stream';\n timestamp: number;\n params: unknown;\n}\n\nexport class MockProvider extends BaseProvider {\n private readonly calls: MockCall[] = [];\n private readonly modelSource: MockLanguageModelV3 | ModelFactory;\n private readonly fileManagerInstance: FileManager;\n private readonly loggerInstance: Logger;\n private readonly defaultModelId: string | null;\n private readonly pricingConfig?: ProviderPricing;\n private readonly providerTypeId: string;\n\n constructor(config: MockProviderConfig) {\n super();\n\n if (!config.model && !config.modelFactory) {\n throw new Error('MockProvider requires either model or modelFactory');\n }\n\n this.modelSource = config.modelFactory ?? config.model!;\n this.fileManagerInstance = config.fileManager ?? new NoOpFileManager();\n this.loggerInstance = config.logger ?? noopLogger;\n this.defaultModelId = null;\n this.providerTypeId = config.providerType ?? 'mock';\n }\n\n /**\n * Creates instance for fluent API without calling constructor.\n * Shares calls array between fluent instances for tracking.\n */\n private static createWithConfig(\n modelSource: MockLanguageModelV3 | ModelFactory,\n fileManager: FileManager,\n logger: Logger,\n defaultModelId: string | null,\n pricingConfig: ProviderPricing | undefined,\n providerType: string,\n existingCalls: MockCall[]\n ): MockProvider {\n const provider = Object.create(MockProvider.prototype) as MockProvider;\n\n Object.assign(provider, {\n modelSource,\n fileManagerInstance: fileManager,\n loggerInstance: logger,\n defaultModelId,\n pricingConfig,\n providerTypeId: providerType,\n calls: existingCalls,\n });\n\n return provider;\n }\n\n getCalls(): MockCall[] {\n return [...this.calls];\n }\n\n clearCalls(): void {\n this.calls.length = 0;\n }\n\n withDefaultModel(modelId: string): MockProvider {\n return MockProvider.createWithConfig(\n this.modelSource,\n this.fileManagerInstance,\n this.loggerInstance,\n modelId,\n this.pricingConfig,\n this.providerTypeId,\n this.calls\n );\n }\n\n withLogger(logger: Logger): MockProvider {\n return MockProvider.createWithConfig(\n this.modelSource,\n this.fileManagerInstance,\n logger,\n this.defaultModelId,\n this.pricingConfig,\n this.providerTypeId,\n this.calls\n );\n }\n\n withPricing(pricing: ProviderPricing): MockProvider {\n return MockProvider.createWithConfig(\n this.modelSource,\n this.fileManagerInstance,\n this.loggerInstance,\n this.defaultModelId,\n pricing,\n this.providerTypeId,\n this.calls\n );\n }\n\n /**\n * Mock implementation - returns same provider since mocks don't use provider options.\n */\n withDefaultOptions(_options: Record<string, unknown>): MockProvider {\n return this;\n }\n\n protected createSimpleSession(signal?: AbortSignal): SimpleSession {\n return new SimpleSession({ ...this.buildSessionConfig(), signal });\n }\n\n protected createStreamingSession<\n TEvent extends { type: string },\n >(signal?: AbortSignal): StreamingSession<TEvent> {\n return new StreamingSession<TEvent>({ ...this.buildSessionConfig(), signal });\n }\n\n private buildSessionConfig() {\n const effectiveModelId = this.defaultModelId ?? 'default';\n return {\n defaultLanguageModel: this.createTrackingModel(effectiveModelId),\n modelFactory: (modelId: string) => this.createTrackingModel(modelId),\n providerType: this.providerTypeId,\n providerPricing: this.pricingConfig,\n fileManager: this.fileManagerInstance,\n logger: this.loggerInstance,\n };\n }\n\n private getBaseModel(modelId: string): MockLanguageModelV3 {\n if (typeof this.modelSource === 'function') {\n return this.modelSource(modelId);\n }\n return this.modelSource;\n }\n\n private createTrackingModel(modelId: string): LanguageModel {\n const baseModel = this.getBaseModel(modelId);\n const calls = this.calls;\n\n return {\n ...baseModel,\n specificationVersion: baseModel.specificationVersion,\n provider: baseModel.provider,\n modelId: baseModel.modelId,\n supportedUrls: baseModel.supportedUrls,\n\n doGenerate: async (params) => {\n calls.push({\n modelId,\n type: 'generate',\n timestamp: Date.now(),\n params,\n });\n return baseModel.doGenerate(params);\n },\n\n doStream: async (params) => {\n calls.push({\n modelId,\n type: 'stream',\n timestamp: Date.now(),\n params,\n });\n return baseModel.doStream(params);\n },\n } as LanguageModel;\n }\n}\n\nexport function createMockProvider(\n configOrModel: MockProviderConfig | MockLanguageModelV3 | ModelFactory\n): MockProvider {\n if (typeof configOrModel === 'function') {\n return new MockProvider({ modelFactory: configOrModel });\n }\n\n if (configOrModel instanceof MockLanguageModelV3) {\n return new MockProvider({ model: configOrModel });\n }\n\n return new MockProvider(configOrModel);\n}\n","/**\n * Mock factory functions for AI SDK testing.\n *\n * Provides convenient helpers to create MockLanguageModelV3 instances\n * with predefined responses for unit testing.\n *\n * @example\n * import { generateText } from 'ai';\n * import { mock } from '@agtlantis/core/testing';\n *\n * const result = await generateText({\n * model: mock.text('Hello, world!'),\n * prompt: 'Say hello',\n * });\n */\nimport { MockLanguageModelV3, simulateReadableStream } from 'ai/test';\nimport {\n MockProvider,\n createMockProvider,\n type MockProviderConfig,\n type ModelFactory,\n} from './mock-provider';\n\ntype DoGenerateResult = Awaited<ReturnType<MockLanguageModelV3['doGenerate']>>;\n\nexport type ResponseOptions = Partial<Omit<DoGenerateResult, 'content'>>;\n\nconst DEFAULT_USAGE: DoGenerateResult['usage'] = {\n inputTokens: { total: 0, noCache: 0, cacheRead: undefined, cacheWrite: undefined },\n outputTokens: { total: 0, text: 0, reasoning: undefined },\n};\n\nconst DEFAULT_FINISH: DoGenerateResult['finishReason'] = {\n unified: 'stop',\n raw: undefined,\n};\n\nexport const mock = {\n /**\n * Creates a MockLanguageModelV3 that returns text content.\n *\n * @param text - The text to return from generateText\n * @param options - Optional overrides for usage, finishReason, etc.\n *\n * @example\n * const model = mock.text('Hello, world!');\n *\n * @example\n * // With custom usage for cost calculation tests\n * const model = mock.text('Hello', {\n * usage: {\n * inputTokens: { total: 100 },\n * outputTokens: { total: 50 },\n * },\n * });\n */\n text(text: string, options?: ResponseOptions): MockLanguageModelV3 {\n return new MockLanguageModelV3({\n doGenerate: async () => ({\n content: [{ type: 'text', text }],\n finishReason: options?.finishReason ?? DEFAULT_FINISH,\n usage: options?.usage ?? DEFAULT_USAGE,\n warnings: options?.warnings ?? [],\n providerMetadata: options?.providerMetadata,\n }),\n });\n },\n\n /**\n * Creates a MockLanguageModelV3 that returns JSON content.\n *\n * Automatically stringifies the data. Use with generateObject or\n * generateText + Output.object.\n *\n * @param data - The object to return as JSON\n * @param options - Optional overrides for usage, finishReason, etc.\n *\n * @example\n * const model = mock.json({ name: 'Alice', age: 30 });\n */\n json<T>(data: T, options?: ResponseOptions): MockLanguageModelV3 {\n return mock.text(JSON.stringify(data), options);\n },\n\n /**\n * Creates a MockLanguageModelV3 that streams text chunks.\n *\n * @param chunks - Array of text strings to stream\n * @param options - Optional overrides for finishReason, usage, etc.\n *\n * @example\n * const model = mock.stream(['Hello', ', ', 'world!']);\n */\n stream(chunks: string[], options?: ResponseOptions): MockLanguageModelV3 {\n return new MockLanguageModelV3({\n doStream: async () => ({\n stream: simulateReadableStream({\n chunks: [\n { type: 'text-start', id: 'text-1' },\n ...chunks.map((chunk) => ({\n type: 'text-delta' as const,\n id: 'text-1',\n delta: chunk,\n })),\n { type: 'text-end', id: 'text-1' },\n {\n type: 'finish',\n finishReason: options?.finishReason ?? DEFAULT_FINISH,\n usage: options?.usage ?? DEFAULT_USAGE,\n logprobs: undefined,\n },\n ],\n }),\n }),\n });\n },\n\n /**\n * Creates a MockLanguageModelV3 that throws an error.\n *\n * @param error - The error to throw\n *\n * @example\n * const model = mock.error(new Error('Rate limit exceeded'));\n *\n * await expect(generateText({ model, prompt: 'Hi' }))\n * .rejects.toThrow('Rate limit exceeded');\n */\n error(error: Error): MockLanguageModelV3 {\n return new MockLanguageModelV3({\n doGenerate: async () => {\n throw error;\n },\n doStream: async () => {\n throw error;\n },\n });\n },\n\n /**\n * Creates a MockProvider with call tracking.\n *\n * Supports three input styles:\n * - Single model: `mock.provider(mock.text('Hello'))`\n * - Model factory: `mock.provider((modelId) => mock.text(modelId))`\n * - Full config: `mock.provider({ model, fileManager, logger })`\n *\n * @example\n * ```typescript\n * // Basic usage\n * const provider = mock.provider(mock.text('Hello!'));\n * const execution = provider.simpleExecution(async (session) => {\n * const { text } = await session.generateText({ prompt: 'Say hi' });\n * return text;\n * });\n * expect(await execution.toResult()).toBe('Hello!');\n * expect(provider.getCalls()).toHaveLength(1);\n *\n * // With model factory for different responses per model\n * const provider = mock.provider((modelId) => {\n * if (modelId === 'gpt-4') return mock.text('GPT-4 response');\n * return mock.text('Default response');\n * });\n * ```\n */\n provider(configOrModel: MockProviderConfig | MockLanguageModelV3 | ModelFactory): MockProvider {\n return createMockProvider(configOrModel);\n },\n};\n","/**\n * Test helpers for execution module tests.\n * Provides reusable utilities for abort scenarios, generator creation,\n * and logger tracking.\n *\n * These helpers are framework-agnostic (no vitest/jest dependency).\n */\n\nimport type { SessionEvent, ExtractResult, EmittableEventInput } from '@/execution/types';\nimport type { Logger } from '@/observability/logger';\nimport type { SimpleSession } from '../../session/simple-session';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type LoggerEventType = 'start' | 'emit' | 'done' | 'error';\n\n// ============================================================================\n// Abort/Signal Helpers\n// ============================================================================\n\n/**\n * Abort scenario helper for testing cancellation flows.\n */\nexport interface AbortScenario {\n /** The AbortController instance */\n controller: AbortController;\n /** The AbortSignal to pass to execution */\n signal: AbortSignal;\n /** Call to abort with optional reason */\n abort: (reason?: string) => void;\n /** Check if signal is aborted */\n isAborted: () => boolean;\n}\n\n/**\n * Create an abort scenario for testing cancellation.\n *\n * @example\n * ```typescript\n * const { signal, abort, isAborted } = createAbortScenario();\n * const execution = new SimpleExecutionHost(factory, fn, signal);\n *\n * abort('User canceled');\n * expect(isAborted()).toBe(true);\n *\n * const result = await execution.result();\n * expectCanceledResult(result);\n * ```\n */\nexport function createAbortScenario(): AbortScenario {\n const controller = new AbortController();\n return {\n controller,\n signal: controller.signal,\n abort: (reason?: string) => controller.abort(reason),\n isAborted: () => controller.signal.aborted,\n };\n}\n\n/**\n * Create an already-aborted signal for testing pre-aborted scenarios.\n *\n * @example\n * ```typescript\n * const signal = createAlreadyAbortedSignal('Pre-aborted');\n * const execution = new SimpleExecutionHost(factory, fn, signal);\n *\n * const result = await execution.result();\n * expectCanceledResult(result);\n * ```\n */\nexport function createAlreadyAbortedSignal(reason = 'Already aborted'): AbortSignal {\n const controller = new AbortController();\n controller.abort(reason);\n return controller.signal;\n}\n\n// ============================================================================\n// Generator Helpers (for StreamingExecutionHost)\n// ============================================================================\n\n/**\n * Create a simple generator that emits specified events and returns the result.\n *\n * @example\n * ```typescript\n * const generator = createSimpleGenerator('result-value', [\n * { type: 'progress', message: 'step 1' },\n * { type: 'progress', message: 'step 2' },\n * ]);\n * const execution = new StreamingExecutionHost(factory, generator);\n * ```\n */\nexport function createSimpleGenerator<\n TEvent extends { type: string },\n>(\n result: ExtractResult<TEvent>,\n events: EmittableEventInput<TEvent>[] = []\n): (session: {\n emit: (event: EmittableEventInput<TEvent>) => SessionEvent<TEvent>;\n done: (value: ExtractResult<TEvent>) => Promise<SessionEvent<TEvent>>;\n}) => AsyncGenerator<SessionEvent<TEvent>, SessionEvent<TEvent> | Promise<SessionEvent<TEvent>>, unknown> {\n return async function* (session) {\n for (const event of events) {\n yield session.emit(event);\n }\n return session.done(result);\n };\n}\n\n/**\n * Create a generator that throws an error.\n *\n * @example\n * ```typescript\n * const generator = createErrorGenerator(new Error('Test error'));\n * const execution = new StreamingExecutionHost(factory, generator);\n *\n * const result = await execution.result();\n * expectFailedResult(result, 'Test error');\n * ```\n */\nexport function createErrorGenerator<\n TEvent extends { type: string },\n>(\n error: Error,\n eventsBeforeError: EmittableEventInput<TEvent>[] = []\n): (session: {\n emit: (event: EmittableEventInput<TEvent>) => SessionEvent<TEvent>;\n}) => AsyncGenerator<SessionEvent<TEvent>, never, unknown> {\n return async function* (session) {\n for (const event of eventsBeforeError) {\n yield session.emit(event);\n }\n throw error;\n };\n}\n\n/**\n * Create a generator that waits for cancellation using closure pattern.\n * Uses the provided AbortScenario to detect when to abort.\n *\n * @example\n * ```typescript\n * const abortScenario = createAbortScenario();\n * const onCancelCalled = vi.fn();\n * const generator = createCancelableGenerator(abortScenario, onCancelCalled);\n *\n * const execution = new StreamingExecutionHost(factory, generator, abortScenario.signal);\n * abortScenario.abort();\n *\n * const result = await execution.result();\n * expectCanceledResult(result);\n * expect(onCancelCalled).toHaveBeenCalled();\n * ```\n */\nexport function createCancelableGenerator<\n TEvent extends { type: string },\n>(\n abortScenario: AbortScenario,\n onCancel?: () => void,\n eventsBeforeWait: EmittableEventInput<TEvent>[] = []\n): (session: {\n emit: (event: EmittableEventInput<TEvent>) => SessionEvent<TEvent>;\n}) => AsyncGenerator<SessionEvent<TEvent>, void, unknown> {\n return async function* (session) {\n for (const event of eventsBeforeWait) {\n yield session.emit(event);\n }\n\n // Wait indefinitely, checking for abort via closure\n await new Promise<void>((_, reject) => {\n const signal = abortScenario.signal;\n if (signal.aborted) {\n onCancel?.();\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n signal.addEventListener('abort', () => {\n onCancel?.();\n reject(new DOMException('Aborted', 'AbortError'));\n });\n });\n };\n}\n\n/**\n * Create a function that waits for cancellation using closure pattern.\n * Uses the provided AbortScenario to detect when to abort.\n * Equivalent of createCancelableGenerator for SimpleExecutionHost.\n *\n * @example\n * ```typescript\n * const abortScenario = createAbortScenario();\n * const onCancelCalled = vi.fn();\n * const fn = createCancelableFunction(abortScenario, onCancelCalled);\n *\n * const execution = new SimpleExecutionHost(factory, fn, abortScenario.signal);\n * abortScenario.abort();\n *\n * const result = await execution.result();\n * expectCanceledResult(result);\n * expect(onCancelCalled).toHaveBeenCalled();\n * ```\n */\nexport function createCancelableFunction(\n abortScenario: AbortScenario,\n onCancel?: () => void\n): (session: SimpleSession) => Promise<unknown> {\n return async () => {\n // Wait indefinitely, checking for abort via closure\n await new Promise<void>((_, reject) => {\n const signal = abortScenario.signal;\n if (signal.aborted) {\n onCancel?.();\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n signal.addEventListener('abort', () => {\n onCancel?.();\n reject(new DOMException('Aborted', 'AbortError'));\n });\n });\n return 'should-not-reach';\n };\n}\n\n/**\n * Create a generator with delay, useful for timing-related tests.\n *\n * @example\n * ```typescript\n * const generator = createDelayedGenerator(100, 'result');\n * const execution = new StreamingExecutionHost(factory, generator);\n *\n * // Cancel before delay completes\n * setTimeout(() => execution.cancel(), 50);\n * ```\n */\nexport function createDelayedGenerator<\n TEvent extends { type: string },\n>(\n delayMs: number,\n result: ExtractResult<TEvent>,\n abortScenario?: AbortScenario\n): (session: {\n emit: (event: EmittableEventInput<TEvent>) => SessionEvent<TEvent>;\n done: (value: ExtractResult<TEvent>) => Promise<SessionEvent<TEvent>>;\n}) => AsyncGenerator<SessionEvent<TEvent>, SessionEvent<TEvent> | Promise<SessionEvent<TEvent>>, unknown> {\n return async function* (session) {\n await new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(resolve, delayMs);\n if (abortScenario) {\n abortScenario.signal.addEventListener('abort', () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n });\n }\n });\n return session.done(result);\n };\n}\n\n// ============================================================================\n// Race Condition & Concurrency Test Helpers\n// ============================================================================\n\n/**\n * Create a generator that yields events with a configurable delay between each.\n * Useful for race condition testing where timing control is needed.\n *\n * @example\n * ```typescript\n * const generator = createSlowGenerator([\n * { type: 'chunk', content: 'A' },\n * { type: 'chunk', content: 'B' },\n * ], 10);\n * const execution = new StreamingExecutionHost(factory, generator);\n *\n * // Cancel mid-stream\n * setTimeout(() => execution.cancel(), 15);\n * ```\n */\nexport function createSlowGenerator<\n TEvent extends { type: string },\n>(\n events: EmittableEventInput<TEvent>[],\n delayBetweenEventsMs: number,\n abortScenario?: AbortScenario\n): (session: {\n emit: (event: EmittableEventInput<TEvent>) => SessionEvent<TEvent>;\n}) => AsyncGenerator<SessionEvent<TEvent>, SessionEvent<TEvent> | undefined, unknown> {\n return async function* (session) {\n for (const event of events) {\n // Check abort before each event\n if (abortScenario?.isAborted()) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n await new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(resolve, delayBetweenEventsMs);\n if (abortScenario) {\n if (abortScenario.signal.aborted) {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n abortScenario.signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n }\n });\n\n yield session.emit(event);\n }\n return undefined;\n };\n}\n\n/**\n * Collect all events from an async iterable stream.\n * Useful for testing stream() output in race condition scenarios.\n *\n * @example\n * ```typescript\n * const events = await collectStreamAsync(execution.stream());\n * expect(events).toHaveLength(3);\n * ```\n */\nexport async function collectStreamAsync<T>(stream: AsyncIterable<T>): Promise<T[]> {\n const collected: T[] = [];\n for await (const event of stream) {\n collected.push(event);\n }\n return collected;\n}\n\n/**\n * Create a generator that never completes (infinite wait).\n * Useful for testing cleanup and cancellation behavior.\n *\n * @example\n * ```typescript\n * const generator = createNeverEndingGenerator([\n * { type: 'chunk', content: 'A' },\n * ]);\n * const execution = new StreamingExecutionHost(factory, generator);\n *\n * // Must cancel to complete\n * execution.cancel();\n * ```\n */\nexport function createNeverEndingGenerator<\n TEvent extends { type: string },\n>(\n eventsBeforeWait: EmittableEventInput<TEvent>[] = [],\n abortScenario?: AbortScenario\n): (session: {\n emit: (event: EmittableEventInput<TEvent>) => SessionEvent<TEvent>;\n}) => AsyncGenerator<SessionEvent<TEvent>, SessionEvent<TEvent> | undefined, unknown> {\n return async function* (session) {\n for (const event of eventsBeforeWait) {\n yield session.emit(event);\n }\n\n // Wait forever unless aborted\n await new Promise<void>((_, reject) => {\n if (abortScenario) {\n if (abortScenario.signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n abortScenario.signal.addEventListener(\n 'abort',\n () => reject(new DOMException('Aborted', 'AbortError')),\n { once: true }\n );\n }\n // Without abort scenario, this promise never settles\n });\n return undefined;\n };\n}\n\n// ============================================================================\n// Logger Tracking Helpers (framework-agnostic)\n// ============================================================================\n\n/**\n * Create a logger that tracks call order for sequence verification.\n * This version is framework-agnostic (no vitest/jest dependency).\n *\n * @example\n * ```typescript\n * const { logger, getCallOrder } = createOrderTrackingLogger();\n * // ... run execution with logger ...\n *\n * expect(getCallOrder()).toEqual(['start', 'emit', 'done']);\n * ```\n */\nexport function createOrderTrackingLogger(): {\n logger: Logger;\n getCallOrder: () => LoggerEventType[];\n} {\n const callOrder: LoggerEventType[] = [];\n\n const logger: Logger = {\n onLLMCallStart: () => {},\n onLLMCallEnd: () => {},\n onExecutionStart: () => {\n callOrder.push('start');\n },\n onExecutionEmit: () => {\n callOrder.push('emit');\n },\n onExecutionDone: () => {\n callOrder.push('done');\n },\n onExecutionError: () => {\n callOrder.push('error');\n },\n };\n\n return {\n logger,\n getCallOrder: () => [...callOrder],\n };\n}\n","/**\n * Test fixtures for execution module tests.\n * Provides mock factories and session factories for testing.\n *\n * These fixtures are framework-agnostic (no vitest/jest dependency).\n * Pass your own mock function (vi.fn, jest.fn, etc.) or use the noop default.\n */\n\nimport type { LanguageModel, LanguageModelUsage } from 'ai';\n\nimport type { CompletionEvent } from '@/execution/types';\nimport type { FileManager } from '@/provider/types';\nimport type { Logger } from '@/observability/logger';\nimport { SimpleSession } from '../../session/simple-session';\nimport { StreamingSession } from '../../session/streaming-session';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type MockFn = (...args: unknown[]) => unknown;\nexport type MockFnFactory = () => MockFn;\n\nexport const TEST_PROVIDER_TYPE = 'google' as const;\n\n/**\n * Base test event — the domain event users emit via session.emit().\n */\nexport interface TestBaseEvent {\n type: string;\n message?: string;\n data?: string;\n}\n\n/**\n * Full test event union including CompletionEvent.\n * ExtractResult<TestEvent> = string, EmittableEventInput<TestEvent> = TestBaseEvent.\n */\nexport type TestEvent = TestBaseEvent | CompletionEvent<string>;\n\n// ============================================================================\n// Default noop mock factory\n// ============================================================================\n\nconst noop: MockFn = () => {};\nconst noopFactory: MockFnFactory = () => noop;\n\nfunction createNoopWithReturn<T>(value: T): MockFn {\n return () => value;\n}\n\nfunction createNoopAsync<T>(value: T): MockFn {\n return () => Promise.resolve(value);\n}\n\n// ============================================================================\n// Mock Factories\n// ============================================================================\n\nexport interface CreateMockModelOptions {\n mockFn?: MockFnFactory;\n}\n\nexport function createMockModel(options: CreateMockModelOptions = {}): LanguageModel {\n const { mockFn = noopFactory } = options;\n return {\n specificationVersion: 'v1',\n provider: 'test-provider',\n modelId: 'test-model',\n defaultObjectGenerationMode: 'json',\n doGenerate: mockFn(),\n doStream: mockFn(),\n } as unknown as LanguageModel;\n}\n\nexport interface CreateMockFileManagerOptions {\n mockFn?: MockFnFactory;\n}\n\nexport function createMockFileManager(\n options: CreateMockFileManagerOptions = {}\n): FileManager {\n const { mockFn } = options;\n\n if (mockFn) {\n return {\n upload: mockFn(),\n delete: mockFn(),\n clear: mockFn(),\n getUploadedFiles: mockFn(),\n } as FileManager;\n }\n\n // Default noop implementation with proper return values\n return {\n upload: createNoopAsync([]),\n delete: createNoopAsync(undefined),\n clear: createNoopAsync(undefined),\n getUploadedFiles: createNoopWithReturn([]),\n } as FileManager;\n}\n\nexport interface CreateMockLoggerOptions {\n mockFn?: MockFnFactory;\n}\n\nexport function createMockLogger(options: CreateMockLoggerOptions = {}): Logger {\n const { mockFn = noopFactory } = options;\n return {\n onLLMCallStart: mockFn(),\n onLLMCallEnd: mockFn(),\n onExecutionStart: mockFn(),\n onExecutionEmit: mockFn(),\n onExecutionDone: mockFn(),\n onExecutionError: mockFn(),\n };\n}\n\nexport function createMockUsage(\n overrides: Partial<LanguageModelUsage> = {}\n): LanguageModelUsage {\n return {\n inputTokens: 100,\n outputTokens: 50,\n totalTokens: 150,\n inputTokenDetails: {\n noCacheTokens: 100,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n },\n outputTokenDetails: {\n textTokens: 50,\n reasoningTokens: 0,\n },\n ...overrides,\n };\n}\n\n// ============================================================================\n// Session Factories\n// ============================================================================\n\nexport interface CreateSessionFactoryOptions {\n mockFn?: MockFnFactory;\n logger?: Logger;\n}\n\nexport function createSimpleSessionFactory(\n options: CreateSessionFactoryOptions = {}\n): (signal?: AbortSignal) => SimpleSession {\n const { mockFn, logger } = options;\n\n return (signal?: AbortSignal) =>\n new SimpleSession({\n defaultLanguageModel: createMockModel({ mockFn }),\n providerType: TEST_PROVIDER_TYPE,\n fileManager: createMockFileManager({ mockFn }),\n signal,\n logger,\n });\n}\n\nexport function createStreamingSessionFactory<\n TEvent extends { type: string } = TestEvent,\n>(options: CreateSessionFactoryOptions = {}): () => StreamingSession<TEvent> {\n const { mockFn, logger } = options;\n\n return () =>\n new StreamingSession<TEvent>({\n defaultLanguageModel: createMockModel({ mockFn }),\n providerType: TEST_PROVIDER_TYPE,\n fileManager: createMockFileManager({ mockFn }),\n logger,\n });\n}\n\nexport interface CreateStreamingSessionFactoryWithSignalOptions\n extends CreateSessionFactoryOptions {\n onSignalCapture?: (signal: AbortSignal | undefined) => void;\n}\n\nexport function createStreamingSessionFactoryWithSignal<\n TEvent extends { type: string } = TestEvent,\n>(\n options: CreateStreamingSessionFactoryWithSignalOptions = {}\n): (signal?: AbortSignal) => StreamingSession<TEvent> {\n const { mockFn, logger, onSignalCapture } = options;\n\n return (signal?: AbortSignal) => {\n onSignalCapture?.(signal);\n return new StreamingSession<TEvent>({\n defaultLanguageModel: createMockModel({ mockFn }),\n providerType: TEST_PROVIDER_TYPE,\n fileManager: createMockFileManager({ mockFn }),\n signal,\n logger,\n });\n };\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport async function collectEvents<T>(stream: AsyncIterable<T>): Promise<T[]> {\n const events: T[] = [];\n for await (const event of stream) {\n events.push(event);\n }\n return events;\n}\n\n/**\n * Creates a controllable promise for testing async flows\n */\nexport function createControllablePromise<T = void>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n} {\n let resolve!: (value: T) => void;\n let reject!: (error: Error) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\n// ============================================================================\n// Re-export Test Helpers\n// ============================================================================\n\nexport {\n // Abort/Signal helpers\n createAbortScenario,\n createAlreadyAbortedSignal,\n type AbortScenario,\n // Generator helpers\n createSimpleGenerator,\n createErrorGenerator,\n createCancelableGenerator,\n createCancelableFunction,\n createDelayedGenerator,\n // Race condition & concurrency helpers\n createSlowGenerator,\n collectStreamAsync,\n createNeverEndingGenerator,\n // Logger helpers\n createOrderTrackingLogger,\n type LoggerEventType,\n} from './helpers';\n","import type {\n StreamingExecution,\n SessionEvent,\n StreamingResult,\n ExtractResult,\n EmittableEventInput,\n ErrorEvent,\n} from '@/execution/types';\nimport type { EventMetrics } from '@/observability';\nimport { SessionSummary } from '@/session/types';\n\nfunction createTestMetrics(): EventMetrics {\n return { timestamp: Date.now(), elapsedMs: 0, deltaMs: 0 };\n}\n\nexport function createTestExecution<TEvent extends { type: string }>(\n result: ExtractResult<TEvent>,\n events: EmittableEventInput<TEvent>[] = [],\n): StreamingExecution<TEvent> {\n const summary = SessionSummary.forTest({});\n\n const completionEvent = {\n type: 'complete' as const,\n data: result,\n summary,\n metrics: createTestMetrics(),\n } as SessionEvent<TEvent | ErrorEvent>;\n\n const allEvents: SessionEvent<TEvent | ErrorEvent>[] = [\n ...events.map(\n (e) => ({ ...e, metrics: createTestMetrics() }) as SessionEvent<TEvent | ErrorEvent>,\n ),\n completionEvent,\n ];\n\n return {\n stream(): AsyncIterable<SessionEvent<TEvent | ErrorEvent>> {\n return {\n [Symbol.asyncIterator]() {\n let index = 0;\n return {\n async next() {\n if (index < allEvents.length) {\n return { value: allEvents[index++], done: false };\n }\n return { value: undefined, done: true };\n },\n };\n },\n };\n },\n\n async result(): Promise<\n StreamingResult<SessionEvent<TEvent | ErrorEvent>, ExtractResult<TEvent>>\n > {\n return { status: 'succeeded', value: result, events: allEvents, summary };\n },\n\n cancel() {},\n async cleanup() {},\n async [Symbol.asyncDispose]() {},\n };\n}\n\nexport function createTestErrorExecution<TEvent extends { type: string }>(\n error: Error,\n options: { events?: EmittableEventInput<TEvent>[]; data?: ExtractResult<TEvent> } = {},\n): StreamingExecution<TEvent> {\n const summary = SessionSummary.forTest({});\n\n const errorEvent: Record<string, unknown> = {\n type: 'error' as const,\n error,\n summary,\n metrics: createTestMetrics(),\n };\n\n if (options.data !== undefined) {\n errorEvent.data = options.data;\n }\n\n const typedErrorEvent = errorEvent as SessionEvent<TEvent | ErrorEvent>;\n\n const allEvents: SessionEvent<TEvent | ErrorEvent>[] = [\n ...(options.events ?? []).map(\n (e) => ({ ...e, metrics: createTestMetrics() }) as SessionEvent<TEvent | ErrorEvent>,\n ),\n typedErrorEvent,\n ];\n\n return {\n stream(): AsyncIterable<SessionEvent<TEvent | ErrorEvent>> {\n return {\n [Symbol.asyncIterator]() {\n let index = 0;\n return {\n async next() {\n if (index < allEvents.length) {\n return { value: allEvents[index++], done: false };\n }\n return { value: undefined, done: true };\n },\n };\n },\n };\n },\n\n async result(): Promise<\n StreamingResult<SessionEvent<TEvent | ErrorEvent>, ExtractResult<TEvent>>\n > {\n return { status: 'failed', error, events: allEvents, summary };\n },\n\n cancel() {},\n async cleanup() {},\n async [Symbol.asyncDispose]() {},\n };\n}\n\nexport function createTestCanceledExecution<TEvent extends { type: string }>(\n events: EmittableEventInput<TEvent>[] = [],\n): StreamingExecution<TEvent> {\n const summary = SessionSummary.forTest({});\n\n const allEvents: SessionEvent<TEvent | ErrorEvent>[] = events.map(\n (e) => ({ ...e, metrics: createTestMetrics() }) as SessionEvent<TEvent | ErrorEvent>,\n );\n\n return {\n stream(): AsyncIterable<SessionEvent<TEvent | ErrorEvent>> {\n return {\n [Symbol.asyncIterator]() {\n let index = 0;\n return {\n async next() {\n if (index < allEvents.length) {\n return { value: allEvents[index++], done: false };\n }\n return { value: undefined, done: true };\n },\n };\n },\n };\n },\n\n async result(): Promise<\n StreamingResult<SessionEvent<TEvent | ErrorEvent>, ExtractResult<TEvent>>\n > {\n return { status: 'canceled', events: allEvents, summary };\n },\n\n cancel() {},\n async cleanup() {},\n async [Symbol.asyncDispose]() {},\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@agtlantis/core",
3
+ "version": "0.4.1",
4
+ "description": "AI SDK 위에서 Agent와 Pipeline을 쉽고 일관되게 구축하는 프레임워크",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./testing": {
16
+ "types": "./dist/testing/index.d.ts",
17
+ "import": "./dist/testing/index.js",
18
+ "require": "./dist/testing/index.cjs"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md"
24
+ ],
25
+ "scripts": {
26
+ "build": "rm -rf dist && tsup",
27
+ "test": "vitest run src/",
28
+ "test:unit": "vitest run src/",
29
+ "test:e2e": "REAL_AI_ENABLED=true vitest run e2e/",
30
+ "test:watch": "vitest",
31
+ "typecheck": "tsc --noEmit"
32
+ },
33
+ "dependencies": {
34
+ "handlebars": "^4.7.8",
35
+ "lodash": "^4.17.23",
36
+ "yaml": "^2.8.2",
37
+ "zod-to-json-schema": "^3.25.1"
38
+ },
39
+ "peerDependencies": {
40
+ "@ai-sdk/google": "^3.0.0",
41
+ "@ai-sdk/openai": "^3.0.0",
42
+ "@google/genai": "^1.0.0",
43
+ "ai": "^6.0.0",
44
+ "zod": "^3.23.0 || ^4.0.0"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "@ai-sdk/google": {
48
+ "optional": true
49
+ },
50
+ "@ai-sdk/openai": {
51
+ "optional": true
52
+ },
53
+ "@google/genai": {
54
+ "optional": true
55
+ }
56
+ },
57
+ "devDependencies": {
58
+ "@ai-sdk/google": "^3.0.10",
59
+ "@ai-sdk/openai": "^3.0.12",
60
+ "@google/genai": "^1.37.0",
61
+ "@types/lodash": "^4.17.23",
62
+ "ai": "^6.0.39",
63
+ "dotenv": "^17.2.3",
64
+ "tsup": "^8.5.1",
65
+ "typescript": "^5.9.3",
66
+ "vitest": "^4.0.17",
67
+ "zod": "^4.3.5"
68
+ },
69
+ "engines": {
70
+ "node": ">=18.0.0"
71
+ },
72
+ "publishConfig": {
73
+ "access": "public"
74
+ },
75
+ "keywords": [
76
+ "ai",
77
+ "agent",
78
+ "llm",
79
+ "framework"
80
+ ],
81
+ "license": "MIT"
82
+ }