@inkeep/agents-cli 0.60.0 → 0.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/agents-cli/package.js +1 -1
  2. package/dist/api.js +74 -2
  3. package/dist/api.js.map +1 -1
  4. package/dist/commands/pull-v4/generators/agent-generator.js +2 -2
  5. package/dist/commands/pull-v4/generators/agent-generator.js.map +1 -1
  6. package/dist/commands/pull-v4/generators/context-config-generator.js.map +1 -1
  7. package/dist/commands/pull-v4/introspect/index.js +70 -17
  8. package/dist/commands/pull-v4/introspect/index.js.map +1 -1
  9. package/dist/commands/pull-v4/merge-conflicts.js +37 -0
  10. package/dist/commands/pull-v4/merge-conflicts.js.map +1 -0
  11. package/dist/commands/pull-v4/merge-ui/column-row.js +63 -0
  12. package/dist/commands/pull-v4/merge-ui/column-row.js.map +1 -0
  13. package/dist/commands/pull-v4/merge-ui/conflict-view.js +135 -0
  14. package/dist/commands/pull-v4/merge-ui/conflict-view.js.map +1 -0
  15. package/dist/commands/pull-v4/merge-ui/help-bar.js +79 -0
  16. package/dist/commands/pull-v4/merge-ui/help-bar.js.map +1 -0
  17. package/dist/commands/pull-v4/merge-ui/merge-app.js +239 -0
  18. package/dist/commands/pull-v4/merge-ui/merge-app.js.map +1 -0
  19. package/dist/commands/pull-v4/merge-ui/resolution-summary.js +106 -0
  20. package/dist/commands/pull-v4/merge-ui/resolution-summary.js.map +1 -0
  21. package/dist/commands/pull-v4/merge-ui/types.js +1 -0
  22. package/dist/commands/pull-v4/merge-ui/utils.js +43 -0
  23. package/dist/commands/pull-v4/merge-ui/utils.js.map +1 -0
  24. package/dist/index.js +2 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/utils/state.js +46 -0
  27. package/dist/utils/state.js.map +1 -0
  28. package/package.json +7 -4
@@ -1,6 +1,6 @@
1
1
  //#region package.json
2
2
  var name = "@inkeep/agents-cli";
3
- var version = "0.60.0";
3
+ var version = "0.62.0";
4
4
 
5
5
  //#endregion
6
6
  export { name, version };
package/dist/api.js CHANGED
@@ -76,9 +76,11 @@ var ManagementApiClient = class ManagementApiClient extends BaseApiClient {
76
76
  }
77
77
  return (await response.json()).data;
78
78
  }
79
- async getFullProject(projectId) {
79
+ async getFullProject(projectId, ref) {
80
80
  const tenantId = this.checkTenantId();
81
- const response = await this.authenticatedFetch(`${this.apiUrl}/manage/tenants/${tenantId}/project-full/${projectId}`, { method: "GET" });
81
+ const url = new URL(`${this.apiUrl}/manage/tenants/${tenantId}/project-full/${projectId}`);
82
+ if (ref) url.searchParams.set("ref", ref);
83
+ const response = await this.authenticatedFetch(url.toString(), { method: "GET" });
82
84
  if (!response.ok) {
83
85
  if (response.status === 404) throw new Error(`Project "${projectId}" not found`);
84
86
  if (response.status === 401 || response.status === 403) {
@@ -96,6 +98,76 @@ var ManagementApiClient = class ManagementApiClient extends BaseApiClient {
96
98
  }
97
99
  return (await response.json()).data;
98
100
  }
101
+ async getBranch(projectId, branchName) {
102
+ const tenantId = this.checkTenantId();
103
+ const response = await this.authenticatedFetch(`${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches/${branchName}`);
104
+ if (!response.ok) {
105
+ const errorText = await response.text().catch(() => "");
106
+ throw new Error(`Failed to fetch branch "${branchName}": ${response.statusText}${errorText ? `\n${errorText}` : ""}`);
107
+ }
108
+ return (await response.json()).data;
109
+ }
110
+ async createBranch(projectId, request) {
111
+ const tenantId = this.checkTenantId();
112
+ const response = await this.authenticatedFetch(`${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches`, {
113
+ method: "POST",
114
+ headers: { "Content-Type": "application/json" },
115
+ body: JSON.stringify(request)
116
+ });
117
+ if (!response.ok) {
118
+ const errorText = await response.text().catch(() => "");
119
+ throw new Error(`Failed to create branch "${request.name}": ${response.statusText}${errorText ? `\n${errorText}` : ""}`);
120
+ }
121
+ return (await response.json()).data;
122
+ }
123
+ async deleteBranch(projectId, branchName, force) {
124
+ const tenantId = this.checkTenantId();
125
+ const url = new URL(`${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches/${branchName}`);
126
+ if (force) url.searchParams.set("force", "true");
127
+ const response = await this.authenticatedFetch(url.toString(), { method: "DELETE" });
128
+ if (!response.ok) {
129
+ const errorText = await response.text().catch(() => "");
130
+ throw new Error(`Failed to delete branch "${branchName}": ${response.statusText}${errorText ? `\n${errorText}` : ""}`);
131
+ }
132
+ }
133
+ async pushFullProject(projectId, branchName, projectData) {
134
+ const tenantId = this.checkTenantId();
135
+ const response = await this.authenticatedFetch(`${this.apiUrl}/manage/tenants/${tenantId}/project-full/${projectId}?ref=${branchName}`, {
136
+ method: "PUT",
137
+ headers: { "Content-Type": "application/json" },
138
+ body: JSON.stringify(projectData)
139
+ });
140
+ if (!response.ok) {
141
+ const errorText = await response.text().catch(() => "");
142
+ throw new Error(`Failed to push project to branch "${branchName}": ${response.statusText}${errorText ? `\n${errorText}` : ""}`);
143
+ }
144
+ }
145
+ async mergePreview(projectId, request) {
146
+ const tenantId = this.checkTenantId();
147
+ const response = await this.authenticatedFetch(`${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches/merge/preview`, {
148
+ method: "POST",
149
+ headers: { "Content-Type": "application/json" },
150
+ body: JSON.stringify(request)
151
+ });
152
+ if (!response.ok) {
153
+ const errorText = await response.text().catch(() => "");
154
+ throw new Error(`Failed to preview merge: ${response.statusText}${errorText ? `\n${errorText}` : ""}`);
155
+ }
156
+ return (await response.json()).data;
157
+ }
158
+ async mergeExecute(projectId, request) {
159
+ const tenantId = this.checkTenantId();
160
+ const response = await this.authenticatedFetch(`${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches/merge`, {
161
+ method: "POST",
162
+ headers: { "Content-Type": "application/json" },
163
+ body: JSON.stringify(request)
164
+ });
165
+ if (!response.ok) {
166
+ const errorText = await response.text().catch(() => "");
167
+ throw new Error(`Failed to execute merge: ${response.statusText}${errorText ? `\n${errorText}` : ""}`);
168
+ }
169
+ return (await response.json()).data;
170
+ }
99
171
  /**
100
172
  * List all projects for the current tenant
101
173
  * @param page - Page number (1-based)
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","names":["errorText"],"sources":["../src/api.ts"],"sourcesContent":["// Import shared API client from agents-core\nimport {\n type AgentApiInsert,\n type AgentApiSelect,\n apiFetch,\n type FullProjectSelectResponse,\n OPENAI_MODELS,\n} from '@inkeep/agents-core';\nimport type { z } from 'zod';\n\ntype FullProjectResponse = z.infer<typeof FullProjectSelectResponse>;\n\nabstract class BaseApiClient {\n protected constructor(\n protected apiUrl: string,\n protected tenantId: string | undefined,\n protected projectId: string,\n protected apiKey?: string,\n protected isCI = false\n ) {}\n\n protected checkTenantId(): string {\n if (!this.tenantId) {\n throw new Error('No tenant ID configured. Please run: inkeep init');\n }\n return this.tenantId;\n }\n\n /**\n * Wrapper around fetch that automatically includes auth header\n * Uses X-API-Key for CI mode, Authorization Bearer for interactive mode\n */\n protected async authenticatedFetch(url: string, options: RequestInit = {}): Promise<Response> {\n // Build headers with auth if API key is present\n const headers: Record<string, string> = {\n ...(options.headers as Record<string, string>),\n };\n\n // Add auth header based on mode\n if (this.apiKey) {\n if (this.isCI) {\n // CI mode: use X-API-Key header for tenant-level API keys\n headers['X-API-Key'] = this.apiKey;\n } else {\n // Interactive mode: use Bearer token for user session tokens\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n }\n\n return apiFetch(url, {\n ...options,\n headers,\n });\n }\n\n getTenantId(): string | undefined {\n return this.tenantId;\n }\n\n getProjectId(): string {\n return this.projectId;\n }\n\n getApiUrl(): string {\n return this.apiUrl;\n }\n\n getIsCI(): boolean {\n return this.isCI;\n }\n}\n\ntype ConstructorParams = [\n apiUrl: string,\n tenantId: string | undefined,\n projectId: string,\n apiKey?: string,\n isCI?: boolean,\n];\n\nexport class ManagementApiClient extends BaseApiClient {\n private constructor(...args: ConstructorParams) {\n super(...args);\n }\n\n static async create(\n apiUrl?: string,\n configPath?: string,\n tenantIdOverride?: string,\n projectIdOverride?: string,\n isCI?: boolean,\n apiKeyOverride?: string\n ): Promise<ManagementApiClient> {\n // Load config from file\n const { validateConfiguration } = await import('./utils/config.js');\n const config = await validateConfiguration(configPath);\n\n // Allow overrides from parameters\n const resolvedApiUrl = apiUrl || config.agentsApiUrl;\n const tenantId = tenantIdOverride || config.tenantId;\n const projectId = projectIdOverride || '';\n\n // Use explicit API key override if provided (e.g., from profile credentials)\n const apiKey = apiKeyOverride || config.agentsApiKey;\n\n return new ManagementApiClient(resolvedApiUrl, tenantId, projectId, apiKey, isCI ?? false);\n }\n\n async listAgents(): Promise<AgentApiSelect[]> {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/agents?limit=100`,\n {\n method: 'GET',\n }\n );\n\n if (!response.ok) {\n throw new Error(\n `Failed to list agents: ${response.statusText}. ${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/agents`\n );\n }\n\n const data = await response.json();\n return data.data || [];\n }\n\n async getAgent(agentId: string): Promise<AgentApiSelect | null> {\n // Since there's no dedicated GET endpoint for agents,\n // we check if the agent exists in the CRUD endpoint\n const agents = await this.listAgents();\n const agent = agents.find((g) => g.id === agentId);\n\n // If found in CRUD, return it as a valid agent\n // The agent is usable for chat even without a dedicated GET endpoint\n return agent || null;\n }\n\n async pushAgent(agentDefinition: AgentApiInsert): Promise<any> {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n\n const agentId = agentDefinition.id;\n if (!agentId) {\n throw new Error('Agent must have an id property');\n }\n\n // Try to update first using PUT, if it doesn't exist, it will create it\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/agents/${agentId}`,\n {\n method: 'PUT',\n body: JSON.stringify({\n ...agentDefinition,\n tenantId,\n }),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to push agent: ${response.statusText}\\n${errorText}`);\n }\n\n const data = await response.json();\n return data.data;\n }\n\n async getFullProject(projectId: string): Promise<FullProjectResponse['data']> {\n const tenantId = this.checkTenantId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/project-full/${projectId}`,\n {\n method: 'GET',\n }\n );\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Project \"${projectId}\" not found`);\n }\n if (response.status === 401 || response.status === 403) {\n const errorText = await response.text().catch(() => '');\n let errorMessage = 'Authentication failed - check your API key configuration\\n\\n';\n errorMessage += 'Common issues:\\n';\n errorMessage += ' • Missing or invalid API key in inkeep.config.ts\\n';\n errorMessage += ' • API key does not have access to this tenant/project\\n';\n errorMessage +=\n ' • For local development, ensure INKEEP_AGENTS_MANAGE_API_BYPASS_SECRET is set\\n';\n if (errorText) {\n errorMessage += `\\nServer response: ${errorText}`;\n }\n throw new Error(errorMessage);\n }\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to fetch project: ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n\n const responseData = await response.json();\n return responseData.data;\n }\n\n /**\n * List all projects for the current tenant\n * @param page - Page number (1-based)\n * @param limit - Number of results per page (max 100)\n * @returns List of projects with pagination info\n */\n async listProjects(\n page: number = 1,\n limit: number = 100\n ): Promise<{ data: any[]; pagination: { page: number; limit: number; total: number } }> {\n const tenantId = this.checkTenantId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects?page=${page}&limit=${limit}`,\n {\n method: 'GET',\n }\n );\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n const errorText = await response.text().catch(() => '');\n let errorMessage = 'Authentication failed - check your API key configuration\\n\\n';\n errorMessage += 'Common issues:\\n';\n errorMessage += ' • Missing or invalid API key in inkeep.config.ts\\n';\n errorMessage += ' • API key does not have access to this tenant\\n';\n if (errorText) {\n errorMessage += `\\nServer response: ${errorText}`;\n }\n throw new Error(errorMessage);\n }\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to list projects: ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n\n const responseData = await response.json();\n return responseData;\n }\n\n /**\n * List all projects for the current tenant (fetches all pages)\n * @returns Array of all projects\n */\n async listAllProjects(): Promise<any[]> {\n const allProjects: any[] = [];\n let page = 1;\n const limit = 100;\n\n while (true) {\n const result = await this.listProjects(page, limit);\n allProjects.push(...result.data);\n\n // Check if we've fetched all projects\n if (result.data.length < limit || allProjects.length >= result.pagination.total) {\n break;\n }\n page++;\n }\n\n return allProjects;\n }\n\n async getDataComponent(componentId: string): Promise<{\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n } | null> {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/data-components/${componentId}`,\n { method: 'GET' }\n );\n if (response.status === 404) return null;\n if (!response.ok) {\n const err = await response.text().catch(() => '');\n throw new Error(\n `Failed to fetch data component: ${response.statusText}${err ? `\\n${err}` : ''}`\n );\n }\n const json = await response.json();\n return json.data ?? null;\n }\n\n async listDataComponents(): Promise<\n {\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n }[]\n > {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n const all: {\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n }[] = [];\n let page = 1;\n const limit = 100;\n let result: { data: any[]; pagination: { total: number } };\n do {\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/data-components?page=${page}&limit=${limit}`,\n { method: 'GET' }\n );\n if (!response.ok) {\n const err = await response.text().catch(() => '');\n throw new Error(\n `Failed to list data components: ${response.statusText}${err ? `\\n${err}` : ''}`\n );\n }\n result = await response.json();\n all.push(...(result.data || []));\n page++;\n } while (result.data?.length === limit && all.length < (result.pagination?.total ?? 0));\n return all;\n }\n\n async getArtifactComponent(componentId: string): Promise<{\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n } | null> {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/artifact-components/${componentId}`,\n { method: 'GET' }\n );\n if (response.status === 404) return null;\n if (!response.ok) {\n const err = await response.text().catch(() => '');\n throw new Error(\n `Failed to fetch artifact component: ${response.statusText}${err ? `\\n${err}` : ''}`\n );\n }\n const json = await response.json();\n return json.data ?? null;\n }\n\n async listArtifactComponents(): Promise<\n {\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n }[]\n > {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n const all: {\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n }[] = [];\n let page = 1;\n const limit = 100;\n let result: { data: any[]; pagination: { total: number } };\n do {\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/artifact-components?page=${page}&limit=${limit}`,\n { method: 'GET' }\n );\n if (!response.ok) {\n const err = await response.text().catch(() => '');\n throw new Error(\n `Failed to list artifact components: ${response.statusText}${err ? `\\n${err}` : ''}`\n );\n }\n result = await response.json();\n all.push(...(result.data || []));\n page++;\n } while (result.data?.length === limit && all.length < (result.pagination?.total ?? 0));\n return all;\n }\n}\n\nexport class ExecutionApiClient extends BaseApiClient {\n private constructor(...args: ConstructorParams) {\n super(...args);\n }\n\n static async create(\n apiUrl?: string,\n configPath?: string,\n tenantIdOverride?: string,\n projectIdOverride?: string,\n isCI?: boolean\n ): Promise<ExecutionApiClient> {\n // Load config from file\n const { validateConfiguration } = await import('./utils/config.js');\n const config = await validateConfiguration(configPath);\n\n // Allow overrides from parameters\n const resolvedApiUrl = apiUrl || config.agentsApiUrl;\n const tenantId = tenantIdOverride || config.tenantId;\n const projectId = projectIdOverride || '';\n\n return new ExecutionApiClient(\n resolvedApiUrl,\n tenantId,\n projectId,\n config.agentsApiKey,\n isCI ?? false\n );\n }\n\n async chatCompletion(\n agentId: string,\n messages: any[],\n conversationId?: string,\n emitOperations?: boolean\n ): Promise<ReadableStream<Uint8Array> | string> {\n const response = await this.authenticatedFetch(`${this.apiUrl}/run/v1/chat/completions`, {\n method: 'POST',\n headers: {\n Accept: 'text/event-stream',\n 'x-inkeep-tenant-id': this.tenantId || 'test-tenant-id',\n 'x-inkeep-project-id': this.projectId,\n 'x-inkeep-agent-id': agentId,\n ...(emitOperations && { 'x-emit-operations': 'true' }),\n },\n body: JSON.stringify({\n model: OPENAI_MODELS.GPT_4_1_MINI, // Required but will be overridden by graph config\n messages,\n conversationId,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Chat request failed: ${response.statusText}\\n${errorText}`);\n }\n\n // Check if response is streaming\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('text/event-stream')) {\n if (!response.body) {\n throw new Error('No response body for streaming request');\n }\n return response.body;\n }\n // Non-streaming response\n const data = await response.json();\n return data.choices?.[0]?.message?.content || data.result || '';\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"api.js","names":["errorText"],"sources":["../src/api.ts"],"sourcesContent":["// Import shared API client from agents-core\nimport {\n type AgentApiInsert,\n type AgentApiSelect,\n apiFetch,\n type FullProjectSelectResponse,\n OPENAI_MODELS,\n} from '@inkeep/agents-core';\nimport type { z } from 'zod';\n\ntype FullProjectResponse = z.infer<typeof FullProjectSelectResponse>;\n\nabstract class BaseApiClient {\n protected constructor(\n protected apiUrl: string,\n protected tenantId: string | undefined,\n protected projectId: string,\n protected apiKey?: string,\n protected isCI = false\n ) {}\n\n protected checkTenantId(): string {\n if (!this.tenantId) {\n throw new Error('No tenant ID configured. Please run: inkeep init');\n }\n return this.tenantId;\n }\n\n /**\n * Wrapper around fetch that automatically includes auth header\n * Uses X-API-Key for CI mode, Authorization Bearer for interactive mode\n */\n protected async authenticatedFetch(url: string, options: RequestInit = {}): Promise<Response> {\n // Build headers with auth if API key is present\n const headers: Record<string, string> = {\n ...(options.headers as Record<string, string>),\n };\n\n // Add auth header based on mode\n if (this.apiKey) {\n if (this.isCI) {\n // CI mode: use X-API-Key header for tenant-level API keys\n headers['X-API-Key'] = this.apiKey;\n } else {\n // Interactive mode: use Bearer token for user session tokens\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n }\n\n return apiFetch(url, {\n ...options,\n headers,\n });\n }\n\n getTenantId(): string | undefined {\n return this.tenantId;\n }\n\n getProjectId(): string {\n return this.projectId;\n }\n\n getApiUrl(): string {\n return this.apiUrl;\n }\n\n getIsCI(): boolean {\n return this.isCI;\n }\n}\n\ntype ConstructorParams = [\n apiUrl: string,\n tenantId: string | undefined,\n projectId: string,\n apiKey?: string,\n isCI?: boolean,\n];\n\nexport class ManagementApiClient extends BaseApiClient {\n private constructor(...args: ConstructorParams) {\n super(...args);\n }\n\n static async create(\n apiUrl?: string,\n configPath?: string,\n tenantIdOverride?: string,\n projectIdOverride?: string,\n isCI?: boolean,\n apiKeyOverride?: string\n ): Promise<ManagementApiClient> {\n // Load config from file\n const { validateConfiguration } = await import('./utils/config.js');\n const config = await validateConfiguration(configPath);\n\n // Allow overrides from parameters\n const resolvedApiUrl = apiUrl || config.agentsApiUrl;\n const tenantId = tenantIdOverride || config.tenantId;\n const projectId = projectIdOverride || '';\n\n // Use explicit API key override if provided (e.g., from profile credentials)\n const apiKey = apiKeyOverride || config.agentsApiKey;\n\n return new ManagementApiClient(resolvedApiUrl, tenantId, projectId, apiKey, isCI ?? false);\n }\n\n async listAgents(): Promise<AgentApiSelect[]> {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/agents?limit=100`,\n {\n method: 'GET',\n }\n );\n\n if (!response.ok) {\n throw new Error(\n `Failed to list agents: ${response.statusText}. ${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/agents`\n );\n }\n\n const data = await response.json();\n return data.data || [];\n }\n\n async getAgent(agentId: string): Promise<AgentApiSelect | null> {\n // Since there's no dedicated GET endpoint for agents,\n // we check if the agent exists in the CRUD endpoint\n const agents = await this.listAgents();\n const agent = agents.find((g) => g.id === agentId);\n\n // If found in CRUD, return it as a valid agent\n // The agent is usable for chat even without a dedicated GET endpoint\n return agent || null;\n }\n\n async pushAgent(agentDefinition: AgentApiInsert): Promise<any> {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n\n const agentId = agentDefinition.id;\n if (!agentId) {\n throw new Error('Agent must have an id property');\n }\n\n // Try to update first using PUT, if it doesn't exist, it will create it\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/agents/${agentId}`,\n {\n method: 'PUT',\n body: JSON.stringify({\n ...agentDefinition,\n tenantId,\n }),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to push agent: ${response.statusText}\\n${errorText}`);\n }\n\n const data = await response.json();\n return data.data;\n }\n\n async getFullProject(projectId: string, ref?: string): Promise<FullProjectResponse['data']> {\n const tenantId = this.checkTenantId();\n const url = new URL(`${this.apiUrl}/manage/tenants/${tenantId}/project-full/${projectId}`);\n if (ref) {\n url.searchParams.set('ref', ref);\n }\n\n const response = await this.authenticatedFetch(url.toString(), {\n method: 'GET',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Project \"${projectId}\" not found`);\n }\n if (response.status === 401 || response.status === 403) {\n const errorText = await response.text().catch(() => '');\n let errorMessage = 'Authentication failed - check your API key configuration\\n\\n';\n errorMessage += 'Common issues:\\n';\n errorMessage += ' • Missing or invalid API key in inkeep.config.ts\\n';\n errorMessage += ' • API key does not have access to this tenant/project\\n';\n errorMessage +=\n ' • For local development, ensure INKEEP_AGENTS_MANAGE_API_BYPASS_SECRET is set\\n';\n if (errorText) {\n errorMessage += `\\nServer response: ${errorText}`;\n }\n throw new Error(errorMessage);\n }\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to fetch project: ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n\n const responseData = await response.json();\n return responseData.data;\n }\n\n async getBranch(\n projectId: string,\n branchName: string\n ): Promise<{ baseName: string; fullName: string; hash: string }> {\n const tenantId = this.checkTenantId();\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches/${branchName}`\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to fetch branch \"${branchName}\": ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n\n const responseData = await response.json();\n return responseData.data;\n }\n\n async createBranch(\n projectId: string,\n request: { name: string; fromBranch?: string; fromCommit?: string }\n ): Promise<{ baseName: string; fullName: string; hash: string }> {\n const tenantId = this.checkTenantId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to create branch \"${request.name}\": ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n\n const responseData = await response.json();\n return responseData.data;\n }\n\n async deleteBranch(projectId: string, branchName: string, force?: boolean): Promise<void> {\n const tenantId = this.checkTenantId();\n\n const url = new URL(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches/${branchName}`\n );\n if (force) url.searchParams.set('force', 'true');\n\n const response = await this.authenticatedFetch(url.toString(), { method: 'DELETE' });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to delete branch \"${branchName}\": ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n }\n\n async pushFullProject(\n projectId: string,\n branchName: string,\n projectData: unknown\n ): Promise<void> {\n const tenantId = this.checkTenantId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/project-full/${projectId}?ref=${branchName}`,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(projectData),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to push project to branch \"${branchName}\": ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n }\n\n async mergePreview(\n projectId: string,\n request: {\n sourceBranch: string;\n targetBranch: string;\n }\n ): Promise<{\n hasConflicts: boolean;\n sourceHash: string;\n targetHash: string;\n canFastForward: boolean;\n diffSummary: Array<{\n table: string;\n diffType: string;\n dataChange: boolean;\n schemaChange: boolean;\n }>;\n conflicts: Array<{\n table: string;\n primaryKey: Record<string, string>;\n ourDiffType: string;\n theirDiffType: string;\n base: Record<string, unknown> | null;\n ours: Record<string, unknown> | null;\n theirs: Record<string, unknown> | null;\n }>;\n }> {\n const tenantId = this.checkTenantId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches/merge/preview`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to preview merge: ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n\n const responseData = await response.json();\n return responseData.data;\n }\n\n async mergeExecute(\n projectId: string,\n request: {\n sourceBranch: string;\n targetBranch: string;\n sourceHash: string;\n targetHash: string;\n message?: string;\n author?: { name: string; email: string };\n resolutions?: Array<{\n table: string;\n primaryKey: Record<string, string>;\n rowDefaultPick: 'ours' | 'theirs';\n columns?: Record<string, 'ours' | 'theirs'>;\n }>;\n }\n ): Promise<{\n status: 'success';\n mergeCommitHash: string;\n sourceBranch: string;\n targetBranch: string;\n }> {\n const tenantId = this.checkTenantId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/branches/merge`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to execute merge: ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n\n const responseData = await response.json();\n return responseData.data;\n }\n\n /**\n * List all projects for the current tenant\n * @param page - Page number (1-based)\n * @param limit - Number of results per page (max 100)\n * @returns List of projects with pagination info\n */\n async listProjects(\n page: number = 1,\n limit: number = 100\n ): Promise<{ data: any[]; pagination: { page: number; limit: number; total: number } }> {\n const tenantId = this.checkTenantId();\n\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects?page=${page}&limit=${limit}`,\n {\n method: 'GET',\n }\n );\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n const errorText = await response.text().catch(() => '');\n let errorMessage = 'Authentication failed - check your API key configuration\\n\\n';\n errorMessage += 'Common issues:\\n';\n errorMessage += ' • Missing or invalid API key in inkeep.config.ts\\n';\n errorMessage += ' • API key does not have access to this tenant\\n';\n if (errorText) {\n errorMessage += `\\nServer response: ${errorText}`;\n }\n throw new Error(errorMessage);\n }\n const errorText = await response.text().catch(() => '');\n throw new Error(\n `Failed to list projects: ${response.statusText}${errorText ? `\\n${errorText}` : ''}`\n );\n }\n\n const responseData = await response.json();\n return responseData;\n }\n\n /**\n * List all projects for the current tenant (fetches all pages)\n * @returns Array of all projects\n */\n async listAllProjects(): Promise<any[]> {\n const allProjects: any[] = [];\n let page = 1;\n const limit = 100;\n\n while (true) {\n const result = await this.listProjects(page, limit);\n allProjects.push(...result.data);\n\n // Check if we've fetched all projects\n if (result.data.length < limit || allProjects.length >= result.pagination.total) {\n break;\n }\n page++;\n }\n\n return allProjects;\n }\n\n async getDataComponent(componentId: string): Promise<{\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n } | null> {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/data-components/${componentId}`,\n { method: 'GET' }\n );\n if (response.status === 404) return null;\n if (!response.ok) {\n const err = await response.text().catch(() => '');\n throw new Error(\n `Failed to fetch data component: ${response.statusText}${err ? `\\n${err}` : ''}`\n );\n }\n const json = await response.json();\n return json.data ?? null;\n }\n\n async listDataComponents(): Promise<\n {\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n }[]\n > {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n const all: {\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n }[] = [];\n let page = 1;\n const limit = 100;\n let result: { data: any[]; pagination: { total: number } };\n do {\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/data-components?page=${page}&limit=${limit}`,\n { method: 'GET' }\n );\n if (!response.ok) {\n const err = await response.text().catch(() => '');\n throw new Error(\n `Failed to list data components: ${response.statusText}${err ? `\\n${err}` : ''}`\n );\n }\n result = await response.json();\n all.push(...(result.data || []));\n page++;\n } while (result.data?.length === limit && all.length < (result.pagination?.total ?? 0));\n return all;\n }\n\n async getArtifactComponent(componentId: string): Promise<{\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n } | null> {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/artifact-components/${componentId}`,\n { method: 'GET' }\n );\n if (response.status === 404) return null;\n if (!response.ok) {\n const err = await response.text().catch(() => '');\n throw new Error(\n `Failed to fetch artifact component: ${response.statusText}${err ? `\\n${err}` : ''}`\n );\n }\n const json = await response.json();\n return json.data ?? null;\n }\n\n async listArtifactComponents(): Promise<\n {\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n }[]\n > {\n const tenantId = this.checkTenantId();\n const projectId = this.getProjectId();\n const all: {\n id: string;\n name: string;\n render: { component: string; mockData: Record<string, unknown> } | null;\n }[] = [];\n let page = 1;\n const limit = 100;\n let result: { data: any[]; pagination: { total: number } };\n do {\n const response = await this.authenticatedFetch(\n `${this.apiUrl}/manage/tenants/${tenantId}/projects/${projectId}/artifact-components?page=${page}&limit=${limit}`,\n { method: 'GET' }\n );\n if (!response.ok) {\n const err = await response.text().catch(() => '');\n throw new Error(\n `Failed to list artifact components: ${response.statusText}${err ? `\\n${err}` : ''}`\n );\n }\n result = await response.json();\n all.push(...(result.data || []));\n page++;\n } while (result.data?.length === limit && all.length < (result.pagination?.total ?? 0));\n return all;\n }\n}\n\nexport class ExecutionApiClient extends BaseApiClient {\n private constructor(...args: ConstructorParams) {\n super(...args);\n }\n\n static async create(\n apiUrl?: string,\n configPath?: string,\n tenantIdOverride?: string,\n projectIdOverride?: string,\n isCI?: boolean\n ): Promise<ExecutionApiClient> {\n // Load config from file\n const { validateConfiguration } = await import('./utils/config.js');\n const config = await validateConfiguration(configPath);\n\n // Allow overrides from parameters\n const resolvedApiUrl = apiUrl || config.agentsApiUrl;\n const tenantId = tenantIdOverride || config.tenantId;\n const projectId = projectIdOverride || '';\n\n return new ExecutionApiClient(\n resolvedApiUrl,\n tenantId,\n projectId,\n config.agentsApiKey,\n isCI ?? false\n );\n }\n\n async chatCompletion(\n agentId: string,\n messages: any[],\n conversationId?: string,\n emitOperations?: boolean\n ): Promise<ReadableStream<Uint8Array> | string> {\n const response = await this.authenticatedFetch(`${this.apiUrl}/run/v1/chat/completions`, {\n method: 'POST',\n headers: {\n Accept: 'text/event-stream',\n 'x-inkeep-tenant-id': this.tenantId || 'test-tenant-id',\n 'x-inkeep-project-id': this.projectId,\n 'x-inkeep-agent-id': agentId,\n ...(emitOperations && { 'x-emit-operations': 'true' }),\n },\n body: JSON.stringify({\n model: OPENAI_MODELS.GPT_4_1_MINI, // Required but will be overridden by graph config\n messages,\n conversationId,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Chat request failed: ${response.statusText}\\n${errorText}`);\n }\n\n // Check if response is streaming\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('text/event-stream')) {\n if (!response.body) {\n throw new Error('No response body for streaming request');\n }\n return response.body;\n }\n // Non-streaming response\n const data = await response.json();\n return data.choices?.[0]?.message?.content || data.result || '';\n }\n}\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ import { collectContextTemplateReferences, collectSubAgentReferenceOverrides, co
9
9
  import { addResolvedReferenceImports, resolveReferenceBinding, resolveReferenceBindingsFromIds, toReferenceNameMap } from "../reference-resolution.js";
10
10
  import { generateFactorySourceFile } from "../simple-factory-generator.js";
11
11
  import { addScheduledTriggerImports, addStatusComponentImports, addTriggerImports, createReferenceNameMap, createScheduledTriggerReferenceMaps, createTriggerReferenceMaps, extractIds } from "./helpers/agent.js";
12
- import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
12
+ import { AgentWithinContextOfProjectSchemaBase } from "@inkeep/agents-core";
13
13
  import { z } from "zod";
14
14
  import { join } from "node:path";
15
15
 
@@ -18,7 +18,7 @@ const SubAgentReferenceSchema = z.object({
18
18
  name: z.string().nonempty(),
19
19
  local: z.boolean().optional()
20
20
  });
21
- const MySchema = FullProjectDefinitionSchema.shape.agents.valueType.omit({ id: true });
21
+ const MySchema = AgentWithinContextOfProjectSchemaBase.omit({ id: true });
22
22
  const SubAgentSchema = MySchema.shape.subAgents.valueType.omit({ type: true });
23
23
  const ToolSchema = MySchema.shape.tools.unwrap().valueType;
24
24
  const AgentSchema = z.strictObject({
@@ -1 +1 @@
1
- {"version":3,"file":"agent-generator.js","names":["id"],"sources":["../../../../src/commands/pull-v4/generators/agent-generator.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { ObjectLiteralExpression, SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport { asRecord, collectTemplateVariablesFromValues } from '../collector-common';\nimport {\n collectContextTemplateReferences,\n collectSubAgentReferenceOverrides,\n collectSubAgentReferencePathOverrides,\n} from '../collector-reference-helpers';\nimport type { GenerationTask } from '../generation-types';\nimport {\n addResolvedReferenceImports,\n resolveReferenceBinding,\n resolveReferenceBindingsFromIds,\n toReferenceNameMap,\n} from '../reference-resolution';\nimport { generateFactorySourceFile } from '../simple-factory-generator';\nimport {\n addValueToObject,\n buildComponentFileName,\n codePropertyAccess,\n codeReference,\n createReferenceGetterValue,\n formatTemplate,\n isPlainObject,\n toCamelCase,\n toTriggerReferenceName,\n} from '../utils';\nimport {\n addScheduledTriggerImports,\n addStatusComponentImports,\n addTriggerImports,\n createReferenceNameMap,\n createScheduledTriggerReferenceMaps,\n createTriggerReferenceMaps,\n extractIds,\n type ReferenceNameMap,\n} from './helpers/agent';\n\nconst SubAgentReferenceSchema = z.object({\n name: z.string().nonempty(),\n local: z.boolean().optional(),\n});\n\nconst MySchema = FullProjectDefinitionSchema.shape.agents.valueType.omit({\n id: true,\n});\n\nconst SubAgentSchema = MySchema.shape.subAgents.valueType.omit({\n // Invalid input: expected \"internal\"\n type: true,\n});\n\nconst ToolSchema = MySchema.shape.tools.unwrap().valueType;\n\nconst BaseAgentSchema = z.strictObject({\n agentId: z.string().nonempty(),\n ...MySchema.shape,\n description: z.preprocess((v) => v || undefined, MySchema.shape.description),\n models: z.preprocess((v) => v ?? undefined, MySchema.shape.models),\n stopWhen: z.preprocess(\n (v) => (v && Object.keys(v).length && v) || undefined,\n MySchema.shape.stopWhen\n ),\n subAgents: z.record(\n z.string(),\n z.strictObject({\n ...SubAgentSchema.shape,\n models: z.preprocess((v) => v ?? undefined, SubAgentSchema.shape.models),\n stopWhen: z.preprocess((v) => v ?? undefined, SubAgentSchema.shape.stopWhen),\n // Unrecognized keys: \"name\", \"description\", \"content\", \"metadata\", \"subAgentSkillId\", \"subAgentId\", \"createdAt\", \"updatedAt\"\n skills: z.unknown(),\n // Invalid input\n canDelegateTo: z.unknown(),\n })\n ),\n tools: z\n .record(\n z.string(),\n z.strictObject({\n ...ToolSchema.shape,\n // Invalid input: expected string, received null\n imageUrl: z.preprocess((v) => v ?? undefined, ToolSchema.shape.imageUrl),\n })\n )\n .optional(),\n // ✖ Invalid input: expected string, received undefined\n // → at triggers.t546ck7yueh52jils88rm.authentication.headers[0].value\n triggers: z.record(z.string(), z.unknown()).optional(),\n agentVariableName: z.string().nonempty().optional(),\n subAgentReferences: z.record(z.string(), SubAgentReferenceSchema).optional(),\n subAgentReferencePathOverrides: z.record(z.string(), z.string().nonempty()).optional(),\n contextConfigReference: SubAgentReferenceSchema.optional(),\n contextConfigHeadersReference: SubAgentReferenceSchema.optional(),\n});\n\nconst AgentSchema = BaseAgentSchema.transform((data) => ({\n ...data,\n normalizedContextConfigId: normalizeContextConfigId(data.contextConfig),\n normalizedStatusComponentIds: normalizeStatusComponentIds(data.statusUpdates?.statusComponents),\n normalizedStatusComponentSequence: normalizeStatusComponentSequence(\n data.statusUpdates?.statusComponents\n ),\n}));\n\ntype AgentInput = z.input<typeof AgentSchema>;\ntype AgentOutput = z.output<typeof AgentSchema>;\n\nfunction normalizeContextConfigId(contextConfig: unknown): string | undefined {\n if (typeof contextConfig === 'string') {\n return contextConfig;\n }\n\n if (isPlainObject(contextConfig) && typeof contextConfig.id === 'string') {\n return contextConfig.id;\n }\n\n return undefined;\n}\n\nfunction normalizeStatusComponentId(statusComponent: unknown): string | undefined {\n if (typeof statusComponent === 'string') {\n return statusComponent;\n }\n\n if (!isPlainObject(statusComponent)) {\n return undefined;\n }\n\n if (typeof statusComponent.id === 'string') {\n return statusComponent.id;\n }\n\n if (typeof statusComponent.type === 'string') {\n return statusComponent.type;\n }\n\n return undefined;\n}\n\nfunction normalizeStatusComponentSequence(statusComponents: unknown[] | undefined): string[] {\n if (!Array.isArray(statusComponents)) {\n return [];\n }\n\n return statusComponents\n .map((statusComponent) => normalizeStatusComponentId(statusComponent))\n .filter((statusComponentId): statusComponentId is string => Boolean(statusComponentId));\n}\n\nfunction normalizeStatusComponentIds(statusComponents: unknown[] | undefined): string[] {\n return [...new Set(normalizeStatusComponentSequence(statusComponents))];\n}\n\ninterface AgentReferenceNames {\n subAgents: ReferenceNameMap;\n contextConfig?: string;\n contextHeaders?: string;\n triggers: ReferenceNameMap;\n scheduledTriggers: ReferenceNameMap;\n statusComponents: ReferenceNameMap;\n}\n\nexport function generateAgentDefinition({\n id,\n createdAt,\n updatedAt,\n ...data\n}: AgentInput & Record<string, unknown>): SourceFile {\n return generateFactorySourceFile(data, {\n schema: AgentSchema,\n factory: {\n importName: 'agent',\n variableName: (parsed) => parsed.agentVariableName || toCamelCase(parsed.agentId),\n },\n render({ parsed, sourceFile, configObject }) {\n const subAgentIds = new Set(extractIds(parsed.subAgents));\n if (parsed.defaultSubAgentId) {\n subAgentIds.add(parsed.defaultSubAgentId);\n }\n const agentVarName = parsed.agentVariableName || toCamelCase(parsed.agentId);\n const reservedReferenceNames = new Set([agentVarName]);\n const subAgentReferences = resolveReferenceBindingsFromIds({\n ids: subAgentIds,\n reservedNames: reservedReferenceNames,\n conflictSuffix: 'SubAgent',\n referenceOverrides: parsed.subAgentReferences,\n referencePathOverrides: parsed.subAgentReferencePathOverrides,\n defaultModulePath: (id) => id,\n });\n const subAgentReferenceNames = toReferenceNameMap(subAgentReferences);\n addResolvedReferenceImports(sourceFile, subAgentReferences, (reference) => {\n return `./sub-agents/${reference.modulePath}`;\n });\n\n const contextConfigId = parsed.normalizedContextConfigId;\n let contextConfigReferenceName: string | undefined;\n let contextHeadersReferenceName: string | undefined;\n const promptTemplateVariables = collectTemplateVariablesFromValues([\n parsed.prompt,\n parsed.statusUpdates?.prompt,\n ]);\n const hasHeadersTemplateVariables = promptTemplateVariables.some((variableName) =>\n variableName.startsWith('headers.')\n );\n if (contextConfigId) {\n const contextConfigReference = resolveReferenceBinding(\n {\n id: `${contextConfigId}:context`,\n importName: parsed.contextConfigReference?.name ?? toCamelCase(contextConfigId),\n modulePath: contextConfigId,\n local: parsed.contextConfigReference?.local === true,\n conflictSuffix: 'ContextConfig',\n },\n {\n reservedNames: reservedReferenceNames,\n }\n );\n contextConfigReferenceName = contextConfigReference.localName;\n\n const contextReferences = [contextConfigReference];\n if (hasHeadersTemplateVariables) {\n const headersReference = resolveReferenceBinding(\n {\n id: `${contextConfigId}:headers`,\n importName:\n parsed.contextConfigHeadersReference?.name ??\n `${toCamelCase(contextConfigId)}Headers`,\n modulePath: contextConfigId,\n local: parsed.contextConfigHeadersReference?.local === true,\n conflictSuffix: 'Headers',\n },\n {\n reservedNames: reservedReferenceNames,\n }\n );\n contextHeadersReferenceName = headersReference.localName;\n contextReferences.push(headersReference);\n }\n\n addResolvedReferenceImports(sourceFile, contextReferences, () => {\n return `../context-configs/${contextConfigId}`;\n });\n }\n\n const { referenceNames: triggerReferenceNames, importRefs: triggerImportRefs } =\n createTriggerReferenceMaps(parsed.triggers, reservedReferenceNames);\n addTriggerImports(sourceFile, triggerReferenceNames, triggerImportRefs);\n\n const {\n referenceNames: scheduledTriggerReferenceNames,\n importRefs: scheduledTriggerImportRefs,\n } = createScheduledTriggerReferenceMaps(parsed.scheduledTriggers, reservedReferenceNames);\n addScheduledTriggerImports(\n sourceFile,\n scheduledTriggerReferenceNames,\n scheduledTriggerImportRefs\n );\n\n const statusComponentReferenceNames = createReferenceNameMap(\n parsed.normalizedStatusComponentIds,\n reservedReferenceNames,\n 'StatusComponent'\n );\n addStatusComponentImports(sourceFile, statusComponentReferenceNames);\n\n writeAgentConfig(configObject, parsed, {\n subAgents: subAgentReferenceNames,\n contextConfig: contextConfigReferenceName,\n contextHeaders: contextHeadersReferenceName,\n triggers: triggerReferenceNames,\n scheduledTriggers: scheduledTriggerReferenceNames,\n statusComponents: statusComponentReferenceNames,\n });\n },\n });\n}\n\nfunction writeAgentConfig(\n configObject: ObjectLiteralExpression,\n data: AgentOutput,\n referenceNames: AgentReferenceNames\n) {\n const agentConfig: Record<string, unknown> = {\n id: data.agentId,\n name: data.name,\n description: data.description,\n prompt:\n data.prompt &&\n formatTemplate(data.prompt, {\n contextReference: referenceNames.contextConfig,\n headersReference: referenceNames.contextHeaders,\n }),\n models: data.models,\n stopWhen: data.stopWhen,\n };\n\n const { defaultSubAgentId } = data;\n if (defaultSubAgentId) {\n agentConfig.defaultSubAgent = codeReference(\n referenceNames.subAgents.get(defaultSubAgentId) ?? toCamelCase(defaultSubAgentId)\n );\n }\n\n const subAgentIds = extractIds(data.subAgents);\n agentConfig.subAgents = createReferenceGetterValue(\n subAgentIds.map((id) => referenceNames.subAgents.get(id) ?? toCamelCase(id))\n );\n\n const contextConfigId = data.normalizedContextConfigId;\n if (contextConfigId && referenceNames.contextConfig) {\n agentConfig.contextConfig = codeReference(referenceNames.contextConfig);\n }\n\n const triggerIds = data.triggers ? extractIds(data.triggers) : [];\n if (triggerIds.length) {\n agentConfig.triggers = createReferenceGetterValue(\n triggerIds.map((id) => referenceNames.triggers.get(id) ?? toTriggerReferenceName(id))\n );\n }\n\n const scheduledTriggerIds = data.scheduledTriggers ? extractIds(data.scheduledTriggers) : [];\n if (scheduledTriggerIds.length) {\n agentConfig.scheduledTriggers = createReferenceGetterValue(\n scheduledTriggerIds.map(\n (id) => referenceNames.scheduledTriggers.get(id) ?? toTriggerReferenceName(id)\n )\n );\n }\n\n if (data.statusUpdates) {\n const statusComponentRefs = data.normalizedStatusComponentSequence.map((statusComponentId) =>\n codePropertyAccess(\n referenceNames.statusComponents.get(statusComponentId) ?? toCamelCase(statusComponentId),\n 'config'\n )\n );\n agentConfig.statusUpdates = {\n numEvents: data.statusUpdates.numEvents,\n timeInSeconds: data.statusUpdates.timeInSeconds,\n prompt:\n data.statusUpdates.prompt &&\n formatTemplate(data.statusUpdates.prompt, {\n contextReference: referenceNames.contextConfig,\n headersReference: referenceNames.contextHeaders,\n }),\n ...(statusComponentRefs?.length && { statusComponents: statusComponentRefs }),\n };\n }\n\n for (const [key, value] of Object.entries(agentConfig)) {\n addValueToObject(configObject, key, value);\n }\n}\n\nexport const task = {\n type: 'agent',\n collect(context) {\n if (!context.project.agents) {\n return [];\n }\n\n const records = [];\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n if (!agentData) {\n continue;\n }\n\n const agentName = typeof agentData.name === 'string' ? agentData.name : undefined;\n const agentFilePath = context.resolver.resolveOutputFilePath(\n 'agents',\n agentId,\n join(context.paths.agentsDir, buildComponentFileName(agentId, agentName))\n );\n const existingAgent = context.resolver.getExistingComponent(agentId, 'agents');\n const subAgentReferences = collectSubAgentReferenceOverrides(\n context,\n agentData,\n agentFilePath\n );\n const subAgentReferencePathOverrides = collectSubAgentReferencePathOverrides(\n context,\n agentData\n );\n const statusUpdates = asRecord(agentData.statusUpdates);\n const contextTemplateReferences = collectContextTemplateReferences(\n context,\n agentData,\n agentFilePath,\n [\n typeof agentData.prompt === 'string' ? agentData.prompt : undefined,\n typeof statusUpdates?.prompt === 'string' ? statusUpdates.prompt : undefined,\n ]\n );\n\n records.push({\n id: agentId,\n filePath: agentFilePath,\n payload: {\n agentId,\n ...agentData,\n ...(existingAgent?.name?.length && { agentVariableName: existingAgent.name }),\n ...(Object.keys(subAgentReferences).length && { subAgentReferences }),\n ...(Object.keys(subAgentReferencePathOverrides).length && {\n subAgentReferencePathOverrides,\n }),\n ...(contextTemplateReferences && {\n contextConfigReference: contextTemplateReferences.contextConfigReference,\n }),\n ...(contextTemplateReferences?.contextConfigHeadersReference && {\n contextConfigHeadersReference: contextTemplateReferences.contextConfigHeadersReference,\n }),\n } as Parameters<typeof generateAgentDefinition>[0],\n });\n }\n\n return records;\n },\n generate: generateAgentDefinition,\n} satisfies GenerationTask<Parameters<typeof generateAgentDefinition>[0]>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-generator.js","names":["id"],"sources":["../../../../src/commands/pull-v4/generators/agent-generator.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { AgentWithinContextOfProjectSchemaBase } from '@inkeep/agents-core';\nimport type { ObjectLiteralExpression, SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport { asRecord, collectTemplateVariablesFromValues } from '../collector-common';\nimport {\n collectContextTemplateReferences,\n collectSubAgentReferenceOverrides,\n collectSubAgentReferencePathOverrides,\n} from '../collector-reference-helpers';\nimport type { GenerationTask } from '../generation-types';\nimport {\n addResolvedReferenceImports,\n resolveReferenceBinding,\n resolveReferenceBindingsFromIds,\n toReferenceNameMap,\n} from '../reference-resolution';\nimport { generateFactorySourceFile } from '../simple-factory-generator';\nimport {\n addValueToObject,\n buildComponentFileName,\n codePropertyAccess,\n codeReference,\n createReferenceGetterValue,\n formatTemplate,\n isPlainObject,\n toCamelCase,\n toTriggerReferenceName,\n} from '../utils';\nimport {\n addScheduledTriggerImports,\n addStatusComponentImports,\n addTriggerImports,\n createReferenceNameMap,\n createScheduledTriggerReferenceMaps,\n createTriggerReferenceMaps,\n extractIds,\n type ReferenceNameMap,\n} from './helpers/agent';\n\nconst SubAgentReferenceSchema = z.object({\n name: z.string().nonempty(),\n local: z.boolean().optional(),\n});\n\nconst MySchema = AgentWithinContextOfProjectSchemaBase.omit({\n id: true,\n});\n\nconst SubAgentSchema = MySchema.shape.subAgents.valueType.omit({\n // Invalid input: expected \"internal\"\n type: true,\n});\n\nconst ToolSchema = MySchema.shape.tools.unwrap().valueType;\n\nconst BaseAgentSchema = z.strictObject({\n agentId: z.string().nonempty(),\n ...MySchema.shape,\n description: z.preprocess((v) => v || undefined, MySchema.shape.description),\n models: z.preprocess((v) => v ?? undefined, MySchema.shape.models),\n stopWhen: z.preprocess(\n (v) => (v && Object.keys(v).length && v) || undefined,\n MySchema.shape.stopWhen\n ),\n subAgents: z.record(\n z.string(),\n z.strictObject({\n ...SubAgentSchema.shape,\n models: z.preprocess((v) => v ?? undefined, SubAgentSchema.shape.models),\n stopWhen: z.preprocess((v) => v ?? undefined, SubAgentSchema.shape.stopWhen),\n // Unrecognized keys: \"name\", \"description\", \"content\", \"metadata\", \"subAgentSkillId\", \"subAgentId\", \"createdAt\", \"updatedAt\"\n skills: z.unknown(),\n // Invalid input\n canDelegateTo: z.unknown(),\n })\n ),\n tools: z\n .record(\n z.string(),\n z.strictObject({\n ...ToolSchema.shape,\n // Invalid input: expected string, received null\n imageUrl: z.preprocess((v) => v ?? undefined, ToolSchema.shape.imageUrl),\n })\n )\n .optional(),\n // ✖ Invalid input: expected string, received undefined\n // → at triggers.t546ck7yueh52jils88rm.authentication.headers[0].value\n triggers: z.record(z.string(), z.unknown()).optional(),\n agentVariableName: z.string().nonempty().optional(),\n subAgentReferences: z.record(z.string(), SubAgentReferenceSchema).optional(),\n subAgentReferencePathOverrides: z.record(z.string(), z.string().nonempty()).optional(),\n contextConfigReference: SubAgentReferenceSchema.optional(),\n contextConfigHeadersReference: SubAgentReferenceSchema.optional(),\n});\n\nconst AgentSchema = BaseAgentSchema.transform((data) => ({\n ...data,\n normalizedContextConfigId: normalizeContextConfigId(data.contextConfig),\n normalizedStatusComponentIds: normalizeStatusComponentIds(data.statusUpdates?.statusComponents),\n normalizedStatusComponentSequence: normalizeStatusComponentSequence(\n data.statusUpdates?.statusComponents\n ),\n}));\n\ntype AgentInput = z.input<typeof AgentSchema>;\ntype AgentOutput = z.output<typeof AgentSchema>;\n\nfunction normalizeContextConfigId(contextConfig: unknown): string | undefined {\n if (typeof contextConfig === 'string') {\n return contextConfig;\n }\n\n if (isPlainObject(contextConfig) && typeof contextConfig.id === 'string') {\n return contextConfig.id;\n }\n\n return undefined;\n}\n\nfunction normalizeStatusComponentId(statusComponent: unknown): string | undefined {\n if (typeof statusComponent === 'string') {\n return statusComponent;\n }\n\n if (!isPlainObject(statusComponent)) {\n return undefined;\n }\n\n if (typeof statusComponent.id === 'string') {\n return statusComponent.id;\n }\n\n if (typeof statusComponent.type === 'string') {\n return statusComponent.type;\n }\n\n return undefined;\n}\n\nfunction normalizeStatusComponentSequence(statusComponents: unknown[] | undefined): string[] {\n if (!Array.isArray(statusComponents)) {\n return [];\n }\n\n return statusComponents\n .map((statusComponent) => normalizeStatusComponentId(statusComponent))\n .filter((statusComponentId): statusComponentId is string => Boolean(statusComponentId));\n}\n\nfunction normalizeStatusComponentIds(statusComponents: unknown[] | undefined): string[] {\n return [...new Set(normalizeStatusComponentSequence(statusComponents))];\n}\n\ninterface AgentReferenceNames {\n subAgents: ReferenceNameMap;\n contextConfig?: string;\n contextHeaders?: string;\n triggers: ReferenceNameMap;\n scheduledTriggers: ReferenceNameMap;\n statusComponents: ReferenceNameMap;\n}\n\nexport function generateAgentDefinition({\n id,\n createdAt,\n updatedAt,\n ...data\n}: AgentInput & Record<string, unknown>): SourceFile {\n return generateFactorySourceFile(data, {\n schema: AgentSchema,\n factory: {\n importName: 'agent',\n variableName: (parsed) => parsed.agentVariableName || toCamelCase(parsed.agentId),\n },\n render({ parsed, sourceFile, configObject }) {\n const subAgentIds = new Set(extractIds(parsed.subAgents));\n if (parsed.defaultSubAgentId) {\n subAgentIds.add(parsed.defaultSubAgentId);\n }\n const agentVarName = parsed.agentVariableName || toCamelCase(parsed.agentId);\n const reservedReferenceNames = new Set([agentVarName]);\n const subAgentReferences = resolveReferenceBindingsFromIds({\n ids: subAgentIds,\n reservedNames: reservedReferenceNames,\n conflictSuffix: 'SubAgent',\n referenceOverrides: parsed.subAgentReferences,\n referencePathOverrides: parsed.subAgentReferencePathOverrides,\n defaultModulePath: (id) => id,\n });\n const subAgentReferenceNames = toReferenceNameMap(subAgentReferences);\n addResolvedReferenceImports(sourceFile, subAgentReferences, (reference) => {\n return `./sub-agents/${reference.modulePath}`;\n });\n\n const contextConfigId = parsed.normalizedContextConfigId;\n let contextConfigReferenceName: string | undefined;\n let contextHeadersReferenceName: string | undefined;\n const promptTemplateVariables = collectTemplateVariablesFromValues([\n parsed.prompt,\n parsed.statusUpdates?.prompt,\n ]);\n const hasHeadersTemplateVariables = promptTemplateVariables.some((variableName) =>\n variableName.startsWith('headers.')\n );\n if (contextConfigId) {\n const contextConfigReference = resolveReferenceBinding(\n {\n id: `${contextConfigId}:context`,\n importName: parsed.contextConfigReference?.name ?? toCamelCase(contextConfigId),\n modulePath: contextConfigId,\n local: parsed.contextConfigReference?.local === true,\n conflictSuffix: 'ContextConfig',\n },\n {\n reservedNames: reservedReferenceNames,\n }\n );\n contextConfigReferenceName = contextConfigReference.localName;\n\n const contextReferences = [contextConfigReference];\n if (hasHeadersTemplateVariables) {\n const headersReference = resolveReferenceBinding(\n {\n id: `${contextConfigId}:headers`,\n importName:\n parsed.contextConfigHeadersReference?.name ??\n `${toCamelCase(contextConfigId)}Headers`,\n modulePath: contextConfigId,\n local: parsed.contextConfigHeadersReference?.local === true,\n conflictSuffix: 'Headers',\n },\n {\n reservedNames: reservedReferenceNames,\n }\n );\n contextHeadersReferenceName = headersReference.localName;\n contextReferences.push(headersReference);\n }\n\n addResolvedReferenceImports(sourceFile, contextReferences, () => {\n return `../context-configs/${contextConfigId}`;\n });\n }\n\n const { referenceNames: triggerReferenceNames, importRefs: triggerImportRefs } =\n createTriggerReferenceMaps(parsed.triggers, reservedReferenceNames);\n addTriggerImports(sourceFile, triggerReferenceNames, triggerImportRefs);\n\n const {\n referenceNames: scheduledTriggerReferenceNames,\n importRefs: scheduledTriggerImportRefs,\n } = createScheduledTriggerReferenceMaps(parsed.scheduledTriggers, reservedReferenceNames);\n addScheduledTriggerImports(\n sourceFile,\n scheduledTriggerReferenceNames,\n scheduledTriggerImportRefs\n );\n\n const statusComponentReferenceNames = createReferenceNameMap(\n parsed.normalizedStatusComponentIds,\n reservedReferenceNames,\n 'StatusComponent'\n );\n addStatusComponentImports(sourceFile, statusComponentReferenceNames);\n\n writeAgentConfig(configObject, parsed, {\n subAgents: subAgentReferenceNames,\n contextConfig: contextConfigReferenceName,\n contextHeaders: contextHeadersReferenceName,\n triggers: triggerReferenceNames,\n scheduledTriggers: scheduledTriggerReferenceNames,\n statusComponents: statusComponentReferenceNames,\n });\n },\n });\n}\n\nfunction writeAgentConfig(\n configObject: ObjectLiteralExpression,\n data: AgentOutput,\n referenceNames: AgentReferenceNames\n) {\n const agentConfig: Record<string, unknown> = {\n id: data.agentId,\n name: data.name,\n description: data.description,\n prompt:\n data.prompt &&\n formatTemplate(data.prompt, {\n contextReference: referenceNames.contextConfig,\n headersReference: referenceNames.contextHeaders,\n }),\n models: data.models,\n stopWhen: data.stopWhen,\n };\n\n const { defaultSubAgentId } = data;\n if (defaultSubAgentId) {\n agentConfig.defaultSubAgent = codeReference(\n referenceNames.subAgents.get(defaultSubAgentId) ?? toCamelCase(defaultSubAgentId)\n );\n }\n\n const subAgentIds = extractIds(data.subAgents);\n agentConfig.subAgents = createReferenceGetterValue(\n subAgentIds.map((id) => referenceNames.subAgents.get(id) ?? toCamelCase(id))\n );\n\n const contextConfigId = data.normalizedContextConfigId;\n if (contextConfigId && referenceNames.contextConfig) {\n agentConfig.contextConfig = codeReference(referenceNames.contextConfig);\n }\n\n const triggerIds = data.triggers ? extractIds(data.triggers) : [];\n if (triggerIds.length) {\n agentConfig.triggers = createReferenceGetterValue(\n triggerIds.map((id) => referenceNames.triggers.get(id) ?? toTriggerReferenceName(id))\n );\n }\n\n const scheduledTriggerIds = data.scheduledTriggers ? extractIds(data.scheduledTriggers) : [];\n if (scheduledTriggerIds.length) {\n agentConfig.scheduledTriggers = createReferenceGetterValue(\n scheduledTriggerIds.map(\n (id) => referenceNames.scheduledTriggers.get(id) ?? toTriggerReferenceName(id)\n )\n );\n }\n\n if (data.statusUpdates) {\n const statusComponentRefs = data.normalizedStatusComponentSequence.map((statusComponentId) =>\n codePropertyAccess(\n referenceNames.statusComponents.get(statusComponentId) ?? toCamelCase(statusComponentId),\n 'config'\n )\n );\n agentConfig.statusUpdates = {\n numEvents: data.statusUpdates.numEvents,\n timeInSeconds: data.statusUpdates.timeInSeconds,\n prompt:\n data.statusUpdates.prompt &&\n formatTemplate(data.statusUpdates.prompt, {\n contextReference: referenceNames.contextConfig,\n headersReference: referenceNames.contextHeaders,\n }),\n ...(statusComponentRefs?.length && { statusComponents: statusComponentRefs }),\n };\n }\n\n for (const [key, value] of Object.entries(agentConfig)) {\n addValueToObject(configObject, key, value);\n }\n}\n\nexport const task = {\n type: 'agent',\n collect(context) {\n if (!context.project.agents) {\n return [];\n }\n\n const records = [];\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n if (!agentData) {\n continue;\n }\n\n const agentName = typeof agentData.name === 'string' ? agentData.name : undefined;\n const agentFilePath = context.resolver.resolveOutputFilePath(\n 'agents',\n agentId,\n join(context.paths.agentsDir, buildComponentFileName(agentId, agentName))\n );\n const existingAgent = context.resolver.getExistingComponent(agentId, 'agents');\n const subAgentReferences = collectSubAgentReferenceOverrides(\n context,\n agentData,\n agentFilePath\n );\n const subAgentReferencePathOverrides = collectSubAgentReferencePathOverrides(\n context,\n agentData\n );\n const statusUpdates = asRecord(agentData.statusUpdates);\n const contextTemplateReferences = collectContextTemplateReferences(\n context,\n agentData,\n agentFilePath,\n [\n typeof agentData.prompt === 'string' ? agentData.prompt : undefined,\n typeof statusUpdates?.prompt === 'string' ? statusUpdates.prompt : undefined,\n ]\n );\n\n records.push({\n id: agentId,\n filePath: agentFilePath,\n payload: {\n agentId,\n ...agentData,\n ...(existingAgent?.name?.length && { agentVariableName: existingAgent.name }),\n ...(Object.keys(subAgentReferences).length && { subAgentReferences }),\n ...(Object.keys(subAgentReferencePathOverrides).length && {\n subAgentReferencePathOverrides,\n }),\n ...(contextTemplateReferences && {\n contextConfigReference: contextTemplateReferences.contextConfigReference,\n }),\n ...(contextTemplateReferences?.contextConfigHeadersReference && {\n contextConfigHeadersReference: contextTemplateReferences.contextConfigHeadersReference,\n }),\n } as Parameters<typeof generateAgentDefinition>[0],\n });\n }\n\n return records;\n },\n generate: generateAgentDefinition,\n} satisfies GenerationTask<Parameters<typeof generateAgentDefinition>[0]>;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context-config-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/context-config-generator.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { ObjectLiteralExpression, SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport {\n applyPromptHeaderTemplateSchema,\n asRecord,\n collectHeaderTemplateVariablesFromAgentPrompts,\n} from '../collector-common';\nimport {\n collectContextConfigCredentialReferenceOverrides,\n collectContextConfigCredentialReferencePathOverrides,\n collectContextConfigHeadersReferenceOverride,\n} from '../collector-reference-helpers';\nimport type { GenerationTask } from '../generation-types';\nimport { addNamedImports, applyImportPlan, createImportPlan } from '../import-plan';\nimport { generateValidatedSourceFile } from '../simple-factory-generator';\nimport {\n addFactoryConfigVariable,\n addValueToObject,\n codeExpression,\n codeReference,\n convertJsonSchemaToZodSafe,\n createInMemoryProject,\n isPlainObject,\n toCamelCase,\n} from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.agents.valueType.shape.contextConfig.unwrap();\n\nconst ReferenceNameByIdSchema = z.record(z.string(), z.string().nonempty());\n\nconst ReferenceOverridesSchema = z.object({\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\nconst ReferencePathOverridesSchema = z.object({\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\ninterface NormalizedContextVariableEntry {\n referenceName: string;\n rawValue: unknown;\n fetchDefinitionData?: Record<string, unknown>;\n}\n\ntype NormalizedContextVariableMap = Record<string, NormalizedContextVariableEntry>;\n\nconst BaseContextConfigSchema = z.strictObject({\n contextConfigId: z.string().nonempty(),\n ...MySchema.shape,\n referenceOverrides: ReferenceOverridesSchema.optional(),\n referencePathOverrides: ReferencePathOverridesSchema.optional(),\n\n // TODO check these fields\n headers: z.string().optional(),\n headersReference: z.string().optional(),\n schema: z.unknown(),\n name: z.string().nullish(),\n trigger: z.unknown(),\n fetchConfig: z.record(z.string(), z.unknown()).optional(),\n defaultValue: z.unknown(),\n responseSchema: z.unknown(),\n});\n\nconst ContextConfigSchema = BaseContextConfigSchema.transform((data) => ({\n ...data,\n normalizedHeadersReference: extractHeadersReference(data.headers),\n normalizedContextVariables: normalizeContextVariables(data.contextVariables),\n}));\n\ntype ContextConfigInput = z.input<typeof ContextConfigSchema>;\ntype ContextConfigOutput = z.output<typeof ContextConfigSchema>;\n\nfunction normalizeContextVariables(\n contextVariables?: Record<string, unknown>\n): NormalizedContextVariableMap {\n if (!contextVariables) {\n return {};\n }\n\n const normalizedVariables: NormalizedContextVariableMap = {};\n for (const [key, value] of Object.entries(contextVariables)) {\n const referenceName = extractContextVariableReference(key, value);\n if (!referenceName) {\n continue;\n }\n\n normalizedVariables[key] = {\n referenceName,\n rawValue: value,\n ...(isPlainObject(value) && isFetchDefinitionData(value)\n ? { fetchDefinitionData: value }\n : {}),\n };\n }\n\n return normalizedVariables;\n}\n\nexport function generateContextConfigDefinition(data: ContextConfigInput): SourceFile {\n return generateValidatedSourceFile(data, {\n schema: ContextConfigSchema,\n importName: 'contextConfig',\n render(parsed) {\n const project = createInMemoryProject();\n const sourceFile = project.createSourceFile('context-config-definition.ts', '', {\n overwrite: true,\n });\n\n if (isHeadersDefinitionData(parsed)) {\n return generateStandaloneHeadersDefinition(sourceFile, parsed);\n }\n\n if (isFetchDefinitionData(parsed)) {\n return generateStandaloneFetchDefinition(sourceFile, parsed);\n }\n\n const explicitHeadersReference =\n (typeof parsed.headersReference === 'string' && parsed.headersReference.length > 0\n ? parsed.headersReference\n : undefined) ?? parsed.normalizedHeadersReference;\n const templateHeaderVariables = collectTemplateHeaderVariables(\n parsed.normalizedContextVariables\n );\n const inferredHeadersSchema =\n !isPlainObject(parsed.headersSchema) && !explicitHeadersReference\n ? inferHeadersSchemaFromTemplateHeaderVariables(templateHeaderVariables)\n : undefined;\n const headersSchema = isPlainObject(parsed.headersSchema)\n ? parsed.headersSchema\n : inferredHeadersSchema;\n const headersReference = resolveHeadersReference(parsed, Boolean(headersSchema));\n const shouldDefineHeadersInFile = Boolean(headersReference) && isPlainObject(headersSchema);\n const fetchDefinitions = collectFetchDefinitionEntries(parsed.normalizedContextVariables);\n const credentialReferenceNames = collectCredentialReferenceNames(\n fetchDefinitions,\n parsed.referenceOverrides?.credentialReferences\n );\n const coreImports = ['contextConfig'];\n if (shouldDefineHeadersInFile) {\n coreImports.unshift('headers');\n }\n if (fetchDefinitions.length > 0) {\n coreImports.splice(coreImports.length - 1, 0, 'fetchDefinition');\n }\n\n const importPlan = createImportPlan();\n addNamedImports(importPlan, '@inkeep/agents-core', coreImports);\n\n const hasResponseSchemas = fetchDefinitions.some((definition) =>\n isPlainObject(definition.data.responseSchema)\n );\n if (shouldDefineHeadersInFile || hasResponseSchemas) {\n addNamedImports(importPlan, 'zod', 'z');\n }\n\n for (const [credentialId, credentialReferenceName] of credentialReferenceNames) {\n const credentialReferencePath =\n parsed.referencePathOverrides?.credentialReferences?.[credentialId] ?? credentialId;\n addNamedImports(\n importPlan,\n `../credentials/${credentialReferencePath}`,\n credentialReferenceName\n );\n }\n applyImportPlan(sourceFile, importPlan);\n if (shouldDefineHeadersInFile && headersReference && headersSchema) {\n const { configObject: headersObject } = addFactoryConfigVariable({\n sourceFile,\n isExported: true,\n importName: 'headers',\n variableName: headersReference,\n });\n\n addValueToObject(headersObject, 'schema', createSchemaExpression(headersSchema));\n }\n\n for (const fetchDefinition of fetchDefinitions) {\n const { configObject: fetchConfigObject } = addFactoryConfigVariable({\n sourceFile,\n importName: 'fetchDefinition',\n variableName: fetchDefinition.variableName,\n });\n writeFetchDefinition(\n fetchConfigObject,\n fetchDefinition.data,\n credentialReferenceNames,\n headersReference\n );\n }\n const contextConfigVarName = toContextConfigVariableName(parsed.contextConfigId);\n const { configObject } = addFactoryConfigVariable({\n sourceFile,\n importName: 'contextConfig',\n variableName: contextConfigVarName,\n isExported: true,\n });\n\n writeContextConfig(configObject, parsed, headersReference);\n\n return sourceFile;\n },\n });\n}\n\nfunction writeContextConfig(\n configObject: ObjectLiteralExpression,\n data: ContextConfigOutput,\n headersReference?: string\n) {\n const contextConfig: Record<string, unknown> = {};\n if (data.id !== undefined) {\n contextConfig.id = data.id;\n }\n if (headersReference) {\n contextConfig.headers = codeReference(headersReference);\n }\n if (Object.keys(data.normalizedContextVariables).length > 0) {\n const contextVariables: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data.normalizedContextVariables)) {\n contextVariables[key] = codeReference(value.referenceName);\n }\n contextConfig.contextVariables = contextVariables;\n }\n\n for (const [key, value] of Object.entries(contextConfig)) {\n addValueToObject(configObject, key, value);\n }\n}\n\nfunction extractHeadersReference(headers?: string | { id?: string; name?: string }) {\n if (!headers) {\n return undefined;\n }\n if (typeof headers === 'string') {\n return headers;\n }\n if (typeof headers.id === 'string') {\n return headers.id;\n }\n if (typeof headers.name === 'string') {\n return headers.name;\n }\n return undefined;\n}\n\nfunction resolveHeadersReference(\n data: ContextConfigOutput,\n hasHeadersSchema: boolean\n): string | undefined {\n if (typeof data.headersReference === 'string' && data.headersReference) {\n return data.headersReference;\n }\n\n const headersRef = extractHeadersReference(data.headers);\n if (headersRef) {\n return toReferenceIdentifier(headersRef);\n }\n\n if (hasHeadersSchema) {\n return `${toContextConfigVariableName(data.contextConfigId)}Headers`;\n }\n\n return undefined;\n}\n\nfunction isFetchDefinitionData(value: unknown): boolean {\n if (!isPlainObject(value)) {\n return false;\n }\n\n return value.fetchConfig !== undefined || value.responseSchema !== undefined;\n}\n\nfunction collectFetchDefinitionEntries(\n contextVariables?: NormalizedContextVariableMap\n): Array<{ key: string; variableName: string; data: Record<string, unknown> }> {\n if (!contextVariables || Object.keys(contextVariables).length === 0) {\n return [];\n }\n\n return Object.entries(contextVariables)\n .filter(([, value]) => Boolean(value.fetchDefinitionData))\n .map(([key, value]) => ({\n key,\n variableName: value.referenceName,\n data: value.fetchDefinitionData as Record<string, unknown>,\n }));\n}\n\nfunction writeFetchDefinition(\n configObject: ObjectLiteralExpression,\n fetchDefinitionData: unknown,\n credentialReferenceNames?: Map<string, string>,\n headersReference?: string\n) {\n const {\n contextConfigId,\n responseSchema,\n credentialReferenceId,\n normalizedHeadersReference: _normalizedHeadersReference,\n normalizedContextVariables: _normalizedContextVariables,\n ...rest\n } = isPlainObject(fetchDefinitionData) ? fetchDefinitionData : {};\n const normalizedRest = rewriteHeaderTemplates(rest, headersReference);\n const fetchDefinition: Record<string, unknown> = {};\n for (const [k, v] of Object.entries({\n id: contextConfigId,\n ...normalizedRest,\n })) {\n if (v !== null) {\n fetchDefinition[k] = v;\n }\n }\n if (responseSchema) {\n fetchDefinition.responseSchema = createSchemaExpression(\n responseSchema as Record<string, unknown>\n );\n }\n\n if (\n typeof credentialReferenceId === 'string' &&\n credentialReferenceNames?.has(credentialReferenceId)\n ) {\n fetchDefinition.credentialReference = codeReference(\n credentialReferenceNames.get(credentialReferenceId) as string\n );\n } else if (typeof credentialReferenceId === 'string') {\n fetchDefinition.credentialReferenceId = credentialReferenceId;\n }\n\n for (const [key, value] of Object.entries(fetchDefinition)) {\n addValueToObject(configObject, key, value);\n }\n}\n\nconst HEADER_TEMPLATE_REGEX = /\\{\\{headers\\.([^}]+)\\}\\}/g;\nconst HEADER_TO_TEMPLATE_CALL_REGEX =\n /\\$\\{\\s*(headersSchema|headers)\\.toTemplate\\((['\"])([^'\"`]+)\\2\\)\\s*\\}/g;\n\nfunction rewriteHeaderTemplates<T>(value: T, headersReference?: string): T {\n if (!headersReference) {\n return value;\n }\n\n if (typeof value === 'string') {\n const withHeaderTokensReplaced = value.replace(\n HEADER_TEMPLATE_REGEX,\n (_, variableName: string) => {\n return `\\${${headersReference}.toTemplate(${JSON.stringify(variableName)})}`;\n }\n );\n return withHeaderTokensReplaced.replace(\n HEADER_TO_TEMPLATE_CALL_REGEX,\n (_, __: string, ___: string, variableName: string) => {\n return `\\${${headersReference}.toTemplate(${JSON.stringify(variableName)})}`;\n }\n ) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => rewriteHeaderTemplates(entry, headersReference)) as T;\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entryValue]) => [\n key,\n rewriteHeaderTemplates(entryValue, headersReference),\n ])\n ) as T;\n }\n\n return value;\n}\n\nfunction generateStandaloneHeadersDefinition(\n sourceFile: SourceFile,\n data: ContextConfigOutput & { schema: Record<string, unknown> }\n): SourceFile {\n const importName = 'headers';\n const importPlan = createImportPlan();\n addNamedImports(importPlan, '@inkeep/agents-core', importName);\n addNamedImports(importPlan, 'zod', 'z');\n applyImportPlan(sourceFile, importPlan);\n\n const headersVarName = toContextConfigVariableName(data.contextConfigId);\n const { configObject } = addFactoryConfigVariable({\n sourceFile,\n importName,\n variableName: headersVarName,\n });\n\n addValueToObject(configObject, 'schema', createSchemaExpression(data.schema));\n return sourceFile;\n}\n\nfunction isHeadersDefinitionData(\n value: ContextConfigOutput\n): value is ContextConfigOutput & { schema: Record<string, unknown> } {\n return isPlainObject(value.schema);\n}\n\nfunction generateStandaloneFetchDefinition(\n sourceFile: SourceFile,\n data: ContextConfigOutput\n): SourceFile {\n const importName = 'fetchDefinition';\n const importPlan = createImportPlan();\n addNamedImports(importPlan, '@inkeep/agents-core', importName);\n\n if (isPlainObject(data.responseSchema)) {\n addNamedImports(importPlan, 'zod', 'z');\n }\n\n const credentialReferenceNames = new Map<string, string>();\n if (typeof (data as Record<string, unknown>).credentialReferenceId === 'string') {\n const credentialReferenceId = (data as Record<string, unknown>).credentialReferenceId as string;\n const credentialReferenceName =\n data.referenceOverrides?.credentialReferences?.[credentialReferenceId] ??\n toReferenceIdentifier(credentialReferenceId);\n const credentialReferencePath =\n data.referencePathOverrides?.credentialReferences?.[credentialReferenceId] ??\n credentialReferenceId;\n credentialReferenceNames.set(credentialReferenceId, credentialReferenceName);\n addNamedImports(\n importPlan,\n `../credentials/${credentialReferencePath}`,\n credentialReferenceName\n );\n }\n applyImportPlan(sourceFile, importPlan);\n\n const fetchVarName = toContextConfigVariableName(data.contextConfigId);\n const { configObject } = addFactoryConfigVariable({\n sourceFile,\n importName,\n variableName: fetchVarName,\n });\n\n writeFetchDefinition(configObject, data, credentialReferenceNames);\n return sourceFile;\n}\n\nfunction convertJsonSchemaToZod(schema: Record<string, unknown>): string {\n return convertJsonSchemaToZodSafe(schema, {\n conversionOptions: { module: 'none' },\n });\n}\n\nfunction createSchemaExpression(schema: Record<string, unknown>) {\n return codeExpression(convertJsonSchemaToZod(schema));\n}\n\nfunction extractContextVariableReference(key: string, value: unknown): string | undefined {\n if (typeof value === 'string') {\n return toReferenceIdentifier(value);\n }\n\n if (!isPlainObject(value)) {\n return;\n }\n\n if (typeof value.id === 'string') {\n return toReferenceIdentifier(value.id);\n }\n if (typeof value.name === 'string') {\n return toReferenceIdentifier(value.name);\n }\n if (typeof value.ref === 'string') {\n return toReferenceIdentifier(value.ref);\n }\n if (typeof value.variable === 'string') {\n return toReferenceIdentifier(value.variable);\n }\n\n if (value.fetchConfig || value.responseSchema) {\n return toReferenceIdentifier(key);\n }\n\n return toReferenceIdentifier(key);\n}\n\nconst toContextConfigVariableName = toCamelCase;\n\nconst toReferenceIdentifier = toCamelCase;\n\nfunction collectCredentialReferenceNames(\n fetchDefinitions: Array<{ data: unknown }>,\n overrideNamesById?: Record<string, string>\n): Map<string, string> {\n const credentialReferenceNames = new Map<string, string>();\n\n for (const fetchDefinition of fetchDefinitions) {\n const fetchDefinitionData = isPlainObject(fetchDefinition.data)\n ? fetchDefinition.data\n : undefined;\n const credentialReferenceId =\n fetchDefinitionData && typeof fetchDefinitionData.credentialReferenceId === 'string'\n ? fetchDefinitionData.credentialReferenceId\n : undefined;\n if (!credentialReferenceId || credentialReferenceNames.has(credentialReferenceId)) {\n continue;\n }\n\n credentialReferenceNames.set(\n credentialReferenceId,\n overrideNamesById?.[credentialReferenceId] ?? toReferenceIdentifier(credentialReferenceId)\n );\n }\n\n return credentialReferenceNames;\n}\n\nfunction collectTemplateHeaderVariables(\n contextVariables?: NormalizedContextVariableMap\n): Set<string> {\n const variables = new Set<string>();\n for (const value of Object.values(contextVariables ?? {})) {\n collectTemplateHeaderVariablesFromValue(value.rawValue, variables);\n }\n return variables;\n}\n\nfunction collectTemplateHeaderVariablesFromValue(value: unknown, variables: Set<string>): void {\n if (typeof value === 'string') {\n for (const match of value.matchAll(HEADER_TEMPLATE_REGEX)) {\n if (match[1]) {\n variables.add(match[1]);\n }\n }\n for (const match of value.matchAll(HEADER_TO_TEMPLATE_CALL_REGEX)) {\n if (match[3]) {\n variables.add(match[3]);\n }\n }\n return;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectTemplateHeaderVariablesFromValue(entry, variables);\n }\n return;\n }\n\n if (isPlainObject(value)) {\n for (const entryValue of Object.values(value)) {\n collectTemplateHeaderVariablesFromValue(entryValue, variables);\n }\n }\n}\n\nfunction inferHeadersSchemaFromTemplateHeaderVariables(\n variables: Set<string>\n): Record<string, unknown> | undefined {\n if (!variables.size) {\n return;\n }\n\n const properties: Record<string, unknown> = {};\n for (const variable of [...variables].sort()) {\n properties[variable] = { type: 'string' };\n }\n\n return {\n type: 'object',\n properties,\n required: [...variables].sort(),\n additionalProperties: false,\n };\n}\n\nexport const task = {\n type: 'context-config',\n collect(context) {\n if (!context.project.agents) {\n return [];\n }\n\n const contextConfigRecordsById = new Map<\n string,\n ReturnType<\n GenerationTask<Parameters<typeof generateContextConfigDefinition>[0]>['collect']\n >[number]\n >();\n\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n const contextConfig = agentData ? asRecord(agentData.contextConfig) : undefined;\n if (!agentData || !contextConfig) {\n continue;\n }\n\n const normalizedContextConfig = applyPromptHeaderTemplateSchema(\n contextConfig,\n collectHeaderTemplateVariablesFromAgentPrompts(agentData)\n );\n const contextConfigId =\n typeof normalizedContextConfig.id === 'string' ? normalizedContextConfig.id : '';\n if (!contextConfigId || contextConfigRecordsById.has(contextConfigId)) {\n continue;\n }\n\n const contextConfigFilePath = context.resolver.resolveOutputFilePath(\n 'contextConfigs',\n contextConfigId,\n join(context.paths.contextConfigsDir, `${contextConfigId}.ts`)\n );\n const credentialReferenceOverrides = collectContextConfigCredentialReferenceOverrides(\n context,\n normalizedContextConfig\n );\n const credentialReferencePathOverrides = collectContextConfigCredentialReferencePathOverrides(\n context,\n normalizedContextConfig\n );\n const headersReferenceOverride = collectContextConfigHeadersReferenceOverride(\n context,\n contextConfigId,\n contextConfigFilePath\n );\n\n contextConfigRecordsById.set(contextConfigId, {\n id: contextConfigId,\n filePath: contextConfigFilePath,\n payload: {\n contextConfigId,\n ...normalizedContextConfig,\n ...(headersReferenceOverride && {\n headersReference: headersReferenceOverride,\n }),\n ...(credentialReferenceOverrides && {\n referenceOverrides: {\n credentialReferences: credentialReferenceOverrides,\n },\n }),\n ...(credentialReferencePathOverrides && {\n referencePathOverrides: {\n credentialReferences: credentialReferencePathOverrides,\n },\n }),\n } as Parameters<typeof generateContextConfigDefinition>[0],\n });\n }\n\n return [...contextConfigRecordsById.values()];\n },\n generate: generateContextConfigDefinition,\n} satisfies GenerationTask<Parameters<typeof generateContextConfigDefinition>[0]>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"context-config-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/context-config-generator.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { ObjectLiteralExpression, SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport {\n applyPromptHeaderTemplateSchema,\n asRecord,\n collectHeaderTemplateVariablesFromAgentPrompts,\n} from '../collector-common';\nimport {\n collectContextConfigCredentialReferenceOverrides,\n collectContextConfigCredentialReferencePathOverrides,\n collectContextConfigHeadersReferenceOverride,\n} from '../collector-reference-helpers';\nimport type { GenerationTask } from '../generation-types';\nimport { addNamedImports, applyImportPlan, createImportPlan } from '../import-plan';\nimport { generateValidatedSourceFile } from '../simple-factory-generator';\nimport {\n addFactoryConfigVariable,\n addValueToObject,\n codeExpression,\n codeReference,\n convertJsonSchemaToZodSafe,\n createInMemoryProject,\n isPlainObject,\n toCamelCase,\n} from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.agents.valueType.shape.contextConfig.unwrap();\n\nconst ReferenceNameByIdSchema = z.record(z.string(), z.string().nonempty());\n\nconst ReferenceOverridesSchema = z.object({\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\nconst ReferencePathOverridesSchema = z.object({\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\ninterface NormalizedContextVariableEntry {\n referenceName: string;\n rawValue: unknown;\n fetchDefinitionData?: Record<string, unknown>;\n}\n\ntype NormalizedContextVariableMap = Record<string, NormalizedContextVariableEntry>;\n\nconst BaseContextConfigSchema = z.strictObject({\n contextConfigId: z.string().nonempty(),\n ...MySchema.shape,\n referenceOverrides: ReferenceOverridesSchema.optional(),\n referencePathOverrides: ReferencePathOverridesSchema.optional(),\n\n // TODO check these fields\n headers: z.string().optional(),\n headersReference: z.string().optional(),\n schema: z.unknown(),\n name: z.string().nullish(),\n trigger: z.unknown(),\n fetchConfig: z.record(z.string(), z.unknown()).optional(),\n defaultValue: z.unknown(),\n responseSchema: z.unknown(),\n});\n\nconst ContextConfigSchema = BaseContextConfigSchema.transform((data) => ({\n ...data,\n normalizedHeadersReference: extractHeadersReference(data.headers),\n normalizedContextVariables: normalizeContextVariables(data.contextVariables),\n}));\n\ntype ContextConfigInput = z.input<typeof ContextConfigSchema>;\ntype ContextConfigOutput = z.output<typeof ContextConfigSchema>;\n\nfunction normalizeContextVariables(\n contextVariables?: Record<string, unknown> | null\n): NormalizedContextVariableMap {\n if (!contextVariables) {\n return {};\n }\n\n const normalizedVariables: NormalizedContextVariableMap = {};\n for (const [key, value] of Object.entries(contextVariables)) {\n const referenceName = extractContextVariableReference(key, value);\n if (!referenceName) {\n continue;\n }\n\n normalizedVariables[key] = {\n referenceName,\n rawValue: value,\n ...(isPlainObject(value) && isFetchDefinitionData(value)\n ? { fetchDefinitionData: value }\n : {}),\n };\n }\n\n return normalizedVariables;\n}\n\nexport function generateContextConfigDefinition(data: ContextConfigInput): SourceFile {\n return generateValidatedSourceFile(data, {\n schema: ContextConfigSchema,\n importName: 'contextConfig',\n render(parsed) {\n const project = createInMemoryProject();\n const sourceFile = project.createSourceFile('context-config-definition.ts', '', {\n overwrite: true,\n });\n\n if (isHeadersDefinitionData(parsed)) {\n return generateStandaloneHeadersDefinition(sourceFile, parsed);\n }\n\n if (isFetchDefinitionData(parsed)) {\n return generateStandaloneFetchDefinition(sourceFile, parsed);\n }\n\n const explicitHeadersReference =\n (typeof parsed.headersReference === 'string' && parsed.headersReference.length > 0\n ? parsed.headersReference\n : undefined) ?? parsed.normalizedHeadersReference;\n const templateHeaderVariables = collectTemplateHeaderVariables(\n parsed.normalizedContextVariables\n );\n const inferredHeadersSchema =\n !isPlainObject(parsed.headersSchema) && !explicitHeadersReference\n ? inferHeadersSchemaFromTemplateHeaderVariables(templateHeaderVariables)\n : undefined;\n const headersSchema = isPlainObject(parsed.headersSchema)\n ? parsed.headersSchema\n : inferredHeadersSchema;\n const headersReference = resolveHeadersReference(parsed, Boolean(headersSchema));\n const shouldDefineHeadersInFile = Boolean(headersReference) && isPlainObject(headersSchema);\n const fetchDefinitions = collectFetchDefinitionEntries(parsed.normalizedContextVariables);\n const credentialReferenceNames = collectCredentialReferenceNames(\n fetchDefinitions,\n parsed.referenceOverrides?.credentialReferences\n );\n const coreImports = ['contextConfig'];\n if (shouldDefineHeadersInFile) {\n coreImports.unshift('headers');\n }\n if (fetchDefinitions.length > 0) {\n coreImports.splice(coreImports.length - 1, 0, 'fetchDefinition');\n }\n\n const importPlan = createImportPlan();\n addNamedImports(importPlan, '@inkeep/agents-core', coreImports);\n\n const hasResponseSchemas = fetchDefinitions.some((definition) =>\n isPlainObject(definition.data.responseSchema)\n );\n if (shouldDefineHeadersInFile || hasResponseSchemas) {\n addNamedImports(importPlan, 'zod', 'z');\n }\n\n for (const [credentialId, credentialReferenceName] of credentialReferenceNames) {\n const credentialReferencePath =\n parsed.referencePathOverrides?.credentialReferences?.[credentialId] ?? credentialId;\n addNamedImports(\n importPlan,\n `../credentials/${credentialReferencePath}`,\n credentialReferenceName\n );\n }\n applyImportPlan(sourceFile, importPlan);\n if (shouldDefineHeadersInFile && headersReference && headersSchema) {\n const { configObject: headersObject } = addFactoryConfigVariable({\n sourceFile,\n isExported: true,\n importName: 'headers',\n variableName: headersReference,\n });\n\n addValueToObject(headersObject, 'schema', createSchemaExpression(headersSchema));\n }\n\n for (const fetchDefinition of fetchDefinitions) {\n const { configObject: fetchConfigObject } = addFactoryConfigVariable({\n sourceFile,\n importName: 'fetchDefinition',\n variableName: fetchDefinition.variableName,\n });\n writeFetchDefinition(\n fetchConfigObject,\n fetchDefinition.data,\n credentialReferenceNames,\n headersReference\n );\n }\n const contextConfigVarName = toContextConfigVariableName(parsed.contextConfigId);\n const { configObject } = addFactoryConfigVariable({\n sourceFile,\n importName: 'contextConfig',\n variableName: contextConfigVarName,\n isExported: true,\n });\n\n writeContextConfig(configObject, parsed, headersReference);\n\n return sourceFile;\n },\n });\n}\n\nfunction writeContextConfig(\n configObject: ObjectLiteralExpression,\n data: ContextConfigOutput,\n headersReference?: string\n) {\n const contextConfig: Record<string, unknown> = {};\n if (data.id !== undefined) {\n contextConfig.id = data.id;\n }\n if (headersReference) {\n contextConfig.headers = codeReference(headersReference);\n }\n if (Object.keys(data.normalizedContextVariables).length > 0) {\n const contextVariables: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data.normalizedContextVariables)) {\n contextVariables[key] = codeReference(value.referenceName);\n }\n contextConfig.contextVariables = contextVariables;\n }\n\n for (const [key, value] of Object.entries(contextConfig)) {\n addValueToObject(configObject, key, value);\n }\n}\n\nfunction extractHeadersReference(headers?: string | { id?: string; name?: string }) {\n if (!headers) {\n return undefined;\n }\n if (typeof headers === 'string') {\n return headers;\n }\n if (typeof headers.id === 'string') {\n return headers.id;\n }\n if (typeof headers.name === 'string') {\n return headers.name;\n }\n return undefined;\n}\n\nfunction resolveHeadersReference(\n data: ContextConfigOutput,\n hasHeadersSchema: boolean\n): string | undefined {\n if (typeof data.headersReference === 'string' && data.headersReference) {\n return data.headersReference;\n }\n\n const headersRef = extractHeadersReference(data.headers);\n if (headersRef) {\n return toReferenceIdentifier(headersRef);\n }\n\n if (hasHeadersSchema) {\n return `${toContextConfigVariableName(data.contextConfigId)}Headers`;\n }\n\n return undefined;\n}\n\nfunction isFetchDefinitionData(value: unknown): boolean {\n if (!isPlainObject(value)) {\n return false;\n }\n\n return value.fetchConfig !== undefined || value.responseSchema !== undefined;\n}\n\nfunction collectFetchDefinitionEntries(\n contextVariables?: NormalizedContextVariableMap\n): Array<{ key: string; variableName: string; data: Record<string, unknown> }> {\n if (!contextVariables || Object.keys(contextVariables).length === 0) {\n return [];\n }\n\n return Object.entries(contextVariables)\n .filter(([, value]) => Boolean(value.fetchDefinitionData))\n .map(([key, value]) => ({\n key,\n variableName: value.referenceName,\n data: value.fetchDefinitionData as Record<string, unknown>,\n }));\n}\n\nfunction writeFetchDefinition(\n configObject: ObjectLiteralExpression,\n fetchDefinitionData: unknown,\n credentialReferenceNames?: Map<string, string>,\n headersReference?: string\n) {\n const {\n contextConfigId,\n responseSchema,\n credentialReferenceId,\n normalizedHeadersReference: _normalizedHeadersReference,\n normalizedContextVariables: _normalizedContextVariables,\n ...rest\n } = isPlainObject(fetchDefinitionData) ? fetchDefinitionData : {};\n const normalizedRest = rewriteHeaderTemplates(rest, headersReference);\n const fetchDefinition: Record<string, unknown> = {};\n for (const [k, v] of Object.entries({\n id: contextConfigId,\n ...normalizedRest,\n })) {\n if (v !== null) {\n fetchDefinition[k] = v;\n }\n }\n if (responseSchema) {\n fetchDefinition.responseSchema = createSchemaExpression(\n responseSchema as Record<string, unknown>\n );\n }\n\n if (\n typeof credentialReferenceId === 'string' &&\n credentialReferenceNames?.has(credentialReferenceId)\n ) {\n fetchDefinition.credentialReference = codeReference(\n credentialReferenceNames.get(credentialReferenceId) as string\n );\n } else if (typeof credentialReferenceId === 'string') {\n fetchDefinition.credentialReferenceId = credentialReferenceId;\n }\n\n for (const [key, value] of Object.entries(fetchDefinition)) {\n addValueToObject(configObject, key, value);\n }\n}\n\nconst HEADER_TEMPLATE_REGEX = /\\{\\{headers\\.([^}]+)\\}\\}/g;\nconst HEADER_TO_TEMPLATE_CALL_REGEX =\n /\\$\\{\\s*(headersSchema|headers)\\.toTemplate\\((['\"])([^'\"`]+)\\2\\)\\s*\\}/g;\n\nfunction rewriteHeaderTemplates<T>(value: T, headersReference?: string): T {\n if (!headersReference) {\n return value;\n }\n\n if (typeof value === 'string') {\n const withHeaderTokensReplaced = value.replace(\n HEADER_TEMPLATE_REGEX,\n (_, variableName: string) => {\n return `\\${${headersReference}.toTemplate(${JSON.stringify(variableName)})}`;\n }\n );\n return withHeaderTokensReplaced.replace(\n HEADER_TO_TEMPLATE_CALL_REGEX,\n (_, __: string, ___: string, variableName: string) => {\n return `\\${${headersReference}.toTemplate(${JSON.stringify(variableName)})}`;\n }\n ) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => rewriteHeaderTemplates(entry, headersReference)) as T;\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entryValue]) => [\n key,\n rewriteHeaderTemplates(entryValue, headersReference),\n ])\n ) as T;\n }\n\n return value;\n}\n\nfunction generateStandaloneHeadersDefinition(\n sourceFile: SourceFile,\n data: ContextConfigOutput & { schema: Record<string, unknown> }\n): SourceFile {\n const importName = 'headers';\n const importPlan = createImportPlan();\n addNamedImports(importPlan, '@inkeep/agents-core', importName);\n addNamedImports(importPlan, 'zod', 'z');\n applyImportPlan(sourceFile, importPlan);\n\n const headersVarName = toContextConfigVariableName(data.contextConfigId);\n const { configObject } = addFactoryConfigVariable({\n sourceFile,\n importName,\n variableName: headersVarName,\n });\n\n addValueToObject(configObject, 'schema', createSchemaExpression(data.schema));\n return sourceFile;\n}\n\nfunction isHeadersDefinitionData(\n value: ContextConfigOutput\n): value is ContextConfigOutput & { schema: Record<string, unknown> } {\n return isPlainObject(value.schema);\n}\n\nfunction generateStandaloneFetchDefinition(\n sourceFile: SourceFile,\n data: ContextConfigOutput\n): SourceFile {\n const importName = 'fetchDefinition';\n const importPlan = createImportPlan();\n addNamedImports(importPlan, '@inkeep/agents-core', importName);\n\n if (isPlainObject(data.responseSchema)) {\n addNamedImports(importPlan, 'zod', 'z');\n }\n\n const credentialReferenceNames = new Map<string, string>();\n if (typeof (data as Record<string, unknown>).credentialReferenceId === 'string') {\n const credentialReferenceId = (data as Record<string, unknown>).credentialReferenceId as string;\n const credentialReferenceName =\n data.referenceOverrides?.credentialReferences?.[credentialReferenceId] ??\n toReferenceIdentifier(credentialReferenceId);\n const credentialReferencePath =\n data.referencePathOverrides?.credentialReferences?.[credentialReferenceId] ??\n credentialReferenceId;\n credentialReferenceNames.set(credentialReferenceId, credentialReferenceName);\n addNamedImports(\n importPlan,\n `../credentials/${credentialReferencePath}`,\n credentialReferenceName\n );\n }\n applyImportPlan(sourceFile, importPlan);\n\n const fetchVarName = toContextConfigVariableName(data.contextConfigId);\n const { configObject } = addFactoryConfigVariable({\n sourceFile,\n importName,\n variableName: fetchVarName,\n });\n\n writeFetchDefinition(configObject, data, credentialReferenceNames);\n return sourceFile;\n}\n\nfunction convertJsonSchemaToZod(schema: Record<string, unknown>): string {\n return convertJsonSchemaToZodSafe(schema, {\n conversionOptions: { module: 'none' },\n });\n}\n\nfunction createSchemaExpression(schema: Record<string, unknown>) {\n return codeExpression(convertJsonSchemaToZod(schema));\n}\n\nfunction extractContextVariableReference(key: string, value: unknown): string | undefined {\n if (typeof value === 'string') {\n return toReferenceIdentifier(value);\n }\n\n if (!isPlainObject(value)) {\n return;\n }\n\n if (typeof value.id === 'string') {\n return toReferenceIdentifier(value.id);\n }\n if (typeof value.name === 'string') {\n return toReferenceIdentifier(value.name);\n }\n if (typeof value.ref === 'string') {\n return toReferenceIdentifier(value.ref);\n }\n if (typeof value.variable === 'string') {\n return toReferenceIdentifier(value.variable);\n }\n\n if (value.fetchConfig || value.responseSchema) {\n return toReferenceIdentifier(key);\n }\n\n return toReferenceIdentifier(key);\n}\n\nconst toContextConfigVariableName = toCamelCase;\n\nconst toReferenceIdentifier = toCamelCase;\n\nfunction collectCredentialReferenceNames(\n fetchDefinitions: Array<{ data: unknown }>,\n overrideNamesById?: Record<string, string>\n): Map<string, string> {\n const credentialReferenceNames = new Map<string, string>();\n\n for (const fetchDefinition of fetchDefinitions) {\n const fetchDefinitionData = isPlainObject(fetchDefinition.data)\n ? fetchDefinition.data\n : undefined;\n const credentialReferenceId =\n fetchDefinitionData && typeof fetchDefinitionData.credentialReferenceId === 'string'\n ? fetchDefinitionData.credentialReferenceId\n : undefined;\n if (!credentialReferenceId || credentialReferenceNames.has(credentialReferenceId)) {\n continue;\n }\n\n credentialReferenceNames.set(\n credentialReferenceId,\n overrideNamesById?.[credentialReferenceId] ?? toReferenceIdentifier(credentialReferenceId)\n );\n }\n\n return credentialReferenceNames;\n}\n\nfunction collectTemplateHeaderVariables(\n contextVariables?: NormalizedContextVariableMap\n): Set<string> {\n const variables = new Set<string>();\n for (const value of Object.values(contextVariables ?? {})) {\n collectTemplateHeaderVariablesFromValue(value.rawValue, variables);\n }\n return variables;\n}\n\nfunction collectTemplateHeaderVariablesFromValue(value: unknown, variables: Set<string>): void {\n if (typeof value === 'string') {\n for (const match of value.matchAll(HEADER_TEMPLATE_REGEX)) {\n if (match[1]) {\n variables.add(match[1]);\n }\n }\n for (const match of value.matchAll(HEADER_TO_TEMPLATE_CALL_REGEX)) {\n if (match[3]) {\n variables.add(match[3]);\n }\n }\n return;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectTemplateHeaderVariablesFromValue(entry, variables);\n }\n return;\n }\n\n if (isPlainObject(value)) {\n for (const entryValue of Object.values(value)) {\n collectTemplateHeaderVariablesFromValue(entryValue, variables);\n }\n }\n}\n\nfunction inferHeadersSchemaFromTemplateHeaderVariables(\n variables: Set<string>\n): Record<string, unknown> | undefined {\n if (!variables.size) {\n return;\n }\n\n const properties: Record<string, unknown> = {};\n for (const variable of [...variables].sort()) {\n properties[variable] = { type: 'string' };\n }\n\n return {\n type: 'object',\n properties,\n required: [...variables].sort(),\n additionalProperties: false,\n };\n}\n\ntype GeneratorParams = Parameters<typeof generateContextConfigDefinition>[0];\n\nexport const task: GenerationTask<GeneratorParams> = {\n type: 'context-config',\n collect(context) {\n if (!context.project.agents) {\n return [];\n }\n\n const contextConfigRecordsById = new Map<\n string,\n ReturnType<GenerationTask<GeneratorParams>['collect']>[number]\n >();\n\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n const contextConfig = agentData ? asRecord(agentData.contextConfig) : undefined;\n if (!agentData || !contextConfig) {\n continue;\n }\n\n const normalizedContextConfig = applyPromptHeaderTemplateSchema(\n contextConfig,\n collectHeaderTemplateVariablesFromAgentPrompts(agentData)\n );\n const contextConfigId =\n typeof normalizedContextConfig.id === 'string' ? normalizedContextConfig.id : '';\n if (!contextConfigId || contextConfigRecordsById.has(contextConfigId)) {\n continue;\n }\n\n const contextConfigFilePath = context.resolver.resolveOutputFilePath(\n 'contextConfigs',\n contextConfigId,\n join(context.paths.contextConfigsDir, `${contextConfigId}.ts`)\n );\n const credentialReferenceOverrides = collectContextConfigCredentialReferenceOverrides(\n context,\n normalizedContextConfig\n );\n const credentialReferencePathOverrides = collectContextConfigCredentialReferencePathOverrides(\n context,\n normalizedContextConfig\n );\n const headersReferenceOverride = collectContextConfigHeadersReferenceOverride(\n context,\n contextConfigId,\n contextConfigFilePath\n );\n\n contextConfigRecordsById.set(contextConfigId, {\n id: contextConfigId,\n filePath: contextConfigFilePath,\n payload: {\n contextConfigId,\n ...normalizedContextConfig,\n ...(headersReferenceOverride && {\n headersReference: headersReferenceOverride,\n }),\n ...(credentialReferenceOverrides && {\n referenceOverrides: {\n credentialReferences: credentialReferenceOverrides,\n },\n }),\n ...(credentialReferencePathOverrides && {\n referencePathOverrides: {\n credentialReferences: credentialReferencePathOverrides,\n },\n }),\n } as GeneratorParams,\n });\n }\n\n return [...contextConfigRecordsById.values()];\n },\n generate: generateContextConfigDefinition,\n};\n"],"mappings":"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"}