{"version":3,"sources":["../src/ai.constants.ts","../src/agent/orchestration/agent-registry.ts","../src/websocket/stream-to-socket.ts","../src/websocket/agent.gateway.ts"],"names":["AGENT_METADATA","AgentRegistry","agents","Map","discovery","onModuleInit","wrapper","getProviders","instance","ctor","Reflect","getMetadata","set","name","target","get","getByClass","all","values","streamAgentToSocket","stream","socket","options","chunkEvent","doneEvent","errorEvent","text","delta","textStream","emit","error","message","Error","String","AgentGateway","run","client","agent","input"],"mappings":"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","file":"websocket.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 { 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","/** 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","import {\n  ConnectedSocket,\n  MessageBody,\n  SubscribeMessage,\n  WebSocketGateway,\n} from '@nestjs/websockets';\nimport { AgentRegistry } from '../agent/orchestration/agent-registry.js';\nimport {\n  streamAgentToSocket,\n  type SocketLike,\n} from './stream-to-socket.js';\n\n/** Payload for the `agent:run` message. */\nexport interface AgentRunMessage {\n  agent: string;\n  input: string;\n}\n\n/**\n * WebSocket gateway that streams agent responses over socket.io. Client emits\n * `agent:run { agent, input }`; the server streams `agent:chunk { delta }` then\n * `agent:done { text }`. Requires the optional peers `@nestjs/websockets`,\n * `@nestjs/platform-socket.io`, and `socket.io`.\n *\n * Published under `@mgvdev/nestjs-ai/websocket`.\n */\n@WebSocketGateway()\nexport class AgentGateway {\n  constructor(private readonly agents: AgentRegistry) {}\n\n  @SubscribeMessage('agent:run')\n  async run(\n    @MessageBody() message: AgentRunMessage,\n    @ConnectedSocket() client: SocketLike,\n  ): Promise<void> {\n    const agent = this.agents.get(message.agent);\n    if (!agent) {\n      client.emit('agent:error', {\n        message: `Unknown agent \"${message.agent}\".`,\n      });\n      return;\n    }\n    await streamAgentToSocket(await agent.stream(message.input), client);\n  }\n}\n"]}