@codemation/core-nodes 0.0.15 → 0.0.18

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["OpenAIChatModelFactory","name: string","model: string","credentialSlotKey: string","options?: Readonly<{\n temperature?: number;\n maxTokens?: number;\n }>","AIAgentExecutionHelpersFactory","NodeBackedToolRuntime","nodeResolver: NodeResolver","AIAgentNode","nodeResolver: NodeResolver","credentialSessions: CredentialSessionService","nodeBackedToolRuntime: NodeBackedToolRuntime","executionHelpers: AIAgentExecutionHelpersFactory","out: Item[]","conversation: BaseMessage[]","finalResponse: AIMessage | undefined","CallbackNode","name: string","callback: CallbackHandler<TInputJson, TOutputJson>","id?: string","HttpRequestNode","output: Item[]","outputItem: Item","values: Record<string, string>","name: string","args: Readonly<{\n method?: string;\n urlField?: string;\n binaryName?: string;\n downloadMode?: HttpRequestDownloadMode;\n id?: string;\n }>","retryPolicy: RetryPolicySpec","IfNode","t: Item[]","f: Item[]","tagged: Item","name: string","predicate: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<If<TInputJson>>,\n ) => boolean","id?: string","ManualTriggerNode","name: string","MapDataNode","out: Item[]","name: string","map: (\n item: Item<TInputJson>,\n ctx: NodeExecutionContext<MapData<TInputJson, TOutputJson>>,\n ) => TOutputJson","id?: string","MergeNode","out: Item[]","out","json: Record<string, unknown>","paired: any[]","meta: Record<string, unknown> | undefined","merged: any","fallback: Item[]","name: string","cfg: Readonly<{\n mode: MergeMode;\n /**\n * Deterministic input precedence order (only used for passThrough/append).\n * Any inputs not listed are appended in lexicographic order.\n */\n prefer?: ReadonlyArray<InputPortKey>;\n }>","id?: string","NoOpNode","name: string","id?: string","SubWorkflowNode","workflows: WorkflowRunnerService","out: Item[]","name: string","workflowId: string","upstreamRefs?: Array<{ nodeId: NodeId } | UpstreamRefPlaceholder>","startAt?: NodeId","id?: string","WaitNode","name: string","milliseconds: number","id?: string","responseItems: Items","continueItems: Items","responseItems: Items","WebhookTriggerNode","name: string","args: Readonly<{\n endpointKey: string;\n methods: ReadonlyArray<HttpMethod>;\n inputSchema?: TSchema;\n }>","handler: WebhookTriggerHandler<\n WebhookTrigger<TSchema>\n >","id?: string","ConnectionCredentialNode","connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory","extraNodes: NodeDefinition[]","extraConnections: WorkflowNodeConnection[]","node","toolIds: string[]","name: string","credentialSource: { getCredentialRequirements?: () => ReadonlyArray<CredentialRequirement> }"],"sources":["../src/chatModels/OpenAIChatModelFactory.ts","../src/chatModels/openAiChatModelConfig.ts","../src/chatModels/OpenAiChatModelPresetsFactory.ts","../src/nodes/AgentMessageFactory.ts","../src/nodes/AgentOutputFactory.ts","../src/nodes/AgentToolCallPortMapFactory.ts","../src/nodes/ConnectionCredentialExecutionContextFactory.ts","../src/nodes/AIAgentExecutionHelpersFactory.ts","../src/nodes/NodeBackedToolRuntime.ts","../src/nodes/aiAgentSupport.types.ts","../src/nodes/AIAgentNode.ts","../src/nodes/AIAgentConfig.ts","../src/nodes/CallbackResultNormalizerFactory.ts","../src/nodes/CallbackNode.ts","../src/nodes/CallbackNodeFactory.ts","../src/nodes/HttpRequestNodeFactory.ts","../src/nodes/httpRequest.ts","../src/nodes/IfNode.ts","../src/nodes/if.ts","../src/nodes/ManualTriggerNode.ts","../src/nodes/ManualTriggerFactory.ts","../src/nodes/MapDataNode.ts","../src/nodes/mapData.ts","../src/nodes/mergeExecutionUtils.types.ts","../src/nodes/MergeNode.ts","../src/nodes/merge.ts","../src/nodes/NoOpNode.ts","../src/nodes/noOp.ts","../src/nodes/SubWorkflowNode.ts","../src/nodes/subWorkflow.ts","../src/nodes/WaitDurationFactory.ts","../src/nodes/WaitNode.ts","../src/nodes/wait.ts","../src/nodes/webhookRespondNowAndContinueError.ts","../src/nodes/webhookRespondNowError.ts","../src/nodes/webhookTriggerNode.ts","../src/nodes/WebhookTriggerFactory.ts","../src/nodes/ConnectionCredentialNode.ts","../src/register.types.ts","../src/workflowBuilder.types.ts","../src/workflows/AIAgentConnectionWorkflowExpander.ts","../src/nodes/ConnectionCredentialNodeConfig.ts","../src/nodes/ConnectionCredentialNodeConfigFactory.ts"],"sourcesContent":["import type { ChatModelFactory, LangChainChatModelLike, NodeExecutionContext } from \"@codemation/core\";\nimport { chatModel } from \"@codemation/core\";\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { OpenAiCredentialSession } from \"./OpenAiCredentialSession\";\nimport type { OpenAIChatModelConfig } from \"./openAiChatModelConfig\";\n\n@chatModel({ packageName: \"@codemation/core-nodes\" })\nexport class OpenAIChatModelFactory implements ChatModelFactory<OpenAIChatModelConfig> {\n async create(\n args: Readonly<{ config: OpenAIChatModelConfig; ctx: NodeExecutionContext<any> }>,\n ): Promise<LangChainChatModelLike> {\n const session = await args.ctx.getCredential<OpenAiCredentialSession>(args.config.credentialSlotKey);\n return new ChatOpenAI({\n apiKey: session.apiKey,\n model: args.config.model,\n temperature: args.config.options?.temperature,\n maxTokens: args.config.options?.maxTokens,\n configuration: session.baseUrl ? { baseURL: session.baseUrl } : undefined,\n });\n }\n}\n","import type { AgentCanvasPresentation, ChatModelConfig, CredentialRequirement } from \"@codemation/core\";\n\nimport type { CanvasIconName } from \"../canvasIconName\";\nimport { OpenAIChatModelFactory } from \"./OpenAIChatModelFactory\";\n\nexport class OpenAIChatModelConfig implements ChatModelConfig {\n readonly type = OpenAIChatModelFactory;\n readonly presentation: AgentCanvasPresentation<CanvasIconName>;\n\n constructor(\n public readonly name: string,\n public readonly model: string,\n public readonly credentialSlotKey: string = \"openai\",\n presentationIn?: AgentCanvasPresentation<CanvasIconName>,\n public readonly options?: Readonly<{\n temperature?: number;\n maxTokens?: number;\n }>,\n ) {\n this.presentation = presentationIn ?? { icon: \"builtin:openai\", label: name };\n }\n\n getCredentialRequirements(): ReadonlyArray<CredentialRequirement> {\n return [\n {\n slotKey: this.credentialSlotKey,\n label: \"OpenAI API key\",\n acceptedTypes: [\"openai.apiKey\"],\n },\n ];\n }\n}\n","import { OpenAIChatModelConfig } from \"./openAiChatModelConfig\";\n\n/**\n * Default OpenAI chat model configs for scaffolds and demos (icon + label match {@link OpenAIChatModelConfig} defaults).\n * Prefer importing {@link openAiChatModelPresets} from here or from the consumer template re-export\n * instead of repeating {@link OpenAIChatModelConfig} construction in app workflows.\n */\nexport class OpenAiChatModelPresets {\n readonly demoGpt4oMini = new OpenAIChatModelConfig(\"OpenAI\", \"gpt-4o-mini\");\n\n readonly demoGpt41 = new OpenAIChatModelConfig(\"OpenAI\", \"gpt-4.1\");\n}\n\nexport const openAiChatModelPresets = new OpenAiChatModelPresets();\n","import type { AgentMessageDto, AgentToolCall } from \"@codemation/core\";\n\nimport { AIMessage, HumanMessage, SystemMessage, ToolMessage, type BaseMessage } from \"@langchain/core/messages\";\n\nexport class AgentMessageFactory {\n static createPromptMessages(messages: ReadonlyArray<AgentMessageDto>): ReadonlyArray<BaseMessage> {\n return messages.map((message) => this.createPromptMessage(message));\n }\n\n static createSystemPrompt(systemMessage: string): SystemMessage {\n return new SystemMessage(systemMessage);\n }\n\n static createUserPrompt(prompt: string): HumanMessage {\n return new HumanMessage(prompt);\n }\n\n static createAssistantPrompt(prompt: string): AIMessage {\n return new AIMessage(prompt);\n }\n\n static createToolMessage(toolCallId: string, content: string): ToolMessage {\n return new ToolMessage({ tool_call_id: toolCallId, content });\n }\n\n static extractContent(message: unknown): string {\n if (typeof message === \"string\") return message;\n if (!this.isRecord(message)) return String(message);\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === \"string\") return part;\n if (this.isRecord(part) && typeof part.text === \"string\") return part.text;\n return JSON.stringify(part);\n })\n .join(\"\\n\");\n }\n return JSON.stringify(content);\n }\n\n static extractToolCalls(message: unknown): ReadonlyArray<AgentToolCall> {\n if (!this.isRecord(message)) return [];\n const toolCalls = message.tool_calls;\n if (!Array.isArray(toolCalls)) return [];\n return toolCalls\n .filter((toolCall) => this.isRecord(toolCall) && typeof toolCall.name === \"string\")\n .map((toolCall) => ({\n id: typeof toolCall.id === \"string\" ? toolCall.id : undefined,\n name: toolCall.name as string,\n input: this.isRecord(toolCall) && \"args\" in toolCall ? toolCall.args : undefined,\n }));\n }\n\n private static isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n }\n\n private static createPromptMessage(message: AgentMessageDto): BaseMessage {\n if (message.role === \"system\") {\n return this.createSystemPrompt(message.content);\n }\n if (message.role === \"assistant\") {\n return this.createAssistantPrompt(message.content);\n }\n return this.createUserPrompt(message.content);\n }\n}\n","import type { Item, NodeOutputs } from \"@codemation/core\";\n\nexport class AgentOutputFactory {\n static fromUnknown(value: unknown): NodeOutputs {\n return { main: [{ json: value }] };\n }\n\n static replaceJson(item: Item, value: unknown): Item {\n return {\n ...item,\n json: value,\n };\n }\n\n static fromAgentContent(content: string): unknown {\n try {\n return JSON.parse(content) as unknown;\n } catch {\n return { output: content };\n }\n }\n}\n","import type { NodeInputsByPort } from \"@codemation/core\";\n\nexport class AgentToolCallPortMap {\n static fromInput(input: unknown): NodeInputsByPort {\n return {\n in: [\n {\n json: input,\n },\n ],\n };\n }\n}\n","import type {\n CredentialRequirement,\n CredentialSessionService,\n NodeConfigBase,\n NodeExecutionContext,\n NodeId,\n} from \"@codemation/core\";\n\nimport { CredentialResolverFactory } from \"@codemation/core/bootstrap\";\n\n/**\n * Builds a {@link NodeExecutionContext} whose identity for credential binding and `getCredential`\n * is a **connection-owned** workflow node id (`ConnectionNodeIdFactory` in `@codemation/core`),\n * not the executing parent node. Use for LLM slots, tool slots, or any connection-scoped owner.\n */\nexport class ConnectionCredentialExecutionContextFactory {\n private readonly credentialResolverFactory: CredentialResolverFactory;\n\n constructor(credentialSessions: CredentialSessionService) {\n this.credentialResolverFactory = new CredentialResolverFactory(credentialSessions);\n }\n\n forConnectionNode<TConfig extends NodeConfigBase>(\n ctx: NodeExecutionContext<TConfig>,\n args: Readonly<{\n connectionNodeId: NodeId;\n getCredentialRequirements: () => ReadonlyArray<CredentialRequirement>;\n }>,\n ): NodeExecutionContext<TConfig> {\n const stubConfig = { getCredentialRequirements: args.getCredentialRequirements } as NodeConfigBase;\n const getCredential = this.credentialResolverFactory.create(ctx.workflowId, args.connectionNodeId, stubConfig);\n return {\n ...ctx,\n nodeId: args.connectionNodeId,\n getCredential,\n };\n }\n}\n","import type { CredentialSessionService, Item, Items, NodeExecutionContext } from \"@codemation/core\";\nimport { injectable } from \"@codemation/core\";\n\nimport { DynamicStructuredTool } from \"@langchain/core/tools\";\n\nimport { ConnectionCredentialExecutionContextFactory } from \"./ConnectionCredentialExecutionContextFactory\";\nimport type { ResolvedTool } from \"./aiAgentSupport.types\";\n\n/**\n * LangChain adapters and credential context wiring for {@link AIAgentNode}.\n * Lives in a `*Factory.ts` composition-root module so construction stays explicit and testable.\n */\n@injectable()\nexport class AIAgentExecutionHelpersFactory {\n createConnectionCredentialExecutionContextFactory(\n credentialSessions: CredentialSessionService,\n ): ConnectionCredentialExecutionContextFactory {\n return new ConnectionCredentialExecutionContextFactory(credentialSessions);\n }\n\n createDynamicStructuredTool(\n entry: ResolvedTool,\n toolCredentialContext: NodeExecutionContext<any>,\n item: Item,\n itemIndex: number,\n items: Items,\n ): DynamicStructuredTool {\n return new DynamicStructuredTool({\n name: entry.config.name,\n description: entry.config.description ?? entry.runtime.defaultDescription,\n schema: entry.runtime.inputSchema,\n func: async (input) => {\n const result = await entry.runtime.execute({\n config: entry.config,\n input,\n ctx: toolCredentialContext,\n item,\n itemIndex,\n items,\n });\n return JSON.stringify(result);\n },\n });\n }\n}\n","import type {\n MultiInputNode,\n Node,\n NodeExecutionContext,\n NodeOutputs,\n NodeResolver,\n NodeBackedToolConfig,\n ToolExecuteArgs,\n ZodSchemaAny,\n} from \"@codemation/core\";\nimport { CoreTokens, inject, injectable } from \"@codemation/core\";\n\n@injectable()\nexport class NodeBackedToolRuntime {\n constructor(\n @inject(CoreTokens.NodeResolver)\n private readonly nodeResolver: NodeResolver,\n ) {}\n\n async execute(\n config: NodeBackedToolConfig<any, ZodSchemaAny, ZodSchemaAny>,\n args: ToolExecuteArgs,\n ): Promise<unknown> {\n const nodeInput = config.toNodeItem({\n input: args.input,\n item: args.item,\n itemIndex: args.itemIndex,\n items: args.items,\n ctx: args.ctx,\n node: config.node,\n });\n const nodeCtx = {\n ...args.ctx,\n config: config.node,\n } as NodeExecutionContext<any>;\n const resolvedNode = this.nodeResolver.resolve(config.node.type);\n const outputs = await this.executeResolvedNode(resolvedNode, nodeInput, nodeCtx);\n return config.toToolOutput({\n input: args.input,\n item: args.item,\n itemIndex: args.itemIndex,\n items: args.items,\n ctx: args.ctx,\n node: config.node,\n outputs,\n });\n }\n\n private async executeResolvedNode(\n resolvedNode: unknown,\n nodeInput: ToolExecuteArgs[\"item\"],\n ctx: NodeExecutionContext<any>,\n ): Promise<NodeOutputs> {\n if (this.isMultiInputNode(resolvedNode)) {\n return await resolvedNode.executeMulti({ in: [nodeInput] }, ctx);\n }\n if (this.isNode(resolvedNode)) {\n return await resolvedNode.execute([nodeInput], ctx);\n }\n throw new Error(`Node-backed tool expected a runnable node instance for \"${ctx.config.name ?? ctx.nodeId}\".`);\n }\n\n private isNode(value: unknown): value is Node<any> {\n return typeof value === \"object\" && value !== null && \"execute\" in value;\n }\n\n private isMultiInputNode(value: unknown): value is MultiInputNode<any> {\n return typeof value === \"object\" && value !== null && \"executeMulti\" in value;\n }\n}\n","import type {\n AgentToolCall,\n Item,\n NodeInputsByPort,\n ToolConfig,\n ToolExecuteArgs,\n ZodSchemaAny,\n} from \"@codemation/core\";\nimport type { DynamicStructuredTool } from \"@langchain/core/tools\";\n\nexport class AgentItemPortMap {\n static fromItem(item: Item): NodeInputsByPort {\n return { in: [item] };\n }\n}\n\nexport type ResolvedTool = Readonly<{\n config: ToolConfig;\n runtime: Readonly<{\n defaultDescription: string;\n inputSchema: ZodSchemaAny;\n execute(args: ToolExecuteArgs<ToolConfig, unknown>): Promise<unknown>;\n }>;\n}>;\n\nexport type ItemScopedToolBinding = Readonly<{\n config: ToolConfig;\n langChainTool: DynamicStructuredTool;\n}>;\n\nexport type PlannedToolCall = Readonly<{\n binding: ItemScopedToolBinding;\n toolCall: AgentToolCall;\n invocationIndex: number;\n nodeId: string;\n}>;\n\nexport type ExecutedToolCall = Readonly<{\n toolName: string;\n toolCallId: string;\n result: unknown;\n serialized: string;\n}>;\n","import type {\n AgentGuardrailConfig,\n AgentToolCall,\n ChatModelConfig,\n ChatModelFactory,\n Item,\n Items,\n JsonValue,\n LangChainChatModelLike,\n Node,\n NodeExecutionContext,\n NodeInputsByPort,\n NodeOutputs,\n Tool,\n ToolConfig,\n ZodSchemaAny,\n} from \"@codemation/core\";\n\nimport type { CredentialSessionService } from \"@codemation/core\";\nimport {\n AgentGuardrailDefaults,\n AgentMessageConfigNormalizer,\n ConnectionInvocationIdFactory,\n ConnectionNodeIdFactory,\n CoreTokens,\n NodeBackedToolConfig,\n inject,\n node,\n type NodeResolver,\n} from \"@codemation/core\";\n\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\n\nimport type { AIAgent } from \"./AIAgentConfig\";\nimport { AIAgentExecutionHelpersFactory } from \"./AIAgentExecutionHelpersFactory\";\nimport { ConnectionCredentialExecutionContextFactory } from \"./ConnectionCredentialExecutionContextFactory\";\nimport { AgentMessageFactory } from \"./AgentMessageFactory\";\nimport { AgentOutputFactory } from \"./AgentOutputFactory\";\nimport { AgentToolCallPortMap } from \"./AgentToolCallPortMapFactory\";\nimport { NodeBackedToolRuntime } from \"./NodeBackedToolRuntime\";\nimport {\n AgentItemPortMap,\n type ExecutedToolCall,\n type ItemScopedToolBinding,\n type PlannedToolCall,\n type ResolvedTool,\n} from \"./aiAgentSupport.types\";\n\ntype ResolvedGuardrails = Required<Pick<AgentGuardrailConfig, \"maxTurns\" | \"onTurnLimitReached\">> &\n Pick<AgentGuardrailConfig, \"modelInvocationOptions\">;\n\n/** Everything needed to run the agent loop for a workflow execution (one `execute` call). */\ninterface PreparedAgentExecution {\n readonly ctx: NodeExecutionContext<AIAgent<any, any>>;\n readonly model: LangChainChatModelLike;\n readonly resolvedTools: ReadonlyArray<ResolvedTool>;\n readonly guardrails: ResolvedGuardrails;\n readonly languageModelConnectionNodeId: string;\n}\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class AIAgentNode implements Node<AIAgent<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n private readonly connectionCredentialExecutionContextFactory: ConnectionCredentialExecutionContextFactory;\n\n constructor(\n @inject(CoreTokens.NodeResolver)\n private readonly nodeResolver: NodeResolver,\n @inject(CoreTokens.CredentialSessionService)\n credentialSessions: CredentialSessionService,\n @inject(NodeBackedToolRuntime)\n private readonly nodeBackedToolRuntime: NodeBackedToolRuntime,\n @inject(AIAgentExecutionHelpersFactory)\n private readonly executionHelpers: AIAgentExecutionHelpersFactory,\n ) {\n this.connectionCredentialExecutionContextFactory =\n this.executionHelpers.createConnectionCredentialExecutionContextFactory(credentialSessions);\n }\n\n async execute(items: Items, ctx: NodeExecutionContext<AIAgent<any, any>>): Promise<NodeOutputs> {\n const prepared = await this.prepareExecution(ctx);\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n out.push(await this.runAgentForItem(prepared, items[i]!, i, items));\n }\n return { main: out };\n }\n\n /**\n * Resolves the chat model and tools once, then returns shared state for every item in the batch.\n */\n private async prepareExecution(ctx: NodeExecutionContext<AIAgent<any, any>>): Promise<PreparedAgentExecution> {\n const chatModelFactory = this.nodeResolver.resolve(ctx.config.chatModel.type) as ChatModelFactory<ChatModelConfig>;\n const languageModelCredentialContext = this.connectionCredentialExecutionContextFactory.forConnectionNode(ctx, {\n connectionNodeId: ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n getCredentialRequirements: () => ctx.config.chatModel.getCredentialRequirements?.() ?? [],\n });\n const model = await Promise.resolve(\n chatModelFactory.create({ config: ctx.config.chatModel, ctx: languageModelCredentialContext }),\n );\n return {\n ctx,\n model,\n resolvedTools: this.resolveTools(ctx.config.tools ?? []),\n guardrails: this.resolveGuardrails(ctx.config.guardrails),\n languageModelConnectionNodeId: ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n };\n }\n\n /**\n * One item: build prompts, optionally bind tools, run the multi-turn loop, map the final model message to workflow JSON.\n */\n private async runAgentForItem(\n prepared: PreparedAgentExecution,\n item: Item,\n itemIndex: number,\n items: Items,\n ): Promise<Item> {\n const { ctx } = prepared;\n const itemInputsByPort = AgentItemPortMap.fromItem(item);\n const itemScopedTools = this.createItemScopedTools(prepared.resolvedTools, ctx, item, itemIndex, items);\n const conversation: BaseMessage[] = [...this.createPromptMessages(item, itemIndex, items, ctx)];\n const modelWithTools = this.bindToolsToModel(prepared.model, itemScopedTools);\n const finalResponse = await this.runTurnLoopUntilFinalAnswer({\n prepared,\n itemInputsByPort,\n itemScopedTools,\n conversation,\n modelWithTools,\n });\n return this.buildOutputItem(item, finalResponse);\n }\n\n /**\n * Repeatedly invokes the model until it returns without tool calls, or guardrails end the loop.\n */\n private async runTurnLoopUntilFinalAnswer(args: {\n prepared: PreparedAgentExecution;\n itemInputsByPort: NodeInputsByPort;\n itemScopedTools: ReadonlyArray<ItemScopedToolBinding>;\n conversation: BaseMessage[];\n modelWithTools: LangChainChatModelLike;\n }): Promise<AIMessage> {\n const { prepared, itemInputsByPort, itemScopedTools, conversation, modelWithTools } = args;\n const { ctx, guardrails, languageModelConnectionNodeId } = prepared;\n\n let finalResponse: AIMessage | undefined;\n\n for (let turn = 1; turn <= guardrails.maxTurns; turn++) {\n const response = await this.invokeModel(\n modelWithTools,\n languageModelConnectionNodeId,\n conversation,\n ctx,\n itemInputsByPort,\n guardrails.modelInvocationOptions,\n );\n finalResponse = response;\n\n const toolCalls = AgentMessageFactory.extractToolCalls(response);\n if (toolCalls.length === 0) {\n break;\n }\n\n if (this.cannotExecuteAnotherToolRound(turn, guardrails)) {\n this.finishOrThrowWhenTurnCapHitWithToolCalls(ctx, guardrails);\n break;\n }\n\n const plannedToolCalls = this.planToolCalls(itemScopedTools, toolCalls, ctx.nodeId);\n await this.markQueuedTools(plannedToolCalls, ctx);\n const executedToolCalls = await this.executeToolCalls(plannedToolCalls, ctx);\n this.appendAssistantAndToolMessages(conversation, response, executedToolCalls);\n }\n\n if (!finalResponse) {\n throw new Error(`AIAgent \"${ctx.config.name ?? ctx.nodeId}\" did not produce a model response.`);\n }\n return finalResponse;\n }\n\n private cannotExecuteAnotherToolRound(turn: number, guardrails: ResolvedGuardrails): boolean {\n return turn >= guardrails.maxTurns;\n }\n\n private finishOrThrowWhenTurnCapHitWithToolCalls(\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n guardrails: ResolvedGuardrails,\n ): void {\n if (guardrails.onTurnLimitReached === \"respondWithLastMessage\") {\n return;\n }\n throw new Error(\n `AIAgent \"${ctx.config.name ?? ctx.nodeId}\" reached maxTurns=${guardrails.maxTurns} before producing a final response.`,\n );\n }\n\n private appendAssistantAndToolMessages(\n conversation: BaseMessage[],\n assistantMessage: AIMessage,\n executedToolCalls: ReadonlyArray<ExecutedToolCall>,\n ): void {\n conversation.push(\n assistantMessage,\n ...executedToolCalls.map((toolCall) =>\n AgentMessageFactory.createToolMessage(toolCall.toolCallId, toolCall.serialized),\n ),\n );\n }\n\n private buildOutputItem(item: Item, finalResponse: AIMessage): Item {\n return AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(finalResponse)),\n );\n }\n\n private bindToolsToModel(\n model: LangChainChatModelLike,\n itemScopedTools: ReadonlyArray<ItemScopedToolBinding>,\n ): LangChainChatModelLike {\n if (itemScopedTools.length === 0 || !model.bindTools) {\n return model;\n }\n return model.bindTools(itemScopedTools.map((entry) => entry.langChainTool));\n }\n\n private resolveTools(toolConfigs: ReadonlyArray<ToolConfig>): ReadonlyArray<ResolvedTool> {\n const resolvedTools = toolConfigs.map((config) => ({\n config,\n runtime: this.resolveToolRuntime(config),\n }));\n\n const names = new Set<string>();\n for (const entry of resolvedTools) {\n if (names.has(entry.config.name)) throw new Error(`Duplicate tool name on AIAgent: ${entry.config.name}`);\n names.add(entry.config.name);\n }\n return resolvedTools;\n }\n\n private createItemScopedTools(\n tools: ReadonlyArray<ResolvedTool>,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n item: Item,\n itemIndex: number,\n items: Items,\n ): ReadonlyArray<ItemScopedToolBinding> {\n return tools.map((entry) => {\n const toolCredentialContext = this.connectionCredentialExecutionContextFactory.forConnectionNode(ctx, {\n connectionNodeId: ConnectionNodeIdFactory.toolConnectionNodeId(ctx.nodeId, entry.config.name),\n getCredentialRequirements: () => entry.config.getCredentialRequirements?.() ?? [],\n });\n const langChainTool = this.executionHelpers.createDynamicStructuredTool(\n entry,\n toolCredentialContext,\n item,\n itemIndex,\n items,\n );\n\n return { config: entry.config, langChainTool };\n });\n }\n\n private async invokeModel(\n model: LangChainChatModelLike,\n nodeId: string,\n messages: ReadonlyArray<BaseMessage>,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n inputsByPort: NodeInputsByPort,\n options?: AgentGuardrailConfig[\"modelInvocationOptions\"],\n ): Promise<AIMessage> {\n await ctx.nodeState?.markQueued({ nodeId, activationId: ctx.activationId, inputsByPort });\n await ctx.nodeState?.markRunning({ nodeId, activationId: ctx.activationId, inputsByPort });\n try {\n const response = (await model.invoke(messages, options)) as AIMessage;\n await ctx.nodeState?.markCompleted({\n nodeId,\n activationId: ctx.activationId,\n inputsByPort,\n outputs: AgentOutputFactory.fromUnknown({\n content: AgentMessageFactory.extractContent(response),\n }),\n });\n const content = AgentMessageFactory.extractContent(response);\n await ctx.nodeState?.appendConnectionInvocation({\n invocationId: ConnectionInvocationIdFactory.create(),\n connectionNodeId: nodeId,\n parentAgentNodeId: ctx.nodeId,\n parentAgentActivationId: ctx.activationId,\n status: \"completed\",\n managedInput: this.summarizeLlmMessages(messages),\n managedOutput: content,\n finishedAt: new Date().toISOString(),\n });\n return response;\n } catch (error) {\n throw await this.failTrackedNodeInvocation(error, nodeId, ctx, inputsByPort, this.summarizeLlmMessages(messages));\n }\n }\n\n private async markQueuedTools(\n plannedToolCalls: ReadonlyArray<PlannedToolCall>,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n ): Promise<void> {\n for (const plannedToolCall of plannedToolCalls) {\n await ctx.nodeState?.markQueued({\n nodeId: plannedToolCall.nodeId,\n activationId: ctx.activationId,\n inputsByPort: AgentToolCallPortMap.fromInput(plannedToolCall.toolCall.input ?? {}),\n });\n }\n }\n\n private async executeToolCalls(\n plannedToolCalls: ReadonlyArray<PlannedToolCall>,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n ): Promise<ReadonlyArray<ExecutedToolCall>> {\n const results = await Promise.allSettled(\n plannedToolCalls.map(async (plannedToolCall) => {\n const toolCallInputsByPort = AgentToolCallPortMap.fromInput(plannedToolCall.toolCall.input ?? {});\n await ctx.nodeState?.markRunning({\n nodeId: plannedToolCall.nodeId,\n activationId: ctx.activationId,\n inputsByPort: toolCallInputsByPort,\n });\n try {\n const serialized = await plannedToolCall.binding.langChainTool.invoke(plannedToolCall.toolCall.input ?? {});\n const result = this.parseToolOutput(serialized);\n await ctx.nodeState?.markCompleted({\n nodeId: plannedToolCall.nodeId,\n activationId: ctx.activationId,\n inputsByPort: toolCallInputsByPort,\n outputs: AgentOutputFactory.fromUnknown(result),\n });\n await ctx.nodeState?.appendConnectionInvocation({\n invocationId: ConnectionInvocationIdFactory.create(),\n connectionNodeId: plannedToolCall.nodeId,\n parentAgentNodeId: ctx.nodeId,\n parentAgentActivationId: ctx.activationId,\n status: \"completed\",\n managedInput: this.toolCallInputToJson(plannedToolCall.toolCall.input),\n managedOutput: this.resultToJsonValue(result),\n finishedAt: new Date().toISOString(),\n });\n return {\n toolName: plannedToolCall.binding.config.name,\n toolCallId: plannedToolCall.toolCall.id ?? plannedToolCall.binding.config.name,\n serialized,\n result,\n } satisfies ExecutedToolCall;\n } catch (error) {\n throw await this.failTrackedNodeInvocation(\n error,\n plannedToolCall.nodeId,\n ctx,\n toolCallInputsByPort,\n this.toolCallInputToJson(plannedToolCall.toolCall.input),\n );\n }\n }),\n );\n\n const rejected = results.find((result) => result.status === \"rejected\");\n if (rejected?.status === \"rejected\") {\n throw rejected.reason instanceof Error ? rejected.reason : new Error(String(rejected.reason));\n }\n\n return results\n .filter((result): result is PromiseFulfilledResult<ExecutedToolCall> => result.status === \"fulfilled\")\n .map((result) => result.value);\n }\n\n private planToolCalls(\n bindings: ReadonlyArray<ItemScopedToolBinding>,\n toolCalls: ReadonlyArray<AgentToolCall>,\n parentNodeId: string,\n ): ReadonlyArray<PlannedToolCall> {\n const invocationCountByToolName = new Map<string, number>();\n return toolCalls.map((toolCall) => {\n const binding = bindings.find((entry) => entry.config.name === toolCall.name);\n if (!binding) throw new Error(`Unknown tool requested by model: ${toolCall.name}`);\n const invocationIndex = (invocationCountByToolName.get(binding.config.name) ?? 0) + 1;\n invocationCountByToolName.set(binding.config.name, invocationIndex);\n return {\n binding,\n toolCall,\n invocationIndex,\n nodeId: ConnectionNodeIdFactory.toolConnectionNodeId(parentNodeId, binding.config.name),\n } satisfies PlannedToolCall;\n });\n }\n\n private parseToolOutput(serialized: unknown): unknown {\n if (typeof serialized !== \"string\") return serialized;\n try {\n return JSON.parse(serialized);\n } catch {\n return serialized;\n }\n }\n\n private async failTrackedNodeInvocation(\n error: unknown,\n nodeId: string,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n inputsByPort: NodeInputsByPort,\n managedInput?: JsonValue,\n ): Promise<Error> {\n const effectiveError = error instanceof Error ? error : new Error(String(error));\n await ctx.nodeState?.markFailed({\n nodeId,\n activationId: ctx.activationId,\n inputsByPort,\n error: effectiveError,\n });\n await ctx.nodeState?.appendConnectionInvocation({\n invocationId: ConnectionInvocationIdFactory.create(),\n connectionNodeId: nodeId,\n parentAgentNodeId: ctx.nodeId,\n parentAgentActivationId: ctx.activationId,\n status: \"failed\",\n managedInput,\n error: {\n message: effectiveError.message,\n name: effectiveError.name,\n stack: effectiveError.stack,\n },\n finishedAt: new Date().toISOString(),\n });\n return effectiveError;\n }\n\n private summarizeLlmMessages(messages: ReadonlyArray<BaseMessage>): JsonValue {\n const last = messages[messages.length - 1];\n const preview =\n typeof last?.content === \"string\"\n ? last.content\n : last?.content !== undefined\n ? JSON.stringify(last.content)\n : \"\";\n return {\n messageCount: messages.length,\n lastMessagePreview: preview.slice(0, 4000),\n };\n }\n\n private toolCallInputToJson(input: unknown): JsonValue | undefined {\n return this.resultToJsonValue(input);\n }\n\n private resultToJsonValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n const json = JSON.stringify(value);\n return JSON.parse(json) as JsonValue;\n }\n\n private createPromptMessages(\n item: Item,\n itemIndex: number,\n items: Items,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n ): ReadonlyArray<BaseMessage> {\n return AgentMessageFactory.createPromptMessages(\n AgentMessageConfigNormalizer.normalize(ctx.config, {\n item,\n itemIndex,\n items,\n ctx,\n }),\n );\n }\n\n private resolveToolRuntime(config: ToolConfig): ResolvedTool[\"runtime\"] {\n if (config instanceof NodeBackedToolConfig) {\n return {\n defaultDescription: `Run workflow node \"${config.node.name ?? config.name}\" as an AI tool.`,\n inputSchema: config.getInputSchema(),\n execute: async (args) => await this.nodeBackedToolRuntime.execute(config, args),\n };\n }\n const tool = this.nodeResolver.resolve(config.type) as Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>;\n return {\n defaultDescription: tool.defaultDescription,\n inputSchema: tool.inputSchema,\n execute: async (args) => await Promise.resolve(tool.execute(args)),\n };\n }\n\n private resolveGuardrails(guardrails: AgentGuardrailConfig | undefined): ResolvedGuardrails {\n const maxTurns = guardrails?.maxTurns ?? AgentGuardrailDefaults.maxTurns;\n if (!Number.isInteger(maxTurns) || maxTurns < 1) {\n throw new Error(`AIAgent maxTurns must be a positive integer. Received: ${String(maxTurns)}`);\n }\n return {\n maxTurns,\n onTurnLimitReached: guardrails?.onTurnLimitReached ?? AgentGuardrailDefaults.onTurnLimitReached,\n modelInvocationOptions: guardrails?.modelInvocationOptions,\n };\n }\n}\n","import {\n RetryPolicy,\n type AgentGuardrailConfig,\n type AgentMessageConfig,\n type AgentNodeConfig,\n type ChatModelConfig,\n type RetryPolicySpec,\n type RunnableNodeConfig,\n type ToolConfig,\n type TypeToken,\n} from \"@codemation/core\";\n\nimport { AIAgentNode } from \"./AIAgentNode\";\n\nexport interface AIAgentOptions<TInputJson = unknown, _TOutputJson = unknown> {\n readonly name: string;\n readonly messages: AgentMessageConfig<TInputJson>;\n readonly chatModel: ChatModelConfig;\n readonly tools?: ReadonlyArray<ToolConfig>;\n readonly id?: string;\n readonly retryPolicy?: RetryPolicySpec;\n readonly guardrails?: AgentGuardrailConfig;\n}\n\n/**\n * AI agent: credential bindings are keyed to connection-owned LLM/tool node ids (ConnectionNodeIdFactory),\n * not to the agent workflow node id.\n */\nexport class AIAgent<TInputJson = unknown, TOutputJson = unknown>\n implements RunnableNodeConfig<TInputJson, TOutputJson>, AgentNodeConfig<TInputJson, TOutputJson>\n{\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = AIAgentNode;\n readonly execution = { hint: \"local\" } as const;\n readonly icon = \"lucide:bot\" as const;\n readonly name: string;\n readonly messages: AgentMessageConfig<TInputJson>;\n readonly chatModel: ChatModelConfig;\n readonly tools: ReadonlyArray<ToolConfig>;\n readonly id?: string;\n readonly retryPolicy: RetryPolicySpec;\n readonly guardrails?: AgentGuardrailConfig;\n\n constructor(options: AIAgentOptions<TInputJson, TOutputJson>) {\n this.name = options.name;\n this.messages = options.messages;\n this.chatModel = options.chatModel;\n this.tools = options.tools ?? [];\n this.id = options.id;\n this.retryPolicy = options.retryPolicy ?? RetryPolicy.defaultForAiAgent;\n this.guardrails = options.guardrails;\n }\n}\n","import type { Items, NodeOutputs } from \"@codemation/core\";\n\nexport class CallbackResultNormalizer {\n static toNodeOutputs(result: Items | void, items: Items): NodeOutputs {\n return { main: result ?? items };\n }\n}\n","import type { Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { Callback } from \"./CallbackNodeFactory\";\nimport { CallbackResultNormalizer } from \"./CallbackResultNormalizerFactory\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class CallbackNode implements Node<Callback<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<Callback<any, any>>): Promise<NodeOutputs> {\n const result = await ctx.config.callback(items, ctx);\n return CallbackResultNormalizer.toNodeOutputs(result, items);\n }\n}\n","import type { Items, NodeExecutionContext, RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { CallbackNode } from \"./CallbackNode\";\n\nexport type CallbackHandler<\n TInputJson = unknown,\n TOutputJson = TInputJson,\n TConfig extends Callback<TInputJson, TOutputJson> = Callback<TInputJson, TOutputJson>,\n> = (\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<TConfig>,\n) => Promise<Items<TOutputJson> | void> | Items<TOutputJson> | void;\n\nexport class Callback<TInputJson = unknown, TOutputJson = TInputJson> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = CallbackNode;\n readonly execution = { hint: \"local\" } as const;\n readonly icon = \"lucide:braces\" as const;\n\n constructor(\n public readonly name: string = \"Callback\",\n public readonly callback: CallbackHandler<TInputJson, TOutputJson> = Callback.defaultCallback as CallbackHandler<\n TInputJson,\n TOutputJson\n >,\n public readonly id?: string,\n ) {}\n\n private static defaultCallback<TItemJson>(items: Items<TItemJson>): Items<TItemJson> {\n return items;\n }\n}\n\nexport { CallbackNode } from \"./CallbackNode\";\nexport { CallbackResultNormalizer } from \"./CallbackResultNormalizerFactory\";\n","import type { Item, Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport type { HttpRequestDownloadMode } from \"./httpRequest\";\nimport { HttpRequest } from \"./httpRequest\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class HttpRequestNode implements Node<HttpRequest<any, any>> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<HttpRequest<any, any>>): Promise<NodeOutputs> {\n const output: Item[] = [];\n for (const item of items) {\n output.push(await this.executeItem(item, ctx));\n }\n return { main: output };\n }\n\n private async executeItem(item: Item, ctx: NodeExecutionContext<HttpRequest<any, any>>): Promise<Item> {\n const url = this.resolveUrl(item, ctx);\n const response = await fetch(url, {\n method: ctx.config.method,\n });\n const headers = this.readHeaders(response.headers);\n const mimeType = this.resolveMimeType(headers);\n const bodyBinaryName = ctx.config.binaryName;\n const shouldAttachBody = this.shouldAttachBody(ctx.config.downloadMode, mimeType);\n const outputJson: Readonly<Record<string, unknown>> = {\n url,\n method: ctx.config.method,\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n mimeType,\n headers,\n ...(shouldAttachBody ? { bodyBinaryName } : {}),\n };\n\n let outputItem: Item = {\n json: outputJson,\n };\n if (!shouldAttachBody) {\n return outputItem;\n }\n\n const attachment = await ctx.binary.attach({\n name: bodyBinaryName,\n body: response.body\n ? (response.body as unknown as Parameters<typeof ctx.binary.attach>[0][\"body\"])\n : new Uint8Array(await response.arrayBuffer()),\n mimeType,\n filename: this.resolveFilename(url, headers),\n });\n outputItem = ctx.binary.withAttachment(outputItem, bodyBinaryName, attachment);\n return outputItem;\n }\n\n private resolveUrl(item: Item, ctx: NodeExecutionContext<HttpRequest<any, any>>): string {\n const json = this.asRecord(item.json);\n const candidate = json[ctx.config.urlField];\n if (typeof candidate !== \"string\" || candidate.trim() === \"\") {\n throw new Error(`HttpRequest node expected item.json.${ctx.config.urlField} to contain a URL string.`);\n }\n return candidate;\n }\n\n private asRecord(value: unknown): Readonly<Record<string, unknown>> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Readonly<Record<string, unknown>>;\n }\n return { input: value };\n }\n\n private readHeaders(headers: Headers): Readonly<Record<string, string>> {\n const values: Record<string, string> = {};\n headers.forEach((value, key) => {\n values[key] = value;\n });\n return values;\n }\n\n private resolveMimeType(headers: Readonly<Record<string, string>>): string {\n const contentType = headers[\"content-type\"];\n if (!contentType) {\n return \"application/octet-stream\";\n }\n return contentType.split(\";\")[0]?.trim() || \"application/octet-stream\";\n }\n\n private shouldAttachBody(mode: HttpRequestDownloadMode, mimeType: string): boolean {\n if (mode === \"always\") {\n return true;\n }\n if (mode === \"never\") {\n return false;\n }\n return mimeType.startsWith(\"image/\") || mimeType.startsWith(\"audio/\") || mimeType.startsWith(\"video/\");\n }\n\n private resolveFilename(url: string, headers: Readonly<Record<string, string>>): string | undefined {\n const contentDisposition = headers[\"content-disposition\"];\n const fromDisposition = this.readFilenameFromContentDisposition(contentDisposition);\n if (fromDisposition) {\n return fromDisposition;\n }\n const pathname = new URL(url).pathname;\n const value = pathname.split(\"/\").at(-1);\n return value && value.trim() ? value : undefined;\n }\n\n private readFilenameFromContentDisposition(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const parts = value.split(\";\");\n for (const part of parts) {\n const trimmed = part.trim();\n if (!trimmed.startsWith(\"filename=\")) {\n continue;\n }\n return trimmed.slice(\"filename=\".length).replace(/^\"|\"$/g, \"\");\n }\n return undefined;\n }\n}\n","import { RetryPolicy, type RetryPolicySpec, type RunnableNodeConfig, type TypeToken } from \"@codemation/core\";\n\nimport { HttpRequestNode } from \"./HttpRequestNodeFactory\";\n\nexport type HttpRequestDownloadMode = \"auto\" | \"always\" | \"never\";\n\n/** JSON emitted by {@link HttpRequest} — response metadata only (input item fields are not passed through). */\nexport type HttpRequestOutputJson = Readonly<{\n url: string;\n method: string;\n ok: boolean;\n status: number;\n statusText: string;\n mimeType: string;\n headers: Readonly<Record<string, string>>;\n bodyBinaryName?: string;\n}>;\n\nexport class HttpRequest<\n TInputJson = Readonly<{ url?: string }>,\n TOutputJson = HttpRequestOutputJson,\n> implements RunnableNodeConfig<TInputJson, TOutputJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = HttpRequestNode;\n readonly execution = { hint: \"local\" } as const;\n\n constructor(\n public readonly name: string,\n public readonly args: Readonly<{\n method?: string;\n urlField?: string;\n binaryName?: string;\n downloadMode?: HttpRequestDownloadMode;\n id?: string;\n }> = {},\n public readonly retryPolicy: RetryPolicySpec = RetryPolicy.defaultForHttp,\n ) {}\n\n get id(): string | undefined {\n return this.args.id;\n }\n\n get method(): string {\n return (this.args.method ?? \"GET\").toUpperCase();\n }\n\n get urlField(): string {\n return this.args.urlField ?? \"url\";\n }\n\n get binaryName(): string {\n return this.args.binaryName ?? \"body\";\n }\n\n get downloadMode(): HttpRequestDownloadMode {\n return this.args.downloadMode ?? \"auto\";\n }\n}\n\nexport { HttpRequestNode } from \"./HttpRequestNodeFactory\";\n","import type { Item, Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { If } from \"./if\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class IfNode implements Node<If<any>> {\n kind = \"node\" as const;\n outputPorts = [\"true\", \"false\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<If<any>>): Promise<NodeOutputs> {\n const t: Item[] = [];\n const f: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as Item<unknown>;\n const metaBase = (\n item.meta && typeof item.meta === \"object\" ? (item.meta as Record<string, unknown>) : {}\n ) as Record<string, unknown>;\n const cmBase =\n metaBase._cm && typeof metaBase._cm === \"object\"\n ? (metaBase._cm as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n const originIndex = typeof cmBase.originIndex === \"number\" ? (cmBase.originIndex as number) : i;\n const tagged: Item = {\n ...item,\n meta: { ...metaBase, _cm: { ...cmBase, originIndex } },\n paired: [{ nodeId: ctx.nodeId, output: \"$in\", itemIndex: originIndex }, ...(item.paired ?? [])],\n };\n const ok = ctx.config.predicate(item, i, items, ctx);\n (ok ? t : f).push(tagged);\n }\n return { true: t, false: f };\n }\n}\n","import type { Item, Items, NodeExecutionContext, RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { IfNode } from \"./IfNode\";\n\nexport class If<TInputJson = unknown> implements RunnableNodeConfig<TInputJson, TInputJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = IfNode;\n readonly execution = { hint: \"local\" } as const;\n readonly icon = \"lucide:split\" as const;\n constructor(\n public readonly name: string,\n public readonly predicate: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<If<TInputJson>>,\n ) => boolean,\n public readonly id?: string,\n ) {}\n}\n\nexport { IfNode } from \"./IfNode\";\n","import type {\n Items,\n NodeExecutionContext,\n NodeOutputs,\n TestableTriggerNode,\n TriggerSetupContext,\n TriggerTestItemsContext,\n} from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { ManualTrigger } from \"./ManualTriggerFactory\";\n\n/**\n * Setup is intentionally a no-op: the engine host can run workflows manually\n * by calling `engine.runWorkflow(workflow, triggerNodeId, items)`.\n */\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class ManualTriggerNode implements TestableTriggerNode<ManualTrigger<any>> {\n kind = \"trigger\" as const;\n outputPorts = [\"main\"] as const;\n async setup(_ctx: TriggerSetupContext<ManualTrigger<any>>): Promise<undefined> {\n return undefined;\n }\n\n async getTestItems(ctx: TriggerTestItemsContext<ManualTrigger<any>>): Promise<Items> {\n return this.resolveManualItems([], ctx.config);\n }\n\n async execute(items: Items, ctx: NodeExecutionContext<ManualTrigger<any>>): Promise<NodeOutputs> {\n return { main: this.resolveManualItems(items, ctx.config) };\n }\n\n private resolveManualItems(items: Items, config: ManualTrigger<any>): Items {\n return items.length > 0 ? items : (config.defaultItems ?? []);\n }\n}\n","import type { Items, TriggerNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { ItemsInputNormalizer } from \"@codemation/core\";\n\nimport { ManualTriggerNode } from \"./ManualTriggerNode\";\n\ntype ManualTriggerDefaultValue<TOutputJson> = Items<TOutputJson> | ReadonlyArray<TOutputJson> | TOutputJson;\n\nexport class ManualTrigger<TOutputJson = unknown> implements TriggerNodeConfig<TOutputJson> {\n private static readonly itemsInputNormalizer = new ItemsInputNormalizer();\n readonly kind = \"trigger\" as const;\n readonly type: TypeToken<unknown> = ManualTriggerNode;\n readonly icon = \"lucide:play\" as const;\n readonly defaultItems?: Items<TOutputJson>;\n readonly id?: string;\n /** Manual runs often emit an empty batch; still schedule downstream by default. */\n readonly continueWhenEmptyOutput = true as const;\n\n constructor(name?: string, id?: string);\n constructor(name: string, defaultItems: ManualTriggerDefaultValue<TOutputJson>, id?: string);\n constructor(\n public readonly name: string = \"Manual trigger\",\n defaultItemsOrId?: ManualTriggerDefaultValue<TOutputJson> | string,\n id?: string,\n ) {\n this.defaultItems = ManualTrigger.resolveDefaultItems(defaultItemsOrId);\n this.id = ManualTrigger.resolveId(defaultItemsOrId, id);\n }\n\n private static resolveDefaultItems<TOutputJson>(\n value: ManualTriggerDefaultValue<TOutputJson> | string | undefined,\n ): Items<TOutputJson> | undefined {\n if (typeof value === \"string\" || value === undefined) {\n return undefined;\n }\n return this.itemsInputNormalizer.normalize(value) as Items<TOutputJson>;\n }\n\n private static resolveId<TOutputJson>(\n value: ManualTriggerDefaultValue<TOutputJson> | string | undefined,\n id: string | undefined,\n ): string | undefined {\n return typeof value === \"string\" ? value : id;\n }\n}\n\nexport { ManualTriggerNode } from \"./ManualTriggerNode\";\n","import type { Item, Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { MapData } from \"./mapData\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class MapDataNode implements Node<MapData<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<MapData<any, any>>): Promise<NodeOutputs> {\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as Item<unknown>;\n out.push({ ...item, json: ctx.config.map(item, ctx) });\n }\n return { main: out };\n }\n}\n","import type { Item, NodeExecutionContext, RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { MapDataNode } from \"./MapDataNode\";\n\nexport class MapData<TInputJson = unknown, TOutputJson = unknown> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = MapDataNode;\n readonly execution = { hint: \"local\" } as const;\n /** Zero mapped items should still allow downstream nodes to run. */\n readonly continueWhenEmptyOutput = true as const;\n constructor(\n public readonly name: string,\n public readonly map: (\n item: Item<TInputJson>,\n ctx: NodeExecutionContext<MapData<TInputJson, TOutputJson>>,\n ) => TOutputJson,\n public readonly id?: string,\n ) {}\n}\n\nexport { MapDataNode } from \"./MapDataNode\";\n","import type { InputPortKey, Item, Items } from \"@codemation/core\";\n\nexport function getOriginIndex(item: Item): number | undefined {\n const meta = item.meta as Record<string, unknown> | undefined;\n const cm = meta?._cm as Record<string, unknown> | undefined;\n const v = cm?.originIndex;\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\nexport function orderedInputs(\n inputsByPort: Readonly<Record<InputPortKey, Items>>,\n prefer?: ReadonlyArray<InputPortKey>,\n): InputPortKey[] {\n const keys = Object.keys(inputsByPort);\n const preferred = (prefer ?? []).filter((k) => keys.includes(k));\n const rest = keys.filter((k) => !preferred.includes(k)).sort();\n return [...preferred, ...rest];\n}\n","import type { InputPortKey, Item, Items, MultiInputNode, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport type { Merge } from \"./merge\";\nimport { getOriginIndex, orderedInputs } from \"./mergeExecutionUtils.types\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class MergeNode implements MultiInputNode<Merge<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async executeMulti(\n inputsByPort: Readonly<Record<InputPortKey, Items>>,\n ctx: NodeExecutionContext<Merge<any, any>>,\n ): Promise<NodeOutputs> {\n const order = orderedInputs(inputsByPort, ctx.config.cfg.prefer);\n\n if (ctx.config.cfg.mode === \"append\") {\n const out: Item[] = [];\n for (const k of order) out.push(...(inputsByPort[k] ?? []));\n return { main: out };\n }\n\n if (ctx.config.cfg.mode === \"mergeByPosition\") {\n let maxLen = 0;\n for (const k of order) maxLen = Math.max(maxLen, (inputsByPort[k] ?? []).length);\n\n const out: Item[] = [];\n for (let i = 0; i < maxLen; i++) {\n const json: Record<string, unknown> = {};\n const paired: any[] = [];\n let meta: Record<string, unknown> | undefined;\n\n for (const k of order) {\n const item = (inputsByPort[k] ?? [])[i];\n json[k] = item?.json;\n if (item?.paired) paired.push(...item.paired);\n if (!meta && item?.meta) meta = { ...(item.meta as any) };\n }\n\n const merged: any = { json };\n if (paired.length > 0) merged.paired = paired;\n if (meta) merged.meta = meta;\n out.push(merged as Item);\n }\n\n return { main: out };\n }\n\n // passThrough (default): for each origin index, take first available input (deterministic input precedence).\n const chosenByOrigin = new Map<number, Item>();\n const fallback: Item[] = [];\n\n for (const k of order) {\n for (const item of inputsByPort[k] ?? []) {\n const origin = getOriginIndex(item);\n if (origin === undefined) {\n fallback.push(item);\n continue;\n }\n if (!chosenByOrigin.has(origin)) chosenByOrigin.set(origin, item);\n }\n }\n\n const out: Item[] = [];\n const origins = Array.from(chosenByOrigin.keys()).sort((a, b) => a - b);\n for (const o of origins) out.push(chosenByOrigin.get(o)!);\n out.push(...fallback);\n\n return { main: out };\n }\n}\n","import type { InputPortKey, RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { MergeNode } from \"./MergeNode\";\n\nexport type MergeMode = \"passThrough\" | \"append\" | \"mergeByPosition\";\n\nexport class Merge<TInputJson = unknown, TOutputJson = TInputJson> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = MergeNode;\n readonly icon = \"lucide:git-merge\" as const;\n\n constructor(\n public readonly name: string,\n public readonly cfg: Readonly<{\n mode: MergeMode;\n /**\n * Deterministic input precedence order (only used for passThrough/append).\n * Any inputs not listed are appended in lexicographic order.\n */\n prefer?: ReadonlyArray<InputPortKey>;\n }> = { mode: \"passThrough\" },\n public readonly id?: string,\n ) {}\n}\n\nexport { MergeNode } from \"./MergeNode\";\n","import type { Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { NoOp } from \"./noOp\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class NoOpNode implements Node<NoOp<any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(items: Items, _ctx: NodeExecutionContext<NoOp<any>>): Promise<NodeOutputs> {\n return { main: items };\n }\n}\n","import type { RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { NoOpNode } from \"./NoOpNode\";\n\nexport class NoOp<TItemJson = unknown> implements RunnableNodeConfig<TItemJson, TItemJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = NoOpNode;\n readonly execution = { hint: \"local\" } as const;\n\n constructor(\n public readonly name: string = \"NoOp\",\n public readonly id?: string,\n ) {}\n}\n\nexport { NoOpNode } from \"./NoOpNode\";\n","import type { Item, Items, Node, NodeExecutionContext, NodeOutputs, WorkflowRunnerService } from \"@codemation/core\";\n\nimport { CoreTokens, inject, node } from \"@codemation/core\";\n\nimport { SubWorkflow } from \"./subWorkflow\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class SubWorkflowNode implements Node<SubWorkflow<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n constructor(\n @inject(CoreTokens.WorkflowRunnerService)\n private readonly workflows: WorkflowRunnerService,\n ) {}\n\n async execute(items: Items, ctx: NodeExecutionContext<SubWorkflow<any, any>>): Promise<NodeOutputs> {\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const current = items[i]!;\n const metaBase = (\n current.meta && typeof current.meta === \"object\" ? (current.meta as Record<string, unknown>) : {}\n ) as Record<string, unknown>;\n const cmBase =\n metaBase._cm && typeof metaBase._cm === \"object\"\n ? (metaBase._cm as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n const originIndex = typeof cmBase.originIndex === \"number\" ? (cmBase.originIndex as number) : undefined;\n\n const result = await this.workflows.runById({\n workflowId: ctx.config.workflowId,\n startAt: ctx.config.startAt,\n items: [current],\n parent: {\n runId: ctx.runId,\n workflowId: ctx.workflowId,\n nodeId: ctx.nodeId,\n subworkflowDepth: ctx.subworkflowDepth,\n engineMaxNodeActivations: ctx.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: ctx.engineMaxSubworkflowDepth,\n },\n });\n if (result.status !== \"completed\")\n throw new Error(`Subworkflow ${ctx.config.workflowId} did not complete (status=${result.status})`);\n for (const produced of result.outputs) {\n const childMetaBase =\n produced.meta && typeof produced.meta === \"object\"\n ? (produced.meta as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n const childCmBase =\n childMetaBase._cm && typeof childMetaBase._cm === \"object\"\n ? (childMetaBase._cm as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n\n out.push({\n ...produced,\n meta: originIndex === undefined ? childMetaBase : { ...childMetaBase, _cm: { ...childCmBase, originIndex } },\n paired: current.paired ?? produced.paired,\n });\n }\n }\n\n return { main: out };\n }\n}\n","import type { NodeId, RunnableNodeConfig, TypeToken, UpstreamRefPlaceholder } from \"@codemation/core\";\n\nimport { SubWorkflowNode } from \"./SubWorkflowNode\";\n\nexport class SubWorkflow<TInputJson = unknown, TOutputJson = unknown> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = SubWorkflowNode;\n constructor(\n public readonly name: string,\n public readonly workflowId: string,\n public upstreamRefs?: Array<{ nodeId: NodeId } | UpstreamRefPlaceholder>,\n public readonly startAt?: NodeId,\n public readonly id?: string,\n ) {}\n}\n\nexport { SubWorkflowNode } from \"./SubWorkflowNode\";\n","export class WaitDuration {\n static normalize(milliseconds: number): number {\n return Number.isFinite(milliseconds) && milliseconds > 0 ? Math.floor(milliseconds) : 0;\n }\n}\n","import type { Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { Wait } from \"./wait\";\nimport { WaitDuration } from \"./WaitDurationFactory\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class WaitNode implements Node<Wait<any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<Wait<any>>): Promise<NodeOutputs> {\n const milliseconds = WaitDuration.normalize(ctx.config.milliseconds);\n if (milliseconds > 0) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, milliseconds);\n });\n }\n return { main: items };\n }\n}\n","import type { RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { WaitNode } from \"./WaitNode\";\n\nexport class Wait<TItemJson = unknown> implements RunnableNodeConfig<TItemJson, TItemJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = WaitNode;\n readonly execution = { hint: \"local\" } as const;\n /** Pass-through empty batches should still advance to downstream nodes. */\n readonly continueWhenEmptyOutput = true as const;\n\n constructor(\n public readonly name: string,\n public readonly milliseconds: number,\n public readonly id?: string,\n ) {}\n}\n\nexport { WaitDuration } from \"./WaitDurationFactory\";\nexport { WaitNode } from \"./WaitNode\";\n","import type { Items, WebhookControlSignal } from \"@codemation/core\";\n\nexport class WebhookRespondNowAndContinueError extends Error implements WebhookControlSignal {\n readonly __webhookControl = true as const;\n readonly kind = \"respondNowAndContinue\" as const;\n\n constructor(\n public readonly responseItems: Items,\n public readonly continueItems: Items,\n message: string = \"Webhook responded immediately and continued the run.\",\n ) {\n super(message);\n this.name = \"WebhookRespondNowAndContinueError\";\n }\n}\n","import type { Items, WebhookControlSignal } from \"@codemation/core\";\n\nexport class WebhookRespondNowError extends Error implements WebhookControlSignal {\n readonly __webhookControl = true as const;\n readonly kind = \"respondNow\" as const;\n\n constructor(\n public readonly responseItems: Items,\n message: string = \"Webhook responded immediately.\",\n ) {\n super(message);\n this.name = \"WebhookRespondNowError\";\n }\n}\n","import type {\n ExecutableTriggerNode,\n Items,\n NodeExecutionContext,\n NodeOutputs,\n TriggerSetupContext,\n} from \"@codemation/core\";\nimport { node } from \"@codemation/core\";\nimport { WebhookTrigger } from \"./WebhookTriggerFactory\";\n\n/**\n * HTTP webhooks are not registered in trigger setup. The host exposes a single catch-all route\n * (e.g. `/api/webhooks/:endpointPath`); the engine's catalog-backed webhook matcher resolves the\n * user-defined endpoint path to this workflow + node, then runs the workflow from this trigger.\n */\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class WebhookTriggerNode implements ExecutableTriggerNode<WebhookTrigger<any>> {\n readonly kind = \"trigger\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async setup(_ctx: TriggerSetupContext<WebhookTrigger<any>>): Promise<undefined> {\n return undefined;\n }\n\n async execute(items: Items, _ctx: NodeExecutionContext<WebhookTrigger<any>>): Promise<NodeOutputs> {\n if (items.length === 0) {\n throw new Error(\n `Webhook trigger \"${_ctx.config.name}\" requires a webhook request. Invoke this workflow through its webhook endpoint until manual request simulation is supported.`,\n );\n }\n const result = await _ctx.config.handler(items, _ctx);\n return { main: result ?? items };\n }\n}\n","import type { HttpMethod, Items, NodeExecutionContext, TriggerNodeConfig, TypeToken } from \"@codemation/core\";\nimport type { ZodType } from \"zod\";\nimport { WebhookTriggerNode } from \"./webhookTriggerNode\";\n\ntype WebhookInputSchema = ZodType<any, any, any>;\ntype WebhookTriggerHandler<TConfig extends WebhookTrigger<any> = WebhookTrigger<any>> = (\n items: Items,\n ctx: NodeExecutionContext<TConfig>,\n) => Promise<Items | void> | Items | void;\n\nexport class WebhookTrigger<\n TSchema extends WebhookInputSchema | undefined = undefined,\n> implements TriggerNodeConfig<unknown> {\n readonly kind = \"trigger\" as const;\n readonly type: TypeToken<unknown> = WebhookTriggerNode;\n readonly icon = \"lucide:globe\";\n\n constructor(\n public readonly name: string,\n private readonly args: Readonly<{\n endpointKey: string;\n methods: ReadonlyArray<HttpMethod>;\n inputSchema?: TSchema;\n }>,\n public readonly handler: WebhookTriggerHandler<\n WebhookTrigger<TSchema>\n > = WebhookTrigger.defaultHandler as WebhookTriggerHandler<WebhookTrigger<TSchema>>,\n public readonly id?: string,\n ) {}\n\n get endpointKey(): string {\n return this.args.endpointKey;\n }\n\n get methods(): ReadonlyArray<HttpMethod> {\n return this.args.methods;\n }\n\n get inputSchema(): TSchema | undefined {\n return this.args.inputSchema;\n }\n\n parseJsonBody(body: unknown): unknown {\n if (!this.args.inputSchema) return body;\n return this.args.inputSchema.parse(body);\n }\n\n private static defaultHandler(items: Items): Items {\n return items;\n }\n}\n","import type { Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\nimport { node } from \"@codemation/core\";\n\nimport type { ConnectionCredentialNodeConfig } from \"./ConnectionCredentialNodeConfig\";\n\n/**\n * Placeholder runnable node for connection-owned workflow nodes (LLM/tool slots).\n * The engine does not schedule these; they exist for credentials, tokens, and UI identity.\n */\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class ConnectionCredentialNode implements Node<ConnectionCredentialNodeConfig> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(_items: Items, _ctx: NodeExecutionContext<ConnectionCredentialNodeConfig>): Promise<NodeOutputs> {\n return { main: [] };\n }\n}\n","import type { Container } from \"@codemation/core\";\nimport { AIAgentExecutionHelpersFactory, AIAgentNode } from \"./nodes/aiAgent\";\nimport { CallbackNode } from \"./nodes/CallbackNodeFactory\";\nimport { HttpRequestNode } from \"./nodes/httpRequest\";\nimport { IfNode } from \"./nodes/if\";\nimport { ManualTriggerNode } from \"./nodes/ManualTriggerFactory\";\nimport { MapDataNode } from \"./nodes/mapData\";\nimport { NoOpNode } from \"./nodes/noOp\";\nimport { SubWorkflowNode } from \"./nodes/subWorkflow\";\nimport { WaitNode } from \"./nodes/wait\";\nimport { ConnectionCredentialNode } from \"./nodes/ConnectionCredentialNode\";\n\n/**\n * Registrar for built-in nodes. In a real project, this would use tsyringe's\n * container.registerSingleton(...). For the skeleton we keep it token-based:\n * the engine resolves node implementations by class token.\n */\nexport function registerCoreNodes(container: Container): void {\n // With class tokens, resolving registers happen via the DI container setup.\n // This function exists as the standardized extension point.\n void container;\n\n // Example: if using tsyringe, you'd do:\n // tsyringeContainer.registerSingleton(IfNode, IfNode);\n // ...\n void IfNode;\n void HttpRequestNode;\n void CallbackNode;\n void MapDataNode;\n void NoOpNode;\n void SubWorkflowNode;\n void ManualTriggerNode;\n void AIAgentNode;\n void AIAgentExecutionHelpersFactory;\n void WaitNode;\n void ConnectionCredentialNode;\n}\n","import type { WorkflowId } from \"@codemation/core\";\nimport { WorkflowBuilder } from \"@codemation/core\";\nimport { Merge } from \"./nodes/merge\";\n\nexport function createWorkflowBuilder(meta: Readonly<{ id: WorkflowId; name: string }>): WorkflowBuilder {\n return new WorkflowBuilder(meta, {\n makeMergeNode: (name) => new Merge(name, { mode: \"passThrough\", prefer: [\"true\", \"false\"] }),\n });\n}\n","import type { NodeDefinition, WorkflowDefinition, WorkflowNodeConnection } from \"@codemation/core\";\nimport { AgentConfigInspector, ConnectionNodeIdFactory } from \"@codemation/core\";\n\nimport { AIAgentNode } from \"../nodes/AIAgentNode\";\nimport { ConnectionCredentialNode } from \"../nodes/ConnectionCredentialNode\";\nimport { ConnectionCredentialNodeConfigFactory } from \"../nodes/ConnectionCredentialNodeConfigFactory\";\n\n/**\n * Materializes connection-owned child nodes and {@link WorkflowDefinition.connections} for AI agent nodes.\n */\nexport class AIAgentConnectionWorkflowExpander {\n constructor(private readonly connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory) {}\n\n expand(workflow: WorkflowDefinition): WorkflowDefinition {\n const existingByParentAndName = new Map<string, WorkflowNodeConnection>();\n for (const c of workflow.connections ?? []) {\n existingByParentAndName.set(`${c.parentNodeId}\\0${c.connectionName}`, c);\n }\n\n const extraNodes: NodeDefinition[] = [];\n const extraConnections: WorkflowNodeConnection[] = [];\n\n for (const node of workflow.nodes) {\n if (node.type !== AIAgentNode || !AgentConfigInspector.isAgentNodeConfig(node.config)) {\n continue;\n }\n const agentId = node.id;\n const agentConfig = node.config;\n\n if (!existingByParentAndName.has(`${agentId}\\0llm`)) {\n const llmId = ConnectionNodeIdFactory.languageModelConnectionNodeId(agentId);\n this.assertNoIdCollision(workflow, extraNodes, llmId);\n extraNodes.push({\n id: llmId,\n kind: \"node\",\n type: ConnectionCredentialNode,\n name: agentConfig.chatModel.presentation?.label ?? agentConfig.chatModel.name,\n config: this.connectionCredentialNodeConfigFactory.create(agentConfig.chatModel.name, agentConfig.chatModel),\n });\n extraConnections.push({ parentNodeId: agentId, connectionName: \"llm\", childNodeIds: [llmId] });\n }\n\n if (!existingByParentAndName.has(`${agentId}\\0tools`) && (agentConfig.tools?.length ?? 0) > 0) {\n const toolIds: string[] = [];\n for (const tool of agentConfig.tools ?? []) {\n const toolId = ConnectionNodeIdFactory.toolConnectionNodeId(agentId, tool.name);\n this.assertNoIdCollision(workflow, extraNodes, toolId);\n toolIds.push(toolId);\n extraNodes.push({\n id: toolId,\n kind: \"node\",\n type: ConnectionCredentialNode,\n name: tool.presentation?.label ?? tool.name,\n config: this.connectionCredentialNodeConfigFactory.create(tool.name, tool),\n });\n }\n extraConnections.push({ parentNodeId: agentId, connectionName: \"tools\", childNodeIds: toolIds });\n }\n }\n\n if (extraNodes.length === 0) {\n return workflow;\n }\n\n return {\n ...workflow,\n nodes: [...workflow.nodes, ...extraNodes],\n connections: [...(workflow.connections ?? []), ...extraConnections],\n };\n }\n\n private assertNoIdCollision(workflow: WorkflowDefinition, pending: ReadonlyArray<NodeDefinition>, id: string): void {\n if (workflow.nodes.some((n) => n.id === id) || pending.some((n) => n.id === id)) {\n throw new Error(\n `AIAgent connection expansion: node id \"${id}\" already exists. Rename the conflicting node or adjust the workflow.`,\n );\n }\n }\n}\n","import type { CredentialRequirement, RunnableNodeConfig } from \"@codemation/core\";\n\nimport { ConnectionCredentialNode } from \"./ConnectionCredentialNode\";\n\nexport class ConnectionCredentialNodeConfig implements RunnableNodeConfig {\n readonly kind = \"node\" as const;\n readonly type = ConnectionCredentialNode;\n\n constructor(\n public readonly name: string,\n private readonly credentialSource: { getCredentialRequirements?: () => ReadonlyArray<CredentialRequirement> },\n ) {}\n\n getCredentialRequirements(): ReadonlyArray<CredentialRequirement> {\n return this.credentialSource.getCredentialRequirements?.() ?? [];\n }\n}\n","import type { CredentialRequirement } from \"@codemation/core\";\n\nimport { ConnectionCredentialNodeConfig } from \"./ConnectionCredentialNodeConfig\";\n\nexport class ConnectionCredentialNodeConfigFactory {\n create(\n name: string,\n credentialSource: { getCredentialRequirements?: () => ReadonlyArray<CredentialRequirement> },\n ): ConnectionCredentialNodeConfig {\n return new ConnectionCredentialNodeConfig(name, credentialSource);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["OpenAIChatModelFactory","name: string","model: string","credentialSlotKey: string","options?: Readonly<{\n temperature?: number;\n maxTokens?: number;\n }>","AIAgentExecutionHelpersFactory","NodeBackedToolRuntime","nodeResolver: NodeResolver","AIAgentNode","nodeResolver: NodeResolver","credentialSessions: CredentialSessionService","nodeBackedToolRuntime: NodeBackedToolRuntime","executionHelpers: AIAgentExecutionHelpersFactory","out: Item[]","conversation: BaseMessage[]","finalResponse: AIMessage | undefined","CallbackNode","name: string","callback: CallbackHandler<TInputJson, TOutputJson>","id?: string","HttpRequestNode","output: Item[]","outputItem: Item","values: Record<string, string>","name: string","args: Readonly<{\n method?: string;\n urlField?: string;\n binaryName?: string;\n downloadMode?: HttpRequestDownloadMode;\n id?: string;\n }>","retryPolicy: RetryPolicySpec","IfNode","t: Item[]","f: Item[]","tagged: Item","name: string","predicate: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<If<TInputJson>>,\n ) => boolean","id?: string","ManualTriggerNode","name: string","MapDataNode","out: Item[]","name: string","map: (\n item: Item<TInputJson>,\n ctx: NodeExecutionContext<MapData<TInputJson, TOutputJson>>,\n ) => TOutputJson","id?: string","MergeNode","out: Item[]","out","json: Record<string, unknown>","paired: any[]","meta: Record<string, unknown> | undefined","merged: any","fallback: Item[]","name: string","cfg: Readonly<{\n mode: MergeMode;\n /**\n * Deterministic input precedence order (only used for passThrough/append).\n * Any inputs not listed are appended in lexicographic order.\n */\n prefer?: ReadonlyArray<InputPortKey>;\n }>","id?: string","NoOpNode","name: string","id?: string","SubWorkflowNode","workflows: WorkflowRunnerService","out: Item[]","name: string","workflowId: string","upstreamRefs?: Array<{ nodeId: NodeId } | UpstreamRefPlaceholder>","startAt?: NodeId","id?: string","WaitNode","name: string","milliseconds: number","id?: string","responseItems: Items","continueItems: Items","responseItems: Items","WebhookTriggerNode","name: string","args: Readonly<{\n endpointKey: string;\n methods: ReadonlyArray<HttpMethod>;\n inputSchema?: TSchema;\n }>","handler: WebhookTriggerHandler<\n WebhookTrigger<TSchema>\n >","id?: string","ConnectionCredentialNode","steps: ReadonlyArray<AnyRunnableNodeConfig>","chain: ChainCursor<TCurrentJson>","id: string","workflowName: string","connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory","workflow","extraNodes: NodeDefinition[]","extraConnections: WorkflowNodeConnection[]","node","toolIds: string[]","name: string","credentialSource: { getCredentialRequirements?: () => ReadonlyArray<CredentialRequirement> }"],"sources":["../src/chatModels/OpenAIChatModelFactory.ts","../src/chatModels/openAiChatModelConfig.ts","../src/chatModels/OpenAiChatModelPresetsFactory.ts","../src/nodes/AgentMessageFactory.ts","../src/nodes/AgentOutputFactory.ts","../src/nodes/AgentToolCallPortMapFactory.ts","../src/nodes/ConnectionCredentialExecutionContextFactory.ts","../src/nodes/AIAgentExecutionHelpersFactory.ts","../src/nodes/NodeBackedToolRuntime.ts","../src/nodes/aiAgentSupport.types.ts","../src/nodes/AIAgentNode.ts","../src/nodes/AIAgentConfig.ts","../src/nodes/CallbackResultNormalizerFactory.ts","../src/nodes/CallbackNode.ts","../src/nodes/CallbackNodeFactory.ts","../src/nodes/HttpRequestNodeFactory.ts","../src/nodes/httpRequest.ts","../src/nodes/IfNode.ts","../src/nodes/if.ts","../src/nodes/ManualTriggerNode.ts","../src/nodes/ManualTriggerFactory.ts","../src/nodes/MapDataNode.ts","../src/nodes/mapData.ts","../src/nodes/mergeExecutionUtils.types.ts","../src/nodes/MergeNode.ts","../src/nodes/merge.ts","../src/nodes/NoOpNode.ts","../src/nodes/noOp.ts","../src/nodes/SubWorkflowNode.ts","../src/nodes/subWorkflow.ts","../src/nodes/WaitDurationFactory.ts","../src/nodes/WaitNode.ts","../src/nodes/wait.ts","../src/nodes/webhookRespondNowAndContinueError.ts","../src/nodes/webhookRespondNowError.ts","../src/nodes/webhookTriggerNode.ts","../src/nodes/WebhookTriggerFactory.ts","../src/nodes/ConnectionCredentialNode.ts","../src/register.types.ts","../src/workflowBuilder.types.ts","../src/workflowAuthoring/WorkflowChatModelFactory.types.ts","../src/workflowAuthoring/WorkflowAgentNodeFactory.types.ts","../src/workflowAuthoring/WorkflowDefinedNodeResolver.types.ts","../src/workflowAuthoring/WorkflowDurationParser.types.ts","../src/workflowAuthoring/WorkflowBranchBuilder.types.ts","../src/workflowAuthoring/WorkflowChain.types.ts","../src/workflowAuthoring/WorkflowAuthoringBuilder.types.ts","../src/workflowAuthoring.types.ts","../src/workflows/AIAgentConnectionWorkflowExpander.ts","../src/nodes/ConnectionCredentialNodeConfig.ts","../src/nodes/ConnectionCredentialNodeConfigFactory.ts"],"sourcesContent":["import type { ChatModelFactory, LangChainChatModelLike, NodeExecutionContext } from \"@codemation/core\";\nimport { chatModel } from \"@codemation/core\";\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport type { OpenAiCredentialSession } from \"./OpenAiCredentialSession\";\nimport type { OpenAIChatModelConfig } from \"./openAiChatModelConfig\";\n\n@chatModel({ packageName: \"@codemation/core-nodes\" })\nexport class OpenAIChatModelFactory implements ChatModelFactory<OpenAIChatModelConfig> {\n async create(\n args: Readonly<{ config: OpenAIChatModelConfig; ctx: NodeExecutionContext<any> }>,\n ): Promise<LangChainChatModelLike> {\n const session = await args.ctx.getCredential<OpenAiCredentialSession>(args.config.credentialSlotKey);\n return new ChatOpenAI({\n apiKey: session.apiKey,\n model: args.config.model,\n temperature: args.config.options?.temperature,\n maxTokens: args.config.options?.maxTokens,\n configuration: session.baseUrl ? { baseURL: session.baseUrl } : undefined,\n });\n }\n}\n","import type { AgentCanvasPresentation, ChatModelConfig, CredentialRequirement } from \"@codemation/core\";\n\nimport type { CanvasIconName } from \"../canvasIconName\";\nimport { OpenAIChatModelFactory } from \"./OpenAIChatModelFactory\";\n\nexport class OpenAIChatModelConfig implements ChatModelConfig {\n readonly type = OpenAIChatModelFactory;\n readonly presentation: AgentCanvasPresentation<CanvasIconName>;\n\n constructor(\n public readonly name: string,\n public readonly model: string,\n public readonly credentialSlotKey: string = \"openai\",\n presentationIn?: AgentCanvasPresentation<CanvasIconName>,\n public readonly options?: Readonly<{\n temperature?: number;\n maxTokens?: number;\n }>,\n ) {\n this.presentation = presentationIn ?? { icon: \"builtin:openai\", label: name };\n }\n\n getCredentialRequirements(): ReadonlyArray<CredentialRequirement> {\n return [\n {\n slotKey: this.credentialSlotKey,\n label: \"OpenAI API key\",\n acceptedTypes: [\"openai.apiKey\"],\n },\n ];\n }\n}\n","import { OpenAIChatModelConfig } from \"./openAiChatModelConfig\";\n\n/**\n * Default OpenAI chat model configs for scaffolds and demos (icon + label match {@link OpenAIChatModelConfig} defaults).\n * Prefer importing {@link openAiChatModelPresets} from here or from the consumer template re-export\n * instead of repeating {@link OpenAIChatModelConfig} construction in app workflows.\n */\nexport class OpenAiChatModelPresets {\n readonly demoGpt4oMini = new OpenAIChatModelConfig(\"OpenAI\", \"gpt-4o-mini\");\n\n readonly demoGpt41 = new OpenAIChatModelConfig(\"OpenAI\", \"gpt-4.1\");\n}\n\nexport const openAiChatModelPresets = new OpenAiChatModelPresets();\n","import type { AgentMessageDto, AgentToolCall } from \"@codemation/core\";\n\nimport { AIMessage, HumanMessage, SystemMessage, ToolMessage, type BaseMessage } from \"@langchain/core/messages\";\n\nexport class AgentMessageFactory {\n static createPromptMessages(messages: ReadonlyArray<AgentMessageDto>): ReadonlyArray<BaseMessage> {\n return messages.map((message) => this.createPromptMessage(message));\n }\n\n static createSystemPrompt(systemMessage: string): SystemMessage {\n return new SystemMessage(systemMessage);\n }\n\n static createUserPrompt(prompt: string): HumanMessage {\n return new HumanMessage(prompt);\n }\n\n static createAssistantPrompt(prompt: string): AIMessage {\n return new AIMessage(prompt);\n }\n\n static createToolMessage(toolCallId: string, content: string): ToolMessage {\n return new ToolMessage({ tool_call_id: toolCallId, content });\n }\n\n static extractContent(message: unknown): string {\n if (typeof message === \"string\") return message;\n if (!this.isRecord(message)) return String(message);\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === \"string\") return part;\n if (this.isRecord(part) && typeof part.text === \"string\") return part.text;\n return JSON.stringify(part);\n })\n .join(\"\\n\");\n }\n return JSON.stringify(content);\n }\n\n static extractToolCalls(message: unknown): ReadonlyArray<AgentToolCall> {\n if (!this.isRecord(message)) return [];\n const toolCalls = message.tool_calls;\n if (!Array.isArray(toolCalls)) return [];\n return toolCalls\n .filter((toolCall) => this.isRecord(toolCall) && typeof toolCall.name === \"string\")\n .map((toolCall) => ({\n id: typeof toolCall.id === \"string\" ? toolCall.id : undefined,\n name: toolCall.name as string,\n input: this.isRecord(toolCall) && \"args\" in toolCall ? toolCall.args : undefined,\n }));\n }\n\n private static isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n }\n\n private static createPromptMessage(message: AgentMessageDto): BaseMessage {\n if (message.role === \"system\") {\n return this.createSystemPrompt(message.content);\n }\n if (message.role === \"assistant\") {\n return this.createAssistantPrompt(message.content);\n }\n return this.createUserPrompt(message.content);\n }\n}\n","import type { Item, NodeOutputs } from \"@codemation/core\";\n\nexport class AgentOutputFactory {\n static fromUnknown(value: unknown): NodeOutputs {\n return { main: [{ json: value }] };\n }\n\n static replaceJson(item: Item, value: unknown): Item {\n return {\n ...item,\n json: value,\n };\n }\n\n static fromAgentContent(content: string): unknown {\n try {\n return JSON.parse(content) as unknown;\n } catch {\n return { output: content };\n }\n }\n}\n","import type { NodeInputsByPort } from \"@codemation/core\";\n\nexport class AgentToolCallPortMap {\n static fromInput(input: unknown): NodeInputsByPort {\n return {\n in: [\n {\n json: input,\n },\n ],\n };\n }\n}\n","import type {\n CredentialRequirement,\n CredentialSessionService,\n NodeConfigBase,\n NodeExecutionContext,\n NodeId,\n} from \"@codemation/core\";\n\nimport { CredentialResolverFactory } from \"@codemation/core/bootstrap\";\n\n/**\n * Builds a {@link NodeExecutionContext} whose identity for credential binding and `getCredential`\n * is a **connection-owned** workflow node id (`ConnectionNodeIdFactory` in `@codemation/core`),\n * not the executing parent node. Use for LLM slots, tool slots, or any connection-scoped owner.\n */\nexport class ConnectionCredentialExecutionContextFactory {\n private readonly credentialResolverFactory: CredentialResolverFactory;\n\n constructor(credentialSessions: CredentialSessionService) {\n this.credentialResolverFactory = new CredentialResolverFactory(credentialSessions);\n }\n\n forConnectionNode<TConfig extends NodeConfigBase>(\n ctx: NodeExecutionContext<TConfig>,\n args: Readonly<{\n connectionNodeId: NodeId;\n getCredentialRequirements: () => ReadonlyArray<CredentialRequirement>;\n }>,\n ): NodeExecutionContext<TConfig> {\n const stubConfig = { getCredentialRequirements: args.getCredentialRequirements } as NodeConfigBase;\n const getCredential = this.credentialResolverFactory.create(ctx.workflowId, args.connectionNodeId, stubConfig);\n return {\n ...ctx,\n nodeId: args.connectionNodeId,\n getCredential,\n };\n }\n}\n","import type { CredentialSessionService, Item, Items, NodeExecutionContext } from \"@codemation/core\";\nimport { injectable } from \"@codemation/core\";\n\nimport { DynamicStructuredTool } from \"@langchain/core/tools\";\n\nimport { ConnectionCredentialExecutionContextFactory } from \"./ConnectionCredentialExecutionContextFactory\";\nimport type { ResolvedTool } from \"./aiAgentSupport.types\";\n\n/**\n * LangChain adapters and credential context wiring for {@link AIAgentNode}.\n * Lives in a `*Factory.ts` composition-root module so construction stays explicit and testable.\n */\n@injectable()\nexport class AIAgentExecutionHelpersFactory {\n createConnectionCredentialExecutionContextFactory(\n credentialSessions: CredentialSessionService,\n ): ConnectionCredentialExecutionContextFactory {\n return new ConnectionCredentialExecutionContextFactory(credentialSessions);\n }\n\n createDynamicStructuredTool(\n entry: ResolvedTool,\n toolCredentialContext: NodeExecutionContext<any>,\n item: Item,\n itemIndex: number,\n items: Items,\n ): DynamicStructuredTool {\n return new DynamicStructuredTool({\n name: entry.config.name,\n description: entry.config.description ?? entry.runtime.defaultDescription,\n schema: entry.runtime.inputSchema,\n func: async (input) => {\n const result = await entry.runtime.execute({\n config: entry.config,\n input,\n ctx: toolCredentialContext,\n item,\n itemIndex,\n items,\n });\n return JSON.stringify(result);\n },\n });\n }\n}\n","import type {\n MultiInputNode,\n Node,\n NodeExecutionContext,\n NodeOutputs,\n NodeResolver,\n NodeBackedToolConfig,\n ToolExecuteArgs,\n ZodSchemaAny,\n} from \"@codemation/core\";\nimport { CoreTokens, inject, injectable } from \"@codemation/core\";\n\n@injectable()\nexport class NodeBackedToolRuntime {\n constructor(\n @inject(CoreTokens.NodeResolver)\n private readonly nodeResolver: NodeResolver,\n ) {}\n\n async execute(\n config: NodeBackedToolConfig<any, ZodSchemaAny, ZodSchemaAny>,\n args: ToolExecuteArgs,\n ): Promise<unknown> {\n const nodeInput = config.toNodeItem({\n input: args.input,\n item: args.item,\n itemIndex: args.itemIndex,\n items: args.items,\n ctx: args.ctx,\n node: config.node,\n });\n const nodeCtx = {\n ...args.ctx,\n config: config.node,\n } as NodeExecutionContext<any>;\n const resolvedNode = this.nodeResolver.resolve(config.node.type);\n const outputs = await this.executeResolvedNode(resolvedNode, nodeInput, nodeCtx);\n return config.toToolOutput({\n input: args.input,\n item: args.item,\n itemIndex: args.itemIndex,\n items: args.items,\n ctx: args.ctx,\n node: config.node,\n outputs,\n });\n }\n\n private async executeResolvedNode(\n resolvedNode: unknown,\n nodeInput: ToolExecuteArgs[\"item\"],\n ctx: NodeExecutionContext<any>,\n ): Promise<NodeOutputs> {\n if (this.isMultiInputNode(resolvedNode)) {\n return await resolvedNode.executeMulti({ in: [nodeInput] }, ctx);\n }\n if (this.isNode(resolvedNode)) {\n return await resolvedNode.execute([nodeInput], ctx);\n }\n throw new Error(`Node-backed tool expected a runnable node instance for \"${ctx.config.name ?? ctx.nodeId}\".`);\n }\n\n private isNode(value: unknown): value is Node<any> {\n return typeof value === \"object\" && value !== null && \"execute\" in value;\n }\n\n private isMultiInputNode(value: unknown): value is MultiInputNode<any> {\n return typeof value === \"object\" && value !== null && \"executeMulti\" in value;\n }\n}\n","import type {\n AgentToolCall,\n Item,\n NodeInputsByPort,\n ToolConfig,\n ToolExecuteArgs,\n ZodSchemaAny,\n} from \"@codemation/core\";\nimport type { DynamicStructuredTool } from \"@langchain/core/tools\";\n\nexport class AgentItemPortMap {\n static fromItem(item: Item): NodeInputsByPort {\n return { in: [item] };\n }\n}\n\nexport type ResolvedTool = Readonly<{\n config: ToolConfig;\n runtime: Readonly<{\n defaultDescription: string;\n inputSchema: ZodSchemaAny;\n execute(args: ToolExecuteArgs<ToolConfig, unknown>): Promise<unknown>;\n }>;\n}>;\n\nexport type ItemScopedToolBinding = Readonly<{\n config: ToolConfig;\n langChainTool: DynamicStructuredTool;\n}>;\n\nexport type PlannedToolCall = Readonly<{\n binding: ItemScopedToolBinding;\n toolCall: AgentToolCall;\n invocationIndex: number;\n nodeId: string;\n}>;\n\nexport type ExecutedToolCall = Readonly<{\n toolName: string;\n toolCallId: string;\n result: unknown;\n serialized: string;\n}>;\n","import type {\n AgentGuardrailConfig,\n AgentToolCall,\n ChatModelConfig,\n ChatModelFactory,\n Item,\n Items,\n JsonValue,\n LangChainChatModelLike,\n Node,\n NodeExecutionContext,\n NodeInputsByPort,\n NodeOutputs,\n Tool,\n ToolConfig,\n ZodSchemaAny,\n} from \"@codemation/core\";\n\nimport type { CredentialSessionService } from \"@codemation/core\";\nimport {\n AgentGuardrailDefaults,\n AgentMessageConfigNormalizer,\n ConnectionInvocationIdFactory,\n ConnectionNodeIdFactory,\n CoreTokens,\n NodeBackedToolConfig,\n inject,\n node,\n type NodeResolver,\n} from \"@codemation/core\";\n\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\n\nimport type { AIAgent } from \"./AIAgentConfig\";\nimport { AIAgentExecutionHelpersFactory } from \"./AIAgentExecutionHelpersFactory\";\nimport { ConnectionCredentialExecutionContextFactory } from \"./ConnectionCredentialExecutionContextFactory\";\nimport { AgentMessageFactory } from \"./AgentMessageFactory\";\nimport { AgentOutputFactory } from \"./AgentOutputFactory\";\nimport { AgentToolCallPortMap } from \"./AgentToolCallPortMapFactory\";\nimport { NodeBackedToolRuntime } from \"./NodeBackedToolRuntime\";\nimport {\n AgentItemPortMap,\n type ExecutedToolCall,\n type ItemScopedToolBinding,\n type PlannedToolCall,\n type ResolvedTool,\n} from \"./aiAgentSupport.types\";\n\ntype ResolvedGuardrails = Required<Pick<AgentGuardrailConfig, \"maxTurns\" | \"onTurnLimitReached\">> &\n Pick<AgentGuardrailConfig, \"modelInvocationOptions\">;\n\n/** Everything needed to run the agent loop for a workflow execution (one `execute` call). */\ninterface PreparedAgentExecution {\n readonly ctx: NodeExecutionContext<AIAgent<any, any>>;\n readonly model: LangChainChatModelLike;\n readonly resolvedTools: ReadonlyArray<ResolvedTool>;\n readonly guardrails: ResolvedGuardrails;\n readonly languageModelConnectionNodeId: string;\n}\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class AIAgentNode implements Node<AIAgent<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n private readonly connectionCredentialExecutionContextFactory: ConnectionCredentialExecutionContextFactory;\n\n constructor(\n @inject(CoreTokens.NodeResolver)\n private readonly nodeResolver: NodeResolver,\n @inject(CoreTokens.CredentialSessionService)\n credentialSessions: CredentialSessionService,\n @inject(NodeBackedToolRuntime)\n private readonly nodeBackedToolRuntime: NodeBackedToolRuntime,\n @inject(AIAgentExecutionHelpersFactory)\n private readonly executionHelpers: AIAgentExecutionHelpersFactory,\n ) {\n this.connectionCredentialExecutionContextFactory =\n this.executionHelpers.createConnectionCredentialExecutionContextFactory(credentialSessions);\n }\n\n async execute(items: Items, ctx: NodeExecutionContext<AIAgent<any, any>>): Promise<NodeOutputs> {\n const prepared = await this.prepareExecution(ctx);\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n out.push(await this.runAgentForItem(prepared, items[i]!, i, items));\n }\n return { main: out };\n }\n\n /**\n * Resolves the chat model and tools once, then returns shared state for every item in the batch.\n */\n private async prepareExecution(ctx: NodeExecutionContext<AIAgent<any, any>>): Promise<PreparedAgentExecution> {\n const chatModelFactory = this.nodeResolver.resolve(ctx.config.chatModel.type) as ChatModelFactory<ChatModelConfig>;\n const languageModelCredentialContext = this.connectionCredentialExecutionContextFactory.forConnectionNode(ctx, {\n connectionNodeId: ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n getCredentialRequirements: () => ctx.config.chatModel.getCredentialRequirements?.() ?? [],\n });\n const model = await Promise.resolve(\n chatModelFactory.create({ config: ctx.config.chatModel, ctx: languageModelCredentialContext }),\n );\n return {\n ctx,\n model,\n resolvedTools: this.resolveTools(ctx.config.tools ?? []),\n guardrails: this.resolveGuardrails(ctx.config.guardrails),\n languageModelConnectionNodeId: ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n };\n }\n\n /**\n * One item: build prompts, optionally bind tools, run the multi-turn loop, map the final model message to workflow JSON.\n */\n private async runAgentForItem(\n prepared: PreparedAgentExecution,\n item: Item,\n itemIndex: number,\n items: Items,\n ): Promise<Item> {\n const { ctx } = prepared;\n const itemInputsByPort = AgentItemPortMap.fromItem(item);\n const itemScopedTools = this.createItemScopedTools(prepared.resolvedTools, ctx, item, itemIndex, items);\n const conversation: BaseMessage[] = [...this.createPromptMessages(item, itemIndex, items, ctx)];\n const modelWithTools = this.bindToolsToModel(prepared.model, itemScopedTools);\n const finalResponse = await this.runTurnLoopUntilFinalAnswer({\n prepared,\n itemInputsByPort,\n itemScopedTools,\n conversation,\n modelWithTools,\n });\n return this.buildOutputItem(item, finalResponse);\n }\n\n /**\n * Repeatedly invokes the model until it returns without tool calls, or guardrails end the loop.\n */\n private async runTurnLoopUntilFinalAnswer(args: {\n prepared: PreparedAgentExecution;\n itemInputsByPort: NodeInputsByPort;\n itemScopedTools: ReadonlyArray<ItemScopedToolBinding>;\n conversation: BaseMessage[];\n modelWithTools: LangChainChatModelLike;\n }): Promise<AIMessage> {\n const { prepared, itemInputsByPort, itemScopedTools, conversation, modelWithTools } = args;\n const { ctx, guardrails, languageModelConnectionNodeId } = prepared;\n\n let finalResponse: AIMessage | undefined;\n\n for (let turn = 1; turn <= guardrails.maxTurns; turn++) {\n const response = await this.invokeModel(\n modelWithTools,\n languageModelConnectionNodeId,\n conversation,\n ctx,\n itemInputsByPort,\n guardrails.modelInvocationOptions,\n );\n finalResponse = response;\n\n const toolCalls = AgentMessageFactory.extractToolCalls(response);\n if (toolCalls.length === 0) {\n break;\n }\n\n if (this.cannotExecuteAnotherToolRound(turn, guardrails)) {\n this.finishOrThrowWhenTurnCapHitWithToolCalls(ctx, guardrails);\n break;\n }\n\n const plannedToolCalls = this.planToolCalls(itemScopedTools, toolCalls, ctx.nodeId);\n await this.markQueuedTools(plannedToolCalls, ctx);\n const executedToolCalls = await this.executeToolCalls(plannedToolCalls, ctx);\n this.appendAssistantAndToolMessages(conversation, response, executedToolCalls);\n }\n\n if (!finalResponse) {\n throw new Error(`AIAgent \"${ctx.config.name ?? ctx.nodeId}\" did not produce a model response.`);\n }\n return finalResponse;\n }\n\n private cannotExecuteAnotherToolRound(turn: number, guardrails: ResolvedGuardrails): boolean {\n return turn >= guardrails.maxTurns;\n }\n\n private finishOrThrowWhenTurnCapHitWithToolCalls(\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n guardrails: ResolvedGuardrails,\n ): void {\n if (guardrails.onTurnLimitReached === \"respondWithLastMessage\") {\n return;\n }\n throw new Error(\n `AIAgent \"${ctx.config.name ?? ctx.nodeId}\" reached maxTurns=${guardrails.maxTurns} before producing a final response.`,\n );\n }\n\n private appendAssistantAndToolMessages(\n conversation: BaseMessage[],\n assistantMessage: AIMessage,\n executedToolCalls: ReadonlyArray<ExecutedToolCall>,\n ): void {\n conversation.push(\n assistantMessage,\n ...executedToolCalls.map((toolCall) =>\n AgentMessageFactory.createToolMessage(toolCall.toolCallId, toolCall.serialized),\n ),\n );\n }\n\n private buildOutputItem(item: Item, finalResponse: AIMessage): Item {\n return AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(finalResponse)),\n );\n }\n\n private bindToolsToModel(\n model: LangChainChatModelLike,\n itemScopedTools: ReadonlyArray<ItemScopedToolBinding>,\n ): LangChainChatModelLike {\n if (itemScopedTools.length === 0 || !model.bindTools) {\n return model;\n }\n return model.bindTools(itemScopedTools.map((entry) => entry.langChainTool));\n }\n\n private resolveTools(toolConfigs: ReadonlyArray<ToolConfig>): ReadonlyArray<ResolvedTool> {\n const resolvedTools = toolConfigs.map((config) => ({\n config,\n runtime: this.resolveToolRuntime(config),\n }));\n\n const names = new Set<string>();\n for (const entry of resolvedTools) {\n if (names.has(entry.config.name)) throw new Error(`Duplicate tool name on AIAgent: ${entry.config.name}`);\n names.add(entry.config.name);\n }\n return resolvedTools;\n }\n\n private createItemScopedTools(\n tools: ReadonlyArray<ResolvedTool>,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n item: Item,\n itemIndex: number,\n items: Items,\n ): ReadonlyArray<ItemScopedToolBinding> {\n return tools.map((entry) => {\n const toolCredentialContext = this.connectionCredentialExecutionContextFactory.forConnectionNode(ctx, {\n connectionNodeId: ConnectionNodeIdFactory.toolConnectionNodeId(ctx.nodeId, entry.config.name),\n getCredentialRequirements: () => entry.config.getCredentialRequirements?.() ?? [],\n });\n const langChainTool = this.executionHelpers.createDynamicStructuredTool(\n entry,\n toolCredentialContext,\n item,\n itemIndex,\n items,\n );\n\n return { config: entry.config, langChainTool };\n });\n }\n\n private async invokeModel(\n model: LangChainChatModelLike,\n nodeId: string,\n messages: ReadonlyArray<BaseMessage>,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n inputsByPort: NodeInputsByPort,\n options?: AgentGuardrailConfig[\"modelInvocationOptions\"],\n ): Promise<AIMessage> {\n await ctx.nodeState?.markQueued({ nodeId, activationId: ctx.activationId, inputsByPort });\n await ctx.nodeState?.markRunning({ nodeId, activationId: ctx.activationId, inputsByPort });\n try {\n const response = (await model.invoke(messages, options)) as AIMessage;\n await ctx.nodeState?.markCompleted({\n nodeId,\n activationId: ctx.activationId,\n inputsByPort,\n outputs: AgentOutputFactory.fromUnknown({\n content: AgentMessageFactory.extractContent(response),\n }),\n });\n const content = AgentMessageFactory.extractContent(response);\n await ctx.nodeState?.appendConnectionInvocation({\n invocationId: ConnectionInvocationIdFactory.create(),\n connectionNodeId: nodeId,\n parentAgentNodeId: ctx.nodeId,\n parentAgentActivationId: ctx.activationId,\n status: \"completed\",\n managedInput: this.summarizeLlmMessages(messages),\n managedOutput: content,\n finishedAt: new Date().toISOString(),\n });\n return response;\n } catch (error) {\n throw await this.failTrackedNodeInvocation(error, nodeId, ctx, inputsByPort, this.summarizeLlmMessages(messages));\n }\n }\n\n private async markQueuedTools(\n plannedToolCalls: ReadonlyArray<PlannedToolCall>,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n ): Promise<void> {\n for (const plannedToolCall of plannedToolCalls) {\n await ctx.nodeState?.markQueued({\n nodeId: plannedToolCall.nodeId,\n activationId: ctx.activationId,\n inputsByPort: AgentToolCallPortMap.fromInput(plannedToolCall.toolCall.input ?? {}),\n });\n }\n }\n\n private async executeToolCalls(\n plannedToolCalls: ReadonlyArray<PlannedToolCall>,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n ): Promise<ReadonlyArray<ExecutedToolCall>> {\n const results = await Promise.allSettled(\n plannedToolCalls.map(async (plannedToolCall) => {\n const toolCallInputsByPort = AgentToolCallPortMap.fromInput(plannedToolCall.toolCall.input ?? {});\n await ctx.nodeState?.markRunning({\n nodeId: plannedToolCall.nodeId,\n activationId: ctx.activationId,\n inputsByPort: toolCallInputsByPort,\n });\n try {\n const serialized = await plannedToolCall.binding.langChainTool.invoke(plannedToolCall.toolCall.input ?? {});\n const result = this.parseToolOutput(serialized);\n await ctx.nodeState?.markCompleted({\n nodeId: plannedToolCall.nodeId,\n activationId: ctx.activationId,\n inputsByPort: toolCallInputsByPort,\n outputs: AgentOutputFactory.fromUnknown(result),\n });\n await ctx.nodeState?.appendConnectionInvocation({\n invocationId: ConnectionInvocationIdFactory.create(),\n connectionNodeId: plannedToolCall.nodeId,\n parentAgentNodeId: ctx.nodeId,\n parentAgentActivationId: ctx.activationId,\n status: \"completed\",\n managedInput: this.toolCallInputToJson(plannedToolCall.toolCall.input),\n managedOutput: this.resultToJsonValue(result),\n finishedAt: new Date().toISOString(),\n });\n return {\n toolName: plannedToolCall.binding.config.name,\n toolCallId: plannedToolCall.toolCall.id ?? plannedToolCall.binding.config.name,\n serialized,\n result,\n } satisfies ExecutedToolCall;\n } catch (error) {\n throw await this.failTrackedNodeInvocation(\n error,\n plannedToolCall.nodeId,\n ctx,\n toolCallInputsByPort,\n this.toolCallInputToJson(plannedToolCall.toolCall.input),\n );\n }\n }),\n );\n\n const rejected = results.find((result) => result.status === \"rejected\");\n if (rejected?.status === \"rejected\") {\n throw rejected.reason instanceof Error ? rejected.reason : new Error(String(rejected.reason));\n }\n\n return results\n .filter((result): result is PromiseFulfilledResult<ExecutedToolCall> => result.status === \"fulfilled\")\n .map((result) => result.value);\n }\n\n private planToolCalls(\n bindings: ReadonlyArray<ItemScopedToolBinding>,\n toolCalls: ReadonlyArray<AgentToolCall>,\n parentNodeId: string,\n ): ReadonlyArray<PlannedToolCall> {\n const invocationCountByToolName = new Map<string, number>();\n return toolCalls.map((toolCall) => {\n const binding = bindings.find((entry) => entry.config.name === toolCall.name);\n if (!binding) throw new Error(`Unknown tool requested by model: ${toolCall.name}`);\n const invocationIndex = (invocationCountByToolName.get(binding.config.name) ?? 0) + 1;\n invocationCountByToolName.set(binding.config.name, invocationIndex);\n return {\n binding,\n toolCall,\n invocationIndex,\n nodeId: ConnectionNodeIdFactory.toolConnectionNodeId(parentNodeId, binding.config.name),\n } satisfies PlannedToolCall;\n });\n }\n\n private parseToolOutput(serialized: unknown): unknown {\n if (typeof serialized !== \"string\") return serialized;\n try {\n return JSON.parse(serialized);\n } catch {\n return serialized;\n }\n }\n\n private async failTrackedNodeInvocation(\n error: unknown,\n nodeId: string,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n inputsByPort: NodeInputsByPort,\n managedInput?: JsonValue,\n ): Promise<Error> {\n const effectiveError = error instanceof Error ? error : new Error(String(error));\n await ctx.nodeState?.markFailed({\n nodeId,\n activationId: ctx.activationId,\n inputsByPort,\n error: effectiveError,\n });\n await ctx.nodeState?.appendConnectionInvocation({\n invocationId: ConnectionInvocationIdFactory.create(),\n connectionNodeId: nodeId,\n parentAgentNodeId: ctx.nodeId,\n parentAgentActivationId: ctx.activationId,\n status: \"failed\",\n managedInput,\n error: {\n message: effectiveError.message,\n name: effectiveError.name,\n stack: effectiveError.stack,\n },\n finishedAt: new Date().toISOString(),\n });\n return effectiveError;\n }\n\n private summarizeLlmMessages(messages: ReadonlyArray<BaseMessage>): JsonValue {\n const last = messages[messages.length - 1];\n const preview =\n typeof last?.content === \"string\"\n ? last.content\n : last?.content !== undefined\n ? JSON.stringify(last.content)\n : \"\";\n return {\n messageCount: messages.length,\n lastMessagePreview: preview.slice(0, 4000),\n };\n }\n\n private toolCallInputToJson(input: unknown): JsonValue | undefined {\n return this.resultToJsonValue(input);\n }\n\n private resultToJsonValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n const json = JSON.stringify(value);\n return JSON.parse(json) as JsonValue;\n }\n\n private createPromptMessages(\n item: Item,\n itemIndex: number,\n items: Items,\n ctx: NodeExecutionContext<AIAgent<any, any>>,\n ): ReadonlyArray<BaseMessage> {\n return AgentMessageFactory.createPromptMessages(\n AgentMessageConfigNormalizer.normalize(ctx.config, {\n item,\n itemIndex,\n items,\n ctx,\n }),\n );\n }\n\n private resolveToolRuntime(config: ToolConfig): ResolvedTool[\"runtime\"] {\n if (config instanceof NodeBackedToolConfig) {\n return {\n defaultDescription: `Run workflow node \"${config.node.name ?? config.name}\" as an AI tool.`,\n inputSchema: config.getInputSchema(),\n execute: async (args) => await this.nodeBackedToolRuntime.execute(config, args),\n };\n }\n const tool = this.nodeResolver.resolve(config.type) as Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>;\n return {\n defaultDescription: tool.defaultDescription,\n inputSchema: tool.inputSchema,\n execute: async (args) => await Promise.resolve(tool.execute(args)),\n };\n }\n\n private resolveGuardrails(guardrails: AgentGuardrailConfig | undefined): ResolvedGuardrails {\n const maxTurns = guardrails?.maxTurns ?? AgentGuardrailDefaults.maxTurns;\n if (!Number.isInteger(maxTurns) || maxTurns < 1) {\n throw new Error(`AIAgent maxTurns must be a positive integer. Received: ${String(maxTurns)}`);\n }\n return {\n maxTurns,\n onTurnLimitReached: guardrails?.onTurnLimitReached ?? AgentGuardrailDefaults.onTurnLimitReached,\n modelInvocationOptions: guardrails?.modelInvocationOptions,\n };\n }\n}\n","import {\n RetryPolicy,\n type AgentGuardrailConfig,\n type AgentMessageConfig,\n type AgentNodeConfig,\n type ChatModelConfig,\n type RetryPolicySpec,\n type RunnableNodeConfig,\n type ToolConfig,\n type TypeToken,\n} from \"@codemation/core\";\n\nimport { AIAgentNode } from \"./AIAgentNode\";\n\nexport interface AIAgentOptions<TInputJson = unknown, _TOutputJson = unknown> {\n readonly name: string;\n readonly messages: AgentMessageConfig<TInputJson>;\n readonly chatModel: ChatModelConfig;\n readonly tools?: ReadonlyArray<ToolConfig>;\n readonly id?: string;\n readonly retryPolicy?: RetryPolicySpec;\n readonly guardrails?: AgentGuardrailConfig;\n}\n\n/**\n * AI agent: credential bindings are keyed to connection-owned LLM/tool node ids (ConnectionNodeIdFactory),\n * not to the agent workflow node id.\n */\nexport class AIAgent<TInputJson = unknown, TOutputJson = unknown>\n implements RunnableNodeConfig<TInputJson, TOutputJson>, AgentNodeConfig<TInputJson, TOutputJson>\n{\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = AIAgentNode;\n readonly execution = { hint: \"local\" } as const;\n readonly icon = \"lucide:bot\" as const;\n readonly name: string;\n readonly messages: AgentMessageConfig<TInputJson>;\n readonly chatModel: ChatModelConfig;\n readonly tools: ReadonlyArray<ToolConfig>;\n readonly id?: string;\n readonly retryPolicy: RetryPolicySpec;\n readonly guardrails?: AgentGuardrailConfig;\n\n constructor(options: AIAgentOptions<TInputJson, TOutputJson>) {\n this.name = options.name;\n this.messages = options.messages;\n this.chatModel = options.chatModel;\n this.tools = options.tools ?? [];\n this.id = options.id;\n this.retryPolicy = options.retryPolicy ?? RetryPolicy.defaultForAiAgent;\n this.guardrails = options.guardrails;\n }\n}\n","import type { Items, NodeOutputs } from \"@codemation/core\";\n\nexport class CallbackResultNormalizer {\n static toNodeOutputs(result: Items | void, items: Items): NodeOutputs {\n return { main: result ?? items };\n }\n}\n","import type { Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { Callback } from \"./CallbackNodeFactory\";\nimport { CallbackResultNormalizer } from \"./CallbackResultNormalizerFactory\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class CallbackNode implements Node<Callback<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<Callback<any, any>>): Promise<NodeOutputs> {\n const result = await ctx.config.callback(items, ctx);\n return CallbackResultNormalizer.toNodeOutputs(result, items);\n }\n}\n","import type { Items, NodeExecutionContext, RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { CallbackNode } from \"./CallbackNode\";\n\nexport type CallbackHandler<\n TInputJson = unknown,\n TOutputJson = TInputJson,\n TConfig extends Callback<TInputJson, TOutputJson> = Callback<TInputJson, TOutputJson>,\n> = (\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<TConfig>,\n) => Promise<Items<TOutputJson> | void> | Items<TOutputJson> | void;\n\nexport class Callback<TInputJson = unknown, TOutputJson = TInputJson> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = CallbackNode;\n readonly execution = { hint: \"local\" } as const;\n readonly icon = \"lucide:braces\" as const;\n\n constructor(\n public readonly name: string = \"Callback\",\n public readonly callback: CallbackHandler<TInputJson, TOutputJson> = Callback.defaultCallback as CallbackHandler<\n TInputJson,\n TOutputJson\n >,\n public readonly id?: string,\n ) {}\n\n private static defaultCallback<TItemJson>(items: Items<TItemJson>): Items<TItemJson> {\n return items;\n }\n}\n\nexport { CallbackNode } from \"./CallbackNode\";\nexport { CallbackResultNormalizer } from \"./CallbackResultNormalizerFactory\";\n","import type { Item, Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport type { HttpRequestDownloadMode } from \"./httpRequest\";\nimport { HttpRequest } from \"./httpRequest\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class HttpRequestNode implements Node<HttpRequest<any, any>> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<HttpRequest<any, any>>): Promise<NodeOutputs> {\n const output: Item[] = [];\n for (const item of items) {\n output.push(await this.executeItem(item, ctx));\n }\n return { main: output };\n }\n\n private async executeItem(item: Item, ctx: NodeExecutionContext<HttpRequest<any, any>>): Promise<Item> {\n const url = this.resolveUrl(item, ctx);\n const response = await fetch(url, {\n method: ctx.config.method,\n });\n const headers = this.readHeaders(response.headers);\n const mimeType = this.resolveMimeType(headers);\n const bodyBinaryName = ctx.config.binaryName;\n const shouldAttachBody = this.shouldAttachBody(ctx.config.downloadMode, mimeType);\n const outputJson: Readonly<Record<string, unknown>> = {\n url,\n method: ctx.config.method,\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n mimeType,\n headers,\n ...(shouldAttachBody ? { bodyBinaryName } : {}),\n };\n\n let outputItem: Item = {\n json: outputJson,\n };\n if (!shouldAttachBody) {\n return outputItem;\n }\n\n const attachment = await ctx.binary.attach({\n name: bodyBinaryName,\n body: response.body\n ? (response.body as unknown as Parameters<typeof ctx.binary.attach>[0][\"body\"])\n : new Uint8Array(await response.arrayBuffer()),\n mimeType,\n filename: this.resolveFilename(url, headers),\n });\n outputItem = ctx.binary.withAttachment(outputItem, bodyBinaryName, attachment);\n return outputItem;\n }\n\n private resolveUrl(item: Item, ctx: NodeExecutionContext<HttpRequest<any, any>>): string {\n const json = this.asRecord(item.json);\n const candidate = json[ctx.config.urlField];\n if (typeof candidate !== \"string\" || candidate.trim() === \"\") {\n throw new Error(`HttpRequest node expected item.json.${ctx.config.urlField} to contain a URL string.`);\n }\n return candidate;\n }\n\n private asRecord(value: unknown): Readonly<Record<string, unknown>> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Readonly<Record<string, unknown>>;\n }\n return { input: value };\n }\n\n private readHeaders(headers: Headers): Readonly<Record<string, string>> {\n const values: Record<string, string> = {};\n headers.forEach((value, key) => {\n values[key] = value;\n });\n return values;\n }\n\n private resolveMimeType(headers: Readonly<Record<string, string>>): string {\n const contentType = headers[\"content-type\"];\n if (!contentType) {\n return \"application/octet-stream\";\n }\n return contentType.split(\";\")[0]?.trim() || \"application/octet-stream\";\n }\n\n private shouldAttachBody(mode: HttpRequestDownloadMode, mimeType: string): boolean {\n if (mode === \"always\") {\n return true;\n }\n if (mode === \"never\") {\n return false;\n }\n return mimeType.startsWith(\"image/\") || mimeType.startsWith(\"audio/\") || mimeType.startsWith(\"video/\");\n }\n\n private resolveFilename(url: string, headers: Readonly<Record<string, string>>): string | undefined {\n const contentDisposition = headers[\"content-disposition\"];\n const fromDisposition = this.readFilenameFromContentDisposition(contentDisposition);\n if (fromDisposition) {\n return fromDisposition;\n }\n const pathname = new URL(url).pathname;\n const value = pathname.split(\"/\").at(-1);\n return value && value.trim() ? value : undefined;\n }\n\n private readFilenameFromContentDisposition(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const parts = value.split(\";\");\n for (const part of parts) {\n const trimmed = part.trim();\n if (!trimmed.startsWith(\"filename=\")) {\n continue;\n }\n return trimmed.slice(\"filename=\".length).replace(/^\"|\"$/g, \"\");\n }\n return undefined;\n }\n}\n","import { RetryPolicy, type RetryPolicySpec, type RunnableNodeConfig, type TypeToken } from \"@codemation/core\";\n\nimport { HttpRequestNode } from \"./HttpRequestNodeFactory\";\n\nexport type HttpRequestDownloadMode = \"auto\" | \"always\" | \"never\";\n\n/** JSON emitted by {@link HttpRequest} — response metadata only (input item fields are not passed through). */\nexport type HttpRequestOutputJson = Readonly<{\n url: string;\n method: string;\n ok: boolean;\n status: number;\n statusText: string;\n mimeType: string;\n headers: Readonly<Record<string, string>>;\n bodyBinaryName?: string;\n}>;\n\nexport class HttpRequest<\n TInputJson = Readonly<{ url?: string }>,\n TOutputJson = HttpRequestOutputJson,\n> implements RunnableNodeConfig<TInputJson, TOutputJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = HttpRequestNode;\n readonly execution = { hint: \"local\" } as const;\n\n constructor(\n public readonly name: string,\n public readonly args: Readonly<{\n method?: string;\n urlField?: string;\n binaryName?: string;\n downloadMode?: HttpRequestDownloadMode;\n id?: string;\n }> = {},\n public readonly retryPolicy: RetryPolicySpec = RetryPolicy.defaultForHttp,\n ) {}\n\n get id(): string | undefined {\n return this.args.id;\n }\n\n get method(): string {\n return (this.args.method ?? \"GET\").toUpperCase();\n }\n\n get urlField(): string {\n return this.args.urlField ?? \"url\";\n }\n\n get binaryName(): string {\n return this.args.binaryName ?? \"body\";\n }\n\n get downloadMode(): HttpRequestDownloadMode {\n return this.args.downloadMode ?? \"auto\";\n }\n}\n\nexport { HttpRequestNode } from \"./HttpRequestNodeFactory\";\n","import type { Item, Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { If } from \"./if\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class IfNode implements Node<If<any>> {\n kind = \"node\" as const;\n outputPorts = [\"true\", \"false\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<If<any>>): Promise<NodeOutputs> {\n const t: Item[] = [];\n const f: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as Item<unknown>;\n const metaBase = (\n item.meta && typeof item.meta === \"object\" ? (item.meta as Record<string, unknown>) : {}\n ) as Record<string, unknown>;\n const cmBase =\n metaBase._cm && typeof metaBase._cm === \"object\"\n ? (metaBase._cm as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n const originIndex = typeof cmBase.originIndex === \"number\" ? (cmBase.originIndex as number) : i;\n const tagged: Item = {\n ...item,\n meta: { ...metaBase, _cm: { ...cmBase, originIndex } },\n paired: [{ nodeId: ctx.nodeId, output: \"$in\", itemIndex: originIndex }, ...(item.paired ?? [])],\n };\n const ok = ctx.config.predicate(item, i, items, ctx);\n (ok ? t : f).push(tagged);\n }\n return { true: t, false: f };\n }\n}\n","import type { Item, Items, NodeExecutionContext, RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { IfNode } from \"./IfNode\";\n\nexport class If<TInputJson = unknown> implements RunnableNodeConfig<TInputJson, TInputJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = IfNode;\n readonly execution = { hint: \"local\" } as const;\n readonly icon = \"lucide:split\" as const;\n constructor(\n public readonly name: string,\n public readonly predicate: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<If<TInputJson>>,\n ) => boolean,\n public readonly id?: string,\n ) {}\n}\n\nexport { IfNode } from \"./IfNode\";\n","import type {\n Items,\n NodeExecutionContext,\n NodeOutputs,\n TestableTriggerNode,\n TriggerSetupContext,\n TriggerTestItemsContext,\n} from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { ManualTrigger } from \"./ManualTriggerFactory\";\n\n/**\n * Setup is intentionally a no-op: the engine host can run workflows manually\n * by calling `engine.runWorkflow(workflow, triggerNodeId, items)`.\n */\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class ManualTriggerNode implements TestableTriggerNode<ManualTrigger<any>> {\n kind = \"trigger\" as const;\n outputPorts = [\"main\"] as const;\n async setup(_ctx: TriggerSetupContext<ManualTrigger<any>>): Promise<undefined> {\n return undefined;\n }\n\n async getTestItems(ctx: TriggerTestItemsContext<ManualTrigger<any>>): Promise<Items> {\n return this.resolveManualItems([], ctx.config);\n }\n\n async execute(items: Items, ctx: NodeExecutionContext<ManualTrigger<any>>): Promise<NodeOutputs> {\n return { main: this.resolveManualItems(items, ctx.config) };\n }\n\n private resolveManualItems(items: Items, config: ManualTrigger<any>): Items {\n return items.length > 0 ? items : (config.defaultItems ?? []);\n }\n}\n","import type { Items, TriggerNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { ItemsInputNormalizer } from \"@codemation/core\";\n\nimport { ManualTriggerNode } from \"./ManualTriggerNode\";\n\ntype ManualTriggerDefaultValue<TOutputJson> = Items<TOutputJson> | ReadonlyArray<TOutputJson> | TOutputJson;\n\nexport class ManualTrigger<TOutputJson = unknown> implements TriggerNodeConfig<TOutputJson> {\n private static readonly itemsInputNormalizer = new ItemsInputNormalizer();\n readonly kind = \"trigger\" as const;\n readonly type: TypeToken<unknown> = ManualTriggerNode;\n readonly icon = \"lucide:play\" as const;\n readonly defaultItems?: Items<TOutputJson>;\n readonly id?: string;\n /** Manual runs often emit an empty batch; still schedule downstream by default. */\n readonly continueWhenEmptyOutput = true as const;\n\n constructor(name?: string, id?: string);\n constructor(name: string, defaultItems: ManualTriggerDefaultValue<TOutputJson>, id?: string);\n constructor(\n public readonly name: string = \"Manual trigger\",\n defaultItemsOrId?: ManualTriggerDefaultValue<TOutputJson> | string,\n id?: string,\n ) {\n this.defaultItems = ManualTrigger.resolveDefaultItems(defaultItemsOrId);\n this.id = ManualTrigger.resolveId(defaultItemsOrId, id);\n }\n\n private static resolveDefaultItems<TOutputJson>(\n value: ManualTriggerDefaultValue<TOutputJson> | string | undefined,\n ): Items<TOutputJson> | undefined {\n if (typeof value === \"string\" || value === undefined) {\n return undefined;\n }\n return this.itemsInputNormalizer.normalize(value) as Items<TOutputJson>;\n }\n\n private static resolveId<TOutputJson>(\n value: ManualTriggerDefaultValue<TOutputJson> | string | undefined,\n id: string | undefined,\n ): string | undefined {\n return typeof value === \"string\" ? value : id;\n }\n}\n\nexport { ManualTriggerNode } from \"./ManualTriggerNode\";\n","import type { Item, Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { MapData } from \"./mapData\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class MapDataNode implements Node<MapData<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<MapData<any, any>>): Promise<NodeOutputs> {\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i] as Item<unknown>;\n out.push({ ...item, json: ctx.config.map(item, ctx) });\n }\n return { main: out };\n }\n}\n","import type { Item, NodeExecutionContext, RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { MapDataNode } from \"./MapDataNode\";\n\nexport class MapData<TInputJson = unknown, TOutputJson = unknown> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = MapDataNode;\n readonly execution = { hint: \"local\" } as const;\n /** Zero mapped items should still allow downstream nodes to run. */\n readonly continueWhenEmptyOutput = true as const;\n constructor(\n public readonly name: string,\n public readonly map: (\n item: Item<TInputJson>,\n ctx: NodeExecutionContext<MapData<TInputJson, TOutputJson>>,\n ) => TOutputJson,\n public readonly id?: string,\n ) {}\n}\n\nexport { MapDataNode } from \"./MapDataNode\";\n","import type { InputPortKey, Item, Items } from \"@codemation/core\";\n\nexport function getOriginIndex(item: Item): number | undefined {\n const meta = item.meta as Record<string, unknown> | undefined;\n const cm = meta?._cm as Record<string, unknown> | undefined;\n const v = cm?.originIndex;\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\n}\n\nexport function orderedInputs(\n inputsByPort: Readonly<Record<InputPortKey, Items>>,\n prefer?: ReadonlyArray<InputPortKey>,\n): InputPortKey[] {\n const keys = Object.keys(inputsByPort);\n const preferred = (prefer ?? []).filter((k) => keys.includes(k));\n const rest = keys.filter((k) => !preferred.includes(k)).sort();\n return [...preferred, ...rest];\n}\n","import type { InputPortKey, Item, Items, MultiInputNode, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport type { Merge } from \"./merge\";\nimport { getOriginIndex, orderedInputs } from \"./mergeExecutionUtils.types\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class MergeNode implements MultiInputNode<Merge<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async executeMulti(\n inputsByPort: Readonly<Record<InputPortKey, Items>>,\n ctx: NodeExecutionContext<Merge<any, any>>,\n ): Promise<NodeOutputs> {\n const order = orderedInputs(inputsByPort, ctx.config.cfg.prefer);\n\n if (ctx.config.cfg.mode === \"append\") {\n const out: Item[] = [];\n for (const k of order) out.push(...(inputsByPort[k] ?? []));\n return { main: out };\n }\n\n if (ctx.config.cfg.mode === \"mergeByPosition\") {\n let maxLen = 0;\n for (const k of order) maxLen = Math.max(maxLen, (inputsByPort[k] ?? []).length);\n\n const out: Item[] = [];\n for (let i = 0; i < maxLen; i++) {\n const json: Record<string, unknown> = {};\n const paired: any[] = [];\n let meta: Record<string, unknown> | undefined;\n\n for (const k of order) {\n const item = (inputsByPort[k] ?? [])[i];\n json[k] = item?.json;\n if (item?.paired) paired.push(...item.paired);\n if (!meta && item?.meta) meta = { ...(item.meta as any) };\n }\n\n const merged: any = { json };\n if (paired.length > 0) merged.paired = paired;\n if (meta) merged.meta = meta;\n out.push(merged as Item);\n }\n\n return { main: out };\n }\n\n // passThrough (default): for each origin index, take first available input (deterministic input precedence).\n const chosenByOrigin = new Map<number, Item>();\n const fallback: Item[] = [];\n\n for (const k of order) {\n for (const item of inputsByPort[k] ?? []) {\n const origin = getOriginIndex(item);\n if (origin === undefined) {\n fallback.push(item);\n continue;\n }\n if (!chosenByOrigin.has(origin)) chosenByOrigin.set(origin, item);\n }\n }\n\n const out: Item[] = [];\n const origins = Array.from(chosenByOrigin.keys()).sort((a, b) => a - b);\n for (const o of origins) out.push(chosenByOrigin.get(o)!);\n out.push(...fallback);\n\n return { main: out };\n }\n}\n","import type { InputPortKey, RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { MergeNode } from \"./MergeNode\";\n\nexport type MergeMode = \"passThrough\" | \"append\" | \"mergeByPosition\";\n\nexport class Merge<TInputJson = unknown, TOutputJson = TInputJson> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = MergeNode;\n readonly icon = \"lucide:git-merge\" as const;\n\n constructor(\n public readonly name: string,\n public readonly cfg: Readonly<{\n mode: MergeMode;\n /**\n * Deterministic input precedence order (only used for passThrough/append).\n * Any inputs not listed are appended in lexicographic order.\n */\n prefer?: ReadonlyArray<InputPortKey>;\n }> = { mode: \"passThrough\" },\n public readonly id?: string,\n ) {}\n}\n\nexport { MergeNode } from \"./MergeNode\";\n","import type { Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { NoOp } from \"./noOp\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class NoOpNode implements Node<NoOp<any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(items: Items, _ctx: NodeExecutionContext<NoOp<any>>): Promise<NodeOutputs> {\n return { main: items };\n }\n}\n","import type { RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { NoOpNode } from \"./NoOpNode\";\n\nexport class NoOp<TItemJson = unknown> implements RunnableNodeConfig<TItemJson, TItemJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = NoOpNode;\n readonly execution = { hint: \"local\" } as const;\n\n constructor(\n public readonly name: string = \"NoOp\",\n public readonly id?: string,\n ) {}\n}\n\nexport { NoOpNode } from \"./NoOpNode\";\n","import type { Item, Items, Node, NodeExecutionContext, NodeOutputs, WorkflowRunnerService } from \"@codemation/core\";\n\nimport { CoreTokens, inject, node } from \"@codemation/core\";\n\nimport { SubWorkflow } from \"./subWorkflow\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class SubWorkflowNode implements Node<SubWorkflow<any, any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n constructor(\n @inject(CoreTokens.WorkflowRunnerService)\n private readonly workflows: WorkflowRunnerService,\n ) {}\n\n async execute(items: Items, ctx: NodeExecutionContext<SubWorkflow<any, any>>): Promise<NodeOutputs> {\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const current = items[i]!;\n const metaBase = (\n current.meta && typeof current.meta === \"object\" ? (current.meta as Record<string, unknown>) : {}\n ) as Record<string, unknown>;\n const cmBase =\n metaBase._cm && typeof metaBase._cm === \"object\"\n ? (metaBase._cm as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n const originIndex = typeof cmBase.originIndex === \"number\" ? (cmBase.originIndex as number) : undefined;\n\n const result = await this.workflows.runById({\n workflowId: ctx.config.workflowId,\n startAt: ctx.config.startAt,\n items: [current],\n parent: {\n runId: ctx.runId,\n workflowId: ctx.workflowId,\n nodeId: ctx.nodeId,\n subworkflowDepth: ctx.subworkflowDepth,\n engineMaxNodeActivations: ctx.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: ctx.engineMaxSubworkflowDepth,\n },\n });\n if (result.status !== \"completed\")\n throw new Error(`Subworkflow ${ctx.config.workflowId} did not complete (status=${result.status})`);\n for (const produced of result.outputs) {\n const childMetaBase =\n produced.meta && typeof produced.meta === \"object\"\n ? (produced.meta as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n const childCmBase =\n childMetaBase._cm && typeof childMetaBase._cm === \"object\"\n ? (childMetaBase._cm as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n\n out.push({\n ...produced,\n meta: originIndex === undefined ? childMetaBase : { ...childMetaBase, _cm: { ...childCmBase, originIndex } },\n paired: current.paired ?? produced.paired,\n });\n }\n }\n\n return { main: out };\n }\n}\n","import type { NodeId, RunnableNodeConfig, TypeToken, UpstreamRefPlaceholder } from \"@codemation/core\";\n\nimport { SubWorkflowNode } from \"./SubWorkflowNode\";\n\nexport class SubWorkflow<TInputJson = unknown, TOutputJson = unknown> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = SubWorkflowNode;\n constructor(\n public readonly name: string,\n public readonly workflowId: string,\n public upstreamRefs?: Array<{ nodeId: NodeId } | UpstreamRefPlaceholder>,\n public readonly startAt?: NodeId,\n public readonly id?: string,\n ) {}\n}\n\nexport { SubWorkflowNode } from \"./SubWorkflowNode\";\n","export class WaitDuration {\n static normalize(milliseconds: number): number {\n return Number.isFinite(milliseconds) && milliseconds > 0 ? Math.floor(milliseconds) : 0;\n }\n}\n","import type { Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\n\nimport { node } from \"@codemation/core\";\n\nimport { Wait } from \"./wait\";\nimport { WaitDuration } from \"./WaitDurationFactory\";\n\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class WaitNode implements Node<Wait<any>> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(items: Items, ctx: NodeExecutionContext<Wait<any>>): Promise<NodeOutputs> {\n const milliseconds = WaitDuration.normalize(ctx.config.milliseconds);\n if (milliseconds > 0) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, milliseconds);\n });\n }\n return { main: items };\n }\n}\n","import type { RunnableNodeConfig, TypeToken } from \"@codemation/core\";\n\nimport { WaitNode } from \"./WaitNode\";\n\nexport class Wait<TItemJson = unknown> implements RunnableNodeConfig<TItemJson, TItemJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = WaitNode;\n readonly execution = { hint: \"local\" } as const;\n /** Pass-through empty batches should still advance to downstream nodes. */\n readonly continueWhenEmptyOutput = true as const;\n\n constructor(\n public readonly name: string,\n public readonly milliseconds: number,\n public readonly id?: string,\n ) {}\n}\n\nexport { WaitDuration } from \"./WaitDurationFactory\";\nexport { WaitNode } from \"./WaitNode\";\n","import type { Items, WebhookControlSignal } from \"@codemation/core\";\n\nexport class WebhookRespondNowAndContinueError extends Error implements WebhookControlSignal {\n readonly __webhookControl = true as const;\n readonly kind = \"respondNowAndContinue\" as const;\n\n constructor(\n public readonly responseItems: Items,\n public readonly continueItems: Items,\n message: string = \"Webhook responded immediately and continued the run.\",\n ) {\n super(message);\n this.name = \"WebhookRespondNowAndContinueError\";\n }\n}\n","import type { Items, WebhookControlSignal } from \"@codemation/core\";\n\nexport class WebhookRespondNowError extends Error implements WebhookControlSignal {\n readonly __webhookControl = true as const;\n readonly kind = \"respondNow\" as const;\n\n constructor(\n public readonly responseItems: Items,\n message: string = \"Webhook responded immediately.\",\n ) {\n super(message);\n this.name = \"WebhookRespondNowError\";\n }\n}\n","import type {\n ExecutableTriggerNode,\n Items,\n NodeExecutionContext,\n NodeOutputs,\n TriggerSetupContext,\n} from \"@codemation/core\";\nimport { node } from \"@codemation/core\";\nimport { WebhookTrigger } from \"./WebhookTriggerFactory\";\n\n/**\n * HTTP webhooks are not registered in trigger setup. The host exposes a single catch-all route\n * (e.g. `/api/webhooks/:endpointPath`); the engine's catalog-backed webhook matcher resolves the\n * user-defined endpoint path to this workflow + node, then runs the workflow from this trigger.\n */\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class WebhookTriggerNode implements ExecutableTriggerNode<WebhookTrigger<any>> {\n readonly kind = \"trigger\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async setup(_ctx: TriggerSetupContext<WebhookTrigger<any>>): Promise<undefined> {\n return undefined;\n }\n\n async execute(items: Items, _ctx: NodeExecutionContext<WebhookTrigger<any>>): Promise<NodeOutputs> {\n if (items.length === 0) {\n throw new Error(\n `Webhook trigger \"${_ctx.config.name}\" requires a webhook request. Invoke this workflow through its webhook endpoint until manual request simulation is supported.`,\n );\n }\n const result = await _ctx.config.handler(items, _ctx);\n return { main: result ?? items };\n }\n}\n","import type { HttpMethod, Items, NodeExecutionContext, TriggerNodeConfig, TypeToken } from \"@codemation/core\";\nimport type { ZodType } from \"zod\";\nimport { WebhookTriggerNode } from \"./webhookTriggerNode\";\n\ntype WebhookInputSchema = ZodType<any, any, any>;\ntype WebhookTriggerHandler<TConfig extends WebhookTrigger<any> = WebhookTrigger<any>> = (\n items: Items,\n ctx: NodeExecutionContext<TConfig>,\n) => Promise<Items | void> | Items | void;\n\nexport class WebhookTrigger<\n TSchema extends WebhookInputSchema | undefined = undefined,\n> implements TriggerNodeConfig<unknown> {\n readonly kind = \"trigger\" as const;\n readonly type: TypeToken<unknown> = WebhookTriggerNode;\n readonly icon = \"lucide:globe\";\n\n constructor(\n public readonly name: string,\n private readonly args: Readonly<{\n endpointKey: string;\n methods: ReadonlyArray<HttpMethod>;\n inputSchema?: TSchema;\n }>,\n public readonly handler: WebhookTriggerHandler<\n WebhookTrigger<TSchema>\n > = WebhookTrigger.defaultHandler as WebhookTriggerHandler<WebhookTrigger<TSchema>>,\n public readonly id?: string,\n ) {}\n\n get endpointKey(): string {\n return this.args.endpointKey;\n }\n\n get methods(): ReadonlyArray<HttpMethod> {\n return this.args.methods;\n }\n\n get inputSchema(): TSchema | undefined {\n return this.args.inputSchema;\n }\n\n parseJsonBody(body: unknown): unknown {\n if (!this.args.inputSchema) return body;\n return this.args.inputSchema.parse(body);\n }\n\n private static defaultHandler(items: Items): Items {\n return items;\n }\n}\n","import type { Items, Node, NodeExecutionContext, NodeOutputs } from \"@codemation/core\";\nimport { node } from \"@codemation/core\";\n\nimport type { ConnectionCredentialNodeConfig } from \"./ConnectionCredentialNodeConfig\";\n\n/**\n * Placeholder runnable node for connection-owned workflow nodes (LLM/tool slots).\n * The engine does not schedule these; they exist for credentials, tokens, and UI identity.\n */\n@node({ packageName: \"@codemation/core-nodes\" })\nexport class ConnectionCredentialNode implements Node<ConnectionCredentialNodeConfig> {\n kind = \"node\" as const;\n outputPorts = [\"main\"] as const;\n\n async execute(_items: Items, _ctx: NodeExecutionContext<ConnectionCredentialNodeConfig>): Promise<NodeOutputs> {\n return { main: [] };\n }\n}\n","import type { Container } from \"@codemation/core\";\nimport { AIAgentExecutionHelpersFactory, AIAgentNode } from \"./nodes/aiAgent\";\nimport { CallbackNode } from \"./nodes/CallbackNodeFactory\";\nimport { HttpRequestNode } from \"./nodes/httpRequest\";\nimport { IfNode } from \"./nodes/if\";\nimport { ManualTriggerNode } from \"./nodes/ManualTriggerFactory\";\nimport { MapDataNode } from \"./nodes/mapData\";\nimport { NoOpNode } from \"./nodes/noOp\";\nimport { SubWorkflowNode } from \"./nodes/subWorkflow\";\nimport { WaitNode } from \"./nodes/wait\";\nimport { ConnectionCredentialNode } from \"./nodes/ConnectionCredentialNode\";\n\n/**\n * Registrar for built-in nodes. In a real project, this would use tsyringe's\n * container.registerSingleton(...). For the skeleton we keep it token-based:\n * the engine resolves node implementations by class token.\n */\nexport function registerCoreNodes(container: Container): void {\n // With class tokens, resolving registers happen via the DI container setup.\n // This function exists as the standardized extension point.\n void container;\n\n // Example: if using tsyringe, you'd do:\n // tsyringeContainer.registerSingleton(IfNode, IfNode);\n // ...\n void IfNode;\n void HttpRequestNode;\n void CallbackNode;\n void MapDataNode;\n void NoOpNode;\n void SubWorkflowNode;\n void ManualTriggerNode;\n void AIAgentNode;\n void AIAgentExecutionHelpersFactory;\n void WaitNode;\n void ConnectionCredentialNode;\n}\n","import type { WorkflowId } from \"@codemation/core\";\nimport { WorkflowBuilder } from \"@codemation/core\";\nimport { Merge } from \"./nodes/merge\";\n\nexport function createWorkflowBuilder(meta: Readonly<{ id: WorkflowId; name: string }>): WorkflowBuilder {\n return new WorkflowBuilder(meta, {\n makeMergeNode: (name) => new Merge(name, { mode: \"passThrough\", prefer: [\"true\", \"false\"] }),\n });\n}\n","import type { ChatModelConfig } from \"@codemation/core\";\nimport { OpenAIChatModelConfig } from \"../chatModels/openAiChatModelConfig\";\n\nexport class WorkflowChatModelFactory {\n static create(model: string | ChatModelConfig): ChatModelConfig {\n if (typeof model !== \"string\") {\n return model;\n }\n const [provider, resolvedModel] = model.includes(\":\") ? model.split(\":\", 2) : [\"openai\", model];\n if (provider !== \"openai\") {\n throw new Error(`Unsupported workflow().agent() model provider \"${provider}\".`);\n }\n return new OpenAIChatModelConfig(\"OpenAI\", resolvedModel);\n }\n}\n","import { z } from \"zod\";\nimport { AIAgent } from \"../nodes/AIAgentConfig\";\nimport type { WorkflowAgentOptions } from \"./WorkflowAuthoringOptions.types\";\nimport { WorkflowChatModelFactory } from \"./WorkflowChatModelFactory.types\";\n\nexport class WorkflowAgentNodeFactory {\n static create<TCurrentJson, TOutputSchema extends z.ZodTypeAny | undefined>(\n nameOrOptions: string | WorkflowAgentOptions<TCurrentJson, TOutputSchema>,\n optionsOrUndefined?: WorkflowAgentOptions<TCurrentJson, TOutputSchema>,\n ): AIAgent<TCurrentJson, TOutputSchema extends z.ZodTypeAny ? z.output<TOutputSchema> : Record<string, unknown>> {\n const options = typeof nameOrOptions === \"string\" ? optionsOrUndefined! : nameOrOptions;\n const name = typeof nameOrOptions === \"string\" ? nameOrOptions : \"AI agent\";\n const prompt = options.prompt;\n const messages = [\n {\n role: \"user\" as const,\n content:\n typeof prompt === \"function\" ? ({ item }: { item: { json: TCurrentJson } }) => prompt(item.json) : prompt,\n },\n ] as const;\n return new AIAgent<\n TCurrentJson,\n TOutputSchema extends z.ZodTypeAny ? z.output<TOutputSchema> : Record<string, unknown>\n >({\n name,\n messages,\n chatModel: WorkflowChatModelFactory.create(options.model),\n tools: options.tools,\n id: options.id,\n retryPolicy: options.retryPolicy,\n guardrails: options.guardrails,\n });\n }\n}\n","import { DefinedNodeRegistry, type DefinedNode } from \"@codemation/core\";\n\nexport class WorkflowDefinedNodeResolver {\n static resolve(\n definitionOrKey: DefinedNode<string, Record<string, unknown>, unknown, unknown> | string,\n ): DefinedNode<string, Record<string, unknown>, unknown, unknown> {\n if (typeof definitionOrKey !== \"string\") {\n return definitionOrKey;\n }\n const definition = DefinedNodeRegistry.resolve(definitionOrKey);\n if (!definition) {\n throw new Error(`No helper-defined node with key \"${definitionOrKey}\" is registered in this module graph.`);\n }\n return definition;\n }\n}\n","export class WorkflowDurationParser {\n static parse(duration: number | string): number {\n if (typeof duration === \"number\") {\n return Number.isFinite(duration) && duration > 0 ? Math.floor(duration) : 0;\n }\n const normalized = duration.trim().toLowerCase();\n const match = normalized.match(/^(\\d+)(ms|s|m|h)$/);\n if (!match) {\n throw new Error(\n `Unsupported wait duration \"${duration}\". Use a number of milliseconds or values like \"500ms\", \"2s\", \"5m\".`,\n );\n }\n const value = Number(match[1]);\n const unit = match[2];\n if (unit === \"ms\") {\n return value;\n }\n if (unit === \"s\") {\n return value * 1000;\n }\n if (unit === \"m\") {\n return value * 60_000;\n }\n return value * 3_600_000;\n }\n}\n","import type { AnyRunnableNodeConfig, DefinedNode, RunnableNodeConfig, RunnableNodeOutputJson } from \"@codemation/core\";\nimport { z } from \"zod\";\nimport { MapData } from \"../nodes/mapData\";\nimport { Wait } from \"../nodes/wait\";\nimport type { WorkflowAgentOptions } from \"./WorkflowAuthoringOptions.types\";\nimport { WorkflowAgentNodeFactory } from \"./WorkflowAgentNodeFactory.types\";\nimport { WorkflowDefinedNodeResolver } from \"./WorkflowDefinedNodeResolver.types\";\nimport { WorkflowDurationParser } from \"./WorkflowDurationParser.types\";\n\nexport class WorkflowBranchBuilder<TCurrentJson> {\n constructor(private readonly steps: ReadonlyArray<AnyRunnableNodeConfig> = []) {}\n\n then<TConfig extends RunnableNodeConfig<TCurrentJson, any>>(\n config: TConfig,\n ): WorkflowBranchBuilder<RunnableNodeOutputJson<TConfig>> {\n return new WorkflowBranchBuilder<RunnableNodeOutputJson<TConfig>>([...this.steps, config]);\n }\n\n map<TNextJson>(mapper: (item: TCurrentJson) => TNextJson): WorkflowBranchBuilder<TNextJson>;\n map<TNextJson>(\n name: string,\n mapper: (item: TCurrentJson) => TNextJson,\n id?: string,\n ): WorkflowBranchBuilder<TNextJson>;\n map<TNextJson>(\n nameOrMapper: string | ((item: TCurrentJson) => TNextJson),\n mapperOrUndefined?: (item: TCurrentJson) => TNextJson,\n id?: string,\n ): WorkflowBranchBuilder<TNextJson> {\n const name = typeof nameOrMapper === \"string\" ? nameOrMapper : \"Map data\";\n const mapper = typeof nameOrMapper === \"string\" ? mapperOrUndefined! : nameOrMapper;\n return this.then(\n new MapData<TCurrentJson, TNextJson>(name, (item) => mapper(item.json as TCurrentJson), id),\n ) as WorkflowBranchBuilder<TNextJson>;\n }\n\n wait(duration: number | string): WorkflowBranchBuilder<TCurrentJson>;\n wait(name: string, duration: number | string, id?: string): WorkflowBranchBuilder<TCurrentJson>;\n wait(\n nameOrDuration: string | number,\n durationOrUndefined?: string | number,\n id?: string,\n ): WorkflowBranchBuilder<TCurrentJson> {\n const name = typeof nameOrDuration === \"string\" && durationOrUndefined !== undefined ? nameOrDuration : \"Wait\";\n const duration = durationOrUndefined ?? nameOrDuration;\n return this.then(\n new Wait<TCurrentJson>(name, WorkflowDurationParser.parse(duration), id),\n ) as WorkflowBranchBuilder<TCurrentJson>;\n }\n\n agent<TOutputSchema extends z.ZodTypeAny>(\n options: WorkflowAgentOptions<TCurrentJson, TOutputSchema>,\n ): WorkflowBranchBuilder<z.output<TOutputSchema>>;\n agent(options: WorkflowAgentOptions<TCurrentJson, undefined>): WorkflowBranchBuilder<Record<string, unknown>>;\n agent<TOutputSchema extends z.ZodTypeAny>(\n name: string,\n options: WorkflowAgentOptions<TCurrentJson, TOutputSchema | undefined>,\n ): WorkflowBranchBuilder<TOutputSchema extends z.ZodTypeAny ? z.output<TOutputSchema> : Record<string, unknown>>;\n agent<TOutputSchema extends z.ZodTypeAny>(\n nameOrOptions: string | WorkflowAgentOptions<TCurrentJson, TOutputSchema | undefined>,\n optionsOrUndefined?: WorkflowAgentOptions<TCurrentJson, TOutputSchema | undefined>,\n ): WorkflowBranchBuilder<TOutputSchema extends z.ZodTypeAny ? z.output<TOutputSchema> : Record<string, unknown>> {\n return this.then(WorkflowAgentNodeFactory.create(nameOrOptions, optionsOrUndefined)) as WorkflowBranchBuilder<\n TOutputSchema extends z.ZodTypeAny ? z.output<TOutputSchema> : Record<string, unknown>\n >;\n }\n\n node<TConfig extends Record<string, unknown>, TOutputJson>(\n definitionOrKey: DefinedNode<string, TConfig, TCurrentJson, TOutputJson> | string,\n config: TConfig,\n name?: string,\n id?: string,\n ): WorkflowBranchBuilder<TOutputJson> {\n const definition = WorkflowDefinedNodeResolver.resolve(\n definitionOrKey as DefinedNode<string, Record<string, unknown>, unknown, unknown> | string,\n ) as DefinedNode<string, TConfig, TCurrentJson, TOutputJson>;\n return this.then(\n definition.create(config, name, id) as RunnableNodeConfig<TCurrentJson, TOutputJson>,\n ) as WorkflowBranchBuilder<TOutputJson>;\n }\n\n getSteps(): ReadonlyArray<AnyRunnableNodeConfig> {\n return this.steps;\n }\n}\n","import type { DefinedNode, RunnableNodeConfig, RunnableNodeOutputJson, WorkflowDefinition } from \"@codemation/core\";\nimport { ChainCursor } from \"@codemation/core\";\nimport { z } from \"zod\";\nimport { If } from \"../nodes/if\";\nimport { MapData } from \"../nodes/mapData\";\nimport { Wait } from \"../nodes/wait\";\nimport type { WorkflowAgentOptions } from \"./WorkflowAuthoringOptions.types\";\nimport { WorkflowAgentNodeFactory } from \"./WorkflowAgentNodeFactory.types\";\nimport { WorkflowBranchBuilder } from \"./WorkflowBranchBuilder.types\";\nimport { WorkflowDefinedNodeResolver } from \"./WorkflowDefinedNodeResolver.types\";\nimport { WorkflowDurationParser } from \"./WorkflowDurationParser.types\";\n\ntype BranchCallback<TCurrentJson, TNextJson> = (\n branch: WorkflowBranchBuilder<TCurrentJson>,\n) => WorkflowBranchBuilder<TNextJson>;\ntype BranchOutputMatch<TLeft, TRight> = [TLeft] extends [TRight] ? ([TRight] extends [TLeft] ? true : false) : false;\n\nexport class WorkflowChain<TCurrentJson> {\n constructor(private readonly chain: ChainCursor<TCurrentJson>) {}\n\n then<TConfig extends RunnableNodeConfig<TCurrentJson, any>>(\n config: TConfig,\n ): WorkflowChain<RunnableNodeOutputJson<TConfig>> {\n return new WorkflowChain(this.chain.then(config));\n }\n\n map<TNextJson>(mapper: (item: TCurrentJson) => TNextJson): WorkflowChain<TNextJson>;\n map<TNextJson>(name: string, mapper: (item: TCurrentJson) => TNextJson, id?: string): WorkflowChain<TNextJson>;\n map<TNextJson>(\n nameOrMapper: string | ((item: TCurrentJson) => TNextJson),\n mapperOrUndefined?: (item: TCurrentJson) => TNextJson,\n id?: string,\n ): WorkflowChain<TNextJson> {\n const name = typeof nameOrMapper === \"string\" ? nameOrMapper : \"Map data\";\n const mapper = typeof nameOrMapper === \"string\" ? mapperOrUndefined! : nameOrMapper;\n return this.then(\n new MapData<TCurrentJson, TNextJson>(name, (item) => mapper(item.json as TCurrentJson), id),\n ) as WorkflowChain<TNextJson>;\n }\n\n wait(duration: number | string): WorkflowChain<TCurrentJson>;\n wait(name: string, duration: number | string, id?: string): WorkflowChain<TCurrentJson>;\n wait(\n nameOrDuration: string | number,\n durationOrUndefined?: string | number,\n id?: string,\n ): WorkflowChain<TCurrentJson> {\n const name = typeof nameOrDuration === \"string\" && durationOrUndefined !== undefined ? nameOrDuration : \"Wait\";\n const duration = durationOrUndefined ?? nameOrDuration;\n return this.then(\n new Wait<TCurrentJson>(name, WorkflowDurationParser.parse(duration), id),\n ) as WorkflowChain<TCurrentJson>;\n }\n\n if<TBranchJson>(\n predicate: (item: TCurrentJson) => boolean,\n branches: Readonly<{\n true?: BranchCallback<TCurrentJson, TBranchJson>;\n false?: BranchCallback<TCurrentJson, TBranchJson>;\n }>,\n ): WorkflowChain<TBranchJson>;\n if<TBranchJson>(\n name: string,\n predicate: (item: TCurrentJson) => boolean,\n branches: Readonly<{\n true?: BranchCallback<TCurrentJson, TBranchJson>;\n false?: BranchCallback<TCurrentJson, TBranchJson>;\n }>,\n ): WorkflowChain<TBranchJson>;\n if<TTrueJson, TFalseJson>(\n nameOrPredicate: string | ((item: TCurrentJson) => boolean),\n predicateOrBranches:\n | ((item: TCurrentJson) => boolean)\n | Readonly<{ true?: BranchCallback<TCurrentJson, TTrueJson>; false?: BranchCallback<TCurrentJson, TFalseJson> }>,\n branchesOrUndefined?: Readonly<{\n true?: BranchCallback<TCurrentJson, TTrueJson>;\n false?: BranchCallback<TCurrentJson, TFalseJson>;\n }>,\n ): WorkflowChain<BranchOutputMatch<TTrueJson, TFalseJson> extends true ? TTrueJson : never> {\n const name = typeof nameOrPredicate === \"string\" ? nameOrPredicate : \"If\";\n const predicate =\n typeof nameOrPredicate === \"string\" ? (predicateOrBranches as (item: TCurrentJson) => boolean) : nameOrPredicate;\n const branches = (typeof nameOrPredicate === \"string\" ? branchesOrUndefined : predicateOrBranches) as Readonly<{\n true?: BranchCallback<TCurrentJson, TTrueJson>;\n false?: BranchCallback<TCurrentJson, TFalseJson>;\n }>;\n const cursor = this.chain.then(new If<TCurrentJson>(name, (item) => predicate(item.json as TCurrentJson)));\n const trueSteps = branches.true?.(new WorkflowBranchBuilder<TCurrentJson>()).getSteps();\n const falseSteps = branches.false?.(new WorkflowBranchBuilder<TCurrentJson>()).getSteps();\n return new WorkflowChain(\n cursor.when({\n true: trueSteps,\n false: falseSteps,\n }),\n ) as WorkflowChain<BranchOutputMatch<TTrueJson, TFalseJson> extends true ? TTrueJson : never>;\n }\n\n agent<TOutputSchema extends z.ZodTypeAny>(\n options: WorkflowAgentOptions<TCurrentJson, TOutputSchema>,\n ): WorkflowChain<z.output<TOutputSchema>>;\n agent(options: WorkflowAgentOptions<TCurrentJson, undefined>): WorkflowChain<Record<string, unknown>>;\n agent<TOutputSchema extends z.ZodTypeAny>(\n name: string,\n options: WorkflowAgentOptions<TCurrentJson, TOutputSchema | undefined>,\n ): WorkflowChain<TOutputSchema extends z.ZodTypeAny ? z.output<TOutputSchema> : Record<string, unknown>>;\n agent<TOutputSchema extends z.ZodTypeAny>(\n nameOrOptions: string | WorkflowAgentOptions<TCurrentJson, TOutputSchema | undefined>,\n optionsOrUndefined?: WorkflowAgentOptions<TCurrentJson, TOutputSchema | undefined>,\n ): WorkflowChain<TOutputSchema extends z.ZodTypeAny ? z.output<TOutputSchema> : Record<string, unknown>> {\n return this.then(WorkflowAgentNodeFactory.create(nameOrOptions, optionsOrUndefined)) as WorkflowChain<\n TOutputSchema extends z.ZodTypeAny ? z.output<TOutputSchema> : Record<string, unknown>\n >;\n }\n\n node<TConfig extends Record<string, unknown>, TOutputJson>(\n definitionOrKey: DefinedNode<string, TConfig, TCurrentJson, TOutputJson> | string,\n config: TConfig,\n name?: string,\n id?: string,\n ): WorkflowChain<TOutputJson> {\n const definition = WorkflowDefinedNodeResolver.resolve(\n definitionOrKey as DefinedNode<string, Record<string, unknown>, unknown, unknown> | string,\n ) as DefinedNode<string, TConfig, TCurrentJson, TOutputJson>;\n return this.then(\n definition.create(config, name, id) as RunnableNodeConfig<TCurrentJson, TOutputJson>,\n ) as WorkflowChain<TOutputJson>;\n }\n\n build(): WorkflowDefinition {\n return this.chain.build();\n }\n}\n","import { ChainCursor } from \"@codemation/core\";\nimport { ManualTrigger } from \"../nodes/ManualTriggerFactory\";\nimport { createWorkflowBuilder } from \"../workflowBuilder.types\";\nimport { WorkflowChain } from \"./WorkflowChain.types\";\n\nexport class WorkflowAuthoringBuilder {\n constructor(\n private readonly id: string,\n private readonly workflowName: string = id,\n ) {}\n\n name(name: string): WorkflowAuthoringBuilder {\n return new WorkflowAuthoringBuilder(this.id, name);\n }\n\n manualTrigger<TOutputJson>(defaultItems: TOutputJson | ReadonlyArray<TOutputJson>): WorkflowChain<TOutputJson>;\n manualTrigger<TOutputJson>(\n name: string,\n defaultItems?: TOutputJson | ReadonlyArray<TOutputJson>,\n id?: string,\n ): WorkflowChain<TOutputJson>;\n manualTrigger<TOutputJson>(\n nameOrDefaultItems: string | TOutputJson | ReadonlyArray<TOutputJson>,\n defaultItemsOrUndefined?: TOutputJson | ReadonlyArray<TOutputJson>,\n id?: string,\n ): WorkflowChain<TOutputJson> {\n const builder = createWorkflowBuilder({ id: this.id, name: this.workflowName });\n if (typeof nameOrDefaultItems === \"string\") {\n return new WorkflowChain(\n builder.trigger(\n new ManualTrigger<TOutputJson>(\n nameOrDefaultItems,\n defaultItemsOrUndefined as TOutputJson | ReadonlyArray<TOutputJson>,\n id,\n ),\n ) as ChainCursor<TOutputJson>,\n );\n }\n return new WorkflowChain(\n builder.trigger(new ManualTrigger<TOutputJson>(\"Manual trigger\", nameOrDefaultItems)) as ChainCursor<TOutputJson>,\n );\n }\n}\n","export type { WorkflowAgentOptions } from \"./workflowAuthoring/WorkflowAuthoringOptions.types\";\nexport { WorkflowAuthoringBuilder } from \"./workflowAuthoring/WorkflowAuthoringBuilder.types\";\nexport { WorkflowBranchBuilder } from \"./workflowAuthoring/WorkflowBranchBuilder.types\";\nexport { WorkflowChain } from \"./workflowAuthoring/WorkflowChain.types\";\n\nimport { WorkflowAuthoringBuilder } from \"./workflowAuthoring/WorkflowAuthoringBuilder.types\";\n\nexport function workflow(id: string): WorkflowAuthoringBuilder {\n return new WorkflowAuthoringBuilder(id);\n}\n","import type { NodeDefinition, WorkflowDefinition, WorkflowNodeConnection } from \"@codemation/core\";\nimport { AgentConfigInspector, ConnectionNodeIdFactory } from \"@codemation/core\";\n\nimport { AIAgentNode } from \"../nodes/AIAgentNode\";\nimport { ConnectionCredentialNode } from \"../nodes/ConnectionCredentialNode\";\nimport { ConnectionCredentialNodeConfigFactory } from \"../nodes/ConnectionCredentialNodeConfigFactory\";\n\n/**\n * Materializes connection-owned child nodes and {@link WorkflowDefinition.connections} for AI agent nodes.\n */\nexport class AIAgentConnectionWorkflowExpander {\n constructor(private readonly connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory) {}\n\n expand(workflow: WorkflowDefinition): WorkflowDefinition {\n const existingByParentAndName = new Map<string, WorkflowNodeConnection>();\n for (const c of workflow.connections ?? []) {\n existingByParentAndName.set(`${c.parentNodeId}\\0${c.connectionName}`, c);\n }\n\n const extraNodes: NodeDefinition[] = [];\n const extraConnections: WorkflowNodeConnection[] = [];\n\n for (const node of workflow.nodes) {\n if (node.type !== AIAgentNode || !AgentConfigInspector.isAgentNodeConfig(node.config)) {\n continue;\n }\n const agentId = node.id;\n const agentConfig = node.config;\n\n if (!existingByParentAndName.has(`${agentId}\\0llm`)) {\n const llmId = ConnectionNodeIdFactory.languageModelConnectionNodeId(agentId);\n this.assertNoIdCollision(workflow, extraNodes, llmId);\n extraNodes.push({\n id: llmId,\n kind: \"node\",\n type: ConnectionCredentialNode,\n name: agentConfig.chatModel.presentation?.label ?? agentConfig.chatModel.name,\n config: this.connectionCredentialNodeConfigFactory.create(agentConfig.chatModel.name, agentConfig.chatModel),\n });\n extraConnections.push({ parentNodeId: agentId, connectionName: \"llm\", childNodeIds: [llmId] });\n }\n\n if (!existingByParentAndName.has(`${agentId}\\0tools`) && (agentConfig.tools?.length ?? 0) > 0) {\n const toolIds: string[] = [];\n for (const tool of agentConfig.tools ?? []) {\n const toolId = ConnectionNodeIdFactory.toolConnectionNodeId(agentId, tool.name);\n this.assertNoIdCollision(workflow, extraNodes, toolId);\n toolIds.push(toolId);\n extraNodes.push({\n id: toolId,\n kind: \"node\",\n type: ConnectionCredentialNode,\n name: tool.presentation?.label ?? tool.name,\n config: this.connectionCredentialNodeConfigFactory.create(tool.name, tool),\n });\n }\n extraConnections.push({ parentNodeId: agentId, connectionName: \"tools\", childNodeIds: toolIds });\n }\n }\n\n if (extraNodes.length === 0) {\n return workflow;\n }\n\n return {\n ...workflow,\n nodes: [...workflow.nodes, ...extraNodes],\n connections: [...(workflow.connections ?? []), ...extraConnections],\n };\n }\n\n private assertNoIdCollision(workflow: WorkflowDefinition, pending: ReadonlyArray<NodeDefinition>, id: string): void {\n if (workflow.nodes.some((n) => n.id === id) || pending.some((n) => n.id === id)) {\n throw new Error(\n `AIAgent connection expansion: node id \"${id}\" already exists. Rename the conflicting node or adjust the workflow.`,\n );\n }\n }\n}\n","import type { CredentialRequirement, RunnableNodeConfig } from \"@codemation/core\";\n\nimport { ConnectionCredentialNode } from \"./ConnectionCredentialNode\";\n\nexport class ConnectionCredentialNodeConfig implements RunnableNodeConfig {\n readonly kind = \"node\" as const;\n readonly type = ConnectionCredentialNode;\n\n constructor(\n public readonly name: string,\n private readonly credentialSource: { getCredentialRequirements?: () => ReadonlyArray<CredentialRequirement> },\n ) {}\n\n getCredentialRequirements(): ReadonlyArray<CredentialRequirement> {\n return this.credentialSource.getCredentialRequirements?.() ?? [];\n }\n}\n","import type { CredentialRequirement } from \"@codemation/core\";\n\nimport { ConnectionCredentialNodeConfig } from \"./ConnectionCredentialNodeConfig\";\n\nexport class ConnectionCredentialNodeConfigFactory {\n create(\n name: string,\n credentialSource: { getCredentialRequirements?: () => ReadonlyArray<CredentialRequirement> },\n ): ConnectionCredentialNodeConfig {\n return new ConnectionCredentialNodeConfig(name, credentialSource);\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemation/core-nodes",
3
- "version": "0.0.15",
3
+ "version": "0.0.18",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -11,6 +11,7 @@
11
11
  "url": "https://github.com/MadeRelevant/codemation",
12
12
  "directory": "packages/core-nodes"
13
13
  },
14
+ "license": "SEE LICENSE IN LICENSE",
14
15
  "type": "module",
15
16
  "main": "./dist/index.cjs",
16
17
  "module": "./dist/index.js",
@@ -30,7 +31,7 @@
30
31
  "@langchain/core": "^1.1.31",
31
32
  "@langchain/openai": "^1.2.12",
32
33
  "lucide-react": "^0.577.0",
33
- "@codemation/core": "0.0.15"
34
+ "@codemation/core": "0.0.18"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@types/node": "^25.3.5",
package/src/index.ts CHANGED
@@ -19,6 +19,7 @@ export * from "./nodes/WebhookTriggerFactory";
19
19
  export * from "./nodes/webhookTriggerNode";
20
20
  export * from "./register.types";
21
21
  export * from "./workflowBuilder.types";
22
+ export * from "./workflowAuthoring.types";
22
23
  export * from "./workflows/AIAgentConnectionWorkflowExpander";
23
24
  export * from "./nodes/ConnectionCredentialNode";
24
25
  export * from "./nodes/ConnectionCredentialNodeConfig";