@inkeep/agents-cli 0.0.0-dev-20260224063043 → 0.0.0-dev-20260224081637

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  //#region package.json
2
2
  var name = "@inkeep/agents-cli";
3
- var version = "0.0.0-dev-20260224063043";
3
+ var version = "0.0.0-dev-20260224081637";
4
4
 
5
5
  //#endregion
6
6
  export { name, version };
@@ -1,4 +1,4 @@
1
- import { addObjectEntries, addReferenceGetterProperty, addStringProperty, collectTemplateVariableNames, createFactoryDefinition, formatStringLiteral, formatTemplate, isPlainObject, toCamelCase } from "./utils.js";
1
+ import { addObjectEntries, addReferenceGetterProperty, addStringProperty, collectTemplateVariableNames, createFactoryDefinition, createUniqueReferenceName, formatStringLiteral, formatTemplate, isPlainObject, toCamelCase } from "./utils.js";
2
2
  import { z } from "zod";
3
3
  import { SyntaxKind } from "ts-morph";
4
4
 
@@ -253,22 +253,6 @@ function createReferenceNameMap(ids, reservedNames, conflictSuffix) {
253
253
  }
254
254
  return map;
255
255
  }
256
- function createUniqueReferenceName(baseName, reservedNames, conflictSuffix) {
257
- if (!reservedNames.has(baseName)) {
258
- reservedNames.add(baseName);
259
- return baseName;
260
- }
261
- const baseCandidate = `${baseName}${conflictSuffix}`;
262
- if (!reservedNames.has(baseCandidate)) {
263
- reservedNames.add(baseCandidate);
264
- return baseCandidate;
265
- }
266
- let index = 2;
267
- while (reservedNames.has(`${baseCandidate}${index}`)) index += 1;
268
- const uniqueName = `${baseCandidate}${index}`;
269
- reservedNames.add(uniqueName);
270
- return uniqueName;
271
- }
272
256
 
273
257
  //#endregion
274
258
  export { generateAgentDefinition };
@@ -5,6 +5,7 @@ import { generateArtifactComponentDefinition } from "./artifact-component-genera
5
5
  import { generateContextConfigDefinition } from "./context-config-generator.js";
6
6
  import { generateCredentialDefinition } from "./credential-generator.js";
7
7
  import { generateDataComponentDefinition } from "./data-component-generator.js";
8
+ import { generateMcpToolDefinition } from "./mcp-tool-generator.js";
8
9
  import { mergeGeneratedModule } from "./module-merge.js";
9
10
  import { generateProjectDefinition } from "./project-generator.js";
10
11
  import { generateStatusComponentDefinition } from "./status-component-generator.js";
@@ -61,6 +62,11 @@ function createGenerationTasks() {
61
62
  collect: collectDataComponentRecords,
62
63
  generate: generateDataComponentDefinition
63
64
  },
65
+ {
66
+ type: "tool",
67
+ collect: collectToolRecords,
68
+ generate: generateMcpToolDefinition
69
+ },
64
70
  {
65
71
  type: "context-config",
66
72
  collect: collectContextConfigRecords,
@@ -154,6 +160,16 @@ function collectContextConfigRecords(context) {
154
160
  }
155
161
  return [...contextConfigRecordsById.values()];
156
162
  }
163
+ function collectToolRecords(context) {
164
+ return Object.entries(context.project.tools ?? {}).map(([toolId, toolData]) => ({
165
+ id: toolId,
166
+ filePath: resolveRecordFilePath(context, "tools", toolId, join(context.paths.toolsDir, `${toolId}.ts`)),
167
+ payload: {
168
+ mcpToolId: toolId,
169
+ ...toolData
170
+ }
171
+ }));
172
+ }
157
173
  function collectContextConfigCredentialReferenceOverrides(context, contextConfigData) {
158
174
  const registry = context.existingComponentRegistry;
159
175
  if (!registry) return;
@@ -360,7 +376,6 @@ function isAgentComplete(agentData) {
360
376
  }
361
377
  function collectUnsupportedComponentCounts(project) {
362
378
  return {
363
- tools: getObjectKeys(project.tools).length,
364
379
  functionTools: getObjectKeys(project.functionTools).length,
365
380
  functions: getObjectKeys(project.functions).length,
366
381
  externalAgents: getObjectKeys(project.externalAgents).length
@@ -2,7 +2,7 @@ import { addValueToObject, createFactoryDefinition, formatInlineLiteral, formatS
2
2
  import { z } from "zod";
3
3
 
4
4
  //#region src/commands/pull-v4/mcp-tool-generator.ts
5
- const McpToolSchema = z.looseObject({
5
+ const McpToolSchema = z.object({
6
6
  mcpToolId: z.string().nonempty(),
7
7
  name: z.string().nonempty(),
8
8
  description: z.string().nullable().optional(),
@@ -14,10 +14,10 @@ const McpToolSchema = z.looseObject({
14
14
  serverUrl: z.string().optional(),
15
15
  transport: z.object({ type: z.string() }).optional(),
16
16
  activeTools: z.array(z.unknown()).optional(),
17
- imageUrl: z.string().optional(),
17
+ imageUrl: z.string().nullish(),
18
18
  headers: z.unknown().optional(),
19
19
  credential: z.unknown().optional(),
20
- credentialReferenceId: z.string().optional()
20
+ credentialReferenceId: z.string().nullish()
21
21
  }).superRefine((value, context) => {
22
22
  if (!resolveServerUrl(value)) context.addIssue({
23
23
  code: "custom",
@@ -19,6 +19,7 @@ function mergeImports(existingFile, generatedFile) {
19
19
  const matchingImports = existingFile.getImportDeclarations().filter((existingImport) => existingImport.getModuleSpecifierValue() === moduleSpecifier);
20
20
  if (!matchingImports.length) {
21
21
  if (areGeneratedImportBindingsAlreadyPresent(existingFile, generatedImport)) continue;
22
+ if (hasGeneratedImportBindingConflicts(existingFile, generatedImport)) continue;
22
23
  existingFile.addImportDeclaration(generatedImport.getStructure());
23
24
  continue;
24
25
  }
@@ -29,20 +30,30 @@ function mergeImports(existingFile, generatedFile) {
29
30
  }
30
31
  if (!generatedImport.isTypeOnly() && targetImport.isTypeOnly()) targetImport.setIsTypeOnly(false);
31
32
  const generatedDefaultImport = generatedImport.getDefaultImport();
32
- if (generatedDefaultImport && !targetImport.getDefaultImport()) targetImport.setDefaultImport(generatedDefaultImport.getText());
33
+ if (generatedDefaultImport && !targetImport.getDefaultImport()) {
34
+ const defaultImportName = generatedDefaultImport.getText();
35
+ if (!hasTopLevelDeclarationWithName(existingFile, defaultImportName)) targetImport.setDefaultImport(defaultImportName);
36
+ }
33
37
  const generatedNamespaceImport = generatedImport.getNamespaceImport();
34
- if (generatedNamespaceImport && !targetImport.getNamespaceImport()) targetImport.setNamespaceImport(generatedNamespaceImport.getText());
38
+ if (generatedNamespaceImport && !targetImport.getNamespaceImport()) {
39
+ const namespaceImportName = generatedNamespaceImport.getText();
40
+ if (!hasTopLevelDeclarationWithName(existingFile, namespaceImportName)) targetImport.setNamespaceImport(namespaceImportName);
41
+ }
35
42
  for (const generatedNamedImport of generatedImport.getNamedImports()) {
36
43
  const generatedName = generatedNamedImport.getName();
37
44
  const generatedAlias = generatedNamedImport.getAliasNode()?.getText();
38
45
  const generatedIsTypeOnly = generatedNamedImport.isTypeOnly();
46
+ const generatedBindingName = generatedAlias ?? generatedName;
39
47
  if (!targetImport.getNamedImports().some((existingNamedImport) => {
40
48
  return existingNamedImport.getName() === generatedName && existingNamedImport.getAliasNode()?.getText() === generatedAlias && existingNamedImport.isTypeOnly() === generatedIsTypeOnly;
41
- })) targetImport.addNamedImport({
42
- name: generatedName,
43
- alias: generatedAlias,
44
- isTypeOnly: generatedIsTypeOnly
45
- });
49
+ })) {
50
+ if (hasTopLevelDeclarationWithName(existingFile, generatedBindingName)) continue;
51
+ targetImport.addNamedImport({
52
+ name: generatedName,
53
+ alias: generatedAlias,
54
+ isTypeOnly: generatedIsTypeOnly
55
+ });
56
+ }
46
57
  }
47
58
  }
48
59
  }
@@ -63,6 +74,11 @@ function areGeneratedImportBindingsAlreadyPresent(existingFile, generatedImport)
63
74
  const existingImports = existingFile.getImportDeclarations();
64
75
  return generatedBindings.every((binding) => existingImports.some((existingImport) => importHasBinding(existingImport, binding)));
65
76
  }
77
+ function hasGeneratedImportBindingConflicts(existingFile, generatedImport) {
78
+ const generatedBindings = getImportBindingNames(generatedImport);
79
+ if (!generatedBindings.length) return false;
80
+ return generatedBindings.some((binding) => hasTopLevelDeclarationWithName(existingFile, binding));
81
+ }
66
82
  function getImportBindingNames(importDeclaration) {
67
83
  const bindings = [];
68
84
  const defaultImport = importDeclaration.getDefaultImport();
@@ -79,6 +95,16 @@ function importHasBinding(importDeclaration, bindingName) {
79
95
  return (namedImport.getAliasNode()?.getText() ?? namedImport.getName()) === bindingName;
80
96
  });
81
97
  }
98
+ function hasTopLevelDeclarationWithName(existingFile, declarationName) {
99
+ if (existingFile.getVariableDeclaration(declarationName)) return true;
100
+ if (existingFile.getFunction(declarationName)) return true;
101
+ if (existingFile.getClass(declarationName)) return true;
102
+ if (existingFile.getInterface(declarationName)) return true;
103
+ if (existingFile.getTypeAlias(declarationName)) return true;
104
+ if (existingFile.getEnum(declarationName)) return true;
105
+ if (existingFile.getModule(declarationName)) return true;
106
+ return false;
107
+ }
82
108
  function upsertStatement(existingFile, generatedStatement) {
83
109
  if (Node.isVariableStatement(generatedStatement)) {
84
110
  upsertVariableStatement(existingFile, generatedStatement);
@@ -1,4 +1,4 @@
1
- import { addReferenceGetterProperty, addValueToObject, convertNullToUndefined, createFactoryDefinition, formatStringLiteral, hasReferences, resolveReferenceName, toCamelCase } from "./utils.js";
1
+ import { addReferenceGetterProperty, addValueToObject, convertNullToUndefined, createFactoryDefinition, createUniqueReferenceName, formatStringLiteral, hasReferences, resolveReferenceName, toCamelCase } from "./utils.js";
2
2
  import { z } from "zod";
3
3
 
4
4
  //#region src/commands/pull-v4/project-generator.ts
@@ -38,10 +38,12 @@ function generateProjectDefinition(data) {
38
38
  if (!result.success) throw new Error(`Validation failed for project:
39
39
  ${z.prettifyError(result.error)}`);
40
40
  const parsed = result.data;
41
+ const projectVariableName = toCamelCase(parsed.projectId);
41
42
  const { sourceFile, configObject } = createFactoryDefinition({
42
43
  importName: "project",
43
- variableName: toCamelCase(parsed.projectId)
44
+ variableName: projectVariableName
44
45
  });
46
+ const reservedReferenceNames = new Set([projectVariableName]);
45
47
  if (hasReferences(parsed.skills)) {
46
48
  sourceFile.getImportDeclarationOrThrow("@inkeep/agents-sdk").addNamedImport("loadSkills");
47
49
  sourceFile.addImportDeclaration({
@@ -59,42 +61,64 @@ ${z.prettifyError(result.error)}`);
59
61
  initializer: `() => loadSkills(path.join(${formatStringLiteral(projectId)}, 'skills'))`
60
62
  });
61
63
  if (hasReferences(agents)) {
62
- addReferenceImports(sourceFile, agents, "./agents", referenceOverrides?.agents);
63
- addReferenceGetterProperty(configObject, "agents", toReferenceNames(agents, referenceOverrides?.agents));
64
+ const resolvedReferences = createResolvedReferences(agents, referenceOverrides?.agents, reservedReferenceNames, "Agent");
65
+ addReferenceImports(sourceFile, resolvedReferences, "./agents");
66
+ addReferenceGetterProperty(configObject, "agents", toReferenceNames(resolvedReferences));
64
67
  }
65
68
  if (hasReferences(tools)) {
66
- addReferenceImports(sourceFile, tools, "./tools", referenceOverrides?.tools);
67
- addReferenceGetterProperty(configObject, "tools", toReferenceNames(tools, referenceOverrides?.tools));
69
+ const resolvedReferences = createResolvedReferences(tools, referenceOverrides?.tools, reservedReferenceNames, "Tool");
70
+ addReferenceImports(sourceFile, resolvedReferences, "./tools");
71
+ addReferenceGetterProperty(configObject, "tools", toReferenceNames(resolvedReferences));
68
72
  }
69
73
  if (hasReferences(externalAgents)) {
70
- addReferenceImports(sourceFile, externalAgents, "./external-agents", referenceOverrides?.externalAgents);
71
- addReferenceGetterProperty(configObject, "externalAgents", toReferenceNames(externalAgents, referenceOverrides?.externalAgents));
74
+ const resolvedReferences = createResolvedReferences(externalAgents, referenceOverrides?.externalAgents, reservedReferenceNames, "ExternalAgent");
75
+ addReferenceImports(sourceFile, resolvedReferences, "./external-agents");
76
+ addReferenceGetterProperty(configObject, "externalAgents", toReferenceNames(resolvedReferences));
72
77
  }
73
78
  if (hasReferences(dataComponents)) {
74
- addReferenceImports(sourceFile, dataComponents, "./data-components", referenceOverrides?.dataComponents);
75
- addReferenceGetterProperty(configObject, "dataComponents", toReferenceNames(dataComponents, referenceOverrides?.dataComponents));
79
+ const resolvedReferences = createResolvedReferences(dataComponents, referenceOverrides?.dataComponents, reservedReferenceNames, "DataComponent");
80
+ addReferenceImports(sourceFile, resolvedReferences, "./data-components");
81
+ addReferenceGetterProperty(configObject, "dataComponents", toReferenceNames(resolvedReferences));
76
82
  }
77
83
  if (hasReferences(artifactComponents)) {
78
- addReferenceImports(sourceFile, artifactComponents, "./artifact-components", referenceOverrides?.artifactComponents);
79
- addReferenceGetterProperty(configObject, "artifactComponents", toReferenceNames(artifactComponents, referenceOverrides?.artifactComponents));
84
+ const resolvedReferences = createResolvedReferences(artifactComponents, referenceOverrides?.artifactComponents, reservedReferenceNames, "ArtifactComponent");
85
+ addReferenceImports(sourceFile, resolvedReferences, "./artifact-components");
86
+ addReferenceGetterProperty(configObject, "artifactComponents", toReferenceNames(resolvedReferences));
80
87
  }
81
88
  if (hasReferences(credentialReferences)) {
82
- addReferenceImports(sourceFile, credentialReferences, "./credentials", referenceOverrides?.credentialReferences);
83
- addReferenceGetterProperty(configObject, "credentialReferences", toReferenceNames(credentialReferences, referenceOverrides?.credentialReferences));
89
+ const resolvedReferences = createResolvedReferences(credentialReferences, referenceOverrides?.credentialReferences, reservedReferenceNames, "CredentialReference");
90
+ addReferenceImports(sourceFile, resolvedReferences, "./credentials");
91
+ addReferenceGetterProperty(configObject, "credentialReferences", toReferenceNames(resolvedReferences));
84
92
  }
85
93
  return sourceFile;
86
94
  }
87
- function addReferenceImports(sourceFile, references, basePath, referenceOverrides) {
88
- for (const reference of references) {
89
- const referenceName = resolveReferenceName(reference, [referenceOverrides]);
90
- sourceFile.addImportDeclaration({
91
- namedImports: [referenceName],
92
- moduleSpecifier: `${basePath}/${reference}`
95
+ function addReferenceImports(sourceFile, references, basePath) {
96
+ for (const reference of references) sourceFile.addImportDeclaration({
97
+ namedImports: [reference.importName === reference.localName ? reference.importName : {
98
+ name: reference.importName,
99
+ alias: reference.localName
100
+ }],
101
+ moduleSpecifier: `${basePath}/${reference.id}`
102
+ });
103
+ }
104
+ function toReferenceNames(references) {
105
+ return references.map((reference) => reference.localName);
106
+ }
107
+ function createResolvedReferences(references, referenceOverrides, reservedReferenceNames, suffix) {
108
+ const seenIds = /* @__PURE__ */ new Set();
109
+ const resolvedReferences = [];
110
+ for (const referenceId of references) {
111
+ if (seenIds.has(referenceId)) continue;
112
+ seenIds.add(referenceId);
113
+ const importName = resolveReferenceName(referenceId, [referenceOverrides]);
114
+ const localName = createUniqueReferenceName(importName, reservedReferenceNames, suffix);
115
+ resolvedReferences.push({
116
+ id: referenceId,
117
+ importName,
118
+ localName
93
119
  });
94
120
  }
95
- }
96
- function toReferenceNames(references, referenceOverrides) {
97
- return references.map((reference) => resolveReferenceName(reference, [referenceOverrides]));
121
+ return resolvedReferences;
98
122
  }
99
123
 
100
124
  //#endregion
@@ -54,12 +54,113 @@ function generateSubAgentDefinition(data) {
54
54
  namedImports: [...new Set(namedImports)],
55
55
  moduleSpecifier: `../context-configs/${parsed.contextConfigId}`
56
56
  });
57
+ addCanUseToolImports(sourceFile, parsed.canUse, parsed.referenceOverrides?.tools);
58
+ addDataComponentImports(sourceFile, parsed.dataComponents, parsed.referenceOverrides?.dataComponents);
59
+ addArtifactComponentImports(sourceFile, parsed.artifactComponents, parsed.referenceOverrides?.artifactComponents);
60
+ addDelegateTargetImports(sourceFile, {
61
+ currentSubAgentId: parsed.id,
62
+ canDelegateTo: parsed.canDelegateTo,
63
+ canTransferTo: parsed.canTransferTo,
64
+ referenceOverrides: {
65
+ subAgents: parsed.referenceOverrides?.subAgents,
66
+ agents: parsed.referenceOverrides?.agents,
67
+ externalAgents: parsed.referenceOverrides?.externalAgents
68
+ }
69
+ });
57
70
  writeSubAgentConfig(configObject, {
58
71
  contextReference: parsed.contextConfigReference?.name,
59
72
  headersReference: parsed.contextConfigHeadersReference?.name
60
73
  }, parsed);
61
74
  return sourceFile;
62
75
  }
76
+ function addCanUseToolImports(sourceFile, canUse, toolReferenceOverrides) {
77
+ const toolImportsById = /* @__PURE__ */ new Map();
78
+ for (const item of canUse ?? []) {
79
+ const toolId = typeof item === "string" ? item : isPlainObject(item) && typeof item.toolId === "string" ? item.toolId : void 0;
80
+ if (!toolId || toolImportsById.has(toolId)) continue;
81
+ toolImportsById.set(toolId, resolveReferenceName(toolId, [toolReferenceOverrides]));
82
+ }
83
+ for (const [toolId, referenceName] of toolImportsById) sourceFile.addImportDeclaration({
84
+ namedImports: [referenceName],
85
+ moduleSpecifier: `../../tools/${toolId}`
86
+ });
87
+ }
88
+ function addDataComponentImports(sourceFile, dataComponents, dataComponentReferenceOverrides) {
89
+ addReferenceImports(sourceFile, dataComponents, "../../data-components", dataComponentReferenceOverrides);
90
+ }
91
+ function addArtifactComponentImports(sourceFile, artifactComponents, artifactComponentReferenceOverrides) {
92
+ addReferenceImports(sourceFile, artifactComponents, "../../artifact-components", artifactComponentReferenceOverrides);
93
+ }
94
+ function addReferenceImports(sourceFile, references, basePath, referenceOverrides) {
95
+ const importByReferenceId = /* @__PURE__ */ new Map();
96
+ for (const referenceId of references ?? []) {
97
+ if (!referenceId || importByReferenceId.has(referenceId)) continue;
98
+ importByReferenceId.set(referenceId, resolveReferenceName(referenceId, [referenceOverrides]));
99
+ }
100
+ for (const [referenceId, referenceName] of importByReferenceId) sourceFile.addImportDeclaration({
101
+ namedImports: [referenceName],
102
+ moduleSpecifier: `${basePath}/${referenceId}`
103
+ });
104
+ }
105
+ function addDelegateTargetImports(sourceFile, options) {
106
+ const importsByTarget = /* @__PURE__ */ new Map();
107
+ for (const item of options.canDelegateTo ?? []) {
108
+ const resolvedTarget = resolveDelegateTargetImport(item, options.referenceOverrides);
109
+ if (!resolvedTarget) continue;
110
+ if (resolvedTarget.type === "subAgents" && resolvedTarget.id === options.currentSubAgentId) continue;
111
+ importsByTarget.set(`${resolvedTarget.type}:${resolvedTarget.id}`, resolvedTarget);
112
+ }
113
+ for (const targetId of options.canTransferTo ?? []) {
114
+ const resolvedTarget = resolveDelegateTargetImport(targetId, options.referenceOverrides);
115
+ if (!resolvedTarget) continue;
116
+ if (resolvedTarget.type === "subAgents" && resolvedTarget.id === options.currentSubAgentId) continue;
117
+ importsByTarget.set(`${resolvedTarget.type}:${resolvedTarget.id}`, resolvedTarget);
118
+ }
119
+ for (const target of importsByTarget.values()) sourceFile.addImportDeclaration({
120
+ namedImports: [target.name],
121
+ moduleSpecifier: resolveDelegateImportModuleSpecifier(target.type, target.id)
122
+ });
123
+ }
124
+ function resolveDelegateTargetImport(canDelegateToEntry, referenceOverrides) {
125
+ if (typeof canDelegateToEntry === "string") {
126
+ const resolvedType = resolveDelegateTargetType(canDelegateToEntry, referenceOverrides);
127
+ if (!resolvedType) return;
128
+ return {
129
+ type: resolvedType,
130
+ id: canDelegateToEntry,
131
+ name: resolveReferenceName(canDelegateToEntry, [referenceOverrides[resolvedType]])
132
+ };
133
+ }
134
+ if (!isPlainObject(canDelegateToEntry)) return;
135
+ if (typeof canDelegateToEntry.subAgentId === "string") return {
136
+ type: "subAgents",
137
+ id: canDelegateToEntry.subAgentId,
138
+ name: resolveReferenceName(canDelegateToEntry.subAgentId, [referenceOverrides.subAgents])
139
+ };
140
+ if (typeof canDelegateToEntry.agentId === "string") return {
141
+ type: "agents",
142
+ id: canDelegateToEntry.agentId,
143
+ name: resolveReferenceName(canDelegateToEntry.agentId, [referenceOverrides.agents])
144
+ };
145
+ if (typeof canDelegateToEntry.externalAgentId === "string") return {
146
+ type: "externalAgents",
147
+ id: canDelegateToEntry.externalAgentId,
148
+ name: resolveReferenceName(canDelegateToEntry.externalAgentId, [referenceOverrides.externalAgents])
149
+ };
150
+ }
151
+ function resolveDelegateTargetType(targetId, referenceOverrides) {
152
+ if (referenceOverrides.subAgents?.[targetId]) return "subAgents";
153
+ if (referenceOverrides.agents?.[targetId]) return "agents";
154
+ if (referenceOverrides.externalAgents?.[targetId]) return "externalAgents";
155
+ return "subAgents";
156
+ }
157
+ function resolveDelegateImportModuleSpecifier(type, id) {
158
+ switch (type) {
159
+ case "subAgents": return `./${id}`;
160
+ case "agents": return `../${id}`;
161
+ case "externalAgents": return `../../external-agents/${id}`;
162
+ }
163
+ }
63
164
  function writeSubAgentConfig(configObject, templateReferences, { dataComponents, name, canDelegateTo, canTransferTo, skills, artifactComponents, canUse, referenceOverrides, contextConfigId: _contextConfigId, contextConfigReference: _contextConfigReference, contextConfigHeadersReference: _contextConfigHeadersReference, ...rest }) {
64
165
  rest = { ...rest };
65
166
  rest.prompt &&= formatTemplate(rest.prompt, templateReferences);
@@ -55,6 +55,22 @@ function toCamelCase(input) {
55
55
  const result = input.replace(/[^a-zA-Z0-9](.)/g, (_, char) => char.toUpperCase()).replace(/^[0-9]/, "_$&");
56
56
  return result.charAt(0).toLowerCase() + result.slice(1);
57
57
  }
58
+ function createUniqueReferenceName(baseName, reservedNames, conflictSuffix) {
59
+ if (!reservedNames.has(baseName)) {
60
+ reservedNames.add(baseName);
61
+ return baseName;
62
+ }
63
+ const baseCandidate = `${baseName}${conflictSuffix}`;
64
+ if (!reservedNames.has(baseCandidate)) {
65
+ reservedNames.add(baseCandidate);
66
+ return baseCandidate;
67
+ }
68
+ let index = 2;
69
+ while (reservedNames.has(`${baseCandidate}${index}`)) index += 1;
70
+ const uniqueName = `${baseCandidate}${index}`;
71
+ reservedNames.add(uniqueName);
72
+ return uniqueName;
73
+ }
58
74
  function resolveReferenceName(referenceId, referenceOverrides) {
59
75
  for (const overrideMap of referenceOverrides) {
60
76
  const overrideName = overrideMap?.[referenceId];
@@ -216,4 +232,4 @@ function hasReferences(references) {
216
232
  }
217
233
 
218
234
  //#endregion
219
- export { TEMPLATE_VARIABLE_REGEX, addFactoryConfigVariable, addObjectEntries, addReferenceGetterProperty, addStringProperty, addValueToObject, collectTemplateVariableNames, convertJsonSchemaToZodSafe, convertNullToUndefined, createFactoryDefinition, createInMemoryProject, expectSnapshots, formatInlineLiteral, formatPropertyName, formatStringLiteral, formatTemplate, hasReferences, isPlainObject, resolveReferenceName, toCamelCase };
235
+ export { TEMPLATE_VARIABLE_REGEX, addFactoryConfigVariable, addObjectEntries, addReferenceGetterProperty, addStringProperty, addValueToObject, collectTemplateVariableNames, convertJsonSchemaToZodSafe, convertNullToUndefined, createFactoryDefinition, createInMemoryProject, createUniqueReferenceName, expectSnapshots, formatInlineLiteral, formatPropertyName, formatStringLiteral, formatTemplate, hasReferences, isPlainObject, resolveReferenceName, toCamelCase };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inkeep/agents-cli",
3
- "version": "0.0.0-dev-20260224063043",
3
+ "version": "0.0.0-dev-20260224081637",
4
4
  "description": "Inkeep CLI tool",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -40,8 +40,8 @@
40
40
  "tsx": "^4.20.5",
41
41
  "yaml": "^2.7.0",
42
42
  "zod": "^4.3.6",
43
- "@inkeep/agents-core": "^0.0.0-dev-20260224063043",
44
- "@inkeep/agents-sdk": "^0.0.0-dev-20260224063043"
43
+ "@inkeep/agents-core": "^0.0.0-dev-20260224081637",
44
+ "@inkeep/agents-sdk": "^0.0.0-dev-20260224081637"
45
45
  },
46
46
  "devDependencies": {
47
47
  "diff": "^8.0.3",
@@ -53,7 +53,7 @@
53
53
  "vitest": "^3.2.4"
54
54
  },
55
55
  "peerDependencies": {
56
- "@inkeep/agents-manage-ui": "0.0.0-dev-20260224063043"
56
+ "@inkeep/agents-manage-ui": "0.0.0-dev-20260224081637"
57
57
  },
58
58
  "publishConfig": {
59
59
  "access": "public",