@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-registry.js","names":[],"sources":["../../../src/commands/pull-v4/component-registry.ts"],"sourcesContent":["/**\n * Unified Component Registry - Handles both unique variable names AND file paths\n *\n * This combines the functionality of ComponentTracker and ComponentMapper\n * into a single, clean system that handles:\n * 1. Unique variable name generation (with collision resolution)\n * 2. File path tracking for imports\n * 3. Reference resolution for code generation\n */\nimport type { FullProjectDefinition } from '@inkeep/agents-core';\n\nexport type ComponentType =\n | 'agents'\n | 'subAgents'\n | 'tools'\n | 'functionTools'\n | 'functions'\n | 'dataComponents'\n | 'artifactComponents'\n | 'statusComponents'\n | 'environments'\n | 'externalAgents'\n | 'credentials'\n | 'contextConfigs'\n | 'fetchDefinitions'\n | 'headers'\n | 'models'\n | 'skills'\n | 'triggers'\n | 'scheduledTriggers'\n | 'project';\n\nexport interface ComponentInfo {\n id: string; // Original component ID\n name: string; // Unique variable name (guaranteed unique across project)\n type: ComponentType; // Component type\n filePath: string; // Relative file path (e.g., \"agents/foo.ts\")\n exportName: string; // Export name (usually same as name)\n isInline: boolean; // Whether component was defined inline (true) or exported (false)\n}\n\nexport class ComponentRegistry {\n private components = new Map<string, ComponentInfo>();\n private componentsByTypeAndId = new Map<string, ComponentInfo>(); // Type-aware lookup\n private usedNames = new Set<string>(); // Global name registry for uniqueness\n\n /**\n * Register a component with both unique name and file path\n */\n register(\n id: string,\n type: ComponentType,\n filePath: string,\n exportName?: string,\n isInline: boolean = false\n ): ComponentInfo {\n const typeKey = `${type}:${id}`;\n\n // Check if this component already exists - if so, return the existing one\n const existing = this.componentsByTypeAndId.get(typeKey);\n if (existing) {\n return existing;\n }\n\n let name: string;\n let actualExportName: string;\n\n // If exportName is provided (real discovered name), use it directly\n // Otherwise, generate and ensure uniqueness for assumed names\n if (exportName) {\n // Real export name discovered from file - use it as-is\n name = exportName;\n actualExportName = exportName;\n } else {\n // No real export name - generate unique name with prefixes if needed\n const baseName = this.toCamelCase(id);\n const uniqueName = this.ensureUniqueName(baseName, type);\n name = uniqueName;\n actualExportName = uniqueName;\n }\n\n const info: ComponentInfo = {\n id,\n name,\n type,\n filePath,\n exportName: actualExportName,\n isInline,\n };\n\n // Store with both ID-only key (for backward compatibility) and type+ID key (for collision handling)\n this.components.set(id, info);\n this.componentsByTypeAndId.set(typeKey, info);\n\n this.usedNames.add(name);\n if (actualExportName && actualExportName !== name) {\n this.usedNames.add(actualExportName);\n }\n\n return info;\n }\n\n /**\n * Override a credential component with environment settings key\n * This allows env settings registration to take precedence over standalone credentials\n */\n overrideCredentialWithEnvKey(id: string, filePath: string, envKey: string): ComponentInfo {\n const typeKey = `credentials:${id}`;\n\n const info: ComponentInfo = {\n id,\n type: 'credentials',\n name: envKey, // Use the environment settings key\n filePath,\n exportName: envKey,\n isInline: true,\n };\n\n // Override existing registration\n this.componentsByTypeAndId.set(typeKey, info);\n this.components.set(`${filePath}:${envKey}`, info);\n\n return info;\n }\n\n /**\n * Get component info by ID and type\n */\n get(id: string, type: ComponentType): ComponentInfo | undefined {\n const typeKey = `${type}:${id}`;\n return this.componentsByTypeAndId.get(typeKey);\n }\n\n /**\n * Get component info by variable name (since variable names are globally unique)\n */\n getByVariableName(variableName: string): ComponentInfo | undefined {\n for (const component of this.componentsByTypeAndId.values()) {\n if (component.name === variableName) {\n return component;\n }\n }\n return undefined;\n }\n\n /**\n * Get unique variable name for a component by ID and type\n */\n getVariableName(id: string, type: ComponentType): string | undefined {\n const typeKey = `${type}:${id}`;\n const result = this.componentsByTypeAndId.get(typeKey)?.name;\n\n return result;\n }\n\n /**\n * Get import statement for a component\n */\n getImportStatement(\n fromFilePath: string,\n componentId: string,\n componentType: ComponentType\n ): string | undefined {\n const component = this.get(componentId, componentType);\n if (!component) return undefined;\n\n // Normalize both paths to the same format for comparison\n const normalizedFrom = this.normalizeToProjectPath(fromFilePath);\n const normalizedTo = this.normalizeToProjectPath(component.filePath);\n\n // Skip import if same file\n if (normalizedFrom === normalizedTo) {\n return undefined;\n }\n\n const relativePath = this.calculateRelativeImport(fromFilePath, component.filePath);\n const importStmt = `import { ${component.exportName} } from '${relativePath}';`;\n\n return importStmt;\n }\n\n /**\n * Format an array of references for code generation\n */\n formatReferencesForCode(\n references: any[],\n componentType: ComponentType,\n style: { quotes: 'single' | 'double'; indentation: string },\n indentLevel: number\n ): string {\n if (!Array.isArray(references) || references.length === 0) {\n return '[]';\n }\n\n const variableNames: string[] = [];\n\n for (const ref of references) {\n const id = this.extractIdFromReference(ref);\n if (id) {\n const component = this.get(id, componentType);\n if (component) {\n variableNames.push(component.name);\n } else {\n console.warn(`ComponentRegistry: Component not found: ${id} (type: ${componentType})`);\n variableNames.push(this.toCamelCase(id));\n }\n }\n }\n\n if (variableNames.length === 0) {\n return '[]';\n }\n\n if (variableNames.length === 1) {\n return `[${variableNames[0]}]`;\n }\n\n // Multi-line format\n const { indentation } = style;\n const indent = indentation.repeat(indentLevel);\n const lines = ['['];\n\n for (let i = 0; i < variableNames.length; i++) {\n const isLast = i === variableNames.length - 1;\n lines.push(`${indent}${variableNames[i]}${isLast ? '' : ','}`);\n }\n\n lines.push(`${indentation.repeat(indentLevel - 1)}]`);\n return lines.join('\\n');\n }\n\n /**\n * Get all import statements needed for a file\n */\n getImportsForFile(\n fromFilePath: string,\n referencedComponents: Array<{ id: string; type: ComponentType }>\n ): string[] {\n const imports: string[] = [];\n const seenImports = new Set<string>(); // Deduplicate imports\n\n for (const { id, type } of referencedComponents) {\n const importStatement = this.getImportStatement(fromFilePath, id, type);\n if (importStatement && !seenImports.has(importStatement)) {\n imports.push(importStatement);\n seenImports.add(importStatement);\n }\n }\n\n return imports;\n }\n\n /**\n * Get all component IDs referenced in arrays for import generation\n */\n getReferencedComponentIds(referenceArrays: any[][]): string[] {\n const componentIds: string[] = [];\n\n for (const refArray of referenceArrays) {\n if (Array.isArray(refArray)) {\n for (const ref of refArray) {\n const id = this.extractIdFromReference(ref);\n if (id) {\n componentIds.push(id);\n }\n }\n }\n }\n\n return componentIds;\n }\n\n /**\n * Extract ID from a reference (string or object) based on component type\n */\n private extractIdFromReference(ref: any): string | null {\n if (typeof ref === 'string') {\n return ref;\n }\n if (typeof ref === 'object' && ref) {\n // Handle different component types by their specific ID fields (confirmed from debug output)\n\n // Tool references (MCP tools and function tools)\n if (ref.toolId) return ref.toolId;\n\n // Agent references (main agents and sub-agents)\n if (ref.agentId) return ref.agentId;\n\n // External agent references\n if (ref.externalAgentId) return ref.externalAgentId;\n\n // Credential store references (found in generated files)\n if (ref.credentialStoreId) return ref.credentialStoreId;\n\n // Status component references using type field (confirmed from debug output)\n if (ref.type && !ref.agentId && !ref.toolId && !ref.externalAgentId) return ref.type;\n\n // Generic ID field (fallback)\n if (ref.id) return ref.id;\n\n // Name field (fallback)\n if (ref.name) return ref.name;\n\n // For objects without recognized ID fields, warn and skip\n console.warn('ComponentRegistry: Reference without recognized ID field:', ref);\n return null;\n }\n\n return null;\n }\n\n /**\n * Convert string to camelCase and ensure it's a valid JavaScript identifier\n */\n private toCamelCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[-_](.)/g, (_, char) => char.toUpperCase())\n .replace(/[^a-zA-Z0-9]/g, '')\n .replace(/^[0-9]/, '_$&');\n }\n\n /**\n * Ensure a name is unique by adding prefixes/suffixes if needed\n */\n private ensureUniqueName(baseName: string, type: ComponentType): string {\n let uniqueName = baseName;\n let counter = 1;\n\n while (this.usedNames.has(uniqueName)) {\n // Try with type prefix first\n if (counter === 1) {\n const typePrefix = this.getTypePrefix(type);\n uniqueName = `${typePrefix}${baseName.charAt(0).toUpperCase() + baseName.slice(1)}`;\n } else {\n // Then try with counter\n uniqueName = `${baseName}${counter}`;\n }\n counter++;\n\n // Safety net to prevent infinite loops\n if (counter > 100) {\n uniqueName = `${baseName}_${Date.now()}`;\n break;\n }\n }\n\n return uniqueName;\n }\n\n /**\n * Get type prefix for uniqueness resolution\n */\n private getTypePrefix(type: ComponentType): string {\n switch (type) {\n case 'agents':\n return 'agent';\n case 'subAgents':\n return 'sub';\n case 'externalAgents':\n return 'ext';\n case 'tools':\n return 'tool';\n case 'functionTools':\n return 'func';\n case 'functions':\n return 'func';\n case 'dataComponents':\n return 'data';\n case 'artifactComponents':\n return 'artifact';\n case 'statusComponents':\n return 'status';\n case 'environments':\n return 'env';\n case 'credentials':\n return 'cred';\n case 'contextConfigs':\n return 'context';\n case 'fetchDefinitions':\n return 'fetch';\n case 'headers':\n return 'header';\n case 'models':\n return 'model';\n case 'triggers':\n return 'trigger';\n case 'project':\n return 'project';\n default:\n return 'comp';\n }\n }\n\n /**\n * Normalize path to project-relative format using existing registry paths as templates\n */\n private normalizeToProjectPath(filePath: string): string {\n // If already in project format (no slashes before known directories), return as-is\n if (!filePath.includes('/') || filePath.match(/^(agents|tools|environments|data-components)/)) {\n return filePath;\n }\n\n // Find project directories by looking at existing registry paths\n const knownDirs = new Set<string>();\n for (const component of this.components.values()) {\n const firstDir = component.filePath.split('/')[0];\n if (firstDir) knownDirs.add(firstDir);\n }\n\n // Find the last occurrence of any known project directory\n const segments = filePath.split('/');\n for (let i = segments.length - 1; i >= 0; i--) {\n if (knownDirs.has(segments[i])) {\n return segments.slice(i).join('/');\n }\n }\n\n // Fallback: return the filename\n return segments[segments.length - 1] || filePath;\n }\n\n /**\n * Calculate relative import path between files\n */\n private calculateRelativeImport(fromPath: string, toPath: string): string {\n // Remove .ts extensions for calculation\n const fromParts = fromPath.replace('.ts', '').split('/');\n const toParts = toPath.replace('.ts', '').split('/');\n\n // Remove filename from fromPath (keep directory only)\n const fromDir = fromParts.slice(0, -1);\n const toFile = toParts;\n\n // Find common path prefix\n let commonLength = 0;\n while (\n commonLength < fromDir.length &&\n commonLength < toFile.length - 1 &&\n fromDir[commonLength] === toFile[commonLength]\n ) {\n commonLength++;\n }\n\n // Calculate relative path\n let relativePath = '';\n\n // Go up for remaining directories in fromDir after common path\n const upLevels = fromDir.length - commonLength;\n for (let i = 0; i < upLevels; i++) {\n relativePath += '../';\n }\n\n // Add remaining path from toFile after common path\n const remainingPath = toFile.slice(commonLength).join('/');\n relativePath += remainingPath;\n\n // Clean up path format\n if (relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n }\n\n /**\n * Get all components for debugging\n */\n getAllComponents(): ComponentInfo[] {\n return Array.from(this.componentsByTypeAndId.values());\n }\n\n /**\n * Get all components in a specific file\n */\n getComponentsInFile(filePath: string): ComponentInfo[] {\n return Array.from(this.componentsByTypeAndId.values()).filter(\n (component) => component.filePath === filePath\n );\n }\n\n /**\n * Remove a component from the registry\n */\n removeComponent(type: string, id: string): void {\n const key = `${type}:${id}`;\n const component = this.componentsByTypeAndId.get(key);\n\n if (component) {\n // Remove from both maps\n this.componentsByTypeAndId.delete(key);\n this.components.delete(component.name);\n\n // Remove from used names if no other component uses it\n const nameStillUsed = Array.from(this.componentsByTypeAndId.values()).some(\n (comp) => comp.name === component.name\n );\n if (!nameStillUsed) {\n this.usedNames.delete(component.name);\n }\n }\n }\n\n /**\n * Clear all components (for testing)\n */\n clear(): void {\n this.components.clear();\n this.componentsByTypeAndId.clear();\n this.usedNames.clear();\n }\n}\n\n/**\n * Register all components from a project with their file paths\n */\nexport function registerAllComponents(\n project: FullProjectDefinition,\n registry: ComponentRegistry\n): void {\n // Register project\n registry.register(project.id, 'project', 'index.ts');\n\n // Register credentials\n if (project.credentialReferences) {\n for (const credId of Object.keys(project.credentialReferences)) {\n registry.register(credId, 'credentials', `credentials/${credId}.ts`);\n }\n }\n\n // Register tools\n if (project.tools) {\n for (const toolId of Object.keys(project.tools)) {\n registry.register(toolId, 'tools', `tools/${toolId}.ts`);\n }\n }\n\n // Register function tools - functionTools has the name/description, functions has the code\n // We generate files based on functionTools IDs since that's the user-facing entity\n const registeredFunctionToolIds = new Set<string>();\n\n // Register functionTools first (they have the name that identifies the tool)\n if (project.functionTools) {\n for (const funcToolId of Object.keys(project.functionTools)) {\n registry.register(funcToolId, 'functionTools', `tools/functions/${funcToolId}.ts`);\n registeredFunctionToolIds.add(funcToolId);\n }\n }\n\n // Also check agent-level functionTools\n if (project.agents) {\n for (const agentData of Object.values(project.agents)) {\n const agentFunctionTools = (agentData as any).functionTools;\n if (agentFunctionTools) {\n for (const funcToolId of Object.keys(agentFunctionTools)) {\n if (!registeredFunctionToolIds.has(funcToolId)) {\n registry.register(funcToolId, 'functionTools', `tools/functions/${funcToolId}.ts`);\n registeredFunctionToolIds.add(funcToolId);\n }\n }\n }\n }\n }\n\n // Register data components\n if (project.dataComponents) {\n for (const componentId of Object.keys(project.dataComponents)) {\n registry.register(componentId, 'dataComponents', `data-components/${componentId}.ts`);\n }\n }\n\n // Register artifact components\n if (project.artifactComponents) {\n for (const componentId of Object.keys(project.artifactComponents)) {\n registry.register(componentId, 'artifactComponents', `artifact-components/${componentId}.ts`);\n }\n }\n\n // Register external agents\n if (project.externalAgents) {\n for (const extAgentId of Object.keys(project.externalAgents)) {\n registry.register(extAgentId, 'externalAgents', `external-agents/${extAgentId}.ts`);\n }\n }\n\n // Register skills\n if (project.skills) {\n for (const skillId of Object.keys(project.skills)) {\n registry.register(skillId, 'skills', `skills/${skillId}.md`);\n }\n }\n\n // Register extracted status components\n const statusComponents = extractStatusComponents(project);\n for (const statusId of Object.keys(statusComponents)) {\n registry.register(statusId, 'statusComponents', `status-components/${statusId}.ts`);\n }\n\n // Register agents\n if (project.agents) {\n for (const agentId of Object.keys(project.agents)) {\n registry.register(agentId, 'agents', `agents/${agentId}.ts`);\n }\n }\n\n // Register triggers (agent-scoped)\n if (project.agents) {\n for (const agentData of Object.values(project.agents)) {\n const agentTriggers = (agentData as any).triggers;\n if (agentTriggers) {\n for (const triggerId of Object.keys(agentTriggers)) {\n registry.register(triggerId, 'triggers', `agents/triggers/${triggerId}.ts`);\n }\n }\n }\n }\n\n // Register extracted sub-agents\n const subAgents = extractSubAgents(project);\n for (const subAgentId of Object.keys(subAgents)) {\n registry.register(subAgentId, 'subAgents', `agents/sub-agents/${subAgentId}.ts`);\n }\n\n // Register extracted context configs\n const contextConfigs = extractContextConfigs(project);\n for (const contextId of Object.keys(contextConfigs)) {\n registry.register(contextId, 'contextConfigs', `context-configs/${contextId}.ts`);\n }\n}\n\n/**\n * Extract status components from project agents\n */\nfunction extractStatusComponents(project: FullProjectDefinition): Record<string, any> {\n const statusComponents: Record<string, any> = {};\n\n if (project.agents) {\n for (const agentData of Object.values(project.agents)) {\n if (agentData.statusUpdates?.statusComponents) {\n // statusComponents is an array that can contain strings or objects\n for (const statusComp of agentData.statusUpdates.statusComponents) {\n let statusId: string;\n\n if (typeof statusComp === 'string') {\n // Direct string reference to status component ID\n statusId = statusComp;\n } else if (typeof statusComp === 'object' && statusComp) {\n // Object with id, type, or name field\n statusId = statusComp.type;\n } else {\n continue;\n }\n\n if (statusId && !statusComponents[statusId]) {\n // Use the actual status component data instead of creating dummy data\n statusComponents[statusId] = {\n // Include any other properties from the actual data first\n ...statusComp,\n id: statusId,\n type: statusComp.type || statusId,\n description: statusComp.description || `Status component for ${statusId}`,\n detailsSchema: statusComp.detailsSchema,\n };\n }\n }\n }\n }\n }\n\n return statusComponents;\n}\n\n/**\n * Extract sub-agents from project agents\n */\nexport function extractSubAgents(project: FullProjectDefinition): Record<string, any> {\n const subAgents: Record<string, any> = {};\n\n if (project.agents) {\n for (const agentData of Object.values(project.agents)) {\n if (agentData.subAgents) {\n for (const [subAgentId, subAgentData] of Object.entries(agentData.subAgents)) {\n subAgents[subAgentId] = subAgentData;\n }\n }\n }\n }\n\n return subAgents;\n}\n\n/**\n * Extract context configs from project agents\n */\nfunction extractContextConfigs(project: FullProjectDefinition): Record<string, any> {\n const contextConfigs: Record<string, any> = {};\n\n if (project.agents) {\n for (const [agentId, agentData] of Object.entries(project.agents)) {\n if (agentData.contextConfig) {\n // Use the actual contextConfig.id (now required)\n const contextConfigId = agentData.contextConfig.id;\n if (contextConfigId) {\n contextConfigs[contextConfigId] = agentData.contextConfig;\n } else {\n console.warn(`contextConfig for agent ${agentId} is missing required 'id' field`);\n }\n }\n }\n }\n\n return contextConfigs;\n}\n\n/**\n * Find sub-agent data with parent agent info for contextConfig resolution\n */\nexport function findSubAgentWithParent(\n project: FullProjectDefinition,\n subAgentId: string\n): { subAgentData: any; parentAgentId: string; contextConfigData?: any } | undefined {\n if (project.agents) {\n for (const [agentId, agentData] of Object.entries(project.agents)) {\n if (agentData.subAgents?.[subAgentId]) {\n // Get contextConfig data if parent agent has one with an ID\n const contextConfigData = agentData.contextConfig?.id ? agentData.contextConfig : undefined;\n\n return {\n subAgentData: agentData.subAgents[subAgentId],\n parentAgentId: agentId,\n contextConfigData,\n };\n }\n }\n }\n return undefined;\n}\n"],"mappings":";AAyCA,IAAa,oBAAb,MAA+B;CAC7B,AAAQ,6BAAa,IAAI,KAA4B;CACrD,AAAQ,wCAAwB,IAAI,KAA4B;CAChE,AAAQ,4BAAY,IAAI,KAAa;;;;CAKrC,SACE,IACA,MACA,UACA,YACA,WAAoB,OACL;EACf,MAAM,UAAU,GAAG,KAAK,GAAG;EAG3B,MAAM,WAAW,KAAK,sBAAsB,IAAI,QAAQ;AACxD,MAAI,SACF,QAAO;EAGT,IAAI;EACJ,IAAI;AAIJ,MAAI,YAAY;AAEd,UAAO;AACP,sBAAmB;SACd;GAEL,MAAM,WAAW,KAAK,YAAY,GAAG;GACrC,MAAM,aAAa,KAAK,iBAAiB,UAAU,KAAK;AACxD,UAAO;AACP,sBAAmB;;EAGrB,MAAM,OAAsB;GAC1B;GACA;GACA;GACA;GACA,YAAY;GACZ;GACD;AAGD,OAAK,WAAW,IAAI,IAAI,KAAK;AAC7B,OAAK,sBAAsB,IAAI,SAAS,KAAK;AAE7C,OAAK,UAAU,IAAI,KAAK;AACxB,MAAI,oBAAoB,qBAAqB,KAC3C,MAAK,UAAU,IAAI,iBAAiB;AAGtC,SAAO;;;;;;CAOT,6BAA6B,IAAY,UAAkB,QAA+B;EACxF,MAAM,UAAU,eAAe;EAE/B,MAAM,OAAsB;GAC1B;GACA,MAAM;GACN,MAAM;GACN;GACA,YAAY;GACZ,UAAU;GACX;AAGD,OAAK,sBAAsB,IAAI,SAAS,KAAK;AAC7C,OAAK,WAAW,IAAI,GAAG,SAAS,GAAG,UAAU,KAAK;AAElD,SAAO;;;;;CAMT,IAAI,IAAY,MAAgD;EAC9D,MAAM,UAAU,GAAG,KAAK,GAAG;AAC3B,SAAO,KAAK,sBAAsB,IAAI,QAAQ;;;;;CAMhD,kBAAkB,cAAiD;AACjE,OAAK,MAAM,aAAa,KAAK,sBAAsB,QAAQ,CACzD,KAAI,UAAU,SAAS,aACrB,QAAO;;;;;CASb,gBAAgB,IAAY,MAAyC;EACnE,MAAM,UAAU,GAAG,KAAK,GAAG;AAG3B,SAFe,KAAK,sBAAsB,IAAI,QAAQ,EAAE;;;;;CAQ1D,mBACE,cACA,aACA,eACoB;EACpB,MAAM,YAAY,KAAK,IAAI,aAAa,cAAc;AACtD,MAAI,CAAC,UAAW,QAAO;AAOvB,MAJuB,KAAK,uBAAuB,aAAa,KAC3C,KAAK,uBAAuB,UAAU,SAAS,CAIlE;EAGF,MAAM,eAAe,KAAK,wBAAwB,cAAc,UAAU,SAAS;AAGnF,SAFmB,YAAY,UAAU,WAAW,WAAW,aAAa;;;;;CAQ9E,wBACE,YACA,eACA,OACA,aACQ;AACR,MAAI,CAAC,MAAM,QAAQ,WAAW,IAAI,WAAW,WAAW,EACtD,QAAO;EAGT,MAAM,gBAA0B,EAAE;AAElC,OAAK,MAAM,OAAO,YAAY;GAC5B,MAAM,KAAK,KAAK,uBAAuB,IAAI;AAC3C,OAAI,IAAI;IACN,MAAM,YAAY,KAAK,IAAI,IAAI,cAAc;AAC7C,QAAI,UACF,eAAc,KAAK,UAAU,KAAK;SAC7B;AACL,aAAQ,KAAK,2CAA2C,GAAG,UAAU,cAAc,GAAG;AACtF,mBAAc,KAAK,KAAK,YAAY,GAAG,CAAC;;;;AAK9C,MAAI,cAAc,WAAW,EAC3B,QAAO;AAGT,MAAI,cAAc,WAAW,EAC3B,QAAO,IAAI,cAAc,GAAG;EAI9B,MAAM,EAAE,gBAAgB;EACxB,MAAM,SAAS,YAAY,OAAO,YAAY;EAC9C,MAAM,QAAQ,CAAC,IAAI;AAEnB,OAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;GAC7C,MAAM,SAAS,MAAM,cAAc,SAAS;AAC5C,SAAM,KAAK,GAAG,SAAS,cAAc,KAAK,SAAS,KAAK,MAAM;;AAGhE,QAAM,KAAK,GAAG,YAAY,OAAO,cAAc,EAAE,CAAC,GAAG;AACrD,SAAO,MAAM,KAAK,KAAK;;;;;CAMzB,kBACE,cACA,sBACU;EACV,MAAM,UAAoB,EAAE;EAC5B,MAAM,8BAAc,IAAI,KAAa;AAErC,OAAK,MAAM,EAAE,IAAI,UAAU,sBAAsB;GAC/C,MAAM,kBAAkB,KAAK,mBAAmB,cAAc,IAAI,KAAK;AACvE,OAAI,mBAAmB,CAAC,YAAY,IAAI,gBAAgB,EAAE;AACxD,YAAQ,KAAK,gBAAgB;AAC7B,gBAAY,IAAI,gBAAgB;;;AAIpC,SAAO;;;;;CAMT,0BAA0B,iBAAoC;EAC5D,MAAM,eAAyB,EAAE;AAEjC,OAAK,MAAM,YAAY,gBACrB,KAAI,MAAM,QAAQ,SAAS,CACzB,MAAK,MAAM,OAAO,UAAU;GAC1B,MAAM,KAAK,KAAK,uBAAuB,IAAI;AAC3C,OAAI,GACF,cAAa,KAAK,GAAG;;AAM7B,SAAO;;;;;CAMT,AAAQ,uBAAuB,KAAyB;AACtD,MAAI,OAAO,QAAQ,SACjB,QAAO;AAET,MAAI,OAAO,QAAQ,YAAY,KAAK;AAIlC,OAAI,IAAI,OAAQ,QAAO,IAAI;AAG3B,OAAI,IAAI,QAAS,QAAO,IAAI;AAG5B,OAAI,IAAI,gBAAiB,QAAO,IAAI;AAGpC,OAAI,IAAI,kBAAmB,QAAO,IAAI;AAGtC,OAAI,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,IAAI,UAAU,CAAC,IAAI,gBAAiB,QAAO,IAAI;AAGhF,OAAI,IAAI,GAAI,QAAO,IAAI;AAGvB,OAAI,IAAI,KAAM,QAAO,IAAI;AAGzB,WAAQ,KAAK,6DAA6D,IAAI;AAC9E,UAAO;;AAGT,SAAO;;;;;CAMT,AAAQ,YAAY,KAAqB;AACvC,SAAO,IACJ,aAAa,CACb,QAAQ,aAAa,GAAG,SAAS,KAAK,aAAa,CAAC,CACpD,QAAQ,iBAAiB,GAAG,CAC5B,QAAQ,UAAU,MAAM;;;;;CAM7B,AAAQ,iBAAiB,UAAkB,MAA6B;EACtE,IAAI,aAAa;EACjB,IAAI,UAAU;AAEd,SAAO,KAAK,UAAU,IAAI,WAAW,EAAE;AAErC,OAAI,YAAY,EAEd,cAAa,GADM,KAAK,cAAc,KAAK,GACd,SAAS,OAAO,EAAE,CAAC,aAAa,GAAG,SAAS,MAAM,EAAE;OAGjF,cAAa,GAAG,WAAW;AAE7B;AAGA,OAAI,UAAU,KAAK;AACjB,iBAAa,GAAG,SAAS,GAAG,KAAK,KAAK;AACtC;;;AAIJ,SAAO;;;;;CAMT,AAAQ,cAAc,MAA6B;AACjD,UAAQ,MAAR;GACE,KAAK,SACH,QAAO;GACT,KAAK,YACH,QAAO;GACT,KAAK,iBACH,QAAO;GACT,KAAK,QACH,QAAO;GACT,KAAK,gBACH,QAAO;GACT,KAAK,YACH,QAAO;GACT,KAAK,iBACH,QAAO;GACT,KAAK,qBACH,QAAO;GACT,KAAK,mBACH,QAAO;GACT,KAAK,eACH,QAAO;GACT,KAAK,cACH,QAAO;GACT,KAAK,iBACH,QAAO;GACT,KAAK,mBACH,QAAO;GACT,KAAK,UACH,QAAO;GACT,KAAK,SACH,QAAO;GACT,KAAK,WACH,QAAO;GACT,KAAK,UACH,QAAO;GACT,QACE,QAAO;;;;;;CAOb,AAAQ,uBAAuB,UAA0B;AAEvD,MAAI,CAAC,SAAS,SAAS,IAAI,IAAI,SAAS,MAAM,+CAA+C,CAC3F,QAAO;EAIT,MAAM,4BAAY,IAAI,KAAa;AACnC,OAAK,MAAM,aAAa,KAAK,WAAW,QAAQ,EAAE;GAChD,MAAM,WAAW,UAAU,SAAS,MAAM,IAAI,CAAC;AAC/C,OAAI,SAAU,WAAU,IAAI,SAAS;;EAIvC,MAAM,WAAW,SAAS,MAAM,IAAI;AACpC,OAAK,IAAI,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,IACxC,KAAI,UAAU,IAAI,SAAS,GAAG,CAC5B,QAAO,SAAS,MAAM,EAAE,CAAC,KAAK,IAAI;AAKtC,SAAO,SAAS,SAAS,SAAS,MAAM;;;;;CAM1C,AAAQ,wBAAwB,UAAkB,QAAwB;EAExE,MAAM,YAAY,SAAS,QAAQ,OAAO,GAAG,CAAC,MAAM,IAAI;EACxD,MAAM,UAAU,OAAO,QAAQ,OAAO,GAAG,CAAC,MAAM,IAAI;EAGpD,MAAM,UAAU,UAAU,MAAM,GAAG,GAAG;EACtC,MAAM,SAAS;EAGf,IAAI,eAAe;AACnB,SACE,eAAe,QAAQ,UACvB,eAAe,OAAO,SAAS,KAC/B,QAAQ,kBAAkB,OAAO,cAEjC;EAIF,IAAI,eAAe;EAGnB,MAAM,WAAW,QAAQ,SAAS;AAClC,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,iBAAgB;EAIlB,MAAM,gBAAgB,OAAO,MAAM,aAAa,CAAC,KAAK,IAAI;AAC1D,kBAAgB;AAGhB,MAAI,aAAa,WAAW,MAAM,CAChC,QAAO;AAET,SAAO,KAAK;;;;;CAMd,mBAAoC;AAClC,SAAO,MAAM,KAAK,KAAK,sBAAsB,QAAQ,CAAC;;;;;CAMxD,oBAAoB,UAAmC;AACrD,SAAO,MAAM,KAAK,KAAK,sBAAsB,QAAQ,CAAC,CAAC,QACpD,cAAc,UAAU,aAAa,SACvC;;;;;CAMH,gBAAgB,MAAc,IAAkB;EAC9C,MAAM,MAAM,GAAG,KAAK,GAAG;EACvB,MAAM,YAAY,KAAK,sBAAsB,IAAI,IAAI;AAErD,MAAI,WAAW;AAEb,QAAK,sBAAsB,OAAO,IAAI;AACtC,QAAK,WAAW,OAAO,UAAU,KAAK;AAMtC,OAAI,CAHkB,MAAM,KAAK,KAAK,sBAAsB,QAAQ,CAAC,CAAC,MACnE,SAAS,KAAK,SAAS,UAAU,KACnC,CAEC,MAAK,UAAU,OAAO,UAAU,KAAK;;;;;;CAQ3C,QAAc;AACZ,OAAK,WAAW,OAAO;AACvB,OAAK,sBAAsB,OAAO;AAClC,OAAK,UAAU,OAAO;;;;;;AAO1B,SAAgB,sBACd,SACA,UACM;AAEN,UAAS,SAAS,QAAQ,IAAI,WAAW,WAAW;AAGpD,KAAI,QAAQ,qBACV,MAAK,MAAM,UAAU,OAAO,KAAK,QAAQ,qBAAqB,CAC5D,UAAS,SAAS,QAAQ,eAAe,eAAe,OAAO,KAAK;AAKxE,KAAI,QAAQ,MACV,MAAK,MAAM,UAAU,OAAO,KAAK,QAAQ,MAAM,CAC7C,UAAS,SAAS,QAAQ,SAAS,SAAS,OAAO,KAAK;CAM5D,MAAM,4CAA4B,IAAI,KAAa;AAGnD,KAAI,QAAQ,cACV,MAAK,MAAM,cAAc,OAAO,KAAK,QAAQ,cAAc,EAAE;AAC3D,WAAS,SAAS,YAAY,iBAAiB,mBAAmB,WAAW,KAAK;AAClF,4BAA0B,IAAI,WAAW;;AAK7C,KAAI,QAAQ,OACV,MAAK,MAAM,aAAa,OAAO,OAAO,QAAQ,OAAO,EAAE;EACrD,MAAM,qBAAsB,UAAkB;AAC9C,MAAI,oBACF;QAAK,MAAM,cAAc,OAAO,KAAK,mBAAmB,CACtD,KAAI,CAAC,0BAA0B,IAAI,WAAW,EAAE;AAC9C,aAAS,SAAS,YAAY,iBAAiB,mBAAmB,WAAW,KAAK;AAClF,8BAA0B,IAAI,WAAW;;;;AAQnD,KAAI,QAAQ,eACV,MAAK,MAAM,eAAe,OAAO,KAAK,QAAQ,eAAe,CAC3D,UAAS,SAAS,aAAa,kBAAkB,mBAAmB,YAAY,KAAK;AAKzF,KAAI,QAAQ,mBACV,MAAK,MAAM,eAAe,OAAO,KAAK,QAAQ,mBAAmB,CAC/D,UAAS,SAAS,aAAa,sBAAsB,uBAAuB,YAAY,KAAK;AAKjG,KAAI,QAAQ,eACV,MAAK,MAAM,cAAc,OAAO,KAAK,QAAQ,eAAe,CAC1D,UAAS,SAAS,YAAY,kBAAkB,mBAAmB,WAAW,KAAK;AAKvF,KAAI,QAAQ,OACV,MAAK,MAAM,WAAW,OAAO,KAAK,QAAQ,OAAO,CAC/C,UAAS,SAAS,SAAS,UAAU,UAAU,QAAQ,KAAK;CAKhE,MAAM,mBAAmB,wBAAwB,QAAQ;AACzD,MAAK,MAAM,YAAY,OAAO,KAAK,iBAAiB,CAClD,UAAS,SAAS,UAAU,oBAAoB,qBAAqB,SAAS,KAAK;AAIrF,KAAI,QAAQ,OACV,MAAK,MAAM,WAAW,OAAO,KAAK,QAAQ,OAAO,CAC/C,UAAS,SAAS,SAAS,UAAU,UAAU,QAAQ,KAAK;AAKhE,KAAI,QAAQ,OACV,MAAK,MAAM,aAAa,OAAO,OAAO,QAAQ,OAAO,EAAE;EACrD,MAAM,gBAAiB,UAAkB;AACzC,MAAI,cACF,MAAK,MAAM,aAAa,OAAO,KAAK,cAAc,CAChD,UAAS,SAAS,WAAW,YAAY,mBAAmB,UAAU,KAAK;;CAOnF,MAAM,YAAY,iBAAiB,QAAQ;AAC3C,MAAK,MAAM,cAAc,OAAO,KAAK,UAAU,CAC7C,UAAS,SAAS,YAAY,aAAa,qBAAqB,WAAW,KAAK;CAIlF,MAAM,iBAAiB,sBAAsB,QAAQ;AACrD,MAAK,MAAM,aAAa,OAAO,KAAK,eAAe,CACjD,UAAS,SAAS,WAAW,kBAAkB,mBAAmB,UAAU,KAAK;;;;;AAOrF,SAAS,wBAAwB,SAAqD;CACpF,MAAM,mBAAwC,EAAE;AAEhD,KAAI,QAAQ,QACV;OAAK,MAAM,aAAa,OAAO,OAAO,QAAQ,OAAO,CACnD,KAAI,UAAU,eAAe,iBAE3B,MAAK,MAAM,cAAc,UAAU,cAAc,kBAAkB;GACjE,IAAI;AAEJ,OAAI,OAAO,eAAe,SAExB,YAAW;YACF,OAAO,eAAe,YAAY,WAE3C,YAAW,WAAW;OAEtB;AAGF,OAAI,YAAY,CAAC,iBAAiB,UAEhC,kBAAiB,YAAY;IAE3B,GAAG;IACH,IAAI;IACJ,MAAM,WAAW,QAAQ;IACzB,aAAa,WAAW,eAAe,wBAAwB;IAC/D,eAAe,WAAW;IAC3B;;;AAOX,QAAO;;;;;AAMT,SAAgB,iBAAiB,SAAqD;CACpF,MAAM,YAAiC,EAAE;AAEzC,KAAI,QAAQ,QACV;OAAK,MAAM,aAAa,OAAO,OAAO,QAAQ,OAAO,CACnD,KAAI,UAAU,UACZ,MAAK,MAAM,CAAC,YAAY,iBAAiB,OAAO,QAAQ,UAAU,UAAU,CAC1E,WAAU,cAAc;;AAMhC,QAAO;;;;;AAMT,SAAS,sBAAsB,SAAqD;CAClF,MAAM,iBAAsC,EAAE;AAE9C,KAAI,QAAQ,QACV;OAAK,MAAM,CAAC,SAAS,cAAc,OAAO,QAAQ,QAAQ,OAAO,CAC/D,KAAI,UAAU,eAAe;GAE3B,MAAM,kBAAkB,UAAU,cAAc;AAChD,OAAI,gBACF,gBAAe,mBAAmB,UAAU;OAE5C,SAAQ,KAAK,2BAA2B,QAAQ,iCAAiC;;;AAMzF,QAAO;;;;;AAMT,SAAgB,uBACd,SACA,YACmF;AACnF,KAAI,QAAQ,QACV;OAAK,MAAM,CAAC,SAAS,cAAc,OAAO,QAAQ,QAAQ,OAAO,CAC/D,KAAI,UAAU,YAAY,aAAa;GAErC,MAAM,oBAAoB,UAAU,eAAe,KAAK,UAAU,gBAAgB;AAElF,UAAO;IACL,cAAc,UAAU,UAAU;IAClC,eAAe;IACf;IACD"}
@@ -0,0 +1,186 @@
1
+ import { collectTemplateVariableNames, createUniqueReferenceName, isPlainObject, toCamelCase, toKebabCase, toTriggerReferenceName } from "../utils.js";
2
+
3
+ //#region src/commands/pull-v4/generators/agent-generator.helpers.ts
4
+ function collectTemplateVariableNamesFromFields(values) {
5
+ const variables = [];
6
+ for (const value of values) {
7
+ if (typeof value !== "string") continue;
8
+ variables.push(...collectTemplateVariableNames(value));
9
+ }
10
+ return variables;
11
+ }
12
+ function extractIds(value) {
13
+ if (Array.isArray(value)) return value.map((item) => {
14
+ if (typeof item === "string") return item;
15
+ if (isPlainObject(item) && typeof item.id === "string") return item.id;
16
+ return null;
17
+ }).filter((id) => Boolean(id));
18
+ return Object.keys(value);
19
+ }
20
+ function extractContextConfigId(contextConfig) {
21
+ if (!contextConfig) return;
22
+ if (typeof contextConfig === "string") return contextConfig;
23
+ return contextConfig.id;
24
+ }
25
+ function addSubAgentImports(sourceFile, referenceNames, importNames, modulePathOverrides) {
26
+ for (const [subAgentId, referenceName] of referenceNames) {
27
+ const importName = importNames.get(subAgentId);
28
+ if (!importName) continue;
29
+ sourceFile.addImportDeclaration({
30
+ namedImports: [importName === referenceName ? importName : {
31
+ name: importName,
32
+ alias: referenceName
33
+ }],
34
+ moduleSpecifier: `./sub-agents/${modulePathOverrides?.[subAgentId] ?? subAgentId}`
35
+ });
36
+ }
37
+ }
38
+ function addTriggerImports(sourceFile, referenceNames, importRefs) {
39
+ for (const [triggerId, referenceName] of referenceNames) {
40
+ const importRef = importRefs.get(triggerId);
41
+ if (!importRef) continue;
42
+ const { importName, modulePath } = importRef;
43
+ sourceFile.addImportDeclaration({
44
+ namedImports: [importName === referenceName ? importName : {
45
+ name: importName,
46
+ alias: referenceName
47
+ }],
48
+ moduleSpecifier: `./triggers/${modulePath}`
49
+ });
50
+ }
51
+ }
52
+ function addScheduledTriggerImports(sourceFile, referenceNames, importRefs) {
53
+ for (const [scheduledTriggerId, referenceName] of referenceNames) {
54
+ const importRef = importRefs.get(scheduledTriggerId);
55
+ if (!importRef) continue;
56
+ const { importName, modulePath } = importRef;
57
+ sourceFile.addImportDeclaration({
58
+ namedImports: [importName === referenceName ? importName : {
59
+ name: importName,
60
+ alias: referenceName
61
+ }],
62
+ moduleSpecifier: `./scheduled-triggers/${modulePath}`
63
+ });
64
+ }
65
+ }
66
+ function extractStatusComponentIds(statusUpdates) {
67
+ if (!statusUpdates?.statusComponents?.length) return [];
68
+ const statusComponentIds = statusUpdates.statusComponents.map(resolveStatusComponentId);
69
+ return [...new Set(statusComponentIds)];
70
+ }
71
+ function resolveStatusComponentId(statusComponent) {
72
+ const id = typeof statusComponent === "string" ? statusComponent : statusComponent.id || statusComponent.type;
73
+ if (!id) throw new Error(`Unable to resolve status component with id ${JSON.stringify(statusComponent)}`);
74
+ return id;
75
+ }
76
+ function addStatusComponentImports(sourceFile, referenceNames) {
77
+ for (const [statusComponentId, referenceName] of referenceNames) {
78
+ const importName = toCamelCase(statusComponentId);
79
+ sourceFile.addImportDeclaration({
80
+ namedImports: [importName === referenceName ? importName : {
81
+ name: importName,
82
+ alias: referenceName
83
+ }],
84
+ moduleSpecifier: `../status-components/${statusComponentId}`
85
+ });
86
+ }
87
+ }
88
+ function createSubAgentReferenceMaps(ids, reservedNames, conflictSuffix, overrides) {
89
+ const referenceNames = /* @__PURE__ */ new Map();
90
+ const importNames = /* @__PURE__ */ new Map();
91
+ for (const id of ids) {
92
+ if (referenceNames.has(id)) continue;
93
+ const override = overrides?.[id];
94
+ const importName = override?.name ?? toCamelCase(id);
95
+ const isLocal = override?.local === true;
96
+ const referenceName = isLocal ? importName : createUniqueReferenceName(importName, reservedNames, conflictSuffix);
97
+ if (isLocal) reservedNames.add(referenceName);
98
+ else importNames.set(id, importName);
99
+ referenceNames.set(id, referenceName);
100
+ }
101
+ return {
102
+ referenceNames,
103
+ importNames
104
+ };
105
+ }
106
+ function createReferenceNameMap(ids, reservedNames, conflictSuffix) {
107
+ const map = /* @__PURE__ */ new Map();
108
+ for (const id of ids) {
109
+ if (map.has(id)) continue;
110
+ map.set(id, createUniqueReferenceName(toCamelCase(id), reservedNames, conflictSuffix));
111
+ }
112
+ return map;
113
+ }
114
+ function createScheduledTriggerReferenceMaps(scheduledTriggers, reservedNames) {
115
+ const referenceNames = /* @__PURE__ */ new Map();
116
+ const importRefs = /* @__PURE__ */ new Map();
117
+ if (!scheduledTriggers || !isPlainObject(scheduledTriggers)) return {
118
+ referenceNames,
119
+ importRefs
120
+ };
121
+ const moduleNameCounts = /* @__PURE__ */ new Map();
122
+ for (const [scheduledTriggerId, scheduledTriggerData] of Object.entries(scheduledTriggers)) {
123
+ if (referenceNames.has(scheduledTriggerId)) continue;
124
+ const scheduledTriggerRecord = isPlainObject(scheduledTriggerData) ? scheduledTriggerData : void 0;
125
+ const scheduledTriggerName = typeof scheduledTriggerRecord?.name === "string" && scheduledTriggerRecord.name.length > 0 ? scheduledTriggerRecord.name : scheduledTriggerId;
126
+ const importName = toTriggerReferenceName(scheduledTriggerName);
127
+ const referenceName = createNumericReferenceName(importName, reservedNames);
128
+ const baseModuleName = toKebabCase(scheduledTriggerName) || toKebabCase(scheduledTriggerId) || scheduledTriggerId;
129
+ const moduleCount = moduleNameCounts.get(baseModuleName) ?? 0;
130
+ moduleNameCounts.set(baseModuleName, moduleCount + 1);
131
+ const modulePath = moduleCount === 0 ? baseModuleName : `${baseModuleName}-${moduleCount}`;
132
+ referenceNames.set(scheduledTriggerId, referenceName);
133
+ importRefs.set(scheduledTriggerId, {
134
+ importName,
135
+ modulePath
136
+ });
137
+ }
138
+ return {
139
+ referenceNames,
140
+ importRefs
141
+ };
142
+ }
143
+ function createTriggerReferenceMaps(triggers, reservedNames) {
144
+ const referenceNames = /* @__PURE__ */ new Map();
145
+ const importRefs = /* @__PURE__ */ new Map();
146
+ if (!triggers || !isPlainObject(triggers)) return {
147
+ referenceNames,
148
+ importRefs
149
+ };
150
+ const moduleNameCounts = /* @__PURE__ */ new Map();
151
+ for (const [triggerId, triggerData] of Object.entries(triggers)) {
152
+ if (referenceNames.has(triggerId)) continue;
153
+ const triggerRecord = isPlainObject(triggerData) ? triggerData : void 0;
154
+ const triggerName = typeof triggerRecord?.name === "string" && triggerRecord.name.length > 0 ? triggerRecord.name : triggerId;
155
+ const importName = toTriggerReferenceName(triggerName);
156
+ const referenceName = createNumericReferenceName(importName, reservedNames);
157
+ const baseModuleName = toKebabCase(triggerName) || toKebabCase(triggerId) || triggerId;
158
+ const moduleCount = moduleNameCounts.get(baseModuleName) ?? 0;
159
+ moduleNameCounts.set(baseModuleName, moduleCount + 1);
160
+ const modulePath = moduleCount === 0 ? baseModuleName : `${baseModuleName}-${moduleCount}`;
161
+ referenceNames.set(triggerId, referenceName);
162
+ importRefs.set(triggerId, {
163
+ importName,
164
+ modulePath
165
+ });
166
+ }
167
+ return {
168
+ referenceNames,
169
+ importRefs
170
+ };
171
+ }
172
+ function createNumericReferenceName(baseName, reservedNames) {
173
+ if (!reservedNames.has(baseName)) {
174
+ reservedNames.add(baseName);
175
+ return baseName;
176
+ }
177
+ let index = 1;
178
+ while (reservedNames.has(`${baseName}${index}`)) index += 1;
179
+ const uniqueName = `${baseName}${index}`;
180
+ reservedNames.add(uniqueName);
181
+ return uniqueName;
182
+ }
183
+
184
+ //#endregion
185
+ export { addScheduledTriggerImports, addStatusComponentImports, addSubAgentImports, addTriggerImports, collectTemplateVariableNamesFromFields, createReferenceNameMap, createScheduledTriggerReferenceMaps, createSubAgentReferenceMaps, createTriggerReferenceMaps, extractContextConfigId, extractIds, extractStatusComponentIds, resolveStatusComponentId };
186
+ //# sourceMappingURL=agent-generator.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-generator.helpers.js","names":[],"sources":["../../../../src/commands/pull-v4/generators/agent-generator.helpers.ts"],"sourcesContent":["import type { SourceFile } from 'ts-morph';\nimport {\n collectTemplateVariableNames,\n createUniqueReferenceName,\n isPlainObject,\n toCamelCase,\n toKebabCase,\n toTriggerReferenceName,\n} from '../utils';\n\nexport type ReferenceNameMap = Map<string, string>;\nexport type TriggerImportMap = Map<string, { importName: string; modulePath: string }>;\n\ninterface SubAgentReferenceOverride {\n name: string;\n local?: boolean;\n}\n\ntype StatusComponentLike = string | { id?: string; type?: string; name?: string };\ntype StatusUpdatesLike = { statusComponents?: StatusComponentLike[] } | undefined;\n\nexport function collectTemplateVariableNamesFromFields(\n values: Array<string | undefined>\n): string[] {\n const variables: string[] = [];\n for (const value of values) {\n if (typeof value !== 'string') {\n continue;\n }\n variables.push(...collectTemplateVariableNames(value));\n }\n return variables;\n}\n\nexport function extractIds(value: unknown[] | Record<string, unknown>): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (typeof item === 'string') {\n return item;\n }\n if (isPlainObject(item) && typeof item.id === 'string') {\n return item.id;\n }\n return null;\n })\n .filter((id): id is string => Boolean(id));\n }\n return Object.keys(value);\n}\n\nexport function extractContextConfigId(\n contextConfig?: string | { id?: string }\n): string | undefined {\n if (!contextConfig) {\n return;\n }\n if (typeof contextConfig === 'string') {\n return contextConfig;\n }\n return contextConfig.id;\n}\n\nexport function addSubAgentImports(\n sourceFile: SourceFile,\n referenceNames: ReferenceNameMap,\n importNames: ReferenceNameMap,\n modulePathOverrides?: Record<string, string>\n): void {\n for (const [subAgentId, referenceName] of referenceNames) {\n const importName = importNames.get(subAgentId);\n if (!importName) {\n continue;\n }\n\n sourceFile.addImportDeclaration({\n namedImports: [\n importName === referenceName ? importName : { name: importName, alias: referenceName },\n ],\n moduleSpecifier: `./sub-agents/${modulePathOverrides?.[subAgentId] ?? subAgentId}`,\n });\n }\n}\n\nexport function addTriggerImports(\n sourceFile: SourceFile,\n referenceNames: ReferenceNameMap,\n importRefs: TriggerImportMap\n): void {\n for (const [triggerId, referenceName] of referenceNames) {\n const importRef = importRefs.get(triggerId);\n if (!importRef) {\n continue;\n }\n\n const { importName, modulePath } = importRef;\n sourceFile.addImportDeclaration({\n namedImports: [\n importName === referenceName ? importName : { name: importName, alias: referenceName },\n ],\n moduleSpecifier: `./triggers/${modulePath}`,\n });\n }\n}\n\nexport function addScheduledTriggerImports(\n sourceFile: SourceFile,\n referenceNames: ReferenceNameMap,\n importRefs: TriggerImportMap\n): void {\n for (const [scheduledTriggerId, referenceName] of referenceNames) {\n const importRef = importRefs.get(scheduledTriggerId);\n if (!importRef) {\n continue;\n }\n\n const { importName, modulePath } = importRef;\n sourceFile.addImportDeclaration({\n namedImports: [\n importName === referenceName ? importName : { name: importName, alias: referenceName },\n ],\n moduleSpecifier: `./scheduled-triggers/${modulePath}`,\n });\n }\n}\n\nexport function extractStatusComponentIds(statusUpdates: StatusUpdatesLike): string[] {\n if (!statusUpdates?.statusComponents?.length) {\n return [];\n }\n\n const statusComponentIds = statusUpdates.statusComponents.map(resolveStatusComponentId);\n return [...new Set(statusComponentIds)];\n}\n\nexport function resolveStatusComponentId(statusComponent: StatusComponentLike): string {\n const id =\n typeof statusComponent === 'string'\n ? statusComponent\n : statusComponent.id || statusComponent.type;\n if (!id) {\n throw new Error(\n `Unable to resolve status component with id ${JSON.stringify(statusComponent)}`\n );\n }\n return id;\n}\n\nexport function addStatusComponentImports(\n sourceFile: SourceFile,\n referenceNames: ReferenceNameMap\n): void {\n for (const [statusComponentId, referenceName] of referenceNames) {\n const importName = toCamelCase(statusComponentId);\n sourceFile.addImportDeclaration({\n namedImports: [\n importName === referenceName ? importName : { name: importName, alias: referenceName },\n ],\n moduleSpecifier: `../status-components/${statusComponentId}`,\n });\n }\n}\n\nexport function createSubAgentReferenceMaps(\n ids: Iterable<string>,\n reservedNames: Set<string>,\n conflictSuffix: string,\n overrides?: Record<string, SubAgentReferenceOverride>\n): {\n referenceNames: ReferenceNameMap;\n importNames: ReferenceNameMap;\n} {\n const referenceNames: ReferenceNameMap = new Map();\n const importNames: ReferenceNameMap = new Map();\n\n for (const id of ids) {\n if (referenceNames.has(id)) {\n continue;\n }\n\n const override = overrides?.[id];\n const importName = override?.name ?? toCamelCase(id);\n const isLocal = override?.local === true;\n const referenceName = isLocal\n ? importName\n : createUniqueReferenceName(importName, reservedNames, conflictSuffix);\n\n if (isLocal) {\n reservedNames.add(referenceName);\n } else {\n importNames.set(id, importName);\n }\n\n referenceNames.set(id, referenceName);\n }\n\n return { referenceNames, importNames };\n}\n\nexport function createReferenceNameMap(\n ids: Iterable<string>,\n reservedNames: Set<string>,\n conflictSuffix: string\n): ReferenceNameMap {\n const map: ReferenceNameMap = new Map();\n for (const id of ids) {\n if (map.has(id)) {\n continue;\n }\n map.set(id, createUniqueReferenceName(toCamelCase(id), reservedNames, conflictSuffix));\n }\n return map;\n}\n\nexport function createScheduledTriggerReferenceMaps(\n scheduledTriggers: unknown,\n reservedNames: Set<string>\n): {\n referenceNames: ReferenceNameMap;\n importRefs: TriggerImportMap;\n} {\n const referenceNames: ReferenceNameMap = new Map();\n const importRefs: TriggerImportMap = new Map();\n\n if (!scheduledTriggers || !isPlainObject(scheduledTriggers)) {\n return { referenceNames, importRefs };\n }\n\n const moduleNameCounts = new Map<string, number>();\n\n for (const [scheduledTriggerId, scheduledTriggerData] of Object.entries(scheduledTriggers)) {\n if (referenceNames.has(scheduledTriggerId)) {\n continue;\n }\n\n const scheduledTriggerRecord = isPlainObject(scheduledTriggerData)\n ? scheduledTriggerData\n : undefined;\n const scheduledTriggerName =\n typeof scheduledTriggerRecord?.name === 'string' && scheduledTriggerRecord.name.length > 0\n ? scheduledTriggerRecord.name\n : scheduledTriggerId;\n\n const importName = toTriggerReferenceName(scheduledTriggerName);\n const referenceName = createNumericReferenceName(importName, reservedNames);\n\n const baseModuleName =\n toKebabCase(scheduledTriggerName) || toKebabCase(scheduledTriggerId) || scheduledTriggerId;\n const moduleCount = moduleNameCounts.get(baseModuleName) ?? 0;\n moduleNameCounts.set(baseModuleName, moduleCount + 1);\n const modulePath = moduleCount === 0 ? baseModuleName : `${baseModuleName}-${moduleCount}`;\n\n referenceNames.set(scheduledTriggerId, referenceName);\n importRefs.set(scheduledTriggerId, { importName, modulePath });\n }\n\n return { referenceNames, importRefs };\n}\n\nexport function createTriggerReferenceMaps(\n triggers: unknown,\n reservedNames: Set<string>\n): {\n referenceNames: ReferenceNameMap;\n importRefs: TriggerImportMap;\n} {\n const referenceNames: ReferenceNameMap = new Map();\n const importRefs: TriggerImportMap = new Map();\n\n if (!triggers || !isPlainObject(triggers)) {\n return { referenceNames, importRefs };\n }\n\n const moduleNameCounts = new Map<string, number>();\n\n for (const [triggerId, triggerData] of Object.entries(triggers)) {\n if (referenceNames.has(triggerId)) {\n continue;\n }\n\n const triggerRecord = isPlainObject(triggerData) ? triggerData : undefined;\n const triggerName =\n typeof triggerRecord?.name === 'string' && triggerRecord.name.length > 0\n ? triggerRecord.name\n : triggerId;\n\n const importName = toTriggerReferenceName(triggerName);\n const referenceName = createNumericReferenceName(importName, reservedNames);\n\n const baseModuleName = toKebabCase(triggerName) || toKebabCase(triggerId) || triggerId;\n const moduleCount = moduleNameCounts.get(baseModuleName) ?? 0;\n moduleNameCounts.set(baseModuleName, moduleCount + 1);\n const modulePath = moduleCount === 0 ? baseModuleName : `${baseModuleName}-${moduleCount}`;\n\n referenceNames.set(triggerId, referenceName);\n importRefs.set(triggerId, { importName, modulePath });\n }\n\n return { referenceNames, importRefs };\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"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
- import { addObjectEntries, addReferenceGetterProperty, addStringProperty, collectTemplateVariableNames, createFactoryDefinition, createUniqueReferenceName, formatStringLiteral, formatTemplate, isPlainObject, toCamelCase } from "../utils.js";
1
+ import { addReferenceGetterProperty, addValueToObject, createFactoryDefinition, formatTemplate, resolveContextTemplateImports, toCamelCase, toTriggerReferenceName } from "../utils.js";
2
+ import { addScheduledTriggerImports, addStatusComponentImports, addSubAgentImports, addTriggerImports, collectTemplateVariableNamesFromFields, createReferenceNameMap, createScheduledTriggerReferenceMaps, createSubAgentReferenceMaps, createTriggerReferenceMaps, extractContextConfigId, extractIds, extractStatusComponentIds, resolveStatusComponentId } from "./agent-generator.helpers.js";
3
+ import { FullProjectDefinitionSchema } from "@inkeep/agents-core";
2
4
  import { z } from "zod";
3
5
  import { SyntaxKind } from "ts-morph";
4
6
 
@@ -7,40 +9,39 @@ const SubAgentReferenceSchema = z.object({
7
9
  name: z.string().nonempty(),
8
10
  local: z.boolean().optional()
9
11
  });
10
- const AgentSchema = z.looseObject({
12
+ const MySchema = FullProjectDefinitionSchema.shape.agents.valueType.omit({ id: true });
13
+ const SubAgentSchema = MySchema.shape.subAgents.valueType.omit({ type: true });
14
+ const ToolSchema = MySchema.shape.tools.unwrap().valueType;
15
+ const AgentSchema = z.strictObject({
11
16
  agentId: z.string().nonempty(),
12
- name: z.string().nonempty(),
13
- description: z.string().nullish(),
14
- prompt: z.string().optional(),
15
- models: z.looseObject({}).optional(),
16
- defaultSubAgentId: z.string().nonempty(),
17
- subAgents: z.union([z.array(z.string()), z.record(z.string(), z.unknown())]),
18
- contextConfig: z.union([z.string(), z.looseObject({ id: z.string().optional() })]).optional(),
19
- stopWhen: z.object({ transferCountIs: z.int().optional() }).optional(),
20
- statusUpdates: z.strictObject({
21
- numEvents: z.int().optional(),
22
- timeInSeconds: z.int().optional(),
23
- statusComponents: z.array(z.union([z.string(), z.looseObject({
24
- id: z.string().optional(),
25
- type: z.string(),
26
- name: z.string().optional()
27
- })])).optional(),
28
- prompt: z.string().optional()
29
- }).optional(),
30
- credentials: z.array(z.union([z.string(), z.strictObject({ id: z.string() })])).optional(),
31
- triggers: z.union([z.array(z.string()), z.record(z.string(), z.unknown())]).optional(),
32
- scheduledTriggers: z.union([z.array(z.string()), z.record(z.string(), z.unknown())]).optional(),
17
+ ...MySchema.shape,
18
+ description: z.preprocess((v) => v || void 0, MySchema.shape.description),
19
+ models: z.preprocess((v) => v ?? void 0, MySchema.shape.models),
20
+ stopWhen: z.preprocess((v) => v && Object.keys(v).length && v || void 0, MySchema.shape.stopWhen),
21
+ subAgents: z.record(z.string(), z.strictObject({
22
+ ...SubAgentSchema.shape,
23
+ models: z.preprocess((v) => v ?? void 0, SubAgentSchema.shape.models),
24
+ stopWhen: z.preprocess((v) => v ?? void 0, SubAgentSchema.shape.stopWhen),
25
+ skills: z.unknown(),
26
+ canDelegateTo: z.unknown()
27
+ })),
28
+ tools: z.record(z.string(), z.strictObject({
29
+ ...ToolSchema.shape,
30
+ imageUrl: z.preprocess((v) => v ?? void 0, ToolSchema.shape.imageUrl)
31
+ })).optional(),
32
+ triggers: z.record(z.string(), z.unknown()).optional(),
33
33
  agentVariableName: z.string().nonempty().optional(),
34
34
  subAgentReferences: z.record(z.string(), SubAgentReferenceSchema).optional(),
35
+ subAgentReferencePathOverrides: z.record(z.string(), z.string().nonempty()).optional(),
35
36
  contextConfigReference: SubAgentReferenceSchema.optional(),
36
37
  contextConfigHeadersReference: SubAgentReferenceSchema.optional()
37
38
  });
38
- function generateAgentDefinition(data) {
39
+ function generateAgentDefinition({ id, createdAt, updatedAt, ...data }) {
39
40
  const result = AgentSchema.safeParse(data);
40
41
  if (!result.success) throw new Error(`Validation failed for agent:\n${z.prettifyError(result.error)}`);
41
42
  const parsed = result.data;
42
43
  const subAgentIds = new Set(extractIds(parsed.subAgents));
43
- subAgentIds.add(parsed.defaultSubAgentId);
44
+ if (parsed.defaultSubAgentId) subAgentIds.add(parsed.defaultSubAgentId);
44
45
  const agentVarName = parsed.agentVariableName || toCamelCase(parsed.agentId);
45
46
  const { sourceFile, configObject } = createFactoryDefinition({
46
47
  importName: "agent",
@@ -48,34 +49,32 @@ function generateAgentDefinition(data) {
48
49
  });
49
50
  const reservedReferenceNames = new Set([agentVarName]);
50
51
  const { referenceNames: subAgentReferenceNames, importNames: subAgentImportNames } = createSubAgentReferenceMaps(subAgentIds, reservedReferenceNames, "SubAgent", parsed.subAgentReferences);
51
- addSubAgentImports(sourceFile, subAgentReferenceNames, subAgentImportNames);
52
+ addSubAgentImports(sourceFile, subAgentReferenceNames, subAgentImportNames, parsed.subAgentReferencePathOverrides);
52
53
  const contextConfigId = extractContextConfigId(parsed.contextConfig);
53
54
  let contextConfigReferenceName;
54
55
  let contextHeadersReferenceName;
55
56
  const hasHeadersTemplateVariables = collectTemplateVariableNamesFromFields([parsed.prompt, parsed.statusUpdates?.prompt]).some((variableName) => variableName.startsWith("headers."));
56
57
  if (contextConfigId) {
57
- const contextConfigImportName = parsed.contextConfigReference?.name ?? toCamelCase(contextConfigId);
58
- contextConfigReferenceName = createUniqueReferenceName(contextConfigImportName, reservedReferenceNames, "ContextConfig");
59
- const contextHeadersImportName = parsed.contextConfigHeadersReference?.name ?? `${toCamelCase(contextConfigId)}Headers`;
60
- if (hasHeadersTemplateVariables) contextHeadersReferenceName = createUniqueReferenceName(contextHeadersImportName, reservedReferenceNames, "Headers");
61
- const namedImports = [];
62
- if (parsed.contextConfigReference?.local !== true) namedImports.push(contextConfigImportName === contextConfigReferenceName ? contextConfigImportName : {
63
- name: contextConfigImportName,
64
- alias: contextConfigReferenceName
65
- });
66
- if (hasHeadersTemplateVariables && contextHeadersReferenceName && parsed.contextConfigHeadersReference?.local !== true) namedImports.push(contextHeadersImportName === contextHeadersReferenceName ? contextHeadersImportName : {
67
- name: contextHeadersImportName,
68
- alias: contextHeadersReferenceName
58
+ const contextImportResolution = resolveContextTemplateImports({
59
+ reservedNames: reservedReferenceNames,
60
+ shouldResolveContextReference: true,
61
+ shouldResolveHeadersReference: hasHeadersTemplateVariables,
62
+ contextConfigReference: parsed.contextConfigReference,
63
+ contextConfigHeadersReference: parsed.contextConfigHeadersReference,
64
+ defaultContextImportName: toCamelCase(contextConfigId),
65
+ defaultHeadersImportName: `${toCamelCase(contextConfigId)}Headers`
69
66
  });
70
- if (namedImports.length > 0) sourceFile.addImportDeclaration({
71
- namedImports,
67
+ contextConfigReferenceName = contextImportResolution.contextReferenceName;
68
+ contextHeadersReferenceName = contextImportResolution.headersReferenceName;
69
+ if (contextImportResolution.namedImports.length > 0) sourceFile.addImportDeclaration({
70
+ namedImports: contextImportResolution.namedImports,
72
71
  moduleSpecifier: `../context-configs/${contextConfigId}`
73
72
  });
74
73
  }
75
- const triggerReferenceNames = createReferenceNameMap(parsed.triggers ? extractIds(parsed.triggers) : [], reservedReferenceNames, "Trigger");
76
- addTriggerImports(sourceFile, triggerReferenceNames);
77
- const scheduledTriggerReferenceNames = createReferenceNameMap(parsed.scheduledTriggers ? extractIds(parsed.scheduledTriggers) : [], reservedReferenceNames, "ScheduledTrigger");
78
- addScheduledTriggerImports(sourceFile, scheduledTriggerReferenceNames);
74
+ const { referenceNames: triggerReferenceNames, importRefs: triggerImportRefs } = createTriggerReferenceMaps(parsed.triggers, reservedReferenceNames);
75
+ addTriggerImports(sourceFile, triggerReferenceNames, triggerImportRefs);
76
+ const { referenceNames: scheduledTriggerReferenceNames, importRefs: scheduledTriggerImportRefs } = createScheduledTriggerReferenceMaps(parsed.scheduledTriggers, reservedReferenceNames);
77
+ addScheduledTriggerImports(sourceFile, scheduledTriggerReferenceNames, scheduledTriggerImportRefs);
79
78
  const statusComponentReferenceNames = createReferenceNameMap(extractStatusComponentIds(parsed.statusUpdates), reservedReferenceNames, "StatusComponent");
80
79
  addStatusComponentImports(sourceFile, statusComponentReferenceNames);
81
80
  writeAgentConfig(configObject, parsed, {
@@ -89,188 +88,50 @@ function generateAgentDefinition(data) {
89
88
  return sourceFile;
90
89
  }
91
90
  function writeAgentConfig(configObject, data, referenceNames) {
92
- addStringProperty(configObject, "id", data.agentId);
93
- addStringProperty(configObject, "name", data.name);
94
- if (data.description != null) addStringProperty(configObject, "description", data.description);
95
- if (data.prompt !== void 0) {
96
- const template = formatTemplate(data.prompt, {
91
+ for (const [key, value] of Object.entries({
92
+ id: data.agentId,
93
+ name: data.name,
94
+ description: data.description,
95
+ prompt: data.prompt && formatTemplate(data.prompt, {
97
96
  contextReference: referenceNames.contextConfig,
98
97
  headersReference: referenceNames.contextHeaders
99
- });
100
- configObject.addPropertyAssignment({
101
- name: "prompt",
102
- initializer: formatStringLiteral(template)
103
- });
104
- }
105
- if (data.models && Object.keys(data.models).length > 0) addObjectEntries(configObject.addPropertyAssignment({
106
- name: "models",
107
- initializer: "{}"
108
- }).getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression), data.models);
109
- configObject.addPropertyAssignment({
98
+ }),
99
+ models: data.models,
100
+ stopWhen: data.stopWhen
101
+ })) addValueToObject(configObject, key, value);
102
+ const { defaultSubAgentId } = data;
103
+ if (defaultSubAgentId) configObject.addPropertyAssignment({
110
104
  name: "defaultSubAgent",
111
- initializer: referenceNames.subAgents.get(data.defaultSubAgentId) ?? toCamelCase(data.defaultSubAgentId)
105
+ initializer: referenceNames.subAgents.get(defaultSubAgentId) ?? toCamelCase(defaultSubAgentId)
112
106
  });
113
107
  addReferenceGetterProperty(configObject, "subAgents", extractIds(data.subAgents).map((id) => referenceNames.subAgents.get(id) ?? toCamelCase(id)));
114
108
  if (extractContextConfigId(data.contextConfig) && referenceNames.contextConfig) configObject.addPropertyAssignment({
115
109
  name: "contextConfig",
116
110
  initializer: referenceNames.contextConfig
117
111
  });
118
- if (data.credentials?.length) {
119
- const credentialIds = data.credentials.map((credential) => {
120
- if (typeof credential === "string") return credential;
121
- return credential.id;
122
- }).filter((id) => Boolean(id));
123
- if (credentialIds.length > 0) addReferenceGetterProperty(configObject, "credentials", credentialIds.map((id) => toCamelCase(id)));
124
- }
125
112
  const triggerIds = data.triggers ? extractIds(data.triggers) : [];
126
- if (triggerIds.length > 0) addReferenceGetterProperty(configObject, "triggers", triggerIds.map((id) => referenceNames.triggers.get(id) ?? toCamelCase(id)));
113
+ if (triggerIds.length) addReferenceGetterProperty(configObject, "triggers", triggerIds.map((id) => referenceNames.triggers.get(id) ?? toTriggerReferenceName(id)));
127
114
  const scheduledTriggerIds = data.scheduledTriggers ? extractIds(data.scheduledTriggers) : [];
128
- if (scheduledTriggerIds.length > 0) addReferenceGetterProperty(configObject, "scheduledTriggers", scheduledTriggerIds.map((id) => referenceNames.scheduledTriggers.get(id) ?? toCamelCase(id)));
129
- if (data.stopWhen?.transferCountIs !== void 0) configObject.addPropertyAssignment({
130
- name: "stopWhen",
131
- initializer: "{}"
132
- }).getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression).addPropertyAssignment({
133
- name: "transferCountIs",
134
- initializer: String(data.stopWhen.transferCountIs)
135
- });
115
+ if (scheduledTriggerIds.length) addReferenceGetterProperty(configObject, "scheduledTriggers", scheduledTriggerIds.map((id) => referenceNames.scheduledTriggers.get(id) ?? toTriggerReferenceName(id)));
136
116
  if (data.statusUpdates) {
137
117
  const statusUpdatesObject = configObject.addPropertyAssignment({
138
118
  name: "statusUpdates",
139
119
  initializer: "{}"
140
120
  }).getInitializerIfKindOrThrow(SyntaxKind.ObjectLiteralExpression);
141
- if (data.statusUpdates.numEvents !== void 0) statusUpdatesObject.addPropertyAssignment({
142
- name: "numEvents",
143
- initializer: String(data.statusUpdates.numEvents)
144
- });
145
- if (data.statusUpdates.timeInSeconds !== void 0) statusUpdatesObject.addPropertyAssignment({
146
- name: "timeInSeconds",
147
- initializer: String(data.statusUpdates.timeInSeconds)
148
- });
149
- if (data.statusUpdates.statusComponents && data.statusUpdates.statusComponents.length > 0) {
150
- const statusComponentRefs = data.statusUpdates.statusComponents.map((statusComponent) => `${referenceNames.statusComponents.get(resolveStatusComponentId(statusComponent)) ?? toCamelCase(resolveStatusComponentId(statusComponent))}.config`);
151
- if (statusComponentRefs.length > 0) statusUpdatesObject.addPropertyAssignment({
152
- name: "statusComponents",
153
- initializer: "[]"
154
- }).getInitializerIfKindOrThrow(SyntaxKind.ArrayLiteralExpression).addElements(statusComponentRefs);
155
- }
156
- if (data.statusUpdates.prompt !== void 0) {
157
- const template = formatTemplate(data.statusUpdates.prompt, {
158
- contextReference: referenceNames.contextConfig,
159
- headersReference: referenceNames.contextHeaders
160
- });
161
- statusUpdatesObject.addPropertyAssignment({
162
- name: "prompt",
163
- initializer: formatStringLiteral(template)
164
- });
165
- }
166
- }
167
- }
168
- function collectTemplateVariableNamesFromFields(values) {
169
- const variables = [];
170
- for (const value of values) {
171
- if (typeof value !== "string") continue;
172
- variables.push(...collectTemplateVariableNames(value));
173
- }
174
- return variables;
175
- }
176
- function extractIds(value) {
177
- if (Array.isArray(value)) return value.map((item) => {
178
- if (typeof item === "string") return item;
179
- if (isPlainObject(item) && typeof item.id === "string") return item.id;
180
- return null;
181
- }).filter((id) => !!id);
182
- return Object.keys(value);
183
- }
184
- function extractContextConfigId(contextConfig) {
185
- if (!contextConfig) return;
186
- if (typeof contextConfig === "string") return contextConfig;
187
- return contextConfig.id;
188
- }
189
- function addSubAgentImports(sourceFile, referenceNames, importNames) {
190
- for (const [subAgentId, referenceName] of referenceNames) {
191
- const importName = importNames.get(subAgentId);
192
- if (!importName) continue;
193
- sourceFile.addImportDeclaration({
194
- namedImports: [importName === referenceName ? importName : {
195
- name: importName,
196
- alias: referenceName
197
- }],
198
- moduleSpecifier: `./sub-agents/${subAgentId}`
199
- });
200
- }
201
- }
202
- function addTriggerImports(sourceFile, referenceNames) {
203
- for (const [triggerId, referenceName] of referenceNames) {
204
- const importName = toCamelCase(triggerId);
205
- sourceFile.addImportDeclaration({
206
- namedImports: [importName === referenceName ? importName : {
207
- name: importName,
208
- alias: referenceName
209
- }],
210
- moduleSpecifier: `./triggers/${triggerId}`
211
- });
212
- }
213
- }
214
- function addScheduledTriggerImports(sourceFile, referenceNames) {
215
- for (const [scheduledTriggerId, referenceName] of referenceNames) {
216
- const importName = toCamelCase(scheduledTriggerId);
217
- sourceFile.addImportDeclaration({
218
- namedImports: [importName === referenceName ? importName : {
219
- name: importName,
220
- alias: referenceName
221
- }],
222
- moduleSpecifier: `./scheduled-triggers/${scheduledTriggerId}`
223
- });
224
- }
225
- }
226
- function extractStatusComponentIds(statusUpdates) {
227
- if (!statusUpdates?.statusComponents?.length) return [];
228
- const statusComponentIds = statusUpdates.statusComponents.map(resolveStatusComponentId);
229
- return [...new Set(statusComponentIds)];
230
- }
231
- function resolveStatusComponentId(statusComponent) {
232
- const id = typeof statusComponent === "string" ? statusComponent : statusComponent.id || statusComponent.type;
233
- if (!id) throw new Error(`Unable to resolve status component with id ${JSON.stringify(statusComponent)}`);
234
- return id;
235
- }
236
- function addStatusComponentImports(sourceFile, referenceNames) {
237
- for (const [statusComponentId, referenceName] of referenceNames) {
238
- const importName = toCamelCase(statusComponentId);
239
- sourceFile.addImportDeclaration({
240
- namedImports: [importName === referenceName ? importName : {
241
- name: importName,
242
- alias: referenceName
243
- }],
244
- moduleSpecifier: `../status-components/${statusComponentId}`
245
- });
246
- }
247
- }
248
- function createSubAgentReferenceMaps(ids, reservedNames, conflictSuffix, overrides) {
249
- const referenceNames = /* @__PURE__ */ new Map();
250
- const importNames = /* @__PURE__ */ new Map();
251
- for (const id of ids) {
252
- if (referenceNames.has(id)) continue;
253
- const override = overrides?.[id];
254
- const importName = override?.name ?? toCamelCase(id);
255
- const isLocal = override?.local === true;
256
- const referenceName = isLocal ? importName : createUniqueReferenceName(importName, reservedNames, conflictSuffix);
257
- if (isLocal) reservedNames.add(referenceName);
258
- else importNames.set(id, importName);
259
- referenceNames.set(id, referenceName);
260
- }
261
- return {
262
- referenceNames,
263
- importNames
264
- };
265
- }
266
- function createReferenceNameMap(ids, reservedNames, conflictSuffix) {
267
- const map = /* @__PURE__ */ new Map();
268
- for (const id of ids) {
269
- if (map.has(id)) continue;
270
- map.set(id, createUniqueReferenceName(toCamelCase(id), reservedNames, conflictSuffix));
121
+ addValueToObject(statusUpdatesObject, "numEvents", data.statusUpdates.numEvents);
122
+ addValueToObject(statusUpdatesObject, "timeInSeconds", data.statusUpdates.timeInSeconds);
123
+ addValueToObject(statusUpdatesObject, "prompt", data.statusUpdates.prompt && formatTemplate(data.statusUpdates.prompt, {
124
+ contextReference: referenceNames.contextConfig,
125
+ headersReference: referenceNames.contextHeaders
126
+ }));
127
+ const statusComponentRefs = data.statusUpdates.statusComponents?.map((statusComponent) => `${referenceNames.statusComponents.get(resolveStatusComponentId(statusComponent)) ?? toCamelCase(resolveStatusComponentId(statusComponent))}.config`);
128
+ if (statusComponentRefs?.length) statusUpdatesObject.addPropertyAssignment({
129
+ name: "statusComponents",
130
+ initializer: "[]"
131
+ }).getInitializerIfKindOrThrow(SyntaxKind.ArrayLiteralExpression).addElements(statusComponentRefs);
271
132
  }
272
- return map;
273
133
  }
274
134
 
275
135
  //#endregion
276
- export { generateAgentDefinition };
136
+ export { generateAgentDefinition };
137
+ //# sourceMappingURL=agent-generator.js.map