@inkeep/agents-cli 0.59.3 → 0.59.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/agents-cli/package.js +1 -1
  2. package/dist/commands/pull-v4/collector-common.js +128 -0
  3. package/dist/commands/pull-v4/collector-common.js.map +1 -0
  4. package/dist/commands/pull-v4/collector-reference-helpers.js +323 -0
  5. package/dist/commands/pull-v4/collector-reference-helpers.js.map +1 -0
  6. package/dist/commands/pull-v4/component-parser.js +2 -1
  7. package/dist/commands/pull-v4/component-parser.js.map +1 -1
  8. package/dist/commands/pull-v4/file-scope.js +43 -0
  9. package/dist/commands/pull-v4/file-scope.js.map +1 -0
  10. package/dist/commands/pull-v4/generation-resolver.js +305 -0
  11. package/dist/commands/pull-v4/generation-resolver.js.map +1 -0
  12. package/dist/commands/pull-v4/generation-types.js +56 -0
  13. package/dist/commands/pull-v4/generation-types.js.map +1 -0
  14. package/dist/commands/pull-v4/generators/agent-generator.helpers.js +4 -10
  15. package/dist/commands/pull-v4/generators/agent-generator.helpers.js.map +1 -1
  16. package/dist/commands/pull-v4/generators/agent-generator.js +154 -81
  17. package/dist/commands/pull-v4/generators/agent-generator.js.map +1 -1
  18. package/dist/commands/pull-v4/generators/artifact-component-generator.js +48 -27
  19. package/dist/commands/pull-v4/generators/artifact-component-generator.js.map +1 -1
  20. package/dist/commands/pull-v4/generators/context-config-generator.js +147 -129
  21. package/dist/commands/pull-v4/generators/context-config-generator.js.map +1 -1
  22. package/dist/commands/pull-v4/generators/credential-generator.js +36 -14
  23. package/dist/commands/pull-v4/generators/credential-generator.js.map +1 -1
  24. package/dist/commands/pull-v4/generators/data-component-generator.js +55 -19
  25. package/dist/commands/pull-v4/generators/data-component-generator.js.map +1 -1
  26. package/dist/commands/pull-v4/generators/environment-generator.js +29 -33
  27. package/dist/commands/pull-v4/generators/environment-generator.js.map +1 -1
  28. package/dist/commands/pull-v4/generators/environment-settings-generator.js +57 -0
  29. package/dist/commands/pull-v4/generators/environment-settings-generator.js.map +1 -0
  30. package/dist/commands/pull-v4/generators/external-agent-generator.js +51 -23
  31. package/dist/commands/pull-v4/generators/external-agent-generator.js.map +1 -1
  32. package/dist/commands/pull-v4/generators/function-tool-generator.js +50 -14
  33. package/dist/commands/pull-v4/generators/function-tool-generator.js.map +1 -1
  34. package/dist/commands/pull-v4/generators/helpers/agent.js +129 -0
  35. package/dist/commands/pull-v4/generators/helpers/agent.js.map +1 -0
  36. package/dist/commands/pull-v4/generators/helpers/sub-agent.js +65 -0
  37. package/dist/commands/pull-v4/generators/helpers/sub-agent.js.map +1 -0
  38. package/dist/commands/pull-v4/generators/index.js +38 -0
  39. package/dist/commands/pull-v4/generators/index.js.map +1 -0
  40. package/dist/commands/pull-v4/generators/mcp-tool-generator.js +48 -27
  41. package/dist/commands/pull-v4/generators/mcp-tool-generator.js.map +1 -1
  42. package/dist/commands/pull-v4/generators/project-generator.js +144 -110
  43. package/dist/commands/pull-v4/generators/project-generator.js.map +1 -1
  44. package/dist/commands/pull-v4/generators/scheduled-trigger-generator.js +66 -0
  45. package/dist/commands/pull-v4/generators/scheduled-trigger-generator.js.map +1 -0
  46. package/dist/commands/pull-v4/generators/status-component-generator.js +55 -20
  47. package/dist/commands/pull-v4/generators/status-component-generator.js.map +1 -1
  48. package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js +4 -1
  49. package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js.map +1 -1
  50. package/dist/commands/pull-v4/generators/sub-agent-generator.js +282 -166
  51. package/dist/commands/pull-v4/generators/sub-agent-generator.js.map +1 -1
  52. package/dist/commands/pull-v4/generators/trigger-generator.js +62 -27
  53. package/dist/commands/pull-v4/generators/trigger-generator.js.map +1 -1
  54. package/dist/commands/pull-v4/import-plan.js +40 -0
  55. package/dist/commands/pull-v4/import-plan.js.map +1 -0
  56. package/dist/commands/pull-v4/introspect/index.js +11 -7
  57. package/dist/commands/pull-v4/introspect/index.js.map +1 -1
  58. package/dist/commands/pull-v4/introspect-generator.js +15 -1218
  59. package/dist/commands/pull-v4/introspect-generator.js.map +1 -1
  60. package/dist/commands/pull-v4/module-merge.js +14 -5
  61. package/dist/commands/pull-v4/module-merge.js.map +1 -1
  62. package/dist/commands/pull-v4/reference-resolution.js +111 -0
  63. package/dist/commands/pull-v4/reference-resolution.js.map +1 -0
  64. package/dist/commands/pull-v4/simple-factory-generator.js +54 -0
  65. package/dist/commands/pull-v4/simple-factory-generator.js.map +1 -0
  66. package/dist/commands/pull-v4/{generators/skill-generator.js → skill.js} +18 -6
  67. package/dist/commands/pull-v4/skill.js.map +1 -0
  68. package/dist/commands/pull-v4/typescript-file-writer.js +78 -0
  69. package/dist/commands/pull-v4/typescript-file-writer.js.map +1 -0
  70. package/dist/commands/pull-v4/utils/code-values.js +64 -0
  71. package/dist/commands/pull-v4/utils/code-values.js.map +1 -0
  72. package/dist/commands/pull-v4/utils/factory-writer.js +128 -0
  73. package/dist/commands/pull-v4/utils/factory-writer.js.map +1 -0
  74. package/dist/commands/pull-v4/utils/index.js +8 -0
  75. package/dist/commands/pull-v4/utils/naming.js +74 -0
  76. package/dist/commands/pull-v4/utils/naming.js.map +1 -0
  77. package/dist/commands/pull-v4/utils/schema-rendering.js +20 -0
  78. package/dist/commands/pull-v4/utils/schema-rendering.js.map +1 -0
  79. package/dist/commands/pull-v4/utils/shared.js +18 -0
  80. package/dist/commands/pull-v4/utils/shared.js.map +1 -0
  81. package/dist/commands/pull-v4/utils/templates.js +58 -0
  82. package/dist/commands/pull-v4/utils/templates.js.map +1 -0
  83. package/package.json +4 -4
  84. package/dist/commands/pull-v4/generators/skill-generator.js.map +0 -1
  85. package/dist/commands/pull-v4/scheduled-trigger-generator.js +0 -38
  86. package/dist/commands/pull-v4/scheduled-trigger-generator.js.map +0 -1
  87. package/dist/commands/pull-v4/utils.js +0 -320
  88. package/dist/commands/pull-v4/utils.js.map +0 -1
@@ -1,7 +1,16 @@
1
- import { addFactoryConfigVariable, addStringProperty, addValueToObject, convertJsonSchemaToZodSafe, createInMemoryProject, formatPropertyName, isPlainObject, toCamelCase } from "../utils.js";
1
+ import { isPlainObject } from "../utils/shared.js";
2
+ import { codeExpression, codeReference } from "../utils/code-values.js";
3
+ import { toCamelCase } from "../utils/naming.js";
4
+ import { addFactoryConfigVariable, addValueToObject, createInMemoryProject } from "../utils/factory-writer.js";
5
+ import { convertJsonSchemaToZodSafe } from "../utils/schema-rendering.js";
6
+ import "../utils/index.js";
7
+ import { applyPromptHeaderTemplateSchema, asRecord, collectHeaderTemplateVariablesFromAgentPrompts } from "../collector-common.js";
8
+ import { collectContextConfigCredentialReferenceOverrides, collectContextConfigCredentialReferencePathOverrides, collectContextConfigHeadersReferenceOverride } from "../collector-reference-helpers.js";
9
+ import { generateValidatedSourceFile } from "../simple-factory-generator.js";
10
+ import { addNamedImports, applyImportPlan, createImportPlan } from "../import-plan.js";
2
11
  import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
3
12
  import { z } from "zod";
4
- import { SyntaxKind } from "ts-morph";
13
+ import { join } from "node:path";
5
14
 
6
15
  //#region src/commands/pull-v4/generators/context-config-generator.ts
7
16
  const MySchema = FullProjectDefinitionSchema.shape.agents.valueType.shape.contextConfig.unwrap();
@@ -21,91 +30,88 @@ const ContextConfigSchema = z.strictObject({
21
30
  fetchConfig: z.record(z.string(), z.unknown()).optional(),
22
31
  defaultValue: z.unknown(),
23
32
  responseSchema: z.unknown()
24
- });
25
- function generateContextConfigDefinition(data) {
26
- const result = ContextConfigSchema.safeParse(data);
27
- if (!result.success) throw new Error(`Validation failed for context config:\n${z.prettifyError(result.error)}`);
28
- const project = createInMemoryProject();
29
- const parsed = result.data;
30
- const sourceFile = project.createSourceFile("context-config-definition.ts", "", { overwrite: true });
31
- if (isHeadersDefinitionData(parsed)) return generateStandaloneHeadersDefinition(sourceFile, parsed);
32
- if (isFetchDefinitionData(parsed)) return generateStandaloneFetchDefinition(sourceFile, parsed);
33
- const explicitHeadersReference = (typeof parsed.headersReference === "string" && parsed.headersReference.length > 0 ? parsed.headersReference : void 0) ?? extractHeadersReference(parsed.headers);
34
- const templateHeaderVariables = collectTemplateHeaderVariables(parsed.contextVariables);
35
- const inferredHeadersSchema = !isPlainObject(parsed.headersSchema) && !explicitHeadersReference ? inferHeadersSchemaFromTemplateHeaderVariables(templateHeaderVariables) : void 0;
36
- const headersSchema = isPlainObject(parsed.headersSchema) ? parsed.headersSchema : inferredHeadersSchema;
37
- const headersReference = resolveHeadersReference(parsed, Boolean(headersSchema));
38
- const shouldDefineHeadersInFile = Boolean(headersReference) && isPlainObject(headersSchema);
39
- const fetchDefinitions = collectFetchDefinitionEntries(parsed.contextVariables);
40
- const credentialReferenceNames = collectCredentialReferenceNames(fetchDefinitions, parsed.referenceOverrides?.credentialReferences);
41
- const coreImports = ["contextConfig"];
42
- if (shouldDefineHeadersInFile) coreImports.unshift("headers");
43
- if (fetchDefinitions.length > 0) coreImports.splice(coreImports.length - 1, 0, "fetchDefinition");
44
- sourceFile.addImportDeclaration({
45
- namedImports: coreImports,
46
- moduleSpecifier: "@inkeep/agents-core"
47
- });
48
- const hasResponseSchemas = fetchDefinitions.some((definition) => isPlainObject(definition.data.responseSchema));
49
- if (shouldDefineHeadersInFile || hasResponseSchemas) sourceFile.addImportDeclaration({
50
- namedImports: ["z"],
51
- moduleSpecifier: "zod"
52
- });
53
- for (const [credentialId, credentialReferenceName] of credentialReferenceNames) {
54
- const credentialReferencePath = parsed.referencePathOverrides?.credentialReferences?.[credentialId] ?? credentialId;
55
- sourceFile.addImportDeclaration({
56
- namedImports: [credentialReferenceName],
57
- moduleSpecifier: `../credentials/${credentialReferencePath}`
58
- });
59
- }
60
- if (shouldDefineHeadersInFile && headersReference && headersSchema) {
61
- const { configObject: headersObject } = addFactoryConfigVariable({
62
- sourceFile,
63
- isExported: true,
64
- importName: "headers",
65
- variableName: headersReference
66
- });
67
- headersObject.addPropertyAssignment({
68
- name: "schema",
69
- initializer: convertJsonSchemaToZod(headersSchema)
70
- });
71
- }
72
- for (const fetchDefinition of fetchDefinitions) {
73
- const { configObject: fetchConfigObject } = addFactoryConfigVariable({
74
- sourceFile,
75
- importName: "fetchDefinition",
76
- variableName: fetchDefinition.variableName
77
- });
78
- writeFetchDefinition(fetchConfigObject, fetchDefinition.data, credentialReferenceNames, headersReference);
33
+ }).transform((data) => ({
34
+ ...data,
35
+ normalizedHeadersReference: extractHeadersReference(data.headers),
36
+ normalizedContextVariables: normalizeContextVariables(data.contextVariables)
37
+ }));
38
+ function normalizeContextVariables(contextVariables) {
39
+ if (!contextVariables) return {};
40
+ const normalizedVariables = {};
41
+ for (const [key, value] of Object.entries(contextVariables)) {
42
+ const referenceName = extractContextVariableReference(key, value);
43
+ if (!referenceName) continue;
44
+ normalizedVariables[key] = {
45
+ referenceName,
46
+ rawValue: value,
47
+ ...isPlainObject(value) && isFetchDefinitionData(value) ? { fetchDefinitionData: value } : {}
48
+ };
79
49
  }
80
- const { configObject } = addFactoryConfigVariable({
81
- sourceFile,
50
+ return normalizedVariables;
51
+ }
52
+ function generateContextConfigDefinition(data) {
53
+ return generateValidatedSourceFile(data, {
54
+ schema: ContextConfigSchema,
82
55
  importName: "contextConfig",
83
- variableName: toContextConfigVariableName(parsed.contextConfigId),
84
- isExported: true
56
+ render(parsed) {
57
+ const sourceFile = createInMemoryProject().createSourceFile("context-config-definition.ts", "", { overwrite: true });
58
+ if (isHeadersDefinitionData(parsed)) return generateStandaloneHeadersDefinition(sourceFile, parsed);
59
+ if (isFetchDefinitionData(parsed)) return generateStandaloneFetchDefinition(sourceFile, parsed);
60
+ const explicitHeadersReference = (typeof parsed.headersReference === "string" && parsed.headersReference.length > 0 ? parsed.headersReference : void 0) ?? parsed.normalizedHeadersReference;
61
+ const templateHeaderVariables = collectTemplateHeaderVariables(parsed.normalizedContextVariables);
62
+ const inferredHeadersSchema = !isPlainObject(parsed.headersSchema) && !explicitHeadersReference ? inferHeadersSchemaFromTemplateHeaderVariables(templateHeaderVariables) : void 0;
63
+ const headersSchema = isPlainObject(parsed.headersSchema) ? parsed.headersSchema : inferredHeadersSchema;
64
+ const headersReference = resolveHeadersReference(parsed, Boolean(headersSchema));
65
+ const shouldDefineHeadersInFile = Boolean(headersReference) && isPlainObject(headersSchema);
66
+ const fetchDefinitions = collectFetchDefinitionEntries(parsed.normalizedContextVariables);
67
+ const credentialReferenceNames = collectCredentialReferenceNames(fetchDefinitions, parsed.referenceOverrides?.credentialReferences);
68
+ const coreImports = ["contextConfig"];
69
+ if (shouldDefineHeadersInFile) coreImports.unshift("headers");
70
+ if (fetchDefinitions.length > 0) coreImports.splice(coreImports.length - 1, 0, "fetchDefinition");
71
+ const importPlan = createImportPlan();
72
+ addNamedImports(importPlan, "@inkeep/agents-core", coreImports);
73
+ const hasResponseSchemas = fetchDefinitions.some((definition) => isPlainObject(definition.data.responseSchema));
74
+ if (shouldDefineHeadersInFile || hasResponseSchemas) addNamedImports(importPlan, "zod", "z");
75
+ for (const [credentialId, credentialReferenceName] of credentialReferenceNames) addNamedImports(importPlan, `../credentials/${parsed.referencePathOverrides?.credentialReferences?.[credentialId] ?? credentialId}`, credentialReferenceName);
76
+ applyImportPlan(sourceFile, importPlan);
77
+ if (shouldDefineHeadersInFile && headersReference && headersSchema) {
78
+ const { configObject: headersObject } = addFactoryConfigVariable({
79
+ sourceFile,
80
+ isExported: true,
81
+ importName: "headers",
82
+ variableName: headersReference
83
+ });
84
+ addValueToObject(headersObject, "schema", createSchemaExpression(headersSchema));
85
+ }
86
+ for (const fetchDefinition of fetchDefinitions) {
87
+ const { configObject: fetchConfigObject } = addFactoryConfigVariable({
88
+ sourceFile,
89
+ importName: "fetchDefinition",
90
+ variableName: fetchDefinition.variableName
91
+ });
92
+ writeFetchDefinition(fetchConfigObject, fetchDefinition.data, credentialReferenceNames, headersReference);
93
+ }
94
+ const { configObject } = addFactoryConfigVariable({
95
+ sourceFile,
96
+ importName: "contextConfig",
97
+ variableName: toContextConfigVariableName(parsed.contextConfigId),
98
+ isExported: true
99
+ });
100
+ writeContextConfig(configObject, parsed, headersReference);
101
+ return sourceFile;
102
+ }
85
103
  });
86
- writeContextConfig(configObject, parsed, headersReference);
87
- return sourceFile;
88
104
  }
89
105
  function writeContextConfig(configObject, data, headersReference) {
90
- if (data.id !== void 0) addStringProperty(configObject, "id", data.id);
91
- if (headersReference) configObject.addPropertyAssignment({
92
- name: "headers",
93
- initializer: headersReference
94
- });
95
- if (data.contextVariables && Object.keys(data.contextVariables).length > 0) {
96
- const contextVariablesObject = configObject.addPropertyAssignment({
97
- name: "contextVariables",
98
- initializer: "{}"
99
- }).getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);
100
- for (const [key, value] of Object.entries(data.contextVariables)) {
101
- const reference = extractContextVariableReference(key, value);
102
- if (!reference) continue;
103
- contextVariablesObject.addPropertyAssignment({
104
- name: formatPropertyName(key),
105
- initializer: reference
106
- });
107
- }
106
+ const contextConfig = {};
107
+ if (data.id !== void 0) contextConfig.id = data.id;
108
+ if (headersReference) contextConfig.headers = codeReference(headersReference);
109
+ if (Object.keys(data.normalizedContextVariables).length > 0) {
110
+ const contextVariables = {};
111
+ for (const [key, value] of Object.entries(data.normalizedContextVariables)) contextVariables[key] = codeReference(value.referenceName);
112
+ contextConfig.contextVariables = contextVariables;
108
113
  }
114
+ for (const [key, value] of Object.entries(contextConfig)) addValueToObject(configObject, key, value);
109
115
  }
110
116
  function extractHeadersReference(headers) {
111
117
  if (!headers) return;
@@ -124,34 +130,25 @@ function isFetchDefinitionData(value) {
124
130
  return value.fetchConfig !== void 0 || value.responseSchema !== void 0;
125
131
  }
126
132
  function collectFetchDefinitionEntries(contextVariables) {
127
- if (!contextVariables) return [];
128
- return Object.entries(contextVariables).filter(([, value]) => isFetchDefinitionData(value)).map(([key, value]) => {
129
- return {
130
- key,
131
- variableName: extractContextVariableReference(key, value) ?? toReferenceIdentifier(key),
132
- data: value
133
- };
134
- });
133
+ if (!contextVariables || Object.keys(contextVariables).length === 0) return [];
134
+ return Object.entries(contextVariables).filter(([, value]) => Boolean(value.fetchDefinitionData)).map(([key, value]) => ({
135
+ key,
136
+ variableName: value.referenceName,
137
+ data: value.fetchDefinitionData
138
+ }));
135
139
  }
136
140
  function writeFetchDefinition(configObject, fetchDefinitionData, credentialReferenceNames, headersReference) {
137
- const { contextConfigId, responseSchema, credentialReferenceId, ...rest } = isPlainObject(fetchDefinitionData) ? fetchDefinitionData : {};
141
+ const { contextConfigId, responseSchema, credentialReferenceId, normalizedHeadersReference: _normalizedHeadersReference, normalizedContextVariables: _normalizedContextVariables, ...rest } = isPlainObject(fetchDefinitionData) ? fetchDefinitionData : {};
138
142
  const normalizedRest = rewriteHeaderTemplates(rest, headersReference);
143
+ const fetchDefinition = {};
139
144
  for (const [k, v] of Object.entries({
140
145
  id: contextConfigId,
141
146
  ...normalizedRest
142
- })) if (v !== null) addValueToObject(configObject, k, v);
143
- if (responseSchema) configObject.addPropertyAssignment({
144
- name: "responseSchema",
145
- initializer: convertJsonSchemaToZod(responseSchema)
146
- });
147
- if (typeof credentialReferenceId === "string" && credentialReferenceNames?.has(credentialReferenceId)) {
148
- configObject.addPropertyAssignment({
149
- name: "credentialReference",
150
- initializer: credentialReferenceNames.get(credentialReferenceId)
151
- });
152
- return;
153
- }
154
- if (typeof credentialReferenceId === "string") addStringProperty(configObject, "credentialReferenceId", credentialReferenceId);
147
+ })) if (v !== null) fetchDefinition[k] = v;
148
+ if (responseSchema) fetchDefinition.responseSchema = createSchemaExpression(responseSchema);
149
+ if (typeof credentialReferenceId === "string" && credentialReferenceNames?.has(credentialReferenceId)) fetchDefinition.credentialReference = codeReference(credentialReferenceNames.get(credentialReferenceId));
150
+ else if (typeof credentialReferenceId === "string") fetchDefinition.credentialReferenceId = credentialReferenceId;
151
+ for (const [key, value] of Object.entries(fetchDefinition)) addValueToObject(configObject, key, value);
155
152
  }
156
153
  const HEADER_TEMPLATE_REGEX = /\{\{headers\.([^}]+)\}\}/g;
157
154
  const HEADER_TO_TEMPLATE_CALL_REGEX = /\$\{\s*(headersSchema|headers)\.toTemplate\((['"])([^'"`]+)\2\)\s*\}/g;
@@ -168,23 +165,16 @@ function rewriteHeaderTemplates(value, headersReference) {
168
165
  }
169
166
  function generateStandaloneHeadersDefinition(sourceFile, data) {
170
167
  const importName = "headers";
171
- sourceFile.addImportDeclaration({
172
- namedImports: [importName],
173
- moduleSpecifier: "@inkeep/agents-core"
174
- });
175
- sourceFile.addImportDeclaration({
176
- namedImports: ["z"],
177
- moduleSpecifier: "zod"
178
- });
168
+ const importPlan = createImportPlan();
169
+ addNamedImports(importPlan, "@inkeep/agents-core", importName);
170
+ addNamedImports(importPlan, "zod", "z");
171
+ applyImportPlan(sourceFile, importPlan);
179
172
  const { configObject } = addFactoryConfigVariable({
180
173
  sourceFile,
181
174
  importName,
182
175
  variableName: toContextConfigVariableName(data.contextConfigId)
183
176
  });
184
- configObject.addPropertyAssignment({
185
- name: "schema",
186
- initializer: convertJsonSchemaToZod(data.schema)
187
- });
177
+ addValueToObject(configObject, "schema", createSchemaExpression(data.schema));
188
178
  return sourceFile;
189
179
  }
190
180
  function isHeadersDefinitionData(value) {
@@ -192,25 +182,18 @@ function isHeadersDefinitionData(value) {
192
182
  }
193
183
  function generateStandaloneFetchDefinition(sourceFile, data) {
194
184
  const importName = "fetchDefinition";
195
- sourceFile.addImportDeclaration({
196
- namedImports: [importName],
197
- moduleSpecifier: "@inkeep/agents-core"
198
- });
199
- if (isPlainObject(data.responseSchema)) sourceFile.addImportDeclaration({
200
- namedImports: ["z"],
201
- moduleSpecifier: "zod"
202
- });
185
+ const importPlan = createImportPlan();
186
+ addNamedImports(importPlan, "@inkeep/agents-core", importName);
187
+ if (isPlainObject(data.responseSchema)) addNamedImports(importPlan, "zod", "z");
203
188
  const credentialReferenceNames = /* @__PURE__ */ new Map();
204
189
  if (typeof data.credentialReferenceId === "string") {
205
190
  const credentialReferenceId = data.credentialReferenceId;
206
191
  const credentialReferenceName = data.referenceOverrides?.credentialReferences?.[credentialReferenceId] ?? toReferenceIdentifier(credentialReferenceId);
207
192
  const credentialReferencePath = data.referencePathOverrides?.credentialReferences?.[credentialReferenceId] ?? credentialReferenceId;
208
193
  credentialReferenceNames.set(credentialReferenceId, credentialReferenceName);
209
- sourceFile.addImportDeclaration({
210
- namedImports: [credentialReferenceName],
211
- moduleSpecifier: `../credentials/${credentialReferencePath}`
212
- });
194
+ addNamedImports(importPlan, `../credentials/${credentialReferencePath}`, credentialReferenceName);
213
195
  }
196
+ applyImportPlan(sourceFile, importPlan);
214
197
  const { configObject } = addFactoryConfigVariable({
215
198
  sourceFile,
216
199
  importName,
@@ -222,6 +205,9 @@ function generateStandaloneFetchDefinition(sourceFile, data) {
222
205
  function convertJsonSchemaToZod(schema) {
223
206
  return convertJsonSchemaToZodSafe(schema, { conversionOptions: { module: "none" } });
224
207
  }
208
+ function createSchemaExpression(schema) {
209
+ return codeExpression(convertJsonSchemaToZod(schema));
210
+ }
225
211
  function extractContextVariableReference(key, value) {
226
212
  if (typeof value === "string") return toReferenceIdentifier(value);
227
213
  if (!isPlainObject(value)) return;
@@ -246,7 +232,7 @@ function collectCredentialReferenceNames(fetchDefinitions, overrideNamesById) {
246
232
  }
247
233
  function collectTemplateHeaderVariables(contextVariables) {
248
234
  const variables = /* @__PURE__ */ new Set();
249
- collectTemplateHeaderVariablesFromValue(contextVariables, variables);
235
+ for (const value of Object.values(contextVariables ?? {})) collectTemplateHeaderVariablesFromValue(value.rawValue, variables);
250
236
  return variables;
251
237
  }
252
238
  function collectTemplateHeaderVariablesFromValue(value, variables) {
@@ -272,7 +258,39 @@ function inferHeadersSchemaFromTemplateHeaderVariables(variables) {
272
258
  additionalProperties: false
273
259
  };
274
260
  }
261
+ const task = {
262
+ type: "context-config",
263
+ collect(context) {
264
+ if (!context.project.agents) return [];
265
+ const contextConfigRecordsById = /* @__PURE__ */ new Map();
266
+ for (const agentId of context.completeAgentIds) {
267
+ const agentData = context.project.agents[agentId];
268
+ const contextConfig = agentData ? asRecord(agentData.contextConfig) : void 0;
269
+ if (!agentData || !contextConfig) continue;
270
+ const normalizedContextConfig = applyPromptHeaderTemplateSchema(contextConfig, collectHeaderTemplateVariablesFromAgentPrompts(agentData));
271
+ const contextConfigId = typeof normalizedContextConfig.id === "string" ? normalizedContextConfig.id : "";
272
+ if (!contextConfigId || contextConfigRecordsById.has(contextConfigId)) continue;
273
+ const contextConfigFilePath = context.resolver.resolveOutputFilePath("contextConfigs", contextConfigId, join(context.paths.contextConfigsDir, `${contextConfigId}.ts`));
274
+ const credentialReferenceOverrides = collectContextConfigCredentialReferenceOverrides(context, normalizedContextConfig);
275
+ const credentialReferencePathOverrides = collectContextConfigCredentialReferencePathOverrides(context, normalizedContextConfig);
276
+ const headersReferenceOverride = collectContextConfigHeadersReferenceOverride(context, contextConfigId, contextConfigFilePath);
277
+ contextConfigRecordsById.set(contextConfigId, {
278
+ id: contextConfigId,
279
+ filePath: contextConfigFilePath,
280
+ payload: {
281
+ contextConfigId,
282
+ ...normalizedContextConfig,
283
+ ...headersReferenceOverride && { headersReference: headersReferenceOverride },
284
+ ...credentialReferenceOverrides && { referenceOverrides: { credentialReferences: credentialReferenceOverrides } },
285
+ ...credentialReferencePathOverrides && { referencePathOverrides: { credentialReferences: credentialReferencePathOverrides } }
286
+ }
287
+ });
288
+ }
289
+ return [...contextConfigRecordsById.values()];
290
+ },
291
+ generate: generateContextConfigDefinition
292
+ };
275
293
 
276
294
  //#endregion
277
- export { generateContextConfigDefinition };
295
+ export { generateContextConfigDefinition, task };
278
296
  //# sourceMappingURL=context-config-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-config-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/context-config-generator.ts"],"sourcesContent":["import { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport { type ObjectLiteralExpression, type SourceFile, SyntaxKind } from 'ts-morph';\nimport { z } from 'zod';\nimport {\n addFactoryConfigVariable,\n addStringProperty,\n addValueToObject,\n convertJsonSchemaToZodSafe,\n createInMemoryProject,\n formatPropertyName,\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\nconst ContextConfigSchema = 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\ntype ContextConfigInput = z.input<typeof ContextConfigSchema>;\ntype ContextConfigOutput = z.output<typeof ContextConfigSchema>;\n\nexport function generateContextConfigDefinition(data: ContextConfigInput): SourceFile {\n const result = ContextConfigSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Validation failed for context config:\\n${z.prettifyError(result.error)}`);\n }\n\n const project = createInMemoryProject();\n\n const parsed = result.data;\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) ?? extractHeadersReference(parsed.headers);\n const templateHeaderVariables = collectTemplateHeaderVariables(parsed.contextVariables);\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.contextVariables);\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 sourceFile.addImportDeclaration({\n namedImports: coreImports,\n moduleSpecifier: '@inkeep/agents-core',\n });\n\n const hasResponseSchemas = fetchDefinitions.some((definition) =>\n // @ts-expect-error -- fixme\n isPlainObject(definition.data.responseSchema)\n );\n if (shouldDefineHeadersInFile || hasResponseSchemas) {\n sourceFile.addImportDeclaration({\n namedImports: ['z'],\n moduleSpecifier: 'zod',\n });\n }\n\n for (const [credentialId, credentialReferenceName] of credentialReferenceNames) {\n const credentialReferencePath =\n parsed.referencePathOverrides?.credentialReferences?.[credentialId] ?? credentialId;\n sourceFile.addImportDeclaration({\n namedImports: [credentialReferenceName],\n moduleSpecifier: `../credentials/${credentialReferencePath}`,\n });\n }\n if (shouldDefineHeadersInFile && headersReference && headersSchema) {\n const { configObject: headersObject } = addFactoryConfigVariable({\n sourceFile,\n isExported: true,\n importName: 'headers',\n variableName: headersReference,\n });\n\n headersObject.addPropertyAssignment({\n name: 'schema',\n initializer: convertJsonSchemaToZod(headersSchema),\n });\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\nfunction writeContextConfig(\n configObject: ObjectLiteralExpression,\n data: ContextConfigOutput,\n headersReference?: string\n) {\n if (data.id !== undefined) {\n addStringProperty(configObject, 'id', data.id);\n }\n\n if (headersReference) {\n configObject.addPropertyAssignment({\n name: 'headers',\n initializer: headersReference,\n });\n }\n\n if (data.contextVariables && Object.keys(data.contextVariables).length > 0) {\n const contextVariablesProperty = configObject.addPropertyAssignment({\n name: 'contextVariables',\n initializer: '{}',\n });\n const contextVariablesObject = contextVariablesProperty.getInitializerIfKindOrThrow(\n SyntaxKind.ObjectLiteralExpression\n );\n\n for (const [key, value] of Object.entries(data.contextVariables)) {\n const reference = extractContextVariableReference(key, value);\n if (!reference) {\n continue;\n }\n\n contextVariablesObject.addPropertyAssignment({\n name: formatPropertyName(key),\n initializer: reference,\n });\n }\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(contextVariables?: Record<string, unknown>) {\n if (!contextVariables) {\n return [];\n }\n\n return Object.entries(contextVariables)\n .filter(([, value]) => isFetchDefinitionData(value))\n .map(([key, value]) => {\n const variableName =\n extractContextVariableReference(key, value) ?? toReferenceIdentifier(key);\n return {\n key,\n variableName,\n data: value,\n };\n });\n}\n\nfunction writeFetchDefinition(\n configObject: ObjectLiteralExpression,\n fetchDefinitionData: unknown,\n credentialReferenceNames?: Map<string, string>,\n headersReference?: string\n) {\n const { contextConfigId, responseSchema, credentialReferenceId, ...rest } = isPlainObject(\n fetchDefinitionData\n )\n ? fetchDefinitionData\n : {};\n const normalizedRest = rewriteHeaderTemplates(rest, headersReference);\n for (const [k, v] of Object.entries({\n id: contextConfigId,\n ...normalizedRest,\n })) {\n if (v !== null) {\n addValueToObject(configObject, k, v);\n }\n }\n if (responseSchema) {\n configObject.addPropertyAssignment({\n name: 'responseSchema',\n // @ts-expect-error -- fixme\n initializer: convertJsonSchemaToZod(responseSchema),\n });\n }\n\n if (\n typeof credentialReferenceId === 'string' &&\n credentialReferenceNames?.has(credentialReferenceId)\n ) {\n configObject.addPropertyAssignment({\n name: 'credentialReference',\n initializer: credentialReferenceNames.get(credentialReferenceId) as string,\n });\n return;\n }\n\n if (typeof credentialReferenceId === 'string') {\n addStringProperty(configObject, 'credentialReferenceId', credentialReferenceId);\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 sourceFile.addImportDeclaration({\n namedImports: [importName],\n moduleSpecifier: '@inkeep/agents-core',\n });\n sourceFile.addImportDeclaration({\n namedImports: ['z'],\n moduleSpecifier: 'zod',\n });\n\n const headersVarName = toContextConfigVariableName(data.contextConfigId);\n const { configObject } = addFactoryConfigVariable({\n sourceFile,\n importName,\n variableName: headersVarName,\n });\n\n configObject.addPropertyAssignment({\n name: 'schema',\n initializer: convertJsonSchemaToZod(data.schema),\n });\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 sourceFile.addImportDeclaration({\n namedImports: [importName],\n moduleSpecifier: '@inkeep/agents-core',\n });\n\n if (isPlainObject(data.responseSchema)) {\n sourceFile.addImportDeclaration({\n namedImports: ['z'],\n moduleSpecifier: 'zod',\n });\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 sourceFile.addImportDeclaration({\n namedImports: [credentialReferenceName],\n moduleSpecifier: `../credentials/${credentialReferencePath}`,\n });\n }\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 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(contextVariables?: Record<string, unknown>): Set<string> {\n const variables = new Set<string>();\n collectTemplateHeaderVariablesFromValue(contextVariables, variables);\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"],"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>\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,6 +1,10 @@
1
- import { addValueToObject, createFactoryDefinition, toCredentialReferenceName } from "../utils.js";
1
+ import { toCredentialReferenceName } from "../utils/naming.js";
2
+ import "../utils/index.js";
3
+ import { buildSequentialNameFileNames } from "../generation-resolver.js";
4
+ import { generateSimpleFactoryDefinition } from "../simple-factory-generator.js";
2
5
  import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
3
6
  import { z } from "zod";
7
+ import { join } from "node:path";
4
8
 
5
9
  //#region src/commands/pull-v4/generators/credential-generator.ts
6
10
  const MySchema = FullProjectDefinitionSchema.shape.credentialReferences.unwrap().valueType.omit({
@@ -14,21 +18,39 @@ const CredentialSchema = z.strictObject({
14
18
  ...MySchema.shape
15
19
  });
16
20
  function generateCredentialDefinition({ tenantId, id, projectId, createdBy, createdAt, updatedAt, toolId, userId, ...data }) {
17
- const result = CredentialSchema.safeParse(data);
18
- if (!result.success) throw new Error(`Validation failed for credential:\n${z.prettifyError(result.error)}`);
19
- const parsed = result.data;
20
- const { sourceFile, configObject } = createFactoryDefinition({
21
- importName: "credential",
22
- variableName: toCredentialReferenceName(parsed.name)
21
+ return generateSimpleFactoryDefinition(data, {
22
+ schema: CredentialSchema,
23
+ factory: {
24
+ importName: "credential",
25
+ variableName: (parsed) => toCredentialReferenceName(parsed.name)
26
+ },
27
+ buildConfig(parsed) {
28
+ const { credentialId, ...rest } = parsed;
29
+ return {
30
+ id: credentialId,
31
+ ...rest
32
+ };
33
+ }
23
34
  });
24
- const { credentialId, ...rest } = parsed;
25
- for (const [k, v] of Object.entries({
26
- id: credentialId,
27
- ...rest
28
- })) addValueToObject(configObject, k, v);
29
- return sourceFile;
30
35
  }
36
+ const task = {
37
+ type: "credential",
38
+ collect(context) {
39
+ if (!context.project.credentialReferences) return [];
40
+ const credentialEntries = Object.entries(context.project.credentialReferences);
41
+ const fileNamesByCredentialId = buildSequentialNameFileNames(credentialEntries);
42
+ return credentialEntries.map(([credentialId, credentialData]) => ({
43
+ id: credentialId,
44
+ filePath: context.resolver.resolveOutputFilePath("credentials", credentialId, join(context.paths.credentialsDir, fileNamesByCredentialId[credentialId])),
45
+ payload: {
46
+ credentialId,
47
+ ...credentialData
48
+ }
49
+ }));
50
+ },
51
+ generate: generateCredentialDefinition
52
+ };
31
53
 
32
54
  //#endregion
33
- export { generateCredentialDefinition };
55
+ export { generateCredentialDefinition, task };
34
56
  //# sourceMappingURL=credential-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credential-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/credential-generator.ts"],"sourcesContent":["import { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport { addValueToObject, createFactoryDefinition, toCredentialReferenceName } from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.credentialReferences.unwrap().valueType.omit({\n id: true,\n createdBy: true,\n toolId: true,\n userId: true,\n});\n\nconst CredentialSchema = z.strictObject({\n credentialId: z.string().nonempty(),\n ...MySchema.shape,\n});\n\ntype CredentialInput = z.input<typeof CredentialSchema>;\n\nexport function generateCredentialDefinition({\n tenantId,\n id,\n projectId,\n createdBy,\n createdAt,\n updatedAt,\n toolId,\n userId,\n ...data\n}: CredentialInput & Record<string, unknown>): SourceFile {\n const result = CredentialSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Validation failed for credential:\\n${z.prettifyError(result.error)}`);\n }\n\n const parsed = result.data;\n const credentialVarName = toCredentialReferenceName(parsed.name);\n const { sourceFile, configObject } = createFactoryDefinition({\n importName: 'credential',\n variableName: credentialVarName,\n });\n\n const { credentialId, ...rest } = parsed;\n\n for (const [k, v] of Object.entries({ id: credentialId, ...rest })) {\n addValueToObject(configObject, k, v);\n }\n return sourceFile;\n}\n"],"mappings":";;;;;AAKA,MAAM,WAAW,4BAA4B,MAAM,qBAAqB,QAAQ,CAAC,UAAU,KAAK;CAC9F,IAAI;CACJ,WAAW;CACX,QAAQ;CACR,QAAQ;CACT,CAAC;AAEF,MAAM,mBAAmB,EAAE,aAAa;CACtC,cAAc,EAAE,QAAQ,CAAC,UAAU;CACnC,GAAG,SAAS;CACb,CAAC;AAIF,SAAgB,6BAA6B,EAC3C,UACA,IACA,WACA,WACA,WACA,WACA,QACA,QACA,GAAG,QACqD;CACxD,MAAM,SAAS,iBAAiB,UAAU,KAAK;AAC/C,KAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,sCAAsC,EAAE,cAAc,OAAO,MAAM,GAAG;CAGxF,MAAM,SAAS,OAAO;CAEtB,MAAM,EAAE,YAAY,iBAAiB,wBAAwB;EAC3D,YAAY;EACZ,cAHwB,0BAA0B,OAAO,KAAK;EAI/D,CAAC;CAEF,MAAM,EAAE,cAAc,GAAG,SAAS;AAElC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ;EAAE,IAAI;EAAc,GAAG;EAAM,CAAC,CAChE,kBAAiB,cAAc,GAAG,EAAE;AAEtC,QAAO"}
1
+ {"version":3,"file":"credential-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/credential-generator.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport { buildSequentialNameFileNames } from '../generation-resolver';\nimport type { GenerationTask } from '../generation-types';\nimport { generateSimpleFactoryDefinition } from '../simple-factory-generator';\nimport { toCredentialReferenceName } from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.credentialReferences.unwrap().valueType.omit({\n id: true,\n createdBy: true,\n toolId: true,\n userId: true,\n});\n\nconst CredentialSchema = z.strictObject({\n credentialId: z.string().nonempty(),\n ...MySchema.shape,\n});\n\ntype CredentialInput = z.input<typeof CredentialSchema>;\n\nexport function generateCredentialDefinition({\n tenantId,\n id,\n projectId,\n createdBy,\n createdAt,\n updatedAt,\n toolId,\n userId,\n ...data\n}: CredentialInput & Record<string, unknown>): SourceFile {\n return generateSimpleFactoryDefinition(data, {\n schema: CredentialSchema,\n factory: {\n importName: 'credential',\n variableName: (parsed) => toCredentialReferenceName(parsed.name),\n },\n buildConfig(parsed) {\n const { credentialId, ...rest } = parsed;\n return {\n id: credentialId,\n ...rest,\n };\n },\n });\n}\n\nexport const task = {\n type: 'credential',\n collect(context) {\n if (!context.project.credentialReferences) {\n return [];\n }\n\n const credentialEntries = Object.entries(context.project.credentialReferences);\n const fileNamesByCredentialId = buildSequentialNameFileNames(credentialEntries);\n\n return credentialEntries.map(([credentialId, credentialData]) => ({\n id: credentialId,\n filePath: context.resolver.resolveOutputFilePath(\n 'credentials',\n credentialId,\n join(context.paths.credentialsDir, fileNamesByCredentialId[credentialId])\n ),\n payload: {\n credentialId,\n ...credentialData,\n } as Parameters<typeof generateCredentialDefinition>[0],\n }));\n },\n generate: generateCredentialDefinition,\n} satisfies GenerationTask<Parameters<typeof generateCredentialDefinition>[0]>;\n"],"mappings":";;;;;;;;;AASA,MAAM,WAAW,4BAA4B,MAAM,qBAAqB,QAAQ,CAAC,UAAU,KAAK;CAC9F,IAAI;CACJ,WAAW;CACX,QAAQ;CACR,QAAQ;CACT,CAAC;AAEF,MAAM,mBAAmB,EAAE,aAAa;CACtC,cAAc,EAAE,QAAQ,CAAC,UAAU;CACnC,GAAG,SAAS;CACb,CAAC;AAIF,SAAgB,6BAA6B,EAC3C,UACA,IACA,WACA,WACA,WACA,WACA,QACA,QACA,GAAG,QACqD;AACxD,QAAO,gCAAgC,MAAM;EAC3C,QAAQ;EACR,SAAS;GACP,YAAY;GACZ,eAAe,WAAW,0BAA0B,OAAO,KAAK;GACjE;EACD,YAAY,QAAQ;GAClB,MAAM,EAAE,cAAc,GAAG,SAAS;AAClC,UAAO;IACL,IAAI;IACJ,GAAG;IACJ;;EAEJ,CAAC;;AAGJ,MAAa,OAAO;CAClB,MAAM;CACN,QAAQ,SAAS;AACf,MAAI,CAAC,QAAQ,QAAQ,qBACnB,QAAO,EAAE;EAGX,MAAM,oBAAoB,OAAO,QAAQ,QAAQ,QAAQ,qBAAqB;EAC9E,MAAM,0BAA0B,6BAA6B,kBAAkB;AAE/E,SAAO,kBAAkB,KAAK,CAAC,cAAc,qBAAqB;GAChE,IAAI;GACJ,UAAU,QAAQ,SAAS,sBACzB,eACA,cACA,KAAK,QAAQ,MAAM,gBAAgB,wBAAwB,cAAc,CAC1E;GACD,SAAS;IACP;IACA,GAAG;IACJ;GACF,EAAE;;CAEL,UAAU;CACX"}