{"version":3,"file":"agui-handler.cjs","names":[],"sources":["../src/agui-handler.ts"],"sourcesContent":["// ─── AG-UI Handler ───────────────────────────────────────────────────────────\n//\n// Matching functions, event builders, and SSE writer for AG-UI protocol.\n\nimport * as http from \"node:http\";\nimport { randomUUID } from \"node:crypto\";\n\nimport type { Logger } from \"./logger.js\";\nimport type {\n  AGUIRunAgentInput,\n  AGUIFixtureMatch,\n  AGUIFixture,\n  AGUIEvent,\n  AGUIMessage,\n  AGUIRunStartedEvent,\n  AGUIRunFinishedEvent,\n  AGUIRunFinishedOutcome,\n  AGUIRunErrorEvent,\n  AGUITextMessageStartEvent,\n  AGUITextMessageContentEvent,\n  AGUITextMessageEndEvent,\n  AGUITextMessageChunkEvent,\n  AGUIToolCallStartEvent,\n  AGUIToolCallArgsEvent,\n  AGUIToolCallEndEvent,\n  AGUIToolCallChunkEvent,\n  AGUIToolCallResultEvent,\n  AGUIStateSnapshotEvent,\n  AGUIStateDeltaEvent,\n  AGUIMessagesSnapshotEvent,\n  AGUIStepStartedEvent,\n  AGUIStepFinishedEvent,\n  AGUIReasoningStartEvent,\n  AGUIReasoningMessageStartEvent,\n  AGUIReasoningMessageContentEvent,\n  AGUIReasoningMessageEndEvent,\n  AGUIReasoningMessageChunkEvent,\n  AGUIReasoningEndEvent,\n  AGUIReasoningEncryptedValueEvent,\n  AGUIReasoningEncryptedValueSubtype,\n  AGUIActivitySnapshotEvent,\n  AGUIActivityDeltaEvent,\n  AGUIRawEvent,\n  AGUICustomEvent,\n} from \"./agui-types.js\";\n\n// ─── Matching functions ──────────────────────────────────────────────────────\n\n/**\n * Extract the content of the last message with role \"user\" from the input.\n * Walks structured content arrays (e.g. `[{type:\"text\", text:\"...\"}, {type:\"document\", ...}]`)\n * and joins their text parts. Returns `\"\"` when no user message is present or has no text.\n */\nexport function extractLastUserMessage(input: AGUIRunAgentInput): string {\n  if (!input.messages || input.messages.length === 0) return \"\";\n  for (let i = input.messages.length - 1; i >= 0; i--) {\n    const msg = input.messages[i];\n    if (msg.role !== \"user\") continue;\n    const text = extractTextFromContent(msg.content);\n    if (text) return text;\n  }\n  return \"\";\n}\n\nfunction extractTextFromContent(content: AGUIMessage[\"content\"]): string {\n  if (typeof content === \"string\") return content;\n  if (!Array.isArray(content)) return \"\";\n  const parts: string[] = [];\n  for (const part of content) {\n    if (\n      part &&\n      typeof part === \"object\" &&\n      part.type === \"text\" &&\n      typeof part.text === \"string\" &&\n      part.text\n    ) {\n      parts.push(part.text);\n    }\n  }\n  return parts.join(\" \").trim();\n}\n\n/**\n * Return the absolute last message if it has role \"tool\", otherwise null.\n */\nexport function getLastMessageIfToolResult(input: AGUIRunAgentInput): AGUIMessage | null {\n  if (!input.messages || input.messages.length === 0) return null;\n  const last = input.messages[input.messages.length - 1];\n  return last.role === \"tool\" ? last : null;\n}\n\n/**\n * Check whether an input matches a fixture's match criteria.\n * All specified criteria must pass (AND logic).\n */\nexport function matchesFixture(input: AGUIRunAgentInput, match: AGUIFixtureMatch): boolean {\n  if (match.message !== undefined) {\n    const text = extractLastUserMessage(input);\n    if (typeof match.message === \"string\") {\n      if (!text.includes(match.message)) return false;\n    } else {\n      match.message.lastIndex = 0;\n      if (!match.message.test(text)) return false;\n    }\n  }\n\n  if (match.toolCallId !== undefined) {\n    const lastMsg = input.messages?.[input.messages.length - 1];\n    if (!lastMsg || lastMsg.role !== \"tool\" || lastMsg.toolCallId !== match.toolCallId) {\n      return false;\n    }\n  }\n\n  if (match.toolName !== undefined) {\n    const tools = input.tools ?? [];\n    if (!tools.some((t) => t.name === match.toolName)) return false;\n  }\n\n  if (match.stateKey !== undefined) {\n    if (\n      input.state === null ||\n      input.state === undefined ||\n      typeof input.state !== \"object\" ||\n      !(match.stateKey in (input.state as Record<string, unknown>))\n    ) {\n      return false;\n    }\n  }\n\n  if (match.predicate !== undefined) {\n    if (!match.predicate(input)) return false;\n  }\n\n  return true;\n}\n\n/**\n * Find the first fixture whose match criteria pass for the given input.\n */\nexport function findFixture(input: AGUIRunAgentInput, fixtures: AGUIFixture[]): AGUIFixture | null {\n  for (const fixture of fixtures) {\n    if (matchesFixture(input, fixture.match)) {\n      return fixture;\n    }\n  }\n  return null;\n}\n\n// ─── Builder options ─────────────────────────────────────────────────────────\n\nexport interface AGUIBuildOpts {\n  threadId?: string;\n  runId?: string;\n  parentRunId?: string;\n  /** For tool call builder: include a result event */\n  result?: string;\n}\n\n// ─── Event builders ──────────────────────────────────────────────────────────\n\nfunction makeRunStarted(opts?: AGUIBuildOpts): AGUIRunStartedEvent {\n  return {\n    type: \"RUN_STARTED\",\n    threadId: opts?.threadId ?? randomUUID(),\n    runId: opts?.runId ?? randomUUID(),\n    ...(opts?.parentRunId ? { parentRunId: opts.parentRunId } : {}),\n  };\n}\n\nfunction makeRunFinished(\n  started: AGUIRunStartedEvent,\n  finishOpts?: { outcome?: AGUIRunFinishedOutcome; result?: unknown },\n): AGUIRunFinishedEvent {\n  return {\n    type: \"RUN_FINISHED\",\n    threadId: started.threadId,\n    runId: started.runId,\n    ...(finishOpts?.result !== undefined ? { result: finishOpts.result } : {}),\n    ...(finishOpts?.outcome !== undefined ? { outcome: finishOpts.outcome } : {}),\n  };\n}\n\n/**\n * Build a complete text message response sequence.\n * [RUN_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT, TEXT_MESSAGE_END, RUN_FINISHED]\n */\nexport function buildTextResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  const messageId = randomUUID();\n  return [\n    started,\n    {\n      type: \"TEXT_MESSAGE_START\",\n      messageId,\n      role: \"assistant\",\n    } as AGUITextMessageStartEvent,\n    {\n      type: \"TEXT_MESSAGE_CONTENT\",\n      messageId,\n      delta: text,\n    } as AGUITextMessageContentEvent,\n    {\n      type: \"TEXT_MESSAGE_END\",\n      messageId,\n    } as AGUITextMessageEndEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a text chunk response (single chunk, no start/end envelope).\n * [RUN_STARTED, TEXT_MESSAGE_CHUNK, RUN_FINISHED]\n */\nexport function buildTextChunkResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"TEXT_MESSAGE_CHUNK\",\n      messageId: randomUUID(),\n      role: \"assistant\",\n      delta: text,\n    } as AGUITextMessageChunkEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a tool call response sequence.\n * [RUN_STARTED, TOOL_CALL_START, TOOL_CALL_ARGS, TOOL_CALL_END, (TOOL_CALL_RESULT)?, RUN_FINISHED]\n */\nexport function buildToolCallResponse(\n  toolName: string,\n  args: string,\n  opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  const toolCallId = randomUUID();\n  const events: AGUIEvent[] = [\n    started,\n    {\n      type: \"TOOL_CALL_START\",\n      toolCallId,\n      toolCallName: toolName,\n    } as AGUIToolCallStartEvent,\n    {\n      type: \"TOOL_CALL_ARGS\",\n      toolCallId,\n      delta: args,\n    } as AGUIToolCallArgsEvent,\n    {\n      type: \"TOOL_CALL_END\",\n      toolCallId,\n    } as AGUIToolCallEndEvent,\n  ];\n\n  if (opts?.result !== undefined) {\n    events.push({\n      type: \"TOOL_CALL_RESULT\",\n      messageId: randomUUID(),\n      toolCallId,\n      content: opts.result,\n      role: \"tool\",\n    } as AGUIToolCallResultEvent);\n  }\n\n  events.push(makeRunFinished(started));\n  return events;\n}\n\n/**\n * Build a state snapshot response.\n * [RUN_STARTED, STATE_SNAPSHOT, RUN_FINISHED]\n */\nexport function buildStateUpdate(snapshot: unknown, opts?: AGUIBuildOpts): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"STATE_SNAPSHOT\",\n      snapshot,\n    } as AGUIStateSnapshotEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a state delta response (JSON Patch).\n * [RUN_STARTED, STATE_DELTA, RUN_FINISHED]\n */\nexport function buildStateDelta(patches: unknown[], opts?: AGUIBuildOpts): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"STATE_DELTA\",\n      delta: patches,\n    } as AGUIStateDeltaEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a messages snapshot response.\n * [RUN_STARTED, MESSAGES_SNAPSHOT, RUN_FINISHED]\n */\nexport function buildMessagesSnapshot(messages: AGUIMessage[], opts?: AGUIBuildOpts): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"MESSAGES_SNAPSHOT\",\n      messages,\n    } as AGUIMessagesSnapshotEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a reasoning response sequence.\n * [RUN_STARTED, REASONING_START, REASONING_MESSAGE_START, REASONING_MESSAGE_CONTENT,\n *  REASONING_MESSAGE_END, REASONING_END, RUN_FINISHED]\n */\nexport function buildReasoningResponse(text: string, opts?: AGUIBuildOpts): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  const messageId = randomUUID();\n  return [\n    started,\n    {\n      type: \"REASONING_START\",\n      messageId,\n    } as AGUIReasoningStartEvent,\n    {\n      type: \"REASONING_MESSAGE_START\",\n      messageId,\n      role: \"reasoning\",\n    } as AGUIReasoningMessageStartEvent,\n    {\n      type: \"REASONING_MESSAGE_CONTENT\",\n      messageId,\n      delta: text,\n    } as AGUIReasoningMessageContentEvent,\n    {\n      type: \"REASONING_MESSAGE_END\",\n      messageId,\n    } as AGUIReasoningMessageEndEvent,\n    {\n      type: \"REASONING_END\",\n      messageId,\n    } as AGUIReasoningEndEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build an activity snapshot response.\n * [RUN_STARTED, ACTIVITY_SNAPSHOT, RUN_FINISHED]\n */\nexport function buildActivityResponse(\n  messageId: string,\n  activityType: string,\n  content: Record<string, unknown>,\n  opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"ACTIVITY_SNAPSHOT\",\n      messageId,\n      activityType,\n      content,\n      replace: true,\n    } as AGUIActivitySnapshotEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build an error response.\n * [RUN_STARTED, RUN_ERROR] (no RUN_FINISHED — the run errored)\n */\nexport function buildErrorResponse(\n  message: string,\n  code?: string,\n  opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"RUN_ERROR\",\n      message,\n      ...(code !== undefined ? { code } : {}),\n    } as AGUIRunErrorEvent,\n  ];\n}\n\n/**\n * Build a step-wrapped text response.\n * [RUN_STARTED, STEP_STARTED, TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT,\n *  TEXT_MESSAGE_END, STEP_FINISHED, RUN_FINISHED]\n */\nexport function buildStepWithText(\n  stepName: string,\n  text: string,\n  opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  const messageId = randomUUID();\n  return [\n    started,\n    {\n      type: \"STEP_STARTED\",\n      stepName,\n    } as AGUIStepStartedEvent,\n    {\n      type: \"TEXT_MESSAGE_START\",\n      messageId,\n      role: \"assistant\",\n    } as AGUITextMessageStartEvent,\n    {\n      type: \"TEXT_MESSAGE_CONTENT\",\n      messageId,\n      delta: text,\n    } as AGUITextMessageContentEvent,\n    {\n      type: \"TEXT_MESSAGE_END\",\n      messageId,\n    } as AGUITextMessageEndEvent,\n    {\n      type: \"STEP_FINISHED\",\n      stepName,\n    } as AGUIStepFinishedEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Combine multiple builder outputs into a single run.\n * Strips RUN_STARTED/RUN_FINISHED from each input, wraps all inner events\n * in one RUN_STARTED...RUN_FINISHED pair.\n */\nexport function buildCompositeResponse(\n  builderOutputs: AGUIEvent[][],\n  opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  const inner: AGUIEvent[] = [];\n\n  for (const events of builderOutputs) {\n    for (const event of events) {\n      if (event.type !== \"RUN_STARTED\" && event.type !== \"RUN_FINISHED\") {\n        inner.push(event);\n      }\n    }\n  }\n\n  const hasError = inner.some((e) => e.type === \"RUN_ERROR\");\n  return [started, ...inner, ...(hasError ? [] : [makeRunFinished(started)])];\n}\n\n// ─── Convenience event builders ─────────────────────────────────────────────\n\n/**\n * Build an activity delta response (JSON Patch on an activity).\n * [RUN_STARTED, ACTIVITY_DELTA, RUN_FINISHED]\n */\nexport function buildActivityDelta(\n  messageId: string,\n  activityType: string,\n  patch: unknown[],\n  opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"ACTIVITY_DELTA\",\n      messageId,\n      activityType,\n      patch,\n    } as AGUIActivityDeltaEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a tool call chunk response (single chunk, no start/end envelope).\n * [RUN_STARTED, TOOL_CALL_CHUNK, RUN_FINISHED]\n */\nexport function buildToolCallChunk(\n  delta: string,\n  opts?: AGUIBuildOpts & {\n    toolCallId?: string;\n    toolCallName?: string;\n    parentMessageId?: string;\n  },\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"TOOL_CALL_CHUNK\",\n      ...(opts?.toolCallId !== undefined ? { toolCallId: opts.toolCallId } : {}),\n      ...(opts?.toolCallName !== undefined ? { toolCallName: opts.toolCallName } : {}),\n      ...(opts?.parentMessageId !== undefined ? { parentMessageId: opts.parentMessageId } : {}),\n      delta,\n    } as AGUIToolCallChunkEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a raw event response.\n * [RUN_STARTED, RAW, RUN_FINISHED]\n */\nexport function buildRawEvent(event: unknown, source?: string, opts?: AGUIBuildOpts): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"RAW\",\n      event,\n      ...(source !== undefined ? { source } : {}),\n    } as AGUIRawEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a custom event response.\n * [RUN_STARTED, CUSTOM, RUN_FINISHED]\n */\nexport function buildCustomEvent(name: string, value: unknown, opts?: AGUIBuildOpts): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"CUSTOM\",\n      name,\n      value,\n    } as AGUICustomEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a reasoning message chunk response (single chunk, no start/end envelope).\n * [RUN_STARTED, REASONING_MESSAGE_CHUNK, RUN_FINISHED]\n */\nexport function buildReasoningChunk(\n  delta: string,\n  opts?: AGUIBuildOpts & { messageId?: string },\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"REASONING_MESSAGE_CHUNK\",\n      ...(opts?.messageId !== undefined ? { messageId: opts.messageId } : {}),\n      delta,\n    } as AGUIReasoningMessageChunkEvent,\n    makeRunFinished(started),\n  ];\n}\n\n/**\n * Build a reasoning encrypted value event response.\n * [RUN_STARTED, REASONING_ENCRYPTED_VALUE, RUN_FINISHED]\n */\nexport function buildReasoningEncryptedValue(\n  subtype: AGUIReasoningEncryptedValueSubtype,\n  entityId: string,\n  encryptedValue: string,\n  opts?: AGUIBuildOpts,\n): AGUIEvent[] {\n  const started = makeRunStarted(opts);\n  return [\n    started,\n    {\n      type: \"REASONING_ENCRYPTED_VALUE\",\n      subtype,\n      entityId,\n      encryptedValue,\n    } as AGUIReasoningEncryptedValueEvent,\n    makeRunFinished(started),\n  ];\n}\n\n// ─── SSE writer ──────────────────────────────────────────────────────────────\n\n/**\n * Write AG-UI events as an SSE stream to an HTTP response.\n * Sets appropriate headers, serializes each event as `data: {...}\\n\\n`,\n * and optionally delays between events.\n */\nexport async function writeAGUIEventStream(\n  res: http.ServerResponse,\n  events: AGUIEvent[],\n  opts?: { delayMs?: number; signal?: AbortSignal; logger?: Logger },\n): Promise<void> {\n  const delayMs = opts?.delayMs ?? 0;\n\n  res.writeHead(200, {\n    \"Content-Type\": \"text/event-stream\",\n    \"Cache-Control\": \"no-cache\",\n    Connection: \"keep-alive\",\n  });\n\n  for (const event of events) {\n    if (opts?.signal?.aborted) break;\n    if (res.socket?.destroyed) break;\n\n    const stamped = { ...event, timestamp: event.timestamp ?? Date.now() };\n    try {\n      res.write(`data: ${JSON.stringify(stamped)}\\n\\n`);\n    } catch (err) {\n      if (err instanceof TypeError || err instanceof RangeError) {\n        const msg = (err as Error).message;\n        if (opts?.logger) {\n          opts.logger.warn(\"AG-UI SSE write failed (serialization):\", msg);\n        } else {\n          console.warn(\"AG-UI SSE write failed (serialization):\", msg);\n        }\n      } else if (err instanceof Error) {\n        if (opts?.logger) {\n          opts.logger.warn(\"AG-UI SSE write failed:\", err.message);\n        } else {\n          console.warn(\"AG-UI SSE write failed:\", err.message);\n        }\n      } else {\n        const msg = String(err);\n        if (opts?.logger) {\n          opts.logger.warn(\"AG-UI SSE write failed:\", msg);\n        } else {\n          console.warn(\"AG-UI SSE write failed:\", msg);\n        }\n      }\n      break;\n    }\n\n    if (delayMs > 0) {\n      await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n    }\n  }\n\n  if (!res.writableEnded) res.end();\n}\n"],"mappings":"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"}