@inkeep/agents-cli 0.59.3 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents-cli/package.js +1 -1
- package/dist/commands/pull-v4/collector-common.js +128 -0
- package/dist/commands/pull-v4/collector-common.js.map +1 -0
- package/dist/commands/pull-v4/collector-reference-helpers.js +323 -0
- package/dist/commands/pull-v4/collector-reference-helpers.js.map +1 -0
- package/dist/commands/pull-v4/component-parser.js +2 -1
- package/dist/commands/pull-v4/component-parser.js.map +1 -1
- package/dist/commands/pull-v4/file-scope.js +43 -0
- package/dist/commands/pull-v4/file-scope.js.map +1 -0
- package/dist/commands/pull-v4/generation-resolver.js +305 -0
- package/dist/commands/pull-v4/generation-resolver.js.map +1 -0
- package/dist/commands/pull-v4/generation-types.js +56 -0
- package/dist/commands/pull-v4/generation-types.js.map +1 -0
- package/dist/commands/pull-v4/generators/agent-generator.helpers.js +4 -10
- package/dist/commands/pull-v4/generators/agent-generator.helpers.js.map +1 -1
- package/dist/commands/pull-v4/generators/agent-generator.js +154 -81
- package/dist/commands/pull-v4/generators/agent-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/artifact-component-generator.js +48 -27
- package/dist/commands/pull-v4/generators/artifact-component-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/context-config-generator.js +147 -129
- package/dist/commands/pull-v4/generators/context-config-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/credential-generator.js +36 -14
- package/dist/commands/pull-v4/generators/credential-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/data-component-generator.js +55 -19
- package/dist/commands/pull-v4/generators/data-component-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/environment-generator.js +29 -33
- package/dist/commands/pull-v4/generators/environment-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/environment-settings-generator.js +57 -0
- package/dist/commands/pull-v4/generators/environment-settings-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/external-agent-generator.js +51 -23
- package/dist/commands/pull-v4/generators/external-agent-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/function-tool-generator.js +50 -14
- package/dist/commands/pull-v4/generators/function-tool-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/helpers/agent.js +129 -0
- package/dist/commands/pull-v4/generators/helpers/agent.js.map +1 -0
- package/dist/commands/pull-v4/generators/helpers/sub-agent.js +65 -0
- package/dist/commands/pull-v4/generators/helpers/sub-agent.js.map +1 -0
- package/dist/commands/pull-v4/generators/index.js +38 -0
- package/dist/commands/pull-v4/generators/index.js.map +1 -0
- package/dist/commands/pull-v4/generators/mcp-tool-generator.js +48 -27
- package/dist/commands/pull-v4/generators/mcp-tool-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/project-generator.js +144 -110
- package/dist/commands/pull-v4/generators/project-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/scheduled-trigger-generator.js +66 -0
- package/dist/commands/pull-v4/generators/scheduled-trigger-generator.js.map +1 -0
- package/dist/commands/pull-v4/generators/status-component-generator.js +55 -20
- package/dist/commands/pull-v4/generators/status-component-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js +4 -1
- package/dist/commands/pull-v4/generators/sub-agent-generator.helpers.js.map +1 -1
- package/dist/commands/pull-v4/generators/sub-agent-generator.js +282 -166
- package/dist/commands/pull-v4/generators/sub-agent-generator.js.map +1 -1
- package/dist/commands/pull-v4/generators/trigger-generator.js +62 -27
- package/dist/commands/pull-v4/generators/trigger-generator.js.map +1 -1
- package/dist/commands/pull-v4/import-plan.js +40 -0
- package/dist/commands/pull-v4/import-plan.js.map +1 -0
- package/dist/commands/pull-v4/introspect/index.js +11 -7
- package/dist/commands/pull-v4/introspect/index.js.map +1 -1
- package/dist/commands/pull-v4/introspect-generator.js +15 -1218
- package/dist/commands/pull-v4/introspect-generator.js.map +1 -1
- package/dist/commands/pull-v4/module-merge.js +14 -5
- package/dist/commands/pull-v4/module-merge.js.map +1 -1
- package/dist/commands/pull-v4/reference-resolution.js +111 -0
- package/dist/commands/pull-v4/reference-resolution.js.map +1 -0
- package/dist/commands/pull-v4/simple-factory-generator.js +54 -0
- package/dist/commands/pull-v4/simple-factory-generator.js.map +1 -0
- package/dist/commands/pull-v4/{generators/skill-generator.js → skill.js} +18 -6
- package/dist/commands/pull-v4/skill.js.map +1 -0
- package/dist/commands/pull-v4/typescript-file-writer.js +78 -0
- package/dist/commands/pull-v4/typescript-file-writer.js.map +1 -0
- package/dist/commands/pull-v4/utils/code-values.js +64 -0
- package/dist/commands/pull-v4/utils/code-values.js.map +1 -0
- package/dist/commands/pull-v4/utils/factory-writer.js +128 -0
- package/dist/commands/pull-v4/utils/factory-writer.js.map +1 -0
- package/dist/commands/pull-v4/utils/index.js +8 -0
- package/dist/commands/pull-v4/utils/naming.js +74 -0
- package/dist/commands/pull-v4/utils/naming.js.map +1 -0
- package/dist/commands/pull-v4/utils/schema-rendering.js +20 -0
- package/dist/commands/pull-v4/utils/schema-rendering.js.map +1 -0
- package/dist/commands/pull-v4/utils/shared.js +18 -0
- package/dist/commands/pull-v4/utils/shared.js.map +1 -0
- package/dist/commands/pull-v4/utils/templates.js +58 -0
- package/dist/commands/pull-v4/utils/templates.js.map +1 -0
- package/package.json +4 -4
- package/dist/commands/pull-v4/generators/skill-generator.js.map +0 -1
- package/dist/commands/pull-v4/scheduled-trigger-generator.js +0 -38
- package/dist/commands/pull-v4/scheduled-trigger-generator.js.map +0 -1
- package/dist/commands/pull-v4/utils.js +0 -320
- package/dist/commands/pull-v4/utils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"introspect-generator.js","names":["record"],"sources":["../../../src/commands/pull-v4/introspect-generator.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join } from 'node:path';\nimport type { FullProjectDefinition } from '@inkeep/agents-core';\nimport { Node, type SourceFile, SyntaxKind } from 'ts-morph';\nimport { buildComponentRegistryFromParsing } from './component-parser';\nimport type { ComponentRegistry, ComponentType } from './component-registry';\nimport { generateAgentDefinition } from './generators/agent-generator';\nimport { generateArtifactComponentDefinition } from './generators/artifact-component-generator';\nimport { generateContextConfigDefinition } from './generators/context-config-generator';\nimport { generateCredentialDefinition } from './generators/credential-generator';\nimport { generateDataComponentDefinition } from './generators/data-component-generator';\nimport {\n generateEnvironmentIndexDefinition,\n generateEnvironmentSettingsDefinition,\n} from './generators/environment-generator';\nimport { generateExternalAgentDefinition } from './generators/external-agent-generator';\nimport { generateFunctionToolDefinition } from './generators/function-tool-generator';\nimport { generateMcpToolDefinition } from './generators/mcp-tool-generator';\nimport { generateProjectDefinition } from './generators/project-generator';\nimport { generateStatusComponentDefinition } from './generators/status-component-generator';\nimport { generateSubAgentDefinition } from './generators/sub-agent-generator';\nimport { resolveSubAgentVariableName } from './generators/sub-agent-generator.helpers';\nimport { generateTriggerDefinition } from './generators/trigger-generator';\nimport { mergeGeneratedModule } from './module-merge';\nimport { generateScheduledTriggerDefinition } from './scheduled-trigger-generator';\nimport {\n buildComponentFileName,\n collectTemplateVariableNames,\n createInMemoryProject,\n isHumanReadableId,\n isPlainObject,\n toCamelCase,\n toCredentialReferenceName,\n toKebabCase,\n toToolReferenceName,\n} from './utils';\n\nexport interface ProjectPaths {\n projectRoot: string;\n agentsDir: string;\n toolsDir: string;\n dataComponentsDir: string;\n artifactComponentsDir: string;\n statusComponentsDir: string;\n environmentsDir: string;\n credentialsDir: string;\n contextConfigsDir: string;\n externalAgentsDir: string;\n}\n\nexport interface IntrospectOptions {\n project: FullProjectDefinition;\n paths: ProjectPaths;\n /** @default \"merge\" */\n writeMode?: 'merge' | 'overwrite';\n /** @default false */\n debug?: boolean;\n}\n\ninterface GenerationContext {\n project: FullProjectDefinition;\n paths: ProjectPaths;\n completeAgentIds: Set<string>;\n existingComponentRegistry?: ComponentRegistry;\n}\n\ninterface GenerationRecord<TPayload> {\n id: string;\n filePath: string;\n payload: TPayload;\n}\n\ninterface GenerationTask<TPayload> {\n type: string;\n collect: (context: GenerationContext) => GenerationRecord<TPayload>[];\n generate: (payload: TPayload) => SourceFile;\n}\n\ninterface SkippedAgent {\n id: string;\n reason: string;\n}\n\ntype SubAgentReferenceOverrideType =\n | 'tools'\n | 'subAgents'\n | 'agents'\n | 'externalAgents'\n | 'dataComponents'\n | 'artifactComponents';\n\ntype SubAgentReferenceOverrides = Partial<\n Record<SubAgentReferenceOverrideType, Record<string, string>>\n>;\n\ntype SubAgentReferencePathOverrides = Partial<\n Record<'tools' | 'subAgents' | 'agents' | 'externalAgents', Record<string, string>>\n>;\n\ninterface SubAgentDependencyReferences {\n referenceOverrides?: SubAgentReferenceOverrides;\n referencePathOverrides?: SubAgentReferencePathOverrides;\n}\n\ntype ProjectReferenceOverrideType =\n | 'agents'\n | 'tools'\n | 'externalAgents'\n | 'dataComponents'\n | 'artifactComponents'\n | 'credentialReferences';\n\ntype ProjectReferenceOverrides = Partial<\n Record<ProjectReferenceOverrideType, Record<string, string>>\n>;\n\ntype ProjectReferencePathOverrides = Partial<\n Record<ProjectReferenceOverrideType, Record<string, string>>\n>;\n\ninterface TemplateReferenceOverride {\n name: string;\n local?: boolean;\n}\n\ninterface ContextTemplateReferences {\n contextConfigId: string;\n contextConfigReference: TemplateReferenceOverride;\n contextConfigHeadersReference?: TemplateReferenceOverride;\n}\n\nexport async function introspectGenerate({\n project,\n paths,\n writeMode = 'merge',\n debug = false,\n}: IntrospectOptions): Promise<void> {\n validateProject(project);\n\n const skippedAgents: SkippedAgent[] = [];\n const completeAgentIds = collectCompleteAgentIds(project, skippedAgents);\n const existingComponentRegistry =\n writeMode === 'merge' ? buildComponentRegistryFromParsing(paths.projectRoot, debug) : undefined;\n const context: GenerationContext = {\n project,\n paths,\n completeAgentIds,\n existingComponentRegistry,\n };\n const tasks = createGenerationTasks();\n const generatedFiles: string[] = [];\n\n for (const task of tasks) {\n const records = task.collect(context);\n for (const record of records) {\n const sourceFile = task.generate(record.payload);\n writeTypeScriptFile(record.filePath, sourceFile.getFullText(), writeMode);\n generatedFiles.push(record.filePath);\n }\n }\n\n if (debug) {\n console.log(`Generated ${generatedFiles.length} files`);\n if (skippedAgents.length) {\n console.log(\n `Skipped ${skippedAgents.length} agent(s): ${skippedAgents\n .map((agent) => `${agent.id} (${agent.reason})`)\n .join(', ')}`\n );\n }\n }\n}\n\nfunction createGenerationTasks(): Array<GenerationTask<any>> {\n return [\n {\n type: 'credential',\n collect: collectCredentialRecords,\n generate: generateCredentialDefinition,\n },\n {\n type: 'environment-settings',\n collect: collectEnvironmentSettingsRecords,\n generate: generateEnvironmentSettingsRecord,\n },\n {\n type: 'environment-index',\n collect: collectEnvironmentIndexRecords,\n generate: generateEnvironmentIndexDefinition,\n },\n {\n type: 'artifact-component',\n collect: collectArtifactComponentRecords,\n generate: generateArtifactComponentDefinition,\n },\n {\n type: 'data-component',\n collect: collectDataComponentRecords,\n generate: generateDataComponentDefinition,\n },\n {\n type: 'function-tool',\n collect: collectFunctionToolRecords,\n generate: generateFunctionToolDefinition,\n },\n {\n type: 'tool',\n collect: collectToolRecords,\n generate: generateMcpToolDefinition,\n },\n {\n type: 'external-agent',\n collect: collectExternalAgentRecords,\n generate: generateExternalAgentDefinition,\n },\n {\n type: 'context-config',\n collect: collectContextConfigRecords,\n generate: generateContextConfigDefinition,\n },\n {\n type: 'trigger',\n collect: collectTriggerRecords,\n generate: generateTriggerDefinition,\n },\n {\n type: 'scheduled-trigger',\n collect: collectScheduledTriggerRecords,\n generate: generateScheduledTriggerDefinition,\n },\n {\n type: 'sub-agent',\n collect: collectSubAgentRecords,\n generate: generateSubAgentDefinition,\n },\n {\n type: 'status-component',\n collect: collectStatusComponentRecords,\n generate: generateStatusComponentDefinition,\n },\n {\n type: 'agent',\n collect: collectAgentRecords,\n generate: generateAgentDefinition,\n },\n {\n type: 'project',\n collect: collectProjectRecord,\n generate: generateProjectDefinition,\n },\n ];\n}\n\nfunction collectCredentialRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateCredentialDefinition>[0]>> {\n if (!context.project.credentialReferences) {\n return [];\n }\n\n const credentialEntries = Object.entries(context.project.credentialReferences);\n const fileNamesByCredentialId = buildSequentialNameFileNames(credentialEntries);\n\n return credentialEntries.map(([credentialId, credentialData]) => ({\n id: credentialId,\n filePath: resolveRecordFilePath(\n context,\n 'credentials',\n credentialId,\n join(context.paths.credentialsDir, fileNamesByCredentialId[credentialId])\n ),\n payload: {\n credentialId,\n ...credentialData,\n } as Parameters<typeof generateCredentialDefinition>[0],\n }));\n}\n\nfunction collectEnvironmentSettingsRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateEnvironmentSettingsDefinition>[1]>> {\n const credentialReferenceIds = collectEnvironmentCredentialReferenceIds(context.project);\n if (credentialReferenceIds.length === 0) {\n return [];\n }\n\n const credentialsById: Record<string, unknown> = {};\n for (const credentialReferenceId of credentialReferenceIds) {\n const credentialData = context.project.credentialReferences?.[credentialReferenceId];\n if (isPlainObject(credentialData)) {\n credentialsById[credentialReferenceId] = {\n ...credentialData,\n id: credentialReferenceId,\n };\n continue;\n }\n\n credentialsById[credentialReferenceId] = {\n id: credentialReferenceId,\n };\n }\n\n return [\n {\n id: 'development',\n filePath: resolveRecordFilePath(\n context,\n 'environments',\n 'development',\n join(context.paths.environmentsDir, 'development.env.ts')\n ),\n payload: {\n credentials: credentialsById,\n } as Parameters<typeof generateEnvironmentSettingsDefinition>[1],\n },\n ];\n}\n\nfunction collectEnvironmentIndexRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateEnvironmentIndexDefinition>[0]>> {\n const credentialReferenceIds = collectEnvironmentCredentialReferenceIds(context.project);\n if (credentialReferenceIds.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'index',\n filePath: resolveRecordFilePath(\n context,\n 'environments',\n 'index',\n join(context.paths.environmentsDir, 'index.ts')\n ),\n payload: ['development'] as Parameters<typeof generateEnvironmentIndexDefinition>[0],\n },\n ];\n}\n\nfunction generateEnvironmentSettingsRecord(\n payload: Parameters<typeof generateEnvironmentSettingsDefinition>[1]\n): SourceFile {\n return generateEnvironmentSettingsDefinition('development', payload);\n}\n\nfunction collectArtifactComponentRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateArtifactComponentDefinition>[0]>> {\n if (!context.project.artifactComponents) {\n return [];\n }\n\n return Object.entries(context.project.artifactComponents).map(\n ([artifactComponentId, artifactComponentData]) => ({\n id: artifactComponentId,\n filePath: resolveRecordFilePath(\n context,\n 'artifactComponents',\n artifactComponentId,\n join(\n context.paths.artifactComponentsDir,\n buildComponentFileName(artifactComponentId, artifactComponentData.name ?? undefined)\n )\n ),\n payload: {\n artifactComponentId,\n ...artifactComponentData,\n } as Parameters<typeof generateArtifactComponentDefinition>[0],\n })\n );\n}\n\nfunction collectDataComponentRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateDataComponentDefinition>[0]>> {\n const recordsByDataComponentId = new Map<\n string,\n GenerationRecord<Parameters<typeof generateDataComponentDefinition>[0]>\n >();\n\n for (const [dataComponentId, dataComponent] of Object.entries(\n context.project.dataComponents ?? {}\n )) {\n recordsByDataComponentId.set(dataComponentId, {\n id: dataComponentId,\n filePath: resolveRecordFilePath(\n context,\n 'dataComponents',\n dataComponentId,\n join(\n context.paths.dataComponentsDir,\n buildComponentFileName(dataComponentId, dataComponent.name ?? undefined)\n )\n ),\n payload: {\n dataComponentId,\n ...dataComponent,\n } as Parameters<typeof generateDataComponentDefinition>[0],\n });\n }\n\n for (const dataComponentId of collectReferencedSubAgentComponentIds(context, 'dataComponents')) {\n if (recordsByDataComponentId.has(dataComponentId)) {\n continue;\n }\n\n recordsByDataComponentId.set(dataComponentId, {\n id: dataComponentId,\n filePath: resolveRecordFilePath(\n context,\n 'dataComponents',\n dataComponentId,\n join(context.paths.dataComponentsDir, `${dataComponentId}.ts`)\n ),\n payload: {\n dataComponentId,\n name: dataComponentId,\n props: { type: 'object', properties: {} },\n } as Parameters<typeof generateDataComponentDefinition>[0],\n });\n }\n\n return [...recordsByDataComponentId.values()];\n}\n\nfunction collectReferencedSubAgentComponentIds(\n context: GenerationContext,\n componentProperty: 'dataComponents' | 'artifactComponents'\n): string[] {\n const componentIds = new Set<string>();\n\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents?.[agentId];\n const subAgents = asRecord(agentData?.subAgents);\n if (!subAgents) {\n continue;\n }\n\n for (const subAgentData of Object.values(subAgents)) {\n const subAgentRecord = asRecord(subAgentData);\n if (!subAgentRecord) {\n continue;\n }\n\n for (const componentId of extractReferenceIds(subAgentRecord[componentProperty])) {\n componentIds.add(componentId);\n }\n }\n }\n\n return [...componentIds];\n}\n\nfunction collectContextConfigRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateContextConfigDefinition>[0]>> {\n if (!context.project.agents) {\n return [];\n }\n\n const contextConfigRecordsById = new Map<\n string,\n GenerationRecord<Parameters<typeof generateContextConfigDefinition>[0]>\n >();\n\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n const contextConfig = agentData ? asRecord(agentData.contextConfig) : undefined;\n if (!agentData || !contextConfig) {\n continue;\n }\n\n const normalizedContextConfig = applyPromptHeaderTemplateSchema(\n contextConfig,\n collectHeaderTemplateVariablesFromAgentPrompts(agentData)\n );\n\n const contextConfigId =\n typeof normalizedContextConfig.id === 'string' ? normalizedContextConfig.id : '';\n if (!contextConfigId) {\n continue;\n }\n\n if (!contextConfigRecordsById.has(contextConfigId)) {\n const contextConfigFilePath = resolveRecordFilePath(\n context,\n 'contextConfigs',\n contextConfigId,\n join(context.paths.contextConfigsDir, `${contextConfigId}.ts`)\n );\n const credentialReferenceOverrides = collectContextConfigCredentialReferenceOverrides(\n context,\n normalizedContextConfig\n );\n const credentialReferencePathOverrides = collectContextConfigCredentialReferencePathOverrides(\n context,\n normalizedContextConfig\n );\n const headersReferenceOverride = collectContextConfigHeadersReferenceOverride(\n context,\n contextConfigId,\n contextConfigFilePath\n );\n contextConfigRecordsById.set(contextConfigId, {\n id: contextConfigId,\n filePath: contextConfigFilePath,\n payload: {\n contextConfigId,\n ...normalizedContextConfig,\n ...(headersReferenceOverride && {\n headersReference: headersReferenceOverride,\n }),\n ...(credentialReferenceOverrides && {\n referenceOverrides: {\n credentialReferences: credentialReferenceOverrides,\n },\n }),\n ...(credentialReferencePathOverrides && {\n referencePathOverrides: {\n credentialReferences: credentialReferencePathOverrides,\n },\n }),\n } as Parameters<typeof generateContextConfigDefinition>[0],\n });\n }\n }\n\n return [...contextConfigRecordsById.values()];\n}\n\ninterface FunctionToolEntry {\n functionToolId: string;\n functionId: string;\n functionToolData: Record<string, unknown>;\n functionData: Record<string, unknown>;\n exportName: string;\n fileName: string;\n}\n\nfunction collectFunctionToolRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateFunctionToolDefinition>[0]>> {\n const functionToolEntries = collectFunctionToolEntries(context.project);\n if (!functionToolEntries.length) {\n return [];\n }\n\n const fileNamesByFunctionToolId = buildSequentialNameFileNames(\n functionToolEntries.map(({ functionToolId, fileName }) => [functionToolId, { name: fileName }])\n );\n\n return functionToolEntries.map(\n ({\n functionToolId,\n functionToolData,\n functionData,\n }): GenerationRecord<Parameters<typeof generateFunctionToolDefinition>[0]> => {\n const modulePath = stripExtension(fileNamesByFunctionToolId[functionToolId]);\n const functionToolName =\n typeof functionToolData.name === 'string' && functionToolData.name.length > 0\n ? functionToolData.name\n : typeof functionData.name === 'string' && functionData.name.length > 0\n ? functionData.name\n : undefined;\n const functionToolDescription =\n typeof functionToolData.description === 'string'\n ? functionToolData.description\n : typeof functionData.description === 'string'\n ? functionData.description\n : undefined;\n\n return {\n id: functionToolId,\n filePath: resolveRecordFilePath(\n context,\n 'functionTools',\n functionToolId,\n join(context.paths.toolsDir, `${modulePath}.ts`)\n ),\n payload: {\n functionToolId,\n ...(functionToolName && { name: functionToolName }),\n ...(functionToolDescription !== undefined && {\n description: functionToolDescription,\n }),\n ...(functionData.inputSchema !== undefined && { inputSchema: functionData.inputSchema }),\n ...(functionData.schema !== undefined && { schema: functionData.schema }),\n ...(functionData.executeCode !== undefined && { executeCode: functionData.executeCode }),\n ...(functionData.dependencies !== undefined && {\n dependencies: functionData.dependencies,\n }),\n } as Parameters<typeof generateFunctionToolDefinition>[0],\n };\n }\n );\n}\n\nfunction collectFunctionToolEntries(project: FullProjectDefinition): FunctionToolEntry[] {\n const functionToolsById = collectFunctionToolsById(project);\n const functionsById = collectFunctionsById(project);\n const entries: FunctionToolEntry[] = [];\n\n for (const [functionToolId, functionToolData] of Object.entries(functionToolsById)) {\n const functionId =\n typeof functionToolData.functionId === 'string' && functionToolData.functionId.length > 0\n ? functionToolData.functionId\n : functionToolId;\n const functionData = functionsById[functionId] ?? {};\n const functionToolName =\n typeof functionToolData.name === 'string' && functionToolData.name.length > 0\n ? functionToolData.name\n : undefined;\n const functionName =\n typeof functionData.name === 'string' && functionData.name.length > 0\n ? functionData.name\n : undefined;\n const fallbackName = functionToolName ?? functionName ?? functionToolId;\n\n entries.push({\n functionToolId,\n functionId,\n functionToolData,\n functionData,\n exportName: fallbackName,\n fileName: fallbackName,\n });\n }\n\n return entries;\n}\n\nfunction collectFunctionToolsById(\n project: FullProjectDefinition\n): Record<string, Record<string, unknown>> {\n const functionToolsById: Record<string, Record<string, unknown>> = {};\n\n for (const [functionToolId, functionToolData] of Object.entries(project.functionTools ?? {})) {\n const functionToolRecord = asRecord(functionToolData);\n if (!functionToolRecord) {\n continue;\n }\n\n functionToolsById[functionToolId] = {\n ...functionToolRecord,\n };\n }\n\n for (const agentData of Object.values(project.agents ?? {})) {\n const agentRecord = asRecord(agentData);\n const agentFunctionTools = asRecord(agentRecord?.functionTools);\n if (!agentFunctionTools) {\n continue;\n }\n\n for (const [functionToolId, functionToolData] of Object.entries(agentFunctionTools)) {\n const functionToolRecord = asRecord(functionToolData);\n if (!functionToolRecord) {\n continue;\n }\n\n const existingFunctionTool = functionToolsById[functionToolId] ?? {};\n functionToolsById[functionToolId] = {\n ...functionToolRecord,\n ...existingFunctionTool,\n };\n }\n }\n\n return functionToolsById;\n}\n\nfunction collectFunctionsById(\n project: FullProjectDefinition\n): Record<string, Record<string, unknown>> {\n const functionsById: Record<string, Record<string, unknown>> = {};\n\n for (const [functionId, functionData] of Object.entries(project.functions ?? {})) {\n const functionRecord = asRecord(functionData);\n if (!functionRecord) {\n continue;\n }\n\n functionsById[functionId] = {\n ...functionRecord,\n };\n }\n\n for (const agentData of Object.values(project.agents ?? {})) {\n const agentRecord = asRecord(agentData);\n const agentFunctions = asRecord(agentRecord?.functions);\n if (!agentFunctions) {\n continue;\n }\n\n for (const [functionId, functionData] of Object.entries(agentFunctions)) {\n const functionRecord = asRecord(functionData);\n if (!functionRecord) {\n continue;\n }\n\n const existingFunction = functionsById[functionId] ?? {};\n functionsById[functionId] = {\n ...functionRecord,\n ...existingFunction,\n };\n }\n }\n\n return functionsById;\n}\n\nfunction collectToolRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateMcpToolDefinition>[0]>> {\n const toolEntries = Object.entries(context.project.tools ?? {});\n const fileNamesByToolId = buildSequentialNameFileNames(toolEntries);\n\n return toolEntries.map(([toolId, toolData]) => ({\n id: toolId,\n filePath: resolveRecordFilePath(\n context,\n 'tools',\n toolId,\n join(context.paths.toolsDir, fileNamesByToolId[toolId])\n ),\n payload: {\n mcpToolId: toolId,\n ...toolData,\n } as Parameters<typeof generateMcpToolDefinition>[0],\n }));\n}\n\nfunction collectExternalAgentRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateExternalAgentDefinition>[0]>> {\n const externalAgentEntries = Object.entries(context.project.externalAgents ?? {});\n const fileNamesByExternalAgentId = buildSequentialNameFileNames(\n externalAgentEntries.map(([externalAgentId, externalAgentData]) => [\n externalAgentId,\n { name: resolveExternalAgentNamingSeed(externalAgentId, externalAgentData) },\n ])\n );\n const referenceNamesByExternalAgentId = buildExternalAgentReferenceNamesById(context.project);\n\n return externalAgentEntries.map(([externalAgentId, externalAgentData]) => {\n const externalAgentRecord = asRecord(externalAgentData) ?? {};\n return {\n id: externalAgentId,\n filePath: resolveRecordFilePath(\n context,\n 'externalAgents',\n externalAgentId,\n join(context.paths.externalAgentsDir, fileNamesByExternalAgentId[externalAgentId])\n ),\n payload: {\n externalAgentId,\n externalAgentReferenceName: referenceNamesByExternalAgentId[externalAgentId],\n ...externalAgentRecord,\n } as Parameters<typeof generateExternalAgentDefinition>[0],\n };\n });\n}\n\nfunction collectContextConfigCredentialReferenceOverrides(\n context: GenerationContext,\n contextConfigData: Record<string, unknown>\n): Record<string, string> | undefined {\n const contextVariables = asRecord(contextConfigData.contextVariables);\n if (!contextVariables) {\n return;\n }\n\n const credentialReferenceNamesById = buildCredentialReferenceNamesById(context.project);\n const registry = context.existingComponentRegistry;\n const overrides: Record<string, string> = {};\n for (const contextVariable of Object.values(contextVariables)) {\n const contextVariableRecord = asRecord(contextVariable);\n const credentialReferenceId =\n contextVariableRecord && typeof contextVariableRecord.credentialReferenceId === 'string'\n ? contextVariableRecord.credentialReferenceId\n : undefined;\n if (!credentialReferenceId) {\n continue;\n }\n\n const credentialReferenceName = credentialReferenceNamesById[credentialReferenceId];\n if (credentialReferenceName) {\n overrides[credentialReferenceId] = credentialReferenceName;\n }\n\n const existingCredential = registry?.get(credentialReferenceId, 'credentials');\n if (existingCredential?.name) {\n overrides[credentialReferenceId] = existingCredential.name;\n }\n }\n\n return Object.keys(overrides).length ? overrides : undefined;\n}\n\nfunction collectContextConfigCredentialReferencePathOverrides(\n context: GenerationContext,\n contextConfigData: Record<string, unknown>\n): Record<string, string> | undefined {\n const contextVariables = asRecord(contextConfigData.contextVariables);\n if (!contextVariables) {\n return;\n }\n\n const credentialReferencePathById = buildCredentialReferencePathById(context.project);\n const registry = context.existingComponentRegistry;\n const overrides: Record<string, string> = {};\n for (const contextVariable of Object.values(contextVariables)) {\n const contextVariableRecord = asRecord(contextVariable);\n const credentialReferenceId =\n contextVariableRecord && typeof contextVariableRecord.credentialReferenceId === 'string'\n ? contextVariableRecord.credentialReferenceId\n : undefined;\n if (!credentialReferenceId) {\n continue;\n }\n\n const credentialReferencePath = credentialReferencePathById[credentialReferenceId];\n if (credentialReferencePath) {\n overrides[credentialReferenceId] = credentialReferencePath;\n }\n\n const existingCredential = registry?.get(credentialReferenceId, 'credentials');\n if (existingCredential?.filePath) {\n overrides[credentialReferenceId] = stripExtension(basename(existingCredential.filePath));\n }\n }\n\n return Object.keys(overrides).length ? overrides : undefined;\n}\n\nfunction collectContextConfigHeadersReferenceOverride(\n context: GenerationContext,\n contextConfigId: string,\n filePath: string\n): string | undefined {\n if (!context.existingComponentRegistry || !existsSync(filePath)) {\n return;\n }\n\n const sourceFile = createInMemoryProject().createSourceFile(\n 'existing-context-config.ts',\n readFileSync(filePath, 'utf8'),\n { overwrite: true }\n );\n\n for (const declaration of sourceFile.getVariableDeclarations()) {\n const initializer = declaration.getInitializer();\n if (!initializer || !Node.isCallExpression(initializer)) {\n continue;\n }\n\n const expression = initializer.getExpression();\n if (!Node.isIdentifier(expression) || expression.getText() !== 'contextConfig') {\n continue;\n }\n\n const [configArg] = initializer.getArguments();\n if (!configArg || !Node.isObjectLiteralExpression(configArg)) {\n continue;\n }\n\n const idProperty = configArg.getProperty('id');\n if (!idProperty || !Node.isPropertyAssignment(idProperty)) {\n continue;\n }\n const idInitializer = idProperty.getInitializer();\n if (!idInitializer || !Node.isStringLiteral(idInitializer)) {\n continue;\n }\n if (idInitializer.getLiteralValue() !== contextConfigId) {\n continue;\n }\n\n const headersProperty = configArg.getProperty('headers');\n if (!headersProperty) {\n return;\n }\n\n if (Node.isShorthandPropertyAssignment(headersProperty)) {\n return headersProperty.getName();\n }\n\n if (!Node.isPropertyAssignment(headersProperty)) {\n return;\n }\n\n const headersInitializer = headersProperty.getInitializer();\n if (!headersInitializer) {\n return;\n }\n\n if (Node.isIdentifier(headersInitializer)) {\n return headersInitializer.getText();\n }\n\n if (Node.isAsExpression(headersInitializer)) {\n const valueExpression = headersInitializer.getExpression();\n if (Node.isIdentifier(valueExpression)) {\n return valueExpression.getText();\n }\n }\n\n return;\n }\n\n return;\n}\n\nfunction collectTriggerRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateTriggerDefinition>[0]>> {\n if (!context.project.agents) {\n return [];\n }\n\n const credentialReferenceNamesById = buildCredentialReferenceNamesById(context.project);\n const credentialReferencePathsById = buildCredentialReferencePathById(context.project);\n const records: Array<GenerationRecord<Parameters<typeof generateTriggerDefinition>[0]>> = [];\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n if (!agentData?.triggers) {\n continue;\n }\n\n const triggerEntries = Object.entries(agentData.triggers);\n const fileNamesByTriggerId = buildSequentialNameFileNames(triggerEntries);\n\n for (const [triggerId, triggerData] of triggerEntries) {\n const triggerRecord = asRecord(triggerData);\n const signingSecretCredentialReferenceId =\n typeof triggerRecord?.signingSecretCredentialReferenceId === 'string'\n ? triggerRecord.signingSecretCredentialReferenceId\n : undefined;\n let signingSecretCredentialReferenceName = signingSecretCredentialReferenceId\n ? credentialReferenceNamesById[signingSecretCredentialReferenceId]\n : undefined;\n let signingSecretCredentialReferencePath = signingSecretCredentialReferenceId\n ? credentialReferencePathsById[signingSecretCredentialReferenceId]\n : undefined;\n\n if (signingSecretCredentialReferenceId && context.existingComponentRegistry) {\n const existingCredential = context.existingComponentRegistry.get(\n signingSecretCredentialReferenceId,\n 'credentials'\n );\n if (existingCredential?.name) {\n signingSecretCredentialReferenceName = existingCredential.name;\n }\n if (existingCredential?.filePath) {\n signingSecretCredentialReferencePath = stripExtension(\n basename(existingCredential.filePath)\n );\n }\n }\n\n records.push({\n id: triggerId,\n filePath: resolveRecordFilePath(\n context,\n 'triggers',\n triggerId,\n join(context.paths.agentsDir, 'triggers', fileNamesByTriggerId[triggerId])\n ),\n payload: {\n triggerId,\n ...triggerData,\n ...(signingSecretCredentialReferenceName && {\n signingSecretCredentialReferenceName,\n }),\n ...(signingSecretCredentialReferencePath && {\n signingSecretCredentialReferencePath,\n }),\n } as Parameters<typeof generateTriggerDefinition>[0],\n });\n }\n }\n\n return records;\n}\n\nfunction collectScheduledTriggerRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateScheduledTriggerDefinition>[0]>> {\n if (!context.project.agents) {\n return [];\n }\n\n const records: Array<GenerationRecord<Parameters<typeof generateScheduledTriggerDefinition>[0]>> =\n [];\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n if (!agentData?.scheduledTriggers) {\n continue;\n }\n\n const scheduledTriggerEntries = Object.entries(agentData.scheduledTriggers);\n const fileNamesByScheduledTriggerId = buildSequentialNameFileNames(scheduledTriggerEntries);\n\n for (const [scheduledTriggerId, scheduledTriggerData] of Object.entries(\n agentData.scheduledTriggers\n )) {\n records.push({\n id: scheduledTriggerId,\n filePath: resolveRecordFilePath(\n context,\n 'scheduledTriggers',\n scheduledTriggerId,\n join(\n context.paths.agentsDir,\n 'scheduled-triggers',\n fileNamesByScheduledTriggerId[scheduledTriggerId]\n )\n ),\n payload: {\n scheduledTriggerId,\n ...scheduledTriggerData,\n } as Parameters<typeof generateScheduledTriggerDefinition>[0],\n });\n }\n }\n\n return records;\n}\n\nfunction collectAgentRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateAgentDefinition>[0]>> {\n if (!context.project.agents) {\n return [];\n }\n\n const records: Array<GenerationRecord<Parameters<typeof generateAgentDefinition>[0]>> = [];\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n if (!agentData) {\n continue;\n }\n\n const agentName = typeof agentData.name === 'string' ? agentData.name : undefined;\n const agentFilePath = resolveRecordFilePath(\n context,\n 'agents',\n agentId,\n join(context.paths.agentsDir, buildComponentFileName(agentId, agentName))\n );\n const existingAgent = context.existingComponentRegistry?.get(agentId, 'agents');\n const subAgentReferences = collectSubAgentReferenceOverrides(context, agentData, agentFilePath);\n const subAgentReferencePathOverrides = collectSubAgentReferencePathOverrides(\n context,\n agentData\n );\n const statusUpdates = asRecord(agentData.statusUpdates);\n const contextTemplateReferences = collectContextTemplateReferences(\n context,\n agentData,\n agentFilePath,\n [\n typeof agentData.prompt === 'string' ? agentData.prompt : undefined,\n typeof statusUpdates?.prompt === 'string' ? statusUpdates.prompt : undefined,\n ]\n );\n\n records.push({\n id: agentId,\n filePath: agentFilePath,\n payload: {\n agentId,\n ...agentData,\n ...(existingAgent?.name?.length && { agentVariableName: existingAgent.name }),\n ...(Object.keys(subAgentReferences).length && { subAgentReferences }),\n ...(Object.keys(subAgentReferencePathOverrides).length && {\n subAgentReferencePathOverrides,\n }),\n ...(contextTemplateReferences && {\n contextConfigReference: contextTemplateReferences.contextConfigReference,\n }),\n ...(contextTemplateReferences?.contextConfigHeadersReference && {\n contextConfigHeadersReference: contextTemplateReferences.contextConfigHeadersReference,\n }),\n } as Parameters<typeof generateAgentDefinition>[0],\n });\n }\n return records;\n}\n\nfunction collectSubAgentReferencePathOverrides(\n context: GenerationContext,\n agentData: Record<string, unknown>\n): Record<string, string> {\n const generatedSubAgentReferencePathById = buildSubAgentReferencePathById(\n context.project,\n context.completeAgentIds\n );\n const subAgentIds = new Set<string>(extractReferenceIds(agentData.subAgents));\n if (typeof agentData.defaultSubAgentId === 'string' && agentData.defaultSubAgentId.length > 0) {\n subAgentIds.add(agentData.defaultSubAgentId);\n }\n\n if (!subAgentIds.size) {\n return {};\n }\n\n const subAgents = asRecord(agentData.subAgents);\n const overrides: Record<string, string> = {};\n\n for (const subAgentId of subAgentIds) {\n const fallbackReferencePath = generatedSubAgentReferencePathById[subAgentId];\n const subAgentData = asRecord(subAgents?.[subAgentId]);\n const subAgentName = typeof subAgentData?.name === 'string' ? subAgentData.name : undefined;\n const subAgentFilePath = resolveRecordFilePath(\n context,\n 'subAgents',\n subAgentId,\n join(\n context.paths.agentsDir,\n 'sub-agents',\n fallbackReferencePath\n ? `${fallbackReferencePath}.ts`\n : buildComponentFileName(subAgentId, subAgentName)\n )\n );\n overrides[subAgentId] = stripExtension(basename(subAgentFilePath));\n }\n\n return overrides;\n}\n\nfunction collectSubAgentRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateSubAgentDefinition>[0]>> {\n if (!context.project.agents) {\n return [];\n }\n\n const recordsBySubAgentId = new Map<\n string,\n GenerationRecord<Parameters<typeof generateSubAgentDefinition>[0]>\n >();\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n const subAgents = asRecord(agentData?.subAgents);\n if (!subAgents) {\n continue;\n }\n\n for (const [subAgentId, subAgentData] of Object.entries(subAgents)) {\n const payload = asRecord(subAgentData);\n if (!payload) {\n continue;\n }\n\n const dependencyReferences = collectSubAgentDependencyReferenceOverrides(context, payload);\n const subAgentName = typeof payload.name === 'string' ? payload.name : undefined;\n const subAgentFilePath = resolveRecordFilePath(\n context,\n 'subAgents',\n subAgentId,\n join(\n context.paths.agentsDir,\n 'sub-agents',\n buildComponentFileName(subAgentId, subAgentName)\n )\n );\n const contextTemplateReferences = collectContextTemplateReferences(\n context,\n agentData,\n subAgentFilePath,\n [typeof payload.prompt === 'string' ? payload.prompt : undefined]\n );\n\n recordsBySubAgentId.set(subAgentId, {\n id: subAgentId,\n filePath: subAgentFilePath, // @ts-expect-error -- fixme\n payload: {\n subAgentId,\n ...payload,\n ...(dependencyReferences?.referenceOverrides && {\n referenceOverrides: dependencyReferences.referenceOverrides,\n }),\n ...(dependencyReferences?.referencePathOverrides && {\n referencePathOverrides: dependencyReferences.referencePathOverrides,\n }),\n ...(contextTemplateReferences && {\n contextConfigId: contextTemplateReferences.contextConfigId,\n contextConfigReference: contextTemplateReferences.contextConfigReference,\n }),\n ...(contextTemplateReferences?.contextConfigHeadersReference && {\n contextConfigHeadersReference: contextTemplateReferences.contextConfigHeadersReference,\n }),\n } as Parameters<typeof generateSubAgentDefinition>[0],\n });\n }\n }\n\n return [...recordsBySubAgentId.values()];\n}\n\nfunction collectStatusComponentRecords(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateStatusComponentDefinition>[0]>> {\n if (!context.project.agents) {\n return [];\n }\n\n const statusComponentRecordsById = new Map<\n string,\n GenerationRecord<Parameters<typeof generateStatusComponentDefinition>[0]>\n >();\n\n for (const agentId of context.completeAgentIds) {\n const agentData = context.project.agents[agentId];\n const statusUpdates = asRecord(agentData?.statusUpdates);\n const statusComponents = Array.isArray(statusUpdates?.statusComponents)\n ? statusUpdates.statusComponents\n : [];\n\n for (const statusComponentData of statusComponents) {\n const payload = asRecord(statusComponentData);\n if (!payload) {\n continue;\n }\n\n const statusComponentId = resolveStatusComponentId(payload);\n if (!statusComponentId || statusComponentRecordsById.has(statusComponentId)) {\n continue;\n }\n\n const statusComponentName = typeof payload.name === 'string' ? payload.name : undefined;\n statusComponentRecordsById.set(statusComponentId, {\n id: statusComponentId,\n filePath: resolveRecordFilePath(\n context,\n 'statusComponents',\n statusComponentId,\n join(\n context.paths.statusComponentsDir,\n buildComponentFileName(statusComponentId, statusComponentName)\n )\n ),\n payload: {\n statusComponentId,\n ...payload,\n } as Parameters<typeof generateStatusComponentDefinition>[0],\n });\n }\n }\n\n return [...statusComponentRecordsById.values()];\n}\n\nfunction collectProjectRecord(\n context: GenerationContext\n): Array<GenerationRecord<Parameters<typeof generateProjectDefinition>[0]>> {\n const referenceOverrides = collectProjectReferenceOverrides(context);\n const referencePathOverrides = collectProjectReferencePathOverrides(context);\n\n return [\n {\n id: context.project.id,\n filePath: resolveRecordFilePath(\n context,\n 'project',\n context.project.id,\n join(context.paths.projectRoot, 'index.ts')\n ),\n payload: {\n projectId: context.project.id,\n name: context.project.name,\n description: context.project.description,\n models: context.project.models,\n stopWhen: context.project.stopWhen,\n skills: getObjectKeys(context.project.skills),\n agents: [...context.completeAgentIds],\n tools: getObjectKeys(context.project.tools),\n externalAgents: getObjectKeys(context.project.externalAgents),\n dataComponents: getObjectKeys(context.project.dataComponents),\n artifactComponents: getObjectKeys(context.project.artifactComponents),\n credentialReferences: getObjectKeys(context.project.credentialReferences),\n ...(referenceOverrides && { referenceOverrides }),\n ...(referencePathOverrides && { referencePathOverrides }),\n } as Parameters<typeof generateProjectDefinition>[0],\n },\n ];\n}\n\nfunction validateProject(project: FullProjectDefinition): void {\n if (!project || typeof project !== 'object') {\n throw new Error('Project data is required');\n }\n if (!project.id) {\n throw new Error('Project id is required');\n }\n if (!project.name) {\n throw new Error('Project name is required');\n }\n}\n\nfunction collectCompleteAgentIds(\n project: FullProjectDefinition,\n skippedAgents: SkippedAgent[]\n): Set<string> {\n const completeAgentIds = new Set<string>();\n for (const [agentId, agentData] of Object.entries(project.agents ?? {})) {\n const completeness = isAgentComplete(agentData);\n if (!completeness.complete) {\n skippedAgents.push({ id: agentId, reason: completeness.reason ?? 'incomplete' });\n continue;\n }\n completeAgentIds.add(agentId);\n }\n return completeAgentIds;\n}\n\nfunction isAgentComplete(\n agentData: unknown\n): { complete: true } | { complete: false; reason: string } {\n const data = asRecord(agentData);\n if (!data) {\n return { complete: false, reason: 'invalid agent object' };\n }\n if (!data.name || typeof data.name !== 'string') {\n return { complete: false, reason: 'missing name' };\n }\n if (!data.defaultSubAgentId || typeof data.defaultSubAgentId !== 'string') {\n return { complete: false, reason: 'missing defaultSubAgentId' };\n }\n if (\n !asRecord(data.subAgents) ||\n // @ts-expect-error -- fixme\n !Object.keys(data.subAgents).length\n ) {\n return { complete: false, reason: 'no sub-agents defined' };\n }\n return { complete: true };\n}\n\nfunction collectEnvironmentCredentialReferenceIds(project: FullProjectDefinition): string[] {\n const credentialReferenceIds = new Set<string>();\n\n for (const toolData of Object.values(project.tools ?? {})) {\n const toolRecord = asRecord(toolData);\n const credentialReferenceId =\n toolRecord && typeof toolRecord.credentialReferenceId === 'string'\n ? toolRecord.credentialReferenceId\n : undefined;\n const hasInlineCredential =\n toolRecord?.credential !== undefined && toolRecord?.credential !== null;\n\n if (credentialReferenceId && !hasInlineCredential) {\n credentialReferenceIds.add(credentialReferenceId);\n }\n }\n\n return [...credentialReferenceIds];\n}\n\nfunction getObjectKeys(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) {\n return [];\n }\n return Object.keys(record);\n}\n\nfunction resolveStatusComponentId(\n statusComponentData: Record<string, unknown>\n): string | undefined {\n if (typeof statusComponentData.id === 'string') {\n return statusComponentData.id;\n }\n if (typeof statusComponentData.type === 'string') {\n return statusComponentData.type;\n }\n if (typeof statusComponentData.name === 'string') {\n return statusComponentData.name;\n }\n return undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return;\n }\n return value as Record<string, unknown>;\n}\n\nfunction collectSubAgentReferenceOverrides(\n context: GenerationContext,\n agentData: Record<string, unknown>,\n agentFilePath: string\n): Record<string, { name: string; local?: boolean }> {\n const generatedSubAgentReferenceNamesById = buildSubAgentReferenceNamesById(\n context.project,\n context.completeAgentIds\n );\n const subAgentIds = new Set<string>(extractReferenceIds(agentData.subAgents));\n if (typeof agentData.defaultSubAgentId === 'string' && agentData.defaultSubAgentId.length > 0) {\n subAgentIds.add(agentData.defaultSubAgentId);\n }\n\n if (!subAgentIds.size) {\n return {};\n }\n\n const subAgents = asRecord(agentData.subAgents);\n const overrides: Record<string, { name: string; local?: boolean }> = {};\n for (const subAgentId of subAgentIds) {\n const subAgentData = asRecord(subAgents?.[subAgentId]);\n const subAgentName = typeof subAgentData?.name === 'string' ? subAgentData.name : undefined;\n overrides[subAgentId] = {\n name:\n generatedSubAgentReferenceNamesById[subAgentId] ??\n resolveSubAgentVariableName(subAgentId, subAgentName),\n };\n\n const existingSubAgent = context.existingComponentRegistry?.get(subAgentId, 'subAgents');\n if (!existingSubAgent?.name) {\n continue;\n }\n\n const existingSubAgentFilePath = resolveProjectFilePath(\n context.paths.projectRoot,\n existingSubAgent.filePath\n );\n const isLocal =\n normalizeFilePath(existingSubAgentFilePath) === normalizeFilePath(agentFilePath);\n overrides[subAgentId] = isLocal\n ? { name: existingSubAgent.name, local: true }\n : { name: existingSubAgent.name };\n }\n\n return overrides;\n}\n\nfunction collectAgentContextConfigReferenceOverride(\n context: GenerationContext,\n agentData: Record<string, unknown>,\n agentFilePath: string\n): { name: string; local?: boolean } | undefined {\n const contextConfig = extractContextConfigData(agentData);\n const contextConfigId = contextConfig?.id;\n if (!contextConfigId) {\n return;\n }\n\n const existingContextConfig = context.existingComponentRegistry?.get(\n contextConfigId,\n 'contextConfigs'\n );\n if (!existingContextConfig?.name) {\n return;\n }\n\n const existingContextConfigFilePath = resolveProjectFilePath(\n context.paths.projectRoot,\n existingContextConfig.filePath\n );\n const isLocal =\n normalizeFilePath(existingContextConfigFilePath) === normalizeFilePath(agentFilePath);\n return isLocal\n ? { name: existingContextConfig.name, local: true }\n : { name: existingContextConfig.name };\n}\n\nfunction collectContextTemplateReferences(\n context: GenerationContext,\n agentData: Record<string, unknown>,\n targetFilePath: string,\n promptValues: Array<string | undefined>\n): ContextTemplateReferences | undefined {\n const contextConfig = extractContextConfigData(agentData);\n const contextConfigId = contextConfig?.id;\n if (!contextConfigId) {\n return;\n }\n\n const contextConfigFilePath = resolveRecordFilePath(\n context,\n 'contextConfigs',\n contextConfigId,\n join(context.paths.contextConfigsDir, `${contextConfigId}.ts`)\n );\n const isLocal = normalizeFilePath(contextConfigFilePath) === normalizeFilePath(targetFilePath);\n\n const contextConfigReference =\n collectAgentContextConfigReferenceOverride(context, agentData, targetFilePath) ??\n (isLocal\n ? { name: toCamelCase(contextConfigId), local: true }\n : { name: toCamelCase(contextConfigId) });\n\n const templateVariables = collectTemplateVariablesFromValues(promptValues);\n const hasHeadersTemplateVariables = templateVariables.some((variableName) =>\n variableName.startsWith('headers.')\n );\n let headersReferenceName =\n collectContextConfigHeadersReferenceOverride(context, contextConfigId, contextConfigFilePath) ??\n inferHeadersReferenceFromContextConfig(contextConfig, contextConfigId);\n\n if (!headersReferenceName && hasHeadersTemplateVariables) {\n headersReferenceName = `${toCamelCase(contextConfigId)}Headers`;\n }\n\n return {\n contextConfigId,\n contextConfigReference,\n ...(headersReferenceName && {\n contextConfigHeadersReference: isLocal\n ? { name: headersReferenceName, local: true }\n : { name: headersReferenceName },\n }),\n };\n}\n\nfunction extractContextConfigData(\n agentData: Record<string, unknown>\n): { id: string; value: Record<string, unknown> } | undefined {\n const contextConfig =\n typeof agentData.contextConfig === 'string'\n ? { id: agentData.contextConfig }\n : asRecord(agentData.contextConfig);\n const contextConfigId =\n contextConfig && typeof contextConfig.id === 'string' ? contextConfig.id : undefined;\n if (!contextConfigId || !contextConfig) {\n return;\n }\n\n return {\n id: contextConfigId,\n value: contextConfig,\n };\n}\n\nfunction inferHeadersReferenceFromContextConfig(\n contextConfig: { id: string; value: Record<string, unknown> },\n contextConfigId: string\n): string | undefined {\n const headers = contextConfig.value.headers;\n if (typeof headers === 'string' && headers.length > 0) {\n return toCamelCase(headers);\n }\n\n const headersRecord = asRecord(headers);\n if (headersRecord) {\n if (typeof headersRecord.id === 'string' && headersRecord.id) {\n return toCamelCase(headersRecord.id);\n }\n if (typeof headersRecord.name === 'string' && headersRecord.name) {\n return toCamelCase(headersRecord.name);\n }\n }\n\n if (isPlainObject(contextConfig.value.headersSchema)) {\n return `${toCamelCase(contextConfigId)}Headers`;\n }\n\n return;\n}\n\nfunction collectTemplateVariablesFromValues(values: Array<string | undefined>): 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\nfunction collectHeaderTemplateVariablesFromAgentPrompts(\n agentData: Record<string, unknown>\n): Set<string> {\n const variables = new Set<string>();\n addHeaderTemplateVariablesFromString(\n typeof agentData.prompt === 'string' ? agentData.prompt : undefined,\n variables\n );\n\n const statusUpdates = asRecord(agentData.statusUpdates);\n addHeaderTemplateVariablesFromString(\n typeof statusUpdates?.prompt === 'string' ? statusUpdates.prompt : undefined,\n variables\n );\n\n const subAgents = asRecord(agentData.subAgents);\n if (!subAgents) {\n return variables;\n }\n\n for (const subAgentData of Object.values(subAgents)) {\n const subAgent = asRecord(subAgentData);\n addHeaderTemplateVariablesFromString(\n typeof subAgent?.prompt === 'string' ? subAgent.prompt : undefined,\n variables\n );\n }\n\n return variables;\n}\n\nfunction addHeaderTemplateVariablesFromString(\n value: string | undefined,\n variables: Set<string>\n): void {\n if (typeof value !== 'string') {\n return;\n }\n\n for (const variableName of collectTemplateVariableNames(value)) {\n if (!variableName.startsWith('headers.')) {\n continue;\n }\n const headerPath = variableName.slice('headers.'.length);\n if (headerPath) {\n variables.add(headerPath);\n }\n }\n}\n\nfunction applyPromptHeaderTemplateSchema(\n contextConfig: Record<string, unknown>,\n headerTemplateVariables: Set<string>\n): Record<string, unknown> {\n if (!headerTemplateVariables.size) {\n return contextConfig;\n }\n\n const hasExplicitHeadersReference =\n typeof contextConfig.headers === 'string' || isPlainObject(contextConfig.headers);\n if (hasExplicitHeadersReference || isPlainObject(contextConfig.headersSchema)) {\n return contextConfig;\n }\n\n const variableNames = [...headerTemplateVariables].sort();\n const properties = Object.fromEntries(\n variableNames.map((variableName) => [variableName, { type: 'string' }])\n );\n\n return {\n ...contextConfig,\n headersSchema: {\n type: 'object',\n properties,\n required: variableNames,\n additionalProperties: false,\n },\n };\n}\n\nfunction collectSubAgentDependencyReferenceOverrides(\n context: GenerationContext,\n subAgentData: Record<string, unknown>\n): SubAgentDependencyReferences | undefined {\n const registry = context.existingComponentRegistry;\n const referenceOverrides: SubAgentReferenceOverrides = {};\n const referencePathOverrides: SubAgentReferencePathOverrides = {};\n const toolReferenceNamesById = buildToolReferenceNamesById(context.project);\n const toolReferencePathsById = buildToolReferencePathById(context.project);\n const subAgentReferenceNamesById = buildSubAgentReferenceNamesById(\n context.project,\n context.completeAgentIds\n );\n const subAgentReferencePathsById = buildSubAgentReferencePathById(\n context.project,\n context.completeAgentIds\n );\n const agentReferenceNamesById = buildAgentReferenceNamesById(context.project);\n const agentReferencePathsById = buildAgentReferencePathById(context.project);\n const externalAgentReferenceNamesById = buildExternalAgentReferenceNamesById(context.project);\n const externalAgentReferencePathsById = buildExternalAgentReferencePathById(context.project);\n\n const assignSubAgentReferenceOverrides = (subAgentId: string): void => {\n const subAgentReferenceName = subAgentReferenceNamesById[subAgentId];\n if (subAgentReferenceName) {\n assignReferenceOverride(referenceOverrides, 'subAgents', subAgentId, subAgentReferenceName);\n }\n\n const subAgentReferencePath = subAgentReferencePathsById[subAgentId];\n if (subAgentReferencePath) {\n assignReferencePathOverride(\n referencePathOverrides,\n 'subAgents',\n subAgentId,\n subAgentReferencePath\n );\n }\n };\n\n const assignAgentReferenceOverrides = (agentId: string): void => {\n const agentReferenceName = agentReferenceNamesById[agentId];\n if (agentReferenceName) {\n assignReferenceOverride(referenceOverrides, 'agents', agentId, agentReferenceName);\n }\n\n const agentReferencePath = agentReferencePathsById[agentId];\n if (agentReferencePath) {\n assignReferencePathOverride(referencePathOverrides, 'agents', agentId, agentReferencePath);\n }\n };\n\n const assignExternalAgentReferenceOverrides = (externalAgentId: string): void => {\n const externalAgentReferenceName = externalAgentReferenceNamesById[externalAgentId];\n if (externalAgentReferenceName) {\n assignReferenceOverride(\n referenceOverrides,\n 'externalAgents',\n externalAgentId,\n externalAgentReferenceName\n );\n }\n\n const externalAgentReferencePath = externalAgentReferencePathsById[externalAgentId];\n if (externalAgentReferencePath) {\n assignReferencePathOverride(\n referencePathOverrides,\n 'externalAgents',\n externalAgentId,\n externalAgentReferencePath\n );\n }\n };\n\n const canUse = Array.isArray(subAgentData.canUse) ? subAgentData.canUse : [];\n for (const item of canUse) {\n const canUseRecord = asRecord(item);\n const toolId =\n typeof item === 'string'\n ? item\n : canUseRecord && typeof canUseRecord.toolId === 'string'\n ? canUseRecord.toolId\n : undefined;\n if (!toolId) {\n continue;\n }\n\n assignReferenceOverride(\n referenceOverrides,\n 'tools',\n toolId,\n toolReferenceNamesById[toolId] ?? toToolReferenceName(toolId)\n );\n assignReferencePathOverride(\n referencePathOverrides,\n 'tools',\n toolId,\n toolReferencePathsById[toolId] ?? toKebabCase(toolId)\n );\n\n if (registry) {\n assignComponentReferenceOverride(registry, referenceOverrides, 'tools', toolId, 'tools');\n assignComponentReferenceOverride(\n registry,\n referenceOverrides,\n 'tools',\n toolId,\n 'functionTools'\n );\n const toolComponent = registry.get(toolId, 'functionTools') ?? registry.get(toolId, 'tools');\n if (toolComponent?.filePath) {\n assignReferencePathOverride(\n referencePathOverrides,\n 'tools',\n toolId,\n resolveToolModulePath(toolComponent.filePath)\n );\n }\n }\n }\n\n const canDelegateTo = Array.isArray(subAgentData.canDelegateTo) ? subAgentData.canDelegateTo : [];\n for (const item of canDelegateTo) {\n if (typeof item === 'string') {\n assignSubAgentReferenceOverrides(item);\n assignAgentReferenceOverrides(item);\n assignExternalAgentReferenceOverrides(item);\n continue;\n }\n\n const canDelegateRecord = asRecord(item);\n if (typeof canDelegateRecord?.subAgentId === 'string') {\n assignSubAgentReferenceOverrides(canDelegateRecord.subAgentId);\n }\n if (typeof canDelegateRecord?.agentId === 'string') {\n assignAgentReferenceOverrides(canDelegateRecord.agentId);\n }\n if (typeof canDelegateRecord?.externalAgentId === 'string') {\n assignExternalAgentReferenceOverrides(canDelegateRecord.externalAgentId);\n }\n }\n\n const canTransferTo = extractReferenceIds(subAgentData.canTransferTo);\n for (const transferTargetId of canTransferTo) {\n assignSubAgentReferenceOverrides(transferTargetId);\n assignAgentReferenceOverrides(transferTargetId);\n assignExternalAgentReferenceOverrides(transferTargetId);\n }\n\n if (registry) {\n for (const item of canDelegateTo) {\n if (typeof item === 'string') {\n assignFirstMatchingComponentReferenceOverride(registry, referenceOverrides, item, [\n ['subAgents', 'subAgents'],\n ['agents', 'agents'],\n ['externalAgents', 'externalAgents'],\n ]);\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'subAgents',\n item,\n 'subAgents'\n );\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'agents',\n item,\n 'agents'\n );\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'externalAgents',\n item,\n 'externalAgents'\n );\n continue;\n }\n\n const canDelegateRecord = asRecord(item);\n if (!canDelegateRecord) {\n continue;\n }\n\n if (typeof canDelegateRecord.subAgentId === 'string') {\n assignComponentReferenceOverride(\n registry,\n referenceOverrides,\n 'subAgents',\n canDelegateRecord.subAgentId,\n 'subAgents'\n );\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'subAgents',\n canDelegateRecord.subAgentId,\n 'subAgents'\n );\n continue;\n }\n if (typeof canDelegateRecord.agentId === 'string') {\n assignComponentReferenceOverride(\n registry,\n referenceOverrides,\n 'agents',\n canDelegateRecord.agentId,\n 'agents'\n );\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'agents',\n canDelegateRecord.agentId,\n 'agents'\n );\n continue;\n }\n if (typeof canDelegateRecord.externalAgentId === 'string') {\n assignComponentReferenceOverride(\n registry,\n referenceOverrides,\n 'externalAgents',\n canDelegateRecord.externalAgentId,\n 'externalAgents'\n );\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'externalAgents',\n canDelegateRecord.externalAgentId,\n 'externalAgents'\n );\n }\n }\n\n for (const transferTargetId of canTransferTo) {\n assignFirstMatchingComponentReferenceOverride(\n registry,\n referenceOverrides,\n transferTargetId,\n [\n ['subAgents', 'subAgents'],\n ['agents', 'agents'],\n ['externalAgents', 'externalAgents'],\n ]\n );\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'subAgents',\n transferTargetId,\n 'subAgents'\n );\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'agents',\n transferTargetId,\n 'agents'\n );\n assignComponentReferencePathOverride(\n registry,\n referencePathOverrides,\n 'externalAgents',\n transferTargetId,\n 'externalAgents'\n );\n }\n\n const dataComponentIds = extractReferenceIds(subAgentData.dataComponents);\n for (const dataComponentId of dataComponentIds) {\n assignComponentReferenceOverride(\n registry,\n referenceOverrides,\n 'dataComponents',\n dataComponentId,\n 'dataComponents'\n );\n }\n\n const artifactComponentIds = extractReferenceIds(subAgentData.artifactComponents);\n for (const artifactComponentId of artifactComponentIds) {\n assignComponentReferenceOverride(\n registry,\n referenceOverrides,\n 'artifactComponents',\n artifactComponentId,\n 'artifactComponents'\n );\n }\n }\n\n return Object.keys(referenceOverrides).length > 0 ||\n Object.keys(referencePathOverrides).length > 0\n ? {\n ...(Object.keys(referenceOverrides).length > 0 && { referenceOverrides }),\n ...(Object.keys(referencePathOverrides).length > 0 && { referencePathOverrides }),\n }\n : undefined;\n}\n\nfunction assignFirstMatchingComponentReferenceOverride(\n registry: ComponentRegistry,\n overrides: SubAgentReferenceOverrides,\n componentId: string,\n candidates: Array<[SubAgentReferenceOverrideType, ComponentType]>\n): void {\n for (const [overrideType, componentType] of candidates) {\n const component = registry.get(componentId, componentType);\n if (!component?.name) {\n continue;\n }\n\n assignReferenceOverride(overrides, overrideType, componentId, component.name);\n return;\n }\n}\n\nfunction assignComponentReferenceOverride(\n registry: ComponentRegistry,\n overrides: SubAgentReferenceOverrides,\n overrideType: SubAgentReferenceOverrideType,\n componentId: string,\n componentType: ComponentType\n): void {\n const component = registry.get(componentId, componentType);\n if (!component?.name) {\n return;\n }\n\n assignReferenceOverride(overrides, overrideType, componentId, component.name);\n}\n\nfunction assignComponentReferencePathOverride(\n registry: ComponentRegistry,\n overrides: SubAgentReferencePathOverrides,\n overrideType: 'tools' | 'subAgents' | 'agents' | 'externalAgents',\n componentId: string,\n componentType: ComponentType\n): void {\n const component = registry.get(componentId, componentType);\n if (!component?.filePath) {\n return;\n }\n\n const referencePath =\n componentType === 'tools' || componentType === 'functionTools'\n ? resolveToolModulePath(component.filePath)\n : stripExtension(basename(component.filePath));\n assignReferencePathOverride(overrides, overrideType, componentId, referencePath);\n}\n\nfunction assignReferenceOverride(\n overrides: SubAgentReferenceOverrides,\n overrideType: SubAgentReferenceOverrideType,\n componentId: string,\n referenceName: string\n): void {\n const overrideMap = overrides[overrideType] ?? {};\n overrideMap[componentId] = referenceName;\n overrides[overrideType] = overrideMap;\n}\n\nfunction assignReferencePathOverride(\n overrides: SubAgentReferencePathOverrides,\n overrideType: 'tools' | 'subAgents' | 'agents' | 'externalAgents',\n componentId: string,\n referencePath: string\n): void {\n const overrideMap = overrides[overrideType] ?? {};\n overrideMap[componentId] = referencePath;\n overrides[overrideType] = overrideMap;\n}\n\nfunction buildToolReferenceNamesById(project: FullProjectDefinition): Record<string, string> {\n const toolReferenceNamesById: Record<string, string> = {};\n\n for (const [toolId, toolData] of Object.entries(project.tools ?? {})) {\n const toolName = asRecord(toolData)?.name;\n const referenceName =\n typeof toolName === 'string' && toolName.length > 0\n ? toToolReferenceName(toolName)\n : toToolReferenceName(toolId);\n toolReferenceNamesById[toolId] = referenceName;\n }\n\n for (const functionToolEntry of collectFunctionToolEntries(project)) {\n toolReferenceNamesById[functionToolEntry.functionToolId] = toToolReferenceName(\n functionToolEntry.exportName\n );\n }\n\n return toolReferenceNamesById;\n}\n\nfunction buildToolReferencePathById(project: FullProjectDefinition): Record<string, string> {\n const toolEntries = Object.entries(project.tools ?? {});\n const toolFileNamesById = buildSequentialNameFileNames(toolEntries);\n const toolReferencePathById: Record<string, string> = {};\n\n for (const [toolId] of toolEntries) {\n toolReferencePathById[toolId] = stripExtension(toolFileNamesById[toolId]);\n }\n\n const functionToolEntries = collectFunctionToolEntries(project);\n const functionToolFileNamesById = buildSequentialNameFileNames(\n functionToolEntries.map(({ functionToolId, fileName }) => [functionToolId, { name: fileName }])\n );\n for (const { functionToolId } of functionToolEntries) {\n toolReferencePathById[functionToolId] = stripExtension(\n functionToolFileNamesById[functionToolId]\n );\n }\n\n return toolReferencePathById;\n}\n\nfunction buildCredentialReferenceNamesById(project: FullProjectDefinition): Record<string, string> {\n const credentialReferenceNamesById: Record<string, string> = {};\n const countsByReferenceName = new Map<string, number>();\n\n for (const [credentialId, credentialData] of Object.entries(project.credentialReferences ?? {})) {\n const credentialName = asRecord(credentialData)?.name;\n const baseReferenceName =\n typeof credentialName === 'string' && credentialName.length > 0\n ? toCredentialReferenceName(credentialName)\n : toCredentialReferenceName(credentialId);\n const occurrence = countsByReferenceName.get(baseReferenceName) ?? 0;\n countsByReferenceName.set(baseReferenceName, occurrence + 1);\n credentialReferenceNamesById[credentialId] =\n occurrence === 0 ? baseReferenceName : `${baseReferenceName}${occurrence}`;\n }\n\n return credentialReferenceNamesById;\n}\n\nfunction buildCredentialReferencePathById(project: FullProjectDefinition): Record<string, string> {\n const credentialEntries = Object.entries(project.credentialReferences ?? {});\n const credentialFileNamesById = buildSequentialNameFileNames(credentialEntries);\n const credentialReferencePathById: Record<string, string> = {};\n\n for (const [credentialId] of credentialEntries) {\n credentialReferencePathById[credentialId] = stripExtension(\n credentialFileNamesById[credentialId]\n );\n }\n\n return credentialReferencePathById;\n}\n\nfunction buildExternalAgentReferenceNamesById(\n project: FullProjectDefinition\n): Record<string, string> {\n const externalAgentReferenceNamesById: Record<string, string> = {};\n const countsByReferenceName = new Map<string, number>();\n\n for (const [externalAgentId, externalAgentData] of Object.entries(project.externalAgents ?? {})) {\n const baseReferenceName = toExternalAgentReferenceName(\n resolveExternalAgentNamingSeed(externalAgentId, externalAgentData)\n );\n const occurrence = countsByReferenceName.get(baseReferenceName) ?? 0;\n countsByReferenceName.set(baseReferenceName, occurrence + 1);\n externalAgentReferenceNamesById[externalAgentId] =\n occurrence === 0 ? baseReferenceName : `${baseReferenceName}${occurrence}`;\n }\n\n return externalAgentReferenceNamesById;\n}\n\nfunction buildExternalAgentReferencePathById(\n project: FullProjectDefinition\n): Record<string, string> {\n const externalAgentEntries = Object.entries(project.externalAgents ?? {}).map(\n ([externalAgentId, externalAgentData]) =>\n [\n externalAgentId,\n { name: resolveExternalAgentNamingSeed(externalAgentId, externalAgentData) },\n ] as [string, { name: string }]\n );\n const externalAgentFileNamesById = buildSequentialNameFileNames(externalAgentEntries);\n const externalAgentReferencePathById: Record<string, string> = {};\n\n for (const [externalAgentId] of externalAgentEntries) {\n externalAgentReferencePathById[externalAgentId] = stripExtension(\n externalAgentFileNamesById[externalAgentId]\n );\n }\n\n return externalAgentReferencePathById;\n}\n\nfunction buildSubAgentReferenceNamesById(\n project: FullProjectDefinition,\n agentIds?: Iterable<string>\n): Record<string, string> {\n const subAgentReferenceNamesById: Record<string, string> = {};\n const candidateAgentIds =\n agentIds !== undefined ? [...agentIds] : Object.keys(project.agents ?? {});\n for (const agentId of candidateAgentIds) {\n const agentData = project.agents?.[agentId];\n const subAgents = asRecord(agentData?.subAgents);\n if (!subAgents) {\n continue;\n }\n\n for (const [subAgentId, subAgentData] of Object.entries(subAgents)) {\n const subAgentName = asRecord(subAgentData)?.name;\n subAgentReferenceNamesById[subAgentId] = resolveSubAgentVariableName(\n subAgentId,\n typeof subAgentName === 'string' ? subAgentName : undefined\n );\n }\n }\n\n return subAgentReferenceNamesById;\n}\n\nfunction buildSubAgentReferencePathById(\n project: FullProjectDefinition,\n agentIds?: Iterable<string>\n): Record<string, string> {\n const subAgentReferencePathById: Record<string, string> = {};\n const candidateAgentIds =\n agentIds !== undefined ? [...agentIds] : Object.keys(project.agents ?? {});\n for (const agentId of candidateAgentIds) {\n const agentData = project.agents?.[agentId];\n const subAgents = asRecord(agentData?.subAgents);\n if (!subAgents) {\n continue;\n }\n\n for (const [subAgentId, subAgentData] of Object.entries(subAgents)) {\n const subAgentName = asRecord(subAgentData)?.name;\n subAgentReferencePathById[subAgentId] = stripExtension(\n buildComponentFileName(\n subAgentId,\n typeof subAgentName === 'string' ? subAgentName : undefined\n )\n );\n }\n }\n\n return subAgentReferencePathById;\n}\n\nfunction buildAgentReferenceNamesById(project: FullProjectDefinition): Record<string, string> {\n const agentReferenceNamesById: Record<string, string> = {};\n for (const agentId of Object.keys(project.agents ?? {})) {\n agentReferenceNamesById[agentId] = toCamelCase(agentId);\n }\n return agentReferenceNamesById;\n}\n\nfunction buildAgentReferencePathById(project: FullProjectDefinition): Record<string, string> {\n const agentReferencePathById: Record<string, string> = {};\n for (const [agentId, agentData] of Object.entries(project.agents ?? {})) {\n const agentName = asRecord(agentData)?.name;\n agentReferencePathById[agentId] = stripExtension(\n buildComponentFileName(agentId, typeof agentName === 'string' ? agentName : undefined)\n );\n }\n return agentReferencePathById;\n}\n\nfunction collectProjectReferenceOverrides(\n context: GenerationContext\n): ProjectReferenceOverrides | undefined {\n const overrides: ProjectReferenceOverrides = {};\n addProjectNameBasedReferenceOverrides(context.project, overrides);\n\n const registry = context.existingComponentRegistry;\n if (!registry) {\n return Object.keys(overrides).length > 0 ? overrides : undefined;\n }\n\n for (const agentId of context.completeAgentIds) {\n assignComponentReferenceOverrideForProject(registry, overrides, 'agents', agentId, 'agents');\n }\n\n const toolIds = getObjectKeys(context.project.tools);\n for (const toolId of toolIds) {\n if (\n assignComponentReferenceOverrideForProject(\n registry,\n overrides,\n 'tools',\n toolId,\n 'functionTools'\n )\n ) {\n continue;\n }\n\n assignComponentReferenceOverrideForProject(registry, overrides, 'tools', toolId, 'tools');\n }\n\n const externalAgentIds = getObjectKeys(context.project.externalAgents);\n for (const externalAgentId of externalAgentIds) {\n assignComponentReferenceOverrideForProject(\n registry,\n overrides,\n 'externalAgents',\n externalAgentId,\n 'externalAgents'\n );\n }\n\n const dataComponentIds = getObjectKeys(context.project.dataComponents);\n for (const dataComponentId of dataComponentIds) {\n assignComponentReferenceOverrideForProject(\n registry,\n overrides,\n 'dataComponents',\n dataComponentId,\n 'dataComponents'\n );\n }\n\n const artifactComponentIds = getObjectKeys(context.project.artifactComponents);\n for (const artifactComponentId of artifactComponentIds) {\n assignComponentReferenceOverrideForProject(\n registry,\n overrides,\n 'artifactComponents',\n artifactComponentId,\n 'artifactComponents'\n );\n }\n\n const credentialIds = getObjectKeys(context.project.credentialReferences);\n for (const credentialId of credentialIds) {\n assignComponentReferenceOverrideForProject(\n registry,\n overrides,\n 'credentialReferences',\n credentialId,\n 'credentials'\n );\n }\n\n return Object.keys(overrides).length > 0 ? overrides : undefined;\n}\n\nfunction addProjectNameBasedReferenceOverrides(\n project: FullProjectDefinition,\n overrides: ProjectReferenceOverrides\n): void {\n for (const [toolId, toolData] of Object.entries(project.tools ?? {})) {\n const toolName = asRecord(toolData)?.name;\n const referenceName =\n typeof toolName === 'string' && toolName.length > 0\n ? toToolReferenceName(toolName)\n : toToolReferenceName(toolId);\n assignProjectReferenceOverride(overrides, 'tools', toolId, referenceName);\n }\n\n for (const [credentialId, credentialData] of Object.entries(project.credentialReferences ?? {})) {\n const credentialName = asRecord(credentialData)?.name;\n const referenceName =\n typeof credentialName === 'string' && credentialName.length > 0\n ? toCredentialReferenceName(credentialName)\n : toCredentialReferenceName(credentialId);\n assignProjectReferenceOverride(overrides, 'credentialReferences', credentialId, referenceName);\n }\n\n const externalAgentReferenceNamesById = buildExternalAgentReferenceNamesById(project);\n for (const [externalAgentId, referenceName] of Object.entries(externalAgentReferenceNamesById)) {\n assignProjectReferenceOverride(overrides, 'externalAgents', externalAgentId, referenceName);\n }\n}\n\nfunction collectProjectReferencePathOverrides(\n context: GenerationContext\n): ProjectReferencePathOverrides | undefined {\n const overrides: ProjectReferencePathOverrides = {};\n\n if (context.project.agents) {\n for (const agentId of context.completeAgentIds) {\n const agentData = asRecord(context.project.agents[agentId]);\n const agentName = typeof agentData?.name === 'string' ? agentData.name : undefined;\n assignProjectReferenceOverride(\n overrides,\n 'agents',\n agentId,\n stripExtension(buildComponentFileName(agentId, agentName))\n );\n }\n }\n\n const toolEntries = Object.entries(context.project.tools ?? {});\n const toolFileNamesById = buildSequentialNameFileNames(toolEntries);\n for (const [toolId] of toolEntries) {\n assignProjectReferenceOverride(\n overrides,\n 'tools',\n toolId,\n stripExtension(toolFileNamesById[toolId])\n );\n }\n\n const credentialEntries = Object.entries(context.project.credentialReferences ?? {});\n const credentialFileNamesById = buildSequentialNameFileNames(credentialEntries);\n for (const [credentialId] of credentialEntries) {\n assignProjectReferenceOverride(\n overrides,\n 'credentialReferences',\n credentialId,\n stripExtension(credentialFileNamesById[credentialId])\n );\n }\n\n const externalAgentReferencePathsById = buildExternalAgentReferencePathById(context.project);\n for (const [externalAgentId, referencePath] of Object.entries(externalAgentReferencePathsById)) {\n assignProjectReferenceOverride(overrides, 'externalAgents', externalAgentId, referencePath);\n }\n\n const registry = context.existingComponentRegistry;\n if (registry) {\n for (const agentId of context.completeAgentIds) {\n const agentComponent = registry.get(agentId, 'agents');\n if (agentComponent?.filePath) {\n assignProjectReferenceOverride(\n overrides,\n 'agents',\n agentId,\n stripExtension(basename(agentComponent.filePath))\n );\n }\n }\n\n for (const toolId of getObjectKeys(context.project.tools)) {\n const toolComponent = registry.get(toolId, 'functionTools') ?? registry.get(toolId, 'tools');\n if (toolComponent?.filePath) {\n assignProjectReferenceOverride(\n overrides,\n 'tools',\n toolId,\n resolveToolModulePath(toolComponent.filePath)\n );\n }\n }\n\n for (const credentialId of getObjectKeys(context.project.credentialReferences)) {\n const credentialComponent = registry.get(credentialId, 'credentials');\n if (credentialComponent?.filePath) {\n assignProjectReferenceOverride(\n overrides,\n 'credentialReferences',\n credentialId,\n stripExtension(basename(credentialComponent.filePath))\n );\n }\n }\n\n for (const externalAgentId of getObjectKeys(context.project.externalAgents)) {\n const externalAgentComponent = registry.get(externalAgentId, 'externalAgents');\n if (externalAgentComponent?.filePath) {\n assignProjectReferenceOverride(\n overrides,\n 'externalAgents',\n externalAgentId,\n stripExtension(basename(externalAgentComponent.filePath))\n );\n }\n }\n }\n\n return Object.keys(overrides).length > 0 ? overrides : undefined;\n}\n\nfunction assignProjectReferenceOverride(\n overrides: ProjectReferenceOverrides | ProjectReferencePathOverrides,\n overrideType: ProjectReferenceOverrideType,\n componentId: string,\n referenceName: string\n): void {\n const overrideMap = overrides[overrideType] ?? {};\n overrideMap[componentId] = referenceName;\n overrides[overrideType] = overrideMap;\n}\n\nfunction stripExtension(fileName: string): string {\n return fileName.replace(/\\.[^.]+$/, '');\n}\n\nfunction resolveToolModulePath(filePath: string): string {\n const normalizedFilePath = normalizeFilePath(filePath);\n const toolsSegment = '/tools/';\n const toolsIndex = normalizedFilePath.lastIndexOf(toolsSegment);\n if (toolsIndex >= 0) {\n let modulePath = stripExtension(normalizedFilePath.slice(toolsIndex + toolsSegment.length));\n if (modulePath.endsWith('/index')) {\n modulePath = modulePath.slice(0, -'/index'.length);\n }\n if (modulePath.length > 0) {\n return modulePath;\n }\n }\n\n const baseModulePath = stripExtension(basename(normalizedFilePath));\n if (baseModulePath === 'index') {\n return stripExtension(basename(dirname(normalizedFilePath)));\n }\n return baseModulePath;\n}\n\nfunction resolveExternalAgentNamingSeed(\n externalAgentId: string,\n externalAgentData: unknown\n): string {\n if (isHumanReadableId(externalAgentId)) {\n return externalAgentId;\n }\n\n const externalAgentName = asRecord(externalAgentData)?.name;\n if (typeof externalAgentName === 'string' && externalAgentName.length > 0) {\n return externalAgentName;\n }\n\n return externalAgentId;\n}\n\nfunction toExternalAgentReferenceName(input: string): string {\n const base = toCamelCase(input);\n return base.endsWith('Agent') ? base : `${base}Agent`;\n}\n\nfunction buildSequentialNameFileNames(entries: Array<[string, unknown]>): Record<string, string> {\n const countsByStem = new Map<string, number>();\n const fileNamesById: Record<string, string> = {};\n\n for (const [componentId, componentData] of entries) {\n const name = asRecord(componentData)?.name;\n const baseStem = resolveNameFileStem(componentId, typeof name === 'string' ? name : undefined);\n const occurrence = countsByStem.get(baseStem) ?? 0;\n countsByStem.set(baseStem, occurrence + 1);\n\n const stem = occurrence === 0 ? baseStem : `${baseStem}-${occurrence}`;\n fileNamesById[componentId] = `${stem}.ts`;\n }\n\n return fileNamesById;\n}\n\nfunction resolveNameFileStem(componentId: string, name: string | undefined): string {\n const nameStem = name ? toKebabCase(name) : '';\n if (nameStem.length > 0) {\n return nameStem;\n }\n\n const idStem = toKebabCase(componentId);\n if (idStem.length > 0) {\n return idStem;\n }\n\n return componentId;\n}\n\nfunction assignComponentReferenceOverrideForProject(\n registry: ComponentRegistry,\n overrides: ProjectReferenceOverrides,\n overrideType: ProjectReferenceOverrideType,\n componentId: string,\n componentType: ComponentType\n): boolean {\n const component = registry.get(componentId, componentType);\n if (!component?.name) {\n return false;\n }\n\n const overrideMap = overrides[overrideType] ?? {};\n overrideMap[componentId] = component.name;\n overrides[overrideType] = overrideMap;\n return true;\n}\n\nfunction extractReferenceIds(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (typeof item === 'string') {\n return item;\n }\n const record = asRecord(item);\n if (record && typeof record.id === 'string') {\n return record.id;\n }\n return undefined;\n })\n .filter((id): id is string => !!id);\n }\n\n const record = asRecord(value);\n if (!record) {\n return [];\n }\n\n return Object.keys(record);\n}\n\nfunction resolveRecordFilePath(\n context: GenerationContext,\n componentType: ComponentType,\n componentId: string,\n fallbackFilePath: string\n): string {\n const existingComponent = context.existingComponentRegistry?.get(componentId, componentType);\n if (!existingComponent?.filePath) {\n return fallbackFilePath;\n }\n\n return resolveProjectFilePath(context.paths.projectRoot, existingComponent.filePath);\n}\n\nfunction resolveProjectFilePath(projectRoot: string, filePath: string): string {\n if (filePath.startsWith('/')) {\n return filePath;\n }\n return join(projectRoot, filePath);\n}\n\nfunction normalizeFilePath(filePath: string): string {\n return filePath.replaceAll('\\\\', '/');\n}\n\nfunction writeTypeScriptFile(\n filePath: string,\n content: string,\n writeMode: 'merge' | 'overwrite'\n): void {\n mkdirSync(dirname(filePath), { recursive: true });\n\n const processedContent =\n writeMode === 'merge' && existsSync(filePath)\n ? mergeSafely(readFileSync(filePath, 'utf8'), content)\n : content;\n\n const sourceFile = createInMemoryProject().createSourceFile('generated.ts', processedContent, {\n overwrite: true,\n });\n\n const normalizedSourceFile = moveVariableDeclarationsBeforeUsage(\n applyObjectShorthand(sourceFile)\n );\n sourceFile.formatText();\n writeFileSync(filePath, `${normalizedSourceFile.getFullText().trimEnd()}\\n`);\n}\n\nfunction mergeSafely(existingContent: string, generatedContent: string): string {\n try {\n return mergeGeneratedModule(existingContent, generatedContent);\n } catch (error) {\n console.warn(\n `Warning: Failed to merge file, using generated content. Manual changes may be lost. Reason: ${error instanceof Error ? error.message : String(error)}`\n );\n return generatedContent;\n }\n}\n\nfunction applyObjectShorthand(sourceFile: SourceFile): SourceFile {\n for (const objectLiteral of sourceFile.getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression)) {\n for (const property of objectLiteral.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n const nameNode = property.getNameNode();\n const initializer = property.getInitializer();\n if (!Node.isIdentifier(nameNode) || !initializer || !Node.isIdentifier(initializer)) {\n continue;\n }\n if (nameNode.getText() !== initializer.getText()) {\n continue;\n }\n property.replaceWithText(nameNode.getText());\n }\n }\n return sourceFile;\n}\n\nfunction moveVariableDeclarationsBeforeUsage(sourceFile: SourceFile): SourceFile {\n let moved = true;\n while (moved) {\n moved = false;\n const variableStatements = sourceFile.getVariableStatements();\n for (const variableStatement of variableStatements) {\n const statementStart = variableStatement.getStart();\n const sourceStatements = sourceFile.getStatements();\n const statementIndex = sourceStatements.indexOf(variableStatement);\n if (statementIndex <= 0) {\n continue;\n }\n\n let targetIndex: number | undefined;\n for (const declaration of variableStatement.getDeclarations()) {\n for (const referenceNode of declaration.findReferencesAsNodes()) {\n if (referenceNode.getSourceFile() !== sourceFile) {\n continue;\n }\n\n const parentNode = referenceNode.getParent();\n if (parentNode === declaration) {\n continue;\n }\n\n if (referenceNode.getStart() >= statementStart) {\n continue;\n }\n\n if (isReferenceInsideFunctionLike(referenceNode)) {\n continue;\n }\n // @ts-expect-error -- fixme\n const topLevelStatement = referenceNode.getFirstAncestor((ancestor) => {\n return Node.isStatement(ancestor) && ancestor.getParentIfKind(SyntaxKind.SourceFile);\n });\n if (!topLevelStatement) {\n continue;\n }\n // @ts-expect-error -- fixme\n const topLevelStatementIndex = sourceStatements.indexOf(topLevelStatement);\n if (topLevelStatementIndex === -1 || topLevelStatementIndex >= statementIndex) {\n continue;\n }\n\n targetIndex =\n targetIndex === undefined\n ? topLevelStatementIndex\n : Math.min(targetIndex, topLevelStatementIndex);\n }\n }\n\n if (targetIndex === undefined) {\n continue;\n }\n\n const statementText = variableStatement.getText();\n variableStatement.remove();\n sourceFile.insertStatements(targetIndex, [statementText]);\n moved = true;\n break;\n }\n }\n return sourceFile;\n}\n\nfunction isReferenceInsideFunctionLike(referenceNode: Node): boolean {\n return Boolean(\n referenceNode.getFirstAncestor((ancestor) => {\n return (\n Node.isArrowFunction(ancestor) ||\n Node.isFunctionDeclaration(ancestor) ||\n Node.isFunctionExpression(ancestor) ||\n Node.isMethodDeclaration(ancestor) ||\n Node.isGetAccessorDeclaration(ancestor) ||\n Node.isSetAccessorDeclaration(ancestor)\n );\n })\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmIA,eAAsB,mBAAmB,EACvC,SACA,OACA,YAAY,SACZ,QAAQ,SAC2B;AACnC,iBAAgB,QAAQ;CAExB,MAAM,gBAAgC,EAAE;CAIxC,MAAM,UAA6B;EACjC;EACA;EACA,kBANuB,wBAAwB,SAAS,cAAc;EAOtE,2BALA,cAAc,UAAU,kCAAkC,MAAM,aAAa,MAAM,GAAG;EAMvF;CACD,MAAM,QAAQ,uBAAuB;CACrC,MAAM,iBAA2B,EAAE;AAEnC,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,UAAU,KAAK,QAAQ,QAAQ;AACrC,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,aAAa,KAAK,SAAS,OAAO,QAAQ;AAChD,uBAAoB,OAAO,UAAU,WAAW,aAAa,EAAE,UAAU;AACzE,kBAAe,KAAK,OAAO,SAAS;;;AAIxC,KAAI,OAAO;AACT,UAAQ,IAAI,aAAa,eAAe,OAAO,QAAQ;AACvD,MAAI,cAAc,OAChB,SAAQ,IACN,WAAW,cAAc,OAAO,aAAa,cAC1C,KAAK,UAAU,GAAG,MAAM,GAAG,IAAI,MAAM,OAAO,GAAG,CAC/C,KAAK,KAAK,GACd;;;AAKP,SAAS,wBAAoD;AAC3D,QAAO;EACL;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACX;EACF;;AAGH,SAAS,yBACP,SAC6E;AAC7E,KAAI,CAAC,QAAQ,QAAQ,qBACnB,QAAO,EAAE;CAGX,MAAM,oBAAoB,OAAO,QAAQ,QAAQ,QAAQ,qBAAqB;CAC9E,MAAM,0BAA0B,6BAA6B,kBAAkB;AAE/E,QAAO,kBAAkB,KAAK,CAAC,cAAc,qBAAqB;EAChE,IAAI;EACJ,UAAU,sBACR,SACA,eACA,cACA,KAAK,QAAQ,MAAM,gBAAgB,wBAAwB,cAAc,CAC1E;EACD,SAAS;GACP;GACA,GAAG;GACJ;EACF,EAAE;;AAGL,SAAS,kCACP,SACsF;CACtF,MAAM,yBAAyB,yCAAyC,QAAQ,QAAQ;AACxF,KAAI,uBAAuB,WAAW,EACpC,QAAO,EAAE;CAGX,MAAM,kBAA2C,EAAE;AACnD,MAAK,MAAM,yBAAyB,wBAAwB;EAC1D,MAAM,iBAAiB,QAAQ,QAAQ,uBAAuB;AAC9D,MAAI,cAAc,eAAe,EAAE;AACjC,mBAAgB,yBAAyB;IACvC,GAAG;IACH,IAAI;IACL;AACD;;AAGF,kBAAgB,yBAAyB,EACvC,IAAI,uBACL;;AAGH,QAAO,CACL;EACE,IAAI;EACJ,UAAU,sBACR,SACA,gBACA,eACA,KAAK,QAAQ,MAAM,iBAAiB,qBAAqB,CAC1D;EACD,SAAS,EACP,aAAa,iBACd;EACF,CACF;;AAGH,SAAS,+BACP,SACmF;AAEnF,KAD+B,yCAAyC,QAAQ,QAAQ,CAC7D,WAAW,EACpC,QAAO,EAAE;AAGX,QAAO,CACL;EACE,IAAI;EACJ,UAAU,sBACR,SACA,gBACA,SACA,KAAK,QAAQ,MAAM,iBAAiB,WAAW,CAChD;EACD,SAAS,CAAC,cAAc;EACzB,CACF;;AAGH,SAAS,kCACP,SACY;AACZ,QAAO,sCAAsC,eAAe,QAAQ;;AAGtE,SAAS,gCACP,SACoF;AACpF,KAAI,CAAC,QAAQ,QAAQ,mBACnB,QAAO,EAAE;AAGX,QAAO,OAAO,QAAQ,QAAQ,QAAQ,mBAAmB,CAAC,KACvD,CAAC,qBAAqB,4BAA4B;EACjD,IAAI;EACJ,UAAU,sBACR,SACA,sBACA,qBACA,KACE,QAAQ,MAAM,uBACd,uBAAuB,qBAAqB,sBAAsB,QAAQ,OAAU,CACrF,CACF;EACD,SAAS;GACP;GACA,GAAG;GACJ;EACF,EACF;;AAGH,SAAS,4BACP,SACgF;CAChF,MAAM,2CAA2B,IAAI,KAGlC;AAEH,MAAK,MAAM,CAAC,iBAAiB,kBAAkB,OAAO,QACpD,QAAQ,QAAQ,kBAAkB,EAAE,CACrC,CACC,0BAAyB,IAAI,iBAAiB;EAC5C,IAAI;EACJ,UAAU,sBACR,SACA,kBACA,iBACA,KACE,QAAQ,MAAM,mBACd,uBAAuB,iBAAiB,cAAc,QAAQ,OAAU,CACzE,CACF;EACD,SAAS;GACP;GACA,GAAG;GACJ;EACF,CAAC;AAGJ,MAAK,MAAM,mBAAmB,sCAAsC,SAAS,iBAAiB,EAAE;AAC9F,MAAI,yBAAyB,IAAI,gBAAgB,CAC/C;AAGF,2BAAyB,IAAI,iBAAiB;GAC5C,IAAI;GACJ,UAAU,sBACR,SACA,kBACA,iBACA,KAAK,QAAQ,MAAM,mBAAmB,GAAG,gBAAgB,KAAK,CAC/D;GACD,SAAS;IACP;IACA,MAAM;IACN,OAAO;KAAE,MAAM;KAAU,YAAY,EAAE;KAAE;IAC1C;GACF,CAAC;;AAGJ,QAAO,CAAC,GAAG,yBAAyB,QAAQ,CAAC;;AAG/C,SAAS,sCACP,SACA,mBACU;CACV,MAAM,+BAAe,IAAI,KAAa;AAEtC,MAAK,MAAM,WAAW,QAAQ,kBAAkB;EAC9C,MAAM,YAAY,QAAQ,QAAQ,SAAS;EAC3C,MAAM,YAAY,SAAS,WAAW,UAAU;AAChD,MAAI,CAAC,UACH;AAGF,OAAK,MAAM,gBAAgB,OAAO,OAAO,UAAU,EAAE;GACnD,MAAM,iBAAiB,SAAS,aAAa;AAC7C,OAAI,CAAC,eACH;AAGF,QAAK,MAAM,eAAe,oBAAoB,eAAe,mBAAmB,CAC9E,cAAa,IAAI,YAAY;;;AAKnC,QAAO,CAAC,GAAG,aAAa;;AAG1B,SAAS,4BACP,SACgF;AAChF,KAAI,CAAC,QAAQ,QAAQ,OACnB,QAAO,EAAE;CAGX,MAAM,2CAA2B,IAAI,KAGlC;AAEH,MAAK,MAAM,WAAW,QAAQ,kBAAkB;EAC9C,MAAM,YAAY,QAAQ,QAAQ,OAAO;EACzC,MAAM,gBAAgB,YAAY,SAAS,UAAU,cAAc,GAAG;AACtE,MAAI,CAAC,aAAa,CAAC,cACjB;EAGF,MAAM,0BAA0B,gCAC9B,eACA,+CAA+C,UAAU,CAC1D;EAED,MAAM,kBACJ,OAAO,wBAAwB,OAAO,WAAW,wBAAwB,KAAK;AAChF,MAAI,CAAC,gBACH;AAGF,MAAI,CAAC,yBAAyB,IAAI,gBAAgB,EAAE;GAClD,MAAM,wBAAwB,sBAC5B,SACA,kBACA,iBACA,KAAK,QAAQ,MAAM,mBAAmB,GAAG,gBAAgB,KAAK,CAC/D;GACD,MAAM,+BAA+B,iDACnC,SACA,wBACD;GACD,MAAM,mCAAmC,qDACvC,SACA,wBACD;GACD,MAAM,2BAA2B,6CAC/B,SACA,iBACA,sBACD;AACD,4BAAyB,IAAI,iBAAiB;IAC5C,IAAI;IACJ,UAAU;IACV,SAAS;KACP;KACA,GAAG;KACH,GAAI,4BAA4B,EAC9B,kBAAkB,0BACnB;KACD,GAAI,gCAAgC,EAClC,oBAAoB,EAClB,sBAAsB,8BACvB,EACF;KACD,GAAI,oCAAoC,EACtC,wBAAwB,EACtB,sBAAsB,kCACvB,EACF;KACF;IACF,CAAC;;;AAIN,QAAO,CAAC,GAAG,yBAAyB,QAAQ,CAAC;;AAY/C,SAAS,2BACP,SAC+E;CAC/E,MAAM,sBAAsB,2BAA2B,QAAQ,QAAQ;AACvE,KAAI,CAAC,oBAAoB,OACvB,QAAO,EAAE;CAGX,MAAM,4BAA4B,6BAChC,oBAAoB,KAAK,EAAE,gBAAgB,eAAe,CAAC,gBAAgB,EAAE,MAAM,UAAU,CAAC,CAAC,CAChG;AAED,QAAO,oBAAoB,KACxB,EACC,gBACA,kBACA,mBAC4E;EAC5E,MAAM,aAAa,eAAe,0BAA0B,gBAAgB;EAC5E,MAAM,mBACJ,OAAO,iBAAiB,SAAS,YAAY,iBAAiB,KAAK,SAAS,IACxE,iBAAiB,OACjB,OAAO,aAAa,SAAS,YAAY,aAAa,KAAK,SAAS,IAClE,aAAa,OACb;EACR,MAAM,0BACJ,OAAO,iBAAiB,gBAAgB,WACpC,iBAAiB,cACjB,OAAO,aAAa,gBAAgB,WAClC,aAAa,cACb;AAER,SAAO;GACL,IAAI;GACJ,UAAU,sBACR,SACA,iBACA,gBACA,KAAK,QAAQ,MAAM,UAAU,GAAG,WAAW,KAAK,CACjD;GACD,SAAS;IACP;IACA,GAAI,oBAAoB,EAAE,MAAM,kBAAkB;IAClD,GAAI,4BAA4B,UAAa,EAC3C,aAAa,yBACd;IACD,GAAI,aAAa,gBAAgB,UAAa,EAAE,aAAa,aAAa,aAAa;IACvF,GAAI,aAAa,WAAW,UAAa,EAAE,QAAQ,aAAa,QAAQ;IACxE,GAAI,aAAa,gBAAgB,UAAa,EAAE,aAAa,aAAa,aAAa;IACvF,GAAI,aAAa,iBAAiB,UAAa,EAC7C,cAAc,aAAa,cAC5B;IACF;GACF;GAEJ;;AAGH,SAAS,2BAA2B,SAAqD;CACvF,MAAM,oBAAoB,yBAAyB,QAAQ;CAC3D,MAAM,gBAAgB,qBAAqB,QAAQ;CACnD,MAAM,UAA+B,EAAE;AAEvC,MAAK,MAAM,CAAC,gBAAgB,qBAAqB,OAAO,QAAQ,kBAAkB,EAAE;EAClF,MAAM,aACJ,OAAO,iBAAiB,eAAe,YAAY,iBAAiB,WAAW,SAAS,IACpF,iBAAiB,aACjB;EACN,MAAM,eAAe,cAAc,eAAe,EAAE;EACpD,MAAM,mBACJ,OAAO,iBAAiB,SAAS,YAAY,iBAAiB,KAAK,SAAS,IACxE,iBAAiB,OACjB;EACN,MAAM,eACJ,OAAO,aAAa,SAAS,YAAY,aAAa,KAAK,SAAS,IAChE,aAAa,OACb;EACN,MAAM,eAAe,oBAAoB,gBAAgB;AAEzD,UAAQ,KAAK;GACX;GACA;GACA;GACA;GACA,YAAY;GACZ,UAAU;GACX,CAAC;;AAGJ,QAAO;;AAGT,SAAS,yBACP,SACyC;CACzC,MAAM,oBAA6D,EAAE;AAErE,MAAK,MAAM,CAAC,gBAAgB,qBAAqB,OAAO,QAAQ,QAAQ,iBAAiB,EAAE,CAAC,EAAE;EAC5F,MAAM,qBAAqB,SAAS,iBAAiB;AACrD,MAAI,CAAC,mBACH;AAGF,oBAAkB,kBAAkB,EAClC,GAAG,oBACJ;;AAGH,MAAK,MAAM,aAAa,OAAO,OAAO,QAAQ,UAAU,EAAE,CAAC,EAAE;EAE3D,MAAM,qBAAqB,SADP,SAAS,UAAU,EACU,cAAc;AAC/D,MAAI,CAAC,mBACH;AAGF,OAAK,MAAM,CAAC,gBAAgB,qBAAqB,OAAO,QAAQ,mBAAmB,EAAE;GACnF,MAAM,qBAAqB,SAAS,iBAAiB;AACrD,OAAI,CAAC,mBACH;GAGF,MAAM,uBAAuB,kBAAkB,mBAAmB,EAAE;AACpE,qBAAkB,kBAAkB;IAClC,GAAG;IACH,GAAG;IACJ;;;AAIL,QAAO;;AAGT,SAAS,qBACP,SACyC;CACzC,MAAM,gBAAyD,EAAE;AAEjE,MAAK,MAAM,CAAC,YAAY,iBAAiB,OAAO,QAAQ,QAAQ,aAAa,EAAE,CAAC,EAAE;EAChF,MAAM,iBAAiB,SAAS,aAAa;AAC7C,MAAI,CAAC,eACH;AAGF,gBAAc,cAAc,EAC1B,GAAG,gBACJ;;AAGH,MAAK,MAAM,aAAa,OAAO,OAAO,QAAQ,UAAU,EAAE,CAAC,EAAE;EAE3D,MAAM,iBAAiB,SADH,SAAS,UAAU,EACM,UAAU;AACvD,MAAI,CAAC,eACH;AAGF,OAAK,MAAM,CAAC,YAAY,iBAAiB,OAAO,QAAQ,eAAe,EAAE;GACvE,MAAM,iBAAiB,SAAS,aAAa;AAC7C,OAAI,CAAC,eACH;GAGF,MAAM,mBAAmB,cAAc,eAAe,EAAE;AACxD,iBAAc,cAAc;IAC1B,GAAG;IACH,GAAG;IACJ;;;AAIL,QAAO;;AAGT,SAAS,mBACP,SAC0E;CAC1E,MAAM,cAAc,OAAO,QAAQ,QAAQ,QAAQ,SAAS,EAAE,CAAC;CAC/D,MAAM,oBAAoB,6BAA6B,YAAY;AAEnE,QAAO,YAAY,KAAK,CAAC,QAAQ,eAAe;EAC9C,IAAI;EACJ,UAAU,sBACR,SACA,SACA,QACA,KAAK,QAAQ,MAAM,UAAU,kBAAkB,QAAQ,CACxD;EACD,SAAS;GACP,WAAW;GACX,GAAG;GACJ;EACF,EAAE;;AAGL,SAAS,4BACP,SACgF;CAChF,MAAM,uBAAuB,OAAO,QAAQ,QAAQ,QAAQ,kBAAkB,EAAE,CAAC;CACjF,MAAM,6BAA6B,6BACjC,qBAAqB,KAAK,CAAC,iBAAiB,uBAAuB,CACjE,iBACA,EAAE,MAAM,+BAA+B,iBAAiB,kBAAkB,EAAE,CAC7E,CAAC,CACH;CACD,MAAM,kCAAkC,qCAAqC,QAAQ,QAAQ;AAE7F,QAAO,qBAAqB,KAAK,CAAC,iBAAiB,uBAAuB;EACxE,MAAM,sBAAsB,SAAS,kBAAkB,IAAI,EAAE;AAC7D,SAAO;GACL,IAAI;GACJ,UAAU,sBACR,SACA,kBACA,iBACA,KAAK,QAAQ,MAAM,mBAAmB,2BAA2B,iBAAiB,CACnF;GACD,SAAS;IACP;IACA,4BAA4B,gCAAgC;IAC5D,GAAG;IACJ;GACF;GACD;;AAGJ,SAAS,iDACP,SACA,mBACoC;CACpC,MAAM,mBAAmB,SAAS,kBAAkB,iBAAiB;AACrE,KAAI,CAAC,iBACH;CAGF,MAAM,+BAA+B,kCAAkC,QAAQ,QAAQ;CACvF,MAAM,WAAW,QAAQ;CACzB,MAAM,YAAoC,EAAE;AAC5C,MAAK,MAAM,mBAAmB,OAAO,OAAO,iBAAiB,EAAE;EAC7D,MAAM,wBAAwB,SAAS,gBAAgB;EACvD,MAAM,wBACJ,yBAAyB,OAAO,sBAAsB,0BAA0B,WAC5E,sBAAsB,wBACtB;AACN,MAAI,CAAC,sBACH;EAGF,MAAM,0BAA0B,6BAA6B;AAC7D,MAAI,wBACF,WAAU,yBAAyB;EAGrC,MAAM,qBAAqB,UAAU,IAAI,uBAAuB,cAAc;AAC9E,MAAI,oBAAoB,KACtB,WAAU,yBAAyB,mBAAmB;;AAI1D,QAAO,OAAO,KAAK,UAAU,CAAC,SAAS,YAAY;;AAGrD,SAAS,qDACP,SACA,mBACoC;CACpC,MAAM,mBAAmB,SAAS,kBAAkB,iBAAiB;AACrE,KAAI,CAAC,iBACH;CAGF,MAAM,8BAA8B,iCAAiC,QAAQ,QAAQ;CACrF,MAAM,WAAW,QAAQ;CACzB,MAAM,YAAoC,EAAE;AAC5C,MAAK,MAAM,mBAAmB,OAAO,OAAO,iBAAiB,EAAE;EAC7D,MAAM,wBAAwB,SAAS,gBAAgB;EACvD,MAAM,wBACJ,yBAAyB,OAAO,sBAAsB,0BAA0B,WAC5E,sBAAsB,wBACtB;AACN,MAAI,CAAC,sBACH;EAGF,MAAM,0BAA0B,4BAA4B;AAC5D,MAAI,wBACF,WAAU,yBAAyB;EAGrC,MAAM,qBAAqB,UAAU,IAAI,uBAAuB,cAAc;AAC9E,MAAI,oBAAoB,SACtB,WAAU,yBAAyB,eAAe,SAAS,mBAAmB,SAAS,CAAC;;AAI5F,QAAO,OAAO,KAAK,UAAU,CAAC,SAAS,YAAY;;AAGrD,SAAS,6CACP,SACA,iBACA,UACoB;AACpB,KAAI,CAAC,QAAQ,6BAA6B,CAAC,WAAW,SAAS,CAC7D;CAGF,MAAM,aAAa,uBAAuB,CAAC,iBACzC,8BACA,aAAa,UAAU,OAAO,EAC9B,EAAE,WAAW,MAAM,CACpB;AAED,MAAK,MAAM,eAAe,WAAW,yBAAyB,EAAE;EAC9D,MAAM,cAAc,YAAY,gBAAgB;AAChD,MAAI,CAAC,eAAe,CAAC,KAAK,iBAAiB,YAAY,CACrD;EAGF,MAAM,aAAa,YAAY,eAAe;AAC9C,MAAI,CAAC,KAAK,aAAa,WAAW,IAAI,WAAW,SAAS,KAAK,gBAC7D;EAGF,MAAM,CAAC,aAAa,YAAY,cAAc;AAC9C,MAAI,CAAC,aAAa,CAAC,KAAK,0BAA0B,UAAU,CAC1D;EAGF,MAAM,aAAa,UAAU,YAAY,KAAK;AAC9C,MAAI,CAAC,cAAc,CAAC,KAAK,qBAAqB,WAAW,CACvD;EAEF,MAAM,gBAAgB,WAAW,gBAAgB;AACjD,MAAI,CAAC,iBAAiB,CAAC,KAAK,gBAAgB,cAAc,CACxD;AAEF,MAAI,cAAc,iBAAiB,KAAK,gBACtC;EAGF,MAAM,kBAAkB,UAAU,YAAY,UAAU;AACxD,MAAI,CAAC,gBACH;AAGF,MAAI,KAAK,8BAA8B,gBAAgB,CACrD,QAAO,gBAAgB,SAAS;AAGlC,MAAI,CAAC,KAAK,qBAAqB,gBAAgB,CAC7C;EAGF,MAAM,qBAAqB,gBAAgB,gBAAgB;AAC3D,MAAI,CAAC,mBACH;AAGF,MAAI,KAAK,aAAa,mBAAmB,CACvC,QAAO,mBAAmB,SAAS;AAGrC,MAAI,KAAK,eAAe,mBAAmB,EAAE;GAC3C,MAAM,kBAAkB,mBAAmB,eAAe;AAC1D,OAAI,KAAK,aAAa,gBAAgB,CACpC,QAAO,gBAAgB,SAAS;;AAIpC;;;AAMJ,SAAS,sBACP,SAC0E;AAC1E,KAAI,CAAC,QAAQ,QAAQ,OACnB,QAAO,EAAE;CAGX,MAAM,+BAA+B,kCAAkC,QAAQ,QAAQ;CACvF,MAAM,+BAA+B,iCAAiC,QAAQ,QAAQ;CACtF,MAAM,UAAoF,EAAE;AAC5F,MAAK,MAAM,WAAW,QAAQ,kBAAkB;EAC9C,MAAM,YAAY,QAAQ,QAAQ,OAAO;AACzC,MAAI,CAAC,WAAW,SACd;EAGF,MAAM,iBAAiB,OAAO,QAAQ,UAAU,SAAS;EACzD,MAAM,uBAAuB,6BAA6B,eAAe;AAEzE,OAAK,MAAM,CAAC,WAAW,gBAAgB,gBAAgB;GACrD,MAAM,gBAAgB,SAAS,YAAY;GAC3C,MAAM,qCACJ,OAAO,eAAe,uCAAuC,WACzD,cAAc,qCACd;GACN,IAAI,uCAAuC,qCACvC,6BAA6B,sCAC7B;GACJ,IAAI,uCAAuC,qCACvC,6BAA6B,sCAC7B;AAEJ,OAAI,sCAAsC,QAAQ,2BAA2B;IAC3E,MAAM,qBAAqB,QAAQ,0BAA0B,IAC3D,oCACA,cACD;AACD,QAAI,oBAAoB,KACtB,wCAAuC,mBAAmB;AAE5D,QAAI,oBAAoB,SACtB,wCAAuC,eACrC,SAAS,mBAAmB,SAAS,CACtC;;AAIL,WAAQ,KAAK;IACX,IAAI;IACJ,UAAU,sBACR,SACA,YACA,WACA,KAAK,QAAQ,MAAM,WAAW,YAAY,qBAAqB,WAAW,CAC3E;IACD,SAAS;KACP;KACA,GAAG;KACH,GAAI,wCAAwC,EAC1C,sCACD;KACD,GAAI,wCAAwC,EAC1C,sCACD;KACF;IACF,CAAC;;;AAIN,QAAO;;AAGT,SAAS,+BACP,SACmF;AACnF,KAAI,CAAC,QAAQ,QAAQ,OACnB,QAAO,EAAE;CAGX,MAAM,UACJ,EAAE;AACJ,MAAK,MAAM,WAAW,QAAQ,kBAAkB;EAC9C,MAAM,YAAY,QAAQ,QAAQ,OAAO;AACzC,MAAI,CAAC,WAAW,kBACd;EAIF,MAAM,gCAAgC,6BADN,OAAO,QAAQ,UAAU,kBAAkB,CACgB;AAE3F,OAAK,MAAM,CAAC,oBAAoB,yBAAyB,OAAO,QAC9D,UAAU,kBACX,CACC,SAAQ,KAAK;GACX,IAAI;GACJ,UAAU,sBACR,SACA,qBACA,oBACA,KACE,QAAQ,MAAM,WACd,sBACA,8BAA8B,oBAC/B,CACF;GACD,SAAS;IACP;IACA,GAAG;IACJ;GACF,CAAC;;AAIN,QAAO;;AAGT,SAAS,oBACP,SACwE;AACxE,KAAI,CAAC,QAAQ,QAAQ,OACnB,QAAO,EAAE;CAGX,MAAM,UAAkF,EAAE;AAC1F,MAAK,MAAM,WAAW,QAAQ,kBAAkB;EAC9C,MAAM,YAAY,QAAQ,QAAQ,OAAO;AACzC,MAAI,CAAC,UACH;EAGF,MAAM,YAAY,OAAO,UAAU,SAAS,WAAW,UAAU,OAAO;EACxE,MAAM,gBAAgB,sBACpB,SACA,UACA,SACA,KAAK,QAAQ,MAAM,WAAW,uBAAuB,SAAS,UAAU,CAAC,CAC1E;EACD,MAAM,gBAAgB,QAAQ,2BAA2B,IAAI,SAAS,SAAS;EAC/E,MAAM,qBAAqB,kCAAkC,SAAS,WAAW,cAAc;EAC/F,MAAM,iCAAiC,sCACrC,SACA,UACD;EACD,MAAM,gBAAgB,SAAS,UAAU,cAAc;EACvD,MAAM,4BAA4B,iCAChC,SACA,WACA,eACA,CACE,OAAO,UAAU,WAAW,WAAW,UAAU,SAAS,QAC1D,OAAO,eAAe,WAAW,WAAW,cAAc,SAAS,OACpE,CACF;AAED,UAAQ,KAAK;GACX,IAAI;GACJ,UAAU;GACV,SAAS;IACP;IACA,GAAG;IACH,GAAI,eAAe,MAAM,UAAU,EAAE,mBAAmB,cAAc,MAAM;IAC5E,GAAI,OAAO,KAAK,mBAAmB,CAAC,UAAU,EAAE,oBAAoB;IACpE,GAAI,OAAO,KAAK,+BAA+B,CAAC,UAAU,EACxD,gCACD;IACD,GAAI,6BAA6B,EAC/B,wBAAwB,0BAA0B,wBACnD;IACD,GAAI,2BAA2B,iCAAiC,EAC9D,+BAA+B,0BAA0B,+BAC1D;IACF;GACF,CAAC;;AAEJ,QAAO;;AAGT,SAAS,sCACP,SACA,WACwB;CACxB,MAAM,qCAAqC,+BACzC,QAAQ,SACR,QAAQ,iBACT;CACD,MAAM,cAAc,IAAI,IAAY,oBAAoB,UAAU,UAAU,CAAC;AAC7E,KAAI,OAAO,UAAU,sBAAsB,YAAY,UAAU,kBAAkB,SAAS,EAC1F,aAAY,IAAI,UAAU,kBAAkB;AAG9C,KAAI,CAAC,YAAY,KACf,QAAO,EAAE;CAGX,MAAM,YAAY,SAAS,UAAU,UAAU;CAC/C,MAAM,YAAoC,EAAE;AAE5C,MAAK,MAAM,cAAc,aAAa;EACpC,MAAM,wBAAwB,mCAAmC;EACjE,MAAM,eAAe,SAAS,YAAY,YAAY;EACtD,MAAM,eAAe,OAAO,cAAc,SAAS,WAAW,aAAa,OAAO;AAalF,YAAU,cAAc,eAAe,SAZd,sBACvB,SACA,aACA,YACA,KACE,QAAQ,MAAM,WACd,cACA,wBACI,GAAG,sBAAsB,OACzB,uBAAuB,YAAY,aAAa,CACrD,CACF,CACgE,CAAC;;AAGpE,QAAO;;AAGT,SAAS,uBACP,SAC2E;AAC3E,KAAI,CAAC,QAAQ,QAAQ,OACnB,QAAO,EAAE;CAGX,MAAM,sCAAsB,IAAI,KAG7B;AACH,MAAK,MAAM,WAAW,QAAQ,kBAAkB;EAC9C,MAAM,YAAY,QAAQ,QAAQ,OAAO;EACzC,MAAM,YAAY,SAAS,WAAW,UAAU;AAChD,MAAI,CAAC,UACH;AAGF,OAAK,MAAM,CAAC,YAAY,iBAAiB,OAAO,QAAQ,UAAU,EAAE;GAClE,MAAM,UAAU,SAAS,aAAa;AACtC,OAAI,CAAC,QACH;GAGF,MAAM,uBAAuB,4CAA4C,SAAS,QAAQ;GAC1F,MAAM,eAAe,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;GACvE,MAAM,mBAAmB,sBACvB,SACA,aACA,YACA,KACE,QAAQ,MAAM,WACd,cACA,uBAAuB,YAAY,aAAa,CACjD,CACF;GACD,MAAM,4BAA4B,iCAChC,SACA,WACA,kBACA,CAAC,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS,OAAU,CAClE;AAED,uBAAoB,IAAI,YAAY;IAClC,IAAI;IACJ,UAAU;IACV,SAAS;KACP;KACA,GAAG;KACH,GAAI,sBAAsB,sBAAsB,EAC9C,oBAAoB,qBAAqB,oBAC1C;KACD,GAAI,sBAAsB,0BAA0B,EAClD,wBAAwB,qBAAqB,wBAC9C;KACD,GAAI,6BAA6B;MAC/B,iBAAiB,0BAA0B;MAC3C,wBAAwB,0BAA0B;MACnD;KACD,GAAI,2BAA2B,iCAAiC,EAC9D,+BAA+B,0BAA0B,+BAC1D;KACF;IACF,CAAC;;;AAIN,QAAO,CAAC,GAAG,oBAAoB,QAAQ,CAAC;;AAG1C,SAAS,8BACP,SACkF;AAClF,KAAI,CAAC,QAAQ,QAAQ,OACnB,QAAO,EAAE;CAGX,MAAM,6CAA6B,IAAI,KAGpC;AAEH,MAAK,MAAM,WAAW,QAAQ,kBAAkB;EAC9C,MAAM,YAAY,QAAQ,QAAQ,OAAO;EACzC,MAAM,gBAAgB,SAAS,WAAW,cAAc;EACxD,MAAM,mBAAmB,MAAM,QAAQ,eAAe,iBAAiB,GACnE,cAAc,mBACd,EAAE;AAEN,OAAK,MAAM,uBAAuB,kBAAkB;GAClD,MAAM,UAAU,SAAS,oBAAoB;AAC7C,OAAI,CAAC,QACH;GAGF,MAAM,oBAAoB,yBAAyB,QAAQ;AAC3D,OAAI,CAAC,qBAAqB,2BAA2B,IAAI,kBAAkB,CACzE;GAGF,MAAM,sBAAsB,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAC9E,8BAA2B,IAAI,mBAAmB;IAChD,IAAI;IACJ,UAAU,sBACR,SACA,oBACA,mBACA,KACE,QAAQ,MAAM,qBACd,uBAAuB,mBAAmB,oBAAoB,CAC/D,CACF;IACD,SAAS;KACP;KACA,GAAG;KACJ;IACF,CAAC;;;AAIN,QAAO,CAAC,GAAG,2BAA2B,QAAQ,CAAC;;AAGjD,SAAS,qBACP,SAC0E;CAC1E,MAAM,qBAAqB,iCAAiC,QAAQ;CACpE,MAAM,yBAAyB,qCAAqC,QAAQ;AAE5E,QAAO,CACL;EACE,IAAI,QAAQ,QAAQ;EACpB,UAAU,sBACR,SACA,WACA,QAAQ,QAAQ,IAChB,KAAK,QAAQ,MAAM,aAAa,WAAW,CAC5C;EACD,SAAS;GACP,WAAW,QAAQ,QAAQ;GAC3B,MAAM,QAAQ,QAAQ;GACtB,aAAa,QAAQ,QAAQ;GAC7B,QAAQ,QAAQ,QAAQ;GACxB,UAAU,QAAQ,QAAQ;GAC1B,QAAQ,cAAc,QAAQ,QAAQ,OAAO;GAC7C,QAAQ,CAAC,GAAG,QAAQ,iBAAiB;GACrC,OAAO,cAAc,QAAQ,QAAQ,MAAM;GAC3C,gBAAgB,cAAc,QAAQ,QAAQ,eAAe;GAC7D,gBAAgB,cAAc,QAAQ,QAAQ,eAAe;GAC7D,oBAAoB,cAAc,QAAQ,QAAQ,mBAAmB;GACrE,sBAAsB,cAAc,QAAQ,QAAQ,qBAAqB;GACzE,GAAI,sBAAsB,EAAE,oBAAoB;GAChD,GAAI,0BAA0B,EAAE,wBAAwB;GACzD;EACF,CACF;;AAGH,SAAS,gBAAgB,SAAsC;AAC7D,KAAI,CAAC,WAAW,OAAO,YAAY,SACjC,OAAM,IAAI,MAAM,2BAA2B;AAE7C,KAAI,CAAC,QAAQ,GACX,OAAM,IAAI,MAAM,yBAAyB;AAE3C,KAAI,CAAC,QAAQ,KACX,OAAM,IAAI,MAAM,2BAA2B;;AAI/C,SAAS,wBACP,SACA,eACa;CACb,MAAM,mCAAmB,IAAI,KAAa;AAC1C,MAAK,MAAM,CAAC,SAAS,cAAc,OAAO,QAAQ,QAAQ,UAAU,EAAE,CAAC,EAAE;EACvE,MAAM,eAAe,gBAAgB,UAAU;AAC/C,MAAI,CAAC,aAAa,UAAU;AAC1B,iBAAc,KAAK;IAAE,IAAI;IAAS,QAAQ,aAAa,UAAU;IAAc,CAAC;AAChF;;AAEF,mBAAiB,IAAI,QAAQ;;AAE/B,QAAO;;AAGT,SAAS,gBACP,WAC0D;CAC1D,MAAM,OAAO,SAAS,UAAU;AAChC,KAAI,CAAC,KACH,QAAO;EAAE,UAAU;EAAO,QAAQ;EAAwB;AAE5D,KAAI,CAAC,KAAK,QAAQ,OAAO,KAAK,SAAS,SACrC,QAAO;EAAE,UAAU;EAAO,QAAQ;EAAgB;AAEpD,KAAI,CAAC,KAAK,qBAAqB,OAAO,KAAK,sBAAsB,SAC/D,QAAO;EAAE,UAAU;EAAO,QAAQ;EAA6B;AAEjE,KACE,CAAC,SAAS,KAAK,UAAU,IAEzB,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,OAE7B,QAAO;EAAE,UAAU;EAAO,QAAQ;EAAyB;AAE7D,QAAO,EAAE,UAAU,MAAM;;AAG3B,SAAS,yCAAyC,SAA0C;CAC1F,MAAM,yCAAyB,IAAI,KAAa;AAEhD,MAAK,MAAM,YAAY,OAAO,OAAO,QAAQ,SAAS,EAAE,CAAC,EAAE;EACzD,MAAM,aAAa,SAAS,SAAS;EACrC,MAAM,wBACJ,cAAc,OAAO,WAAW,0BAA0B,WACtD,WAAW,wBACX;EACN,MAAM,sBACJ,YAAY,eAAe,UAAa,YAAY,eAAe;AAErE,MAAI,yBAAyB,CAAC,oBAC5B,wBAAuB,IAAI,sBAAsB;;AAIrD,QAAO,CAAC,GAAG,uBAAuB;;AAGpC,SAAS,cAAc,OAA0B;CAC/C,MAAM,SAAS,SAAS,MAAM;AAC9B,KAAI,CAAC,OACH,QAAO,EAAE;AAEX,QAAO,OAAO,KAAK,OAAO;;AAG5B,SAAS,yBACP,qBACoB;AACpB,KAAI,OAAO,oBAAoB,OAAO,SACpC,QAAO,oBAAoB;AAE7B,KAAI,OAAO,oBAAoB,SAAS,SACtC,QAAO,oBAAoB;AAE7B,KAAI,OAAO,oBAAoB,SAAS,SACtC,QAAO,oBAAoB;;AAK/B,SAAS,SAAS,OAAqD;AACrE,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D;AAEF,QAAO;;AAGT,SAAS,kCACP,SACA,WACA,eACmD;CACnD,MAAM,sCAAsC,gCAC1C,QAAQ,SACR,QAAQ,iBACT;CACD,MAAM,cAAc,IAAI,IAAY,oBAAoB,UAAU,UAAU,CAAC;AAC7E,KAAI,OAAO,UAAU,sBAAsB,YAAY,UAAU,kBAAkB,SAAS,EAC1F,aAAY,IAAI,UAAU,kBAAkB;AAG9C,KAAI,CAAC,YAAY,KACf,QAAO,EAAE;CAGX,MAAM,YAAY,SAAS,UAAU,UAAU;CAC/C,MAAM,YAA+D,EAAE;AACvE,MAAK,MAAM,cAAc,aAAa;EACpC,MAAM,eAAe,SAAS,YAAY,YAAY;EACtD,MAAM,eAAe,OAAO,cAAc,SAAS,WAAW,aAAa,OAAO;AAClF,YAAU,cAAc,EACtB,MACE,oCAAoC,eACpC,4BAA4B,YAAY,aAAa,EACxD;EAED,MAAM,mBAAmB,QAAQ,2BAA2B,IAAI,YAAY,YAAY;AACxF,MAAI,CAAC,kBAAkB,KACrB;AASF,YAAU,cADR,kBAL+B,uBAC/B,QAAQ,MAAM,aACd,iBAAiB,SAClB,CAE4C,KAAK,kBAAkB,cAAc,GAE9E;GAAE,MAAM,iBAAiB;GAAM,OAAO;GAAM,GAC5C,EAAE,MAAM,iBAAiB,MAAM;;AAGrC,QAAO;;AAGT,SAAS,2CACP,SACA,WACA,eAC+C;CAE/C,MAAM,kBADgB,yBAAyB,UAAU,EAClB;AACvC,KAAI,CAAC,gBACH;CAGF,MAAM,wBAAwB,QAAQ,2BAA2B,IAC/D,iBACA,iBACD;AACD,KAAI,CAAC,uBAAuB,KAC1B;AASF,QADE,kBALoC,uBACpC,QAAQ,MAAM,aACd,sBAAsB,SACvB,CAEiD,KAAK,kBAAkB,cAAc,GAEnF;EAAE,MAAM,sBAAsB;EAAM,OAAO;EAAM,GACjD,EAAE,MAAM,sBAAsB,MAAM;;AAG1C,SAAS,iCACP,SACA,WACA,gBACA,cACuC;CACvC,MAAM,gBAAgB,yBAAyB,UAAU;CACzD,MAAM,kBAAkB,eAAe;AACvC,KAAI,CAAC,gBACH;CAGF,MAAM,wBAAwB,sBAC5B,SACA,kBACA,iBACA,KAAK,QAAQ,MAAM,mBAAmB,GAAG,gBAAgB,KAAK,CAC/D;CACD,MAAM,UAAU,kBAAkB,sBAAsB,KAAK,kBAAkB,eAAe;CAE9F,MAAM,yBACJ,2CAA2C,SAAS,WAAW,eAAe,KAC7E,UACG;EAAE,MAAM,YAAY,gBAAgB;EAAE,OAAO;EAAM,GACnD,EAAE,MAAM,YAAY,gBAAgB,EAAE;CAG5C,MAAM,8BADoB,mCAAmC,aAAa,CACpB,MAAM,iBAC1D,aAAa,WAAW,WAAW,CACpC;CACD,IAAI,uBACF,6CAA6C,SAAS,iBAAiB,sBAAsB,IAC7F,uCAAuC,eAAe,gBAAgB;AAExE,KAAI,CAAC,wBAAwB,4BAC3B,wBAAuB,GAAG,YAAY,gBAAgB,CAAC;AAGzD,QAAO;EACL;EACA;EACA,GAAI,wBAAwB,EAC1B,+BAA+B,UAC3B;GAAE,MAAM;GAAsB,OAAO;GAAM,GAC3C,EAAE,MAAM,sBAAsB,EACnC;EACF;;AAGH,SAAS,yBACP,WAC4D;CAC5D,MAAM,gBACJ,OAAO,UAAU,kBAAkB,WAC/B,EAAE,IAAI,UAAU,eAAe,GAC/B,SAAS,UAAU,cAAc;CACvC,MAAM,kBACJ,iBAAiB,OAAO,cAAc,OAAO,WAAW,cAAc,KAAK;AAC7E,KAAI,CAAC,mBAAmB,CAAC,cACvB;AAGF,QAAO;EACL,IAAI;EACJ,OAAO;EACR;;AAGH,SAAS,uCACP,eACA,iBACoB;CACpB,MAAM,UAAU,cAAc,MAAM;AACpC,KAAI,OAAO,YAAY,YAAY,QAAQ,SAAS,EAClD,QAAO,YAAY,QAAQ;CAG7B,MAAM,gBAAgB,SAAS,QAAQ;AACvC,KAAI,eAAe;AACjB,MAAI,OAAO,cAAc,OAAO,YAAY,cAAc,GACxD,QAAO,YAAY,cAAc,GAAG;AAEtC,MAAI,OAAO,cAAc,SAAS,YAAY,cAAc,KAC1D,QAAO,YAAY,cAAc,KAAK;;AAI1C,KAAI,cAAc,cAAc,MAAM,cAAc,CAClD,QAAO,GAAG,YAAY,gBAAgB,CAAC;;AAM3C,SAAS,mCAAmC,QAA6C;CACvF,MAAM,YAAsB,EAAE;AAC9B,MAAK,MAAM,SAAS,QAAQ;AAC1B,MAAI,OAAO,UAAU,SACnB;AAEF,YAAU,KAAK,GAAG,6BAA6B,MAAM,CAAC;;AAExD,QAAO;;AAGT,SAAS,+CACP,WACa;CACb,MAAM,4BAAY,IAAI,KAAa;AACnC,sCACE,OAAO,UAAU,WAAW,WAAW,UAAU,SAAS,QAC1D,UACD;CAED,MAAM,gBAAgB,SAAS,UAAU,cAAc;AACvD,sCACE,OAAO,eAAe,WAAW,WAAW,cAAc,SAAS,QACnE,UACD;CAED,MAAM,YAAY,SAAS,UAAU,UAAU;AAC/C,KAAI,CAAC,UACH,QAAO;AAGT,MAAK,MAAM,gBAAgB,OAAO,OAAO,UAAU,EAAE;EACnD,MAAM,WAAW,SAAS,aAAa;AACvC,uCACE,OAAO,UAAU,WAAW,WAAW,SAAS,SAAS,QACzD,UACD;;AAGH,QAAO;;AAGT,SAAS,qCACP,OACA,WACM;AACN,KAAI,OAAO,UAAU,SACnB;AAGF,MAAK,MAAM,gBAAgB,6BAA6B,MAAM,EAAE;AAC9D,MAAI,CAAC,aAAa,WAAW,WAAW,CACtC;EAEF,MAAM,aAAa,aAAa,MAAM,EAAkB;AACxD,MAAI,WACF,WAAU,IAAI,WAAW;;;AAK/B,SAAS,gCACP,eACA,yBACyB;AACzB,KAAI,CAAC,wBAAwB,KAC3B,QAAO;AAKT,KADE,OAAO,cAAc,YAAY,YAAY,cAAc,cAAc,QAAQ,IAChD,cAAc,cAAc,cAAc,CAC3E,QAAO;CAGT,MAAM,gBAAgB,CAAC,GAAG,wBAAwB,CAAC,MAAM;CACzD,MAAM,aAAa,OAAO,YACxB,cAAc,KAAK,iBAAiB,CAAC,cAAc,EAAE,MAAM,UAAU,CAAC,CAAC,CACxE;AAED,QAAO;EACL,GAAG;EACH,eAAe;GACb,MAAM;GACN;GACA,UAAU;GACV,sBAAsB;GACvB;EACF;;AAGH,SAAS,4CACP,SACA,cAC0C;CAC1C,MAAM,WAAW,QAAQ;CACzB,MAAM,qBAAiD,EAAE;CACzD,MAAM,yBAAyD,EAAE;CACjE,MAAM,yBAAyB,4BAA4B,QAAQ,QAAQ;CAC3E,MAAM,yBAAyB,2BAA2B,QAAQ,QAAQ;CAC1E,MAAM,6BAA6B,gCACjC,QAAQ,SACR,QAAQ,iBACT;CACD,MAAM,6BAA6B,+BACjC,QAAQ,SACR,QAAQ,iBACT;CACD,MAAM,0BAA0B,6BAA6B,QAAQ,QAAQ;CAC7E,MAAM,0BAA0B,4BAA4B,QAAQ,QAAQ;CAC5E,MAAM,kCAAkC,qCAAqC,QAAQ,QAAQ;CAC7F,MAAM,kCAAkC,oCAAoC,QAAQ,QAAQ;CAE5F,MAAM,oCAAoC,eAA6B;EACrE,MAAM,wBAAwB,2BAA2B;AACzD,MAAI,sBACF,yBAAwB,oBAAoB,aAAa,YAAY,sBAAsB;EAG7F,MAAM,wBAAwB,2BAA2B;AACzD,MAAI,sBACF,6BACE,wBACA,aACA,YACA,sBACD;;CAIL,MAAM,iCAAiC,YAA0B;EAC/D,MAAM,qBAAqB,wBAAwB;AACnD,MAAI,mBACF,yBAAwB,oBAAoB,UAAU,SAAS,mBAAmB;EAGpF,MAAM,qBAAqB,wBAAwB;AACnD,MAAI,mBACF,6BAA4B,wBAAwB,UAAU,SAAS,mBAAmB;;CAI9F,MAAM,yCAAyC,oBAAkC;EAC/E,MAAM,6BAA6B,gCAAgC;AACnE,MAAI,2BACF,yBACE,oBACA,kBACA,iBACA,2BACD;EAGH,MAAM,6BAA6B,gCAAgC;AACnE,MAAI,2BACF,6BACE,wBACA,kBACA,iBACA,2BACD;;CAIL,MAAM,SAAS,MAAM,QAAQ,aAAa,OAAO,GAAG,aAAa,SAAS,EAAE;AAC5E,MAAK,MAAM,QAAQ,QAAQ;EACzB,MAAM,eAAe,SAAS,KAAK;EACnC,MAAM,SACJ,OAAO,SAAS,WACZ,OACA,gBAAgB,OAAO,aAAa,WAAW,WAC7C,aAAa,SACb;AACR,MAAI,CAAC,OACH;AAGF,0BACE,oBACA,SACA,QACA,uBAAuB,WAAW,oBAAoB,OAAO,CAC9D;AACD,8BACE,wBACA,SACA,QACA,uBAAuB,WAAW,YAAY,OAAO,CACtD;AAED,MAAI,UAAU;AACZ,oCAAiC,UAAU,oBAAoB,SAAS,QAAQ,QAAQ;AACxF,oCACE,UACA,oBACA,SACA,QACA,gBACD;GACD,MAAM,gBAAgB,SAAS,IAAI,QAAQ,gBAAgB,IAAI,SAAS,IAAI,QAAQ,QAAQ;AAC5F,OAAI,eAAe,SACjB,6BACE,wBACA,SACA,QACA,sBAAsB,cAAc,SAAS,CAC9C;;;CAKP,MAAM,gBAAgB,MAAM,QAAQ,aAAa,cAAc,GAAG,aAAa,gBAAgB,EAAE;AACjG,MAAK,MAAM,QAAQ,eAAe;AAChC,MAAI,OAAO,SAAS,UAAU;AAC5B,oCAAiC,KAAK;AACtC,iCAA8B,KAAK;AACnC,yCAAsC,KAAK;AAC3C;;EAGF,MAAM,oBAAoB,SAAS,KAAK;AACxC,MAAI,OAAO,mBAAmB,eAAe,SAC3C,kCAAiC,kBAAkB,WAAW;AAEhE,MAAI,OAAO,mBAAmB,YAAY,SACxC,+BAA8B,kBAAkB,QAAQ;AAE1D,MAAI,OAAO,mBAAmB,oBAAoB,SAChD,uCAAsC,kBAAkB,gBAAgB;;CAI5E,MAAM,gBAAgB,oBAAoB,aAAa,cAAc;AACrE,MAAK,MAAM,oBAAoB,eAAe;AAC5C,mCAAiC,iBAAiB;AAClD,gCAA8B,iBAAiB;AAC/C,wCAAsC,iBAAiB;;AAGzD,KAAI,UAAU;AACZ,OAAK,MAAM,QAAQ,eAAe;AAChC,OAAI,OAAO,SAAS,UAAU;AAC5B,kDAA8C,UAAU,oBAAoB,MAAM;KAChF,CAAC,aAAa,YAAY;KAC1B,CAAC,UAAU,SAAS;KACpB,CAAC,kBAAkB,iBAAiB;KACrC,CAAC;AACF,yCACE,UACA,wBACA,aACA,MACA,YACD;AACD,yCACE,UACA,wBACA,UACA,MACA,SACD;AACD,yCACE,UACA,wBACA,kBACA,MACA,iBACD;AACD;;GAGF,MAAM,oBAAoB,SAAS,KAAK;AACxC,OAAI,CAAC,kBACH;AAGF,OAAI,OAAO,kBAAkB,eAAe,UAAU;AACpD,qCACE,UACA,oBACA,aACA,kBAAkB,YAClB,YACD;AACD,yCACE,UACA,wBACA,aACA,kBAAkB,YAClB,YACD;AACD;;AAEF,OAAI,OAAO,kBAAkB,YAAY,UAAU;AACjD,qCACE,UACA,oBACA,UACA,kBAAkB,SAClB,SACD;AACD,yCACE,UACA,wBACA,UACA,kBAAkB,SAClB,SACD;AACD;;AAEF,OAAI,OAAO,kBAAkB,oBAAoB,UAAU;AACzD,qCACE,UACA,oBACA,kBACA,kBAAkB,iBAClB,iBACD;AACD,yCACE,UACA,wBACA,kBACA,kBAAkB,iBAClB,iBACD;;;AAIL,OAAK,MAAM,oBAAoB,eAAe;AAC5C,iDACE,UACA,oBACA,kBACA;IACE,CAAC,aAAa,YAAY;IAC1B,CAAC,UAAU,SAAS;IACpB,CAAC,kBAAkB,iBAAiB;IACrC,CACF;AACD,wCACE,UACA,wBACA,aACA,kBACA,YACD;AACD,wCACE,UACA,wBACA,UACA,kBACA,SACD;AACD,wCACE,UACA,wBACA,kBACA,kBACA,iBACD;;EAGH,MAAM,mBAAmB,oBAAoB,aAAa,eAAe;AACzE,OAAK,MAAM,mBAAmB,iBAC5B,kCACE,UACA,oBACA,kBACA,iBACA,iBACD;EAGH,MAAM,uBAAuB,oBAAoB,aAAa,mBAAmB;AACjF,OAAK,MAAM,uBAAuB,qBAChC,kCACE,UACA,oBACA,sBACA,qBACA,qBACD;;AAIL,QAAO,OAAO,KAAK,mBAAmB,CAAC,SAAS,KAC9C,OAAO,KAAK,uBAAuB,CAAC,SAAS,IAC3C;EACE,GAAI,OAAO,KAAK,mBAAmB,CAAC,SAAS,KAAK,EAAE,oBAAoB;EACxE,GAAI,OAAO,KAAK,uBAAuB,CAAC,SAAS,KAAK,EAAE,wBAAwB;EACjF,GACD;;AAGN,SAAS,8CACP,UACA,WACA,aACA,YACM;AACN,MAAK,MAAM,CAAC,cAAc,kBAAkB,YAAY;EACtD,MAAM,YAAY,SAAS,IAAI,aAAa,cAAc;AAC1D,MAAI,CAAC,WAAW,KACd;AAGF,0BAAwB,WAAW,cAAc,aAAa,UAAU,KAAK;AAC7E;;;AAIJ,SAAS,iCACP,UACA,WACA,cACA,aACA,eACM;CACN,MAAM,YAAY,SAAS,IAAI,aAAa,cAAc;AAC1D,KAAI,CAAC,WAAW,KACd;AAGF,yBAAwB,WAAW,cAAc,aAAa,UAAU,KAAK;;AAG/E,SAAS,qCACP,UACA,WACA,cACA,aACA,eACM;CACN,MAAM,YAAY,SAAS,IAAI,aAAa,cAAc;AAC1D,KAAI,CAAC,WAAW,SACd;AAOF,6BAA4B,WAAW,cAAc,aAHnD,kBAAkB,WAAW,kBAAkB,kBAC3C,sBAAsB,UAAU,SAAS,GACzC,eAAe,SAAS,UAAU,SAAS,CAAC,CAC8B;;AAGlF,SAAS,wBACP,WACA,cACA,aACA,eACM;CACN,MAAM,cAAc,UAAU,iBAAiB,EAAE;AACjD,aAAY,eAAe;AAC3B,WAAU,gBAAgB;;AAG5B,SAAS,4BACP,WACA,cACA,aACA,eACM;CACN,MAAM,cAAc,UAAU,iBAAiB,EAAE;AACjD,aAAY,eAAe;AAC3B,WAAU,gBAAgB;;AAG5B,SAAS,4BAA4B,SAAwD;CAC3F,MAAM,yBAAiD,EAAE;AAEzD,MAAK,MAAM,CAAC,QAAQ,aAAa,OAAO,QAAQ,QAAQ,SAAS,EAAE,CAAC,EAAE;EACpE,MAAM,WAAW,SAAS,SAAS,EAAE;AAKrC,yBAAuB,UAHrB,OAAO,aAAa,YAAY,SAAS,SAAS,IAC9C,oBAAoB,SAAS,GAC7B,oBAAoB,OAAO;;AAInC,MAAK,MAAM,qBAAqB,2BAA2B,QAAQ,CACjE,wBAAuB,kBAAkB,kBAAkB,oBACzD,kBAAkB,WACnB;AAGH,QAAO;;AAGT,SAAS,2BAA2B,SAAwD;CAC1F,MAAM,cAAc,OAAO,QAAQ,QAAQ,SAAS,EAAE,CAAC;CACvD,MAAM,oBAAoB,6BAA6B,YAAY;CACnE,MAAM,wBAAgD,EAAE;AAExD,MAAK,MAAM,CAAC,WAAW,YACrB,uBAAsB,UAAU,eAAe,kBAAkB,QAAQ;CAG3E,MAAM,sBAAsB,2BAA2B,QAAQ;CAC/D,MAAM,4BAA4B,6BAChC,oBAAoB,KAAK,EAAE,gBAAgB,eAAe,CAAC,gBAAgB,EAAE,MAAM,UAAU,CAAC,CAAC,CAChG;AACD,MAAK,MAAM,EAAE,oBAAoB,oBAC/B,uBAAsB,kBAAkB,eACtC,0BAA0B,gBAC3B;AAGH,QAAO;;AAGT,SAAS,kCAAkC,SAAwD;CACjG,MAAM,+BAAuD,EAAE;CAC/D,MAAM,wCAAwB,IAAI,KAAqB;AAEvD,MAAK,MAAM,CAAC,cAAc,mBAAmB,OAAO,QAAQ,QAAQ,wBAAwB,EAAE,CAAC,EAAE;EAC/F,MAAM,iBAAiB,SAAS,eAAe,EAAE;EACjD,MAAM,oBACJ,OAAO,mBAAmB,YAAY,eAAe,SAAS,IAC1D,0BAA0B,eAAe,GACzC,0BAA0B,aAAa;EAC7C,MAAM,aAAa,sBAAsB,IAAI,kBAAkB,IAAI;AACnE,wBAAsB,IAAI,mBAAmB,aAAa,EAAE;AAC5D,+BAA6B,gBAC3B,eAAe,IAAI,oBAAoB,GAAG,oBAAoB;;AAGlE,QAAO;;AAGT,SAAS,iCAAiC,SAAwD;CAChG,MAAM,oBAAoB,OAAO,QAAQ,QAAQ,wBAAwB,EAAE,CAAC;CAC5E,MAAM,0BAA0B,6BAA6B,kBAAkB;CAC/E,MAAM,8BAAsD,EAAE;AAE9D,MAAK,MAAM,CAAC,iBAAiB,kBAC3B,6BAA4B,gBAAgB,eAC1C,wBAAwB,cACzB;AAGH,QAAO;;AAGT,SAAS,qCACP,SACwB;CACxB,MAAM,kCAA0D,EAAE;CAClE,MAAM,wCAAwB,IAAI,KAAqB;AAEvD,MAAK,MAAM,CAAC,iBAAiB,sBAAsB,OAAO,QAAQ,QAAQ,kBAAkB,EAAE,CAAC,EAAE;EAC/F,MAAM,oBAAoB,6BACxB,+BAA+B,iBAAiB,kBAAkB,CACnE;EACD,MAAM,aAAa,sBAAsB,IAAI,kBAAkB,IAAI;AACnE,wBAAsB,IAAI,mBAAmB,aAAa,EAAE;AAC5D,kCAAgC,mBAC9B,eAAe,IAAI,oBAAoB,GAAG,oBAAoB;;AAGlE,QAAO;;AAGT,SAAS,oCACP,SACwB;CACxB,MAAM,uBAAuB,OAAO,QAAQ,QAAQ,kBAAkB,EAAE,CAAC,CAAC,KACvE,CAAC,iBAAiB,uBACjB,CACE,iBACA,EAAE,MAAM,+BAA+B,iBAAiB,kBAAkB,EAAE,CAC7E,CACJ;CACD,MAAM,6BAA6B,6BAA6B,qBAAqB;CACrF,MAAM,iCAAyD,EAAE;AAEjE,MAAK,MAAM,CAAC,oBAAoB,qBAC9B,gCAA+B,mBAAmB,eAChD,2BAA2B,iBAC5B;AAGH,QAAO;;AAGT,SAAS,gCACP,SACA,UACwB;CACxB,MAAM,6BAAqD,EAAE;CAC7D,MAAM,oBACJ,aAAa,SAAY,CAAC,GAAG,SAAS,GAAG,OAAO,KAAK,QAAQ,UAAU,EAAE,CAAC;AAC5E,MAAK,MAAM,WAAW,mBAAmB;EACvC,MAAM,YAAY,QAAQ,SAAS;EACnC,MAAM,YAAY,SAAS,WAAW,UAAU;AAChD,MAAI,CAAC,UACH;AAGF,OAAK,MAAM,CAAC,YAAY,iBAAiB,OAAO,QAAQ,UAAU,EAAE;GAClE,MAAM,eAAe,SAAS,aAAa,EAAE;AAC7C,8BAA2B,cAAc,4BACvC,YACA,OAAO,iBAAiB,WAAW,eAAe,OACnD;;;AAIL,QAAO;;AAGT,SAAS,+BACP,SACA,UACwB;CACxB,MAAM,4BAAoD,EAAE;CAC5D,MAAM,oBACJ,aAAa,SAAY,CAAC,GAAG,SAAS,GAAG,OAAO,KAAK,QAAQ,UAAU,EAAE,CAAC;AAC5E,MAAK,MAAM,WAAW,mBAAmB;EACvC,MAAM,YAAY,QAAQ,SAAS;EACnC,MAAM,YAAY,SAAS,WAAW,UAAU;AAChD,MAAI,CAAC,UACH;AAGF,OAAK,MAAM,CAAC,YAAY,iBAAiB,OAAO,QAAQ,UAAU,EAAE;GAClE,MAAM,eAAe,SAAS,aAAa,EAAE;AAC7C,6BAA0B,cAAc,eACtC,uBACE,YACA,OAAO,iBAAiB,WAAW,eAAe,OACnD,CACF;;;AAIL,QAAO;;AAGT,SAAS,6BAA6B,SAAwD;CAC5F,MAAM,0BAAkD,EAAE;AAC1D,MAAK,MAAM,WAAW,OAAO,KAAK,QAAQ,UAAU,EAAE,CAAC,CACrD,yBAAwB,WAAW,YAAY,QAAQ;AAEzD,QAAO;;AAGT,SAAS,4BAA4B,SAAwD;CAC3F,MAAM,yBAAiD,EAAE;AACzD,MAAK,MAAM,CAAC,SAAS,cAAc,OAAO,QAAQ,QAAQ,UAAU,EAAE,CAAC,EAAE;EACvE,MAAM,YAAY,SAAS,UAAU,EAAE;AACvC,yBAAuB,WAAW,eAChC,uBAAuB,SAAS,OAAO,cAAc,WAAW,YAAY,OAAU,CACvF;;AAEH,QAAO;;AAGT,SAAS,iCACP,SACuC;CACvC,MAAM,YAAuC,EAAE;AAC/C,uCAAsC,QAAQ,SAAS,UAAU;CAEjE,MAAM,WAAW,QAAQ;AACzB,KAAI,CAAC,SACH,QAAO,OAAO,KAAK,UAAU,CAAC,SAAS,IAAI,YAAY;AAGzD,MAAK,MAAM,WAAW,QAAQ,iBAC5B,4CAA2C,UAAU,WAAW,UAAU,SAAS,SAAS;CAG9F,MAAM,UAAU,cAAc,QAAQ,QAAQ,MAAM;AACpD,MAAK,MAAM,UAAU,SAAS;AAC5B,MACE,2CACE,UACA,WACA,SACA,QACA,gBACD,CAED;AAGF,6CAA2C,UAAU,WAAW,SAAS,QAAQ,QAAQ;;CAG3F,MAAM,mBAAmB,cAAc,QAAQ,QAAQ,eAAe;AACtE,MAAK,MAAM,mBAAmB,iBAC5B,4CACE,UACA,WACA,kBACA,iBACA,iBACD;CAGH,MAAM,mBAAmB,cAAc,QAAQ,QAAQ,eAAe;AACtE,MAAK,MAAM,mBAAmB,iBAC5B,4CACE,UACA,WACA,kBACA,iBACA,iBACD;CAGH,MAAM,uBAAuB,cAAc,QAAQ,QAAQ,mBAAmB;AAC9E,MAAK,MAAM,uBAAuB,qBAChC,4CACE,UACA,WACA,sBACA,qBACA,qBACD;CAGH,MAAM,gBAAgB,cAAc,QAAQ,QAAQ,qBAAqB;AACzE,MAAK,MAAM,gBAAgB,cACzB,4CACE,UACA,WACA,wBACA,cACA,cACD;AAGH,QAAO,OAAO,KAAK,UAAU,CAAC,SAAS,IAAI,YAAY;;AAGzD,SAAS,sCACP,SACA,WACM;AACN,MAAK,MAAM,CAAC,QAAQ,aAAa,OAAO,QAAQ,QAAQ,SAAS,EAAE,CAAC,EAAE;EACpE,MAAM,WAAW,SAAS,SAAS,EAAE;AAKrC,iCAA+B,WAAW,SAAS,QAHjD,OAAO,aAAa,YAAY,SAAS,SAAS,IAC9C,oBAAoB,SAAS,GAC7B,oBAAoB,OAAO,CACwC;;AAG3E,MAAK,MAAM,CAAC,cAAc,mBAAmB,OAAO,QAAQ,QAAQ,wBAAwB,EAAE,CAAC,EAAE;EAC/F,MAAM,iBAAiB,SAAS,eAAe,EAAE;AAKjD,iCAA+B,WAAW,wBAAwB,cAHhE,OAAO,mBAAmB,YAAY,eAAe,SAAS,IAC1D,0BAA0B,eAAe,GACzC,0BAA0B,aAAa,CACiD;;CAGhG,MAAM,kCAAkC,qCAAqC,QAAQ;AACrF,MAAK,MAAM,CAAC,iBAAiB,kBAAkB,OAAO,QAAQ,gCAAgC,CAC5F,gCAA+B,WAAW,kBAAkB,iBAAiB,cAAc;;AAI/F,SAAS,qCACP,SAC2C;CAC3C,MAAM,YAA2C,EAAE;AAEnD,KAAI,QAAQ,QAAQ,OAClB,MAAK,MAAM,WAAW,QAAQ,kBAAkB;EAC9C,MAAM,YAAY,SAAS,QAAQ,QAAQ,OAAO,SAAS;AAE3D,iCACE,WACA,UACA,SACA,eAAe,uBAAuB,SALtB,OAAO,WAAW,SAAS,WAAW,UAAU,OAAO,OAKd,CAAC,CAC3D;;CAIL,MAAM,cAAc,OAAO,QAAQ,QAAQ,QAAQ,SAAS,EAAE,CAAC;CAC/D,MAAM,oBAAoB,6BAA6B,YAAY;AACnE,MAAK,MAAM,CAAC,WAAW,YACrB,gCACE,WACA,SACA,QACA,eAAe,kBAAkB,QAAQ,CAC1C;CAGH,MAAM,oBAAoB,OAAO,QAAQ,QAAQ,QAAQ,wBAAwB,EAAE,CAAC;CACpF,MAAM,0BAA0B,6BAA6B,kBAAkB;AAC/E,MAAK,MAAM,CAAC,iBAAiB,kBAC3B,gCACE,WACA,wBACA,cACA,eAAe,wBAAwB,cAAc,CACtD;CAGH,MAAM,kCAAkC,oCAAoC,QAAQ,QAAQ;AAC5F,MAAK,MAAM,CAAC,iBAAiB,kBAAkB,OAAO,QAAQ,gCAAgC,CAC5F,gCAA+B,WAAW,kBAAkB,iBAAiB,cAAc;CAG7F,MAAM,WAAW,QAAQ;AACzB,KAAI,UAAU;AACZ,OAAK,MAAM,WAAW,QAAQ,kBAAkB;GAC9C,MAAM,iBAAiB,SAAS,IAAI,SAAS,SAAS;AACtD,OAAI,gBAAgB,SAClB,gCACE,WACA,UACA,SACA,eAAe,SAAS,eAAe,SAAS,CAAC,CAClD;;AAIL,OAAK,MAAM,UAAU,cAAc,QAAQ,QAAQ,MAAM,EAAE;GACzD,MAAM,gBAAgB,SAAS,IAAI,QAAQ,gBAAgB,IAAI,SAAS,IAAI,QAAQ,QAAQ;AAC5F,OAAI,eAAe,SACjB,gCACE,WACA,SACA,QACA,sBAAsB,cAAc,SAAS,CAC9C;;AAIL,OAAK,MAAM,gBAAgB,cAAc,QAAQ,QAAQ,qBAAqB,EAAE;GAC9E,MAAM,sBAAsB,SAAS,IAAI,cAAc,cAAc;AACrE,OAAI,qBAAqB,SACvB,gCACE,WACA,wBACA,cACA,eAAe,SAAS,oBAAoB,SAAS,CAAC,CACvD;;AAIL,OAAK,MAAM,mBAAmB,cAAc,QAAQ,QAAQ,eAAe,EAAE;GAC3E,MAAM,yBAAyB,SAAS,IAAI,iBAAiB,iBAAiB;AAC9E,OAAI,wBAAwB,SAC1B,gCACE,WACA,kBACA,iBACA,eAAe,SAAS,uBAAuB,SAAS,CAAC,CAC1D;;;AAKP,QAAO,OAAO,KAAK,UAAU,CAAC,SAAS,IAAI,YAAY;;AAGzD,SAAS,+BACP,WACA,cACA,aACA,eACM;CACN,MAAM,cAAc,UAAU,iBAAiB,EAAE;AACjD,aAAY,eAAe;AAC3B,WAAU,gBAAgB;;AAG5B,SAAS,eAAe,UAA0B;AAChD,QAAO,SAAS,QAAQ,YAAY,GAAG;;AAGzC,SAAS,sBAAsB,UAA0B;CACvD,MAAM,qBAAqB,kBAAkB,SAAS;CAEtD,MAAM,aAAa,mBAAmB,YADjB,UAC0C;AAC/D,KAAI,cAAc,GAAG;EACnB,IAAI,aAAa,eAAe,mBAAmB,MAAM,aAAa,EAAoB,CAAC;AAC3F,MAAI,WAAW,SAAS,SAAS,CAC/B,cAAa,WAAW,MAAM,GAAG,GAAiB;AAEpD,MAAI,WAAW,SAAS,EACtB,QAAO;;CAIX,MAAM,iBAAiB,eAAe,SAAS,mBAAmB,CAAC;AACnE,KAAI,mBAAmB,QACrB,QAAO,eAAe,SAAS,QAAQ,mBAAmB,CAAC,CAAC;AAE9D,QAAO;;AAGT,SAAS,+BACP,iBACA,mBACQ;AACR,KAAI,kBAAkB,gBAAgB,CACpC,QAAO;CAGT,MAAM,oBAAoB,SAAS,kBAAkB,EAAE;AACvD,KAAI,OAAO,sBAAsB,YAAY,kBAAkB,SAAS,EACtE,QAAO;AAGT,QAAO;;AAGT,SAAS,6BAA6B,OAAuB;CAC3D,MAAM,OAAO,YAAY,MAAM;AAC/B,QAAO,KAAK,SAAS,QAAQ,GAAG,OAAO,GAAG,KAAK;;AAGjD,SAAS,6BAA6B,SAA2D;CAC/F,MAAM,+BAAe,IAAI,KAAqB;CAC9C,MAAM,gBAAwC,EAAE;AAEhD,MAAK,MAAM,CAAC,aAAa,kBAAkB,SAAS;EAClD,MAAM,OAAO,SAAS,cAAc,EAAE;EACtC,MAAM,WAAW,oBAAoB,aAAa,OAAO,SAAS,WAAW,OAAO,OAAU;EAC9F,MAAM,aAAa,aAAa,IAAI,SAAS,IAAI;AACjD,eAAa,IAAI,UAAU,aAAa,EAAE;AAG1C,gBAAc,eAAe,GADhB,eAAe,IAAI,WAAW,GAAG,SAAS,GAAG,aACrB;;AAGvC,QAAO;;AAGT,SAAS,oBAAoB,aAAqB,MAAkC;CAClF,MAAM,WAAW,OAAO,YAAY,KAAK,GAAG;AAC5C,KAAI,SAAS,SAAS,EACpB,QAAO;CAGT,MAAM,SAAS,YAAY,YAAY;AACvC,KAAI,OAAO,SAAS,EAClB,QAAO;AAGT,QAAO;;AAGT,SAAS,2CACP,UACA,WACA,cACA,aACA,eACS;CACT,MAAM,YAAY,SAAS,IAAI,aAAa,cAAc;AAC1D,KAAI,CAAC,WAAW,KACd,QAAO;CAGT,MAAM,cAAc,UAAU,iBAAiB,EAAE;AACjD,aAAY,eAAe,UAAU;AACrC,WAAU,gBAAgB;AAC1B,QAAO;;AAGT,SAAS,oBAAoB,OAA0B;AACrD,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MACJ,KAAK,SAAS;AACb,MAAI,OAAO,SAAS,SAClB,QAAO;EAET,MAAMA,WAAS,SAAS,KAAK;AAC7B,MAAIA,YAAU,OAAOA,SAAO,OAAO,SACjC,QAAOA,SAAO;GAGhB,CACD,QAAQ,OAAqB,CAAC,CAAC,GAAG;CAGvC,MAAM,SAAS,SAAS,MAAM;AAC9B,KAAI,CAAC,OACH,QAAO,EAAE;AAGX,QAAO,OAAO,KAAK,OAAO;;AAG5B,SAAS,sBACP,SACA,eACA,aACA,kBACQ;CACR,MAAM,oBAAoB,QAAQ,2BAA2B,IAAI,aAAa,cAAc;AAC5F,KAAI,CAAC,mBAAmB,SACtB,QAAO;AAGT,QAAO,uBAAuB,QAAQ,MAAM,aAAa,kBAAkB,SAAS;;AAGtF,SAAS,uBAAuB,aAAqB,UAA0B;AAC7E,KAAI,SAAS,WAAW,IAAI,CAC1B,QAAO;AAET,QAAO,KAAK,aAAa,SAAS;;AAGpC,SAAS,kBAAkB,UAA0B;AACnD,QAAO,SAAS,WAAW,MAAM,IAAI;;AAGvC,SAAS,oBACP,UACA,SACA,WACM;AACN,WAAU,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;CAEjD,MAAM,mBACJ,cAAc,WAAW,WAAW,SAAS,GACzC,YAAY,aAAa,UAAU,OAAO,EAAE,QAAQ,GACpD;CAEN,MAAM,aAAa,uBAAuB,CAAC,iBAAiB,gBAAgB,kBAAkB,EAC5F,WAAW,MACZ,CAAC;CAEF,MAAM,uBAAuB,oCAC3B,qBAAqB,WAAW,CACjC;AACD,YAAW,YAAY;AACvB,eAAc,UAAU,GAAG,qBAAqB,aAAa,CAAC,SAAS,CAAC,IAAI;;AAG9E,SAAS,YAAY,iBAAyB,kBAAkC;AAC9E,KAAI;AACF,SAAO,qBAAqB,iBAAiB,iBAAiB;UACvD,OAAO;AACd,UAAQ,KACN,+FAA+F,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACtJ;AACD,SAAO;;;AAIX,SAAS,qBAAqB,YAAoC;AAChE,MAAK,MAAM,iBAAiB,WAAW,qBAAqB,WAAW,wBAAwB,CAC7F,MAAK,MAAM,YAAY,cAAc,eAAe,EAAE;AACpD,MAAI,CAAC,KAAK,qBAAqB,SAAS,CACtC;EAEF,MAAM,WAAW,SAAS,aAAa;EACvC,MAAM,cAAc,SAAS,gBAAgB;AAC7C,MAAI,CAAC,KAAK,aAAa,SAAS,IAAI,CAAC,eAAe,CAAC,KAAK,aAAa,YAAY,CACjF;AAEF,MAAI,SAAS,SAAS,KAAK,YAAY,SAAS,CAC9C;AAEF,WAAS,gBAAgB,SAAS,SAAS,CAAC;;AAGhD,QAAO;;AAGT,SAAS,oCAAoC,YAAoC;CAC/E,IAAI,QAAQ;AACZ,QAAO,OAAO;AACZ,UAAQ;EACR,MAAM,qBAAqB,WAAW,uBAAuB;AAC7D,OAAK,MAAM,qBAAqB,oBAAoB;GAClD,MAAM,iBAAiB,kBAAkB,UAAU;GACnD,MAAM,mBAAmB,WAAW,eAAe;GACnD,MAAM,iBAAiB,iBAAiB,QAAQ,kBAAkB;AAClE,OAAI,kBAAkB,EACpB;GAGF,IAAI;AACJ,QAAK,MAAM,eAAe,kBAAkB,iBAAiB,CAC3D,MAAK,MAAM,iBAAiB,YAAY,uBAAuB,EAAE;AAC/D,QAAI,cAAc,eAAe,KAAK,WACpC;AAIF,QADmB,cAAc,WAAW,KACzB,YACjB;AAGF,QAAI,cAAc,UAAU,IAAI,eAC9B;AAGF,QAAI,8BAA8B,cAAc,CAC9C;IAGF,MAAM,oBAAoB,cAAc,kBAAkB,aAAa;AACrE,YAAO,KAAK,YAAY,SAAS,IAAI,SAAS,gBAAgB,WAAW,WAAW;MACpF;AACF,QAAI,CAAC,kBACH;IAGF,MAAM,yBAAyB,iBAAiB,QAAQ,kBAAkB;AAC1E,QAAI,2BAA2B,MAAM,0BAA0B,eAC7D;AAGF,kBACE,gBAAgB,SACZ,yBACA,KAAK,IAAI,aAAa,uBAAuB;;AAIvD,OAAI,gBAAgB,OAClB;GAGF,MAAM,gBAAgB,kBAAkB,SAAS;AACjD,qBAAkB,QAAQ;AAC1B,cAAW,iBAAiB,aAAa,CAAC,cAAc,CAAC;AACzD,WAAQ;AACR;;;AAGJ,QAAO;;AAGT,SAAS,8BAA8B,eAA8B;AACnE,QAAO,QACL,cAAc,kBAAkB,aAAa;AAC3C,SACE,KAAK,gBAAgB,SAAS,IAC9B,KAAK,sBAAsB,SAAS,IACpC,KAAK,qBAAqB,SAAS,IACnC,KAAK,oBAAoB,SAAS,IAClC,KAAK,yBAAyB,SAAS,IACvC,KAAK,yBAAyB,SAAS;GAEzC,CACH"}
|
|
1
|
+
{"version":3,"file":"introspect-generator.js","names":[],"sources":["../../../src/commands/pull-v4/introspect-generator.ts"],"sourcesContent":["import type { FullProjectDefinition } from '@inkeep/agents-core';\nimport { buildComponentRegistryFromParsing } from './component-parser';\nimport { GenerationResolver } from './generation-resolver';\nimport {\n collectCompleteAgentIds,\n type GenerationContext,\n type ProjectPaths,\n type SkippedAgent,\n validateProject,\n} from './generation-types';\nimport { generationTasks } from './generators';\nimport { writeTypeScriptFile } from './typescript-file-writer';\n\nexport type { ProjectPaths } from './generation-types';\n\nexport interface IntrospectOptions {\n project: FullProjectDefinition;\n paths: ProjectPaths;\n writeMode?: 'merge' | 'overwrite';\n debug?: boolean;\n}\n\nexport async function introspectGenerate({\n project,\n paths,\n writeMode = 'merge',\n debug = false,\n}: IntrospectOptions): Promise<void> {\n validateProject(project);\n\n const skippedAgents: SkippedAgent[] = [];\n const completeAgentIds = collectCompleteAgentIds(project, skippedAgents);\n const existingComponentRegistry =\n writeMode === 'merge' ? buildComponentRegistryFromParsing(paths.projectRoot, debug) : undefined;\n const resolver = new GenerationResolver({\n project,\n projectRoot: paths.projectRoot,\n completeAgentIds,\n existingComponentRegistry,\n });\n const context: GenerationContext = {\n project,\n paths,\n completeAgentIds,\n existingComponentRegistry,\n resolver,\n };\n const generatedFiles: string[] = [];\n\n for (const task of Object.values(generationTasks)) {\n const records = task.collect(context);\n for (const record of records) {\n const sourceFile = task.generate(record.payload);\n writeTypeScriptFile(record.filePath, sourceFile.getFullText(), writeMode);\n generatedFiles.push(record.filePath);\n }\n }\n\n if (debug) {\n console.log(`Generated ${generatedFiles.length} files`);\n if (skippedAgents.length) {\n console.log(\n `Skipped ${skippedAgents.length} agent(s): ${skippedAgents\n .map((agent) => `${agent.id} (${agent.reason})`)\n .join(', ')}`\n );\n }\n }\n}\n"],"mappings":";;;;;;;AAsBA,eAAsB,mBAAmB,EACvC,SACA,OACA,YAAY,SACZ,QAAQ,SAC2B;AACnC,iBAAgB,QAAQ;CAExB,MAAM,gBAAgC,EAAE;CACxC,MAAM,mBAAmB,wBAAwB,SAAS,cAAc;CACxE,MAAM,4BACJ,cAAc,UAAU,kCAAkC,MAAM,aAAa,MAAM,GAAG;CAOxF,MAAM,UAA6B;EACjC;EACA;EACA;EACA;EACA,UAXe,IAAI,mBAAmB;GACtC;GACA,aAAa,MAAM;GACnB;GACA;GACD,CAAC;EAOD;CACD,MAAM,iBAA2B,EAAE;AAEnC,MAAK,MAAM,QAAQ,OAAO,OAAO,gBAAgB,EAAE;EACjD,MAAM,UAAU,KAAK,QAAQ,QAAQ;AACrC,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,aAAa,KAAK,SAAS,OAAO,QAAQ;AAChD,uBAAoB,OAAO,UAAU,WAAW,aAAa,EAAE,UAAU;AACzE,kBAAe,KAAK,OAAO,SAAS;;;AAIxC,KAAI,OAAO;AACT,UAAQ,IAAI,aAAa,eAAe,OAAO,QAAQ;AACvD,MAAI,cAAc,OAChB,SAAQ,IACN,WAAW,cAAc,OAAO,aAAa,cAC1C,KAAK,UAAU,GAAG,MAAM,GAAG,IAAI,MAAM,OAAO,GAAG,CAC/C,KAAK,KAAK,GACd"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { createInMemoryProject } from "./utils.js";
|
|
1
|
+
import { createInMemoryProject } from "./utils/factory-writer.js";
|
|
2
|
+
import "./utils/index.js";
|
|
2
3
|
import { Node, SyntaxKind } from "ts-morph";
|
|
3
4
|
|
|
4
5
|
//#region src/commands/pull-v4/module-merge.ts
|
|
@@ -370,9 +371,7 @@ function readStringLiteralObjectProperty(objectLiteral, propertyName) {
|
|
|
370
371
|
return initializer.getLiteralValue();
|
|
371
372
|
}
|
|
372
373
|
function formatCollectionLiteralText(originalText, itemTexts, openToken, closeToken) {
|
|
373
|
-
if (originalText.includes("\n")) return `${openToken}\n${itemTexts.
|
|
374
|
-
return line.replaceAll(/^\s+\*/gm, " *");
|
|
375
|
-
}).join(",\n")}${closeToken}`;
|
|
374
|
+
if (originalText.includes("\n")) return `${openToken}\n${itemTexts.join(",\n")}${closeToken}`;
|
|
376
375
|
const openingWithSpacing = originalText.startsWith(`${openToken} `) ? `${openToken} ` : openToken;
|
|
377
376
|
const closingWithSpacing = originalText.endsWith(` ${closeToken}`) ? ` ${closeToken}` : closeToken;
|
|
378
377
|
return `${openingWithSpacing}${itemTexts.join(", ")}${closingWithSpacing}`;
|
|
@@ -385,10 +384,20 @@ function applyTextReplacements(sourceText, replacements) {
|
|
|
385
384
|
return nextText;
|
|
386
385
|
}
|
|
387
386
|
function withPreservedLeadingComments(existingStatement, replacementText) {
|
|
388
|
-
const leadingComments = existingStatement.getLeadingCommentRanges().map((comment) => comment.getText()).join("\n");
|
|
387
|
+
const leadingComments = existingStatement.getLeadingCommentRanges().map((comment) => normalizePreservedCommentText(comment.getText())).join("\n");
|
|
389
388
|
if (!leadingComments) return replacementText;
|
|
390
389
|
return `${leadingComments}\n${replacementText}`;
|
|
391
390
|
}
|
|
391
|
+
function normalizePreservedCommentText(commentText) {
|
|
392
|
+
if (!commentText.includes("\n") || !commentText.startsWith("/*")) return commentText;
|
|
393
|
+
const [firstLine, ...remainingLines] = commentText.split("\n");
|
|
394
|
+
if (!firstLine || !remainingLines.length) return commentText;
|
|
395
|
+
if (!remainingLines.every((line) => line.trimStart().startsWith("*"))) return commentText;
|
|
396
|
+
return [firstLine.trimStart(), ...remainingLines.map((line) => {
|
|
397
|
+
const trimmedLine = line.trimStart();
|
|
398
|
+
return trimmedLine && ` ${trimmedLine}`;
|
|
399
|
+
})].join("\n");
|
|
400
|
+
}
|
|
392
401
|
function dedupeConsecutiveIdenticalSingleLineComments(content) {
|
|
393
402
|
const lines = content.split("\n");
|
|
394
403
|
const deduped = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-merge.js","names":[],"sources":["../../../src/commands/pull-v4/module-merge.ts"],"sourcesContent":["import type { ObjectLiteralExpression, SourceFile, Statement } from 'ts-morph';\nimport { Node, SyntaxKind } from 'ts-morph';\nimport { createInMemoryProject } from './utils';\n\nexport function mergeGeneratedModule(existingContent: string, generatedContent: string): string {\n const project = createInMemoryProject();\n\n const existingSourceFile = project.createSourceFile('existing.ts', existingContent, {\n overwrite: true,\n });\n const generatedSourceFile = project.createSourceFile('generated.ts', generatedContent, {\n overwrite: true,\n });\n\n mergeImports(existingSourceFile, generatedSourceFile);\n\n for (const statement of generatedSourceFile.getStatements()) {\n if (Node.isImportDeclaration(statement)) {\n continue;\n }\n upsertStatement(existingSourceFile, statement);\n }\n\n return dedupeConsecutiveIdenticalSingleLineComments(existingSourceFile.getFullText().trimEnd());\n}\n\nfunction mergeImports(existingFile: SourceFile, generatedFile: SourceFile) {\n for (const generatedImport of generatedFile.getImportDeclarations()) {\n const moduleSpecifier = generatedImport.getModuleSpecifierValue();\n const matchingImports = existingFile\n .getImportDeclarations()\n .filter((existingImport) => existingImport.getModuleSpecifierValue() === moduleSpecifier);\n\n if (!matchingImports.length) {\n if (areGeneratedImportBindingsAlreadyPresent(existingFile, generatedImport)) {\n continue;\n }\n if (hasGeneratedImportBindingConflicts(existingFile, generatedImport)) {\n continue;\n }\n existingFile.addImportDeclaration(generatedImport.getStructure());\n continue;\n }\n\n const targetImport = findBestImportTarget(matchingImports, generatedImport);\n if (!targetImport) {\n if (!hasImportWithText(matchingImports, generatedImport.getText())) {\n existingFile.addImportDeclaration(generatedImport.getStructure());\n }\n continue;\n }\n\n if (!generatedImport.isTypeOnly() && targetImport.isTypeOnly()) {\n targetImport.setIsTypeOnly(false);\n }\n\n const generatedDefaultImport = generatedImport.getDefaultImport();\n if (generatedDefaultImport && !targetImport.getDefaultImport()) {\n const defaultImportName = generatedDefaultImport.getText();\n if (!hasTopLevelDeclarationWithName(existingFile, defaultImportName)) {\n targetImport.setDefaultImport(defaultImportName);\n }\n }\n\n const generatedNamespaceImport = generatedImport.getNamespaceImport();\n if (generatedNamespaceImport && !targetImport.getNamespaceImport()) {\n const namespaceImportName = generatedNamespaceImport.getText();\n if (!hasTopLevelDeclarationWithName(existingFile, namespaceImportName)) {\n targetImport.setNamespaceImport(namespaceImportName);\n }\n }\n\n for (const generatedNamedImport of generatedImport.getNamedImports()) {\n const generatedName = generatedNamedImport.getName();\n const generatedAlias = generatedNamedImport.getAliasNode()?.getText();\n const generatedIsTypeOnly = generatedNamedImport.isTypeOnly();\n const generatedBindingName = generatedAlias ?? generatedName;\n const hasNamedImport = targetImport.getNamedImports().some((existingNamedImport) => {\n return (\n existingNamedImport.getName() === generatedName &&\n existingNamedImport.getAliasNode()?.getText() === generatedAlias &&\n existingNamedImport.isTypeOnly() === generatedIsTypeOnly\n );\n });\n\n if (!hasNamedImport) {\n if (hasTopLevelDeclarationWithName(existingFile, generatedBindingName)) {\n continue;\n }\n targetImport.addNamedImport({\n name: generatedName,\n alias: generatedAlias,\n isTypeOnly: generatedIsTypeOnly,\n });\n }\n }\n }\n}\n\nfunction findBestImportTarget(\n matchingImports: ReturnType<SourceFile['getImportDeclarations']>,\n generatedImport: ReturnType<SourceFile['getImportDeclarations']>[number]\n) {\n if (generatedImport.getNamespaceImport()) {\n const namespaceText = generatedImport.getNamespaceImport()?.getText();\n return matchingImports.find(\n (importDeclaration) => importDeclaration.getNamespaceImport()?.getText() === namespaceText\n );\n }\n\n const nonNamespaceImport = matchingImports.find(\n (importDeclaration) => !importDeclaration.getNamespaceImport()\n );\n if (nonNamespaceImport) {\n return nonNamespaceImport;\n }\n\n return;\n}\n\nfunction hasImportWithText(imports: ReturnType<SourceFile['getImportDeclarations']>, text: string) {\n return imports.some((importDeclaration) => importDeclaration.getText() === text);\n}\n\nfunction areGeneratedImportBindingsAlreadyPresent(\n existingFile: SourceFile,\n generatedImport: ReturnType<SourceFile['getImportDeclarations']>[number]\n): boolean {\n const generatedBindings = getImportBindingNames(generatedImport);\n if (!generatedBindings.length) {\n return false;\n }\n\n const existingImports = existingFile.getImportDeclarations();\n return generatedBindings.every((binding) =>\n existingImports.some((existingImport) => importHasBinding(existingImport, binding))\n );\n}\n\nfunction hasGeneratedImportBindingConflicts(\n existingFile: SourceFile,\n generatedImport: ReturnType<SourceFile['getImportDeclarations']>[number]\n): boolean {\n const generatedBindings = getImportBindingNames(generatedImport);\n if (!generatedBindings.length) {\n return false;\n }\n\n return generatedBindings.some((binding) => hasTopLevelDeclarationWithName(existingFile, binding));\n}\n\nfunction getImportBindingNames(\n importDeclaration: ReturnType<SourceFile['getImportDeclarations']>[number]\n): string[] {\n const bindings: string[] = [];\n\n const defaultImport = importDeclaration.getDefaultImport();\n if (defaultImport) {\n bindings.push(defaultImport.getText());\n }\n\n const namespaceImport = importDeclaration.getNamespaceImport();\n if (namespaceImport) {\n bindings.push(namespaceImport.getText());\n }\n\n for (const namedImport of importDeclaration.getNamedImports()) {\n bindings.push(namedImport.getAliasNode()?.getText() ?? namedImport.getName());\n }\n\n return bindings;\n}\n\nfunction importHasBinding(\n importDeclaration: ReturnType<SourceFile['getImportDeclarations']>[number],\n bindingName: string\n): boolean {\n if (importDeclaration.getDefaultImport()?.getText() === bindingName) {\n return true;\n }\n\n if (importDeclaration.getNamespaceImport()?.getText() === bindingName) {\n return true;\n }\n\n return importDeclaration.getNamedImports().some((namedImport) => {\n return (namedImport.getAliasNode()?.getText() ?? namedImport.getName()) === bindingName;\n });\n}\n\nfunction hasTopLevelDeclarationWithName(\n existingFile: SourceFile,\n declarationName: string\n): boolean {\n if (existingFile.getVariableDeclaration(declarationName)) {\n return true;\n }\n if (existingFile.getFunction(declarationName)) {\n return true;\n }\n if (existingFile.getClass(declarationName)) {\n return true;\n }\n if (existingFile.getInterface(declarationName)) {\n return true;\n }\n if (existingFile.getTypeAlias(declarationName)) {\n return true;\n }\n if (existingFile.getEnum(declarationName)) {\n return true;\n }\n if (existingFile.getModule(declarationName)) {\n return true;\n }\n return false;\n}\n\nfunction upsertStatement(existingFile: SourceFile, generatedStatement: Statement) {\n if (Node.isVariableStatement(generatedStatement)) {\n upsertVariableStatement(existingFile, generatedStatement);\n return;\n }\n\n if (Node.isFunctionDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getFunction(name)\n );\n return;\n }\n\n if (Node.isClassDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getClass(name)\n );\n return;\n }\n\n if (Node.isInterfaceDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getInterface(name)\n );\n return;\n }\n\n if (Node.isTypeAliasDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getTypeAlias(name)\n );\n return;\n }\n\n if (Node.isEnumDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getEnum(name)\n );\n return;\n }\n\n appendUniqueStatement(existingFile, generatedStatement);\n}\n\nfunction upsertVariableStatement(existingFile: SourceFile, generatedStatement: Statement) {\n if (!Node.isVariableStatement(generatedStatement)) {\n return;\n }\n\n const generatedDeclarations = generatedStatement.getDeclarations();\n if (!generatedDeclarations.length) {\n appendUniqueStatement(existingFile, generatedStatement);\n return;\n }\n\n const existingStatements = new Set<Statement>();\n for (const generatedDeclaration of generatedDeclarations) {\n let existingDeclaration = existingFile.getVariableDeclaration(generatedDeclaration.getName());\n if (!existingDeclaration) {\n existingDeclaration = findExistingDeclarationByEntitySignature(\n existingFile,\n generatedDeclaration\n );\n if (existingDeclaration) {\n generatedDeclaration.rename(existingDeclaration.getName());\n }\n }\n\n if (!existingDeclaration) {\n continue;\n }\n const existingStatement = existingDeclaration.getFirstAncestorByKind(\n SyntaxKind.VariableStatement\n );\n if (existingStatement) {\n existingStatements.add(existingStatement);\n }\n }\n\n if (!existingStatements.size) {\n appendUniqueStatement(existingFile, generatedStatement);\n return;\n }\n\n const [firstExistingStatement, ...remainingStatements] = [...existingStatements];\n if (firstExistingStatement) {\n firstExistingStatement.replaceWithText(\n buildReplacementStatementText(firstExistingStatement, generatedStatement)\n );\n }\n for (const statement of remainingStatements) {\n statement.remove();\n }\n}\n\nfunction findExistingDeclarationByEntitySignature(\n existingFile: SourceFile,\n generatedDeclaration: ReturnType<SourceFile['getVariableDeclarations']>[number]\n) {\n const generatedSignature = getVariableDeclarationEntitySignature(generatedDeclaration);\n if (!generatedSignature) {\n return;\n }\n\n const matchingDeclarations = existingFile\n .getVariableDeclarations()\n .filter(\n (declaration) => getVariableDeclarationEntitySignature(declaration) === generatedSignature\n );\n\n if (!matchingDeclarations.length) {\n return;\n }\n\n const exportedDeclaration = matchingDeclarations.find((declaration) =>\n declaration.getFirstAncestorByKind(SyntaxKind.VariableStatement)?.hasExportKeyword()\n );\n\n return exportedDeclaration ?? matchingDeclarations[0];\n}\n\nfunction getVariableDeclarationEntitySignature(\n declaration: ReturnType<SourceFile['getVariableDeclarations']>[number]\n): string | undefined {\n const initializer = declaration.getInitializer();\n if (!initializer || !Node.isCallExpression(initializer)) {\n return;\n }\n\n const expression = initializer.getExpression();\n if (!Node.isIdentifier(expression)) {\n return;\n }\n\n const args = initializer.getArguments();\n if (!args.length || !Node.isObjectLiteralExpression(args[0])) {\n return;\n }\n\n const factoryName = expression.getText();\n const entityId = readEntityId(args[0], factoryName);\n if (!entityId) {\n return;\n }\n\n return `${factoryName}:${entityId}`;\n}\n\nfunction readEntityId(\n configObject: ObjectLiteralExpression,\n factoryName: string\n): string | undefined {\n const idProperty = configObject.getProperty('id');\n if (idProperty && Node.isPropertyAssignment(idProperty)) {\n const idInitializer = idProperty.getInitializer();\n if (idInitializer && Node.isStringLiteral(idInitializer)) {\n return idInitializer.getLiteralValue();\n }\n }\n\n if (factoryName === 'statusComponent') {\n const typeProperty = configObject.getProperty('type');\n if (typeProperty && Node.isPropertyAssignment(typeProperty)) {\n const typeInitializer = typeProperty.getInitializer();\n if (typeInitializer && Node.isStringLiteral(typeInitializer)) {\n return typeInitializer.getLiteralValue();\n }\n }\n }\n\n if (factoryName === 'functionTool') {\n const nameProperty = configObject.getProperty('name');\n if (nameProperty && Node.isPropertyAssignment(nameProperty)) {\n const nameInitializer = nameProperty.getInitializer();\n if (nameInitializer && Node.isStringLiteral(nameInitializer)) {\n return nameInitializer.getLiteralValue();\n }\n }\n }\n}\n\nfunction upsertNamedStatement(\n existingFile: SourceFile,\n generatedStatement: Statement,\n finder: (sourceFile: SourceFile, name: string) => Statement | undefined\n) {\n const statementName =\n Node.isFunctionDeclaration(generatedStatement) ||\n Node.isClassDeclaration(generatedStatement) ||\n Node.isInterfaceDeclaration(generatedStatement) ||\n Node.isTypeAliasDeclaration(generatedStatement) ||\n Node.isEnumDeclaration(generatedStatement)\n ? generatedStatement.getName()\n : undefined;\n\n if (!statementName) {\n appendUniqueStatement(existingFile, generatedStatement);\n return;\n }\n\n const existingStatement = finder(existingFile, statementName);\n if (!existingStatement) {\n appendUniqueStatement(existingFile, generatedStatement);\n return;\n }\n\n existingStatement.replaceWithText(\n buildReplacementStatementText(existingStatement, generatedStatement)\n );\n}\n\nfunction appendUniqueStatement(existingFile: SourceFile, generatedStatement: Statement) {\n const statementText = generatedStatement.getText();\n const hasExistingStatement = existingFile\n .getStatements()\n .some((statement) => statement.getText() === statementText);\n\n if (hasExistingStatement) return;\n existingFile.addStatements([statementText]);\n}\n\nfunction buildReplacementStatementText(\n existingStatement: Statement,\n generatedStatement: Statement\n): string {\n const orderingAlignedText = alignStatementOrdering(existingStatement, generatedStatement);\n return withPreservedLeadingComments(existingStatement, orderingAlignedText);\n}\n\nfunction alignStatementOrdering(\n existingStatement: Statement,\n generatedStatement: Statement\n): string {\n if (Node.isVariableStatement(existingStatement) && Node.isVariableStatement(generatedStatement)) {\n return alignVariableStatementOrdering(existingStatement, generatedStatement);\n }\n\n return generatedStatement.getText();\n}\n\nfunction alignVariableStatementOrdering(\n existingStatement: ReturnType<SourceFile['getVariableStatements']>[number],\n generatedStatement: ReturnType<SourceFile['getVariableStatements']>[number]\n): string {\n generatedStatement.setIsExported(existingStatement.isExported());\n const generatedText = generatedStatement.getText();\n const generatedStatementStart = generatedStatement.getStart();\n const existingDeclarationsByName = new Map(\n existingStatement.getDeclarations().map((declaration) => [declaration.getName(), declaration])\n );\n\n const replacements: TextReplacement[] = [];\n for (const generatedDeclaration of generatedStatement.getDeclarations()) {\n const existingDeclaration = existingDeclarationsByName.get(generatedDeclaration.getName());\n if (!existingDeclaration) {\n continue;\n }\n\n const generatedInitializer = generatedDeclaration.getInitializer();\n const existingInitializer = existingDeclaration.getInitializer();\n if (!generatedInitializer || !existingInitializer) {\n continue;\n }\n\n const alignedInitializerText = alignExpressionText(existingInitializer, generatedInitializer);\n if (alignedInitializerText === generatedInitializer.getText()) {\n continue;\n }\n\n replacements.push({\n start: generatedInitializer.getStart() - generatedStatementStart,\n end: generatedInitializer.getEnd() - generatedStatementStart,\n text: alignedInitializerText,\n });\n }\n\n return applyTextReplacements(generatedText, replacements);\n}\n\nfunction alignExpressionText(\n existingExpression: Node | undefined,\n generatedExpression: Node\n): string {\n if (!existingExpression) {\n return generatedExpression.getText();\n }\n\n if (\n Node.isObjectLiteralExpression(existingExpression) &&\n Node.isObjectLiteralExpression(generatedExpression)\n ) {\n return alignObjectLiteralText(existingExpression, generatedExpression);\n }\n\n if (\n Node.isArrayLiteralExpression(existingExpression) &&\n Node.isArrayLiteralExpression(generatedExpression)\n ) {\n return alignArrayLiteralText(existingExpression, generatedExpression);\n }\n\n if (Node.isArrowFunction(existingExpression) && Node.isArrowFunction(generatedExpression)) {\n return alignArrowFunctionText(existingExpression, generatedExpression);\n }\n\n if (Node.isCallExpression(existingExpression) && Node.isCallExpression(generatedExpression)) {\n return alignCallExpressionText(existingExpression, generatedExpression);\n }\n\n if (\n Node.isParenthesizedExpression(existingExpression) &&\n Node.isParenthesizedExpression(generatedExpression)\n ) {\n const alignedInnerText = alignExpressionText(\n existingExpression.getExpression(),\n generatedExpression.getExpression()\n );\n return `(${alignedInnerText})`;\n }\n\n return generatedExpression.getText();\n}\n\nfunction alignCallExpressionText(\n existingCall: ReturnType<SourceFile['getDescendantsOfKind']>[number],\n generatedCall: ReturnType<SourceFile['getDescendantsOfKind']>[number]\n): string {\n if (!Node.isCallExpression(existingCall) || !Node.isCallExpression(generatedCall)) {\n return generatedCall.getText();\n }\n\n const generatedText = generatedCall.getText();\n const generatedCallStart = generatedCall.getStart();\n const existingArguments = existingCall.getArguments();\n const generatedArguments = generatedCall.getArguments();\n const replacements: TextReplacement[] = [];\n\n for (const [index, generatedArgument] of generatedArguments.entries()) {\n const existingArgument = existingArguments[index];\n if (!existingArgument) {\n continue;\n }\n\n const alignedArgumentText = alignExpressionText(existingArgument, generatedArgument);\n if (alignedArgumentText === generatedArgument.getText()) {\n continue;\n }\n\n replacements.push({\n start: generatedArgument.getStart() - generatedCallStart,\n end: generatedArgument.getEnd() - generatedCallStart,\n text: alignedArgumentText,\n });\n }\n\n return applyTextReplacements(generatedText, replacements);\n}\n\nfunction alignArrowFunctionText(\n existingArrow: ReturnType<SourceFile['getDescendantsOfKind']>[number],\n generatedArrow: ReturnType<SourceFile['getDescendantsOfKind']>[number]\n): string {\n if (!Node.isArrowFunction(existingArrow) || !Node.isArrowFunction(generatedArrow)) {\n return generatedArrow.getText();\n }\n\n const existingBody = existingArrow.getBody();\n const generatedBody = generatedArrow.getBody();\n if (!Node.isExpression(existingBody) || !Node.isExpression(generatedBody)) {\n return generatedArrow.getText();\n }\n\n const alignedBodyText = alignExpressionText(existingBody, generatedBody);\n if (alignedBodyText === generatedBody.getText()) {\n return generatedArrow.getText();\n }\n\n return applyTextReplacements(generatedArrow.getText(), [\n {\n start: generatedBody.getStart() - generatedArrow.getStart(),\n end: generatedBody.getEnd() - generatedArrow.getStart(),\n text: alignedBodyText,\n },\n ]);\n}\n\nfunction alignObjectLiteralText(\n existingObject: ObjectLiteralExpression,\n generatedObject: ObjectLiteralExpression\n): string {\n const orderedProperties = orderObjectProperties(\n existingObject.getProperties(),\n generatedObject.getProperties()\n );\n\n const propertyTexts = orderedProperties.map(({ existingProperty, generatedProperty }) => {\n if (!existingProperty) {\n return generatedProperty.getText();\n }\n\n return withPreservedLeadingComments(\n existingProperty,\n alignObjectPropertyText(existingProperty, generatedProperty)\n );\n });\n\n return formatCollectionLiteralText(generatedObject.getText(), propertyTexts, '{', '}');\n}\n\nfunction alignObjectPropertyText(existingProperty: Node, generatedProperty: Node): string {\n const text = generatedProperty.getText();\n\n if (!Node.isPropertyAssignment(generatedProperty)) {\n return text;\n }\n\n const generatedInitializer = generatedProperty.getInitializer();\n if (!generatedInitializer) {\n return text;\n }\n const existingInitializer = Node.isPropertyAssignment(existingProperty)\n ? existingProperty.getInitializer()\n : undefined;\n const alignedInitializerText = alignExpressionText(existingInitializer, generatedInitializer);\n return `${generatedProperty.getNameNode().getText()}: ${alignedInitializerText}`;\n}\n\nfunction alignArrayLiteralText(\n existingArray: ReturnType<SourceFile['getDescendantsOfKind']>[number],\n generatedArray: ReturnType<SourceFile['getDescendantsOfKind']>[number]\n): string {\n if (\n !Node.isArrayLiteralExpression(existingArray) ||\n !Node.isArrayLiteralExpression(generatedArray)\n ) {\n return generatedArray.getText();\n }\n\n const orderedElements = orderArrayElements(\n existingArray.getElements(),\n generatedArray.getElements()\n );\n const elementTexts = orderedElements.map(({ existingElement, generatedElement }) =>\n alignExpressionText(existingElement, generatedElement)\n );\n\n return formatCollectionLiteralText(generatedArray.getText(), elementTexts, '[', ']');\n}\n\nfunction orderObjectProperties(existingProperties: Node[], generatedProperties: Node[]) {\n return orderNodesBySignature(\n existingProperties,\n generatedProperties,\n getObjectPropertyKey,\n getObjectPropertyKey\n ).map(({ existingNode, generatedNode }) => ({\n existingProperty: existingNode,\n generatedProperty: generatedNode,\n }));\n}\n\nfunction orderArrayElements(existingElements: Node[], generatedElements: Node[]) {\n return orderNodesBySignature(\n existingElements,\n generatedElements,\n getArrayElementSignature,\n getArrayElementSignature\n ).map(({ existingNode, generatedNode }) => ({\n existingElement: existingNode,\n generatedElement: generatedNode,\n }));\n}\n\nfunction orderNodesBySignature<TExisting extends Node, TGenerated extends Node>(\n existingNodes: TExisting[],\n generatedNodes: TGenerated[],\n getExistingSignature: (node: TExisting) => string | undefined,\n getGeneratedSignature: (node: TGenerated) => string | undefined\n) {\n const generatedEntries = generatedNodes.map((generatedNode) => ({\n generatedNode,\n signature: getGeneratedSignature(generatedNode),\n }));\n const usedGeneratedIndexes = new Set<number>();\n const ordered: Array<{ existingNode?: TExisting; generatedNode: TGenerated }> = [];\n\n for (const existingNode of existingNodes) {\n const existingSignature = getExistingSignature(existingNode);\n if (!existingSignature) {\n continue;\n }\n const generatedIndex = generatedEntries.findIndex(\n (entry, index) => !usedGeneratedIndexes.has(index) && entry.signature === existingSignature\n );\n if (generatedIndex === -1) {\n continue;\n }\n\n const generatedEntry = generatedEntries[generatedIndex];\n if (!generatedEntry) {\n continue;\n }\n\n usedGeneratedIndexes.add(generatedIndex);\n ordered.push({\n existingNode,\n generatedNode: generatedEntry.generatedNode,\n });\n }\n\n for (const [index, generatedEntry] of generatedEntries.entries()) {\n if (usedGeneratedIndexes.has(index)) {\n continue;\n }\n ordered.push({ generatedNode: generatedEntry.generatedNode });\n }\n\n return ordered;\n}\n\nfunction getObjectPropertyKey(property: Node): string | undefined {\n if (\n Node.isPropertyAssignment(property) ||\n Node.isShorthandPropertyAssignment(property) ||\n Node.isMethodDeclaration(property) ||\n Node.isGetAccessorDeclaration(property) ||\n Node.isSetAccessorDeclaration(property)\n ) {\n return property.getName();\n }\n\n if (Node.isSpreadAssignment(property)) {\n return `...${property.getExpression().getText()}`;\n }\n return;\n}\n\nfunction getArrayElementSignature(node: Node): string {\n if (Node.isIdentifier(node)) {\n return `id:${node.getText()}`;\n }\n\n if (Node.isStringLiteral(node)) {\n return `str:${node.getLiteralValue()}`;\n }\n\n if (Node.isObjectLiteralExpression(node)) {\n const objectId =\n readStringLiteralObjectProperty(node, 'id') ||\n readStringLiteralObjectProperty(node, 'type') ||\n readStringLiteralObjectProperty(node, 'name');\n if (objectId) {\n return `obj:${objectId}`;\n }\n }\n\n if (Node.isCallExpression(node)) {\n const expression = node.getExpression();\n if (Node.isPropertyAccessExpression(expression) && expression.getName() === 'with') {\n return `with:${expression.getExpression().getText()}`;\n }\n }\n\n return node.getText();\n}\n\nfunction readStringLiteralObjectProperty(\n objectLiteral: ObjectLiteralExpression,\n propertyName: string\n): string | undefined {\n const property = objectLiteral.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return;\n }\n const initializer = property.getInitializer();\n if (!initializer || !Node.isStringLiteral(initializer)) {\n return;\n }\n\n return initializer.getLiteralValue();\n}\n\nfunction formatCollectionLiteralText(\n originalText: string,\n itemTexts: string[],\n openToken: '{' | '[',\n closeToken: '}' | ']'\n): string {\n if (originalText.includes('\\n')) {\n return `${openToken}\\n${itemTexts\n .map((line) => {\n const trimmedLine = line.replaceAll(/^\\s+\\*/gm, ' *');\n return trimmedLine;\n })\n .join(',\\n')}${closeToken}`;\n }\n\n const openingWithSpacing = originalText.startsWith(`${openToken} `) ? `${openToken} ` : openToken;\n const closingWithSpacing = originalText.endsWith(` ${closeToken}`)\n ? ` ${closeToken}`\n : closeToken;\n\n return `${openingWithSpacing}${itemTexts.join(', ')}${closingWithSpacing}`;\n}\n\ninterface TextReplacement {\n start: number;\n end: number;\n text: string;\n}\n\nfunction applyTextReplacements(sourceText: string, replacements: TextReplacement[]): string {\n if (!replacements.length) {\n return sourceText;\n }\n\n let nextText = sourceText;\n const replacementsInDescendingOrder = [...replacements].sort((a, b) => b.start - a.start);\n for (const replacement of replacementsInDescendingOrder) {\n nextText =\n nextText.slice(0, replacement.start) + replacement.text + nextText.slice(replacement.end);\n }\n\n return nextText;\n}\n\nfunction withPreservedLeadingComments(existingStatement: Node, replacementText: string): string {\n const leadingComments = existingStatement\n .getLeadingCommentRanges()\n .map((comment) => comment.getText())\n .join('\\n');\n if (!leadingComments) {\n return replacementText;\n }\n\n return `${leadingComments}\\n${replacementText}`;\n}\n\nfunction dedupeConsecutiveIdenticalSingleLineComments(content: string): string {\n const lines = content.split('\\n');\n const deduped: string[] = [];\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n const previousLine = deduped.at(-1);\n const previousTrimmedLine = previousLine?.trim();\n const isDuplicateSingleLineComment =\n trimmedLine.startsWith('//') &&\n previousTrimmedLine?.startsWith('//') &&\n trimmedLine === previousTrimmedLine;\n\n if (isDuplicateSingleLineComment) {\n continue;\n }\n\n deduped.push(line);\n }\n\n return deduped.join('\\n');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module-merge.js","names":[],"sources":["../../../src/commands/pull-v4/module-merge.ts"],"sourcesContent":["import type { ObjectLiteralExpression, SourceFile, Statement } from 'ts-morph';\nimport { Node, SyntaxKind } from 'ts-morph';\nimport { createInMemoryProject } from './utils';\n\nexport function mergeGeneratedModule(existingContent: string, generatedContent: string): string {\n const project = createInMemoryProject();\n\n const existingSourceFile = project.createSourceFile('existing.ts', existingContent, {\n overwrite: true,\n });\n const generatedSourceFile = project.createSourceFile('generated.ts', generatedContent, {\n overwrite: true,\n });\n\n mergeImports(existingSourceFile, generatedSourceFile);\n\n for (const statement of generatedSourceFile.getStatements()) {\n if (Node.isImportDeclaration(statement)) {\n continue;\n }\n upsertStatement(existingSourceFile, statement);\n }\n\n return dedupeConsecutiveIdenticalSingleLineComments(existingSourceFile.getFullText().trimEnd());\n}\n\nfunction mergeImports(existingFile: SourceFile, generatedFile: SourceFile) {\n for (const generatedImport of generatedFile.getImportDeclarations()) {\n const moduleSpecifier = generatedImport.getModuleSpecifierValue();\n const matchingImports = existingFile\n .getImportDeclarations()\n .filter((existingImport) => existingImport.getModuleSpecifierValue() === moduleSpecifier);\n\n if (!matchingImports.length) {\n if (areGeneratedImportBindingsAlreadyPresent(existingFile, generatedImport)) {\n continue;\n }\n if (hasGeneratedImportBindingConflicts(existingFile, generatedImport)) {\n continue;\n }\n existingFile.addImportDeclaration(generatedImport.getStructure());\n continue;\n }\n\n const targetImport = findBestImportTarget(matchingImports, generatedImport);\n if (!targetImport) {\n if (!hasImportWithText(matchingImports, generatedImport.getText())) {\n existingFile.addImportDeclaration(generatedImport.getStructure());\n }\n continue;\n }\n\n if (!generatedImport.isTypeOnly() && targetImport.isTypeOnly()) {\n targetImport.setIsTypeOnly(false);\n }\n\n const generatedDefaultImport = generatedImport.getDefaultImport();\n if (generatedDefaultImport && !targetImport.getDefaultImport()) {\n const defaultImportName = generatedDefaultImport.getText();\n if (!hasTopLevelDeclarationWithName(existingFile, defaultImportName)) {\n targetImport.setDefaultImport(defaultImportName);\n }\n }\n\n const generatedNamespaceImport = generatedImport.getNamespaceImport();\n if (generatedNamespaceImport && !targetImport.getNamespaceImport()) {\n const namespaceImportName = generatedNamespaceImport.getText();\n if (!hasTopLevelDeclarationWithName(existingFile, namespaceImportName)) {\n targetImport.setNamespaceImport(namespaceImportName);\n }\n }\n\n for (const generatedNamedImport of generatedImport.getNamedImports()) {\n const generatedName = generatedNamedImport.getName();\n const generatedAlias = generatedNamedImport.getAliasNode()?.getText();\n const generatedIsTypeOnly = generatedNamedImport.isTypeOnly();\n const generatedBindingName = generatedAlias ?? generatedName;\n const hasNamedImport = targetImport.getNamedImports().some((existingNamedImport) => {\n return (\n existingNamedImport.getName() === generatedName &&\n existingNamedImport.getAliasNode()?.getText() === generatedAlias &&\n existingNamedImport.isTypeOnly() === generatedIsTypeOnly\n );\n });\n\n if (!hasNamedImport) {\n if (hasTopLevelDeclarationWithName(existingFile, generatedBindingName)) {\n continue;\n }\n targetImport.addNamedImport({\n name: generatedName,\n alias: generatedAlias,\n isTypeOnly: generatedIsTypeOnly,\n });\n }\n }\n }\n}\n\nfunction findBestImportTarget(\n matchingImports: ReturnType<SourceFile['getImportDeclarations']>,\n generatedImport: ReturnType<SourceFile['getImportDeclarations']>[number]\n) {\n if (generatedImport.getNamespaceImport()) {\n const namespaceText = generatedImport.getNamespaceImport()?.getText();\n return matchingImports.find(\n (importDeclaration) => importDeclaration.getNamespaceImport()?.getText() === namespaceText\n );\n }\n\n const nonNamespaceImport = matchingImports.find(\n (importDeclaration) => !importDeclaration.getNamespaceImport()\n );\n if (nonNamespaceImport) {\n return nonNamespaceImport;\n }\n\n return;\n}\n\nfunction hasImportWithText(imports: ReturnType<SourceFile['getImportDeclarations']>, text: string) {\n return imports.some((importDeclaration) => importDeclaration.getText() === text);\n}\n\nfunction areGeneratedImportBindingsAlreadyPresent(\n existingFile: SourceFile,\n generatedImport: ReturnType<SourceFile['getImportDeclarations']>[number]\n): boolean {\n const generatedBindings = getImportBindingNames(generatedImport);\n if (!generatedBindings.length) {\n return false;\n }\n\n const existingImports = existingFile.getImportDeclarations();\n return generatedBindings.every((binding) =>\n existingImports.some((existingImport) => importHasBinding(existingImport, binding))\n );\n}\n\nfunction hasGeneratedImportBindingConflicts(\n existingFile: SourceFile,\n generatedImport: ReturnType<SourceFile['getImportDeclarations']>[number]\n): boolean {\n const generatedBindings = getImportBindingNames(generatedImport);\n if (!generatedBindings.length) {\n return false;\n }\n\n return generatedBindings.some((binding) => hasTopLevelDeclarationWithName(existingFile, binding));\n}\n\nfunction getImportBindingNames(\n importDeclaration: ReturnType<SourceFile['getImportDeclarations']>[number]\n): string[] {\n const bindings: string[] = [];\n\n const defaultImport = importDeclaration.getDefaultImport();\n if (defaultImport) {\n bindings.push(defaultImport.getText());\n }\n\n const namespaceImport = importDeclaration.getNamespaceImport();\n if (namespaceImport) {\n bindings.push(namespaceImport.getText());\n }\n\n for (const namedImport of importDeclaration.getNamedImports()) {\n bindings.push(namedImport.getAliasNode()?.getText() ?? namedImport.getName());\n }\n\n return bindings;\n}\n\nfunction importHasBinding(\n importDeclaration: ReturnType<SourceFile['getImportDeclarations']>[number],\n bindingName: string\n): boolean {\n if (importDeclaration.getDefaultImport()?.getText() === bindingName) {\n return true;\n }\n\n if (importDeclaration.getNamespaceImport()?.getText() === bindingName) {\n return true;\n }\n\n return importDeclaration.getNamedImports().some((namedImport) => {\n return (namedImport.getAliasNode()?.getText() ?? namedImport.getName()) === bindingName;\n });\n}\n\nfunction hasTopLevelDeclarationWithName(\n existingFile: SourceFile,\n declarationName: string\n): boolean {\n if (existingFile.getVariableDeclaration(declarationName)) {\n return true;\n }\n if (existingFile.getFunction(declarationName)) {\n return true;\n }\n if (existingFile.getClass(declarationName)) {\n return true;\n }\n if (existingFile.getInterface(declarationName)) {\n return true;\n }\n if (existingFile.getTypeAlias(declarationName)) {\n return true;\n }\n if (existingFile.getEnum(declarationName)) {\n return true;\n }\n if (existingFile.getModule(declarationName)) {\n return true;\n }\n return false;\n}\n\nfunction upsertStatement(existingFile: SourceFile, generatedStatement: Statement) {\n if (Node.isVariableStatement(generatedStatement)) {\n upsertVariableStatement(existingFile, generatedStatement);\n return;\n }\n\n if (Node.isFunctionDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getFunction(name)\n );\n return;\n }\n\n if (Node.isClassDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getClass(name)\n );\n return;\n }\n\n if (Node.isInterfaceDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getInterface(name)\n );\n return;\n }\n\n if (Node.isTypeAliasDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getTypeAlias(name)\n );\n return;\n }\n\n if (Node.isEnumDeclaration(generatedStatement)) {\n upsertNamedStatement(existingFile, generatedStatement, (sourceFile, name) =>\n sourceFile.getEnum(name)\n );\n return;\n }\n\n appendUniqueStatement(existingFile, generatedStatement);\n}\n\nfunction upsertVariableStatement(existingFile: SourceFile, generatedStatement: Statement) {\n if (!Node.isVariableStatement(generatedStatement)) {\n return;\n }\n\n const generatedDeclarations = generatedStatement.getDeclarations();\n if (!generatedDeclarations.length) {\n appendUniqueStatement(existingFile, generatedStatement);\n return;\n }\n\n const existingStatements = new Set<Statement>();\n for (const generatedDeclaration of generatedDeclarations) {\n let existingDeclaration = existingFile.getVariableDeclaration(generatedDeclaration.getName());\n if (!existingDeclaration) {\n existingDeclaration = findExistingDeclarationByEntitySignature(\n existingFile,\n generatedDeclaration\n );\n if (existingDeclaration) {\n generatedDeclaration.rename(existingDeclaration.getName());\n }\n }\n\n if (!existingDeclaration) {\n continue;\n }\n const existingStatement = existingDeclaration.getFirstAncestorByKind(\n SyntaxKind.VariableStatement\n );\n if (existingStatement) {\n existingStatements.add(existingStatement);\n }\n }\n\n if (!existingStatements.size) {\n appendUniqueStatement(existingFile, generatedStatement);\n return;\n }\n\n const [firstExistingStatement, ...remainingStatements] = [...existingStatements];\n if (firstExistingStatement) {\n firstExistingStatement.replaceWithText(\n buildReplacementStatementText(firstExistingStatement, generatedStatement)\n );\n }\n for (const statement of remainingStatements) {\n statement.remove();\n }\n}\n\nfunction findExistingDeclarationByEntitySignature(\n existingFile: SourceFile,\n generatedDeclaration: ReturnType<SourceFile['getVariableDeclarations']>[number]\n) {\n const generatedSignature = getVariableDeclarationEntitySignature(generatedDeclaration);\n if (!generatedSignature) {\n return;\n }\n\n const matchingDeclarations = existingFile\n .getVariableDeclarations()\n .filter(\n (declaration) => getVariableDeclarationEntitySignature(declaration) === generatedSignature\n );\n\n if (!matchingDeclarations.length) {\n return;\n }\n\n const exportedDeclaration = matchingDeclarations.find((declaration) =>\n declaration.getFirstAncestorByKind(SyntaxKind.VariableStatement)?.hasExportKeyword()\n );\n\n return exportedDeclaration ?? matchingDeclarations[0];\n}\n\nfunction getVariableDeclarationEntitySignature(\n declaration: ReturnType<SourceFile['getVariableDeclarations']>[number]\n): string | undefined {\n const initializer = declaration.getInitializer();\n if (!initializer || !Node.isCallExpression(initializer)) {\n return;\n }\n\n const expression = initializer.getExpression();\n if (!Node.isIdentifier(expression)) {\n return;\n }\n\n const args = initializer.getArguments();\n if (!args.length || !Node.isObjectLiteralExpression(args[0])) {\n return;\n }\n\n const factoryName = expression.getText();\n const entityId = readEntityId(args[0], factoryName);\n if (!entityId) {\n return;\n }\n\n return `${factoryName}:${entityId}`;\n}\n\nfunction readEntityId(\n configObject: ObjectLiteralExpression,\n factoryName: string\n): string | undefined {\n const idProperty = configObject.getProperty('id');\n if (idProperty && Node.isPropertyAssignment(idProperty)) {\n const idInitializer = idProperty.getInitializer();\n if (idInitializer && Node.isStringLiteral(idInitializer)) {\n return idInitializer.getLiteralValue();\n }\n }\n\n if (factoryName === 'statusComponent') {\n const typeProperty = configObject.getProperty('type');\n if (typeProperty && Node.isPropertyAssignment(typeProperty)) {\n const typeInitializer = typeProperty.getInitializer();\n if (typeInitializer && Node.isStringLiteral(typeInitializer)) {\n return typeInitializer.getLiteralValue();\n }\n }\n }\n\n if (factoryName === 'functionTool') {\n const nameProperty = configObject.getProperty('name');\n if (nameProperty && Node.isPropertyAssignment(nameProperty)) {\n const nameInitializer = nameProperty.getInitializer();\n if (nameInitializer && Node.isStringLiteral(nameInitializer)) {\n return nameInitializer.getLiteralValue();\n }\n }\n }\n}\n\nfunction upsertNamedStatement(\n existingFile: SourceFile,\n generatedStatement: Statement,\n finder: (sourceFile: SourceFile, name: string) => Statement | undefined\n) {\n const statementName =\n Node.isFunctionDeclaration(generatedStatement) ||\n Node.isClassDeclaration(generatedStatement) ||\n Node.isInterfaceDeclaration(generatedStatement) ||\n Node.isTypeAliasDeclaration(generatedStatement) ||\n Node.isEnumDeclaration(generatedStatement)\n ? generatedStatement.getName()\n : undefined;\n\n if (!statementName) {\n appendUniqueStatement(existingFile, generatedStatement);\n return;\n }\n\n const existingStatement = finder(existingFile, statementName);\n if (!existingStatement) {\n appendUniqueStatement(existingFile, generatedStatement);\n return;\n }\n\n existingStatement.replaceWithText(\n buildReplacementStatementText(existingStatement, generatedStatement)\n );\n}\n\nfunction appendUniqueStatement(existingFile: SourceFile, generatedStatement: Statement) {\n const statementText = generatedStatement.getText();\n const hasExistingStatement = existingFile\n .getStatements()\n .some((statement) => statement.getText() === statementText);\n\n if (hasExistingStatement) return;\n existingFile.addStatements([statementText]);\n}\n\nfunction buildReplacementStatementText(\n existingStatement: Statement,\n generatedStatement: Statement\n): string {\n const orderingAlignedText = alignStatementOrdering(existingStatement, generatedStatement);\n return withPreservedLeadingComments(existingStatement, orderingAlignedText);\n}\n\nfunction alignStatementOrdering(\n existingStatement: Statement,\n generatedStatement: Statement\n): string {\n if (Node.isVariableStatement(existingStatement) && Node.isVariableStatement(generatedStatement)) {\n return alignVariableStatementOrdering(existingStatement, generatedStatement);\n }\n\n return generatedStatement.getText();\n}\n\nfunction alignVariableStatementOrdering(\n existingStatement: ReturnType<SourceFile['getVariableStatements']>[number],\n generatedStatement: ReturnType<SourceFile['getVariableStatements']>[number]\n): string {\n generatedStatement.setIsExported(existingStatement.isExported());\n const generatedText = generatedStatement.getText();\n const generatedStatementStart = generatedStatement.getStart();\n const existingDeclarationsByName = new Map(\n existingStatement.getDeclarations().map((declaration) => [declaration.getName(), declaration])\n );\n\n const replacements: TextReplacement[] = [];\n for (const generatedDeclaration of generatedStatement.getDeclarations()) {\n const existingDeclaration = existingDeclarationsByName.get(generatedDeclaration.getName());\n if (!existingDeclaration) {\n continue;\n }\n\n const generatedInitializer = generatedDeclaration.getInitializer();\n const existingInitializer = existingDeclaration.getInitializer();\n if (!generatedInitializer || !existingInitializer) {\n continue;\n }\n\n const alignedInitializerText = alignExpressionText(existingInitializer, generatedInitializer);\n if (alignedInitializerText === generatedInitializer.getText()) {\n continue;\n }\n\n replacements.push({\n start: generatedInitializer.getStart() - generatedStatementStart,\n end: generatedInitializer.getEnd() - generatedStatementStart,\n text: alignedInitializerText,\n });\n }\n\n return applyTextReplacements(generatedText, replacements);\n}\n\nfunction alignExpressionText(\n existingExpression: Node | undefined,\n generatedExpression: Node\n): string {\n if (!existingExpression) {\n return generatedExpression.getText();\n }\n\n if (\n Node.isObjectLiteralExpression(existingExpression) &&\n Node.isObjectLiteralExpression(generatedExpression)\n ) {\n return alignObjectLiteralText(existingExpression, generatedExpression);\n }\n\n if (\n Node.isArrayLiteralExpression(existingExpression) &&\n Node.isArrayLiteralExpression(generatedExpression)\n ) {\n return alignArrayLiteralText(existingExpression, generatedExpression);\n }\n\n if (Node.isArrowFunction(existingExpression) && Node.isArrowFunction(generatedExpression)) {\n return alignArrowFunctionText(existingExpression, generatedExpression);\n }\n\n if (Node.isCallExpression(existingExpression) && Node.isCallExpression(generatedExpression)) {\n return alignCallExpressionText(existingExpression, generatedExpression);\n }\n\n if (\n Node.isParenthesizedExpression(existingExpression) &&\n Node.isParenthesizedExpression(generatedExpression)\n ) {\n const alignedInnerText = alignExpressionText(\n existingExpression.getExpression(),\n generatedExpression.getExpression()\n );\n return `(${alignedInnerText})`;\n }\n\n return generatedExpression.getText();\n}\n\nfunction alignCallExpressionText(\n existingCall: ReturnType<SourceFile['getDescendantsOfKind']>[number],\n generatedCall: ReturnType<SourceFile['getDescendantsOfKind']>[number]\n): string {\n if (!Node.isCallExpression(existingCall) || !Node.isCallExpression(generatedCall)) {\n return generatedCall.getText();\n }\n\n const generatedText = generatedCall.getText();\n const generatedCallStart = generatedCall.getStart();\n const existingArguments = existingCall.getArguments();\n const generatedArguments = generatedCall.getArguments();\n const replacements: TextReplacement[] = [];\n\n for (const [index, generatedArgument] of generatedArguments.entries()) {\n const existingArgument = existingArguments[index];\n if (!existingArgument) {\n continue;\n }\n\n const alignedArgumentText = alignExpressionText(existingArgument, generatedArgument);\n if (alignedArgumentText === generatedArgument.getText()) {\n continue;\n }\n\n replacements.push({\n start: generatedArgument.getStart() - generatedCallStart,\n end: generatedArgument.getEnd() - generatedCallStart,\n text: alignedArgumentText,\n });\n }\n\n return applyTextReplacements(generatedText, replacements);\n}\n\nfunction alignArrowFunctionText(\n existingArrow: ReturnType<SourceFile['getDescendantsOfKind']>[number],\n generatedArrow: ReturnType<SourceFile['getDescendantsOfKind']>[number]\n): string {\n if (!Node.isArrowFunction(existingArrow) || !Node.isArrowFunction(generatedArrow)) {\n return generatedArrow.getText();\n }\n\n const existingBody = existingArrow.getBody();\n const generatedBody = generatedArrow.getBody();\n if (!Node.isExpression(existingBody) || !Node.isExpression(generatedBody)) {\n return generatedArrow.getText();\n }\n\n const alignedBodyText = alignExpressionText(existingBody, generatedBody);\n if (alignedBodyText === generatedBody.getText()) {\n return generatedArrow.getText();\n }\n\n return applyTextReplacements(generatedArrow.getText(), [\n {\n start: generatedBody.getStart() - generatedArrow.getStart(),\n end: generatedBody.getEnd() - generatedArrow.getStart(),\n text: alignedBodyText,\n },\n ]);\n}\n\nfunction alignObjectLiteralText(\n existingObject: ObjectLiteralExpression,\n generatedObject: ObjectLiteralExpression\n): string {\n const orderedProperties = orderObjectProperties(\n existingObject.getProperties(),\n generatedObject.getProperties()\n );\n\n const propertyTexts = orderedProperties.map(({ existingProperty, generatedProperty }) => {\n if (!existingProperty) {\n return generatedProperty.getText();\n }\n\n return withPreservedLeadingComments(\n existingProperty,\n alignObjectPropertyText(existingProperty, generatedProperty)\n );\n });\n\n return formatCollectionLiteralText(generatedObject.getText(), propertyTexts, '{', '}');\n}\n\nfunction alignObjectPropertyText(existingProperty: Node, generatedProperty: Node): string {\n const text = generatedProperty.getText();\n\n if (!Node.isPropertyAssignment(generatedProperty)) {\n return text;\n }\n\n const generatedInitializer = generatedProperty.getInitializer();\n if (!generatedInitializer) {\n return text;\n }\n const existingInitializer = Node.isPropertyAssignment(existingProperty)\n ? existingProperty.getInitializer()\n : undefined;\n const alignedInitializerText = alignExpressionText(existingInitializer, generatedInitializer);\n return `${generatedProperty.getNameNode().getText()}: ${alignedInitializerText}`;\n}\n\nfunction alignArrayLiteralText(\n existingArray: ReturnType<SourceFile['getDescendantsOfKind']>[number],\n generatedArray: ReturnType<SourceFile['getDescendantsOfKind']>[number]\n): string {\n if (\n !Node.isArrayLiteralExpression(existingArray) ||\n !Node.isArrayLiteralExpression(generatedArray)\n ) {\n return generatedArray.getText();\n }\n\n const orderedElements = orderArrayElements(\n existingArray.getElements(),\n generatedArray.getElements()\n );\n const elementTexts = orderedElements.map(({ existingElement, generatedElement }) =>\n alignExpressionText(existingElement, generatedElement)\n );\n\n return formatCollectionLiteralText(generatedArray.getText(), elementTexts, '[', ']');\n}\n\nfunction orderObjectProperties(existingProperties: Node[], generatedProperties: Node[]) {\n return orderNodesBySignature(\n existingProperties,\n generatedProperties,\n getObjectPropertyKey,\n getObjectPropertyKey\n ).map(({ existingNode, generatedNode }) => ({\n existingProperty: existingNode,\n generatedProperty: generatedNode,\n }));\n}\n\nfunction orderArrayElements(existingElements: Node[], generatedElements: Node[]) {\n return orderNodesBySignature(\n existingElements,\n generatedElements,\n getArrayElementSignature,\n getArrayElementSignature\n ).map(({ existingNode, generatedNode }) => ({\n existingElement: existingNode,\n generatedElement: generatedNode,\n }));\n}\n\nfunction orderNodesBySignature<TExisting extends Node, TGenerated extends Node>(\n existingNodes: TExisting[],\n generatedNodes: TGenerated[],\n getExistingSignature: (node: TExisting) => string | undefined,\n getGeneratedSignature: (node: TGenerated) => string | undefined\n) {\n const generatedEntries = generatedNodes.map((generatedNode) => ({\n generatedNode,\n signature: getGeneratedSignature(generatedNode),\n }));\n const usedGeneratedIndexes = new Set<number>();\n const ordered: Array<{ existingNode?: TExisting; generatedNode: TGenerated }> = [];\n\n for (const existingNode of existingNodes) {\n const existingSignature = getExistingSignature(existingNode);\n if (!existingSignature) {\n continue;\n }\n const generatedIndex = generatedEntries.findIndex(\n (entry, index) => !usedGeneratedIndexes.has(index) && entry.signature === existingSignature\n );\n if (generatedIndex === -1) {\n continue;\n }\n\n const generatedEntry = generatedEntries[generatedIndex];\n if (!generatedEntry) {\n continue;\n }\n\n usedGeneratedIndexes.add(generatedIndex);\n ordered.push({\n existingNode,\n generatedNode: generatedEntry.generatedNode,\n });\n }\n\n for (const [index, generatedEntry] of generatedEntries.entries()) {\n if (usedGeneratedIndexes.has(index)) {\n continue;\n }\n ordered.push({ generatedNode: generatedEntry.generatedNode });\n }\n\n return ordered;\n}\n\nfunction getObjectPropertyKey(property: Node): string | undefined {\n if (\n Node.isPropertyAssignment(property) ||\n Node.isShorthandPropertyAssignment(property) ||\n Node.isMethodDeclaration(property) ||\n Node.isGetAccessorDeclaration(property) ||\n Node.isSetAccessorDeclaration(property)\n ) {\n return property.getName();\n }\n\n if (Node.isSpreadAssignment(property)) {\n return `...${property.getExpression().getText()}`;\n }\n return;\n}\n\nfunction getArrayElementSignature(node: Node): string {\n if (Node.isIdentifier(node)) {\n return `id:${node.getText()}`;\n }\n\n if (Node.isStringLiteral(node)) {\n return `str:${node.getLiteralValue()}`;\n }\n\n if (Node.isObjectLiteralExpression(node)) {\n const objectId =\n readStringLiteralObjectProperty(node, 'id') ||\n readStringLiteralObjectProperty(node, 'type') ||\n readStringLiteralObjectProperty(node, 'name');\n if (objectId) {\n return `obj:${objectId}`;\n }\n }\n\n if (Node.isCallExpression(node)) {\n const expression = node.getExpression();\n if (Node.isPropertyAccessExpression(expression) && expression.getName() === 'with') {\n return `with:${expression.getExpression().getText()}`;\n }\n }\n\n return node.getText();\n}\n\nfunction readStringLiteralObjectProperty(\n objectLiteral: ObjectLiteralExpression,\n propertyName: string\n): string | undefined {\n const property = objectLiteral.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n return;\n }\n const initializer = property.getInitializer();\n if (!initializer || !Node.isStringLiteral(initializer)) {\n return;\n }\n\n return initializer.getLiteralValue();\n}\n\nfunction formatCollectionLiteralText(\n originalText: string,\n itemTexts: string[],\n openToken: '{' | '[',\n closeToken: '}' | ']'\n): string {\n if (originalText.includes('\\n')) {\n return `${openToken}\\n${itemTexts.join(',\\n')}${closeToken}`;\n }\n\n const openingWithSpacing = originalText.startsWith(`${openToken} `) ? `${openToken} ` : openToken;\n const closingWithSpacing = originalText.endsWith(` ${closeToken}`)\n ? ` ${closeToken}`\n : closeToken;\n\n return `${openingWithSpacing}${itemTexts.join(', ')}${closingWithSpacing}`;\n}\n\ninterface TextReplacement {\n start: number;\n end: number;\n text: string;\n}\n\nfunction applyTextReplacements(sourceText: string, replacements: TextReplacement[]): string {\n if (!replacements.length) {\n return sourceText;\n }\n\n let nextText = sourceText;\n const replacementsInDescendingOrder = [...replacements].sort((a, b) => b.start - a.start);\n for (const replacement of replacementsInDescendingOrder) {\n nextText =\n nextText.slice(0, replacement.start) + replacement.text + nextText.slice(replacement.end);\n }\n\n return nextText;\n}\n\nfunction withPreservedLeadingComments(existingStatement: Node, replacementText: string): string {\n const leadingComments = existingStatement\n .getLeadingCommentRanges()\n .map((comment) => normalizePreservedCommentText(comment.getText()))\n .join('\\n');\n if (!leadingComments) {\n return replacementText;\n }\n\n return `${leadingComments}\\n${replacementText}`;\n}\n\nfunction normalizePreservedCommentText(commentText: string): string {\n if (!commentText.includes('\\n') || !commentText.startsWith('/*')) {\n return commentText;\n }\n\n const [firstLine, ...remainingLines] = commentText.split('\\n');\n if (!firstLine || !remainingLines.length) {\n return commentText;\n }\n\n const isStarBlockComment = remainingLines.every((line) => line.trimStart().startsWith('*'));\n if (!isStarBlockComment) {\n return commentText;\n }\n\n return [\n firstLine.trimStart(),\n ...remainingLines.map((line) => {\n const trimmedLine = line.trimStart();\n return trimmedLine && ` ${trimmedLine}`;\n }),\n ].join('\\n');\n}\n\nfunction dedupeConsecutiveIdenticalSingleLineComments(content: string): string {\n const lines = content.split('\\n');\n const deduped: string[] = [];\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n const previousLine = deduped.at(-1);\n const previousTrimmedLine = previousLine?.trim();\n const isDuplicateSingleLineComment =\n trimmedLine.startsWith('//') &&\n previousTrimmedLine?.startsWith('//') &&\n trimmedLine === previousTrimmedLine;\n\n if (isDuplicateSingleLineComment) {\n continue;\n }\n\n deduped.push(line);\n }\n\n return deduped.join('\\n');\n}\n"],"mappings":"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"}
|