@kubuild/ai 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-27AY2KBI.js +500 -0
  3. package/dist/chunk-27AY2KBI.js.map +1 -0
  4. package/dist/chunk-JY4NHD3Q.js +227 -0
  5. package/dist/chunk-JY4NHD3Q.js.map +1 -0
  6. package/dist/chunk-UH24LHRY.js +443 -0
  7. package/dist/chunk-UH24LHRY.js.map +1 -0
  8. package/dist/client/ai-client.d.ts +59 -0
  9. package/dist/client/ai-client.d.ts.map +1 -0
  10. package/dist/client/index.cjs +254 -0
  11. package/dist/client/index.cjs.map +1 -0
  12. package/dist/client/index.d.ts +2 -0
  13. package/dist/client/index.d.ts.map +1 -0
  14. package/dist/client/index.js +9 -0
  15. package/dist/client/index.js.map +1 -0
  16. package/dist/core/index.d.ts +3 -0
  17. package/dist/core/index.d.ts.map +1 -0
  18. package/dist/core/normalizer.d.ts +9 -0
  19. package/dist/core/normalizer.d.ts.map +1 -0
  20. package/dist/core/prompt-compiler.d.ts +10 -0
  21. package/dist/core/prompt-compiler.d.ts.map +1 -0
  22. package/dist/index.cjs +468 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +23 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/react/index.cjs +584 -0
  29. package/dist/react/index.cjs.map +1 -0
  30. package/dist/react/index.d.ts +3 -0
  31. package/dist/react/index.d.ts.map +1 -0
  32. package/dist/react/index.js +336 -0
  33. package/dist/react/index.js.map +1 -0
  34. package/dist/react/use-ai-chat.d.ts +63 -0
  35. package/dist/react/use-ai-chat.d.ts.map +1 -0
  36. package/dist/react/use-ai-generator.d.ts +19 -0
  37. package/dist/react/use-ai-generator.d.ts.map +1 -0
  38. package/dist/server/adapters/anthropic.d.ts +30 -0
  39. package/dist/server/adapters/anthropic.d.ts.map +1 -0
  40. package/dist/server/adapters/base.d.ts +2 -0
  41. package/dist/server/adapters/base.d.ts.map +1 -0
  42. package/dist/server/adapters/custom.d.ts +18 -0
  43. package/dist/server/adapters/custom.d.ts.map +1 -0
  44. package/dist/server/adapters/gemini.d.ts +22 -0
  45. package/dist/server/adapters/gemini.d.ts.map +1 -0
  46. package/dist/server/adapters/index.cjs +529 -0
  47. package/dist/server/adapters/index.cjs.map +1 -0
  48. package/dist/server/adapters/index.d.ts +6 -0
  49. package/dist/server/adapters/index.d.ts.map +1 -0
  50. package/dist/server/adapters/index.js +13 -0
  51. package/dist/server/adapters/index.js.map +1 -0
  52. package/dist/server/adapters/openai.d.ts +26 -0
  53. package/dist/server/adapters/openai.d.ts.map +1 -0
  54. package/dist/server/adapters/stream-utils.d.ts +12 -0
  55. package/dist/server/adapters/stream-utils.d.ts.map +1 -0
  56. package/dist/server/engine.d.ts +59 -0
  57. package/dist/server/engine.d.ts.map +1 -0
  58. package/dist/server/handler.d.ts +66 -0
  59. package/dist/server/handler.d.ts.map +1 -0
  60. package/dist/server/index.cjs +1824 -0
  61. package/dist/server/index.cjs.map +1 -0
  62. package/dist/server/index.d.ts +4 -0
  63. package/dist/server/index.d.ts.map +1 -0
  64. package/dist/server/index.js +890 -0
  65. package/dist/server/index.js.map +1 -0
  66. package/dist/types.d.ts +184 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/package.json +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/index.ts","../../src/server/engine.ts","../../src/core/prompt-compiler.ts","../../src/core/normalizer.ts","../../src/server/handler.ts","../../src/server/adapters/stream-utils.ts","../../src/server/adapters/gemini.ts","../../src/server/adapters/openai.ts","../../src/server/adapters/anthropic.ts","../../src/server/adapters/custom.ts"],"sourcesContent":["export * from './engine';\nexport * from './handler';\nexport * from './adapters';\n","import { PageDocument, Node, DocumentMetadataSchema, DocumentMetadata } from '@kubuild/schema';\nimport type {\n KubuildAiEngineOptions,\n AiGeneratePageRequest,\n AiGenerateSectionRequest,\n AiRefactorNodeRequest,\n AiChatRequest,\n AiChatResponse,\n AiChatMessage,\n AiGenerateResponse,\n AiCompiledComponentSpec,\n AiStreamEvent,\n} from '../types';\nimport {\n compileComponentCatalog,\n buildSystemPrompt,\n buildJsonSchemaForMode,\n} from '../core/prompt-compiler';\nimport {\n extractJsonFromResponse,\n normalizeAndValidatePageDocument,\n normalizeAndValidateSectionNode,\n normalizeAndValidateRefactoredNode,\n} from '../core/normalizer';\n\ninterface PlannedSection {\n type: string;\n title: string;\n prompt: string;\n}\n\ninterface PagePlan {\n title?: string;\n description?: string;\n pageStyles?: Node['styles'];\n sections?: PlannedSection[];\n} \n\nexport class KubuildAiEngine {\n private options: KubuildAiEngineOptions;\n private catalog: AiCompiledComponentSpec[];\n\n constructor(options: KubuildAiEngineOptions) {\n if (!options.adapter) {\n throw new Error('KubuildAiEngine requires an adapter instance');\n }\n this.options = options;\n this.catalog = compileComponentCatalog(options.registry);\n }\n\n get adapterName(): string {\n return this.options.adapter.name;\n }\n\n refreshCatalog(): void {\n this.catalog = compileComponentCatalog(this.options.registry);\n }\n\n private log(level: 'info' | 'warn' | 'error' | 'debug', message: string, meta?: unknown): void {\n if (this.options.logger) {\n this.options.logger(level, message, meta);\n } else if (this.options.debug) {\n const ts = new Date().toISOString();\n console.log(`[KUBUILD-AI ${level.toUpperCase()}] [${ts}] ${message}`, meta !== undefined ? meta : '');\n }\n }\n\n async generatePage(\n request: AiGeneratePageRequest,\n context?: { signal?: AbortSignal },\n ): Promise<AiGenerateResponse<PageDocument>> {\n let rawText = '';\n try {\n this.log('info', `Generating full page for prompt: \"${request.prompt}\"`);\n const systemPrompt = buildSystemPrompt({\n catalog: this.catalog,\n mode: 'full-page',\n prefix: this.options.systemPromptPrefix,\n stylePreference: request.stylePreference,\n });\n\n let userPrompt = `User Request: ${request.prompt}`;\n if (request.tone) userPrompt += `\\nTone: ${request.tone}`;\n if (request.locale) userPrompt += `\\nLanguage/Locale: ${request.locale}`;\n\n const jsonSchema = buildJsonSchemaForMode('full-page');\n\n const result = await this.options.adapter.generate({\n systemPrompt,\n userPrompt,\n jsonSchema,\n signal: context?.signal,\n });\n\n this.log('debug', 'Raw model response (generatePage)', result.text);\n\n rawText = result.text;\n const rawJson = extractJsonFromResponse(rawText);\n const document = normalizeAndValidatePageDocument(\n rawJson,\n this.options.securityLimits,\n );\n\n // Merge user requested metadata if given\n if (request.metadata) {\n document.metadata = DocumentMetadataSchema.parse({\n ...document.metadata,\n ...request.metadata,\n });\n }\n\n this.log(\n 'info',\n `Full page successfully generated: \"${document.metadata?.title || 'Untitled'}\" (${document.document.children?.length || 0} sections)`,\n );\n\n return {\n success: true,\n data: document,\n usage: result.usage,\n rawModelResponse: rawText,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n this.log('error', `Generation failed: ${message}`);\n return {\n success: false,\n error: {\n code: 'GENERATION_ERROR',\n message,\n },\n rawModelResponse: rawText || undefined,\n };\n }\n }\n\n async generateSection(\n request: AiGenerateSectionRequest,\n context?: { signal?: AbortSignal },\n ): Promise<AiGenerateResponse<Node>> {\n let rawText = '';\n try {\n const systemPrompt = buildSystemPrompt({\n catalog: this.catalog,\n mode: 'section',\n prefix: this.options.systemPromptPrefix,\n stylePreference: request.stylePreference,\n });\n\n let userPrompt = `Generate a single section node for: ${request.prompt}`;\n if (request.targetSectionType) {\n userPrompt += `\\nTarget Section Purpose: ${request.targetSectionType}`;\n }\n if (request.parentContext) {\n userPrompt += `\\nSurrounding Page Context: ${request.parentContext}`;\n }\n\n const jsonSchema = buildJsonSchemaForMode('section');\n\n const result = await this.options.adapter.generate({\n systemPrompt,\n userPrompt,\n jsonSchema,\n signal: context?.signal,\n });\n\n this.log('debug', 'Raw model response (generateSection)', result.text);\n\n rawText = result.text;\n const rawJson = extractJsonFromResponse(rawText);\n const sectionNode = normalizeAndValidateSectionNode(\n rawJson,\n this.options.securityLimits,\n );\n\n return {\n success: true,\n data: sectionNode,\n usage: result.usage,\n rawModelResponse: rawText,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n error: {\n code: 'SECTION_GENERATION_ERROR',\n message,\n },\n rawModelResponse: rawText || undefined,\n };\n }\n }\n\n async refactorNode(\n request: AiRefactorNodeRequest,\n context?: { signal?: AbortSignal },\n ): Promise<AiGenerateResponse<Node>> {\n let rawText = '';\n try {\n const systemPrompt = buildSystemPrompt({\n catalog: this.catalog,\n mode: 'refactor',\n prefix: this.options.systemPromptPrefix,\n stylePreference: request.stylePreference,\n });\n\n const userPrompt = `Instruction: ${request.instruction}\\n\\nCurrent Node:\\n${JSON.stringify(request.node, null, 2)}`;\n const jsonSchema = buildJsonSchemaForMode('refactor');\n\n const result = await this.options.adapter.generate({\n systemPrompt,\n userPrompt,\n jsonSchema,\n signal: context?.signal,\n });\n\n rawText = result.text;\n const rawJson = extractJsonFromResponse(rawText);\n const updatedNode = normalizeAndValidateRefactoredNode(\n rawJson,\n request.node,\n this.options.securityLimits,\n );\n\n return {\n success: true,\n data: updatedNode,\n usage: result.usage,\n rawModelResponse: rawText,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n success: false,\n error: {\n code: 'REFACTOR_ERROR',\n message,\n },\n rawModelResponse: rawText || undefined,\n };\n }\n }\n\n /**\n * Progressive Section Streaming Generator.\n * Emits structured SSE events: status -> metadata -> section (one by one) -> complete.\n */\n async *streamPage(\n request: AiGeneratePageRequest,\n context?: { signal?: AbortSignal },\n ): AsyncIterable<AiStreamEvent> {\n try {\n this.log('info', `[SSE] Starting streamPage for prompt: \"${request.prompt}\"`);\n\n yield {\n type: 'status',\n message: 'Analyzing requirements and planning page sections...',\n };\n\n // 1. Plan page sections\n const planSystemPrompt = `\nYou are a web architect for the KUBUILD page builder.\nGiven the user's prompt, plan the website structure. Output pure JSON (no markdown fences, no explanatory text):\n{\n \"title\": \"<Page Title>\",\n \"description\": \"<Page Description>\",\n \"pageStyles\": {\n \"base\": {\n \"backgroundColor\": \"#ffffff\",\n \"fontFamily\": \"Inter, system-ui, sans-serif\",\n \"color\": \"#111827\",\n \"minHeight\": \"100vh\"\n }\n },\n \"sections\": [\n {\n \"type\": \"<hero|features|pricing|testimonials|cta|contact|footer>\",\n \"title\": \"<Brief title>\",\n \"prompt\": \"<Detailed prompt for generating this specific section with components, layout, and content>\"\n }\n ]\n}\nPlan 3 cohesive, essential sections (e.g., hero, features, and cta) that fulfill the request.\n`;\n\n let planUserPrompt = `User Request: ${request.prompt}`;\n if (request.stylePreference) {\n planUserPrompt += `\\nStyle Preference: ${request.stylePreference}`;\n }\n if (request.tone) planUserPrompt += `\\nTone: ${request.tone}`;\n if (request.locale) planUserPrompt += `\\nLocale: ${request.locale}`;\n\n this.log('info', '[SSE] Generating website layout plan...');\n const planResult = await this.options.adapter.generate({\n systemPrompt: planSystemPrompt,\n userPrompt: planUserPrompt,\n signal: context?.signal,\n });\n\n this.log('debug', '[SSE] Raw plan response from model', planResult.text);\n\n let plan: PagePlan;\n try {\n plan = extractJsonFromResponse(planResult.text) as PagePlan;\n this.log('debug', '[SSE] Parsed plan successfully', plan);\n } catch (parseErr) {\n this.log('warn', '[SSE] Failed to parse plan JSON, using fallback plan', parseErr);\n // Fallback default plan if JSON parse failed\n plan = {\n title: 'AI Generated Page',\n description: 'Generated by KUBUILD AI',\n sections: [\n { type: 'hero', title: 'Hero Banner', prompt: `Hero section for: ${request.prompt}` },\n { type: 'features', title: 'Key Features', prompt: `Features grid for: ${request.prompt}` },\n { type: 'cta', title: 'Call To Action', prompt: `Call to action section for: ${request.prompt}` },\n ],\n };\n }\n\n const sectionsToGenerate = Array.isArray(plan.sections) && plan.sections.length > 0\n ? plan.sections\n : [\n { type: 'hero', title: 'Hero Section', prompt: `Hero banner for: ${request.prompt}` },\n { type: 'features', title: 'Features', prompt: `Features grid for: ${request.prompt}` },\n { type: 'cta', title: 'Call To Action', prompt: `CTA section for: ${request.prompt}` },\n ];\n\n const metadata: DocumentMetadata = DocumentMetadataSchema.parse({\n title: plan.title || 'AI Generated Page',\n description: plan.description || 'Generated by KUBUILD AI',\n author: 'KUBUILD AI',\n tags: ['ai-generated', 'progressive-stream'],\n category: 'landing',\n version: '1.0.0',\n ...(request.metadata || {}),\n });\n\n const rootPageNode: Node = {\n id: 'root-page',\n type: 'page',\n styles: plan.pageStyles || {\n base: {\n backgroundColor: '#ffffff',\n fontFamily: 'Inter, system-ui, sans-serif',\n color: '#111827',\n minHeight: '100vh',\n },\n },\n children: [],\n };\n\n // 2. Emit initial metadata so canvas can render initial empty page immediately!\n this.log('info', `[SSE] Emitting metadata: \"${metadata.title}\"`);\n yield {\n type: 'metadata',\n metadata,\n rootPageNode,\n };\n\n this.log(\n 'info',\n `[SSE] Plan ready with ${sectionsToGenerate.length} sections: ${sectionsToGenerate.map((s) => s.title).join(', ')}`,\n );\n yield {\n type: 'status',\n message: `Plan ready with ${sectionsToGenerate.length} sections: ${sectionsToGenerate.map((s) => s.title).join(', ')}`,\n };\n\n // 3. Sequentially generate each section and stream it!\n const completedSections: Node[] = [];\n const total = sectionsToGenerate.length;\n\n for (let i = 0; i < total; i++) {\n if (context?.signal?.aborted) {\n this.log('warn', '[SSE] Streaming aborted by client signal');\n throw new Error('Streaming aborted by client');\n }\n\n const plannedSec = sectionsToGenerate[i];\n this.log(\n 'info',\n `[SSE] Generating section ${i + 1}/${total} [${plannedSec.type}]: \"${plannedSec.title}\"`,\n );\n yield {\n type: 'status',\n message: `Generating section ${i + 1}/${total} (${plannedSec.title})...`,\n };\n\n const secRes = await this.generateSection(\n {\n prompt: plannedSec.prompt,\n stylePreference: request.stylePreference,\n targetSectionType: plannedSec.type,\n parentContext: `Website: ${plan.title}. Previous sections: ${sectionsToGenerate.slice(0, i).map((s) => s.title).join(', ')}`,\n },\n { signal: context?.signal },\n );\n\n if (secRes.success && secRes.data) {\n this.log(\n 'info',\n `[SSE] Section ${i + 1}/${total} generated successfully: [${secRes.data.id || secRes.data.type}]`,\n );\n completedSections.push(secRes.data);\n yield {\n type: 'section',\n index: i,\n total,\n section: secRes.data,\n };\n } else {\n this.log('error', `[SSE] Section ${i + 1}/${total} failed`, secRes.error?.message);\n }\n }\n\n if (completedSections.length === 0) {\n this.log('error', '[SSE] All sections failed to generate.');\n yield {\n type: 'error',\n error: {\n code: 'STREAM_GENERATION_FAILED',\n message: 'All sections failed to generate. Please check server logs or retry.',\n },\n };\n return;\n }\n\n // 4. Assemble final document and emit complete event\n const finalDocument: PageDocument = {\n schema: 'stora.page',\n version: '1.0.0',\n metadata,\n document: {\n ...rootPageNode,\n children: completedSections,\n } as PageDocument['document'],\n };\n\n this.log(\n 'info',\n `[SSE] All ${completedSections.length} sections generated. Emitting complete event.`,\n );\n yield {\n type: 'complete',\n document: finalDocument,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n this.log('error', `[SSE] Streaming failed: ${message}`);\n yield {\n type: 'error',\n error: {\n code: 'STREAM_ERROR',\n message,\n },\n };\n }\n }\n\n /**\n * Builds the system/user prompt pair shared by `chat()` and `chatStream()` — the exact\n * same document/selection grounding is used regardless of whether the response is\n * streamed token-by-token or returned as a single request/response (STORA-515).\n */\n private buildChatPrompt(request: AiChatRequest): { systemPrompt: string; userPrompt: string } {\n let systemPrompt = `You are the KUBUILD AI Assistant — an expert web designer, developer, and page architecture consultant.\nYour role is to assist users with creating, designing, refining, and understanding web pages built with the KUBUILD builder.\nAnswer questions directly, concisely, and helpfully using friendly professional tone and markdown formatting.\n\n### Available KUBUILD Components:\n${this.catalog.map((c) => `- **${c.type}** (${c.category}): ${c.label}${c.description ? ` — ${c.description}` : ''}`).join('\\n')}\n`;\n\n if (this.options.systemPromptPrefix) {\n systemPrompt = `${this.options.systemPromptPrefix}\\n\\n${systemPrompt}`;\n }\n\n if (request.systemPrompt) {\n systemPrompt += `\\nAdditional Context:\\n${request.systemPrompt}`;\n }\n\n if (request.currentDocument) {\n const doc = request.currentDocument;\n const sections = doc.document?.children || [];\n const sectionSummary = sections\n .map((s, idx) => `Section ${idx + 1}: id=\"${s.id}\", type=\"${s.type}\", title=\"${(s.props?.title as string) || 'untitled'}\", childrenCount=${s.children?.length || 0}`)\n .join('\\n');\n\n systemPrompt += `\\n### Current Page in Builder Canvas:\n- Title: ${doc.metadata?.title || 'Untitled Page'}\n- Description: ${doc.metadata?.description || 'N/A'}\n- Total Sections: ${sections.length}\n- Sections Summary:\n${sectionSummary || '(Canvas is currently empty)'}\n`;\n }\n\n if (request.selectedNodeId) {\n systemPrompt += `\\nCurrently Selected Component Node ID: \"${request.selectedNodeId}\"`;\n }\n\n // Extract last user message\n const lastUserMsg = [...request.messages].reverse().find((m) => m.role === 'user');\n const userPrompt = lastUserMsg?.content || 'Hello';\n\n return { systemPrompt, userPrompt };\n }\n\n /**\n * Conversational Assistant / Q&A.\n * Can discuss web design, explain KUBUILD components, review current page,\n * suggest improvements, or recommend copywriting.\n *\n * Single request/response — unchanged since before STORA-515. See `chatStream()` for\n * the token-level streaming variant.\n */\n async chat(\n request: AiChatRequest,\n context?: { signal?: AbortSignal },\n ): Promise<AiGenerateResponse<AiChatResponse>> {\n let rawText = '';\n try {\n if (!request.messages || !Array.isArray(request.messages) || request.messages.length === 0) {\n return {\n success: false,\n error: {\n code: 'INVALID_CHAT_REQUEST',\n message: '\"messages\" array is required and must not be empty',\n },\n };\n }\n\n this.log('info', `Processing chat turn with ${request.messages.length} messages`);\n\n const { systemPrompt, userPrompt } = this.buildChatPrompt(request);\n\n const result = await this.options.adapter.generate({\n systemPrompt,\n userPrompt,\n messages: request.messages,\n signal: context?.signal,\n });\n\n rawText = result.text.trim();\n\n const assistantMessage: AiChatMessage = {\n role: 'assistant',\n content: rawText,\n timestamp: Date.now(),\n };\n\n return {\n success: true,\n data: {\n message: assistantMessage,\n },\n usage: result.usage,\n rawModelResponse: rawText,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n this.log('error', `Chat failed: ${message}`);\n return {\n success: false,\n error: {\n code: 'CHAT_ERROR',\n message,\n },\n rawModelResponse: rawText || undefined,\n };\n }\n }\n\n /**\n * Token-level streaming variant of `chat()` (STORA-515). Emits `chat-chunk` events as\n * partial text arrives, then a terminal `chat-complete` event with the fully assembled\n * assistant message — the same `AsyncIterable<AiStreamEvent>` mechanism `streamPage`\n * already uses, so it can be piped over SSE by `createAiHandler`/consumed by\n * `KubuildAiClient` with no separate transport.\n *\n * When the configured adapter does not implement `generateStream` (e.g. the generic\n * custom/HTTP adapter), this falls back to a single non-streaming `generate()` call and\n * emits the entire response as one `chat-chunk`, so callers never see an error just\n * because the underlying provider can't stream — only a less granular update cadence.\n */\n async *chatStream(\n request: AiChatRequest,\n context?: { signal?: AbortSignal },\n ): AsyncIterable<AiStreamEvent> {\n try {\n if (!request.messages || !Array.isArray(request.messages) || request.messages.length === 0) {\n yield {\n type: 'error',\n error: {\n code: 'INVALID_CHAT_REQUEST',\n message: '\"messages\" array is required and must not be empty',\n },\n };\n return;\n }\n\n this.log(\n 'info',\n `[SSE] Starting chatStream with ${request.messages.length} messages (adapter: ${this.options.adapter.name})`,\n );\n\n const { systemPrompt, userPrompt } = this.buildChatPrompt(request);\n\n let accumulated = '';\n let usage: AiGenerateResponse<AiChatResponse>['usage'];\n\n if (typeof this.options.adapter.generateStream === 'function') {\n const generator = this.options.adapter.generateStream({\n systemPrompt,\n userPrompt,\n messages: request.messages,\n signal: context?.signal,\n });\n\n while (true) {\n const { value, done } = await generator.next();\n if (done) {\n usage = value?.usage;\n break;\n }\n accumulated += value;\n yield { type: 'chat-chunk', delta: value, content: accumulated };\n }\n } else {\n this.log(\n 'debug',\n `Adapter \"${this.options.adapter.name}\" has no generateStream; falling back to non-streaming chat`,\n );\n const result = await this.options.adapter.generate({\n systemPrompt,\n userPrompt,\n messages: request.messages,\n signal: context?.signal,\n });\n accumulated = result.text;\n usage = result.usage;\n yield { type: 'chat-chunk', delta: accumulated, content: accumulated };\n }\n\n const assistantMessage: AiChatMessage = {\n role: 'assistant',\n content: accumulated.trim(),\n timestamp: Date.now(),\n };\n\n this.log('info', '[SSE] Chat stream completed', usage);\n yield { type: 'chat-complete', message: assistantMessage };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n this.log('error', `[SSE] Chat streaming failed: ${message}`);\n yield {\n type: 'error',\n error: {\n code: 'CHAT_STREAM_ERROR',\n message,\n },\n };\n }\n }\n}\n","import type {\n AiCompiledComponentSpec,\n AiCompiledComponentProp,\n ComponentRegistryLike,\n ComponentDefinitionLike,\n AiGenerationMode,\n} from '../types';\n\nexport function compileComponentCatalog(\n registry?: ComponentRegistryLike,\n): AiCompiledComponentSpec[] {\n if (!registry) return [];\n\n const definitions = registry.list();\n return definitions.map((def: ComponentDefinitionLike) => {\n const props: AiCompiledComponentProp[] = [];\n\n if (def.propFields && Array.isArray(def.propFields)) {\n for (const field of def.propFields) {\n props.push({\n name: field.name,\n type: field.type || 'string',\n defaultValue: field.defaultValue,\n options: field.options?.map((o) => o.value),\n description: field.description,\n });\n }\n }\n\n return {\n type: def.type,\n label: def.label || def.type,\n category: def.category || 'custom',\n description: def.description,\n acceptsChildren: def.acceptsChildren ?? false,\n allowedChildren: def.allowedChildren,\n disallowedParents: def.disallowedParents,\n defaultProps: def.defaultProps,\n props: props.length > 0 ? props : undefined,\n };\n });\n}\n\nexport function buildSystemPrompt(options: {\n catalog: AiCompiledComponentSpec[];\n mode: AiGenerationMode;\n prefix?: string;\n stylePreference?: string;\n}): string {\n const { catalog, mode, prefix, stylePreference } = options;\n\n const catalogSummary = catalog\n .map((c) => {\n let desc = `- **${c.type}** (${c.category}): ${c.label}`;\n if (c.description) desc += ` - ${c.description}`;\n desc += ` | acceptsChildren: ${c.acceptsChildren}`;\n if (c.allowedChildren && c.allowedChildren.length > 0) {\n desc += ` | allowedChildren: [${c.allowedChildren.join(', ')}]`;\n }\n if (c.props && c.props.length > 0) {\n const propList = c.props\n .map((p) => {\n let pStr = `${p.name} (${p.type})`;\n if (p.options) pStr += `[${p.options.map(String).join('|')}]`;\n return pStr;\n })\n .join(', ');\n desc += ` | props: { ${propList} }`;\n }\n return desc;\n })\n .join('\\n');\n\n let modeInstructions = '';\n if (mode === 'full-page') {\n modeInstructions = `\nYou must generate a complete, valid KUBUILD PageDocument JSON with this exact structure:\n{\n \"schema\": \"stora.page\",\n \"version\": \"1.0.0\",\n \"metadata\": {\n \"title\": \"<Page Title>\",\n \"description\": \"<Page Description>\",\n \"tags\": [\"<tag1>\", \"<tag2>\"],\n \"category\": \"<category>\"\n },\n \"document\": {\n \"id\": \"root-page\",\n \"type\": \"page\",\n \"styles\": {\n \"base\": {\n \"backgroundColor\": \"#ffffff\",\n \"fontFamily\": \"Inter, system-ui, sans-serif\",\n \"color\": \"#111827\",\n \"minHeight\": \"100vh\"\n }\n },\n \"children\": [\n // Sections here...\n ]\n }\n}\n`;\n } else if (mode === 'section') {\n modeInstructions = `\nYou must generate a single valid KUBUILD section Node JSON with this structure:\n{\n \"id\": \"section_<unique_suffix>\",\n \"type\": \"section\",\n \"styles\": {\n \"base\": {\n \"paddingTop\": \"64px\",\n \"paddingBottom\": \"64px\",\n \"paddingLeft\": \"24px\",\n \"paddingRight\": \"24px\"\n }\n },\n \"children\": [\n // Container and child nodes...\n ]\n}\n`;\n } else if (mode === 'refactor') {\n modeInstructions = `\nYou must refactor the provided KUBUILD Node based on the user's instructions.\nReturn ONLY the updated Node JSON while maintaining structural integrity.\n`;\n }\n\n const styleGuide = stylePreference\n ? `\\nUser Style Preference: \"${stylePreference}\". Follow this visual aesthetic closely.`\n : '\\nStyle with modern, clean, high-conversion design patterns (accessible contrast, harmonious spacing, beautiful typography, subtle shadows/borders).';\n\n return `${prefix ? prefix + '\\n\\n' : ''}You are an expert web designer and KUBUILD architecture generator.\nKUBUILD is a component-driven visual website builder. Your job is to output pure, valid JSON (and NOTHING ELSE) matching the KUBUILD schema and the registered component definitions.\n\n### RULES & CONSTRAINTS:\n1. Output MUST be valid JSON only. No markdown fences, no explanatory text, no HTML tags outside html-embed.\n2. Only use component types listed in the Component Catalog below. Do NOT invent new component types.\n3. Obey \\`acceptsChildren\\` and \\`allowedChildren\\`:\n - Layout hierarchy: \\`page\\` -> \\`section\\` -> \\`container\\` or \\`columns\\` -> content components (\\`heading\\`, \\`paragraph\\`, \\`button\\`, \\`image\\`, \\`form\\`, etc.).\n - Leaf components (e.g. \\`button\\`, \\`input\\`, \\`heading\\`, \\`text\\`, \\`badge\\`) must have \\`acceptsChildren: false\\` and empty or omitted \\`children\\`.\n4. Every node MUST have a unique string \\`id\\` (e.g. \"hero-section\", \"hero-title\", \"cta-btn\").\n5. Responsive & Interactive State Styling:\n - Use the \\`styles\\` object with breakpoint keys: \\`base\\` (all viewports/desktop), and optionally \\`tablet\\` or \\`mobile\\`.\n - In \\`base\\`, \\`tablet\\`, and \\`mobile\\`, values MUST be CSS primitives (strings or numbers, e.g. \"backgroundColor\": \"#3b82f6\"). NEVER put nested objects or \":hover\" inside \"base\"!\n - For hover, active, or interactive pseudo-classes, use \\`styles.states\\` with pseudo-class keys (e.g. \\`\":hover\"\\`), like:\n \"styles\": {\n \"base\": { \"backgroundColor\": \"#3b82f6\", \"color\": \"#ffffff\" },\n \"states\": {\n \":hover\": { \"backgroundColor\": \"#2563eb\" }\n }\n }\n6. NEVER include dangerous scripts, \\`javascript:\\` URIs, or malicious payload attributes.\n${styleGuide}\n\n### OUTPUT SPECIFICATION:\n${modeInstructions}\n\n### REGISTERED COMPONENT CATALOG:\n${catalogSummary || '(Standard core components: page, section, container, columns, heading, paragraph, text, button, input, textarea, select, image, video, icon, badge, code-block)'}\n`;\n}\n\nexport function buildJsonSchemaForMode(mode: AiGenerationMode): Record<string, unknown> {\n const nodeSchema: Record<string, unknown> = {\n type: 'object',\n required: ['id', 'type'],\n properties: {\n id: { type: 'string' },\n type: { type: 'string' },\n props: { type: 'object' },\n styles: {\n type: 'object',\n properties: {\n base: { type: 'object' },\n tablet: { type: 'object' },\n mobile: { type: 'object' },\n states: { type: 'object' },\n },\n },\n children: {\n type: 'array',\n items: { $ref: '#' },\n },\n },\n };\n\n if (mode === 'full-page') {\n return {\n type: 'object',\n required: ['schema', 'version', 'document'],\n properties: {\n schema: { type: 'string', const: 'stora.page' },\n version: { type: 'string', const: '1.0.0' },\n metadata: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n description: { type: 'string' },\n tags: { type: 'array', items: { type: 'string' } },\n category: { type: 'string' },\n },\n },\n document: nodeSchema,\n },\n };\n }\n\n return nodeSchema;\n}\n","import {\n PageDocument,\n PageDocumentSchema,\n DocumentMetadata,\n DocumentMetadataSchema,\n Node,\n NodeSchema,\n CURRENT_SCHEMA_VERSION,\n SCHEMA_NAME,\n} from '@kubuild/schema';\nimport {\n validateDocument,\n validateDocumentSecurity,\n DocumentSecurityLimits,\n} from '@kubuild/core';\n\nexport function extractJsonFromResponse(raw: string): unknown {\n let cleaned = raw.trim();\n // Strip Markdown code blocks if present (```json ... ``` or ``` ...)\n if (cleaned.startsWith('```')) {\n const firstNewline = cleaned.indexOf('\\n');\n if (firstNewline !== -1) {\n cleaned = cleaned.slice(firstNewline + 1);\n }\n if (cleaned.endsWith('```')) {\n cleaned = cleaned.slice(0, cleaned.length - 3).trim();\n }\n }\n\n // Find the outermost JSON object bounds if there is extraneous text\n const firstBrace = cleaned.indexOf('{');\n const lastBrace = cleaned.lastIndexOf('}');\n if (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {\n cleaned = cleaned.slice(firstBrace, lastBrace + 1);\n }\n\n try {\n return JSON.parse(cleaned);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to parse AI response as JSON: ${msg}. Response was: ${raw.slice(0, 200)}...`);\n }\n}\n\nexport function normalizeStyles(rawStyles: unknown): Node['styles'] {\n if (!rawStyles || typeof rawStyles !== 'object' || Array.isArray(rawStyles)) {\n return undefined;\n }\n\n const raw = rawStyles as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n const states: Record<string, Record<string, unknown>> = {};\n\n // Existing states\n if (raw.states && typeof raw.states === 'object' && !Array.isArray(raw.states)) {\n for (const [stateKey, stateVal] of Object.entries(raw.states as Record<string, unknown>)) {\n if (stateVal && typeof stateVal === 'object' && !Array.isArray(stateVal)) {\n states[stateKey] = { ...(stateVal as Record<string, unknown>) };\n }\n }\n }\n\n const knownBreakpoints = ['base', 'desktop', 'tablet', 'mobile'];\n const hasBreakpoint = Object.keys(raw).some((k) => knownBreakpoints.includes(k));\n\n if (!hasBreakpoint) {\n // If AI output flat CSS properties without 'base' wrapper\n const baseStyles: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (key === 'states') continue;\n if (key.startsWith(':') || key === 'hover' || key === 'focus' || key === 'active') {\n const stateKey = key.startsWith(':') ? key : `:${key}`;\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n states[stateKey] = { ...(states[stateKey] || {}), ...(value as Record<string, unknown>) };\n }\n } else if (typeof value !== 'object' || value === null) {\n baseStyles[key] = value;\n }\n }\n if (Object.keys(baseStyles).length > 0) {\n result.base = baseStyles;\n }\n } else {\n for (const bp of knownBreakpoints) {\n const bpVal = raw[bp];\n if (bpVal && typeof bpVal === 'object' && !Array.isArray(bpVal)) {\n const cleanBp: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(bpVal as Record<string, unknown>)) {\n if (key.startsWith(':') || key === 'hover' || key === 'focus' || key === 'active') {\n const stateKey = key.startsWith(':') ? key : `:${key}`;\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n states[stateKey] = { ...(states[stateKey] || {}), ...(value as Record<string, unknown>) };\n }\n } else if (typeof value !== 'object' || value === null) {\n cleanBp[key] = value;\n }\n }\n if (Object.keys(cleanBp).length > 0) {\n result[bp] = cleanBp;\n }\n }\n }\n\n // Also extract any pseudo-classes at top level\n for (const [key, value] of Object.entries(raw)) {\n if (knownBreakpoints.includes(key) || key === 'states') continue;\n if (key.startsWith(':') || key === 'hover' || key === 'focus' || key === 'active') {\n const stateKey = key.startsWith(':') ? key : `:${key}`;\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n states[stateKey] = { ...(states[stateKey] || {}), ...(value as Record<string, unknown>) };\n }\n }\n }\n }\n\n // Clean and sanitize states: each state can only have primitives\n const cleanStates: Record<string, Record<string, unknown>> = {};\n for (const [stateKey, stateDef] of Object.entries(states)) {\n const cleanDef: Record<string, unknown> = {};\n for (const [propKey, propVal] of Object.entries(stateDef)) {\n if (typeof propVal !== 'object' || propVal === null) {\n cleanDef[propKey] = propVal;\n }\n }\n if (Object.keys(cleanDef).length > 0) {\n cleanStates[stateKey] = cleanDef;\n }\n }\n\n if (Object.keys(cleanStates).length > 0) {\n result.states = cleanStates;\n }\n\n return Object.keys(result).length > 0 ? (result as Node['styles']) : undefined;\n}\n\nexport function normalizeNodeTree(\n node: unknown,\n usedIds: Set<string> = new Set(),\n depth = 0,\n): Node {\n if (!node || typeof node !== 'object') {\n throw new Error(`Invalid node at depth ${depth}: must be an object`);\n }\n\n const raw = node as Record<string, unknown>;\n const type = typeof raw.type === 'string' && raw.type.trim() ? raw.type.trim() : 'container';\n\n // Ensure deterministic, unique ID\n let id = typeof raw.id === 'string' && raw.id.trim() ? raw.id.trim() : '';\n if (!id || usedIds.has(id)) {\n let counter = 1;\n let candidate = `${type}-${counter}`;\n while (usedIds.has(candidate)) {\n counter++;\n candidate = `${type}-${counter}`;\n }\n id = candidate;\n }\n usedIds.add(id);\n\n // Normalize props\n const props =\n raw.props && typeof raw.props === 'object' && !Array.isArray(raw.props)\n ? { ...(raw.props as Record<string, unknown>) }\n : {};\n\n // Fix common LLM prop quirks:\n // e.g. heading level passed as string \"1\" instead of number 1\n if (type === 'heading' && typeof props.level === 'string') {\n const parsedLevel = parseInt(props.level, 10);\n if (!isNaN(parsedLevel) && parsedLevel >= 1 && parsedLevel <= 6) {\n props.level = parsedLevel;\n }\n }\n\n // Normalize styles\n const styles = normalizeStyles(raw.styles);\n\n // Normalize children recursively\n let children: Node[] | undefined = undefined;\n if (Array.isArray(raw.children)) {\n children = raw.children\n .filter((c) => c && typeof c === 'object')\n .map((c) => normalizeNodeTree(c, usedIds, depth + 1));\n }\n\n return {\n id,\n type,\n props: Object.keys(props).length > 0 ? props : undefined,\n styles,\n children,\n };\n}\n\nexport function normalizeAndValidatePageDocument(\n rawJson: unknown,\n securityLimits?: DocumentSecurityLimits,\n): PageDocument {\n if (!rawJson || typeof rawJson !== 'object') {\n throw new Error('AI output must be a JSON object');\n }\n\n const obj = rawJson as Record<string, unknown>;\n\n // Case 1: AI returned directly a page node instead of PageDocument\n let docObject: Record<string, unknown>;\n if (obj.type === 'page' && !obj.document) {\n docObject = {\n schema: SCHEMA_NAME,\n version: CURRENT_SCHEMA_VERSION,\n metadata: {\n title: (typeof obj.props === 'object' && obj.props !== null && (obj.props as Record<string, unknown>).title) || 'AI Generated Page',\n description: 'Generated by KUBUILD AI',\n },\n document: obj,\n };\n } else {\n docObject = {\n schema: SCHEMA_NAME,\n version: typeof obj.version === 'string' ? obj.version : CURRENT_SCHEMA_VERSION,\n metadata: typeof obj.metadata === 'object' && obj.metadata !== null\n ? obj.metadata\n : { title: 'AI Generated Page', description: 'Generated by KUBUILD AI' },\n document: obj.document || obj,\n };\n }\n\n // Normalize the node tree and ensure IDs\n const usedIds = new Set<string>();\n const normalizedRoot = normalizeNodeTree(docObject.document, usedIds);\n\n if (normalizedRoot.type !== 'page') {\n normalizedRoot.type = 'page';\n }\n\n const parsedMetadata = DocumentMetadataSchema.parse({\n title: 'AI Generated Page',\n description: 'Generated by KUBUILD AI',\n author: 'KUBUILD AI',\n tags: ['ai-generated'],\n category: 'general',\n version: '1.0.0',\n ...(typeof docObject.metadata === 'object' && docObject.metadata !== null\n ? (docObject.metadata as Record<string, unknown>)\n : {}),\n });\n\n const finalDocument: PageDocument = {\n schema: SCHEMA_NAME,\n version: CURRENT_SCHEMA_VERSION,\n metadata: parsedMetadata,\n document: normalizedRoot as PageDocument['document'],\n };\n\n // 1. Zod Schema parse\n const parsed = PageDocumentSchema.safeParse(finalDocument);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');\n throw new Error(`Document schema validation failed: ${issues}`);\n }\n\n // 2. Core document and security validation\n const validationResult = validateDocument(finalDocument, { securityLimits });\n if (!validationResult.valid) {\n const errorMsgs = validationResult.errors.map((e) => `${e.code}: ${e.message} (${e.path})`).join('; ');\n throw new Error(`Document validation failed: ${errorMsgs}`);\n }\n\n return parsed.data;\n}\n\nexport function normalizeAndValidateSectionNode(\n rawJson: unknown,\n securityLimits?: DocumentSecurityLimits,\n): Node {\n if (!rawJson || typeof rawJson !== 'object') {\n throw new Error('AI output must be a JSON object');\n }\n\n const usedIds = new Set<string>();\n const normalized = normalizeNodeTree(rawJson, usedIds);\n\n if (normalized.type !== 'section') {\n // If AI wrapped it or returned another root, enforce section\n normalized.type = 'section';\n }\n\n const parsed = NodeSchema.safeParse(normalized);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');\n throw new Error(`Section node schema validation failed: ${issues}`);\n }\n\n // Security check\n const secCheck = validateDocumentSecurity({ document: normalized }, securityLimits);\n if (!secCheck.safe) {\n const issues = secCheck.errors.map((e) => `${e.code}: ${e.message}`).join('; ');\n throw new Error(`Section security check failed: ${issues}`);\n }\n\n return parsed.data;\n}\n\nexport function normalizeAndValidateRefactoredNode(\n rawJson: unknown,\n originalNode: Node,\n securityLimits?: DocumentSecurityLimits,\n): Node {\n if (!rawJson || typeof rawJson !== 'object') {\n throw new Error('AI output must be a JSON object');\n }\n\n const usedIds = new Set<string>();\n const normalized = normalizeNodeTree(rawJson, usedIds);\n\n // Preserve original ID and type if AI changed them accidentally\n normalized.id = originalNode.id;\n normalized.type = originalNode.type;\n\n const parsed = NodeSchema.safeParse(normalized);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');\n throw new Error(`Refactored node schema validation failed: ${issues}`);\n }\n\n const secCheck = validateDocumentSecurity({ document: normalized }, securityLimits);\n if (!secCheck.safe) {\n const issues = secCheck.errors.map((e) => `${e.code}: ${e.message}`).join('; ');\n throw new Error(`Refactored node security check failed: ${issues}`);\n }\n\n return parsed.data;\n}\n","import type { KubuildAiEngine } from './engine';\nimport type { PageDocument } from '@kubuild/schema';\nimport type {\n AiGeneratePageRequest,\n AiGenerateSectionRequest,\n AiRefactorNodeRequest,\n AiChatMessage,\n AiGenerateResponse,\n AiGenerationMode,\n} from '../types';\n\nexport interface AiApiRequestBody {\n mode?: AiGenerationMode;\n prompt?: string;\n stylePreference?: string;\n tone?: string;\n locale?: string;\n metadata?: AiGeneratePageRequest['metadata'];\n targetSectionType?: string;\n parentContext?: string;\n node?: AiRefactorNodeRequest['node'];\n instruction?: string;\n stream?: boolean;\n messages?: AiChatMessage[];\n currentDocument?: PageDocument;\n selectedNodeId?: string;\n}\n\nexport async function processAiRequest(\n engine: KubuildAiEngine,\n body: unknown,\n signal?: AbortSignal,\n): Promise<{ status: number; response: AiGenerateResponse<unknown> }> {\n if (!body || typeof body !== 'object') {\n return {\n status: 400,\n response: {\n success: false,\n error: {\n code: 'BAD_REQUEST',\n message: 'Request body must be a valid JSON object',\n },\n },\n };\n }\n\n const payload = body as AiApiRequestBody;\n const mode = payload.mode || 'full-page';\n\n if (mode === 'full-page') {\n if (!payload.prompt || typeof payload.prompt !== 'string') {\n return {\n status: 400,\n response: {\n success: false,\n error: {\n code: 'INVALID_PROMPT',\n message: '\"prompt\" is required for full-page generation',\n },\n },\n };\n }\n const result = await engine.generatePage(\n {\n prompt: payload.prompt,\n stylePreference: payload.stylePreference,\n tone: payload.tone,\n locale: payload.locale,\n metadata: payload.metadata,\n },\n { signal },\n );\n return {\n status: result.success ? 200 : 500,\n response: result,\n };\n }\n\n if (mode === 'section') {\n if (!payload.prompt || typeof payload.prompt !== 'string') {\n return {\n status: 400,\n response: {\n success: false,\n error: {\n code: 'INVALID_PROMPT',\n message: '\"prompt\" is required for section generation',\n },\n },\n };\n }\n const result = await engine.generateSection(\n {\n prompt: payload.prompt,\n stylePreference: payload.stylePreference,\n targetSectionType: payload.targetSectionType,\n parentContext: payload.parentContext,\n },\n { signal },\n );\n return {\n status: result.success ? 200 : 500,\n response: result,\n };\n }\n\n if (mode === 'refactor') {\n if (!payload.node || !payload.instruction) {\n return {\n status: 400,\n response: {\n success: false,\n error: {\n code: 'INVALID_REFACTOR_PARAMS',\n message: '\"node\" and \"instruction\" are required for refactoring',\n },\n },\n };\n }\n const result = await engine.refactorNode(\n {\n node: payload.node,\n instruction: payload.instruction,\n stylePreference: payload.stylePreference,\n },\n { signal },\n );\n return {\n status: result.success ? 200 : 500,\n response: result,\n };\n }\n\n if (mode === 'chat') {\n if (!payload.messages || !Array.isArray(payload.messages) || payload.messages.length === 0) {\n return {\n status: 400,\n response: {\n success: false,\n error: {\n code: 'INVALID_CHAT_PARAMS',\n message: '\"messages\" array is required and must not be empty for chat mode',\n },\n },\n };\n }\n const result = await engine.chat(\n {\n messages: payload.messages,\n currentDocument: payload.currentDocument,\n selectedNodeId: payload.selectedNodeId,\n },\n { signal },\n );\n return {\n status: result.success ? 200 : 500,\n response: result,\n };\n }\n\n return {\n status: 400,\n response: {\n success: false,\n error: {\n code: 'UNKNOWN_MODE',\n message: `Unsupported mode: ${String(mode)}. Supported modes: 'full-page', 'section', 'refactor', 'chat'`,\n },\n },\n };\n}\n\n/**\n * Options for {@link createAiHandler} (STORA-519).\n */\nexport interface CreateAiHandlerOptions {\n /**\n * Optional hook invoked with the raw incoming `Request` before it ever reaches the\n * engine/provider — the place to plug in host-owned auth and/or rate-limiting without\n * forking the handler.\n *\n * - Return a `Response` (or a Promise resolving to one) to reject/short-circuit the\n * request — e.g. `new Response(..., { status: 401 })` or `429` — that response is\n * returned as-is and the engine/provider is never invoked.\n * - Return `void`/`undefined` (or a Promise resolving to that) to allow the request to\n * continue through the normal handler logic unchanged.\n *\n * Omitting this option entirely preserves the exact pre-STORA-519 behavior.\n */\n beforeRequest?: (request: Request) => Promise<Response | void> | Response | void;\n}\n\n/**\n * Creates a standard Web Fetch API Request handler with optional SSE streaming support.\n *\n * Plug-and-play for Next.js App Router (route.ts), SvelteKit, Remix, Astro, Bun, etc.\n *\n * Example:\n * ```ts\n * export const POST = createAiHandler(engine);\n * ```\n *\n * Example with an auth/rate-limit hook (STORA-519):\n * ```ts\n * export const POST = createAiHandler(engine, {\n * beforeRequest: async (request) => {\n * if (!isAuthorized(request)) {\n * return new Response('Unauthorized', { status: 401 });\n * }\n * // returning nothing lets the request proceed as normal\n * },\n * });\n * ```\n */\nexport function createAiHandler(engine: KubuildAiEngine, options?: CreateAiHandlerOptions) {\n return async (request: Request): Promise<Response> => {\n try {\n if (options?.beforeRequest) {\n const hookResult = await options.beforeRequest(request);\n if (hookResult instanceof Response) {\n return hookResult;\n }\n }\n\n if (request.method !== 'POST') {\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n code: 'METHOD_NOT_ALLOWED',\n message: 'Only POST requests are accepted',\n },\n }),\n {\n status: 405,\n headers: {\n 'Content-Type': 'application/json',\n Allow: 'POST',\n },\n },\n );\n }\n\n const body = (await request.json().catch(() => null)) as AiApiRequestBody | null;\n\n // Handle opt-in SSE Streaming\n if (body && typeof body === 'object' && body.stream === true) {\n const mode = body.mode || 'full-page';\n\n // Token-level chat streaming (STORA-515) — routed separately from full-page\n // streaming below since it needs `messages`, not `prompt`.\n if (mode === 'chat') {\n if (!body.messages || !Array.isArray(body.messages) || body.messages.length === 0) {\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n code: 'INVALID_CHAT_PARAMS',\n message: '\"messages\" array is required and must not be empty for chat mode',\n },\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of engine.chatStream(\n {\n messages: body.messages!,\n currentDocument: body.currentDocument,\n selectedNodeId: body.selectedNodeId,\n },\n { signal: request.signal },\n )) {\n controller.enqueue(\n encoder.encode(`event: ${event.type}\\ndata: ${JSON.stringify(event)}\\n\\n`),\n );\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n controller.enqueue(\n encoder.encode(\n `event: error\\ndata: ${JSON.stringify({ type: 'error', error: { code: 'CHAT_STREAM_ERROR', message } })}\\n\\n`,\n ),\n );\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(readable, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n },\n });\n }\n\n if (!body.prompt || typeof body.prompt !== 'string') {\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n code: 'INVALID_PROMPT',\n message: '\"prompt\" is required for streaming generation',\n },\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of engine.streamPage(\n {\n prompt: body.prompt!,\n stylePreference: body.stylePreference,\n tone: body.tone,\n locale: body.locale,\n metadata: body.metadata,\n },\n { signal: request.signal },\n )) {\n controller.enqueue(\n encoder.encode(`event: ${event.type}\\ndata: ${JSON.stringify(event)}\\n\\n`),\n );\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n controller.enqueue(\n encoder.encode(\n `event: error\\ndata: ${JSON.stringify({ type: 'error', error: { code: 'STREAM_ERROR', message } })}\\n\\n`,\n ),\n );\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(readable, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n },\n });\n }\n\n // Default: Standard non-streaming JSON response (Backward-compatible)\n const { status, response } = await processAiRequest(\n engine,\n body,\n request.signal,\n );\n\n return new Response(JSON.stringify(response), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n code: 'INTERNAL_SERVER_ERROR',\n message,\n },\n }),\n {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n );\n }\n };\n}\n","/**\n * Shared SSE (server-sent events) frame reader for provider adapters that support\n * token-level streaming (STORA-515) — OpenAI, Anthropic and Gemini all expose their\n * streaming APIs as `data: <json>\\n\\n` frames, so every adapter reuses this single\n * low-level reader instead of re-implementing buffering/decoding three times.\n *\n * Yields the raw string payload of each `data:` line (already trimmed), in arrival\n * order. Callers are responsible for `JSON.parse`-ing (or ignoring sentinel values\n * like OpenAI's `[DONE]`) and for interpreting provider-specific event shapes.\n */\nexport async function* readSseDataLines(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<string, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw new Error('Streaming aborted by client');\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const frames = buffer.split('\\n\\n');\n buffer = frames.pop() || '';\n\n for (const frame of frames) {\n for (const line of frame.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.startsWith('data:')) {\n yield trimmed.slice(5).trim();\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types';\nimport { readSseDataLines } from './stream-utils';\n\nexport interface GeminiAdapterOptions {\n apiKey: string;\n model?: string;\n temperature?: number;\n baseUrl?: string;\n}\n\nexport class GeminiAdapter implements AiProviderAdapter {\n readonly name = 'gemini';\n private apiKey: string;\n private model: string;\n private temperature: number;\n private baseUrl: string;\n\n constructor(options: GeminiAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('GeminiAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'gemini-2.5-flash';\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl =\n options.baseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n }\n\n private buildContents(\n params: AiProviderGenerateParams,\n ): Array<{ role: string; parts: Array<{ text: string }> }> {\n const { userPrompt, messages: chatMessages } = params;\n return chatMessages && chatMessages.length > 0\n ? chatMessages.map((m) => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: m.content }],\n }))\n : [\n {\n role: 'user',\n parts: [{ text: userPrompt }],\n },\n ];\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const { systemPrompt, messages: chatMessages, signal } = params;\n\n const url = `${this.baseUrl}/models/${encodeURIComponent(this.model)}:generateContent?key=${encodeURIComponent(this.apiKey)}`;\n const contents = this.buildContents(params);\n\n const generationConfig: Record<string, unknown> = {\n temperature: this.temperature,\n };\n\n if (params.jsonSchema || (!chatMessages && (systemPrompt.includes('JSON') || systemPrompt.includes('json')))) {\n generationConfig.responseMimeType = 'application/json';\n }\n\n const body: Record<string, unknown> = {\n system_instruction: {\n parts: [{ text: systemPrompt }],\n },\n contents,\n generationConfig,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Gemini API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const data = (await res.json()) as {\n candidates?: Array<{\n content?: {\n parts?: Array<{ text?: string }>;\n };\n }>;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n };\n };\n\n const candidateText = data.candidates?.[0]?.content?.parts?.[0]?.text;\n if (!candidateText) {\n throw new Error('Gemini returned an empty or invalid candidate response');\n }\n\n return {\n text: candidateText,\n usage: data.usageMetadata\n ? {\n promptTokens: data.usageMetadata.promptTokenCount,\n completionTokens: data.usageMetadata.candidatesTokenCount,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via Gemini's `streamGenerateContent` SSE endpoint (STORA-515).\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { systemPrompt, signal } = params;\n const url = `${this.baseUrl}/models/${encodeURIComponent(this.model)}:streamGenerateContent?alt=sse&key=${encodeURIComponent(this.apiKey)}`;\n const contents = this.buildContents(params);\n\n const generationConfig: Record<string, unknown> = {\n temperature: this.temperature,\n };\n\n const body: Record<string, unknown> = {\n system_instruction: {\n parts: [{ text: systemPrompt }],\n },\n contents,\n generationConfig,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Gemini API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n if (!res.body) {\n throw new Error('Gemini streaming response has no readable body');\n }\n\n let text = '';\n let usage: AiProviderGenerateResult['usage'];\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n let parsed: {\n candidates?: Array<{ content?: { parts?: Array<{ text?: string }> } }>;\n usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number };\n };\n try {\n parsed = JSON.parse(raw);\n } catch {\n continue;\n }\n\n const delta = parsed.candidates?.[0]?.content?.parts?.[0]?.text;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n\n if (parsed.usageMetadata) {\n usage = {\n promptTokens: parsed.usageMetadata.promptTokenCount,\n completionTokens: parsed.usageMetadata.candidatesTokenCount,\n };\n }\n }\n\n return { text, usage };\n }\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types';\nimport { readSseDataLines } from './stream-utils';\n\nexport interface OpenAiAdapterOptions {\n apiKey: string;\n model?: string;\n temperature?: number;\n baseUrl?: string;\n headers?: Record<string, string>;\n}\n\nexport class OpenAiAdapter implements AiProviderAdapter {\n readonly name = 'openai';\n private apiKey: string;\n private model: string;\n private temperature: number;\n private baseUrl: string;\n private customHeaders?: Record<string, string>;\n\n constructor(options: OpenAiAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('OpenAiAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'gpt-4o';\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl = (options.baseUrl || 'https://api.openai.com/v1').replace(/\\/+$/, '');\n this.customHeaders = options.headers;\n }\n\n private buildMessages(params: AiProviderGenerateParams): Array<{ role: string; content: string }> {\n const { systemPrompt, userPrompt, messages: chatMessages } = params;\n return chatMessages && chatMessages.length > 0\n ? [\n { role: 'system', content: systemPrompt },\n ...chatMessages.map((m) => ({ role: m.role, content: m.content })),\n ]\n : [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ];\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const { systemPrompt, signal } = params;\n\n const url = `${this.baseUrl}/chat/completions`;\n const messages = this.buildMessages(params);\n const chatMessages = params.messages;\n\n const body: Record<string, unknown> = {\n model: this.model,\n temperature: this.temperature,\n messages,\n };\n\n // Only force json_object when JSON schema is provided or specifically requested,\n // allowing natural conversation text in chat mode.\n if (params.jsonSchema || (!chatMessages && (systemPrompt.includes('JSON') || systemPrompt.includes('json')))) {\n body.response_format = { type: 'json_object' };\n }\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `OpenAI API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const data = (await res.json()) as {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n };\n\n const content = data.choices?.[0]?.message?.content;\n if (!content) {\n throw new Error('OpenAI returned an empty message content');\n }\n\n return {\n text: content,\n usage: data.usage\n ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via OpenAI's `stream: true` chat completions mode (STORA-515).\n * Yields each `delta.content` fragment as it arrives and returns the fully assembled\n * text + usage (when the final chunk includes it) once the stream ends.\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { signal } = params;\n const url = `${this.baseUrl}/chat/completions`;\n const messages = this.buildMessages(params);\n\n const body: Record<string, unknown> = {\n model: this.model,\n temperature: this.temperature,\n messages,\n stream: true,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `OpenAI API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n if (!res.body) {\n throw new Error('OpenAI streaming response has no readable body');\n }\n\n let text = '';\n let usage: AiProviderGenerateResult['usage'];\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n if (raw === '[DONE]') break;\n\n let parsed: {\n choices?: Array<{ delta?: { content?: string } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n };\n try {\n parsed = JSON.parse(raw);\n } catch {\n continue;\n }\n\n const delta = parsed.choices?.[0]?.delta?.content;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n\n if (parsed.usage) {\n usage = {\n promptTokens: parsed.usage.prompt_tokens,\n completionTokens: parsed.usage.completion_tokens,\n };\n }\n }\n\n return { text, usage };\n }\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types';\nimport { readSseDataLines } from './stream-utils';\n\nexport interface AnthropicAdapterOptions {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n baseUrl?: string;\n anthropicVersion?: string;\n headers?: Record<string, string>;\n}\n\nexport class AnthropicAdapter implements AiProviderAdapter {\n readonly name = 'anthropic';\n private apiKey: string;\n private model: string;\n private maxTokens: number;\n private temperature: number;\n private baseUrl: string;\n private anthropicVersion: string;\n private customHeaders?: Record<string, string>;\n\n constructor(options: AnthropicAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('AnthropicAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'claude-3-5-sonnet-20241022';\n this.maxTokens = options.maxTokens ?? 4096;\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl = (options.baseUrl || 'https://api.anthropic.com/v1').replace(/\\/+$/, '');\n this.anthropicVersion = options.anthropicVersion || '2023-06-01';\n this.customHeaders = options.headers;\n }\n\n private buildMessages(\n params: AiProviderGenerateParams,\n ): Array<{ role: 'user' | 'assistant'; content: string }> {\n const { userPrompt, messages: chatMessages } = params;\n return chatMessages && chatMessages.length > 0\n ? chatMessages\n .filter((m) => m.role === 'user' || m.role === 'assistant')\n .map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content }))\n : [\n {\n role: 'user' as const,\n content: userPrompt,\n },\n ];\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const { systemPrompt, signal } = params;\n\n const url = `${this.baseUrl}/messages`;\n const messages = this.buildMessages(params);\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n system: systemPrompt,\n messages,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': this.anthropicVersion,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Anthropic API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const data = (await res.json()) as {\n content?: Array<{\n type?: string;\n text?: string;\n }>;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n };\n\n const textPart = data.content?.find((c) => c.type === 'text')?.text;\n if (!textPart) {\n throw new Error('Anthropic returned an empty text content');\n }\n\n return {\n text: textPart,\n usage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via Anthropic's `stream: true` Messages API (STORA-515).\n * Parses the `content_block_delta` (`text_delta`) events for incremental text and the\n * `message_start`/`message_delta` events for usage accounting.\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { systemPrompt, signal } = params;\n const url = `${this.baseUrl}/messages`;\n const messages = this.buildMessages(params);\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n system: systemPrompt,\n messages,\n stream: true,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': this.anthropicVersion,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Anthropic API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n if (!res.body) {\n throw new Error('Anthropic streaming response has no readable body');\n }\n\n let text = '';\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n if (!raw) continue;\n\n let evt: {\n type?: string;\n delta?: { type?: string; text?: string };\n usage?: { output_tokens?: number };\n message?: { usage?: { input_tokens?: number } };\n };\n try {\n evt = JSON.parse(raw);\n } catch {\n continue;\n }\n\n if (evt.type === 'content_block_delta' && evt.delta?.type === 'text_delta') {\n const delta = evt.delta.text;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n } else if (evt.type === 'message_start' && evt.message?.usage?.input_tokens !== undefined) {\n promptTokens = evt.message.usage.input_tokens;\n } else if (evt.type === 'message_delta' && evt.usage?.output_tokens !== undefined) {\n completionTokens = evt.usage.output_tokens;\n }\n }\n\n return {\n text,\n usage:\n promptTokens !== undefined || completionTokens !== undefined\n ? { promptTokens, completionTokens }\n : undefined,\n };\n }\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types';\n\nexport interface CustomHttpAdapterOptions {\n url: string;\n name?: string;\n headers?: Record<string, string>;\n formatRequestBody?: (params: AiProviderGenerateParams) => unknown;\n parseResponse?: (json: unknown) => string;\n}\n\nexport class CustomHttpAdapter implements AiProviderAdapter {\n readonly name: string;\n private url: string;\n private headers?: Record<string, string>;\n private formatRequestBody: (params: AiProviderGenerateParams) => unknown;\n private parseResponse: (json: unknown) => string;\n\n constructor(options: CustomHttpAdapterOptions) {\n if (!options.url) {\n throw new Error('CustomHttpAdapter requires a url');\n }\n this.url = options.url;\n this.name = options.name || 'custom-http';\n this.headers = options.headers;\n\n // Default body formatter (OpenAI compatible or Ollama chat compatible)\n this.formatRequestBody =\n options.formatRequestBody ||\n ((params) => ({\n messages:\n params.messages && params.messages.length > 0\n ? [\n { role: 'system', content: params.systemPrompt },\n ...params.messages.map((m) => ({ role: m.role, content: m.content })),\n ]\n : [\n { role: 'system', content: params.systemPrompt },\n { role: 'user', content: params.userPrompt },\n ],\n }));\n\n // Default response parser\n this.parseResponse =\n options.parseResponse ||\n ((json: unknown) => {\n if (!json || typeof json !== 'object') {\n throw new Error('Response is not a valid JSON object');\n }\n const obj = json as Record<string, unknown>;\n if (typeof obj.response === 'string') return obj.response; // Ollama generate\n if (typeof obj.text === 'string') return obj.text;\n const choices = obj.choices as Array<{ message?: { content?: string } }>;\n if (Array.isArray(choices) && choices[0]?.message?.content) {\n return choices[0].message.content; // OpenAI format\n }\n const message = obj.message as { content?: string };\n if (message && typeof message.content === 'string') {\n return message.content; // Ollama chat format\n }\n throw new Error('Unable to extract generated text from custom HTTP response');\n });\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const body = this.formatRequestBody(params);\n\n const res = await fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n },\n body: JSON.stringify(body),\n signal: params.signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Custom HTTP adapter error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const json = await res.json();\n const text = this.parseResponse(json);\n\n return { text };\n }\n}\n"],"mappings":"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","names":["import_schema","encoder","readable"]}
@@ -0,0 +1,4 @@
1
+ export * from './engine';
2
+ export * from './handler';
3
+ export * from './adapters';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}