@inkeep/agents-run-api 0.39.2 → 0.39.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SandboxExecutorFactory.cjs +895 -0
- package/dist/SandboxExecutorFactory.js +893 -0
- package/dist/SandboxExecutorFactory.js.map +1 -0
- package/dist/chunk-VBDAOXYI.cjs +927 -0
- package/dist/chunk-VBDAOXYI.js +832 -0
- package/dist/chunk-VBDAOXYI.js.map +1 -0
- package/dist/chunk.cjs +34 -0
- package/dist/conversations.cjs +7 -0
- package/dist/conversations.js +7 -0
- package/dist/conversations2.cjs +209 -0
- package/dist/conversations2.js +180 -0
- package/dist/conversations2.js.map +1 -0
- package/dist/dbClient.cjs +9676 -0
- package/dist/dbClient.js +9670 -0
- package/dist/dbClient.js.map +1 -0
- package/dist/dbClient2.cjs +5 -0
- package/dist/dbClient2.js +5 -0
- package/dist/env.cjs +59 -0
- package/dist/env.js +54 -0
- package/dist/env.js.map +1 -0
- package/dist/execution-limits.cjs +260 -0
- package/dist/execution-limits.js +63 -0
- package/dist/execution-limits.js.map +1 -0
- package/dist/index.cjs +10548 -20592
- package/dist/index.d.cts +26 -22
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +27 -22
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10548 -12917
- package/dist/index.js.map +1 -0
- package/dist/instrumentation.cjs +12 -121
- package/dist/instrumentation.d.cts +9 -7
- package/dist/instrumentation.d.cts.map +1 -0
- package/dist/instrumentation.d.ts +9 -7
- package/dist/instrumentation.d.ts.map +1 -0
- package/dist/instrumentation.js +5 -1
- package/dist/instrumentation2.cjs +116 -0
- package/dist/instrumentation2.js +69 -0
- package/dist/instrumentation2.js.map +1 -0
- package/dist/json-postprocessor.cjs +20 -0
- package/dist/json-postprocessor.js +20 -0
- package/dist/json-postprocessor.js.map +1 -0
- package/dist/logger.cjs +5 -0
- package/dist/logger.js +3 -0
- package/dist/logger2.cjs +1 -0
- package/dist/logger2.js +3 -0
- package/dist/nodefs.cjs +29 -0
- package/dist/nodefs.js +27 -0
- package/dist/nodefs.js.map +1 -0
- package/dist/opfs-ahp.cjs +367 -0
- package/dist/opfs-ahp.js +368 -0
- package/dist/opfs-ahp.js.map +1 -0
- package/package.json +3 -3
- package/dist/SandboxExecutorFactory-2N27SE3B.js +0 -943
- package/dist/chunk-A2S7GSHL.js +0 -1
- package/dist/chunk-EVOISBFH.js +0 -5070
- package/dist/chunk-JCVMVG3J.js +0 -592
- package/dist/chunk-KBZIYCPJ.js +0 -40
- package/dist/chunk-KCJWSIDZ.js +0 -246
- package/dist/chunk-THWNUGWP.js +0 -204
- package/dist/chunk-UC2EPLSW.js +0 -75
- package/dist/conversations-XPSTWUMK.js +0 -1
- package/dist/dbClient-MAHUR4TO.js +0 -1
- package/dist/json-postprocessor-IGYTSWFB.js +0 -12
- package/dist/logger-3EE6BUSU.js +0 -1
- package/dist/nodefs-RPE52Q4Z.js +0 -21
- package/dist/opfs-ahp-QL4REJJW.js +0 -318
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["logger","executionContext: ExecutionContext","apiKey","jwtContext","dbClient","app","logger","rpcRequest: JsonRpcRequest","task: A2ATask","dbClient","messageData: any","taskResponse: Task","messageResponse: Message","initialTask: Task","stream","completedTask: Task","task: Task","logger","session: ToolSession","expiredSessions: string[]","retrieveStatusSchema: StatusComponent","actionStatusSchema: StatusComponent","defaultStatusSchemas: StatusComponent[]","requestId","logger","previewProperties: Record<string, any>","fullProperties: Record<string, any>","logger","context: ArtifactServiceContext","dbClient","summaryData: Record<string, any>","fullData: Record<string, any>","previewSchema: any","fullSchema: any","artifactData: ArtifactSummaryData","artifacts: any[]","cleaned: any","extracted: Record<string, any>","filtered: Record<string, any>","logger","attrs: Record<string, any>","annotations: ArtifactCreateAnnotation[]","request: ArtifactCreateRequest","failedAnnotations: string[]","parts: StreamPart[]","allMatches: Array<{ match: RegExpMatchArray; type: 'create' | 'ref' }>","artifactData: ArtifactSummaryData | null","annotation: ArtifactCreateAnnotation","logger","sessionId: string","messageId: string","agentId?: string","tenantId?: string","projectId?: string","contextId?: string","dataOpEvent: MakeAgentSessionEvent<T>","event: MakeAgentSessionEvent<T>","properties: Record<string, z.ZodType<any>>","zodType: z.ZodType<any>","activities: string[]","existingNames: string[]","dbClient","result: { name: string; description: string }","lastError: Error | null","result","dbClient","logger","textPart: StreamPart","part: StreamPart","completeParts: StreamPart[]","parts","logger","z","parts: string[]","logger","sessionId: string","conversationId: string","tenantId: string","projectId: string","config: CompressionConfig","summarizerModel?: ModelSettings","baseModel?: ModelSettings","toolCallToArtifactMap: Record<string, string>","textMessages: any[]","textParts: string[]","preservedBlocks: any[]","cleaned: any","logger","approval: PendingToolApproval","logger","result: any","errors: string[]","transformedProperties: any","logger","DEFAULT_BACKOFF: BackoffStrategy","agentCard: AgentCard","err: unknown","requestId","rpcRequest: JSONRPCRequest","e: any","lineEndIndex: number","error: any","logger","tool","resolvedHeaders: Record<string, string>","dbClient","storeReference: CredentialStoreReference | undefined","context","logger","version: string","versionConfig: VersionConfig<TConfig>","systemPromptTemplate","toolTemplate","artifactTemplate","artifactRetrievalGuidance","thinkingPreparationTemplate","toolData: ToolData[]","tool","artifactRetrievalGuidance","dataComponentsTemplate","dataComponentTemplate","artifactTemplate","systemPromptTemplate","logger","tool","dbClient","sanitizedTools: ToolSet","#createRelationToolName","#getRelationshipIdForTool","context","attributes: Record<string, any>","toolCallData: ToolCallData","wrappedTools: ToolSet","wrappedTools","processedArgs: typeof args","serverConfig: McpServerConfig","functionTools: ToolSet","defaultSandboxConfig: SandboxConfig","headers","referenceTaskIds: string[]","referenceArtifacts: Artifact[]","config: SystemPromptV1","defaultTools: ToolSet","paths: string[]","selectors: string[]","response: any","textResponse: string","messages: any[]","genConfig: any","reasoningFlow: any[]","componentSchemas: z.ZodType<any>[]","dataComponentsSchema: z.ZodType<any>","phase2Messages: any[]","formattedContent: MessageContent | null","logger","dbClient","toolsForAgentResult: McpTool[]","tool","targetTransferRelations: any","targetDelegateRelations: any","err: any","targetAgentTools: McpTool[]","parts: Part[]","logger","dbAgent: SubAgentSelect","dbClient","app","logger","agent","dbClient","logger","dbClient","stream: HonoSSEStream","requestId: string","timestamp: number","stream","requestId","writer: VercelUIWriter","logger","requestId","agentConfig: any","dbClient","task: any","fromSubAgentId: string | undefined","error: any","messageResponse: SendMessageResponse | null","messageMetadata: any","errorMessage","response: string | undefined","app","logger","dbClient","otelContext","agent: any","defaultSubAgentId: string","requestId","stream","app","logger","dbClient","otelContext","stream","logger","dbClient","requestId","headers","app","otelContext","app","otelContext","requestId","zodIssues: Array<any> | undefined","conversationId: string | undefined","chatRoutes","chatDataRoutes","mcpRoutes","agentRoutes","defaultConfig: ServerConfig"],"sources":["../src/types/execution-context.ts","../src/middleware/api-key-auth.ts","../src/openapi.ts","../src/a2a/handlers.ts","../src/agents/ToolSessionManager.ts","../src/utils/default-status-schemas.ts","../src/utils/stream-registry.ts","../src/utils/tracer.ts","../src/utils/schema-validation.ts","../src/services/ArtifactService.ts","../src/services/ArtifactParser.ts","../src/services/AgentSession.ts","../src/utils/model-resolver.ts","../src/services/IncrementalStreamParser.ts","../src/tools/distill-conversation-tool.ts","../src/services/MidGenerationCompressor.ts","../src/services/PendingToolApprovalManager.ts","../src/services/ResponseFormatter.ts","../src/utils/agent-operations.ts","../src/utils/SchemaProcessor.ts","../src/utils/artifact-component-schema.ts","../src/a2a/client.ts","../src/agents/relationTools.ts","../src/agents/SystemPromptBuilder.ts","../src/agents/versions/v1/Phase1Config.ts","../src/agents/versions/v1/Phase2Config.ts","../src/agents/Agent.ts","../src/agents/generateTaskHandler.ts","../src/data/agents.ts","../src/routes/agents.ts","../src/a2a/types.ts","../src/a2a/transfer.ts","../src/utils/stream-helpers.ts","../src/handlers/executionHandler.ts","../src/routes/chat.ts","../src/routes/chatDataStream.ts","../src/routes/mcp.ts","../src/app.ts","../src/index.ts"],"sourcesContent":["import type { ExecutionContext } from '@inkeep/agents-core';\n\n/**\n * Extract userId from execution context metadata (when available)\n * Only available when request originates from an authenticated user session (e.g., playground)\n */\nexport function getUserIdFromContext(ctx: ExecutionContext): string | undefined {\n const metadata = ctx.metadata as\n | { initiatedBy?: { type: 'user' | 'api_key'; id: string } }\n | undefined;\n return metadata?.initiatedBy?.type === 'user' ? metadata.initiatedBy.id : undefined;\n}\n\n/**\n * Create execution context from middleware values\n */\nexport function createExecutionContext(params: {\n apiKey: string;\n tenantId: string;\n projectId: string;\n agentId: string;\n apiKeyId: string;\n subAgentId?: string;\n baseUrl?: string;\n metadata?: {\n teamDelegation?: boolean;\n originAgentId?: string;\n initiatedBy?: {\n type: 'user' | 'api_key';\n id: string;\n };\n };\n}): ExecutionContext {\n return {\n apiKey: params.apiKey,\n tenantId: params.tenantId,\n projectId: params.projectId,\n agentId: params.agentId,\n baseUrl: params.baseUrl || process.env.API_URL || 'http://localhost:3003',\n apiKeyId: params.apiKeyId,\n subAgentId: params.subAgentId,\n metadata: params.metadata || {},\n };\n}\n\ninterface CommonSandboxConfig {\n runtime: 'node22' | 'typescript';\n timeout?: number;\n vcpus?: number;\n}\n\nexport interface NativeSandboxConfig extends CommonSandboxConfig {\n provider: 'native';\n}\n\nexport interface VercelSandboxConfig extends CommonSandboxConfig {\n provider: 'vercel';\n teamId: string;\n projectId: string;\n token: string;\n}\n\nexport type SandboxConfig = NativeSandboxConfig | VercelSandboxConfig;\n","import {\n type ExecutionContext,\n getAgentById,\n validateAndGetApiKey,\n validateTargetAgent,\n verifyServiceToken,\n verifyTempToken,\n} from '@inkeep/agents-core';\nimport { createMiddleware } from 'hono/factory';\nimport { HTTPException } from 'hono/http-exception';\nimport dbClient from '../data/db/dbClient';\nimport { env } from '../env';\nimport { getLogger } from '../logger';\nimport { createExecutionContext } from '../types/execution-context';\n\nconst logger = getLogger('env-key-auth');\n\n/**\n * Attempts to authenticate using a JWT temporary token\n * Returns execution context if successful, null if token is invalid or not a JWT\n */\nasync function tryAuthenticateWithTempJwt(\n apiKey: string,\n baseUrl: string,\n subAgentId?: string\n): Promise<ExecutionContext | null> {\n if (!apiKey.startsWith('eyJ') || !env.INKEEP_AGENTS_TEMP_JWT_PUBLIC_KEY) {\n return null;\n }\n\n try {\n const publicKeyPem = Buffer.from(env.INKEEP_AGENTS_TEMP_JWT_PUBLIC_KEY, 'base64').toString(\n 'utf-8'\n );\n\n const payload = await verifyTempToken(publicKeyPem, apiKey);\n\n logger.info({}, 'JWT temp token authenticated successfully');\n\n return createExecutionContext({\n apiKey: apiKey,\n tenantId: payload.tenantId,\n projectId: payload.projectId,\n agentId: payload.agentId,\n apiKeyId: 'temp-jwt',\n baseUrl: baseUrl,\n subAgentId: subAgentId,\n metadata: { initiatedBy: payload.initiatedBy },\n });\n } catch (error) {\n logger.debug({ error }, 'JWT verification failed');\n return null;\n }\n}\n\nexport const apiKeyAuth = () =>\n createMiddleware<{\n Variables: {\n executionContext: ExecutionContext;\n };\n }>(async (c, next) => {\n if (c.req.method === 'OPTIONS') {\n await next();\n return;\n }\n\n const authHeader = c.req.header('Authorization');\n const tenantId = c.req.header('x-inkeep-tenant-id');\n const projectId = c.req.header('x-inkeep-project-id');\n const agentId = c.req.header('x-inkeep-agent-id');\n const subAgentId = c.req.header('x-inkeep-sub-agent-id');\n const proto = c.req.header('x-forwarded-proto')?.split(',')[0].trim();\n const fwdHost = c.req.header('x-forwarded-host')?.split(',')[0].trim();\n const host = fwdHost ?? c.req.header('host');\n const reqUrl = new URL(c.req.url);\n\n const baseUrl =\n proto && host\n ? `${proto}://${host}`\n : host\n ? `${reqUrl.protocol}//${host}`\n : `${reqUrl.origin}`;\n\n if (process.env.ENVIRONMENT === 'development' || process.env.ENVIRONMENT === 'test') {\n logger.info({}, 'development environment');\n let executionContext: ExecutionContext;\n\n if (authHeader?.startsWith('Bearer ')) {\n const apiKey = authHeader.substring(7);\n\n // Try JWT temp token first\n const jwtContext = await tryAuthenticateWithTempJwt(apiKey, baseUrl, subAgentId);\n if (jwtContext) {\n c.set('executionContext', jwtContext);\n await next();\n return;\n }\n\n // Try regular API key\n try {\n executionContext = await extractContextFromApiKey(apiKey, baseUrl);\n if (subAgentId) {\n executionContext.subAgentId = subAgentId;\n }\n c.set('executionContext', executionContext);\n } catch {\n // Try team agent token\n try {\n executionContext = await extractContextFromTeamAgentToken(apiKey, baseUrl, subAgentId);\n c.set('executionContext', executionContext);\n } catch {\n // Fall through to default context\n executionContext = createExecutionContext({\n apiKey: 'development',\n tenantId: tenantId || 'test-tenant',\n projectId: projectId || 'test-project',\n agentId: agentId || 'test-agent',\n apiKeyId: 'test-key',\n baseUrl: baseUrl,\n subAgentId: subAgentId,\n });\n c.set('executionContext', executionContext);\n logger.info(\n {},\n 'Development/test environment - fallback to default context due to invalid API key'\n );\n }\n }\n } else {\n executionContext = createExecutionContext({\n apiKey: 'development',\n tenantId: tenantId || 'test-tenant',\n projectId: projectId || 'test-project',\n agentId: agentId || 'test-agent',\n apiKeyId: 'test-key',\n baseUrl: baseUrl,\n subAgentId: subAgentId,\n });\n c.set('executionContext', executionContext);\n logger.info(\n {},\n 'Development/test environment - no API key provided, using default context'\n );\n }\n await next();\n return;\n }\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n throw new HTTPException(401, {\n message: 'Missing or invalid authorization header. Expected: Bearer <api_key>',\n });\n }\n\n const apiKey = authHeader.substring(7);\n\n // Try JWT temp token first\n const jwtContext = await tryAuthenticateWithTempJwt(apiKey, baseUrl, subAgentId);\n if (jwtContext) {\n c.set('executionContext', jwtContext);\n await next();\n return;\n }\n\n // If bypass secret is configured, check it first (production mode bypass)\n if (env.INKEEP_AGENTS_RUN_API_BYPASS_SECRET) {\n if (apiKey === env.INKEEP_AGENTS_RUN_API_BYPASS_SECRET) {\n if (!tenantId || !projectId || !agentId) {\n throw new HTTPException(401, {\n message: 'Missing or invalid tenant, project, or agent ID',\n });\n }\n\n const executionContext = createExecutionContext({\n apiKey: apiKey,\n tenantId: tenantId,\n projectId: projectId,\n agentId: agentId,\n apiKeyId: 'bypass',\n baseUrl: baseUrl,\n subAgentId: subAgentId,\n });\n\n c.set('executionContext', executionContext);\n\n logger.info({}, 'Bypass secret authenticated successfully');\n\n await next();\n return;\n }\n if (apiKey) {\n try {\n const executionContext = await extractContextFromApiKey(apiKey, baseUrl);\n if (subAgentId) {\n executionContext.subAgentId = subAgentId;\n }\n\n c.set('executionContext', executionContext);\n\n logger.info({}, 'API key authenticated successfully');\n } catch {\n const executionContext = await extractContextFromTeamAgentToken(\n apiKey,\n baseUrl,\n subAgentId\n );\n c.set('executionContext', executionContext);\n }\n\n await next();\n return;\n }\n throw new HTTPException(401, {\n message: 'Invalid Token',\n });\n }\n\n if (!apiKey || apiKey.length < 16) {\n throw new HTTPException(401, {\n message: 'Invalid API key format',\n });\n }\n\n try {\n const executionContext = await extractContextFromApiKey(apiKey, baseUrl);\n if (subAgentId) {\n executionContext.subAgentId = subAgentId;\n }\n\n c.set('executionContext', executionContext);\n\n logger.debug(\n {\n tenantId: executionContext.tenantId,\n projectId: executionContext.projectId,\n agentId: executionContext.agentId,\n subAgentId: executionContext.subAgentId,\n },\n 'API key authenticated successfully'\n );\n\n await next();\n } catch {\n try {\n const executionContext = await extractContextFromTeamAgentToken(\n apiKey,\n baseUrl,\n subAgentId\n );\n c.set('executionContext', executionContext);\n\n await next();\n } catch (error) {\n if (error instanceof HTTPException) {\n throw error;\n }\n\n logger.error({ error }, 'API key authentication error');\n throw new HTTPException(500, {\n message: 'Authentication failed',\n });\n }\n }\n });\n\nexport const extractContextFromApiKey = async (apiKey: string, baseUrl?: string) => {\n const apiKeyRecord = await validateAndGetApiKey(apiKey, dbClient);\n\n if (!apiKeyRecord) {\n throw new HTTPException(401, {\n message: 'Invalid or expired API key',\n });\n }\n\n const agent = await getAgentById(dbClient)({\n scopes: {\n tenantId: apiKeyRecord.tenantId,\n projectId: apiKeyRecord.projectId,\n agentId: apiKeyRecord.agentId,\n },\n });\n\n if (!agent) {\n throw new HTTPException(401, {\n message: 'Invalid or expired API key',\n });\n }\n\n logger.debug(\n {\n tenantId: apiKeyRecord.tenantId,\n projectId: apiKeyRecord.projectId,\n agentId: apiKeyRecord.agentId,\n subAgentId: agent.defaultSubAgentId || undefined,\n },\n 'API key authenticated successfully'\n );\n return createExecutionContext({\n apiKey: apiKey,\n tenantId: apiKeyRecord.tenantId,\n projectId: apiKeyRecord.projectId,\n agentId: apiKeyRecord.agentId,\n apiKeyId: apiKeyRecord.id,\n baseUrl: baseUrl,\n subAgentId: agent.defaultSubAgentId || undefined,\n });\n};\n\n/**\n * Extract execution context from a team agent JWT token\n * Team agent tokens are used for intra-tenant agent delegation\n */\nexport const extractContextFromTeamAgentToken = async (\n token: string,\n baseUrl?: string,\n expectedSubAgentId?: string\n) => {\n const result = await verifyServiceToken(token);\n\n if (!result.valid || !result.payload) {\n logger.warn({ error: result.error }, 'Invalid team agent JWT token');\n throw new HTTPException(401, {\n message: `Invalid team agent token: ${result.error || 'Unknown error'}`,\n });\n }\n\n const payload = result.payload;\n\n // Validate target agent if provided in headers\n if (expectedSubAgentId && !validateTargetAgent(payload, expectedSubAgentId)) {\n logger.error(\n {\n tokenTargetAgentId: payload.aud,\n expectedSubAgentId,\n originAgentId: payload.sub,\n },\n 'Team agent token target mismatch'\n );\n throw new HTTPException(403, {\n message: 'Token not valid for the requested agent',\n });\n }\n\n logger.info(\n {\n originAgentId: payload.sub,\n targetAgentId: payload.aud,\n tenantId: payload.tenantId,\n projectId: payload.projectId,\n },\n 'Team agent JWT token authenticated successfully'\n );\n\n // Create execution context from the token's target agent perspective\n return createExecutionContext({\n apiKey: 'team-agent-jwt', // Not an actual API key\n tenantId: payload.tenantId,\n projectId: payload.projectId,\n agentId: payload.aud, // Target agent ID\n apiKeyId: 'team-agent-token',\n baseUrl: baseUrl,\n subAgentId: undefined,\n metadata: {\n teamDelegation: true,\n originAgentId: payload.sub,\n },\n });\n};\n\n/**\n * Helper middleware for endpoints that optionally support API key authentication\n * If no auth header is present, it continues without setting the executionContext\n */\nexport const optionalAuth = () =>\n createMiddleware<{\n Variables: {\n executionContext?: ExecutionContext;\n };\n }>(async (c, next) => {\n const authHeader = c.req.header('Authorization');\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n await next();\n return;\n }\n\n return apiKeyAuth()(c as any, next);\n });\n","import { swaggerUI } from '@hono/swagger-ui';\nimport type { Context } from 'hono';\nimport { env } from './env';\n\nexport function setupOpenAPIRoutes(app: any) {\n // OpenAPI specification endpoint - serves the complete API spec\n app.get('/openapi.json', (c: Context) => {\n try {\n // Support Vercel domain names:\n // - Production: Use VERCEL_PROJECT_PRODUCTION_URL (built-in Vercel env var)\n // - Preview: Use VERCEL_URL (automatically provided by Vercel)\n // - Otherwise: Fall back to configured URL\n const serverUrl =\n process.env.VERCEL_ENV === 'production' && process.env.VERCEL_PROJECT_PRODUCTION_URL\n ? `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}`\n : process.env.VERCEL_ENV === 'preview' && process.env.VERCEL_URL\n ? `https://${process.env.VERCEL_URL}`\n : env.INKEEP_AGENTS_RUN_API_URL;\n\n const document = app.getOpenAPIDocument({\n openapi: '3.0.0',\n info: {\n title: 'Inkeep Agents Run API',\n version: '1.0.0',\n description:\n 'Chat completions, MCP, and A2A run endpoints in the Inkeep Agent Framework.',\n },\n servers: [\n {\n url: serverUrl,\n description: 'API Server',\n },\n ],\n });\n\n // Add security schemes and global security requirements\n document.components = {\n ...document.components,\n securitySchemes: {\n ...(document.components?.securitySchemes || {}),\n bearerAuth: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'API Key',\n description:\n 'API key authentication. All endpoints require a valid API key in the Authorization header as \"Bearer <api-key>\". API keys can be created in the management UI.',\n },\n },\n };\n\n // Set global security (all routes require API key)\n document.security = [{ bearerAuth: [] }];\n\n return c.json(document);\n } catch (error) {\n console.error('OpenAPI document generation failed:', error);\n const errorDetails =\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : JSON.stringify(error, null, 2);\n return c.json({ error: 'Failed to generate OpenAPI document', details: errorDetails }, 500);\n }\n });\n\n // Swagger UI endpoint for interactive documentation\n app.get(\n '/docs',\n swaggerUI({\n url: '/openapi.json',\n title: 'Inkeep Agents Run API Documentation',\n })\n );\n}\n","import {\n createMessage,\n createTask,\n generateId,\n getRequestExecutionContext,\n type Message,\n type MessageSendParams,\n type Task,\n TaskState,\n updateTask,\n} from '@inkeep/agents-core';\nimport type { Context } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport dbClient from '../data/db/dbClient';\nimport { getLogger } from '../logger';\nimport type { A2ATask, JsonRpcRequest, JsonRpcResponse, RegisteredAgent } from './types';\n\nconst logger = getLogger('a2aHandler');\n\nexport async function a2aHandler(c: Context, agent: RegisteredAgent): Promise<Response> {\n try {\n const rpcRequest: JsonRpcRequest = c.get('requestBody');\n\n if (rpcRequest.jsonrpc !== '2.0') {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32600,\n message: 'Invalid Request - must be JSON-RPC 2.0',\n },\n id: rpcRequest.id,\n } satisfies JsonRpcResponse);\n }\n\n switch (rpcRequest.method) {\n case 'message/send':\n return await handleMessageSend(c, agent, rpcRequest);\n\n case 'message/stream':\n return await handleMessageStream(c, agent, rpcRequest);\n\n case 'tasks/get':\n return await handleTasksGet(c, agent, rpcRequest);\n\n case 'tasks/cancel':\n return await handleTasksCancel(c, agent, rpcRequest);\n\n case 'tasks/resubscribe':\n return await handleTasksResubscribe(c, agent, rpcRequest);\n\n case 'agent.invoke':\n return await handleAgentInvoke(c, agent, rpcRequest);\n\n case 'agent.getCapabilities':\n return await handleGetCapabilities(c, agent, rpcRequest);\n\n case 'agent.getStatus':\n return await handleGetStatus(c, agent, rpcRequest);\n\n default:\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32601,\n message: `Method not found: ${rpcRequest.method}`,\n },\n id: rpcRequest.id,\n } satisfies JsonRpcResponse);\n }\n } catch (error) {\n console.error('A2A Handler Error:', error);\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32700,\n message: 'Parse error',\n },\n id: null,\n } satisfies JsonRpcResponse);\n }\n}\n\nasync function handleMessageSend(\n c: Context,\n agent: RegisteredAgent,\n request: JsonRpcRequest\n): Promise<Response> {\n try {\n const params = request.params as MessageSendParams;\n const executionContext = getRequestExecutionContext(c);\n const { agentId } = executionContext;\n\n const task: A2ATask = {\n id: generateId(),\n input: {\n parts: params.message.parts.map((part) => ({\n kind: part.kind,\n text: part.kind === 'text' ? part.text : undefined,\n data: part.kind === 'data' ? part.data : undefined,\n })),\n },\n context: {\n conversationId: params.message.contextId,\n metadata: {\n blocking: params.configuration?.blocking ?? false,\n custom: { agent_id: agentId || '' },\n ...params.message.metadata,\n },\n },\n };\n\n let effectiveContextId = params.message?.contextId;\n\n if (!effectiveContextId || effectiveContextId === 'default') {\n effectiveContextId = task.context?.conversationId;\n }\n\n if (!effectiveContextId || effectiveContextId === 'default') {\n if (\n params.message?.metadata?.conversationId &&\n params.message.metadata.conversationId !== 'default'\n ) {\n effectiveContextId = params.message.metadata.conversationId;\n }\n }\n\n if (!effectiveContextId || effectiveContextId === 'default') {\n effectiveContextId = 'default';\n }\n\n let _messageContent = '';\n try {\n if (params.message && Object.keys(params.message).length > 0) {\n _messageContent = JSON.stringify(params.message);\n } else {\n _messageContent = JSON.stringify({\n role: 'agent',\n parts: [{ text: 'Delegation task', kind: 'text' }],\n contextId: effectiveContextId,\n messageId: task.id,\n kind: 'message',\n });\n logger.warn(\n {\n taskId: task.id,\n subAgentId: agent.subAgentId,\n originalMessage: params.message,\n },\n 'Created fallback message content for empty delegation message'\n );\n }\n } catch (error) {\n logger.error({ error, taskId: task.id }, 'Failed to serialize message');\n _messageContent = JSON.stringify({\n error: 'Failed to serialize message',\n taskId: task.id,\n contextId: effectiveContextId,\n parts: [{ text: 'Error in delegation', kind: 'text' }],\n });\n }\n\n logger.info(\n {\n originalContextId: params.message.contextId,\n taskContextId: task.context?.conversationId,\n metadataContextId: params.message.metadata?.conversationId,\n finalContextId: effectiveContextId,\n subAgentId: agent.subAgentId,\n },\n 'A2A contextId resolution for delegation'\n );\n\n await createTask(dbClient)({\n id: task.id,\n tenantId: agent.tenantId,\n projectId: agent.projectId,\n agentId: agentId || '',\n contextId: effectiveContextId,\n status: 'working',\n metadata: {\n conversation_id: effectiveContextId,\n message_id: params.message.messageId || '',\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n sub_agent_id: agent.subAgentId,\n agent_id: agentId || '',\n stream_request_id: params.message.metadata?.stream_request_id,\n },\n subAgentId: agent.subAgentId,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n\n logger.info({ metadata: params.message.metadata }, 'message metadata');\n\n if (\n params.message.metadata?.fromSubAgentId ||\n params.message.metadata?.fromExternalAgentId ||\n params.message.metadata?.fromTeamAgentId\n ) {\n const messageText = params.message.parts\n .filter((part) => part.kind === 'text' && 'text' in part && part.text)\n .map((part) => (part as any).text)\n .join(' ');\n\n try {\n const messageData: any = {\n id: generateId(),\n tenantId: agent.tenantId,\n projectId: agent.projectId,\n conversationId: effectiveContextId,\n role: 'agent',\n content: {\n text: messageText,\n },\n visibility: params.message.metadata?.fromExternalAgentId ? 'external' : 'internal',\n messageType: 'a2a-request',\n taskId: task.id,\n };\n\n if (params.message.metadata?.fromSubAgentId) {\n messageData.fromSubAgentId = params.message.metadata.fromSubAgentId;\n messageData.toSubAgentId = agent.subAgentId;\n } else if (params.message.metadata?.fromExternalAgentId) {\n messageData.fromExternalAgentId = params.message.metadata.fromExternalAgentId;\n messageData.toSubAgentId = agent.subAgentId;\n } else if (params.message.metadata?.fromTeamAgentId) {\n messageData.fromTeamAgentId = params.message.metadata.fromTeamAgentId;\n messageData.toTeamAgentId = agent.subAgentId;\n }\n\n await createMessage(dbClient)(messageData);\n\n logger.info(\n {\n fromSubAgentId: params.message.metadata.fromSubAgentId,\n fromExternalAgentId: params.message.metadata.fromExternalAgentId,\n fromTeamAgentId: params.message.metadata.fromTeamAgentId,\n toSubAgentId: agent.subAgentId,\n toTeamAgentId: params.message.metadata.fromTeamAgentId ? agent.subAgentId : undefined,\n conversationId: effectiveContextId,\n messageType: 'a2a-request',\n taskId: task.id,\n },\n 'A2A message stored in database'\n );\n } catch (error) {\n logger.error(\n {\n error,\n fromSubAgentId: params.message.metadata.fromSubAgentId,\n fromExternalAgentId: params.message.metadata.fromExternalAgentId,\n fromTeamAgentId: params.message.metadata.fromTeamAgentId,\n toSubAgentId: agent.subAgentId,\n conversationId: effectiveContextId,\n },\n 'Failed to store A2A message in database'\n );\n }\n }\n\n const result = await agent.taskHandler(task);\n\n await updateTask(dbClient)({\n taskId: task.id,\n data: {\n status: result.status.state.toLowerCase(),\n metadata: {\n conversation_id: params.message.contextId || '',\n message_id: params.message.messageId || '',\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n sub_agent_id: agent.subAgentId,\n agent_id: agentId || '',\n },\n },\n });\n\n const transferArtifact = result.artifacts?.find((artifact) =>\n artifact.parts?.some(\n (part) =>\n part.kind === 'data' &&\n part.data &&\n typeof part.data === 'object' &&\n part.data.type === 'transfer'\n )\n );\n\n if (transferArtifact) {\n const transferPart = transferArtifact.parts?.find(\n (part) =>\n part.kind === 'data' &&\n part.data &&\n typeof part.data === 'object' &&\n part.data.type === 'transfer'\n );\n\n if (transferPart && transferPart.kind === 'data' && transferPart.data) {\n logger.info({ transferPart }, 'transferPart');\n return c.json({\n jsonrpc: '2.0',\n result: {\n kind: 'task',\n contextId: params.message.contextId,\n id: task.id,\n status: {\n state: TaskState.Completed,\n timestamp: new Date().toISOString(),\n },\n artifacts: [\n {\n artifactId: generateId(),\n parts: [\n {\n kind: 'data',\n data: {\n type: 'transfer',\n targetSubAgentId: transferPart.data.targetSubAgentId,\n fromSubAgentId: transferPart.data.fromSubAgentId,\n },\n },\n {\n kind: 'text',\n text: transferPart.data.reason || 'Agent requested transfer',\n },\n ],\n },\n ],\n },\n id: request.id,\n });\n }\n }\n if (result.status.state === TaskState.Failed) {\n const isConnectionRefused = result.status.type === 'connection_refused';\n\n if (isConnectionRefused) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: result.status.message || 'Agent execution failed',\n data: {\n type: 'connection_refused',\n },\n },\n } satisfies JsonRpcResponse);\n }\n }\n\n const taskStatus = {\n state: result.status.state,\n timestamp: new Date().toISOString(),\n };\n\n if (params.configuration?.blocking === false) {\n const taskResponse: Task = {\n id: task.id,\n contextId: params.message.contextId || generateId(),\n status: taskStatus,\n artifacts: result.artifacts,\n kind: 'task',\n };\n\n return c.json({\n jsonrpc: '2.0',\n result: taskResponse,\n id: request.id,\n });\n }\n const messageResponse: Message = {\n messageId: generateId(),\n parts: result.artifacts?.[0]?.parts || [\n {\n kind: 'text',\n text: 'Task completed successfully',\n },\n ],\n role: 'agent',\n taskId: task.id,\n contextId: params.message.contextId,\n kind: 'message',\n };\n\n return c.json({\n jsonrpc: '2.0',\n result: messageResponse,\n id: request.id,\n });\n } catch (error) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error during message send',\n data: error instanceof Error ? error.message : 'Unknown error',\n },\n id: request.id,\n } satisfies JsonRpcResponse);\n }\n}\n\nasync function handleMessageStream(\n c: Context,\n agent: RegisteredAgent,\n request: JsonRpcRequest\n): Promise<Response> {\n try {\n const params = request.params as MessageSendParams;\n const executionContext = getRequestExecutionContext(c);\n const { agentId } = executionContext;\n\n if (!agent.agentCard.capabilities.streaming) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32604,\n message: 'Agent does not support streaming',\n },\n id: request.id,\n } satisfies JsonRpcResponse);\n }\n\n const task: A2ATask = {\n id: generateId(),\n input: {\n parts: params.message.parts.map((part) => ({\n kind: part.kind,\n text: part.kind === 'text' ? part.text : undefined,\n data: part.kind === 'data' ? part.data : undefined,\n })),\n },\n context: {\n conversationId: params.message.contextId,\n metadata: {\n blocking: false, // Streaming is always non-blocking\n custom: { agent_id: agentId || '' },\n },\n },\n };\n\n return streamSSE(c, async (stream) => {\n try {\n const initialTask: Task = {\n id: task.id,\n contextId: params.message.contextId || generateId(),\n status: {\n state: TaskState.Working,\n timestamp: new Date().toISOString(),\n },\n artifacts: [],\n kind: 'task',\n };\n\n await stream.writeSSE({\n data: JSON.stringify({\n jsonrpc: '2.0',\n result: initialTask,\n id: request.id,\n }),\n });\n\n const result = await agent.taskHandler(task);\n\n const transferArtifact = result.artifacts?.find((artifact) =>\n artifact.parts?.some(\n (part) =>\n part.kind === 'data' &&\n part.data &&\n typeof part.data === 'object' &&\n part.data.type === 'transfer'\n )\n );\n\n if (transferArtifact) {\n const transferPart = transferArtifact.parts?.find(\n (part) =>\n part.kind === 'data' &&\n part.data &&\n typeof part.data === 'object' &&\n part.data.type === 'transfer'\n );\n\n if (transferPart && transferPart.kind === 'data' && transferPart.data) {\n await stream.writeSSE({\n data: JSON.stringify({\n jsonrpc: '2.0',\n result: {\n type: 'transfer',\n target: transferPart.data.targetSubAgentId,\n task_id: task.id,\n reason: transferPart.data.reason || 'Agent requested transfer',\n original_message: transferPart.data.original_message,\n context: {\n conversationId: params.message.contextId,\n tenantId: agent.tenantId,\n transfer_context: result.artifacts,\n },\n },\n id: request.id,\n }),\n });\n return;\n }\n }\n\n const messageResponse: Message = {\n messageId: generateId(),\n parts: result.artifacts?.[0]?.parts || [\n {\n kind: 'text',\n text: 'Task completed successfully',\n },\n ],\n role: 'agent',\n taskId: task.id,\n contextId: params.message.contextId,\n kind: 'message',\n };\n\n await stream.writeSSE({\n data: JSON.stringify({\n jsonrpc: '2.0',\n result: messageResponse,\n id: request.id,\n }),\n });\n\n const completedTask: Task = {\n ...initialTask,\n status: {\n state: TaskState.Completed,\n timestamp: new Date().toISOString(),\n },\n artifacts: result.artifacts,\n };\n\n await stream.writeSSE({\n data: JSON.stringify({\n jsonrpc: '2.0',\n result: completedTask,\n id: request.id,\n }),\n });\n } catch (error) {\n console.error('Error in stream execution:', error);\n\n await stream.writeSSE({\n data: JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error during streaming execution',\n data: error instanceof Error ? error.message : 'Unknown error',\n },\n id: request.id,\n }),\n });\n }\n });\n } catch (error) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error during message stream setup',\n data: error instanceof Error ? error.message : 'Unknown error',\n },\n id: request.id,\n } satisfies JsonRpcResponse);\n }\n}\n\nasync function handleTasksGet(\n c: Context,\n _agent: RegisteredAgent,\n request: JsonRpcRequest\n): Promise<Response> {\n try {\n const params = request.params as { id: string };\n\n const task: Task = {\n id: params.id,\n contextId: generateId(),\n status: {\n state: TaskState.Completed,\n timestamp: new Date().toISOString(),\n },\n artifacts: [\n {\n artifactId: generateId(),\n parts: [\n {\n kind: 'text',\n text: `Task ${params.id} completed successfully`,\n },\n ],\n },\n ],\n kind: 'task',\n };\n\n return c.json({\n jsonrpc: '2.0',\n result: task,\n id: request.id,\n });\n } catch (error) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error getting task',\n data: error instanceof Error ? error.message : 'Unknown error',\n },\n id: request.id,\n } satisfies JsonRpcResponse);\n }\n}\n\nasync function handleTasksCancel(\n c: Context,\n _agent: RegisteredAgent,\n request: JsonRpcRequest\n): Promise<Response> {\n try {\n const _params = request.params as { id: string };\n\n return c.json({\n jsonrpc: '2.0',\n result: { success: true },\n id: request.id,\n });\n } catch (error) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error canceling task',\n data: error instanceof Error ? error.message : 'Unknown error',\n },\n id: request.id,\n } satisfies JsonRpcResponse);\n }\n}\n\nasync function handleAgentInvoke(\n c: Context,\n agent: RegisteredAgent,\n request: JsonRpcRequest\n): Promise<Response> {\n try {\n const task: A2ATask = request.params;\n const result = await agent.taskHandler(task);\n\n return c.json({\n jsonrpc: '2.0',\n result,\n id: request.id,\n } satisfies JsonRpcResponse);\n } catch (error) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error during agent invocation',\n data: error instanceof Error ? error.message : 'Unknown error',\n },\n id: request.id,\n } satisfies JsonRpcResponse);\n }\n}\n\nasync function handleGetCapabilities(\n c: Context,\n agent: RegisteredAgent,\n request: JsonRpcRequest\n): Promise<Response> {\n return c.json({\n jsonrpc: '2.0',\n result: agent.agentCard.capabilities,\n id: request.id,\n } satisfies JsonRpcResponse);\n}\n\nasync function handleGetStatus(\n c: Context,\n agent: RegisteredAgent,\n request: JsonRpcRequest\n): Promise<Response> {\n return c.json({\n jsonrpc: '2.0',\n result: { status: 'ready', subAgentId: agent.subAgentId },\n id: request.id,\n } satisfies JsonRpcResponse);\n}\n\nasync function handleTasksResubscribe(\n c: Context,\n agent: RegisteredAgent,\n request: JsonRpcRequest\n): Promise<Response> {\n try {\n const params = request.params as { taskId: string };\n\n if (!agent.agentCard.capabilities.streaming) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32604,\n message: 'Agent does not support streaming for resubscription',\n },\n id: request.id,\n } satisfies JsonRpcResponse);\n }\n\n // For now, return SSE stream that immediately provides task status\n // In a full implementation, this would reconnect to an existing task's stream\n return streamSSE(c, async (stream) => {\n try {\n // Mock task status for resubscription\n const task: Task = {\n id: params.taskId,\n contextId: generateId(),\n status: {\n state: TaskState.Completed,\n timestamp: new Date().toISOString(),\n },\n artifacts: [],\n kind: 'task',\n };\n\n await stream.writeSSE({\n data: JSON.stringify({\n jsonrpc: '2.0',\n result: task,\n id: request.id,\n }),\n });\n } catch (error) {\n console.error('Error in task resubscription:', error);\n\n await stream.writeSSE({\n data: JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error during task resubscription',\n data: error instanceof Error ? error.message : 'Unknown error',\n },\n id: request.id,\n }),\n });\n }\n });\n } catch (error) {\n return c.json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal error during task resubscription setup',\n data: error instanceof Error ? error.message : 'Unknown error',\n },\n id: request.id,\n } satisfies JsonRpcResponse);\n }\n}\n","import { generateId } from '@inkeep/agents-core';\nimport {\n SESSION_CLEANUP_INTERVAL_MS,\n SESSION_TOOL_RESULT_CACHE_TIMEOUT_MS,\n} from '../constants/execution-limits';\nimport { getLogger } from '../logger';\n\nconst logger = getLogger('ToolSessionManager');\n\nexport interface ToolResultRecord {\n toolCallId: string;\n toolName: string;\n args?: any;\n result: any;\n timestamp: number;\n}\n\nexport interface ToolSession {\n sessionId: string;\n tenantId: string;\n projectId: string;\n contextId: string;\n taskId: string;\n toolResults: Map<string, ToolResultRecord>;\n createdAt: number;\n}\n\n/**\n * Manages tool execution state during agent generation sessions.\n * Allows tools to access previous tool call results within the same execution.\n */\nexport class ToolSessionManager {\n private static instance: ToolSessionManager;\n private sessions: Map<string, ToolSession> = new Map();\n\n private constructor() {\n // Cleanup expired sessions every minute\n setInterval(() => this.cleanupExpiredSessions(), SESSION_CLEANUP_INTERVAL_MS);\n }\n\n static getInstance(): ToolSessionManager {\n if (!ToolSessionManager.instance) {\n ToolSessionManager.instance = new ToolSessionManager();\n }\n return ToolSessionManager.instance;\n }\n\n /**\n * Create a new tool session for an agent execution\n */\n createSession(tenantId: string, projectId: string, contextId: string, taskId: string): string {\n const sessionId = generateId();\n return this.createSessionWithId(sessionId, tenantId, projectId, contextId, taskId);\n }\n\n /**\n * Create a new tool session with a specific ID (for coordination with AgentSession)\n */\n createSessionWithId(\n sessionId: string,\n tenantId: string,\n projectId: string,\n contextId: string,\n taskId: string\n ): string {\n const session: ToolSession = {\n sessionId,\n tenantId,\n projectId,\n contextId,\n taskId,\n toolResults: new Map(),\n createdAt: Date.now(),\n };\n\n this.sessions.set(sessionId, session);\n logger.debug(\n {\n sessionId,\n tenantId,\n contextId,\n taskId,\n totalSessions: this.sessions.size,\n },\n 'Created tool session with ID'\n );\n return sessionId;\n }\n\n /**\n * Ensure an agent-scoped session exists (idempotent)\n * All agents in the same agent execution share this session\n */\n ensureAgentSession(\n sessionId: string,\n tenantId: string,\n projectId: string,\n contextId: string,\n taskId: string\n ): string {\n if (this.sessions.has(sessionId)) {\n logger.debug({ sessionId }, 'Agent session already exists, reusing');\n return sessionId;\n }\n\n logger.debug(\n { sessionId, tenantId, contextId, taskId },\n 'Creating new agent-scoped tool session'\n );\n return this.createSessionWithId(sessionId, tenantId, projectId, contextId, taskId);\n }\n\n /**\n * Record a tool result in the session\n */\n recordToolResult(sessionId: string, toolResult: ToolResultRecord): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n logger.warn(\n {\n sessionId,\n toolCallId: toolResult.toolCallId,\n availableSessionIds: Array.from(this.sessions.keys()),\n totalSessions: this.sessions.size,\n },\n 'Tool result recorded for unknown session'\n );\n return;\n }\n\n session.toolResults.set(toolResult.toolCallId, toolResult);\n logger.debug(\n {\n sessionId,\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName,\n },\n 'Tool result recorded successfully'\n );\n }\n\n /**\n * Get a tool result by toolCallId within a session\n */\n getToolResult(sessionId: string, toolCallId: string): ToolResultRecord | undefined {\n const session = this.sessions.get(sessionId);\n if (!session) {\n logger.warn(\n {\n sessionId,\n toolCallId,\n availableSessionIds: Array.from(this.sessions.keys()),\n totalSessions: this.sessions.size,\n },\n 'Requested tool result for unknown session'\n );\n return undefined;\n }\n\n const result = session.toolResults.get(toolCallId);\n if (!result) {\n logger.warn(\n {\n sessionId,\n toolCallId,\n availableToolResultIds: Array.from(session.toolResults.keys()),\n totalToolResults: session.toolResults.size,\n },\n 'Tool result not found'\n );\n } else {\n logger.debug(\n {\n sessionId,\n toolCallId,\n toolName: result.toolName,\n },\n 'Tool result found successfully'\n );\n }\n\n return result;\n }\n\n /**\n * Get session info\n */\n getSession(sessionId: string): ToolSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Clean up a session after agent execution completes\n */\n endSession(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n this.sessions.delete(sessionId);\n }\n }\n\n /**\n * Remove expired sessions to prevent memory leaks\n */\n private cleanupExpiredSessions(): void {\n const now = Date.now();\n const expiredSessions: string[] = [];\n\n for (const [sessionId, session] of this.sessions.entries()) {\n if (now - session.createdAt > SESSION_TOOL_RESULT_CACHE_TIMEOUT_MS) {\n expiredSessions.push(sessionId);\n }\n }\n\n for (const sessionId of expiredSessions) {\n this.sessions.delete(sessionId);\n logger.debug({ sessionId }, 'Cleaned up expired tool session');\n }\n\n if (expiredSessions.length > 0) {\n logger.info({ expiredCount: expiredSessions.length }, 'Cleaned up expired tool sessions');\n }\n }\n}\n\n// Export singleton instance\nexport const toolSessionManager = ToolSessionManager.getInstance();\n","/**\n * Default status component schemas for AI agent operations\n */\n\nimport type { StatusComponent } from '@inkeep/agents-core';\n\n/**\n * Schema for retrieve operations - when agents are looking up, searching,\n * or researching information in web or downstream services\n */\nexport const retrieveStatusSchema: StatusComponent = {\n type: 'retrieve',\n description:\n 'Use this when the system found or retrieved specific information from searches, queries, or lookups. ONLY report ACTUAL findings that appear explicitly in the tool results - never make up data, names, numbers, or details. The label must state the SPECIFIC discovery (e.g., \"Found 3 authentication methods\", \"Database contains 500 records\", \"API supports JSON format\") not the act of searching. Every detail must be traceable to actual tool output. NEVER invent placeholder names, fictional data, or information not present in the activities.',\n};\n\n/**\n * Schema for action operations - when agents are using tools or delegating\n * tasks with side-effects to update, create, or modify downstream services\n */\nexport const actionStatusSchema: StatusComponent = {\n type: 'action',\n description:\n 'Use this when the system executed a tool or performed an operation that modified state or had side effects. ONLY report ACTUAL tool executions and their results as they appear in the tool outputs - never make up tool names, parameters, or outcomes. The label must describe what specific action was performed and its concrete result based on actual tool execution data. DO NOT make up examples like \"Ran test suite with X passes\" unless a test suite was ACTUALLY run and reported X passes. DO NOT say \"Executed database query\" unless a database query was ACTUALLY executed. Only report what literally happened. NEVER invent tool names, execution results, or details not explicitly present in the tool execution activities. If a tool failed, report the actual failure, not imagined success.',\n};\n\n/**\n * Default status component schemas collection\n */\nexport const defaultStatusSchemas: StatusComponent[] = [retrieveStatusSchema, actionStatusSchema];\n","import type { StreamHelper } from './stream-helpers';\n\n/**\n * Global registry for StreamHelper instances\n * Allows agents to access streamHelper via requestId across A2A boundaries\n */\nconst streamHelperRegistry = new Map<string, StreamHelper>();\n\n/**\n * Register a StreamHelper for a specific request ID\n */\nexport function registerStreamHelper(requestId: string, streamHelper: StreamHelper): void {\n streamHelperRegistry.set(requestId, streamHelper);\n\n // Set sessionId for stream helpers that support it\n if ('setSessionId' in streamHelper && typeof (streamHelper as any).setSessionId === 'function') {\n (streamHelper as any).setSessionId(requestId);\n }\n}\n\n/**\n * Get a StreamHelper by request ID\n */\nexport function getStreamHelper(requestId: string): StreamHelper | undefined {\n return streamHelperRegistry.get(requestId);\n}\n\n/**\n * Unregister a StreamHelper for a specific request ID\n */\nexport function unregisterStreamHelper(requestId: string): void {\n streamHelperRegistry.delete(requestId);\n}\n\n/**\n * Get registry size (for debugging)\n */\nexport function getRegistrySize(): number {\n return streamHelperRegistry.size;\n}\n","import { getTracer } from '@inkeep/agents-core';\n\n// Pre-configured tracer for agents-run-api\nexport const tracer = getTracer('agents-run-api');\n\nexport { setSpanWithError } from '@inkeep/agents-core';\n","import { z } from '@hono/zod-openapi';\nimport { convertZodToJsonSchemaWithPreview } from '@inkeep/agents-core/utils/schema-conversion';\nimport Ajv from 'ajv';\nimport { getLogger } from '../logger';\n\nconst logger = getLogger('SchemaValidation');\nconst ajv = new Ajv({ allErrors: true, strict: false });\n\n// Cache for compiled AJV validators to improve performance\nconst validatorCache = new Map<string, any>();\n\n/**\n * Clear the validator cache to free memory\n * Useful for testing or when memory usage becomes a concern\n */\nexport function clearValidatorCache(): void {\n validatorCache.clear();\n}\n\n/**\n * Get the current cache size for monitoring\n */\nexport function getValidatorCacheSize(): number {\n return validatorCache.size;\n}\n\n/**\n * Extended JSON Schema that includes preview field indicators\n */\nexport interface ExtendedJsonSchema {\n type: string;\n properties?: Record<string, ExtendedJsonSchemaProperty>;\n required?: string[];\n [key: string]: any;\n}\n\nexport interface ExtendedJsonSchemaProperty {\n type: string;\n description?: string;\n inPreview?: boolean; // New field to indicate if this should be shown in preview\n [key: string]: any;\n}\n\n/**\n * Validate that a schema is valid (either JSON Schema or Zod)\n * Following the same pattern as context validation\n */\nexport function validateComponentSchema(\n schema: any,\n componentName: string\n): {\n isValid: boolean;\n error?: string;\n validatedSchema?: ExtendedJsonSchema;\n} {\n try {\n // Check if it's a Zod schema\n if (schema instanceof z.ZodType) {\n // Convert Zod to JSON Schema with preview metadata\n const jsonSchema = convertZodToJsonSchemaWithPreview(schema);\n return {\n isValid: true,\n validatedSchema: jsonSchema as ExtendedJsonSchema,\n };\n }\n\n // Check if it's a JSON Schema\n if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {\n return {\n isValid: false,\n error: 'Schema must be a valid JSON Schema object or Zod schema',\n };\n }\n\n // Create a cache key based on the schema content\n const schemaKey = JSON.stringify(schema);\n\n // Check if we already have a compiled validator for this schema\n let validator = validatorCache.get(schemaKey);\n if (!validator) {\n // Compile and cache the validator\n validator = ajv.compile(schema);\n validatorCache.set(schemaKey, validator);\n }\n\n // If it compiled successfully, it's a valid JSON Schema\n return {\n isValid: true,\n validatedSchema: schema as ExtendedJsonSchema,\n };\n } catch (error) {\n logger.error(\n {\n componentName,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Invalid component schema'\n );\n\n return {\n isValid: false,\n error: error instanceof Error ? error.message : 'Invalid JSON Schema',\n };\n }\n}\n\n/**\n * Extract preview fields from a schema (fields marked with inPreview: true)\n */\nexport function extractPreviewFields(schema: ExtendedJsonSchema): Record<string, any> {\n const previewProperties: Record<string, any> = {};\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n if (prop.inPreview === true) {\n // Remove the inPreview flag for the extracted schema\n const cleanProp = { ...prop };\n delete cleanProp.inPreview;\n previewProperties[key] = cleanProp;\n }\n }\n }\n\n return {\n type: 'object',\n properties: previewProperties,\n required: schema.required?.filter((field) => previewProperties[field]),\n };\n}\n\n/**\n * Extract full fields from a schema (all fields, with inPreview flags removed)\n */\nexport function extractFullFields(schema: ExtendedJsonSchema): Record<string, any> {\n const fullProperties: Record<string, any> = {};\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n // Remove the inPreview flag for the extracted schema\n const cleanProp = { ...prop };\n delete cleanProp.inPreview;\n fullProperties[key] = cleanProp;\n }\n }\n\n return {\n type: 'object',\n properties: fullProperties,\n required: schema.required,\n };\n}\n","import {\n type ArtifactComponentApiInsert,\n getLedgerArtifacts,\n getTask,\n listTaskIdsByContextId,\n upsertLedgerArtifact,\n} from '@inkeep/agents-core';\nimport jmespath from 'jmespath';\nimport { toolSessionManager } from '../agents/ToolSessionManager';\nimport dbClient from '../data/db/dbClient';\nimport { getLogger } from '../logger';\nimport {\n type ExtendedJsonSchema,\n extractFullFields,\n extractPreviewFields,\n} from '../utils/schema-validation';\nimport { agentSessionManager } from './AgentSession';\n\nconst logger = getLogger('ArtifactService');\n\nexport interface ArtifactSummaryData {\n artifactId: string;\n toolCallId: string;\n name: string;\n description: string;\n type?: string;\n data: any;\n}\n\nexport interface ArtifactFullData {\n artifactId: string;\n toolCallId: string;\n name: string;\n description: string;\n type?: string;\n data: any;\n}\n\nexport interface ArtifactCreateRequest {\n artifactId: string;\n toolCallId: string;\n type: string;\n baseSelector: string;\n detailsSelector?: Record<string, string>;\n}\n\nexport interface ArtifactServiceContext {\n tenantId: string;\n sessionId?: string;\n taskId?: string;\n projectId?: string;\n contextId?: string;\n artifactComponents?: ArtifactComponentApiInsert[];\n streamRequestId?: string;\n subAgentId?: string;\n}\n\n/**\n * Service class responsible for artifact business logic operations\n * Handles database persistence, tool result extraction, and artifact management\n * Separated from parsing concerns for better architecture\n */\nexport class ArtifactService {\n private createdArtifacts: Map<string, any> = new Map();\n private static selectorCache = new Map<string, string>();\n\n constructor(private context: ArtifactServiceContext) {}\n\n /**\n * Clear static caches to prevent memory leaks between sessions\n */\n static clearCaches(): void {\n ArtifactService.selectorCache.clear();\n }\n\n /**\n * Update artifact components in the context\n */\n updateArtifactComponents(artifactComponents: ArtifactComponentApiInsert[]): void {\n this.context.artifactComponents = artifactComponents;\n }\n\n /**\n * Get all artifacts for a context from database\n */\n async getContextArtifacts(contextId: string): Promise<Map<string, any>> {\n const artifacts = new Map<string, any>();\n\n try {\n const taskIds = await listTaskIdsByContextId(dbClient)({\n contextId: contextId,\n });\n\n for (const taskId of taskIds) {\n const task = await getTask(dbClient)({\n id: taskId,\n });\n if (!task) {\n logger.warn({ taskId }, 'Task not found when fetching artifacts');\n continue;\n }\n\n const taskArtifacts = await getLedgerArtifacts(dbClient)({\n scopes: { tenantId: this.context.tenantId, projectId: task.projectId },\n taskId,\n });\n\n for (const artifact of taskArtifacts) {\n const toolCallId = artifact.metadata?.toolCallId || '';\n if (toolCallId) {\n const key = `${artifact.artifactId}:${toolCallId}`;\n artifacts.set(key, artifact);\n }\n const taskKey = `${artifact.artifactId}:${artifact.taskId}`;\n artifacts.set(taskKey, artifact);\n }\n }\n } catch (error) {\n logger.error({ error, contextId }, 'Error loading context artifacts');\n }\n\n return artifacts;\n }\n\n /**\n * Create artifact from tool result and request data\n */\n async createArtifact(\n request: ArtifactCreateRequest,\n subAgentId?: string\n ): Promise<ArtifactSummaryData | null> {\n if (!this.context.sessionId) {\n logger.warn({ request }, 'No session ID available for artifact creation');\n return null;\n }\n\n const toolResult = toolSessionManager.getToolResult(this.context.sessionId, request.toolCallId);\n if (!toolResult) {\n logger.warn(\n { request, sessionId: this.context.sessionId },\n 'Tool result not found for artifact'\n );\n return null;\n }\n\n try {\n const toolResultData =\n toolResult && typeof toolResult === 'object' && !Array.isArray(toolResult)\n ? Object.fromEntries(\n Object.entries(toolResult).filter(([key]) => key !== '_structureHints')\n )\n : toolResult;\n\n const sanitizedBaseSelector = this.sanitizeJMESPathSelector(request.baseSelector);\n let selectedData = jmespath.search(toolResultData, sanitizedBaseSelector);\n\n if (Array.isArray(selectedData)) {\n selectedData = selectedData.length > 0 ? selectedData[0] : {};\n }\n\n if (!selectedData) {\n logger.warn(\n {\n request,\n baseSelector: request.baseSelector,\n },\n 'Base selector returned no data - using empty object as fallback'\n );\n selectedData = {};\n }\n\n const component = this.context.artifactComponents?.find((ac) => ac.name === request.type);\n\n let summaryData: Record<string, any> = {};\n let fullData: Record<string, any> = {};\n\n let previewSchema: any = null;\n let fullSchema: any = null;\n\n if (component?.props) {\n previewSchema = extractPreviewFields(component.props as ExtendedJsonSchema);\n fullSchema = extractFullFields(component.props as ExtendedJsonSchema);\n\n summaryData = this.extractPropsFromSchema(\n selectedData,\n previewSchema,\n request.detailsSelector || {}\n );\n fullData = this.extractPropsFromSchema(\n selectedData,\n fullSchema,\n request.detailsSelector || {}\n );\n } else {\n summaryData = selectedData;\n fullData = selectedData;\n }\n\n const isFullDataEmpty =\n !fullData ||\n Object.keys(fullData).length === 0 ||\n Object.values(fullData).every(\n (val) =>\n val === null ||\n val === undefined ||\n val === '' ||\n (Array.isArray(val) && val.length === 0) ||\n (typeof val === 'object' && Object.keys(val).length === 0)\n );\n\n if (isFullDataEmpty) {\n fullData = { baseSelector: selectedData };\n }\n\n const cleanedSummaryData = this.cleanEscapedContent(summaryData);\n const cleanedFullData = this.cleanEscapedContent(fullData);\n\n // Validate extracted data against the actual schemas used for extraction\n const schemaValidation = this.validateExtractedData(\n request.artifactId,\n request.type,\n cleanedSummaryData,\n cleanedFullData,\n previewSchema,\n fullSchema,\n component?.props\n );\n\n const artifactData: ArtifactSummaryData = {\n artifactId: request.artifactId,\n toolCallId: request.toolCallId,\n name: 'Processing...',\n description: 'Name and description being generated...',\n type: request.type,\n data: cleanedSummaryData,\n };\n\n await this.persistArtifact(\n request,\n cleanedSummaryData,\n cleanedFullData,\n subAgentId,\n schemaValidation\n );\n\n await this.cacheArtifact(\n request.artifactId,\n request.toolCallId,\n artifactData,\n cleanedFullData\n );\n\n return artifactData;\n } catch (error) {\n logger.error({ error, request }, 'Failed to create artifact');\n\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Artifact creation failed for ${request.artifactId}: ${errorMessage}`);\n }\n }\n\n /**\n * Get artifact summary data by ID and tool call ID\n */\n async getArtifactSummary(\n artifactId: string,\n toolCallId: string,\n artifactMap?: Map<string, any>\n ): Promise<ArtifactSummaryData | null> {\n const key = `${artifactId}:${toolCallId}`;\n\n if (this.context.streamRequestId) {\n const cachedArtifact = await agentSessionManager.getArtifactCache(\n this.context.streamRequestId,\n key\n );\n if (cachedArtifact) {\n return this.formatArtifactSummaryData(cachedArtifact, artifactId, toolCallId);\n }\n }\n\n if (this.createdArtifacts.has(key)) {\n const cached = this.createdArtifacts.get(key)!;\n return this.formatArtifactSummaryData(cached, artifactId, toolCallId);\n }\n\n if (artifactMap?.has(key)) {\n const artifact = artifactMap.get(key);\n return this.formatArtifactSummaryData(artifact, artifactId, toolCallId);\n }\n\n try {\n if (!this.context.projectId || !this.context.taskId) {\n logger.warn(\n { artifactId, toolCallId },\n 'No projectId or taskId available for artifact lookup'\n );\n return null;\n }\n\n let artifacts: any[] = [];\n artifacts = await getLedgerArtifacts(dbClient)({\n scopes: { tenantId: this.context.tenantId, projectId: this.context.projectId },\n artifactId,\n toolCallId: toolCallId,\n });\n\n if (artifacts.length > 0) {\n return this.formatArtifactSummaryData(artifacts[0], artifactId, toolCallId);\n }\n\n artifacts = await getLedgerArtifacts(dbClient)({\n scopes: { tenantId: this.context.tenantId, projectId: this.context.projectId },\n artifactId,\n taskId: this.context.taskId,\n });\n\n if (artifacts.length > 0) {\n return this.formatArtifactSummaryData(artifacts[0], artifactId, toolCallId);\n }\n } catch (error) {\n logger.warn(\n { artifactId, toolCallId, taskId: this.context.taskId, error },\n 'Failed to fetch artifact'\n );\n }\n\n return null;\n }\n\n /**\n * Get artifact full data by ID and tool call ID\n */\n async getArtifactFull(\n artifactId: string,\n toolCallId: string,\n artifactMap?: Map<string, any>\n ): Promise<ArtifactFullData | null> {\n const key = `${artifactId}:${toolCallId}`;\n\n if (this.context.streamRequestId) {\n const cachedArtifact = await agentSessionManager.getArtifactCache(\n this.context.streamRequestId,\n key\n );\n if (cachedArtifact) {\n return this.formatArtifactFullData(cachedArtifact, artifactId, toolCallId);\n }\n }\n\n if (this.createdArtifacts.has(key)) {\n const cached = this.createdArtifacts.get(key)!;\n return this.formatArtifactFullData(cached, artifactId, toolCallId);\n }\n\n if (artifactMap?.has(key)) {\n const artifact = artifactMap.get(key);\n return this.formatArtifactFullData(artifact, artifactId, toolCallId);\n }\n\n try {\n if (!this.context.projectId || !this.context.taskId) {\n logger.warn(\n { artifactId, toolCallId },\n 'No projectId or taskId available for artifact lookup'\n );\n return null;\n }\n\n let artifacts: any[] = [];\n\n artifacts = await getLedgerArtifacts(dbClient)({\n scopes: { tenantId: this.context.tenantId, projectId: this.context.projectId },\n artifactId,\n toolCallId: toolCallId,\n });\n\n if (artifacts.length > 0) {\n return this.formatArtifactFullData(artifacts[0], artifactId, toolCallId);\n }\n\n artifacts = await getLedgerArtifacts(dbClient)({\n scopes: { tenantId: this.context.tenantId, projectId: this.context.projectId },\n artifactId,\n taskId: this.context.taskId,\n });\n\n if (artifacts.length > 0) {\n return this.formatArtifactFullData(artifacts[0], artifactId, toolCallId);\n }\n } catch (error) {\n logger.warn(\n { artifactId, toolCallId, taskId: this.context.taskId, error },\n 'Failed to fetch artifact'\n );\n }\n\n return null;\n }\n\n /**\n * Format raw artifact to standardized summary data format\n */\n private formatArtifactSummaryData(\n artifact: any,\n artifactId: string,\n toolCallId: string\n ): ArtifactSummaryData {\n // Try multiple data sources with logging for fallback usage\n let data = artifact.parts?.[0]?.data?.summary;\n let dataSource = 'parts[0].data.summary';\n\n if (!data || (typeof data === 'object' && Object.keys(data).length === 0)) {\n // Fallback 1: Try parts[0].data directly\n data = artifact.parts?.[0]?.data;\n if (data && !(typeof data === 'object' && Object.keys(data).length === 0)) {\n dataSource = 'parts[0].data (fallback)';\n logger.debug(\n { artifactId, toolCallId, dataSource },\n 'Using fallback data source for artifact summary'\n );\n } else {\n // Fallback 2: Try artifact.data directly\n data = artifact.data;\n if (data && !(typeof data === 'object' && Object.keys(data).length === 0)) {\n dataSource = 'artifact.data (fallback)';\n logger.debug(\n { artifactId, toolCallId, dataSource },\n 'Using fallback data source for artifact summary'\n );\n } else {\n // Final fallback: empty object with warning\n data = {};\n dataSource = 'empty (no data found)';\n logger.warn(\n {\n artifactId,\n toolCallId,\n artifactStructure: {\n hasParts: !!artifact.parts,\n partsLength: artifact.parts?.length,\n hasPartsData: !!artifact.parts?.[0]?.data,\n hasPartsSummary: !!artifact.parts?.[0]?.data?.summary,\n hasArtifactData: !!artifact.data,\n artifactKeys: Object.keys(artifact || {}),\n },\n },\n 'No valid data found for artifact summary - using empty object'\n );\n }\n }\n }\n\n return {\n artifactId,\n toolCallId,\n name: artifact.name || 'Processing...',\n description: artifact.description || 'Name and description being generated...',\n type: artifact.metadata?.artifactType || artifact.artifactType,\n data,\n };\n }\n\n /**\n * Format raw artifact to standardized full data format\n */\n private formatArtifactFullData(\n artifact: any,\n artifactId: string,\n toolCallId: string\n ): ArtifactFullData {\n // Try multiple data sources with logging for fallback usage\n let data = artifact.parts?.[0]?.data?.full;\n let dataSource = 'parts[0].data.full';\n\n if (!data || (typeof data === 'object' && Object.keys(data).length === 0)) {\n // Fallback 1: Try parts[0].data directly\n data = artifact.parts?.[0]?.data;\n if (data && !(typeof data === 'object' && Object.keys(data).length === 0)) {\n dataSource = 'parts[0].data (fallback)';\n logger.debug(\n { artifactId, toolCallId, dataSource },\n 'Using fallback data source for artifact full data'\n );\n } else {\n // Fallback 2: Try artifact.data directly\n data = artifact.data;\n if (data && !(typeof data === 'object' && Object.keys(data).length === 0)) {\n dataSource = 'artifact.data (fallback)';\n logger.debug(\n { artifactId, toolCallId, dataSource },\n 'Using fallback data source for artifact full data'\n );\n } else {\n // Final fallback: empty object with warning\n data = {};\n dataSource = 'empty (no data found)';\n logger.warn(\n {\n artifactId,\n toolCallId,\n artifactStructure: {\n hasParts: !!artifact.parts,\n partsLength: artifact.parts?.length,\n hasPartsData: !!artifact.parts?.[0]?.data,\n hasPartsFull: !!artifact.parts?.[0]?.data?.full,\n hasArtifactData: !!artifact.data,\n artifactKeys: Object.keys(artifact || {}),\n },\n },\n 'No valid data found for artifact full data - using empty object'\n );\n }\n }\n }\n\n return {\n artifactId,\n toolCallId,\n name: artifact.name || 'Processing...',\n description: artifact.description || 'Name and description being generated...',\n type: artifact.metadata?.artifactType || artifact.artifactType,\n data,\n };\n }\n\n /**\n * Validate extracted data against the schemas used for extraction\n */\n private validateExtractedData(\n artifactId: string,\n artifactType: string,\n summaryData: Record<string, any>,\n fullData: Record<string, any>,\n previewSchema: any,\n fullSchema: any,\n originalProps?: any\n ): {\n summary: {\n hasExpectedFields: boolean;\n missingFields: string[];\n extraFields: string[];\n expectedFields: string[];\n actualFields: string[];\n hasRequiredFields: boolean;\n missingRequired: string[];\n };\n full: {\n hasExpectedFields: boolean;\n missingFields: string[];\n extraFields: string[];\n expectedFields: string[];\n actualFields: string[];\n hasRequiredFields: boolean;\n missingRequired: string[];\n };\n schemaFound: boolean;\n } {\n const validateAgainstSchema = (data: Record<string, any>, schema: any) => {\n const actualFields = Object.keys(data || {});\n const expectedFields = schema?.properties ? Object.keys(schema.properties) : [];\n const missingFields = expectedFields.filter((field: string) => !(field in (data || {})));\n const extraFields = actualFields.filter((field: string) => !expectedFields.includes(field));\n\n // Check required fields specifically\n const requiredFields = schema?.required || [];\n const missingRequired = requiredFields.filter((field: string) => !(field in (data || {})));\n\n return {\n hasExpectedFields: missingFields.length === 0,\n missingFields,\n extraFields,\n expectedFields,\n actualFields,\n hasRequiredFields: missingRequired.length === 0,\n missingRequired,\n };\n };\n\n const summaryValidation = validateAgainstSchema(summaryData, previewSchema);\n const fullValidation = validateAgainstSchema(fullData, fullSchema);\n\n // Block artifact creation if required fields are missing from summary data\n if (!summaryValidation.hasRequiredFields) {\n const error = new Error(\n `Cannot save artifact: Missing required fields [${summaryValidation.missingRequired.join(', ')}] ` +\n `for '${artifactType}' schema. ` +\n `Required: [${summaryValidation.missingRequired.join(', ')}]. ` +\n `Found: [${summaryValidation.actualFields.join(', ')}]. ` +\n `Consider using a different artifact component type that matches your data structure.`\n );\n\n logger.error(\n {\n artifactId,\n artifactType,\n requiredFields: summaryValidation.missingRequired,\n actualFields: summaryValidation.actualFields,\n schemaExpected: previewSchema?.properties ? Object.keys(previewSchema.properties) : [],\n },\n 'Artifact creation failed due to missing required fields - continuing with generation'\n );\n\n // Return validation result indicating failure to prevent generation crash\n return {\n summary: summaryValidation,\n full: fullValidation,\n schemaFound: !!previewSchema,\n };\n }\n\n // Log validation results\n if (!summaryValidation.hasExpectedFields || summaryValidation.extraFields.length > 0) {\n logger.warn(\n {\n artifactId,\n artifactType,\n dataType: 'summary',\n expectedFields: summaryValidation.expectedFields,\n actualFields: summaryValidation.actualFields,\n missingFields: summaryValidation.missingFields,\n extraFields: summaryValidation.extraFields,\n },\n 'Summary data structure does not match preview schema'\n );\n }\n\n if (!fullValidation.hasExpectedFields || fullValidation.extraFields.length > 0) {\n logger.warn(\n {\n artifactId,\n artifactType,\n dataType: 'full',\n expectedFields: fullValidation.expectedFields,\n actualFields: fullValidation.actualFields,\n missingFields: fullValidation.missingFields,\n extraFields: fullValidation.extraFields,\n },\n 'Full data structure does not match full schema'\n );\n }\n\n return {\n summary: summaryValidation,\n full: fullValidation,\n schemaFound: !!originalProps,\n };\n }\n\n /**\n * Persist artifact to database vian agent session\n */\n private async persistArtifact(\n request: ArtifactCreateRequest,\n summaryData: Record<string, any>,\n fullData: Record<string, any>,\n subAgentId?: string,\n schemaValidation?: any\n ): Promise<void> {\n const effectiveAgentId = subAgentId || this.context.subAgentId;\n\n if (this.context.streamRequestId && effectiveAgentId && this.context.taskId) {\n await agentSessionManager.recordEvent(\n this.context.streamRequestId,\n 'artifact_saved',\n effectiveAgentId,\n {\n artifactId: request.artifactId,\n taskId: this.context.taskId,\n toolCallId: request.toolCallId,\n artifactType: request.type,\n summaryData: summaryData,\n data: fullData,\n subAgentId: effectiveAgentId,\n metadata: {\n toolCallId: request.toolCallId,\n baseSelector: request.baseSelector,\n detailsSelector: request.detailsSelector,\n sessionId: this.context.sessionId,\n artifactType: request.type,\n },\n schemaValidation: schemaValidation || {\n summary: {\n hasExpectedFields: true,\n missingFields: [],\n extraFields: [],\n expectedFields: [],\n actualFields: [],\n hasRequiredFields: true,\n missingRequired: [],\n },\n full: {\n hasExpectedFields: true,\n missingFields: [],\n extraFields: [],\n expectedFields: [],\n actualFields: [],\n hasRequiredFields: true,\n missingRequired: [],\n },\n schemaFound: false,\n },\n tenantId: this.context.tenantId,\n projectId: this.context.projectId,\n contextId: this.context.contextId,\n pendingGeneration: true,\n }\n );\n } else {\n logger.warn(\n {\n artifactId: request.artifactId,\n hasStreamRequestId: !!this.context.streamRequestId,\n hasAgentId: !!effectiveAgentId,\n hasTaskId: !!this.context.taskId,\n passedAgentId: subAgentId,\n contextAgentId: this.context.subAgentId,\n },\n 'Skipping artifact_saved event - missing required context'\n );\n }\n }\n\n /**\n * Cache artifact for immediate access\n */\n private async cacheArtifact(\n artifactId: string,\n toolCallId: string,\n artifactData: ArtifactSummaryData,\n fullData: Record<string, any>\n ): Promise<void> {\n const cacheKey = `${artifactId}:${toolCallId}`;\n const artifactForCache = {\n ...artifactData,\n parts: [{ data: { summary: artifactData.data, data: fullData } }],\n metadata: { artifactType: artifactData.type, toolCallId },\n taskId: this.context.taskId,\n };\n\n this.createdArtifacts.set(cacheKey, artifactForCache);\n\n if (this.context.streamRequestId) {\n await agentSessionManager.setArtifactCache(\n this.context.streamRequestId,\n cacheKey,\n artifactForCache\n );\n }\n }\n\n /**\n * Sanitize JMESPath selector to fix common syntax issues (with caching)\n */\n private sanitizeJMESPathSelector(selector: string): string {\n const cached = ArtifactService.selectorCache.get(selector);\n if (cached !== undefined) {\n return cached;\n }\n\n let sanitized = selector.replace(/==\"([^\"]*)\"/g, \"=='$1'\");\n\n sanitized = sanitized.replace(\n /\\[\\?(\\w+)\\s*~\\s*contains\\(@,\\s*\"([^\"]*)\"\\)\\]/g,\n '[?contains($1, `$2`)]'\n );\n\n sanitized = sanitized.replace(\n /\\[\\?(\\w+)\\s*~\\s*contains\\(@,\\s*'([^']*)'\\)\\]/g,\n '[?contains($1, `$2`)]'\n );\n\n sanitized = sanitized.replace(/\\s*~\\s*/g, ' ');\n\n if (ArtifactService.selectorCache.size < 1000) {\n ArtifactService.selectorCache.set(selector, sanitized);\n }\n\n return sanitized;\n }\n\n /**\n * Save an already-created artifact directly to the database\n * Used by AgentSession to save artifacts after name/description generation\n */\n async saveArtifact(artifact: {\n artifactId: string;\n name: string;\n description: string;\n type: string;\n data: Record<string, any>;\n summaryData?: Record<string, any>;\n metadata?: Record<string, any>;\n toolCallId?: string;\n }): Promise<void> {\n // Use provided summaryData if available, otherwise default to artifact.data\n let summaryData = artifact.summaryData || artifact.data;\n let fullData = artifact.data;\n\n if (this.context.artifactComponents) {\n const artifactComponent = this.context.artifactComponents.find(\n (ac) => ac.name === artifact.type\n );\n if (artifactComponent?.props) {\n try {\n const schema = artifactComponent.props as ExtendedJsonSchema;\n const previewSchema = extractPreviewFields(schema);\n const fullSchema = extractFullFields(schema);\n\n summaryData = this.filterBySchema(artifact.data, previewSchema);\n fullData = this.filterBySchema(artifact.data, fullSchema);\n } catch (error) {\n logger.warn(\n {\n artifactType: artifact.type,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to extract preview/full fields from schema, using full data for both'\n );\n }\n }\n }\n\n const artifactToSave = {\n artifactId: artifact.artifactId,\n name: artifact.name,\n description: artifact.description,\n type: artifact.type,\n taskId: this.context.taskId,\n parts: [\n {\n kind: 'data' as const,\n data: {\n summary: summaryData,\n full: fullData,\n },\n },\n ],\n metadata: artifact.metadata || {},\n };\n\n const result = await upsertLedgerArtifact(dbClient)({\n scopes: {\n tenantId: this.context.tenantId,\n projectId: this.context.projectId!,\n },\n contextId: this.context.contextId!,\n taskId: this.context.taskId!,\n toolCallId: artifact.toolCallId,\n artifact: artifactToSave,\n });\n\n if (!result.created && result.existing) {\n logger.debug(\n {\n artifactId: artifact.artifactId,\n taskId: this.context.taskId,\n },\n 'Artifact already exists, skipping duplicate creation'\n );\n }\n }\n\n /**\n * Clean up over-escaped strings that have been through multiple JSON serialization cycles\n */\n public cleanEscapedContent(value: any): any {\n if (typeof value === 'string') {\n let cleaned = value;\n\n cleaned = cleaned\n .replace(/\\u0000/g, '') // Remove null bytes\n .replace(/[\\u0001-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g, ''); // Remove control chars\n\n cleaned = cleaned\n .replace(/\\\\\"([^\"]+)\\\\\"/g, '\"$1\"') // \\\"text\\\" -> \"text\"\n .replace(/\\\\'/g, \"'\") // \\' -> '\n .replace(/\\\\`/g, '`') // \\` -> `\n .replace(/\\\\\\\\/g, '\\\\'); // \\\\\\\\ -> \\\\\n\n // Aggressively fix over-escaped content\n // Handle the specific pattern we're seeing: \\\\\\\\\\\\n (4 backslashes + n)\n const maxIterations = 10;\n let iteration = 0;\n let previousLength;\n\n do {\n previousLength = cleaned.length;\n // Replace patterns in order from most escaped to least\n cleaned = cleaned\n .replace(/\\\\\\\\\\\\\\\\n/g, '\\n') // 4 backslashes + n -> newline\n .replace(/\\\\\\\\\\\\\\\\/g, '\\\\') // 4 backslashes -> 1 backslash\n .replace(/\\\\\\\\n/g, '\\n') // 2 backslashes + n -> newline\n .replace(/\\\\\\\\/g, '\\\\') // 2 backslashes -> 1 backslash\n .replace(/\\\\n/g, '\\n') // 1 backslash + n -> newline\n .replace(/\\\\\"/g, '\"') // Escaped quotes\n .replace(/\\\\'/g, \"'\"); // Escaped single quotes\n iteration++;\n } while (cleaned.length !== previousLength && iteration < maxIterations);\n\n // Final pass to ensure no remaining double backslashes\n cleaned = cleaned.replace(/\\\\\\\\/g, '\\\\');\n\n return cleaned;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.cleanEscapedContent(item));\n }\n\n if (value && typeof value === 'object') {\n const cleaned: any = {};\n for (const [key, val] of Object.entries(value)) {\n cleaned[key] = this.cleanEscapedContent(val);\n }\n return cleaned;\n }\n\n return value;\n }\n\n /**\n * Extract properties from data using schema-defined fields and custom selectors\n */\n private extractPropsFromSchema(\n item: any,\n schema: Record<string, any>,\n customSelectors: Record<string, string>\n ): Record<string, any> {\n const extracted: Record<string, any> = {};\n\n // First, extract from schema properties (field names)\n if (schema.properties) {\n for (const fieldName of Object.keys(schema.properties)) {\n try {\n // Check if there's a custom selector for this field\n const customSelector = customSelectors[fieldName];\n let rawValue;\n\n if (customSelector) {\n // Use custom JMESPath selector\n const sanitizedSelector = this.sanitizeJMESPathSelector(customSelector);\n rawValue = jmespath.search(item, sanitizedSelector);\n } else {\n // Default to direct field access\n rawValue = item[fieldName];\n }\n\n if (rawValue !== null && rawValue !== undefined) {\n extracted[fieldName] = this.cleanEscapedContent(rawValue);\n }\n } catch (error) {\n logger.warn(\n { fieldName, error: error instanceof Error ? error.message : 'Unknown error' },\n 'Failed to extract schema field'\n );\n // Fallback to direct field access\n const fallbackValue = item[fieldName];\n if (fallbackValue !== null && fallbackValue !== undefined) {\n extracted[fieldName] = this.cleanEscapedContent(fallbackValue);\n }\n }\n }\n }\n\n return extracted;\n }\n\n /**\n * Filter extracted props based on schema\n */\n private filterBySchema(props: Record<string, any>, schema: any): Record<string, any> {\n if (!schema?.properties) return props;\n\n const filtered: Record<string, any> = {};\n for (const key of Object.keys(schema.properties)) {\n if (key in props) {\n filtered[key] = props[key];\n }\n }\n\n return filtered;\n }\n}\n","import type { ArtifactComponentApiInsert } from '@inkeep/agents-core';\nimport { getLogger } from '../logger';\nimport {\n type ArtifactCreateRequest,\n ArtifactService,\n type ArtifactServiceContext,\n type ArtifactSummaryData,\n} from './ArtifactService';\n\nconst logger = getLogger('ArtifactParser');\n\nexport interface StreamPart {\n kind: 'text' | 'data';\n text?: string;\n data?: any;\n}\n\nexport type ArtifactData = {\n artifactId: string;\n toolCallId: string;\n name: string;\n description: string;\n type: string;\n summary: Record<string, any>;\n};\n\nexport type { ArtifactFullData, ArtifactSummaryData } from './ArtifactService';\n\nexport interface ArtifactCreateAnnotation {\n artifactId: string;\n toolCallId: string;\n type: string;\n baseSelector: string;\n detailsSelector?: Record<string, string>;\n raw?: string; // Raw annotation text for debugging\n}\n\n/**\n * Artifact parser focused on parsing and text processing responsibilities\n * Delegates business logic operations to ArtifactService\n * Handles artifact tag detection, parsing, and text boundary detection\n */\nexport class ArtifactParser {\n private static readonly ARTIFACT_CHECK_REGEX =\n /<artifact:ref\\s+(?=.*id=['\"][^'\"]+['\"])(?=.*tool=['\"][^'\"]+['\"])[^>]*\\/>/;\n private static readonly ATTR_REGEX = /(\\w+)=\"([^\"]*)\"|(\\w+)='([^']*)'|(\\w+)=({[^}]+})/g;\n\n private static readonly ARTIFACT_PATTERNS = [\n '<a',\n '<ar',\n '<art',\n '<arti',\n '<artif',\n '<artifa',\n '<artifac',\n '<artifact',\n '<artifact:',\n '<artifact:r',\n '<artifact:re',\n '<artifact:ref',\n '<artifact:c',\n '<artifact:cr',\n '<artifact:cre',\n '<artifact:crea',\n '<artifact:creat',\n '<artifact:create',\n ];\n private static readonly INCOMPLETE_CREATE_REGEX =\n /<artifact:create(?![^>]*(?:\\/>|<\\/artifact:create>))/;\n\n private artifactService: ArtifactService;\n\n constructor(\n tenantId: string,\n options?: {\n sessionId?: string;\n taskId?: string;\n projectId?: string;\n contextId?: string;\n artifactComponents?: ArtifactComponentApiInsert[];\n streamRequestId?: string;\n subAgentId?: string;\n artifactService?: ArtifactService; // Allow passing existing ArtifactService\n }\n ) {\n if (options?.artifactService) {\n this.artifactService = options.artifactService;\n } else {\n const context: ArtifactServiceContext = {\n tenantId,\n ...options,\n };\n this.artifactService = new ArtifactService(context);\n }\n }\n\n /**\n * Check if text contains complete artifact markers (ref or create)\n */\n hasArtifactMarkers(text: string): boolean {\n const refMatch = ArtifactParser.ARTIFACT_CHECK_REGEX.test(text);\n\n const createRegex = /<artifact:create\\s+([^>]+?)(?:\\s*\\/)?>(?:(.*?)<\\/artifact:create>)?/gs;\n const createMatch = createRegex.test(text);\n\n return refMatch || createMatch;\n }\n\n /**\n * Check if text has incomplete artifact marker (for streaming)\n * More robust detection that handles streaming fragments\n */\n hasIncompleteArtifact(text: string): boolean {\n const endsWithPattern = ArtifactParser.ARTIFACT_PATTERNS.some((pattern) =>\n text.endsWith(pattern)\n );\n\n return (\n endsWithPattern ||\n /<artifact:ref[^>]+$/.test(text) || // Incomplete artifact ref at end\n /<artifact:create[^>]*$/.test(text) || // Incomplete artifact create at end\n (ArtifactParser.INCOMPLETE_CREATE_REGEX.test(text) && !text.includes('</artifact:create>')) ||\n this.findSafeTextBoundary(text) < text.length\n );\n }\n\n /**\n * Find safe text boundary before incomplete artifacts (for streaming)\n * Enhanced to handle streaming chunks that split in the middle of artifacts\n */\n findSafeTextBoundary(text: string): number {\n const endPatterns = [\n /<artifact:ref(?![^>]*\\/>).*$/, // artifact:ref that doesn't end with />\n /<artifact:create(?![^>]*(?:\\/>|<\\/artifact:create>)).*$/, // incomplete artifact:create\n ];\n\n for (const pattern of endPatterns) {\n const match = text.match(pattern);\n if (match && match.index !== undefined) {\n return match.index;\n }\n }\n\n for (const pattern of ArtifactParser.ARTIFACT_PATTERNS) {\n const lastIndex = text.lastIndexOf(pattern);\n if (lastIndex !== -1) {\n const textAfterPattern = text.slice(lastIndex);\n if (!textAfterPattern.includes('/>') && !textAfterPattern.includes('</artifact:')) {\n return lastIndex;\n }\n }\n }\n\n return text.length;\n }\n\n /**\n * Get all artifacts for a context - delegates to service\n */\n async getContextArtifacts(contextId: string): Promise<Map<string, any>> {\n return this.artifactService.getContextArtifacts(contextId);\n }\n\n /**\n * Parse attributes from the artifact:create tag\n */\n private parseCreateAttributes(attrString: string): ArtifactCreateAnnotation | null {\n const attrs: Record<string, any> = {};\n let match;\n\n ArtifactParser.ATTR_REGEX.lastIndex = 0;\n while ((match = ArtifactParser.ATTR_REGEX.exec(attrString)) !== null) {\n const key = match[1] || match[3] || match[5];\n let value = match[2] || match[4] || match[6];\n\n if (value?.startsWith('{')) {\n try {\n value = JSON.parse(value);\n } catch {}\n }\n\n attrs[key] = value;\n }\n\n if (!attrs.id || !attrs.tool || !attrs.type || !attrs.base) {\n logger.warn({ attrs, attrString }, 'Missing required attributes in artifact annotation');\n return null;\n }\n\n return {\n artifactId: attrs.id,\n toolCallId: attrs.tool,\n type: attrs.type,\n baseSelector: attrs.base,\n detailsSelector: attrs.details || {},\n };\n }\n\n /**\n * Parse artifact creation annotations from text\n */\n private parseCreateAnnotations(text: string): ArtifactCreateAnnotation[] {\n const annotations: ArtifactCreateAnnotation[] = [];\n\n const createRegex = /<artifact:create\\s+([^>]+?)(?:\\s*\\/)?>(?:(.*?)<\\/artifact:create>)?/gs;\n\n const matches = [...text.matchAll(createRegex)];\n\n for (const match of matches) {\n const [fullMatch, attributes] = match;\n const annotation = this.parseCreateAttributes(attributes);\n if (annotation) {\n annotation.raw = fullMatch;\n annotations.push(annotation);\n }\n }\n\n return annotations;\n }\n\n /**\n * Extract artifact data from a create annotation - delegates to service\n */\n private async extractFromCreateAnnotation(\n annotation: ArtifactCreateAnnotation,\n subAgentId?: string\n ): Promise<ArtifactSummaryData | null> {\n const request: ArtifactCreateRequest = {\n artifactId: annotation.artifactId,\n toolCallId: annotation.toolCallId,\n type: annotation.type,\n baseSelector: annotation.baseSelector,\n detailsSelector: annotation.detailsSelector,\n };\n\n return this.artifactService.createArtifact(request, subAgentId);\n }\n\n /**\n * Parse text with artifact markers into parts array\n * Handles both artifact:ref and artifact:create tags\n * Can work with or without pre-fetched artifact map\n */\n async parseText(\n text: string,\n artifactMap?: Map<string, any>,\n subAgentId?: string\n ): Promise<StreamPart[]> {\n let processedText = text;\n const createAnnotations = this.parseCreateAnnotations(text);\n\n const createdArtifactData = new Map<string, ArtifactSummaryData>();\n const failedAnnotations: string[] = [];\n\n for (const annotation of createAnnotations) {\n try {\n const artifactData = await this.extractFromCreateAnnotation(annotation, subAgentId);\n\n if (artifactData && annotation.raw) {\n createdArtifactData.set(annotation.raw, artifactData);\n } else if (annotation.raw) {\n failedAnnotations.push(\n `Failed to create artifact \"${annotation.artifactId}\": Missing or invalid data`\n );\n processedText = processedText.replace(annotation.raw, '');\n logger.warn(\n { annotation, artifactData },\n 'Removed failed artifact:create annotation from output'\n );\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'Unknown error';\n failedAnnotations.push(`Failed to create artifact \"${annotation.artifactId}\": ${errorMsg}`);\n\n if (annotation.raw) {\n processedText = processedText.replace(annotation.raw, '');\n }\n logger.error({ annotation, error }, 'Failed to extract artifact from create annotation');\n }\n }\n\n if (failedAnnotations.length > 0) {\n logger.warn(\n {\n failedCount: failedAnnotations.length,\n failures: failedAnnotations,\n },\n 'Some artifact creation attempts failed'\n );\n }\n\n const parts: StreamPart[] = [];\n\n const createRegex = /<artifact:create\\s+([^>]+?)(?:\\s*\\/)?>(?:(.*?)<\\/artifact:create>)?/gs;\n const refRegex = /<artifact:ref\\s+id=([\"'])([^\"']*?)\\1\\s+tool=([\"'])([^\"']*?)\\3\\s*\\/>/gs;\n\n const createMatches = [...text.matchAll(createRegex)];\n const refMatches = [...processedText.matchAll(refRegex)];\n\n const allMatches: Array<{ match: RegExpMatchArray; type: 'create' | 'ref' }> = [\n ...createMatches.map((match) => ({ match, type: 'create' as const })),\n ...refMatches.map((match) => ({ match, type: 'ref' as const })),\n ].sort((a, b) => (a.match.index || 0) - (b.match.index || 0));\n\n if (allMatches.length === 0) {\n return [{ kind: 'text', text: processedText }];\n }\n\n let lastIndex = 0;\n\n for (const { match, type } of allMatches) {\n if (match.index === undefined) continue;\n const matchStart = match.index;\n const fullMatch = match[0];\n\n if (matchStart > lastIndex) {\n const textBefore = text.slice(lastIndex, matchStart);\n if (textBefore) {\n parts.push({ kind: 'text', text: textBefore });\n }\n }\n\n let artifactData: ArtifactSummaryData | null = null;\n\n if (type === 'create') {\n artifactData = createdArtifactData.get(fullMatch) || null;\n } else {\n const [, , artifactId, , toolCallId] = match;\n artifactData = await this.getArtifactData(artifactId, toolCallId, artifactMap);\n }\n\n if (artifactData) {\n parts.push({\n kind: 'data',\n data: {\n artifactId: artifactData.artifactId,\n toolCallId: artifactData.toolCallId,\n name: artifactData.name,\n description: artifactData.description,\n type: artifactData.type,\n artifactSummary: artifactData.data,\n },\n });\n }\n\n lastIndex = matchStart + fullMatch.length;\n }\n\n if (lastIndex < text.length) {\n const remainingText = text.slice(lastIndex);\n if (remainingText) {\n parts.push({ kind: 'text', text: remainingText });\n }\n }\n\n return parts;\n }\n\n /**\n * Process object/dataComponents for artifact components\n */\n async parseObject(\n obj: any,\n artifactMap?: Map<string, any>,\n subAgentId?: string\n ): Promise<StreamPart[]> {\n if (obj?.dataComponents && Array.isArray(obj.dataComponents)) {\n const parts: StreamPart[] = [];\n\n for (const component of obj.dataComponents) {\n if (this.isArtifactComponent(component)) {\n const artifactData = await this.getArtifactData(\n component.props.artifact_id,\n component.props.tool_call_id,\n artifactMap\n );\n if (artifactData) {\n parts.push({\n kind: 'data',\n data: {\n artifactId: artifactData.artifactId,\n toolCallId: artifactData.toolCallId,\n name: artifactData.name,\n description: artifactData.description,\n type: artifactData.type,\n artifactSummary: artifactData.data,\n },\n });\n }\n } else if (this.isArtifactCreateComponent(component)) {\n const createData = await this.extractFromArtifactCreateComponent(component, subAgentId);\n if (createData) {\n parts.push({\n kind: 'data',\n data: {\n artifactId: createData.artifactId,\n toolCallId: createData.toolCallId,\n name: createData.name,\n description: createData.description,\n type: createData.type,\n artifactSummary: createData.data,\n },\n });\n }\n } else {\n parts.push({ kind: 'data', data: component });\n }\n }\n\n return parts;\n }\n\n if (this.isArtifactComponent(obj)) {\n const artifactData = await this.getArtifactData(\n obj.props.artifact_id,\n obj.props.tool_call_id,\n artifactMap\n );\n return artifactData\n ? [\n {\n kind: 'data',\n data: {\n artifactId: artifactData.artifactId,\n toolCallId: artifactData.toolCallId,\n name: artifactData.name,\n description: artifactData.description,\n type: artifactData.type,\n artifactSummary: artifactData.data,\n },\n },\n ]\n : [];\n }\n\n if (this.isArtifactCreateComponent(obj)) {\n const createData = await this.extractFromArtifactCreateComponent(obj, subAgentId);\n return createData\n ? [\n {\n kind: 'data',\n data: {\n artifactId: createData.artifactId,\n toolCallId: createData.toolCallId,\n name: createData.name,\n description: createData.description,\n type: createData.type,\n artifactSummary: createData.data,\n },\n },\n ]\n : [];\n }\n\n return [{ kind: 'data', data: obj }];\n }\n\n /**\n * Check if object is an artifact component\n */\n private isArtifactComponent(obj: any): boolean {\n return obj?.name === 'Artifact' && obj?.props?.artifact_id && obj?.props?.tool_call_id;\n }\n\n /**\n * Check if object is an artifact create component\n */\n private isArtifactCreateComponent(obj: any): boolean {\n return obj?.name?.startsWith('ArtifactCreate_') && obj?.props?.id && obj?.props?.tool_call_id;\n }\n\n /**\n * Extract artifact from ArtifactCreate component\n */\n private async extractFromArtifactCreateComponent(\n component: any,\n subAgentId?: string\n ): Promise<ArtifactSummaryData | null> {\n const props = component.props;\n if (!props) {\n return null;\n }\n\n const annotation: ArtifactCreateAnnotation = {\n artifactId: props.id,\n toolCallId: props.tool_call_id,\n type: props.type,\n baseSelector: props.base_selector,\n detailsSelector: props.details_selector || {},\n };\n\n return await this.extractFromCreateAnnotation(annotation, subAgentId);\n }\n\n /**\n * Get artifact data - delegates to service\n */\n private async getArtifactData(\n artifactId: string,\n toolCallId: string,\n artifactMap?: Map<string, any>\n ): Promise<ArtifactSummaryData | null> {\n return await this.artifactService.getArtifactSummary(artifactId, toolCallId, artifactMap);\n }\n}\n","import { z } from '@hono/zod-openapi';\nimport type {\n DelegationReturnedData,\n DelegationSentData,\n ModelSettings,\n StatusComponent,\n StatusUpdateSettings,\n SummaryEvent,\n TransferData,\n} from '@inkeep/agents-core';\nimport {\n CONVERSATION_HISTORY_DEFAULT_LIMIT,\n CONVERSATION_HISTORY_MAX_OUTPUT_TOKENS_DEFAULT,\n getLedgerArtifacts,\n getSubAgentById,\n ModelFactory,\n} from '@inkeep/agents-core';\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { generateObject } from 'ai';\nimport { toolSessionManager } from '../agents/ToolSessionManager';\nimport {\n ARTIFACT_GENERATION_BACKOFF_INITIAL_MS,\n ARTIFACT_GENERATION_BACKOFF_MAX_MS,\n ARTIFACT_GENERATION_MAX_RETRIES,\n ARTIFACT_SESSION_MAX_PENDING,\n ARTIFACT_SESSION_MAX_PREVIOUS_SUMMARIES,\n STATUS_UPDATE_DEFAULT_INTERVAL_SECONDS,\n STATUS_UPDATE_DEFAULT_NUM_EVENTS,\n} from '../constants/execution-limits';\nimport { getFormattedConversationHistory } from '../data/conversations';\nimport dbClient from '../data/db/dbClient';\nimport { getLogger } from '../logger';\nimport { defaultStatusSchemas } from '../utils/default-status-schemas';\nimport { getStreamHelper } from '../utils/stream-registry';\nimport { setSpanWithError, tracer } from '../utils/tracer';\nimport { ArtifactParser } from './ArtifactParser';\nimport { ArtifactService } from './ArtifactService';\n\nconst logger = getLogger('AgentSession');\n\nexport type AgentSessionEventType =\n | 'agent_generate'\n | 'agent_reasoning'\n | 'transfer'\n | 'delegation_sent'\n | 'delegation_returned'\n | 'artifact_saved'\n | 'tool_call'\n | 'tool_result'\n | 'compression'\n | 'error';\n\ninterface BaseAgentSessionEvent {\n timestamp: number;\n subAgentId: string;\n}\n\nexport type AgentSessionEvent =\n | (BaseAgentSessionEvent & { eventType: 'agent_generate'; data: AgentGenerateData })\n | (BaseAgentSessionEvent & { eventType: 'agent_reasoning'; data: AgentReasoningData })\n | (BaseAgentSessionEvent & { eventType: 'transfer'; data: TransferData })\n | (BaseAgentSessionEvent & { eventType: 'delegation_sent'; data: DelegationSentData })\n | (BaseAgentSessionEvent & { eventType: 'delegation_returned'; data: DelegationReturnedData })\n | (BaseAgentSessionEvent & { eventType: 'artifact_saved'; data: ArtifactSavedData })\n | (BaseAgentSessionEvent & { eventType: 'tool_call'; data: ToolCallData })\n | (BaseAgentSessionEvent & { eventType: 'tool_result'; data: ToolResultData })\n | (BaseAgentSessionEvent & { eventType: 'compression'; data: CompressionEventData })\n | (BaseAgentSessionEvent & { eventType: 'error'; data: ErrorEventData });\n\nexport type EventData =\n | AgentGenerateData\n | AgentReasoningData\n | TransferData\n | DelegationSentData\n | DelegationReturnedData\n | ArtifactSavedData\n | ToolCallData\n | ToolResultData\n | CompressionEventData\n | ErrorEventData;\n\nexport type EventDataMap = {\n agent_generate: AgentGenerateData;\n agent_reasoning: AgentReasoningData;\n transfer: TransferData;\n delegation_sent: DelegationSentData;\n delegation_returned: DelegationReturnedData;\n artifact_saved: ArtifactSavedData;\n tool_call: ToolCallData;\n tool_result: ToolResultData;\n compression: CompressionEventData;\n error: ErrorEventData;\n};\n\ntype MakeAgentSessionEvent<T extends AgentSessionEventType> = BaseAgentSessionEvent & {\n eventType: T;\n data: EventDataMap[T];\n};\n\nexport interface AgentGenerateData {\n parts: Array<{\n type: 'text' | 'tool_call' | 'tool_result';\n content?: string;\n toolName?: string;\n args?: any;\n result?: any;\n }>;\n generationType: 'text_generation' | 'object_generation';\n}\n\nexport interface AgentReasoningData {\n parts: Array<{\n type: 'text' | 'tool_call' | 'tool_result';\n content?: string;\n toolName?: string;\n args?: any;\n result?: any;\n }>;\n}\n\nexport interface ArtifactSavedData {\n artifactId: string;\n taskId: string;\n toolCallId?: string;\n artifactType: string;\n pendingGeneration?: boolean;\n tenantId?: string;\n projectId?: string;\n contextId?: string;\n subAgentId?: string;\n subAgentName?: string;\n metadata?: Record<string, any>;\n summaryData?: Record<string, any>;\n data?: Record<string, any>;\n schemaValidation?: {\n summary: {\n hasExpectedFields: boolean;\n missingFields: string[];\n extraFields: string[];\n expectedFields: string[];\n actualFields: string[];\n hasRequiredFields: boolean;\n missingRequired: string[];\n };\n full: {\n hasExpectedFields: boolean;\n missingFields: string[];\n extraFields: string[];\n expectedFields: string[];\n actualFields: string[];\n hasRequiredFields: boolean;\n missingRequired: string[];\n };\n schemaFound: boolean;\n };\n}\n\nexport interface ToolCallData {\n toolName: string;\n input: any;\n toolCallId: string;\n relationshipId?: string;\n needsApproval?: boolean;\n conversationId?: string;\n}\n\nexport interface ToolResultData {\n toolName: string;\n toolCallId: string;\n output: any;\n duration?: number;\n error?: string;\n relationshipId?: string;\n needsApproval?: boolean;\n}\n\nexport interface CompressionEventData {\n reason: 'manual' | 'automatic';\n messageCount: number;\n artifactCount: number;\n contextSizeBefore: number;\n contextSizeAfter: number;\n compressionType: 'mid_generation' | 'full_conversation';\n}\n\nexport interface ErrorEventData {\n message: string;\n code?: string;\n severity?: 'error' | 'warning' | 'info';\n context?: any;\n}\n\ninterface StatusUpdateState {\n lastUpdateTime: number;\n lastEventCount: number;\n startTime: number;\n config: StatusUpdateSettings;\n summarizerModel?: ModelSettings;\n baseModel?: ModelSettings;\n updateLock?: boolean; // Atomic lock for status updates\n}\n\n/**\n * Tracks all agent operations and interactions for a single message\n * Now includes intelligent status update functionality\n */\nexport class AgentSession {\n private events: AgentSessionEvent[] = [];\n private statusUpdateState?: StatusUpdateState;\n private statusUpdateTimer?: ReturnType<typeof setInterval>;\n private previousSummaries: string[] = [];\n private isEnded: boolean = false;\n private isTextStreaming: boolean = false;\n private isGeneratingUpdate: boolean = false;\n private pendingArtifacts = new Set<string>(); // Track pending artifact processing\n private artifactProcessingErrors = new Map<string, number>(); // Track errors per artifact\n private readonly MAX_ARTIFACT_RETRIES = ARTIFACT_GENERATION_MAX_RETRIES;\n private readonly MAX_PENDING_ARTIFACTS = ARTIFACT_SESSION_MAX_PENDING; // Prevent unbounded growth\n private scheduledTimeouts?: Set<ReturnType<typeof setTimeout>>; // Track scheduled timeouts for cleanup\n private artifactCache = new Map<string, any>(); // Cache artifacts created in this session\n private artifactService?: any; // Session-scoped ArtifactService instance\n private artifactParser?: any; // Session-scoped ArtifactParser instance\n private isEmitOperations: boolean = false; // Whether to send data operations\n\n constructor(\n public readonly sessionId: string,\n public readonly messageId: string,\n public readonly agentId?: string,\n public readonly tenantId?: string,\n public readonly projectId?: string,\n public readonly contextId?: string\n ) {\n logger.debug({ sessionId, messageId, agentId }, 'AgentSession created');\n\n if (tenantId && projectId) {\n toolSessionManager.createSessionWithId(\n sessionId,\n tenantId,\n projectId,\n contextId || 'default',\n `task_${contextId}-${messageId}` // Create a taskId based on context and message\n );\n\n this.artifactService = new ArtifactService({\n tenantId,\n projectId,\n sessionId,\n contextId,\n taskId: `task_${contextId}-${messageId}`,\n streamRequestId: sessionId,\n });\n\n this.artifactParser = new ArtifactParser(tenantId, {\n projectId,\n sessionId: sessionId,\n contextId,\n taskId: `task_${contextId}-${messageId}`,\n streamRequestId: sessionId,\n artifactService: this.artifactService, // Pass the shared ArtifactService\n });\n }\n }\n\n /**\n * Enable emit operations to send data operations\n */\n enableEmitOperations(): void {\n this.isEmitOperations = true;\n logger.info(\n { sessionId: this.sessionId },\n '🔍 DEBUG: Emit operations enabled for AgentSession'\n );\n }\n\n /**\n * Send data operation to stream when emit operations is enabled\n */\n private async sendDataOperation(event: AgentSessionEvent): Promise<void> {\n try {\n const streamHelper = getStreamHelper(this.sessionId);\n if (streamHelper) {\n const formattedOperation = {\n type: event.eventType,\n label: this.generateEventLabel(event),\n details: {\n timestamp: event.timestamp,\n subAgentId: event.subAgentId,\n data: event.data,\n },\n };\n\n await streamHelper.writeOperation(formattedOperation);\n }\n } catch (error) {\n logger.error(\n {\n sessionId: this.sessionId,\n eventType: event.eventType,\n error: error instanceof Error ? error.message : error,\n },\n '❌ DEBUG: Failed to send data operation'\n );\n }\n }\n\n /**\n * Generate human-readable labels for events\n */\n private generateEventLabel(event: AgentSessionEvent): string {\n switch (event.eventType) {\n case 'agent_generate':\n return `Agent ${event.subAgentId} generating response`;\n case 'agent_reasoning':\n return `Agent ${event.subAgentId} reasoning through request`;\n case 'tool_call':\n return `Tool call: ${event.data.toolName || 'unknown'}`;\n case 'tool_result': {\n const status = event.data.error ? 'failed' : 'completed';\n return `Tool result: ${event.data.toolName || 'unknown'} (${status})`;\n }\n case 'error':\n return `Error: ${event.data.message}`;\n case 'transfer':\n return `Agent transfer: ${event.data.fromSubAgent} → ${event.data.targetSubAgent}`;\n case 'delegation_sent':\n return `Task delegated: ${event.data.fromSubAgent} → ${event.data.targetSubAgent}`;\n case 'delegation_returned':\n return `Task completed: ${event.data.targetSubAgent} → ${event.data.fromSubAgent}`;\n case 'artifact_saved':\n return `Artifact saved: ${event.data.artifactType || 'unknown type'}`;\n case 'compression':\n return `Compressed ${event.data.messageCount} messages and ${event.data.artifactCount} artifacts (${event.data.reason})`;\n default:\n return `${(event as AgentSessionEvent).eventType} event`;\n }\n }\n\n /**\n * Initialize status updates for this session\n */\n initializeStatusUpdates(\n config: StatusUpdateSettings,\n summarizerModel?: ModelSettings,\n baseModel?: ModelSettings\n ): void {\n const now = Date.now();\n this.statusUpdateState = {\n lastUpdateTime: now,\n lastEventCount: 0,\n startTime: now,\n summarizerModel,\n baseModel,\n config: {\n numEvents: config.numEvents || STATUS_UPDATE_DEFAULT_NUM_EVENTS,\n timeInSeconds: config.timeInSeconds || STATUS_UPDATE_DEFAULT_INTERVAL_SECONDS,\n ...config,\n },\n };\n\n if (this.statusUpdateState.config.timeInSeconds) {\n this.statusUpdateTimer = setInterval(async () => {\n if (!this.statusUpdateState || this.isEnded) {\n logger.debug(\n { sessionId: this.sessionId },\n 'Timer triggered but session already cleaned up or ended'\n );\n if (this.statusUpdateTimer) {\n clearInterval(this.statusUpdateTimer);\n this.statusUpdateTimer = undefined;\n }\n return;\n }\n await this.checkAndSendTimeBasedUpdate();\n }, this.statusUpdateState.config.timeInSeconds * 1000);\n\n logger.info(\n {\n sessionId: this.sessionId,\n intervalMs: this.statusUpdateState.config.timeInSeconds * 1000,\n },\n 'Time-based status update timer started'\n );\n }\n }\n\n /**\n * Record an event in the session and trigger status updates if configured\n * Generic type parameter T ensures eventType and data are correctly paired\n */\n recordEvent<T extends AgentSessionEventType>(\n eventType: T,\n subAgentId: string,\n data: EventDataMap[T]\n ): void {\n if (this.isEmitOperations) {\n const dataOpEvent: MakeAgentSessionEvent<T> = {\n timestamp: Date.now(),\n eventType,\n subAgentId,\n data,\n };\n this.sendDataOperation(dataOpEvent as AgentSessionEvent);\n }\n\n if (this.isEnded) {\n logger.debug(\n {\n sessionId: this.sessionId,\n eventType,\n subAgentId,\n },\n 'Event received after session ended - ignoring'\n );\n return;\n }\n\n const event: MakeAgentSessionEvent<T> = {\n timestamp: Date.now(),\n eventType,\n subAgentId,\n data,\n };\n\n this.events.push(event as AgentSessionEvent);\n\n if (eventType === 'artifact_saved') {\n const artifactData = data as ArtifactSavedData;\n\n if (artifactData.pendingGeneration) {\n const artifactId = artifactData.artifactId;\n\n if (this.pendingArtifacts.size >= this.MAX_PENDING_ARTIFACTS) {\n logger.warn(\n {\n sessionId: this.sessionId,\n artifactId,\n pendingCount: this.pendingArtifacts.size,\n maxAllowed: this.MAX_PENDING_ARTIFACTS,\n },\n 'Too many pending artifacts, skipping processing'\n );\n return;\n }\n\n this.pendingArtifacts.add(artifactId);\n\n setImmediate(() => {\n const artifactDataWithAgent = { ...artifactData, subAgentId };\n this.processArtifact(artifactDataWithAgent)\n .then(() => {\n this.pendingArtifacts.delete(artifactId);\n this.artifactProcessingErrors.delete(artifactId);\n })\n .catch((error) => {\n const errorCount = (this.artifactProcessingErrors.get(artifactId) || 0) + 1;\n this.artifactProcessingErrors.set(artifactId, errorCount);\n\n if (errorCount >= this.MAX_ARTIFACT_RETRIES) {\n this.pendingArtifacts.delete(artifactId);\n logger.error(\n {\n sessionId: this.sessionId,\n artifactId,\n errorCount,\n maxRetries: this.MAX_ARTIFACT_RETRIES,\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'Artifact processing failed after max retries, giving up'\n );\n } else {\n logger.warn(\n {\n sessionId: this.sessionId,\n artifactId,\n errorCount,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Artifact processing failed, may retry'\n );\n }\n });\n });\n }\n }\n\n if (!this.isEnded) {\n this.checkStatusUpdates();\n }\n }\n\n /**\n * Check and send status updates if configured (async, non-blocking)\n */\n private checkStatusUpdates(): void {\n if (this.isEnded) {\n logger.debug(\n { sessionId: this.sessionId },\n 'Session has ended - skipping status update check'\n );\n return;\n }\n\n if (!this.statusUpdateState) {\n logger.debug({ sessionId: this.sessionId }, 'No status update state - skipping check');\n return;\n }\n\n const statusUpdateState = this.statusUpdateState;\n\n // Schedule async update check with proper error handling\n this.scheduleStatusUpdateCheck(statusUpdateState);\n }\n\n /**\n * Check and send time-based status updates\n */\n private async checkAndSendTimeBasedUpdate(): Promise<void> {\n if (this.isEnded) {\n logger.debug({ sessionId: this.sessionId }, 'Session has ended - skipping time-based update');\n return;\n }\n\n if (!this.statusUpdateState) {\n logger.debug(\n { sessionId: this.sessionId },\n 'No status updates configured for time-based check'\n );\n return;\n }\n\n // Only send if we have new events since last update\n const newEventCount = this.events.length - this.statusUpdateState.lastEventCount;\n if (newEventCount === 0) {\n return;\n }\n\n try {\n // Always send time-based updates regardless of event count\n await this.generateAndSendUpdate();\n } catch (error) {\n logger.error(\n {\n sessionId: this.sessionId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to send time-based status update'\n );\n }\n }\n\n /**\n * Get all events in chronological order\n */\n getEvents(): AgentSessionEvent[] {\n return [...this.events];\n }\n\n /**\n * Get events filtered by type\n */\n getEventsByType(eventType: AgentSessionEventType): AgentSessionEvent[] {\n return this.events.filter((event) => event.eventType === eventType);\n }\n\n /**\n * Get events filtered by agent\n */\n getEventsByAgent(subAgentId: string): AgentSessionEvent[] {\n return this.events.filter((event) => event.subAgentId === subAgentId);\n }\n\n /**\n * Get summary of session activity\n */\n getSummary() {\n const eventCounts = this.events.reduce(\n (counts, event) => {\n counts[event.eventType] = (counts[event.eventType] || 0) + 1;\n return counts;\n },\n {} as Record<AgentSessionEventType, number>\n );\n\n const agentCounts = this.events.reduce(\n (counts, event) => {\n counts[event.subAgentId] = (counts[event.subAgentId] || 0) + 1;\n return counts;\n },\n {} as Record<string, number>\n );\n\n return {\n sessionId: this.sessionId,\n messageId: this.messageId,\n agentId: this.agentId,\n totalEvents: this.events.length,\n eventCounts,\n agentCounts,\n startTime: this.events[0]?.timestamp,\n endTime: this.events[this.events.length - 1]?.timestamp,\n duration:\n this.events.length > 0\n ? this.events[this.events.length - 1].timestamp - this.events[0].timestamp\n : 0,\n };\n }\n\n /**\n * Mark that text streaming has started (to suppress status updates)\n */\n setTextStreaming(isStreaming: boolean): void {\n this.isTextStreaming = isStreaming;\n }\n\n /**\n * Check if text is currently being streamed\n */\n isCurrentlyStreaming(): boolean {\n return this.isTextStreaming;\n }\n\n /**\n * Clean up status update resources when session ends\n */\n async cleanup(): Promise<void> {\n // Mark session as ended\n this.isEnded = true;\n\n if (this.statusUpdateTimer) {\n clearInterval(this.statusUpdateTimer);\n this.statusUpdateTimer = undefined;\n }\n this.statusUpdateState = undefined;\n\n // Wait for pending artifacts to complete before cleaning up artifactService\n if (this.pendingArtifacts.size > 0) {\n const maxWaitTime = 10000; // 10 seconds max wait\n const startTime = Date.now();\n\n while (this.pendingArtifacts.size > 0 && Date.now() - startTime < maxWaitTime) {\n await new Promise((resolve) => setTimeout(resolve, 100)); // Wait 100ms between checks\n }\n\n if (this.pendingArtifacts.size > 0) {\n logger.warn(\n {\n sessionId: this.sessionId,\n pendingCount: this.pendingArtifacts.size,\n pendingIds: Array.from(this.pendingArtifacts),\n },\n 'Cleanup proceeding with pending artifacts still processing'\n );\n }\n }\n\n // Clean up artifact tracking maps to prevent memory leaks\n this.pendingArtifacts.clear();\n this.artifactProcessingErrors.clear();\n\n // Clear artifact cache for this session\n this.artifactCache.clear();\n\n // Clean up the ToolSession that this AgentSession created\n if (this.sessionId) {\n toolSessionManager.endSession(this.sessionId);\n }\n\n // Clear any scheduled timeouts to prevent race conditions\n if (this.scheduledTimeouts) {\n for (const timeoutId of this.scheduledTimeouts) {\n clearTimeout(timeoutId);\n }\n this.scheduledTimeouts.clear();\n }\n\n // Clear static caches from ArtifactService to prevent memory leaks\n if (this.artifactService) {\n // Use the session-scoped instance\n this.artifactService.constructor.clearCaches();\n this.artifactService = undefined;\n } else {\n // Fallback to static class if session service wasn't initialized\n ArtifactService.clearCaches();\n }\n }\n\n /**\n * Generate and send a status update using agent-level summarizer\n */\n private async generateAndSendUpdate(): Promise<void> {\n if (this.isEnded) {\n logger.debug({ sessionId: this.sessionId }, 'Session has ended - not generating update');\n return;\n }\n\n if (this.isTextStreaming) {\n logger.debug(\n { sessionId: this.sessionId },\n 'Text is currently streaming - skipping status update'\n );\n return;\n }\n\n if (this.isGeneratingUpdate) {\n logger.debug(\n { sessionId: this.sessionId },\n 'Update already in progress - skipping duplicate generation'\n );\n return;\n }\n\n if (!this.statusUpdateState) {\n logger.warn({ sessionId: this.sessionId }, 'No status update state - cannot generate update');\n return;\n }\n\n if (!this.agentId) {\n logger.warn({ sessionId: this.sessionId }, 'No agent ID - cannot generate update');\n return;\n }\n\n // Only send if we have new events since last update\n const newEventCount = this.events.length - this.statusUpdateState.lastEventCount;\n if (newEventCount === 0) {\n return;\n }\n\n // Set flag to prevent concurrent updates\n this.isGeneratingUpdate = true;\n\n // Store references at start to prevent race conditions\n const statusUpdateState = this.statusUpdateState;\n\n try {\n const streamHelper = getStreamHelper(this.sessionId);\n if (!streamHelper) {\n logger.warn(\n { sessionId: this.sessionId },\n 'No stream helper found - cannot send status update'\n );\n this.isGeneratingUpdate = false;\n return;\n }\n\n const now = Date.now();\n const elapsedTime = now - statusUpdateState.startTime;\n\n // Use default status schemas if no custom ones are configured\n const statusComponents =\n statusUpdateState.config.statusComponents &&\n statusUpdateState.config.statusComponents.length > 0\n ? statusUpdateState.config.statusComponents\n : defaultStatusSchemas;\n\n // Generate structured status update using configured or default schemas\n const result = await this.generateStructuredStatusUpdate(\n this.events.slice(statusUpdateState.lastEventCount),\n elapsedTime,\n statusComponents,\n statusUpdateState.summarizerModel,\n this.previousSummaries\n );\n\n if (result.summaries && result.summaries.length > 0) {\n // Send each operation separately using writeData for dynamic types\n for (const summary of result.summaries) {\n // Guard against empty/invalid operations\n if (\n !summary ||\n !summary.type ||\n !summary.data ||\n !summary.data.label ||\n Object.keys(summary.data).length === 0\n ) {\n logger.warn(\n {\n sessionId: this.sessionId,\n summary: summary,\n },\n 'Skipping empty or invalid structured operation'\n );\n continue;\n }\n\n const summaryToSend = {\n type: summary.data.type || summary.type, // Preserve the actual custom type from LLM\n label: summary.data.label,\n details: Object.fromEntries(\n Object.entries(summary.data).filter(([key]) => !['label', 'type'].includes(key))\n ),\n };\n\n await streamHelper.writeSummary(summaryToSend as SummaryEvent);\n }\n\n // Store summaries for next time - use full JSON for better comparison\n const summaryTexts = result.summaries.map((summary) =>\n JSON.stringify({ type: summary.type, data: summary.data })\n );\n this.previousSummaries.push(...summaryTexts);\n\n // Update state after sending all operations\n if (this.statusUpdateState) {\n this.statusUpdateState.lastUpdateTime = now;\n this.statusUpdateState.lastEventCount = this.events.length;\n }\n\n return;\n }\n\n // Keep only last N summaries to avoid context getting too large\n if (this.previousSummaries.length > ARTIFACT_SESSION_MAX_PREVIOUS_SUMMARIES) {\n this.previousSummaries.shift();\n }\n\n // Update state - check if still exists (could be cleaned up during async operation)\n if (this.statusUpdateState) {\n this.statusUpdateState.lastUpdateTime = now;\n this.statusUpdateState.lastEventCount = this.events.length;\n }\n } catch (error) {\n logger.error(\n {\n sessionId: this.sessionId,\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined,\n },\n '❌ Failed to generate status update'\n );\n } finally {\n // Clear the flag to allow future updates\n this.isGeneratingUpdate = false;\n }\n }\n\n /**\n * Schedule status update check without setImmediate race conditions\n */\n private scheduleStatusUpdateCheck(statusUpdateState: StatusUpdateState): void {\n const timeoutId = setTimeout(async () => {\n try {\n if (this.isEnded || !this.statusUpdateState) {\n return;\n }\n\n if (!this.acquireUpdateLock()) {\n return; // Another update is in progress\n }\n\n try {\n if (this.isEnded || !statusUpdateState || this.isTextStreaming) {\n return;\n }\n\n const currentEventCount = this.events.length;\n const numEventsThreshold = statusUpdateState.config.numEvents;\n\n const shouldUpdateByEvents =\n numEventsThreshold &&\n currentEventCount >= statusUpdateState.lastEventCount + numEventsThreshold;\n\n if (shouldUpdateByEvents) {\n await this.generateAndSendUpdate();\n }\n } finally {\n this.releaseUpdateLock();\n }\n } catch (error) {\n logger.error(\n {\n sessionId: this.sessionId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to check status updates during event recording'\n );\n this.releaseUpdateLock();\n }\n }, 0);\n\n if (!this.scheduledTimeouts) {\n this.scheduledTimeouts = new Set();\n }\n this.scheduledTimeouts.add(timeoutId);\n\n setTimeout(() => {\n if (this.scheduledTimeouts) {\n this.scheduledTimeouts.delete(timeoutId);\n }\n }, 1000);\n }\n\n /**\n * Acquire update lock with atomic check\n */\n private acquireUpdateLock(): boolean {\n if (this.statusUpdateState?.updateLock) {\n return false; // Already locked\n }\n if (this.statusUpdateState) {\n this.statusUpdateState.updateLock = true;\n }\n return true;\n }\n\n /**\n * Release update lock\n */\n private releaseUpdateLock(): void {\n if (this.statusUpdateState) {\n this.statusUpdateState.updateLock = false;\n }\n }\n\n /**\n * Generate structured status update using configured data components\n */\n private async generateStructuredStatusUpdate(\n newEvents: AgentSessionEvent[],\n elapsedTime: number,\n statusComponents: StatusComponent[],\n summarizerModel?: ModelSettings,\n previousSummaries: string[] = []\n ): Promise<{ summaries: Array<{ type: string; data: Record<string, any> }> }> {\n return tracer.startActiveSpan(\n 'agent_session.generate_structured_update',\n {\n attributes: {\n 'agent_session.id': this.sessionId,\n 'events.count': newEvents.length,\n 'elapsed_time.seconds': Math.round(elapsedTime / 1000),\n 'llm.model': summarizerModel?.model,\n 'status_components.count': statusComponents.length,\n 'previous_summaries.count': previousSummaries.length,\n },\n },\n async (span) => {\n try {\n const userVisibleActivities = this.extractUserVisibleActivities(newEvents);\n\n let conversationContext = '';\n if (this.tenantId && this.projectId) {\n try {\n const conversationHistory = await getFormattedConversationHistory({\n tenantId: this.tenantId,\n projectId: this.projectId,\n conversationId: this.contextId || 'default',\n options: {\n limit: CONVERSATION_HISTORY_DEFAULT_LIMIT,\n maxOutputTokens: CONVERSATION_HISTORY_MAX_OUTPUT_TOKENS_DEFAULT,\n includeInternal: true,\n messageTypes: ['chat', 'tool-result'],\n },\n filters: {},\n });\n conversationContext = conversationHistory.trim()\n ? `\\nUser's Question/Context:\\n${conversationHistory}\\n`\n : '';\n } catch (error) {\n logger.warn(\n { sessionId: this.sessionId, error },\n 'Failed to fetch conversation history for structured status update'\n );\n }\n }\n\n const previousSummaryContext =\n previousSummaries.length > 0\n ? `\\nPrevious updates sent to user:\\n${previousSummaries.map((s, i) => `${i + 1}. ${s}`).join('\\n')}\\n`\n : '';\n\n const selectionSchema = z.object(\n Object.fromEntries([\n [\n 'no_relevant_updates',\n z\n .object({\n no_updates: z.boolean().default(true),\n })\n .optional()\n .describe(\n 'Use when nothing substantially new to report. Should only use on its own.'\n ),\n ],\n ...statusComponents.map((component) => [\n component.type,\n this.getComponentSchema(component)\n .optional()\n .describe(component.description || component.type),\n ]),\n ])\n );\n\n const basePrompt = `Generate status updates for relevant components based on what the user has asked for.${conversationContext}${previousSummaries.length > 0 ? `\\n${previousSummaryContext}` : ''}\n\nActivities:\\n${userVisibleActivities.join('\\n') || 'No New Activities'}\n\nAvailable components: no_relevant_updates, ${statusComponents.map((c) => c.type).join(', ')}\n\nRules:\n- Fill in data for relevant components only\n- Use 'no_relevant_updates' if nothing substantially new to report. DO NOT WRITE LABELS OR USE OTHER COMPONENTS IF YOU USE THIS COMPONENT.\n- Never repeat previous values, make every update EXTREMELY unique. If you cannot do that the update is not worth mentioning.\n- Labels MUST be short 3-7 word phrases with ACTUAL information discovered. NEVER MAKE UP SOMETHING WITHOUT BACKING IT UP WITH ACTUAL INFORMATION.\n- Use sentence case: only capitalize the first word and proper nouns (e.g., \"Admin permissions required\", not \"Admin Permissions Required\"). ALWAYS capitalize the first word of the label.\n- DO NOT use action words like \"Searching\", \"Processing\", \"Analyzing\" - state what was FOUND\n- Include specific details, numbers, requirements, or insights discovered\n- Examples: \"Admin permissions required\", \"Three OAuth steps found\", \"Token expires daily\"\n\nCRITICAL - HIDE ALL INTERNAL SYSTEM OPERATIONS:\n- You are ONE unified AI system presenting results to the user\n- ABSOLUTELY FORBIDDEN WORDS/PHRASES: \"transfer\", \"transferring\", \"delegation\", \"delegating\", \"delegate\", \"agent\", \"routing\", \"route\", \"artifact\", \"saving artifact\", \"stored artifact\", \"artifact saved\", \"continuing\", \"passing to\", \"handing off\", \"switching to\"\n- NEVER reveal internal architecture: No mentions of different agents, components, systems, or modules working together\n- NEVER mention artifact operations: Users don't need to know about data being saved, stored, or organized internally\n- NEVER describe transfers or transitions: Present everything as one seamless operation\n- If you see \"transfer\", \"delegation_sent\", \"delegation_returned\", or \"artifact_saved\" events - IGNORE THEM or translate to user-facing information only\n- Focus ONLY on actual discoveries, findings, and results that matter to the user\n\n- Bad examples: \n * \"Transferring to search agent\"\n * \"Delegating research task\" \n * \"Routing to QA specialist\"\n * \"Artifact saved successfully\"\n * \"Storing results for later\"\n * \"Passing request to tool handler\"\n * \"Continuing with analysis\"\n * \"Handing off to processor\"\n- Good examples:\n * \"Slack bot needs admin privileges\"\n * \"Found 3-step OAuth flow required\" \n * \"Channel limit is 500 per workspace\"\n * Use no_relevant_updates if nothing new to report\n\nCRITICAL ANTI-HALLUCINATION RULES:\n- NEVER MAKE UP SOMETHING WITHOUT BACKING IT UP WITH ACTUAL INFORMATION. EVERY SINGLE UPDATE MUST BE BACKED UP WITH ACTUAL INFORMATION.\n- DO NOT MAKE UP PEOPLE, NAMES, PLACES, THINGS, ORGANIZATIONS, OR INFORMATION. IT IS OBVIOUS WHEN A PERSON/ENTITY DOES NOT EXIST.\n- Only report facts that are EXPLICITLY mentioned in the activities or tool results\n- If you don't have concrete information about something, DO NOT mention it\n- Never invent names like \"John Doe\", \"Alice\", \"Bob\", or any other placeholder names\n- Never create fictional companies, products, or services\n- If a tool returned no results or an error, DO NOT pretend it found something\n- Every detail in your status update must be traceable back to the actual activities provided\n\nREMEMBER YOU CAN ONLY USE 'no_relevant_updates' ALONE! IT CANNOT BE CONCATENATED WITH OTHER STATUS UPDATES!\n\n${this.statusUpdateState?.config.prompt?.trim() || ''}`;\n\n const prompt = basePrompt;\n\n let modelToUse = summarizerModel;\n if (!summarizerModel?.model?.trim()) {\n if (!this.statusUpdateState?.baseModel?.model?.trim()) {\n throw new Error(\n 'Either summarizer or base model is required for status update generation. Please configure models at the project level.'\n );\n }\n modelToUse = this.statusUpdateState.baseModel;\n }\n\n if (!modelToUse) {\n throw new Error('No model configuration available');\n }\n const model = ModelFactory.createModel(modelToUse);\n\n const { object } = await generateObject({\n model,\n prompt,\n schema: selectionSchema,\n experimental_telemetry: {\n isEnabled: true,\n functionId: `structured_update_${this.sessionId}`,\n recordInputs: true,\n recordOutputs: true,\n metadata: {\n operation: 'structured_status_update_generation',\n sessionId: this.sessionId,\n },\n },\n });\n\n const result = object as any;\n logger.info({ result: JSON.stringify(result) }, 'DEBUG: Result');\n\n const summaries = [];\n for (const [componentId, data] of Object.entries(result)) {\n logger.info({ componentId, data: JSON.stringify(data) }, 'DEBUG: Component data');\n // await new Promise((resolve) => setTimeout(resolve, 100000));\n if (componentId === 'no_relevant_updates') {\n continue;\n }\n\n if (data && typeof data === 'object' && Object.keys(data).length > 0) {\n summaries.push({\n type: componentId,\n data: data,\n });\n }\n }\n\n span.setAttributes({\n 'summaries.count': summaries.length,\n 'user_activities.count': userVisibleActivities.length,\n 'result_keys.count': Object.keys(result).length,\n });\n span.setStatus({ code: SpanStatusCode.OK });\n\n return { summaries };\n } catch (error) {\n setSpanWithError(span, error instanceof Error ? error : new Error(String(error)));\n logger.error({ error }, 'Failed to generate structured update, using fallback');\n return { summaries: [] };\n } finally {\n span.end();\n }\n }\n );\n }\n\n /**\n * Build Zod schema from JSON schema configuration or use pre-defined schemas\n */\n private getComponentSchema(component: StatusComponent): z.ZodType<any> {\n if (component.detailsSchema && 'properties' in component.detailsSchema) {\n return this.buildZodSchemaFromJson(component.detailsSchema);\n }\n\n return z.object({\n label: z\n .string()\n .describe(\n 'A short 3-5 word phrase, that is a descriptive label for the update component. This Label must be EXTREMELY unique to represent the UNIQUE update we are providing. The ACTUAL finding or result, not the action. What specific information was discovered? (e.g., \"Slack requires OAuth 2.0 setup\", \"Found 5 integration methods\", \"API rate limit is 100/minute\"). Include the actual detail or insight, not just that you searched or processed. CRITICAL: Only use facts explicitly found in the activities - NEVER invent names, people, organizations, or details that are not present in the actual tool results.'\n ),\n });\n }\n\n /**\n * Build Zod schema from JSON schema with improved type handling\n */\n private buildZodSchemaFromJson(jsonSchema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n }): z.ZodType<any> {\n const properties: Record<string, z.ZodType<any>> = {};\n\n properties.label = z\n .string()\n .describe(\n 'A short 3-5 word phrase, that is a descriptive label for the update component. This Label must be EXTREMELY unique to represent the UNIQUE update we are providing. The SPECIFIC finding, result, or insight discovered (e.g., \"Slack bot needs workspace admin role\", \"Found ingestion requires 3 steps\", \"Channel history limited to 10k messages\"). State the ACTUAL information found, not that you searched. What did you LEARN or DISCOVER? What specific detail is now known? CRITICAL: Only use facts explicitly found in the activities - NEVER invent names, people, organizations, or details that are not present in the actual tool results.'\n );\n\n for (const [key, value] of Object.entries(jsonSchema.properties)) {\n let zodType: z.ZodType<any>;\n\n if (value.enum && Array.isArray(value.enum)) {\n if (value.enum.length === 1) {\n zodType = z.literal(value.enum[0]);\n } else {\n const [first, ...rest] = value.enum;\n zodType = z.enum([first, ...rest] as [string, ...string[]]);\n }\n } else if (value.type === 'string') {\n zodType = z.string();\n if (value.minLength) zodType = (zodType as z.ZodString).min(value.minLength);\n if (value.maxLength) zodType = (zodType as z.ZodString).max(value.maxLength);\n if (value.format === 'email') zodType = (zodType as z.ZodString).email();\n if (value.format === 'url' || value.format === 'uri')\n zodType = (zodType as z.ZodString).url();\n } else if (value.type === 'number' || value.type === 'integer') {\n zodType = value.type === 'integer' ? z.number().int() : z.number();\n if (value.minimum !== undefined) zodType = (zodType as z.ZodNumber).min(value.minimum);\n if (value.maximum !== undefined) zodType = (zodType as z.ZodNumber).max(value.maximum);\n } else if (value.type === 'boolean') {\n zodType = z.boolean();\n } else if (value.type === 'array') {\n if (value.items) {\n if (value.items.enum && Array.isArray(value.items.enum)) {\n const [first, ...rest] = value.items.enum;\n zodType = z.array(z.enum([first, ...rest] as [string, ...string[]]));\n } else if (value.items.type === 'string') {\n zodType = z.array(z.string());\n } else if (value.items.type === 'number') {\n zodType = z.array(z.number());\n } else if (value.items.type === 'boolean') {\n zodType = z.array(z.boolean());\n } else if (value.items.type === 'object') {\n zodType = z.array(z.record(z.string(), z.any()));\n } else {\n zodType = z.array(z.any());\n }\n } else {\n zodType = z.array(z.any());\n }\n if (value.minItems) zodType = (zodType as z.ZodArray<any>).min(value.minItems);\n if (value.maxItems) zodType = (zodType as z.ZodArray<any>).max(value.maxItems);\n } else if (value.type === 'object') {\n zodType = z.record(z.string(), z.any());\n } else {\n zodType = z.any();\n }\n\n if (value.description) {\n zodType = zodType.describe(value.description);\n }\n\n if (!jsonSchema.required?.includes(key) || value.optional === true) {\n zodType = zodType.optional();\n }\n\n properties[key] = zodType;\n }\n\n return z.object(properties);\n }\n\n /**\n * Extract user-visible activities with rich formatting and complete information\n */\n private extractUserVisibleActivities(events: AgentSessionEvent[]): string[] {\n const activities: string[] = [];\n\n for (const event of events) {\n switch (event.eventType) {\n case 'tool_call': {\n activities.push(\n `🔧 **${event.data.toolName}** (called)\\n` +\n ` 📥 Input: ${JSON.stringify(event.data.input)}`\n );\n break;\n }\n\n case 'tool_result': {\n const resultStr = event.data.error\n ? `❌ Error: ${event.data.error}`\n : JSON.stringify(event.data.output);\n\n activities.push(\n `🔧 **${event.data.toolName}** ${event.data.duration ? `(${event.data.duration}ms)` : ''}\\n` +\n ` 📤 Output: ${resultStr}`\n );\n break;\n }\n\n case 'error': {\n activities.push(\n `❌ **Error**: ${event.data.message}\\n` +\n ` 🔍 Code: ${event.data.code || 'unknown'}\\n` +\n ` 📊 Severity: ${event.data.severity || 'error'}`\n );\n break;\n }\n\n case 'transfer':\n case 'delegation_sent':\n case 'delegation_returned':\n case 'artifact_saved':\n break;\n\n case 'agent_reasoning': {\n activities.push(\n `⚙️ **Analyzing request**\\n Details: ${JSON.stringify(event.data.parts, null, 2)}`\n );\n break;\n }\n\n case 'agent_generate': {\n activities.push(\n `⚙️ **Preparing response**\\n Details: ${JSON.stringify(event.data.parts, null, 2)}`\n );\n break;\n }\n\n default: {\n const safeEvent = event as AgentSessionEvent;\n activities.push(\n `📋 **${safeEvent.eventType}**: ${JSON.stringify(safeEvent.data, null, 2)}`\n );\n break;\n }\n }\n }\n\n return activities;\n }\n\n /**\n * Process a single artifact to generate name and description using conversation context\n */\n private async processArtifact(artifactData: ArtifactSavedData): Promise<void> {\n return tracer.startActiveSpan(\n 'agent_session.process_artifact',\n {\n attributes: {\n 'agent_session.id': this.sessionId,\n 'artifact.id': artifactData.artifactId,\n 'artifact.type': artifactData.artifactType || 'unknown',\n 'subAgent.id': artifactData.subAgentId || 'unknown',\n 'subAgent.name': artifactData.subAgentName || 'unknown',\n 'artifact.tool_call_id': artifactData.metadata?.toolCallId || 'unknown',\n 'artifact.data': JSON.stringify(artifactData.data, null, 2),\n 'tenant.id': artifactData.tenantId || 'unknown',\n 'project.id': artifactData.projectId || 'unknown',\n 'context.id': artifactData.contextId || 'unknown',\n has_tenant_id: !!artifactData.tenantId,\n has_project_id: !!artifactData.projectId,\n has_context_id: !!artifactData.contextId,\n has_metadata: !!artifactData.metadata,\n tool_call_id: artifactData.metadata?.toolCallId || 'missing',\n pending_generation: !!artifactData.pendingGeneration,\n // Schema validation attributes\n 'schema_validation.schema_found': artifactData.schemaValidation?.schemaFound || false,\n 'schema_validation.summary.has_expected_fields':\n artifactData.schemaValidation?.summary?.hasExpectedFields || true,\n 'schema_validation.summary.missing_fields_count':\n artifactData.schemaValidation?.summary?.missingFields?.length || 0,\n 'schema_validation.summary.extra_fields_count':\n artifactData.schemaValidation?.summary?.extraFields?.length || 0,\n 'schema_validation.summary.expected_fields': JSON.stringify(\n artifactData.schemaValidation?.summary?.expectedFields || []\n ),\n 'schema_validation.summary.actual_fields': JSON.stringify(\n artifactData.schemaValidation?.summary?.actualFields || []\n ),\n 'schema_validation.summary.missing_fields': JSON.stringify(\n artifactData.schemaValidation?.summary?.missingFields || []\n ),\n 'schema_validation.summary.extra_fields': JSON.stringify(\n artifactData.schemaValidation?.summary?.extraFields || []\n ),\n 'schema_validation.summary.has_required_fields':\n artifactData.schemaValidation?.summary?.hasRequiredFields || true,\n 'schema_validation.summary.missing_required_count':\n artifactData.schemaValidation?.summary?.missingRequired?.length || 0,\n 'schema_validation.summary.missing_required': JSON.stringify(\n artifactData.schemaValidation?.summary?.missingRequired || []\n ),\n 'schema_validation.full.has_expected_fields':\n artifactData.schemaValidation?.full?.hasExpectedFields || true,\n 'schema_validation.full.missing_fields_count':\n artifactData.schemaValidation?.full?.missingFields?.length || 0,\n 'schema_validation.full.extra_fields_count':\n artifactData.schemaValidation?.full?.extraFields?.length || 0,\n 'schema_validation.full.expected_fields': JSON.stringify(\n artifactData.schemaValidation?.full?.expectedFields || []\n ),\n 'schema_validation.full.actual_fields': JSON.stringify(\n artifactData.schemaValidation?.full?.actualFields || []\n ),\n 'schema_validation.full.missing_fields': JSON.stringify(\n artifactData.schemaValidation?.full?.missingFields || []\n ),\n 'schema_validation.full.extra_fields': JSON.stringify(\n artifactData.schemaValidation?.full?.extraFields || []\n ),\n 'schema_validation.full.has_required_fields':\n artifactData.schemaValidation?.full?.hasRequiredFields || true,\n 'schema_validation.full.missing_required_count':\n artifactData.schemaValidation?.full?.missingRequired?.length || 0,\n 'schema_validation.full.missing_required': JSON.stringify(\n artifactData.schemaValidation?.full?.missingRequired || []\n ),\n },\n },\n async (span) => {\n try {\n if (!artifactData.tenantId || !artifactData.projectId || !artifactData.contextId) {\n span.setAttributes({\n 'validation.failed': true,\n missing_tenant_id: !artifactData.tenantId,\n missing_project_id: !artifactData.projectId,\n missing_context_id: !artifactData.contextId,\n });\n throw new Error(\n 'Missing required session info (tenantId, projectId, or contextId) for artifact processing'\n );\n }\n\n span.setAttributes({ 'validation.passed': true });\n\n let mainSaveSucceeded = false;\n\n const conversationHistory = await getFormattedConversationHistory({\n tenantId: artifactData.tenantId,\n projectId: artifactData.projectId,\n conversationId: artifactData.contextId,\n options: {\n limit: 10, // Only need recent context\n includeInternal: false, // Focus on user messages\n messageTypes: ['chat'],\n },\n });\n\n const toolCallEvent = this.events.find(\n (event) =>\n event.eventType === 'tool_result' &&\n event.data &&\n 'toolCallId' in event.data &&\n event.data.toolCallId === artifactData.metadata?.toolCallId\n ) as AgentSessionEvent | undefined;\n\n const toolContext = toolCallEvent\n ? {\n toolName: (toolCallEvent.data as any).toolName,\n args: (toolCallEvent.data as any).args,\n }\n : null;\n\n // Get existing artifact names for this task to provide context\n let existingNames: string[] = [];\n try {\n if (artifactData.tenantId && artifactData.projectId && artifactData.taskId) {\n const existingArtifacts = await getLedgerArtifacts(dbClient)({\n scopes: { tenantId: artifactData.tenantId, projectId: artifactData.projectId },\n taskId: artifactData.taskId,\n });\n existingNames = existingArtifacts.map((a) => a.name).filter(Boolean) as string[];\n }\n } catch (error) {\n logger.warn(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to fetch existing artifact names for context'\n );\n }\n\n const toolName = artifactData.metadata?.toolName || 'unknown';\n const toolCallId = artifactData.metadata?.toolCallId || 'unknown';\n\n const prompt = `Create a unique name and description for this tool result artifact.\n\nCRITICAL: Your name must be different from these existing artifacts: ${existingNames.length > 0 ? existingNames.join(', ') : 'None yet'}\n\nTool Context: ${toolContext ? JSON.stringify(toolContext.args, null, 2) : 'No args'}\nContext: ${conversationHistory?.slice(-200) || 'No context'}\nType: ${artifactData.artifactType || 'data'}\nData: ${JSON.stringify(artifactData.data || artifactData.summaryData || {}, null, 2)}\n\nRequirements:\n- Name: Max 50 chars, be extremely specific to THIS EXACT tool execution\n- Description: Max 150 chars, describe what THIS SPECIFIC tool call returned \n- Focus on the unique aspects of this particular tool execution result\n- Be descriptive about the actual content returned, not just the tool type\n\nBAD Examples (too generic):\n- \"Search Results\"\n- \"Tool Results\" \n- \"${toolName} Results\"\n- \"Data from ${toolName}\"\n- \"Tool Output\"\n- \"Search Data\"\n\nGOOD Examples:\n- \"GitHub API Rate Limits & Auth Methods\"\n- \"React Component Props Documentation\"\n- \"Database Schema for User Tables\"\n- \"Pricing Tiers with Enterprise Features\"\n\nMake the name extremely specific to what this tool call actually returned, not generic.`;\n\n let modelToUse = this.statusUpdateState?.summarizerModel;\n if (!modelToUse?.model?.trim()) {\n if (!this.statusUpdateState?.baseModel?.model?.trim()) {\n if (artifactData.subAgentId && artifactData.tenantId && artifactData.projectId) {\n try {\n const agentData = await getSubAgentById(dbClient)({\n scopes: {\n tenantId: artifactData.tenantId,\n projectId: artifactData.projectId,\n agentId: this.agentId || '',\n },\n subAgentId: artifactData.subAgentId,\n });\n\n if (agentData && 'models' in agentData && agentData.models?.base?.model) {\n modelToUse = agentData.models.base;\n logger.info(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n subAgentId: artifactData.subAgentId,\n model: modelToUse.model,\n },\n 'Using agent model configuration for artifact name generation'\n );\n }\n } catch (error) {\n logger.warn(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n subAgentId: artifactData.subAgentId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to get agent model configuration'\n );\n }\n }\n\n if (!modelToUse?.model?.trim()) {\n logger.warn(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n },\n 'No model configuration available for artifact name generation, will use fallback names'\n );\n modelToUse = undefined;\n }\n } else {\n modelToUse = this.statusUpdateState.baseModel;\n }\n }\n\n let result: { name: string; description: string };\n if (!modelToUse) {\n // Fallback: include toolCallId for guaranteed uniqueness\n const toolCallSuffix =\n artifactData.metadata?.toolCallId?.slice(-8) || Date.now().toString().slice(-8);\n result = {\n name: `${artifactData.artifactType || 'Artifact'} ${toolCallSuffix}`,\n description: `${artifactData.artifactType || 'Data'} from ${artifactData.metadata?.toolName || 'tool'} (${artifactData.metadata?.toolCallId || 'tool results'})`,\n };\n } else {\n const model = ModelFactory.createModel(modelToUse);\n\n const schema = z.object({\n name: z.string().describe('Concise, descriptive name for the artifact'),\n description: z\n .string()\n .describe(\"Brief description of the artifact's relevance to the user's question\"),\n });\n\n const { object } = await tracer.startActiveSpan(\n 'agent_session.generate_artifact_metadata',\n {\n attributes: {\n 'llm.model': this.statusUpdateState?.summarizerModel?.model,\n 'llm.operation': 'generate_object',\n 'artifact.id': artifactData.artifactId,\n 'artifact.type': artifactData.artifactType,\n 'artifact.summary': JSON.stringify(artifactData.summaryData, null, 2),\n 'artifact.full': JSON.stringify(\n artifactData.data || artifactData.summaryData,\n null,\n 2\n ),\n 'prompt.length': prompt.length,\n },\n },\n async (generationSpan) => {\n const maxRetries = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const result = await generateObject({\n model,\n prompt,\n schema,\n experimental_telemetry: {\n isEnabled: true,\n functionId: `artifact_processing_${artifactData.artifactId}`,\n recordInputs: true,\n recordOutputs: true,\n metadata: {\n operation: 'artifact_name_description_generation',\n sessionId: this.sessionId,\n attempt,\n },\n },\n });\n\n generationSpan.setAttributes({\n 'artifact.id': artifactData.artifactId,\n 'artifact.type': artifactData.artifactType,\n 'artifact.name': result.object.name,\n 'artifact.description': result.object.description,\n 'artifact.summary': JSON.stringify(artifactData.summaryData, null, 2),\n 'artifact.full': JSON.stringify(\n artifactData.data || artifactData.summaryData,\n null,\n 2\n ),\n 'generation.name_length': result.object.name.length,\n 'generation.description_length': result.object.description.length,\n 'generation.attempts': attempt,\n });\n\n generationSpan.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n logger.warn(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n attempt,\n maxRetries,\n error: lastError.message,\n },\n `Artifact name/description generation failed, attempt ${attempt}/${maxRetries}`\n );\n\n if (attempt < maxRetries) {\n const backoffMs = Math.min(\n ARTIFACT_GENERATION_BACKOFF_INITIAL_MS * 2 ** (attempt - 1),\n ARTIFACT_GENERATION_BACKOFF_MAX_MS\n );\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n }\n }\n }\n\n setSpanWithError(\n generationSpan,\n lastError instanceof Error ? lastError : new Error(String(lastError))\n );\n throw new Error(\n `Artifact name/description generation failed after ${maxRetries} attempts: ${lastError?.message}`\n );\n }\n );\n result = object;\n }\n\n // Ensure name uniqueness - add toolCallId suffix if needed\n if (existingNames.includes(result.name)) {\n const toolCallSuffix = toolCallId.slice(-8);\n const originalName = result.name;\n result.name =\n result.name.length + toolCallSuffix.length + 1 <= 50\n ? `${result.name} ${toolCallSuffix}`\n : `${result.name.substring(0, 50 - toolCallSuffix.length - 1)} ${toolCallSuffix}`;\n\n logger.info(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n originalName,\n uniqueName: result.name,\n reason: 'Name conflict resolved with toolCallId suffix',\n },\n 'Updated artifact name for uniqueness'\n );\n }\n\n try {\n if (!this.artifactService) {\n throw new Error('ArtifactService is not initialized');\n }\n\n await this.artifactService.saveArtifact({\n artifactId: artifactData.artifactId,\n name: result.name,\n description: result.description,\n type: artifactData.artifactType || 'source',\n data: artifactData.data || {},\n summaryData: artifactData.summaryData,\n metadata: artifactData.metadata || {},\n toolCallId: artifactData.toolCallId,\n });\n\n mainSaveSucceeded = true;\n\n span.setAttributes({\n 'artifact.name': result.name,\n 'artifact.description': result.description,\n 'processing.success': true,\n });\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (saveError) {\n logger.error(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n error: saveError instanceof Error ? saveError.message : 'Unknown error',\n errorName: saveError instanceof Error ? saveError.name : undefined,\n errorCause: saveError instanceof Error ? saveError.cause : undefined,\n errorCode: (saveError as any)?.code || (saveError as any)?.errno || undefined,\n artifactType: artifactData.artifactType,\n dataKeys: artifactData.data ? Object.keys(artifactData.data) : [],\n metadataKeys: artifactData.metadata ? Object.keys(artifactData.metadata) : [],\n },\n 'Main artifact save failed, will attempt fallback'\n );\n }\n\n if (!mainSaveSucceeded) {\n try {\n if (artifactData.tenantId && artifactData.projectId) {\n const artifactService = new ArtifactService({\n tenantId: artifactData.tenantId,\n projectId: artifactData.projectId,\n contextId: artifactData.contextId || 'unknown',\n taskId: artifactData.taskId,\n sessionId: this.sessionId,\n });\n\n await artifactService.saveArtifact({\n artifactId: artifactData.artifactId,\n name: `Artifact ${artifactData.artifactId.substring(0, 8)}`,\n description: `${artifactData.artifactType || 'Data'} from ${artifactData.metadata?.toolName || 'tool results'}`,\n type: artifactData.artifactType || 'source',\n data: artifactData.data || {},\n summaryData: artifactData.summaryData,\n metadata: artifactData.metadata || {},\n toolCallId: artifactData.toolCallId,\n });\n\n logger.info(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n },\n 'Saved artifact with fallback name/description after main save failed'\n );\n }\n } catch (fallbackError) {\n const isDuplicateError =\n fallbackError instanceof Error &&\n (fallbackError.message?.includes('UNIQUE') ||\n fallbackError.message?.includes('duplicate'));\n\n if (isDuplicateError) {\n } else {\n logger.error(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n error: fallbackError instanceof Error ? fallbackError.message : 'Unknown error',\n errorName: fallbackError instanceof Error ? fallbackError.name : undefined,\n errorCause: fallbackError instanceof Error ? fallbackError.cause : undefined,\n errorCode:\n (fallbackError as any)?.code || (fallbackError as any)?.errno || undefined,\n artifactType: artifactData.artifactType,\n dataKeys: artifactData.data ? Object.keys(artifactData.data) : [],\n metadataKeys: artifactData.metadata ? Object.keys(artifactData.metadata) : [],\n },\n 'Failed to save artifact even with fallback'\n );\n }\n }\n }\n } catch (error) {\n setSpanWithError(span, error instanceof Error ? error : new Error(String(error)));\n logger.error(\n {\n sessionId: this.sessionId,\n artifactId: artifactData.artifactId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to process artifact (name/description generation failed)'\n );\n } finally {\n span.end();\n }\n }\n );\n }\n\n /**\n * Cache an artifact in this session for immediate access\n */\n setArtifactCache(key: string, artifact: any): void {\n this.artifactCache.set(key, artifact);\n logger.debug({ sessionId: this.sessionId, key }, 'Artifact cached in session');\n }\n\n /**\n * Get session-scoped ArtifactService instance\n */\n getArtifactService(): any | null {\n return this.artifactService || null;\n }\n\n /**\n * Get session-scoped ArtifactParser instance\n */\n getArtifactParser(): any | null {\n return this.artifactParser || null;\n }\n\n /**\n * Get an artifact from this session cache\n */\n getArtifactCache(key: string): any | null {\n const artifact = this.artifactCache.get(key);\n logger.debug({ sessionId: this.sessionId, key, found: !!artifact }, 'Artifact cache lookup');\n return artifact || null;\n }\n\n /**\n * Update artifact components in the shared ArtifactService\n */\n updateArtifactComponents(artifactComponents: any[]): void {\n if (this.artifactService) {\n this.artifactService.updateArtifactComponents(artifactComponents);\n }\n }\n}\n\n/**\n * Manages AgentSession instances for message-level tracking\n */\nexport class AgentSessionManager {\n private sessions = new Map<string, AgentSession>();\n\n /**\n * Create a new session for a message\n */\n createSession(\n messageId: string,\n agentId?: string,\n tenantId?: string,\n projectId?: string,\n contextId?: string\n ): string {\n const sessionId = messageId; // Use messageId directly as sessionId\n const session = new AgentSession(sessionId, messageId, agentId, tenantId, projectId, contextId);\n this.sessions.set(sessionId, session);\n\n logger.info(\n { sessionId, messageId, agentId, tenantId, projectId, contextId },\n 'AgentSession created'\n );\n return sessionId;\n }\n\n /**\n * Initialize status updates for a session\n */\n initializeStatusUpdates(\n sessionId: string,\n config: StatusUpdateSettings,\n summarizerModel?: ModelSettings,\n baseModel?: ModelSettings\n ): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.initializeStatusUpdates(config, summarizerModel, baseModel);\n } else {\n logger.error(\n {\n sessionId,\n availableSessions: Array.from(this.sessions.keys()),\n },\n 'Session not found for status updates initialization'\n );\n }\n }\n\n /**\n * Enable emit operations for a session to send data operations\n */\n enableEmitOperations(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.enableEmitOperations();\n } else {\n logger.error(\n {\n sessionId,\n availableSessions: Array.from(this.sessions.keys()),\n },\n 'Session not found for emit operations enablement'\n );\n }\n }\n\n /**\n * Get an existing session\n */\n getSession(sessionId: string): AgentSession | null {\n return this.sessions.get(sessionId) || null;\n }\n\n /**\n * Record an event in a session\n * Generic type parameter T ensures eventType and data are correctly paired\n */\n recordEvent<T extends AgentSessionEventType>(\n sessionId: string,\n eventType: T,\n subAgentId: string,\n data: EventDataMap[T]\n ): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n logger.warn({ sessionId }, 'Attempted to record event in non-existent session');\n return;\n }\n\n session.recordEvent(eventType, subAgentId, data);\n }\n\n /**\n * End a session and return the final event data\n */\n async endSession(sessionId: string): Promise<AgentSessionEvent[]> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n logger.warn({ sessionId }, 'Attempted to end non-existent session');\n return [];\n }\n\n const events = session.getEvents();\n const summary = session.getSummary();\n\n logger.info({ sessionId, summary }, 'AgentSession ended');\n\n await session.cleanup();\n\n this.sessions.delete(sessionId);\n\n return events;\n }\n\n /**\n * Set text streaming state for a session\n */\n setTextStreaming(sessionId: string, isStreaming: boolean): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.setTextStreaming(isStreaming);\n }\n }\n\n /**\n * Get summary of all active sessions\n */\n getActiveSessions(): Array<{ sessionId: string; messageId: string; eventCount: number }> {\n return Array.from(this.sessions.values()).map((session) => ({\n sessionId: session.sessionId,\n messageId: session.messageId,\n eventCount: session.getEvents().length,\n }));\n }\n\n /**\n * Cache an artifact in the specified session\n */\n async setArtifactCache(sessionId: string, key: string, artifact: any): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.setArtifactCache(key, artifact);\n }\n }\n\n /**\n * Get an artifact from the specified session cache\n */\n async getArtifactCache(sessionId: string, key: string): Promise<any | null> {\n const session = this.sessions.get(sessionId);\n return session ? session.getArtifactCache(key) : null;\n }\n\n /**\n * Get session-scoped ArtifactService instance\n */\n getArtifactService(sessionId: string): any | null {\n const session = this.sessions.get(sessionId);\n return session ? session.getArtifactService() : null;\n }\n\n /**\n * Get session-scoped ArtifactParser instance\n */\n getArtifactParser(sessionId: string): any | null {\n const session = this.sessions.get(sessionId);\n return session ? session.getArtifactParser() : null;\n }\n\n /**\n * Update artifact components for a session\n */\n updateArtifactComponents(sessionId: string, artifactComponents: any[]): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.updateArtifactComponents(artifactComponents);\n }\n }\n}\n\nexport const agentSessionManager = new AgentSessionManager();\n","import { getAgentById, getProject, type Models, type SubAgentSelect } from '@inkeep/agents-core';\nimport dbClient from '../data/db/dbClient';\n\nasync function resolveModelConfig(agentId: string, subAgent: SubAgentSelect): Promise<Models> {\n // If base model is defined on the agent\n if (subAgent.models?.base?.model) {\n return {\n base: subAgent.models.base,\n structuredOutput: subAgent.models.structuredOutput || subAgent.models.base,\n summarizer: subAgent.models.summarizer || subAgent.models.base,\n };\n }\n\n // If base model is not defined on the agent (or models is undefined/null)\n // Check agent model config first\n const agent = await getAgentById(dbClient)({\n scopes: { tenantId: subAgent.tenantId, projectId: subAgent.projectId, agentId },\n });\n\n if (agent?.models?.base?.model) {\n return {\n base: agent.models.base,\n structuredOutput:\n subAgent.models?.structuredOutput || agent.models.structuredOutput || agent.models.base,\n summarizer: subAgent.models?.summarizer || agent.models.summarizer || agent.models.base,\n };\n }\n\n // If agent model config not defined, check project level config\n const project = await getProject(dbClient)({\n scopes: { tenantId: subAgent.tenantId, projectId: subAgent.projectId },\n });\n\n if (project?.models?.base?.model) {\n return {\n base: project.models.base,\n structuredOutput:\n subAgent.models?.structuredOutput || project.models.structuredOutput || project.models.base,\n summarizer: subAgent.models?.summarizer || project.models.summarizer || project.models.base,\n };\n }\n\n // If project level config or base model not defined, throw error\n throw new Error(\n 'Base model configuration is required. Please configure models at the project level.'\n );\n}\n\nexport { resolveModelConfig };\n","import {\n STREAM_PARSER_MAX_COLLECTED_PARTS,\n STREAM_PARSER_MAX_SNAPSHOT_SIZE,\n STREAM_PARSER_MAX_STREAMED_SIZE,\n} from '../constants/execution-limits';\nimport { getLogger } from '../logger';\nimport { ArtifactParser, type StreamPart } from '../services/ArtifactParser';\nimport type { StreamHelper } from '../utils/stream-helpers';\nimport { agentSessionManager } from './AgentSession';\n\nconst logger = getLogger('IncrementalStreamParser');\n\ninterface ParseResult {\n completeParts: StreamPart[];\n remainingBuffer: string;\n}\n\n/**\n * Incremental parser that processes streaming text and formats artifacts/objects as they become complete\n * Uses the unified ArtifactParser to eliminate redundancy\n */\nexport class IncrementalStreamParser {\n private buffer = '';\n private pendingTextBuffer = '';\n private streamHelper: StreamHelper;\n private artifactParser: ArtifactParser;\n private hasStartedRole = false;\n private collectedParts: StreamPart[] = [];\n private contextId: string;\n private lastChunkWasToolResult = false;\n private componentAccumulator: any = {};\n private lastStreamedComponents = new Map<string, any>();\n private componentSnapshots = new Map<string, string>();\n private artifactMap?: Map<string, any>;\n private subAgentId?: string;\n private allStreamedContent: StreamPart[] = [];\n\n private static readonly MAX_SNAPSHOT_SIZE = STREAM_PARSER_MAX_SNAPSHOT_SIZE; // Max number of snapshots to keep\n private static readonly MAX_STREAMED_SIZE = STREAM_PARSER_MAX_STREAMED_SIZE; // Max number of streamed component IDs to track\n private static readonly MAX_COLLECTED_PARTS = STREAM_PARSER_MAX_COLLECTED_PARTS; // Max number of collected parts to prevent unbounded growth\n\n constructor(\n streamHelper: StreamHelper,\n tenantId: string,\n contextId: string,\n artifactParserOptions?: {\n sessionId?: string;\n taskId?: string;\n projectId?: string;\n artifactComponents?: any[];\n streamRequestId?: string;\n subAgentId?: string;\n }\n ) {\n this.streamHelper = streamHelper;\n this.contextId = contextId;\n this.subAgentId = artifactParserOptions?.subAgentId;\n\n if (artifactParserOptions?.streamRequestId) {\n const sessionParser = agentSessionManager.getArtifactParser(\n artifactParserOptions.streamRequestId\n );\n\n if (sessionParser) {\n this.artifactParser = sessionParser;\n return;\n }\n }\n\n let sharedArtifactService = null;\n if (\n artifactParserOptions?.streamRequestId &&\n typeof agentSessionManager.getArtifactService === 'function'\n ) {\n try {\n sharedArtifactService = agentSessionManager.getArtifactService(\n artifactParserOptions.streamRequestId\n );\n } catch (_error) {}\n }\n\n this.artifactParser = new ArtifactParser(tenantId, {\n ...artifactParserOptions,\n contextId,\n artifactService: sharedArtifactService, // Use shared ArtifactService if available\n });\n }\n\n /**\n * Initialize artifact map for artifact:ref lookups during streaming\n * Should be called before processing chunks\n */\n async initializeArtifactMap(): Promise<void> {\n try {\n this.artifactMap = await this.artifactParser.getContextArtifacts(this.contextId);\n logger.debug(\n {\n contextId: this.contextId,\n artifactMapSize: this.artifactMap.size,\n },\n 'Initialized artifact map for streaming'\n );\n } catch (error) {\n logger.warn({ error, contextId: this.contextId }, 'Failed to initialize artifact map');\n this.artifactMap = new Map();\n }\n }\n\n /**\n * Mark that a tool result just completed, so next text should have spacing\n */\n markToolResult(): void {\n this.lastChunkWasToolResult = true;\n }\n\n /**\n * Process a new text chunk for text streaming (handles artifact markers)\n */\n async processTextChunk(chunk: string): Promise<void> {\n if (this.lastChunkWasToolResult && this.buffer === '' && chunk) {\n chunk = `\\n\\n${chunk}`;\n this.lastChunkWasToolResult = false;\n }\n\n this.buffer += chunk;\n\n const parseResult = await this.parseTextBuffer();\n\n for (const part of parseResult.completeParts) {\n await this.streamPart(part);\n }\n\n this.buffer = parseResult.remainingBuffer;\n }\n\n /**\n * Process object deltas directly from Vercel AI SDK's fullStream\n * Accumulates components and streams them when they're stable (unchanged between deltas)\n */\n async processObjectDelta(delta: any): Promise<void> {\n if (!delta || typeof delta !== 'object') {\n return;\n }\n\n this.componentAccumulator = this.deepMerge(this.componentAccumulator, delta);\n\n if (\n this.componentAccumulator.dataComponents &&\n Array.isArray(this.componentAccumulator.dataComponents)\n ) {\n const components = this.componentAccumulator.dataComponents;\n const currentComponentIds = new Set(\n components.filter((c: any) => c?.id).map((c: any) => c.id)\n );\n\n for (const [componentId, snapshot] of this.componentSnapshots.entries()) {\n if (\n !currentComponentIds.has(componentId) &&\n !this.lastStreamedComponents.has(componentId)\n ) {\n try {\n const component = JSON.parse(snapshot);\n if (this.isComponentComplete(component)) {\n await this.streamComponent(component);\n }\n } catch (_e) {}\n }\n }\n\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n\n if (!component?.id) continue;\n\n const componentKey = component.id;\n const hasBeenStreamed = this.lastStreamedComponents.has(componentKey);\n\n if (hasBeenStreamed) continue;\n\n const currentSnapshot = JSON.stringify(component);\n const previousSnapshot = this.componentSnapshots.get(componentKey);\n\n this.componentSnapshots.set(componentKey, currentSnapshot);\n\n if (this.componentSnapshots.size > IncrementalStreamParser.MAX_SNAPSHOT_SIZE) {\n const firstKey = this.componentSnapshots.keys().next().value;\n if (firstKey) {\n this.componentSnapshots.delete(firstKey);\n }\n }\n\n if (component.name === 'Text' && component.props?.text) {\n const previousTextContent = previousSnapshot\n ? JSON.parse(previousSnapshot).props?.text || ''\n : '';\n const currentTextContent = component.props.text || '';\n\n if (currentTextContent.length > previousTextContent.length) {\n const newText = currentTextContent.slice(previousTextContent.length);\n\n if (!this.hasStartedRole) {\n await this.streamHelper.writeRole('assistant');\n this.hasStartedRole = true;\n }\n\n await this.streamHelper.streamText(newText, 50);\n\n const textPart: StreamPart = {\n kind: 'text',\n text: newText,\n };\n this.collectedParts.push(textPart);\n\n this.allStreamedContent.push(textPart);\n }\n\n continue;\n }\n\n if (this.isComponentComplete(component)) {\n const currentPropsSnapshot = JSON.stringify(component.props);\n const previousPropsSnapshot = previousSnapshot\n ? JSON.stringify(JSON.parse(previousSnapshot).props)\n : null;\n\n if (previousPropsSnapshot === currentPropsSnapshot) {\n await this.streamComponent(component);\n }\n }\n }\n }\n }\n\n /**\n * Stream a component and mark it as streamed\n * Note: Text components are handled separately with incremental streaming\n */\n private async streamComponent(component: any): Promise<void> {\n const parts = await this.artifactParser.parseObject(\n {\n dataComponents: [component],\n },\n this.artifactMap,\n this.subAgentId\n );\n\n if (!Array.isArray(parts)) {\n console.warn('parseObject returned non-array:', parts);\n return;\n }\n\n for (const part of parts) {\n await this.streamPart(part);\n }\n\n this.lastStreamedComponents.set(component.id, true);\n\n if (this.lastStreamedComponents.size > IncrementalStreamParser.MAX_STREAMED_SIZE) {\n const firstKey = this.lastStreamedComponents.keys().next().value;\n if (firstKey) {\n this.lastStreamedComponents.delete(firstKey);\n }\n }\n\n this.componentSnapshots.delete(component.id);\n }\n\n /**\n * Check if a component has the basic structure required for streaming\n * Requires id, name, and props object with content\n */\n private isComponentComplete(component: any): boolean {\n if (!component || !component.id || !component.name) {\n return false;\n }\n\n if (!component.props || typeof component.props !== 'object') {\n return false;\n }\n\n const isArtifact =\n component.name === 'Artifact' ||\n (component.props.artifact_id && (component.props.tool_call_id || component.props.task_id));\n\n if (isArtifact) {\n return Boolean(\n component.props.artifact_id && (component.props.tool_call_id || component.props.task_id)\n );\n }\n\n return true;\n }\n\n /**\n * Deep merge helper for object deltas\n */\n private deepMerge(target: any, source: any): any {\n if (!source) return target;\n if (!target) return source;\n\n const result = { ...target };\n\n for (const key in source) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n result[key] = this.deepMerge(target[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n }\n\n /**\n * Legacy method for backward compatibility - defaults to text processing\n */\n async processChunk(chunk: string): Promise<void> {\n await this.processTextChunk(chunk);\n }\n\n /**\n * Process any remaining buffer content at the end of stream\n */\n async finalize(): Promise<void> {\n if (\n this.componentAccumulator.dataComponents &&\n Array.isArray(this.componentAccumulator.dataComponents)\n ) {\n const components = this.componentAccumulator.dataComponents;\n\n for (let i = 0; i < components.length; i++) {\n const component = components[i];\n\n if (!component?.id) continue;\n\n const componentKey = component.id;\n const hasBeenStreamed = this.lastStreamedComponents.has(componentKey);\n\n // Stream any complete components that haven't been streamed yet\n if (!hasBeenStreamed && this.isComponentComplete(component) && component.name !== 'Text') {\n const parts = await this.artifactParser.parseObject(\n {\n dataComponents: [component],\n },\n this.artifactMap,\n this.subAgentId\n );\n\n for (const part of parts) {\n await this.streamPart(part);\n }\n\n this.lastStreamedComponents.set(componentKey, true);\n\n if (this.lastStreamedComponents.size > IncrementalStreamParser.MAX_STREAMED_SIZE) {\n const firstKey = this.lastStreamedComponents.keys().next().value;\n if (firstKey) {\n this.lastStreamedComponents.delete(firstKey);\n }\n }\n\n this.componentSnapshots.delete(componentKey);\n }\n }\n }\n\n if (this.buffer) {\n const part: StreamPart = {\n kind: 'text',\n text: this.buffer,\n };\n await this.streamPart(part);\n }\n\n if (this.pendingTextBuffer) {\n const cleanedText = this.pendingTextBuffer\n .replace(/<\\/?artifact:ref(?:\\s[^>]*)?>\\/?>/g, '') // Remove artifact:ref tags safely\n .replace(/<\\/?artifact(?:\\s[^>]*)?>\\/?>/g, '') // Remove artifact tags safely\n .replace(/<\\/artifact:ref>/g, '') // Remove closing artifact:ref tags\n .replace(/<\\/(?:\\w+:)?artifact>/g, ''); // Remove closing artifact tags safely\n\n if (cleanedText) {\n const textPart: StreamPart = {\n kind: 'text',\n text: cleanedText,\n };\n this.collectedParts.push(textPart);\n\n this.allStreamedContent.push(textPart);\n\n await this.streamHelper.streamText(cleanedText, 50);\n }\n this.pendingTextBuffer = '';\n }\n\n this.componentSnapshots.clear();\n this.lastStreamedComponents.clear();\n this.componentAccumulator = {};\n }\n\n /**\n * Get all collected parts for building the final response\n */\n getCollectedParts(): StreamPart[] {\n return [...this.collectedParts];\n }\n\n /**\n * Get all streamed content that was actually sent to the user\n */\n getAllStreamedContent(): StreamPart[] {\n return [...this.allStreamedContent];\n }\n\n /**\n * Parse buffer for complete artifacts and text parts (for text streaming)\n */\n private async parseTextBuffer(): Promise<ParseResult> {\n const completeParts: StreamPart[] = [];\n const workingBuffer = this.buffer;\n\n if (this.artifactParser.hasIncompleteArtifact(workingBuffer)) {\n const safeEnd = this.artifactParser.findSafeTextBoundary(workingBuffer);\n\n if (safeEnd > 0) {\n const safeText = workingBuffer.slice(0, safeEnd);\n const parts = await this.artifactParser.parseText(\n safeText,\n this.artifactMap,\n this.subAgentId\n );\n completeParts.push(...parts);\n\n return {\n completeParts,\n remainingBuffer: workingBuffer.slice(safeEnd),\n };\n }\n\n return {\n completeParts: [],\n remainingBuffer: workingBuffer,\n };\n }\n\n // No incomplete artifacts, parse the entire buffer\n const parts = await this.artifactParser.parseText(\n workingBuffer,\n this.artifactMap,\n this.subAgentId\n );\n\n // Check last part - if it's text, it might be incomplete\n if (parts.length > 0 && parts[parts.length - 1].kind === 'text') {\n const lastPart = parts[parts.length - 1];\n const lastText = lastPart.text || '';\n\n // Keep some text in buffer if it might be start of artifact\n if (this.mightBeArtifactStart(lastText)) {\n parts.pop(); // Remove last text part\n return {\n completeParts: parts,\n remainingBuffer: lastText,\n };\n }\n }\n\n return {\n completeParts: parts,\n remainingBuffer: '',\n };\n }\n\n /**\n * Check if text might be the start of an artifact marker\n */\n private mightBeArtifactStart(text: string): boolean {\n const lastChars = text.slice(-20); // Check last 20 chars\n return lastChars.includes('<') && !lastChars.includes('/>');\n }\n\n /**\n * Stream a formatted part (text or data) with smart buffering\n */\n private async streamPart(part: StreamPart): Promise<void> {\n // Collect for final response with size limit enforcement\n this.collectedParts.push({ ...part });\n\n this.allStreamedContent.push({ ...part });\n\n // Enforce size limit to prevent memory leaks\n if (this.collectedParts.length > IncrementalStreamParser.MAX_COLLECTED_PARTS) {\n // Remove oldest parts (keep last N parts)\n const excess = this.collectedParts.length - IncrementalStreamParser.MAX_COLLECTED_PARTS;\n this.collectedParts.splice(0, excess);\n }\n\n // Also enforce size limit for streamed content\n if (this.allStreamedContent.length > IncrementalStreamParser.MAX_COLLECTED_PARTS) {\n const excess = this.allStreamedContent.length - IncrementalStreamParser.MAX_COLLECTED_PARTS;\n this.allStreamedContent.splice(0, excess);\n }\n\n if (!this.hasStartedRole) {\n await this.streamHelper.writeRole('assistant');\n this.hasStartedRole = true;\n }\n\n if (part.kind === 'text' && part.text) {\n // Add to pending buffer\n this.pendingTextBuffer += part.text;\n\n // Flush if safe to do so\n if (!this.artifactParser.hasIncompleteArtifact(this.pendingTextBuffer)) {\n const cleanedText = this.pendingTextBuffer\n .replace(/<\\/?artifact:ref(?:\\s[^>]*)?>\\/?>/g, '') // Remove artifact:ref tags safely\n .replace(/<\\/?artifact(?:\\s[^>]*)?>\\/?>/g, '') // Remove artifact tags safely\n .replace(/<\\/artifact:ref>/g, '') // Remove closing artifact:ref tags\n .replace(/<\\/(?:\\w+:)?artifact>/g, ''); // Remove closing artifact tags safely\n\n if (cleanedText) {\n await this.streamHelper.streamText(cleanedText, 50);\n }\n this.pendingTextBuffer = '';\n }\n } else if (part.kind === 'data' && part.data) {\n // Flush any pending text before streaming data\n if (this.pendingTextBuffer) {\n const cleanedText = this.pendingTextBuffer\n .replace(/<\\/?artifact:ref(?:\\s[^>]*)?>\\/?>/g, '') // Remove artifact:ref tags safely\n .replace(/<\\/?artifact(?:\\s[^>]*)?>\\/?>/g, '') // Remove artifact tags safely\n .replace(/<\\/artifact:ref>/g, '') // Remove closing artifact:ref tags\n .replace(/<\\/(?:\\w+:)?artifact>/g, ''); // Remove closing artifact tags safely\n\n if (cleanedText) {\n await this.streamHelper.streamText(cleanedText, 50);\n }\n this.pendingTextBuffer = '';\n }\n\n // Determine if this is an artifact or regular data component\n const isArtifact = part.data.artifactId && part.data.toolCallId;\n\n if (isArtifact) {\n await this.streamHelper.writeData('data-artifact', part.data);\n } else {\n await this.streamHelper.writeData('data-component', part.data);\n }\n }\n }\n}\n","import type { ModelSettings } from '@inkeep/agents-core';\nimport { ModelFactory } from '@inkeep/agents-core';\nimport { generateObject, tool } from 'ai';\nimport { z } from 'zod';\nimport { getLogger } from '../logger';\n\nconst logger = getLogger('distill-conversation-tool');\n\n/**\n * Conversation Summary Schema - structured object for maintaining conversation context\n */\nexport const ConversationSummarySchema = z.object({\n type: z.literal('conversation_summary_v1'),\n session_id: z.string().nullable().optional(),\n high_level: z.string().describe('1-3 sentences capturing what was discovered and learned'),\n user_intent: z.string().describe('Current main goal or what the user wants to accomplish'),\n decisions: z\n .array(z.string())\n .describe('Concrete decisions made about approach or implementation (≤5 items)'),\n open_questions: z\n .array(z.string())\n .describe('Unresolved questions about the subject matter (≤5 items)'),\n next_steps: z.object({\n for_agent: z\n .array(z.string())\n .describe(\n \"Content-focused actions: what to discover, analyze, or present. Don't get trapped in an infinite loop of tool calls. You have already done a lot of work that is why you are being compressed. Don't encourage too much more work.\"\n ),\n for_user: z.array(z.string()).describe('Actions for user based on discovered content'),\n }),\n related_artifacts: z\n .array(\n z.object({\n id: z.string().describe('Artifact ID'),\n name: z.string().describe('Human-readable name describing the content'),\n tool_name: z\n .string()\n .describe('Tool that generated this artifact (e.g. search-inkeep-docs)'),\n tool_call_id: z.string().describe('Specific tool call ID for precise referencing'),\n content_type: z\n .string()\n .describe('Type of content (e.g. search_results, api_response, documentation)'),\n key_findings: z\n .array(z.string())\n .describe('2-3 most important findings from this specific artifact'),\n })\n )\n .optional()\n .describe('Artifacts containing detailed findings with citation info'),\n});\n\nexport type ConversationSummary = z.infer<typeof ConversationSummarySchema>;\n\n/**\n * Core conversation distillation - takes messages and creates structured summary\n */\nexport async function distillConversation(params: {\n messages: any[];\n conversationId: string;\n currentSummary?: ConversationSummary | null;\n summarizerModel?: ModelSettings;\n toolCallToArtifactMap?: Record<string, string>;\n}): Promise<ConversationSummary> {\n const { messages, conversationId, currentSummary, summarizerModel, toolCallToArtifactMap } =\n params;\n\n try {\n // Choose model (prefer summarizer, fallback to base)\n const modelToUse = summarizerModel;\n if (!modelToUse?.model?.trim()) {\n throw new Error('Summarizer model is required');\n }\n\n const model = ModelFactory.createModel(modelToUse);\n\n // Build context sections\n const existingSummaryContext = currentSummary\n ? `**Current summary:**\\n\\n\\`\\`\\`json\\n${JSON.stringify(currentSummary, null, 2)}\\n\\`\\`\\``\n : '**Current summary:** None (first distillation)';\n\n // Format messages for prompt with proper content handling including tool calls/results\n const formattedMessages = messages\n .map((msg: any) => {\n const parts: string[] = [];\n\n if (typeof msg.content === 'string') {\n parts.push(msg.content);\n } else if (Array.isArray(msg.content)) {\n // Handle all content types: text, tool-call, tool-result\n for (const block of msg.content) {\n if (block.type === 'text') {\n parts.push(block.text);\n } else if (block.type === 'tool-call') {\n parts.push(\n `[TOOL CALL] ${block.toolName}(${JSON.stringify(block.input)}) [ID: ${block.toolCallId}]`\n );\n } else if (block.type === 'tool-result') {\n const artifactId = toolCallToArtifactMap?.[block.toolCallId];\n const artifactInfo = artifactId ? `\\n[ARTIFACT CREATED: ${artifactId}]` : '';\n parts.push(\n `[TOOL RESULT] ${block.toolName} [ID: ${block.toolCallId}]${artifactInfo}\\nResult: ${JSON.stringify(block.result)}`\n );\n }\n }\n } else if (msg.content?.text) {\n parts.push(msg.content.text);\n }\n\n return parts.length > 0 ? `${msg.role || 'system'}: ${parts.join('\\n')}` : '';\n })\n .filter((line) => line.trim().length > 0) // Remove empty lines\n .join('\\n\\n');\n\n logger.debug(\n {\n conversationId,\n messageCount: messages.length,\n formattedLength: formattedMessages.length,\n sampleMessages: messages\n .slice(0, 2)\n .map((m) => ({ role: m.role, contentType: typeof m.content, hasContent: !!m.content })),\n },\n 'Formatting messages for distillation'\n );\n\n const prompt = `You are a conversation summarization assistant. Your job is to create or update a compact, structured summary that captures VALUABLE CONTENT and FINDINGS, not just operational details.\n\n${existingSummaryContext}\n\n**Messages to summarize:**\n\n\\`\\`\\`text\n${formattedMessages}\n\\`\\`\\`\n\nCreate/update a summary using this exact JSON schema:\n\n\\`\\`\\`json\n{\n \"type\": \"conversation_summary_v1\",\n \"session_id\": \"<conversationId>\",\n \"high_level\": \"<1–3 sentences capturing what was discovered and learned>\",\n \"user_intent\": \"<current main goal>\",\n \"decisions\": [\"<concrete decisions made>\"],\n \"open_questions\": [\"<unresolved issues>\"],\n \"next_steps\": {\n \"for_agent\": [\"<what agent should do>\"],\n \"for_user\": [\"<what user should do>\"]\n },\n \"related_artifacts\": [\n {\n \"id\": \"<artifact_id>\",\n \"name\": \"<descriptive name>\",\n \"tool_name\": \"<tool_name>\",\n \"tool_call_id\": \"<tool_call_id>\",\n \"content_type\": \"<search_results|api_response|documentation>\",\n \"key_findings\": [\"<important finding 1>\", \"<important finding 2>\"]\n }\n ]\n}\n\\`\\`\\`\n\n**CRITICAL RULES - FOCUS ON CONTENT NOT OPERATIONS:**\n🎯 **EXTRACT VALUABLE FINDINGS**: Capture the actual information discovered, data retrieved, insights gained\n🎯 **IGNORE OPERATIONAL DETAILS**: Don't mention \"tool was used\", \"artifact was created\", \"messages were compressed\"\n🎯 **PRESERVE SUBSTANCE**: Include specific facts, features, capabilities, configurations, results found\n🎯 **BUILD KNOWLEDGE**: When updating existing summary, ADD new discoveries to existing knowledge\n🎯 **BE CONCRETE**: Use specific details from tool results, not generic descriptions\n🎯 **BE CONCISE**: Keep ALL fields brief - you are compressing to save context, not writing a report\n🎯 **LIMIT NEXT STEPS**: Agent has already done substantial work - suggest minimal follow-up actions only\n\n**Examples:**\n❌ BAD: \"Assistant used search tool and created artifacts\"\n✅ GOOD: \"Inkeep supports streaming structured objects, OpenAI-compatible APIs, analytics logging, and Zendesk integration\"\n\n❌ BAD: \"Tool calls were made to gather information\" \n✅ GOOD: \"Platform includes 10 feature categories: chat widgets, knowledge base, analytics, integrations, theming options\"\n\n**Focus on WHAT WAS LEARNED, not HOW IT WAS LEARNED**\n\nReturn **only** valid JSON.`;\n\n const { object: summary } = await generateObject({\n model,\n prompt,\n schema: ConversationSummarySchema,\n });\n\n // Set session ID\n summary.session_id = conversationId;\n\n logger.info(\n {\n conversationId,\n messageCount: messages.length,\n artifactsCount: summary.related_artifacts?.length || 0,\n decisionsCount: summary.decisions.length,\n },\n 'Successfully distilled conversation'\n );\n\n return summary;\n } catch (error) {\n logger.error(\n {\n conversationId,\n messageCount: messages.length,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to distill conversation'\n );\n\n // Return minimal fallback summary\n return {\n type: 'conversation_summary_v1',\n session_id: conversationId,\n high_level: 'Ongoing conversation session',\n user_intent: 'Continue working on current task',\n related_artifacts: [],\n decisions: [],\n open_questions: ['Review recent work and determine next steps'],\n next_steps: {\n for_agent: ['Continue with current task'],\n for_user: ['Provide additional guidance if needed'],\n },\n };\n }\n}\n","import type { ModelSettings } from '@inkeep/agents-core';\nimport { randomUUID } from 'crypto';\nimport { getLogger } from '../logger';\nimport { distillConversation } from '../tools/distill-conversation-tool';\nimport { agentSessionManager } from './AgentSession';\n\nconst logger = getLogger('MidGenerationCompressor');\n\nexport interface CompressionConfig {\n hardLimit: number;\n safetyBuffer: number;\n enabled?: boolean;\n}\n\n/**\n * Get compression config from environment variables\n */\nexport function getCompressionConfigFromEnv(): CompressionConfig {\n return {\n hardLimit: parseInt(process.env.AGENTS_COMPRESSION_HARD_LIMIT || '120000'),\n safetyBuffer: parseInt(process.env.AGENTS_COMPRESSION_SAFETY_BUFFER || '20000'),\n enabled: process.env.AGENTS_COMPRESSION_ENABLED !== 'false', // Default enabled\n };\n}\n\n/**\n * Simple mid-generation compressor\n * Compresses context when generate() steps get too large\n */\nexport class MidGenerationCompressor {\n private shouldCompress = false;\n private processedToolCalls = new Set<string>(); // Track already compressed tool call IDs\n private lastProcessedMessageIndex = 0; // Track where we left off in message processing\n private cumulativeSummary: any = null; // Track cumulative summary across compression cycles\n\n constructor(\n private sessionId: string,\n private conversationId: string,\n private tenantId: string,\n private projectId: string,\n private config: CompressionConfig,\n private summarizerModel?: ModelSettings,\n private baseModel?: ModelSettings\n ) {}\n\n /**\n * Get the hard limit for compression decisions\n */\n getHardLimit(): number {\n return this.config.hardLimit;\n }\n\n /**\n * Estimate tokens (4 chars = 1 token)\n */\n private estimateTokens(content: any): number {\n const text = typeof content === 'string' ? content : JSON.stringify(content);\n return Math.ceil(text.length / 4);\n }\n\n /**\n * Calculate total context size\n */\n private calculateContextSize(messages: any[]): number {\n const messageTokens = messages.reduce((total, msg) => {\n let msgTokens = 0;\n\n // Handle Vercel AI SDK message format\n if (Array.isArray(msg.content)) {\n // Content is array of content blocks\n for (const block of msg.content) {\n if (block.type === 'text') {\n msgTokens += this.estimateTokens(block.text || '');\n } else if (block.type === 'tool-call') {\n msgTokens += this.estimateTokens(\n JSON.stringify({\n toolCallId: block.toolCallId,\n toolName: block.toolName,\n input: block.input,\n })\n );\n } else if (block.type === 'tool-result') {\n msgTokens += this.estimateTokens(\n JSON.stringify({\n toolCallId: block.toolCallId,\n toolName: block.toolName,\n output: block.output,\n })\n );\n }\n }\n } else if (typeof msg.content === 'string') {\n // Content is a simple string\n msgTokens += this.estimateTokens(msg.content);\n } else if (msg.content) {\n // Fallback - try to stringify the content\n msgTokens += this.estimateTokens(JSON.stringify(msg.content));\n }\n\n return total + msgTokens;\n }, 0);\n\n return messageTokens;\n }\n\n /**\n * Manual compression request from LLM tool\n */\n requestManualCompression(reason?: string): void {\n this.shouldCompress = true;\n logger.info(\n {\n sessionId: this.sessionId,\n reason: reason || 'Manual request from LLM',\n },\n 'Manual compression requested'\n );\n }\n\n /**\n * Check if compression is needed (either automatic or manual)\n */\n isCompressionNeeded(messages: any[]): boolean {\n // Check manual request first - no calculation needed\n if (this.shouldCompress) return true;\n\n // Only calculate context size if no manual request\n const contextSize = this.calculateContextSize(messages);\n const remaining = this.config.hardLimit - contextSize;\n return remaining <= this.config.safetyBuffer;\n }\n\n /**\n * Perform compression: save all tool results as artifacts and create summary\n */\n async compress(messages: any[]): Promise<{\n artifactIds: string[];\n summary: any;\n }> {\n const contextSizeBefore = this.calculateContextSize(messages);\n\n logger.info(\n {\n sessionId: this.sessionId,\n messageCount: messages.length,\n contextSize: contextSizeBefore,\n },\n 'COMPRESSION: Starting compression'\n );\n\n // Count tool results to be saved\n const toolResultCount = messages.reduce((count, msg) => {\n if (Array.isArray(msg.content)) {\n return count + msg.content.filter((block: any) => block.type === 'tool-result').length;\n }\n return count;\n }, 0);\n\n logger.debug({ toolResultCount }, 'Tool results found for compression');\n\n // 1. Save tool results as artifacts\n const toolCallToArtifactMap = await this.saveToolResultsAsArtifacts(messages);\n\n // 3. Create conversation summary\n const summary = await this.createConversationSummary(messages, toolCallToArtifactMap);\n\n // Calculate context size after compression (just the summary)\n const contextSizeAfter = this.estimateTokens(JSON.stringify(summary));\n\n // Record compression event\n const session = agentSessionManager.getSession(this.sessionId);\n if (session) {\n // Determine if this was a manual request (shouldCompress was set) or automatic (context limit)\n const wasManualRequest = this.shouldCompress;\n\n session.recordEvent('compression', this.sessionId, {\n reason: wasManualRequest ? 'manual' : 'automatic',\n messageCount: messages.length,\n artifactCount: Object.keys(toolCallToArtifactMap).length,\n contextSizeBefore,\n contextSizeAfter,\n compressionType: 'mid_generation',\n });\n }\n\n // Reset state\n this.shouldCompress = false;\n\n logger.info(\n {\n sessionId: this.sessionId,\n artifactsCreated: Object.keys(toolCallToArtifactMap).length,\n messageCount: messages.length,\n contextSizeBefore,\n contextSizeAfter,\n artifactIds: Object.values(toolCallToArtifactMap),\n },\n 'COMPRESSION: Compression completed successfully'\n );\n\n return { artifactIds: Object.values(toolCallToArtifactMap), summary };\n }\n\n /**\n * 1. Save NEW tool results as artifacts (only process messages since last compression)\n */\n private async saveToolResultsAsArtifacts(messages: any[]): Promise<Record<string, string>> {\n const session = agentSessionManager.getSession(this.sessionId);\n if (!session) {\n throw new Error(`No session found: ${this.sessionId}`);\n }\n\n const toolCallToArtifactMap: Record<string, string> = {};\n\n // Only process messages that haven't been processed yet\n const newMessages = messages.slice(this.lastProcessedMessageIndex);\n\n logger.debug(\n {\n totalMessages: messages.length,\n newMessages: newMessages.length,\n startIndex: this.lastProcessedMessageIndex,\n },\n 'Starting compression artifact processing'\n );\n\n for (const message of newMessages) {\n // Handle Vercel AI SDK message format\n if (Array.isArray(message.content)) {\n for (const block of message.content) {\n if (block.type === 'tool-result') {\n // Skip special tools that shouldn't be compressed at all\n if (\n block.toolName === 'get_reference_artifact' ||\n block.toolName === 'thinking_complete'\n ) {\n logger.debug(\n {\n toolCallId: block.toolCallId,\n toolName: block.toolName,\n },\n 'Skipping special tool - not creating artifacts'\n );\n this.processedToolCalls.add(block.toolCallId);\n continue; // Skip entirely - don't create artifacts\n }\n\n // Skip if this tool call has already been processed\n if (this.processedToolCalls.has(block.toolCallId)) {\n logger.debug(\n {\n toolCallId: block.toolCallId,\n toolName: block.toolName,\n },\n 'Skipping already processed tool call'\n );\n continue;\n }\n const artifactId = `compress_${block.toolName || 'tool'}_${block.toolCallId || Date.now()}_${randomUUID().slice(0, 8)}`;\n\n logger.debug(\n {\n artifactId,\n toolName: block.toolName,\n toolCallId: block.toolCallId,\n },\n 'Saving compression artifact'\n );\n\n // Find corresponding tool-call for input\n let toolInput = null;\n if (Array.isArray(message.content)) {\n const toolCall = message.content.find(\n (b: any) => b.type === 'tool-call' && b.toolCallId === block.toolCallId\n );\n toolInput = toolCall?.input;\n }\n\n // Clean tool result by recursively removing _structureHints before storing\n const cleanToolResult = this.removeStructureHints(block.output);\n\n // logger.info({ toolInput, cleanToolResult }, 'Tool input and clean tool result');\n\n // Create the tool result data\n const toolResultData = {\n toolName: block.toolName,\n toolInput: toolInput,\n toolResult: cleanToolResult,\n compressedAt: new Date().toISOString(),\n };\n\n // Skip artifact creation if toolResultData is empty\n if (this.isEmpty(toolResultData)) {\n logger.debug(\n {\n toolName: block.toolName,\n toolCallId: block.toolCallId,\n },\n 'Skipping empty tool result'\n );\n continue;\n }\n\n // Create artifact data structure\n const artifactData = {\n artifactId,\n taskId: `task_${this.conversationId}-${this.sessionId}`,\n toolCallId: block.toolCallId,\n artifactType: 'tool_result',\n pendingGeneration: true, // Triggers LLM-generated name/description\n tenantId: this.tenantId,\n projectId: this.projectId,\n contextId: this.conversationId,\n subAgentId: this.sessionId,\n metadata: {\n toolCallId: block.toolCallId,\n toolName: block.toolName,\n compressionReason: 'mid_generation_context_limit',\n },\n // Pass data in the format expected by ArtifactSavedData interface\n summaryData: {\n toolName: block.toolName,\n note: 'Compressed tool result - see full data for details',\n },\n data: toolResultData, // Full tool result data\n };\n\n // Double-check if artifact data contains meaningful data - use deeper validation\n const fullData = artifactData.data;\n const hasFullData =\n fullData &&\n typeof fullData === 'object' &&\n Object.keys(fullData).length > 0 &&\n // Check if toolResult specifically has content\n fullData.toolResult &&\n (typeof fullData.toolResult !== 'object' ||\n Object.keys(fullData.toolResult).length > 0);\n\n if (!hasFullData) {\n logger.debug(\n {\n artifactId,\n toolName: block.toolName,\n toolCallId: block.toolCallId,\n },\n 'Skipping empty compression artifact'\n );\n continue;\n }\n\n // Use existing AgentSession artifact processing (includes LLM name/description generation)\n session.recordEvent('artifact_saved', this.sessionId, artifactData);\n\n // Mark this tool call as processed to avoid reprocessing\n this.processedToolCalls.add(block.toolCallId);\n toolCallToArtifactMap[block.toolCallId] = artifactId;\n }\n }\n }\n }\n\n // Update the pointer to track where we left off\n this.lastProcessedMessageIndex = messages.length;\n\n logger.debug(\n {\n totalArtifactsCreated: Object.keys(toolCallToArtifactMap).length,\n newMessageIndex: this.lastProcessedMessageIndex,\n },\n 'Compression artifact processing completed'\n );\n\n return toolCallToArtifactMap;\n }\n\n /**\n * 3. Create conversation summary with artifact references\n */\n private async createConversationSummary(\n messages: any[],\n toolCallToArtifactMap: Record<string, string>\n ): Promise<any> {\n // Extract text messages to preserve before the summary\n const textMessages = this.extractTextMessages(messages, toolCallToArtifactMap);\n\n logger.debug(\n {\n sessionId: this.sessionId,\n messageCount: messages.length,\n textMessageCount: textMessages.length,\n artifactCount: Object.keys(toolCallToArtifactMap).length,\n sampleMessages: messages.slice(0, 2).map((m) => ({\n role: m.role,\n contentType: typeof m.content,\n contentPreview:\n typeof m.content === 'string' ? m.content.substring(0, 100) : 'array/object',\n })),\n },\n 'Starting distillation with debug info'\n );\n\n const summary = await distillConversation({\n messages: messages,\n conversationId: this.conversationId,\n currentSummary: this.cumulativeSummary, // Pass existing summary for cumulative building\n summarizerModel: this.summarizerModel,\n toolCallToArtifactMap: toolCallToArtifactMap, // Pass mapping for message formatting\n });\n\n // Update cumulative summary for next compression cycle\n this.cumulativeSummary = summary;\n\n logger.debug(\n {\n sessionId: this.sessionId,\n summaryGenerated: !!summary,\n summaryHighLevel: summary?.high_level,\n artifactsCount: summary?.related_artifacts?.length || 0,\n },\n 'Distillation completed'\n );\n\n // Return structure: text messages first, then summary\n return {\n text_messages: textMessages,\n summary: summary,\n };\n }\n\n /**\n * Extract text messages and convert tool calls to descriptive text\n * Avoids API tool-call/tool-result pairing issues while preserving context\n */\n private extractTextMessages(\n messages: any[],\n toolCallToArtifactMap: Record<string, string>\n ): any[] {\n const textMessages: any[] = [];\n\n // Collect tool call pairs to group them properly\n const toolCallPairs = new Map<string, { call: any; result: any }>();\n\n for (const message of messages) {\n if (Array.isArray(message.content)) {\n for (const block of message.content) {\n if (block.type === 'tool-call') {\n if (!toolCallPairs.has(block.toolCallId)) {\n toolCallPairs.set(block.toolCallId, { call: block, result: null });\n } else {\n toolCallPairs.get(block.toolCallId)!.call = block;\n }\n } else if (block.type === 'tool-result') {\n if (!toolCallPairs.has(block.toolCallId)) {\n toolCallPairs.set(block.toolCallId, { call: null, result: block });\n } else {\n toolCallPairs.get(block.toolCallId)!.result = block;\n }\n }\n }\n }\n }\n\n for (const message of messages) {\n // Handle assistant text messages\n if (message.role === 'assistant' && typeof message.content === 'string') {\n textMessages.push({\n role: message.role,\n content: message.content,\n });\n }\n // Handle assistant messages with content blocks\n else if (message.role === 'assistant' && Array.isArray(message.content)) {\n const textParts: string[] = [];\n const toolCallsInMessage = new Set<string>();\n const preservedBlocks: any[] = [];\n\n for (const block of message.content) {\n // Always preserve text blocks\n if (block.type === 'text') {\n textParts.push(block.text);\n }\n // Skip thinking_complete entirely - don't convert to text\n else if (block.type === 'tool-call' && block.toolName === 'thinking_complete') {\n // Do nothing - let it pass through unchanged in original messages\n }\n // Convert other tool calls to descriptive text\n else if (block.type === 'tool-call') {\n toolCallsInMessage.add(block.toolCallId);\n }\n }\n\n // Add descriptive text for tool calls in this message\n for (const toolCallId of toolCallsInMessage) {\n const pair = toolCallPairs.get(toolCallId);\n const artifactId = toolCallToArtifactMap[toolCallId];\n\n if (pair?.call) {\n const args = JSON.stringify(pair.call.input);\n const artifactText = artifactId\n ? ` Results compressed into artifact: ${artifactId}.`\n : ' Results were compressed but not saved.';\n\n textParts.push(`I called ${pair.call.toolName}(${args}).${artifactText}`);\n }\n }\n\n // Build final content based on what we have\n if (preservedBlocks.length > 0 && textParts.length > 0) {\n // Mixed content: preserved blocks + text\n const content = [...preservedBlocks];\n if (textParts.length > 0) {\n content.push({ type: 'text', text: textParts.join('\\n\\n') });\n }\n textMessages.push({\n role: message.role,\n content: content,\n });\n } else if (preservedBlocks.length > 0) {\n // Only preserved blocks\n textMessages.push({\n role: message.role,\n content: preservedBlocks,\n });\n } else if (textParts.length > 0) {\n // Only text\n textMessages.push({\n role: message.role,\n content: textParts.join('\\n\\n'),\n });\n }\n }\n }\n\n return textMessages;\n }\n\n // Removed focus hint helper methods - no longer needed since tool results are in formatted messages\n\n /**\n * Check if tool result data is effectively empty\n */\n private isEmpty(toolResultData: any): boolean {\n if (!toolResultData || typeof toolResultData !== 'object') {\n return true;\n }\n\n // Check if toolResult is empty/null/undefined\n const { toolResult } = toolResultData;\n if (!toolResult) {\n return true;\n }\n\n // Check if toolResult is an empty object\n if (typeof toolResult === 'object' && !Array.isArray(toolResult)) {\n const keys = Object.keys(toolResult);\n if (keys.length === 0) {\n return true;\n }\n\n // Check if all values are empty/null/undefined\n return keys.every((key) => {\n const value = toolResult[key];\n if (value === null || value === undefined || value === '') {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n if (typeof value === 'object' && Object.keys(value).length === 0) {\n return true;\n }\n return false;\n });\n }\n\n // Check if toolResult is an empty array\n if (Array.isArray(toolResult) && toolResult.length === 0) {\n return true;\n }\n\n // Check if toolResult is an empty string\n if (typeof toolResult === 'string' && toolResult.trim() === '') {\n return true;\n }\n\n return false;\n }\n\n /**\n * Recursively remove _structureHints from an object\n */\n private removeStructureHints(obj: any): any {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.removeStructureHints(item));\n }\n\n if (typeof obj === 'object') {\n const cleaned: any = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key !== '_structureHints') {\n cleaned[key] = this.removeStructureHints(value);\n }\n }\n return cleaned;\n }\n\n return obj;\n }\n\n /**\n * Get current state for debugging\n */\n getState() {\n return {\n shouldCompress: this.shouldCompress,\n config: this.config,\n };\n }\n\n /**\n * Get the current compression summary\n */\n getCompressionSummary() {\n return this.cumulativeSummary;\n }\n}\n","import { getLogger } from '../logger';\n\nconst logger = getLogger('PendingToolApprovalManager');\n\n// Cleanup interval - every 2 minutes\nconst APPROVAL_CLEANUP_INTERVAL_MS = 2 * 60 * 1000;\n\n// Approval timeout - 10 minutes (same as OAuth PKCE timeout)\nconst APPROVAL_TIMEOUT_MS = 10 * 60 * 1000;\n\nexport interface PendingToolApproval {\n toolCallId: string;\n toolName: string;\n args: any;\n conversationId: string;\n subAgentId: string;\n createdAt: number;\n resolve: (result: { approved: boolean; reason?: string }) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Manages pending tool approval requests during agent execution.\n * Similar to ToolSessionManager but for approval workflows.\n * Uses in-memory Map storage with automatic cleanup like OAuth PKCE store.\n */\nexport class PendingToolApprovalManager {\n private static instance: PendingToolApprovalManager;\n private pendingApprovals: Map<string, PendingToolApproval> = new Map();\n\n private constructor() {\n // Cleanup expired approvals every 2 minutes\n setInterval(() => this.cleanupExpiredApprovals(), APPROVAL_CLEANUP_INTERVAL_MS);\n }\n\n static getInstance(): PendingToolApprovalManager {\n if (!PendingToolApprovalManager.instance) {\n PendingToolApprovalManager.instance = new PendingToolApprovalManager();\n }\n return PendingToolApprovalManager.instance;\n }\n\n /**\n * Create a new pending approval and return a promise that resolves with approval status\n */\n async waitForApproval(\n toolCallId: string,\n toolName: string,\n args: any,\n conversationId: string,\n subAgentId: string\n ): Promise<{ approved: boolean; reason?: string }> {\n return new Promise((resolve, reject) => {\n // Set up automatic timeout/cleanup\n const timeoutId = setTimeout(() => {\n this.pendingApprovals.delete(toolCallId);\n resolve({\n approved: false,\n reason: `Tool approval timeout for ${toolName} (${toolCallId})`,\n });\n }, APPROVAL_TIMEOUT_MS);\n\n const approval: PendingToolApproval = {\n toolCallId,\n toolName,\n args,\n conversationId,\n subAgentId,\n createdAt: Date.now(),\n resolve,\n reject,\n timeoutId,\n };\n\n this.pendingApprovals.set(toolCallId, approval);\n\n logger.info(\n {\n toolCallId,\n toolName,\n conversationId,\n subAgentId,\n },\n 'Tool approval request created, waiting for user response'\n );\n });\n }\n\n /**\n * Approve a pending tool call\n */\n approveToolCall(toolCallId: string): boolean {\n const approval = this.pendingApprovals.get(toolCallId);\n\n if (!approval) {\n logger.warn({ toolCallId }, 'Tool approval not found or already processed');\n return false;\n }\n\n logger.info(\n {\n toolCallId,\n toolName: approval.toolName,\n conversationId: approval.conversationId,\n },\n 'Tool approved by user, resuming execution'\n );\n\n // Clean up and resolve the promise with approval result\n clearTimeout(approval.timeoutId);\n this.pendingApprovals.delete(toolCallId);\n approval.resolve({ approved: true });\n\n return true;\n }\n\n /**\n * Deny a pending tool call\n */\n denyToolCall(toolCallId: string, reason?: string): boolean {\n const approval = this.pendingApprovals.get(toolCallId);\n\n if (!approval) {\n logger.warn({ toolCallId }, 'Tool approval not found or already processed');\n return false;\n }\n\n logger.info(\n {\n toolCallId,\n toolName: approval.toolName,\n conversationId: approval.conversationId,\n reason,\n },\n 'Tool execution denied by user'\n );\n\n // Clean up and resolve the promise with denial result\n clearTimeout(approval.timeoutId);\n this.pendingApprovals.delete(toolCallId);\n approval.resolve({\n approved: false,\n reason: reason || 'User denied approval',\n });\n\n return true;\n }\n\n /**\n * Clean up expired approvals (called by interval timer)\n */\n private cleanupExpiredApprovals(): void {\n const now = Date.now();\n let cleanedUp = 0;\n\n for (const [toolCallId, approval] of this.pendingApprovals) {\n if (now - approval.createdAt > APPROVAL_TIMEOUT_MS) {\n clearTimeout(approval.timeoutId);\n this.pendingApprovals.delete(toolCallId);\n approval.resolve({ approved: false, reason: 'Tool approval expired' });\n cleanedUp++;\n }\n }\n\n if (cleanedUp > 0) {\n logger.info({ cleanedUp }, 'Cleaned up expired tool approvals');\n }\n }\n\n /**\n * Get current status for monitoring\n */\n getStatus() {\n return {\n pendingApprovals: this.pendingApprovals.size,\n approvals: Array.from(this.pendingApprovals.values()).map((approval) => ({\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n conversationId: approval.conversationId,\n subAgentId: approval.subAgentId,\n createdAt: approval.createdAt,\n age: Date.now() - approval.createdAt,\n })),\n };\n }\n}\n\n// Export singleton instance\nexport const pendingToolApprovalManager = PendingToolApprovalManager.getInstance();\n","import type { MessageContent } from '@inkeep/agents-core';\nimport { getLogger } from '../logger';\nimport { agentSessionManager } from '../services/AgentSession';\nimport { ArtifactParser, type StreamPart } from '../services/ArtifactParser';\nimport { setSpanWithError, tracer } from '../utils/tracer';\n\nconst logger = getLogger('ResponseFormatter');\n\n/**\n * Response formatter that uses the unified ArtifactParser to convert artifact markers\n * into data parts for consistent artifact handling across all agent responses\n */\nexport class ResponseFormatter {\n private artifactParser: ArtifactParser;\n private subAgentId?: string;\n\n constructor(\n tenantId: string,\n artifactParserOptions?: {\n sessionId?: string;\n taskId?: string;\n projectId?: string;\n contextId?: string;\n artifactComponents?: any[];\n streamRequestId?: string;\n subAgentId?: string;\n }\n ) {\n this.subAgentId = artifactParserOptions?.subAgentId;\n\n if (artifactParserOptions?.streamRequestId) {\n const sessionParser = agentSessionManager.getArtifactParser(\n artifactParserOptions.streamRequestId\n );\n\n if (sessionParser) {\n this.artifactParser = sessionParser;\n return;\n }\n }\n\n let sharedArtifactService = null;\n if (\n artifactParserOptions?.streamRequestId &&\n typeof agentSessionManager.getArtifactService === 'function'\n ) {\n try {\n sharedArtifactService = agentSessionManager.getArtifactService(\n artifactParserOptions.streamRequestId\n );\n } catch (_error) {}\n }\n\n this.artifactParser = new ArtifactParser(tenantId, {\n ...artifactParserOptions,\n artifactService: sharedArtifactService, // Use shared ArtifactService if available\n });\n }\n\n /**\n * Process structured object response and replace artifact markers with actual artifacts\n */\n async formatObjectResponse(responseObject: any, contextId: string): Promise<MessageContent> {\n return tracer.startActiveSpan('response.format_object_response', async (span) => {\n try {\n const artifactMap = await this.artifactParser.getContextArtifacts(contextId);\n\n span.setAttributes({\n 'response.type': 'object',\n 'response.availableArtifacts': artifactMap.size,\n });\n\n const parts = await this.artifactParser.parseObject(\n responseObject,\n artifactMap,\n this.subAgentId\n );\n\n const uniqueArtifacts = this.countUniqueArtifacts(parts);\n span.setAttributes({\n 'response.dataPartsCount': parts.length,\n 'response.artifactsCount': uniqueArtifacts,\n 'response.totalPartsCount': parts.length,\n });\n\n this.logArtifacts(span, parts);\n\n span.addEvent('response.parts.final_output', {\n final_parts_array: JSON.stringify(parts, null, 2),\n });\n\n return { parts };\n } catch (error) {\n setSpanWithError(span, error instanceof Error ? error : new Error(String(error)));\n logger.error({ error, responseObject }, 'Error formatting object response');\n return {\n parts: [{ kind: 'data' as const, data: responseObject }],\n };\n } finally {\n span.end();\n }\n });\n }\n\n /**\n * Process agent response and convert artifact markers to data parts\n */\n async formatResponse(responseText: string, contextId: string): Promise<MessageContent> {\n return tracer.startActiveSpan('response.format_response', async (span) => {\n try {\n const hasMarkers = this.artifactParser.hasArtifactMarkers(responseText);\n span.setAttributes({\n 'response.hasArtifactMarkers': hasMarkers,\n 'response.contextId': contextId,\n 'response.textLength': responseText.length,\n });\n\n if (!this.artifactParser.hasArtifactMarkers(responseText)) {\n span.setAttributes({\n 'response.result': 'no_markers_found',\n });\n return { parts: [{ kind: 'text', text: responseText }] };\n }\n\n const artifactMap = await this.artifactParser.getContextArtifacts(contextId);\n\n span.setAttributes({\n 'response.type': 'text',\n 'response.availableArtifacts': artifactMap.size,\n });\n\n const parts = await this.artifactParser.parseText(\n responseText,\n artifactMap,\n this.subAgentId\n );\n\n if (parts.length === 1 && parts[0].kind === 'text') {\n return { text: parts[0].text };\n }\n\n const textParts = parts.filter((p) => p.kind === 'text').length;\n const dataParts = parts.filter((p) => p.kind === 'data').length;\n const uniqueArtifacts = this.countUniqueArtifacts(parts);\n\n span.setAttributes({\n 'response.textPartsCount': textParts,\n 'response.dataPartsCount': dataParts,\n 'response.artifactsCount': uniqueArtifacts,\n 'response.totalPartsCount': parts.length,\n });\n\n this.logArtifacts(span, parts);\n\n span.addEvent('response.parts.final_output', {\n final_parts_array: JSON.stringify(parts, null, 2),\n });\n\n return { parts };\n } catch (error) {\n setSpanWithError(span, error instanceof Error ? error : new Error(String(error)));\n logger.error({ error, responseText }, 'Error formatting response');\n return { text: responseText };\n } finally {\n span.end();\n }\n });\n }\n\n /**\n * Count unique artifacts in parts array\n */\n private countUniqueArtifacts(parts: StreamPart[]): number {\n const uniqueKeys = new Set(\n parts\n .filter((p) => p.kind === 'data')\n .map((p) => {\n const data = p.data as any;\n if (data?.artifactId && data?.taskId) {\n return `${data.artifactId}:${data.taskId}`;\n }\n return null;\n })\n .filter((key) => key !== null)\n );\n return uniqueKeys.size;\n }\n\n /**\n * Log artifacts found in parts to span\n */\n private logArtifacts(span: any, parts: StreamPart[]): void {\n const artifacts = parts\n .filter((p) => p.kind === 'data')\n .map((p) => {\n const data = p.data as any;\n return {\n artifactId: data?.artifactId,\n name: data?.name,\n taskId: data?.taskId,\n };\n })\n .filter((art) => art.artifactId && art.taskId);\n\n if (artifacts.length > 0) {\n const uniqueArtifactsList = Array.from(\n new Map(artifacts.map((art) => [`${art.artifactId}:${art.taskId}`, art])).values()\n );\n\n span.addEvent('artifacts.found', {\n 'artifacts.count': uniqueArtifactsList.length,\n 'artifacts.list': JSON.stringify(uniqueArtifactsList),\n });\n }\n }\n}\n","import type { DataOperationEvent } from '@inkeep/agents-core';\nimport { generateId } from '@inkeep/agents-core';\n\n// =============================================================================\n// OPERATION EVENT TYPES\n// =============================================================================\n\n/**\n * Agent initialization operation event\n */\nexport interface AgentInitializingEvent {\n type: 'agent_initializing';\n details: {\n sessionId: string;\n agentId: string;\n };\n}\n\n/**\n * Completion operation event\n */\nexport interface CompletionEvent {\n type: 'completion';\n details: {\n agent: string;\n iteration: number;\n };\n}\n\n/**\n * Unified error event structure\n * Can be used for both operational errors (with agent context) and general stream errors\n */\nexport interface ErrorEvent {\n type: 'error';\n message: string;\n agent?: string;\n severity?: 'error' | 'warning' | 'info';\n code?: string;\n timestamp?: number;\n}\n\n/**\n * Discriminated union of all operation events\n */\nexport type OperationEvent =\n | AgentInitializingEvent\n | CompletionEvent\n | ErrorEvent\n | DataOperationEvent;\n\n// =============================================================================\n// OPERATION FUNCTIONS\n// =============================================================================\n\n/**\n * Creates an agent initializing operation\n */\nexport function agentInitializingOp(sessionId: string, agentId: string): AgentInitializingEvent {\n return {\n type: 'agent_initializing',\n details: {\n sessionId,\n agentId,\n },\n };\n}\n\n/**\n * Creates a completion operation\n */\nexport function completionOp(subAgentId: string, iterations: number): CompletionEvent {\n return {\n type: 'completion',\n details: {\n agent: subAgentId,\n iteration: iterations,\n },\n };\n}\n\n/**\n * Creates a unified error event\n * @param message - Error message\n * @param subAgentId - Optional agent ID for context\n * @param severity - Error severity level\n * @param code - Optional error code\n */\nexport function errorOp(\n message: string,\n subAgentId?: string,\n severity: 'error' | 'warning' | 'info' = 'error',\n code?: string\n): ErrorEvent {\n return {\n type: 'error',\n message,\n agent: subAgentId,\n severity,\n code,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Generate a unique tool execution ID for lifecycle tracking\n */\nexport function generateToolId(): string {\n return `tool_${generateId(8)}`;\n}\n","import jmespath from 'jmespath';\nimport { getLogger } from '../logger';\n\nexport interface SchemaValidationResult {\n isValid: boolean;\n errors: string[];\n transformedSchema?: any;\n}\n\nexport interface JMESPathValidationResult {\n isLiteral: boolean;\n isValidSelector: boolean;\n suggestions?: string[];\n}\n\n/**\n * Centralized schema processing and validation utilities\n */\nexport class SchemaProcessor {\n private static logger = getLogger('SchemaProcessor');\n\n /**\n * Transform complex schema types to strings for JMESPath compatibility\n */\n static transformSchemaForJMESPath(schema: any): any {\n if (!schema || typeof schema !== 'object') {\n return schema;\n }\n\n const transform = (obj: any): any => {\n if (Array.isArray(obj)) {\n return obj.map(transform);\n }\n\n if (obj && typeof obj === 'object') {\n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'type' && typeof value === 'string') {\n result[key] = value === 'string' ? 'string' : 'string';\n } else {\n result[key] = transform(value);\n }\n }\n return result;\n }\n\n return obj;\n };\n\n return transform(schema);\n }\n\n /**\n * Validate if a selector looks like a valid JMESPath expression\n */\n static validateJMESPathSelector(selector: string): JMESPathValidationResult {\n if (SchemaProcessor.isLiteralValue(selector)) {\n return {\n isLiteral: true,\n isValidSelector: false,\n };\n }\n\n if (SchemaProcessor.looksLikeJMESPath(selector)) {\n return {\n isLiteral: false,\n isValidSelector: true,\n };\n }\n\n return {\n isLiteral: false,\n isValidSelector: false,\n };\n }\n\n /**\n * Check if a selector looks like a JMESPath expression\n */\n private static looksLikeJMESPath(selector: string): boolean {\n if (/^[a-zA-Z_][a-zA-Z0-9_]*\\.[a-zA-Z_][a-zA-Z0-9_]*$/.test(selector)) {\n return true;\n }\n\n if (/^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)+$/.test(selector)) {\n return true;\n }\n\n if (/\\[\\d+\\]/.test(selector) || /\\[\\*\\]/.test(selector)) {\n return true;\n }\n\n if (/\\[.*?\\]/.test(selector) && /[=<>!]/.test(selector)) {\n return true;\n }\n\n if (selector.includes('|')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Check if a selector appears to be a literal value rather than a JMESPath expression\n */\n private static isLiteralValue(selector: string): boolean {\n if (SchemaProcessor.looksLikeJMESPath(selector)) {\n return false;\n }\n\n if (/^https?:\\/\\//.test(selector)) {\n return true;\n }\n\n if (/^[0-9]+$/.test(selector)) {\n // Pure numbers\n return true;\n }\n\n if (selector.includes(' ') && !selector.includes('[')) {\n // Sentences without array syntax\n return true;\n }\n\n if (/^[a-zA-Z0-9\\s\\-_,;:!?.'\"+()]+$/.test(selector) && selector.length > 20) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Safely extract data using JMESPath with validation\n */\n static safeJMESPathSearch(data: any, selector: string, fallback: any = null): any {\n try {\n const validation = SchemaProcessor.validateJMESPathSelector(selector);\n\n if (validation.isLiteral) {\n SchemaProcessor.logger.debug(\n { selector },\n 'Selector appears to be literal value, returning as-is'\n );\n return selector;\n }\n\n if (!validation.isValidSelector) {\n SchemaProcessor.logger.warn({ selector }, 'Selector does not appear to be valid JMESPath');\n return fallback;\n }\n\n return jmespath.search(data, selector) || fallback;\n } catch (error) {\n SchemaProcessor.logger.warn(\n { selector, error: error instanceof Error ? error.message : String(error) },\n 'JMESPath search failed'\n );\n return fallback;\n }\n }\n\n /**\n * Validate schema structure for artifact components\n */\n static validateArtifactSchema(schema: any): SchemaValidationResult {\n const errors: string[] = [];\n\n if (!schema || typeof schema !== 'object') {\n errors.push('Schema must be an object');\n return { isValid: false, errors };\n }\n\n if (!schema.type || schema.type !== 'object') {\n errors.push('Schema must have type \"object\"');\n }\n\n if (!schema.properties || typeof schema.properties !== 'object') {\n errors.push('Schema must have properties object');\n }\n\n const transformedSchema = SchemaProcessor.transformSchemaForJMESPath(schema);\n\n return {\n isValid: errors.length === 0,\n errors,\n transformedSchema,\n };\n }\n\n /**\n * Extract property value with proper type conversion and validation\n */\n static extractPropertyValue(\n data: any,\n _propName: string,\n selector: string,\n expectedType?: string\n ): any {\n const value = SchemaProcessor.safeJMESPathSearch(data, selector);\n\n if (value === null || value === undefined) {\n return null;\n }\n\n if (expectedType) {\n switch (expectedType) {\n case 'string':\n return String(value);\n case 'number': {\n const num = Number(value);\n return Number.isNaN(num) ? null : num;\n }\n case 'boolean':\n return Boolean(value);\n case 'array':\n return Array.isArray(value) ? value : [value];\n default:\n return value;\n }\n }\n\n return value;\n }\n\n /**\n * Enhance schema with JMESPath guidance for artifact component schemas\n * Transforms all schema types to string selectors with helpful descriptions\n */\n static enhanceSchemaWithJMESPathGuidance(\n schema: Record<string, unknown> | null | undefined\n ): Record<string, unknown> {\n if (!schema || typeof schema !== 'object') {\n return schema || {};\n }\n\n const transformToSelectorSchema = (obj: any, path: string = ''): any => {\n if (!obj || typeof obj !== 'object') return obj;\n\n if (obj.type === 'array') {\n const _itemDescription = obj.items?.description || 'array items';\n const arrayDescription = obj.description || 'array data';\n const _isContentField = path.includes('content');\n\n return {\n type: 'string',\n description: `🎯 ARRAY SELECTOR: Provide JMESPath selector for ${arrayDescription}. RELATIVE to base selector - this will be applied to the item selected by base_selector. Example: \"content.blocks\" or \"items\" (NOT absolute paths like \"result.content.blocks\")`,\n };\n }\n\n if (obj.type === 'object' && !obj.properties) {\n const objectDescription = obj.description || 'object data';\n\n return {\n type: 'string',\n description: `🎯 OBJECT SELECTOR: Provide JMESPath selector for ${objectDescription}. RELATIVE to base selector - this will be applied to the item selected by base_selector. Example: \"metadata\" or \"spec.details\" (NOT absolute paths)`,\n };\n }\n\n if (obj.type === 'object' && obj.properties) {\n const transformedProperties: any = {};\n\n Object.entries(obj.properties).forEach(([propertyName, property]: [string, any]) => {\n const fullPath = path ? `${path}.${propertyName}` : propertyName;\n transformedProperties[propertyName] = transformToSelectorSchema(property, fullPath);\n });\n\n return {\n type: 'object',\n properties: transformedProperties,\n required: obj.required || [],\n description: `${obj.description || 'Object containing JMESPath selectors'} - Each property should be a selector RELATIVE to the base_selector`,\n };\n }\n\n if (['string', 'number', 'boolean'].includes(obj.type)) {\n const originalDescription = obj.description || `${obj.type} value`;\n\n return {\n type: 'string',\n description: `🎯 FIELD SELECTOR: Provide JMESPath selector for ${originalDescription}. RELATIVE to base selector (e.g., \"title\", \"metadata.category\", \"properties.value\"). For nested data: use field paths like \"content.details\", \"attributes.data\", \"specifications.info\". NOT absolute paths and NOT literal values like \"${originalDescription}\". The base_selector finds the item, this selector extracts the field FROM that item.`,\n };\n }\n\n return {\n type: 'string',\n description: `🎯 SELECTOR: Provide JMESPath selector RELATIVE to base selector. Example: \"fieldName\" or \"nested.path\" (NOT absolute paths)`,\n };\n };\n\n return transformToSelectorSchema(schema);\n }\n}\n","import { z } from '@hono/zod-openapi';\nimport type {\n ArtifactComponentApiInsert,\n ArtifactComponentApiSelect,\n DataComponentInsert,\n} from '@inkeep/agents-core';\nimport { getLogger } from '../logger';\nimport { jsonSchemaToZod } from './data-component-schema';\nimport { SchemaProcessor } from './SchemaProcessor';\nimport type { ExtendedJsonSchema } from './schema-validation';\n\nconst _logger = getLogger('ArtifactComponentSchema');\n\n/**\n * Converts artifact component configurations to Zod schema for structured generation\n */\nexport function createArtifactComponentsSchema(artifactComponents?: ArtifactComponentApiSelect[]) {\n // Convert artifact component configs to a union schema\n const componentSchemas =\n artifactComponents?.map((component) => {\n // Use the unified props schema directly - remove inPreview flags for LLM\n const cleanSchema = component.props\n ? removePreviewFlags(component.props as ExtendedJsonSchema)\n : {};\n const propsSchema = jsonSchemaToZod(cleanSchema);\n\n return z\n .object({\n id: z.string().describe(component.id),\n name: z.literal(component.name).describe(component.name),\n props: propsSchema,\n })\n .describe(`${component.name}: ${component.description}`);\n }) || [];\n\n // Return union of all component schemas - z.union requires at least 2 schemas\n if (componentSchemas.length === 0) {\n return z.object({}); // Empty object for no components\n }\n if (componentSchemas.length === 1) {\n return componentSchemas[0]; // Single schema doesn't need union\n }\n return z.union(componentSchemas as any); // Safe union with 2+ schemas\n}\n\n/**\n * Remove inPreview flags from schema properties (for LLM consumption)\n */\nfunction removePreviewFlags(schema: ExtendedJsonSchema): Record<string, any> {\n const cleanSchema = { ...schema };\n\n if (cleanSchema.properties) {\n const cleanProperties: Record<string, any> = {};\n for (const [key, prop] of Object.entries(cleanSchema.properties)) {\n const cleanProp = { ...prop };\n delete cleanProp.inPreview;\n cleanProperties[key] = cleanProp;\n }\n cleanSchema.properties = cleanProperties;\n }\n\n return cleanSchema;\n}\n\n/**\n * Standard artifact reference component schema for tool responses\n */\nexport class ArtifactReferenceSchema {\n // Standard artifact props schema - single source of truth\n private static readonly ARTIFACT_PROPS_SCHEMA = {\n type: 'object',\n properties: {\n artifact_id: {\n type: 'string',\n description: 'The artifact_id from your artifact:create tag. Must match exactly.',\n },\n tool_call_id: {\n type: 'string',\n description:\n 'The EXACT tool_call_id from tool execution (call_xyz789 or toolu_abc123). NEVER invent or make up IDs.',\n },\n },\n required: ['artifact_id', 'tool_call_id'],\n };\n\n /**\n * Get the standard Zod schema for artifact reference components\n */\n static getSchema(): z.ZodType<any> {\n return z.object({\n id: z.string(),\n name: z.literal('Artifact'),\n props: jsonSchemaToZod(ArtifactReferenceSchema.ARTIFACT_PROPS_SCHEMA),\n });\n }\n\n /**\n * Get complete DataComponent by adding missing fields to base definition\n */\n static getDataComponent(tenantId: string, projectId: string = ''): DataComponentInsert {\n return {\n id: 'The artifact_id from your artifact:create tag. Must match exactly.',\n tenantId: tenantId,\n projectId: projectId,\n name: 'Artifact',\n description:\n 'Reference to artifacts created from tool results that grounds information in verifiable sources.',\n props: ArtifactReferenceSchema.ARTIFACT_PROPS_SCHEMA,\n };\n }\n}\n\n/**\n * Standard artifact creation component schema for data components\n */\nexport class ArtifactCreateSchema {\n /**\n * Generate artifact create schemas - one for each artifact component type\n * @param artifactComponents - The available artifact components to generate schemas for\n * @returns Array of Zod schemas, one for each artifact component\n */\n static getSchemas(\n artifactComponents: Array<ArtifactComponentApiInsert | ArtifactComponentApiSelect>\n ): z.ZodType<any>[] {\n return artifactComponents.map((component) => {\n // Use SchemaProcessor to enhance the component's unified props schema with JMESPath guidance\n const enhancedSchema = component.props\n ? SchemaProcessor.enhanceSchemaWithJMESPathGuidance(component.props)\n : { type: 'object', properties: {} };\n\n const propsSchema = {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: `Unique artifact identifier for ${component.name} (e.g., \"${component.name.toLowerCase()}-1\")`,\n },\n tool_call_id: {\n type: 'string',\n description:\n 'The EXACT tool_call_id from tool execution (call_xyz789 or toolu_abc123). NEVER invent or make up IDs.',\n },\n type: {\n type: 'string',\n enum: [component.name],\n description: `Artifact type - must be \"${component.name}\"`,\n },\n base_selector: {\n type: 'string',\n description:\n 'JMESPath selector starting with \"result.\" to navigate to ONE specific item. Details selector will be relative to this selection. Use filtering to avoid arrays (e.g., \"result.items[?type==\\'guide\\']\").',\n },\n details_selector: enhancedSchema,\n },\n required: ['id', 'tool_call_id', 'type', 'base_selector'],\n };\n\n return z.object({\n id: z.string(),\n name: z.literal(`ArtifactCreate_${component.name}`),\n props: jsonSchemaToZod(propsSchema),\n });\n });\n }\n\n /**\n * Get DataComponents for artifact creation - one for each artifact component type\n * @param artifactComponents - The available artifact components to generate schemas for\n * @returns Array of DataComponent definitions, one for each artifact component\n */\n static getDataComponents(\n tenantId: string,\n projectId: string = '',\n artifactComponents: Array<ArtifactComponentApiInsert | ArtifactComponentApiSelect>\n ): DataComponentInsert[] {\n return artifactComponents.map((component) => {\n // Use SchemaProcessor to enhance the component's unified props schema with JMESPath guidance\n const enhancedSchema = component.props\n ? SchemaProcessor.enhanceSchemaWithJMESPathGuidance(component.props)\n : { type: 'object', properties: {} };\n\n const propsSchema = {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: `Unique artifact identifier for ${component.name} (e.g., \"${component.name.toLowerCase()}-1\")`,\n },\n tool_call_id: {\n type: 'string',\n description:\n 'The EXACT tool_call_id from tool execution (call_xyz789 or toolu_abc123). NEVER invent or make up IDs.',\n },\n type: {\n type: 'string',\n enum: [component.name],\n description: `Artifact type - must be \"${component.name}\"`,\n },\n base_selector: {\n type: 'string',\n description:\n 'JMESPath selector starting with \"result.\" to navigate to ONE specific item. Details selector will be relative to this selection. Use filtering to avoid arrays (e.g., \"result.items[?type==\\'guide\\']\").',\n },\n details_selector: enhancedSchema,\n },\n required: ['id', 'tool_call_id', 'type', 'base_selector'],\n };\n\n return {\n id: `artifact-create-${component.name.toLowerCase().replace(/\\s+/g, '-')}`,\n tenantId: tenantId,\n projectId: projectId,\n name: `ArtifactCreate_${component.name}`,\n description: `Create ${component.name} artifacts from tool results by extracting structured data using selectors.`,\n props: propsSchema,\n };\n });\n }\n}\n","import type {\n A2AError,\n AgentCard,\n CancelTaskResponse,\n GetTaskPushNotificationConfigResponse,\n GetTaskResponse,\n JSONRPCError,\n JSONRPCErrorResponse,\n JSONRPCRequest,\n JSONRPCResult,\n Message,\n MessageSendParams,\n SendMessageResponse,\n SendStreamingMessageResponse,\n SendStreamingMessageSuccessResponse,\n SetTaskPushNotificationConfigResponse,\n Task,\n TaskArtifactUpdateEvent,\n TaskIdParams,\n TaskPushNotificationConfig,\n TaskQueryParams,\n TaskStatusUpdateEvent,\n} from '@inkeep/agents-core'; // Updated to use the consolidated schema\nimport { getLogger } from '../logger';\n\nconst logger = getLogger('a2aClient');\n\ntype A2AStreamEventData = Message | Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\nexport type BackoffStrategy = {\n initialInterval: number;\n maxInterval: number;\n exponent: number;\n maxElapsedTime: number;\n};\n\nexport type RetryConfig =\n | { strategy: 'none' }\n | {\n strategy: 'backoff';\n backoff?: BackoffStrategy;\n retryConnectionErrors?: boolean;\n statusCodes?: string[];\n };\n\nexport interface A2AClientOptions {\n retryConfig?: RetryConfig;\n headers?: Record<string, string>;\n}\n\nconst DEFAULT_BACKOFF: BackoffStrategy = {\n initialInterval: 500,\n maxInterval: 60000,\n exponent: 1.5,\n maxElapsedTime: 30000, // 30 seconds for A2A calls\n};\n\nconst DEFAULT_RETRY_STATUS_CODES = ['429', '500', '502', '503', '504'];\n\n/**\n * Error classes for retry logic\n */\nclass PermanentError extends Error {\n override readonly cause: unknown;\n public readonly type?: string;\n\n constructor(message: string, options?: { cause?: unknown; type?: string }) {\n let msg = message;\n if (options?.cause) {\n msg += `: ${options.cause}`;\n }\n super(msg, options);\n this.name = options?.type || 'PermanentError';\n if (typeof this.cause === 'undefined') {\n this.cause = options?.cause;\n }\n Object.setPrototypeOf(this, PermanentError.prototype);\n }\n}\n\nclass TemporaryError extends Error {\n response: Response;\n\n constructor(message: string, response: Response) {\n super(message);\n this.response = response;\n this.name = 'TemporaryError';\n Object.setPrototypeOf(this, TemporaryError.prototype);\n }\n}\n\n/**\n * A2AClient is a TypeScript HTTP client for interacting with A2A-compliant agents.\n *\n * Features:\n * - Configurable retry behavior with exponential backoff\n * - Automatic retry on network errors and configurable HTTP status codes\n * - Support for custom retry strategies and timeouts\n *\n * Default retry behavior:\n * - Retries on: 429, 500, 502, 503, 504 status codes and network errors\n * - Initial delay: 500ms, max delay: 60s, exponential backoff (1.5x)\n * - Max total retry time: 30 seconds\n *\n * @example\n * // Default retry behavior\n * const client = new A2AClient('https://agent.example.com');\n *\n * // Custom retry configuration\n * const client = new A2AClient('https://agent.example.com', {\n * retryConfig: {\n * strategy: 'backoff',\n * retryConnectionErrors: true,\n * statusCodes: ['429', '502', '503', '504'],\n * backoff: {\n * initialInterval: 1000,\n * maxInterval: 30000,\n * exponent: 2,\n * maxElapsedTime: 60000\n * }\n * }\n * });\n *\n * // Disable retries\n * const client = new A2AClient('https://agent.example.com', {\n * retryConfig: { strategy: 'none' }\n * });\n */\nexport class A2AClient {\n private agentBaseUrl: string;\n private agentCardPromise: Promise<AgentCard>;\n private requestIdCounter = 1;\n private serviceEndpointUrl?: string; // To be populated from AgentCard after fetching\n private options: A2AClientOptions;\n\n /**\n * Constructs an A2AClient instance.\n * It initiates fetching the agent card from the provided agent baseUrl.\n * The Agent Card is expected at `${agentBaseUrl}/.well-known/agent.json`.\n * The `url` field from the Agent Card will be used as the RPC service endpoint.\n * @param agentBaseUrl The base URL of the A2A agent (e.g., https://agent.example.com).\n * @param options Optional configuration including retry behavior.\n */\n constructor(agentBaseUrl: string, options?: A2AClientOptions) {\n this.agentBaseUrl = agentBaseUrl.replace(/\\/$/, ''); // Remove trailing slash if any\n this.options = {\n retryConfig: {\n strategy: 'backoff',\n backoff: DEFAULT_BACKOFF,\n retryConnectionErrors: true,\n statusCodes: DEFAULT_RETRY_STATUS_CODES,\n },\n ...options,\n };\n this.agentCardPromise = this._fetchAndCacheAgentCard();\n }\n\n /**\n * Fetches the Agent Card from the agent's well-known URI and caches its service endpoint URL.\n * This method is called by the constructor.\n * @returns A Promise that resolves to the AgentCard.\n */\n private async _fetchAndCacheAgentCard(): Promise<AgentCard> {\n const agentCardUrl = `${this.agentBaseUrl}/.well-known/agent.json`;\n getLogger('a2a').info({ agentCardUrl, agentBaseUrl: this.agentBaseUrl }, 'agentCardUrl');\n try {\n const response = await fetch(agentCardUrl, {\n headers: {\n Accept: 'application/json',\n ...(this.options.headers || {}),\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Agent Card from ${agentCardUrl}: ${response.status} ${response.statusText}`\n );\n }\n const agentCard: AgentCard = await response.json();\n if (!agentCard.url) {\n throw new Error(\n \"Fetched Agent Card does not contain a valid 'url' for the service endpoint.\"\n );\n }\n this.serviceEndpointUrl = agentCard.url; // Cache the service endpoint URL from the agent card\n return agentCard;\n } catch (error) {\n console.error('Error fetching or parsing Agent Card:', error);\n throw error;\n }\n }\n\n /**\n * Retrieves the Agent Card.\n * If an `agentBaseUrl` is provided, it fetches the card from that specific URL.\n * Otherwise, it returns the card fetched and cached during client construction.\n * @param agentBaseUrl Optional. The base URL of the agent to fetch the card from.\n * If provided, this will fetch a new card, not use the cached one from the constructor's URL.\n * @returns A Promise that resolves to the AgentCard.\n */\n public async getAgentCard(agentBaseUrl?: string): Promise<AgentCard> {\n if (agentBaseUrl) {\n const specificAgentBaseUrl = agentBaseUrl.replace(/\\/$/, '');\n const agentCardUrl = `${specificAgentBaseUrl}/.well-known/agent.json`;\n const response = await fetch(agentCardUrl, {\n headers: {\n Accept: 'application/json',\n ...(this.options.headers || {}),\n },\n });\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Agent Card from ${agentCardUrl}: ${response.status} ${response.statusText}`\n );\n }\n return (await response.json()) as AgentCard;\n }\n return this.agentCardPromise;\n }\n\n /**\n * Gets the RPC service endpoint URL. Ensures the agent card has been fetched first.\n * @returns A Promise that resolves to the service endpoint URL string.\n */\n private async _getServiceEndpoint(): Promise<string> {\n if (this.serviceEndpointUrl) {\n return this.serviceEndpointUrl;\n }\n await this.agentCardPromise;\n if (!this.serviceEndpointUrl) {\n throw new Error(\n 'Agent Card URL for RPC endpoint is not available. Fetching might have failed.'\n );\n }\n return this.serviceEndpointUrl;\n }\n\n /**\n * Retry utility functions\n */\n private async retry(fetchFn: () => Promise<Response>): Promise<Response> {\n const config = this.options.retryConfig;\n if (!config || config.strategy === 'none') {\n return await fetchFn();\n }\n\n const statusCodes = config.statusCodes || DEFAULT_RETRY_STATUS_CODES;\n return this.retryBackoff(\n this.wrapFetcher(fetchFn, {\n statusCodes,\n retryConnectionErrors: !!config.retryConnectionErrors,\n }),\n config.backoff ?? DEFAULT_BACKOFF\n );\n }\n\n private wrapFetcher(\n fn: () => Promise<Response>,\n options: {\n statusCodes: string[];\n retryConnectionErrors: boolean;\n }\n ): () => Promise<Response> {\n return async () => {\n try {\n const res = await fn();\n if (this.isRetryableResponse(res, options.statusCodes)) {\n throw new TemporaryError('Response failed with retryable status code', res);\n }\n return res;\n } catch (err: unknown) {\n if (err instanceof TemporaryError) {\n throw err;\n }\n\n if (options.retryConnectionErrors && this.isRetryableError(err)) {\n throw err;\n }\n\n throw new PermanentError('Permanent error', { cause: err });\n }\n };\n }\n\n private isRetryableResponse(res: Response, statusCodes: string[]): boolean {\n const actual = `${res.status}`;\n const codeRangeRE = /^[0-9]xx$/i;\n\n return statusCodes.some((code) => {\n if (!codeRangeRE.test(code)) {\n return code === actual;\n }\n\n const expectFamily = code.charAt(0);\n if (!expectFamily) {\n throw new Error('Invalid status code range');\n }\n\n const actualFamily = actual.charAt(0);\n if (!actualFamily) {\n throw new Error(`Invalid response status code: ${actual}`);\n }\n\n return actualFamily === expectFamily;\n });\n }\n\n private isRetryableError(error: unknown): boolean {\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('connection') ||\n message.includes('econnreset') ||\n message.includes('econnrefused') ||\n message.includes('enotfound') ||\n message.includes('fetch')\n );\n }\n return false;\n }\n\n private async retryBackoff(\n fn: () => Promise<Response>,\n strategy: BackoffStrategy\n ): Promise<Response> {\n const { maxElapsedTime, initialInterval, exponent, maxInterval } = strategy;\n\n const start = Date.now();\n let attempt = 0;\n\n while (true) {\n try {\n const res = await fn();\n if (attempt > 0) {\n logger.info(\n {\n attempts: attempt + 1,\n elapsedTime: Date.now() - start,\n },\n 'A2A request succeeded after retries'\n );\n }\n return res;\n } catch (err: unknown) {\n if (err instanceof PermanentError) {\n throw err.cause;\n }\n\n const elapsed = Date.now() - start;\n if (elapsed > maxElapsedTime) {\n logger.warn(\n {\n attempts: attempt + 1,\n elapsedTime: elapsed,\n maxElapsedTime,\n },\n 'A2A request max retry time exceeded'\n );\n if (err instanceof TemporaryError) {\n return err.response;\n }\n throw err;\n }\n\n let retryInterval = 0;\n if (err instanceof TemporaryError) {\n retryInterval = this.retryIntervalFromResponse(err.response);\n }\n\n if (retryInterval <= 0) {\n retryInterval = initialInterval * attempt ** exponent + Math.random() * 1000;\n }\n\n const delayMs = Math.min(retryInterval, maxInterval);\n\n logger.info(\n {\n attempt: attempt + 1,\n delayMs,\n error: err instanceof TemporaryError ? `HTTP ${err.response.status}` : 'Network error',\n },\n 'A2A request failed, retrying after delay'\n );\n\n await this.delay(delayMs);\n attempt++;\n }\n }\n }\n\n private retryIntervalFromResponse(res: Response): number {\n const retryVal = res.headers.get('retry-after') || '';\n if (!retryVal) {\n return 0;\n }\n\n const parsedNumber = Number(retryVal);\n if (Number.isInteger(parsedNumber)) {\n return parsedNumber * 1000;\n }\n\n const parsedDate = Date.parse(retryVal);\n if (Number.isInteger(parsedDate)) {\n const deltaMS = parsedDate - Date.now();\n return deltaMS > 0 ? Math.ceil(deltaMS) : 0;\n }\n\n return 0;\n }\n\n private async delay(delayMs: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n /**\n * Helper method to make a generic JSON-RPC POST request.\n * @param method The RPC method name.\n * @param params The parameters for the RPC method.\n * @returns A Promise that resolves to the RPC response.\n */\n private async _postRpcRequest<\n TParams,\n TResponse extends JSONRPCResult<any> | JSONRPCErrorResponse,\n >(method: string, params: TParams): Promise<TResponse> {\n const endpoint = await this._getServiceEndpoint();\n const requestId = this.requestIdCounter++;\n const rpcRequest: JSONRPCRequest = {\n jsonrpc: '2.0',\n method,\n params: params as { [key: string]: any }, // Cast because TParams structure varies per method\n id: requestId,\n };\n\n const httpResponse = await this.retry(async () => {\n return fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json', // Expect JSON response for non-streaming requests\n ...(this.options.headers || {}),\n },\n body: JSON.stringify(rpcRequest),\n });\n });\n\n if (!httpResponse.ok) {\n let errorBodyText = '(empty or non-JSON response)';\n try {\n errorBodyText = await httpResponse.text();\n const errorJson = JSON.parse(errorBodyText);\n if (!errorJson.jsonrpc && errorJson.error) {\n throw new Error(\n `RPC error for ${method}: ${errorJson.error.message} (Code: ${errorJson.error.code}, HTTP Status: ${httpResponse.status}) Data: ${JSON.stringify(errorJson.error.data)}`\n );\n }\n if (!errorJson.jsonrpc) {\n throw new Error(\n `HTTP error for ${method}! Status: ${httpResponse.status} ${httpResponse.statusText}. Response: ${errorBodyText}`\n );\n }\n } catch (e: any) {\n if (e.message.startsWith('RPC error for') || e.message.startsWith('HTTP error for'))\n throw e;\n throw new Error(\n `HTTP error for ${method}! Status: ${httpResponse.status} ${httpResponse.statusText}. Response: ${errorBodyText}`\n );\n }\n }\n\n const rpcResponse = await httpResponse.json();\n\n // Check if the response contains a connection_refused error type\n // If so, throw a PermanentError to prevent retries\n if (rpcResponse.error?.data?.type === 'connection_refused') {\n throw new PermanentError(rpcResponse.error.message, {\n cause: new Error(rpcResponse.error.message),\n type: 'connection_refused',\n });\n }\n\n if (rpcResponse.id !== requestId) {\n logger.warn(\n {\n method,\n expectedId: requestId,\n receivedId: rpcResponse.id,\n },\n 'RPC response ID mismatch - this may lead to incorrect response handling'\n );\n }\n\n return rpcResponse as TResponse;\n }\n\n /**\n * Sends a message to the agent.\n * The behavior (blocking/non-blocking) and push notification configuration\n * are specified within the `params.configuration` object.\n * Optionally, `params.message.contextId` or `params.message.taskId` can be provided.\n * @param params The parameters for sending the message, including the message content and configuration.\n * @returns A Promise resolving to SendMessageResponse, which can be a Message, Task, or an error.\n */\n public async sendMessage(params: MessageSendParams): Promise<SendMessageResponse> {\n return this._postRpcRequest<MessageSendParams, SendMessageResponse>('message/send', params);\n }\n\n /**\n * Sends a message to the agent and streams back responses using Server-Sent Events (SSE).\n * Push notification configuration can be specified in `params.configuration`.\n * Optionally, `params.message.contextId` or `params.message.taskId` can be provided.\n * Requires the agent to support streaming (`capabilities.streaming: true` in AgentCard).\n * @param params The parameters for sending the message.\n * @returns An AsyncGenerator yielding A2AStreamEventData (Message, Task, TaskStatusUpdateEvent, or TaskArtifactUpdateEvent).\n * The generator throws an error if streaming is not supported or if an HTTP/SSE error occurs.\n */\n public async *sendMessageStream(\n params: MessageSendParams\n ): AsyncGenerator<A2AStreamEventData, void, undefined> {\n const endpoint = await this._getServiceEndpoint();\n const clientRequestId = this.requestIdCounter++; // Use a unique ID for this stream request\n const rpcRequest: JSONRPCRequest = {\n jsonrpc: '2.0',\n method: 'message/stream',\n params: params as { [key: string]: any },\n id: clientRequestId,\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream', // Crucial for SSE\n ...(this.options.headers || {}),\n },\n body: JSON.stringify(rpcRequest),\n });\n\n if (!response.ok) {\n let errorBody = '';\n try {\n errorBody = await response.text();\n const errorJson = JSON.parse(errorBody);\n if (errorJson.error) {\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}. RPC Error: ${errorJson.error.message} (Code: ${errorJson.error.code})`\n );\n }\n } catch (e: any) {\n if (e.message.startsWith('HTTP error establishing stream')) throw e;\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}. Response: ${errorBody || '(empty)'}`\n );\n }\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}`\n );\n }\n if (!response.headers.get('Content-Type')?.startsWith('text/event-stream')) {\n throw new Error(\n \"Invalid response Content-Type for SSE stream. Expected 'text/event-stream'.\"\n );\n }\n\n yield* this._parseA2ASseStream<A2AStreamEventData>(response, clientRequestId);\n }\n\n /**\n * Sets or updates the push notification configuration for a given task.\n * Requires the agent to support push notifications (`capabilities.pushNotifications: true` in AgentCard).\n * @param params Parameters containing the taskId and the TaskPushNotificationConfig.\n * @returns A Promise resolving to SetTaskPushNotificationConfigResponse.\n */\n public async setTaskPushNotificationConfig(\n params: TaskPushNotificationConfig\n ): Promise<SetTaskPushNotificationConfigResponse> {\n const agentCard = await this.agentCardPromise;\n if (!agentCard.capabilities?.pushNotifications) {\n throw new Error(\n 'Agent does not support push notifications (AgentCard.capabilities.pushNotifications is not true).'\n );\n }\n return this._postRpcRequest<TaskPushNotificationConfig, SetTaskPushNotificationConfigResponse>(\n 'tasks/pushNotificationConfig/set',\n params\n );\n }\n\n /**\n * Gets the push notification configuration for a given task.\n * @param params Parameters containing the taskId.\n * @returns A Promise resolving to GetTaskPushNotificationConfigResponse.\n */\n public async getTaskPushNotificationConfig(\n params: TaskIdParams\n ): Promise<GetTaskPushNotificationConfigResponse> {\n return this._postRpcRequest<TaskIdParams, GetTaskPushNotificationConfigResponse>(\n 'tasks/pushNotificationConfig/get',\n params\n );\n }\n\n /**\n * Retrieves a task by its ID.\n * @param params Parameters containing the taskId and optional historyLength.\n * @returns A Promise resolving to GetTaskResponse, which contains the Task object or an error.\n */\n public async getTask(params: TaskQueryParams): Promise<GetTaskResponse> {\n return this._postRpcRequest<TaskQueryParams, GetTaskResponse>('tasks/get', params);\n }\n\n /**\n * Cancels a task by its ID.\n * @param params Parameters containing the taskId.\n * @returns A Promise resolving to CancelTaskResponse, which contains the updated Task object or an error.\n */\n public async cancelTask(params: TaskIdParams): Promise<CancelTaskResponse> {\n return this._postRpcRequest<TaskIdParams, CancelTaskResponse>('tasks/cancel', params);\n }\n\n /**\n * Resubscribes to a task's event stream using Server-Sent Events (SSE).\n * This is used if a previous SSE connection for an active task was broken.\n * Requires the agent to support streaming (`capabilities.streaming: true` in AgentCard).\n * @param params Parameters containing the taskId.\n * @returns An AsyncGenerator yielding A2AStreamEventData (Message, Task, TaskStatusUpdateEvent, or TaskArtifactUpdateEvent).\n */\n public async *resubscribeTask(\n params: TaskIdParams\n ): AsyncGenerator<A2AStreamEventData, void, undefined> {\n const agentCard = await this.agentCardPromise;\n if (!agentCard.capabilities?.streaming) {\n throw new Error('Agent does not support streaming (required for tasks/resubscribe).');\n }\n\n const endpoint = await this._getServiceEndpoint();\n const clientRequestId = this.requestIdCounter++; // Unique ID for this resubscribe request\n const rpcRequest: JSONRPCRequest = {\n jsonrpc: '2.0',\n method: 'tasks/resubscribe',\n params: params as { [key: string]: any },\n id: clientRequestId,\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n ...(this.options.headers || {}),\n },\n body: JSON.stringify(rpcRequest),\n });\n\n if (!response.ok) {\n let errorBody = '';\n try {\n errorBody = await response.text();\n const errorJson = JSON.parse(errorBody);\n if (errorJson.error) {\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}. RPC Error: ${errorJson.error.message} (Code: ${errorJson.error.code})`\n );\n }\n } catch (e: any) {\n if (e.message.startsWith('HTTP error establishing stream')) throw e;\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}. Response: ${errorBody || '(empty)'}`\n );\n }\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}`\n );\n }\n if (!response.headers.get('Content-Type')?.startsWith('text/event-stream')) {\n throw new Error(\n \"Invalid response Content-Type for SSE stream on resubscribe. Expected 'text/event-stream'.\"\n );\n }\n\n yield* this._parseA2ASseStream<A2AStreamEventData>(response, clientRequestId);\n }\n\n /**\n * Parses an HTTP response body as an A2A Server-Sent Event stream.\n * Each 'data' field of an SSE event is expected to be a JSON-RPC 2.0 Response object,\n * specifically a SendStreamingMessageResponse (or similar structure for resubscribe).\n * @param response The HTTP Response object whose body is the SSE stream.\n * @param originalRequestId The ID of the client's JSON-RPC request that initiated this stream.\n * Used to validate the `id` in the streamed JSON-RPC responses.\n * @returns An AsyncGenerator yielding the `result` field of each valid JSON-RPC success response from the stream.\n */\n private async *_parseA2ASseStream<TStreamItem>(\n response: Response,\n originalRequestId: number | string | null\n ): AsyncGenerator<TStreamItem, void, undefined> {\n if (!response.body) {\n throw new Error('SSE response body is undefined. Cannot read stream.');\n }\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();\n\n let buffer = ''; // Holds incomplete lines from the stream\n let eventDataBuffer = ''; // Holds accumulated 'data:' lines for the current event\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n logger.info({ done, value }, 'parseA2ASseStream');\n if (done) {\n if (eventDataBuffer.trim()) {\n const result = this._processSseEventData<TStreamItem>(\n eventDataBuffer,\n originalRequestId\n );\n yield result;\n }\n break; // Stream finished\n }\n\n buffer += value; // Append new chunk to buffer\n let lineEndIndex: number;\n lineEndIndex = buffer.indexOf('\\n');\n while (lineEndIndex >= 0) {\n const line = buffer.substring(0, lineEndIndex).trim(); // Get and trim the line\n buffer = buffer.substring(lineEndIndex + 1); // Remove processed line from buffer\n\n if (line === '') {\n if (eventDataBuffer) {\n const result = this._processSseEventData<TStreamItem>(\n eventDataBuffer,\n originalRequestId\n );\n yield result;\n eventDataBuffer = ''; // Reset buffer for the next event\n }\n } else if (line.startsWith('data:')) {\n eventDataBuffer += `${line.substring(5).trimStart()}\\n`; // Append data (multi-line data is possible)\n } else if (line.startsWith(':')) {\n } else if (line.includes(':')) {\n }\n lineEndIndex = buffer.indexOf('\\n'); // Update for next iteration\n }\n }\n } catch (error: any) {\n console.error('Error reading or parsing SSE stream:', error.message);\n throw error;\n } finally {\n reader.releaseLock(); // Ensure the reader lock is released\n }\n }\n\n /**\n * Processes a single SSE event's data string, expecting it to be a JSON-RPC response.\n * @param jsonData The string content from one or more 'data:' lines of an SSE event.\n * @param originalRequestId The ID of the client's request that initiated the stream.\n * @returns The `result` field of the parsed JSON-RPC success response.\n * @throws Error if data is not valid JSON, not a valid JSON-RPC response, an error response, or ID mismatch.\n */\n private _processSseEventData<TStreamItem>(\n jsonData: string,\n originalRequestId: number | string | null\n ): TStreamItem {\n if (!jsonData.trim()) {\n throw new Error('Attempted to process empty SSE event data.');\n }\n try {\n // SSE data can be multi-line, ensure it's treated as a single JSON string.\n const sseJsonRpcResponse = JSON.parse(jsonData.replace(/\\n$/, '')); // Remove trailing newline if any\n\n // Type assertion to SendStreamingMessageResponse, as this is the expected structure for A2A streams.\n const a2aStreamResponse = sseJsonRpcResponse as SendStreamingMessageResponse;\n\n if (a2aStreamResponse.id !== originalRequestId) {\n // According to JSON-RPC spec, notifications (which SSE events can be seen as) might not have an ID,\n // or if they do, it should match. A2A spec implies streamed events are tied to the initial request.\n console.warn(\n `SSE Event's JSON-RPC response ID mismatch. Client request ID: ${originalRequestId}, event response ID: ${a2aStreamResponse.id}.`\n );\n // Depending on strictness, this could be an error. For now, it's a warning.\n }\n\n if (a2aStreamResponse.error) {\n const err = a2aStreamResponse.error as JSONRPCError | A2AError;\n throw new Error(\n `SSE event contained an error: ${err.message} (Code: ${err.code}) Data: ${JSON.stringify(err.data)}`\n );\n }\n\n // Check if 'result' exists, as it's mandatory for successful JSON-RPC responses\n if (\n !('result' in a2aStreamResponse) ||\n typeof (a2aStreamResponse as SendStreamingMessageSuccessResponse).result === 'undefined'\n ) {\n throw new Error(`SSE event JSON-RPC response is missing 'result' field. Data: ${jsonData}`);\n }\n\n const successResponse = a2aStreamResponse as SendStreamingMessageSuccessResponse;\n return successResponse.result as TStreamItem;\n } catch (e: any) {\n // Catch errors from JSON.parse or if it's an error response that was thrown by this function\n if (\n e.message.startsWith('SSE event contained an error') ||\n e.message.startsWith(\"SSE event JSON-RPC response is missing 'result' field\")\n ) {\n throw e; // Re-throw errors already processed/identified by this function\n }\n // For other parsing errors or unexpected structures:\n console.error(\n 'Failed to parse SSE event data string or unexpected JSON-RPC structure:',\n jsonData,\n e\n );\n throw new Error(\n `Failed to parse SSE event data: \"${jsonData.substring(0, 100)}...\". Original error: ${e.message}`\n );\n }\n }\n}\n","import { z } from '@hono/zod-openapi';\nimport {\n ContextResolver,\n type CredentialStoreReference,\n type CredentialStoreRegistry,\n CredentialStuffer,\n createMessage,\n generateId,\n generateServiceToken,\n getCredentialReference,\n headers,\n type McpTool,\n SPAN_KEYS,\n TemplateEngine,\n} from '@inkeep/agents-core';\nimport { trace } from '@opentelemetry/api';\nimport { tool } from 'ai';\nimport { A2AClient } from '../a2a/client';\nimport {\n DELEGATION_TOOL_BACKOFF_EXPONENT,\n DELEGATION_TOOL_BACKOFF_INITIAL_INTERVAL_MS,\n DELEGATION_TOOL_BACKOFF_MAX_ELAPSED_TIME_MS,\n DELEGATION_TOOL_BACKOFF_MAX_INTERVAL_MS,\n} from '../constants/execution-limits';\nimport { saveA2AMessageResponse } from '../data/conversations';\nimport dbClient from '../data/db/dbClient';\nimport { getLogger } from '../logger';\nimport { agentSessionManager } from '../services/AgentSession';\nimport type { AgentConfig, DelegateRelation } from './Agent';\nimport { toolSessionManager } from './ToolSessionManager';\n\nconst logger = getLogger('relationships Tools');\n\n// Re-export A2A_RETRY_STATUS_CODES from agents-core for compatibility\nconst A2A_RETRY_STATUS_CODES = ['429', '500', '502', '503', '504'];\n\nconst generateTransferToolDescription = (config: AgentConfig): string => {\n // Generate tools section from the agent's available tools\n let toolsSection = '';\n\n // Generate transfer relations section\n let transferSection = '';\n if (config.transferRelations && config.transferRelations.length > 0) {\n const transferList = config.transferRelations\n .map(\n (transfer) =>\n ` - ${transfer.name || transfer.id}: ${transfer.description || 'No description available'}`\n )\n .join('\\n');\n\n transferSection = `\n\nCan Transfer To:\n${transferList}`;\n }\n\n // Generate delegate relations section\n let delegateSection = '';\n if (config.delegateRelations && config.delegateRelations.length > 0) {\n const delegateList = config.delegateRelations\n .map(\n (delegate) =>\n ` - ${delegate.config.name || delegate.config.id}: ${delegate.config.description || 'No description available'} (${delegate.type})`\n )\n .join('\\n');\n\n delegateSection = `\n\nCan Delegate To:\n${delegateList}`;\n }\n\n if (config.tools && config.tools.length > 0) {\n const toolDescriptions = config.tools\n .map((tool) => {\n const toolsList =\n tool.availableTools\n ?.map((t) => ` - ${t.name}: ${t.description || 'No description available'}`)\n .join('\\n') || '';\n return `MCP Server: ${tool.name}\\n${toolsList}`;\n })\n .join('\\n\\n');\n\n toolsSection = `\n\nAvailable Tools & Capabilities:\n${toolDescriptions}`;\n }\n\n const finalDescription = `Hand off the conversation to agent ${config.id}.\n\nAgent Information:\n- ID: ${config.id}\n- Name: ${config.name ?? 'No name provided'}\n- Description: ${config.description ?? 'No description provided'}${toolsSection}${transferSection}${delegateSection}\n\nHand off the conversation to agent ${config.id} when the user's request would be better handled by this specialized agent.`;\n\n return finalDescription;\n};\n\nconst generateDelegateToolDescription = (delegateRelation: DelegateRelation): string => {\n const config = delegateRelation.config;\n\n let toolsSection = '';\n let transferSection = '';\n let delegateSection = '';\n\n // For internal delegate relations (AgentConfig), include rich information\n if (delegateRelation.type === 'internal' && 'tools' in config) {\n const agentConfig = config as AgentConfig;\n\n // Generate tools section\n if (agentConfig.tools && agentConfig.tools.length > 0) {\n const toolDescriptions = agentConfig.tools\n .map((tool) => {\n const toolsList =\n tool.availableTools\n ?.map((t) => ` - ${t.name}: ${t.description || 'No description available'}`)\n .join('\\n') || '';\n return `MCP Server: ${tool.name}\\n${toolsList}`;\n })\n .join('\\n\\n');\n\n toolsSection = `\n\nAvailable Tools & Capabilities:\n${toolDescriptions}`;\n }\n\n // Generate transfer relations section\n if (agentConfig.transferRelations && agentConfig.transferRelations.length > 0) {\n const transferList = agentConfig.transferRelations\n .map(\n (transfer) =>\n ` - ${transfer.name || transfer.id}: ${transfer.description || 'No description available'}`\n )\n .join('\\n');\n\n transferSection = `\n\nCan Transfer To:\n${transferList}`;\n }\n\n // Generate delegate relations section\n if (agentConfig.delegateRelations && agentConfig.delegateRelations.length > 0) {\n const delegateList = agentConfig.delegateRelations\n .map(\n (delegate) =>\n ` - ${delegate.config.name || delegate.config.id}: ${delegate.config.description || 'No description available'} (${delegate.type})`\n )\n .join('\\n');\n\n delegateSection = `\n\nCan Delegate To:\n${delegateList}`;\n }\n }\n\n const finalDescription = `Delegate a specific task to another agent.\n\nAgent Information:\n- ID: ${config.id}\n- Name: ${config.name}\n- Description: ${config.description || 'No description provided'}\n- Type: ${delegateRelation.type}${toolsSection}${transferSection}${delegateSection}\n\nDelegate a specific task to agent ${config.id} when it seems like the agent can do relevant work.`;\n\n return finalDescription;\n};\n\nexport const createTransferToAgentTool = ({\n transferConfig,\n callingAgentId,\n subAgent,\n streamRequestId,\n}: {\n transferConfig: AgentConfig;\n callingAgentId: string;\n subAgent: any; // Will be properly typed as Agent, but avoiding circular import\n streamRequestId?: string;\n}) => {\n const toolDescription = generateTransferToolDescription(transferConfig);\n\n return tool({\n description: toolDescription,\n inputSchema: z.object({}),\n execute: async () => {\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.setAttributes({\n [SPAN_KEYS.TRANSFER_FROM_SUB_AGENT_ID]: callingAgentId,\n [SPAN_KEYS.TRANSFER_TO_SUB_AGENT_ID]: transferConfig.id ?? 'unknown',\n });\n }\n\n logger.info(\n {\n transferTo: transferConfig.id ?? 'unknown',\n fromSubAgent: callingAgentId,\n },\n 'invoked transferToAgentTool'\n );\n\n if (streamRequestId) {\n agentSessionManager.recordEvent(streamRequestId, 'transfer', callingAgentId, {\n fromSubAgent: callingAgentId,\n targetSubAgent: transferConfig.id ?? 'unknown',\n reason: `Transfer to ${transferConfig.name || transferConfig.id}`,\n });\n }\n\n const transferResult = {\n type: 'transfer',\n targetSubAgentId: transferConfig.id ?? 'unknown', // Changed from \"target\" for type safety\n fromSubAgentId: callingAgentId, // Include the calling agent ID for tracking\n };\n\n logger.info(\n {\n transferResult,\n transferResultKeys: Object.keys(transferResult),\n },\n '[DEBUG] Transfer tool returning'\n );\n\n return transferResult;\n },\n });\n};\n\nexport function createDelegateToAgentTool({\n delegateConfig,\n callingAgentId,\n tenantId,\n projectId,\n agentId,\n contextId,\n metadata,\n sessionId,\n subAgent,\n credentialStoreRegistry,\n}: {\n delegateConfig: DelegateRelation;\n callingAgentId: string;\n tenantId: string;\n projectId: string;\n agentId: string;\n contextId: string;\n metadata: {\n conversationId: string;\n threadId: string;\n streamRequestId?: string;\n streamBaseUrl?: string;\n apiKey?: string;\n };\n sessionId?: string;\n subAgent: any; // Will be properly typed as Agent, but avoiding circular import\n credentialStoreRegistry?: CredentialStoreRegistry;\n}) {\n return tool({\n description: generateDelegateToolDescription(delegateConfig),\n inputSchema: z.object({ message: z.string() }),\n execute: async (input: { message: string }, context?: any) => {\n const delegationId = `del_${generateId()}`;\n\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.setAttributes({\n [SPAN_KEYS.DELEGATION_FROM_SUB_AGENT_ID]: callingAgentId,\n [SPAN_KEYS.DELEGATION_TO_SUB_AGENT_ID]: delegateConfig.config.id ?? 'unknown',\n [SPAN_KEYS.DELEGATION_ID]: delegationId,\n });\n }\n\n if (metadata.streamRequestId) {\n agentSessionManager.recordEvent(\n metadata.streamRequestId,\n 'delegation_sent',\n callingAgentId,\n {\n delegationId,\n fromSubAgent: callingAgentId,\n targetSubAgent: delegateConfig.config.id,\n taskDescription: input.message,\n }\n );\n }\n\n const isInternal = delegateConfig.type === 'internal';\n const isExternal = delegateConfig.type === 'external';\n const isTeam = delegateConfig.type === 'team';\n\n let resolvedHeaders: Record<string, string> = {};\n\n if (isExternal) {\n if (\n (delegateConfig.config.credentialReferenceId || delegateConfig.config.headers) &&\n credentialStoreRegistry\n ) {\n const contextResolver = new ContextResolver(\n tenantId,\n projectId,\n dbClient,\n credentialStoreRegistry\n );\n const credentialStuffer = new CredentialStuffer(credentialStoreRegistry, contextResolver);\n\n const credentialContext = {\n tenantId,\n projectId,\n conversationId: metadata.conversationId,\n contextConfigId: contextId,\n metadata: metadata as Record<string, unknown>,\n };\n\n let storeReference: CredentialStoreReference | undefined;\n if (delegateConfig.config.credentialReferenceId) {\n const credentialReference = await getCredentialReference(dbClient)({\n scopes: {\n tenantId,\n projectId,\n },\n id: delegateConfig.config.credentialReferenceId,\n });\n if (credentialReference) {\n storeReference = {\n credentialStoreId: credentialReference.credentialStoreId,\n retrievalParams: credentialReference.retrievalParams || {},\n };\n }\n }\n resolvedHeaders = await credentialStuffer.getCredentialHeaders({\n context: credentialContext,\n storeReference,\n headers: delegateConfig.config.headers || undefined,\n });\n }\n } else if (isTeam) {\n const contextResolver = new ContextResolver(\n tenantId,\n projectId,\n dbClient,\n credentialStoreRegistry\n );\n const context = await contextResolver.resolveHeaders(metadata.conversationId, contextId);\n\n for (const [key, value] of Object.entries(headers)) {\n resolvedHeaders[key] = TemplateEngine.render(value, context, { strict: true });\n }\n\n resolvedHeaders.Authorization = `Bearer ${await generateServiceToken({\n tenantId,\n projectId,\n originAgentId: agentId,\n targetAgentId: delegateConfig.config.id,\n })}`;\n } else {\n resolvedHeaders = {\n Authorization: `Bearer ${metadata.apiKey}`,\n 'x-inkeep-tenant-id': tenantId,\n 'x-inkeep-project-id': projectId,\n 'x-inkeep-agent-id': agentId,\n 'x-inkeep-sub-agent-id': delegateConfig.config.id,\n };\n }\n\n const a2aClient = new A2AClient(delegateConfig.config.baseUrl, {\n headers: resolvedHeaders,\n retryConfig: {\n strategy: 'backoff',\n retryConnectionErrors: true,\n statusCodes: [...A2A_RETRY_STATUS_CODES],\n backoff: {\n initialInterval: DELEGATION_TOOL_BACKOFF_INITIAL_INTERVAL_MS,\n maxInterval: DELEGATION_TOOL_BACKOFF_MAX_INTERVAL_MS,\n exponent: DELEGATION_TOOL_BACKOFF_EXPONENT,\n maxElapsedTime: DELEGATION_TOOL_BACKOFF_MAX_ELAPSED_TIME_MS,\n },\n },\n });\n\n const messageToSend = {\n role: 'agent' as const,\n parts: [{ text: input.message, kind: 'text' as const }],\n messageId: generateId(),\n kind: 'message' as const,\n contextId,\n metadata: {\n ...metadata, // Keep all metadata including streamRequestId\n isDelegation: true, // Flag to prevent streaming in delegated agents\n delegationId, // Include delegation ID for tracking\n ...(isInternal\n ? { fromSubAgentId: callingAgentId }\n : { fromExternalAgentId: callingAgentId }),\n },\n };\n logger.info({ messageToSend }, 'messageToSend');\n\n await createMessage(dbClient)({\n id: generateId(),\n tenantId: tenantId,\n projectId: projectId,\n conversationId: contextId,\n role: 'agent',\n content: {\n text: input.message,\n },\n visibility: isInternal ? 'internal' : 'external',\n messageType: 'a2a-request',\n fromSubAgentId: callingAgentId,\n ...(isInternal\n ? { toSubAgentId: delegateConfig.config.id }\n : { toExternalAgentId: delegateConfig.config.id }),\n });\n\n const response = await a2aClient.sendMessage({\n message: messageToSend,\n });\n\n if (response.error) {\n throw new Error(response.error.message);\n }\n\n await saveA2AMessageResponse(response, {\n tenantId,\n projectId,\n conversationId: contextId,\n messageType: 'a2a-response',\n visibility: isInternal ? 'internal' : 'external',\n toSubAgentId: callingAgentId,\n ...(isInternal\n ? { fromSubAgentId: delegateConfig.config.id }\n : { fromExternalAgentId: delegateConfig.config.id }),\n });\n\n if (sessionId && context?.toolCallId) {\n const toolResult = {\n toolCallId: context.toolCallId,\n toolName: `delegate_to_${delegateConfig.config.id}`,\n args: input,\n result: response.result,\n timestamp: Date.now(),\n };\n toolSessionManager.recordToolResult(sessionId, toolResult);\n }\n\n if (metadata.streamRequestId) {\n agentSessionManager.recordEvent(\n metadata.streamRequestId,\n 'delegation_returned',\n callingAgentId,\n {\n delegationId,\n fromSubAgent: delegateConfig.config.id,\n targetSubAgent: callingAgentId,\n result: response.result,\n }\n );\n }\n\n return {\n toolCallId: context?.toolCallId,\n result: response.result,\n };\n },\n });\n}\n","import { getLogger } from '../logger';\nimport type { VersionConfig } from './types';\n\nconst logger = getLogger('SystemPromptBuilder');\n\nexport class SystemPromptBuilder<TConfig> {\n private templates = new Map<string, string>();\n private loaded = false;\n\n constructor(\n private version: string,\n private versionConfig: VersionConfig<TConfig>\n ) {}\n\n private loadTemplates(): void {\n if (this.loaded) return;\n\n try {\n // Delegate template loading to the version config\n const loadedTemplates = this.versionConfig.loadTemplates();\n\n // Copy templates to our internal map\n for (const [name, content] of loadedTemplates) {\n this.templates.set(name, content);\n }\n\n this.loaded = true;\n logger.debug(\n { templateCount: this.templates.size, version: this.version },\n `Loaded ${this.templates.size} templates for version ${this.version}`\n );\n } catch (error) {\n logger.error({ error }, `Failed to load templates for version ${this.version}`);\n throw new Error(`Template loading failed: ${error}`);\n }\n }\n\n public buildSystemPrompt(config: TConfig): string {\n this.loadTemplates();\n\n // Validate that all required template variables are present\n this.validateTemplateVariables(config);\n\n // Let the version config handle assembly\n return this.versionConfig.assemble(this.templates, config);\n }\n\n private validateTemplateVariables(config: TConfig): void {\n if (!config) {\n throw new Error('Configuration object is required');\n }\n\n // Basic validation - version configs can add their own validation\n if (typeof config !== 'object') {\n throw new Error('Configuration must be an object');\n }\n }\n\n public getLoadedTemplates(): string[] {\n return Array.from(this.templates.keys());\n }\n\n public isLoaded(): boolean {\n return this.loaded;\n }\n}\n","import type { Artifact, McpTool } from '@inkeep/agents-core';\nimport { convertZodToJsonSchema, isZodSchema } from '@inkeep/agents-core/utils/schema-conversion';\nimport systemPromptTemplate from '../../../../templates/v1/phase1/system-prompt.xml?raw';\nimport thinkingPreparationTemplate from '../../../../templates/v1/phase1/thinking-preparation.xml?raw';\nimport toolTemplate from '../../../../templates/v1/phase1/tool.xml?raw';\nimport artifactTemplate from '../../../../templates/v1/shared/artifact.xml?raw';\nimport artifactRetrievalGuidance from '../../../../templates/v1/shared/artifact-retrieval-guidance.xml?raw';\n\nimport { getLogger } from '../../../logger';\nimport type { SystemPromptV1, ToolData, VersionConfig } from '../../types';\n\nconst _logger = getLogger('Phase1Config');\n\nexport class Phase1Config implements VersionConfig<SystemPromptV1> {\n loadTemplates(): Map<string, string> {\n const templates = new Map<string, string>();\n\n templates.set('system-prompt', systemPromptTemplate);\n templates.set('tool', toolTemplate);\n templates.set('artifact', artifactTemplate);\n templates.set('artifact-retrieval-guidance', artifactRetrievalGuidance);\n templates.set('thinking-preparation', thinkingPreparationTemplate);\n\n return templates;\n }\n\n static convertMcpToolsToToolData(mcpTools: McpTool[] | undefined): ToolData[] {\n if (!mcpTools || mcpTools.length === 0) {\n return [];\n }\n const toolData: ToolData[] = [];\n for (const mcpTool of mcpTools) {\n if (mcpTool.availableTools) {\n for (const toolDef of mcpTool.availableTools) {\n toolData.push({\n name: toolDef.name,\n description: toolDef.description || 'No description available',\n inputSchema: toolDef.inputSchema || {},\n usageGuidelines: `Use this tool from ${mcpTool.name} server when appropriate.`,\n });\n }\n }\n }\n return toolData;\n }\n\n private isToolDataArray(tools: ToolData[] | McpTool[]): tools is ToolData[] {\n if (!tools || tools.length === 0) return true; // Default to ToolData[] for empty arrays\n const firstItem = tools[0];\n return 'usageGuidelines' in firstItem && !('config' in firstItem);\n }\n\n private normalizeSchema(inputSchema: any): Record<string, unknown> {\n if (!inputSchema || typeof inputSchema !== 'object') {\n return inputSchema || {};\n }\n\n if (isZodSchema(inputSchema)) {\n try {\n return convertZodToJsonSchema(inputSchema);\n } catch (error) {\n return {};\n }\n }\n\n return inputSchema;\n }\n\n assemble(templates: Map<string, string>, config: SystemPromptV1): string {\n const systemPromptTemplate = templates.get('system-prompt');\n if (!systemPromptTemplate) {\n throw new Error('System prompt template not loaded');\n }\n\n let systemPrompt = systemPromptTemplate;\n\n // Handle core instructions - omit entire section if empty\n if (config.corePrompt && config.corePrompt.trim()) {\n systemPrompt = systemPrompt.replace('{{CORE_INSTRUCTIONS}}', config.corePrompt);\n } else {\n // Remove the entire core_instructions section if empty\n systemPrompt = systemPrompt.replace(\n /<core_instructions>\\s*\\{\\{CORE_INSTRUCTIONS\\}\\}\\s*<\\/core_instructions>/g,\n ''\n );\n }\n\n const agentContextSection = this.generateAgentContextSection(config.prompt);\n systemPrompt = systemPrompt.replace('{{AGENT_CONTEXT_SECTION}}', agentContextSection);\n\n const rawToolData = this.isToolDataArray(config.tools)\n ? config.tools\n : Phase1Config.convertMcpToolsToToolData(config.tools as McpTool[]);\n\n // Normalize any Zod schemas to JSON schemas\n const toolData = rawToolData.map((tool) => ({\n ...tool,\n inputSchema: this.normalizeSchema(tool.inputSchema),\n }));\n\n const hasArtifactComponents = config.artifactComponents && config.artifactComponents.length > 0;\n\n const artifactsSection = this.generateArtifactsSection(\n templates,\n config.artifacts,\n hasArtifactComponents,\n config.artifactComponents,\n config.hasAgentArtifactComponents\n );\n\n systemPrompt = systemPrompt.replace('{{ARTIFACTS_SECTION}}', artifactsSection);\n\n const toolsSection = this.generateToolsSection(templates, toolData);\n systemPrompt = systemPrompt.replace('{{TOOLS_SECTION}}', toolsSection);\n\n const thinkingPreparationSection = this.generateThinkingPreparationSection(\n templates,\n config.isThinkingPreparation\n );\n systemPrompt = systemPrompt.replace(\n '{{THINKING_PREPARATION_INSTRUCTIONS}}',\n thinkingPreparationSection\n );\n\n const transferSection = this.generateTransferInstructions(config.hasTransferRelations);\n systemPrompt = systemPrompt.replace('{{TRANSFER_INSTRUCTIONS}}', transferSection);\n\n const delegationSection = this.generateDelegationInstructions(config.hasDelegateRelations);\n systemPrompt = systemPrompt.replace('{{DELEGATION_INSTRUCTIONS}}', delegationSection);\n\n return systemPrompt;\n }\n\n private generateAgentContextSection(prompt?: string): string {\n if (!prompt || prompt.trim() === '') {\n return '';\n }\n\n return `\n <agent_context>\n ${prompt}\n </agent_context>`;\n }\n\n private generateThinkingPreparationSection(\n templates: Map<string, string>,\n isThinkingPreparation?: boolean\n ): string {\n if (!isThinkingPreparation) {\n return '';\n }\n\n const thinkingPreparationTemplate = templates.get('thinking-preparation');\n if (!thinkingPreparationTemplate) {\n throw new Error('Thinking preparation template not loaded');\n }\n\n return thinkingPreparationTemplate;\n }\n\n private generateTransferInstructions(hasTransferRelations?: boolean): string {\n if (!hasTransferRelations) {\n return '';\n }\n\n return `You are part of a single unified assistant composed of specialized agents. To the user, you must always appear as one continuous, confident voice.\n\nYou have transfer_to_* tools that seamlessly continue the conversation. When you determine another agent should handle a request: ONLY call the appropriate transfer_to_* tool. Do not provide any substantive answer, limitation, or explanation before transferring. NEVER announce, describe, or apologize for a transfer.\n\nDo NOT stream any text when transferring - call the transfer tool IMMEDIATELY. Do NOT acknowledge the request, do NOT say \"Looking into that...\", \"Let me search...\", \"I'll help you find...\", or provide ANY explanatory text. Place all reasoning or handoff details inside the transfer tool call, not in the user message. The tool call is sufficient - no additional text should be generated.\n\nCRITICAL: When you receive a user message that ends with \"Please continue from where this conversation was left off\" - this indicates you are continuing a conversation that another agent started. You should:\n- Review the conversation history to see what was already communicated to the user\n- Continue seamlessly from where the previous response left off\n- Do NOT repeat what was already said in the conversation history\n- Do NOT announce what you're about to do (\"Let me search...\", \"I'll look for...\", etc.)\n- Proceed directly with the appropriate tool or action\n- Act as if you have been handling the conversation from the beginning\n\nWhen receiving any transfer, act as if you have been engaged from the start. Continue the same tone, context, and style. Never reference other agents, tools, or roles.\n\nYour goal: preserve the illusion of a single, seamless, intelligent assistant. All user-facing behavior must feel like one continuous conversation, regardless of internal transfers.\n`;\n }\n\n private generateDelegationInstructions(hasDelegateRelations?: boolean): string {\n if (!hasDelegateRelations) {\n return '';\n }\n\n return `- You have delegate_to_* tools that perform specialized tasks\n- Treat these exactly like other tools - call them to get results\n- Present results as YOUR work: \"I found\", \"I've analyzed\"\n- NEVER say you're delegating or that another agent helped`;\n }\n\n private getArtifactCreationGuidance(): string {\n return `🚨 MANDATORY ARTIFACT CREATION 🚨\nYou MUST create artifacts from tool results to provide citations. This is REQUIRED, not optional.\nEvery piece of information from tools MUST be backed by an artifact creation.\n\nCRITICAL CITATION REQUIREMENTS FOR AGENTS WITH CREATION ABILITY:\n- Information FROM tool results = MUST create artifact citation\n- Information BASED ON tool results = MUST create artifact citation\n- Analysis OF tool results = MUST create artifact citation \n- Summaries OF tool results = MUST create artifact citation\n- NO INFORMATION from tool results can be presented without creating artifact citation\n\nCRITICAL: ARTIFACTS MUST BE CREATED FIRST\nYou MUST create an artifact before you can reference it. You cannot reference artifacts that don't exist yet.\n\nCRITICAL CITATION PRINCIPLE:\nCreating an artifact IS a citation. Only reference again when citing the SAME artifact for a different statement.\n\nCRITICAL: ALWAYS SELECT SINGLE ITEMS, NEVER ARRAYS\n\nSELECTOR REQUIREMENTS:\n- MUST select ONE specific item, never an array \n- Use filtering: result.items[?title=='API Guide']\n- Use exact matching: result.documents[?name=='Setup Instructions'] \n- Target specific fields: result.content[?section=='authentication']\n\nCRITICAL: SELECTOR HIERARCHY\n- base_selector: Points to ONE specific item in the tool result\n- details_selector: Contains JMESPath selectors RELATIVE to the base selector\n- Example: If base=\"result.documents[?type=='api']\" then details_selector uses \"title\" not \"documents[0].title\"\n\nCOMMON FAILURE POINTS (AVOID THESE):\n1. **Array Selection**: result.items (returns array) ❌\n → Fix: result.items[?type=='guide'] (returns single item) ✅\n\n2. **Similar Key Names**: \"title\" vs \"name\" vs \"heading\"\n → Always check the actual field names in tool results\n\n3. **Repeated Keys**: Multiple items with same \"title\" field\n → Use more specific filters: [?title=='Guide' && section=='setup']\n\n4. **Case Sensitivity**: 'Guide' vs 'guide'\n → Match exact case from tool results\n\n5. **Missing Nested Levels**: \"content.text\" when it's \"body.content.text\"\n → Include all intermediate levels`;\n }\n\n private getArtifactReferencingRules(\n hasArtifactComponents: boolean = false,\n templates?: Map<string, string>,\n shouldShowReferencingRules: boolean = true\n ): string {\n if (!shouldShowReferencingRules) {\n return '';\n }\n const sharedGuidance = templates?.get('artifact-retrieval-guidance') || '';\n\n if (hasArtifactComponents) {\n return `${sharedGuidance}\n\nARTIFACT MANAGEMENT FOR TEXT RESPONSES:\n\nYou will create and reference artifacts using inline annotations in your text response.\n\nCREATING ARTIFACTS (SERVES AS CITATION):\nUse the artifact:create annotation to extract data from tool results. The creation itself serves as a citation.\nFormat: <artifact:create id=\"unique-id\" tool=\"tool_call_id\" type=\"TypeName\" base=\"selector.path\" details='{\"key\":\"jmespath_selector\"}' />\n\n⚠️ IMPORTANT: Do not create artifacts from get_reference_artifact tool results - these are already compressed artifacts being retrieved. Only create artifacts from original research and analysis tools.\n\n🚨 CRITICAL: DETAILS PROPS USE JMESPATH SELECTORS, NOT LITERAL VALUES! 🚨\n\n❌ WRONG - Using literal values:\ndetails='{\"title\":\"API Documentation\",\"type\":\"guide\"}'\n\n✅ CORRECT - Using JMESPath selectors (relative to base selector):\ndetails='{\"title\":\"metadata.title\",\"doc_type\":\"document_type\",\"description\":\"content.description\",\"main_text\":\"content.text\",\"author\":\"metadata.author\"}'\n\nThe selectors extract actual field values from the data structure selected by your base selector.\n\nTHE details PROPERTY MUST CONTAIN JMESPATH SELECTORS THAT EXTRACT DATA FROM THE TOOL RESULT!\n- details: Contains JMESPath selectors relative to the base selector that map to artifact schema fields\n- These selectors are evaluated against the tool result to extract the actual values\n- The system automatically determines which fields are preview vs full based on the artifact schema\n- NEVER put literal values like \"Inkeep\" or \"2023\" - always use selectors like \"metadata.company\" or \"founded_year\"\n\n🚫 FORBIDDEN JMESPATH PATTERNS:\n❌ NEVER: [?title~'.*text.*'] (regex patterns with ~ operator)\n❌ NEVER: [?field~'pattern.*'] (any ~ operator usage)\n❌ NEVER: [?title~'Slack.*Discord.*'] (regex wildcards)\n❌ NEVER: [?name~'https://.*'] (regex in URL matching)\n❌ NEVER: [?text ~ contains(@, 'word')] (~ with @ operator)\n❌ NEVER: contains(@, 'text') (@ operator usage)\n❌ NEVER: [?field==\"value\"] (double quotes in filters)\n❌ NEVER: [?field==\\'value\\'] (escaped quotes in filters) \n❌ NEVER: [?field=='\\\"'\\\"'value'\\\"'\\\"'] (nightmare quote mixing)\n❌ NEVER: result.items[?type=='doc'][?status=='active'] (chained filters)\n\n✅ CORRECT JMESPATH SYNTAX:\n✅ [?contains(title, 'text')] (contains function)\n✅ [?title=='exact match'] (exact string matching)\n✅ [?contains(title, 'Slack') && contains(title, 'Discord')] (compound conditions)\n✅ [?starts_with(url, 'https://')] (starts_with function)\n✅ [?type=='doc' && status=='active'] (single filter with &&)\n✅ [?contains(text, 'Founder')] (contains haystack, needle format)\n✅ source.content[?contains(text, 'Founder')].text (correct filter usage)\n\n🚨 MANDATORY QUOTE PATTERN - FOLLOW EXACTLY:\n- ALWAYS: base=\"path[?field=='value']\" (double quotes outside, single inside)\n- This is the ONLY allowed pattern - any other pattern WILL FAIL\n- NEVER escape quotes, NEVER mix quote types, NEVER use complex quoting\n\n🚨 CRITICAL: EXAMINE TOOL RESULTS BEFORE CREATING SELECTORS! 🚨\n\nSTEP 1: INSPECT THE ACTUAL DATA FIRST\n- ALWAYS look at the tool result data before creating any selectors\n- Check _structureHints.exampleSelectors for real working paths that you can copy\n- Look at what titles, record_types, and field names actually exist in the data\n- Don't assume field names or values based on the user's question\n\nSTEP 2: USE STRUCTURE HINTS AS YOUR SELECTOR GUIDE \n- The _structureHints.exampleSelectors show you exactly what selectors work with this data\n- Copy and modify the patterns from exampleSelectors that target your needed data\n- Use the commonFields list to see what field names are available\n- Follow the exact path structure indicated by the hints\n\nSTEP 3: MATCH ACTUAL VALUES, NOT ASSUMPTIONS\n- Look for real titles in the data like \"Inkeep\", \"Team\", \"About Us\", \"API Guide\" \n- Check actual record_type values like \"site\", \"documentation\", \"blog\"\n- Use exact matches from the real data structure, not guessed patterns\n- If looking for team info, it might be in a document titled \"Inkeep\" with record_type=\"site\"\n\nSTEP 4: VALIDATE YOUR SELECTORS AGAINST THE DATA\n- Your base selector must match actual documents in the result\n- Test your logic: does result.structuredContent.content contain items with your target values?\n- Use compound conditions when needed: [?title=='Inkeep' && record_type=='site']\n\nEXAMPLE PATTERNS FOR BASE SELECTORS:\n❌ WRONG: result.items[?contains(title, \"guide\")] (assumes field values + wrong quotes)\n❌ WRONG: result.data[?type==\"document\"] (double quotes invalid in JMESPath)\n✅ CORRECT: result.structuredContent.content[0] (select first item)\n✅ CORRECT: result.items[?type=='document'][0] (filter by type, single quotes!)\n✅ CORRECT: result.data[?category=='api'][0] (filter by category)\n✅ CORRECT: result.documents[?status=='published'][0] (filter by status)\n\nREFERENCING ARTIFACTS (WHEN CITING AGAIN):\nOnly use artifact:ref when you need to cite the SAME artifact again for a different statement or context.\nFormat: <artifact:ref id=\"artifact-id\" tool=\"tool_call_id\" />\n\nEXAMPLE TEXT RESPONSE:\n\"I found the authentication documentation. <artifact:create id='auth-doc-1' tool='call_xyz789' type='APIDoc' base=\"result.documents[?type=='auth']\" details='{\"title\":\"metadata.title\",\"endpoint\":\"api.endpoint\",\"description\":\"content.description\",\"parameters\":\"spec.parameters\",\"examples\":\"examples.sample_code\"}' /> The documentation explains OAuth 2.0 implementation in detail.\n\nThe process involves three main steps: registration, token exchange, and API calls. As mentioned in the authentication documentation <artifact:ref id='auth-doc-1' tool='call_xyz789' />, you'll need to register your application first.\"\n\n${this.getArtifactCreationGuidance()}\n\nARTIFACT ANNOTATION PLACEMENT:\n- ALWAYS place annotations AFTER complete sentences and punctuation\n- Never interrupt the flow of a sentence with an annotation\n- Complete your thought, add punctuation, then place the annotation\n- This ensures professional, readable responses\n\nIMPORTANT GUIDELINES:\n- Create artifacts inline as you discuss the information\n- Use exact tool_call_id from tool execution results\n- Each artifact:create establishes a citable source\n- Use artifact:ref for subsequent references to the same artifact\n- Annotations are automatically converted to interactive elements`;\n }\n\n if (!hasArtifactComponents) {\n return `${sharedGuidance}\n\nARTIFACT REFERENCING FOR TEXT RESPONSES:\n\nYou can reference existing artifacts but cannot create new ones.\n\nHOW TO REFERENCE ARTIFACTS:\nUse the artifact:ref annotation to reference existing artifacts.\nFormat: <artifact:ref id=\"artifact-id\" tool=\"tool_call_id\" />\n\nEXAMPLE TEXT RESPONSE:\n\"Based on the authentication guide <artifact:ref id='existing-auth-guide' tool='call_previous456' /> that was previously collected, the API uses OAuth 2.0.\n\nThe implementation details show that you need to register your application first and obtain client credentials. <artifact:ref id='existing-impl-doc' tool='toolu_previous789' />\n\nFor error handling, you can refer to the comprehensive error documentation. <artifact:ref id='existing-error-doc' tool='call_previous012' /> This lists all possible authentication errors and their solutions.\"\n\nEXAMPLE REFERENCING DELEGATION ARTIFACTS:\nAfter receiving a delegation response with artifacts, reference them naturally:\n\n\"I've gathered the requested data for you. The analysis <artifact:ref id='analysis-results' tool='toolu_abc123' /> shows significant improvements across all metrics.\n\nLooking at the detailed breakdown <artifact:ref id='performance-metrics' tool='toolu_def456' />, the processing time has decreased by 40% while maintaining accuracy.\"\n\nIMPORTANT GUIDELINES:\n- You can only reference artifacts that already exist or were returned from delegations\n- Use artifact:ref annotations in your text with the exact artifactId and toolCallId\n- References are automatically converted to interactive elements`;\n }\n\n return '';\n }\n\n private getArtifactCreationInstructions(\n hasArtifactComponents: boolean,\n artifactComponents?: any[]\n ): string {\n if (!hasArtifactComponents || !artifactComponents || artifactComponents.length === 0) {\n return '';\n }\n\n const typeDescriptions = artifactComponents\n .map((ac) => {\n let schemaDescription = 'No schema defined';\n\n if (ac.props?.properties) {\n const fieldDetails = Object.entries(ac.props.properties)\n .map(([key, value]: [string, any]) => {\n const inPreview = value.inPreview ? ' [PREVIEW]' : ' [FULL]';\n return `${key} (${value.description || value.type || 'field'})${inPreview}`;\n })\n .join(', ');\n schemaDescription = `Fields: ${fieldDetails}`;\n }\n\n return ` - \"${ac.name}\": ${ac.description || 'No description available'}\n ${schemaDescription}`;\n })\n .join('\\n\\n');\n\n return `\nAVAILABLE ARTIFACT TYPES:\n\n${typeDescriptions}\n\n🚨 CRITICAL: DETAILS PROPS MUST MATCH THE ARTIFACT SCHEMA! 🚨\n- Only use property names that are defined in the artifact component schema above\n- Do NOT make up arbitrary property names like \"founders\", \"nick_details\", \"year\" \n- Each artifact type has specific fields defined in its schema\n- Your JMESPath selectors must extract values for these exact schema-defined properties\n- Example: If schema defines \"title\" and \"url\", use details='{\"title\":\"title\",\"url\":\"url\"}' not made-up names\n- The system will automatically determine which fields are preview vs full based on schema configuration\n\n🚨 CRITICAL: USE EXACT ARTIFACT TYPE NAMES IN QUOTES! 🚨\n- MUST use the exact type name shown in quotes above\n- Copy the exact string between the quotes, including any capitalization\n- The type= parameter in artifact:create MUST match exactly what is listed above\n- Do NOT abbreviate, modify, or guess the type name\n- Copy the exact quoted name from the \"AVAILABLE ARTIFACT TYPES\" list above`;\n }\n\n private generateArtifactsSection(\n templates: Map<string, string>,\n artifacts: Artifact[],\n hasArtifactComponents: boolean = false,\n artifactComponents?: any[],\n hasAgentArtifactComponents?: boolean\n ): string {\n const shouldShowReferencingRules = hasAgentArtifactComponents || artifacts.length > 0;\n const rules = this.getArtifactReferencingRules(\n hasArtifactComponents,\n templates,\n shouldShowReferencingRules\n );\n const creationInstructions = this.getArtifactCreationInstructions(\n hasArtifactComponents,\n artifactComponents\n );\n\n if (artifacts.length === 0) {\n return `<available_artifacts description=\"No artifacts are currently available, but you may create them during execution.\n\n${rules}\n\n${creationInstructions}\n\n\"></available_artifacts>`;\n }\n\n const artifactsXml = artifacts\n .map((artifact) => this.generateArtifactXml(templates, artifact))\n .join('\\n ');\n\n return `<available_artifacts description=\"These are the artifacts available for you to use in generating responses.\n\n${rules}\n\n${creationInstructions}\n\n\">\n ${artifactsXml}\n</available_artifacts>`;\n }\n\n private generateArtifactXml(templates: Map<string, string>, artifact: Artifact): string {\n const artifactTemplate = templates.get('artifact');\n if (!artifactTemplate) {\n throw new Error('Artifact template not loaded');\n }\n\n let artifactXml = artifactTemplate;\n\n const summaryData =\n artifact.parts?.map((part: any) => part.data?.summary).filter(Boolean) || [];\n const artifactSummary =\n summaryData.length > 0 ? JSON.stringify(summaryData, null, 2) : 'No summary data available';\n\n artifactXml = artifactXml.replace('{{ARTIFACT_NAME}}', artifact.name || '');\n artifactXml = artifactXml.replace('{{ARTIFACT_DESCRIPTION}}', artifact.description || '');\n artifactXml = artifactXml.replace('{{TASK_ID}}', artifact.taskId || '');\n artifactXml = artifactXml.replace('{{ARTIFACT_ID}}', artifact.artifactId || '');\n artifactXml = artifactXml.replace('{{TOOL_CALL_ID}}', artifact.toolCallId || 'unknown');\n artifactXml = artifactXml.replace('{{ARTIFACT_SUMMARY}}', artifactSummary);\n\n return artifactXml;\n }\n\n private generateToolsSection(templates: Map<string, string>, tools: ToolData[]): string {\n if (tools.length === 0) {\n return '<available_tools description=\"No tools are currently available\"></available_tools>';\n }\n\n const toolsXml = tools.map((tool) => this.generateToolXml(templates, tool)).join('\\n ');\n return `<available_tools description=\"These are the tools available for you to use to accomplish tasks\">\n ${toolsXml}\n</available_tools>`;\n }\n\n private generateToolXml(templates: Map<string, string>, tool: ToolData): string {\n const toolTemplate = templates.get('tool');\n if (!toolTemplate) {\n throw new Error('Tool template not loaded');\n }\n\n let toolXml = toolTemplate;\n\n toolXml = toolXml.replace('{{TOOL_NAME}}', tool.name);\n toolXml = toolXml.replace(\n '{{TOOL_DESCRIPTION}}',\n tool.description || 'No description available'\n );\n toolXml = toolXml.replace(\n '{{TOOL_USAGE_GUIDELINES}}',\n tool.usageGuidelines || 'Use this tool when appropriate.'\n );\n\n const parametersXml = this.generateParametersXml(tool.inputSchema);\n toolXml = toolXml.replace('{{TOOL_PARAMETERS_SCHEMA}}', parametersXml);\n\n return toolXml;\n }\n\n private generateParametersXml(inputSchema: Record<string, unknown> | null | undefined): string {\n if (!inputSchema) {\n return '<type>object</type>\\n <properties>\\n </properties>\\n <required>[]</required>';\n }\n\n const schemaType = (inputSchema.type as string) || 'object';\n const properties = (inputSchema.properties as Record<string, any>) || {};\n const required = (inputSchema.required as string[]) || [];\n\n const propertiesXml = Object.entries(properties)\n .map(([key, value]) => {\n const isRequired = required.includes(key);\n const propType = (value as any)?.type || 'string';\n const propDescription = (value as any)?.description || 'No description';\n\n return ` ${key}: {\\n \"type\": \"${propType}\",\\n \"description\": \"${propDescription}\",\\n \"required\": ${isRequired}\\n }`;\n })\n .join('\\n');\n\n return `<type>${schemaType}</type>\\n <properties>\\n${propertiesXml}\\n </properties>\\n <required>${JSON.stringify(required)}</required>`;\n }\n}\n","import type {\n Artifact,\n ArtifactComponentApiInsert,\n ArtifactComponentApiSelect,\n DataComponentApiInsert,\n} from '@inkeep/agents-core';\nimport dataComponentTemplate from '../../../../templates/v1/phase2/data-component.xml?raw';\nimport dataComponentsTemplate from '../../../../templates/v1/phase2/data-components.xml?raw';\nimport systemPromptTemplate from '../../../../templates/v1/phase2/system-prompt.xml?raw';\n// Import template content as raw text\nimport artifactTemplate from '../../../../templates/v1/shared/artifact.xml?raw';\nimport artifactRetrievalGuidance from '../../../../templates/v1/shared/artifact-retrieval-guidance.xml?raw';\nimport { ArtifactCreateSchema } from '../../../utils/artifact-component-schema';\n\n/**\n * Configuration for Phase 2 structured output generation\n * Handles data components, artifact creation, and JSON formatting guidance\n */\nexport class Phase2Config {\n private getArtifactCreationGuidance(): string {\n return `🚨 MANDATORY ARTIFACT CREATION 🚨\nYou MUST create artifacts from tool results to provide citations. This is REQUIRED, not optional.\nEvery piece of information from tools MUST be backed by an artifact creation.\n\nCRITICAL CITATION REQUIREMENTS:\n- Information FROM tool results = MUST create artifact citation\n- Information BASED ON tool results = MUST create artifact citation\n- Analysis OF tool results = MUST create artifact citation \n- Summaries OF tool results = MUST create artifact citation\n- NO INFORMATION from tools can be presented without artifact citation\n\nCRITICAL: ARTIFACTS MUST BE CREATED FIRST\nYou MUST create an artifact before you can reference it. You cannot reference artifacts that don't exist yet.\n\nCRITICAL CITATION PRINCIPLE:\nCreating an artifact IS a citation. Only reference again when citing the SAME artifact for a different statement.\n\nCRITICAL: ALWAYS SELECT SINGLE ITEMS, NEVER ARRAYS\n\nSELECTOR REQUIREMENTS:\n- MUST select ONE specific item, never an array \n- Use compound filtering: result.items[?title=='API Guide' && type=='doc'] | [0]\n- Navigate nested structures: result.structuredContent.content[?title=='Setup'] | [0]\n- ALWAYS end with | [0] to select the first matching item\n- NEVER chain multiple [?...][?...] filters - use && for compound conditions\n\n❌ WRONG FILTER SYNTAX:\n- result.content[?title=='Guide'][?type=='doc'][0] // Multiple chained filters - INVALID JMESPath\n- result.items[?name=='API'][?status=='active'][0] // Chained filters - INVALID JMESPath\n\n✅ CORRECT FILTER SYNTAX:\n- result.content[?title=='Guide' && type=='doc'] | [0] // Compound filter with pipe\n- result.structuredContent.content[?title=='Inkeep' && record_type=='site'] | [0] // Navigate + filter\n\nHANDLING REPEATED KEYS:\nWhen the same field names appear at different levels (like 'content', 'title', 'type'):\n- Use the FULL PATH to the correct level: result.structuredContent.content[*] not result.content[*]\n- Check structure hints for the exact path depth\n- Use compound conditions to be more specific: [?title=='Inkeep' && record_type=='site']\n\nCRITICAL: SELECTOR HIERARCHY\n- base_selector: Points to ONE specific item in the tool result\n- details_selector: Contains JMESPath selectors RELATIVE to the base selector \n- Example: If base=\"result.documents[?type=='api']\" then details_selector uses \"title\" not \"documents[0].title\"\n\n❌ WRONG EXAMPLE:\n{\n \"base_selector\": \"result.content[?title=='Guide']\",\n \"details_selector\": {\n \"title\": \"Guide\", // ❌ This is a literal value, not a selector!\n \"url\": \"result.content[?title=='Guide'].url\", // ❌ This is absolute, not relative!\n \"description\": \"A comprehensive guide\", // ❌ Literal value instead of selector!\n \"content\": \"result.content[?title=='Guide'].content\" // ❌ Absolute path instead of relative!\n }\n}\n\n✅ CORRECT EXAMPLE:\n{\n \"base_selector\": \"result.content[?title=='Guide']\",\n \"details_selector\": {\n \"title\": \"title\", // ✅ Relative selector to get title field\n \"url\": \"url\", // ✅ Relative selector to get url field \n \"description\": \"description\", // ✅ Relative selector\n \"content\": \"content\", // ✅ Relative selector\n \"metadata\": \"metadata.details\" // ✅ Relative selector with nesting\n }\n}\n\nCOMMON FAILURE POINTS (AVOID THESE):\n1. **Array Selection**: result.items (returns array) ❌\n → Fix: result.items[?type=='guide'] (returns single item) ✅\n\n2. **Literal Values Instead of Selectors**: \"title\": \"API Guide\" ❌\n → Fix: \"title\": \"title\" (selector to extract title field) ✅\n\n3. **Absolute Paths Instead of Relative**: \"title\": \"result.items[0].title\" ❌\n → Fix: \"title\": \"title\" (relative to base_selector) ✅\n\n4. **Similar Key Names**: \"title\" vs \"name\" vs \"heading\"\n → Always check the actual field names in tool results\n\n5. **Repeated Keys**: Multiple items with same \"title\" field\n → Use more specific filters: [?title=='Guide' && section=='setup']\n\n6. **Case Sensitivity**: 'Guide' vs 'guide'\n → Match exact case from tool results\n\n7. **Missing Nested Levels**: \"content.text\" when it's \"body.content.text\"\n → Include all intermediate levels`;\n }\n\n private getStructuredArtifactGuidance(\n hasArtifactComponents: boolean,\n artifactComponents?: Array<ArtifactComponentApiInsert | ArtifactComponentApiSelect>,\n shouldShowReferencingRules: boolean = true\n ): string {\n // If we shouldn't show referencing rules at all, return empty\n if (!shouldShowReferencingRules) {\n return '';\n }\n\n // Get the shared retrieval guidance\n const sharedGuidance = artifactRetrievalGuidance;\n\n // Scenario 1: Has data components AND can create artifacts\n if (hasArtifactComponents && artifactComponents && artifactComponents.length > 0) {\n return `${sharedGuidance}\n\nARTIFACT MANAGEMENT FOR STRUCTURED RESPONSES:\n\nYou will create and reference artifacts using data components in your JSON response.\n\nCREATING ARTIFACTS (SERVES AS CITATION):\nUse the appropriate ArtifactCreate_[Type] component to extract and structure data from tool results.\nThe creation itself serves as a citation - no additional reference needed.\n\n⚠️ IMPORTANT: Do not create artifacts from get_reference_artifact tool results - these are already compressed artifacts being retrieved. Only create artifacts from original research and analysis tools.\n\n🚫 FORBIDDEN JMESPATH PATTERNS:\n❌ NEVER: [?title~'.*text.*'] (regex patterns with ~ operator)\n❌ NEVER: [?field~'pattern.*'] (any ~ operator usage)\n❌ NEVER: [?title~'Slack.*Discord.*'] (regex wildcards)\n❌ NEVER: [?name~'https://.*'] (regex in URL matching)\n❌ NEVER: [?text ~ contains(@, 'word')] (~ with @ operator)\n❌ NEVER: contains(@, 'text') (@ operator usage)\n❌ NEVER: [?field==\"value\"] (double quotes in filters)\n❌ NEVER: result.items[?type=='doc'][?status=='active'] (chained filters)\n\n✅ CORRECT JMESPATH SYNTAX:\n✅ [?contains(title, 'text')] (contains function)\n✅ [?title=='exact match'] (exact string matching)\n✅ [?contains(title, 'Slack') && contains(title, 'Discord')] (compound conditions)\n✅ [?starts_with(url, 'https://')] (starts_with function)\n✅ [?type=='doc' && status=='active'] (single filter with &&)\n✅ [?contains(text, 'Founder')] (contains haystack, needle format)\n✅ source.content[?contains(text, 'Founder')].text (correct filter usage)\n\nREFERENCING ARTIFACTS (WHEN CITING AGAIN):\nOnly use the Artifact component when you need to cite the same artifact again for a different statement or context.\n\nEXAMPLE STRUCTURED RESPONSE:\n\\`\\`\\`json\n{\n \"dataComponents\": [\n {\n \"id\": \"text1\",\n \"name\": \"Text\",\n \"props\": {\n \"text\": \"Found documentation about the authentication API.\"\n }\n },\n {\n \"id\": \"create1\",\n \"name\": \"ArtifactCreate_APIDoc\",\n \"props\": {\n \"id\": \"auth-api-doc\",\n \"tool_call_id\": \"call_abc123\",\n \"type\": \"APIDoc\",\n \"base_selector\": \"result.documents[?type=='api']\",\n \"details_selector\": {\"title\": \"metadata.title\", \"endpoint\": \"api.endpoint\", \"description\": \"content.description\", \"parameters\": \"spec.parameters\", \"examples\": \"examples.sample_code\"}\n }\n },\n {\n \"id\": \"text2\",\n \"name\": \"Text\",\n \"props\": {\n \"text\": \"The API requires OAuth 2.0 authentication. Later in this guide, we'll reference the same documentation again.\"\n }\n },\n {\n \"id\": \"ref1\",\n \"name\": \"Artifact\",\n \"props\": {\n \"artifact_id\": \"auth-api-doc\",\n \"tool_call_id\": \"call_abc123\"\n }\n }\n ]\n}\n\\`\\`\\`\n\n${this.getArtifactCreationGuidance()}\n\nCOMPONENT GUIDELINES:\n- Each artifact type has its own ArtifactCreate_[Type] component\n- ArtifactCreate components serve as both creation AND citation\n- Only add Artifact reference components when citing the SAME artifact again for a different point\n- Use tool_call_id exactly as it appears in tool execution results`;\n }\n\n // Scenario 2: Has data components but CANNOT create artifacts (can only reference)\n return `${sharedGuidance}\n\nARTIFACT REFERENCING FOR STRUCTURED RESPONSES:\n\nYou can reference existing artifacts but cannot create new ones.\n\nHOW TO REFERENCE ARTIFACTS:\nUse the Artifact component with artifact_id and tool_call_id from existing artifacts or delegation responses.\n\nEXAMPLE STRUCTURED RESPONSE:\n\\`\\`\\`json\n{\n \"dataComponents\": [\n {\n \"id\": \"text1\",\n \"name\": \"Text\",\n \"props\": {\n \"text\": \"Based on the previously collected information about authentication.\"\n }\n },\n {\n \"id\": \"ref1\",\n \"name\": \"Artifact\",\n \"props\": {\n \"artifact_id\": \"existing-auth-doc\",\n \"tool_call_id\": \"call_previous123\"\n }\n },\n {\n \"id\": \"text2\",\n \"name\": \"Text\", \n \"props\": {\n \"text\": \"The API uses OAuth 2.0 for secure access.\"\n }\n }\n ]\n}\n\\`\\`\\`\n\nIMPORTANT GUIDELINES:\n- You can only reference artifacts that already exist\n- Use the Artifact component to reference them\n- Copy artifact_id and tool_call_id exactly from existing artifacts\n- Mix artifact references naturally throughout your response`;\n }\n\n private getArtifactCreationInstructions(\n hasArtifactComponents: boolean,\n artifactComponents?: Array<ArtifactComponentApiInsert | ArtifactComponentApiSelect>\n ): string {\n if (!hasArtifactComponents || !artifactComponents || artifactComponents.length === 0) {\n return '';\n }\n\n // For structured responses - show available component types\n const componentDescriptions = artifactComponents\n .map((ac) => {\n const schemaProps = ac.props?.properties\n ? Object.entries(ac.props.properties)\n .map(([key, value]: [string, any]) => {\n // Show inPreview flag for LLM display to understand field usage\n const inPreview = value.inPreview ? ' [PREVIEW]' : ' [FULL]';\n return ` - ${key}: ${value.description || 'Field from tool result'}${inPreview}`;\n })\n .join('\\n')\n : ' No properties defined';\n\n return ` ArtifactCreate_${ac.name}:\n Description: ${ac.description || 'Extract and structure data'}\n Schema Properties:\n${schemaProps}`;\n })\n .join('\\n\\n');\n\n return `\nAVAILABLE ARTIFACT TYPES:\n\n${componentDescriptions}`;\n }\n\n private generateDataComponentsSection(dataComponents: DataComponentApiInsert[]): string {\n if (dataComponents.length === 0) {\n return '';\n }\n\n const dataComponentsDescription = dataComponents\n .map((dc) => `${dc.name}: ${dc.description}`)\n .join(', ');\n\n const dataComponentsXml = dataComponents\n .map((dataComponent) => this.generateDataComponentXml(dataComponent))\n .join('\\n ');\n\n let dataComponentsSection = dataComponentsTemplate;\n dataComponentsSection = dataComponentsSection.replace(\n '{{DATA_COMPONENTS_LIST}}',\n dataComponentsDescription\n );\n dataComponentsSection = dataComponentsSection.replace(\n '{{DATA_COMPONENTS_XML}}',\n dataComponentsXml\n );\n\n return dataComponentsSection;\n }\n\n private generateDataComponentXml(dataComponent: DataComponentApiInsert): string {\n let dataComponentXml = dataComponentTemplate;\n\n // Replace data component variables\n dataComponentXml = dataComponentXml.replace('{{COMPONENT_NAME}}', dataComponent.name);\n dataComponentXml = dataComponentXml.replace(\n '{{COMPONENT_DESCRIPTION}}',\n dataComponent.description || ''\n );\n dataComponentXml = dataComponentXml.replace(\n '{{COMPONENT_PROPS_SCHEMA}}',\n this.generateParametersXml(dataComponent.props)\n );\n\n return dataComponentXml;\n }\n\n private generateParametersXml(inputSchema: Record<string, unknown> | null | undefined): string {\n if (!inputSchema) {\n return '<type>object</type>\\n <properties>\\n </properties>\\n <required>[]</required>';\n }\n\n const schemaType = (inputSchema.type as string) || 'object';\n const properties = (inputSchema.properties as Record<string, any>) || {};\n const required = (inputSchema.required as string[]) || [];\n\n // Convert JSON schema properties to XML representation\n const propertiesXml = Object.entries(properties)\n .map(([key, value]) => {\n const isRequired = required.includes(key);\n const propType = (value as any)?.type || 'string';\n const propDescription = (value as any)?.description || 'No description';\n return ` ${key}: {\\n \"type\": \"${propType}\",\\n \"description\": \"${propDescription}\",\\n \"required\": ${isRequired}\\n }`;\n })\n .join('\\n');\n\n return `<type>${schemaType}</type>\\n <properties>\\n${propertiesXml}\\n </properties>\\n <required>${JSON.stringify(required)}</required>`;\n }\n\n private generateArtifactsSection(artifacts: Artifact[]): string {\n if (artifacts.length === 0) {\n return `<available_artifacts description=\"No artifacts are currently available.\n\n${artifactRetrievalGuidance}\n\n\"></available_artifacts>`;\n }\n\n const artifactsXml = artifacts\n .map((artifact) => this.generateArtifactXml(artifact))\n .join('\\n ');\n\n return `<available_artifacts description=\"These are the artifacts available for you to reference in your structured response.\n\n${artifactRetrievalGuidance}\n\n\">\n ${artifactsXml}\n</available_artifacts>`;\n }\n\n private generateArtifactXml(artifact: Artifact): string {\n let artifactXml = artifactTemplate;\n\n // Extract summary data from artifact parts for context\n const summaryData =\n artifact.parts?.map((part: any) => part.data?.summary).filter(Boolean) || [];\n const artifactSummary =\n summaryData.length > 0 ? JSON.stringify(summaryData, null, 2) : 'No summary data available';\n\n // Replace artifact variables\n artifactXml = artifactXml.replace('{{ARTIFACT_NAME}}', artifact.name || '');\n artifactXml = artifactXml.replace('{{ARTIFACT_DESCRIPTION}}', artifact.description || '');\n artifactXml = artifactXml.replace('{{TASK_ID}}', artifact.taskId || '');\n artifactXml = artifactXml.replace('{{ARTIFACT_ID}}', artifact.artifactId || '');\n artifactXml = artifactXml.replace('{{TOOL_CALL_ID}}', artifact.toolCallId || 'unknown');\n artifactXml = artifactXml.replace('{{ARTIFACT_SUMMARY}}', artifactSummary);\n\n return artifactXml;\n }\n\n /**\n * Assemble the complete Phase 2 system prompt for structured output generation\n */\n assemblePhase2Prompt(config: {\n corePrompt: string;\n dataComponents: DataComponentApiInsert[];\n artifactComponents?: Array<ArtifactComponentApiInsert | ArtifactComponentApiSelect>;\n hasArtifactComponents: boolean;\n hasAgentArtifactComponents?: boolean;\n artifacts?: Artifact[];\n }): string {\n const {\n corePrompt,\n dataComponents,\n artifactComponents,\n hasArtifactComponents,\n hasAgentArtifactComponents,\n artifacts = [],\n } = config;\n\n // Include ArtifactCreate components in data components when artifacts are available\n let allDataComponents = [...dataComponents];\n if (hasArtifactComponents && artifactComponents) {\n const artifactCreateComponents = ArtifactCreateSchema.getDataComponents(\n 'tenant', // placeholder - not used in Phase2\n '', // placeholder - not used in Phase2\n artifactComponents\n );\n allDataComponents = [...dataComponents, ...artifactCreateComponents];\n }\n\n const dataComponentsSection = this.generateDataComponentsSection(allDataComponents);\n const artifactsSection = this.generateArtifactsSection(artifacts);\n const shouldShowReferencingRules = hasAgentArtifactComponents || artifacts.length > 0;\n const artifactGuidance = this.getStructuredArtifactGuidance(\n hasArtifactComponents,\n artifactComponents,\n shouldShowReferencingRules\n );\n const artifactTypes = this.getArtifactCreationInstructions(\n hasArtifactComponents,\n artifactComponents\n );\n\n let phase2Prompt = systemPromptTemplate;\n\n // Handle core instructions - omit entire section if empty\n if (corePrompt && corePrompt.trim()) {\n phase2Prompt = phase2Prompt.replace('{{CORE_INSTRUCTIONS}}', corePrompt);\n } else {\n // Remove the entire core_instructions section if empty\n phase2Prompt = phase2Prompt.replace(\n /<core_instructions>\\s*\\{\\{CORE_INSTRUCTIONS\\}\\}\\s*<\\/core_instructions>/g,\n ''\n );\n }\n phase2Prompt = phase2Prompt.replace('{{DATA_COMPONENTS_SECTION}}', dataComponentsSection);\n phase2Prompt = phase2Prompt.replace('{{ARTIFACTS_SECTION}}', artifactsSection);\n phase2Prompt = phase2Prompt.replace('{{ARTIFACT_GUIDANCE_SECTION}}', artifactGuidance);\n phase2Prompt = phase2Prompt.replace('{{ARTIFACT_TYPES_SECTION}}', artifactTypes);\n\n return phase2Prompt;\n }\n}\n","import { z } from '@hono/zod-openapi';\nimport {\n type AgentConversationHistoryConfig,\n type Artifact,\n type ArtifactComponentApiInsert,\n agentHasArtifactComponents,\n ContextResolver,\n type CredentialStoreRegistry,\n CredentialStuffer,\n createMessage,\n type DataComponentApiInsert,\n generateId,\n getContextConfigById,\n getCredentialReference,\n getFullAgentDefinition,\n getFunction,\n getFunctionToolsForSubAgent,\n getLedgerArtifacts,\n getToolsForAgent,\n getUserScopedCredentialReference,\n listTaskIdsByContextId,\n MCPServerType,\n type MCPToolConfig,\n MCPTransportType,\n McpClient,\n type McpServerConfig,\n type McpTool,\n type MessageContent,\n ModelFactory,\n type ModelSettings,\n type Models,\n parseEmbeddedJson,\n type SubAgentStopWhen,\n TemplateEngine,\n} from '@inkeep/agents-core';\nimport { type Span, SpanStatusCode, trace } from '@opentelemetry/api';\nimport {\n generateObject,\n generateText,\n streamObject,\n streamText,\n type Tool,\n type ToolSet,\n tool,\n} from 'ai';\nimport {\n AGENT_EXECUTION_MAX_GENERATION_STEPS,\n FUNCTION_TOOL_EXECUTION_TIMEOUT_MS_DEFAULT,\n FUNCTION_TOOL_SANDBOX_VCPUS_DEFAULT,\n LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_NON_STREAMING,\n LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_STREAMING,\n LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS,\n LLM_GENERATION_SUBSEQUENT_CALL_TIMEOUT_MS,\n} from '../constants/execution-limits';\nimport {\n createDefaultConversationHistoryConfig,\n getFormattedConversationHistory,\n} from '../data/conversations';\nimport dbClient from '../data/db/dbClient';\nimport { getLogger } from '../logger';\nimport { agentSessionManager, type ToolCallData } from '../services/AgentSession';\nimport { IncrementalStreamParser } from '../services/IncrementalStreamParser';\nimport {\n getCompressionConfigFromEnv,\n MidGenerationCompressor,\n} from '../services/MidGenerationCompressor';\nimport { pendingToolApprovalManager } from '../services/PendingToolApprovalManager';\nimport { ResponseFormatter } from '../services/ResponseFormatter';\nimport type { SandboxConfig } from '../types/execution-context';\nimport { generateToolId } from '../utils/agent-operations';\nimport { ArtifactCreateSchema, ArtifactReferenceSchema } from '../utils/artifact-component-schema';\nimport { jsonSchemaToZod } from '../utils/data-component-schema';\nimport type { StreamHelper } from '../utils/stream-helpers';\nimport { getStreamHelper } from '../utils/stream-registry';\nimport { setSpanWithError, tracer } from '../utils/tracer';\nimport { createDelegateToAgentTool, createTransferToAgentTool } from './relationTools';\nimport { SystemPromptBuilder } from './SystemPromptBuilder';\nimport { toolSessionManager } from './ToolSessionManager';\nimport type { SystemPromptV1 } from './types';\nimport { Phase1Config } from './versions/v1/Phase1Config';\nimport { Phase2Config } from './versions/v1/Phase2Config';\n\n/**\n * Creates a stopWhen condition that stops when any tool call name starts with the given prefix\n * @param prefix - The prefix to check for in tool call names\n * @returns A function that can be used as a stopWhen condition\n */\nexport function hasToolCallWithPrefix(prefix: string) {\n return ({ steps }: { steps: Array<any> }) => {\n const last = steps.at(-1);\n if (last && 'toolCalls' in last && last.toolCalls) {\n return last.toolCalls.some((tc: any) => tc.toolName.startsWith(prefix));\n }\n return false;\n };\n}\n\nconst logger = getLogger('Agent');\n\nfunction validateModel(modelString: string | undefined, modelType: string): string {\n if (!modelString?.trim()) {\n throw new Error(\n `${modelType} model is required. Please configure models at the project level.`\n );\n }\n return modelString.trim();\n}\n\nexport type AgentConfig = {\n id: string;\n tenantId: string;\n projectId: string;\n agentId: string;\n relationId?: string;\n baseUrl: string;\n apiKey?: string;\n apiKeyId?: string;\n name: string;\n description?: string;\n prompt?: string;\n subAgentRelations: AgentConfig[];\n transferRelations: AgentConfig[];\n delegateRelations: DelegateRelation[];\n tools?: McpTool[];\n artifacts?: Record<string, Artifact>;\n functionTools?: Array<{\n name: string;\n description: string;\n execute: (params: any) => Promise<any>;\n parameters?: Record<string, any>;\n schema?: any;\n }>;\n contextConfigId?: string;\n dataComponents?: DataComponentApiInsert[];\n artifactComponents?: ArtifactComponentApiInsert[];\n conversationHistoryConfig?: AgentConversationHistoryConfig;\n models?: Models;\n stopWhen?: SubAgentStopWhen;\n sandboxConfig?: SandboxConfig;\n /** User ID for user-scoped credential lookup (from temp JWT) */\n userId?: string;\n};\n\nexport type ExternalAgentRelationConfig = {\n relationId: string;\n id: string;\n name: string;\n description: string;\n baseUrl: string;\n credentialReferenceId?: string | null;\n headers?: Record<string, string> | null;\n relationType: string;\n};\n\nexport type TeamAgentRelationConfig = {\n relationId: string;\n id: string;\n name: string;\n description: string;\n baseUrl: string;\n headers?: Record<string, string> | null;\n};\n\nexport type DelegateRelation =\n | { type: 'internal'; config: AgentConfig }\n | { type: 'external'; config: ExternalAgentRelationConfig }\n | { type: 'team'; config: TeamAgentRelationConfig };\n\nexport type ToolType = 'transfer' | 'delegation' | 'mcp' | 'tool';\n\nfunction isValidTool(\n tool: any\n): tool is Tool<any, any> & { execute: (args: any, context?: any) => Promise<any> } {\n return (\n tool &&\n typeof tool === 'object' &&\n typeof tool.description === 'string' &&\n tool.inputSchema &&\n typeof tool.execute === 'function'\n );\n}\n\nexport class Agent {\n private config: AgentConfig;\n private systemPromptBuilder = new SystemPromptBuilder('v1', new Phase1Config());\n private credentialStuffer?: CredentialStuffer;\n private streamHelper?: StreamHelper;\n private streamRequestId?: string;\n private conversationId?: string;\n private delegationId?: string;\n private artifactComponents: ArtifactComponentApiInsert[] = [];\n private isDelegatedAgent: boolean = false;\n private contextResolver?: ContextResolver;\n private credentialStoreRegistry?: CredentialStoreRegistry;\n private mcpClientCache: Map<string, McpClient> = new Map();\n private mcpConnectionLocks: Map<string, Promise<McpClient>> = new Map();\n private currentCompressor: MidGenerationCompressor | null = null;\n\n constructor(config: AgentConfig, credentialStoreRegistry?: CredentialStoreRegistry) {\n this.artifactComponents = config.artifactComponents || [];\n\n let processedDataComponents = config.dataComponents || [];\n\n if (processedDataComponents.length > 0) {\n processedDataComponents.push({\n id: 'text-content',\n name: 'Text',\n description:\n 'Natural conversational text for the user - write naturally without mentioning technical details. Avoid redundancy and repetition with data components.',\n props: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description:\n 'Natural conversational text - respond as if having a normal conversation, never mention JSON, components, schemas, or technical implementation. Avoid redundancy and repetition with data components.',\n },\n },\n required: ['text'],\n },\n });\n }\n\n if (\n this.artifactComponents.length > 0 &&\n config.dataComponents &&\n config.dataComponents.length > 0\n ) {\n processedDataComponents = [\n ArtifactReferenceSchema.getDataComponent(config.tenantId, config.projectId),\n ...processedDataComponents,\n ];\n }\n\n this.config = {\n ...config,\n dataComponents: processedDataComponents,\n conversationHistoryConfig:\n config.conversationHistoryConfig || createDefaultConversationHistoryConfig(),\n };\n\n this.credentialStoreRegistry = credentialStoreRegistry;\n\n if (credentialStoreRegistry) {\n this.contextResolver = new ContextResolver(\n config.tenantId,\n config.projectId,\n dbClient,\n credentialStoreRegistry\n );\n this.credentialStuffer = new CredentialStuffer(credentialStoreRegistry, this.contextResolver);\n }\n }\n\n /**\n * Get the maximum number of generation steps for this agent\n * Uses agent's stopWhen.stepCountIs config or defaults to AGENT_EXECUTION_MAX_GENERATION_STEPS\n */\n private getMaxGenerationSteps(): number {\n return this.config.stopWhen?.stepCountIs ?? AGENT_EXECUTION_MAX_GENERATION_STEPS;\n }\n\n /**\n * Sanitizes tool names at runtime for AI SDK compatibility.\n * The AI SDK requires tool names to match pattern ^[a-zA-Z0-9_-]{1,128}$\n */\n private sanitizeToolsForAISDK(tools: ToolSet): ToolSet {\n const sanitizedTools: ToolSet = {};\n\n for (const [originalKey, toolDef] of Object.entries(tools)) {\n let sanitizedKey = originalKey.replace(/[^a-zA-Z0-9_-]/g, '_');\n sanitizedKey = sanitizedKey.replace(/_+/g, '_');\n sanitizedKey = sanitizedKey.replace(/^_+|_+$/g, '');\n\n if (!sanitizedKey || sanitizedKey.length === 0) {\n sanitizedKey = 'unnamed_tool';\n }\n\n if (sanitizedKey.length > 100) {\n sanitizedKey = sanitizedKey.substring(0, 100);\n }\n\n const originalId = (toolDef as any).id || originalKey;\n let sanitizedId = originalId.replace(/[^a-zA-Z0-9_.-]/g, '_');\n sanitizedId = sanitizedId.replace(/_+/g, '_');\n sanitizedId = sanitizedId.replace(/^_+|_+$/g, '');\n\n if (sanitizedId.length > 128) {\n sanitizedId = sanitizedId.substring(0, 128);\n }\n\n const sanitizedTool = {\n ...toolDef,\n id: sanitizedId,\n };\n\n sanitizedTools[sanitizedKey] = sanitizedTool;\n }\n\n return sanitizedTools;\n }\n\n #createRelationToolName(prefix: string, targetId: string): string {\n return `${prefix}_to_${targetId.toLowerCase().replace(/\\s+/g, '_')}`;\n }\n\n #getRelationshipIdForTool(toolName: string, toolType?: ToolType): string | undefined {\n if (toolType === 'mcp') {\n const matchingTool = this.config.tools?.find((tool) => {\n if (tool.config?.type !== 'mcp') {\n return false;\n }\n\n if (tool.availableTools?.some((available) => available.name === toolName)) {\n return true;\n }\n\n if (tool.config.mcp.activeTools?.includes(toolName)) {\n return true;\n }\n\n return tool.name === toolName;\n });\n\n return matchingTool?.relationshipId;\n }\n\n if (toolType === 'delegation') {\n const relation = this.config.delegateRelations.find(\n (relation) => this.#createRelationToolName('delegate', relation.config.id) === toolName\n );\n\n return relation?.config.relationId;\n }\n }\n\n /**\n * Get the primary model settings for text generation and thinking\n * Requires model to be configured at project level\n */\n private getPrimaryModel(): ModelSettings {\n if (!this.config.models?.base) {\n throw new Error(\n 'Base model configuration is required. Please configure models at the project level.'\n );\n }\n return {\n model: validateModel(this.config.models.base.model, 'Base'),\n providerOptions: this.config.models.base.providerOptions,\n };\n }\n\n /**\n * Get the model settings for structured output generation\n * Falls back to base model if structured output not configured\n */\n private getStructuredOutputModel(): ModelSettings {\n if (!this.config.models) {\n throw new Error(\n 'Model configuration is required. Please configure models at the project level.'\n );\n }\n\n const structuredConfig = this.config.models.structuredOutput;\n const baseConfig = this.config.models.base;\n\n if (structuredConfig) {\n return {\n model: validateModel(structuredConfig.model, 'Structured output'),\n providerOptions: structuredConfig.providerOptions,\n };\n }\n\n if (!baseConfig) {\n throw new Error(\n 'Base model configuration is required for structured output fallback. Please configure models at the project level.'\n );\n }\n return {\n model: validateModel(baseConfig.model, 'Base (fallback for structured output)'),\n providerOptions: baseConfig.providerOptions,\n };\n }\n\n /**\n * Get the model settings for summarization/distillation\n * Falls back to base model if summarizer not configured\n */\n private getSummarizerModel(): ModelSettings {\n if (!this.config.models) {\n throw new Error(\n 'Model configuration is required. Please configure models at the project level.'\n );\n }\n\n const summarizerConfig = this.config.models.summarizer;\n const baseConfig = this.config.models.base;\n\n if (summarizerConfig) {\n return {\n model: validateModel(summarizerConfig.model, 'Summarizer'),\n providerOptions: summarizerConfig.providerOptions,\n };\n }\n\n if (!baseConfig) {\n throw new Error(\n 'Base model configuration is required for summarizer fallback. Please configure models at the project level.'\n );\n }\n return {\n model: validateModel(baseConfig.model, 'Base (fallback for summarizer)'),\n providerOptions: baseConfig.providerOptions,\n };\n }\n\n setConversationId(conversationId: string) {\n this.conversationId = conversationId;\n }\n\n /**\n * Simple compression fallback: drop oldest messages to fit under token limit\n */\n private simpleCompression(messages: any[], targetTokens: number): any[] {\n if (messages.length === 0) return messages;\n\n const estimateTokens = (msg: any) => {\n const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n return Math.ceil(content.length / 4);\n };\n\n let totalTokens = messages.reduce((sum, msg) => sum + estimateTokens(msg), 0);\n\n if (totalTokens <= targetTokens) {\n return messages; // Already under limit\n }\n\n // Keep dropping messages from the beginning until we're under the limit\n const result = [...messages];\n while (totalTokens > targetTokens && result.length > 1) {\n const dropped = result.shift();\n if (dropped) {\n totalTokens -= estimateTokens(dropped);\n }\n }\n\n return result;\n }\n\n /**\n * Set delegation status for this agent instance\n */\n setDelegationStatus(isDelegated: boolean) {\n this.isDelegatedAgent = isDelegated;\n }\n\n /**\n * Set delegation ID for this agent instance\n */\n setDelegationId(delegationId: string | undefined) {\n this.delegationId = delegationId;\n }\n\n /**\n * Get streaming helper if this agent should stream to user\n * Returns undefined for delegated agents to prevent streaming data operations to user\n */\n getStreamingHelper(): StreamHelper | undefined {\n return this.isDelegatedAgent ? undefined : this.streamHelper;\n }\n\n /**\n * Wraps a tool with streaming lifecycle tracking (start, complete, error) and AgentSession recording\n */\n private wrapToolWithStreaming(\n toolName: string,\n toolDefinition: any,\n streamRequestId?: string,\n toolType?: ToolType,\n options?: { needsApproval?: boolean; mcpServerId?: string; mcpServerName?: string }\n ) {\n if (!toolDefinition || typeof toolDefinition !== 'object' || !('execute' in toolDefinition)) {\n return toolDefinition;\n }\n const relationshipId = this.#getRelationshipIdForTool(toolName, toolType);\n\n const originalExecute = toolDefinition.execute;\n return {\n ...toolDefinition,\n execute: async (args: any, context?: any) => {\n const startTime = Date.now();\n const toolCallId = context?.toolCallId || generateToolId();\n\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n const attributes: Record<string, any> = {\n 'conversation.id': this.conversationId,\n 'tool.purpose': toolDefinition.description || 'No description provided',\n 'ai.toolType': toolType || 'unknown',\n 'subAgent.name': this.config.name || 'unknown',\n 'subAgent.id': this.config.id || 'unknown',\n 'agent.id': this.config.agentId || 'unknown',\n };\n\n if (options?.mcpServerId) {\n attributes['ai.toolCall.mcpServerId'] = options.mcpServerId;\n }\n if (options?.mcpServerName) {\n attributes['ai.toolCall.mcpServerName'] = options.mcpServerName;\n }\n\n activeSpan.setAttributes(attributes);\n }\n\n const isInternalTool =\n toolName.includes('save_tool_result') ||\n toolName.includes('thinking_complete') ||\n toolName.startsWith('transfer_to_');\n // Note: delegate_to_ tools are NOT internal - we want their results in conversation history\n\n // Check if this tool needs approval first\n const needsApproval = options?.needsApproval || false;\n\n if (streamRequestId && !isInternalTool) {\n const toolCallData: ToolCallData = {\n toolName,\n input: args,\n toolCallId,\n relationshipId,\n };\n\n // Add approval-specific data when needed\n if (needsApproval) {\n toolCallData.needsApproval = true;\n toolCallData.conversationId = this.conversationId;\n }\n\n await agentSessionManager.recordEvent(\n streamRequestId,\n 'tool_call',\n this.config.id,\n toolCallData\n );\n }\n\n try {\n const result = await originalExecute(args, context);\n const duration = Date.now() - startTime;\n\n // Store tool result in conversation history\n const toolResultConversationId = this.getToolResultConversationId();\n if (streamRequestId && !isInternalTool && toolResultConversationId) {\n try {\n const messageId = generateId();\n const messagePayload = {\n id: messageId,\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n conversationId: toolResultConversationId,\n role: 'assistant',\n content: {\n text: this.formatToolResult(toolName, args, result, toolCallId),\n },\n visibility: 'internal',\n messageType: 'tool-result',\n fromSubAgentId: this.config.id,\n metadata: {\n a2a_metadata: {\n toolName,\n toolCallId,\n timestamp: Date.now(),\n delegationId: this.delegationId,\n isDelegated: this.isDelegatedAgent,\n },\n },\n };\n\n await createMessage(dbClient)(messagePayload);\n } catch (error) {\n logger.warn(\n { error, toolName, toolCallId, conversationId: toolResultConversationId },\n 'Failed to store tool result in conversation history'\n );\n }\n }\n\n if (streamRequestId && !isInternalTool) {\n agentSessionManager.recordEvent(streamRequestId, 'tool_result', this.config.id, {\n toolName,\n output: result,\n toolCallId,\n duration,\n relationshipId,\n needsApproval,\n });\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n if (streamRequestId && !isInternalTool) {\n agentSessionManager.recordEvent(streamRequestId, 'tool_result', this.config.id, {\n toolName,\n output: null,\n toolCallId,\n duration,\n error: errorMessage,\n relationshipId,\n needsApproval,\n });\n }\n\n throw error;\n }\n },\n };\n }\n\n getRelationTools(\n runtimeContext?: {\n contextId: string;\n metadata: {\n conversationId: string;\n threadId: string;\n streamRequestId?: string;\n streamBaseUrl?: string;\n apiKey?: string;\n baseUrl?: string;\n };\n },\n sessionId?: string\n ) {\n const { transferRelations = [], delegateRelations = [] } = this.config;\n return Object.fromEntries([\n ...transferRelations.map((agentConfig) => {\n const toolName = this.#createRelationToolName('transfer', agentConfig.id);\n return [\n toolName,\n this.wrapToolWithStreaming(\n toolName,\n createTransferToAgentTool({\n transferConfig: agentConfig,\n callingAgentId: this.config.id,\n subAgent: this,\n streamRequestId: runtimeContext?.metadata?.streamRequestId,\n }),\n runtimeContext?.metadata?.streamRequestId,\n 'transfer'\n ),\n ];\n }),\n ...delegateRelations.map((relation) => {\n const toolName = this.#createRelationToolName('delegate', relation.config.id);\n\n return [\n toolName,\n this.wrapToolWithStreaming(\n toolName,\n createDelegateToAgentTool({\n delegateConfig: relation,\n callingAgentId: this.config.id,\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n agentId: this.config.agentId,\n contextId: runtimeContext?.contextId || 'default', // fallback for compatibility\n metadata: runtimeContext?.metadata || {\n conversationId: runtimeContext?.contextId || 'default',\n threadId: runtimeContext?.contextId || 'default',\n streamRequestId: runtimeContext?.metadata?.streamRequestId,\n apiKey: runtimeContext?.metadata?.apiKey,\n },\n sessionId,\n subAgent: this,\n credentialStoreRegistry: this.credentialStoreRegistry,\n }),\n runtimeContext?.metadata?.streamRequestId,\n 'delegation'\n ),\n ];\n }),\n ]);\n }\n\n async getMcpTools(sessionId?: string, streamRequestId?: string) {\n const mcpTools =\n this.config.tools?.filter((tool) => {\n return tool.config?.type === 'mcp';\n }) || [];\n const tools = (await Promise.all(mcpTools.map((tool) => this.getMcpTool(tool)) || [])) || [];\n if (!sessionId) {\n const wrappedTools: ToolSet = {};\n for (const toolSet of tools) {\n for (const [toolName, toolDef] of Object.entries(toolSet.tools)) {\n // Find toolPolicies for this tool\n const needsApproval = toolSet.toolPolicies?.[toolName]?.needsApproval || false;\n\n const enhancedTool = {\n ...toolDef,\n needsApproval,\n };\n\n wrappedTools[toolName] = this.wrapToolWithStreaming(\n toolName,\n enhancedTool,\n streamRequestId,\n 'mcp',\n {\n needsApproval,\n mcpServerId: toolSet.mcpServerId,\n mcpServerName: toolSet.mcpServerName,\n }\n );\n }\n }\n return wrappedTools;\n }\n\n const wrappedTools: ToolSet = {};\n for (const toolResult of tools) {\n for (const [toolName, originalTool] of Object.entries(toolResult.tools)) {\n if (!isValidTool(originalTool)) {\n logger.error({ toolName }, 'Invalid MCP tool structure - missing required properties');\n continue;\n }\n\n // Check if this tool needs approval from toolPolicies\n const needsApproval = toolResult.toolPolicies?.[toolName]?.needsApproval || false;\n\n logger.debug(\n {\n toolName,\n toolPolicies: toolResult.toolPolicies,\n needsApproval,\n policyForThisTool: toolResult.toolPolicies?.[toolName],\n },\n 'Tool approval check'\n );\n\n const sessionWrappedTool = tool({\n description: originalTool.description,\n inputSchema: originalTool.inputSchema,\n execute: async (args, { toolCallId }) => {\n // Fix Claude's stringified JSON issue - convert any stringified JSON back to objects\n // This must happen first, before any logging or tracing, so spans show correct data\n let processedArgs: typeof args;\n try {\n processedArgs = parseEmbeddedJson(args);\n\n // Warn if we had to fix stringified JSON (indicates schema ambiguity issue)\n if (JSON.stringify(args) !== JSON.stringify(processedArgs)) {\n logger.warn(\n { toolName, toolCallId },\n 'Fixed stringified JSON parameters (indicates schema ambiguity)'\n );\n }\n } catch (error) {\n logger.warn(\n { toolName, toolCallId, error: (error as Error).message },\n 'Failed to parse embedded JSON, using original args'\n );\n processedArgs = args;\n }\n\n // Use processed args for all subsequent operations\n const finalArgs = processedArgs;\n\n // Check for approval requirement before execution\n if (needsApproval) {\n logger.info(\n { toolName, toolCallId, args: finalArgs },\n 'Tool requires approval - waiting for user response'\n );\n\n // Add an event to the current active span if one exists\n const currentSpan = trace.getActiveSpan();\n if (currentSpan) {\n currentSpan.addEvent('tool.approval.requested', {\n 'tool.name': toolName,\n 'tool.callId': toolCallId,\n 'subAgent.id': this.config.id,\n });\n }\n\n // Emit an immediate span to mark that approval request was sent\n tracer.startActiveSpan(\n 'tool.approval_requested',\n {\n attributes: {\n 'tool.name': toolName,\n 'tool.callId': toolCallId,\n 'subAgent.id': this.config.id,\n 'subAgent.name': this.config.name,\n },\n },\n (requestSpan: Span) => {\n requestSpan.setStatus({ code: SpanStatusCode.OK });\n requestSpan.end();\n }\n );\n\n // Wait for approval (this promise resolves when user responds via API)\n const approvalResult = await pendingToolApprovalManager.waitForApproval(\n toolCallId,\n toolName,\n args,\n this.conversationId || 'unknown',\n this.config.id\n );\n\n if (!approvalResult.approved) {\n // User denied approval - return a message instead of executing the tool\n return tracer.startActiveSpan(\n 'tool.approval_denied',\n {\n attributes: {\n 'tool.name': toolName,\n 'tool.callId': toolCallId,\n 'subAgent.id': this.config.id,\n 'subAgent.name': this.config.name,\n },\n },\n (denialSpan: Span) => {\n logger.info(\n { toolName, toolCallId, reason: approvalResult.reason },\n 'Tool execution denied by user'\n );\n\n denialSpan.setStatus({ code: SpanStatusCode.OK });\n denialSpan.end();\n\n return `User denied approval to run this tool: ${approvalResult.reason}`;\n }\n );\n }\n\n // Tool was approved - create a span to show this\n tracer.startActiveSpan(\n 'tool.approval_approved',\n {\n attributes: {\n 'tool.name': toolName,\n 'tool.callId': toolCallId,\n 'subAgent.id': this.config.id,\n 'subAgent.name': this.config.name,\n },\n },\n (approvedSpan: Span) => {\n logger.info({ toolName, toolCallId }, 'Tool approved, continuing with execution');\n approvedSpan.setStatus({ code: SpanStatusCode.OK });\n approvedSpan.end();\n }\n );\n }\n\n logger.debug({ toolName, toolCallId }, 'MCP Tool Called');\n\n try {\n const rawResult = await originalTool.execute(finalArgs, { toolCallId });\n\n if (rawResult && typeof rawResult === 'object' && rawResult.isError) {\n const errorMessage = rawResult.content?.[0]?.text || 'MCP tool returned an error';\n logger.error(\n { toolName, toolCallId, errorMessage, rawResult },\n 'MCP tool returned error status'\n );\n\n toolSessionManager.recordToolResult(sessionId, {\n toolCallId,\n toolName,\n args: finalArgs,\n result: { error: errorMessage, failed: true },\n timestamp: Date.now(),\n });\n\n if (streamRequestId) {\n const relationshipId = this.#getRelationshipIdForTool(toolName, 'mcp');\n agentSessionManager.recordEvent(streamRequestId, 'error', this.config.id, {\n message: `MCP tool \"${toolName}\" failed: ${errorMessage}`,\n code: 'mcp_tool_error',\n severity: 'error',\n context: {\n toolName,\n toolCallId,\n errorMessage,\n relationshipId,\n },\n });\n }\n\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n const error = new Error(\n `Tool \"${toolName}\" failed: ${errorMessage}. This tool is currently unavailable. Please try a different approach or inform the user of the issue.`\n );\n activeSpan.recordException(error);\n activeSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: `MCP tool returned error: ${errorMessage}`,\n });\n }\n\n throw new Error(\n `Tool \"${toolName}\" failed: ${errorMessage}. This tool is currently unavailable. Please try a different approach or inform the user of the issue.`\n );\n }\n\n const parsedResult = parseEmbeddedJson(rawResult);\n\n const enhancedResult = this.enhanceToolResultWithStructureHints(parsedResult);\n\n toolSessionManager.recordToolResult(sessionId, {\n toolCallId,\n toolName,\n args: finalArgs,\n result: enhancedResult,\n timestamp: Date.now(),\n });\n\n return { result: enhancedResult, toolCallId };\n } catch (error) {\n logger.error({ toolName, toolCallId, error }, 'MCP tool execution failed');\n throw error;\n }\n },\n });\n\n wrappedTools[toolName] = this.wrapToolWithStreaming(\n toolName,\n sessionWrappedTool,\n streamRequestId,\n 'mcp',\n {\n needsApproval,\n mcpServerId: toolResult.mcpServerId,\n mcpServerName: toolResult.mcpServerName,\n }\n );\n }\n }\n\n return wrappedTools;\n }\n\n /**\n * Convert database McpTool to builder MCPToolConfig format\n */\n private convertToMCPToolConfig(\n tool: McpTool,\n agentToolRelationHeaders?: Record<string, string>\n ): MCPToolConfig {\n if (tool.config.type !== 'mcp') {\n throw new Error(`Cannot convert non-MCP tool to MCP config: ${tool.id}`);\n }\n\n return {\n id: tool.id,\n name: tool.name,\n description: tool.name, // Use name as description fallback\n serverUrl: tool.config.mcp.server.url,\n activeTools: tool.config.mcp.activeTools,\n mcpType: tool.config.mcp.server.url.includes('api.nango.dev')\n ? MCPServerType.nango\n : MCPServerType.generic,\n transport: tool.config.mcp.transport,\n headers: {\n ...tool.headers,\n ...agentToolRelationHeaders,\n },\n };\n }\n\n async getMcpTool(tool: McpTool) {\n const cacheKey = `${this.config.tenantId}-${this.config.projectId}-${tool.id}-${tool.credentialReferenceId || 'no-cred'}`;\n\n const credentialReferenceId = tool.credentialReferenceId;\n\n const toolsForAgent = await getToolsForAgent(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n agentId: this.config.agentId,\n subAgentId: this.config.id,\n },\n });\n\n const toolRelation = toolsForAgent.data.find((t) => t.toolId === tool.id);\n const agentToolRelationHeaders = toolRelation?.headers || undefined;\n const selectedTools = toolRelation?.selectedTools || undefined;\n const toolPolicies = toolRelation?.toolPolicies || {};\n\n let serverConfig: McpServerConfig;\n\n // Check for user-scoped credential first (uses toolId + userId lookup)\n const isUserScoped = tool.credentialScope === 'user';\n const userId = this.config.userId;\n\n if (isUserScoped && userId && this.credentialStuffer) {\n // User-scoped: look up credential by (toolId, userId)\n const userCredentialReference = await getUserScopedCredentialReference(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n },\n toolId: tool.id,\n userId,\n });\n\n if (userCredentialReference) {\n const storeReference = {\n credentialStoreId: userCredentialReference.credentialStoreId,\n retrievalParams: userCredentialReference.retrievalParams || {},\n };\n\n serverConfig = await this.credentialStuffer.buildMcpServerConfig(\n {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n contextConfigId: this.config.contextConfigId || undefined,\n conversationId: this.conversationId || undefined,\n },\n this.convertToMCPToolConfig(tool, agentToolRelationHeaders),\n storeReference,\n selectedTools\n );\n } else {\n // User hasn't connected their credential yet - build config without auth\n logger.warn(\n { toolId: tool.id, userId },\n 'User-scoped tool has no credential connected for this user'\n );\n serverConfig = await this.credentialStuffer.buildMcpServerConfig(\n {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n contextConfigId: this.config.contextConfigId || undefined,\n conversationId: this.conversationId || undefined,\n },\n this.convertToMCPToolConfig(tool, agentToolRelationHeaders),\n undefined,\n selectedTools\n );\n }\n } else if (credentialReferenceId && this.credentialStuffer) {\n // Project-scoped: look up credential by credentialReferenceId\n const credentialReference = await getCredentialReference(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n },\n id: credentialReferenceId,\n });\n\n if (!credentialReference) {\n throw new Error(`Credential store not found: ${credentialReferenceId}`);\n }\n\n const storeReference = {\n credentialStoreId: credentialReference.credentialStoreId,\n retrievalParams: credentialReference.retrievalParams || {},\n };\n\n serverConfig = await this.credentialStuffer.buildMcpServerConfig(\n {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n contextConfigId: this.config.contextConfigId || undefined,\n conversationId: this.conversationId || undefined,\n },\n this.convertToMCPToolConfig(tool, agentToolRelationHeaders),\n storeReference,\n selectedTools\n );\n } else if (this.credentialStuffer) {\n serverConfig = await this.credentialStuffer.buildMcpServerConfig(\n {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n contextConfigId: this.config.contextConfigId || undefined,\n conversationId: this.conversationId || undefined,\n },\n this.convertToMCPToolConfig(tool, agentToolRelationHeaders),\n undefined,\n selectedTools\n );\n } else {\n // Type guard - should only reach here for MCP tools\n if (tool.config.type !== 'mcp') {\n throw new Error(`Cannot build server config for non-MCP tool: ${tool.id}`);\n }\n\n serverConfig = {\n type: tool.config.mcp.transport?.type || MCPTransportType.streamableHttp,\n url: tool.config.mcp.server.url,\n activeTools: tool.config.mcp.activeTools,\n selectedTools,\n headers: agentToolRelationHeaders,\n };\n }\n\n // Inject user_id for Composio servers at runtime\n if (serverConfig.url?.toString().includes('composio.dev')) {\n const urlObj = new URL(serverConfig.url.toString());\n if (isUserScoped && userId) {\n // User-scoped: use actual userId\n urlObj.searchParams.set('user_id', userId);\n } else {\n // Project-scoped: use tenantId||projectId\n const SEPARATOR = '||';\n urlObj.searchParams.set(\n 'user_id',\n `${this.config.tenantId}${SEPARATOR}${this.config.projectId}`\n );\n }\n serverConfig.url = urlObj.toString();\n }\n\n logger.info(\n {\n toolName: tool.name,\n credentialReferenceId,\n transportType: serverConfig.type,\n headers: tool.headers,\n },\n 'Built MCP server config with credentials'\n );\n\n let client = this.mcpClientCache.get(cacheKey);\n\n if (client && !client.isConnected()) {\n this.mcpClientCache.delete(cacheKey);\n client = undefined;\n }\n\n if (!client) {\n let connectionPromise = this.mcpConnectionLocks.get(cacheKey);\n\n if (!connectionPromise) {\n connectionPromise = this.createMcpConnection(tool, serverConfig);\n this.mcpConnectionLocks.set(cacheKey, connectionPromise);\n }\n\n try {\n client = await connectionPromise;\n this.mcpClientCache.set(cacheKey, client);\n } catch (error) {\n this.mcpConnectionLocks.delete(cacheKey);\n logger.error(\n {\n toolName: tool.name,\n subAgentId: this.config.id,\n cacheKey,\n error: error instanceof Error ? error.message : String(error),\n },\n 'MCP connection failed'\n );\n throw error;\n }\n }\n\n const tools = await client.tools();\n\n if (!tools || Object.keys(tools).length === 0) {\n const streamRequestId = this.getStreamRequestId();\n if (streamRequestId) {\n tracer.startActiveSpan(\n 'ai.toolCall',\n {\n attributes: {\n 'ai.toolCall.name': tool.name,\n 'ai.toolCall.args': JSON.stringify({ operation: 'mcp_tool_discovery' }),\n 'ai.toolCall.result': JSON.stringify({\n status: 'no_tools_available',\n message: `MCP server has 0 effective tools. Double check the selected tools in your agent and the active tools in the MCP server configuration.`,\n serverUrl: tool.config.type === 'mcp' ? tool.config.mcp.server.url : 'unknown',\n originalToolName: tool.name,\n }),\n 'ai.toolType': 'mcp',\n 'subAgent.name': this.config.name || 'unknown',\n 'subAgent.id': this.config.id || 'unknown',\n 'conversation.id': this.conversationId || 'unknown',\n 'agent.id': this.config.agentId || 'unknown',\n 'tenant.id': this.config.tenantId || 'unknown',\n 'project.id': this.config.projectId || 'unknown',\n },\n },\n (span) => {\n setSpanWithError(span, new Error(`0 effective tools available for ${tool.name}`));\n agentSessionManager.recordEvent(streamRequestId, 'error', this.config.id, {\n message: `MCP server has 0 effective tools. Double check the selected tools in your graph and the active tools in the MCP server configuration.`,\n code: 'no_tools_available',\n severity: 'error',\n context: {\n toolName: tool.name,\n serverUrl: tool.config.type === 'mcp' ? tool.config.mcp.server.url : 'unknown',\n operation: 'mcp_tool_discovery',\n },\n });\n span.end();\n }\n );\n }\n }\n\n return { tools, toolPolicies, mcpServerId: tool.id, mcpServerName: tool.name };\n }\n\n private async createMcpConnection(\n tool: McpTool,\n serverConfig: McpServerConfig\n ): Promise<McpClient> {\n const client = new McpClient({\n name: tool.name,\n server: serverConfig,\n });\n\n try {\n await client.connect();\n return client;\n } catch (error) {\n logger.error(\n {\n toolName: tool.name,\n subAgentId: this.config.id,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Agent failed to connect to MCP server'\n );\n if (error instanceof Error) {\n if (error?.cause && JSON.stringify(error.cause).includes('ECONNREFUSED')) {\n const errorMessage = 'Connection refused. Please check if the MCP server is running.';\n throw new Error(errorMessage);\n }\n if (error.message.includes('404')) {\n const errorMessage = 'Error accessing endpoint (HTTP 404)';\n throw new Error(errorMessage);\n }\n throw new Error(`MCP server connection failed: ${error.message}`);\n }\n\n throw error;\n }\n }\n\n async getFunctionTools(sessionId?: string, streamRequestId?: string) {\n const functionTools: ToolSet = {};\n\n try {\n const functionToolsForAgent = await getFunctionToolsForSubAgent(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n agentId: this.config.agentId,\n },\n subAgentId: this.config.id,\n });\n\n const functionToolsData = functionToolsForAgent.data || [];\n\n if (functionToolsData.length === 0) {\n return functionTools;\n }\n\n const { SandboxExecutorFactory } = await import('../tools/SandboxExecutorFactory');\n const sandboxExecutor = SandboxExecutorFactory.getInstance();\n\n for (const functionToolDef of functionToolsData) {\n const functionId = functionToolDef.functionId;\n if (!functionId) {\n logger.warn(\n { functionToolId: functionToolDef.id },\n 'Function tool missing functionId reference'\n );\n continue;\n }\n\n const functionData = await getFunction(dbClient)({\n functionId,\n scopes: {\n tenantId: this.config.tenantId || 'default',\n projectId: this.config.projectId || 'default',\n },\n });\n if (!functionData) {\n logger.warn(\n { functionId, functionToolId: functionToolDef.id },\n 'Function not found in functions table'\n );\n continue;\n }\n\n const zodSchema = jsonSchemaToZod(functionData.inputSchema);\n\n const aiTool = tool({\n description: functionToolDef.description || functionToolDef.name,\n inputSchema: zodSchema,\n execute: async (args, { toolCallId }) => {\n // Fix Claude's stringified JSON issue - convert any stringified JSON back to objects\n let processedArgs: typeof args;\n try {\n processedArgs = parseEmbeddedJson(args);\n\n // Warn if we had to fix stringified JSON (indicates schema ambiguity issue)\n if (JSON.stringify(args) !== JSON.stringify(processedArgs)) {\n logger.warn(\n { toolName: functionToolDef.name, toolCallId },\n 'Fixed stringified JSON parameters (indicates schema ambiguity)'\n );\n }\n } catch (error) {\n logger.warn(\n { toolName: functionToolDef.name, toolCallId, error: (error as Error).message },\n 'Failed to parse embedded JSON, using original args'\n );\n processedArgs = args;\n }\n\n // Use processed args for all subsequent operations\n const finalArgs = processedArgs;\n\n logger.debug(\n { toolName: functionToolDef.name, toolCallId, args: finalArgs },\n 'Function Tool Called'\n );\n\n try {\n const defaultSandboxConfig: SandboxConfig = {\n provider: 'native',\n runtime: 'node22',\n timeout: FUNCTION_TOOL_EXECUTION_TIMEOUT_MS_DEFAULT,\n vcpus: FUNCTION_TOOL_SANDBOX_VCPUS_DEFAULT,\n };\n\n const result = await sandboxExecutor.executeFunctionTool(\n functionToolDef.id,\n finalArgs,\n {\n description: functionToolDef.description || functionToolDef.name,\n inputSchema: functionData.inputSchema || {},\n executeCode: functionData.executeCode,\n dependencies: functionData.dependencies || {},\n sandboxConfig: this.config.sandboxConfig || defaultSandboxConfig,\n }\n );\n\n toolSessionManager.recordToolResult(sessionId || '', {\n toolCallId,\n toolName: functionToolDef.name,\n args: finalArgs,\n result,\n timestamp: Date.now(),\n });\n\n return { result, toolCallId };\n } catch (error) {\n logger.error(\n {\n toolName: functionToolDef.name,\n toolCallId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Function tool execution failed'\n );\n throw error;\n }\n },\n });\n\n functionTools[functionToolDef.name] = this.wrapToolWithStreaming(\n functionToolDef.name,\n aiTool,\n streamRequestId || '',\n 'tool'\n );\n }\n } catch (error) {\n logger.error({ error }, 'Failed to load function tools from database');\n }\n\n return functionTools;\n }\n\n /**\n * Get resolved context using ContextResolver - will return cached data or fetch fresh data as needed\n */\n async getResolvedContext(\n conversationId: string,\n headers?: Record<string, unknown>\n ): Promise<Record<string, unknown> | null> {\n try {\n if (!this.config.contextConfigId) {\n logger.debug({ agentId: this.config.agentId }, 'No context config found for agent');\n return null;\n }\n\n const contextConfig = await getContextConfigById(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n agentId: this.config.agentId,\n },\n id: this.config.contextConfigId,\n });\n if (!contextConfig) {\n logger.warn({ contextConfigId: this.config.contextConfigId }, 'Context config not found');\n return null;\n }\n\n if (!this.contextResolver) {\n throw new Error('Context resolver not found');\n }\n\n const result = await this.contextResolver.resolve(contextConfig, {\n triggerEvent: 'invocation',\n conversationId,\n headers: headers || {},\n tenantId: this.config.tenantId,\n });\n\n const contextWithBuiltins = {\n ...result.resolvedContext,\n $env: process.env,\n };\n\n logger.debug(\n {\n conversationId,\n contextConfigId: contextConfig.id,\n resolvedKeys: Object.keys(contextWithBuiltins),\n cacheHits: result.cacheHits.length,\n cacheMisses: result.cacheMisses.length,\n fetchedDefinitions: result.fetchedDefinitions.length,\n errors: result.errors.length,\n },\n 'Context resolved for agent'\n );\n\n return contextWithBuiltins;\n } catch (error) {\n logger.error(\n {\n conversationId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to get resolved context'\n );\n return null;\n }\n }\n\n /**\n * Get the agent prompt for this agent's agent\n */\n private async getPrompt(): Promise<string | undefined> {\n try {\n const agentDefinition = await getFullAgentDefinition(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n agentId: this.config.agentId,\n },\n });\n\n return agentDefinition?.prompt || undefined;\n } catch (error) {\n logger.warn(\n {\n agentId: this.config.agentId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to get agent prompt'\n );\n return undefined;\n }\n }\n\n /**\n * Check if any agent in the agent has artifact components configured\n */\n private async hasAgentArtifactComponents(): Promise<boolean> {\n try {\n const agentDefinition = await getFullAgentDefinition(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n agentId: this.config.agentId,\n },\n });\n\n if (!agentDefinition) {\n return false;\n }\n\n return Object.values(agentDefinition.subAgents).some(\n (subAgent) =>\n 'artifactComponents' in subAgent &&\n subAgent.artifactComponents &&\n subAgent.artifactComponents.length > 0\n );\n } catch (error) {\n logger.warn(\n {\n agentId: this.config.agentId,\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to check agent artifact components, assuming none exist'\n );\n return this.artifactComponents.length > 0;\n }\n }\n\n /**\n * Build adaptive system prompt for Phase 2 structured output generation\n * based on configured data components and artifact components across the agent\n */\n private async buildPhase2SystemPrompt(runtimeContext?: {\n contextId: string;\n metadata: {\n conversationId: string;\n threadId: string;\n streamRequestId?: string;\n streamBaseUrl?: string;\n };\n }): Promise<string> {\n const phase2Config = new Phase2Config();\n const compressionConfig = getCompressionConfigFromEnv();\n const hasAgentArtifactComponents =\n (await this.hasAgentArtifactComponents()) || compressionConfig.enabled;\n\n const conversationId = runtimeContext?.metadata?.conversationId || runtimeContext?.contextId;\n const resolvedContext = conversationId ? await this.getResolvedContext(conversationId) : null;\n\n let processedPrompt = this.config.prompt || '';\n if (resolvedContext && this.config.prompt) {\n try {\n processedPrompt = TemplateEngine.render(this.config.prompt, resolvedContext, {\n strict: false,\n preserveUnresolved: false,\n });\n } catch (error) {\n logger.error(\n {\n conversationId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to process agent prompt with context for Phase 2, using original'\n );\n processedPrompt = this.config.prompt;\n }\n }\n\n const referenceTaskIds: string[] = await listTaskIdsByContextId(dbClient)({\n contextId: this.conversationId || '',\n });\n\n const referenceArtifacts: Artifact[] = [];\n for (const taskId of referenceTaskIds) {\n const artifacts = await getLedgerArtifacts(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n },\n taskId: taskId,\n });\n referenceArtifacts.push(...artifacts);\n }\n\n return phase2Config.assemblePhase2Prompt({\n corePrompt: processedPrompt,\n dataComponents: this.config.dataComponents || [],\n artifactComponents: this.artifactComponents,\n hasArtifactComponents: this.artifactComponents && this.artifactComponents.length > 0,\n hasAgentArtifactComponents,\n artifacts: referenceArtifacts,\n });\n }\n\n private async buildSystemPrompt(\n runtimeContext?: {\n contextId: string;\n metadata: {\n conversationId: string;\n threadId: string;\n streamRequestId?: string;\n streamBaseUrl?: string;\n };\n },\n excludeDataComponents: boolean = false\n ): Promise<string> {\n const conversationId = runtimeContext?.metadata?.conversationId || runtimeContext?.contextId;\n\n if (conversationId) {\n this.setConversationId(conversationId);\n }\n\n const resolvedContext = conversationId ? await this.getResolvedContext(conversationId) : null;\n\n let processedPrompt = this.config.prompt || '';\n if (resolvedContext && this.config.prompt) {\n try {\n processedPrompt = TemplateEngine.render(this.config.prompt, resolvedContext, {\n strict: false,\n preserveUnresolved: false,\n });\n } catch (error) {\n logger.error(\n {\n conversationId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to process agent prompt with context, using original'\n );\n processedPrompt = this.config.prompt;\n }\n }\n\n const streamRequestId = runtimeContext?.metadata?.streamRequestId;\n const mcpTools = await this.getMcpTools(undefined, streamRequestId);\n const functionTools = await this.getFunctionTools(streamRequestId || '');\n const relationTools = this.getRelationTools(runtimeContext);\n\n const allTools = { ...mcpTools, ...functionTools, ...relationTools };\n\n logger.info(\n {\n mcpTools: Object.keys(mcpTools),\n functionTools: Object.keys(functionTools),\n relationTools: Object.keys(relationTools),\n allTools: Object.keys(allTools),\n functionToolsDetails: Object.entries(functionTools).map(([name, tool]) => ({\n name,\n hasExecute: typeof (tool as any).execute === 'function',\n hasDescription: !!(tool as any).description,\n hasInputSchema: !!(tool as any).inputSchema,\n })),\n },\n 'Tools loaded for agent'\n );\n\n const toolDefinitions = Object.entries(allTools).map(([name, tool]) => ({\n name,\n description: (tool as any).description || '',\n inputSchema: (tool as any).inputSchema || (tool as any).parameters || {},\n usageGuidelines:\n name.startsWith('transfer_to_') || name.startsWith('delegate_to_')\n ? `Use this tool to ${name.startsWith('transfer_to_') ? 'transfer' : 'delegate'} to another agent when appropriate.`\n : 'Use this tool when appropriate for the task at hand.',\n }));\n\n const { getConversationScopedArtifacts } = await import('../data/conversations');\n const historyConfig =\n this.config.conversationHistoryConfig ?? createDefaultConversationHistoryConfig();\n\n const referenceArtifacts: Artifact[] = await getConversationScopedArtifacts({\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n conversationId: runtimeContext?.contextId || '',\n historyConfig,\n });\n\n const componentDataComponents = excludeDataComponents ? [] : this.config.dataComponents || [];\n\n const isThinkingPreparation =\n this.config.dataComponents && this.config.dataComponents.length > 0 && excludeDataComponents;\n\n let prompt = await this.getPrompt();\n\n if (prompt && resolvedContext) {\n try {\n prompt = TemplateEngine.render(prompt, resolvedContext, {\n strict: false,\n preserveUnresolved: false,\n });\n } catch (error) {\n logger.error(\n {\n conversationId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to process agent prompt with context, using original'\n );\n }\n }\n\n const shouldIncludeArtifactComponents = !excludeDataComponents;\n\n const compressionConfig = getCompressionConfigFromEnv();\n const hasAgentArtifactComponents =\n (await this.hasAgentArtifactComponents()) || compressionConfig.enabled;\n\n const config: SystemPromptV1 = {\n corePrompt: processedPrompt,\n prompt,\n tools: toolDefinitions,\n dataComponents: componentDataComponents,\n artifacts: referenceArtifacts,\n artifactComponents: shouldIncludeArtifactComponents ? this.artifactComponents : [],\n hasAgentArtifactComponents,\n isThinkingPreparation,\n hasTransferRelations: (this.config.transferRelations?.length ?? 0) > 0,\n hasDelegateRelations: (this.config.delegateRelations?.length ?? 0) > 0,\n };\n return await this.systemPromptBuilder.buildSystemPrompt(config);\n }\n\n private getArtifactTools() {\n return tool({\n description:\n 'Call this tool to get the complete artifact data with the given artifactId. This retrieves the full artifact content (not just the summary). Only use this when you need the complete artifact data and the summary shown in your context is insufficient.',\n inputSchema: z.object({\n artifactId: z.string().describe('The unique identifier of the artifact to get.'),\n toolCallId: z.string().describe('The tool call ID associated with this artifact.'),\n }),\n execute: async ({ artifactId, toolCallId }) => {\n logger.info({ artifactId, toolCallId }, 'get_artifact_full executed');\n\n // Use shared ArtifactService from AgentSessionManager\n const streamRequestId = this.getStreamRequestId();\n const artifactService = agentSessionManager.getArtifactService(streamRequestId);\n\n if (!artifactService) {\n throw new Error(`ArtifactService not found for session ${streamRequestId}`);\n }\n\n const artifactData = await artifactService.getArtifactFull(artifactId, toolCallId);\n if (!artifactData) {\n throw new Error(`Artifact ${artifactId} with toolCallId ${toolCallId} not found`);\n }\n\n return {\n artifactId: artifactData.artifactId,\n name: artifactData.name,\n description: artifactData.description,\n type: artifactData.type,\n data: artifactData.data,\n };\n },\n });\n }\n\n // Create the thinking_complete tool to mark end of planning phase\n private createThinkingCompleteTool(): any {\n return tool({\n description:\n '🚨 CRITICAL: Call this tool IMMEDIATELY when you have gathered enough information to answer the user. This is MANDATORY - you CANNOT provide text responses in thinking mode, only tool calls. Call thinking_complete as soon as you have sufficient data to generate a structured response.',\n inputSchema: z.object({\n complete: z.boolean().describe('ALWAYS set to true - marks end of research phase'),\n summary: z\n .string()\n .describe(\n 'Brief summary of what information was gathered and why it is sufficient to answer the user'\n ),\n }),\n execute: async (params) => params,\n });\n }\n\n // Provide a default tool set that is always available to the agent.\n private async getDefaultTools(streamRequestId?: string): Promise<ToolSet> {\n const defaultTools: ToolSet = {};\n\n // Add get_reference_artifact if any agent has artifact components OR compression is enabled\n // This enables cross-agent artifact collaboration and access to compressed artifacts\n const compressionConfig = getCompressionConfigFromEnv();\n if ((await this.agentHasArtifactComponents()) || compressionConfig.enabled) {\n defaultTools.get_reference_artifact = this.getArtifactTools();\n }\n\n // Note: save_tool_result tool is replaced by artifact:create response annotations\n // Agents with artifact components will receive creation instructions in their system prompt\n\n // Add thinking_complete tool if we have structured output components\n const hasStructuredOutput = this.config.dataComponents && this.config.dataComponents.length > 0;\n\n if (hasStructuredOutput) {\n const thinkingCompleteTool = this.createThinkingCompleteTool();\n if (thinkingCompleteTool) {\n defaultTools.thinking_complete = this.wrapToolWithStreaming(\n 'thinking_complete',\n thinkingCompleteTool,\n streamRequestId,\n 'tool'\n );\n }\n }\n\n // Add manual compression tool\n logger.info(\n { agentId: this.config.id, streamRequestId },\n 'Adding compress_context tool to defaultTools'\n );\n defaultTools.compress_context = tool({\n description:\n 'Manually compress the current conversation context to save space. Use when shifting topics, completing major tasks, or when context feels cluttered.',\n inputSchema: z.object({\n reason: z\n .string()\n .describe(\n 'Why you are requesting compression (e.g., \"shifting from research to coding\", \"completed analysis phase\")'\n ),\n }),\n execute: async ({ reason }) => {\n logger.info(\n {\n agentId: this.config.id,\n streamRequestId,\n reason,\n },\n 'Manual compression requested by LLM'\n );\n\n // Set compression flag on the current compressor instance\n if (this.currentCompressor) {\n this.currentCompressor.requestManualCompression(reason);\n }\n\n return {\n status: 'compression_requested',\n reason,\n message:\n 'Context compression will be applied on the next generation step. Previous work has been summarized and saved as artifacts.',\n };\n },\n });\n\n logger.info('getDefaultTools returning tools:', Object.keys(defaultTools).join(', '));\n return defaultTools;\n }\n\n private getStreamRequestId(): string {\n return this.streamRequestId || '';\n }\n\n /**\n * Format tool result for storage in conversation history\n */\n private formatToolResult(toolName: string, args: any, result: any, toolCallId: string): string {\n const input = args ? JSON.stringify(args, null, 2) : 'No input';\n\n // Handle string results that might be JSON - try to parse them\n let parsedResult = result;\n if (typeof result === 'string') {\n try {\n parsedResult = JSON.parse(result);\n } catch (e) {\n // Keep as string if not valid JSON\n }\n }\n\n // Clean result by removing _structureHints before storing\n // Check if _structureHints is nested inside the 'result' property\n const cleanResult =\n parsedResult && typeof parsedResult === 'object' && !Array.isArray(parsedResult)\n ? {\n ...parsedResult,\n result:\n parsedResult.result &&\n typeof parsedResult.result === 'object' &&\n !Array.isArray(parsedResult.result)\n ? Object.fromEntries(\n Object.entries(parsedResult.result).filter(([key]) => key !== '_structureHints')\n )\n : parsedResult.result,\n }\n : parsedResult;\n\n const output =\n typeof cleanResult === 'string' ? cleanResult : JSON.stringify(cleanResult, null, 2);\n\n return `## Tool: ${toolName}\n\n### 🔧 TOOL_CALL_ID: ${toolCallId}\n\n### Input\n${input}\n\n### Output\n${output}`;\n }\n\n /**\n * Get the conversation ID for storing tool results\n * Always uses the real conversation ID - delegation filtering happens at query time\n */\n private getToolResultConversationId(): string | undefined {\n return this.conversationId;\n }\n\n /**\n * Analyze tool result structure and add helpful path hints for artifact creation\n * Only adds hints when artifact components are available\n */\n private enhanceToolResultWithStructureHints(result: any): any {\n if (!result) {\n return result;\n }\n\n // Only add structure hints if artifact components are available\n if (!this.artifactComponents || this.artifactComponents.length === 0) {\n return result;\n }\n\n // Parse embedded JSON if result is a string\n let parsedForAnalysis = result;\n if (typeof result === 'string') {\n try {\n parsedForAnalysis = parseEmbeddedJson(result);\n } catch (_error) {\n // If parsing fails, analyze the original result\n parsedForAnalysis = result;\n }\n }\n\n if (!parsedForAnalysis || typeof parsedForAnalysis !== 'object') {\n return result;\n }\n\n const findAllPaths = (obj: any, prefix = 'result', depth = 0): string[] => {\n if (depth > 8) return []; // Allow deeper exploration\n\n const paths: string[] = [];\n\n if (Array.isArray(obj)) {\n if (obj.length > 0) {\n // Add the array path itself\n paths.push(`${prefix}[array-${obj.length}-items]`);\n\n // Add filtering examples based on actual data\n if (obj[0] && typeof obj[0] === 'object') {\n const sampleItem = obj[0];\n Object.keys(sampleItem).forEach((key) => {\n const value = sampleItem[key];\n if (typeof value === 'string' && value.length < 50) {\n paths.push(`${prefix}[?${key}=='${value}']`);\n } else if (typeof value === 'boolean') {\n paths.push(`${prefix}[?${key}==${value}]`);\n } else if (key === 'id' || key === 'name' || key === 'type') {\n paths.push(`${prefix}[?${key}=='value']`);\n }\n });\n }\n\n // Recurse into array items to find nested structures (use filtering instead of selecting all)\n paths.push(...findAllPaths(obj[0], `${prefix}[?field=='value']`, depth + 1));\n }\n } else if (obj && typeof obj === 'object') {\n // Add each property path\n Object.entries(obj).forEach(([key, value]) => {\n const currentPath = `${prefix}.${key}`;\n\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n paths.push(`${currentPath}[array]`);\n } else {\n paths.push(`${currentPath}[object]`);\n }\n // Recurse into nested structures\n paths.push(...findAllPaths(value, currentPath, depth + 1));\n } else {\n // Terminal field\n paths.push(`${currentPath}[${typeof value}]`);\n }\n });\n }\n\n return paths;\n };\n\n const findCommonFields = (obj: any, depth = 0): Set<string> => {\n if (depth > 5) return new Set();\n\n const fields = new Set<string>();\n if (Array.isArray(obj)) {\n // Check first few items for common field patterns\n obj.slice(0, 3).forEach((item) => {\n if (item && typeof item === 'object') {\n Object.keys(item).forEach((key) => {\n fields.add(key);\n });\n }\n });\n } else if (obj && typeof obj === 'object') {\n Object.keys(obj).forEach((key) => {\n fields.add(key);\n });\n Object.values(obj).forEach((value) => {\n findCommonFields(value, depth + 1).forEach((field) => {\n fields.add(field);\n });\n });\n }\n return fields;\n };\n\n // Find deeply nested paths that might be good for filtering\n const findUsefulSelectors = (obj: any, prefix = 'result', depth = 0): string[] => {\n if (depth > 5) return [];\n\n const selectors: string[] = [];\n\n if (Array.isArray(obj) && obj.length > 0) {\n const firstItem = obj[0];\n if (firstItem && typeof firstItem === 'object') {\n // Add specific filtering examples based on actual data\n if (firstItem.title) {\n selectors.push(\n `${prefix}[?title=='${String(firstItem.title).replace(/'/g, \"\\\\'\")}'] | [0]`\n );\n }\n if (firstItem.type) {\n selectors.push(`${prefix}[?type=='${firstItem.type}'] | [0]`);\n }\n if (firstItem.record_type) {\n selectors.push(`${prefix}[?record_type=='${firstItem.record_type}'] | [0]`);\n }\n if (firstItem.url) {\n selectors.push(`${prefix}[?url!=null] | [0]`);\n }\n\n // Add compound filters for better specificity\n if (firstItem.type && firstItem.title) {\n selectors.push(\n `${prefix}[?type=='${firstItem.type}' && title=='${String(firstItem.title).replace(/'/g, \"\\\\'\")}'] | [0]`\n );\n }\n\n // Add direct indexed access as fallback\n selectors.push(`${prefix}[0]`);\n }\n } else if (obj && typeof obj === 'object') {\n Object.entries(obj).forEach(([key, value]) => {\n if (typeof value === 'object' && value !== null) {\n selectors.push(...findUsefulSelectors(value, `${prefix}.${key}`, depth + 1));\n }\n });\n }\n\n return selectors;\n };\n\n // Find nested content paths specifically\n const findNestedContentPaths = (obj: any, prefix = 'result', depth = 0): string[] => {\n if (depth > 6) return [];\n\n const paths: string[] = [];\n\n if (obj && typeof obj === 'object') {\n // Look for nested content structures\n Object.entries(obj).forEach(([key, value]) => {\n const currentPath = `${prefix}.${key}`;\n\n if (Array.isArray(value) && value.length > 0) {\n // Check if this is a content array with structured items\n const firstItem = value[0];\n if (firstItem && typeof firstItem === 'object') {\n if (firstItem.type === 'document' || firstItem.type === 'text') {\n paths.push(`${currentPath}[?type=='document'] | [0]`);\n paths.push(`${currentPath}[?type=='text'] | [0]`);\n\n // Add specific filtering based on actual content\n if (firstItem.title) {\n const titleSample = String(firstItem.title).slice(0, 20);\n paths.push(\n `${currentPath}[?title && contains(title, '${titleSample.split(' ')[0]}')] | [0]`\n );\n }\n if (firstItem.record_type) {\n paths.push(`${currentPath}[?record_type=='${firstItem.record_type}'] | [0]`);\n }\n }\n }\n\n // Continue deeper into nested structures\n paths.push(...findNestedContentPaths(value, currentPath, depth + 1));\n } else if (value && typeof value === 'object') {\n paths.push(...findNestedContentPaths(value, currentPath, depth + 1));\n }\n });\n }\n\n return paths;\n };\n\n try {\n const allPaths = findAllPaths(parsedForAnalysis);\n const commonFields = Array.from(findCommonFields(parsedForAnalysis)).slice(0, 15);\n const usefulSelectors = findUsefulSelectors(parsedForAnalysis).slice(0, 10);\n const nestedContentPaths = findNestedContentPaths(parsedForAnalysis).slice(0, 8);\n\n // Get comprehensive path information\n const terminalPaths = allPaths\n .filter((p) => p.includes('[string]') || p.includes('[number]') || p.includes('[boolean]'))\n .slice(0, 20);\n const arrayPaths = allPaths.filter((p) => p.includes('[array')).slice(0, 15);\n const objectPaths = allPaths.filter((p) => p.includes('[object]')).slice(0, 15);\n\n // Combine all selector examples and remove duplicates\n const allSelectors = [...usefulSelectors, ...nestedContentPaths];\n const uniqueSelectors = [...new Set(allSelectors)].slice(0, 15);\n\n // Add structure hints to the original result (not the parsed version)\n const enhanced = {\n ...result,\n _structureHints: {\n terminalPaths: terminalPaths, // All field paths that contain actual values\n arrayPaths: arrayPaths, // All array structures found\n objectPaths: objectPaths, // All nested object structures\n commonFields: commonFields,\n exampleSelectors: uniqueSelectors,\n deepStructureExamples: nestedContentPaths,\n maxDepthFound: Math.max(...allPaths.map((p) => (p.match(/\\./g) || []).length)),\n totalPathsFound: allPaths.length,\n artifactGuidance: {\n creationFirst:\n '🚨 CRITICAL: Artifacts must be CREATED before they can be referenced. Use ArtifactCreate_[Type] components FIRST, then reference with Artifact components only if citing the SAME artifact again.',\n baseSelector:\n \"🎯 CRITICAL: Use base_selector to navigate to ONE specific item. For deeply nested structures with repeated keys, use full paths with specific filtering (e.g., \\\"result.data.content.items[?type=='guide' && status=='active']\\\")\",\n detailsSelector:\n '📝 Use relative selectors for specific fields (e.g., \"title\", \"metadata.category\", \"properties.status\", \"content.details\")',\n avoidLiterals:\n '❌ NEVER use literal values - always use field selectors to extract from data',\n avoidArrays:\n '✨ ALWAYS filter arrays to single items using [?condition] - NEVER use [*] notation which returns arrays',\n nestedKeys:\n '🔑 For structures with repeated keys (like result.content.data.content.items.content), use full paths with filtering at each level',\n filterTips:\n \"💡 Use compound filters for precision: [?type=='document' && category=='api']\",\n forbiddenSyntax:\n '🚫 FORBIDDEN JMESPATH PATTERNS:\\n' +\n \"❌ NEVER: [?title~'.*text.*'] (regex patterns with ~ operator)\\n\" +\n \"❌ NEVER: [?field~'pattern.*'] (any ~ operator usage)\\n\" +\n \"❌ NEVER: [?title~'Slack.*Discord.*'] (regex wildcards)\\n\" +\n \"❌ NEVER: [?name~'https://.*'] (regex in URL matching)\\n\" +\n \"❌ NEVER: [?text ~ contains(@, 'word')] (~ with @ operator)\\n\" +\n \"❌ NEVER: contains(@, 'text') (@ operator usage)\\n\" +\n '❌ NEVER: [?field==\"value\"] (double quotes in filters)\\n' +\n \"❌ NEVER: result.items[?type=='doc'][?status=='active'] (chained filters)\\n\" +\n '✅ USE INSTEAD:\\n' +\n \"✅ [?contains(title, 'text')] (contains function)\\n\" +\n \"✅ [?title=='exact match'] (exact string matching)\\n\" +\n \"✅ [?contains(title, 'Slack') && contains(title, 'Discord')] (compound conditions)\\n\" +\n \"✅ [?starts_with(url, 'https://')] (starts_with function)\\n\" +\n \"✅ [?type=='doc' && status=='active'] (single filter with &&)\",\n pathDepth: `📏 This structure goes ${Math.max(...allPaths.map((p) => (p.match(/\\./g) || []).length))} levels deep - use full paths to avoid ambiguity`,\n },\n note: `Comprehensive structure analysis: ${allPaths.length} paths found, ${Math.max(...allPaths.map((p) => (p.match(/\\./g) || []).length))} levels deep. Use specific filtering for precise selection.`,\n },\n };\n\n return enhanced;\n } catch (error) {\n logger.warn({ error }, 'Failed to enhance tool result with structure hints');\n return result;\n }\n }\n\n // Check if any agents in the agent have artifact components\n private async agentHasArtifactComponents(): Promise<boolean> {\n try {\n return await agentHasArtifactComponents(dbClient)({\n scopes: {\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n agentId: this.config.agentId,\n },\n });\n } catch (error) {\n logger.error(\n { error, agentId: this.config.agentId },\n 'Failed to check agent artifact components'\n );\n return false;\n }\n }\n\n async generate(\n userMessage: string,\n runtimeContext?: {\n contextId: string;\n metadata: {\n conversationId: string;\n threadId: string;\n taskId: string;\n streamRequestId: string;\n apiKey?: string;\n };\n }\n ) {\n return tracer.startActiveSpan(\n 'agent.generate',\n {\n attributes: {\n 'subAgent.id': this.config.id,\n 'subAgent.name': this.config.name,\n },\n },\n async (span) => {\n // Use the ToolSession created by AgentSession\n // All agents in this execution share the same session\n const contextId = runtimeContext?.contextId || 'default';\n const taskId = runtimeContext?.metadata?.taskId || 'unknown';\n const streamRequestId = runtimeContext?.metadata?.streamRequestId;\n const sessionId = streamRequestId || 'fallback-session';\n\n // Note: ToolSession is now created by AgentSession, not by agents\n // This ensures proper lifecycle management and session coordination\n\n try {\n // Set streaming helper from registry if available\n this.streamRequestId = streamRequestId;\n this.streamHelper = streamRequestId ? getStreamHelper(streamRequestId) : undefined;\n\n // Update ArtifactService with this agent's artifact components\n if (streamRequestId && this.artifactComponents.length > 0) {\n agentSessionManager.updateArtifactComponents(streamRequestId, this.artifactComponents);\n }\n const conversationId = runtimeContext?.metadata?.conversationId;\n\n if (conversationId) {\n this.setConversationId(conversationId);\n }\n\n // Load all tools and both system prompts in parallel\n // Note: getDefaultTools needs to be called after streamHelper is set above\n const [\n mcpTools,\n systemPrompt,\n thinkingSystemPrompt,\n functionTools,\n relationTools,\n defaultTools,\n ] = await tracer.startActiveSpan(\n 'agent.load_tools',\n {\n attributes: {\n 'subAgent.name': this.config.name,\n 'session.id': sessionId || 'none',\n },\n },\n async (childSpan: Span) => {\n try {\n const result = await Promise.all([\n this.getMcpTools(sessionId, streamRequestId),\n this.buildSystemPrompt(runtimeContext, false), // Normal prompt with data components\n this.buildSystemPrompt(runtimeContext, true), // Thinking prompt without data components\n this.getFunctionTools(sessionId, streamRequestId),\n Promise.resolve(this.getRelationTools(runtimeContext, sessionId)),\n this.getDefaultTools(streamRequestId),\n ]);\n\n childSpan.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n // Use helper function for consistent error handling\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setSpanWithError(childSpan, errorObj);\n throw err;\n } finally {\n childSpan.end();\n }\n }\n );\n\n // Combine all tools for AI SDK\n const allTools = {\n ...mcpTools,\n ...functionTools,\n ...relationTools,\n ...defaultTools,\n };\n\n // Sanitize tool names at runtime for AI SDK compatibility\n const sanitizedTools = this.sanitizeToolsForAISDK(allTools);\n\n // Get conversation history\n let conversationHistory = '';\n const historyConfig =\n this.config.conversationHistoryConfig ?? createDefaultConversationHistoryConfig();\n\n if (historyConfig && historyConfig.mode !== 'none') {\n if (historyConfig.mode === 'full') {\n const filters = {\n delegationId: this.delegationId,\n isDelegated: this.isDelegatedAgent,\n };\n\n conversationHistory = await getFormattedConversationHistory({\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n conversationId: contextId,\n currentMessage: userMessage,\n options: historyConfig,\n filters,\n });\n } else if (historyConfig.mode === 'scoped') {\n conversationHistory = await getFormattedConversationHistory({\n tenantId: this.config.tenantId,\n projectId: this.config.projectId,\n conversationId: contextId,\n currentMessage: userMessage,\n options: historyConfig,\n filters: {\n subAgentId: this.config.id,\n taskId: taskId,\n delegationId: this.delegationId,\n isDelegated: this.isDelegatedAgent,\n },\n });\n }\n }\n\n // Use the primary model for text generation\n const primaryModelSettings = this.getPrimaryModel();\n const modelSettings = ModelFactory.prepareGenerationConfig(primaryModelSettings);\n let response: any;\n let textResponse: string;\n\n // Check if we have structured output components\n const hasStructuredOutput =\n this.config.dataComponents && this.config.dataComponents.length > 0;\n\n // Phase 1: Stream only if no structured output needed\n const shouldStreamPhase1 = this.getStreamingHelper() && !hasStructuredOutput;\n\n // Extract maxDuration from config and convert to milliseconds, or use defaults\n // Add upper bound validation to prevent extremely long timeouts\n const configuredTimeout = modelSettings.maxDuration\n ? Math.min(modelSettings.maxDuration * 1000, LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS)\n : shouldStreamPhase1\n ? LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_STREAMING\n : LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_NON_STREAMING;\n\n // Ensure timeout doesn't exceed maximum\n const timeoutMs = Math.min(configuredTimeout, LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS);\n\n if (\n modelSettings.maxDuration &&\n modelSettings.maxDuration * 1000 > LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS\n ) {\n logger.warn(\n {\n requestedTimeout: modelSettings.maxDuration * 1000,\n appliedTimeout: timeoutMs,\n maxAllowed: LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS,\n },\n 'Requested timeout exceeded maximum allowed, capping to 10 minutes'\n );\n }\n\n // Build messages for Phase 1 - use thinking prompt if structured output needed\n const phase1SystemPrompt = hasStructuredOutput ? thinkingSystemPrompt : systemPrompt;\n const messages: any[] = [];\n messages.push({ role: 'system', content: phase1SystemPrompt });\n\n if (conversationHistory.trim() !== '') {\n messages.push({ role: 'user', content: conversationHistory });\n }\n messages.push({\n role: 'user',\n content: userMessage,\n });\n\n // Capture original message count and initialize compressor for this generation\n const originalMessageCount = messages.length;\n const compressionConfig = getCompressionConfigFromEnv();\n const compressor = compressionConfig.enabled\n ? new MidGenerationCompressor(\n sessionId,\n contextId,\n this.config.tenantId,\n this.config.projectId,\n compressionConfig,\n this.getSummarizerModel(),\n primaryModelSettings\n )\n : null;\n\n // Store compressor for tool access\n this.currentCompressor = compressor;\n\n // ----- PHASE 1: Planning with tools -----\n\n if (shouldStreamPhase1) {\n // Streaming Phase 1: Natural text + tools (no structured output needed)\n const streamConfig = {\n ...modelSettings,\n toolChoice: 'auto' as const, // Allow natural text + tools\n };\n\n // Use streamText for Phase 1 (text-only responses)\n const streamResult = streamText({\n ...streamConfig,\n messages,\n tools: sanitizedTools,\n prepareStep: async ({ messages: stepMessages }) => {\n // Check if compression is enabled\n if (!compressor) {\n return {};\n }\n\n // Check if compression is needed (manual or automatic)\n const compressionNeeded = compressor.isCompressionNeeded(stepMessages);\n\n if (compressionNeeded) {\n logger.info(\n {\n compressorState: compressor.getState(),\n },\n 'Triggering layered mid-generation compression'\n );\n\n try {\n // Split messages into original vs generated\n const originalMessages = stepMessages.slice(0, originalMessageCount);\n const generatedMessages = stepMessages.slice(originalMessageCount);\n\n if (generatedMessages.length > 0) {\n // Compress ONLY the generated content (tool results, intermediate steps)\n const compressionResult = await compressor.compress(generatedMessages);\n\n // Build final messages: original + preserved text + summary\n const finalMessages = [...originalMessages];\n\n // Add preserved text messages first (so they appear in natural order)\n if (\n compressionResult.summary.text_messages &&\n compressionResult.summary.text_messages.length > 0\n ) {\n finalMessages.push(...compressionResult.summary.text_messages);\n }\n\n // Add compressed summary message last (provides context for artifacts)\n const summaryMessage = JSON.stringify({\n high_level: compressionResult.summary?.summary?.high_level,\n user_intent: compressionResult.summary?.summary?.user_intent,\n decisions: compressionResult.summary?.summary?.decisions,\n open_questions: compressionResult.summary?.summary?.open_questions,\n next_steps: compressionResult.summary?.summary?.next_steps,\n related_artifacts: compressionResult?.summary?.summary?.related_artifacts,\n });\n finalMessages.push({\n role: 'user',\n content: `Based on your research, here's what you've discovered: ${summaryMessage}\n\nNow please provide your answer to my original question using this context.`,\n });\n\n logger.info(\n {\n originalTotal: stepMessages.length,\n compressed: finalMessages.length,\n originalKept: originalMessages.length,\n generatedCompressed: generatedMessages.length,\n },\n 'Generated content compression completed'\n );\n logger.info({ summaryMessage }, 'Summary message');\n\n return { messages: finalMessages };\n }\n\n // No generated messages yet, nothing to compress\n return {};\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'Smart compression failed, falling back to simple compression'\n );\n\n // Fallback: simple compression by dropping oldest messages\n try {\n const targetSize = Math.floor(compressor.getHardLimit() * 0.5); // Use 50% of limit as target\n const fallbackMessages = this.simpleCompression(stepMessages, targetSize);\n\n logger.info(\n {\n originalCount: stepMessages.length,\n compressedCount: fallbackMessages.length,\n compressionType: 'simple_fallback',\n },\n 'Simple compression fallback completed'\n );\n\n return { messages: fallbackMessages };\n } catch (fallbackError) {\n logger.error(\n {\n error:\n fallbackError instanceof Error\n ? fallbackError.message\n : String(fallbackError),\n },\n 'Fallback compression also failed, continuing without compression'\n );\n return {};\n }\n }\n }\n\n return {};\n },\n stopWhen: async ({ steps }) => {\n const last = steps.at(-1);\n if (last && 'text' in last && last.text) {\n try {\n await agentSessionManager.recordEvent(\n this.getStreamRequestId(),\n 'agent_reasoning',\n this.config.id,\n {\n parts: [{ type: 'text', content: last.text }],\n }\n );\n } catch (error) {\n logger.debug({ error }, 'Failed to track agent reasoning');\n }\n }\n if (last && last['content'] && last['content'].length > 0) {\n const lastContent = last['content'][last['content'].length - 1];\n if (lastContent['type'] === 'tool-error') {\n const error = lastContent['error'];\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === 'connection_refused'\n ) {\n return true;\n }\n }\n }\n\n if (steps.length >= 2) {\n const previousStep = steps[steps.length - 2];\n if (previousStep && 'toolCalls' in previousStep && previousStep.toolCalls) {\n const hasTransferCall = previousStep.toolCalls.some((tc: any) =>\n tc.toolName.startsWith('transfer_to_')\n );\n if (\n hasTransferCall &&\n 'toolResults' in previousStep &&\n previousStep.toolResults\n ) {\n return true; // Stop after transfer tool has executed\n }\n }\n }\n\n return steps.length >= this.getMaxGenerationSteps();\n },\n experimental_telemetry: {\n isEnabled: true,\n functionId: this.config.id,\n recordInputs: true,\n recordOutputs: true,\n metadata: {\n subAgentId: this.config.id,\n subAgentName: this.config.name,\n },\n },\n abortSignal: AbortSignal.timeout(timeoutMs),\n });\n\n const streamHelper = this.getStreamingHelper();\n if (!streamHelper) {\n throw new Error('Stream helper is unexpectedly undefined in streaming context');\n }\n const session = toolSessionManager.getSession(sessionId);\n const artifactParserOptions = {\n sessionId,\n taskId: session?.taskId,\n projectId: session?.projectId,\n artifactComponents: this.artifactComponents,\n streamRequestId: this.getStreamRequestId(),\n subAgentId: this.config.id,\n };\n const parser = new IncrementalStreamParser(\n streamHelper,\n this.config.tenantId,\n contextId,\n artifactParserOptions\n );\n\n for await (const event of streamResult.fullStream) {\n switch (event.type) {\n case 'text-delta':\n await parser.processTextChunk(event.text);\n break;\n case 'tool-call':\n parser.markToolResult();\n break;\n case 'tool-result':\n parser.markToolResult();\n break;\n case 'finish':\n if (event.finishReason === 'tool-calls') {\n parser.markToolResult();\n }\n break;\n case 'error': {\n if (event.error instanceof Error) {\n throw event.error;\n }\n const errorMessage = (event.error as any)?.error?.message;\n throw new Error(errorMessage);\n }\n }\n }\n\n await parser.finalize();\n\n response = await streamResult;\n\n const collectedParts = parser.getCollectedParts();\n if (collectedParts.length > 0) {\n response.formattedContent = {\n parts: collectedParts.map((part) => ({\n kind: part.kind,\n ...(part.kind === 'text' && { text: part.text }),\n ...(part.kind === 'data' && { data: part.data }),\n })),\n };\n }\n\n const streamedContent = parser.getAllStreamedContent();\n if (streamedContent.length > 0) {\n response.streamedContent = {\n parts: streamedContent.map((part: any) => ({\n kind: part.kind,\n ...(part.kind === 'text' && { text: part.text }),\n ...(part.kind === 'data' && { data: part.data }),\n })),\n };\n }\n } else {\n let genConfig: any;\n if (hasStructuredOutput) {\n genConfig = {\n ...modelSettings,\n toolChoice: 'required' as const, // Force tool usage, prevent text generation\n };\n } else {\n genConfig = {\n ...modelSettings,\n toolChoice: 'auto' as const, // Allow both tools and text generation\n };\n }\n\n response = await generateText({\n ...genConfig,\n messages,\n tools: sanitizedTools,\n prepareStep: async ({ messages: stepMessages }) => {\n // Check if compression is enabled\n if (!compressor) {\n return {};\n }\n\n // Check if compression is needed (manual or automatic)\n const compressionNeeded = compressor.isCompressionNeeded(stepMessages);\n\n if (compressionNeeded) {\n logger.info(\n {\n compressorState: compressor.getState(),\n },\n 'Triggering layered mid-generation compression'\n );\n\n try {\n // Split messages into original vs generated\n const originalMessages = stepMessages.slice(0, originalMessageCount);\n const generatedMessages = stepMessages.slice(originalMessageCount);\n\n if (generatedMessages.length > 0) {\n // Compress ONLY the generated content (tool results, intermediate steps)\n const compressionResult = await compressor.compress(generatedMessages);\n\n // Build final messages: original + preserved text + summary\n const finalMessages = [...originalMessages];\n\n // Add preserved text messages first (so they appear in natural order)\n if (\n compressionResult.summary.text_messages &&\n compressionResult.summary.text_messages.length > 0\n ) {\n finalMessages.push(...compressionResult.summary.text_messages);\n }\n\n // Add compressed summary message last (provides context for artifacts)\n const summaryMessage = JSON.stringify({\n high_level: compressionResult.summary?.summary?.high_level,\n user_intent: compressionResult.summary?.summary?.user_intent,\n decisions: compressionResult.summary?.summary?.decisions,\n open_questions: compressionResult.summary?.summary?.open_questions,\n next_steps: compressionResult.summary?.summary?.next_steps,\n related_artifacts: compressionResult?.summary?.summary?.related_artifacts,\n });\n finalMessages.push({\n role: 'user',\n content: `Based on your research, here's what you've discovered: ${summaryMessage}\n\nNow please provide your answer to my original question using this context.`,\n });\n\n logger.info(\n {\n originalTotal: stepMessages.length,\n compressed: finalMessages.length,\n originalKept: originalMessages.length,\n generatedCompressed: generatedMessages.length,\n },\n 'Generated content compression completed'\n );\n logger.info({ summaryMessage }, 'Summary message');\n\n return { messages: finalMessages };\n }\n\n // No generated messages yet, nothing to compress\n return {};\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'Smart compression failed, falling back to simple compression'\n );\n\n // Fallback: simple compression by dropping oldest messages\n try {\n const targetSize = Math.floor(compressor.getHardLimit() * 0.5); // Use 50% of limit as target\n const fallbackMessages = this.simpleCompression(stepMessages, targetSize);\n\n logger.info(\n {\n originalCount: stepMessages.length,\n compressedCount: fallbackMessages.length,\n compressionType: 'simple_fallback',\n },\n 'Simple compression fallback completed'\n );\n\n return { messages: fallbackMessages };\n } catch (fallbackError) {\n logger.error(\n {\n error:\n fallbackError instanceof Error\n ? fallbackError.message\n : String(fallbackError),\n },\n 'Fallback compression also failed, continuing without compression'\n );\n return {};\n }\n }\n }\n\n return {};\n },\n stopWhen: async ({ steps }) => {\n const last = steps.at(-1);\n if (last && 'text' in last && last.text) {\n try {\n await agentSessionManager.recordEvent(\n this.getStreamRequestId(),\n 'agent_reasoning',\n this.config.id,\n {\n parts: [{ type: 'text', content: last.text }],\n }\n );\n } catch (error) {\n logger.debug({ error }, 'Failed to track agent reasoning');\n }\n }\n\n if (steps.length >= 2) {\n const previousStep = steps[steps.length - 2];\n if (previousStep && 'toolCalls' in previousStep && previousStep.toolCalls) {\n const hasStopTool = previousStep.toolCalls.some(\n (tc: any) =>\n tc.toolName.startsWith('transfer_to_') ||\n tc.toolName === 'thinking_complete'\n );\n if (hasStopTool && 'toolResults' in previousStep && previousStep.toolResults) {\n return true; // Stop after transfer/thinking_complete tool has executed\n }\n }\n }\n\n return steps.length >= this.getMaxGenerationSteps();\n },\n experimental_telemetry: {\n isEnabled: true,\n functionId: this.config.id,\n recordInputs: true,\n recordOutputs: true,\n metadata: {\n phase: 'planning',\n subAgentId: this.config.id,\n subAgentName: this.config.name,\n },\n },\n abortSignal: AbortSignal.timeout(timeoutMs),\n });\n }\n\n if (response.steps) {\n const resolvedSteps = await response.steps;\n response = { ...response, steps: resolvedSteps };\n }\n\n if (hasStructuredOutput && !hasToolCallWithPrefix('transfer_to_')(response)) {\n const thinkingCompleteCall = response.steps\n ?.flatMap((s: any) => s.toolCalls || [])\n ?.find((tc: any) => tc.toolName === 'thinking_complete');\n\n if (thinkingCompleteCall) {\n const reasoningFlow: any[] = [];\n\n // Check if compression has occurred and use compression summary instead of detailed tool results\n const compressionSummary = this.currentCompressor?.getCompressionSummary();\n\n if (compressionSummary) {\n // Use the entire compression summary\n const summaryContent = JSON.stringify(compressionSummary, null, 2);\n\n reasoningFlow.push({\n role: 'assistant',\n content: `## Research Summary (Compressed)\\n\\nBased on tool executions, here's the comprehensive summary:\\n\\n\\`\\`\\`json\\n${summaryContent}\\n\\`\\`\\`\\n\\nThis summary represents all tool execution results in compressed form. Full details are preserved in artifacts.`,\n });\n } else if (response.steps) {\n response.steps.forEach((step: any) => {\n if (step.toolCalls && step.toolResults) {\n step.toolCalls.forEach((call: any, index: number) => {\n const result = step.toolResults[index];\n if (result) {\n const storedResult = toolSessionManager.getToolResult(\n sessionId,\n result.toolCallId\n );\n const toolName = storedResult?.toolName || call.toolName;\n\n if (toolName === 'thinking_complete') {\n return;\n }\n const actualResult = storedResult?.result || result.result || result;\n const actualArgs = storedResult?.args || call.args;\n\n const cleanResult =\n actualResult &&\n typeof actualResult === 'object' &&\n !Array.isArray(actualResult)\n ? Object.fromEntries(\n Object.entries(actualResult).filter(\n ([key]) => key !== '_structureHints'\n )\n )\n : actualResult;\n\n const input = actualArgs ? JSON.stringify(actualArgs, null, 2) : 'No input';\n const output =\n typeof cleanResult === 'string'\n ? cleanResult\n : JSON.stringify(cleanResult, null, 2);\n\n let structureHintsFormatted = '';\n if (\n actualResult?._structureHints &&\n this.artifactComponents &&\n this.artifactComponents.length > 0\n ) {\n const hints = actualResult._structureHints;\n structureHintsFormatted = `\n### 📊 Structure Hints for Artifact Creation\n\n**Terminal Field Paths (${hints.terminalPaths?.length || 0} found):**\n${hints.terminalPaths?.map((path: string) => ` • ${path}`).join('\\n') || ' None detected'}\n\n**Array Structures (${hints.arrayPaths?.length || 0} found):**\n${hints.arrayPaths?.map((path: string) => ` • ${path}`).join('\\n') || ' None detected'}\n\n**Object Structures (${hints.objectPaths?.length || 0} found):**\n${hints.objectPaths?.map((path: string) => ` • ${path}`).join('\\n') || ' None detected'}\n\n**Example Selectors:**\n${hints.exampleSelectors?.map((sel: string) => ` • ${sel}`).join('\\n') || ' None detected'}\n\n**Common Fields:**\n${hints.commonFields?.map((field: string) => ` • ${field}`).join('\\n') || ' None detected'}\n\n**Structure Stats:** ${hints.totalPathsFound || 0} total paths, ${hints.maxDepthFound || 0} levels deep\n\n**Note:** ${hints.note || 'Use these paths for artifact base selectors.'}\n\n**Forbidden Syntax:** ${hints.forbiddenSyntax || 'Use these paths for artifact base selectors.'}\n`;\n }\n\n const formattedResult = `## Tool: ${call.toolName}\n\n### 🔧 TOOL_CALL_ID: ${result.toolCallId}\n\n### Input\n${input}\n\n### Output\n${output}${structureHintsFormatted}`;\n\n reasoningFlow.push({\n role: 'assistant',\n content: formattedResult,\n });\n }\n });\n }\n });\n }\n\n const componentSchemas: z.ZodType<any>[] = [];\n\n if (this.config.dataComponents && this.config.dataComponents.length > 0) {\n this.config.dataComponents.forEach((dc) => {\n const propsSchema = jsonSchemaToZod(dc.props);\n componentSchemas.push(\n z.object({\n id: z.string(),\n name: z.literal(dc.name),\n props: propsSchema,\n })\n );\n });\n }\n\n if (this.artifactComponents.length > 0) {\n const artifactCreateSchemas = ArtifactCreateSchema.getSchemas(\n this.artifactComponents\n );\n componentSchemas.push(...artifactCreateSchemas);\n componentSchemas.push(ArtifactReferenceSchema.getSchema());\n }\n\n let dataComponentsSchema: z.ZodType<any>;\n if (componentSchemas.length === 1) {\n dataComponentsSchema = componentSchemas[0];\n } else {\n dataComponentsSchema = z.union(\n componentSchemas as [z.ZodType<any>, z.ZodType<any>, ...z.ZodType<any>[]]\n );\n }\n\n const structuredModelSettings = ModelFactory.prepareGenerationConfig(\n this.getStructuredOutputModel()\n );\n\n // Configure Phase 2 timeout with proper capping to MAX_ALLOWED\n const configuredPhase2Timeout = structuredModelSettings.maxDuration\n ? Math.min(\n structuredModelSettings.maxDuration * 1000,\n LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS\n )\n : LLM_GENERATION_SUBSEQUENT_CALL_TIMEOUT_MS;\n\n // Ensure timeout doesn't exceed maximum\n const phase2TimeoutMs = Math.min(\n configuredPhase2Timeout,\n LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS\n );\n\n if (\n structuredModelSettings.maxDuration &&\n structuredModelSettings.maxDuration * 1000 > LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS\n ) {\n logger.warn(\n {\n requestedTimeout: structuredModelSettings.maxDuration * 1000,\n appliedTimeout: phase2TimeoutMs,\n maxAllowed: LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS,\n phase: 'structured_generation',\n },\n 'Phase 2 requested timeout exceeded maximum allowed, capping to 10 minutes'\n );\n }\n\n const shouldStreamPhase2 = this.getStreamingHelper();\n\n if (shouldStreamPhase2) {\n const phase2Messages: any[] = [\n {\n role: 'system',\n content: await this.buildPhase2SystemPrompt(runtimeContext),\n },\n ];\n\n if (conversationHistory.trim() !== '') {\n phase2Messages.push({ role: 'user', content: conversationHistory });\n }\n\n phase2Messages.push({ role: 'user', content: userMessage });\n phase2Messages.push(...reasoningFlow);\n\n // Ensure the last message is not an assistant message when using output_format\n if (\n reasoningFlow.length > 0 &&\n reasoningFlow[reasoningFlow.length - 1]?.role === 'assistant'\n ) {\n phase2Messages.push({\n role: 'user',\n content: 'Continue with the structured response.',\n });\n }\n\n const streamResult = streamObject({\n ...structuredModelSettings,\n messages: phase2Messages,\n schema: z.object({\n dataComponents: z.array(dataComponentsSchema),\n }),\n experimental_telemetry: {\n isEnabled: true,\n functionId: this.config.id,\n recordInputs: true,\n recordOutputs: true,\n metadata: {\n phase: 'structured_generation',\n subAgentId: this.config.id,\n subAgentName: this.config.name,\n },\n },\n abortSignal: AbortSignal.timeout(phase2TimeoutMs),\n });\n\n const streamHelper = this.getStreamingHelper();\n if (!streamHelper) {\n throw new Error('Stream helper is unexpectedly undefined in streaming context');\n }\n const session = toolSessionManager.getSession(sessionId);\n const artifactParserOptions = {\n sessionId,\n taskId: session?.taskId,\n projectId: session?.projectId,\n artifactComponents: this.artifactComponents,\n streamRequestId: this.getStreamRequestId(),\n subAgentId: this.config.id,\n };\n const parser = new IncrementalStreamParser(\n streamHelper,\n this.config.tenantId,\n contextId,\n artifactParserOptions\n );\n\n for await (const delta of streamResult.partialObjectStream) {\n if (delta) {\n await parser.processObjectDelta(delta);\n }\n }\n\n await parser.finalize();\n\n const structuredResponse = await streamResult;\n\n const collectedParts = parser.getCollectedParts();\n if (collectedParts.length > 0) {\n response.formattedContent = {\n parts: collectedParts.map((part) => ({\n kind: part.kind,\n ...(part.kind === 'text' && { text: part.text }),\n ...(part.kind === 'data' && { data: part.data }),\n })),\n };\n }\n\n response = {\n ...response,\n object: structuredResponse.object,\n };\n textResponse = JSON.stringify(structuredResponse.object, null, 2);\n } else {\n const { withJsonPostProcessing } = await import('../utils/json-postprocessor');\n\n const phase2Messages: any[] = [\n { role: 'system', content: await this.buildPhase2SystemPrompt(runtimeContext) },\n ];\n\n if (conversationHistory.trim() !== '') {\n phase2Messages.push({ role: 'user', content: conversationHistory });\n }\n\n phase2Messages.push({ role: 'user', content: userMessage });\n phase2Messages.push(...reasoningFlow);\n\n // Ensure the last message is not an assistant message when using output_format\n if (\n reasoningFlow.length > 0 &&\n reasoningFlow[reasoningFlow.length - 1]?.role === 'assistant'\n ) {\n phase2Messages.push({\n role: 'user',\n content: 'Continue with the structured response.',\n });\n }\n\n const structuredResponse = await generateObject(\n withJsonPostProcessing({\n ...structuredModelSettings,\n messages: phase2Messages,\n schema: z.object({\n dataComponents: z.array(dataComponentsSchema),\n }),\n experimental_telemetry: {\n isEnabled: true,\n functionId: this.config.id,\n recordInputs: true,\n recordOutputs: true,\n metadata: {\n phase: 'structured_generation',\n subAgentId: this.config.id,\n subAgentName: this.config.name,\n },\n },\n abortSignal: AbortSignal.timeout(phase2TimeoutMs),\n })\n );\n\n response = {\n ...response,\n object: structuredResponse.object,\n };\n textResponse = JSON.stringify(structuredResponse.object, null, 2);\n }\n } else {\n textResponse = response.text || '';\n }\n } else {\n textResponse = response.steps[response.steps.length - 1].text || '';\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n\n let formattedContent: MessageContent | null = response.formattedContent || null;\n\n if (!formattedContent) {\n const session = toolSessionManager.getSession(sessionId);\n const responseFormatter = new ResponseFormatter(this.config.tenantId, {\n sessionId,\n taskId: session?.taskId,\n projectId: session?.projectId,\n contextId,\n artifactComponents: this.artifactComponents,\n streamRequestId: this.getStreamRequestId(),\n subAgentId: this.config.id,\n });\n\n if (response.object) {\n formattedContent = await responseFormatter.formatObjectResponse(\n response.object,\n contextId\n );\n } else if (textResponse) {\n formattedContent = await responseFormatter.formatResponse(textResponse, contextId);\n }\n }\n\n const formattedResponse = {\n ...response,\n formattedContent: formattedContent,\n };\n\n if (streamRequestId) {\n const generationType = response.object ? 'object_generation' : 'text_generation';\n\n agentSessionManager.recordEvent(streamRequestId, 'agent_generate', this.config.id, {\n parts: (formattedContent?.parts || []).map((part) => ({\n type:\n part.kind === 'text'\n ? ('text' as const)\n : part.kind === 'data'\n ? ('tool_result' as const)\n : ('text' as const),\n content: part.text || JSON.stringify(part.data),\n })),\n generationType,\n });\n }\n\n // Clear compressor reference to prevent memory leaks\n this.currentCompressor = null;\n\n return formattedResponse;\n } catch (error) {\n // Clear compressor reference to prevent memory leaks\n this.currentCompressor = null;\n\n // Don't clean up ToolSession on error - let ToolSessionManager handle cleanup\n const errorToThrow = error instanceof Error ? error : new Error(String(error));\n setSpanWithError(span, errorToThrow);\n span.end();\n throw errorToThrow;\n }\n }\n );\n }\n}\n","import {\n type AgentConversationHistoryConfig,\n type CredentialStoreRegistry,\n dbResultToMcpTool,\n generateId,\n getAgentById,\n getAgentWithDefaultSubAgent,\n getArtifactComponentsForAgent,\n getDataComponentsForAgent,\n getExternalAgentsForSubAgent,\n getRelatedAgentsForAgent,\n getSubAgentById,\n getTeamAgentsForSubAgent,\n getToolsForAgent,\n type McpTool,\n type Part,\n type SubAgentApiSelect,\n TaskState,\n} from '@inkeep/agents-core';\nimport type { A2ATask, A2ATaskResult } from '../a2a/types';\nimport { generateDescriptionWithRelationData } from '../data/agents';\nimport dbClient from '../data/db/dbClient';\nimport { getLogger } from '../logger';\nimport { agentSessionManager } from '../services/AgentSession';\nimport type { SandboxConfig } from '../types/execution-context';\nimport { resolveModelConfig } from '../utils/model-resolver';\nimport { Agent } from './Agent';\nimport { toolSessionManager } from './ToolSessionManager';\n\nconst logger = getLogger('generateTaskHandler');\n\n/**\n * Serializable configuration for creating task handlers\n */\nexport interface TaskHandlerConfig {\n tenantId: string;\n projectId: string;\n agentId: string;\n subAgentId: string;\n agentSchema: SubAgentApiSelect;\n name: string;\n baseUrl: string;\n apiKey?: string;\n description?: string;\n contextConfigId?: string;\n conversationHistoryConfig?: AgentConversationHistoryConfig;\n sandboxConfig?: SandboxConfig;\n /** User ID for user-scoped credential lookups (available when request is from authenticated user) */\n userId?: string;\n}\n\nexport const createTaskHandler = (\n config: TaskHandlerConfig,\n credentialStoreRegistry?: CredentialStoreRegistry\n) => {\n return async (task: A2ATask): Promise<A2ATaskResult> => {\n try {\n const userMessage = task.input.parts\n .filter((part) => part.text)\n .map((part) => part.text)\n .join(' ');\n\n if (!userMessage.trim()) {\n return {\n status: {\n state: TaskState.Failed,\n message: 'No text content found in task input',\n },\n artifacts: [],\n };\n }\n\n const [\n internalRelations,\n externalRelations,\n teamRelations,\n toolsForAgent,\n dataComponents,\n artifactComponents,\n ] = await Promise.all([\n getRelatedAgentsForAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n },\n subAgentId: config.subAgentId,\n }),\n getExternalAgentsForSubAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: config.subAgentId,\n },\n }),\n getTeamAgentsForSubAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: config.subAgentId,\n },\n }),\n getToolsForAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: config.subAgentId,\n },\n }),\n getDataComponentsForAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: config.subAgentId,\n },\n }),\n getArtifactComponentsForAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: config.subAgentId,\n },\n }),\n ]);\n\n const enhancedInternalRelations = await Promise.all(\n internalRelations.data.map(async (relation) => {\n try {\n const relatedAgent = await getSubAgentById(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n },\n subAgentId: relation.id,\n });\n if (relatedAgent) {\n const relatedAgentRelations = await getRelatedAgentsForAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n },\n subAgentId: relation.id,\n });\n\n const relatedAgentExternalAgentRelations = await getExternalAgentsForSubAgent(\n dbClient\n )({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: relation.id,\n },\n });\n const relatedAgentTeamAgentRelations = await getTeamAgentsForSubAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: relation.id,\n },\n });\n\n const enhancedDescription = generateDescriptionWithRelationData(\n relation.description || '',\n relatedAgentRelations.data,\n relatedAgentExternalAgentRelations.data,\n relatedAgentTeamAgentRelations.data\n );\n return { ...relation, description: enhancedDescription };\n }\n } catch (error) {\n logger.warn({ subAgentId: relation.id, error }, 'Failed to enhance agent description');\n }\n return relation;\n })\n );\n\n const enhancedTeamRelations = await Promise.all(\n teamRelations.data.map(async (relation) => {\n try {\n // Get the default sub agent for the team agent\n const teamAgentWithDefault = await getAgentWithDefaultSubAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: relation.targetAgentId,\n },\n });\n\n if (teamAgentWithDefault?.defaultSubAgent) {\n const defaultSubAgent = teamAgentWithDefault.defaultSubAgent;\n\n // Get related agents for the default sub agent\n const relatedAgentRelations = await getRelatedAgentsForAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: relation.targetAgentId,\n },\n subAgentId: defaultSubAgent.id,\n });\n\n // Get external agents for the default sub agent\n const relatedAgentExternalAgentRelations = await getExternalAgentsForSubAgent(\n dbClient\n )({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: relation.targetAgentId,\n subAgentId: defaultSubAgent.id,\n },\n });\n\n // Get team agents for the default sub agent\n const relatedAgentTeamAgentRelations = await getTeamAgentsForSubAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: relation.targetAgentId,\n subAgentId: defaultSubAgent.id,\n },\n });\n\n const enhancedDescription = generateDescriptionWithRelationData(\n teamAgentWithDefault.description || '',\n relatedAgentRelations.data,\n relatedAgentExternalAgentRelations.data,\n relatedAgentTeamAgentRelations.data\n );\n\n return {\n ...relation,\n targetAgent: {\n ...relation.targetAgent,\n description: enhancedDescription,\n },\n };\n }\n } catch (error) {\n logger.warn(\n { targetAgentId: relation.targetAgentId, error },\n 'Failed to enhance team agent description'\n );\n }\n return relation;\n })\n );\n\n const prompt = 'prompt' in config.agentSchema ? config.agentSchema.prompt || undefined : '';\n const models = 'models' in config.agentSchema ? config.agentSchema.models : undefined;\n const stopWhen = 'stopWhen' in config.agentSchema ? config.agentSchema.stopWhen : undefined;\n\n // Convert db tools to MCP tools and filter by selectedTools\n const toolsForAgentResult: McpTool[] =\n (await Promise.all(\n toolsForAgent.data.map(async (item) => {\n const mcpTool = await dbResultToMcpTool(\n item.tool,\n dbClient,\n credentialStoreRegistry,\n item.id,\n config.userId\n );\n\n // Filter available tools based on selectedTools for this agent-tool relationship\n if (item.selectedTools && item.selectedTools.length > 0) {\n const selectedToolsSet = new Set(item.selectedTools);\n mcpTool.availableTools =\n mcpTool.availableTools?.filter((tool) => selectedToolsSet.has(tool.name)) || [];\n }\n\n return mcpTool;\n })\n )) ?? [];\n\n const agent = new Agent(\n {\n id: config.subAgentId,\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n userId: config.userId,\n name: config.name,\n description: config.description || '',\n prompt,\n models: models || undefined,\n stopWhen: stopWhen || undefined,\n subAgentRelations: enhancedInternalRelations.map((relation) => ({\n id: relation.id,\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n name: relation.name,\n description: relation.description || undefined,\n prompt: '',\n delegateRelations: [],\n subAgentRelations: [],\n transferRelations: [],\n })),\n transferRelations: await Promise.all(\n enhancedInternalRelations\n .filter((relation) => relation.relationType === 'transfer')\n .map(async (relation) => {\n // For internal agents, try to fetch tools and relations\n // For external/team agents, we'll only get tools (if available)\n const targetToolsForAgent = await getToolsForAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: relation.id,\n },\n });\n\n // Try to get transfer and delegate relations for internal agents only\n let targetTransferRelations: any = { data: [] };\n let targetDelegateRelations: any = { data: [] };\n\n try {\n // Only attempt to get relations for internal agents (same tenant/project/agent)\n const [transferRel, delegateRel] = await Promise.all([\n getRelatedAgentsForAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n },\n subAgentId: relation.id,\n }),\n getExternalAgentsForSubAgent(dbClient)({\n scopes: {\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n subAgentId: relation.id,\n },\n }),\n ]);\n targetTransferRelations = transferRel;\n targetDelegateRelations = delegateRel;\n } catch (err: any) {\n logger.info(\n {\n agentId: relation.id,\n error: err?.message || 'Unknown error',\n },\n 'Could not fetch relations for target agent (likely external/team agent), using basic info only'\n );\n }\n\n const targetAgentTools: McpTool[] =\n (await Promise.all(\n targetToolsForAgent.data.map(async (item) => {\n const mcpTool = await dbResultToMcpTool(\n item.tool,\n dbClient,\n credentialStoreRegistry,\n item.id,\n config.userId\n );\n\n // Filter available tools based on selectedTools for this agent-tool relationship\n if (item.selectedTools && item.selectedTools.length > 0) {\n const selectedToolsSet = new Set(item.selectedTools);\n mcpTool.availableTools =\n mcpTool.availableTools?.filter((tool) =>\n selectedToolsSet.has(tool.name)\n ) || [];\n }\n\n return mcpTool;\n })\n )) ?? [];\n\n // Build transfer relations for target agent (if available)\n const targetTransferRelationsConfig = targetTransferRelations.data\n .filter((rel: any) => rel.relationType === 'transfer')\n .map((rel: any) => ({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n id: rel.id,\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n name: rel.name,\n description: rel.description,\n prompt: '',\n delegateRelations: [],\n subAgentRelations: [],\n transferRelations: [],\n // Note: Not including tools for nested relations to avoid infinite recursion\n }));\n\n // Build delegate relations for target agent (if available)\n const targetDelegateRelationsConfig = targetDelegateRelations.data.map(\n (rel: any) => ({\n type: 'external' as const,\n config: {\n id: rel.externalAgent.id,\n name: rel.externalAgent.name,\n description: rel.externalAgent.description || '',\n baseUrl: rel.externalAgent.baseUrl,\n headers: rel.headers,\n credentialReferenceId: rel.externalAgent.credentialReferenceId,\n relationId: rel.id,\n relationType: 'delegate',\n },\n })\n );\n\n return {\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n id: relation.id,\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n name: relation.name,\n description: relation.description || undefined,\n prompt: '',\n delegateRelations: targetDelegateRelationsConfig,\n subAgentRelations: [],\n transferRelations: targetTransferRelationsConfig,\n tools: targetAgentTools, // Include target agent's tools for transfer descriptions\n };\n })\n ),\n delegateRelations: [\n ...enhancedInternalRelations\n .filter((relation) => relation.relationType === 'delegate')\n .map((relation) => ({\n type: 'internal' as const,\n config: {\n id: relation.id,\n relationId: relation.relationId,\n tenantId: config.tenantId,\n projectId: config.projectId,\n agentId: config.agentId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n name: relation.name,\n description: relation.description || undefined,\n prompt: '',\n delegateRelations: [], // Simplified - no nested relations\n subAgentRelations: [],\n transferRelations: [],\n tools: [], // Tools are defined in config files, not DB\n },\n })),\n ...externalRelations.data.map((relation) => ({\n type: 'external' as const,\n config: {\n id: relation.externalAgent.id,\n name: relation.externalAgent.name,\n description: relation.externalAgent.description || '',\n baseUrl: relation.externalAgent.baseUrl,\n headers: relation.headers,\n credentialReferenceId: relation.externalAgent.credentialReferenceId,\n relationId: relation.id,\n relationType: 'delegate',\n },\n })),\n ...enhancedTeamRelations.map((relation) => ({\n type: 'team' as const,\n config: {\n id: relation.targetAgent.id,\n name: relation.targetAgent.name,\n description: relation.targetAgent.description || '',\n baseUrl: config.baseUrl,\n headers: relation.headers,\n relationId: relation.id,\n },\n })),\n ],\n tools: toolsForAgentResult,\n functionTools: [], // All tools are now handled via MCP servers\n dataComponents: dataComponents,\n artifactComponents: artifactComponents,\n contextConfigId: config.contextConfigId || undefined,\n conversationHistoryConfig: config.conversationHistoryConfig,\n sandboxConfig: config.sandboxConfig,\n },\n credentialStoreRegistry\n );\n\n const artifactStreamRequestId = task.context?.metadata?.streamRequestId;\n if (artifactStreamRequestId && artifactComponents.length > 0) {\n agentSessionManager.updateArtifactComponents(artifactStreamRequestId, artifactComponents);\n }\n\n let contextId = task.context?.conversationId;\n\n if (!contextId || contextId === 'default' || contextId === '') {\n const taskIdMatch = task.id.match(/^task_([^-]+-[^-]+-\\d+)-/);\n if (taskIdMatch) {\n contextId = taskIdMatch[1];\n logger.info(\n {\n taskId: task.id,\n extractedContextId: contextId,\n subAgentId: config.subAgentId,\n },\n 'Extracted contextId from task ID for delegation'\n );\n } else {\n contextId = 'default';\n }\n }\n\n const streamRequestId =\n task.context?.metadata?.stream_request_id || task.context?.metadata?.streamRequestId;\n\n const isDelegation = task.context?.metadata?.isDelegation === true;\n const delegationId = task.context?.metadata?.delegationId;\n\n agent.setDelegationStatus(isDelegation);\n agent.setDelegationId(delegationId);\n\n if (isDelegation) {\n logger.info(\n { subAgentId: config.subAgentId, taskId: task.id, delegationId },\n 'Delegated agent - streaming disabled'\n );\n\n if (streamRequestId && config.tenantId && config.projectId) {\n toolSessionManager.ensureAgentSession(\n streamRequestId,\n config.tenantId,\n config.projectId,\n contextId,\n task.id\n );\n }\n }\n\n const response = await agent.generate(userMessage, {\n contextId,\n metadata: {\n conversationId: contextId,\n taskId: task.id,\n threadId: contextId, // using conversationId as threadId for now\n streamRequestId: streamRequestId,\n ...(config.apiKey ? { apiKey: config.apiKey } : {}),\n },\n });\n\n const stepContents =\n response.steps && Array.isArray(response.steps)\n ? response.steps.flatMap((step: any) => {\n return step.content && Array.isArray(step.content) ? step.content : [];\n })\n : [];\n\n const allToolCalls = stepContents.filter((content: any) => content.type === 'tool-call');\n const allToolResults = stepContents.filter((content: any) => content.type === 'tool-result');\n const allThoughts = stepContents.filter((content: any) => content.type === 'text');\n\n if (allToolCalls.length > 0) {\n for (const toolCall of allToolCalls) {\n if (\n toolCall.toolName.includes('transfer') ||\n toolCall.toolName.includes('transferToRefundAgent')\n ) {\n const toolResult = allToolResults.find(\n (result: any) => result.toolCallId === toolCall.toolCallId\n );\n\n logger.info(\n {\n toolCallName: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n hasToolResult: !!toolResult,\n toolResultOutput: toolResult?.output,\n toolResultKeys: toolResult?.output ? Object.keys(toolResult.output) : [],\n },\n '[DEBUG] Transfer tool result found'\n );\n\n const isValidTransferResult = (\n output: unknown\n ): output is {\n type: 'transfer';\n targetSubAgentId: string;\n fromSubAgentId?: string;\n } => {\n return (\n typeof output === 'object' &&\n output !== null &&\n 'type' in output &&\n 'targetSubAgentId' in output &&\n (output as any).type === 'transfer' &&\n typeof (output as any).targetSubAgentId === 'string'\n );\n };\n\n const responseText =\n (response as any).text ||\n ((response as any).object ? JSON.stringify((response as any).object) : '');\n const transferReason =\n responseText ||\n allThoughts[allThoughts.length - 1]?.text ||\n 'Agent requested transfer. No reason provided.';\n\n if (toolResult?.output && isValidTransferResult(toolResult.output)) {\n const transferResult = toolResult.output;\n\n logger.info(\n {\n validationPassed: true,\n transferResult,\n targetSubAgentId: transferResult.targetSubAgentId,\n fromSubAgentId: transferResult.fromSubAgentId,\n },\n '[DEBUG] Transfer validation passed, extracted data'\n );\n\n const artifactData = {\n type: 'transfer',\n targetSubAgentId: transferResult.targetSubAgentId,\n fromSubAgentId: transferResult.fromSubAgentId,\n task_id: task.id,\n reason: transferReason,\n original_message: userMessage,\n };\n\n logger.info(\n {\n artifactData,\n artifactDataKeys: Object.keys(artifactData),\n },\n '[DEBUG] Artifact data being returned'\n );\n\n return {\n status: {\n state: TaskState.Completed,\n message: `Transfer requested to ${transferResult.targetSubAgentId}`,\n },\n artifacts: [\n {\n artifactId: generateId(),\n parts: [\n {\n kind: 'data',\n data: artifactData,\n },\n ],\n },\n ],\n };\n }\n logger.warn(\n {\n hasToolResult: !!toolResult,\n hasOutput: !!toolResult?.output,\n validationPassed: false,\n output: toolResult?.output,\n },\n '[DEBUG] Transfer validation FAILED'\n );\n }\n }\n }\n\n const parts: Part[] = (response.formattedContent?.parts || []).map((part: any) => ({\n kind: part.kind as 'text' | 'data',\n ...(part.kind === 'text' && { text: part.text }),\n ...(part.kind === 'data' && { data: part.data }),\n }));\n\n return {\n status: { state: TaskState.Completed },\n artifacts: [\n {\n artifactId: generateId(),\n parts,\n },\n ],\n };\n } catch (error) {\n console.error('Task handler error:', error);\n\n const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n const isConnectionRefused = errorMessage.includes(\n 'Connection refused. Please check if the MCP server is running.'\n );\n\n return {\n status: {\n state: TaskState.Failed,\n message: errorMessage,\n type: isConnectionRefused ? 'connection_refused' : 'unknown',\n },\n artifacts: [],\n };\n }\n };\n};\n\n/**\n * Serializes a TaskHandlerConfig to JSON\n */\nexport const serializeTaskHandlerConfig = (config: TaskHandlerConfig): string => {\n return JSON.stringify(config, null, 2);\n};\n\n/**\n * Deserializes a TaskHandlerConfig from JSON\n */\nexport const deserializeTaskHandlerConfig = (configJson: string): TaskHandlerConfig => {\n return JSON.parse(configJson) as TaskHandlerConfig;\n};\n\n/**\n * Creates a task handler configuration from agent data\n */\nexport const createTaskHandlerConfig = async (params: {\n tenantId: string;\n projectId: string;\n agentId: string;\n subAgentId: string;\n baseUrl: string;\n apiKey?: string;\n sandboxConfig?: SandboxConfig;\n userId?: string;\n}): Promise<TaskHandlerConfig> => {\n const subAgent = await getSubAgentById(dbClient)({\n scopes: {\n tenantId: params.tenantId,\n projectId: params.projectId,\n agentId: params.agentId,\n },\n subAgentId: params.subAgentId,\n });\n\n const agent = await getAgentById(dbClient)({\n scopes: {\n tenantId: params.tenantId,\n projectId: params.projectId,\n agentId: params.agentId,\n },\n });\n\n if (!subAgent) {\n throw new Error(`Agent not found: ${params.subAgentId}`);\n }\n\n const effectiveModels = await resolveModelConfig(params.agentId, subAgent);\n const effectiveConversationHistoryConfig = subAgent.conversationHistoryConfig;\n\n return {\n tenantId: params.tenantId,\n projectId: params.projectId,\n agentId: params.agentId,\n subAgentId: params.subAgentId,\n agentSchema: {\n id: subAgent.id,\n name: subAgent.name,\n description: subAgent.description,\n prompt: subAgent.prompt,\n models: effectiveModels,\n conversationHistoryConfig: effectiveConversationHistoryConfig || null,\n stopWhen: subAgent.stopWhen || null,\n createdAt: subAgent.createdAt,\n updatedAt: subAgent.updatedAt,\n },\n baseUrl: params.baseUrl,\n apiKey: params.apiKey,\n name: subAgent.name,\n description: subAgent.description || undefined,\n conversationHistoryConfig: effectiveConversationHistoryConfig as AgentConversationHistoryConfig,\n contextConfigId: agent?.contextConfigId || undefined,\n sandboxConfig: params.sandboxConfig,\n userId: params.userId,\n };\n};\n","import {\n type CredentialStoreRegistry,\n type ExecutionContext,\n getAgentWithDefaultSubAgent,\n getSubAgentById,\n type SubAgentSelect,\n} from '@inkeep/agents-core';\nimport type { AgentCard, RegisteredAgent } from '../a2a/types';\nimport { createTaskHandler, createTaskHandlerConfig } from '../agents/generateTaskHandler';\nimport { getLogger } from '../logger';\nimport { getUserIdFromContext, type SandboxConfig } from '../types/execution-context';\nimport dbClient from './db/dbClient';\n\nconst logger = getLogger('agents');\n\n/**\n * Create an AgentCard from database agent data\n * Reusable function that standardizes agent card creation across the codebase\n * Used for external discovery via /.well-known/agent.json endpoint\n */\nexport function createAgentCard({\n dbAgent,\n baseUrl,\n}: {\n dbAgent: SubAgentSelect;\n baseUrl: string;\n}): AgentCard {\n // Use the agent's base description for external discovery\n // External systems don't need to know about internal transfer/delegate capabilities\n const description = dbAgent.description || 'AI Agent';\n\n // Create AgentCard from database data using schema.ts types\n return {\n name: dbAgent.name,\n description,\n url: baseUrl ? `${baseUrl}/a2a` : '',\n version: '1.0.0',\n capabilities: {\n streaming: true, // Enable streaming for A2A compliance\n pushNotifications: false,\n stateTransitionHistory: false,\n },\n defaultInputModes: ['text', 'text/plain'],\n defaultOutputModes: ['text', 'text/plain'],\n skills: [],\n // Add provider info if available\n ...(baseUrl && {\n provider: {\n organization: 'Inkeep',\n url: baseUrl,\n },\n }),\n };\n}\n\n/**\n * Generate an enhanced description that includes transfer and delegation information\n * Used in generateTaskHandler to help agents understand what other agents can do\n *\n * @param baseDescription - The base description of the agent\n * @param internalRelations - Pre-computed internal relations\n * @param externalRelations - Pre-computed external relations\n */\nexport function generateDescriptionWithRelationData(\n baseDescription: string,\n internalRelations: any[],\n externalRelations: any[],\n teamRelations: any[]\n): string {\n // Filter relations by type\n const transfers = [...internalRelations.filter((rel) => rel.relationType === 'transfer')];\n\n const delegates = [\n ...internalRelations.filter((rel) => rel.relationType === 'delegate'),\n ...externalRelations.map((data) => data.externalAgent),\n ...teamRelations.map((data) => data.targetAgent),\n ];\n\n // If no relations, return base description\n if (transfers.length === 0 && delegates.length === 0) {\n return baseDescription;\n }\n\n let enhancedDescription = baseDescription;\n\n // Add transfer information\n if (transfers.length > 0) {\n const transferList = transfers\n .map((rel) => {\n const name = rel.externalAgent?.name || rel.name;\n const desc = rel.externalAgent?.description || rel.description || '';\n return `- ${name}: ${desc}`;\n })\n .join('\\n');\n enhancedDescription += `\\n\\nCan transfer to:\\n${transferList}`;\n }\n\n // Add delegation information\n if (delegates.length > 0) {\n const delegateList = delegates\n .map((rel) => {\n const name = rel.name;\n const desc = rel.description || '';\n return `- ${name}: ${desc}`;\n })\n .join('\\n');\n enhancedDescription += `\\n\\nCan delegate to:\\n${delegateList}`;\n }\n\n return enhancedDescription;\n}\n/**\n * Create a RegisteredAgent from database agent data\n * Hydrates agent directly from database schema using types from schema.ts\n */\nasync function hydrateAgent({\n dbAgent,\n agentId,\n baseUrl,\n apiKey,\n credentialStoreRegistry,\n sandboxConfig,\n userId,\n}: {\n dbAgent: SubAgentSelect;\n agentId: string;\n baseUrl: string;\n apiKey?: string;\n credentialStoreRegistry?: CredentialStoreRegistry;\n sandboxConfig?: SandboxConfig;\n userId?: string;\n}): Promise<RegisteredAgent> {\n try {\n // Create task handler for the agent\n const taskHandlerConfig = await createTaskHandlerConfig({\n tenantId: dbAgent.tenantId,\n projectId: dbAgent.projectId,\n agentId: agentId,\n subAgentId: dbAgent.id,\n baseUrl: baseUrl,\n apiKey: apiKey,\n sandboxConfig,\n userId,\n });\n const taskHandler = createTaskHandler(taskHandlerConfig, credentialStoreRegistry);\n\n // Use the reusable agent card creation function\n const agentCard = createAgentCard({\n dbAgent,\n baseUrl,\n });\n\n return {\n subAgentId: dbAgent.id,\n tenantId: dbAgent.tenantId,\n projectId: dbAgent.projectId,\n agentId: agentId,\n agentCard,\n taskHandler,\n };\n } catch (error) {\n console.error(`❌ Failed to hydrate agent ${dbAgent.id}:`, error);\n throw error;\n }\n}\n\n// A2A functions that hydrate agents on-demand\n\nexport async function getRegisteredAgent(params: {\n executionContext: ExecutionContext;\n credentialStoreRegistry?: CredentialStoreRegistry;\n sandboxConfig?: SandboxConfig;\n}): Promise<RegisteredAgent | null> {\n const { executionContext, credentialStoreRegistry, sandboxConfig } = params;\n const { tenantId, projectId, agentId, subAgentId, baseUrl, apiKey } = executionContext;\n const userId = getUserIdFromContext(executionContext);\n let dbAgent: SubAgentSelect;\n\n if (!subAgentId) {\n const agent = await getAgentWithDefaultSubAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n logger.info({ agent }, 'agent with default sub agent');\n if (!agent || !agent.defaultSubAgent) {\n return null;\n }\n\n dbAgent = agent.defaultSubAgent;\n } else {\n const response = await getSubAgentById(dbClient)({\n scopes: { tenantId, projectId, agentId },\n subAgentId: subAgentId,\n });\n if (!response) {\n return null;\n }\n dbAgent = response;\n }\n if (!dbAgent) {\n return null;\n }\n\n const agentFrameworkBaseUrl = `${baseUrl}/agents`;\n\n return hydrateAgent({\n dbAgent,\n agentId,\n baseUrl: agentFrameworkBaseUrl,\n credentialStoreRegistry,\n apiKey,\n sandboxConfig,\n userId,\n });\n}\n","import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';\nimport {\n type CredentialStoreRegistry,\n createApiError,\n getAgentWithDefaultSubAgent,\n getRequestExecutionContext,\n HeadersScopeSchema,\n} from '@inkeep/agents-core';\nimport type { Context } from 'hono';\nimport { a2aHandler } from '../a2a/handlers';\nimport { getRegisteredAgent } from '../data/agents';\nimport dbClient from '../data/db/dbClient';\nimport { getLogger } from '../logger';\n\ntype AppVariables = {\n credentialStores: CredentialStoreRegistry;\n};\n\nconst app = new OpenAPIHono<{ Variables: AppVariables }>();\nconst logger = getLogger('agents');\n\n// A2A Agent Card Discovery (REST with OpenAPI)\napp.openapi(\n createRoute({\n method: 'get',\n path: '/.well-known/agent.json',\n request: {\n headers: HeadersScopeSchema,\n },\n tags: ['a2a'],\n security: [{ bearerAuth: [] }],\n responses: {\n 200: {\n description: 'Agent Card for A2A discovery',\n content: {\n 'application/json': {\n schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n url: z.string(),\n version: z.string(),\n defaultInputModes: z.array(z.string()),\n defaultOutputModes: z.array(z.string()),\n skills: z.array(z.any()),\n }),\n },\n },\n },\n 404: {\n description: 'Agent not found',\n },\n },\n }),\n async (c: Context) => {\n const otelHeaders = {\n traceparent: c.req.header('traceparent'),\n tracestate: c.req.header('tracestate'),\n baggage: c.req.header('baggage'),\n };\n\n logger.info(\n {\n otelHeaders,\n path: c.req.path,\n method: c.req.method,\n },\n 'OpenTelemetry headers: well-known agent.json'\n );\n\n // Get execution context from API key authentication\n const executionContext = getRequestExecutionContext(c);\n const { tenantId, projectId, agentId, subAgentId } = executionContext;\n\n logger.info({ executionContext }, 'executionContext');\n logger.info(\n {\n message: 'getRegisteredAgent (agent-level)',\n tenantId,\n projectId,\n agentId,\n subAgentId,\n },\n 'agent-level well-known agent.json'\n );\n\n const credentialStores = c.get('credentialStores');\n const sandboxConfig = c.get('sandboxConfig');\n const agent = await getRegisteredAgent({\n executionContext,\n credentialStoreRegistry: credentialStores,\n sandboxConfig,\n });\n logger.info({ agent }, 'agent registered: well-known agent.json');\n if (!agent) {\n throw createApiError({\n code: 'not_found',\n message: 'Agent not found',\n });\n }\n\n return c.json(agent.agentCard);\n }\n);\n\n// A2A Protocol Handler (supports both agent-level and agent-level)\napp.post('/a2a', async (c: Context) => {\n const otelHeaders = {\n traceparent: c.req.header('traceparent'),\n tracestate: c.req.header('tracestate'),\n baggage: c.req.header('baggage'),\n };\n\n logger.info(\n {\n otelHeaders,\n path: c.req.path,\n method: c.req.method,\n },\n 'OpenTelemetry headers: a2a'\n );\n\n // Get execution context from API key authentication\n const executionContext = getRequestExecutionContext(c);\n const { tenantId, projectId, agentId, subAgentId } = executionContext;\n\n // If subAgentId is defined in execution context, run agent-level logic\n if (subAgentId) {\n logger.info(\n {\n message: 'a2a (agent-level)',\n tenantId,\n projectId,\n agentId,\n subAgentId,\n },\n 'agent-level a2a endpoint'\n );\n\n // Ensure agent is registered (lazy loading)\n const credentialStores = c.get('credentialStores');\n const sandboxConfig = c.get('sandboxConfig');\n const agent = await getRegisteredAgent({\n executionContext,\n credentialStoreRegistry: credentialStores,\n sandboxConfig,\n });\n\n if (!agent) {\n return c.json(\n {\n jsonrpc: '2.0',\n error: { code: -32004, message: 'Agent not found' },\n id: null,\n },\n 404\n );\n }\n\n return a2aHandler(c, agent);\n }\n // Run agent-level logic\n logger.info(\n {\n message: 'a2a (agent-level)',\n tenantId,\n projectId,\n agentId,\n },\n 'agent-level a2a endpoint'\n );\n\n // fetch the agent and the default agent\n const agent = await getAgentWithDefaultSubAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n\n if (!agent) {\n return c.json(\n {\n jsonrpc: '2.0',\n error: { code: -32004, message: 'Agent not found' },\n id: null,\n },\n 404\n );\n }\n if (!agent.defaultSubAgentId) {\n return c.json(\n {\n jsonrpc: '2.0',\n error: { code: -32004, message: 'Agent does not have a default agent configured' },\n id: null,\n },\n 400\n );\n }\n executionContext.subAgentId = agent.defaultSubAgentId;\n // fetch the default agent and use it as entry point for the agent\n const credentialStores = c.get('credentialStores');\n const sandboxConfig = c.get('sandboxConfig');\n const defaultSubAgent = await getRegisteredAgent({\n executionContext,\n credentialStoreRegistry: credentialStores,\n sandboxConfig,\n });\n\n if (!defaultSubAgent) {\n return c.json(\n {\n jsonrpc: '2.0',\n error: { code: -32004, message: 'Agent not found' },\n id: null,\n },\n 404\n );\n }\n\n // Use the existing a2aHandler with the default agent as a registered agent\n return a2aHandler(c, defaultSubAgent);\n});\n\nexport default app;\n","// A2A Protocol Types based on Google's specification\nimport {\n AgentCard,\n type Artifact,\n type Message,\n type Task,\n type TaskState,\n} from '@inkeep/agents-core';\n\n// Re-export AgentCard from the official schema\nexport { AgentCard };\n\nexport interface RegisteredAgent {\n subAgentId: string;\n tenantId: string;\n projectId: string;\n agentId: string;\n agentCard: AgentCard;\n taskHandler: (task: A2ATask) => Promise<A2ATaskResult>;\n}\n\nexport interface A2ATask {\n id: string;\n input: {\n parts: Array<{\n kind: string;\n text?: string;\n data?: any;\n }>;\n };\n context?: {\n conversationId?: string;\n userId?: string;\n metadata?: Record<string, any>;\n };\n}\n\nexport type A2ATaskErrorType = 'connection_refused' | 'unknown';\n\nexport interface A2ATaskResult {\n status: {\n state: TaskState;\n message?: string;\n type?: A2ATaskErrorType;\n };\n artifacts?: Artifact[];\n}\n\n// === Transfer Types ===\n\n/**\n * Transfer data structure - what the transfer tool returns\n * This gets wrapped into a DataPart by the AI SDK\n */\nexport interface TransferData {\n type: 'transfer';\n targetSubAgentId: string; // Changed from \"target\" for consistency with codebase naming\n fromSubAgentId?: string;\n}\n\n/**\n * Full transfer response following A2A protocol\n * The TransferData is wrapped in artifacts[0].parts[0].data\n */\nexport interface TransferTask extends Task {\n artifacts: Artifact[];\n}\n\n/**\n * Type guard to check if a Task contains transfer data\n */\nexport function isTransferTask(result: Task | Message): result is TransferTask {\n if (!('artifacts' in result) || !result.artifacts) {\n return false;\n }\n\n const hasTransfer = result.artifacts.some((artifact) =>\n artifact.parts.some((part) => {\n if (part.kind !== 'data' || !part.data) return false;\n // Type-safe check without as any\n const isTransfer =\n typeof part.data === 'object' && 'type' in part.data && part.data.type === 'transfer';\n return isTransfer;\n })\n );\n\n return hasTransfer;\n}\n\n/**\n * Helper to safely extract transfer data from a TransferTask\n * Returns null if no transfer data found\n */\nexport function extractTransferData(task: TransferTask): TransferData | null {\n for (const artifact of task.artifacts) {\n for (const part of artifact.parts) {\n if (part.kind === 'data' && part.data?.type === 'transfer') {\n return part.data as TransferData;\n }\n }\n }\n return null;\n}\n\n// JSON-RPC types\nexport interface JsonRpcRequest {\n jsonrpc: '2.0';\n method: string;\n params?: any;\n id?: string | number | null;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: '2.0';\n result?: any;\n error?: {\n code: number;\n message: string;\n data?: any;\n };\n id?: string | number | null;\n}\n\n// A2A specific JSON-RPC methods\nexport type A2AMethod = 'agent.invoke' | 'agent.getCapabilities' | 'agent.getStatus';\n","import { setActiveAgentForThread } from '@inkeep/agents-core';\nimport dbClient from '../data/db/dbClient';\nimport { getLogger } from '../logger';\n\nconst logger = getLogger('Transfer');\n/**\n * Executes a transfer by sending the original message to the target agent\n */\nexport async function executeTransfer({\n tenantId,\n threadId,\n projectId,\n targetSubAgentId,\n}: {\n tenantId: string;\n threadId: string;\n projectId: string;\n targetSubAgentId: string;\n}): Promise<{\n success: boolean;\n targetSubAgentId: string;\n}> {\n logger.info(\n {\n targetAgent: targetSubAgentId,\n threadId,\n tenantId,\n projectId,\n },\n 'Executing transfer - calling setActiveAgentForThread'\n );\n\n try {\n await setActiveAgentForThread(dbClient)({\n scopes: { tenantId, projectId },\n threadId,\n subAgentId: targetSubAgentId,\n });\n logger.info(\n { targetAgent: targetSubAgentId, threadId },\n 'Successfully updated active_sub_agent_id in database'\n );\n } catch (error) {\n logger.error(\n { error, targetAgent: targetSubAgentId, threadId },\n 'Failed to update active_sub_agent_id'\n );\n throw error;\n }\n\n return { success: true, targetSubAgentId };\n}\n\n/**\n * Checks if a response is a transfer response\n * Re-exported from types.ts for backward compatibility\n */\nexport { extractTransferData, isTransferTask as isTransferResponse } from './types';\n","import type { SummaryEvent } from '@inkeep/agents-core';\nimport { parsePartialJson } from 'ai';\nimport {\n STREAM_BUFFER_MAX_SIZE_BYTES,\n STREAM_MAX_LIFETIME_MS,\n STREAM_TEXT_GAP_THRESHOLD_MS,\n} from '../constants/execution-limits';\nimport type { ErrorEvent, OperationEvent } from './agent-operations';\n\nexport interface StreamHelper {\n writeRole(role?: string): Promise<void>;\n writeContent(content: string): Promise<void>;\n streamData(data: any): Promise<void>;\n streamText(text: string, delayMs?: number): Promise<void>;\n writeError(error: string | ErrorEvent): Promise<void>;\n complete(): Promise<void>;\n writeData(type: string, data: any): Promise<void>;\n writeOperation(operation: OperationEvent): Promise<void>;\n writeSummary(summary: SummaryEvent): Promise<void>;\n}\n\nexport interface HonoSSEStream {\n writeSSE(message: { data: string; event?: string; id?: string }): Promise<void>;\n sleep(ms: number): Promise<unknown>;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string;\n };\n finish_reason: string | null;\n }>;\n}\n\nexport class SSEStreamHelper implements StreamHelper {\n private isTextStreaming: boolean = false;\n private queuedEvents: { type: string; event: OperationEvent | SummaryEvent }[] = [];\n\n constructor(\n private stream: HonoSSEStream,\n private requestId: string,\n private timestamp: number\n ) {}\n\n /**\n * Write the initial role message\n */\n async writeRole(role = 'assistant'): Promise<void> {\n await this.stream.writeSSE({\n data: JSON.stringify({\n id: this.requestId,\n object: 'chat.completion.chunk',\n created: this.timestamp,\n choices: [\n {\n index: 0,\n delta: {\n role,\n },\n finish_reason: null,\n },\n ],\n }),\n });\n }\n\n /**\n * Write content chunk\n */\n async writeContent(content: string): Promise<void> {\n await this.stream.writeSSE({\n data: JSON.stringify({\n id: this.requestId,\n object: 'chat.completion.chunk',\n created: this.timestamp,\n choices: [\n {\n index: 0,\n delta: {\n content,\n },\n finish_reason: null,\n },\n ],\n }),\n });\n }\n\n /**\n * Stream text word by word with optional delay\n */\n async streamText(text: string, delayMs = 100): Promise<void> {\n const words = text.split(' ');\n\n this.isTextStreaming = true;\n\n try {\n for (let i = 0; i < words.length; i++) {\n await this.stream.sleep(delayMs);\n\n const content = i === 0 ? words[i] : ` ${words[i]}`;\n await this.writeContent(content);\n }\n } finally {\n this.isTextStreaming = false;\n\n await this.flushQueuedOperations();\n }\n }\n\n async streamData(data: any): Promise<void> {\n await this.writeContent(JSON.stringify(data));\n }\n\n /**\n * Write error message or error event\n */\n async writeError(error: string | ErrorEvent): Promise<void> {\n const errorMessage = typeof error === 'string' ? error : error.message;\n await this.writeContent(`\\n\\n${errorMessage}`);\n }\n\n /**\n * Write the final completion message\n */\n async writeCompletion(finishReason = 'stop'): Promise<void> {\n await this.stream.writeSSE({\n data: JSON.stringify({\n id: this.requestId,\n object: 'chat.completion.chunk',\n created: this.timestamp,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: finishReason,\n },\n ],\n }),\n });\n }\n\n async writeData(type: string, data: any): Promise<void> {\n await this.stream.writeSSE({\n data: JSON.stringify({\n id: this.requestId,\n object: 'chat.completion.chunk',\n created: this.timestamp,\n choices: [\n {\n index: 0,\n delta: {\n content: JSON.stringify({ type, data }),\n },\n finish_reason: null,\n },\n ],\n }),\n });\n }\n\n async writeSummary(summary: SummaryEvent): Promise<void> {\n if (this.isTextStreaming) {\n this.queuedEvents.push({\n type: 'data-summary',\n event: summary,\n });\n return;\n }\n\n await this.flushQueuedOperations();\n await this.writeData('data-summary', summary);\n }\n\n async writeOperation(operation: OperationEvent): Promise<void> {\n if (this.isTextStreaming) {\n this.queuedEvents.push({\n type: 'data-operation',\n event: operation,\n });\n return;\n }\n\n await this.flushQueuedOperations();\n\n await this.writeData('data-operation', operation);\n }\n\n /**\n * Flush all queued operations in order after text streaming completes\n */\n private async flushQueuedOperations(): Promise<void> {\n if (this.queuedEvents.length === 0) {\n return;\n }\n\n const eventsToFlush = [...this.queuedEvents];\n this.queuedEvents = []; // Clear the queue\n\n for (const event of eventsToFlush) {\n await this.writeData(event.type, event.event);\n }\n }\n\n /**\n * Write the final [DONE] message\n */\n async writeDone(): Promise<void> {\n await this.stream.writeSSE({\n data: '[DONE]',\n });\n }\n\n /**\n * Complete the stream with finish reason and done message\n */\n async complete(finishReason = 'stop'): Promise<void> {\n await this.flushQueuedOperations();\n\n await this.writeCompletion(finishReason);\n await this.writeDone();\n }\n}\n\n/**\n * Factory function to create SSE stream helper\n */\nexport function createSSEStreamHelper(\n stream: HonoSSEStream,\n requestId: string,\n timestamp: number\n): SSEStreamHelper {\n return new SSEStreamHelper(stream, requestId, timestamp);\n}\n\nexport interface VercelUIWriter {\n write(chunk: any): void;\n merge(stream: any): void;\n onError?: (error: Error) => void;\n}\n\nexport class VercelDataStreamHelper implements StreamHelper {\n private textId: string | null = null;\n private jsonBuffer = '';\n private sentItems = new Map<number, string>(); // Track what we've sent for each index\n private completedItems = new Set<number>(); // Track completed items\n private sessionId?: string;\n\n private static readonly MAX_BUFFER_SIZE = STREAM_BUFFER_MAX_SIZE_BYTES;\n private isCompleted = false;\n\n private isTextStreaming: boolean = false;\n private queuedEvents: { type: string; event: OperationEvent | SummaryEvent }[] = [];\n\n private lastTextEndTimestamp: number = 0;\n\n private connectionDropTimer?: ReturnType<typeof setTimeout>;\n\n constructor(private writer: VercelUIWriter) {\n this.connectionDropTimer = setTimeout(() => {\n this.forceCleanup('Connection lifetime exceeded');\n }, STREAM_MAX_LIFETIME_MS);\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n async writeRole(_ = 'assistant'): Promise<void> {}\n\n async writeContent(content: string): Promise<void> {\n if (this.isCompleted) {\n console.warn('Attempted to write content to completed stream');\n return;\n }\n\n if (!this.textId) this.textId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n if (this.jsonBuffer.length + content.length > VercelDataStreamHelper.MAX_BUFFER_SIZE) {\n const newBuffer = this.truncateJsonBufferSafely(this.jsonBuffer);\n\n if (newBuffer.length === this.jsonBuffer.length) {\n console.warn(\n 'VercelDataStreamHelper: Could not find safe JSON truncation point, clearing buffer'\n );\n this.jsonBuffer = '';\n this.sentItems.clear();\n } else {\n this.jsonBuffer = newBuffer;\n this.reindexSentItems();\n }\n }\n\n this.jsonBuffer += content;\n const { value, state } = await parsePartialJson(this.jsonBuffer);\n\n if (!['repaired-parse', 'successful-parse'].includes(state)) return;\n if (!Array.isArray(value)) return;\n\n for (let i = 0; i < value.length; i++) {\n const { type, ...data } = value[i] as { type?: string; [key: string]: any };\n\n const currentContent = JSON.stringify(data);\n const lastSentContent = this.sentItems.get(i);\n\n if (currentContent !== lastSentContent) {\n const chunk = {\n type: 'data-component',\n id: `${this.textId}-${i}`,\n data: { type, ...data },\n };\n\n this.writer.write(chunk);\n this.sentItems.set(i, currentContent);\n }\n }\n }\n\n async streamText(text: string, delayMs = 100): Promise<void> {\n if (this.isCompleted) {\n console.warn('Attempted to stream text to completed stream');\n return;\n }\n\n if (!this.textId) this.textId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n const id = this.textId;\n\n const startTime = Date.now();\n const gapFromLastSequence =\n this.lastTextEndTimestamp > 0\n ? startTime - this.lastTextEndTimestamp\n : Number.MAX_SAFE_INTEGER;\n\n if (gapFromLastSequence >= STREAM_TEXT_GAP_THRESHOLD_MS) {\n await this.flushQueuedOperations();\n }\n\n this.isTextStreaming = true;\n\n try {\n this.writer.write({\n type: 'text-start',\n id,\n });\n\n if (delayMs > 0) {\n await new Promise((r) => setTimeout(r, delayMs));\n }\n\n this.writer.write({\n type: 'text-delta',\n id,\n delta: text,\n });\n\n this.writer.write({\n type: 'text-end',\n id,\n });\n\n this.lastTextEndTimestamp = Date.now();\n } finally {\n this.isTextStreaming = false;\n }\n }\n\n async writeData(type: string, data: any): Promise<void> {\n if (this.isCompleted) {\n console.warn('Attempted to write data to completed stream');\n return;\n }\n\n if (type === 'data-artifact') {\n const now = Date.now();\n const gapFromLastTextEnd =\n this.lastTextEndTimestamp > 0 ? now - this.lastTextEndTimestamp : Number.MAX_SAFE_INTEGER;\n\n if (this.isTextStreaming || gapFromLastTextEnd < STREAM_TEXT_GAP_THRESHOLD_MS) {\n this.writer.write({\n type: `${type}`,\n data,\n });\n return;\n }\n }\n\n this.writer.write({\n type: `${type}`,\n data,\n });\n }\n\n async writeError(error: string | ErrorEvent): Promise<void> {\n if (this.isCompleted) {\n console.warn('Attempted to write error to completed stream');\n return;\n }\n\n if (typeof error === 'string') {\n this.writer.write({\n type: 'error',\n message: error,\n severity: 'error',\n timestamp: Date.now(),\n });\n } else {\n this.writer.write({\n ...error,\n type: 'error',\n });\n }\n }\n\n async streamData(data: any): Promise<void> {\n await this.writeContent(JSON.stringify(data));\n }\n\n async mergeStream(stream: any): Promise<void> {\n if (this.isCompleted) {\n console.warn('Attempted to merge stream to completed stream');\n return;\n }\n\n this.writer.merge(stream);\n }\n\n /**\n * Clean up all memory allocations\n * Should be called when the stream helper is no longer needed\n */\n public cleanup(): void {\n // Clear the connection drop timer\n if (this.connectionDropTimer) {\n clearTimeout(this.connectionDropTimer);\n this.connectionDropTimer = undefined;\n }\n\n this.jsonBuffer = '';\n this.sentItems.clear();\n this.completedItems.clear();\n this.textId = null;\n this.queuedEvents = [];\n this.isTextStreaming = false;\n }\n\n /**\n * JSON-aware buffer truncation that preserves complete JSON structures\n */\n private truncateJsonBufferSafely(buffer: string): string {\n const keepSize = Math.floor(VercelDataStreamHelper.MAX_BUFFER_SIZE * 0.6); // Be more conservative\n if (buffer.length <= keepSize) return buffer;\n\n // Start from the end and work backwards to find complete JSON structures\n let depth = 0;\n let inString = false;\n let escaping = false;\n let lastCompleteStructureEnd = -1;\n\n // Scan backwards from the target keep size\n for (let i = Math.min(keepSize + 1000, buffer.length - 1); i >= keepSize; i--) {\n const char = buffer[i];\n\n if (escaping) {\n escaping = false;\n continue;\n }\n\n if (char === '\\\\') {\n escaping = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === '}' || char === ']') {\n depth++;\n } else if (char === '{' || char === '[') {\n depth--;\n // If we've returned to depth 0, we have a complete structure\n if (depth === 0) {\n lastCompleteStructureEnd = i - 1;\n break;\n }\n }\n }\n\n // If we found a safe truncation point, use it\n if (lastCompleteStructureEnd > 0) {\n return buffer.slice(lastCompleteStructureEnd + 1);\n }\n\n // Fallback: look for newlines between structures\n for (let i = keepSize; i < Math.min(keepSize + 500, buffer.length); i++) {\n if (buffer[i] === '\\n' && buffer[i + 1] && buffer[i + 1].match(/[{[]]/)) {\n return buffer.slice(i + 1);\n }\n }\n\n // Return original buffer if no safe point found (caller will handle clearing)\n return buffer;\n }\n\n /**\n * Reindex sent items after buffer truncation\n */\n private reindexSentItems(): void {\n // After truncation, we need to clear sent items as indices are no longer valid\n this.sentItems.clear();\n this.completedItems.clear();\n }\n\n /**\n * Force cleanup on connection drop or timeout\n */\n private forceCleanup(reason: string): void {\n console.warn(`VercelDataStreamHelper: Forcing cleanup - ${reason}`);\n\n // Mark as completed to prevent further writes\n this.isCompleted = true;\n\n // Clean up all resources\n this.cleanup();\n\n // Try to write an error if the writer is still available\n try {\n if (this.writer && !this.isCompleted) {\n this.writer.write({\n type: 'error',\n message: `Stream terminated: ${reason}`,\n severity: 'error',\n timestamp: Date.now(),\n });\n }\n } catch (_e) {\n // Writer may be unavailable, ignore errors\n }\n }\n\n /**\n * Check if the stream has been completed and cleaned up\n */\n public isStreamCompleted(): boolean {\n return this.isCompleted;\n }\n\n /**\n * Get current memory usage stats (for debugging/monitoring)\n */\n public getMemoryStats() {\n return {\n bufferSize: this.jsonBuffer.length,\n sentItemsCount: this.sentItems.size,\n completedItemsCount: this.completedItems.size,\n isCompleted: this.isCompleted,\n };\n }\n\n async writeSummary(summary: SummaryEvent): Promise<void> {\n if (this.isCompleted) {\n console.warn('Attempted to write summary to completed stream');\n return;\n }\n\n // Check timing gap from last text-end\n const now = Date.now();\n const gapFromLastTextEnd =\n this.lastTextEndTimestamp > 0 ? now - this.lastTextEndTimestamp : Number.MAX_SAFE_INTEGER;\n\n // ALWAYS queue operation if:\n // 1. Text is currently streaming, OR\n // 2. We're within the gap threshold from last text-end (more text might be coming)\n if (this.isTextStreaming || gapFromLastTextEnd < STREAM_TEXT_GAP_THRESHOLD_MS) {\n this.queuedEvents.push({ type: 'data-summary', event: summary });\n return;\n }\n\n await this.flushQueuedOperations();\n\n await this.writer.write({\n id: 'id' in summary ? summary.id : undefined,\n type: 'data-summary',\n data: summary,\n });\n }\n\n async writeOperation(operation: OperationEvent): Promise<void> {\n if (this.isCompleted) {\n console.warn('Attempted to write operation to completed stream');\n return;\n }\n\n // Check timing gap from last text-end\n const now = Date.now();\n const gapFromLastTextEnd =\n this.lastTextEndTimestamp > 0 ? now - this.lastTextEndTimestamp : Number.MAX_SAFE_INTEGER;\n\n // ALWAYS queue operation if:\n // 1. Text is currently streaming, OR\n // 2. We're within the gap threshold from last text-end (more text might be coming)\n if (\n operation.type !== 'tool_call' &&\n operation.type !== 'tool_result' &&\n (this.isTextStreaming || gapFromLastTextEnd < STREAM_TEXT_GAP_THRESHOLD_MS)\n ) {\n this.queuedEvents.push({ type: 'data-operation', event: operation });\n return;\n }\n\n // If not streaming and gap is large enough, flush any queued operations first, then send this one\n await this.flushQueuedOperations();\n\n this.writer.write({\n id: 'id' in operation ? operation.id : undefined,\n type: 'data-operation',\n data: operation,\n });\n }\n\n /**\n * Flush all queued operations in order after text streaming completes\n */\n private async flushQueuedOperations(): Promise<void> {\n if (this.queuedEvents.length === 0) {\n return;\n }\n\n const eventsToFlush = [...this.queuedEvents];\n this.queuedEvents = []; // Clear the queue\n\n for (const event of eventsToFlush) {\n this.writer.write({\n id: 'id' in event.event ? event.event.id : undefined,\n type: event.type,\n data: event.event,\n });\n }\n }\n\n async writeCompletion(_finishReason = 'stop'): Promise<void> {\n // Completion is handled automatically by Vercel's writer\n }\n\n async writeDone(): Promise<void> {\n // Done is handled automatically by Vercel's writer\n }\n\n /**\n * Complete the stream and clean up all memory\n * This is the primary cleanup point to prevent memory leaks between requests\n */\n async complete(): Promise<void> {\n if (this.isCompleted) return;\n\n await this.flushQueuedOperations();\n\n // Mark as completed to prevent further writes\n this.isCompleted = true;\n\n // Clean up all buffers and references\n this.cleanup();\n }\n}\n\nexport function createVercelStreamHelper(writer: VercelUIWriter) {\n return new VercelDataStreamHelper(writer);\n}\n\n/**\n * Buffering Stream Helper that captures content instead of streaming\n * Used for MCP tool responses and non-streaming API responses that require a single complete message\n */\nexport class BufferingStreamHelper implements StreamHelper {\n private capturedText = '';\n private capturedData: any[] = [];\n private capturedOperations: OperationEvent[] = [];\n private capturedSummaries: SummaryEvent[] = [];\n private hasError = false;\n private errorMessage = '';\n private sessionId?: string;\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n async writeRole(_role?: string): Promise<void> {\n // No-op for MCP\n }\n\n async writeContent(content: string): Promise<void> {\n this.capturedText += content;\n }\n\n async streamText(text: string, _delayMs?: number): Promise<void> {\n // Capture text without streaming delay\n this.capturedText += text;\n }\n\n async streamData(data: any): Promise<void> {\n this.capturedData.push(data);\n }\n\n async streamSummary(summary: SummaryEvent): Promise<void> {\n this.capturedSummaries.push(summary);\n }\n\n async streamOperation(operation: OperationEvent): Promise<void> {\n this.capturedOperations.push(operation);\n }\n\n async writeData(_type: string, data: any): Promise<void> {\n this.capturedData.push(data);\n }\n\n async writeSummary(summary: SummaryEvent): Promise<void> {\n this.capturedSummaries.push(summary);\n }\n\n async writeOperation(operation: OperationEvent): Promise<void> {\n this.capturedOperations.push(operation);\n }\n\n async writeError(error: string | ErrorEvent): Promise<void> {\n this.hasError = true;\n this.errorMessage = typeof error === 'string' ? error : error.message;\n }\n\n async complete(): Promise<void> {\n // No-op for MCP\n }\n\n /**\n * Get the captured response for non-streaming output\n */\n getCapturedResponse(): {\n text: string;\n data: any[];\n operations: OperationEvent[];\n hasError: boolean;\n errorMessage: string;\n } {\n return {\n text: this.capturedText,\n data: this.capturedData,\n operations: this.capturedOperations,\n hasError: this.hasError,\n errorMessage: this.errorMessage,\n };\n }\n}\n\nexport function createBufferingStreamHelper(): BufferingStreamHelper {\n return new BufferingStreamHelper();\n}\n\n// Alias for backwards compatibility with MCP usage\nexport const createMCPStreamHelper = createBufferingStreamHelper;\nexport type MCPStreamHelper = BufferingStreamHelper;\n","import {\n AGENT_EXECUTION_TRANSFER_COUNT_DEFAULT,\n createMessage,\n createTask,\n type ExecutionContext,\n generateId,\n getActiveAgentForConversation,\n getAgentWithDefaultSubAgent,\n getFullAgent,\n getTask,\n type SendMessageResponse,\n setSpanWithError,\n updateTask,\n} from '@inkeep/agents-core';\nimport { tracer } from 'src/utils/tracer.js';\nimport { A2AClient } from '../a2a/client.js';\nimport { executeTransfer } from '../a2a/transfer.js';\nimport { extractTransferData, isTransferTask } from '../a2a/types.js';\nimport { AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS } from '../constants/execution-limits';\nimport dbClient from '../data/db/dbClient.js';\nimport { flushBatchProcessor } from '../instrumentation.js';\nimport { getLogger } from '../logger.js';\nimport { agentSessionManager } from '../services/AgentSession.js';\nimport { agentInitializingOp, completionOp, errorOp } from '../utils/agent-operations.js';\nimport { resolveModelConfig } from '../utils/model-resolver.js';\nimport type { StreamHelper } from '../utils/stream-helpers.js';\nimport { BufferingStreamHelper } from '../utils/stream-helpers.js';\nimport { registerStreamHelper, unregisterStreamHelper } from '../utils/stream-registry.js';\n\nconst logger = getLogger('ExecutionHandler');\n\ninterface ExecutionHandlerParams {\n executionContext: ExecutionContext;\n conversationId: string;\n userMessage: string;\n initialAgentId: string;\n requestId: string;\n sseHelper: StreamHelper;\n emitOperations?: boolean;\n}\n\ninterface ExecutionResult {\n success: boolean;\n error?: string;\n iterations: number;\n response?: string; // Optional response for MCP contexts\n}\n\nexport class ExecutionHandler {\n private readonly MAX_ERRORS = AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS;\n\n /**\n * performs exeuction loop\n *\n * Do up to limit of MAX_ITERATIONS\n *\n * 1. lookup active agent for thread\n * 2. Send A2A message to selected agent\n * 3. Parse A2A message response\n * 4. Handle transfer messages (if any)\n * 5. Handle completion messages (if any)\n * 6. If no valid response or transfer, return error\n * @param params\n * @returns\n */\n async execute(params: ExecutionHandlerParams): Promise<ExecutionResult> {\n const {\n executionContext,\n conversationId,\n userMessage,\n initialAgentId,\n requestId,\n sseHelper,\n emitOperations,\n } = params;\n\n const { tenantId, projectId, agentId, apiKey, baseUrl } = executionContext;\n\n registerStreamHelper(requestId, sseHelper);\n\n agentSessionManager.createSession(requestId, agentId, tenantId, projectId, conversationId);\n\n if (emitOperations) {\n agentSessionManager.enableEmitOperations(requestId);\n }\n\n logger.info(\n { sessionId: requestId, agentId, conversationId, emitOperations },\n 'Created AgentSession for message execution'\n );\n\n let agentConfig: any = null;\n try {\n agentConfig = await getFullAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n\n if (agentConfig?.statusUpdates && agentConfig.statusUpdates.enabled !== false) {\n try {\n // Get the default sub-agent to resolve models properly with inheritance\n const agentWithDefault = await getAgentWithDefaultSubAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n\n if (agentWithDefault?.defaultSubAgent) {\n const resolvedModels = await resolveModelConfig(\n agentId,\n agentWithDefault.defaultSubAgent\n );\n\n agentSessionManager.initializeStatusUpdates(\n requestId,\n agentConfig.statusUpdates,\n resolvedModels.summarizer,\n resolvedModels.base\n );\n } else {\n // Fallback to agent-level config if no default sub-agent\n agentSessionManager.initializeStatusUpdates(\n requestId,\n agentConfig.statusUpdates,\n agentConfig.models?.summarizer\n );\n }\n } catch (modelError) {\n logger.warn(\n {\n error: modelError instanceof Error ? modelError.message : 'Unknown error',\n agentId,\n },\n 'Failed to resolve models for status updates, using agent-level config'\n );\n // Fallback to agent-level config\n agentSessionManager.initializeStatusUpdates(\n requestId,\n agentConfig.statusUpdates,\n agentConfig.models?.summarizer\n );\n }\n }\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined,\n },\n '❌ Failed to initialize status updates, continuing without them'\n );\n }\n\n let currentAgentId = initialAgentId;\n let iterations = 0;\n let errorCount = 0;\n let task: any = null;\n let fromSubAgentId: string | undefined; // Track the agent that executed a transfer\n\n try {\n await sseHelper.writeOperation(agentInitializingOp(requestId, agentId));\n\n const taskId = `task_${conversationId}-${requestId}`;\n\n logger.info(\n { taskId, currentAgentId, conversationId, requestId },\n 'Attempting to create or reuse existing task'\n );\n\n try {\n task = await createTask(dbClient)({\n id: taskId,\n tenantId,\n projectId,\n agentId,\n subAgentId: currentAgentId,\n contextId: conversationId,\n status: 'pending',\n metadata: {\n conversation_id: conversationId,\n message_id: requestId,\n stream_request_id: requestId, // This also serves as the AgentSession ID\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n root_sub_agent_id: initialAgentId,\n sub_agent_id: currentAgentId,\n },\n });\n\n logger.info(\n {\n taskId,\n createdTaskMetadata: Array.isArray(task) ? task[0]?.metadata : task?.metadata,\n },\n 'Task created with metadata'\n );\n } catch (error: any) {\n // Handle duplicate task (PostgreSQL unique constraint violation)\n if (error?.cause?.code === '23505') {\n logger.info(\n { taskId, error: error.message },\n 'Task already exists, fetching existing task'\n );\n\n const existingTask = await getTask(dbClient)({ id: taskId });\n if (existingTask) {\n task = existingTask;\n logger.info(\n { taskId, existingTask },\n 'Successfully reused existing task from race condition'\n );\n } else {\n logger.error({ taskId, error }, 'Task constraint failed but task not found');\n throw error;\n }\n } else {\n logger.error({ taskId, error }, 'Failed to create task due to non-constraint error');\n throw error;\n }\n }\n\n logger.debug(\n {\n timestamp: new Date(),\n executionType: 'create_initial_task',\n conversationId,\n agentId,\n requestId,\n currentAgentId,\n taskId: Array.isArray(task) ? task[0]?.id : task?.id,\n userMessage: userMessage.substring(0, 100), // Truncate for security\n },\n 'ExecutionHandler: Initial task created'\n );\n if (Array.isArray(task)) task = task[0];\n\n let currentMessage = userMessage;\n\n const maxTransfers =\n agentConfig?.stopWhen?.transferCountIs ?? AGENT_EXECUTION_TRANSFER_COUNT_DEFAULT;\n\n while (iterations < maxTransfers) {\n iterations++;\n\n logger.info(\n { iterations, currentAgentId, agentId, conversationId, fromSubAgentId },\n `Execution loop iteration ${iterations} with agent ${currentAgentId}, transfer from: ${fromSubAgentId || 'none'}`\n );\n\n const activeAgent = await getActiveAgentForConversation(dbClient)({\n scopes: { tenantId, projectId },\n conversationId,\n });\n logger.info({ activeAgent }, 'activeAgent');\n if (activeAgent && activeAgent.activeSubAgentId !== currentAgentId) {\n currentAgentId = activeAgent.activeSubAgentId;\n logger.info({ currentAgentId }, `Updated current agent to: ${currentAgentId}`);\n }\n\n const agentBaseUrl = `${baseUrl}/agents`;\n const a2aClient = new A2AClient(agentBaseUrl, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'x-inkeep-tenant-id': tenantId,\n 'x-inkeep-project-id': projectId,\n 'x-inkeep-agent-id': agentId,\n 'x-inkeep-sub-agent-id': currentAgentId,\n },\n });\n\n let messageResponse: SendMessageResponse | null = null;\n\n const messageMetadata: any = {\n stream_request_id: requestId, // This also serves as the AgentSession ID\n };\n if (fromSubAgentId) {\n messageMetadata.fromSubAgentId = fromSubAgentId;\n }\n\n messageResponse = await a2aClient.sendMessage({\n message: {\n role: 'user',\n parts: [\n {\n kind: 'text',\n text: currentMessage,\n },\n ],\n messageId: `${requestId}-iter-${iterations}`,\n kind: 'message',\n contextId: conversationId,\n metadata: messageMetadata,\n },\n configuration: {\n acceptedOutputModes: ['text', 'text/plain'],\n blocking: false,\n },\n });\n\n if (!messageResponse?.result) {\n errorCount++;\n logger.error(\n { currentAgentId, iterations, errorCount },\n `No response from agent ${currentAgentId} on iteration ${iterations} (error ${errorCount}/${this.MAX_ERRORS})`\n );\n\n if (errorCount >= this.MAX_ERRORS) {\n const errorMessage = `Maximum error limit (${this.MAX_ERRORS}) reached`;\n logger.error({ maxErrors: this.MAX_ERRORS, errorCount }, errorMessage);\n\n await sseHelper.writeOperation(errorOp(errorMessage, currentAgentId || 'system'));\n\n if (task) {\n await updateTask(dbClient)({\n taskId: task.id,\n data: {\n status: 'failed',\n metadata: {\n ...task.metadata,\n failed_at: new Date().toISOString(),\n error: errorMessage,\n },\n },\n });\n }\n\n await agentSessionManager.endSession(requestId);\n unregisterStreamHelper(requestId);\n return { success: false, error: errorMessage, iterations };\n }\n\n continue;\n }\n\n if (isTransferTask(messageResponse.result)) {\n const transferData = extractTransferData(messageResponse.result);\n\n if (!transferData) {\n logger.error(\n { result: messageResponse.result },\n 'Transfer detected but no transfer data found'\n );\n continue;\n }\n\n const { targetSubAgentId, fromSubAgentId: transferFromAgent } = transferData;\n\n const firstArtifact = messageResponse.result.artifacts[0];\n const transferReason =\n firstArtifact?.parts[1]?.kind === 'text'\n ? firstArtifact.parts[1].text\n : 'Transfer initiated';\n\n logger.info({ targetSubAgentId, transferReason, transferFromAgent }, 'Transfer response');\n\n // Store the transfer response as an assistant message in conversation history\n await createMessage(dbClient)({\n id: generateId(),\n tenantId,\n projectId,\n conversationId,\n role: 'agent',\n content: {\n text: transferReason,\n parts: [\n {\n kind: 'text',\n text: transferReason,\n },\n ],\n },\n visibility: 'user-facing',\n messageType: 'chat',\n fromSubAgentId: currentAgentId,\n taskId: task.id,\n });\n\n // Keep the original user message and add a continuation prompt\n currentMessage =\n currentMessage +\n '\\n\\nPlease continue this conversation seamlessly. The previous response in conversation history was from another internal agent, but you must continue as if YOU made that response. All responses must appear as one unified agent - do not repeat what was already communicated.';\n\n const { success, targetSubAgentId: newAgentId } = await executeTransfer({\n projectId,\n tenantId,\n threadId: conversationId,\n targetSubAgentId,\n });\n\n if (success) {\n fromSubAgentId = currentAgentId;\n currentAgentId = newAgentId;\n\n logger.info(\n {\n transferFrom: fromSubAgentId,\n transferTo: currentAgentId,\n reason: transferReason,\n },\n 'Transfer executed, tracking fromSubAgentId for next iteration'\n );\n }\n\n continue;\n }\n\n let responseParts = [];\n\n if ((messageResponse.result as any).streamedContent?.parts) {\n responseParts = (messageResponse.result as any).streamedContent.parts;\n logger.info(\n { partsCount: responseParts.length },\n 'Using streamed content for conversation history'\n );\n } else {\n responseParts =\n (messageResponse.result as any).artifacts?.flatMap(\n (artifact: any) => artifact.parts || []\n ) || [];\n logger.info(\n { partsCount: responseParts.length },\n 'Using artifacts for conversation history (fallback)'\n );\n }\n\n if (responseParts && responseParts.length > 0) {\n const agentSessionData = agentSessionManager.getSession(requestId);\n if (agentSessionData) {\n const sessionSummary = agentSessionData.getSummary();\n logger.info(sessionSummary, 'AgentSession data after completion');\n }\n\n let textContent = '';\n for (const part of responseParts) {\n const isTextPart = (part.kind === 'text' || part.type === 'text') && part.text;\n\n if (isTextPart) {\n textContent += part.text;\n }\n }\n\n // Stream completion operation\n // Completion operation (data operations removed)\n return tracer.startActiveSpan('execution_handler.execute', {}, async (span) => {\n try {\n span.setAttributes({\n 'ai.response.content': textContent || 'No response content',\n 'ai.response.timestamp': new Date().toISOString(),\n 'subAgent.name': agentConfig?.subAgents[currentAgentId]?.name,\n 'subAgent.id': currentAgentId,\n });\n\n // Store the agent response in the database with both text and parts\n await createMessage(dbClient)({\n id: generateId(),\n tenantId,\n projectId,\n conversationId,\n role: 'agent',\n content: {\n text: textContent || undefined,\n parts: responseParts.map((part: any) => ({\n type: part.kind === 'text' ? 'text' : 'data',\n text: part.kind === 'text' ? part.text : undefined,\n data: part.kind === 'data' ? JSON.stringify(part.data) : undefined,\n })),\n },\n visibility: 'user-facing',\n messageType: 'chat',\n fromSubAgentId: currentAgentId,\n taskId: task.id,\n });\n\n // Mark task as completed\n const updateTaskStart = Date.now();\n await updateTask(dbClient)({\n taskId: task.id,\n data: {\n status: 'completed',\n metadata: {\n ...task.metadata,\n completed_at: new Date(),\n response: {\n text: textContent,\n parts: responseParts,\n hasText: !!textContent,\n hasData: responseParts.some((p: any) => p.kind === 'data'),\n },\n },\n },\n });\n const updateTaskEnd = Date.now();\n logger.info(\n { duration: updateTaskEnd - updateTaskStart },\n 'Completed updateTask operation'\n );\n\n // Send completion data operation before ending session\n await sseHelper.writeOperation(completionOp(currentAgentId, iterations));\n\n // Complete the stream to flush any queued operations\n await sseHelper.complete();\n\n // End the AgentSession and clean up resources\n logger.info({}, 'Ending AgentSession and cleaning up');\n await agentSessionManager.endSession(requestId);\n\n // Clean up streamHelper\n logger.info({}, 'Cleaning up streamHelper');\n unregisterStreamHelper(requestId);\n\n // Extract captured response if using BufferingStreamHelper\n let response: string | undefined;\n if (sseHelper instanceof BufferingStreamHelper) {\n const captured = sseHelper.getCapturedResponse();\n response = captured.text || 'No response content';\n }\n\n logger.info({}, 'ExecutionHandler returning success');\n\n return { success: true, iterations, response };\n } catch (error) {\n setSpanWithError(span, error instanceof Error ? error : new Error(String(error)));\n throw error;\n } finally {\n span.end();\n // Flush immediately after span ends to ensure it's sent to SignOz\n // Use setImmediate to allow span to be processed before flushing\n await new Promise((resolve) => setImmediate(resolve));\n await flushBatchProcessor();\n }\n });\n }\n\n // If we get here, we didn't get a valid response or transfer\n errorCount++;\n logger.warn(\n { iterations, errorCount },\n `No valid response or transfer on iteration ${iterations} (error ${errorCount}/${this.MAX_ERRORS})`\n );\n\n if (errorCount >= this.MAX_ERRORS) {\n const errorMessage = `Maximum error limit (${this.MAX_ERRORS}) reached`;\n logger.error({ maxErrors: this.MAX_ERRORS, errorCount }, errorMessage);\n\n await sseHelper.writeOperation(errorOp(errorMessage, currentAgentId || 'system'));\n\n if (task) {\n await updateTask(dbClient)({\n taskId: task.id,\n data: {\n status: 'failed',\n metadata: {\n ...task.metadata,\n failed_at: new Date(),\n error: errorMessage,\n },\n },\n });\n }\n\n await agentSessionManager.endSession(requestId);\n unregisterStreamHelper(requestId);\n return { success: false, error: errorMessage, iterations };\n }\n }\n\n // Max transfers reached\n const errorMessage = `Maximum transfer limit (${maxTransfers}) reached without completion`;\n logger.error({ maxTransfers, iterations }, errorMessage);\n\n // Send error operation for max iterations reached\n await sseHelper.writeOperation(errorOp(errorMessage, currentAgentId || 'system'));\n\n // Mark task as failed\n if (task) {\n await updateTask(dbClient)({\n taskId: task.id,\n data: {\n status: 'failed',\n metadata: {\n ...task.metadata,\n failed_at: new Date(),\n error: errorMessage,\n },\n },\n });\n }\n // Clean up AgentSession and streamHelper on error\n await agentSessionManager.endSession(requestId);\n unregisterStreamHelper(requestId);\n return { success: false, error: errorMessage, iterations };\n } catch (error) {\n logger.error({ error }, 'Error in execution handler');\n const errorMessage = error instanceof Error ? error.message : 'Unknown execution error';\n\n // Stream error operation\n // Send error operation for execution exception\n await sseHelper.writeOperation(\n errorOp(`Execution error: ${errorMessage}`, currentAgentId || 'system')\n );\n\n // Mark task as failed\n if (task) {\n await updateTask(dbClient)({\n taskId: task.id,\n data: {\n status: 'failed',\n metadata: {\n ...task.metadata,\n failed_at: new Date(),\n error: errorMessage,\n },\n },\n });\n }\n // Clean up AgentSession and streamHelper on exception\n await agentSessionManager.endSession(requestId);\n unregisterStreamHelper(requestId);\n return { success: false, error: errorMessage, iterations };\n }\n }\n}\n","import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';\nimport {\n type CredentialStoreRegistry,\n contextValidationMiddleware,\n createApiError,\n createMessage,\n createOrGetConversation,\n generateId,\n getActiveAgentForConversation,\n getAgentWithDefaultSubAgent,\n getConversationId,\n getFullAgent,\n getRequestExecutionContext,\n getSubAgentById,\n handleContextResolution,\n setActiveAgentForConversation,\n} from '@inkeep/agents-core';\nimport { context as otelContext, propagation, trace } from '@opentelemetry/api';\nimport { streamSSE } from 'hono/streaming';\nimport dbClient from '../data/db/dbClient';\nimport { ExecutionHandler } from '../handlers/executionHandler';\nimport { getLogger } from '../logger';\nimport type { ContentItem, Message } from '../types/chat';\nimport { errorOp } from '../utils/agent-operations';\nimport { createSSEStreamHelper } from '../utils/stream-helpers';\n\ntype AppVariables = {\n credentialStores: CredentialStoreRegistry;\n requestBody?: any;\n};\n\nconst app = new OpenAPIHono<{ Variables: AppVariables }>();\nconst logger = getLogger('completionsHandler');\n\nconst chatCompletionsRoute = createRoute({\n method: 'post',\n path: '/completions',\n tags: ['chat'],\n summary: 'Create chat completion',\n description:\n 'Creates a new chat completion with streaming SSE response using the configured agent',\n security: [{ bearerAuth: [] }],\n request: {\n body: {\n content: {\n 'application/json': {\n schema: z.object({\n model: z.string().describe('The model to use for the completion'),\n messages: z\n .array(\n z.object({\n role: z\n .enum(['system', 'user', 'assistant', 'function', 'tool'])\n .describe('The role of the message'),\n content: z\n .union([\n z.string(),\n z.array(\n z.strictObject({\n type: z.string(),\n text: z.string().optional(),\n })\n ),\n ])\n .describe('The message content'),\n name: z.string().optional().describe('The name of the message sender'),\n })\n )\n .describe('The conversation messages'),\n temperature: z.number().optional().describe('Controls randomness (0-1)'),\n top_p: z.number().optional().describe('Controls nucleus sampling'),\n n: z.number().optional().describe('Number of completions to generate'),\n stream: z.boolean().optional().describe('Whether to stream the response'),\n max_tokens: z.number().optional().describe('Maximum tokens to generate'),\n presence_penalty: z.number().optional().describe('Presence penalty (-2 to 2)'),\n frequency_penalty: z.number().optional().describe('Frequency penalty (-2 to 2)'),\n logit_bias: z.record(z.string(), z.number()).optional().describe('Token logit bias'),\n user: z.string().optional().describe('User identifier'),\n conversationId: z.string().optional().describe('Conversation ID for multi-turn chat'),\n tools: z.array(z.string()).optional().describe('Available tools'),\n runConfig: z.record(z.string(), z.unknown()).optional().describe('Run configuration'),\n headers: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n 'Headers data for template processing (validated against context config schema)'\n ),\n }),\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'Streaming chat completion response in Server-Sent Events format',\n headers: z.object({\n 'Content-Type': z.string().default('text/event-stream'),\n 'Cache-Control': z.string().default('no-cache'),\n Connection: z.string().default('keep-alive'),\n }),\n content: {\n 'text/event-stream': {\n schema: z.string().describe('Server-Sent Events stream with chat completion chunks'),\n },\n },\n },\n 400: {\n description: 'Invalid request context or parameters',\n content: {\n 'application/json': {\n schema: z.object({\n error: z.string(),\n details: z\n .array(\n z.object({\n field: z.string(),\n message: z.string(),\n value: z.unknown().optional(),\n })\n )\n .optional(),\n }),\n },\n },\n },\n 404: {\n description: 'Agent or agent not found',\n content: {\n 'application/json': {\n schema: z.object({\n error: z.string(),\n }),\n },\n },\n },\n 500: {\n description: 'Internal server error',\n content: {\n 'application/json': {\n schema: z.object({\n error: z.string(),\n message: z.string(),\n }),\n },\n },\n },\n },\n});\n\napp.use('/completions', contextValidationMiddleware(dbClient));\n\napp.openapi(chatCompletionsRoute, async (c) => {\n getLogger('chat').info(\n {\n path: c.req.path,\n method: c.req.method,\n params: c.req.param(),\n },\n 'Chat route accessed'\n );\n\n const otelHeaders = {\n traceparent: c.req.header('traceparent'),\n tracestate: c.req.header('tracestate'),\n baggage: c.req.header('baggage'),\n };\n\n logger.info(\n {\n otelHeaders,\n path: c.req.path,\n method: c.req.method,\n },\n 'OpenTelemetry headers: chat'\n );\n try {\n const executionContext = getRequestExecutionContext(c);\n const { tenantId, projectId, agentId } = executionContext;\n\n getLogger('chat').debug(\n {\n tenantId,\n agentId,\n },\n 'Extracted chat parameters from API key context'\n );\n\n const body = c.get('requestBody') || {};\n const conversationId = body.conversationId || getConversationId();\n\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.setAttributes({\n 'conversation.id': conversationId,\n 'tenant.id': tenantId,\n 'agent.id': agentId,\n 'project.id': projectId,\n });\n }\n\n let currentBag = propagation.getBaggage(otelContext.active());\n if (!currentBag) {\n currentBag = propagation.createBaggage();\n }\n currentBag = currentBag.setEntry('conversation.id', { value: conversationId });\n const ctxWithBaggage = propagation.setBaggage(otelContext.active(), currentBag);\n return await otelContext.with(ctxWithBaggage, async () => {\n const fullAgent = await getFullAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n\n let agent: any;\n let defaultSubAgentId: string;\n\n if (fullAgent) {\n agent = {\n id: fullAgent.id,\n name: fullAgent.name,\n tenantId,\n projectId,\n defaultSubAgentId: fullAgent.defaultSubAgentId,\n };\n const agentKeys = Object.keys((fullAgent.subAgents as Record<string, any>) || {});\n const firstAgentId = agentKeys.length > 0 ? agentKeys[0] : '';\n defaultSubAgentId = (fullAgent.defaultSubAgentId as string) || firstAgentId; // Use first agent if no defaultSubAgentId\n } else {\n agent = await getAgentWithDefaultSubAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n if (!agent) {\n throw createApiError({\n code: 'not_found',\n message: 'Agent not found',\n });\n }\n defaultSubAgentId = agent.defaultSubAgentId || '';\n }\n\n if (!defaultSubAgentId) {\n throw createApiError({\n code: 'not_found',\n message: 'No default agent found in agent',\n });\n }\n\n await createOrGetConversation(dbClient)({\n tenantId,\n projectId,\n id: conversationId,\n activeSubAgentId: defaultSubAgentId,\n });\n\n const activeAgent = await getActiveAgentForConversation(dbClient)({\n scopes: { tenantId, projectId },\n conversationId,\n });\n if (!activeAgent) {\n setActiveAgentForConversation(dbClient)({\n scopes: { tenantId, projectId },\n conversationId,\n subAgentId: defaultSubAgentId,\n });\n }\n const subAgentId = activeAgent?.activeSubAgentId || defaultSubAgentId;\n\n const agentInfo = await getSubAgentById(dbClient)({\n scopes: { tenantId, projectId, agentId },\n subAgentId: subAgentId,\n });\n\n if (!agentInfo) {\n throw createApiError({\n code: 'not_found',\n message: 'Agent not found',\n });\n }\n\n const validatedContext = (c as any).get('validatedContext') || body.headers || {};\n\n const credentialStores = c.get('credentialStores');\n\n await handleContextResolution({\n tenantId,\n projectId,\n agentId,\n conversationId,\n headers: validatedContext,\n dbClient,\n credentialStores,\n });\n\n logger.info(\n {\n tenantId,\n projectId,\n agentId,\n conversationId,\n defaultSubAgentId,\n activeSubAgentId: activeAgent?.activeSubAgentId || 'none',\n hasContextConfig: !!agent.contextConfigId,\n hasHeaders: !!body.headers,\n hasValidatedContext: !!validatedContext,\n validatedContextKeys: Object.keys(validatedContext),\n },\n 'parameters'\n );\n\n const requestId = `chatcmpl-${Date.now()}`;\n const timestamp = Math.floor(Date.now() / 1000);\n\n const lastUserMessage = body.messages\n .filter((msg: Message) => msg.role === 'user')\n .slice(-1)[0];\n const userMessage = lastUserMessage ? getMessageText(lastUserMessage.content) : '';\n\n const messageSpan = trace.getActiveSpan();\n if (messageSpan) {\n messageSpan.setAttributes({\n 'message.content': userMessage,\n 'message.timestamp': Date.now(),\n });\n }\n\n await createMessage(dbClient)({\n id: generateId(),\n tenantId,\n projectId,\n conversationId,\n role: 'user',\n content: {\n text: userMessage,\n },\n visibility: 'user-facing',\n messageType: 'chat',\n });\n if (messageSpan) {\n messageSpan.addEvent('user.message.stored', {\n 'message.id': conversationId,\n 'database.operation': 'insert',\n });\n }\n\n return streamSSE(c, async (stream) => {\n try {\n const sseHelper = createSSEStreamHelper(stream, requestId, timestamp);\n\n await sseHelper.writeRole();\n\n logger.info({ subAgentId }, 'Starting execution');\n\n const emitOperationsHeader = c.req.header('x-emit-operations');\n const emitOperations = emitOperationsHeader === 'true';\n\n const executionHandler = new ExecutionHandler();\n const result = await executionHandler.execute({\n executionContext,\n conversationId,\n userMessage,\n initialAgentId: subAgentId,\n requestId,\n sseHelper,\n emitOperations,\n });\n\n logger.info(\n { result },\n `Execution completed: ${result.success ? 'success' : 'failed'} after ${result.iterations} iterations`\n );\n\n if (!result.success) {\n await sseHelper.writeOperation(\n errorOp(\n 'Sorry, I was unable to process your request at this time. Please try again.',\n 'system'\n )\n );\n }\n\n await sseHelper.complete();\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : error,\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'Error during streaming execution'\n );\n\n try {\n const sseHelper = createSSEStreamHelper(stream, requestId, timestamp);\n await sseHelper.writeOperation(\n errorOp(\n 'Sorry, I was unable to process your request at this time. Please try again.',\n 'system'\n )\n );\n await sseHelper.complete();\n } catch (streamError) {\n logger.error({ streamError }, 'Failed to write error to stream');\n }\n }\n });\n });\n } catch (error) {\n logger.error(\n {\n error: error instanceof Error ? error.message : error,\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'Error in chat completions endpoint before streaming'\n );\n\n if (error && typeof error === 'object' && 'status' in error) {\n throw error;\n }\n\n throw createApiError({\n code: 'internal_server_error',\n message: error instanceof Error ? error.message : 'Failed to process chat completion',\n });\n }\n});\n\nconst getMessageText = (content: string | ContentItem[]): string => {\n if (typeof content === 'string') {\n return content;\n }\n\n // For content arrays, extract text from all text items\n return content\n .filter((item) => item.type === 'text' && item.text)\n .map((item) => item.text)\n .join(' ');\n};\n\nexport default app;\n","import { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';\nimport {\n type CredentialStoreRegistry,\n commonGetErrorResponses,\n contextValidationMiddleware,\n createApiError,\n createMessage,\n generateId,\n getActiveAgentForConversation,\n getAgentWithDefaultSubAgent,\n getConversation,\n getConversationId,\n getRequestExecutionContext,\n getSubAgentById,\n handleContextResolution,\n loggerFactory,\n setActiveAgentForConversation,\n} from '@inkeep/agents-core';\nimport { context as otelContext, propagation, trace } from '@opentelemetry/api';\nimport { createUIMessageStream, JsonToSseTransformStream } from 'ai';\nimport { stream } from 'hono/streaming';\nimport dbClient from '../data/db/dbClient';\nimport { ExecutionHandler } from '../handlers/executionHandler';\nimport { getLogger } from '../logger';\nimport { pendingToolApprovalManager } from '../services/PendingToolApprovalManager';\nimport { errorOp } from '../utils/agent-operations';\nimport { createBufferingStreamHelper, createVercelStreamHelper } from '../utils/stream-helpers';\n\ntype AppVariables = {\n credentialStores: CredentialStoreRegistry;\n requestBody?: any;\n};\n\nconst app = new OpenAPIHono<{ Variables: AppVariables }>();\nconst logger = getLogger('chatDataStream');\n\nconst chatDataStreamRoute = createRoute({\n method: 'post',\n path: '/chat',\n tags: ['chat'],\n summary: 'Chat (Vercel Streaming Protocol)',\n description: 'Chat completion endpoint streaming with Vercel data stream protocol.',\n security: [{ bearerAuth: [] }],\n request: {\n body: {\n content: {\n 'application/json': {\n schema: z.object({\n model: z.string().optional(),\n messages: z.array(\n z.object({\n role: z.enum(['system', 'user', 'assistant', 'function', 'tool']),\n content: z.any(),\n parts: z\n .array(\n z.object({\n type: z.union([\n z.enum(['text', 'image', 'audio', 'video', 'file']),\n z.string().regex(/^data-/, 'Type must start with \"data-\"'),\n ]),\n text: z.string().optional(),\n })\n )\n .optional(),\n })\n ),\n id: z.string().optional(),\n conversationId: z.string().optional(),\n stream: z.boolean().optional().describe('Whether to stream the response').default(true),\n max_tokens: z.number().optional().describe('Maximum tokens to generate'),\n headers: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Headers data for template processing'),\n runConfig: z.record(z.string(), z.unknown()).optional().describe('Run configuration'),\n }),\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'Streamed chat completion',\n headers: z.object({\n 'Content-Type': z.string().default('text/plain; charset=utf-8'),\n 'x-vercel-ai-data-stream': z.string().default('v1'),\n }),\n },\n ...commonGetErrorResponses,\n },\n});\n// Apply context validation middleware\napp.use('/chat', contextValidationMiddleware(dbClient));\n\napp.openapi(chatDataStreamRoute, async (c) => {\n try {\n // Get execution context from API key authentication\n const executionContext = getRequestExecutionContext(c);\n const { tenantId, projectId, agentId } = executionContext;\n\n loggerFactory\n .getLogger('chatDataStream')\n .debug({ tenantId, projectId, agentId }, 'Extracted chatDataStream parameters');\n\n // Get parsed body from middleware (shared across all handlers)\n const body = c.get('requestBody') || {};\n const conversationId = body.conversationId || getConversationId();\n // Add conversation ID to parent span\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.setAttributes({\n 'conversation.id': conversationId,\n 'tenant.id': tenantId,\n 'agent.id': agentId,\n 'project.id': projectId,\n });\n }\n\n // Update baggage with conversation.id for all child spans\n let currentBag = propagation.getBaggage(otelContext.active());\n if (!currentBag) {\n currentBag = propagation.createBaggage();\n }\n currentBag = currentBag.setEntry('conversation.id', { value: conversationId });\n // Create context with updated baggage and execute within it\n const ctxWithBaggage = propagation.setBaggage(otelContext.active(), currentBag);\n // Execute remaining handler within the baggage context so child spans inherit attributes\n return await otelContext.with(ctxWithBaggage, async () => {\n const agent = await getAgentWithDefaultSubAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n if (!agent) {\n throw createApiError({\n code: 'not_found',\n message: 'Agent not found',\n });\n }\n\n const defaultSubAgentId = agent.defaultSubAgentId;\n const agentName = agent.name;\n\n if (!defaultSubAgentId) {\n throw createApiError({\n code: 'bad_request',\n message: 'Agent does not have a default agent configured',\n });\n }\n\n const activeAgent = await getActiveAgentForConversation(dbClient)({\n scopes: { tenantId, projectId },\n conversationId,\n });\n if (!activeAgent) {\n setActiveAgentForConversation(dbClient)({\n scopes: { tenantId, projectId },\n conversationId,\n subAgentId: defaultSubAgentId,\n });\n }\n const subAgentId = activeAgent?.activeSubAgentId || defaultSubAgentId;\n\n const agentInfo = await getSubAgentById(dbClient)({\n scopes: { tenantId, projectId, agentId },\n subAgentId: subAgentId as string,\n });\n if (!agentInfo) {\n throw createApiError({\n code: 'not_found',\n message: 'Agent not found',\n });\n }\n\n // Get validated context from middleware (falls back to body.headers if no validation)\n const validatedContext = (c as any).get('validatedContext') || body.headers || {};\n\n const credentialStores = c.get('credentialStores');\n\n // Context resolution with intelligent conversation state detection\n await handleContextResolution({\n tenantId,\n projectId,\n agentId,\n conversationId,\n headers: validatedContext,\n dbClient,\n credentialStores,\n });\n\n // Store last user message\n const lastUserMessage = body.messages.filter((m: any) => m.role === 'user').slice(-1)[0];\n const userText =\n typeof lastUserMessage?.content === 'string'\n ? lastUserMessage.content\n : lastUserMessage?.parts?.map((p: any) => p.text).join('') || '';\n logger.info({ userText, lastUserMessage }, 'userText');\n const messageSpan = trace.getActiveSpan();\n if (messageSpan) {\n messageSpan.setAttributes({\n 'message.timestamp': new Date().toISOString(),\n 'message.content': userText,\n 'agent.name': agentName,\n });\n }\n await createMessage(dbClient)({\n id: generateId(),\n tenantId,\n projectId,\n conversationId,\n role: 'user',\n content: { text: userText },\n visibility: 'user-facing',\n messageType: 'chat',\n });\n if (messageSpan) {\n messageSpan.addEvent('user.message.stored', {\n 'message.id': conversationId,\n 'database.operation': 'insert',\n });\n }\n\n const shouldStream = body.stream !== false;\n\n if (!shouldStream) {\n // Non-streaming response - collect full response and return as JSON\n const emitOperationsHeader = c.req.header('x-emit-operations');\n const emitOperations = emitOperationsHeader === 'true';\n\n const bufferingHelper = createBufferingStreamHelper();\n\n const executionHandler = new ExecutionHandler();\n const result = await executionHandler.execute({\n executionContext,\n conversationId,\n userMessage: userText,\n initialAgentId: subAgentId,\n requestId: `chat-${Date.now()}`,\n sseHelper: bufferingHelper,\n emitOperations,\n });\n\n const captured = bufferingHelper.getCapturedResponse();\n\n return c.json({\n id: `chat-${Date.now()}`,\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: agentName,\n choices: [\n {\n index: 0,\n message: {\n role: 'assistant',\n content: captured.hasError ? captured.errorMessage : captured.text,\n },\n finish_reason: result.success && !captured.hasError ? 'stop' : 'error',\n },\n ],\n usage: {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n });\n }\n\n // Create UI Message Stream using AI SDK V5\n const dataStream = createUIMessageStream({\n execute: async ({ writer }) => {\n const streamHelper = createVercelStreamHelper(writer);\n try {\n // Check for emit operations header\n const emitOperationsHeader = c.req.header('x-emit-operations');\n const emitOperations = emitOperationsHeader === 'true';\n\n const executionHandler = new ExecutionHandler();\n\n const result = await executionHandler.execute({\n executionContext,\n conversationId,\n userMessage: userText,\n initialAgentId: subAgentId,\n requestId: `chatds-${Date.now()}`,\n sseHelper: streamHelper,\n emitOperations,\n });\n\n if (!result.success) {\n await streamHelper.writeOperation(errorOp('Unable to process request', 'system'));\n }\n } catch (err) {\n logger.error({ err }, 'Streaming error');\n await streamHelper.writeOperation(errorOp('Internal server error', 'system'));\n } finally {\n // Clean up stream helper resources if it has cleanup method\n if ('cleanup' in streamHelper && typeof streamHelper.cleanup === 'function') {\n streamHelper.cleanup();\n }\n }\n },\n });\n\n c.header('content-type', 'text/event-stream');\n c.header('cache-control', 'no-cache');\n c.header('connection', 'keep-alive');\n c.header('x-vercel-ai-data-stream', 'v2');\n c.header('x-accel-buffering', 'no'); // disable nginx buffering\n\n return stream(c, (stream) =>\n stream.pipe(\n dataStream\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream())\n )\n );\n });\n } catch (error) {\n logger.error(\n {\n error,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n errorType: error?.constructor?.name,\n },\n 'chatDataStream error - DETAILED'\n );\n throw createApiError({\n code: 'internal_server_error',\n message: 'Failed to process chat completion',\n });\n }\n});\n\n// Tool approval endpoint\nconst toolApprovalRoute = createRoute({\n method: 'post',\n path: '/tool-approvals',\n tags: ['chat'],\n summary: 'Approve or deny tool execution',\n description: 'Handle user approval/denial of tool execution requests during conversations',\n security: [{ bearerAuth: [] }],\n request: {\n body: {\n content: {\n 'application/json': {\n schema: z.object({\n conversationId: z.string().describe('The conversation ID'),\n toolCallId: z.string().describe('The tool call ID to respond to'),\n approved: z.boolean().describe('Whether the tool execution is approved'),\n reason: z.string().optional().describe('Optional reason for the decision'),\n }),\n },\n },\n },\n },\n responses: {\n 200: {\n description: 'Tool approval response processed successfully',\n content: {\n 'application/json': {\n schema: z.object({\n success: z.boolean(),\n message: z.string().optional(),\n }),\n },\n },\n },\n 400: {\n description: 'Bad request - invalid tool call ID or conversation ID',\n content: {\n 'application/json': {\n schema: z.object({\n error: z.string(),\n }),\n },\n },\n },\n 404: {\n description: 'Tool call not found or already processed',\n content: {\n 'application/json': {\n schema: z.object({\n error: z.string(),\n }),\n },\n },\n },\n 500: {\n description: 'Internal server error',\n content: {\n 'application/json': {\n schema: z.object({\n error: z.string(),\n message: z.string(),\n }),\n },\n },\n },\n },\n});\n\napp.openapi(toolApprovalRoute, async (c) => {\n const tracer = trace.getTracer('tool-approval-handler');\n\n return tracer.startActiveSpan('tool_approval_request', async (span) => {\n try {\n const executionContext = getRequestExecutionContext(c);\n const { tenantId, projectId } = executionContext;\n\n const requestBody = await c.req.json();\n const { conversationId, toolCallId, approved, reason } = requestBody;\n\n logger.info(\n {\n conversationId,\n toolCallId,\n approved,\n reason,\n tenantId,\n projectId,\n },\n 'Processing tool approval request'\n );\n\n // Validate that the conversation exists and belongs to this tenant/project\n const conversation = await getConversation(dbClient)({\n scopes: { tenantId, projectId },\n conversationId,\n });\n\n if (!conversation) {\n span.setStatus({ code: 1, message: 'Conversation not found' });\n return c.json({ error: 'Conversation not found' }, 404);\n }\n\n // Process the approval request using PendingToolApprovalManager\n let success = false;\n if (approved) {\n success = pendingToolApprovalManager.approveToolCall(toolCallId);\n } else {\n success = pendingToolApprovalManager.denyToolCall(toolCallId, reason);\n }\n\n if (!success) {\n span.setStatus({ code: 1, message: 'Tool call not found' });\n return c.json({ error: 'Tool call not found or already processed' }, 404);\n }\n\n logger.info({ conversationId, toolCallId, approved }, 'Tool approval processed successfully');\n\n span.setStatus({ code: 1, message: 'Success' });\n\n return c.json({\n success: true,\n message: approved ? 'Tool execution approved' : 'Tool execution denied',\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n logger.error(\n {\n error: errorMessage,\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'Failed to process tool approval'\n );\n\n span.setStatus({ code: 2, message: errorMessage });\n\n return c.json(\n {\n error: 'Internal server error',\n message: errorMessage,\n },\n 500\n );\n } finally {\n span.end();\n }\n }) as any;\n});\n\nexport default app;\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { McpServer } from '@alcyone-labs/modelcontextprotocol-sdk/server/mcp.js';\nimport { StreamableHTTPServerTransport } from '@alcyone-labs/modelcontextprotocol-sdk/server/streamableHttp.js';\nimport type { CallToolResult } from '@alcyone-labs/modelcontextprotocol-sdk/types.js';\nimport { createRoute, OpenAPIHono, z } from '@hono/zod-openapi';\nimport type { ExecutionContext } from '@inkeep/agents-core';\nimport {\n type CredentialStoreRegistry,\n contextValidationMiddleware,\n createMessage,\n createOrGetConversation,\n generateId,\n getAgentWithDefaultSubAgent,\n getConversation,\n getConversationId,\n getRequestExecutionContext,\n getSubAgentById,\n HeadersScopeSchema,\n handleContextResolution,\n updateConversation,\n} from '@inkeep/agents-core';\nimport { context as otelContext, propagation, trace } from '@opentelemetry/api';\nimport { toFetchResponse, toReqRes } from 'fetch-to-node';\nimport dbClient from '../data/db/dbClient';\nimport { ExecutionHandler } from '../handlers/executionHandler';\nimport { getLogger } from '../logger';\nimport { createMCPStreamHelper } from '../utils/stream-helpers';\n\nconst logger = getLogger('mcp');\n\n/**\n * Singleton mock response object for spoof initialization\n */\nclass MockResponseSingleton {\n private static instance: MockResponseSingleton;\n private mockRes: any;\n\n private constructor() {\n this.mockRes = {\n statusCode: 200,\n headers: {} as Record<string, string>,\n setHeader: function (name: string, value: string) {\n this.headers[name] = value;\n },\n getHeaders: function () {\n return this.headers;\n },\n end: () => {},\n write: () => {},\n writeHead: () => {},\n };\n }\n\n static getInstance(): MockResponseSingleton {\n if (!MockResponseSingleton.instance) {\n MockResponseSingleton.instance = new MockResponseSingleton();\n }\n return MockResponseSingleton.instance;\n }\n\n getMockResponse(): any {\n this.mockRes.headers = {};\n this.mockRes.statusCode = 200;\n return this.mockRes;\n }\n}\n\n/**\n * Creates a spoof initialization message with the given protocol version\n * Extracted as a pure function for better testability and reuse\n */\nconst createSpoofInitMessage = (mcpProtocolVersion?: string) => ({\n method: 'initialize',\n params: {\n protocolVersion: mcpProtocolVersion || '2025-06-18',\n capabilities: {\n tools: true,\n prompts: true,\n resources: false,\n logging: false,\n roots: { listChanged: false },\n },\n clientInfo: {\n name: 'inkeep-mcp-server',\n version: '1.0.0',\n },\n },\n jsonrpc: '2.0',\n id: 0,\n});\n\n/**\n * Spoofs an initialization message to set the transport's initialized flag\n * This is necessary when recreating transports for existing sessions because the transport expects to have received an initialization message from the client.\n */\nconst spoofTransportInitialization = async (\n transport: StreamableHTTPServerTransport,\n req: any,\n sessionId: string,\n mcpProtocolVersion?: string\n): Promise<void> => {\n logger.info({ sessionId }, 'Spoofing initialization message to set transport state');\n\n const spoofInitMessage = createSpoofInitMessage(mcpProtocolVersion);\n const mockRes = MockResponseSingleton.getInstance().getMockResponse();\n\n try {\n await transport.handleRequest(req, mockRes, spoofInitMessage);\n logger.info({ sessionId }, 'Successfully spoofed initialization');\n } catch (spoofError) {\n logger.warn({ sessionId, error: spoofError }, 'Spoof initialization failed, continuing anyway');\n }\n};\n\nconst validateSession = async (\n req: IncomingMessage,\n res: ServerResponse,\n body: any,\n tenantId: string,\n projectId: string,\n agentId: string\n): Promise<any | null> => {\n const sessionId = req.headers['mcp-session-id'];\n logger.info({ sessionId }, 'Received MCP session ID');\n\n if (!sessionId) {\n logger.info({ body }, 'Missing session ID');\n res.writeHead(400).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32602, message: 'Bad Request: Mcp-Session-Id header is required' },\n id: null,\n })\n );\n return false;\n }\n if (Array.isArray(sessionId)) {\n res.writeHead(400).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Bad Request: Mcp-Session-Id header must be a single value',\n },\n id: null,\n })\n );\n return false;\n }\n\n const conversation = await getConversation(dbClient)({\n scopes: { tenantId, projectId },\n conversationId: sessionId,\n });\n\n logger.info(\n {\n sessionId,\n conversationFound: !!conversation,\n sessionType: conversation?.metadata?.sessionData?.sessionType,\n storedAgentId: conversation?.metadata?.sessionData?.agentId,\n requestAgentId: agentId,\n },\n 'Conversation lookup result'\n );\n if (\n !conversation ||\n conversation.metadata?.sessionData?.sessionType !== 'mcp' ||\n conversation.metadata?.sessionData?.agentId !== agentId\n ) {\n logger.info(\n { sessionId, conversationId: conversation?.id },\n 'MCP session not found or invalid'\n );\n res.writeHead(404).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32001,\n message: 'Session not found',\n },\n id: null,\n })\n );\n return false;\n }\n return conversation;\n};\n\n/**\n * Sets up tracing attributes for the active span\n */\nconst setupTracing = (conversationId: string, tenantId: string, agentId: string): void => {\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.setAttributes({\n 'conversation.id': conversationId,\n 'tenant.id': tenantId,\n 'agent.id': agentId,\n });\n }\n};\n\n/**\n * Processes and stores the user message\n */\nconst processUserMessage = async (\n tenantId: string,\n projectId: string,\n conversationId: string,\n query: string\n): Promise<void> => {\n const messageSpan = trace.getActiveSpan();\n if (messageSpan) {\n messageSpan.setAttributes({\n 'message.content': query,\n 'message.timestamp': Date.now(),\n });\n }\n\n await createMessage(dbClient)({\n id: generateId(),\n tenantId,\n projectId,\n conversationId,\n role: 'user',\n content: {\n text: query,\n },\n visibility: 'user-facing',\n messageType: 'chat',\n });\n};\n\n/**\n * Executes the agent query and returns the result\n */\nconst executeAgentQuery = async (\n executionContext: ExecutionContext,\n conversationId: string,\n query: string,\n defaultSubAgentId: string\n): Promise<CallToolResult> => {\n const requestId = `mcp-${Date.now()}`;\n const mcpStreamHelper = createMCPStreamHelper();\n\n const executionHandler = new ExecutionHandler();\n const result = await executionHandler.execute({\n executionContext,\n conversationId,\n userMessage: query,\n initialAgentId: defaultSubAgentId,\n requestId,\n sseHelper: mcpStreamHelper,\n });\n\n logger.info(\n { result },\n `Execution completed: ${result.success ? 'success' : 'failed'} after ${result.iterations} iterations`\n );\n\n if (!result.success) {\n return {\n content: [\n {\n type: 'text',\n text:\n result.error ||\n `Sorry, I was unable to process your request at this time. Please try again.`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: result.response || 'No response generated',\n },\n ],\n };\n};\n\n/**\n * Creates and configures an MCP server for the given context\n */\nconst getServer = async (\n headers: Record<string, unknown>,\n executionContext: ExecutionContext,\n conversationId: string,\n credentialStores?: CredentialStoreRegistry\n) => {\n const { tenantId, projectId, agentId } = executionContext;\n setupTracing(conversationId, tenantId, agentId);\n\n const agent = await getAgentWithDefaultSubAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n\n if (!agent) {\n throw new Error('Agent not found');\n }\n\n const server = new McpServer(\n {\n name: 'inkeep-chat-api-server',\n version: '1.0.0',\n },\n { capabilities: { logging: {} } }\n );\n\n server.tool(\n 'send-query-to-agent',\n `Send a query to the ${agent.name} agent. The agent has the following description: ${agent.description}`,\n {\n query: z.string().describe('The query to send to the agent'),\n },\n async ({ query }): Promise<CallToolResult> => {\n try {\n if (!agent.defaultSubAgentId) {\n return {\n content: [\n {\n type: 'text',\n text: `Agent does not have a default agent configured`,\n },\n ],\n isError: true,\n };\n }\n const defaultSubAgentId = agent.defaultSubAgentId;\n\n const agentInfo = await getSubAgentById(dbClient)({\n scopes: { tenantId, projectId, agentId },\n subAgentId: defaultSubAgentId,\n });\n if (!agentInfo) {\n return {\n content: [\n {\n type: 'text',\n text: `Agent not found`,\n },\n ],\n isError: true,\n };\n }\n\n const resolvedContext = await handleContextResolution({\n tenantId,\n projectId,\n agentId,\n conversationId,\n headers,\n dbClient,\n credentialStores,\n });\n\n logger.info(\n {\n tenantId,\n projectId,\n agentId,\n conversationId,\n hasContextConfig: !!agent.contextConfigId,\n hasHeaders: !!headers,\n hasValidatedContext: !!resolvedContext,\n },\n 'parameters'\n );\n\n await processUserMessage(tenantId, projectId, conversationId, query);\n\n return executeAgentQuery(executionContext, conversationId, query, defaultSubAgentId);\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: `Error sending query: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n return server;\n};\n\ntype AppVariables = {\n credentialStores: CredentialStoreRegistry;\n requestBody?: any;\n};\n\nconst app = new OpenAPIHono<{ Variables: AppVariables }>();\n\napp.use('/', async (c, next) => {\n if (c.req.method === 'POST') {\n return contextValidationMiddleware(dbClient)(c, next);\n }\n return next();\n});\n\n/**\n * Validates request parameters and returns execution context if valid\n */\nconst validateRequestParameters = (\n c: any\n): { valid: true; executionContext: ExecutionContext } | { valid: false; response: Response } => {\n try {\n const executionContext = getRequestExecutionContext(c);\n const { tenantId, projectId, agentId } = executionContext;\n\n getLogger('mcp').debug({ tenantId, projectId, agentId }, 'Extracted MCP entity parameters');\n\n return { valid: true, executionContext };\n } catch (error) {\n getLogger('chat').warn(\n { error: error instanceof Error ? error.message : 'Unknown error' },\n 'Failed to get execution context'\n );\n return {\n valid: false,\n response: c.json(\n {\n jsonrpc: '2.0',\n error: { code: -32602, message: 'API key authentication required' },\n id: null,\n },\n { status: 401 }\n ),\n };\n }\n};\n\n/**\n * Creates a new MCP session and handles initialization\n */\nconst handleInitializationRequest = async (\n body: any,\n executionContext: ExecutionContext,\n validatedContext: Record<string, unknown>,\n req: any,\n res: any,\n c: any,\n credentialStores?: CredentialStoreRegistry\n) => {\n const { tenantId, projectId, agentId } = executionContext;\n logger.info({ body }, 'Received initialization request');\n const sessionId = getConversationId();\n\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n activeSpan.setAttributes({\n 'conversation.id': sessionId,\n 'tenant.id': tenantId,\n 'agent.id': agentId,\n 'project.id': projectId,\n });\n }\n\n let currentBag = propagation.getBaggage(otelContext.active());\n if (!currentBag) {\n currentBag = propagation.createBaggage();\n }\n currentBag = currentBag.setEntry('conversation.id', { value: sessionId });\n const ctxWithBaggage = propagation.setBaggage(otelContext.active(), currentBag);\n return await otelContext.with(ctxWithBaggage, async () => {\n const agent = await getAgentWithDefaultSubAgent(dbClient)({\n scopes: { tenantId, projectId, agentId },\n });\n if (!agent) {\n return c.json(\n {\n jsonrpc: '2.0',\n error: { code: -32001, message: 'Agent not found' },\n id: body.id || null,\n },\n { status: 404 }\n );\n }\n\n if (!agent.defaultSubAgentId) {\n return c.json(\n {\n jsonrpc: '2.0',\n error: { code: -32001, message: 'Agent does not have a default agent configured' },\n id: body.id || null,\n },\n { status: 400 }\n );\n }\n\n const conversation = await createOrGetConversation(dbClient)({\n id: sessionId,\n tenantId,\n projectId,\n activeSubAgentId: agent.defaultSubAgentId,\n metadata: {\n sessionData: {\n agentId,\n sessionType: 'mcp',\n mcpProtocolVersion: c.req.header('mcp-protocol-version'),\n initialized: false, // Track initialization state\n },\n },\n });\n\n logger.info(\n { sessionId, conversationId: conversation.id },\n 'Created MCP session as conversation'\n );\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => sessionId,\n });\n\n const server = await getServer(validatedContext, executionContext, sessionId, credentialStores);\n await server.connect(transport);\n logger.info({ sessionId }, 'Server connected for initialization');\n\n res.setHeader('Mcp-Session-Id', sessionId);\n\n logger.info(\n {\n sessionId,\n bodyMethod: body?.method,\n bodyId: body?.id,\n },\n 'About to handle initialization request'\n );\n\n await transport.handleRequest(req, res, body);\n logger.info({ sessionId }, 'Successfully handled initialization request');\n\n return toFetchResponse(res);\n });\n};\n\n/**\n * Handles requests for existing MCP sessions\n */\nconst handleExistingSessionRequest = async (\n body: any,\n executionContext: ExecutionContext,\n validatedContext: Record<string, unknown>,\n req: any,\n res: any,\n credentialStores?: CredentialStoreRegistry\n) => {\n const { tenantId, projectId, agentId } = executionContext;\n const conversation = await validateSession(req, res, body, tenantId, projectId, agentId);\n if (!conversation) {\n return toFetchResponse(res);\n }\n\n const sessionId = conversation.id;\n\n await updateConversation(dbClient)({\n scopes: { tenantId, projectId },\n conversationId: sessionId,\n data: {},\n });\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => sessionId,\n });\n\n const server = await getServer(validatedContext, executionContext, sessionId, credentialStores);\n await server.connect(transport);\n\n await spoofTransportInitialization(\n transport,\n req,\n sessionId,\n conversation.metadata?.session_data?.mcpProtocolVersion\n );\n\n logger.info({ sessionId }, 'Server connected and transport initialized');\n\n logger.info(\n {\n sessionId,\n bodyKeys: Object.keys(body || {}),\n bodyMethod: body?.method,\n bodyId: body?.id,\n requestHeaders: Object.fromEntries(\n Object.entries(req.headers || {}).filter(([k]) => k.startsWith('mcp-'))\n ),\n },\n 'About to handle MCP request with existing session'\n );\n\n try {\n await transport.handleRequest(req, res, body);\n logger.info({ sessionId }, 'Successfully handled MCP request');\n } catch (transportError) {\n logger.error(\n {\n sessionId,\n error: transportError,\n errorMessage: transportError instanceof Error ? transportError.message : 'Unknown error',\n },\n 'Transport handleRequest failed'\n );\n throw transportError; // Re-throw to be caught by outer catch\n }\n\n return toFetchResponse(res);\n};\n\n/**\n * Creates a JSON-RPC error response\n */\nconst createErrorResponse = (code: number, message: string, id: any = null) => ({\n jsonrpc: '2.0',\n error: { code, message },\n id,\n});\n\napp.openapi(\n createRoute({\n method: 'post',\n path: '/',\n tags: ['MCP'],\n summary: 'MCP Protocol',\n description: 'Handles Model Context Protocol (MCP) JSON-RPC requests',\n security: [{ bearerAuth: [] }],\n request: {\n headers: HeadersScopeSchema,\n },\n responses: {\n 200: {\n description: 'MCP response',\n },\n 401: {\n description: 'Unauthorized - API key authentication required',\n },\n 404: {\n description: 'Not Found - Agent not found',\n },\n 500: {\n description: 'Internal Server Error',\n },\n },\n }),\n async (c) => {\n try {\n const paramValidation = validateRequestParameters(c);\n if (!paramValidation.valid) {\n return paramValidation.response;\n }\n\n const { executionContext } = paramValidation;\n\n const body = c.get('requestBody') || {};\n logger.info({ body, bodyKeys: Object.keys(body || {}) }, 'Parsed request body');\n\n const isInitRequest = body.method === 'initialize';\n const { req, res } = toReqRes(c.req.raw);\n const validatedContext = (c as any).get('validatedContext') || {};\n const credentialStores = c.get('credentialStores');\n logger.info({ validatedContext }, 'Validated context');\n logger.info({ req }, 'request');\n if (isInitRequest) {\n return await handleInitializationRequest(\n body,\n executionContext,\n validatedContext,\n req,\n res,\n c,\n credentialStores\n );\n }\n return await handleExistingSessionRequest(\n body,\n executionContext,\n validatedContext,\n req,\n res,\n credentialStores\n );\n } catch (e) {\n logger.error(\n {\n error: e instanceof Error ? e.message : e,\n stack: e instanceof Error ? e.stack : undefined,\n },\n 'MCP request error'\n );\n return c.json(createErrorResponse(-32603, 'Internal server error'), { status: 500 });\n }\n }\n);\n\napp.get('/', async (c) => {\n logger.info({}, 'Received GET MCP request');\n return c.json(\n {\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Method not allowed.',\n },\n id: null,\n },\n { status: 405 }\n );\n});\n\napp.delete('/', async (c) => {\n logger.info({}, 'Received DELETE MCP request');\n\n return c.json(\n {\n jsonrpc: '2.0',\n error: { code: -32001, message: 'Method Not Allowed' },\n id: null,\n },\n { status: 405 }\n );\n});\n\nexport default app;\n","import { otel } from '@hono/otel';\nimport { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport {\n type CredentialStoreRegistry,\n type ExecutionContext,\n handleApiError,\n type ServerConfig,\n} from '@inkeep/agents-core';\nimport { context as otelContext, propagation } from '@opentelemetry/api';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { HTTPException } from 'hono/http-exception';\nimport { requestId } from 'hono/request-id';\nimport type { StatusCode } from 'hono/utils/http-status';\nimport { flushBatchProcessor } from './instrumentation';\nimport { getLogger } from './logger';\nimport { apiKeyAuth } from './middleware/api-key-auth';\nimport { setupOpenAPIRoutes } from './openapi';\nimport agentRoutes from './routes/agents';\nimport chatRoutes from './routes/chat';\nimport chatDataRoutes from './routes/chatDataStream';\nimport mcpRoutes from './routes/mcp';\nimport type { SandboxConfig } from './types/execution-context';\n\nconst logger = getLogger('agents-run-api');\n\ntype AppVariables = {\n executionContext: ExecutionContext;\n serverConfig: ServerConfig;\n credentialStores: CredentialStoreRegistry;\n sandboxConfig?: SandboxConfig;\n requestBody?: any;\n};\n\nfunction createExecutionHono(\n serverConfig: ServerConfig,\n credentialStores: CredentialStoreRegistry,\n sandboxConfig?: SandboxConfig\n) {\n const app = new OpenAPIHono<{ Variables: AppVariables }>();\n\n app.use('*', otel());\n\n // Request ID middleware\n app.use('*', requestId());\n\n // Server config, credential stores, and sandbox config middleware\n app.use('*', async (c, next) => {\n c.set('serverConfig', serverConfig);\n c.set('credentialStores', credentialStores);\n if (sandboxConfig) {\n c.set('sandboxConfig', sandboxConfig);\n }\n return next();\n });\n\n // Body parsing middleware - parse once and share across all handlers\n app.use('*', async (c, next) => {\n if (c.req.header('content-type')?.includes('application/json')) {\n try {\n const body = await c.req.json();\n c.set('requestBody', body);\n } catch (error) {\n logger.debug({ error }, 'Failed to parse JSON body, continuing without parsed body');\n }\n }\n return next();\n });\n\n // OpenTelemetry baggage middleware\n app.use('*', async (c, next) => {\n const reqId = c.get('requestId');\n let bag = propagation.getBaggage(otelContext.active());\n if (!bag) {\n bag = propagation.createBaggage();\n }\n // Safety check for test environment where createBaggage might return undefined\n if (bag && typeof bag.setEntry === 'function') {\n bag = bag.setEntry('request.id', { value: String(reqId ?? 'unknown') });\n const ctxWithBag = propagation.setBaggage(otelContext.active(), bag);\n return await otelContext.with(ctxWithBag, async () => await next());\n }\n return next();\n });\n\n // Error handling\n app.onError(async (err, c) => {\n const isExpectedError = err instanceof HTTPException;\n const status = isExpectedError ? err.status : 500;\n const requestId = c.get('requestId') || 'unknown';\n\n // Zod validation error detection\n let zodIssues: Array<any> | undefined;\n if (err && typeof err === 'object') {\n if (err.cause && Array.isArray((err.cause as any).issues)) {\n zodIssues = (err.cause as any).issues;\n } else if (Array.isArray((err as any).issues)) {\n zodIssues = (err as any).issues;\n }\n }\n\n if (status === 400 && Array.isArray(zodIssues)) {\n c.status(400);\n c.header('Content-Type', 'application/problem+json');\n c.header('X-Content-Type-Options', 'nosniff');\n return c.json({\n type: 'https://docs.inkeep.com/agents-api/errors#bad_request',\n title: 'Validation Failed',\n status: 400,\n detail: 'Request validation failed',\n errors: zodIssues.map((issue) => ({\n detail: issue.message,\n pointer: issue.path ? `/${issue.path.join('/')}` : undefined,\n name: issue.path ? issue.path.join('.') : undefined,\n reason: issue.message,\n })),\n });\n }\n\n if (status >= 500) {\n if (!isExpectedError) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n if (logger) {\n logger.error(\n {\n error: err,\n message: errorMessage,\n stack: errorStack,\n path: c.req.path,\n requestId,\n },\n 'Unexpected server error occurred'\n );\n }\n } else {\n if (logger) {\n logger.error(\n {\n error: err,\n path: c.req.path,\n requestId,\n status,\n },\n 'Server error occurred'\n );\n }\n }\n }\n\n if (isExpectedError) {\n try {\n const response = err.getResponse();\n return response;\n } catch (responseError) {\n if (logger) {\n logger.error({ error: responseError }, 'Error while handling HTTPException response');\n }\n }\n }\n\n const { status: respStatus, title, detail, instance } = await handleApiError(err, requestId);\n c.status(respStatus as StatusCode);\n c.header('Content-Type', 'application/problem+json');\n c.header('X-Content-Type-Options', 'nosniff');\n return c.json({\n type: 'https://docs.inkeep.com/agents-api/errors#internal_server_error',\n title,\n status: respStatus,\n detail,\n ...(instance && { instance }),\n });\n });\n\n // CORS middleware\n app.use(\n '*',\n cors({\n origin: '*', // public API\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['*'],\n exposeHeaders: ['Content-Length'],\n maxAge: 86400,\n })\n );\n\n // Apply API key authentication to all routes except health and docs\n app.use('/tenants/*', apiKeyAuth());\n app.use('/agents/*', apiKeyAuth());\n app.use('/v1/*', apiKeyAuth());\n app.use('/api/*', apiKeyAuth());\n\n // Baggage middleware for execution API - extracts context from API key authentication\n app.use('*', async (c, next) => {\n // Get the API key context if available (set by auth middleware)\n const executionContext = c.get('executionContext');\n\n if (!executionContext) {\n // No API key context, skip baggage setup\n logger.debug({}, 'Empty execution context');\n return next();\n }\n\n const { tenantId, projectId, agentId } = executionContext;\n\n // Extract conversation ID from parsed body if present\n let conversationId: string | undefined;\n const requestBody = c.get('requestBody') || {};\n if (requestBody) {\n conversationId = requestBody.conversationId;\n if (!conversationId) {\n logger.debug({ requestBody }, 'No conversation ID found in request body');\n }\n }\n\n const entries = Object.fromEntries(\n Object.entries({\n 'agent.id': agentId,\n 'tenant.id': tenantId,\n 'project.id': projectId,\n 'conversation.id': conversationId,\n }).filter((entry): entry is [string, string] => {\n const [, v] = entry;\n return typeof v === 'string' && v.length > 0;\n })\n );\n\n if (!Object.keys(entries).length) {\n logger.debug({}, 'Empty entries for baggage');\n return next();\n }\n\n const bag = Object.entries(entries).reduce(\n (b, [key, value]) => b.setEntry(key, { value: value || '' }),\n propagation.getBaggage(otelContext.active()) ?? propagation.createBaggage()\n );\n\n const ctxWithBag = propagation.setBaggage(otelContext.active(), bag);\n return await otelContext.with(ctxWithBag, async () => await next());\n });\n\n // Health check endpoint (no auth required)\n app.openapi(\n createRoute({\n method: 'get',\n path: '/health',\n tags: ['health'],\n summary: 'Health check',\n description: 'Check if the execution service is healthy',\n responses: {\n 204: {\n description: 'Service is healthy',\n },\n },\n }),\n (c) => {\n return c.body(null, 204);\n }\n );\n\n // Mount execution routes - API key provides tenant, project, and agent context\n app.route('/v1/chat', chatRoutes);\n app.route('/api', chatDataRoutes);\n app.route('/v1/mcp', mcpRoutes);\n app.route('/agents', agentRoutes);\n\n // Setup OpenAPI documentation endpoints (/openapi.json and /docs)\n setupOpenAPIRoutes(app);\n\n app.use('/tenants/*', async (_c, next) => {\n await next();\n await flushBatchProcessor();\n });\n app.use('/agents/*', async (_c, next) => {\n await next();\n await flushBatchProcessor();\n });\n app.use('/v1/*', async (_c, next) => {\n await next();\n await flushBatchProcessor();\n });\n app.use('/api/*', async (_c, next) => {\n await next();\n await flushBatchProcessor();\n });\n\n const baseApp = new Hono();\n baseApp.route('/', app);\n\n return baseApp;\n}\n\nexport { createExecutionHono };\n","import './env';\nimport { defaultSDK } from './instrumentation';\n\ndefaultSDK.start();\n\nimport {\n type CredentialStore,\n CredentialStoreRegistry,\n createDefaultCredentialStores,\n type ServerConfig,\n} from '@inkeep/agents-core';\nimport { createExecutionHono } from './app';\nimport type { SandboxConfig } from './types/execution-context';\n\n// Create default configuration\nconst defaultConfig: ServerConfig = {\n port: 3003,\n serverOptions: {\n requestTimeout: 120000, // 120 seconds for execution requests\n keepAliveTimeout: 60000,\n keepAlive: true,\n },\n};\n\n// Create default credential stores\nconst defaultStores = createDefaultCredentialStores();\nconst defaultRegistry = new CredentialStoreRegistry(defaultStores);\n\n// Create default app instance for simple usage\nconst app = createExecutionHono(defaultConfig, defaultRegistry);\n\n// Export the default app for Vite dev server and simple deployments\nexport default app;\n\n// Also export the factory function for advanced usage\nexport { createExecutionHono };\n\n// Export SandboxConfig type for use in applications\nexport type {\n NativeSandboxConfig,\n SandboxConfig,\n VercelSandboxConfig,\n} from './types/execution-context';\n\n// Export a helper to create app with custom credential stores and sandbox config - fallsback to default configs\nexport function createExecutionApp(config?: {\n serverConfig?: ServerConfig;\n credentialStores?: CredentialStore[];\n sandboxConfig?: SandboxConfig;\n}) {\n const serverConfig = config?.serverConfig ?? defaultConfig;\n const stores = config?.credentialStores ?? defaultStores;\n const registry = new CredentialStoreRegistry(stores);\n\n return createExecutionHono(serverConfig, registry, config?.sandboxConfig);\n}\n"],"mappings":"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"}
|