@codemation/core-nodes 0.0.11 → 0.0.14
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.cjs +3 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -12
- package/dist/index.d.ts +10 -12
- package/dist/index.js +3 -13
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/nodes/HttpRequestNodeFactory.ts +4 -24
- package/src/nodes/httpRequest.ts +10 -11
package/dist/index.cjs
CHANGED
|
@@ -525,7 +525,7 @@ let HttpRequestNode = class HttpRequestNode$1 {
|
|
|
525
525
|
const mimeType = this.resolveMimeType(headers);
|
|
526
526
|
const bodyBinaryName = ctx.config.binaryName;
|
|
527
527
|
const shouldAttachBody = this.shouldAttachBody(ctx.config.downloadMode, mimeType);
|
|
528
|
-
|
|
528
|
+
let outputItem = { json: {
|
|
529
529
|
url,
|
|
530
530
|
method: ctx.config.method,
|
|
531
531
|
ok: response.ok,
|
|
@@ -533,12 +533,8 @@ let HttpRequestNode = class HttpRequestNode$1 {
|
|
|
533
533
|
statusText: response.statusText,
|
|
534
534
|
mimeType,
|
|
535
535
|
headers,
|
|
536
|
-
|
|
537
|
-
}
|
|
538
|
-
let outputItem = {
|
|
539
|
-
...item,
|
|
540
|
-
json: responseJson
|
|
541
|
-
};
|
|
536
|
+
...shouldAttachBody ? { bodyBinaryName } : {}
|
|
537
|
+
} };
|
|
542
538
|
if (!shouldAttachBody) return outputItem;
|
|
543
539
|
const attachment = await ctx.binary.attach({
|
|
544
540
|
name: bodyBinaryName,
|
|
@@ -575,12 +571,6 @@ let HttpRequestNode = class HttpRequestNode$1 {
|
|
|
575
571
|
if (mode === "never") return false;
|
|
576
572
|
return mimeType.startsWith("image/") || mimeType.startsWith("audio/") || mimeType.startsWith("video/");
|
|
577
573
|
}
|
|
578
|
-
createResponseJson(inputJson, responseJson) {
|
|
579
|
-
return {
|
|
580
|
-
...this.asRecord(inputJson),
|
|
581
|
-
http: responseJson
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
574
|
resolveFilename(url, headers) {
|
|
585
575
|
const contentDisposition = headers["content-disposition"];
|
|
586
576
|
const fromDisposition = this.readFilenameFromContentDisposition(contentDisposition);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["OpenAIChatModelFactory","ChatOpenAI","name: string","model: string","credentialSlotKey: string","options?: Readonly<{\n temperature?: number;\n maxTokens?: number;\n }>","SystemMessage","HumanMessage","ToolMessage","CredentialResolverFactory","AIAgentNode","nodeResolver: NodeResolver","credentialSessions: CredentialSessionService","ConnectionNodeIdFactory","out: Item[]","DynamicStructuredTool","ConnectionInvocationIdFactory","CoreTokens","name: string","systemMessage: string","userMessageFormatter: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<AIAgent<TInputJson, TOutputJson>>,\n ) => string","chatModel: ChatModelConfig","tools: ReadonlyArray<ToolConfig>","id?: string","retryPolicy: RetryPolicySpec","RetryPolicy","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","RetryPolicy","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","ItemsInputNormalizer","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[]","CoreTokens","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","WorkflowBuilder","connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory","extraNodes: NodeDefinition[]","extraConnections: WorkflowNodeConnection[]","node","AgentConfigInspector","ConnectionNodeIdFactory","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/aiAgentSupport.types.ts","../src/nodes/AIAgentNodeFactory.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 { AgentToolCall } from \"@codemation/core\";\n\nimport { HumanMessage, SystemMessage, ToolMessage } from \"@langchain/core/messages\";\n\nexport class AgentMessageFactory {\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 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","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 { AgentToolCall, Item, NodeInputsByPort, Tool, ToolConfig, ZodSchemaAny } 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 tool: Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>;\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 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 ConnectionInvocationIdFactory,\n ConnectionNodeIdFactory,\n CoreTokens,\n inject,\n node,\n type NodeResolver,\n} from \"@codemation/core\";\n\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\n\nimport { DynamicStructuredTool } from \"@langchain/core/tools\";\n\nimport type { AIAgent } from \"./AIAgentConfig\";\nimport { ConnectionCredentialExecutionContextFactory } from \"./ConnectionCredentialExecutionContextFactory\";\nimport { AgentMessageFactory } from \"./AgentMessageFactory\";\nimport { AgentOutputFactory } from \"./AgentOutputFactory\";\nimport { AgentToolCallPortMap } from \"./AgentToolCallPortMapFactory\";\nimport {\n AgentItemPortMap,\n type ExecutedToolCall,\n type ItemScopedToolBinding,\n type PlannedToolCall,\n type ResolvedTool,\n} from \"./aiAgentSupport.types\";\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 ) {\n this.connectionCredentialExecutionContextFactory = new ConnectionCredentialExecutionContextFactory(\n credentialSessions,\n );\n }\n\n async execute(items: Items, ctx: NodeExecutionContext<AIAgent<any, any>>): Promise<NodeOutputs> {\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 const resolvedTools = this.resolveTools(ctx.config.tools ?? []);\n\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const prompt = ctx.config.userMessageFormatter(item, i, items, ctx);\n const itemInputsByPort = AgentItemPortMap.fromItem(item);\n const itemScopedTools = this.createItemScopedTools(resolvedTools, ctx, item, i, items);\n const firstResponse = await this.invokeModel(\n itemScopedTools.length > 0 && model.bindTools\n ? model.bindTools(itemScopedTools.map((entry) => entry.langChainTool))\n : model,\n ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n [\n AgentMessageFactory.createSystemPrompt(ctx.config.systemMessage),\n AgentMessageFactory.createUserPrompt(prompt),\n ],\n ctx,\n itemInputsByPort,\n );\n\n const toolCalls = AgentMessageFactory.extractToolCalls(firstResponse);\n if (toolCalls.length === 0) {\n out.push(\n AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(firstResponse)),\n ),\n );\n continue;\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 const finalResponse = await this.invokeModel(\n itemScopedTools.length > 0 && model.bindTools\n ? model.bindTools(itemScopedTools.map((entry) => entry.langChainTool))\n : model,\n ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n [\n AgentMessageFactory.createSystemPrompt(ctx.config.systemMessage),\n AgentMessageFactory.createUserPrompt(prompt),\n firstResponse,\n ...executedToolCalls.map((toolCall) =>\n AgentMessageFactory.createToolMessage(toolCall.toolCallId, toolCall.serialized),\n ),\n ],\n ctx,\n itemInputsByPort,\n );\n\n out.push(\n AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(finalResponse)),\n ),\n );\n }\n\n return { main: out };\n }\n\n private resolveTools(toolConfigs: ReadonlyArray<ToolConfig>): ReadonlyArray<ResolvedTool> {\n const resolvedTools = toolConfigs.map((config) => ({\n config,\n tool: this.nodeResolver.resolve(config.type) as Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>,\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 = new DynamicStructuredTool({\n name: entry.config.name,\n description: entry.config.description ?? entry.tool.defaultDescription,\n schema: entry.tool.inputSchema,\n func: async (input) => {\n const result = await entry.tool.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 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 ): 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)) 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","import {\n RetryPolicy,\n type AgentNodeConfig,\n type ChatModelConfig,\n type Item,\n type Items,\n type NodeExecutionContext,\n type RetryPolicySpec,\n type RunnableNodeConfig,\n type ToolConfig,\n type TypeToken,\n} from \"@codemation/core\";\n\nimport { AIAgentNode } from \"./AIAgentNodeFactory\";\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\n constructor(\n public readonly name: string,\n public readonly systemMessage: string,\n public readonly userMessageFormatter: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<AIAgent<TInputJson, TOutputJson>>,\n ) => string,\n public readonly chatModel: ChatModelConfig,\n public readonly tools: ReadonlyArray<ToolConfig> = [],\n public readonly id?: string,\n public readonly retryPolicy: RetryPolicySpec = RetryPolicy.defaultForAiAgent,\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 responseJson = this.createResponseJson(item.json, {\n url,\n method: ctx.config.method,\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n mimeType,\n headers,\n bodyBinaryName: shouldAttachBody ? bodyBinaryName : undefined,\n });\n\n let outputItem: Item = {\n ...item,\n json: responseJson,\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 createResponseJson(\n inputJson: unknown,\n responseJson: 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 ): Readonly<Record<string, unknown>> {\n return {\n ...this.asRecord(inputJson),\n http: responseJson,\n };\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\nexport type HttpRequestOutputJson = Readonly<{\n http: 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}>;\n\nexport class HttpRequest<\n TInputJson = Readonly<{ url?: string }>,\n TOutputJson = TInputJson & 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 { 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 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/AIAgentNodeFactory\";\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.cjs","names":["OpenAIChatModelFactory","ChatOpenAI","name: string","model: string","credentialSlotKey: string","options?: Readonly<{\n temperature?: number;\n maxTokens?: number;\n }>","SystemMessage","HumanMessage","ToolMessage","CredentialResolverFactory","AIAgentNode","nodeResolver: NodeResolver","credentialSessions: CredentialSessionService","ConnectionNodeIdFactory","out: Item[]","DynamicStructuredTool","ConnectionInvocationIdFactory","CoreTokens","name: string","systemMessage: string","userMessageFormatter: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<AIAgent<TInputJson, TOutputJson>>,\n ) => string","chatModel: ChatModelConfig","tools: ReadonlyArray<ToolConfig>","id?: string","retryPolicy: RetryPolicySpec","RetryPolicy","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","RetryPolicy","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","ItemsInputNormalizer","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[]","CoreTokens","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","WorkflowBuilder","connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory","extraNodes: NodeDefinition[]","extraConnections: WorkflowNodeConnection[]","node","AgentConfigInspector","ConnectionNodeIdFactory","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/aiAgentSupport.types.ts","../src/nodes/AIAgentNodeFactory.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 { AgentToolCall } from \"@codemation/core\";\n\nimport { HumanMessage, SystemMessage, ToolMessage } from \"@langchain/core/messages\";\n\nexport class AgentMessageFactory {\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 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","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 { AgentToolCall, Item, NodeInputsByPort, Tool, ToolConfig, ZodSchemaAny } 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 tool: Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>;\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 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 ConnectionInvocationIdFactory,\n ConnectionNodeIdFactory,\n CoreTokens,\n inject,\n node,\n type NodeResolver,\n} from \"@codemation/core\";\n\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\n\nimport { DynamicStructuredTool } from \"@langchain/core/tools\";\n\nimport type { AIAgent } from \"./AIAgentConfig\";\nimport { ConnectionCredentialExecutionContextFactory } from \"./ConnectionCredentialExecutionContextFactory\";\nimport { AgentMessageFactory } from \"./AgentMessageFactory\";\nimport { AgentOutputFactory } from \"./AgentOutputFactory\";\nimport { AgentToolCallPortMap } from \"./AgentToolCallPortMapFactory\";\nimport {\n AgentItemPortMap,\n type ExecutedToolCall,\n type ItemScopedToolBinding,\n type PlannedToolCall,\n type ResolvedTool,\n} from \"./aiAgentSupport.types\";\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 ) {\n this.connectionCredentialExecutionContextFactory = new ConnectionCredentialExecutionContextFactory(\n credentialSessions,\n );\n }\n\n async execute(items: Items, ctx: NodeExecutionContext<AIAgent<any, any>>): Promise<NodeOutputs> {\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 const resolvedTools = this.resolveTools(ctx.config.tools ?? []);\n\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const prompt = ctx.config.userMessageFormatter(item, i, items, ctx);\n const itemInputsByPort = AgentItemPortMap.fromItem(item);\n const itemScopedTools = this.createItemScopedTools(resolvedTools, ctx, item, i, items);\n const firstResponse = await this.invokeModel(\n itemScopedTools.length > 0 && model.bindTools\n ? model.bindTools(itemScopedTools.map((entry) => entry.langChainTool))\n : model,\n ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n [\n AgentMessageFactory.createSystemPrompt(ctx.config.systemMessage),\n AgentMessageFactory.createUserPrompt(prompt),\n ],\n ctx,\n itemInputsByPort,\n );\n\n const toolCalls = AgentMessageFactory.extractToolCalls(firstResponse);\n if (toolCalls.length === 0) {\n out.push(\n AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(firstResponse)),\n ),\n );\n continue;\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 const finalResponse = await this.invokeModel(\n itemScopedTools.length > 0 && model.bindTools\n ? model.bindTools(itemScopedTools.map((entry) => entry.langChainTool))\n : model,\n ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n [\n AgentMessageFactory.createSystemPrompt(ctx.config.systemMessage),\n AgentMessageFactory.createUserPrompt(prompt),\n firstResponse,\n ...executedToolCalls.map((toolCall) =>\n AgentMessageFactory.createToolMessage(toolCall.toolCallId, toolCall.serialized),\n ),\n ],\n ctx,\n itemInputsByPort,\n );\n\n out.push(\n AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(finalResponse)),\n ),\n );\n }\n\n return { main: out };\n }\n\n private resolveTools(toolConfigs: ReadonlyArray<ToolConfig>): ReadonlyArray<ResolvedTool> {\n const resolvedTools = toolConfigs.map((config) => ({\n config,\n tool: this.nodeResolver.resolve(config.type) as Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>,\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 = new DynamicStructuredTool({\n name: entry.config.name,\n description: entry.config.description ?? entry.tool.defaultDescription,\n schema: entry.tool.inputSchema,\n func: async (input) => {\n const result = await entry.tool.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 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 ): 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)) 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","import {\n RetryPolicy,\n type AgentNodeConfig,\n type ChatModelConfig,\n type Item,\n type Items,\n type NodeExecutionContext,\n type RetryPolicySpec,\n type RunnableNodeConfig,\n type ToolConfig,\n type TypeToken,\n} from \"@codemation/core\";\n\nimport { AIAgentNode } from \"./AIAgentNodeFactory\";\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\n constructor(\n public readonly name: string,\n public readonly systemMessage: string,\n public readonly userMessageFormatter: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<AIAgent<TInputJson, TOutputJson>>,\n ) => string,\n public readonly chatModel: ChatModelConfig,\n public readonly tools: ReadonlyArray<ToolConfig> = [],\n public readonly id?: string,\n public readonly retryPolicy: RetryPolicySpec = RetryPolicy.defaultForAiAgent,\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 { 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 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/AIAgentNodeFactory\";\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/dist/index.d.cts
CHANGED
|
@@ -737,28 +737,26 @@ declare class HttpRequestNode implements Node<HttpRequest<any, any>> {
|
|
|
737
737
|
private readHeaders;
|
|
738
738
|
private resolveMimeType;
|
|
739
739
|
private shouldAttachBody;
|
|
740
|
-
private createResponseJson;
|
|
741
740
|
private resolveFilename;
|
|
742
741
|
private readFilenameFromContentDisposition;
|
|
743
742
|
}
|
|
744
743
|
//#endregion
|
|
745
744
|
//#region src/nodes/httpRequest.d.ts
|
|
746
745
|
type HttpRequestDownloadMode = "auto" | "always" | "never";
|
|
746
|
+
/** JSON emitted by {@link HttpRequest} — response metadata only (input item fields are not passed through). */
|
|
747
747
|
type HttpRequestOutputJson = Readonly<{
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
bodyBinaryName?: string;
|
|
757
|
-
}>;
|
|
748
|
+
url: string;
|
|
749
|
+
method: string;
|
|
750
|
+
ok: boolean;
|
|
751
|
+
status: number;
|
|
752
|
+
statusText: string;
|
|
753
|
+
mimeType: string;
|
|
754
|
+
headers: Readonly<Record<string, string>>;
|
|
755
|
+
bodyBinaryName?: string;
|
|
758
756
|
}>;
|
|
759
757
|
declare class HttpRequest<TInputJson$1 = Readonly<{
|
|
760
758
|
url?: string;
|
|
761
|
-
}>, TOutputJson$1 =
|
|
759
|
+
}>, TOutputJson$1 = HttpRequestOutputJson> implements RunnableNodeConfig<TInputJson$1, TOutputJson$1> {
|
|
762
760
|
readonly name: string;
|
|
763
761
|
readonly args: Readonly<{
|
|
764
762
|
method?: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -737,28 +737,26 @@ declare class HttpRequestNode implements Node<HttpRequest<any, any>> {
|
|
|
737
737
|
private readHeaders;
|
|
738
738
|
private resolveMimeType;
|
|
739
739
|
private shouldAttachBody;
|
|
740
|
-
private createResponseJson;
|
|
741
740
|
private resolveFilename;
|
|
742
741
|
private readFilenameFromContentDisposition;
|
|
743
742
|
}
|
|
744
743
|
//#endregion
|
|
745
744
|
//#region src/nodes/httpRequest.d.ts
|
|
746
745
|
type HttpRequestDownloadMode = "auto" | "always" | "never";
|
|
746
|
+
/** JSON emitted by {@link HttpRequest} — response metadata only (input item fields are not passed through). */
|
|
747
747
|
type HttpRequestOutputJson = Readonly<{
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
bodyBinaryName?: string;
|
|
757
|
-
}>;
|
|
748
|
+
url: string;
|
|
749
|
+
method: string;
|
|
750
|
+
ok: boolean;
|
|
751
|
+
status: number;
|
|
752
|
+
statusText: string;
|
|
753
|
+
mimeType: string;
|
|
754
|
+
headers: Readonly<Record<string, string>>;
|
|
755
|
+
bodyBinaryName?: string;
|
|
758
756
|
}>;
|
|
759
757
|
declare class HttpRequest<TInputJson$1 = Readonly<{
|
|
760
758
|
url?: string;
|
|
761
|
-
}>, TOutputJson$1 =
|
|
759
|
+
}>, TOutputJson$1 = HttpRequestOutputJson> implements RunnableNodeConfig<TInputJson$1, TOutputJson$1> {
|
|
762
760
|
readonly name: string;
|
|
763
761
|
readonly args: Readonly<{
|
|
764
762
|
method?: string;
|
package/dist/index.js
CHANGED
|
@@ -497,7 +497,7 @@ let HttpRequestNode = class HttpRequestNode$1 {
|
|
|
497
497
|
const mimeType = this.resolveMimeType(headers);
|
|
498
498
|
const bodyBinaryName = ctx.config.binaryName;
|
|
499
499
|
const shouldAttachBody = this.shouldAttachBody(ctx.config.downloadMode, mimeType);
|
|
500
|
-
|
|
500
|
+
let outputItem = { json: {
|
|
501
501
|
url,
|
|
502
502
|
method: ctx.config.method,
|
|
503
503
|
ok: response.ok,
|
|
@@ -505,12 +505,8 @@ let HttpRequestNode = class HttpRequestNode$1 {
|
|
|
505
505
|
statusText: response.statusText,
|
|
506
506
|
mimeType,
|
|
507
507
|
headers,
|
|
508
|
-
|
|
509
|
-
}
|
|
510
|
-
let outputItem = {
|
|
511
|
-
...item,
|
|
512
|
-
json: responseJson
|
|
513
|
-
};
|
|
508
|
+
...shouldAttachBody ? { bodyBinaryName } : {}
|
|
509
|
+
} };
|
|
514
510
|
if (!shouldAttachBody) return outputItem;
|
|
515
511
|
const attachment = await ctx.binary.attach({
|
|
516
512
|
name: bodyBinaryName,
|
|
@@ -547,12 +543,6 @@ let HttpRequestNode = class HttpRequestNode$1 {
|
|
|
547
543
|
if (mode === "never") return false;
|
|
548
544
|
return mimeType.startsWith("image/") || mimeType.startsWith("audio/") || mimeType.startsWith("video/");
|
|
549
545
|
}
|
|
550
|
-
createResponseJson(inputJson, responseJson) {
|
|
551
|
-
return {
|
|
552
|
-
...this.asRecord(inputJson),
|
|
553
|
-
http: responseJson
|
|
554
|
-
};
|
|
555
|
-
}
|
|
556
546
|
resolveFilename(url, headers) {
|
|
557
547
|
const contentDisposition = headers["content-disposition"];
|
|
558
548
|
const fromDisposition = this.readFilenameFromContentDisposition(contentDisposition);
|
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 }>","AIAgentNode","nodeResolver: NodeResolver","credentialSessions: CredentialSessionService","out: Item[]","name: string","systemMessage: string","userMessageFormatter: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<AIAgent<TInputJson, TOutputJson>>,\n ) => string","chatModel: ChatModelConfig","tools: ReadonlyArray<ToolConfig>","id?: string","retryPolicy: RetryPolicySpec","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/aiAgentSupport.types.ts","../src/nodes/AIAgentNodeFactory.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 { AgentToolCall } from \"@codemation/core\";\n\nimport { HumanMessage, SystemMessage, ToolMessage } from \"@langchain/core/messages\";\n\nexport class AgentMessageFactory {\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 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","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 { AgentToolCall, Item, NodeInputsByPort, Tool, ToolConfig, ZodSchemaAny } 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 tool: Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>;\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 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 ConnectionInvocationIdFactory,\n ConnectionNodeIdFactory,\n CoreTokens,\n inject,\n node,\n type NodeResolver,\n} from \"@codemation/core\";\n\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\n\nimport { DynamicStructuredTool } from \"@langchain/core/tools\";\n\nimport type { AIAgent } from \"./AIAgentConfig\";\nimport { ConnectionCredentialExecutionContextFactory } from \"./ConnectionCredentialExecutionContextFactory\";\nimport { AgentMessageFactory } from \"./AgentMessageFactory\";\nimport { AgentOutputFactory } from \"./AgentOutputFactory\";\nimport { AgentToolCallPortMap } from \"./AgentToolCallPortMapFactory\";\nimport {\n AgentItemPortMap,\n type ExecutedToolCall,\n type ItemScopedToolBinding,\n type PlannedToolCall,\n type ResolvedTool,\n} from \"./aiAgentSupport.types\";\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 ) {\n this.connectionCredentialExecutionContextFactory = new ConnectionCredentialExecutionContextFactory(\n credentialSessions,\n );\n }\n\n async execute(items: Items, ctx: NodeExecutionContext<AIAgent<any, any>>): Promise<NodeOutputs> {\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 const resolvedTools = this.resolveTools(ctx.config.tools ?? []);\n\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const prompt = ctx.config.userMessageFormatter(item, i, items, ctx);\n const itemInputsByPort = AgentItemPortMap.fromItem(item);\n const itemScopedTools = this.createItemScopedTools(resolvedTools, ctx, item, i, items);\n const firstResponse = await this.invokeModel(\n itemScopedTools.length > 0 && model.bindTools\n ? model.bindTools(itemScopedTools.map((entry) => entry.langChainTool))\n : model,\n ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n [\n AgentMessageFactory.createSystemPrompt(ctx.config.systemMessage),\n AgentMessageFactory.createUserPrompt(prompt),\n ],\n ctx,\n itemInputsByPort,\n );\n\n const toolCalls = AgentMessageFactory.extractToolCalls(firstResponse);\n if (toolCalls.length === 0) {\n out.push(\n AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(firstResponse)),\n ),\n );\n continue;\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 const finalResponse = await this.invokeModel(\n itemScopedTools.length > 0 && model.bindTools\n ? model.bindTools(itemScopedTools.map((entry) => entry.langChainTool))\n : model,\n ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n [\n AgentMessageFactory.createSystemPrompt(ctx.config.systemMessage),\n AgentMessageFactory.createUserPrompt(prompt),\n firstResponse,\n ...executedToolCalls.map((toolCall) =>\n AgentMessageFactory.createToolMessage(toolCall.toolCallId, toolCall.serialized),\n ),\n ],\n ctx,\n itemInputsByPort,\n );\n\n out.push(\n AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(finalResponse)),\n ),\n );\n }\n\n return { main: out };\n }\n\n private resolveTools(toolConfigs: ReadonlyArray<ToolConfig>): ReadonlyArray<ResolvedTool> {\n const resolvedTools = toolConfigs.map((config) => ({\n config,\n tool: this.nodeResolver.resolve(config.type) as Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>,\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 = new DynamicStructuredTool({\n name: entry.config.name,\n description: entry.config.description ?? entry.tool.defaultDescription,\n schema: entry.tool.inputSchema,\n func: async (input) => {\n const result = await entry.tool.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 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 ): 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)) 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","import {\n RetryPolicy,\n type AgentNodeConfig,\n type ChatModelConfig,\n type Item,\n type Items,\n type NodeExecutionContext,\n type RetryPolicySpec,\n type RunnableNodeConfig,\n type ToolConfig,\n type TypeToken,\n} from \"@codemation/core\";\n\nimport { AIAgentNode } from \"./AIAgentNodeFactory\";\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\n constructor(\n public readonly name: string,\n public readonly systemMessage: string,\n public readonly userMessageFormatter: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<AIAgent<TInputJson, TOutputJson>>,\n ) => string,\n public readonly chatModel: ChatModelConfig,\n public readonly tools: ReadonlyArray<ToolConfig> = [],\n public readonly id?: string,\n public readonly retryPolicy: RetryPolicySpec = RetryPolicy.defaultForAiAgent,\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 responseJson = this.createResponseJson(item.json, {\n url,\n method: ctx.config.method,\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n mimeType,\n headers,\n bodyBinaryName: shouldAttachBody ? bodyBinaryName : undefined,\n });\n\n let outputItem: Item = {\n ...item,\n json: responseJson,\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 createResponseJson(\n inputJson: unknown,\n responseJson: 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 ): Readonly<Record<string, unknown>> {\n return {\n ...this.asRecord(inputJson),\n http: responseJson,\n };\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\nexport type HttpRequestOutputJson = Readonly<{\n http: 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}>;\n\nexport class HttpRequest<\n TInputJson = Readonly<{ url?: string }>,\n TOutputJson = TInputJson & 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 { 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 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/AIAgentNodeFactory\";\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 }>","AIAgentNode","nodeResolver: NodeResolver","credentialSessions: CredentialSessionService","out: Item[]","name: string","systemMessage: string","userMessageFormatter: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<AIAgent<TInputJson, TOutputJson>>,\n ) => string","chatModel: ChatModelConfig","tools: ReadonlyArray<ToolConfig>","id?: string","retryPolicy: RetryPolicySpec","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/aiAgentSupport.types.ts","../src/nodes/AIAgentNodeFactory.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 { AgentToolCall } from \"@codemation/core\";\n\nimport { HumanMessage, SystemMessage, ToolMessage } from \"@langchain/core/messages\";\n\nexport class AgentMessageFactory {\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 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","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 { AgentToolCall, Item, NodeInputsByPort, Tool, ToolConfig, ZodSchemaAny } 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 tool: Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>;\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 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 ConnectionInvocationIdFactory,\n ConnectionNodeIdFactory,\n CoreTokens,\n inject,\n node,\n type NodeResolver,\n} from \"@codemation/core\";\n\nimport { AIMessage, type BaseMessage } from \"@langchain/core/messages\";\n\nimport { DynamicStructuredTool } from \"@langchain/core/tools\";\n\nimport type { AIAgent } from \"./AIAgentConfig\";\nimport { ConnectionCredentialExecutionContextFactory } from \"./ConnectionCredentialExecutionContextFactory\";\nimport { AgentMessageFactory } from \"./AgentMessageFactory\";\nimport { AgentOutputFactory } from \"./AgentOutputFactory\";\nimport { AgentToolCallPortMap } from \"./AgentToolCallPortMapFactory\";\nimport {\n AgentItemPortMap,\n type ExecutedToolCall,\n type ItemScopedToolBinding,\n type PlannedToolCall,\n type ResolvedTool,\n} from \"./aiAgentSupport.types\";\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 ) {\n this.connectionCredentialExecutionContextFactory = new ConnectionCredentialExecutionContextFactory(\n credentialSessions,\n );\n }\n\n async execute(items: Items, ctx: NodeExecutionContext<AIAgent<any, any>>): Promise<NodeOutputs> {\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 const resolvedTools = this.resolveTools(ctx.config.tools ?? []);\n\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const prompt = ctx.config.userMessageFormatter(item, i, items, ctx);\n const itemInputsByPort = AgentItemPortMap.fromItem(item);\n const itemScopedTools = this.createItemScopedTools(resolvedTools, ctx, item, i, items);\n const firstResponse = await this.invokeModel(\n itemScopedTools.length > 0 && model.bindTools\n ? model.bindTools(itemScopedTools.map((entry) => entry.langChainTool))\n : model,\n ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n [\n AgentMessageFactory.createSystemPrompt(ctx.config.systemMessage),\n AgentMessageFactory.createUserPrompt(prompt),\n ],\n ctx,\n itemInputsByPort,\n );\n\n const toolCalls = AgentMessageFactory.extractToolCalls(firstResponse);\n if (toolCalls.length === 0) {\n out.push(\n AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(firstResponse)),\n ),\n );\n continue;\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 const finalResponse = await this.invokeModel(\n itemScopedTools.length > 0 && model.bindTools\n ? model.bindTools(itemScopedTools.map((entry) => entry.langChainTool))\n : model,\n ConnectionNodeIdFactory.languageModelConnectionNodeId(ctx.nodeId),\n [\n AgentMessageFactory.createSystemPrompt(ctx.config.systemMessage),\n AgentMessageFactory.createUserPrompt(prompt),\n firstResponse,\n ...executedToolCalls.map((toolCall) =>\n AgentMessageFactory.createToolMessage(toolCall.toolCallId, toolCall.serialized),\n ),\n ],\n ctx,\n itemInputsByPort,\n );\n\n out.push(\n AgentOutputFactory.replaceJson(\n item,\n AgentOutputFactory.fromAgentContent(AgentMessageFactory.extractContent(finalResponse)),\n ),\n );\n }\n\n return { main: out };\n }\n\n private resolveTools(toolConfigs: ReadonlyArray<ToolConfig>): ReadonlyArray<ResolvedTool> {\n const resolvedTools = toolConfigs.map((config) => ({\n config,\n tool: this.nodeResolver.resolve(config.type) as Tool<ToolConfig, ZodSchemaAny, ZodSchemaAny>,\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 = new DynamicStructuredTool({\n name: entry.config.name,\n description: entry.config.description ?? entry.tool.defaultDescription,\n schema: entry.tool.inputSchema,\n func: async (input) => {\n const result = await entry.tool.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 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 ): 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)) 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","import {\n RetryPolicy,\n type AgentNodeConfig,\n type ChatModelConfig,\n type Item,\n type Items,\n type NodeExecutionContext,\n type RetryPolicySpec,\n type RunnableNodeConfig,\n type ToolConfig,\n type TypeToken,\n} from \"@codemation/core\";\n\nimport { AIAgentNode } from \"./AIAgentNodeFactory\";\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\n constructor(\n public readonly name: string,\n public readonly systemMessage: string,\n public readonly userMessageFormatter: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<AIAgent<TInputJson, TOutputJson>>,\n ) => string,\n public readonly chatModel: ChatModelConfig,\n public readonly tools: ReadonlyArray<ToolConfig> = [],\n public readonly id?: string,\n public readonly retryPolicy: RetryPolicySpec = RetryPolicy.defaultForAiAgent,\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 { 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 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/AIAgentNodeFactory\";\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.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@langchain/core": "^1.1.31",
|
|
31
31
|
"@langchain/openai": "^1.2.12",
|
|
32
32
|
"lucide-react": "^0.577.0",
|
|
33
|
-
"@codemation/core": "0.0.
|
|
33
|
+
"@codemation/core": "0.0.14"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "^25.3.5",
|
|
@@ -27,7 +27,7 @@ export class HttpRequestNode implements Node<HttpRequest<any, any>> {
|
|
|
27
27
|
const mimeType = this.resolveMimeType(headers);
|
|
28
28
|
const bodyBinaryName = ctx.config.binaryName;
|
|
29
29
|
const shouldAttachBody = this.shouldAttachBody(ctx.config.downloadMode, mimeType);
|
|
30
|
-
const
|
|
30
|
+
const outputJson: Readonly<Record<string, unknown>> = {
|
|
31
31
|
url,
|
|
32
32
|
method: ctx.config.method,
|
|
33
33
|
ok: response.ok,
|
|
@@ -35,12 +35,11 @@ export class HttpRequestNode implements Node<HttpRequest<any, any>> {
|
|
|
35
35
|
statusText: response.statusText,
|
|
36
36
|
mimeType,
|
|
37
37
|
headers,
|
|
38
|
-
|
|
39
|
-
}
|
|
38
|
+
...(shouldAttachBody ? { bodyBinaryName } : {}),
|
|
39
|
+
};
|
|
40
40
|
|
|
41
41
|
let outputItem: Item = {
|
|
42
|
-
|
|
43
|
-
json: responseJson,
|
|
42
|
+
json: outputJson,
|
|
44
43
|
};
|
|
45
44
|
if (!shouldAttachBody) {
|
|
46
45
|
return outputItem;
|
|
@@ -100,25 +99,6 @@ export class HttpRequestNode implements Node<HttpRequest<any, any>> {
|
|
|
100
99
|
return mimeType.startsWith("image/") || mimeType.startsWith("audio/") || mimeType.startsWith("video/");
|
|
101
100
|
}
|
|
102
101
|
|
|
103
|
-
private createResponseJson(
|
|
104
|
-
inputJson: unknown,
|
|
105
|
-
responseJson: Readonly<{
|
|
106
|
-
url: string;
|
|
107
|
-
method: string;
|
|
108
|
-
ok: boolean;
|
|
109
|
-
status: number;
|
|
110
|
-
statusText: string;
|
|
111
|
-
mimeType: string;
|
|
112
|
-
headers: Readonly<Record<string, string>>;
|
|
113
|
-
bodyBinaryName?: string;
|
|
114
|
-
}>,
|
|
115
|
-
): Readonly<Record<string, unknown>> {
|
|
116
|
-
return {
|
|
117
|
-
...this.asRecord(inputJson),
|
|
118
|
-
http: responseJson,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
102
|
private resolveFilename(url: string, headers: Readonly<Record<string, string>>): string | undefined {
|
|
123
103
|
const contentDisposition = headers["content-disposition"];
|
|
124
104
|
const fromDisposition = this.readFilenameFromContentDisposition(contentDisposition);
|
package/src/nodes/httpRequest.ts
CHANGED
|
@@ -4,22 +4,21 @@ import { HttpRequestNode } from "./HttpRequestNodeFactory";
|
|
|
4
4
|
|
|
5
5
|
export type HttpRequestDownloadMode = "auto" | "always" | "never";
|
|
6
6
|
|
|
7
|
+
/** JSON emitted by {@link HttpRequest} — response metadata only (input item fields are not passed through). */
|
|
7
8
|
export type HttpRequestOutputJson = Readonly<{
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
bodyBinaryName?: string;
|
|
17
|
-
}>;
|
|
9
|
+
url: string;
|
|
10
|
+
method: string;
|
|
11
|
+
ok: boolean;
|
|
12
|
+
status: number;
|
|
13
|
+
statusText: string;
|
|
14
|
+
mimeType: string;
|
|
15
|
+
headers: Readonly<Record<string, string>>;
|
|
16
|
+
bodyBinaryName?: string;
|
|
18
17
|
}>;
|
|
19
18
|
|
|
20
19
|
export class HttpRequest<
|
|
21
20
|
TInputJson = Readonly<{ url?: string }>,
|
|
22
|
-
TOutputJson =
|
|
21
|
+
TOutputJson = HttpRequestOutputJson,
|
|
23
22
|
> implements RunnableNodeConfig<TInputJson, TOutputJson> {
|
|
24
23
|
readonly kind = "node" as const;
|
|
25
24
|
readonly type: TypeToken<unknown> = HttpRequestNode;
|