@codemation/core-nodes 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/dist/index.cjs +180 -413
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +99 -1303
- package/dist/index.d.ts +99 -1303
- package/dist/index.js +181 -415
- package/dist/index.js.map +1 -1
- package/dist/metadata.json +1 -1
- package/package.json +2 -2
- package/src/authoring/defineRestNode.types.ts +0 -84
- package/src/canvasIconName.ts +0 -7
- package/src/chatModels/CodemationChatModelConfig.ts +0 -10
- package/src/chatModels/CodemationChatModelFactory.ts +0 -7
- package/src/chatModels/ManagedHmacSignerFactory.types.ts +0 -35
- package/src/chatModels/OpenAIChatModelFactory.ts +0 -2
- package/src/chatModels/OpenAiChatModelPresetsFactory.ts +0 -5
- package/src/chatModels/OpenAiCredentialSession.ts +0 -1
- package/src/chatModels/OpenAiStrictJsonSchemaFactory.ts +0 -21
- package/src/credentials/ApiKeyCredentialType.ts +0 -3
- package/src/credentials/BasicAuthCredentialType.ts +0 -4
- package/src/credentials/BearerTokenCredentialType.ts +0 -4
- package/src/credentials/OAuth2ClientCredentialsTypeFactory.ts +0 -19
- package/src/credentials/OAuth2TokenExchangeFactory.ts +0 -7
- package/src/http/HttpBodyBuilder.ts +0 -16
- package/src/http/HttpRequestExecutor.ts +0 -35
- package/src/http/HttpUrlBuilder.ts +0 -4
- package/src/http/SSRFBlockedError.ts +0 -4
- package/src/http/SsrfGuard.ts +10 -50
- package/src/http/httpRequest.types.ts +0 -49
- package/src/index.ts +1 -0
- package/src/nodes/AIAgentConfig.ts +3 -39
- package/src/nodes/AIAgentExecutionHelpersFactory.ts +0 -37
- package/src/nodes/AIAgentNode.ts +4 -134
- package/src/nodes/AgentBinaryContentFactory.ts +0 -12
- package/src/nodes/AgentLoopCheckpoint.types.ts +0 -13
- package/src/nodes/AgentMessageFactory.ts +17 -19
- package/src/nodes/AgentStructuredOutputRunner.ts +0 -17
- package/src/nodes/AgentToolExecutionCoordinator.ts +0 -12
- package/src/nodes/AgentToolResultContentFactory.ts +126 -0
- package/src/nodes/AssertionNode.ts +0 -14
- package/src/nodes/BM25Index.ts +0 -14
- package/src/nodes/ConnectionCredentialExecutionContextFactory.ts +0 -5
- package/src/nodes/ConnectionCredentialNode.ts +0 -4
- package/src/nodes/CronTriggerFactory.ts +0 -9
- package/src/nodes/DeferredMetaToolStrategy.ts +0 -18
- package/src/nodes/DeferredMetaToolStrategyFactory.ts +0 -5
- package/src/nodes/HttpRequestNodeFactory.ts +0 -14
- package/src/nodes/InboxApprovalNode.types.ts +0 -16
- package/src/nodes/IsTestRunNode.ts +0 -8
- package/src/nodes/ManualTriggerFactory.ts +0 -3
- package/src/nodes/ManualTriggerNode.ts +0 -4
- package/src/nodes/MergeNode.ts +0 -1
- package/src/nodes/NodeBackedToolRuntime.ts +0 -14
- package/src/nodes/SubWorkflowNode.ts +0 -3
- package/src/nodes/SwitchNode.ts +0 -3
- package/src/nodes/TestTriggerNode.ts +0 -9
- package/src/nodes/aiAgentSupport.types.ts +0 -16
- package/src/nodes/assertion.ts +0 -10
- package/src/nodes/codemationDocumentScannerNode.ts +0 -18
- package/src/nodes/collections/collectionListNode.types.ts +0 -1
- package/src/nodes/httpRequest.ts +0 -68
- package/src/nodes/isTestRun.ts +0 -4
- package/src/nodes/mapData.ts +0 -1
- package/src/nodes/merge.ts +0 -4
- package/src/nodes/mergeExecutionUtils.types.ts +0 -3
- package/src/nodes/nodeOptions.types.ts +0 -8
- package/src/nodes/schedulePollingTrigger.ts +37 -0
- package/src/nodes/split.ts +0 -4
- package/src/nodes/testTrigger.ts +0 -21
- package/src/nodes/wait.ts +0 -1
- package/src/nodes/webhookTriggerNode.ts +0 -5
- package/src/register.types.ts +0 -10
- package/src/workflows/AIAgentConnectionWorkflowExpander.ts +0 -3
package/src/nodes/httpRequest.ts
CHANGED
|
@@ -18,7 +18,6 @@ import { HttpRequestNode } from "./HttpRequestNodeFactory";
|
|
|
18
18
|
|
|
19
19
|
export type HttpRequestDownloadMode = "auto" | "always" | "never";
|
|
20
20
|
|
|
21
|
-
/** JSON emitted by {@link HttpRequest} — response metadata only (input item fields are not passed through). */
|
|
22
21
|
export type HttpRequestOutputJson = Readonly<{
|
|
23
22
|
url: string;
|
|
24
23
|
method: string;
|
|
@@ -30,20 +29,12 @@ export type HttpRequestOutputJson = Readonly<{
|
|
|
30
29
|
json?: unknown;
|
|
31
30
|
text?: string;
|
|
32
31
|
bodyBinaryName?: string;
|
|
33
|
-
/** Set when `responseFormat === "binary"`. Name of the binary slot the response was stored in. */
|
|
34
32
|
binarySlot?: string;
|
|
35
|
-
/** Set when `responseFormat === "binary"`. MIME type of the stored response. */
|
|
36
33
|
contentType?: string;
|
|
37
|
-
/** Set when `responseFormat === "binary"`. Size in bytes of the stored response. */
|
|
38
34
|
size?: number;
|
|
39
|
-
/** Set when `responseFormat === "binary"`. Filename inferred from URL or Content-Disposition. */
|
|
40
35
|
filename?: string;
|
|
41
36
|
}>;
|
|
42
37
|
|
|
43
|
-
/**
|
|
44
|
-
* The built-in HTTP request credential type IDs accepted by the `HttpRequest` node.
|
|
45
|
-
* These match the four generic credential types shipped with `@codemation/core-nodes`.
|
|
46
|
-
*/
|
|
47
38
|
export const HTTP_REQUEST_ACCEPTED_CREDENTIAL_TYPES: ReadonlyArray<string> = [
|
|
48
39
|
bearerTokenCredentialType.definition.typeId,
|
|
49
40
|
apiKeyCredentialType.definition.typeId,
|
|
@@ -51,7 +42,6 @@ export const HTTP_REQUEST_ACCEPTED_CREDENTIAL_TYPES: ReadonlyArray<string> = [
|
|
|
51
42
|
oauth2ClientCredentialsType.definition.typeId,
|
|
52
43
|
] as const;
|
|
53
44
|
|
|
54
|
-
/** Default maximum response size for binary mode: 100 MiB. */
|
|
55
45
|
const DEFAULT_RESPONSE_SIZE_CAP_BYTES = 100 * 1024 * 1024;
|
|
56
46
|
|
|
57
47
|
export class HttpRequest<
|
|
@@ -67,77 +57,20 @@ export class HttpRequest<
|
|
|
67
57
|
constructor(
|
|
68
58
|
public readonly name: string,
|
|
69
59
|
public readonly args: Readonly<{
|
|
70
|
-
/** HTTP method (default: GET). */
|
|
71
60
|
method?: string;
|
|
72
|
-
/**
|
|
73
|
-
* Legacy: field name on item.json to read the URL from.
|
|
74
|
-
* Use `url` for a literal/templated URL instead.
|
|
75
|
-
*/
|
|
76
61
|
urlField?: string;
|
|
77
|
-
/** Literal or templated URL. When present, takes precedence over `urlField`. */
|
|
78
62
|
url?: string;
|
|
79
|
-
/** Extra headers to add to every request. */
|
|
80
63
|
headers?: Readonly<Record<string, string>>;
|
|
81
|
-
/** Query parameters to append to the URL. */
|
|
82
64
|
query?: Readonly<Record<string, string>>;
|
|
83
|
-
/** Request body specification. For `kind:"json"`, pass the object directly in `body.data` — it is JSON-encoded exactly once, so never a pre-stringified string. */
|
|
84
65
|
body?: HttpBodySpec;
|
|
85
|
-
/**
|
|
86
|
-
* Credential slot.
|
|
87
|
-
*
|
|
88
|
-
* **String shorthand** (existing): `credentialSlot: "auth"` — the slot accepts all four
|
|
89
|
-
* default HTTP credential types (bearer, API-key, basic, OAuth2).
|
|
90
|
-
*
|
|
91
|
-
* **Object form** (new): narrows the accepted types to the caller-supplied list, useful
|
|
92
|
-
* when only a subset of credential types makes sense for a specific endpoint.
|
|
93
|
-
* ```ts
|
|
94
|
-
* credentialSlot: { name: "auth", acceptedTypes: [bearerTokenCredentialType] }
|
|
95
|
-
* ```
|
|
96
|
-
* The slot must be declared in `getCredentialRequirements()`, which is wired automatically.
|
|
97
|
-
*/
|
|
98
66
|
credentialSlot?: string | Readonly<{ name: string; acceptedTypes?: ReadonlyArray<AnyCredentialType> }>;
|
|
99
67
|
binaryName?: string;
|
|
100
68
|
downloadMode?: HttpRequestDownloadMode;
|
|
101
|
-
/**
|
|
102
|
-
* Controls how the response body is handled.
|
|
103
|
-
* - `"json"` / `"text"`: existing behaviour (parse + emit on `item.json`).
|
|
104
|
-
* - `"binary"`: read the response as raw bytes and store via `ctx.binary.attach`.
|
|
105
|
-
* The output JSON contains `{ status, headers, binarySlot, contentType, size, filename }`
|
|
106
|
-
* but NOT the raw bytes. Use `responseBinarySlot` to name the slot (default `"response"`).
|
|
107
|
-
*
|
|
108
|
-
* When omitted, the existing `downloadMode` logic applies (backward-compatible).
|
|
109
|
-
*/
|
|
110
69
|
responseFormat?: "json" | "text" | "binary";
|
|
111
|
-
/**
|
|
112
|
-
* Name of the binary slot to write the response body into when `responseFormat === "binary"`.
|
|
113
|
-
* Defaults to `"response"`.
|
|
114
|
-
*/
|
|
115
70
|
responseBinarySlot?: string;
|
|
116
|
-
/**
|
|
117
|
-
* Maximum response size in bytes for binary mode. Checked against the `Content-Length`
|
|
118
|
-
* response header before allocating memory. Defaults to 100 MiB (104857600).
|
|
119
|
-
* Requests whose `Content-Length` exceeds this cap are rejected before the body is read.
|
|
120
|
-
*/
|
|
121
71
|
responseSizeCapBytes?: number;
|
|
122
|
-
/**
|
|
123
|
-
* Operator-configurable outbound host allowlist.
|
|
124
|
-
*
|
|
125
|
-
* When set, every HTTP request target must match an entry in this list before the
|
|
126
|
-
* request is made — requests to any other host are rejected with {@link SSRFBlockedError}.
|
|
127
|
-
* Supports exact hostnames (`api.example.com`) and wildcard subdomain patterns
|
|
128
|
-
* (`*.example.com` matches `sub.example.com` but not `example.com` itself).
|
|
129
|
-
*
|
|
130
|
-
* When unset (default), the existing SSRF private-network guard applies:
|
|
131
|
-
* public hosts are allowed and private/loopback ranges are blocked.
|
|
132
|
-
*
|
|
133
|
-
* **Production warning**: when `NODE_ENV === "production"` and this is unset, a one-time
|
|
134
|
-
* warning is logged at workflow startup.
|
|
135
|
-
*
|
|
136
|
-
* Setting this to an empty array `[]` is equivalent to "block everything".
|
|
137
|
-
*/
|
|
138
72
|
allowedOutboundHosts?: ReadonlyArray<string>;
|
|
139
73
|
id?: string;
|
|
140
|
-
/** Plain-language explanation surfaced in the node sidebar. */
|
|
141
74
|
description?: string;
|
|
142
75
|
}> = {},
|
|
143
76
|
public readonly retryPolicy: RetryPolicySpec = RetryPolicy.defaultForHttp,
|
|
@@ -197,7 +130,6 @@ export class HttpRequest<
|
|
|
197
130
|
},
|
|
198
131
|
];
|
|
199
132
|
}
|
|
200
|
-
// Object form: use caller-supplied acceptedTypes (mapped to typeIds), falling back to all defaults.
|
|
201
133
|
const acceptedTypes =
|
|
202
134
|
slot.acceptedTypes && slot.acceptedTypes.length > 0
|
|
203
135
|
? slot.acceptedTypes.map((ct) => ct.definition.typeId)
|
package/src/nodes/isTestRun.ts
CHANGED
|
@@ -3,10 +3,6 @@ import type { RunnableNodeConfig, TypeToken } from "@codemation/core";
|
|
|
3
3
|
import { IsTestRunNode } from "./IsTestRunNode";
|
|
4
4
|
import type { NodeBaseOptions } from "./nodeOptions.types";
|
|
5
5
|
|
|
6
|
-
/**
|
|
7
|
-
* Branches per-item on whether the current run is a test run. Output ports: `true`, `false`.
|
|
8
|
-
* The wire payload is unchanged — this is a router, not a transform.
|
|
9
|
-
*/
|
|
10
6
|
export class IsTestRun<TInputJson = unknown> implements RunnableNodeConfig<TInputJson, TInputJson> {
|
|
11
7
|
readonly kind = "node" as const;
|
|
12
8
|
readonly type: TypeToken<unknown> = IsTestRunNode;
|
package/src/nodes/mapData.ts
CHANGED
|
@@ -19,7 +19,6 @@ export class MapData<TInputJson = unknown, TOutputJson = unknown> implements Run
|
|
|
19
19
|
readonly kind = "node" as const;
|
|
20
20
|
readonly type: TypeToken<unknown> = MapDataNode;
|
|
21
21
|
readonly execution = { hint: "local" } as const;
|
|
22
|
-
/** Zero mapped items should still allow downstream nodes to run. */
|
|
23
22
|
readonly continueWhenEmptyOutput = true as const;
|
|
24
23
|
readonly icon = "lucide:square-pen" as const;
|
|
25
24
|
readonly keepBinaries: boolean;
|
package/src/nodes/merge.ts
CHANGED
|
@@ -18,10 +18,6 @@ export class Merge<TInputJson = unknown, TOutputJson = TInputJson> implements Ru
|
|
|
18
18
|
public readonly name: string,
|
|
19
19
|
public readonly cfg: Readonly<{
|
|
20
20
|
mode: MergeMode;
|
|
21
|
-
/**
|
|
22
|
-
* Deterministic input precedence order (only used for passThrough/append).
|
|
23
|
-
* Any inputs not listed are appended in lexicographic order.
|
|
24
|
-
*/
|
|
25
21
|
prefer?: ReadonlyArray<InputPortKey>;
|
|
26
22
|
}> = { mode: "passThrough" },
|
|
27
23
|
idOrOptions?: string | NodeBaseOptions,
|
|
@@ -5,9 +5,6 @@ export function getOriginIndex(item: Item): number | undefined {
|
|
|
5
5
|
return getOriginIndexFromItem(item);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Tags items routed to fan-in merge-by-origin (same contract as {@link IfNode} / {@link SwitchNode}).
|
|
10
|
-
*/
|
|
11
8
|
export function tagItemForRouterFanIn<TJson>(
|
|
12
9
|
args: Readonly<{
|
|
13
10
|
item: Item<TJson>;
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Options shared by every authorable built-in node: a stable `id` and a plain-language
|
|
3
|
-
* `description` (the non-technical "what does this node do" line surfaced in the node sidebar).
|
|
4
|
-
*
|
|
5
|
-
* `description` is a first-class config option — passed inline in the node's options, exactly like
|
|
6
|
-
* `id` — and is threaded onto the config instance so it flows into the persisted workflow snapshot
|
|
7
|
-
* the host / canvas mappers read. Node-specific option types extend this.
|
|
8
|
-
*/
|
|
9
1
|
export interface NodeBaseOptions {
|
|
10
2
|
readonly id?: string;
|
|
11
3
|
readonly description?: string;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { definePollingTrigger } from "@codemation/core";
|
|
2
|
+
|
|
3
|
+
type ScheduleItem = {
|
|
4
|
+
firedAt: string;
|
|
5
|
+
tick: number;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
type ScheduleState = {
|
|
9
|
+
tick: number;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const schedulePollingTrigger = definePollingTrigger({
|
|
13
|
+
key: "schedule.interval",
|
|
14
|
+
packageName: "@codemation/core-nodes",
|
|
15
|
+
title: "Run on schedule",
|
|
16
|
+
description: "Emit one tick item on every poll cycle.",
|
|
17
|
+
icon: "lucide:clock",
|
|
18
|
+
pollIntervalMs: 60_000,
|
|
19
|
+
initialState(): ScheduleState {
|
|
20
|
+
return { tick: 0 };
|
|
21
|
+
},
|
|
22
|
+
poll({ state }) {
|
|
23
|
+
const currentState = (state ?? { tick: 0 }) as ScheduleState;
|
|
24
|
+
const tick = currentState.tick + 1;
|
|
25
|
+
const item: { json: ScheduleItem } = { json: { firedAt: new Date().toISOString(), tick } };
|
|
26
|
+
return {
|
|
27
|
+
items: [item],
|
|
28
|
+
nextState: { tick },
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
execute(items) {
|
|
32
|
+
return { main: items };
|
|
33
|
+
},
|
|
34
|
+
testItems() {
|
|
35
|
+
return [{ json: { firedAt: new Date().toISOString(), tick: 0 } }];
|
|
36
|
+
},
|
|
37
|
+
});
|
package/src/nodes/split.ts
CHANGED
|
@@ -13,10 +13,6 @@ export class Split<TIn = unknown, TElem = unknown> implements RunnableNodeConfig
|
|
|
13
13
|
readonly type: TypeToken<unknown> = SplitNode;
|
|
14
14
|
readonly execution = { hint: "local" } as const;
|
|
15
15
|
readonly keepBinaries = true as const;
|
|
16
|
-
/**
|
|
17
|
-
* When splitting yields zero items for a batch, downstream single-input nodes still run once with an empty batch.
|
|
18
|
-
* Mirrors {@link MapData}'s empty-output behavior.
|
|
19
|
-
*/
|
|
20
16
|
readonly continueWhenEmptyOutput = true as const;
|
|
21
17
|
readonly icon = "builtin:split-rows" as const;
|
|
22
18
|
readonly id?: string;
|
package/src/nodes/testTrigger.ts
CHANGED
|
@@ -13,34 +13,13 @@ export interface TestTriggerOptions<TOutputJson> {
|
|
|
13
13
|
readonly name?: string;
|
|
14
14
|
readonly id?: string;
|
|
15
15
|
readonly icon?: string;
|
|
16
|
-
/** Cap on simultaneous in-flight test cases for one suite run. Default: 4 (orchestrator). */
|
|
17
16
|
readonly concurrency?: number;
|
|
18
17
|
readonly credentialRequirements?: ReadonlyArray<CredentialRequirement>;
|
|
19
|
-
/**
|
|
20
|
-
* Free-form description of where the test cases come from. Shown in the node properties
|
|
21
|
-
* panel and the Tests-tab suite-detail header so authors revisiting the workflow six months
|
|
22
|
-
* later remember which mailbox / folder / fixture file the cases originate from.
|
|
23
|
-
*/
|
|
24
18
|
readonly description?: string;
|
|
25
|
-
/**
|
|
26
|
-
* Author callback that yields one item per test case. Items are dispatched as separate
|
|
27
|
-
* workflow runs by the TestSuiteOrchestrator, with `executionOptions.testContext` set.
|
|
28
|
-
* The provided context exposes credential resolution and an AbortSignal for cancellation.
|
|
29
|
-
*/
|
|
30
19
|
generateItems(ctx: TestTriggerSetupContext<TestTrigger<TOutputJson>>): AsyncIterable<Item<TOutputJson>>;
|
|
31
|
-
/**
|
|
32
|
-
* Optional resolver: extract a human-readable label from a yielded item. The orchestrator
|
|
33
|
-
* persists this on the run, so the Tests-tab tree-table shows e.g. "RFQ for batch 14"
|
|
34
|
-
* instead of an opaque runId. Typical use: `(item) => item.json.subject` for mailbox tests.
|
|
35
|
-
*/
|
|
36
20
|
caseLabel?(item: Item<TOutputJson>): string | undefined;
|
|
37
21
|
}
|
|
38
22
|
|
|
39
|
-
/**
|
|
40
|
-
* Trigger config for a test fixture source. Drop one (or more) of these on the canvas alongside
|
|
41
|
-
* a workflow's live triggers; clicking "Run tests" on the Tests tab invokes
|
|
42
|
-
* {@link TestTriggerOptions.generateItems} via the TestSuiteOrchestrator.
|
|
43
|
-
*/
|
|
44
23
|
export class TestTrigger<TOutputJson = unknown> implements TestTriggerNodeConfig<TOutputJson> {
|
|
45
24
|
readonly kind = "trigger" as const;
|
|
46
25
|
readonly triggerKind = "test" as const;
|
package/src/nodes/wait.ts
CHANGED
|
@@ -7,7 +7,6 @@ export class Wait<TItemJson = unknown> implements RunnableNodeConfig<TItemJson,
|
|
|
7
7
|
readonly kind = "node" as const;
|
|
8
8
|
readonly type: TypeToken<unknown> = WaitNode;
|
|
9
9
|
readonly execution = { hint: "local" } as const;
|
|
10
|
-
/** Pass-through empty batches should still advance to downstream nodes. */
|
|
11
10
|
readonly continueWhenEmptyOutput = true as const;
|
|
12
11
|
readonly icon = "lucide:hourglass" as const;
|
|
13
12
|
readonly id?: string;
|
|
@@ -8,11 +8,6 @@ import type {
|
|
|
8
8
|
import { node } from "@codemation/core";
|
|
9
9
|
import { WebhookTrigger } from "./WebhookTriggerFactory";
|
|
10
10
|
|
|
11
|
-
/**
|
|
12
|
-
* HTTP webhooks are not registered in trigger setup. The host exposes a single catch-all route
|
|
13
|
-
* (e.g. `/api/webhooks/:endpointPath`); the engine's catalog-backed webhook matcher resolves the
|
|
14
|
-
* user-defined endpoint path to this workflow + node, then runs the workflow from this trigger.
|
|
15
|
-
*/
|
|
16
11
|
@node({ packageName: "@codemation/core-nodes" })
|
|
17
12
|
export class WebhookTriggerNode implements ExecutableTriggerNode<WebhookTrigger<any>> {
|
|
18
13
|
readonly kind = "trigger" as const;
|
package/src/register.types.ts
CHANGED
|
@@ -14,19 +14,9 @@ import { FilterNode } from "./nodes/filter";
|
|
|
14
14
|
import { SplitNode } from "./nodes/split";
|
|
15
15
|
import { SwitchNode } from "./nodes/switch";
|
|
16
16
|
|
|
17
|
-
/**
|
|
18
|
-
* Registrar for built-in nodes. In a real project, this would use tsyringe's
|
|
19
|
-
* container.registerSingleton(...). For the skeleton we keep it token-based:
|
|
20
|
-
* the engine resolves node implementations by class token.
|
|
21
|
-
*/
|
|
22
17
|
export function registerCoreNodes(container: Container): void {
|
|
23
|
-
// With class tokens, resolving registers happen via the DI container setup.
|
|
24
|
-
// This function exists as the standardized extension point.
|
|
25
18
|
void container;
|
|
26
19
|
|
|
27
|
-
// Example: if using tsyringe, you'd do:
|
|
28
|
-
// tsyringeContainer.registerSingleton(IfNode, IfNode);
|
|
29
|
-
// ...
|
|
30
20
|
void IfNode;
|
|
31
21
|
void HttpRequestNode;
|
|
32
22
|
void CallbackNode;
|
|
@@ -5,9 +5,6 @@ import { AIAgentNode } from "../nodes/AIAgentNode";
|
|
|
5
5
|
import { ConnectionCredentialNode } from "../nodes/ConnectionCredentialNode";
|
|
6
6
|
import { ConnectionCredentialNodeConfigFactory } from "../nodes/ConnectionCredentialNodeConfigFactory";
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Materializes connection-owned child nodes and {@link WorkflowDefinition.connections} for AI agent nodes.
|
|
10
|
-
*/
|
|
11
8
|
export class AIAgentConnectionWorkflowExpander {
|
|
12
9
|
constructor(
|
|
13
10
|
private readonly connectionCredentialNodeConfigFactory: ConnectionCredentialNodeConfigFactory,
|