veryfront 0.0.70 → 0.0.72

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/_shims/deno-env.ts", "../../../src/ai/dev/testing/agent-tester.ts", "../../../src/ai/dev/testing/tool-tester.ts", "../../../src/ai/utils/zod-json-schema.ts", "../../../src/core/utils/runtime-guards.ts", "../../../src/core/utils/logger/env.ts", "../../../src/core/utils/logger/logger.ts", "../../../src/core/errors/veryfront-error.ts", "../../../src/ai/utils/tool.ts", "../../../src/ai/mcp/resource.ts", "../../../src/ai/mcp/prompt.ts", "../../../src/ai/mcp/registry.ts", "../../../src/ai/dev/debug/inspector.ts"],
4
- "sourcesContent": ["/**\n * Shim for Deno.env in Node.js environment\n * This file is injected by esbuild to provide Deno.env compatibility\n */\n\n// @ts-ignore - Global Deno shim for Node.js\nglobalThis.Deno = globalThis.Deno || {\n env: {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n },\n};\n", "/**\n * Agent Testing Utilities\n *\n * Utilities for testing agents in development and CI/CD.\n */\n\nimport type { Agent, AgentResponse, Message } from \"../../types/agent.ts\";\n\nexport interface TestCase {\n /** Test name */\n name: string;\n\n /** Input to agent */\n input: string | Message[];\n\n /** Expected output pattern (regex or string) */\n expected?: RegExp | string;\n\n /** Expected tool calls */\n expectToolCalls?: string[];\n\n /** Maximum execution time (ms) */\n timeout?: number;\n\n /** Custom validator */\n validate?: (response: AgentResponse) => boolean | Promise<boolean>;\n}\n\nexport interface TestResult {\n /** Test case name */\n name: string;\n\n /** Pass/fail */\n passed: boolean;\n\n /** Response from agent */\n response?: AgentResponse;\n\n /** Error if test failed */\n error?: string;\n\n /** Execution time */\n executionTime: number;\n\n /** Tool calls made */\n toolCalls: string[];\n}\n\nexport interface TestSuite {\n /** Suite name */\n name: string;\n\n /** Test results */\n results: TestResult[];\n\n /** Overall pass/fail */\n passed: boolean;\n\n /** Total execution time */\n totalTime: number;\n}\n\n/**\n * Test an agent with multiple test cases\n *\n * @example\n * ```typescript\n * import { testAgent } from 'veryfront/ai/dev';\n *\n * const results = await testAgent(myAgent, [\n * {\n * name: 'Simple greeting',\n * input: 'Hello',\n * expected: /hello|hi|hey/i,\n * },\n * {\n * name: 'Tool usage',\n * input: 'Search for AI frameworks',\n * expectToolCalls: ['searchWeb'],\n * },\n * ]);\n *\n * console.log(`Passed: ${results.results.filter(r => r.passed).length}/${results.results.length}`);\n * ```\n */\nexport async function testAgent(\n agent: Agent,\n testCases: TestCase[],\n): Promise<TestSuite> {\n const suite: TestSuite = {\n name: agent.id,\n results: [],\n passed: true,\n totalTime: 0,\n };\n\n const suiteStartTime = Date.now();\n\n for (const testCase of testCases) {\n const result = await runTestCase(agent, testCase);\n suite.results.push(result);\n\n if (!result.passed) {\n suite.passed = false;\n }\n }\n\n suite.totalTime = Date.now() - suiteStartTime;\n\n return suite;\n}\n\n/**\n * Run a single test case\n */\nasync function runTestCase(agent: Agent, testCase: TestCase): Promise<TestResult> {\n const startTime = Date.now();\n\n try {\n // Set timeout\n const timeout = testCase.timeout || 30000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(\"Test timeout\")), timeout);\n });\n\n // Execute agent\n const responsePromise = agent.generate({\n input: testCase.input,\n });\n\n const response = await Promise.race([responsePromise, timeoutPromise]);\n\n const executionTime = Date.now() - startTime;\n const toolCalls = response.toolCalls.map((tc) => tc.name);\n\n // Validate response\n let passed = true;\n let error: string | undefined;\n\n // Check expected output\n if (testCase.expected) {\n if (testCase.expected instanceof RegExp) {\n passed = testCase.expected.test(response.text);\n if (!passed) {\n error = `Output \"${response.text}\" does not match pattern ${testCase.expected}`;\n }\n } else {\n passed = response.text.includes(testCase.expected);\n if (!passed) {\n error = `Output does not contain expected text: \"${testCase.expected}\"`;\n }\n }\n }\n\n // Check expected tool calls\n if (passed && testCase.expectToolCalls) {\n const expectedTools = testCase.expectToolCalls;\n const missingTools = expectedTools.filter((t) => !toolCalls.includes(t));\n\n if (missingTools.length > 0) {\n passed = false;\n error = `Expected tool calls not found: ${missingTools.join(\", \")}`;\n }\n }\n\n // Custom validation\n if (passed && testCase.validate) {\n try {\n passed = await testCase.validate(response);\n if (!passed) {\n error = \"Custom validation failed\";\n }\n } catch (err) {\n passed = false;\n error = `Custom validation error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n return {\n name: testCase.name,\n passed,\n response,\n error,\n executionTime,\n toolCalls,\n };\n } catch (err) {\n return {\n name: testCase.name,\n passed: false,\n error: err instanceof Error ? err.message : String(err),\n executionTime: Date.now() - startTime,\n toolCalls: [],\n };\n }\n}\n\n/**\n * Print test results in a readable format\n */\nexport function printTestResults(suite: TestSuite): void {\n console.log(`\\n=== Test Suite: ${suite.name} ===\\n`);\n\n const passed = suite.results.filter((r) => r.passed).length;\n const total = suite.results.length;\n\n suite.results.forEach((result, index) => {\n const icon = result.passed ? \"\u2705\" : \"\u274C\";\n console.log(`${icon} ${index + 1}. ${result.name}`);\n\n if (!result.passed && result.error) {\n console.log(` Error: ${result.error}`);\n }\n\n if (result.toolCalls.length > 0) {\n console.log(` Tools used: ${result.toolCalls.join(\", \")}`);\n }\n\n console.log(` Time: ${result.executionTime}ms\\n`);\n });\n\n console.log(`Results: ${passed}/${total} passed`);\n console.log(`Total time: ${suite.totalTime}ms`);\n console.log(`Status: ${suite.passed ? \"\u2705 PASSED\" : \"\u274C FAILED\"}\\n`);\n}\n\n/**\n * Assert that an agent response contains text\n */\nexport function assertContains(response: AgentResponse, text: string): boolean {\n return response.text.toLowerCase().includes(text.toLowerCase());\n}\n\n/**\n * Assert that an agent called a specific tool\n */\nexport function assertToolCalled(response: AgentResponse, toolName: string): boolean {\n return response.toolCalls.some((tc) => tc.name === toolName);\n}\n\n/**\n * Assert that an agent completed successfully\n */\nexport function assertCompleted(response: AgentResponse): boolean {\n return response.status === \"completed\";\n}\n", "/**\n * Tool Testing Utilities\n *\n * Utilities for testing individual tools.\n */\n\nimport type { Tool } from \"../../types/tool.ts\";\n\nexport interface ToolTestCase {\n /** Test name */\n name: string;\n\n /** Tool input */\n input: any;\n\n /** Expected output (partial match) */\n expectedOutput?: any;\n\n /** Custom validator */\n validate?: (result: any) => boolean | Promise<boolean>;\n\n /** Should throw error */\n shouldThrow?: boolean;\n\n /** Expected error message pattern */\n expectedError?: RegExp | string;\n}\n\nexport interface ToolTestResult {\n /** Test case name */\n name: string;\n\n /** Pass/fail */\n passed: boolean;\n\n /** Tool result */\n result?: any;\n\n /** Error if test failed */\n error?: string;\n\n /** Execution time */\n executionTime: number;\n}\n\n/**\n * Test a tool with multiple test cases\n *\n * @example\n * ```typescript\n * import { testTool } from 'veryfront/ai/dev';\n *\n * const results = await testTool(calculatorTool, [\n * {\n * name: 'Addition',\n * input: { operation: 'add', a: 2, b: 3 },\n * expectedOutput: { result: 5 },\n * },\n * {\n * name: 'Division by zero',\n * input: { operation: 'divide', a: 5, b: 0 },\n * shouldThrow: true,\n * expectedError: /cannot divide by zero/i,\n * },\n * ]);\n * ```\n */\nexport async function testTool(\n tool: Tool,\n testCases: ToolTestCase[],\n): Promise<ToolTestResult[]> {\n const results: ToolTestResult[] = [];\n\n for (const testCase of testCases) {\n const result = await runToolTest(tool, testCase);\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Run a single tool test\n */\nasync function runToolTest(\n tool: Tool,\n testCase: ToolTestCase,\n): Promise<ToolTestResult> {\n const startTime = Date.now();\n\n try {\n // Execute tool\n const result = await tool.execute(testCase.input);\n const executionTime = Date.now() - startTime;\n\n // If we expected an error but didn't get one\n if (testCase.shouldThrow) {\n return {\n name: testCase.name,\n passed: false,\n error: \"Expected tool to throw error but it succeeded\",\n executionTime,\n };\n }\n\n // Validate output\n let passed = true;\n let error: string | undefined;\n\n if (testCase.expectedOutput !== undefined) {\n passed = deepMatch(result, testCase.expectedOutput);\n if (!passed) {\n error = `Output mismatch. Expected: ${JSON.stringify(testCase.expectedOutput)}, Got: ${\n JSON.stringify(result)\n }`;\n }\n }\n\n if (passed && testCase.validate) {\n try {\n passed = await testCase.validate(result);\n if (!passed) {\n error = \"Custom validation failed\";\n }\n } catch (err) {\n passed = false;\n error = `Validation error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n return {\n name: testCase.name,\n passed,\n result,\n error,\n executionTime,\n };\n } catch (err) {\n const executionTime = Date.now() - startTime;\n const errorMessage = err instanceof Error ? err.message : String(err);\n\n // If we expected an error\n if (testCase.shouldThrow) {\n let passed = true;\n let error: string | undefined;\n\n if (testCase.expectedError) {\n if (testCase.expectedError instanceof RegExp) {\n passed = testCase.expectedError.test(errorMessage);\n } else {\n passed = errorMessage.includes(testCase.expectedError);\n }\n\n if (!passed) {\n error =\n `Error message mismatch. Expected pattern: ${testCase.expectedError}, Got: ${errorMessage}`;\n }\n }\n\n return {\n name: testCase.name,\n passed,\n error,\n executionTime,\n };\n }\n\n // Unexpected error\n return {\n name: testCase.name,\n passed: false,\n error: `Unexpected error: ${errorMessage}`,\n executionTime,\n };\n }\n}\n\n/**\n * Deep match for partial object comparison\n */\nfunction deepMatch(actual: any, expected: any): boolean {\n if (expected === actual) return true;\n if (typeof expected !== \"object\" || expected === null) return false;\n if (typeof actual !== \"object\" || actual === null) return false;\n\n for (const key in expected) {\n if (!(key in actual)) return false;\n\n const expectedValue = expected[key];\n const actualValue = actual[key];\n\n if (typeof expectedValue === \"object\" && expectedValue !== null) {\n if (!deepMatch(actualValue, expectedValue)) return false;\n } else {\n if (actualValue !== expectedValue) return false;\n }\n }\n\n return true;\n}\n\n/**\n * Print tool test results\n */\nexport function printToolTestResults(\n toolId: string,\n results: ToolTestResult[],\n): void {\n console.log(`\\n=== Tool Tests: ${toolId} ===\\n`);\n\n const passed = results.filter((r) => r.passed).length;\n const total = results.length;\n\n results.forEach((result, index) => {\n const icon = result.passed ? \"\u2705\" : \"\u274C\";\n console.log(`${icon} ${index + 1}. ${result.name}`);\n\n if (!result.passed && result.error) {\n console.log(` Error: ${result.error}`);\n }\n\n if (result.result !== undefined) {\n console.log(` Result: ${JSON.stringify(result.result)}`);\n }\n\n console.log(` Time: ${result.executionTime}ms\\n`);\n });\n\n console.log(`Results: ${passed}/${total} passed`);\n console.log(`Status: ${passed === total ? \"\u2705 ALL PASSED\" : \"\u274C SOME FAILED\"}\\n`);\n}\n", "import type { z } from \"zod\";\nimport { ZodFirstPartyTypeKind } from \"zod\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\n\nexport function zodToJsonSchema(schema: z.ZodTypeAny): JsonSchema {\n // Guard against invalid schemas (can happen with different zod instances in npm bundle)\n if (!schema || typeof schema !== \"object\" || !(\"_def\" in schema)) {\n throw new Error(\"Invalid Zod schema: missing _def property\");\n }\n\n const details = unwrapSchema(schema);\n const json = convert(details.schema);\n if (details.nullable) {\n return { anyOf: [json, { type: \"null\" }] };\n }\n return json;\n}\n\nexport function isOptionalSchema(schema: z.ZodTypeAny): boolean {\n const { optional } = unwrapSchema(schema);\n return optional;\n}\n\nfunction convert(schema: z.ZodTypeAny): JsonSchema {\n switch (schema._def.typeName) {\n case ZodFirstPartyTypeKind.ZodString:\n return { type: \"string\" };\n case ZodFirstPartyTypeKind.ZodNumber:\n return { type: \"number\" };\n case ZodFirstPartyTypeKind.ZodBoolean:\n return { type: \"boolean\" };\n case ZodFirstPartyTypeKind.ZodBigInt:\n return { type: \"integer\" };\n case ZodFirstPartyTypeKind.ZodLiteral: {\n const literal = (schema as z.ZodLiteral<unknown>)._def.value;\n return {\n const: literal,\n type: typeof literal === \"string\"\n ? \"string\"\n : typeof literal === \"number\"\n ? \"number\"\n : typeof literal === \"boolean\"\n ? \"boolean\"\n : undefined,\n };\n }\n case ZodFirstPartyTypeKind.ZodEnum:\n return {\n type: \"string\",\n enum: (schema as z.ZodEnum<[string, ...string[]]>)._def.values,\n };\n case ZodFirstPartyTypeKind.ZodNativeEnum:\n return {\n enum: Object.values((schema as z.ZodNativeEnum<any>)._def.values).filter(\n (value) => typeof value !== \"number\",\n ),\n };\n case ZodFirstPartyTypeKind.ZodObject: {\n const obj = schema as z.ZodObject<any>;\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n // Access shape - it might be a function (lazy getter) or an object\n const shape = typeof obj._def.shape === \"function\" ? obj._def.shape() : obj._def.shape;\n\n for (const [key, value] of Object.entries(shape || {})) {\n const zodSchema = value as z.ZodTypeAny;\n properties[key] = zodToJsonSchema(zodSchema);\n if (!isOptionalSchema(zodSchema)) {\n required.push(key);\n }\n }\n\n const json: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) {\n json.required = required;\n }\n return json;\n }\n case ZodFirstPartyTypeKind.ZodArray: {\n const array = schema as z.ZodArray<z.ZodTypeAny>;\n return {\n type: \"array\",\n items: zodToJsonSchema(array._def.type),\n };\n }\n case ZodFirstPartyTypeKind.ZodTuple: {\n const tuple = schema as z.ZodTuple;\n return {\n type: \"array\",\n prefixItems: tuple._def.items.map((item) => zodToJsonSchema(item)),\n minItems: tuple._def.items.length,\n maxItems: tuple._def.items.length,\n };\n }\n case ZodFirstPartyTypeKind.ZodUnion: {\n const union = schema as z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>;\n return {\n anyOf: union._def.options.map((option) => zodToJsonSchema(option)),\n };\n }\n case ZodFirstPartyTypeKind.ZodDiscriminatedUnion: {\n const union = schema as z.ZodDiscriminatedUnion<string, z.ZodObject<any>[]>;\n return {\n anyOf: Array.from(union._def.options.values()).map((option) => zodToJsonSchema(option)),\n };\n }\n case ZodFirstPartyTypeKind.ZodRecord:\n return {\n type: \"object\",\n additionalProperties: zodToJsonSchema((schema as z.ZodRecord<any>)._def.valueType),\n };\n case ZodFirstPartyTypeKind.ZodDefault: {\n const def = schema as z.ZodDefault<z.ZodTypeAny>;\n const inner = zodToJsonSchema(def._def.innerType);\n const defaultValue = def._def.defaultValue();\n if (typeof inner === \"object\" && !(\"anyOf\" in inner)) {\n inner.default = defaultValue;\n }\n return inner;\n }\n case ZodFirstPartyTypeKind.ZodLazy:\n return convert((schema as z.ZodLazy<any>)._def.getter());\n case ZodFirstPartyTypeKind.ZodEffects:\n return convert((schema as z.ZodEffects<any>)._def.schema);\n default:\n return { type: \"object\" };\n }\n}\n\nfunction unwrapSchema(schema: z.ZodTypeAny) {\n let current: z.ZodTypeAny = schema;\n let nullable = false;\n let optional = false;\n\n while (true) {\n switch (current._def.typeName) {\n case ZodFirstPartyTypeKind.ZodNullable:\n nullable = true;\n current = (current as z.ZodNullable<z.ZodTypeAny>)._def.innerType;\n continue;\n case ZodFirstPartyTypeKind.ZodOptional:\n optional = true;\n current = (current as z.ZodOptional<z.ZodTypeAny>)._def.innerType;\n continue;\n case ZodFirstPartyTypeKind.ZodEffects:\n current = (current as z.ZodEffects<any>)._def.schema;\n continue;\n default:\n return { schema: current, nullable, optional };\n }\n }\n}\n", "export interface GlobalWithDeno {\n Deno?: {\n env: {\n get(key: string): string | undefined;\n };\n };\n}\n\nexport interface GlobalWithProcess {\n process?: {\n env: Record<string, string | undefined>;\n version?: string;\n versions?: Record<string, string>;\n };\n}\n\nexport interface GlobalWithBun {\n Bun?: {\n version: string;\n };\n}\n\nexport function hasDenoRuntime(global: unknown): global is GlobalWithDeno {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Deno\" in global &&\n typeof (global as GlobalWithDeno).Deno?.env?.get === \"function\"\n );\n}\n\nexport function hasNodeProcess(global: unknown): global is GlobalWithProcess {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"process\" in global &&\n typeof (global as GlobalWithProcess).process?.env === \"object\"\n );\n}\n\nexport function hasBunRuntime(global: unknown): global is GlobalWithBun {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Bun\" in global &&\n typeof (global as GlobalWithBun).Bun !== \"undefined\"\n );\n}\n", "import type { GlobalWithDeno, GlobalWithProcess } from \"../runtime-guards.ts\";\nimport { hasDenoRuntime, hasNodeProcess } from \"../runtime-guards.ts\";\n\nexport function getEnvironmentVariable(name: string): string | undefined {\n try {\n if (typeof Deno !== \"undefined\" && hasDenoRuntime(globalThis)) {\n const value = (globalThis as GlobalWithDeno).Deno?.env.get(name);\n return value === \"\" ? undefined : value;\n }\n if (hasNodeProcess(globalThis)) {\n const value = (globalThis as GlobalWithProcess).process?.env[name];\n return value === \"\" ? undefined : value;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nexport function isTestEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"test\";\n}\n\nexport function isProductionEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"production\";\n}\n\nexport function isDevelopmentEnvironment(): boolean {\n const env = getEnvironmentVariable(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n", "import { getEnvironmentVariable } from \"./env.ts\";\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n time<T>(label: string, fn: () => Promise<T>): Promise<T>;\n}\n\nconst originalConsole = {\n debug: console.debug,\n log: console.log,\n warn: console.warn,\n error: console.error,\n};\n\nlet cachedLogLevel: LogLevel | undefined;\n\nfunction resolveLogLevel(force = false): LogLevel {\n if (force || cachedLogLevel === undefined) {\n cachedLogLevel = getDefaultLevel();\n }\n return cachedLogLevel;\n}\n\nclass ConsoleLogger implements Logger {\n constructor(\n private prefix: string,\n private level: LogLevel = resolveLogLevel(),\n ) {}\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG: ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.log(`[${this.prefix}] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN: ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR: ${message}`, ...args);\n }\n }\n\n async time<T>(label: string, fn: () => Promise<T>): Promise<T> {\n const start = performance.now();\n try {\n const result = await fn();\n const end = performance.now();\n this.debug(`${label} completed in ${(end - start).toFixed(2)}ms`);\n return result;\n } catch (error) {\n const end = performance.now();\n this.error(`${label} failed after ${(end - start).toFixed(2)}ms`, error);\n throw error;\n }\n }\n}\n\nfunction parseLogLevel(levelString: string | undefined): LogLevel | undefined {\n if (!levelString) return undefined;\n const upper = levelString.toUpperCase();\n switch (upper) {\n case \"DEBUG\":\n return LogLevel.DEBUG;\n case \"WARN\":\n return LogLevel.WARN;\n case \"ERROR\":\n return LogLevel.ERROR;\n case \"INFO\":\n return LogLevel.INFO;\n default:\n return undefined;\n }\n}\n\nconst getDefaultLevel = (): LogLevel => {\n const envLevel = getEnvironmentVariable(\"LOG_LEVEL\");\n const parsedLevel = parseLogLevel(envLevel);\n if (parsedLevel !== undefined) return parsedLevel;\n\n const debugFlag = getEnvironmentVariable(\"VERYFRONT_DEBUG\");\n if (debugFlag === \"1\" || debugFlag === \"true\") return LogLevel.DEBUG;\n\n return LogLevel.INFO;\n};\n\nconst trackedLoggers = new Set<ConsoleLogger>();\n\nfunction createLogger(prefix: string): ConsoleLogger {\n const logger = new ConsoleLogger(prefix);\n trackedLoggers.add(logger);\n return logger;\n}\n\nexport const cliLogger = createLogger(\"CLI\");\nexport const serverLogger = createLogger(\"SERVER\");\nexport const rendererLogger = createLogger(\"RENDERER\");\nexport const bundlerLogger = createLogger(\"BUNDLER\");\nexport const agentLogger = createLogger(\"AGENT\");\n\nexport const logger = createLogger(\"VERYFRONT\");\n\ntype LoggerResetOptions = {\n restoreConsole?: boolean;\n};\n\nexport function __loggerResetForTests(options: LoggerResetOptions = {}): void {\n const updatedLevel = resolveLogLevel(true);\n for (const instance of trackedLoggers) {\n instance.setLevel(updatedLevel);\n }\n\n if (options.restoreConsole) {\n console.debug = originalConsole.debug;\n console.log = originalConsole.log;\n console.warn = originalConsole.warn;\n console.error = originalConsole.error;\n }\n}\n", "export interface BuildContext {\n file?: string;\n line?: number;\n column?: number;\n moduleId?: string;\n phase?: \"parse\" | \"transform\" | \"bundle\" | \"optimize\";\n}\n\nexport interface APIContext {\n endpoint?: string;\n method?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderContext {\n component?: string;\n route?: string;\n phase?: \"server\" | \"client\" | \"hydration\";\n props?: unknown;\n}\n\nexport interface ConfigContext {\n configFile?: string;\n field?: string;\n value?: unknown;\n expected?: string;\n}\n\nexport interface AgentContext {\n agentId?: string;\n intent?: string;\n timeout?: number;\n}\n\nexport interface FileContext {\n path?: string;\n operation?: \"read\" | \"write\" | \"delete\" | \"mkdir\";\n permissions?: string;\n}\n\nexport interface NetworkContext {\n url?: string;\n timeout?: number;\n retryCount?: number;\n}\n\nexport type VeryfrontError =\n | { type: \"build\"; message: string; context?: BuildContext }\n | { type: \"api\"; message: string; context?: APIContext }\n | { type: \"render\"; message: string; context?: RenderContext }\n | { type: \"config\"; message: string; context?: ConfigContext }\n | { type: \"agent\"; message: string; context?: AgentContext }\n | { type: \"file\"; message: string; context?: FileContext }\n | { type: \"network\"; message: string; context?: NetworkContext }\n | { type: \"permission\"; message: string; context?: FileContext }\n | { type: \"not_supported\"; message: string; feature?: string };\n\nexport function createError(error: VeryfrontError): VeryfrontError {\n return error;\n}\n\nexport function isBuildError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"build\" }> {\n return error.type === \"build\";\n}\n\nexport function isAPIError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"api\" }> {\n return error.type === \"api\";\n}\n\nexport function isRenderError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"render\" }> {\n return error.type === \"render\";\n}\n\nexport function isConfigError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"config\" }> {\n return error.type === \"config\";\n}\n\nexport function isAgentError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"agent\" }> {\n return error.type === \"agent\";\n}\n\nexport function isFileError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"file\" }> {\n return error.type === \"file\";\n}\n\nexport function isNetworkError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"network\" }> {\n return error.type === \"network\";\n}\n\nexport function toError(veryfrontError: VeryfrontError): Error {\n const error = new Error(veryfrontError.message);\n error.name = `VeryfrontError[${veryfrontError.type}]`;\n Object.defineProperty(error, \"context\", {\n value: veryfrontError,\n enumerable: false,\n configurable: true,\n });\n return error;\n}\n\nexport function fromError(error: unknown): VeryfrontError | null {\n if (error && typeof error === \"object\" && \"context\" in error) {\n // Safe access after 'in' check\n const context = (error as Record<string, unknown>).context;\n if (\n context &&\n typeof context === \"object\" &&\n \"type\" in context &&\n \"message\" in context\n ) {\n return context as VeryfrontError;\n }\n }\n return null;\n}\n\nexport function logError(\n error: VeryfrontError,\n logger?: { error: (msg: string, ...args: unknown[]) => void },\n): void {\n const log = logger || console;\n const context = \"context\" in error ? error.context || {} : {};\n log.error(`[${error.type}] ${error.message}`, context);\n}\n", "import type { Tool, ToolConfig, ToolDefinition, ToolExecutionContext } from \"../types/tool.ts\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\nimport { zodToJsonSchema } from \"./zod-json-schema.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create a tool\n *\n * @example\n * ```typescript\n * import { tool } from 'veryfront/ai';\n * import { z } from 'zod';\n\n *\n * export default tool({\n * description: 'Search the web',\n * inputSchema: z.object({\n * query: z.string(),\n * }),\n * execute: async ({ query }) => {\n * const results = await searchWeb(query);\n * return results;\n * },\n * });\n * ```\n */\nexport function tool<TInput = any, TOutput = any>(\n config: ToolConfig<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const id = config.id || generateToolId();\n\n // Check if we have a valid zod schema (has _def property)\n const hasValidZodSchema = config.inputSchema &&\n typeof config.inputSchema === \"object\" &&\n \"_def\" in config.inputSchema &&\n (config.inputSchema as { _def?: { typeName?: string } })._def?.typeName;\n\n // Pre-convert Zod schema to JSON Schema immediately\n // This happens BEFORE any bundling, in a clean environment\n let inputSchemaJson: JsonSchema | undefined;\n if (hasValidZodSchema) {\n try {\n inputSchemaJson = zodToJsonSchema(config.inputSchema);\n agentLogger.info(\n `[TOOL] Pre-converted schema for \"${id}\": ${\n Object.keys(inputSchemaJson.properties || {}).length\n } properties`,\n );\n } catch (error) {\n agentLogger.warn(`[TOOL] Failed to pre-convert schema for \"${id}\":`, error);\n // Continue without pre-converted schema - will fall back to runtime conversion\n }\n } else {\n // Try to introspect the schema from external zod instance\n const externalSchema = config.inputSchema as {\n _def?: {\n typeName?: string;\n shape?: (() => Record<string, unknown>) | Record<string, unknown>;\n };\n };\n\n if (externalSchema?._def?.shape) {\n try {\n const shape = typeof externalSchema._def.shape === \"function\"\n ? externalSchema._def.shape()\n : externalSchema._def.shape;\n\n // Build JSON Schema from shape inspection\n const properties: Record<string, JsonSchema> = {};\n for (const key of Object.keys(shape || {})) {\n // Default to string type for unknown schemas\n properties[key] = { type: \"string\" as const };\n }\n inputSchemaJson = {\n type: \"object\" as const,\n properties,\n required: Object.keys(properties),\n };\n agentLogger.info(\n `[TOOL] Introspected schema for \"${id}\" from external zod: ${\n Object.keys(properties).length\n } properties`,\n );\n } catch {\n inputSchemaJson = { type: \"object\", properties: {} };\n agentLogger.warn(\n `[TOOL] Schema for \"${id}\" could not be introspected. Using empty schema.`,\n );\n }\n } else {\n agentLogger.warn(\n `[TOOL] Schema for \"${id}\" is not a valid Zod schema (different zod instance?). ` +\n `Skipping pre-conversion. Input validation may be limited.`,\n );\n // Create a basic schema from inspection if possible\n inputSchemaJson = { type: \"object\", properties: {} };\n }\n }\n\n return {\n id,\n description: config.description,\n inputSchema: config.inputSchema,\n inputSchemaJson, // Store pre-converted schema\n execute: async (input: TInput, context?: ToolExecutionContext) => {\n // Validate input if zod schema is available\n if (hasValidZodSchema) {\n try {\n config.inputSchema.parse(input);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${id}\" input validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n } else if (\n config.inputSchema &&\n typeof config.inputSchema === \"object\" &&\n \"parse\" in config.inputSchema &&\n typeof (config.inputSchema as { parse?: unknown }).parse === \"function\"\n ) {\n // Try to use parse method if available (external zod instance)\n try {\n (config.inputSchema as { parse: (input: unknown) => void }).parse(input);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${id}\" input validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n }\n\n // Execute tool\n return await config.execute(input, context);\n },\n mcp: config.mcp,\n };\n}\n\n/**\n * Generate a unique tool ID\n */\nlet toolIdCounter = 0;\nfunction generateToolId(): string {\n return `tool_${Date.now()}_${toolIdCounter++}`;\n}\n\n/**\n * Tool registry for managing tools\n */\nclass ToolRegistryClass {\n private tools = new Map<string, Tool>();\n\n register(id: string, toolInstance: Tool): void {\n if (this.tools.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Tool \"${id}\" is already registered. Overwriting.`);\n }\n\n this.tools.set(id, toolInstance);\n }\n\n /**\n * Get a tool by ID\n */\n get(id: string): Tool | undefined {\n return this.tools.get(id);\n }\n\n /**\n * Check if a tool exists\n */\n has(id: string): boolean {\n return this.tools.has(id);\n }\n\n /**\n * Get all tool IDs\n */\n getAllIds(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /**\n * Get all tools\n */\n getAll(): Map<string, Tool> {\n return new Map(this.tools);\n }\n\n /**\n * Clear all tools (for testing)\n */\n clear(): void {\n this.tools.clear();\n }\n\n getToolsForProvider(): ToolDefinition[] {\n return Array.from(this.tools.values()).map(toolToProviderDefinition);\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst TOOL_REGISTRY_KEY = \"__veryfront_tool_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalTool = globalThis as any;\nexport const toolRegistry: ToolRegistryClass = _globalTool[TOOL_REGISTRY_KEY] ||=\n new ToolRegistryClass();\n\nexport function toolToProviderDefinition(tool: Tool): ToolDefinition {\n // Use pre-converted JSON Schema if available (preferred)\n // Fall back to runtime conversion if needed\n const jsonSchema = tool.inputSchemaJson || zodToJsonSchema(tool.inputSchema);\n\n agentLogger.info(\n `[TOOL] Using ${\n tool.inputSchemaJson ? \"pre-converted\" : \"runtime-converted\"\n } schema for \"${tool.id}\"`,\n );\n\n return {\n name: tool.id,\n description: tool.description,\n parameters: jsonSchema,\n };\n}\n\n/**\n * Execute a tool by ID\n */\nexport async function executeTool(\n toolId: string,\n input: unknown,\n context?: ToolExecutionContext,\n): Promise<unknown> {\n const tool = toolRegistry.get(toolId);\n\n if (!tool) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${toolId}\" not found`,\n }));\n }\n\n try {\n const result = await tool.execute(input, context);\n return result;\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${toolId}\" execution failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n}\n\nexport { zodToJsonSchema } from \"./zod-json-schema.ts\";\n", "/**\n * MCP Resource factory and utilities\n */\n\nimport type { Resource, ResourceConfig } from \"../types/mcp.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create an MCP resource\n *\n * @example\n * ```typescript\n * import { resource } from 'veryfront/ai';\n * import { z } from 'zod';\n\n *\n * export default resource({\n * description: 'Get user profile',\n * paramsSchema: z.object({\n * userId: z.string(),\n * }),\n * load: async ({ userId }) => {\n * return await db.users.findUnique({ where: { id: userId } });\n * },\n * });\n * ```\n */\nexport function resource<TParams = any, TData = any>(\n config: ResourceConfig<TParams, TData>,\n): Resource<TParams, TData> {\n // Generate pattern if not provided\n const pattern = config.pattern || generateResourcePattern();\n\n // Generate ID from pattern\n const id = patternToId(pattern);\n\n return {\n id,\n pattern,\n description: config.description,\n paramsSchema: config.paramsSchema,\n load: async (params: TParams) => {\n // Validate params\n try {\n config.paramsSchema.parse(params);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Resource \"${id}\" params validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n\n return await config.load(params);\n },\n subscribe: config.subscribe,\n mcp: config.mcp,\n };\n}\n\n/**\n * Generate resource pattern fallback\n * Note: In practice, resources should explicitly define their pattern.\n * Auto-discovery is handled by the discovery.ts module which scans\n * the filesystem and extracts patterns from resource definitions.\n */\nfunction generateResourcePattern(): string {\n return `/resource_${Date.now()}`;\n}\n\n/**\n * Convert path pattern to ID\n * Example: \"/users/:userId/profile\" -> \"users_userId_profile\"\n */\nfunction patternToId(pattern: string): string {\n return pattern\n .replace(/^\\//, \"\")\n .replace(/\\//g, \"_\")\n .replace(/:/g, \"\");\n}\n\n/**\n * Resource registry\n */\nclass ResourceRegistryClass {\n private resources = new Map<string, Resource>();\n\n /**\n * Register a resource\n */\n register(id: string, resourceInstance: Resource): void {\n if (this.resources.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Resource \"${id}\" is already registered. Overwriting.`);\n }\n\n this.resources.set(id, resourceInstance);\n }\n\n /**\n * Get a resource by ID\n */\n get(id: string): Resource | undefined {\n return this.resources.get(id);\n }\n\n /**\n * Get resource by pattern matching\n */\n findByPattern(uri: string): Resource | undefined {\n for (const resource of this.resources.values()) {\n if (this.matchesPattern(uri, resource.pattern)) {\n return resource;\n }\n }\n return undefined;\n }\n\n /**\n * Check if URI matches pattern\n * Uses regex-based pattern matching with named capture groups.\n * Supports Express-style patterns like \"/users/:userId/profile\"\n */\n private matchesPattern(uri: string, pattern: string): boolean {\n const patternRegex = new RegExp(\n \"^\" + pattern.replace(/:(\\w+)/g, \"(?<$1>[^/]+)\") + \"$\",\n );\n return patternRegex.test(uri);\n }\n\n /**\n * Extract params from URI using pattern\n */\n extractParams(uri: string, pattern: string): Record<string, string> {\n const patternRegex = new RegExp(\n \"^\" + pattern.replace(/:(\\w+)/g, \"(?<$1>[^/]+)\") + \"$\",\n );\n const match = uri.match(patternRegex);\n\n return match?.groups || {};\n }\n\n /**\n * Get all resources\n */\n getAll(): Map<string, Resource> {\n return new Map(this.resources);\n }\n\n /**\n * Clear all resources\n */\n clear(): void {\n this.resources.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst RESOURCE_REGISTRY_KEY = \"__veryfront_resource_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalResource = globalThis as any;\nexport const resourceRegistry: ResourceRegistryClass = _globalResource[RESOURCE_REGISTRY_KEY] ||=\n new ResourceRegistryClass();\n", "/**\n * MCP Prompt factory and utilities\n */\n\nimport type { Prompt, PromptConfig } from \"../types/mcp.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create an MCP prompt template\n *\n * @example\n * ```typescript\n * import { prompt } from 'veryfront/ai';\n\n *\n * export default prompt({\n * description: 'Customer support prompt',\n * content: 'You are a helpful customer support agent...',\n * });\n * ```\n */\nexport function prompt(config: PromptConfig): Prompt {\n const id = config.id || generatePromptId();\n\n return {\n id,\n description: config.description,\n\n async getContent(\n variables?: Record<string, unknown>,\n ): Promise<string> {\n // If static content\n if (config.content) {\n return interpolateVariables(config.content, variables || {});\n }\n\n // If dynamic generator\n if (config.generate) {\n return await config.generate(variables || {});\n }\n\n throw toError(createError({\n type: \"agent\",\n message: `Prompt \"${id}\" has no content or generator`,\n }));\n },\n };\n}\n\n/**\n * Generate a unique prompt ID\n */\nlet promptIdCounter = 0;\nfunction generatePromptId(): string {\n return `prompt_${Date.now()}_${promptIdCounter++}`;\n}\n\n/**\n * Interpolate variables in prompt template\n * Replaces {variableName} with actual values\n */\nfunction interpolateVariables(\n template: string,\n variables: Record<string, unknown>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = variables[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Prompt registry\n */\nclass PromptRegistryClass {\n private prompts = new Map<string, Prompt>();\n\n /**\n * Register a prompt\n */\n register(id: string, promptInstance: Prompt): void {\n if (this.prompts.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Prompt \"${id}\" is already registered. Overwriting.`);\n }\n\n this.prompts.set(id, promptInstance);\n }\n\n /**\n * Get a prompt by ID\n */\n get(id: string): Prompt | undefined {\n return this.prompts.get(id);\n }\n\n /**\n * Get prompt content by ID\n */\n async getContent(\n id: string,\n variables?: Record<string, unknown>,\n ): Promise<string> {\n const promptInstance = this.get(id);\n\n if (!promptInstance) {\n throw toError(createError({\n type: \"agent\",\n message: `Prompt \"${id}\" not found`,\n }));\n }\n\n return await promptInstance.getContent(variables);\n }\n\n /**\n * Get all prompts\n */\n getAll(): Map<string, Prompt> {\n return new Map(this.prompts);\n }\n\n /**\n * Clear all prompts\n */\n clear(): void {\n this.prompts.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst PROMPT_REGISTRY_KEY = \"__veryfront_prompt_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalPrompt = globalThis as any;\nexport const promptRegistry: PromptRegistryClass = _globalPrompt[PROMPT_REGISTRY_KEY] ||=\n new PromptRegistryClass();\n", "/**\n * MCP Registry - Central registry for all MCP resources\n */\n\nimport type { MCPRegistry } from \"../types/mcp.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport type { Prompt, Resource } from \"../types/mcp.ts\";\nimport { toolRegistry } from \"../utils/tool.ts\";\nimport { resourceRegistry } from \"./resource.ts\";\nimport { promptRegistry } from \"./prompt.ts\";\n\n/**\n * Get the global MCP registry\n */\nexport function getMCPRegistry(): MCPRegistry {\n return {\n tools: toolRegistry.getAll(),\n resources: resourceRegistry.getAll(),\n prompts: promptRegistry.getAll(),\n };\n}\n\n/**\n * Register a tool in the MCP registry\n */\nexport function registerTool(id: string, tool: Tool): void {\n toolRegistry.register(id, tool);\n}\n\n/**\n * Register a resource in the MCP registry\n */\nexport function registerResource(id: string, resource: Resource): void {\n resourceRegistry.register(id, resource);\n}\n\n/**\n * Register a prompt in the MCP registry\n */\nexport function registerPrompt(id: string, promptInstance: Prompt): void {\n promptRegistry.register(id, promptInstance);\n}\n\n/**\n * Get MCP registry stats\n */\nexport function getMCPStats(): {\n tools: number;\n resources: number;\n prompts: number;\n total: number;\n} {\n const registry = getMCPRegistry();\n\n return {\n tools: registry.tools.size,\n resources: registry.resources.size,\n prompts: registry.prompts.size,\n total: registry.tools.size + registry.resources.size + registry.prompts.size,\n };\n}\n\n/**\n * Clear all MCP registries (for testing)\n */\nexport function clearMCPRegistry(): void {\n toolRegistry.clear();\n resourceRegistry.clear();\n promptRegistry.clear();\n}\n", "/**\n * Agent & Tool Inspector\n *\n * Debugging utilities for inspecting agent execution and tool calls.\n */\n\nimport type { Agent, Message } from \"../../types/agent.ts\";\nimport { getMCPRegistry, getMCPStats } from \"../../mcp/registry.ts\";\nimport { agentLogger } from \"@veryfront/utils/logger/logger.ts\";\n\nexport interface InspectionReport {\n /** Agent information */\n agent: {\n id: string;\n model: string;\n maxSteps: number;\n memoryType: string;\n };\n\n /** Execution details */\n execution: {\n input: string | Message[];\n output: string;\n status: string;\n steps: number;\n executionTime: number;\n };\n\n /** Tool usage */\n tools: {\n called: Array<{\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n executionTime?: number;\n status: string;\n }>;\n available: string[];\n };\n\n /** Memory usage */\n memory: {\n messagesCount: number;\n estimatedTokens: number;\n };\n\n /** Token usage */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Inspect an agent execution\n *\n * @example\n * ```typescript\n * import { inspectAgent } from 'veryfront/ai/dev';\n *\n * const report = await inspectAgent(myAgent, 'Test input');\n * console.log(report);\n * ```\n */\nexport async function inspectAgent(\n agent: Agent,\n input: string | Message[],\n): Promise<InspectionReport> {\n const startTime = Date.now();\n\n // Get memory stats before execution\n const _memoryStatsBefore = await agent.getMemoryStats();\n\n // Execute agent\n const response = await agent.generate({ input });\n\n const executionTime = Date.now() - startTime;\n\n // Get memory stats after execution\n const memoryStatsAfter = await agent.getMemoryStats();\n\n // Get available tools\n const availableTools = agent.config.tools ? Object.keys(agent.config.tools) : [];\n\n return {\n agent: {\n id: agent.id,\n model: agent.config.model,\n maxSteps: agent.config.maxSteps || 20,\n memoryType: agent.config.memory?.type || \"conversation\",\n },\n execution: {\n input,\n output: response.text,\n status: response.status,\n steps: response.toolCalls.length + 1, // Tool calls + final response\n executionTime,\n },\n tools: {\n called: response.toolCalls.map((tc) => ({\n name: tc.name,\n args: tc.args,\n result: tc.result,\n executionTime: tc.executionTime,\n status: tc.status,\n })),\n available: availableTools,\n },\n memory: {\n messagesCount: memoryStatsAfter.totalMessages,\n estimatedTokens: memoryStatsAfter.estimatedTokens,\n },\n usage: response.usage,\n };\n}\n\n/**\n * Print inspection report\n */\nexport function printInspectionReport(report: InspectionReport): void {\n agentLogger.info(\"\\n=== Agent Inspection Report ===\\n\");\n\n agentLogger.info(\"Agent:\");\n agentLogger.info(` ID: ${report.agent.id}`);\n agentLogger.info(` Model: ${report.agent.model}`);\n agentLogger.info(` Max Steps: ${report.agent.maxSteps}`);\n agentLogger.info(` Memory: ${report.agent.memoryType}\\n`);\n\n agentLogger.info(\"Execution:\");\n agentLogger.info(\n ` Input: ${\n typeof report.execution.input === \"string\"\n ? report.execution.input\n : `${(report.execution.input as Message[]).length} messages`\n }`,\n );\n agentLogger.info(` Output: ${report.execution.output.substring(0, 100)}...`);\n agentLogger.info(` Status: ${report.execution.status}`);\n agentLogger.info(` Steps: ${report.execution.steps}`);\n agentLogger.info(` Time: ${report.execution.executionTime}ms\\n`);\n\n agentLogger.info(\"Tools:\");\n agentLogger.info(\n ` Available: ${report.tools.available.length} (${report.tools.available.join(\", \")})`,\n );\n agentLogger.info(` Called: ${report.tools.called.length}`);\n\n if (report.tools.called.length > 0) {\n report.tools.called.forEach((tool, i) => {\n agentLogger.info(` ${i + 1}. ${tool.name}(${JSON.stringify(tool.args)})`);\n agentLogger.info(` Status: ${tool.status}`);\n agentLogger.info(` Time: ${tool.executionTime}ms`);\n agentLogger.info(` Result: ${JSON.stringify(tool.result).substring(0, 100)}...`);\n });\n }\n agentLogger.info(\"\");\n\n agentLogger.info(\"Memory:\");\n agentLogger.info(` Messages: ${report.memory.messagesCount}`);\n agentLogger.info(` Estimated Tokens: ${report.memory.estimatedTokens}\\n`);\n\n if (report.usage) {\n agentLogger.info(\"Token Usage:\");\n agentLogger.info(` Prompt: ${report.usage.promptTokens}`);\n agentLogger.info(` Completion: ${report.usage.completionTokens}`);\n agentLogger.info(` Total: ${report.usage.totalTokens}\\n`);\n }\n}\n\n/**\n * Get MCP registry overview\n */\nexport function getRegistryOverview(): {\n tools: Array<{ id: string; description: string }>;\n resources: Array<{ id: string; pattern: string; description: string }>;\n prompts: Array<{ id: string; description: string }>;\n stats: ReturnType<typeof getMCPStats>;\n} {\n const registry = getMCPRegistry();\n const stats = getMCPStats();\n\n return {\n tools: Array.from(registry.tools.values()).map((t) => ({\n id: t.id,\n description: t.description,\n })),\n resources: Array.from(registry.resources.values()).map((r) => ({\n id: r.id,\n pattern: r.pattern,\n description: r.description,\n })),\n prompts: Array.from(registry.prompts.values()).map((p) => ({\n id: p.id,\n description: p.description,\n })),\n stats,\n };\n}\n\n/**\n * Print registry overview\n */\nexport function printRegistryOverview(): void {\n const overview = getRegistryOverview();\n\n agentLogger.info(\"\\n=== MCP Registry Overview ===\\n\");\n agentLogger.info(`Total: ${overview.stats.total} items\\n`);\n\n agentLogger.info(`Tools (${overview.stats.tools}):`);\n overview.tools.forEach((t) => {\n agentLogger.info(` \u2022 ${t.id}: ${t.description}`);\n });\n agentLogger.info(\"\");\n\n agentLogger.info(`Resources (${overview.stats.resources}):`);\n overview.resources.forEach((r) => {\n agentLogger.info(` \u2022 ${r.id} (${r.pattern}): ${r.description}`);\n });\n agentLogger.info(\"\");\n\n agentLogger.info(`Prompts (${overview.stats.prompts}):`);\n overview.prompts.forEach((p) => {\n agentLogger.info(` \u2022 ${p.id}: ${p.description}`);\n });\n agentLogger.info(\"\");\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Shim for Deno.env in Node.js environment\n * This file is injected by esbuild to provide Deno.env compatibility\n */\n\n// @ts-ignore - Global Deno shim for Node.js\nglobalThis.Deno = globalThis.Deno || {\n env: {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n },\n};\n", "/**\n * Agent Testing Utilities\n *\n * Utilities for testing agents in development and CI/CD.\n */\n\nimport type { Agent, AgentResponse, Message } from \"../../types/agent.ts\";\n\nexport interface TestCase {\n /** Test name */\n name: string;\n\n /** Input to agent */\n input: string | Message[];\n\n /** Expected output pattern (regex or string) */\n expected?: RegExp | string;\n\n /** Expected tool calls */\n expectToolCalls?: string[];\n\n /** Maximum execution time (ms) */\n timeout?: number;\n\n /** Custom validator */\n validate?: (response: AgentResponse) => boolean | Promise<boolean>;\n}\n\nexport interface TestResult {\n /** Test case name */\n name: string;\n\n /** Pass/fail */\n passed: boolean;\n\n /** Response from agent */\n response?: AgentResponse;\n\n /** Error if test failed */\n error?: string;\n\n /** Execution time */\n executionTime: number;\n\n /** Tool calls made */\n toolCalls: string[];\n}\n\nexport interface TestSuite {\n /** Suite name */\n name: string;\n\n /** Test results */\n results: TestResult[];\n\n /** Overall pass/fail */\n passed: boolean;\n\n /** Total execution time */\n totalTime: number;\n}\n\n/**\n * Test an agent with multiple test cases\n *\n * @example\n * ```typescript\n * import { testAgent } from 'veryfront/ai/dev';\n *\n * const results = await testAgent(myAgent, [\n * {\n * name: 'Simple greeting',\n * input: 'Hello',\n * expected: /hello|hi|hey/i,\n * },\n * {\n * name: 'Tool usage',\n * input: 'Search for AI frameworks',\n * expectToolCalls: ['searchWeb'],\n * },\n * ]);\n *\n * console.log(`Passed: ${results.results.filter(r => r.passed).length}/${results.results.length}`);\n * ```\n */\nexport async function testAgent(\n agent: Agent,\n testCases: TestCase[],\n): Promise<TestSuite> {\n const suite: TestSuite = {\n name: agent.id,\n results: [],\n passed: true,\n totalTime: 0,\n };\n\n const suiteStartTime = Date.now();\n\n for (const testCase of testCases) {\n const result = await runTestCase(agent, testCase);\n suite.results.push(result);\n\n if (!result.passed) {\n suite.passed = false;\n }\n }\n\n suite.totalTime = Date.now() - suiteStartTime;\n\n return suite;\n}\n\n/**\n * Run a single test case\n */\nasync function runTestCase(agent: Agent, testCase: TestCase): Promise<TestResult> {\n const startTime = Date.now();\n\n try {\n // Set timeout\n const timeout = testCase.timeout || 30000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(\"Test timeout\")), timeout);\n });\n\n // Execute agent\n const responsePromise = agent.generate({\n input: testCase.input,\n });\n\n const response = await Promise.race([responsePromise, timeoutPromise]);\n\n const executionTime = Date.now() - startTime;\n const toolCalls = response.toolCalls.map((tc) => tc.name);\n\n // Validate response\n let passed = true;\n let error: string | undefined;\n\n // Check expected output\n if (testCase.expected) {\n if (testCase.expected instanceof RegExp) {\n passed = testCase.expected.test(response.text);\n if (!passed) {\n error = `Output \"${response.text}\" does not match pattern ${testCase.expected}`;\n }\n } else {\n passed = response.text.includes(testCase.expected);\n if (!passed) {\n error = `Output does not contain expected text: \"${testCase.expected}\"`;\n }\n }\n }\n\n // Check expected tool calls\n if (passed && testCase.expectToolCalls) {\n const expectedTools = testCase.expectToolCalls;\n const missingTools = expectedTools.filter((t) => !toolCalls.includes(t));\n\n if (missingTools.length > 0) {\n passed = false;\n error = `Expected tool calls not found: ${missingTools.join(\", \")}`;\n }\n }\n\n // Custom validation\n if (passed && testCase.validate) {\n try {\n passed = await testCase.validate(response);\n if (!passed) {\n error = \"Custom validation failed\";\n }\n } catch (err) {\n passed = false;\n error = `Custom validation error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n return {\n name: testCase.name,\n passed,\n response,\n error,\n executionTime,\n toolCalls,\n };\n } catch (err) {\n return {\n name: testCase.name,\n passed: false,\n error: err instanceof Error ? err.message : String(err),\n executionTime: Date.now() - startTime,\n toolCalls: [],\n };\n }\n}\n\n/**\n * Print test results in a readable format\n */\nexport function printTestResults(suite: TestSuite): void {\n console.log(`\\n=== Test Suite: ${suite.name} ===\\n`);\n\n const passed = suite.results.filter((r) => r.passed).length;\n const total = suite.results.length;\n\n suite.results.forEach((result, index) => {\n const icon = result.passed ? \"\u2705\" : \"\u274C\";\n console.log(`${icon} ${index + 1}. ${result.name}`);\n\n if (!result.passed && result.error) {\n console.log(` Error: ${result.error}`);\n }\n\n if (result.toolCalls.length > 0) {\n console.log(` Tools used: ${result.toolCalls.join(\", \")}`);\n }\n\n console.log(` Time: ${result.executionTime}ms\\n`);\n });\n\n console.log(`Results: ${passed}/${total} passed`);\n console.log(`Total time: ${suite.totalTime}ms`);\n console.log(`Status: ${suite.passed ? \"\u2705 PASSED\" : \"\u274C FAILED\"}\\n`);\n}\n\n/**\n * Assert that an agent response contains text\n */\nexport function assertContains(response: AgentResponse, text: string): boolean {\n return response.text.toLowerCase().includes(text.toLowerCase());\n}\n\n/**\n * Assert that an agent called a specific tool\n */\nexport function assertToolCalled(response: AgentResponse, toolName: string): boolean {\n return response.toolCalls.some((tc) => tc.name === toolName);\n}\n\n/**\n * Assert that an agent completed successfully\n */\nexport function assertCompleted(response: AgentResponse): boolean {\n return response.status === \"completed\";\n}\n", "/**\n * Tool Testing Utilities\n *\n * Utilities for testing individual tools.\n */\n\nimport type { Tool } from \"../../types/tool.ts\";\n\nexport interface ToolTestCase {\n /** Test name */\n name: string;\n\n /** Tool input */\n input: any;\n\n /** Expected output (partial match) */\n expectedOutput?: any;\n\n /** Custom validator */\n validate?: (result: any) => boolean | Promise<boolean>;\n\n /** Should throw error */\n shouldThrow?: boolean;\n\n /** Expected error message pattern */\n expectedError?: RegExp | string;\n}\n\nexport interface ToolTestResult {\n /** Test case name */\n name: string;\n\n /** Pass/fail */\n passed: boolean;\n\n /** Tool result */\n result?: any;\n\n /** Error if test failed */\n error?: string;\n\n /** Execution time */\n executionTime: number;\n}\n\n/**\n * Test a tool with multiple test cases\n *\n * @example\n * ```typescript\n * import { testTool } from 'veryfront/ai/dev';\n *\n * const results = await testTool(calculatorTool, [\n * {\n * name: 'Addition',\n * input: { operation: 'add', a: 2, b: 3 },\n * expectedOutput: { result: 5 },\n * },\n * {\n * name: 'Division by zero',\n * input: { operation: 'divide', a: 5, b: 0 },\n * shouldThrow: true,\n * expectedError: /cannot divide by zero/i,\n * },\n * ]);\n * ```\n */\nexport async function testTool(\n tool: Tool,\n testCases: ToolTestCase[],\n): Promise<ToolTestResult[]> {\n const results: ToolTestResult[] = [];\n\n for (const testCase of testCases) {\n const result = await runToolTest(tool, testCase);\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Run a single tool test\n */\nasync function runToolTest(\n tool: Tool,\n testCase: ToolTestCase,\n): Promise<ToolTestResult> {\n const startTime = Date.now();\n\n try {\n // Execute tool\n const result = await tool.execute(testCase.input);\n const executionTime = Date.now() - startTime;\n\n // If we expected an error but didn't get one\n if (testCase.shouldThrow) {\n return {\n name: testCase.name,\n passed: false,\n error: \"Expected tool to throw error but it succeeded\",\n executionTime,\n };\n }\n\n // Validate output\n let passed = true;\n let error: string | undefined;\n\n if (testCase.expectedOutput !== undefined) {\n passed = deepMatch(result, testCase.expectedOutput);\n if (!passed) {\n error = `Output mismatch. Expected: ${JSON.stringify(testCase.expectedOutput)}, Got: ${\n JSON.stringify(result)\n }`;\n }\n }\n\n if (passed && testCase.validate) {\n try {\n passed = await testCase.validate(result);\n if (!passed) {\n error = \"Custom validation failed\";\n }\n } catch (err) {\n passed = false;\n error = `Validation error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n return {\n name: testCase.name,\n passed,\n result,\n error,\n executionTime,\n };\n } catch (err) {\n const executionTime = Date.now() - startTime;\n const errorMessage = err instanceof Error ? err.message : String(err);\n\n // If we expected an error\n if (testCase.shouldThrow) {\n let passed = true;\n let error: string | undefined;\n\n if (testCase.expectedError) {\n if (testCase.expectedError instanceof RegExp) {\n passed = testCase.expectedError.test(errorMessage);\n } else {\n passed = errorMessage.includes(testCase.expectedError);\n }\n\n if (!passed) {\n error =\n `Error message mismatch. Expected pattern: ${testCase.expectedError}, Got: ${errorMessage}`;\n }\n }\n\n return {\n name: testCase.name,\n passed,\n error,\n executionTime,\n };\n }\n\n // Unexpected error\n return {\n name: testCase.name,\n passed: false,\n error: `Unexpected error: ${errorMessage}`,\n executionTime,\n };\n }\n}\n\n/**\n * Deep match for partial object comparison\n */\nfunction deepMatch(actual: any, expected: any): boolean {\n if (expected === actual) return true;\n if (typeof expected !== \"object\" || expected === null) return false;\n if (typeof actual !== \"object\" || actual === null) return false;\n\n for (const key in expected) {\n if (!(key in actual)) return false;\n\n const expectedValue = expected[key];\n const actualValue = actual[key];\n\n if (typeof expectedValue === \"object\" && expectedValue !== null) {\n if (!deepMatch(actualValue, expectedValue)) return false;\n } else {\n if (actualValue !== expectedValue) return false;\n }\n }\n\n return true;\n}\n\n/**\n * Print tool test results\n */\nexport function printToolTestResults(\n toolId: string,\n results: ToolTestResult[],\n): void {\n console.log(`\\n=== Tool Tests: ${toolId} ===\\n`);\n\n const passed = results.filter((r) => r.passed).length;\n const total = results.length;\n\n results.forEach((result, index) => {\n const icon = result.passed ? \"\u2705\" : \"\u274C\";\n console.log(`${icon} ${index + 1}. ${result.name}`);\n\n if (!result.passed && result.error) {\n console.log(` Error: ${result.error}`);\n }\n\n if (result.result !== undefined) {\n console.log(` Result: ${JSON.stringify(result.result)}`);\n }\n\n console.log(` Time: ${result.executionTime}ms\\n`);\n });\n\n console.log(`Results: ${passed}/${total} passed`);\n console.log(`Status: ${passed === total ? \"\u2705 ALL PASSED\" : \"\u274C SOME FAILED\"}\\n`);\n}\n", "import type { z } from \"zod\";\nimport { ZodFirstPartyTypeKind } from \"zod\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\n\nexport function zodToJsonSchema(schema: z.ZodTypeAny): JsonSchema {\n // Guard against invalid schemas (can happen with different zod instances in npm bundle)\n if (!schema || typeof schema !== \"object\" || !(\"_def\" in schema)) {\n throw new Error(\"Invalid Zod schema: missing _def property\");\n }\n\n const details = unwrapSchema(schema);\n const json = convert(details.schema);\n if (details.nullable) {\n return { anyOf: [json, { type: \"null\" }] };\n }\n return json;\n}\n\nexport function isOptionalSchema(schema: z.ZodTypeAny): boolean {\n const { optional } = unwrapSchema(schema);\n return optional;\n}\n\nfunction convert(schema: z.ZodTypeAny): JsonSchema {\n switch (schema._def.typeName) {\n case ZodFirstPartyTypeKind.ZodString:\n return { type: \"string\" };\n case ZodFirstPartyTypeKind.ZodNumber:\n return { type: \"number\" };\n case ZodFirstPartyTypeKind.ZodBoolean:\n return { type: \"boolean\" };\n case ZodFirstPartyTypeKind.ZodBigInt:\n return { type: \"integer\" };\n case ZodFirstPartyTypeKind.ZodLiteral: {\n const literal = (schema as z.ZodLiteral<unknown>)._def.value;\n return {\n const: literal,\n type: typeof literal === \"string\"\n ? \"string\"\n : typeof literal === \"number\"\n ? \"number\"\n : typeof literal === \"boolean\"\n ? \"boolean\"\n : undefined,\n };\n }\n case ZodFirstPartyTypeKind.ZodEnum:\n return {\n type: \"string\",\n enum: (schema as z.ZodEnum<[string, ...string[]]>)._def.values,\n };\n case ZodFirstPartyTypeKind.ZodNativeEnum:\n return {\n enum: Object.values((schema as z.ZodNativeEnum<any>)._def.values).filter(\n (value) => typeof value !== \"number\",\n ),\n };\n case ZodFirstPartyTypeKind.ZodObject: {\n const obj = schema as z.ZodObject<any>;\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n // Access shape - it might be a function (lazy getter) or an object\n const shape = typeof obj._def.shape === \"function\" ? obj._def.shape() : obj._def.shape;\n\n for (const [key, value] of Object.entries(shape || {})) {\n const zodSchema = value as z.ZodTypeAny;\n properties[key] = zodToJsonSchema(zodSchema);\n if (!isOptionalSchema(zodSchema)) {\n required.push(key);\n }\n }\n\n const json: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) {\n json.required = required;\n }\n return json;\n }\n case ZodFirstPartyTypeKind.ZodArray: {\n const array = schema as z.ZodArray<z.ZodTypeAny>;\n return {\n type: \"array\",\n items: zodToJsonSchema(array._def.type),\n };\n }\n case ZodFirstPartyTypeKind.ZodTuple: {\n const tuple = schema as z.ZodTuple;\n return {\n type: \"array\",\n prefixItems: tuple._def.items.map((item) => zodToJsonSchema(item)),\n minItems: tuple._def.items.length,\n maxItems: tuple._def.items.length,\n };\n }\n case ZodFirstPartyTypeKind.ZodUnion: {\n const union = schema as z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>;\n return {\n anyOf: union._def.options.map((option) => zodToJsonSchema(option)),\n };\n }\n case ZodFirstPartyTypeKind.ZodDiscriminatedUnion: {\n const union = schema as z.ZodDiscriminatedUnion<string, z.ZodObject<any>[]>;\n return {\n anyOf: Array.from(union._def.options.values()).map((option) => zodToJsonSchema(option)),\n };\n }\n case ZodFirstPartyTypeKind.ZodRecord:\n return {\n type: \"object\",\n additionalProperties: zodToJsonSchema((schema as z.ZodRecord<any>)._def.valueType),\n };\n case ZodFirstPartyTypeKind.ZodDefault: {\n const def = schema as z.ZodDefault<z.ZodTypeAny>;\n const inner = zodToJsonSchema(def._def.innerType);\n const defaultValue = def._def.defaultValue();\n if (typeof inner === \"object\" && !(\"anyOf\" in inner)) {\n inner.default = defaultValue;\n }\n return inner;\n }\n case ZodFirstPartyTypeKind.ZodLazy:\n return convert((schema as z.ZodLazy<any>)._def.getter());\n case ZodFirstPartyTypeKind.ZodEffects:\n return convert((schema as z.ZodEffects<any>)._def.schema);\n default:\n return { type: \"object\" };\n }\n}\n\nfunction unwrapSchema(schema: z.ZodTypeAny) {\n let current: z.ZodTypeAny = schema;\n let nullable = false;\n let optional = false;\n\n while (true) {\n switch (current._def.typeName) {\n case ZodFirstPartyTypeKind.ZodNullable:\n nullable = true;\n current = (current as z.ZodNullable<z.ZodTypeAny>)._def.innerType;\n continue;\n case ZodFirstPartyTypeKind.ZodOptional:\n optional = true;\n current = (current as z.ZodOptional<z.ZodTypeAny>)._def.innerType;\n continue;\n case ZodFirstPartyTypeKind.ZodEffects:\n current = (current as z.ZodEffects<any>)._def.schema;\n continue;\n default:\n return { schema: current, nullable, optional };\n }\n }\n}\n", "export interface GlobalWithDeno {\n Deno?: {\n env: {\n get(key: string): string | undefined;\n };\n };\n}\n\nexport interface GlobalWithProcess {\n process?: {\n env: Record<string, string | undefined>;\n version?: string;\n versions?: Record<string, string>;\n };\n}\n\nexport interface GlobalWithBun {\n Bun?: {\n version: string;\n };\n}\n\nexport function hasDenoRuntime(global: unknown): global is GlobalWithDeno {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Deno\" in global &&\n typeof (global as GlobalWithDeno).Deno?.env?.get === \"function\"\n );\n}\n\nexport function hasNodeProcess(global: unknown): global is GlobalWithProcess {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"process\" in global &&\n typeof (global as GlobalWithProcess).process?.env === \"object\"\n );\n}\n\nexport function hasBunRuntime(global: unknown): global is GlobalWithBun {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Bun\" in global &&\n typeof (global as GlobalWithBun).Bun !== \"undefined\"\n );\n}\n", "import type { GlobalWithDeno, GlobalWithProcess } from \"../runtime-guards.ts\";\nimport { hasDenoRuntime, hasNodeProcess } from \"../runtime-guards.ts\";\n\nexport function getEnvironmentVariable(name: string): string | undefined {\n try {\n if (typeof Deno !== \"undefined\" && hasDenoRuntime(globalThis)) {\n const value = (globalThis as GlobalWithDeno).Deno?.env.get(name);\n return value === \"\" ? undefined : value;\n }\n if (hasNodeProcess(globalThis)) {\n const value = (globalThis as GlobalWithProcess).process?.env[name];\n return value === \"\" ? undefined : value;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nexport function isTestEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"test\";\n}\n\nexport function isProductionEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"production\";\n}\n\nexport function isDevelopmentEnvironment(): boolean {\n const env = getEnvironmentVariable(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n", "import { getEnvironmentVariable } from \"./env.ts\";\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n time<T>(label: string, fn: () => Promise<T>): Promise<T>;\n}\n\nconst originalConsole = {\n debug: console.debug,\n log: console.log,\n warn: console.warn,\n error: console.error,\n};\n\nlet cachedLogLevel: LogLevel | undefined;\n\nfunction resolveLogLevel(force = false): LogLevel {\n if (force || cachedLogLevel === undefined) {\n cachedLogLevel = getDefaultLevel();\n }\n return cachedLogLevel;\n}\n\nclass ConsoleLogger implements Logger {\n constructor(\n private prefix: string,\n private level: LogLevel = resolveLogLevel(),\n ) {}\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG: ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.log(`[${this.prefix}] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN: ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR: ${message}`, ...args);\n }\n }\n\n async time<T>(label: string, fn: () => Promise<T>): Promise<T> {\n const start = performance.now();\n try {\n const result = await fn();\n const end = performance.now();\n this.debug(`${label} completed in ${(end - start).toFixed(2)}ms`);\n return result;\n } catch (error) {\n const end = performance.now();\n this.error(`${label} failed after ${(end - start).toFixed(2)}ms`, error);\n throw error;\n }\n }\n}\n\nfunction parseLogLevel(levelString: string | undefined): LogLevel | undefined {\n if (!levelString) return undefined;\n const upper = levelString.toUpperCase();\n switch (upper) {\n case \"DEBUG\":\n return LogLevel.DEBUG;\n case \"WARN\":\n return LogLevel.WARN;\n case \"ERROR\":\n return LogLevel.ERROR;\n case \"INFO\":\n return LogLevel.INFO;\n default:\n return undefined;\n }\n}\n\nconst getDefaultLevel = (): LogLevel => {\n const envLevel = getEnvironmentVariable(\"LOG_LEVEL\");\n const parsedLevel = parseLogLevel(envLevel);\n if (parsedLevel !== undefined) return parsedLevel;\n\n const debugFlag = getEnvironmentVariable(\"VERYFRONT_DEBUG\");\n if (debugFlag === \"1\" || debugFlag === \"true\") return LogLevel.DEBUG;\n\n return LogLevel.INFO;\n};\n\nconst trackedLoggers = new Set<ConsoleLogger>();\n\nfunction createLogger(prefix: string): ConsoleLogger {\n const logger = new ConsoleLogger(prefix);\n trackedLoggers.add(logger);\n return logger;\n}\n\nexport const cliLogger = createLogger(\"CLI\");\nexport const serverLogger = createLogger(\"SERVER\");\nexport const rendererLogger = createLogger(\"RENDERER\");\nexport const bundlerLogger = createLogger(\"BUNDLER\");\nexport const agentLogger = createLogger(\"AGENT\");\n\nexport const logger = createLogger(\"VERYFRONT\");\n\ntype LoggerResetOptions = {\n restoreConsole?: boolean;\n};\n\nexport function __loggerResetForTests(options: LoggerResetOptions = {}): void {\n const updatedLevel = resolveLogLevel(true);\n for (const instance of trackedLoggers) {\n instance.setLevel(updatedLevel);\n }\n\n if (options.restoreConsole) {\n console.debug = originalConsole.debug;\n console.log = originalConsole.log;\n console.warn = originalConsole.warn;\n console.error = originalConsole.error;\n }\n}\n", "export interface BuildContext {\n file?: string;\n line?: number;\n column?: number;\n moduleId?: string;\n phase?: \"parse\" | \"transform\" | \"bundle\" | \"optimize\";\n}\n\nexport interface APIContext {\n endpoint?: string;\n method?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderContext {\n component?: string;\n route?: string;\n phase?: \"server\" | \"client\" | \"hydration\";\n props?: unknown;\n}\n\nexport interface ConfigContext {\n configFile?: string;\n field?: string;\n value?: unknown;\n expected?: string;\n}\n\nexport interface AgentContext {\n agentId?: string;\n intent?: string;\n timeout?: number;\n}\n\nexport interface FileContext {\n path?: string;\n operation?: \"read\" | \"write\" | \"delete\" | \"mkdir\";\n permissions?: string;\n}\n\nexport interface NetworkContext {\n url?: string;\n timeout?: number;\n retryCount?: number;\n}\n\nexport type VeryfrontError =\n | { type: \"build\"; message: string; context?: BuildContext }\n | { type: \"api\"; message: string; context?: APIContext }\n | { type: \"render\"; message: string; context?: RenderContext }\n | { type: \"config\"; message: string; context?: ConfigContext }\n | { type: \"agent\"; message: string; context?: AgentContext }\n | { type: \"file\"; message: string; context?: FileContext }\n | { type: \"network\"; message: string; context?: NetworkContext }\n | { type: \"permission\"; message: string; context?: FileContext }\n | { type: \"not_supported\"; message: string; feature?: string };\n\nexport function createError(error: VeryfrontError): VeryfrontError {\n return error;\n}\n\nexport function isBuildError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"build\" }> {\n return error.type === \"build\";\n}\n\nexport function isAPIError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"api\" }> {\n return error.type === \"api\";\n}\n\nexport function isRenderError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"render\" }> {\n return error.type === \"render\";\n}\n\nexport function isConfigError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"config\" }> {\n return error.type === \"config\";\n}\n\nexport function isAgentError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"agent\" }> {\n return error.type === \"agent\";\n}\n\nexport function isFileError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"file\" }> {\n return error.type === \"file\";\n}\n\nexport function isNetworkError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"network\" }> {\n return error.type === \"network\";\n}\n\nexport function toError(veryfrontError: VeryfrontError): Error {\n const error = new Error(veryfrontError.message);\n error.name = `VeryfrontError[${veryfrontError.type}]`;\n Object.defineProperty(error, \"context\", {\n value: veryfrontError,\n enumerable: false,\n configurable: true,\n });\n return error;\n}\n\nexport function fromError(error: unknown): VeryfrontError | null {\n if (error && typeof error === \"object\" && \"context\" in error) {\n // Safe access after 'in' check\n const context = (error as Record<string, unknown>).context;\n if (\n context &&\n typeof context === \"object\" &&\n \"type\" in context &&\n \"message\" in context\n ) {\n return context as VeryfrontError;\n }\n }\n return null;\n}\n\nexport function logError(\n error: VeryfrontError,\n logger?: { error: (msg: string, ...args: unknown[]) => void },\n): void {\n const log = logger || console;\n const context = \"context\" in error ? error.context || {} : {};\n log.error(`[${error.type}] ${error.message}`, context);\n}\n", "import type { Tool, ToolConfig, ToolDefinition, ToolExecutionContext } from \"../types/tool.ts\";\nimport type { JsonSchema } from \"../types/json-schema.ts\";\nimport { zodToJsonSchema } from \"./zod-json-schema.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create a tool\n *\n * @example\n * ```typescript\n * import { tool } from 'veryfront/ai';\n * import { z } from 'zod';\n\n *\n * export default tool({\n * description: 'Search the web',\n * inputSchema: z.object({\n * query: z.string(),\n * }),\n * execute: async ({ query }) => {\n * const results = await searchWeb(query);\n * return results;\n * },\n * });\n * ```\n */\nexport function tool<TInput = any, TOutput = any>(\n config: ToolConfig<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const id = config.id || generateToolId();\n\n // Check if we have a valid zod schema (has _def property)\n const hasValidZodSchema = config.inputSchema &&\n typeof config.inputSchema === \"object\" &&\n \"_def\" in config.inputSchema &&\n (config.inputSchema as { _def?: { typeName?: string } })._def?.typeName;\n\n // Pre-convert Zod schema to JSON Schema immediately\n // This happens BEFORE any bundling, in a clean environment\n let inputSchemaJson: JsonSchema | undefined;\n if (hasValidZodSchema) {\n try {\n inputSchemaJson = zodToJsonSchema(config.inputSchema);\n agentLogger.info(\n `[TOOL] Pre-converted schema for \"${id}\": ${\n Object.keys(inputSchemaJson.properties || {}).length\n } properties`,\n );\n } catch (error) {\n agentLogger.warn(`[TOOL] Failed to pre-convert schema for \"${id}\":`, error);\n // Continue without pre-converted schema - will fall back to runtime conversion\n }\n } else {\n // Try to introspect the schema from external zod instance\n const externalSchema = config.inputSchema as {\n _def?: {\n typeName?: string;\n shape?: (() => Record<string, unknown>) | Record<string, unknown>;\n };\n };\n\n if (externalSchema?._def?.shape) {\n try {\n const shape = typeof externalSchema._def.shape === \"function\"\n ? externalSchema._def.shape()\n : externalSchema._def.shape;\n\n // Build JSON Schema from shape inspection\n const properties: Record<string, JsonSchema> = {};\n for (const key of Object.keys(shape || {})) {\n // Default to string type for unknown schemas\n properties[key] = { type: \"string\" as const };\n }\n inputSchemaJson = {\n type: \"object\" as const,\n properties,\n required: Object.keys(properties),\n };\n agentLogger.info(\n `[TOOL] Introspected schema for \"${id}\" from external zod: ${\n Object.keys(properties).length\n } properties`,\n );\n } catch {\n inputSchemaJson = { type: \"object\", properties: {} };\n agentLogger.warn(\n `[TOOL] Schema for \"${id}\" could not be introspected. Using empty schema.`,\n );\n }\n } else {\n agentLogger.warn(\n `[TOOL] Schema for \"${id}\" is not a valid Zod schema (different zod instance?). ` +\n `Skipping pre-conversion. Input validation may be limited.`,\n );\n // Create a basic schema from inspection if possible\n inputSchemaJson = { type: \"object\", properties: {} };\n }\n }\n\n return {\n id,\n type: \"function\" as const,\n description: config.description,\n inputSchema: config.inputSchema,\n inputSchemaJson, // Store pre-converted schema\n execute: async (input: TInput, context?: ToolExecutionContext) => {\n // Validate input if zod schema is available\n if (hasValidZodSchema) {\n try {\n config.inputSchema.parse(input);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${id}\" input validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n } else if (\n config.inputSchema &&\n typeof config.inputSchema === \"object\" &&\n \"parse\" in config.inputSchema &&\n typeof (config.inputSchema as { parse?: unknown }).parse === \"function\"\n ) {\n // Try to use parse method if available (external zod instance)\n try {\n (config.inputSchema as { parse: (input: unknown) => void }).parse(input);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${id}\" input validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n }\n\n // Execute tool\n return await config.execute(input, context);\n },\n mcp: config.mcp,\n };\n}\n\n/**\n * Configuration for dynamic tools where input/output types are unknown at compile time\n */\nexport interface DynamicToolConfig {\n /** Tool identifier (optional, auto-generated if not provided) */\n id?: string;\n\n /** Tool description for the AI model */\n description: string;\n\n /**\n * Input schema - any Zod schema is accepted. For dynamic tools where the input shape\n * is truly unknown at compile time, it is recommended to use z.unknown(), z.any(),\n * or z.object({}). A schema is still required for validation even though types are unknown.\n */\n inputSchema: unknown;\n\n /**\n * Tool execution function - input is typed as unknown and must be validated/cast at runtime\n */\n execute: (\n input: unknown,\n context?: ToolExecutionContext,\n ) => Promise<unknown> | unknown;\n\n /**\n * Optional conversion function that maps the tool result to an output\n * that can be used by the language model\n */\n toModelOutput?: (output: unknown) => unknown;\n\n /** MCP configuration */\n mcp?: {\n /** Expose via MCP */\n enabled?: boolean;\n /** Require authentication */\n requiresAuth?: boolean;\n /** Cache policy */\n cachePolicy?: \"no-cache\" | \"cache\" | \"cache-first\";\n };\n}\n\n/**\n * Create a dynamic tool where input/output types are not known at compile time.\n *\n * Use this for:\n * - MCP (Model Context Protocol) tools without schemas\n * - User-defined functions loaded at runtime\n * - Tools loaded from external sources or databases\n * - Dynamic tool generation based on user input\n *\n * @example\n * ```typescript\n * import { dynamicTool } from 'veryfront/ai';\n * import { z } from 'zod';\n *\n * export const customTool = dynamicTool({\n * description: 'Execute a custom user-defined function',\n * inputSchema: z.object({}),\n * execute: async (input) => {\n * // input is typed as 'unknown' - validate/cast at runtime\n * const { action, parameters } = input as any;\n * return { result: `Executed ${action}` };\n * },\n * });\n * ```\n */\nexport function dynamicTool(config: DynamicToolConfig): Tool<unknown, unknown> {\n const id = config.id || generateToolId();\n\n // Try to convert schema to JSON Schema if possible\n let inputSchemaJson: JsonSchema | undefined;\n\n // Check if it's a zod-like schema with _def\n const zodLikeSchema = config.inputSchema as {\n _def?: { typeName?: string; shape?: (() => Record<string, unknown>) | Record<string, unknown> };\n };\n\n if (zodLikeSchema?._def?.typeName) {\n try {\n // deno-lint-ignore no-explicit-any\n inputSchemaJson = zodToJsonSchema(config.inputSchema as any);\n agentLogger.info(\n `[DYNAMIC_TOOL] Converted schema for \"${id}\": ${\n Object.keys(inputSchemaJson.properties || {}).length\n } properties`,\n );\n } catch {\n // For z.unknown() or z.any(), create a permissive schema\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n agentLogger.info(`[DYNAMIC_TOOL] Using permissive schema for \"${id}\"`);\n }\n } else if (zodLikeSchema?._def?.shape) {\n // Try to introspect shape\n try {\n const shape = typeof zodLikeSchema._def.shape === \"function\"\n ? zodLikeSchema._def.shape()\n : zodLikeSchema._def.shape;\n\n const properties: Record<string, JsonSchema> = {};\n for (const key of Object.keys(shape || {})) {\n properties[key] = { type: \"string\" as const };\n }\n inputSchemaJson = {\n type: \"object\" as const,\n properties,\n additionalProperties: true,\n };\n agentLogger.info(`[DYNAMIC_TOOL] Introspected schema for \"${id}\"`);\n } catch {\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n }\n } else {\n // Fully dynamic - accept anything\n inputSchemaJson = { type: \"object\", properties: {}, additionalProperties: true };\n agentLogger.info(`[DYNAMIC_TOOL] Using fully dynamic schema for \"${id}\"`);\n }\n\n return {\n id,\n type: \"dynamic\" as const,\n description: config.description,\n inputSchema: config.inputSchema as any,\n inputSchemaJson,\n execute: async (input: unknown, context?: ToolExecutionContext) => {\n // For dynamic tools, we skip input validation entirely.\n // The tool implementation is responsible for runtime validation.\n const result = await config.execute(input, context);\n\n // Apply output transformation if provided\n if (config.toModelOutput) {\n return config.toModelOutput(result);\n }\n\n return result;\n },\n mcp: config.mcp,\n };\n}\n\n/**\n * Generate a unique tool ID\n */\nlet toolIdCounter = 0;\nfunction generateToolId(): string {\n return `tool_${Date.now()}_${toolIdCounter++}`;\n}\n\n/**\n * Tool registry for managing tools\n */\nclass ToolRegistryClass {\n private tools = new Map<string, Tool>();\n\n register(id: string, toolInstance: Tool): void {\n if (this.tools.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Tool \"${id}\" is already registered. Overwriting.`);\n }\n\n this.tools.set(id, toolInstance);\n }\n\n /**\n * Get a tool by ID\n */\n get(id: string): Tool | undefined {\n return this.tools.get(id);\n }\n\n /**\n * Check if a tool exists\n */\n has(id: string): boolean {\n return this.tools.has(id);\n }\n\n /**\n * Get all tool IDs\n */\n getAllIds(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /**\n * Get all tools\n */\n getAll(): Map<string, Tool> {\n return new Map(this.tools);\n }\n\n /**\n * Clear all tools (for testing)\n */\n clear(): void {\n this.tools.clear();\n }\n\n getToolsForProvider(): ToolDefinition[] {\n return Array.from(this.tools.values()).map(toolToProviderDefinition);\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst TOOL_REGISTRY_KEY = \"__veryfront_tool_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalTool = globalThis as any;\nexport const toolRegistry: ToolRegistryClass = _globalTool[TOOL_REGISTRY_KEY] ||=\n new ToolRegistryClass();\n\nexport function toolToProviderDefinition(tool: Tool): ToolDefinition {\n // Use pre-converted JSON Schema if available (preferred)\n // Fall back to runtime conversion if needed\n const jsonSchema = tool.inputSchemaJson || zodToJsonSchema(tool.inputSchema);\n\n agentLogger.info(\n `[TOOL] Using ${\n tool.inputSchemaJson ? \"pre-converted\" : \"runtime-converted\"\n } schema for \"${tool.id}\"`,\n );\n\n return {\n name: tool.id,\n description: tool.description,\n parameters: jsonSchema,\n };\n}\n\n/**\n * Execute a tool by ID\n */\nexport async function executeTool(\n toolId: string,\n input: unknown,\n context?: ToolExecutionContext,\n): Promise<unknown> {\n const tool = toolRegistry.get(toolId);\n\n if (!tool) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${toolId}\" not found`,\n }));\n }\n\n try {\n const result = await tool.execute(input, context);\n return result;\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Tool \"${toolId}\" execution failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n}\n\nexport { zodToJsonSchema } from \"./zod-json-schema.ts\";\n", "/**\n * MCP Resource factory and utilities\n */\n\nimport type { Resource, ResourceConfig } from \"../types/mcp.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create an MCP resource\n *\n * @example\n * ```typescript\n * import { resource } from 'veryfront/ai';\n * import { z } from 'zod';\n\n *\n * export default resource({\n * description: 'Get user profile',\n * paramsSchema: z.object({\n * userId: z.string(),\n * }),\n * load: async ({ userId }) => {\n * return await db.users.findUnique({ where: { id: userId } });\n * },\n * });\n * ```\n */\nexport function resource<TParams = any, TData = any>(\n config: ResourceConfig<TParams, TData>,\n): Resource<TParams, TData> {\n // Generate pattern if not provided\n const pattern = config.pattern || generateResourcePattern();\n\n // Generate ID from pattern\n const id = patternToId(pattern);\n\n return {\n id,\n pattern,\n description: config.description,\n paramsSchema: config.paramsSchema,\n load: async (params: TParams) => {\n // Validate params\n try {\n config.paramsSchema.parse(params);\n } catch (error) {\n throw toError(createError({\n type: \"agent\",\n message: `Resource \"${id}\" params validation failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n }));\n }\n\n return await config.load(params);\n },\n subscribe: config.subscribe,\n mcp: config.mcp,\n };\n}\n\n/**\n * Generate resource pattern fallback\n * Note: In practice, resources should explicitly define their pattern.\n * Auto-discovery is handled by the discovery.ts module which scans\n * the filesystem and extracts patterns from resource definitions.\n */\nfunction generateResourcePattern(): string {\n return `/resource_${Date.now()}`;\n}\n\n/**\n * Convert path pattern to ID\n * Example: \"/users/:userId/profile\" -> \"users_userId_profile\"\n */\nfunction patternToId(pattern: string): string {\n return pattern\n .replace(/^\\//, \"\")\n .replace(/\\//g, \"_\")\n .replace(/:/g, \"\");\n}\n\n/**\n * Resource registry\n */\nclass ResourceRegistryClass {\n private resources = new Map<string, Resource>();\n\n /**\n * Register a resource\n */\n register(id: string, resourceInstance: Resource): void {\n if (this.resources.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Resource \"${id}\" is already registered. Overwriting.`);\n }\n\n this.resources.set(id, resourceInstance);\n }\n\n /**\n * Get a resource by ID\n */\n get(id: string): Resource | undefined {\n return this.resources.get(id);\n }\n\n /**\n * Get resource by pattern matching\n */\n findByPattern(uri: string): Resource | undefined {\n for (const resource of this.resources.values()) {\n if (this.matchesPattern(uri, resource.pattern)) {\n return resource;\n }\n }\n return undefined;\n }\n\n /**\n * Check if URI matches pattern\n * Uses regex-based pattern matching with named capture groups.\n * Supports Express-style patterns like \"/users/:userId/profile\"\n */\n private matchesPattern(uri: string, pattern: string): boolean {\n const patternRegex = new RegExp(\n \"^\" + pattern.replace(/:(\\w+)/g, \"(?<$1>[^/]+)\") + \"$\",\n );\n return patternRegex.test(uri);\n }\n\n /**\n * Extract params from URI using pattern\n */\n extractParams(uri: string, pattern: string): Record<string, string> {\n const patternRegex = new RegExp(\n \"^\" + pattern.replace(/:(\\w+)/g, \"(?<$1>[^/]+)\") + \"$\",\n );\n const match = uri.match(patternRegex);\n\n return match?.groups || {};\n }\n\n /**\n * Get all resources\n */\n getAll(): Map<string, Resource> {\n return new Map(this.resources);\n }\n\n /**\n * Clear all resources\n */\n clear(): void {\n this.resources.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst RESOURCE_REGISTRY_KEY = \"__veryfront_resource_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalResource = globalThis as any;\nexport const resourceRegistry: ResourceRegistryClass = _globalResource[RESOURCE_REGISTRY_KEY] ||=\n new ResourceRegistryClass();\n", "/**\n * MCP Prompt factory and utilities\n */\n\nimport type { Prompt, PromptConfig } from \"../types/mcp.ts\";\nimport { agentLogger } from \"../../core/utils/logger/logger.ts\";\nimport { createError, toError } from \"../../core/errors/veryfront-error.ts\";\n\n/**\n * Create an MCP prompt template\n *\n * @example\n * ```typescript\n * import { prompt } from 'veryfront/ai';\n\n *\n * export default prompt({\n * description: 'Customer support prompt',\n * content: 'You are a helpful customer support agent...',\n * });\n * ```\n */\nexport function prompt(config: PromptConfig): Prompt {\n const id = config.id || generatePromptId();\n\n return {\n id,\n description: config.description,\n\n async getContent(\n variables?: Record<string, unknown>,\n ): Promise<string> {\n // If static content\n if (config.content) {\n return interpolateVariables(config.content, variables || {});\n }\n\n // If dynamic generator\n if (config.generate) {\n return await config.generate(variables || {});\n }\n\n throw toError(createError({\n type: \"agent\",\n message: `Prompt \"${id}\" has no content or generator`,\n }));\n },\n };\n}\n\n/**\n * Generate a unique prompt ID\n */\nlet promptIdCounter = 0;\nfunction generatePromptId(): string {\n return `prompt_${Date.now()}_${promptIdCounter++}`;\n}\n\n/**\n * Interpolate variables in prompt template\n * Replaces {variableName} with actual values\n */\nfunction interpolateVariables(\n template: string,\n variables: Record<string, unknown>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = variables[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * Prompt registry\n */\nclass PromptRegistryClass {\n private prompts = new Map<string, Prompt>();\n\n /**\n * Register a prompt\n */\n register(id: string, promptInstance: Prompt): void {\n if (this.prompts.has(id)) {\n // Debug level - overwriting is expected during hot reload and re-discovery\n agentLogger.debug(`Prompt \"${id}\" is already registered. Overwriting.`);\n }\n\n this.prompts.set(id, promptInstance);\n }\n\n /**\n * Get a prompt by ID\n */\n get(id: string): Prompt | undefined {\n return this.prompts.get(id);\n }\n\n /**\n * Get prompt content by ID\n */\n async getContent(\n id: string,\n variables?: Record<string, unknown>,\n ): Promise<string> {\n const promptInstance = this.get(id);\n\n if (!promptInstance) {\n throw toError(createError({\n type: \"agent\",\n message: `Prompt \"${id}\" not found`,\n }));\n }\n\n return await promptInstance.getContent(variables);\n }\n\n /**\n * Get all prompts\n */\n getAll(): Map<string, Prompt> {\n return new Map(this.prompts);\n }\n\n /**\n * Clear all prompts\n */\n clear(): void {\n this.prompts.clear();\n }\n}\n\n// Singleton instance using globalThis to share across module contexts\n// This is necessary for esbuild-bundled API routes to access the same registry\nconst PROMPT_REGISTRY_KEY = \"__veryfront_prompt_registry__\";\n// deno-lint-ignore no-explicit-any\nconst _globalPrompt = globalThis as any;\nexport const promptRegistry: PromptRegistryClass = _globalPrompt[PROMPT_REGISTRY_KEY] ||=\n new PromptRegistryClass();\n", "/**\n * MCP Registry - Central registry for all MCP resources\n */\n\nimport type { MCPRegistry } from \"../types/mcp.ts\";\nimport type { Tool } from \"../types/tool.ts\";\nimport type { Prompt, Resource } from \"../types/mcp.ts\";\nimport { toolRegistry } from \"../utils/tool.ts\";\nimport { resourceRegistry } from \"./resource.ts\";\nimport { promptRegistry } from \"./prompt.ts\";\n\n/**\n * Get the global MCP registry\n */\nexport function getMCPRegistry(): MCPRegistry {\n return {\n tools: toolRegistry.getAll(),\n resources: resourceRegistry.getAll(),\n prompts: promptRegistry.getAll(),\n };\n}\n\n/**\n * Register a tool in the MCP registry\n */\nexport function registerTool(id: string, tool: Tool): void {\n toolRegistry.register(id, tool);\n}\n\n/**\n * Register a resource in the MCP registry\n */\nexport function registerResource(id: string, resource: Resource): void {\n resourceRegistry.register(id, resource);\n}\n\n/**\n * Register a prompt in the MCP registry\n */\nexport function registerPrompt(id: string, promptInstance: Prompt): void {\n promptRegistry.register(id, promptInstance);\n}\n\n/**\n * Get MCP registry stats\n */\nexport function getMCPStats(): {\n tools: number;\n resources: number;\n prompts: number;\n total: number;\n} {\n const registry = getMCPRegistry();\n\n return {\n tools: registry.tools.size,\n resources: registry.resources.size,\n prompts: registry.prompts.size,\n total: registry.tools.size + registry.resources.size + registry.prompts.size,\n };\n}\n\n/**\n * Clear all MCP registries (for testing)\n */\nexport function clearMCPRegistry(): void {\n toolRegistry.clear();\n resourceRegistry.clear();\n promptRegistry.clear();\n}\n", "/**\n * Agent & Tool Inspector\n *\n * Debugging utilities for inspecting agent execution and tool calls.\n */\n\nimport type { Agent, Message } from \"../../types/agent.ts\";\nimport { getMCPRegistry, getMCPStats } from \"../../mcp/registry.ts\";\nimport { agentLogger } from \"@veryfront/utils/logger/logger.ts\";\n\nexport interface InspectionReport {\n /** Agent information */\n agent: {\n id: string;\n model: string;\n maxSteps: number;\n memoryType: string;\n };\n\n /** Execution details */\n execution: {\n input: string | Message[];\n output: string;\n status: string;\n steps: number;\n executionTime: number;\n };\n\n /** Tool usage */\n tools: {\n called: Array<{\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n executionTime?: number;\n status: string;\n }>;\n available: string[];\n };\n\n /** Memory usage */\n memory: {\n messagesCount: number;\n estimatedTokens: number;\n };\n\n /** Token usage */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Inspect an agent execution\n *\n * @example\n * ```typescript\n * import { inspectAgent } from 'veryfront/ai/dev';\n *\n * const report = await inspectAgent(myAgent, 'Test input');\n * console.log(report);\n * ```\n */\nexport async function inspectAgent(\n agent: Agent,\n input: string | Message[],\n): Promise<InspectionReport> {\n const startTime = Date.now();\n\n // Get memory stats before execution\n const _memoryStatsBefore = await agent.getMemoryStats();\n\n // Execute agent\n const response = await agent.generate({ input });\n\n const executionTime = Date.now() - startTime;\n\n // Get memory stats after execution\n const memoryStatsAfter = await agent.getMemoryStats();\n\n // Get available tools\n const availableTools = agent.config.tools ? Object.keys(agent.config.tools) : [];\n\n return {\n agent: {\n id: agent.id,\n model: agent.config.model,\n maxSteps: agent.config.maxSteps || 20,\n memoryType: agent.config.memory?.type || \"conversation\",\n },\n execution: {\n input,\n output: response.text,\n status: response.status,\n steps: response.toolCalls.length + 1, // Tool calls + final response\n executionTime,\n },\n tools: {\n called: response.toolCalls.map((tc) => ({\n name: tc.name,\n args: tc.args,\n result: tc.result,\n executionTime: tc.executionTime,\n status: tc.status,\n })),\n available: availableTools,\n },\n memory: {\n messagesCount: memoryStatsAfter.totalMessages,\n estimatedTokens: memoryStatsAfter.estimatedTokens,\n },\n usage: response.usage,\n };\n}\n\n/**\n * Print inspection report\n */\nexport function printInspectionReport(report: InspectionReport): void {\n agentLogger.info(\"\\n=== Agent Inspection Report ===\\n\");\n\n agentLogger.info(\"Agent:\");\n agentLogger.info(` ID: ${report.agent.id}`);\n agentLogger.info(` Model: ${report.agent.model}`);\n agentLogger.info(` Max Steps: ${report.agent.maxSteps}`);\n agentLogger.info(` Memory: ${report.agent.memoryType}\\n`);\n\n agentLogger.info(\"Execution:\");\n agentLogger.info(\n ` Input: ${\n typeof report.execution.input === \"string\"\n ? report.execution.input\n : `${(report.execution.input as Message[]).length} messages`\n }`,\n );\n agentLogger.info(` Output: ${report.execution.output.substring(0, 100)}...`);\n agentLogger.info(` Status: ${report.execution.status}`);\n agentLogger.info(` Steps: ${report.execution.steps}`);\n agentLogger.info(` Time: ${report.execution.executionTime}ms\\n`);\n\n agentLogger.info(\"Tools:\");\n agentLogger.info(\n ` Available: ${report.tools.available.length} (${report.tools.available.join(\", \")})`,\n );\n agentLogger.info(` Called: ${report.tools.called.length}`);\n\n if (report.tools.called.length > 0) {\n report.tools.called.forEach((tool, i) => {\n agentLogger.info(` ${i + 1}. ${tool.name}(${JSON.stringify(tool.args)})`);\n agentLogger.info(` Status: ${tool.status}`);\n agentLogger.info(` Time: ${tool.executionTime}ms`);\n agentLogger.info(` Result: ${JSON.stringify(tool.result).substring(0, 100)}...`);\n });\n }\n agentLogger.info(\"\");\n\n agentLogger.info(\"Memory:\");\n agentLogger.info(` Messages: ${report.memory.messagesCount}`);\n agentLogger.info(` Estimated Tokens: ${report.memory.estimatedTokens}\\n`);\n\n if (report.usage) {\n agentLogger.info(\"Token Usage:\");\n agentLogger.info(` Prompt: ${report.usage.promptTokens}`);\n agentLogger.info(` Completion: ${report.usage.completionTokens}`);\n agentLogger.info(` Total: ${report.usage.totalTokens}\\n`);\n }\n}\n\n/**\n * Get MCP registry overview\n */\nexport function getRegistryOverview(): {\n tools: Array<{ id: string; description: string }>;\n resources: Array<{ id: string; pattern: string; description: string }>;\n prompts: Array<{ id: string; description: string }>;\n stats: ReturnType<typeof getMCPStats>;\n} {\n const registry = getMCPRegistry();\n const stats = getMCPStats();\n\n return {\n tools: Array.from(registry.tools.values()).map((t) => ({\n id: t.id,\n description: t.description,\n })),\n resources: Array.from(registry.resources.values()).map((r) => ({\n id: r.id,\n pattern: r.pattern,\n description: r.description,\n })),\n prompts: Array.from(registry.prompts.values()).map((p) => ({\n id: p.id,\n description: p.description,\n })),\n stats,\n };\n}\n\n/**\n * Print registry overview\n */\nexport function printRegistryOverview(): void {\n const overview = getRegistryOverview();\n\n agentLogger.info(\"\\n=== MCP Registry Overview ===\\n\");\n agentLogger.info(`Total: ${overview.stats.total} items\\n`);\n\n agentLogger.info(`Tools (${overview.stats.tools}):`);\n overview.tools.forEach((t) => {\n agentLogger.info(` \u2022 ${t.id}: ${t.description}`);\n });\n agentLogger.info(\"\");\n\n agentLogger.info(`Resources (${overview.stats.resources}):`);\n overview.resources.forEach((r) => {\n agentLogger.info(` \u2022 ${r.id} (${r.pattern}): ${r.description}`);\n });\n agentLogger.info(\"\");\n\n agentLogger.info(`Prompts (${overview.stats.prompts}):`);\n overview.prompts.forEach((p) => {\n agentLogger.info(` \u2022 ${p.id}: ${p.description}`);\n });\n agentLogger.info(\"\");\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["logger"]
7
7
  }