@runtypelabs/sdk 1.7.3 → 1.8.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stream-utils.ts","../src/flow-result.ts","../src/flows-namespace.ts","../src/batches-namespace.ts","../src/evals-namespace.ts","../src/prompts-namespace.ts","../src/transform.ts","../src/runtype.ts","../src/generated-tool-gate.ts","../src/workflow-utils.ts","../src/workflows/default-workflow.ts","../src/workflows/deploy-workflow.ts","../src/endpoints.ts","../src/flow-builder.ts","../src/client.ts","../src/index.ts","../src/batch-builder.ts","../src/eval-builder.ts"],"sourcesContent":["/**\n * SSE Stream Utilities for FlowBuilder\n *\n * Provides utilities for parsing Server-Sent Events (SSE) streams\n * from the Runtype API dispatch endpoint.\n */\n\nimport type {\n StreamCallbacks,\n StreamEvent,\n StepDeltaEvent,\n FlowSummary,\n} from './flow-builder'\n\n// ============================================================================\n// SSE Parsing Utilities\n// ============================================================================\n\n/**\n * Parse SSE stream chunks into individual events\n *\n * @param chunk - New chunk from the stream\n * @param buffer - Previous incomplete buffer\n * @returns Parsed events and remaining buffer\n */\nexport function parseSSEChunk(\n chunk: string,\n buffer: string\n): { events: string[]; remainingBuffer: string } {\n buffer += chunk\n const lines = buffer.split('\\n')\n const remainingBuffer = lines.pop() || ''\n\n const events: string[] = []\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6).trim()\n if (jsonStr && jsonStr !== '[DONE]') {\n events.push(jsonStr)\n }\n }\n }\n\n return { events, remainingBuffer }\n}\n\n/**\n * Parse final buffer if it contains a complete event\n *\n * @param buffer - Remaining buffer after stream ends\n * @returns Parsed event JSON string or null\n */\nexport function parseFinalBuffer(buffer: string): string | null {\n const trimmed = buffer.trim()\n if (!trimmed) return null\n\n // Handle standard SSE format: \"event: <type>\\ndata: <json>\"\n if (trimmed.startsWith('event: ')) {\n const dataIndex = trimmed.indexOf('\\ndata: ')\n if (dataIndex !== -1) {\n const jsonStr = trimmed.slice(dataIndex + 7).trim()\n if (jsonStr && jsonStr !== '[DONE]') {\n return jsonStr\n }\n }\n return null\n }\n\n // Handle data-only format: \"data: <json>\"\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.slice(6).trim()\n if (jsonStr && jsonStr !== '[DONE]') {\n return jsonStr\n }\n }\n return null\n}\n\n// ============================================================================\n// Stream Processing\n// ============================================================================\n\n/**\n * Process a streaming response with callbacks\n *\n * @param response - Fetch Response object with streaming body\n * @param callbacks - Callbacks for different event types\n * @returns Promise resolving to FlowSummary when complete\n *\n * @example\n * ```typescript\n * const response = await client.dispatch(config)\n * const summary = await processStream(response, {\n * onStepDelta: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: (event) => console.log('Done!'),\n * })\n * ```\n */\nexport async function processStream(\n response: Response,\n callbacks: StreamCallbacks = {}\n): Promise<FlowSummary> {\n if (!response.ok) {\n const error = new Error(`HTTP ${response.status}: ${response.statusText}`)\n callbacks.onError?.(error)\n throw error\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n const error = new Error('Response body is not readable')\n callbacks.onError?.(error)\n throw error\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n // Track results for summary\n const results = new Map<string, any>()\n let flowSummary: Partial<FlowSummary> = {\n flowId: '',\n flowName: '',\n totalSteps: 0,\n successfulSteps: 0,\n failedSteps: 0,\n executionTime: 0,\n success: true,\n }\n\n // Check if content-type is application/json (non-streaming response)\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n try {\n const data = await response.json()\n\n // Check if this is a structured non-streaming response with events\n if (data.events && Array.isArray(data.events)) {\n for (const event of data.events) {\n handleEvent(event, callbacks, results, flowSummary)\n }\n\n // Also populate summary from top-level fields if available\n if (data.flowId) flowSummary.flowId = data.flowId\n if (data.recordId) flowSummary.flowName = data.recordId // Mapping might be loose here\n\n // Use execution summary if present\n if (data.executionSummary) {\n const s = data.executionSummary\n if (s.flowId) flowSummary.flowId = s.flowId\n if (s.flowName) flowSummary.flowName = s.flowName\n if (s.totalSteps) flowSummary.totalSteps = s.totalSteps\n if (s.successfulSteps) flowSummary.successfulSteps = s.successfulSteps\n if (s.failedSteps) flowSummary.failedSteps = s.failedSteps\n if (s.executionTime) flowSummary.executionTime = s.executionTime\n }\n\n return {\n flowId: flowSummary.flowId || '',\n flowName: flowSummary.flowName || '',\n totalSteps: flowSummary.totalSteps || 0,\n successfulSteps: flowSummary.successfulSteps || 0,\n failedSteps: flowSummary.failedSteps || 0,\n executionTime: flowSummary.executionTime || 0,\n results,\n success: flowSummary.success ?? true,\n }\n }\n\n // Handle JSON responses without events array (API returned non-streaming response)\n // This can happen if stream_response wasn't properly sent to the API\n if (data.error) {\n const error = new Error(data.error)\n callbacks.onError?.(error)\n throw error\n }\n\n // For unexpected JSON formats, throw an error rather than falling through\n // to SSE parsing (the body is already consumed)\n throw new Error(\n `Unexpected API response format. Expected SSE stream but received JSON: ${JSON.stringify(data).slice(0, 200)}`\n )\n } catch (e) {\n // Only fall back to stream parsing if JSON parsing itself failed (SyntaxError)\n // NOT if we got valid JSON with unexpected structure\n if (e instanceof SyntaxError) {\n console.warn('Failed to parse JSON response, falling back to stream parsing', e)\n } else {\n // Re-throw structural/API errors\n flowSummary.success = false\n throw e\n }\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n const chunk = decoder.decode(value, { stream: true })\n const { events, remainingBuffer } = parseSSEChunk(chunk, buffer)\n buffer = remainingBuffer\n\n for (const eventStr of events) {\n try {\n const event = JSON.parse(eventStr) as StreamEvent\n handleEvent(event, callbacks, results, flowSummary)\n } catch (parseError) {\n // Skip malformed JSON\n console.warn('Failed to parse SSE event:', eventStr)\n }\n }\n }\n\n // Process final buffer\n const finalEvent = parseFinalBuffer(buffer)\n if (finalEvent) {\n try {\n const event = JSON.parse(finalEvent) as StreamEvent\n handleEvent(event, callbacks, results, flowSummary)\n } catch (parseError) {\n // Skip malformed JSON\n }\n }\n } catch (error) {\n flowSummary.success = false\n const err = error instanceof Error ? error : new Error(String(error))\n callbacks.onError?.(err)\n throw err\n } finally {\n reader.releaseLock()\n }\n\n return {\n flowId: flowSummary.flowId || '',\n flowName: flowSummary.flowName || '',\n totalSteps: flowSummary.totalSteps || 0,\n successfulSteps: flowSummary.successfulSteps || 0,\n failedSteps: flowSummary.failedSteps || 0,\n executionTime: flowSummary.executionTime || 0,\n results,\n success: flowSummary.success ?? true,\n }\n}\n\n/**\n * Handle a single SSE event\n */\nfunction handleEvent(\n event: StreamEvent,\n callbacks: StreamCallbacks,\n results: Map<string, any>,\n summary: Partial<FlowSummary>\n): void {\n switch (event.type) {\n case 'flow_start':\n summary.flowId = event.flowId\n summary.flowName = event.flowName\n summary.totalSteps = event.totalSteps\n callbacks.onFlowStart?.(event)\n break\n\n case 'step_start':\n callbacks.onStepStart?.(event)\n break\n\n case 'step_delta': {\n // Normalize API's 'text' field to 'chunk' for consistency\n // The API sends 'text' but our types use 'chunk'\n const chunkText = (event as any).chunk || (event as any).text || ''\n const deltaEvent = event as unknown as StepDeltaEvent\n callbacks.onStepDelta?.(chunkText, deltaEvent)\n // Call deprecated onStepChunk for backwards compatibility\n callbacks.onStepChunk?.(chunkText, deltaEvent)\n break\n }\n\n case 'step_complete':\n results.set(event.name, event.result)\n callbacks.onStepComplete?.(event.result, event)\n break\n\n case 'flow_complete':\n summary.totalSteps = event.totalSteps\n summary.successfulSteps = event.successfulSteps\n summary.failedSteps = event.failedSteps\n summary.executionTime = event.executionTime\n summary.success = event.failedSteps === 0\n callbacks.onFlowComplete?.(event)\n break\n\n case 'flow_error':\n summary.success = false\n callbacks.onError?.(new Error(event.error))\n break\n\n case 'flow_await':\n // Not strictly part of standard FlowSummary but useful for debugging\n // The client.ts runWithLocalTools handles this for logic flow\n break\n\n case 'step_await':\n // Notification that local tool execution is pending\n break\n }\n}\n\n// ============================================================================\n// Async Iterator for Advanced Use Cases\n// ============================================================================\n\n/**\n * Create an async iterator over SSE events\n *\n * @param response - Fetch Response object with streaming body\n * @yields Parsed SSE events\n *\n * @example\n * ```typescript\n * const response = await client.dispatch(config)\n * for await (const event of streamEvents(response)) {\n * console.log(event.type, event)\n * }\n * ```\n */\nexport async function* streamEvents(response: Response): AsyncGenerator<StreamEvent> {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n // Check if content-type is application/json (non-streaming response)\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n try {\n const data = await response.json()\n // Yield events from array if present\n if (data.events && Array.isArray(data.events)) {\n for (const event of data.events) {\n yield event\n }\n }\n return\n } catch (e) {\n console.warn('Failed to parse JSON response in streamEvents', e)\n // Fall through to stream parsing if JSON parsing fails?\n // No, body is consumed.\n throw e\n }\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('Response body is not readable')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n const chunk = decoder.decode(value, { stream: true })\n const { events, remainingBuffer } = parseSSEChunk(chunk, buffer)\n buffer = remainingBuffer\n\n for (const eventStr of events) {\n try {\n const event = JSON.parse(eventStr) as StreamEvent\n // Normalize API's 'text' field to 'chunk' for step_delta events\n if (\n event.type === 'step_delta' &&\n 'text' in event &&\n !('chunk' in event)\n ) {\n ;(event as any).chunk = (event as any).text\n }\n yield event\n } catch {\n // Skip malformed JSON\n }\n }\n }\n\n // Process final buffer\n const finalEvent = parseFinalBuffer(buffer)\n if (finalEvent) {\n try {\n const event = JSON.parse(finalEvent) as StreamEvent\n // Normalize API's 'text' field to 'chunk' for step_delta events\n if (\n event.type === 'step_delta' &&\n 'text' in event &&\n !('chunk' in event)\n ) {\n ;(event as any).chunk = (event as any).text\n }\n yield event\n } catch {\n // Skip malformed JSON\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * FlowResult - Wrapper for streaming flow execution responses\n *\n * Provides convenient methods for processing streaming responses\n * from the Runtype API dispatch endpoint.\n */\n\nimport type { StreamCallbacks, FlowSummary } from './flow-builder'\nimport { processStream } from './stream-utils'\n\n/**\n * Result wrapper for flow execution\n *\n * Provides multiple ways to consume the streaming response:\n * - `.stream(callbacks)` - Process with callbacks\n * - `.getResult(stepName)` - Get result from a specific step\n * - `.getAllResults()` - Get all step results\n * - `.raw` - Access the raw Response for manual handling\n *\n * @example\n * ```typescript\n * const result = await flow.run(apiClient, options)\n *\n * // Option 1: Process with callbacks\n * const summary = await result.stream({\n * onStepChunk: (chunk) => process.stdout.write(chunk),\n * })\n *\n * // Option 2: Just get a specific step's result\n * const analysis = await result.getResult('Analyze Data')\n *\n * // Option 3: Get all results\n * const allResults = await result.getAllResults()\n * ```\n */\nexport class FlowResult {\n private response: Response\n private consumed = false\n private cachedSummary: FlowSummary | null = null\n\n constructor(response: Response, summary?: FlowSummary) {\n this.response = response\n if (summary) {\n this.cachedSummary = summary\n this.consumed = true\n }\n }\n\n /**\n * Get the raw Response object for manual handling\n *\n * Note: The response body can only be consumed once.\n * Using this will prevent using other methods like stream() or getResult().\n */\n get raw(): Response {\n return this.response\n }\n\n /**\n * Check if the response has already been consumed\n */\n get isConsumed(): boolean {\n return this.consumed\n }\n\n /**\n * Process the streaming response with callbacks\n *\n * @param callbacks - Callbacks for different event types\n * @returns Promise resolving to FlowSummary when complete\n *\n * @example\n * ```typescript\n * const summary = await result.stream({\n * onStepStart: (event) => console.log('Starting:', event.name),\n * onStepChunk: (chunk) => process.stdout.write(chunk),\n * onStepComplete: (result, event) => console.log('Done:', event.name),\n * onFlowComplete: (event) => console.log('Flow complete!'),\n * })\n * ```\n */\n async stream(callbacks: StreamCallbacks = {}): Promise<FlowSummary> {\n if (this.consumed && this.cachedSummary) {\n // Replay events from cached summary if available?\n // For now, just return the summary immediately as we can't replay the stream.\n // Callbacks for completion might be relevant though.\n if (callbacks.onFlowComplete) {\n callbacks.onFlowComplete({\n type: 'flow_complete',\n flowId: this.cachedSummary.flowId,\n totalSteps: this.cachedSummary.totalSteps,\n successfulSteps: this.cachedSummary.successfulSteps,\n failedSteps: this.cachedSummary.failedSteps,\n executionTime: this.cachedSummary.executionTime,\n })\n }\n return this.cachedSummary\n }\n\n this.ensureNotConsumed()\n this.consumed = true\n\n this.cachedSummary = await processStream(this.response, callbacks)\n return this.cachedSummary\n }\n\n /**\n * Get the result from a specific step by its name\n *\n * Matches against the `name` property you set when creating the step.\n * - **Case-sensitive**: `'Analyze'` ≠ `'analyze'`\n * - **Exact match only**: no partial or fuzzy matching\n * - Returns `undefined` if no step with that name is found\n *\n * @param stepName - The exact step name (from the `name` property when creating the step)\n * @returns The step's result, or undefined if not found\n *\n * @example\n * ```typescript\n * // When building:\n * .prompt({ name: 'Analyze Screenshot', model: 'gpt-4', ... })\n *\n * // When retrieving (must match exactly):\n * const analysis = await result.getResult('Analyze Screenshot') // ✓ Works\n * const analysis = await result.getResult('analyze screenshot') // ✗ undefined\n * ```\n */\n async getResult(stepName: string): Promise<any> {\n const summary = await this.ensureSummary()\n\n // Exact name match only\n if (summary.results.has(stepName)) {\n return summary.results.get(stepName)\n }\n\n return undefined\n }\n\n /**\n * Get all step results as a Map\n *\n * @returns Map of step name to result\n *\n * @example\n * ```typescript\n * const allResults = await result.getAllResults()\n * for (const [stepName, result] of allResults) {\n * console.log(stepName, result)\n * }\n * ```\n */\n async getAllResults(): Promise<Map<string, any>> {\n const summary = await this.ensureSummary()\n return summary.results\n }\n\n /**\n * Get the flow summary after processing\n *\n * @returns FlowSummary with execution details\n */\n async getSummary(): Promise<FlowSummary> {\n return this.ensureSummary()\n }\n\n /**\n * Ensure the stream has been processed and return the summary\n */\n private async ensureSummary(): Promise<FlowSummary> {\n if (this.cachedSummary) {\n return this.cachedSummary\n }\n\n // Process the stream silently to get results\n return this.stream({})\n }\n\n /**\n * Ensure the response hasn't been consumed yet\n */\n private ensureNotConsumed(): void {\n if (this.consumed) {\n throw new Error(\n 'Response has already been consumed. ' +\n 'The streaming response body can only be read once. ' +\n 'Use the cached results from stream(), getResult(), or getAllResults() instead.'\n )\n }\n }\n}\n","/**\n * FlowsNamespace - Static namespace for flow operations\n *\n * Provides factory methods for creating flow builders with different modes:\n * - upsert: Create or update a flow by name\n * - virtual: One-off execution without saving\n * - use: Execute an existing flow by ID\n */\n\nimport type { RuntypeClient } from './runtype'\nimport type { DispatchRequest, MessageContent, ReasoningConfig } from './types'\nimport type {\n ErrorHandlingMode,\n PromptErrorHandling,\n ContextErrorHandling,\n} from './error-handling-types'\nimport { FlowResult } from './flow-result'\nimport { processStream } from './stream-utils'\nimport type { StreamCallbacks, FlowSummary } from './flow-builder'\n\nexport interface LocalToolsOptions {\n localTools?: Record<string, (args: any) => Promise<any>>\n}\n\n// ============================================================================\n// Configuration Interfaces\n// ============================================================================\n\nexport interface FlowConfig {\n name: string\n description?: string\n}\n\nexport interface UpsertFlowConfig extends FlowConfig {\n /** Whether to create a version snapshot before updating (default: true) */\n createVersionOnChange?: boolean\n /** Allow overwriting changes made via dashboard/API (default: false) */\n allowOverwriteExternalChanges?: boolean\n}\n\nexport interface RecordConfig {\n id?: number | string\n name?: string\n type?: string\n metadata?: Record<string, any>\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant'\n content: MessageContent\n}\n\n// ============================================================================\n// Step Configuration Interfaces\n// ============================================================================\n\nexport interface PromptStepConfig {\n name: string\n model: string\n userPrompt: string\n systemPrompt?: string\n previousMessages?: string | Array<{ role: string; content: string }>\n outputVariable?: string\n responseFormat?: 'text' | 'json'\n temperature?: number\n maxTokens?: number\n /** Enable reasoning/extended thinking. Use `true` for defaults or `ReasoningConfig` for fine-grained control */\n reasoning?: boolean | ReasoningConfig\n streamOutput?: boolean\n tools?: {\n toolIds?: string[]\n [key: string]: any\n }\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | PromptErrorHandling\n enabled?: boolean\n}\n\nexport interface FetchUrlStepConfig {\n name: string\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n headers?: Record<string, string>\n body?: string\n responseType?: 'json' | 'text' | 'xml'\n markdownIfAvailable?: boolean\n outputVariable?: string\n fetchMethod?: 'http' | 'firecrawl'\n firecrawl?: {\n formats?: string[]\n [key: string]: any\n }\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface TransformDataStepConfig {\n name: string\n script: string\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SetVariableStepConfig {\n name: string\n variableName: string\n value: string | number | boolean | object\n enabled?: boolean\n}\n\nexport interface ConditionalStepConfig {\n name: string\n condition: string\n trueSteps?: any[]\n falseSteps?: any[]\n enabled?: boolean\n}\n\nexport interface SearchStepConfig {\n name: string\n provider: string\n query: string\n maxResults?: number\n outputVariable?: string\n returnCitations?: boolean\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendEmailStepConfig {\n name: string\n to: string\n from?: string\n subject: string\n html: string\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendStreamStepConfig {\n name: string\n message: string\n enabled?: boolean\n}\n\nexport interface RetrieveRecordStepConfig {\n name: string\n recordType?: string\n recordName?: string\n fieldsToInclude?: string[]\n fieldsToExclude?: string[]\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface UpsertRecordStepConfig {\n name: string\n recordType: string\n recordName?: string\n sourceVariable?: string\n mergeStrategy?: 'merge' | 'replace'\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface VectorSearchStepConfig {\n name: string\n query: string\n recordType?: string\n embeddingModel?: string\n limit?: number\n threshold?: number\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface GenerateEmbeddingStepConfig {\n name: string\n text: string\n embeddingModel?: string\n maxLength?: number\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface WaitUntilStepConfig {\n name: string\n delayMs?: number\n continueOnTimeout?: boolean\n poll?: {\n enabled: boolean\n intervalMs?: number\n maxAttempts?: number\n condition?: string\n }\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendEventStepConfig {\n name: string\n provider: string\n eventName: string\n properties?: Record<string, any>\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendTextStepConfig {\n name: string\n to: string\n from?: string\n message: string\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface FetchGitHubStepConfig {\n name: string\n repository: string\n branch?: string\n path?: string\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\ninterface FlowStep {\n id: string\n type: string\n name: string\n order: number\n enabled: boolean\n config: Record<string, any>\n}\n\ninterface UpsertOptions {\n createVersionOnChange?: boolean\n allowOverwriteExternalChanges?: boolean\n}\n\ninterface DispatchOptions {\n streamResponse?: boolean\n modelOverride?: string\n recordMode?: 'existing' | 'create' | 'virtual'\n flowMode?: 'existing' | 'create' | 'virtual' | 'upsert'\n storeResults?: boolean\n autoAppendMetadata?: boolean\n debugMode?: boolean\n createVersion?: boolean\n versionType?: 'published' | 'draft' | 'test' | 'virtual'\n versionLabel?: string\n versionNotes?: string\n flowVersionId?: string\n upsertOptions?: UpsertOptions\n}\n\n// ============================================================================\n// FlowsNamespace\n// ============================================================================\n\nexport class FlowsNamespace {\n constructor(private getClient: () => RuntypeClient) {}\n\n /**\n * Create or update a flow by name (upsert mode)\n *\n * The recommended pattern for code-first flow management.\n * Creates the flow if it doesn't exist, updates if steps changed.\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.upsert({\n * name: 'My Flow',\n * createVersionOnChange: true\n * })\n * .prompt({ name: 'Analyze', model: 'gpt-4o', userPrompt: '...' })\n * .stream()\n * ```\n */\n upsert(config: UpsertFlowConfig): RuntypeFlowBuilder {\n return new RuntypeFlowBuilder(this.getClient, 'upsert', config)\n }\n\n /**\n * Create a virtual flow (one-off, not saved)\n *\n * Use for temporary or ad-hoc flow execution.\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.virtual({ name: 'Temp Flow' })\n * .prompt({ name: 'Process', model: 'gpt-4o', userPrompt: '...' })\n * .stream()\n * ```\n */\n virtual(config: FlowConfig): RuntypeFlowBuilder {\n return new RuntypeFlowBuilder(this.getClient, 'virtual', config)\n }\n\n /**\n * Use an existing flow by ID\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.use('flow_123')\n * .withRecord({ name: 'Test', type: 'data' })\n * .stream()\n * ```\n */\n use(flowId: string): RuntypeFlowBuilder {\n return new RuntypeFlowBuilder(this.getClient, 'existing', undefined, flowId)\n }\n\n /**\n * Quick execution of an existing flow\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.execute('flow_123', {\n * record: { name: 'Test', type: 'data' },\n * streamResponse: true\n * })\n * ```\n */\n async execute(\n flowId: string,\n options?: {\n record?: RecordConfig\n messages?: Message[]\n streamResponse?: boolean\n }\n ): Promise<FlowResult> {\n const builder = this.use(flowId)\n if (options?.record) builder.withRecord(options.record)\n if (options?.messages) builder.withMessages(options.messages)\n return options?.streamResponse !== false ? builder.stream() : builder.result()\n }\n}\n\n// ============================================================================\n// RuntypeFlowBuilder\n// ============================================================================\n\n/**\n * Fluent builder for constructing and executing flows\n */\nexport class RuntypeFlowBuilder {\n private flowConfig: FlowConfig\n private steps: FlowStep[] = []\n private recordConfig: RecordConfig | undefined\n private messagesConfig: Message[] | undefined\n private stepCounter = 0\n private existingFlowId: string | undefined\n private mode: 'upsert' | 'virtual' | 'existing'\n private upsertOptions: UpsertOptions = {}\n private dispatchOptions: Partial<DispatchOptions> = {}\n\n constructor(\n private getClient: () => RuntypeClient,\n mode: 'upsert' | 'virtual' | 'existing',\n config?: FlowConfig | UpsertFlowConfig,\n flowId?: string\n ) {\n this.mode = mode\n\n if (mode === 'existing' && flowId) {\n this.existingFlowId = flowId\n this.flowConfig = { name: '' }\n } else if (config) {\n const { createVersionOnChange, allowOverwriteExternalChanges, ...flowConfig } =\n config as UpsertFlowConfig\n this.flowConfig = flowConfig\n\n if (mode === 'upsert') {\n this.upsertOptions = {\n createVersionOnChange: createVersionOnChange ?? true,\n ...(allowOverwriteExternalChanges !== undefined && { allowOverwriteExternalChanges }),\n }\n }\n } else {\n this.flowConfig = { name: 'Untitled Flow' }\n }\n }\n\n // ============================================================================\n // Configuration Methods\n // ============================================================================\n\n /**\n * Set the record configuration\n */\n withRecord(config: RecordConfig): this {\n this.recordConfig = config\n return this\n }\n\n /**\n * Set conversation messages\n */\n withMessages(messages: Message[]): this {\n this.messagesConfig = messages\n return this\n }\n\n /**\n * Set dispatch options\n */\n withOptions(options: Partial<DispatchOptions>): this {\n this.dispatchOptions = { ...this.dispatchOptions, ...options }\n return this\n }\n\n // ============================================================================\n // Step Methods\n // ============================================================================\n\n /**\n * Add a prompt step\n */\n prompt(config: PromptStepConfig): this {\n this.addStep(\n 'prompt',\n config.name,\n {\n model: config.model,\n userPrompt: config.userPrompt,\n text: config.userPrompt,\n systemPrompt: config.systemPrompt,\n previousMessages: config.previousMessages,\n outputVariable: config.outputVariable,\n responseFormat: config.responseFormat,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n reasoning: config.reasoning,\n streamOutput: config.streamOutput,\n tools: config.tools,\n errorHandling: config.errorHandling,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a fetch URL step\n */\n fetchUrl(config: FetchUrlStepConfig): this {\n this.addStep(\n 'fetch-url',\n config.name,\n {\n http: {\n url: config.url,\n method: config.method || 'GET',\n headers: config.headers,\n body: config.body,\n },\n responseType: config.responseType,\n markdownIfAvailable: config.markdownIfAvailable,\n fetchMethod: config.fetchMethod,\n firecrawl: config.firecrawl,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a transform data step\n */\n transformData(config: TransformDataStepConfig): this {\n this.addStep(\n 'transform-data',\n config.name,\n {\n script: config.script,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a set variable step\n */\n setVariable(config: SetVariableStepConfig): this {\n this.addStep(\n 'set-variable',\n config.name,\n {\n variableName: config.variableName,\n value: config.value,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a conditional step\n */\n conditional(config: ConditionalStepConfig): this {\n this.addStep(\n 'conditional',\n config.name,\n {\n condition: config.condition,\n trueSteps: config.trueSteps || [],\n falseSteps: config.falseSteps || [],\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a search step\n */\n search(config: SearchStepConfig): this {\n this.addStep(\n 'search',\n config.name,\n {\n provider: config.provider,\n query: config.query,\n maxResults: config.maxResults,\n outputVariable: config.outputVariable,\n returnCitations: config.returnCitations,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send email step\n */\n sendEmail(config: SendEmailStepConfig): this {\n this.addStep(\n 'send-email',\n config.name,\n {\n to: config.to,\n from: config.from || '{{_flow.id}}@runtype.email',\n subject: config.subject,\n html: config.html,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send stream step\n */\n sendStream(config: SendStreamStepConfig): this {\n this.addStep(\n 'send-stream',\n config.name,\n {\n message: config.message,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a retrieve record step\n */\n retrieveRecord(config: RetrieveRecordStepConfig): this {\n this.addStep(\n 'retrieve-record',\n config.name,\n {\n recordType: config.recordType,\n recordName: config.recordName,\n fieldsToInclude: config.fieldsToInclude,\n fieldsToExclude: config.fieldsToExclude,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add an upsert record step\n */\n upsertRecord(config: UpsertRecordStepConfig): this {\n this.addStep(\n 'upsert-record',\n config.name,\n {\n recordType: config.recordType,\n recordName: config.recordName,\n sourceVariable: config.sourceVariable,\n mergeStrategy: config.mergeStrategy,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a vector search step\n */\n vectorSearch(config: VectorSearchStepConfig): this {\n this.addStep(\n 'vector-search',\n config.name,\n {\n query: config.query,\n recordType: config.recordType,\n embeddingModel: config.embeddingModel,\n limit: config.limit,\n threshold: config.threshold,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a generate embedding step\n */\n generateEmbedding(config: GenerateEmbeddingStepConfig): this {\n this.addStep(\n 'generate-embedding',\n config.name,\n {\n inputSource: 'text',\n text: config.text,\n embeddingModel: config.embeddingModel,\n maxLength: config.maxLength,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a wait until step\n */\n waitUntil(config: WaitUntilStepConfig): this {\n this.addStep(\n 'wait-until',\n config.name,\n {\n delayMs: config.delayMs,\n continueOnTimeout: config.continueOnTimeout,\n poll: config.poll,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send event step\n */\n sendEvent(config: SendEventStepConfig): this {\n this.addStep(\n 'send-event',\n config.name,\n {\n provider: config.provider,\n eventName: config.eventName,\n properties: config.properties,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send text step\n */\n sendText(config: SendTextStepConfig): this {\n this.addStep(\n 'send-text',\n config.name,\n {\n to: config.to,\n from: config.from,\n message: config.message,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a fetch GitHub step\n */\n fetchGitHub(config: FetchGitHubStepConfig): this {\n this.addStep(\n 'fetch-github',\n config.name,\n {\n repository: config.repository,\n branch: config.branch,\n path: config.path,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n // ============================================================================\n // Terminal Methods\n // ============================================================================\n\n /**\n * Execute the flow with streaming response\n *\n * Returns a FlowResult that streams chunks as they arrive.\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.upsert({ name: 'My Flow' })\n * .prompt({ ... })\n * .stream()\n *\n * // Process with callbacks\n * await result.stream({\n * onStepChunk: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: () => console.log('Done!'),\n * })\n *\n * // With local tools\n * await result.stream({\n * localTools: { ... }\n * })\n * ```\n */\n stream(callbacks: StreamCallbacks, options: LocalToolsOptions): Promise<FlowResult>\n stream(callbacks?: StreamCallbacks): Promise<FlowResult>\n stream(options: LocalToolsOptions): Promise<FlowResult>\n async stream(\n arg1?: StreamCallbacks | LocalToolsOptions,\n arg2?: LocalToolsOptions\n ): Promise<FlowResult> {\n const config = this.build()\n\n let callbacks: StreamCallbacks | undefined\n let localTools: Record<string, (args: any) => Promise<any>> | undefined\n\n if (arg1) {\n if ('localTools' in arg1) {\n localTools = (arg1 as LocalToolsOptions).localTools\n } else {\n callbacks = arg1 as StreamCallbacks\n if (arg2) {\n localTools = arg2.localTools\n }\n }\n }\n\n // Handle local tools if provided\n if (localTools) {\n return this.runWithLocalTools(localTools, callbacks)\n }\n\n config.options = { ...config.options, streamResponse: true }\n\n const client = this.getClient()\n const response = await client.dispatch(config)\n\n const result = new FlowResult(response)\n\n // If callbacks provided, process immediately\n if (callbacks) {\n await result.stream(callbacks)\n }\n\n return result\n }\n\n /**\n * Execute the flow and wait for complete result (no streaming)\n *\n * Returns a FlowResult after all steps have completed.\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.use('flow_123')\n * .withRecord({ ... })\n * .result()\n *\n * const analysis = await result.getResult('Analyze')\n * const allResults = await result.getAllResults()\n * ```\n */\n async result(options?: LocalToolsOptions): Promise<FlowResult> {\n const config = this.build()\n\n // Handle local tools if provided\n if (options?.localTools) {\n return this.runWithLocalTools(options.localTools)\n }\n\n config.options = { ...config.options, streamResponse: true }\n\n const client = this.getClient()\n const response = await client.dispatch(config)\n\n const result = new FlowResult(response)\n // Pre-process the stream to cache results\n await result.getSummary()\n\n return result\n }\n\n /**\n * Execute the flow with local tools (automatic pause/resume loop)\n *\n * @param localTools - Map of tool names to async functions that execute the tool logic\n * @returns The final result of the flow execution\n */\n async runWithLocalTools(\n localTools: Record<string, (args: any) => Promise<any>>,\n callbacks?: StreamCallbacks\n ): Promise<FlowResult> {\n const config = this.build()\n const isStreaming = !!callbacks\n\n // Force options\n config.options = {\n ...config.options,\n streamResponse: isStreaming,\n }\n\n const client = this.getClient()\n\n // Accumulated results across pause/resume cycles - moved outside processStep\n // so results persist when flow pauses and resumes\n const accumulatedSummary: Partial<FlowSummary> = {\n results: new Map(),\n success: true,\n }\n\n // Helper to process a step result (either from stream or JSON)\n const processStep = async (response: Response): Promise<{ done: boolean; result: any }> => {\n if (isStreaming) {\n // Stream processing\n let pausedState: { toolName: string; parameters: any; executionId: string } | null = null\n\n // Wrap user callbacks to intercept paused event\n const wrappedCallbacks: StreamCallbacks = {\n ...callbacks,\n onFlowStart: (event) => callbacks?.onFlowStart?.(event),\n onStepStart: (event) => callbacks?.onStepStart?.(event),\n onStepChunk: (chunk, event) => callbacks?.onStepChunk?.(chunk, event),\n onStepComplete: (result, event) => callbacks?.onStepComplete?.(result, event),\n onFlowComplete: (event) => callbacks?.onFlowComplete?.(event),\n onError: (error) => callbacks?.onError?.(error),\n }\n\n // Use streamEvents from stream-utils\n const { streamEvents } = await import('./stream-utils')\n\n try {\n for await (const event of streamEvents(response)) {\n if ((event as any).type === 'flow_await') {\n pausedState = {\n toolName: (event as any).toolName,\n parameters: (event as any).parameters,\n executionId: (event as any).executionId,\n } as any\n }\n\n if ((event as any).type === 'step_await') {\n pausedState = {\n toolName: (event as any).toolName,\n parameters: (event as any).parameters,\n executionId: (event as any).executionId,\n }\n }\n\n // Handle standard events via callbacks\n switch (event.type) {\n case 'flow_start':\n wrappedCallbacks.onFlowStart?.(event)\n break\n case 'step_start':\n wrappedCallbacks.onStepStart?.(event)\n break\n case 'step_delta': {\n // Normalize API's 'text' field to 'chunk' for consistency\n const chunkText = (event as any).chunk || (event as any).text || ''\n wrappedCallbacks.onStepChunk?.(chunkText, event)\n break\n }\n case 'step_complete': {\n // Accumulate results in the outer summary that persists across pause/resume\n accumulatedSummary.results?.set(event.name, event.result)\n wrappedCallbacks.onStepComplete?.(event.result, event)\n break\n }\n case 'flow_complete':\n wrappedCallbacks.onFlowComplete?.(event)\n break\n case 'flow_error':\n wrappedCallbacks.onError?.(new Error(event.error))\n break\n }\n }\n } catch (e) {\n wrappedCallbacks.onError?.(e instanceof Error ? e : new Error(String(e)))\n throw e\n }\n\n if (pausedState) {\n return {\n done: false,\n result: { status: 'paused', pausedReason: { type: 'local_action', ...pausedState } },\n }\n }\n\n return { done: true, result: accumulatedSummary as FlowSummary }\n } else {\n // Non-streaming (JSON)\n const data = await response.json()\n return {\n done: data.status !== 'paused',\n result: data,\n }\n }\n }\n\n // Initial dispatch\n let currentResponse: Response\n if (isStreaming) {\n currentResponse = await client.dispatch(config)\n } else {\n const data = await client.post<any>('/dispatch', config)\n currentResponse = new Response(JSON.stringify(data), {\n headers: { 'content-type': 'application/json' },\n })\n }\n\n // Loop\n while (true) {\n const { done, result } = await processStep(currentResponse)\n\n if (done) {\n if (isStreaming) {\n // Create FlowResult with summary\n const finalResponse = new Response(JSON.stringify(result), {\n headers: { 'content-type': 'application/json' },\n })\n return new FlowResult(finalResponse, result as FlowSummary)\n }\n return new FlowResult(\n new Response(JSON.stringify(result), { headers: { 'content-type': 'application/json' } })\n )\n }\n\n // Handle Pause\n if (result.status === 'paused' && result.pausedReason?.type === 'local_action') {\n const { toolName, parameters, executionId } = result.pausedReason\n\n if (!localTools[toolName]) {\n throw new Error(`Local tool \"${toolName}\" required but not provided in localTools map`)\n }\n\n try {\n // Execute local tool logic\n const toolResult = await localTools[toolName](parameters)\n\n // Resume flow execution - API expects camelCase field names\n const resumeData = {\n executionId: executionId,\n toolOutputs: { [toolName]: toolResult },\n streamResponse: isStreaming,\n }\n\n if (isStreaming) {\n currentResponse = await client.requestStream('/dispatch/resume', {\n method: 'POST',\n body: JSON.stringify(resumeData),\n })\n } else {\n const data = await client.post('/dispatch/resume', resumeData)\n currentResponse = new Response(JSON.stringify(data), {\n headers: { 'content-type': 'application/json' },\n })\n }\n } catch (error) {\n throw new Error(\n `Error executing local tool \"${toolName}\": ${error instanceof Error ? error.message : String(error)}`\n )\n }\n } else {\n break\n }\n }\n\n throw new Error('Unexpected end of flow execution loop')\n }\n build(): DispatchRequest {\n const flowMode = this.mode === 'existing' ? 'existing' : this.mode\n\n const flow = this.existingFlowId\n ? { id: this.existingFlowId }\n : { name: this.flowConfig.name, steps: this.steps }\n\n const request: DispatchRequest = { flow }\n\n if (this.recordConfig) {\n request.record = this.recordConfig\n }\n\n if (this.messagesConfig) {\n request.messages = this.messagesConfig\n }\n\n const options: DispatchOptions = {\n flowMode,\n ...this.dispatchOptions,\n }\n\n // Auto-detect recordMode based on record config if not explicitly set\n if (this.recordConfig && !this.dispatchOptions.recordMode) {\n if (this.recordConfig.id) {\n options.recordMode = 'existing'\n } else if (this.recordConfig.name || this.recordConfig.type) {\n options.recordMode = 'create'\n } else {\n options.recordMode = 'virtual'\n }\n }\n\n if (this.mode === 'upsert' && Object.keys(this.upsertOptions).length > 0) {\n options.upsertOptions = this.upsertOptions\n }\n\n request.options = options\n\n return request\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private addStep(\n type: string,\n name: string,\n config: Record<string, any>,\n enabled: boolean = true\n ): void {\n this.stepCounter++\n\n const cleanConfig: Record<string, any> = {}\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n cleanConfig[key] = value\n }\n }\n\n this.steps.push({\n id: `step-${this.stepCounter}`,\n type,\n name,\n order: this.stepCounter,\n enabled,\n config: cleanConfig,\n })\n }\n}\n","/**\n * BatchesNamespace - Static namespace for batch operations\n *\n * Provides direct methods for scheduling and managing batch operations.\n * Batches are always asynchronous - they don't return results immediately.\n */\n\nimport type { RuntypeClient } from './runtype'\n\n// ============================================================================\n// Configuration Interfaces\n// ============================================================================\n\nexport interface BatchScheduleConfig {\n /** Flow ID to execute for each record */\n flowId: string\n /** Record type to batch process */\n recordType: string\n /** When to execute (defaults to immediately) */\n at?: Date\n /** Run batch asynchronously (default: true) */\n async?: boolean\n /** Maximum concurrent executions */\n concurrency?: number\n /** Continue on individual record failures */\n continueOnError?: boolean\n /** Store results for each record */\n storeResults?: boolean\n /** Model override for batch execution */\n modelOverride?: string\n /** Optional filter for records */\n filter?: Record<string, any>\n /** Optional limit on number of records */\n limit?: number\n}\n\nexport interface BatchStatus {\n batchId: string\n status: 'queued' | 'scheduled' | 'running' | 'completed' | 'failed' | 'cancelled'\n totalRecords: number\n processedRecords: number\n failedRecords: number\n scheduledAt?: string\n startedAt?: string\n completedAt?: string\n}\n\nexport interface BatchListParams {\n /** Filter by status */\n status?: 'queued' | 'scheduled' | 'running' | 'completed' | 'failed' | 'cancelled'\n /** Filter by flow ID */\n flowId?: string\n /** Filter by record type */\n recordType?: string\n /** Pagination limit */\n limit?: number\n /** Pagination offset */\n offset?: number\n}\n\n// ============================================================================\n// BatchesNamespace\n// ============================================================================\n\nexport class BatchesNamespace {\n constructor(private getClient: () => RuntypeClient) {}\n\n /**\n * Schedule a batch operation\n *\n * Creates and schedules a batch to run a flow on all records of a type.\n * By default, runs immediately. Use `at` to schedule for a specific time.\n *\n * @example\n * ```typescript\n * // Run immediately\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * })\n *\n * // Schedule for later\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * at: new Date('2024-01-15T09:00:00Z'),\n * })\n *\n * // With options\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * concurrency: 5,\n * continueOnError: true,\n * filter: { status: 'active' },\n * limit: 100,\n * })\n * ```\n */\n async schedule(config: BatchScheduleConfig): Promise<BatchStatus> {\n const client = this.getClient()\n\n const payload: any = {\n flowId: config.flowId,\n recordType: config.recordType,\n }\n\n if (config.at) {\n payload.scheduledAt = config.at.toISOString()\n }\n\n const options: any = {}\n if (config.async !== undefined) options.async = config.async\n if (config.concurrency !== undefined) options.concurrency = config.concurrency\n if (config.continueOnError !== undefined) options.continueOnError = config.continueOnError\n if (config.storeResults !== undefined) options.storeResults = config.storeResults\n if (config.modelOverride !== undefined) options.modelOverride = config.modelOverride\n\n if (Object.keys(options).length > 0) {\n payload.options = options\n }\n\n if (config.filter) {\n payload.filter = config.filter\n }\n\n if (config.limit !== undefined) {\n payload.limit = config.limit\n }\n\n return client.post<BatchStatus>('/batches', payload)\n }\n\n /**\n * Get batch status by ID\n *\n * @example\n * ```typescript\n * const status = await Runtype.batches.get('batch_456')\n * console.log(status.status, status.processedRecords, '/', status.totalRecords)\n * ```\n */\n async get(batchId: string): Promise<BatchStatus> {\n const client = this.getClient()\n return client.get<BatchStatus>(`/batches/${batchId}`)\n }\n\n /**\n * Cancel a batch operation\n *\n * Cancels a queued or running batch. Records already processed are not rolled back.\n *\n * @example\n * ```typescript\n * await Runtype.batches.cancel('batch_456')\n * ```\n */\n async cancel(batchId: string): Promise<{ success: boolean; message: string }> {\n const client = this.getClient()\n return client.post<{ success: boolean; message: string }>(`/batches/${batchId}/cancel`)\n }\n\n /**\n * List batch operations\n *\n * @example\n * ```typescript\n * // List all batches\n * const batches = await Runtype.batches.list()\n *\n * // Filter by status\n * const running = await Runtype.batches.list({ status: 'running' })\n *\n * // Filter by flow\n * const flowBatches = await Runtype.batches.list({ flowId: 'flow_123' })\n * ```\n */\n async list(params?: BatchListParams): Promise<{ data: BatchStatus[]; total: number }> {\n const client = this.getClient()\n return client.get<{ data: BatchStatus[]; total: number }>('/batches', params)\n }\n}\n","/**\n * EvalsNamespace - Static namespace for evaluation operations\n *\n * Provides methods for running evaluations and comparing model performance.\n * Evals can be streamed for real-time results or submitted as batch jobs.\n */\n\nimport type { RuntypeClient } from './runtype'\nimport { FlowResult } from './flow-result'\nimport type { StreamCallbacks, FlowSummary } from './flow-builder'\n\n// ============================================================================\n// Configuration Interfaces\n// ============================================================================\n\nexport interface ModelOverride {\n /** Name of the step to override */\n stepName: string\n /** Model to use for this step */\n model: string\n /** Optional temperature override */\n temperature?: number\n /** Optional max tokens override */\n maxTokens?: number\n}\n\nexport interface EvalRunConfig {\n /** Flow ID to evaluate */\n flowId?: string\n /** Virtual flow definition (alternative to flowId) */\n flow?: {\n name: string\n steps: any[]\n }\n /** Record type to evaluate against */\n recordType?: string\n /** Inline records for ad-hoc evaluation */\n records?: Array<{\n name: string\n type: string\n metadata: Record<string, any>\n }>\n /** Model overrides for single-model evaluation */\n models?: ModelOverride[]\n /** Multiple model configurations for comparison */\n compareModels?: ModelOverride[][]\n /** Store evaluation results */\n storeResults?: boolean\n /** Run evaluations in parallel */\n parallel?: boolean\n /** Maximum concurrent evaluations */\n concurrency?: number\n /** Continue on individual record failures */\n continueOnError?: boolean\n /** Optional filter for records */\n filter?: Record<string, any>\n /** Optional limit on number of records */\n limit?: number\n}\n\nexport interface EvalStatus {\n evalId: string\n status: 'queued' | 'running' | 'completed' | 'failed'\n totalRecords: number\n completedRecords: number\n failedRecords: number\n results?: Array<{\n modelConfig: ModelOverride[]\n records: Array<{\n recordId: string\n status: 'success' | 'error'\n result?: any\n error?: string\n executionTime: number\n }>\n }>\n}\n\nexport interface EvalListParams {\n /** Filter by status */\n status?: 'queued' | 'running' | 'completed' | 'failed'\n /** Filter by flow ID */\n flowId?: string\n /** Pagination limit */\n limit?: number\n /** Pagination offset */\n offset?: number\n}\n\n// ============================================================================\n// EvalRunner\n// ============================================================================\n\n/**\n * EvalRunner - Builder returned by Runtype.evals.run()\n *\n * Provides terminal methods for executing evaluations:\n * - .stream() - Execute and stream results in real-time\n * - .submit() - Submit as a batch job for async processing\n */\nexport class EvalRunner {\n constructor(\n private getClient: () => RuntypeClient,\n private config: EvalRunConfig\n ) {}\n\n /**\n * Execute the evaluation with streaming results\n *\n * Streams evaluation results as they complete.\n * Good for real-time feedback during development/testing.\n *\n * @example\n * ```typescript\n * const result = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [{ stepName: 'Analyze', model: 'gpt-4o' }]\n * }).stream()\n *\n * // Process with callbacks\n * await result.stream({\n * onStepComplete: (result, event) => {\n * console.log('Step completed:', event.name, result)\n * },\n * })\n * ```\n */\n async stream(callbacks?: StreamCallbacks): Promise<FlowResult> {\n const client = this.getClient()\n\n const payload = this.buildPayload()\n payload.stream = true\n\n const response = await client.requestStream('/eval/stream', {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n\n const result = new FlowResult(response)\n\n if (callbacks) {\n await result.stream(callbacks)\n }\n\n return result\n }\n\n /**\n * Submit the evaluation as a batch job\n *\n * Queues the evaluation to run asynchronously.\n * Good for large evaluations or scheduled runs.\n *\n * @example\n * ```typescript\n * const eval = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * compareModels: [\n * [{ stepName: 'Analyze', model: 'gpt-4o' }],\n * [{ stepName: 'Analyze', model: 'claude-3-opus' }],\n * ]\n * }).submit()\n *\n * console.log('Eval queued:', eval.evalId)\n *\n * // Check status later\n * const status = await Runtype.evals.get(eval.evalId)\n * ```\n */\n async submit(): Promise<EvalStatus> {\n const client = this.getClient()\n\n const payload = this.buildPayload()\n payload.async = true\n\n return client.post<EvalStatus>('/evals', payload)\n }\n\n /**\n * Build the evaluation payload\n */\n private buildPayload(): any {\n const payload: any = {}\n\n if (this.config.flowId) {\n payload.flowId = this.config.flowId\n } else if (this.config.flow) {\n payload.flow = this.config.flow\n }\n\n if (this.config.recordType) {\n payload.recordType = this.config.recordType\n } else if (this.config.records) {\n payload.records = this.config.records\n }\n\n if (this.config.models) {\n payload.modelOverrides = this.config.models\n } else if (this.config.compareModels) {\n payload.modelConfigs = this.config.compareModels\n }\n\n const options: any = {}\n if (this.config.storeResults !== undefined) options.storeResults = this.config.storeResults\n if (this.config.parallel !== undefined) options.parallel = this.config.parallel\n if (this.config.concurrency !== undefined) options.concurrency = this.config.concurrency\n if (this.config.continueOnError !== undefined)\n options.continueOnError = this.config.continueOnError\n\n if (Object.keys(options).length > 0) {\n payload.options = options\n }\n\n if (this.config.filter) {\n payload.filter = this.config.filter\n }\n\n if (this.config.limit !== undefined) {\n payload.limit = this.config.limit\n }\n\n return payload\n }\n}\n\n// ============================================================================\n// EvalsNamespace\n// ============================================================================\n\nexport class EvalsNamespace {\n constructor(private getClient: () => RuntypeClient) {}\n\n /**\n * Run an evaluation\n *\n * Returns an EvalRunner with terminal methods:\n * - .stream() - Execute and stream results\n * - .submit() - Submit as batch job\n *\n * @example\n * ```typescript\n * // Single model evaluation with streaming\n * const result = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [{ stepName: 'Analyze', model: 'gpt-4o' }]\n * }).stream()\n *\n * // Multi-model comparison as batch\n * const eval = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * compareModels: [\n * [{ stepName: 'Analyze', model: 'gpt-4o' }],\n * [{ stepName: 'Analyze', model: 'claude-3-opus' }],\n * [{ stepName: 'Analyze', model: 'gemini-pro' }],\n * ]\n * }).submit()\n * ```\n */\n run(config: EvalRunConfig): EvalRunner {\n return new EvalRunner(this.getClient, config)\n }\n\n /**\n * Get evaluation status by ID\n *\n * @example\n * ```typescript\n * const status = await Runtype.evals.get('eval_123')\n * console.log(status.status, status.completedRecords, '/', status.totalRecords)\n * ```\n */\n async get(evalId: string): Promise<EvalStatus> {\n const client = this.getClient()\n return client.get<EvalStatus>(`/evals/${evalId}`)\n }\n\n /**\n * List evaluations\n *\n * @example\n * ```typescript\n * // List all evals\n * const evals = await Runtype.evals.list()\n *\n * // Filter by status\n * const running = await Runtype.evals.list({ status: 'running' })\n *\n * // Filter by flow\n * const flowEvals = await Runtype.evals.list({ flowId: 'flow_123' })\n * ```\n */\n async list(params?: EvalListParams): Promise<{ data: EvalStatus[]; total: number }> {\n const client = this.getClient()\n return client.get<{ data: EvalStatus[]; total: number }>('/evals', params)\n }\n}\n","/**\n * PromptsNamespace - Static namespace for prompt operations\n *\n * Provides CRUD operations for prompts and execution methods\n * with streaming and non-streaming options.\n */\n\nimport type { RuntypeClient } from './runtype'\nimport type { ReasoningConfig } from './types'\nimport { FlowResult } from './flow-result'\nimport type { StreamCallbacks, FlowSummary } from './flow-builder'\n\n// ============================================================================\n// Configuration Interfaces\n// ============================================================================\n\nexport interface CreatePromptData {\n /** Prompt name */\n name: string\n /** Prompt description */\n description?: string\n /** Model to use */\n model: string\n /** System prompt text */\n systemPrompt?: string\n /** User prompt template */\n userPrompt: string\n /** Response format */\n responseFormat?: 'text' | 'json' | 'markdown'\n /** Temperature */\n temperature?: number\n /** Max tokens */\n maxTokens?: number\n /** Enable reasoning/extended thinking. Use `true` for defaults or `ReasoningConfig` for fine-grained control */\n reasoning?: boolean | ReasoningConfig\n /** Flow IDs to attach this prompt to */\n flowIds?: string[]\n}\n\nexport interface UpdatePromptData {\n /** Prompt name */\n name?: string\n /** Prompt description */\n description?: string\n /** Model to use */\n model?: string\n /** System prompt text */\n systemPrompt?: string\n /** User prompt template */\n userPrompt?: string\n /** Response format */\n responseFormat?: 'text' | 'json' | 'markdown'\n /** Temperature */\n temperature?: number\n /** Max tokens */\n maxTokens?: number\n /** Enable reasoning/extended thinking. Use `true` for defaults or `ReasoningConfig` for fine-grained control */\n reasoning?: boolean | ReasoningConfig\n}\n\nexport interface Prompt {\n id: string\n userId: string\n name: string\n description?: string\n model: string\n systemPrompt?: string\n userPrompt: string\n responseFormat?: string\n temperature?: number\n maxTokens?: number\n reasoning?: boolean | ReasoningConfig\n createdAt: string\n updatedAt: string\n}\n\nexport interface PromptRunOptions {\n /** Record ID to run the prompt against */\n recordId?: string\n /** Record data (alternative to recordId) */\n record?: {\n name?: string\n type?: string\n metadata?: Record<string, any>\n }\n /** Model override */\n modelOverride?: string\n /** Temperature override */\n temperature?: number\n /** Max tokens override */\n maxTokens?: number\n /** Store the result */\n storeResult?: boolean\n}\n\nexport interface PromptListParams {\n /** Filter by flow ID */\n flowId?: string\n /** Search by name */\n search?: string\n /** Pagination limit */\n limit?: number\n /** Pagination offset */\n offset?: number\n}\n\n// ============================================================================\n// PromptRunner\n// ============================================================================\n\n/**\n * PromptRunner - Builder returned by Runtype.prompts.run()\n *\n * Provides terminal methods for executing prompts:\n * - .stream() - Execute and stream results in real-time\n * - .result() - Execute and wait for complete result\n */\nexport class PromptRunner {\n constructor(\n private getClient: () => RuntypeClient,\n private promptId: string,\n private options: PromptRunOptions\n ) {}\n\n /**\n * Execute the prompt with streaming response\n *\n * Streams the prompt response as it's generated.\n *\n * @example\n * ```typescript\n * const result = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).stream()\n *\n * // Process with callbacks\n * await result.stream({\n * onStepChunk: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: () => console.log('Done!'),\n * })\n * ```\n */\n async stream(callbacks?: StreamCallbacks): Promise<FlowResult> {\n const client = this.getClient()\n\n const payload = this.buildPayload()\n payload.stream = true\n\n const response = await client.requestStream(`/prompts/${this.promptId}/run`, {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n\n const result = new FlowResult(response)\n\n if (callbacks) {\n await result.stream(callbacks)\n }\n\n return result\n }\n\n /**\n * Execute the prompt and wait for complete result\n *\n * Waits for the entire response before returning.\n *\n * @example\n * ```typescript\n * const result = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).result()\n *\n * const output = await result.getResult('prompt')\n * console.log(output)\n * ```\n */\n async result(): Promise<FlowResult> {\n const client = this.getClient()\n\n const payload = this.buildPayload()\n payload.stream = true // Still use streaming internally for FlowResult\n\n const response = await client.requestStream(`/prompts/${this.promptId}/run`, {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n\n const result = new FlowResult(response)\n // Pre-process to cache results\n await result.getSummary()\n\n return result\n }\n\n /**\n * Build the run payload\n */\n private buildPayload(): any {\n const payload: any = {}\n\n if (this.options.recordId) {\n payload.recordId = this.options.recordId\n } else if (this.options.record) {\n payload.record = this.options.record\n }\n\n if (this.options.modelOverride) {\n payload.modelOverride = this.options.modelOverride\n }\n\n if (this.options.temperature !== undefined) {\n payload.temperature = this.options.temperature\n }\n\n if (this.options.maxTokens !== undefined) {\n payload.maxTokens = this.options.maxTokens\n }\n\n if (this.options.storeResult !== undefined) {\n payload.storeResult = this.options.storeResult\n }\n\n return payload\n }\n}\n\n// ============================================================================\n// PromptsNamespace\n// ============================================================================\n\nexport class PromptsNamespace {\n constructor(private getClient: () => RuntypeClient) {}\n\n /**\n * Run a prompt\n *\n * Returns a PromptRunner with terminal methods:\n * - .stream() - Execute and stream results\n * - .result() - Execute and wait for complete result\n *\n * @example\n * ```typescript\n * // Stream the response\n * const result = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).stream()\n *\n * // Get complete result\n * const result = await Runtype.prompts.run('prompt_123', {\n * record: { name: 'Test', metadata: { input: 'Hello' } }\n * }).result()\n * ```\n */\n run(promptId: string, options: PromptRunOptions = {}): PromptRunner {\n return new PromptRunner(this.getClient, promptId, options)\n }\n\n /**\n * Create a new prompt\n *\n * @example\n * ```typescript\n * const prompt = await Runtype.prompts.create({\n * name: 'Summarizer',\n * model: 'gpt-4o',\n * userPrompt: 'Summarize the following: {{content}}',\n * systemPrompt: 'You are a helpful assistant.',\n * })\n * ```\n */\n async create(data: CreatePromptData): Promise<Prompt> {\n const client = this.getClient()\n return client.post<Prompt>('/prompts', data)\n }\n\n /**\n * List prompts\n *\n * @example\n * ```typescript\n * // List all prompts\n * const prompts = await Runtype.prompts.list()\n *\n * // Filter by flow\n * const flowPrompts = await Runtype.prompts.list({ flowId: 'flow_123' })\n *\n * // Search by name\n * const results = await Runtype.prompts.list({ search: 'summarize' })\n * ```\n */\n async list(params?: PromptListParams): Promise<{ data: Prompt[]; total: number }> {\n const client = this.getClient()\n return client.get<{ data: Prompt[]; total: number }>('/prompts', params)\n }\n\n /**\n * Get a prompt by ID\n *\n * @example\n * ```typescript\n * const prompt = await Runtype.prompts.get('prompt_123')\n * console.log(prompt.name, prompt.userPrompt)\n * ```\n */\n async get(promptId: string): Promise<Prompt> {\n const client = this.getClient()\n return client.get<Prompt>(`/prompts/${promptId}`)\n }\n\n /**\n * Update a prompt\n *\n * @example\n * ```typescript\n * const updated = await Runtype.prompts.update('prompt_123', {\n * userPrompt: 'Updated prompt template: {{content}}',\n * temperature: 0.7,\n * })\n * ```\n */\n async update(promptId: string, data: UpdatePromptData): Promise<Prompt> {\n const client = this.getClient()\n return client.post<Prompt>(`/prompts/${promptId}`, data)\n }\n\n /**\n * Delete a prompt\n *\n * @example\n * ```typescript\n * await Runtype.prompts.delete('prompt_123')\n * ```\n */\n async delete(promptId: string): Promise<void> {\n const client = this.getClient()\n await client.post<void>(`/prompts/${promptId}/delete`)\n }\n}\n","/**\n * @module transform\n * @layer sdk\n * @case native (API now uses native camelCase - no conversion needed)\n *\n * Transformation utilities - now pass-through since API uses native camelCase.\n *\n * The API has migrated to native camelCase for all request/response bodies.\n * These functions are now pass-throughs for backwards compatibility.\n *\n * @see packages/shared/src/transforms/case-conversion.ts\n */\n\nimport type { ToCamelCase, ToSnakeCase } from './case-types'\n\n/**\n * Convert snake_case string to camelCase\n */\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())\n}\n\n/**\n * Recursively convert object keys from snake_case to camelCase\n * Special handling: preserves keys within 'metadata', 'metadataSchema', and 'parametersSchema.properties'\n *\n * @param obj - The object to convert\n * @param preserveKeys - If true, preserve all keys at this level\n * @returns The converted object with camelCase keys (type transformed at compile time)\n */\n// Generic overload with compile-time type transformation\nfunction convertKeysToCamelCase<T extends object>(obj: T, preserveKeys?: boolean): ToCamelCase<T>\nfunction convertKeysToCamelCase<T = any>(obj: any, preserveKeys = false): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => convertKeysToCamelCase(item, preserveKeys)) as T\n } else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {\n return Object.keys(obj).reduce((result, key) => {\n const camelKey = preserveKeys ? key : snakeToCamel(key)\n\n // Special handling for metadataSchema: convert top-level keys but preserve nested content\n if (key === 'metadata_schema') {\n // Handle null/undefined metadata_schema\n if (obj[key] === null || obj[key] === undefined) {\n result[camelKey] = obj[key]\n return result\n }\n result[camelKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {\n const camelSchemaKey = snakeToCamel(schemaKey)\n\n // Preserve contents of key_types and keys, but convert the rest\n const shouldPreserveContent = schemaKey === 'key_types' || schemaKey === 'keys'\n schemaResult[camelSchemaKey] = convertKeysToCamelCase(\n obj[key][schemaKey],\n shouldPreserveContent\n )\n return schemaResult\n }, {} as any)\n return result\n }\n\n // Special handling for parametersSchema: convert top-level keys but preserve property names\n if (key === 'parameters_schema') {\n // Handle null/undefined parameters_schema\n if (obj[key] === null || obj[key] === undefined) {\n result[camelKey] = obj[key]\n return result\n }\n result[camelKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {\n const camelSchemaKey = snakeToCamel(schemaKey)\n\n // Special handling for 'properties': preserve property names but convert their attributes\n if (schemaKey === 'properties') {\n // Handle null/undefined properties\n if (obj[key][schemaKey] === null || obj[key][schemaKey] === undefined) {\n schemaResult[camelSchemaKey] = obj[key][schemaKey]\n } else {\n schemaResult[camelSchemaKey] = Object.keys(obj[key][schemaKey]).reduce(\n (propsResult, propName) => {\n // Preserve the property name (e.g., 'param1', 'param2', 'testParam')\n // But convert the property attributes (default_value -> defaultValue, min_length -> minLength, etc.)\n propsResult[propName] = convertKeysToCamelCase(\n obj[key][schemaKey][propName],\n false\n )\n return propsResult\n },\n {} as any\n )\n }\n } else {\n schemaResult[camelSchemaKey] = convertKeysToCamelCase(obj[key][schemaKey], false)\n }\n return schemaResult\n }, {} as any)\n return result\n }\n\n // Preserve original keys within metadata fields and HTTP headers\n // Headers like 'Accept', 'X-Auth-Token' should not be converted\n const shouldPreserveNextLevel =\n key === 'metadata' || key === 'metadata_labels' || key === 'headers' || preserveKeys\n\n result[camelKey] = convertKeysToCamelCase(obj[key], shouldPreserveNextLevel)\n return result\n }, {} as any) as T\n }\n return obj as T\n}\n\n/**\n * Transform API response - pass-through (API now uses native camelCase)\n */\nexport function transformResponse<T>(data: any): T {\n // No transformation needed - API uses native camelCase\n return data as T\n}\n\n/**\n * Convert camelCase string to snake_case\n */\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)\n}\n\n/**\n * Recursively convert object keys from camelCase to snake_case\n * Special handling: preserves keys within 'metadata', 'metadataSchema', and 'parametersSchema.properties'\n *\n * @param obj - The object to convert\n * @param preserveKeys - If true, preserve all keys at this level\n * @returns The converted object with snake_case keys (type transformed at compile time)\n */\n// Generic overload with compile-time type transformation\nfunction convertKeysToSnakeCase<T extends object>(obj: T, preserveKeys?: boolean): ToSnakeCase<T>\nfunction convertKeysToSnakeCase(obj: any, preserveKeys = false): any {\n if (Array.isArray(obj)) {\n return obj.map((item) => convertKeysToSnakeCase(item, preserveKeys))\n } else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {\n return Object.keys(obj).reduce((result, key) => {\n const snakeKey = preserveKeys ? key : camelToSnake(key)\n\n // Special handling for metadataSchema: convert top-level keys but preserve nested content\n if (key === 'metadataSchema' || snakeKey === 'metadata_schema') {\n const schemaKey = camelToSnake(key)\n // Handle null/undefined metadataSchema\n if (obj[key] === null || obj[key] === undefined) {\n result[schemaKey] = obj[key]\n return result\n }\n result[schemaKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {\n const snakeSchemaKey = camelToSnake(schemaKey)\n\n // Preserve contents of keyTypes and keys, but convert the rest\n const shouldPreserveContent =\n schemaKey === 'keyTypes' ||\n schemaKey === 'keys' ||\n snakeSchemaKey === 'key_types' ||\n snakeSchemaKey === 'keys'\n schemaResult[snakeSchemaKey] = convertKeysToSnakeCase(\n obj[key][schemaKey],\n shouldPreserveContent\n )\n return schemaResult\n }, {} as any)\n return result\n }\n\n // Special handling for parametersSchema: convert top-level keys but preserve property names\n if (key === 'parametersSchema' || snakeKey === 'parameters_schema') {\n const schemaKey = camelToSnake(key)\n // Handle null/undefined parametersSchema\n if (obj[key] === null || obj[key] === undefined) {\n result[schemaKey] = obj[key]\n return result\n }\n result[schemaKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {\n const snakeSchemaKey = camelToSnake(schemaKey)\n\n // Special handling for 'properties': preserve property names but convert their attributes\n if (schemaKey === 'properties' || snakeSchemaKey === 'properties') {\n // Handle null/undefined properties\n if (obj[key][schemaKey] === null || obj[key][schemaKey] === undefined) {\n schemaResult[snakeSchemaKey] = obj[key][schemaKey]\n } else {\n schemaResult[snakeSchemaKey] = Object.keys(obj[key][schemaKey]).reduce(\n (propsResult, propName) => {\n // Preserve the property name (e.g., 'param1', 'param2', 'testParam')\n // But convert the property attributes (defaultValue -> default_value, minLength -> min_length, etc.)\n propsResult[propName] = convertKeysToSnakeCase(\n obj[key][schemaKey][propName],\n false\n )\n return propsResult\n },\n {} as any\n )\n }\n } else {\n schemaResult[snakeSchemaKey] = convertKeysToSnakeCase(obj[key][schemaKey], false)\n }\n return schemaResult\n }, {} as any)\n return result\n }\n\n // Preserve original keys within metadata fields and HTTP headers\n // Headers like 'Accept', 'X-Auth-Token' should not be converted\n const shouldPreserveNextLevel =\n key === 'metadata' ||\n key === 'metadataLabels' ||\n snakeKey === 'metadata_labels' ||\n key === 'headers' ||\n preserveKeys\n\n result[snakeKey] = convertKeysToSnakeCase(obj[key], shouldPreserveNextLevel)\n return result\n }, {} as any)\n }\n return obj\n}\n\n/**\n * Transform client request - pass-through (API now accepts native camelCase)\n */\nexport function transformRequest(data: any): any {\n // No transformation needed - API accepts native camelCase\n return data\n}\n\n/**\n * Transform URL query parameters - pass-through (API now accepts camelCase params)\n */\nexport function transformQueryParams(params: { [key: string]: any }): { [key: string]: string } {\n const result: { [key: string]: string } = {}\n\n for (const [key, value] of Object.entries(params) as [string, any][]) {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n result[key] = value.join(',')\n } else {\n result[key] = String(value)\n }\n }\n }\n\n return result\n}\n\n// Re-export case type utilities for type-safe transformations\nexport type { SnakeToCamelString, CamelToSnakeString, ToCamelCase, ToSnakeCase } from './case-types'\n","/**\n * Runtype - The unified SDK client for building and executing flows, batches, evals, and prompts\n *\n * Provides a fluent API with static namespaces for all product areas.\n *\n * @example\n * ```typescript\n * import { Runtype } from '@runtypelabs/sdk'\n *\n * // Global configuration (once per app)\n * Runtype.configure({ apiKey: process.env.RUNTYPE_API_KEY })\n *\n * // Build and stream a flow\n * const stream = await Runtype.flows.upsert({ name: 'My Flow' })\n * .withRecord({ name: 'Test', metadata: {} })\n * .prompt({ name: 'Analyze', model: 'gpt-4o', userPrompt: '...' })\n * .stream()\n *\n * // Get complete result\n * const result = await Runtype.flows.use('flow_123')\n * .withRecord({ name: 'Test' })\n * .result()\n *\n * // Schedule a batch\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * })\n *\n * // Run an eval with streaming\n * const evalStream = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [{ stepName: 'Analyze', model: 'gpt-4o' }]\n * }).stream()\n *\n * // Execute a prompt\n * const promptResult = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).result()\n * ```\n */\n\nimport type { ClientConfig } from './types'\nimport { FlowsNamespace } from './flows-namespace'\nimport { BatchesNamespace } from './batches-namespace'\nimport { EvalsNamespace } from './evals-namespace'\nimport { PromptsNamespace } from './prompts-namespace'\nimport { transformRequest } from './transform'\n\n// ============================================================================\n// Global Configuration Types\n// ============================================================================\n\nexport interface RuntypeConfig {\n /** API key for authentication */\n apiKey?: string\n /** Base URL for the API (defaults to https://api.runtype.com) */\n baseUrl?: string\n /** API version (defaults to 'v1') */\n apiVersion?: string\n /** Request timeout in milliseconds (defaults to 30000) */\n timeout?: number\n /** Additional headers to include in requests */\n headers?: Record<string, string>\n}\n\n// ============================================================================\n// Global State\n// ============================================================================\n\nlet globalConfig: RuntypeConfig = {}\nlet globalClient: RuntypeClient | null = null\n\n// ============================================================================\n// RuntypeClient Class (internal implementation)\n// ============================================================================\n\n/**\n * Internal client implementation that handles HTTP requests\n */\nexport class RuntypeClient {\n private baseUrl: string\n private apiVersion: string\n private timeout: number\n private headers: Record<string, string>\n\n constructor(config: RuntypeConfig = {}) {\n const baseUrl = config.baseUrl || 'https://api.runtype.com'\n this.apiVersion = config.apiVersion || 'v1'\n this.baseUrl = this.apiVersion ? `${baseUrl}/${this.apiVersion}` : baseUrl\n this.timeout = config.timeout || 30000\n this.headers = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n }\n\n if (config.apiKey) {\n this.headers.Authorization = `Bearer ${config.apiKey}`\n }\n }\n\n /**\n * Set the API key for authentication\n */\n setApiKey(apiKey: string): void {\n this.headers.Authorization = `Bearer ${apiKey}`\n }\n\n /**\n * Generic GET request\n */\n async get<T>(path: string, params?: Record<string, any>): Promise<T> {\n const url = this.buildUrl(path, params)\n const response = await this.makeRequest(url, {\n method: 'GET',\n headers: this.headers,\n })\n return this.transformResponse<T>(response)\n }\n\n /**\n * Generic POST request\n */\n async post<T>(path: string, data?: any): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'POST',\n headers: this.headers,\n body: data ? JSON.stringify(data) : undefined,\n })\n return this.transformResponse<T>(response)\n }\n\n /**\n * Generic request that returns raw Response for streaming\n */\n async requestStream(path: string, options: RequestInit = {}): Promise<Response> {\n const url = this.buildUrl(path)\n const headers = {\n ...this.headers,\n ...(options.headers as Record<string, string>),\n }\n\n return this.makeRawRequest(url, {\n ...options,\n headers,\n })\n }\n\n /**\n * Dispatch flow execution (streaming)\n */\n async dispatch(config: any): Promise<Response> {\n return this.requestStream('/dispatch', {\n method: 'POST',\n body: JSON.stringify(transformRequest(config)),\n })\n }\n\n /**\n * Build full URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, any>): string {\n const base = this.baseUrl.endsWith('/') ? this.baseUrl : `${this.baseUrl}/`\n const relPath = path.startsWith('/') ? path.slice(1) : path\n const url = new URL(relPath, base)\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n })\n }\n\n return url.toString()\n }\n\n /**\n * Make HTTP request with timeout and error handling\n */\n private async makeRequest(url: string, options: RequestInit): Promise<any> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(\n `API request failed: ${response.status} ${response.statusText} - ${errorText}`\n )\n }\n\n if (response.status === 204) {\n return null\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n return response.json()\n }\n\n return response.text()\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`)\n }\n\n throw error\n }\n }\n\n /**\n * Make HTTP request that returns raw Response (for streaming)\n */\n private async makeRawRequest(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(\n `API request failed: ${response.status} ${response.statusText} - ${errorText}`\n )\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`)\n }\n\n throw error\n }\n }\n\n /**\n * Transform response (placeholder for snake_case to camelCase)\n */\n private transformResponse<T>(response: any): T {\n // For now, return as-is. Can add transformation later if needed.\n return response as T\n }\n}\n\n// ============================================================================\n// Runtype Static Class\n// ============================================================================\n\n/**\n * Runtype - Main entry point for the SDK\n *\n * Use static methods and namespaces to interact with the API.\n */\nexport class Runtype {\n // ============================================================================\n // Global Configuration\n // ============================================================================\n\n /**\n * Configure the global Runtype client\n *\n * Call this once at app startup to set the API key and other options.\n * All subsequent calls to Runtype.flows, Runtype.batches, etc. will use this config.\n *\n * @example\n * ```typescript\n * Runtype.configure({ apiKey: process.env.RUNTYPE_API_KEY })\n * ```\n */\n static configure(config: RuntypeConfig): void {\n globalConfig = { ...globalConfig, ...config }\n globalClient = new RuntypeClient(globalConfig)\n }\n\n /**\n * Get the global client instance, creating one if needed\n */\n static getClient(): RuntypeClient {\n if (!globalClient) {\n globalClient = new RuntypeClient(globalConfig)\n }\n return globalClient\n }\n\n /**\n * Create a new client instance with custom configuration\n *\n * Use this when you need a client with different settings than the global one.\n *\n * @example\n * ```typescript\n * const client = Runtype.createClient({ apiKey: 'different_key' })\n * ```\n */\n static createClient(config?: RuntypeConfig): RuntypeClient {\n return new RuntypeClient({ ...globalConfig, ...config })\n }\n\n // ============================================================================\n // Static Namespaces\n // ============================================================================\n\n /**\n * Flows namespace - Build and execute flows\n *\n * @example\n * ```typescript\n * // Upsert a flow (create or update)\n * const result = await Runtype.flows.upsert({ name: 'My Flow' })\n * .prompt({ name: 'Analyze', model: 'gpt-4o', userPrompt: '...' })\n * .stream()\n *\n * // Use an existing flow\n * const result = await Runtype.flows.use('flow_123')\n * .withRecord({ name: 'Test' })\n * .result()\n *\n * // Virtual flow (one-off, not saved)\n * const result = await Runtype.flows.virtual({ name: 'Temp Flow' })\n * .prompt({ ... })\n * .stream()\n * ```\n */\n static get flows(): FlowsNamespace {\n return new FlowsNamespace(() => this.getClient())\n }\n\n /**\n * Batches namespace - Schedule and manage batch operations\n *\n * @example\n * ```typescript\n * // Schedule a batch\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * })\n *\n * // Get batch status\n * const status = await Runtype.batches.get('batch_456')\n *\n * // Cancel a batch\n * await Runtype.batches.cancel('batch_456')\n *\n * // List batches\n * const batches = await Runtype.batches.list({ status: 'running' })\n * ```\n */\n static get batches(): BatchesNamespace {\n return new BatchesNamespace(() => this.getClient())\n }\n\n /**\n * Evals namespace - Run evaluations and compare models\n *\n * @example\n * ```typescript\n * // Run an eval with streaming\n * const stream = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [{ stepName: 'Analyze', model: 'gpt-4o' }]\n * }).stream()\n *\n * // Submit eval as batch job\n * const eval = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [\n * [{ stepName: 'Analyze', model: 'gpt-4o' }],\n * [{ stepName: 'Analyze', model: 'claude-3-opus' }],\n * ]\n * }).submit()\n * ```\n */\n static get evals(): EvalsNamespace {\n return new EvalsNamespace(() => this.getClient())\n }\n\n /**\n * Prompts namespace - Manage and execute prompts\n *\n * @example\n * ```typescript\n * // Execute a prompt with streaming\n * const stream = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).stream()\n *\n * // Get complete result\n * const result = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).result()\n *\n * // CRUD operations\n * const prompts = await Runtype.prompts.list()\n * const prompt = await Runtype.prompts.get('prompt_123')\n * const newPrompt = await Runtype.prompts.create({ ... })\n * await Runtype.prompts.update('prompt_123', { ... })\n * await Runtype.prompts.delete('prompt_123')\n * ```\n */\n static get prompts(): PromptsNamespace {\n return new PromptsNamespace(() => this.getClient())\n }\n}\n\nexport default Runtype\n","import type {\n DispatchRequest,\n JSONSchema,\n RuntimeCustomToolConfig,\n RuntimeTool,\n} from './types'\n\nconst TOOL_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_]{1,63}$/\nconst DEFAULT_MAX_CODE_LENGTH = 12000\nconst DEFAULT_MAX_TIMEOUT_MS = 30000\n\nconst DEFAULT_BLOCKED_CODE_PATTERNS: RegExp[] = [\n /\\b(?:child_process|fs|net|tls|http|https|os)\\b/i,\n /\\b(?:process|Deno|Bun)\\b/i,\n /\\b(?:require|import)\\s*\\(/i,\n /\\beval\\s*\\(/i,\n /\\b__import__\\s*\\(/i,\n /\\bsubprocess\\b/i,\n /\\bos\\.system\\s*\\(/i,\n]\n\nconst DEFAULT_ALLOWED_SANDBOX_PROVIDERS: Array<'quickjs' | 'daytona' | 'cloudflare-worker'> = [\n 'quickjs',\n 'daytona',\n 'cloudflare-worker',\n]\nconst DEFAULT_ALLOWED_LANGUAGES: Array<'javascript' | 'typescript' | 'python'> = [\n 'javascript',\n 'typescript',\n 'python',\n]\n\nexport interface GeneratedRuntimeToolGateOptions {\n /**\n * Allowed runtime tool types.\n * Defaults to ['custom'] because this gate is intended for generated code tools.\n */\n allowedToolTypes?: Array<'custom' | 'external' | 'flow' | 'local'>\n /** Allowed sandbox providers for generated custom tools. Defaults to ['quickjs', 'daytona', 'cloudflare-worker']. */\n allowedSandboxProviders?: Array<'quickjs' | 'daytona' | 'cloudflare-worker'>\n /** Allowed languages for generated custom tools. Defaults to JS/TS/Python. */\n allowedLanguages?: Array<'javascript' | 'typescript' | 'python'>\n /** Maximum allowed code size in characters (default 12000). */\n maxCodeLength?: number\n /** Maximum allowed timeout in ms (default 30000). */\n maxTimeoutMs?: number\n /** Optional tool name allowlist. If provided, generated tool names must match one entry. */\n allowedToolNames?: string[]\n /**\n * Block patterns for generated code.\n * Defaults to a conservative set that rejects obvious process/system access patterns.\n */\n blockedCodePatterns?: RegExp[]\n /** Optional custom validator for additional policy checks. Return a violation message to reject. */\n customValidator?: (tool: RuntimeTool) => string | null\n}\n\nexport interface GeneratedRuntimeToolGateDecision {\n approved: boolean\n reason: string\n violations: string[]\n tool?: RuntimeTool\n}\n\nexport interface AttachRuntimeToolsOptions {\n /**\n * Which prompt step should receive the runtime tools.\n * If omitted, the first prompt step is used.\n */\n stepId?: string\n /** Append to existing runtime tools (default) or replace them entirely. */\n mode?: 'append' | 'replace'\n /** Deduplicate runtime tools by name after merge (default true). */\n dedupeByName?: boolean\n}\n\nexport interface ApplyGeneratedProposalOptions {\n gate?: GeneratedRuntimeToolGateOptions\n attach?: AttachRuntimeToolsOptions\n}\n\nexport interface ApplyGeneratedProposalResult {\n decision: GeneratedRuntimeToolGateDecision\n request: DispatchRequest\n}\n\ninterface NormalizedProposal {\n name: string\n description: string\n toolType: 'custom' | 'external' | 'flow' | 'local'\n parametersSchema: JSONSchema\n config?: RuntimeCustomToolConfig\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value.trim() : undefined\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction isRuntimeToolType(value: unknown): value is 'custom' | 'external' | 'flow' | 'local' {\n return value === 'custom' || value === 'external' || value === 'flow' || value === 'local'\n}\n\nfunction isLanguage(value: unknown): value is 'javascript' | 'typescript' | 'python' {\n return value === 'javascript' || value === 'typescript' || value === 'python'\n}\n\nfunction isSandboxProvider(value: unknown): value is 'quickjs' | 'daytona' | 'cloudflare-worker' {\n return value === 'quickjs' || value === 'daytona' || value === 'cloudflare-worker'\n}\n\nfunction isJSONSchema(value: unknown): value is JSONSchema {\n if (!isObject(value)) return false\n const schemaType = value.type\n return (\n schemaType === 'object' ||\n schemaType === 'string' ||\n schemaType === 'number' ||\n schemaType === 'boolean' ||\n schemaType === 'array' ||\n schemaType === 'null'\n )\n}\n\nfunction extractProposal(proposal: unknown): unknown {\n if (!isObject(proposal)) return proposal\n if (isObject(proposal.tool)) {\n return proposal.tool\n }\n return proposal\n}\n\nfunction normalizeGeneratedProposal(\n proposal: unknown,\n violations: string[]\n): NormalizedProposal | null {\n const candidate = extractProposal(proposal)\n if (!isObject(candidate)) {\n violations.push('Generated tool proposal must be an object')\n return null\n }\n\n const name = asString(candidate.name)\n const description = asString(candidate.description)\n const toolType = candidate.toolType\n const parametersSchema = candidate.parametersSchema\n\n if (!name) {\n violations.push('Tool name is required')\n } else if (!TOOL_NAME_PATTERN.test(name)) {\n violations.push(\n 'Tool name must match /^[A-Za-z][A-Za-z0-9_]{1,63}$/ (letters, numbers, underscore)'\n )\n }\n\n if (!description) {\n violations.push('Tool description is required')\n }\n\n if (!isRuntimeToolType(toolType)) {\n violations.push('toolType must be one of: custom, external, flow, local')\n }\n\n if (!isJSONSchema(parametersSchema)) {\n violations.push('parametersSchema must be a valid JSON Schema object')\n }\n\n if (violations.length > 0 || !name || !description || !isRuntimeToolType(toolType)) {\n return null\n }\n\n if (toolType !== 'custom') {\n return {\n name,\n description,\n toolType,\n parametersSchema: parametersSchema as JSONSchema,\n }\n }\n\n const config = candidate.config\n if (!isObject(config)) {\n violations.push('Custom tool config is required')\n return null\n }\n\n const code = asString(config.code)\n if (!code) {\n violations.push('Custom tool config.code is required')\n return null\n }\n\n const sandboxProviderRaw = config.sandboxProvider\n const languageRaw = config.language\n const timeoutRaw = config.timeout\n\n const sandboxProvider = isSandboxProvider(sandboxProviderRaw) ? sandboxProviderRaw : 'cloudflare-worker'\n const language = isLanguage(languageRaw) ? languageRaw : 'javascript'\n const timeout = asNumber(timeoutRaw)\n\n return {\n name,\n description,\n toolType: 'custom',\n parametersSchema: parametersSchema as JSONSchema,\n config: {\n code,\n sandboxProvider,\n language,\n timeout,\n },\n }\n}\n\nfunction dedupeToolsByName(tools: RuntimeTool[]): RuntimeTool[] {\n const seen = new Set<string>()\n const deduped: RuntimeTool[] = []\n for (const tool of tools) {\n if (seen.has(tool.name)) continue\n seen.add(tool.name)\n deduped.push(tool)\n }\n return deduped\n}\n\nfunction cloneRuntimeTool(tool: RuntimeTool): RuntimeTool {\n return {\n name: tool.name,\n description: tool.description,\n toolType: tool.toolType,\n parametersSchema: {\n ...tool.parametersSchema,\n },\n ...(tool.config ? { config: { ...tool.config } } : {}),\n }\n}\n\n/**\n * Validate and normalize a generated runtime tool proposal against a configurable policy.\n */\nexport function evaluateGeneratedRuntimeToolProposal(\n proposal: unknown,\n options: GeneratedRuntimeToolGateOptions = {}\n): GeneratedRuntimeToolGateDecision {\n const violations: string[] = []\n const normalized = normalizeGeneratedProposal(proposal, violations)\n\n if (!normalized) {\n return {\n approved: false,\n reason: violations[0] || 'Invalid generated tool proposal',\n violations,\n }\n }\n\n const allowedToolTypes = options.allowedToolTypes ?? ['custom']\n if (!allowedToolTypes.includes(normalized.toolType)) {\n violations.push(`Tool type \"${normalized.toolType}\" is not allowed`)\n }\n\n if (options.allowedToolNames && options.allowedToolNames.length > 0) {\n if (!options.allowedToolNames.includes(normalized.name)) {\n violations.push(`Tool name \"${normalized.name}\" is not in allowedToolNames`)\n }\n }\n\n if (normalized.toolType === 'custom' && normalized.config) {\n const allowedSandboxProviders =\n options.allowedSandboxProviders ?? DEFAULT_ALLOWED_SANDBOX_PROVIDERS\n const allowedLanguages = options.allowedLanguages ?? DEFAULT_ALLOWED_LANGUAGES\n const maxCodeLength = options.maxCodeLength ?? DEFAULT_MAX_CODE_LENGTH\n const maxTimeoutMs = options.maxTimeoutMs ?? DEFAULT_MAX_TIMEOUT_MS\n const blockedCodePatterns = options.blockedCodePatterns ?? DEFAULT_BLOCKED_CODE_PATTERNS\n\n if (!allowedSandboxProviders.includes(normalized.config.sandboxProvider || 'cloudflare-worker')) {\n violations.push(\n `Sandbox provider \"${normalized.config.sandboxProvider}\" is not allowed`\n )\n }\n\n if (!allowedLanguages.includes(normalized.config.language || 'javascript')) {\n violations.push(`Language \"${normalized.config.language}\" is not allowed`)\n }\n\n if (normalized.config.code.length > maxCodeLength) {\n violations.push(\n `Generated code exceeds maxCodeLength (${normalized.config.code.length} > ${maxCodeLength})`\n )\n }\n\n if (normalized.config.timeout !== undefined && normalized.config.timeout > maxTimeoutMs) {\n violations.push(\n `Generated timeout exceeds maxTimeoutMs (${normalized.config.timeout} > ${maxTimeoutMs})`\n )\n }\n\n for (const pattern of blockedCodePatterns) {\n if (pattern.test(normalized.config.code)) {\n violations.push(`Generated code matched blocked pattern: ${pattern}`)\n break\n }\n }\n }\n\n const tool: RuntimeTool = {\n name: normalized.name,\n description: normalized.description,\n toolType: normalized.toolType,\n parametersSchema: normalized.parametersSchema,\n ...(normalized.config ? { config: normalized.config } : {}),\n }\n\n const customViolation = options.customValidator?.(tool)\n if (customViolation) {\n violations.push(customViolation)\n }\n\n if (violations.length > 0) {\n return {\n approved: false,\n reason: violations[0],\n violations,\n }\n }\n\n return {\n approved: true,\n reason: 'approved',\n violations: [],\n tool,\n }\n}\n\n/**\n * Build a standardized local-tool output object from a generated runtime tool proposal.\n * This shape can be returned from a `propose_runtime_tool` local tool handler.\n */\nexport function buildGeneratedRuntimeToolGateOutput(\n proposal: unknown,\n options: GeneratedRuntimeToolGateOptions = {}\n): {\n approved: boolean\n reason: string\n violations: string[]\n tool?: RuntimeTool\n} {\n const decision = evaluateGeneratedRuntimeToolProposal(proposal, options)\n return {\n approved: decision.approved,\n reason: decision.reason,\n violations: decision.violations,\n ...(decision.tool ? { tool: decision.tool } : {}),\n }\n}\n\n/**\n * Attach approved runtime tools to a prompt step in a dispatch request.\n * This returns a new request object and never mutates the input.\n */\nexport function attachRuntimeToolsToDispatchRequest(\n request: DispatchRequest,\n runtimeTools: RuntimeTool[],\n options: AttachRuntimeToolsOptions = {}\n): DispatchRequest {\n const stepList = request.flow.steps\n if (!stepList || !Array.isArray(stepList) || stepList.length === 0) {\n throw new Error('Cannot attach runtime tools: dispatch request must include flow.steps')\n }\n\n const clonedSteps: Array<Record<string, unknown> & { config: Record<string, unknown> }> =\n stepList.map((step) => {\n const stepObj = isObject(step) ? step : {}\n const config = isObject(stepObj.config) ? { ...stepObj.config } : {}\n return {\n ...stepObj,\n config,\n }\n })\n\n const stepIndex = options.stepId\n ? clonedSteps.findIndex((step) => {\n const stepId = typeof step.id === 'string' ? step.id : ''\n const stepType = typeof step.type === 'string' ? step.type : ''\n return stepId === options.stepId && stepType === 'prompt'\n })\n : clonedSteps.findIndex((step) => {\n const stepType = typeof step.type === 'string' ? step.type : ''\n return stepType === 'prompt'\n })\n\n if (stepIndex === -1) {\n throw new Error(\n options.stepId\n ? `Cannot attach runtime tools: prompt step \"${options.stepId}\" not found`\n : 'Cannot attach runtime tools: no prompt step found in flow.steps'\n )\n }\n\n const targetStep = clonedSteps[stepIndex]\n const rawToolsConfig = isObject(targetStep.config.tools) ? targetStep.config.tools : {}\n const existingRuntimeTools = Array.isArray(rawToolsConfig.runtimeTools)\n ? (rawToolsConfig.runtimeTools as RuntimeTool[]).map(cloneRuntimeTool)\n : []\n const incomingRuntimeTools = runtimeTools.map(cloneRuntimeTool)\n\n const mode = options.mode ?? 'append'\n let mergedRuntimeTools =\n mode === 'replace'\n ? incomingRuntimeTools\n : [...existingRuntimeTools, ...incomingRuntimeTools]\n\n const shouldDedupe = options.dedupeByName ?? true\n if (shouldDedupe) {\n mergedRuntimeTools = dedupeToolsByName(mergedRuntimeTools)\n }\n\n targetStep.config = {\n ...targetStep.config,\n tools: {\n ...rawToolsConfig,\n runtimeTools: mergedRuntimeTools,\n },\n }\n\n return {\n ...request,\n flow: {\n ...request.flow,\n steps: clonedSteps,\n },\n }\n}\n\n/**\n * Validate a generated runtime tool proposal and, if approved, attach it to\n * a redispatch request in one call.\n */\nexport function applyGeneratedRuntimeToolProposalToDispatchRequest(\n request: DispatchRequest,\n proposal: unknown,\n options: ApplyGeneratedProposalOptions = {}\n): ApplyGeneratedProposalResult {\n const decision = evaluateGeneratedRuntimeToolProposal(proposal, options.gate)\n if (!decision.approved || !decision.tool) {\n return { decision, request }\n }\n\n const nextRequest = attachRuntimeToolsToDispatchRequest(request, [decision.tool], options.attach)\n return {\n decision,\n request: nextRequest,\n }\n}\n","/**\n * Utility functions shared between workflow phase handlers and AgentsEndpoint.\n *\n * Extracted from AgentsEndpoint private methods to make them accessible\n * to standalone workflow definitions without deep context threading.\n */\n\nexport function normalizeCandidatePath(candidatePath: string): string {\n return candidatePath.trim().replace(/\\\\/g, '/').replace(/^\\.?\\//, '').replace(/\\/+/g, '/')\n}\n\nexport function isMarathonArtifactPath(candidatePath: string): boolean {\n const normalized = normalizeCandidatePath(candidatePath).toLowerCase()\n return normalized === '.runtype' || normalized.startsWith('.runtype/')\n}\n\nexport function isDiscoveryToolName(toolName: string): boolean {\n return (\n toolName === 'search_repo' ||\n toolName === 'glob_files' ||\n toolName === 'tree_directory' ||\n toolName === 'list_directory'\n )\n}\n\nexport function isPreservationSensitiveTask(\n state: Pick<{ originalMessage?: string; bestCandidatePath?: string }, 'originalMessage' | 'bestCandidatePath'>\n): boolean {\n const bestCandidatePath = state.bestCandidatePath || ''\n if (/\\.(html|tsx|jsx|css|scss|sass)$/i.test(bestCandidatePath)) {\n return true\n }\n\n const prompt = (state.originalMessage || '').toLowerCase()\n return [\n 'ux', 'ui', 'design', 'frontend', 'front-end',\n 'theme', 'editor', 'layout', 'style', 'accessibility', 'visual',\n ].some((keyword) => prompt.includes(keyword))\n}\n\nexport function getLikelySupportingCandidatePaths(\n bestCandidatePath: string | undefined,\n candidatePaths: string[] | undefined\n): string[] {\n if (!bestCandidatePath || !candidatePaths || candidatePaths.length === 0) return []\n\n const normalizedBestCandidatePath = normalizeCandidatePath(bestCandidatePath)\n const bestCandidateSegments = normalizedBestCandidatePath.split('/').filter(Boolean)\n const relatedRoot =\n bestCandidateSegments.length >= 2\n ? `${bestCandidateSegments[0]}/${bestCandidateSegments[1]}/`\n : bestCandidateSegments.length === 1\n ? `${bestCandidateSegments[0]}/`\n : ''\n const bestCandidateDir = normalizedBestCandidatePath.includes('/')\n ? `${normalizedBestCandidatePath.slice(0, normalizedBestCandidatePath.lastIndexOf('/'))}/`\n : ''\n\n return candidatePaths\n .map((candidatePath) => normalizeCandidatePath(candidatePath))\n .filter(\n (candidatePath) =>\n candidatePath &&\n candidatePath !== normalizedBestCandidatePath &&\n !isMarathonArtifactPath(candidatePath) &&\n ((bestCandidateDir && candidatePath.startsWith(bestCandidateDir)) ||\n (relatedRoot && candidatePath.startsWith(relatedRoot)))\n )\n}\n\nexport function getDefaultPlanPath(taskName: string): string {\n const slug = sanitizeTaskSlug(taskName || 'task')\n return `.runtype/marathons/${slug}/plan.md`\n}\n\nexport function sanitizeTaskSlug(taskName: string): string {\n return taskName\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80)\n}\n","/**\n * Default marathon workflow: research → planning → execution.\n *\n * This is a data-driven extraction of the previously hardcoded logic\n * in AgentsEndpoint. It handles both \"modify\" and \"create\" task variants\n * via the `workflowVariant` / `isCreationTask` flags on state.\n */\n\nimport type {\n WorkflowDefinition,\n WorkflowPhase,\n RunTaskStateSlice,\n} from '../workflow-types'\n\nimport {\n normalizeCandidatePath,\n isPreservationSensitiveTask,\n getLikelySupportingCandidatePaths,\n getDefaultPlanPath,\n} from '../workflow-utils'\n\n// ─── Helper: check sufficient research evidence ─────────────────────\n\nfunction hasSufficientResearchEvidence(state: RunTaskStateSlice): boolean {\n if (state.isCreationTask) {\n return (state.recentReadPaths?.length || 0) >= 1\n }\n\n if (!state.bestCandidatePath) return false\n\n const normalizedBestCandidatePath = normalizeCandidatePath(state.bestCandidatePath)\n const normalizedRecentReadPaths = (state.recentReadPaths || []).map((readPath) =>\n normalizeCandidatePath(readPath)\n )\n const readBestCandidate = normalizedRecentReadPaths.includes(normalizedBestCandidatePath)\n\n if (!readBestCandidate) {\n return false\n }\n\n if (!isPreservationSensitiveTask(state)) {\n return true\n }\n\n const supportingCandidatePaths = getLikelySupportingCandidatePaths(\n state.bestCandidatePath,\n state.candidatePaths\n )\n if (supportingCandidatePaths.length === 0) {\n return true\n }\n\n return normalizedRecentReadPaths.some(\n (readPath) =>\n readPath !== normalizedBestCandidatePath && supportingCandidatePaths.includes(readPath)\n )\n}\n\n// ─── Helper: detect repeated actions in recovery ─────────────────────\n\nfunction hasRepeatedSameActions(\n sessions: RunTaskStateSlice['sessions']\n): boolean {\n const recent = sessions.slice(-2)\n return (\n recent.length === 2 &&\n recent.every((session) => (session.actionKeys?.length || 0) > 0) &&\n JSON.stringify(recent[0]?.actionKeys || []) === JSON.stringify(recent[1]?.actionKeys || [])\n )\n}\n\n// ─── Helper: extract bootstrap queries ──────────────────────────────\n\nfunction extractBootstrapQueries(message: string): string[] {\n const queries: string[] = []\n const noisyTerms = new Set([\n 'a', 'against', 'all', 'analyze', 'and', 'as', 'at', 'based', 'before', 'best',\n 'by', 'codebase', 'do', 'exactly', 'files', 'first', 'following', 'goal', 'go',\n 'how', 'in', 'is', 'it', 'its', 'make', 'markdown', 'most', 'no', 'of', 'on',\n 'order', 'plan', 'progress', 'repo', 'research', 'right', 'save', 'session',\n 'solve', 'task', 'that', 'the', 'then', 'through', 'to', 'turn', 'update',\n 'user', 'ux', 'web', 'when', 'with', 'work', 'your',\n ])\n const push = (candidate: string) => {\n const normalized = candidate\n .replace(/^[^a-z0-9/._-]+|[^a-z0-9/._ -]+$/gi, '')\n .replace(/\\s+/g, ' ')\n .trim()\n if (!normalized || normalized.length < 3 || normalized.length > 60) return\n const words = normalized.toLowerCase().split(' ').filter(Boolean)\n if (words.length > 4) return\n if (words.every((word) => noisyTerms.has(word))) return\n if (words.length > 1 && noisyTerms.has(words[words.length - 1] || '')) return\n if (!queries.some((existing) => existing.toLowerCase() === normalized.toLowerCase())) {\n queries.push(normalized)\n }\n }\n\n const lowerMessage = message.toLowerCase()\n const phraseHints = ['agent editor', 'theme.html', '/theme.html', 'style it visually']\n for (const hint of phraseHints) {\n if (lowerMessage.includes(hint.toLowerCase())) push(hint)\n }\n for (const match of message.matchAll(/\"([^\"]{3,60})\"/g)) {\n push(match[1] || '')\n }\n for (const match of message.matchAll(\n /(?:go through|review|inspect|edit|improve|update|fix|modify)\\s+(?:the\\s+)?([a-z0-9][a-z0-9/_-]*(?:\\s+[a-z0-9][a-z0-9/_-]*){0,2})/gi\n )) {\n push(match[1] || '')\n }\n for (const match of message.matchAll(\n /([a-z0-9][a-z0-9/_-]*(?:\\s+[a-z0-9][a-z0-9/_-]*){0,2})\\s+(?:page|editor|screen|view|route|component)\\b/gi\n )) {\n push(match[0] || '')\n push(match[1] || '')\n }\n for (const match of message.matchAll(/\\b[\\w./-]+\\.(?:html|tsx|ts|jsx|js|md|json)\\b/g)) {\n push(match[0] || '')\n }\n for (const match of message.matchAll(/\\/[A-Za-z0-9._/-]+/g)) {\n push(match[0] || '')\n }\n for (const match of message.matchAll(/\\b([a-z0-9]+(?:\\s+[a-z0-9]+){1,2})\\b/gi)) {\n const phrase = (match[1] || '').toLowerCase()\n const words = phrase.split(' ')\n if (words.some((word) => ['editor', 'page', 'screen', 'view', 'route', 'component'].includes(word))) {\n push(match[1] || '')\n }\n }\n\n return queries.slice(0, 4)\n}\n\n// ─── Helper: summarize text for bootstrap ────────────────────────────\n\nfunction summarizeTextBlock(value: unknown, maxLines: number = 4): string {\n const text = typeof value === 'string' ? value : value === undefined ? '' : JSON.stringify(value)\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .slice(0, maxLines)\n .join(' | ')\n .slice(0, 240)\n}\n\n// ─── Research Phase ──────────────────────────────────────────────────\n\nconst researchPhase: WorkflowPhase = {\n name: 'research',\n description: 'Inspect the repo and identify the correct target file',\n\n buildInstructions(state) {\n const planPath = state.planPath || getDefaultPlanPath(state.taskName)\n\n if (state.isCreationTask) {\n return [\n '--- Workflow Phase: Research ---',\n 'This is a creation task — you are building something new, not modifying existing code.',\n 'Briefly inspect the repo structure to understand the project setup (package manager, build tools, directory layout).',\n 'Identify where new files should be placed based on existing conventions.',\n 'Do NOT search for an existing file to edit — there is not one for this task.',\n `When research is complete, the system will advance you to planning and require a plan at: ${planPath}`,\n ].join('\\n')\n }\n\n return [\n '--- Workflow Phase: Research ---',\n 'Your current job is to inspect the repo, identify the correct existing target file, and gather enough evidence for a plan.',\n 'Identify related supporting files and current behaviors that must be preserved before planning.',\n 'Do NOT edit the target product file yet.',\n `When research is complete, the system will advance you to planning and require a plan at: ${planPath}`,\n ].join('\\n')\n },\n\n buildToolGuidance(state) {\n if (state.isCreationTask) {\n return [\n 'This is a creation task — you are building new files, not editing existing ones.',\n 'Read package.json and/or run tree_directory to understand the repo structure and conventions.',\n 'Then end the turn so the system can advance you to planning.',\n ]\n }\n return [\n 'For repository modification tasks, before any write_file call you must perform at least one discovery action (search_repo, glob_files, or tree_directory).',\n 'If discovery finds a plausible existing file, you must read at least one candidate file before writing.',\n 'Before creating a new file, search the repo for existing relevant files, routes, links, components, or pages.',\n 'Prefer editing an existing file when one already implements or links to the feature you were asked to change.',\n 'Use search_repo, glob_files, and tree_directory to discover the right files before you call write_file.',\n 'Only create a new file when no suitable existing file exists, and make that decision intentionally.',\n ]\n },\n\n isComplete(ctx) {\n return hasSufficientResearchEvidence(ctx.state)\n },\n\n buildTransitionSummary(state, _nextPhaseName) {\n if (state.isCreationTask) {\n return [\n 'Automatic phase transition: research -> planning.',\n 'Repo structure reviewed. Ready to plan the creation.',\n `Next step: write the plan markdown to ${state.planPath}.`,\n ].join('\\n')\n }\n return [\n 'Automatic phase transition: research -> planning.',\n `Best candidate confirmed: ${state.bestCandidatePath}`,\n `Next step: write the plan markdown to ${state.planPath} before editing the product file.`,\n ].join('\\n')\n },\n\n interceptToolCall() {\n // No blocking in research phase\n return undefined\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n const normalizedPlanPath =\n typeof state.planPath === 'string' && state.planPath.trim()\n ? normalizeCandidatePath(state.planPath)\n : undefined\n const recentPlanOnlyLoop =\n Boolean(normalizedPlanPath) &&\n recent.length === 2 &&\n recent.every((session) => {\n const specificActionKeys = (session.actionKeys || [])\n .map((actionKey) => actionKey.replace(/\\\\/g, '/'))\n .filter((actionKey) => !actionKey.startsWith('server:'))\n return (\n specificActionKeys.length > 0 &&\n specificActionKeys.every((actionKey) => actionKey.includes(normalizedPlanPath!))\n )\n })\n\n if (\n recent.length < 2 ||\n !(\n recent.every((session) => session.hadTextOutput === false && session.wroteFiles === false) ||\n recentPlanOnlyLoop\n )\n ) {\n return undefined\n }\n\n const repeatedSameActions = hasRepeatedSameActions(state.sessions)\n\n if (state.isCreationTask) {\n return [\n 'Recovery instruction:',\n 'Your previous sessions produced no output. This is a creation task — you are building something new.',\n 'Read package.json or run tree_directory to understand the repo, then end the turn so the system advances you to planning.',\n 'Do NOT search for an existing file to edit.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; break the loop by reading one repo file and ending the turn.']\n : []),\n ].join('\\n')\n }\n\n if (state.bestCandidatePath) {\n const recentlyReadBestCandidate = (state.recentReadPaths || []).includes(state.bestCandidatePath)\n return [\n 'Recovery instruction:',\n 'Your previous sessions produced no final text and did not complete a useful edit.',\n `You already have a best candidate file: \"${state.bestCandidatePath}\".`,\n ...(state.bestCandidateReason ? [`Reason: ${state.bestCandidateReason}`] : []),\n recentlyReadBestCandidate\n ? `Do not keep searching. Your next action must be to edit \"${state.bestCandidatePath}\" with write_file, or explain why that file is not the correct target.`\n : `Do not keep searching. Your next action must be read_file on \"${state.bestCandidatePath}\".`,\n 'Do not call list_directory, tree_directory, glob_files, or search_repo again unless that candidate path is missing or clearly wrong.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; break the loop by acting on the best candidate now.']\n : []),\n ].join('\\n')\n }\n\n const queries = extractBootstrapQueries(state.originalMessage || '')\n const queryHint =\n queries.length > 0\n ? `Start with these exact repo searches: ${queries.map((query) => `\"${query}\"`).join(', ')}.`\n : 'Start with a concrete repo search using the key nouns from the original task.'\n\n return [\n 'Recovery instruction:',\n 'Your previous sessions produced no final text and did not edit files.',\n queryHint,\n 'Then read the most relevant existing file you find before any write_file call.',\n 'If a route, link, or page already exists, edit that existing file instead of creating a new one.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; pick one candidate and act on it.']\n : []),\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, ctx) {\n const state = ctx.state\n const sufficientResearch = hasSufficientResearchEvidence(state)\n\n if (sufficientResearch && snapshot.discoveryPauseCount >= 12) {\n return 'research evidence is already sufficient, but this execution kept issuing discovery tools instead of ending the turn'\n }\n if (snapshot.actionKeyCount >= 4) {\n return `the same discovery action repeated ${snapshot.actionKeyCount} times in one session`\n }\n if (snapshot.consecutiveDiscoveryPauseCount >= 18 || snapshot.discoveryPauseCount >= 24) {\n return 'this session exceeded the discovery-tool budget without ending the turn'\n }\n return undefined\n },\n}\n\n// ─── Planning Phase ──────────────────────────────────────────────────\n\nconst planningPhase: WorkflowPhase = {\n name: 'planning',\n description: 'Write the implementation plan before editing product files',\n\n buildInstructions(state) {\n const planPath = state.planPath || getDefaultPlanPath(state.taskName)\n\n if (state.isCreationTask) {\n return [\n '--- Workflow Phase: Planning ---',\n 'Research is complete. Write the implementation plan for building this from scratch.',\n `Write the plan markdown to exactly: ${planPath}`,\n 'List the files you will create, their locations, purpose, and any dependencies to install.',\n 'Include a \"Verification steps\" section listing the concrete checks you will run before TASK_COMPLETE.',\n 'If the plan already exists, update that same plan file instead of creating a different one.',\n ].join('\\n')\n }\n return [\n '--- Workflow Phase: Planning ---',\n 'Research is complete. Your current job is to write the implementation plan before any product-file edits.',\n `Write the plan markdown to exactly: ${planPath}`,\n 'Do NOT edit the target product file yet.',\n 'The plan should summarize UX findings, explain why the current best candidate is the right file, and list concrete execution steps.',\n 'The plan must include a \"Preserve existing functionality\" section that lists current behaviors, linked files, integrations, and constraints that must keep working.',\n 'The plan must include a \"Verification steps\" section listing the concrete checks you will run before TASK_COMPLETE.',\n 'If the plan already exists, update that same plan file instead of creating a different one.',\n ].join('\\n')\n },\n\n buildToolGuidance(state) {\n return [\n `Research is already complete. Focus on writing or updating the plan at: ${state.planPath || getDefaultPlanPath(state.taskName)}.`,\n 'Do not restart broad repo discovery unless the saved best candidate is clearly invalid.',\n 'You may read the current target file or supporting source files if you need evidence for the plan.',\n 'Ground the plan in the existing implementation. Identify which current behaviors and linked files must be preserved.',\n 'List the exact verification commands you expect to run after editing, such as lint, typecheck, tests, or build.',\n ]\n },\n\n isComplete(ctx) {\n return ctx.trace.planWritten || Boolean(ctx.state.planWritten)\n },\n\n buildTransitionSummary(state, _nextPhaseName) {\n return [\n 'Automatic phase transition: planning -> execution.',\n `Plan path: ${state.planPath}`,\n ...(state.bestCandidatePath ? [`Execute against: ${state.bestCandidatePath}`] : []),\n 'Next step: edit the target file(s) and update the plan with progress each turn.',\n ].join('\\n')\n },\n\n interceptToolCall(toolName, args, ctx) {\n const normalizedPathArg =\n typeof args.path === 'string' && args.path.trim()\n ? ctx.normalizePath(String(args.path))\n : undefined\n const normalizedPlanPath = ctx.state.planPath\n ? ctx.normalizePath(ctx.state.planPath)\n : undefined\n const isWriteLikeTool = toolName === 'write_file' || toolName === 'restore_file_checkpoint'\n\n if (\n isWriteLikeTool &&\n normalizedPathArg &&\n normalizedPlanPath &&\n normalizedPathArg !== normalizedPlanPath\n ) {\n return [\n `Blocked by marathon planning guard: ${toolName} must target the exact plan path during planning.`,\n `Write the plan to \"${normalizedPlanPath}\" before editing any product files.`,\n ].join(' ')\n }\n\n return undefined\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n const normalizedPlanPath =\n typeof state.planPath === 'string' && state.planPath.trim()\n ? normalizeCandidatePath(state.planPath)\n : undefined\n const recentPlanOnlyLoop =\n Boolean(normalizedPlanPath) &&\n recent.length === 2 &&\n recent.every((session) => {\n const specificActionKeys = (session.actionKeys || [])\n .map((actionKey) => actionKey.replace(/\\\\/g, '/'))\n .filter((actionKey) => !actionKey.startsWith('server:'))\n return (\n specificActionKeys.length > 0 &&\n specificActionKeys.every((actionKey) => actionKey.includes(normalizedPlanPath!))\n )\n })\n\n if (\n recent.length < 2 ||\n !(\n recent.every((session) => session.hadTextOutput === false && session.wroteFiles === false) ||\n recentPlanOnlyLoop\n )\n ) {\n return undefined\n }\n\n const repeatedSameActions = hasRepeatedSameActions(state.sessions)\n\n return [\n 'Recovery instruction:',\n 'Research is already complete. Stop rediscovering and write the plan now.',\n `Your next action must be write_file to \"${state.planPath}\".`,\n 'The plan must summarize UX findings, include a \"Preserve existing functionality\" section, name the best candidate file, and list execution steps.',\n 'Do not edit the product file until the plan exists.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; break the loop by writing the plan file now.']\n : []),\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, ctx) {\n if (!ctx.trace.planWritten && snapshot.consecutiveDiscoveryPauseCount >= 18) {\n return 'planning is looping on discovery instead of writing the plan and ending the turn'\n }\n return undefined\n },\n}\n\n// ─── Execution Phase ─────────────────────────────────────────────────\n\nconst executionPhase: WorkflowPhase = {\n name: 'execution',\n description: 'Execute the plan by editing target files',\n\n buildInstructions(state) {\n const planPath = state.planPath || getDefaultPlanPath(state.taskName)\n\n if (state.isCreationTask) {\n return [\n '--- Workflow Phase: Execution ---',\n `The plan should already exist at: ${planPath}`,\n 'Create the new files according to your plan using write_file.',\n 'Install any necessary dependencies.',\n 'Before ending each turn, update the markdown plan with progress against the steps you completed.',\n 'Before TASK_COMPLETE, run verification to confirm the creation works.',\n ].join('\\n')\n }\n return [\n '--- Workflow Phase: Execution ---',\n `The plan should already exist at: ${planPath}`,\n ...(state.bestCandidatePath ? [`Primary target file: ${state.bestCandidatePath}`] : []),\n 'Execute the plan by editing the target files.',\n 'Before ending each turn, update the markdown plan with progress against the steps you completed.',\n 'Modify the existing implementation incrementally. Do not replace the whole file unless the user explicitly asked for a rewrite.',\n 'Preserve existing functionality, handlers, imports, routes, configuration, and data flow unless the plan explicitly calls for changing them.',\n 'Before TASK_COMPLETE, run a verification command that matches the repo, such as lint, tests, build, or typecheck.',\n 'Avoid broad repo discovery unless the current candidate is clearly wrong.',\n ].join('\\n')\n },\n\n buildToolGuidance(state) {\n return [\n ...(state.bestCandidatePath\n ? [\n `Execution-phase guard: broad discovery tools (search_repo, glob_files, tree_directory, list_directory) are locked while executing against \"${state.bestCandidatePath}\".`,\n ]\n : [\n 'Execution-phase guard: broad discovery tools are locked unless a read of the current target fails.',\n ]),\n 'Reading the markdown plan for status does not change the product target. Do not treat the plan file as the file to implement.',\n 'Do not write the plan file first in execution. Make a real repo-file edit before you update the plan with progress.',\n 'Do not create scratch or test files to probe the repo or tool behavior.',\n 'write_file automatically checkpoints original repo files before overwriting them. If an edit regresses behavior, use restore_file_checkpoint on that file.',\n 'Read the target file and edit it with write_file. Update the plan file with progress after completing real edits.',\n 'Before large edits, read any already discovered supporting source/style files that power the target so you preserve existing behavior.',\n 'Prefer minimal diffs over rewrites. If you cannot verify related behavior, stop and record what is still unverified instead of rewriting blindly.',\n 'Use run_check for real verification before TASK_COMPLETE. Good examples: \"pnpm lint\", \"pnpm exec tsc --noEmit\", \"pnpm test\", or a focused vitest/pytest command.',\n 'Broad discovery is only allowed if a read of the current target file fails.',\n ]\n },\n\n isComplete() {\n // Execution never auto-advances; completion is agent-driven via TASK_COMPLETE\n return false\n },\n\n interceptToolCall(toolName, args, ctx) {\n const normalizedPathArg =\n typeof args.path === 'string' && args.path.trim()\n ? ctx.normalizePath(String(args.path))\n : undefined\n const normalizedPlanPath = ctx.state.planPath\n ? ctx.normalizePath(ctx.state.planPath)\n : undefined\n const normalizedBestCandidatePath = ctx.state.bestCandidatePath\n ? ctx.normalizePath(ctx.state.bestCandidatePath)\n : undefined\n\n const isWriteLikeTool = toolName === 'write_file' || toolName === 'restore_file_checkpoint'\n\n // Block discovery tools during execution (unless read failed)\n if (\n normalizedBestCandidatePath &&\n ctx.isDiscoveryTool(toolName) &&\n !ctx.trace.bestCandidateReadFailed\n ) {\n return [\n `Blocked by marathon execution guard: ${toolName} is disabled during execution.`,\n `Read or edit \"${normalizedBestCandidatePath}\" instead.`,\n 'Broad discovery is only re-enabled if a read of the current target file fails.',\n ].join(' ')\n }\n\n if (isWriteLikeTool) {\n // Block writing plan file before any real repo-file edit\n if (\n normalizedPathArg &&\n normalizedPlanPath &&\n normalizedBestCandidatePath &&\n normalizedPathArg === normalizedPlanPath &&\n !ctx.trace.executionFileWritten\n ) {\n return [\n `Blocked by marathon execution guard: ${toolName} cannot update the plan file before any real repo-file edit in this execution turn.`,\n `Edit \"${normalizedBestCandidatePath}\" or another previously discovered repo file first.`,\n `After that, you may update \"${normalizedPlanPath}\" with progress.`,\n ].join(' ')\n }\n\n // Block writes to undiscovered files\n if (normalizedPathArg && normalizedPathArg !== normalizedPlanPath) {\n const allowedWriteTargets = new Set(\n [\n normalizedPlanPath,\n normalizedBestCandidatePath,\n ...(ctx.state.recentReadPaths || []).map((readPath) => ctx.normalizePath(readPath)),\n ...ctx.trace.readPaths.map((readPath) => ctx.normalizePath(readPath)),\n ].filter((value): value is string => Boolean(value))\n )\n if (!allowedWriteTargets.has(normalizedPathArg)) {\n return [\n `Blocked by marathon execution guard: ${toolName} is limited to the confirmed target, the plan file, or files already discovered/read for this task.`,\n `Do not create scratch files like \"${normalizedPathArg}\".`,\n normalizedBestCandidatePath\n ? `Edit \"${normalizedBestCandidatePath}\" or another previously discovered repo file instead.`\n : 'Read the current target file before writing.',\n ].join(' ')\n }\n }\n }\n\n return undefined\n },\n\n canAcceptCompletion(state, trace) {\n if (!state.bestCandidatePath) {\n return true\n }\n\n const verificationSatisfied =\n !state.verificationRequired ||\n Boolean(state.lastVerificationPassed || trace.verificationPassed)\n\n return (\n Boolean(state.planWritten) &&\n Boolean(state.bestCandidateVerified || trace.bestCandidateVerified) &&\n verificationSatisfied\n )\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n const normalizedPlanPath =\n typeof state.planPath === 'string' && state.planPath.trim()\n ? normalizeCandidatePath(state.planPath)\n : undefined\n const recentPlanOnlyLoop =\n Boolean(normalizedPlanPath) &&\n recent.length === 2 &&\n recent.every((session) => {\n const specificActionKeys = (session.actionKeys || [])\n .map((actionKey) => actionKey.replace(/\\\\/g, '/'))\n .filter((actionKey) => !actionKey.startsWith('server:'))\n return (\n specificActionKeys.length > 0 &&\n specificActionKeys.every((actionKey) => actionKey.includes(normalizedPlanPath!))\n )\n })\n\n if (\n recent.length < 2 ||\n !(\n recent.every((session) => session.hadTextOutput === false && session.wroteFiles === false) ||\n recentPlanOnlyLoop\n )\n ) {\n return undefined\n }\n\n const repeatedSameActions = hasRepeatedSameActions(state.sessions)\n\n if (state.isCreationTask) {\n return [\n 'Recovery instruction:',\n 'Planning should already be complete. Stop researching and create the new files now.',\n 'Your next action must be write_file to create the files described in your plan.',\n 'After creating files, run a verification command with run_check before TASK_COMPLETE.',\n ...(repeatedSameActions\n ? ['You are repeating the same actions; break the loop by creating new files now.']\n : []),\n ].join('\\n')\n }\n\n if (state.bestCandidatePath) {\n const normalizedBestCandidatePath = normalizeCandidatePath(state.bestCandidatePath)\n const recentlyReadBestCandidate = (state.recentReadPaths || [])\n .map((readPath) => normalizeCandidatePath(readPath))\n .includes(normalizedBestCandidatePath)\n return [\n 'Recovery instruction:',\n 'Planning should already be complete. Stop rediscovering and execute the plan.',\n recentlyReadBestCandidate\n ? `Your next action must be write_file on \"${state.bestCandidatePath}\".`\n : `Your next action must be read_file on \"${state.bestCandidatePath}\" so you can edit it next.`,\n ...(state.planPath\n ? [`Do not write \"${state.planPath}\" again until after you complete a real repo-file edit in this session.`]\n : []),\n 'After editing, run a verification command with run_check before TASK_COMPLETE.',\n 'Do not call broad discovery tools again unless the target file is missing or invalid.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; break the loop by editing the target file now.']\n : []),\n ].join('\\n')\n }\n\n return undefined\n },\n\n shouldForceEndTurn(snapshot, ctx) {\n if (!ctx.trace.executionFileWritten && snapshot.consecutiveDiscoveryPauseCount >= 18) {\n return 'execution is looping on discovery instead of editing repo files and ending the turn'\n }\n return undefined\n },\n}\n\n// ─── Variant classification ──────────────────────────────────────────\n\nfunction classifyVariant(message: string): string | undefined {\n const lower = message.toLowerCase()\n const creationPatterns = [\n /^create\\b/, /^build\\b/, /^make\\b/, /^generate\\b/, /^scaffold\\b/,\n /^set up\\b/, /^setup\\b/, /^bootstrap\\b/, /^initialize\\b/, /^init\\b/,\n /^write a\\b/, /^write an\\b/, /^implement a\\b/, /^implement an\\b/,\n /^start a\\b/, /^start an\\b/, /^new\\b/,\n ]\n const hasCreationStart = creationPatterns.some((p) => p.test(lower))\n\n const modificationVerbs = [\n 'fix', 'update', 'change', 'modify', 'edit', 'refactor',\n 'improve', 'add to', 'remove', 'delete', 'rename', 'migrate',\n ]\n const hasModificationVerb = modificationVerbs.some(\n (v) => lower.startsWith(v) || new RegExp(`\\\\b${v}\\\\b`).test(lower)\n )\n\n if (hasCreationStart && !hasModificationVerb) {\n return 'create'\n }\n\n return 'modify'\n}\n\n// ─── Bootstrap context generation ────────────────────────────────────\n\nasync function generateBootstrapContext(\n message: string,\n localTools: Record<string, { execute: (args: Record<string, unknown>) => Promise<unknown> }> | undefined,\n variant?: string\n): Promise<string | undefined> {\n if (variant === 'create') return undefined\n if (!localTools) return undefined\n\n const searchTool = localTools.search_repo\n const globTool = localTools.glob_files\n if (!searchTool && !globTool) return undefined\n\n const queries = extractBootstrapQueries(message)\n if (queries.length === 0) return undefined\n\n const lines: string[] = []\n for (const query of queries) {\n if (lines.length >= 6) break\n\n if (searchTool) {\n try {\n const result = await searchTool.execute({ query, path: '.', maxResults: 5 })\n const summary = summarizeTextBlock(result, 3)\n if (summary && !summary.startsWith('No matches found')) {\n lines.push(`search_repo \"${query}\": ${summary}`)\n continue\n }\n } catch {\n // Best effort bootstrap only\n }\n }\n\n if (globTool && /\\./.test(query)) {\n try {\n const result = await globTool.execute({ pattern: `**/${query}`, path: '.', maxResults: 5 })\n const summary = summarizeTextBlock(result, 3)\n if (summary && !summary.startsWith('No files matched')) {\n lines.push(`glob_files \"**/${query}\": ${summary}`)\n }\n } catch {\n // Best effort bootstrap only\n }\n }\n }\n\n if (lines.length === 0) return undefined\n return ['Bootstrap repo hints:', ...lines].join('\\n').slice(0, 1500)\n}\n\n// ─── Candidate block builder ─────────────────────────────────────────\n\nfunction buildCandidateBlock(state: RunTaskStateSlice): string {\n if (!state.bestCandidatePath || state.isCreationTask) return ''\n return [\n '',\n '--- Best Candidate ---',\n `Current best candidate file: ${state.bestCandidatePath}`,\n ...(state.bestCandidateReason ? [`Why: ${state.bestCandidateReason}`] : []),\n ].join('\\n')\n}\n\n// ─── Export the default workflow ─────────────────────────────────────\n\nexport const defaultWorkflow: WorkflowDefinition = {\n name: 'default',\n phases: [researchPhase, planningPhase, executionPhase],\n classifyVariant,\n generateBootstrapContext,\n buildCandidateBlock,\n}\n","/**\n * Deploy workflow: scaffold → deploy.\n *\n * A streamlined two-phase workflow for tasks where the goal is to build\n * code and deploy it to a sandbox with a live preview URL, rather than\n * editing files in the local repository.\n *\n * Phase 1 (scaffold): Understand what the user wants built. Quick —\n * auto-advances after the agent has acknowledged the task.\n *\n * Phase 2 (deploy): Write code and call deploy_sandbox to get a live\n * preview URL. Iterate on errors until the deployment succeeds.\n */\n\nimport type {\n WorkflowDefinition,\n WorkflowPhase,\n} from '../workflow-types'\n\n// ─── Scaffold Phase ──────────────────────────────────────────────────\n\nconst scaffoldPhase: WorkflowPhase = {\n name: 'scaffold',\n description: 'Understand requirements for the app to deploy',\n\n buildInstructions(_state) {\n return [\n '--- Workflow Phase: Scaffold ---',\n 'This is a deploy-to-sandbox task. You will build code and deploy it to a live sandbox — you are NOT editing files in the local repository.',\n 'Quickly determine:',\n ' 1. What the user wants built (web app, API, UI, etc.)',\n ' 2. The tech stack (Express, Hono, React, vanilla HTML, etc.)',\n ' 3. Any specific dependencies needed',\n ' 4. Which port the server should listen on (default: 3000)',\n '',\n 'Do NOT inspect the local repo or search for files to edit.',\n 'Do NOT write a plan file.',\n 'Once you understand the requirements, proceed to build and deploy using deploy_sandbox.',\n ].join('\\n')\n },\n\n buildToolGuidance(_state) {\n return [\n 'This is a sandbox deploy task — do NOT use write_file, read_file, search_repo, glob_files, tree_directory, or list_directory.',\n 'Your primary tool is deploy_sandbox. Use it to deploy code to a persistent sandbox and get a live preview URL.',\n 'You may use run_sandbox_code for quick one-off tests before a full deploy.',\n ]\n },\n\n isComplete(ctx) {\n // Auto-advance after the first session — the agent should have\n // understood requirements and can start deploying immediately.\n // Also advance if a deploy_sandbox call was already made (eager agent).\n return ctx.state.sessions.length >= 1 ||\n ctx.trace.entries.some((entry) => entry.startsWith('deploy_sandbox'))\n },\n\n buildTransitionSummary(_state, _nextPhaseName) {\n return [\n 'Automatic phase transition: scaffold → deploy.',\n 'Requirements understood. Build the code and deploy it using deploy_sandbox.',\n ].join('\\n')\n },\n\n interceptToolCall(toolName, _args, _ctx) {\n // Block local file system tools — this workflow doesn't touch the repo\n const blockedTools = ['write_file', 'read_file', 'search_repo', 'glob_files', 'tree_directory', 'list_directory', 'restore_file_checkpoint']\n if (blockedTools.includes(toolName)) {\n return [\n `Blocked: ${toolName} is not available in deploy mode.`,\n 'Use deploy_sandbox to deploy your code to a live sandbox instead of writing files to the local repo.',\n ].join(' ')\n }\n return undefined\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n if (recent.length < 2) return undefined\n\n const noProgress = recent.every(\n (s) => s.hadTextOutput === false && s.wroteFiles === false\n )\n if (!noProgress) return undefined\n\n return [\n 'Recovery instruction:',\n 'You are in deploy mode — do NOT search the local repo or write local files.',\n 'Your goal is to build code and deploy it using deploy_sandbox.',\n 'Determine what the user wants built and call deploy_sandbox with the code.',\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, _ctx) {\n // Force end if looping on blocked tools\n if (snapshot.pauseCount >= 12) {\n return 'scaffold phase is looping without progressing — end the turn so the system can advance to deploy'\n }\n return undefined\n },\n}\n\n// ─── Deploy Phase ────────────────────────────────────────────────────\n\nconst deployPhase: WorkflowPhase = {\n name: 'deploy',\n description: 'Build code and deploy to sandbox with live preview',\n\n buildInstructions(_state) {\n return [\n '--- Workflow Phase: Deploy ---',\n 'Build the code and deploy it using the deploy_sandbox tool.',\n '',\n 'deploy_sandbox takes:',\n ' - code: The full source code (written to main.ts/main.js/main.py)',\n ' - packageJson: Dependencies as a JSON object, e.g. { \"dependencies\": { \"express\": \"^4.18.2\" } }',\n ' - language: \"typescript\" (default), \"javascript\", or \"python\"',\n ' - port: The port your server listens on (default: 3000)',\n ' - startCommand: Custom start command (auto-detected by default)',\n '',\n 'It returns a live previewUrl that the user can open in their browser.',\n '',\n 'Guidelines:',\n ' 1. Write complete, working code in a single deploy_sandbox call — the code param is the entire file.',\n ' 2. The server MUST listen on the specified port. For Express: app.listen(3000)',\n ' 3. Include ALL dependencies in packageJson — nothing is pre-installed except Node.js built-ins.',\n ' 4. If the deploy fails, read the error output, fix the code, and call deploy_sandbox again.',\n ' 5. The sandbox is persistent — subsequent calls reuse the same sandbox.',\n ' 6. When the deploy succeeds and the preview URL is live, tell the user and end with TASK_COMPLETE.',\n ].join('\\n')\n },\n\n buildToolGuidance(_state) {\n return [\n 'Your primary tool is deploy_sandbox. Call it with code, packageJson, language, and port.',\n 'Do NOT use write_file, read_file, search_repo, glob_files, tree_directory, or list_directory — you are deploying to a sandbox, not editing local files.',\n 'You may use run_sandbox_code for quick one-off script execution if needed.',\n 'When deploy_sandbox returns successfully with a previewUrl, tell the user the URL and end with TASK_COMPLETE.',\n ]\n },\n\n isComplete() {\n // Agent-driven completion via TASK_COMPLETE\n return false\n },\n\n interceptToolCall(toolName, _args, _ctx) {\n // Block local file system tools\n const blockedTools = ['write_file', 'read_file', 'search_repo', 'glob_files', 'tree_directory', 'list_directory', 'restore_file_checkpoint']\n if (blockedTools.includes(toolName)) {\n return [\n `Blocked: ${toolName} is not available in deploy mode.`,\n 'Use deploy_sandbox to deploy your code to a live sandbox instead of writing files to the local repo.',\n ].join(' ')\n }\n return undefined\n },\n\n canAcceptCompletion(_state, trace) {\n // Accept completion if at least one deploy_sandbox call was made\n // @snake-case-ok: Tool name identifier uses snake_case to match agent tool definitions\n return trace.entries.some((entry) => entry.startsWith('deploy_sandbox'))\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n if (recent.length < 2) return undefined\n\n const noProgress = recent.every(\n (s) => s.hadTextOutput === false && s.wroteFiles === false\n )\n if (!noProgress) return undefined\n\n return [\n 'Recovery instruction:',\n 'You should be deploying code using deploy_sandbox, not searching the repo.',\n 'Write the complete server code and call deploy_sandbox with it.',\n 'Include all dependencies in the packageJson parameter.',\n 'The server must listen on the specified port (default 3000).',\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, _ctx) {\n if (snapshot.consecutiveDiscoveryPauseCount >= 8) {\n return 'deploy phase is looping on discovery tools instead of calling deploy_sandbox'\n }\n if (snapshot.actionKeyCount >= 4) {\n return `the same action repeated ${snapshot.actionKeyCount} times — try a different approach`\n }\n return undefined\n },\n}\n\n// ─── Variant classification ──────────────────────────────────────────\n\nfunction classifyVariant(message: string): string | undefined {\n const lower = message.toLowerCase()\n\n // Deploy patterns — check these first since they're the whole point of this workflow\n const deployPatterns = [\n /\\bdeploy\\b/, /\\bsandbox\\b/, /\\bpreview\\s*url\\b/, /\\blive\\s*preview\\b/,\n /\\bhost\\b.*\\b(?:app|server|api|site)\\b/, /\\b(?:app|server|api|site)\\b.*\\bhost\\b/,\n /\\brun\\b.*\\b(?:server|web\\s*app)\\b/, /\\blaunch\\b.*\\b(?:app|server|api|site)\\b/,\n /\\bstart\\b.*\\b(?:server|web\\s*app)\\b/,\n ]\n if (deployPatterns.some((p) => p.test(lower))) {\n return 'deploy'\n }\n\n // Also classify as deploy if the message is about building a web app/API/site\n // without mentioning local files or repo modification\n const webAppPatterns = [\n /\\bbuild\\b.*\\b(?:web\\s*app|website|api|server|express|hono|fastify)\\b/,\n /\\bcreate\\b.*\\b(?:web\\s*app|website|api|server|express|hono|fastify)\\b/,\n /\\bmake\\b.*\\b(?:web\\s*app|website|api|server|express|hono|fastify)\\b/,\n ]\n const repoPatterns = [\n /\\b(?:file|repo|repository|codebase|project|directory|folder)\\b/,\n /\\b(?:edit|modify|update|fix|refactor|change)\\b/,\n ]\n if (webAppPatterns.some((p) => p.test(lower)) && !repoPatterns.some((p) => p.test(lower))) {\n return 'deploy'\n }\n\n return 'deploy' // This workflow is only used when deploy intent is detected\n}\n\n// ─── Export the deploy workflow ──────────────────────────────────────\n\nexport const deployWorkflow: WorkflowDefinition = {\n name: 'deploy',\n phases: [scaffoldPhase, deployPhase],\n classifyVariant,\n\n // No bootstrap context needed — we're not searching the repo\n async generateBootstrapContext() {\n return undefined\n },\n\n // No candidate block — we're not editing repo files\n buildCandidateBlock() {\n return ''\n },\n}\n","/**\n * API endpoint handlers with automatic camelCase/snake_case transformation\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport type {\n Flow,\n Prompt,\n RuntypeRecord,\n ApiKey,\n ModelConfig,\n UserProfile,\n PaginationResponse,\n ApiResponse,\n ListParams,\n RecordListParams,\n CreateFlowRequest,\n CreatePromptRequest,\n CreateRecordRequest,\n CreateApiKeyRequest,\n CreateModelConfigRequest,\n DispatchRequest,\n BulkEditRequest,\n BulkEditResponse,\n Tool,\n ToolExecution,\n CreateToolRequest,\n UpdateToolRequest,\n ExecuteToolRequest,\n ExecuteToolResponse,\n DeploySandboxRequest,\n DeploySandboxResponse,\n BuiltInTool,\n ModelUsageResponse,\n ModelUsageQueryParams,\n RuntimeTool,\n} from './types'\n\nimport type {\n ClientToken,\n CreateClientTokenRequest,\n CreateClientTokenResponse,\n UpdateClientTokenRequest,\n ListConversationsResponse,\n} from './client-token-types'\n\nimport {\n applyGeneratedRuntimeToolProposalToDispatchRequest,\n attachRuntimeToolsToDispatchRequest,\n buildGeneratedRuntimeToolGateOutput,\n evaluateGeneratedRuntimeToolProposal,\n type ApplyGeneratedProposalOptions,\n type ApplyGeneratedProposalResult,\n type AttachRuntimeToolsOptions,\n type GeneratedRuntimeToolGateDecision,\n type GeneratedRuntimeToolGateOptions,\n} from './generated-tool-gate'\n\nimport type {\n WorkflowDefinition,\n WorkflowPhase,\n WorkflowContext,\n} from './workflow-types'\n\nimport {\n normalizeCandidatePath as normalizePathUtil,\n isMarathonArtifactPath as isArtifactPathUtil,\n isDiscoveryToolName as isDiscoveryToolUtil,\n getDefaultPlanPath as getDefaultPlanPathUtil,\n} from './workflow-utils'\n\nimport { defaultWorkflow } from './workflows'\n\nexport interface ApiClient {\n get<T>(path: string, params?: { [key: string]: any }): Promise<T>\n post<T>(path: string, data?: any): Promise<T>\n put<T>(path: string, data?: any): Promise<T>\n patch<T>(path: string, data?: any): Promise<T>\n delete<T>(path: string, data?: any): Promise<T>\n postFormData<T>(path: string, formData: FormData): Promise<T>\n requestStream(path: string, options?: RequestInit): Promise<Response>\n}\n\n/**\n * Flows endpoint handlers\n */\nexport class FlowsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all flows for the authenticated user\n */\n async list(params?: ListParams): Promise<PaginationResponse<Flow>> {\n return this.client.get<PaginationResponse<Flow>>('/flows', params)\n }\n\n /**\n * Get a specific flow by ID\n */\n async get(id: string): Promise<Flow> {\n const response = await this.client.get<Flow>(`/flows/${id}`)\n return response\n }\n\n /**\n * Create a new flow\n */\n async create(data: CreateFlowRequest): Promise<Flow> {\n return this.client.post<Flow>('/flows', data)\n }\n\n /**\n * Update an existing flow\n */\n async update(id: string, data: Partial<CreateFlowRequest>): Promise<Flow> {\n return this.client.put<Flow>(`/flows/${id}`, data)\n }\n\n /**\n * Delete a flow\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/flows/${id}`)\n }\n\n /**\n * Run a flow on all records of a specific type\n */\n async runOnRecordType(id: string, recordType: string): Promise<any> {\n return this.client.post(`/flows/${id}/run-on-record-type`, {\n recordType,\n })\n }\n\n /**\n * Publish flow (promote draft to published)\n */\n async publish(\n id: string\n ): Promise<{ success: boolean; publishedVersionId: string; message: string }> {\n return this.client.post(`/flows/${id}/publish`)\n }\n}\n\n/**\n * Prompts endpoint handlers\n */\nexport class PromptsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all prompts for the authenticated user\n */\n async list(params?: ListParams & { flowId?: string }): Promise<PaginationResponse<Prompt>> {\n return this.client.get<PaginationResponse<Prompt>>('/prompts', params)\n }\n\n /**\n * Get a specific prompt by ID\n */\n async get(id: string): Promise<Prompt> {\n return this.client.get<Prompt>(`/prompts/${id}`)\n }\n\n /**\n * Create a new prompt\n */\n async create(data: CreatePromptRequest): Promise<Prompt> {\n return this.client.post<Prompt>('/prompts', data)\n }\n\n /**\n * Update an existing prompt\n */\n async update(id: string, data: Partial<CreatePromptRequest>): Promise<Prompt> {\n return this.client.put<Prompt>(`/prompts/${id}`, data)\n }\n\n /**\n * Delete a prompt\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/prompts/${id}`)\n }\n\n /**\n * Run a prompt on a specific record\n */\n async runOnRecord(id: string, recordId: string): Promise<any> {\n return this.client.post(`/prompts/${id}/run-on-record`, { recordId })\n }\n\n /**\n * Get flows using this prompt\n */\n async getFlows(id: string): Promise<{ flows: any[] }> {\n return this.client.get(`/prompts/${id}/flows`)\n }\n\n /**\n * Update flow attachments for a prompt\n */\n async updateFlows(\n id: string,\n flowIds: string[]\n ): Promise<{ success: boolean; attachedFlows: number }> {\n return this.client.put(`/prompts/${id}/flows`, { flowIds })\n }\n}\n\n/**\n * Records endpoint handlers\n */\nexport class RecordsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all records for the authenticated user\n */\n async list(params?: RecordListParams): Promise<PaginationResponse<RuntypeRecord>> {\n return this.client.get<PaginationResponse<RuntypeRecord>>('/records', params)\n }\n\n /**\n * Get a specific record by ID\n */\n async get(id: string): Promise<RuntypeRecord> {\n return this.client.get<RuntypeRecord>(`/records/${id}`)\n }\n\n /**\n * Create a new record\n */\n async create(data: CreateRecordRequest): Promise<RuntypeRecord> {\n return this.client.post<RuntypeRecord>('/records', data)\n }\n\n /**\n * Update an existing record\n */\n async update(id: string, data: Partial<CreateRecordRequest>): Promise<RuntypeRecord> {\n return this.client.put<RuntypeRecord>(`/records/${id}`, data)\n }\n\n /**\n * Delete a record\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/records/${id}`)\n }\n\n /**\n * Bulk delete multiple records\n */\n async bulkDelete(\n ids: string[]\n ): Promise<{ success: boolean; deleted: number; deletedIds: string[]; notFoundIds?: string[] }> {\n return this.client.post<{\n success: boolean\n deleted: number\n deletedIds: string[]\n notFoundIds?: string[]\n }>('/records/bulk-delete', { ids })\n }\n\n /**\n * Bulk edit multiple records\n */\n async bulkEdit(data: BulkEditRequest): Promise<BulkEditResponse> {\n return this.client.post<BulkEditResponse>('/records/bulk-edit', data)\n }\n\n /**\n * Get results for a record\n */\n async getResults(\n id: string,\n params?: { flowId?: string; fromDate?: string; toDate?: string }\n ): Promise<any[]> {\n return this.client.get(`/records/${id}/results`, params)\n }\n\n /**\n * Delete a specific result for a record\n */\n async deleteResult(id: string, resultId: string): Promise<void> {\n return this.client.delete<void>(`/records/${id}/results`, { resultId })\n }\n\n /**\n * Upload CSV file to create multiple records\n */\n async uploadCsv(file: File, params?: { typeColumn?: string; nameColumn?: string }): Promise<any> {\n const formData = new FormData()\n formData.append('file', file)\n if (params?.typeColumn) {\n formData.append('typeColumn', params.typeColumn)\n }\n if (params?.nameColumn) {\n formData.append('nameColumn', params.nameColumn)\n }\n return this.client.postFormData('/records/upload-csv', formData)\n }\n\n /**\n * Get record types (distinct values)\n */\n async getTypes(): Promise<{ data: string[]; total: number }> {\n return this.client.get('/records?distinct=types')\n }\n\n /**\n * Get example record by type and/or name\n */\n async getExample(params: {\n type?: string\n name?: string\n }): Promise<PaginationResponse<RuntypeRecord>> {\n return this.client.get('/records', {\n ...params,\n includeFields: true,\n limit: 1,\n })\n }\n}\n\n/**\n * API Keys endpoint handlers\n */\nexport class ApiKeysEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all API keys for the authenticated user\n */\n async list(): Promise<ApiKey[]> {\n const response = await this.client.get<{ apiKeys: ApiKey[]; total: number; timestamp: string }>(\n '/api-keys'\n )\n return response.apiKeys\n }\n\n /**\n * Get a specific API key by ID\n */\n async get(id: string): Promise<ApiKey> {\n return this.client.get<ApiKey>(`/api-keys/${id}`)\n }\n\n /**\n * Create a new API key\n */\n async create(\n data: CreateApiKeyRequest\n ): Promise<{ apiKey: ApiKey; plainKey: string; warning: string }> {\n return this.client.post('/api-keys', data)\n }\n\n /**\n * Update an existing API key\n */\n async update(id: string, data: Partial<CreateApiKeyRequest>): Promise<{ apiKey: ApiKey }> {\n return this.client.put(`/api-keys/${id}`, data)\n }\n\n /**\n * Delete an API key\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/api-keys/${id}`)\n }\n\n /**\n * Regenerate an API key\n */\n async regenerate(id: string): Promise<{ apiKey: ApiKey; plainKey: string; warning: string }> {\n return this.client.post(`/api-keys/${id}/regenerate`)\n }\n\n /**\n * Get API key analytics\n */\n async getAnalytics(id: string): Promise<any> {\n return this.client.get(`/api-keys/${id}/analytics`)\n }\n\n /**\n * Get usage logs for an API key\n */\n async getUsage(\n id: string,\n params?: { startDate?: string; endDate?: string; limit?: number }\n ): Promise<any> {\n return this.client.get(`/api-keys/${id}/usage`, params)\n }\n\n /**\n * Get API key analytics (all keys or specific key)\n */\n async getAnalyticsEnhanced(\n apiKeyId: string | 'all',\n params?: Record<string, string>\n ): Promise<any> {\n const endpoint = apiKeyId === 'all' ? '/api-keys/analytics' : `/api-keys/${apiKeyId}/analytics`\n return this.client.get(endpoint, params)\n }\n\n /**\n * Get API key usage logs (all keys or specific key)\n */\n async getLogs(apiKeyId: string | 'all', params?: Record<string, string>): Promise<any> {\n const endpoint = apiKeyId === 'all' ? '/api-keys/logs' : `/api-keys/${apiKeyId}/logs`\n return this.client.get(endpoint, params)\n }\n\n /**\n * Get API key permission options\n */\n async getPermissionOptions(): Promise<any> {\n return this.client.get('/api-keys/options')\n }\n\n /**\n * Get API key security logs\n */\n async getSecurityLogs(id: string): Promise<any> {\n return this.client.get(`/api-keys/${id}/security-logs`)\n }\n\n /**\n * Update API key security settings\n */\n async updateSecurity(id: string, data: any): Promise<any> {\n return this.client.put(`/api-keys/${id}/security`, data)\n }\n\n /**\n * Clear suspicious activity for API key\n */\n async clearSuspiciousActivity(id: string): Promise<any> {\n return this.client.post(`/api-keys/${id}/clear-suspicious`)\n }\n}\n\n/**\n * Model Configurations endpoint handlers\n */\nexport class ModelConfigsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Get available models catalog\n */\n async getAvailable(): Promise<ModelConfig[]> {\n const response = await this.client.get<{ data: ModelConfig[]; total: number } | ModelConfig[]>(\n '/model-configs/available'\n )\n // Handle both wrapped and direct array responses\n return Array.isArray(response) ? response : response.data || []\n }\n\n /**\n * Get search-capable models (all available, regardless of user configuration)\n */\n async getSearchCapable(): Promise<ModelConfig[]> {\n const response = await this.client.get<{ data: ModelConfig[]; total: number }>(\n '/model-configs/search-capable'\n )\n return response.data || []\n }\n\n /**\n * Get configured search-capable models (only user's configured and enabled models)\n */\n async getSearchConfigured(): Promise<ModelConfig[]> {\n const response = await this.client.get<{ data: ModelConfig[]; total: number }>(\n '/model-configs/search-configured'\n )\n return response.data || []\n }\n\n /**\n * List user's model configurations\n */\n async list(): Promise<ModelConfig[]> {\n const response = await this.client.get<{ data: ModelConfig[] } | ModelConfig[]>(\n '/model-configs'\n )\n // Handle both wrapped and direct array responses\n return Array.isArray(response) ? response : response.data || []\n }\n\n /**\n * Create a new model configuration\n */\n async create(data: CreateModelConfigRequest): Promise<ModelConfig> {\n return this.client.post<ModelConfig>('/model-configs', data)\n }\n\n /**\n * Update an existing model configuration\n */\n async update(id: string, data: Partial<CreateModelConfigRequest>): Promise<ModelConfig> {\n return this.client.put<ModelConfig>(`/model-configs/${id}`, data)\n }\n\n /**\n * Delete a model configuration\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/model-configs/${id}`)\n }\n\n /**\n * Enable/disable a model configuration\n */\n async updateStatus(\n id: string,\n isEnabled: boolean\n ): Promise<{ success: boolean; message: string }> {\n return this.client.patch(`/model-configs/${id}/status`, { isEnabled })\n }\n\n /**\n * Set a model configuration as default\n */\n async setDefault(id: string): Promise<{ success: boolean; message: string; data: ModelConfig }> {\n return this.client.patch(`/model-configs/${id}/default`)\n }\n\n /**\n * Get usage statistics\n */\n async getUsage(): Promise<any> {\n return this.client.get('/model-configs/usage')\n }\n}\n\n/**\n * Dispatch endpoint handler for atomic record/flow creation and execution\n */\nexport class DispatchEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Dispatch: create and/or execute flows on records atomically\n */\n async execute(data: DispatchRequest): Promise<any> {\n return this.client.post('/dispatch', data)\n }\n\n /**\n * Dispatch with streaming response\n */\n async executeStream(data: DispatchRequest): Promise<Response> {\n return this.client.requestStream('/dispatch', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Resume paused flow execution\n * API expects snake_case field names\n *\n * @param data.execution_id - The execution ID to resume\n * @param data.tool_outputs - Tool outputs to inject into the flow\n * @param data.stream_response - Whether to stream the response\n * @param data.messages - Optional messages to override the original dispatch messages\n */\n async resume(data: {\n executionId: string\n toolOutputs?: Record<string, any>\n streamResponse?: boolean\n messages?: Array<{\n role: 'system' | 'user' | 'assistant'\n content: string | Array<{ type: string; text?: string; image?: string }>\n }>\n }): Promise<any> {\n if (data.streamResponse) {\n return this.client.requestStream('/dispatch/resume', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n return this.client.post('/dispatch/resume', data)\n }\n\n /**\n * Evaluate a model-proposed runtime tool against a configurable allowlist policy.\n * Useful for local `propose_runtime_tool` handlers before redispatch.\n */\n gateGeneratedRuntimeToolProposal(\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): GeneratedRuntimeToolGateDecision {\n return evaluateGeneratedRuntimeToolProposal(proposal, options)\n }\n\n /**\n * Build standardized local-tool output for a generated tool proposal.\n * Returns `{ approved, reason, violations, tool? }`.\n */\n buildGeneratedRuntimeToolGateOutput(\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): {\n approved: boolean\n reason: string\n violations: string[]\n tool?: RuntimeTool\n } {\n return buildGeneratedRuntimeToolGateOutput(proposal, options)\n }\n\n /**\n * Attach approved runtime tools to a prompt step in a redispatch request.\n * Returns a new request object and does not mutate the original.\n */\n attachApprovedRuntimeTools(\n request: DispatchRequest,\n runtimeTools: RuntimeTool[],\n options?: AttachRuntimeToolsOptions\n ): DispatchRequest {\n return attachRuntimeToolsToDispatchRequest(request, runtimeTools, options)\n }\n\n /**\n * Validate a generated runtime tool proposal and attach it to the redispatch\n * request if approved, in one call.\n */\n applyGeneratedRuntimeToolProposal(\n request: DispatchRequest,\n proposal: unknown,\n options?: ApplyGeneratedProposalOptions\n ): ApplyGeneratedProposalResult {\n return applyGeneratedRuntimeToolProposalToDispatchRequest(request, proposal, options)\n }\n}\n\n/**\n * Chat endpoint handler\n */\nexport class ChatEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Send a chat message\n */\n async send(message: string): Promise<any> {\n return this.client.post('/chat', { message })\n }\n\n /**\n * Send a chat message with streaming response\n */\n async sendStream(message: string, options?: any): Promise<Response> {\n return this.client.requestStream('/chat', {\n method: 'POST',\n body: JSON.stringify({ message, ...options }),\n })\n }\n}\n\n/**\n * Users endpoint handlers\n */\nexport class UsersEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Get current user profile\n */\n async getProfile(): Promise<UserProfile> {\n return this.client.get<UserProfile>('/users/profile')\n }\n\n /**\n * Update user profile\n */\n async updateProfile(data: Partial<UserProfile>): Promise<UserProfile> {\n return this.client.put<UserProfile>('/users/profile', data)\n }\n}\n\n/**\n * Analytics endpoint handlers\n */\nexport class AnalyticsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Get analytics stats\n */\n async getStats(params?: Record<string, string>): Promise<any> {\n return this.client.get('/analytics/stats', params)\n }\n\n /**\n * Get analytics executions\n */\n async getExecutions(params?: Record<string, string>): Promise<any> {\n return this.client.get('/analytics/record-results', params)\n }\n\n /**\n * Get all record results (same as executions)\n */\n async getAllRecordResults(params?: Record<string, string>): Promise<any> {\n return this.client.get('/analytics/record-results', params)\n }\n\n /**\n * Get model usage analytics\n */\n async getModelUsage(params?: ModelUsageQueryParams): Promise<ModelUsageResponse> {\n return this.client.get<ModelUsageResponse>('/model-usage', params)\n }\n}\n\n/**\n * Flow Steps endpoint handlers\n *\n * @deprecated Flow steps are now consolidated into the flows endpoint.\n * Use `flows.get(id)` to get a flow with embedded `flowSteps`.\n * Use `flows.update(id, { flow_steps: [...] })` to update flow steps.\n */\nexport class FlowStepsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Get flow steps for a flow\n * @deprecated Use `flows.get(flowId)` instead - flow steps are now embedded in the flow response as `flowSteps`\n */\n async getByFlow(flowId: string): Promise<any[]> {\n console.warn(\n '[Runtype SDK] flowSteps.getByFlow() is deprecated. Use flows.get(flowId) instead - flow steps are now embedded in the flow response as flowSteps.'\n )\n return this.client.get(`/flow-steps/flow/${flowId}`)\n }\n\n /**\n * Get a specific flow step\n * @deprecated Use `flows.get(flowId)` and find the step in `flowSteps` array\n */\n async get(id: string): Promise<any> {\n console.warn(\n '[Runtype SDK] flowSteps.get() is deprecated. Use flows.get(flowId) and find the step in flowSteps array.'\n )\n return this.client.get(`/flow-steps/${id}`)\n }\n\n /**\n * Create a flow step\n * @deprecated Use `flows.update(flowId, { flow_steps: [...] })` to add steps\n */\n async create(data: any): Promise<any> {\n console.warn(\n '[Runtype SDK] flowSteps.create() is deprecated. Use flows.update(flowId, { flow_steps: [...] }) to add steps.'\n )\n return this.client.post('/flow-steps', data)\n }\n\n /**\n * Update a flow step\n * @deprecated Use `flows.update(flowId, { flow_steps: [...] })` to update steps\n */\n async update(id: string, data: any): Promise<any> {\n console.warn(\n '[Runtype SDK] flowSteps.update() is deprecated. Use flows.update(flowId, { flow_steps: [...] }) to update steps.'\n )\n return this.client.put(`/flow-steps/${id}`, data)\n }\n\n /**\n * Delete a flow step\n * @deprecated Use `flows.update(flowId, { flow_steps: [...] })` with the step removed\n */\n async delete(id: string): Promise<void> {\n console.warn(\n '[Runtype SDK] flowSteps.delete() is deprecated. Use flows.update(flowId, { flow_steps: [...] }) with the step removed.'\n )\n return this.client.delete(`/flow-steps/${id}`)\n }\n\n /**\n * Reorder flow steps\n * @deprecated Use `flows.update(flowId, { flow_steps: [...] })` with updated order values\n */\n async reorder(flowId: string, stepOrders: Array<{ id: string; order: number }>): Promise<any> {\n console.warn(\n '[Runtype SDK] flowSteps.reorder() is deprecated. Use flows.update(flowId, { flow_steps: [...] }) with updated order values.'\n )\n return this.client.post('/flow-steps/reorder', {\n flowId,\n stepOrders,\n })\n }\n}\n\n/**\n * Context Templates endpoint handlers\n */\nexport class ContextTemplatesEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List context templates\n */\n async list(params?: Record<string, string>): Promise<any[]> {\n return this.client.get('/context-templates', params)\n }\n\n /**\n * Get a specific context template\n */\n async get(id: string): Promise<any> {\n return this.client.get(`/context-templates/${id}`)\n }\n\n /**\n * Create a context template\n */\n async create(data: any): Promise<any> {\n return this.client.post('/context-templates', data)\n }\n\n /**\n * Update a context template\n */\n async update(id: string, data: any): Promise<any> {\n return this.client.put(`/context-templates/${id}`, data)\n }\n\n /**\n * Delete a context template\n */\n async delete(id: string): Promise<void> {\n return this.client.delete(`/context-templates/${id}`)\n }\n}\n\n/**\n * Tools endpoint handlers\n */\nexport class ToolsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all tools for the authenticated user\n */\n async list(params?: ListParams): Promise<PaginationResponse<Tool>> {\n return this.client.get<PaginationResponse<Tool>>('/tools', params)\n }\n\n /**\n * Get a specific tool by ID\n */\n async get(id: string): Promise<Tool> {\n return this.client.get<Tool>(`/tools/${id}`)\n }\n\n /**\n * Create a new tool\n */\n async create(data: CreateToolRequest): Promise<Tool> {\n return this.client.post<Tool>('/tools', data)\n }\n\n /**\n * Update an existing tool\n */\n async update(id: string, data: UpdateToolRequest): Promise<Tool> {\n return this.client.put<Tool>(`/tools/${id}`, data)\n }\n\n /**\n * Delete a tool\n */\n async delete(id: string): Promise<void> {\n return this.client.delete(`/tools/${id}`)\n }\n\n /**\n * Execute a tool\n */\n async execute(id: string, data: ExecuteToolRequest): Promise<ExecuteToolResponse> {\n return this.client.post<ExecuteToolResponse>(`/tools/${id}/execute`, data)\n }\n\n /**\n * Execute a tool with streaming response\n */\n async executeStream(id: string, data: ExecuteToolRequest): Promise<Response> {\n return this.client.requestStream(`/tools/${id}/execute`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Test a tool (same as execute but for testing purposes)\n */\n async test(id: string, data: ExecuteToolRequest): Promise<ExecuteToolResponse> {\n return this.client.post<ExecuteToolResponse>(`/tools/${id}/test`, data)\n }\n\n /**\n * Get tool executions for a specific tool\n */\n async getExecutions(\n toolId: string,\n params?: ListParams\n ): Promise<PaginationResponse<ToolExecution>> {\n return this.client.get<PaginationResponse<ToolExecution>>(`/tools/${toolId}/executions`, params)\n }\n\n /**\n * Get AI SDK compatible tool schemas\n */\n async getSchemas(params?: { toolIds?: string[] }): Promise<any[]> {\n return this.client.get('/tools/schema', params)\n }\n\n /**\n * Get available tools for prompts\n */\n async getAvailable(): Promise<Tool[]> {\n const response = await this.client.get<PaginationResponse<Tool>>('/tools', {\n isActive: true,\n limit: 200,\n })\n\n const payload: any = response\n\n if (Array.isArray(payload?.data)) {\n return payload.data\n }\n\n if (Array.isArray(payload)) {\n return payload\n }\n\n return []\n }\n\n /**\n * Convert a flow to a tool\n */\n async convertFromFlow(\n flowId: string,\n data: {\n name: string\n description: string\n parameterMapping?: Record<string, string>\n outputMapping?: string\n }\n ): Promise<Tool> {\n return this.client.post<Tool>(`/flows/${flowId}/convert-to-tool`, data)\n }\n\n /**\n * Get all built-in tools\n */\n async getBuiltInTools(): Promise<PaginationResponse<BuiltInTool>> {\n return this.client.get<PaginationResponse<BuiltInTool>>('/tools/builtin')\n }\n\n /**\n * Get built-in tools compatible with a specific model and provider\n */\n async getCompatibleBuiltInTools(\n model: string,\n provider: string\n ): Promise<PaginationResponse<BuiltInTool>> {\n return this.client.get<PaginationResponse<BuiltInTool>>('/tools/builtin/compatible', {\n model,\n provider,\n })\n }\n\n /**\n * Get parameter schema for a specific built-in tool\n */\n async getBuiltInToolSchema(toolId: string): Promise<BuiltInTool> {\n return this.client.get<BuiltInTool>(`/tools/builtin/${toolId}/schema`)\n }\n\n /**\n * Deploy code to a persistent Daytona sandbox and get a preview URL\n */\n async deploySandbox(data: DeploySandboxRequest): Promise<DeploySandboxResponse> {\n return this.client.post<DeploySandboxResponse>('/tools/sandbox/deploy', data)\n }\n\n /**\n * Cleanup a deployed Daytona sandbox\n */\n async cleanupSandbox(sandboxId: string): Promise<void> {\n return this.client.delete(`/tools/sandbox/${sandboxId}`)\n }\n}\n\n/**\n * Eval endpoint handlers\n */\nexport class EvalEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Run virtual eval with streaming response\n * Executes multiple eval configs simultaneously and streams results via multiplexed SSE\n */\n async runVirtualEval(data: {\n record?: {\n name?: string\n type?: string\n metadata?: Record<string, any>\n }\n messages?: Array<{\n role: 'system' | 'user' | 'assistant'\n content: string\n }>\n flowId?: string\n flowDefinition?: any\n evalConfigs: Array<{\n evalConfigId?: string\n evalName?: string\n stepOverrides?: Record<string, any>\n }>\n evalGroupId?: string\n }): Promise<Response> {\n return this.client.requestStream('/eval/stream', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n}\n\n/**\n * Client Tokens endpoint handlers\n *\n * Manages client tokens for secure browser-to-API communication.\n * Client tokens enable embedding chat widgets in external applications.\n */\nexport class ClientTokensEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all client tokens for the authenticated user\n */\n async list(): Promise<ClientToken[]> {\n const response = await this.client.get<{ clientTokens: ClientToken[]; total: number }>(\n '/client-tokens'\n )\n return response.clientTokens\n }\n\n /**\n * Get a specific client token by ID\n */\n async get(id: string): Promise<ClientToken> {\n return this.client.get<ClientToken>(`/client-tokens/${id}`)\n }\n\n /**\n * Create a new client token\n *\n * @returns The created token with the plain token value (shown only once)\n */\n async create(data: CreateClientTokenRequest): Promise<CreateClientTokenResponse> {\n return this.client.post<CreateClientTokenResponse>('/client-tokens', data)\n }\n\n /**\n * Update an existing client token\n */\n async update(id: string, data: UpdateClientTokenRequest): Promise<ClientToken> {\n return this.client.put<ClientToken>(`/client-tokens/${id}`, data)\n }\n\n /**\n * Delete a client token\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/client-tokens/${id}`)\n }\n\n /**\n * Regenerate a client token's value\n *\n * @returns The updated token with the new plain token value (shown only once)\n */\n async regenerate(id: string): Promise<CreateClientTokenResponse> {\n return this.client.post<CreateClientTokenResponse>(`/client-tokens/${id}/regenerate`)\n }\n\n /**\n * Get the plain token value for a client token\n *\n * Note: Only works if the token was just created or regenerated in the same session\n */\n async getToken(id: string): Promise<{ token: string }> {\n return this.client.get<{ token: string }>(`/client-tokens/${id}/token`)\n }\n\n /**\n * List conversations for a client token\n */\n async listConversations(\n id: string,\n params?: { limit?: number; offset?: number }\n ): Promise<ListConversationsResponse> {\n return this.client.get<ListConversationsResponse>(`/client-tokens/${id}/conversations`, params)\n }\n}\n\n// =============================================================================\n// Agents Endpoint\n// =============================================================================\n\n/**\n * Agent event types for streaming\n */\n// @snake-case-ok-start: Agent event type identifiers use snake_case to match flow events\nexport type AgentEventType =\n | 'agent_start'\n | 'agent_iteration_start'\n | 'agent_turn_start'\n | 'agent_turn_delta'\n | 'agent_turn_complete'\n | 'agent_tool_start'\n | 'agent_tool_delta'\n | 'agent_tool_complete'\n | 'agent_iteration_complete'\n | 'agent_reflection'\n | 'agent_complete'\n | 'agent_error'\n | 'agent_ping'\n | 'agent_await'\n// @snake-case-ok-end\n\n/**\n * Base agent event with common fields\n */\nexport interface BaseAgentEvent {\n type: AgentEventType\n executionId: string\n seq: number\n}\n\n/**\n * Agent start event\n */\n// @snake-case-ok-start: Agent event type identifiers use snake_case to match flow events\nexport interface AgentStartEvent extends BaseAgentEvent {\n type: 'agent_start'\n agentId: string\n agentName: string\n maxTurns: number\n startedAt: string\n config?: {\n model?: string\n enableReflection?: boolean\n }\n}\n\n/**\n * Agent iteration start event\n */\nexport interface AgentIterationStartEvent extends BaseAgentEvent {\n type: 'agent_iteration_start'\n iteration: number\n maxTurns: number\n totalCost?: number\n startedAt: string\n}\n\n/**\n * Agent turn start event\n */\nexport interface AgentTurnStartEvent extends BaseAgentEvent {\n type: 'agent_turn_start'\n iteration: number\n turnId: string\n turnIndex: number\n role: 'user' | 'assistant' | 'system'\n}\n\n/**\n * Agent turn delta event (streaming content)\n */\nexport interface AgentTurnDeltaEvent extends BaseAgentEvent {\n type: 'agent_turn_delta'\n iteration: number\n turnId: string\n delta: string\n contentType: 'text' | 'thinking' | 'tool_input'\n}\n\n/**\n * Agent turn complete event\n */\nexport interface AgentTurnCompleteEvent extends BaseAgentEvent {\n type: 'agent_turn_complete'\n iteration: number\n turnId: string\n role: 'user' | 'assistant' | 'system'\n completedAt: string\n content?: string\n tokens?: { input: number; output: number }\n cost?: number\n}\n\n/**\n * Agent tool start event\n */\nexport interface AgentToolStartEvent extends BaseAgentEvent {\n type: 'agent_tool_start'\n iteration: number\n toolCallId: string\n toolName: string\n toolType: 'flow' | 'mcp' | 'builtin' | 'custom' | 'external'\n parameters?: Record<string, unknown>\n}\n\n/**\n * Agent tool delta event\n */\nexport interface AgentToolDeltaEvent extends BaseAgentEvent {\n type: 'agent_tool_delta'\n iteration: number\n toolCallId: string\n delta: string\n}\n\n/**\n * Agent tool complete event\n */\nexport interface AgentToolCompleteEvent extends BaseAgentEvent {\n type: 'agent_tool_complete'\n iteration: number\n toolCallId: string\n toolName: string\n success: boolean\n result?: unknown\n executionTime?: number\n}\n\n/**\n * Agent iteration complete event\n */\nexport interface AgentIterationCompleteEvent extends BaseAgentEvent {\n type: 'agent_iteration_complete'\n iteration: number\n completedAt: string\n output?: string\n toolCallsMade: number\n cost?: number\n tokens?: { input: number; output: number }\n duration?: number\n stopConditionMet: boolean\n}\n\n/**\n * Agent reflection event\n */\nexport interface AgentReflectionEvent extends BaseAgentEvent {\n type: 'agent_reflection'\n iteration: number\n reflection?: string\n}\n\n/**\n * Agent complete event\n */\nexport interface AgentCompleteEvent extends BaseAgentEvent {\n type: 'agent_complete'\n agentId: string\n success: boolean\n iterations: number\n stopReason: 'complete' | 'end_turn' | 'max_turns' | 'max_cost' | 'timeout' | 'error'\n completedAt: string\n totalCost?: number\n totalTokens?: { input: number; output: number }\n finalOutput?: string\n duration?: number\n error?: string\n}\n\n/**\n * Agent error event\n */\nexport interface AgentErrorEvent extends BaseAgentEvent {\n type: 'agent_error'\n iteration?: number\n error: {\n code: string\n message: string\n details?: Record<string, unknown>\n }\n recoverable: boolean\n}\n\n/**\n * Agent ping event (keep-alive)\n */\nexport interface AgentPingEvent extends BaseAgentEvent {\n type: 'agent_ping'\n timestamp: string\n}\n\n/**\n * Agent await event (execution awaiting local tool result from client).\n */\nexport interface AgentPausedEvent extends BaseAgentEvent {\n type: 'agent_await'\n executionId: string\n toolId: string\n toolName: string\n parameters?: Record<string, unknown>\n awaitedAt: string\n}\n// @snake-case-ok-end\n\n/**\n * Union of all agent event types\n */\nexport type AgentEvent =\n | AgentStartEvent\n | AgentIterationStartEvent\n | AgentTurnStartEvent\n | AgentTurnDeltaEvent\n | AgentTurnCompleteEvent\n | AgentToolStartEvent\n | AgentToolDeltaEvent\n | AgentToolCompleteEvent\n | AgentIterationCompleteEvent\n | AgentReflectionEvent\n | AgentCompleteEvent\n | AgentErrorEvent\n | AgentPingEvent\n | AgentPausedEvent\n\n/**\n * Parsed SSE event with event type and data\n */\ninterface ParsedSSEEvent {\n eventType: string | null\n data: unknown\n}\n\n/**\n * Callbacks for agent stream events\n */\nexport interface AgentStreamCallbacks {\n onAgentStart?: (event: AgentStartEvent) => void\n onIterationStart?: (event: AgentIterationStartEvent) => void\n onTurnStart?: (event: AgentTurnStartEvent) => void\n onTurnDelta?: (event: AgentTurnDeltaEvent) => void\n onTurnComplete?: (event: AgentTurnCompleteEvent) => void\n onToolStart?: (event: AgentToolStartEvent) => void\n onToolDelta?: (event: AgentToolDeltaEvent) => void\n onToolComplete?: (event: AgentToolCompleteEvent) => void\n onIterationComplete?: (event: AgentIterationCompleteEvent) => void\n onReflection?: (event: AgentReflectionEvent) => void\n onAgentComplete?: (event: AgentCompleteEvent) => void\n onAgentPaused?: (event: AgentPausedEvent) => void\n onError?: (event: AgentErrorEvent) => void\n onPing?: (event: AgentPingEvent) => void\n onUnknownEvent?: (event: ParsedSSEEvent) => void\n}\n\n/**\n * Parse SSE stream chunks into individual events with event type support\n */\nfunction parseSSEChunkWithEventType(\n chunk: string,\n buffer: string\n): { events: ParsedSSEEvent[]; remainingBuffer: string } {\n buffer += chunk\n\n // Split on double newlines to get complete events\n const parts = buffer.split('\\n\\n')\n const remainingBuffer = parts.pop() || ''\n\n const events: ParsedSSEEvent[] = []\n\n for (const part of parts) {\n if (!part.trim()) continue\n\n const lines = part.split('\\n')\n let eventType: string | null = null\n let dataStr: string | null = null\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim()\n } else if (line.startsWith('data: ')) {\n dataStr = line.slice(6).trim()\n }\n }\n\n if (dataStr && dataStr !== '[DONE]') {\n try {\n const data = JSON.parse(dataStr)\n events.push({ eventType, data })\n } catch {\n // Invalid JSON, skip\n }\n }\n }\n\n return { events, remainingBuffer }\n}\n\n/**\n * Dispatch a parsed agent event to the appropriate callback\n */\nfunction dispatchAgentEvent(event: ParsedSSEEvent, callbacks: AgentStreamCallbacks): void {\n const { eventType, data } = event\n const typedData = data as AgentEvent\n\n // If no event type, try to get it from the data\n const type = eventType || typedData?.type\n\n // @snake-case-ok-start: Agent event type identifiers use snake_case to match flow events\n switch (type) {\n case 'agent_start':\n callbacks.onAgentStart?.(typedData as AgentStartEvent)\n break\n case 'agent_iteration_start':\n callbacks.onIterationStart?.(typedData as AgentIterationStartEvent)\n break\n case 'agent_turn_start':\n callbacks.onTurnStart?.(typedData as AgentTurnStartEvent)\n break\n case 'agent_turn_delta':\n callbacks.onTurnDelta?.(typedData as AgentTurnDeltaEvent)\n break\n case 'agent_turn_complete':\n callbacks.onTurnComplete?.(typedData as AgentTurnCompleteEvent)\n break\n case 'agent_tool_start':\n callbacks.onToolStart?.(typedData as AgentToolStartEvent)\n break\n case 'agent_tool_delta':\n callbacks.onToolDelta?.(typedData as AgentToolDeltaEvent)\n break\n case 'agent_tool_complete':\n callbacks.onToolComplete?.(typedData as AgentToolCompleteEvent)\n break\n case 'agent_iteration_complete':\n callbacks.onIterationComplete?.(typedData as AgentIterationCompleteEvent)\n break\n case 'agent_reflection':\n callbacks.onReflection?.(typedData as AgentReflectionEvent)\n break\n case 'agent_complete':\n callbacks.onAgentComplete?.(typedData as AgentCompleteEvent)\n break\n case 'agent_error':\n callbacks.onError?.(typedData as AgentErrorEvent)\n break\n case 'agent_await':\n callbacks.onAgentPaused?.(typedData as AgentPausedEvent)\n break\n case 'agent_ping':\n callbacks.onPing?.(typedData as AgentPingEvent)\n break\n default:\n callbacks.onUnknownEvent?.(event)\n }\n // @snake-case-ok-end\n}\n\n/**\n * Process agent stream with callbacks\n */\nasync function processAgentStream(\n body: ReadableStream<Uint8Array> | null,\n callbacks: AgentStreamCallbacks\n): Promise<void> {\n if (!body) return\n\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n // Process any remaining buffer\n if (buffer.trim()) {\n const { events } = parseSSEChunkWithEventType(buffer + '\\n\\n', '')\n for (const event of events) {\n dispatchAgentEvent(event, callbacks)\n }\n }\n break\n }\n\n const chunk = decoder.decode(value, { stream: true })\n const { events, remainingBuffer } = parseSSEChunkWithEventType(chunk, buffer)\n buffer = remainingBuffer\n\n for (const event of events) {\n dispatchAgentEvent(event, callbacks)\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\n/**\n * Agent message format\n */\nexport interface AgentMessage {\n role: 'system' | 'user' | 'assistant' | 'tool'\n content: string | Array<{ type: string; text?: string; image?: string; data?: string }>\n toolCalls?: Array<{\n toolCallId: string\n toolName: string\n args: Record<string, unknown>\n }>\n toolResults?: Array<{\n toolCallId: string\n toolName: string\n result: unknown\n }>\n}\n\n/**\n * Definition for a local tool that executes on the client side.\n * Pairs the tool schema (sent to the server) with a handler (executed locally).\n */\nexport interface LocalToolDefinition {\n /** Human-readable description of what the tool does */\n description: string\n /** JSON Schema describing the tool's parameters */\n parametersSchema: Record<string, unknown>\n /** Handler that executes locally when the agent invokes this tool */\n execute: (args: Record<string, unknown>) => Promise<unknown>\n}\n\n/**\n * Runtime tool definition shape accepted by agent execution endpoints.\n */\nexport interface AgentRuntimeToolDefinition {\n name: string\n description: string\n toolType: 'flow' | 'custom' | 'external' | 'local'\n parametersSchema: Record<string, unknown>\n config?: Record<string, unknown>\n}\n\n/**\n * Agent execute request\n */\nexport interface AgentExecuteRequest {\n /** Conversation messages */\n messages: AgentMessage[]\n /** Variables to pass to the agent */\n variables?: Record<string, unknown>\n /** Enable streaming response (default: true) */\n streamResponse?: boolean\n /** Enable debug mode to include all fields in events */\n debugMode?: boolean\n /** Model ID to use for this session (overrides agent config) */\n model?: string\n /** Runtime tools to make available during execution */\n tools?: {\n runtimeTools?: AgentRuntimeToolDefinition[]\n }\n}\n\n/**\n * Agent execute response (non-streaming)\n */\nexport interface AgentExecuteResponse {\n success: boolean\n result: string\n iterations: number\n totalCost: number\n stopReason: 'complete' | 'end_turn' | 'max_turns' | 'max_cost' | 'timeout' | 'error'\n reflections?: string[]\n error?: string\n}\n\ninterface LocalToolExecutionLoopSnapshot {\n executionId: string\n pauseCount: number\n discoveryPauseCount: number\n consecutiveDiscoveryPauseCount: number\n toolName: string\n toolNameCount: number\n parameters: Record<string, unknown>\n toolResult: unknown\n accumulatedOutput: string\n actionKey: string\n actionKeyCount: number\n recentActionKeys: string[]\n}\n\ninterface ExecuteWithLocalToolsOptions {\n onLocalToolResult?: (\n snapshot: LocalToolExecutionLoopSnapshot\n ) => AgentCompleteEvent | null | undefined\n}\n\nconst GENERATED_RUNTIME_TOOL_PROPOSAL_SCHEMA: Record<string, unknown> = {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Tool name. Use letters/numbers/underscore only.',\n },\n description: {\n type: 'string',\n description: 'Clear description of what the generated tool does.',\n },\n toolType: {\n type: 'string',\n enum: ['custom'],\n description: 'Must be \"custom\" for generated code execution tools.',\n },\n parametersSchema: {\n type: 'object',\n description: 'JSON schema for tool call arguments.',\n },\n config: {\n type: 'object',\n description: 'Runtime tool config including code, sandboxProvider, language, and timeout.',\n },\n reason: {\n type: 'string',\n description: 'Why this tool is needed.',\n },\n },\n required: ['name', 'description', 'toolType', 'parametersSchema', 'config'],\n}\n\nfunction appendRuntimeToolsToAgentRequest(\n request: AgentExecuteRequest,\n runtimeTools: RuntimeTool[]\n): AgentExecuteRequest {\n const existing = request.tools?.runtimeTools || []\n const existingNames = new Set(existing.map((tool) => tool.name))\n\n const converted: AgentRuntimeToolDefinition[] = runtimeTools\n .filter((tool) => !existingNames.has(tool.name))\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n toolType: tool.toolType,\n parametersSchema: tool.parametersSchema as unknown as Record<string, unknown>,\n ...(tool.config ? { config: tool.config as Record<string, unknown> } : {}),\n }))\n\n return {\n ...request,\n tools: {\n ...request.tools,\n runtimeTools: [...existing, ...converted],\n },\n }\n}\n\n// ─── Long-Task Agent Types ────────────────────────────────────────────\n\n/**\n * Status of a long-task agent run\n */\nexport type RunTaskStatus =\n | 'running'\n | 'complete'\n | 'paused'\n | 'error'\n | 'budget_exceeded'\n | 'max_sessions'\n\n/**\n * A continuation point within a long-task run (for marathon resume).\n */\nexport interface RunTaskContinuation {\n /** ISO timestamp when this continuation started */\n continuedAt: string\n /** Session count at the time of continuation (from-session) */\n fromSession: number\n /** User message provided on resume, if any */\n userMessage?: string\n /** Model used for this continuation segment */\n model?: string\n /** Cost of sessions in this continuation segment */\n segmentCost: number\n}\n\n/**\n * Summary of a single session within a long-task run\n */\nexport interface RunTaskSessionSummary {\n /** 1-based session index */\n index: number\n /** Cost of this individual session (USD) */\n cost: number\n /** Number of loop iterations in this session */\n iterations: number\n /** Why this session stopped */\n stopReason: AgentExecuteResponse['stopReason']\n /** Truncated output from this session */\n outputPreview: string\n /** Compact summary of tool/discovery activity captured during the session */\n toolTraceSummary?: string\n /** Whether repo discovery tools were used during the session */\n discoveryPerformed?: boolean\n /** Whether the session attempted a file write even if it did not complete */\n attemptedWrite?: boolean\n /** Whether the session wrote any files */\n wroteFiles?: boolean\n /** Whether the assistant produced final text output */\n hadTextOutput?: boolean\n /** Whether a verification command was run during the session */\n verificationAttempted?: boolean\n /** Whether the latest verification command passed during the session */\n verificationPassed?: boolean\n /** Best candidate file identified during the session */\n bestCandidatePath?: string\n /** Recent action keys used during the session */\n actionKeys?: string[]\n /** ISO timestamp when this session completed */\n completedAt: string\n}\n\n/**\n * Accumulated state for a long-task agent run.\n * This is both the in-memory state and the record metadata shape.\n */\nexport interface RunTaskState {\n agentId: string\n agentName?: string\n taskName: string\n status: RunTaskStatus\n /** Total sessions completed so far */\n sessionCount: number\n /** Total cost across all sessions (USD) */\n totalCost: number\n /** Last agent output (full text) */\n lastOutput: string\n /** Last terminal error captured from agent execution */\n lastError?: string\n /** Last stop reason */\n lastStopReason: AgentExecuteResponse['stopReason']\n /** Per-session summaries (kept trimmed to last N) */\n sessions: RunTaskSessionSummary[]\n /** ISO timestamp of first session */\n startedAt: string\n /** ISO timestamp of last update */\n updatedAt: string\n /** Original task message (first invocation) */\n originalMessage?: string\n /** Full conversation message history (source of truth for resume) */\n messages?: AgentMessage[]\n /** History of continuation points */\n continuations?: RunTaskContinuation[]\n /** Per-model cost breakdown */\n costByModel?: Record<string, number>\n /** Auto-generated repo bootstrap hints derived from the original task */\n bootstrapContext?: string\n /** Current structured marathon workflow phase (widened to string for custom workflows) */\n workflowPhase?: string\n /** Suggested markdown plan path for the task */\n planPath?: string\n /** Whether the planning artifact has been written */\n planWritten?: boolean\n /** Summary of the most recent automatic phase transition */\n phaseTransitionSummary?: string\n /** Best current file candidate for the task */\n bestCandidatePath?: string\n /** Reason the best candidate was selected */\n bestCandidateReason?: string\n /** Recent candidate file paths discovered across sessions */\n candidatePaths?: string[]\n /** Recent file paths read by the agent */\n recentReadPaths?: string[]\n /** Recent action keys used across sessions for loop detection */\n recentActionKeys?: string[]\n /** Whether the current best candidate still needs a post-write verification read */\n bestCandidateNeedsVerification?: boolean\n /** Whether the current best candidate has been re-read after the latest write */\n bestCandidateVerified?: boolean\n /** Whether completion requires a successful verification command */\n verificationRequired?: boolean\n /** Whether the latest verification command succeeded */\n lastVerificationPassed?: boolean\n /** Whether this task is creating something new rather than modifying existing files */\n isCreationTask?: boolean\n /** Workflow variant string (e.g. 'create', 'modify', or custom) */\n workflowVariant?: string\n /** Arbitrary bag for workflow-specific data */\n workflowState?: Record<string, unknown>\n}\n\nexport type RunTaskResumeState = Pick<\n RunTaskState,\n | 'originalMessage'\n | 'bootstrapContext'\n | 'workflowPhase'\n | 'planPath'\n | 'planWritten'\n | 'bestCandidatePath'\n | 'bestCandidateReason'\n | 'candidatePaths'\n | 'recentReadPaths'\n | 'recentActionKeys'\n | 'bestCandidateNeedsVerification'\n | 'bestCandidateVerified'\n | 'verificationRequired'\n | 'lastVerificationPassed'\n | 'isCreationTask'\n | 'workflowVariant'\n | 'workflowState'\n>\n\n/**\n * Callback invoked after each session completes.\n * Return `false` to stop the loop early.\n */\nexport type RunTaskOnSession = (state: RunTaskState) => void | false | Promise<void | false>\n\n/**\n * Options for `agents.runTask()`\n */\nexport interface RunTaskOptions {\n /** The user message / task instruction for the agent */\n message: string\n /** Maximum number of sessions to run (default: 50) */\n maxSessions?: number\n /** Maximum total cost in USD across all sessions */\n maxCost?: number\n /** Whether to use streaming for each session execution (default: true) */\n stream?: boolean\n /** Enable debug mode on each session */\n debugMode?: boolean\n /** Called after each session. Return false to stop early. */\n onSession?: RunTaskOnSession\n /**\n * Sync progress to a Runtype record after each session.\n * Pass `true` to use the agent name, or a string for a custom task name.\n * The record will have type \"agent-task\" and be upserted by name.\n */\n trackProgress?: boolean | string\n /** Callbacks for streaming events (only used when stream: true) */\n streamCallbacks?: AgentStreamCallbacks\n /**\n * Local tools that execute on the client side.\n * When the agent invokes a tool with `toolType: 'local'`, the SDK will\n * pause, call the matching handler, and resume the agent with the result.\n * Requires `stream: true` (default).\n */\n localTools?: Record<string, LocalToolDefinition>\n /** Model ID to use (overrides agent's configured model) */\n model?: string\n /** Previous messages from a prior run (for continuation/resume) */\n previousMessages?: AgentMessage[]\n /** New user message for continuation (appended after previous context) */\n continuationMessage?: string\n /** Use compact summary instead of full message history for continuation */\n compact?: boolean\n /** Saved workflow state to seed a resumed or restarted marathon run */\n resumeState?: RunTaskResumeState\n /** How tool results are stored in message history for continuation.\n * 'hot-tail' (default): recent results inline, older offloaded to disk.\n * 'observation-mask': recent results inline, older replaced with placeholder.\n * 'full-inline': all results stay inline. */\n toolContextMode?: 'hot-tail' | 'observation-mask' | 'full-inline'\n /** Which tool results stay \"hot\" (inline).\n * 'session' (default): current session's results are hot, previous sessions' are cold.\n * number (e.g. 10): last N tool result messages are hot, regardless of session. */\n toolWindow?: 'session' | number\n /** Custom workflow definition (defaults to the built-in research→planning→execution workflow) */\n workflow?: WorkflowDefinition\n}\n\ninterface RunTaskToolTrace {\n entries: string[]\n discoveryPerformed: boolean\n attemptedWrite: boolean\n wroteFiles: boolean\n executionFileWritten: boolean\n readFiles: boolean\n readPaths: string[]\n actionKeys: string[]\n candidatePaths: string[]\n planWritten: boolean\n bestCandidateReadFailed: boolean\n bestCandidateWritten: boolean\n bestCandidateVerified: boolean\n verificationAttempted: boolean\n verificationPassed: boolean\n localToolLoopGuardTriggered: boolean\n forcedTurnEndReason?: string\n bestCandidatePath?: string\n bestCandidateReason?: string\n}\n\n/**\n * Final result returned by `agents.runTask()`\n */\nexport interface RunTaskResult {\n status: RunTaskStatus\n sessionCount: number\n totalCost: number\n lastOutput: string\n sessions: RunTaskSessionSummary[]\n /** The record ID if trackProgress was enabled */\n recordId?: string\n}\n\n/**\n * Agent data\n */\nexport interface Agent {\n id: string\n name: string\n description: string | null\n agentType: string\n primaryFlowId: string | null\n config: Record<string, unknown> | null\n externalConfig: Record<string, unknown> | null\n createdAt: string\n updatedAt: string\n}\n\n/**\n * Agents endpoint handlers\n */\nexport class AgentsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all agents for the authenticated user\n */\n async list(params?: ListParams): Promise<PaginationResponse<Agent>> {\n return this.client.get<PaginationResponse<Agent>>('/agents', params)\n }\n\n /**\n * Get a specific agent by ID\n */\n async get(id: string): Promise<Agent> {\n return this.client.get<Agent>(`/agents/${id}`)\n }\n\n /**\n * Create a new agent\n */\n async create(data: Partial<Agent>): Promise<Agent> {\n return this.client.post<Agent>('/agents', data)\n }\n\n /**\n * Update an existing agent\n */\n async update(id: string, data: Partial<Agent>): Promise<Agent> {\n return this.client.put<Agent>(`/agents/${id}`, data)\n }\n\n /**\n * Delete an agent\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/agents/${id}`)\n }\n\n /**\n * Evaluate a model-proposed runtime tool against a configurable allowlist policy.\n * Useful for local `propose_runtime_tool` handlers before follow-up execution.\n */\n gateGeneratedRuntimeToolProposal(\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): GeneratedRuntimeToolGateDecision {\n return evaluateGeneratedRuntimeToolProposal(proposal, options)\n }\n\n /**\n * Build standardized local-tool output for a generated tool proposal.\n * Returns `{ approved, reason, violations, tool? }`.\n */\n buildGeneratedRuntimeToolGateOutput(\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): {\n approved: boolean\n reason: string\n violations: string[]\n tool?: RuntimeTool\n } {\n return buildGeneratedRuntimeToolGateOutput(proposal, options)\n }\n\n /**\n * Create a local tool definition that validates model-proposed runtime tools.\n * Plug this into `executeWithLocalTools()` under a name like `propose_runtime_tool`.\n */\n createGeneratedRuntimeToolGateLocalTool(\n options?: GeneratedRuntimeToolGateOptions & { description?: string }\n ): LocalToolDefinition {\n const { description, ...gateOptions } = options || {}\n return {\n description:\n description ||\n 'Validate a generated runtime custom tool and return { approved, reason, violations, tool? }',\n parametersSchema: GENERATED_RUNTIME_TOOL_PROPOSAL_SCHEMA,\n execute: async (args) => buildGeneratedRuntimeToolGateOutput(args, gateOptions),\n }\n }\n\n /**\n * Attach approved runtime tools to an agent execute request.\n * Returns a new request object and does not mutate the original.\n */\n attachApprovedRuntimeTools(\n request: AgentExecuteRequest,\n runtimeTools: RuntimeTool[]\n ): AgentExecuteRequest {\n return appendRuntimeToolsToAgentRequest(request, runtimeTools)\n }\n\n /**\n * Validate a generated runtime tool proposal and append it to an agent execute\n * request if approved, in one call.\n */\n applyGeneratedRuntimeToolProposal(\n request: AgentExecuteRequest,\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): { decision: GeneratedRuntimeToolGateDecision; request: AgentExecuteRequest } {\n const decision = evaluateGeneratedRuntimeToolProposal(proposal, options)\n if (!decision.approved || !decision.tool) {\n return { decision, request }\n }\n return {\n decision,\n request: appendRuntimeToolsToAgentRequest(request, [decision.tool]),\n }\n }\n\n /**\n * Execute an agent (non-streaming)\n */\n async execute(id: string, data: AgentExecuteRequest): Promise<AgentExecuteResponse> {\n return this.client.post<AgentExecuteResponse>(`/agents/${id}/execute`, {\n ...data,\n streamResponse: false,\n })\n }\n\n /**\n * Execute an agent with streaming response\n *\n * Returns a Response object with SSE stream.\n * Use `executeWithCallbacks` for easier handling.\n *\n * @example\n * ```typescript\n * const response = await client.agents.executeStream('agt_123', {\n * messages: [{ role: 'user', content: 'Write me a poem' }],\n * debugMode: true,\n * })\n *\n * // Process the stream manually\n * const reader = response.body?.getReader()\n * // ...\n * ```\n */\n async executeStream(id: string, data: AgentExecuteRequest): Promise<Response> {\n return this.client.requestStream(`/agents/${id}/execute`, {\n method: 'POST',\n body: JSON.stringify({\n ...data,\n streamResponse: true,\n }),\n })\n }\n\n /**\n * Execute an agent with streaming and callbacks\n *\n * Processes the SSE stream and calls the appropriate callbacks for each event type.\n * This is the recommended way to handle agent streaming.\n *\n * @example\n * ```typescript\n * let content = ''\n *\n * const result = await client.agents.executeWithCallbacks('agt_123', {\n * messages: [{ role: 'user', content: 'Write me a poem' }],\n * debugMode: true,\n * }, {\n * onTurnDelta: (event) => {\n * content += event.delta\n * process.stdout.write(event.delta)\n * },\n * onIterationComplete: (event) => {\n * console.log(`\\nIteration ${event.iteration} complete`)\n * },\n * onAgentComplete: (event) => {\n * console.log(`\\nAgent finished: ${event.stopReason}`)\n * },\n * onError: (event) => {\n * console.error(`Error: ${event.error.message}`)\n * },\n * })\n *\n * console.log('Final result:', result)\n * ```\n */\n async executeWithCallbacks(\n id: string,\n data: AgentExecuteRequest,\n callbacks: AgentStreamCallbacks\n ): Promise<AgentCompleteEvent | null> {\n const response = await this.executeStream(id, data)\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error((error as { error?: string }).error || `HTTP ${response.status}`)\n }\n\n let completeEvent: AgentCompleteEvent | null = null\n // Accumulate turn delta text so finalOutput is non-empty even when the\n // agent_complete event carries no output (e.g. model ended after tool calls)\n let accumulatedOutput = ''\n\n await processAgentStream(response.body, {\n ...callbacks,\n onTurnDelta: (event) => {\n if (event.contentType === 'text') {\n accumulatedOutput += event.delta\n }\n callbacks.onTurnDelta?.(event)\n },\n onAgentComplete: (event) => {\n if (!event.finalOutput && accumulatedOutput) {\n event.finalOutput = accumulatedOutput\n }\n completeEvent = event\n callbacks.onAgentComplete?.(event)\n },\n })\n\n return completeEvent\n }\n\n /**\n * Execute an agent with local tool support (pause/resume loop)\n *\n * When the agent hits a tool with `toolType: 'local'`, the server emits\n * `agent_await`. This method automatically executes the local tool and\n * resumes execution, repeating until the agent completes.\n *\n * @example\n * ```typescript\n * const result = await client.agents.executeWithLocalTools('agt_123', {\n * messages: [{ role: 'user', content: 'Create a file called hello.txt' }],\n * }, {\n * write_file: async ({ path, content }) => {\n * fs.writeFileSync(path, content)\n * return 'ok'\n * },\n * })\n * ```\n */\n async executeWithLocalTools(\n id: string,\n data: AgentExecuteRequest,\n localTools: Record<string, LocalToolDefinition>,\n callbacks?: AgentStreamCallbacks,\n options?: ExecuteWithLocalToolsOptions,\n taskName?: string,\n ): Promise<{ completeEvent: AgentCompleteEvent; toolMessages: AgentMessage[] } | null> {\n // Build runtime tool definitions from local tool schemas and inject into request\n const runtimeTools: AgentRuntimeToolDefinition[] = Object.entries(localTools).map(\n ([name, def]) => ({\n name,\n description: def.description,\n toolType: 'local',\n parametersSchema: def.parametersSchema,\n })\n )\n\n const requestData: AgentExecuteRequest = {\n ...data,\n tools: {\n ...data.tools,\n runtimeTools: [...(data.tools?.runtimeTools || []), ...runtimeTools],\n },\n }\n\n const response = await this.executeStream(id, requestData)\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error((error as { error?: string }).error || `HTTP ${response.status}`)\n }\n\n let currentBody: ReadableStream<Uint8Array> | null = response.body\n // Accumulate text output across all streams (initial + resume cycles)\n // so finalOutput is non-empty even when the last resume stream has no text\n let accumulatedOutput = ''\n let pauseCount = 0\n let discoveryPauseCount = 0\n let consecutiveDiscoveryPauseCount = 0\n const toolNameCounts: Record<string, number> = {}\n let recentActionKeys: string[] = []\n const toolMessages: AgentMessage[] = []\n\n while (true) {\n let pausedEvent: AgentPausedEvent | null = null\n let completeEvent: AgentCompleteEvent | null = null\n\n await processAgentStream(currentBody, {\n ...callbacks,\n onTurnDelta: (event) => {\n if (event.contentType === 'text') {\n accumulatedOutput += event.delta\n }\n callbacks?.onTurnDelta?.(event)\n },\n onAgentPaused: (event) => {\n pausedEvent = event\n callbacks?.onAgentPaused?.(event)\n },\n onAgentComplete: (event) => {\n // Supplement finalOutput with accumulated turn deltas when the\n // agent_complete event itself carries no output (common when the\n // model's last action was a tool call rather than text output)\n if (!event.finalOutput && accumulatedOutput) {\n event.finalOutput = accumulatedOutput\n }\n completeEvent = event\n callbacks?.onAgentComplete?.(event)\n },\n })\n\n if (completeEvent) return { completeEvent, toolMessages }\n\n if (pausedEvent) {\n const { toolName, toolId, parameters, executionId } = pausedEvent\n const toolDef = localTools[toolName]\n if (!toolDef) {\n throw new Error(`Local tool \"${toolName}\" required but not provided`)\n }\n // Recursively unwrap stringified parameters — the server pipeline may\n // double-serialize: object → JSON string → JSON string\n let parsedParams: Record<string, unknown> = {}\n let current: unknown = parameters\n for (let i = 0; i < 3; i++) {\n if (typeof current === 'string') {\n try {\n current = JSON.parse(current)\n } catch {\n console.warn(\n `[local-tools] Failed to parse parameters (attempt ${i + 1}):`,\n typeof current,\n String(current).slice(0, 200)\n )\n break\n }\n } else {\n break\n }\n }\n if (current && typeof current === 'object' && !Array.isArray(current)) {\n parsedParams = current as Record<string, unknown>\n } else {\n console.warn(\n '[local-tools] Parameters could not be resolved to an object:',\n typeof current,\n String(current).slice(0, 200)\n )\n }\n let toolResult: unknown\n try {\n toolResult = await toolDef.execute(parsedParams)\n } catch (err) {\n // Return the error as a tool result so the agent can recover\n toolResult = `Error: ${err instanceof Error ? err.message : String(err)}`\n }\n\n // Capture structured tool interaction for message history\n toolMessages.push({\n role: 'assistant',\n content: '',\n toolCalls: [{\n toolCallId: toolId,\n toolName,\n args: parsedParams,\n }],\n })\n toolMessages.push({\n role: 'tool',\n content: '',\n toolResults: [{\n toolCallId: toolId,\n toolName,\n result: toolResult,\n }],\n })\n\n pauseCount += 1\n const toolNameCount = (toolNameCounts[toolName] || 0) + 1\n toolNameCounts[toolName] = toolNameCount\n const discoveryTool = this.isDiscoveryLocalTool(toolName)\n if (discoveryTool) {\n discoveryPauseCount += 1\n consecutiveDiscoveryPauseCount += 1\n } else {\n consecutiveDiscoveryPauseCount = 0\n }\n const actionKey = this.buildLocalToolActionKey(toolName, parsedParams)\n recentActionKeys = [...recentActionKeys, actionKey].slice(-12)\n const actionKeyCount = recentActionKeys.filter(\n (candidateActionKey) => candidateActionKey === actionKey\n ).length\n\n const forcedCompleteEvent = options?.onLocalToolResult?.({\n executionId,\n pauseCount,\n discoveryPauseCount,\n consecutiveDiscoveryPauseCount,\n toolName,\n toolNameCount,\n parameters: parsedParams,\n toolResult,\n accumulatedOutput,\n actionKey,\n actionKeyCount,\n recentActionKeys,\n })\n\n if (forcedCompleteEvent) {\n if (!forcedCompleteEvent.finalOutput && accumulatedOutput) {\n forcedCompleteEvent.finalOutput = accumulatedOutput\n }\n callbacks?.onAgentComplete?.(forcedCompleteEvent)\n return { completeEvent: forcedCompleteEvent, toolMessages }\n }\n\n // Resume via agent resume endpoint\n const resumeResponse = await this.client.requestStream(`/agents/${id}/resume`, {\n method: 'POST',\n body: JSON.stringify({\n executionId,\n toolOutputs: { [toolName]: toolResult },\n streamResponse: true,\n debugMode: data.debugMode,\n }),\n })\n\n if (!resumeResponse.ok) {\n const error = await resumeResponse.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error((error as { error?: string }).error || `HTTP ${resumeResponse.status}`)\n }\n\n currentBody = resumeResponse.body\n continue\n }\n\n // Stream ended without complete or paused\n return null\n }\n }\n\n // ─── Long-Task Agent Execution ───────────────────────────────────────\n\n private createEmptyToolTrace(): RunTaskToolTrace {\n return {\n entries: [],\n discoveryPerformed: false,\n attemptedWrite: false,\n wroteFiles: false,\n executionFileWritten: false,\n readFiles: false,\n readPaths: [],\n actionKeys: [],\n candidatePaths: [],\n planWritten: false,\n bestCandidateReadFailed: false,\n bestCandidateWritten: false,\n bestCandidateVerified: false,\n verificationAttempted: false,\n verificationPassed: false,\n localToolLoopGuardTriggered: false,\n }\n }\n\n private isDiscoveryLocalTool(toolName: string): boolean {\n return ['tree_directory', 'search_repo', 'glob_files', 'list_directory', 'read_file'].includes(\n toolName\n )\n }\n\n private buildLocalToolActionKey(toolName: string, parameters: Record<string, unknown>): string {\n const pathValue =\n typeof parameters.path === 'string' ? this.normalizeCandidatePath(parameters.path) : ''\n const queryValue =\n typeof parameters.query === 'string'\n ? parameters.query.trim()\n : typeof parameters.q === 'string'\n ? parameters.q.trim()\n : ''\n const patternValue =\n typeof parameters.pattern === 'string' ? parameters.pattern.trim() : ''\n const commandValue =\n typeof parameters.command === 'string' ? parameters.command.trim() : ''\n const descriptor = pathValue || queryValue || patternValue || commandValue\n\n if (descriptor) {\n return `${toolName}:${descriptor.slice(0, 160)}`\n }\n\n const fallback = this.summarizeUnknownForTrace(parameters, 160)\n return fallback ? `${toolName}:${fallback}` : toolName\n }\n\n private buildProspectiveStateForSessionTrace(\n state: RunTaskState,\n trace: Pick<\n RunTaskToolTrace,\n 'bestCandidatePath' | 'bestCandidateReason' | 'candidatePaths' | 'readPaths' | 'planWritten'\n >\n ): RunTaskState {\n const candidatePaths = Array.from(\n new Set([...(state.candidatePaths || []), ...trace.candidatePaths])\n ).slice(-20)\n const recentReadPaths = Array.from(\n new Set([...(state.recentReadPaths || []), ...trace.readPaths])\n ).slice(-20)\n\n return {\n ...state,\n ...(trace.bestCandidatePath\n ? {\n bestCandidatePath: trace.bestCandidatePath,\n bestCandidateReason: trace.bestCandidateReason,\n }\n : {}),\n candidatePaths,\n recentReadPaths,\n planWritten: state.planWritten || trace.planWritten,\n }\n }\n\n private buildForcedLocalToolTurnCompleteEvent(\n state: Pick<RunTaskState, 'agentId' | 'workflowPhase'>,\n snapshot: LocalToolExecutionLoopSnapshot,\n reason: string\n ): AgentCompleteEvent {\n const finalOutput = [\n snapshot.accumulatedOutput.trim(),\n `Local tool loop guard ended this ${state.workflowPhase || 'research'} turn: ${reason}`,\n snapshot.recentActionKeys.length > 0\n ? `Recent local tool actions: ${snapshot.recentActionKeys.slice(-5).join(' | ')}`\n : '',\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n return {\n type: 'agent_complete',\n executionId: snapshot.executionId,\n seq: 0,\n agentId: state.agentId,\n success: true,\n iterations: 1,\n stopReason: 'end_turn',\n completedAt: new Date().toISOString(),\n totalCost: 0,\n finalOutput,\n duration: 0,\n }\n }\n\n private createLocalToolLoopGuard(\n state: RunTaskState,\n trace: RunTaskToolTrace,\n workflow: WorkflowDefinition\n ): ExecuteWithLocalToolsOptions['onLocalToolResult'] {\n return (snapshot) => {\n const prospectiveState = this.buildProspectiveStateForSessionTrace(state, trace)\n\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n\n let reason: string | undefined\n if (currentPhase?.shouldForceEndTurn) {\n const ctx: WorkflowContext = {\n state: prospectiveState,\n trace,\n normalizePath: this.normalizeCandidatePath.bind(this),\n isArtifactPath: this.isMarathonArtifactPath.bind(this),\n isDiscoveryTool: this.isDiscoveryToolName.bind(this),\n }\n reason = currentPhase.shouldForceEndTurn(snapshot, ctx)\n }\n\n if (!reason) {\n return undefined\n }\n\n trace.localToolLoopGuardTriggered = true\n trace.forcedTurnEndReason = reason\n this.pushToolTraceEntry(trace, `local-tool loop guard forced end_turn -> ${reason}`)\n\n return this.buildForcedLocalToolTurnCompleteEvent(state, snapshot, reason)\n }\n }\n\n private pushToolTraceEntry(trace: RunTaskToolTrace, entry: string): void {\n const trimmed = entry.trim()\n if (!trimmed) return\n if (trace.entries[trace.entries.length - 1] === trimmed) return\n trace.entries.push(trimmed)\n if (trace.entries.length > 12) {\n trace.entries = trace.entries.slice(-12)\n }\n }\n\n private isPreservationSensitiveTask(\n state: Pick<RunTaskState, 'originalMessage' | 'bestCandidatePath'>\n ): boolean {\n const bestCandidatePath = state.bestCandidatePath || ''\n if (/\\.(html|tsx|jsx|css|scss|sass)$/i.test(bestCandidatePath)) {\n return true\n }\n\n const prompt = (state.originalMessage || '').toLowerCase()\n return [\n 'ux',\n 'ui',\n 'design',\n 'frontend',\n 'front-end',\n 'theme',\n 'editor',\n 'layout',\n 'style',\n 'accessibility',\n 'visual',\n ].some((keyword) => prompt.includes(keyword))\n }\n\n private isCreationTask(message: string): boolean {\n const lower = message.toLowerCase()\n const creationPatterns = [\n /^create\\b/, /^build\\b/, /^make\\b/, /^generate\\b/, /^scaffold\\b/,\n /^set up\\b/, /^setup\\b/, /^bootstrap\\b/, /^initialize\\b/, /^init\\b/,\n /^write a\\b/, /^write an\\b/, /^implement a\\b/, /^implement an\\b/,\n /^start a\\b/, /^start an\\b/, /^new\\b/,\n ]\n const hasCreationStart = creationPatterns.some((p) => p.test(lower))\n\n const modificationVerbs = [\n 'fix', 'update', 'change', 'modify', 'edit', 'refactor',\n 'improve', 'add to', 'remove', 'delete', 'rename', 'migrate',\n ]\n const hasModificationVerb = modificationVerbs.some(\n (v) => lower.startsWith(v) || new RegExp(`\\\\b${v}\\\\b`).test(lower)\n )\n\n return hasCreationStart && !hasModificationVerb\n }\n\n private getLikelySupportingCandidatePaths(\n bestCandidatePath: string | undefined,\n candidatePaths: string[] | undefined\n ): string[] {\n if (!bestCandidatePath || !candidatePaths || candidatePaths.length === 0) return []\n\n const normalizedBestCandidatePath = this.normalizeCandidatePath(bestCandidatePath)\n const bestCandidateSegments = normalizedBestCandidatePath.split('/').filter(Boolean)\n const relatedRoot =\n bestCandidateSegments.length >= 2\n ? `${bestCandidateSegments[0]}/${bestCandidateSegments[1]}/`\n : bestCandidateSegments.length === 1\n ? `${bestCandidateSegments[0]}/`\n : ''\n const bestCandidateDir = normalizedBestCandidatePath.includes('/')\n ? `${normalizedBestCandidatePath.slice(0, normalizedBestCandidatePath.lastIndexOf('/'))}/`\n : ''\n\n return candidatePaths\n .map((candidatePath) => this.normalizeCandidatePath(candidatePath))\n .filter(\n (candidatePath) =>\n candidatePath &&\n candidatePath !== normalizedBestCandidatePath &&\n !this.isMarathonArtifactPath(candidatePath) &&\n ((bestCandidateDir && candidatePath.startsWith(bestCandidateDir)) ||\n (relatedRoot && candidatePath.startsWith(relatedRoot)))\n )\n }\n\n private hasSufficientResearchEvidence(state: RunTaskState): boolean {\n if (state.isCreationTask) {\n return (state.recentReadPaths?.length || 0) >= 1\n }\n\n if (!state.bestCandidatePath) return false\n\n const normalizedBestCandidatePath = this.normalizeCandidatePath(state.bestCandidatePath)\n const normalizedRecentReadPaths = (state.recentReadPaths || []).map((readPath) =>\n this.normalizeCandidatePath(readPath)\n )\n const readBestCandidate = normalizedRecentReadPaths.includes(normalizedBestCandidatePath)\n\n if (!readBestCandidate) {\n return false\n }\n\n if (!this.isPreservationSensitiveTask(state)) {\n return true\n }\n\n const supportingCandidatePaths = this.getLikelySupportingCandidatePaths(\n state.bestCandidatePath,\n state.candidatePaths\n )\n if (supportingCandidatePaths.length === 0) {\n return true\n }\n\n return normalizedRecentReadPaths.some(\n (readPath) =>\n readPath !== normalizedBestCandidatePath && supportingCandidatePaths.includes(readPath)\n )\n }\n\n private buildEffectiveSessionOutput(modelOutput: string, toolTraceSummary: string): string {\n return [toolTraceSummary.trim(), modelOutput.trim()].filter(Boolean).join('\\n\\n')\n }\n\n private canAcceptTaskCompletion(\n output: string,\n state: Pick<\n RunTaskState,\n | 'workflowPhase'\n | 'planWritten'\n | 'bestCandidatePath'\n | 'bestCandidateVerified'\n | 'verificationRequired'\n | 'lastVerificationPassed'\n >,\n sessionTrace: Pick<RunTaskToolTrace, 'bestCandidateVerified' | 'verificationPassed'>,\n workflow: WorkflowDefinition\n ): boolean {\n if (!this.detectTaskCompletion(output)) {\n return false\n }\n\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n if (currentPhase?.canAcceptCompletion) {\n return currentPhase.canAcceptCompletion(state as RunTaskState, sessionTrace as RunTaskToolTrace)\n }\n\n // For phases without canAcceptCompletion (e.g. research, planning), always accept\n return true\n }\n\n private summarizeUnknownForTrace(value: unknown, maxLength: number = 180): string {\n const text =\n typeof value === 'string'\n ? value\n : value === undefined\n ? ''\n : JSON.stringify(value)\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLength)\n }\n\n private summarizeTextBlockForTrace(value: unknown, maxLines: number = 4): string {\n const text =\n typeof value === 'string'\n ? value\n : value === undefined\n ? ''\n : JSON.stringify(value)\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .slice(0, maxLines)\n .join(' | ')\n .slice(0, 240)\n }\n\n private parseVerificationResult(\n result: unknown\n ): { success: boolean; command?: string; output?: string; error?: string } | undefined {\n if (typeof result !== 'string') return undefined\n\n try {\n const parsed = JSON.parse(result) as {\n success?: unknown\n command?: unknown\n output?: unknown\n error?: unknown\n }\n if (typeof parsed.success !== 'boolean') return undefined\n return {\n success: parsed.success,\n ...(typeof parsed.command === 'string' ? { command: parsed.command } : {}),\n ...(typeof parsed.output === 'string' ? { output: parsed.output } : {}),\n ...(typeof parsed.error === 'string' ? { error: parsed.error } : {}),\n }\n } catch {\n return undefined\n }\n }\n\n private normalizeCandidatePath(candidatePath: string): string {\n return candidatePath.trim().replace(/\\\\/g, '/').replace(/^\\.?\\//, '').replace(/\\/+/g, '/')\n }\n\n private dedupeNormalizedCandidatePaths(paths: string[] | undefined): string[] {\n return Array.from(\n new Set(\n (paths || [])\n .map((candidatePath) => this.normalizeCandidatePath(candidatePath))\n .filter((candidatePath): candidatePath is string => {\n if (!candidatePath) return false\n return !this.isMarathonArtifactPath(candidatePath)\n })\n )\n )\n }\n\n /**\n * Compact old tool results based on context mode and window setting.\n * Modifies messages in-place.\n */\n private compactToolResults(\n messages: AgentMessage[],\n newToolMessages: AgentMessage[],\n taskName: string,\n mode: 'hot-tail' | 'observation-mask' | 'full-inline',\n window: 'session' | number,\n ): void {\n if (mode === 'full-inline') return\n\n if (window === 'session') {\n // Session boundary: compact ALL existing tool results (new ones will be appended after)\n for (const msg of messages) {\n if (msg.role === 'tool' && msg.toolResults) {\n msg.toolResults = msg.toolResults.map(tr => this.compactOneResult(tr, taskName, mode))\n }\n }\n } else {\n // Numeric window: keep the last N tool results inline across all messages\n const newToolResultCount = newToolMessages.filter(m => m.role === 'tool').length\n const keepInlineFromExisting = Math.max(0, window - newToolResultCount)\n\n const toolResultIndices: number[] = []\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === 'tool' && messages[i].toolResults) {\n toolResultIndices.push(i)\n }\n }\n\n const compactUpTo = toolResultIndices.length - keepInlineFromExisting\n for (let j = 0; j < compactUpTo && j < toolResultIndices.length; j++) {\n const msg = messages[toolResultIndices[j]]\n msg.toolResults = msg.toolResults!.map(tr => this.compactOneResult(tr, taskName, mode))\n }\n }\n }\n\n private compactOneResult(\n tr: { toolCallId: string; toolName: string; result: unknown },\n taskName: string,\n mode: 'hot-tail' | 'observation-mask'\n ): typeof tr {\n // Skip already-compacted\n if (typeof tr.result === 'string' && tr.result.startsWith('[')) return tr\n if (mode === 'hot-tail') {\n return { ...tr, result: this.offloadToolResult(taskName, tr.toolCallId, tr.toolName, tr.result) }\n }\n return { ...tr, result: `[Output from ${tr.toolName} masked — re-run the tool if needed]` }\n }\n\n private isMarathonArtifactPath(candidatePath: string): boolean {\n const normalized = this.normalizeCandidatePath(candidatePath).toLowerCase()\n return normalized === '.runtype' || normalized.startsWith('.runtype/')\n }\n\n private isDiscoveryToolName(toolName: string): boolean {\n return (\n toolName === 'search_repo' ||\n toolName === 'glob_files' ||\n toolName === 'tree_directory' ||\n toolName === 'list_directory'\n )\n }\n\n private sanitizeTaskSlug(taskName: string): string {\n return taskName\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80)\n }\n\n private readonly TOOL_OUTPUT_INLINE_THRESHOLD = 500 // chars\n\n private offloadToolResult(\n taskName: string,\n toolCallId: string,\n toolName: string,\n result: unknown\n ): string | unknown {\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2)\n if (resultStr.length <= this.TOOL_OUTPUT_INLINE_THRESHOLD) return result\n\n type FsLike = { mkdirSync: (path: string, opts?: { recursive?: boolean }) => void; writeFileSync: (path: string, data: string, encoding: string) => void }\n let fs: FsLike\n try {\n // Dynamic require for Node.js — this SDK may run in browsers where fs is unavailable.\n // Use indirect eval to avoid TS errors since this package has no @types/node.\n const dynamicRequire = (0, eval)('typeof require !== \"undefined\" ? require : undefined') as\n | ((id: string) => unknown)\n | undefined\n if (!dynamicRequire) return result\n fs = dynamicRequire('fs') as FsLike\n } catch {\n // Not in a Node.js environment — fall back to keeping result inline\n return result\n }\n const slug = this.sanitizeTaskSlug(taskName || 'task')\n const dir = `.runtype/marathons/${slug}/tool-outputs`\n fs.mkdirSync(dir, { recursive: true })\n const filePath = `${dir}/${toolCallId}.txt`\n fs.writeFileSync(filePath, resultStr, 'utf-8')\n return `[${toolName} output (${resultStr.length} chars) saved to ${filePath} — use read_file to retrieve if needed]`\n }\n\n private getDefaultPlanPath(taskName: string): string {\n const slug = this.sanitizeTaskSlug(taskName || 'task')\n return `.runtype/marathons/${slug}/plan.md`\n }\n\n private dirnameOfCandidatePath(candidatePath: string): string {\n const normalized = this.normalizeCandidatePath(candidatePath)\n const index = normalized.lastIndexOf('/')\n return index >= 0 ? normalized.slice(0, index) : ''\n }\n\n private joinCandidatePath(baseDir: string, nextPath: string): string {\n const normalizedNext = nextPath.replace(/\\\\/g, '/').trim()\n if (!normalizedNext) return ''\n\n if (normalizedNext.startsWith('/')) {\n return this.normalizeCandidatePath(`${baseDir}/${normalizedNext.slice(1)}`)\n }\n\n if (normalizedNext.startsWith('./')) {\n return this.normalizeCandidatePath(`${baseDir}/${normalizedNext.slice(2)}`)\n }\n\n return this.normalizeCandidatePath(baseDir ? `${baseDir}/${normalizedNext}` : normalizedNext)\n }\n\n private scoreCandidatePath(candidatePath: string): number {\n const normalized = this.normalizeCandidatePath(candidatePath).toLowerCase()\n let score = 0\n if (normalized.endsWith('/theme.html') || normalized.endsWith('theme.html')) score += 80\n if (normalized.includes('agent')) score += 30\n if (normalized.includes('editor')) score += 30\n if (normalized.includes('theme')) score += 25\n if (normalized.endsWith('.html')) score += 20\n if (normalized.includes('/src/')) score += 10\n if (normalized.includes('/app/')) score += 10\n if (normalized.includes('index.html')) score -= 10\n return score\n }\n\n private addCandidateToTrace(\n trace: RunTaskToolTrace,\n candidatePath: string,\n reason: string\n ): void {\n const normalized = this.normalizeCandidatePath(candidatePath)\n if (!normalized || normalized.length < 3) return\n if (this.isMarathonArtifactPath(normalized)) return\n\n if (!trace.candidatePaths.includes(normalized)) {\n trace.candidatePaths.push(normalized)\n if (trace.candidatePaths.length > 12) {\n trace.candidatePaths = trace.candidatePaths.slice(-12)\n }\n }\n\n const currentScore = trace.bestCandidatePath ? this.scoreCandidatePath(trace.bestCandidatePath) : -1\n const nextScore = this.scoreCandidatePath(normalized)\n if (!trace.bestCandidatePath || nextScore >= currentScore) {\n trace.bestCandidatePath = normalized\n trace.bestCandidateReason = reason.slice(0, 200)\n }\n }\n\n private extractCandidatePathsFromText(text: string, sourcePath?: string): Array<{ path: string; reason: string }> {\n const candidates: Array<{ path: string; reason: string }> = []\n if (sourcePath && this.isMarathonArtifactPath(sourcePath)) {\n return candidates\n }\n\n const add = (candidatePath: string, reason: string) => {\n const normalized = this.normalizeCandidatePath(candidatePath)\n if (!normalized) return\n if (this.isMarathonArtifactPath(normalized)) return\n if (!candidates.some((candidate) => candidate.path === normalized)) {\n candidates.push({ path: normalized, reason })\n }\n }\n\n const baseDir = sourcePath ? this.dirnameOfCandidatePath(sourcePath) : ''\n\n for (const match of text.matchAll(/(?:href|src)=[\"']([^\"']+\\.(?:html|tsx|ts|jsx|js|md|json))[\"']/gi)) {\n const target = match[1] || ''\n const resolved = baseDir ? this.joinCandidatePath(baseDir, target) : target\n add(resolved, `linked from ${sourcePath || 'discovery result'} via ${target}`)\n }\n\n for (const match of text.matchAll(/\\b([\\w./-]+\\.(?:html|tsx|ts|jsx|js|md|json))\\b/g)) {\n const target = match[1] || ''\n const resolved =\n sourcePath && !target.includes('/') ? this.joinCandidatePath(baseDir, target) : this.normalizeCandidatePath(target)\n add(resolved, `mentioned in ${sourcePath || 'discovery result'}`)\n }\n\n return candidates\n }\n\n private parseSearchRepoResultForCandidates(result: string): Array<{ path: string; reason: string }> {\n const candidates: Array<{ path: string; reason: string }> = []\n for (const line of result.split('\\n')) {\n const contentMatch = line.match(/^\\[content\\]\\s+([^:]+):\\d+:\\s+(.*)$/)\n if (contentMatch) {\n const sourcePath = this.normalizeCandidatePath(contentMatch[1] || '')\n const content = contentMatch[2] || ''\n for (const candidate of this.extractCandidatePathsFromText(content, sourcePath)) {\n if (!candidates.some((existing) => existing.path === candidate.path)) {\n candidates.push(candidate)\n }\n }\n continue\n }\n\n const pathMatch = line.match(/^\\[path\\]\\s+(.+)$/)\n if (pathMatch) {\n const sourcePath = this.normalizeCandidatePath(pathMatch[1] || '')\n if (/\\.(html|tsx|ts|jsx|js|md|json)$/i.test(sourcePath)) {\n candidates.push({ path: sourcePath, reason: 'matched repository path search result' })\n }\n }\n }\n return candidates\n }\n\n private extractBestCandidateFromBootstrapContext(\n bootstrapContext: string | undefined\n ): { path: string; reason: string } | undefined {\n if (!bootstrapContext) return undefined\n const candidates = this.parseSearchRepoResultForCandidates(bootstrapContext)\n if (candidates.length === 0) return undefined\n return candidates.sort((a, b) => this.scoreCandidatePath(b.path) - this.scoreCandidatePath(a.path))[0]\n }\n\n private sanitizeResumeState(\n resumeState: RunTaskResumeState | undefined,\n taskName: string\n ): RunTaskResumeState | undefined {\n if (!resumeState) return undefined\n\n const planPath =\n typeof resumeState.planPath === 'string' && resumeState.planPath.trim()\n ? this.normalizeCandidatePath(resumeState.planPath)\n : this.getDefaultPlanPath(taskName)\n const candidatePaths = this.dedupeNormalizedCandidatePaths(resumeState.candidatePaths)\n const recentReadPaths = this.dedupeNormalizedCandidatePaths(resumeState.recentReadPaths)\n const normalizedBestCandidatePath =\n typeof resumeState.bestCandidatePath === 'string' && resumeState.bestCandidatePath.trim()\n ? this.normalizeCandidatePath(resumeState.bestCandidatePath)\n : undefined\n const bestCandidatePath =\n normalizedBestCandidatePath && !this.isMarathonArtifactPath(normalizedBestCandidatePath)\n ? normalizedBestCandidatePath\n : [...candidatePaths, ...recentReadPaths].sort(\n (left, right) => this.scoreCandidatePath(right) - this.scoreCandidatePath(left)\n )[0]\n\n const workflowPhase =\n resumeState.planWritten &&\n (!resumeState.workflowPhase ||\n resumeState.workflowPhase === 'research' ||\n resumeState.workflowPhase === 'planning')\n ? 'execution'\n : resumeState.workflowPhase\n\n return {\n ...resumeState,\n workflowPhase,\n planPath,\n planWritten: Boolean(resumeState.planWritten),\n bestCandidatePath,\n bestCandidateReason: bestCandidatePath ? resumeState.bestCandidateReason : undefined,\n candidatePaths,\n recentReadPaths,\n recentActionKeys: Array.from(new Set(resumeState.recentActionKeys || [])).slice(-20),\n bestCandidateNeedsVerification: Boolean(resumeState.bestCandidateNeedsVerification),\n bestCandidateVerified: Boolean(resumeState.bestCandidateVerified),\n ...(resumeState.verificationRequired !== undefined\n ? { verificationRequired: resumeState.verificationRequired }\n : {}),\n lastVerificationPassed: Boolean(resumeState.lastVerificationPassed),\n ...(resumeState.isCreationTask !== undefined ? { isCreationTask: resumeState.isCreationTask } : {}),\n ...(resumeState.workflowVariant !== undefined ? { workflowVariant: resumeState.workflowVariant } : {}),\n ...(resumeState.workflowState !== undefined ? { workflowState: resumeState.workflowState } : {}),\n }\n }\n\n private buildPhaseInstructions(state: RunTaskState, workflow: WorkflowDefinition): string {\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n if (currentPhase) {\n return currentPhase.buildInstructions(state)\n }\n // Fallback for unknown phases\n return `--- Workflow Phase: ${state.workflowPhase || 'unknown'} ---`\n }\n\n private updateWorkflowPhase(state: RunTaskState, sessionTrace: RunTaskToolTrace, workflow: WorkflowDefinition): void {\n if (!state.workflowPhase) state.workflowPhase = workflow.phases[0]?.name ?? 'research'\n if (!state.planPath) state.planPath = this.getDefaultPlanPath(state.taskName)\n\n state.phaseTransitionSummary = undefined\n\n const ctx: WorkflowContext = {\n state,\n trace: sessionTrace,\n normalizePath: this.normalizeCandidatePath.bind(this),\n isArtifactPath: this.isMarathonArtifactPath.bind(this),\n isDiscoveryTool: this.isDiscoveryToolName.bind(this),\n }\n\n const transitionSummaries: string[] = []\n let phaseUpdated = true\n\n while (phaseUpdated) {\n phaseUpdated = false\n\n const phaseIndex = workflow.phases.findIndex((p) => p.name === state.workflowPhase)\n const phase = workflow.phases[phaseIndex]\n const nextPhase = workflow.phases[phaseIndex + 1]\n\n if (phase && nextPhase && phase.isComplete(ctx)) {\n // Handle planWritten side effect for planning phase\n if (phase.name === 'planning') {\n state.planWritten = true\n }\n\n const summary = phase.buildTransitionSummary?.(state, nextPhase.name)\n state.workflowPhase = nextPhase.name\n if (summary) {\n transitionSummaries.push(summary)\n }\n phaseUpdated = true\n }\n }\n\n if (state.status === 'complete') {\n state.workflowPhase = 'complete'\n }\n\n if (transitionSummaries.length > 0) {\n state.phaseTransitionSummary = transitionSummaries.join('\\n\\n')\n }\n }\n\n private wrapLocalToolsForTrace(\n localTools: Record<string, LocalToolDefinition> | undefined,\n trace: RunTaskToolTrace,\n state: Pick<\n RunTaskState,\n | 'workflowPhase'\n | 'planPath'\n | 'bestCandidatePath'\n | 'recentReadPaths'\n | 'bestCandidateNeedsVerification'\n | 'verificationRequired'\n >,\n workflow: WorkflowDefinition\n ): Record<string, LocalToolDefinition> | undefined {\n if (!localTools) return undefined\n\n const wrapped: Record<string, LocalToolDefinition> = {}\n for (const [toolName, toolDef] of Object.entries(localTools)) {\n wrapped[toolName] = {\n ...toolDef,\n execute: async (args) => {\n const actionKey = `${toolName}:${String(args.path || args.query || args.pattern || '.').slice(0, 120)}`\n trace.actionKeys.push(actionKey)\n if (trace.actionKeys.length > 10) {\n trace.actionKeys = trace.actionKeys.slice(-10)\n }\n\n const normalizedPathArg =\n typeof args.path === 'string' && args.path.trim()\n ? this.normalizeCandidatePath(String(args.path))\n : undefined\n const normalizedPlanPath = state.planPath\n ? this.normalizeCandidatePath(state.planPath)\n : undefined\n const normalizedBestCandidatePath = state.bestCandidatePath\n ? this.normalizeCandidatePath(state.bestCandidatePath)\n : undefined\n const pathArg =\n typeof args.path === 'string' && args.path.trim() ? ` path=${String(args.path)}` : ''\n const queryArg =\n typeof args.query === 'string' && args.query.trim() ? ` query=\"${String(args.query)}\"` : ''\n const patternArg =\n typeof args.pattern === 'string' && args.pattern.trim()\n ? ` pattern=\"${String(args.pattern)}\"`\n : ''\n const isWriteLikeTool = toolName === 'write_file' || toolName === 'restore_file_checkpoint'\n const isVerificationTool = toolName === 'run_check'\n\n // Delegate phase-specific tool interception to workflow\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n if (currentPhase?.interceptToolCall) {\n const ctx: WorkflowContext = {\n state: state as RunTaskState,\n trace,\n normalizePath: this.normalizeCandidatePath.bind(this),\n isArtifactPath: this.isMarathonArtifactPath.bind(this),\n isDiscoveryTool: this.isDiscoveryToolName.bind(this),\n }\n const blockedMessage = currentPhase.interceptToolCall(toolName, args as Record<string, unknown>, ctx)\n if (blockedMessage) {\n if (isWriteLikeTool) trace.attemptedWrite = true\n this.pushToolTraceEntry(trace, `${toolName}${pathArg}${queryArg}${patternArg} -> ${blockedMessage}`)\n return blockedMessage\n }\n }\n\n if (isWriteLikeTool) {\n trace.attemptedWrite = true\n }\n\n if (this.isDiscoveryToolName(toolName)) {\n trace.discoveryPerformed = true\n }\n if (toolName === 'read_file') {\n trace.readFiles = true\n if (normalizedPathArg) {\n const normalizedReadPath = normalizedPathArg\n trace.readPaths.push(normalizedReadPath)\n if (trace.readPaths.length > 12) {\n trace.readPaths = trace.readPaths.slice(-12)\n }\n this.addCandidateToTrace(trace, normalizedReadPath, 'explicitly read by agent')\n }\n }\n\n let result: unknown\n try {\n result = await toolDef.execute(args)\n } catch (error) {\n if (\n toolName === 'read_file' &&\n normalizedPathArg &&\n normalizedBestCandidatePath &&\n normalizedPathArg === normalizedBestCandidatePath\n ) {\n trace.bestCandidateReadFailed = true\n }\n this.pushToolTraceEntry(\n trace,\n `${toolName}${pathArg}${queryArg}${patternArg} -> error: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n throw error\n }\n\n if (isWriteLikeTool && normalizedPathArg) {\n trace.wroteFiles = true\n if (normalizedPlanPath && normalizedPathArg === normalizedPlanPath) {\n trace.planWritten = true\n } else if (state.workflowPhase === 'execution') {\n trace.executionFileWritten = true\n trace.verificationPassed = false\n if (\n normalizedBestCandidatePath &&\n normalizedPathArg === normalizedBestCandidatePath\n ) {\n trace.bestCandidateWritten = true\n }\n }\n }\n\n const verificationResult = isVerificationTool\n ? this.parseVerificationResult(result)\n : undefined\n if (verificationResult) {\n trace.verificationAttempted = true\n trace.verificationPassed = verificationResult.success\n }\n\n const summarizedResult = verificationResult\n ? [\n verificationResult.command || 'verification',\n verificationResult.success ? 'passed' : 'failed',\n verificationResult.error || verificationResult.output,\n ]\n .filter(Boolean)\n .join(' | ')\n .slice(0, 240)\n : this.summarizeTextBlockForTrace(result)\n const resultSuffix = summarizedResult ? ` -> ${summarizedResult}` : ''\n this.pushToolTraceEntry(trace, `${toolName}${pathArg}${queryArg}${patternArg}${resultSuffix}`)\n\n const textResult = typeof result === 'string' ? result : ''\n if (\n toolName === 'read_file' &&\n normalizedPathArg &&\n normalizedBestCandidatePath &&\n normalizedPathArg === normalizedBestCandidatePath &&\n (trace.bestCandidateWritten || state.bestCandidateNeedsVerification)\n ) {\n trace.bestCandidateVerified = true\n }\n if (toolName === 'search_repo' && textResult) {\n for (const candidate of this.parseSearchRepoResultForCandidates(textResult)) {\n this.addCandidateToTrace(trace, candidate.path, candidate.reason)\n }\n } else if (toolName === 'glob_files' && textResult) {\n for (const line of textResult.split('\\n')) {\n const candidatePath = line.trim()\n if (/\\.(html|tsx|ts|jsx|js|md|json)$/i.test(candidatePath)) {\n this.addCandidateToTrace(trace, candidatePath, 'matched glob search')\n }\n }\n } else if (toolName === 'list_directory' && textResult && typeof args.path === 'string') {\n const baseDir = this.normalizeCandidatePath(String(args.path))\n for (const line of textResult.split('\\n')) {\n const candidateName = line.trim()\n if (/\\.(html|tsx|ts|jsx|js|md|json)$/i.test(candidateName)) {\n this.addCandidateToTrace(\n trace,\n this.joinCandidatePath(baseDir, candidateName),\n `listed in directory ${baseDir || '.'}`\n )\n }\n }\n } else if (toolName === 'read_file' && textResult && typeof args.path === 'string') {\n const sourcePath = this.normalizeCandidatePath(String(args.path))\n for (const candidate of this.extractCandidatePathsFromText(textResult, sourcePath)) {\n this.addCandidateToTrace(trace, candidate.path, candidate.reason)\n }\n }\n\n return result\n },\n }\n }\n\n return wrapped\n }\n\n private createTraceCallbacks(\n callbacks: AgentStreamCallbacks | undefined,\n trace: RunTaskToolTrace\n ): AgentStreamCallbacks | undefined {\n if (!callbacks) {\n return {\n onToolStart: (event) => {\n trace.actionKeys.push(`server:${event.toolName}`)\n if (trace.actionKeys.length > 10) trace.actionKeys = trace.actionKeys.slice(-10)\n if (event.toolName === 'write_file') trace.attemptedWrite = true\n this.pushToolTraceEntry(trace, `server-tool ${event.toolName} started`)\n },\n onToolComplete: (event) => {\n const resultSummary = this.summarizeTextBlockForTrace(event.result)\n this.pushToolTraceEntry(\n trace,\n `server-tool ${event.toolName} ${event.success ? 'completed' : 'failed'}${\n resultSummary ? ` -> ${resultSummary}` : ''\n }`\n )\n },\n }\n }\n\n return {\n ...callbacks,\n onToolStart: (event) => {\n trace.actionKeys.push(`server:${event.toolName}`)\n if (trace.actionKeys.length > 10) trace.actionKeys = trace.actionKeys.slice(-10)\n if (event.toolName === 'write_file') trace.attemptedWrite = true\n this.pushToolTraceEntry(trace, `server-tool ${event.toolName} started`)\n callbacks.onToolStart?.(event)\n },\n onToolComplete: (event) => {\n const resultSummary = this.summarizeTextBlockForTrace(event.result)\n this.pushToolTraceEntry(\n trace,\n `server-tool ${event.toolName} ${event.success ? 'completed' : 'failed'}${\n resultSummary ? ` -> ${resultSummary}` : ''\n }`\n )\n callbacks.onToolComplete?.(event)\n },\n }\n }\n\n private buildToolTraceSummary(trace: RunTaskToolTrace): string {\n if (trace.entries.length === 0) return ''\n\n const lines = trace.entries.slice(-6).map((entry) => `- ${entry}`)\n const flags: string[] = []\n if (trace.discoveryPerformed) flags.push('repo discovery used')\n if (trace.readFiles) flags.push('candidate files read')\n if (trace.wroteFiles) flags.push('files written')\n if (trace.localToolLoopGuardTriggered) flags.push('local-tool loop guard forced end_turn')\n if (trace.bestCandidateVerified) flags.push('target re-read after write')\n if (trace.verificationPassed) flags.push('verification passed')\n else if (trace.verificationAttempted) flags.push('verification failed')\n\n return [\n 'Session working memory:',\n ...(flags.length > 0 ? [`- ${flags.join('; ')}`] : []),\n ...(trace.bestCandidatePath\n ? [`- best candidate: ${trace.bestCandidatePath}${trace.bestCandidateReason ? ` (${trace.bestCandidateReason})` : ''}`]\n : []),\n ...lines,\n ]\n .join('\\n')\n .slice(0, 1200)\n }\n\n private extractBootstrapQueries(message: string): string[] {\n const queries: string[] = []\n const noisyTerms = new Set([\n 'a',\n 'against',\n 'all',\n 'analyze',\n 'and',\n 'as',\n 'at',\n 'based',\n 'before',\n 'best',\n 'by',\n 'codebase',\n 'do',\n 'exactly',\n 'files',\n 'first',\n 'following',\n 'goal',\n 'go',\n 'how',\n 'in',\n 'is',\n 'it',\n 'its',\n 'make',\n 'markdown',\n 'most',\n 'no',\n 'of',\n 'on',\n 'order',\n 'plan',\n 'progress',\n 'repo',\n 'research',\n 'right',\n 'save',\n 'session',\n 'solve',\n 'task',\n 'that',\n 'the',\n 'then',\n 'through',\n 'to',\n 'turn',\n 'update',\n 'user',\n 'ux',\n 'web',\n 'when',\n 'with',\n 'work',\n 'your',\n ])\n const push = (candidate: string) => {\n const normalized = candidate\n .replace(/^[^a-z0-9/._-]+|[^a-z0-9/._ -]+$/gi, '')\n .replace(/\\s+/g, ' ')\n .trim()\n if (!normalized || normalized.length < 3 || normalized.length > 60) return\n const words = normalized.toLowerCase().split(' ').filter(Boolean)\n if (words.length > 4) return\n if (words.every((word) => noisyTerms.has(word))) return\n if (words.length > 1 && noisyTerms.has(words[words.length - 1] || '')) return\n if (!queries.some((existing) => existing.toLowerCase() === normalized.toLowerCase())) {\n queries.push(normalized)\n }\n }\n\n const lowerMessage = message.toLowerCase()\n const phraseHints = [\n 'agent editor',\n 'theme.html',\n '/theme.html',\n 'style it visually',\n ]\n for (const hint of phraseHints) {\n if (lowerMessage.includes(hint.toLowerCase())) push(hint)\n }\n\n for (const match of message.matchAll(/\"([^\"]{3,60})\"/g)) {\n push(match[1] || '')\n }\n\n for (const match of message.matchAll(\n /(?:go through|review|inspect|edit|improve|update|fix|modify)\\s+(?:the\\s+)?([a-z0-9][a-z0-9/_-]*(?:\\s+[a-z0-9][a-z0-9/_-]*){0,2})/gi\n )) {\n push(match[1] || '')\n }\n\n for (const match of message.matchAll(\n /([a-z0-9][a-z0-9/_-]*(?:\\s+[a-z0-9][a-z0-9/_-]*){0,2})\\s+(?:page|editor|screen|view|route|component)\\b/gi\n )) {\n push(match[0] || '')\n push(match[1] || '')\n }\n\n for (const match of message.matchAll(/\\b[\\w./-]+\\.(?:html|tsx|ts|jsx|js|md|json)\\b/g)) {\n push(match[0] || '')\n }\n\n for (const match of message.matchAll(/\\/[A-Za-z0-9._/-]+/g)) {\n push(match[0] || '')\n }\n\n for (const match of message.matchAll(/\\b([a-z0-9]+(?:\\s+[a-z0-9]+){1,2})\\b/gi)) {\n const phrase = (match[1] || '').toLowerCase()\n const words = phrase.split(' ')\n if (words.some((word) => ['editor', 'page', 'screen', 'view', 'route', 'component'].includes(word))) {\n push(match[1] || '')\n }\n }\n\n return queries.slice(0, 4)\n }\n\n private async generateBootstrapDiscoveryContext(\n message: string,\n localTools: Record<string, LocalToolDefinition> | undefined,\n isCreationTask?: boolean\n ): Promise<string | undefined> {\n if (isCreationTask) return undefined\n if (!localTools) return undefined\n\n const searchTool = localTools.search_repo\n const globTool = localTools.glob_files\n if (!searchTool && !globTool) return undefined\n\n const queries = this.extractBootstrapQueries(message)\n if (queries.length === 0) return undefined\n\n const lines: string[] = []\n for (const query of queries) {\n if (lines.length >= 6) break\n\n if (searchTool) {\n try {\n const result = await searchTool.execute({ query, path: '.', maxResults: 5 })\n const summary = this.summarizeTextBlockForTrace(result, 3)\n if (summary && !summary.startsWith('No matches found')) {\n lines.push(`search_repo \"${query}\": ${summary}`)\n continue\n }\n } catch {\n // Best effort bootstrap only\n }\n }\n\n if (globTool && /\\./.test(query)) {\n try {\n const result = await globTool.execute({ pattern: `**/${query}`, path: '.', maxResults: 5 })\n const summary = this.summarizeTextBlockForTrace(result, 3)\n if (summary && !summary.startsWith('No files matched')) {\n lines.push(`glob_files \"**/${query}\": ${summary}`)\n }\n } catch {\n // Best effort bootstrap only\n }\n }\n }\n\n if (lines.length === 0) return undefined\n return ['Bootstrap repo hints:', ...lines].join('\\n').slice(0, 1500)\n }\n\n private buildStuckTurnRecoveryMessage(state: RunTaskState, workflow: WorkflowDefinition): string | undefined {\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n if (currentPhase?.buildRecoveryMessage) {\n return currentPhase.buildRecoveryMessage(state)\n }\n return undefined\n }\n\n /**\n * Run a long-task agent across multiple sessions with automatic state management.\n *\n * Each session is a single agent execution. The SDK drives the loop client-side,\n * calling the agent's execute endpoint repeatedly and accumulating context.\n * Progress is optionally synced to a Runtype record for dashboard visibility.\n *\n * @example\n * ```typescript\n * const result = await client.agents.runTask('agt_123', {\n * message: 'Build a REST API with CRUD endpoints',\n * maxSessions: 20,\n * maxCost: 5.00,\n * trackProgress: true,\n * onSession: (state) => {\n * console.log(`Session ${state.sessionCount}: ${state.lastStopReason} ($${state.totalCost.toFixed(4)})`)\n * },\n * })\n *\n * console.log(`Finished: ${result.status} after ${result.sessionCount} sessions`)\n * ```\n */\n async runTask(id: string, options: RunTaskOptions): Promise<RunTaskResult> {\n const maxSessions = options.maxSessions ?? 50\n const maxCost = options.maxCost\n const useStream = options.stream ?? true\n const workflow = options.workflow ?? defaultWorkflow\n\n // Resolve agent metadata\n const agent = await this.get(id)\n const taskName =\n typeof options.trackProgress === 'string'\n ? options.trackProgress\n : options.trackProgress\n ? `${agent.name} task`\n : ''\n const resolvedTaskName = taskName || `${agent.name} task`\n const seededResumeState = this.sanitizeResumeState(options.resumeState, resolvedTaskName)\n\n // Initialize state\n const state: RunTaskState = {\n agentId: id,\n agentName: agent.name,\n taskName: resolvedTaskName,\n status: 'running',\n workflowPhase: seededResumeState?.workflowPhase || workflow.phases[0]?.name || 'research',\n planPath: seededResumeState?.planPath || this.getDefaultPlanPath(resolvedTaskName),\n planWritten: seededResumeState?.planWritten || false,\n bestCandidateNeedsVerification: seededResumeState?.bestCandidateNeedsVerification || false,\n bestCandidateVerified: seededResumeState?.bestCandidateVerified || false,\n verificationRequired:\n seededResumeState?.verificationRequired ?? Boolean(options.localTools?.run_check),\n lastVerificationPassed: seededResumeState?.lastVerificationPassed || false,\n sessionCount: 0,\n totalCost: 0,\n lastOutput: '',\n lastStopReason: 'complete',\n sessions: [],\n startedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n ...(seededResumeState?.originalMessage ? { originalMessage: seededResumeState.originalMessage } : {}),\n ...(seededResumeState?.bootstrapContext ? { bootstrapContext: seededResumeState.bootstrapContext } : {}),\n ...(seededResumeState?.bestCandidatePath\n ? {\n bestCandidatePath: seededResumeState.bestCandidatePath,\n bestCandidateReason: seededResumeState.bestCandidateReason,\n }\n : {}),\n ...(seededResumeState?.candidatePaths ? { candidatePaths: seededResumeState.candidatePaths } : {}),\n ...(seededResumeState?.recentReadPaths ? { recentReadPaths: seededResumeState.recentReadPaths } : {}),\n ...(seededResumeState?.recentActionKeys\n ? { recentActionKeys: seededResumeState.recentActionKeys }\n : {}),\n }\n\n // Classify variant via workflow\n state.workflowVariant = seededResumeState?.workflowVariant\n ?? workflow.classifyVariant?.(options.message)\n state.isCreationTask = seededResumeState?.isCreationTask ?? (state.workflowVariant === 'create')\n\n this.updateWorkflowPhase(state, this.createEmptyToolTrace(), workflow)\n\n // Track the record ID if we're syncing\n let recordId: string | undefined\n\n // Extract local tool names for prompt injection\n const localToolNames = options.localTools ? Object.keys(options.localTools) : undefined\n\n if (!options.previousMessages) {\n // Delegate bootstrap to workflow\n if (workflow.generateBootstrapContext) {\n state.bootstrapContext = await workflow.generateBootstrapContext(\n options.message,\n options.localTools,\n state.workflowVariant\n )\n } else {\n state.bootstrapContext = await this.generateBootstrapDiscoveryContext(\n options.message,\n options.localTools,\n state.isCreationTask\n )\n }\n const bootstrapCandidate = this.extractBestCandidateFromBootstrapContext(state.bootstrapContext)\n if (bootstrapCandidate) {\n state.bestCandidatePath = bootstrapCandidate.path\n state.bestCandidateReason = bootstrapCandidate.reason\n state.candidatePaths = [bootstrapCandidate.path]\n }\n }\n\n // Session loop\n for (let session = 0; session < maxSessions; session++) {\n const sessionTrace = this.createEmptyToolTrace()\n const sessionLocalTools = this.wrapLocalToolsForTrace(options.localTools, sessionTrace, state, workflow)\n const sessionCallbacks = this.createTraceCallbacks(options.streamCallbacks, sessionTrace)\n\n // Build continuation context for resumed runs (first session only)\n const continuationContext =\n session === 0 && options.previousMessages\n ? {\n previousMessages: options.previousMessages,\n newUserMessage: options.continuationMessage,\n compact: options.compact,\n }\n : undefined\n\n // Store original message on first invocation (not a continuation)\n if (session === 0 && !options.previousMessages) {\n state.originalMessage = options.message\n }\n\n // Build messages for this session\n const messages = this.buildSessionMessages(\n options.message,\n state,\n session,\n maxSessions,\n localToolNames,\n continuationContext,\n workflow\n )\n\n // Execute one session\n let sessionResult: AgentExecuteResponse\n const sessionData: AgentExecuteRequest = {\n messages,\n debugMode: options.debugMode,\n model: options.model,\n }\n\n let sessionToolMessages: AgentMessage[] = []\n\n if (useStream && options.localTools) {\n // Local tools require the pause/resume streaming loop\n const localToolResult = await this.executeWithLocalTools(\n id,\n sessionData,\n sessionLocalTools || options.localTools,\n sessionCallbacks,\n {\n onLocalToolResult: this.createLocalToolLoopGuard(state, sessionTrace, workflow),\n },\n state.taskName,\n )\n if (!localToolResult) {\n throw new Error('Agent stream ended without a complete event')\n }\n const { completeEvent, toolMessages: captured } = localToolResult\n sessionToolMessages = captured\n sessionResult = {\n success: completeEvent.success,\n result: completeEvent.finalOutput || '',\n iterations: completeEvent.iterations,\n totalCost: completeEvent.totalCost || 0,\n stopReason: completeEvent.stopReason,\n error: completeEvent.error,\n }\n } else if (useStream && options.streamCallbacks) {\n const completeEvent = await this.executeWithCallbacks(\n id,\n sessionData,\n sessionCallbacks || options.streamCallbacks\n )\n if (!completeEvent) {\n throw new Error('Agent stream ended without a complete event')\n }\n sessionResult = {\n success: completeEvent.success,\n result: completeEvent.finalOutput || '',\n iterations: completeEvent.iterations,\n totalCost: completeEvent.totalCost || 0,\n stopReason: completeEvent.stopReason,\n error: completeEvent.error,\n }\n } else {\n sessionResult = await this.execute(id, sessionData)\n }\n\n const toolTraceSummary = this.buildToolTraceSummary(sessionTrace)\n const effectiveSessionOutput = this.buildEffectiveSessionOutput(\n sessionResult.result,\n toolTraceSummary\n )\n\n // Update state\n const sessionCost = sessionResult.totalCost\n state.sessionCount = session + 1\n state.totalCost += sessionCost\n state.lastOutput = effectiveSessionOutput\n state.lastError =\n sessionResult.stopReason === 'error'\n ? sessionResult.error || 'Agent session ended with an error.'\n : undefined\n state.lastStopReason = sessionResult.stopReason\n state.updatedAt = new Date().toISOString()\n\n state.sessions.push({\n index: session + 1,\n cost: sessionCost,\n iterations: sessionResult.iterations,\n stopReason: sessionResult.stopReason,\n outputPreview: effectiveSessionOutput.slice(0, 300),\n toolTraceSummary: toolTraceSummary || undefined,\n discoveryPerformed: sessionTrace.discoveryPerformed,\n attemptedWrite: sessionTrace.attemptedWrite,\n wroteFiles: sessionTrace.wroteFiles,\n hadTextOutput: Boolean(sessionResult.result.trim()),\n verificationAttempted: sessionTrace.verificationAttempted,\n verificationPassed: sessionTrace.verificationPassed,\n bestCandidatePath: sessionTrace.bestCandidatePath || undefined,\n actionKeys: sessionTrace.actionKeys.slice(-5),\n completedAt: new Date().toISOString(),\n })\n\n if (sessionTrace.bestCandidatePath) {\n state.bestCandidatePath = sessionTrace.bestCandidatePath\n state.bestCandidateReason = sessionTrace.bestCandidateReason\n }\n if (sessionTrace.candidatePaths.length > 0) {\n state.candidatePaths = Array.from(\n new Set([...(state.candidatePaths || []), ...sessionTrace.candidatePaths])\n ).slice(-20)\n }\n if (sessionTrace.readPaths.length > 0) {\n state.recentReadPaths = Array.from(\n new Set([...(state.recentReadPaths || []), ...sessionTrace.readPaths])\n ).slice(-20)\n }\n if (sessionTrace.actionKeys.length > 0) {\n state.recentActionKeys = [...(state.recentActionKeys || []), ...sessionTrace.actionKeys].slice(-20)\n }\n if (sessionTrace.planWritten) {\n state.planWritten = true\n }\n if (sessionTrace.executionFileWritten) {\n state.lastVerificationPassed = false\n }\n if (sessionTrace.bestCandidateWritten) {\n state.bestCandidateNeedsVerification = true\n state.bestCandidateVerified = false\n }\n if (sessionTrace.bestCandidateVerified) {\n state.bestCandidateNeedsVerification = false\n state.bestCandidateVerified = true\n }\n if (sessionTrace.verificationAttempted) {\n state.lastVerificationPassed = sessionTrace.verificationPassed\n }\n\n // Track cost by model\n const modelKey = options.model || 'default'\n if (!state.costByModel) state.costByModel = {}\n state.costByModel[modelKey] = (state.costByModel[modelKey] || 0) + sessionCost\n\n this.updateWorkflowPhase(state, sessionTrace, workflow)\n const phaseTransitionSummary = state.phaseTransitionSummary\n if (phaseTransitionSummary) {\n state.lastOutput = [phaseTransitionSummary, '', state.lastOutput].join('\\n').trim()\n const latestSession = state.sessions[state.sessions.length - 1]\n if (latestSession) {\n latestSession.outputPreview = [phaseTransitionSummary, '', latestSession.outputPreview]\n .join('\\n')\n .slice(0, 300)\n latestSession.toolTraceSummary = [phaseTransitionSummary, '', latestSession.toolTraceSummary || '']\n .join('\\n')\n .trim()\n .slice(0, 1200)\n }\n }\n\n // Accumulate messages for future continuation.\n // When buildSessionMessages returns the full history + a new continuation\n // message, only the NEW messages at the end are appended — otherwise the\n // history would be re-pushed on every session and grow exponentially.\n if (!state.messages) state.messages = []\n if (state.messages.length > 0 && messages.length > state.messages.length) {\n // Continuation session: history was replayed, only append the new tail\n const newMessages = messages.slice(state.messages.length)\n state.messages.push(...newMessages)\n } else {\n // First session (or no prior history): all messages are new\n state.messages.push(...messages)\n }\n // Store structured tool messages and compact old results\n if (sessionToolMessages.length > 0) {\n this.compactToolResults(\n state.messages,\n sessionToolMessages,\n state.taskName,\n options.toolContextMode || 'hot-tail',\n options.toolWindow ?? 'session',\n )\n state.messages.push(...sessionToolMessages)\n }\n // Always store an assistant message so continuation sessions have full\n // conversation history. When the agent only made tool calls and produced\n // no text, fall back to a synthetic summary so the history stays coherent.\n const assistantContent =\n effectiveSessionOutput ||\n `[Session ${session + 1} completed (${sessionResult.stopReason}). No text output captured.]`\n state.messages.push({ role: 'assistant', content: assistantContent })\n\n // Keep session log trimmed to last 50 entries\n if (state.sessions.length > 50) {\n state.sessions = state.sessions.slice(-50)\n }\n\n // Check terminal conditions\n if (sessionResult.stopReason === 'complete') {\n state.status = 'complete'\n } else if (sessionResult.stopReason === 'error') {\n state.status = 'error'\n } else if (sessionResult.stopReason === 'max_cost') {\n state.status = 'budget_exceeded'\n } else if (this.canAcceptTaskCompletion(sessionResult.result, state, sessionTrace, workflow)) {\n // Client-side stop-phrase detection for non-loop agents returning 'end_turn'\n state.status = 'complete'\n } else if (maxCost && state.totalCost >= maxCost) {\n state.status = 'budget_exceeded'\n } else if (session + 1 >= maxSessions) {\n state.status = 'max_sessions'\n }\n\n // Sync to record if enabled\n if (options.trackProgress) {\n recordId = await this.syncProgressRecord(state, recordId)\n }\n\n // Notify caller\n if (options.onSession) {\n const shouldStop = await options.onSession(state)\n if (shouldStop === false) {\n state.status = 'paused'\n }\n }\n\n // Stop if terminal\n if (state.status !== 'running') {\n break\n }\n }\n\n return {\n status: state.status,\n sessionCount: state.sessionCount,\n totalCost: state.totalCost,\n lastOutput: state.lastOutput,\n sessions: state.sessions,\n recordId,\n }\n }\n\n /** Stop phrases that indicate the agent considers its task complete. */\n private static readonly STOP_PHRASES = [\n 'DONE:',\n 'TASK_COMPLETE',\n 'FINISHED',\n '[COMPLETE]',\n 'STATUS: RESOLVED',\n 'STATUS: COMPLETE',\n ]\n\n /**\n * Client-side fallback for detecting task completion in agent output.\n * Mirrors the API's detectAutoComplete() for non-loop agents that return 'end_turn'.\n */\n private detectTaskCompletion(output: string): boolean {\n const upper = output.toUpperCase()\n return AgentsEndpoint.STOP_PHRASES.some((phrase) => upper.includes(phrase.toUpperCase()))\n }\n\n /**\n * Generate a compact summary of prior work for continuation context.\n * Used when compact mode is enabled to keep token usage low.\n */\n private generateCompactSummary(state: RunTaskState): string {\n const sessionSummaries = (state.sessions ?? [])\n .map(\n (s) =>\n `- Session ${s.index}: ${s.stopReason} ($${s.cost.toFixed(4)}) -- ${s.outputPreview.slice(0, 100)}`\n )\n .join('\\n')\n\n return [\n `Task: ${state.taskName}`,\n `Status: ${state.status}`,\n `Workflow phase: ${state.workflowPhase || 'research'}`,\n `Sessions completed: ${state.sessionCount}`,\n `Total cost: $${state.totalCost.toFixed(4)}`,\n ...(state.planPath ? [`Plan path: ${state.planPath}`] : []),\n ...(state.planWritten ? ['Plan written: yes'] : []),\n ...(state.bestCandidatePath\n ? [\n `Best candidate: ${state.bestCandidatePath}`,\n ...(state.bestCandidateReason ? [`Candidate reason: ${state.bestCandidateReason}`] : []),\n ]\n : []),\n ...(state.bootstrapContext ? ['', state.bootstrapContext] : []),\n '',\n 'Session history:',\n sessionSummaries,\n '',\n 'Last output (truncated):',\n (state.lastOutput || '').slice(0, 1500),\n ].join('\\n')\n }\n\n /**\n * Build messages for a session, injecting progress context for continuation sessions.\n * Optionally accepts continuation context for marathon resume scenarios.\n */\n private buildSessionMessages(\n originalMessage: string,\n state: RunTaskState,\n sessionIndex: number,\n maxSessions: number,\n localToolNames?: string[],\n continuationContext?: {\n previousMessages: AgentMessage[]\n newUserMessage?: string\n compact?: boolean\n },\n workflow?: WorkflowDefinition\n ): AgentMessage[] {\n const wf = workflow ?? defaultWorkflow\n\n // Build local tools guidance block when tools are available\n const currentPhase = wf.phases.find((p) => p.name === state.workflowPhase)\n const toolGuidanceLines = currentPhase?.buildToolGuidance(state) ?? []\n const isDeployWorkflow = wf.name === 'deploy'\n const toolsBlock = localToolNames?.length\n ? [\n '',\n '--- Local Tools ---',\n `You have access to tools (${localToolNames.join(', ')}) that execute directly on the user's machine.`,\n ...(isDeployWorkflow\n ? ['Use deploy_sandbox to deploy code and get a live preview URL.']\n : [\n 'Use these tools to inspect the existing repository and make real file edits — not just code in your response.',\n ]),\n ...toolGuidanceLines,\n ...(isDeployWorkflow ? [] : ['Always use write_file to save your output so the user can run it immediately.']),\n ].join('\\n')\n : ''\n\n const bootstrapBlock = state.bootstrapContext\n ? ['', '--- Initial Repository Discovery ---', state.bootstrapContext].join('\\n')\n : ''\n const phaseBlock = ['', this.buildPhaseInstructions(state, wf)].join('\\n')\n const candidateBlock = wf.buildCandidateBlock?.(state) ?? ''\n\n const multiSessionInstruction = `This is a multi-session task (session ${sessionIndex + 1}/${maxSessions}). When you have fully completed the task, end your response with TASK_COMPLETE on its own line.`\n\n // Continuation resume: first session of a resumed run with prior context\n if (continuationContext && sessionIndex === 0) {\n const defaultContinueMessage =\n 'Continue the task. Review your prior work above and proceed with any remaining work. If everything is already complete, respond with TASK_COMPLETE.'\n const userMessage = continuationContext.newUserMessage || defaultContinueMessage\n\n if (continuationContext.compact) {\n // Compact mode: summarize prior work instead of full history\n const summary = this.generateCompactSummary(state)\n const messages: AgentMessage[] = [\n {\n role: 'system',\n content: `You are continuing a previously completed task. Here is a summary of prior work:\\n\\n${summary}\\n\\nDo NOT redo any of the above work.`,\n },\n {\n role: 'user',\n content: [userMessage, phaseBlock, toolsBlock, bootstrapBlock, candidateBlock, '', multiSessionInstruction].join('\\n'),\n },\n ]\n return messages\n }\n\n // Full history mode: replay all previous messages with do-not-redo instruction\n const messages: AgentMessage[] = [\n ...continuationContext.previousMessages,\n {\n role: 'system',\n content:\n 'IMPORTANT: You are continuing a previously completed task. The conversation above shows your prior work. Do NOT redo any of it. Build on what was already accomplished. If there is nothing new to do, respond with TASK_COMPLETE.',\n },\n {\n role: 'user',\n content: [userMessage, phaseBlock, toolsBlock, bootstrapBlock, candidateBlock, '', multiSessionInstruction].join('\\n'),\n },\n ]\n return messages\n }\n\n // First session (non-continuation): user message + completion signal instruction\n if (sessionIndex === 0) {\n const content = [originalMessage, phaseBlock, toolsBlock, bootstrapBlock, candidateBlock, '', multiSessionInstruction].join('\\n')\n return [{ role: 'user', content }]\n }\n\n // Continuation sessions within a run: inject progress context\n const recentSessions = state.sessions.slice(-5)\n const progressSummary = recentSessions\n .map(\n (s) =>\n ` Session ${s.index}: ${s.stopReason} ($${s.cost.toFixed(4)}) — ${s.outputPreview.slice(0, 100)}`\n )\n .join('\\n')\n\n // When we have accumulated message history, replay the full conversation\n // so the model has complete context and doesn't start fresh each session.\n if (state.messages && state.messages.length > 0) {\n const recoveryMessage = this.buildStuckTurnRecoveryMessage(state, wf)\n const continuationContent = [\n 'Continue the task.',\n phaseBlock,\n toolsBlock,\n bootstrapBlock,\n candidateBlock,\n '',\n `--- Progress (session ${sessionIndex + 1}/${maxSessions}, $${state.totalCost.toFixed(4)} spent) ---`,\n `Previous sessions:`,\n progressSummary,\n '',\n ...(recoveryMessage ? [recoveryMessage, ''] : []),\n 'Do not redo previous work. If the task is already complete, respond with TASK_COMPLETE.',\n ].join('\\n')\n\n // Cap history to prevent context overflow on long-running marathons.\n // Keep the most recent 60 messages (increased from 40 to accommodate tool message pairs).\n const MAX_HISTORY_MESSAGES = 60\n let historyMessages = state.messages\n if (historyMessages.length > MAX_HISTORY_MESSAGES) {\n const trimmedCount = historyMessages.length - MAX_HISTORY_MESSAGES\n historyMessages = [\n {\n role: 'system' as const,\n content: `[${trimmedCount} earlier messages trimmed to stay within context limits. Original task: ${(state.originalMessage || originalMessage).slice(0, 500)}]`,\n },\n ...historyMessages.slice(-MAX_HISTORY_MESSAGES),\n ]\n }\n\n return [\n ...historyMessages,\n { role: 'user' as const, content: continuationContent },\n ]\n }\n\n // Fallback when no message history is available: single-message summary\n const recoveryMessage = this.buildStuckTurnRecoveryMessage(state, wf)\n const content = [\n originalMessage,\n phaseBlock,\n toolsBlock,\n bootstrapBlock,\n candidateBlock,\n '',\n `--- Progress (session ${sessionIndex + 1}/${maxSessions}, $${state.totalCost.toFixed(4)} spent) ---`,\n `Previous sessions:`,\n progressSummary,\n '',\n ...(recoveryMessage ? [recoveryMessage, ''] : []),\n `Last output (do NOT repeat this — build on it):`,\n state.lastOutput.slice(0, 1000),\n '',\n 'Continue where you left off. Do not redo previous work. If the task is already complete, respond with TASK_COMPLETE.',\n ].join('\\n')\n\n return [{ role: 'user', content }]\n }\n\n /**\n * Upsert a record to sync long-task progress to the dashboard.\n * Creates the record on first call, updates it on subsequent calls.\n */\n private async syncProgressRecord(\n state: RunTaskState,\n existingRecordId?: string\n ): Promise<string> {\n const metadata = {\n agentId: state.agentId,\n agentName: state.agentName,\n status: state.status,\n sessionCount: state.sessionCount,\n totalCost: state.totalCost,\n lastStopReason: state.lastStopReason,\n lastOutputPreview: state.lastOutput.slice(0, 500),\n sessions: state.sessions.slice(-10), // Keep last 10 in the record\n startedAt: state.startedAt,\n updatedAt: state.updatedAt,\n }\n\n try {\n if (existingRecordId) {\n // Update existing record\n const record = await this.client.put<RuntypeRecord>(`/records/${existingRecordId}`, {\n metadata,\n })\n return record.id\n } else {\n // Try to find existing record by type + name first\n const existing = await this.client.get<PaginationResponse<RuntypeRecord>>('/records', {\n type: 'agent-task',\n name: state.taskName,\n limit: 1,\n })\n if (existing.data.length > 0) {\n const record = await this.client.put<RuntypeRecord>(`/records/${existing.data[0].id}`, {\n metadata,\n })\n return record.id\n }\n\n // Create new record\n const record = await this.client.post<RuntypeRecord>('/records', {\n type: 'agent-task',\n name: state.taskName,\n metadata,\n })\n return record.id\n }\n } catch {\n // Record sync is best-effort — don't fail the task\n return existingRecordId || ''\n }\n }\n}\n","/**\n * FlowBuilder - Fluent builder for constructing dispatch configurations\n *\n * Provides a chainable API for building flows with steps, making flow\n * construction more readable and type-safe.\n *\n * @example\n * ```typescript\n * import { FlowBuilder } from '@runtypelabs/sdk'\n *\n * const config = new FlowBuilder()\n * .createFlow({ name: \"My Flow\" })\n * .withRecord({ name: \"Record\", type: \"data\", metadata: { key: \"value\" } })\n * .fetchUrl({ name: \"Fetch\", url: \"https://api.example.com\", outputVariable: \"data\" })\n * .prompt({ name: \"Process\", model: \"gpt-4\", userPrompt: \"Analyze: {{data}}\" })\n * .withOptions({ streamResponse: true, flowMode: \"virtual\" })\n * .build()\n * ```\n */\n\nimport type {\n DispatchRequest,\n MessageContent,\n ToolsConfig,\n RuntimeTool,\n RuntimeExternalToolConfig,\n ReasoningConfig,\n} from './types'\nimport type {\n ErrorHandlingMode,\n PromptErrorHandling,\n ContextErrorHandling,\n} from './error-handling-types'\nimport { FlowResult } from './flow-result'\nimport { processStream } from './stream-utils'\n\n// ============================================================================\n// Step Configuration Interfaces\n// ============================================================================\n\nexport interface PromptStepConfig {\n name: string\n model: string\n userPrompt: string\n systemPrompt?: string\n previousMessages?: string | Array<{ role: string; content: string }>\n outputVariable?: string\n responseFormat?: 'text' | 'json'\n temperature?: number\n maxTokens?: number\n /**\n * Enable reasoning/extended thinking for models that support it.\n * - `true`: Enable with provider defaults\n * - `ReasoningConfig`: Fine-grained control over reasoning behavior\n *\n * @example GPT-5 with streaming reasoning\n * ```typescript\n * reasoning: { enabled: true, reasoningSummary: 'auto' }\n * ```\n */\n reasoning?: boolean | ReasoningConfig\n streamOutput?: boolean\n /** Tools configuration - supports saved tools (toolIds) and inline runtime tools */\n tools?: ToolsConfig\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | PromptErrorHandling\n enabled?: boolean\n}\n\nexport interface FetchUrlStepConfig {\n name: string\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n headers?: Record<string, string>\n body?: string\n responseType?: 'json' | 'text' | 'xml'\n markdownIfAvailable?: boolean\n outputVariable?: string\n fetchMethod?: 'http' | 'firecrawl'\n firecrawl?: {\n formats?: string[]\n [key: string]: any\n }\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface TransformDataStepConfig {\n name: string\n script: string\n outputVariable?: string\n sandboxProvider?: 'quickjs' | 'daytona' | 'cloudflare-worker'\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SetVariableStepConfig {\n name: string\n variableName: string\n value: string | number | boolean | object\n enabled?: boolean\n}\n\nexport interface ConditionalStepConfig {\n name: string\n condition: string\n trueSteps?: any[]\n falseSteps?: any[]\n enabled?: boolean\n}\n\nexport interface SearchStepConfig {\n name: string\n provider: string\n query: string\n maxResults?: number\n outputVariable?: string\n returnCitations?: boolean\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendEmailStepConfig {\n name: string\n to: string\n from?: string\n subject: string\n html: string\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendStreamStepConfig {\n name: string\n message: string\n enabled?: boolean\n}\n\nexport interface RetrieveRecordStepConfig {\n name: string\n recordType?: string\n recordName?: string\n fieldsToInclude?: string[]\n fieldsToExclude?: string[]\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface UpsertRecordStepConfig {\n name: string\n recordType: string\n recordName?: string\n sourceVariable?: string\n mergeStrategy?: 'merge' | 'replace'\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface VectorSearchStepConfig {\n name: string\n query: string\n recordType?: string\n embeddingModel?: string\n limit?: number\n threshold?: number\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface GenerateEmbeddingStepConfig {\n name: string\n text: string\n embeddingModel?: string\n maxLength?: number\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface WaitUntilStepConfig {\n name: string\n delayMs?: number\n continueOnTimeout?: boolean\n poll?: {\n enabled: boolean\n intervalMs?: number\n maxAttempts?: number\n condition?: string\n }\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendEventStepConfig {\n name: string\n provider: string\n eventName: string\n properties?: Record<string, any>\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendTextStepConfig {\n name: string\n to: string\n from?: string\n message: string\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface FetchGitHubStepConfig {\n name: string\n repository: string\n branch?: string\n path?: string\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\n// ============================================================================\n// Flow Builder Configuration Interfaces\n// ============================================================================\n\nexport interface FlowConfig {\n name: string\n description?: string\n}\n\n/**\n * Configuration for upsert flow - includes flow name and upsert behavior options\n */\nexport interface UpsertFlowConfig extends FlowConfig {\n /** Whether to create a version snapshot before updating (default: true) */\n createVersionOnChange?: boolean\n /** Allow overwriting changes made via dashboard/API (default: false) */\n allowOverwriteExternalChanges?: boolean\n}\n\nexport interface RecordConfig {\n id?: number | string\n name?: string\n type?: string\n metadata?: Record<string, any>\n}\n\n/**\n * Options for upsert mode - controls conflict detection and versioning\n */\nexport interface UpsertOptions {\n /** Whether to create a version snapshot before updating (default: true) */\n createVersionOnChange?: boolean\n /** Allow overwriting changes made via dashboard/API (default: false) */\n allowOverwriteExternalChanges?: boolean\n}\n\nexport interface DispatchOptions {\n streamResponse?: boolean\n modelOverride?: string\n recordMode?: 'existing' | 'create' | 'virtual'\n flowMode?: 'existing' | 'create' | 'virtual' | 'upsert'\n storeResults?: boolean\n autoAppendMetadata?: boolean\n debugMode?: boolean\n createVersion?: boolean\n versionType?: 'published' | 'draft' | 'test' | 'virtual'\n versionLabel?: string\n versionNotes?: string\n flowVersionId?: string\n /** Options for upsert mode (only used when flowMode is 'upsert') */\n upsertOptions?: UpsertOptions\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant'\n content: MessageContent\n}\n\n// ============================================================================\n// Streaming Event Types (matching API SSE events)\n// ============================================================================\n\nexport interface FlowPausedEvent {\n type: 'flow_await'\n executionId: string\n flowId: string\n toolId: string\n toolName: string\n awaitedAt: string\n}\n\nexport interface StepWaitingLocalEvent {\n type: 'step_await'\n id: string\n name: string\n index: number\n stepType: string\n toolId: string\n toolName: string\n executionId: string\n parameters: any\n}\n\n// ============================================================================\n// Fallback Event Types (for error handling fallback chains)\n// ============================================================================\n\n/**\n * Emitted when a fallback chain starts execution\n */\nexport interface FallbacksInitiatedEvent {\n type: 'fallbacks_initiated'\n id: string\n totalFallbacks: number\n originalError: string\n timestamp: string\n}\n\n/**\n * Emitted when a fallback attempt starts\n */\nexport interface FallbackStartEvent {\n type: 'fallback_start'\n id: string\n attempt: number\n fallbackType: string\n timestamp: string\n}\n\n/**\n * Emitted when a fallback attempt succeeds\n */\nexport interface FallbackSuccessEvent {\n type: 'fallback_success'\n id: string\n attempt: number\n fallbackType: string\n timestamp: string\n}\n\n/**\n * Emitted when a fallback attempt fails\n */\nexport interface FallbackFailEvent {\n type: 'fallback_fail'\n id: string\n attempt: number\n fallbackType: string\n error: string\n timestamp: string\n}\n\n/**\n * Emitted when all fallbacks in the chain have been exhausted\n */\nexport interface FallbacksExhaustedEvent {\n type: 'fallbacks_exhausted'\n id: string\n totalAttempts: number\n finalError: string\n timestamp: string\n}\n\nexport interface FlowStartEvent {\n type: 'flow_start'\n flowId: string\n flowName: string\n totalSteps: number\n}\n\nexport interface StepStartEvent {\n type: 'step_start'\n id: string\n name: string\n index: number\n stepType: string\n}\n\nexport interface StepDeltaEvent {\n type: 'step_delta'\n id: string\n chunk: string\n index: number\n}\n\n/** @deprecated Use StepDeltaEvent instead */\nexport type StepChunkEvent = StepDeltaEvent\n\nexport interface StepCompleteEvent {\n type: 'step_complete'\n id: string\n name: string\n index: number\n stepType: string\n /** Step result - used by all step types */\n result?: any\n executionTime: number\n}\n\nexport interface FlowCompleteEvent {\n type: 'flow_complete'\n flowId: string\n totalSteps: number\n successfulSteps: number\n failedSteps: number\n executionTime: number\n}\n\nexport interface FlowErrorEvent {\n type: 'flow_error'\n error: string\n stepId?: string\n}\n\n/**\n * Union type of all possible SSE events\n */\nexport type StreamEvent =\n | FlowStartEvent\n | StepStartEvent\n | StepDeltaEvent\n | StepCompleteEvent\n | FlowCompleteEvent\n | FlowErrorEvent\n | FlowPausedEvent\n | StepWaitingLocalEvent\n | FallbacksInitiatedEvent\n | FallbackStartEvent\n | FallbackSuccessEvent\n | FallbackFailEvent\n | FallbacksExhaustedEvent\n\n/**\n * Callbacks for streaming flow execution\n *\n * @example\n * ```typescript\n * await flow.run(apiClient, options, {\n * onStepStart: (event) => console.log('Starting:', event.name),\n * onStepDelta: (chunk, event) => process.stdout.write(chunk),\n * onStepComplete: (result, event) => console.log('Done:', event.name),\n * onFlowComplete: (event) => console.log('Flow complete'),\n * onError: (error) => console.error(error),\n * })\n * ```\n */\nexport interface StreamCallbacks {\n /** Called when flow execution starts */\n onFlowStart?: (event: FlowStartEvent) => void\n /** Called when a step starts executing */\n onStepStart?: (event: StepStartEvent) => void\n /** Called for each chunk of streaming output from a step */\n onStepDelta?: (chunk: string, event: StepDeltaEvent) => void\n /**\n * @deprecated Use onStepDelta instead\n * Called for each chunk of streaming output from a step\n */\n onStepChunk?: (chunk: string, event: StepDeltaEvent) => void\n /** Called when a step completes */\n onStepComplete?: (result: any, event: StepCompleteEvent) => void\n /** Called when the entire flow completes */\n onFlowComplete?: (event: FlowCompleteEvent) => void\n /** Called when an error occurs */\n onError?: (error: Error) => void\n}\n\n/**\n * Summary returned after flow execution completes\n */\nexport interface FlowSummary {\n flowId: string\n flowName: string\n totalSteps: number\n successfulSteps: number\n failedSteps: number\n executionTime: number\n /** Results from each step, keyed by step name */\n results: Map<string, any>\n /** Whether the flow completed successfully */\n success: boolean\n}\n\n// ============================================================================\n// Internal Step Type\n// ============================================================================\n\ninterface FlowStep {\n id: string\n type: string\n name: string\n order: number\n enabled: boolean\n config: Record<string, any>\n}\n\n// ============================================================================\n// FlowBuilder Class\n// ============================================================================\n\nexport class FlowBuilder {\n private flowConfig: FlowConfig = { name: 'Untitled Flow' }\n private steps: FlowStep[] = []\n private recordConfig: RecordConfig | undefined\n private messagesConfig: Message[] | undefined\n private inputsConfig: Record<string, unknown> | undefined\n private optionsConfig: DispatchOptions = {}\n private stepCounter = 0\n private existingFlowId: string | undefined\n\n /**\n * Initialize the flow with a name and optional description.\n * Use this for virtual/one-off flows or when specifying flowMode in run().\n */\n createFlow(config: FlowConfig): this {\n this.flowConfig = config\n this.existingFlowId = undefined // Clear any existing flow reference\n return this\n }\n\n /**\n * Define a flow for upsert - creates if it doesn't exist, updates if steps changed.\n * This is the recommended pattern for code-first flow management.\n *\n * @example\n * ```typescript\n * const result = await new FlowBuilder()\n * .upsertFlow({\n * name: 'My Flow',\n * createVersionOnChange: true\n * })\n * .prompt({ name: 'Analyze', model: 'gpt-4o', userPrompt: '...' })\n * .run(apiClient, { streamResponse: true })\n * ```\n */\n upsertFlow(config: UpsertFlowConfig): this {\n const { createVersionOnChange, allowOverwriteExternalChanges, ...flowConfig } = config\n this.flowConfig = flowConfig\n this.existingFlowId = undefined // Clear any existing flow reference\n\n // Auto-set upsert mode and options\n this.optionsConfig = {\n ...this.optionsConfig,\n flowMode: 'upsert',\n upsertOptions: {\n createVersionOnChange: createVersionOnChange ?? true,\n ...(allowOverwriteExternalChanges !== undefined && { allowOverwriteExternalChanges }),\n },\n }\n return this\n }\n\n /**\n * Use an existing flow by ID instead of defining steps inline\n *\n * @example\n * ```typescript\n * const result = await new FlowBuilder()\n * .useExistingFlow('flow_abc123')\n * .withRecord({ name: 'Test', type: 'data' })\n * .run(apiClient, { streamResponse: true })\n * ```\n */\n useExistingFlow(flowId: string): this {\n this.existingFlowId = flowId\n this.steps = [] // Clear any inline steps\n return this\n }\n\n /**\n * Set the record configuration\n */\n withRecord(config: RecordConfig): this {\n this.recordConfig = config\n return this\n }\n\n /**\n * Set conversation messages\n */\n withMessages(messages: Message[]): this {\n this.messagesConfig = messages\n return this\n }\n\n /**\n * Set top-level input variables accessible as {{varName}} in templates\n *\n * @example\n * ```typescript\n * const result = await new FlowBuilder()\n * .useExistingFlow('flow_abc123')\n * .withInputs({\n * customerName: 'John',\n * topic: 'billing'\n * })\n * .run(apiClient, { streamResponse: true })\n * ```\n */\n withInputs(inputs: Record<string, unknown>): this {\n this.inputsConfig = inputs\n return this\n }\n\n /**\n * Set dispatch options\n */\n withOptions(options: DispatchOptions): this {\n this.optionsConfig = { ...this.optionsConfig, ...options }\n return this\n }\n\n // ============================================================================\n // Step Methods\n // ============================================================================\n\n /**\n * Add a prompt step\n */\n prompt(config: PromptStepConfig): this {\n this.addStep(\n 'prompt',\n config.name,\n {\n model: config.model,\n userPrompt: config.userPrompt,\n text: config.userPrompt, // backward compat\n systemPrompt: config.systemPrompt,\n previousMessages: config.previousMessages,\n outputVariable: config.outputVariable,\n responseFormat: config.responseFormat,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n reasoning: config.reasoning,\n streamOutput: config.streamOutput,\n tools: config.tools,\n errorHandling: config.errorHandling,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a fetch URL step\n */\n fetchUrl(config: FetchUrlStepConfig): this {\n this.addStep(\n 'fetch-url',\n config.name,\n {\n http: {\n url: config.url,\n method: config.method || 'GET',\n headers: config.headers,\n body: config.body,\n },\n responseType: config.responseType,\n markdownIfAvailable: config.markdownIfAvailable,\n fetchMethod: config.fetchMethod,\n firecrawl: config.firecrawl,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a transform data step\n */\n transformData(config: TransformDataStepConfig): this {\n this.addStep(\n 'transform-data',\n config.name,\n {\n script: config.script,\n outputVariable: config.outputVariable,\n sandboxProvider: config.sandboxProvider,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a set variable step\n */\n setVariable(config: SetVariableStepConfig): this {\n this.addStep(\n 'set-variable',\n config.name,\n {\n variableName: config.variableName,\n value: config.value,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a conditional step\n */\n conditional(config: ConditionalStepConfig): this {\n this.addStep(\n 'conditional',\n config.name,\n {\n condition: config.condition,\n trueSteps: config.trueSteps || [],\n falseSteps: config.falseSteps || [],\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a search step\n */\n search(config: SearchStepConfig): this {\n this.addStep(\n 'search',\n config.name,\n {\n provider: config.provider,\n query: config.query,\n maxResults: config.maxResults,\n outputVariable: config.outputVariable,\n returnCitations: config.returnCitations,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send email step\n */\n sendEmail(config: SendEmailStepConfig): this {\n this.addStep(\n 'send-email',\n config.name,\n {\n to: config.to,\n from: config.from || '{{_flow.id}}@runtype.email',\n subject: config.subject,\n html: config.html,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send stream step\n */\n sendStream(config: SendStreamStepConfig): this {\n this.addStep(\n 'send-stream',\n config.name,\n {\n message: config.message,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a retrieve record step\n */\n retrieveRecord(config: RetrieveRecordStepConfig): this {\n this.addStep(\n 'retrieve-record',\n config.name,\n {\n recordType: config.recordType,\n recordName: config.recordName,\n fieldsToInclude: config.fieldsToInclude,\n fieldsToExclude: config.fieldsToExclude,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add an upsert record step\n */\n upsertRecord(config: UpsertRecordStepConfig): this {\n this.addStep(\n 'upsert-record',\n config.name,\n {\n recordType: config.recordType,\n recordName: config.recordName,\n sourceVariable: config.sourceVariable,\n mergeStrategy: config.mergeStrategy,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a vector search step\n */\n vectorSearch(config: VectorSearchStepConfig): this {\n this.addStep(\n 'vector-search',\n config.name,\n {\n query: config.query,\n recordType: config.recordType,\n embeddingModel: config.embeddingModel,\n limit: config.limit,\n threshold: config.threshold,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a generate embedding step\n */\n generateEmbedding(config: GenerateEmbeddingStepConfig): this {\n this.addStep(\n 'generate-embedding',\n config.name,\n {\n inputSource: 'text',\n text: config.text,\n embeddingModel: config.embeddingModel,\n maxLength: config.maxLength,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a wait until step\n */\n waitUntil(config: WaitUntilStepConfig): this {\n this.addStep(\n 'wait-until',\n config.name,\n {\n delayMs: config.delayMs,\n continueOnTimeout: config.continueOnTimeout,\n poll: config.poll,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send event step\n */\n sendEvent(config: SendEventStepConfig): this {\n this.addStep(\n 'send-event',\n config.name,\n {\n provider: config.provider,\n eventName: config.eventName,\n properties: config.properties,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send text step\n */\n sendText(config: SendTextStepConfig): this {\n this.addStep(\n 'send-text',\n config.name,\n {\n to: config.to,\n from: config.from,\n message: config.message,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a fetch GitHub step\n */\n fetchGitHub(config: FetchGitHubStepConfig): this {\n this.addStep(\n 'fetch-github',\n config.name,\n {\n repository: config.repository,\n branch: config.branch,\n path: config.path,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n // ============================================================================\n // Build Method\n // ============================================================================\n\n /**\n * Build the final dispatch request configuration\n */\n build(): DispatchRequest {\n // Determine the flow configuration\n const flow = this.existingFlowId\n ? { id: this.existingFlowId }\n : { name: this.flowConfig.name, steps: this.steps }\n\n const request: DispatchRequest = { flow }\n\n // Add record config if set\n if (this.recordConfig) {\n request.record = this.recordConfig\n }\n\n // Add messages if set\n if (this.messagesConfig) {\n request.messages = this.messagesConfig\n }\n\n // Add inputs if set\n if (this.inputsConfig) {\n request.inputs = this.inputsConfig\n }\n\n // Add options if any are set\n if (Object.keys(this.optionsConfig).length > 0) {\n request.options = this.optionsConfig\n }\n\n return request\n }\n\n // ============================================================================\n // Execution Methods\n // ============================================================================\n\n /**\n * Build and execute the flow with the provided client\n *\n * Returns a FlowResult that can be used to:\n * - Process with callbacks via `.stream(callbacks)`\n * - Get a specific step result via `.getResult(stepName)`\n * - Get all results via `.getAllResults()`\n * - Access raw response via `.raw`\n *\n * @param client - Client with dispatch capability\n * @param options - Optional execution options (merged with any .withOptions() settings)\n * @returns FlowResult for processing the streaming response\n *\n * @example\n * ```typescript\n * // Simple execution with result extraction\n * const result = await flow.run(apiClient, { streamResponse: true })\n * const analysis = await result.getResult('Analyze Data')\n *\n * // With streaming callbacks\n * const result = await flow.run(apiClient, options)\n * await result.stream({\n * onStepDelta: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: () => console.log('Done!'),\n * })\n * ```\n */\n async run(client: DispatchClient, options?: DispatchOptions): Promise<FlowResult>\n\n /**\n * Build and execute the flow with callbacks for streaming events\n *\n * @param client - Client with dispatch capability\n * @param options - Execution options (merged with any .withOptions() settings)\n * @param callbacks - Callbacks for streaming events\n * @returns FlowSummary when execution completes\n *\n * @example\n * ```typescript\n * const summary = await flow.run(apiClient, options, {\n * onStepStart: (event) => console.log('Starting:', event.name),\n * onStepDelta: (chunk) => process.stdout.write(chunk),\n * onStepComplete: (result, event) => console.log('Done:', event.name),\n * onFlowComplete: (event) => console.log('Flow complete!'),\n * })\n * ```\n */\n async run(\n client: DispatchClient,\n options: DispatchOptions,\n callbacks: StreamCallbacks\n ): Promise<FlowSummary>\n\n async run(\n client: DispatchClient,\n options?: DispatchOptions,\n callbacks?: StreamCallbacks\n ): Promise<FlowResult | FlowSummary> {\n const config = this.build()\n // Merge run options with builder options (run options take precedence)\n if (options) {\n config.options = { ...config.options, ...options }\n }\n\n const response = await client.dispatch(config)\n\n // If callbacks provided, process stream immediately\n if (callbacks) {\n return processStream(response, callbacks)\n }\n\n // Otherwise return FlowResult for later processing\n return new FlowResult(response)\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private addStep(\n type: string,\n name: string,\n config: Record<string, any>,\n enabled: boolean = true\n ): void {\n this.stepCounter++\n\n // Clean undefined values from config\n const cleanConfig: Record<string, any> = {}\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n cleanConfig[key] = value\n }\n }\n\n this.steps.push({\n id: `step-${this.stepCounter}`,\n type,\n name,\n order: this.stepCounter,\n enabled,\n config: cleanConfig,\n })\n }\n}\n\n// ============================================================================\n// Client Interface for Execution\n// ============================================================================\n\n/**\n * Interface for clients that can dispatch flows\n */\nexport interface DispatchClient {\n /**\n * Run a flow with local tools (automatic pause/resume loop)\n *\n * @param config - The dispatch request configuration\n * @param localTools - Map of tool names to async functions that execute the tool logic\n * @param callbacks - Optional callbacks for streaming events\n * @returns The final result of the flow execution or summary if streaming\n */\n runWithLocalTools(\n config: DispatchRequest,\n localTools: Record<string, (args: any) => Promise<any>>,\n callbacks?: StreamCallbacks\n ): Promise<FlowResult | FlowSummary>\n\n dispatch(config: DispatchRequest): Promise<Response>\n}\n\n// ============================================================================\n// ClientFlowBuilder - FlowBuilder bound to a client\n// ============================================================================\n\n/**\n * FlowBuilder that is bound to a client for direct execution\n *\n * @example\n * ```typescript\n * // Via RuntypeClient.flow()\n * const result = await runtype\n * .flow('My Flow')\n * .fetchUrl({ name: 'Fetch', url: '...', outputVariable: 'data' })\n * .prompt({ name: 'Process', model: 'gpt-4', userPrompt: '...' })\n * .run({ streamResponse: true })\n *\n * const data = await result.getResult('Process')\n * ```\n */\nexport class ClientFlowBuilder extends FlowBuilder {\n private boundClient: DispatchClient\n\n constructor(client: DispatchClient, name: string) {\n super()\n this.boundClient = client\n this.createFlow({ name })\n }\n\n /**\n * Build and execute the flow using the bound client\n *\n * For ClientFlowBuilder, you can either:\n * 1. Pass a client (which is ignored, the bound client is used)\n * 2. Pass options directly as the first argument\n *\n * @example\n * ```typescript\n * // Simple execution (no args needed)\n * const result = await builder.run()\n * const data = await result.getResult('Process')\n *\n * // With options only\n * const result = await builder.run({ streamResponse: true, flowMode: 'virtual' })\n *\n * // With options and callbacks\n * const summary = await builder.run({ streamResponse: true }, {\n * onStepDelta: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: () => console.log('Done!'),\n * })\n *\n * // Parent class signature (client ignored)\n * const result = await builder.run(someClient, { streamResponse: true })\n * ```\n */\n // Overload: No arguments\n run(): Promise<FlowResult>\n // Overload: Options only\n run(options: DispatchOptions): Promise<FlowResult>\n // Overload: Options with callbacks\n run(options: DispatchOptions, callbacks: StreamCallbacks): Promise<FlowSummary>\n // Overload: With local tools\n run(localTools: Record<string, (args: any) => Promise<any>>): Promise<FlowResult>\n run(\n options: DispatchOptions,\n localTools: Record<string, (args: any) => Promise<any>>\n ): Promise<FlowResult>\n // Overload: With local tools AND streaming\n run(\n localTools: Record<string, (args: any) => Promise<any>>,\n callbacks: StreamCallbacks\n ): Promise<FlowSummary>\n run(\n options: DispatchOptions,\n localTools: Record<string, (args: any) => Promise<any>>,\n callbacks: StreamCallbacks\n ): Promise<FlowSummary>\n // Overload: Parent class signature (client, options)\n run(client: DispatchClient, options?: DispatchOptions): Promise<FlowResult>\n // Overload: Parent class signature (client, options, callbacks)\n run(\n client: DispatchClient,\n options: DispatchOptions,\n callbacks: StreamCallbacks\n ): Promise<FlowSummary>\n\n async run(\n arg1?: DispatchClient | DispatchOptions | Record<string, (args: any) => Promise<any>>,\n arg2?: DispatchOptions | StreamCallbacks | Record<string, (args: any) => Promise<any>>,\n arg3?: StreamCallbacks | Record<string, (args: any) => Promise<any>>,\n arg4?: StreamCallbacks\n ): Promise<FlowResult | FlowSummary> {\n const config = this.build()\n\n // Determine arguments\n let runOptions: DispatchOptions | undefined\n let runCallbacks: StreamCallbacks | undefined\n let localTools: Record<string, (args: any) => Promise<any>> | undefined\n let dispatchClient = this.boundClient\n\n // Helper to check if object is local tools map (not options or callbacks)\n const isLocalTools = (obj: any) =>\n obj &&\n typeof obj === 'object' &&\n !isStreamCallbacks(obj) &&\n !('streamResponse' in obj) && // Not options\n !('dispatch' in obj) // Not client\n\n // Parse arguments based on types\n if (arg1) {\n if (typeof arg1 === 'object' && 'dispatch' in arg1) {\n // arg1 is client (ignored)\n if (arg2) {\n if (isStreamCallbacks(arg2)) {\n runCallbacks = arg2\n } else {\n runOptions = arg2 as DispatchOptions\n if (arg3 && isStreamCallbacks(arg3)) {\n runCallbacks = arg3 as StreamCallbacks\n }\n }\n }\n } else if (isLocalTools(arg1)) {\n // arg1 is local tools\n localTools = arg1 as Record<string, (args: any) => Promise<any>>\n if (arg2 && isStreamCallbacks(arg2)) {\n runCallbacks = arg2 as StreamCallbacks\n }\n } else {\n // arg1 is options\n runOptions = arg1 as DispatchOptions\n if (arg2) {\n if (isLocalTools(arg2)) {\n localTools = arg2 as Record<string, (args: any) => Promise<any>>\n if (arg3 && isStreamCallbacks(arg3)) {\n runCallbacks = arg3 as StreamCallbacks\n }\n } else if (isStreamCallbacks(arg2)) {\n runCallbacks = arg2 as StreamCallbacks\n }\n }\n }\n }\n\n // Merge run options with builder options\n if (runOptions) {\n config.options = { ...config.options, ...runOptions }\n }\n\n // Execute with local tools if provided\n if (localTools) {\n // Cast boundClient to RuntypeClient to access runWithLocalTools\n // This assumes boundClient is a RuntypeClient which has the new method\n if ('runWithLocalTools' in dispatchClient) {\n // If callbacks are provided, use streaming mode, otherwise use standard mode\n // runWithLocalTools handles both depending on args\n if (runCallbacks) {\n return (dispatchClient as any).runWithLocalTools(config, localTools, runCallbacks)\n }\n return (dispatchClient as any).runWithLocalTools(config, localTools)\n } else {\n throw new Error('Client does not support local tools execution')\n }\n }\n\n const response = await dispatchClient.dispatch(config)\n\n // If callbacks provided, process stream immediately\n if (runCallbacks) {\n return processStream(response, runCallbacks)\n }\n\n // Otherwise return FlowResult for later processing\n return new FlowResult(response)\n }\n}\n\n/**\n * Type guard to check if an object is StreamCallbacks\n */\nfunction isStreamCallbacks(obj: any): obj is StreamCallbacks {\n if (!obj || typeof obj !== 'object') return false\n // Check for any of the callback properties\n return (\n 'onFlowStart' in obj ||\n 'onStepStart' in obj ||\n 'onStepDelta' in obj ||\n 'onStepChunk' in obj ||\n 'onStepComplete' in obj ||\n 'onFlowComplete' in obj ||\n 'onError' in obj\n )\n}\n\n// ============================================================================\n// Runtime Tool Helpers\n// ============================================================================\n\n/**\n * Create an external runtime tool definition.\n *\n * External tools make HTTP requests to external APIs with support for\n * variable substitution in URLs and headers.\n *\n * Special internal variables are available for auth:\n * - `{{_internal.auth_token}}` - Bearer token for Runtype API auth\n * - `{{_internal.user_id}}` - Current user ID\n * - `{{_internal.org_id}}` - Current organization ID\n *\n * @example\n * ```typescript\n * const listFlowsTool = createExternalTool({\n * name: 'list_flows',\n * description: 'List all flows in the workspace',\n * parametersSchema: {\n * type: 'object',\n * properties: {\n * limit: { type: 'number', description: 'Max results', default: 20 }\n * }\n * },\n * url: 'https://api.runtype.com/v1/flows',\n * method: 'GET',\n * headers: { Authorization: '{{_internal.auth_token}}' }\n * })\n * ```\n */\nexport function createExternalTool(config: {\n name: string\n description: string\n parametersSchema: any\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE'\n headers?: Record<string, string>\n}): RuntimeTool {\n return {\n name: config.name,\n description: config.description,\n toolType: 'external',\n parametersSchema: config.parametersSchema,\n config: {\n url: config.url,\n method: config.method || 'POST',\n headers: config.headers,\n } as RuntimeExternalToolConfig,\n }\n}\n","/**\n * @layer sdk\n * @case camelCase (SDK and API both use native camelCase - no conversion needed)\n *\n * Main Runtype API Client.\n *\n * The SDK and API both use native camelCase for all request/response bodies.\n * No case transformation is performed.\n *\n * @see packages/client/src/transform.ts for pass-through utilities\n */\n\nimport type { ClientConfig, DispatchRequest } from './types'\nimport { transformRequest, transformResponse, transformQueryParams } from './transform'\nimport {\n FlowsEndpoint,\n PromptsEndpoint,\n RecordsEndpoint,\n ApiKeysEndpoint,\n ModelConfigsEndpoint,\n DispatchEndpoint,\n ChatEndpoint,\n UsersEndpoint,\n AnalyticsEndpoint,\n FlowStepsEndpoint,\n ContextTemplatesEndpoint,\n ToolsEndpoint,\n EvalEndpoint,\n ClientTokensEndpoint,\n AgentsEndpoint,\n type ApiClient,\n} from './endpoints'\nimport {\n ClientFlowBuilder,\n StreamCallbacks,\n FlowSummary,\n StepDeltaEvent,\n FlowPausedEvent,\n StepWaitingLocalEvent,\n} from './flow-builder'\nimport { FlowResult } from './flow-result'\n\ntype LocalToolHandler = (args: unknown) => Promise<unknown>\n\ninterface LocalToolPausedState {\n toolName: string\n executionId: string\n parameters?: unknown\n}\n\ninterface PausedLocalActionResult {\n status: 'paused'\n pausedReason?: {\n type: 'local_action'\n toolName: string\n executionId: string\n parameters?: unknown\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isPausedLocalActionResult(value: unknown): value is PausedLocalActionResult {\n if (!isObjectRecord(value) || value.status !== 'paused') {\n return false\n }\n\n const { pausedReason } = value\n return (\n pausedReason === undefined ||\n (isObjectRecord(pausedReason) &&\n pausedReason.type === 'local_action' &&\n typeof pausedReason.toolName === 'string' &&\n typeof pausedReason.executionId === 'string')\n )\n}\n\n/**\n * RuntypeClient - The main entry point for interacting with the Runtype API\n *\n * Automatically transforms field names between camelCase (client) and snake_case (API)\n * to provide an idiomatic JavaScript/TypeScript experience while maintaining API consistency.\n */\nexport class RuntypeClient implements ApiClient {\n private baseUrl: string\n private apiVersion: string\n private timeout: number\n private headers: Record<string, string>\n\n // Endpoint handlers\n public flows: FlowsEndpoint\n public prompts: PromptsEndpoint\n public records: RecordsEndpoint\n public apiKeys: ApiKeysEndpoint\n public modelConfigs: ModelConfigsEndpoint\n public dispatch: DispatchEndpoint\n public chat: ChatEndpoint\n public users: UsersEndpoint\n public analytics: AnalyticsEndpoint\n public flowSteps: FlowStepsEndpoint\n public contextTemplates: ContextTemplatesEndpoint\n public tools: ToolsEndpoint\n public eval: EvalEndpoint\n public clientTokens: ClientTokensEndpoint\n public agents: AgentsEndpoint\n\n constructor(config: ClientConfig = {}) {\n const baseUrl = config.baseUrl || 'https://api.runtype.com'\n this.apiVersion = config.apiVersion || 'v1'\n // Construct versioned base URL (api.runtype.com/v1)\n this.baseUrl = this.apiVersion ? `${baseUrl}/${this.apiVersion}` : baseUrl\n this.timeout = config.timeout || 30000\n this.headers = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n }\n\n // Set API key if provided\n if (config.apiKey) {\n this.headers.Authorization = `Bearer ${config.apiKey}`\n }\n\n // Initialize endpoint handlers\n this.flows = new FlowsEndpoint(this)\n this.prompts = new PromptsEndpoint(this)\n this.records = new RecordsEndpoint(this)\n this.apiKeys = new ApiKeysEndpoint(this)\n this.modelConfigs = new ModelConfigsEndpoint(this)\n this.dispatch = new DispatchEndpoint(this)\n this.chat = new ChatEndpoint(this)\n this.users = new UsersEndpoint(this)\n this.analytics = new AnalyticsEndpoint(this)\n this.flowSteps = new FlowStepsEndpoint(this)\n this.contextTemplates = new ContextTemplatesEndpoint(this)\n this.tools = new ToolsEndpoint(this)\n this.eval = new EvalEndpoint(this)\n this.clientTokens = new ClientTokensEndpoint(this)\n this.agents = new AgentsEndpoint(this)\n }\n\n /**\n * Set the API key for authentication\n */\n setApiKey(apiKey: string): void {\n this.headers.Authorization = `Bearer ${apiKey}`\n }\n\n /**\n * Start building a flow with fluent API\n *\n * @example\n * ```typescript\n * const response = await runtype\n * .flow('My Flow')\n * .withRecord({ name: 'Test', type: 'data' })\n * .fetchUrl({ name: 'Fetch', url: '...', outputVariable: 'data' })\n * .prompt({ name: 'Process', model: 'gpt-4', userPrompt: '...' })\n * .run()\n * ```\n */\n flow(name: string): ClientFlowBuilder {\n return new ClientFlowBuilder(\n {\n dispatch: (config) => this.dispatch.executeStream(config),\n runWithLocalTools: (config, tools) => this.runWithLocalTools(config, tools),\n },\n name\n )\n }\n\n /**\n * Remove the API key\n */\n clearApiKey(): void {\n delete this.headers.Authorization\n }\n\n /**\n * Run a flow with client-side tools (automatic pause/resume loop)\n *\n * @param request - The dispatch request configuration\n * @param clientTools - Map of tool names to async functions that execute the tool logic\n * @param callbacks - Optional callbacks for streaming events\n * @returns The final result of the flow execution or summary if streaming\n */\n async runWithLocalTools(\n request: DispatchRequest,\n localTools: Record<string, LocalToolHandler>,\n callbacks?: StreamCallbacks\n ): Promise<FlowResult | FlowSummary> {\n // If callbacks are provided, use streaming mode\n // If not, force non-streaming for JSON state machine\n const isStreaming = !!callbacks\n\n const modifiedRequest = {\n ...request,\n options: {\n ...(request.options || {}),\n streamResponse: isStreaming,\n },\n }\n\n const processStep = async (response: Response): Promise<{ done: boolean; result: unknown }> => {\n if (isStreaming) {\n // Stream processing\n let pausedState: LocalToolPausedState | null = null\n\n // Wrap user callbacks to intercept paused event\n const wrappedCallbacks: StreamCallbacks = {\n ...callbacks,\n onFlowStart: (event) => callbacks?.onFlowStart?.(event),\n onStepStart: (event) => callbacks?.onStepStart?.(event),\n onStepChunk: (chunk, event) => callbacks?.onStepChunk?.(chunk, event),\n onStepComplete: (result, event) => callbacks?.onStepComplete?.(result, event),\n onFlowComplete: (event) => callbacks?.onFlowComplete?.(event),\n onError: (error) => callbacks?.onError?.(error),\n }\n\n const { streamEvents } = await import('./stream-utils')\n\n const summary: Partial<FlowSummary> = {\n results: new Map(),\n success: true,\n }\n\n try {\n for await (const event of streamEvents(response)) {\n if (event.type === 'flow_await') {\n // API sends: executionId, flowId, toolId, toolName.\n // Parameters are sent in step_await event just before this\n const pausedEvent: FlowPausedEvent = event\n pausedState = {\n ...(pausedState ?? {}),\n toolName: pausedEvent.toolName,\n executionId: pausedEvent.executionId,\n }\n }\n\n if (event.type === 'step_await') {\n // Capture parameters\n const pausedEvent: StepWaitingLocalEvent = event\n pausedState = {\n toolName: pausedEvent.toolName,\n parameters: pausedEvent.parameters,\n executionId: pausedEvent.executionId,\n }\n }\n\n // Handle standard events via callbacks\n switch (event.type) {\n case 'flow_start':\n wrappedCallbacks.onFlowStart?.(event)\n break\n case 'step_start':\n wrappedCallbacks.onStepStart?.(event)\n break\n case 'step_delta': {\n // Normalize API's 'text' field to 'chunk' for consistency\n const deltaEvent = event as StepDeltaEvent & { text?: string }\n const chunkText = deltaEvent.chunk || deltaEvent.text || ''\n wrappedCallbacks.onStepChunk?.(chunkText, deltaEvent)\n break\n }\n case 'step_complete': {\n summary.results?.set(event.name, event.result)\n wrappedCallbacks.onStepComplete?.(event.result, event)\n break\n }\n case 'flow_complete':\n wrappedCallbacks.onFlowComplete?.(event)\n break\n case 'flow_error':\n wrappedCallbacks.onError?.(new Error(event.error))\n break\n }\n }\n } catch (e) {\n wrappedCallbacks.onError?.(e instanceof Error ? e : new Error(String(e)))\n throw e\n }\n\n if (pausedState) {\n return {\n done: false,\n result: { status: 'paused', pausedReason: { type: 'local_action', ...pausedState } },\n }\n }\n\n return { done: true, result: summary as FlowSummary }\n } else {\n // Non-streaming (JSON)\n const data = await response.json()\n return {\n done: data.status !== 'paused',\n result: data,\n }\n }\n }\n\n // Initial dispatch\n let currentResponse: Response\n if (isStreaming) {\n currentResponse = await this.dispatch.executeStream(modifiedRequest)\n } else {\n const data = await this.dispatch.execute(modifiedRequest)\n currentResponse = new Response(JSON.stringify(data), {\n headers: { 'content-type': 'application/json' },\n })\n }\n\n // Loop\n while (true) {\n const { done, result } = await processStep(currentResponse)\n\n if (done) {\n if (isStreaming) return result as FlowSummary\n return new FlowResult(\n new Response(JSON.stringify(result), { headers: { 'content-type': 'application/json' } })\n )\n }\n\n // Handle Pause\n if (isPausedLocalActionResult(result) && result.pausedReason?.type === 'local_action') {\n const { toolName, parameters, executionId } = result.pausedReason\n\n if (!localTools[toolName]) {\n throw new Error(`Local tool \"${toolName}\" required but not provided in localTools map`)\n }\n\n try {\n // Execute local tool logic\n const toolResult = await localTools[toolName](parameters)\n\n // Resume flow execution\n const resumeData = {\n executionId: executionId,\n toolOutputs: { [toolName]: toolResult },\n streamResponse: isStreaming,\n }\n\n if (isStreaming) {\n currentResponse = (await this.dispatch.resume(resumeData)) as Response\n } else {\n const data = await this.dispatch.resume(resumeData)\n currentResponse = new Response(JSON.stringify(data), {\n headers: { 'content-type': 'application/json' },\n })\n }\n } catch (error) {\n throw new Error(\n `Error executing local tool \"${toolName}\": ${error instanceof Error ? error.message : String(error)}`\n )\n }\n } else {\n // Should not happen if done=false\n break\n }\n }\n\n throw new Error('Unexpected end of flow execution loop')\n }\n\n /**\n * Generic GET request\n */\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = this.buildUrl(path, params)\n const response = await this.makeRequest(url, {\n method: 'GET',\n headers: this.headers,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Generic POST request\n */\n async post<T>(path: string, data?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'POST',\n headers: this.headers,\n body: data ? JSON.stringify(transformRequest(data)) : undefined,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * POST request with FormData support for file uploads\n */\n async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const url = this.buildUrl(path)\n const headers = { ...this.headers }\n // Remove Content-Type to let browser set multipart boundary\n delete headers['Content-Type']\n\n const response = await this.makeRequest(url, {\n method: 'POST',\n headers,\n body: formData,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Generic request that returns raw Response for streaming\n */\n async requestStream(path: string, options: RequestInit = {}): Promise<Response> {\n const url = this.buildUrl(path)\n const headers = {\n ...this.headers,\n ...(options.headers as Record<string, string>),\n }\n\n // Transform request body if it's JSON\n let body = options.body\n if (body && typeof body === 'string' && headers['Content-Type']?.includes('application/json')) {\n try {\n const parsed = JSON.parse(body)\n body = JSON.stringify(transformRequest(parsed))\n } catch {\n // If parsing fails, use original body\n }\n }\n\n return this.makeRawRequest(url, {\n ...options,\n headers,\n body,\n })\n }\n\n /**\n * Generic PUT request\n */\n async put<T>(path: string, data?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'PUT',\n headers: this.headers,\n body: data ? JSON.stringify(transformRequest(data)) : undefined,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Generic PATCH request\n */\n async patch<T>(path: string, data?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'PATCH',\n headers: this.headers,\n body: data ? JSON.stringify(transformRequest(data)) : undefined,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Generic DELETE request\n */\n async delete<T>(path: string, data?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'DELETE',\n headers: this.headers,\n body: data ? JSON.stringify(transformRequest(data)) : undefined,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Build full URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n // Ensure versioned base URL is treated as a directory by URL()\n const base = this.baseUrl.endsWith('/') ? this.baseUrl : `${this.baseUrl}/`\n // Avoid leading slash in path which would reset to origin root\n const relPath = path.startsWith('/') ? path.slice(1) : path\n const url = new URL(relPath, base)\n\n if (params) {\n const transformedParams = transformQueryParams(params)\n Object.entries(transformedParams).forEach(([key, value]: [string, string]) => {\n url.searchParams.set(key, value)\n })\n }\n\n return url.toString()\n }\n\n /**\n * Make HTTP request with timeout and error handling\n */\n private async makeRequest(url: string, options: RequestInit): Promise<unknown> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n throw await this.createApiError(response)\n }\n\n // Handle empty responses (like 204 No Content)\n if (response.status === 204) {\n return null\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n return response.json()\n }\n\n return response.text()\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`)\n }\n\n throw error\n }\n }\n\n /**\n * Make HTTP request that returns raw Response (for streaming)\n */\n private async makeRawRequest(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n throw await this.createApiError(response)\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`)\n }\n\n throw error\n }\n }\n\n /**\n * Handle error responses\n */\n private async createApiError(response: Response): Promise<RuntypeApiError> {\n let errorData: unknown\n\n try {\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n errorData = await response.json()\n } else {\n errorData = { error: await response.text() }\n }\n } catch {\n errorData = { error: 'Unknown error occurred' }\n }\n\n const message =\n isObjectRecord(errorData) &&\n (typeof errorData.error === 'string' || typeof errorData.message === 'string')\n ? (errorData.error as string | undefined) ||\n (errorData.message as string | undefined) ||\n 'Request failed'\n : 'Request failed'\n\n return new RuntypeApiError(\n message,\n response.status,\n errorData,\n new Headers(response.headers),\n response.statusText\n )\n }\n}\n\n/**\n * Custom error class for Runtype API errors\n */\nexport class RuntypeApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public data?: unknown,\n public headers?: Headers,\n public statusText?: string\n ) {\n super(message)\n this.name = 'RuntypeApiError'\n }\n}\n\n/**\n * Convenience function to create a new RuntypeClient instance\n */\nexport function createClient(config?: ClientConfig): RuntypeClient {\n return new RuntypeClient(config)\n}\n","// ============================================================================\n// Runtype SDK - Public API\n// ============================================================================\n\nexport { Runtype } from './runtype'\nexport type { RuntypeConfig } from './runtype'\n\n// Flows namespace exports\nexport { FlowsNamespace, RuntypeFlowBuilder } from './flows-namespace'\nexport type {\n FlowConfig as RuntypeFlowConfig,\n UpsertFlowConfig as RuntypeUpsertFlowConfig,\n RecordConfig as RuntypeRecordConfig,\n Message as RuntypeMessage,\n PromptStepConfig as RuntypePromptStepConfig,\n FetchUrlStepConfig as RuntypeFetchUrlStepConfig,\n TransformDataStepConfig as RuntypeTransformDataStepConfig,\n SetVariableStepConfig as RuntypeSetVariableStepConfig,\n ConditionalStepConfig as RuntypeConditionalStepConfig,\n SearchStepConfig as RuntypeSearchStepConfig,\n SendEmailStepConfig as RuntypeSendEmailStepConfig,\n SendStreamStepConfig as RuntypeSendStreamStepConfig,\n RetrieveRecordStepConfig as RuntypeRetrieveRecordStepConfig,\n UpsertRecordStepConfig as RuntypeUpsertRecordStepConfig,\n VectorSearchStepConfig as RuntypeVectorSearchStepConfig,\n GenerateEmbeddingStepConfig as RuntypeGenerateEmbeddingStepConfig,\n WaitUntilStepConfig as RuntypeWaitUntilStepConfig,\n SendEventStepConfig as RuntypeSendEventStepConfig,\n SendTextStepConfig as RuntypeSendTextStepConfig,\n FetchGitHubStepConfig as RuntypeFetchGitHubStepConfig,\n} from './flows-namespace'\n\n// Batches namespace exports\nexport { BatchesNamespace } from './batches-namespace'\nexport type { BatchScheduleConfig, BatchStatus, BatchListParams } from './batches-namespace'\n\n// Evals namespace exports\nexport { EvalsNamespace, EvalRunner } from './evals-namespace'\nexport type {\n ModelOverride as RuntypeModelOverride,\n EvalRunConfig,\n EvalStatus,\n EvalListParams,\n} from './evals-namespace'\n\n// Prompts namespace exports\nexport { PromptsNamespace, PromptRunner } from './prompts-namespace'\nexport type {\n CreatePromptData,\n UpdatePromptData,\n Prompt as RuntypePrompt,\n PromptRunOptions,\n PromptListParams,\n} from './prompts-namespace'\n\n// ============================================================================\n// Legacy API (RuntypeClient) - Maintained for backward compatibility\n// ============================================================================\n\nexport { RuntypeClient, RuntypeApiError, createClient } from './client'\nexport * from './types'\nexport * from './endpoints'\n\n// FlowBuilder exports (legacy)\nexport { FlowBuilder, ClientFlowBuilder, createExternalTool } from './flow-builder'\nexport type {\n // Step configs\n PromptStepConfig,\n FetchUrlStepConfig,\n TransformDataStepConfig,\n SetVariableStepConfig,\n ConditionalStepConfig,\n SearchStepConfig,\n SendEmailStepConfig,\n SendStreamStepConfig,\n RetrieveRecordStepConfig,\n UpsertRecordStepConfig,\n VectorSearchStepConfig,\n GenerateEmbeddingStepConfig,\n WaitUntilStepConfig,\n SendEventStepConfig,\n SendTextStepConfig,\n FetchGitHubStepConfig,\n // Builder configs\n FlowConfig,\n UpsertFlowConfig,\n RecordConfig,\n DispatchOptions,\n DispatchClient,\n Message,\n // Streaming types\n FlowStartEvent,\n StepStartEvent,\n StepDeltaEvent,\n /** @deprecated Use StepDeltaEvent instead */\n StepChunkEvent,\n StepCompleteEvent,\n FlowCompleteEvent,\n FlowErrorEvent,\n FlowPausedEvent,\n StepWaitingLocalEvent,\n // Fallback event types\n FallbacksInitiatedEvent,\n FallbackStartEvent,\n FallbackSuccessEvent,\n FallbackFailEvent,\n FallbacksExhaustedEvent,\n StreamEvent,\n StreamCallbacks,\n FlowSummary,\n} from './flow-builder'\n\n// Runtime tools types (re-exported from types.ts via export * from './types')\n// RuntimeTool, RuntimeToolConfig, RuntimeExternalToolConfig,\n// RuntimeCustomToolConfig, RuntimeFlowToolConfig, ToolsConfig\n\n// FlowResult for processing streaming responses\nexport { FlowResult } from './flow-result'\n\n// Stream utilities\nexport { parseSSEChunk, parseFinalBuffer, processStream, streamEvents } from './stream-utils'\n\n// Generated runtime tool gating helpers\nexport {\n evaluateGeneratedRuntimeToolProposal,\n buildGeneratedRuntimeToolGateOutput,\n attachRuntimeToolsToDispatchRequest,\n applyGeneratedRuntimeToolProposalToDispatchRequest,\n} from './generated-tool-gate'\nexport type {\n GeneratedRuntimeToolGateOptions,\n GeneratedRuntimeToolGateDecision,\n AttachRuntimeToolsOptions,\n ApplyGeneratedProposalOptions,\n ApplyGeneratedProposalResult,\n} from './generated-tool-gate'\n\n// BatchBuilder exports (legacy)\nexport { BatchBuilder, ClientBatchBuilder } from './batch-builder'\nexport type { BatchOptions, BatchRequest, BatchResult, BatchClient } from './batch-builder'\n\n// EvalBuilder exports (legacy)\nexport { EvalBuilder, ClientEvalBuilder } from './eval-builder'\nexport type {\n ModelOverride,\n EvalOptions,\n EvalRecord,\n EvalRequest,\n EvalResult,\n EvalClient,\n} from './eval-builder'\n\n// Error handling types\nexport type {\n ErrorHandlingMode,\n PromptErrorHandling,\n ContextErrorHandling,\n PromptFallback,\n ContextFallback,\n RetryFallback,\n ModelFallback,\n StepFallback,\n FlowFallback,\n} from './error-handling-types'\n\n// Workflow types and default workflow\nexport * from './workflow-types'\nexport { defaultWorkflow, deployWorkflow } from './workflows'\nexport {\n normalizeCandidatePath,\n isMarathonArtifactPath,\n isDiscoveryToolName,\n isPreservationSensitiveTask,\n getLikelySupportingCandidatePaths,\n getDefaultPlanPath,\n sanitizeTaskSlug,\n} from './workflow-utils'\n\n// Client token types\nexport type {\n ClientToken,\n CreateClientTokenRequest,\n CreateClientTokenResponse,\n UpdateClientTokenRequest,\n ClientTokenConfig,\n ClientWidgetTheme,\n ClientTokenEnvironment,\n ClientTokenVersionPin,\n ClientConversation,\n ListConversationsResponse,\n} from './client-token-types'\n","/**\n * BatchBuilder - Fluent builder for batch operations\n *\n * Provides a chainable API for building batch dispatch configurations\n * that execute a flow across multiple records of the same type.\n *\n * @example\n * ```typescript\n * import { BatchBuilder } from '@runtypelabs/sdk'\n *\n * const batch = await new BatchBuilder()\n * .useFlow('flow_abc123')\n * .forRecordType('customer')\n * .withOptions({ async: true })\n * .run(apiClient)\n * ```\n */\n\nimport type { DispatchClient } from './flow-builder'\n\n// ============================================================================\n// Batch Configuration Interfaces\n// ============================================================================\n\nexport interface BatchOptions {\n /** Run batch asynchronously (default: true) */\n async?: boolean\n /** Maximum concurrent executions */\n concurrency?: number\n /** Continue on individual record failures */\n continueOnError?: boolean\n /** Store results for each record */\n storeResults?: boolean\n /** Model override for batch execution */\n modelOverride?: string\n}\n\nexport interface BatchRequest {\n flowId: string\n recordType: string\n options?: BatchOptions\n /** Optional filter for records */\n filter?: Record<string, any>\n /** Optional limit on number of records */\n limit?: number\n}\n\nexport interface BatchResult {\n batchId: string\n status: 'queued' | 'running' | 'completed' | 'failed'\n totalRecords: number\n processedRecords: number\n failedRecords: number\n}\n\n// ============================================================================\n// BatchBuilder Class\n// ============================================================================\n\nexport class BatchBuilder {\n private flowId: string = ''\n private recordType: string = ''\n private batchOptions: BatchOptions = {}\n private filterConfig: Record<string, any> | undefined\n private limitConfig: number | undefined\n\n /**\n * Specify the flow to execute for each record\n */\n useFlow(flowId: string): this {\n this.flowId = flowId\n return this\n }\n\n /**\n * Specify the record type to batch process\n */\n forRecordType(recordType: string): this {\n this.recordType = recordType\n return this\n }\n\n /**\n * Set batch execution options\n */\n withOptions(options: BatchOptions): this {\n this.batchOptions = { ...this.batchOptions, ...options }\n return this\n }\n\n /**\n * Filter records to process\n *\n * @example\n * ```typescript\n * .withFilter({ status: 'pending', createdAt: { $gt: '2024-01-01' } })\n * ```\n */\n withFilter(filter: Record<string, any>): this {\n this.filterConfig = filter\n return this\n }\n\n /**\n * Limit the number of records to process\n */\n withLimit(limit: number): this {\n this.limitConfig = limit\n return this\n }\n\n /**\n * Build the batch request configuration\n */\n build(): BatchRequest {\n if (!this.flowId) {\n throw new Error('BatchBuilder: flowId is required. Call .useFlow(flowId) first.')\n }\n if (!this.recordType) {\n throw new Error('BatchBuilder: recordType is required. Call .forRecordType(type) first.')\n }\n\n const request: BatchRequest = {\n flowId: this.flowId,\n recordType: this.recordType,\n }\n\n if (Object.keys(this.batchOptions).length > 0) {\n request.options = this.batchOptions\n }\n\n if (this.filterConfig) {\n request.filter = this.filterConfig\n }\n\n if (this.limitConfig !== undefined) {\n request.limit = this.limitConfig\n }\n\n return request\n }\n\n /**\n * Execute the batch operation\n *\n * @param client - Client with batch dispatch capability\n * @returns BatchResult with batch status\n */\n async run(client: BatchClient): Promise<BatchResult> {\n const config = this.build()\n return client.batch(config)\n }\n}\n\n// ============================================================================\n// Client Interface for Batch Execution\n// ============================================================================\n\n/**\n * Interface for clients that can execute batch operations\n */\nexport interface BatchClient {\n batch(config: BatchRequest): Promise<BatchResult>\n}\n\n/**\n * BatchBuilder that is bound to a client for direct execution\n */\nexport class ClientBatchBuilder extends BatchBuilder {\n private boundClient: BatchClient\n\n constructor(client: BatchClient) {\n super()\n this.boundClient = client\n }\n\n /**\n * Execute the batch using the bound client\n */\n async run(): Promise<BatchResult> {\n const config = this.build()\n return this.boundClient.batch(config)\n }\n}\n","/**\n * EvalBuilder - Fluent builder for evaluation runs\n *\n * Provides a chainable API for building evaluation configurations\n * that test flows against records with model overrides and comparisons.\n *\n * @example\n * ```typescript\n * import { EvalBuilder } from '@runtypelabs/sdk'\n *\n * // Single model eval with overrides\n * const eval1 = await new EvalBuilder()\n * .useFlow('flow_abc123')\n * .forRecordType('test_data')\n * .withModelOverrides([{ stepName: 'Analyze', model: 'gpt-4o' }])\n * .run(apiClient)\n *\n * // Multi-model comparison\n * const eval2 = await new EvalBuilder()\n * .useFlow('flow_abc123')\n * .forRecordType('test_data')\n * .compareModels([\n * { stepName: 'Analyze', model: 'gpt-4o' },\n * { stepName: 'Analyze', model: 'claude-3-opus' },\n * ])\n * .run(apiClient)\n *\n * // Virtual flow eval\n * const eval3 = await new EvalBuilder()\n * .useVirtualFlow(flowBuilder)\n * .forRecordType('test_data')\n * .run(apiClient)\n * ```\n */\n\nimport type { FlowBuilder, DispatchClient } from './flow-builder'\n\n// ============================================================================\n// Eval Configuration Interfaces\n// ============================================================================\n\nexport interface ModelOverride {\n /** Name of the step to override */\n stepName: string\n /** Model to use for this step */\n model: string\n /** Optional temperature override */\n temperature?: number\n /** Optional max tokens override */\n maxTokens?: number\n}\n\nexport interface EvalOptions {\n /** Store evaluation results */\n storeResults?: boolean\n /** Run evaluations in parallel */\n parallel?: boolean\n /** Maximum concurrent evaluations */\n concurrency?: number\n /** Continue on individual record failures */\n continueOnError?: boolean\n}\n\nexport interface EvalRecord {\n /** Record name */\n name: string\n /** Record type */\n type: string\n /** Record metadata */\n metadata: Record<string, any>\n}\n\nexport interface EvalRequest {\n /** Flow ID (for existing flow) */\n flowId?: string\n /** Virtual flow definition */\n flow?: {\n name: string\n steps: any[]\n }\n /** Record type to evaluate against */\n recordType?: string\n /** Inline records for ad-hoc evaluation */\n records?: EvalRecord[]\n /** Model overrides for evaluation */\n modelOverrides?: ModelOverride[]\n /** Multiple model configurations for comparison */\n modelConfigs?: ModelOverride[][]\n /** Eval options */\n options?: EvalOptions\n /** Optional filter for records */\n filter?: Record<string, any>\n /** Optional limit on number of records */\n limit?: number\n}\n\nexport interface EvalResult {\n evalId: string\n status: 'running' | 'completed' | 'failed'\n totalRecords: number\n completedRecords: number\n failedRecords: number\n /** Results grouped by model config (for multi-model eval) */\n results?: Array<{\n modelConfig: ModelOverride[]\n records: Array<{\n recordId: string\n status: 'success' | 'error'\n result?: any\n error?: string\n executionTime: number\n }>\n }>\n}\n\n// ============================================================================\n// EvalBuilder Class\n// ============================================================================\n\nexport class EvalBuilder {\n private flowId: string | undefined\n private virtualFlow: { name: string; steps: any[] } | undefined\n private recordType: string | undefined\n private inlineRecords: EvalRecord[] | undefined\n private modelOverrides: ModelOverride[] | undefined\n private modelConfigs: ModelOverride[][] | undefined\n private evalOptions: EvalOptions = {}\n private filterConfig: Record<string, any> | undefined\n private limitConfig: number | undefined\n\n /**\n * Use an existing flow by ID for evaluation\n */\n useFlow(flowId: string): this {\n this.flowId = flowId\n this.virtualFlow = undefined\n return this\n }\n\n /**\n * Use a virtual flow (from FlowBuilder) for evaluation\n *\n * @example\n * ```typescript\n * const flowBuilder = new FlowBuilder()\n * .createFlow({ name: 'Test Flow' })\n * .prompt({ name: 'Analyze', model: 'gpt-4', userPrompt: '...' })\n *\n * const eval = await new EvalBuilder()\n * .useVirtualFlow(flowBuilder)\n * .forRecordType('test_data')\n * .run(apiClient)\n * ```\n */\n useVirtualFlow(builder: FlowBuilder): this {\n const config = builder.build()\n if (config.flow && 'name' in config.flow && 'steps' in config.flow) {\n this.virtualFlow = {\n name: config.flow.name as string,\n steps: config.flow.steps as any[],\n }\n }\n this.flowId = undefined\n return this\n }\n\n /**\n * Specify the record type to evaluate against\n */\n forRecordType(recordType: string): this {\n this.recordType = recordType\n this.inlineRecords = undefined\n return this\n }\n\n /**\n * Use inline records for ad-hoc evaluation (no record type lookup)\n *\n * @example\n * ```typescript\n * .withRecords([\n * { name: 'Test 1', type: 'test', metadata: { input: 'hello' } },\n * { name: 'Test 2', type: 'test', metadata: { input: 'world' } },\n * ])\n * ```\n */\n withRecords(records: EvalRecord[]): this {\n this.inlineRecords = records\n this.recordType = undefined\n return this\n }\n\n /**\n * Set model overrides for single-model evaluation\n *\n * @example\n * ```typescript\n * .withModelOverrides([\n * { stepName: 'Analyze', model: 'gpt-4o', temperature: 0.2 }\n * ])\n * ```\n */\n withModelOverrides(overrides: ModelOverride[]): this {\n this.modelOverrides = overrides\n this.modelConfigs = undefined\n return this\n }\n\n /**\n * Compare multiple model configurations\n *\n * @example\n * ```typescript\n * .compareModels([\n * [{ stepName: 'Analyze', model: 'gpt-4o' }],\n * [{ stepName: 'Analyze', model: 'claude-3-opus' }],\n * [{ stepName: 'Analyze', model: 'gemini-pro' }],\n * ])\n * ```\n */\n compareModels(configs: ModelOverride[][]): this {\n this.modelConfigs = configs\n this.modelOverrides = undefined\n return this\n }\n\n /**\n * Set evaluation options\n */\n withOptions(options: EvalOptions): this {\n this.evalOptions = { ...this.evalOptions, ...options }\n return this\n }\n\n /**\n * Filter records to evaluate\n */\n withFilter(filter: Record<string, any>): this {\n this.filterConfig = filter\n return this\n }\n\n /**\n * Limit the number of records to evaluate\n */\n withLimit(limit: number): this {\n this.limitConfig = limit\n return this\n }\n\n /**\n * Build the eval request configuration\n */\n build(): EvalRequest {\n if (!this.flowId && !this.virtualFlow) {\n throw new Error(\n 'EvalBuilder: flow is required. Call .useFlow(id) or .useVirtualFlow(builder) first.'\n )\n }\n if (!this.recordType && !this.inlineRecords) {\n throw new Error(\n 'EvalBuilder: records are required. Call .forRecordType(type) or .withRecords([...]) first.'\n )\n }\n\n const request: EvalRequest = {}\n\n if (this.flowId) {\n request.flowId = this.flowId\n } else if (this.virtualFlow) {\n request.flow = this.virtualFlow\n }\n\n if (this.recordType) {\n request.recordType = this.recordType\n } else if (this.inlineRecords) {\n request.records = this.inlineRecords\n }\n\n if (this.modelOverrides) {\n request.modelOverrides = this.modelOverrides\n } else if (this.modelConfigs) {\n request.modelConfigs = this.modelConfigs\n }\n\n if (Object.keys(this.evalOptions).length > 0) {\n request.options = this.evalOptions\n }\n\n if (this.filterConfig) {\n request.filter = this.filterConfig\n }\n\n if (this.limitConfig !== undefined) {\n request.limit = this.limitConfig\n }\n\n return request\n }\n\n /**\n * Execute the evaluation\n *\n * @param client - Client with eval capability\n * @returns EvalResult with evaluation status and results\n */\n async run(client: EvalClient): Promise<EvalResult> {\n const config = this.build()\n return client.eval(config)\n }\n}\n\n// ============================================================================\n// Client Interface for Eval Execution\n// ============================================================================\n\n/**\n * Interface for clients that can execute evaluations\n */\nexport interface EvalClient {\n eval(config: EvalRequest): Promise<EvalResult>\n}\n\n/**\n * EvalBuilder that is bound to a client for direct execution\n */\nexport class ClientEvalBuilder extends EvalBuilder {\n private boundClient: EvalClient\n\n constructor(client: EvalClient) {\n super()\n this.boundClient = client\n }\n\n /**\n * Execute the evaluation using the bound client\n */\n async run(): Promise<EvalResult> {\n const config = this.build()\n return this.boundClient.eval(config)\n }\n}\n"],"mappings":"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","names":["streamEvents","classifyVariant","events","messages","content","recoveryMessage","record","RuntypeClient","streamEvents"]}
1
+ {"version":3,"sources":["../src/stream-utils.ts","../src/flow-result.ts","../src/flows-namespace.ts","../src/batches-namespace.ts","../src/evals-namespace.ts","../src/prompts-namespace.ts","../src/transform.ts","../src/runtype.ts","../src/generated-tool-gate.ts","../src/workflow-utils.ts","../src/workflows/default-workflow.ts","../src/workflows/deploy-workflow.ts","../src/workflows/game-workflow.ts","../src/endpoints.ts","../src/flow-builder.ts","../src/client.ts","../src/index.ts","../src/batch-builder.ts","../src/eval-builder.ts"],"sourcesContent":["/**\n * SSE Stream Utilities for FlowBuilder\n *\n * Provides utilities for parsing Server-Sent Events (SSE) streams\n * from the Runtype API dispatch endpoint.\n */\n\nimport type {\n StreamCallbacks,\n StreamEvent,\n StepDeltaEvent,\n FlowSummary,\n} from './flow-builder'\n\n// ============================================================================\n// SSE Parsing Utilities\n// ============================================================================\n\n/**\n * Parse SSE stream chunks into individual events\n *\n * @param chunk - New chunk from the stream\n * @param buffer - Previous incomplete buffer\n * @returns Parsed events and remaining buffer\n */\nexport function parseSSEChunk(\n chunk: string,\n buffer: string\n): { events: string[]; remainingBuffer: string } {\n buffer += chunk\n const lines = buffer.split('\\n')\n const remainingBuffer = lines.pop() || ''\n\n const events: string[] = []\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6).trim()\n if (jsonStr && jsonStr !== '[DONE]') {\n events.push(jsonStr)\n }\n }\n }\n\n return { events, remainingBuffer }\n}\n\n/**\n * Parse final buffer if it contains a complete event\n *\n * @param buffer - Remaining buffer after stream ends\n * @returns Parsed event JSON string or null\n */\nexport function parseFinalBuffer(buffer: string): string | null {\n const trimmed = buffer.trim()\n if (!trimmed) return null\n\n // Handle standard SSE format: \"event: <type>\\ndata: <json>\"\n if (trimmed.startsWith('event: ')) {\n const dataIndex = trimmed.indexOf('\\ndata: ')\n if (dataIndex !== -1) {\n const jsonStr = trimmed.slice(dataIndex + 7).trim()\n if (jsonStr && jsonStr !== '[DONE]') {\n return jsonStr\n }\n }\n return null\n }\n\n // Handle data-only format: \"data: <json>\"\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.slice(6).trim()\n if (jsonStr && jsonStr !== '[DONE]') {\n return jsonStr\n }\n }\n return null\n}\n\n// ============================================================================\n// Stream Processing\n// ============================================================================\n\n/**\n * Process a streaming response with callbacks\n *\n * @param response - Fetch Response object with streaming body\n * @param callbacks - Callbacks for different event types\n * @returns Promise resolving to FlowSummary when complete\n *\n * @example\n * ```typescript\n * const response = await client.dispatch(config)\n * const summary = await processStream(response, {\n * onStepDelta: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: (event) => console.log('Done!'),\n * })\n * ```\n */\nexport async function processStream(\n response: Response,\n callbacks: StreamCallbacks = {}\n): Promise<FlowSummary> {\n if (!response.ok) {\n const error = new Error(`HTTP ${response.status}: ${response.statusText}`)\n callbacks.onError?.(error)\n throw error\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n const error = new Error('Response body is not readable')\n callbacks.onError?.(error)\n throw error\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n // Track results for summary\n const results = new Map<string, any>()\n let flowSummary: Partial<FlowSummary> = {\n flowId: '',\n flowName: '',\n totalSteps: 0,\n successfulSteps: 0,\n failedSteps: 0,\n executionTime: 0,\n success: true,\n }\n\n // Check if content-type is application/json (non-streaming response)\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n try {\n const data = await response.json()\n\n // Check if this is a structured non-streaming response with events\n if (data.events && Array.isArray(data.events)) {\n for (const event of data.events) {\n handleEvent(event, callbacks, results, flowSummary)\n }\n\n // Also populate summary from top-level fields if available\n if (data.flowId) flowSummary.flowId = data.flowId\n if (data.recordId) flowSummary.flowName = data.recordId // Mapping might be loose here\n\n // Use execution summary if present\n if (data.executionSummary) {\n const s = data.executionSummary\n if (s.flowId) flowSummary.flowId = s.flowId\n if (s.flowName) flowSummary.flowName = s.flowName\n if (s.totalSteps) flowSummary.totalSteps = s.totalSteps\n if (s.successfulSteps) flowSummary.successfulSteps = s.successfulSteps\n if (s.failedSteps) flowSummary.failedSteps = s.failedSteps\n if (s.executionTime) flowSummary.executionTime = s.executionTime\n }\n\n return {\n flowId: flowSummary.flowId || '',\n flowName: flowSummary.flowName || '',\n totalSteps: flowSummary.totalSteps || 0,\n successfulSteps: flowSummary.successfulSteps || 0,\n failedSteps: flowSummary.failedSteps || 0,\n executionTime: flowSummary.executionTime || 0,\n results,\n success: flowSummary.success ?? true,\n }\n }\n\n // Handle JSON responses without events array (API returned non-streaming response)\n // This can happen if stream_response wasn't properly sent to the API\n if (data.error) {\n const error = new Error(data.error)\n callbacks.onError?.(error)\n throw error\n }\n\n // For unexpected JSON formats, throw an error rather than falling through\n // to SSE parsing (the body is already consumed)\n throw new Error(\n `Unexpected API response format. Expected SSE stream but received JSON: ${JSON.stringify(data).slice(0, 200)}`\n )\n } catch (e) {\n // Only fall back to stream parsing if JSON parsing itself failed (SyntaxError)\n // NOT if we got valid JSON with unexpected structure\n if (e instanceof SyntaxError) {\n console.warn('Failed to parse JSON response, falling back to stream parsing', e)\n } else {\n // Re-throw structural/API errors\n flowSummary.success = false\n throw e\n }\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n const chunk = decoder.decode(value, { stream: true })\n const { events, remainingBuffer } = parseSSEChunk(chunk, buffer)\n buffer = remainingBuffer\n\n for (const eventStr of events) {\n try {\n const event = JSON.parse(eventStr) as StreamEvent\n handleEvent(event, callbacks, results, flowSummary)\n } catch (parseError) {\n // Skip malformed JSON\n console.warn('Failed to parse SSE event:', eventStr)\n }\n }\n }\n\n // Process final buffer\n const finalEvent = parseFinalBuffer(buffer)\n if (finalEvent) {\n try {\n const event = JSON.parse(finalEvent) as StreamEvent\n handleEvent(event, callbacks, results, flowSummary)\n } catch (parseError) {\n // Skip malformed JSON\n }\n }\n } catch (error) {\n flowSummary.success = false\n const err = error instanceof Error ? error : new Error(String(error))\n callbacks.onError?.(err)\n throw err\n } finally {\n reader.releaseLock()\n }\n\n return {\n flowId: flowSummary.flowId || '',\n flowName: flowSummary.flowName || '',\n totalSteps: flowSummary.totalSteps || 0,\n successfulSteps: flowSummary.successfulSteps || 0,\n failedSteps: flowSummary.failedSteps || 0,\n executionTime: flowSummary.executionTime || 0,\n results,\n success: flowSummary.success ?? true,\n }\n}\n\n/**\n * Handle a single SSE event\n */\nfunction handleEvent(\n event: StreamEvent,\n callbacks: StreamCallbacks,\n results: Map<string, any>,\n summary: Partial<FlowSummary>\n): void {\n switch (event.type) {\n case 'flow_start':\n summary.flowId = event.flowId\n summary.flowName = event.flowName\n summary.totalSteps = event.totalSteps\n callbacks.onFlowStart?.(event)\n break\n\n case 'step_start':\n callbacks.onStepStart?.(event)\n break\n\n case 'step_delta': {\n // Normalize API's 'text' field to 'chunk' for consistency\n // The API sends 'text' but our types use 'chunk'\n const chunkText = (event as any).chunk || (event as any).text || ''\n const deltaEvent = event as unknown as StepDeltaEvent\n callbacks.onStepDelta?.(chunkText, deltaEvent)\n // Call deprecated onStepChunk for backwards compatibility\n callbacks.onStepChunk?.(chunkText, deltaEvent)\n break\n }\n\n case 'step_complete':\n results.set(event.name, event.result)\n callbacks.onStepComplete?.(event.result, event)\n break\n\n case 'flow_complete':\n summary.totalSteps = event.totalSteps\n summary.successfulSteps = event.successfulSteps\n summary.failedSteps = event.failedSteps\n summary.executionTime = event.executionTime\n summary.success = event.failedSteps === 0\n callbacks.onFlowComplete?.(event)\n break\n\n case 'flow_error':\n summary.success = false\n callbacks.onError?.(new Error(event.error))\n break\n\n case 'flow_await':\n // Not strictly part of standard FlowSummary but useful for debugging\n // The client.ts runWithLocalTools handles this for logic flow\n break\n\n case 'step_await':\n // Notification that local tool execution is pending\n break\n }\n}\n\n// ============================================================================\n// Async Iterator for Advanced Use Cases\n// ============================================================================\n\n/**\n * Create an async iterator over SSE events\n *\n * @param response - Fetch Response object with streaming body\n * @yields Parsed SSE events\n *\n * @example\n * ```typescript\n * const response = await client.dispatch(config)\n * for await (const event of streamEvents(response)) {\n * console.log(event.type, event)\n * }\n * ```\n */\nexport async function* streamEvents(response: Response): AsyncGenerator<StreamEvent> {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n // Check if content-type is application/json (non-streaming response)\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n try {\n const data = await response.json()\n // Yield events from array if present\n if (data.events && Array.isArray(data.events)) {\n for (const event of data.events) {\n yield event\n }\n }\n return\n } catch (e) {\n console.warn('Failed to parse JSON response in streamEvents', e)\n // Fall through to stream parsing if JSON parsing fails?\n // No, body is consumed.\n throw e\n }\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('Response body is not readable')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n const chunk = decoder.decode(value, { stream: true })\n const { events, remainingBuffer } = parseSSEChunk(chunk, buffer)\n buffer = remainingBuffer\n\n for (const eventStr of events) {\n try {\n const event = JSON.parse(eventStr) as StreamEvent\n // Normalize API's 'text' field to 'chunk' for step_delta events\n if (\n event.type === 'step_delta' &&\n 'text' in event &&\n !('chunk' in event)\n ) {\n ;(event as any).chunk = (event as any).text\n }\n yield event\n } catch {\n // Skip malformed JSON\n }\n }\n }\n\n // Process final buffer\n const finalEvent = parseFinalBuffer(buffer)\n if (finalEvent) {\n try {\n const event = JSON.parse(finalEvent) as StreamEvent\n // Normalize API's 'text' field to 'chunk' for step_delta events\n if (\n event.type === 'step_delta' &&\n 'text' in event &&\n !('chunk' in event)\n ) {\n ;(event as any).chunk = (event as any).text\n }\n yield event\n } catch {\n // Skip malformed JSON\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * FlowResult - Wrapper for streaming flow execution responses\n *\n * Provides convenient methods for processing streaming responses\n * from the Runtype API dispatch endpoint.\n */\n\nimport type { StreamCallbacks, FlowSummary } from './flow-builder'\nimport { processStream } from './stream-utils'\n\n/**\n * Result wrapper for flow execution\n *\n * Provides multiple ways to consume the streaming response:\n * - `.stream(callbacks)` - Process with callbacks\n * - `.getResult(stepName)` - Get result from a specific step\n * - `.getAllResults()` - Get all step results\n * - `.raw` - Access the raw Response for manual handling\n *\n * @example\n * ```typescript\n * const result = await flow.run(apiClient, options)\n *\n * // Option 1: Process with callbacks\n * const summary = await result.stream({\n * onStepChunk: (chunk) => process.stdout.write(chunk),\n * })\n *\n * // Option 2: Just get a specific step's result\n * const analysis = await result.getResult('Analyze Data')\n *\n * // Option 3: Get all results\n * const allResults = await result.getAllResults()\n * ```\n */\nexport class FlowResult {\n private response: Response\n private consumed = false\n private cachedSummary: FlowSummary | null = null\n\n constructor(response: Response, summary?: FlowSummary) {\n this.response = response\n if (summary) {\n this.cachedSummary = summary\n this.consumed = true\n }\n }\n\n /**\n * Get the raw Response object for manual handling\n *\n * Note: The response body can only be consumed once.\n * Using this will prevent using other methods like stream() or getResult().\n */\n get raw(): Response {\n return this.response\n }\n\n /**\n * Check if the response has already been consumed\n */\n get isConsumed(): boolean {\n return this.consumed\n }\n\n /**\n * Process the streaming response with callbacks\n *\n * @param callbacks - Callbacks for different event types\n * @returns Promise resolving to FlowSummary when complete\n *\n * @example\n * ```typescript\n * const summary = await result.stream({\n * onStepStart: (event) => console.log('Starting:', event.name),\n * onStepChunk: (chunk) => process.stdout.write(chunk),\n * onStepComplete: (result, event) => console.log('Done:', event.name),\n * onFlowComplete: (event) => console.log('Flow complete!'),\n * })\n * ```\n */\n async stream(callbacks: StreamCallbacks = {}): Promise<FlowSummary> {\n if (this.consumed && this.cachedSummary) {\n // Replay events from cached summary if available?\n // For now, just return the summary immediately as we can't replay the stream.\n // Callbacks for completion might be relevant though.\n if (callbacks.onFlowComplete) {\n callbacks.onFlowComplete({\n type: 'flow_complete',\n flowId: this.cachedSummary.flowId,\n totalSteps: this.cachedSummary.totalSteps,\n successfulSteps: this.cachedSummary.successfulSteps,\n failedSteps: this.cachedSummary.failedSteps,\n executionTime: this.cachedSummary.executionTime,\n })\n }\n return this.cachedSummary\n }\n\n this.ensureNotConsumed()\n this.consumed = true\n\n this.cachedSummary = await processStream(this.response, callbacks)\n return this.cachedSummary\n }\n\n /**\n * Get the result from a specific step by its name\n *\n * Matches against the `name` property you set when creating the step.\n * - **Case-sensitive**: `'Analyze'` ≠ `'analyze'`\n * - **Exact match only**: no partial or fuzzy matching\n * - Returns `undefined` if no step with that name is found\n *\n * @param stepName - The exact step name (from the `name` property when creating the step)\n * @returns The step's result, or undefined if not found\n *\n * @example\n * ```typescript\n * // When building:\n * .prompt({ name: 'Analyze Screenshot', model: 'gpt-4', ... })\n *\n * // When retrieving (must match exactly):\n * const analysis = await result.getResult('Analyze Screenshot') // ✓ Works\n * const analysis = await result.getResult('analyze screenshot') // ✗ undefined\n * ```\n */\n async getResult(stepName: string): Promise<any> {\n const summary = await this.ensureSummary()\n\n // Exact name match only\n if (summary.results.has(stepName)) {\n return summary.results.get(stepName)\n }\n\n return undefined\n }\n\n /**\n * Get all step results as a Map\n *\n * @returns Map of step name to result\n *\n * @example\n * ```typescript\n * const allResults = await result.getAllResults()\n * for (const [stepName, result] of allResults) {\n * console.log(stepName, result)\n * }\n * ```\n */\n async getAllResults(): Promise<Map<string, any>> {\n const summary = await this.ensureSummary()\n return summary.results\n }\n\n /**\n * Get the flow summary after processing\n *\n * @returns FlowSummary with execution details\n */\n async getSummary(): Promise<FlowSummary> {\n return this.ensureSummary()\n }\n\n /**\n * Ensure the stream has been processed and return the summary\n */\n private async ensureSummary(): Promise<FlowSummary> {\n if (this.cachedSummary) {\n return this.cachedSummary\n }\n\n // Process the stream silently to get results\n return this.stream({})\n }\n\n /**\n * Ensure the response hasn't been consumed yet\n */\n private ensureNotConsumed(): void {\n if (this.consumed) {\n throw new Error(\n 'Response has already been consumed. ' +\n 'The streaming response body can only be read once. ' +\n 'Use the cached results from stream(), getResult(), or getAllResults() instead.'\n )\n }\n }\n}\n","/**\n * FlowsNamespace - Static namespace for flow operations\n *\n * Provides factory methods for creating flow builders with different modes:\n * - upsert: Create or update a flow by name\n * - virtual: One-off execution without saving\n * - use: Execute an existing flow by ID\n */\n\nimport type { RuntypeClient } from './runtype'\nimport type { DispatchRequest, MessageContent, ReasoningConfig } from './types'\nimport type {\n ErrorHandlingMode,\n PromptErrorHandling,\n ContextErrorHandling,\n} from './error-handling-types'\nimport { FlowResult } from './flow-result'\nimport { processStream } from './stream-utils'\nimport type { StreamCallbacks, FlowSummary } from './flow-builder'\n\nexport interface LocalToolsOptions {\n localTools?: Record<string, (args: any) => Promise<any>>\n}\n\n// ============================================================================\n// Configuration Interfaces\n// ============================================================================\n\nexport interface FlowConfig {\n name: string\n description?: string\n}\n\nexport interface UpsertFlowConfig extends FlowConfig {\n /** Whether to create a version snapshot before updating (default: true) */\n createVersionOnChange?: boolean\n /** Allow overwriting changes made via dashboard/API (default: false) */\n allowOverwriteExternalChanges?: boolean\n}\n\nexport interface RecordConfig {\n id?: number | string\n name?: string\n type?: string\n metadata?: Record<string, any>\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant'\n content: MessageContent\n}\n\n// ============================================================================\n// Step Configuration Interfaces\n// ============================================================================\n\nexport interface PromptStepConfig {\n name: string\n model: string\n userPrompt: string\n systemPrompt?: string\n previousMessages?: string | Array<{ role: string; content: string }>\n outputVariable?: string\n responseFormat?: 'text' | 'json'\n temperature?: number\n maxTokens?: number\n /** Enable reasoning/extended thinking. Use `true` for defaults or `ReasoningConfig` for fine-grained control */\n reasoning?: boolean | ReasoningConfig\n streamOutput?: boolean\n tools?: {\n toolIds?: string[]\n [key: string]: any\n }\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | PromptErrorHandling\n enabled?: boolean\n}\n\nexport interface FetchUrlStepConfig {\n name: string\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n headers?: Record<string, string>\n body?: string\n responseType?: 'json' | 'text' | 'xml'\n markdownIfAvailable?: boolean\n outputVariable?: string\n fetchMethod?: 'http' | 'firecrawl'\n firecrawl?: {\n formats?: string[]\n [key: string]: any\n }\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface TransformDataStepConfig {\n name: string\n script: string\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SetVariableStepConfig {\n name: string\n variableName: string\n value: string | number | boolean | object\n enabled?: boolean\n}\n\nexport interface ConditionalStepConfig {\n name: string\n condition: string\n trueSteps?: any[]\n falseSteps?: any[]\n enabled?: boolean\n}\n\nexport interface SearchStepConfig {\n name: string\n provider: string\n query: string\n maxResults?: number\n outputVariable?: string\n returnCitations?: boolean\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendEmailStepConfig {\n name: string\n to: string\n from?: string\n subject: string\n html: string\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendStreamStepConfig {\n name: string\n message: string\n enabled?: boolean\n}\n\nexport interface RetrieveRecordStepConfig {\n name: string\n recordType?: string\n recordName?: string\n fieldsToInclude?: string[]\n fieldsToExclude?: string[]\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface UpsertRecordStepConfig {\n name: string\n recordType: string\n recordName?: string\n sourceVariable?: string\n mergeStrategy?: 'merge' | 'replace'\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface VectorSearchStepConfig {\n name: string\n query: string\n recordType?: string\n embeddingModel?: string\n limit?: number\n threshold?: number\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface GenerateEmbeddingStepConfig {\n name: string\n text: string\n embeddingModel?: string\n maxLength?: number\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface WaitUntilStepConfig {\n name: string\n delayMs?: number\n continueOnTimeout?: boolean\n poll?: {\n enabled: boolean\n intervalMs?: number\n maxAttempts?: number\n condition?: string\n }\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendEventStepConfig {\n name: string\n provider: string\n eventName: string\n properties?: Record<string, any>\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendTextStepConfig {\n name: string\n to: string\n from?: string\n message: string\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface FetchGitHubStepConfig {\n name: string\n repository: string\n branch?: string\n path?: string\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\ninterface FlowStep {\n id: string\n type: string\n name: string\n order: number\n enabled: boolean\n config: Record<string, any>\n}\n\ninterface UpsertOptions {\n createVersionOnChange?: boolean\n allowOverwriteExternalChanges?: boolean\n}\n\ninterface DispatchOptions {\n streamResponse?: boolean\n modelOverride?: string\n recordMode?: 'existing' | 'create' | 'virtual'\n flowMode?: 'existing' | 'create' | 'virtual' | 'upsert'\n storeResults?: boolean\n autoAppendMetadata?: boolean\n debugMode?: boolean\n createVersion?: boolean\n versionType?: 'published' | 'draft' | 'test' | 'virtual'\n versionLabel?: string\n versionNotes?: string\n flowVersionId?: string\n upsertOptions?: UpsertOptions\n}\n\n// ============================================================================\n// FlowsNamespace\n// ============================================================================\n\nexport class FlowsNamespace {\n constructor(private getClient: () => RuntypeClient) {}\n\n /**\n * Create or update a flow by name (upsert mode)\n *\n * The recommended pattern for code-first flow management.\n * Creates the flow if it doesn't exist, updates if steps changed.\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.upsert({\n * name: 'My Flow',\n * createVersionOnChange: true\n * })\n * .prompt({ name: 'Analyze', model: 'gpt-4o', userPrompt: '...' })\n * .stream()\n * ```\n */\n upsert(config: UpsertFlowConfig): RuntypeFlowBuilder {\n return new RuntypeFlowBuilder(this.getClient, 'upsert', config)\n }\n\n /**\n * Create a virtual flow (one-off, not saved)\n *\n * Use for temporary or ad-hoc flow execution.\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.virtual({ name: 'Temp Flow' })\n * .prompt({ name: 'Process', model: 'gpt-4o', userPrompt: '...' })\n * .stream()\n * ```\n */\n virtual(config: FlowConfig): RuntypeFlowBuilder {\n return new RuntypeFlowBuilder(this.getClient, 'virtual', config)\n }\n\n /**\n * Use an existing flow by ID\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.use('flow_123')\n * .withRecord({ name: 'Test', type: 'data' })\n * .stream()\n * ```\n */\n use(flowId: string): RuntypeFlowBuilder {\n return new RuntypeFlowBuilder(this.getClient, 'existing', undefined, flowId)\n }\n\n /**\n * Quick execution of an existing flow\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.execute('flow_123', {\n * record: { name: 'Test', type: 'data' },\n * streamResponse: true\n * })\n * ```\n */\n async execute(\n flowId: string,\n options?: {\n record?: RecordConfig\n messages?: Message[]\n streamResponse?: boolean\n }\n ): Promise<FlowResult> {\n const builder = this.use(flowId)\n if (options?.record) builder.withRecord(options.record)\n if (options?.messages) builder.withMessages(options.messages)\n return options?.streamResponse !== false ? builder.stream() : builder.result()\n }\n}\n\n// ============================================================================\n// RuntypeFlowBuilder\n// ============================================================================\n\n/**\n * Fluent builder for constructing and executing flows\n */\nexport class RuntypeFlowBuilder {\n private flowConfig: FlowConfig\n private steps: FlowStep[] = []\n private recordConfig: RecordConfig | undefined\n private messagesConfig: Message[] | undefined\n private stepCounter = 0\n private existingFlowId: string | undefined\n private mode: 'upsert' | 'virtual' | 'existing'\n private upsertOptions: UpsertOptions = {}\n private dispatchOptions: Partial<DispatchOptions> = {}\n\n constructor(\n private getClient: () => RuntypeClient,\n mode: 'upsert' | 'virtual' | 'existing',\n config?: FlowConfig | UpsertFlowConfig,\n flowId?: string\n ) {\n this.mode = mode\n\n if (mode === 'existing' && flowId) {\n this.existingFlowId = flowId\n this.flowConfig = { name: '' }\n } else if (config) {\n const { createVersionOnChange, allowOverwriteExternalChanges, ...flowConfig } =\n config as UpsertFlowConfig\n this.flowConfig = flowConfig\n\n if (mode === 'upsert') {\n this.upsertOptions = {\n createVersionOnChange: createVersionOnChange ?? true,\n ...(allowOverwriteExternalChanges !== undefined && { allowOverwriteExternalChanges }),\n }\n }\n } else {\n this.flowConfig = { name: 'Untitled Flow' }\n }\n }\n\n // ============================================================================\n // Configuration Methods\n // ============================================================================\n\n /**\n * Set the record configuration\n */\n withRecord(config: RecordConfig): this {\n this.recordConfig = config\n return this\n }\n\n /**\n * Set conversation messages\n */\n withMessages(messages: Message[]): this {\n this.messagesConfig = messages\n return this\n }\n\n /**\n * Set dispatch options\n */\n withOptions(options: Partial<DispatchOptions>): this {\n this.dispatchOptions = { ...this.dispatchOptions, ...options }\n return this\n }\n\n // ============================================================================\n // Step Methods\n // ============================================================================\n\n /**\n * Add a prompt step\n */\n prompt(config: PromptStepConfig): this {\n this.addStep(\n 'prompt',\n config.name,\n {\n model: config.model,\n userPrompt: config.userPrompt,\n text: config.userPrompt,\n systemPrompt: config.systemPrompt,\n previousMessages: config.previousMessages,\n outputVariable: config.outputVariable,\n responseFormat: config.responseFormat,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n reasoning: config.reasoning,\n streamOutput: config.streamOutput,\n tools: config.tools,\n errorHandling: config.errorHandling,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a fetch URL step\n */\n fetchUrl(config: FetchUrlStepConfig): this {\n this.addStep(\n 'fetch-url',\n config.name,\n {\n http: {\n url: config.url,\n method: config.method || 'GET',\n headers: config.headers,\n body: config.body,\n },\n responseType: config.responseType,\n markdownIfAvailable: config.markdownIfAvailable,\n fetchMethod: config.fetchMethod,\n firecrawl: config.firecrawl,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a transform data step\n */\n transformData(config: TransformDataStepConfig): this {\n this.addStep(\n 'transform-data',\n config.name,\n {\n script: config.script,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a set variable step\n */\n setVariable(config: SetVariableStepConfig): this {\n this.addStep(\n 'set-variable',\n config.name,\n {\n variableName: config.variableName,\n value: config.value,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a conditional step\n */\n conditional(config: ConditionalStepConfig): this {\n this.addStep(\n 'conditional',\n config.name,\n {\n condition: config.condition,\n trueSteps: config.trueSteps || [],\n falseSteps: config.falseSteps || [],\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a search step\n */\n search(config: SearchStepConfig): this {\n this.addStep(\n 'search',\n config.name,\n {\n provider: config.provider,\n query: config.query,\n maxResults: config.maxResults,\n outputVariable: config.outputVariable,\n returnCitations: config.returnCitations,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send email step\n */\n sendEmail(config: SendEmailStepConfig): this {\n this.addStep(\n 'send-email',\n config.name,\n {\n to: config.to,\n from: config.from || '{{_flow.id}}@runtype.email',\n subject: config.subject,\n html: config.html,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send stream step\n */\n sendStream(config: SendStreamStepConfig): this {\n this.addStep(\n 'send-stream',\n config.name,\n {\n message: config.message,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a retrieve record step\n */\n retrieveRecord(config: RetrieveRecordStepConfig): this {\n this.addStep(\n 'retrieve-record',\n config.name,\n {\n recordType: config.recordType,\n recordName: config.recordName,\n fieldsToInclude: config.fieldsToInclude,\n fieldsToExclude: config.fieldsToExclude,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add an upsert record step\n */\n upsertRecord(config: UpsertRecordStepConfig): this {\n this.addStep(\n 'upsert-record',\n config.name,\n {\n recordType: config.recordType,\n recordName: config.recordName,\n sourceVariable: config.sourceVariable,\n mergeStrategy: config.mergeStrategy,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a vector search step\n */\n vectorSearch(config: VectorSearchStepConfig): this {\n this.addStep(\n 'vector-search',\n config.name,\n {\n query: config.query,\n recordType: config.recordType,\n embeddingModel: config.embeddingModel,\n limit: config.limit,\n threshold: config.threshold,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a generate embedding step\n */\n generateEmbedding(config: GenerateEmbeddingStepConfig): this {\n this.addStep(\n 'generate-embedding',\n config.name,\n {\n inputSource: 'text',\n text: config.text,\n embeddingModel: config.embeddingModel,\n maxLength: config.maxLength,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a wait until step\n */\n waitUntil(config: WaitUntilStepConfig): this {\n this.addStep(\n 'wait-until',\n config.name,\n {\n delayMs: config.delayMs,\n continueOnTimeout: config.continueOnTimeout,\n poll: config.poll,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send event step\n */\n sendEvent(config: SendEventStepConfig): this {\n this.addStep(\n 'send-event',\n config.name,\n {\n provider: config.provider,\n eventName: config.eventName,\n properties: config.properties,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send text step\n */\n sendText(config: SendTextStepConfig): this {\n this.addStep(\n 'send-text',\n config.name,\n {\n to: config.to,\n from: config.from,\n message: config.message,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a fetch GitHub step\n */\n fetchGitHub(config: FetchGitHubStepConfig): this {\n this.addStep(\n 'fetch-github',\n config.name,\n {\n repository: config.repository,\n branch: config.branch,\n path: config.path,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n // ============================================================================\n // Terminal Methods\n // ============================================================================\n\n /**\n * Execute the flow with streaming response\n *\n * Returns a FlowResult that streams chunks as they arrive.\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.upsert({ name: 'My Flow' })\n * .prompt({ ... })\n * .stream()\n *\n * // Process with callbacks\n * await result.stream({\n * onStepChunk: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: () => console.log('Done!'),\n * })\n *\n * // With local tools\n * await result.stream({\n * localTools: { ... }\n * })\n * ```\n */\n stream(callbacks: StreamCallbacks, options: LocalToolsOptions): Promise<FlowResult>\n stream(callbacks?: StreamCallbacks): Promise<FlowResult>\n stream(options: LocalToolsOptions): Promise<FlowResult>\n async stream(\n arg1?: StreamCallbacks | LocalToolsOptions,\n arg2?: LocalToolsOptions\n ): Promise<FlowResult> {\n const config = this.build()\n\n let callbacks: StreamCallbacks | undefined\n let localTools: Record<string, (args: any) => Promise<any>> | undefined\n\n if (arg1) {\n if ('localTools' in arg1) {\n localTools = (arg1 as LocalToolsOptions).localTools\n } else {\n callbacks = arg1 as StreamCallbacks\n if (arg2) {\n localTools = arg2.localTools\n }\n }\n }\n\n // Handle local tools if provided\n if (localTools) {\n return this.runWithLocalTools(localTools, callbacks)\n }\n\n config.options = { ...config.options, streamResponse: true }\n\n const client = this.getClient()\n const response = await client.dispatch(config)\n\n const result = new FlowResult(response)\n\n // If callbacks provided, process immediately\n if (callbacks) {\n await result.stream(callbacks)\n }\n\n return result\n }\n\n /**\n * Execute the flow and wait for complete result (no streaming)\n *\n * Returns a FlowResult after all steps have completed.\n *\n * @example\n * ```typescript\n * const result = await Runtype.flows.use('flow_123')\n * .withRecord({ ... })\n * .result()\n *\n * const analysis = await result.getResult('Analyze')\n * const allResults = await result.getAllResults()\n * ```\n */\n async result(options?: LocalToolsOptions): Promise<FlowResult> {\n const config = this.build()\n\n // Handle local tools if provided\n if (options?.localTools) {\n return this.runWithLocalTools(options.localTools)\n }\n\n config.options = { ...config.options, streamResponse: true }\n\n const client = this.getClient()\n const response = await client.dispatch(config)\n\n const result = new FlowResult(response)\n // Pre-process the stream to cache results\n await result.getSummary()\n\n return result\n }\n\n /**\n * Execute the flow with local tools (automatic pause/resume loop)\n *\n * @param localTools - Map of tool names to async functions that execute the tool logic\n * @returns The final result of the flow execution\n */\n async runWithLocalTools(\n localTools: Record<string, (args: any) => Promise<any>>,\n callbacks?: StreamCallbacks\n ): Promise<FlowResult> {\n const config = this.build()\n const isStreaming = !!callbacks\n\n // Force options\n config.options = {\n ...config.options,\n streamResponse: isStreaming,\n }\n\n const client = this.getClient()\n\n // Accumulated results across pause/resume cycles - moved outside processStep\n // so results persist when flow pauses and resumes\n const accumulatedSummary: Partial<FlowSummary> = {\n results: new Map(),\n success: true,\n }\n\n // Helper to process a step result (either from stream or JSON)\n const processStep = async (response: Response): Promise<{ done: boolean; result: any }> => {\n if (isStreaming) {\n // Stream processing\n let pausedState: { toolName: string; parameters: any; executionId: string } | null = null\n\n // Wrap user callbacks to intercept paused event\n const wrappedCallbacks: StreamCallbacks = {\n ...callbacks,\n onFlowStart: (event) => callbacks?.onFlowStart?.(event),\n onStepStart: (event) => callbacks?.onStepStart?.(event),\n onStepChunk: (chunk, event) => callbacks?.onStepChunk?.(chunk, event),\n onStepComplete: (result, event) => callbacks?.onStepComplete?.(result, event),\n onFlowComplete: (event) => callbacks?.onFlowComplete?.(event),\n onError: (error) => callbacks?.onError?.(error),\n }\n\n // Use streamEvents from stream-utils\n const { streamEvents } = await import('./stream-utils')\n\n try {\n for await (const event of streamEvents(response)) {\n if ((event as any).type === 'flow_await') {\n pausedState = {\n toolName: (event as any).toolName,\n parameters: (event as any).parameters,\n executionId: (event as any).executionId,\n } as any\n }\n\n if ((event as any).type === 'step_await') {\n pausedState = {\n toolName: (event as any).toolName,\n parameters: (event as any).parameters,\n executionId: (event as any).executionId,\n }\n }\n\n // Handle standard events via callbacks\n switch (event.type) {\n case 'flow_start':\n wrappedCallbacks.onFlowStart?.(event)\n break\n case 'step_start':\n wrappedCallbacks.onStepStart?.(event)\n break\n case 'step_delta': {\n // Normalize API's 'text' field to 'chunk' for consistency\n const chunkText = (event as any).chunk || (event as any).text || ''\n wrappedCallbacks.onStepChunk?.(chunkText, event)\n break\n }\n case 'step_complete': {\n // Accumulate results in the outer summary that persists across pause/resume\n accumulatedSummary.results?.set(event.name, event.result)\n wrappedCallbacks.onStepComplete?.(event.result, event)\n break\n }\n case 'flow_complete':\n wrappedCallbacks.onFlowComplete?.(event)\n break\n case 'flow_error':\n wrappedCallbacks.onError?.(new Error(event.error))\n break\n }\n }\n } catch (e) {\n wrappedCallbacks.onError?.(e instanceof Error ? e : new Error(String(e)))\n throw e\n }\n\n if (pausedState) {\n return {\n done: false,\n result: { status: 'paused', pausedReason: { type: 'local_action', ...pausedState } },\n }\n }\n\n return { done: true, result: accumulatedSummary as FlowSummary }\n } else {\n // Non-streaming (JSON)\n const data = await response.json()\n return {\n done: data.status !== 'paused',\n result: data,\n }\n }\n }\n\n // Initial dispatch\n let currentResponse: Response\n if (isStreaming) {\n currentResponse = await client.dispatch(config)\n } else {\n const data = await client.post<any>('/dispatch', config)\n currentResponse = new Response(JSON.stringify(data), {\n headers: { 'content-type': 'application/json' },\n })\n }\n\n // Loop\n while (true) {\n const { done, result } = await processStep(currentResponse)\n\n if (done) {\n if (isStreaming) {\n // Create FlowResult with summary\n const finalResponse = new Response(JSON.stringify(result), {\n headers: { 'content-type': 'application/json' },\n })\n return new FlowResult(finalResponse, result as FlowSummary)\n }\n return new FlowResult(\n new Response(JSON.stringify(result), { headers: { 'content-type': 'application/json' } })\n )\n }\n\n // Handle Pause\n if (result.status === 'paused' && result.pausedReason?.type === 'local_action') {\n const { toolName, parameters, executionId } = result.pausedReason\n\n if (!localTools[toolName]) {\n throw new Error(`Local tool \"${toolName}\" required but not provided in localTools map`)\n }\n\n try {\n // Execute local tool logic\n const toolResult = await localTools[toolName](parameters)\n\n // Resume flow execution - API expects camelCase field names\n const resumeData = {\n executionId: executionId,\n toolOutputs: { [toolName]: toolResult },\n streamResponse: isStreaming,\n }\n\n if (isStreaming) {\n currentResponse = await client.requestStream('/dispatch/resume', {\n method: 'POST',\n body: JSON.stringify(resumeData),\n })\n } else {\n const data = await client.post('/dispatch/resume', resumeData)\n currentResponse = new Response(JSON.stringify(data), {\n headers: { 'content-type': 'application/json' },\n })\n }\n } catch (error) {\n throw new Error(\n `Error executing local tool \"${toolName}\": ${error instanceof Error ? error.message : String(error)}`\n )\n }\n } else {\n break\n }\n }\n\n throw new Error('Unexpected end of flow execution loop')\n }\n build(): DispatchRequest {\n const flowMode = this.mode === 'existing' ? 'existing' : this.mode\n\n const flow = this.existingFlowId\n ? { id: this.existingFlowId }\n : { name: this.flowConfig.name, steps: this.steps }\n\n const request: DispatchRequest = { flow }\n\n if (this.recordConfig) {\n request.record = this.recordConfig\n }\n\n if (this.messagesConfig) {\n request.messages = this.messagesConfig\n }\n\n const options: DispatchOptions = {\n flowMode,\n ...this.dispatchOptions,\n }\n\n // Auto-detect recordMode based on record config if not explicitly set\n if (this.recordConfig && !this.dispatchOptions.recordMode) {\n if (this.recordConfig.id) {\n options.recordMode = 'existing'\n } else if (this.recordConfig.name || this.recordConfig.type) {\n options.recordMode = 'create'\n } else {\n options.recordMode = 'virtual'\n }\n }\n\n if (this.mode === 'upsert' && Object.keys(this.upsertOptions).length > 0) {\n options.upsertOptions = this.upsertOptions\n }\n\n request.options = options\n\n return request\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private addStep(\n type: string,\n name: string,\n config: Record<string, any>,\n enabled: boolean = true\n ): void {\n this.stepCounter++\n\n const cleanConfig: Record<string, any> = {}\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n cleanConfig[key] = value\n }\n }\n\n this.steps.push({\n id: `step-${this.stepCounter}`,\n type,\n name,\n order: this.stepCounter,\n enabled,\n config: cleanConfig,\n })\n }\n}\n","/**\n * BatchesNamespace - Static namespace for batch operations\n *\n * Provides direct methods for scheduling and managing batch operations.\n * Batches are always asynchronous - they don't return results immediately.\n */\n\nimport type { RuntypeClient } from './runtype'\n\n// ============================================================================\n// Configuration Interfaces\n// ============================================================================\n\nexport interface BatchScheduleConfig {\n /** Flow ID to execute for each record */\n flowId: string\n /** Record type to batch process */\n recordType: string\n /** When to execute (defaults to immediately) */\n at?: Date\n /** Run batch asynchronously (default: true) */\n async?: boolean\n /** Maximum concurrent executions */\n concurrency?: number\n /** Continue on individual record failures */\n continueOnError?: boolean\n /** Store results for each record */\n storeResults?: boolean\n /** Model override for batch execution */\n modelOverride?: string\n /** Optional filter for records */\n filter?: Record<string, any>\n /** Optional limit on number of records */\n limit?: number\n}\n\nexport interface BatchStatus {\n batchId: string\n status: 'queued' | 'scheduled' | 'running' | 'completed' | 'failed' | 'cancelled'\n totalRecords: number\n processedRecords: number\n failedRecords: number\n scheduledAt?: string\n startedAt?: string\n completedAt?: string\n}\n\nexport interface BatchListParams {\n /** Filter by status */\n status?: 'queued' | 'scheduled' | 'running' | 'completed' | 'failed' | 'cancelled'\n /** Filter by flow ID */\n flowId?: string\n /** Filter by record type */\n recordType?: string\n /** Pagination limit */\n limit?: number\n /** Pagination offset */\n offset?: number\n}\n\n// ============================================================================\n// BatchesNamespace\n// ============================================================================\n\nexport class BatchesNamespace {\n constructor(private getClient: () => RuntypeClient) {}\n\n /**\n * Schedule a batch operation\n *\n * Creates and schedules a batch to run a flow on all records of a type.\n * By default, runs immediately. Use `at` to schedule for a specific time.\n *\n * @example\n * ```typescript\n * // Run immediately\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * })\n *\n * // Schedule for later\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * at: new Date('2024-01-15T09:00:00Z'),\n * })\n *\n * // With options\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * concurrency: 5,\n * continueOnError: true,\n * filter: { status: 'active' },\n * limit: 100,\n * })\n * ```\n */\n async schedule(config: BatchScheduleConfig): Promise<BatchStatus> {\n const client = this.getClient()\n\n const payload: any = {\n flowId: config.flowId,\n recordType: config.recordType,\n }\n\n if (config.at) {\n payload.scheduledAt = config.at.toISOString()\n }\n\n const options: any = {}\n if (config.async !== undefined) options.async = config.async\n if (config.concurrency !== undefined) options.concurrency = config.concurrency\n if (config.continueOnError !== undefined) options.continueOnError = config.continueOnError\n if (config.storeResults !== undefined) options.storeResults = config.storeResults\n if (config.modelOverride !== undefined) options.modelOverride = config.modelOverride\n\n if (Object.keys(options).length > 0) {\n payload.options = options\n }\n\n if (config.filter) {\n payload.filter = config.filter\n }\n\n if (config.limit !== undefined) {\n payload.limit = config.limit\n }\n\n return client.post<BatchStatus>('/batches', payload)\n }\n\n /**\n * Get batch status by ID\n *\n * @example\n * ```typescript\n * const status = await Runtype.batches.get('batch_456')\n * console.log(status.status, status.processedRecords, '/', status.totalRecords)\n * ```\n */\n async get(batchId: string): Promise<BatchStatus> {\n const client = this.getClient()\n return client.get<BatchStatus>(`/batches/${batchId}`)\n }\n\n /**\n * Cancel a batch operation\n *\n * Cancels a queued or running batch. Records already processed are not rolled back.\n *\n * @example\n * ```typescript\n * await Runtype.batches.cancel('batch_456')\n * ```\n */\n async cancel(batchId: string): Promise<{ success: boolean; message: string }> {\n const client = this.getClient()\n return client.post<{ success: boolean; message: string }>(`/batches/${batchId}/cancel`)\n }\n\n /**\n * List batch operations\n *\n * @example\n * ```typescript\n * // List all batches\n * const batches = await Runtype.batches.list()\n *\n * // Filter by status\n * const running = await Runtype.batches.list({ status: 'running' })\n *\n * // Filter by flow\n * const flowBatches = await Runtype.batches.list({ flowId: 'flow_123' })\n * ```\n */\n async list(params?: BatchListParams): Promise<{ data: BatchStatus[]; total: number }> {\n const client = this.getClient()\n return client.get<{ data: BatchStatus[]; total: number }>('/batches', params)\n }\n}\n","/**\n * EvalsNamespace - Static namespace for evaluation operations\n *\n * Provides methods for running evaluations and comparing model performance.\n * Evals can be streamed for real-time results or submitted as batch jobs.\n */\n\nimport type { RuntypeClient } from './runtype'\nimport { FlowResult } from './flow-result'\nimport type { StreamCallbacks, FlowSummary } from './flow-builder'\n\n// ============================================================================\n// Configuration Interfaces\n// ============================================================================\n\nexport interface ModelOverride {\n /** Name of the step to override */\n stepName: string\n /** Model to use for this step */\n model: string\n /** Optional temperature override */\n temperature?: number\n /** Optional max tokens override */\n maxTokens?: number\n}\n\nexport interface EvalRunConfig {\n /** Flow ID to evaluate */\n flowId?: string\n /** Virtual flow definition (alternative to flowId) */\n flow?: {\n name: string\n steps: any[]\n }\n /** Record type to evaluate against */\n recordType?: string\n /** Inline records for ad-hoc evaluation */\n records?: Array<{\n name: string\n type: string\n metadata: Record<string, any>\n }>\n /** Model overrides for single-model evaluation */\n models?: ModelOverride[]\n /** Multiple model configurations for comparison */\n compareModels?: ModelOverride[][]\n /** Store evaluation results */\n storeResults?: boolean\n /** Run evaluations in parallel */\n parallel?: boolean\n /** Maximum concurrent evaluations */\n concurrency?: number\n /** Continue on individual record failures */\n continueOnError?: boolean\n /** Optional filter for records */\n filter?: Record<string, any>\n /** Optional limit on number of records */\n limit?: number\n}\n\nexport interface EvalStatus {\n evalId: string\n status: 'queued' | 'running' | 'completed' | 'failed'\n totalRecords: number\n completedRecords: number\n failedRecords: number\n results?: Array<{\n modelConfig: ModelOverride[]\n records: Array<{\n recordId: string\n status: 'success' | 'error'\n result?: any\n error?: string\n executionTime: number\n }>\n }>\n}\n\nexport interface EvalListParams {\n /** Filter by status */\n status?: 'queued' | 'running' | 'completed' | 'failed'\n /** Filter by flow ID */\n flowId?: string\n /** Pagination limit */\n limit?: number\n /** Pagination offset */\n offset?: number\n}\n\n// ============================================================================\n// EvalRunner\n// ============================================================================\n\n/**\n * EvalRunner - Builder returned by Runtype.evals.run()\n *\n * Provides terminal methods for executing evaluations:\n * - .stream() - Execute and stream results in real-time\n * - .submit() - Submit as a batch job for async processing\n */\nexport class EvalRunner {\n constructor(\n private getClient: () => RuntypeClient,\n private config: EvalRunConfig\n ) {}\n\n /**\n * Execute the evaluation with streaming results\n *\n * Streams evaluation results as they complete.\n * Good for real-time feedback during development/testing.\n *\n * @example\n * ```typescript\n * const result = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [{ stepName: 'Analyze', model: 'gpt-4o' }]\n * }).stream()\n *\n * // Process with callbacks\n * await result.stream({\n * onStepComplete: (result, event) => {\n * console.log('Step completed:', event.name, result)\n * },\n * })\n * ```\n */\n async stream(callbacks?: StreamCallbacks): Promise<FlowResult> {\n const client = this.getClient()\n\n const payload = this.buildPayload()\n payload.stream = true\n\n const response = await client.requestStream('/eval/stream', {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n\n const result = new FlowResult(response)\n\n if (callbacks) {\n await result.stream(callbacks)\n }\n\n return result\n }\n\n /**\n * Submit the evaluation as a batch job\n *\n * Queues the evaluation to run asynchronously.\n * Good for large evaluations or scheduled runs.\n *\n * @example\n * ```typescript\n * const eval = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * compareModels: [\n * [{ stepName: 'Analyze', model: 'gpt-4o' }],\n * [{ stepName: 'Analyze', model: 'claude-3-opus' }],\n * ]\n * }).submit()\n *\n * console.log('Eval queued:', eval.evalId)\n *\n * // Check status later\n * const status = await Runtype.evals.get(eval.evalId)\n * ```\n */\n async submit(): Promise<EvalStatus> {\n const client = this.getClient()\n\n const payload = this.buildPayload()\n payload.async = true\n\n return client.post<EvalStatus>('/evals', payload)\n }\n\n /**\n * Build the evaluation payload\n */\n private buildPayload(): any {\n const payload: any = {}\n\n if (this.config.flowId) {\n payload.flowId = this.config.flowId\n } else if (this.config.flow) {\n payload.flow = this.config.flow\n }\n\n if (this.config.recordType) {\n payload.recordType = this.config.recordType\n } else if (this.config.records) {\n payload.records = this.config.records\n }\n\n if (this.config.models) {\n payload.modelOverrides = this.config.models\n } else if (this.config.compareModels) {\n payload.modelConfigs = this.config.compareModels\n }\n\n const options: any = {}\n if (this.config.storeResults !== undefined) options.storeResults = this.config.storeResults\n if (this.config.parallel !== undefined) options.parallel = this.config.parallel\n if (this.config.concurrency !== undefined) options.concurrency = this.config.concurrency\n if (this.config.continueOnError !== undefined)\n options.continueOnError = this.config.continueOnError\n\n if (Object.keys(options).length > 0) {\n payload.options = options\n }\n\n if (this.config.filter) {\n payload.filter = this.config.filter\n }\n\n if (this.config.limit !== undefined) {\n payload.limit = this.config.limit\n }\n\n return payload\n }\n}\n\n// ============================================================================\n// EvalsNamespace\n// ============================================================================\n\nexport class EvalsNamespace {\n constructor(private getClient: () => RuntypeClient) {}\n\n /**\n * Run an evaluation\n *\n * Returns an EvalRunner with terminal methods:\n * - .stream() - Execute and stream results\n * - .submit() - Submit as batch job\n *\n * @example\n * ```typescript\n * // Single model evaluation with streaming\n * const result = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [{ stepName: 'Analyze', model: 'gpt-4o' }]\n * }).stream()\n *\n * // Multi-model comparison as batch\n * const eval = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * compareModels: [\n * [{ stepName: 'Analyze', model: 'gpt-4o' }],\n * [{ stepName: 'Analyze', model: 'claude-3-opus' }],\n * [{ stepName: 'Analyze', model: 'gemini-pro' }],\n * ]\n * }).submit()\n * ```\n */\n run(config: EvalRunConfig): EvalRunner {\n return new EvalRunner(this.getClient, config)\n }\n\n /**\n * Get evaluation status by ID\n *\n * @example\n * ```typescript\n * const status = await Runtype.evals.get('eval_123')\n * console.log(status.status, status.completedRecords, '/', status.totalRecords)\n * ```\n */\n async get(evalId: string): Promise<EvalStatus> {\n const client = this.getClient()\n return client.get<EvalStatus>(`/evals/${evalId}`)\n }\n\n /**\n * List evaluations\n *\n * @example\n * ```typescript\n * // List all evals\n * const evals = await Runtype.evals.list()\n *\n * // Filter by status\n * const running = await Runtype.evals.list({ status: 'running' })\n *\n * // Filter by flow\n * const flowEvals = await Runtype.evals.list({ flowId: 'flow_123' })\n * ```\n */\n async list(params?: EvalListParams): Promise<{ data: EvalStatus[]; total: number }> {\n const client = this.getClient()\n return client.get<{ data: EvalStatus[]; total: number }>('/evals', params)\n }\n}\n","/**\n * PromptsNamespace - Static namespace for prompt operations\n *\n * Provides CRUD operations for prompts and execution methods\n * with streaming and non-streaming options.\n */\n\nimport type { RuntypeClient } from './runtype'\nimport type { ReasoningConfig } from './types'\nimport { FlowResult } from './flow-result'\nimport type { StreamCallbacks, FlowSummary } from './flow-builder'\n\n// ============================================================================\n// Configuration Interfaces\n// ============================================================================\n\nexport interface CreatePromptData {\n /** Prompt name */\n name: string\n /** Prompt description */\n description?: string\n /** Model to use */\n model: string\n /** System prompt text */\n systemPrompt?: string\n /** User prompt template */\n userPrompt: string\n /** Response format */\n responseFormat?: 'text' | 'json' | 'markdown'\n /** Temperature */\n temperature?: number\n /** Max tokens */\n maxTokens?: number\n /** Enable reasoning/extended thinking. Use `true` for defaults or `ReasoningConfig` for fine-grained control */\n reasoning?: boolean | ReasoningConfig\n /** Flow IDs to attach this prompt to */\n flowIds?: string[]\n}\n\nexport interface UpdatePromptData {\n /** Prompt name */\n name?: string\n /** Prompt description */\n description?: string\n /** Model to use */\n model?: string\n /** System prompt text */\n systemPrompt?: string\n /** User prompt template */\n userPrompt?: string\n /** Response format */\n responseFormat?: 'text' | 'json' | 'markdown'\n /** Temperature */\n temperature?: number\n /** Max tokens */\n maxTokens?: number\n /** Enable reasoning/extended thinking. Use `true` for defaults or `ReasoningConfig` for fine-grained control */\n reasoning?: boolean | ReasoningConfig\n}\n\nexport interface Prompt {\n id: string\n userId: string\n name: string\n description?: string\n model: string\n systemPrompt?: string\n userPrompt: string\n responseFormat?: string\n temperature?: number\n maxTokens?: number\n reasoning?: boolean | ReasoningConfig\n createdAt: string\n updatedAt: string\n}\n\nexport interface PromptRunOptions {\n /** Record ID to run the prompt against */\n recordId?: string\n /** Record data (alternative to recordId) */\n record?: {\n name?: string\n type?: string\n metadata?: Record<string, any>\n }\n /** Model override */\n modelOverride?: string\n /** Temperature override */\n temperature?: number\n /** Max tokens override */\n maxTokens?: number\n /** Store the result */\n storeResult?: boolean\n}\n\nexport interface PromptListParams {\n /** Filter by flow ID */\n flowId?: string\n /** Search by name */\n search?: string\n /** Pagination limit */\n limit?: number\n /** Pagination offset */\n offset?: number\n}\n\n// ============================================================================\n// PromptRunner\n// ============================================================================\n\n/**\n * PromptRunner - Builder returned by Runtype.prompts.run()\n *\n * Provides terminal methods for executing prompts:\n * - .stream() - Execute and stream results in real-time\n * - .result() - Execute and wait for complete result\n */\nexport class PromptRunner {\n constructor(\n private getClient: () => RuntypeClient,\n private promptId: string,\n private options: PromptRunOptions\n ) {}\n\n /**\n * Execute the prompt with streaming response\n *\n * Streams the prompt response as it's generated.\n *\n * @example\n * ```typescript\n * const result = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).stream()\n *\n * // Process with callbacks\n * await result.stream({\n * onStepChunk: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: () => console.log('Done!'),\n * })\n * ```\n */\n async stream(callbacks?: StreamCallbacks): Promise<FlowResult> {\n const client = this.getClient()\n\n const payload = this.buildPayload()\n payload.stream = true\n\n const response = await client.requestStream(`/prompts/${this.promptId}/run`, {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n\n const result = new FlowResult(response)\n\n if (callbacks) {\n await result.stream(callbacks)\n }\n\n return result\n }\n\n /**\n * Execute the prompt and wait for complete result\n *\n * Waits for the entire response before returning.\n *\n * @example\n * ```typescript\n * const result = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).result()\n *\n * const output = await result.getResult('prompt')\n * console.log(output)\n * ```\n */\n async result(): Promise<FlowResult> {\n const client = this.getClient()\n\n const payload = this.buildPayload()\n payload.stream = true // Still use streaming internally for FlowResult\n\n const response = await client.requestStream(`/prompts/${this.promptId}/run`, {\n method: 'POST',\n body: JSON.stringify(payload),\n })\n\n const result = new FlowResult(response)\n // Pre-process to cache results\n await result.getSummary()\n\n return result\n }\n\n /**\n * Build the run payload\n */\n private buildPayload(): any {\n const payload: any = {}\n\n if (this.options.recordId) {\n payload.recordId = this.options.recordId\n } else if (this.options.record) {\n payload.record = this.options.record\n }\n\n if (this.options.modelOverride) {\n payload.modelOverride = this.options.modelOverride\n }\n\n if (this.options.temperature !== undefined) {\n payload.temperature = this.options.temperature\n }\n\n if (this.options.maxTokens !== undefined) {\n payload.maxTokens = this.options.maxTokens\n }\n\n if (this.options.storeResult !== undefined) {\n payload.storeResult = this.options.storeResult\n }\n\n return payload\n }\n}\n\n// ============================================================================\n// PromptsNamespace\n// ============================================================================\n\nexport class PromptsNamespace {\n constructor(private getClient: () => RuntypeClient) {}\n\n /**\n * Run a prompt\n *\n * Returns a PromptRunner with terminal methods:\n * - .stream() - Execute and stream results\n * - .result() - Execute and wait for complete result\n *\n * @example\n * ```typescript\n * // Stream the response\n * const result = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).stream()\n *\n * // Get complete result\n * const result = await Runtype.prompts.run('prompt_123', {\n * record: { name: 'Test', metadata: { input: 'Hello' } }\n * }).result()\n * ```\n */\n run(promptId: string, options: PromptRunOptions = {}): PromptRunner {\n return new PromptRunner(this.getClient, promptId, options)\n }\n\n /**\n * Create a new prompt\n *\n * @example\n * ```typescript\n * const prompt = await Runtype.prompts.create({\n * name: 'Summarizer',\n * model: 'gpt-4o',\n * userPrompt: 'Summarize the following: {{content}}',\n * systemPrompt: 'You are a helpful assistant.',\n * })\n * ```\n */\n async create(data: CreatePromptData): Promise<Prompt> {\n const client = this.getClient()\n return client.post<Prompt>('/prompts', data)\n }\n\n /**\n * List prompts\n *\n * @example\n * ```typescript\n * // List all prompts\n * const prompts = await Runtype.prompts.list()\n *\n * // Filter by flow\n * const flowPrompts = await Runtype.prompts.list({ flowId: 'flow_123' })\n *\n * // Search by name\n * const results = await Runtype.prompts.list({ search: 'summarize' })\n * ```\n */\n async list(params?: PromptListParams): Promise<{ data: Prompt[]; total: number }> {\n const client = this.getClient()\n return client.get<{ data: Prompt[]; total: number }>('/prompts', params)\n }\n\n /**\n * Get a prompt by ID\n *\n * @example\n * ```typescript\n * const prompt = await Runtype.prompts.get('prompt_123')\n * console.log(prompt.name, prompt.userPrompt)\n * ```\n */\n async get(promptId: string): Promise<Prompt> {\n const client = this.getClient()\n return client.get<Prompt>(`/prompts/${promptId}`)\n }\n\n /**\n * Update a prompt\n *\n * @example\n * ```typescript\n * const updated = await Runtype.prompts.update('prompt_123', {\n * userPrompt: 'Updated prompt template: {{content}}',\n * temperature: 0.7,\n * })\n * ```\n */\n async update(promptId: string, data: UpdatePromptData): Promise<Prompt> {\n const client = this.getClient()\n return client.post<Prompt>(`/prompts/${promptId}`, data)\n }\n\n /**\n * Delete a prompt\n *\n * @example\n * ```typescript\n * await Runtype.prompts.delete('prompt_123')\n * ```\n */\n async delete(promptId: string): Promise<void> {\n const client = this.getClient()\n await client.post<void>(`/prompts/${promptId}/delete`)\n }\n}\n","/**\n * @module transform\n * @layer sdk\n * @case native (API now uses native camelCase - no conversion needed)\n *\n * Transformation utilities - now pass-through since API uses native camelCase.\n *\n * The API has migrated to native camelCase for all request/response bodies.\n * These functions are now pass-throughs for backwards compatibility.\n *\n * @see packages/shared/src/transforms/case-conversion.ts\n */\n\nimport type { ToCamelCase, ToSnakeCase } from './case-types'\n\n/**\n * Convert snake_case string to camelCase\n */\nfunction snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())\n}\n\n/**\n * Recursively convert object keys from snake_case to camelCase\n * Special handling: preserves keys within 'metadata', 'metadataSchema', and 'parametersSchema.properties'\n *\n * @param obj - The object to convert\n * @param preserveKeys - If true, preserve all keys at this level\n * @returns The converted object with camelCase keys (type transformed at compile time)\n */\n// Generic overload with compile-time type transformation\nfunction convertKeysToCamelCase<T extends object>(obj: T, preserveKeys?: boolean): ToCamelCase<T>\nfunction convertKeysToCamelCase<T = any>(obj: any, preserveKeys = false): T {\n if (Array.isArray(obj)) {\n return obj.map((item) => convertKeysToCamelCase(item, preserveKeys)) as T\n } else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {\n return Object.keys(obj).reduce((result, key) => {\n const camelKey = preserveKeys ? key : snakeToCamel(key)\n\n // Special handling for metadataSchema: convert top-level keys but preserve nested content\n if (key === 'metadata_schema') {\n // Handle null/undefined metadata_schema\n if (obj[key] === null || obj[key] === undefined) {\n result[camelKey] = obj[key]\n return result\n }\n result[camelKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {\n const camelSchemaKey = snakeToCamel(schemaKey)\n\n // Preserve contents of key_types and keys, but convert the rest\n const shouldPreserveContent = schemaKey === 'key_types' || schemaKey === 'keys'\n schemaResult[camelSchemaKey] = convertKeysToCamelCase(\n obj[key][schemaKey],\n shouldPreserveContent\n )\n return schemaResult\n }, {} as any)\n return result\n }\n\n // Special handling for parametersSchema: convert top-level keys but preserve property names\n if (key === 'parameters_schema') {\n // Handle null/undefined parameters_schema\n if (obj[key] === null || obj[key] === undefined) {\n result[camelKey] = obj[key]\n return result\n }\n result[camelKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {\n const camelSchemaKey = snakeToCamel(schemaKey)\n\n // Special handling for 'properties': preserve property names but convert their attributes\n if (schemaKey === 'properties') {\n // Handle null/undefined properties\n if (obj[key][schemaKey] === null || obj[key][schemaKey] === undefined) {\n schemaResult[camelSchemaKey] = obj[key][schemaKey]\n } else {\n schemaResult[camelSchemaKey] = Object.keys(obj[key][schemaKey]).reduce(\n (propsResult, propName) => {\n // Preserve the property name (e.g., 'param1', 'param2', 'testParam')\n // But convert the property attributes (default_value -> defaultValue, min_length -> minLength, etc.)\n propsResult[propName] = convertKeysToCamelCase(\n obj[key][schemaKey][propName],\n false\n )\n return propsResult\n },\n {} as any\n )\n }\n } else {\n schemaResult[camelSchemaKey] = convertKeysToCamelCase(obj[key][schemaKey], false)\n }\n return schemaResult\n }, {} as any)\n return result\n }\n\n // Preserve original keys within metadata fields and HTTP headers\n // Headers like 'Accept', 'X-Auth-Token' should not be converted\n const shouldPreserveNextLevel =\n key === 'metadata' || key === 'metadata_labels' || key === 'headers' || preserveKeys\n\n result[camelKey] = convertKeysToCamelCase(obj[key], shouldPreserveNextLevel)\n return result\n }, {} as any) as T\n }\n return obj as T\n}\n\n/**\n * Transform API response - pass-through (API now uses native camelCase)\n */\nexport function transformResponse<T>(data: any): T {\n // No transformation needed - API uses native camelCase\n return data as T\n}\n\n/**\n * Convert camelCase string to snake_case\n */\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)\n}\n\n/**\n * Recursively convert object keys from camelCase to snake_case\n * Special handling: preserves keys within 'metadata', 'metadataSchema', and 'parametersSchema.properties'\n *\n * @param obj - The object to convert\n * @param preserveKeys - If true, preserve all keys at this level\n * @returns The converted object with snake_case keys (type transformed at compile time)\n */\n// Generic overload with compile-time type transformation\nfunction convertKeysToSnakeCase<T extends object>(obj: T, preserveKeys?: boolean): ToSnakeCase<T>\nfunction convertKeysToSnakeCase(obj: any, preserveKeys = false): any {\n if (Array.isArray(obj)) {\n return obj.map((item) => convertKeysToSnakeCase(item, preserveKeys))\n } else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {\n return Object.keys(obj).reduce((result, key) => {\n const snakeKey = preserveKeys ? key : camelToSnake(key)\n\n // Special handling for metadataSchema: convert top-level keys but preserve nested content\n if (key === 'metadataSchema' || snakeKey === 'metadata_schema') {\n const schemaKey = camelToSnake(key)\n // Handle null/undefined metadataSchema\n if (obj[key] === null || obj[key] === undefined) {\n result[schemaKey] = obj[key]\n return result\n }\n result[schemaKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {\n const snakeSchemaKey = camelToSnake(schemaKey)\n\n // Preserve contents of keyTypes and keys, but convert the rest\n const shouldPreserveContent =\n schemaKey === 'keyTypes' ||\n schemaKey === 'keys' ||\n snakeSchemaKey === 'key_types' ||\n snakeSchemaKey === 'keys'\n schemaResult[snakeSchemaKey] = convertKeysToSnakeCase(\n obj[key][schemaKey],\n shouldPreserveContent\n )\n return schemaResult\n }, {} as any)\n return result\n }\n\n // Special handling for parametersSchema: convert top-level keys but preserve property names\n if (key === 'parametersSchema' || snakeKey === 'parameters_schema') {\n const schemaKey = camelToSnake(key)\n // Handle null/undefined parametersSchema\n if (obj[key] === null || obj[key] === undefined) {\n result[schemaKey] = obj[key]\n return result\n }\n result[schemaKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {\n const snakeSchemaKey = camelToSnake(schemaKey)\n\n // Special handling for 'properties': preserve property names but convert their attributes\n if (schemaKey === 'properties' || snakeSchemaKey === 'properties') {\n // Handle null/undefined properties\n if (obj[key][schemaKey] === null || obj[key][schemaKey] === undefined) {\n schemaResult[snakeSchemaKey] = obj[key][schemaKey]\n } else {\n schemaResult[snakeSchemaKey] = Object.keys(obj[key][schemaKey]).reduce(\n (propsResult, propName) => {\n // Preserve the property name (e.g., 'param1', 'param2', 'testParam')\n // But convert the property attributes (defaultValue -> default_value, minLength -> min_length, etc.)\n propsResult[propName] = convertKeysToSnakeCase(\n obj[key][schemaKey][propName],\n false\n )\n return propsResult\n },\n {} as any\n )\n }\n } else {\n schemaResult[snakeSchemaKey] = convertKeysToSnakeCase(obj[key][schemaKey], false)\n }\n return schemaResult\n }, {} as any)\n return result\n }\n\n // Preserve original keys within metadata fields and HTTP headers\n // Headers like 'Accept', 'X-Auth-Token' should not be converted\n const shouldPreserveNextLevel =\n key === 'metadata' ||\n key === 'metadataLabels' ||\n snakeKey === 'metadata_labels' ||\n key === 'headers' ||\n preserveKeys\n\n result[snakeKey] = convertKeysToSnakeCase(obj[key], shouldPreserveNextLevel)\n return result\n }, {} as any)\n }\n return obj\n}\n\n/**\n * Transform client request - pass-through (API now accepts native camelCase)\n */\nexport function transformRequest(data: any): any {\n // No transformation needed - API accepts native camelCase\n return data\n}\n\n/**\n * Transform URL query parameters - pass-through (API now accepts camelCase params)\n */\nexport function transformQueryParams(params: { [key: string]: any }): { [key: string]: string } {\n const result: { [key: string]: string } = {}\n\n for (const [key, value] of Object.entries(params) as [string, any][]) {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n result[key] = value.join(',')\n } else {\n result[key] = String(value)\n }\n }\n }\n\n return result\n}\n\n// Re-export case type utilities for type-safe transformations\nexport type { SnakeToCamelString, CamelToSnakeString, ToCamelCase, ToSnakeCase } from './case-types'\n","/**\n * Runtype - The unified SDK client for building and executing flows, batches, evals, and prompts\n *\n * Provides a fluent API with static namespaces for all product areas.\n *\n * @example\n * ```typescript\n * import { Runtype } from '@runtypelabs/sdk'\n *\n * // Global configuration (once per app)\n * Runtype.configure({ apiKey: process.env.RUNTYPE_API_KEY })\n *\n * // Build and stream a flow\n * const stream = await Runtype.flows.upsert({ name: 'My Flow' })\n * .withRecord({ name: 'Test', metadata: {} })\n * .prompt({ name: 'Analyze', model: 'gpt-4o', userPrompt: '...' })\n * .stream()\n *\n * // Get complete result\n * const result = await Runtype.flows.use('flow_123')\n * .withRecord({ name: 'Test' })\n * .result()\n *\n * // Schedule a batch\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * })\n *\n * // Run an eval with streaming\n * const evalStream = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [{ stepName: 'Analyze', model: 'gpt-4o' }]\n * }).stream()\n *\n * // Execute a prompt\n * const promptResult = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).result()\n * ```\n */\n\nimport type { ClientConfig } from './types'\nimport { FlowsNamespace } from './flows-namespace'\nimport { BatchesNamespace } from './batches-namespace'\nimport { EvalsNamespace } from './evals-namespace'\nimport { PromptsNamespace } from './prompts-namespace'\nimport { transformRequest } from './transform'\n\n// ============================================================================\n// Global Configuration Types\n// ============================================================================\n\nexport interface RuntypeConfig {\n /** API key for authentication */\n apiKey?: string\n /** Base URL for the API (defaults to https://api.runtype.com) */\n baseUrl?: string\n /** API version (defaults to 'v1') */\n apiVersion?: string\n /** Request timeout in milliseconds (defaults to 30000) */\n timeout?: number\n /** Additional headers to include in requests */\n headers?: Record<string, string>\n}\n\n// ============================================================================\n// Global State\n// ============================================================================\n\nlet globalConfig: RuntypeConfig = {}\nlet globalClient: RuntypeClient | null = null\n\n// ============================================================================\n// RuntypeClient Class (internal implementation)\n// ============================================================================\n\n/**\n * Internal client implementation that handles HTTP requests\n */\nexport class RuntypeClient {\n private baseUrl: string\n private apiVersion: string\n private timeout: number\n private headers: Record<string, string>\n\n constructor(config: RuntypeConfig = {}) {\n const baseUrl = config.baseUrl || 'https://api.runtype.com'\n this.apiVersion = config.apiVersion || 'v1'\n this.baseUrl = this.apiVersion ? `${baseUrl}/${this.apiVersion}` : baseUrl\n this.timeout = config.timeout || 30000\n this.headers = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n }\n\n if (config.apiKey) {\n this.headers.Authorization = `Bearer ${config.apiKey}`\n }\n }\n\n /**\n * Set the API key for authentication\n */\n setApiKey(apiKey: string): void {\n this.headers.Authorization = `Bearer ${apiKey}`\n }\n\n /**\n * Generic GET request\n */\n async get<T>(path: string, params?: Record<string, any>): Promise<T> {\n const url = this.buildUrl(path, params)\n const response = await this.makeRequest(url, {\n method: 'GET',\n headers: this.headers,\n })\n return this.transformResponse<T>(response)\n }\n\n /**\n * Generic POST request\n */\n async post<T>(path: string, data?: any): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'POST',\n headers: this.headers,\n body: data ? JSON.stringify(data) : undefined,\n })\n return this.transformResponse<T>(response)\n }\n\n /**\n * Generic request that returns raw Response for streaming\n */\n async requestStream(path: string, options: RequestInit = {}): Promise<Response> {\n const url = this.buildUrl(path)\n const headers = {\n ...this.headers,\n ...(options.headers as Record<string, string>),\n }\n\n return this.makeRawRequest(url, {\n ...options,\n headers,\n })\n }\n\n /**\n * Dispatch flow execution (streaming)\n */\n async dispatch(config: any): Promise<Response> {\n return this.requestStream('/dispatch', {\n method: 'POST',\n body: JSON.stringify(transformRequest(config)),\n })\n }\n\n /**\n * Build full URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, any>): string {\n const base = this.baseUrl.endsWith('/') ? this.baseUrl : `${this.baseUrl}/`\n const relPath = path.startsWith('/') ? path.slice(1) : path\n const url = new URL(relPath, base)\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value))\n }\n })\n }\n\n return url.toString()\n }\n\n /**\n * Make HTTP request with timeout and error handling\n */\n private async makeRequest(url: string, options: RequestInit): Promise<any> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(\n `API request failed: ${response.status} ${response.statusText} - ${errorText}`\n )\n }\n\n if (response.status === 204) {\n return null\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n return response.json()\n }\n\n return response.text()\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`)\n }\n\n throw error\n }\n }\n\n /**\n * Make HTTP request that returns raw Response (for streaming)\n */\n private async makeRawRequest(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(\n `API request failed: ${response.status} ${response.statusText} - ${errorText}`\n )\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`)\n }\n\n throw error\n }\n }\n\n /**\n * Transform response (placeholder for snake_case to camelCase)\n */\n private transformResponse<T>(response: any): T {\n // For now, return as-is. Can add transformation later if needed.\n return response as T\n }\n}\n\n// ============================================================================\n// Runtype Static Class\n// ============================================================================\n\n/**\n * Runtype - Main entry point for the SDK\n *\n * Use static methods and namespaces to interact with the API.\n */\nexport class Runtype {\n // ============================================================================\n // Global Configuration\n // ============================================================================\n\n /**\n * Configure the global Runtype client\n *\n * Call this once at app startup to set the API key and other options.\n * All subsequent calls to Runtype.flows, Runtype.batches, etc. will use this config.\n *\n * @example\n * ```typescript\n * Runtype.configure({ apiKey: process.env.RUNTYPE_API_KEY })\n * ```\n */\n static configure(config: RuntypeConfig): void {\n globalConfig = { ...globalConfig, ...config }\n globalClient = new RuntypeClient(globalConfig)\n }\n\n /**\n * Get the global client instance, creating one if needed\n */\n static getClient(): RuntypeClient {\n if (!globalClient) {\n globalClient = new RuntypeClient(globalConfig)\n }\n return globalClient\n }\n\n /**\n * Create a new client instance with custom configuration\n *\n * Use this when you need a client with different settings than the global one.\n *\n * @example\n * ```typescript\n * const client = Runtype.createClient({ apiKey: 'different_key' })\n * ```\n */\n static createClient(config?: RuntypeConfig): RuntypeClient {\n return new RuntypeClient({ ...globalConfig, ...config })\n }\n\n // ============================================================================\n // Static Namespaces\n // ============================================================================\n\n /**\n * Flows namespace - Build and execute flows\n *\n * @example\n * ```typescript\n * // Upsert a flow (create or update)\n * const result = await Runtype.flows.upsert({ name: 'My Flow' })\n * .prompt({ name: 'Analyze', model: 'gpt-4o', userPrompt: '...' })\n * .stream()\n *\n * // Use an existing flow\n * const result = await Runtype.flows.use('flow_123')\n * .withRecord({ name: 'Test' })\n * .result()\n *\n * // Virtual flow (one-off, not saved)\n * const result = await Runtype.flows.virtual({ name: 'Temp Flow' })\n * .prompt({ ... })\n * .stream()\n * ```\n */\n static get flows(): FlowsNamespace {\n return new FlowsNamespace(() => this.getClient())\n }\n\n /**\n * Batches namespace - Schedule and manage batch operations\n *\n * @example\n * ```typescript\n * // Schedule a batch\n * const batch = await Runtype.batches.schedule({\n * flowId: 'flow_123',\n * recordType: 'customers',\n * })\n *\n * // Get batch status\n * const status = await Runtype.batches.get('batch_456')\n *\n * // Cancel a batch\n * await Runtype.batches.cancel('batch_456')\n *\n * // List batches\n * const batches = await Runtype.batches.list({ status: 'running' })\n * ```\n */\n static get batches(): BatchesNamespace {\n return new BatchesNamespace(() => this.getClient())\n }\n\n /**\n * Evals namespace - Run evaluations and compare models\n *\n * @example\n * ```typescript\n * // Run an eval with streaming\n * const stream = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [{ stepName: 'Analyze', model: 'gpt-4o' }]\n * }).stream()\n *\n * // Submit eval as batch job\n * const eval = await Runtype.evals.run({\n * flowId: 'flow_123',\n * recordType: 'test_data',\n * models: [\n * [{ stepName: 'Analyze', model: 'gpt-4o' }],\n * [{ stepName: 'Analyze', model: 'claude-3-opus' }],\n * ]\n * }).submit()\n * ```\n */\n static get evals(): EvalsNamespace {\n return new EvalsNamespace(() => this.getClient())\n }\n\n /**\n * Prompts namespace - Manage and execute prompts\n *\n * @example\n * ```typescript\n * // Execute a prompt with streaming\n * const stream = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).stream()\n *\n * // Get complete result\n * const result = await Runtype.prompts.run('prompt_123', {\n * recordId: 'rec_456'\n * }).result()\n *\n * // CRUD operations\n * const prompts = await Runtype.prompts.list()\n * const prompt = await Runtype.prompts.get('prompt_123')\n * const newPrompt = await Runtype.prompts.create({ ... })\n * await Runtype.prompts.update('prompt_123', { ... })\n * await Runtype.prompts.delete('prompt_123')\n * ```\n */\n static get prompts(): PromptsNamespace {\n return new PromptsNamespace(() => this.getClient())\n }\n}\n\nexport default Runtype\n","import type {\n DispatchRequest,\n JSONSchema,\n RuntimeCustomToolConfig,\n RuntimeTool,\n} from './types'\n\nconst TOOL_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_]{1,63}$/\nconst DEFAULT_MAX_CODE_LENGTH = 12000\nconst DEFAULT_MAX_TIMEOUT_MS = 30000\n\nconst DEFAULT_BLOCKED_CODE_PATTERNS: RegExp[] = [\n /\\b(?:child_process|fs|net|tls|http|https|os)\\b/i,\n /\\b(?:process|Deno|Bun)\\b/i,\n /\\b(?:require|import)\\s*\\(/i,\n /\\beval\\s*\\(/i,\n /\\b__import__\\s*\\(/i,\n /\\bsubprocess\\b/i,\n /\\bos\\.system\\s*\\(/i,\n]\n\nconst DEFAULT_ALLOWED_SANDBOX_PROVIDERS: Array<'quickjs' | 'daytona' | 'cloudflare-worker'> = [\n 'quickjs',\n 'daytona',\n 'cloudflare-worker',\n]\nconst DEFAULT_ALLOWED_LANGUAGES: Array<'javascript' | 'typescript' | 'python'> = [\n 'javascript',\n 'typescript',\n 'python',\n]\n\nexport interface GeneratedRuntimeToolGateOptions {\n /**\n * Allowed runtime tool types.\n * Defaults to ['custom'] because this gate is intended for generated code tools.\n */\n allowedToolTypes?: Array<'custom' | 'external' | 'flow' | 'local'>\n /** Allowed sandbox providers for generated custom tools. Defaults to ['quickjs', 'daytona', 'cloudflare-worker']. */\n allowedSandboxProviders?: Array<'quickjs' | 'daytona' | 'cloudflare-worker'>\n /** Allowed languages for generated custom tools. Defaults to JS/TS/Python. */\n allowedLanguages?: Array<'javascript' | 'typescript' | 'python'>\n /** Maximum allowed code size in characters (default 12000). */\n maxCodeLength?: number\n /** Maximum allowed timeout in ms (default 30000). */\n maxTimeoutMs?: number\n /** Optional tool name allowlist. If provided, generated tool names must match one entry. */\n allowedToolNames?: string[]\n /**\n * Block patterns for generated code.\n * Defaults to a conservative set that rejects obvious process/system access patterns.\n */\n blockedCodePatterns?: RegExp[]\n /** Optional custom validator for additional policy checks. Return a violation message to reject. */\n customValidator?: (tool: RuntimeTool) => string | null\n}\n\nexport interface GeneratedRuntimeToolGateDecision {\n approved: boolean\n reason: string\n violations: string[]\n tool?: RuntimeTool\n}\n\nexport interface AttachRuntimeToolsOptions {\n /**\n * Which prompt step should receive the runtime tools.\n * If omitted, the first prompt step is used.\n */\n stepId?: string\n /** Append to existing runtime tools (default) or replace them entirely. */\n mode?: 'append' | 'replace'\n /** Deduplicate runtime tools by name after merge (default true). */\n dedupeByName?: boolean\n}\n\nexport interface ApplyGeneratedProposalOptions {\n gate?: GeneratedRuntimeToolGateOptions\n attach?: AttachRuntimeToolsOptions\n}\n\nexport interface ApplyGeneratedProposalResult {\n decision: GeneratedRuntimeToolGateDecision\n request: DispatchRequest\n}\n\ninterface NormalizedProposal {\n name: string\n description: string\n toolType: 'custom' | 'external' | 'flow' | 'local'\n parametersSchema: JSONSchema\n config?: RuntimeCustomToolConfig\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value.trim() : undefined\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction isRuntimeToolType(value: unknown): value is 'custom' | 'external' | 'flow' | 'local' {\n return value === 'custom' || value === 'external' || value === 'flow' || value === 'local'\n}\n\nfunction isLanguage(value: unknown): value is 'javascript' | 'typescript' | 'python' {\n return value === 'javascript' || value === 'typescript' || value === 'python'\n}\n\nfunction isSandboxProvider(value: unknown): value is 'quickjs' | 'daytona' | 'cloudflare-worker' {\n return value === 'quickjs' || value === 'daytona' || value === 'cloudflare-worker'\n}\n\nfunction isJSONSchema(value: unknown): value is JSONSchema {\n if (!isObject(value)) return false\n const schemaType = value.type\n return (\n schemaType === 'object' ||\n schemaType === 'string' ||\n schemaType === 'number' ||\n schemaType === 'boolean' ||\n schemaType === 'array' ||\n schemaType === 'null'\n )\n}\n\nfunction extractProposal(proposal: unknown): unknown {\n if (!isObject(proposal)) return proposal\n if (isObject(proposal.tool)) {\n return proposal.tool\n }\n return proposal\n}\n\nfunction normalizeGeneratedProposal(\n proposal: unknown,\n violations: string[]\n): NormalizedProposal | null {\n const candidate = extractProposal(proposal)\n if (!isObject(candidate)) {\n violations.push('Generated tool proposal must be an object')\n return null\n }\n\n const name = asString(candidate.name)\n const description = asString(candidate.description)\n const toolType = candidate.toolType\n const parametersSchema = candidate.parametersSchema\n\n if (!name) {\n violations.push('Tool name is required')\n } else if (!TOOL_NAME_PATTERN.test(name)) {\n violations.push(\n 'Tool name must match /^[A-Za-z][A-Za-z0-9_]{1,63}$/ (letters, numbers, underscore)'\n )\n }\n\n if (!description) {\n violations.push('Tool description is required')\n }\n\n if (!isRuntimeToolType(toolType)) {\n violations.push('toolType must be one of: custom, external, flow, local')\n }\n\n if (!isJSONSchema(parametersSchema)) {\n violations.push('parametersSchema must be a valid JSON Schema object')\n }\n\n if (violations.length > 0 || !name || !description || !isRuntimeToolType(toolType)) {\n return null\n }\n\n if (toolType !== 'custom') {\n return {\n name,\n description,\n toolType,\n parametersSchema: parametersSchema as JSONSchema,\n }\n }\n\n const config = candidate.config\n if (!isObject(config)) {\n violations.push('Custom tool config is required')\n return null\n }\n\n const code = asString(config.code)\n if (!code) {\n violations.push('Custom tool config.code is required')\n return null\n }\n\n const sandboxProviderRaw = config.sandboxProvider\n const languageRaw = config.language\n const timeoutRaw = config.timeout\n\n const sandboxProvider = isSandboxProvider(sandboxProviderRaw) ? sandboxProviderRaw : 'cloudflare-worker'\n const language = isLanguage(languageRaw) ? languageRaw : 'javascript'\n const timeout = asNumber(timeoutRaw)\n\n return {\n name,\n description,\n toolType: 'custom',\n parametersSchema: parametersSchema as JSONSchema,\n config: {\n code,\n sandboxProvider,\n language,\n timeout,\n },\n }\n}\n\nfunction dedupeToolsByName(tools: RuntimeTool[]): RuntimeTool[] {\n const seen = new Set<string>()\n const deduped: RuntimeTool[] = []\n for (const tool of tools) {\n if (seen.has(tool.name)) continue\n seen.add(tool.name)\n deduped.push(tool)\n }\n return deduped\n}\n\nfunction cloneRuntimeTool(tool: RuntimeTool): RuntimeTool {\n return {\n name: tool.name,\n description: tool.description,\n toolType: tool.toolType,\n parametersSchema: {\n ...tool.parametersSchema,\n },\n ...(tool.config ? { config: { ...tool.config } } : {}),\n }\n}\n\n/**\n * Validate and normalize a generated runtime tool proposal against a configurable policy.\n */\nexport function evaluateGeneratedRuntimeToolProposal(\n proposal: unknown,\n options: GeneratedRuntimeToolGateOptions = {}\n): GeneratedRuntimeToolGateDecision {\n const violations: string[] = []\n const normalized = normalizeGeneratedProposal(proposal, violations)\n\n if (!normalized) {\n return {\n approved: false,\n reason: violations[0] || 'Invalid generated tool proposal',\n violations,\n }\n }\n\n const allowedToolTypes = options.allowedToolTypes ?? ['custom']\n if (!allowedToolTypes.includes(normalized.toolType)) {\n violations.push(`Tool type \"${normalized.toolType}\" is not allowed`)\n }\n\n if (options.allowedToolNames && options.allowedToolNames.length > 0) {\n if (!options.allowedToolNames.includes(normalized.name)) {\n violations.push(`Tool name \"${normalized.name}\" is not in allowedToolNames`)\n }\n }\n\n if (normalized.toolType === 'custom' && normalized.config) {\n const allowedSandboxProviders =\n options.allowedSandboxProviders ?? DEFAULT_ALLOWED_SANDBOX_PROVIDERS\n const allowedLanguages = options.allowedLanguages ?? DEFAULT_ALLOWED_LANGUAGES\n const maxCodeLength = options.maxCodeLength ?? DEFAULT_MAX_CODE_LENGTH\n const maxTimeoutMs = options.maxTimeoutMs ?? DEFAULT_MAX_TIMEOUT_MS\n const blockedCodePatterns = options.blockedCodePatterns ?? DEFAULT_BLOCKED_CODE_PATTERNS\n\n if (!allowedSandboxProviders.includes(normalized.config.sandboxProvider || 'cloudflare-worker')) {\n violations.push(\n `Sandbox provider \"${normalized.config.sandboxProvider}\" is not allowed`\n )\n }\n\n if (!allowedLanguages.includes(normalized.config.language || 'javascript')) {\n violations.push(`Language \"${normalized.config.language}\" is not allowed`)\n }\n\n if (normalized.config.code.length > maxCodeLength) {\n violations.push(\n `Generated code exceeds maxCodeLength (${normalized.config.code.length} > ${maxCodeLength})`\n )\n }\n\n if (normalized.config.timeout !== undefined && normalized.config.timeout > maxTimeoutMs) {\n violations.push(\n `Generated timeout exceeds maxTimeoutMs (${normalized.config.timeout} > ${maxTimeoutMs})`\n )\n }\n\n for (const pattern of blockedCodePatterns) {\n if (pattern.test(normalized.config.code)) {\n violations.push(`Generated code matched blocked pattern: ${pattern}`)\n break\n }\n }\n }\n\n const tool: RuntimeTool = {\n name: normalized.name,\n description: normalized.description,\n toolType: normalized.toolType,\n parametersSchema: normalized.parametersSchema,\n ...(normalized.config ? { config: normalized.config } : {}),\n }\n\n const customViolation = options.customValidator?.(tool)\n if (customViolation) {\n violations.push(customViolation)\n }\n\n if (violations.length > 0) {\n return {\n approved: false,\n reason: violations[0],\n violations,\n }\n }\n\n return {\n approved: true,\n reason: 'approved',\n violations: [],\n tool,\n }\n}\n\n/**\n * Build a standardized local-tool output object from a generated runtime tool proposal.\n * This shape can be returned from a `propose_runtime_tool` local tool handler.\n */\nexport function buildGeneratedRuntimeToolGateOutput(\n proposal: unknown,\n options: GeneratedRuntimeToolGateOptions = {}\n): {\n approved: boolean\n reason: string\n violations: string[]\n tool?: RuntimeTool\n} {\n const decision = evaluateGeneratedRuntimeToolProposal(proposal, options)\n return {\n approved: decision.approved,\n reason: decision.reason,\n violations: decision.violations,\n ...(decision.tool ? { tool: decision.tool } : {}),\n }\n}\n\n/**\n * Attach approved runtime tools to a prompt step in a dispatch request.\n * This returns a new request object and never mutates the input.\n */\nexport function attachRuntimeToolsToDispatchRequest(\n request: DispatchRequest,\n runtimeTools: RuntimeTool[],\n options: AttachRuntimeToolsOptions = {}\n): DispatchRequest {\n const stepList = request.flow.steps\n if (!stepList || !Array.isArray(stepList) || stepList.length === 0) {\n throw new Error('Cannot attach runtime tools: dispatch request must include flow.steps')\n }\n\n const clonedSteps: Array<Record<string, unknown> & { config: Record<string, unknown> }> =\n stepList.map((step) => {\n const stepObj = isObject(step) ? step : {}\n const config = isObject(stepObj.config) ? { ...stepObj.config } : {}\n return {\n ...stepObj,\n config,\n }\n })\n\n const stepIndex = options.stepId\n ? clonedSteps.findIndex((step) => {\n const stepId = typeof step.id === 'string' ? step.id : ''\n const stepType = typeof step.type === 'string' ? step.type : ''\n return stepId === options.stepId && stepType === 'prompt'\n })\n : clonedSteps.findIndex((step) => {\n const stepType = typeof step.type === 'string' ? step.type : ''\n return stepType === 'prompt'\n })\n\n if (stepIndex === -1) {\n throw new Error(\n options.stepId\n ? `Cannot attach runtime tools: prompt step \"${options.stepId}\" not found`\n : 'Cannot attach runtime tools: no prompt step found in flow.steps'\n )\n }\n\n const targetStep = clonedSteps[stepIndex]\n const rawToolsConfig = isObject(targetStep.config.tools) ? targetStep.config.tools : {}\n const existingRuntimeTools = Array.isArray(rawToolsConfig.runtimeTools)\n ? (rawToolsConfig.runtimeTools as RuntimeTool[]).map(cloneRuntimeTool)\n : []\n const incomingRuntimeTools = runtimeTools.map(cloneRuntimeTool)\n\n const mode = options.mode ?? 'append'\n let mergedRuntimeTools =\n mode === 'replace'\n ? incomingRuntimeTools\n : [...existingRuntimeTools, ...incomingRuntimeTools]\n\n const shouldDedupe = options.dedupeByName ?? true\n if (shouldDedupe) {\n mergedRuntimeTools = dedupeToolsByName(mergedRuntimeTools)\n }\n\n targetStep.config = {\n ...targetStep.config,\n tools: {\n ...rawToolsConfig,\n runtimeTools: mergedRuntimeTools,\n },\n }\n\n return {\n ...request,\n flow: {\n ...request.flow,\n steps: clonedSteps,\n },\n }\n}\n\n/**\n * Validate a generated runtime tool proposal and, if approved, attach it to\n * a redispatch request in one call.\n */\nexport function applyGeneratedRuntimeToolProposalToDispatchRequest(\n request: DispatchRequest,\n proposal: unknown,\n options: ApplyGeneratedProposalOptions = {}\n): ApplyGeneratedProposalResult {\n const decision = evaluateGeneratedRuntimeToolProposal(proposal, options.gate)\n if (!decision.approved || !decision.tool) {\n return { decision, request }\n }\n\n const nextRequest = attachRuntimeToolsToDispatchRequest(request, [decision.tool], options.attach)\n return {\n decision,\n request: nextRequest,\n }\n}\n","/**\n * Utility functions shared between workflow phase handlers and AgentsEndpoint.\n *\n * Extracted from AgentsEndpoint private methods to make them accessible\n * to standalone workflow definitions without deep context threading.\n */\n\nexport function normalizeCandidatePath(candidatePath: string): string {\n return candidatePath.trim().replace(/\\\\/g, '/').replace(/^\\.?\\//, '').replace(/\\/+/g, '/')\n}\n\nexport function isMarathonArtifactPath(candidatePath: string): boolean {\n const normalized = normalizeCandidatePath(candidatePath).toLowerCase()\n return normalized === '.runtype' || normalized.startsWith('.runtype/')\n}\n\nexport function isDiscoveryToolName(toolName: string): boolean {\n return (\n toolName === 'search_repo' ||\n toolName === 'glob_files' ||\n toolName === 'tree_directory' ||\n toolName === 'list_directory'\n )\n}\n\nexport function isPreservationSensitiveTask(\n state: Pick<{ originalMessage?: string; bestCandidatePath?: string }, 'originalMessage' | 'bestCandidatePath'>\n): boolean {\n const bestCandidatePath = state.bestCandidatePath || ''\n if (/\\.(html|tsx|jsx|css|scss|sass)$/i.test(bestCandidatePath)) {\n return true\n }\n\n const prompt = (state.originalMessage || '').toLowerCase()\n return [\n 'ux', 'ui', 'design', 'frontend', 'front-end',\n 'theme', 'editor', 'layout', 'style', 'accessibility', 'visual',\n ].some((keyword) => prompt.includes(keyword))\n}\n\nexport function getLikelySupportingCandidatePaths(\n bestCandidatePath: string | undefined,\n candidatePaths: string[] | undefined\n): string[] {\n if (!bestCandidatePath || !candidatePaths || candidatePaths.length === 0) return []\n\n const normalizedBestCandidatePath = normalizeCandidatePath(bestCandidatePath)\n const bestCandidateSegments = normalizedBestCandidatePath.split('/').filter(Boolean)\n const relatedRoot =\n bestCandidateSegments.length >= 2\n ? `${bestCandidateSegments[0]}/${bestCandidateSegments[1]}/`\n : bestCandidateSegments.length === 1\n ? `${bestCandidateSegments[0]}/`\n : ''\n const bestCandidateDir = normalizedBestCandidatePath.includes('/')\n ? `${normalizedBestCandidatePath.slice(0, normalizedBestCandidatePath.lastIndexOf('/'))}/`\n : ''\n\n return candidatePaths\n .map((candidatePath) => normalizeCandidatePath(candidatePath))\n .filter(\n (candidatePath) =>\n candidatePath &&\n candidatePath !== normalizedBestCandidatePath &&\n !isMarathonArtifactPath(candidatePath) &&\n ((bestCandidateDir && candidatePath.startsWith(bestCandidateDir)) ||\n (relatedRoot && candidatePath.startsWith(relatedRoot)))\n )\n}\n\nexport function getDefaultPlanPath(taskName: string): string {\n const slug = sanitizeTaskSlug(taskName || 'task')\n return `.runtype/marathons/${slug}/plan.md`\n}\n\nexport function sanitizeTaskSlug(taskName: string): string {\n return taskName\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80)\n}\n","/**\n * Default marathon workflow: research → planning → execution.\n *\n * This is a data-driven extraction of the previously hardcoded logic\n * in AgentsEndpoint. It handles both \"modify\" and \"create\" task variants\n * via the `workflowVariant` / `isCreationTask` flags on state.\n */\n\nimport type {\n WorkflowDefinition,\n WorkflowPhase,\n RunTaskStateSlice,\n} from '../workflow-types'\n\nimport {\n normalizeCandidatePath,\n isPreservationSensitiveTask,\n getLikelySupportingCandidatePaths,\n getDefaultPlanPath,\n} from '../workflow-utils'\n\n// ─── Helper: check sufficient research evidence ─────────────────────\n\nfunction hasSufficientResearchEvidence(state: RunTaskStateSlice): boolean {\n if (state.isCreationTask) {\n return (state.recentReadPaths?.length || 0) >= 1\n }\n\n if (!state.bestCandidatePath) return false\n\n const normalizedBestCandidatePath = normalizeCandidatePath(state.bestCandidatePath)\n const normalizedRecentReadPaths = (state.recentReadPaths || []).map((readPath) =>\n normalizeCandidatePath(readPath)\n )\n const readBestCandidate = normalizedRecentReadPaths.includes(normalizedBestCandidatePath)\n\n if (!readBestCandidate) {\n return false\n }\n\n if (!isPreservationSensitiveTask(state)) {\n return true\n }\n\n const supportingCandidatePaths = getLikelySupportingCandidatePaths(\n state.bestCandidatePath,\n state.candidatePaths\n )\n if (supportingCandidatePaths.length === 0) {\n return true\n }\n\n return normalizedRecentReadPaths.some(\n (readPath) =>\n readPath !== normalizedBestCandidatePath && supportingCandidatePaths.includes(readPath)\n )\n}\n\n// ─── Helper: detect repeated actions in recovery ─────────────────────\n\nfunction hasRepeatedSameActions(\n sessions: RunTaskStateSlice['sessions']\n): boolean {\n const recent = sessions.slice(-2)\n return (\n recent.length === 2 &&\n recent.every((session) => (session.actionKeys?.length || 0) > 0) &&\n JSON.stringify(recent[0]?.actionKeys || []) === JSON.stringify(recent[1]?.actionKeys || [])\n )\n}\n\n// ─── Helper: extract bootstrap queries ──────────────────────────────\n\nfunction extractBootstrapQueries(message: string): string[] {\n const queries: string[] = []\n const noisyTerms = new Set([\n 'a', 'against', 'all', 'analyze', 'and', 'as', 'at', 'based', 'before', 'best',\n 'by', 'codebase', 'do', 'exactly', 'files', 'first', 'following', 'goal', 'go',\n 'how', 'in', 'is', 'it', 'its', 'make', 'markdown', 'most', 'no', 'of', 'on',\n 'order', 'plan', 'progress', 'repo', 'research', 'right', 'save', 'session',\n 'solve', 'task', 'that', 'the', 'then', 'through', 'to', 'turn', 'update',\n 'user', 'ux', 'web', 'when', 'with', 'work', 'your',\n ])\n const push = (candidate: string) => {\n const normalized = candidate\n .replace(/^[^a-z0-9/._-]+|[^a-z0-9/._ -]+$/gi, '')\n .replace(/\\s+/g, ' ')\n .trim()\n if (!normalized || normalized.length < 3 || normalized.length > 60) return\n const words = normalized.toLowerCase().split(' ').filter(Boolean)\n if (words.length > 4) return\n if (words.every((word) => noisyTerms.has(word))) return\n if (words.length > 1 && noisyTerms.has(words[words.length - 1] || '')) return\n if (!queries.some((existing) => existing.toLowerCase() === normalized.toLowerCase())) {\n queries.push(normalized)\n }\n }\n\n const lowerMessage = message.toLowerCase()\n const phraseHints = ['agent editor', 'theme.html', '/theme.html', 'style it visually']\n for (const hint of phraseHints) {\n if (lowerMessage.includes(hint.toLowerCase())) push(hint)\n }\n for (const match of message.matchAll(/\"([^\"]{3,60})\"/g)) {\n push(match[1] || '')\n }\n for (const match of message.matchAll(\n /(?:go through|review|inspect|edit|improve|update|fix|modify)\\s+(?:the\\s+)?([a-z0-9][a-z0-9/_-]*(?:\\s+[a-z0-9][a-z0-9/_-]*){0,2})/gi\n )) {\n push(match[1] || '')\n }\n for (const match of message.matchAll(\n /([a-z0-9][a-z0-9/_-]*(?:\\s+[a-z0-9][a-z0-9/_-]*){0,2})\\s+(?:page|editor|screen|view|route|component)\\b/gi\n )) {\n push(match[0] || '')\n push(match[1] || '')\n }\n for (const match of message.matchAll(/\\b[\\w./-]+\\.(?:html|tsx|ts|jsx|js|md|json)\\b/g)) {\n push(match[0] || '')\n }\n for (const match of message.matchAll(/\\/[A-Za-z0-9._/-]+/g)) {\n push(match[0] || '')\n }\n for (const match of message.matchAll(/\\b([a-z0-9]+(?:\\s+[a-z0-9]+){1,2})\\b/gi)) {\n const phrase = (match[1] || '').toLowerCase()\n const words = phrase.split(' ')\n if (words.some((word) => ['editor', 'page', 'screen', 'view', 'route', 'component'].includes(word))) {\n push(match[1] || '')\n }\n }\n\n return queries.slice(0, 4)\n}\n\n// ─── Helper: summarize text for bootstrap ────────────────────────────\n\nfunction summarizeTextBlock(value: unknown, maxLines: number = 4): string {\n const text = typeof value === 'string' ? value : value === undefined ? '' : JSON.stringify(value)\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .slice(0, maxLines)\n .join(' | ')\n .slice(0, 240)\n}\n\n// ─── Research Phase ──────────────────────────────────────────────────\n\nconst researchPhase: WorkflowPhase = {\n name: 'research',\n description: 'Inspect the repo and identify the correct target file',\n\n buildInstructions(state) {\n const planPath = state.planPath || getDefaultPlanPath(state.taskName)\n\n if (state.isCreationTask) {\n return [\n '--- Workflow Phase: Research ---',\n 'This is a creation task — you are building something new, not modifying existing code.',\n 'Briefly inspect the repo structure to understand the project setup (package manager, build tools, directory layout).',\n 'Identify where new files should be placed based on existing conventions.',\n 'Do NOT search for an existing file to edit — there is not one for this task.',\n `When research is complete, the system will advance you to planning and require a plan at: ${planPath}`,\n ].join('\\n')\n }\n\n return [\n '--- Workflow Phase: Research ---',\n 'Your current job is to inspect the repo, identify the correct existing target file, and gather enough evidence for a plan.',\n 'Identify related supporting files and current behaviors that must be preserved before planning.',\n 'Do NOT edit the target product file yet.',\n `When research is complete, the system will advance you to planning and require a plan at: ${planPath}`,\n ].join('\\n')\n },\n\n buildToolGuidance(state) {\n if (state.isCreationTask) {\n return [\n 'This is a creation task — you are building new files, not editing existing ones.',\n 'Read package.json and/or run tree_directory to understand the repo structure and conventions.',\n 'Then end the turn so the system can advance you to planning.',\n ]\n }\n return [\n 'For repository modification tasks, before any write_file call you must perform at least one discovery action (search_repo, glob_files, or tree_directory).',\n 'If discovery finds a plausible existing file, you must read at least one candidate file before writing.',\n 'Before creating a new file, search the repo for existing relevant files, routes, links, components, or pages.',\n 'Prefer editing an existing file when one already implements or links to the feature you were asked to change.',\n 'Use search_repo, glob_files, and tree_directory to discover the right files before you call write_file.',\n 'Only create a new file when no suitable existing file exists, and make that decision intentionally.',\n ]\n },\n\n isComplete(ctx) {\n return hasSufficientResearchEvidence(ctx.state)\n },\n\n buildTransitionSummary(state, _nextPhaseName) {\n if (state.isCreationTask) {\n return [\n 'Automatic phase transition: research -> planning.',\n 'Repo structure reviewed. Ready to plan the creation.',\n `Next step: write the plan markdown to ${state.planPath}.`,\n ].join('\\n')\n }\n return [\n 'Automatic phase transition: research -> planning.',\n `Best candidate confirmed: ${state.bestCandidatePath}`,\n `Next step: write the plan markdown to ${state.planPath} before editing the product file.`,\n ].join('\\n')\n },\n\n interceptToolCall() {\n // No blocking in research phase\n return undefined\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n const normalizedPlanPath =\n typeof state.planPath === 'string' && state.planPath.trim()\n ? normalizeCandidatePath(state.planPath)\n : undefined\n const recentPlanOnlyLoop =\n Boolean(normalizedPlanPath) &&\n recent.length === 2 &&\n recent.every((session) => {\n const specificActionKeys = (session.actionKeys || [])\n .map((actionKey) => actionKey.replace(/\\\\/g, '/'))\n .filter((actionKey) => !actionKey.startsWith('server:'))\n return (\n specificActionKeys.length > 0 &&\n specificActionKeys.every((actionKey) => actionKey.includes(normalizedPlanPath!))\n )\n })\n\n if (\n recent.length < 2 ||\n !(\n recent.every((session) => session.hadTextOutput === false && session.wroteFiles === false) ||\n recentPlanOnlyLoop\n )\n ) {\n return undefined\n }\n\n const repeatedSameActions = hasRepeatedSameActions(state.sessions)\n\n if (state.isCreationTask) {\n return [\n 'Recovery instruction:',\n 'Your previous sessions produced no output. This is a creation task — you are building something new.',\n 'Read package.json or run tree_directory to understand the repo, then end the turn so the system advances you to planning.',\n 'Do NOT search for an existing file to edit.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; break the loop by reading one repo file and ending the turn.']\n : []),\n ].join('\\n')\n }\n\n if (state.bestCandidatePath) {\n const recentlyReadBestCandidate = (state.recentReadPaths || []).includes(state.bestCandidatePath)\n return [\n 'Recovery instruction:',\n 'Your previous sessions produced no final text and did not complete a useful edit.',\n `You already have a best candidate file: \"${state.bestCandidatePath}\".`,\n ...(state.bestCandidateReason ? [`Reason: ${state.bestCandidateReason}`] : []),\n recentlyReadBestCandidate\n ? `Do not keep searching. Your next action must be to edit \"${state.bestCandidatePath}\" with write_file, or explain why that file is not the correct target.`\n : `Do not keep searching. Your next action must be read_file on \"${state.bestCandidatePath}\".`,\n 'Do not call list_directory, tree_directory, glob_files, or search_repo again unless that candidate path is missing or clearly wrong.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; break the loop by acting on the best candidate now.']\n : []),\n ].join('\\n')\n }\n\n const queries = extractBootstrapQueries(state.originalMessage || '')\n const queryHint =\n queries.length > 0\n ? `Start with these exact repo searches: ${queries.map((query) => `\"${query}\"`).join(', ')}.`\n : 'Start with a concrete repo search using the key nouns from the original task.'\n\n return [\n 'Recovery instruction:',\n 'Your previous sessions produced no final text and did not edit files.',\n queryHint,\n 'Then read the most relevant existing file you find before any write_file call.',\n 'If a route, link, or page already exists, edit that existing file instead of creating a new one.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; pick one candidate and act on it.']\n : []),\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, ctx) {\n const state = ctx.state\n const sufficientResearch = hasSufficientResearchEvidence(state)\n\n if (sufficientResearch && snapshot.discoveryPauseCount >= 12) {\n return 'research evidence is already sufficient, but this execution kept issuing discovery tools instead of ending the turn'\n }\n if (snapshot.actionKeyCount >= 4) {\n return `the same discovery action repeated ${snapshot.actionKeyCount} times in one session`\n }\n if (snapshot.consecutiveDiscoveryPauseCount >= 18 || snapshot.discoveryPauseCount >= 24) {\n return 'this session exceeded the discovery-tool budget without ending the turn'\n }\n return undefined\n },\n}\n\n// ─── Planning Phase ──────────────────────────────────────────────────\n\nconst planningPhase: WorkflowPhase = {\n name: 'planning',\n description: 'Write the implementation plan before editing product files',\n\n buildInstructions(state) {\n const planPath = state.planPath || getDefaultPlanPath(state.taskName)\n\n if (state.isCreationTask) {\n return [\n '--- Workflow Phase: Planning ---',\n 'Research is complete. Write the implementation plan for building this from scratch.',\n `Write the plan markdown to exactly: ${planPath}`,\n 'List the files you will create, their locations, purpose, and any dependencies to install.',\n 'Include a \"Verification steps\" section listing the concrete checks you will run before TASK_COMPLETE.',\n 'If the plan already exists, update that same plan file instead of creating a different one.',\n ].join('\\n')\n }\n return [\n '--- Workflow Phase: Planning ---',\n 'Research is complete. Your current job is to write the implementation plan before any product-file edits.',\n `Write the plan markdown to exactly: ${planPath}`,\n 'Do NOT edit the target product file yet.',\n 'The plan should summarize UX findings, explain why the current best candidate is the right file, and list concrete execution steps.',\n 'The plan must include a \"Preserve existing functionality\" section that lists current behaviors, linked files, integrations, and constraints that must keep working.',\n 'The plan must include a \"Verification steps\" section listing the concrete checks you will run before TASK_COMPLETE.',\n 'If the plan already exists, update that same plan file instead of creating a different one.',\n ].join('\\n')\n },\n\n buildToolGuidance(state) {\n return [\n `Research is already complete. Focus on writing or updating the plan at: ${state.planPath || getDefaultPlanPath(state.taskName)}.`,\n 'Do not restart broad repo discovery unless the saved best candidate is clearly invalid.',\n 'You may read the current target file or supporting source files if you need evidence for the plan.',\n 'Ground the plan in the existing implementation. Identify which current behaviors and linked files must be preserved.',\n 'List the exact verification commands you expect to run after editing, such as lint, typecheck, tests, or build.',\n ]\n },\n\n isComplete(ctx) {\n return ctx.trace.planWritten || Boolean(ctx.state.planWritten)\n },\n\n buildTransitionSummary(state, _nextPhaseName) {\n return [\n 'Automatic phase transition: planning -> execution.',\n `Plan path: ${state.planPath}`,\n ...(state.bestCandidatePath ? [`Execute against: ${state.bestCandidatePath}`] : []),\n 'Next step: edit the target file(s) and update the plan with progress each turn.',\n ].join('\\n')\n },\n\n interceptToolCall(toolName, args, ctx) {\n const normalizedPathArg =\n typeof args.path === 'string' && args.path.trim()\n ? ctx.normalizePath(String(args.path))\n : undefined\n const normalizedPlanPath = ctx.state.planPath\n ? ctx.normalizePath(ctx.state.planPath)\n : undefined\n const isWriteLikeTool = toolName === 'write_file' || toolName === 'restore_file_checkpoint'\n\n if (\n isWriteLikeTool &&\n normalizedPathArg &&\n normalizedPlanPath &&\n normalizedPathArg !== normalizedPlanPath\n ) {\n return [\n `Blocked by marathon planning guard: ${toolName} must target the exact plan path during planning.`,\n `Write the plan to \"${normalizedPlanPath}\" before editing any product files.`,\n ].join(' ')\n }\n\n return undefined\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n const normalizedPlanPath =\n typeof state.planPath === 'string' && state.planPath.trim()\n ? normalizeCandidatePath(state.planPath)\n : undefined\n const recentPlanOnlyLoop =\n Boolean(normalizedPlanPath) &&\n recent.length === 2 &&\n recent.every((session) => {\n const specificActionKeys = (session.actionKeys || [])\n .map((actionKey) => actionKey.replace(/\\\\/g, '/'))\n .filter((actionKey) => !actionKey.startsWith('server:'))\n return (\n specificActionKeys.length > 0 &&\n specificActionKeys.every((actionKey) => actionKey.includes(normalizedPlanPath!))\n )\n })\n\n if (\n recent.length < 2 ||\n !(\n recent.every((session) => session.hadTextOutput === false && session.wroteFiles === false) ||\n recentPlanOnlyLoop\n )\n ) {\n return undefined\n }\n\n const repeatedSameActions = hasRepeatedSameActions(state.sessions)\n\n return [\n 'Recovery instruction:',\n 'Research is already complete. Stop rediscovering and write the plan now.',\n `Your next action must be write_file to \"${state.planPath}\".`,\n 'The plan must summarize UX findings, include a \"Preserve existing functionality\" section, name the best candidate file, and list execution steps.',\n 'Do not edit the product file until the plan exists.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; break the loop by writing the plan file now.']\n : []),\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, ctx) {\n if (!ctx.trace.planWritten && snapshot.consecutiveDiscoveryPauseCount >= 18) {\n return 'planning is looping on discovery instead of writing the plan and ending the turn'\n }\n return undefined\n },\n}\n\n// ─── Execution Phase ─────────────────────────────────────────────────\n\nconst executionPhase: WorkflowPhase = {\n name: 'execution',\n description: 'Execute the plan by editing target files',\n\n buildInstructions(state) {\n const planPath = state.planPath || getDefaultPlanPath(state.taskName)\n\n if (state.isCreationTask) {\n return [\n '--- Workflow Phase: Execution ---',\n `The plan should already exist at: ${planPath}`,\n 'Create the new files according to your plan using write_file.',\n 'Install any necessary dependencies.',\n 'Before ending each turn, update the markdown plan with progress against the steps you completed.',\n 'Before TASK_COMPLETE, run verification to confirm the creation works.',\n ].join('\\n')\n }\n return [\n '--- Workflow Phase: Execution ---',\n `The plan should already exist at: ${planPath}`,\n ...(state.bestCandidatePath ? [`Primary target file: ${state.bestCandidatePath}`] : []),\n 'Execute the plan by editing the target files.',\n 'Before ending each turn, update the markdown plan with progress against the steps you completed.',\n 'Modify the existing implementation incrementally. Do not replace the whole file unless the user explicitly asked for a rewrite.',\n 'Preserve existing functionality, handlers, imports, routes, configuration, and data flow unless the plan explicitly calls for changing them.',\n 'Before TASK_COMPLETE, run a verification command that matches the repo, such as lint, tests, build, or typecheck.',\n 'Avoid broad repo discovery unless the current candidate is clearly wrong.',\n ].join('\\n')\n },\n\n buildToolGuidance(state) {\n return [\n ...(state.bestCandidatePath\n ? [\n `Execution-phase guard: broad discovery tools (search_repo, glob_files, tree_directory, list_directory) are locked while executing against \"${state.bestCandidatePath}\".`,\n ]\n : [\n 'Execution-phase guard: broad discovery tools are locked unless a read of the current target fails.',\n ]),\n 'Reading the markdown plan for status does not change the product target. Do not treat the plan file as the file to implement.',\n 'Do not write the plan file first in execution. Make a real repo-file edit before you update the plan with progress.',\n 'Do not create scratch or test files to probe the repo or tool behavior.',\n 'write_file automatically checkpoints original repo files before overwriting them. If an edit regresses behavior, use restore_file_checkpoint on that file.',\n 'Read the target file and edit it with write_file. Update the plan file with progress after completing real edits.',\n 'Before large edits, read any already discovered supporting source/style files that power the target so you preserve existing behavior.',\n 'Prefer minimal diffs over rewrites. If you cannot verify related behavior, stop and record what is still unverified instead of rewriting blindly.',\n 'Use run_check for real verification before TASK_COMPLETE. Good examples: \"pnpm lint\", \"pnpm exec tsc --noEmit\", \"pnpm test\", or a focused vitest/pytest command.',\n 'Broad discovery is only allowed if a read of the current target file fails.',\n ]\n },\n\n isComplete() {\n // Execution never auto-advances; completion is agent-driven via TASK_COMPLETE\n return false\n },\n\n interceptToolCall(toolName, args, ctx) {\n const normalizedPathArg =\n typeof args.path === 'string' && args.path.trim()\n ? ctx.normalizePath(String(args.path))\n : undefined\n const normalizedPlanPath = ctx.state.planPath\n ? ctx.normalizePath(ctx.state.planPath)\n : undefined\n const normalizedBestCandidatePath = ctx.state.bestCandidatePath\n ? ctx.normalizePath(ctx.state.bestCandidatePath)\n : undefined\n\n const isWriteLikeTool = toolName === 'write_file' || toolName === 'restore_file_checkpoint'\n\n // Block discovery tools during execution (unless read failed)\n if (\n normalizedBestCandidatePath &&\n ctx.isDiscoveryTool(toolName) &&\n !ctx.trace.bestCandidateReadFailed\n ) {\n return [\n `Blocked by marathon execution guard: ${toolName} is disabled during execution.`,\n `Read or edit \"${normalizedBestCandidatePath}\" instead.`,\n 'Broad discovery is only re-enabled if a read of the current target file fails.',\n ].join(' ')\n }\n\n if (isWriteLikeTool) {\n // Block writing plan file before any real repo-file edit\n if (\n normalizedPathArg &&\n normalizedPlanPath &&\n normalizedBestCandidatePath &&\n normalizedPathArg === normalizedPlanPath &&\n !ctx.trace.executionFileWritten\n ) {\n return [\n `Blocked by marathon execution guard: ${toolName} cannot update the plan file before any real repo-file edit in this execution turn.`,\n `Edit \"${normalizedBestCandidatePath}\" or another previously discovered repo file first.`,\n `After that, you may update \"${normalizedPlanPath}\" with progress.`,\n ].join(' ')\n }\n\n // Block writes to undiscovered files\n if (normalizedPathArg && normalizedPathArg !== normalizedPlanPath) {\n const allowedWriteTargets = new Set(\n [\n normalizedPlanPath,\n normalizedBestCandidatePath,\n ...(ctx.state.recentReadPaths || []).map((readPath) => ctx.normalizePath(readPath)),\n ...ctx.trace.readPaths.map((readPath) => ctx.normalizePath(readPath)),\n ].filter((value): value is string => Boolean(value))\n )\n if (!allowedWriteTargets.has(normalizedPathArg)) {\n return [\n `Blocked by marathon execution guard: ${toolName} is limited to the confirmed target, the plan file, or files already discovered/read for this task.`,\n `Do not create scratch files like \"${normalizedPathArg}\".`,\n normalizedBestCandidatePath\n ? `Edit \"${normalizedBestCandidatePath}\" or another previously discovered repo file instead.`\n : 'Read the current target file before writing.',\n ].join(' ')\n }\n }\n }\n\n return undefined\n },\n\n canAcceptCompletion(state, trace) {\n if (!state.bestCandidatePath) {\n return true\n }\n\n const verificationSatisfied =\n !state.verificationRequired ||\n Boolean(state.lastVerificationPassed || trace.verificationPassed)\n\n return (\n Boolean(state.planWritten) &&\n Boolean(state.bestCandidateVerified || trace.bestCandidateVerified) &&\n verificationSatisfied\n )\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n const normalizedPlanPath =\n typeof state.planPath === 'string' && state.planPath.trim()\n ? normalizeCandidatePath(state.planPath)\n : undefined\n const recentPlanOnlyLoop =\n Boolean(normalizedPlanPath) &&\n recent.length === 2 &&\n recent.every((session) => {\n const specificActionKeys = (session.actionKeys || [])\n .map((actionKey) => actionKey.replace(/\\\\/g, '/'))\n .filter((actionKey) => !actionKey.startsWith('server:'))\n return (\n specificActionKeys.length > 0 &&\n specificActionKeys.every((actionKey) => actionKey.includes(normalizedPlanPath!))\n )\n })\n\n if (\n recent.length < 2 ||\n !(\n recent.every((session) => session.hadTextOutput === false && session.wroteFiles === false) ||\n recentPlanOnlyLoop\n )\n ) {\n return undefined\n }\n\n const repeatedSameActions = hasRepeatedSameActions(state.sessions)\n\n if (state.isCreationTask) {\n return [\n 'Recovery instruction:',\n 'Planning should already be complete. Stop researching and create the new files now.',\n 'Your next action must be write_file to create the files described in your plan.',\n 'After creating files, run a verification command with run_check before TASK_COMPLETE.',\n ...(repeatedSameActions\n ? ['You are repeating the same actions; break the loop by creating new files now.']\n : []),\n ].join('\\n')\n }\n\n if (state.bestCandidatePath) {\n const normalizedBestCandidatePath = normalizeCandidatePath(state.bestCandidatePath)\n const recentlyReadBestCandidate = (state.recentReadPaths || [])\n .map((readPath) => normalizeCandidatePath(readPath))\n .includes(normalizedBestCandidatePath)\n return [\n 'Recovery instruction:',\n 'Planning should already be complete. Stop rediscovering and execute the plan.',\n recentlyReadBestCandidate\n ? `Your next action must be write_file on \"${state.bestCandidatePath}\".`\n : `Your next action must be read_file on \"${state.bestCandidatePath}\" so you can edit it next.`,\n ...(state.planPath\n ? [`Do not write \"${state.planPath}\" again until after you complete a real repo-file edit in this session.`]\n : []),\n 'After editing, run a verification command with run_check before TASK_COMPLETE.',\n 'Do not call broad discovery tools again unless the target file is missing or invalid.',\n ...(repeatedSameActions\n ? ['You are repeating the same discovery actions; break the loop by editing the target file now.']\n : []),\n ].join('\\n')\n }\n\n return undefined\n },\n\n shouldForceEndTurn(snapshot, ctx) {\n if (!ctx.trace.executionFileWritten && snapshot.consecutiveDiscoveryPauseCount >= 18) {\n return 'execution is looping on discovery instead of editing repo files and ending the turn'\n }\n return undefined\n },\n}\n\n// ─── Variant classification ──────────────────────────────────────────\n\nfunction classifyVariant(message: string): string | undefined {\n const lower = message.toLowerCase()\n const creationPatterns = [\n /^create\\b/, /^build\\b/, /^make\\b/, /^generate\\b/, /^scaffold\\b/,\n /^set up\\b/, /^setup\\b/, /^bootstrap\\b/, /^initialize\\b/, /^init\\b/,\n /^write a\\b/, /^write an\\b/, /^implement a\\b/, /^implement an\\b/,\n /^start a\\b/, /^start an\\b/, /^new\\b/,\n ]\n const hasCreationStart = creationPatterns.some((p) => p.test(lower))\n\n const modificationVerbs = [\n 'fix', 'update', 'change', 'modify', 'edit', 'refactor',\n 'improve', 'add to', 'remove', 'delete', 'rename', 'migrate',\n ]\n const hasModificationVerb = modificationVerbs.some(\n (v) => lower.startsWith(v) || new RegExp(`\\\\b${v}\\\\b`).test(lower)\n )\n\n if (hasCreationStart && !hasModificationVerb) {\n return 'create'\n }\n\n return 'modify'\n}\n\n// ─── Bootstrap context generation ────────────────────────────────────\n\nasync function generateBootstrapContext(\n message: string,\n localTools: Record<string, { execute: (args: Record<string, unknown>) => Promise<unknown> }> | undefined,\n variant?: string\n): Promise<string | undefined> {\n if (variant === 'create') return undefined\n if (!localTools) return undefined\n\n const searchTool = localTools.search_repo\n const globTool = localTools.glob_files\n if (!searchTool && !globTool) return undefined\n\n const queries = extractBootstrapQueries(message)\n if (queries.length === 0) return undefined\n\n const lines: string[] = []\n for (const query of queries) {\n if (lines.length >= 6) break\n\n if (searchTool) {\n try {\n const result = await searchTool.execute({ query, path: '.', maxResults: 5 })\n const summary = summarizeTextBlock(result, 3)\n if (summary && !summary.startsWith('No matches found')) {\n lines.push(`search_repo \"${query}\": ${summary}`)\n continue\n }\n } catch {\n // Best effort bootstrap only\n }\n }\n\n if (globTool && /\\./.test(query)) {\n try {\n const result = await globTool.execute({ pattern: `**/${query}`, path: '.', maxResults: 5 })\n const summary = summarizeTextBlock(result, 3)\n if (summary && !summary.startsWith('No files matched')) {\n lines.push(`glob_files \"**/${query}\": ${summary}`)\n }\n } catch {\n // Best effort bootstrap only\n }\n }\n }\n\n if (lines.length === 0) return undefined\n return ['Bootstrap repo hints:', ...lines].join('\\n').slice(0, 1500)\n}\n\n// ─── Candidate block builder ─────────────────────────────────────────\n\nfunction buildCandidateBlock(state: RunTaskStateSlice): string {\n if (!state.bestCandidatePath || state.isCreationTask) return ''\n return [\n '',\n '--- Best Candidate ---',\n `Current best candidate file: ${state.bestCandidatePath}`,\n ...(state.bestCandidateReason ? [`Why: ${state.bestCandidateReason}`] : []),\n ].join('\\n')\n}\n\n// ─── Export the default workflow ─────────────────────────────────────\n\nexport const defaultWorkflow: WorkflowDefinition = {\n name: 'default',\n phases: [researchPhase, planningPhase, executionPhase],\n classifyVariant,\n generateBootstrapContext,\n buildCandidateBlock,\n}\n","/**\n * Deploy workflow: scaffold → deploy.\n *\n * A streamlined two-phase workflow for tasks where the goal is to build\n * code and deploy it to a sandbox with a live preview URL, rather than\n * editing files in the local repository.\n *\n * Phase 1 (scaffold): Understand what the user wants built. Quick —\n * auto-advances after the agent has acknowledged the task.\n *\n * Phase 2 (deploy): Write code and call deploy_sandbox to get a live\n * preview URL. Iterate on errors until the deployment succeeds.\n */\n\nimport type {\n WorkflowDefinition,\n WorkflowPhase,\n} from '../workflow-types'\n\n// ─── Scaffold Phase ──────────────────────────────────────────────────\n\nconst scaffoldPhase: WorkflowPhase = {\n name: 'scaffold',\n description: 'Understand requirements for the app to deploy',\n\n buildInstructions(_state) {\n return [\n '--- Workflow Phase: Scaffold ---',\n 'This is a deploy-to-sandbox task. You will build code and deploy it to a live sandbox — you are NOT editing files in the local repository.',\n 'Quickly determine:',\n ' 1. What the user wants built (web app, API, UI, etc.)',\n ' 2. The tech stack (Express, Hono, React, vanilla HTML, etc.)',\n ' 3. Any specific dependencies needed',\n ' 4. Which port the server should listen on (default: 3000)',\n '',\n 'Do NOT inspect the local repo or search for files to edit.',\n 'Do NOT write a plan file.',\n 'Once you understand the requirements, proceed to build and deploy using deploy_sandbox.',\n ].join('\\n')\n },\n\n buildToolGuidance(_state) {\n return [\n 'This is a sandbox deploy task — do NOT use write_file, read_file, search_repo, glob_files, tree_directory, or list_directory.',\n 'Your primary tool is deploy_sandbox. Use it to deploy code to a persistent sandbox and get a live preview URL.',\n 'You may use run_sandbox_code for quick one-off tests before a full deploy.',\n ]\n },\n\n isComplete(ctx) {\n // Auto-advance after the first session — the agent should have\n // understood requirements and can start deploying immediately.\n // Also advance if a deploy_sandbox call was already made (eager agent).\n return ctx.state.sessions.length >= 1 ||\n ctx.trace.entries.some((entry) => entry.startsWith('deploy_sandbox'))\n },\n\n buildTransitionSummary(_state, _nextPhaseName) {\n return [\n 'Automatic phase transition: scaffold → deploy.',\n 'Requirements understood. Build the code and deploy it using deploy_sandbox.',\n ].join('\\n')\n },\n\n interceptToolCall(toolName, _args, _ctx) {\n // Block local file system tools — this workflow doesn't touch the repo\n const blockedTools = ['write_file', 'read_file', 'search_repo', 'glob_files', 'tree_directory', 'list_directory', 'restore_file_checkpoint']\n if (blockedTools.includes(toolName)) {\n return [\n `Blocked: ${toolName} is not available in deploy mode.`,\n 'Use deploy_sandbox to deploy your code to a live sandbox instead of writing files to the local repo.',\n ].join(' ')\n }\n return undefined\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n if (recent.length < 2) return undefined\n\n const noProgress = recent.every(\n (s) => s.hadTextOutput === false && s.wroteFiles === false\n )\n if (!noProgress) return undefined\n\n return [\n 'Recovery instruction:',\n 'You are in deploy mode — do NOT search the local repo or write local files.',\n 'Your goal is to build code and deploy it using deploy_sandbox.',\n 'Determine what the user wants built and call deploy_sandbox with the code.',\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, _ctx) {\n // Force end if looping on blocked tools\n if (snapshot.pauseCount >= 12) {\n return 'scaffold phase is looping without progressing — end the turn so the system can advance to deploy'\n }\n return undefined\n },\n}\n\n// ─── Deploy Phase ────────────────────────────────────────────────────\n\nconst deployPhase: WorkflowPhase = {\n name: 'deploy',\n description: 'Build code and deploy to sandbox with live preview',\n\n buildInstructions(_state) {\n return [\n '--- Workflow Phase: Deploy ---',\n 'Build the code and deploy it using the deploy_sandbox tool.',\n '',\n 'deploy_sandbox takes:',\n ' - code: The full source code (written to main.ts/main.js/main.py)',\n ' - files: Additional files (path → content), e.g. { \"public/index.html\": \"<html>...\" }',\n ' - packageJson: Dependencies as a JSON object, e.g. { \"dependencies\": { \"express\": \"^4.18.2\" } }',\n ' - language: \"typescript\" (default), \"javascript\", or \"python\"',\n ' - port: The port your server listens on (default: 3000)',\n ' - startCommand: Custom start command (auto-detected by default)',\n '',\n 'It returns a live previewUrl that the user can open in their browser.',\n '',\n 'Guidelines:',\n ' 1. Write complete, working code in a single deploy_sandbox call — the code param is the entire file.',\n ' 2. The server MUST listen on the specified port. For Express: app.listen(3000)',\n ' 3. Include ALL dependencies in packageJson — nothing is pre-installed except Node.js built-ins.',\n ' 4. If the deploy fails, read the error output, fix the code, and call deploy_sandbox again.',\n ' 5. The sandbox is persistent — subsequent calls reuse the same sandbox.',\n ' 6. When the deploy succeeds and the preview URL is live, tell the user and end with TASK_COMPLETE.',\n ' 7. For apps with HTML frontends, use the `files` parameter to write HTML/CSS/JS to separate files and serve them with express.static, rather than embedding HTML in template literals.',\n ].join('\\n')\n },\n\n buildToolGuidance(_state) {\n return [\n 'Your primary tool is deploy_sandbox. Call it with code, packageJson, language, and port.',\n 'Do NOT use write_file, read_file, search_repo, glob_files, tree_directory, or list_directory — you are deploying to a sandbox, not editing local files.',\n 'You may use run_sandbox_code for quick one-off script execution if needed.',\n 'When deploy_sandbox returns successfully with a previewUrl, tell the user the URL and end with TASK_COMPLETE.',\n ]\n },\n\n isComplete() {\n // Agent-driven completion via TASK_COMPLETE\n return false\n },\n\n interceptToolCall(toolName, _args, _ctx) {\n // Block local file system tools\n const blockedTools = ['write_file', 'read_file', 'search_repo', 'glob_files', 'tree_directory', 'list_directory', 'restore_file_checkpoint']\n if (blockedTools.includes(toolName)) {\n return [\n `Blocked: ${toolName} is not available in deploy mode.`,\n 'Use deploy_sandbox to deploy your code to a live sandbox instead of writing files to the local repo.',\n ].join(' ')\n }\n return undefined\n },\n\n canAcceptCompletion(state, trace) {\n // Accept completion if deploy_sandbox was called in this session or any previous session\n // @snake-case-ok: Tool name identifier uses snake_case to match agent tool definitions\n if (trace.entries.some((entry) => entry.startsWith('deploy_sandbox'))) {\n return true\n }\n // Check previous sessions' action keys for deploy_sandbox\n return state.sessions.some((s) =>\n s.actionKeys?.some((key) => key.startsWith('deploy_sandbox'))\n )\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n if (recent.length < 2) return undefined\n\n const noProgress = recent.every(\n (s) => s.hadTextOutput === false && s.wroteFiles === false\n )\n if (!noProgress) return undefined\n\n return [\n 'Recovery instruction:',\n 'You should be deploying code using deploy_sandbox, not searching the repo.',\n 'Write the complete server code and call deploy_sandbox with it.',\n 'Include all dependencies in the packageJson parameter.',\n 'The server must listen on the specified port (default 3000).',\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, _ctx) {\n if (snapshot.consecutiveDiscoveryPauseCount >= 8) {\n return 'deploy phase is looping on discovery tools instead of calling deploy_sandbox'\n }\n if (snapshot.actionKeyCount >= 4) {\n return `the same action repeated ${snapshot.actionKeyCount} times — try a different approach`\n }\n return undefined\n },\n}\n\n// ─── Variant classification ──────────────────────────────────────────\n\nfunction classifyVariant(message: string): string | undefined {\n const lower = message.toLowerCase()\n\n // Deploy patterns — check these first since they're the whole point of this workflow\n const deployPatterns = [\n /\\bdeploy\\b/, /\\bsandbox\\b/, /\\bpreview\\s*url\\b/, /\\blive\\s*preview\\b/,\n /\\bhost\\b.*\\b(?:app|server|api|site)\\b/, /\\b(?:app|server|api|site)\\b.*\\bhost\\b/,\n /\\brun\\b.*\\b(?:server|web\\s*app)\\b/, /\\blaunch\\b.*\\b(?:app|server|api|site)\\b/,\n /\\bstart\\b.*\\b(?:server|web\\s*app)\\b/,\n ]\n if (deployPatterns.some((p) => p.test(lower))) {\n return 'deploy'\n }\n\n // Also classify as deploy if the message is about building a web app/API/site\n // without mentioning local files or repo modification\n const webAppPatterns = [\n /\\bbuild\\b.*\\b(?:web\\s*app|website|api|server|express|hono|fastify)\\b/,\n /\\bcreate\\b.*\\b(?:web\\s*app|website|api|server|express|hono|fastify)\\b/,\n /\\bmake\\b.*\\b(?:web\\s*app|website|api|server|express|hono|fastify)\\b/,\n ]\n const repoPatterns = [\n /\\b(?:file|repo|repository|codebase|project|directory|folder)\\b/,\n /\\b(?:edit|modify|update|fix|refactor|change)\\b/,\n ]\n if (webAppPatterns.some((p) => p.test(lower)) && !repoPatterns.some((p) => p.test(lower))) {\n return 'deploy'\n }\n\n return 'deploy' // This workflow is only used when deploy intent is detected\n}\n\n// ─── Export the deploy workflow ──────────────────────────────────────\n\nexport const deployWorkflow: WorkflowDefinition = {\n name: 'deploy',\n phases: [scaffoldPhase, deployPhase],\n classifyVariant,\n\n // No bootstrap context needed — we're not searching the repo\n async generateBootstrapContext() {\n return undefined\n },\n\n // No candidate block — we're not editing repo files\n buildCandidateBlock() {\n return ''\n },\n}\n","/**\n * Game workflow: design → build → verify.\n *\n * A three-phase workflow for tasks where the goal is to build a game\n * (Three.js, Phaser, WebGL, etc.) and deploy it to a Daytona sandbox.\n *\n * The key difference from the deploy workflow is that game code often\n * uses template literals, which break when embedded inside Express\n * `res.send()` template literals. This workflow instructs the agent to\n * use the `files` parameter for multi-file deployment (Express static\n * server + separate HTML/JS/CSS files).\n *\n * Phase 1 (design): Understand game requirements. Auto-advances after\n * the first session.\n *\n * Phase 2 (build): Write game code using multi-file deployment. The\n * agent uses `code` for a minimal Express static server and `files`\n * for the actual game assets (HTML, JS, CSS).\n *\n * Phase 3 (verify): Confirm the game is running and playable. Auto-\n * accepts completion when deploy_sandbox has succeeded.\n */\n\nimport type {\n WorkflowDefinition,\n WorkflowPhase,\n} from '../workflow-types'\n\n// Tools blocked in all phases — this workflow doesn't touch the repo\nconst blockedTools = ['write_file', 'read_file', 'search_repo', 'glob_files', 'tree_directory', 'list_directory', 'restore_file_checkpoint']\n\nfunction blockLocalTools(toolName: string): string | undefined {\n if (blockedTools.includes(toolName)) {\n return [\n `Blocked: ${toolName} is not available in game deploy mode.`,\n 'Use deploy_sandbox to deploy your game to a live sandbox instead of writing files to the local repo.',\n ].join(' ')\n }\n return undefined\n}\n\n// ─── Design Phase ───────────────────────────────────────────────────\n\nconst designPhase: WorkflowPhase = {\n name: 'design',\n description: 'Understand game requirements and plan the approach',\n\n buildInstructions(_state) {\n return [\n '--- Workflow Phase: Design ---',\n 'This is a game development task. You will build a game and deploy it to a live sandbox — you are NOT editing files in the local repository.',\n 'Quickly determine:',\n ' 1. What type of game (3D, 2D, platformer, racing, puzzle, etc.)',\n ' 2. Theme and visual style',\n ' 3. Core game mechanics (controls, scoring, win/lose conditions)',\n ' 4. Tech stack (Three.js, Phaser, vanilla Canvas/WebGL, etc.)',\n ' 5. Any specific dependencies needed',\n '',\n 'Do NOT inspect the local repo or search for files to edit.',\n 'Do NOT write a plan file.',\n 'Once you understand the requirements, proceed to build and deploy.',\n ].join('\\n')\n },\n\n buildToolGuidance(_state) {\n return [\n 'This is a sandbox deploy task — do NOT use write_file, read_file, search_repo, glob_files, tree_directory, or list_directory.',\n 'Your primary tool is deploy_sandbox. Use it to deploy code to a persistent sandbox and get a live preview URL.',\n ]\n },\n\n isComplete(ctx) {\n return ctx.state.sessions.length >= 1 ||\n ctx.trace.entries.some((entry) => entry.startsWith('deploy_sandbox'))\n },\n\n buildTransitionSummary(_state, _nextPhaseName) {\n return [\n 'Automatic phase transition: design → build.',\n 'Requirements understood. Build the game and deploy it using deploy_sandbox with the files parameter.',\n ].join('\\n')\n },\n\n interceptToolCall(toolName, _args, _ctx) {\n return blockLocalTools(toolName)\n },\n\n shouldForceEndTurn(snapshot, _ctx) {\n if (snapshot.pauseCount >= 12) {\n return 'design phase is looping without progressing — end the turn so the system can advance to build'\n }\n return undefined\n },\n}\n\n// ─── Build Phase ────────────────────────────────────────────────────\n\nconst buildPhase: WorkflowPhase = {\n name: 'build',\n description: 'Build the game and deploy to sandbox with live preview',\n\n buildInstructions(_state) {\n return [\n '--- Workflow Phase: Build ---',\n 'Build the game and deploy it using the deploy_sandbox tool.',\n '',\n 'CRITICAL: Multi-file deployment pattern',\n ' You MUST use the `files` parameter for the game HTML/JS/CSS.',\n ' NEVER embed HTML inside a JavaScript template literal in Express `res.send()` — this WILL break',\n ' because game code uses backticks (template literals) which cause nested backtick corruption.',\n '',\n ' Correct pattern:',\n ' - code: A minimal Express static file server (~5 lines):',\n ' ```',\n ' const express = require(\"express\");',\n ' const app = express();',\n ' app.use(express.static(\"public\"));',\n ' app.listen(3000, () => console.log(\"Server running on port 3000\"));',\n ' ```',\n ' - files: Your game assets as separate files:',\n ' {',\n ' \"public/index.html\": \"<!DOCTYPE html>...\",',\n ' \"public/game.js\": \"// game logic...\",',\n ' \"public/style.css\": \"body { margin: 0; }\"',\n ' }',\n '',\n ' WRONG pattern (DO NOT DO THIS):',\n ' - code: `app.get(\"/\", (req, res) => res.send(\\\\`<html>...game code with backticks...\\\\`))`',\n ' - This breaks because game code uses template literals inside the res.send template literal.',\n '',\n 'deploy_sandbox takes:',\n ' - code: The server source code (written to main.ts/main.js/main.py)',\n ' - files: Additional files (path → content), e.g. { \"public/index.html\": \"<html>...\" }',\n ' - packageJson: Dependencies as a JSON object, e.g. { \"dependencies\": { \"express\": \"^4.18.2\", \"three\": \"^0.170.0\" } }',\n ' - language: \"javascript\" (recommended for games), \"typescript\", or \"python\"',\n ' - port: The port your server listens on (default: 3000)',\n ' - startCommand: Custom start command (auto-detected by default)',\n '',\n 'Guidelines:',\n ' 1. Use `language: \"javascript\"` — simpler for static file servers.',\n ' 2. The `code` param should be a minimal Express static server. ALL game code goes in `files`.',\n ' 3. Include ALL dependencies in packageJson (express, three, phaser, etc.).',\n ' 4. If the deploy fails, read the error output, fix the code, and call deploy_sandbox again.',\n ' 5. The sandbox is persistent — subsequent calls reuse the same sandbox.',\n ' 6. Load game libraries from CDN in your HTML (e.g., Three.js from unpkg/cdnjs) OR include them in packageJson.',\n ' 7. Make the game fullscreen by default (width: 100vw, height: 100vh, no margin/padding on body).',\n ].join('\\n')\n },\n\n buildToolGuidance(_state) {\n return [\n 'Your primary tool is deploy_sandbox. Call it with code (Express static server), files (game HTML/JS/CSS), and packageJson.',\n 'ALWAYS use the `files` parameter for game HTML, JavaScript, and CSS — NEVER embed them in template literals.',\n 'Do NOT use write_file, read_file, search_repo, glob_files, tree_directory, or list_directory.',\n 'You may use run_sandbox_code for quick one-off tests if needed.',\n ]\n },\n\n isComplete() {\n // Agent-driven completion via TASK_COMPLETE\n return false\n },\n\n interceptToolCall(toolName, _args, _ctx) {\n return blockLocalTools(toolName)\n },\n\n canAcceptCompletion(_state, trace) {\n // Accept completion if at least one deploy_sandbox call was made\n // @snake-case-ok: Tool name identifier uses snake_case to match agent tool definitions\n return trace.entries.some((entry) => entry.startsWith('deploy_sandbox'))\n },\n\n buildRecoveryMessage(state) {\n const recent = state.sessions.slice(-2)\n if (recent.length < 2) return undefined\n\n const noProgress = recent.every(\n (s) => s.hadTextOutput === false && s.wroteFiles === false\n )\n if (!noProgress) return undefined\n\n return [\n 'Recovery instruction:',\n 'You should be deploying the game using deploy_sandbox with the `files` parameter.',\n 'Use `code` for a minimal Express static server and `files` for game HTML/JS/CSS.',\n 'NEVER embed HTML in a JavaScript template literal — use separate files.',\n ].join('\\n')\n },\n\n shouldForceEndTurn(snapshot, _ctx) {\n if (snapshot.consecutiveDiscoveryPauseCount >= 8) {\n return 'build phase is looping on discovery tools instead of calling deploy_sandbox'\n }\n if (snapshot.actionKeyCount >= 4) {\n return `the same action repeated ${snapshot.actionKeyCount} times — try a different approach`\n }\n return undefined\n },\n}\n\n// ─── Verify Phase ───────────────────────────────────────────────────\n\nconst verifyPhase: WorkflowPhase = {\n name: 'verify',\n description: 'Verify the game is running and playable',\n\n buildInstructions(_state) {\n return [\n '--- Workflow Phase: Verify ---',\n 'The game has been deployed. Verify it is working:',\n ' 1. Check the server log for errors. If there are errors, fix and redeploy using deploy_sandbox.',\n ' 2. Tell the user the preview URL so they can play the game.',\n ' 3. End with TASK_COMPLETE.',\n '',\n 'If the user reports issues, fix the code and redeploy.',\n ].join('\\n')\n },\n\n buildToolGuidance(_state) {\n return [\n 'Use deploy_sandbox to redeploy if fixes are needed.',\n 'Do NOT use local file system tools.',\n 'When the game is working, tell the user the preview URL and end with TASK_COMPLETE.',\n ]\n },\n\n isComplete() {\n return false\n },\n\n interceptToolCall(toolName, _args, _ctx) {\n return blockLocalTools(toolName)\n },\n\n canAcceptCompletion(_state, trace) {\n // @snake-case-ok: Tool name identifier uses snake_case to match agent tool definitions\n return trace.entries.some((entry) => entry.startsWith('deploy_sandbox'))\n },\n\n shouldForceEndTurn(snapshot, _ctx) {\n if (snapshot.actionKeyCount >= 4) {\n return `the same action repeated ${snapshot.actionKeyCount} times — try a different approach`\n }\n return undefined\n },\n}\n\n// ─── Variant classification ──────────────────────────────────────────\n\nfunction classifyVariant(): string | undefined {\n return 'game'\n}\n\n// ─── Export the game workflow ────────────────────────────────────────\n\nexport const gameWorkflow: WorkflowDefinition = {\n name: 'game',\n phases: [designPhase, buildPhase, verifyPhase],\n classifyVariant,\n\n async generateBootstrapContext() {\n return undefined\n },\n\n buildCandidateBlock() {\n return ''\n },\n}\n","/**\n * API endpoint handlers with automatic camelCase/snake_case transformation\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport type {\n Flow,\n Prompt,\n RuntypeRecord,\n ApiKey,\n ModelConfig,\n UserProfile,\n PaginationResponse,\n ApiResponse,\n ListParams,\n RecordListParams,\n CreateFlowRequest,\n CreatePromptRequest,\n CreateRecordRequest,\n CreateApiKeyRequest,\n CreateModelConfigRequest,\n DispatchRequest,\n BulkEditRequest,\n BulkEditResponse,\n Tool,\n ToolExecution,\n CreateToolRequest,\n UpdateToolRequest,\n ExecuteToolRequest,\n ExecuteToolResponse,\n DeploySandboxRequest,\n DeploySandboxResponse,\n BuiltInTool,\n ModelUsageResponse,\n ModelUsageQueryParams,\n RuntimeTool,\n} from './types'\n\nimport type {\n ClientToken,\n CreateClientTokenRequest,\n CreateClientTokenResponse,\n UpdateClientTokenRequest,\n ListConversationsResponse,\n} from './client-token-types'\n\nimport {\n applyGeneratedRuntimeToolProposalToDispatchRequest,\n attachRuntimeToolsToDispatchRequest,\n buildGeneratedRuntimeToolGateOutput,\n evaluateGeneratedRuntimeToolProposal,\n type ApplyGeneratedProposalOptions,\n type ApplyGeneratedProposalResult,\n type AttachRuntimeToolsOptions,\n type GeneratedRuntimeToolGateDecision,\n type GeneratedRuntimeToolGateOptions,\n} from './generated-tool-gate'\n\nimport type {\n WorkflowDefinition,\n WorkflowPhase,\n WorkflowContext,\n} from './workflow-types'\n\nimport {\n normalizeCandidatePath as normalizePathUtil,\n isMarathonArtifactPath as isArtifactPathUtil,\n isDiscoveryToolName as isDiscoveryToolUtil,\n getDefaultPlanPath as getDefaultPlanPathUtil,\n} from './workflow-utils'\n\nimport { defaultWorkflow } from './workflows'\n\nexport interface ApiClient {\n get<T>(path: string, params?: { [key: string]: any }): Promise<T>\n post<T>(path: string, data?: any): Promise<T>\n put<T>(path: string, data?: any): Promise<T>\n patch<T>(path: string, data?: any): Promise<T>\n delete<T>(path: string, data?: any): Promise<T>\n postFormData<T>(path: string, formData: FormData): Promise<T>\n requestStream(path: string, options?: RequestInit): Promise<Response>\n}\n\n/**\n * Flows endpoint handlers\n */\nexport class FlowsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all flows for the authenticated user\n */\n async list(params?: ListParams): Promise<PaginationResponse<Flow>> {\n return this.client.get<PaginationResponse<Flow>>('/flows', params)\n }\n\n /**\n * Get a specific flow by ID\n */\n async get(id: string): Promise<Flow> {\n const response = await this.client.get<Flow>(`/flows/${id}`)\n return response\n }\n\n /**\n * Create a new flow\n */\n async create(data: CreateFlowRequest): Promise<Flow> {\n return this.client.post<Flow>('/flows', data)\n }\n\n /**\n * Update an existing flow\n */\n async update(id: string, data: Partial<CreateFlowRequest>): Promise<Flow> {\n return this.client.put<Flow>(`/flows/${id}`, data)\n }\n\n /**\n * Delete a flow\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/flows/${id}`)\n }\n\n /**\n * Run a flow on all records of a specific type\n */\n async runOnRecordType(id: string, recordType: string): Promise<any> {\n return this.client.post(`/flows/${id}/run-on-record-type`, {\n recordType,\n })\n }\n\n /**\n * Publish flow (promote draft to published)\n */\n async publish(\n id: string\n ): Promise<{ success: boolean; publishedVersionId: string; message: string }> {\n return this.client.post(`/flows/${id}/publish`)\n }\n}\n\n/**\n * Prompts endpoint handlers\n */\nexport class PromptsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all prompts for the authenticated user\n */\n async list(params?: ListParams & { flowId?: string }): Promise<PaginationResponse<Prompt>> {\n return this.client.get<PaginationResponse<Prompt>>('/prompts', params)\n }\n\n /**\n * Get a specific prompt by ID\n */\n async get(id: string): Promise<Prompt> {\n return this.client.get<Prompt>(`/prompts/${id}`)\n }\n\n /**\n * Create a new prompt\n */\n async create(data: CreatePromptRequest): Promise<Prompt> {\n return this.client.post<Prompt>('/prompts', data)\n }\n\n /**\n * Update an existing prompt\n */\n async update(id: string, data: Partial<CreatePromptRequest>): Promise<Prompt> {\n return this.client.put<Prompt>(`/prompts/${id}`, data)\n }\n\n /**\n * Delete a prompt\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/prompts/${id}`)\n }\n\n /**\n * Run a prompt on a specific record\n */\n async runOnRecord(id: string, recordId: string): Promise<any> {\n return this.client.post(`/prompts/${id}/run-on-record`, { recordId })\n }\n\n /**\n * Get flows using this prompt\n */\n async getFlows(id: string): Promise<{ flows: any[] }> {\n return this.client.get(`/prompts/${id}/flows`)\n }\n\n /**\n * Update flow attachments for a prompt\n */\n async updateFlows(\n id: string,\n flowIds: string[]\n ): Promise<{ success: boolean; attachedFlows: number }> {\n return this.client.put(`/prompts/${id}/flows`, { flowIds })\n }\n}\n\n/**\n * Records endpoint handlers\n */\nexport class RecordsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all records for the authenticated user\n */\n async list(params?: RecordListParams): Promise<PaginationResponse<RuntypeRecord>> {\n return this.client.get<PaginationResponse<RuntypeRecord>>('/records', params)\n }\n\n /**\n * Get a specific record by ID\n */\n async get(id: string): Promise<RuntypeRecord> {\n return this.client.get<RuntypeRecord>(`/records/${id}`)\n }\n\n /**\n * Create a new record\n */\n async create(data: CreateRecordRequest): Promise<RuntypeRecord> {\n return this.client.post<RuntypeRecord>('/records', data)\n }\n\n /**\n * Update an existing record\n */\n async update(id: string, data: Partial<CreateRecordRequest>): Promise<RuntypeRecord> {\n return this.client.put<RuntypeRecord>(`/records/${id}`, data)\n }\n\n /**\n * Delete a record\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/records/${id}`)\n }\n\n /**\n * Bulk delete multiple records\n */\n async bulkDelete(\n ids: string[]\n ): Promise<{ success: boolean; deleted: number; deletedIds: string[]; notFoundIds?: string[] }> {\n return this.client.post<{\n success: boolean\n deleted: number\n deletedIds: string[]\n notFoundIds?: string[]\n }>('/records/bulk-delete', { ids })\n }\n\n /**\n * Bulk edit multiple records\n */\n async bulkEdit(data: BulkEditRequest): Promise<BulkEditResponse> {\n return this.client.post<BulkEditResponse>('/records/bulk-edit', data)\n }\n\n /**\n * Get results for a record\n */\n async getResults(\n id: string,\n params?: { flowId?: string; fromDate?: string; toDate?: string }\n ): Promise<any[]> {\n return this.client.get(`/records/${id}/results`, params)\n }\n\n /**\n * Delete a specific result for a record\n */\n async deleteResult(id: string, resultId: string): Promise<void> {\n return this.client.delete<void>(`/records/${id}/results`, { resultId })\n }\n\n /**\n * Upload CSV file to create multiple records\n */\n async uploadCsv(file: File, params?: { typeColumn?: string; nameColumn?: string }): Promise<any> {\n const formData = new FormData()\n formData.append('file', file)\n if (params?.typeColumn) {\n formData.append('typeColumn', params.typeColumn)\n }\n if (params?.nameColumn) {\n formData.append('nameColumn', params.nameColumn)\n }\n return this.client.postFormData('/records/upload-csv', formData)\n }\n\n /**\n * Get record types (distinct values)\n */\n async getTypes(): Promise<{ data: string[]; total: number }> {\n return this.client.get('/records?distinct=types')\n }\n\n /**\n * Get example record by type and/or name\n */\n async getExample(params: {\n type?: string\n name?: string\n }): Promise<PaginationResponse<RuntypeRecord>> {\n return this.client.get('/records', {\n ...params,\n includeFields: true,\n limit: 1,\n })\n }\n}\n\n/**\n * API Keys endpoint handlers\n */\nexport class ApiKeysEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all API keys for the authenticated user\n */\n async list(): Promise<ApiKey[]> {\n const response = await this.client.get<{ apiKeys: ApiKey[]; total: number; timestamp: string }>(\n '/api-keys'\n )\n return response.apiKeys\n }\n\n /**\n * Get a specific API key by ID\n */\n async get(id: string): Promise<ApiKey> {\n return this.client.get<ApiKey>(`/api-keys/${id}`)\n }\n\n /**\n * Create a new API key\n */\n async create(\n data: CreateApiKeyRequest\n ): Promise<{ apiKey: ApiKey; plainKey: string; warning: string }> {\n return this.client.post('/api-keys', data)\n }\n\n /**\n * Update an existing API key\n */\n async update(id: string, data: Partial<CreateApiKeyRequest>): Promise<{ apiKey: ApiKey }> {\n return this.client.put(`/api-keys/${id}`, data)\n }\n\n /**\n * Delete an API key\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/api-keys/${id}`)\n }\n\n /**\n * Regenerate an API key\n */\n async regenerate(id: string): Promise<{ apiKey: ApiKey; plainKey: string; warning: string }> {\n return this.client.post(`/api-keys/${id}/regenerate`)\n }\n\n /**\n * Get API key analytics\n */\n async getAnalytics(id: string): Promise<any> {\n return this.client.get(`/api-keys/${id}/analytics`)\n }\n\n /**\n * Get usage logs for an API key\n */\n async getUsage(\n id: string,\n params?: { startDate?: string; endDate?: string; limit?: number }\n ): Promise<any> {\n return this.client.get(`/api-keys/${id}/usage`, params)\n }\n\n /**\n * Get API key analytics (all keys or specific key)\n */\n async getAnalyticsEnhanced(\n apiKeyId: string | 'all',\n params?: Record<string, string>\n ): Promise<any> {\n const endpoint = apiKeyId === 'all' ? '/api-keys/analytics' : `/api-keys/${apiKeyId}/analytics`\n return this.client.get(endpoint, params)\n }\n\n /**\n * Get API key usage logs (all keys or specific key)\n */\n async getLogs(apiKeyId: string | 'all', params?: Record<string, string>): Promise<any> {\n const endpoint = apiKeyId === 'all' ? '/api-keys/logs' : `/api-keys/${apiKeyId}/logs`\n return this.client.get(endpoint, params)\n }\n\n /**\n * Get API key permission options\n */\n async getPermissionOptions(): Promise<any> {\n return this.client.get('/api-keys/options')\n }\n\n /**\n * Get API key security logs\n */\n async getSecurityLogs(id: string): Promise<any> {\n return this.client.get(`/api-keys/${id}/security-logs`)\n }\n\n /**\n * Update API key security settings\n */\n async updateSecurity(id: string, data: any): Promise<any> {\n return this.client.put(`/api-keys/${id}/security`, data)\n }\n\n /**\n * Clear suspicious activity for API key\n */\n async clearSuspiciousActivity(id: string): Promise<any> {\n return this.client.post(`/api-keys/${id}/clear-suspicious`)\n }\n}\n\n/**\n * Model Configurations endpoint handlers\n */\nexport class ModelConfigsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Get available models catalog\n */\n async getAvailable(): Promise<ModelConfig[]> {\n const response = await this.client.get<{ data: ModelConfig[]; total: number } | ModelConfig[]>(\n '/model-configs/available'\n )\n // Handle both wrapped and direct array responses\n return Array.isArray(response) ? response : response.data || []\n }\n\n /**\n * Get search-capable models (all available, regardless of user configuration)\n */\n async getSearchCapable(): Promise<ModelConfig[]> {\n const response = await this.client.get<{ data: ModelConfig[]; total: number }>(\n '/model-configs/search-capable'\n )\n return response.data || []\n }\n\n /**\n * Get configured search-capable models (only user's configured and enabled models)\n */\n async getSearchConfigured(): Promise<ModelConfig[]> {\n const response = await this.client.get<{ data: ModelConfig[]; total: number }>(\n '/model-configs/search-configured'\n )\n return response.data || []\n }\n\n /**\n * List user's model configurations\n */\n async list(): Promise<ModelConfig[]> {\n const response = await this.client.get<{ data: ModelConfig[] } | ModelConfig[]>(\n '/model-configs'\n )\n // Handle both wrapped and direct array responses\n return Array.isArray(response) ? response : response.data || []\n }\n\n /**\n * Create a new model configuration\n */\n async create(data: CreateModelConfigRequest): Promise<ModelConfig> {\n return this.client.post<ModelConfig>('/model-configs', data)\n }\n\n /**\n * Update an existing model configuration\n */\n async update(id: string, data: Partial<CreateModelConfigRequest>): Promise<ModelConfig> {\n return this.client.put<ModelConfig>(`/model-configs/${id}`, data)\n }\n\n /**\n * Delete a model configuration\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/model-configs/${id}`)\n }\n\n /**\n * Enable/disable a model configuration\n */\n async updateStatus(\n id: string,\n isEnabled: boolean\n ): Promise<{ success: boolean; message: string }> {\n return this.client.patch(`/model-configs/${id}/status`, { isEnabled })\n }\n\n /**\n * Set a model configuration as default\n */\n async setDefault(id: string): Promise<{ success: boolean; message: string; data: ModelConfig }> {\n return this.client.patch(`/model-configs/${id}/default`)\n }\n\n /**\n * Get usage statistics\n */\n async getUsage(): Promise<any> {\n return this.client.get('/model-configs/usage')\n }\n}\n\n/**\n * Dispatch endpoint handler for atomic record/flow creation and execution\n */\nexport class DispatchEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Dispatch: create and/or execute flows on records atomically\n */\n async execute(data: DispatchRequest): Promise<any> {\n return this.client.post('/dispatch', data)\n }\n\n /**\n * Dispatch with streaming response\n */\n async executeStream(data: DispatchRequest): Promise<Response> {\n return this.client.requestStream('/dispatch', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Resume paused flow execution\n * API expects snake_case field names\n *\n * @param data.execution_id - The execution ID to resume\n * @param data.tool_outputs - Tool outputs to inject into the flow\n * @param data.stream_response - Whether to stream the response\n * @param data.messages - Optional messages to override the original dispatch messages\n */\n async resume(data: {\n executionId: string\n toolOutputs?: Record<string, any>\n streamResponse?: boolean\n messages?: Array<{\n role: 'system' | 'user' | 'assistant'\n content: string | Array<{ type: string; text?: string; image?: string }>\n }>\n }): Promise<any> {\n if (data.streamResponse) {\n return this.client.requestStream('/dispatch/resume', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n return this.client.post('/dispatch/resume', data)\n }\n\n /**\n * Evaluate a model-proposed runtime tool against a configurable allowlist policy.\n * Useful for local `propose_runtime_tool` handlers before redispatch.\n */\n gateGeneratedRuntimeToolProposal(\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): GeneratedRuntimeToolGateDecision {\n return evaluateGeneratedRuntimeToolProposal(proposal, options)\n }\n\n /**\n * Build standardized local-tool output for a generated tool proposal.\n * Returns `{ approved, reason, violations, tool? }`.\n */\n buildGeneratedRuntimeToolGateOutput(\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): {\n approved: boolean\n reason: string\n violations: string[]\n tool?: RuntimeTool\n } {\n return buildGeneratedRuntimeToolGateOutput(proposal, options)\n }\n\n /**\n * Attach approved runtime tools to a prompt step in a redispatch request.\n * Returns a new request object and does not mutate the original.\n */\n attachApprovedRuntimeTools(\n request: DispatchRequest,\n runtimeTools: RuntimeTool[],\n options?: AttachRuntimeToolsOptions\n ): DispatchRequest {\n return attachRuntimeToolsToDispatchRequest(request, runtimeTools, options)\n }\n\n /**\n * Validate a generated runtime tool proposal and attach it to the redispatch\n * request if approved, in one call.\n */\n applyGeneratedRuntimeToolProposal(\n request: DispatchRequest,\n proposal: unknown,\n options?: ApplyGeneratedProposalOptions\n ): ApplyGeneratedProposalResult {\n return applyGeneratedRuntimeToolProposalToDispatchRequest(request, proposal, options)\n }\n}\n\n/**\n * Chat endpoint handler\n */\nexport class ChatEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Send a chat message\n */\n async send(message: string): Promise<any> {\n return this.client.post('/chat', { message })\n }\n\n /**\n * Send a chat message with streaming response\n */\n async sendStream(message: string, options?: any): Promise<Response> {\n return this.client.requestStream('/chat', {\n method: 'POST',\n body: JSON.stringify({ message, ...options }),\n })\n }\n}\n\n/**\n * Users endpoint handlers\n */\nexport class UsersEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Get current user profile\n */\n async getProfile(): Promise<UserProfile> {\n return this.client.get<UserProfile>('/users/profile')\n }\n\n /**\n * Update user profile\n */\n async updateProfile(data: Partial<UserProfile>): Promise<UserProfile> {\n return this.client.put<UserProfile>('/users/profile', data)\n }\n}\n\n/**\n * Analytics endpoint handlers\n */\nexport class AnalyticsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Get analytics stats\n */\n async getStats(params?: Record<string, string>): Promise<any> {\n return this.client.get('/analytics/stats', params)\n }\n\n /**\n * Get analytics executions\n */\n async getExecutions(params?: Record<string, string>): Promise<any> {\n return this.client.get('/analytics/record-results', params)\n }\n\n /**\n * Get all record results (same as executions)\n */\n async getAllRecordResults(params?: Record<string, string>): Promise<any> {\n return this.client.get('/analytics/record-results', params)\n }\n\n /**\n * Get model usage analytics\n */\n async getModelUsage(params?: ModelUsageQueryParams): Promise<ModelUsageResponse> {\n return this.client.get<ModelUsageResponse>('/model-usage', params)\n }\n}\n\n/**\n * Flow Steps endpoint handlers\n *\n * @deprecated Flow steps are now consolidated into the flows endpoint.\n * Use `flows.get(id)` to get a flow with embedded `flowSteps`.\n * Use `flows.update(id, { flow_steps: [...] })` to update flow steps.\n */\nexport class FlowStepsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Get flow steps for a flow\n * @deprecated Use `flows.get(flowId)` instead - flow steps are now embedded in the flow response as `flowSteps`\n */\n async getByFlow(flowId: string): Promise<any[]> {\n console.warn(\n '[Runtype SDK] flowSteps.getByFlow() is deprecated. Use flows.get(flowId) instead - flow steps are now embedded in the flow response as flowSteps.'\n )\n return this.client.get(`/flow-steps/flow/${flowId}`)\n }\n\n /**\n * Get a specific flow step\n * @deprecated Use `flows.get(flowId)` and find the step in `flowSteps` array\n */\n async get(id: string): Promise<any> {\n console.warn(\n '[Runtype SDK] flowSteps.get() is deprecated. Use flows.get(flowId) and find the step in flowSteps array.'\n )\n return this.client.get(`/flow-steps/${id}`)\n }\n\n /**\n * Create a flow step\n * @deprecated Use `flows.update(flowId, { flow_steps: [...] })` to add steps\n */\n async create(data: any): Promise<any> {\n console.warn(\n '[Runtype SDK] flowSteps.create() is deprecated. Use flows.update(flowId, { flow_steps: [...] }) to add steps.'\n )\n return this.client.post('/flow-steps', data)\n }\n\n /**\n * Update a flow step\n * @deprecated Use `flows.update(flowId, { flow_steps: [...] })` to update steps\n */\n async update(id: string, data: any): Promise<any> {\n console.warn(\n '[Runtype SDK] flowSteps.update() is deprecated. Use flows.update(flowId, { flow_steps: [...] }) to update steps.'\n )\n return this.client.put(`/flow-steps/${id}`, data)\n }\n\n /**\n * Delete a flow step\n * @deprecated Use `flows.update(flowId, { flow_steps: [...] })` with the step removed\n */\n async delete(id: string): Promise<void> {\n console.warn(\n '[Runtype SDK] flowSteps.delete() is deprecated. Use flows.update(flowId, { flow_steps: [...] }) with the step removed.'\n )\n return this.client.delete(`/flow-steps/${id}`)\n }\n\n /**\n * Reorder flow steps\n * @deprecated Use `flows.update(flowId, { flow_steps: [...] })` with updated order values\n */\n async reorder(flowId: string, stepOrders: Array<{ id: string; order: number }>): Promise<any> {\n console.warn(\n '[Runtype SDK] flowSteps.reorder() is deprecated. Use flows.update(flowId, { flow_steps: [...] }) with updated order values.'\n )\n return this.client.post('/flow-steps/reorder', {\n flowId,\n stepOrders,\n })\n }\n}\n\n/**\n * Context Templates endpoint handlers\n */\nexport class ContextTemplatesEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List context templates\n */\n async list(params?: Record<string, string>): Promise<any[]> {\n return this.client.get('/context-templates', params)\n }\n\n /**\n * Get a specific context template\n */\n async get(id: string): Promise<any> {\n return this.client.get(`/context-templates/${id}`)\n }\n\n /**\n * Create a context template\n */\n async create(data: any): Promise<any> {\n return this.client.post('/context-templates', data)\n }\n\n /**\n * Update a context template\n */\n async update(id: string, data: any): Promise<any> {\n return this.client.put(`/context-templates/${id}`, data)\n }\n\n /**\n * Delete a context template\n */\n async delete(id: string): Promise<void> {\n return this.client.delete(`/context-templates/${id}`)\n }\n}\n\n/**\n * Tools endpoint handlers\n */\nexport class ToolsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all tools for the authenticated user\n */\n async list(params?: ListParams): Promise<PaginationResponse<Tool>> {\n return this.client.get<PaginationResponse<Tool>>('/tools', params)\n }\n\n /**\n * Get a specific tool by ID\n */\n async get(id: string): Promise<Tool> {\n return this.client.get<Tool>(`/tools/${id}`)\n }\n\n /**\n * Create a new tool\n */\n async create(data: CreateToolRequest): Promise<Tool> {\n return this.client.post<Tool>('/tools', data)\n }\n\n /**\n * Update an existing tool\n */\n async update(id: string, data: UpdateToolRequest): Promise<Tool> {\n return this.client.put<Tool>(`/tools/${id}`, data)\n }\n\n /**\n * Delete a tool\n */\n async delete(id: string): Promise<void> {\n return this.client.delete(`/tools/${id}`)\n }\n\n /**\n * Execute a tool\n */\n async execute(id: string, data: ExecuteToolRequest): Promise<ExecuteToolResponse> {\n return this.client.post<ExecuteToolResponse>(`/tools/${id}/execute`, data)\n }\n\n /**\n * Execute a tool with streaming response\n */\n async executeStream(id: string, data: ExecuteToolRequest): Promise<Response> {\n return this.client.requestStream(`/tools/${id}/execute`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Test a tool (same as execute but for testing purposes)\n */\n async test(id: string, data: ExecuteToolRequest): Promise<ExecuteToolResponse> {\n return this.client.post<ExecuteToolResponse>(`/tools/${id}/test`, data)\n }\n\n /**\n * Get tool executions for a specific tool\n */\n async getExecutions(\n toolId: string,\n params?: ListParams\n ): Promise<PaginationResponse<ToolExecution>> {\n return this.client.get<PaginationResponse<ToolExecution>>(`/tools/${toolId}/executions`, params)\n }\n\n /**\n * Get AI SDK compatible tool schemas\n */\n async getSchemas(params?: { toolIds?: string[] }): Promise<any[]> {\n return this.client.get('/tools/schema', params)\n }\n\n /**\n * Get available tools for prompts\n */\n async getAvailable(): Promise<Tool[]> {\n const response = await this.client.get<PaginationResponse<Tool>>('/tools', {\n isActive: true,\n limit: 200,\n })\n\n const payload: any = response\n\n if (Array.isArray(payload?.data)) {\n return payload.data\n }\n\n if (Array.isArray(payload)) {\n return payload\n }\n\n return []\n }\n\n /**\n * Convert a flow to a tool\n */\n async convertFromFlow(\n flowId: string,\n data: {\n name: string\n description: string\n parameterMapping?: Record<string, string>\n outputMapping?: string\n }\n ): Promise<Tool> {\n return this.client.post<Tool>(`/flows/${flowId}/convert-to-tool`, data)\n }\n\n /**\n * Get all built-in tools\n */\n async getBuiltInTools(): Promise<PaginationResponse<BuiltInTool>> {\n return this.client.get<PaginationResponse<BuiltInTool>>('/tools/builtin')\n }\n\n /**\n * Get built-in tools compatible with a specific model and provider\n */\n async getCompatibleBuiltInTools(\n model: string,\n provider: string\n ): Promise<PaginationResponse<BuiltInTool>> {\n return this.client.get<PaginationResponse<BuiltInTool>>('/tools/builtin/compatible', {\n model,\n provider,\n })\n }\n\n /**\n * Get parameter schema for a specific built-in tool\n */\n async getBuiltInToolSchema(toolId: string): Promise<BuiltInTool> {\n return this.client.get<BuiltInTool>(`/tools/builtin/${toolId}/schema`)\n }\n\n /**\n * Deploy code to a persistent Daytona sandbox and get a preview URL\n */\n async deploySandbox(data: DeploySandboxRequest): Promise<DeploySandboxResponse> {\n return this.client.post<DeploySandboxResponse>('/tools/sandbox/deploy', data)\n }\n\n /**\n * Cleanup a deployed Daytona sandbox\n */\n async cleanupSandbox(sandboxId: string): Promise<void> {\n return this.client.delete(`/tools/sandbox/${sandboxId}`)\n }\n}\n\n/**\n * Eval endpoint handlers\n */\nexport class EvalEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * Run virtual eval with streaming response\n * Executes multiple eval configs simultaneously and streams results via multiplexed SSE\n */\n async runVirtualEval(data: {\n record?: {\n name?: string\n type?: string\n metadata?: Record<string, any>\n }\n messages?: Array<{\n role: 'system' | 'user' | 'assistant'\n content: string\n }>\n flowId?: string\n flowDefinition?: any\n evalConfigs: Array<{\n evalConfigId?: string\n evalName?: string\n stepOverrides?: Record<string, any>\n }>\n evalGroupId?: string\n }): Promise<Response> {\n return this.client.requestStream('/eval/stream', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n}\n\n/**\n * Client Tokens endpoint handlers\n *\n * Manages client tokens for secure browser-to-API communication.\n * Client tokens enable embedding chat widgets in external applications.\n */\nexport class ClientTokensEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all client tokens for the authenticated user\n */\n async list(): Promise<ClientToken[]> {\n const response = await this.client.get<{ clientTokens: ClientToken[]; total: number }>(\n '/client-tokens'\n )\n return response.clientTokens\n }\n\n /**\n * Get a specific client token by ID\n */\n async get(id: string): Promise<ClientToken> {\n return this.client.get<ClientToken>(`/client-tokens/${id}`)\n }\n\n /**\n * Create a new client token\n *\n * @returns The created token with the plain token value (shown only once)\n */\n async create(data: CreateClientTokenRequest): Promise<CreateClientTokenResponse> {\n return this.client.post<CreateClientTokenResponse>('/client-tokens', data)\n }\n\n /**\n * Update an existing client token\n */\n async update(id: string, data: UpdateClientTokenRequest): Promise<ClientToken> {\n return this.client.put<ClientToken>(`/client-tokens/${id}`, data)\n }\n\n /**\n * Delete a client token\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/client-tokens/${id}`)\n }\n\n /**\n * Regenerate a client token's value\n *\n * @returns The updated token with the new plain token value (shown only once)\n */\n async regenerate(id: string): Promise<CreateClientTokenResponse> {\n return this.client.post<CreateClientTokenResponse>(`/client-tokens/${id}/regenerate`)\n }\n\n /**\n * Get the plain token value for a client token\n *\n * Note: Only works if the token was just created or regenerated in the same session\n */\n async getToken(id: string): Promise<{ token: string }> {\n return this.client.get<{ token: string }>(`/client-tokens/${id}/token`)\n }\n\n /**\n * List conversations for a client token\n */\n async listConversations(\n id: string,\n params?: { limit?: number; offset?: number }\n ): Promise<ListConversationsResponse> {\n return this.client.get<ListConversationsResponse>(`/client-tokens/${id}/conversations`, params)\n }\n}\n\n// =============================================================================\n// Agents Endpoint\n// =============================================================================\n\n/**\n * Agent event types for streaming\n */\n// @snake-case-ok-start: Agent event type identifiers use snake_case to match flow events\nexport type AgentEventType =\n | 'agent_start'\n | 'agent_iteration_start'\n | 'agent_turn_start'\n | 'agent_turn_delta'\n | 'agent_turn_complete'\n | 'agent_tool_start'\n | 'agent_tool_delta'\n | 'agent_tool_complete'\n | 'agent_iteration_complete'\n | 'agent_reflection'\n | 'agent_complete'\n | 'agent_error'\n | 'agent_ping'\n | 'agent_await'\n// @snake-case-ok-end\n\n/**\n * Base agent event with common fields\n */\nexport interface BaseAgentEvent {\n type: AgentEventType\n executionId: string\n seq: number\n}\n\n/**\n * Agent start event\n */\n// @snake-case-ok-start: Agent event type identifiers use snake_case to match flow events\nexport interface AgentStartEvent extends BaseAgentEvent {\n type: 'agent_start'\n agentId: string\n agentName: string\n maxTurns: number\n startedAt: string\n config?: {\n model?: string\n enableReflection?: boolean\n }\n}\n\n/**\n * Agent iteration start event\n */\nexport interface AgentIterationStartEvent extends BaseAgentEvent {\n type: 'agent_iteration_start'\n iteration: number\n maxTurns: number\n totalCost?: number\n startedAt: string\n}\n\n/**\n * Agent turn start event\n */\nexport interface AgentTurnStartEvent extends BaseAgentEvent {\n type: 'agent_turn_start'\n iteration: number\n turnId: string\n turnIndex: number\n role: 'user' | 'assistant' | 'system'\n}\n\n/**\n * Agent turn delta event (streaming content)\n */\nexport interface AgentTurnDeltaEvent extends BaseAgentEvent {\n type: 'agent_turn_delta'\n iteration: number\n turnId: string\n delta: string\n contentType: 'text' | 'thinking' | 'tool_input'\n}\n\n/**\n * Agent turn complete event\n */\nexport interface AgentTurnCompleteEvent extends BaseAgentEvent {\n type: 'agent_turn_complete'\n iteration: number\n turnId: string\n role: 'user' | 'assistant' | 'system'\n completedAt: string\n content?: string\n tokens?: { input: number; output: number }\n cost?: number\n}\n\n/**\n * Agent tool start event\n */\nexport interface AgentToolStartEvent extends BaseAgentEvent {\n type: 'agent_tool_start'\n iteration: number\n toolCallId: string\n toolName: string\n toolType: 'flow' | 'mcp' | 'builtin' | 'custom' | 'external'\n parameters?: Record<string, unknown>\n}\n\n/**\n * Agent tool delta event\n */\nexport interface AgentToolDeltaEvent extends BaseAgentEvent {\n type: 'agent_tool_delta'\n iteration: number\n toolCallId: string\n delta: string\n}\n\n/**\n * Agent tool complete event\n */\nexport interface AgentToolCompleteEvent extends BaseAgentEvent {\n type: 'agent_tool_complete'\n iteration: number\n toolCallId: string\n toolName: string\n success: boolean\n result?: unknown\n executionTime?: number\n}\n\n/**\n * Agent iteration complete event\n */\nexport interface AgentIterationCompleteEvent extends BaseAgentEvent {\n type: 'agent_iteration_complete'\n iteration: number\n completedAt: string\n output?: string\n toolCallsMade: number\n cost?: number\n tokens?: { input: number; output: number }\n duration?: number\n stopConditionMet: boolean\n}\n\n/**\n * Agent reflection event\n */\nexport interface AgentReflectionEvent extends BaseAgentEvent {\n type: 'agent_reflection'\n iteration: number\n reflection?: string\n}\n\n/**\n * Agent complete event\n */\nexport interface AgentCompleteEvent extends BaseAgentEvent {\n type: 'agent_complete'\n agentId: string\n success: boolean\n iterations: number\n stopReason: 'complete' | 'end_turn' | 'max_turns' | 'max_cost' | 'timeout' | 'error'\n completedAt: string\n totalCost?: number\n totalTokens?: { input: number; output: number }\n finalOutput?: string\n duration?: number\n error?: string\n}\n\n/**\n * Agent error event\n */\nexport interface AgentErrorEvent extends BaseAgentEvent {\n type: 'agent_error'\n iteration?: number\n error: {\n code: string\n message: string\n details?: Record<string, unknown>\n }\n recoverable: boolean\n}\n\n/**\n * Agent ping event (keep-alive)\n */\nexport interface AgentPingEvent extends BaseAgentEvent {\n type: 'agent_ping'\n timestamp: string\n}\n\n/**\n * Agent await event (execution awaiting local tool result from client).\n */\nexport interface AgentPausedEvent extends BaseAgentEvent {\n type: 'agent_await'\n executionId: string\n toolId: string\n toolName: string\n parameters?: Record<string, unknown>\n awaitedAt: string\n}\n// @snake-case-ok-end\n\n/**\n * Union of all agent event types\n */\nexport type AgentEvent =\n | AgentStartEvent\n | AgentIterationStartEvent\n | AgentTurnStartEvent\n | AgentTurnDeltaEvent\n | AgentTurnCompleteEvent\n | AgentToolStartEvent\n | AgentToolDeltaEvent\n | AgentToolCompleteEvent\n | AgentIterationCompleteEvent\n | AgentReflectionEvent\n | AgentCompleteEvent\n | AgentErrorEvent\n | AgentPingEvent\n | AgentPausedEvent\n\n/**\n * Parsed SSE event with event type and data\n */\ninterface ParsedSSEEvent {\n eventType: string | null\n data: unknown\n}\n\n/**\n * Callbacks for agent stream events\n */\nexport interface AgentStreamCallbacks {\n onAgentStart?: (event: AgentStartEvent) => void\n onIterationStart?: (event: AgentIterationStartEvent) => void\n onTurnStart?: (event: AgentTurnStartEvent) => void\n onTurnDelta?: (event: AgentTurnDeltaEvent) => void\n onTurnComplete?: (event: AgentTurnCompleteEvent) => void\n onToolStart?: (event: AgentToolStartEvent) => void\n onToolDelta?: (event: AgentToolDeltaEvent) => void\n onToolComplete?: (event: AgentToolCompleteEvent) => void\n onIterationComplete?: (event: AgentIterationCompleteEvent) => void\n onReflection?: (event: AgentReflectionEvent) => void\n onAgentComplete?: (event: AgentCompleteEvent) => void\n onAgentPaused?: (event: AgentPausedEvent) => void\n onError?: (event: AgentErrorEvent) => void\n onPing?: (event: AgentPingEvent) => void\n onUnknownEvent?: (event: ParsedSSEEvent) => void\n}\n\n/**\n * Parse SSE stream chunks into individual events with event type support\n */\nfunction parseSSEChunkWithEventType(\n chunk: string,\n buffer: string\n): { events: ParsedSSEEvent[]; remainingBuffer: string } {\n buffer += chunk\n\n // Split on double newlines to get complete events\n const parts = buffer.split('\\n\\n')\n const remainingBuffer = parts.pop() || ''\n\n const events: ParsedSSEEvent[] = []\n\n for (const part of parts) {\n if (!part.trim()) continue\n\n const lines = part.split('\\n')\n let eventType: string | null = null\n let dataStr: string | null = null\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim()\n } else if (line.startsWith('data: ')) {\n dataStr = line.slice(6).trim()\n }\n }\n\n if (dataStr && dataStr !== '[DONE]') {\n try {\n const data = JSON.parse(dataStr)\n events.push({ eventType, data })\n } catch {\n // Invalid JSON, skip\n }\n }\n }\n\n return { events, remainingBuffer }\n}\n\n/**\n * Dispatch a parsed agent event to the appropriate callback\n */\nfunction dispatchAgentEvent(event: ParsedSSEEvent, callbacks: AgentStreamCallbacks): void {\n const { eventType, data } = event\n const typedData = data as AgentEvent\n\n // If no event type, try to get it from the data\n const type = eventType || typedData?.type\n\n // @snake-case-ok-start: Agent event type identifiers use snake_case to match flow events\n switch (type) {\n case 'agent_start':\n callbacks.onAgentStart?.(typedData as AgentStartEvent)\n break\n case 'agent_iteration_start':\n callbacks.onIterationStart?.(typedData as AgentIterationStartEvent)\n break\n case 'agent_turn_start':\n callbacks.onTurnStart?.(typedData as AgentTurnStartEvent)\n break\n case 'agent_turn_delta':\n callbacks.onTurnDelta?.(typedData as AgentTurnDeltaEvent)\n break\n case 'agent_turn_complete':\n callbacks.onTurnComplete?.(typedData as AgentTurnCompleteEvent)\n break\n case 'agent_tool_start':\n callbacks.onToolStart?.(typedData as AgentToolStartEvent)\n break\n case 'agent_tool_delta':\n callbacks.onToolDelta?.(typedData as AgentToolDeltaEvent)\n break\n case 'agent_tool_complete':\n callbacks.onToolComplete?.(typedData as AgentToolCompleteEvent)\n break\n case 'agent_iteration_complete':\n callbacks.onIterationComplete?.(typedData as AgentIterationCompleteEvent)\n break\n case 'agent_reflection':\n callbacks.onReflection?.(typedData as AgentReflectionEvent)\n break\n case 'agent_complete':\n callbacks.onAgentComplete?.(typedData as AgentCompleteEvent)\n break\n case 'agent_error':\n callbacks.onError?.(typedData as AgentErrorEvent)\n break\n case 'agent_await':\n callbacks.onAgentPaused?.(typedData as AgentPausedEvent)\n break\n case 'agent_ping':\n callbacks.onPing?.(typedData as AgentPingEvent)\n break\n default:\n callbacks.onUnknownEvent?.(event)\n }\n // @snake-case-ok-end\n}\n\n/**\n * Process agent stream with callbacks\n */\nasync function processAgentStream(\n body: ReadableStream<Uint8Array> | null,\n callbacks: AgentStreamCallbacks\n): Promise<void> {\n if (!body) return\n\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n // Process any remaining buffer\n if (buffer.trim()) {\n const { events } = parseSSEChunkWithEventType(buffer + '\\n\\n', '')\n for (const event of events) {\n dispatchAgentEvent(event, callbacks)\n }\n }\n break\n }\n\n const chunk = decoder.decode(value, { stream: true })\n const { events, remainingBuffer } = parseSSEChunkWithEventType(chunk, buffer)\n buffer = remainingBuffer\n\n for (const event of events) {\n dispatchAgentEvent(event, callbacks)\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\n/**\n * Agent message format\n */\nexport interface AgentMessage {\n role: 'system' | 'user' | 'assistant' | 'tool'\n content: string | Array<{ type: string; text?: string; image?: string; data?: string }>\n toolCalls?: Array<{\n toolCallId: string\n toolName: string\n args: Record<string, unknown>\n }>\n toolResults?: Array<{\n toolCallId: string\n toolName: string\n result: unknown\n }>\n}\n\n/**\n * Definition for a local tool that executes on the client side.\n * Pairs the tool schema (sent to the server) with a handler (executed locally).\n */\nexport interface LocalToolDefinition {\n /** Human-readable description of what the tool does */\n description: string\n /** JSON Schema describing the tool's parameters */\n parametersSchema: Record<string, unknown>\n /** Handler that executes locally when the agent invokes this tool */\n execute: (args: Record<string, unknown>) => Promise<unknown>\n}\n\n/**\n * Runtime tool definition shape accepted by agent execution endpoints.\n */\nexport interface AgentRuntimeToolDefinition {\n name: string\n description: string\n toolType: 'flow' | 'custom' | 'external' | 'local'\n parametersSchema: Record<string, unknown>\n config?: Record<string, unknown>\n}\n\n/**\n * Agent execute request\n */\nexport interface AgentExecuteRequest {\n /** Conversation messages */\n messages: AgentMessage[]\n /** Variables to pass to the agent */\n variables?: Record<string, unknown>\n /** Enable streaming response (default: true) */\n streamResponse?: boolean\n /** Enable debug mode to include all fields in events */\n debugMode?: boolean\n /** Model ID to use for this session (overrides agent config) */\n model?: string\n /** Runtime tools to make available during execution */\n tools?: {\n runtimeTools?: AgentRuntimeToolDefinition[]\n /** IDs of built-in tools to enable (e.g., \"exa\", \"firecrawl\", \"dalle\") */\n toolIds?: string[]\n }\n}\n\n/**\n * Agent execute response (non-streaming)\n */\nexport interface AgentExecuteResponse {\n success: boolean\n result: string\n iterations: number\n totalCost: number\n totalTokens?: { input: number; output: number }\n stopReason: 'complete' | 'end_turn' | 'max_turns' | 'max_cost' | 'timeout' | 'error'\n reflections?: string[]\n error?: string\n}\n\ninterface LocalToolExecutionLoopSnapshot {\n executionId: string\n pauseCount: number\n discoveryPauseCount: number\n consecutiveDiscoveryPauseCount: number\n toolName: string\n toolNameCount: number\n parameters: Record<string, unknown>\n toolResult: unknown\n accumulatedOutput: string\n actionKey: string\n actionKeyCount: number\n recentActionKeys: string[]\n}\n\ninterface ExecuteWithLocalToolsOptions {\n onLocalToolResult?: (\n snapshot: LocalToolExecutionLoopSnapshot\n ) => AgentCompleteEvent | null | undefined\n}\n\nconst GENERATED_RUNTIME_TOOL_PROPOSAL_SCHEMA: Record<string, unknown> = {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Tool name. Use letters/numbers/underscore only.',\n },\n description: {\n type: 'string',\n description: 'Clear description of what the generated tool does.',\n },\n toolType: {\n type: 'string',\n enum: ['custom'],\n description: 'Must be \"custom\" for generated code execution tools.',\n },\n parametersSchema: {\n type: 'object',\n description: 'JSON schema for tool call arguments.',\n },\n config: {\n type: 'object',\n description: 'Runtime tool config including code, sandboxProvider, language, and timeout.',\n },\n reason: {\n type: 'string',\n description: 'Why this tool is needed.',\n },\n },\n required: ['name', 'description', 'toolType', 'parametersSchema', 'config'],\n}\n\nfunction appendRuntimeToolsToAgentRequest(\n request: AgentExecuteRequest,\n runtimeTools: RuntimeTool[]\n): AgentExecuteRequest {\n const existing = request.tools?.runtimeTools || []\n const existingNames = new Set(existing.map((tool) => tool.name))\n\n const converted: AgentRuntimeToolDefinition[] = runtimeTools\n .filter((tool) => !existingNames.has(tool.name))\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n toolType: tool.toolType,\n parametersSchema: tool.parametersSchema as unknown as Record<string, unknown>,\n ...(tool.config ? { config: tool.config as Record<string, unknown> } : {}),\n }))\n\n return {\n ...request,\n tools: {\n ...request.tools,\n runtimeTools: [...existing, ...converted],\n },\n }\n}\n\n// ─── Long-Task Agent Types ────────────────────────────────────────────\n\n/**\n * Status of a long-task agent run\n */\nexport type RunTaskStatus =\n | 'running'\n | 'complete'\n | 'paused'\n | 'error'\n | 'budget_exceeded'\n | 'max_sessions'\n\n/**\n * A continuation point within a long-task run (for marathon resume).\n */\nexport interface RunTaskContinuation {\n /** ISO timestamp when this continuation started */\n continuedAt: string\n /** Session count at the time of continuation (from-session) */\n fromSession: number\n /** User message provided on resume, if any */\n userMessage?: string\n /** Model used for this continuation segment */\n model?: string\n /** Cost of sessions in this continuation segment */\n segmentCost: number\n}\n\n/**\n * Summary of a single session within a long-task run\n */\nexport interface RunTaskSessionSummary {\n /** 1-based session index */\n index: number\n /** Cost of this individual session (USD) */\n cost: number\n /** Token counts for this session */\n totalTokens?: { input: number; output: number }\n /** Number of loop iterations in this session */\n iterations: number\n /** Why this session stopped */\n stopReason: AgentExecuteResponse['stopReason']\n /** Truncated output from this session */\n outputPreview: string\n /** Compact summary of tool/discovery activity captured during the session */\n toolTraceSummary?: string\n /** Whether repo discovery tools were used during the session */\n discoveryPerformed?: boolean\n /** Whether the session attempted a file write even if it did not complete */\n attemptedWrite?: boolean\n /** Whether the session wrote any files */\n wroteFiles?: boolean\n /** Whether the assistant produced final text output */\n hadTextOutput?: boolean\n /** Whether a verification command was run during the session */\n verificationAttempted?: boolean\n /** Whether the latest verification command passed during the session */\n verificationPassed?: boolean\n /** Best candidate file identified during the session */\n bestCandidatePath?: string\n /** Recent action keys used during the session */\n actionKeys?: string[]\n /** ISO timestamp when this session completed */\n completedAt: string\n}\n\n/**\n * Accumulated state for a long-task agent run.\n * This is both the in-memory state and the record metadata shape.\n */\nexport interface RunTaskState {\n agentId: string\n agentName?: string\n taskName: string\n status: RunTaskStatus\n /** Total sessions completed so far */\n sessionCount: number\n /** Total cost across all sessions (USD) */\n totalCost: number\n /** Total tokens across all sessions */\n totalTokens?: { input: number; output: number }\n /** Last agent output (full text) */\n lastOutput: string\n /** Last terminal error captured from agent execution */\n lastError?: string\n /** Last stop reason */\n lastStopReason: AgentExecuteResponse['stopReason']\n /** Per-session summaries (kept trimmed to last N) */\n sessions: RunTaskSessionSummary[]\n /** ISO timestamp of first session */\n startedAt: string\n /** ISO timestamp of last update */\n updatedAt: string\n /** Original task message (first invocation) */\n originalMessage?: string\n /** Full conversation message history (source of truth for resume) */\n messages?: AgentMessage[]\n /** History of continuation points */\n continuations?: RunTaskContinuation[]\n /** Per-model cost breakdown */\n costByModel?: Record<string, number>\n /** Auto-generated repo bootstrap hints derived from the original task */\n bootstrapContext?: string\n /** Current structured marathon workflow phase (widened to string for custom workflows) */\n workflowPhase?: string\n /** Suggested markdown plan path for the task */\n planPath?: string\n /** Whether the planning artifact has been written */\n planWritten?: boolean\n /** Summary of the most recent automatic phase transition */\n phaseTransitionSummary?: string\n /** Best current file candidate for the task */\n bestCandidatePath?: string\n /** Reason the best candidate was selected */\n bestCandidateReason?: string\n /** Recent candidate file paths discovered across sessions */\n candidatePaths?: string[]\n /** Recent file paths read by the agent */\n recentReadPaths?: string[]\n /** Recent action keys used across sessions for loop detection */\n recentActionKeys?: string[]\n /** Whether the current best candidate still needs a post-write verification read */\n bestCandidateNeedsVerification?: boolean\n /** Whether the current best candidate has been re-read after the latest write */\n bestCandidateVerified?: boolean\n /** Whether completion requires a successful verification command */\n verificationRequired?: boolean\n /** Whether the latest verification command succeeded */\n lastVerificationPassed?: boolean\n /** Whether this task is creating something new rather than modifying existing files */\n isCreationTask?: boolean\n /** Workflow variant string (e.g. 'create', 'modify', or custom) */\n workflowVariant?: string\n /** Arbitrary bag for workflow-specific data */\n workflowState?: Record<string, unknown>\n}\n\nexport type RunTaskResumeState = Pick<\n RunTaskState,\n | 'originalMessage'\n | 'bootstrapContext'\n | 'workflowPhase'\n | 'planPath'\n | 'planWritten'\n | 'bestCandidatePath'\n | 'bestCandidateReason'\n | 'candidatePaths'\n | 'recentReadPaths'\n | 'recentActionKeys'\n | 'bestCandidateNeedsVerification'\n | 'bestCandidateVerified'\n | 'verificationRequired'\n | 'lastVerificationPassed'\n | 'isCreationTask'\n | 'workflowVariant'\n | 'workflowState'\n>\n\n/**\n * Callback invoked after each session completes.\n * Return `false` to stop the loop early.\n */\nexport type RunTaskOnSession = (state: RunTaskState) => void | false | Promise<void | false>\n\n/**\n * Options for `agents.runTask()`\n */\nexport interface RunTaskOptions {\n /** The user message / task instruction for the agent */\n message: string\n /** Maximum number of sessions to run (default: 50) */\n maxSessions?: number\n /** Maximum total cost in USD across all sessions */\n maxCost?: number\n /** Whether to use streaming for each session execution (default: true) */\n stream?: boolean\n /** Enable debug mode on each session */\n debugMode?: boolean\n /** Called after each session. Return false to stop early. */\n onSession?: RunTaskOnSession\n /**\n * Sync progress to a Runtype record after each session.\n * Pass `true` to use the agent name, or a string for a custom task name.\n * The record will have type \"agent-task\" and be upserted by name.\n */\n trackProgress?: boolean | string\n /** Callbacks for streaming events (only used when stream: true) */\n streamCallbacks?: AgentStreamCallbacks\n /**\n * Local tools that execute on the client side.\n * When the agent invokes a tool with `toolType: 'local'`, the SDK will\n * pause, call the matching handler, and resume the agent with the result.\n * Requires `stream: true` (default).\n */\n localTools?: Record<string, LocalToolDefinition>\n /** Model ID to use (overrides agent's configured model) */\n model?: string\n /** Previous messages from a prior run (for continuation/resume) */\n previousMessages?: AgentMessage[]\n /** New user message for continuation (appended after previous context) */\n continuationMessage?: string\n /** Use compact summary instead of full message history for continuation */\n compact?: boolean\n /** Saved workflow state to seed a resumed or restarted marathon run */\n resumeState?: RunTaskResumeState\n /** How tool results are stored in message history for continuation.\n * 'hot-tail' (default): recent results inline, older offloaded to disk.\n * 'observation-mask': recent results inline, older replaced with placeholder.\n * 'full-inline': all results stay inline. */\n toolContextMode?: 'hot-tail' | 'observation-mask' | 'full-inline'\n /** Which tool results stay \"hot\" (inline).\n * 'session' (default): current session's results are hot, previous sessions' are cold.\n * number (e.g. 10): last N tool result messages are hot, regardless of session. */\n toolWindow?: 'session' | number\n /** Custom workflow definition (defaults to the built-in research→planning→execution workflow) */\n workflow?: WorkflowDefinition\n /** IDs of built-in tools to enable for the agent (e.g., \"exa\", \"firecrawl\", \"dalle\") */\n toolIds?: string[]\n}\n\ninterface RunTaskToolTrace {\n entries: string[]\n discoveryPerformed: boolean\n attemptedWrite: boolean\n wroteFiles: boolean\n executionFileWritten: boolean\n readFiles: boolean\n readPaths: string[]\n actionKeys: string[]\n candidatePaths: string[]\n planWritten: boolean\n bestCandidateReadFailed: boolean\n bestCandidateWritten: boolean\n bestCandidateVerified: boolean\n verificationAttempted: boolean\n verificationPassed: boolean\n localToolLoopGuardTriggered: boolean\n forcedTurnEndReason?: string\n bestCandidatePath?: string\n bestCandidateReason?: string\n}\n\n/**\n * Final result returned by `agents.runTask()`\n */\nexport interface RunTaskResult {\n status: RunTaskStatus\n sessionCount: number\n totalCost: number\n totalTokens?: { input: number; output: number }\n lastOutput: string\n sessions: RunTaskSessionSummary[]\n /** The record ID if trackProgress was enabled */\n recordId?: string\n}\n\n/**\n * Agent data\n */\nexport interface Agent {\n id: string\n name: string\n description: string | null\n agentType: string\n primaryFlowId: string | null\n config: Record<string, unknown> | null\n externalConfig: Record<string, unknown> | null\n createdAt: string\n updatedAt: string\n}\n\n/**\n * Agents endpoint handlers\n */\nexport class AgentsEndpoint {\n constructor(private client: ApiClient) {}\n\n /**\n * List all agents for the authenticated user\n */\n async list(params?: ListParams): Promise<PaginationResponse<Agent>> {\n return this.client.get<PaginationResponse<Agent>>('/agents', params)\n }\n\n /**\n * Get a specific agent by ID\n */\n async get(id: string): Promise<Agent> {\n return this.client.get<Agent>(`/agents/${id}`)\n }\n\n /**\n * Create a new agent\n */\n async create(data: Partial<Agent>): Promise<Agent> {\n return this.client.post<Agent>('/agents', data)\n }\n\n /**\n * Update an existing agent\n */\n async update(id: string, data: Partial<Agent>): Promise<Agent> {\n return this.client.put<Agent>(`/agents/${id}`, data)\n }\n\n /**\n * Delete an agent\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(`/agents/${id}`)\n }\n\n /**\n * Evaluate a model-proposed runtime tool against a configurable allowlist policy.\n * Useful for local `propose_runtime_tool` handlers before follow-up execution.\n */\n gateGeneratedRuntimeToolProposal(\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): GeneratedRuntimeToolGateDecision {\n return evaluateGeneratedRuntimeToolProposal(proposal, options)\n }\n\n /**\n * Build standardized local-tool output for a generated tool proposal.\n * Returns `{ approved, reason, violations, tool? }`.\n */\n buildGeneratedRuntimeToolGateOutput(\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): {\n approved: boolean\n reason: string\n violations: string[]\n tool?: RuntimeTool\n } {\n return buildGeneratedRuntimeToolGateOutput(proposal, options)\n }\n\n /**\n * Create a local tool definition that validates model-proposed runtime tools.\n * Plug this into `executeWithLocalTools()` under a name like `propose_runtime_tool`.\n */\n createGeneratedRuntimeToolGateLocalTool(\n options?: GeneratedRuntimeToolGateOptions & { description?: string }\n ): LocalToolDefinition {\n const { description, ...gateOptions } = options || {}\n return {\n description:\n description ||\n 'Validate a generated runtime custom tool and return { approved, reason, violations, tool? }',\n parametersSchema: GENERATED_RUNTIME_TOOL_PROPOSAL_SCHEMA,\n execute: async (args) => buildGeneratedRuntimeToolGateOutput(args, gateOptions),\n }\n }\n\n /**\n * Attach approved runtime tools to an agent execute request.\n * Returns a new request object and does not mutate the original.\n */\n attachApprovedRuntimeTools(\n request: AgentExecuteRequest,\n runtimeTools: RuntimeTool[]\n ): AgentExecuteRequest {\n return appendRuntimeToolsToAgentRequest(request, runtimeTools)\n }\n\n /**\n * Validate a generated runtime tool proposal and append it to an agent execute\n * request if approved, in one call.\n */\n applyGeneratedRuntimeToolProposal(\n request: AgentExecuteRequest,\n proposal: unknown,\n options?: GeneratedRuntimeToolGateOptions\n ): { decision: GeneratedRuntimeToolGateDecision; request: AgentExecuteRequest } {\n const decision = evaluateGeneratedRuntimeToolProposal(proposal, options)\n if (!decision.approved || !decision.tool) {\n return { decision, request }\n }\n return {\n decision,\n request: appendRuntimeToolsToAgentRequest(request, [decision.tool]),\n }\n }\n\n /**\n * Execute an agent (non-streaming)\n */\n async execute(id: string, data: AgentExecuteRequest): Promise<AgentExecuteResponse> {\n return this.client.post<AgentExecuteResponse>(`/agents/${id}/execute`, {\n ...data,\n streamResponse: false,\n })\n }\n\n /**\n * Execute an agent with streaming response\n *\n * Returns a Response object with SSE stream.\n * Use `executeWithCallbacks` for easier handling.\n *\n * @example\n * ```typescript\n * const response = await client.agents.executeStream('agt_123', {\n * messages: [{ role: 'user', content: 'Write me a poem' }],\n * debugMode: true,\n * })\n *\n * // Process the stream manually\n * const reader = response.body?.getReader()\n * // ...\n * ```\n */\n async executeStream(id: string, data: AgentExecuteRequest): Promise<Response> {\n return this.client.requestStream(`/agents/${id}/execute`, {\n method: 'POST',\n body: JSON.stringify({\n ...data,\n streamResponse: true,\n }),\n })\n }\n\n /**\n * Execute an agent with streaming and callbacks\n *\n * Processes the SSE stream and calls the appropriate callbacks for each event type.\n * This is the recommended way to handle agent streaming.\n *\n * @example\n * ```typescript\n * let content = ''\n *\n * const result = await client.agents.executeWithCallbacks('agt_123', {\n * messages: [{ role: 'user', content: 'Write me a poem' }],\n * debugMode: true,\n * }, {\n * onTurnDelta: (event) => {\n * content += event.delta\n * process.stdout.write(event.delta)\n * },\n * onIterationComplete: (event) => {\n * console.log(`\\nIteration ${event.iteration} complete`)\n * },\n * onAgentComplete: (event) => {\n * console.log(`\\nAgent finished: ${event.stopReason}`)\n * },\n * onError: (event) => {\n * console.error(`Error: ${event.error.message}`)\n * },\n * })\n *\n * console.log('Final result:', result)\n * ```\n */\n async executeWithCallbacks(\n id: string,\n data: AgentExecuteRequest,\n callbacks: AgentStreamCallbacks\n ): Promise<AgentCompleteEvent | null> {\n const response = await this.executeStream(id, data)\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error((error as { error?: string }).error || `HTTP ${response.status}`)\n }\n\n let completeEvent: AgentCompleteEvent | null = null\n // Accumulate turn delta text so finalOutput is non-empty even when the\n // agent_complete event carries no output (e.g. model ended after tool calls)\n let accumulatedOutput = ''\n\n await processAgentStream(response.body, {\n ...callbacks,\n onTurnDelta: (event) => {\n if (event.contentType === 'text') {\n accumulatedOutput += event.delta\n }\n callbacks.onTurnDelta?.(event)\n },\n onAgentComplete: (event) => {\n if (!event.finalOutput && accumulatedOutput) {\n event.finalOutput = accumulatedOutput\n }\n completeEvent = event\n callbacks.onAgentComplete?.(event)\n },\n })\n\n return completeEvent\n }\n\n /**\n * Execute an agent with local tool support (pause/resume loop)\n *\n * When the agent hits a tool with `toolType: 'local'`, the server emits\n * `agent_await`. This method automatically executes the local tool and\n * resumes execution, repeating until the agent completes.\n *\n * @example\n * ```typescript\n * const result = await client.agents.executeWithLocalTools('agt_123', {\n * messages: [{ role: 'user', content: 'Create a file called hello.txt' }],\n * }, {\n * write_file: async ({ path, content }) => {\n * fs.writeFileSync(path, content)\n * return 'ok'\n * },\n * })\n * ```\n */\n async executeWithLocalTools(\n id: string,\n data: AgentExecuteRequest,\n localTools: Record<string, LocalToolDefinition>,\n callbacks?: AgentStreamCallbacks,\n options?: ExecuteWithLocalToolsOptions,\n taskName?: string,\n ): Promise<{ completeEvent: AgentCompleteEvent; toolMessages: AgentMessage[] } | null> {\n // Build runtime tool definitions from local tool schemas and inject into request\n const runtimeTools: AgentRuntimeToolDefinition[] = Object.entries(localTools).map(\n ([name, def]) => ({\n name,\n description: def.description,\n toolType: 'local',\n parametersSchema: def.parametersSchema,\n })\n )\n\n const requestData: AgentExecuteRequest = {\n ...data,\n tools: {\n ...data.tools,\n runtimeTools: [...(data.tools?.runtimeTools || []), ...runtimeTools],\n },\n }\n\n const response = await this.executeStream(id, requestData)\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error((error as { error?: string }).error || `HTTP ${response.status}`)\n }\n\n let currentBody: ReadableStream<Uint8Array> | null = response.body\n // Accumulate text output across all streams (initial + resume cycles)\n // so finalOutput is non-empty even when the last resume stream has no text\n let accumulatedOutput = ''\n let pauseCount = 0\n let discoveryPauseCount = 0\n let consecutiveDiscoveryPauseCount = 0\n const toolNameCounts: Record<string, number> = {}\n let recentActionKeys: string[] = []\n const toolMessages: AgentMessage[] = []\n\n while (true) {\n let pausedEvent: AgentPausedEvent | null = null\n let completeEvent: AgentCompleteEvent | null = null\n\n await processAgentStream(currentBody, {\n ...callbacks,\n onTurnDelta: (event) => {\n if (event.contentType === 'text') {\n accumulatedOutput += event.delta\n }\n callbacks?.onTurnDelta?.(event)\n },\n onAgentPaused: (event) => {\n pausedEvent = event\n callbacks?.onAgentPaused?.(event)\n },\n onAgentComplete: (event) => {\n // Supplement finalOutput with accumulated turn deltas when the\n // agent_complete event itself carries no output (common when the\n // model's last action was a tool call rather than text output)\n if (!event.finalOutput && accumulatedOutput) {\n event.finalOutput = accumulatedOutput\n }\n completeEvent = event\n callbacks?.onAgentComplete?.(event)\n },\n })\n\n if (completeEvent) return { completeEvent, toolMessages }\n\n if (pausedEvent) {\n const { toolName, toolId, parameters, executionId } = pausedEvent\n const toolDef = localTools[toolName]\n if (!toolDef) {\n throw new Error(`Local tool \"${toolName}\" required but not provided`)\n }\n // Recursively unwrap stringified parameters — the server pipeline may\n // double-serialize: object → JSON string → JSON string\n let parsedParams: Record<string, unknown> = {}\n let current: unknown = parameters\n for (let i = 0; i < 3; i++) {\n if (typeof current === 'string') {\n try {\n current = JSON.parse(current)\n } catch {\n console.warn(\n `[local-tools] Failed to parse parameters (attempt ${i + 1}):`,\n typeof current,\n String(current).slice(0, 200)\n )\n break\n }\n } else {\n break\n }\n }\n if (current && typeof current === 'object' && !Array.isArray(current)) {\n parsedParams = current as Record<string, unknown>\n } else {\n console.warn(\n '[local-tools] Parameters could not be resolved to an object:',\n typeof current,\n String(current).slice(0, 200)\n )\n }\n let toolResult: unknown\n try {\n toolResult = await toolDef.execute(parsedParams)\n } catch (err) {\n // Return the error as a tool result so the agent can recover\n toolResult = `Error: ${err instanceof Error ? err.message : String(err)}`\n }\n\n // Capture structured tool interaction for message history\n toolMessages.push({\n role: 'assistant',\n content: '',\n toolCalls: [{\n toolCallId: toolId,\n toolName,\n args: parsedParams,\n }],\n })\n toolMessages.push({\n role: 'tool',\n content: '',\n toolResults: [{\n toolCallId: toolId,\n toolName,\n result: toolResult,\n }],\n })\n\n pauseCount += 1\n const toolNameCount = (toolNameCounts[toolName] || 0) + 1\n toolNameCounts[toolName] = toolNameCount\n const discoveryTool = this.isDiscoveryLocalTool(toolName)\n if (discoveryTool) {\n discoveryPauseCount += 1\n consecutiveDiscoveryPauseCount += 1\n } else {\n consecutiveDiscoveryPauseCount = 0\n }\n const actionKey = this.buildLocalToolActionKey(toolName, parsedParams)\n recentActionKeys = [...recentActionKeys, actionKey].slice(-12)\n const actionKeyCount = recentActionKeys.filter(\n (candidateActionKey) => candidateActionKey === actionKey\n ).length\n\n const forcedCompleteEvent = options?.onLocalToolResult?.({\n executionId,\n pauseCount,\n discoveryPauseCount,\n consecutiveDiscoveryPauseCount,\n toolName,\n toolNameCount,\n parameters: parsedParams,\n toolResult,\n accumulatedOutput,\n actionKey,\n actionKeyCount,\n recentActionKeys,\n })\n\n if (forcedCompleteEvent) {\n if (!forcedCompleteEvent.finalOutput && accumulatedOutput) {\n forcedCompleteEvent.finalOutput = accumulatedOutput\n }\n callbacks?.onAgentComplete?.(forcedCompleteEvent)\n return { completeEvent: forcedCompleteEvent, toolMessages }\n }\n\n // Resume via agent resume endpoint\n const resumeResponse = await this.client.requestStream(`/agents/${id}/resume`, {\n method: 'POST',\n body: JSON.stringify({\n executionId,\n toolOutputs: { [toolName]: toolResult },\n streamResponse: true,\n debugMode: data.debugMode,\n }),\n })\n\n if (!resumeResponse.ok) {\n const error = await resumeResponse.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error((error as { error?: string }).error || `HTTP ${resumeResponse.status}`)\n }\n\n currentBody = resumeResponse.body\n continue\n }\n\n // Stream ended without complete or paused\n return null\n }\n }\n\n // ─── Long-Task Agent Execution ───────────────────────────────────────\n\n private createEmptyToolTrace(): RunTaskToolTrace {\n return {\n entries: [],\n discoveryPerformed: false,\n attemptedWrite: false,\n wroteFiles: false,\n executionFileWritten: false,\n readFiles: false,\n readPaths: [],\n actionKeys: [],\n candidatePaths: [],\n planWritten: false,\n bestCandidateReadFailed: false,\n bestCandidateWritten: false,\n bestCandidateVerified: false,\n verificationAttempted: false,\n verificationPassed: false,\n localToolLoopGuardTriggered: false,\n }\n }\n\n private isDiscoveryLocalTool(toolName: string): boolean {\n return ['tree_directory', 'search_repo', 'glob_files', 'list_directory', 'read_file'].includes(\n toolName\n )\n }\n\n private buildLocalToolActionKey(toolName: string, parameters: Record<string, unknown>): string {\n const pathValue =\n typeof parameters.path === 'string' ? this.normalizeCandidatePath(parameters.path) : ''\n const queryValue =\n typeof parameters.query === 'string'\n ? parameters.query.trim()\n : typeof parameters.q === 'string'\n ? parameters.q.trim()\n : ''\n const patternValue =\n typeof parameters.pattern === 'string' ? parameters.pattern.trim() : ''\n const commandValue =\n typeof parameters.command === 'string' ? parameters.command.trim() : ''\n const descriptor = pathValue || queryValue || patternValue || commandValue\n\n if (descriptor) {\n return `${toolName}:${descriptor.slice(0, 160)}`\n }\n\n const fallback = this.summarizeUnknownForTrace(parameters, 160)\n return fallback ? `${toolName}:${fallback}` : toolName\n }\n\n private buildProspectiveStateForSessionTrace(\n state: RunTaskState,\n trace: Pick<\n RunTaskToolTrace,\n 'bestCandidatePath' | 'bestCandidateReason' | 'candidatePaths' | 'readPaths' | 'planWritten'\n >\n ): RunTaskState {\n const candidatePaths = Array.from(\n new Set([...(state.candidatePaths || []), ...trace.candidatePaths])\n ).slice(-20)\n const recentReadPaths = Array.from(\n new Set([...(state.recentReadPaths || []), ...trace.readPaths])\n ).slice(-20)\n\n return {\n ...state,\n ...(trace.bestCandidatePath\n ? {\n bestCandidatePath: trace.bestCandidatePath,\n bestCandidateReason: trace.bestCandidateReason,\n }\n : {}),\n candidatePaths,\n recentReadPaths,\n planWritten: state.planWritten || trace.planWritten,\n }\n }\n\n private buildForcedLocalToolTurnCompleteEvent(\n state: Pick<RunTaskState, 'agentId' | 'workflowPhase'>,\n snapshot: LocalToolExecutionLoopSnapshot,\n reason: string\n ): AgentCompleteEvent {\n const finalOutput = [\n snapshot.accumulatedOutput.trim(),\n `Local tool loop guard ended this ${state.workflowPhase || 'research'} turn: ${reason}`,\n snapshot.recentActionKeys.length > 0\n ? `Recent local tool actions: ${snapshot.recentActionKeys.slice(-5).join(' | ')}`\n : '',\n ]\n .filter(Boolean)\n .join('\\n\\n')\n\n return {\n type: 'agent_complete',\n executionId: snapshot.executionId,\n seq: 0,\n agentId: state.agentId,\n success: true,\n iterations: 1,\n stopReason: 'end_turn',\n completedAt: new Date().toISOString(),\n totalCost: 0,\n finalOutput,\n duration: 0,\n }\n }\n\n private createLocalToolLoopGuard(\n state: RunTaskState,\n trace: RunTaskToolTrace,\n workflow: WorkflowDefinition\n ): ExecuteWithLocalToolsOptions['onLocalToolResult'] {\n return (snapshot) => {\n const prospectiveState = this.buildProspectiveStateForSessionTrace(state, trace)\n\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n\n let reason: string | undefined\n if (currentPhase?.shouldForceEndTurn) {\n const ctx: WorkflowContext = {\n state: prospectiveState,\n trace,\n normalizePath: this.normalizeCandidatePath.bind(this),\n isArtifactPath: this.isMarathonArtifactPath.bind(this),\n isDiscoveryTool: this.isDiscoveryToolName.bind(this),\n }\n reason = currentPhase.shouldForceEndTurn(snapshot, ctx)\n }\n\n if (!reason) {\n return undefined\n }\n\n trace.localToolLoopGuardTriggered = true\n trace.forcedTurnEndReason = reason\n this.pushToolTraceEntry(trace, `local-tool loop guard forced end_turn -> ${reason}`)\n\n return this.buildForcedLocalToolTurnCompleteEvent(state, snapshot, reason)\n }\n }\n\n private pushToolTraceEntry(trace: RunTaskToolTrace, entry: string): void {\n const trimmed = entry.trim()\n if (!trimmed) return\n if (trace.entries[trace.entries.length - 1] === trimmed) return\n trace.entries.push(trimmed)\n if (trace.entries.length > 12) {\n trace.entries = trace.entries.slice(-12)\n }\n }\n\n private isPreservationSensitiveTask(\n state: Pick<RunTaskState, 'originalMessage' | 'bestCandidatePath'>\n ): boolean {\n const bestCandidatePath = state.bestCandidatePath || ''\n if (/\\.(html|tsx|jsx|css|scss|sass)$/i.test(bestCandidatePath)) {\n return true\n }\n\n const prompt = (state.originalMessage || '').toLowerCase()\n return [\n 'ux',\n 'ui',\n 'design',\n 'frontend',\n 'front-end',\n 'theme',\n 'editor',\n 'layout',\n 'style',\n 'accessibility',\n 'visual',\n ].some((keyword) => prompt.includes(keyword))\n }\n\n private isCreationTask(message: string): boolean {\n const lower = message.toLowerCase()\n const creationPatterns = [\n /^create\\b/, /^build\\b/, /^make\\b/, /^generate\\b/, /^scaffold\\b/,\n /^set up\\b/, /^setup\\b/, /^bootstrap\\b/, /^initialize\\b/, /^init\\b/,\n /^write a\\b/, /^write an\\b/, /^implement a\\b/, /^implement an\\b/,\n /^start a\\b/, /^start an\\b/, /^new\\b/,\n ]\n const hasCreationStart = creationPatterns.some((p) => p.test(lower))\n\n const modificationVerbs = [\n 'fix', 'update', 'change', 'modify', 'edit', 'refactor',\n 'improve', 'add to', 'remove', 'delete', 'rename', 'migrate',\n ]\n const hasModificationVerb = modificationVerbs.some(\n (v) => lower.startsWith(v) || new RegExp(`\\\\b${v}\\\\b`).test(lower)\n )\n\n return hasCreationStart && !hasModificationVerb\n }\n\n private getLikelySupportingCandidatePaths(\n bestCandidatePath: string | undefined,\n candidatePaths: string[] | undefined\n ): string[] {\n if (!bestCandidatePath || !candidatePaths || candidatePaths.length === 0) return []\n\n const normalizedBestCandidatePath = this.normalizeCandidatePath(bestCandidatePath)\n const bestCandidateSegments = normalizedBestCandidatePath.split('/').filter(Boolean)\n const relatedRoot =\n bestCandidateSegments.length >= 2\n ? `${bestCandidateSegments[0]}/${bestCandidateSegments[1]}/`\n : bestCandidateSegments.length === 1\n ? `${bestCandidateSegments[0]}/`\n : ''\n const bestCandidateDir = normalizedBestCandidatePath.includes('/')\n ? `${normalizedBestCandidatePath.slice(0, normalizedBestCandidatePath.lastIndexOf('/'))}/`\n : ''\n\n return candidatePaths\n .map((candidatePath) => this.normalizeCandidatePath(candidatePath))\n .filter(\n (candidatePath) =>\n candidatePath &&\n candidatePath !== normalizedBestCandidatePath &&\n !this.isMarathonArtifactPath(candidatePath) &&\n ((bestCandidateDir && candidatePath.startsWith(bestCandidateDir)) ||\n (relatedRoot && candidatePath.startsWith(relatedRoot)))\n )\n }\n\n private hasSufficientResearchEvidence(state: RunTaskState): boolean {\n if (state.isCreationTask) {\n return (state.recentReadPaths?.length || 0) >= 1\n }\n\n if (!state.bestCandidatePath) return false\n\n const normalizedBestCandidatePath = this.normalizeCandidatePath(state.bestCandidatePath)\n const normalizedRecentReadPaths = (state.recentReadPaths || []).map((readPath) =>\n this.normalizeCandidatePath(readPath)\n )\n const readBestCandidate = normalizedRecentReadPaths.includes(normalizedBestCandidatePath)\n\n if (!readBestCandidate) {\n return false\n }\n\n if (!this.isPreservationSensitiveTask(state)) {\n return true\n }\n\n const supportingCandidatePaths = this.getLikelySupportingCandidatePaths(\n state.bestCandidatePath,\n state.candidatePaths\n )\n if (supportingCandidatePaths.length === 0) {\n return true\n }\n\n return normalizedRecentReadPaths.some(\n (readPath) =>\n readPath !== normalizedBestCandidatePath && supportingCandidatePaths.includes(readPath)\n )\n }\n\n private buildEffectiveSessionOutput(modelOutput: string, toolTraceSummary: string): string {\n return [toolTraceSummary.trim(), modelOutput.trim()].filter(Boolean).join('\\n\\n')\n }\n\n private canAcceptTaskCompletion(\n output: string,\n state: Pick<\n RunTaskState,\n | 'workflowPhase'\n | 'planWritten'\n | 'bestCandidatePath'\n | 'bestCandidateVerified'\n | 'verificationRequired'\n | 'lastVerificationPassed'\n >,\n sessionTrace: Pick<RunTaskToolTrace, 'bestCandidateVerified' | 'verificationPassed'>,\n workflow: WorkflowDefinition\n ): boolean {\n if (!this.detectTaskCompletion(output)) {\n return false\n }\n\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n if (currentPhase?.canAcceptCompletion) {\n return currentPhase.canAcceptCompletion(state as RunTaskState, sessionTrace as RunTaskToolTrace)\n }\n\n // For phases without canAcceptCompletion (e.g. research, planning), always accept\n return true\n }\n\n private summarizeUnknownForTrace(value: unknown, maxLength: number = 180): string {\n const text =\n typeof value === 'string'\n ? value\n : value === undefined\n ? ''\n : JSON.stringify(value)\n return text.replace(/\\s+/g, ' ').trim().slice(0, maxLength)\n }\n\n private summarizeTextBlockForTrace(value: unknown, maxLines: number = 4): string {\n const text =\n typeof value === 'string'\n ? value\n : value === undefined\n ? ''\n : JSON.stringify(value)\n if (!text) return ''\n return text\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .slice(0, maxLines)\n .join(' | ')\n .slice(0, 240)\n }\n\n private parseVerificationResult(\n result: unknown\n ): { success: boolean; command?: string; output?: string; error?: string } | undefined {\n if (typeof result !== 'string') return undefined\n\n try {\n const parsed = JSON.parse(result) as {\n success?: unknown\n command?: unknown\n output?: unknown\n error?: unknown\n }\n if (typeof parsed.success !== 'boolean') return undefined\n return {\n success: parsed.success,\n ...(typeof parsed.command === 'string' ? { command: parsed.command } : {}),\n ...(typeof parsed.output === 'string' ? { output: parsed.output } : {}),\n ...(typeof parsed.error === 'string' ? { error: parsed.error } : {}),\n }\n } catch {\n return undefined\n }\n }\n\n private normalizeCandidatePath(candidatePath: string): string {\n return candidatePath.trim().replace(/\\\\/g, '/').replace(/^\\.?\\//, '').replace(/\\/+/g, '/')\n }\n\n private dedupeNormalizedCandidatePaths(paths: string[] | undefined): string[] {\n return Array.from(\n new Set(\n (paths || [])\n .map((candidatePath) => this.normalizeCandidatePath(candidatePath))\n .filter((candidatePath): candidatePath is string => {\n if (!candidatePath) return false\n return !this.isMarathonArtifactPath(candidatePath)\n })\n )\n )\n }\n\n /**\n * Compact old tool results based on context mode and window setting.\n * Modifies messages in-place.\n */\n private compactToolResults(\n messages: AgentMessage[],\n newToolMessages: AgentMessage[],\n taskName: string,\n mode: 'hot-tail' | 'observation-mask' | 'full-inline',\n window: 'session' | number,\n ): void {\n if (mode === 'full-inline') return\n\n if (window === 'session') {\n // Session boundary: compact ALL existing tool results (new ones will be appended after)\n for (const msg of messages) {\n if (msg.role === 'tool' && msg.toolResults) {\n msg.toolResults = msg.toolResults.map(tr => this.compactOneResult(tr, taskName, mode))\n }\n }\n } else {\n // Numeric window: keep the last N tool results inline across all messages\n const newToolResultCount = newToolMessages.filter(m => m.role === 'tool').length\n const keepInlineFromExisting = Math.max(0, window - newToolResultCount)\n\n const toolResultIndices: number[] = []\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === 'tool' && messages[i].toolResults) {\n toolResultIndices.push(i)\n }\n }\n\n const compactUpTo = toolResultIndices.length - keepInlineFromExisting\n for (let j = 0; j < compactUpTo && j < toolResultIndices.length; j++) {\n const msg = messages[toolResultIndices[j]]\n msg.toolResults = msg.toolResults!.map(tr => this.compactOneResult(tr, taskName, mode))\n }\n }\n }\n\n private compactOneResult(\n tr: { toolCallId: string; toolName: string; result: unknown },\n taskName: string,\n mode: 'hot-tail' | 'observation-mask'\n ): typeof tr {\n // Skip already-compacted\n if (typeof tr.result === 'string' && tr.result.startsWith('[')) return tr\n if (mode === 'hot-tail') {\n return { ...tr, result: this.offloadToolResult(taskName, tr.toolCallId, tr.toolName, tr.result) }\n }\n return { ...tr, result: `[Output from ${tr.toolName} masked — re-run the tool if needed]` }\n }\n\n private isMarathonArtifactPath(candidatePath: string): boolean {\n const normalized = this.normalizeCandidatePath(candidatePath).toLowerCase()\n return normalized === '.runtype' || normalized.startsWith('.runtype/')\n }\n\n private isDiscoveryToolName(toolName: string): boolean {\n return (\n toolName === 'search_repo' ||\n toolName === 'glob_files' ||\n toolName === 'tree_directory' ||\n toolName === 'list_directory'\n )\n }\n\n private sanitizeTaskSlug(taskName: string): string {\n return taskName\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80)\n }\n\n private readonly TOOL_OUTPUT_INLINE_THRESHOLD = 500 // chars\n\n private offloadToolResult(\n taskName: string,\n toolCallId: string,\n toolName: string,\n result: unknown\n ): string | unknown {\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2)\n if (resultStr.length <= this.TOOL_OUTPUT_INLINE_THRESHOLD) return result\n\n type FsLike = { mkdirSync: (path: string, opts?: { recursive?: boolean }) => void; writeFileSync: (path: string, data: string, encoding: string) => void }\n let fs: FsLike\n try {\n // Dynamic require for Node.js — this SDK may run in browsers where fs is unavailable.\n // Use indirect eval to avoid TS errors since this package has no @types/node.\n const dynamicRequire = (0, eval)('typeof require !== \"undefined\" ? require : undefined') as\n | ((id: string) => unknown)\n | undefined\n if (!dynamicRequire) return result\n fs = dynamicRequire('fs') as FsLike\n } catch {\n // Not in a Node.js environment — fall back to keeping result inline\n return result\n }\n const slug = this.sanitizeTaskSlug(taskName || 'task')\n const dir = `.runtype/marathons/${slug}/tool-outputs`\n fs.mkdirSync(dir, { recursive: true })\n const filePath = `${dir}/${toolCallId}.txt`\n fs.writeFileSync(filePath, resultStr, 'utf-8')\n return `[${toolName} output (${resultStr.length} chars) saved to ${filePath} — use read_file to retrieve if needed]`\n }\n\n private getDefaultPlanPath(taskName: string): string {\n const slug = this.sanitizeTaskSlug(taskName || 'task')\n return `.runtype/marathons/${slug}/plan.md`\n }\n\n private dirnameOfCandidatePath(candidatePath: string): string {\n const normalized = this.normalizeCandidatePath(candidatePath)\n const index = normalized.lastIndexOf('/')\n return index >= 0 ? normalized.slice(0, index) : ''\n }\n\n private joinCandidatePath(baseDir: string, nextPath: string): string {\n const normalizedNext = nextPath.replace(/\\\\/g, '/').trim()\n if (!normalizedNext) return ''\n\n if (normalizedNext.startsWith('/')) {\n return this.normalizeCandidatePath(`${baseDir}/${normalizedNext.slice(1)}`)\n }\n\n if (normalizedNext.startsWith('./')) {\n return this.normalizeCandidatePath(`${baseDir}/${normalizedNext.slice(2)}`)\n }\n\n return this.normalizeCandidatePath(baseDir ? `${baseDir}/${normalizedNext}` : normalizedNext)\n }\n\n private scoreCandidatePath(candidatePath: string): number {\n const normalized = this.normalizeCandidatePath(candidatePath).toLowerCase()\n let score = 0\n if (normalized.endsWith('/theme.html') || normalized.endsWith('theme.html')) score += 80\n if (normalized.includes('agent')) score += 30\n if (normalized.includes('editor')) score += 30\n if (normalized.includes('theme')) score += 25\n if (normalized.endsWith('.html')) score += 20\n if (normalized.includes('/src/')) score += 10\n if (normalized.includes('/app/')) score += 10\n if (normalized.includes('index.html')) score -= 10\n return score\n }\n\n private addCandidateToTrace(\n trace: RunTaskToolTrace,\n candidatePath: string,\n reason: string\n ): void {\n const normalized = this.normalizeCandidatePath(candidatePath)\n if (!normalized || normalized.length < 3) return\n if (this.isMarathonArtifactPath(normalized)) return\n\n if (!trace.candidatePaths.includes(normalized)) {\n trace.candidatePaths.push(normalized)\n if (trace.candidatePaths.length > 12) {\n trace.candidatePaths = trace.candidatePaths.slice(-12)\n }\n }\n\n const currentScore = trace.bestCandidatePath ? this.scoreCandidatePath(trace.bestCandidatePath) : -1\n const nextScore = this.scoreCandidatePath(normalized)\n if (!trace.bestCandidatePath || nextScore >= currentScore) {\n trace.bestCandidatePath = normalized\n trace.bestCandidateReason = reason.slice(0, 200)\n }\n }\n\n private extractCandidatePathsFromText(text: string, sourcePath?: string): Array<{ path: string; reason: string }> {\n const candidates: Array<{ path: string; reason: string }> = []\n if (sourcePath && this.isMarathonArtifactPath(sourcePath)) {\n return candidates\n }\n\n const add = (candidatePath: string, reason: string) => {\n const normalized = this.normalizeCandidatePath(candidatePath)\n if (!normalized) return\n if (this.isMarathonArtifactPath(normalized)) return\n if (!candidates.some((candidate) => candidate.path === normalized)) {\n candidates.push({ path: normalized, reason })\n }\n }\n\n const baseDir = sourcePath ? this.dirnameOfCandidatePath(sourcePath) : ''\n\n for (const match of text.matchAll(/(?:href|src)=[\"']([^\"']+\\.(?:html|tsx|ts|jsx|js|md|json))[\"']/gi)) {\n const target = match[1] || ''\n const resolved = baseDir ? this.joinCandidatePath(baseDir, target) : target\n add(resolved, `linked from ${sourcePath || 'discovery result'} via ${target}`)\n }\n\n for (const match of text.matchAll(/\\b([\\w./-]+\\.(?:html|tsx|ts|jsx|js|md|json))\\b/g)) {\n const target = match[1] || ''\n const resolved =\n sourcePath && !target.includes('/') ? this.joinCandidatePath(baseDir, target) : this.normalizeCandidatePath(target)\n add(resolved, `mentioned in ${sourcePath || 'discovery result'}`)\n }\n\n return candidates\n }\n\n private parseSearchRepoResultForCandidates(result: string): Array<{ path: string; reason: string }> {\n const candidates: Array<{ path: string; reason: string }> = []\n for (const line of result.split('\\n')) {\n const contentMatch = line.match(/^\\[content\\]\\s+([^:]+):\\d+:\\s+(.*)$/)\n if (contentMatch) {\n const sourcePath = this.normalizeCandidatePath(contentMatch[1] || '')\n const content = contentMatch[2] || ''\n for (const candidate of this.extractCandidatePathsFromText(content, sourcePath)) {\n if (!candidates.some((existing) => existing.path === candidate.path)) {\n candidates.push(candidate)\n }\n }\n continue\n }\n\n const pathMatch = line.match(/^\\[path\\]\\s+(.+)$/)\n if (pathMatch) {\n const sourcePath = this.normalizeCandidatePath(pathMatch[1] || '')\n if (/\\.(html|tsx|ts|jsx|js|md|json)$/i.test(sourcePath)) {\n candidates.push({ path: sourcePath, reason: 'matched repository path search result' })\n }\n }\n }\n return candidates\n }\n\n private extractBestCandidateFromBootstrapContext(\n bootstrapContext: string | undefined\n ): { path: string; reason: string } | undefined {\n if (!bootstrapContext) return undefined\n const candidates = this.parseSearchRepoResultForCandidates(bootstrapContext)\n if (candidates.length === 0) return undefined\n return candidates.sort((a, b) => this.scoreCandidatePath(b.path) - this.scoreCandidatePath(a.path))[0]\n }\n\n private sanitizeResumeState(\n resumeState: RunTaskResumeState | undefined,\n taskName: string\n ): RunTaskResumeState | undefined {\n if (!resumeState) return undefined\n\n const planPath =\n typeof resumeState.planPath === 'string' && resumeState.planPath.trim()\n ? this.normalizeCandidatePath(resumeState.planPath)\n : this.getDefaultPlanPath(taskName)\n const candidatePaths = this.dedupeNormalizedCandidatePaths(resumeState.candidatePaths)\n const recentReadPaths = this.dedupeNormalizedCandidatePaths(resumeState.recentReadPaths)\n const normalizedBestCandidatePath =\n typeof resumeState.bestCandidatePath === 'string' && resumeState.bestCandidatePath.trim()\n ? this.normalizeCandidatePath(resumeState.bestCandidatePath)\n : undefined\n const bestCandidatePath =\n normalizedBestCandidatePath && !this.isMarathonArtifactPath(normalizedBestCandidatePath)\n ? normalizedBestCandidatePath\n : [...candidatePaths, ...recentReadPaths].sort(\n (left, right) => this.scoreCandidatePath(right) - this.scoreCandidatePath(left)\n )[0]\n\n const workflowPhase =\n resumeState.planWritten &&\n (!resumeState.workflowPhase ||\n resumeState.workflowPhase === 'research' ||\n resumeState.workflowPhase === 'planning')\n ? 'execution'\n : resumeState.workflowPhase\n\n return {\n ...resumeState,\n workflowPhase,\n planPath,\n planWritten: Boolean(resumeState.planWritten),\n bestCandidatePath,\n bestCandidateReason: bestCandidatePath ? resumeState.bestCandidateReason : undefined,\n candidatePaths,\n recentReadPaths,\n recentActionKeys: Array.from(new Set(resumeState.recentActionKeys || [])).slice(-20),\n bestCandidateNeedsVerification: Boolean(resumeState.bestCandidateNeedsVerification),\n bestCandidateVerified: Boolean(resumeState.bestCandidateVerified),\n ...(resumeState.verificationRequired !== undefined\n ? { verificationRequired: resumeState.verificationRequired }\n : {}),\n lastVerificationPassed: Boolean(resumeState.lastVerificationPassed),\n ...(resumeState.isCreationTask !== undefined ? { isCreationTask: resumeState.isCreationTask } : {}),\n ...(resumeState.workflowVariant !== undefined ? { workflowVariant: resumeState.workflowVariant } : {}),\n ...(resumeState.workflowState !== undefined ? { workflowState: resumeState.workflowState } : {}),\n }\n }\n\n private buildPhaseInstructions(state: RunTaskState, workflow: WorkflowDefinition): string {\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n if (currentPhase) {\n return currentPhase.buildInstructions(state)\n }\n // Fallback for unknown phases\n return `--- Workflow Phase: ${state.workflowPhase || 'unknown'} ---`\n }\n\n private updateWorkflowPhase(state: RunTaskState, sessionTrace: RunTaskToolTrace, workflow: WorkflowDefinition): void {\n if (!state.workflowPhase) state.workflowPhase = workflow.phases[0]?.name ?? 'research'\n if (!state.planPath) state.planPath = this.getDefaultPlanPath(state.taskName)\n\n state.phaseTransitionSummary = undefined\n\n const ctx: WorkflowContext = {\n state,\n trace: sessionTrace,\n normalizePath: this.normalizeCandidatePath.bind(this),\n isArtifactPath: this.isMarathonArtifactPath.bind(this),\n isDiscoveryTool: this.isDiscoveryToolName.bind(this),\n }\n\n const transitionSummaries: string[] = []\n let phaseUpdated = true\n\n while (phaseUpdated) {\n phaseUpdated = false\n\n const phaseIndex = workflow.phases.findIndex((p) => p.name === state.workflowPhase)\n const phase = workflow.phases[phaseIndex]\n const nextPhase = workflow.phases[phaseIndex + 1]\n\n if (phase && nextPhase && phase.isComplete(ctx)) {\n // Handle planWritten side effect for planning phase\n if (phase.name === 'planning') {\n state.planWritten = true\n }\n\n const summary = phase.buildTransitionSummary?.(state, nextPhase.name)\n state.workflowPhase = nextPhase.name\n if (summary) {\n transitionSummaries.push(summary)\n }\n phaseUpdated = true\n }\n }\n\n if (state.status === 'complete') {\n state.workflowPhase = 'complete'\n }\n\n if (transitionSummaries.length > 0) {\n state.phaseTransitionSummary = transitionSummaries.join('\\n\\n')\n }\n }\n\n private wrapLocalToolsForTrace(\n localTools: Record<string, LocalToolDefinition> | undefined,\n trace: RunTaskToolTrace,\n state: Pick<\n RunTaskState,\n | 'workflowPhase'\n | 'planPath'\n | 'bestCandidatePath'\n | 'recentReadPaths'\n | 'bestCandidateNeedsVerification'\n | 'verificationRequired'\n >,\n workflow: WorkflowDefinition\n ): Record<string, LocalToolDefinition> | undefined {\n if (!localTools) return undefined\n\n const wrapped: Record<string, LocalToolDefinition> = {}\n for (const [toolName, toolDef] of Object.entries(localTools)) {\n wrapped[toolName] = {\n ...toolDef,\n execute: async (args) => {\n const actionKey = `${toolName}:${String(args.path || args.query || args.pattern || '.').slice(0, 120)}`\n trace.actionKeys.push(actionKey)\n if (trace.actionKeys.length > 10) {\n trace.actionKeys = trace.actionKeys.slice(-10)\n }\n\n const normalizedPathArg =\n typeof args.path === 'string' && args.path.trim()\n ? this.normalizeCandidatePath(String(args.path))\n : undefined\n const normalizedPlanPath = state.planPath\n ? this.normalizeCandidatePath(state.planPath)\n : undefined\n const normalizedBestCandidatePath = state.bestCandidatePath\n ? this.normalizeCandidatePath(state.bestCandidatePath)\n : undefined\n const pathArg =\n typeof args.path === 'string' && args.path.trim() ? ` path=${String(args.path)}` : ''\n const queryArg =\n typeof args.query === 'string' && args.query.trim() ? ` query=\"${String(args.query)}\"` : ''\n const patternArg =\n typeof args.pattern === 'string' && args.pattern.trim()\n ? ` pattern=\"${String(args.pattern)}\"`\n : ''\n const isWriteLikeTool = toolName === 'write_file' || toolName === 'restore_file_checkpoint'\n const isVerificationTool = toolName === 'run_check'\n\n // Delegate phase-specific tool interception to workflow\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n if (currentPhase?.interceptToolCall) {\n const ctx: WorkflowContext = {\n state: state as RunTaskState,\n trace,\n normalizePath: this.normalizeCandidatePath.bind(this),\n isArtifactPath: this.isMarathonArtifactPath.bind(this),\n isDiscoveryTool: this.isDiscoveryToolName.bind(this),\n }\n const blockedMessage = currentPhase.interceptToolCall(toolName, args as Record<string, unknown>, ctx)\n if (blockedMessage) {\n if (isWriteLikeTool) trace.attemptedWrite = true\n this.pushToolTraceEntry(trace, `${toolName}${pathArg}${queryArg}${patternArg} -> ${blockedMessage}`)\n return blockedMessage\n }\n }\n\n if (isWriteLikeTool) {\n trace.attemptedWrite = true\n }\n\n if (this.isDiscoveryToolName(toolName)) {\n trace.discoveryPerformed = true\n }\n if (toolName === 'read_file') {\n trace.readFiles = true\n if (normalizedPathArg) {\n const normalizedReadPath = normalizedPathArg\n trace.readPaths.push(normalizedReadPath)\n if (trace.readPaths.length > 12) {\n trace.readPaths = trace.readPaths.slice(-12)\n }\n this.addCandidateToTrace(trace, normalizedReadPath, 'explicitly read by agent')\n }\n }\n\n let result: unknown\n try {\n result = await toolDef.execute(args)\n } catch (error) {\n if (\n toolName === 'read_file' &&\n normalizedPathArg &&\n normalizedBestCandidatePath &&\n normalizedPathArg === normalizedBestCandidatePath\n ) {\n trace.bestCandidateReadFailed = true\n }\n this.pushToolTraceEntry(\n trace,\n `${toolName}${pathArg}${queryArg}${patternArg} -> error: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n throw error\n }\n\n if (isWriteLikeTool && normalizedPathArg) {\n trace.wroteFiles = true\n if (normalizedPlanPath && normalizedPathArg === normalizedPlanPath) {\n trace.planWritten = true\n } else if (state.workflowPhase === 'execution') {\n trace.executionFileWritten = true\n trace.verificationPassed = false\n if (\n normalizedBestCandidatePath &&\n normalizedPathArg === normalizedBestCandidatePath\n ) {\n trace.bestCandidateWritten = true\n }\n }\n }\n\n const verificationResult = isVerificationTool\n ? this.parseVerificationResult(result)\n : undefined\n if (verificationResult) {\n trace.verificationAttempted = true\n trace.verificationPassed = verificationResult.success\n }\n\n const summarizedResult = verificationResult\n ? [\n verificationResult.command || 'verification',\n verificationResult.success ? 'passed' : 'failed',\n verificationResult.error || verificationResult.output,\n ]\n .filter(Boolean)\n .join(' | ')\n .slice(0, 240)\n : this.summarizeTextBlockForTrace(result)\n const resultSuffix = summarizedResult ? ` -> ${summarizedResult}` : ''\n this.pushToolTraceEntry(trace, `${toolName}${pathArg}${queryArg}${patternArg}${resultSuffix}`)\n\n const textResult = typeof result === 'string' ? result : ''\n if (\n toolName === 'read_file' &&\n normalizedPathArg &&\n normalizedBestCandidatePath &&\n normalizedPathArg === normalizedBestCandidatePath &&\n (trace.bestCandidateWritten || state.bestCandidateNeedsVerification)\n ) {\n trace.bestCandidateVerified = true\n }\n if (toolName === 'search_repo' && textResult) {\n for (const candidate of this.parseSearchRepoResultForCandidates(textResult)) {\n this.addCandidateToTrace(trace, candidate.path, candidate.reason)\n }\n } else if (toolName === 'glob_files' && textResult) {\n for (const line of textResult.split('\\n')) {\n const candidatePath = line.trim()\n if (/\\.(html|tsx|ts|jsx|js|md|json)$/i.test(candidatePath)) {\n this.addCandidateToTrace(trace, candidatePath, 'matched glob search')\n }\n }\n } else if (toolName === 'list_directory' && textResult && typeof args.path === 'string') {\n const baseDir = this.normalizeCandidatePath(String(args.path))\n for (const line of textResult.split('\\n')) {\n const candidateName = line.trim()\n if (/\\.(html|tsx|ts|jsx|js|md|json)$/i.test(candidateName)) {\n this.addCandidateToTrace(\n trace,\n this.joinCandidatePath(baseDir, candidateName),\n `listed in directory ${baseDir || '.'}`\n )\n }\n }\n } else if (toolName === 'read_file' && textResult && typeof args.path === 'string') {\n const sourcePath = this.normalizeCandidatePath(String(args.path))\n for (const candidate of this.extractCandidatePathsFromText(textResult, sourcePath)) {\n this.addCandidateToTrace(trace, candidate.path, candidate.reason)\n }\n }\n\n return result\n },\n }\n }\n\n return wrapped\n }\n\n private createTraceCallbacks(\n callbacks: AgentStreamCallbacks | undefined,\n trace: RunTaskToolTrace\n ): AgentStreamCallbacks | undefined {\n if (!callbacks) {\n return {\n onToolStart: (event) => {\n trace.actionKeys.push(`server:${event.toolName}`)\n if (trace.actionKeys.length > 10) trace.actionKeys = trace.actionKeys.slice(-10)\n if (event.toolName === 'write_file') trace.attemptedWrite = true\n this.pushToolTraceEntry(trace, `server-tool ${event.toolName} started`)\n },\n onToolComplete: (event) => {\n const resultSummary = this.summarizeTextBlockForTrace(event.result)\n this.pushToolTraceEntry(\n trace,\n `server-tool ${event.toolName} ${event.success ? 'completed' : 'failed'}${\n resultSummary ? ` -> ${resultSummary}` : ''\n }`\n )\n },\n }\n }\n\n return {\n ...callbacks,\n onToolStart: (event) => {\n trace.actionKeys.push(`server:${event.toolName}`)\n if (trace.actionKeys.length > 10) trace.actionKeys = trace.actionKeys.slice(-10)\n if (event.toolName === 'write_file') trace.attemptedWrite = true\n this.pushToolTraceEntry(trace, `server-tool ${event.toolName} started`)\n callbacks.onToolStart?.(event)\n },\n onToolComplete: (event) => {\n const resultSummary = this.summarizeTextBlockForTrace(event.result)\n this.pushToolTraceEntry(\n trace,\n `server-tool ${event.toolName} ${event.success ? 'completed' : 'failed'}${\n resultSummary ? ` -> ${resultSummary}` : ''\n }`\n )\n callbacks.onToolComplete?.(event)\n },\n }\n }\n\n private buildToolTraceSummary(trace: RunTaskToolTrace): string {\n if (trace.entries.length === 0) return ''\n\n const lines = trace.entries.slice(-6).map((entry) => `- ${entry}`)\n const flags: string[] = []\n if (trace.discoveryPerformed) flags.push('repo discovery used')\n if (trace.readFiles) flags.push('candidate files read')\n if (trace.wroteFiles) flags.push('files written')\n if (trace.localToolLoopGuardTriggered) flags.push('local-tool loop guard forced end_turn')\n if (trace.bestCandidateVerified) flags.push('target re-read after write')\n if (trace.verificationPassed) flags.push('verification passed')\n else if (trace.verificationAttempted) flags.push('verification failed')\n\n return [\n 'Session working memory:',\n ...(flags.length > 0 ? [`- ${flags.join('; ')}`] : []),\n ...(trace.bestCandidatePath\n ? [`- best candidate: ${trace.bestCandidatePath}${trace.bestCandidateReason ? ` (${trace.bestCandidateReason})` : ''}`]\n : []),\n ...lines,\n ]\n .join('\\n')\n .slice(0, 1200)\n }\n\n private extractBootstrapQueries(message: string): string[] {\n const queries: string[] = []\n const noisyTerms = new Set([\n 'a',\n 'against',\n 'all',\n 'analyze',\n 'and',\n 'as',\n 'at',\n 'based',\n 'before',\n 'best',\n 'by',\n 'codebase',\n 'do',\n 'exactly',\n 'files',\n 'first',\n 'following',\n 'goal',\n 'go',\n 'how',\n 'in',\n 'is',\n 'it',\n 'its',\n 'make',\n 'markdown',\n 'most',\n 'no',\n 'of',\n 'on',\n 'order',\n 'plan',\n 'progress',\n 'repo',\n 'research',\n 'right',\n 'save',\n 'session',\n 'solve',\n 'task',\n 'that',\n 'the',\n 'then',\n 'through',\n 'to',\n 'turn',\n 'update',\n 'user',\n 'ux',\n 'web',\n 'when',\n 'with',\n 'work',\n 'your',\n ])\n const push = (candidate: string) => {\n const normalized = candidate\n .replace(/^[^a-z0-9/._-]+|[^a-z0-9/._ -]+$/gi, '')\n .replace(/\\s+/g, ' ')\n .trim()\n if (!normalized || normalized.length < 3 || normalized.length > 60) return\n const words = normalized.toLowerCase().split(' ').filter(Boolean)\n if (words.length > 4) return\n if (words.every((word) => noisyTerms.has(word))) return\n if (words.length > 1 && noisyTerms.has(words[words.length - 1] || '')) return\n if (!queries.some((existing) => existing.toLowerCase() === normalized.toLowerCase())) {\n queries.push(normalized)\n }\n }\n\n const lowerMessage = message.toLowerCase()\n const phraseHints = [\n 'agent editor',\n 'theme.html',\n '/theme.html',\n 'style it visually',\n ]\n for (const hint of phraseHints) {\n if (lowerMessage.includes(hint.toLowerCase())) push(hint)\n }\n\n for (const match of message.matchAll(/\"([^\"]{3,60})\"/g)) {\n push(match[1] || '')\n }\n\n for (const match of message.matchAll(\n /(?:go through|review|inspect|edit|improve|update|fix|modify)\\s+(?:the\\s+)?([a-z0-9][a-z0-9/_-]*(?:\\s+[a-z0-9][a-z0-9/_-]*){0,2})/gi\n )) {\n push(match[1] || '')\n }\n\n for (const match of message.matchAll(\n /([a-z0-9][a-z0-9/_-]*(?:\\s+[a-z0-9][a-z0-9/_-]*){0,2})\\s+(?:page|editor|screen|view|route|component)\\b/gi\n )) {\n push(match[0] || '')\n push(match[1] || '')\n }\n\n for (const match of message.matchAll(/\\b[\\w./-]+\\.(?:html|tsx|ts|jsx|js|md|json)\\b/g)) {\n push(match[0] || '')\n }\n\n for (const match of message.matchAll(/\\/[A-Za-z0-9._/-]+/g)) {\n push(match[0] || '')\n }\n\n for (const match of message.matchAll(/\\b([a-z0-9]+(?:\\s+[a-z0-9]+){1,2})\\b/gi)) {\n const phrase = (match[1] || '').toLowerCase()\n const words = phrase.split(' ')\n if (words.some((word) => ['editor', 'page', 'screen', 'view', 'route', 'component'].includes(word))) {\n push(match[1] || '')\n }\n }\n\n return queries.slice(0, 4)\n }\n\n private async generateBootstrapDiscoveryContext(\n message: string,\n localTools: Record<string, LocalToolDefinition> | undefined,\n isCreationTask?: boolean\n ): Promise<string | undefined> {\n if (isCreationTask) return undefined\n if (!localTools) return undefined\n\n const searchTool = localTools.search_repo\n const globTool = localTools.glob_files\n if (!searchTool && !globTool) return undefined\n\n const queries = this.extractBootstrapQueries(message)\n if (queries.length === 0) return undefined\n\n const lines: string[] = []\n for (const query of queries) {\n if (lines.length >= 6) break\n\n if (searchTool) {\n try {\n const result = await searchTool.execute({ query, path: '.', maxResults: 5 })\n const summary = this.summarizeTextBlockForTrace(result, 3)\n if (summary && !summary.startsWith('No matches found')) {\n lines.push(`search_repo \"${query}\": ${summary}`)\n continue\n }\n } catch {\n // Best effort bootstrap only\n }\n }\n\n if (globTool && /\\./.test(query)) {\n try {\n const result = await globTool.execute({ pattern: `**/${query}`, path: '.', maxResults: 5 })\n const summary = this.summarizeTextBlockForTrace(result, 3)\n if (summary && !summary.startsWith('No files matched')) {\n lines.push(`glob_files \"**/${query}\": ${summary}`)\n }\n } catch {\n // Best effort bootstrap only\n }\n }\n }\n\n if (lines.length === 0) return undefined\n return ['Bootstrap repo hints:', ...lines].join('\\n').slice(0, 1500)\n }\n\n private buildStuckTurnRecoveryMessage(state: RunTaskState, workflow: WorkflowDefinition): string | undefined {\n const currentPhase = workflow.phases.find((p) => p.name === state.workflowPhase)\n if (currentPhase?.buildRecoveryMessage) {\n return currentPhase.buildRecoveryMessage(state)\n }\n return undefined\n }\n\n /**\n * Run a long-task agent across multiple sessions with automatic state management.\n *\n * Each session is a single agent execution. The SDK drives the loop client-side,\n * calling the agent's execute endpoint repeatedly and accumulating context.\n * Progress is optionally synced to a Runtype record for dashboard visibility.\n *\n * @example\n * ```typescript\n * const result = await client.agents.runTask('agt_123', {\n * message: 'Build a REST API with CRUD endpoints',\n * maxSessions: 20,\n * maxCost: 5.00,\n * trackProgress: true,\n * onSession: (state) => {\n * console.log(`Session ${state.sessionCount}: ${state.lastStopReason} ($${state.totalCost.toFixed(4)})`)\n * },\n * })\n *\n * console.log(`Finished: ${result.status} after ${result.sessionCount} sessions`)\n * ```\n */\n async runTask(id: string, options: RunTaskOptions): Promise<RunTaskResult> {\n const maxSessions = options.maxSessions ?? 50\n const maxCost = options.maxCost\n const useStream = options.stream ?? true\n const workflow = options.workflow ?? defaultWorkflow\n\n // Resolve agent metadata\n const agent = await this.get(id)\n const taskName =\n typeof options.trackProgress === 'string'\n ? options.trackProgress\n : options.trackProgress\n ? `${agent.name} task`\n : ''\n const resolvedTaskName = taskName || `${agent.name} task`\n const seededResumeState = this.sanitizeResumeState(options.resumeState, resolvedTaskName)\n\n // Initialize state\n const state: RunTaskState = {\n agentId: id,\n agentName: agent.name,\n taskName: resolvedTaskName,\n status: 'running',\n workflowPhase: seededResumeState?.workflowPhase || workflow.phases[0]?.name || 'research',\n planPath: seededResumeState?.planPath || this.getDefaultPlanPath(resolvedTaskName),\n planWritten: seededResumeState?.planWritten || false,\n bestCandidateNeedsVerification: seededResumeState?.bestCandidateNeedsVerification || false,\n bestCandidateVerified: seededResumeState?.bestCandidateVerified || false,\n verificationRequired:\n seededResumeState?.verificationRequired ?? Boolean(options.localTools?.run_check),\n lastVerificationPassed: seededResumeState?.lastVerificationPassed || false,\n sessionCount: 0,\n totalCost: 0,\n lastOutput: '',\n lastStopReason: 'complete',\n sessions: [],\n startedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n ...(seededResumeState?.originalMessage ? { originalMessage: seededResumeState.originalMessage } : {}),\n ...(seededResumeState?.bootstrapContext ? { bootstrapContext: seededResumeState.bootstrapContext } : {}),\n ...(seededResumeState?.bestCandidatePath\n ? {\n bestCandidatePath: seededResumeState.bestCandidatePath,\n bestCandidateReason: seededResumeState.bestCandidateReason,\n }\n : {}),\n ...(seededResumeState?.candidatePaths ? { candidatePaths: seededResumeState.candidatePaths } : {}),\n ...(seededResumeState?.recentReadPaths ? { recentReadPaths: seededResumeState.recentReadPaths } : {}),\n ...(seededResumeState?.recentActionKeys\n ? { recentActionKeys: seededResumeState.recentActionKeys }\n : {}),\n }\n\n // Classify variant via workflow\n state.workflowVariant = seededResumeState?.workflowVariant\n ?? workflow.classifyVariant?.(options.message)\n state.isCreationTask = seededResumeState?.isCreationTask ?? (state.workflowVariant === 'create')\n\n this.updateWorkflowPhase(state, this.createEmptyToolTrace(), workflow)\n\n // Track the record ID if we're syncing\n let recordId: string | undefined\n\n // Extract local tool names for prompt injection\n const localToolNames = options.localTools ? Object.keys(options.localTools) : undefined\n\n if (!options.previousMessages) {\n // Delegate bootstrap to workflow\n if (workflow.generateBootstrapContext) {\n state.bootstrapContext = await workflow.generateBootstrapContext(\n options.message,\n options.localTools,\n state.workflowVariant\n )\n } else {\n state.bootstrapContext = await this.generateBootstrapDiscoveryContext(\n options.message,\n options.localTools,\n state.isCreationTask\n )\n }\n const bootstrapCandidate = this.extractBestCandidateFromBootstrapContext(state.bootstrapContext)\n if (bootstrapCandidate) {\n state.bestCandidatePath = bootstrapCandidate.path\n state.bestCandidateReason = bootstrapCandidate.reason\n state.candidatePaths = [bootstrapCandidate.path]\n }\n }\n\n // Session loop\n for (let session = 0; session < maxSessions; session++) {\n const sessionTrace = this.createEmptyToolTrace()\n const sessionLocalTools = this.wrapLocalToolsForTrace(options.localTools, sessionTrace, state, workflow)\n const sessionCallbacks = this.createTraceCallbacks(options.streamCallbacks, sessionTrace)\n\n // Build continuation context for resumed runs (first session only)\n const continuationContext =\n session === 0 && options.previousMessages\n ? {\n previousMessages: options.previousMessages,\n newUserMessage: options.continuationMessage,\n compact: options.compact,\n }\n : undefined\n\n // Store original message on first invocation (not a continuation)\n if (session === 0 && !options.previousMessages) {\n state.originalMessage = options.message\n }\n\n // Build messages for this session\n const messages = this.buildSessionMessages(\n options.message,\n state,\n session,\n maxSessions,\n localToolNames,\n continuationContext,\n workflow,\n options.toolIds\n )\n\n // Execute one session\n let sessionResult: AgentExecuteResponse\n const sessionData: AgentExecuteRequest = {\n messages,\n debugMode: options.debugMode,\n model: options.model,\n ...(options.toolIds?.length ? { tools: { toolIds: options.toolIds } } : {}),\n }\n\n let sessionToolMessages: AgentMessage[] = []\n\n if (useStream && options.localTools) {\n // Local tools require the pause/resume streaming loop\n const localToolResult = await this.executeWithLocalTools(\n id,\n sessionData,\n sessionLocalTools || options.localTools,\n sessionCallbacks,\n {\n onLocalToolResult: this.createLocalToolLoopGuard(state, sessionTrace, workflow),\n },\n state.taskName,\n )\n if (!localToolResult) {\n throw new Error('Agent stream ended without a complete event')\n }\n const { completeEvent, toolMessages: captured } = localToolResult\n sessionToolMessages = captured\n sessionResult = {\n success: completeEvent.success,\n result: completeEvent.finalOutput || '',\n iterations: completeEvent.iterations,\n totalCost: completeEvent.totalCost || 0,\n totalTokens: completeEvent.totalTokens,\n stopReason: completeEvent.stopReason,\n error: completeEvent.error,\n }\n } else if (useStream && options.streamCallbacks) {\n const completeEvent = await this.executeWithCallbacks(\n id,\n sessionData,\n sessionCallbacks || options.streamCallbacks\n )\n if (!completeEvent) {\n throw new Error('Agent stream ended without a complete event')\n }\n sessionResult = {\n success: completeEvent.success,\n result: completeEvent.finalOutput || '',\n iterations: completeEvent.iterations,\n totalCost: completeEvent.totalCost || 0,\n totalTokens: completeEvent.totalTokens,\n stopReason: completeEvent.stopReason,\n error: completeEvent.error,\n }\n } else {\n sessionResult = await this.execute(id, sessionData)\n }\n\n const toolTraceSummary = this.buildToolTraceSummary(sessionTrace)\n const effectiveSessionOutput = this.buildEffectiveSessionOutput(\n sessionResult.result,\n toolTraceSummary\n )\n\n // Update state\n const sessionCost = sessionResult.totalCost\n const sessionTokens = sessionResult.totalTokens\n state.sessionCount = session + 1\n state.totalCost += sessionCost\n if (sessionTokens) {\n state.totalTokens = {\n input: (state.totalTokens?.input || 0) + sessionTokens.input,\n output: (state.totalTokens?.output || 0) + sessionTokens.output,\n }\n }\n state.lastOutput = effectiveSessionOutput\n state.lastError =\n sessionResult.stopReason === 'error'\n ? sessionResult.error || 'Agent session ended with an error.'\n : undefined\n state.lastStopReason = sessionResult.stopReason\n state.updatedAt = new Date().toISOString()\n\n state.sessions.push({\n index: session + 1,\n cost: sessionCost,\n totalTokens: sessionTokens,\n iterations: sessionResult.iterations,\n stopReason: sessionResult.stopReason,\n outputPreview: effectiveSessionOutput.slice(0, 300),\n toolTraceSummary: toolTraceSummary || undefined,\n discoveryPerformed: sessionTrace.discoveryPerformed,\n attemptedWrite: sessionTrace.attemptedWrite,\n wroteFiles: sessionTrace.wroteFiles,\n hadTextOutput: Boolean(sessionResult.result.trim()),\n verificationAttempted: sessionTrace.verificationAttempted,\n verificationPassed: sessionTrace.verificationPassed,\n bestCandidatePath: sessionTrace.bestCandidatePath || undefined,\n actionKeys: sessionTrace.actionKeys.slice(-5),\n completedAt: new Date().toISOString(),\n })\n\n if (sessionTrace.bestCandidatePath) {\n state.bestCandidatePath = sessionTrace.bestCandidatePath\n state.bestCandidateReason = sessionTrace.bestCandidateReason\n }\n if (sessionTrace.candidatePaths.length > 0) {\n state.candidatePaths = Array.from(\n new Set([...(state.candidatePaths || []), ...sessionTrace.candidatePaths])\n ).slice(-20)\n }\n if (sessionTrace.readPaths.length > 0) {\n state.recentReadPaths = Array.from(\n new Set([...(state.recentReadPaths || []), ...sessionTrace.readPaths])\n ).slice(-20)\n }\n if (sessionTrace.actionKeys.length > 0) {\n state.recentActionKeys = [...(state.recentActionKeys || []), ...sessionTrace.actionKeys].slice(-20)\n }\n if (sessionTrace.planWritten) {\n state.planWritten = true\n }\n if (sessionTrace.executionFileWritten) {\n state.lastVerificationPassed = false\n }\n if (sessionTrace.bestCandidateWritten) {\n state.bestCandidateNeedsVerification = true\n state.bestCandidateVerified = false\n }\n if (sessionTrace.bestCandidateVerified) {\n state.bestCandidateNeedsVerification = false\n state.bestCandidateVerified = true\n }\n if (sessionTrace.verificationAttempted) {\n state.lastVerificationPassed = sessionTrace.verificationPassed\n }\n\n // Track cost by model\n const modelKey = options.model || 'default'\n if (!state.costByModel) state.costByModel = {}\n state.costByModel[modelKey] = (state.costByModel[modelKey] || 0) + sessionCost\n\n this.updateWorkflowPhase(state, sessionTrace, workflow)\n const phaseTransitionSummary = state.phaseTransitionSummary\n if (phaseTransitionSummary) {\n state.lastOutput = [phaseTransitionSummary, '', state.lastOutput].join('\\n').trim()\n const latestSession = state.sessions[state.sessions.length - 1]\n if (latestSession) {\n latestSession.outputPreview = [phaseTransitionSummary, '', latestSession.outputPreview]\n .join('\\n')\n .slice(0, 300)\n latestSession.toolTraceSummary = [phaseTransitionSummary, '', latestSession.toolTraceSummary || '']\n .join('\\n')\n .trim()\n .slice(0, 1200)\n }\n }\n\n // Accumulate messages for future continuation.\n // When buildSessionMessages returns the full history + a new continuation\n // message, only the NEW messages at the end are appended — otherwise the\n // history would be re-pushed on every session and grow exponentially.\n if (!state.messages) state.messages = []\n if (state.messages.length > 0 && messages.length > state.messages.length) {\n // Continuation session: history was replayed, only append the new tail\n const newMessages = messages.slice(state.messages.length)\n state.messages.push(...newMessages)\n } else {\n // First session (or no prior history): all messages are new\n state.messages.push(...messages)\n }\n // Store structured tool messages and compact old results\n if (sessionToolMessages.length > 0) {\n this.compactToolResults(\n state.messages,\n sessionToolMessages,\n state.taskName,\n options.toolContextMode || 'hot-tail',\n options.toolWindow ?? 'session',\n )\n state.messages.push(...sessionToolMessages)\n }\n // Always store an assistant message so continuation sessions have full\n // conversation history. When the agent only made tool calls and produced\n // no text, fall back to a synthetic summary so the history stays coherent.\n const assistantContent =\n effectiveSessionOutput ||\n `[Session ${session + 1} completed (${sessionResult.stopReason}). No text output captured.]`\n state.messages.push({ role: 'assistant', content: assistantContent })\n\n // Keep session log trimmed to last 50 entries\n if (state.sessions.length > 50) {\n state.sessions = state.sessions.slice(-50)\n }\n\n // Check terminal conditions\n if (sessionResult.stopReason === 'complete') {\n state.status = 'complete'\n } else if (sessionResult.stopReason === 'error') {\n state.status = 'error'\n } else if (sessionResult.stopReason === 'max_cost') {\n state.status = 'budget_exceeded'\n } else if (this.canAcceptTaskCompletion(sessionResult.result, state, sessionTrace, workflow)) {\n // Client-side stop-phrase detection for non-loop agents returning 'end_turn'\n state.status = 'complete'\n } else if (maxCost && state.totalCost >= maxCost) {\n state.status = 'budget_exceeded'\n } else if (session + 1 >= maxSessions) {\n state.status = 'max_sessions'\n }\n\n // Sync to record if enabled\n if (options.trackProgress) {\n recordId = await this.syncProgressRecord(state, recordId)\n }\n\n // Notify caller\n if (options.onSession) {\n const shouldStop = await options.onSession(state)\n if (shouldStop === false) {\n state.status = 'paused'\n }\n }\n\n // Stop if terminal\n if (state.status !== 'running') {\n break\n }\n }\n\n return {\n status: state.status,\n sessionCount: state.sessionCount,\n totalCost: state.totalCost,\n totalTokens: state.totalTokens,\n lastOutput: state.lastOutput,\n sessions: state.sessions,\n recordId,\n }\n }\n\n /** Stop phrases that indicate the agent considers its task complete. */\n private static readonly STOP_PHRASES = [\n 'DONE:',\n 'TASK_COMPLETE',\n 'FINISHED',\n '[COMPLETE]',\n 'STATUS: RESOLVED',\n 'STATUS: COMPLETE',\n ]\n\n /**\n * Client-side fallback for detecting task completion in agent output.\n * Mirrors the API's detectAutoComplete() for non-loop agents that return 'end_turn'.\n */\n private detectTaskCompletion(output: string): boolean {\n const upper = output.toUpperCase()\n return AgentsEndpoint.STOP_PHRASES.some((phrase) => upper.includes(phrase.toUpperCase()))\n }\n\n /**\n * Generate a compact summary of prior work for continuation context.\n * Used when compact mode is enabled to keep token usage low.\n */\n private generateCompactSummary(state: RunTaskState): string {\n const sessionSummaries = (state.sessions ?? [])\n .map(\n (s) =>\n `- Session ${s.index}: ${s.stopReason} ($${s.cost.toFixed(4)}) -- ${s.outputPreview.slice(0, 100)}`\n )\n .join('\\n')\n\n return [\n `Task: ${state.taskName}`,\n `Status: ${state.status}`,\n `Workflow phase: ${state.workflowPhase || 'research'}`,\n `Sessions completed: ${state.sessionCount}`,\n `Total cost: $${state.totalCost.toFixed(4)}`,\n ...(state.planPath ? [`Plan path: ${state.planPath}`] : []),\n ...(state.planWritten ? ['Plan written: yes'] : []),\n ...(state.bestCandidatePath\n ? [\n `Best candidate: ${state.bestCandidatePath}`,\n ...(state.bestCandidateReason ? [`Candidate reason: ${state.bestCandidateReason}`] : []),\n ]\n : []),\n ...(state.bootstrapContext ? ['', state.bootstrapContext] : []),\n '',\n 'Session history:',\n sessionSummaries,\n '',\n 'Last output (truncated):',\n (state.lastOutput || '').slice(0, 1500),\n ].join('\\n')\n }\n\n /**\n * Build messages for a session, injecting progress context for continuation sessions.\n * Optionally accepts continuation context for marathon resume scenarios.\n */\n private buildSessionMessages(\n originalMessage: string,\n state: RunTaskState,\n sessionIndex: number,\n maxSessions: number,\n localToolNames?: string[],\n continuationContext?: {\n previousMessages: AgentMessage[]\n newUserMessage?: string\n compact?: boolean\n },\n workflow?: WorkflowDefinition,\n builtinToolIds?: string[]\n ): AgentMessage[] {\n const wf = workflow ?? defaultWorkflow\n\n // Build local tools guidance block when tools are available\n const currentPhase = wf.phases.find((p) => p.name === state.workflowPhase)\n const toolGuidanceLines = currentPhase?.buildToolGuidance(state) ?? []\n const isDeployWorkflow = wf.name === 'deploy'\n const localToolsBlock = localToolNames?.length\n ? [\n '',\n '--- Local Tools ---',\n `You have access to tools (${localToolNames.join(', ')}) that execute directly on the user's machine.`,\n ...(isDeployWorkflow\n ? ['Use deploy_sandbox to deploy code and get a live preview URL.']\n : [\n 'Use these tools to inspect the existing repository and make real file edits — not just code in your response.',\n ]),\n ...toolGuidanceLines,\n ...(isDeployWorkflow ? [] : ['Always use write_file to save your output so the user can run it immediately.']),\n ].join('\\n')\n : ''\n\n const builtinToolNames = builtinToolIds?.map((id) => id.replace(/^builtin:/, ''))\n const builtinToolsBlock = builtinToolNames?.length\n ? [\n '',\n '--- Built-in Tools ---',\n `You have access to built-in tools (${builtinToolNames.join(', ')}) for web search, web scraping, image generation, and other capabilities.`,\n 'Use these tools when the task requires information from the web, generating images, or other capabilities beyond local file operations.',\n ].join('\\n')\n : ''\n\n const toolsBlock = localToolsBlock + builtinToolsBlock\n\n const bootstrapBlock = state.bootstrapContext\n ? ['', '--- Initial Repository Discovery ---', state.bootstrapContext].join('\\n')\n : ''\n const phaseBlock = ['', this.buildPhaseInstructions(state, wf)].join('\\n')\n const candidateBlock = wf.buildCandidateBlock?.(state) ?? ''\n\n const multiSessionInstruction = `This is a multi-session task (session ${sessionIndex + 1}/${maxSessions}). When you have fully completed the task, end your response with TASK_COMPLETE on its own line.`\n\n // Continuation resume: first session of a resumed run with prior context\n if (continuationContext && sessionIndex === 0) {\n const defaultContinueMessage =\n 'Continue the task. Review your prior work above and proceed with any remaining work. If everything is already complete, respond with TASK_COMPLETE.'\n const userMessage = continuationContext.newUserMessage || defaultContinueMessage\n\n if (continuationContext.compact) {\n // Compact mode: summarize prior work instead of full history\n const summary = this.generateCompactSummary(state)\n const messages: AgentMessage[] = [\n {\n role: 'system',\n content: `You are continuing a previously completed task. Here is a summary of prior work:\\n\\n${summary}\\n\\nDo NOT redo any of the above work.`,\n },\n {\n role: 'user',\n content: [userMessage, phaseBlock, toolsBlock, bootstrapBlock, candidateBlock, '', multiSessionInstruction].join('\\n'),\n },\n ]\n return messages\n }\n\n // Full history mode: replay all previous messages with do-not-redo instruction\n const messages: AgentMessage[] = [\n ...continuationContext.previousMessages,\n {\n role: 'system',\n content:\n 'IMPORTANT: You are continuing a previously completed task. The conversation above shows your prior work. Do NOT redo any of it. Build on what was already accomplished. If there is nothing new to do, respond with TASK_COMPLETE.',\n },\n {\n role: 'user',\n content: [userMessage, phaseBlock, toolsBlock, bootstrapBlock, candidateBlock, '', multiSessionInstruction].join('\\n'),\n },\n ]\n return messages\n }\n\n // First session (non-continuation): user message + completion signal instruction\n if (sessionIndex === 0) {\n const content = [originalMessage, phaseBlock, toolsBlock, bootstrapBlock, candidateBlock, '', multiSessionInstruction].join('\\n')\n return [{ role: 'user', content }]\n }\n\n // Continuation sessions within a run: inject progress context\n const recentSessions = state.sessions.slice(-5)\n const progressSummary = recentSessions\n .map(\n (s) =>\n ` Session ${s.index}: ${s.stopReason} ($${s.cost.toFixed(4)}) — ${s.outputPreview.slice(0, 100)}`\n )\n .join('\\n')\n\n // When we have accumulated message history, replay the full conversation\n // so the model has complete context and doesn't start fresh each session.\n if (state.messages && state.messages.length > 0) {\n const recoveryMessage = this.buildStuckTurnRecoveryMessage(state, wf)\n const continuationContent = [\n 'Continue the task.',\n phaseBlock,\n toolsBlock,\n bootstrapBlock,\n candidateBlock,\n '',\n `--- Progress (session ${sessionIndex + 1}/${maxSessions}, $${state.totalCost.toFixed(4)} spent) ---`,\n `Previous sessions:`,\n progressSummary,\n '',\n ...(recoveryMessage ? [recoveryMessage, ''] : []),\n 'Do not redo previous work. If the task is already complete, respond with TASK_COMPLETE.',\n ].join('\\n')\n\n // Cap history to prevent context overflow on long-running marathons.\n // Keep the most recent 60 messages (increased from 40 to accommodate tool message pairs).\n const MAX_HISTORY_MESSAGES = 60\n let historyMessages = state.messages\n if (historyMessages.length > MAX_HISTORY_MESSAGES) {\n const trimmedCount = historyMessages.length - MAX_HISTORY_MESSAGES\n historyMessages = [\n {\n role: 'system' as const,\n content: `[${trimmedCount} earlier messages trimmed to stay within context limits. Original task: ${(state.originalMessage || originalMessage).slice(0, 500)}]`,\n },\n ...historyMessages.slice(-MAX_HISTORY_MESSAGES),\n ]\n }\n\n return [\n ...historyMessages,\n { role: 'user' as const, content: continuationContent },\n ]\n }\n\n // Fallback when no message history is available: single-message summary\n const recoveryMessage = this.buildStuckTurnRecoveryMessage(state, wf)\n const content = [\n originalMessage,\n phaseBlock,\n toolsBlock,\n bootstrapBlock,\n candidateBlock,\n '',\n `--- Progress (session ${sessionIndex + 1}/${maxSessions}, $${state.totalCost.toFixed(4)} spent) ---`,\n `Previous sessions:`,\n progressSummary,\n '',\n ...(recoveryMessage ? [recoveryMessage, ''] : []),\n `Last output (do NOT repeat this — build on it):`,\n state.lastOutput.slice(0, 1000),\n '',\n 'Continue where you left off. Do not redo previous work. If the task is already complete, respond with TASK_COMPLETE.',\n ].join('\\n')\n\n return [{ role: 'user', content }]\n }\n\n /**\n * Upsert a record to sync long-task progress to the dashboard.\n * Creates the record on first call, updates it on subsequent calls.\n */\n private async syncProgressRecord(\n state: RunTaskState,\n existingRecordId?: string\n ): Promise<string> {\n const metadata = {\n agentId: state.agentId,\n agentName: state.agentName,\n status: state.status,\n sessionCount: state.sessionCount,\n totalCost: state.totalCost,\n lastStopReason: state.lastStopReason,\n lastOutputPreview: state.lastOutput.slice(0, 500),\n sessions: state.sessions.slice(-10), // Keep last 10 in the record\n startedAt: state.startedAt,\n updatedAt: state.updatedAt,\n }\n\n try {\n if (existingRecordId) {\n // Update existing record\n const record = await this.client.put<RuntypeRecord>(`/records/${existingRecordId}`, {\n metadata,\n })\n return record.id\n } else {\n // Try to find existing record by type + name first\n const existing = await this.client.get<PaginationResponse<RuntypeRecord>>('/records', {\n type: 'agent-task',\n name: state.taskName,\n limit: 1,\n })\n if (existing.data.length > 0) {\n const record = await this.client.put<RuntypeRecord>(`/records/${existing.data[0].id}`, {\n metadata,\n })\n return record.id\n }\n\n // Create new record\n const record = await this.client.post<RuntypeRecord>('/records', {\n type: 'agent-task',\n name: state.taskName,\n metadata,\n })\n return record.id\n }\n } catch {\n // Record sync is best-effort — don't fail the task\n return existingRecordId || ''\n }\n }\n}\n","/**\n * FlowBuilder - Fluent builder for constructing dispatch configurations\n *\n * Provides a chainable API for building flows with steps, making flow\n * construction more readable and type-safe.\n *\n * @example\n * ```typescript\n * import { FlowBuilder } from '@runtypelabs/sdk'\n *\n * const config = new FlowBuilder()\n * .createFlow({ name: \"My Flow\" })\n * .withRecord({ name: \"Record\", type: \"data\", metadata: { key: \"value\" } })\n * .fetchUrl({ name: \"Fetch\", url: \"https://api.example.com\", outputVariable: \"data\" })\n * .prompt({ name: \"Process\", model: \"gpt-4\", userPrompt: \"Analyze: {{data}}\" })\n * .withOptions({ streamResponse: true, flowMode: \"virtual\" })\n * .build()\n * ```\n */\n\nimport type {\n DispatchRequest,\n MessageContent,\n ToolsConfig,\n RuntimeTool,\n RuntimeExternalToolConfig,\n ReasoningConfig,\n} from './types'\nimport type {\n ErrorHandlingMode,\n PromptErrorHandling,\n ContextErrorHandling,\n} from './error-handling-types'\nimport { FlowResult } from './flow-result'\nimport { processStream } from './stream-utils'\n\n// ============================================================================\n// Step Configuration Interfaces\n// ============================================================================\n\nexport interface PromptStepConfig {\n name: string\n model: string\n userPrompt: string\n systemPrompt?: string\n previousMessages?: string | Array<{ role: string; content: string }>\n outputVariable?: string\n responseFormat?: 'text' | 'json'\n temperature?: number\n maxTokens?: number\n /**\n * Enable reasoning/extended thinking for models that support it.\n * - `true`: Enable with provider defaults\n * - `ReasoningConfig`: Fine-grained control over reasoning behavior\n *\n * @example GPT-5 with streaming reasoning\n * ```typescript\n * reasoning: { enabled: true, reasoningSummary: 'auto' }\n * ```\n */\n reasoning?: boolean | ReasoningConfig\n streamOutput?: boolean\n /** Tools configuration - supports saved tools (toolIds) and inline runtime tools */\n tools?: ToolsConfig\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | PromptErrorHandling\n enabled?: boolean\n}\n\nexport interface FetchUrlStepConfig {\n name: string\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n headers?: Record<string, string>\n body?: string\n responseType?: 'json' | 'text' | 'xml'\n markdownIfAvailable?: boolean\n outputVariable?: string\n fetchMethod?: 'http' | 'firecrawl'\n firecrawl?: {\n formats?: string[]\n [key: string]: any\n }\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface TransformDataStepConfig {\n name: string\n script: string\n outputVariable?: string\n sandboxProvider?: 'quickjs' | 'daytona' | 'cloudflare-worker'\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SetVariableStepConfig {\n name: string\n variableName: string\n value: string | number | boolean | object\n enabled?: boolean\n}\n\nexport interface ConditionalStepConfig {\n name: string\n condition: string\n trueSteps?: any[]\n falseSteps?: any[]\n enabled?: boolean\n}\n\nexport interface SearchStepConfig {\n name: string\n provider: string\n query: string\n maxResults?: number\n outputVariable?: string\n returnCitations?: boolean\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendEmailStepConfig {\n name: string\n to: string\n from?: string\n subject: string\n html: string\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendStreamStepConfig {\n name: string\n message: string\n enabled?: boolean\n}\n\nexport interface RetrieveRecordStepConfig {\n name: string\n recordType?: string\n recordName?: string\n fieldsToInclude?: string[]\n fieldsToExclude?: string[]\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface UpsertRecordStepConfig {\n name: string\n recordType: string\n recordName?: string\n sourceVariable?: string\n mergeStrategy?: 'merge' | 'replace'\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface VectorSearchStepConfig {\n name: string\n query: string\n recordType?: string\n embeddingModel?: string\n limit?: number\n threshold?: number\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface GenerateEmbeddingStepConfig {\n name: string\n text: string\n embeddingModel?: string\n maxLength?: number\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface WaitUntilStepConfig {\n name: string\n delayMs?: number\n continueOnTimeout?: boolean\n poll?: {\n enabled: boolean\n intervalMs?: number\n maxAttempts?: number\n condition?: string\n }\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendEventStepConfig {\n name: string\n provider: string\n eventName: string\n properties?: Record<string, any>\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface SendTextStepConfig {\n name: string\n to: string\n from?: string\n message: string\n outputVariable?: string\n /** Error handling configuration - supports simple mode or fallback chains */\n errorHandling?: ErrorHandlingMode | ContextErrorHandling\n streamOutput?: boolean\n enabled?: boolean\n}\n\nexport interface FetchGitHubStepConfig {\n name: string\n repository: string\n branch?: string\n path?: string\n outputVariable?: string\n streamOutput?: boolean\n enabled?: boolean\n}\n\n// ============================================================================\n// Flow Builder Configuration Interfaces\n// ============================================================================\n\nexport interface FlowConfig {\n name: string\n description?: string\n}\n\n/**\n * Configuration for upsert flow - includes flow name and upsert behavior options\n */\nexport interface UpsertFlowConfig extends FlowConfig {\n /** Whether to create a version snapshot before updating (default: true) */\n createVersionOnChange?: boolean\n /** Allow overwriting changes made via dashboard/API (default: false) */\n allowOverwriteExternalChanges?: boolean\n}\n\nexport interface RecordConfig {\n id?: number | string\n name?: string\n type?: string\n metadata?: Record<string, any>\n}\n\n/**\n * Options for upsert mode - controls conflict detection and versioning\n */\nexport interface UpsertOptions {\n /** Whether to create a version snapshot before updating (default: true) */\n createVersionOnChange?: boolean\n /** Allow overwriting changes made via dashboard/API (default: false) */\n allowOverwriteExternalChanges?: boolean\n}\n\nexport interface DispatchOptions {\n streamResponse?: boolean\n modelOverride?: string\n recordMode?: 'existing' | 'create' | 'virtual'\n flowMode?: 'existing' | 'create' | 'virtual' | 'upsert'\n storeResults?: boolean\n autoAppendMetadata?: boolean\n debugMode?: boolean\n createVersion?: boolean\n versionType?: 'published' | 'draft' | 'test' | 'virtual'\n versionLabel?: string\n versionNotes?: string\n flowVersionId?: string\n /** Options for upsert mode (only used when flowMode is 'upsert') */\n upsertOptions?: UpsertOptions\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant'\n content: MessageContent\n}\n\n// ============================================================================\n// Streaming Event Types (matching API SSE events)\n// ============================================================================\n\nexport interface FlowPausedEvent {\n type: 'flow_await'\n executionId: string\n flowId: string\n toolId: string\n toolName: string\n awaitedAt: string\n}\n\nexport interface StepWaitingLocalEvent {\n type: 'step_await'\n id: string\n name: string\n index: number\n stepType: string\n toolId: string\n toolName: string\n executionId: string\n parameters: any\n}\n\n// ============================================================================\n// Fallback Event Types (for error handling fallback chains)\n// ============================================================================\n\n/**\n * Emitted when a fallback chain starts execution\n */\nexport interface FallbacksInitiatedEvent {\n type: 'fallbacks_initiated'\n id: string\n totalFallbacks: number\n originalError: string\n timestamp: string\n}\n\n/**\n * Emitted when a fallback attempt starts\n */\nexport interface FallbackStartEvent {\n type: 'fallback_start'\n id: string\n attempt: number\n fallbackType: string\n timestamp: string\n}\n\n/**\n * Emitted when a fallback attempt succeeds\n */\nexport interface FallbackSuccessEvent {\n type: 'fallback_success'\n id: string\n attempt: number\n fallbackType: string\n timestamp: string\n}\n\n/**\n * Emitted when a fallback attempt fails\n */\nexport interface FallbackFailEvent {\n type: 'fallback_fail'\n id: string\n attempt: number\n fallbackType: string\n error: string\n timestamp: string\n}\n\n/**\n * Emitted when all fallbacks in the chain have been exhausted\n */\nexport interface FallbacksExhaustedEvent {\n type: 'fallbacks_exhausted'\n id: string\n totalAttempts: number\n finalError: string\n timestamp: string\n}\n\nexport interface FlowStartEvent {\n type: 'flow_start'\n flowId: string\n flowName: string\n totalSteps: number\n}\n\nexport interface StepStartEvent {\n type: 'step_start'\n id: string\n name: string\n index: number\n stepType: string\n}\n\nexport interface StepDeltaEvent {\n type: 'step_delta'\n id: string\n chunk: string\n index: number\n}\n\n/** @deprecated Use StepDeltaEvent instead */\nexport type StepChunkEvent = StepDeltaEvent\n\nexport interface StepCompleteEvent {\n type: 'step_complete'\n id: string\n name: string\n index: number\n stepType: string\n /** Step result - used by all step types */\n result?: any\n executionTime: number\n}\n\nexport interface FlowCompleteEvent {\n type: 'flow_complete'\n flowId: string\n totalSteps: number\n successfulSteps: number\n failedSteps: number\n executionTime: number\n}\n\nexport interface FlowErrorEvent {\n type: 'flow_error'\n error: string\n stepId?: string\n}\n\n/**\n * Union type of all possible SSE events\n */\nexport type StreamEvent =\n | FlowStartEvent\n | StepStartEvent\n | StepDeltaEvent\n | StepCompleteEvent\n | FlowCompleteEvent\n | FlowErrorEvent\n | FlowPausedEvent\n | StepWaitingLocalEvent\n | FallbacksInitiatedEvent\n | FallbackStartEvent\n | FallbackSuccessEvent\n | FallbackFailEvent\n | FallbacksExhaustedEvent\n\n/**\n * Callbacks for streaming flow execution\n *\n * @example\n * ```typescript\n * await flow.run(apiClient, options, {\n * onStepStart: (event) => console.log('Starting:', event.name),\n * onStepDelta: (chunk, event) => process.stdout.write(chunk),\n * onStepComplete: (result, event) => console.log('Done:', event.name),\n * onFlowComplete: (event) => console.log('Flow complete'),\n * onError: (error) => console.error(error),\n * })\n * ```\n */\nexport interface StreamCallbacks {\n /** Called when flow execution starts */\n onFlowStart?: (event: FlowStartEvent) => void\n /** Called when a step starts executing */\n onStepStart?: (event: StepStartEvent) => void\n /** Called for each chunk of streaming output from a step */\n onStepDelta?: (chunk: string, event: StepDeltaEvent) => void\n /**\n * @deprecated Use onStepDelta instead\n * Called for each chunk of streaming output from a step\n */\n onStepChunk?: (chunk: string, event: StepDeltaEvent) => void\n /** Called when a step completes */\n onStepComplete?: (result: any, event: StepCompleteEvent) => void\n /** Called when the entire flow completes */\n onFlowComplete?: (event: FlowCompleteEvent) => void\n /** Called when an error occurs */\n onError?: (error: Error) => void\n}\n\n/**\n * Summary returned after flow execution completes\n */\nexport interface FlowSummary {\n flowId: string\n flowName: string\n totalSteps: number\n successfulSteps: number\n failedSteps: number\n executionTime: number\n /** Results from each step, keyed by step name */\n results: Map<string, any>\n /** Whether the flow completed successfully */\n success: boolean\n}\n\n// ============================================================================\n// Internal Step Type\n// ============================================================================\n\ninterface FlowStep {\n id: string\n type: string\n name: string\n order: number\n enabled: boolean\n config: Record<string, any>\n}\n\n// ============================================================================\n// FlowBuilder Class\n// ============================================================================\n\nexport class FlowBuilder {\n private flowConfig: FlowConfig = { name: 'Untitled Flow' }\n private steps: FlowStep[] = []\n private recordConfig: RecordConfig | undefined\n private messagesConfig: Message[] | undefined\n private inputsConfig: Record<string, unknown> | undefined\n private optionsConfig: DispatchOptions = {}\n private stepCounter = 0\n private existingFlowId: string | undefined\n\n /**\n * Initialize the flow with a name and optional description.\n * Use this for virtual/one-off flows or when specifying flowMode in run().\n */\n createFlow(config: FlowConfig): this {\n this.flowConfig = config\n this.existingFlowId = undefined // Clear any existing flow reference\n return this\n }\n\n /**\n * Define a flow for upsert - creates if it doesn't exist, updates if steps changed.\n * This is the recommended pattern for code-first flow management.\n *\n * @example\n * ```typescript\n * const result = await new FlowBuilder()\n * .upsertFlow({\n * name: 'My Flow',\n * createVersionOnChange: true\n * })\n * .prompt({ name: 'Analyze', model: 'gpt-4o', userPrompt: '...' })\n * .run(apiClient, { streamResponse: true })\n * ```\n */\n upsertFlow(config: UpsertFlowConfig): this {\n const { createVersionOnChange, allowOverwriteExternalChanges, ...flowConfig } = config\n this.flowConfig = flowConfig\n this.existingFlowId = undefined // Clear any existing flow reference\n\n // Auto-set upsert mode and options\n this.optionsConfig = {\n ...this.optionsConfig,\n flowMode: 'upsert',\n upsertOptions: {\n createVersionOnChange: createVersionOnChange ?? true,\n ...(allowOverwriteExternalChanges !== undefined && { allowOverwriteExternalChanges }),\n },\n }\n return this\n }\n\n /**\n * Use an existing flow by ID instead of defining steps inline\n *\n * @example\n * ```typescript\n * const result = await new FlowBuilder()\n * .useExistingFlow('flow_abc123')\n * .withRecord({ name: 'Test', type: 'data' })\n * .run(apiClient, { streamResponse: true })\n * ```\n */\n useExistingFlow(flowId: string): this {\n this.existingFlowId = flowId\n this.steps = [] // Clear any inline steps\n return this\n }\n\n /**\n * Set the record configuration\n */\n withRecord(config: RecordConfig): this {\n this.recordConfig = config\n return this\n }\n\n /**\n * Set conversation messages\n */\n withMessages(messages: Message[]): this {\n this.messagesConfig = messages\n return this\n }\n\n /**\n * Set top-level input variables accessible as {{varName}} in templates\n *\n * @example\n * ```typescript\n * const result = await new FlowBuilder()\n * .useExistingFlow('flow_abc123')\n * .withInputs({\n * customerName: 'John',\n * topic: 'billing'\n * })\n * .run(apiClient, { streamResponse: true })\n * ```\n */\n withInputs(inputs: Record<string, unknown>): this {\n this.inputsConfig = inputs\n return this\n }\n\n /**\n * Set dispatch options\n */\n withOptions(options: DispatchOptions): this {\n this.optionsConfig = { ...this.optionsConfig, ...options }\n return this\n }\n\n // ============================================================================\n // Step Methods\n // ============================================================================\n\n /**\n * Add a prompt step\n */\n prompt(config: PromptStepConfig): this {\n this.addStep(\n 'prompt',\n config.name,\n {\n model: config.model,\n userPrompt: config.userPrompt,\n text: config.userPrompt, // backward compat\n systemPrompt: config.systemPrompt,\n previousMessages: config.previousMessages,\n outputVariable: config.outputVariable,\n responseFormat: config.responseFormat,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n reasoning: config.reasoning,\n streamOutput: config.streamOutput,\n tools: config.tools,\n errorHandling: config.errorHandling,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a fetch URL step\n */\n fetchUrl(config: FetchUrlStepConfig): this {\n this.addStep(\n 'fetch-url',\n config.name,\n {\n http: {\n url: config.url,\n method: config.method || 'GET',\n headers: config.headers,\n body: config.body,\n },\n responseType: config.responseType,\n markdownIfAvailable: config.markdownIfAvailable,\n fetchMethod: config.fetchMethod,\n firecrawl: config.firecrawl,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a transform data step\n */\n transformData(config: TransformDataStepConfig): this {\n this.addStep(\n 'transform-data',\n config.name,\n {\n script: config.script,\n outputVariable: config.outputVariable,\n sandboxProvider: config.sandboxProvider,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a set variable step\n */\n setVariable(config: SetVariableStepConfig): this {\n this.addStep(\n 'set-variable',\n config.name,\n {\n variableName: config.variableName,\n value: config.value,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a conditional step\n */\n conditional(config: ConditionalStepConfig): this {\n this.addStep(\n 'conditional',\n config.name,\n {\n condition: config.condition,\n trueSteps: config.trueSteps || [],\n falseSteps: config.falseSteps || [],\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a search step\n */\n search(config: SearchStepConfig): this {\n this.addStep(\n 'search',\n config.name,\n {\n provider: config.provider,\n query: config.query,\n maxResults: config.maxResults,\n outputVariable: config.outputVariable,\n returnCitations: config.returnCitations,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send email step\n */\n sendEmail(config: SendEmailStepConfig): this {\n this.addStep(\n 'send-email',\n config.name,\n {\n to: config.to,\n from: config.from || '{{_flow.id}}@runtype.email',\n subject: config.subject,\n html: config.html,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send stream step\n */\n sendStream(config: SendStreamStepConfig): this {\n this.addStep(\n 'send-stream',\n config.name,\n {\n message: config.message,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a retrieve record step\n */\n retrieveRecord(config: RetrieveRecordStepConfig): this {\n this.addStep(\n 'retrieve-record',\n config.name,\n {\n recordType: config.recordType,\n recordName: config.recordName,\n fieldsToInclude: config.fieldsToInclude,\n fieldsToExclude: config.fieldsToExclude,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add an upsert record step\n */\n upsertRecord(config: UpsertRecordStepConfig): this {\n this.addStep(\n 'upsert-record',\n config.name,\n {\n recordType: config.recordType,\n recordName: config.recordName,\n sourceVariable: config.sourceVariable,\n mergeStrategy: config.mergeStrategy,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a vector search step\n */\n vectorSearch(config: VectorSearchStepConfig): this {\n this.addStep(\n 'vector-search',\n config.name,\n {\n query: config.query,\n recordType: config.recordType,\n embeddingModel: config.embeddingModel,\n limit: config.limit,\n threshold: config.threshold,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a generate embedding step\n */\n generateEmbedding(config: GenerateEmbeddingStepConfig): this {\n this.addStep(\n 'generate-embedding',\n config.name,\n {\n inputSource: 'text',\n text: config.text,\n embeddingModel: config.embeddingModel,\n maxLength: config.maxLength,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a wait until step\n */\n waitUntil(config: WaitUntilStepConfig): this {\n this.addStep(\n 'wait-until',\n config.name,\n {\n delayMs: config.delayMs,\n continueOnTimeout: config.continueOnTimeout,\n poll: config.poll,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send event step\n */\n sendEvent(config: SendEventStepConfig): this {\n this.addStep(\n 'send-event',\n config.name,\n {\n provider: config.provider,\n eventName: config.eventName,\n properties: config.properties,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a send text step\n */\n sendText(config: SendTextStepConfig): this {\n this.addStep(\n 'send-text',\n config.name,\n {\n to: config.to,\n from: config.from,\n message: config.message,\n outputVariable: config.outputVariable,\n errorHandling: config.errorHandling,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n /**\n * Add a fetch GitHub step\n */\n fetchGitHub(config: FetchGitHubStepConfig): this {\n this.addStep(\n 'fetch-github',\n config.name,\n {\n repository: config.repository,\n branch: config.branch,\n path: config.path,\n outputVariable: config.outputVariable,\n streamOutput: config.streamOutput,\n },\n config.enabled\n )\n return this\n }\n\n // ============================================================================\n // Build Method\n // ============================================================================\n\n /**\n * Build the final dispatch request configuration\n */\n build(): DispatchRequest {\n // Determine the flow configuration\n const flow = this.existingFlowId\n ? { id: this.existingFlowId }\n : { name: this.flowConfig.name, steps: this.steps }\n\n const request: DispatchRequest = { flow }\n\n // Add record config if set\n if (this.recordConfig) {\n request.record = this.recordConfig\n }\n\n // Add messages if set\n if (this.messagesConfig) {\n request.messages = this.messagesConfig\n }\n\n // Add inputs if set\n if (this.inputsConfig) {\n request.inputs = this.inputsConfig\n }\n\n // Add options if any are set\n if (Object.keys(this.optionsConfig).length > 0) {\n request.options = this.optionsConfig\n }\n\n return request\n }\n\n // ============================================================================\n // Execution Methods\n // ============================================================================\n\n /**\n * Build and execute the flow with the provided client\n *\n * Returns a FlowResult that can be used to:\n * - Process with callbacks via `.stream(callbacks)`\n * - Get a specific step result via `.getResult(stepName)`\n * - Get all results via `.getAllResults()`\n * - Access raw response via `.raw`\n *\n * @param client - Client with dispatch capability\n * @param options - Optional execution options (merged with any .withOptions() settings)\n * @returns FlowResult for processing the streaming response\n *\n * @example\n * ```typescript\n * // Simple execution with result extraction\n * const result = await flow.run(apiClient, { streamResponse: true })\n * const analysis = await result.getResult('Analyze Data')\n *\n * // With streaming callbacks\n * const result = await flow.run(apiClient, options)\n * await result.stream({\n * onStepDelta: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: () => console.log('Done!'),\n * })\n * ```\n */\n async run(client: DispatchClient, options?: DispatchOptions): Promise<FlowResult>\n\n /**\n * Build and execute the flow with callbacks for streaming events\n *\n * @param client - Client with dispatch capability\n * @param options - Execution options (merged with any .withOptions() settings)\n * @param callbacks - Callbacks for streaming events\n * @returns FlowSummary when execution completes\n *\n * @example\n * ```typescript\n * const summary = await flow.run(apiClient, options, {\n * onStepStart: (event) => console.log('Starting:', event.name),\n * onStepDelta: (chunk) => process.stdout.write(chunk),\n * onStepComplete: (result, event) => console.log('Done:', event.name),\n * onFlowComplete: (event) => console.log('Flow complete!'),\n * })\n * ```\n */\n async run(\n client: DispatchClient,\n options: DispatchOptions,\n callbacks: StreamCallbacks\n ): Promise<FlowSummary>\n\n async run(\n client: DispatchClient,\n options?: DispatchOptions,\n callbacks?: StreamCallbacks\n ): Promise<FlowResult | FlowSummary> {\n const config = this.build()\n // Merge run options with builder options (run options take precedence)\n if (options) {\n config.options = { ...config.options, ...options }\n }\n\n const response = await client.dispatch(config)\n\n // If callbacks provided, process stream immediately\n if (callbacks) {\n return processStream(response, callbacks)\n }\n\n // Otherwise return FlowResult for later processing\n return new FlowResult(response)\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private addStep(\n type: string,\n name: string,\n config: Record<string, any>,\n enabled: boolean = true\n ): void {\n this.stepCounter++\n\n // Clean undefined values from config\n const cleanConfig: Record<string, any> = {}\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n cleanConfig[key] = value\n }\n }\n\n this.steps.push({\n id: `step-${this.stepCounter}`,\n type,\n name,\n order: this.stepCounter,\n enabled,\n config: cleanConfig,\n })\n }\n}\n\n// ============================================================================\n// Client Interface for Execution\n// ============================================================================\n\n/**\n * Interface for clients that can dispatch flows\n */\nexport interface DispatchClient {\n /**\n * Run a flow with local tools (automatic pause/resume loop)\n *\n * @param config - The dispatch request configuration\n * @param localTools - Map of tool names to async functions that execute the tool logic\n * @param callbacks - Optional callbacks for streaming events\n * @returns The final result of the flow execution or summary if streaming\n */\n runWithLocalTools(\n config: DispatchRequest,\n localTools: Record<string, (args: any) => Promise<any>>,\n callbacks?: StreamCallbacks\n ): Promise<FlowResult | FlowSummary>\n\n dispatch(config: DispatchRequest): Promise<Response>\n}\n\n// ============================================================================\n// ClientFlowBuilder - FlowBuilder bound to a client\n// ============================================================================\n\n/**\n * FlowBuilder that is bound to a client for direct execution\n *\n * @example\n * ```typescript\n * // Via RuntypeClient.flow()\n * const result = await runtype\n * .flow('My Flow')\n * .fetchUrl({ name: 'Fetch', url: '...', outputVariable: 'data' })\n * .prompt({ name: 'Process', model: 'gpt-4', userPrompt: '...' })\n * .run({ streamResponse: true })\n *\n * const data = await result.getResult('Process')\n * ```\n */\nexport class ClientFlowBuilder extends FlowBuilder {\n private boundClient: DispatchClient\n\n constructor(client: DispatchClient, name: string) {\n super()\n this.boundClient = client\n this.createFlow({ name })\n }\n\n /**\n * Build and execute the flow using the bound client\n *\n * For ClientFlowBuilder, you can either:\n * 1. Pass a client (which is ignored, the bound client is used)\n * 2. Pass options directly as the first argument\n *\n * @example\n * ```typescript\n * // Simple execution (no args needed)\n * const result = await builder.run()\n * const data = await result.getResult('Process')\n *\n * // With options only\n * const result = await builder.run({ streamResponse: true, flowMode: 'virtual' })\n *\n * // With options and callbacks\n * const summary = await builder.run({ streamResponse: true }, {\n * onStepDelta: (chunk) => process.stdout.write(chunk),\n * onFlowComplete: () => console.log('Done!'),\n * })\n *\n * // Parent class signature (client ignored)\n * const result = await builder.run(someClient, { streamResponse: true })\n * ```\n */\n // Overload: No arguments\n run(): Promise<FlowResult>\n // Overload: Options only\n run(options: DispatchOptions): Promise<FlowResult>\n // Overload: Options with callbacks\n run(options: DispatchOptions, callbacks: StreamCallbacks): Promise<FlowSummary>\n // Overload: With local tools\n run(localTools: Record<string, (args: any) => Promise<any>>): Promise<FlowResult>\n run(\n options: DispatchOptions,\n localTools: Record<string, (args: any) => Promise<any>>\n ): Promise<FlowResult>\n // Overload: With local tools AND streaming\n run(\n localTools: Record<string, (args: any) => Promise<any>>,\n callbacks: StreamCallbacks\n ): Promise<FlowSummary>\n run(\n options: DispatchOptions,\n localTools: Record<string, (args: any) => Promise<any>>,\n callbacks: StreamCallbacks\n ): Promise<FlowSummary>\n // Overload: Parent class signature (client, options)\n run(client: DispatchClient, options?: DispatchOptions): Promise<FlowResult>\n // Overload: Parent class signature (client, options, callbacks)\n run(\n client: DispatchClient,\n options: DispatchOptions,\n callbacks: StreamCallbacks\n ): Promise<FlowSummary>\n\n async run(\n arg1?: DispatchClient | DispatchOptions | Record<string, (args: any) => Promise<any>>,\n arg2?: DispatchOptions | StreamCallbacks | Record<string, (args: any) => Promise<any>>,\n arg3?: StreamCallbacks | Record<string, (args: any) => Promise<any>>,\n arg4?: StreamCallbacks\n ): Promise<FlowResult | FlowSummary> {\n const config = this.build()\n\n // Determine arguments\n let runOptions: DispatchOptions | undefined\n let runCallbacks: StreamCallbacks | undefined\n let localTools: Record<string, (args: any) => Promise<any>> | undefined\n let dispatchClient = this.boundClient\n\n // Helper to check if object is local tools map (not options or callbacks)\n const isLocalTools = (obj: any) =>\n obj &&\n typeof obj === 'object' &&\n !isStreamCallbacks(obj) &&\n !('streamResponse' in obj) && // Not options\n !('dispatch' in obj) // Not client\n\n // Parse arguments based on types\n if (arg1) {\n if (typeof arg1 === 'object' && 'dispatch' in arg1) {\n // arg1 is client (ignored)\n if (arg2) {\n if (isStreamCallbacks(arg2)) {\n runCallbacks = arg2\n } else {\n runOptions = arg2 as DispatchOptions\n if (arg3 && isStreamCallbacks(arg3)) {\n runCallbacks = arg3 as StreamCallbacks\n }\n }\n }\n } else if (isLocalTools(arg1)) {\n // arg1 is local tools\n localTools = arg1 as Record<string, (args: any) => Promise<any>>\n if (arg2 && isStreamCallbacks(arg2)) {\n runCallbacks = arg2 as StreamCallbacks\n }\n } else {\n // arg1 is options\n runOptions = arg1 as DispatchOptions\n if (arg2) {\n if (isLocalTools(arg2)) {\n localTools = arg2 as Record<string, (args: any) => Promise<any>>\n if (arg3 && isStreamCallbacks(arg3)) {\n runCallbacks = arg3 as StreamCallbacks\n }\n } else if (isStreamCallbacks(arg2)) {\n runCallbacks = arg2 as StreamCallbacks\n }\n }\n }\n }\n\n // Merge run options with builder options\n if (runOptions) {\n config.options = { ...config.options, ...runOptions }\n }\n\n // Execute with local tools if provided\n if (localTools) {\n // Cast boundClient to RuntypeClient to access runWithLocalTools\n // This assumes boundClient is a RuntypeClient which has the new method\n if ('runWithLocalTools' in dispatchClient) {\n // If callbacks are provided, use streaming mode, otherwise use standard mode\n // runWithLocalTools handles both depending on args\n if (runCallbacks) {\n return (dispatchClient as any).runWithLocalTools(config, localTools, runCallbacks)\n }\n return (dispatchClient as any).runWithLocalTools(config, localTools)\n } else {\n throw new Error('Client does not support local tools execution')\n }\n }\n\n const response = await dispatchClient.dispatch(config)\n\n // If callbacks provided, process stream immediately\n if (runCallbacks) {\n return processStream(response, runCallbacks)\n }\n\n // Otherwise return FlowResult for later processing\n return new FlowResult(response)\n }\n}\n\n/**\n * Type guard to check if an object is StreamCallbacks\n */\nfunction isStreamCallbacks(obj: any): obj is StreamCallbacks {\n if (!obj || typeof obj !== 'object') return false\n // Check for any of the callback properties\n return (\n 'onFlowStart' in obj ||\n 'onStepStart' in obj ||\n 'onStepDelta' in obj ||\n 'onStepChunk' in obj ||\n 'onStepComplete' in obj ||\n 'onFlowComplete' in obj ||\n 'onError' in obj\n )\n}\n\n// ============================================================================\n// Runtime Tool Helpers\n// ============================================================================\n\n/**\n * Create an external runtime tool definition.\n *\n * External tools make HTTP requests to external APIs with support for\n * variable substitution in URLs and headers.\n *\n * Special internal variables are available for auth:\n * - `{{_internal.auth_token}}` - Bearer token for Runtype API auth\n * - `{{_internal.user_id}}` - Current user ID\n * - `{{_internal.org_id}}` - Current organization ID\n *\n * @example\n * ```typescript\n * const listFlowsTool = createExternalTool({\n * name: 'list_flows',\n * description: 'List all flows in the workspace',\n * parametersSchema: {\n * type: 'object',\n * properties: {\n * limit: { type: 'number', description: 'Max results', default: 20 }\n * }\n * },\n * url: 'https://api.runtype.com/v1/flows',\n * method: 'GET',\n * headers: { Authorization: '{{_internal.auth_token}}' }\n * })\n * ```\n */\nexport function createExternalTool(config: {\n name: string\n description: string\n parametersSchema: any\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE'\n headers?: Record<string, string>\n}): RuntimeTool {\n return {\n name: config.name,\n description: config.description,\n toolType: 'external',\n parametersSchema: config.parametersSchema,\n config: {\n url: config.url,\n method: config.method || 'POST',\n headers: config.headers,\n } as RuntimeExternalToolConfig,\n }\n}\n","/**\n * @layer sdk\n * @case camelCase (SDK and API both use native camelCase - no conversion needed)\n *\n * Main Runtype API Client.\n *\n * The SDK and API both use native camelCase for all request/response bodies.\n * No case transformation is performed.\n *\n * @see packages/client/src/transform.ts for pass-through utilities\n */\n\nimport type { ClientConfig, DispatchRequest } from './types'\nimport { transformRequest, transformResponse, transformQueryParams } from './transform'\nimport {\n FlowsEndpoint,\n PromptsEndpoint,\n RecordsEndpoint,\n ApiKeysEndpoint,\n ModelConfigsEndpoint,\n DispatchEndpoint,\n ChatEndpoint,\n UsersEndpoint,\n AnalyticsEndpoint,\n FlowStepsEndpoint,\n ContextTemplatesEndpoint,\n ToolsEndpoint,\n EvalEndpoint,\n ClientTokensEndpoint,\n AgentsEndpoint,\n type ApiClient,\n} from './endpoints'\nimport {\n ClientFlowBuilder,\n StreamCallbacks,\n FlowSummary,\n StepDeltaEvent,\n FlowPausedEvent,\n StepWaitingLocalEvent,\n} from './flow-builder'\nimport { FlowResult } from './flow-result'\n\ntype LocalToolHandler = (args: unknown) => Promise<unknown>\n\ninterface LocalToolPausedState {\n toolName: string\n executionId: string\n parameters?: unknown\n}\n\ninterface PausedLocalActionResult {\n status: 'paused'\n pausedReason?: {\n type: 'local_action'\n toolName: string\n executionId: string\n parameters?: unknown\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isPausedLocalActionResult(value: unknown): value is PausedLocalActionResult {\n if (!isObjectRecord(value) || value.status !== 'paused') {\n return false\n }\n\n const { pausedReason } = value\n return (\n pausedReason === undefined ||\n (isObjectRecord(pausedReason) &&\n pausedReason.type === 'local_action' &&\n typeof pausedReason.toolName === 'string' &&\n typeof pausedReason.executionId === 'string')\n )\n}\n\n/**\n * RuntypeClient - The main entry point for interacting with the Runtype API\n *\n * Automatically transforms field names between camelCase (client) and snake_case (API)\n * to provide an idiomatic JavaScript/TypeScript experience while maintaining API consistency.\n */\nexport class RuntypeClient implements ApiClient {\n private baseUrl: string\n private apiVersion: string\n private timeout: number\n private headers: Record<string, string>\n\n // Endpoint handlers\n public flows: FlowsEndpoint\n public prompts: PromptsEndpoint\n public records: RecordsEndpoint\n public apiKeys: ApiKeysEndpoint\n public modelConfigs: ModelConfigsEndpoint\n public dispatch: DispatchEndpoint\n public chat: ChatEndpoint\n public users: UsersEndpoint\n public analytics: AnalyticsEndpoint\n public flowSteps: FlowStepsEndpoint\n public contextTemplates: ContextTemplatesEndpoint\n public tools: ToolsEndpoint\n public eval: EvalEndpoint\n public clientTokens: ClientTokensEndpoint\n public agents: AgentsEndpoint\n\n constructor(config: ClientConfig = {}) {\n const baseUrl = config.baseUrl || 'https://api.runtype.com'\n this.apiVersion = config.apiVersion || 'v1'\n // Construct versioned base URL (api.runtype.com/v1)\n this.baseUrl = this.apiVersion ? `${baseUrl}/${this.apiVersion}` : baseUrl\n this.timeout = config.timeout || 30000\n this.headers = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n }\n\n // Set API key if provided\n if (config.apiKey) {\n this.headers.Authorization = `Bearer ${config.apiKey}`\n }\n\n // Initialize endpoint handlers\n this.flows = new FlowsEndpoint(this)\n this.prompts = new PromptsEndpoint(this)\n this.records = new RecordsEndpoint(this)\n this.apiKeys = new ApiKeysEndpoint(this)\n this.modelConfigs = new ModelConfigsEndpoint(this)\n this.dispatch = new DispatchEndpoint(this)\n this.chat = new ChatEndpoint(this)\n this.users = new UsersEndpoint(this)\n this.analytics = new AnalyticsEndpoint(this)\n this.flowSteps = new FlowStepsEndpoint(this)\n this.contextTemplates = new ContextTemplatesEndpoint(this)\n this.tools = new ToolsEndpoint(this)\n this.eval = new EvalEndpoint(this)\n this.clientTokens = new ClientTokensEndpoint(this)\n this.agents = new AgentsEndpoint(this)\n }\n\n /**\n * Set the API key for authentication\n */\n setApiKey(apiKey: string): void {\n this.headers.Authorization = `Bearer ${apiKey}`\n }\n\n /**\n * Start building a flow with fluent API\n *\n * @example\n * ```typescript\n * const response = await runtype\n * .flow('My Flow')\n * .withRecord({ name: 'Test', type: 'data' })\n * .fetchUrl({ name: 'Fetch', url: '...', outputVariable: 'data' })\n * .prompt({ name: 'Process', model: 'gpt-4', userPrompt: '...' })\n * .run()\n * ```\n */\n flow(name: string): ClientFlowBuilder {\n return new ClientFlowBuilder(\n {\n dispatch: (config) => this.dispatch.executeStream(config),\n runWithLocalTools: (config, tools) => this.runWithLocalTools(config, tools),\n },\n name\n )\n }\n\n /**\n * Remove the API key\n */\n clearApiKey(): void {\n delete this.headers.Authorization\n }\n\n /**\n * Run a flow with client-side tools (automatic pause/resume loop)\n *\n * @param request - The dispatch request configuration\n * @param clientTools - Map of tool names to async functions that execute the tool logic\n * @param callbacks - Optional callbacks for streaming events\n * @returns The final result of the flow execution or summary if streaming\n */\n async runWithLocalTools(\n request: DispatchRequest,\n localTools: Record<string, LocalToolHandler>,\n callbacks?: StreamCallbacks\n ): Promise<FlowResult | FlowSummary> {\n // If callbacks are provided, use streaming mode\n // If not, force non-streaming for JSON state machine\n const isStreaming = !!callbacks\n\n const modifiedRequest = {\n ...request,\n options: {\n ...(request.options || {}),\n streamResponse: isStreaming,\n },\n }\n\n const processStep = async (response: Response): Promise<{ done: boolean; result: unknown }> => {\n if (isStreaming) {\n // Stream processing\n let pausedState: LocalToolPausedState | null = null\n\n // Wrap user callbacks to intercept paused event\n const wrappedCallbacks: StreamCallbacks = {\n ...callbacks,\n onFlowStart: (event) => callbacks?.onFlowStart?.(event),\n onStepStart: (event) => callbacks?.onStepStart?.(event),\n onStepChunk: (chunk, event) => callbacks?.onStepChunk?.(chunk, event),\n onStepComplete: (result, event) => callbacks?.onStepComplete?.(result, event),\n onFlowComplete: (event) => callbacks?.onFlowComplete?.(event),\n onError: (error) => callbacks?.onError?.(error),\n }\n\n const { streamEvents } = await import('./stream-utils')\n\n const summary: Partial<FlowSummary> = {\n results: new Map(),\n success: true,\n }\n\n try {\n for await (const event of streamEvents(response)) {\n if (event.type === 'flow_await') {\n // API sends: executionId, flowId, toolId, toolName.\n // Parameters are sent in step_await event just before this\n const pausedEvent: FlowPausedEvent = event\n pausedState = {\n ...(pausedState ?? {}),\n toolName: pausedEvent.toolName,\n executionId: pausedEvent.executionId,\n }\n }\n\n if (event.type === 'step_await') {\n // Capture parameters\n const pausedEvent: StepWaitingLocalEvent = event\n pausedState = {\n toolName: pausedEvent.toolName,\n parameters: pausedEvent.parameters,\n executionId: pausedEvent.executionId,\n }\n }\n\n // Handle standard events via callbacks\n switch (event.type) {\n case 'flow_start':\n wrappedCallbacks.onFlowStart?.(event)\n break\n case 'step_start':\n wrappedCallbacks.onStepStart?.(event)\n break\n case 'step_delta': {\n // Normalize API's 'text' field to 'chunk' for consistency\n const deltaEvent = event as StepDeltaEvent & { text?: string }\n const chunkText = deltaEvent.chunk || deltaEvent.text || ''\n wrappedCallbacks.onStepChunk?.(chunkText, deltaEvent)\n break\n }\n case 'step_complete': {\n summary.results?.set(event.name, event.result)\n wrappedCallbacks.onStepComplete?.(event.result, event)\n break\n }\n case 'flow_complete':\n wrappedCallbacks.onFlowComplete?.(event)\n break\n case 'flow_error':\n wrappedCallbacks.onError?.(new Error(event.error))\n break\n }\n }\n } catch (e) {\n wrappedCallbacks.onError?.(e instanceof Error ? e : new Error(String(e)))\n throw e\n }\n\n if (pausedState) {\n return {\n done: false,\n result: { status: 'paused', pausedReason: { type: 'local_action', ...pausedState } },\n }\n }\n\n return { done: true, result: summary as FlowSummary }\n } else {\n // Non-streaming (JSON)\n const data = await response.json()\n return {\n done: data.status !== 'paused',\n result: data,\n }\n }\n }\n\n // Initial dispatch\n let currentResponse: Response\n if (isStreaming) {\n currentResponse = await this.dispatch.executeStream(modifiedRequest)\n } else {\n const data = await this.dispatch.execute(modifiedRequest)\n currentResponse = new Response(JSON.stringify(data), {\n headers: { 'content-type': 'application/json' },\n })\n }\n\n // Loop\n while (true) {\n const { done, result } = await processStep(currentResponse)\n\n if (done) {\n if (isStreaming) return result as FlowSummary\n return new FlowResult(\n new Response(JSON.stringify(result), { headers: { 'content-type': 'application/json' } })\n )\n }\n\n // Handle Pause\n if (isPausedLocalActionResult(result) && result.pausedReason?.type === 'local_action') {\n const { toolName, parameters, executionId } = result.pausedReason\n\n if (!localTools[toolName]) {\n throw new Error(`Local tool \"${toolName}\" required but not provided in localTools map`)\n }\n\n try {\n // Execute local tool logic\n const toolResult = await localTools[toolName](parameters)\n\n // Resume flow execution\n const resumeData = {\n executionId: executionId,\n toolOutputs: { [toolName]: toolResult },\n streamResponse: isStreaming,\n }\n\n if (isStreaming) {\n currentResponse = (await this.dispatch.resume(resumeData)) as Response\n } else {\n const data = await this.dispatch.resume(resumeData)\n currentResponse = new Response(JSON.stringify(data), {\n headers: { 'content-type': 'application/json' },\n })\n }\n } catch (error) {\n throw new Error(\n `Error executing local tool \"${toolName}\": ${error instanceof Error ? error.message : String(error)}`\n )\n }\n } else {\n // Should not happen if done=false\n break\n }\n }\n\n throw new Error('Unexpected end of flow execution loop')\n }\n\n /**\n * Generic GET request\n */\n async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n const url = this.buildUrl(path, params)\n const response = await this.makeRequest(url, {\n method: 'GET',\n headers: this.headers,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Generic POST request\n */\n async post<T>(path: string, data?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'POST',\n headers: this.headers,\n body: data ? JSON.stringify(transformRequest(data)) : undefined,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * POST request with FormData support for file uploads\n */\n async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const url = this.buildUrl(path)\n const headers = { ...this.headers }\n // Remove Content-Type to let browser set multipart boundary\n delete headers['Content-Type']\n\n const response = await this.makeRequest(url, {\n method: 'POST',\n headers,\n body: formData,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Generic request that returns raw Response for streaming\n */\n async requestStream(path: string, options: RequestInit = {}): Promise<Response> {\n const url = this.buildUrl(path)\n const headers = {\n ...this.headers,\n ...(options.headers as Record<string, string>),\n }\n\n // Transform request body if it's JSON\n let body = options.body\n if (body && typeof body === 'string' && headers['Content-Type']?.includes('application/json')) {\n try {\n const parsed = JSON.parse(body)\n body = JSON.stringify(transformRequest(parsed))\n } catch {\n // If parsing fails, use original body\n }\n }\n\n return this.makeRawRequest(url, {\n ...options,\n headers,\n body,\n })\n }\n\n /**\n * Generic PUT request\n */\n async put<T>(path: string, data?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'PUT',\n headers: this.headers,\n body: data ? JSON.stringify(transformRequest(data)) : undefined,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Generic PATCH request\n */\n async patch<T>(path: string, data?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'PATCH',\n headers: this.headers,\n body: data ? JSON.stringify(transformRequest(data)) : undefined,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Generic DELETE request\n */\n async delete<T>(path: string, data?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n const response = await this.makeRequest(url, {\n method: 'DELETE',\n headers: this.headers,\n body: data ? JSON.stringify(transformRequest(data)) : undefined,\n })\n return transformResponse<T>(response)\n }\n\n /**\n * Build full URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n // Ensure versioned base URL is treated as a directory by URL()\n const base = this.baseUrl.endsWith('/') ? this.baseUrl : `${this.baseUrl}/`\n // Avoid leading slash in path which would reset to origin root\n const relPath = path.startsWith('/') ? path.slice(1) : path\n const url = new URL(relPath, base)\n\n if (params) {\n const transformedParams = transformQueryParams(params)\n Object.entries(transformedParams).forEach(([key, value]: [string, string]) => {\n url.searchParams.set(key, value)\n })\n }\n\n return url.toString()\n }\n\n /**\n * Make HTTP request with timeout and error handling\n */\n private async makeRequest(url: string, options: RequestInit): Promise<unknown> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n throw await this.createApiError(response)\n }\n\n // Handle empty responses (like 204 No Content)\n if (response.status === 204) {\n return null\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n return response.json()\n }\n\n return response.text()\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`)\n }\n\n throw error\n }\n }\n\n /**\n * Make HTTP request that returns raw Response (for streaming)\n */\n private async makeRawRequest(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n throw await this.createApiError(response)\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`)\n }\n\n throw error\n }\n }\n\n /**\n * Handle error responses\n */\n private async createApiError(response: Response): Promise<RuntypeApiError> {\n let errorData: unknown\n\n try {\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n errorData = await response.json()\n } else {\n errorData = { error: await response.text() }\n }\n } catch {\n errorData = { error: 'Unknown error occurred' }\n }\n\n const message =\n isObjectRecord(errorData) &&\n (typeof errorData.error === 'string' || typeof errorData.message === 'string')\n ? (errorData.error as string | undefined) ||\n (errorData.message as string | undefined) ||\n 'Request failed'\n : 'Request failed'\n\n return new RuntypeApiError(\n message,\n response.status,\n errorData,\n new Headers(response.headers),\n response.statusText\n )\n }\n}\n\n/**\n * Custom error class for Runtype API errors\n */\nexport class RuntypeApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public data?: unknown,\n public headers?: Headers,\n public statusText?: string\n ) {\n super(message)\n this.name = 'RuntypeApiError'\n }\n}\n\n/**\n * Convenience function to create a new RuntypeClient instance\n */\nexport function createClient(config?: ClientConfig): RuntypeClient {\n return new RuntypeClient(config)\n}\n","// ============================================================================\n// Runtype SDK - Public API\n// ============================================================================\n\nexport { Runtype } from './runtype'\nexport type { RuntypeConfig } from './runtype'\n\n// Flows namespace exports\nexport { FlowsNamespace, RuntypeFlowBuilder } from './flows-namespace'\nexport type {\n FlowConfig as RuntypeFlowConfig,\n UpsertFlowConfig as RuntypeUpsertFlowConfig,\n RecordConfig as RuntypeRecordConfig,\n Message as RuntypeMessage,\n PromptStepConfig as RuntypePromptStepConfig,\n FetchUrlStepConfig as RuntypeFetchUrlStepConfig,\n TransformDataStepConfig as RuntypeTransformDataStepConfig,\n SetVariableStepConfig as RuntypeSetVariableStepConfig,\n ConditionalStepConfig as RuntypeConditionalStepConfig,\n SearchStepConfig as RuntypeSearchStepConfig,\n SendEmailStepConfig as RuntypeSendEmailStepConfig,\n SendStreamStepConfig as RuntypeSendStreamStepConfig,\n RetrieveRecordStepConfig as RuntypeRetrieveRecordStepConfig,\n UpsertRecordStepConfig as RuntypeUpsertRecordStepConfig,\n VectorSearchStepConfig as RuntypeVectorSearchStepConfig,\n GenerateEmbeddingStepConfig as RuntypeGenerateEmbeddingStepConfig,\n WaitUntilStepConfig as RuntypeWaitUntilStepConfig,\n SendEventStepConfig as RuntypeSendEventStepConfig,\n SendTextStepConfig as RuntypeSendTextStepConfig,\n FetchGitHubStepConfig as RuntypeFetchGitHubStepConfig,\n} from './flows-namespace'\n\n// Batches namespace exports\nexport { BatchesNamespace } from './batches-namespace'\nexport type { BatchScheduleConfig, BatchStatus, BatchListParams } from './batches-namespace'\n\n// Evals namespace exports\nexport { EvalsNamespace, EvalRunner } from './evals-namespace'\nexport type {\n ModelOverride as RuntypeModelOverride,\n EvalRunConfig,\n EvalStatus,\n EvalListParams,\n} from './evals-namespace'\n\n// Prompts namespace exports\nexport { PromptsNamespace, PromptRunner } from './prompts-namespace'\nexport type {\n CreatePromptData,\n UpdatePromptData,\n Prompt as RuntypePrompt,\n PromptRunOptions,\n PromptListParams,\n} from './prompts-namespace'\n\n// ============================================================================\n// Legacy API (RuntypeClient) - Maintained for backward compatibility\n// ============================================================================\n\nexport { RuntypeClient, RuntypeApiError, createClient } from './client'\nexport * from './types'\nexport * from './endpoints'\n\n// FlowBuilder exports (legacy)\nexport { FlowBuilder, ClientFlowBuilder, createExternalTool } from './flow-builder'\nexport type {\n // Step configs\n PromptStepConfig,\n FetchUrlStepConfig,\n TransformDataStepConfig,\n SetVariableStepConfig,\n ConditionalStepConfig,\n SearchStepConfig,\n SendEmailStepConfig,\n SendStreamStepConfig,\n RetrieveRecordStepConfig,\n UpsertRecordStepConfig,\n VectorSearchStepConfig,\n GenerateEmbeddingStepConfig,\n WaitUntilStepConfig,\n SendEventStepConfig,\n SendTextStepConfig,\n FetchGitHubStepConfig,\n // Builder configs\n FlowConfig,\n UpsertFlowConfig,\n RecordConfig,\n DispatchOptions,\n DispatchClient,\n Message,\n // Streaming types\n FlowStartEvent,\n StepStartEvent,\n StepDeltaEvent,\n /** @deprecated Use StepDeltaEvent instead */\n StepChunkEvent,\n StepCompleteEvent,\n FlowCompleteEvent,\n FlowErrorEvent,\n FlowPausedEvent,\n StepWaitingLocalEvent,\n // Fallback event types\n FallbacksInitiatedEvent,\n FallbackStartEvent,\n FallbackSuccessEvent,\n FallbackFailEvent,\n FallbacksExhaustedEvent,\n StreamEvent,\n StreamCallbacks,\n FlowSummary,\n} from './flow-builder'\n\n// Runtime tools types (re-exported from types.ts via export * from './types')\n// RuntimeTool, RuntimeToolConfig, RuntimeExternalToolConfig,\n// RuntimeCustomToolConfig, RuntimeFlowToolConfig, ToolsConfig\n\n// FlowResult for processing streaming responses\nexport { FlowResult } from './flow-result'\n\n// Stream utilities\nexport { parseSSEChunk, parseFinalBuffer, processStream, streamEvents } from './stream-utils'\n\n// Generated runtime tool gating helpers\nexport {\n evaluateGeneratedRuntimeToolProposal,\n buildGeneratedRuntimeToolGateOutput,\n attachRuntimeToolsToDispatchRequest,\n applyGeneratedRuntimeToolProposalToDispatchRequest,\n} from './generated-tool-gate'\nexport type {\n GeneratedRuntimeToolGateOptions,\n GeneratedRuntimeToolGateDecision,\n AttachRuntimeToolsOptions,\n ApplyGeneratedProposalOptions,\n ApplyGeneratedProposalResult,\n} from './generated-tool-gate'\n\n// BatchBuilder exports (legacy)\nexport { BatchBuilder, ClientBatchBuilder } from './batch-builder'\nexport type { BatchOptions, BatchRequest, BatchResult, BatchClient } from './batch-builder'\n\n// EvalBuilder exports (legacy)\nexport { EvalBuilder, ClientEvalBuilder } from './eval-builder'\nexport type {\n ModelOverride,\n EvalOptions,\n EvalRecord,\n EvalRequest,\n EvalResult,\n EvalClient,\n} from './eval-builder'\n\n// Error handling types\nexport type {\n ErrorHandlingMode,\n PromptErrorHandling,\n ContextErrorHandling,\n PromptFallback,\n ContextFallback,\n RetryFallback,\n ModelFallback,\n StepFallback,\n FlowFallback,\n} from './error-handling-types'\n\n// Workflow types and default workflow\nexport * from './workflow-types'\nexport { defaultWorkflow, deployWorkflow, gameWorkflow } from './workflows'\nexport {\n normalizeCandidatePath,\n isMarathonArtifactPath,\n isDiscoveryToolName,\n isPreservationSensitiveTask,\n getLikelySupportingCandidatePaths,\n getDefaultPlanPath,\n sanitizeTaskSlug,\n} from './workflow-utils'\n\n// Client token types\nexport type {\n ClientToken,\n CreateClientTokenRequest,\n CreateClientTokenResponse,\n UpdateClientTokenRequest,\n ClientTokenConfig,\n ClientWidgetTheme,\n ClientTokenEnvironment,\n ClientTokenVersionPin,\n ClientConversation,\n ListConversationsResponse,\n} from './client-token-types'\n","/**\n * BatchBuilder - Fluent builder for batch operations\n *\n * Provides a chainable API for building batch dispatch configurations\n * that execute a flow across multiple records of the same type.\n *\n * @example\n * ```typescript\n * import { BatchBuilder } from '@runtypelabs/sdk'\n *\n * const batch = await new BatchBuilder()\n * .useFlow('flow_abc123')\n * .forRecordType('customer')\n * .withOptions({ async: true })\n * .run(apiClient)\n * ```\n */\n\nimport type { DispatchClient } from './flow-builder'\n\n// ============================================================================\n// Batch Configuration Interfaces\n// ============================================================================\n\nexport interface BatchOptions {\n /** Run batch asynchronously (default: true) */\n async?: boolean\n /** Maximum concurrent executions */\n concurrency?: number\n /** Continue on individual record failures */\n continueOnError?: boolean\n /** Store results for each record */\n storeResults?: boolean\n /** Model override for batch execution */\n modelOverride?: string\n}\n\nexport interface BatchRequest {\n flowId: string\n recordType: string\n options?: BatchOptions\n /** Optional filter for records */\n filter?: Record<string, any>\n /** Optional limit on number of records */\n limit?: number\n}\n\nexport interface BatchResult {\n batchId: string\n status: 'queued' | 'running' | 'completed' | 'failed'\n totalRecords: number\n processedRecords: number\n failedRecords: number\n}\n\n// ============================================================================\n// BatchBuilder Class\n// ============================================================================\n\nexport class BatchBuilder {\n private flowId: string = ''\n private recordType: string = ''\n private batchOptions: BatchOptions = {}\n private filterConfig: Record<string, any> | undefined\n private limitConfig: number | undefined\n\n /**\n * Specify the flow to execute for each record\n */\n useFlow(flowId: string): this {\n this.flowId = flowId\n return this\n }\n\n /**\n * Specify the record type to batch process\n */\n forRecordType(recordType: string): this {\n this.recordType = recordType\n return this\n }\n\n /**\n * Set batch execution options\n */\n withOptions(options: BatchOptions): this {\n this.batchOptions = { ...this.batchOptions, ...options }\n return this\n }\n\n /**\n * Filter records to process\n *\n * @example\n * ```typescript\n * .withFilter({ status: 'pending', createdAt: { $gt: '2024-01-01' } })\n * ```\n */\n withFilter(filter: Record<string, any>): this {\n this.filterConfig = filter\n return this\n }\n\n /**\n * Limit the number of records to process\n */\n withLimit(limit: number): this {\n this.limitConfig = limit\n return this\n }\n\n /**\n * Build the batch request configuration\n */\n build(): BatchRequest {\n if (!this.flowId) {\n throw new Error('BatchBuilder: flowId is required. Call .useFlow(flowId) first.')\n }\n if (!this.recordType) {\n throw new Error('BatchBuilder: recordType is required. Call .forRecordType(type) first.')\n }\n\n const request: BatchRequest = {\n flowId: this.flowId,\n recordType: this.recordType,\n }\n\n if (Object.keys(this.batchOptions).length > 0) {\n request.options = this.batchOptions\n }\n\n if (this.filterConfig) {\n request.filter = this.filterConfig\n }\n\n if (this.limitConfig !== undefined) {\n request.limit = this.limitConfig\n }\n\n return request\n }\n\n /**\n * Execute the batch operation\n *\n * @param client - Client with batch dispatch capability\n * @returns BatchResult with batch status\n */\n async run(client: BatchClient): Promise<BatchResult> {\n const config = this.build()\n return client.batch(config)\n }\n}\n\n// ============================================================================\n// Client Interface for Batch Execution\n// ============================================================================\n\n/**\n * Interface for clients that can execute batch operations\n */\nexport interface BatchClient {\n batch(config: BatchRequest): Promise<BatchResult>\n}\n\n/**\n * BatchBuilder that is bound to a client for direct execution\n */\nexport class ClientBatchBuilder extends BatchBuilder {\n private boundClient: BatchClient\n\n constructor(client: BatchClient) {\n super()\n this.boundClient = client\n }\n\n /**\n * Execute the batch using the bound client\n */\n async run(): Promise<BatchResult> {\n const config = this.build()\n return this.boundClient.batch(config)\n }\n}\n","/**\n * EvalBuilder - Fluent builder for evaluation runs\n *\n * Provides a chainable API for building evaluation configurations\n * that test flows against records with model overrides and comparisons.\n *\n * @example\n * ```typescript\n * import { EvalBuilder } from '@runtypelabs/sdk'\n *\n * // Single model eval with overrides\n * const eval1 = await new EvalBuilder()\n * .useFlow('flow_abc123')\n * .forRecordType('test_data')\n * .withModelOverrides([{ stepName: 'Analyze', model: 'gpt-4o' }])\n * .run(apiClient)\n *\n * // Multi-model comparison\n * const eval2 = await new EvalBuilder()\n * .useFlow('flow_abc123')\n * .forRecordType('test_data')\n * .compareModels([\n * { stepName: 'Analyze', model: 'gpt-4o' },\n * { stepName: 'Analyze', model: 'claude-3-opus' },\n * ])\n * .run(apiClient)\n *\n * // Virtual flow eval\n * const eval3 = await new EvalBuilder()\n * .useVirtualFlow(flowBuilder)\n * .forRecordType('test_data')\n * .run(apiClient)\n * ```\n */\n\nimport type { FlowBuilder, DispatchClient } from './flow-builder'\n\n// ============================================================================\n// Eval Configuration Interfaces\n// ============================================================================\n\nexport interface ModelOverride {\n /** Name of the step to override */\n stepName: string\n /** Model to use for this step */\n model: string\n /** Optional temperature override */\n temperature?: number\n /** Optional max tokens override */\n maxTokens?: number\n}\n\nexport interface EvalOptions {\n /** Store evaluation results */\n storeResults?: boolean\n /** Run evaluations in parallel */\n parallel?: boolean\n /** Maximum concurrent evaluations */\n concurrency?: number\n /** Continue on individual record failures */\n continueOnError?: boolean\n}\n\nexport interface EvalRecord {\n /** Record name */\n name: string\n /** Record type */\n type: string\n /** Record metadata */\n metadata: Record<string, any>\n}\n\nexport interface EvalRequest {\n /** Flow ID (for existing flow) */\n flowId?: string\n /** Virtual flow definition */\n flow?: {\n name: string\n steps: any[]\n }\n /** Record type to evaluate against */\n recordType?: string\n /** Inline records for ad-hoc evaluation */\n records?: EvalRecord[]\n /** Model overrides for evaluation */\n modelOverrides?: ModelOverride[]\n /** Multiple model configurations for comparison */\n modelConfigs?: ModelOverride[][]\n /** Eval options */\n options?: EvalOptions\n /** Optional filter for records */\n filter?: Record<string, any>\n /** Optional limit on number of records */\n limit?: number\n}\n\nexport interface EvalResult {\n evalId: string\n status: 'running' | 'completed' | 'failed'\n totalRecords: number\n completedRecords: number\n failedRecords: number\n /** Results grouped by model config (for multi-model eval) */\n results?: Array<{\n modelConfig: ModelOverride[]\n records: Array<{\n recordId: string\n status: 'success' | 'error'\n result?: any\n error?: string\n executionTime: number\n }>\n }>\n}\n\n// ============================================================================\n// EvalBuilder Class\n// ============================================================================\n\nexport class EvalBuilder {\n private flowId: string | undefined\n private virtualFlow: { name: string; steps: any[] } | undefined\n private recordType: string | undefined\n private inlineRecords: EvalRecord[] | undefined\n private modelOverrides: ModelOverride[] | undefined\n private modelConfigs: ModelOverride[][] | undefined\n private evalOptions: EvalOptions = {}\n private filterConfig: Record<string, any> | undefined\n private limitConfig: number | undefined\n\n /**\n * Use an existing flow by ID for evaluation\n */\n useFlow(flowId: string): this {\n this.flowId = flowId\n this.virtualFlow = undefined\n return this\n }\n\n /**\n * Use a virtual flow (from FlowBuilder) for evaluation\n *\n * @example\n * ```typescript\n * const flowBuilder = new FlowBuilder()\n * .createFlow({ name: 'Test Flow' })\n * .prompt({ name: 'Analyze', model: 'gpt-4', userPrompt: '...' })\n *\n * const eval = await new EvalBuilder()\n * .useVirtualFlow(flowBuilder)\n * .forRecordType('test_data')\n * .run(apiClient)\n * ```\n */\n useVirtualFlow(builder: FlowBuilder): this {\n const config = builder.build()\n if (config.flow && 'name' in config.flow && 'steps' in config.flow) {\n this.virtualFlow = {\n name: config.flow.name as string,\n steps: config.flow.steps as any[],\n }\n }\n this.flowId = undefined\n return this\n }\n\n /**\n * Specify the record type to evaluate against\n */\n forRecordType(recordType: string): this {\n this.recordType = recordType\n this.inlineRecords = undefined\n return this\n }\n\n /**\n * Use inline records for ad-hoc evaluation (no record type lookup)\n *\n * @example\n * ```typescript\n * .withRecords([\n * { name: 'Test 1', type: 'test', metadata: { input: 'hello' } },\n * { name: 'Test 2', type: 'test', metadata: { input: 'world' } },\n * ])\n * ```\n */\n withRecords(records: EvalRecord[]): this {\n this.inlineRecords = records\n this.recordType = undefined\n return this\n }\n\n /**\n * Set model overrides for single-model evaluation\n *\n * @example\n * ```typescript\n * .withModelOverrides([\n * { stepName: 'Analyze', model: 'gpt-4o', temperature: 0.2 }\n * ])\n * ```\n */\n withModelOverrides(overrides: ModelOverride[]): this {\n this.modelOverrides = overrides\n this.modelConfigs = undefined\n return this\n }\n\n /**\n * Compare multiple model configurations\n *\n * @example\n * ```typescript\n * .compareModels([\n * [{ stepName: 'Analyze', model: 'gpt-4o' }],\n * [{ stepName: 'Analyze', model: 'claude-3-opus' }],\n * [{ stepName: 'Analyze', model: 'gemini-pro' }],\n * ])\n * ```\n */\n compareModels(configs: ModelOverride[][]): this {\n this.modelConfigs = configs\n this.modelOverrides = undefined\n return this\n }\n\n /**\n * Set evaluation options\n */\n withOptions(options: EvalOptions): this {\n this.evalOptions = { ...this.evalOptions, ...options }\n return this\n }\n\n /**\n * Filter records to evaluate\n */\n withFilter(filter: Record<string, any>): this {\n this.filterConfig = filter\n return this\n }\n\n /**\n * Limit the number of records to evaluate\n */\n withLimit(limit: number): this {\n this.limitConfig = limit\n return this\n }\n\n /**\n * Build the eval request configuration\n */\n build(): EvalRequest {\n if (!this.flowId && !this.virtualFlow) {\n throw new Error(\n 'EvalBuilder: flow is required. Call .useFlow(id) or .useVirtualFlow(builder) first.'\n )\n }\n if (!this.recordType && !this.inlineRecords) {\n throw new Error(\n 'EvalBuilder: records are required. Call .forRecordType(type) or .withRecords([...]) first.'\n )\n }\n\n const request: EvalRequest = {}\n\n if (this.flowId) {\n request.flowId = this.flowId\n } else if (this.virtualFlow) {\n request.flow = this.virtualFlow\n }\n\n if (this.recordType) {\n request.recordType = this.recordType\n } else if (this.inlineRecords) {\n request.records = this.inlineRecords\n }\n\n if (this.modelOverrides) {\n request.modelOverrides = this.modelOverrides\n } else if (this.modelConfigs) {\n request.modelConfigs = this.modelConfigs\n }\n\n if (Object.keys(this.evalOptions).length > 0) {\n request.options = this.evalOptions\n }\n\n if (this.filterConfig) {\n request.filter = this.filterConfig\n }\n\n if (this.limitConfig !== undefined) {\n request.limit = this.limitConfig\n }\n\n return request\n }\n\n /**\n * Execute the evaluation\n *\n * @param client - Client with eval capability\n * @returns EvalResult with evaluation status and results\n */\n async run(client: EvalClient): Promise<EvalResult> {\n const config = this.build()\n return client.eval(config)\n }\n}\n\n// ============================================================================\n// Client Interface for Eval Execution\n// ============================================================================\n\n/**\n * Interface for clients that can execute evaluations\n */\nexport interface EvalClient {\n eval(config: EvalRequest): Promise<EvalResult>\n}\n\n/**\n * EvalBuilder that is bound to a client for direct execution\n */\nexport class ClientEvalBuilder extends EvalBuilder {\n private boundClient: EvalClient\n\n constructor(client: EvalClient) {\n super()\n this.boundClient = client\n }\n\n /**\n * Execute the evaluation using the bound client\n */\n async run(): Promise<EvalResult> {\n const config = this.build()\n return this.boundClient.eval(config)\n }\n}\n"],"mappings":"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","names":["streamEvents","blockedTools","classifyVariant","classifyVariant","events","messages","content","recoveryMessage","record","RuntypeClient","streamEvents"]}