@inkeep/agents-sdk 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/index.cjs +3956 -4402
- package/dist/index.d.cts +1084 -1077
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +1084 -1077
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3913 -4365
- package/dist/index.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["logger","processedProps: Record<string, unknown> | null | undefined","errorText","logger","headers: Record<string, string>","response: Response","result: string | undefined","logger","logger","m: RegExpExecArray | null","host: ts.ModuleResolutionHost","warnings: string[]","dependencies: Record<string, string | false>","logger","logger","resolveGetter","agent","subAgent","subAgentsObject: Record<string, any>","externalAgentsObject: Record<string, any>","functionToolsObject: Record<string, any>","functionsObject: Record<string, any>","tools: string[]","selectedToolsMapping: Record<string, string[]>","headersMapping: Record<string, Record<string, string>>","toolPoliciesMapping: Record<string, Record<string, ToolPolicy>>","externalAgent","dataComponents: string[]","dataComponent","artifactComponents: string[]","artifactComponent","agentToolsObject: Record<string, any>","mcpTool","toolInitPromises: Promise<void>[]","errors: string[]","error: any","logger","processedProps: Record<string, unknown> | null | undefined","errorText","logger","agent","externalAgent","usage: Record<string, Array<{ type: string; id: string; agentId?: string }>>","errors: string[]","agentsObject: Record<string, any>","toolsObject: Record<string, ToolApiInsert>","functionToolsObject: Record<string, any>","functionsObject: Record<string, any>","dataComponentsObject: Record<string, any>","artifactComponentsObject: Record<string, any>","credentialReferencesObject: Record<string, any>","externalAgentsObject: Record<string, ExternalAgentApiInsert>","credentialUsageMap: Record<\n string,\n Array<{ type: string; id: string; agentId?: string }>\n >","credential","credId: string | undefined","subAgent","actualTool: AgentTool | FunctionTool","mcpTool","toolConfig: ToolApiInsert['config']","toolData: ToolApiInsert","dataComponent","dataComponentId: string","dataComponentName: string","dataComponentDescription: string","dataComponentProps: any","dataComponentRender: any","artifactComponent","artifactComponentId: string","artifactComponentName: string","artifactComponentDescription: string","artifactComponentProps: any","logger","processedDetailsSchema: StatusComponentType['detailsSchema']","logger","toolDataForUpdate: Omit<ToolApiInsert, 'id'> & { id?: string }","logger","toolRecord: Record<string, AgentTool>","id: string","toolInstance: AgentTool","errorText","dataComponent","artifactComponent","functionTool","tool: Tool","selectedTools: string[] | undefined","headers: Record<string, string> | undefined","toolPolicies: Record<string, ToolPolicy> | undefined","relationData: {\n id: string;\n tenantId: string;\n projectId: string;\n subAgentId: string;\n toolId: string;\n selectedTools?: string[];\n headers?: Record<string, string>;\n toolPolicies?: Record<string, ToolPolicy>;\n }","config: TransferConfig","DEFAULT_CONFIG: MemoryCredentialConfig","credential","credential","mcpServer","logger","errorText","builders: Record<string, ExternalAgent>","code?: string","details?: any","allToolCalls: ToolCall[]","agent","errors: string[]","subAgent","attributes: Record<string, unknown>","events: Array<{ name: string; attributes?: Record<string, unknown> }>","globalProvider: TelemetryProvider"],"sources":["../src/utils/generateIdFromName.ts","../src/artifact-component.ts","../src/projectFullClient.ts","../src/agentFullClient.ts","../src/utils/getFunctionToolDeps.ts","../src/function-tool.ts","../src/agent.ts","../src/data-component.ts","../src/project.ts","../src/status-component.ts","../src/tool.ts","../src/utils/tool-normalization.ts","../src/subAgent.ts","../src/builderFunctions.ts","../src/utils/validateFunction.ts","../src/builders.ts","../src/credential-provider.ts","../src/credential-ref.ts","../src/environment-settings.ts","../src/external-agent.ts","../src/types.ts","../src/runner.ts","../src/telemetry-provider.ts"],"sourcesContent":["/**\n * Generates a kebab-case ID from a name string\n * @param name - The name to convert\n * @returns A kebab-case ID\n */\n\nexport function generateIdFromName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n","import {\n type ArtifactComponentInsert as ArtifactComponentType,\n getLogger,\n} from '@inkeep/agents-core';\nimport {\n convertZodToJsonSchemaWithPreview,\n isZodSchema,\n} from '@inkeep/agents-core/utils/schema-conversion';\nimport type { z } from 'zod';\nimport { generateIdFromName } from './utils/generateIdFromName';\n\nconst logger = getLogger('artifactComponent');\n\n// Type for the config that can accept Zod schemas\ntype ArtifactComponentConfigWithZod = Omit<\n ArtifactComponentType,\n 'tenantId' | 'projectId' | 'props'\n> & {\n props?: Record<string, unknown> | z.ZodObject<any> | null;\n};\n\nexport interface ArtifactComponentInterface {\n config: Omit<ArtifactComponentType, 'tenantId' | 'projectId'>;\n init(): Promise<void>;\n getId(): ArtifactComponentType['id'];\n getName(): ArtifactComponentType['name'];\n getDescription(): ArtifactComponentType['description'];\n getProps(): ArtifactComponentType['props'];\n setContext(tenantId: string, projectId: string, baseURL?: string): void;\n}\n\nexport class ArtifactComponent implements ArtifactComponentInterface {\n public config: Omit<ArtifactComponentType, 'tenantId' | 'projectId'>;\n private baseURL: string;\n private tenantId: string;\n private projectId: string;\n private initialized = false;\n private id: ArtifactComponentType['id'];\n\n constructor(config: ArtifactComponentConfigWithZod) {\n this.id = config.id || generateIdFromName(config.name);\n\n // Convert Zod schema to JSON Schema if needed\n let processedProps: Record<string, unknown> | null | undefined;\n if (config.props && isZodSchema(config.props)) {\n processedProps = convertZodToJsonSchemaWithPreview(config.props) as Record<string, unknown>;\n } else {\n processedProps = config.props as Record<string, unknown> | null | undefined;\n }\n\n this.config = {\n ...config,\n id: this.id,\n props: processedProps,\n };\n this.baseURL = process.env.INKEEP_API_URL || 'http://localhost:3002';\n // tenantId and projectId will be set by setContext method\n this.tenantId = 'default';\n this.projectId = 'default';\n logger.info(\n {\n artifactComponentId: this.getId(),\n artifactComponentName: config.name,\n },\n 'ArtifactComponent constructor initialized'\n );\n }\n\n // Set context (tenantId, projectId, and baseURL) from external source (agent, agent, CLI, etc)\n setContext(tenantId: string, projectId: string, baseURL?: string): void {\n this.tenantId = tenantId;\n this.projectId = projectId;\n if (baseURL) {\n this.baseURL = baseURL;\n }\n }\n\n // Compute ID from name using same slug transformation as agents\n getId(): string {\n return this.id;\n }\n\n getName(): string {\n return this.config.name;\n }\n\n getDescription(): string {\n return this.config.description || '';\n }\n\n getProps(): ArtifactComponentType['props'] {\n return this.config.props;\n }\n\n // Public method to ensure artifact component exists in backend (with upsert behavior)\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Always attempt to upsert the artifact component\n await this.upsertArtifactComponent();\n\n logger.info(\n {\n artifactComponentId: this.getId(),\n },\n 'ArtifactComponent initialized successfully'\n );\n\n this.initialized = true;\n } catch (error) {\n logger.error(\n {\n artifactComponentId: this.getId(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to initialize artifact component'\n );\n throw error;\n }\n }\n\n // Private method to upsert artifact component (create or update)\n private async upsertArtifactComponent(): Promise<void> {\n const artifactComponentData = {\n id: this.getId(),\n name: this.config.name,\n description: this.config.description,\n props: this.config.props,\n };\n\n logger.info({ artifactComponentData }, 'artifactComponentData for create/update');\n\n // First try to update (in case artifact component exists)\n const updateResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/artifact-components/${this.getId()}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(artifactComponentData),\n }\n );\n\n logger.info(\n {\n status: updateResponse.status,\n artifactComponentId: this.getId(),\n },\n 'artifact component updateResponse'\n );\n\n if (updateResponse.ok) {\n logger.info(\n {\n artifactComponentId: this.getId(),\n },\n 'ArtifactComponent updated successfully'\n );\n return;\n }\n\n // If update failed with 404, artifact component doesn't exist - create it\n if (updateResponse.status === 404) {\n logger.info(\n {\n artifactComponentId: this.getId(),\n },\n 'ArtifactComponent not found, creating new artifact component'\n );\n\n const createResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/artifact-components`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(artifactComponentData),\n }\n );\n\n if (!createResponse.ok) {\n const errorText = await createResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to create artifact component: ${createResponse.status} ${createResponse.statusText} - ${errorText}`\n );\n }\n\n logger.info(\n {\n artifactComponentId: this.getId(),\n },\n 'ArtifactComponent created successfully'\n );\n return;\n }\n\n // If we get here, the update failed for some other reason\n const errorText = await updateResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to update artifact component: ${updateResponse.status} ${updateResponse.statusText} - ${errorText}`\n );\n }\n}\n","/**\n * Client-side functions for interacting with the Full Project API\n * These functions make HTTP requests to the server instead of direct database calls\n */\n\nimport { apiFetch, type FullProjectDefinition, getLogger } from '@inkeep/agents-core';\n\nconst logger = getLogger('projectFullClient');\n\n/**\n * Create a full project via HTTP API\n */\nexport async function createFullProjectViaAPI(\n tenantId: string,\n apiUrl: string,\n projectData: FullProjectDefinition,\n apiKey?: string\n): Promise<FullProjectDefinition> {\n logger.info(\n {\n tenantId,\n projectId: projectData.id,\n apiUrl,\n },\n 'Creating full project via API'\n );\n\n const url = `${apiUrl}/tenants/${tenantId}/project-full`;\n\n // Build headers with optional Authorization\n const headers: Record<string, string> = {};\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n let response: Response;\n try {\n response = await apiFetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(projectData),\n });\n } catch (fetchError) {\n logger.error(\n {\n error: fetchError instanceof Error ? fetchError.message : 'Unknown fetch error',\n url,\n tenantId,\n projectId: projectData.id,\n },\n 'Fetch request failed'\n );\n throw fetchError;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n const errorMessage =\n parseError(errorText) ??\n `Failed to create project: ${response.status} ${response.statusText}`;\n\n logger.error(\n {\n status: response.status,\n error: errorMessage,\n },\n 'Failed to create project via API'\n );\n\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as { data: FullProjectDefinition };\n\n logger.info(\n {\n projectId: projectData.id,\n },\n 'Successfully created project via API'\n );\n\n return result.data;\n}\n\n/**\n * Update a full project via HTTP API (upsert behavior)\n */\nexport async function updateFullProjectViaAPI(\n tenantId: string,\n apiUrl: string,\n projectId: string,\n projectData: FullProjectDefinition,\n apiKey?: string\n): Promise<FullProjectDefinition> {\n logger.info(\n {\n tenantId,\n projectId,\n apiUrl,\n },\n 'Updating full project via API'\n );\n\n const url = `${apiUrl}/tenants/${tenantId}/project-full/${projectId}`;\n\n // Build headers with optional Authorization\n const headers: Record<string, string> = {};\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n let response: Response;\n try {\n response = await apiFetch(url, {\n method: 'PUT',\n headers,\n body: JSON.stringify(projectData),\n });\n } catch (fetchError) {\n logger.error(\n {\n error: fetchError instanceof Error ? fetchError.message : 'Unknown fetch error',\n url,\n tenantId,\n projectId,\n },\n 'Fetch request failed'\n );\n throw fetchError;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n const errorMessage =\n parseError(errorText) ??\n `Failed to update project: ${response.status} ${response.statusText}`;\n\n logger.error(\n {\n status: response.status,\n error: errorMessage,\n },\n 'Failed to update project via API'\n );\n\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as { data: FullProjectDefinition };\n\n logger.info(\n {\n projectId,\n },\n 'Successfully updated project via API'\n );\n\n return result.data;\n}\n\n/**\n * Get a full project via HTTP API\n */\nexport async function getFullProjectViaAPI(\n tenantId: string,\n apiUrl: string,\n projectId: string,\n apiKey?: string\n): Promise<FullProjectDefinition | null> {\n logger.info(\n {\n tenantId,\n projectId,\n apiUrl,\n },\n 'Getting full project via API'\n );\n\n const url = `${apiUrl}/tenants/${tenantId}/project-full/${projectId}`;\n\n // Build headers with optional Authorization\n const headers: Record<string, string> = {};\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const response = await apiFetch(url, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n logger.info(\n {\n projectId,\n },\n 'Project not found'\n );\n return null;\n }\n\n const errorText = await response.text();\n const errorMessage =\n parseError(errorText) ?? `Failed to get project: ${response.status} ${response.statusText}`;\n\n logger.error(\n {\n status: response.status,\n error: errorMessage,\n },\n 'Failed to get project via API'\n );\n\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as { data: FullProjectDefinition };\n\n logger.info(\n {\n projectId,\n },\n 'Successfully retrieved project via API'\n );\n\n return result.data;\n}\n\n/**\n * Delete a full project via HTTP API\n */\nexport async function deleteFullProjectViaAPI(\n tenantId: string,\n apiUrl: string,\n projectId: string,\n apiKey?: string\n): Promise<void> {\n logger.info(\n {\n tenantId,\n projectId,\n apiUrl,\n },\n 'Deleting full project via API'\n );\n\n const url = `${apiUrl}/tenants/${tenantId}/project-full/${projectId}`;\n\n // Build headers with optional Authorization\n const headers: Record<string, string> = {};\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const response = await apiFetch(url, {\n method: 'DELETE',\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n const errorMessage =\n parseError(errorText) ??\n `Failed to delete project: ${response.status} ${response.statusText}`;\n\n logger.error(\n {\n status: response.status,\n error: errorMessage,\n },\n 'Failed to delete project via API'\n );\n\n throw new Error(errorMessage);\n }\n\n logger.info(\n {\n projectId,\n },\n 'Successfully deleted project via API'\n );\n}\n\nexport function parseError(errorText: string): string | undefined {\n let result: string | undefined;\n try {\n const errorJson = JSON.parse(errorText);\n if (errorJson.error) {\n const { error } = errorJson;\n result = error?.message ?? error;\n }\n } catch {\n // Use the text as-is if not JSON\n if (errorText) {\n result = errorText;\n }\n }\n return result;\n}\n","/**\n * Client-side functions for interacting with the Full Agent API\n * These functions make HTTP requests to the server instead of direct database calls\n */\n\nimport type { FullAgentDefinition } from '@inkeep/agents-core';\nimport { getLogger } from '@inkeep/agents-core';\nimport { parseError } from './projectFullClient';\n\nconst logger = getLogger('agentFullClient');\n\n/**\n * Create a full agent via HTTP API\n */\nexport async function createFullAgentViaAPI(\n tenantId: string,\n projectId: string,\n apiUrl: string,\n agentData: FullAgentDefinition\n): Promise<FullAgentDefinition> {\n logger.info(\n {\n tenantId,\n projectId,\n agentId: agentData.id,\n apiUrl,\n },\n 'Creating full agent via API'\n );\n\n const url = `${apiUrl}/tenants/${tenantId}/projects/${projectId}/agent`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(agentData),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n const errorMessage =\n parseError(errorText) ?? `Failed to create agent: ${response.status} ${response.statusText}`;\n\n logger.error(\n {\n status: response.status,\n error: errorMessage,\n },\n 'Failed to create agent via API'\n );\n\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as { data: FullAgentDefinition };\n\n logger.info(\n {\n agentId: agentData.id,\n },\n 'Successfully created agent via API'\n );\n\n return result.data;\n}\n\n/**\n * Update a full agent via HTTP API (upsert behavior)\n */\nexport async function updateFullAgentViaAPI(\n tenantId: string,\n projectId: string,\n apiUrl: string,\n agentId: string,\n agentData: FullAgentDefinition\n): Promise<FullAgentDefinition> {\n logger.info(\n {\n tenantId,\n projectId,\n agentId,\n apiUrl,\n },\n 'Updating full agent via API'\n );\n\n const url = `${apiUrl}/tenants/${tenantId}/projects/${projectId}/agent/${agentId}`;\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(agentData),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n const errorMessage =\n parseError(errorText) ?? `Failed to update agent: ${response.status} ${response.statusText}`;\n\n logger.error(\n {\n status: response.status,\n error: errorMessage,\n },\n 'Failed to update agent via API'\n );\n\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as { data: FullAgentDefinition };\n\n logger.info(\n {\n agentId,\n },\n 'Successfully updated agent via API'\n );\n\n return result.data;\n}\n\n/**\n * Get a full agent via HTTP API\n */\nexport async function getFullAgentViaAPI(\n tenantId: string,\n projectId: string,\n apiUrl: string,\n agentId: string\n): Promise<FullAgentDefinition | null> {\n logger.info(\n {\n tenantId,\n projectId,\n agentId,\n apiUrl,\n },\n 'Getting full agent via API'\n );\n\n const url = `${apiUrl}/tenants/${tenantId}/projects/${projectId}/agent/${agentId}`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n logger.info(\n {\n agentId,\n },\n 'Agent not found'\n );\n return null;\n }\n\n const errorText = await response.text();\n const errorMessage =\n parseError(errorText) ?? `Failed to get agent: ${response.status} ${response.statusText}`;\n\n logger.error(\n {\n status: response.status,\n error: errorMessage,\n },\n 'Failed to get agent via API'\n );\n\n throw new Error(errorMessage);\n }\n\n const result = (await response.json()) as { data: FullAgentDefinition };\n\n logger.info(\n {\n agentId,\n },\n 'Successfully retrieved agent via API'\n );\n\n return result.data;\n}\n\n/**\n * Delete a full agent via HTTP API\n */\nexport async function deleteFullAgentViaAPI(\n tenantId: string,\n projectId: string,\n apiUrl: string,\n agentId: string\n): Promise<void> {\n logger.info(\n {\n tenantId,\n projectId,\n agentId,\n apiUrl,\n },\n 'Deleting full agent via API'\n );\n\n const url = `${apiUrl}/tenants/${tenantId}/projects/${projectId}/agent/${agentId}`;\n const response = await fetch(url, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n const errorMessage =\n parseError(errorText) ?? `Failed to delete agent: ${response.status} ${response.statusText}`;\n\n logger.error(\n {\n status: response.status,\n error: errorMessage,\n },\n 'Failed to delete agent via API'\n );\n\n throw new Error(errorMessage);\n }\n\n logger.info(\n {\n agentId,\n },\n 'Successfully deleted agent via API'\n );\n}\n","import fs from 'node:fs';\nimport { builtinModules } from 'node:module';\nimport path from 'node:path';\nimport { getLogger } from '@inkeep/agents-core';\nimport * as lockfile from '@yarnpkg/lockfile';\nimport * as yaml from 'js-yaml';\nimport ts, { type ModuleResolutionCache } from 'typescript';\n\nconst logger = getLogger('function-tool');\n\nexport const getFunctionToolDeps = (name: string, code: string): Record<string, string | false> => {\n const { dependencies, warnings } = buildToolManifestFromCodeTS(code);\n if (warnings.length > 0) {\n logger.warn({ warnings }, `FunctionTool dependencies warnings for ${name}`);\n }\n return dependencies;\n};\n\ntype VersionResult = { exact: string } | { range: string; unresolved: true };\nexport type ToolManifest = { dependencies: Record<string, string | false>; warnings: string[] };\n\nconst NODE_BUILTINS = new Set(builtinModules.concat(builtinModules.map((m) => `node:${m}`)));\n\nconst isExternal = (spec: string) =>\n !spec.startsWith('.') && !spec.startsWith('/') && !NODE_BUILTINS.has(spec);\n\nconst collapseSubpath = (spec: string) => {\n if (spec.startsWith('@')) {\n const [scope, name] = spec.split('/');\n return `${scope}/${name ?? ''}`;\n }\n return spec.split('/')[0];\n};\n\nconst readJSON = (p: string) => JSON.parse(fs.readFileSync(p, 'utf8'));\nconst findUp = (start: string, file: string): string | null => {\n let dir = path.resolve(start);\n if (fs.existsSync(dir) && fs.statSync(dir).isFile()) dir = path.dirname(dir);\n for (;;) {\n const candidate = path.join(dir, file);\n if (fs.existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n};\n\nexport function collectDepsFromCodeTS(code: string): Set<string> {\n const info = ts.preProcessFile(code, /*readImportFiles*/ true, /*detectJavaScriptImports*/ true);\n\n const add = new Set<string>();\n const push = (spec: string) => {\n if (isExternal(spec)) add.add(collapseSubpath(spec));\n };\n\n for (const f of info.importedFiles) {\n // `import ... from 'x'`, `import('x')`, and `require('x')` (when detectable)\n const spec = f.fileName; // already unquoted\n if (spec) push(spec);\n }\n\n // Optional: catch CommonJS `require('x')` not surfaced by preProcessFile in rare cases.\n // Minimal tokenizer for string-literal requires/import(): (safe enough for tools)\n const requireLike = /(?:require|import)\\s*\\(\\s*(['\"])([^'\"]+)\\1\\s*\\)/g;\n let m: RegExpExecArray | null;\n while ((m = requireLike.exec(code))) push(m[2]);\n\n return add;\n}\n\nexport function resolveInstalledVersion(pkg: string, projectRoot: string): VersionResult | null {\n // pnpm\n const pnpmLock = findUp(projectRoot, 'pnpm-lock.yaml');\n if (pnpmLock) {\n const doc = yaml.load(fs.readFileSync(pnpmLock, 'utf8')) as any;\n const pkgs = doc?.packages ?? {};\n\n for (const key of Object.keys(pkgs)) {\n if (key.startsWith(`${pkg}@`)) {\n const ver = key.slice(key.indexOf('@') + 1);\n if (ver) return { exact: String(ver) };\n }\n }\n }\n // npm\n const npmLock = findUp(projectRoot, 'package-lock.json');\n if (npmLock) {\n const lock = readJSON(npmLock);\n if (lock.packages?.[`node_modules/${pkg}`]?.version) {\n return { exact: String(lock.packages[`node_modules/${pkg}`].version) };\n }\n if (lock.dependencies?.[pkg]?.version) {\n return { exact: String(lock.dependencies[pkg].version) };\n }\n }\n // yarn v1\n const yarnLock = findUp(projectRoot, 'yarn.lock');\n if (yarnLock) {\n const parsed = lockfile.parse(fs.readFileSync(yarnLock, 'utf8'));\n if (parsed.type === 'success') {\n for (const [key, val] of Object.entries(parsed.object)) {\n if (key === pkg || key.startsWith(`${pkg}@`)) {\n const ver = (val as any).version;\n if (ver) return { exact: String(ver) };\n }\n }\n }\n }\n // node_modules fallback (use TS resolver to find the d.ts/js, then walk up to the package root)\n const host: ts.ModuleResolutionHost = {\n fileExists: fs.existsSync,\n readFile: (p) => fs.readFileSync(p, 'utf8'),\n realpath: (p) => fs.realpathSync.native?.(p) ?? fs.realpathSync(p),\n directoryExists: (d) => {\n try {\n return fs.statSync(d).isDirectory();\n } catch {\n return false;\n }\n },\n getCurrentDirectory: () => projectRoot,\n getDirectories: (d) =>\n fs\n .readdirSync(d, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name),\n };\n const res = ts.resolveModuleName(\n `${pkg}/package.json`,\n path.join(projectRoot, '__fake.ts'),\n {},\n host,\n ts.ModuleKind.NodeNext as unknown as ModuleResolutionCache\n );\n const pkgJsonPath =\n res?.resolvedModule?.resolvedFileName ??\n // Try typical path as fallback\n findUp(path.join(projectRoot, 'node_modules', pkg), 'package.json');\n if (pkgJsonPath && fs.existsSync(pkgJsonPath)) {\n try {\n const version = readJSON(pkgJsonPath).version;\n if (version) return { exact: String(version) };\n } catch {}\n }\n\n // host package.json range\n const hostPkg = findUp(projectRoot, 'package.json');\n if (hostPkg) {\n const hostJson = readJSON(hostPkg);\n const range =\n hostJson.dependencies?.[pkg] ??\n hostJson.devDependencies?.[pkg] ??\n hostJson.optionalDependencies?.[pkg];\n if (range) return { range: String(range), unresolved: true as const };\n }\n return null;\n}\n\nexport function buildToolManifestFromCodeTS(\n code: string,\n projectRoot = process.cwd()\n): ToolManifest {\n const deps = collectDepsFromCodeTS(code);\n const warnings: string[] = [];\n const dependencies: Record<string, string | false> = {};\n for (const pkg of deps) {\n try {\n const v = resolveInstalledVersion(pkg, projectRoot);\n if (!v) {\n warnings.push(`Could not resolve version for \"${pkg}\"`);\n continue;\n }\n if ('unresolved' in v) {\n warnings.push(`Using range for \"${pkg}\" -> ${v.range} (no lockfile / not installed)`);\n dependencies[pkg] = v.range;\n } else {\n dependencies[pkg] = v.exact;\n }\n } catch {\n dependencies[pkg] = false;\n }\n }\n return { dependencies, warnings };\n}\n","import { getLogger } from '@inkeep/agents-core';\nimport type { FunctionToolConfig } from './types';\nimport { generateIdFromName } from './utils/generateIdFromName';\nimport { getFunctionToolDeps } from './utils/getFunctionToolDeps';\n\nconst logger = getLogger('function-tool');\n\nexport interface FunctionToolInterface {\n config: FunctionToolConfig;\n getId(): string;\n getName(): string;\n getDescription(): string;\n getInputSchema(): Record<string, unknown>;\n getDependencies(): Record<string, string>;\n getExecuteFunction(): (params: any) => Promise<any>;\n}\n\nexport class FunctionTool implements FunctionToolInterface {\n public config: FunctionToolConfig;\n private id: string;\n\n constructor(config: FunctionToolConfig) {\n this.config = config;\n this.id = generateIdFromName(config.name);\n\n if (!config.dependencies) {\n const executeCode =\n typeof config.execute === 'string' ? config.execute : config.execute.toString();\n ``;\n const deps = getFunctionToolDeps(config.name, executeCode);\n for (const dep in deps) {\n if (deps[dep] === false) {\n delete deps[dep];\n throw new Error(\n `Dependency \\x1b[1;32m${dep}\\x1b[0m used in function tool \\x1b[1;32m${config.name}\\x1b[0m is neither installed nor in dependencies object.`\n );\n }\n }\n this.config.dependencies = deps as Record<string, string>;\n }\n\n logger.info(\n {\n id: this.id,\n name: config.name,\n },\n 'FunctionTool constructor initialized'\n );\n }\n\n getId(): string {\n return this.id;\n }\n\n getName(): string {\n return this.config.name;\n }\n\n getDescription(): string {\n return this.config.description || '';\n }\n\n getInputSchema(): Record<string, unknown> {\n return this.config.inputSchema;\n }\n\n getDependencies(): Record<string, string> {\n return this.config.dependencies || {};\n }\n\n getExecuteFunction(): (params: any) => Promise<any> {\n // If execute is a string, we can't return it as a function\n // This method is primarily for runtime execution, not serialization\n if (typeof this.config.execute === 'string') {\n throw new Error(\n 'Cannot get execute function from string-based function tool. Use serializeFunction() instead.'\n );\n }\n return this.config.execute;\n }\n\n // Serialize the function (global entity) for storage\n serializeFunction(): {\n id: string;\n inputSchema: Record<string, unknown>;\n executeCode: string;\n dependencies: Record<string, string>;\n } {\n const executeCode =\n typeof this.config.execute === 'string'\n ? this.config.execute\n : this.config.execute.toString();\n\n return {\n id: this.id,\n inputSchema: this.config.inputSchema,\n executeCode,\n dependencies: this.config.dependencies || {},\n };\n }\n\n // Serialize the tool (project-scoped) for storage\n serializeTool(): {\n id: string;\n name: string;\n description: string;\n functionId: string;\n } {\n return {\n id: this.id,\n name: this.config.name,\n description: this.config.description,\n functionId: this.id, // The function ID is the same as the tool ID in this context\n };\n }\n}\n","import {\n type AgentStopWhen,\n type CredentialReferenceApiInsert,\n type FullAgentDefinition,\n getLogger,\n type StatusUpdateSettings,\n type ToolPolicy,\n} from '@inkeep/agents-core';\nimport { convertZodToJsonSchema, isZodSchema } from '@inkeep/agents-core/utils/schema-conversion';\nimport { updateFullAgentViaAPI } from './agentFullClient';\nimport { FunctionTool } from './function-tool';\nimport { getFullProjectViaAPI } from './projectFullClient';\nimport type {\n AgentConfig,\n AgentInterface,\n AllDelegateInputInterface,\n GenerateOptions,\n MessageInput,\n ModelSettings,\n RunResult,\n StreamResponse,\n SubAgentInterface,\n subAgentTeamAgentInterface,\n} from './types';\n\nconst logger = getLogger('agent');\n\n// Helper function to resolve getter functions\nfunction resolveGetter<T>(value: T | (() => T) | undefined): T | undefined {\n if (typeof value === 'function') {\n return (value as () => T)();\n }\n return value as T | undefined;\n}\n\nexport class Agent implements AgentInterface {\n private subAgents: SubAgentInterface[] = [];\n private agentMap: Map<string, SubAgentInterface> = new Map();\n private defaultSubAgent?: SubAgentInterface;\n private baseURL: string;\n private tenantId: string;\n private projectId: string;\n private agentId: string;\n private agentName: string;\n private agentDescription?: string;\n private initialized = false;\n private contextConfig?: any; // ContextConfigBuilder\n private credentials?: CredentialReferenceApiInsert[];\n private models?: {\n base?: ModelSettings;\n structuredOutput?: ModelSettings;\n summarizer?: ModelSettings;\n };\n private statusUpdateSettings?: StatusUpdateSettings;\n private prompt?: string;\n private stopWhen?: AgentStopWhen;\n\n constructor(config: AgentConfig) {\n this.defaultSubAgent = config.defaultSubAgent;\n // tenantId and projectId will be set by setConfig method from CLI or other sources\n this.tenantId = 'default';\n this.projectId = 'default'; // Default project ID, will be overridden by setConfig\n this.agentId = config.id;\n this.agentName = config.name || this.agentId;\n this.agentDescription = config.description;\n this.baseURL = process.env.INKEEP_API_URL || 'http://localhost:3002';\n this.contextConfig = config.contextConfig;\n this.credentials = resolveGetter(config.credentials);\n this.models = config.models;\n\n this.statusUpdateSettings = config.statusUpdates;\n this.prompt = config.prompt;\n // Set stopWhen - preserve original config or set default during inheritance\n this.stopWhen = config.stopWhen\n ? {\n transferCountIs: config.stopWhen.transferCountIs,\n }\n : undefined;\n this.subAgents = resolveGetter(config.subAgents) || [];\n this.agentMap = new Map(this.subAgents.map((agent) => [agent.getId(), agent]));\n\n // Add default agent to map if not already present\n if (this.defaultSubAgent) {\n const isAlreadyPresent = this.subAgents.some(\n (agent) => agent.getId() === this.defaultSubAgent?.getId()\n );\n if (!isAlreadyPresent) {\n this.subAgents.push(this.defaultSubAgent);\n }\n this.agentMap.set(this.defaultSubAgent.getId(), this.defaultSubAgent);\n }\n\n // Propagate agent-level models to agents immediately (if agent has models)\n if (this.models) {\n this.propagateImmediateModelSettings();\n }\n\n logger.info(\n {\n agentId: this.agentId,\n tenantId: this.tenantId,\n agentCount: this.subAgents.length,\n defaultSubAgent: this.defaultSubAgent?.getName(),\n },\n 'Agent created'\n );\n }\n\n /**\n * Set or update the configuration (tenantId, projectId and apiUrl)\n * This is used by the CLI to inject configuration from inkeep.config.ts\n */\n setConfig(tenantId: string, projectId: string, apiUrl: string): void {\n if (this.initialized) {\n throw new Error('Cannot set config after agent has been initialized');\n }\n\n this.tenantId = tenantId;\n this.projectId = projectId;\n this.baseURL = apiUrl;\n\n // Propagate tenantId, projectId, and apiUrl to all agents and their tools\n for (const subAgent of this.subAgents) {\n // Set the context on the agent\n if (subAgent.setContext) {\n subAgent.setContext(tenantId, projectId, apiUrl);\n }\n\n // Also update tools in this agent\n const tools = subAgent.getTools();\n for (const [_, toolInstance] of Object.entries(tools)) {\n if (toolInstance && typeof toolInstance === 'object') {\n // Set context on the tool if it has the method\n if ('setContext' in toolInstance && typeof toolInstance.setContext === 'function') {\n toolInstance.setContext(tenantId, projectId, apiUrl);\n }\n }\n }\n }\n\n // Update context config tenant ID, project ID, and agent ID if present\n if (this.contextConfig?.setContext) {\n this.contextConfig.setContext(tenantId, projectId, this.agentId, this.baseURL);\n }\n\n logger.info(\n {\n agentId: this.agentId,\n tenantId: this.tenantId,\n projectId: this.projectId,\n apiUrl: this.baseURL,\n },\n 'Agent configuration updated'\n );\n }\n\n /**\n * Convert the Agent to FullAgentDefinition format for the new agent endpoint\n */\n async toFullAgentDefinition(): Promise<FullAgentDefinition> {\n const subAgentsObject: Record<string, any> = {};\n const externalAgentsObject: Record<string, any> = {};\n const functionToolsObject: Record<string, any> = {};\n const functionsObject: Record<string, any> = {};\n\n for (const subAgent of this.subAgents) {\n // Get agent relationships\n const transfers = subAgent.getTransfers();\n const delegates = subAgent.getDelegates();\n\n // Convert tools to the expected format (agent.tools should be an array of tool IDs)\n const tools: string[] = [];\n const selectedToolsMapping: Record<string, string[]> = {};\n const headersMapping: Record<string, Record<string, string>> = {};\n const toolPoliciesMapping: Record<string, Record<string, ToolPolicy>> = {};\n const subAgentTools = subAgent.getTools();\n\n for (const [_toolName, toolInstance] of Object.entries(subAgentTools)) {\n const toolId = toolInstance.getId();\n\n if (toolInstance.selectedTools) {\n selectedToolsMapping[toolId] = toolInstance.selectedTools;\n }\n\n if (toolInstance.headers) {\n headersMapping[toolId] = toolInstance.headers;\n }\n\n if (toolInstance.toolPolicies) {\n toolPoliciesMapping[toolId] = toolInstance.toolPolicies;\n }\n\n tools.push(toolId);\n\n // Handle function tools - collect them for agent-level functionTools and functions\n if (\n toolInstance.constructor.name === 'FunctionTool' &&\n toolInstance instanceof FunctionTool\n ) {\n // Add to functions object (global entity)\n if (!functionsObject[toolId]) {\n const functionData = toolInstance.serializeFunction();\n functionsObject[toolId] = functionData;\n }\n\n // Add to functionTools object (agent-scoped)\n if (!functionToolsObject[toolId]) {\n const toolData = toolInstance.serializeTool();\n functionToolsObject[toolId] = {\n id: toolData.id,\n name: toolData.name,\n description: toolData.description,\n functionId: toolData.functionId,\n agentId: this.agentId, // Include agentId for agent-scoped function tools\n };\n }\n }\n }\n\n const subAgentExternalAgents = subAgent.getExternalAgentDelegates();\n for (const externalAgentDelegate of subAgentExternalAgents) {\n const externalAgent = externalAgentDelegate.externalAgent;\n externalAgentsObject[externalAgent.getId()] = {\n id: externalAgent.getId(),\n name: externalAgent.getName(),\n description: externalAgent.getDescription(),\n baseUrl: externalAgent.getBaseUrl(),\n credentialReferenceId: externalAgent.getCredentialReferenceId(),\n type: 'external',\n };\n }\n\n // Convert dataComponents to the expected format (agent.dataComponents should be an array of dataComponent IDs)\n const dataComponents: string[] = [];\n const subAgentDataComponents = subAgent.getDataComponents();\n if (subAgentDataComponents) {\n for (const dataComponent of subAgentDataComponents) {\n const dataComponentId =\n dataComponent.id || dataComponent.name.toLowerCase().replace(/\\s+/g, '-');\n dataComponents.push(dataComponentId);\n }\n }\n\n // Convert artifactComponents to the expected format (agent.artifactComponents should be an array of artifactComponent IDs)\n const artifactComponents: string[] = [];\n const subAgentArtifactComponents = subAgent.getArtifactComponents();\n if (subAgentArtifactComponents) {\n for (const artifactComponent of subAgentArtifactComponents) {\n const artifactComponentId =\n artifactComponent.id || artifactComponent.name.toLowerCase().replace(/\\s+/g, '-');\n artifactComponents.push(artifactComponentId);\n }\n }\n\n // Convert tools and selectedTools to canUse array\n // Always include canUse for internal agents (even if empty) as it's required by the API\n const canUse = tools.map((toolId) => ({\n toolId,\n toolSelection: selectedToolsMapping[toolId] || null,\n headers: headersMapping[toolId] || null,\n toolPolicies: toolPoliciesMapping[toolId] || null,\n }));\n\n subAgentsObject[subAgent.getId()] = {\n id: subAgent.getId(),\n name: subAgent.getName(),\n description: subAgent.config.description || '',\n prompt: subAgent.getInstructions(),\n models: subAgent.config.models,\n stopWhen: subAgent.config.stopWhen,\n canTransferTo: transfers.map((h) => h.getId()),\n canDelegateTo: delegates.map((d) => {\n if (typeof d === 'object' && 'externalAgent' in d) {\n return {\n externalAgentId: d.externalAgent.getId(),\n ...(d.headers && { headers: d.headers }),\n };\n }\n if (typeof d === 'object' && 'agent' in d) {\n return {\n agentId: d.agent.getId(),\n ...(d.headers && { headers: d.headers }),\n };\n }\n return d.getId();\n }),\n canUse,\n dataComponents: dataComponents.length > 0 ? dataComponents : undefined,\n artifactComponents: artifactComponents.length > 0 ? artifactComponents : undefined,\n type: 'internal',\n };\n }\n\n // Note: Tools are now managed at the PROJECT level, not agent level\n // This agent only stores agent definitions with tool ID references\n // The actual tool definitions are stored in the project's tools object\n\n // Note: DataComponents and ArtifactComponents are also managed at PROJECT level\n // Agent definitions only reference their IDs, actual definitions are in project\n\n const processedStatusUpdates = this.statusUpdateSettings\n ? {\n ...this.statusUpdateSettings,\n statusComponents: this.statusUpdateSettings.statusComponents?.map((comp: any) => {\n if (comp && typeof comp.getType === 'function') {\n return {\n type: comp.getType(),\n description: comp.getDescription(),\n detailsSchema: comp.getDetailsSchema(),\n };\n }\n if (\n comp &&\n typeof comp === 'object' &&\n comp.detailsSchema &&\n isZodSchema(comp.detailsSchema)\n ) {\n const jsonSchema = convertZodToJsonSchema(comp.detailsSchema);\n return {\n type: comp.type,\n description: comp.description,\n detailsSchema: {\n type: 'object',\n properties: (jsonSchema.properties as Record<string, any>) || {},\n required: (jsonSchema.required as string[]) || undefined,\n },\n };\n }\n return comp;\n }),\n }\n : undefined;\n\n // Collect tools used by this agent's subAgents for agent-level tools field\n const agentToolsObject: Record<string, any> = {};\n for (const subAgent of this.subAgents) {\n const subAgentTools = subAgent.getTools();\n for (const [_toolName, toolInstance] of Object.entries(subAgentTools)) {\n const toolId = toolInstance.getId();\n // Only include MCP tools, not function tools (function tools go to project level)\n if (toolInstance.constructor.name !== 'FunctionTool') {\n if (!agentToolsObject[toolId]) {\n // This should match the project-level tool format\n if ('config' in toolInstance && 'serverUrl' in toolInstance.config) {\n const mcpTool = toolInstance as any;\n agentToolsObject[toolId] = {\n id: toolId,\n name: toolInstance.getName(),\n description: null,\n config: {\n type: 'mcp',\n mcp: {\n server: {\n url: mcpTool.config.serverUrl,\n },\n transport: mcpTool.config.transport,\n activeTools: mcpTool.config.activeTools,\n },\n },\n credentialReferenceId: null,\n };\n }\n }\n }\n }\n }\n\n return {\n id: this.agentId,\n name: this.agentName,\n description: this.agentDescription,\n defaultSubAgentId: this.defaultSubAgent?.getId() || '',\n subAgents: subAgentsObject,\n externalAgents: externalAgentsObject,\n contextConfig: this.contextConfig?.toObject(),\n // Include function tools at agent level\n ...(Object.keys(functionToolsObject).length > 0 && { functionTools: functionToolsObject }),\n ...(Object.keys(functionsObject).length > 0 && { functions: functionsObject }),\n models: this.models,\n stopWhen: this.stopWhen,\n statusUpdates: processedStatusUpdates,\n prompt: this.prompt,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n }\n\n /**\n * Initialize all tools in all agents (especially IPCTools that need MCP server URLs)\n */\n private async initializeAllTools(): Promise<void> {\n logger.info({ agentId: this.agentId }, 'Initializing all tools in agent');\n\n const toolInitPromises: Promise<void>[] = [];\n\n for (const subAgent of this.subAgents) {\n const agentTools = subAgent.getTools();\n\n for (const [toolName, toolInstance] of Object.entries(agentTools)) {\n if (toolInstance && typeof toolInstance === 'object') {\n // Check if this is a tool that needs initialization\n if (typeof (toolInstance as any).init === 'function') {\n toolInitPromises.push(\n (async () => {\n try {\n // Skip database registration for all tools since agentFull will handle it\n const skipDbRegistration =\n toolInstance.constructor.name === 'IPCTool' ||\n toolInstance.constructor.name === 'HostedTool' ||\n toolInstance.constructor.name === 'Tool';\n if (typeof (toolInstance as any).init === 'function') {\n if (skipDbRegistration) {\n await (toolInstance as any).init({\n skipDatabaseRegistration: true,\n });\n } else {\n await (toolInstance as any).init();\n }\n }\n logger.debug(\n {\n subAgentId: subAgent.getId(),\n toolName,\n toolType: toolInstance.constructor.name,\n skipDbRegistration,\n },\n 'Tool initialized successfully'\n );\n } catch (error) {\n logger.error(\n {\n subAgentId: subAgent.getId(),\n toolName,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to initialize tool'\n );\n throw error;\n }\n })()\n );\n }\n }\n }\n }\n\n await Promise.all(toolInitPromises);\n logger.info(\n { agentId: this.agentId, toolCount: toolInitPromises.length },\n 'All tools initialized successfully'\n );\n }\n\n /**\n * Initialize the agent and all agents in the backend using the new agent endpoint\n */\n async init(): Promise<void> {\n if (this.initialized) {\n logger.info({ agentId: this.agentId }, 'Agent already initialized');\n return;\n }\n\n logger.info(\n {\n agentId: this.agentId,\n agentCount: this.subAgents.length,\n },\n 'Initializing agent using new agent endpoint'\n );\n\n try {\n // Initialize all tools first (especially IPCTools that need MCP server URLs)\n await this.initializeAllTools();\n\n // Apply model inheritance hierarchy (Project -> Agent -> Agent)\n await this.applyModelInheritance();\n\n // Convert to FullAgentDefinition format\n const agentDefinition = await this.toFullAgentDefinition();\n\n // Always use API mode (baseURL is always set)\n logger.info(\n {\n agentId: this.agentId,\n mode: 'api-client',\n apiUrl: this.baseURL,\n },\n 'Using API client to create/update agent'\n );\n\n // Try update first (upsert behavior)\n const createdAgent = await updateFullAgentViaAPI(\n this.tenantId,\n this.projectId,\n this.baseURL,\n this.agentId,\n agentDefinition\n );\n\n logger.info(\n {\n agentId: this.agentId,\n agentCount: Object.keys(createdAgent.subAgents || {}).length,\n },\n 'Agent initialized successfully using agent endpoint'\n );\n\n this.initialized = true;\n } catch (error) {\n logger.error(\n {\n agentId: this.agentId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to initialize agent using agent endpoint'\n );\n throw error;\n }\n }\n\n /**\n * Generate a response using the default agent\n */\n async generate(input: MessageInput, options?: GenerateOptions): Promise<string> {\n await this._init();\n\n if (!this.defaultSubAgent) {\n throw new Error('No default agent configured for this agent');\n }\n\n logger.info(\n {\n agentId: this.agentId,\n defaultSubAgent: this.defaultSubAgent.getName(),\n conversationId: options?.conversationId,\n },\n 'Generating response with default agent'\n );\n\n // Use the proper backend execution instead of the local runner\n const response = await this.executeWithBackend(input, options);\n return response;\n }\n\n /**\n * Stream a response using the default agent\n */\n async stream(input: MessageInput, options?: GenerateOptions): Promise<StreamResponse> {\n await this._init();\n\n if (!this.defaultSubAgent) {\n throw new Error('No default agent configured for this agent');\n }\n\n logger.info(\n {\n agentId: this.agentId,\n defaultSubAgent: this.defaultSubAgent.getName(),\n conversationId: options?.conversationId,\n },\n 'Streaming response with default agent'\n );\n\n // Delegate to the agent's stream method with backend\n // For now, create a simple async generator that yields the response\n const textStream = async function* (agent: Agent) {\n const response = await agent.executeWithBackend(input, options);\n // Simulate streaming by yielding chunks\n const words = response.split(' ');\n for (const word of words) {\n yield `${word} `;\n }\n };\n\n return {\n textStream: textStream(this),\n };\n }\n\n /**\n * Alias for stream() method for consistency with naming patterns\n */\n async generateStream(input: MessageInput, options?: GenerateOptions): Promise<StreamResponse> {\n return await this.stream(input, options);\n }\n\n /**\n * Run with a specific agent from the agent\n */\n async runWith(\n subAgentId: string,\n input: MessageInput,\n options?: GenerateOptions\n ): Promise<RunResult> {\n await this._init();\n\n const agent = this.getSubAgent(subAgentId);\n if (!agent) {\n throw new Error(`Agent '${subAgentId}' not found in agent`);\n }\n\n logger.info(\n {\n agentId: this.agentId,\n subAgentId,\n conversationId: options?.conversationId,\n },\n 'Running with specific agent'\n );\n\n // Use backend execution and wrap result in RunResult format\n const response = await this.executeWithBackend(input, options);\n\n return {\n finalOutput: response,\n agent: agent,\n turnCount: 1,\n usage: { inputTokens: 0, outputTokens: 0 },\n metadata: {\n toolCalls: [],\n transfers: [],\n },\n };\n }\n\n /**\n * Get an agent by name (unified method for all agent types)\n */\n getSubAgent(name: string): SubAgentInterface | undefined {\n return this.agentMap.get(name);\n }\n\n /**\n * Add an agent to the agent\n */\n addSubAgent(agent: SubAgentInterface): void {\n this.subAgents.push(agent);\n this.agentMap.set(agent.getId(), agent);\n\n // Apply immediate model inheritance if agent has models\n if (this.models) {\n this.propagateModelSettingsToAgent(agent);\n }\n\n logger.info(\n {\n agentId: this.agentId,\n subAgentId: agent.getId(),\n },\n 'SubAgent added to agent'\n );\n }\n\n /**\n * Remove an agent from the agent\n */\n removeSubAgent(id: string): boolean {\n const agentToRemove = this.agentMap.get(id);\n if (agentToRemove) {\n this.agentMap.delete(agentToRemove.getId());\n this.subAgents = this.subAgents.filter((agent) => agent.getId() !== agentToRemove.getId());\n\n logger.info(\n {\n agentId: this.agentId,\n subAgentId: agentToRemove.getId(),\n },\n 'Agent removed from agent'\n );\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Get all agents in the agent\n */\n getSubAgents(): SubAgentInterface[] {\n return this.subAgents;\n }\n\n /**\n * Get all agent ids (unified method for all agent types)\n */\n getSubAgentIds(): string[] {\n return Array.from(this.agentMap.keys());\n }\n\n /**\n * Set the default agent\n */\n setDefaultSubAgent(agent: SubAgentInterface): void {\n this.defaultSubAgent = agent;\n this.addSubAgent(agent); // Ensure it's in the agent\n\n logger.info(\n {\n agentId: this.agentId,\n defaultSubAgent: agent.getId(),\n },\n 'Default agent updated'\n );\n }\n\n /**\n * Get the default agent\n */\n getDefaultSubAgent(): SubAgentInterface | undefined {\n return this.defaultSubAgent;\n }\n\n /**\n * Get the agent ID\n */\n getId(): string {\n return this.agentId;\n }\n\n getName(): string {\n return this.agentName;\n }\n\n getDescription(): string | undefined {\n return this.agentDescription;\n }\n\n getTenantId(): string {\n return this.tenantId;\n }\n\n /**\n * Get the agent's model settingsuration\n */\n getModels(): typeof this.models {\n return this.models;\n }\n\n /**\n * Set the agent's model settingsuration\n */\n setModels(models: typeof this.models): void {\n this.models = models;\n }\n\n /**\n * Get the agent's prompt configuration\n */\n getPrompt(): string | undefined {\n return this.prompt;\n }\n\n /**\n * Get the agent's stopWhen configuration\n */\n getStopWhen(): AgentStopWhen {\n return this.stopWhen || { transferCountIs: 10 };\n }\n\n /**\n * Get the agent's status updates configuration\n */\n getStatusUpdateSettings(): StatusUpdateSettings | undefined {\n return this.statusUpdateSettings;\n }\n\n /**\n * Get the summarizer model from the agent's model settings\n */\n getSummarizerModel(): ModelSettings | undefined {\n return this.models?.summarizer;\n }\n\n /**\n * Get agent statistics\n */\n getStats(): {\n agentCount: number;\n defaultSubAgent: string | null;\n initialized: boolean;\n agentId: string;\n tenantId: string;\n } {\n return {\n agentCount: this.subAgents.length,\n defaultSubAgent: this.defaultSubAgent?.getName() || null,\n initialized: this.initialized,\n agentId: this.agentId,\n tenantId: this.tenantId,\n };\n }\n\n with(options: { headers?: Record<string, string> }): subAgentTeamAgentInterface {\n return {\n agent: this,\n headers: options.headers,\n };\n }\n\n /**\n * Validate the agent configuration\n */\n validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (this.subAgents.length === 0) {\n errors.push('Agent must contain at least one agent');\n }\n\n if (!this.defaultSubAgent) {\n errors.push('Agent must have a default agent');\n }\n\n // Validate agent names are unique\n const names = new Set<string>();\n for (const subAgent of this.subAgents) {\n const name = subAgent.getName();\n if (names.has(name)) {\n errors.push(`Duplicate agent name: ${name}`);\n }\n names.add(name);\n }\n\n // Validate agent relationships (transfer and delegation)\n for (const subAgent of this.subAgents) {\n // Validate transfer relationships\n const transfers = subAgent.getTransfers();\n for (const transferAgent of transfers) {\n if (!this.agentMap.has(transferAgent.getName())) {\n errors.push(\n `Agent '${subAgent.getName()}' has transfer to '${transferAgent.getName()}' which is not in the agent`\n );\n }\n }\n\n // Validate delegation relationships\n const delegates = subAgent.getDelegates();\n for (const delegateAgent of delegates) {\n if (this.isInternalAgent(delegateAgent)) {\n if (!this.agentMap.has(delegateAgent.getName())) {\n errors.push(\n `Agent '${subAgent.getName()}' has delegation to '${delegateAgent.getName()}' which is not in the agent`\n );\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n // Private helper methods\n private async _init(): Promise<void> {\n if (!this.initialized) {\n await this.init();\n }\n }\n\n /**\n * Type guard to check if an agent is an internal AgentInterface\n */\n isInternalAgent(agent: AllDelegateInputInterface): agent is SubAgentInterface {\n // Internal agents have getTransfers, getDelegates, and other AgentInterface methods\n // External agents only have basic identification methods\n return 'getTransfers' in agent && typeof (agent as any).getTransfers === 'function';\n }\n\n /**\n * Get project-level model settingsuration defaults\n */\n private async getProjectModelDefaults(): Promise<typeof this.models | undefined> {\n try {\n const project = await getFullProjectViaAPI(this.tenantId, this.projectId, this.baseURL);\n\n return (project as any)?.models;\n } catch (error) {\n logger.warn(\n {\n tenantId: this.tenantId,\n projectId: this.projectId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to get project model defaults'\n );\n return undefined;\n }\n }\n\n /**\n * Get project-level stopWhen configuration defaults\n */\n private async getProjectStopWhenDefaults(): Promise<\n { transferCountIs?: number; stepCountIs?: number } | undefined\n > {\n try {\n const project = await getFullProjectViaAPI(this.tenantId, this.projectId, this.baseURL);\n\n return (project as any)?.stopWhen;\n } catch (error) {\n logger.warn(\n {\n tenantId: this.tenantId,\n projectId: this.projectId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to get project stopWhen defaults'\n );\n return undefined;\n }\n }\n\n /**\n * Apply model inheritance hierarchy: Project -> Agent -> Agent\n */\n private async applyModelInheritance(): Promise<void> {\n // Always get project defaults to check for partial inheritance\n const projectModels = await this.getProjectModelDefaults();\n\n if (projectModels) {\n // Initialize models object if it doesn't exist\n if (!this.models) {\n this.models = {};\n }\n\n // Inherit individual model types from project if not set at agent level\n if (!this.models.base && projectModels.base) {\n this.models.base = projectModels.base;\n }\n if (!this.models.structuredOutput && projectModels.structuredOutput) {\n this.models.structuredOutput = projectModels.structuredOutput;\n }\n if (!this.models.summarizer && projectModels.summarizer) {\n this.models.summarizer = projectModels.summarizer;\n }\n }\n\n // Apply stopWhen inheritance: Project -> Agent -> Agent\n await this.applyStopWhenInheritance();\n\n // Propagate to agents\n for (const subAgent of this.subAgents) {\n this.propagateModelSettingsToAgent(subAgent as SubAgentInterface);\n }\n }\n\n /**\n * Apply stopWhen inheritance hierarchy: Project -> Agent -> Agent\n */\n private async applyStopWhenInheritance(): Promise<void> {\n // Get project stopWhen defaults\n const projectStopWhen = await this.getProjectStopWhenDefaults();\n\n // Initialize stopWhen if it doesn't exist (agent had no stopWhen config)\n if (!this.stopWhen) {\n this.stopWhen = {};\n }\n\n // Inherit transferCountIs from project if agent doesn't have it explicitly set\n if (\n this.stopWhen.transferCountIs === undefined &&\n projectStopWhen?.transferCountIs !== undefined\n ) {\n this.stopWhen.transferCountIs = projectStopWhen.transferCountIs;\n }\n\n // Set default transferCountIs if still not set\n if (this.stopWhen.transferCountIs === undefined) {\n this.stopWhen.transferCountIs = 10;\n }\n\n // Propagate stepCountIs from project to agents\n if (projectStopWhen?.stepCountIs !== undefined) {\n for (const subAgent of this.subAgents) {\n // Initialize agent stopWhen if it doesn't exist\n if (!subAgent.config.stopWhen) {\n subAgent.config.stopWhen = {};\n }\n\n // Inherit stepCountIs from project if not set at agent level\n if (subAgent.config.stopWhen.stepCountIs === undefined) {\n subAgent.config.stopWhen.stepCountIs = projectStopWhen.stepCountIs;\n }\n }\n }\n\n logger.debug(\n {\n agentId: this.agentId,\n agentStopWhen: this.stopWhen,\n projectStopWhen,\n },\n 'Applied stopWhen inheritance from project to agent'\n );\n }\n\n /**\n * Propagate agent-level model settings to agents (supporting partial inheritance)\n */\n private propagateModelSettingsToAgent(agent: SubAgentInterface): void {\n if (this.models) {\n // Initialize agent models if they don't exist\n if (!agent.config.models) {\n agent.config.models = {};\n }\n\n // Inherit individual model types from agent if not set at agent level\n if (!agent.config.models.base && this.models.base) {\n agent.config.models.base = this.models.base;\n }\n if (!agent.config.models.structuredOutput && this.models.structuredOutput) {\n agent.config.models.structuredOutput = this.models.structuredOutput;\n }\n if (!agent.config.models.summarizer && this.models.summarizer) {\n agent.config.models.summarizer = this.models.summarizer;\n }\n }\n }\n\n /**\n * Immediately propagate agent-level models to all agents during construction\n */\n private propagateImmediateModelSettings(): void {\n for (const subAgent of this.subAgents) {\n this.propagateModelSettingsToAgent(subAgent as SubAgentInterface);\n }\n }\n\n /**\n * Execute agent using the backend system instead of local runner\n */\n private async executeWithBackend(\n input: MessageInput,\n options?: GenerateOptions\n ): Promise<string> {\n const normalizedMessages = this.normalizeMessages(input);\n\n const url = `${this.baseURL}/tenants/${this.tenantId}/agent/${this.agentId}/v1/chat/completions`;\n\n logger.info({ url }, 'Executing with backend');\n const requestBody = {\n model: 'gpt-4o-mini',\n messages: normalizedMessages.map((msg) => ({\n role: msg.role,\n content: msg.content,\n })),\n ...options,\n // Include conversationId for multi-turn support\n ...(options?.conversationId && {\n conversationId: options.conversationId,\n }),\n // Include context data if available\n ...(options?.customBodyParams && { ...options.customBodyParams }),\n stream: false, // Explicitly disable streaming - must come after options to override\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const responseText = await response.text();\n\n // Check if response is SSE format (starts with \"data:\")\n if (responseText.startsWith('data:')) {\n // Parse SSE response\n return this.parseStreamingResponse(responseText);\n }\n\n // Parse regular JSON response\n const data = JSON.parse(responseText);\n return data.result || data.choices?.[0]?.message?.content || '';\n } catch (error: any) {\n throw new Error(`Agent execution failed: ${error.message || 'Unknown error'}`);\n }\n }\n\n /**\n * Parse streaming response in SSE format\n */\n private parseStreamingResponse(text: string): string {\n const lines = text.split('\\n');\n let content = '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const dataStr = line.slice(6); // Remove 'data: ' prefix\n if (dataStr === '[DONE]') break;\n\n try {\n const data = JSON.parse(dataStr);\n const delta = data.choices?.[0]?.delta?.content;\n if (delta) {\n content += delta;\n }\n } catch (_e) {\n // Skip invalid JSON lines\n }\n }\n }\n\n return content;\n }\n\n /**\n * Normalize input messages to the expected format\n */\n private normalizeMessages(input: MessageInput): Array<{ role: string; content: string }> {\n if (typeof input === 'string') {\n return [{ role: 'user', content: input }];\n }\n if (Array.isArray(input)) {\n return input.map((msg) => (typeof msg === 'string' ? { role: 'user', content: msg } : msg));\n }\n return [input];\n }\n}\n\n/**\n * Helper function to create agent - OpenAI style\n */\nexport function agent(config: AgentConfig): Agent {\n return new Agent(config);\n}\n\n/**\n * Factory function to create agent from configuration file\n */\nexport async function generateAgent(configPath: string): Promise<Agent> {\n logger.info({ configPath }, 'Loading agent configuration');\n\n try {\n const config = await import(configPath);\n const agentConfig = config.default || config;\n\n const agentObject = agent(agentConfig);\n await agentObject.init();\n\n logger.info(\n {\n configPath,\n agentId: agentObject.getStats().agentId,\n agentCount: agentObject.getStats().agentCount,\n },\n 'Agent generated successfully'\n );\n\n return agentObject;\n } catch (error) {\n logger.error(\n {\n configPath,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to generate agent from configuration'\n );\n throw error;\n }\n}\n","import { type DataComponentInsert as DataComponentType, getLogger } from '@inkeep/agents-core';\nimport { convertZodToJsonSchema, isZodSchema } from '@inkeep/agents-core/utils/schema-conversion';\nimport type { z } from 'zod';\nimport { generateIdFromName } from './utils/generateIdFromName';\n\nconst logger = getLogger('dataComponent');\n\n// Type for the config that can accept Zod schemas\ntype DataComponentConfigWithZod = Omit<\n DataComponentType,\n 'tenantId' | 'projectId' | 'props' | 'render'\n> & {\n props?: Record<string, unknown> | z.ZodObject<any> | null;\n render?: {\n component: string;\n mockData: Record<string, unknown>;\n } | null;\n};\n\nexport interface DataComponentInterface {\n config: Omit<DataComponentType, 'tenantId' | 'projectId'>;\n init(): Promise<void>;\n getId(): DataComponentType['id'];\n getName(): DataComponentType['name'];\n getDescription(): DataComponentType['description'];\n getProps(): DataComponentType['props'];\n setContext(tenantId: string, projectId: string, baseURL?: string): void;\n}\n\nexport class DataComponent implements DataComponentInterface {\n public config: Omit<DataComponentType, 'tenantId' | 'projectId'>;\n private baseURL: string;\n private tenantId: string;\n private projectId: string;\n private initialized = false;\n private id: DataComponentType['id'];\n\n constructor(config: DataComponentConfigWithZod) {\n this.id = config.id || generateIdFromName(config.name);\n\n // Convert Zod schema to JSON Schema if needed\n let processedProps: Record<string, unknown> | null | undefined;\n if (config.props && isZodSchema(config.props)) {\n processedProps = convertZodToJsonSchema(config.props) as Record<string, unknown>;\n } else {\n processedProps = config.props as Record<string, unknown> | null | undefined;\n }\n\n this.config = {\n ...config,\n id: this.id,\n props: processedProps,\n render: config.render || null,\n };\n this.baseURL = process.env.INKEEP_API_URL || 'http://localhost:3002';\n // tenantId and projectId will be set by setContext method\n this.tenantId = 'default';\n this.projectId = 'default';\n logger.info(\n {\n dataComponentId: this.getId(),\n dataComponentName: config.name,\n },\n 'DataComponent constructor initialized'\n );\n }\n\n // Set context (tenantId, projectId, and baseURL) from external source (sub-agent, agent, CLI, etc)\n setContext(tenantId: string, projectId: string, baseURL?: string): void {\n this.tenantId = tenantId;\n this.projectId = projectId;\n if (baseURL) {\n this.baseURL = baseURL;\n }\n }\n\n // Compute ID from name using same slug transformation as agents\n getId(): string {\n return this.id;\n }\n\n getName(): string {\n return this.config.name;\n }\n\n getDescription(): string {\n return this.config.description || '';\n }\n\n getProps(): DataComponentType['props'] {\n return this.config.props;\n }\n\n getRender(): DataComponentType['render'] {\n return this.config.render;\n }\n\n // Public method to ensure data component exists in backend (with upsert behavior)\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Always attempt to upsert the data component\n await this.upsertDataComponent();\n\n logger.info(\n {\n dataComponentId: this.getId(),\n },\n 'DataComponent initialized successfully'\n );\n\n this.initialized = true;\n } catch (error) {\n logger.error(\n {\n dataComponentId: this.getId(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to initialize data component'\n );\n throw error;\n }\n }\n\n // Private method to upsert data component (create or update)\n private async upsertDataComponent(): Promise<void> {\n const dataComponentData = {\n id: this.getId(),\n name: this.config.name,\n description: this.config.description,\n props: this.config.props,\n render: this.config.render,\n };\n\n logger.info({ dataComponentData }, 'dataComponentData for create/update');\n\n // First try to update (in case data component exists)\n const updateResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/data-components/${this.getId()}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(dataComponentData),\n }\n );\n\n logger.info(\n {\n status: updateResponse.status,\n dataComponentId: this.getId(),\n },\n 'data component updateResponse'\n );\n\n if (updateResponse.ok) {\n logger.info(\n {\n dataComponentId: this.getId(),\n },\n 'DataComponent updated successfully'\n );\n return;\n }\n\n // If update failed with 404, data component doesn't exist - create it\n if (updateResponse.status === 404) {\n logger.info(\n {\n dataComponentId: this.getId(),\n },\n 'DataComponent not found, creating new data component'\n );\n\n const createResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/data-components`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(dataComponentData),\n }\n );\n\n if (!createResponse.ok) {\n const errorText = await createResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to create data component: ${createResponse.status} ${createResponse.statusText} - ${errorText}`\n );\n }\n\n logger.info(\n {\n dataComponentId: this.getId(),\n },\n 'DataComponent created successfully'\n );\n return;\n }\n\n // If we get here, the update failed for some other reason\n const errorText = await updateResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to update data component: ${updateResponse.status} ${updateResponse.statusText} - ${errorText}`\n );\n }\n}\n","import type {\n CredentialReferenceApiInsert,\n ExternalAgentApiInsert,\n FullProjectDefinition,\n ProjectModels,\n StopWhen,\n ToolApiInsert,\n} from '@inkeep/agents-core';\nimport { getLogger } from '@inkeep/agents-core';\n\nconst logger = getLogger('project');\n\nimport type { Agent } from './agent';\nimport type { ArtifactComponent } from './artifact-component';\nimport type { DataComponent } from './data-component';\nimport type { ExternalAgent } from './external-agent';\nimport { FunctionTool } from './function-tool';\nimport { updateFullProjectViaAPI } from './projectFullClient';\nimport type { Tool } from './tool';\nimport type { AgentTool, ModelSettings } from './types';\n\n/**\n * Project configuration interface for the SDK\n */\nexport interface ProjectConfig {\n id: string;\n name: string;\n description?: string;\n models?: {\n base?: ModelSettings;\n structuredOutput?: ModelSettings;\n summarizer?: ModelSettings;\n };\n stopWhen?: StopWhen;\n agents?: () => Agent[];\n tools?: () => Tool[];\n externalAgents?: () => ExternalAgent[];\n dataComponents?: () => DataComponent[];\n artifactComponents?: () => ArtifactComponent[];\n credentialReferences?: () => CredentialReferenceApiInsert[];\n}\n\n/**\n * Project interface for operations\n */\nexport interface ProjectInterface {\n init(): Promise<void>;\n setConfig(tenantId: string, apiUrl: string): void;\n getId(): string;\n getName(): string;\n getDescription(): string | undefined;\n getTenantId(): string;\n getModels(): ProjectConfig['models'];\n getStopWhen(): ProjectConfig['stopWhen'];\n getAgents(): Agent[];\n addAgent(agent: Agent): void;\n removeAgent(id: string): boolean;\n getStats(): {\n projectId: string;\n tenantId: string;\n agentCount: number;\n initialized: boolean;\n };\n validate(): { valid: boolean; errors: string[] };\n}\n\n/**\n * Project class for managing agent projects\n *\n * Projects are the top-level organizational unit that contains Agents, Sub Agents, and shared configurations.\n * They provide model inheritance and execution limits that cascade down to Agents and Sub Agents.\n *\n * @example\n * ```typescript\n * const myProject = new Project({\n * id: 'customer-support-project',\n * name: 'Customer Support System',\n * description: 'Multi-agent customer support system',\n * models: {\n * base: { model: 'gpt-4.1-mini' },\n * structuredOutput: { model: 'gpt-4.1' }\n * },\n * stopWhen: {\n * transferCountIs: 10,\n * stepCountIs: 50\n * }\n * });\n *\n * await myProject.init();\n * ```\n */\nexport class Project implements ProjectInterface {\n public readonly __type = 'project' as const;\n private projectId: string;\n private projectName: string;\n private projectDescription?: string;\n private tenantId: string;\n private baseURL: string;\n private apiKey?: string;\n private initialized = false;\n private models?: {\n base?: ModelSettings;\n structuredOutput?: ModelSettings;\n summarizer?: ModelSettings;\n };\n private stopWhen?: StopWhen;\n private agents: Agent[] = [];\n private agentMap: Map<string, Agent> = new Map();\n private credentialReferences?: Array<CredentialReferenceApiInsert> = [];\n private projectTools: Tool[] = [];\n private projectDataComponents: DataComponent[] = [];\n private projectArtifactComponents: ArtifactComponent[] = [];\n private projectExternalAgents: ExternalAgent[] = [];\n private externalAgentMap: Map<string, ExternalAgent> = new Map();\n\n constructor(config: ProjectConfig) {\n this.projectId = config.id;\n this.projectName = config.name;\n this.projectDescription = config.description;\n // Check environment variable first, fallback to default\n this.tenantId = process.env.INKEEP_TENANT_ID || 'default';\n this.baseURL = process.env.INKEEP_API_URL || 'http://localhost:3002';\n this.models = config.models;\n this.stopWhen = config.stopWhen;\n\n // Initialize agent if provided\n if (config.agents) {\n this.agents = config.agents();\n this.agentMap = new Map(this.agents.map((agent) => [agent.getId(), agent]));\n\n // Set project context on agent\n for (const agent of this.agents) {\n agent.setConfig(this.tenantId, this.projectId, this.baseURL);\n }\n }\n\n // Initialize project-level tools if provided\n if (config.tools) {\n this.projectTools = config.tools();\n }\n\n // Initialize project-level dataComponents if provided\n if (config.dataComponents) {\n this.projectDataComponents = config.dataComponents();\n }\n\n // Initialize project-level artifactComponents if provided\n if (config.artifactComponents) {\n this.projectArtifactComponents = config.artifactComponents();\n }\n\n // Initialize project-level credentialReferences if provided\n if (config.credentialReferences) {\n this.credentialReferences = config.credentialReferences();\n }\n\n // Initialize project-level externalAgents if provided\n if (config.externalAgents) {\n this.projectExternalAgents = config.externalAgents();\n this.externalAgentMap = new Map(\n this.projectExternalAgents.map((externalAgent) => [externalAgent.getId(), externalAgent])\n );\n }\n\n logger.info(\n {\n projectId: this.projectId,\n tenantId: this.tenantId,\n agentCount: this.agents.length,\n },\n 'Project created'\n );\n }\n\n /**\n * Set or update the configuration (tenantId and apiUrl)\n * This is used by the CLI to inject configuration from inkeep.config.ts\n */\n setConfig(\n tenantId: string,\n apiUrl: string,\n models?: ProjectConfig['models'],\n apiKey?: string\n ): void {\n if (this.initialized) {\n throw new Error('Cannot set config after project has been initialized');\n }\n\n this.tenantId = tenantId;\n this.baseURL = apiUrl;\n this.apiKey = apiKey;\n\n // Update models if provided\n if (models) {\n this.models = models;\n }\n\n // Update all agent with new config\n for (const agent of this.agents) {\n agent.setConfig(tenantId, this.projectId, apiUrl);\n }\n\n logger.info(\n {\n projectId: this.projectId,\n tenantId: this.tenantId,\n apiUrl: this.baseURL,\n hasModels: !!this.models,\n hasApiKey: !!this.apiKey,\n },\n 'Project configuration updated'\n );\n }\n\n /**\n * Set credential references for the project\n * This is used by the CLI to inject environment-specific credentials\n */\n setCredentials(credentials: Record<string, CredentialReferenceApiInsert>): void {\n this.credentialReferences = Object.values(credentials);\n\n logger.info(\n {\n projectId: this.projectId,\n credentialCount: this.credentialReferences?.length || 0,\n },\n 'Project credentials updated'\n );\n }\n\n /**\n * Initialize the project and create/update it in the backend using full project approach\n */\n async init(): Promise<void> {\n if (this.initialized) {\n logger.info({ projectId: this.projectId }, 'Project already initialized');\n return;\n }\n\n logger.info(\n {\n projectId: this.projectId,\n tenantId: this.tenantId,\n agentCount: this.agents.length,\n },\n 'Initializing project using full project endpoint'\n );\n\n try {\n // Convert to FullProjectDefinition format\n const projectDefinition = await this.toFullProjectDefinition();\n\n // Use the full project API endpoint\n logger.info(\n {\n projectId: this.projectId,\n mode: 'api-client',\n apiUrl: this.baseURL,\n },\n 'Using API client to create/update full project'\n );\n\n // Try update first (upsert behavior)\n const createdProject = await updateFullProjectViaAPI(\n this.tenantId,\n this.baseURL,\n this.projectId,\n projectDefinition,\n this.apiKey\n );\n\n this.initialized = true;\n\n logger.info(\n {\n projectId: this.projectId,\n tenantId: this.tenantId,\n agentCount: Object.keys((createdProject as any).agent || {}).length,\n },\n 'Project initialized successfully using full project endpoint'\n );\n } catch (error) {\n logger.error(\n {\n projectId: this.projectId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to initialize project using full project endpoint'\n );\n throw error;\n }\n }\n\n /**\n * Get the project ID\n */\n getId(): string {\n return this.projectId;\n }\n\n /**\n * Get the project name\n */\n getName(): string {\n return this.projectName;\n }\n\n /**\n * Get the project description\n */\n getDescription(): string | undefined {\n return this.projectDescription;\n }\n\n /**\n * Get the tenant ID\n */\n getTenantId(): string {\n return this.tenantId;\n }\n\n /**\n * Get the project's model configuration\n */\n getModels(): ProjectConfig['models'] {\n return this.models;\n }\n\n /**\n * Set the project's model configuration\n */\n setModels(models: ProjectConfig['models']): void {\n this.models = models;\n }\n\n /**\n * Get the project's stopWhen configuration\n */\n getStopWhen(): ProjectConfig['stopWhen'] {\n return this.stopWhen;\n }\n\n /**\n * Set the project's stopWhen configuration\n */\n setStopWhen(stopWhen: ProjectConfig['stopWhen']): void {\n this.stopWhen = stopWhen;\n }\n\n /**\n * Get credential tracking information\n */\n async getCredentialTracking(): Promise<{\n credentials: Record<string, any>;\n usage: Record<string, Array<{ type: string; id: string; agentId?: string }>>;\n }> {\n const fullDef = await this.toFullProjectDefinition();\n const credentials = fullDef.credentialReferences || {};\n const usage: Record<string, Array<{ type: string; id: string; agentId?: string }>> = {};\n\n // Extract usage information from credentials\n for (const [credId, credData] of Object.entries(credentials)) {\n if ((credData as any).usedBy) {\n usage[credId] = (credData as any).usedBy;\n }\n }\n\n return { credentials, usage };\n }\n\n async getFullDefinition(): Promise<FullProjectDefinition> {\n return await this.toFullProjectDefinition();\n }\n\n /**\n * Get all agent in the project\n */\n getAgents(): Agent[] {\n return this.agents;\n }\n\n /**\n * Get all external agents in the project\n */\n getExternalAgents(): ExternalAgent[] {\n return this.projectExternalAgents;\n }\n\n /**\n * Get an external agent by ID\n */\n getExternalAgent(id: string): ExternalAgent | undefined {\n return this.externalAgentMap.get(id);\n }\n\n /**\n * Add an external agent to the project\n */\n addExternalAgent(externalAgent: ExternalAgent): void {\n this.projectExternalAgents.push(externalAgent);\n this.externalAgentMap.set(externalAgent.getId(), externalAgent);\n }\n\n /**\n * Remove an external agent from the project\n */\n removeExternalAgent(id: string): boolean {\n const externalAgentToRemove = this.externalAgentMap.get(id);\n if (externalAgentToRemove) {\n this.externalAgentMap.delete(id);\n this.projectExternalAgents = this.projectExternalAgents.filter(\n (externalAgent) => externalAgent.getId() !== id\n );\n logger.info(\n {\n projectId: this.projectId,\n externalAgentId: id,\n },\n 'External agent removed from project'\n );\n return true;\n }\n return false;\n }\n\n /**\n * Get an agent by ID\n */\n getAgent(id: string): Agent | undefined {\n return this.agentMap.get(id);\n }\n\n /**\n * Add an agent to the project\n */\n addAgent(agent: Agent): void {\n this.agents.push(agent);\n this.agentMap.set(agent.getId(), agent);\n\n // Set project context on the agent\n agent.setConfig(this.tenantId, this.projectId, this.baseURL);\n\n logger.info(\n {\n projectId: this.projectId,\n agentId: agent.getId(),\n },\n 'Agent added to project'\n );\n }\n\n /**\n * Remove an agent from the project\n */\n removeAgent(id: string): boolean {\n const agentToRemove = this.agentMap.get(id);\n if (agentToRemove) {\n this.agentMap.delete(id);\n this.agents = this.agents.filter((agent) => agent.getId() !== id);\n\n logger.info(\n {\n projectId: this.projectId,\n agentId: id,\n },\n 'Agent removed from project'\n );\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Get project statistics\n */\n getStats(): {\n projectId: string;\n tenantId: string;\n agentCount: number;\n initialized: boolean;\n } {\n return {\n projectId: this.projectId,\n tenantId: this.tenantId,\n agentCount: this.agents.length,\n initialized: this.initialized,\n };\n }\n\n /**\n * Validate the project configuration\n */\n validate(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!this.projectId) {\n errors.push('Project must have an ID');\n }\n\n if (!this.projectName) {\n errors.push('Project must have a name');\n }\n\n // Validate agent IDs are unique\n const agentIds = new Set<string>();\n for (const agent of this.agents) {\n const id = agent.getId();\n if (agentIds.has(id)) {\n errors.push(`Duplicate agent ID: ${id}`);\n }\n agentIds.add(id);\n }\n\n // Validate individual agent\n for (const agent of this.agents) {\n const agentValidation = agent.validate();\n if (!agentValidation.valid) {\n errors.push(...agentValidation.errors.map((error) => `Agent '${agent.getId()}': ${error}`));\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Convert the Project to FullProjectDefinition format\n */\n private async toFullProjectDefinition(): Promise<FullProjectDefinition> {\n const agentsObject: Record<string, any> = {};\n const toolsObject: Record<string, ToolApiInsert> = {};\n const functionToolsObject: Record<string, any> = {};\n const functionsObject: Record<string, any> = {};\n const dataComponentsObject: Record<string, any> = {};\n const artifactComponentsObject: Record<string, any> = {};\n const credentialReferencesObject: Record<string, any> = {};\n const externalAgentsObject: Record<string, ExternalAgentApiInsert> = {};\n // Track which resources use each credential\n const credentialUsageMap: Record<\n string,\n Array<{ type: string; id: string; agentId?: string }>\n > = {};\n\n // Convert all agent to FullAgentDefinition format and collect components\n for (const agent of this.agents) {\n // Get the agent's full definition\n logger.info({ agentId: agent.getId() }, 'Agent id');\n const agentDefinition = await agent.toFullAgentDefinition();\n agentsObject[agent.getId()] = agentDefinition;\n\n // Collect credentials from this agent\n const agentCredentials = (agent as any).credentials;\n if (agentCredentials && Array.isArray(agentCredentials)) {\n for (const credential of agentCredentials) {\n // Skip credential references - they don't define credentials\n if (credential?.__type === 'credential-ref') {\n continue;\n }\n\n if (credential?.id) {\n // Add credential to project-level credentials\n if (!credentialReferencesObject[credential.id]) {\n credentialReferencesObject[credential.id] = {\n id: credential.id,\n name: credential.name,\n type: credential.type,\n credentialStoreId: credential.credentialStoreId,\n retrievalParams: credential.retrievalParams,\n };\n credentialUsageMap[credential.id] = [];\n }\n // Track that this agent uses this credential\n credentialUsageMap[credential.id].push({\n type: 'agent',\n id: agent.getId(),\n });\n }\n }\n }\n\n // Check context config for credentials\n const agentContextConfig = (agent as any).contextConfig;\n if (agentContextConfig) {\n const contextVariables =\n agentContextConfig.getContextVariables?.() || agentContextConfig.contextVariables;\n if (contextVariables) {\n for (const [key, variable] of Object.entries(contextVariables)) {\n // Check for credential references in fetch definitions\n if ((variable as any)?.credential) {\n const credential = (variable as any).credential;\n let credId: string | undefined;\n\n // Check if it's a credential reference\n if (credential.__type === 'credential-ref') {\n credId = credential.id;\n // Resolve from injected credentials if available\n if (credId && this.credentialReferences) {\n const resolvedCred = this.credentialReferences.find((c) => c.id === credId);\n if (resolvedCred && !credentialReferencesObject[credId]) {\n credentialReferencesObject[credId] = resolvedCred;\n credentialUsageMap[credId] = [];\n }\n }\n } else if (credential.id) {\n // Direct credential object\n credId = credential.id;\n if (credId && !credentialReferencesObject[credId]) {\n credentialReferencesObject[credId] = credential;\n credentialUsageMap[credId] = [];\n }\n }\n\n if (credId) {\n if (!credentialUsageMap[credId]) {\n credentialUsageMap[credId] = [];\n }\n credentialUsageMap[credId].push({\n type: 'contextVariable',\n id: key,\n agentId: agent.getId(),\n });\n }\n }\n // Also check legacy credentialReferenceId field\n else if ((variable as any)?.credentialReferenceId) {\n const credId = (variable as any).credentialReferenceId;\n if (!credentialUsageMap[credId]) {\n credentialUsageMap[credId] = [];\n }\n credentialUsageMap[credId].push({\n type: 'contextVariable',\n id: key,\n agentId: agent.getId(),\n });\n }\n }\n }\n }\n\n // Collect project-level resources from all sub-agents in this agent\n for (const subAgent of agent.getSubAgents()) {\n const agentTools = subAgent.getTools();\n for (const [, toolInstance] of Object.entries(agentTools)) {\n // toolInstance is now properly typed as AgentTool from getTools()\n const actualTool: AgentTool | FunctionTool = toolInstance;\n const toolId = actualTool.getId();\n\n // Handle function tools and MCP tools\n if (\n actualTool.constructor.name === 'FunctionTool' &&\n actualTool instanceof FunctionTool\n ) {\n // Add to functions object (global entity)\n if (!functionsObject[toolId]) {\n const functionData = actualTool.serializeFunction();\n functionsObject[toolId] = functionData;\n }\n\n // Add to functionTools object (function tools are now separate)\n if (!functionToolsObject[toolId]) {\n const toolData = actualTool.serializeTool();\n\n functionToolsObject[toolId] = {\n id: toolData.id,\n name: toolData.name,\n description: toolData.description,\n functionId: toolData.functionId,\n };\n }\n } else {\n // Add to tools object (MCP tools)\n if (!toolsObject[toolId]) {\n // Type guard to ensure this is a Tool (MCP tool)\n if ('config' in actualTool && 'serverUrl' in actualTool.config) {\n const mcpTool = actualTool as any; // Cast to access MCP-specific properties\n const toolConfig: ToolApiInsert['config'] = {\n type: 'mcp',\n mcp: {\n server: {\n url: mcpTool.config.serverUrl,\n },\n transport: mcpTool.config.transport,\n activeTools: mcpTool.config.activeTools,\n },\n };\n\n const toolData: ToolApiInsert = {\n id: toolId,\n name: actualTool.getName(),\n config: toolConfig,\n };\n\n // Add additional fields if available\n if (mcpTool.config?.imageUrl) {\n toolData.imageUrl = mcpTool.config.imageUrl;\n }\n if (mcpTool.config?.headers) {\n toolData.headers = mcpTool.config.headers;\n }\n if ('getCredentialReferenceId' in actualTool) {\n const credentialId = (actualTool as any).getCredentialReferenceId();\n if (credentialId) {\n toolData.credentialReferenceId = credentialId;\n }\n }\n\n // Extract inline credential from tool if present\n if ('credential' in mcpTool.config && mcpTool.config.credential) {\n const credential = mcpTool.config.credential;\n if (credential?.id && credential.__type !== 'credential-ref') {\n // Add credential to project-level credentials if not already present\n if (!credentialReferencesObject[credential.id]) {\n credentialReferencesObject[credential.id] = {\n id: credential.id,\n name: credential.name,\n type: credential.type,\n credentialStoreId: credential.credentialStoreId,\n retrievalParams: credential.retrievalParams,\n };\n credentialUsageMap[credential.id] = [];\n }\n // Track that this tool uses this credential\n credentialUsageMap[credential.id].push({\n type: 'tool',\n id: toolId,\n });\n }\n }\n\n toolsObject[toolId] = toolData;\n }\n }\n }\n }\n\n // Collect data components from this agent\n const subAgentDataComponents = (subAgent as any).getDataComponents?.();\n if (subAgentDataComponents) {\n for (const dataComponent of subAgentDataComponents) {\n // Handle both DataComponent instances and plain objects\n let dataComponentId: string;\n let dataComponentName: string;\n let dataComponentDescription: string;\n let dataComponentProps: any;\n let dataComponentRender: any;\n\n if (dataComponent.getId) {\n // DataComponent instance\n dataComponentId = dataComponent.getId();\n dataComponentName = dataComponent.getName();\n dataComponentDescription = dataComponent.getDescription() || '';\n dataComponentProps = dataComponent.getProps() || {};\n dataComponentRender = dataComponent.getRender?.() || null;\n } else {\n // Plain object from agent config\n dataComponentId =\n dataComponent.id ||\n (dataComponent.name ? dataComponent.name.toLowerCase().replace(/\\s+/g, '-') : '');\n dataComponentName = dataComponent.name || '';\n dataComponentDescription = dataComponent.description || '';\n dataComponentProps = dataComponent.props || {};\n dataComponentRender = dataComponent.render || null;\n }\n\n // Only add if not already added (avoid duplicates)\n if (!dataComponentsObject[dataComponentId] && dataComponentName) {\n dataComponentsObject[dataComponentId] = {\n id: dataComponentId,\n name: dataComponentName,\n description: dataComponentDescription,\n props: dataComponentProps,\n render: dataComponentRender,\n };\n }\n }\n }\n\n // Collect artifact components from this agent\n const subAgentArtifactComponents = subAgent.getArtifactComponents();\n if (subAgentArtifactComponents) {\n for (const artifactComponent of subAgentArtifactComponents) {\n // Handle both ArtifactComponent instances and plain objects\n let artifactComponentId: string;\n let artifactComponentName: string;\n let artifactComponentDescription: string;\n let artifactComponentProps: any;\n\n if ('getId' in artifactComponent && typeof artifactComponent.getId === 'function') {\n // ArtifactComponent instance - cast to access methods\n const component = artifactComponent as any;\n artifactComponentId = component.getId();\n artifactComponentName = component.getName();\n artifactComponentDescription = component.getDescription() || '';\n artifactComponentProps = component.getProps() || {};\n } else {\n // Plain object from agent config\n artifactComponentId =\n artifactComponent.id ||\n (artifactComponent.name\n ? artifactComponent.name.toLowerCase().replace(/\\s+/g, '-')\n : '');\n artifactComponentName = artifactComponent.name || '';\n artifactComponentDescription = artifactComponent.description || '';\n artifactComponentProps = artifactComponent.props || {};\n }\n\n // Only add if not already added (avoid duplicates)\n if (!artifactComponentsObject[artifactComponentId] && artifactComponentName) {\n artifactComponentsObject[artifactComponentId] = {\n id: artifactComponentId,\n name: artifactComponentName,\n description: artifactComponentDescription,\n props: artifactComponentProps,\n };\n }\n }\n }\n\n // Collect external agents from this agent\n const subAgentExternalAgents = subAgent.getExternalAgentDelegates();\n if (subAgentExternalAgents) {\n for (const externalAgentDelegate of subAgentExternalAgents) {\n const externalAgent = externalAgentDelegate.externalAgent;\n const credential = externalAgent.getCredentialReference();\n if (credential) {\n // Add credential to project-level credentials\n if (!credentialReferencesObject[credential.id]) {\n credentialReferencesObject[credential.id] = {\n id: credential.id,\n name: credential.name,\n type: credential.type,\n credentialStoreId: credential.credentialStoreId,\n retrievalParams: credential.retrievalParams,\n };\n credentialUsageMap[credential.id] = [];\n }\n // Track that this external agent uses this credential\n logger.info({ credentialId: credential.id }, 'Credential id in external agent');\n credentialUsageMap[credential.id].push({\n type: 'externalAgent',\n id: externalAgent.getId(),\n });\n }\n logger.info({ externalAgentId: externalAgent.getId() }, 'External agent id');\n externalAgentsObject[externalAgent.getId()] = {\n id: externalAgent.getId(),\n name: externalAgent.getName(),\n description: externalAgent.getDescription(),\n baseUrl: externalAgent.getBaseUrl(),\n credentialReferenceId: externalAgent.getCredentialReferenceId(),\n };\n }\n }\n }\n }\n logger.info({ externalAgentsObject }, 'External agents object');\n // Add project-level tools, dataComponents, and artifactComponents\n for (const tool of this.projectTools) {\n const toolId = tool.getId();\n if (!toolsObject[toolId]) {\n const toolConfig: ToolApiInsert['config'] = {\n type: 'mcp',\n mcp: {\n server: {\n url: tool.config.serverUrl,\n },\n transport: tool.config.transport,\n activeTools: tool.config.activeTools,\n },\n };\n\n const toolData: ToolApiInsert = {\n id: toolId,\n name: tool.getName(),\n config: toolConfig,\n };\n\n if (tool.config?.imageUrl) {\n toolData.imageUrl = tool.config.imageUrl;\n }\n if (tool.config?.headers) {\n toolData.headers = tool.config.headers;\n }\n const credentialId = tool.getCredentialReferenceId();\n if (credentialId) {\n toolData.credentialReferenceId = credentialId;\n }\n\n toolsObject[toolId] = toolData;\n }\n }\n\n // Add project-level data components\n for (const dataComponent of this.projectDataComponents) {\n const dataComponentId = dataComponent.getId();\n const dataComponentName = dataComponent.getName();\n const dataComponentDescription = dataComponent.getDescription() || '';\n const dataComponentProps = dataComponent.getProps() || {};\n\n if (!dataComponentsObject[dataComponentId] && dataComponentName) {\n dataComponentsObject[dataComponentId] = {\n id: dataComponentId,\n name: dataComponentName,\n description: dataComponentDescription,\n props: dataComponentProps,\n };\n }\n }\n\n // Add project-level artifact components\n for (const artifactComponent of this.projectArtifactComponents) {\n const artifactComponentId = artifactComponent.getId();\n const artifactComponentName = artifactComponent.getName();\n const artifactComponentDescription = artifactComponent.getDescription() || '';\n const artifactComponentProps = artifactComponent.getProps() || {};\n\n if (!artifactComponentsObject[artifactComponentId] && artifactComponentName) {\n artifactComponentsObject[artifactComponentId] = {\n id: artifactComponentId,\n name: artifactComponentName,\n description: artifactComponentDescription,\n props: artifactComponentProps,\n };\n }\n }\n\n // Merge in any credentials set via setCredentials() method\n if (this.credentialReferences && this.credentialReferences.length > 0) {\n for (const credential of this.credentialReferences) {\n if (credential.id) {\n // Only add if not already present\n if (!credentialReferencesObject[credential.id]) {\n credentialReferencesObject[credential.id] = credential;\n credentialUsageMap[credential.id] = [];\n }\n }\n }\n }\n\n // Add usedBy information to credentials\n for (const [credId, usages] of Object.entries(credentialUsageMap)) {\n if (credentialReferencesObject[credId]) {\n credentialReferencesObject[credId].usedBy = usages;\n }\n }\n\n return {\n id: this.projectId,\n name: this.projectName,\n description: this.projectDescription || '',\n models: this.models as ProjectModels,\n stopWhen: this.stopWhen,\n agents: agentsObject,\n tools: toolsObject,\n functionTools: Object.keys(functionToolsObject).length > 0 ? functionToolsObject : undefined,\n functions: Object.keys(functionsObject).length > 0 ? functionsObject : undefined,\n dataComponents:\n Object.keys(dataComponentsObject).length > 0 ? dataComponentsObject : undefined,\n artifactComponents:\n Object.keys(artifactComponentsObject).length > 0 ? artifactComponentsObject : undefined,\n externalAgents:\n Object.keys(externalAgentsObject).length > 0 ? externalAgentsObject : undefined,\n credentialReferences:\n Object.keys(credentialReferencesObject).length > 0 ? credentialReferencesObject : undefined,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n }\n}\n","import type { StatusComponent as StatusComponentType } from '@inkeep/agents-core';\nimport { getLogger } from '@inkeep/agents-core';\nimport { convertZodToJsonSchema, isZodSchema } from '@inkeep/agents-core/utils/schema-conversion';\nimport type { z } from 'zod';\n\nconst logger = getLogger('statusComponent');\n\ntype StatusComponentConfigWithZod = Omit<StatusComponentType, 'detailsSchema'> & {\n detailsSchema?: Record<string, unknown> | z.ZodObject<any>;\n};\n\nexport interface StatusComponentInterface {\n config: StatusComponentType;\n getType(): string;\n getDescription(): string | undefined;\n getDetailsSchema(): StatusComponentType['detailsSchema'];\n}\n\nexport class StatusComponent implements StatusComponentInterface {\n public config: StatusComponentType;\n\n constructor(config: StatusComponentConfigWithZod) {\n let processedDetailsSchema: StatusComponentType['detailsSchema'];\n if (config.detailsSchema && isZodSchema(config.detailsSchema)) {\n const jsonSchema = convertZodToJsonSchema(config.detailsSchema);\n processedDetailsSchema = {\n type: 'object',\n properties: (jsonSchema.properties as Record<string, any>) || {},\n required: (jsonSchema.required as string[]) || undefined,\n };\n } else {\n processedDetailsSchema = config.detailsSchema as StatusComponentType['detailsSchema'];\n }\n\n this.config = {\n ...config,\n detailsSchema: processedDetailsSchema,\n };\n\n logger.info(\n {\n statusComponentType: config.type,\n },\n 'StatusComponent constructor initialized'\n );\n }\n\n getType(): string {\n return this.config.type;\n }\n\n getDescription(): string | undefined {\n return this.config.description;\n }\n\n getDetailsSchema(): StatusComponentType['detailsSchema'] {\n return this.config.detailsSchema;\n }\n}\n","import type { MCPToolConfig, ToolApiInsert } from '@inkeep/agents-core';\nimport { getLogger, normalizeToolSelections } from '@inkeep/agents-core';\nimport type { AgentMcpConfig, AgentMcpConfigInput } from './builders';\n\nconst logger = getLogger('tool');\n\nexport interface ToolInterface {\n config: MCPToolConfig;\n init(): Promise<void>;\n getId(): string;\n getName(): string;\n getDescription(): string;\n getServerUrl(): string;\n getActiveTools(): string[] | undefined;\n getCredentialReferenceId(): string | null | undefined;\n with(config: AgentMcpConfigInput): AgentMcpConfig;\n}\n\nexport class Tool implements ToolInterface {\n public config: MCPToolConfig;\n private baseURL: string;\n private tenantId: string;\n private initialized = false;\n private projectId: string;\n\n constructor(config: Omit<MCPToolConfig, 'tenantId' | 'projectId'>) {\n this.config = config as MCPToolConfig;\n this.baseURL = process.env.INKEEP_API_URL || 'http://localhost:3002';\n // tenantId and projectId will be set by setContext method\n this.tenantId = 'default';\n this.projectId = 'default';\n logger.info(\n {\n Id: this.getId(),\n Name: config.name,\n },\n 'Tool constructor initialized'\n );\n }\n\n // Set context (tenantId, projectId, and baseURL) from external source (agent, agent, CLI, etc)\n setContext(tenantId: string, projectId: string, baseURL?: string): void {\n this.tenantId = tenantId;\n this.projectId = projectId;\n if (baseURL) {\n this.baseURL = baseURL;\n }\n }\n\n // Compute ID from name using same slug transformation as agents\n getId(): string {\n return this.config.id;\n }\n\n getName(): string {\n return this.config.name;\n }\n\n getDescription(): string {\n return this.config.description || '';\n }\n\n getServerUrl(): string {\n return this.config.serverUrl;\n }\n\n getActiveTools(): string[] | undefined {\n return this.config.activeTools;\n }\n\n getCredentialReferenceId(): string | null | undefined {\n return this.config.credential?.id;\n }\n\n // Public method to ensure tool exists in backend (with upsert behavior)\n async init(options?: { skipDatabaseRegistration?: boolean }): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Only upsert the tool if not skipping database registration\n if (!options?.skipDatabaseRegistration) {\n await this.upsertTool();\n }\n\n logger.info(\n {\n toolId: this.getId(),\n },\n 'Tool initialized successfully'\n );\n\n this.initialized = true;\n } catch (error) {\n logger.error(\n {\n toolId: this.getId(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to initialize tool'\n );\n throw error;\n }\n }\n\n // Private method to upsert tool (create or update)\n private async upsertTool(): Promise<void> {\n const toolDataForUpdate: Omit<ToolApiInsert, 'id'> & { id?: string } = {\n id: this.getId(),\n name: this.config.name,\n credentialReferenceId: this.config.credential?.id ?? null,\n headers: this.config.headers ?? null,\n imageUrl: this.config.imageUrl,\n config: {\n type: 'mcp' as const,\n mcp: {\n server: {\n url: this.config.serverUrl,\n },\n transport: this.config.transport,\n activeTools: this.config.activeTools,\n },\n },\n };\n\n const toolDataForCreate = {\n ...toolDataForUpdate,\n };\n\n logger.info({ toolDataForCreate }, 'toolDataForCreate');\n\n // First try to update (in case tool exists)\n const updateResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/tools/${this.getId()}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(toolDataForUpdate),\n }\n );\n\n logger.info({ updateResponse }, 'tool updateResponse');\n\n if (updateResponse.ok) {\n logger.info(\n {\n toolId: this.getId(),\n },\n 'Tool updated successfully'\n );\n return;\n }\n\n // If update failed with 404, tool doesn't exist - create it\n if (updateResponse.status === 404) {\n logger.info(\n {\n toolId: this.getId(),\n },\n 'Tool not found, creating new tool'\n );\n\n const createResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/tools`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(toolDataForCreate),\n }\n );\n\n if (!createResponse.ok) {\n throw new Error(`Failed to create tool: ${createResponse.status}`);\n }\n\n logger.info(\n {\n toolId: this.getId(),\n },\n 'Tool created successfully'\n );\n return;\n }\n\n // If we get here, the update failed for some other reason\n throw new Error(`Failed to update tool: ${updateResponse.status}`);\n }\n\n /**\n * Creates a new AgentMcpConfig with the given configuration.\n *\n * @param config - The configuration for the AgentMcpConfig\n * @returns A new AgentMcpConfig\n *\n * example:\n * ```typescript\n * const tool = new Tool({\n * id: 'tool-id',\n * name: 'Tool Name',\n * serverUrl: 'https://example.com/mcp',\n * });\n * const agentMcpConfig = tool.with({ selectedTools: ['tool-1', 'tool-2'], headers: { 'Authorization': 'Bearer token' } });\n * ```\n */\n with(config: AgentMcpConfigInput): AgentMcpConfig {\n const { selectedTools, toolPolicies } = normalizeToolSelections(\n config.selectedTools ?? undefined\n );\n\n // Preserve semantic distinction:\n // - undefined/null input = all tools (return undefined)\n // - [] input = zero tools (return [])\n // - ['tool1', ...] input = specific tools (return normalized list)\n const isUnspecified = config.selectedTools === undefined || config.selectedTools === null;\n const resolvedSelectedTools = isUnspecified ? undefined : selectedTools;\n\n const resolvedToolPolicies =\n isUnspecified || Object.keys(toolPolicies).length === 0 ? undefined : toolPolicies;\n\n return {\n server: this,\n selectedTools: resolvedSelectedTools,\n headers: config.headers,\n toolPolicies: resolvedToolPolicies,\n };\n }\n}\n","import type { ToolPolicy } from '@inkeep/agents-core';\nimport type { AgentMcpConfig } from '../builders';\nimport type { Tool } from '../tool';\nimport type { SubAgentCanUseType } from '../types';\n\n/**\n * Type guard to check if a value is an AgentMcpConfig\n */\nexport function isAgentMcpConfig(value: unknown): value is AgentMcpConfig {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'server' in value &&\n (value as any).server &&\n typeof (value as any).server === 'object'\n );\n}\n\n/**\n * Type guard to check if a value is a Tool instance\n */\nexport function isTool(value: unknown): value is Tool {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'config' in value &&\n (typeof (value as any).getId === 'function' || 'id' in value)\n );\n}\n\n/**\n * Type guard to narrow down AgentCanUseType\n */\nexport function isAgentCanUseType(value: unknown): value is SubAgentCanUseType {\n return isAgentMcpConfig(value) || isTool(value);\n}\n\n/**\n * Normalized tool representation with proper typing\n */\nexport interface NormalizedToolInfo {\n /** The underlying Tool instance */\n tool: Tool;\n /** The tool ID */\n toolId: string;\n /** Selected tools (only present for AgentMcpConfig) */\n selectedTools?: string[];\n /** Agent-specific headers (only present for AgentMcpConfig) */\n headers?: Record<string, string>;\n /** Per-tool policies like needsApproval (only present for AgentMcpConfig) */\n toolPolicies?: Record<string, ToolPolicy>;\n /** Whether this came from an AgentMcpConfig wrapper */\n isWrapped: boolean;\n}\n\n/**\n * Safely extracts tool information from AgentCanUseType with proper typing\n */\nexport function normalizeAgentCanUseType(\n value: SubAgentCanUseType,\n fallbackName?: string\n): NormalizedToolInfo {\n if (isAgentMcpConfig(value)) {\n return {\n tool: value.server,\n toolId: value.server.getId(),\n selectedTools: value.selectedTools,\n headers: value.headers,\n toolPolicies: value.toolPolicies,\n isWrapped: true,\n };\n }\n\n if (isTool(value)) {\n const toolId = value.getId?.() || (value as any).id || fallbackName || 'unknown';\n return {\n tool: value,\n toolId,\n isWrapped: false,\n };\n }\n\n throw new Error(`Invalid AgentCanUseType: expected Tool or AgentMcpConfig, got ${typeof value}`);\n}\n","import {\n type ArtifactComponentApiInsert,\n type DataComponentApiInsert,\n getLogger,\n type ToolPolicy,\n} from '@inkeep/agents-core';\nimport {\n convertZodToJsonSchemaWithPreview,\n isZodSchema,\n} from '@inkeep/agents-core/utils/schema-conversion';\nimport { ArtifactComponent } from './artifact-component';\nimport { DataComponent } from './data-component';\nimport { FunctionTool } from './function-tool';\nimport { Tool } from './tool';\nimport type {\n AgentTool,\n AllDelegateInputInterface,\n AllDelegateOutputInterface,\n SubAgentCanUseType,\n SubAgentConfig,\n SubAgentInterface,\n subAgentExternalAgentInterface,\n subAgentTeamAgentInterface,\n} from './types';\nimport { isAgentMcpConfig, normalizeAgentCanUseType } from './utils/tool-normalization';\n\nconst logger = getLogger('agent');\n\n// Helper function to resolve getter functions\nfunction resolveGetter<T>(value: T | (() => T) | undefined): T | undefined {\n if (typeof value === 'function') {\n return (value as () => T)();\n }\n return value as T | undefined;\n}\n\nexport class SubAgent implements SubAgentInterface {\n public config: SubAgentConfig;\n public readonly type = 'internal' as const;\n private baseURL: string;\n private tenantId: string;\n private projectId: string;\n private initialized = false;\n constructor(config: SubAgentConfig) {\n this.config = { ...config, type: 'internal' };\n this.baseURL = process.env.INKEEP_API_URL || 'http://localhost:3002';\n // tenantId and projectId will be set later by the agent or CLI\n this.tenantId = 'default';\n this.projectId = 'default';\n\n logger.info(\n {\n tenantId: this.tenantId,\n subAgentId: this.config.id,\n agentName: config.name,\n },\n 'Agent constructor initialized'\n );\n }\n\n // Set context (tenantId, projectId, and baseURL) from external source (agent, CLI, etc)\n setContext(tenantId: string, projectId: string, baseURL?: string): void {\n this.tenantId = tenantId;\n this.projectId = projectId;\n if (baseURL) {\n this.baseURL = baseURL;\n }\n }\n\n // Return the configured ID\n getId(): string {\n return this.config.id;\n }\n\n // Agent introspection methods\n getName(): string {\n return this.config.name;\n }\n\n getInstructions(): string {\n return this.config.prompt || '';\n }\n\n /**\n * Get the agent's description (the human-readable description field)\n */\n getDescription(): string {\n return this.config.description || '';\n }\n\n getTools(): Record<string, AgentTool> {\n const tools = resolveGetter(this.config.canUse);\n if (!tools) {\n return {};\n }\n // Tools must be an array from the getter function\n if (!Array.isArray(tools)) {\n throw new Error('tools getter must return an array');\n }\n // Convert array to record using tool id or name as key\n const toolRecord: Record<string, AgentTool> = {};\n for (const tool of tools) {\n if (tool && typeof tool === 'object') {\n let id: string;\n let toolInstance: AgentTool;\n\n // Check if this is an AgentMcpConfig using type guard\n if (isAgentMcpConfig(tool)) {\n id = tool.server.getId();\n toolInstance = tool.server;\n // Add selectedTools metadata to the tool instance\n toolInstance.selectedTools = tool.selectedTools;\n // Add headers metadata to the tool instance if present\n toolInstance.headers = tool.headers;\n // Add toolPolicies metadata to the tool instance if present\n toolInstance.toolPolicies = tool.toolPolicies;\n } else {\n // Regular tool instance\n toolInstance = tool as AgentTool;\n id = toolInstance.getId();\n }\n\n if (id) {\n toolRecord[id] = toolInstance;\n }\n }\n }\n return toolRecord;\n }\n\n getModels(): typeof this.config.models {\n return this.config.models;\n }\n\n setModels(models: typeof this.config.models): void {\n this.config.models = models;\n }\n\n getTransfers(): SubAgentInterface[] {\n return typeof this.config.canTransferTo === 'function' ? this.config.canTransferTo() : [];\n }\n\n getSubAgentDelegates(): SubAgentInterface[] {\n return typeof this.config.canDelegateTo === 'function'\n ? (this.config.canDelegateTo().filter((delegate) => {\n // Filter out subAgentExternalAgentInterface (has externalAgent property)\n if (typeof delegate === 'object' && 'externalAgent' in delegate) {\n return false;\n }\n // Filter out subAgentTeamAgentInterface (has agent property)\n if (typeof delegate === 'object' && 'agent' in delegate) {\n return false;\n }\n // Filter out AgentInterface (has agent property)\n if (typeof delegate === 'object' && 'toFullAgentDefinition' in delegate) {\n return false;\n }\n // Filter out raw ExternalAgent instances (have type: 'external')\n if (typeof delegate === 'object' && 'type' in delegate && delegate.type === 'external') {\n return false;\n }\n return true;\n }) as SubAgentInterface[])\n : [];\n }\n\n getExternalAgentDelegates(): subAgentExternalAgentInterface[] {\n if (typeof this.config.canDelegateTo !== 'function') {\n return [];\n }\n\n return this.config\n .canDelegateTo()\n .filter((delegate) => {\n // Accept wrapped external agents (from .with())\n if (typeof delegate === 'object' && 'externalAgent' in delegate) {\n return true;\n }\n // Accept raw ExternalAgent instances\n if (typeof delegate === 'object' && 'type' in delegate && delegate.type === 'external') {\n return true;\n }\n return false;\n })\n .map((delegate) => {\n // If it's already wrapped, return as-is\n if ('externalAgent' in delegate) {\n return delegate as subAgentExternalAgentInterface;\n }\n // If it's a raw ExternalAgent, wrap it\n return {\n externalAgent: delegate as any,\n headers: undefined,\n };\n });\n }\n getTeamAgentDelegates(): subAgentTeamAgentInterface[] {\n if (typeof this.config.canDelegateTo !== 'function') {\n return [];\n }\n\n return this.config\n .canDelegateTo()\n .filter((delegate) => {\n if (typeof delegate === 'object' && 'agent' in delegate) {\n return true;\n }\n if (typeof delegate === 'object' && 'toFullAgentDefinition' in delegate) {\n return true;\n }\n return false;\n })\n .map((delegate) => {\n if ('agent' in delegate) {\n return delegate as subAgentTeamAgentInterface;\n }\n\n // If it's a raw Agent, wrap it for simplicity\n return {\n agent: delegate as any,\n headers: undefined,\n };\n });\n }\n\n getDelegates(): AllDelegateOutputInterface[] {\n return [\n ...this.getSubAgentDelegates(),\n ...this.getTeamAgentDelegates(),\n ...this.getExternalAgentDelegates(),\n ];\n }\n\n getDataComponents(): DataComponentApiInsert[] {\n const components = resolveGetter(this.config.dataComponents) || [];\n // Handle both DataComponent instances and plain objects\n return components.map((comp: any) => {\n // If it's a DataComponent instance with methods\n if (comp && typeof comp.getId === 'function') {\n return {\n id: comp.getId(),\n name: comp.getName(),\n description: comp.getDescription(),\n props: comp.getProps(),\n render: comp.getRender?.() || null,\n };\n }\n // If it's a plain object, check if props is a Zod schema\n if (comp && typeof comp === 'object' && comp.props && isZodSchema(comp.props)) {\n return {\n id: comp.id,\n name: comp.name,\n description: comp.description,\n props: convertZodToJsonSchemaWithPreview(comp.props),\n render: comp.render || null,\n };\n }\n // Otherwise assume it's already a plain object\n return comp;\n });\n }\n\n getArtifactComponents(): ArtifactComponentApiInsert[] {\n const components = resolveGetter(this.config.artifactComponents) || [];\n // Handle both ArtifactComponent instances and plain objects\n return components.map((comp: any) => {\n // If it's an ArtifactComponent instance with methods\n if (comp && typeof comp.getId === 'function') {\n return {\n id: comp.getId(),\n name: comp.getName(),\n description: comp.getDescription(),\n props: comp.getProps?.() || comp.props,\n };\n }\n // If it's a plain object, check if props is a Zod schema\n if (comp && typeof comp === 'object' && comp.props && isZodSchema(comp.props)) {\n return {\n id: comp.id,\n name: comp.name,\n description: comp.description,\n props: convertZodToJsonSchemaWithPreview(comp.props),\n };\n }\n // Otherwise assume it's already a plain object\n return comp;\n });\n }\n\n // adjust\n addTool(_name: string, tool: Tool): void {\n // Tools must now be a getter function returning an array\n const existingTools = this.config.canUse ? this.config.canUse() : [];\n this.config.canUse = () => [...existingTools, tool];\n }\n\n addTransfer(...agents: SubAgentInterface[]): void {\n if (typeof this.config.canTransferTo === 'function') {\n // If already a function, we need to combine the results\n const existingTransfers = this.config.canTransferTo;\n this.config.canTransferTo = () => [...existingTransfers(), ...agents];\n } else {\n // Convert to function-based transfers\n this.config.canTransferTo = () => agents;\n }\n }\n\n addDelegate(...agents: AllDelegateInputInterface[]): void {\n if (typeof this.config.canDelegateTo === 'function') {\n const existingDelegates = this.config.canDelegateTo;\n this.config.canDelegateTo = () => [...existingDelegates(), ...agents];\n } else {\n this.config.canDelegateTo = () => agents;\n }\n }\n\n // Public method to ensure agent exists in backend (with upsert behavior)\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Always attempt to upsert the agent\n await this.upsertAgent();\n\n // Load existing data components from database and merge with config\n await this.loadDataComponents();\n\n // Load existing artifact components from database and merge with config\n await this.loadArtifactComponents();\n\n // Setup tools and relations\n await this.saveToolsAndRelations();\n\n await this.saveDataComponents();\n\n await this.saveArtifactComponents();\n\n logger.info(\n {\n subAgentId: this.getId(),\n },\n 'Agent initialized successfully'\n );\n\n this.initialized = true;\n } catch (error) {\n logger.error(\n {\n subAgentId: this.getId(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to initialize agent'\n );\n throw error;\n }\n }\n\n // Private method to upsert agent (create or update)\n private async upsertAgent(): Promise<void> {\n const agentData = {\n id: this.getId(),\n name: this.config.name,\n description: this.config.description || '',\n prompt: this.config.prompt || '',\n conversationHistoryConfig: this.config.conversationHistoryConfig,\n models: this.config.models,\n stopWhen: this.config.stopWhen,\n };\n\n // First try to update (in case agent exists)\n const updateResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/agents/${this.getId()}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(agentData),\n }\n );\n\n if (updateResponse.ok) {\n logger.info(\n {\n subAgentId: this.getId(),\n },\n 'Agent updated successfully'\n );\n return;\n }\n\n // If update failed with 404, agent doesn't exist - create it\n if (updateResponse.status === 404) {\n logger.info(\n {\n subAgentId: this.getId(),\n },\n 'Agent not found, creating new agent'\n );\n\n const createResponse = await fetch(`${this.baseURL}/tenants/${this.tenantId}/agents`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(agentData),\n });\n\n if (!createResponse.ok) {\n const errorText = await createResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to create agent: ${createResponse.status} ${createResponse.statusText} - ${errorText}`\n );\n }\n\n logger.info(\n {\n subAgentId: this.getId(),\n },\n 'Agent created successfully'\n );\n return;\n }\n\n // Update failed for some other reason\n const errorText = await updateResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to update agent: ${updateResponse.status} ${updateResponse.statusText} - ${errorText}`\n );\n }\n\n private async saveToolsAndRelations(): Promise<void> {\n // Setup tools using your existing SDK\n if (this.config.canUse) {\n const tools = resolveGetter(this.config.canUse);\n\n if (tools && Array.isArray(tools)) {\n for (let i = 0; i < tools.length; i++) {\n const toolConfig = tools[i];\n\n try {\n // Use normalization utility to get tool info\n const normalizedTool = normalizeAgentCanUseType(toolConfig, `tool-${i}`);\n await this.createTool(normalizedTool.toolId, toolConfig);\n } catch (error) {\n logger.error(\n {\n toolId: isAgentMcpConfig(toolConfig)\n ? toolConfig.server.getId()\n : toolConfig.getId?.(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Tool creation failed'\n );\n throw error;\n }\n }\n }\n }\n\n // Note: Transfer and delegate relations are managed by the Agent, not individual agents\n }\n\n private async saveDataComponents(): Promise<void> {\n logger.info({ dataComponents: this.config.dataComponents }, 'dataComponents and config');\n const components = resolveGetter(this.config.dataComponents);\n if (components) {\n for (const dataComponent of components) {\n // Convert DataComponent instances to plain objects\n const plainComponent =\n dataComponent && typeof (dataComponent as any).getId === 'function'\n ? {\n id: (dataComponent as any).getId(),\n name: (dataComponent as any).getName(),\n description: (dataComponent as any).getDescription(),\n props: (dataComponent as any).getProps(),\n }\n : dataComponent;\n await this.createDataComponent(plainComponent as DataComponentApiInsert);\n }\n }\n }\n\n private async saveArtifactComponents(): Promise<void> {\n logger.info(\n { artifactComponents: this.config.artifactComponents },\n 'artifactComponents and config'\n );\n const components = resolveGetter(this.config.artifactComponents);\n if (components) {\n for (const artifactComponent of components) {\n // Convert ArtifactComponent instances to plain objects\n const plainComponent =\n artifactComponent && typeof (artifactComponent as any).getId === 'function'\n ? {\n id: (artifactComponent as any).getId(),\n name: (artifactComponent as any).getName(),\n description: (artifactComponent as any).getDescription(),\n props: (artifactComponent as any).getProps?.() || (artifactComponent as any).props,\n }\n : artifactComponent;\n await this.createArtifactComponent(plainComponent as ArtifactComponentApiInsert);\n }\n }\n }\n\n private async loadDataComponents(): Promise<void> {\n try {\n // Import the getDataComponentsForAgent function\n\n // TODO: Load data components from database for this agent\n // This needs to be replaced with an HTTP API call\n const existingComponents: DataComponentApiInsert[] = [];\n\n // Convert database format to config format\n const dbDataComponents = existingComponents.map((component: any) => ({\n id: component.id,\n name: component.name,\n description: component.description,\n props: component.props,\n createdAt: component.createdAt,\n updatedAt: component.updatedAt,\n }));\n\n // Merge with existing config data components (config takes precedence)\n const configComponents = resolveGetter(this.config.dataComponents) || [];\n // Convert any DataComponentInterface instances to plain objects\n const normalizedConfigComponents = configComponents.map((comp: any) => {\n if (comp && typeof comp.getId === 'function') {\n return {\n id: comp.getId(),\n name: comp.getName(),\n description: comp.getDescription(),\n props: comp.getProps(),\n };\n }\n return comp;\n });\n\n const allComponents = [...dbDataComponents, ...normalizedConfigComponents];\n\n // Remove duplicates (config components override database ones with same id)\n const uniqueComponents = allComponents.reduce((acc, component) => {\n const componentId =\n typeof component.getId === 'function' ? component.getId() : component.id;\n const existingIndex = acc.findIndex((c: any) => {\n const cId = typeof c.getId === 'function' ? c.getId() : c.id;\n return cId === componentId;\n });\n if (existingIndex >= 0) {\n // Replace with the later one (config takes precedence)\n acc[existingIndex] = component;\n } else {\n acc.push(component);\n }\n return acc;\n }, [] as any[]);\n\n // Update the config with merged components\n this.config.dataComponents = () => uniqueComponents;\n\n logger.info(\n {\n subAgentId: this.getId(),\n dbComponentCount: dbDataComponents.length,\n configComponentCount: configComponents.length,\n totalComponentCount: uniqueComponents.length,\n },\n 'Loaded and merged data components'\n );\n } catch (error) {\n logger.error(\n {\n subAgentId: this.getId(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to load data components from database'\n );\n // Don't throw - continue with just config components\n }\n }\n\n private async loadArtifactComponents(): Promise<void> {\n try {\n // TODO: Load artifact components from database for this agent\n // This needs to be replaced with an HTTP API call\n const existingComponents: ArtifactComponentApiInsert[] = [];\n\n // Convert database format to config format\n const dbArtifactComponents = existingComponents.map((component: any) => ({\n id: component.id,\n name: component.name,\n description: component.description,\n props: component.props,\n createdAt: component.createdAt,\n updatedAt: component.updatedAt,\n }));\n\n // Merge with existing config artifact components (config takes precedence)\n const configComponents = resolveGetter(this.config.artifactComponents) || [];\n // Convert any ArtifactComponentInterface instances to plain objects\n const normalizedConfigComponents = configComponents.map((comp: any) => {\n if (comp && typeof comp.getId === 'function') {\n return {\n id: comp.getId(),\n name: comp.getName(),\n description: comp.getDescription(),\n props: comp.getProps?.() || comp.props,\n };\n }\n return comp;\n });\n\n const allComponents = [...dbArtifactComponents, ...normalizedConfigComponents];\n\n // Remove duplicates (config components override database ones with same id)\n const uniqueComponents = allComponents.reduce((acc, component) => {\n const componentId =\n typeof component.getId === 'function' ? component.getId() : component.id;\n const existingIndex = acc.findIndex((c: any) => {\n const cId = typeof c.getId === 'function' ? c.getId() : c.id;\n return cId === componentId;\n });\n if (existingIndex >= 0) {\n // Replace with the later one (config takes precedence)\n acc[existingIndex] = component;\n } else {\n acc.push(component);\n }\n return acc;\n }, [] as any[]);\n\n // Update the config with merged components\n this.config.artifactComponents = () => uniqueComponents;\n\n logger.info(\n {\n subAgentId: this.getId(),\n dbComponentCount: dbArtifactComponents.length,\n configComponentCount: configComponents.length,\n totalComponentCount: uniqueComponents.length,\n },\n 'Loaded and merged artifact components'\n );\n } catch (error) {\n logger.error(\n {\n subAgentId: this.getId(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to load artifact components from database'\n );\n // Don't throw - continue with just config components\n }\n }\n\n private async createFunctionTool(toolId: string, functionTool: FunctionTool): Promise<void> {\n try {\n // Serialize the function and get tool data\n const functionData = functionTool.serializeFunction();\n const toolData = functionTool.serializeTool();\n\n const functionUrl = `${this.baseURL}/tenants/${this.tenantId}/crud/projects/${this.projectId}/functions`;\n logger.info(\n {\n agentId: this.getId(),\n toolId,\n functionUrl,\n },\n 'Attempting to create global function'\n );\n\n const functionResponse = await fetch(functionUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n id: functionData.id,\n inputSchema: functionData.inputSchema,\n executeCode: functionData.executeCode,\n dependencies: functionData.dependencies,\n }),\n });\n\n logger.info(\n {\n agentId: this.getId(),\n toolId,\n functionStatus: functionResponse.status,\n functionStatusText: functionResponse.statusText,\n },\n 'Function creation response received'\n );\n\n if (!functionResponse.ok) {\n const errorText = await functionResponse.text();\n logger.error(\n {\n agentId: this.getId(),\n toolId,\n functionStatus: functionResponse.status,\n functionStatusText: functionResponse.statusText,\n errorText,\n },\n 'Function creation failed'\n );\n throw new Error(`Failed to create function: ${functionResponse.status} ${errorText}`);\n }\n\n // Create a tool with type 'function' at project level\n const toolUrl = `${this.baseURL}/tenants/${this.tenantId}/crud/projects/${this.projectId}/tools`;\n logger.info(\n {\n agentId: this.getId(),\n toolId,\n toolUrl,\n },\n 'Attempting to create function tool'\n );\n\n const toolResponse = await fetch(toolUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n id: toolData.id,\n name: toolData.name,\n description: toolData.description,\n functionId: toolData.functionId,\n config: {\n type: 'function',\n // No inline function details - reference via functionId only\n },\n }),\n });\n\n logger.info(\n {\n agentId: this.getId(),\n toolId,\n toolStatus: toolResponse.status,\n toolStatusText: toolResponse.statusText,\n },\n 'Tool creation response received'\n );\n\n if (!toolResponse.ok) {\n const errorText = await toolResponse.text();\n logger.error(\n {\n agentId: this.getId(),\n toolId,\n toolStatus: toolResponse.status,\n toolStatusText: toolResponse.statusText,\n errorText,\n },\n 'Tool creation failed'\n );\n throw new Error(`Failed to create tool: ${toolResponse.status} ${errorText}`);\n }\n\n // Create agent-tool relation\n await this.createAgentToolRelation(toolData.id);\n\n logger.info(\n {\n agentId: this.getId(),\n functionId: functionData.id,\n toolId: toolData.id,\n },\n 'Function and tool created successfully'\n );\n } catch (error) {\n logger.error(\n {\n agentId: this.getId(),\n toolId,\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined,\n },\n 'Failed to create function tool'\n );\n throw error;\n }\n }\n\n private async createTool(toolId: string, toolConfig: SubAgentCanUseType): Promise<void> {\n try {\n // Check if this is a FunctionTool instance\n if (toolConfig instanceof FunctionTool) {\n await this.createFunctionTool(toolId, toolConfig);\n return;\n }\n\n // Check if this is a function tool (has type: 'function')\n if ((toolConfig as any).type === 'function') {\n logger.info(\n {\n subAgentId: this.getId(),\n toolId,\n },\n 'Skipping function tool creation - will be handled at runtime'\n );\n return;\n }\n\n let tool: Tool;\n let selectedTools: string[] | undefined;\n let headers: Record<string, string> | undefined;\n let toolPolicies: Record<string, ToolPolicy> | undefined;\n\n try {\n const normalizedTool = normalizeAgentCanUseType(toolConfig, toolId);\n tool = normalizedTool.tool;\n selectedTools = normalizedTool.selectedTools;\n headers = normalizedTool.headers;\n toolPolicies = normalizedTool.toolPolicies;\n\n tool.setContext(this.tenantId, this.projectId);\n await tool.init();\n } catch (_) {\n // Fall back to legacy handling for non-standard tool configs\n tool = new Tool({\n id: toolId,\n name: (toolConfig as any).name || toolId,\n description: (toolConfig as any).description || `MCP tool: ${toolId}`,\n serverUrl:\n (toolConfig as any).config?.serverUrl ||\n (toolConfig as any).serverUrl ||\n 'http://localhost:3000',\n activeTools: (toolConfig as any).config?.mcp?.activeTools,\n credential: (toolConfig as any).credential,\n });\n tool.setContext(this.tenantId, this.projectId);\n await tool.init();\n }\n\n // Create the agent-tool relation with selected tools, headers, and toolPolicies\n await this.createAgentToolRelation(tool.getId(), selectedTools, headers, toolPolicies);\n\n logger.info(\n {\n subAgentId: this.getId(),\n toolId: tool.getId(),\n },\n 'Tool created and linked to agent'\n );\n } catch (error) {\n logger.error(\n {\n subAgentId: this.getId(),\n toolId,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to create tool'\n );\n throw error;\n }\n }\n\n private async createDataComponent(dataComponent: DataComponentApiInsert): Promise<void> {\n try {\n // Create a DataComponent instance from the config\n const dc = new DataComponent({\n id: dataComponent.id,\n name: dataComponent.name,\n description: dataComponent.description,\n props: dataComponent.props,\n render: dataComponent.render,\n });\n\n // Set the context from the agent\n dc.setContext(this.tenantId, this.projectId);\n\n // Initialize the data component (this handles creation/update)\n await dc.init();\n\n // Create the agent-dataComponent association\n await this.createAgentDataComponentRelation(dc.getId());\n\n logger.info(\n {\n subAgentId: this.getId(),\n dataComponentId: dc.getId(),\n },\n 'DataComponent created and linked to agent'\n );\n } catch (error) {\n logger.error(\n {\n subAgentId: this.getId(),\n dataComponentName: dataComponent.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to create data component'\n );\n // Re-throw the error so tests can catch it\n throw error;\n }\n }\n\n private async createArtifactComponent(\n artifactComponent: ArtifactComponentApiInsert\n ): Promise<void> {\n try {\n // Create an ArtifactComponent instance from the config\n const ac = new ArtifactComponent({\n id: artifactComponent.id,\n name: artifactComponent.name,\n description: artifactComponent.description,\n props: artifactComponent.props,\n });\n\n // Set the context from the agent\n ac.setContext(this.tenantId, this.projectId);\n\n // Initialize the artifact component (this handles creation/update)\n await ac.init();\n\n // Create the agent-artifactComponent association\n await this.createAgentArtifactComponentRelation(ac.getId());\n\n logger.info(\n {\n subAgentId: this.getId(),\n artifactComponentId: ac.getId(),\n },\n 'ArtifactComponent created and linked to agent'\n );\n } catch (error) {\n logger.error(\n {\n subAgentId: this.getId(),\n artifactComponentName: artifactComponent.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to create artifact component'\n );\n // Re-throw the error so tests can catch it\n throw error;\n }\n }\n\n private async createAgentDataComponentRelation(dataComponentId: string): Promise<void> {\n const relationResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/agent-data-components`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n id: `${this.getId()}-dc-${dataComponentId}`,\n tenantId: this.tenantId,\n subAgentId: this.getId(),\n dataComponentId: dataComponentId,\n }),\n }\n );\n\n if (!relationResponse.ok) {\n throw new Error(\n `Failed to create agent-dataComponent relation: ${relationResponse.status} ${relationResponse.statusText}`\n );\n }\n\n logger.info(\n {\n subAgentId: this.getId(),\n dataComponentId,\n },\n 'Created agent-dataComponent relation'\n );\n }\n\n private async createAgentArtifactComponentRelation(artifactComponentId: string): Promise<void> {\n const relationResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/agent-artifact-components`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n id: crypto.randomUUID(),\n tenantId: this.tenantId,\n subAgentId: this.getId(),\n artifactComponentId: artifactComponentId,\n }),\n }\n );\n\n if (!relationResponse.ok) {\n throw new Error(\n `Failed to create agent-artifactComponent relation: ${relationResponse.status} ${relationResponse.statusText}`\n );\n }\n\n logger.info(\n {\n subAgentId: this.getId(),\n artifactComponentId,\n },\n 'Created agent-artifactComponent relation'\n );\n }\n\n private async createAgentToolRelation(\n toolId: string,\n selectedTools?: string[],\n headers?: Record<string, string>,\n toolPolicies?: Record<string, ToolPolicy>\n ): Promise<void> {\n const relationData: {\n id: string;\n tenantId: string;\n projectId: string;\n subAgentId: string;\n toolId: string;\n selectedTools?: string[];\n headers?: Record<string, string>;\n toolPolicies?: Record<string, ToolPolicy>;\n } = {\n id: `${this.getId()}-tool-${toolId}`,\n tenantId: this.tenantId,\n projectId: this.projectId,\n subAgentId: this.getId(),\n toolId: toolId,\n };\n\n // Add selectedTools if provided (including empty arrays)\n if (selectedTools !== undefined) {\n relationData.selectedTools = selectedTools;\n }\n\n // Add headers if provided\n if (headers !== undefined) {\n relationData.headers = headers;\n }\n\n // Add toolPolicies if provided\n if (toolPolicies !== undefined && Object.keys(toolPolicies).length > 0) {\n relationData.toolPolicies = toolPolicies;\n }\n\n const relationResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/agent-tool-relations`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(relationData),\n }\n );\n\n if (!relationResponse.ok) {\n const errorBody = await relationResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to create agent-tool relation: ${relationResponse.status} - ${errorBody}`\n );\n }\n }\n}\n\n// Factory function for creating agents - similar to contextConfig() pattern\nexport function agent(config: SubAgentConfig): SubAgent {\n return new SubAgent(config);\n}\n","import {\n type CredentialReferenceApiInsert,\n CredentialReferenceApiInsertSchema,\n type MCPToolConfig,\n MCPToolConfigSchema,\n} from '@inkeep/agents-core';\nimport { Agent } from './agent';\nimport { ArtifactComponent } from './artifact-component';\nimport type {\n AgentMcpConfig,\n ArtifactComponentConfig,\n DataComponentConfig,\n MCPServerConfig,\n StatusComponentConfig,\n} from './builders';\nimport { DataComponent } from './data-component';\nimport { FunctionTool } from './function-tool';\nimport type { ProjectConfig } from './project';\nimport { Project } from './project';\nimport { StatusComponent } from './status-component';\nimport { SubAgent } from './subAgent';\nimport { Tool } from './tool';\nimport type { AgentConfig, FunctionToolConfig, SubAgentConfig } from './types';\nimport { generateIdFromName } from './utils/generateIdFromName';\n\n/**\n * Helper function to create agent - OpenAI style\n */\n\nexport function agent(config: AgentConfig): Agent {\n return new Agent(config);\n}\n\n/**\n * Helper function to create projects - OpenAI style\n *\n * Projects are the top-level organizational unit that contains Agents, Sub Agents, and shared configurations.\n * They provide model inheritance and execution limits that cascade down to Agents and Sub Agents.\n *\n * @param config - Project configuration\n * @returns A new Project instance\n *\n * @example\n * ```typescript\n * const customerSupport = project({\n * id: 'customer-support-project',\n * name: 'Customer Support System',\n * description: 'Multi-agent customer support system',\n * models: {\n * base: { model: 'gpt-4.1-mini' },\n * structuredOutput: { model: 'gpt-4.1' }\n * },\n * stopWhen: {\n * transferCountIs: 10,\n * stepCountIs: 50\n * },\n * agent: () => [\n * agent({\n * id: 'support-agent',\n * name: 'Support Agent',\n * // ... agent config\n * })\n * ]\n * });\n * ```\n */\nexport function project(config: ProjectConfig): Project {\n return new Project(config);\n}\n\n// ============================================================================\n// Agent Builders\n// ============================================================================\n/**\n * Creates a new agent with stable ID enforcement.\n *\n * Agents require explicit stable IDs to ensure consistency across deployments.\n * This is different from tools which auto-generate IDs from their names.\n *\n * @param config - Agent configuration including required stable ID\n * @returns A new SubAgent instance\n * @throws {Error} If config.id is not provided\n *\n * @example\n * ```typescript\n * const myAgent = agent({\n * id: 'customer-support-agent',\n * name: 'Customer Support',\n * prompt: 'Help customers with their questions'\n * });\n * ```\n */\n\nexport function subAgent(config: SubAgentConfig): SubAgent {\n if (!config.id) {\n throw new Error(\n 'Sub-Agent ID is required. Sub-Agents must have stable IDs for consistency across deployments.'\n );\n }\n return new SubAgent(config);\n} // ============================================================================\n// Credential Builders\n// ============================================================================\n/**\n * Creates a credential reference for authentication.\n *\n * Credentials are used to authenticate with external services.\n * They should be stored securely and referenced by ID.\n *\n * @param config - Credential configuration\n * @returns A validated credential reference\n *\n * @example\n * ```typescript\n * const apiCredential = credential({\n * id: 'github-token',\n * name: 'GitHub Token',\n * type: 'bearer',\n * value: process.env.GITHUB_TOKEN\n * });\n * ```\n */\n\nexport function credential(config: CredentialReferenceApiInsert) {\n try {\n return CredentialReferenceApiInsertSchema.parse(config);\n } catch (error) {\n if (error instanceof Error) {\n const credId = config.id || 'unknown';\n throw new Error(`Invalid credential '${credId}': ${error.message}`);\n }\n throw error;\n }\n} // ============================================================================\n// Tool Builders\n// ============================================================================\n/**\n * Creates an MCP (Model Context Protocol) server for tool functionality.\n *\n * MCP servers provide tool functionality through a standardized protocol.\n * They can be remote services accessed via HTTP/WebSocket.\n *\n * @param config - MCP server configuration\n * @returns A Tool instance configured as an MCP server\n * @throws {Error} If serverUrl is not provided\n *\n * @example\n * ```typescript\n * // Remote MCP server\n * const apiServer = mcpServer({\n * name: 'external_api',\n * description: 'External API service',\n * serverUrl: 'https://api.example.com/mcp'\n * });\n *\n * // With authentication\n * const secureServer = mcpServer({\n * name: 'secure_api',\n * description: 'Secure API service',\n * serverUrl: 'https://secure.example.com/mcp',\n * credential: credential({\n * id: 'api-key',\n * name: 'API Key',\n * type: 'bearer',\n * value: process.env.API_KEY\n * })\n * });\n * ```\n */\n\nexport function mcpServer(config: MCPServerConfig): Tool {\n if (!config.serverUrl) {\n throw new Error('MCP server requires a serverUrl');\n }\n\n // Generate ID if not provided\n const id = config.id || generateIdFromName(config.name);\n\n // Create Tool instance for MCP server\n return new Tool({\n id,\n name: config.name,\n description: config.description,\n serverUrl: config.serverUrl,\n credential: config.credential,\n activeTools: config.activeTools,\n headers: config.headers,\n imageUrl: config.imageUrl,\n transport: config.transport\n ? { type: config.transport as 'streamable_http' | 'sse' }\n : undefined,\n });\n}\n\n/**\n * Creates an MCP tool from a raw configuration object.\n *\n * This is a low-level builder for advanced use cases where you need\n * full control over the MCPToolConfig. For most cases, use `mcpServer()`.\n *\n * @param config - Complete MCP tool configuration\n * @returns A Tool instance\n *\n * @example\n * ```typescript\n * const customTool = mcpTool({\n * id: 'custom-tool',\n * name: 'Custom Tool',\n * serverUrl: 'https://example.com/mcp',\n * transport: { type: 'stdio' }\n * });\n * ```\n */\nexport function mcpTool(config: MCPToolConfig): Tool {\n const configWithId = {\n ...config,\n id: config.id || generateIdFromName(config.name),\n };\n const validatedConfig = MCPToolConfigSchema.parse(configWithId);\n return new Tool(validatedConfig);\n}\n\n/**\n * Creates an artifact component with automatic ID generation.\n *\n * Artifact components represent structured UI components that can\n * be rendered with different levels of detail (summary vs full).\n *\n * @param config - Artifact component configuration\n * @returns An ArtifactComponent instance\n *\n * @example\n * ```typescript\n * const productCard = artifactComponent({\n * name: 'Product Card',\n * description: 'Display product information',\n * props: {\n * type: 'object',\n * properties: {\n * title: { type: 'string', inPreview: true },\n * price: { type: 'string', inPreview: true },\n * description: { type: 'string' },\n * image: { type: 'string' }\n * }\n * }\n * });\n * ```\n */\nexport function artifactComponent(config: ArtifactComponentConfig): ArtifactComponent {\n const configWithId = {\n ...config,\n id: config.id || generateIdFromName(config.name),\n };\n return new ArtifactComponent(configWithId);\n}\n\n/**\n * Creates a data component with automatic ID generation.\n *\n * Data components represent structured data that can be\n * passed between agents or used in processing.\n *\n * @param config - Data component configuration\n * @returns A DataComponent instance\n *\n * @example\n * ```typescript\n * const userProfile = dataComponent({\n * name: 'User Profile',\n * description: 'User profile data',\n * props: {\n * userId: '123',\n * name: 'John Doe',\n * email: 'john@example.com'\n * }\n * });\n * ```\n */\nexport function dataComponent(config: DataComponentConfig): DataComponent {\n const configWithId = {\n ...config,\n id: config.id || generateIdFromName(config.name),\n };\n return new DataComponent(configWithId);\n}\n\n/**\n * Creates a status component for structured status updates.\n *\n * Status components define the structure of status updates\n * that agents can generate during long-running operations.\n *\n * @param config - Status component configuration\n * @returns A StatusComponent instance\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n *\n * const toolCallStatus = statusComponent({\n * type: 'tool_call_summary',\n * description: 'Summary of a tool execution',\n * detailsSchema: z.object({\n * tool_name: z.string(),\n * summary: z.string(),\n * status: z.enum(['success', 'error', 'in_progress'])\n * })\n * });\n * ```\n */\n\nexport function statusComponent(config: StatusComponentConfig): StatusComponent {\n return new StatusComponent(config);\n}\n\n/**\n * (deprecated in favor of mcpTool.with()) Creates an agent MCP configuration.\n *\n * Agent MCP configurations are used to configure the MCP server for an agent.\n *\n * @param config - Agent MCP configuration\n * @returns An AgentMcpConfig instance\n */\nexport function agentMcp(config: AgentMcpConfig): AgentMcpConfig {\n return {\n server: config.server,\n selectedTools: config.selectedTools,\n headers: config.headers,\n };\n}\n\n/**\n * Creates a function tool that executes user-defined code in a sandboxed environment.\n *\n * Function tools allow users to define custom logic that runs securely in isolated\n * environments. Dependencies are installed automatically in the sandbox.\n *\n * @param config - Function tool configuration\n * @returns A FunctionTool instance\n *\n * @example\n * ```typescript\n * const calculatorTool = functionTool({\n * name: 'calculator',\n * description: 'Performs basic math operations',\n * inputSchema: {\n * type: 'object',\n * properties: {\n * operation: { type: 'string', enum: ['add', 'subtract', 'multiply', 'divide'] },\n * a: { type: 'number' },\n * b: { type: 'number' }\n * },\n * required: ['operation', 'a', 'b']\n * },\n * dependencies: {\n * 'lodash': '^4.17.21'\n * },\n * execute: async (params) => {\n * const { operation, a, b } = params;\n * switch (operation) {\n * case 'add': return { result: a + b };\n * case 'subtract': return { result: a - b };\n * case 'multiply': return { result: a * b };\n * case 'divide': return { result: a / b };\n * default: throw new Error(`Unknown operation: ${operation}`);\n * }\n * }\n * });\n * ```\n */\nexport function functionTool(config: FunctionToolConfig): FunctionTool {\n return new FunctionTool(config);\n}\n","/**\n * Validates that a value is a function\n * @param value - The value to check\n * @param name - The name of the parameter (for error messages)\n * @throws {Error} If the value is not a function\n */\nexport function validateFunction(value: unknown, name: string): void {\n if (typeof value !== 'function') {\n throw new Error(`${name} must be a function`);\n }\n}\n","import type {\n CredentialReferenceApiInsert,\n McpToolSelection,\n ToolPolicy,\n} from '@inkeep/agents-core';\nimport { z } from 'zod';\nimport { SubAgent } from './subAgent';\nimport type { Tool } from './tool';\nimport type { TransferConfig } from './types';\nimport { validateFunction } from './utils/validateFunction';\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * Function signature for tool execution\n * @template TParams - Type of input parameters\n * @template TResult - Type of return value\n */\nexport type ToolExecuteFunction<TParams = unknown, TResult = unknown> = (\n params: TParams\n) => Promise<TResult>;\n\n/**\n * Function signature for transfer conditions\n */\nexport type TransferConditionFunction = (context: unknown) => boolean;\n\n/**\n * Configuration for MCP server builders\n */\nexport interface MCPServerConfig {\n // Basic configuration\n name: string;\n description: string;\n\n // Remote server configuration\n serverUrl: string;\n\n // Optional configuration\n id?: string;\n parameters?: Record<string, z.ZodJSONSchema>;\n credential?: CredentialReferenceApiInsert;\n transport?: 'streamable_http' | 'sse';\n activeTools?: string[];\n headers?: Record<string, string>;\n imageUrl?: string;\n}\n\n/**\n * Configuration for component builders\n */\nexport interface ComponentConfig {\n id?: string;\n name: string;\n description: string;\n}\n\nexport interface ArtifactComponentConfig extends ComponentConfig {\n props: Record<string, unknown> | z.ZodObject<any>;\n}\n\nexport interface DataComponentConfig extends ComponentConfig {\n props: Record<string, unknown> | z.ZodObject<any>;\n render?: {\n component: string;\n mockData: Record<string, unknown>;\n };\n}\n\nexport interface StatusComponentConfig {\n type: string;\n description?: string;\n detailsSchema?: Record<string, unknown> | z.ZodObject<any>;\n}\n\n// ============================================================================\n// Schemas\n// ============================================================================\n\n/**\n * Schema for transfer configuration (excluding function properties)\n */\nexport const TransferConfigSchema = z.object({\n agent: z.instanceof(SubAgent),\n description: z.string().optional(),\n});\n\nexport type AgentMcpConfig = {\n server: Tool;\n selectedTools?: string[];\n headers?: Record<string, string>;\n toolPolicies?: Record<string, ToolPolicy>;\n};\n\n/**\n * Input configuration for MCP tool customization\n * Supports flexible tool selection with per-tool policies\n */\nexport type AgentMcpConfigInput = {\n /**\n * Tools to enable from the MCP server - can be strings or objects with policies\n * - undefined or null: all tools enabled (no filtering)\n * - []: zero tools enabled (explicit empty selection)\n * - ['tool1', 'tool2']: specific tools enabled\n */\n selectedTools?: McpToolSelection[] | null;\n /** Custom headers for MCP server requests */\n headers?: Record<string, string>;\n};\n\n// ============================================================================\n// Transfer Builders\n// ============================================================================\n\n/**\n * Creates a transfer configuration for agent transfers.\n *\n * Transfers allow one agent to hand off control to another agent\n * based on optional conditions.\n *\n * @param targetAgent - The agent to transfer to\n * @param description - Optional description of when/why to transfer\n * @param condition - Optional function to determine if transfer should occur\n * @returns A validated transfer configuration\n *\n * @example\n * ```typescript\n * // Simple transfer\n * const transfer = transfer(supportAgent, 'Transfer to support');\n *\n * // Conditional transfer\n * const conditionalHandoff = transfer(\n * specialistAgent,\n * 'Transfer to specialist for complex issues',\n * (context) => context.complexity > 0.8\n * );\n * ```\n */\nexport function transfer(\n targetAgent: SubAgent,\n description?: string,\n condition?: TransferConditionFunction\n): TransferConfig {\n // Validate function if provided\n if (condition !== undefined) {\n validateFunction(condition, 'condition');\n }\n\n const config: TransferConfig = {\n agent: targetAgent,\n description: description || `Hand off to ${targetAgent.getName()}`,\n condition,\n };\n\n // Validate non-function properties\n TransferConfigSchema.parse({\n agent: config.agent,\n description: config.description,\n });\n\n return config;\n}\n","/**\n * InkeepCredentialProvider - Abstraction for Credential Management\n *\n * This module provides a clean abstraction over credential provider implementations.\n * Cloud customers can use this without needing to know about or install internal\n * dependencies like Nango.\n *\n * @example\n * ```typescript\n * // Simple usage with environment variables (default)\n * import { InkeepCredentialProvider } from '@inkeep/agents-sdk'\n *\n * const credentials = new InkeepCredentialProvider()\n *\n * // With custom configuration\n * const credentials = new InkeepCredentialProvider({\n * type: 'memory',\n * id: 'my-store'\n * })\n * ```\n */\n\n/**\n * Base interface for all credential stores\n * This is a simplified version for SDK customers\n */\nexport interface CredentialStore {\n /** Unique identifier for this credential store */\n readonly id: string;\n /** Type of credential store */\n readonly type: CredentialProviderType;\n /** Get a credential by key */\n get(key: string): Promise<string | null>;\n /** Set a credential */\n set(key: string, value: string, metadata?: Record<string, string>): Promise<void>;\n /** Check if a credential exists */\n has(key: string): Promise<boolean>;\n /** Delete a credential */\n delete(key: string): Promise<boolean>;\n /** Check if the credential store is available */\n checkAvailability(): Promise<{ available: boolean; reason?: string }>;\n}\n\n/**\n * Supported credential provider types\n */\nexport type CredentialProviderType = 'memory' | 'keychain' | 'nango' | 'custom';\n\n/**\n * Configuration for memory-based credential storage\n */\nexport interface MemoryCredentialConfig {\n type: 'memory';\n /** Optional store ID (defaults to 'memory-default') */\n id?: string;\n}\n\n/**\n * Configuration for keychain-based credential storage\n */\nexport interface KeychainCredentialConfig {\n type: 'keychain';\n /** Optional store ID (defaults to 'keychain-default') */\n id?: string;\n /** Optional service name for keychain entries */\n serviceName?: string;\n}\n\n/**\n * Configuration for Nango-based credential storage (OAuth management)\n * Note: Using Nango requires the @nangohq/node package to be installed\n */\nexport interface NangoCredentialConfig {\n type: 'nango';\n /** Optional store ID (defaults to 'nango-default') */\n id?: string;\n /** Nango secret key (defaults to NANGO_SECRET_KEY env var) */\n secretKey?: string;\n /** Nango API URL (defaults to https://api.nango.dev) */\n apiUrl?: string;\n}\n\n/**\n * Configuration for custom credential provider\n */\nexport interface CustomCredentialConfig {\n type: 'custom';\n /** Custom credential store implementation */\n store: CredentialStore;\n}\n\n/**\n * Union type for all credential provider configurations\n */\nexport type CredentialProviderConfig =\n | MemoryCredentialConfig\n | KeychainCredentialConfig\n | NangoCredentialConfig\n | CustomCredentialConfig;\n\n/**\n * Default configuration using memory store\n */\nconst DEFAULT_CONFIG: MemoryCredentialConfig = {\n type: 'memory',\n id: 'memory-default',\n};\n\n/**\n * Simple in-memory credential store implementation\n * Automatically loads from environment variables as fallback\n */\nclass InMemoryStore implements CredentialStore {\n public readonly id: string;\n public readonly type: CredentialProviderType = 'memory';\n private credentials = new Map<string, string>();\n\n constructor(id = 'memory-default') {\n this.id = id;\n }\n\n async get(key: string): Promise<string | null> {\n const credential = this.credentials.get(key);\n if (!credential) {\n // Try loading from environment variables\n const envValue = process.env[key];\n if (envValue) {\n this.credentials.set(key, envValue);\n return envValue;\n }\n return null;\n }\n return credential;\n }\n\n async set(key: string, value: string, _metadata?: Record<string, string>): Promise<void> {\n this.credentials.set(key, value);\n }\n\n async has(key: string): Promise<boolean> {\n return this.credentials.has(key) || !!process.env[key];\n }\n\n async delete(key: string): Promise<boolean> {\n return this.credentials.delete(key);\n }\n\n async checkAvailability(): Promise<{ available: boolean; reason?: string }> {\n return { available: true };\n }\n}\n\n/**\n * InkeepCredentialProvider - Unified credential management for Inkeep SDK\n *\n * Provides a clean abstraction over various credential storage backends.\n * Cloud customers can use simple memory-based storage, while advanced\n * users can integrate with OAuth providers like Nango.\n *\n * @example\n * ```typescript\n * // Default memory-based storage\n * const provider = new InkeepCredentialProvider()\n *\n * // Store and retrieve credentials\n * await provider.set('my-api-key', 'secret-value')\n * const key = await provider.get('my-api-key')\n *\n * // Use environment variables automatically\n * process.env.MY_TOKEN = 'env-token'\n * const token = await provider.get('MY_TOKEN') // Returns 'env-token'\n * ```\n */\nexport class InkeepCredentialProvider implements CredentialStore {\n private store: CredentialStore;\n\n constructor(config: CredentialProviderConfig = DEFAULT_CONFIG) {\n this.store = this.createStore(config);\n }\n\n /**\n * Create the appropriate store based on configuration\n */\n private createStore(config: CredentialProviderConfig): CredentialStore {\n switch (config.type) {\n case 'memory':\n return new InMemoryStore(config.id);\n\n case 'keychain':\n // Keychain requires optional dependency - try to load dynamically\n return this.createKeychainStore(config);\n\n case 'nango':\n // Nango requires optional dependency - try to load dynamically\n return this.createNangoStore(config);\n\n case 'custom':\n return config.store;\n\n default:\n throw new Error(`Unknown credential provider type: ${(config as any).type}`);\n }\n }\n\n /**\n * Create keychain store with dynamic import\n */\n private createKeychainStore(config: KeychainCredentialConfig): CredentialStore {\n // Return a lazy-loading proxy that defers to @inkeep/agents-core when accessed\n const storeId = config.id || 'keychain-default';\n\n return {\n id: storeId,\n type: 'keychain' as CredentialProviderType,\n get: async (key: string) => {\n const { createKeyChainStore } = await import('@inkeep/agents-core/credential-stores');\n const store = createKeyChainStore(storeId);\n return store.get(key);\n },\n set: async (key: string, value: string, metadata?: Record<string, string>) => {\n const { createKeyChainStore } = await import('@inkeep/agents-core/credential-stores');\n const store = createKeyChainStore(storeId);\n return store.set(key, value, metadata);\n },\n has: async (key: string) => {\n const { createKeyChainStore } = await import('@inkeep/agents-core/credential-stores');\n const store = createKeyChainStore(storeId);\n return store.has(key);\n },\n delete: async (key: string) => {\n const { createKeyChainStore } = await import('@inkeep/agents-core/credential-stores');\n const store = createKeyChainStore(storeId);\n return store.delete(key);\n },\n checkAvailability: async () => {\n try {\n const { createKeyChainStore } = await import('@inkeep/agents-core/credential-stores');\n const store = createKeyChainStore(storeId);\n return store.checkAvailability();\n } catch {\n return {\n available: false,\n reason: 'Keychain store requires keytar package to be installed',\n };\n }\n },\n };\n }\n\n /**\n * Create Nango store with dynamic import\n */\n private createNangoStore(config: NangoCredentialConfig): CredentialStore {\n // Return a lazy-loading proxy that defers to @inkeep/agents-core when accessed\n const storeId = config.id || 'nango-default';\n const secretKey = config.secretKey;\n const apiUrl = config.apiUrl;\n\n return {\n id: storeId,\n type: 'nango' as CredentialProviderType,\n get: async (key: string) => {\n const { createNangoCredentialStore } = await import(\n '@inkeep/agents-core/credential-stores'\n );\n const store = createNangoCredentialStore(storeId, { secretKey, apiUrl });\n return store.get(key);\n },\n set: async (key: string, value: string, metadata?: Record<string, string>) => {\n const { createNangoCredentialStore } = await import(\n '@inkeep/agents-core/credential-stores'\n );\n const store = createNangoCredentialStore(storeId, { secretKey, apiUrl });\n return store.set(key, value, metadata);\n },\n has: async (key: string) => {\n const { createNangoCredentialStore } = await import(\n '@inkeep/agents-core/credential-stores'\n );\n const store = createNangoCredentialStore(storeId, { secretKey, apiUrl });\n return store.has(key);\n },\n delete: async (key: string) => {\n const { createNangoCredentialStore } = await import(\n '@inkeep/agents-core/credential-stores'\n );\n const store = createNangoCredentialStore(storeId, { secretKey, apiUrl });\n return store.delete(key);\n },\n checkAvailability: async () => {\n try {\n const { createNangoCredentialStore } = await import(\n '@inkeep/agents-core/credential-stores'\n );\n const store = createNangoCredentialStore(storeId, { secretKey, apiUrl });\n return store.checkAvailability();\n } catch (error) {\n return {\n available: false,\n reason:\n error instanceof Error\n ? error.message\n : 'Nango store requires @nangohq/node package and NANGO_SECRET_KEY',\n };\n }\n },\n };\n }\n\n // Implement CredentialStore interface by delegating to internal store\n\n get id(): string {\n return this.store.id;\n }\n\n get type(): CredentialProviderType {\n return this.store.type;\n }\n\n /**\n * Get a credential by key\n * @param key - The credential key\n * @returns The credential value or null if not found\n */\n async get(key: string): Promise<string | null> {\n return this.store.get(key);\n }\n\n /**\n * Set a credential\n * @param key - The credential key\n * @param value - The credential value\n * @param metadata - Optional metadata\n */\n async set(key: string, value: string, metadata?: Record<string, string>): Promise<void> {\n return this.store.set(key, value, metadata);\n }\n\n /**\n * Check if a credential exists\n * @param key - The credential key\n * @returns True if the credential exists\n */\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n /**\n * Delete a credential\n * @param key - The credential key\n * @returns True if the credential was deleted\n */\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n /**\n * Check if the credential store is available and functional\n * @returns Availability status\n */\n async checkAvailability(): Promise<{ available: boolean; reason?: string }> {\n return this.store.checkAvailability();\n }\n\n /**\n * Get the underlying store (for advanced use cases)\n */\n getStore(): CredentialStore {\n return this.store;\n }\n}\n\n/**\n * Factory function to create an InkeepCredentialProvider\n * @param config - Configuration options\n * @returns A new InkeepCredentialProvider instance\n */\nexport function createCredentialProvider(\n config: CredentialProviderConfig = DEFAULT_CONFIG\n): InkeepCredentialProvider {\n return new InkeepCredentialProvider(config);\n}\n","/**\n * Credential Reference System\n *\n * This module provides a way to reference credentials by ID without including\n * the full credential definition in the code. Credentials are resolved from\n * environment files at runtime during the push operation.\n */\n\n/**\n * Represents a reference to a credential by its ID.\n * The actual credential will be resolved from the environment file at push time.\n */\nexport interface CredentialReference {\n __type: 'credential-ref';\n id: string;\n}\n\n/**\n * Create a reference to a credential by its ID.\n * The credential must be defined in the environment files.\n *\n * @param id - The ID of the credential to reference\n * @returns A credential reference that will be resolved at push time\n *\n * @example\n * ```typescript\n * const apiKeyRef = credentialRef('api-key');\n *\n * const fetchDef = fetchDefinition({\n * credential: apiKeyRef,\n * // ...\n * });\n * ```\n */\nexport function credentialRef<T extends string = string>(id: T): CredentialReference {\n return {\n __type: 'credential-ref',\n id,\n };\n}\n\n/**\n * Type guard to check if a value is a credential reference\n */\nexport function isCredentialReference(value: any): value is CredentialReference {\n return value && typeof value === 'object' && value.__type === 'credential-ref';\n}\n\n/**\n * Type helper to extract credential IDs from environment configuration\n */\nexport type ExtractCredentialIds<T> = T extends {\n credentials?: infer C;\n}\n ? C extends Record<string, any>\n ? keyof C\n : never\n : never;\n\n/**\n * Type helper to create a union of all available credential IDs from multiple environments\n */\nexport type UnionCredentialIds<T extends Record<string, any>> = {\n [K in keyof T]: ExtractCredentialIds<T[K]>;\n}[keyof T];\n\n/**\n * Type helper to extract tool IDs from environment configuration\n */\nexport type ExtractMcpServerIds<T> = T extends {\n mcpServers?: infer T;\n}\n ? T extends Record<string, any>\n ? keyof T\n : never\n : never;\n\n/**\n * Type helper to create a union of all available tool IDs from multiple environments\n */\nexport type UnionMcpServerIds<T extends Record<string, any>> = {\n [K in keyof T]: ExtractMcpServerIds<T[K]>;\n}[keyof T];\n","// Environment settings system for environment-agnostic entities management\n\nimport type { CredentialReferenceApiInsert } from '@inkeep/agents-core';\nimport type { UnionCredentialIds, UnionMcpServerIds } from './credential-ref';\nimport type { Tool } from './tool';\n\ninterface EnvironmentSettingsConfig {\n credentials?: {\n [settingId: string]: CredentialReferenceApiInsert;\n };\n mcpServers?: {\n [mcpServerId: string]: Tool;\n };\n}\n\n/**\n * Create a setting helper with TypeScript autocomplete\n */\nexport function createEnvironmentSettings<T extends Record<string, EnvironmentSettingsConfig>>(\n environments: T\n) {\n // Simple type to extract credential keys for autocomplete\n type CredentialKeys = UnionCredentialIds<T>;\n type McpServerKeys = UnionMcpServerIds<T>;\n\n return {\n getEnvironmentCredential: (key: CredentialKeys): CredentialReferenceApiInsert => {\n const currentEnv = process.env.INKEEP_ENV || 'development';\n const env = environments[currentEnv];\n\n if (!env) {\n throw new Error(\n `Environment '${currentEnv}' not found. Available: ${Object.keys(environments).join(', ')}`\n );\n }\n\n const credential = env.credentials?.[key as string];\n if (!credential) {\n throw new Error(`Credential '${String(key)}' not found in environment '${currentEnv}'`);\n }\n\n return credential;\n },\n\n getEnvironmentMcp: (key: McpServerKeys): Tool => {\n const currentEnv = process.env.INKEEP_ENV || 'development';\n const env = environments[currentEnv];\n\n if (!env) {\n throw new Error(\n `Environment '${currentEnv}' not found. Available: ${Object.keys(environments).join(', ')}`\n );\n }\n\n const mcpServer = env.mcpServers?.[key as string];\n if (!mcpServer) {\n throw new Error(`MCP Server '${String(key)}' not found in environment '${currentEnv}'`);\n }\n\n return mcpServer;\n },\n\n //Deprecated: Use getEnvironmentCredential instead\n getEnvironmentSetting: (key: CredentialKeys): CredentialReferenceApiInsert => {\n const currentEnv = process.env.INKEEP_ENV || 'development';\n const env = environments[currentEnv];\n\n if (!env) {\n throw new Error(\n `Environment '${currentEnv}' not found. Available: ${Object.keys(environments).join(', ')}`\n );\n }\n\n const credential = env.credentials?.[key as string];\n if (!credential) {\n throw new Error(`Credential '${String(key)}' not found in environment '${currentEnv}'`);\n }\n\n return credential;\n },\n };\n}\n\n/**\n * Create type-safe environment configurations\n */\nexport function registerEnvironmentSettings<T extends EnvironmentSettingsConfig>(config: T): T {\n return config;\n}\n\n// Re-export type helpers for convenience\nexport type {\n ExtractCredentialIds,\n ExtractMcpServerIds,\n UnionCredentialIds,\n UnionMcpServerIds,\n} from './credential-ref';\n","import type { CredentialReferenceApiInsert } from '@inkeep/agents-core';\nimport { getLogger } from '@inkeep/agents-core';\nimport type { ExternalAgentInterface, subAgentExternalAgentInterface } from './types';\n\nconst logger = getLogger('external-agent-builder');\n\nexport type ExternalAgentConfig = {\n type?: 'external'; // Discriminator for external agents\n id: string;\n name: string;\n description: string;\n baseUrl: string;\n credentialReference?: CredentialReferenceApiInsert;\n};\n\nexport class ExternalAgent implements ExternalAgentInterface {\n public config: ExternalAgentConfig;\n public readonly type = 'external' as const;\n private initialized = false;\n private tenantId: string;\n private projectId: string;\n private baseURL: string;\n\n constructor(config: ExternalAgentConfig) {\n this.config = { ...config, type: 'external' };\n // tenantId will be set by setContext method from external source\n this.tenantId = 'default';\n this.projectId = 'default';\n this.baseURL = this.config.baseUrl;\n\n logger.debug(\n {\n externalAgentName: this.config.name,\n baseUrl: this.config.baseUrl,\n tenantId: this.tenantId,\n },\n 'External Agent constructor initialized'\n );\n }\n\n /**\n * Initialize the external agent by upserting it in the database\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Always attempt to upsert the external agent\n await this.upsertExternalAgent();\n\n logger.info(\n {\n externalSubAgentId: this.getId(),\n },\n 'External agent initialized successfully'\n );\n\n this.initialized = true;\n } catch (error) {\n logger.error(\n {\n externalSubAgentId: this.getId(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Failed to initialize external agent'\n );\n throw error;\n }\n }\n\n // Set context (tenantId and baseURL) from external source (agent, CLI, etc)\n setContext(tenantId: string, projectId: string): void {\n this.tenantId = tenantId;\n this.projectId = projectId;\n }\n\n // Compute ID from name using a simple slug transformation\n getId(): string {\n return this.config.id;\n }\n\n with(options: { headers?: Record<string, string> }): subAgentExternalAgentInterface {\n return {\n externalAgent: this,\n headers: options.headers,\n };\n }\n\n // Private method to upsert external agent (create or update)\n private async upsertExternalAgent(): Promise<void> {\n const externalAgentData = {\n id: this.getId(),\n name: this.config.name,\n description: this.config.description,\n baseUrl: this.config.baseUrl,\n credentialReferenceId: this.config.credentialReference?.id || undefined,\n };\n\n // First try to update (in case external agent exists)\n const updateResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/external-agents/${this.getId()}`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(externalAgentData),\n }\n );\n\n if (updateResponse.ok) {\n logger.info(\n {\n externalSubAgentId: this.getId(),\n },\n 'External agent updated successfully'\n );\n return;\n }\n\n // If update failed with 404, external agent doesn't exist - create it\n if (updateResponse.status === 404) {\n logger.info(\n {\n externalSubAgentId: this.getId(),\n },\n 'External agent not found, creating new external agent'\n );\n\n const createResponse = await fetch(\n `${this.baseURL}/tenants/${this.tenantId}/projects/${this.projectId}/external-agents`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(externalAgentData),\n }\n );\n\n if (!createResponse.ok) {\n const errorText = await createResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to create external agent: ${createResponse.status} ${createResponse.statusText} - ${errorText}`\n );\n }\n\n logger.info(\n {\n externalSubAgentId: this.getId(),\n },\n 'External agent created successfully'\n );\n return;\n }\n\n // Update failed for some other reason\n const errorText = await updateResponse.text().catch(() => 'Unknown error');\n throw new Error(\n `Failed to update external agent: ${updateResponse.status} ${updateResponse.statusText} - ${errorText}`\n );\n }\n\n /**\n * Get the external agent configuration\n */\n getConfig(): ExternalAgentConfig {\n return { ...this.config };\n }\n\n /**\n * Get the external agent name\n */\n getName(): string {\n return this.config.name;\n }\n\n /**\n * Get the external agent base URL\n */\n getBaseUrl(): string {\n return this.config.baseUrl;\n }\n\n /**\n * Get the tenant ID\n */\n getTenantId(): string {\n return this.tenantId;\n }\n\n getDescription(): string {\n return this.config.description || '';\n }\n\n getCredentialReferenceId(): string | undefined {\n return this.config.credentialReference?.id || undefined;\n }\n\n getCredentialReference(): CredentialReferenceApiInsert | undefined {\n return this.config.credentialReference || undefined;\n }\n}\n\n/**\n * Factory function to create external agents - follows the same pattern as agent()\n */\nexport function externalAgent(config: ExternalAgentConfig): ExternalAgent {\n return new ExternalAgent(config);\n}\n\n/**\n * Helper function to create multiple external agents\n */\nexport function externalAgents(\n configs: Record<string, ExternalAgentConfig>\n): Record<string, ExternalAgent> {\n const builders: Record<string, ExternalAgent> = {};\n\n for (const [name, config] of Object.entries(configs)) {\n builders[name] = externalAgent(config);\n }\n\n return builders;\n}\n\n/**\n * Helper to batch initialize external agents\n */\nexport async function initializeExternalAgents(builders: ExternalAgent[]): Promise<void> {\n logger.info({ count: builders.length }, 'Batch initializing external agents');\n\n const initPromises = builders.map(async (builder) => {\n return await builder.init();\n });\n\n try {\n await Promise.all(initPromises);\n\n logger.info({ count: builders.length }, 'All external agents initialized successfully');\n } catch (error) {\n logger.error(\n { error: error instanceof Error ? error.message : 'Unknown error' },\n 'Failed to initialize some external agents'\n );\n throw error;\n }\n}\n","import type {\n AgentConversationHistoryConfig,\n AgentStopWhen,\n ArtifactComponentApiInsert,\n CredentialReferenceApiInsert,\n DataComponentApiInsert,\n FullAgentDefinition,\n McpTransportConfig,\n ModelSettings,\n StatusUpdateSettings,\n SubAgentApiInsert,\n ToolInsert,\n ToolPolicy,\n} from '@inkeep/agents-core';\nimport type { z } from 'zod';\nimport type { ArtifactComponentInterface } from './artifact-component';\nimport type { AgentMcpConfig as SubAgentMcpConfig } from './builders';\nimport type { DataComponentInterface } from './data-component';\nimport type { ExternalAgentConfig } from './external-agent';\nimport type { FunctionTool } from './function-tool';\nimport type { Tool } from './tool';\n\nexport interface ArtifactComponentWithZodProps {\n id: string;\n name: string;\n description: string;\n props?: z.ZodObject<any>;\n}\n\nexport interface DataComponentWithZodProps {\n id: string;\n name: string;\n description: string;\n props?: z.ZodObject<any>;\n}\nexport type { ModelSettings };\n\n/**\n * Tool instance that may have additional metadata attached during agent processing\n */\nexport type AgentTool =\n | (Tool & {\n selectedTools?: string[];\n headers?: Record<string, string>;\n toolPolicies?: Record<string, ToolPolicy>;\n })\n | (FunctionTool & {\n selectedTools?: string[];\n headers?: Record<string, string>;\n toolPolicies?: Record<string, ToolPolicy>;\n });\n\n// Core message types following OpenAI pattern\nexport interface UserMessage {\n role: 'user';\n content: string;\n}\n\nexport interface AssistantMessage {\n role: 'assistant';\n content: string;\n toolCalls?: ToolCall[];\n}\n\nexport interface ToolMessage {\n role: 'tool';\n content: string;\n toolCallId: string;\n}\n\nexport interface SystemMessage {\n role: 'system';\n content: string;\n}\n\nexport type Message = UserMessage | AssistantMessage | ToolMessage | SystemMessage;\n\nexport type MessageInput = string | string[] | Message | Message[];\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ToolResult {\n id: string;\n result: any;\n error?: string;\n}\nexport type AllDelegateInputInterface =\n | SubAgentInterface\n | subAgentExternalAgentInterface\n | ExternalAgentInterface\n | AgentInterface\n | subAgentTeamAgentInterface;\n\nexport type AllDelegateOutputInterface =\n | SubAgentInterface\n | subAgentExternalAgentInterface\n | subAgentTeamAgentInterface;\n\nexport type SubAgentCanUseType = Tool | SubAgentMcpConfig | FunctionTool;\n\nexport interface SubAgentConfig extends Omit<SubAgentApiInsert, 'projectId'> {\n type?: 'internal'; // Discriminator for internal agents\n canUse?: () => SubAgentCanUseType[];\n canTransferTo?: () => SubAgentInterface[];\n canDelegateTo?: () => AllDelegateInputInterface[];\n dataComponents?: () => (\n | DataComponentApiInsert\n | DataComponentInterface\n | DataComponentWithZodProps\n )[];\n artifactComponents?: () => (\n | ArtifactComponentApiInsert\n | ArtifactComponentInterface\n | ArtifactComponentWithZodProps\n )[];\n conversationHistoryConfig?: AgentConversationHistoryConfig;\n}\n\nexport interface ToolConfig extends ToolInsert {\n execute: (params: any) => Promise<any>;\n parameters?: Record<string, any>;\n schema?: z.ZodJSONSchema;\n}\n\nexport interface ServerConfig {\n type: string;\n version?: string;\n}\n\nexport interface MCPToolConfig {\n id: string;\n name: string;\n tenantId?: string;\n description?: string;\n credential?: CredentialReferenceApiInsert;\n server?: ServerConfig;\n serverUrl: string;\n toolName?: string;\n activeTools?: string[];\n headers?: Record<string, string>;\n mcpType?: 'nango' | 'generic';\n transport?: McpTransportConfig;\n imageUrl?: string; // Optional image URL for custom tool icon\n}\n\nexport interface FetchDefinitionConfig {\n id: string;\n name?: string;\n trigger: 'initialization' | 'invocation';\n url: string;\n method?: string;\n headers?: Record<string, string>;\n body?: Record<string, unknown>;\n transform?: string;\n responseSchema?: z.ZodSchema<any>;\n defaultValue?: unknown;\n timeout?: number;\n credential?: CredentialReferenceApiInsert;\n}\n\nexport type { FunctionToolConfig } from '@inkeep/agents-core';\n\nexport interface RequestSchemaDefinition {\n body?: z.ZodSchema<any>;\n headers?: z.ZodSchema<any>;\n query?: z.ZodSchema<any>;\n params?: z.ZodSchema<any>;\n}\n\nexport interface RequestSchemaConfig {\n schemas: RequestSchemaDefinition;\n optional?: ('body' | 'headers' | 'query' | 'params')[];\n}\n\nexport interface TransferConfig {\n agent: SubAgentInterface;\n description?: string;\n condition?: (context: any) => boolean;\n}\n\nexport interface GenerateOptions {\n maxTurns?: number;\n maxSteps?: number;\n temperature?: number;\n toolChoice?: 'auto' | 'none' | string;\n resourceId?: string;\n conversationId?: string;\n stream?: boolean;\n customBodyParams?: Record<string, unknown>;\n}\n\nexport interface AgentResponse {\n id?: string;\n text: string;\n toolCalls?: ToolCall[];\n transfer?: TransferConfig;\n finishReason: 'completed' | 'tool_calls' | 'transfer' | 'max_turns' | 'error';\n usage?: {\n inputTokens: number;\n outputTokens: number;\n totalTokens?: number;\n };\n metadata?: Record<string, any>;\n}\n\nexport interface StreamResponse {\n textStream?: AsyncGenerator<string>;\n eventStream?: AsyncGenerator<StreamEvent>;\n}\n\nexport interface StreamEvent {\n type: 'text' | 'tool_call' | 'transfer' | 'error' | 'done';\n data: any;\n timestamp: Date;\n}\n\nexport interface RunResult {\n finalOutput: string;\n agent: SubAgentInterface;\n turnCount: number;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n totalTokens?: number;\n };\n metadata?: {\n toolCalls: ToolCall[];\n transfers: TransferConfig[];\n };\n}\n\nexport interface AgentConfig {\n id: string;\n name?: string;\n description?: string;\n defaultSubAgent: SubAgentInterface;\n subAgents?: () => SubAgentInterface[];\n contextConfig?: any;\n credentials?: () => CredentialReferenceApiInsert[];\n stopWhen?: AgentStopWhen;\n prompt?: string;\n models?: {\n base?: ModelSettings;\n structuredOutput?: ModelSettings;\n summarizer?: ModelSettings;\n };\n statusUpdates?: StatusUpdateSettings;\n}\n\nexport class AgentError extends Error {\n constructor(\n message: string,\n public code?: string,\n public details?: any\n ) {\n super(message);\n this.name = 'AgentError';\n }\n}\n\nexport class MaxTurnsExceededError extends AgentError {\n constructor(maxTurns: number) {\n super(`Maximum turns (${maxTurns}) exceeded`);\n this.code = 'MAX_TURNS_EXCEEDED';\n }\n}\n\nexport class ToolExecutionError extends AgentError {\n constructor(toolName: string, originalError: Error) {\n super(`Tool '${toolName}' execution failed: ${originalError.message}`);\n this.code = 'TOOL_EXECUTION_ERROR';\n this.details = { toolName, originalError };\n }\n}\n\nexport class TransferError extends AgentError {\n constructor(sourceAgent: string, targetAgent: string, reason: string) {\n super(`Transfer from '${sourceAgent}' to '${targetAgent}' failed: ${reason}`);\n this.code = 'TRANSFER_ERROR';\n this.details = { sourceAgent, targetAgent, reason };\n }\n}\n\nexport interface SubAgentInterface {\n config: SubAgentConfig;\n type: 'internal';\n init(): Promise<void>;\n getId(): string;\n getName(): string;\n getDescription(): string;\n getInstructions(): string;\n getTools(): Record<string, AgentTool>;\n getTransfers(): SubAgentInterface[];\n getDelegates(): AllDelegateOutputInterface[];\n getSubAgentDelegates(): SubAgentInterface[];\n getExternalAgentDelegates(): subAgentExternalAgentInterface[];\n getDataComponents(): DataComponentApiInsert[];\n getArtifactComponents(): ArtifactComponentApiInsert[];\n setContext(tenantId: string, projectId: string, baseURL?: string): void;\n addTool(name: string, tool: any): void;\n addTransfer(...agents: SubAgentInterface[]): void;\n addDelegate(...agents: AllDelegateInputInterface[]): void;\n}\n\nexport interface ExternalAgentInterface {\n config: ExternalAgentConfig;\n type: 'external';\n init(): Promise<void>;\n getId(): string;\n getName(): string;\n getDescription(): string;\n getBaseUrl(): string;\n setContext?(tenantId: string, projectId: string): void;\n with(options: { headers?: Record<string, string> }): subAgentExternalAgentInterface;\n getCredentialReferenceId(): string | undefined;\n getCredentialReference(): CredentialReferenceApiInsert | undefined;\n}\n\nexport type subAgentExternalAgentInterface = {\n externalAgent: ExternalAgentInterface;\n headers?: Record<string, string>;\n};\n\nexport type subAgentTeamAgentInterface = {\n agent: AgentInterface;\n headers?: Record<string, string>;\n};\n\nexport interface AgentInterface {\n init(): Promise<void>;\n setConfig(tenantId: string, projectId: string, apiUrl: string): void;\n getId(): string;\n getName(): string;\n getDescription(): string | undefined;\n getTenantId(): string;\n generate(input: MessageInput, options?: GenerateOptions): Promise<string>;\n stream(input: MessageInput, options?: GenerateOptions): Promise<StreamResponse>;\n generateStream(input: MessageInput, options?: GenerateOptions): Promise<StreamResponse>;\n getDefaultSubAgent(): SubAgentInterface | undefined;\n getSubAgent(name: string): SubAgentInterface | undefined;\n getSubAgents(): SubAgentInterface[];\n toFullAgentDefinition(): Promise<FullAgentDefinition>;\n with(options: { headers?: Record<string, string> }): subAgentTeamAgentInterface;\n}\n\nexport interface BuilderToolConfig {\n name: string;\n description: string;\n config: {\n type: 'mcp';\n mcp: {\n server: {\n url: string;\n };\n };\n };\n parameters?: Record<string, any>;\n}\n\nexport interface BuilderRelationConfig {\n targetAgent: string;\n relationType: 'transfer' | 'delegate';\n}\n\nexport interface BuilderAgentConfig {\n name: string;\n description: string;\n instructions: string;\n tools: BuilderToolConfig[];\n relations?: BuilderRelationConfig[];\n}\n","import { getLogger } from '@inkeep/agents-core';\nimport type {\n AgentInterface,\n GenerateOptions,\n Message,\n MessageInput,\n RunResult,\n StreamResponse,\n SubAgentInterface,\n ToolCall,\n} from './types';\nimport { MaxTurnsExceededError } from './types';\n\nconst logger = getLogger('runner');\n\nexport class Runner {\n /**\n * Run an agent until completion, handling transfers and tool calls\n * Similar to OpenAI's Runner.run() pattern\n * NOTE: This now requires an agent instead of an agent\n */\n static async run(\n agent: AgentInterface,\n messages: MessageInput,\n options?: GenerateOptions\n ): Promise<RunResult> {\n const maxTurns = options?.maxTurns || 10;\n let turnCount = 0;\n const messageHistory = Runner.normalizeToMessageHistory(messages);\n const allToolCalls: ToolCall[] = [];\n const _allTransfers: Array<{ from: string; to: string; reason?: string }> = [];\n\n logger.info(\n {\n agentId: agent.getId(),\n defaultSubAgent: agent.getDefaultSubAgent()?.getName(),\n maxTurns,\n initialMessageCount: messageHistory.length,\n },\n 'Starting agent run'\n );\n\n while (turnCount < maxTurns) {\n logger.debug(\n {\n agentId: agent.getId(),\n turnCount,\n messageHistoryLength: messageHistory.length,\n },\n 'Starting turn'\n );\n\n // Use agent.generate to handle agent orchestration\n const response = await agent.generate(messageHistory, options);\n turnCount++;\n\n // Since agent.generate returns a string (the final response),\n // we need to treat this as a completed generation\n logger.info(\n {\n agentId: agent.getId(),\n turnCount,\n responseLength: response.length,\n },\n 'Agent generation completed'\n );\n\n // Return the result wrapped in RunResult format\n return {\n finalOutput: response,\n agent: agent.getDefaultSubAgent() || ({} as SubAgentInterface),\n turnCount,\n usage: { inputTokens: 0, outputTokens: 0 },\n metadata: {\n toolCalls: allToolCalls,\n transfers: [], // Agent handles transfers internally\n },\n };\n }\n\n // Max turns exceeded\n logger.error(\n {\n agentId: agent.getId(),\n maxTurns,\n finalTurnCount: turnCount,\n },\n 'Maximum turns exceeded'\n );\n\n throw new MaxTurnsExceededError(maxTurns);\n }\n\n /**\n * Stream an agent's response\n */\n static async stream(\n agent: AgentInterface,\n messages: MessageInput,\n options?: GenerateOptions\n ): Promise<StreamResponse> {\n logger.info(\n {\n agentId: agent.getId(),\n defaultSubAgent: agent.getDefaultSubAgent()?.getName(),\n },\n 'Starting agent stream'\n );\n\n // Delegate to agent's stream method\n return agent.stream(messages, options);\n }\n\n /**\n * Execute multiple agent in parallel and return the first successful result\n */\n static async raceAgents(\n agent: AgentInterface[],\n messages: MessageInput,\n options?: GenerateOptions\n ): Promise<RunResult> {\n if (agent.length === 0) {\n throw new Error('No agent provided for race');\n }\n\n logger.info(\n {\n agentCount: agent.length,\n agentIds: agent.map((g) => g.getId()),\n },\n 'Starting agent race'\n );\n\n const promises = agent.map(async (agent, index) => {\n try {\n const result = await Runner.run(agent, messages, options);\n return { ...result, raceIndex: index };\n } catch (error) {\n logger.error(\n {\n agentId: agent.getId(),\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n 'Agent failed in race'\n );\n throw error;\n }\n });\n\n const result = await Promise.race(promises);\n\n logger.info(\n {\n winningAgentId: (result as any).agentId || 'unknown',\n raceIndex: (result as any).raceIndex,\n },\n 'Agent race completed'\n );\n\n return result;\n }\n\n // Private helper methods\n private static normalizeToMessageHistory(messages: MessageInput): Message[] {\n if (typeof messages === 'string') {\n return [{ role: 'user', content: messages }];\n }\n if (Array.isArray(messages)) {\n return messages.map((msg) =>\n typeof msg === 'string' ? { role: 'user', content: msg } : msg\n );\n }\n return [messages];\n }\n\n /**\n * Validate agent configuration before running\n */\n static validateAgent(agent: AgentInterface): {\n valid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (!agent.getId()) {\n errors.push('Agent ID is required');\n }\n\n const defaultSubAgent = agent.getDefaultSubAgent();\n if (!defaultSubAgent) {\n errors.push('Default agent is required');\n } else {\n if (!defaultSubAgent.getName()) {\n errors.push('Default agent name is required');\n }\n }\n\n // Validate all agents in the agent\n const subAgents = agent.getSubAgents();\n if (subAgents.length === 0) {\n errors.push('Agent must contain at least one subagent');\n }\n\n for (const subAgent of subAgents) {\n if (!subAgent.getName()) {\n errors.push(`Agent missing name`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get execution statistics for an agent\n */\n static async getExecutionStats(\n agent: AgentInterface,\n messages: MessageInput,\n options?: GenerateOptions\n ): Promise<{\n estimatedTurns: number;\n estimatedTokens: number;\n subAgentCount: number;\n defaultSubAgent: string | undefined;\n }> {\n const subAgents = agent.getSubAgents();\n const defaultSubAgent = agent.getDefaultSubAgent();\n const messageCount = Array.isArray(messages) ? messages.length : 1;\n\n return {\n estimatedTurns: Math.min(Math.max(messageCount, 1), options?.maxTurns || 10),\n estimatedTokens: messageCount * 100, // Rough estimate\n subAgentCount: subAgents.length,\n defaultSubAgent: defaultSubAgent?.getName(),\n };\n }\n}\n\n// Export convenience functions that match OpenAI's pattern\nexport const run = Runner.run.bind(Runner);\nexport const stream = Runner.stream.bind(Runner);\nexport const raceAgents = Runner.raceAgents.bind(Runner);\n","/**\n * TelemetryProvider - Abstraction for Telemetry/Observability\n *\n * This module provides a clean abstraction over telemetry implementations.\n * Cloud customers can use this without needing to install or configure\n * OpenTelemetry or Signoz directly.\n *\n * Telemetry is OPT-IN - if not configured, a no-op provider is used.\n *\n * @example\n * ```typescript\n * // Opt-in to telemetry with default console logger\n * import { InkeepTelemetryProvider, createConsoleTelemetryProvider } from '@inkeep/agents-sdk'\n *\n * const telemetry = createConsoleTelemetryProvider()\n *\n * // Or with OpenTelemetry (requires @opentelemetry packages)\n * const telemetry = createOpenTelemetryProvider({\n * serviceName: 'my-agent',\n * endpoint: 'http://localhost:4318'\n * })\n * ```\n */\n\n/**\n * Span status codes\n */\nexport const SpanStatus = {\n OK: 'ok',\n ERROR: 'error',\n UNSET: 'unset',\n} as const;\n\nexport type SpanStatusType = (typeof SpanStatus)[keyof typeof SpanStatus];\n\n/**\n * Span interface for tracing\n */\nexport interface TelemetrySpan {\n /** Set span attributes */\n setAttributes(attributes: Record<string, unknown>): TelemetrySpan;\n /** Set a single attribute */\n setAttribute(key: string, value: unknown): TelemetrySpan;\n /** Record an exception */\n recordException(error: Error): TelemetrySpan;\n /** Set span status */\n setStatus(status: SpanStatusType, message?: string): TelemetrySpan;\n /** Add an event to the span */\n addEvent(name: string, attributes?: Record<string, unknown>): TelemetrySpan;\n /** End the span */\n end(): void;\n /** Check if span is recording */\n isRecording(): boolean;\n /** Update span name */\n updateName(name: string): TelemetrySpan;\n}\n\n/**\n * Span options\n */\nexport interface SpanOptions {\n /** Span attributes */\n attributes?: Record<string, unknown>;\n /** Parent span (for context propagation) */\n parent?: TelemetrySpan;\n}\n\n/**\n * Tracer interface for creating spans\n */\nexport interface TelemetryTracer {\n /** Start a new active span and execute callback */\n startActiveSpan<T>(name: string, fn: (span: TelemetrySpan) => T): T;\n startActiveSpan<T>(name: string, options: SpanOptions, fn: (span: TelemetrySpan) => T): T;\n /** Start a new span without making it active */\n startSpan(name: string, options?: SpanOptions): TelemetrySpan;\n}\n\n/**\n * Logger interface for structured logging\n */\nexport interface TelemetryLogger {\n debug(message: string, context?: Record<string, unknown>): void;\n info(message: string, context?: Record<string, unknown>): void;\n warn(message: string, context?: Record<string, unknown>): void;\n error(message: string, context?: Record<string, unknown>): void;\n}\n\n/**\n * Metrics interface for recording measurements\n */\nexport interface TelemetryMetrics {\n /** Increment a counter */\n increment(name: string, value?: number, attributes?: Record<string, unknown>): void;\n /** Record a gauge value */\n gauge(name: string, value: number, attributes?: Record<string, unknown>): void;\n /** Record a histogram value */\n histogram(name: string, value: number, attributes?: Record<string, unknown>): void;\n}\n\n/**\n * Main telemetry provider interface\n */\nexport interface TelemetryProvider {\n /** Get a tracer for creating spans */\n getTracer(name: string, version?: string): TelemetryTracer;\n /** Get a logger for structured logging */\n getLogger(name: string): TelemetryLogger;\n /** Get metrics for recording measurements */\n getMetrics(name: string): TelemetryMetrics;\n /** Shutdown the telemetry provider */\n shutdown(): Promise<void>;\n /** Check if telemetry is enabled */\n isEnabled(): boolean;\n}\n\n/**\n * Configuration for telemetry provider\n */\nexport interface TelemetryConfig {\n /** Whether telemetry is enabled (default: false) */\n enabled?: boolean;\n /** Service name for identifying the source */\n serviceName?: string;\n /** Service version */\n serviceVersion?: string;\n /** Custom provider implementation */\n provider?: TelemetryProvider;\n}\n\n// ============================================================================\n// No-op implementations (default when telemetry is disabled)\n// ============================================================================\n\n/**\n * No-op span implementation\n */\nconst createNoOpSpan = (): TelemetrySpan => ({\n setAttributes: function () {\n return this;\n },\n setAttribute: function () {\n return this;\n },\n recordException: function () {\n return this;\n },\n setStatus: function () {\n return this;\n },\n addEvent: function () {\n return this;\n },\n end: () => {},\n isRecording: () => false,\n updateName: function () {\n return this;\n },\n});\n\n/**\n * No-op tracer implementation\n */\nconst createNoOpTracer = (): TelemetryTracer => ({\n startActiveSpan<T>(\n _name: string,\n arg1: SpanOptions | ((span: TelemetrySpan) => T),\n arg2?: (span: TelemetrySpan) => T\n ): T {\n const fn = typeof arg1 === 'function' ? arg1 : arg2;\n if (!fn) throw new Error('No callback function provided');\n return fn(createNoOpSpan());\n },\n startSpan(_name: string, _options?: SpanOptions): TelemetrySpan {\n return createNoOpSpan();\n },\n});\n\n/**\n * No-op logger implementation\n */\nconst createNoOpLogger = (): TelemetryLogger => ({\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n});\n\n/**\n * No-op metrics implementation\n */\nconst createNoOpMetrics = (): TelemetryMetrics => ({\n increment: () => {},\n gauge: () => {},\n histogram: () => {},\n});\n\n/**\n * No-op telemetry provider (default)\n */\nexport class NoOpTelemetryProvider implements TelemetryProvider {\n getTracer(_name: string, _version?: string): TelemetryTracer {\n return createNoOpTracer();\n }\n\n getLogger(_name: string): TelemetryLogger {\n return createNoOpLogger();\n }\n\n getMetrics(_name: string): TelemetryMetrics {\n return createNoOpMetrics();\n }\n\n async shutdown(): Promise<void> {\n // No-op\n }\n\n isEnabled(): boolean {\n return false;\n }\n}\n\n// ============================================================================\n// Console telemetry provider (simple logging-based telemetry)\n// ============================================================================\n\n/**\n * Console-based telemetry provider for development/debugging\n */\nexport class ConsoleTelemetryProvider implements TelemetryProvider {\n private serviceName: string;\n\n constructor(serviceName = 'inkeep-agent') {\n this.serviceName = serviceName;\n }\n\n getTracer(name: string, _version?: string): TelemetryTracer {\n const serviceName = this.serviceName;\n\n const createConsoleSpan = (spanName: string): TelemetrySpan => {\n const startTime = Date.now();\n const attributes: Record<string, unknown> = {};\n const events: Array<{ name: string; attributes?: Record<string, unknown> }> = [];\n\n return {\n setAttributes: function (attrs: Record<string, unknown>) {\n Object.assign(attributes, attrs);\n return this;\n },\n setAttribute: function (key: string, value: unknown) {\n attributes[key] = value;\n return this;\n },\n recordException: function (error: Error) {\n console.error(`[${serviceName}:${name}] Exception in ${spanName}:`, error.message);\n return this;\n },\n setStatus: function (status: SpanStatusType, message?: string) {\n if (status === SpanStatus.ERROR) {\n console.error(`[${serviceName}:${name}] ${spanName} ERROR:`, message);\n }\n return this;\n },\n addEvent: function (eventName: string, eventAttrs?: Record<string, unknown>) {\n events.push({ name: eventName, attributes: eventAttrs });\n return this;\n },\n end: () => {\n const duration = Date.now() - startTime;\n console.log(`[${serviceName}:${name}] ${spanName} completed in ${duration}ms`, {\n attributes,\n events,\n });\n },\n isRecording: () => true,\n updateName: function (newName: string) {\n console.log(`[${serviceName}:${name}] Span renamed: ${spanName} -> ${newName}`);\n return this;\n },\n };\n };\n\n return {\n startActiveSpan<T>(\n spanName: string,\n arg1: SpanOptions | ((span: TelemetrySpan) => T),\n arg2?: (span: TelemetrySpan) => T\n ): T {\n const fn = typeof arg1 === 'function' ? arg1 : arg2;\n if (!fn) throw new Error('No callback function provided');\n const span = createConsoleSpan(spanName);\n try {\n return fn(span);\n } finally {\n span.end();\n }\n },\n startSpan(spanName: string, _options?: SpanOptions): TelemetrySpan {\n return createConsoleSpan(spanName);\n },\n };\n }\n\n getLogger(name: string): TelemetryLogger {\n const prefix = `[${this.serviceName}:${name}]`;\n return {\n debug: (message, context) => console.debug(prefix, message, context),\n info: (message, context) => console.info(prefix, message, context),\n warn: (message, context) => console.warn(prefix, message, context),\n error: (message, context) => console.error(prefix, message, context),\n };\n }\n\n getMetrics(name: string): TelemetryMetrics {\n const prefix = `[${this.serviceName}:${name}]`;\n return {\n increment: (metricName, value = 1, attributes) =>\n console.log(`${prefix} COUNTER ${metricName}: +${value}`, attributes),\n gauge: (metricName, value, attributes) =>\n console.log(`${prefix} GAUGE ${metricName}: ${value}`, attributes),\n histogram: (metricName, value, attributes) =>\n console.log(`${prefix} HISTOGRAM ${metricName}: ${value}`, attributes),\n };\n }\n\n async shutdown(): Promise<void> {\n console.log(`[${this.serviceName}] Telemetry provider shutting down`);\n }\n\n isEnabled(): boolean {\n return true;\n }\n}\n\n// ============================================================================\n// Global telemetry management\n// ============================================================================\n\nlet globalProvider: TelemetryProvider = new NoOpTelemetryProvider();\n\n/**\n * InkeepTelemetryProvider - Main telemetry management class\n *\n * Provides a unified interface for telemetry across the SDK.\n * Telemetry is OPT-IN - by default, a no-op provider is used.\n */\nexport class InkeepTelemetryProvider {\n private provider: TelemetryProvider;\n\n constructor(config: TelemetryConfig = {}) {\n if (config.provider) {\n this.provider = config.provider;\n } else if (config.enabled) {\n // Use console provider as default when enabled without custom provider\n this.provider = new ConsoleTelemetryProvider(config.serviceName);\n } else {\n this.provider = new NoOpTelemetryProvider();\n }\n }\n\n /**\n * Get a tracer for creating spans\n */\n getTracer(name: string, version?: string): TelemetryTracer {\n return this.provider.getTracer(name, version);\n }\n\n /**\n * Get a logger for structured logging\n */\n getLogger(name: string): TelemetryLogger {\n return this.provider.getLogger(name);\n }\n\n /**\n * Get metrics recorder\n */\n getMetrics(name: string): TelemetryMetrics {\n return this.provider.getMetrics(name);\n }\n\n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.provider.isEnabled();\n }\n\n /**\n * Shutdown the provider\n */\n async shutdown(): Promise<void> {\n return this.provider.shutdown();\n }\n\n /**\n * Get the underlying provider\n */\n getProvider(): TelemetryProvider {\n return this.provider;\n }\n\n /**\n * Set as the global telemetry provider\n */\n setAsGlobal(): void {\n globalProvider = this.provider;\n }\n}\n\n/**\n * Get the global telemetry provider\n */\nexport function getGlobalTelemetryProvider(): TelemetryProvider {\n return globalProvider;\n}\n\n/**\n * Set the global telemetry provider\n */\nexport function setGlobalTelemetryProvider(provider: TelemetryProvider): void {\n globalProvider = provider;\n}\n\n// ============================================================================\n// Factory functions\n// ============================================================================\n\n/**\n * Create a no-op telemetry provider (default, does nothing)\n */\nexport function createNoOpTelemetryProvider(): InkeepTelemetryProvider {\n return new InkeepTelemetryProvider({ enabled: false });\n}\n\n/**\n * Create a console-based telemetry provider for development\n */\nexport function createConsoleTelemetryProvider(serviceName?: string): InkeepTelemetryProvider {\n return new InkeepTelemetryProvider({\n enabled: true,\n serviceName,\n provider: new ConsoleTelemetryProvider(serviceName),\n });\n}\n\n/**\n * Configuration for OpenTelemetry provider\n */\nexport interface OpenTelemetryConfig {\n /** Service name */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** OTLP endpoint URL */\n endpoint?: string;\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string>;\n}\n\n/**\n * Wrap an OpenTelemetry span in our TelemetrySpan interface\n */\nfunction wrapOtelSpan(otelSpan: {\n setAttributes: (attributes: Record<string, unknown>) => void;\n setAttribute: (key: string, value: unknown) => void;\n recordException: (error: Error) => void;\n setStatus: (status: { code: number; message?: string }) => void;\n addEvent: (name: string, attributes?: Record<string, unknown>) => void;\n end: () => void;\n isRecording: () => boolean;\n updateName: (name: string) => void;\n}): TelemetrySpan {\n return {\n setAttributes: function (attributes: Record<string, unknown>) {\n otelSpan.setAttributes(attributes);\n return this;\n },\n setAttribute: function (key: string, value: unknown) {\n otelSpan.setAttribute(key, value);\n return this;\n },\n recordException: function (error: Error) {\n otelSpan.recordException(error);\n return this;\n },\n setStatus: function (status: SpanStatusType, message?: string) {\n const statusCode = status === SpanStatus.ERROR ? 2 : status === SpanStatus.OK ? 1 : 0;\n otelSpan.setStatus({ code: statusCode, message });\n return this;\n },\n addEvent: function (name: string, attributes?: Record<string, unknown>) {\n otelSpan.addEvent(name, attributes);\n return this;\n },\n end: () => otelSpan.end(),\n isRecording: () => otelSpan.isRecording(),\n updateName: function (name: string) {\n otelSpan.updateName(name);\n return this;\n },\n };\n}\n\n/**\n * Check if OpenTelemetry is available\n */\nfunction isOpenTelemetryAvailable(): boolean {\n try {\n require.resolve('@opentelemetry/api');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Load OpenTelemetry module dynamically\n */\nasync function loadOpenTelemetryModule(): Promise<{\n trace: {\n getTracer: (\n name: string,\n version?: string\n ) => {\n startActiveSpan: <T>(\n name: string,\n options: { attributes?: Record<string, unknown> },\n fn: (span: Parameters<typeof wrapOtelSpan>[0]) => T\n ) => T;\n startSpan: (\n name: string,\n options?: { attributes?: Record<string, unknown> }\n ) => Parameters<typeof wrapOtelSpan>[0];\n };\n };\n}> {\n // Use Function constructor to avoid TypeScript checking the import\n const dynamicImport = new Function('specifier', 'return import(specifier)');\n return dynamicImport('@opentelemetry/api');\n}\n\n/**\n * Create an OpenTelemetry-based provider\n *\n * Note: Requires @opentelemetry packages to be installed\n */\nexport async function createOpenTelemetryProvider(\n config: OpenTelemetryConfig\n): Promise<InkeepTelemetryProvider> {\n // Check if OpenTelemetry is available\n if (!isOpenTelemetryAvailable()) {\n console.warn(\n 'OpenTelemetry packages not installed. Install with: npm install @opentelemetry/api @opentelemetry/sdk-node'\n );\n return createNoOpTelemetryProvider();\n }\n\n try {\n const { trace } = await loadOpenTelemetryModule();\n\n // Create a wrapper around OpenTelemetry's API\n const provider: TelemetryProvider = {\n getTracer(name: string, version?: string): TelemetryTracer {\n const otelTracer = trace.getTracer(name, version);\n\n return {\n startActiveSpan<T>(\n spanName: string,\n arg1: SpanOptions | ((span: TelemetrySpan) => T),\n arg2?: (span: TelemetrySpan) => T\n ): T {\n const fn = typeof arg1 === 'function' ? arg1 : arg2;\n const options = typeof arg1 === 'object' ? arg1 : undefined;\n\n if (!fn) throw new Error('No callback function provided');\n\n return otelTracer.startActiveSpan(\n spanName,\n options?.attributes ? { attributes: options.attributes } : {},\n (otelSpan) => {\n const span = wrapOtelSpan(otelSpan);\n return fn(span);\n }\n );\n },\n startSpan(spanName: string, options?: SpanOptions): TelemetrySpan {\n const otelSpan = otelTracer.startSpan(\n spanName,\n options?.attributes ? { attributes: options.attributes } : {}\n );\n return wrapOtelSpan(otelSpan);\n },\n };\n },\n getLogger(name: string): TelemetryLogger {\n // OpenTelemetry logging requires additional setup\n // Fall back to console for now\n return new ConsoleTelemetryProvider(config.serviceName).getLogger(name);\n },\n getMetrics(_name: string): TelemetryMetrics {\n // OpenTelemetry metrics requires additional setup\n // Return no-op for now\n return createNoOpMetrics();\n },\n async shutdown(): Promise<void> {\n // Shutdown would be handled by the SDK setup\n },\n isEnabled(): boolean {\n return true;\n },\n };\n\n return new InkeepTelemetryProvider({\n enabled: true,\n provider,\n });\n } catch (error) {\n console.warn(\n 'Failed to initialize OpenTelemetry:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n return createNoOpTelemetryProvider();\n }\n}\n"],"mappings":"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"}
|