{"version":3,"sources":["../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/tools/tool.decorator.ts","../src/agent/agent.decorator.ts","../src/agent/ai-agent.base.ts","../src/rag/retrieval-tool.ts","../src/memory/adapters/prisma/prisma-conversation.store.ts","../src/cache/in-memory-ai-cache.ts","../src/approval/approval-gates.ts","../src/http/stream-response.ts","../src/http/agent-stream.interceptor.ts","../src/jobs/agent-queue.service.ts","../src/jobs/agent-job.processor.ts","../src/jobs/agent-jobs.module.ts","../src/rag/adapters/pgvector/pgvector-store.ts","../src/ratelimit/in-memory-rate-limiter.ts","../src/safety/pii-redaction.guardrail.ts","../src/safety/moderation.guardrail.ts","../src/rag/rerank/model-reranker.ts","../src/rag/adapters/qdrant/qdrant-vector-store.ts","../src/rag/adapters/pinecone/pinecone-vector-store.ts","../src/websocket/stream-to-socket.ts"],"names":["AI_MODULE_OPTIONS","CONVERSATION_STORE","VECTOR_STORE","AI_CACHE","APPROVAL_GATE","AGENT_QUEUE","RATE_LIMITER","RERANKER","TOOL_METADATA","AGENT_METADATA","GUARDRAIL_METADATA","DEFAULT_MAX_STEPS","createFallbackModel","models","options","length","Error","primary","shouldRetry","attempt","call","lastError","i","error","isLast","specificationVersion","provider","modelId","supportedUrls","doGenerate","callOptions","model","doStream","createCacheMiddleware","cache","wrapGenerate","params","key","cacheKey","cached","get","undefined","result","set","ttlMs","stableStringify","value","JSON","stringify","_key","val","Array","isArray","Object","keys","sort","reduce","acc","k","ProviderRegistry","providers","Map","applyCache","wrapLanguageModel","middleware","cacheTtlMs","onModuleInit","configured","name","config","initProvider","getLanguageModel","chain","defaultModel","resolved","map","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","usage","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","values","createAgentTool","agent","schema","inputSchema","z","object","input","string","describe","description","execute","run","text","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","content","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","inputTokens","outputTokens","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","totalTokens","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","embed","hit","abortSignal","maxRetries","embedMany","SemanticMemory","embeddings","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","finishReason","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","results","step","Math","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","type","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","createLlmJudge","scale","number","rubric","normalized","min","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","Tool","propertyKey","descriptor","Agent","AiAgent","executor","createRetrievalTool","rag","PrismaConversationStore","delegate","rows","findMany","where","orderBy","position","row","base","create","data","deleteMany","InMemoryAiCache","expiresAt","Date","now","AutoApproveGate","_context","DenyApproveGate","pipeAgentStream","res","protocol","pipeTextStreamToResponse","pipeUIMessageStreamToResponse","AgentStreamInterceptor","intercept","switchToHttp","getResponse","handle","pipe","mergeMap","EMPTY","AGENT_JOB_NAME","AgentQueueService","queue","enqueue","jobOptions","job","add","AgentJobProcessor","AGENT_JOBS_OPTIONS","DEFAULT_QUEUE","loadBullMq","specifier","AgentWorkerManager","worker","processor","runWorker","Worker","queueName","connection","AgentJobsModule","Queue","PgVectorStore","table","pool","toVectorLiteral","vector","limitParam","Number","InMemoryRateLimiter","buckets","bucket","tokens","capacity","last","elapsed","refill","intervalMs","refillTokens","DEFAULT_PII_PATTERNS","redactPii","patterns","replacement","out","pattern","redactMessages","PiiRedactionGuardrail","createPiiRedactionGuardrail","ConfiguredPiiRedaction","ContentBlockedError","messagesText","createModerationGuardrail","blocked","moderate","ConfiguredModeration","lower","find","ModelReranker","ranking","originalIndex","QdrantVectorStore","collection","wait","points","search","with_payload","buildFilter","must","match","PineconeVectorStore","matches","includeMetadata","deleteAll","streamAgentToSocket","socket","chunkEvent","doneEvent","errorEvent","delta","textStream"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 'reflect-metadata';\nimport { TOOL_METADATA } from '../ai.constants.js';\nimport type { ToolMetadata, ToolOptions } from './tool.metadata.js';\n\n/**\n * Marks a method of an injectable provider as an AI tool (a.k.a. function\n * call). The method receives the validated arguments (typed by the Zod\n * `schema`) and its return value is fed back to the model.\n *\n * Because the owning class is a normal NestJS provider, the method keeps full\n * access to injected dependencies.\n *\n * @example\n * ```ts\n * @Injectable()\n * class WeatherTools {\n *   constructor(private readonly api: WeatherApi) {}\n *\n *   @Tool({ description: 'Get the weather for a city', schema: z.object({ city: z.string() }) })\n *   getWeather({ city }: { city: string }) {\n *     return this.api.lookup(city);\n *   }\n * }\n * ```\n */\nexport function Tool(options: ToolOptions): MethodDecorator {\n  return (target, propertyKey, descriptor: PropertyDescriptor) => {\n    const metadata: ToolMetadata = {\n      ...options,\n      methodName: String(propertyKey),\n    };\n    // Store on the method function itself so `Reflector.get(TOOL_METADATA, fn)`\n    // resolves it during discovery.\n    Reflect.defineMetadata(TOOL_METADATA, metadata, descriptor.value);\n    return descriptor;\n  };\n}\n","import 'reflect-metadata';\nimport { Injectable } from '@nestjs/common';\nimport { AGENT_METADATA } from '../ai.constants.js';\nimport type { AgentOptions } from './agent.metadata.js';\n\n/**\n * Declares a class as an AI agent. The class should extend {@link AiAgent} to\n * gain `.run()` / `.stream()`. `@Agent` also marks the class `@Injectable`, so\n * it participates in DI and can inject its own dependencies.\n *\n * @example\n * ```ts\n * @Agent({\n *   model: 'openai:gpt-4o',\n *   system: 'You are a helpful support assistant.',\n *   tools: [WeatherTools],\n * })\n * export class SupportAgent extends AiAgent {}\n * ```\n */\nexport function Agent(options: AgentOptions = {}): ClassDecorator {\n  return (target) => {\n    Reflect.defineMetadata(AGENT_METADATA, options, target);\n    Injectable()(target);\n  };\n}\n","import { Inject } from '@nestjs/common';\nimport type { AiInput } from '../messages/message.types.js';\nimport { AgentExecutorService } from './agent-executor.service.js';\nimport type { AgentResult, AgentRunOptions } from './agent.interface.js';\n\n/**\n * Base class for `@Agent`-decorated agents. Provides `.run()` and `.stream()`\n * by delegating to the {@link AgentExecutorService}, which is property-injected\n * so subclasses need no constructor boilerplate.\n *\n * @example\n * ```ts\n * @Agent({ model: 'openai:gpt-4o', system: 'You are helpful.' })\n * class ChatAgent extends AiAgent {}\n *\n * // elsewhere\n * const { text } = await chatAgent.run('Hello!');\n * ```\n */\nexport abstract class AiAgent {\n  @Inject(AgentExecutorService)\n  protected readonly executor!: AgentExecutorService;\n\n  /** Runs the agent to completion. */\n  run<T = unknown>(\n    input: AiInput,\n    opts?: AgentRunOptions,\n  ): Promise<AgentResult<T>> {\n    return this.executor.run<T>(this, input, opts);\n  }\n\n  /** Streams the agent's response; await the raw Vercel stream result. */\n  stream(\n    input: AiInput,\n    opts?: AgentRunOptions,\n  ): ReturnType<AgentExecutorService['stream']> {\n    return this.executor.stream(this, input, opts);\n  }\n}\n","import { tool, type Tool as AiTool } from 'ai';\nimport { z } from 'zod';\nimport type { RagService } from './rag.service.js';\n\nexport interface RetrievalToolOptions {\n  /** Tool name exposed to the model (default `\"searchKnowledgeBase\"`). */\n  name?: string;\n  /** Tool description guiding when the model should search. */\n  description?: string;\n  /** Number of chunks to return (default 4). */\n  topK?: number;\n  /** Embedding model id for the query. */\n  model?: string;\n  /** Optional metadata filter applied to every retrieval. */\n  filter?: Record<string, unknown>;\n}\n\n/**\n * Builds a Vercel AI SDK `tool()` that retrieves relevant chunks from a\n * `RagService`, so an agent can ground its answers. Register it by exposing it\n * from a `@Tool`-style provider, or pass its tool set directly to `AiService`.\n *\n * @example\n * ```ts\n * const tool = createRetrievalTool(rag, { topK: 5 });\n * await ai.generateText({ model: 'openai:gpt-4o', tools: { search: tool }, prompt });\n * ```\n */\nexport function createRetrievalTool(\n  rag: RagService,\n  options: RetrievalToolOptions = {},\n): AiTool<{ query: string }, string> {\n  return tool({\n    description:\n      options.description ??\n      'Search the knowledge base for information relevant to the query.',\n    inputSchema: z.object({\n      query: z.string().describe('The search query'),\n    }),\n    execute: async ({ query }) => {\n      const results = await rag.retrieve(query, {\n        topK: options.topK,\n        model: options.model,\n        filter: options.filter,\n      });\n      if (results.length === 0) {\n        return 'No relevant information found.';\n      }\n      return results\n        .map((r, i) => `[${i + 1}] ${r.content}`)\n        .join('\\n\\n');\n    },\n  });\n}\n","import type { AiMessage } from '../../../messages/message.types.js';\nimport type { ConversationStore } from '../../conversation-store.interface.js';\n\n/**\n * Minimal shape of a Prisma model delegate this store needs. Pass your\n * generated delegate (e.g. `prisma.aiMessage`) — no dependency on\n * `@prisma/client` is required by this library.\n *\n * Expected Prisma model:\n * ```prisma\n * model AiMessage {\n *   id             String   @id @default(cuid())\n *   conversationId String\n *   role           String\n *   content        Json\n *   position       Int\n *   createdAt      DateTime @default(now())\n *   @@index([conversationId])\n * }\n * ```\n */\nexport interface PrismaConversationDelegate {\n  findMany(args: {\n    where: { conversationId: string };\n    orderBy: { position: 'asc' | 'desc' };\n  }): Promise<Array<{ role: string; content: unknown }>>;\n  create(args: {\n    data: {\n      conversationId: string;\n      role: string;\n      content: unknown;\n      position: number;\n    };\n  }): Promise<unknown>;\n  count(args: { where: { conversationId: string } }): Promise<number>;\n  deleteMany(args: { where: { conversationId: string } }): Promise<unknown>;\n}\n\n/**\n * Prisma-backed conversation store built on a delegate interface, so it works\n * with any generated Prisma client without a compile-time dependency on it.\n */\nexport class PrismaConversationStore implements ConversationStore {\n  constructor(private readonly delegate: PrismaConversationDelegate) {}\n\n  async load(conversationId: string): Promise<AiMessage[]> {\n    const rows = await this.delegate.findMany({\n      where: { conversationId },\n      orderBy: { position: 'asc' },\n    });\n    return rows.map((row) => ({\n      role: row.role,\n      content: row.content,\n    })) as AiMessage[];\n  }\n\n  async append(\n    conversationId: string,\n    messages: AiMessage[],\n  ): Promise<void> {\n    if (messages.length === 0) {\n      return;\n    }\n    const base = await this.delegate.count({ where: { conversationId } });\n    for (let index = 0; index < messages.length; index++) {\n      const message = messages[index];\n      await this.delegate.create({\n        data: {\n          conversationId,\n          role: message.role,\n          content: message.content,\n          position: base + index,\n        },\n      });\n    }\n  }\n\n  async clear(conversationId: string): Promise<void> {\n    await this.delegate.deleteMany({ where: { conversationId } });\n  }\n}\n","import { Injectable } from '@nestjs/common';\nimport type { AiCache } from './ai-cache.interface.js';\n\ninterface Entry {\n  value: unknown;\n  expiresAt: number | null;\n}\n\n/**\n * Default in-process cache with optional per-entry TTL. Not shared across\n * processes — provide a distributed `AiCache` for production.\n */\n@Injectable()\nexport class InMemoryAiCache implements AiCache {\n  private readonly store = new Map<string, Entry>();\n\n  async get(key: string): Promise<unknown | undefined> {\n    const entry = this.store.get(key);\n    if (!entry) {\n      return undefined;\n    }\n    if (entry.expiresAt !== null && entry.expiresAt <= Date.now()) {\n      this.store.delete(key);\n      return undefined;\n    }\n    return entry.value;\n  }\n\n  async set(key: string, value: unknown, ttlMs?: number): Promise<void> {\n    this.store.set(key, {\n      value,\n      expiresAt: ttlMs != null ? Date.now() + ttlMs : null,\n    });\n  }\n}\n","import { Injectable } from '@nestjs/common';\nimport type {\n  ApprovalContext,\n  ApprovalGate,\n} from './approval-gate.interface.js';\n\n/** Default gate: approves every request. */\n@Injectable()\nexport class AutoApproveGate implements ApprovalGate {\n  async requestApproval(_context: ApprovalContext): Promise<boolean> {\n    return true;\n  }\n}\n\n/** Gate that denies every request (useful to hard-block approval tools). */\n@Injectable()\nexport class DenyApproveGate implements ApprovalGate {\n  async requestApproval(_context: ApprovalContext): Promise<boolean> {\n    return false;\n  }\n}\n","import type { ServerResponse } from 'node:http';\n\n/** Structural type for the pipe methods on a Vercel AI SDK stream result. */\nexport interface PipeableStreamResult {\n  pipeUIMessageStreamToResponse?: (res: ServerResponse) => void;\n  pipeTextStreamToResponse?: (res: ServerResponse) => void;\n}\n\nexport interface PipeAgentStreamOptions {\n  /**\n   * Wire protocol: `'ui'` (AI SDK UI message stream, for `useChat`) or `'text'`\n   * (plain text stream). Defaults to `'ui'`.\n   */\n  protocol?: 'ui' | 'text';\n}\n\n/**\n * Pipes an agent/`AiService` stream result to an HTTP response (Express-style\n * `ServerResponse`). Use in a controller that injected `@Res()`.\n *\n * @example\n * ```ts\n * @Post('chat')\n * async chat(@Body('prompt') prompt: string, @Res() res: Response) {\n *   pipeAgentStream(await this.agent.stream(prompt), res, { protocol: 'ui' });\n * }\n * ```\n */\nexport function pipeAgentStream(\n  result: PipeableStreamResult,\n  res: ServerResponse,\n  options: PipeAgentStreamOptions = {},\n): void {\n  const protocol = options.protocol ?? 'ui';\n  if (protocol === 'text') {\n    if (typeof result.pipeTextStreamToResponse === 'function') {\n      result.pipeTextStreamToResponse(res);\n      return;\n    }\n  } else if (typeof result.pipeUIMessageStreamToResponse === 'function') {\n    result.pipeUIMessageStreamToResponse(res);\n    return;\n  }\n  throw new Error(\n    `The stream result does not support the \"${protocol}\" protocol.`,\n  );\n}\n","import {\n  type CallHandler,\n  type ExecutionContext,\n  Injectable,\n  type NestInterceptor,\n} from '@nestjs/common';\nimport { EMPTY, type Observable, mergeMap } from 'rxjs';\nimport {\n  pipeAgentStream,\n  type PipeableStreamResult,\n  type PipeAgentStreamOptions,\n} from './stream-response.js';\n\n/**\n * Interceptor that pipes a stream result returned by a route handler to the\n * HTTP response. The handler returns the agent `.stream()` promise; Nest\n * resolves it before the interceptor receives and pipes the raw AI SDK result.\n *\n * @example\n * ```ts\n * @UseInterceptors(new AgentStreamInterceptor({ protocol: 'ui' }))\n * @Post('chat')\n * chat(@Body('prompt') prompt: string) {\n *   return this.agent.stream(prompt);\n * }\n * ```\n */\n@Injectable()\nexport class AgentStreamInterceptor implements NestInterceptor {\n  constructor(private readonly options: PipeAgentStreamOptions = {}) {}\n\n  intercept(\n    context: ExecutionContext,\n    next: CallHandler,\n  ): Observable<never> {\n    const res = context.switchToHttp().getResponse<import('node:http').ServerResponse>();\n    return next.handle().pipe(\n      mergeMap((result: PipeableStreamResult) => {\n        pipeAgentStream(result, res, this.options);\n        return EMPTY;\n      }),\n    );\n  }\n}\n","import { Inject, Injectable } from '@nestjs/common';\nimport { AGENT_QUEUE } from '../ai.constants.js';\nimport type { AgentJobData, QueueLike } from './agent-job.types.js';\n\n/** The job name used for queued agent runs. */\nexport const AGENT_JOB_NAME = 'agent-run';\n\n/**\n * Enqueues agent runs onto a BullMQ queue for asynchronous processing. The\n * queue is injected under the `AGENT_QUEUE` token by `AgentJobsModule`.\n */\n@Injectable()\nexport class AgentQueueService {\n  constructor(@Inject(AGENT_QUEUE) private readonly queue: QueueLike) {}\n\n  /** Enqueues an agent run and returns the created job id. */\n  async enqueue(\n    data: AgentJobData,\n    jobOptions?: Record<string, unknown>,\n  ): Promise<string | undefined> {\n    const job = await this.queue.add(AGENT_JOB_NAME, data, jobOptions);\n    return job.id;\n  }\n}\n","import { Injectable } from '@nestjs/common';\nimport { AgentRegistry } from '../agent/orchestration/agent-registry.js';\nimport type { AgentResult } from '../agent/agent.interface.js';\nimport type { AgentJobData } from './agent-job.types.js';\n\n/**\n * Runs a queued agent job by resolving the agent from the {@link AgentRegistry}\n * and invoking its `.run()`. Framework-agnostic: a BullMQ worker simply calls\n * `run(job.data)`.\n */\n@Injectable()\nexport class AgentJobProcessor {\n  constructor(private readonly agents: AgentRegistry) {}\n\n  async run(data: AgentJobData): Promise<AgentResult> {\n    const agent = this.agents.get(data.agent);\n    if (!agent) {\n      throw new Error(\n        `Cannot process job: unknown agent \"${data.agent}\". Is it registered?`,\n      );\n    }\n    return agent.run(data.input, data.options);\n  }\n}\n","import {\n  type DynamicModule,\n  Inject,\n  Injectable,\n  Module,\n  type OnModuleDestroy,\n  type OnModuleInit,\n} from '@nestjs/common';\nimport { AGENT_QUEUE } from '../ai.constants.js';\nimport { AgentQueueService, AGENT_JOB_NAME } from './agent-queue.service.js';\nimport { AgentJobProcessor } from './agent-job.processor.js';\n\nconst AGENT_JOBS_OPTIONS = Symbol('AGENT_JOBS_OPTIONS');\n\nexport interface AgentJobsOptions {\n  /** BullMQ connection (ioredis connection or options). */\n  connection: unknown;\n  /** Queue name (default `\"ai-agent-runs\"`). */\n  queueName?: string;\n  /** Start a worker in this process to consume jobs (default `true`). */\n  runWorker?: boolean;\n}\n\nconst DEFAULT_QUEUE = 'ai-agent-runs';\n\n/** Loads `bullmq` at runtime without a compile-time dependency. */\nasync function loadBullMq(): Promise<any> {\n  const specifier = 'bullmq';\n  return import(specifier);\n}\n\n/**\n * Runs a BullMQ worker that processes queued agent jobs via\n * {@link AgentJobProcessor}. Started on module init, stopped on destroy.\n */\n@Injectable()\nclass AgentWorkerManager implements OnModuleInit, OnModuleDestroy {\n  private worker: { close(): Promise<void> } | undefined;\n\n  constructor(\n    @Inject(AGENT_JOBS_OPTIONS) private readonly options: AgentJobsOptions,\n    private readonly processor: AgentJobProcessor,\n  ) {}\n\n  async onModuleInit(): Promise<void> {\n    if (this.options.runWorker === false) {\n      return;\n    }\n    const { Worker } = await loadBullMq();\n    this.worker = new Worker(\n      this.options.queueName ?? DEFAULT_QUEUE,\n      async (job: { name: string; data: any }) => {\n        if (job.name === AGENT_JOB_NAME) {\n          return this.processor.run(job.data);\n        }\n        return undefined;\n      },\n      { connection: this.options.connection },\n    );\n  }\n\n  async onModuleDestroy(): Promise<void> {\n    await this.worker?.close();\n  }\n}\n\n/**\n * Background-job module for asynchronous agent execution on BullMQ. Import it\n * where you need it (it is separate from the global `AiModule`).\n *\n * @example\n * ```ts\n * AgentJobsModule.forRoot({ connection: { host: 'localhost', port: 6379 } })\n * ```\n * Requires the optional peers `bullmq` (and typically a Redis instance).\n */\n@Module({})\nexport class AgentJobsModule {\n  static forRoot(options: AgentJobsOptions): DynamicModule {\n    return {\n      module: AgentJobsModule,\n      providers: [\n        { provide: AGENT_JOBS_OPTIONS, useValue: options },\n        {\n          provide: AGENT_QUEUE,\n          useFactory: async () => {\n            const { Queue } = await loadBullMq();\n            return new Queue(options.queueName ?? DEFAULT_QUEUE, {\n              connection: options.connection,\n            });\n          },\n        },\n        AgentQueueService,\n        AgentJobProcessor,\n        AgentWorkerManager,\n      ],\n      exports: [AgentQueueService, AgentJobProcessor],\n    };\n  }\n}\n","import type {\n  VectorDocument,\n  VectorQueryOptions,\n  VectorQueryResult,\n  VectorStore,\n} from '../../vector-store.interface.js';\n\n/** Structural interface for a `pg` Pool/Client (only `query` is used). */\nexport interface PgPoolLike {\n  query(\n    sql: string,\n    params?: unknown[],\n  ): Promise<{ rows: Array<Record<string, any>> }>;\n}\n\nexport interface PgVectorStoreOptions {\n  /** Table name (default `\"ai_documents\"`). */\n  table?: string;\n}\n\n/**\n * `VectorStore` backed by Postgres + the `pgvector` extension. Pass a `pg`\n * `Pool` (or any object with a compatible `query`). Expects a table like:\n *\n * ```sql\n * CREATE EXTENSION IF NOT EXISTS vector;\n * CREATE TABLE ai_documents (\n *   id text PRIMARY KEY,\n *   content text NOT NULL,\n *   embedding vector(1536) NOT NULL,\n *   metadata jsonb\n * );\n * CREATE INDEX ON ai_documents USING hnsw (embedding vector_cosine_ops);\n * ```\n */\nexport class PgVectorStore implements VectorStore {\n  private readonly table: string;\n\n  constructor(\n    private readonly pool: PgPoolLike,\n    options: PgVectorStoreOptions = {},\n  ) {\n    this.table = options.table ?? 'ai_documents';\n  }\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. PgVectorStore requires ` +\n            `precomputed embeddings (use RagService.ingest).`,\n        );\n      }\n      await this.pool.query(\n        `INSERT INTO ${this.table} (id, content, embedding, metadata)\n         VALUES ($1, $2, $3, $4)\n         ON CONFLICT (id) DO UPDATE\n         SET content = EXCLUDED.content,\n             embedding = EXCLUDED.embedding,\n             metadata = EXCLUDED.metadata`,\n        [\n          doc.id,\n          doc.content,\n          toVectorLiteral(doc.embedding),\n          doc.metadata ? JSON.stringify(doc.metadata) : null,\n        ],\n      );\n    }\n  }\n\n  async query(\n    embedding: number[],\n    options: VectorQueryOptions = {},\n  ): Promise<VectorQueryResult[]> {\n    const topK = options.topK ?? 4;\n    const vector = toVectorLiteral(embedding);\n    const params: unknown[] = [vector];\n    let where = '';\n    if (options.filter) {\n      params.push(JSON.stringify(options.filter));\n      where = `WHERE metadata @> $${params.length}`;\n    }\n    params.push(topK);\n    const limitParam = `$${params.length}`;\n\n    const { rows } = await this.pool.query(\n      `SELECT id, content, metadata, 1 - (embedding <=> $1) AS score\n       FROM ${this.table}\n       ${where}\n       ORDER BY embedding <=> $1\n       LIMIT ${limitParam}`,\n      params,\n    );\n\n    return rows.map((row) => ({\n      id: row.id,\n      content: row.content,\n      score: Number(row.score),\n      metadata: row.metadata ?? undefined,\n    }));\n  }\n\n  async delete(ids: string[]): Promise<void> {\n    if (ids.length === 0) {\n      return;\n    }\n    await this.pool.query(`DELETE FROM ${this.table} WHERE id = ANY($1)`, [ids]);\n  }\n\n  async clear(): Promise<void> {\n    await this.pool.query(`DELETE FROM ${this.table}`);\n  }\n}\n\n/** Formats an embedding as a pgvector literal, e.g. `[0.1,0.2]`. */\nfunction toVectorLiteral(embedding: number[]): string {\n  return `[${embedding.join(',')}]`;\n}\n","import type { RateLimiter } from './rate-limiter.interface.js';\n\nexport interface InMemoryRateLimiterOptions {\n  /** Maximum tokens in the bucket (burst size). */\n  capacity: number;\n  /** Tokens added per `intervalMs`. */\n  refillTokens: number;\n  /** Refill interval in milliseconds. */\n  intervalMs: number;\n  /** Clock, for testing. Defaults to `Date.now`. */\n  now?: () => number;\n}\n\ninterface Bucket {\n  tokens: number;\n  last: number;\n}\n\n/**\n * In-process token-bucket rate limiter, keyed (e.g. by conversation or user).\n * Not shared across processes — provide a distributed `RateLimiter` for scale.\n */\nexport class InMemoryRateLimiter implements RateLimiter {\n  private readonly buckets = new Map<string, Bucket>();\n  private readonly now: () => number;\n\n  constructor(private readonly options: InMemoryRateLimiterOptions) {\n    this.now = options.now ?? Date.now;\n  }\n\n  async consume(key: string, cost = 1): Promise<boolean> {\n    const now = this.now();\n    const bucket = this.buckets.get(key) ?? {\n      tokens: this.options.capacity,\n      last: now,\n    };\n\n    const elapsed = now - bucket.last;\n    if (elapsed > 0) {\n      const refill =\n        (elapsed / this.options.intervalMs) * this.options.refillTokens;\n      bucket.tokens = Math.min(this.options.capacity, bucket.tokens + refill);\n      bucket.last = now;\n    }\n\n    let allowed = false;\n    if (bucket.tokens >= cost) {\n      bucket.tokens -= cost;\n      allowed = true;\n    }\n    this.buckets.set(key, bucket);\n    return allowed;\n  }\n}\n","import { Injectable, type Type } 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 { AiMessage } from '../messages/message.types.js';\n\n/** Default PII regexes: email, phone, credit card, US SSN. */\nexport const DEFAULT_PII_PATTERNS: RegExp[] = [\n  /[\\w.+-]+@[\\w-]+\\.[\\w.-]+/g,\n  /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n  /\\b(?:\\d[ -]*?){13,16}\\b/g,\n  /(?:\\+?\\d[\\d\\s().-]{7,}\\d)/g,\n];\n\nexport interface PiiRedactionOptions {\n  patterns?: RegExp[];\n  replacement?: string;\n}\n\n/** Redacts PII matches in a string. */\nexport function redactPii(\n  text: string,\n  patterns: RegExp[] = DEFAULT_PII_PATTERNS,\n  replacement = '[REDACTED]',\n): string {\n  let out = text;\n  for (const pattern of patterns) {\n    out = out.replace(pattern, replacement);\n  }\n  return out;\n}\n\n/** Redacts PII in every message's textual content, in place. */\nexport function redactMessages(\n  messages: AiMessage[],\n  patterns: RegExp[] = DEFAULT_PII_PATTERNS,\n  replacement = '[REDACTED]',\n): void {\n  for (const message of messages) {\n    const content = (message as { content: unknown }).content;\n    if (typeof content === 'string') {\n      (message as { content: unknown }).content = redactPii(\n        content,\n        patterns,\n        replacement,\n      );\n    } else if (Array.isArray(content)) {\n      for (const part of content) {\n        if (part && typeof part === 'object' && typeof part.text === 'string') {\n          part.text = redactPii(part.text, patterns, replacement);\n        }\n      }\n    }\n  }\n}\n\n/**\n * Guardrail that redacts PII in the messages sent to the model (default\n * patterns). For custom patterns use {@link createPiiRedactionGuardrail}.\n */\n@Guardrail()\n@Injectable()\nexport class PiiRedactionGuardrail implements GuardrailContract {\n  beforeRun(ctx: GuardrailContext): void {\n    redactMessages(ctx.messages);\n  }\n}\n\n/** Builds a configured PII-redaction guardrail class (discoverable via DI). */\nexport function createPiiRedactionGuardrail(\n  options: PiiRedactionOptions = {},\n): Type<GuardrailContract> {\n  const patterns = options.patterns ?? DEFAULT_PII_PATTERNS;\n  const replacement = options.replacement ?? '[REDACTED]';\n\n  @Guardrail()\n  @Injectable()\n  class ConfiguredPiiRedaction implements GuardrailContract {\n    beforeRun(ctx: GuardrailContext): void {\n      redactMessages(ctx.messages, patterns, replacement);\n    }\n  }\n  return ConfiguredPiiRedaction;\n}\n","import { Injectable, type Type } 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 { AiMessage } from '../messages/message.types.js';\n\n/** Thrown when moderation blocks content. */\nexport class ContentBlockedError extends Error {\n  constructor(public readonly reason: string) {\n    super(`Content blocked by moderation: ${reason}`);\n    this.name = 'ContentBlockedError';\n  }\n}\n\nexport interface ModerationOptions {\n  /** Case-insensitive terms that block a run when present. */\n  blocked?: string[];\n  /**\n   * Optional async check returning `true` to block. Runs in addition to the\n   * deny-list (e.g. call a provider moderation endpoint).\n   */\n  moderate?: (text: string) => boolean | Promise<boolean>;\n}\n\n/** Concatenates the textual content of messages. */\nexport function messagesText(messages: AiMessage[]): string {\n  return messages\n    .map((m) => {\n      const content = (m as { content: unknown }).content;\n      if (typeof content === 'string') {\n        return content;\n      }\n      if (Array.isArray(content)) {\n        return content\n          .map((p) => (p && typeof p.text === 'string' ? p.text : ''))\n          .join(' ');\n      }\n      return '';\n    })\n    .join('\\n');\n}\n\n/**\n * Builds a moderation guardrail that blocks runs whose input contains a\n * deny-listed term or fails a custom `moderate` check.\n */\nexport function createModerationGuardrail(\n  options: ModerationOptions = {},\n): Type<GuardrailContract> {\n  const blocked = (options.blocked ?? []).map((t) => t.toLowerCase());\n  const moderate = options.moderate;\n\n  @Guardrail()\n  @Injectable()\n  class ConfiguredModeration implements GuardrailContract {\n    async beforeRun(ctx: GuardrailContext): Promise<void> {\n      const text = messagesText(ctx.messages);\n      const lower = text.toLowerCase();\n      const hit = blocked.find((term) => lower.includes(term));\n      if (hit) {\n        throw new ContentBlockedError(`matched blocked term \"${hit}\"`);\n      }\n      if (moderate && (await moderate(text))) {\n        throw new ContentBlockedError('failed custom moderation');\n      }\n    }\n  }\n  return ConfiguredModeration;\n}\n","import { Injectable } from '@nestjs/common';\nimport { rerank } from 'ai';\nimport { ProviderRegistry } from '../../core/provider-registry.js';\nimport type { VectorQueryResult } from '../vector-store.interface.js';\nimport type { Reranker } from './reranker.interface.js';\n\n/**\n * Reranker backed by a provider reranking model via the AI SDK's `rerank()`.\n * Requires a rerank-capable provider (e.g. `@ai-sdk/cohere`) configured through\n * `rerankingModel`.\n */\n@Injectable()\nexport class ModelReranker implements Reranker {\n  constructor(\n    private readonly providers: ProviderRegistry,\n    private readonly model?: string,\n  ) {}\n\n  async rerank(\n    query: string,\n    results: VectorQueryResult[],\n    topN: number,\n  ): Promise<VectorQueryResult[]> {\n    if (results.length === 0) {\n      return [];\n    }\n    const { ranking } = await rerank({\n      model: this.providers.getRerankingModel(this.model),\n      query,\n      documents: results.map((r) => r.content),\n      topN,\n    });\n    return ranking.map((entry) => ({\n      ...results[entry.originalIndex],\n      score: entry.score,\n    }));\n  }\n}\n","import type {\n  VectorDocument,\n  VectorQueryOptions,\n  VectorQueryResult,\n  VectorStore,\n} from '../../vector-store.interface.js';\n\n/** Structural subset of the Qdrant JS client we use. */\nexport interface QdrantClientLike {\n  upsert(collection: string, params: unknown): Promise<unknown>;\n  search(\n    collection: string,\n    params: unknown,\n  ): Promise<Array<{ id: string | number; score: number; payload?: any }>>;\n  delete(collection: string, params: unknown): Promise<unknown>;\n}\n\nexport interface QdrantVectorStoreOptions {\n  collection: string;\n}\n\n/**\n * `VectorStore` backed by Qdrant. Pass a `@qdrant/js-client-rest` `QdrantClient`\n * (or a compatible object). The payload stores `content` alongside metadata.\n */\nexport class QdrantVectorStore implements VectorStore {\n  constructor(\n    private readonly client: QdrantClientLike,\n    private readonly options: QdrantVectorStoreOptions,\n  ) {}\n\n  async upsert(documents: VectorDocument[]): Promise<void> {\n    await this.client.upsert(this.options.collection, {\n      wait: true,\n      points: documents.map((doc) => {\n        if (!doc.embedding) {\n          throw new Error(`Document \"${doc.id}\" has no embedding.`);\n        }\n        return {\n          id: doc.id,\n          vector: doc.embedding,\n          payload: { content: doc.content, ...doc.metadata },\n        };\n      }),\n    });\n  }\n\n  async query(\n    embedding: number[],\n    options: VectorQueryOptions = {},\n  ): Promise<VectorQueryResult[]> {\n    const results = await this.client.search(this.options.collection, {\n      vector: embedding,\n      limit: options.topK ?? 4,\n      with_payload: true,\n      filter: buildFilter(options.filter),\n    });\n    return results.map((hit) => {\n      const { content, ...metadata } = hit.payload ?? {};\n      return {\n        id: String(hit.id),\n        content: String(content ?? ''),\n        score: hit.score,\n        metadata: Object.keys(metadata).length ? metadata : undefined,\n      };\n    });\n  }\n\n  async delete(ids: string[]): Promise<void> {\n    await this.client.delete(this.options.collection, { points: ids });\n  }\n\n  async clear(): Promise<void> {\n    await this.client.delete(this.options.collection, { filter: {} });\n  }\n}\n\nfunction buildFilter(filter?: Record<string, unknown>) {\n  if (!filter || Object.keys(filter).length === 0) {\n    return undefined;\n  }\n  return {\n    must: Object.entries(filter).map(([key, value]) => ({\n      key,\n      match: { value },\n    })),\n  };\n}\n","import type {\n  VectorDocument,\n  VectorQueryOptions,\n  VectorQueryResult,\n  VectorStore,\n} from '../../vector-store.interface.js';\n\n/** Structural subset of a Pinecone index (namespace) we use. */\nexport interface PineconeIndexLike {\n  upsert(\n    vectors: Array<{ id: string; values: number[]; metadata?: any }>,\n  ): Promise<unknown>;\n  query(params: {\n    vector: number[];\n    topK: number;\n    includeMetadata?: boolean;\n    filter?: Record<string, unknown>;\n  }): Promise<{ matches?: Array<{ id: string; score?: number; metadata?: any }> }>;\n  deleteMany(ids: string[]): Promise<unknown>;\n  deleteAll(): Promise<unknown>;\n}\n\n/**\n * `VectorStore` backed by Pinecone. Pass a Pinecone index (optionally scoped to\n * a namespace): `pinecone.index('name').namespace('ns')`. `content` is stored in\n * the vector metadata.\n */\nexport class PineconeVectorStore implements VectorStore {\n  constructor(private readonly index: PineconeIndexLike) {}\n\n  async upsert(documents: VectorDocument[]): Promise<void> {\n    await this.index.upsert(\n      documents.map((doc) => {\n        if (!doc.embedding) {\n          throw new Error(`Document \"${doc.id}\" has no embedding.`);\n        }\n        return {\n          id: doc.id,\n          values: doc.embedding,\n          metadata: { content: doc.content, ...doc.metadata },\n        };\n      }),\n    );\n  }\n\n  async query(\n    embedding: number[],\n    options: VectorQueryOptions = {},\n  ): Promise<VectorQueryResult[]> {\n    const { matches } = await this.index.query({\n      vector: embedding,\n      topK: options.topK ?? 4,\n      includeMetadata: true,\n      filter: options.filter,\n    });\n    return (matches ?? []).map((match) => {\n      const { content, ...metadata } = match.metadata ?? {};\n      return {\n        id: match.id,\n        content: String(content ?? ''),\n        score: match.score ?? 0,\n        metadata: Object.keys(metadata).length ? metadata : undefined,\n      };\n    });\n  }\n\n  async delete(ids: string[]): Promise<void> {\n    await this.index.deleteMany(ids);\n  }\n\n  async clear(): Promise<void> {\n    await this.index.deleteAll();\n  }\n}\n","/** Minimal socket shape (compatible with socket.io's `Socket`). */\nexport interface SocketLike {\n  emit(event: string, payload?: unknown): void;\n}\n\n/** A stream result exposing a text stream (from agent `.stream()`). */\nexport interface TextStreamLike {\n  textStream: AsyncIterable<string>;\n}\n\nexport interface StreamToSocketOptions {\n  chunkEvent?: string;\n  doneEvent?: string;\n  errorEvent?: string;\n}\n\n/**\n * Forwards an agent text stream to a socket: emits `chunkEvent` per delta, then\n * `doneEvent` with the full text; emits `errorEvent` and rethrows on failure.\n * Framework-agnostic — the WebSocket gateway is thin glue over this.\n */\nexport async function streamAgentToSocket(\n  stream: TextStreamLike,\n  socket: SocketLike,\n  options: StreamToSocketOptions = {},\n): Promise<string> {\n  const chunkEvent = options.chunkEvent ?? 'agent:chunk';\n  const doneEvent = options.doneEvent ?? 'agent:done';\n  const errorEvent = options.errorEvent ?? 'agent:error';\n\n  try {\n    let text = '';\n    for await (const delta of stream.textStream) {\n      text += delta;\n      socket.emit(chunkEvent, { delta });\n    }\n    socket.emit(doneEvent, { text });\n    return text;\n  } catch (error) {\n    socket.emit(errorEvent, {\n      message: error instanceof Error ? error.message : String(error),\n    });\n    throw error;\n  }\n}\n"]}