{"version":3,"sources":["../src/providers/custom.ts","../src/providers/openai.ts","../src/providers/promptrails.ts","../src/providers/promptrails-browser.ts"],"names":["parseSSEStream","PromptRails","generateId","createBrowserChatRuntime","BrowserChatError"],"mappings":"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","file":"chunk-7IV2TWF7.cjs","sourcesContent":["import { parseSSEStream } from \"../core/utils\";\nimport type { StreamEvent } from \"../types\";\nimport type { ChatProvider, SendMessageParams, SendMessageResult } from \"./types\";\n\nexport interface CustomProviderConfig {\n  /** The URL to POST messages to. */\n  sendUrl: string;\n  /** Optional separate URL for streaming. Falls back to sendUrl with stream param. */\n  streamUrl?: string;\n  /** Additional headers to include in requests. */\n  headers?: Record<string, string>;\n  /** Transport mode for streaming. Defaults to \"sse\". */\n  transport?: \"sse\" | \"websocket\";\n  /**\n   * Parse the response body into a SendMessageResult.\n   * Defaults to extracting `{ message, executionId }` from JSON.\n   */\n  parseResponse?: (body: unknown) => SendMessageResult;\n  /**\n   * Build the request body from params.\n   * Defaults to `{ content, sessionId, metadata }`.\n   */\n  buildRequestBody?: (params: SendMessageParams) => unknown;\n}\n\nexport function createCustomProvider(config: CustomProviderConfig): ChatProvider {\n  const {\n    sendUrl,\n    streamUrl,\n    headers: customHeaders = {},\n    transport = \"sse\",\n    parseResponse,\n    buildRequestBody,\n  } = config;\n\n  const defaultHeaders: Record<string, string> = {\n    \"Content-Type\": \"application/json\",\n    ...customHeaders,\n  };\n\n  function buildBody(params: SendMessageParams): string {\n    if (buildRequestBody) {\n      return JSON.stringify(buildRequestBody(params));\n    }\n    return JSON.stringify({\n      content: params.content,\n      session_id: params.sessionId,\n      metadata: params.metadata,\n    });\n  }\n\n  const provider: ChatProvider = {\n    async sendMessage(params: SendMessageParams): Promise<SendMessageResult> {\n      const response = await fetch(sendUrl, {\n        method: \"POST\",\n        headers: defaultHeaders,\n        body: buildBody(params),\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}`);\n      }\n\n      const data = await response.json();\n\n      if (parseResponse) {\n        return parseResponse(data);\n      }\n\n      return {\n        message: {\n          id: data.id || data.message?.id || crypto.randomUUID(),\n          role: \"assistant\",\n          content: data.content || data.message?.content || JSON.stringify(data),\n          status: \"complete\",\n          createdAt: new Date(),\n        },\n        executionId: data.execution_id || data.executionId,\n      };\n    },\n\n    async *sendMessageStream(\n      params: SendMessageParams,\n      signal?: AbortSignal,\n    ): AsyncGenerator<StreamEvent> {\n      const url = streamUrl || sendUrl;\n\n      if (transport === \"websocket\") {\n        yield* streamViaWebSocket(url, params, signal);\n        return;\n      }\n\n      // SSE transport\n      const response = await fetch(url, {\n        method: \"POST\",\n        headers: {\n          ...defaultHeaders,\n          Accept: \"text/event-stream\",\n        },\n        body: buildBody(params),\n        signal,\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}`);\n      }\n\n      yield* parseSSEStream(response, signal);\n    },\n  };\n\n  return provider;\n}\n\nasync function* streamViaWebSocket(\n  url: string,\n  params: SendMessageParams,\n  signal?: AbortSignal,\n): AsyncGenerator<StreamEvent> {\n  const wsUrl = url.replace(/^http/, \"ws\");\n  const ws = new WebSocket(wsUrl);\n\n  const events: StreamEvent[] = [];\n  let resolve: (() => void) | null = null;\n  let done = false;\n  let wsError: string | null = null;\n\n  ws.onopen = () => {\n    ws.send(\n      JSON.stringify({\n        content: params.content,\n        session_id: params.sessionId,\n        metadata: params.metadata,\n      }),\n    );\n  };\n\n  ws.onmessage = (event) => {\n    try {\n      const data = JSON.parse(event.data);\n      const streamEvent: StreamEvent = data.type ? data : { type: \"content\", content: event.data };\n      events.push(streamEvent);\n      resolve?.();\n    } catch {\n      events.push({ type: \"content\", content: event.data });\n      resolve?.();\n    }\n  };\n\n  ws.onerror = () => {\n    wsError = \"WebSocket error\";\n    resolve?.();\n  };\n\n  ws.onclose = () => {\n    done = true;\n    resolve?.();\n  };\n\n  signal?.addEventListener(\"abort\", () => {\n    ws.close();\n  });\n\n  try {\n    while (!done && !wsError) {\n      if (events.length === 0) {\n        await new Promise<void>((r) => {\n          resolve = r;\n        });\n      }\n\n      while (events.length > 0) {\n        const event = events.shift()!;\n        if (event.type === \"done\") {\n          done = true;\n          break;\n        }\n        yield event;\n      }\n    }\n\n    if (wsError) {\n      yield { type: \"error\" as const, error: wsError };\n    }\n  } finally {\n    if (ws.readyState === WebSocket.OPEN) {\n      ws.close();\n    }\n  }\n}\n","import { parseSSEStream } from \"../core/utils\";\nimport type { StreamEvent } from \"../types\";\nimport type { ChatProvider, SendMessageParams, SendMessageResult } from \"./types\";\n\nexport interface OpenAIProviderConfig {\n  apiKey: string;\n  baseUrl?: string;\n  model?: string;\n}\n\ninterface OpenAIMessage {\n  role: \"user\" | \"assistant\" | \"system\";\n  content: string;\n}\n\nexport function createOpenAIProvider(config: OpenAIProviderConfig): ChatProvider {\n  const { apiKey, baseUrl = \"https://api.openai.com/v1\", model = \"gpt-4o-mini\" } = config;\n\n  // Maintain conversation history in-memory\n  const conversationHistory: OpenAIMessage[] = [];\n\n  const provider: ChatProvider = {\n    async sendMessage(params: SendMessageParams): Promise<SendMessageResult> {\n      conversationHistory.push({ role: \"user\", content: params.content });\n\n      const response = await fetch(`${baseUrl}/chat/completions`, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${apiKey}`,\n        },\n        body: JSON.stringify({\n          model,\n          messages: conversationHistory,\n          stream: false,\n        }),\n      });\n\n      if (!response.ok) {\n        throw new Error(`OpenAI API error: ${response.status}`);\n      }\n\n      const data = await response.json();\n      const content = data.choices?.[0]?.message?.content ?? \"\";\n\n      conversationHistory.push({ role: \"assistant\", content });\n\n      return {\n        message: {\n          id: data.id || crypto.randomUUID(),\n          role: \"assistant\",\n          content,\n          status: \"complete\",\n          createdAt: new Date(),\n        },\n      };\n    },\n\n    async *sendMessageStream(\n      params: SendMessageParams,\n      signal?: AbortSignal,\n    ): AsyncGenerator<StreamEvent> {\n      conversationHistory.push({ role: \"user\", content: params.content });\n\n      const response = await fetch(`${baseUrl}/chat/completions`, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${apiKey}`,\n        },\n        body: JSON.stringify({\n          model,\n          messages: conversationHistory,\n          stream: true,\n        }),\n        signal,\n      });\n\n      if (!response.ok) {\n        throw new Error(`OpenAI API error: ${response.status}`);\n      }\n\n      let fullContent = \"\";\n\n      for await (const event of parseSSEStream(response, signal)) {\n        if (event.type === \"content\" && event.content) {\n          fullContent += event.content;\n        }\n        yield event;\n      }\n\n      conversationHistory.push({ role: \"assistant\", content: fullContent });\n    },\n\n    disconnect() {\n      conversationHistory.length = 0;\n    },\n  };\n\n  return provider;\n}\n","import {\n  type AgentExecution,\n  PromptRails,\n  type StreamEvent as SdkStreamEvent,\n} from \"@promptrails/sdk\";\nimport { generateId } from \"../core/utils\";\nimport type {\n  AgentStep,\n  ApprovalDecision,\n  ApprovalRequest,\n  ExecutionStatus,\n  Message,\n  StreamEvent,\n} from \"../types\";\nimport type {\n  ChatProvider,\n  ExecutionStatusResult,\n  SendMessageParams,\n  SendMessageResult,\n} from \"./types\";\n\n/**\n * Translate a PromptRails SDK StreamEvent — a discriminated union — into the\n * flat StreamEvent shape this package's consumers expect. The SDK field\n * names differ per kind (id/name/summary on tool frames, message on error,\n * content on thinking), so we can't just re-emit; this adapter is the\n * single place that bridges the two shapes.\n */\nfunction adaptSdkEvent(event: SdkStreamEvent): StreamEvent | null {\n  switch (event.type) {\n    case \"execution\":\n      return { type: \"execution\", executionId: event.executionId };\n    case \"thinking\":\n      return { type: \"thinking\", thinking: event.content };\n    case \"tool_start\":\n      return { type: \"tool_start\", toolCallId: event.id, toolName: event.name };\n    case \"tool_end\":\n      return {\n        type: \"tool_end\",\n        toolCallId: event.id,\n        toolName: event.name,\n        toolSummary: event.summary,\n      };\n    case \"content\":\n      return { type: \"content\", content: event.content };\n    case \"done\":\n      return { type: \"done\", output: event.output };\n    case \"error\":\n      return { type: \"error\", error: event.message };\n    default:\n      return null;\n  }\n}\n\n/**\n * API v2 executions form a tree — sub-agent delegations, handoffs and\n * workflow-node runs hang off the root as `children`. Flatten that tree\n * depth-first into the flat AgentStep[] the useAgent hook renders. Statuses\n * (`waiting_approval`, `cancel_requested`, ...) already match ExecutionStatus.\n */\nfunction flattenExecutionTree(nodes: AgentExecution[]): AgentStep[] {\n  const steps: AgentStep[] = [];\n  for (const node of nodes) {\n    steps.push({\n      id: node.id,\n      name: node.agent_id,\n      status: node.status as ExecutionStatus,\n      input: node.input,\n      output: node.output,\n      durationMs: node.duration_ms,\n      error: node.error || undefined,\n      startedAt: node.started_at ? new Date(node.started_at) : undefined,\n      completedAt: node.completed_at ? new Date(node.completed_at) : undefined,\n    });\n    if (node.children?.length) {\n      steps.push(...flattenExecutionTree(node.children));\n    }\n  }\n  return steps;\n}\n\n/**\n * Map a v2 execution parked at (or resumed from) an approval gate into the\n * package's flat ApprovalRequest shape. `status` reflects the local decision\n * model: an inbox entry is \"pending\"; approve/deny return the resumed\n * execution mapped to \"approved\"/\"rejected\".\n */\nfunction toApprovalRequest(\n  exec: AgentExecution,\n  status: ApprovalRequest[\"status\"],\n): ApprovalRequest {\n  return {\n    id: exec.id,\n    executionId: exec.id,\n    agentId: exec.agent_id,\n    payload: exec.input as Record<string, unknown>,\n    status,\n    approvalExpiresAt: exec.approval_expires_at ? new Date(exec.approval_expires_at) : undefined,\n    createdAt: new Date(exec.created_at),\n  };\n}\n\nexport interface PromptRailsProviderConfig {\n  apiKey: string;\n  agentId: string;\n  /** Defaults to https://api.promptrails.ai */\n  baseUrl?: string;\n}\n\nexport function createPromptRailsProvider(config: PromptRailsProviderConfig): ChatProvider {\n  const { apiKey, agentId, baseUrl = \"https://api.promptrails.ai\" } = config;\n\n  if (!apiKey) throw new Error(\"@promptrails/ai-chat: apiKey is required.\");\n  if (!agentId) throw new Error(\"@promptrails/ai-chat: agentId is required.\");\n\n  const client = new PromptRails({ apiKey, baseUrl });\n\n  // Auto-managed session\n  let sessionId: string | null = null;\n\n  async function ensureSession(): Promise<string> {\n    if (sessionId) return sessionId;\n    const session = await client.chat.createSession({\n      agent_id: agentId,\n      title: \"Chat\",\n    });\n    sessionId = session.id;\n    return sessionId;\n  }\n\n  const provider: ChatProvider = {\n    async sendMessage(params: SendMessageParams): Promise<SendMessageResult> {\n      // The backend runs chat asynchronously — a non-streaming POST returns the\n      // user_message immediately with assistant_message=null and an\n      // execution_id. To honour the sendMessage contract (return the final\n      // assistant message), consume the SSE stream and collect the output.\n      let executionId: string | undefined;\n      let content = \"\";\n      let errored: string | undefined;\n\n      for await (const event of provider.sendMessageStream(params)) {\n        if (event.type === \"execution\" && event.executionId) {\n          executionId = event.executionId;\n        } else if (event.type === \"content\" && event.content) {\n          content += event.content;\n        } else if (event.type === \"error\") {\n          errored = event.error ?? \"stream error\";\n          break;\n        } else if (event.type === \"done\") {\n          if (!content && event.output) {\n            const out = event.output as { content?: unknown };\n            if (typeof out.content === \"string\") {\n              content = out.content;\n            }\n          }\n          break;\n        }\n      }\n\n      if (errored) {\n        throw new Error(errored);\n      }\n\n      return {\n        message: {\n          id: generateId(),\n          role: \"assistant\",\n          content,\n          status: \"complete\",\n          createdAt: new Date(),\n        },\n        executionId,\n      };\n    },\n\n    async *sendMessageStream(\n      params: SendMessageParams,\n      signal?: AbortSignal,\n    ): AsyncGenerator<StreamEvent> {\n      const sid = params.sessionId ?? (await ensureSession());\n\n      for await (const event of client.chat.sendMessageStream(\n        sid,\n        { content: params.content },\n        { signal },\n      )) {\n        const adapted = adaptSdkEvent(event);\n        if (adapted) yield adapted;\n      }\n    },\n\n    async createSession(_agentId?: string, title?: string) {\n      const session = await client.chat.createSession({\n        agent_id: agentId,\n        title: title || \"Chat\",\n      });\n      sessionId = session.id;\n      return {\n        id: session.id,\n        agentId: session.agent_id,\n        title: session.title,\n        createdAt: new Date(session.created_at),\n      };\n    },\n\n    async listMessages(sid: string, page?: number) {\n      const result = await client.chat.listMessages(sid, {\n        page: page ?? 1,\n        limit: 50,\n      });\n\n      return {\n        messages: result.data.map(\n          (item): Message => ({\n            id: item.id || generateId(),\n            role: item.role as Message[\"role\"],\n            content: item.content,\n            status: \"complete\",\n            createdAt: new Date(item.created_at),\n          }),\n        ),\n        total: result.meta.total,\n      };\n    },\n\n    async getExecutionStatus(executionId: string): Promise<ExecutionStatusResult> {\n      // v2: fetch the execution tree so sub-agent / workflow-node children\n      // surface as steps. The root is the tracked execution; its children are\n      // the sub-steps.\n      const result = await client.executions.tree(executionId);\n      return {\n        status: result.status as ExecutionStatusResult[\"status\"],\n        output: result.output as Record<string, unknown> | undefined,\n        error: result.error || undefined,\n        steps: result.children?.length ? flattenExecutionTree(result.children) : undefined,\n      };\n    },\n\n    async listApprovals(_filters?: { status?: string }): Promise<ApprovalRequest[]> {\n      // v2: the approval inbox is the set of executions parked at\n      // `waiting_approval`; there is no separate approval status to filter by.\n      const result = await client.executions.approvalInbox({ page: 1, limit: 50 });\n      return result.data.map((exec) => toApprovalRequest(exec, \"pending\"));\n    },\n\n    async decideApproval(\n      id: string,\n      decision: ApprovalDecision,\n      reason?: string,\n    ): Promise<ApprovalRequest> {\n      // v2: approving/denying resumes the parked execution itself. `id` is the\n      // execution id.\n      const exec =\n        decision === \"approved\"\n          ? await client.executions.approve(id, reason ? { reason } : undefined)\n          : await client.executions.deny(id, reason ? { reason } : undefined);\n\n      return toApprovalRequest(exec, decision === \"approved\" ? \"approved\" : \"rejected\");\n    },\n\n    disconnect() {\n      sessionId = null;\n    },\n  };\n\n  return provider;\n}\n","import {\n  BrowserChatError,\n  type BrowserRuntimeEvent,\n  createBrowserChatRuntime,\n} from \"../browser/runtime\";\nimport { generateId } from \"../core/utils\";\nimport type { ChatSession, Message } from \"../types\";\nimport type { ChatProvider, SendMessageParams, SendMessageResult } from \"./types\";\n\nexport interface PromptRailsBrowserProviderConfig {\n  /** Browser-only API key restricted to chat:write, allowed agents, and exact origins. */\n  apiKey: string;\n  agentId: string;\n  baseUrl?: string;\n  workspaceId?: string;\n  title?: string;\n  metadata?: Record<string, unknown>;\n  persistSession?: boolean;\n  sessionMaxAge?: number;\n  visitorTracking?: boolean;\n  visitorMaxAge?: number;\n  coordinateTabs?: boolean;\n  onEvent?: (event: BrowserRuntimeEvent) => void;\n}\n\nexport interface PromptRailsBrowserProvider extends ChatProvider {\n  hydrate(): Promise<Message[]>;\n  newSession(): Promise<void>;\n  clearVisitor(): void;\n  submitFeedback(executionId: string, value: 1 | -1): Promise<void>;\n}\n\nfunction finalContent(output: unknown): string {\n  let value = output;\n  if (value && typeof value === \"object\" && \"content\" in value) {\n    value = (value as { content?: unknown }).content;\n  }\n  if (value && typeof value === \"object\" && \"output\" in value) {\n    value = (value as { output?: unknown }).output;\n  }\n  if (typeof value === \"string\") return value;\n  if (value && typeof value === \"object\") {\n    const record = value as Record<string, unknown>;\n    for (const key of [\"message\", \"answer\", \"text\"]) {\n      if (typeof record[key] === \"string\") return record[key];\n    }\n  }\n  return \"\";\n}\n\nexport function createPromptRailsBrowserProvider(\n  config: PromptRailsBrowserProviderConfig,\n): PromptRailsBrowserProvider {\n  const runtime = createBrowserChatRuntime(config);\n\n  const provider: PromptRailsBrowserProvider = {\n    async sendMessage(params: SendMessageParams): Promise<SendMessageResult> {\n      let content = \"\";\n      let executionId: string | undefined;\n      for await (const event of provider.sendMessageStream(params)) {\n        if (event.type === \"content\" && event.content) content += event.content;\n        if (event.type === \"execution\") executionId = event.executionId;\n        if (event.type === \"error\") throw new Error(event.error || \"Stream error\");\n        if (event.type === \"done\" && !content) content = finalContent(event.output);\n      }\n      return {\n        message: {\n          id: generateId(),\n          role: \"assistant\",\n          content,\n          status: \"complete\",\n          createdAt: new Date(),\n          executionId,\n        },\n        executionId,\n      };\n    },\n\n    async *sendMessageStream(params, signal) {\n      try {\n        yield* runtime.sendMessageStream(\n          {\n            content: params.content,\n            context: params.context,\n            idempotencyKey: params.idempotencyKey,\n          },\n          signal,\n        );\n      } catch (error) {\n        if (!(error instanceof BrowserChatError) || error.status !== 403) throw error;\n        await runtime.newSession();\n        yield* runtime.sendMessageStream(\n          {\n            content: params.content,\n            context: params.context,\n            idempotencyKey: params.idempotencyKey,\n          },\n          signal,\n        );\n      }\n    },\n\n    async createSession(_agentId?: string, title?: string): Promise<ChatSession> {\n      await runtime.newSession();\n      const session = await runtime.createSession(title);\n      return {\n        id: runtime.sessionId,\n        agentId: session.agent_id || config.agentId,\n        title: session.title || title || config.title,\n        createdAt: session.created_at ? new Date(session.created_at) : new Date(),\n      };\n    },\n\n    async listMessages(): Promise<{ messages: Message[]; total: number }> {\n      const messages = await runtime.listMessages();\n      return { messages, total: messages.length };\n    },\n\n    hydrate: () => runtime.hydrate(),\n    newSession: () => runtime.newSession(),\n    clearVisitor: () => runtime.clearVisitor(),\n    submitFeedback: (executionId, value) => runtime.submitFeedback(executionId, value),\n    disconnect: () => runtime.disconnect(),\n  };\n\n  return provider;\n}\n"]}