@codemation/core 0.4.0 → 0.6.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 +41 -0
- package/dist/{EngineRuntimeRegistration.types-DU6MsjU9.d.ts → EngineRuntimeRegistration.types-Dm129RJ6.d.ts} +2 -2
- package/dist/{EngineWorkflowRunnerService-BBkL4VQF.d.cts → EngineWorkflowRunnerService-Bf88QtwB.d.cts} +2 -2
- package/dist/{InMemoryRunDataFactory-CsYEMJK2.d.cts → InMemoryRunDataFactory-Dyl4p2s8.d.cts} +12 -3
- package/dist/{RunIntentService-BvlTpmEb.d.cts → RunIntentService-B1Y3v1H6.d.cts} +33 -10
- package/dist/{RunIntentService-zbTchO9T.d.ts → RunIntentService-BDiodxhf.d.ts} +33 -10
- package/dist/bootstrap/index.cjs +2 -2
- package/dist/bootstrap/index.d.cts +5 -5
- package/dist/bootstrap/index.d.ts +3 -3
- package/dist/bootstrap/index.js +2 -2
- package/dist/{bootstrap-DHH2uo-W.cjs → bootstrap-DVL2ue5v.cjs} +4 -3
- package/dist/bootstrap-DVL2ue5v.cjs.map +1 -0
- package/dist/{bootstrap-DbUlOl11.js → bootstrap-DdeiJ8cd.js} +4 -3
- package/dist/bootstrap-DdeiJ8cd.js.map +1 -0
- package/dist/{index-CUt13qs1.d.ts → index-C2af8ssM.d.ts} +85 -7
- package/dist/index.cjs +79 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +74 -5
- package/dist/index.d.ts +3 -3
- package/dist/index.js +75 -2
- package/dist/index.js.map +1 -1
- package/dist/{runtime-BdH94eBR.js → runtime-7Xh9z3dw.js} +36 -34
- package/dist/runtime-7Xh9z3dw.js.map +1 -0
- package/dist/{runtime-feFn8OmG.cjs → runtime-DVBwxFvX.cjs} +41 -33
- package/dist/runtime-DVBwxFvX.cjs.map +1 -0
- package/dist/testing.cjs +2 -2
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/testing.js +2 -2
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
- package/src/ai/AiHost.ts +20 -0
- package/src/ai/CallableToolConfig.ts +84 -0
- package/src/ai/CallableToolFactory.ts +13 -0
- package/src/ai/CallableToolKindToken.ts +5 -0
- package/src/authoring/callableTool.types.ts +12 -0
- package/src/authoring/defineNode.types.ts +3 -0
- package/src/authoring/index.ts +1 -0
- package/src/bootstrap/runtime/EngineRuntimeRegistrar.ts +9 -1
- package/src/contracts/credentialTypes.ts +29 -0
- package/src/contracts/runtimeTypes.ts +4 -2
- package/src/contracts/workflowTypes.ts +0 -7
- package/src/execution/NodeExecutor.ts +7 -25
- package/src/execution/NodeExecutorFactory.ts +7 -2
- package/src/execution/NodeOutputNormalizer.ts +22 -23
- package/src/execution/RunnableOutputBehaviorResolver.ts +23 -0
- package/src/execution/index.ts +1 -0
- package/src/index.ts +1 -0
- package/src/testing/SwitchHarnessNode.ts +0 -1
- package/dist/bootstrap-DHH2uo-W.cjs.map +0 -1
- package/dist/bootstrap-DbUlOl11.js.map +0 -1
- package/dist/runtime-BdH94eBR.js.map +0 -1
- package/dist/runtime-feFn8OmG.cjs.map +0 -1
|
@@ -13,6 +13,12 @@ export type CredentialFieldSchema = Readonly<{
|
|
|
13
13
|
type: "string" | "password" | "textarea" | "json" | "boolean";
|
|
14
14
|
required?: true;
|
|
15
15
|
order?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Where this field appears in the credential dialog. Use `"advanced"` for optional or
|
|
18
|
+
* power-user fields; they render inside a collapsible section (see `CredentialTypeDefinition.advancedSection`).
|
|
19
|
+
* Defaults to `"default"` when omitted.
|
|
20
|
+
*/
|
|
21
|
+
visibility?: "default" | "advanced";
|
|
16
22
|
placeholder?: string;
|
|
17
23
|
helpText?: string;
|
|
18
24
|
/** When set, host resolves this field from process.env at runtime; env wins over stored values. */
|
|
@@ -61,11 +67,19 @@ export type OAuth2ProviderFromPublicConfig = Readonly<{
|
|
|
61
67
|
userInfoUrlFieldKey?: string;
|
|
62
68
|
}>;
|
|
63
69
|
|
|
70
|
+
export type CredentialOAuth2ScopesFromPublicConfig = Readonly<{
|
|
71
|
+
presetFieldKey: string;
|
|
72
|
+
presetScopes: Readonly<Record<string, ReadonlyArray<string>>>;
|
|
73
|
+
customPresetKey?: string;
|
|
74
|
+
customScopesFieldKey?: string;
|
|
75
|
+
}>;
|
|
76
|
+
|
|
64
77
|
export type CredentialOAuth2AuthDefinition = Readonly<
|
|
65
78
|
| {
|
|
66
79
|
kind: "oauth2";
|
|
67
80
|
providerId: string;
|
|
68
81
|
scopes: ReadonlyArray<string>;
|
|
82
|
+
scopesFromPublicConfig?: CredentialOAuth2ScopesFromPublicConfig;
|
|
69
83
|
clientIdFieldKey?: string;
|
|
70
84
|
clientSecretFieldKey?: string;
|
|
71
85
|
}
|
|
@@ -73,6 +87,7 @@ export type CredentialOAuth2AuthDefinition = Readonly<
|
|
|
73
87
|
kind: "oauth2";
|
|
74
88
|
providerFromPublicConfig: OAuth2ProviderFromPublicConfig;
|
|
75
89
|
scopes: ReadonlyArray<string>;
|
|
90
|
+
scopesFromPublicConfig?: CredentialOAuth2ScopesFromPublicConfig;
|
|
76
91
|
clientIdFieldKey?: string;
|
|
77
92
|
clientSecretFieldKey?: string;
|
|
78
93
|
}
|
|
@@ -80,12 +95,26 @@ export type CredentialOAuth2AuthDefinition = Readonly<
|
|
|
80
95
|
|
|
81
96
|
export type CredentialAuthDefinition = CredentialOAuth2AuthDefinition;
|
|
82
97
|
|
|
98
|
+
export type CredentialAdvancedSectionPresentation = Readonly<{
|
|
99
|
+
/** Collapsible section title (default: "Advanced"). */
|
|
100
|
+
title?: string;
|
|
101
|
+
/** Optional short helper text shown inside the section (above the fields). */
|
|
102
|
+
description?: string;
|
|
103
|
+
/** When true, the advanced section starts expanded. Default: false (collapsed). */
|
|
104
|
+
defaultOpen?: boolean;
|
|
105
|
+
}>;
|
|
106
|
+
|
|
83
107
|
export type CredentialTypeDefinition = Readonly<{
|
|
84
108
|
typeId: CredentialTypeId;
|
|
85
109
|
displayName: string;
|
|
86
110
|
description?: string;
|
|
87
111
|
publicFields?: ReadonlyArray<CredentialFieldSchema>;
|
|
88
112
|
secretFields?: ReadonlyArray<CredentialFieldSchema>;
|
|
113
|
+
/**
|
|
114
|
+
* Optional labels for the collapsible block that contains every field with `visibility: "advanced"`.
|
|
115
|
+
* If omitted, the UI still shows that block with defaults (title "Advanced", collapsed).
|
|
116
|
+
*/
|
|
117
|
+
advancedSection?: CredentialAdvancedSectionPresentation;
|
|
89
118
|
supportedSourceKinds?: ReadonlyArray<CredentialMaterialSourceKind>;
|
|
90
119
|
auth?: CredentialAuthDefinition;
|
|
91
120
|
}>;
|
|
@@ -223,8 +223,10 @@ export interface EngineHost {
|
|
|
223
223
|
}
|
|
224
224
|
|
|
225
225
|
/**
|
|
226
|
-
* Per-item runnable node: return JSON, an array to fan-out on `main`, or {@link emitPorts}
|
|
227
|
-
* Engine applies `inputSchema.parse(item.json)` and passes the result as `args.input`
|
|
226
|
+
* Per-item runnable node: return JSON, an array to fan-out on `main`, an explicit `Item`, or {@link emitPorts}
|
|
227
|
+
* for multi-port emission. Engine applies `inputSchema.parse(item.json)` and passes the result as `args.input`
|
|
228
|
+
* (wire `item.json` is unchanged). Transform helpers may opt into binary preservation, while routers and
|
|
229
|
+
* pass-through nodes should return explicit items when they need to preserve full item state.
|
|
228
230
|
*/
|
|
229
231
|
export interface RunnableNodeExecuteArgs<
|
|
230
232
|
TConfig extends RunnableNodeConfig<any, any> = RunnableNodeConfig<any, any>,
|
|
@@ -96,8 +96,6 @@ export declare const runnableNodeInputType: unique symbol;
|
|
|
96
96
|
export declare const runnableNodeOutputType: unique symbol;
|
|
97
97
|
export declare const triggerNodeOutputType: unique symbol;
|
|
98
98
|
|
|
99
|
-
export type LineageCarryPolicy = "emitOnly" | "carryThrough";
|
|
100
|
-
|
|
101
99
|
/**
|
|
102
100
|
* Runnable node: **`TInputJson`** is what **`inputSchema`** validates on **`item.json`** (the wire payload).
|
|
103
101
|
* **`TOutputJson`** is emitted `item.json` on outputs.
|
|
@@ -111,11 +109,6 @@ export interface RunnableNodeConfig<TInputJson = unknown, TOutputJson = unknown>
|
|
|
111
109
|
* Resolution order: node instance `inputSchema`, then config `inputSchema`, then `z.unknown()`.
|
|
112
110
|
*/
|
|
113
111
|
readonly inputSchema?: ZodType<TInputJson>;
|
|
114
|
-
/**
|
|
115
|
-
* Overrides default lineage propagation for `execute` outputs (binary/meta/paired).
|
|
116
|
-
* Routers with multiple {@link RunnableNode#outputPorts} default to **`carryThrough`**; others default to **`emitOnly`**.
|
|
117
|
-
*/
|
|
118
|
-
readonly lineageCarry?: LineageCarryPolicy;
|
|
119
112
|
/**
|
|
120
113
|
* When an activation receives **zero** input items, the engine normally runs `execute` zero times.
|
|
121
114
|
* Set to **`runOnce`** to run `execute` once with an empty `items` batch (and a synthetic wire item for schema parsing).
|
|
@@ -3,10 +3,8 @@ import { isPortsEmission, isUnbrandedPortsEmissionShape } from "../contracts/emi
|
|
|
3
3
|
|
|
4
4
|
import type {
|
|
5
5
|
Item,
|
|
6
|
-
LineageCarryPolicy,
|
|
7
6
|
MultiInputNode,
|
|
8
7
|
NodeActivationRequest,
|
|
9
|
-
NodeConfigBase,
|
|
10
8
|
NodeExecutionContext,
|
|
11
9
|
NodeOutputs,
|
|
12
10
|
RunnableNode,
|
|
@@ -20,18 +18,22 @@ import { FanInMergeByOriginMerger } from "./FanInMergeByOriginMerger";
|
|
|
20
18
|
import { ItemValueResolver } from "./ItemValueResolver";
|
|
21
19
|
import { InProcessRetryRunner } from "./InProcessRetryRunner";
|
|
22
20
|
import { NodeOutputNormalizer } from "./NodeOutputNormalizer";
|
|
21
|
+
import { RunnableOutputBehaviorResolver } from "./RunnableOutputBehaviorResolver";
|
|
23
22
|
|
|
24
23
|
export class NodeExecutor {
|
|
25
24
|
private readonly fanInMerger = new FanInMergeByOriginMerger();
|
|
26
25
|
private readonly outputNormalizer = new NodeOutputNormalizer();
|
|
27
26
|
private readonly itemValueResolver: ItemValueResolver;
|
|
27
|
+
private readonly outputBehaviorResolver: RunnableOutputBehaviorResolver;
|
|
28
28
|
|
|
29
29
|
constructor(
|
|
30
30
|
private readonly nodeInstanceFactory: WorkflowNodeInstanceFactory,
|
|
31
31
|
private readonly retryRunner: InProcessRetryRunner,
|
|
32
32
|
itemValueResolver?: ItemValueResolver,
|
|
33
|
+
outputBehaviorResolver?: RunnableOutputBehaviorResolver,
|
|
33
34
|
) {
|
|
34
35
|
this.itemValueResolver = itemValueResolver ?? new ItemValueResolver();
|
|
36
|
+
this.outputBehaviorResolver = outputBehaviorResolver ?? new RunnableOutputBehaviorResolver();
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
async execute(request: NodeActivationRequest): Promise<NodeOutputs> {
|
|
@@ -126,7 +128,7 @@ export class NodeExecutor {
|
|
|
126
128
|
node: RunnableNode,
|
|
127
129
|
): Promise<NodeOutputs> {
|
|
128
130
|
const runnableConfig = request.ctx.config as RunnableNodeConfig;
|
|
129
|
-
const
|
|
131
|
+
const behavior = this.outputBehaviorResolver.resolve(runnableConfig);
|
|
130
132
|
const inputSchema = this.resolveInputSchema(node, runnableConfig);
|
|
131
133
|
const inputBatch = request.input ?? [];
|
|
132
134
|
if (inputBatch.length === 0 && runnableConfig.emptyBatchExecution === "runOnce") {
|
|
@@ -146,7 +148,7 @@ export class NodeExecutor {
|
|
|
146
148
|
return this.outputNormalizer.normalizeExecuteResult({
|
|
147
149
|
baseItem: syntheticItem,
|
|
148
150
|
raw,
|
|
149
|
-
|
|
151
|
+
behavior,
|
|
150
152
|
}) as NodeOutputs;
|
|
151
153
|
}
|
|
152
154
|
const byPort: Partial<Record<string, Item[]>> = {};
|
|
@@ -168,7 +170,7 @@ export class NodeExecutor {
|
|
|
168
170
|
const normalized = this.outputNormalizer.normalizeExecuteResult({
|
|
169
171
|
baseItem: item,
|
|
170
172
|
raw,
|
|
171
|
-
|
|
173
|
+
behavior,
|
|
172
174
|
});
|
|
173
175
|
for (const [port, batch] of Object.entries(normalized)) {
|
|
174
176
|
if (!batch || batch.length === 0) {
|
|
@@ -226,24 +228,4 @@ export class NodeExecutor {
|
|
|
226
228
|
);
|
|
227
229
|
}
|
|
228
230
|
}
|
|
229
|
-
|
|
230
|
-
private resolveLineageCarry(node: unknown, config: RunnableNodeConfig): LineageCarryPolicy {
|
|
231
|
-
if (config.lineageCarry) {
|
|
232
|
-
return config.lineageCarry;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const base = config as NodeConfigBase;
|
|
236
|
-
const declared = base.declaredOutputPorts;
|
|
237
|
-
const ports =
|
|
238
|
-
declared && declared.length > 0
|
|
239
|
-
? [...new Set([...(declared as readonly string[]), ...(base.nodeErrorHandler ? ["error"] : [])])]
|
|
240
|
-
: base.nodeErrorHandler
|
|
241
|
-
? (["main", "error"] as const)
|
|
242
|
-
: (["main"] as const);
|
|
243
|
-
|
|
244
|
-
if (ports.length > 1) {
|
|
245
|
-
return "carryThrough";
|
|
246
|
-
}
|
|
247
|
-
return "emitOnly";
|
|
248
|
-
}
|
|
249
231
|
}
|
|
@@ -2,9 +2,14 @@ import type { WorkflowNodeInstanceFactory } from "../types";
|
|
|
2
2
|
|
|
3
3
|
import { InProcessRetryRunner } from "./InProcessRetryRunner";
|
|
4
4
|
import { NodeExecutor } from "./NodeExecutor";
|
|
5
|
+
import { RunnableOutputBehaviorResolver } from "./RunnableOutputBehaviorResolver";
|
|
5
6
|
|
|
6
7
|
export class NodeExecutorFactory {
|
|
7
|
-
create(
|
|
8
|
-
|
|
8
|
+
create(
|
|
9
|
+
workflowNodeInstanceFactory: WorkflowNodeInstanceFactory,
|
|
10
|
+
retryRunner: InProcessRetryRunner,
|
|
11
|
+
outputBehaviorResolver: RunnableOutputBehaviorResolver,
|
|
12
|
+
): NodeExecutor {
|
|
13
|
+
return new NodeExecutor(workflowNodeInstanceFactory, retryRunner, undefined, outputBehaviorResolver);
|
|
9
14
|
}
|
|
10
15
|
}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { isPortsEmission, isUnbrandedPortsEmissionShape } from "../contracts/emitPorts";
|
|
2
2
|
import type { PortsEmission } from "../contracts/emitPorts";
|
|
3
|
-
import type { Item,
|
|
3
|
+
import type { Item, Items, JsonNonArray, NodeOutputs, OutputPortKey } from "../types";
|
|
4
|
+
import type { RunnableOutputBehavior } from "./RunnableOutputBehaviorResolver";
|
|
4
5
|
|
|
5
6
|
export class NodeOutputNormalizer {
|
|
6
7
|
normalizeExecuteResult(
|
|
7
8
|
args: Readonly<{
|
|
8
9
|
baseItem: Item;
|
|
9
10
|
raw: unknown;
|
|
10
|
-
|
|
11
|
+
behavior: RunnableOutputBehavior;
|
|
11
12
|
}>,
|
|
12
13
|
): NodeOutputs {
|
|
13
|
-
const { baseItem, raw,
|
|
14
|
+
const { baseItem, raw, behavior } = args;
|
|
14
15
|
if (isPortsEmission(raw)) {
|
|
15
|
-
return this.emitPortsToOutputs(baseItem, raw,
|
|
16
|
+
return this.emitPortsToOutputs(baseItem, raw, behavior);
|
|
16
17
|
}
|
|
17
18
|
if (isUnbrandedPortsEmissionShape(raw)) {
|
|
18
19
|
throw new Error(
|
|
@@ -20,17 +21,17 @@ export class NodeOutputNormalizer {
|
|
|
20
21
|
);
|
|
21
22
|
}
|
|
22
23
|
if (Array.isArray(raw)) {
|
|
23
|
-
return this.arrayFanOutToMain(baseItem, raw,
|
|
24
|
+
return this.arrayFanOutToMain(baseItem, raw, behavior);
|
|
24
25
|
}
|
|
25
26
|
if (this.isItemLike(raw)) {
|
|
26
|
-
return { main: [this.
|
|
27
|
+
return { main: [this.applyOutput(baseItem, raw, behavior)] };
|
|
27
28
|
}
|
|
28
29
|
return {
|
|
29
|
-
main: [this.
|
|
30
|
+
main: [this.applyOutput(baseItem, { json: raw as JsonNonArray }, behavior)],
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
private arrayFanOutToMain(baseItem: Item, raw: readonly unknown[],
|
|
34
|
+
private arrayFanOutToMain(baseItem: Item, raw: readonly unknown[], behavior: RunnableOutputBehavior): NodeOutputs {
|
|
34
35
|
for (const el of raw) {
|
|
35
36
|
if (Array.isArray(el)) {
|
|
36
37
|
throw new Error(
|
|
@@ -38,17 +39,17 @@ export class NodeOutputNormalizer {
|
|
|
38
39
|
);
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
|
-
const main: Item[] = raw.map((json) => this.
|
|
42
|
+
const main: Item[] = raw.map((json) => this.applyOutput(baseItem, { json: json as JsonNonArray }, behavior));
|
|
42
43
|
return { main };
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
private emitPortsToOutputs(baseItem: Item, emission: PortsEmission,
|
|
46
|
+
private emitPortsToOutputs(baseItem: Item, emission: PortsEmission, behavior: RunnableOutputBehavior): NodeOutputs {
|
|
46
47
|
const out: NodeOutputs = {};
|
|
47
48
|
for (const [port, payload] of Object.entries(emission.ports)) {
|
|
48
49
|
if (payload === undefined) {
|
|
49
50
|
continue;
|
|
50
51
|
}
|
|
51
|
-
out[port as OutputPortKey] = this.normalizePortPayload(baseItem, payload,
|
|
52
|
+
out[port as OutputPortKey] = this.normalizePortPayload(baseItem, payload, behavior);
|
|
52
53
|
}
|
|
53
54
|
return out;
|
|
54
55
|
}
|
|
@@ -56,33 +57,31 @@ export class NodeOutputNormalizer {
|
|
|
56
57
|
private normalizePortPayload(
|
|
57
58
|
baseItem: Item,
|
|
58
59
|
payload: Items | ReadonlyArray<JsonNonArray>,
|
|
59
|
-
|
|
60
|
+
behavior: RunnableOutputBehavior,
|
|
60
61
|
): Items {
|
|
61
62
|
if (payload.length === 0) {
|
|
62
63
|
return [];
|
|
63
64
|
}
|
|
64
65
|
const el0 = payload[0] as unknown;
|
|
65
66
|
if (this.isItemLike(el0)) {
|
|
66
|
-
return (payload as Items).map((it) => this.
|
|
67
|
+
return (payload as Items).map((it) => this.applyOutput(baseItem, it, behavior));
|
|
67
68
|
}
|
|
68
|
-
return (payload as readonly JsonNonArray[]).map((json) => this.
|
|
69
|
+
return (payload as readonly JsonNonArray[]).map((json) => this.applyOutput(baseItem, { json }, behavior));
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
private isItemLike(value: unknown): value is Item {
|
|
72
73
|
return typeof value === "object" && value !== null && "json" in value;
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
private
|
|
76
|
-
|
|
77
|
-
return {
|
|
78
|
-
...baseItem,
|
|
79
|
-
...next,
|
|
80
|
-
json: next.json,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
76
|
+
private applyOutput(baseItem: Item, next: Item, behavior: RunnableOutputBehavior): Item {
|
|
77
|
+
const explicitBinary = next.binary;
|
|
83
78
|
return {
|
|
84
79
|
json: next.json,
|
|
85
|
-
...(
|
|
80
|
+
...(explicitBinary !== undefined
|
|
81
|
+
? { binary: explicitBinary }
|
|
82
|
+
: behavior.keepBinaries && baseItem.binary
|
|
83
|
+
? { binary: baseItem.binary }
|
|
84
|
+
: {}),
|
|
86
85
|
...(next.meta ? { meta: next.meta } : {}),
|
|
87
86
|
...(next.paired ? { paired: next.paired } : {}),
|
|
88
87
|
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RunnableNodeConfig } from "../types";
|
|
2
|
+
|
|
3
|
+
type BinaryKeepingRunnableNodeConfig = RunnableNodeConfig &
|
|
4
|
+
Readonly<{
|
|
5
|
+
keepBinaries?: boolean;
|
|
6
|
+
}>;
|
|
7
|
+
|
|
8
|
+
export type RunnableOutputBehavior = Readonly<{
|
|
9
|
+
keepBinaries: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
|
|
12
|
+
export class RunnableOutputBehaviorResolver {
|
|
13
|
+
resolve(config: RunnableNodeConfig): RunnableOutputBehavior {
|
|
14
|
+
return {
|
|
15
|
+
keepBinaries: this.isKeepBinariesEnabled(config),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private isKeepBinariesEnabled(config: RunnableNodeConfig): boolean {
|
|
20
|
+
const candidate = config as BinaryKeepingRunnableNodeConfig;
|
|
21
|
+
return candidate.keepBinaries === true;
|
|
22
|
+
}
|
|
23
|
+
}
|
package/src/execution/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ export { DefaultExecutionContextFactory } from "./DefaultExecutionContextFactory
|
|
|
7
7
|
export { InProcessRetryRunner } from "./InProcessRetryRunner";
|
|
8
8
|
export { ItemValueResolver } from "./ItemValueResolver";
|
|
9
9
|
export { NodeOutputNormalizer } from "./NodeOutputNormalizer";
|
|
10
|
+
export { RunnableOutputBehaviorResolver } from "./RunnableOutputBehaviorResolver";
|
|
10
11
|
export { InProcessRetryRunnerFactory } from "./InProcessRetryRunnerFactory";
|
|
11
12
|
export { NodeActivationRequestComposer } from "./NodeActivationRequestComposer";
|
|
12
13
|
export { NodeExecutionSnapshotFactory } from "./NodeExecutionSnapshotFactory";
|
package/src/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ export {
|
|
|
20
20
|
InProcessRetryRunner,
|
|
21
21
|
ItemValueResolver,
|
|
22
22
|
NodeOutputNormalizer,
|
|
23
|
+
RunnableOutputBehaviorResolver,
|
|
23
24
|
} from "./execution";
|
|
24
25
|
export { EngineExecutionLimitsPolicy, type EngineExecutionLimitsPolicyConfig } from "./policies";
|
|
25
26
|
export { InMemoryBinaryStorage, InMemoryRunDataFactory } from "./runStorage";
|
|
@@ -28,7 +28,6 @@ export class SwitchHarnessNode implements RunnableNode<SwitchHarnessNodeConfig<a
|
|
|
28
28
|
export class SwitchHarnessNodeConfig<TInputJson = unknown> implements RunnableNodeConfig<TInputJson, TInputJson> {
|
|
29
29
|
readonly kind = "node" as const;
|
|
30
30
|
readonly type: TypeToken<unknown> = SwitchHarnessNode;
|
|
31
|
-
readonly lineageCarry = "carryThrough" as const;
|
|
32
31
|
readonly declaredOutputPorts: ReadonlyArray<string>;
|
|
33
32
|
|
|
34
33
|
constructor(
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-DHH2uo-W.cjs","names":["EngineExecutionLimitsPolicy","ENGINE_EXECUTION_LIMITS_DEFAULTS","RunFinishedAtFactory","out: RunPruneCandidate[]","RunFinishedAtFactory","InlineDrivingScheduler","ItemValueResolver","NodeOutputNormalizer","NodeInstanceFactoryFactory","DefaultAsyncSleeper","InProcessRetryRunnerFactory","NodeExecutorFactory","RunIntentServiceFactory","EngineWorkflowRunnerServiceFactory","WorkflowRepositoryWebhookTriggerMatcherFactory","CoreTokens","NodeExecutor","InlineDrivingScheduler","EngineFactory","Engine","RunIntentService"],"sources":["../src/policies/executionLimits/EngineExecutionLimitsPolicyFactory.ts","../src/runStorage/RunSummaryMapper.ts","../src/runStorage/InMemoryWorkflowExecutionRepository.ts","../src/scheduler/InlineDrivingSchedulerFactory.ts","../src/bootstrap/runtime/EngineRuntimeRegistrar.ts"],"sourcesContent":["import {\n EngineExecutionLimitsPolicy,\n ENGINE_EXECUTION_LIMITS_DEFAULTS,\n type EngineExecutionLimitsPolicyConfig,\n} from \"./EngineExecutionLimitsPolicy\";\n\n/**\n * Builds {@link EngineExecutionLimitsPolicy} by merging {@link ENGINE_EXECUTION_LIMITS_DEFAULTS} with optional `overrides` (e.g. host `runtime.engineExecutionLimits`).\n */\nexport class EngineExecutionLimitsPolicyFactory {\n create(overrides?: Partial<EngineExecutionLimitsPolicyConfig>): EngineExecutionLimitsPolicy {\n return new EngineExecutionLimitsPolicy({ ...ENGINE_EXECUTION_LIMITS_DEFAULTS, ...overrides });\n }\n}\n","import { RunFinishedAtFactory } from \"../contracts/runFinishedAtFactory\";\nimport type { PersistedRunState, RunSummary } from \"../types\";\n\n/** Maps persisted run state to API run summaries for listings. */\nexport class RunSummaryMapper {\n static fromPersistedState(state: PersistedRunState): RunSummary {\n return {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: state.status,\n finishedAt: RunFinishedAtFactory.resolveIso(state),\n parent: state.parent,\n executionOptions: state.executionOptions,\n };\n }\n}\n","import type {\n EngineRunCounters,\n NodeId,\n NodeOutputs,\n ParentExecutionRef,\n PersistedRunSchedulingState,\n PersistedRunState,\n RunId,\n RunSummary,\n WorkflowExecutionListingRepository,\n WorkflowExecutionPruneRepository,\n WorkflowExecutionRepository,\n RunPruneCandidate,\n WorkflowId,\n} from \"../types\";\nimport { RunFinishedAtFactory } from \"../contracts/runFinishedAtFactory\";\nimport { RunSummaryMapper } from \"./RunSummaryMapper\";\n\nexport class InMemoryWorkflowExecutionRepository\n implements WorkflowExecutionRepository, WorkflowExecutionListingRepository, WorkflowExecutionPruneRepository\n{\n private readonly runs = new Map<RunId, PersistedRunState>();\n\n async createRun(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: PersistedRunState[\"executionOptions\"];\n control?: PersistedRunState[\"control\"];\n workflowSnapshot?: PersistedRunState[\"workflowSnapshot\"];\n mutableState?: PersistedRunState[\"mutableState\"];\n policySnapshot?: PersistedRunState[\"policySnapshot\"];\n engineCounters?: EngineRunCounters;\n }): Promise<void> {\n this.runs.set(args.runId, {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n revision: 0,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n engineCounters: args.engineCounters,\n status: \"running\",\n queue: [],\n outputsByNode: {} as Record<NodeId, NodeOutputs>,\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n });\n }\n\n async load(runId: RunId): Promise<PersistedRunState | undefined> {\n return this.runs.get(runId);\n }\n\n async loadSchedulingState(runId: RunId): Promise<PersistedRunSchedulingState | undefined> {\n const state = this.runs.get(runId);\n if (!state) {\n return undefined;\n }\n return {\n pending: state.pending ? { ...state.pending } : undefined,\n queue: state.queue.map((entry) => ({ ...entry })),\n };\n }\n\n async save(state: PersistedRunState): Promise<void> {\n this.runs.set(state.runId, { ...state, revision: (state.revision ?? 0) + 1 });\n }\n\n async deleteRun(runId: RunId): Promise<void> {\n this.runs.delete(runId);\n }\n\n async listRuns(args?: Readonly<{ workflowId?: WorkflowId; limit?: number }>): Promise<ReadonlyArray<RunSummary>> {\n const limit = args?.limit ?? 50;\n const summaries = [...this.runs.values()]\n .filter((s) => (args?.workflowId ? s.workflowId === args.workflowId : true))\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, limit)\n .map((s) => RunSummaryMapper.fromPersistedState(s));\n return summaries;\n }\n\n async listRunsOlderThan(\n args: Readonly<{ beforeIso: string; limit?: number }>,\n ): Promise<ReadonlyArray<RunPruneCandidate>> {\n const limit = args.limit ?? 100;\n const out: RunPruneCandidate[] = [];\n for (const s of this.runs.values()) {\n if (s.status !== \"completed\" && s.status !== \"failed\") continue;\n const finishedAt = RunFinishedAtFactory.resolveIso(s);\n if (!finishedAt || finishedAt >= args.beforeIso) continue;\n out.push({\n runId: s.runId,\n workflowId: s.workflowId,\n startedAt: s.startedAt,\n finishedAt,\n });\n }\n out.sort((a, b) => a.finishedAt.localeCompare(b.finishedAt));\n return out.slice(0, limit);\n }\n}\n","import { NodeExecutor } from \"../execution/NodeExecutor\";\n\nimport { InlineDrivingScheduler } from \"./InlineDrivingScheduler\";\n\nexport class InlineDrivingSchedulerFactory {\n create(nodeExecutor: NodeExecutor): InlineDrivingScheduler {\n return new InlineDrivingScheduler(nodeExecutor);\n }\n}\n","import { instanceCachingFactory, type DependencyContainer } from \"../../di\";\nimport { CoreTokens } from \"../../di\";\nimport { EngineExecutionLimitsPolicyFactory } from \"../../policies/executionLimits/EngineExecutionLimitsPolicyFactory\";\nimport {\n DefaultAsyncSleeper,\n InProcessRetryRunnerFactory,\n ItemValueResolver,\n NodeExecutor,\n NodeExecutorFactory,\n NodeInstanceFactoryFactory,\n NodeOutputNormalizer,\n} from \"../../execution\";\nimport {\n EngineFactory,\n EngineWorkflowRunnerServiceFactory,\n RunIntentServiceFactory,\n RunIntentService,\n WorkflowRepositoryWebhookTriggerMatcherFactory,\n} from \"../../runtime\";\nimport { InlineDrivingScheduler } from \"../../scheduler/InlineDrivingScheduler\";\nimport { InlineDrivingSchedulerFactory } from \"../../scheduler/InlineDrivingSchedulerFactory\";\nimport { Engine } from \"../../orchestration/Engine\";\nimport type { EngineRuntimeRegistrationOptions } from \"./EngineRuntimeRegistration.types\";\nimport type { WebhookTriggerMatcherProvider } from \"./EngineRuntimeRegistration.types\";\n\n/**\n * Container-first entry: call on a host/test container **after** workflow, run, node, and credential\n * ports are registered. The registrar owns the default inline scheduler, engine binding,\n * and intent-surface wiring so hosts only override the seams they actually replace.\n */\nexport class EngineRuntimeRegistrar {\n register(container: DependencyContainer, options?: EngineRuntimeRegistrationOptions): void {\n this.registerSupportFactories(container);\n this.registerExecutionLimitsPolicy(container, options);\n this.ensureWorkflowNodeInstanceFactory(container);\n this.ensureNodeExecutor(container);\n this.registerDefaultActivationScheduler(container);\n this.registerEngine(container, options);\n this.registerIntentServices(container);\n }\n\n private registerSupportFactories(container: DependencyContainer): void {\n if (!container.isRegistered(ItemValueResolver, true)) {\n container.registerSingleton(ItemValueResolver, ItemValueResolver);\n }\n if (!container.isRegistered(NodeOutputNormalizer, true)) {\n container.registerSingleton(NodeOutputNormalizer, NodeOutputNormalizer);\n }\n container.register(EngineExecutionLimitsPolicyFactory, { useClass: EngineExecutionLimitsPolicyFactory });\n container.register(NodeInstanceFactoryFactory, { useClass: NodeInstanceFactoryFactory });\n container.register(DefaultAsyncSleeper, { useClass: DefaultAsyncSleeper });\n container.register(InProcessRetryRunnerFactory, { useClass: InProcessRetryRunnerFactory });\n container.register(NodeExecutorFactory, { useClass: NodeExecutorFactory });\n container.register(InlineDrivingSchedulerFactory, { useClass: InlineDrivingSchedulerFactory });\n container.register(RunIntentServiceFactory, { useClass: RunIntentServiceFactory });\n container.register(EngineWorkflowRunnerServiceFactory, {\n useClass: EngineWorkflowRunnerServiceFactory,\n });\n container.register(WorkflowRepositoryWebhookTriggerMatcherFactory, {\n useClass: WorkflowRepositoryWebhookTriggerMatcherFactory,\n });\n }\n\n private registerExecutionLimitsPolicy(\n container: DependencyContainer,\n options: EngineRuntimeRegistrationOptions | undefined,\n ): void {\n if (container.isRegistered(CoreTokens.EngineExecutionLimitsPolicy, true)) {\n return;\n }\n container.register(CoreTokens.EngineExecutionLimitsPolicy, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const fromResolver = options?.resolveEngineExecutionLimits?.();\n const merged = fromResolver ?? options?.engineExecutionLimits;\n return dependencyContainer.resolve(EngineExecutionLimitsPolicyFactory).create(merged);\n }),\n });\n }\n\n private ensureWorkflowNodeInstanceFactory(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.WorkflowNodeInstanceFactory, true)) {\n return;\n }\n container.register(CoreTokens.WorkflowNodeInstanceFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(NodeInstanceFactoryFactory)\n .create(dependencyContainer.resolve(CoreTokens.NodeResolver));\n }),\n });\n }\n\n private ensureNodeExecutor(container: DependencyContainer): void {\n if (container.isRegistered(NodeExecutor, true)) {\n return;\n }\n container.register(NodeExecutor, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const retryRunner = dependencyContainer\n .resolve(InProcessRetryRunnerFactory)\n .create(dependencyContainer.resolve(DefaultAsyncSleeper));\n return dependencyContainer\n .resolve(NodeExecutorFactory)\n .create(dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory), retryRunner);\n }),\n });\n }\n\n private registerDefaultActivationScheduler(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.NodeActivationScheduler, true)) {\n return;\n }\n container.register(InlineDrivingScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(InlineDrivingSchedulerFactory)\n .create(dependencyContainer.resolve(NodeExecutor));\n }),\n });\n container.register(CoreTokens.NodeActivationScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer.resolve(InlineDrivingScheduler);\n }),\n });\n }\n\n private registerEngine(container: DependencyContainer, options: EngineRuntimeRegistrationOptions | undefined): void {\n container.register(EngineFactory, { useClass: EngineFactory });\n const matcherProvider = this.resolveMatcherProvider(options);\n container.register(Engine, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const liveWorkflowRepository = dependencyContainer.resolve(CoreTokens.LiveWorkflowRepository);\n const nodeResolver = dependencyContainer.resolve(CoreTokens.NodeResolver);\n const tokenRegistryLike = dependencyContainer.resolve(CoreTokens.PersistedWorkflowTokenRegistry);\n const workflowActivationPolicy = dependencyContainer.resolve(CoreTokens.WorkflowActivationPolicy);\n const webhookTriggerMatcher = matcherProvider.createMatcher(dependencyContainer);\n const workflowNodeInstanceFactory = dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory);\n const triggerRuntimeDiagnostics = options?.triggerRuntimeDiagnosticsProvider?.create(dependencyContainer);\n return dependencyContainer.resolve(EngineFactory).create({\n credentialSessions: dependencyContainer.resolve(CoreTokens.CredentialSessionService),\n liveWorkflowRepository,\n workflowRepository: dependencyContainer.resolve(CoreTokens.WorkflowRepository),\n workflowActivationPolicy,\n nodeResolver,\n triggerSetupStateRepository: dependencyContainer.resolve(CoreTokens.TriggerSetupStateRepository),\n webhookTriggerMatcher,\n runIdFactory: dependencyContainer.resolve(CoreTokens.RunIdFactory),\n activationIdFactory: dependencyContainer.resolve(CoreTokens.ActivationIdFactory),\n workflowExecutionRepository: dependencyContainer.resolve(CoreTokens.WorkflowExecutionRepository),\n activationScheduler: dependencyContainer.resolve(CoreTokens.NodeActivationScheduler),\n runDataFactory: dependencyContainer.resolve(CoreTokens.RunDataFactory),\n executionContextFactory: dependencyContainer.resolve(CoreTokens.ExecutionContextFactory),\n nodeExecutor: dependencyContainer.resolve(NodeExecutor),\n eventBus: dependencyContainer.resolve(CoreTokens.RunEventBus),\n tokenRegistry: tokenRegistryLike,\n workflowNodeInstanceFactory,\n executionLimitsPolicy: dependencyContainer.resolve(CoreTokens.EngineExecutionLimitsPolicy),\n triggerRuntimeDiagnostics,\n });\n }),\n });\n }\n\n private registerIntentServices(container: DependencyContainer): void {\n container.register(RunIntentService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(RunIntentServiceFactory)\n .create(dependencyContainer.resolve(Engine), dependencyContainer.resolve(CoreTokens.WorkflowRepository));\n }),\n });\n container.register(CoreTokens.WorkflowRunnerService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(EngineWorkflowRunnerServiceFactory)\n .create(dependencyContainer.resolve(Engine), dependencyContainer.resolve(CoreTokens.WorkflowRepository));\n }),\n });\n }\n\n private resolveMatcherProvider(options: EngineRuntimeRegistrationOptions | undefined): WebhookTriggerMatcherProvider {\n if (options?.webhookTriggerMatcherProvider) {\n return options.webhookTriggerMatcherProvider;\n }\n return {\n createMatcher: (container) =>\n container\n .resolve(WorkflowRepositoryWebhookTriggerMatcherFactory)\n .create(\n container.resolve(CoreTokens.WorkflowRepository),\n container.resolve(CoreTokens.WorkflowActivationPolicy),\n options?.webhookTriggerRoutingDiagnostics,\n ),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-DbUlOl11.js","names":["out: RunPruneCandidate[]"],"sources":["../src/policies/executionLimits/EngineExecutionLimitsPolicyFactory.ts","../src/runStorage/RunSummaryMapper.ts","../src/runStorage/InMemoryWorkflowExecutionRepository.ts","../src/scheduler/InlineDrivingSchedulerFactory.ts","../src/bootstrap/runtime/EngineRuntimeRegistrar.ts"],"sourcesContent":["import {\n EngineExecutionLimitsPolicy,\n ENGINE_EXECUTION_LIMITS_DEFAULTS,\n type EngineExecutionLimitsPolicyConfig,\n} from \"./EngineExecutionLimitsPolicy\";\n\n/**\n * Builds {@link EngineExecutionLimitsPolicy} by merging {@link ENGINE_EXECUTION_LIMITS_DEFAULTS} with optional `overrides` (e.g. host `runtime.engineExecutionLimits`).\n */\nexport class EngineExecutionLimitsPolicyFactory {\n create(overrides?: Partial<EngineExecutionLimitsPolicyConfig>): EngineExecutionLimitsPolicy {\n return new EngineExecutionLimitsPolicy({ ...ENGINE_EXECUTION_LIMITS_DEFAULTS, ...overrides });\n }\n}\n","import { RunFinishedAtFactory } from \"../contracts/runFinishedAtFactory\";\nimport type { PersistedRunState, RunSummary } from \"../types\";\n\n/** Maps persisted run state to API run summaries for listings. */\nexport class RunSummaryMapper {\n static fromPersistedState(state: PersistedRunState): RunSummary {\n return {\n runId: state.runId,\n workflowId: state.workflowId,\n startedAt: state.startedAt,\n status: state.status,\n finishedAt: RunFinishedAtFactory.resolveIso(state),\n parent: state.parent,\n executionOptions: state.executionOptions,\n };\n }\n}\n","import type {\n EngineRunCounters,\n NodeId,\n NodeOutputs,\n ParentExecutionRef,\n PersistedRunSchedulingState,\n PersistedRunState,\n RunId,\n RunSummary,\n WorkflowExecutionListingRepository,\n WorkflowExecutionPruneRepository,\n WorkflowExecutionRepository,\n RunPruneCandidate,\n WorkflowId,\n} from \"../types\";\nimport { RunFinishedAtFactory } from \"../contracts/runFinishedAtFactory\";\nimport { RunSummaryMapper } from \"./RunSummaryMapper\";\n\nexport class InMemoryWorkflowExecutionRepository\n implements WorkflowExecutionRepository, WorkflowExecutionListingRepository, WorkflowExecutionPruneRepository\n{\n private readonly runs = new Map<RunId, PersistedRunState>();\n\n async createRun(args: {\n runId: RunId;\n workflowId: WorkflowId;\n startedAt: string;\n parent?: ParentExecutionRef;\n executionOptions?: PersistedRunState[\"executionOptions\"];\n control?: PersistedRunState[\"control\"];\n workflowSnapshot?: PersistedRunState[\"workflowSnapshot\"];\n mutableState?: PersistedRunState[\"mutableState\"];\n policySnapshot?: PersistedRunState[\"policySnapshot\"];\n engineCounters?: EngineRunCounters;\n }): Promise<void> {\n this.runs.set(args.runId, {\n runId: args.runId,\n workflowId: args.workflowId,\n startedAt: args.startedAt,\n revision: 0,\n parent: args.parent,\n executionOptions: args.executionOptions,\n control: args.control,\n workflowSnapshot: args.workflowSnapshot,\n mutableState: args.mutableState,\n policySnapshot: args.policySnapshot,\n engineCounters: args.engineCounters,\n status: \"running\",\n queue: [],\n outputsByNode: {} as Record<NodeId, NodeOutputs>,\n nodeSnapshotsByNodeId: {},\n connectionInvocations: [],\n });\n }\n\n async load(runId: RunId): Promise<PersistedRunState | undefined> {\n return this.runs.get(runId);\n }\n\n async loadSchedulingState(runId: RunId): Promise<PersistedRunSchedulingState | undefined> {\n const state = this.runs.get(runId);\n if (!state) {\n return undefined;\n }\n return {\n pending: state.pending ? { ...state.pending } : undefined,\n queue: state.queue.map((entry) => ({ ...entry })),\n };\n }\n\n async save(state: PersistedRunState): Promise<void> {\n this.runs.set(state.runId, { ...state, revision: (state.revision ?? 0) + 1 });\n }\n\n async deleteRun(runId: RunId): Promise<void> {\n this.runs.delete(runId);\n }\n\n async listRuns(args?: Readonly<{ workflowId?: WorkflowId; limit?: number }>): Promise<ReadonlyArray<RunSummary>> {\n const limit = args?.limit ?? 50;\n const summaries = [...this.runs.values()]\n .filter((s) => (args?.workflowId ? s.workflowId === args.workflowId : true))\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, limit)\n .map((s) => RunSummaryMapper.fromPersistedState(s));\n return summaries;\n }\n\n async listRunsOlderThan(\n args: Readonly<{ beforeIso: string; limit?: number }>,\n ): Promise<ReadonlyArray<RunPruneCandidate>> {\n const limit = args.limit ?? 100;\n const out: RunPruneCandidate[] = [];\n for (const s of this.runs.values()) {\n if (s.status !== \"completed\" && s.status !== \"failed\") continue;\n const finishedAt = RunFinishedAtFactory.resolveIso(s);\n if (!finishedAt || finishedAt >= args.beforeIso) continue;\n out.push({\n runId: s.runId,\n workflowId: s.workflowId,\n startedAt: s.startedAt,\n finishedAt,\n });\n }\n out.sort((a, b) => a.finishedAt.localeCompare(b.finishedAt));\n return out.slice(0, limit);\n }\n}\n","import { NodeExecutor } from \"../execution/NodeExecutor\";\n\nimport { InlineDrivingScheduler } from \"./InlineDrivingScheduler\";\n\nexport class InlineDrivingSchedulerFactory {\n create(nodeExecutor: NodeExecutor): InlineDrivingScheduler {\n return new InlineDrivingScheduler(nodeExecutor);\n }\n}\n","import { instanceCachingFactory, type DependencyContainer } from \"../../di\";\nimport { CoreTokens } from \"../../di\";\nimport { EngineExecutionLimitsPolicyFactory } from \"../../policies/executionLimits/EngineExecutionLimitsPolicyFactory\";\nimport {\n DefaultAsyncSleeper,\n InProcessRetryRunnerFactory,\n ItemValueResolver,\n NodeExecutor,\n NodeExecutorFactory,\n NodeInstanceFactoryFactory,\n NodeOutputNormalizer,\n} from \"../../execution\";\nimport {\n EngineFactory,\n EngineWorkflowRunnerServiceFactory,\n RunIntentServiceFactory,\n RunIntentService,\n WorkflowRepositoryWebhookTriggerMatcherFactory,\n} from \"../../runtime\";\nimport { InlineDrivingScheduler } from \"../../scheduler/InlineDrivingScheduler\";\nimport { InlineDrivingSchedulerFactory } from \"../../scheduler/InlineDrivingSchedulerFactory\";\nimport { Engine } from \"../../orchestration/Engine\";\nimport type { EngineRuntimeRegistrationOptions } from \"./EngineRuntimeRegistration.types\";\nimport type { WebhookTriggerMatcherProvider } from \"./EngineRuntimeRegistration.types\";\n\n/**\n * Container-first entry: call on a host/test container **after** workflow, run, node, and credential\n * ports are registered. The registrar owns the default inline scheduler, engine binding,\n * and intent-surface wiring so hosts only override the seams they actually replace.\n */\nexport class EngineRuntimeRegistrar {\n register(container: DependencyContainer, options?: EngineRuntimeRegistrationOptions): void {\n this.registerSupportFactories(container);\n this.registerExecutionLimitsPolicy(container, options);\n this.ensureWorkflowNodeInstanceFactory(container);\n this.ensureNodeExecutor(container);\n this.registerDefaultActivationScheduler(container);\n this.registerEngine(container, options);\n this.registerIntentServices(container);\n }\n\n private registerSupportFactories(container: DependencyContainer): void {\n if (!container.isRegistered(ItemValueResolver, true)) {\n container.registerSingleton(ItemValueResolver, ItemValueResolver);\n }\n if (!container.isRegistered(NodeOutputNormalizer, true)) {\n container.registerSingleton(NodeOutputNormalizer, NodeOutputNormalizer);\n }\n container.register(EngineExecutionLimitsPolicyFactory, { useClass: EngineExecutionLimitsPolicyFactory });\n container.register(NodeInstanceFactoryFactory, { useClass: NodeInstanceFactoryFactory });\n container.register(DefaultAsyncSleeper, { useClass: DefaultAsyncSleeper });\n container.register(InProcessRetryRunnerFactory, { useClass: InProcessRetryRunnerFactory });\n container.register(NodeExecutorFactory, { useClass: NodeExecutorFactory });\n container.register(InlineDrivingSchedulerFactory, { useClass: InlineDrivingSchedulerFactory });\n container.register(RunIntentServiceFactory, { useClass: RunIntentServiceFactory });\n container.register(EngineWorkflowRunnerServiceFactory, {\n useClass: EngineWorkflowRunnerServiceFactory,\n });\n container.register(WorkflowRepositoryWebhookTriggerMatcherFactory, {\n useClass: WorkflowRepositoryWebhookTriggerMatcherFactory,\n });\n }\n\n private registerExecutionLimitsPolicy(\n container: DependencyContainer,\n options: EngineRuntimeRegistrationOptions | undefined,\n ): void {\n if (container.isRegistered(CoreTokens.EngineExecutionLimitsPolicy, true)) {\n return;\n }\n container.register(CoreTokens.EngineExecutionLimitsPolicy, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const fromResolver = options?.resolveEngineExecutionLimits?.();\n const merged = fromResolver ?? options?.engineExecutionLimits;\n return dependencyContainer.resolve(EngineExecutionLimitsPolicyFactory).create(merged);\n }),\n });\n }\n\n private ensureWorkflowNodeInstanceFactory(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.WorkflowNodeInstanceFactory, true)) {\n return;\n }\n container.register(CoreTokens.WorkflowNodeInstanceFactory, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(NodeInstanceFactoryFactory)\n .create(dependencyContainer.resolve(CoreTokens.NodeResolver));\n }),\n });\n }\n\n private ensureNodeExecutor(container: DependencyContainer): void {\n if (container.isRegistered(NodeExecutor, true)) {\n return;\n }\n container.register(NodeExecutor, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const retryRunner = dependencyContainer\n .resolve(InProcessRetryRunnerFactory)\n .create(dependencyContainer.resolve(DefaultAsyncSleeper));\n return dependencyContainer\n .resolve(NodeExecutorFactory)\n .create(dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory), retryRunner);\n }),\n });\n }\n\n private registerDefaultActivationScheduler(container: DependencyContainer): void {\n if (container.isRegistered(CoreTokens.NodeActivationScheduler, true)) {\n return;\n }\n container.register(InlineDrivingScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(InlineDrivingSchedulerFactory)\n .create(dependencyContainer.resolve(NodeExecutor));\n }),\n });\n container.register(CoreTokens.NodeActivationScheduler, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer.resolve(InlineDrivingScheduler);\n }),\n });\n }\n\n private registerEngine(container: DependencyContainer, options: EngineRuntimeRegistrationOptions | undefined): void {\n container.register(EngineFactory, { useClass: EngineFactory });\n const matcherProvider = this.resolveMatcherProvider(options);\n container.register(Engine, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n const liveWorkflowRepository = dependencyContainer.resolve(CoreTokens.LiveWorkflowRepository);\n const nodeResolver = dependencyContainer.resolve(CoreTokens.NodeResolver);\n const tokenRegistryLike = dependencyContainer.resolve(CoreTokens.PersistedWorkflowTokenRegistry);\n const workflowActivationPolicy = dependencyContainer.resolve(CoreTokens.WorkflowActivationPolicy);\n const webhookTriggerMatcher = matcherProvider.createMatcher(dependencyContainer);\n const workflowNodeInstanceFactory = dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory);\n const triggerRuntimeDiagnostics = options?.triggerRuntimeDiagnosticsProvider?.create(dependencyContainer);\n return dependencyContainer.resolve(EngineFactory).create({\n credentialSessions: dependencyContainer.resolve(CoreTokens.CredentialSessionService),\n liveWorkflowRepository,\n workflowRepository: dependencyContainer.resolve(CoreTokens.WorkflowRepository),\n workflowActivationPolicy,\n nodeResolver,\n triggerSetupStateRepository: dependencyContainer.resolve(CoreTokens.TriggerSetupStateRepository),\n webhookTriggerMatcher,\n runIdFactory: dependencyContainer.resolve(CoreTokens.RunIdFactory),\n activationIdFactory: dependencyContainer.resolve(CoreTokens.ActivationIdFactory),\n workflowExecutionRepository: dependencyContainer.resolve(CoreTokens.WorkflowExecutionRepository),\n activationScheduler: dependencyContainer.resolve(CoreTokens.NodeActivationScheduler),\n runDataFactory: dependencyContainer.resolve(CoreTokens.RunDataFactory),\n executionContextFactory: dependencyContainer.resolve(CoreTokens.ExecutionContextFactory),\n nodeExecutor: dependencyContainer.resolve(NodeExecutor),\n eventBus: dependencyContainer.resolve(CoreTokens.RunEventBus),\n tokenRegistry: tokenRegistryLike,\n workflowNodeInstanceFactory,\n executionLimitsPolicy: dependencyContainer.resolve(CoreTokens.EngineExecutionLimitsPolicy),\n triggerRuntimeDiagnostics,\n });\n }),\n });\n }\n\n private registerIntentServices(container: DependencyContainer): void {\n container.register(RunIntentService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(RunIntentServiceFactory)\n .create(dependencyContainer.resolve(Engine), dependencyContainer.resolve(CoreTokens.WorkflowRepository));\n }),\n });\n container.register(CoreTokens.WorkflowRunnerService, {\n useFactory: instanceCachingFactory((dependencyContainer) => {\n return dependencyContainer\n .resolve(EngineWorkflowRunnerServiceFactory)\n .create(dependencyContainer.resolve(Engine), dependencyContainer.resolve(CoreTokens.WorkflowRepository));\n }),\n });\n }\n\n private resolveMatcherProvider(options: EngineRuntimeRegistrationOptions | undefined): WebhookTriggerMatcherProvider {\n if (options?.webhookTriggerMatcherProvider) {\n return options.webhookTriggerMatcherProvider;\n }\n return {\n createMatcher: (container) =>\n container\n .resolve(WorkflowRepositoryWebhookTriggerMatcherFactory)\n .create(\n container.resolve(CoreTokens.WorkflowRepository),\n container.resolve(CoreTokens.WorkflowActivationPolicy),\n options?.webhookTriggerRoutingDiagnostics,\n ),\n };\n }\n}\n"],"mappings":"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"}
|