@codemation/core 0.2.3 → 0.4.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 +23 -0
- package/README.md +2 -0
- package/dist/{EngineRuntimeRegistration.types-Bjeo7Sfq.d.ts → EngineRuntimeRegistration.types-DU6MsjU9.d.ts} +2 -2
- package/dist/{EngineWorkflowRunnerService-Dd4yD31l.d.cts → EngineWorkflowRunnerService-BBkL4VQF.d.cts} +2 -2
- package/dist/{InMemoryRunDataFactory-OUzDmAHt.d.cts → InMemoryRunDataFactory-CsYEMJK2.d.cts} +11 -3
- package/dist/{RunIntentService-Bkg4oYrM.d.cts → RunIntentService-BvlTpmEb.d.cts} +224 -237
- package/dist/{RunIntentService-BAKikN8h.d.ts → RunIntentService-zbTchO9T.d.ts} +305 -259
- package/dist/bootstrap/index.cjs +2 -2
- package/dist/bootstrap/index.d.cts +19 -7
- package/dist/bootstrap/index.d.ts +3 -3
- package/dist/bootstrap/index.js +2 -2
- package/dist/{bootstrap-DwS5S7s9.cjs → bootstrap-DHH2uo-W.cjs} +4 -2
- package/dist/bootstrap-DHH2uo-W.cjs.map +1 -0
- package/dist/{bootstrap-BD6CobHl.js → bootstrap-DbUlOl11.js} +4 -2
- package/dist/bootstrap-DbUlOl11.js.map +1 -0
- package/dist/{index-BDHCiN22.d.ts → index-CUt13qs1.d.ts} +85 -16
- package/dist/index.cjs +74 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +131 -24
- package/dist/index.d.ts +3 -3
- package/dist/index.js +64 -13
- package/dist/index.js.map +1 -1
- package/dist/{runtime-Cy-3FTI_.js → runtime-BdH94eBR.js} +502 -123
- package/dist/runtime-BdH94eBR.js.map +1 -0
- package/dist/{runtime-ZJUpWmPH.cjs → runtime-feFn8OmG.cjs} +561 -122
- package/dist/runtime-feFn8OmG.cjs.map +1 -0
- package/dist/testing.cjs +40 -36
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +17 -26
- package/dist/testing.d.ts +17 -26
- package/dist/testing.js +40 -36
- package/dist/testing.js.map +1 -1
- package/dist/{workflowActivationPolicy-BzyzXLa_.cjs → workflowActivationPolicy-6V3OJD3N.cjs} +65 -19
- package/dist/workflowActivationPolicy-6V3OJD3N.cjs.map +1 -0
- package/dist/{workflowActivationPolicy-B8HzTk3o.js → workflowActivationPolicy-Td9HTOuD.js} +65 -19
- package/dist/workflowActivationPolicy-Td9HTOuD.js.map +1 -0
- package/package.json +2 -1
- package/src/ai/AgentConfigInspectorFactory.ts +4 -0
- package/src/ai/AgentMessageConfigNormalizerFactory.ts +7 -0
- package/src/ai/AgentToolFactory.ts +2 -2
- package/src/ai/AiHost.ts +11 -10
- package/src/ai/NodeBackedToolConfig.ts +1 -1
- package/src/authoring/defineNode.types.ts +144 -25
- package/src/authoring/index.ts +3 -1
- package/src/bootstrap/runtime/EngineRuntimeRegistrar.ts +8 -0
- package/src/contracts/emitPorts.ts +27 -0
- package/src/contracts/index.ts +3 -0
- package/src/contracts/itemMeta.ts +11 -0
- package/src/contracts/itemValue.ts +147 -0
- package/src/contracts/runtimeTypes.ts +39 -22
- package/src/contracts/workflowTypes.ts +26 -56
- package/src/execution/FanInMergeByOriginMerger.ts +67 -0
- package/src/execution/ItemValueResolver.ts +27 -0
- package/src/execution/NodeActivationRequestComposer.ts +25 -0
- package/src/execution/NodeActivationRequestInputPreparer.ts +57 -25
- package/src/execution/NodeExecutor.ts +199 -30
- package/src/execution/NodeOutputNormalizer.ts +90 -0
- package/src/execution/index.ts +2 -0
- package/src/index.ts +2 -0
- package/src/orchestration/NodeExecutionRequestHandlerService.ts +39 -18
- package/src/orchestration/RunContinuationService.ts +11 -17
- package/src/planning/CurrentStateFrontierPlanner.ts +20 -20
- package/src/planning/RunQueuePlanner.ts +56 -19
- package/src/planning/WorkflowTopologyPlanner.ts +57 -33
- package/src/testing/ItemHarnessNode.ts +4 -10
- package/src/testing/ItemHarnessNodeConfig.ts +7 -16
- package/src/testing/RegistrarEngineTestKitFactory.ts +2 -0
- package/src/testing/SubWorkflowRunnerTestNode.ts +28 -43
- package/src/testing/SwitchHarnessNode.ts +54 -0
- package/src/types/index.ts +3 -0
- package/src/workflow/dsl/ChainCursorResolver.ts +68 -23
- package/src/workflow/dsl/WorkflowBuilder.ts +3 -5
- package/src/workflow/dsl/workflowBuilderTypes.ts +5 -8
- package/src/workflowSnapshots/MissingRuntimeNode.ts +4 -4
- package/src/workflowSnapshots/MissingRuntimeNodeConfig.ts +2 -2
- package/src/workflowSnapshots/WorkflowSnapshotCodec.ts +16 -7
- package/dist/bootstrap-BD6CobHl.js.map +0 -1
- package/dist/bootstrap-DwS5S7s9.cjs.map +0 -1
- package/dist/runtime-Cy-3FTI_.js.map +0 -1
- package/dist/runtime-ZJUpWmPH.cjs.map +0 -1
- package/dist/workflowActivationPolicy-B8HzTk3o.js.map +0 -1
- package/dist/workflowActivationPolicy-BzyzXLa_.cjs.map +0 -1
|
@@ -1,24 +1,18 @@
|
|
|
1
|
-
import type { Item,
|
|
1
|
+
import type { Item, RunnableNode, RunnableNodeExecuteArgs } from "../types";
|
|
2
2
|
|
|
3
3
|
import type { ItemHarnessNodeConfig } from "./ItemHarnessNodeConfig";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).
|
|
7
7
|
*/
|
|
8
|
-
export class ItemHarnessNode implements
|
|
8
|
+
export class ItemHarnessNode implements RunnableNode<ItemHarnessNodeConfig<any, any>> {
|
|
9
9
|
readonly kind = "node" as const;
|
|
10
10
|
readonly outputPorts = ["main"] as const;
|
|
11
11
|
|
|
12
|
-
async
|
|
13
|
-
input: unknown;
|
|
14
|
-
item: Item;
|
|
15
|
-
itemIndex: number;
|
|
16
|
-
items: Items;
|
|
17
|
-
ctx: NodeExecutionContext<ItemHarnessNodeConfig<any, any, any>>;
|
|
18
|
-
}): Promise<unknown> {
|
|
12
|
+
async execute(args: RunnableNodeExecuteArgs<ItemHarnessNodeConfig<any, any>>): Promise<unknown> {
|
|
19
13
|
return await args.ctx.config.runOne({
|
|
20
14
|
input: args.input as never,
|
|
21
|
-
item: args.item,
|
|
15
|
+
item: args.item as Item,
|
|
22
16
|
itemIndex: args.itemIndex,
|
|
23
17
|
items: args.items,
|
|
24
18
|
ctx: args.ctx,
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import type { ZodType } from "zod";
|
|
2
2
|
|
|
3
3
|
import type { TypeToken } from "../di";
|
|
4
|
-
import type { Item,
|
|
4
|
+
import type { Item, Items, NodeExecutionContext, RunnableNodeConfig } from "../types";
|
|
5
5
|
|
|
6
6
|
import { ItemHarnessNode } from "./ItemHarnessNode";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema}
|
|
10
|
-
*
|
|
9
|
+
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema},
|
|
10
|
+
* then {@link ItemHarnessNode.execute} per item.
|
|
11
11
|
*/
|
|
12
|
-
export class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown
|
|
13
|
-
TIn,
|
|
14
|
-
TOut,
|
|
15
|
-
TWire
|
|
16
|
-
> {
|
|
12
|
+
export class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown> implements RunnableNodeConfig<TIn, TOut> {
|
|
17
13
|
readonly kind = "node" as const;
|
|
18
14
|
readonly type: TypeToken<unknown> = ItemHarnessNode;
|
|
19
15
|
|
|
@@ -22,21 +18,16 @@ export class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown, TWire = TIn> i
|
|
|
22
18
|
public readonly inputSchema: ZodType<TIn>,
|
|
23
19
|
public readonly runOne: (args: {
|
|
24
20
|
input: TIn;
|
|
25
|
-
item: Item<
|
|
21
|
+
item: Item<TIn>;
|
|
26
22
|
itemIndex: number;
|
|
27
|
-
items: Items<
|
|
28
|
-
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut
|
|
23
|
+
items: Items<TIn>;
|
|
24
|
+
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut>>;
|
|
29
25
|
}) => TOut | Promise<TOut>,
|
|
30
26
|
public readonly opts: Readonly<{
|
|
31
27
|
id?: string;
|
|
32
|
-
mapInput?: ItemInputMapper<TWire, TIn>;
|
|
33
28
|
}> = {},
|
|
34
29
|
) {}
|
|
35
30
|
|
|
36
|
-
get mapInput(): ItemInputMapper<TWire, TIn> | undefined {
|
|
37
|
-
return this.opts.mapInput;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
31
|
get id(): string | undefined {
|
|
41
32
|
return this.opts.id;
|
|
42
33
|
}
|
|
@@ -32,6 +32,7 @@ import type { RegistrarEngineTestKitHandle, RegistrarEngineTestKitOptions } from
|
|
|
32
32
|
import { ItemHarnessNode } from "./ItemHarnessNode";
|
|
33
33
|
import { SubWorkflowRunnerNode } from "./SubWorkflowRunnerTestNode";
|
|
34
34
|
import { WorkflowTestHarnessManualTriggerNode } from "./WorkflowTestHarnessManualTrigger";
|
|
35
|
+
import { SwitchHarnessNode } from "./SwitchHarnessNode";
|
|
35
36
|
|
|
36
37
|
export class RegistrarEngineTestKitFactory {
|
|
37
38
|
static create(options: RegistrarEngineTestKitOptions = {}): RegistrarEngineTestKitHandle {
|
|
@@ -110,6 +111,7 @@ export class RegistrarEngineTestKitFactory {
|
|
|
110
111
|
new SubWorkflowRunnerNode(workflowRunner as WorkflowRunnerService),
|
|
111
112
|
);
|
|
112
113
|
dependencyContainer.registerInstance(ItemHarnessNode, new ItemHarnessNode());
|
|
114
|
+
dependencyContainer.registerInstance(SwitchHarnessNode, new SwitchHarnessNode());
|
|
113
115
|
dependencyContainer.registerInstance(
|
|
114
116
|
WorkflowTestHarnessManualTriggerNode,
|
|
115
117
|
new WorkflowTestHarnessManualTriggerNode(),
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
/* eslint-disable codemation/single-class-per-file -- Runnable config and implementation share a TypeToken pairing. */
|
|
2
2
|
import type { WorkflowRunnerService } from "../contracts/runtimeTypes";
|
|
3
3
|
import type { TypeToken } from "../di";
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
Items,
|
|
7
|
-
NodeExecutionContext,
|
|
8
|
-
NodeId,
|
|
9
|
-
NodeOutputs,
|
|
10
|
-
Node,
|
|
11
|
-
RunnableNodeConfig,
|
|
12
|
-
WorkflowId,
|
|
13
|
-
} from "../types";
|
|
4
|
+
import type { Item, NodeId, RunnableNode, RunnableNodeConfig, RunnableNodeExecuteArgs, WorkflowId } from "../types";
|
|
5
|
+
import { emitPorts } from "../contracts/emitPorts";
|
|
14
6
|
|
|
15
7
|
/**
|
|
16
8
|
* Test harness subworkflow runner (mirrors integration patterns; lives under {@link "@codemation/core/testing"}).
|
|
@@ -22,6 +14,9 @@ export class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknown
|
|
|
22
14
|
readonly kind = "node" as const;
|
|
23
15
|
readonly type: TypeToken<unknown> = SubWorkflowRunnerNode;
|
|
24
16
|
|
|
17
|
+
readonly workflowId: WorkflowId;
|
|
18
|
+
readonly startAt: NodeId | undefined;
|
|
19
|
+
|
|
25
20
|
constructor(
|
|
26
21
|
public readonly name: string,
|
|
27
22
|
public readonly args: Readonly<{
|
|
@@ -30,7 +25,10 @@ export class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknown
|
|
|
30
25
|
id?: string;
|
|
31
26
|
execution?: Readonly<{ hint?: "local" | "worker"; queue?: string }>;
|
|
32
27
|
}>,
|
|
33
|
-
) {
|
|
28
|
+
) {
|
|
29
|
+
this.workflowId = args.workflowId;
|
|
30
|
+
this.startAt = args.startAt;
|
|
31
|
+
}
|
|
34
32
|
|
|
35
33
|
get id(): string | undefined {
|
|
36
34
|
return this.args.id;
|
|
@@ -39,45 +37,32 @@ export class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknown
|
|
|
39
37
|
get execution(): Readonly<{ hint?: "local" | "worker"; queue?: string }> | undefined {
|
|
40
38
|
return this.args.execution;
|
|
41
39
|
}
|
|
42
|
-
|
|
43
|
-
get workflowId(): WorkflowId {
|
|
44
|
-
return this.args.workflowId;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
get startAt(): NodeId | undefined {
|
|
48
|
-
return this.args.startAt;
|
|
49
|
-
}
|
|
50
40
|
}
|
|
51
41
|
|
|
52
|
-
export class SubWorkflowRunnerNode implements
|
|
42
|
+
export class SubWorkflowRunnerNode implements RunnableNode<SubWorkflowRunnerConfig<any, any>> {
|
|
53
43
|
readonly kind = "node" as const;
|
|
54
44
|
readonly outputPorts = ["main"] as const;
|
|
55
45
|
|
|
56
46
|
constructor(private readonly workflows: WorkflowRunnerService) {}
|
|
57
47
|
|
|
58
|
-
async execute(
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
});
|
|
75
|
-
if (result.status !== "completed") {
|
|
76
|
-
throw new Error(`Subworkflow ${ctx.config.workflowId} did not complete (status=${result.status})`);
|
|
77
|
-
}
|
|
78
|
-
out.push(...result.outputs);
|
|
48
|
+
async execute(args: RunnableNodeExecuteArgs<SubWorkflowRunnerConfig<any, any>>): Promise<unknown> {
|
|
49
|
+
const current = args.item as Item;
|
|
50
|
+
const result = await this.workflows.runById({
|
|
51
|
+
workflowId: args.ctx.config.workflowId,
|
|
52
|
+
startAt: args.ctx.config.startAt,
|
|
53
|
+
items: [current],
|
|
54
|
+
parent: {
|
|
55
|
+
runId: args.ctx.runId,
|
|
56
|
+
workflowId: args.ctx.workflowId,
|
|
57
|
+
nodeId: args.ctx.nodeId,
|
|
58
|
+
subworkflowDepth: args.ctx.subworkflowDepth,
|
|
59
|
+
engineMaxNodeActivations: args.ctx.engineMaxNodeActivations,
|
|
60
|
+
engineMaxSubworkflowDepth: args.ctx.engineMaxSubworkflowDepth,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
if (result.status !== "completed") {
|
|
64
|
+
throw new Error(`Subworkflow ${args.ctx.config.workflowId} did not complete (status=${result.status})`);
|
|
79
65
|
}
|
|
80
|
-
|
|
81
|
-
return { main: out };
|
|
66
|
+
return emitPorts({ main: result.outputs });
|
|
82
67
|
}
|
|
83
68
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { TypeToken } from "../di";
|
|
2
|
+
import type {
|
|
3
|
+
Item,
|
|
4
|
+
Items,
|
|
5
|
+
NodeExecutionContext,
|
|
6
|
+
RunnableNode,
|
|
7
|
+
RunnableNodeConfig,
|
|
8
|
+
RunnableNodeExecuteArgs,
|
|
9
|
+
} from "../types";
|
|
10
|
+
import { emitPorts } from "../contracts/emitPorts";
|
|
11
|
+
|
|
12
|
+
export class SwitchHarnessNode implements RunnableNode<SwitchHarnessNodeConfig<any>> {
|
|
13
|
+
readonly kind = "node" as const;
|
|
14
|
+
readonly outputPorts = [] as const;
|
|
15
|
+
|
|
16
|
+
async execute(args: RunnableNodeExecuteArgs<SwitchHarnessNodeConfig<any>>): Promise<unknown> {
|
|
17
|
+
const key = await Promise.resolve(
|
|
18
|
+
args.ctx.config.cfg.resolveCaseKey(args.item as Item, args.itemIndex, args.items, args.ctx),
|
|
19
|
+
);
|
|
20
|
+
const { cases, defaultCase } = args.ctx.config.cfg;
|
|
21
|
+
const port = cases.includes(key) ? key : defaultCase;
|
|
22
|
+
return emitPorts({
|
|
23
|
+
[port]: [args.item],
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class SwitchHarnessNodeConfig<TInputJson = unknown> implements RunnableNodeConfig<TInputJson, TInputJson> {
|
|
29
|
+
readonly kind = "node" as const;
|
|
30
|
+
readonly type: TypeToken<unknown> = SwitchHarnessNode;
|
|
31
|
+
readonly lineageCarry = "carryThrough" as const;
|
|
32
|
+
readonly declaredOutputPorts: ReadonlyArray<string>;
|
|
33
|
+
|
|
34
|
+
constructor(
|
|
35
|
+
public readonly name: string,
|
|
36
|
+
public readonly cfg: Readonly<{
|
|
37
|
+
cases: readonly string[];
|
|
38
|
+
defaultCase: string;
|
|
39
|
+
resolveCaseKey: (
|
|
40
|
+
item: Item<TInputJson>,
|
|
41
|
+
index: number,
|
|
42
|
+
items: Items<TInputJson>,
|
|
43
|
+
ctx: NodeExecutionContext<SwitchHarnessNodeConfig<TInputJson>>,
|
|
44
|
+
) => string | Promise<string>;
|
|
45
|
+
}>,
|
|
46
|
+
public readonly opts: Readonly<{ id?: string }> = {},
|
|
47
|
+
) {
|
|
48
|
+
this.declaredOutputPorts = [...new Set([...cfg.cases, cfg.defaultCase])].sort();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get id(): string | undefined {
|
|
52
|
+
return this.opts.id;
|
|
53
|
+
}
|
|
54
|
+
}
|
package/src/types/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
InputPortKey,
|
|
2
3
|
NodeRef,
|
|
3
4
|
OutputPortKey,
|
|
4
5
|
RunnableNodeConfig,
|
|
@@ -16,6 +17,8 @@ import type {
|
|
|
16
17
|
StepSequenceOutput,
|
|
17
18
|
} from "./workflowBuilderTypes";
|
|
18
19
|
|
|
20
|
+
type ChainCursorEndpoint = Readonly<{ node: NodeRef; output: OutputPortKey; inputPortHint?: InputPortKey }>;
|
|
21
|
+
|
|
19
22
|
type ChainCursorWhenOverloads<TCurrentJson> = BooleanWhenOverloads<TCurrentJson, WhenBuilder<TCurrentJson>> & {
|
|
20
23
|
<
|
|
21
24
|
TTrueSteps extends ReadonlyArray<AnyRunnableNodeConfig> | undefined,
|
|
@@ -34,16 +37,30 @@ type ChainCursorWhenOverloads<TCurrentJson> = BooleanWhenOverloads<TCurrentJson,
|
|
|
34
37
|
export class ChainCursor<TCurrentJson> {
|
|
35
38
|
constructor(
|
|
36
39
|
private readonly wf: WorkflowBuilder,
|
|
37
|
-
private readonly
|
|
38
|
-
private readonly cursorOutput: OutputPortKey,
|
|
40
|
+
private readonly endpoints: ReadonlyArray<ChainCursorEndpoint>,
|
|
39
41
|
) {}
|
|
40
42
|
|
|
41
|
-
then<
|
|
43
|
+
then<TOutputJson, TConfig extends RunnableNodeConfig<TCurrentJson, TOutputJson>>(
|
|
44
|
+
config: TConfig,
|
|
45
|
+
): ChainCursor<RunnableNodeOutputJson<TConfig>> {
|
|
46
|
+
const next = (this.wf as any).add(config) as NodeRef;
|
|
47
|
+
const inputPortHint = this.resolveSharedInputPortHint();
|
|
48
|
+
for (const e of this.endpoints) {
|
|
49
|
+
(this.wf as any).connect(e.node, next, e.output);
|
|
50
|
+
}
|
|
51
|
+
return new ChainCursor<RunnableNodeOutputJson<TConfig>>(this.wf, [
|
|
52
|
+
{ node: next, output: "main", ...(inputPortHint ? { inputPortHint } : {}) },
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
thenIntoInputHints<TOutputJson, TConfig extends RunnableNodeConfig<any, TOutputJson>>(
|
|
42
57
|
config: TConfig,
|
|
43
58
|
): ChainCursor<RunnableNodeOutputJson<TConfig>> {
|
|
44
59
|
const next = (this.wf as any).add(config) as NodeRef;
|
|
45
|
-
(
|
|
46
|
-
|
|
60
|
+
for (const e of this.endpoints) {
|
|
61
|
+
(this.wf as any).connect(e.node, next, e.output, e.inputPortHint ?? "in");
|
|
62
|
+
}
|
|
63
|
+
return new ChainCursor<RunnableNodeOutputJson<TConfig>>(this.wf, [{ node: next, output: "main" }]);
|
|
47
64
|
}
|
|
48
65
|
|
|
49
66
|
readonly when: ChainCursorWhenOverloads<TCurrentJson> = ((
|
|
@@ -53,51 +70,79 @@ export class ChainCursor<TCurrentJson> {
|
|
|
53
70
|
steps?: ReadonlyArray<AnyRunnableNodeConfig> | AnyRunnableNodeConfig,
|
|
54
71
|
...more: AnyRunnableNodeConfig[]
|
|
55
72
|
): WhenBuilder<TCurrentJson> | ChainCursor<TCurrentJson> => {
|
|
73
|
+
if (this.endpoints.length !== 1) {
|
|
74
|
+
throw new Error("ChainCursor.when(...) is only supported from a single cursor endpoint");
|
|
75
|
+
}
|
|
76
|
+
const cursor = this.endpoints[0]!.node;
|
|
77
|
+
|
|
56
78
|
if (typeof arg1 === "boolean") {
|
|
57
79
|
const list = Array.isArray(steps) ? steps : steps ? [steps, ...more] : more;
|
|
58
80
|
const port: OutputPortKey = arg1 ? "true" : "false";
|
|
59
|
-
const b = new WhenBuilder<TCurrentJson>(this.wf,
|
|
81
|
+
const b = new WhenBuilder<TCurrentJson>(this.wf, cursor, port);
|
|
60
82
|
b.addBranch(list);
|
|
61
83
|
return b;
|
|
62
84
|
}
|
|
63
85
|
|
|
64
86
|
const branches = arg1;
|
|
65
|
-
const makeMerge = (this.wf as any).options?.makeMergeNode as ((name: string) => AnyRunnableNodeConfig) | undefined;
|
|
66
|
-
if (!makeMerge) {
|
|
67
|
-
throw new Error(
|
|
68
|
-
'WorkflowBuilder is missing options.makeMergeNode (required for when({true,false}). Use createWorkflowBuilder from "@codemation/core-nodes".',
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
87
|
const wfAny = this.wf as any;
|
|
73
88
|
|
|
74
89
|
const buildBranch = (
|
|
75
90
|
port: OutputPortKey,
|
|
76
91
|
branchSteps: ReadonlyArray<AnyRunnableNodeConfig> | undefined,
|
|
77
|
-
): Readonly<{ end: NodeRef; endOutput: OutputPortKey }> => {
|
|
92
|
+
): Readonly<{ end: NodeRef; endOutput: OutputPortKey; inputPortHint: InputPortKey }> => {
|
|
78
93
|
const list = branchSteps ?? [];
|
|
79
94
|
let prev: NodeRef | null = null;
|
|
80
95
|
for (const cfg of list) {
|
|
81
96
|
const ref = wfAny.add(cfg) as NodeRef;
|
|
82
|
-
if (!prev) wfAny.connect(
|
|
97
|
+
if (!prev) wfAny.connect(cursor, ref, port, "in");
|
|
83
98
|
else wfAny.connect(prev, ref, "main", "in");
|
|
84
99
|
prev = ref;
|
|
85
100
|
}
|
|
86
|
-
if (!prev) return { end:
|
|
87
|
-
return { end: prev, endOutput: "main" };
|
|
101
|
+
if (!prev) return { end: cursor, endOutput: port, inputPortHint: port };
|
|
102
|
+
return { end: prev, endOutput: "main", inputPortHint: port };
|
|
88
103
|
};
|
|
89
104
|
|
|
90
105
|
const t = buildBranch("true", branches.true);
|
|
91
106
|
const f = buildBranch("false", branches.false);
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return new ChainCursor<TCurrentJson>(this.wf, merge, "main");
|
|
107
|
+
return new ChainCursor<TCurrentJson>(this.wf, [
|
|
108
|
+
{ node: t.end, output: t.endOutput, inputPortHint: t.inputPortHint },
|
|
109
|
+
{ node: f.end, output: f.endOutput, inputPortHint: f.inputPortHint },
|
|
110
|
+
]);
|
|
98
111
|
}) as ChainCursorWhenOverloads<TCurrentJson>;
|
|
99
112
|
|
|
113
|
+
route<TNextJson>(
|
|
114
|
+
branches: Readonly<
|
|
115
|
+
Record<OutputPortKey, (branch: ChainCursor<TCurrentJson>) => ChainCursor<TNextJson> | undefined>
|
|
116
|
+
>,
|
|
117
|
+
): ChainCursor<TNextJson> {
|
|
118
|
+
if (this.endpoints.length !== 1) {
|
|
119
|
+
throw new Error("ChainCursor.route(...) is only supported from a single cursor endpoint");
|
|
120
|
+
}
|
|
121
|
+
const cursor = this.endpoints[0]!;
|
|
122
|
+
const nextEndpoints: ChainCursorEndpoint[] = [];
|
|
123
|
+
for (const [port, branchFactory] of Object.entries(branches)) {
|
|
124
|
+
if (!branchFactory) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const branch = new ChainCursor<TCurrentJson>(this.wf, [{ node: cursor.node, output: port, inputPortHint: port }]);
|
|
128
|
+
const builtBranch = branchFactory(branch);
|
|
129
|
+
if (!builtBranch) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
nextEndpoints.push(...builtBranch.endpoints);
|
|
133
|
+
}
|
|
134
|
+
return new ChainCursor<TNextJson>(this.wf, nextEndpoints);
|
|
135
|
+
}
|
|
136
|
+
|
|
100
137
|
build(): WorkflowDefinition {
|
|
101
138
|
return this.wf.build();
|
|
102
139
|
}
|
|
140
|
+
|
|
141
|
+
private resolveSharedInputPortHint(): InputPortKey | undefined {
|
|
142
|
+
const first = this.endpoints[0]?.inputPortHint;
|
|
143
|
+
if (!first) {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
return this.endpoints.every((endpoint) => endpoint.inputPortHint === first) ? first : undefined;
|
|
147
|
+
}
|
|
103
148
|
}
|
|
@@ -20,9 +20,7 @@ export class WorkflowBuilder {
|
|
|
20
20
|
|
|
21
21
|
constructor(
|
|
22
22
|
private readonly meta: { id: WorkflowId; name: string },
|
|
23
|
-
private readonly options?: Readonly<
|
|
24
|
-
makeMergeNode?: (name: string) => AnyRunnableNodeConfig;
|
|
25
|
-
}>,
|
|
23
|
+
private readonly options?: Readonly<Record<string, never>>,
|
|
26
24
|
) {}
|
|
27
25
|
|
|
28
26
|
private add(config: NodeConfigBase): NodeRef {
|
|
@@ -38,12 +36,12 @@ export class WorkflowBuilder {
|
|
|
38
36
|
|
|
39
37
|
trigger<TConfig extends AnyTriggerNodeConfig>(config: TConfig): ChainCursor<TriggerNodeOutputJson<TConfig>> {
|
|
40
38
|
const ref = this.add(config);
|
|
41
|
-
return new ChainCursor<TriggerNodeOutputJson<TConfig>>(this, ref, "main");
|
|
39
|
+
return new ChainCursor<TriggerNodeOutputJson<TConfig>>(this, [{ node: ref, output: "main" }]);
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
start<TConfig extends AnyRunnableNodeConfig>(config: TConfig): ChainCursor<RunnableNodeOutputJson<TConfig>> {
|
|
45
43
|
const ref = this.add(config);
|
|
46
|
-
return new ChainCursor<RunnableNodeOutputJson<TConfig>>(this, ref, "main");
|
|
44
|
+
return new ChainCursor<RunnableNodeOutputJson<TConfig>>(this, [{ node: ref, output: "main" }]);
|
|
47
45
|
}
|
|
48
46
|
|
|
49
47
|
build(): WorkflowDefinition {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RunnableNodeConfig, RunnableNodeOutputJson, TriggerNodeConfig } from "../../types";
|
|
2
2
|
|
|
3
|
-
export type AnyRunnableNodeConfig = RunnableNodeConfig<any, any
|
|
3
|
+
export type AnyRunnableNodeConfig = RunnableNodeConfig<any, any>;
|
|
4
4
|
|
|
5
5
|
export type AnyTriggerNodeConfig = TriggerNodeConfig<any>;
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ export type ValidStepSequence<
|
|
|
10
10
|
> = TSteps extends readonly []
|
|
11
11
|
? readonly []
|
|
12
12
|
: TSteps extends readonly [infer TFirst, ...infer TRest]
|
|
13
|
-
? TFirst extends RunnableNodeConfig<
|
|
13
|
+
? TFirst extends RunnableNodeConfig<TCurrentJson, infer TNextJson>
|
|
14
14
|
? TRest extends ReadonlyArray<AnyRunnableNodeConfig>
|
|
15
15
|
? readonly [TFirst, ...ValidStepSequence<TNextJson, TRest>]
|
|
16
16
|
: never
|
|
@@ -22,7 +22,7 @@ export type StepSequenceOutput<TCurrentJson, TSteps extends ReadonlyArray<AnyRun
|
|
|
22
22
|
? TSteps extends readonly []
|
|
23
23
|
? TCurrentJson
|
|
24
24
|
: TSteps extends readonly [infer TFirst, ...infer TRest]
|
|
25
|
-
? TFirst extends RunnableNodeConfig<
|
|
25
|
+
? TFirst extends RunnableNodeConfig<TCurrentJson, infer TNextJson>
|
|
26
26
|
? TRest extends ReadonlyArray<AnyRunnableNodeConfig>
|
|
27
27
|
? StepSequenceOutput<TNextJson, TRest>
|
|
28
28
|
: never
|
|
@@ -46,7 +46,7 @@ export type BranchStepsArg<TCurrentJson, TSteps extends ReadonlyArray<AnyRunnabl
|
|
|
46
46
|
|
|
47
47
|
export type BranchMoreArgs<
|
|
48
48
|
TCurrentJson,
|
|
49
|
-
TFirstStep extends RunnableNodeConfig<
|
|
49
|
+
TFirstStep extends RunnableNodeConfig<TCurrentJson, any>,
|
|
50
50
|
TRestSteps extends ReadonlyArray<AnyRunnableNodeConfig>,
|
|
51
51
|
> = TRestSteps & ValidStepSequence<RunnableNodeOutputJson<TFirstStep>, TRestSteps>;
|
|
52
52
|
|
|
@@ -55,10 +55,7 @@ export type BooleanWhenOverloads<TCurrentJson, TReturn> = {
|
|
|
55
55
|
branch: boolean,
|
|
56
56
|
steps: BranchStepsArg<TCurrentJson, TSteps>,
|
|
57
57
|
): TReturn;
|
|
58
|
-
<
|
|
59
|
-
TFirstStep extends RunnableNodeConfig<any, any, TCurrentJson>,
|
|
60
|
-
TRestSteps extends ReadonlyArray<AnyRunnableNodeConfig>,
|
|
61
|
-
>(
|
|
58
|
+
<TFirstStep extends RunnableNodeConfig<TCurrentJson, any>, TRestSteps extends ReadonlyArray<AnyRunnableNodeConfig>>(
|
|
62
59
|
branch: boolean,
|
|
63
60
|
step: TFirstStep,
|
|
64
61
|
...more: BranchMoreArgs<TCurrentJson, TFirstStep, TRestSteps>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { RunnableNode, RunnableNodeExecuteArgs } from "../types";
|
|
2
2
|
|
|
3
3
|
import { MissingRuntimeNodeConfig } from "./MissingRuntimeNodeConfig";
|
|
4
4
|
|
|
5
|
-
export class MissingRuntimeNode implements
|
|
5
|
+
export class MissingRuntimeNode implements RunnableNode<MissingRuntimeNodeConfig> {
|
|
6
6
|
readonly kind = "node" as const;
|
|
7
7
|
readonly outputPorts = ["main"] as const;
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
return
|
|
9
|
+
execute(args: RunnableNodeExecuteArgs<MissingRuntimeNodeConfig>): unknown {
|
|
10
|
+
return args.item;
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { RunnableNodeConfig } from "../types";
|
|
2
2
|
|
|
3
3
|
import { MissingRuntimeNodeToken } from "./MissingRuntimeNodeToken";
|
|
4
4
|
|
|
5
|
-
export class MissingRuntimeNodeConfig implements
|
|
5
|
+
export class MissingRuntimeNodeConfig implements RunnableNodeConfig<unknown, unknown> {
|
|
6
6
|
readonly kind = "node" as const;
|
|
7
7
|
readonly type = MissingRuntimeNodeToken;
|
|
8
8
|
|
|
@@ -96,14 +96,14 @@ export class WorkflowSnapshotCodec {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
private mergeValue(liveValue: unknown, snapshotValue: unknown): Record<
|
|
99
|
+
private mergeValue(liveValue: unknown, snapshotValue: unknown): Record<PropertyKey, unknown> {
|
|
100
100
|
const liveRecord = this.asRecord(liveValue);
|
|
101
101
|
const snapshotRecord = this.asRecord(snapshotValue);
|
|
102
102
|
const hydrated = Object.create(
|
|
103
103
|
liveValue && typeof liveValue === "object"
|
|
104
104
|
? (Object.getPrototypeOf(liveValue) ?? Object.prototype)
|
|
105
105
|
: Object.prototype,
|
|
106
|
-
) as Record<
|
|
106
|
+
) as Record<PropertyKey, unknown>;
|
|
107
107
|
|
|
108
108
|
for (const [key, value] of Object.entries(snapshotRecord)) {
|
|
109
109
|
hydrated[key] = this.mergeNestedValue(liveRecord[key], value);
|
|
@@ -126,17 +126,21 @@ export class WorkflowSnapshotCodec {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
private restoreNonSerializableProperties(
|
|
129
|
-
liveRecord: Record<
|
|
130
|
-
hydrated: Record<
|
|
129
|
+
liveRecord: Record<PropertyKey, unknown>,
|
|
130
|
+
hydrated: Record<PropertyKey, unknown>,
|
|
131
131
|
): void {
|
|
132
132
|
for (const [key, value] of Object.entries(liveRecord)) {
|
|
133
133
|
if (typeof value === "function" || typeof value === "symbol") {
|
|
134
134
|
hydrated[key] = value;
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
+
// Preserve symbol-keyed brands (e.g. itemValue / emitPorts) and other runtime-only keys.
|
|
138
|
+
for (const sym of Object.getOwnPropertySymbols(liveRecord)) {
|
|
139
|
+
hydrated[sym] = liveRecord[sym];
|
|
140
|
+
}
|
|
137
141
|
}
|
|
138
142
|
|
|
139
|
-
private restoreTypeProperty(record: Record<
|
|
143
|
+
private restoreTypeProperty(record: Record<PropertyKey, unknown>): void {
|
|
140
144
|
const tokenId = typeof record.tokenId === "string" ? record.tokenId : undefined;
|
|
141
145
|
if (!tokenId) {
|
|
142
146
|
return;
|
|
@@ -168,10 +172,15 @@ export class WorkflowSnapshotCodec {
|
|
|
168
172
|
return undefined;
|
|
169
173
|
}
|
|
170
174
|
|
|
171
|
-
private asRecord(value: unknown): Record<
|
|
175
|
+
private asRecord(value: unknown): Record<PropertyKey, unknown> {
|
|
172
176
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
173
177
|
return {};
|
|
174
178
|
}
|
|
175
|
-
|
|
179
|
+
const record = value as Record<PropertyKey, unknown>;
|
|
180
|
+
const out: Record<PropertyKey, unknown> = { ...(record as Record<string, unknown>) };
|
|
181
|
+
for (const sym of Object.getOwnPropertySymbols(value)) {
|
|
182
|
+
out[sym] = record[sym];
|
|
183
|
+
}
|
|
184
|
+
return out;
|
|
176
185
|
}
|
|
177
186
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-BD6CobHl.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 NodeExecutor,\n NodeExecutorFactory,\n NodeInstanceFactoryFactory,\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 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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"}
|