@inkeep/agents-cli 0.58.10 → 0.58.13

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 (151) hide show
  1. package/dist/agents-cli/package.js +3 -2
  2. package/dist/agents-cli/package.js.map +1 -0
  3. package/dist/api.js +7 -11
  4. package/dist/api.js.map +1 -0
  5. package/dist/commands/add-ui.js +2 -1
  6. package/dist/commands/add-ui.js.map +1 -0
  7. package/dist/commands/add.js +2 -1
  8. package/dist/commands/add.js.map +1 -0
  9. package/dist/commands/config.js +2 -1
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/dev.js +2 -1
  12. package/dist/commands/dev.js.map +1 -0
  13. package/dist/commands/init.js +2 -1
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/list-agents.js +2 -1
  16. package/dist/commands/list-agents.js.map +1 -0
  17. package/dist/commands/login.js +2 -1
  18. package/dist/commands/login.js.map +1 -0
  19. package/dist/commands/logout.js +2 -1
  20. package/dist/commands/logout.js.map +1 -0
  21. package/dist/commands/profile.js +2 -1
  22. package/dist/commands/profile.js.map +1 -0
  23. package/dist/commands/pull-v4/component-parser.js +2 -1
  24. package/dist/commands/pull-v4/component-parser.js.map +1 -0
  25. package/dist/commands/pull-v4/component-registry.js +2 -1
  26. package/dist/commands/pull-v4/component-registry.js.map +1 -0
  27. package/dist/commands/pull-v4/generators/agent-generator.helpers.js +186 -0
  28. package/dist/commands/pull-v4/generators/agent-generator.helpers.js.map +1 -0
  29. package/dist/commands/pull-v4/generators/agent-generator.js +70 -209
  30. package/dist/commands/pull-v4/generators/agent-generator.js.map +1 -0
  31. package/dist/commands/pull-v4/generators/artifact-component-generator.js +13 -16
  32. package/dist/commands/pull-v4/generators/artifact-component-generator.js.map +1 -0
  33. package/dist/commands/pull-v4/generators/context-config-generator.js +38 -24
  34. package/dist/commands/pull-v4/generators/context-config-generator.js.map +1 -0
  35. package/dist/commands/pull-v4/generators/credential-generator.js +14 -10
  36. package/dist/commands/pull-v4/generators/credential-generator.js.map +1 -0
  37. package/dist/commands/pull-v4/generators/data-component-generator.js +10 -12
  38. package/dist/commands/pull-v4/generators/data-component-generator.js.map +1 -0
  39. package/dist/commands/pull-v4/generators/environment-generator.js +11 -91
  40. package/dist/commands/pull-v4/generators/environment-generator.js.map +1 -0
  41. package/dist/commands/pull-v4/generators/external-agent-generator.js +22 -39
  42. package/dist/commands/pull-v4/generators/external-agent-generator.js.map +1 -0
  43. package/dist/commands/pull-v4/generators/function-tool-generator.js +19 -31
  44. package/dist/commands/pull-v4/generators/function-tool-generator.js.map +1 -0
  45. package/dist/commands/pull-v4/generators/mcp-tool-generator.js +30 -71
  46. package/dist/commands/pull-v4/generators/mcp-tool-generator.js.map +1 -0
  47. package/dist/commands/pull-v4/generators/project-generator.js +64 -31
  48. package/dist/commands/pull-v4/generators/project-generator.js.map +1 -0
  49. package/dist/commands/pull-v4/generators/skill-generator.js +4 -1
  50. package/dist/commands/pull-v4/generators/skill-generator.js.map +1 -0
  51. package/dist/commands/pull-v4/generators/status-component-generator.js +19 -19
  52. package/dist/commands/pull-v4/generators/status-component-generator.js.map +1 -0
  53. package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js +84 -0
  54. package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js.map +1 -0
  55. package/dist/commands/pull-v4/generators/sub-agent-generator.js +82 -113
  56. package/dist/commands/pull-v4/generators/sub-agent-generator.js.map +1 -0
  57. package/dist/commands/pull-v4/generators/trigger-generator.js +21 -30
  58. package/dist/commands/pull-v4/generators/trigger-generator.js.map +1 -0
  59. package/dist/commands/pull-v4/introspect/demo-project.js +1616 -0
  60. package/dist/commands/pull-v4/introspect/demo-project.js.map +1 -0
  61. package/dist/commands/pull-v4/introspect/index.js +17 -16
  62. package/dist/commands/pull-v4/introspect/index.js.map +1 -0
  63. package/dist/commands/pull-v4/introspect/test-helpers.js +5 -3
  64. package/dist/commands/pull-v4/introspect/test-helpers.js.map +1 -0
  65. package/dist/commands/pull-v4/introspect-generator.js +606 -93
  66. package/dist/commands/pull-v4/introspect-generator.js.map +1 -0
  67. package/dist/commands/pull-v4/module-merge.js +2 -1
  68. package/dist/commands/pull-v4/module-merge.js.map +1 -0
  69. package/dist/commands/pull-v4/scheduled-trigger-generator.js +16 -17
  70. package/dist/commands/pull-v4/scheduled-trigger-generator.js.map +1 -0
  71. package/dist/commands/pull-v4/utils.js +90 -28
  72. package/dist/commands/pull-v4/utils.js.map +1 -0
  73. package/dist/commands/push.js +2 -1
  74. package/dist/commands/push.js.map +1 -0
  75. package/dist/commands/status.js +2 -1
  76. package/dist/commands/status.js.map +1 -0
  77. package/dist/commands/update.js +2 -1
  78. package/dist/commands/update.js.map +1 -0
  79. package/dist/commands/whoami.js +2 -1
  80. package/dist/commands/whoami.js.map +1 -0
  81. package/dist/config.js +2 -1
  82. package/dist/config.js.map +1 -0
  83. package/dist/env.js +2 -1
  84. package/dist/env.js.map +1 -0
  85. package/dist/index.js +2 -1
  86. package/dist/index.js.map +1 -0
  87. package/dist/instrumentation.js +2 -1
  88. package/dist/instrumentation.js.map +1 -0
  89. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/array.js +2 -1
  90. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/array.js.map +1 -0
  91. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/base.js +2 -1
  92. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/base.js.map +1 -0
  93. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/character.js +2 -1
  94. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/character.js.map +1 -0
  95. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/css.js +2 -1
  96. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/css.js.map +1 -0
  97. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/json.js +2 -1
  98. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/json.js.map +1 -0
  99. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/line.js +2 -1
  100. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/line.js.map +1 -0
  101. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/sentence.js +2 -1
  102. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/sentence.js.map +1 -0
  103. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/word.js +2 -1
  104. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/diff/word.js.map +1 -0
  105. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/patch/create.js +2 -1
  106. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/patch/create.js.map +1 -0
  107. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/util/string.js +2 -1
  108. package/dist/node_modules/.pnpm/diff@8.0.3/node_modules/diff/libesm/util/string.js.map +1 -0
  109. package/dist/utils/background-version-check.js +2 -1
  110. package/dist/utils/background-version-check.js.map +1 -0
  111. package/dist/utils/ci-environment.js +2 -1
  112. package/dist/utils/ci-environment.js.map +1 -0
  113. package/dist/utils/cli-pipeline.js +2 -1
  114. package/dist/utils/cli-pipeline.js.map +1 -0
  115. package/dist/utils/config.js +2 -1
  116. package/dist/utils/config.js.map +1 -0
  117. package/dist/utils/credentials.js +2 -1
  118. package/dist/utils/credentials.js.map +1 -0
  119. package/dist/utils/environment-loader.js +2 -1
  120. package/dist/utils/environment-loader.js.map +1 -0
  121. package/dist/utils/file-finder.js +2 -1
  122. package/dist/utils/file-finder.js.map +1 -0
  123. package/dist/utils/json-comparator.js +2 -1
  124. package/dist/utils/json-comparator.js.map +1 -0
  125. package/dist/utils/json-comparison.js +2 -1
  126. package/dist/utils/json-comparison.js.map +1 -0
  127. package/dist/utils/mcp-runner.js +2 -1
  128. package/dist/utils/mcp-runner.js.map +1 -0
  129. package/dist/utils/model-config.js +2 -1
  130. package/dist/utils/model-config.js.map +1 -0
  131. package/dist/utils/package-manager.js +2 -1
  132. package/dist/utils/package-manager.js.map +1 -0
  133. package/dist/utils/profile-config.js +2 -1
  134. package/dist/utils/profile-config.js.map +1 -0
  135. package/dist/utils/profiles/profile-manager.js +2 -1
  136. package/dist/utils/profiles/profile-manager.js.map +1 -0
  137. package/dist/utils/profiles/types.js +2 -1
  138. package/dist/utils/profiles/types.js.map +1 -0
  139. package/dist/utils/project-directory.js +2 -1
  140. package/dist/utils/project-directory.js.map +1 -0
  141. package/dist/utils/project-loader.js +2 -1
  142. package/dist/utils/project-loader.js.map +1 -0
  143. package/dist/utils/schema-introspection.js +2 -1
  144. package/dist/utils/schema-introspection.js.map +1 -0
  145. package/dist/utils/templates.js +2 -1
  146. package/dist/utils/templates.js.map +1 -0
  147. package/dist/utils/tsx-loader.js +2 -1
  148. package/dist/utils/tsx-loader.js.map +1 -0
  149. package/dist/utils/version-check.js +2 -1
  150. package/dist/utils/version-check.js.map +1 -0
  151. package/package.json +3 -3
@@ -1,48 +1,36 @@
1
- import { addValueToObject, createFactoryDefinition, toCamelCase } from "../utils.js";
1
+ import { addValueToObject, createFactoryDefinition, toToolReferenceName } from "../utils.js";
2
+ import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
2
3
  import { z } from "zod";
3
4
 
4
5
  //#region src/commands/pull-v4/generators/function-tool-generator.ts
5
- const FunctionToolSchema = z.looseObject({
6
- functionToolId: z.string().nonempty(),
7
- name: z.string().nonempty(),
8
- description: z.string().optional(),
9
- inputSchema: z.unknown().optional(),
10
- schema: z.unknown().optional(),
11
- executeCode: z.string().optional(),
12
- execute: z.string().optional()
13
- }).superRefine((value, context) => {
14
- if (value.inputSchema === void 0 && value.schema === void 0) context.addIssue({
15
- code: "custom",
16
- message: "inputSchema is required",
17
- path: ["inputSchema"]
18
- });
19
- if (value.executeCode === void 0 && value.execute === void 0) context.addIssue({
20
- code: "custom",
21
- message: "executeCode is required",
22
- path: ["executeCode"]
23
- });
6
+ const MySchema = FullProjectDefinitionSchema.shape.functions.unwrap().valueType.omit({ id: true });
7
+ const MySchema2 = FullProjectDefinitionSchema.shape.functionTools.unwrap().valueType.omit({
8
+ id: true,
9
+ functionId: true
10
+ });
11
+ const FunctionToolSchema = z.strictObject({
12
+ ...MySchema.shape,
13
+ ...MySchema2.shape,
14
+ name: z.preprocess((v) => v ?? "", MySchema2.shape.name),
15
+ description: z.preprocess((v) => v || void 0, MySchema2.shape.description),
16
+ functionToolId: z.string().nonempty()
24
17
  });
25
18
  function generateFunctionToolDefinition(data) {
26
19
  const result = FunctionToolSchema.safeParse(data);
27
20
  if (!result.success) throw new Error(`Validation failed for function tool:\n${z.prettifyError(result.error)}`);
28
- const parsed = result.data;
21
+ const { functionToolId, executeCode, ...parsed } = result.data;
29
22
  const { sourceFile, configObject } = createFactoryDefinition({
30
23
  importName: "functionTool",
31
- variableName: toCamelCase(parsed.functionToolId)
24
+ variableName: toToolReferenceName(parsed.name || functionToolId)
32
25
  });
33
- writeFunctionToolConfig(configObject, parsed);
34
- return sourceFile;
35
- }
36
- function writeFunctionToolConfig(configObject, { functionToolId, executeCode, inputSchema, schema, ...rest }) {
37
- for (const [k, v] of Object.entries({
38
- ...rest,
39
- inputSchema: inputSchema ?? schema
40
- })) addValueToObject(configObject, k, v);
26
+ for (const [k, v] of Object.entries(parsed)) addValueToObject(configObject, k, v);
41
27
  if (executeCode) configObject.addPropertyAssignment({
42
28
  name: "execute",
43
29
  initializer: executeCode
44
30
  });
31
+ return sourceFile;
45
32
  }
46
33
 
47
34
  //#endregion
48
- export { generateFunctionToolDefinition };
35
+ export { generateFunctionToolDefinition };
36
+ //# sourceMappingURL=function-tool-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-tool-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/function-tool-generator.ts"],"sourcesContent":["import { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport { addValueToObject, createFactoryDefinition, toToolReferenceName } from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.functions.unwrap().valueType.omit({\n id: true,\n});\nconst MySchema2 = FullProjectDefinitionSchema.shape.functionTools.unwrap().valueType.omit({\n id: true,\n functionId: true,\n});\n\nconst FunctionToolSchema = z.strictObject({\n ...MySchema.shape,\n ...MySchema2.shape,\n name: z.preprocess((v) => v ?? '', MySchema2.shape.name),\n // Even empty description should exist, otherwise agent-sdk show type error\n // dependencies: z.preprocess(\n // (v) => (v && Object.keys(v).length && v) || undefined,\n // MySchema.shape.dependencies\n // ),\n description: z.preprocess((v) => v || undefined, MySchema2.shape.description),\n functionToolId: z.string().nonempty(),\n});\n\ntype FunctionToolInput = z.input<typeof FunctionToolSchema>;\n\nexport function generateFunctionToolDefinition(data: FunctionToolInput): SourceFile {\n const result = FunctionToolSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Validation failed for function tool:\\n${z.prettifyError(result.error)}`);\n }\n\n const { functionToolId, executeCode, ...parsed } = result.data;\n const { sourceFile, configObject } = createFactoryDefinition({\n importName: 'functionTool',\n variableName: toToolReferenceName(parsed.name || functionToolId),\n });\n\n for (const [k, v] of Object.entries(parsed)) {\n addValueToObject(configObject, k, v);\n }\n if (executeCode) {\n configObject.addPropertyAssignment({\n name: 'execute',\n initializer: executeCode,\n });\n }\n return sourceFile;\n}\n"],"mappings":";;;;;AAKA,MAAM,WAAW,4BAA4B,MAAM,UAAU,QAAQ,CAAC,UAAU,KAAK,EACnF,IAAI,MACL,CAAC;AACF,MAAM,YAAY,4BAA4B,MAAM,cAAc,QAAQ,CAAC,UAAU,KAAK;CACxF,IAAI;CACJ,YAAY;CACb,CAAC;AAEF,MAAM,qBAAqB,EAAE,aAAa;CACxC,GAAG,SAAS;CACZ,GAAG,UAAU;CACb,MAAM,EAAE,YAAY,MAAM,KAAK,IAAI,UAAU,MAAM,KAAK;CAMxD,aAAa,EAAE,YAAY,MAAM,KAAK,QAAW,UAAU,MAAM,YAAY;CAC7E,gBAAgB,EAAE,QAAQ,CAAC,UAAU;CACtC,CAAC;AAIF,SAAgB,+BAA+B,MAAqC;CAClF,MAAM,SAAS,mBAAmB,UAAU,KAAK;AACjD,KAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,yCAAyC,EAAE,cAAc,OAAO,MAAM,GAAG;CAG3F,MAAM,EAAE,gBAAgB,aAAa,GAAG,WAAW,OAAO;CAC1D,MAAM,EAAE,YAAY,iBAAiB,wBAAwB;EAC3D,YAAY;EACZ,cAAc,oBAAoB,OAAO,QAAQ,eAAe;EACjE,CAAC;AAEF,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,CACzC,kBAAiB,cAAc,GAAG,EAAE;AAEtC,KAAI,YACF,cAAa,sBAAsB;EACjC,MAAM;EACN,aAAa;EACd,CAAC;AAEJ,QAAO"}
@@ -1,91 +1,50 @@
1
- import { addValueToObject, createFactoryDefinition, formatInlineLiteral, formatStringLiteral, toCamelCase } from "../utils.js";
1
+ import { addValueToObject, createFactoryDefinition, formatStringLiteral, toToolReferenceName } from "../utils.js";
2
+ import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
2
3
  import { z } from "zod";
3
4
 
4
5
  //#region src/commands/pull-v4/generators/mcp-tool-generator.ts
5
- const McpToolSchema = z.object({
6
+ const MySchema = FullProjectDefinitionSchema.shape.tools.valueType.omit({
7
+ id: true,
8
+ lastError: true
9
+ });
10
+ const McpToolSchema = z.strictObject({
6
11
  mcpToolId: z.string().nonempty(),
7
- name: z.string().nonempty(),
8
- description: z.string().nullable().optional(),
9
- config: z.looseObject({ mcp: z.looseObject({
10
- server: z.looseObject({ url: z.string().optional() }).optional(),
11
- transport: z.unknown().optional(),
12
- activeTools: z.array(z.unknown()).optional()
13
- }).optional() }).optional(),
14
- serverUrl: z.string().optional(),
15
- transport: z.object({ type: z.string() }).optional(),
16
- activeTools: z.array(z.unknown()).optional(),
17
- imageUrl: z.string().nullish().transform((value) => value ?? void 0),
18
- headers: z.unknown().optional(),
19
- credential: z.unknown().optional(),
20
- credentialReferenceId: z.string().nullish()
21
- }).superRefine((value, context) => {
22
- if (!resolveServerUrl(value)) context.addIssue({
23
- code: "custom",
24
- message: "serverUrl is required (from config.mcp.server.url or serverUrl)",
25
- path: ["serverUrl"]
26
- });
12
+ ...MySchema.shape,
13
+ description: z.preprocess((v) => v ?? void 0, MySchema.shape.description),
14
+ headers: z.preprocess((v) => v ?? void 0, MySchema.shape.headers),
15
+ capabilities: z.preprocess((v) => v && Object.keys(v).length && v || void 0, MySchema.shape.capabilities),
16
+ imageUrl: z.preprocess((v) => v || void 0, MySchema.shape.imageUrl),
17
+ credential: z.record(z.string(), z.unknown()).optional()
27
18
  });
28
- function generateMcpToolDefinition(data) {
19
+ function generateMcpToolDefinition({ tenantId, id, projectId, createdAt, updatedAt, lastError, ...data }) {
29
20
  const result = McpToolSchema.safeParse(data);
30
21
  if (!result.success) throw new Error(`Validation failed for MCP tool:\n${z.prettifyError(result.error)}`);
31
- const parsed = result.data;
22
+ const { credentialReferenceId, config, mcpToolId, ...parsed } = result.data;
32
23
  const { sourceFile, configObject } = createFactoryDefinition({
33
24
  importName: "mcpTool",
34
- variableName: toCamelCase(parsed.mcpToolId)
35
- });
36
- if (parsed.credentialReferenceId && parsed.credential === void 0) sourceFile.addImportDeclaration({
37
- namedImports: ["envSettings"],
38
- moduleSpecifier: "../environments"
25
+ variableName: toToolReferenceName(parsed.name)
39
26
  });
40
- writeMcpToolConfig(configObject, parsed);
41
- return sourceFile;
42
- }
43
- function writeMcpToolConfig(configObject, { mcpToolId, description, serverUrl, config, transport, activeTools, credential, credentialReferenceId, ...rest }) {
27
+ const activeTools = config?.mcp?.activeTools;
44
28
  for (const [k, v] of Object.entries({
45
29
  id: mcpToolId,
46
- ...rest,
47
- description: description ?? void 0,
48
- serverUrl: resolveServerUrl({
49
- config,
50
- serverUrl
51
- }),
52
- transport: resolveTransport({
53
- config,
54
- transport
55
- }),
56
- activeTools: resolveActiveTools({
57
- config,
58
- activeTools
59
- })
30
+ ...parsed,
31
+ serverUrl: config?.mcp?.server?.url,
32
+ transport: config?.mcp?.transport,
33
+ ...activeTools?.length && { activeTools }
60
34
  })) addValueToObject(configObject, k, v);
61
- if (credential !== void 0 && credential !== null) {
62
- if (typeof credential === "string") {
63
- configObject.addPropertyAssignment({
64
- name: "credential",
65
- initializer: credential
66
- });
67
- return;
68
- }
35
+ if (credentialReferenceId) {
36
+ sourceFile.addImportDeclaration({
37
+ namedImports: ["envSettings"],
38
+ moduleSpecifier: "../environments"
39
+ });
69
40
  configObject.addPropertyAssignment({
70
41
  name: "credential",
71
- initializer: formatInlineLiteral(credential)
42
+ initializer: `envSettings.getEnvironmentCredential(${formatStringLiteral(credentialReferenceId)})`
72
43
  });
73
- return;
74
44
  }
75
- if (credentialReferenceId) configObject.addPropertyAssignment({
76
- name: "credential",
77
- initializer: `envSettings.getEnvironmentCredential(${formatStringLiteral(credentialReferenceId)})`
78
- });
79
- }
80
- function resolveServerUrl(data) {
81
- return data.config?.mcp?.server?.url ?? data.serverUrl;
82
- }
83
- function resolveTransport(data) {
84
- return data.config?.mcp?.transport ?? data.transport;
85
- }
86
- function resolveActiveTools(data) {
87
- return data.config?.mcp?.activeTools ?? data.activeTools;
45
+ return sourceFile;
88
46
  }
89
47
 
90
48
  //#endregion
91
- export { generateMcpToolDefinition };
49
+ export { generateMcpToolDefinition };
50
+ //# sourceMappingURL=mcp-tool-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/mcp-tool-generator.ts"],"sourcesContent":["import { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport {\n addValueToObject,\n createFactoryDefinition,\n formatStringLiteral,\n toToolReferenceName,\n} from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.tools.valueType.omit({\n id: true,\n lastError: true,\n});\n\nconst McpToolSchema = z.strictObject({\n mcpToolId: z.string().nonempty(),\n ...MySchema.shape,\n description: z.preprocess((v) => v ?? undefined, MySchema.shape.description),\n headers: z.preprocess((v) => v ?? undefined, MySchema.shape.headers),\n capabilities: z.preprocess(\n (v) => (v && Object.keys(v).length && v) || undefined,\n MySchema.shape.capabilities\n ),\n imageUrl: z.preprocess((v) => v || undefined, MySchema.shape.imageUrl),\n // Additional field\n credential: z.record(z.string(), z.unknown()).optional(),\n});\n\ntype McpToolInput = z.input<typeof McpToolSchema>;\n\nexport function generateMcpToolDefinition({\n tenantId,\n id,\n projectId,\n createdAt,\n updatedAt,\n lastError,\n ...data\n}: McpToolInput & Record<string, unknown>): SourceFile {\n const result = McpToolSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Validation failed for MCP tool:\\n${z.prettifyError(result.error)}`);\n }\n\n const { credentialReferenceId, config, mcpToolId, ...parsed } = result.data;\n const { sourceFile, configObject } = createFactoryDefinition({\n importName: 'mcpTool',\n variableName: toToolReferenceName(parsed.name),\n });\n\n const activeTools = config?.mcp?.activeTools;\n for (const [k, v] of Object.entries({\n id: mcpToolId,\n ...parsed,\n serverUrl: config?.mcp?.server?.url,\n transport: config?.mcp?.transport,\n ...(activeTools?.length && { activeTools }),\n })) {\n addValueToObject(configObject, k, v);\n }\n\n if (credentialReferenceId) {\n sourceFile.addImportDeclaration({\n namedImports: ['envSettings'],\n moduleSpecifier: '../environments',\n });\n configObject.addPropertyAssignment({\n name: 'credential',\n initializer: `envSettings.getEnvironmentCredential(${formatStringLiteral(credentialReferenceId)})`,\n });\n }\n return sourceFile;\n}\n"],"mappings":";;;;;AAUA,MAAM,WAAW,4BAA4B,MAAM,MAAM,UAAU,KAAK;CACtE,IAAI;CACJ,WAAW;CACZ,CAAC;AAEF,MAAM,gBAAgB,EAAE,aAAa;CACnC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,GAAG,SAAS;CACZ,aAAa,EAAE,YAAY,MAAM,KAAK,QAAW,SAAS,MAAM,YAAY;CAC5E,SAAS,EAAE,YAAY,MAAM,KAAK,QAAW,SAAS,MAAM,QAAQ;CACpE,cAAc,EAAE,YACb,MAAO,KAAK,OAAO,KAAK,EAAE,CAAC,UAAU,KAAM,QAC5C,SAAS,MAAM,aAChB;CACD,UAAU,EAAE,YAAY,MAAM,KAAK,QAAW,SAAS,MAAM,SAAS;CAEtE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACzD,CAAC;AAIF,SAAgB,0BAA0B,EACxC,UACA,IACA,WACA,WACA,WACA,WACA,GAAG,QACkD;CACrD,MAAM,SAAS,cAAc,UAAU,KAAK;AAC5C,KAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,oCAAoC,EAAE,cAAc,OAAO,MAAM,GAAG;CAGtF,MAAM,EAAE,uBAAuB,QAAQ,WAAW,GAAG,WAAW,OAAO;CACvE,MAAM,EAAE,YAAY,iBAAiB,wBAAwB;EAC3D,YAAY;EACZ,cAAc,oBAAoB,OAAO,KAAK;EAC/C,CAAC;CAEF,MAAM,cAAc,QAAQ,KAAK;AACjC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ;EAClC,IAAI;EACJ,GAAG;EACH,WAAW,QAAQ,KAAK,QAAQ;EAChC,WAAW,QAAQ,KAAK;EACxB,GAAI,aAAa,UAAU,EAAE,aAAa;EAC3C,CAAC,CACA,kBAAiB,cAAc,GAAG,EAAE;AAGtC,KAAI,uBAAuB;AACzB,aAAW,qBAAqB;GAC9B,cAAc,CAAC,cAAc;GAC7B,iBAAiB;GAClB,CAAC;AACF,eAAa,sBAAsB;GACjC,MAAM;GACN,aAAa,wCAAwC,oBAAoB,sBAAsB,CAAC;GACjG,CAAC;;AAEJ,QAAO"}
@@ -1,4 +1,5 @@
1
- import { addReferenceGetterProperty, addValueToObject, convertNullToUndefined, createFactoryDefinition, createUniqueReferenceName, formatStringLiteral, hasReferences, resolveReferenceName, toCamelCase } from "../utils.js";
1
+ import { addReferenceGetterProperty, addValueToObject, buildComponentFileName, createFactoryDefinition, createUniqueReferenceName, formatStringLiteral, hasReferences, resolveReferenceName, toCamelCase } from "../utils.js";
2
+ import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
2
3
  import { z } from "zod";
3
4
 
4
5
  //#region src/commands/pull-v4/generators/project-generator.ts
@@ -11,19 +12,25 @@ const ReferenceOverridesSchema = z.object({
11
12
  artifactComponents: ReferenceNameByIdSchema.optional(),
12
13
  credentialReferences: ReferenceNameByIdSchema.optional()
13
14
  });
14
- const ProjectSchema = z.looseObject({
15
+ const ReferencePathOverridesSchema = z.object({
16
+ agents: ReferenceNameByIdSchema.optional(),
17
+ tools: ReferenceNameByIdSchema.optional(),
18
+ externalAgents: ReferenceNameByIdSchema.optional(),
19
+ dataComponents: ReferenceNameByIdSchema.optional(),
20
+ artifactComponents: ReferenceNameByIdSchema.optional(),
21
+ credentialReferences: ReferenceNameByIdSchema.optional()
22
+ });
23
+ const MySchema = FullProjectDefinitionSchema.pick({
24
+ name: true,
25
+ description: true,
26
+ models: true,
27
+ stopWhen: true
28
+ });
29
+ const ProjectSchema = z.strictObject({
15
30
  projectId: z.string().nonempty(),
16
- name: z.string().nonempty(),
17
- description: z.string().optional(),
18
- models: z.looseObject({
19
- base: z.looseObject({ model: z.string().nonempty() }),
20
- structuredOutput: z.looseObject({}).optional(),
21
- summarizer: z.looseObject({}).optional()
22
- }),
23
- stopWhen: z.preprocess(convertNullToUndefined, z.strictObject({
24
- transferCountIs: z.int().optional(),
25
- stepCountIs: z.int().optional()
26
- }).optional()),
31
+ ...MySchema.shape,
32
+ description: z.preprocess((v) => v || void 0, MySchema.shape.description),
33
+ stopWhen: z.preprocess((v) => v && Object.keys(v).length && v || void 0, MySchema.shape.stopWhen),
27
34
  skills: z.array(z.string()).optional(),
28
35
  agents: z.array(z.string()).optional(),
29
36
  tools: z.array(z.string()).optional(),
@@ -31,7 +38,8 @@ const ProjectSchema = z.looseObject({
31
38
  dataComponents: z.array(z.string()).optional(),
32
39
  artifactComponents: z.array(z.string()).optional(),
33
40
  credentialReferences: z.array(z.string()).optional(),
34
- referenceOverrides: ReferenceOverridesSchema.optional()
41
+ referenceOverrides: ReferenceOverridesSchema.optional(),
42
+ referencePathOverrides: ReferencePathOverridesSchema.optional()
35
43
  });
36
44
  function generateProjectDefinition(data) {
37
45
  const result = ProjectSchema.safeParse(data);
@@ -51,7 +59,8 @@ ${z.prettifyError(result.error)}`);
51
59
  moduleSpecifier: "node:path"
52
60
  });
53
61
  }
54
- const { projectId, skills, agents, tools, externalAgents, dataComponents, artifactComponents, credentialReferences, referenceOverrides, ...rest } = parsed;
62
+ const { projectId, skills, agents, tools, externalAgents, dataComponents, artifactComponents, credentialReferences, referenceOverrides, referencePathOverrides, ...rest } = parsed;
63
+ const credentialReferenceResolved = hasReferences(credentialReferences) ? createResolvedReferences(credentialReferences, referenceOverrides?.credentialReferences, referencePathOverrides?.credentialReferences, reservedReferenceNames, "CredentialReference", "numeric") : void 0;
55
64
  for (const [key, value] of Object.entries({
56
65
  id: projectId,
57
66
  ...rest
@@ -61,32 +70,32 @@ ${z.prettifyError(result.error)}`);
61
70
  initializer: `() => loadSkills(path.join(${formatStringLiteral(projectId)}, 'skills'))`
62
71
  });
63
72
  if (hasReferences(agents)) {
64
- const resolvedReferences = createResolvedReferences(agents, referenceOverrides?.agents, reservedReferenceNames, "Agent");
73
+ const resolvedReferences = createResolvedReferences(agents, referenceOverrides?.agents, referencePathOverrides?.agents, reservedReferenceNames, "Agent");
65
74
  addReferenceImports(sourceFile, resolvedReferences, "./agents");
66
75
  addReferenceGetterProperty(configObject, "agents", toReferenceNames(resolvedReferences));
67
76
  }
68
77
  if (hasReferences(tools)) {
69
- const resolvedReferences = createResolvedReferences(tools, referenceOverrides?.tools, reservedReferenceNames, "Tool");
78
+ const resolvedReferences = createResolvedReferences(tools, referenceOverrides?.tools, referencePathOverrides?.tools, reservedReferenceNames, "Tool", "numeric-for-duplicates");
70
79
  addReferenceImports(sourceFile, resolvedReferences, "./tools");
71
80
  addReferenceGetterProperty(configObject, "tools", toReferenceNames(resolvedReferences));
72
81
  }
73
82
  if (hasReferences(externalAgents)) {
74
- const resolvedReferences = createResolvedReferences(externalAgents, referenceOverrides?.externalAgents, reservedReferenceNames, "ExternalAgent");
83
+ const resolvedReferences = createResolvedReferences(externalAgents, referenceOverrides?.externalAgents, referencePathOverrides?.externalAgents, reservedReferenceNames, "ExternalAgent");
75
84
  addReferenceImports(sourceFile, resolvedReferences, "./external-agents");
76
85
  addReferenceGetterProperty(configObject, "externalAgents", toReferenceNames(resolvedReferences));
77
86
  }
78
87
  if (hasReferences(dataComponents)) {
79
- const resolvedReferences = createResolvedReferences(dataComponents, referenceOverrides?.dataComponents, reservedReferenceNames, "DataComponent");
88
+ const resolvedReferences = createResolvedReferences(dataComponents, referenceOverrides?.dataComponents, referencePathOverrides?.dataComponents, reservedReferenceNames, "DataComponent");
80
89
  addReferenceImports(sourceFile, resolvedReferences, "./data-components");
81
90
  addReferenceGetterProperty(configObject, "dataComponents", toReferenceNames(resolvedReferences));
82
91
  }
83
92
  if (hasReferences(artifactComponents)) {
84
- const resolvedReferences = createResolvedReferences(artifactComponents, referenceOverrides?.artifactComponents, reservedReferenceNames, "ArtifactComponent");
93
+ const resolvedReferences = createResolvedReferences(artifactComponents, referenceOverrides?.artifactComponents, referencePathOverrides?.artifactComponents, reservedReferenceNames, "ArtifactComponent");
85
94
  addReferenceImports(sourceFile, resolvedReferences, "./artifact-components");
86
95
  addReferenceGetterProperty(configObject, "artifactComponents", toReferenceNames(resolvedReferences));
87
96
  }
88
97
  if (hasReferences(credentialReferences)) {
89
- const resolvedReferences = createResolvedReferences(credentialReferences, referenceOverrides?.credentialReferences, reservedReferenceNames, "CredentialReference");
98
+ const resolvedReferences = credentialReferenceResolved ?? [];
90
99
  addReferenceImports(sourceFile, resolvedReferences, "./credentials");
91
100
  addReferenceGetterProperty(configObject, "credentialReferences", toReferenceNames(resolvedReferences));
92
101
  }
@@ -98,28 +107,52 @@ function addReferenceImports(sourceFile, references, basePath) {
98
107
  name: reference.importName,
99
108
  alias: reference.localName
100
109
  }],
101
- moduleSpecifier: `${basePath}/${reference.id}`
110
+ moduleSpecifier: `${basePath}/${reference.modulePath}`
102
111
  });
103
112
  }
104
113
  function toReferenceNames(references) {
105
114
  return references.map((reference) => reference.localName);
106
115
  }
107
- function createResolvedReferences(references, referenceOverrides, reservedReferenceNames, suffix) {
116
+ function createResolvedReferences(references, referenceOverrides, referencePathOverrides, reservedReferenceNames, suffix, collisionStrategy = "descriptive") {
108
117
  const seenIds = /* @__PURE__ */ new Set();
109
- const resolvedReferences = [];
118
+ const normalizedReferences = [];
110
119
  for (const referenceId of references) {
111
120
  if (seenIds.has(referenceId)) continue;
112
121
  seenIds.add(referenceId);
113
- const importName = resolveReferenceName(referenceId, [referenceOverrides]);
114
- const localName = createUniqueReferenceName(importName, reservedReferenceNames, suffix);
115
- resolvedReferences.push({
122
+ normalizedReferences.push({
116
123
  id: referenceId,
117
- importName,
118
- localName
124
+ importName: resolveReferenceName(referenceId, [referenceOverrides]),
125
+ modulePath: resolveReferenceModulePath(referenceId, referencePathOverrides?.[referenceId])
119
126
  });
120
127
  }
121
- return resolvedReferences;
128
+ const importNameCounts = /* @__PURE__ */ new Map();
129
+ for (const reference of normalizedReferences) importNameCounts.set(reference.importName, (importNameCounts.get(reference.importName) ?? 0) + 1);
130
+ return normalizedReferences.map((reference) => {
131
+ const localName = collisionStrategy === "numeric" || collisionStrategy === "numeric-for-duplicates" && (importNameCounts.get(reference.importName) ?? 0) > 1 ? createNumericReferenceName(reference.importName, reservedReferenceNames) : createUniqueReferenceName(reference.importName, reservedReferenceNames, suffix);
132
+ return {
133
+ id: reference.id,
134
+ importName: reference.importName,
135
+ localName,
136
+ modulePath: reference.modulePath
137
+ };
138
+ });
139
+ }
140
+ function createNumericReferenceName(baseName, reservedNames) {
141
+ if (!reservedNames.has(baseName)) {
142
+ reservedNames.add(baseName);
143
+ return baseName;
144
+ }
145
+ let index = 1;
146
+ while (reservedNames.has(`${baseName}${index}`)) index += 1;
147
+ const uniqueName = `${baseName}${index}`;
148
+ reservedNames.add(uniqueName);
149
+ return uniqueName;
150
+ }
151
+ function resolveReferenceModulePath(referenceId, referencePathOverride) {
152
+ if (referencePathOverride && referencePathOverride.length > 0) return referencePathOverride.replace(/\.tsx?$/, "");
153
+ return buildComponentFileName(referenceId).replace(/\.tsx?$/, "");
122
154
  }
123
155
 
124
156
  //#endregion
125
- export { generateProjectDefinition };
157
+ export { generateProjectDefinition };
158
+ //# sourceMappingURL=project-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/project-generator.ts"],"sourcesContent":["import { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport {\n addReferenceGetterProperty,\n addValueToObject,\n buildComponentFileName,\n createFactoryDefinition,\n createUniqueReferenceName,\n formatStringLiteral,\n hasReferences,\n resolveReferenceName,\n toCamelCase,\n} from '../utils';\n\nconst ReferenceNameByIdSchema = z.record(z.string(), z.string().nonempty());\n\nconst ReferenceOverridesSchema = z.object({\n agents: ReferenceNameByIdSchema.optional(),\n tools: ReferenceNameByIdSchema.optional(),\n externalAgents: ReferenceNameByIdSchema.optional(),\n dataComponents: ReferenceNameByIdSchema.optional(),\n artifactComponents: ReferenceNameByIdSchema.optional(),\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\nconst ReferencePathOverridesSchema = z.object({\n agents: ReferenceNameByIdSchema.optional(),\n tools: ReferenceNameByIdSchema.optional(),\n externalAgents: ReferenceNameByIdSchema.optional(),\n dataComponents: ReferenceNameByIdSchema.optional(),\n artifactComponents: ReferenceNameByIdSchema.optional(),\n credentialReferences: ReferenceNameByIdSchema.optional(),\n});\n\ninterface ResolvedReference {\n id: string;\n importName: string;\n localName: string;\n modulePath: string;\n}\n\ntype CollisionStrategy = 'descriptive' | 'numeric' | 'numeric-for-duplicates';\n\nconst MySchema = FullProjectDefinitionSchema.pick({\n name: true,\n description: true,\n models: true,\n stopWhen: true,\n});\n\nconst ProjectSchema = z.strictObject({\n projectId: z.string().nonempty(),\n ...MySchema.shape,\n description: z.preprocess((v) => v || undefined, MySchema.shape.description),\n // Invalid input: expected object, received null\n stopWhen: z.preprocess(\n (v) => (v && Object.keys(v).length && v) || undefined,\n MySchema.shape.stopWhen\n ),\n skills: z.array(z.string()).optional(),\n agents: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional(),\n externalAgents: z.array(z.string()).optional(),\n dataComponents: z.array(z.string()).optional(),\n artifactComponents: z.array(z.string()).optional(),\n credentialReferences: z.array(z.string()).optional(),\n referenceOverrides: ReferenceOverridesSchema.optional(),\n referencePathOverrides: ReferencePathOverridesSchema.optional(),\n});\n\ntype ProjectInput = z.input<typeof ProjectSchema>;\n\nexport function generateProjectDefinition(data: ProjectInput): SourceFile {\n const result = ProjectSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Validation failed for project:\n${z.prettifyError(result.error)}`);\n }\n\n const parsed = result.data;\n const projectVariableName = toCamelCase(parsed.projectId);\n const { sourceFile, configObject } = createFactoryDefinition({\n importName: 'project',\n variableName: projectVariableName,\n });\n const reservedReferenceNames = new Set([projectVariableName]);\n if (hasReferences(parsed.skills)) {\n sourceFile.getImportDeclarationOrThrow('@inkeep/agents-sdk').addNamedImport('loadSkills');\n sourceFile.addImportDeclaration({\n defaultImport: 'path',\n moduleSpecifier: 'node:path',\n });\n }\n\n const {\n projectId,\n skills,\n agents,\n tools,\n externalAgents,\n dataComponents,\n artifactComponents,\n credentialReferences,\n referenceOverrides,\n referencePathOverrides,\n ...rest\n } = parsed;\n\n const credentialReferenceResolved = hasReferences(credentialReferences)\n ? createResolvedReferences(\n credentialReferences,\n referenceOverrides?.credentialReferences,\n referencePathOverrides?.credentialReferences,\n reservedReferenceNames,\n 'CredentialReference',\n 'numeric'\n )\n : undefined;\n\n for (const [key, value] of Object.entries({\n id: projectId,\n ...rest,\n })) {\n addValueToObject(configObject, key, value);\n }\n\n if (hasReferences(skills)) {\n configObject.addPropertyAssignment({\n name: 'skills',\n initializer: `() => loadSkills(path.join(${formatStringLiteral(projectId)}, 'skills'))`,\n });\n }\n\n if (hasReferences(agents)) {\n const resolvedReferences = createResolvedReferences(\n agents,\n referenceOverrides?.agents,\n referencePathOverrides?.agents,\n reservedReferenceNames,\n 'Agent'\n );\n addReferenceImports(sourceFile, resolvedReferences, './agents');\n addReferenceGetterProperty(configObject, 'agents', toReferenceNames(resolvedReferences));\n }\n\n if (hasReferences(tools)) {\n const resolvedReferences = createResolvedReferences(\n tools,\n referenceOverrides?.tools,\n referencePathOverrides?.tools,\n reservedReferenceNames,\n 'Tool',\n 'numeric-for-duplicates'\n );\n addReferenceImports(sourceFile, resolvedReferences, './tools');\n addReferenceGetterProperty(configObject, 'tools', toReferenceNames(resolvedReferences));\n }\n\n if (hasReferences(externalAgents)) {\n const resolvedReferences = createResolvedReferences(\n externalAgents,\n referenceOverrides?.externalAgents,\n referencePathOverrides?.externalAgents,\n reservedReferenceNames,\n 'ExternalAgent'\n );\n addReferenceImports(sourceFile, resolvedReferences, './external-agents');\n addReferenceGetterProperty(\n configObject,\n 'externalAgents',\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(dataComponents)) {\n const resolvedReferences = createResolvedReferences(\n dataComponents,\n referenceOverrides?.dataComponents,\n referencePathOverrides?.dataComponents,\n reservedReferenceNames,\n 'DataComponent'\n );\n addReferenceImports(sourceFile, resolvedReferences, './data-components');\n addReferenceGetterProperty(\n configObject,\n 'dataComponents',\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(artifactComponents)) {\n const resolvedReferences = createResolvedReferences(\n artifactComponents,\n referenceOverrides?.artifactComponents,\n referencePathOverrides?.artifactComponents,\n reservedReferenceNames,\n 'ArtifactComponent'\n );\n addReferenceImports(sourceFile, resolvedReferences, './artifact-components');\n addReferenceGetterProperty(\n configObject,\n 'artifactComponents',\n toReferenceNames(resolvedReferences)\n );\n }\n\n if (hasReferences(credentialReferences)) {\n const resolvedReferences = credentialReferenceResolved ?? [];\n addReferenceImports(sourceFile, resolvedReferences, './credentials');\n addReferenceGetterProperty(\n configObject,\n 'credentialReferences',\n toReferenceNames(resolvedReferences)\n );\n }\n\n return sourceFile;\n}\n\nfunction addReferenceImports(\n sourceFile: SourceFile,\n references: ResolvedReference[],\n basePath: string\n): void {\n for (const reference of references) {\n sourceFile.addImportDeclaration({\n namedImports: [\n reference.importName === reference.localName\n ? reference.importName\n : { name: reference.importName, alias: reference.localName },\n ],\n moduleSpecifier: `${basePath}/${reference.modulePath}`,\n });\n }\n}\n\nfunction toReferenceNames(references: ResolvedReference[]): string[] {\n return references.map((reference) => reference.localName);\n}\n\nfunction createResolvedReferences(\n references: string[],\n referenceOverrides: Record<string, string> | undefined,\n referencePathOverrides: Record<string, string> | undefined,\n reservedReferenceNames: Set<string>,\n suffix: string,\n collisionStrategy: CollisionStrategy = 'descriptive'\n): ResolvedReference[] {\n const seenIds = new Set<string>();\n const normalizedReferences: Array<{\n id: string;\n importName: string;\n modulePath: string;\n }> = [];\n\n for (const referenceId of references) {\n if (seenIds.has(referenceId)) {\n continue;\n }\n seenIds.add(referenceId);\n\n normalizedReferences.push({\n id: referenceId,\n importName: resolveReferenceName(referenceId, [referenceOverrides]),\n modulePath: resolveReferenceModulePath(referenceId, referencePathOverrides?.[referenceId]),\n });\n }\n\n const importNameCounts = new Map<string, number>();\n for (const reference of normalizedReferences) {\n importNameCounts.set(\n reference.importName,\n (importNameCounts.get(reference.importName) ?? 0) + 1\n );\n }\n\n return normalizedReferences.map((reference) => {\n const shouldUseNumeric =\n collisionStrategy === 'numeric' ||\n (collisionStrategy === 'numeric-for-duplicates' &&\n (importNameCounts.get(reference.importName) ?? 0) > 1);\n\n const localName = shouldUseNumeric\n ? createNumericReferenceName(reference.importName, reservedReferenceNames)\n : createUniqueReferenceName(reference.importName, reservedReferenceNames, suffix);\n\n return {\n id: reference.id,\n importName: reference.importName,\n localName,\n modulePath: reference.modulePath,\n };\n });\n}\n\nfunction createNumericReferenceName(baseName: string, reservedNames: Set<string>): string {\n if (!reservedNames.has(baseName)) {\n reservedNames.add(baseName);\n return baseName;\n }\n\n let index = 1;\n while (reservedNames.has(`${baseName}${index}`)) {\n index += 1;\n }\n\n const uniqueName = `${baseName}${index}`;\n reservedNames.add(uniqueName);\n return uniqueName;\n}\n\nfunction resolveReferenceModulePath(\n referenceId: string,\n referencePathOverride: string | undefined\n): string {\n if (referencePathOverride && referencePathOverride.length > 0) {\n return referencePathOverride.replace(/\\.tsx?$/, '');\n }\n\n const fileName = buildComponentFileName(referenceId);\n return fileName.replace(/\\.tsx?$/, '');\n}\n"],"mappings":"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"}
@@ -1,8 +1,10 @@
1
+ import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
1
2
  import { join } from "node:path";
2
3
  import { stringify } from "yaml";
3
4
  import { mkdir, writeFile } from "node:fs/promises";
4
5
 
5
6
  //#region src/commands/pull-v4/generators/skill-generator.ts
7
+ FullProjectDefinitionSchema.shape.skills.unwrap().valueType;
6
8
  function formatMetadata(metadata) {
7
9
  return `metadata:\n${stringify(metadata).split("\n").filter((line) => line.trim() !== "").map((line) => ` ${line}`).join("\n")}`;
8
10
  }
@@ -20,4 +22,5 @@ async function generateSkills(skills, skillsDir) {
20
22
  }
21
23
 
22
24
  //#endregion
23
- export { generateSkills };
25
+ export { generateSkills };
26
+ //# sourceMappingURL=skill-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/skill-generator.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport { stringify } from 'yaml';\nimport type { z } from 'zod';\n\nconst MySchema = FullProjectDefinitionSchema.shape.skills.unwrap().valueType;\n\ntype SkillInput = z.input<typeof MySchema>;\n\ntype SkillMap = Record<string, SkillInput>;\n\nfunction formatMetadata(metadata: NonNullable<SkillInput['metadata']>): string {\n const yaml = stringify(metadata);\n const indented = yaml\n .split('\\n')\n .filter((line) => line.trim() !== '')\n .map((line) => ` ${line}`)\n .join('\\n');\n return `metadata:\\n${indented}`;\n}\n\nexport async function generateSkills(skills: SkillMap, skillsDir: string): Promise<void> {\n await mkdir(skillsDir, { recursive: true });\n\n for (const [skillId, skill] of Object.entries(skills)) {\n const parts: string[] = ['---', `name: ${JSON.stringify(skill.name)}`];\n parts.push(`description: ${JSON.stringify(skill.description ?? '')}`);\n\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n parts.push(formatMetadata(skill.metadata));\n }\n\n parts.push('---', '', skill.content || '');\n\n const skillDir = join(skillsDir, skillId);\n await mkdir(skillDir, { recursive: true });\n\n const filePath = join(skillDir, 'SKILL.md');\n await writeFile(filePath, parts.join('\\n'), 'utf8');\n }\n}\n"],"mappings":";;;;;;AAMiB,4BAA4B,MAAM,OAAO,QAAQ,CAAC;AAMnE,SAAS,eAAe,UAAuD;AAO7E,QAAO,cANM,UAAU,SAAS,CAE7B,MAAM,KAAK,CACX,QAAQ,SAAS,KAAK,MAAM,KAAK,GAAG,CACpC,KAAK,SAAS,KAAK,OAAO,CAC1B,KAAK,KAAK;;AAIf,eAAsB,eAAe,QAAkB,WAAkC;AACvF,OAAM,MAAM,WAAW,EAAE,WAAW,MAAM,CAAC;AAE3C,MAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,OAAO,EAAE;EACrD,MAAM,QAAkB,CAAC,OAAO,SAAS,KAAK,UAAU,MAAM,KAAK,GAAG;AACtE,QAAM,KAAK,gBAAgB,KAAK,UAAU,MAAM,eAAe,GAAG,GAAG;AAErE,MAAI,MAAM,YAAY,OAAO,KAAK,MAAM,SAAS,CAAC,SAAS,EACzD,OAAM,KAAK,eAAe,MAAM,SAAS,CAAC;AAG5C,QAAM,KAAK,OAAO,IAAI,MAAM,WAAW,GAAG;EAE1C,MAAM,WAAW,KAAK,WAAW,QAAQ;AACzC,QAAM,MAAM,UAAU,EAAE,WAAW,MAAM,CAAC;AAG1C,QAAM,UADW,KAAK,UAAU,WAAW,EACjB,MAAM,KAAK,KAAK,EAAE,OAAO"}
@@ -1,35 +1,35 @@
1
1
  import { addValueToObject, convertJsonSchemaToZodSafe, createFactoryDefinition, toCamelCase } from "../utils.js";
2
+ import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
2
3
  import { z } from "zod";
3
4
 
4
5
  //#region src/commands/pull-v4/generators/status-component-generator.ts
5
- const StatusComponentSchema = z.looseObject({
6
+ const MySchema = FullProjectDefinitionSchema.shape.statusUpdates.unwrap().shape.statusComponents.unwrap().element;
7
+ const StatusComponentSchema = z.strictObject({
6
8
  statusComponentId: z.string().nonempty(),
7
- type: z.string().nonempty(),
8
- description: z.string().optional(),
9
- detailsSchema: z.unknown().optional(),
10
- schema: z.unknown().optional()
9
+ ...MySchema.shape
11
10
  });
12
- function generateStatusComponentDefinition(data) {
11
+ function generateStatusComponentDefinition({ id, ...data }) {
13
12
  const result = StatusComponentSchema.safeParse(data);
14
13
  if (!result.success) throw new Error(`Validation failed for status component:\n${z.prettifyError(result.error)}`);
15
- const parsed = result.data;
16
- const detailsSchema = parsed.detailsSchema !== void 0 ? parsed.detailsSchema : parsed.schema;
14
+ const { statusComponentId, detailsSchema, ...rest } = result.data;
17
15
  const { sourceFile, configObject } = createFactoryDefinition({
18
16
  importName: "statusComponent",
19
- variableName: toCamelCase(parsed.statusComponentId)
17
+ variableName: toCamelCase(statusComponentId)
20
18
  });
21
- if (detailsSchema !== void 0) sourceFile.addImportDeclaration({
22
- namedImports: ["z"],
23
- moduleSpecifier: "zod"
24
- });
25
- const { statusComponentId, id, detailsSchema: _, schema: _2, ...rest } = parsed;
26
19
  for (const [k, v] of Object.entries(rest)) addValueToObject(configObject, k, v);
27
- if (detailsSchema) configObject.addPropertyAssignment({
28
- name: "detailsSchema",
29
- initializer: convertJsonSchemaToZodSafe(detailsSchema)
30
- });
20
+ if (detailsSchema) {
21
+ sourceFile.addImportDeclaration({
22
+ namedImports: ["z"],
23
+ moduleSpecifier: "zod"
24
+ });
25
+ configObject.addPropertyAssignment({
26
+ name: "detailsSchema",
27
+ initializer: convertJsonSchemaToZodSafe(detailsSchema)
28
+ });
29
+ }
31
30
  return sourceFile;
32
31
  }
33
32
 
34
33
  //#endregion
35
- export { generateStatusComponentDefinition };
34
+ export { generateStatusComponentDefinition };
35
+ //# sourceMappingURL=status-component-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-component-generator.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/status-component-generator.ts"],"sourcesContent":["import { FullProjectDefinitionSchema } from '@inkeep/agents-core';\nimport type { SourceFile } from 'ts-morph';\nimport { z } from 'zod';\nimport {\n addValueToObject,\n convertJsonSchemaToZodSafe,\n createFactoryDefinition,\n toCamelCase,\n} from '../utils';\n\nconst MySchema = FullProjectDefinitionSchema.shape.statusUpdates\n .unwrap()\n .shape.statusComponents.unwrap().element;\n\nconst StatusComponentSchema = z.strictObject({\n statusComponentId: z.string().nonempty(),\n ...MySchema.shape,\n});\n\ntype StatusComponentInput = z.input<typeof StatusComponentSchema>;\n\nexport function generateStatusComponentDefinition({\n id,\n ...data\n}: StatusComponentInput & Record<string, unknown>): SourceFile {\n const result = StatusComponentSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Validation failed for status component:\\n${z.prettifyError(result.error)}`);\n }\n\n const { statusComponentId, detailsSchema, ...rest } = result.data;\n\n const { sourceFile, configObject } = createFactoryDefinition({\n importName: 'statusComponent',\n variableName: toCamelCase(statusComponentId),\n });\n\n for (const [k, v] of Object.entries(rest)) {\n addValueToObject(configObject, k, v);\n }\n if (detailsSchema) {\n sourceFile.addImportDeclaration({\n namedImports: ['z'],\n moduleSpecifier: 'zod',\n });\n configObject.addPropertyAssignment({\n name: 'detailsSchema',\n initializer: convertJsonSchemaToZodSafe(detailsSchema),\n });\n }\n\n return sourceFile;\n}\n"],"mappings":";;;;;AAUA,MAAM,WAAW,4BAA4B,MAAM,cAChD,QAAQ,CACR,MAAM,iBAAiB,QAAQ,CAAC;AAEnC,MAAM,wBAAwB,EAAE,aAAa;CAC3C,mBAAmB,EAAE,QAAQ,CAAC,UAAU;CACxC,GAAG,SAAS;CACb,CAAC;AAIF,SAAgB,kCAAkC,EAChD,IACA,GAAG,QAC0D;CAC7D,MAAM,SAAS,sBAAsB,UAAU,KAAK;AACpD,KAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,4CAA4C,EAAE,cAAc,OAAO,MAAM,GAAG;CAG9F,MAAM,EAAE,mBAAmB,eAAe,GAAG,SAAS,OAAO;CAE7D,MAAM,EAAE,YAAY,iBAAiB,wBAAwB;EAC3D,YAAY;EACZ,cAAc,YAAY,kBAAkB;EAC7C,CAAC;AAEF,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,CACvC,kBAAiB,cAAc,GAAG,EAAE;AAEtC,KAAI,eAAe;AACjB,aAAW,qBAAqB;GAC9B,cAAc,CAAC,IAAI;GACnB,iBAAiB;GAClB,CAAC;AACF,eAAa,sBAAsB;GACjC,MAAM;GACN,aAAa,2BAA2B,cAAc;GACvD,CAAC;;AAGJ,QAAO"}
@@ -0,0 +1,84 @@
1
+ import { formatInlineLiteral, isPlainObject, resolveReferenceName, toCamelCase } from "../utils.js";
2
+
3
+ //#region src/commands/pull-v4/generators/sub-agent-generator.helpers.ts
4
+ function resolveSubAgentName(subAgentId, name) {
5
+ if (name !== void 0) return name;
6
+ return subAgentId.replace(/[-_]/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/\b\w/g, (char) => char.toUpperCase());
7
+ }
8
+ function resolveSubAgentVariableName(subAgentId, name) {
9
+ return toCamelCase(name || subAgentId);
10
+ }
11
+ function collectCanUseReferences(canUse, toolReferenceOverrides) {
12
+ if (!Array.isArray(canUse)) return [];
13
+ const references = [];
14
+ for (const item of canUse) {
15
+ if (typeof item === "string") {
16
+ references.push(resolveReferenceName(item, [toolReferenceOverrides]));
17
+ continue;
18
+ }
19
+ if (!isPlainObject(item)) continue;
20
+ const toolId = typeof item.toolId === "string" ? item.toolId : void 0;
21
+ if (!toolId) continue;
22
+ const toolReference = resolveReferenceName(toolId, [toolReferenceOverrides]);
23
+ const withConfig = {};
24
+ const selectedTools = Array.isArray(item.toolSelection) && item.toolSelection.length ? item.toolSelection : Array.isArray(item.selectedTools) && item.selectedTools.length ? item.selectedTools : void 0;
25
+ if (selectedTools) withConfig.selectedTools = selectedTools;
26
+ if (isPlainObject(item.headers) && Object.keys(item.headers).length) withConfig.headers = item.headers;
27
+ if (isPlainObject(item.toolPolicies) && Object.keys(item.toolPolicies).length) withConfig.toolPolicies = item.toolPolicies;
28
+ if (Object.keys(withConfig).length > 0) {
29
+ references.push(`${toolReference}.with(${formatInlineLiteral(withConfig)})`);
30
+ continue;
31
+ }
32
+ references.push(toolReference);
33
+ }
34
+ return references;
35
+ }
36
+ function collectCanDelegateToReferences(canDelegateTo, referenceOverrides) {
37
+ if (!Array.isArray(canDelegateTo)) return [];
38
+ const references = [];
39
+ for (const item of canDelegateTo) {
40
+ if (typeof item === "string") {
41
+ references.push(resolveReferenceName(item, [
42
+ referenceOverrides.subAgents,
43
+ referenceOverrides.agents,
44
+ referenceOverrides.externalAgents
45
+ ]));
46
+ continue;
47
+ }
48
+ if (!isPlainObject(item)) continue;
49
+ const subAgentId = typeof item.subAgentId === "string" ? item.subAgentId : void 0;
50
+ const agentId = typeof item.agentId === "string" ? item.agentId : void 0;
51
+ const externalAgentId = typeof item.externalAgentId === "string" ? item.externalAgentId : void 0;
52
+ const targetId = subAgentId || agentId || externalAgentId;
53
+ if (!targetId) continue;
54
+ const targetReference = subAgentId ? resolveReferenceName(subAgentId, [referenceOverrides.subAgents]) : agentId ? resolveReferenceName(agentId, [referenceOverrides.agents]) : resolveReferenceName(targetId, [referenceOverrides.externalAgents]);
55
+ if (isPlainObject(item.headers) && Object.keys(item.headers).length > 0) {
56
+ references.push(`${targetReference}.with(${formatInlineLiteral({ headers: item.headers })})`);
57
+ continue;
58
+ }
59
+ references.push(targetReference);
60
+ }
61
+ return references;
62
+ }
63
+ function collectSkills(skills) {
64
+ if (!Array.isArray(skills)) return [];
65
+ const formattedSkills = [];
66
+ for (const skill of skills) {
67
+ if (typeof skill === "string") {
68
+ formattedSkills.push(formatInlineLiteral(skill));
69
+ continue;
70
+ }
71
+ if (!isPlainObject(skill)) continue;
72
+ const skillId = typeof skill.id === "string" ? skill.id : typeof skill.skillId === "string" ? skill.skillId : void 0;
73
+ if (!skillId) continue;
74
+ const formattedSkill = { id: skillId };
75
+ if (typeof skill.index === "number" && Number.isInteger(skill.index)) formattedSkill.index = skill.index;
76
+ if (typeof skill.alwaysLoaded === "boolean") formattedSkill.alwaysLoaded = skill.alwaysLoaded;
77
+ formattedSkills.push(formatInlineLiteral(formattedSkill));
78
+ }
79
+ return formattedSkills;
80
+ }
81
+
82
+ //#endregion
83
+ export { collectCanDelegateToReferences, collectCanUseReferences, collectSkills, resolveSubAgentName, resolveSubAgentVariableName };
84
+ //# sourceMappingURL=sub-agent-generator.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-agent-generator.helpers.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/sub-agent-generator.helpers.ts"],"sourcesContent":["import { formatInlineLiteral, isPlainObject, resolveReferenceName, toCamelCase } from '../utils';\n\ninterface DelegateReferenceOverrides {\n subAgents?: Record<string, string>;\n agents?: Record<string, string>;\n externalAgents?: Record<string, string>;\n}\n\nexport function resolveSubAgentName(subAgentId: string, name?: string): string {\n if (name !== undefined) {\n return name;\n }\n\n return subAgentId\n .replace(/[-_]/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function resolveSubAgentVariableName(subAgentId: string, name?: string): string {\n const seed = name || subAgentId;\n return toCamelCase(seed);\n}\n\nexport function collectCanUseReferences(\n canUse?: unknown[],\n toolReferenceOverrides?: Record<string, string>\n): string[] {\n if (!Array.isArray(canUse)) {\n return [];\n }\n\n const references: string[] = [];\n for (const item of canUse) {\n if (typeof item === 'string') {\n references.push(resolveReferenceName(item, [toolReferenceOverrides]));\n continue;\n }\n\n if (!isPlainObject(item)) {\n continue;\n }\n\n const toolId = typeof item.toolId === 'string' ? item.toolId : undefined;\n if (!toolId) {\n continue;\n }\n\n const toolReference = resolveReferenceName(toolId, [toolReferenceOverrides]);\n const withConfig: Record<string, unknown> = {};\n const selectedTools =\n Array.isArray(item.toolSelection) && item.toolSelection.length\n ? item.toolSelection\n : Array.isArray(item.selectedTools) && item.selectedTools.length\n ? item.selectedTools\n : undefined;\n\n if (selectedTools) {\n withConfig.selectedTools = selectedTools;\n }\n\n if (isPlainObject(item.headers) && Object.keys(item.headers).length) {\n withConfig.headers = item.headers;\n }\n\n if (isPlainObject(item.toolPolicies) && Object.keys(item.toolPolicies).length) {\n withConfig.toolPolicies = item.toolPolicies;\n }\n\n if (Object.keys(withConfig).length > 0) {\n references.push(`${toolReference}.with(${formatInlineLiteral(withConfig)})`);\n continue;\n }\n\n references.push(toolReference);\n }\n\n return references;\n}\n\nexport function collectCanDelegateToReferences(\n canDelegateTo: unknown[] | undefined,\n referenceOverrides: DelegateReferenceOverrides\n): string[] {\n if (!Array.isArray(canDelegateTo)) {\n return [];\n }\n\n const references: string[] = [];\n for (const item of canDelegateTo) {\n if (typeof item === 'string') {\n references.push(\n resolveReferenceName(item, [\n referenceOverrides.subAgents,\n referenceOverrides.agents,\n referenceOverrides.externalAgents,\n ])\n );\n continue;\n }\n\n if (!isPlainObject(item)) {\n continue;\n }\n\n const subAgentId = typeof item.subAgentId === 'string' ? item.subAgentId : undefined;\n const agentId = typeof item.agentId === 'string' ? item.agentId : undefined;\n const externalAgentId =\n typeof item.externalAgentId === 'string' ? item.externalAgentId : undefined;\n const targetId = subAgentId || agentId || externalAgentId;\n\n if (!targetId) {\n continue;\n }\n\n const targetReference = subAgentId\n ? resolveReferenceName(subAgentId, [referenceOverrides.subAgents])\n : agentId\n ? resolveReferenceName(agentId, [referenceOverrides.agents])\n : resolveReferenceName(targetId, [referenceOverrides.externalAgents]);\n\n if (isPlainObject(item.headers) && Object.keys(item.headers).length > 0) {\n references.push(\n `${targetReference}.with(${formatInlineLiteral({\n headers: item.headers,\n })})`\n );\n continue;\n }\n\n references.push(targetReference);\n }\n\n return references;\n}\n\nexport function collectSkills(skills?: unknown[]): string[] {\n if (!Array.isArray(skills)) {\n return [];\n }\n\n const formattedSkills: string[] = [];\n for (const skill of skills) {\n if (typeof skill === 'string') {\n formattedSkills.push(formatInlineLiteral(skill));\n continue;\n }\n\n if (!isPlainObject(skill)) {\n continue;\n }\n\n const skillId =\n typeof skill.id === 'string'\n ? skill.id\n : typeof skill.skillId === 'string'\n ? skill.skillId\n : undefined;\n if (!skillId) {\n continue;\n }\n\n const formattedSkill: Record<string, unknown> = { id: skillId };\n if (typeof skill.index === 'number' && Number.isInteger(skill.index)) {\n formattedSkill.index = skill.index;\n }\n if (typeof skill.alwaysLoaded === 'boolean') {\n formattedSkill.alwaysLoaded = skill.alwaysLoaded;\n }\n\n formattedSkills.push(formatInlineLiteral(formattedSkill));\n }\n\n return formattedSkills;\n}\n"],"mappings":"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"}