@renderify/core 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/api-integration.ts","../src/codegen.ts","../src/config.ts","../src/context.ts","../src/customization.ts","../src/performance.ts","../src/security.ts","../src/ui.ts"],"sourcesContent":["import type { RuntimeExecutionResult, RuntimePlan } from \"@renderify/ir\";\nimport type { RuntimeExecutionInput, RuntimeManager } from \"@renderify/runtime\";\nimport type { ApiIntegration } from \"./api-integration\";\nimport type {\n CodeGenerationInput,\n CodeGenerator,\n IncrementalCodeGenerationSession,\n} from \"./codegen\";\nimport type { RenderifyConfig } from \"./config\";\nimport type { ContextManager } from \"./context\";\nimport type {\n CustomizationEngine,\n PluginContext,\n PluginHook,\n} from \"./customization\";\nimport type {\n LLMInterpreter,\n LLMResponse,\n LLMResponseStreamChunk,\n LLMStructuredRequest,\n LLMStructuredResponse,\n} from \"./llm-interpreter\";\nimport type { PerformanceOptimizer } from \"./performance\";\nimport type {\n RuntimeSecurityPolicy,\n RuntimeSecurityProfile,\n SecurityChecker,\n SecurityCheckResult,\n} from \"./security\";\nimport type { RenderTarget, UIRenderer } from \"./ui\";\n\nexport interface RenderifyCoreDependencies {\n config: RenderifyConfig;\n context: ContextManager;\n llm: LLMInterpreter;\n codegen: CodeGenerator;\n runtime: RuntimeManager;\n security: SecurityChecker;\n performance: PerformanceOptimizer;\n ui: UIRenderer;\n apiIntegration?: ApiIntegration;\n customization?: CustomizationEngine;\n}\n\nexport interface RenderPromptOptions {\n target?: RenderTarget;\n traceId?: string;\n signal?: AbortSignal;\n}\n\nexport interface RenderPlanOptions {\n target?: RenderTarget;\n traceId?: string;\n prompt?: string;\n signal?: AbortSignal;\n}\n\nexport interface RenderPlanResult {\n traceId: string;\n plan: RuntimePlan;\n security: SecurityCheckResult;\n execution: RuntimeExecutionResult;\n html: string;\n}\n\nexport interface RenderPromptResult extends RenderPlanResult {\n prompt: string;\n llm: LLMResponse;\n}\n\nexport interface RenderPromptStreamOptions extends RenderPromptOptions {\n previewEveryChunks?: number;\n}\n\nexport interface RenderPromptStreamChunk {\n type: \"llm-delta\" | \"preview\" | \"final\" | \"error\";\n traceId: string;\n prompt: string;\n llmText: string;\n delta?: string;\n html?: string;\n diagnostics?: RuntimeExecutionResult[\"diagnostics\"];\n planId?: string;\n final?: RenderPromptResult;\n error?: {\n message: string;\n name?: string;\n };\n}\n\ninterface ExecutePlanFlowParams {\n traceId: string;\n metricLabel: string;\n plan: RuntimePlan;\n target?: RenderTarget;\n prompt?: string;\n signal?: AbortSignal;\n}\n\ntype EventCallback = (...args: unknown[]) => void;\n\nexport class PolicyRejectionError extends Error {\n readonly result: SecurityCheckResult;\n\n constructor(result: SecurityCheckResult) {\n super(`Security policy rejected runtime plan: ${result.issues.join(\"; \")}`);\n this.name = \"PolicyRejectionError\";\n this.result = result;\n }\n}\n\nexport class RenderifyApp {\n private readonly deps: RenderifyCoreDependencies;\n private readonly listeners = new Map<string, Set<EventCallback>>();\n private running = false;\n\n constructor(deps: RenderifyCoreDependencies) {\n this.deps = deps;\n }\n\n public async start(): Promise<void> {\n if (this.running) {\n return;\n }\n\n await this.deps.config.load();\n this.deps.llm.configure(this.deps.config.snapshot());\n await this.deps.context.initialize();\n\n const policyOverrides =\n this.deps.config.get<Partial<RuntimeSecurityPolicy>>(\"securityPolicy\");\n const securityProfile =\n this.deps.config.get<RuntimeSecurityProfile>(\"securityProfile\");\n this.deps.security.initialize({\n profile: securityProfile,\n overrides: policyOverrides,\n });\n\n await this.deps.runtime.initialize();\n\n this.running = true;\n this.emit(\"started\");\n }\n\n public async stop(): Promise<void> {\n if (!this.running) {\n return;\n }\n\n await this.deps.runtime.terminate();\n this.running = false;\n this.emit(\"stopped\");\n }\n\n public async renderPrompt(\n prompt: string,\n options: RenderPromptOptions = {},\n ): Promise<RenderPromptResult> {\n this.ensureRunning();\n this.throwIfAborted(options.signal);\n\n const traceId = options.traceId ?? this.createTraceId();\n const metricLabel = this.createMetricLabel(traceId);\n this.deps.performance.startMeasurement(metricLabel);\n\n let llmResponse: LLMResponse | undefined;\n let promptAfterHook = prompt;\n let handoffToPlanFlow = false;\n\n try {\n const pluginContextFactory = (hookName: PluginHook): PluginContext => ({\n traceId,\n hookName,\n });\n\n promptAfterHook = await this.runHook(\n \"beforeLLM\",\n prompt,\n pluginContextFactory(\"beforeLLM\"),\n );\n\n const llmContext = this.toRecord(this.deps.context.getContext());\n const llmRequestBase = {\n prompt: promptAfterHook,\n context: llmContext,\n signal: options.signal,\n };\n const llmUseStructuredOutput =\n this.deps.config.get<boolean>(\"llmUseStructuredOutput\") !== false;\n\n let llmStructuredResponse: LLMStructuredResponse<unknown> | undefined;\n let llmResponseRaw: LLMResponse;\n\n if (\n llmUseStructuredOutput &&\n typeof this.deps.llm.generateStructuredResponse === \"function\"\n ) {\n const structuredRequest: LLMStructuredRequest = {\n ...llmRequestBase,\n format: \"runtime-plan\",\n strict: true,\n };\n\n llmStructuredResponse =\n await this.deps.llm.generateStructuredResponse(structuredRequest);\n\n if (\n llmStructuredResponse.valid &&\n llmStructuredResponse.text.trim().length > 0\n ) {\n llmResponseRaw = {\n text: llmStructuredResponse.text,\n tokensUsed: llmStructuredResponse.tokensUsed,\n model: llmStructuredResponse.model,\n raw: {\n mode: \"structured\",\n value: llmStructuredResponse.value,\n errors: llmStructuredResponse.errors,\n payload: llmStructuredResponse.raw,\n },\n };\n } else {\n const fallbackResponse =\n await this.deps.llm.generateResponse(llmRequestBase);\n llmResponseRaw = {\n ...fallbackResponse,\n raw: {\n mode: \"fallback-text\",\n structuredErrors: llmStructuredResponse.errors ?? [],\n fallbackPayload: fallbackResponse.raw,\n },\n };\n }\n } else {\n llmResponseRaw = await this.deps.llm.generateResponse(llmRequestBase);\n }\n\n llmResponse = await this.runHook(\n \"afterLLM\",\n llmResponseRaw,\n pluginContextFactory(\"afterLLM\"),\n );\n\n const codegenInputRaw: CodeGenerationInput = {\n prompt: promptAfterHook,\n llmText: llmResponse.text,\n context: llmContext,\n };\n\n const codegenInput = await this.runHook(\n \"beforeCodeGen\",\n codegenInputRaw,\n pluginContextFactory(\"beforeCodeGen\"),\n );\n\n const planned = await this.deps.codegen.generatePlan(codegenInput);\n\n const planAfterCodegen = await this.runHook(\n \"afterCodeGen\",\n planned,\n pluginContextFactory(\"afterCodeGen\"),\n );\n\n handoffToPlanFlow = true;\n\n const planFlowResult = await this.executePlanFlow({\n traceId,\n metricLabel,\n prompt: promptAfterHook,\n plan: planAfterCodegen,\n target: options.target,\n signal: options.signal,\n });\n\n return {\n ...planFlowResult,\n prompt: promptAfterHook,\n llm: llmResponse,\n };\n } catch (error) {\n if (!handoffToPlanFlow) {\n const metric = this.deps.performance.endMeasurement(metricLabel);\n this.emit(\"renderFailed\", { traceId, metric, error });\n }\n\n throw error;\n }\n }\n\n public async *renderPromptStream(\n prompt: string,\n options: RenderPromptStreamOptions = {},\n ): AsyncGenerator<RenderPromptStreamChunk, RenderPromptResult> {\n this.ensureRunning();\n this.throwIfAborted(options.signal);\n\n const traceId = options.traceId ?? this.createTraceId();\n const metricLabel = this.createMetricLabel(traceId);\n this.deps.performance.startMeasurement(metricLabel);\n\n let promptAfterHook = prompt;\n let handoffToPlanFlow = false;\n let llmResponse: LLMResponse | undefined;\n\n try {\n const pluginContextFactory = (hookName: PluginHook): PluginContext => ({\n traceId,\n hookName,\n });\n\n promptAfterHook = await this.runHook(\n \"beforeLLM\",\n prompt,\n pluginContextFactory(\"beforeLLM\"),\n );\n\n const llmContext = this.toRecord(this.deps.context.getContext());\n const llmRequestBase = {\n prompt: promptAfterHook,\n context: llmContext,\n signal: options.signal,\n };\n const incrementalCodegenSession:\n | IncrementalCodeGenerationSession\n | undefined =\n typeof this.deps.codegen.createIncrementalSession === \"function\"\n ? this.deps.codegen.createIncrementalSession({\n prompt: promptAfterHook,\n context: llmContext,\n })\n : undefined;\n const llmUseStructuredOutput =\n this.deps.config.get<boolean>(\"llmUseStructuredOutput\") !== false;\n\n const streamPreviewInterval = Math.max(\n 1,\n Math.floor(options.previewEveryChunks ?? 2),\n );\n const buildPreviewChunk = async (\n llmText: string,\n delta?: string,\n ): Promise<RenderPromptStreamChunk | undefined> => {\n const preview = await this.buildStreamingPreview(\n promptAfterHook,\n llmText,\n llmContext,\n options.target,\n incrementalCodegenSession,\n delta,\n options.signal,\n );\n if (!preview) {\n return undefined;\n }\n\n return {\n type: \"preview\",\n traceId,\n prompt: promptAfterHook,\n llmText,\n html: preview.html,\n diagnostics: preview.execution.diagnostics,\n planId: preview.plan.id,\n };\n };\n\n if (\n llmUseStructuredOutput &&\n typeof this.deps.llm.generateStructuredResponse === \"function\"\n ) {\n const structuredRequest: LLMStructuredRequest = {\n ...llmRequestBase,\n format: \"runtime-plan\",\n strict: true,\n };\n\n const structuredResponse =\n await this.deps.llm.generateStructuredResponse(structuredRequest);\n\n if (\n structuredResponse.valid &&\n structuredResponse.text.trim().length > 0\n ) {\n const fullText = structuredResponse.text;\n const chunkSize = Math.max(256, Math.floor(fullText.length / 4));\n let latestText = \"\";\n\n for (let offset = 0; offset < fullText.length; offset += chunkSize) {\n const delta = fullText.slice(offset, offset + chunkSize);\n latestText += delta;\n const done = latestText.length >= fullText.length;\n\n yield {\n type: \"llm-delta\",\n traceId,\n prompt: promptAfterHook,\n llmText: latestText,\n delta,\n };\n\n if (done) {\n const previewChunk = await buildPreviewChunk(latestText, delta);\n if (previewChunk) {\n yield previewChunk;\n }\n }\n }\n\n llmResponse = {\n text: fullText,\n tokensUsed: structuredResponse.tokensUsed ?? fullText.length,\n model: structuredResponse.model,\n raw: {\n mode: \"structured\",\n value: structuredResponse.value,\n errors: structuredResponse.errors,\n payload: structuredResponse.raw,\n },\n };\n } else {\n let fallbackRaw: LLMResponse;\n\n if (typeof this.deps.llm.generateResponseStream === \"function\") {\n let latestText = \"\";\n let latestChunk: LLMResponseStreamChunk | undefined;\n let chunkCount = 0;\n\n for await (const chunk of this.deps.llm.generateResponseStream(\n llmRequestBase,\n )) {\n this.throwIfAborted(options.signal);\n chunkCount += 1;\n latestChunk = chunk;\n latestText = chunk.text;\n\n yield {\n type: \"llm-delta\",\n traceId,\n prompt: promptAfterHook,\n llmText: latestText,\n delta: chunk.delta,\n };\n\n if (chunk.done || chunkCount % streamPreviewInterval === 0) {\n const previewChunk = await buildPreviewChunk(\n latestText,\n chunk.delta,\n );\n if (previewChunk) {\n yield previewChunk;\n }\n }\n }\n\n fallbackRaw = {\n text: latestText,\n tokensUsed: latestChunk?.tokensUsed ?? latestText.length,\n model: latestChunk?.model,\n raw: {\n mode: \"stream\",\n source: latestChunk?.raw,\n },\n };\n } else {\n fallbackRaw = await this.deps.llm.generateResponse(llmRequestBase);\n yield {\n type: \"llm-delta\",\n traceId,\n prompt: promptAfterHook,\n llmText: fallbackRaw.text,\n delta: fallbackRaw.text,\n };\n }\n\n llmResponse = {\n ...fallbackRaw,\n raw: {\n mode: \"fallback-text\",\n structuredErrors: structuredResponse.errors ?? [],\n fallbackPayload: fallbackRaw.raw,\n },\n };\n }\n } else if (typeof this.deps.llm.generateResponseStream === \"function\") {\n let latestText = \"\";\n let latestChunk: LLMResponseStreamChunk | undefined;\n let chunkCount = 0;\n\n for await (const chunk of this.deps.llm.generateResponseStream(\n llmRequestBase,\n )) {\n this.throwIfAborted(options.signal);\n chunkCount += 1;\n latestChunk = chunk;\n latestText = chunk.text;\n\n yield {\n type: \"llm-delta\",\n traceId,\n prompt: promptAfterHook,\n llmText: latestText,\n delta: chunk.delta,\n };\n\n if (chunk.done || chunkCount % streamPreviewInterval === 0) {\n const previewChunk = await buildPreviewChunk(\n latestText,\n chunk.delta,\n );\n if (previewChunk) {\n yield previewChunk;\n }\n }\n }\n\n llmResponse = {\n text: latestText,\n tokensUsed: latestChunk?.tokensUsed ?? latestText.length,\n model: latestChunk?.model,\n raw: {\n mode: \"stream\",\n source: latestChunk?.raw,\n },\n };\n } else {\n llmResponse = await this.deps.llm.generateResponse(llmRequestBase);\n yield {\n type: \"llm-delta\",\n traceId,\n prompt: promptAfterHook,\n llmText: llmResponse.text,\n delta: llmResponse.text,\n };\n }\n\n llmResponse = await this.runHook(\n \"afterLLM\",\n llmResponse,\n pluginContextFactory(\"afterLLM\"),\n );\n\n const codegenInputRaw: CodeGenerationInput = {\n prompt: promptAfterHook,\n llmText: llmResponse.text,\n context: llmContext,\n };\n\n const codegenInput = await this.runHook(\n \"beforeCodeGen\",\n codegenInputRaw,\n pluginContextFactory(\"beforeCodeGen\"),\n );\n\n const planned =\n (await incrementalCodegenSession?.finalize(llmResponse.text)) ??\n (await this.deps.codegen.generatePlan(codegenInput));\n const planAfterCodegen = await this.runHook(\n \"afterCodeGen\",\n planned,\n pluginContextFactory(\"afterCodeGen\"),\n );\n\n handoffToPlanFlow = true;\n\n const planFlowResult = await this.executePlanFlow({\n traceId,\n metricLabel,\n prompt: promptAfterHook,\n plan: planAfterCodegen,\n target: options.target,\n signal: options.signal,\n });\n\n const final: RenderPromptResult = {\n ...planFlowResult,\n prompt: promptAfterHook,\n llm: llmResponse,\n };\n\n yield {\n type: \"final\",\n traceId,\n prompt: promptAfterHook,\n llmText: llmResponse.text,\n html: final.html,\n diagnostics: final.execution.diagnostics,\n planId: final.plan.id,\n final,\n };\n\n return final;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorName = error instanceof Error ? error.name : undefined;\n\n yield {\n type: \"error\",\n traceId,\n prompt: promptAfterHook,\n llmText: llmResponse?.text ?? \"\",\n error: {\n message: errorMessage,\n ...(errorName ? { name: errorName } : {}),\n },\n };\n\n if (!handoffToPlanFlow) {\n const metric = this.deps.performance.endMeasurement(metricLabel);\n this.emit(\"renderFailed\", { traceId, metric, error });\n }\n\n throw error;\n }\n }\n\n public async renderPlan(\n plan: RuntimePlan,\n options: RenderPlanOptions = {},\n ): Promise<RenderPlanResult> {\n this.ensureRunning();\n\n const traceId = options.traceId ?? this.createTraceId();\n const metricLabel = this.createMetricLabel(traceId);\n this.deps.performance.startMeasurement(metricLabel);\n\n return this.executePlanFlow({\n traceId,\n metricLabel,\n prompt: options.prompt,\n plan,\n target: options.target,\n signal: options.signal,\n });\n }\n\n public getConfig() {\n return this.deps.config;\n }\n\n public getContext() {\n return this.deps.context;\n }\n\n public getLLM() {\n return this.deps.llm;\n }\n\n public getCodeGenerator() {\n return this.deps.codegen;\n }\n\n public getRuntimeManager() {\n return this.deps.runtime;\n }\n\n public getSecurityChecker() {\n return this.deps.security;\n }\n\n public on(eventName: string, callback: EventCallback): () => void {\n if (!this.listeners.has(eventName)) {\n this.listeners.set(eventName, new Set());\n }\n\n this.listeners.get(eventName)?.add(callback);\n\n return () => {\n this.listeners.get(eventName)?.delete(callback);\n };\n }\n\n public emit(eventName: string, payload?: unknown) {\n const callbacks = this.listeners.get(eventName);\n if (!callbacks) {\n return;\n }\n\n for (const callback of callbacks) {\n callback(payload);\n }\n }\n\n private async executePlanFlow(\n params: ExecutePlanFlowParams,\n ): Promise<RenderPlanResult> {\n const { traceId, metricLabel, prompt, plan, target, signal } = params;\n this.throwIfAborted(signal);\n\n try {\n const pluginContextFactory = (hookName: PluginHook): PluginContext => ({\n traceId,\n hookName,\n });\n\n const planBeforePolicy = await this.runHook(\n \"beforePolicyCheck\",\n plan,\n pluginContextFactory(\"beforePolicyCheck\"),\n );\n\n const securityResultRaw =\n await this.deps.security.checkPlan(planBeforePolicy);\n const securityResult = await this.runHook(\n \"afterPolicyCheck\",\n securityResultRaw,\n pluginContextFactory(\"afterPolicyCheck\"),\n );\n\n if (!securityResult.safe) {\n this.emit(\"policyRejected\", securityResult);\n throw new PolicyRejectionError(securityResult);\n }\n\n const runtimeInputRaw: RuntimeExecutionInput = {\n plan: planBeforePolicy,\n context: {\n userId: this.resolveUserId(),\n variables: {},\n },\n signal,\n };\n\n const runtimeInput = await this.runHook(\n \"beforeRuntime\",\n runtimeInputRaw,\n pluginContextFactory(\"beforeRuntime\"),\n );\n\n const runtimeExecutionRaw = await this.deps.runtime.execute(runtimeInput);\n\n const runtimeExecution = await this.runHook(\n \"afterRuntime\",\n runtimeExecutionRaw,\n pluginContextFactory(\"afterRuntime\"),\n );\n\n const renderInput = await this.runHook(\n \"beforeRender\",\n runtimeExecution,\n pluginContextFactory(\"beforeRender\"),\n );\n\n const htmlRaw = await this.deps.ui.render(renderInput, target);\n this.throwIfAborted(signal);\n\n const html = await this.runHook(\n \"afterRender\",\n htmlRaw,\n pluginContextFactory(\"afterRender\"),\n );\n\n const metric = this.deps.performance.endMeasurement(metricLabel);\n this.emit(\"rendered\", {\n traceId,\n metric,\n prompt,\n planId: planBeforePolicy.id,\n });\n\n return {\n traceId,\n plan: planBeforePolicy,\n security: securityResult,\n execution: runtimeExecution,\n html,\n };\n } catch (error) {\n const metric = this.deps.performance.endMeasurement(metricLabel);\n this.emit(\"renderFailed\", { traceId, metric, prompt, error });\n throw error;\n }\n }\n\n private ensureRunning(): void {\n if (!this.running) {\n throw new Error(\"RenderifyApp is not started\");\n }\n }\n\n private async runHook<Payload>(\n hookName: PluginHook,\n payload: Payload,\n context: PluginContext,\n ): Promise<Payload> {\n if (!this.deps.customization) {\n return payload;\n }\n\n return this.deps.customization.runHook(hookName, payload, context);\n }\n\n private toRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) {\n return {};\n }\n\n return value as Record<string, unknown>;\n }\n\n private createTraceId(): string {\n return `trace_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n }\n\n private createMetricLabel(traceId: string): string {\n return `pipeline:${traceId}`;\n }\n\n private resolveUserId(): string {\n const candidate = this.deps.context.getContext().user?.id;\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n return candidate.trim();\n }\n\n return \"anonymous\";\n }\n\n private async buildStreamingPreview(\n prompt: string,\n llmText: string,\n context: Record<string, unknown>,\n target?: RenderTarget,\n incrementalCodegenSession?: IncrementalCodeGenerationSession,\n delta?: string,\n signal?: AbortSignal,\n ): Promise<\n | {\n plan: RuntimePlan;\n execution: RuntimeExecutionResult;\n html: string;\n }\n | undefined\n > {\n try {\n this.throwIfAborted(signal);\n let plan: RuntimePlan | undefined;\n\n if (incrementalCodegenSession) {\n if (typeof delta === \"string\" && delta.length > 0) {\n const incrementalUpdate =\n await incrementalCodegenSession.pushDelta(delta);\n plan = incrementalUpdate?.plan;\n }\n\n if (!plan) {\n return undefined;\n }\n } else {\n plan = await this.deps.codegen.generatePlan({\n prompt,\n llmText,\n context,\n });\n }\n\n const security = await this.deps.security.checkPlan(plan);\n if (!security.safe) {\n return undefined;\n }\n\n const execution = await this.deps.runtime.execute({\n plan,\n context: {\n userId: this.resolveUserId(),\n variables: {},\n },\n signal,\n });\n const html = await this.deps.ui.render(execution, target);\n\n return {\n plan,\n execution,\n html,\n };\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw error;\n }\n return undefined;\n }\n }\n\n private throwIfAborted(signal?: AbortSignal): void {\n if (!signal?.aborted) {\n return;\n }\n\n const error = new Error(\"Renderify request aborted\");\n error.name = \"AbortError\";\n throw error;\n }\n}\n\nexport function createRenderifyApp(\n deps: RenderifyCoreDependencies,\n): RenderifyApp {\n return new RenderifyApp(deps);\n}\n\nexport * from \"./api-integration\";\nexport * from \"./codegen\";\nexport * from \"./config\";\nexport * from \"./context\";\nexport * from \"./customization\";\nexport * from \"./llm-interpreter\";\nexport * from \"./performance\";\nexport * from \"./security\";\nexport * from \"./ui\";\n","export interface ApiDefinition {\n name: string;\n endpoint: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n headers?: Record<string, string>;\n timeoutMs?: number;\n}\n\nexport interface ApiIntegration {\n registerApi(api: ApiDefinition): void;\n listApis(): ApiDefinition[];\n callApi<TResponse = unknown>(\n name: string,\n params?: Record<string, unknown>,\n ): Promise<TResponse>;\n}\n\nexport class DefaultApiIntegration implements ApiIntegration {\n private readonly apis: Map<string, ApiDefinition> = new Map();\n\n registerApi(api: ApiDefinition): void {\n this.apis.set(api.name, api);\n }\n\n listApis(): ApiDefinition[] {\n return [...this.apis.values()];\n }\n\n async callApi<TResponse = unknown>(\n name: string,\n params?: Record<string, unknown>,\n ): Promise<TResponse> {\n const api = this.apis.get(name);\n if (!api) {\n throw new Error(`API not found: ${name}`);\n }\n\n const controller =\n typeof AbortController !== \"undefined\"\n ? new AbortController()\n : undefined;\n const timeout = this.createTimeout(controller, api.timeoutMs ?? 10_000);\n\n try {\n const url = this.buildUrl(api, params);\n const init: RequestInit = {\n method: api.method,\n headers: {\n \"content-type\": \"application/json\",\n ...(api.headers ?? {}),\n },\n signal: controller?.signal,\n };\n\n if (api.method !== \"GET\" && api.method !== \"DELETE\" && params) {\n init.body = JSON.stringify(params);\n }\n\n const response = await fetch(url, init);\n if (!response.ok) {\n const bodyText = await response.text();\n throw new Error(\n `API ${name} failed with ${response.status}: ${bodyText}`,\n );\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return (await response.json()) as TResponse;\n }\n\n return (await response.text()) as TResponse;\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n }\n\n private buildUrl(\n api: ApiDefinition,\n params?: Record<string, unknown>,\n ): string {\n if (!params || (api.method !== \"GET\" && api.method !== \"DELETE\")) {\n return api.endpoint;\n }\n\n const url = new URL(api.endpoint);\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n url.searchParams.set(key, String(value));\n }\n\n return url.toString();\n }\n\n private createTimeout(\n controller: AbortController | undefined,\n timeoutMs: number,\n ): ReturnType<typeof setTimeout> | undefined {\n if (!controller || timeoutMs <= 0) {\n return undefined;\n }\n\n return setTimeout(() => controller.abort(), timeoutMs);\n }\n}\n","import {\n collectComponentModules,\n collectRuntimeSourceImports,\n createElementNode,\n createFnv1a64Hasher,\n createTextNode,\n DEFAULT_JSPM_SPECIFIER_OVERRIDES,\n DEFAULT_RUNTIME_PLAN_SPEC_VERSION,\n isRuntimeCapabilities,\n isRuntimeModuleManifest,\n isRuntimeNode,\n isRuntimePlanMetadata,\n isRuntimeSourceModule,\n isRuntimeStateModel,\n type RuntimeCapabilities,\n type RuntimeModuleManifest,\n type RuntimeNode,\n type RuntimePlan,\n type RuntimePlanMetadata,\n type RuntimeSourceModule,\n type RuntimeSourceRuntime,\n type RuntimeStateModel,\n resolveRuntimePlanSpecVersion,\n} from \"@renderify/ir\";\n\nexport interface CodeGenerationInput {\n prompt: string;\n llmText: string;\n context?: Record<string, unknown>;\n}\n\nexport interface IncrementalCodeGenerationInput {\n prompt: string;\n context?: Record<string, unknown>;\n}\n\nexport interface IncrementalCodeGenerationUpdate {\n plan: RuntimePlan;\n complete: boolean;\n mode:\n | \"runtime-plan-json\"\n | \"runtime-node-json\"\n | \"runtime-source\"\n | \"runtime-text-fallback\";\n}\n\nexport interface IncrementalCodeGenerationSession {\n pushDelta(\n delta: string,\n ): Promise<IncrementalCodeGenerationUpdate | undefined>;\n finalize(finalText?: string): Promise<RuntimePlan | undefined>;\n}\n\nexport interface CodeGenerator {\n generatePlan(input: CodeGenerationInput): Promise<RuntimePlan>;\n createIncrementalSession?(\n input: IncrementalCodeGenerationInput,\n ): IncrementalCodeGenerationSession;\n validatePlan(plan: RuntimePlan): Promise<boolean>;\n transformPlan(\n plan: RuntimePlan,\n transforms: Array<(plan: RuntimePlan) => RuntimePlan>,\n ): Promise<RuntimePlan>;\n}\n\nexport class DefaultCodeGenerator implements CodeGenerator {\n createIncrementalSession(\n input: IncrementalCodeGenerationInput,\n ): IncrementalCodeGenerationSession {\n let buffer = \"\";\n let lastSignature = \"\";\n\n const tryGenerate = async (): Promise<\n IncrementalCodeGenerationUpdate | undefined\n > => {\n const candidate = await this.tryBuildIncrementalCandidate(\n input.prompt,\n buffer,\n );\n if (!candidate) {\n return undefined;\n }\n\n const signature = this.createIncrementalPlanSignature(candidate.plan);\n if (signature === lastSignature) {\n return undefined;\n }\n\n lastSignature = signature;\n return candidate;\n };\n\n return {\n pushDelta: async (delta: string) => {\n if (delta.length > 0) {\n buffer += delta;\n }\n\n return await tryGenerate();\n },\n finalize: async (finalText?: string) => {\n if (typeof finalText === \"string\" && finalText.length > 0) {\n buffer = finalText;\n }\n\n const candidate = await tryGenerate();\n return candidate?.plan;\n },\n };\n }\n\n async generatePlan(input: CodeGenerationInput): Promise<RuntimePlan> {\n const parsedPlan = await this.tryParseRuntimePlan(\n input.llmText,\n input.prompt,\n );\n if (parsedPlan) {\n return parsedPlan;\n }\n\n const source = this.tryExtractRuntimeSource(input.llmText);\n if (source) {\n return await this.createSourcePlan(input.prompt, source);\n }\n\n const parsedRoot = this.tryParseRuntimeNode(input.llmText);\n const root =\n parsedRoot ?? this.createFallbackRoot(input.prompt, input.llmText);\n const imports = collectComponentModules(root);\n\n return this.createPlanFromRoot(root, {\n prompt: input.prompt,\n imports,\n capabilities: {\n domWrite: true,\n allowedModules: imports,\n },\n });\n }\n\n async validatePlan(plan: RuntimePlan): Promise<boolean> {\n if (!plan.id || !Number.isInteger(plan.version) || plan.version <= 0) {\n return false;\n }\n\n if (!isRuntimeNode(plan.root)) {\n return false;\n }\n\n return typeof plan.capabilities === \"object\" && plan.capabilities !== null;\n }\n\n async transformPlan(\n plan: RuntimePlan,\n transforms: Array<(plan: RuntimePlan) => RuntimePlan>,\n ): Promise<RuntimePlan> {\n return transforms.reduce((current, transform) => transform(current), plan);\n }\n\n private createFallbackRoot(prompt: string, llmText: string): RuntimeNode {\n const title = prompt.trim().length > 0 ? prompt.trim() : \"Untitled prompt\";\n const summary =\n llmText.trim().length > 0 ? llmText.trim() : \"No model output\";\n\n return createElementNode(\"section\", { class: \"renderify-runtime-output\" }, [\n createElementNode(\"h1\", undefined, [createTextNode(title)]),\n createElementNode(\"p\", undefined, [createTextNode(summary)]),\n ]);\n }\n\n private async tryBuildIncrementalCandidate(\n prompt: string,\n llmText: string,\n ): Promise<IncrementalCodeGenerationUpdate | undefined> {\n const parsedPlan = await this.tryParseRuntimePlan(llmText, prompt);\n if (parsedPlan) {\n return {\n plan: parsedPlan,\n complete: this.isLikelyCompleteJsonPayload(llmText),\n mode: \"runtime-plan-json\",\n };\n }\n\n const parsedNode = this.tryParseRuntimeNode(llmText);\n if (parsedNode) {\n return {\n plan: this.createPlanFromRoot(parsedNode, {\n prompt,\n imports: collectComponentModules(parsedNode),\n capabilities: {\n domWrite: true,\n allowedModules: collectComponentModules(parsedNode),\n },\n }),\n complete: this.isLikelyCompleteJsonPayload(llmText),\n mode: \"runtime-node-json\",\n };\n }\n\n const source = this.tryExtractRuntimeSource(llmText);\n if (source) {\n return {\n plan: await this.createSourcePlan(prompt, source),\n complete: this.hasClosedCodeFence(llmText),\n mode: \"runtime-source\",\n };\n }\n\n const fallbackRoot = this.createFallbackRoot(prompt, llmText);\n const fallbackImports = collectComponentModules(fallbackRoot);\n return {\n plan: this.createPlanFromRoot(fallbackRoot, {\n prompt,\n imports: fallbackImports,\n capabilities: {\n domWrite: true,\n allowedModules: fallbackImports,\n },\n }),\n complete: false,\n mode: \"runtime-text-fallback\",\n };\n }\n\n private createIncrementalPlanSignature(plan: RuntimePlan): string {\n // Use a stable streaming hash to avoid allocating large JSON signatures.\n return this.hashIncrementalSignatureValue({\n root: plan.root,\n imports: plan.imports ?? [],\n source: plan.source,\n capabilities: plan.capabilities,\n state: plan.state,\n });\n }\n\n private hashIncrementalSignatureValue(value: unknown): string {\n // 64-bit FNV-1a is a deliberate performance trade-off for streaming updates:\n // collisions are possible (though rare), so this prioritizes low allocation\n // and speed over cryptographic uniqueness.\n const hasher = createFnv1a64Hasher();\n\n const update = (chunk: string): void => {\n hasher.update(chunk);\n };\n\n const visit = (input: unknown): void => {\n if (input === null) {\n update(\"null;\");\n return;\n }\n if (input === undefined) {\n update(\"undefined;\");\n return;\n }\n if (typeof input === \"string\") {\n update(`s:${input};`);\n return;\n }\n if (typeof input === \"number\") {\n update(Number.isFinite(input) ? `n:${String(input)};` : \"n:null;\");\n return;\n }\n if (typeof input === \"boolean\") {\n update(input ? \"b:1;\" : \"b:0;\");\n return;\n }\n if (Array.isArray(input)) {\n update(\"a:[\");\n for (const entry of input) {\n visit(entry);\n }\n update(\"];\");\n return;\n }\n if (typeof input === \"object\") {\n const entries = Object.entries(input as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n update(\"o:{\");\n for (const [key, entryValue] of entries) {\n update(`k:${key}=`);\n visit(entryValue);\n }\n update(\"};\");\n return;\n }\n update(`x:${String(input)};`);\n };\n\n visit(value);\n return hasher.digestHex();\n }\n\n private createPlanFromRoot(\n root: RuntimeNode,\n input: {\n prompt: string;\n imports?: string[];\n capabilities?: RuntimeCapabilities;\n metadata?: RuntimePlanMetadata;\n id?: string;\n version?: number;\n specVersion?: string;\n state?: RuntimeStateModel;\n moduleManifest?: RuntimeModuleManifest;\n source?: RuntimeSourceModule;\n },\n ): RuntimePlan {\n const imports =\n this.normalizeImports(input.imports) ?? collectComponentModules(root);\n const source = this.normalizeSourceModule(input.source);\n const moduleManifest =\n this.normalizeModuleManifest(input.moduleManifest) ??\n this.createModuleManifestFromImports(imports);\n const capabilities = this.normalizeCapabilities(\n input.capabilities,\n imports,\n );\n const metadata = this.normalizeMetadata(input.prompt, input.metadata);\n const id = this.normalizePlanId(input.id);\n const version = this.normalizePlanVersion(input.version);\n\n return {\n specVersion: resolveRuntimePlanSpecVersion(\n input.specVersion ?? DEFAULT_RUNTIME_PLAN_SPEC_VERSION,\n ),\n id,\n version,\n root,\n imports,\n ...(moduleManifest ? { moduleManifest } : {}),\n capabilities,\n ...(metadata ? { metadata } : {}),\n ...(input.state ? { state: input.state } : {}),\n ...(source ? { source } : {}),\n };\n }\n\n private async tryParseRuntimePlan(\n text: string,\n prompt: string,\n ): Promise<RuntimePlan | undefined> {\n const parsed = this.tryParseJsonPayload(text);\n if (!this.isRecord(parsed) || !(\"root\" in parsed)) {\n return undefined;\n }\n\n const root = parsed.root;\n if (!isRuntimeNode(root)) {\n return undefined;\n }\n\n const metadata = this.isRecord(parsed.metadata)\n ? isRuntimePlanMetadata(parsed.metadata)\n ? parsed.metadata\n : undefined\n : undefined;\n const moduleManifest =\n this.isRecord(parsed.moduleManifest) &&\n isRuntimeModuleManifest(parsed.moduleManifest)\n ? parsed.moduleManifest\n : undefined;\n\n const state =\n this.isRecord(parsed.state) && isRuntimeStateModel(parsed.state)\n ? parsed.state\n : undefined;\n const source =\n this.isRecord(parsed.source) && isRuntimeSourceModule(parsed.source)\n ? parsed.source\n : undefined;\n const importsFromPayload = Array.isArray(parsed.imports)\n ? (parsed.imports as unknown[])\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n : undefined;\n const importsFromManifest = moduleManifest\n ? Object.keys(moduleManifest)\n : undefined;\n const imports =\n importsFromPayload ??\n importsFromManifest ??\n (source ? await this.parseImportsFromSource(source.code) : undefined);\n\n return this.createPlanFromRoot(root, {\n prompt,\n specVersion:\n typeof parsed.specVersion === \"string\" ? parsed.specVersion : undefined,\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n version: typeof parsed.version === \"number\" ? parsed.version : undefined,\n imports,\n moduleManifest,\n capabilities:\n this.isRecord(parsed.capabilities) &&\n isRuntimeCapabilities(parsed.capabilities)\n ? parsed.capabilities\n : undefined,\n metadata,\n state,\n source,\n });\n }\n\n private tryParseRuntimeNode(text: string): RuntimeNode | undefined {\n const parsed = this.tryParseJsonPayload(text);\n if (isRuntimeNode(parsed)) {\n return parsed;\n }\n\n return undefined;\n }\n\n private tryParseJsonPayload(text: string): unknown {\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)\\s*```/i);\n const payload = codeBlockMatch ? codeBlockMatch[1] : text;\n const trimmed = payload.trim();\n\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n return undefined;\n }\n\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return undefined;\n }\n }\n\n private isLikelyCompleteJsonPayload(text: string): boolean {\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)\\s*```/i);\n const payload = codeBlockMatch ? codeBlockMatch[1] : text;\n const trimmed = payload.trim();\n\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n return false;\n }\n\n const stack: string[] = [];\n let inString = false;\n let escaped = false;\n\n for (const char of trimmed) {\n if (inString) {\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n\n if (char === \"}\" || char === \"]\") {\n const top = stack.pop();\n if (!top) {\n return false;\n }\n if ((char === \"}\" && top !== \"{\") || (char === \"]\" && top !== \"[\")) {\n return false;\n }\n }\n }\n\n return !inString && stack.length === 0;\n }\n\n private hasClosedCodeFence(text: string): boolean {\n const fences = text.match(/```/g);\n return Boolean(fences && fences.length >= 2 && fences.length % 2 === 0);\n }\n\n private normalizePlanId(id?: string): string {\n if (typeof id === \"string\" && id.trim().length > 0) {\n return id.trim();\n }\n\n return `plan_${Date.now().toString(36)}`;\n }\n\n private normalizePlanVersion(version?: number): number {\n if (Number.isInteger(version) && (version as number) > 0) {\n return version as number;\n }\n\n return 1;\n }\n\n private normalizeImports(imports?: string[]): string[] | undefined {\n if (!imports || imports.length === 0) {\n return undefined;\n }\n\n return [...new Set(imports)];\n }\n\n private normalizeModuleManifest(\n manifest?: RuntimeModuleManifest,\n ): RuntimeModuleManifest | undefined {\n if (!manifest || Object.keys(manifest).length === 0) {\n return undefined;\n }\n\n return manifest;\n }\n\n private normalizeCapabilities(\n capabilities: RuntimeCapabilities | undefined,\n imports: string[],\n ): RuntimeCapabilities {\n const normalized: RuntimeCapabilities = {\n domWrite: true,\n allowedModules: imports,\n ...(capabilities ?? {}),\n };\n\n if (!Array.isArray(normalized.allowedModules)) {\n normalized.allowedModules = imports;\n }\n\n if (\n typeof normalized.maxImports === \"number\" &&\n (!Number.isFinite(normalized.maxImports) || normalized.maxImports < 0)\n ) {\n delete normalized.maxImports;\n }\n\n if (\n typeof normalized.maxExecutionMs === \"number\" &&\n (!Number.isFinite(normalized.maxExecutionMs) ||\n normalized.maxExecutionMs < 1)\n ) {\n delete normalized.maxExecutionMs;\n }\n\n if (\n typeof normalized.maxComponentInvocations === \"number\" &&\n (!Number.isFinite(normalized.maxComponentInvocations) ||\n normalized.maxComponentInvocations < 0)\n ) {\n delete normalized.maxComponentInvocations;\n }\n\n return normalized;\n }\n\n private createModuleManifestFromImports(\n imports: string[],\n ): RuntimeModuleManifest | undefined {\n if (imports.length === 0) {\n return undefined;\n }\n\n const manifest: RuntimeModuleManifest = {};\n for (const specifier of imports) {\n const resolvedUrl = this.resolveImportToUrl(specifier);\n const version = this.extractVersionFromSpecifier(specifier);\n manifest[specifier] = {\n resolvedUrl,\n ...(version ? { version } : {}),\n signer: \"renderify-codegen\",\n };\n }\n\n return manifest;\n }\n\n private resolveImportToUrl(specifier: string): string {\n if (this.isHttpUrl(specifier)) {\n return specifier;\n }\n\n if (\n specifier.startsWith(\"./\") ||\n specifier.startsWith(\"../\") ||\n specifier.startsWith(\"/\")\n ) {\n return specifier;\n }\n\n if (specifier.startsWith(\"npm:\")) {\n return this.resolveJspmSpecifier(specifier.slice(4));\n }\n\n return this.resolveJspmSpecifier(specifier);\n }\n\n private extractVersionFromSpecifier(specifier: string): string | undefined {\n if (!specifier.startsWith(\"npm:\")) {\n return undefined;\n }\n\n const body = specifier.slice(4);\n const atIndex = body.lastIndexOf(\"@\");\n if (atIndex <= 0) {\n return undefined;\n }\n\n const version = body.slice(atIndex + 1).trim();\n if (version.length === 0 || version.includes(\"/\")) {\n return undefined;\n }\n\n return version;\n }\n\n private normalizeMetadata(\n prompt: string,\n metadata?: RuntimePlanMetadata,\n ): RuntimePlanMetadata | undefined {\n const sourcePrompt = prompt.trim().length > 0 ? prompt.trim() : undefined;\n const merged = {\n ...(metadata ?? {}),\n ...(sourcePrompt ? { sourcePrompt } : {}),\n } as RuntimePlanMetadata;\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n }\n\n private tryExtractRuntimeSource(\n text: string,\n ): RuntimeSourceModule | undefined {\n const match = text.match(/```(tsx|jsx|ts|js)\\s*([\\s\\S]*?)\\s*```/i);\n\n if (!match) {\n return undefined;\n }\n\n const language = match[1].toLowerCase() as RuntimeSourceModule[\"language\"];\n const code = match[2].trim();\n if (code.length === 0) {\n return undefined;\n }\n\n return this.normalizeSourceModule({\n language,\n code,\n exportName: \"default\",\n });\n }\n\n private async createSourcePlan(\n prompt: string,\n source: RuntimeSourceModule,\n ): Promise<RuntimePlan> {\n const imports = await this.parseImportsFromSource(source.code);\n const normalizedSource = this.normalizeSourceModule(source);\n const sourceRuntime = normalizedSource?.runtime ?? \"renderify\";\n\n return this.createPlanFromRoot(\n createElementNode(\"section\", { class: \"renderify-runtime-source-plan\" }, [\n createElementNode(\"h2\", undefined, [createTextNode(prompt)]),\n createElementNode(\"p\", undefined, [\n createTextNode(`Runtime source module (${source.language}) prepared`),\n ]),\n ]),\n {\n prompt,\n imports,\n capabilities: {\n domWrite: true,\n allowedModules: imports,\n },\n metadata: {\n sourcePrompt: prompt,\n tags: [\"source-module\", source.language, `runtime:${sourceRuntime}`],\n },\n source: normalizedSource,\n },\n );\n }\n\n private async parseImportsFromSource(code: string): Promise<string[]> {\n return collectRuntimeSourceImports(code);\n }\n\n private isHttpUrl(value: string): boolean {\n try {\n const parsed = new URL(value);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n }\n\n private normalizeSourceModule(\n source?: RuntimeSourceModule,\n ): RuntimeSourceModule | undefined {\n if (!source) {\n return undefined;\n }\n\n const runtime =\n source.runtime ??\n this.inferSourceRuntimeFromLanguage(source.language, source.code);\n\n return {\n ...source,\n runtime,\n };\n }\n\n private inferSourceRuntimeFromLanguage(\n language: RuntimeSourceModule[\"language\"],\n code: string,\n ): RuntimeSourceRuntime {\n if (language === \"jsx\" || language === \"tsx\") {\n return \"preact\";\n }\n\n if (\n (language === \"js\" || language === \"ts\") &&\n /from\\s+[\"'](?:preact|react|recharts)[\"']/.test(code)\n ) {\n return \"preact\";\n }\n\n return \"renderify\";\n }\n\n private resolveJspmSpecifier(specifier: string): string {\n const normalized = specifier.trim();\n if (normalized.length === 0) {\n return \"https://ga.jspm.io/npm:missing\";\n }\n\n const override = DEFAULT_JSPM_SPECIFIER_OVERRIDES[normalized];\n if (override) {\n return override;\n }\n\n return `https://ga.jspm.io/npm:${normalized}`;\n }\n}\n","import type { RuntimeSecurityPolicy } from \"./security\";\n\nexport type SecurityProfileConfig = \"strict\" | \"balanced\" | \"relaxed\";\nexport type LLMProviderConfig = string;\n\nconst DEFAULT_RUNTIME_SPEC_VERSIONS = [\"runtime-plan/v1\"];\nconst DEFAULT_RUNTIME_REMOTE_FALLBACK_CDNS = [\"https://esm.sh\"];\nconst DEFAULT_JSPM_ALLOWED_NETWORK_HOSTS = [\"ga.jspm.io\", \"cdn.jspm.io\"];\n\nexport interface RenderifyConfigValues {\n llmApiKey?: string;\n llmProvider: LLMProviderConfig;\n llmModel: string;\n llmBaseUrl: string;\n llmRequestTimeoutMs: number;\n llmUseStructuredOutput: boolean;\n jspmCdnUrl: string;\n strictSecurity: boolean;\n securityProfile: SecurityProfileConfig;\n securityPolicy?: Partial<RuntimeSecurityPolicy>;\n runtimeJspmOnlyStrictMode: boolean;\n runtimeEnforceModuleManifest: boolean;\n runtimeAllowIsolationFallback: boolean;\n runtimeSupportedSpecVersions: string[];\n runtimeEnableDependencyPreflight: boolean;\n runtimeFailOnDependencyPreflightError: boolean;\n runtimeRemoteFetchTimeoutMs: number;\n runtimeRemoteFetchRetries: number;\n runtimeRemoteFetchBackoffMs: number;\n runtimeRemoteFallbackCdnBases: string[];\n runtimeBrowserSourceSandboxMode: \"none\" | \"worker\" | \"iframe\";\n runtimeBrowserSourceSandboxTimeoutMs: number;\n runtimeBrowserSourceSandboxFailClosed: boolean;\n [key: string]: unknown;\n}\n\nexport interface JspmOnlyStrictModeOptions {\n allowedNetworkHosts?: string[];\n}\n\nexport function createJspmOnlyStrictModeConfig(\n options: JspmOnlyStrictModeOptions = {},\n): Partial<RenderifyConfigValues> {\n const allowedNetworkHosts = normalizeJspmAllowedNetworkHosts(\n options.allowedNetworkHosts,\n );\n\n return {\n runtimeJspmOnlyStrictMode: true,\n strictSecurity: true,\n securityProfile: \"strict\",\n runtimeEnforceModuleManifest: true,\n runtimeAllowIsolationFallback: false,\n runtimeEnableDependencyPreflight: true,\n runtimeFailOnDependencyPreflightError: true,\n runtimeRemoteFallbackCdnBases: [],\n securityPolicy: {\n allowArbitraryNetwork: false,\n allowedNetworkHosts,\n requireModuleManifestForBareSpecifiers: true,\n requireModuleIntegrity: true,\n allowDynamicSourceImports: false,\n },\n };\n}\n\nexport interface RenderifyConfig {\n load(overrides?: Partial<RenderifyConfigValues>): Promise<void>;\n get<T = unknown>(key: string): T | undefined;\n set(key: string, value: unknown): void;\n snapshot(): Readonly<Record<string, unknown>>;\n save(): Promise<void>;\n}\n\nexport class DefaultRenderifyConfig implements RenderifyConfig {\n private config: Record<string, unknown> = {};\n\n async load(overrides?: Partial<RenderifyConfigValues>) {\n const env = getEnvironmentValues();\n const defaultValues: RenderifyConfigValues = {\n llmProvider: \"openai\",\n llmModel: \"gpt-4.1-mini\",\n llmBaseUrl: \"https://api.openai.com/v1\",\n llmRequestTimeoutMs: 30000,\n jspmCdnUrl: \"https://ga.jspm.io/npm\",\n strictSecurity: true,\n llmUseStructuredOutput: true,\n securityProfile: \"balanced\",\n runtimeJspmOnlyStrictMode: false,\n runtimeEnforceModuleManifest: true,\n runtimeAllowIsolationFallback: false,\n runtimeSupportedSpecVersions: [...DEFAULT_RUNTIME_SPEC_VERSIONS],\n runtimeEnableDependencyPreflight: true,\n runtimeFailOnDependencyPreflightError: false,\n runtimeRemoteFetchTimeoutMs: 12000,\n runtimeRemoteFetchRetries: 2,\n runtimeRemoteFetchBackoffMs: 150,\n runtimeRemoteFallbackCdnBases: [...DEFAULT_RUNTIME_REMOTE_FALLBACK_CDNS],\n runtimeBrowserSourceSandboxMode: \"worker\",\n runtimeBrowserSourceSandboxTimeoutMs: 4000,\n runtimeBrowserSourceSandboxFailClosed: true,\n };\n\n const merged = {\n ...defaultValues,\n ...env,\n ...(overrides ?? {}),\n } as RenderifyConfigValues;\n\n this.config = applyDerivedConfig(merged);\n }\n\n get<T = unknown>(key: string): T | undefined {\n return this.config[key] as T | undefined;\n }\n\n set(key: string, value: unknown) {\n this.config[key] = value;\n }\n\n snapshot(): Readonly<Record<string, unknown>> {\n return { ...this.config };\n }\n\n async save() {\n // Persistence strategy is intentionally left to host applications.\n }\n}\n\nfunction applyDerivedConfig(\n input: RenderifyConfigValues,\n): RenderifyConfigValues {\n if (input.runtimeJspmOnlyStrictMode !== true) {\n return input;\n }\n\n const existingPolicy = toSecurityPolicyOverrides(input.securityPolicy);\n const strictPreset = createJspmOnlyStrictModeConfig({\n allowedNetworkHosts: normalizeJspmAllowedNetworkHosts(\n existingPolicy.allowedNetworkHosts,\n ),\n });\n\n return {\n ...input,\n ...strictPreset,\n securityPolicy: {\n ...existingPolicy,\n ...toSecurityPolicyOverrides(strictPreset.securityPolicy),\n },\n };\n}\n\nfunction getEnvironmentValues(): Partial<RenderifyConfigValues> {\n if (\n typeof process === \"undefined\" ||\n typeof process.env === \"undefined\" ||\n process.env === null\n ) {\n return {};\n }\n\n const values: Partial<RenderifyConfigValues> = {\n llmUseStructuredOutput:\n process.env.RENDERIFY_LLM_USE_STRUCTURED_OUTPUT !== \"false\",\n strictSecurity: process.env.RENDERIFY_STRICT_SECURITY !== \"false\",\n securityProfile: parseSecurityProfile(\n process.env.RENDERIFY_SECURITY_PROFILE,\n ),\n runtimeJspmOnlyStrictMode:\n process.env.RENDERIFY_RUNTIME_JSPM_ONLY_STRICT_MODE === \"true\",\n runtimeEnforceModuleManifest:\n process.env.RENDERIFY_RUNTIME_ENFORCE_MANIFEST !== \"false\",\n runtimeAllowIsolationFallback:\n process.env.RENDERIFY_RUNTIME_ALLOW_ISOLATION_FALLBACK === \"true\",\n runtimeSupportedSpecVersions: parseSpecVersions(\n process.env.RENDERIFY_RUNTIME_SPEC_VERSIONS,\n ),\n runtimeEnableDependencyPreflight:\n process.env.RENDERIFY_RUNTIME_PREFLIGHT !== \"false\",\n runtimeFailOnDependencyPreflightError:\n process.env.RENDERIFY_RUNTIME_PREFLIGHT_FAIL_FAST === \"true\",\n runtimeRemoteFetchTimeoutMs:\n parsePositiveInt(process.env.RENDERIFY_RUNTIME_REMOTE_FETCH_TIMEOUT_MS) ??\n 12000,\n runtimeRemoteFetchRetries:\n parseNonNegativeInt(process.env.RENDERIFY_RUNTIME_REMOTE_FETCH_RETRIES) ??\n 2,\n runtimeRemoteFetchBackoffMs:\n parseNonNegativeInt(\n process.env.RENDERIFY_RUNTIME_REMOTE_FETCH_BACKOFF_MS,\n ) ?? 150,\n runtimeRemoteFallbackCdnBases: parseCsvValues(\n process.env.RENDERIFY_RUNTIME_REMOTE_FALLBACK_CDNS,\n DEFAULT_RUNTIME_REMOTE_FALLBACK_CDNS,\n ),\n runtimeBrowserSourceSandboxMode: parseSourceSandboxMode(\n process.env.RENDERIFY_RUNTIME_BROWSER_SANDBOX_MODE,\n ),\n runtimeBrowserSourceSandboxFailClosed:\n process.env.RENDERIFY_RUNTIME_BROWSER_SANDBOX_FAIL_CLOSED !== \"false\",\n };\n\n if (process.env.RENDERIFY_LLM_API_KEY) {\n values.llmApiKey = process.env.RENDERIFY_LLM_API_KEY;\n }\n\n if (process.env.RENDERIFY_LLM_PROVIDER) {\n values.llmProvider = parseLlmProvider(process.env.RENDERIFY_LLM_PROVIDER);\n }\n\n if (process.env.RENDERIFY_LLM_MODEL) {\n values.llmModel = process.env.RENDERIFY_LLM_MODEL;\n }\n\n if (process.env.RENDERIFY_LLM_BASE_URL) {\n values.llmBaseUrl = process.env.RENDERIFY_LLM_BASE_URL;\n }\n\n const timeoutMs = parsePositiveInt(process.env.RENDERIFY_LLM_TIMEOUT_MS);\n if (timeoutMs !== undefined) {\n values.llmRequestTimeoutMs = timeoutMs;\n }\n\n if (process.env.RENDERIFY_JSPM_CDN_URL) {\n values.jspmCdnUrl = process.env.RENDERIFY_JSPM_CDN_URL;\n }\n\n const browserSandboxTimeout = parsePositiveInt(\n process.env.RENDERIFY_RUNTIME_BROWSER_SANDBOX_TIMEOUT_MS,\n );\n if (browserSandboxTimeout !== undefined) {\n values.runtimeBrowserSourceSandboxTimeoutMs = browserSandboxTimeout;\n }\n\n return values;\n}\n\nfunction parsePositiveInt(value: string | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n return undefined;\n }\n\n return parsed;\n}\n\nfunction parseNonNegativeInt(value: string | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 0) {\n return undefined;\n }\n\n return parsed;\n}\n\nfunction parseSecurityProfile(\n value: string | undefined,\n): SecurityProfileConfig {\n if (value === \"strict\" || value === \"balanced\" || value === \"relaxed\") {\n return value;\n }\n\n return \"balanced\";\n}\n\nfunction parseLlmProvider(value: string | undefined): LLMProviderConfig {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim().toLowerCase();\n }\n\n return \"openai\";\n}\n\nfunction parseSpecVersions(value: string | undefined): string[] {\n if (!value || value.trim().length === 0) {\n return [...DEFAULT_RUNTIME_SPEC_VERSIONS];\n }\n\n const parsed = value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n\n return parsed.length > 0 ? parsed : [...DEFAULT_RUNTIME_SPEC_VERSIONS];\n}\n\nfunction parseCsvValues(\n value: string | undefined,\n fallback: string[],\n): string[] {\n if (!value || value.trim().length === 0) {\n return [...fallback];\n }\n\n const parsed = value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n\n return parsed.length > 0 ? parsed : [...fallback];\n}\n\nfunction parseSourceSandboxMode(\n value: string | undefined,\n): \"none\" | \"worker\" | \"iframe\" {\n if (value === \"none\" || value === \"worker\" || value === \"iframe\") {\n return value;\n }\n\n return \"worker\";\n}\n\nfunction toSecurityPolicyOverrides(\n value: unknown,\n): Partial<RuntimeSecurityPolicy> {\n if (!isRecord(value)) {\n return {};\n }\n\n return value as Partial<RuntimeSecurityPolicy>;\n}\n\nfunction normalizeJspmAllowedNetworkHosts(input: unknown): string[] {\n const values = Array.isArray(input)\n ? input\n : DEFAULT_JSPM_ALLOWED_NETWORK_HOSTS;\n const normalized: string[] = [];\n\n for (const entry of values) {\n if (typeof entry !== \"string\") {\n continue;\n }\n\n const host = normalizeNetworkHostEntry(entry);\n if (!host || !host.endsWith(\"jspm.io\")) {\n continue;\n }\n\n if (!normalized.includes(host)) {\n normalized.push(host);\n }\n }\n\n return normalized.length > 0\n ? normalized\n : [...DEFAULT_JSPM_ALLOWED_NETWORK_HOSTS];\n}\n\nfunction normalizeNetworkHostEntry(value: string): string | undefined {\n const trimmed = value.trim().toLowerCase();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n try {\n if (trimmed.includes(\"://\")) {\n const parsed = new URL(trimmed);\n return parsed.host;\n }\n } catch {\n // Fall through and treat as host text.\n }\n\n const hostLike = trimmed\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/.*$/, \"\");\n\n return hostLike.length > 0 ? hostLike : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","export interface RenderifyContext {\n user?: {\n id: string;\n name?: string;\n role?: string;\n };\n app?: {\n version: string;\n environment?: \"development\" | \"staging\" | \"production\";\n };\n [key: string]: unknown;\n}\n\nexport interface ContextManager {\n initialize(): Promise<void>;\n getContext(): RenderifyContext;\n updateContext(partialCtx: Partial<RenderifyContext>): void;\n subscribe(listener: (ctx: RenderifyContext) => void): () => void;\n}\n\nexport class DefaultContextManager implements ContextManager {\n private ctx: RenderifyContext = {};\n private listeners = new Set<(ctx: RenderifyContext) => void>();\n\n async initialize(): Promise<void> {\n this.ctx = {\n user: { id: \"anonymous\" },\n app: { version: \"0.1.0\", environment: \"development\" },\n };\n }\n\n getContext(): RenderifyContext {\n return this.ctx;\n }\n\n updateContext(partialCtx: Partial<RenderifyContext>): void {\n const nextUser =\n partialCtx.user || this.ctx.user\n ? {\n id: partialCtx.user?.id ?? this.ctx.user?.id ?? \"anonymous\",\n name: partialCtx.user?.name ?? this.ctx.user?.name,\n role: partialCtx.user?.role ?? this.ctx.user?.role,\n }\n : undefined;\n\n const nextApp =\n partialCtx.app || this.ctx.app\n ? {\n version:\n partialCtx.app?.version ?? this.ctx.app?.version ?? \"0.1.0\",\n environment:\n partialCtx.app?.environment ?? this.ctx.app?.environment,\n }\n : undefined;\n\n this.ctx = {\n ...this.ctx,\n ...partialCtx,\n user: nextUser,\n app: nextApp,\n };\n\n this.notify();\n }\n\n subscribe(listener: (ctx: RenderifyContext) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify(): void {\n for (const cb of this.listeners) {\n cb(this.ctx);\n }\n }\n}\n","export type PluginHook =\n | \"beforeLLM\"\n | \"afterLLM\"\n | \"beforeCodeGen\"\n | \"afterCodeGen\"\n | \"beforePolicyCheck\"\n | \"afterPolicyCheck\"\n | \"beforeRuntime\"\n | \"afterRuntime\"\n | \"beforeRender\"\n | \"afterRender\";\n\nexport interface PluginContext {\n traceId: string;\n hookName: PluginHook;\n}\n\nexport type PluginHandler<Payload = unknown> = (\n payload: Payload,\n context: PluginContext,\n) => Payload | Promise<Payload>;\n\nexport interface RenderifyPlugin {\n name: string;\n hooks: Partial<Record<PluginHook, PluginHandler>>;\n}\n\nexport interface CustomizationEngine {\n registerPlugin(plugin: RenderifyPlugin): void;\n getPlugins(): RenderifyPlugin[];\n runHook<Payload>(\n hookName: PluginHook,\n payload: Payload,\n context: PluginContext,\n ): Promise<Payload>;\n}\n\nexport class DefaultCustomizationEngine implements CustomizationEngine {\n private plugins: RenderifyPlugin[] = [];\n\n registerPlugin(plugin: RenderifyPlugin): void {\n this.plugins.push(plugin);\n }\n\n getPlugins(): RenderifyPlugin[] {\n return [...this.plugins];\n }\n\n async runHook<Payload>(\n hookName: PluginHook,\n payload: Payload,\n context: PluginContext,\n ): Promise<Payload> {\n let currentPayload = payload;\n\n for (const plugin of this.plugins) {\n const hookFn = plugin.hooks[hookName];\n if (!hookFn) {\n continue;\n }\n\n currentPayload = (await hookFn(currentPayload, context)) as Payload;\n }\n\n return currentPayload;\n }\n}\n","export interface PerformanceMetric {\n label: string;\n startedAt: number;\n endedAt: number;\n durationMs: number;\n}\n\nexport interface PerformanceOptimizer {\n startMeasurement(label: string): void;\n endMeasurement(label: string): PerformanceMetric | undefined;\n getMetrics(): PerformanceMetric[];\n reset(): void;\n}\n\ninterface TimerState {\n label: string;\n startedAt: number;\n}\n\nexport class DefaultPerformanceOptimizer implements PerformanceOptimizer {\n private readonly timers: Map<string, TimerState> = new Map();\n private readonly metrics: PerformanceMetric[] = [];\n\n startMeasurement(label: string): void {\n this.timers.set(label, {\n label,\n startedAt: nowMs(),\n });\n }\n\n endMeasurement(label: string): PerformanceMetric | undefined {\n const timer = this.timers.get(label);\n if (!timer) {\n return undefined;\n }\n\n const endedAt = nowMs();\n const metric: PerformanceMetric = {\n label,\n startedAt: timer.startedAt,\n endedAt,\n durationMs: endedAt - timer.startedAt,\n };\n\n this.metrics.push(metric);\n this.timers.delete(label);\n return metric;\n }\n\n getMetrics(): PerformanceMetric[] {\n return [...this.metrics];\n }\n\n reset(): void {\n this.timers.clear();\n this.metrics.length = 0;\n }\n}\n\nfunction nowMs(): number {\n if (\n typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ) {\n return performance.now();\n }\n\n return Date.now();\n}\n","export * from \"@renderify/security\";\n","export type {\n InteractiveRenderTarget,\n RenderTarget,\n RuntimeEventDispatchRequest,\n UIRenderer,\n} from \"@renderify/runtime\";\nexport { DefaultUIRenderer } from \"@renderify/runtime\";\n"],"mappings":"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","names":[]}
@@ -0,0 +1,335 @@
1
+ import { RuntimePlan, RuntimeExecutionResult } from '@renderify/ir';
2
+ import { RenderTarget, RuntimeManager, UIRenderer } from '@renderify/runtime';
3
+ export { DefaultUIRenderer, InteractiveRenderTarget, RenderTarget, RuntimeEventDispatchRequest, UIRenderer } from '@renderify/runtime';
4
+ import { RuntimeSecurityPolicy, SecurityCheckResult, SecurityChecker } from '@renderify/security';
5
+ export * from '@renderify/security';
6
+
7
+ interface ApiDefinition {
8
+ name: string;
9
+ endpoint: string;
10
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
11
+ headers?: Record<string, string>;
12
+ timeoutMs?: number;
13
+ }
14
+ interface ApiIntegration {
15
+ registerApi(api: ApiDefinition): void;
16
+ listApis(): ApiDefinition[];
17
+ callApi<TResponse = unknown>(name: string, params?: Record<string, unknown>): Promise<TResponse>;
18
+ }
19
+ declare class DefaultApiIntegration implements ApiIntegration {
20
+ private readonly apis;
21
+ registerApi(api: ApiDefinition): void;
22
+ listApis(): ApiDefinition[];
23
+ callApi<TResponse = unknown>(name: string, params?: Record<string, unknown>): Promise<TResponse>;
24
+ private buildUrl;
25
+ private createTimeout;
26
+ }
27
+
28
+ interface CodeGenerationInput {
29
+ prompt: string;
30
+ llmText: string;
31
+ context?: Record<string, unknown>;
32
+ }
33
+ interface IncrementalCodeGenerationInput {
34
+ prompt: string;
35
+ context?: Record<string, unknown>;
36
+ }
37
+ interface IncrementalCodeGenerationUpdate {
38
+ plan: RuntimePlan;
39
+ complete: boolean;
40
+ mode: "runtime-plan-json" | "runtime-node-json" | "runtime-source" | "runtime-text-fallback";
41
+ }
42
+ interface IncrementalCodeGenerationSession {
43
+ pushDelta(delta: string): Promise<IncrementalCodeGenerationUpdate | undefined>;
44
+ finalize(finalText?: string): Promise<RuntimePlan | undefined>;
45
+ }
46
+ interface CodeGenerator {
47
+ generatePlan(input: CodeGenerationInput): Promise<RuntimePlan>;
48
+ createIncrementalSession?(input: IncrementalCodeGenerationInput): IncrementalCodeGenerationSession;
49
+ validatePlan(plan: RuntimePlan): Promise<boolean>;
50
+ transformPlan(plan: RuntimePlan, transforms: Array<(plan: RuntimePlan) => RuntimePlan>): Promise<RuntimePlan>;
51
+ }
52
+ declare class DefaultCodeGenerator implements CodeGenerator {
53
+ createIncrementalSession(input: IncrementalCodeGenerationInput): IncrementalCodeGenerationSession;
54
+ generatePlan(input: CodeGenerationInput): Promise<RuntimePlan>;
55
+ validatePlan(plan: RuntimePlan): Promise<boolean>;
56
+ transformPlan(plan: RuntimePlan, transforms: Array<(plan: RuntimePlan) => RuntimePlan>): Promise<RuntimePlan>;
57
+ private createFallbackRoot;
58
+ private tryBuildIncrementalCandidate;
59
+ private createIncrementalPlanSignature;
60
+ private hashIncrementalSignatureValue;
61
+ private createPlanFromRoot;
62
+ private tryParseRuntimePlan;
63
+ private tryParseRuntimeNode;
64
+ private tryParseJsonPayload;
65
+ private isLikelyCompleteJsonPayload;
66
+ private hasClosedCodeFence;
67
+ private normalizePlanId;
68
+ private normalizePlanVersion;
69
+ private normalizeImports;
70
+ private normalizeModuleManifest;
71
+ private normalizeCapabilities;
72
+ private createModuleManifestFromImports;
73
+ private resolveImportToUrl;
74
+ private extractVersionFromSpecifier;
75
+ private normalizeMetadata;
76
+ private tryExtractRuntimeSource;
77
+ private createSourcePlan;
78
+ private parseImportsFromSource;
79
+ private isHttpUrl;
80
+ private isRecord;
81
+ private normalizeSourceModule;
82
+ private inferSourceRuntimeFromLanguage;
83
+ private resolveJspmSpecifier;
84
+ }
85
+
86
+ type SecurityProfileConfig = "strict" | "balanced" | "relaxed";
87
+ type LLMProviderConfig = string;
88
+ interface RenderifyConfigValues {
89
+ llmApiKey?: string;
90
+ llmProvider: LLMProviderConfig;
91
+ llmModel: string;
92
+ llmBaseUrl: string;
93
+ llmRequestTimeoutMs: number;
94
+ llmUseStructuredOutput: boolean;
95
+ jspmCdnUrl: string;
96
+ strictSecurity: boolean;
97
+ securityProfile: SecurityProfileConfig;
98
+ securityPolicy?: Partial<RuntimeSecurityPolicy>;
99
+ runtimeJspmOnlyStrictMode: boolean;
100
+ runtimeEnforceModuleManifest: boolean;
101
+ runtimeAllowIsolationFallback: boolean;
102
+ runtimeSupportedSpecVersions: string[];
103
+ runtimeEnableDependencyPreflight: boolean;
104
+ runtimeFailOnDependencyPreflightError: boolean;
105
+ runtimeRemoteFetchTimeoutMs: number;
106
+ runtimeRemoteFetchRetries: number;
107
+ runtimeRemoteFetchBackoffMs: number;
108
+ runtimeRemoteFallbackCdnBases: string[];
109
+ runtimeBrowserSourceSandboxMode: "none" | "worker" | "iframe";
110
+ runtimeBrowserSourceSandboxTimeoutMs: number;
111
+ runtimeBrowserSourceSandboxFailClosed: boolean;
112
+ [key: string]: unknown;
113
+ }
114
+ interface JspmOnlyStrictModeOptions {
115
+ allowedNetworkHosts?: string[];
116
+ }
117
+ declare function createJspmOnlyStrictModeConfig(options?: JspmOnlyStrictModeOptions): Partial<RenderifyConfigValues>;
118
+ interface RenderifyConfig {
119
+ load(overrides?: Partial<RenderifyConfigValues>): Promise<void>;
120
+ get<T = unknown>(key: string): T | undefined;
121
+ set(key: string, value: unknown): void;
122
+ snapshot(): Readonly<Record<string, unknown>>;
123
+ save(): Promise<void>;
124
+ }
125
+ declare class DefaultRenderifyConfig implements RenderifyConfig {
126
+ private config;
127
+ load(overrides?: Partial<RenderifyConfigValues>): Promise<void>;
128
+ get<T = unknown>(key: string): T | undefined;
129
+ set(key: string, value: unknown): void;
130
+ snapshot(): Readonly<Record<string, unknown>>;
131
+ save(): Promise<void>;
132
+ }
133
+
134
+ interface RenderifyContext {
135
+ user?: {
136
+ id: string;
137
+ name?: string;
138
+ role?: string;
139
+ };
140
+ app?: {
141
+ version: string;
142
+ environment?: "development" | "staging" | "production";
143
+ };
144
+ [key: string]: unknown;
145
+ }
146
+ interface ContextManager {
147
+ initialize(): Promise<void>;
148
+ getContext(): RenderifyContext;
149
+ updateContext(partialCtx: Partial<RenderifyContext>): void;
150
+ subscribe(listener: (ctx: RenderifyContext) => void): () => void;
151
+ }
152
+ declare class DefaultContextManager implements ContextManager {
153
+ private ctx;
154
+ private listeners;
155
+ initialize(): Promise<void>;
156
+ getContext(): RenderifyContext;
157
+ updateContext(partialCtx: Partial<RenderifyContext>): void;
158
+ subscribe(listener: (ctx: RenderifyContext) => void): () => void;
159
+ private notify;
160
+ }
161
+
162
+ type PluginHook = "beforeLLM" | "afterLLM" | "beforeCodeGen" | "afterCodeGen" | "beforePolicyCheck" | "afterPolicyCheck" | "beforeRuntime" | "afterRuntime" | "beforeRender" | "afterRender";
163
+ interface PluginContext {
164
+ traceId: string;
165
+ hookName: PluginHook;
166
+ }
167
+ type PluginHandler<Payload = unknown> = (payload: Payload, context: PluginContext) => Payload | Promise<Payload>;
168
+ interface RenderifyPlugin {
169
+ name: string;
170
+ hooks: Partial<Record<PluginHook, PluginHandler>>;
171
+ }
172
+ interface CustomizationEngine {
173
+ registerPlugin(plugin: RenderifyPlugin): void;
174
+ getPlugins(): RenderifyPlugin[];
175
+ runHook<Payload>(hookName: PluginHook, payload: Payload, context: PluginContext): Promise<Payload>;
176
+ }
177
+ declare class DefaultCustomizationEngine implements CustomizationEngine {
178
+ private plugins;
179
+ registerPlugin(plugin: RenderifyPlugin): void;
180
+ getPlugins(): RenderifyPlugin[];
181
+ runHook<Payload>(hookName: PluginHook, payload: Payload, context: PluginContext): Promise<Payload>;
182
+ }
183
+
184
+ interface LLMRequest {
185
+ prompt: string;
186
+ context?: Record<string, unknown>;
187
+ systemPrompt?: string;
188
+ signal?: AbortSignal;
189
+ }
190
+ interface LLMResponse {
191
+ text: string;
192
+ tokensUsed?: number;
193
+ model?: string;
194
+ raw?: unknown;
195
+ }
196
+ interface LLMResponseStreamChunk {
197
+ delta: string;
198
+ text: string;
199
+ done: boolean;
200
+ index: number;
201
+ tokensUsed?: number;
202
+ model?: string;
203
+ raw?: unknown;
204
+ }
205
+ interface LLMStructuredRequest extends LLMRequest {
206
+ format: "runtime-plan";
207
+ strict?: boolean;
208
+ }
209
+ interface LLMStructuredResponse<T = unknown> {
210
+ text: string;
211
+ value?: T;
212
+ valid: boolean;
213
+ errors?: string[];
214
+ tokensUsed?: number;
215
+ model?: string;
216
+ raw?: unknown;
217
+ }
218
+ interface LLMInterpreter {
219
+ configure(options: Record<string, unknown>): void;
220
+ generateResponse(req: LLMRequest): Promise<LLMResponse>;
221
+ generateResponseStream?(req: LLMRequest): AsyncIterable<LLMResponseStreamChunk>;
222
+ generateStructuredResponse?<T = unknown>(req: LLMStructuredRequest): Promise<LLMStructuredResponse<T>>;
223
+ setPromptTemplate(templateName: string, templateContent: string): void;
224
+ getPromptTemplate(templateName: string): string | undefined;
225
+ }
226
+
227
+ interface PerformanceMetric {
228
+ label: string;
229
+ startedAt: number;
230
+ endedAt: number;
231
+ durationMs: number;
232
+ }
233
+ interface PerformanceOptimizer {
234
+ startMeasurement(label: string): void;
235
+ endMeasurement(label: string): PerformanceMetric | undefined;
236
+ getMetrics(): PerformanceMetric[];
237
+ reset(): void;
238
+ }
239
+ declare class DefaultPerformanceOptimizer implements PerformanceOptimizer {
240
+ private readonly timers;
241
+ private readonly metrics;
242
+ startMeasurement(label: string): void;
243
+ endMeasurement(label: string): PerformanceMetric | undefined;
244
+ getMetrics(): PerformanceMetric[];
245
+ reset(): void;
246
+ }
247
+
248
+ interface RenderifyCoreDependencies {
249
+ config: RenderifyConfig;
250
+ context: ContextManager;
251
+ llm: LLMInterpreter;
252
+ codegen: CodeGenerator;
253
+ runtime: RuntimeManager;
254
+ security: SecurityChecker;
255
+ performance: PerformanceOptimizer;
256
+ ui: UIRenderer;
257
+ apiIntegration?: ApiIntegration;
258
+ customization?: CustomizationEngine;
259
+ }
260
+ interface RenderPromptOptions {
261
+ target?: RenderTarget;
262
+ traceId?: string;
263
+ signal?: AbortSignal;
264
+ }
265
+ interface RenderPlanOptions {
266
+ target?: RenderTarget;
267
+ traceId?: string;
268
+ prompt?: string;
269
+ signal?: AbortSignal;
270
+ }
271
+ interface RenderPlanResult {
272
+ traceId: string;
273
+ plan: RuntimePlan;
274
+ security: SecurityCheckResult;
275
+ execution: RuntimeExecutionResult;
276
+ html: string;
277
+ }
278
+ interface RenderPromptResult extends RenderPlanResult {
279
+ prompt: string;
280
+ llm: LLMResponse;
281
+ }
282
+ interface RenderPromptStreamOptions extends RenderPromptOptions {
283
+ previewEveryChunks?: number;
284
+ }
285
+ interface RenderPromptStreamChunk {
286
+ type: "llm-delta" | "preview" | "final" | "error";
287
+ traceId: string;
288
+ prompt: string;
289
+ llmText: string;
290
+ delta?: string;
291
+ html?: string;
292
+ diagnostics?: RuntimeExecutionResult["diagnostics"];
293
+ planId?: string;
294
+ final?: RenderPromptResult;
295
+ error?: {
296
+ message: string;
297
+ name?: string;
298
+ };
299
+ }
300
+ type EventCallback = (...args: unknown[]) => void;
301
+ declare class PolicyRejectionError extends Error {
302
+ readonly result: SecurityCheckResult;
303
+ constructor(result: SecurityCheckResult);
304
+ }
305
+ declare class RenderifyApp {
306
+ private readonly deps;
307
+ private readonly listeners;
308
+ private running;
309
+ constructor(deps: RenderifyCoreDependencies);
310
+ start(): Promise<void>;
311
+ stop(): Promise<void>;
312
+ renderPrompt(prompt: string, options?: RenderPromptOptions): Promise<RenderPromptResult>;
313
+ renderPromptStream(prompt: string, options?: RenderPromptStreamOptions): AsyncGenerator<RenderPromptStreamChunk, RenderPromptResult>;
314
+ renderPlan(plan: RuntimePlan, options?: RenderPlanOptions): Promise<RenderPlanResult>;
315
+ getConfig(): RenderifyConfig;
316
+ getContext(): ContextManager;
317
+ getLLM(): LLMInterpreter;
318
+ getCodeGenerator(): CodeGenerator;
319
+ getRuntimeManager(): RuntimeManager;
320
+ getSecurityChecker(): SecurityChecker;
321
+ on(eventName: string, callback: EventCallback): () => void;
322
+ emit(eventName: string, payload?: unknown): void;
323
+ private executePlanFlow;
324
+ private ensureRunning;
325
+ private runHook;
326
+ private toRecord;
327
+ private createTraceId;
328
+ private createMetricLabel;
329
+ private resolveUserId;
330
+ private buildStreamingPreview;
331
+ private throwIfAborted;
332
+ }
333
+ declare function createRenderifyApp(deps: RenderifyCoreDependencies): RenderifyApp;
334
+
335
+ export { type ApiDefinition, type ApiIntegration, type CodeGenerationInput, type CodeGenerator, type ContextManager, type CustomizationEngine, DefaultApiIntegration, DefaultCodeGenerator, DefaultContextManager, DefaultCustomizationEngine, DefaultPerformanceOptimizer, DefaultRenderifyConfig, type IncrementalCodeGenerationInput, type IncrementalCodeGenerationSession, type IncrementalCodeGenerationUpdate, type JspmOnlyStrictModeOptions, type LLMInterpreter, type LLMProviderConfig, type LLMRequest, type LLMResponse, type LLMResponseStreamChunk, type LLMStructuredRequest, type LLMStructuredResponse, type PerformanceMetric, type PerformanceOptimizer, type PluginContext, type PluginHandler, type PluginHook, PolicyRejectionError, type RenderPlanOptions, type RenderPlanResult, type RenderPromptOptions, type RenderPromptResult, type RenderPromptStreamChunk, type RenderPromptStreamOptions, RenderifyApp, type RenderifyConfig, type RenderifyConfigValues, type RenderifyContext, type RenderifyCoreDependencies, type RenderifyPlugin, type SecurityProfileConfig, createJspmOnlyStrictModeConfig, createRenderifyApp };