{"version":3,"sources":["../src/core/utils.ts"],"names":[],"mappings":"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","file":"chunk-COKKQHSS.cjs","sourcesContent":["import type { StreamEvent } from \"../types\";\n\nlet counter = 0;\n\n/**\n * Generate a unique client-side ID.\n */\nexport function generateId(): string {\n  if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n    return crypto.randomUUID();\n  }\n  counter++;\n  return `${Date.now().toString(36)}-${counter.toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Parse a text/event-stream response into StreamEvents.\n */\nexport async function* parseSSEStream(\n  response: Response,\n  signal?: AbortSignal,\n): AsyncGenerator<StreamEvent> {\n  const reader = response.body?.getReader();\n  if (!reader) {\n    throw new Error(\"Response body is not readable\");\n  }\n\n  const decoder = new TextDecoder();\n  let buffer = \"\";\n\n  try {\n    while (true) {\n      if (signal?.aborted) break;\n\n      const { done, value } = await reader.read();\n      if (done) break;\n\n      buffer += decoder.decode(value, { stream: true });\n      const lines = buffer.split(\"\\n\");\n      buffer = lines.pop() ?? \"\";\n\n      let currentEvent = \"\";\n      let currentData = \"\";\n\n      for (const line of lines) {\n        if (line.startsWith(\"event:\")) {\n          currentEvent = line.slice(6).trim();\n        } else if (line.startsWith(\"data:\")) {\n          currentData = line.slice(5).trim();\n        } else if (line === \"\") {\n          // Empty line = event boundary\n          if (currentData) {\n            const event = parseSSEData(currentData, currentEvent);\n            if (event) yield event;\n          }\n          currentEvent = \"\";\n          currentData = \"\";\n        }\n      }\n    }\n  } finally {\n    reader.releaseLock();\n  }\n}\n\nfunction parseSSEData(data: string, event: string): StreamEvent | null {\n  if (data === \"[DONE]\") {\n    return { type: \"done\" };\n  }\n\n  try {\n    const parsed = JSON.parse(data);\n\n    // OpenAI-compatible format\n    if (parsed.choices) {\n      const choice = parsed.choices[0];\n      if (!choice) return null;\n\n      const delta = choice.delta;\n      if (delta?.content) {\n        return { type: \"content\", content: delta.content };\n      }\n      if (choice.finish_reason) {\n        return { type: \"done\" };\n      }\n      return null;\n    }\n\n    // PromptRails format\n    if (parsed.type) {\n      return parsed as StreamEvent;\n    }\n\n    // Named event format\n    if (event === \"status\" && parsed.status) {\n      return { type: \"status\", status: parsed.status };\n    }\n    if (event === \"content\" && parsed.content) {\n      return { type: \"content\", content: parsed.content };\n    }\n    if (event === \"execution\" && parsed.execution_id) {\n      return { type: \"execution\", executionId: parsed.execution_id };\n    }\n    if (event === \"thinking\" && typeof parsed.content === \"string\") {\n      return { type: \"thinking\", thinking: parsed.content };\n    }\n    if (event === \"tool_start\") {\n      return {\n        type: \"tool_start\",\n        toolCallId: parsed.id,\n        toolName: parsed.name,\n      };\n    }\n    if (event === \"tool_end\") {\n      return {\n        type: \"tool_end\",\n        toolCallId: parsed.id,\n        toolName: parsed.name,\n        toolSummary: parsed.summary,\n      };\n    }\n    if (event === \"error\") {\n      return {\n        type: \"error\",\n        error: parsed.error || parsed.message || \"Unknown error\",\n      };\n    }\n    if (event === \"done\") {\n      return { type: \"done\", output: parsed.output };\n    }\n\n    // Fallback: treat as content if string-like\n    if (typeof parsed.content === \"string\") {\n      return { type: \"content\", content: parsed.content };\n    }\n\n    return null;\n  } catch {\n    // Non-JSON data, treat as raw content\n    return { type: \"content\", content: data };\n  }\n}\n\n/**\n * Retry a function with exponential backoff.\n */\nexport async function retryWithBackoff<T>(\n  fn: () => Promise<T>,\n  maxRetries: number,\n  baseDelayMs = 1000,\n): Promise<T> {\n  let lastError: Error | undefined;\n\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\n    try {\n      return await fn();\n    } catch (error) {\n      lastError = error instanceof Error ? error : new Error(String(error));\n      if (attempt < maxRetries) {\n        const delay = baseDelayMs * 2 ** attempt;\n        await new Promise((resolve) => setTimeout(resolve, delay));\n      }\n    }\n  }\n\n  throw lastError;\n}\n"]}