@fatagnus/codebuff 1.0.2 → 1.0.3
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/convex.cjs +0 -3
- package/dist/convex.mjs +0 -3
- package/package.json +1 -1
- package/dist/convex.cjs.map +0 -19
- package/dist/convex.mjs.map +0 -19
package/dist/convex.cjs
CHANGED
package/dist/convex.mjs
CHANGED
package/package.json
CHANGED
package/dist/convex.cjs.map
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../common/src/constants/agents.ts", "../../common/src/env-schema.ts", "../../common/src/env.ts", "../src/constants.ts", "../../common/src/types/session-state.ts", "../src/convex-session-state.ts", "../src/error-utils.ts", "../src/retry-config.ts", "../src/custom-tool.ts", "../src/convex-standalone.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Base Agent',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Ask Mode Agent',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n 'file-explorer': {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n 'file-picker': {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase; otherwise, no need to use this agent for minor changes since it takes a second.',\n } as const,\n 'agent-builder': {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n (typeof AgentTemplateTypes)[keyof typeof AgentTemplateTypes],\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record<keyof typeof AGENT_PERSONAS, string>\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record<string, string[]>,\n)\n\nexport const MAX_AGENT_STEPS_DEFAULT = 100\n",
|
|
6
|
-
"import z from 'zod/v4'\n\nexport const CLIENT_ENV_PREFIX = 'NEXT_PUBLIC_'\n\nexport const clientEnvSchema = z.object({\n NEXT_PUBLIC_CB_ENVIRONMENT: z.enum(['dev', 'test', 'prod']),\n NEXT_PUBLIC_CODEBUFF_APP_URL: z.url().min(1),\n NEXT_PUBLIC_SUPPORT_EMAIL: z.email().min(1),\n NEXT_PUBLIC_POSTHOG_API_KEY: z.string().min(1),\n NEXT_PUBLIC_POSTHOG_HOST_URL: z.url().min(1),\n NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: z.string().min(1),\n NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL: z.url().min(1),\n NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION_ID: z.string().optional(),\n NEXT_PUBLIC_WEB_PORT: z.coerce.number().min(1000),\n} satisfies Record<`${typeof CLIENT_ENV_PREFIX}${string}`, any>)\nexport const clientEnvVars = clientEnvSchema.keyof().options\nexport type ClientEnvVar = (typeof clientEnvVars)[number]\nexport type ClientInput = {\n [K in (typeof clientEnvVars)[number]]: string | undefined\n}\nexport type ClientEnv = z.infer<typeof clientEnvSchema>\n\n// Bun will inject all these values, so we need to reference them individually (no for-loops)\nexport const clientProcessEnv: ClientInput = {\n NEXT_PUBLIC_CB_ENVIRONMENT: process.env.NEXT_PUBLIC_CB_ENVIRONMENT,\n NEXT_PUBLIC_CODEBUFF_APP_URL: process.env.NEXT_PUBLIC_CODEBUFF_APP_URL,\n NEXT_PUBLIC_SUPPORT_EMAIL: process.env.NEXT_PUBLIC_SUPPORT_EMAIL,\n NEXT_PUBLIC_POSTHOG_API_KEY: process.env.NEXT_PUBLIC_POSTHOG_API_KEY,\n NEXT_PUBLIC_POSTHOG_HOST_URL: process.env.NEXT_PUBLIC_POSTHOG_HOST_URL,\n NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY:\n process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,\n NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL:\n process.env.NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL,\n NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION_ID:\n process.env.NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION_ID,\n NEXT_PUBLIC_WEB_PORT: process.env.NEXT_PUBLIC_WEB_PORT,\n}\n",
|
|
7
|
-
"import { clientEnvSchema, clientProcessEnv } from './env-schema'\n\nconst parsedEnv = clientEnvSchema.safeParse(clientProcessEnv)\nif (!parsedEnv.success) {\n throw parsedEnv.error\n}\n\nexport const env = parsedEnv.data\n\n// Only log environment in non-production\nif (env.NEXT_PUBLIC_CB_ENVIRONMENT !== 'prod') {\n console.log('Using environment:', env.NEXT_PUBLIC_CB_ENVIRONMENT)\n}\n\n// Derived environment constants for convenience\nexport const IS_DEV = env.NEXT_PUBLIC_CB_ENVIRONMENT === 'dev'\nexport const IS_TEST = env.NEXT_PUBLIC_CB_ENVIRONMENT === 'test'\nexport const IS_PROD = env.NEXT_PUBLIC_CB_ENVIRONMENT === 'prod'\nexport const IS_CI = process.env.CODEBUFF_GITHUB_ACTIONS === 'true'\n\n// Debug flag for logging analytics events in dev mode\n// Set to true when actively debugging analytics - affects both CLI and backend\nexport const DEBUG_ANALYTICS = false\n",
|
|
8
|
-
"import { env, IS_DEV, IS_TEST, IS_PROD } from '@codebuff/common/env'\n\nexport { IS_DEV, IS_TEST, IS_PROD }\n\nexport const CODEBUFF_BINARY = 'codebuff'\n\nexport const WEBSITE_URL = env.NEXT_PUBLIC_CODEBUFF_APP_URL\n",
|
|
9
|
-
"import { z } from 'zod/v4'\n\nimport { MAX_AGENT_STEPS_DEFAULT } from '../constants/agents'\n\nimport type { Message } from './messages/codebuff-message'\nimport type { ProjectFileContext } from '../util/file'\n\nexport const toolCallSchema = z.object({\n toolName: z.string(),\n toolCallId: z.string(),\n input: z.record(z.string(), z.any()),\n})\nexport type ToolCall = z.infer<typeof toolCallSchema>\n\nexport const subgoalSchema = z.object({\n objective: z.string().optional(),\n status: z\n .enum(['NOT_STARTED', 'IN_PROGRESS', 'COMPLETE', 'ABORTED'])\n .optional(),\n plan: z.string().optional(),\n logs: z.string().array(),\n})\nexport type Subgoal = z.infer<typeof subgoalSchema>\n\nexport type AgentState = {\n /**\n * @deprecated agentId is replaced by runId\n */\n agentId: string\n agentType: AgentTemplateType | null\n agentContext: Record<string, Subgoal>\n ancestorRunIds: string[]\n runId?: string\n subagents: AgentState[]\n childRunIds: string[]\n messageHistory: Message[]\n stepsRemaining: number\n creditsUsed: number\n directCreditsUsed: number\n output?: Record<string, any>\n parentId?: string\n systemPrompt: string\n toolDefinitions: Record<\n string,\n { description: string | undefined; inputSchema: {} }\n >\n /**\n * The accurate token count from the Anthropic API.\n * This is updated on every agent step via the /api/v1/token-count endpoint.\n */\n contextTokenCount: number\n}\n\nexport const AgentOutputSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('structuredOutput'),\n value: z.record(z.string(), z.any()).or(z.null()),\n }),\n z.object({\n type: z.literal('lastMessage'),\n value: z.array(z.any()), // Array of assistant and tool messages from the last turn, including tool results\n }),\n z.object({\n type: z.literal('allMessages'),\n value: z.array(z.any()),\n }),\n z.object({\n type: z.literal('error'),\n message: z.string(),\n statusCode: z.number().optional(),\n }),\n])\nexport type AgentOutput = z.infer<typeof AgentOutputSchema>\n\nexport const AgentTemplateTypeList = [\n // Base agents\n 'base',\n 'base_lite',\n 'base_max',\n 'base_experimental',\n 'claude4_gemini_thinking',\n 'superagent',\n 'base_agent_builder',\n\n // Ask mode\n 'ask',\n\n // Planning / Thinking\n 'planner',\n 'dry_run',\n 'thinker',\n\n // Other agents\n 'file_picker',\n 'file_explorer',\n 'researcher',\n 'reviewer',\n 'agent_builder',\n 'example_programmatic',\n] as const\ntype UnderscoreToDash<S extends string> = S extends `${infer L}_${infer R}`\n ? `${L}-${UnderscoreToDash<R>}` // recurse on the remainder\n : S\nexport const AgentTemplateTypes = Object.fromEntries(\n AgentTemplateTypeList.map((name) => [name, name.replaceAll('_', '-')]),\n) as { [K in (typeof AgentTemplateTypeList)[number]]: UnderscoreToDash<K> }\nconst agentTemplateTypeSchema = z.enum(AgentTemplateTypeList)\n// Allow dynamic agent types by extending the base enum with string\nexport type AgentTemplateType =\n | z.infer<typeof agentTemplateTypeSchema>\n | (string & {})\n\nexport type SessionState = {\n fileContext: ProjectFileContext\n mainAgentState: AgentState\n}\n\nexport function getInitialAgentState(): AgentState {\n return {\n agentId: 'main-agent',\n agentType: null,\n agentContext: {},\n ancestorRunIds: [],\n runId: undefined,\n subagents: [],\n childRunIds: [],\n messageHistory: [],\n stepsRemaining: MAX_AGENT_STEPS_DEFAULT,\n creditsUsed: 0,\n directCreditsUsed: 0,\n output: undefined,\n parentId: undefined,\n systemPrompt: '',\n toolDefinitions: {},\n contextTokenCount: 0,\n }\n}\nexport function getInitialSessionState(\n fileContext: ProjectFileContext,\n): SessionState {\n return {\n mainAgentState: getInitialAgentState(),\n fileContext,\n }\n}\n",
|
|
10
|
-
"/**\n * Convex-specific session state management.\n * \n * This module provides session state initialization for Convex environments\n * WITHOUT any tree-sitter or @codebuff/code-map dependencies.\n * \n * The regular run-state.ts imports from @codebuff/code-map which bundles\n * web-tree-sitter WASM modules that don't work in Convex's runtime.\n */\n\nimport { getInitialSessionState } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { CustomToolDefinition } from './custom-tool'\nimport type { AgentDefinition } from '@codebuff/common/templates/initial-agents-dir/types/agent-definition'\nimport type { Logger } from '@codebuff/common/types/contracts/logger'\nimport type { CodebuffFileSystem } from '@codebuff/common/types/filesystem'\nimport type {\n AgentOutput,\n SessionState,\n} from '@codebuff/common/types/session-state'\nimport type { CodebuffSpawn } from '@codebuff/common/types/spawn'\nimport type {\n CustomToolDefinitions,\n FileTreeNode,\n} from '@codebuff/common/util/file'\n\nexport type ConvexRunState = {\n sessionState?: SessionState\n output: AgentOutput\n}\n\n// Alias for backward compatibility\nexport type RunState = ConvexRunState\n\nexport type ConvexInitialSessionStateOptions = {\n cwd?: string\n projectFiles?: Record<string, string>\n knowledgeFiles?: Record<string, string>\n agentDefinitions?: AgentDefinition[]\n customToolDefinitions?: CustomToolDefinition[]\n maxAgentSteps?: number\n fs?: CodebuffFileSystem\n spawn?: CodebuffSpawn\n logger?: Logger\n}\n\n/**\n * Processes agent definitions array and converts handleSteps functions to strings\n */\nfunction processAgentDefinitions(\n agentDefinitions: AgentDefinition[],\n): Record<string, any> {\n const processedAgentTemplates: Record<string, any> = {}\n agentDefinitions.forEach((definition) => {\n const processedConfig = { ...definition } as Record<string, any>\n if (\n processedConfig.handleSteps &&\n typeof processedConfig.handleSteps === 'function'\n ) {\n processedConfig.handleSteps = processedConfig.handleSteps.toString()\n }\n if (processedConfig.id) {\n processedAgentTemplates[processedConfig.id] = processedConfig\n }\n })\n return processedAgentTemplates\n}\n\n/**\n * Processes custom tool definitions into the format expected by SessionState.\n * Converts Zod schemas to JSON Schema format so they can survive JSON serialization.\n */\nfunction processCustomToolDefinitions(\n customToolDefinitions: CustomToolDefinition[],\n): CustomToolDefinitions {\n return Object.fromEntries(\n customToolDefinitions.map((toolDefinition) => {\n // Convert Zod schema to JSON Schema format so it survives JSON serialization\n const jsonSchema = z.toJSONSchema(toolDefinition.inputSchema, {\n io: 'input',\n }) as Record<string, unknown>\n delete jsonSchema['$schema']\n\n return [\n toolDefinition.toolName,\n {\n inputSchema: jsonSchema,\n description: toolDefinition.description,\n endsAgentStep: toolDefinition.endsAgentStep,\n exampleInputs: toolDefinition.exampleInputs,\n },\n ]\n }),\n )\n}\n\n/**\n * Builds a hierarchical file tree from a flat list of file paths\n */\nfunction buildFileTree(filePaths: string[]): FileTreeNode[] {\n const tree: Record<string, FileTreeNode> = {}\n\n // Build the tree structure\n for (const filePath of filePaths) {\n const parts = filePath.split('/')\n\n for (let i = 0; i < parts.length; i++) {\n const currentPath = parts.slice(0, i + 1).join('/')\n const isFile = i === parts.length - 1\n\n if (!tree[currentPath]) {\n tree[currentPath] = {\n name: parts[i],\n type: isFile ? 'file' : 'directory',\n filePath: currentPath,\n children: isFile ? undefined : [],\n }\n }\n }\n }\n\n // Organize into hierarchical structure\n const rootNodes: FileTreeNode[] = []\n const processed = new Set<string>()\n\n for (const [path, node] of Object.entries(tree)) {\n if (processed.has(path)) continue\n\n const parentPath = path.substring(0, path.lastIndexOf('/'))\n if (parentPath && tree[parentPath]) {\n const parent = tree[parentPath]\n if (\n parent.children &&\n !parent.children.some((child) => child.filePath === path)\n ) {\n parent.children.push(node)\n }\n } else {\n rootNodes.push(node)\n }\n processed.add(path)\n }\n\n // Sort function for nodes\n function sortNodes(nodes: FileTreeNode[]): void {\n nodes.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1\n }\n return a.name.localeCompare(b.name)\n })\n\n for (const node of nodes) {\n if (node.children) {\n sortNodes(node.children)\n }\n }\n }\n\n sortNodes(rootNodes)\n return rootNodes\n}\n\n/**\n * Selects knowledge files from a list of file paths with fallback logic.\n */\nfunction selectKnowledgeFilePaths(allFilePaths: string[]): string[] {\n const knowledgeCandidates = allFilePaths.filter((filePath) => {\n const lowercaseFilePath = filePath.toLowerCase()\n return (\n lowercaseFilePath.endsWith('knowledge.md') ||\n lowercaseFilePath.endsWith('agents.md') ||\n lowercaseFilePath.endsWith('claude.md')\n )\n })\n\n // Group candidates by directory\n const byDirectory = new Map<string, string[]>()\n for (const filePath of knowledgeCandidates) {\n const lastSlash = filePath.lastIndexOf('/')\n const dir = lastSlash >= 0 ? filePath.substring(0, lastSlash) : ''\n if (!byDirectory.has(dir)) {\n byDirectory.set(dir, [])\n }\n byDirectory.get(dir)!.push(filePath)\n }\n\n const selectedFiles: string[] = []\n\n for (const files of byDirectory.values()) {\n const knowledgeMd = files.find((f) =>\n f.toLowerCase().endsWith('knowledge.md'),\n )\n const agentsMd = files.find((f) => f.toLowerCase().endsWith('agents.md'))\n const claudeMd = files.find((f) => f.toLowerCase().endsWith('claude.md'))\n\n const selectedKnowledgeFile = knowledgeMd || agentsMd || claudeMd\n if (selectedKnowledgeFile) {\n selectedFiles.push(selectedKnowledgeFile)\n }\n }\n\n return selectedFiles\n}\n\n/**\n * Auto-derives knowledge files from project files if knowledgeFiles is undefined.\n */\nfunction deriveKnowledgeFiles(\n projectFiles: Record<string, string>,\n): Record<string, string> {\n const allFilePaths = Object.keys(projectFiles)\n const selectedFilePaths = selectKnowledgeFilePaths(allFilePaths)\n\n const knowledgeFiles: Record<string, string> = {}\n for (const filePath of selectedFilePaths) {\n knowledgeFiles[filePath] = projectFiles[filePath]\n }\n return knowledgeFiles\n}\n\n/**\n * Convex-specific initial session state.\n * \n * This version does NOT use tree-sitter for token scoring.\n * Token scoring is skipped entirely in Convex environments.\n */\nexport async function convexInitialSessionState(\n params: ConvexInitialSessionStateOptions,\n): Promise<SessionState> {\n const { cwd, maxAgentSteps, fs, spawn, logger } = params\n let { agentDefinitions, customToolDefinitions, projectFiles, knowledgeFiles } =\n params\n\n if (!agentDefinitions) {\n agentDefinitions = []\n }\n if (!customToolDefinitions) {\n customToolDefinitions = []\n }\n\n // In Convex, we don't auto-discover project files (no filesystem)\n if (projectFiles === undefined) {\n projectFiles = {}\n }\n if (knowledgeFiles === undefined) {\n knowledgeFiles = projectFiles ? deriveKnowledgeFiles(projectFiles) : {}\n }\n\n const processedAgentTemplates =\n agentDefinitions.length > 0\n ? processAgentDefinitions(agentDefinitions)\n : {}\n\n const processedCustomToolDefinitions = processCustomToolDefinitions(\n customToolDefinitions,\n )\n\n // Build file tree from projectFiles (no token scoring in Convex)\n const filePaths = Object.keys(projectFiles).sort()\n const fileTree = buildFileTree(filePaths)\n \n // No token scoring in Convex - skip entirely\n const fileTokenScores: Record<string, any> = {}\n const tokenCallers: Record<string, any> = {}\n\n // No git changes in Convex (no filesystem/child_process)\n const gitChanges = {\n status: '',\n diff: '',\n diffCached: '',\n lastCommitMessages: '',\n }\n\n const initialState = getInitialSessionState({\n projectRoot: cwd ?? '/convex',\n cwd: cwd ?? '/convex',\n fileTree,\n fileTokenScores,\n tokenCallers,\n knowledgeFiles,\n userKnowledgeFiles: {},\n agentTemplates: processedAgentTemplates,\n customToolDefinitions: processedCustomToolDefinitions,\n gitChanges,\n changesSinceLastChat: {},\n shellConfigFiles: {},\n systemInfo: {\n platform: 'linux', // Convex runs on Linux\n shell: 'bash',\n nodeVersion: process.version,\n arch: 'x64',\n homedir: '/tmp',\n cpus: 1,\n },\n })\n\n if (maxAgentSteps) {\n initialState.mainAgentState.stepsRemaining = maxAgentSteps\n }\n\n return initialState\n}\n\n/**\n * Applies overrides to an existing session state for Convex.\n * \n * This version does NOT use tree-sitter for token scoring.\n */\nexport async function convexApplyOverridesToSessionState(\n cwd: string | undefined,\n baseSessionState: SessionState,\n overrides: {\n projectFiles?: Record<string, string>\n knowledgeFiles?: Record<string, string>\n agentDefinitions?: AgentDefinition[]\n customToolDefinitions?: CustomToolDefinition[]\n maxAgentSteps?: number\n },\n): Promise<SessionState> {\n // Deep clone to avoid mutating the original session state\n const sessionState = JSON.parse(\n JSON.stringify(baseSessionState),\n ) as SessionState\n\n // Apply maxAgentSteps override\n if (overrides.maxAgentSteps !== undefined) {\n sessionState.mainAgentState.stepsRemaining = overrides.maxAgentSteps\n }\n\n // Apply projectFiles override (just build file tree, no token scoring)\n if (overrides.projectFiles !== undefined) {\n const filePaths = Object.keys(overrides.projectFiles).sort()\n sessionState.fileContext.fileTree = buildFileTree(filePaths)\n // No token scoring in Convex\n sessionState.fileContext.fileTokenScores = {}\n sessionState.fileContext.tokenCallers = {}\n\n // Auto-derive knowledgeFiles if not explicitly provided\n if (overrides.knowledgeFiles === undefined) {\n sessionState.fileContext.knowledgeFiles = deriveKnowledgeFiles(\n overrides.projectFiles,\n )\n }\n }\n\n // Apply knowledgeFiles override\n if (overrides.knowledgeFiles !== undefined) {\n sessionState.fileContext.knowledgeFiles = overrides.knowledgeFiles\n }\n\n // Apply agentDefinitions override (merge by id, last-in wins)\n if (overrides.agentDefinitions !== undefined) {\n const processedAgentTemplates = processAgentDefinitions(\n overrides.agentDefinitions,\n )\n sessionState.fileContext.agentTemplates = {\n ...sessionState.fileContext.agentTemplates,\n ...processedAgentTemplates,\n }\n }\n\n // Apply customToolDefinitions override (replace by toolName)\n if (overrides.customToolDefinitions !== undefined) {\n const processedCustomToolDefinitions = processCustomToolDefinitions(\n overrides.customToolDefinitions,\n )\n sessionState.fileContext.customToolDefinitions = {\n ...sessionState.fileContext.customToolDefinitions,\n ...processedCustomToolDefinitions,\n }\n }\n\n return sessionState\n}\n",
|
|
11
|
-
"/**\n * SDK Error Utilities\n *\n * Simple utilities for error handling based on HTTP status codes.\n * Uses the AI SDK's error types which include statusCode property.\n */\n\n/**\n * Error type with statusCode property\n */\nexport type HttpError = Error & { statusCode: number }\n\n/**\n * HTTP status codes that should trigger automatic retry\n */\nexport const RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504])\n\n// ============================================================================\n// Error Factory Functions\n// ============================================================================\n\n/**\n * Creates an Error with a statusCode property\n */\nexport function createHttpError(message: string, statusCode: number): HttpError {\n const error = new Error(message) as HttpError\n error.statusCode = statusCode\n return error\n}\n\n/**\n * Creates an authentication error (401)\n */\nexport function createAuthError(message = 'Authentication failed'): HttpError {\n return createHttpError(message, 401)\n}\n\n/**\n * Creates a forbidden error (403)\n */\nexport function createForbiddenError(message = 'Access forbidden'): HttpError {\n return createHttpError(message, 403)\n}\n\n/**\n * Creates a payment required error (402)\n */\nexport function createPaymentRequiredError(message = 'Payment required'): HttpError {\n return createHttpError(message, 402)\n}\n\n/**\n * Creates a server error (500 by default, or custom 5xx)\n */\nexport function createServerError(message = 'Server error', statusCode = 500): HttpError {\n return createHttpError(message, statusCode)\n}\n\n/**\n * Creates a network error (503 - service unavailable)\n * Used for connection failures, DNS errors, timeouts, etc.\n */\nexport function createNetworkError(message = 'Network error'): HttpError {\n return createHttpError(message, 503)\n}\n\n/**\n * Checks if an HTTP status code is retryable\n */\nexport function isRetryableStatusCode(statusCode: number | undefined): boolean {\n if (statusCode === undefined) return false\n return RETRYABLE_STATUS_CODES.has(statusCode)\n}\n\n/**\n * Extracts the statusCode from an error if available\n */\nexport function getErrorStatusCode(error: unknown): number | undefined {\n if (error && typeof error === 'object' && 'statusCode' in error) {\n const statusCode = (error as { statusCode: unknown }).statusCode\n if (typeof statusCode === 'number') {\n return statusCode\n }\n }\n return undefined\n}\n\n/**\n * Sanitizes error messages for display\n * Removes sensitive information and formats for user consumption\n */\nexport function sanitizeErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message\n }\n if (typeof error === 'string') {\n return error\n }\n if (error && typeof error === 'object' && 'message' in error) {\n const message = (error as { message: unknown }).message\n if (typeof message === 'string') {\n return message\n }\n }\n return String(error)\n}\n",
|
|
12
|
-
"/**\n * Retry Configuration Constants\n *\n * This module defines constants for retry behavior and exponential backoff.\n * Used by the CLI to automatically retry failed messages after reconnection.\n *\n * @example\n * ```typescript\n * import { MAX_RETRIES_PER_MESSAGE, RETRY_BACKOFF_BASE_DELAY_MS } from '@codebuff/sdk'\n *\n * let retryCount = 0\n * let backoffDelay = RETRY_BACKOFF_BASE_DELAY_MS\n *\n * while (retryCount < MAX_RETRIES_PER_MESSAGE) {\n * await new Promise(resolve => setTimeout(resolve, backoffDelay))\n * // ... retry logic\n * backoffDelay = Math.min(backoffDelay * 2, RETRY_BACKOFF_MAX_DELAY_MS)\n * retryCount++\n * }\n * ```\n */\n\n/**\n * Maximum number of retry attempts per message\n * After this many attempts, the message is marked as permanently failed\n */\nexport const MAX_RETRIES_PER_MESSAGE = 3\n\n/**\n * Base delay in milliseconds for exponential backoff\n * First retry: 1s, Second: 2s, Third: 4s, Fourth: 8s (capped)\n */\nexport const RETRY_BACKOFF_BASE_DELAY_MS = 1000\n\n/**\n * Maximum delay in milliseconds for exponential backoff\n * Prevents backoff from growing indefinitely\n */\nexport const RETRY_BACKOFF_MAX_DELAY_MS = 8000\n\n/**\n * Duration in milliseconds to show the reconnection message\n * After this time, the message auto-hides\n */\nexport const RECONNECTION_MESSAGE_DURATION_MS = 2000\n\n/**\n * Delay in milliseconds before retrying messages after reconnection\n * Gives the connection time to stabilize before attempting retries\n */\nexport const RECONNECTION_RETRY_DELAY_MS = 500\n",
|
|
13
|
-
"import type { ToolName } from '../../common/src/tools/constants'\nimport type { ToolResultOutput } from '../../common/src/types/messages/content-part'\nimport type { z } from 'zod/v4'\n\nexport type CustomToolDefinition<\n N extends string = string,\n Args extends any = any,\n Input extends any = any,\n> = {\n toolName: N\n inputSchema: z.ZodType<Args, Input>\n description: string\n endsAgentStep: boolean\n exampleInputs: Input[]\n execute: (params: Args) => Promise<ToolResultOutput[]>\n}\n\n/**\n * Creates a CustomToolDefinition object\n *\n * @param toolName the name of the tool\n * @param inputSchema a Zod4 schema describing the input of the tool.\n * @param description a description of the tool to be passed to the LLM. This should describe what the tool does and when to use it.\n * @param endsAgentStep whether the tool ends the agent step. If `true`, this will be used as a \"stop sequence\" for the LLM. i.e. it will not be able to call any other tools after this one in a single step and must wait for the tool results. Used for tools that give more information to the LLM.\n * @param exampleInputs an array of example inputs for the tool.\n * @param execute what to do when the tool is called. Can be either a sync or async. Must return an array of {@linkcode ToolResultOutput}\n * @returns a {@linkcode CustomToolDefinition} object\n */\nexport function getCustomToolDefinition<\n TN extends string,\n Args extends any,\n Input extends any,\n>({\n toolName,\n inputSchema,\n description,\n endsAgentStep = true,\n exampleInputs = [],\n execute,\n}: {\n toolName: TN extends ToolName\n ? TN & {\n error: `Hi there. This is a message from the Codebuff team: You have used a custom tool where you needed to use overrideTools instead for name: ${TN}`\n }\n : TN\n inputSchema: z.ZodType<Args, Input>\n description: string\n endsAgentStep?: boolean\n exampleInputs?: Input[]\n execute: (params: Args) => Promise<ToolResultOutput[]> | ToolResultOutput[]\n}): CustomToolDefinition<TN, Args, Input> {\n return {\n toolName,\n inputSchema,\n description,\n endsAgentStep,\n exampleInputs,\n execute: async (params) => {\n return await execute(params)\n },\n }\n}\n",
|
|
14
|
-
"/**\n * Standalone Convex-compatible Codebuff client.\n *\n * This module provides a completely standalone SDK for Convex that:\n * - Does NOT import from @codebuff/agent-runtime (avoids tree-sitter)\n * - Makes direct HTTP calls to the Codebuff API\n * - Implements a minimal agent loop for tool handling\n *\n * Usage:\n * ```ts\n * import { ConvexCodebuffClient } from '@fatagnus/codebuff/convex'\n *\n * const client = new ConvexCodebuffClient({\n * apiKey: 'your-api-key',\n * projectFiles: { 'src/index.ts': 'console.log(\"hello\")' },\n * })\n *\n * const result = await client.run({\n * agent: 'base',\n * prompt: 'Explain this code',\n * })\n * ```\n */\n\nimport { MAX_AGENT_STEPS_DEFAULT } from '@codebuff/common/constants/agents'\n\nimport { WEBSITE_URL } from './constants'\nimport {\n convexInitialSessionState,\n convexApplyOverridesToSessionState,\n} from './convex-session-state'\nimport {\n getErrorStatusCode,\n createAuthError,\n createNetworkError,\n createHttpError,\n} from './error-utils'\nimport {\n MAX_RETRIES_PER_MESSAGE,\n RETRY_BACKOFF_BASE_DELAY_MS,\n RETRY_BACKOFF_MAX_DELAY_MS,\n} from './retry-config'\n\nimport type { CustomToolDefinition } from './custom-tool'\nimport type { ConvexRunState } from './convex-session-state'\nimport type { AgentDefinition } from '@codebuff/common/templates/initial-agents-dir/types/agent-definition'\nimport type {\n PublishedToolName,\n ToolName,\n} from '@codebuff/common/tools/constants'\nimport type {\n ClientToolCall,\n ClientToolName,\n CodebuffToolOutput,\n PublishedClientToolName,\n} from '@codebuff/common/tools/list'\nimport type { Logger } from '@codebuff/common/types/contracts/logger'\nimport type { CodebuffFileSystem } from '@codebuff/common/types/filesystem'\nimport type {\n Message,\n ToolMessage,\n AssistantMessage,\n UserMessage,\n} from '@codebuff/common/types/messages/codebuff-message'\nimport type {\n ImagePart,\n TextPart,\n ToolResultOutput,\n} from '@codebuff/common/types/messages/content-part'\nimport type { PrintModeEvent } from '@codebuff/common/types/print-mode'\nimport type { SessionState } from '@codebuff/common/types/session-state'\nimport type { CodebuffSpawn } from '@codebuff/common/types/spawn'\n\n// Re-export types that don't require Node.js built-ins\nexport type * from '@codebuff/common/types/json'\nexport type * from '@codebuff/common/types/messages/codebuff-message'\nexport type * from '@codebuff/common/types/messages/data-content'\nexport type * from '@codebuff/common/types/print-mode'\nexport type {\n TextPart,\n ImagePart,\n} from '@codebuff/common/types/messages/content-part'\nexport type { AgentDefinition } from '@codebuff/common/templates/initial-agents-dir/types/agent-definition'\nexport type { ToolName } from '@codebuff/common/tools/constants'\nexport type {\n ClientToolCall,\n ClientToolName,\n CodebuffToolOutput,\n} from '@codebuff/common/tools/list'\nexport * from './custom-tool'\nexport * from './convex-session-state'\nexport * from './constants'\n\n// Error utilities (don't require Node.js built-ins)\nexport {\n isRetryableStatusCode,\n getErrorStatusCode,\n sanitizeErrorMessage,\n RETRYABLE_STATUS_CODES,\n createHttpError,\n createAuthError,\n createForbiddenError,\n createPaymentRequiredError,\n createServerError,\n createNetworkError,\n} from './error-utils'\nexport type { HttpError } from './error-utils'\n\n// Retry configuration constants\nexport {\n MAX_RETRIES_PER_MESSAGE,\n RETRY_BACKOFF_BASE_DELAY_MS,\n RETRY_BACKOFF_MAX_DELAY_MS,\n RECONNECTION_MESSAGE_DURATION_MS,\n RECONNECTION_RETRY_DELAY_MS,\n} from './retry-config'\n\nexport type { CodebuffFileSystem } from '@codebuff/common/types/filesystem'\n\n/**\n * Error thrown when a tool that requires Node.js built-ins is called in Convex\n */\nexport class ConvexUnsupportedToolError extends Error {\n constructor(toolName: string, reason: string) {\n super(\n `Tool \"${toolName}\" is not supported in Convex runtime: ${reason}. ` +\n `Either provide an override via overrideTools, or modify your agent to not use this tool.`,\n )\n this.name = 'ConvexUnsupportedToolError'\n }\n}\n\nexport type ImageContent = {\n type: 'image'\n image: string // base64 encoded\n mediaType: string\n}\n\nexport type TextContent = {\n type: 'text'\n text: string\n}\n\nexport type MessageContent = TextContent | ImageContent\n\nexport type ConvexRunOptions = {\n agent: string | AgentDefinition\n prompt: string\n /** Content array for multimodal messages (text + images) */\n content?: MessageContent[]\n params?: Record<string, unknown>\n previousRun?: ConvexRunState\n extraToolResults?: ToolMessage[]\n signal?: AbortSignal\n}\n\nexport type ConvexClientOptions = {\n apiKey: string\n\n /**\n * Project files as a plain object. Keys are file paths, values are file contents.\n * Required in Convex since there's no file system access.\n */\n projectFiles?: Record<string, string>\n knowledgeFiles?: Record<string, string>\n agentDefinitions?: AgentDefinition[]\n maxAgentSteps?: number\n\n handleEvent?: (event: PrintModeEvent) => void | Promise<void>\n handleStreamChunk?: (\n chunk:\n | string\n | {\n type: 'subagent_chunk'\n agentId: string\n agentType: string\n chunk: string\n }\n | {\n type: 'reasoning_chunk'\n agentId: string\n ancestorRunIds: string[]\n chunk: string\n },\n ) => void | Promise<void>\n\n /**\n * Override tools with custom implementations.\n * In Convex, you MUST provide overrides for file operations if you need them,\n * since there's no file system access.\n */\n overrideTools?: Partial<\n {\n [K in ClientToolName & PublishedToolName]: (\n input: ClientToolCall<K>['input'],\n ) => Promise<CodebuffToolOutput<K>>\n } & {\n read_files: (input: {\n filePaths: string[]\n }) => Promise<Record<string, string | null>>\n }\n >\n customToolDefinitions?: CustomToolDefinition[]\n\n logger?: Logger\n}\n\n// ============================================================================\n// Standalone Utilities (no agent-runtime imports)\n// ============================================================================\n\n/**\n * Build user message content from prompt, params, and content parts.\n * Reimplemented locally to avoid agent-runtime import.\n */\nfunction buildUserMessageContent(\n prompt?: string,\n params?: Record<string, unknown>,\n content?: (TextPart | ImagePart)[],\n): (TextPart | ImagePart)[] {\n const parts: (TextPart | ImagePart)[] = []\n\n // Add existing content parts\n if (content && content.length > 0) {\n parts.push(...content)\n }\n\n // Build text content from prompt and params\n let textContent = ''\n if (prompt) {\n textContent += `<user_message>\\n${prompt}\\n</user_message>`\n }\n if (params && Object.keys(params).length > 0) {\n textContent += `\\n\\n<params>\\n${JSON.stringify(params, null, 2)}\\n</params>`\n }\n\n if (textContent) {\n parts.push({ type: 'text', text: textContent })\n }\n\n return parts.length > 0 ? parts : [{ type: 'text', text: '' }]\n}\n\n/**\n * Wraps content for user messages, ensuring text is wrapped in <user_message> tags.\n */\nconst wrapContentForUserMessage = (\n content?: (TextPart | ImagePart)[],\n): (TextPart | ImagePart)[] | undefined => {\n if (!content || content.length === 0) {\n return content\n }\n return buildUserMessageContent(undefined, undefined, content)\n}\n\n/**\n * Create a user message.\n */\nfunction userMessage(content: string | (TextPart | ImagePart)[]): UserMessage {\n const contentArray: (TextPart | ImagePart)[] =\n typeof content === 'string' ? [{ type: 'text', text: content }] : content\n return {\n role: 'user',\n content: contentArray,\n sentAt: Date.now(),\n }\n}\n\n/**\n * Create an assistant message.\n */\nfunction assistantMessage(content: string): AssistantMessage {\n return {\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n sentAt: Date.now(),\n }\n}\n\nconst createAbortError = (signal?: AbortSignal) => {\n if (signal?.reason instanceof Error) {\n return signal.reason\n }\n const error = new Error('Aborted')\n error.name = 'AbortError'\n return error\n}\n\n/**\n * Stub file system for Convex that throws clear errors.\n */\nconst createConvexStubFs = (): CodebuffFileSystem => ({\n readFile: async () => {\n throw new ConvexUnsupportedToolError(\n 'read_files',\n 'File system access is not available in Convex. Provide projectFiles in options or override read_files tool.',\n )\n },\n writeFile: async () => {\n throw new ConvexUnsupportedToolError(\n 'write_file',\n 'File system access is not available in Convex. Provide an override for write_file tool.',\n )\n },\n readdir: async () => {\n throw new ConvexUnsupportedToolError(\n 'list_directory',\n 'File system access is not available in Convex.',\n )\n },\n stat: async () => {\n throw new ConvexUnsupportedToolError(\n 'stat',\n 'File system access is not available in Convex.',\n )\n },\n mkdir: async () => {\n throw new ConvexUnsupportedToolError(\n 'mkdir',\n 'File system access is not available in Convex.',\n )\n },\n})\n\n/**\n * Stub spawn for Convex that throws clear errors\n */\nconst createConvexStubSpawn = (): CodebuffSpawn => {\n return (() => {\n throw new ConvexUnsupportedToolError(\n 'run_terminal_command',\n 'child_process is not available in Convex runtime',\n )\n }) as unknown as CodebuffSpawn\n}\n\n// ============================================================================\n// Direct HTTP API Calls (no AI SDK or agent-runtime)\n// ============================================================================\n\ntype UserColumn = 'id' | 'email' | 'discord_id' | 'stripe_customer_id' | 'banned'\n\n/**\n * Fetch with retry logic for transient errors.\n */\nasync function fetchWithRetry(\n url: URL | string,\n options: RequestInit,\n logger?: Logger,\n): Promise<Response> {\n let lastError: Error | null = null\n let backoffDelay = RETRY_BACKOFF_BASE_DELAY_MS\n\n for (let attempt = 0; attempt <= MAX_RETRIES_PER_MESSAGE; attempt++) {\n try {\n const response = await fetch(url, options)\n\n if (response.ok || response.status < 500) {\n return response\n }\n\n if (attempt < MAX_RETRIES_PER_MESSAGE) {\n logger?.warn(\n { status: response.status, attempt: attempt + 1, url: String(url) },\n `Retryable HTTP error, retrying in ${backoffDelay}ms`,\n )\n await new Promise((resolve) => setTimeout(resolve, backoffDelay))\n backoffDelay = Math.min(backoffDelay * 2, RETRY_BACKOFF_MAX_DELAY_MS)\n } else {\n return response\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n\n if (attempt < MAX_RETRIES_PER_MESSAGE) {\n logger?.warn(\n { error: lastError.message, attempt: attempt + 1, url: String(url) },\n `Network error, retrying in ${backoffDelay}ms`,\n )\n await new Promise((resolve) => setTimeout(resolve, backoffDelay))\n backoffDelay = Math.min(backoffDelay * 2, RETRY_BACKOFF_MAX_DELAY_MS)\n }\n }\n }\n\n throw lastError ?? new Error('Request failed after retries')\n}\n\n/**\n * Get user info from API key.\n */\nasync function getUserInfoFromApiKey(\n apiKey: string,\n fields: UserColumn[],\n logger?: Logger,\n): Promise<{ id: string } | null> {\n const urlParams = new URLSearchParams({ fields: fields.join(',') })\n const url = new URL(`/api/v1/me?${urlParams}`, WEBSITE_URL)\n\n try {\n const response = await fetchWithRetry(\n url,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n },\n logger,\n )\n\n if (\n response.status === 401 ||\n response.status === 403 ||\n response.status === 404\n ) {\n return null\n }\n\n if (!response.ok) {\n throw createHttpError('Request failed', response.status)\n }\n\n return await response.json()\n } catch (error) {\n logger?.error({ error }, 'getUserInfoFromApiKey error')\n throw error\n }\n}\n\n/**\n * Start an agent run.\n */\nasync function startAgentRun(\n apiKey: string,\n agentId: string,\n ancestorRunIds: string[],\n logger?: Logger,\n): Promise<string | null> {\n const url = new URL('/api/v1/agent-runs', WEBSITE_URL)\n\n try {\n const response = await fetchWithRetry(\n url,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'START',\n agentId,\n ancestorRunIds,\n }),\n },\n logger,\n )\n\n if (!response.ok) {\n logger?.error({ status: response.status }, 'startAgentRun request failed')\n return null\n }\n\n const responseBody = await response.json()\n return responseBody?.runId ?? null\n } catch (error) {\n logger?.error({ error }, 'startAgentRun error')\n return null\n }\n}\n\n/**\n * Finish an agent run.\n */\nasync function finishAgentRun(\n apiKey: string,\n runId: string,\n status: 'completed' | 'failed' | 'cancelled',\n totalSteps: number,\n directCredits: number,\n totalCredits: number,\n logger?: Logger,\n): Promise<void> {\n const url = new URL('/api/v1/agent-runs', WEBSITE_URL)\n\n try {\n await fetchWithRetry(\n url,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'FINISH',\n runId,\n status,\n totalSteps,\n directCredits,\n totalCredits,\n }),\n },\n logger,\n )\n } catch (error) {\n logger?.error({ error }, 'finishAgentRun error')\n }\n}\n\n/**\n * Convert messages to OpenAI-compatible format for the chat completions API.\n */\nfunction convertToOpenAIMessages(\n messages: Message[],\n systemPrompt?: string,\n): any[] {\n const openaiMessages: any[] = []\n\n // Add system message first\n if (systemPrompt) {\n openaiMessages.push({\n role: 'system',\n content: systemPrompt,\n })\n }\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n openaiMessages.push({\n role: 'system',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : msg.content.map((c) => c.text).join('\\n\\n'),\n })\n } else if (msg.role === 'user') {\n const content: any[] = []\n for (const part of msg.content) {\n if (part.type === 'text') {\n content.push({ type: 'text', text: part.text })\n } else if (part.type === 'image') {\n content.push({\n type: 'image_url',\n image_url: {\n url: `data:${part.mediaType};base64,${part.image}`,\n },\n })\n }\n }\n openaiMessages.push({\n role: 'user',\n content: content.length === 1 && content[0].type === 'text'\n ? content[0].text\n : content,\n })\n } else if (msg.role === 'assistant') {\n const textContent = msg.content\n .filter((c) => c.type === 'text')\n .map((c) => (c as any).text)\n .join('')\n const toolCalls = msg.content\n .filter((c) => c.type === 'tool-call')\n .map((c: any) => ({\n id: c.toolCallId,\n type: 'function',\n function: {\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n },\n }))\n\n const assistantMsg: any = { role: 'assistant' }\n if (textContent) {\n assistantMsg.content = textContent\n }\n if (toolCalls.length > 0) {\n assistantMsg.tool_calls = toolCalls\n }\n openaiMessages.push(assistantMsg)\n } else if (msg.role === 'tool') {\n openaiMessages.push({\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: JSON.stringify(\n msg.content.length === 1\n ? (msg.content[0] as any).value\n : msg.content.map((c: any) => c.value),\n ),\n })\n }\n }\n\n return openaiMessages\n}\n\n/**\n * Call the chat completions API with streaming.\n */\nasync function* streamChatCompletion(\n apiKey: string,\n runId: string,\n model: string,\n messages: any[],\n tools: any[] | undefined,\n signal?: AbortSignal,\n): AsyncGenerator<{\n type: 'text' | 'tool_call' | 'done'\n content?: string\n toolCall?: {\n id: string\n name: string\n arguments: string\n }\n}> {\n const url = new URL('/api/v1/chat/completions', WEBSITE_URL)\n\n const body: any = {\n model,\n messages,\n stream: true,\n codebuff_metadata: {\n run_id: runId,\n },\n }\n\n if (tools && tools.length > 0) {\n body.tools = tools\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n signal,\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '')\n throw createHttpError(\n `Chat completion failed: ${response.status} ${errorText}`,\n response.status,\n )\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('No response body')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n const toolCallAccumulators: Record<\n number,\n { id: string; name: string; arguments: string }\n > = {}\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n\n if (data === '[DONE]') {\n // Emit accumulated tool calls\n for (const toolCall of Object.values(toolCallAccumulators)) {\n yield { type: 'tool_call', toolCall }\n }\n yield { type: 'done' }\n return\n }\n\n try {\n const parsed = JSON.parse(data)\n const choice = parsed.choices?.[0]\n if (!choice) continue\n\n const delta = choice.delta\n if (delta?.content) {\n yield { type: 'text', content: delta.content }\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const index = tc.index ?? 0\n if (!toolCallAccumulators[index]) {\n toolCallAccumulators[index] = {\n id: tc.id || '',\n name: tc.function?.name || '',\n arguments: '',\n }\n }\n if (tc.id) {\n toolCallAccumulators[index].id = tc.id\n }\n if (tc.function?.name) {\n toolCallAccumulators[index].name = tc.function.name\n }\n if (tc.function?.arguments) {\n toolCallAccumulators[index].arguments += tc.function.arguments\n }\n }\n }\n\n if (choice.finish_reason === 'stop' || choice.finish_reason === 'tool_calls') {\n // Emit accumulated tool calls\n for (const toolCall of Object.values(toolCallAccumulators)) {\n if (toolCall.name) {\n yield { type: 'tool_call', toolCall }\n }\n }\n yield { type: 'done' }\n return\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\n// ============================================================================\n// Tool Handling\n// ============================================================================\n\n/**\n * Read files from projectFiles or override.\n */\nasync function readFiles({\n filePaths,\n override,\n projectFiles,\n}: {\n filePaths: string[]\n override?: NonNullable<\n Required<ConvexClientOptions>['overrideTools']['read_files']\n >\n projectFiles?: Record<string, string>\n}) {\n if (override) {\n return await override({ filePaths })\n }\n\n const result: Record<string, string | null> = {}\n for (const filePath of filePaths) {\n result[filePath] = projectFiles?.[filePath] ?? null\n }\n return result\n}\n\n/**\n * Handle a tool call in Convex environment.\n */\nasync function handleToolCall({\n toolName,\n input,\n overrides,\n customToolDefinitions,\n projectFiles,\n}: {\n toolName: string\n input: any\n overrides: NonNullable<ConvexClientOptions['overrideTools']>\n customToolDefinitions: Record<string, CustomToolDefinition>\n projectFiles?: Record<string, string>\n}): Promise<ToolResultOutput[]> {\n // Check for custom tool handler\n const customToolHandler = customToolDefinitions[toolName]\n if (customToolHandler) {\n return await customToolHandler.execute(input)\n }\n\n // Check for override\n let override = (overrides as any)[toolName]\n if (!override && toolName === 'str_replace') {\n override = (overrides as any)['write_file']\n }\n\n if (override) {\n return await override(input)\n }\n\n // Handle built-in tools\n switch (toolName) {\n case 'end_turn':\n return [{ type: 'json', value: { message: 'Turn ended.' } }]\n\n case 'read_files': {\n const files = await readFiles({\n filePaths: input.paths || input.filePaths || [],\n override: overrides.read_files,\n projectFiles,\n })\n return [{ type: 'json', value: files }]\n }\n\n case 'write_file':\n case 'str_replace':\n throw new ConvexUnsupportedToolError(\n toolName,\n 'File system write operations require an override in Convex',\n )\n\n case 'run_terminal_command':\n throw new ConvexUnsupportedToolError(\n 'run_terminal_command',\n 'child_process is not available in Convex runtime',\n )\n\n case 'code_search':\n throw new ConvexUnsupportedToolError(\n 'code_search',\n 'ripgrep/code search requires file system and process spawning',\n )\n\n case 'list_directory':\n throw new ConvexUnsupportedToolError(\n 'list_directory',\n 'File system access is not available in Convex',\n )\n\n case 'glob':\n throw new ConvexUnsupportedToolError(\n 'glob',\n 'File system access is not available in Convex',\n )\n\n case 'run_file_change_hooks':\n return [{\n type: 'json',\n value: { message: 'File change hooks are not supported in Convex mode' },\n }]\n\n default:\n throw new Error(\n `Tool not implemented in Convex SDK: ${toolName}. ` +\n `Please provide an override or modify your agent to not use this tool.`,\n )\n }\n}\n\n// ============================================================================\n// Main Run Function\n// ============================================================================\n\ntype ConvexRunExecutionOptions = ConvexRunOptions &\n ConvexClientOptions & {\n fingerprintId: string\n }\n\n/**\n * Build a simple system prompt for Convex agents.\n */\nfunction buildSystemPrompt(\n agentDefinition: AgentDefinition | undefined,\n projectFiles: Record<string, string>,\n): string {\n const parts: string[] = []\n\n // Add agent's system prompt if defined\n if (agentDefinition?.systemPrompt) {\n parts.push(agentDefinition.systemPrompt)\n } else {\n parts.push(\n 'You are a helpful AI assistant. Answer the user\\'s questions accurately and helpfully.',\n )\n }\n\n // Add file context\n const fileList = Object.keys(projectFiles)\n if (fileList.length > 0) {\n parts.push(`\\n\\n# Available Files\\n\\nThe following files are available:\\n${fileList.map((f) => `- ${f}`).join('\\n')}`)\n }\n\n return parts.join('\\n\\n')\n}\n\n/**\n * Build tools array for the API.\n */\nfunction buildToolsForApi(\n agentDefinition: AgentDefinition | undefined,\n customToolDefinitions: CustomToolDefinition[],\n): any[] | undefined {\n const tools: any[] = []\n\n // Add read_files tool\n tools.push({\n type: 'function',\n function: {\n name: 'read_files',\n description: 'Read the contents of one or more files',\n parameters: {\n type: 'object',\n properties: {\n paths: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of file paths to read',\n },\n },\n required: ['paths'],\n },\n },\n })\n\n // Add end_turn tool\n tools.push({\n type: 'function',\n function: {\n name: 'end_turn',\n description: 'End your turn when you have completed the task',\n parameters: {\n type: 'object',\n properties: {},\n },\n },\n })\n\n // Add custom tools\n for (const tool of customToolDefinitions) {\n tools.push({\n type: 'function',\n function: {\n name: tool.toolName,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n })\n }\n\n return tools.length > 0 ? tools : undefined\n}\n\n/**\n * Run an agent in Convex-compatible mode.\n */\nexport async function run(\n options: ConvexRunExecutionOptions,\n): Promise<ConvexRunState> {\n const {\n apiKey,\n fingerprintId,\n projectFiles = {},\n knowledgeFiles,\n agentDefinitions = [],\n maxAgentSteps = MAX_AGENT_STEPS_DEFAULT,\n handleEvent,\n handleStreamChunk,\n overrideTools = {},\n customToolDefinitions = [],\n logger,\n agent,\n prompt,\n content,\n params,\n previousRun,\n extraToolResults,\n signal,\n } = options\n\n if (signal?.aborted) {\n return {\n sessionState: previousRun?.sessionState,\n output: {\n type: 'error',\n message: createAbortError(signal).message,\n },\n }\n }\n\n // Get agent definition\n let agentDefinition: AgentDefinition | undefined\n let agentId: string\n\n if (typeof agent !== 'string') {\n agentDefinition = agent\n agentId = agent.id\n } else {\n agentId = agent\n agentDefinition = agentDefinitions.find((a) => a.id === agent)\n }\n\n // Initialize or restore session state\n let sessionState: SessionState\n if (previousRun?.sessionState) {\n sessionState = await convexApplyOverridesToSessionState(\n undefined,\n previousRun.sessionState,\n {\n knowledgeFiles,\n agentDefinitions,\n customToolDefinitions,\n projectFiles,\n maxAgentSteps,\n },\n )\n } else {\n sessionState = await convexInitialSessionState({\n cwd: undefined,\n knowledgeFiles,\n agentDefinitions,\n customToolDefinitions,\n projectFiles,\n maxAgentSteps,\n fs: createConvexStubFs(),\n spawn: createConvexStubSpawn(),\n logger,\n })\n }\n\n // Verify API key\n const userInfo = await getUserInfoFromApiKey(apiKey, ['id'], logger)\n if (!userInfo) {\n return {\n sessionState,\n output: {\n type: 'error',\n message: 'Authentication failed: Invalid API key or user not found',\n },\n }\n }\n\n // Start agent run\n const runId = await startAgentRun(\n apiKey,\n agentId,\n sessionState.mainAgentState.ancestorRunIds,\n logger,\n )\n if (!runId) {\n return {\n sessionState,\n output: {\n type: 'error',\n message: 'Failed to start agent run',\n },\n }\n }\n\n sessionState.mainAgentState.runId = runId\n\n // Build system prompt and tools\n const systemPrompt = buildSystemPrompt(agentDefinition, projectFiles)\n const tools = buildToolsForApi(agentDefinition, customToolDefinitions)\n const model = agentDefinition?.model || 'anthropic/claude-sonnet-4'\n\n // Build initial messages\n const messages: Message[] = [...sessionState.mainAgentState.messageHistory]\n\n // Add extra tool results if provided\n if (extraToolResults && extraToolResults.length > 0) {\n messages.push(...extraToolResults)\n }\n\n // Add user message\n const preparedContent = wrapContentForUserMessage(content)\n if (prompt || preparedContent) {\n messages.push(\n userMessage(buildUserMessageContent(prompt, params, preparedContent)),\n )\n }\n\n // Custom tool definitions as a map\n const customToolDefsMap: Record<string, CustomToolDefinition> =\n Object.fromEntries(customToolDefinitions.map((d) => [d.toolName, d]))\n\n let totalSteps = 0\n let creditsUsed = 0\n let fullResponse = ''\n\n try {\n // Agent loop\n while (totalSteps < maxAgentSteps) {\n if (signal?.aborted) {\n break\n }\n\n totalSteps++\n const openaiMessages = convertToOpenAIMessages(messages, systemPrompt)\n\n // Send start event\n if (handleEvent) {\n await handleEvent({\n type: 'start',\n agentId,\n model,\n messageHistoryLength: messages.length,\n })\n }\n\n let stepResponse = ''\n const toolCalls: { id: string; name: string; arguments: string }[] = []\n\n // Stream the response\n for await (const chunk of streamChatCompletion(\n apiKey,\n runId,\n model,\n openaiMessages,\n tools,\n signal,\n )) {\n if (chunk.type === 'text' && chunk.content) {\n stepResponse += chunk.content\n fullResponse += chunk.content\n if (handleStreamChunk) {\n await handleStreamChunk(chunk.content)\n }\n } else if (chunk.type === 'tool_call' && chunk.toolCall) {\n toolCalls.push(chunk.toolCall)\n } else if (chunk.type === 'done') {\n break\n }\n }\n\n // Add assistant message to history\n if (stepResponse || toolCalls.length > 0) {\n const assistantContent: any[] = []\n if (stepResponse) {\n assistantContent.push({ type: 'text', text: stepResponse })\n }\n for (const tc of toolCalls) {\n assistantContent.push({\n type: 'tool-call',\n toolCallId: tc.id,\n toolName: tc.name,\n input: JSON.parse(tc.arguments || '{}'),\n })\n }\n messages.push({\n role: 'assistant',\n content: assistantContent,\n sentAt: Date.now(),\n } as AssistantMessage)\n }\n\n // If no tool calls, we're done\n if (toolCalls.length === 0) {\n break\n }\n\n // Check for end_turn\n const hasEndTurn = toolCalls.some(\n (tc) => tc.name === 'end_turn' || tc.name === 'task_completed',\n )\n\n // Handle tool calls\n for (const tc of toolCalls) {\n if (tc.name === 'end_turn' || tc.name === 'task_completed') {\n // Add tool result for end_turn\n messages.push({\n role: 'tool',\n toolCallId: tc.id,\n toolName: tc.name,\n content: [{ type: 'json', value: { message: 'Turn ended.' } }],\n } as ToolMessage)\n continue\n }\n\n try {\n const input = JSON.parse(tc.arguments || '{}')\n const result = await handleToolCall({\n toolName: tc.name,\n input,\n overrides: overrideTools,\n customToolDefinitions: customToolDefsMap,\n projectFiles,\n })\n\n messages.push({\n role: 'tool',\n toolCallId: tc.id,\n toolName: tc.name,\n content: result,\n } as ToolMessage)\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n messages.push({\n role: 'tool',\n toolCallId: tc.id,\n toolName: tc.name,\n content: [{ type: 'json', value: { errorMessage } }],\n } as ToolMessage)\n }\n }\n\n if (hasEndTurn) {\n break\n }\n }\n\n // Update session state\n sessionState.mainAgentState.messageHistory = messages\n sessionState.mainAgentState.stepsRemaining = maxAgentSteps - totalSteps\n sessionState.mainAgentState.creditsUsed = creditsUsed\n\n // Finish agent run\n await finishAgentRun(\n apiKey,\n runId,\n 'completed',\n totalSteps,\n creditsUsed,\n creditsUsed,\n logger,\n )\n\n // Send finish event\n if (handleEvent) {\n await handleEvent({\n type: 'finish',\n agentId,\n totalCost: creditsUsed,\n })\n }\n\n return {\n sessionState,\n output: {\n type: 'lastMessage' as const,\n value: [{ role: 'assistant', content: fullResponse || 'Agent completed.' }],\n },\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const statusCode = getErrorStatusCode(error)\n\n // Finish agent run with error\n await finishAgentRun(\n apiKey,\n runId,\n 'failed',\n totalSteps,\n creditsUsed,\n creditsUsed,\n logger,\n )\n\n if (handleEvent) {\n await handleEvent({ type: 'error', message: errorMessage })\n }\n\n return {\n sessionState,\n output: {\n type: 'error',\n message: errorMessage,\n ...(statusCode !== undefined && { statusCode }),\n },\n }\n }\n}\n\n// ============================================================================\n// ConvexCodebuffClient Class\n// ============================================================================\n\n/**\n * Convex-compatible Codebuff client.\n *\n * This client is designed to work within Convex's sandboxed Node.js runtime.\n * It doesn't require file system or child_process access.\n */\nexport class ConvexCodebuffClient {\n public options: ConvexClientOptions & {\n fingerprintId: string\n }\n\n constructor(options: ConvexClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'Codebuff API key is required. Please provide an apiKey in the constructor of ConvexCodebuffClient.',\n )\n }\n\n this.options = {\n handleEvent: (event) => {\n if (event.type === 'error') {\n throw new Error(\n `Received error: ${event.message}.\\n\\nProvide a handleEvent function to handle this error.`,\n )\n }\n },\n fingerprintId: `codebuff-convex-sdk-${Math.random().toString(36).substring(2, 15)}`,\n ...options,\n }\n }\n\n /**\n * Run a Codebuff agent with the specified options.\n *\n * Note: In Convex mode, tools that require file system or process spawning\n * will throw ConvexUnsupportedToolError unless you provide overrides.\n */\n public async run(\n options: ConvexRunOptions & Partial<ConvexClientOptions>,\n ): Promise<ConvexRunState> {\n return run({ ...this.options, ...options })\n }\n\n /**\n * Check connection to the Codebuff backend.\n */\n public async checkConnection(): Promise<boolean> {\n try {\n const response = await fetch(`${WEBSITE_URL}/api/healthz`, {\n method: 'GET',\n signal: AbortSignal.timeout(5000),\n })\n\n if (!response.ok) return false\n\n const result = await response.json()\n return (\n typeof result === 'object' &&\n result !== null &&\n 'status' in result &&\n (result as { status?: unknown }).status === 'ok'\n )\n } catch {\n return false\n }\n }\n}\n\n// Re-export buildUserMessageContent for backward compatibility\nexport { buildUserMessageContent }\n"
|
|
15
|
-
],
|
|
16
|
-
"mappings": "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",
|
|
17
|
-
"debugId": "2692421F15293A7C64756E2164756E21",
|
|
18
|
-
"names": []
|
|
19
|
-
}
|
package/dist/convex.mjs.map
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../common/src/constants/agents.ts", "../../common/src/env-schema.ts", "../../common/src/env.ts", "../src/constants.ts", "../../common/src/types/session-state.ts", "../src/convex-session-state.ts", "../src/error-utils.ts", "../src/retry-config.ts", "../src/custom-tool.ts", "../src/convex-standalone.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import type { AgentTemplateTypes } from '../types/session-state'\n\n// Define agent personas with their shared characteristics\nexport const AGENT_PERSONAS = {\n // Base agents - all use Buffy persona\n base: {\n displayName: 'Buffy the Base Agent',\n purpose: 'Base agent that orchestrates the full response.',\n } as const,\n\n // Ask mode\n ask: {\n displayName: 'Ask Mode Agent',\n purpose: 'Base ask-mode agent that orchestrates the full response.',\n } as const,\n\n // Specialized agents\n thinker: {\n displayName: 'Theo the Theorizer',\n purpose:\n 'Does deep thinking given the current messages and a specific prompt to focus on. Use this to help you solve a specific problem.',\n } as const,\n 'file-explorer': {\n displayName: 'Dora The File Explorer',\n purpose: 'Expert at exploring a codebase and finding relevant files.',\n } as const,\n 'file-picker': {\n displayName: 'Fletcher the File Fetcher',\n purpose: 'Expert at finding relevant files in a codebase.',\n } as const,\n researcher: {\n displayName: 'Reid Searcher the Researcher',\n purpose: 'Expert at researching topics using web search and documentation.',\n } as const,\n planner: {\n displayName: 'Peter Plan',\n purpose: 'Agent that formulates a comprehensive plan to a prompt.',\n hidden: true,\n } as const,\n reviewer: {\n displayName: 'Nit Pick Nick the Reviewer',\n purpose:\n 'Reviews file changes and responds with critical feedback. Use this after making any significant change to the codebase; otherwise, no need to use this agent for minor changes since it takes a second.',\n } as const,\n 'agent-builder': {\n displayName: 'Bob the Agent Builder',\n purpose: 'Creates new agent templates for the codebuff multi-agent system',\n hidden: false,\n } as const,\n} as const satisfies Partial<\n Record<\n (typeof AgentTemplateTypes)[keyof typeof AgentTemplateTypes],\n { displayName: string; purpose: string; hidden?: boolean }\n >\n>\n\n// Agent IDs list from AGENT_PERSONAS keys\nexport const AGENT_IDS = Object.keys(\n AGENT_PERSONAS,\n) as (keyof typeof AGENT_PERSONAS)[]\n\n// Agent ID prefix constant\nexport const AGENT_ID_PREFIX = 'CodebuffAI/'\n\n// Agent names for client-side reference\nexport const AGENT_NAMES = Object.fromEntries(\n Object.entries(AGENT_PERSONAS).map(([agentType, persona]) => [\n agentType,\n persona.displayName,\n ]),\n) as Record<keyof typeof AGENT_PERSONAS, string>\n\nexport type AgentName =\n (typeof AGENT_PERSONAS)[keyof typeof AGENT_PERSONAS]['displayName']\n\n// Get unique agent names for UI display\nexport const UNIQUE_AGENT_NAMES = Array.from(\n new Set(\n Object.values(AGENT_PERSONAS)\n .filter((persona) => !('hidden' in persona) || !persona.hidden)\n .map((persona) => persona.displayName),\n ),\n)\n\n// Map from display name back to agent types (for parsing user input)\nexport const AGENT_NAME_TO_TYPES = Object.entries(AGENT_NAMES).reduce(\n (acc, [type, name]) => {\n if (!acc[name]) acc[name] = []\n acc[name].push(type)\n return acc\n },\n {} as Record<string, string[]>,\n)\n\nexport const MAX_AGENT_STEPS_DEFAULT = 100\n",
|
|
6
|
-
"import z from 'zod/v4'\n\nexport const CLIENT_ENV_PREFIX = 'NEXT_PUBLIC_'\n\nexport const clientEnvSchema = z.object({\n NEXT_PUBLIC_CB_ENVIRONMENT: z.enum(['dev', 'test', 'prod']),\n NEXT_PUBLIC_CODEBUFF_APP_URL: z.url().min(1),\n NEXT_PUBLIC_SUPPORT_EMAIL: z.email().min(1),\n NEXT_PUBLIC_POSTHOG_API_KEY: z.string().min(1),\n NEXT_PUBLIC_POSTHOG_HOST_URL: z.url().min(1),\n NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: z.string().min(1),\n NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL: z.url().min(1),\n NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION_ID: z.string().optional(),\n NEXT_PUBLIC_WEB_PORT: z.coerce.number().min(1000),\n} satisfies Record<`${typeof CLIENT_ENV_PREFIX}${string}`, any>)\nexport const clientEnvVars = clientEnvSchema.keyof().options\nexport type ClientEnvVar = (typeof clientEnvVars)[number]\nexport type ClientInput = {\n [K in (typeof clientEnvVars)[number]]: string | undefined\n}\nexport type ClientEnv = z.infer<typeof clientEnvSchema>\n\n// Bun will inject all these values, so we need to reference them individually (no for-loops)\nexport const clientProcessEnv: ClientInput = {\n NEXT_PUBLIC_CB_ENVIRONMENT: process.env.NEXT_PUBLIC_CB_ENVIRONMENT,\n NEXT_PUBLIC_CODEBUFF_APP_URL: process.env.NEXT_PUBLIC_CODEBUFF_APP_URL,\n NEXT_PUBLIC_SUPPORT_EMAIL: process.env.NEXT_PUBLIC_SUPPORT_EMAIL,\n NEXT_PUBLIC_POSTHOG_API_KEY: process.env.NEXT_PUBLIC_POSTHOG_API_KEY,\n NEXT_PUBLIC_POSTHOG_HOST_URL: process.env.NEXT_PUBLIC_POSTHOG_HOST_URL,\n NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY:\n process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,\n NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL:\n process.env.NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL,\n NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION_ID:\n process.env.NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION_ID,\n NEXT_PUBLIC_WEB_PORT: process.env.NEXT_PUBLIC_WEB_PORT,\n}\n",
|
|
7
|
-
"import { clientEnvSchema, clientProcessEnv } from './env-schema'\n\nconst parsedEnv = clientEnvSchema.safeParse(clientProcessEnv)\nif (!parsedEnv.success) {\n throw parsedEnv.error\n}\n\nexport const env = parsedEnv.data\n\n// Only log environment in non-production\nif (env.NEXT_PUBLIC_CB_ENVIRONMENT !== 'prod') {\n console.log('Using environment:', env.NEXT_PUBLIC_CB_ENVIRONMENT)\n}\n\n// Derived environment constants for convenience\nexport const IS_DEV = env.NEXT_PUBLIC_CB_ENVIRONMENT === 'dev'\nexport const IS_TEST = env.NEXT_PUBLIC_CB_ENVIRONMENT === 'test'\nexport const IS_PROD = env.NEXT_PUBLIC_CB_ENVIRONMENT === 'prod'\nexport const IS_CI = process.env.CODEBUFF_GITHUB_ACTIONS === 'true'\n\n// Debug flag for logging analytics events in dev mode\n// Set to true when actively debugging analytics - affects both CLI and backend\nexport const DEBUG_ANALYTICS = false\n",
|
|
8
|
-
"import { env, IS_DEV, IS_TEST, IS_PROD } from '@codebuff/common/env'\n\nexport { IS_DEV, IS_TEST, IS_PROD }\n\nexport const CODEBUFF_BINARY = 'codebuff'\n\nexport const WEBSITE_URL = env.NEXT_PUBLIC_CODEBUFF_APP_URL\n",
|
|
9
|
-
"import { z } from 'zod/v4'\n\nimport { MAX_AGENT_STEPS_DEFAULT } from '../constants/agents'\n\nimport type { Message } from './messages/codebuff-message'\nimport type { ProjectFileContext } from '../util/file'\n\nexport const toolCallSchema = z.object({\n toolName: z.string(),\n toolCallId: z.string(),\n input: z.record(z.string(), z.any()),\n})\nexport type ToolCall = z.infer<typeof toolCallSchema>\n\nexport const subgoalSchema = z.object({\n objective: z.string().optional(),\n status: z\n .enum(['NOT_STARTED', 'IN_PROGRESS', 'COMPLETE', 'ABORTED'])\n .optional(),\n plan: z.string().optional(),\n logs: z.string().array(),\n})\nexport type Subgoal = z.infer<typeof subgoalSchema>\n\nexport type AgentState = {\n /**\n * @deprecated agentId is replaced by runId\n */\n agentId: string\n agentType: AgentTemplateType | null\n agentContext: Record<string, Subgoal>\n ancestorRunIds: string[]\n runId?: string\n subagents: AgentState[]\n childRunIds: string[]\n messageHistory: Message[]\n stepsRemaining: number\n creditsUsed: number\n directCreditsUsed: number\n output?: Record<string, any>\n parentId?: string\n systemPrompt: string\n toolDefinitions: Record<\n string,\n { description: string | undefined; inputSchema: {} }\n >\n /**\n * The accurate token count from the Anthropic API.\n * This is updated on every agent step via the /api/v1/token-count endpoint.\n */\n contextTokenCount: number\n}\n\nexport const AgentOutputSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('structuredOutput'),\n value: z.record(z.string(), z.any()).or(z.null()),\n }),\n z.object({\n type: z.literal('lastMessage'),\n value: z.array(z.any()), // Array of assistant and tool messages from the last turn, including tool results\n }),\n z.object({\n type: z.literal('allMessages'),\n value: z.array(z.any()),\n }),\n z.object({\n type: z.literal('error'),\n message: z.string(),\n statusCode: z.number().optional(),\n }),\n])\nexport type AgentOutput = z.infer<typeof AgentOutputSchema>\n\nexport const AgentTemplateTypeList = [\n // Base agents\n 'base',\n 'base_lite',\n 'base_max',\n 'base_experimental',\n 'claude4_gemini_thinking',\n 'superagent',\n 'base_agent_builder',\n\n // Ask mode\n 'ask',\n\n // Planning / Thinking\n 'planner',\n 'dry_run',\n 'thinker',\n\n // Other agents\n 'file_picker',\n 'file_explorer',\n 'researcher',\n 'reviewer',\n 'agent_builder',\n 'example_programmatic',\n] as const\ntype UnderscoreToDash<S extends string> = S extends `${infer L}_${infer R}`\n ? `${L}-${UnderscoreToDash<R>}` // recurse on the remainder\n : S\nexport const AgentTemplateTypes = Object.fromEntries(\n AgentTemplateTypeList.map((name) => [name, name.replaceAll('_', '-')]),\n) as { [K in (typeof AgentTemplateTypeList)[number]]: UnderscoreToDash<K> }\nconst agentTemplateTypeSchema = z.enum(AgentTemplateTypeList)\n// Allow dynamic agent types by extending the base enum with string\nexport type AgentTemplateType =\n | z.infer<typeof agentTemplateTypeSchema>\n | (string & {})\n\nexport type SessionState = {\n fileContext: ProjectFileContext\n mainAgentState: AgentState\n}\n\nexport function getInitialAgentState(): AgentState {\n return {\n agentId: 'main-agent',\n agentType: null,\n agentContext: {},\n ancestorRunIds: [],\n runId: undefined,\n subagents: [],\n childRunIds: [],\n messageHistory: [],\n stepsRemaining: MAX_AGENT_STEPS_DEFAULT,\n creditsUsed: 0,\n directCreditsUsed: 0,\n output: undefined,\n parentId: undefined,\n systemPrompt: '',\n toolDefinitions: {},\n contextTokenCount: 0,\n }\n}\nexport function getInitialSessionState(\n fileContext: ProjectFileContext,\n): SessionState {\n return {\n mainAgentState: getInitialAgentState(),\n fileContext,\n }\n}\n",
|
|
10
|
-
"/**\n * Convex-specific session state management.\n * \n * This module provides session state initialization for Convex environments\n * WITHOUT any tree-sitter or @codebuff/code-map dependencies.\n * \n * The regular run-state.ts imports from @codebuff/code-map which bundles\n * web-tree-sitter WASM modules that don't work in Convex's runtime.\n */\n\nimport { getInitialSessionState } from '@codebuff/common/types/session-state'\nimport z from 'zod/v4'\n\nimport type { CustomToolDefinition } from './custom-tool'\nimport type { AgentDefinition } from '@codebuff/common/templates/initial-agents-dir/types/agent-definition'\nimport type { Logger } from '@codebuff/common/types/contracts/logger'\nimport type { CodebuffFileSystem } from '@codebuff/common/types/filesystem'\nimport type {\n AgentOutput,\n SessionState,\n} from '@codebuff/common/types/session-state'\nimport type { CodebuffSpawn } from '@codebuff/common/types/spawn'\nimport type {\n CustomToolDefinitions,\n FileTreeNode,\n} from '@codebuff/common/util/file'\n\nexport type ConvexRunState = {\n sessionState?: SessionState\n output: AgentOutput\n}\n\n// Alias for backward compatibility\nexport type RunState = ConvexRunState\n\nexport type ConvexInitialSessionStateOptions = {\n cwd?: string\n projectFiles?: Record<string, string>\n knowledgeFiles?: Record<string, string>\n agentDefinitions?: AgentDefinition[]\n customToolDefinitions?: CustomToolDefinition[]\n maxAgentSteps?: number\n fs?: CodebuffFileSystem\n spawn?: CodebuffSpawn\n logger?: Logger\n}\n\n/**\n * Processes agent definitions array and converts handleSteps functions to strings\n */\nfunction processAgentDefinitions(\n agentDefinitions: AgentDefinition[],\n): Record<string, any> {\n const processedAgentTemplates: Record<string, any> = {}\n agentDefinitions.forEach((definition) => {\n const processedConfig = { ...definition } as Record<string, any>\n if (\n processedConfig.handleSteps &&\n typeof processedConfig.handleSteps === 'function'\n ) {\n processedConfig.handleSteps = processedConfig.handleSteps.toString()\n }\n if (processedConfig.id) {\n processedAgentTemplates[processedConfig.id] = processedConfig\n }\n })\n return processedAgentTemplates\n}\n\n/**\n * Processes custom tool definitions into the format expected by SessionState.\n * Converts Zod schemas to JSON Schema format so they can survive JSON serialization.\n */\nfunction processCustomToolDefinitions(\n customToolDefinitions: CustomToolDefinition[],\n): CustomToolDefinitions {\n return Object.fromEntries(\n customToolDefinitions.map((toolDefinition) => {\n // Convert Zod schema to JSON Schema format so it survives JSON serialization\n const jsonSchema = z.toJSONSchema(toolDefinition.inputSchema, {\n io: 'input',\n }) as Record<string, unknown>\n delete jsonSchema['$schema']\n\n return [\n toolDefinition.toolName,\n {\n inputSchema: jsonSchema,\n description: toolDefinition.description,\n endsAgentStep: toolDefinition.endsAgentStep,\n exampleInputs: toolDefinition.exampleInputs,\n },\n ]\n }),\n )\n}\n\n/**\n * Builds a hierarchical file tree from a flat list of file paths\n */\nfunction buildFileTree(filePaths: string[]): FileTreeNode[] {\n const tree: Record<string, FileTreeNode> = {}\n\n // Build the tree structure\n for (const filePath of filePaths) {\n const parts = filePath.split('/')\n\n for (let i = 0; i < parts.length; i++) {\n const currentPath = parts.slice(0, i + 1).join('/')\n const isFile = i === parts.length - 1\n\n if (!tree[currentPath]) {\n tree[currentPath] = {\n name: parts[i],\n type: isFile ? 'file' : 'directory',\n filePath: currentPath,\n children: isFile ? undefined : [],\n }\n }\n }\n }\n\n // Organize into hierarchical structure\n const rootNodes: FileTreeNode[] = []\n const processed = new Set<string>()\n\n for (const [path, node] of Object.entries(tree)) {\n if (processed.has(path)) continue\n\n const parentPath = path.substring(0, path.lastIndexOf('/'))\n if (parentPath && tree[parentPath]) {\n const parent = tree[parentPath]\n if (\n parent.children &&\n !parent.children.some((child) => child.filePath === path)\n ) {\n parent.children.push(node)\n }\n } else {\n rootNodes.push(node)\n }\n processed.add(path)\n }\n\n // Sort function for nodes\n function sortNodes(nodes: FileTreeNode[]): void {\n nodes.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'directory' ? -1 : 1\n }\n return a.name.localeCompare(b.name)\n })\n\n for (const node of nodes) {\n if (node.children) {\n sortNodes(node.children)\n }\n }\n }\n\n sortNodes(rootNodes)\n return rootNodes\n}\n\n/**\n * Selects knowledge files from a list of file paths with fallback logic.\n */\nfunction selectKnowledgeFilePaths(allFilePaths: string[]): string[] {\n const knowledgeCandidates = allFilePaths.filter((filePath) => {\n const lowercaseFilePath = filePath.toLowerCase()\n return (\n lowercaseFilePath.endsWith('knowledge.md') ||\n lowercaseFilePath.endsWith('agents.md') ||\n lowercaseFilePath.endsWith('claude.md')\n )\n })\n\n // Group candidates by directory\n const byDirectory = new Map<string, string[]>()\n for (const filePath of knowledgeCandidates) {\n const lastSlash = filePath.lastIndexOf('/')\n const dir = lastSlash >= 0 ? filePath.substring(0, lastSlash) : ''\n if (!byDirectory.has(dir)) {\n byDirectory.set(dir, [])\n }\n byDirectory.get(dir)!.push(filePath)\n }\n\n const selectedFiles: string[] = []\n\n for (const files of byDirectory.values()) {\n const knowledgeMd = files.find((f) =>\n f.toLowerCase().endsWith('knowledge.md'),\n )\n const agentsMd = files.find((f) => f.toLowerCase().endsWith('agents.md'))\n const claudeMd = files.find((f) => f.toLowerCase().endsWith('claude.md'))\n\n const selectedKnowledgeFile = knowledgeMd || agentsMd || claudeMd\n if (selectedKnowledgeFile) {\n selectedFiles.push(selectedKnowledgeFile)\n }\n }\n\n return selectedFiles\n}\n\n/**\n * Auto-derives knowledge files from project files if knowledgeFiles is undefined.\n */\nfunction deriveKnowledgeFiles(\n projectFiles: Record<string, string>,\n): Record<string, string> {\n const allFilePaths = Object.keys(projectFiles)\n const selectedFilePaths = selectKnowledgeFilePaths(allFilePaths)\n\n const knowledgeFiles: Record<string, string> = {}\n for (const filePath of selectedFilePaths) {\n knowledgeFiles[filePath] = projectFiles[filePath]\n }\n return knowledgeFiles\n}\n\n/**\n * Convex-specific initial session state.\n * \n * This version does NOT use tree-sitter for token scoring.\n * Token scoring is skipped entirely in Convex environments.\n */\nexport async function convexInitialSessionState(\n params: ConvexInitialSessionStateOptions,\n): Promise<SessionState> {\n const { cwd, maxAgentSteps, fs, spawn, logger } = params\n let { agentDefinitions, customToolDefinitions, projectFiles, knowledgeFiles } =\n params\n\n if (!agentDefinitions) {\n agentDefinitions = []\n }\n if (!customToolDefinitions) {\n customToolDefinitions = []\n }\n\n // In Convex, we don't auto-discover project files (no filesystem)\n if (projectFiles === undefined) {\n projectFiles = {}\n }\n if (knowledgeFiles === undefined) {\n knowledgeFiles = projectFiles ? deriveKnowledgeFiles(projectFiles) : {}\n }\n\n const processedAgentTemplates =\n agentDefinitions.length > 0\n ? processAgentDefinitions(agentDefinitions)\n : {}\n\n const processedCustomToolDefinitions = processCustomToolDefinitions(\n customToolDefinitions,\n )\n\n // Build file tree from projectFiles (no token scoring in Convex)\n const filePaths = Object.keys(projectFiles).sort()\n const fileTree = buildFileTree(filePaths)\n \n // No token scoring in Convex - skip entirely\n const fileTokenScores: Record<string, any> = {}\n const tokenCallers: Record<string, any> = {}\n\n // No git changes in Convex (no filesystem/child_process)\n const gitChanges = {\n status: '',\n diff: '',\n diffCached: '',\n lastCommitMessages: '',\n }\n\n const initialState = getInitialSessionState({\n projectRoot: cwd ?? '/convex',\n cwd: cwd ?? '/convex',\n fileTree,\n fileTokenScores,\n tokenCallers,\n knowledgeFiles,\n userKnowledgeFiles: {},\n agentTemplates: processedAgentTemplates,\n customToolDefinitions: processedCustomToolDefinitions,\n gitChanges,\n changesSinceLastChat: {},\n shellConfigFiles: {},\n systemInfo: {\n platform: 'linux', // Convex runs on Linux\n shell: 'bash',\n nodeVersion: process.version,\n arch: 'x64',\n homedir: '/tmp',\n cpus: 1,\n },\n })\n\n if (maxAgentSteps) {\n initialState.mainAgentState.stepsRemaining = maxAgentSteps\n }\n\n return initialState\n}\n\n/**\n * Applies overrides to an existing session state for Convex.\n * \n * This version does NOT use tree-sitter for token scoring.\n */\nexport async function convexApplyOverridesToSessionState(\n cwd: string | undefined,\n baseSessionState: SessionState,\n overrides: {\n projectFiles?: Record<string, string>\n knowledgeFiles?: Record<string, string>\n agentDefinitions?: AgentDefinition[]\n customToolDefinitions?: CustomToolDefinition[]\n maxAgentSteps?: number\n },\n): Promise<SessionState> {\n // Deep clone to avoid mutating the original session state\n const sessionState = JSON.parse(\n JSON.stringify(baseSessionState),\n ) as SessionState\n\n // Apply maxAgentSteps override\n if (overrides.maxAgentSteps !== undefined) {\n sessionState.mainAgentState.stepsRemaining = overrides.maxAgentSteps\n }\n\n // Apply projectFiles override (just build file tree, no token scoring)\n if (overrides.projectFiles !== undefined) {\n const filePaths = Object.keys(overrides.projectFiles).sort()\n sessionState.fileContext.fileTree = buildFileTree(filePaths)\n // No token scoring in Convex\n sessionState.fileContext.fileTokenScores = {}\n sessionState.fileContext.tokenCallers = {}\n\n // Auto-derive knowledgeFiles if not explicitly provided\n if (overrides.knowledgeFiles === undefined) {\n sessionState.fileContext.knowledgeFiles = deriveKnowledgeFiles(\n overrides.projectFiles,\n )\n }\n }\n\n // Apply knowledgeFiles override\n if (overrides.knowledgeFiles !== undefined) {\n sessionState.fileContext.knowledgeFiles = overrides.knowledgeFiles\n }\n\n // Apply agentDefinitions override (merge by id, last-in wins)\n if (overrides.agentDefinitions !== undefined) {\n const processedAgentTemplates = processAgentDefinitions(\n overrides.agentDefinitions,\n )\n sessionState.fileContext.agentTemplates = {\n ...sessionState.fileContext.agentTemplates,\n ...processedAgentTemplates,\n }\n }\n\n // Apply customToolDefinitions override (replace by toolName)\n if (overrides.customToolDefinitions !== undefined) {\n const processedCustomToolDefinitions = processCustomToolDefinitions(\n overrides.customToolDefinitions,\n )\n sessionState.fileContext.customToolDefinitions = {\n ...sessionState.fileContext.customToolDefinitions,\n ...processedCustomToolDefinitions,\n }\n }\n\n return sessionState\n}\n",
|
|
11
|
-
"/**\n * SDK Error Utilities\n *\n * Simple utilities for error handling based on HTTP status codes.\n * Uses the AI SDK's error types which include statusCode property.\n */\n\n/**\n * Error type with statusCode property\n */\nexport type HttpError = Error & { statusCode: number }\n\n/**\n * HTTP status codes that should trigger automatic retry\n */\nexport const RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504])\n\n// ============================================================================\n// Error Factory Functions\n// ============================================================================\n\n/**\n * Creates an Error with a statusCode property\n */\nexport function createHttpError(message: string, statusCode: number): HttpError {\n const error = new Error(message) as HttpError\n error.statusCode = statusCode\n return error\n}\n\n/**\n * Creates an authentication error (401)\n */\nexport function createAuthError(message = 'Authentication failed'): HttpError {\n return createHttpError(message, 401)\n}\n\n/**\n * Creates a forbidden error (403)\n */\nexport function createForbiddenError(message = 'Access forbidden'): HttpError {\n return createHttpError(message, 403)\n}\n\n/**\n * Creates a payment required error (402)\n */\nexport function createPaymentRequiredError(message = 'Payment required'): HttpError {\n return createHttpError(message, 402)\n}\n\n/**\n * Creates a server error (500 by default, or custom 5xx)\n */\nexport function createServerError(message = 'Server error', statusCode = 500): HttpError {\n return createHttpError(message, statusCode)\n}\n\n/**\n * Creates a network error (503 - service unavailable)\n * Used for connection failures, DNS errors, timeouts, etc.\n */\nexport function createNetworkError(message = 'Network error'): HttpError {\n return createHttpError(message, 503)\n}\n\n/**\n * Checks if an HTTP status code is retryable\n */\nexport function isRetryableStatusCode(statusCode: number | undefined): boolean {\n if (statusCode === undefined) return false\n return RETRYABLE_STATUS_CODES.has(statusCode)\n}\n\n/**\n * Extracts the statusCode from an error if available\n */\nexport function getErrorStatusCode(error: unknown): number | undefined {\n if (error && typeof error === 'object' && 'statusCode' in error) {\n const statusCode = (error as { statusCode: unknown }).statusCode\n if (typeof statusCode === 'number') {\n return statusCode\n }\n }\n return undefined\n}\n\n/**\n * Sanitizes error messages for display\n * Removes sensitive information and formats for user consumption\n */\nexport function sanitizeErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message\n }\n if (typeof error === 'string') {\n return error\n }\n if (error && typeof error === 'object' && 'message' in error) {\n const message = (error as { message: unknown }).message\n if (typeof message === 'string') {\n return message\n }\n }\n return String(error)\n}\n",
|
|
12
|
-
"/**\n * Retry Configuration Constants\n *\n * This module defines constants for retry behavior and exponential backoff.\n * Used by the CLI to automatically retry failed messages after reconnection.\n *\n * @example\n * ```typescript\n * import { MAX_RETRIES_PER_MESSAGE, RETRY_BACKOFF_BASE_DELAY_MS } from '@codebuff/sdk'\n *\n * let retryCount = 0\n * let backoffDelay = RETRY_BACKOFF_BASE_DELAY_MS\n *\n * while (retryCount < MAX_RETRIES_PER_MESSAGE) {\n * await new Promise(resolve => setTimeout(resolve, backoffDelay))\n * // ... retry logic\n * backoffDelay = Math.min(backoffDelay * 2, RETRY_BACKOFF_MAX_DELAY_MS)\n * retryCount++\n * }\n * ```\n */\n\n/**\n * Maximum number of retry attempts per message\n * After this many attempts, the message is marked as permanently failed\n */\nexport const MAX_RETRIES_PER_MESSAGE = 3\n\n/**\n * Base delay in milliseconds for exponential backoff\n * First retry: 1s, Second: 2s, Third: 4s, Fourth: 8s (capped)\n */\nexport const RETRY_BACKOFF_BASE_DELAY_MS = 1000\n\n/**\n * Maximum delay in milliseconds for exponential backoff\n * Prevents backoff from growing indefinitely\n */\nexport const RETRY_BACKOFF_MAX_DELAY_MS = 8000\n\n/**\n * Duration in milliseconds to show the reconnection message\n * After this time, the message auto-hides\n */\nexport const RECONNECTION_MESSAGE_DURATION_MS = 2000\n\n/**\n * Delay in milliseconds before retrying messages after reconnection\n * Gives the connection time to stabilize before attempting retries\n */\nexport const RECONNECTION_RETRY_DELAY_MS = 500\n",
|
|
13
|
-
"import type { ToolName } from '../../common/src/tools/constants'\nimport type { ToolResultOutput } from '../../common/src/types/messages/content-part'\nimport type { z } from 'zod/v4'\n\nexport type CustomToolDefinition<\n N extends string = string,\n Args extends any = any,\n Input extends any = any,\n> = {\n toolName: N\n inputSchema: z.ZodType<Args, Input>\n description: string\n endsAgentStep: boolean\n exampleInputs: Input[]\n execute: (params: Args) => Promise<ToolResultOutput[]>\n}\n\n/**\n * Creates a CustomToolDefinition object\n *\n * @param toolName the name of the tool\n * @param inputSchema a Zod4 schema describing the input of the tool.\n * @param description a description of the tool to be passed to the LLM. This should describe what the tool does and when to use it.\n * @param endsAgentStep whether the tool ends the agent step. If `true`, this will be used as a \"stop sequence\" for the LLM. i.e. it will not be able to call any other tools after this one in a single step and must wait for the tool results. Used for tools that give more information to the LLM.\n * @param exampleInputs an array of example inputs for the tool.\n * @param execute what to do when the tool is called. Can be either a sync or async. Must return an array of {@linkcode ToolResultOutput}\n * @returns a {@linkcode CustomToolDefinition} object\n */\nexport function getCustomToolDefinition<\n TN extends string,\n Args extends any,\n Input extends any,\n>({\n toolName,\n inputSchema,\n description,\n endsAgentStep = true,\n exampleInputs = [],\n execute,\n}: {\n toolName: TN extends ToolName\n ? TN & {\n error: `Hi there. This is a message from the Codebuff team: You have used a custom tool where you needed to use overrideTools instead for name: ${TN}`\n }\n : TN\n inputSchema: z.ZodType<Args, Input>\n description: string\n endsAgentStep?: boolean\n exampleInputs?: Input[]\n execute: (params: Args) => Promise<ToolResultOutput[]> | ToolResultOutput[]\n}): CustomToolDefinition<TN, Args, Input> {\n return {\n toolName,\n inputSchema,\n description,\n endsAgentStep,\n exampleInputs,\n execute: async (params) => {\n return await execute(params)\n },\n }\n}\n",
|
|
14
|
-
"/**\n * Standalone Convex-compatible Codebuff client.\n *\n * This module provides a completely standalone SDK for Convex that:\n * - Does NOT import from @codebuff/agent-runtime (avoids tree-sitter)\n * - Makes direct HTTP calls to the Codebuff API\n * - Implements a minimal agent loop for tool handling\n *\n * Usage:\n * ```ts\n * import { ConvexCodebuffClient } from '@fatagnus/codebuff/convex'\n *\n * const client = new ConvexCodebuffClient({\n * apiKey: 'your-api-key',\n * projectFiles: { 'src/index.ts': 'console.log(\"hello\")' },\n * })\n *\n * const result = await client.run({\n * agent: 'base',\n * prompt: 'Explain this code',\n * })\n * ```\n */\n\nimport { MAX_AGENT_STEPS_DEFAULT } from '@codebuff/common/constants/agents'\n\nimport { WEBSITE_URL } from './constants'\nimport {\n convexInitialSessionState,\n convexApplyOverridesToSessionState,\n} from './convex-session-state'\nimport {\n getErrorStatusCode,\n createAuthError,\n createNetworkError,\n createHttpError,\n} from './error-utils'\nimport {\n MAX_RETRIES_PER_MESSAGE,\n RETRY_BACKOFF_BASE_DELAY_MS,\n RETRY_BACKOFF_MAX_DELAY_MS,\n} from './retry-config'\n\nimport type { CustomToolDefinition } from './custom-tool'\nimport type { ConvexRunState } from './convex-session-state'\nimport type { AgentDefinition } from '@codebuff/common/templates/initial-agents-dir/types/agent-definition'\nimport type {\n PublishedToolName,\n ToolName,\n} from '@codebuff/common/tools/constants'\nimport type {\n ClientToolCall,\n ClientToolName,\n CodebuffToolOutput,\n PublishedClientToolName,\n} from '@codebuff/common/tools/list'\nimport type { Logger } from '@codebuff/common/types/contracts/logger'\nimport type { CodebuffFileSystem } from '@codebuff/common/types/filesystem'\nimport type {\n Message,\n ToolMessage,\n AssistantMessage,\n UserMessage,\n} from '@codebuff/common/types/messages/codebuff-message'\nimport type {\n ImagePart,\n TextPart,\n ToolResultOutput,\n} from '@codebuff/common/types/messages/content-part'\nimport type { PrintModeEvent } from '@codebuff/common/types/print-mode'\nimport type { SessionState } from '@codebuff/common/types/session-state'\nimport type { CodebuffSpawn } from '@codebuff/common/types/spawn'\n\n// Re-export types that don't require Node.js built-ins\nexport type * from '@codebuff/common/types/json'\nexport type * from '@codebuff/common/types/messages/codebuff-message'\nexport type * from '@codebuff/common/types/messages/data-content'\nexport type * from '@codebuff/common/types/print-mode'\nexport type {\n TextPart,\n ImagePart,\n} from '@codebuff/common/types/messages/content-part'\nexport type { AgentDefinition } from '@codebuff/common/templates/initial-agents-dir/types/agent-definition'\nexport type { ToolName } from '@codebuff/common/tools/constants'\nexport type {\n ClientToolCall,\n ClientToolName,\n CodebuffToolOutput,\n} from '@codebuff/common/tools/list'\nexport * from './custom-tool'\nexport * from './convex-session-state'\nexport * from './constants'\n\n// Error utilities (don't require Node.js built-ins)\nexport {\n isRetryableStatusCode,\n getErrorStatusCode,\n sanitizeErrorMessage,\n RETRYABLE_STATUS_CODES,\n createHttpError,\n createAuthError,\n createForbiddenError,\n createPaymentRequiredError,\n createServerError,\n createNetworkError,\n} from './error-utils'\nexport type { HttpError } from './error-utils'\n\n// Retry configuration constants\nexport {\n MAX_RETRIES_PER_MESSAGE,\n RETRY_BACKOFF_BASE_DELAY_MS,\n RETRY_BACKOFF_MAX_DELAY_MS,\n RECONNECTION_MESSAGE_DURATION_MS,\n RECONNECTION_RETRY_DELAY_MS,\n} from './retry-config'\n\nexport type { CodebuffFileSystem } from '@codebuff/common/types/filesystem'\n\n/**\n * Error thrown when a tool that requires Node.js built-ins is called in Convex\n */\nexport class ConvexUnsupportedToolError extends Error {\n constructor(toolName: string, reason: string) {\n super(\n `Tool \"${toolName}\" is not supported in Convex runtime: ${reason}. ` +\n `Either provide an override via overrideTools, or modify your agent to not use this tool.`,\n )\n this.name = 'ConvexUnsupportedToolError'\n }\n}\n\nexport type ImageContent = {\n type: 'image'\n image: string // base64 encoded\n mediaType: string\n}\n\nexport type TextContent = {\n type: 'text'\n text: string\n}\n\nexport type MessageContent = TextContent | ImageContent\n\nexport type ConvexRunOptions = {\n agent: string | AgentDefinition\n prompt: string\n /** Content array for multimodal messages (text + images) */\n content?: MessageContent[]\n params?: Record<string, unknown>\n previousRun?: ConvexRunState\n extraToolResults?: ToolMessage[]\n signal?: AbortSignal\n}\n\nexport type ConvexClientOptions = {\n apiKey: string\n\n /**\n * Project files as a plain object. Keys are file paths, values are file contents.\n * Required in Convex since there's no file system access.\n */\n projectFiles?: Record<string, string>\n knowledgeFiles?: Record<string, string>\n agentDefinitions?: AgentDefinition[]\n maxAgentSteps?: number\n\n handleEvent?: (event: PrintModeEvent) => void | Promise<void>\n handleStreamChunk?: (\n chunk:\n | string\n | {\n type: 'subagent_chunk'\n agentId: string\n agentType: string\n chunk: string\n }\n | {\n type: 'reasoning_chunk'\n agentId: string\n ancestorRunIds: string[]\n chunk: string\n },\n ) => void | Promise<void>\n\n /**\n * Override tools with custom implementations.\n * In Convex, you MUST provide overrides for file operations if you need them,\n * since there's no file system access.\n */\n overrideTools?: Partial<\n {\n [K in ClientToolName & PublishedToolName]: (\n input: ClientToolCall<K>['input'],\n ) => Promise<CodebuffToolOutput<K>>\n } & {\n read_files: (input: {\n filePaths: string[]\n }) => Promise<Record<string, string | null>>\n }\n >\n customToolDefinitions?: CustomToolDefinition[]\n\n logger?: Logger\n}\n\n// ============================================================================\n// Standalone Utilities (no agent-runtime imports)\n// ============================================================================\n\n/**\n * Build user message content from prompt, params, and content parts.\n * Reimplemented locally to avoid agent-runtime import.\n */\nfunction buildUserMessageContent(\n prompt?: string,\n params?: Record<string, unknown>,\n content?: (TextPart | ImagePart)[],\n): (TextPart | ImagePart)[] {\n const parts: (TextPart | ImagePart)[] = []\n\n // Add existing content parts\n if (content && content.length > 0) {\n parts.push(...content)\n }\n\n // Build text content from prompt and params\n let textContent = ''\n if (prompt) {\n textContent += `<user_message>\\n${prompt}\\n</user_message>`\n }\n if (params && Object.keys(params).length > 0) {\n textContent += `\\n\\n<params>\\n${JSON.stringify(params, null, 2)}\\n</params>`\n }\n\n if (textContent) {\n parts.push({ type: 'text', text: textContent })\n }\n\n return parts.length > 0 ? parts : [{ type: 'text', text: '' }]\n}\n\n/**\n * Wraps content for user messages, ensuring text is wrapped in <user_message> tags.\n */\nconst wrapContentForUserMessage = (\n content?: (TextPart | ImagePart)[],\n): (TextPart | ImagePart)[] | undefined => {\n if (!content || content.length === 0) {\n return content\n }\n return buildUserMessageContent(undefined, undefined, content)\n}\n\n/**\n * Create a user message.\n */\nfunction userMessage(content: string | (TextPart | ImagePart)[]): UserMessage {\n const contentArray: (TextPart | ImagePart)[] =\n typeof content === 'string' ? [{ type: 'text', text: content }] : content\n return {\n role: 'user',\n content: contentArray,\n sentAt: Date.now(),\n }\n}\n\n/**\n * Create an assistant message.\n */\nfunction assistantMessage(content: string): AssistantMessage {\n return {\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n sentAt: Date.now(),\n }\n}\n\nconst createAbortError = (signal?: AbortSignal) => {\n if (signal?.reason instanceof Error) {\n return signal.reason\n }\n const error = new Error('Aborted')\n error.name = 'AbortError'\n return error\n}\n\n/**\n * Stub file system for Convex that throws clear errors.\n */\nconst createConvexStubFs = (): CodebuffFileSystem => ({\n readFile: async () => {\n throw new ConvexUnsupportedToolError(\n 'read_files',\n 'File system access is not available in Convex. Provide projectFiles in options or override read_files tool.',\n )\n },\n writeFile: async () => {\n throw new ConvexUnsupportedToolError(\n 'write_file',\n 'File system access is not available in Convex. Provide an override for write_file tool.',\n )\n },\n readdir: async () => {\n throw new ConvexUnsupportedToolError(\n 'list_directory',\n 'File system access is not available in Convex.',\n )\n },\n stat: async () => {\n throw new ConvexUnsupportedToolError(\n 'stat',\n 'File system access is not available in Convex.',\n )\n },\n mkdir: async () => {\n throw new ConvexUnsupportedToolError(\n 'mkdir',\n 'File system access is not available in Convex.',\n )\n },\n})\n\n/**\n * Stub spawn for Convex that throws clear errors\n */\nconst createConvexStubSpawn = (): CodebuffSpawn => {\n return (() => {\n throw new ConvexUnsupportedToolError(\n 'run_terminal_command',\n 'child_process is not available in Convex runtime',\n )\n }) as unknown as CodebuffSpawn\n}\n\n// ============================================================================\n// Direct HTTP API Calls (no AI SDK or agent-runtime)\n// ============================================================================\n\ntype UserColumn = 'id' | 'email' | 'discord_id' | 'stripe_customer_id' | 'banned'\n\n/**\n * Fetch with retry logic for transient errors.\n */\nasync function fetchWithRetry(\n url: URL | string,\n options: RequestInit,\n logger?: Logger,\n): Promise<Response> {\n let lastError: Error | null = null\n let backoffDelay = RETRY_BACKOFF_BASE_DELAY_MS\n\n for (let attempt = 0; attempt <= MAX_RETRIES_PER_MESSAGE; attempt++) {\n try {\n const response = await fetch(url, options)\n\n if (response.ok || response.status < 500) {\n return response\n }\n\n if (attempt < MAX_RETRIES_PER_MESSAGE) {\n logger?.warn(\n { status: response.status, attempt: attempt + 1, url: String(url) },\n `Retryable HTTP error, retrying in ${backoffDelay}ms`,\n )\n await new Promise((resolve) => setTimeout(resolve, backoffDelay))\n backoffDelay = Math.min(backoffDelay * 2, RETRY_BACKOFF_MAX_DELAY_MS)\n } else {\n return response\n }\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n\n if (attempt < MAX_RETRIES_PER_MESSAGE) {\n logger?.warn(\n { error: lastError.message, attempt: attempt + 1, url: String(url) },\n `Network error, retrying in ${backoffDelay}ms`,\n )\n await new Promise((resolve) => setTimeout(resolve, backoffDelay))\n backoffDelay = Math.min(backoffDelay * 2, RETRY_BACKOFF_MAX_DELAY_MS)\n }\n }\n }\n\n throw lastError ?? new Error('Request failed after retries')\n}\n\n/**\n * Get user info from API key.\n */\nasync function getUserInfoFromApiKey(\n apiKey: string,\n fields: UserColumn[],\n logger?: Logger,\n): Promise<{ id: string } | null> {\n const urlParams = new URLSearchParams({ fields: fields.join(',') })\n const url = new URL(`/api/v1/me?${urlParams}`, WEBSITE_URL)\n\n try {\n const response = await fetchWithRetry(\n url,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n },\n logger,\n )\n\n if (\n response.status === 401 ||\n response.status === 403 ||\n response.status === 404\n ) {\n return null\n }\n\n if (!response.ok) {\n throw createHttpError('Request failed', response.status)\n }\n\n return await response.json()\n } catch (error) {\n logger?.error({ error }, 'getUserInfoFromApiKey error')\n throw error\n }\n}\n\n/**\n * Start an agent run.\n */\nasync function startAgentRun(\n apiKey: string,\n agentId: string,\n ancestorRunIds: string[],\n logger?: Logger,\n): Promise<string | null> {\n const url = new URL('/api/v1/agent-runs', WEBSITE_URL)\n\n try {\n const response = await fetchWithRetry(\n url,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'START',\n agentId,\n ancestorRunIds,\n }),\n },\n logger,\n )\n\n if (!response.ok) {\n logger?.error({ status: response.status }, 'startAgentRun request failed')\n return null\n }\n\n const responseBody = await response.json()\n return responseBody?.runId ?? null\n } catch (error) {\n logger?.error({ error }, 'startAgentRun error')\n return null\n }\n}\n\n/**\n * Finish an agent run.\n */\nasync function finishAgentRun(\n apiKey: string,\n runId: string,\n status: 'completed' | 'failed' | 'cancelled',\n totalSteps: number,\n directCredits: number,\n totalCredits: number,\n logger?: Logger,\n): Promise<void> {\n const url = new URL('/api/v1/agent-runs', WEBSITE_URL)\n\n try {\n await fetchWithRetry(\n url,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n action: 'FINISH',\n runId,\n status,\n totalSteps,\n directCredits,\n totalCredits,\n }),\n },\n logger,\n )\n } catch (error) {\n logger?.error({ error }, 'finishAgentRun error')\n }\n}\n\n/**\n * Convert messages to OpenAI-compatible format for the chat completions API.\n */\nfunction convertToOpenAIMessages(\n messages: Message[],\n systemPrompt?: string,\n): any[] {\n const openaiMessages: any[] = []\n\n // Add system message first\n if (systemPrompt) {\n openaiMessages.push({\n role: 'system',\n content: systemPrompt,\n })\n }\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n openaiMessages.push({\n role: 'system',\n content:\n typeof msg.content === 'string'\n ? msg.content\n : msg.content.map((c) => c.text).join('\\n\\n'),\n })\n } else if (msg.role === 'user') {\n const content: any[] = []\n for (const part of msg.content) {\n if (part.type === 'text') {\n content.push({ type: 'text', text: part.text })\n } else if (part.type === 'image') {\n content.push({\n type: 'image_url',\n image_url: {\n url: `data:${part.mediaType};base64,${part.image}`,\n },\n })\n }\n }\n openaiMessages.push({\n role: 'user',\n content: content.length === 1 && content[0].type === 'text'\n ? content[0].text\n : content,\n })\n } else if (msg.role === 'assistant') {\n const textContent = msg.content\n .filter((c) => c.type === 'text')\n .map((c) => (c as any).text)\n .join('')\n const toolCalls = msg.content\n .filter((c) => c.type === 'tool-call')\n .map((c: any) => ({\n id: c.toolCallId,\n type: 'function',\n function: {\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n },\n }))\n\n const assistantMsg: any = { role: 'assistant' }\n if (textContent) {\n assistantMsg.content = textContent\n }\n if (toolCalls.length > 0) {\n assistantMsg.tool_calls = toolCalls\n }\n openaiMessages.push(assistantMsg)\n } else if (msg.role === 'tool') {\n openaiMessages.push({\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: JSON.stringify(\n msg.content.length === 1\n ? (msg.content[0] as any).value\n : msg.content.map((c: any) => c.value),\n ),\n })\n }\n }\n\n return openaiMessages\n}\n\n/**\n * Call the chat completions API with streaming.\n */\nasync function* streamChatCompletion(\n apiKey: string,\n runId: string,\n model: string,\n messages: any[],\n tools: any[] | undefined,\n signal?: AbortSignal,\n): AsyncGenerator<{\n type: 'text' | 'tool_call' | 'done'\n content?: string\n toolCall?: {\n id: string\n name: string\n arguments: string\n }\n}> {\n const url = new URL('/api/v1/chat/completions', WEBSITE_URL)\n\n const body: any = {\n model,\n messages,\n stream: true,\n codebuff_metadata: {\n run_id: runId,\n },\n }\n\n if (tools && tools.length > 0) {\n body.tools = tools\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n signal,\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '')\n throw createHttpError(\n `Chat completion failed: ${response.status} ${errorText}`,\n response.status,\n )\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('No response body')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n const toolCallAccumulators: Record<\n number,\n { id: string; name: string; arguments: string }\n > = {}\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n\n if (data === '[DONE]') {\n // Emit accumulated tool calls\n for (const toolCall of Object.values(toolCallAccumulators)) {\n yield { type: 'tool_call', toolCall }\n }\n yield { type: 'done' }\n return\n }\n\n try {\n const parsed = JSON.parse(data)\n const choice = parsed.choices?.[0]\n if (!choice) continue\n\n const delta = choice.delta\n if (delta?.content) {\n yield { type: 'text', content: delta.content }\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const index = tc.index ?? 0\n if (!toolCallAccumulators[index]) {\n toolCallAccumulators[index] = {\n id: tc.id || '',\n name: tc.function?.name || '',\n arguments: '',\n }\n }\n if (tc.id) {\n toolCallAccumulators[index].id = tc.id\n }\n if (tc.function?.name) {\n toolCallAccumulators[index].name = tc.function.name\n }\n if (tc.function?.arguments) {\n toolCallAccumulators[index].arguments += tc.function.arguments\n }\n }\n }\n\n if (choice.finish_reason === 'stop' || choice.finish_reason === 'tool_calls') {\n // Emit accumulated tool calls\n for (const toolCall of Object.values(toolCallAccumulators)) {\n if (toolCall.name) {\n yield { type: 'tool_call', toolCall }\n }\n }\n yield { type: 'done' }\n return\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\n// ============================================================================\n// Tool Handling\n// ============================================================================\n\n/**\n * Read files from projectFiles or override.\n */\nasync function readFiles({\n filePaths,\n override,\n projectFiles,\n}: {\n filePaths: string[]\n override?: NonNullable<\n Required<ConvexClientOptions>['overrideTools']['read_files']\n >\n projectFiles?: Record<string, string>\n}) {\n if (override) {\n return await override({ filePaths })\n }\n\n const result: Record<string, string | null> = {}\n for (const filePath of filePaths) {\n result[filePath] = projectFiles?.[filePath] ?? null\n }\n return result\n}\n\n/**\n * Handle a tool call in Convex environment.\n */\nasync function handleToolCall({\n toolName,\n input,\n overrides,\n customToolDefinitions,\n projectFiles,\n}: {\n toolName: string\n input: any\n overrides: NonNullable<ConvexClientOptions['overrideTools']>\n customToolDefinitions: Record<string, CustomToolDefinition>\n projectFiles?: Record<string, string>\n}): Promise<ToolResultOutput[]> {\n // Check for custom tool handler\n const customToolHandler = customToolDefinitions[toolName]\n if (customToolHandler) {\n return await customToolHandler.execute(input)\n }\n\n // Check for override\n let override = (overrides as any)[toolName]\n if (!override && toolName === 'str_replace') {\n override = (overrides as any)['write_file']\n }\n\n if (override) {\n return await override(input)\n }\n\n // Handle built-in tools\n switch (toolName) {\n case 'end_turn':\n return [{ type: 'json', value: { message: 'Turn ended.' } }]\n\n case 'read_files': {\n const files = await readFiles({\n filePaths: input.paths || input.filePaths || [],\n override: overrides.read_files,\n projectFiles,\n })\n return [{ type: 'json', value: files }]\n }\n\n case 'write_file':\n case 'str_replace':\n throw new ConvexUnsupportedToolError(\n toolName,\n 'File system write operations require an override in Convex',\n )\n\n case 'run_terminal_command':\n throw new ConvexUnsupportedToolError(\n 'run_terminal_command',\n 'child_process is not available in Convex runtime',\n )\n\n case 'code_search':\n throw new ConvexUnsupportedToolError(\n 'code_search',\n 'ripgrep/code search requires file system and process spawning',\n )\n\n case 'list_directory':\n throw new ConvexUnsupportedToolError(\n 'list_directory',\n 'File system access is not available in Convex',\n )\n\n case 'glob':\n throw new ConvexUnsupportedToolError(\n 'glob',\n 'File system access is not available in Convex',\n )\n\n case 'run_file_change_hooks':\n return [{\n type: 'json',\n value: { message: 'File change hooks are not supported in Convex mode' },\n }]\n\n default:\n throw new Error(\n `Tool not implemented in Convex SDK: ${toolName}. ` +\n `Please provide an override or modify your agent to not use this tool.`,\n )\n }\n}\n\n// ============================================================================\n// Main Run Function\n// ============================================================================\n\ntype ConvexRunExecutionOptions = ConvexRunOptions &\n ConvexClientOptions & {\n fingerprintId: string\n }\n\n/**\n * Build a simple system prompt for Convex agents.\n */\nfunction buildSystemPrompt(\n agentDefinition: AgentDefinition | undefined,\n projectFiles: Record<string, string>,\n): string {\n const parts: string[] = []\n\n // Add agent's system prompt if defined\n if (agentDefinition?.systemPrompt) {\n parts.push(agentDefinition.systemPrompt)\n } else {\n parts.push(\n 'You are a helpful AI assistant. Answer the user\\'s questions accurately and helpfully.',\n )\n }\n\n // Add file context\n const fileList = Object.keys(projectFiles)\n if (fileList.length > 0) {\n parts.push(`\\n\\n# Available Files\\n\\nThe following files are available:\\n${fileList.map((f) => `- ${f}`).join('\\n')}`)\n }\n\n return parts.join('\\n\\n')\n}\n\n/**\n * Build tools array for the API.\n */\nfunction buildToolsForApi(\n agentDefinition: AgentDefinition | undefined,\n customToolDefinitions: CustomToolDefinition[],\n): any[] | undefined {\n const tools: any[] = []\n\n // Add read_files tool\n tools.push({\n type: 'function',\n function: {\n name: 'read_files',\n description: 'Read the contents of one or more files',\n parameters: {\n type: 'object',\n properties: {\n paths: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of file paths to read',\n },\n },\n required: ['paths'],\n },\n },\n })\n\n // Add end_turn tool\n tools.push({\n type: 'function',\n function: {\n name: 'end_turn',\n description: 'End your turn when you have completed the task',\n parameters: {\n type: 'object',\n properties: {},\n },\n },\n })\n\n // Add custom tools\n for (const tool of customToolDefinitions) {\n tools.push({\n type: 'function',\n function: {\n name: tool.toolName,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n })\n }\n\n return tools.length > 0 ? tools : undefined\n}\n\n/**\n * Run an agent in Convex-compatible mode.\n */\nexport async function run(\n options: ConvexRunExecutionOptions,\n): Promise<ConvexRunState> {\n const {\n apiKey,\n fingerprintId,\n projectFiles = {},\n knowledgeFiles,\n agentDefinitions = [],\n maxAgentSteps = MAX_AGENT_STEPS_DEFAULT,\n handleEvent,\n handleStreamChunk,\n overrideTools = {},\n customToolDefinitions = [],\n logger,\n agent,\n prompt,\n content,\n params,\n previousRun,\n extraToolResults,\n signal,\n } = options\n\n if (signal?.aborted) {\n return {\n sessionState: previousRun?.sessionState,\n output: {\n type: 'error',\n message: createAbortError(signal).message,\n },\n }\n }\n\n // Get agent definition\n let agentDefinition: AgentDefinition | undefined\n let agentId: string\n\n if (typeof agent !== 'string') {\n agentDefinition = agent\n agentId = agent.id\n } else {\n agentId = agent\n agentDefinition = agentDefinitions.find((a) => a.id === agent)\n }\n\n // Initialize or restore session state\n let sessionState: SessionState\n if (previousRun?.sessionState) {\n sessionState = await convexApplyOverridesToSessionState(\n undefined,\n previousRun.sessionState,\n {\n knowledgeFiles,\n agentDefinitions,\n customToolDefinitions,\n projectFiles,\n maxAgentSteps,\n },\n )\n } else {\n sessionState = await convexInitialSessionState({\n cwd: undefined,\n knowledgeFiles,\n agentDefinitions,\n customToolDefinitions,\n projectFiles,\n maxAgentSteps,\n fs: createConvexStubFs(),\n spawn: createConvexStubSpawn(),\n logger,\n })\n }\n\n // Verify API key\n const userInfo = await getUserInfoFromApiKey(apiKey, ['id'], logger)\n if (!userInfo) {\n return {\n sessionState,\n output: {\n type: 'error',\n message: 'Authentication failed: Invalid API key or user not found',\n },\n }\n }\n\n // Start agent run\n const runId = await startAgentRun(\n apiKey,\n agentId,\n sessionState.mainAgentState.ancestorRunIds,\n logger,\n )\n if (!runId) {\n return {\n sessionState,\n output: {\n type: 'error',\n message: 'Failed to start agent run',\n },\n }\n }\n\n sessionState.mainAgentState.runId = runId\n\n // Build system prompt and tools\n const systemPrompt = buildSystemPrompt(agentDefinition, projectFiles)\n const tools = buildToolsForApi(agentDefinition, customToolDefinitions)\n const model = agentDefinition?.model || 'anthropic/claude-sonnet-4'\n\n // Build initial messages\n const messages: Message[] = [...sessionState.mainAgentState.messageHistory]\n\n // Add extra tool results if provided\n if (extraToolResults && extraToolResults.length > 0) {\n messages.push(...extraToolResults)\n }\n\n // Add user message\n const preparedContent = wrapContentForUserMessage(content)\n if (prompt || preparedContent) {\n messages.push(\n userMessage(buildUserMessageContent(prompt, params, preparedContent)),\n )\n }\n\n // Custom tool definitions as a map\n const customToolDefsMap: Record<string, CustomToolDefinition> =\n Object.fromEntries(customToolDefinitions.map((d) => [d.toolName, d]))\n\n let totalSteps = 0\n let creditsUsed = 0\n let fullResponse = ''\n\n try {\n // Agent loop\n while (totalSteps < maxAgentSteps) {\n if (signal?.aborted) {\n break\n }\n\n totalSteps++\n const openaiMessages = convertToOpenAIMessages(messages, systemPrompt)\n\n // Send start event\n if (handleEvent) {\n await handleEvent({\n type: 'start',\n agentId,\n model,\n messageHistoryLength: messages.length,\n })\n }\n\n let stepResponse = ''\n const toolCalls: { id: string; name: string; arguments: string }[] = []\n\n // Stream the response\n for await (const chunk of streamChatCompletion(\n apiKey,\n runId,\n model,\n openaiMessages,\n tools,\n signal,\n )) {\n if (chunk.type === 'text' && chunk.content) {\n stepResponse += chunk.content\n fullResponse += chunk.content\n if (handleStreamChunk) {\n await handleStreamChunk(chunk.content)\n }\n } else if (chunk.type === 'tool_call' && chunk.toolCall) {\n toolCalls.push(chunk.toolCall)\n } else if (chunk.type === 'done') {\n break\n }\n }\n\n // Add assistant message to history\n if (stepResponse || toolCalls.length > 0) {\n const assistantContent: any[] = []\n if (stepResponse) {\n assistantContent.push({ type: 'text', text: stepResponse })\n }\n for (const tc of toolCalls) {\n assistantContent.push({\n type: 'tool-call',\n toolCallId: tc.id,\n toolName: tc.name,\n input: JSON.parse(tc.arguments || '{}'),\n })\n }\n messages.push({\n role: 'assistant',\n content: assistantContent,\n sentAt: Date.now(),\n } as AssistantMessage)\n }\n\n // If no tool calls, we're done\n if (toolCalls.length === 0) {\n break\n }\n\n // Check for end_turn\n const hasEndTurn = toolCalls.some(\n (tc) => tc.name === 'end_turn' || tc.name === 'task_completed',\n )\n\n // Handle tool calls\n for (const tc of toolCalls) {\n if (tc.name === 'end_turn' || tc.name === 'task_completed') {\n // Add tool result for end_turn\n messages.push({\n role: 'tool',\n toolCallId: tc.id,\n toolName: tc.name,\n content: [{ type: 'json', value: { message: 'Turn ended.' } }],\n } as ToolMessage)\n continue\n }\n\n try {\n const input = JSON.parse(tc.arguments || '{}')\n const result = await handleToolCall({\n toolName: tc.name,\n input,\n overrides: overrideTools,\n customToolDefinitions: customToolDefsMap,\n projectFiles,\n })\n\n messages.push({\n role: 'tool',\n toolCallId: tc.id,\n toolName: tc.name,\n content: result,\n } as ToolMessage)\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n messages.push({\n role: 'tool',\n toolCallId: tc.id,\n toolName: tc.name,\n content: [{ type: 'json', value: { errorMessage } }],\n } as ToolMessage)\n }\n }\n\n if (hasEndTurn) {\n break\n }\n }\n\n // Update session state\n sessionState.mainAgentState.messageHistory = messages\n sessionState.mainAgentState.stepsRemaining = maxAgentSteps - totalSteps\n sessionState.mainAgentState.creditsUsed = creditsUsed\n\n // Finish agent run\n await finishAgentRun(\n apiKey,\n runId,\n 'completed',\n totalSteps,\n creditsUsed,\n creditsUsed,\n logger,\n )\n\n // Send finish event\n if (handleEvent) {\n await handleEvent({\n type: 'finish',\n agentId,\n totalCost: creditsUsed,\n })\n }\n\n return {\n sessionState,\n output: {\n type: 'lastMessage' as const,\n value: [{ role: 'assistant', content: fullResponse || 'Agent completed.' }],\n },\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const statusCode = getErrorStatusCode(error)\n\n // Finish agent run with error\n await finishAgentRun(\n apiKey,\n runId,\n 'failed',\n totalSteps,\n creditsUsed,\n creditsUsed,\n logger,\n )\n\n if (handleEvent) {\n await handleEvent({ type: 'error', message: errorMessage })\n }\n\n return {\n sessionState,\n output: {\n type: 'error',\n message: errorMessage,\n ...(statusCode !== undefined && { statusCode }),\n },\n }\n }\n}\n\n// ============================================================================\n// ConvexCodebuffClient Class\n// ============================================================================\n\n/**\n * Convex-compatible Codebuff client.\n *\n * This client is designed to work within Convex's sandboxed Node.js runtime.\n * It doesn't require file system or child_process access.\n */\nexport class ConvexCodebuffClient {\n public options: ConvexClientOptions & {\n fingerprintId: string\n }\n\n constructor(options: ConvexClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'Codebuff API key is required. Please provide an apiKey in the constructor of ConvexCodebuffClient.',\n )\n }\n\n this.options = {\n handleEvent: (event) => {\n if (event.type === 'error') {\n throw new Error(\n `Received error: ${event.message}.\\n\\nProvide a handleEvent function to handle this error.`,\n )\n }\n },\n fingerprintId: `codebuff-convex-sdk-${Math.random().toString(36).substring(2, 15)}`,\n ...options,\n }\n }\n\n /**\n * Run a Codebuff agent with the specified options.\n *\n * Note: In Convex mode, tools that require file system or process spawning\n * will throw ConvexUnsupportedToolError unless you provide overrides.\n */\n public async run(\n options: ConvexRunOptions & Partial<ConvexClientOptions>,\n ): Promise<ConvexRunState> {\n return run({ ...this.options, ...options })\n }\n\n /**\n * Check connection to the Codebuff backend.\n */\n public async checkConnection(): Promise<boolean> {\n try {\n const response = await fetch(`${WEBSITE_URL}/api/healthz`, {\n method: 'GET',\n signal: AbortSignal.timeout(5000),\n })\n\n if (!response.ok) return false\n\n const result = await response.json()\n return (\n typeof result === 'object' &&\n result !== null &&\n 'status' in result &&\n (result as { status?: unknown }).status === 'ok'\n )\n } catch {\n return false\n }\n }\n}\n\n// Re-export buildUserMessageContent for backward compatibility\nexport { buildUserMessageContent }\n"
|
|
15
|
-
],
|
|
16
|
-
"mappings": ";AAGO,IAAM,iBAAiB;AAAA,EAE5B,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EAGA,KAAK;AAAA,IACH,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,SACE;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACf,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,aAAa;AAAA,IACb,SACE;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACf,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAQO,IAAM,YAAY,OAAO,KAC9B,cACF;AAMO,IAAM,cAAc,OAAO,YAChC,OAAO,QAAQ,cAAc,EAAE,IAAI,EAAE,WAAW,aAAa;AAAA,EAC3D;AAAA,EACA,QAAQ;AACV,CAAC,CACH;AAMO,IAAM,qBAAqB,MAAM,KACtC,IAAI,IACF,OAAO,OAAO,cAAc,EACzB,OAAO,CAAC,YAAY,EAAE,YAAY,YAAY,CAAC,QAAQ,MAAM,EAC7D,IAAI,CAAC,YAAY,QAAQ,WAAW,CACzC,CACF;AAGO,IAAM,sBAAsB,OAAO,QAAQ,WAAW,EAAE,OAC7D,CAAC,MAAM,MAAM,UAAU;AAAA,EACrB,IAAI,CAAC,IAAI;AAAA,IAAO,IAAI,QAAQ,CAAC;AAAA,EAC7B,IAAI,MAAM,KAAK,IAAI;AAAA,EACnB,OAAO;AAAA,GAET,CAAC,CACH;AAEO,IAAM,0BAA0B;;;AC9FvC;AAIO,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,4BAA4B,EAAE,KAAK,CAAC,OAAO,QAAQ,MAAM,CAAC;AAAA,EAC1D,8BAA8B,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EAC3C,2BAA2B,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,EAC1C,6BAA6B,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7C,8BAA8B,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EAC3C,oCAAoC,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpD,oCAAoC,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EACjD,yCAAyC,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7D,sBAAsB,EAAE,OAAO,OAAO,EAAE,IAAI,IAAI;AAClD,CAA+D;AACxD,IAAM,gBAAgB,gBAAgB,MAAM,EAAE;AAQ9C,IAAM,mBAAgC;AAAA,EAC3C,4BAA4B;AAAA,EAC5B,8BAA8B;AAAA,EAC9B,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,oCACE;AAAA,EACF,oCACE;AAAA,EACF,yCACE,QAAQ,IAAI;AAAA,EACd,sBAAsB;AACxB;;;AClCA,IAAM,YAAY,gBAAgB,UAAU,gBAAgB;AAC5D,IAAI,CAAC,UAAU,SAAS;AAAA,EACtB,MAAM,UAAU;AAClB;AAEO,IAAM,MAAM,UAAU;AAG7B,IAAI,IAAI,+BAA+B,QAAQ;AAAA,EAC7C,QAAQ,IAAI,sBAAsB,IAAI,0BAA0B;AAClE;AAGO,IAAM,SAAS,IAAI,+BAA+B;AAClD,IAAM,UAAU,IAAI,+BAA+B;AACnD,IAAM,UAAU,IAAI,+BAA+B;AACnD,IAAM,QAAQ,QAAQ,IAAI,4BAA4B;;;ACdtD,IAAM,kBAAkB;AAExB,IAAM,cAAc,IAAI;;;ACN/B,cAAS;AAOF,IAAM,iBAAiB,GAAE,OAAO;AAAA,EACrC,UAAU,GAAE,OAAO;AAAA,EACnB,YAAY,GAAE,OAAO;AAAA,EACrB,OAAO,GAAE,OAAO,GAAE,OAAO,GAAG,GAAE,IAAI,CAAC;AACrC,CAAC;AAGM,IAAM,gBAAgB,GAAE,OAAO;AAAA,EACpC,WAAW,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQ,GACL,KAAK,CAAC,eAAe,eAAe,YAAY,SAAS,CAAC,EAC1D,SAAS;AAAA,EACZ,MAAM,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,GAAE,OAAO,EAAE,MAAM;AACzB,CAAC;AAgCM,IAAM,oBAAoB,GAAE,mBAAmB,QAAQ;AAAA,EAC5D,GAAE,OAAO;AAAA,IACP,MAAM,GAAE,QAAQ,kBAAkB;AAAA,IAClC,OAAO,GAAE,OAAO,GAAE,OAAO,GAAG,GAAE,IAAI,CAAC,EAAE,GAAG,GAAE,KAAK,CAAC;AAAA,EAClD,CAAC;AAAA,EACD,GAAE,OAAO;AAAA,IACP,MAAM,GAAE,QAAQ,aAAa;AAAA,IAC7B,OAAO,GAAE,MAAM,GAAE,IAAI,CAAC;AAAA,EACxB,CAAC;AAAA,EACD,GAAE,OAAO;AAAA,IACP,MAAM,GAAE,QAAQ,aAAa;AAAA,IAC7B,OAAO,GAAE,MAAM,GAAE,IAAI,CAAC;AAAA,EACxB,CAAC;AAAA,EACD,GAAE,OAAO;AAAA,IACP,MAAM,GAAE,QAAQ,OAAO;AAAA,IACvB,SAAS,GAAE,OAAO;AAAA,IAClB,YAAY,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AACH,CAAC;AAGM,IAAM,wBAAwB;AAAA,EAEnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,qBAAqB,OAAO,YACvC,sBAAsB,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,KAAK,GAAG,CAAC,CAAC,CACvE;AACA,IAAM,0BAA0B,GAAE,KAAK,qBAAqB;AAWrD,SAAS,oBAAoB,GAAe;AAAA,EACjD,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc,CAAC;AAAA,IACf,gBAAgB,CAAC;AAAA,IACjB,OAAO;AAAA,IACP,WAAW,CAAC;AAAA,IACZ,aAAa,CAAC;AAAA,IACd,gBAAgB,CAAC;AAAA,IACjB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,cAAc;AAAA,IACd,iBAAiB,CAAC;AAAA,IAClB,mBAAmB;AAAA,EACrB;AAAA;AAEK,SAAS,sBAAsB,CACpC,aACc;AAAA,EACd,OAAO;AAAA,IACL,gBAAgB,qBAAqB;AAAA,IACrC;AAAA,EACF;AAAA;;;ACpIF;AAuCA,SAAS,uBAAuB,CAC9B,kBACqB;AAAA,EACrB,MAAM,0BAA+C,CAAC;AAAA,EACtD,iBAAiB,QAAQ,CAAC,eAAe;AAAA,IACvC,MAAM,kBAAkB,KAAK,WAAW;AAAA,IACxC,IACE,gBAAgB,eAChB,OAAO,gBAAgB,gBAAgB,YACvC;AAAA,MACA,gBAAgB,cAAc,gBAAgB,YAAY,SAAS;AAAA,IACrE;AAAA,IACA,IAAI,gBAAgB,IAAI;AAAA,MACtB,wBAAwB,gBAAgB,MAAM;AAAA,IAChD;AAAA,GACD;AAAA,EACD,OAAO;AAAA;AAOT,SAAS,4BAA4B,CACnC,uBACuB;AAAA,EACvB,OAAO,OAAO,YACZ,sBAAsB,IAAI,CAAC,mBAAmB;AAAA,IAE5C,MAAM,aAAa,GAAE,aAAa,eAAe,aAAa;AAAA,MAC5D,IAAI;AAAA,IACN,CAAC;AAAA,IACD,OAAO,WAAW;AAAA,IAElB,OAAO;AAAA,MACL,eAAe;AAAA,MACf;AAAA,QACE,aAAa;AAAA,QACb,aAAa,eAAe;AAAA,QAC5B,eAAe,eAAe;AAAA,QAC9B,eAAe,eAAe;AAAA,MAChC;AAAA,IACF;AAAA,GACD,CACH;AAAA;AAMF,SAAS,aAAa,CAAC,WAAqC;AAAA,EAC1D,MAAM,OAAqC,CAAC;AAAA,EAG5C,WAAW,YAAY,WAAW;AAAA,IAChC,MAAM,QAAQ,SAAS,MAAM,GAAG;AAAA,IAEhC,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,MACrC,MAAM,cAAc,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG;AAAA,MAClD,MAAM,SAAS,MAAM,MAAM,SAAS;AAAA,MAEpC,IAAI,CAAC,KAAK,cAAc;AAAA,QACtB,KAAK,eAAe;AAAA,UAClB,MAAM,MAAM;AAAA,UACZ,MAAM,SAAS,SAAS;AAAA,UACxB,UAAU;AAAA,UACV,UAAU,SAAS,YAAY,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAGA,MAAM,YAA4B,CAAC;AAAA,EACnC,MAAM,YAAY,IAAI;AAAA,EAEtB,YAAY,MAAM,SAAS,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC/C,IAAI,UAAU,IAAI,IAAI;AAAA,MAAG;AAAA,IAEzB,MAAM,aAAa,KAAK,UAAU,GAAG,KAAK,YAAY,GAAG,CAAC;AAAA,IAC1D,IAAI,cAAc,KAAK,aAAa;AAAA,MAClC,MAAM,SAAS,KAAK;AAAA,MACpB,IACE,OAAO,YACP,CAAC,OAAO,SAAS,KAAK,CAAC,UAAU,MAAM,aAAa,IAAI,GACxD;AAAA,QACA,OAAO,SAAS,KAAK,IAAI;AAAA,MAC3B;AAAA,IACF,EAAO;AAAA,MACL,UAAU,KAAK,IAAI;AAAA;AAAA,IAErB,UAAU,IAAI,IAAI;AAAA,EACpB;AAAA,EAGA,SAAS,SAAS,CAAC,OAA6B;AAAA,IAC9C,MAAM,KAAK,CAAC,GAAG,MAAM;AAAA,MACnB,IAAI,EAAE,SAAS,EAAE,MAAM;AAAA,QACrB,OAAO,EAAE,SAAS,cAAc,KAAK;AAAA,MACvC;AAAA,MACA,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,KACnC;AAAA,IAED,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,KAAK,UAAU;AAAA,QACjB,UAAU,KAAK,QAAQ;AAAA,MACzB;AAAA,IACF;AAAA;AAAA,EAGF,UAAU,SAAS;AAAA,EACnB,OAAO;AAAA;AAMT,SAAS,wBAAwB,CAAC,cAAkC;AAAA,EAClE,MAAM,sBAAsB,aAAa,OAAO,CAAC,aAAa;AAAA,IAC5D,MAAM,oBAAoB,SAAS,YAAY;AAAA,IAC/C,OACE,kBAAkB,SAAS,cAAc,KACzC,kBAAkB,SAAS,WAAW,KACtC,kBAAkB,SAAS,WAAW;AAAA,GAEzC;AAAA,EAGD,MAAM,cAAc,IAAI;AAAA,EACxB,WAAW,YAAY,qBAAqB;AAAA,IAC1C,MAAM,YAAY,SAAS,YAAY,GAAG;AAAA,IAC1C,MAAM,MAAM,aAAa,IAAI,SAAS,UAAU,GAAG,SAAS,IAAI;AAAA,IAChE,IAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AAAA,MACzB,YAAY,IAAI,KAAK,CAAC,CAAC;AAAA,IACzB;AAAA,IACA,YAAY,IAAI,GAAG,EAAG,KAAK,QAAQ;AAAA,EACrC;AAAA,EAEA,MAAM,gBAA0B,CAAC;AAAA,EAEjC,WAAW,SAAS,YAAY,OAAO,GAAG;AAAA,IACxC,MAAM,cAAc,MAAM,KAAK,CAAC,MAC9B,EAAE,YAAY,EAAE,SAAS,cAAc,CACzC;AAAA,IACA,MAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,WAAW,CAAC;AAAA,IACxE,MAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,WAAW,CAAC;AAAA,IAExE,MAAM,wBAAwB,eAAe,YAAY;AAAA,IACzD,IAAI,uBAAuB;AAAA,MACzB,cAAc,KAAK,qBAAqB;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,oBAAoB,CAC3B,cACwB;AAAA,EACxB,MAAM,eAAe,OAAO,KAAK,YAAY;AAAA,EAC7C,MAAM,oBAAoB,yBAAyB,YAAY;AAAA,EAE/D,MAAM,iBAAyC,CAAC;AAAA,EAChD,WAAW,YAAY,mBAAmB;AAAA,IACxC,eAAe,YAAY,aAAa;AAAA,EAC1C;AAAA,EACA,OAAO;AAAA;AAST,eAAsB,yBAAyB,CAC7C,QACuB;AAAA,EACvB,QAAQ,KAAK,eAAe,IAAI,OAAO,WAAW;AAAA,EAClD,MAAM,kBAAkB,uBAAuB,cAAc,mBAC3D;AAAA,EAEF,IAAI,CAAC,kBAAkB;AAAA,IACrB,mBAAmB,CAAC;AAAA,EACtB;AAAA,EACA,IAAI,CAAC,uBAAuB;AAAA,IAC1B,wBAAwB,CAAC;AAAA,EAC3B;AAAA,EAGA,IAAI,iBAAiB,WAAW;AAAA,IAC9B,eAAe,CAAC;AAAA,EAClB;AAAA,EACA,IAAI,mBAAmB,WAAW;AAAA,IAChC,iBAAiB,eAAe,qBAAqB,YAAY,IAAI,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,0BACJ,iBAAiB,SAAS,IACtB,wBAAwB,gBAAgB,IACxC,CAAC;AAAA,EAEP,MAAM,iCAAiC,6BACrC,qBACF;AAAA,EAGA,MAAM,YAAY,OAAO,KAAK,YAAY,EAAE,KAAK;AAAA,EACjD,MAAM,WAAW,cAAc,SAAS;AAAA,EAGxC,MAAM,kBAAuC,CAAC;AAAA,EAC9C,MAAM,eAAoC,CAAC;AAAA,EAG3C,MAAM,aAAa;AAAA,IACjB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,oBAAoB;AAAA,EACtB;AAAA,EAEA,MAAM,eAAe,uBAAuB;AAAA,IAC1C,aAAa,OAAO;AAAA,IACpB,KAAK,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,CAAC;AAAA,IACrB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB;AAAA,IACA,sBAAsB,CAAC;AAAA,IACvB,kBAAkB,CAAC;AAAA,IACnB,YAAY;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACP,aAAa,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF,CAAC;AAAA,EAED,IAAI,eAAe;AAAA,IACjB,aAAa,eAAe,iBAAiB;AAAA,EAC/C;AAAA,EAEA,OAAO;AAAA;AAQT,eAAsB,kCAAkC,CACtD,KACA,kBACA,WAOuB;AAAA,EAEvB,MAAM,eAAe,KAAK,MACxB,KAAK,UAAU,gBAAgB,CACjC;AAAA,EAGA,IAAI,UAAU,kBAAkB,WAAW;AAAA,IACzC,aAAa,eAAe,iBAAiB,UAAU;AAAA,EACzD;AAAA,EAGA,IAAI,UAAU,iBAAiB,WAAW;AAAA,IACxC,MAAM,YAAY,OAAO,KAAK,UAAU,YAAY,EAAE,KAAK;AAAA,IAC3D,aAAa,YAAY,WAAW,cAAc,SAAS;AAAA,IAE3D,aAAa,YAAY,kBAAkB,CAAC;AAAA,IAC5C,aAAa,YAAY,eAAe,CAAC;AAAA,IAGzC,IAAI,UAAU,mBAAmB,WAAW;AAAA,MAC1C,aAAa,YAAY,iBAAiB,qBACxC,UAAU,YACZ;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IAAI,UAAU,mBAAmB,WAAW;AAAA,IAC1C,aAAa,YAAY,iBAAiB,UAAU;AAAA,EACtD;AAAA,EAGA,IAAI,UAAU,qBAAqB,WAAW;AAAA,IAC5C,MAAM,0BAA0B,wBAC9B,UAAU,gBACZ;AAAA,IACA,aAAa,YAAY,iBAAiB;AAAA,SACrC,aAAa,YAAY;AAAA,SACzB;AAAA,IACL;AAAA,EACF;AAAA,EAGA,IAAI,UAAU,0BAA0B,WAAW;AAAA,IACjD,MAAM,iCAAiC,6BACrC,UAAU,qBACZ;AAAA,IACA,aAAa,YAAY,wBAAwB;AAAA,SAC5C,aAAa,YAAY;AAAA,SACzB;AAAA,IACL;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;;;ACvWF,IAAM,yBAAyB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AASrE,SAAS,eAAe,CAAC,SAAiB,YAA+B;AAAA,EAC9E,MAAM,QAAQ,IAAI,MAAM,OAAO;AAAA,EAC/B,MAAM,aAAa;AAAA,EACnB,OAAO;AAAA;AAMF,SAAS,eAAe,CAAC,UAAU,yBAAoC;AAAA,EAC5E,OAAO,gBAAgB,SAAS,GAAG;AAAA;AAM9B,SAAS,oBAAoB,CAAC,UAAU,oBAA+B;AAAA,EAC5E,OAAO,gBAAgB,SAAS,GAAG;AAAA;AAM9B,SAAS,0BAA0B,CAAC,UAAU,oBAA+B;AAAA,EAClF,OAAO,gBAAgB,SAAS,GAAG;AAAA;AAM9B,SAAS,iBAAiB,CAAC,UAAU,gBAAgB,aAAa,KAAgB;AAAA,EACvF,OAAO,gBAAgB,SAAS,UAAU;AAAA;AAOrC,SAAS,kBAAkB,CAAC,UAAU,iBAA4B;AAAA,EACvE,OAAO,gBAAgB,SAAS,GAAG;AAAA;AAM9B,SAAS,qBAAqB,CAAC,YAAyC;AAAA,EAC7E,IAAI,eAAe;AAAA,IAAW,OAAO;AAAA,EACrC,OAAO,uBAAuB,IAAI,UAAU;AAAA;AAMvC,SAAS,kBAAkB,CAAC,OAAoC;AAAA,EACrE,IAAI,SAAS,OAAO,UAAU,YAAY,gBAAgB,OAAO;AAAA,IAC/D,MAAM,aAAc,MAAkC;AAAA,IACtD,IAAI,OAAO,eAAe,UAAU;AAAA,MAClC,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA;AAOK,SAAS,oBAAoB,CAAC,OAAwB;AAAA,EAC3D,IAAI,iBAAiB,OAAO;AAAA,IAC1B,OAAO,MAAM;AAAA,EACf;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,SAAS,OAAO,UAAU,YAAY,aAAa,OAAO;AAAA,IAC5D,MAAM,UAAW,MAA+B;AAAA,IAChD,IAAI,OAAO,YAAY,UAAU;AAAA,MAC/B,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO,OAAO,KAAK;AAAA;;;AC9Ed,IAAM,0BAA0B;AAMhC,IAAM,8BAA8B;AAMpC,IAAM,6BAA6B;AAMnC,IAAM,mCAAmC;AAMzC,IAAM,8BAA8B;;;ACtBpC,SAAS,uBAIf;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,gBAAgB,CAAC;AAAA,EACjB;AAAA,GAYwC;AAAA,EACxC,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,OAAO,WAAW;AAAA,MACzB,OAAO,MAAM,QAAQ,MAAM;AAAA;AAAA,EAE/B;AAAA;;;AC8DK,MAAM,mCAAmC,MAAM;AAAA,EACpD,WAAW,CAAC,UAAkB,QAAgB;AAAA,IAC5C,MACE,SAAS,iDAAiD,aACxD,0FACJ;AAAA,IACA,KAAK,OAAO;AAAA;AAEhB;AAqFA,SAAS,uBAAuB,CAC9B,QACA,QACA,SAC0B;AAAA,EAC1B,MAAM,QAAkC,CAAC;AAAA,EAGzC,IAAI,WAAW,QAAQ,SAAS,GAAG;AAAA,IACjC,MAAM,KAAK,GAAG,OAAO;AAAA,EACvB;AAAA,EAGA,IAAI,cAAc;AAAA,EAClB,IAAI,QAAQ;AAAA,IACV,eAAe;AAAA,EAAmB;AAAA;AAAA,EACpC;AAAA,EACA,IAAI,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAAA,IAC5C,eAAe;AAAA;AAAA;AAAA,EAAiB,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA;AAAA,EAChE;AAAA,EAEA,IAAI,aAAa;AAAA,IACf,MAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC;AAAA,EAChD;AAAA,EAEA,OAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,EAAE,MAAM,QAAQ,MAAM,GAAG,CAAC;AAAA;AAM/D,IAAM,4BAA4B,CAChC,YACyC;AAAA,EACzC,IAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AAAA,IACpC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,wBAAwB,WAAW,WAAW,OAAO;AAAA;AAM9D,SAAS,WAAW,CAAC,SAAyD;AAAA,EAC5E,MAAM,eACJ,OAAO,YAAY,WAAW,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC,IAAI;AAAA,EACpE,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,KAAK,IAAI;AAAA,EACnB;AAAA;AAcF,IAAM,mBAAmB,CAAC,WAAyB;AAAA,EACjD,IAAI,QAAQ,kBAAkB,OAAO;AAAA,IACnC,OAAO,OAAO;AAAA,EAChB;AAAA,EACA,MAAM,QAAQ,IAAI,MAAM,SAAS;AAAA,EACjC,MAAM,OAAO;AAAA,EACb,OAAO;AAAA;AAMT,IAAM,qBAAqB,OAA2B;AAAA,EACpD,UAAU,YAAY;AAAA,IACpB,MAAM,IAAI,2BACR,cACA,6GACF;AAAA;AAAA,EAEF,WAAW,YAAY;AAAA,IACrB,MAAM,IAAI,2BACR,cACA,yFACF;AAAA;AAAA,EAEF,SAAS,YAAY;AAAA,IACnB,MAAM,IAAI,2BACR,kBACA,gDACF;AAAA;AAAA,EAEF,MAAM,YAAY;AAAA,IAChB,MAAM,IAAI,2BACR,QACA,gDACF;AAAA;AAAA,EAEF,OAAO,YAAY;AAAA,IACjB,MAAM,IAAI,2BACR,SACA,gDACF;AAAA;AAEJ;AAKA,IAAM,wBAAwB,MAAqB;AAAA,EACjD,OAAQ,MAAM;AAAA,IACZ,MAAM,IAAI,2BACR,wBACA,kDACF;AAAA;AAAA;AAaJ,eAAe,cAAc,CAC3B,KACA,SACA,QACmB;AAAA,EACnB,IAAI,YAA0B;AAAA,EAC9B,IAAI,eAAe;AAAA,EAEnB,SAAS,UAAU,EAAG,WAAW,yBAAyB,WAAW;AAAA,IACnE,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,KAAK,OAAO;AAAA,MAEzC,IAAI,SAAS,MAAM,SAAS,SAAS,KAAK;AAAA,QACxC,OAAO;AAAA,MACT;AAAA,MAEA,IAAI,UAAU,yBAAyB;AAAA,QACrC,QAAQ,KACN,EAAE,QAAQ,SAAS,QAAQ,SAAS,UAAU,GAAG,KAAK,OAAO,GAAG,EAAE,GAClE,qCAAqC,gBACvC;AAAA,QACA,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AAAA,QAChE,eAAe,KAAK,IAAI,eAAe,GAAG,0BAA0B;AAAA,MACtE,EAAO;AAAA,QACL,OAAO;AAAA;AAAA,MAET,OAAO,OAAO;AAAA,MACd,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MAEpE,IAAI,UAAU,yBAAyB;AAAA,QACrC,QAAQ,KACN,EAAE,OAAO,UAAU,SAAS,SAAS,UAAU,GAAG,KAAK,OAAO,GAAG,EAAE,GACnE,8BAA8B,gBAChC;AAAA,QACA,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AAAA,QAChE,eAAe,KAAK,IAAI,eAAe,GAAG,0BAA0B;AAAA,MACtE;AAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,aAAa,IAAI,MAAM,8BAA8B;AAAA;AAM7D,eAAe,qBAAqB,CAClC,QACA,QACA,QACgC;AAAA,EAChC,MAAM,YAAY,IAAI,gBAAgB,EAAE,QAAQ,OAAO,KAAK,GAAG,EAAE,CAAC;AAAA,EAClE,MAAM,MAAM,IAAI,IAAI,cAAc,aAAa,WAAW;AAAA,EAE1D,IAAI;AAAA,IACF,MAAM,WAAW,MAAM,eACrB,KACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU;AAAA,MAC3B;AAAA,IACF,GACA,MACF;AAAA,IAEA,IACE,SAAS,WAAW,OACpB,SAAS,WAAW,OACpB,SAAS,WAAW,KACpB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,CAAC,SAAS,IAAI;AAAA,MAChB,MAAM,gBAAgB,kBAAkB,SAAS,MAAM;AAAA,IACzD;AAAA,IAEA,OAAO,MAAM,SAAS,KAAK;AAAA,IAC3B,OAAO,OAAO;AAAA,IACd,QAAQ,MAAM,EAAE,MAAM,GAAG,6BAA6B;AAAA,IACtD,MAAM;AAAA;AAAA;AAOV,eAAe,aAAa,CAC1B,QACA,SACA,gBACA,QACwB;AAAA,EACxB,MAAM,MAAM,IAAI,IAAI,sBAAsB,WAAW;AAAA,EAErD,IAAI;AAAA,IACF,MAAM,WAAW,MAAM,eACrB,KACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU;AAAA,QACzB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,GACA,MACF;AAAA,IAEA,IAAI,CAAC,SAAS,IAAI;AAAA,MAChB,QAAQ,MAAM,EAAE,QAAQ,SAAS,OAAO,GAAG,8BAA8B;AAAA,MACzE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,eAAe,MAAM,SAAS,KAAK;AAAA,IACzC,OAAO,cAAc,SAAS;AAAA,IAC9B,OAAO,OAAO;AAAA,IACd,QAAQ,MAAM,EAAE,MAAM,GAAG,qBAAqB;AAAA,IAC9C,OAAO;AAAA;AAAA;AAOX,eAAe,cAAc,CAC3B,QACA,OACA,QACA,YACA,eACA,cACA,QACe;AAAA,EACf,MAAM,MAAM,IAAI,IAAI,sBAAsB,WAAW;AAAA,EAErD,IAAI;AAAA,IACF,MAAM,eACJ,KACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU;AAAA,QACzB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,GACA,MACF;AAAA,IACA,OAAO,OAAO;AAAA,IACd,QAAQ,MAAM,EAAE,MAAM,GAAG,sBAAsB;AAAA;AAAA;AAOnD,SAAS,uBAAuB,CAC9B,UACA,cACO;AAAA,EACP,MAAM,iBAAwB,CAAC;AAAA,EAG/B,IAAI,cAAc;AAAA,IAChB,eAAe,KAAK;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,OAAO,UAAU;AAAA,IAC1B,IAAI,IAAI,SAAS,UAAU;AAAA,MACzB,eAAe,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA,MAClD,CAAC;AAAA,IACH,EAAO,SAAI,IAAI,SAAS,QAAQ;AAAA,MAC9B,MAAM,UAAiB,CAAC;AAAA,MACxB,WAAW,QAAQ,IAAI,SAAS;AAAA,QAC9B,IAAI,KAAK,SAAS,QAAQ;AAAA,UACxB,QAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,QAChD,EAAO,SAAI,KAAK,SAAS,SAAS;AAAA,UAChC,QAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,WAAW;AAAA,cACT,KAAK,QAAQ,KAAK,oBAAoB,KAAK;AAAA,YAC7C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,eAAe,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,SAAS,QAAQ,WAAW,KAAK,QAAQ,GAAG,SAAS,SACjD,QAAQ,GAAG,OACX;AAAA,MACN,CAAC;AAAA,IACH,EAAO,SAAI,IAAI,SAAS,aAAa;AAAA,MACnC,MAAM,cAAc,IAAI,QACrB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAO,EAAU,IAAI,EAC1B,KAAK,EAAE;AAAA,MACV,MAAM,YAAY,IAAI,QACnB,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EACpC,IAAI,CAAC,OAAY;AAAA,QAChB,IAAI,EAAE;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,EAAE;AAAA,UACR,WAAW,KAAK,UAAU,EAAE,KAAK;AAAA,QACnC;AAAA,MACF,EAAE;AAAA,MAEJ,MAAM,eAAoB,EAAE,MAAM,YAAY;AAAA,MAC9C,IAAI,aAAa;AAAA,QACf,aAAa,UAAU;AAAA,MACzB;AAAA,MACA,IAAI,UAAU,SAAS,GAAG;AAAA,QACxB,aAAa,aAAa;AAAA,MAC5B;AAAA,MACA,eAAe,KAAK,YAAY;AAAA,IAClC,EAAO,SAAI,IAAI,SAAS,QAAQ;AAAA,MAC9B,eAAe,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,cAAc,IAAI;AAAA,QAClB,SAAS,KAAK,UACZ,IAAI,QAAQ,WAAW,IAClB,IAAI,QAAQ,GAAW,QACxB,IAAI,QAAQ,IAAI,CAAC,MAAW,EAAE,KAAK,CACzC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMT,gBAAgB,oBAAoB,CAClC,QACA,OACA,OACA,UACA,OACA,QASC;AAAA,EACD,MAAM,MAAM,IAAI,IAAI,4BAA4B,WAAW;AAAA,EAE3D,MAAM,OAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,mBAAmB;AAAA,MACjB,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,IAAI,SAAS,MAAM,SAAS,GAAG;AAAA,IAC7B,KAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU;AAAA,MACzB,gBAAgB;AAAA,MAChB,QAAQ;AAAA,IACV;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB;AAAA,EACF,CAAC;AAAA,EAED,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,IACtD,MAAM,gBACJ,2BAA2B,SAAS,UAAU,aAC9C,SAAS,MACX;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAS,MAAM,UAAU;AAAA,EACxC,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAAA,EAEA,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI,SAAS;AAAA,EACb,MAAM,uBAGF,CAAC;AAAA,EAEL,IAAI;AAAA,IACF,OAAO,MAAM;AAAA,MACX,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,MAC1C,IAAI;AAAA,QAAM;AAAA,MAEV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,MAChD,MAAM,QAAQ,OAAO,MAAM;AAAA,CAAI;AAAA,MAC/B,SAAS,MAAM,IAAI,KAAK;AAAA,MAExB,WAAW,QAAQ,OAAO;AAAA,QACxB,IAAI,CAAC,KAAK,WAAW,QAAQ;AAAA,UAAG;AAAA,QAChC,MAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAAA,QAEhC,IAAI,SAAS,UAAU;AAAA,UAErB,WAAW,YAAY,OAAO,OAAO,oBAAoB,GAAG;AAAA,YAC1D,MAAM,EAAE,MAAM,aAAa,SAAS;AAAA,UACtC;AAAA,UACA,MAAM,EAAE,MAAM,OAAO;AAAA,UACrB;AAAA,QACF;AAAA,QAEA,IAAI;AAAA,UACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,UAC9B,MAAM,SAAS,OAAO,UAAU;AAAA,UAChC,IAAI,CAAC;AAAA,YAAQ;AAAA,UAEb,MAAM,QAAQ,OAAO;AAAA,UACrB,IAAI,OAAO,SAAS;AAAA,YAClB,MAAM,EAAE,MAAM,QAAQ,SAAS,MAAM,QAAQ;AAAA,UAC/C;AAAA,UAGA,IAAI,OAAO,YAAY;AAAA,YACrB,WAAW,MAAM,MAAM,YAAY;AAAA,cACjC,MAAM,QAAQ,GAAG,SAAS;AAAA,cAC1B,IAAI,CAAC,qBAAqB,QAAQ;AAAA,gBAChC,qBAAqB,SAAS;AAAA,kBAC5B,IAAI,GAAG,MAAM;AAAA,kBACb,MAAM,GAAG,UAAU,QAAQ;AAAA,kBAC3B,WAAW;AAAA,gBACb;AAAA,cACF;AAAA,cACA,IAAI,GAAG,IAAI;AAAA,gBACT,qBAAqB,OAAO,KAAK,GAAG;AAAA,cACtC;AAAA,cACA,IAAI,GAAG,UAAU,MAAM;AAAA,gBACrB,qBAAqB,OAAO,OAAO,GAAG,SAAS;AAAA,cACjD;AAAA,cACA,IAAI,GAAG,UAAU,WAAW;AAAA,gBAC1B,qBAAqB,OAAO,aAAa,GAAG,SAAS;AAAA,cACvD;AAAA,YACF;AAAA,UACF;AAAA,UAEA,IAAI,OAAO,kBAAkB,UAAU,OAAO,kBAAkB,cAAc;AAAA,YAE5E,WAAW,YAAY,OAAO,OAAO,oBAAoB,GAAG;AAAA,cAC1D,IAAI,SAAS,MAAM;AAAA,gBACjB,MAAM,EAAE,MAAM,aAAa,SAAS;AAAA,cACtC;AAAA,YACF;AAAA,YACA,MAAM,EAAE,MAAM,OAAO;AAAA,YACrB;AAAA,UACF;AAAA,UACA,MAAM;AAAA,MAGV;AAAA,IACF;AAAA,YACA;AAAA,IACA,OAAO,YAAY;AAAA;AAAA;AAWvB,eAAe,SAAS;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,GAOC;AAAA,EACD,IAAI,UAAU;AAAA,IACZ,OAAO,MAAM,SAAS,EAAE,UAAU,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,SAAwC,CAAC;AAAA,EAC/C,WAAW,YAAY,WAAW;AAAA,IAChC,OAAO,YAAY,eAAe,aAAa;AAAA,EACjD;AAAA,EACA,OAAO;AAAA;AAMT,eAAe,cAAc;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAO8B;AAAA,EAE9B,MAAM,oBAAoB,sBAAsB;AAAA,EAChD,IAAI,mBAAmB;AAAA,IACrB,OAAO,MAAM,kBAAkB,QAAQ,KAAK;AAAA,EAC9C;AAAA,EAGA,IAAI,WAAY,UAAkB;AAAA,EAClC,IAAI,CAAC,YAAY,aAAa,eAAe;AAAA,IAC3C,WAAY,UAAkB;AAAA,EAChC;AAAA,EAEA,IAAI,UAAU;AAAA,IACZ,OAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAAA,EAGA,QAAQ;AAAA,SACD;AAAA,MACH,OAAO,CAAC,EAAE,MAAM,QAAQ,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;AAAA,SAExD,cAAc;AAAA,MACjB,MAAM,QAAQ,MAAM,UAAU;AAAA,QAC5B,WAAW,MAAM,SAAS,MAAM,aAAa,CAAC;AAAA,QAC9C,UAAU,UAAU;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,MACD,OAAO,CAAC,EAAE,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,IACxC;AAAA,SAEK;AAAA,SACA;AAAA,MACH,MAAM,IAAI,2BACR,UACA,4DACF;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,2BACR,wBACA,kDACF;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,2BACR,eACA,+DACF;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,2BACR,kBACA,+CACF;AAAA,SAEG;AAAA,MACH,MAAM,IAAI,2BACR,QACA,+CACF;AAAA,SAEG;AAAA,MACH,OAAO,CAAC;AAAA,QACN,MAAM;AAAA,QACN,OAAO,EAAE,SAAS,qDAAqD;AAAA,MACzE,CAAC;AAAA;AAAA,MAGD,MAAM,IAAI,MACR,uCAAuC,eACrC,uEACJ;AAAA;AAAA;AAgBN,SAAS,iBAAiB,CACxB,iBACA,cACQ;AAAA,EACR,MAAM,QAAkB,CAAC;AAAA,EAGzB,IAAI,iBAAiB,cAAc;AAAA,IACjC,MAAM,KAAK,gBAAgB,YAAY;AAAA,EACzC,EAAO;AAAA,IACL,MAAM,KACJ,uFACF;AAAA;AAAA,EAIF,MAAM,WAAW,OAAO,KAAK,YAAY;AAAA,EACzC,IAAI,SAAS,SAAS,GAAG;AAAA,IACvB,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAAgE,SAAS,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,KAAK;AAAA,CAAI,GAAG;AAAA,EACvH;AAAA,EAEA,OAAO,MAAM,KAAK;AAAA;AAAA,CAAM;AAAA;AAM1B,SAAS,gBAAgB,CACvB,iBACA,uBACmB;AAAA,EACnB,MAAM,QAAe,CAAC;AAAA,EAGtB,MAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO,EAAE,MAAM,SAAS;AAAA,YACxB,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAGD,MAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAGD,WAAW,QAAQ,uBAAuB;AAAA,IACxC,MAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAM,SAAS,IAAI,QAAQ;AAAA;AAMpC,eAAsB,GAAG,CACvB,SACyB;AAAA,EACzB;AAAA,IACE;AAAA,IACA;AAAA,IACA,eAAe,CAAC;AAAA,IAChB;AAAA,IACA,mBAAmB,CAAC;AAAA,IACpB,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,gBAAgB,CAAC;AAAA,IACjB,wBAAwB,CAAC;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,EAEJ,IAAI,QAAQ,SAAS;AAAA,IACnB,OAAO;AAAA,MACL,cAAc,aAAa;AAAA,MAC3B,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS,iBAAiB,MAAM,EAAE;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IAAI;AAAA,EACJ,IAAI;AAAA,EAEJ,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,kBAAkB;AAAA,IAClB,UAAU,MAAM;AAAA,EAClB,EAAO;AAAA,IACL,UAAU;AAAA,IACV,kBAAkB,iBAAiB,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAAA;AAAA,EAI/D,IAAI;AAAA,EACJ,IAAI,aAAa,cAAc;AAAA,IAC7B,eAAe,MAAM,mCACnB,WACA,YAAY,cACZ;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CACF;AAAA,EACF,EAAO;AAAA,IACL,eAAe,MAAM,0BAA0B;AAAA,MAC7C,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,mBAAmB;AAAA,MACvB,OAAO,sBAAsB;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA;AAAA,EAIH,MAAM,WAAW,MAAM,sBAAsB,QAAQ,CAAC,IAAI,GAAG,MAAM;AAAA,EACnE,IAAI,CAAC,UAAU;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAGA,MAAM,QAAQ,MAAM,cAClB,QACA,SACA,aAAa,eAAe,gBAC5B,MACF;AAAA,EACA,IAAI,CAAC,OAAO;AAAA,IACV,OAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,eAAe,QAAQ;AAAA,EAGpC,MAAM,eAAe,kBAAkB,iBAAiB,YAAY;AAAA,EACpE,MAAM,QAAQ,iBAAiB,iBAAiB,qBAAqB;AAAA,EACrE,MAAM,QAAQ,iBAAiB,SAAS;AAAA,EAGxC,MAAM,WAAsB,CAAC,GAAG,aAAa,eAAe,cAAc;AAAA,EAG1E,IAAI,oBAAoB,iBAAiB,SAAS,GAAG;AAAA,IACnD,SAAS,KAAK,GAAG,gBAAgB;AAAA,EACnC;AAAA,EAGA,MAAM,kBAAkB,0BAA0B,OAAO;AAAA,EACzD,IAAI,UAAU,iBAAiB;AAAA,IAC7B,SAAS,KACP,YAAY,wBAAwB,QAAQ,QAAQ,eAAe,CAAC,CACtE;AAAA,EACF;AAAA,EAGA,MAAM,oBACJ,OAAO,YAAY,sBAAsB,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,EAEtE,IAAI,aAAa;AAAA,EACjB,IAAI,cAAc;AAAA,EAClB,IAAI,eAAe;AAAA,EAEnB,IAAI;AAAA,IAEF,OAAO,aAAa,eAAe;AAAA,MACjC,IAAI,QAAQ,SAAS;AAAA,QACnB;AAAA,MACF;AAAA,MAEA;AAAA,MACA,MAAM,iBAAiB,wBAAwB,UAAU,YAAY;AAAA,MAGrE,IAAI,aAAa;AAAA,QACf,MAAM,YAAY;AAAA,UAChB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,sBAAsB,SAAS;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,MAEA,IAAI,eAAe;AAAA,MACnB,MAAM,YAA+D,CAAC;AAAA,MAGtE,iBAAiB,SAAS,qBACxB,QACA,OACA,OACA,gBACA,OACA,MACF,GAAG;AAAA,QACD,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,UAC1C,gBAAgB,MAAM;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,IAAI,mBAAmB;AAAA,YACrB,MAAM,kBAAkB,MAAM,OAAO;AAAA,UACvC;AAAA,QACF,EAAO,SAAI,MAAM,SAAS,eAAe,MAAM,UAAU;AAAA,UACvD,UAAU,KAAK,MAAM,QAAQ;AAAA,QAC/B,EAAO,SAAI,MAAM,SAAS,QAAQ;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,MAGA,IAAI,gBAAgB,UAAU,SAAS,GAAG;AAAA,QACxC,MAAM,mBAA0B,CAAC;AAAA,QACjC,IAAI,cAAc;AAAA,UAChB,iBAAiB,KAAK,EAAE,MAAM,QAAQ,MAAM,aAAa,CAAC;AAAA,QAC5D;AAAA,QACA,WAAW,MAAM,WAAW;AAAA,UAC1B,iBAAiB,KAAK;AAAA,YACpB,MAAM;AAAA,YACN,YAAY,GAAG;AAAA,YACf,UAAU,GAAG;AAAA,YACb,OAAO,KAAK,MAAM,GAAG,aAAa,IAAI;AAAA,UACxC,CAAC;AAAA,QACH;AAAA,QACA,SAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ,KAAK,IAAI;AAAA,QACnB,CAAqB;AAAA,MACvB;AAAA,MAGA,IAAI,UAAU,WAAW,GAAG;AAAA,QAC1B;AAAA,MACF;AAAA,MAGA,MAAM,aAAa,UAAU,KAC3B,CAAC,OAAO,GAAG,SAAS,cAAc,GAAG,SAAS,gBAChD;AAAA,MAGA,WAAW,MAAM,WAAW;AAAA,QAC1B,IAAI,GAAG,SAAS,cAAc,GAAG,SAAS,kBAAkB;AAAA,UAE1D,SAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,YAAY,GAAG;AAAA,YACf,UAAU,GAAG;AAAA,YACb,SAAS,CAAC,EAAE,MAAM,QAAQ,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;AAAA,UAC/D,CAAgB;AAAA,UAChB;AAAA,QACF;AAAA,QAEA,IAAI;AAAA,UACF,MAAM,QAAQ,KAAK,MAAM,GAAG,aAAa,IAAI;AAAA,UAC7C,MAAM,SAAS,MAAM,eAAe;AAAA,YAClC,UAAU,GAAG;AAAA,YACb;AAAA,YACA,WAAW;AAAA,YACX,uBAAuB;AAAA,YACvB;AAAA,UACF,CAAC;AAAA,UAED,SAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,YAAY,GAAG;AAAA,YACf,UAAU,GAAG;AAAA,YACb,SAAS;AAAA,UACX,CAAgB;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,MAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UACvD,SAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,YAAY,GAAG;AAAA,YACf,UAAU,GAAG;AAAA,YACb,SAAS,CAAC,EAAE,MAAM,QAAQ,OAAO,EAAE,aAAa,EAAE,CAAC;AAAA,UACrD,CAAgB;AAAA;AAAA,MAEpB;AAAA,MAEA,IAAI,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,IAGA,aAAa,eAAe,iBAAiB;AAAA,IAC7C,aAAa,eAAe,iBAAiB,gBAAgB;AAAA,IAC7D,aAAa,eAAe,cAAc;AAAA,IAG1C,MAAM,eACJ,QACA,OACA,aACA,YACA,aACA,aACA,MACF;AAAA,IAGA,IAAI,aAAa;AAAA,MACf,MAAM,YAAY;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,aAAa,SAAS,gBAAgB,mBAAmB,CAAC;AAAA,MAC5E;AAAA,IACF;AAAA,IACA,OAAO,OAAO;AAAA,IACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC1E,MAAM,aAAa,mBAAmB,KAAK;AAAA,IAG3C,MAAM,eACJ,QACA,OACA,UACA,YACA,aACA,aACA,MACF;AAAA,IAEA,IAAI,aAAa;AAAA,MACf,MAAM,YAAY,EAAE,MAAM,SAAS,SAAS,aAAa,CAAC;AAAA,IAC5D;AAAA,IAEA,OAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,WACL,eAAe,aAAa,EAAE,WAAW;AAAA,MAC/C;AAAA,IACF;AAAA;AAAA;AAAA;AAcG,MAAM,qBAAqB;AAAA,EACzB;AAAA,EAIP,WAAW,CAAC,SAA8B;AAAA,IACxC,IAAI,CAAC,QAAQ,QAAQ;AAAA,MACnB,MAAM,IAAI,MACR,oGACF;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AAAA,MACb,aAAa,CAAC,UAAU;AAAA,QACtB,IAAI,MAAM,SAAS,SAAS;AAAA,UAC1B,MAAM,IAAI,MACR,mBAAmB,MAAM;AAAA;AAAA,qDAC3B;AAAA,QACF;AAAA;AAAA,MAEF,eAAe,uBAAuB,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAAA,SAC7E;AAAA,IACL;AAAA;AAAA,OASW,IAAG,CACd,SACyB;AAAA,IACzB,OAAO,IAAI,KAAK,KAAK,YAAY,QAAQ,CAAC;AAAA;AAAA,OAM/B,gBAAe,GAAqB;AAAA,IAC/C,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,GAAG,2BAA2B;AAAA,QACzD,QAAQ;AAAA,QACR,QAAQ,YAAY,QAAQ,IAAI;AAAA,MAClC,CAAC;AAAA,MAED,IAAI,CAAC,SAAS;AAAA,QAAI,OAAO;AAAA,MAEzB,MAAM,SAAS,MAAM,SAAS,KAAK;AAAA,MACnC,OACE,OAAO,WAAW,YAClB,WAAW,QACX,YAAY,UACX,OAAgC,WAAW;AAAA,MAE9C,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAGb;",
|
|
17
|
-
"debugId": "28AA7C461FC4713C64756E2164756E21",
|
|
18
|
-
"names": []
|
|
19
|
-
}
|