{"version":3,"sources":["../src/testing/mock-model.ts","../src/ai.constants.ts","../src/resilience/fallback-model.ts","../src/cache/cache-middleware.ts","../src/core/provider-registry.ts","../src/observability/ai-event-emitter.ts","../src/observability/ai-events.ts","../src/observability/guardrail.registry.ts","../src/agent/orchestration/agent-registry.ts","../src/agent/orchestration/agent-tool.ts","../src/approval/approval-gate.interface.ts","../src/tools/tool.registry.ts","../src/core/ai.service.ts","../src/messages/message.types.ts","../src/prompts/prompt.types.ts","../src/prompts/prompt-registry.service.ts","../src/usage/pricing.ts","../src/usage/usage-tracker.service.ts","../src/usage/on-budget-exceeded.interface.ts","../src/observability/guardrail.decorator.ts","../src/usage/budget.guardrail.ts","../src/usage/run-budget-exceeded.error.ts","../src/usage/budget-policy.service.ts","../src/embeddings/embeddings.service.ts","../src/memory/semantic/semantic-memory.service.ts","../src/agent/agent-executor.service.ts","../src/memory/in-memory-conversation.store.ts","../src/multimodal/image.service.ts","../src/multimodal/speech.service.ts","../src/multimodal/transcription.service.ts","../src/rag/rag.service.ts","../src/rag/in-memory-vector-store.ts","../src/mcp/mcp.service.ts","../src/ratelimit/rate-limiter.interface.ts","../src/ratelimit/rate-limit.guardrail.ts","../src/rag/rerank/heuristic-reranker.ts","../src/evals/eval-runner.service.ts","../src/usage/run-budget.guardrail.ts","../src/ai.module.ts","../src/testing/testing.module.ts"],"names":["ZERO_USAGE","inputTokens","outputTokens","totalTokens","createMockModel","replies","texts","Array","isArray","results","map","text","content","type","finishReason","usage","warnings","call","MockLanguageModelV3","doGenerate","Math","min","length","createEmbeddingMock","embed","MockEmbeddingModelV3","doEmbed","values","embeddings","tokens","AI_MODULE_OPTIONS","CONVERSATION_STORE","VECTOR_STORE","AI_CACHE","APPROVAL_GATE","RATE_LIMITER","RERANKER","TOOL_METADATA","AGENT_METADATA","GUARDRAIL_METADATA","DEFAULT_MAX_STEPS","createFallbackModel","models","options","Error","primary","shouldRetry","attempt","lastError","i","error","isLast","specificationVersion","provider","modelId","supportedUrls","callOptions","model","doStream","createCacheMiddleware","cache","wrapGenerate","params","key","cacheKey","cached","get","undefined","result","set","ttlMs","stableStringify","value","JSON","stringify","_key","val","Object","keys","sort","reduce","acc","k","ProviderRegistry","providers","Map","applyCache","wrapLanguageModel","middleware","cacheTtlMs","onModuleInit","configured","name","config","initProvider","getLanguageModel","chain","defaultModel","resolved","m","resolveSingle","resolve","languageModel","getEmbeddingModel","defaultEmbeddingModel","textEmbeddingModel","getImageModel","resolveMultimodal","defaultImageModel","getRerankingModel","rerankingModel","getSpeechModel","defaultSpeechModel","getTranscriptionModel","defaultTranscriptionModel","fallback","methods","capability","method","fn","raw","parseProviderName","parseModelId","sep","indexOf","slice","size","next","def","includes","settings","apiKey","baseURL","headers","createOpenAI","createAnthropic","createGoogleGenerativeAI","test","message","EVENT_EMITTER","AiEventEmitter","emitter","emit","event","payload","enabled","AI_EVENTS","agentRunStart","agentRunFinish","agentRunError","toolCall","toolResult","streamFinish","GuardrailRegistry","guardrails","discovery","wrapper","getProviders","instance","ctor","Reflect","getMetadata","push","count","runBeforeRun","ctx","guardrail","beforeRun","runAfterRun","afterRun","runOnToolCall","tool","args","onToolCall","AgentRegistry","agents","target","getByClass","all","createAgentTool","agent","schema","inputSchema","z","object","input","string","describe","description","execute","run","ToolApprovalDeniedError","ToolRegistry","tools","scanner","reflector","events","approvalGate","agentRegistry","prototype","getPrototypeOf","methodName","getAllMethodNames","methodRef","metadata","register","has","built","opts","requiresApproval","approved","requestApproval","getByName","getForClass","filter","entry","getAll","buildToolSet","refs","entries","flatMap","ref","resolveRef","agentEntry","resolveAgentRef","AiService","toolRegistry","generateText","streamText","generateObject","streamObject","rest","toMessages","role","PLACEHOLDER","interpolate","template","vars","replace","_match","String","DEFAULT_VERSION","PromptRegistry","prompts","latest","definition","versions","versionKey","version","registerAll","definitions","render","DEFAULT_PRICING","output","bareModelId","costOf","pricing","price","GLOBAL","empty","cost","runs","UsageTracker","totalsByScope","record","scope","conversationId","Boolean","totals","reset","delete","clear","BUDGET_EXCEEDED_HANDLER","Guardrail","defineMetadata","Injectable","BudgetExceededError","spent","limit","toFixed","BudgetGuard","maxCostPerConversation","RunBudgetExceededError","reason","exceeded","isOnBudgetExceeded","onBudgetExceeded","beforeRunBudget","afterRunBudget","emptyUsage","inputTokenDetails","noCacheTokens","cacheReadTokens","cacheWriteTokens","outputTokenDetails","textTokens","reasoningTokens","BudgetPolicy","globalHandler","agentInstance","checkCtx","resolveModel","messages","decision","resolveBeforeRunDecision","action","runCtx","enforceRunBudget","limits","resolveLimits","findExceededLimit","budgetCtx","kind","resolveExceededDecision","applyDecision","agentOptions","agentLimits","budget","agentModel","maxCostPerRun","total","maxInputTokensPerRun","maxOutputTokensPerRun","maxTotalTokensPerRun","isDecision","handleBudgetExceeded","EmbeddingsService","hit","abortSignal","maxRetries","embedMany","SemanticMemory","store","ai","remember","embedding","upsert","id","hash","recall","query","topK","rememberConversation","summarize","messagesToText","prompt","p","join","h","charCodeAt","toString","AgentExecutorService","usageTracker","budgetPolicy","semanticMemory","agentName","meta","newMessages","system","prepareRun","maxSteps","resolveMaxSteps","runObject","runText","allowSystemInMessages","temperature","experimental_telemetry","telemetry","persist","stopWhen","stepCountIs","response","steps","toolCalls","totalUsage","stream","prepared","streamFailed","errorReported","reportErrorOnce","onError","onFinish","completeRun","responseMessages","readMetadata","history","loadHistory","resolveSystemWithRecall","resolveSystem","snippets","context","s","systemPrompt","t","isEnabled","functionId","defaultMaxSteps","load","userMessages","append","InMemoryConversationStore","conversations","existing","ImageService","generate","generateImage","SpeechService","generateSpeech","TranscriptionService","transcribe","audio","RagService","defaultReranker","ingest","items","chunkSize","overlap","chunkOverlap","chunks","forEach","item","index","baseId","splitText","chunkIndex","c","documents","chunk","retrieve","reranker","rerank","fetchK","step","max","start","InMemoryVectorStore","doc","scored","matchesFilter","score","cosineSimilarity","a","b","ids","every","McpService","clients","toolSets","connect","client","listTools","info","dynamicTool","jsonSchema","callTool","arguments","extractText","getToolSet","getAllTools","assign","onModuleDestroy","closeAll","close","part","RateLimitedError","RateLimitGuardrail","limiter","allowed","consume","HeuristicReranker","topN","weight","overlapWeight","terms","tokenize","Set","toLowerCase","split","contentTerms","hits","term","EvalRunner","cases","judge","defaultJudge","passThreshold","evalCase","case","averageScore","sum","r","passRate","passed","threshold","expected","reasoning","RunBudgetGuardrail","policy","AI_INITIALIZER","AiModule","forRoot","build","provide","useValue","forRootAsync","useFactory","inject","imports","forFeature","feature","registry","module","exports","optionsProvider","extraImports","DiscoveryModule","storeProvider","conversationStore","vectorStoreProvider","vectorStore","eventEmitterProvider","tokenProvider","rateLimiter","guardrailClasses","budgetExceededHandlerProvider","budgetExceededHandler","coreProviders","initializerProvider","exportedTokens","token","useClass","handler","moduleRef","mod","EventEmitter2","strict","ModuleRef","createTestingAiModule","Test","createTestingModule","aiOptions","openai","overrideProvider","compile","init"],"mappings":"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","file":"testing.cjs","sourcesContent":["import type { EmbeddingModelV3, LanguageModelV3 } from '@ai-sdk/provider';\nimport { MockEmbeddingModelV3, MockLanguageModelV3 } from 'ai/test';\n\nconst ZERO_USAGE = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n/**\n * Builds a mock language model that returns the given text reply(ies). An array\n * yields one reply per successive call (multi-step); the last is reused after.\n */\nexport function createMockModel(\n  replies: string | string[],\n): LanguageModelV3 {\n  const texts = Array.isArray(replies) ? replies : [replies];\n  const results = texts.map((text) => ({\n    content: [{ type: 'text', text }],\n    finishReason: 'stop',\n    usage: ZERO_USAGE,\n    warnings: [],\n  }));\n  let call = 0;\n  return new MockLanguageModelV3({\n    doGenerate: async () =>\n      results[Math.min(call++, results.length - 1)] as any,\n  });\n}\n\n/**\n * Builds a mock embedding model whose vectors come from `embed(value)`.\n */\nexport function createEmbeddingMock(\n  embed: (value: string) => number[],\n): EmbeddingModelV3 {\n  return new MockEmbeddingModelV3({\n    doEmbed: async ({ values }: { values: string[] }) =>\n      ({\n        embeddings: values.map(embed),\n        usage: { tokens: values.length },\n      }) as any,\n  });\n}\n","/**\n * Dependency-injection tokens used across the module.\n */\nexport const AI_MODULE_OPTIONS = Symbol('AI_MODULE_OPTIONS');\nexport const CONVERSATION_STORE = Symbol('CONVERSATION_STORE');\nexport const VECTOR_STORE = Symbol('VECTOR_STORE');\nexport const AI_CACHE = Symbol('AI_CACHE');\nexport const APPROVAL_GATE = Symbol('APPROVAL_GATE');\nexport const AGENT_QUEUE = Symbol('AGENT_QUEUE');\nexport const RATE_LIMITER = Symbol('RATE_LIMITER');\nexport const RERANKER = Symbol('RERANKER');\n\n/**\n * Reflect metadata keys for the `@Tool` and `@Agent` decorators.\n */\nexport const TOOL_METADATA = Symbol('nestjs-ai:tool');\nexport const AGENT_METADATA = Symbol('nestjs-ai:agent');\nexport const GUARDRAIL_METADATA = Symbol('nestjs-ai:guardrail');\n\n/**\n * Default number of tool-calling steps allowed before an agent run stops.\n */\nexport const DEFAULT_MAX_STEPS = 5;\n","import type { LanguageModelV3 } from '@ai-sdk/provider';\n\nexport interface FallbackOptions {\n  /**\n   * Decide whether an error from a model should trigger a fallback to the next\n   * one. Defaults to always retrying on the next model.\n   */\n  shouldRetry?: (error: unknown) => boolean;\n  /** Provider name reported by the composite model. */\n  provider?: string;\n}\n\n/**\n * Composes several language models into one that tries each in order, falling\n * back to the next when a model throws (subject to `shouldRetry`). Fallback\n * applies to the initial `doGenerate` / `doStream` call; once a stream starts it\n * is not switched mid-flight.\n *\n * @example\n * ```ts\n * const model = createFallbackModel([\n *   registry.getLanguageModel('openai:gpt-4o'),\n *   registry.getLanguageModel('anthropic:claude-sonnet-5'),\n * ]);\n * ```\n */\nexport function createFallbackModel(\n  models: LanguageModelV3[],\n  options: FallbackOptions = {},\n): LanguageModelV3 {\n  if (models.length === 0) {\n    throw new Error('createFallbackModel requires at least one model.');\n  }\n  const primary = models[0];\n  const shouldRetry = options.shouldRetry ?? (() => true);\n\n  async function attempt<T>(\n    call: (model: LanguageModelV3) => PromiseLike<T>,\n  ): Promise<T> {\n    let lastError: unknown;\n    for (let i = 0; i < models.length; i++) {\n      try {\n        return await call(models[i]);\n      } catch (error) {\n        lastError = error;\n        const isLast = i === models.length - 1;\n        if (isLast || !shouldRetry(error)) {\n          throw error;\n        }\n      }\n    }\n    throw lastError;\n  }\n\n  return {\n    specificationVersion: 'v3',\n    provider: options.provider ?? `fallback(${primary.provider})`,\n    modelId: primary.modelId,\n    get supportedUrls() {\n      return primary.supportedUrls;\n    },\n    doGenerate: (callOptions) =>\n      attempt((model) => model.doGenerate(callOptions)),\n    doStream: (callOptions) => attempt((model) => model.doStream(callOptions)),\n  };\n}\n","import type { LanguageModelMiddleware } from 'ai';\nimport type { AiCache } from './ai-cache.interface.js';\n\nexport interface CacheMiddlewareOptions {\n  /** Time-to-live for cached generations, in milliseconds (default: no expiry). */\n  ttlMs?: number;\n}\n\n/**\n * Language-model middleware that caches non-streaming generations in an\n * {@link AiCache}, keyed by the model id and call parameters. Wrap a model with\n * `wrapLanguageModel({ model, middleware: createCacheMiddleware(cache) })`.\n */\nexport function createCacheMiddleware(\n  cache: AiCache,\n  options: CacheMiddlewareOptions = {},\n): LanguageModelMiddleware {\n  return {\n    async wrapGenerate({ doGenerate, params, model }) {\n      const key = cacheKey(model.modelId, params);\n      const cached = await cache.get(key);\n      if (cached !== undefined) {\n        return cached as Awaited<ReturnType<typeof doGenerate>>;\n      }\n      const result = await doGenerate();\n      await cache.set(key, result, options.ttlMs);\n      return result;\n    },\n  };\n}\n\n/** Builds a stable cache key from the model id and call parameters. */\nexport function cacheKey(modelId: string, params: unknown): string {\n  return `${modelId}:${stableStringify(params)}`;\n}\n\n/** JSON stringify with sorted object keys for deterministic keys. */\nfunction stableStringify(value: unknown): string {\n  return JSON.stringify(value, (_key, val) => {\n    if (val && typeof val === 'object' && !Array.isArray(val)) {\n      return Object.keys(val)\n        .sort()\n        .reduce<Record<string, unknown>>((acc, k) => {\n          acc[k] = (val as Record<string, unknown>)[k];\n          return acc;\n        }, {});\n    }\n    return val;\n  });\n}\n","import { Inject, Injectable, Optional, type OnModuleInit } from '@nestjs/common';\nimport {\n  wrapLanguageModel,\n  type EmbeddingModel,\n  type ImageModel,\n  type LanguageModel,\n  type RerankingModel,\n  type SpeechModel,\n  type TranscriptionModel,\n} from 'ai';\nimport type { LanguageModelV3 } from '@ai-sdk/provider';\nimport { AI_CACHE, AI_MODULE_OPTIONS } from '../ai.constants.js';\nimport { createFallbackModel } from '../resilience/fallback-model.js';\nimport { createCacheMiddleware } from '../cache/cache-middleware.js';\nimport type { AiCache } from '../cache/ai-cache.interface.js';\nimport type {\n  AiModuleOptions,\n  ProviderConfig,\n} from '../interfaces/ai-module-options.interface.js';\n\ntype ProviderName = 'openai' | 'anthropic' | 'google';\n\n/**\n * Minimal shape shared by every `@ai-sdk/*` provider instance we support.\n */\ninterface AiSdkProvider {\n  languageModel(modelId: string): LanguageModel;\n  textEmbeddingModel?(modelId: string): EmbeddingModel;\n  // ProviderV2 standard multimodal methods.\n  imageModel?(modelId: string): ImageModel;\n  speechModel?(modelId: string): SpeechModel;\n  transcriptionModel?(modelId: string): TranscriptionModel;\n  rerankingModel?(modelId: string): RerankingModel;\n  // Shorthands exposed by some concrete providers (e.g. openai).\n  image?(modelId: string): ImageModel;\n  speech?(modelId: string): SpeechModel;\n  transcription?(modelId: string): TranscriptionModel;\n  reranking?(modelId: string): RerankingModel;\n}\n\n/**\n * Instantiates and caches the configured `@ai-sdk/*` providers, and resolves\n * `\"provider:model\"` strings into concrete language / embedding models.\n *\n * Provider packages are imported lazily on module init so only the SDKs a\n * project actually configures need to be installed.\n */\n@Injectable()\nexport class ProviderRegistry implements OnModuleInit {\n  private readonly providers = new Map<ProviderName, AiSdkProvider>();\n\n  constructor(\n    @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n    @Optional() @Inject(AI_CACHE) private readonly cache?: AiCache,\n  ) {}\n\n  /** Wraps a model with the cache middleware when a cache is configured. */\n  private applyCache(model: LanguageModel): LanguageModel {\n    if (!this.cache || typeof model === 'string') {\n      return model;\n    }\n    return wrapLanguageModel({\n      model: model as LanguageModelV3,\n      middleware: createCacheMiddleware(this.cache, {\n        ttlMs: this.options.cacheTtlMs,\n      }),\n    });\n  }\n\n  async onModuleInit(): Promise<void> {\n    const configured = this.options.providers ?? {};\n    for (const name of Object.keys(configured) as ProviderName[]) {\n      const config = configured[name];\n      if (config) {\n        await this.initProvider(name, config);\n      }\n    }\n  }\n\n  /**\n   * Resolves a language model. Accepts a `LanguageModel` instance (returned\n   * as-is), a `\"provider:model\"` string, a bare `\"model\"` string (using the\n   * default provider), or `undefined` (using `defaultModel`).\n   */\n  getLanguageModel(\n    model?: string | LanguageModel | Array<string | LanguageModel>,\n  ): LanguageModel {\n    // Array => fallback chain (try each in order).\n    const chain = model ?? this.options.defaultModel;\n    if (Array.isArray(chain)) {\n      if (chain.length === 0) {\n        throw new Error('An empty model array was provided.');\n      }\n      if (chain.length === 1) {\n        return this.getLanguageModel(chain[0]);\n      }\n      const resolved = chain.map((m) =>\n        this.resolveSingle(m),\n      ) as LanguageModelV3[];\n      return this.applyCache(createFallbackModel(resolved));\n    }\n    return this.applyCache(this.resolveSingle(chain));\n  }\n\n  /** Resolves a single (non-array) model reference without cache wrapping. */\n  private resolveSingle(model?: string | LanguageModel): LanguageModel {\n    if (model && typeof model !== 'string') {\n      return model;\n    }\n    const { provider, modelId } = this.resolve(model, undefined);\n    return provider.languageModel(modelId);\n  }\n\n  /**\n   * Resolves an embedding model from a `\"provider:model\"` string, a bare model\n   * string, an `EmbeddingModel` instance, or `undefined` (using\n   * `defaultEmbeddingModel`).\n   */\n  getEmbeddingModel(\n    model?: string | EmbeddingModel,\n  ): EmbeddingModel {\n    if (model && typeof model !== 'string') {\n      return model;\n    }\n    const { name, provider, modelId } = this.resolve(\n      model,\n      this.options.defaultEmbeddingModel,\n    );\n    if (typeof provider.textEmbeddingModel !== 'function') {\n      throw new Error(\n        `Provider \"${name}\" does not support embeddings. Configure a provider ` +\n          `with embedding support (e.g. openai or google).`,\n      );\n    }\n    return provider.textEmbeddingModel(modelId);\n  }\n\n  /** Resolves an image-generation model (default `defaultImageModel`). */\n  getImageModel(model?: string | ImageModel): ImageModel {\n    if (model && typeof model !== 'string') {\n      return model;\n    }\n    return this.resolveMultimodal<ImageModel>(\n      model,\n      this.options.defaultImageModel,\n      ['imageModel', 'image'],\n      'image generation',\n    );\n  }\n\n  /** Resolves a reranking model (default `rerankingModel` option). */\n  getRerankingModel(model?: string | RerankingModel): RerankingModel {\n    if (model && typeof model !== 'string') {\n      return model;\n    }\n    return this.resolveMultimodal<RerankingModel>(\n      model,\n      this.options.rerankingModel,\n      ['rerankingModel', 'reranking'],\n      'reranking',\n    );\n  }\n\n  /** Resolves a speech (text-to-speech) model (default `defaultSpeechModel`). */\n  getSpeechModel(model?: string | SpeechModel): SpeechModel {\n    if (model && typeof model !== 'string') {\n      return model;\n    }\n    return this.resolveMultimodal<SpeechModel>(\n      model,\n      this.options.defaultSpeechModel,\n      ['speechModel', 'speech'],\n      'speech',\n    );\n  }\n\n  /** Resolves a transcription (speech-to-text) model. */\n  getTranscriptionModel(\n    model?: string | TranscriptionModel,\n  ): TranscriptionModel {\n    if (model && typeof model !== 'string') {\n      return model;\n    }\n    return this.resolveMultimodal<TranscriptionModel>(\n      model,\n      this.options.defaultTranscriptionModel,\n      ['transcriptionModel', 'transcription'],\n      'transcription',\n    );\n  }\n\n  /**\n   * Shared resolution for multimodal models: resolves the provider, then calls\n   * the first available factory method (standard name, then shorthand).\n   */\n  private resolveMultimodal<T>(\n    model: string | undefined,\n    fallback: string | undefined,\n    methods: Array<keyof AiSdkProvider>,\n    capability: string,\n  ): T {\n    const { name, provider, modelId } = this.resolve(model, fallback);\n    for (const method of methods) {\n      const fn = provider[method];\n      if (typeof fn === 'function') {\n        return (fn as (id: string) => T).call(provider, modelId);\n      }\n    }\n    throw new Error(\n      `Provider \"${name}\" does not support ${capability}. Configure a provider ` +\n        `that does (e.g. openai).`,\n    );\n  }\n\n  private resolve(\n    model: string | undefined,\n    fallback: string | undefined,\n  ): { name: ProviderName; provider: AiSdkProvider; modelId: string } {\n    const raw = model ?? fallback;\n    if (!raw) {\n      throw new Error(\n        'No model specified and no default model configured. Pass a model id ' +\n          'or set `defaultModel` in AiModule options.',\n      );\n    }\n\n    const name = this.parseProviderName(raw);\n    const modelId = this.parseModelId(raw);\n    const provider = this.providers.get(name);\n    if (!provider) {\n      throw new Error(\n        `Provider \"${name}\" is not configured. Add it to AiModule ` +\n          `\\`providers\\` options and install \\`@ai-sdk/${name}\\`.`,\n      );\n    }\n    return { name, provider, modelId };\n  }\n\n  private parseProviderName(raw: string): ProviderName {\n    const sep = raw.indexOf(':');\n    if (sep !== -1) {\n      return raw.slice(0, sep) as ProviderName;\n    }\n    // Bare model id: use the sole configured provider, else the default\n    // model's provider prefix.\n    if (this.providers.size === 1) {\n      return this.providers.keys().next().value as ProviderName;\n    }\n    const def = this.options.defaultModel;\n    if (def && def.includes(':')) {\n      return def.slice(0, def.indexOf(':')) as ProviderName;\n    }\n    throw new Error(\n      `Cannot infer provider for model \"${raw}\". Prefix it as ` +\n        `\"provider:model\" (e.g. \"openai:${raw}\").`,\n    );\n  }\n\n  private parseModelId(raw: string): string {\n    const sep = raw.indexOf(':');\n    return sep !== -1 ? raw.slice(sep + 1) : raw;\n  }\n\n  private async initProvider(\n    name: ProviderName,\n    config: ProviderConfig,\n  ): Promise<void> {\n    const settings = {\n      apiKey: config.apiKey,\n      baseURL: config.baseURL,\n      headers: config.headers,\n    };\n    try {\n      switch (name) {\n        case 'openai': {\n          const { createOpenAI } = await import('@ai-sdk/openai');\n          this.providers.set(name, createOpenAI(settings) as AiSdkProvider);\n          break;\n        }\n        case 'anthropic': {\n          const { createAnthropic } = await import('@ai-sdk/anthropic');\n          this.providers.set(name, createAnthropic(settings) as AiSdkProvider);\n          break;\n        }\n        case 'google': {\n          const { createGoogleGenerativeAI } = await import('@ai-sdk/google');\n          this.providers.set(\n            name,\n            createGoogleGenerativeAI(settings) as AiSdkProvider,\n          );\n          break;\n        }\n        default: {\n          throw new Error(`Unknown provider \"${name}\".`);\n        }\n      }\n    } catch (error) {\n      if (error instanceof Error && /Cannot find|find module/i.test(error.message)) {\n        throw new Error(\n          `Provider \"${name}\" is configured but the package \"@ai-sdk/${name}\" ` +\n            `is not installed. Run \\`npm install @ai-sdk/${name}\\`.`,\n        );\n      }\n      throw error;\n    }\n  }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\n\n/** Minimal shape of `EventEmitter2` from `@nestjs/event-emitter`. */\nexport interface EventEmitterLike {\n  emit(event: string, payload: unknown): boolean;\n}\n\n/** Injection token for an optional event emitter (EventEmitter2). */\nexport const EVENT_EMITTER = Symbol('AI_EVENT_EMITTER');\n\n/**\n * Emits library events through `@nestjs/event-emitter`'s `EventEmitter2` when\n * it is available, and is a no-op otherwise. This keeps `@nestjs/event-emitter`\n * a truly optional peer dependency.\n */\n@Injectable()\nexport class AiEventEmitter {\n  constructor(\n    @Optional()\n    @Inject(EVENT_EMITTER)\n    private readonly emitter?: EventEmitterLike | undefined,\n  ) {}\n\n  emit(event: string, payload: unknown): void {\n    this.emitter?.emit(event, payload);\n  }\n\n  /** Whether an underlying emitter is wired up. */\n  get enabled(): boolean {\n    return this.emitter != null;\n  }\n}\n","import type { AgentResult, AgentRunOptions } from '../agent/agent.interface.js';\n\n/** Event names emitted by the library (namespaced for `@OnEvent`). */\nexport const AI_EVENTS = {\n  agentRunStart: 'ai.agent.run.start',\n  agentRunFinish: 'ai.agent.run.finish',\n  agentRunError: 'ai.agent.run.error',\n  toolCall: 'ai.tool.call',\n  toolResult: 'ai.tool.result',\n  streamFinish: 'ai.stream.finish',\n  usage: 'ai.usage',\n} as const;\n\nexport interface AgentRunStartPayload {\n  agent: string;\n  input: unknown;\n  options: AgentRunOptions;\n}\n\nexport interface AgentRunFinishPayload {\n  agent: string;\n  result: AgentResult;\n}\n\nexport interface AgentRunErrorPayload {\n  agent: string;\n  error: unknown;\n}\n\nexport interface ToolCallPayload {\n  tool: string;\n  args: unknown;\n}\n\nexport interface ToolResultPayload {\n  tool: string;\n  args: unknown;\n  result: unknown;\n}\n","import { Injectable, type OnModuleInit } from '@nestjs/common';\nimport { DiscoveryService } from '@nestjs/core';\nimport { GUARDRAIL_METADATA } from '../ai.constants.js';\nimport type { AgentResult } from '../agent/agent.interface.js';\nimport type {\n  Guardrail,\n  GuardrailContext,\n} from './guardrail.interface.js';\n\n/**\n * Collects all `@Guardrail`-decorated providers and runs their hooks in\n * registration order around agent execution.\n */\n@Injectable()\nexport class GuardrailRegistry implements OnModuleInit {\n  private readonly guardrails: Guardrail[] = [];\n\n  constructor(private readonly discovery: DiscoveryService) {}\n\n  onModuleInit(): void {\n    for (const wrapper of this.discovery.getProviders()) {\n      const instance = wrapper.instance as Guardrail | undefined;\n      const ctor = instance?.constructor;\n      if (\n        instance &&\n        ctor &&\n        Reflect.getMetadata(GUARDRAIL_METADATA, ctor) === true\n      ) {\n        this.guardrails.push(instance);\n      }\n    }\n  }\n\n  get count(): number {\n    return this.guardrails.length;\n  }\n\n  async runBeforeRun(ctx: GuardrailContext): Promise<void> {\n    for (const guardrail of this.guardrails) {\n      await guardrail.beforeRun?.(ctx);\n    }\n  }\n\n  async runAfterRun(\n    ctx: GuardrailContext,\n    result: AgentResult,\n  ): Promise<void> {\n    for (const guardrail of this.guardrails) {\n      await guardrail.afterRun?.(ctx, result);\n    }\n  }\n\n  async runOnToolCall(tool: string, args: unknown): Promise<void> {\n    for (const guardrail of this.guardrails) {\n      await guardrail.onToolCall?.(tool, args);\n    }\n  }\n}\n","import { Injectable, type OnModuleInit, type Type } from '@nestjs/common';\nimport { DiscoveryService } from '@nestjs/core';\nimport { AGENT_METADATA } from '../../ai.constants.js';\n\n/** A discovered agent instance and its class. */\nexport interface AgentEntry {\n  name: string;\n  instance: any;\n  target: Type<any>;\n}\n\n/**\n * Indexes every `@Agent`-decorated provider by class name, enabling\n * multi-agent orchestration (supervisor/handoff) and background-job resolution.\n */\n@Injectable()\nexport class AgentRegistry implements OnModuleInit {\n  private readonly agents = new Map<string, AgentEntry>();\n\n  constructor(private readonly discovery: DiscoveryService) {}\n\n  onModuleInit(): void {\n    for (const wrapper of this.discovery.getProviders()) {\n      const instance = wrapper.instance;\n      const ctor = instance?.constructor as Type<any> | undefined;\n      if (instance && ctor && Reflect.getMetadata(AGENT_METADATA, ctor)) {\n        this.agents.set(ctor.name, { name: ctor.name, instance, target: ctor });\n      }\n    }\n  }\n\n  /** Returns an agent instance by class name. */\n  get(name: string): any | undefined {\n    return this.agents.get(name)?.instance;\n  }\n\n  /** Returns an agent instance by its class. */\n  getByClass(target: Type<any>): any | undefined {\n    return this.agents.get(target.name)?.instance;\n  }\n\n  /** All discovered agents. */\n  all(): AgentEntry[] {\n    return [...this.agents.values()];\n  }\n}\n","import { tool, type Tool as AiTool } from 'ai';\nimport { z, type ZodType } from 'zod';\nimport type { AiAgent } from '../ai-agent.base.js';\n\nexport interface AgentToolOptions {\n  /** Tool name exposed to the calling model (default: the agent class name). */\n  name?: string;\n  /** Description guiding when to delegate to this agent. */\n  description?: string;\n  /**\n   * Input schema. Defaults to `{ input: string }`; the `input` field is passed\n   * to the sub-agent's `.run()`.\n   */\n  inputSchema?: ZodType<any, any, any>;\n}\n\n/**\n * Wraps an agent as a tool so another agent can delegate to it (supervisor /\n * handoff patterns). The wrapped agent's `.run()` output text is returned to the\n * caller.\n *\n * @example\n * ```ts\n * @Agent({ model: 'openai:gpt-4o', system: 'Supervisor', tools: [ResearchAgent] })\n * class SupervisorAgent extends AiAgent {}\n * ```\n */\nexport function createAgentTool(\n  agent: Pick<AiAgent, 'run'>,\n  options: AgentToolOptions = {},\n): AiTool<any, string> {\n  const schema =\n    options.inputSchema ??\n    z.object({\n      input: z.string().describe('The task or question for the agent'),\n    });\n\n  return tool({\n    description:\n      options.description ??\n      `Delegate the task to the ${options.name ?? 'sub'} agent.`,\n    inputSchema: schema,\n    execute: async (args: unknown) => {\n      const input =\n        typeof args === 'string'\n          ? args\n          : ((args as { input?: string })?.input ?? JSON.stringify(args));\n      const result = await agent.run(input);\n      return result.text;\n    },\n  });\n}\n","/** Context passed to an approval gate for a tool call awaiting approval. */\nexport interface ApprovalContext {\n  tool: string;\n  args: unknown;\n  /** Name of the agent making the call, when available. */\n  agent?: string;\n}\n\n/**\n * Decides whether a tool flagged `requiresApproval` may execute. Implement this\n * to plug in human-in-the-loop approval (e.g. block on a queue, check a policy)\n * and register it via `AiModule.forRoot({ approvalGate })`.\n */\nexport interface ApprovalGate {\n  /** Resolve `true` to allow the tool call, `false` to block it. */\n  requestApproval(context: ApprovalContext): Promise<boolean>;\n}\n\n/** Thrown when an approval gate denies a tool call. */\nexport class ToolApprovalDeniedError extends Error {\n  constructor(public readonly tool: string) {\n    super(`Tool \"${tool}\" was denied by the approval gate.`);\n    this.name = 'ToolApprovalDeniedError';\n  }\n}\n","import {\n  Injectable,\n  Optional,\n  type OnModuleInit,\n  type Type,\n} from '@nestjs/common';\nimport { Inject } from '@nestjs/common';\nimport { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core';\nimport { tool, type Tool as AiTool, type ToolSet } from 'ai';\nimport { AGENT_METADATA, APPROVAL_GATE, TOOL_METADATA } from '../ai.constants.js';\nimport { AiEventEmitter } from '../observability/ai-event-emitter.js';\nimport { AI_EVENTS } from '../observability/ai-events.js';\nimport { GuardrailRegistry } from '../observability/guardrail.registry.js';\nimport { AgentRegistry } from '../agent/orchestration/agent-registry.js';\nimport { createAgentTool } from '../agent/orchestration/agent-tool.js';\nimport {\n  type ApprovalGate,\n  ToolApprovalDeniedError,\n} from '../approval/approval-gate.interface.js';\nimport type { ToolMetadata } from './tool.metadata.js';\n\n/** A discovered tool together with the class that declared it. */\nexport interface ToolEntry {\n  name: string;\n  tool: AiTool<any, any>;\n  target: Type<any>;\n}\n\n/** A tool reference accepted by `buildToolSet`: a provider class or a name. */\nexport type ToolRef = Type<any> | string;\n\n/**\n * Discovers every `@Tool`-decorated method across the application's providers\n * and wraps each into a Vercel AI SDK `tool()` whose `execute` calls the method\n * on its DI-managed instance (preserving `this` and injected dependencies).\n */\n@Injectable()\nexport class ToolRegistry implements OnModuleInit {\n  private readonly tools = new Map<string, ToolEntry>();\n\n  constructor(\n    private readonly discovery: DiscoveryService,\n    private readonly scanner: MetadataScanner,\n    private readonly reflector: Reflector,\n    @Optional() private readonly events?: AiEventEmitter,\n    @Optional() private readonly guardrails?: GuardrailRegistry,\n    @Optional() @Inject(APPROVAL_GATE) private readonly approvalGate?: ApprovalGate,\n    @Optional() private readonly agentRegistry?: AgentRegistry,\n  ) {}\n\n  onModuleInit(): void {\n    for (const wrapper of this.discovery.getProviders()) {\n      const instance = wrapper.instance;\n      if (!instance || typeof instance !== 'object') {\n        continue;\n      }\n      const prototype = Object.getPrototypeOf(instance);\n      if (!prototype) {\n        continue;\n      }\n      for (const methodName of this.scanner.getAllMethodNames(prototype)) {\n        const methodRef = instance[methodName];\n        const metadata = this.reflector.get<ToolMetadata | undefined>(\n          TOOL_METADATA,\n          methodRef,\n        );\n        if (!metadata) {\n          continue;\n        }\n        this.register(instance, methodName, metadata);\n      }\n    }\n  }\n\n  private register(\n    instance: any,\n    methodName: string,\n    metadata: ToolMetadata,\n  ): void {\n    const name = metadata.name ?? methodName;\n    if (this.tools.has(name)) {\n      throw new Error(\n        `Duplicate AI tool name \"${name}\". Tool names must be unique across ` +\n          `all providers (declared on ${instance.constructor?.name}).`,\n      );\n    }\n    const built = tool({\n      description: metadata.description,\n      inputSchema: metadata.schema,\n      execute: async (args: unknown, opts: unknown) => {\n        if (metadata.requiresApproval && this.approvalGate) {\n          const approved = await this.approvalGate.requestApproval({\n            tool: name,\n            args,\n          });\n          if (!approved) {\n            throw new ToolApprovalDeniedError(name);\n          }\n        }\n        await this.guardrails?.runOnToolCall(name, args);\n        this.events?.emit(AI_EVENTS.toolCall, { tool: name, args });\n        const result = await instance[methodName](args, opts);\n        this.events?.emit(AI_EVENTS.toolResult, { tool: name, args, result });\n        return result;\n      },\n    });\n    this.tools.set(name, {\n      name,\n      tool: built,\n      target: instance.constructor,\n    });\n  }\n\n  /** Returns the tool registered under `name`, if any. */\n  getByName(name: string): ToolEntry | undefined {\n    return this.tools.get(name);\n  }\n\n  /** Returns every tool declared by the given provider class. */\n  getForClass(target: Type<any>): ToolEntry[] {\n    return [...this.tools.values()].filter((entry) => entry.target === target);\n  }\n\n  /** Returns all discovered tools. */\n  getAll(): ToolEntry[] {\n    return [...this.tools.values()];\n  }\n\n  /**\n   * Builds the `ToolSet` passed to `generateText`/`streamText` from a list of\n   * tool references (provider classes and/or tool names). Passing no refs\n   * returns every discovered tool.\n   */\n  buildToolSet(refs?: ToolRef[]): ToolSet {\n    const entries =\n      refs && refs.length > 0\n        ? refs.flatMap((ref) => this.resolveRef(ref))\n        : this.getAll();\n\n    const set: ToolSet = {};\n    for (const entry of entries) {\n      set[entry.name] = entry.tool;\n    }\n    return set;\n  }\n\n  private resolveRef(ref: ToolRef): ToolEntry[] {\n    if (typeof ref === 'string') {\n      const entry = this.getByName(ref);\n      if (!entry) {\n        throw new Error(`Unknown AI tool \"${ref}\".`);\n      }\n      return [entry];\n    }\n    const entries = this.getForClass(ref);\n    if (entries.length > 0) {\n      return entries;\n    }\n    // Not a @Tool provider — maybe an @Agent class used as a sub-agent tool.\n    const agentEntry = this.resolveAgentRef(ref);\n    if (agentEntry) {\n      return [agentEntry];\n    }\n    throw new Error(\n      `Class \"${ref.name}\" declares no @Tool methods and is not a registered ` +\n        `@Agent, or was not registered as a provider so it could be discovered.`,\n    );\n  }\n\n  private resolveAgentRef(ref: Type<any>): ToolEntry | undefined {\n    if (!this.agentRegistry || !Reflect.getMetadata(AGENT_METADATA, ref)) {\n      return undefined;\n    }\n    const instance = this.agentRegistry.getByClass(ref);\n    if (!instance) {\n      return undefined;\n    }\n    return {\n      name: ref.name,\n      tool: createAgentTool(instance, { name: ref.name }),\n      target: ref,\n    };\n  }\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n  generateObject,\n  generateText,\n  streamObject,\n  streamText,\n} from 'ai';\nimport { ProviderRegistry } from './provider-registry.js';\nimport { ToolRegistry, type ToolRef } from '../tools/tool.registry.js';\n\n/** Replaces `model` (a resolvable id) and `tools` (tool refs) on SDK params. */\ntype NestAiParams<Fn extends (arg: any) => any> = Omit<\n  Parameters<Fn>[0],\n  'model' | 'tools'\n> & {\n  /** Model id string (e.g. `\"openai:gpt-4o\"`); defaults to the module model. */\n  model?: string;\n  /** Tool references (provider classes and/or names) to expose to the model. */\n  tools?: ToolRef[];\n};\n\n/**\n * Thin, DI-friendly facade over the Vercel AI SDK generation functions for\n * callers that don't want to declare an `@Agent` class. Resolves `model`\n * strings and `tools` references, then forwards everything else unchanged.\n */\n@Injectable()\nexport class AiService {\n  constructor(\n    private readonly providers: ProviderRegistry,\n    private readonly toolRegistry: ToolRegistry,\n  ) {}\n\n  generateText(\n    params: NestAiParams<typeof generateText>,\n  ): ReturnType<typeof generateText> {\n    return generateText(this.resolve(params) as Parameters<typeof generateText>[0]);\n  }\n\n  streamText(\n    params: NestAiParams<typeof streamText>,\n  ): ReturnType<typeof streamText> {\n    return streamText(this.resolve(params) as Parameters<typeof streamText>[0]);\n  }\n\n  generateObject(\n    params: NestAiParams<typeof generateObject>,\n  ): ReturnType<typeof generateObject> {\n    return generateObject(this.resolve(params) as Parameters<typeof generateObject>[0]);\n  }\n\n  streamObject(\n    params: NestAiParams<typeof streamObject>,\n  ): ReturnType<typeof streamObject> {\n    return streamObject(this.resolve(params) as Parameters<typeof streamObject>[0]);\n  }\n\n  private resolve(params: { model?: string; tools?: ToolRef[] } & Record<string, unknown>) {\n    const { model, tools, ...rest } = params;\n    return {\n      ...rest,\n      model: this.providers.getLanguageModel(model),\n      ...(tools ? { tools: this.toolRegistry.buildToolSet(tools) } : {}),\n    };\n  }\n}\n","import type { ModelMessage } from 'ai';\n\n/**\n * A single conversation message, re-exported from the AI SDK so consumers of\n * this library never need to import `ai` types directly.\n */\nexport type AiMessage = ModelMessage;\n\n/**\n * The input accepted by agent `.run()` / `.stream()` and the raw facade: either\n * a plain user string or an explicit list of messages.\n */\nexport type AiInput = string | AiMessage[];\n\n/** Normalizes a string or message list into a message array. */\nexport function toMessages(input: AiInput): AiMessage[] {\n  if (typeof input === 'string') {\n    return [{ role: 'user', content: input }];\n  }\n  return input;\n}\n","/**\n * A named, optionally versioned prompt template.\n */\nexport interface PromptDefinition {\n  /** Unique name used to look the prompt up. */\n  name: string;\n  /** Optional version; when omitted the latest registered version is used. */\n  version?: string;\n  /** Template body with `{{variable}}` placeholders. */\n  template: string;\n  /** Optional human-readable description. */\n  description?: string;\n}\n\n/** Reference to a registered prompt for rendering. */\nexport interface PromptRef {\n  name: string;\n  vars?: Record<string, unknown>;\n  version?: string;\n}\n\nconst PLACEHOLDER = /\\{\\{\\s*([\\w.]+)\\s*\\}\\}/g;\n\n/**\n * Replaces `{{var}}` placeholders in `template` with values from `vars`.\n * Throws if a referenced variable is missing, to catch typos early.\n */\nexport function interpolate(\n  template: string,\n  vars: Record<string, unknown> = {},\n): string {\n  return template.replace(PLACEHOLDER, (_match, key: string) => {\n    if (!(key in vars)) {\n      throw new Error(`Missing variable \"${key}\" for prompt interpolation.`);\n    }\n    const value = vars[key];\n    return value == null ? '' : String(value);\n  });\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n  interpolate,\n  type PromptDefinition,\n} from './prompt.types.js';\n\n/** Marker for the unversioned entry of a prompt. */\nconst DEFAULT_VERSION = '__default__';\n\n/**\n * In-memory registry of named, versioned prompt templates. Register prompts via\n * `AiModule.forRoot({ prompts })`, `AiModule.forFeature({ prompts })`, or\n * imperatively, then `render(name, vars)` to produce a final string.\n */\n@Injectable()\nexport class PromptRegistry {\n  /** name -> (version -> definition) */\n  private readonly prompts = new Map<string, Map<string, PromptDefinition>>();\n  /** name -> most recently registered version key */\n  private readonly latest = new Map<string, string>();\n\n  /** Registers a prompt. Throws on a duplicate (name, version). */\n  register(definition: PromptDefinition): void {\n    const versions =\n      this.prompts.get(definition.name) ?? new Map<string, PromptDefinition>();\n    const versionKey = definition.version ?? DEFAULT_VERSION;\n    if (versions.has(versionKey)) {\n      throw new Error(\n        `Prompt \"${definition.name}\"${\n          definition.version ? ` version \"${definition.version}\"` : ''\n        } is already registered.`,\n      );\n    }\n    versions.set(versionKey, definition);\n    this.prompts.set(definition.name, versions);\n    this.latest.set(definition.name, versionKey);\n  }\n\n  /** Registers many prompts. */\n  registerAll(definitions: PromptDefinition[]): void {\n    for (const definition of definitions) {\n      this.register(definition);\n    }\n  }\n\n  /** Returns a prompt definition (latest version when `version` omitted). */\n  get(name: string, version?: string): PromptDefinition {\n    const versions = this.prompts.get(name);\n    if (!versions) {\n      throw new Error(`Unknown prompt \"${name}\".`);\n    }\n    const versionKey = version ?? this.latest.get(name) ?? DEFAULT_VERSION;\n    const definition = versions.get(versionKey);\n    if (!definition) {\n      throw new Error(`Unknown version \"${version}\" for prompt \"${name}\".`);\n    }\n    return definition;\n  }\n\n  /** Renders a prompt to a string, interpolating `{{var}}` placeholders. */\n  render(\n    name: string,\n    vars: Record<string, unknown> = {},\n    options: { version?: string } = {},\n  ): string {\n    return interpolate(this.get(name, options.version).template, vars);\n  }\n\n  /** Whether a prompt (any version) is registered. */\n  has(name: string): boolean {\n    return this.prompts.has(name);\n  }\n}\n","/** Price per 1M tokens, in USD. */\nexport interface ModelPricing {\n  input: number;\n  output: number;\n}\n\n/** Maps a bare model id (no provider prefix) to its pricing. */\nexport type PricingTable = Record<string, ModelPricing>;\n\n/** Minimal usage shape needed for cost. */\nexport interface UsageLike {\n  inputTokens?: number;\n  outputTokens?: number;\n}\n\n/**\n * Default USD pricing per 1M tokens for common models. Override or extend via\n * `AiModule.forRoot({ pricing })`. Prices are indicative — verify against your\n * provider's current rates.\n */\nexport const DEFAULT_PRICING: PricingTable = {\n  'gpt-4o': { input: 2.5, output: 10 },\n  'gpt-4o-mini': { input: 0.15, output: 0.6 },\n  'gpt-4.1': { input: 2, output: 8 },\n  'gpt-4.1-mini': { input: 0.4, output: 1.6 },\n  'o3-mini': { input: 1.1, output: 4.4 },\n  'text-embedding-3-small': { input: 0.02, output: 0 },\n  'text-embedding-3-large': { input: 0.13, output: 0 },\n  'claude-sonnet-4': { input: 3, output: 15 },\n  'claude-opus-4': { input: 15, output: 75 },\n  'claude-haiku-4': { input: 0.8, output: 4 },\n  'gemini-2.5-pro': { input: 1.25, output: 10 },\n  'gemini-2.5-flash': { input: 0.3, output: 2.5 },\n};\n\n/** Strips a `\"provider:\"` prefix from a model id. */\nexport function bareModelId(modelId: string): string {\n  const sep = modelId.indexOf(':');\n  return sep === -1 ? modelId : modelId.slice(sep + 1);\n}\n\n/**\n * Computes the USD cost of a usage record for a model. Returns 0 when the model\n * is not in the pricing table.\n */\nexport function costOf(\n  usage: UsageLike,\n  modelId: string,\n  pricing: PricingTable = DEFAULT_PRICING,\n): number {\n  const price = pricing[bareModelId(modelId)] ?? pricing[modelId];\n  if (!price) {\n    return 0;\n  }\n  const input = usage.inputTokens ?? 0;\n  const output = usage.outputTokens ?? 0;\n  return (input / 1_000_000) * price.input + (output / 1_000_000) * price.output;\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { AI_MODULE_OPTIONS } from '../ai.constants.js';\nimport type { AiModuleOptions } from '../interfaces/ai-module-options.interface.js';\nimport { AiEventEmitter } from '../observability/ai-event-emitter.js';\nimport { AI_EVENTS } from '../observability/ai-events.js';\nimport { costOf, type UsageLike } from './pricing.js';\n\n/** Accumulated usage totals for a scope (conversation or global). */\nexport interface UsageTotals {\n  inputTokens: number;\n  outputTokens: number;\n  cost: number;\n  runs: number;\n}\n\n/** A single recorded run's usage. */\nexport interface UsageRecord extends UsageTotals {\n  conversationId?: string;\n  agent?: string;\n  model: string;\n}\n\nconst GLOBAL = '__global__';\n\nfunction empty(): UsageTotals {\n  return { inputTokens: 0, outputTokens: 0, cost: 0, runs: 0 };\n}\n\n/**\n * Tracks token usage and USD cost per conversation (and globally), and emits an\n * `ai.usage` event per recorded run.\n */\n@Injectable()\nexport class UsageTracker {\n  private readonly totalsByScope = new Map<string, UsageTotals>();\n\n  constructor(\n    @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n    @Optional() private readonly events?: AiEventEmitter,\n  ) {}\n\n  /** Records a run's usage, returns the single-run record, emits `ai.usage`. */\n  record(entry: {\n    model: string;\n    usage: UsageLike | undefined;\n    conversationId?: string;\n    agent?: string;\n  }): UsageRecord {\n    const usage = entry.usage ?? {};\n    const inputTokens = usage.inputTokens ?? 0;\n    const outputTokens = usage.outputTokens ?? 0;\n    const cost = costOf(usage, entry.model, this.options.pricing);\n\n    for (const scope of [GLOBAL, entry.conversationId].filter(\n      Boolean,\n    ) as string[]) {\n      const totals = this.totalsByScope.get(scope) ?? empty();\n      totals.inputTokens += inputTokens;\n      totals.outputTokens += outputTokens;\n      totals.cost += cost;\n      totals.runs += 1;\n      this.totalsByScope.set(scope, totals);\n    }\n\n    const record: UsageRecord = {\n      conversationId: entry.conversationId,\n      agent: entry.agent,\n      model: entry.model,\n      inputTokens,\n      outputTokens,\n      cost,\n      runs: 1,\n    };\n    this.events?.emit(AI_EVENTS.usage, record);\n    return record;\n  }\n\n  /** Totals for a conversation, or global totals when no id is given. */\n  totals(conversationId?: string): UsageTotals {\n    return { ...(this.totalsByScope.get(conversationId ?? GLOBAL) ?? empty()) };\n  }\n\n  /** Clears totals for a conversation (or all when no id). */\n  reset(conversationId?: string): void {\n    if (conversationId) {\n      this.totalsByScope.delete(conversationId);\n    } else {\n      this.totalsByScope.clear();\n    }\n  }\n}\n","import type {\n  BudgetCheckContext,\n  BudgetDecision,\n  BudgetExceededContext,\n  BudgetRunContext,\n} from './budget.types.js';\n\nexport interface OnBudgetExceeded {\n  /**\n   * Called before the run. Use it to enforce dynamic limits (e.g. credits\n   * stored in a database). Return block to abort the call, allow to proceed,\n   * or void to defer to the global handler.\n   */\n  beforeRunBudget?(\n    ctx: BudgetCheckContext,\n  ):\n    | BudgetDecision\n    | Promise<BudgetDecision>\n    | void\n    | Promise<void>;\n\n  /**\n   * Called after the run with the actual cost and usage. Use it to deduct\n   * credits or log spending.\n   */\n  afterRunBudget?(ctx: BudgetRunContext): void | Promise<void>;\n\n  /**\n   * Called when a configured static run limit is exceeded. Return a decision\n   * to allow, block, or replace the result.\n   */\n  onBudgetExceeded?(\n    ctx: BudgetExceededContext,\n  ): BudgetDecision | Promise<BudgetDecision>;\n}\n\nexport interface BudgetExceededHandler {\n  beforeRunBudget?(\n    ctx: BudgetCheckContext,\n  ):\n    | BudgetDecision\n    | Promise<BudgetDecision>\n    | void\n    | Promise<void>;\n\n  afterRunBudget?(ctx: BudgetRunContext): void | Promise<void>;\n\n  handleBudgetExceeded(\n    ctx: BudgetExceededContext,\n  ): BudgetDecision | Promise<BudgetDecision>;\n}\n\nexport const BUDGET_EXCEEDED_HANDLER = Symbol('BUDGET_EXCEEDED_HANDLER');\n","import 'reflect-metadata';\nimport { Injectable } from '@nestjs/common';\nimport { GUARDRAIL_METADATA } from '../ai.constants.js';\n\n/**\n * Marks an injectable provider as a {@link Guardrail}. Discovered guardrails run\n * on every agent execution. The class may inject its own dependencies.\n *\n * @example\n * ```ts\n * @Guardrail()\n * export class BlockProfanity implements Guardrail {\n *   beforeRun(ctx: GuardrailContext) {\n *     if (containsProfanity(ctx.messages)) throw new Error('Blocked');\n *   }\n * }\n * ```\n */\nexport function Guardrail(): ClassDecorator {\n  return (target) => {\n    Reflect.defineMetadata(GUARDRAIL_METADATA, true, target);\n    Injectable()(target);\n  };\n}\n","import { Inject, Injectable } from '@nestjs/common';\nimport { AI_MODULE_OPTIONS } from '../ai.constants.js';\nimport type { AiModuleOptions } from '../interfaces/ai-module-options.interface.js';\nimport { Guardrail } from '../observability/guardrail.decorator.js';\nimport type {\n  Guardrail as GuardrailContract,\n  GuardrailContext,\n} from '../observability/guardrail.interface.js';\nimport { UsageTracker } from './usage-tracker.service.js';\n\n/** Thrown when a conversation exceeds its configured cost budget. */\nexport class BudgetExceededError extends Error {\n  constructor(\n    public readonly conversationId: string | undefined,\n    public readonly spent: number,\n    public readonly limit: number,\n  ) {\n    super(\n      `Budget exceeded${conversationId ? ` for \"${conversationId}\"` : ''}: ` +\n        `$${spent.toFixed(4)} >= $${limit.toFixed(4)}.`,\n    );\n    this.name = 'BudgetExceededError';\n  }\n}\n\n/**\n * Guardrail that blocks a run when the conversation's accumulated cost has\n * reached `maxCostPerConversation`. Registered automatically when that option\n * is set.\n */\n@Guardrail()\n@Injectable()\nexport class BudgetGuard implements GuardrailContract {\n  constructor(\n    private readonly usage: UsageTracker,\n    @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n  ) {}\n\n  beforeRun(ctx: GuardrailContext): void {\n    const limit = this.options.maxCostPerConversation;\n    if (limit == null) {\n      return;\n    }\n    const { cost } = this.usage.totals(ctx.options.conversationId);\n    if (cost >= limit) {\n      throw new BudgetExceededError(ctx.options.conversationId, cost, limit);\n    }\n  }\n}\n","import type { BudgetExceededContext } from './budget.types.js';\nimport { BudgetExceededError } from './budget.guardrail.js';\n\nexport class RunBudgetExceededError extends BudgetExceededError {\n  constructor(\n    public readonly ctx: Pick<\n      BudgetExceededContext,\n      'agent' | 'conversationId' | 'exceeded' | 'limit' | 'cost'\n    >,\n    reason?: string,\n  ) {\n    super(ctx.conversationId, ctx.cost, ctx.limit);\n    this.name = 'RunBudgetExceededError';\n    this.message =\n      reason ??\n      `Run budget exceeded for agent \"${ctx.agent}\"` +\n        `${ctx.conversationId ? ` in conversation \"${ctx.conversationId}\"` : ''}: ` +\n        `${ctx.exceeded}=${ctx.cost.toFixed(6)} >= ${ctx.limit}.`;\n  }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { AGENT_METADATA, AI_MODULE_OPTIONS } from '../ai.constants.js';\nimport type { AiModuleOptions } from '../interfaces/ai-module-options.interface.js';\nimport type { GuardrailContext } from '../observability/guardrail.interface.js';\nimport type { AgentResult } from '../agent/agent.interface.js';\nimport { costOf } from './pricing.js';\nimport type {\n  BudgetCheckContext,\n  BudgetDecision,\n  BudgetExceededContext,\n  BudgetExceededKind,\n  BudgetLimits,\n  BudgetRunContext,\n} from './budget.types.js';\nimport {\n  BUDGET_EXCEEDED_HANDLER,\n  type BudgetExceededHandler,\n  type OnBudgetExceeded,\n} from './on-budget-exceeded.interface.js';\nimport { RunBudgetExceededError } from './run-budget-exceeded.error.js';\n\nfunction isOnBudgetExceeded(value: unknown): value is OnBudgetExceeded {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    (typeof (value as OnBudgetExceeded).onBudgetExceeded === 'function' ||\n      typeof (value as OnBudgetExceeded).beforeRunBudget === 'function' ||\n      typeof (value as OnBudgetExceeded).afterRunBudget === 'function')\n  );\n}\n\nfunction emptyUsage(): NonNullable<AgentResult['usage']> {\n  return {\n    inputTokens: 0,\n    outputTokens: 0,\n    totalTokens: 0,\n    inputTokenDetails: {\n      noCacheTokens: undefined,\n      cacheReadTokens: undefined,\n      cacheWriteTokens: undefined,\n    },\n    outputTokenDetails: {\n      textTokens: undefined,\n      reasoningTokens: undefined,\n    },\n  };\n}\n\n@Injectable()\nexport class BudgetPolicy {\n  constructor(\n    @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n    @Optional()\n    @Inject(BUDGET_EXCEEDED_HANDLER)\n    private readonly globalHandler?: BudgetExceededHandler,\n  ) {}\n\n  async beforeRunBudget(\n    agentInstance: object,\n    ctx: GuardrailContext,\n  ): Promise<void> {\n    const checkCtx: BudgetCheckContext = {\n      agent: ctx.agent,\n      model: this.resolveModel(ctx, agentInstance),\n      conversationId: ctx.options.conversationId,\n      messages: ctx.messages,\n      options: ctx.options,\n    };\n\n    const decision = await this.resolveBeforeRunDecision(\n      agentInstance,\n      checkCtx,\n    );\n    if (decision?.action === 'block') {\n      throw new RunBudgetExceededError(\n        {\n          agent: ctx.agent,\n          conversationId: ctx.options.conversationId,\n          exceeded: 'cost',\n          limit: 0,\n          cost: 0,\n        },\n        decision.reason,\n      );\n    }\n  }\n\n  async afterRunBudget(\n    agentInstance: object,\n    ctx: GuardrailContext,\n    result: AgentResult,\n  ): Promise<void> {\n    const model = this.resolveModel(ctx, agentInstance);\n    const cost = costOf(result.usage ?? {}, model, this.options.pricing);\n    const runCtx: BudgetRunContext = {\n      agent: ctx.agent,\n      model,\n      conversationId: ctx.options.conversationId,\n      usage: result.usage ?? emptyUsage(),\n      cost,\n      result,\n    };\n\n    if (isOnBudgetExceeded(agentInstance)) {\n      await agentInstance.afterRunBudget?.(runCtx);\n    }\n    await this.globalHandler?.afterRunBudget?.(runCtx);\n  }\n\n  async enforceRunBudget(\n    agentInstance: object,\n    ctx: GuardrailContext,\n    result: AgentResult,\n  ): Promise<void> {\n    const limits = this.resolveLimits(agentInstance);\n    const model = this.resolveModel(ctx, agentInstance);\n    const cost = costOf(result.usage ?? {}, model, this.options.pricing);\n\n    const exceeded = this.findExceededLimit(limits, result.usage ?? {}, cost);\n    if (!exceeded) {\n      return;\n    }\n\n    const budgetCtx: BudgetExceededContext = {\n      agent: ctx.agent,\n      model,\n      conversationId: ctx.options.conversationId,\n      usage: result.usage ?? emptyUsage(),\n      cost,\n      exceeded: exceeded.kind,\n      limit: exceeded.limit,\n      result,\n    };\n\n    const decision = this.resolveExceededDecision(agentInstance, budgetCtx);\n    return this.applyDecision(decision, budgetCtx);\n  }\n\n  private resolveLimits(agentInstance: object): BudgetLimits {\n    const agentOptions = Reflect.getMetadata(\n      AGENT_METADATA,\n      agentInstance.constructor,\n    );\n    const agentLimits: BudgetLimits | undefined = agentOptions?.budget;\n    return {\n      ...this.options.budget,\n      ...agentLimits,\n    };\n  }\n\n  private resolveModel(\n    ctx: GuardrailContext,\n    agentInstance: object,\n  ): string {\n    const agentOptions = Reflect.getMetadata(\n      AGENT_METADATA,\n      agentInstance.constructor,\n    );\n    const agentModel: string | string[] | undefined = agentOptions?.model;\n    return (\n      (Array.isArray(ctx.options.model)\n        ? ctx.options.model[0]\n        : ctx.options.model) ??\n      (Array.isArray(agentModel) ? agentModel[0] : agentModel) ??\n      'unknown'\n    );\n  }\n\n  private findExceededLimit(\n    limits: BudgetLimits,\n    usage: { inputTokens?: number; outputTokens?: number },\n    cost: number,\n  ): { kind: BudgetExceededKind; limit: number } | undefined {\n    if (limits.maxCostPerRun != null && cost >= limits.maxCostPerRun) {\n      return { kind: 'cost', limit: limits.maxCostPerRun };\n    }\n\n    const input = usage.inputTokens ?? 0;\n    const output = usage.outputTokens ?? 0;\n    const total = input + output;\n\n    if (\n      limits.maxInputTokensPerRun != null &&\n      input >= limits.maxInputTokensPerRun\n    ) {\n      return { kind: 'inputTokens', limit: limits.maxInputTokensPerRun };\n    }\n\n    if (\n      limits.maxOutputTokensPerRun != null &&\n      output >= limits.maxOutputTokensPerRun\n    ) {\n      return { kind: 'outputTokens', limit: limits.maxOutputTokensPerRun };\n    }\n\n    if (\n      limits.maxTotalTokensPerRun != null &&\n      total >= limits.maxTotalTokensPerRun\n    ) {\n      return { kind: 'totalTokens', limit: limits.maxTotalTokensPerRun };\n    }\n\n    return undefined;\n  }\n\n  private async resolveBeforeRunDecision(\n    agentInstance: object,\n    ctx: BudgetCheckContext,\n  ): Promise<BudgetDecision | undefined> {\n    if (isOnBudgetExceeded(agentInstance)) {\n      const decision = await agentInstance.beforeRunBudget?.(ctx);\n      if (this.isDecision(decision)) {\n        return decision;\n      }\n    }\n    if (this.globalHandler?.beforeRunBudget) {\n      const decision = await this.globalHandler.beforeRunBudget(ctx);\n      if (this.isDecision(decision)) {\n        return decision;\n      }\n    }\n    return undefined;\n  }\n\n  private isDecision(\n    value: BudgetDecision | void | Promise<BudgetDecision | void>,\n  ): value is BudgetDecision | Promise<BudgetDecision> {\n    return value != null && typeof value === 'object' && 'action' in value;\n  }\n\n  private resolveExceededDecision(\n    agentInstance: object,\n    ctx: BudgetExceededContext,\n  ): BudgetDecision | Promise<BudgetDecision> {\n    if (isOnBudgetExceeded(agentInstance)) {\n      const decision = agentInstance.onBudgetExceeded?.(ctx);\n      if (decision) {\n        return decision;\n      }\n    }\n    if (this.globalHandler) {\n      return this.globalHandler.handleBudgetExceeded(ctx);\n    }\n    return { action: 'block' };\n  }\n\n  private async applyDecision(\n    decision: BudgetDecision | Promise<BudgetDecision>,\n    ctx: BudgetExceededContext,\n  ): Promise<void> {\n    const resolved = await decision;\n    if (resolved.action === 'allow') {\n      return;\n    }\n    throw new RunBudgetExceededError(ctx, resolved.reason);\n  }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { embed, embedMany } from 'ai';\nimport { AI_CACHE } from '../ai.constants.js';\nimport { ProviderRegistry } from '../core/provider-registry.js';\nimport type { AiCache } from '../cache/ai-cache.interface.js';\n\nexport interface EmbedOptions {\n  /** Embedding model id, e.g. `\"openai:text-embedding-3-small\"`. */\n  model?: string;\n  abortSignal?: AbortSignal;\n  maxRetries?: number;\n}\n\n/**\n * Generates vector embeddings for semantic search, clustering, and similarity.\n * Wraps the Vercel AI SDK's `embed` / `embedMany`.\n */\n@Injectable()\nexport class EmbeddingsService {\n  constructor(\n    private readonly providers: ProviderRegistry,\n    @Optional() @Inject(AI_CACHE) private readonly cache?: AiCache,\n  ) {}\n\n  /** Embeds a single value (cached when a cache is configured). */\n  async embed(value: string, options: EmbedOptions = {}) {\n    const model = this.providers.getEmbeddingModel(options.model);\n    const key = `emb:${(model as { modelId?: string }).modelId ?? ''}:${value}`;\n\n    if (this.cache) {\n      const hit = await this.cache.get(key);\n      if (hit !== undefined) {\n        return hit as Awaited<ReturnType<typeof embed>>;\n      }\n    }\n\n    const result = await embed({\n      model,\n      value,\n      abortSignal: options.abortSignal,\n      maxRetries: options.maxRetries,\n    });\n\n    if (this.cache) {\n      await this.cache.set(key, result);\n    }\n    return result;\n  }\n\n  /** Embeds many values (the SDK batches automatically). */\n  async embedMany(values: string[], options: EmbedOptions = {}) {\n    return embedMany({\n      model: this.providers.getEmbeddingModel(options.model),\n      values,\n      abortSignal: options.abortSignal,\n      maxRetries: options.maxRetries,\n    });\n  }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { VECTOR_STORE } from '../../ai.constants.js';\nimport { EmbeddingsService } from '../../embeddings/embeddings.service.js';\nimport { AiService } from '../../core/ai.service.js';\nimport type {\n  VectorQueryResult,\n  VectorStore,\n} from '../../rag/vector-store.interface.js';\nimport { type AiInput, toMessages } from '../../messages/message.types.js';\n\nexport interface RecallOptions {\n  topK?: number;\n  model?: string;\n}\n\n/**\n * Long-term semantic memory: stores snippets per conversation as embeddings and\n * recalls the most relevant ones for a query. Backed by the configured\n * `VectorStore` (isolated per conversation via metadata).\n */\n@Injectable()\nexport class SemanticMemory {\n  constructor(\n    private readonly embeddings: EmbeddingsService,\n    @Inject(VECTOR_STORE) private readonly store: VectorStore,\n    @Optional() private readonly ai?: AiService,\n  ) {}\n\n  /** Embeds and stores a snippet under a conversation. */\n  async remember(\n    conversationId: string,\n    text: string,\n    options: { model?: string; metadata?: Record<string, unknown> } = {},\n  ): Promise<void> {\n    const { embedding } = await this.embeddings.embed(text, {\n      model: options.model,\n    });\n    await this.store.upsert([\n      {\n        id: `mem:${conversationId}:${hash(text)}`,\n        content: text,\n        embedding,\n        metadata: { conversationId, kind: 'memory', ...options.metadata },\n      },\n    ]);\n  }\n\n  /** Returns the most relevant stored snippets for a query. */\n  async recall(\n    conversationId: string,\n    query: string,\n    options: RecallOptions = {},\n  ): Promise<VectorQueryResult[]> {\n    const { embedding } = await this.embeddings.embed(query, {\n      model: options.model,\n    });\n    return this.store.query(embedding, {\n      topK: options.topK ?? 4,\n      filter: { conversationId, kind: 'memory' },\n    });\n  }\n\n  /**\n   * Summarizes messages with the LLM (requires `AiService`), then stores the\n   * summary as a memory snippet. Returns the stored text.\n   */\n  async rememberConversation(\n    conversationId: string,\n    input: AiInput,\n    options: { summarize?: boolean; model?: string } = {},\n  ): Promise<string> {\n    const text = options.summarize\n      ? await this.summarize(input, options.model)\n      : messagesToText(input);\n    await this.remember(conversationId, text, { model: options.model });\n    return text;\n  }\n\n  /** Summarizes messages into a compact string via the LLM. */\n  async summarize(input: AiInput, model?: string): Promise<string> {\n    if (!this.ai) {\n      throw new Error('SemanticMemory.summarize requires AiService.');\n    }\n    const { text } = await this.ai.generateText({\n      model,\n      prompt: `Summarize the following conversation concisely:\\n\\n${messagesToText(input)}`,\n    });\n    return text;\n  }\n}\n\nfunction messagesToText(input: AiInput): string {\n  return toMessages(input)\n    .map((m) => {\n      const content = (m as { content: unknown }).content;\n      if (typeof content === 'string') {\n        return `${m.role}: ${content}`;\n      }\n      if (Array.isArray(content)) {\n        return `${m.role}: ${content\n          .map((p) => (p && typeof p.text === 'string' ? p.text : ''))\n          .join(' ')}`;\n      }\n      return '';\n    })\n    .join('\\n');\n}\n\n/** Small deterministic string hash (djb2) for stable snippet ids. */\nfunction hash(text: string): string {\n  let h = 5381;\n  for (let i = 0; i < text.length; i++) {\n    h = (h * 33) ^ text.charCodeAt(i);\n  }\n  return (h >>> 0).toString(36);\n}\n","import 'reflect-metadata';\nimport { Inject, Injectable, Optional } from '@nestjs/common';\nimport {\n  generateObject,\n  generateText,\n  stepCountIs,\n  streamObject,\n  streamText,\n} from 'ai';\nimport {\n  AGENT_METADATA,\n  AI_MODULE_OPTIONS,\n  CONVERSATION_STORE,\n  DEFAULT_MAX_STEPS,\n} from '../ai.constants.js';\nimport type { AiModuleOptions } from '../interfaces/ai-module-options.interface.js';\nimport type { ConversationStore } from '../memory/conversation-store.interface.js';\nimport { type AiInput, type AiMessage, toMessages } from '../messages/message.types.js';\nimport { ProviderRegistry } from '../core/provider-registry.js';\nimport { ToolRegistry } from '../tools/tool.registry.js';\nimport { AiEventEmitter } from '../observability/ai-event-emitter.js';\nimport { AI_EVENTS } from '../observability/ai-events.js';\nimport { GuardrailRegistry } from '../observability/guardrail.registry.js';\nimport type { GuardrailContext } from '../observability/guardrail.interface.js';\nimport { PromptRegistry } from '../prompts/prompt-registry.service.js';\nimport { UsageTracker } from '../usage/usage-tracker.service.js';\nimport { BudgetPolicy } from '../usage/budget-policy.service.js';\nimport { SemanticMemory } from '../memory/semantic/semantic-memory.service.js';\nimport type { AgentOptions } from './agent.metadata.js';\nimport type { AgentResult, AgentRunOptions } from './agent.interface.js';\n\n/**\n * Runtime that executes `@Agent` classes: resolves their model, tools and\n * memory, then drives the Vercel AI SDK (`generateText` / `streamText`, or the\n * object variants when a structured-output schema is present).\n */\n@Injectable()\nexport class AgentExecutorService {\n  constructor(\n    private readonly providers: ProviderRegistry,\n    private readonly toolRegistry: ToolRegistry,\n    @Inject(CONVERSATION_STORE) private readonly store: ConversationStore,\n    @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n    @Optional() private readonly events?: AiEventEmitter,\n    @Optional() private readonly guardrails?: GuardrailRegistry,\n    @Optional() private readonly prompts?: PromptRegistry,\n    @Optional() private readonly usageTracker?: UsageTracker,\n    @Optional() private readonly budgetPolicy?: BudgetPolicy,\n    @Optional() private readonly semanticMemory?: SemanticMemory,\n  ) {}\n\n  /** Runs an agent to completion and returns its result. */\n  async run<T = unknown>(\n    agent: object,\n    input: AiInput,\n    opts: AgentRunOptions = {},\n  ): Promise<AgentResult<T>> {\n    try {\n      const { agentName, ctx, meta, model, newMessages, system } =\n        await this.prepareRun(agent, input, opts);\n      const schema = opts.schema ?? meta.output;\n      const maxSteps = this.resolveMaxSteps(opts, meta);\n\n      const result = schema\n        ? await this.runObject<T>(model, system, ctx.messages, schema, opts, newMessages)\n        : await this.runText<T>(model, system, ctx.messages, meta, maxSteps, opts, newMessages);\n\n      this.usageTracker?.record({\n        model: (model as { modelId?: string }).modelId ?? 'unknown',\n        usage: result.usage,\n        conversationId: opts.conversationId,\n        agent: agentName,\n      });\n\n      await this.budgetPolicy?.afterRunBudget(agent, ctx, result);\n      await this.guardrails?.runAfterRun(ctx, result);\n      this.events?.emit(AI_EVENTS.agentRunFinish, {\n        agent: agentName,\n        result,\n      });\n      return result;\n    } catch (error) {\n      this.events?.emit(AI_EVENTS.agentRunError, {\n        agent: agent.constructor?.name ?? 'AiAgent',\n        error,\n      });\n      throw error;\n    }\n  }\n\n  private async runObject<T>(\n    model: ReturnType<ProviderRegistry['getLanguageModel']>,\n    system: string | undefined,\n    messages: AiMessage[],\n    schema: NonNullable<AgentRunOptions['schema']>,\n    opts: AgentRunOptions,\n    newMessages: AiMessage[],\n  ): Promise<AgentResult<T>> {\n    const result = await generateObject({\n      model,\n      system,\n      messages,\n      allowSystemInMessages: true,\n      schema,\n      abortSignal: opts.abortSignal,\n      temperature: opts.temperature,\n      maxRetries: opts.maxRetries ?? this.options.maxRetries,\n      experimental_telemetry: this.telemetry(),\n    });\n    await this.persist(opts.conversationId, newMessages, [\n      { role: 'assistant', content: JSON.stringify(result.object) },\n    ]);\n    return {\n      text: '',\n      object: result.object as T,\n      usage: result.usage,\n      finishReason: result.finishReason,\n      messages: [],\n    };\n  }\n\n  private async runText<T>(\n    model: ReturnType<ProviderRegistry['getLanguageModel']>,\n    system: string | undefined,\n    messages: AiMessage[],\n    meta: AgentOptions,\n    maxSteps: number,\n    opts: AgentRunOptions,\n    newMessages: AiMessage[],\n  ): Promise<AgentResult<T>> {\n    const result = await generateText({\n      model,\n      system,\n      messages,\n      allowSystemInMessages: true,\n      tools: this.toolRegistry.buildToolSet(meta.tools),\n      stopWhen: stepCountIs(maxSteps),\n      abortSignal: opts.abortSignal,\n      temperature: opts.temperature,\n      maxRetries: opts.maxRetries ?? this.options.maxRetries,\n      experimental_telemetry: this.telemetry(),\n    });\n    await this.persist(opts.conversationId, newMessages, result.response.messages);\n    return {\n      text: result.text,\n      steps: result.steps,\n      toolCalls: result.toolCalls,\n      usage: result.totalUsage,\n      finishReason: result.finishReason,\n      messages: result.response.messages,\n    };\n  }\n\n  /**\n   * Streams an agent's response. Returns the raw Vercel stream result so\n   * callers can await it before piping it to an HTTP response or iterating\n   * `textStream`.\n   * Conversation persistence happens on stream finish.\n   */\n  async stream(\n    agent: object,\n    input: AiInput,\n    opts: AgentRunOptions = {},\n  ): Promise<ReturnType<typeof streamText> | ReturnType<typeof streamObject>> {\n    const agentName = agent.constructor?.name ?? 'AiAgent';\n\n    try {\n      const prepared = await this.prepareRun(agent, input, opts);\n      const { ctx, meta, model, newMessages, system } = prepared;\n      const modelId = (model as { modelId?: string }).modelId ?? 'unknown';\n      const schema = opts.schema ?? meta.output;\n      const maxSteps = this.resolveMaxSteps(opts, meta);\n      let streamFailed = false;\n      let errorReported = false;\n      const reportErrorOnce = (error: unknown): void => {\n        streamFailed = true;\n        if (errorReported) {\n          return;\n        }\n        errorReported = true;\n        this.events?.emit(AI_EVENTS.agentRunError, {\n          agent: prepared.agentName,\n          error,\n        });\n      };\n\n      if (schema) {\n        return streamObject({\n          model,\n          system,\n          messages: ctx.messages,\n          allowSystemInMessages: true,\n          schema,\n          abortSignal: opts.abortSignal,\n          temperature: opts.temperature,\n          maxRetries: opts.maxRetries ?? this.options.maxRetries,\n          experimental_telemetry: this.telemetry(),\n          onError: ({ error }) => {\n            reportErrorOnce(error);\n          },\n          onFinish: async ({ object, usage, error }) => {\n            if (object === undefined) {\n              reportErrorOnce(\n                error ?? new Error('Structured stream completed without an object.'),\n              );\n              return;\n            }\n            if (streamFailed) {\n              return;\n            }\n            const result: AgentResult = {\n              text: '',\n              object,\n              usage,\n              messages: [],\n            };\n            try {\n              await this.completeRun(\n                agent,\n                ctx,\n                modelId,\n                result,\n                newMessages,\n                [{ role: 'assistant', content: JSON.stringify(object) }],\n              );\n            } catch (error) {\n              reportErrorOnce(error);\n            }\n          },\n        });\n      }\n\n      return streamText({\n        model,\n        system,\n        messages: ctx.messages,\n        allowSystemInMessages: true,\n        tools: this.toolRegistry.buildToolSet(meta.tools),\n        stopWhen: stepCountIs(maxSteps),\n        abortSignal: opts.abortSignal,\n        temperature: opts.temperature,\n        maxRetries: opts.maxRetries ?? this.options.maxRetries,\n        experimental_telemetry: this.telemetry(),\n        onError: ({ error }) => {\n          reportErrorOnce(error);\n        },\n        onFinish: async ({\n          usage,\n          finishReason,\n          steps,\n          toolCalls,\n          text,\n          responseMessages,\n        }) => {\n          if (streamFailed) {\n            return;\n          }\n          const result: AgentResult = {\n            text,\n            steps,\n            toolCalls,\n            usage,\n            finishReason,\n            messages: responseMessages,\n          };\n          try {\n            await this.completeRun(\n              agent,\n              ctx,\n              modelId,\n              result,\n              newMessages,\n              responseMessages,\n            );\n          } catch (error) {\n            reportErrorOnce(error);\n          }\n        },\n      });\n    } catch (error) {\n      this.events?.emit(AI_EVENTS.agentRunError, {\n        agent: agentName,\n        error,\n      });\n      throw error;\n    }\n  }\n\n  private async prepareRun(\n    agent: object,\n    input: AiInput,\n    opts: AgentRunOptions,\n  ) {\n    const meta = this.readMetadata(agent);\n    const agentName = agent.constructor?.name ?? 'AiAgent';\n    const model = this.providers.getLanguageModel(opts.model ?? meta.model);\n    const newMessages = toMessages(input);\n    const history = await this.loadHistory(opts.conversationId);\n    const system = await this.resolveSystemWithRecall(opts, meta, input);\n    const ctx: GuardrailContext = {\n      agent: agentName,\n      agentInstance: agent,\n      messages: [...history, ...newMessages],\n      options: opts,\n    };\n\n    this.events?.emit(AI_EVENTS.agentRunStart, {\n      agent: agentName,\n      input,\n      options: opts,\n    });\n    await this.guardrails?.runBeforeRun(ctx);\n    await this.budgetPolicy?.beforeRunBudget(agent, ctx);\n\n    return { agentName, ctx, meta, model, newMessages, system };\n  }\n\n  /** Resolves the system prompt and prepends recalled memory when requested. */\n  private async resolveSystemWithRecall(\n    opts: AgentRunOptions,\n    meta: AgentOptions,\n    input: AiInput,\n  ): Promise<string | undefined> {\n    let system = this.resolveSystem(opts, meta);\n    if (opts.recall && opts.conversationId && this.semanticMemory) {\n      const query =\n        opts.recall.query ?? (typeof input === 'string' ? input : '');\n      if (query) {\n        const snippets = await this.semanticMemory.recall(\n          opts.conversationId,\n          query,\n          { topK: opts.recall.topK },\n        );\n        if (snippets.length > 0) {\n          const context = snippets.map((s) => s.content).join('\\n');\n          system = [system, `Relevant context from memory:\\n${context}`]\n            .filter(Boolean)\n            .join('\\n\\n');\n        }\n      }\n    }\n    return system;\n  }\n\n  private resolveSystem(\n    opts: AgentRunOptions,\n    meta: AgentOptions,\n  ): string | undefined {\n    if (opts.systemPrompt) {\n      if (!this.prompts) {\n        throw new Error(\n          'systemPrompt requires the PromptRegistry (AiModule must be imported).',\n        );\n      }\n      return this.prompts.render(\n        opts.systemPrompt.name,\n        opts.systemPrompt.vars,\n        { version: opts.systemPrompt.version },\n      );\n    }\n    return opts.system ?? meta.system;\n  }\n\n  private telemetry() {\n    const t = this.options.telemetry;\n    if (!t?.isEnabled) {\n      return undefined;\n    }\n    return { isEnabled: true, functionId: t.functionId };\n  }\n\n  private readMetadata(agent: object): AgentOptions {\n    const ctor = (agent as { constructor: unknown }).constructor;\n    return (\n      (Reflect.getMetadata(AGENT_METADATA, ctor as object) as\n        | AgentOptions\n        | undefined) ?? {}\n    );\n  }\n\n  private resolveMaxSteps(opts: AgentRunOptions, meta: AgentOptions): number {\n    return (\n      opts.maxSteps ??\n      meta.maxSteps ??\n      this.options.defaultMaxSteps ??\n      DEFAULT_MAX_STEPS\n    );\n  }\n\n  private async loadHistory(conversationId?: string) {\n    if (!conversationId) {\n      return [];\n    }\n    return this.store.load(conversationId);\n  }\n\n  private async persist(\n    conversationId: string | undefined,\n    userMessages: ReturnType<typeof toMessages>,\n    responseMessages: readonly unknown[],\n  ): Promise<void> {\n    if (!conversationId) {\n      return;\n    }\n    await this.store.append(conversationId, [\n      ...userMessages,\n      ...(responseMessages as ReturnType<typeof toMessages>),\n    ]);\n  }\n\n  private async completeRun(\n    agent: object,\n    ctx: GuardrailContext,\n    model: string,\n    result: AgentResult,\n    newMessages: ReturnType<typeof toMessages>,\n    responseMessages: readonly unknown[] = result.messages,\n  ): Promise<void> {\n    await this.persist(ctx.options.conversationId, newMessages, responseMessages);\n    this.usageTracker?.record({\n      model,\n      usage: result.usage,\n      conversationId: ctx.options.conversationId,\n      agent: ctx.agent,\n    });\n    await this.budgetPolicy?.afterRunBudget(agent, ctx, result);\n    await this.guardrails?.runAfterRun(ctx, result);\n    this.events?.emit(AI_EVENTS.agentRunFinish, { agent: ctx.agent, result });\n    this.events?.emit(AI_EVENTS.streamFinish, { agent: ctx.agent });\n  }\n}\n","import { Injectable } from '@nestjs/common';\nimport type { AiMessage } from '../messages/message.types.js';\nimport type { ConversationStore } from './conversation-store.interface.js';\n\n/**\n * Default in-process conversation store. Suitable for development, tests, and\n * single-instance deployments. History is lost on restart and not shared\n * across processes — provide a persistent implementation for production.\n */\n@Injectable()\nexport class InMemoryConversationStore implements ConversationStore {\n  private readonly conversations = new Map<string, AiMessage[]>();\n\n  async load(conversationId: string): Promise<AiMessage[]> {\n    return [...(this.conversations.get(conversationId) ?? [])];\n  }\n\n  async append(conversationId: string, messages: AiMessage[]): Promise<void> {\n    const existing = this.conversations.get(conversationId) ?? [];\n    this.conversations.set(conversationId, [...existing, ...messages]);\n  }\n\n  async clear(conversationId: string): Promise<void> {\n    this.conversations.delete(conversationId);\n  }\n}\n","import { Injectable } from '@nestjs/common';\nimport { generateImage } from 'ai';\nimport { ProviderRegistry } from '../core/provider-registry.js';\n\nexport interface GenerateImageOptions {\n  /** Image model id, e.g. `\"openai:dall-e-3\"`. Defaults to `defaultImageModel`. */\n  model?: string;\n  /** Number of images to generate. */\n  n?: number;\n  /** Size string, e.g. `\"1024x1024\"`. */\n  size?: `${number}x${number}`;\n  /** Aspect ratio, e.g. `\"16:9\"`. */\n  aspectRatio?: `${number}:${number}`;\n  seed?: number;\n  providerOptions?: Record<string, Record<string, any>>;\n  abortSignal?: AbortSignal;\n  maxRetries?: number;\n}\n\n/**\n * Generates images from a text prompt. Wraps the Vercel AI SDK's\n * `experimental_generateImage`. Result exposes `.image` and `.images`.\n */\n@Injectable()\nexport class ImageService {\n  constructor(private readonly providers: ProviderRegistry) {}\n\n  generate(prompt: string, options: GenerateImageOptions = {}) {\n    const { model, ...rest } = options;\n    return generateImage({\n      model: this.providers.getImageModel(model),\n      prompt,\n      ...rest,\n    });\n  }\n}\n","import { Injectable } from '@nestjs/common';\nimport { experimental_generateSpeech as generateSpeech } from 'ai';\nimport { ProviderRegistry } from '../core/provider-registry.js';\n\nexport interface GenerateSpeechOptions {\n  /** Speech model id, e.g. `\"openai:tts-1\"`. Defaults to `defaultSpeechModel`. */\n  model?: string;\n  /** Voice identifier (provider-specific). */\n  voice?: string;\n  /** Output audio format, e.g. `\"mp3\"`. */\n  outputFormat?: string;\n  /** Extra guidance for the synthesis. */\n  instructions?: string;\n  speed?: number;\n  language?: string;\n  providerOptions?: Record<string, Record<string, any>>;\n  abortSignal?: AbortSignal;\n  maxRetries?: number;\n}\n\n/**\n * Synthesizes speech from text. Wraps the Vercel AI SDK's\n * `experimental_generateSpeech`. Result exposes `.audio`.\n */\n@Injectable()\nexport class SpeechService {\n  constructor(private readonly providers: ProviderRegistry) {}\n\n  generate(text: string, options: GenerateSpeechOptions = {}) {\n    const { model, ...rest } = options;\n    return generateSpeech({\n      model: this.providers.getSpeechModel(model),\n      text,\n      ...rest,\n    });\n  }\n}\n","import { Injectable } from '@nestjs/common';\nimport { experimental_transcribe as transcribe } from 'ai';\nimport { ProviderRegistry } from '../core/provider-registry.js';\n\n/** Audio input accepted by the transcription service. */\nexport type AudioInput = Uint8Array | ArrayBuffer | Buffer | string | URL;\n\nexport interface TranscribeOptions {\n  /** Transcription model id, e.g. `\"openai:whisper-1\"`. */\n  model?: string;\n  providerOptions?: Record<string, Record<string, any>>;\n  abortSignal?: AbortSignal;\n  maxRetries?: number;\n}\n\n/**\n * Transcribes audio to text. Wraps the Vercel AI SDK's\n * `experimental_transcribe`. Result exposes `.text` and `.segments`.\n */\n@Injectable()\nexport class TranscriptionService {\n  constructor(private readonly providers: ProviderRegistry) {}\n\n  transcribe(audio: AudioInput, options: TranscribeOptions = {}) {\n    const { model, ...rest } = options;\n    return transcribe({\n      model: this.providers.getTranscriptionModel(model),\n      audio: audio as Parameters<typeof transcribe>[0]['audio'],\n      ...rest,\n    });\n  }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { RERANKER, VECTOR_STORE } from '../ai.constants.js';\nimport { EmbeddingsService } from '../embeddings/embeddings.service.js';\nimport type {\n  VectorDocument,\n  VectorQueryResult,\n  VectorStore,\n} from './vector-store.interface.js';\nimport type { Reranker } from './rerank/reranker.interface.js';\n\n/** An item to ingest into the vector store. */\nexport interface IngestItem {\n  /** Base id; chunks are suffixed `#0`, `#1`, … Defaults to a positional id. */\n  id?: string;\n  content: string;\n  metadata?: Record<string, unknown>;\n}\n\nexport interface IngestOptions {\n  /** Max characters per chunk (default 1000; 0 disables chunking). */\n  chunkSize?: number;\n  /** Character overlap between consecutive chunks (default 100). */\n  chunkOverlap?: number;\n  /** Embedding model id. */\n  model?: string;\n}\n\nexport interface RetrieveOptions {\n  topK?: number;\n  model?: string;\n  filter?: Record<string, unknown>;\n  /**\n   * Rerank the results before truncating to `topK`. `true` uses the configured\n   * default reranker; pass a `Reranker` to override. When reranking, more\n   * candidates (`fetchK`) are fetched first.\n   */\n  rerank?: boolean | Reranker;\n  /** Candidates to fetch before reranking (default `topK * 4`). */\n  fetchK?: number;\n}\n\n/**\n * Retrieval-augmented generation helper: chunk + embed + store documents, and\n * embed queries to fetch the most relevant chunks.\n */\n@Injectable()\nexport class RagService {\n  constructor(\n    private readonly embeddings: EmbeddingsService,\n    @Inject(VECTOR_STORE) private readonly store: VectorStore,\n    @Optional() @Inject(RERANKER) private readonly defaultReranker?: Reranker,\n  ) {}\n\n  /** Chunks, embeds, and upserts items into the vector store. */\n  async ingest(items: IngestItem[], options: IngestOptions = {}): Promise<void> {\n    const chunkSize = options.chunkSize ?? 1000;\n    const overlap = options.chunkOverlap ?? 100;\n\n    const chunks: { id: string; content: string; metadata?: Record<string, unknown> }[] =\n      [];\n    items.forEach((item, index) => {\n      const baseId = item.id ?? `doc-${index}`;\n      splitText(item.content, chunkSize, overlap).forEach((text, chunkIndex) => {\n        chunks.push({\n          id: `${baseId}#${chunkIndex}`,\n          content: text,\n          metadata: item.metadata,\n        });\n      });\n    });\n\n    if (chunks.length === 0) {\n      return;\n    }\n\n    const { embeddings } = await this.embeddings.embedMany(\n      chunks.map((c) => c.content),\n      { model: options.model },\n    );\n\n    const documents: VectorDocument[] = chunks.map((chunk, i) => ({\n      ...chunk,\n      embedding: embeddings[i],\n    }));\n    await this.store.upsert(documents);\n  }\n\n  /** Embeds `query` and returns the most similar stored chunks. */\n  async retrieve(\n    query: string,\n    options: RetrieveOptions = {},\n  ): Promise<VectorQueryResult[]> {\n    const { embedding } = await this.embeddings.embed(query, {\n      model: options.model,\n    });\n    const topK = options.topK ?? 4;\n\n    const reranker =\n      options.rerank === true\n        ? this.defaultReranker\n        : options.rerank || undefined;\n\n    const fetchK = reranker ? (options.fetchK ?? topK * 4) : topK;\n    const results = await this.store.query(embedding, {\n      topK: fetchK,\n      filter: options.filter,\n    });\n\n    if (reranker) {\n      return reranker.rerank(query, results, topK);\n    }\n    return results.slice(0, topK);\n  }\n}\n\n/** Splits text into overlapping fixed-size character chunks. */\nexport function splitText(\n  text: string,\n  chunkSize: number,\n  overlap: number,\n): string[] {\n  if (chunkSize <= 0 || text.length <= chunkSize) {\n    return text.length > 0 ? [text] : [];\n  }\n  const step = Math.max(1, chunkSize - overlap);\n  const chunks: string[] = [];\n  for (let start = 0; start < text.length; start += step) {\n    chunks.push(text.slice(start, start + chunkSize));\n    if (start + chunkSize >= text.length) {\n      break;\n    }\n  }\n  return chunks;\n}\n","import { Injectable } from '@nestjs/common';\nimport { cosineSimilarity } from 'ai';\nimport type {\n  VectorDocument,\n  VectorQueryOptions,\n  VectorQueryResult,\n  VectorStore,\n} from './vector-store.interface.js';\n\n/**\n * In-process vector store ranking by cosine similarity. Suitable for\n * development, tests, and small datasets. Not persistent or shared across\n * processes — provide a durable `VectorStore` for production.\n */\n@Injectable()\nexport class InMemoryVectorStore implements VectorStore {\n  private readonly documents = new Map<string, VectorDocument>();\n\n  async upsert(documents: VectorDocument[]): Promise<void> {\n    for (const doc of documents) {\n      if (!doc.embedding) {\n        throw new Error(\n          `Document \"${doc.id}\" has no embedding. InMemoryVectorStore requires ` +\n            `precomputed embeddings (use RagService.ingest).`,\n        );\n      }\n      this.documents.set(doc.id, doc);\n    }\n  }\n\n  async query(\n    embedding: number[],\n    options: VectorQueryOptions = {},\n  ): Promise<VectorQueryResult[]> {\n    const topK = options.topK ?? 4;\n    const filter = options.filter;\n\n    const scored: VectorQueryResult[] = [];\n    for (const doc of this.documents.values()) {\n      if (filter && !this.matchesFilter(doc, filter)) {\n        continue;\n      }\n      scored.push({\n        id: doc.id,\n        content: doc.content,\n        score: cosineSimilarity(embedding, doc.embedding!),\n        metadata: doc.metadata,\n      });\n    }\n\n    return scored.sort((a, b) => b.score - a.score).slice(0, topK);\n  }\n\n  async delete(ids: string[]): Promise<void> {\n    for (const id of ids) {\n      this.documents.delete(id);\n    }\n  }\n\n  async clear(): Promise<void> {\n    this.documents.clear();\n  }\n\n  private matchesFilter(\n    doc: VectorDocument,\n    filter: Record<string, unknown>,\n  ): boolean {\n    return Object.entries(filter).every(\n      ([key, value]) => doc.metadata?.[key] === value,\n    );\n  }\n}\n","import { Injectable, type OnModuleDestroy } from '@nestjs/common';\nimport { dynamicTool, jsonSchema, type ToolSet } from 'ai';\n\n/** A listed MCP tool (subset of the MCP `tools/list` result we use). */\nexport interface McpToolInfo {\n  name: string;\n  description?: string;\n  inputSchema: unknown;\n}\n\n/** Result of an MCP `tools/call` (subset). */\nexport interface McpCallResult {\n  content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n  isError?: boolean;\n  [k: string]: unknown;\n}\n\n/**\n * Structural interface for an MCP client (e.g. `Client` from\n * `@modelcontextprotocol/sdk`). Kept structural so this library has no\n * compile-time dependency on the SDK and can be tested with a fake.\n */\nexport interface McpClientLike {\n  listTools(): Promise<{ tools: McpToolInfo[] }>;\n  callTool(params: {\n    name: string;\n    arguments?: Record<string, unknown>;\n  }): Promise<McpCallResult>;\n  close?(): Promise<void>;\n}\n\n/**\n * Connects to MCP servers and adapts their tools into AI SDK tool sets that\n * agents can use. Register a connected client via `connect(name, client)`, then\n * reference its tools with `getToolSet(name)`.\n */\n@Injectable()\nexport class McpService implements OnModuleDestroy {\n  private readonly clients = new Map<string, McpClientLike>();\n  private readonly toolSets = new Map<string, ToolSet>();\n\n  /**\n   * Registers an MCP client under `name`, lists its tools, and builds a\n   * matching AI SDK tool set. Returns the tool set.\n   */\n  async connect(name: string, client: McpClientLike): Promise<ToolSet> {\n    const { tools } = await client.listTools();\n    const set: ToolSet = {};\n    for (const info of tools) {\n      set[info.name] = dynamicTool({\n        description: info.description ?? info.name,\n        inputSchema: jsonSchema(info.inputSchema as any),\n        execute: async (args: unknown) => {\n          const result = await client.callTool({\n            name: info.name,\n            arguments: (args ?? {}) as Record<string, unknown>,\n          });\n          return extractText(result);\n        },\n      });\n    }\n    this.clients.set(name, client);\n    this.toolSets.set(name, set);\n    return set;\n  }\n\n  /** Returns the tool set for a connected server (empty if unknown). */\n  getToolSet(name: string): ToolSet {\n    return this.toolSets.get(name) ?? {};\n  }\n\n  /** Returns tool sets for all connected servers, merged. */\n  getAllTools(): ToolSet {\n    return Object.assign({}, ...this.toolSets.values());\n  }\n\n  async onModuleDestroy(): Promise<void> {\n    await this.closeAll();\n  }\n\n  /** Closes every connected client. */\n  async closeAll(): Promise<void> {\n    for (const client of this.clients.values()) {\n      await client.close?.();\n    }\n    this.clients.clear();\n    this.toolSets.clear();\n  }\n}\n\n/** Flattens an MCP call result's content into a string. */\nfunction extractText(result: McpCallResult): string {\n  if (!result.content) {\n    return '';\n  }\n  return result.content\n    .filter((part) => part.type === 'text' && typeof part.text === 'string')\n    .map((part) => part.text)\n    .join('\\n');\n}\n","/**\n * Throttles agent runs. Implement this (e.g. Redis) for distributed limiting\n * and register it via `AiModule.forRoot({ rateLimiter })`.\n */\nexport interface RateLimiter {\n  /**\n   * Attempts to consume `cost` units for `key`. Resolves `true` if allowed,\n   * `false` if the limit is exceeded.\n   */\n  consume(key: string, cost?: number): Promise<boolean>;\n}\n\n/** Thrown by the rate-limit guardrail when a run is throttled. */\nexport class RateLimitedError extends Error {\n  constructor(public readonly key: string) {\n    super(`Rate limit exceeded for \"${key}\".`);\n    this.name = 'RateLimitedError';\n  }\n}\n","import { Inject, Injectable } from '@nestjs/common';\nimport { RATE_LIMITER } from '../ai.constants.js';\nimport { Guardrail } from '../observability/guardrail.decorator.js';\nimport type {\n  Guardrail as GuardrailContract,\n  GuardrailContext,\n} from '../observability/guardrail.interface.js';\nimport {\n  RateLimitedError,\n  type RateLimiter,\n} from './rate-limiter.interface.js';\n\n/**\n * Guardrail that throttles runs through the configured `RateLimiter`, keyed by\n * conversation id (or `\"global\"`). Registered when `rateLimiter` is set.\n */\n@Guardrail()\n@Injectable()\nexport class RateLimitGuardrail implements GuardrailContract {\n  constructor(\n    @Inject(RATE_LIMITER) private readonly limiter: RateLimiter,\n  ) {}\n\n  async beforeRun(ctx: GuardrailContext): Promise<void> {\n    const key = ctx.options.conversationId ?? 'global';\n    const allowed = await this.limiter.consume(key);\n    if (!allowed) {\n      throw new RateLimitedError(key);\n    }\n  }\n}\n","import { Injectable, Optional } from '@nestjs/common';\nimport type { VectorQueryResult } from '../vector-store.interface.js';\nimport type { Reranker } from './reranker.interface.js';\n\nexport interface HeuristicRerankerOptions {\n  /** Weight of the query-term overlap boost relative to the base score. */\n  overlapWeight?: number;\n}\n\n/**\n * Zero-dependency reranker that boosts results whose content shares terms with\n * the query, on top of the base similarity score. A pragmatic default when no\n * reranking model is configured.\n */\n@Injectable()\nexport class HeuristicReranker implements Reranker {\n  constructor(\n    @Optional() private readonly options: HeuristicRerankerOptions = {},\n  ) {}\n\n  async rerank(\n    query: string,\n    results: VectorQueryResult[],\n    topN: number,\n  ): Promise<VectorQueryResult[]> {\n    const weight = this.options.overlapWeight ?? 0.5;\n    const terms = tokenize(query);\n\n    return results\n      .map((result) => ({\n        result,\n        score: result.score + weight * overlap(terms, result.content),\n      }))\n      .sort((a, b) => b.score - a.score)\n      .slice(0, topN)\n      .map(({ result, score }) => ({ ...result, score }));\n  }\n}\n\nfunction tokenize(text: string): Set<string> {\n  return new Set(\n    text\n      .toLowerCase()\n      .split(/[^a-z0-9]+/)\n      .filter((t) => t.length > 2),\n  );\n}\n\n/** Fraction of query terms present in the content. */\nfunction overlap(terms: Set<string>, content: string): number {\n  if (terms.size === 0) {\n    return 0;\n  }\n  const contentTerms = tokenize(content);\n  let hits = 0;\n  for (const term of terms) {\n    if (contentTerms.has(term)) {\n      hits++;\n    }\n  }\n  return hits / terms.size;\n}\n","import { Injectable } from '@nestjs/common';\nimport { z } from 'zod';\nimport type {\n  EvalCase,\n  EvalReport,\n  EvalResult,\n  Judge,\n} from './eval.types.js';\n\n/** Minimal agent shape the runner needs. */\nexport interface RunnableAgent {\n  run(input: string): Promise<{ text: string }>;\n}\n\n/** Minimal `AiService` shape for the LLM judge. */\nexport interface JudgeAi {\n  generateObject(params: {\n    model?: string;\n    schema: unknown;\n    prompt: string;\n  }): Promise<{ object: { score: number; reasoning: string } }>;\n}\n\nexport interface RunEvalOptions {\n  judge?: Judge;\n  /** Pass threshold in [0, 1] for the default judge (default 1). */\n  passThreshold?: number;\n}\n\n/**\n * Runs an agent over a set of cases and scores each output with a judge\n * (default: substring match against `expected`; or an LLM judge).\n */\n@Injectable()\nexport class EvalRunner {\n  async run(\n    agent: RunnableAgent,\n    cases: EvalCase[],\n    options: RunEvalOptions = {},\n  ): Promise<EvalReport> {\n    const judge = options.judge ?? defaultJudge(options.passThreshold ?? 1);\n    const results: EvalResult[] = [];\n\n    for (const evalCase of cases) {\n      const { text } = await agent.run(evalCase.input);\n      const score = await judge({ case: evalCase, output: text });\n      results.push({\n        name: evalCase.name ?? evalCase.input,\n        input: evalCase.input,\n        output: text,\n        ...score,\n      });\n    }\n\n    const averageScore = results.length\n      ? results.reduce((sum, r) => sum + r.score, 0) / results.length\n      : 0;\n    const passRate = results.length\n      ? results.filter((r) => r.passed).length / results.length\n      : 0;\n\n    return { results, averageScore, passRate };\n  }\n}\n\n/** Substring-match judge against `case.expected`. */\nexport function defaultJudge(threshold: number): Judge {\n  return ({ case: evalCase, output }) => {\n    if (evalCase.expected == null) {\n      return { score: 0, passed: false, reasoning: 'no expected value or judge' };\n    }\n    const score = output.includes(evalCase.expected) ? 1 : 0;\n    return { score, passed: score >= threshold };\n  };\n}\n\n/**\n * Builds an LLM-as-judge that scores outputs 0..`scale` and normalizes to [0,1].\n */\nexport function createLlmJudge(\n  ai: JudgeAi,\n  options: { model?: string; scale?: number; passThreshold?: number } = {},\n): Judge {\n  const scale = options.scale ?? 5;\n  const passThreshold = options.passThreshold ?? 0.6;\n  return async ({ case: evalCase, output }) => {\n    const { object } = await ai.generateObject({\n      model: options.model,\n      schema: z.object({ score: z.number(), reasoning: z.string() }),\n      prompt:\n        `Rubric: ${evalCase.rubric ?? 'Is the answer correct and helpful?'}\\n` +\n        `Expected: ${evalCase.expected ?? 'n/a'}\\n` +\n        `Output: ${output}\\n` +\n        `Give a score from 0 to ${scale} and a brief reasoning.`,\n    });\n    const normalized = Math.max(0, Math.min(1, object.score / scale));\n    return {\n      score: normalized,\n      passed: normalized >= passThreshold,\n      reasoning: object.reasoning,\n    };\n  };\n}\n","import { Injectable } from '@nestjs/common';\nimport { Guardrail } from '../observability/guardrail.decorator.js';\nimport type {\n  Guardrail as GuardrailContract,\n  GuardrailContext,\n} from '../observability/guardrail.interface.js';\nimport type { AgentResult } from '../agent/agent.interface.js';\nimport { BudgetPolicy } from './budget-policy.service.js';\n\n@Guardrail()\n@Injectable()\nexport class RunBudgetGuardrail implements GuardrailContract {\n  constructor(private readonly policy: BudgetPolicy) {}\n\n  async afterRun(\n    ctx: GuardrailContext,\n    result: AgentResult,\n  ): Promise<void> {\n    await this.policy.enforceRunBudget(ctx.agentInstance, ctx, result);\n  }\n}\n","import {\n  type DynamicModule,\n  Global,\n  Module,\n  type Provider,\n  type Type,\n} from '@nestjs/common';\nimport { DiscoveryModule, ModuleRef } from '@nestjs/core';\nimport {\n  AI_CACHE,\n  AI_MODULE_OPTIONS,\n  APPROVAL_GATE,\n  CONVERSATION_STORE,\n  RATE_LIMITER,\n  RERANKER,\n  VECTOR_STORE,\n} from './ai.constants.js';\nimport type {\n  AiFeatureOptions,\n  AiModuleAsyncOptions,\n  AiModuleOptions,\n  ConversationStoreProvider,\n} from './interfaces/ai-module-options.interface.js';\nimport { ProviderRegistry } from './core/provider-registry.js';\nimport { AiService } from './core/ai.service.js';\nimport { ToolRegistry } from './tools/tool.registry.js';\nimport { AgentExecutorService } from './agent/agent-executor.service.js';\nimport { EmbeddingsService } from './embeddings/embeddings.service.js';\nimport { InMemoryConversationStore } from './memory/in-memory-conversation.store.js';\nimport { ImageService } from './multimodal/image.service.js';\nimport { SpeechService } from './multimodal/speech.service.js';\nimport { TranscriptionService } from './multimodal/transcription.service.js';\nimport { RagService } from './rag/rag.service.js';\nimport { InMemoryVectorStore } from './rag/in-memory-vector-store.js';\nimport { PromptRegistry } from './prompts/prompt-registry.service.js';\nimport {\n  AiEventEmitter,\n  EVENT_EMITTER,\n} from './observability/ai-event-emitter.js';\nimport { GuardrailRegistry } from './observability/guardrail.registry.js';\nimport { AgentRegistry } from './agent/orchestration/agent-registry.js';\nimport { McpService } from './mcp/mcp.service.js';\nimport { UsageTracker } from './usage/usage-tracker.service.js';\nimport { BudgetGuard } from './usage/budget.guardrail.js';\nimport { RateLimitGuardrail } from './ratelimit/rate-limit.guardrail.js';\nimport { SemanticMemory } from './memory/semantic/semantic-memory.service.js';\nimport { HeuristicReranker } from './rag/rerank/heuristic-reranker.js';\nimport { EvalRunner } from './evals/eval-runner.service.js';\n\nimport { BudgetPolicy } from './usage/budget-policy.service.js';\nimport { RunBudgetGuardrail } from './usage/run-budget.guardrail.js';\nimport {\n  BUDGET_EXCEEDED_HANDLER,\n  type BudgetExceededHandler,\n} from './usage/on-budget-exceeded.interface.js';\n\nconst AI_INITIALIZER = Symbol('AI_INITIALIZER');\n\n/**\n * Root module for `@mgvdev/nestjs-ai`. Registered globally so agents, tools and\n * services are available everywhere once configured.\n */\n@Global()\n@Module({})\nexport class AiModule {\n  /** Configure the module with static options. */\n  static forRoot(options: AiModuleOptions = {}): DynamicModule {\n    return AiModule.build(\n      { provide: AI_MODULE_OPTIONS, useValue: options },\n      options,\n    );\n  }\n\n  /** Configure the module asynchronously (e.g. from `ConfigService`). */\n  static forRootAsync(options: AiModuleAsyncOptions): DynamicModule {\n    return AiModule.build(\n      {\n        provide: AI_MODULE_OPTIONS,\n        useFactory: options.useFactory,\n        inject: options.inject ?? [],\n      },\n      options,\n      options.imports,\n    );\n  }\n\n  /**\n   * Convenience registration of agents / tools / guardrails so they don't have\n   * to be added to a consuming module's own `providers` array, plus feature\n   * prompts. Discovery still finds providers globally regardless of where they\n   * are registered.\n   */\n  static forFeature(feature: AiFeatureOptions = {}): DynamicModule {\n    const providers: Provider[] = [\n      ...(feature.agents ?? []),\n      ...(feature.tools ?? []),\n      ...(feature.guardrails ?? []),\n    ];\n    if (feature.prompts?.length) {\n      providers.push({\n        provide: Symbol('AI_FEATURE_PROMPTS'),\n        useFactory: (registry: PromptRegistry) => {\n          registry.registerAll(feature.prompts!);\n          return true;\n        },\n        inject: [PromptRegistry],\n      });\n    }\n    return { module: AiModule, providers, exports: providers };\n  }\n\n  private static build(\n    optionsProvider: Provider,\n    options: Partial<AiModuleOptions> & {\n      conversationStore?: ConversationStoreProvider;\n    },\n    extraImports: DynamicModule['imports'] = [],\n  ): DynamicModule {\n    return {\n      module: AiModule,\n      imports: [DiscoveryModule, ...(extraImports ?? [])],\n      providers: [\n        optionsProvider,\n        AiModule.storeProvider(options.conversationStore),\n        AiModule.vectorStoreProvider(options.vectorStore),\n        AiModule.eventEmitterProvider(),\n        ...AiModule.tokenProvider(AI_CACHE, options.cache),\n        ...AiModule.tokenProvider(APPROVAL_GATE, options.approvalGate),\n        ...AiModule.tokenProvider(RATE_LIMITER, options.rateLimiter),\n        ...AiModule.guardrailClasses(options.guardrails),\n        ...(options.maxCostPerConversation != null ? [BudgetGuard] : []),\n        ...(options.rateLimiter ? [RateLimitGuardrail] : []),\n        ...(options.budget != null ? [RunBudgetGuardrail] : []),\n        ...AiModule.budgetExceededHandlerProvider(options.budgetExceededHandler),\n        ...AiModule.coreProviders(),\n        AiModule.initializerProvider(),\n      ],\n      exports: AiModule.exportedTokens(),\n    };\n  }\n\n  private static coreProviders(): Provider[] {\n    return [\n      ProviderRegistry,\n      ToolRegistry,\n      AgentExecutorService,\n      AgentRegistry,\n      AiService,\n      EmbeddingsService,\n      ImageService,\n      SpeechService,\n      TranscriptionService,\n      RagService,\n      PromptRegistry,\n      AiEventEmitter,\n      GuardrailRegistry,\n      McpService,\n      UsageTracker,\n      BudgetPolicy,\n      SemanticMemory,\n      EvalRunner,\n      { provide: RERANKER, useFactory: () => new HeuristicReranker() },\n    ];\n  }\n\n  /**\n   * Registers an optional provider (class / factory / value / useClass shape)\n   * under `token`, or nothing when not configured.\n   */\n  private static tokenProvider(\n    token: symbol,\n    config:\n      | Type<any>\n      | { useClass?: Type<any>; useFactory?: (...a: any[]) => any; useValue?: any; inject?: any[] }\n      | undefined,\n  ): Provider[] {\n    if (!config) {\n      return [];\n    }\n    if (typeof config === 'function') {\n      return [{ provide: token, useClass: config }];\n    }\n    return [{ provide: token, ...config } as Provider];\n  }\n\n  private static exportedTokens(): any[] {\n    return [\n      ProviderRegistry,\n      ToolRegistry,\n      AgentExecutorService,\n      AgentRegistry,\n      AiService,\n      EmbeddingsService,\n      ImageService,\n      SpeechService,\n      TranscriptionService,\n      RagService,\n      PromptRegistry,\n      AiEventEmitter,\n      GuardrailRegistry,\n      McpService,\n      UsageTracker,\n      SemanticMemory,\n      EvalRunner,\n      RERANKER,\n      CONVERSATION_STORE,\n      VECTOR_STORE,\n      AI_MODULE_OPTIONS,\n    ];\n  }\n\n  private static guardrailClasses(guardrails?: Type<any>[]): Provider[] {\n    return guardrails ?? [];\n  }\n\n  private static budgetExceededHandlerProvider(\n    handler: AiModuleOptions['budgetExceededHandler'],\n  ): Provider[] {\n    if (!handler) {\n      return [];\n    }\n    if (typeof handler === 'function') {\n      return [{ provide: BUDGET_EXCEEDED_HANDLER, useClass: handler }];\n    }\n    return [{ provide: BUDGET_EXCEEDED_HANDLER, ...handler } as Provider];\n  }\n\n  /** Seeds prompts (and future startup wiring) once dependencies exist. */\n  private static initializerProvider(): Provider {\n    return {\n      provide: AI_INITIALIZER,\n      useFactory: (registry: PromptRegistry, opts: AiModuleOptions) => {\n        if (opts.prompts?.length) {\n          registry.registerAll(opts.prompts);\n        }\n        return true;\n      },\n      inject: [PromptRegistry, AI_MODULE_OPTIONS],\n    };\n  }\n\n  /**\n   * Optionally resolves `EventEmitter2` from `@nestjs/event-emitter` if the\n   * package is installed and its module is imported; otherwise `undefined`.\n   */\n  private static eventEmitterProvider(): Provider {\n    return {\n      provide: EVENT_EMITTER,\n      useFactory: async (moduleRef: ModuleRef) => {\n        try {\n          const mod: any = await import('@nestjs/event-emitter');\n          return moduleRef.get(mod.EventEmitter2, { strict: false });\n        } catch {\n          return undefined;\n        }\n      },\n      inject: [ModuleRef],\n    };\n  }\n\n  private static storeProvider(store?: ConversationStoreProvider): Provider {\n    if (!store) {\n      return {\n        provide: CONVERSATION_STORE,\n        useClass: InMemoryConversationStore,\n      };\n    }\n    if (typeof store === 'function') {\n      return { provide: CONVERSATION_STORE, useClass: store };\n    }\n    return { provide: CONVERSATION_STORE, ...store } as Provider;\n  }\n\n  private static vectorStoreProvider(\n    store?: AiModuleOptions['vectorStore'],\n  ): Provider {\n    if (!store) {\n      return { provide: VECTOR_STORE, useClass: InMemoryVectorStore };\n    }\n    if (typeof store === 'function') {\n      return { provide: VECTOR_STORE, useClass: store };\n    }\n    return { provide: VECTOR_STORE, ...store } as Provider;\n  }\n}\n","import type { Provider } from '@nestjs/common';\nimport { Test, type TestingModule } from '@nestjs/testing';\nimport type { EmbeddingModelV3, LanguageModelV3 } from '@ai-sdk/provider';\nimport { AiModule } from '../ai.module.js';\nimport { ProviderRegistry } from '../core/provider-registry.js';\nimport type { AiModuleOptions } from '../interfaces/ai-module-options.interface.js';\nimport { createEmbeddingMock, createMockModel } from './mock-model.js';\n\nexport interface TestingAiModuleOptions {\n  /** Mock language model (default: replies \"mock response\"). */\n  model?: LanguageModelV3;\n  /** Mock embedding model (default: zero vector). */\n  embedding?: EmbeddingModelV3;\n  /** Extra providers (agents, tools, guardrails) to register. */\n  providers?: Provider[];\n  /** Extra modules to import. */\n  imports?: any[];\n  /** AiModule options (default: a dummy openai provider). */\n  aiOptions?: AiModuleOptions;\n}\n\n/**\n * Boots a NestJS testing module with `AiModule` and a `ProviderRegistry`\n * overridden to serve mock models — no API keys or network. Returns the\n * initialized module; `get()` your agents/services from it.\n *\n * @example\n * ```ts\n * const app = await createTestingAiModule({\n *   model: createMockModel('Hello!'),\n *   providers: [MyAgent],\n * });\n * const { text } = await app.get(MyAgent).run('hi');\n * ```\n */\nexport async function createTestingAiModule(\n  options: TestingAiModuleOptions = {},\n): Promise<TestingModule> {\n  const model = options.model ?? createMockModel('mock response');\n  const embedding = options.embedding ?? createEmbeddingMock(() => [0]);\n\n  const moduleRef = await Test.createTestingModule({\n    imports: [\n      AiModule.forRoot(\n        options.aiOptions ?? { providers: { openai: { apiKey: 'test' } } },\n      ),\n      ...(options.imports ?? []),\n    ],\n    providers: options.providers ?? [],\n  })\n    .overrideProvider(ProviderRegistry)\n    .useValue({\n      getLanguageModel: () => model,\n      getEmbeddingModel: () => embedding,\n      getImageModel: () => {\n        throw new Error('No image model mock configured.');\n      },\n      getSpeechModel: () => {\n        throw new Error('No speech model mock configured.');\n      },\n      getTranscriptionModel: () => {\n        throw new Error('No transcription model mock configured.');\n      },\n      getRerankingModel: () => {\n        throw new Error('No reranking model mock configured.');\n      },\n    } as unknown as ProviderRegistry)\n    .compile();\n\n  await moduleRef.init();\n  return moduleRef;\n}\n"]}