@codemation/core 0.6.0 → 0.8.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 +31 -0
- package/dist/{EngineRuntimeRegistration.types-Dm129RJ6.d.ts → EngineRuntimeRegistration.types-BP6tsaNP.d.ts} +4 -2
- package/dist/{EngineWorkflowRunnerService-Bf88QtwB.d.cts → EngineWorkflowRunnerService-DzOCa1BW.d.cts} +4 -2
- package/dist/{InMemoryRunDataFactory-Dyl4p2s8.d.cts → InMemoryRunDataFactory-1iz7_SnO.d.cts} +27 -7
- package/dist/{workflowActivationPolicy-6V3OJD3N.cjs → InMemoryRunEventBusRegistry-B0_C4OnP.cjs} +1 -16
- package/dist/InMemoryRunEventBusRegistry-B0_C4OnP.cjs.map +1 -0
- package/dist/{workflowActivationPolicy-Td9HTOuD.js → InMemoryRunEventBusRegistry-C2U83Hmv.js} +2 -11
- package/dist/InMemoryRunEventBusRegistry-C2U83Hmv.js.map +1 -0
- package/dist/{RunIntentService-BDiodxhf.d.ts → RunIntentService-BqhmdoA1.d.ts} +258 -21
- package/dist/{RunIntentService-B1Y3v1H6.d.cts → RunIntentService-S-1lW-gS.d.cts} +209 -5
- package/dist/bootstrap/index.cjs +4 -2
- package/dist/bootstrap/index.d.cts +26 -7
- package/dist/bootstrap/index.d.ts +4 -4
- package/dist/bootstrap/index.js +3 -3
- package/dist/{bootstrap-DVL2ue5v.cjs → bootstrap-BaN6hZ5I.cjs} +7 -4
- package/dist/bootstrap-BaN6hZ5I.cjs.map +1 -0
- package/dist/{bootstrap-DdeiJ8cd.js → bootstrap-d_BMaDT4.js} +7 -4
- package/dist/bootstrap-d_BMaDT4.js.map +1 -0
- package/dist/{index-C2af8ssM.d.ts → index-CVs9rVhl.d.ts} +44 -13
- package/dist/index.cjs +59 -88
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -22
- package/dist/index.d.ts +3 -3
- package/dist/index.js +33 -75
- package/dist/index.js.map +1 -1
- package/dist/{runtime-7Xh9z3dw.js → runtime-DUW6tIJ1.js} +454 -64
- package/dist/runtime-DUW6tIJ1.js.map +1 -0
- package/dist/{runtime-DVBwxFvX.cjs → runtime-Dvo2ru5A.cjs} +589 -73
- package/dist/runtime-Dvo2ru5A.cjs.map +1 -0
- package/dist/testing.cjs +6 -6
- 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 +3 -3
- package/package.json +1 -1
- package/src/ai/AgentConfigInspectorFactory.ts +2 -2
- package/src/ai/AgentMessageConfigNormalizerFactory.ts +3 -3
- package/src/ai/AiHost.ts +4 -2
- package/src/ai/CallableToolConfig.ts +28 -3
- package/src/authoring/defineNode.types.ts +35 -9
- package/src/authoring/index.ts +1 -0
- package/src/bootstrap/index.ts +6 -1
- package/src/bootstrap/runtime/EngineRuntimeRegistrar.ts +4 -3
- package/src/bootstrap/runtime/EngineRuntimeRegistration.types.ts +3 -0
- package/src/contracts/CodemationTelemetryAttributeNames.ts +12 -0
- package/src/contracts/CodemationTelemetryMetricNames.ts +7 -0
- package/src/contracts/CostCatalogContract.ts +16 -0
- package/src/contracts/CostTrackingTelemetryContract.ts +47 -0
- package/src/contracts/GenAiTelemetryAttributeNames.ts +10 -0
- package/src/contracts/NoOpCostTrackingTelemetry.ts +16 -0
- package/src/contracts/NoOpCostTrackingTelemetryFactory.ts +9 -0
- package/src/contracts/NoOpExecutionTelemetry.ts +26 -0
- package/src/contracts/NoOpExecutionTelemetryFactory.ts +16 -0
- package/src/contracts/NoOpNodeExecutionTelemetry.ts +15 -0
- package/src/contracts/NoOpTelemetryArtifactReference.ts +9 -0
- package/src/contracts/NoOpTelemetrySpanScope.ts +22 -0
- package/src/contracts/index.ts +3 -1
- package/src/contracts/{itemValue.ts → itemExpr.ts} +31 -32
- package/src/contracts/params.ts +10 -0
- package/src/contracts/runTypes.ts +4 -1
- package/src/contracts/runtimeTypes.ts +7 -0
- package/src/contracts/telemetryTypes.ts +105 -0
- package/src/contracts/workflowTypes.ts +20 -2
- package/src/events/EventPublishingWorkflowExecutionRepository.ts +1 -1
- package/src/execution/CatalogBackedCostTrackingTelemetry.ts +81 -0
- package/src/execution/CatalogBackedCostTrackingTelemetryFactory.ts +12 -0
- package/src/execution/DefaultExecutionContextFactory.ts +23 -0
- package/src/execution/ExecutionTelemetryCostTrackingDecoratorFactory.ts +84 -0
- package/src/execution/{ItemValueResolver.ts → ItemExprResolver.ts} +5 -5
- package/src/execution/NodeActivationRequestComposer.ts +1 -0
- package/src/execution/NodeExecutionSnapshotFactory.ts +2 -0
- package/src/execution/NodeExecutor.ts +6 -6
- package/src/execution/StaticCostCatalog.ts +22 -0
- package/src/execution/WorkflowRunExecutionContextFactory.ts +2 -0
- package/src/execution/index.ts +5 -1
- package/src/index.ts +1 -1
- package/src/orchestration/NodeExecutionRequestHandlerService.ts +1 -0
- package/src/orchestration/RunContinuationService.ts +4 -0
- package/src/orchestration/RunStartService.ts +2 -0
- package/src/policies/storage/RunPolicySnapshotFactory.ts +9 -0
- package/src/runStorage/InMemoryRunData.ts +9 -5
- package/src/runStorage/InMemoryWorkflowExecutionRepository.ts +4 -2
- package/src/types/index.ts +7 -1
- package/src/workflowSnapshots/WorkflowSnapshotCodec.ts +1 -1
- package/dist/bootstrap-DVL2ue5v.cjs.map +0 -1
- package/dist/bootstrap-DdeiJ8cd.js.map +0 -1
- package/dist/runtime-7Xh9z3dw.js.map +0 -1
- package/dist/runtime-DVBwxFvX.cjs.map +0 -1
- package/dist/workflowActivationPolicy-6V3OJD3N.cjs.map +0 -1
- package/dist/workflowActivationPolicy-Td9HTOuD.js.map +0 -1
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
BinaryStorage,
|
|
3
|
+
CostTrackingTelemetryFactory,
|
|
3
4
|
ExecutionContext,
|
|
4
5
|
ExecutionContextFactory,
|
|
6
|
+
ExecutionTelemetryFactory,
|
|
5
7
|
NodeExecutionStatePublisher,
|
|
6
8
|
ParentExecutionRef,
|
|
7
9
|
RunDataSnapshot,
|
|
8
10
|
RunId,
|
|
9
11
|
WorkflowId,
|
|
10
12
|
} from "../types";
|
|
13
|
+
import { NoOpCostTrackingTelemetryFactory, NoOpExecutionTelemetryFactory } from "../types";
|
|
11
14
|
|
|
12
15
|
import {
|
|
13
16
|
DefaultExecutionBinaryService,
|
|
14
17
|
UnavailableBinaryStorage,
|
|
15
18
|
} from "../binaries/DefaultExecutionBinaryServiceFactory";
|
|
19
|
+
import { ExecutionTelemetryCostTrackingDecoratorFactory } from "./ExecutionTelemetryCostTrackingDecoratorFactory";
|
|
16
20
|
|
|
17
21
|
export class DefaultExecutionContextFactory implements ExecutionContextFactory {
|
|
22
|
+
private readonly telemetryDecoratorFactory = new ExecutionTelemetryCostTrackingDecoratorFactory();
|
|
23
|
+
|
|
18
24
|
constructor(
|
|
19
25
|
private readonly binaryStorage: BinaryStorage = new UnavailableBinaryStorage(),
|
|
26
|
+
private readonly telemetryFactory: ExecutionTelemetryFactory = new NoOpExecutionTelemetryFactory(),
|
|
27
|
+
private readonly costTrackingFactory: CostTrackingTelemetryFactory = new NoOpCostTrackingTelemetryFactory(),
|
|
20
28
|
private readonly currentDate: () => Date = () => new Date(),
|
|
21
29
|
) {}
|
|
22
30
|
|
|
@@ -24,13 +32,27 @@ export class DefaultExecutionContextFactory implements ExecutionContextFactory {
|
|
|
24
32
|
runId: RunId;
|
|
25
33
|
workflowId: WorkflowId;
|
|
26
34
|
parent?: ParentExecutionRef;
|
|
35
|
+
policySnapshot?: import("../types").PersistedRunPolicySnapshot;
|
|
27
36
|
subworkflowDepth: number;
|
|
28
37
|
engineMaxNodeActivations: number;
|
|
29
38
|
engineMaxSubworkflowDepth: number;
|
|
30
39
|
data: RunDataSnapshot;
|
|
31
40
|
nodeState?: NodeExecutionStatePublisher;
|
|
41
|
+
telemetry?: ExecutionContext["telemetry"];
|
|
32
42
|
getCredential<TSession = unknown>(slotKey: string): Promise<TSession>;
|
|
33
43
|
}): ExecutionContext {
|
|
44
|
+
const baseTelemetry =
|
|
45
|
+
args.telemetry ??
|
|
46
|
+
this.telemetryFactory.create({
|
|
47
|
+
runId: args.runId,
|
|
48
|
+
workflowId: args.workflowId,
|
|
49
|
+
parent: args.parent,
|
|
50
|
+
policySnapshot: args.policySnapshot,
|
|
51
|
+
});
|
|
52
|
+
const telemetry = this.telemetryDecoratorFactory.decorateExecutionTelemetry({
|
|
53
|
+
telemetry: baseTelemetry,
|
|
54
|
+
costTracking: baseTelemetry.costTracking ?? this.costTrackingFactory.create({ telemetry: baseTelemetry }),
|
|
55
|
+
});
|
|
34
56
|
return {
|
|
35
57
|
runId: args.runId,
|
|
36
58
|
workflowId: args.workflowId,
|
|
@@ -41,6 +63,7 @@ export class DefaultExecutionContextFactory implements ExecutionContextFactory {
|
|
|
41
63
|
now: this.currentDate,
|
|
42
64
|
data: args.data,
|
|
43
65
|
nodeState: args.nodeState,
|
|
66
|
+
telemetry,
|
|
44
67
|
binary: new DefaultExecutionBinaryService(this.binaryStorage, args.workflowId, args.runId, this.currentDate),
|
|
45
68
|
getCredential: args.getCredential,
|
|
46
69
|
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { CostTrackingTelemetry } from "../contracts/CostTrackingTelemetryContract";
|
|
2
|
+
import type {
|
|
3
|
+
ExecutionTelemetry,
|
|
4
|
+
NodeExecutionTelemetry,
|
|
5
|
+
TelemetryArtifactAttachment,
|
|
6
|
+
TelemetryArtifactReference,
|
|
7
|
+
TelemetryChildSpanStart,
|
|
8
|
+
TelemetryMetricRecord,
|
|
9
|
+
TelemetrySpanEnd,
|
|
10
|
+
TelemetrySpanEventRecord,
|
|
11
|
+
TelemetrySpanScope,
|
|
12
|
+
} from "../contracts/telemetryTypes";
|
|
13
|
+
import type { NodeActivationId, NodeId } from "../contracts/workflowTypes";
|
|
14
|
+
|
|
15
|
+
export class ExecutionTelemetryCostTrackingDecoratorFactory {
|
|
16
|
+
decorateExecutionTelemetry(args: {
|
|
17
|
+
telemetry: ExecutionTelemetry;
|
|
18
|
+
costTracking: CostTrackingTelemetry;
|
|
19
|
+
}): ExecutionTelemetry {
|
|
20
|
+
return {
|
|
21
|
+
traceId: args.telemetry.traceId,
|
|
22
|
+
spanId: args.telemetry.spanId,
|
|
23
|
+
costTracking: args.costTracking,
|
|
24
|
+
addSpanEvent: (event: TelemetrySpanEventRecord) => args.telemetry.addSpanEvent(event),
|
|
25
|
+
recordMetric: (metric: TelemetryMetricRecord) => args.telemetry.recordMetric(metric),
|
|
26
|
+
attachArtifact: (
|
|
27
|
+
artifact: TelemetryArtifactAttachment,
|
|
28
|
+
): Promise<TelemetryArtifactReference> | TelemetryArtifactReference => args.telemetry.attachArtifact(artifact),
|
|
29
|
+
forNode: (nodeArgs: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>): NodeExecutionTelemetry => {
|
|
30
|
+
const nodeTelemetry = args.telemetry.forNode(nodeArgs);
|
|
31
|
+
return this.decorateNodeExecutionTelemetry({
|
|
32
|
+
telemetry: nodeTelemetry,
|
|
33
|
+
costTracking: args.costTracking.forScope(nodeTelemetry),
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private decorateNodeExecutionTelemetry(args: {
|
|
40
|
+
telemetry: NodeExecutionTelemetry;
|
|
41
|
+
costTracking: CostTrackingTelemetry;
|
|
42
|
+
}): NodeExecutionTelemetry {
|
|
43
|
+
return {
|
|
44
|
+
traceId: args.telemetry.traceId,
|
|
45
|
+
spanId: args.telemetry.spanId,
|
|
46
|
+
costTracking: args.costTracking,
|
|
47
|
+
addSpanEvent: (event: TelemetrySpanEventRecord) => args.telemetry.addSpanEvent(event),
|
|
48
|
+
recordMetric: (metric: TelemetryMetricRecord) => args.telemetry.recordMetric(metric),
|
|
49
|
+
attachArtifact: (
|
|
50
|
+
artifact: TelemetryArtifactAttachment,
|
|
51
|
+
): Promise<TelemetryArtifactReference> | TelemetryArtifactReference => args.telemetry.attachArtifact(artifact),
|
|
52
|
+
end: (endArgs?: TelemetrySpanEnd) => args.telemetry.end(endArgs),
|
|
53
|
+
startChildSpan: (spanArgs: TelemetryChildSpanStart): TelemetrySpanScope =>
|
|
54
|
+
this.decorateTelemetrySpanScope({
|
|
55
|
+
scope: args.telemetry.startChildSpan(spanArgs),
|
|
56
|
+
costTracking: args.costTracking,
|
|
57
|
+
}),
|
|
58
|
+
forNode: (nodeArgs: Readonly<{ nodeId: NodeId; activationId: NodeActivationId }>): NodeExecutionTelemetry => {
|
|
59
|
+
const nodeTelemetry = args.telemetry.forNode(nodeArgs);
|
|
60
|
+
return this.decorateNodeExecutionTelemetry({
|
|
61
|
+
telemetry: nodeTelemetry,
|
|
62
|
+
costTracking: args.costTracking.forScope(nodeTelemetry),
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private decorateTelemetrySpanScope(args: {
|
|
69
|
+
scope: TelemetrySpanScope;
|
|
70
|
+
costTracking: CostTrackingTelemetry;
|
|
71
|
+
}): TelemetrySpanScope {
|
|
72
|
+
return {
|
|
73
|
+
traceId: args.scope.traceId,
|
|
74
|
+
spanId: args.scope.spanId,
|
|
75
|
+
costTracking: args.costTracking.forScope(args.scope),
|
|
76
|
+
addSpanEvent: (event: TelemetrySpanEventRecord) => args.scope.addSpanEvent(event),
|
|
77
|
+
recordMetric: (metric: TelemetryMetricRecord) => args.scope.recordMetric(metric),
|
|
78
|
+
attachArtifact: (
|
|
79
|
+
artifact: TelemetryArtifactAttachment,
|
|
80
|
+
): Promise<TelemetryArtifactReference> | TelemetryArtifactReference => args.scope.attachArtifact(artifact),
|
|
81
|
+
end: (endArgs?: TelemetrySpanEnd) => args.scope.end(endArgs),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveItemExprsForExecution } from "../contracts/itemExpr";
|
|
2
2
|
import type { Item, NodeExecutionContext, RunnableNodeConfig } from "../types";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Resolves {@link import("../contracts/
|
|
5
|
+
* Resolves {@link import("../contracts/itemExpr").ItemExpr} leaves on runnable config before {@link RunnableNode.execute}.
|
|
6
6
|
*/
|
|
7
|
-
export class
|
|
7
|
+
export class ItemExprResolver {
|
|
8
8
|
async resolveConfigForItem<TConfig extends RunnableNodeConfig<any, any>>(
|
|
9
9
|
ctx: NodeExecutionContext<TConfig>,
|
|
10
10
|
item: Item,
|
|
@@ -12,9 +12,9 @@ export class ItemValueResolver {
|
|
|
12
12
|
items: ReadonlyArray<Item>,
|
|
13
13
|
): Promise<NodeExecutionContext<TConfig>> {
|
|
14
14
|
if (!ctx) {
|
|
15
|
-
throw new Error("
|
|
15
|
+
throw new Error("ItemExprResolver.resolveConfigForItem: ctx is required");
|
|
16
16
|
}
|
|
17
|
-
const resolvedConfig = await
|
|
17
|
+
const resolvedConfig = await resolveItemExprsForExecution(ctx.config, ctx, item, itemIndex, items);
|
|
18
18
|
const merged = resolvedConfig !== undefined && resolvedConfig !== null ? resolvedConfig : ctx.config;
|
|
19
19
|
if (merged === undefined || merged === null) {
|
|
20
20
|
return ctx;
|
|
@@ -142,6 +142,7 @@ export class NodeActivationRequestComposer {
|
|
|
142
142
|
nodeId: definition.id,
|
|
143
143
|
activationId,
|
|
144
144
|
config: definition.config,
|
|
145
|
+
telemetry: args.base.telemetry.forNode({ nodeId: definition.id, activationId }),
|
|
145
146
|
binary: args.base.binary.forNode({ nodeId: definition.id, activationId }),
|
|
146
147
|
getCredential: this.credentialResolverFactory.create(args.workflowId, definition.id, definition.config),
|
|
147
148
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
JsonValue,
|
|
2
3
|
NodeActivationId,
|
|
3
4
|
NodeExecutionSnapshot,
|
|
4
5
|
NodeId,
|
|
@@ -146,6 +147,7 @@ export class NodeExecutionSnapshotFactory {
|
|
|
146
147
|
message: args.error.message,
|
|
147
148
|
name: args.error.name,
|
|
148
149
|
stack: args.error.stack,
|
|
150
|
+
details: (args.error as Error & { details?: JsonValue }).details,
|
|
149
151
|
},
|
|
150
152
|
};
|
|
151
153
|
}
|
|
@@ -15,7 +15,7 @@ import type {
|
|
|
15
15
|
} from "../types";
|
|
16
16
|
|
|
17
17
|
import { FanInMergeByOriginMerger } from "./FanInMergeByOriginMerger";
|
|
18
|
-
import {
|
|
18
|
+
import { ItemExprResolver } from "./ItemExprResolver";
|
|
19
19
|
import { InProcessRetryRunner } from "./InProcessRetryRunner";
|
|
20
20
|
import { NodeOutputNormalizer } from "./NodeOutputNormalizer";
|
|
21
21
|
import { RunnableOutputBehaviorResolver } from "./RunnableOutputBehaviorResolver";
|
|
@@ -23,16 +23,16 @@ import { RunnableOutputBehaviorResolver } from "./RunnableOutputBehaviorResolver
|
|
|
23
23
|
export class NodeExecutor {
|
|
24
24
|
private readonly fanInMerger = new FanInMergeByOriginMerger();
|
|
25
25
|
private readonly outputNormalizer = new NodeOutputNormalizer();
|
|
26
|
-
private readonly
|
|
26
|
+
private readonly itemExprResolver: ItemExprResolver;
|
|
27
27
|
private readonly outputBehaviorResolver: RunnableOutputBehaviorResolver;
|
|
28
28
|
|
|
29
29
|
constructor(
|
|
30
30
|
private readonly nodeInstanceFactory: WorkflowNodeInstanceFactory,
|
|
31
31
|
private readonly retryRunner: InProcessRetryRunner,
|
|
32
|
-
|
|
32
|
+
itemExprResolver?: ItemExprResolver,
|
|
33
33
|
outputBehaviorResolver?: RunnableOutputBehaviorResolver,
|
|
34
34
|
) {
|
|
35
|
-
this.
|
|
35
|
+
this.itemExprResolver = itemExprResolver ?? new ItemExprResolver();
|
|
36
36
|
this.outputBehaviorResolver = outputBehaviorResolver ?? new RunnableOutputBehaviorResolver();
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -135,7 +135,7 @@ export class NodeExecutor {
|
|
|
135
135
|
const syntheticItem: Item = { json: {} };
|
|
136
136
|
const parsed = inputSchema.parse(syntheticItem.json);
|
|
137
137
|
const runnableCtx = request.ctx as NodeExecutionContext<RunnableNodeConfig>;
|
|
138
|
-
const resolvedCtx = await this.
|
|
138
|
+
const resolvedCtx = await this.itemExprResolver.resolveConfigForItem(runnableCtx, syntheticItem, 0, inputBatch);
|
|
139
139
|
const ctx = this.pickExecutionContext(runnableCtx, resolvedCtx);
|
|
140
140
|
const args: RunnableNodeExecuteArgs = {
|
|
141
141
|
input: parsed,
|
|
@@ -157,7 +157,7 @@ export class NodeExecutor {
|
|
|
157
157
|
this.assertItemJsonNotTopLevelArray(request.nodeId, item);
|
|
158
158
|
const parsed = inputSchema.parse(item.json);
|
|
159
159
|
const runnableCtx = request.ctx as NodeExecutionContext<RunnableNodeConfig>;
|
|
160
|
-
const resolvedCtx = await this.
|
|
160
|
+
const resolvedCtx = await this.itemExprResolver.resolveConfigForItem(runnableCtx, item, i, inputBatch);
|
|
161
161
|
const ctx = this.pickExecutionContext(runnableCtx, resolvedCtx);
|
|
162
162
|
const args: RunnableNodeExecuteArgs = {
|
|
163
163
|
input: parsed,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CostCatalog, CostCatalogEntry } from "../contracts/CostCatalogContract";
|
|
2
|
+
import type { CostTrackingUsageRecord } from "../contracts/CostTrackingTelemetryContract";
|
|
3
|
+
|
|
4
|
+
export class StaticCostCatalog implements CostCatalog {
|
|
5
|
+
private readonly entriesByKey: ReadonlyMap<string, CostCatalogEntry>;
|
|
6
|
+
|
|
7
|
+
constructor(entries: ReadonlyArray<CostCatalogEntry>) {
|
|
8
|
+
this.entriesByKey = new Map(entries.map((entry) => [this.createKeyFromEntry(entry), entry]));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
findEntry(args: CostTrackingUsageRecord): CostCatalogEntry | undefined {
|
|
12
|
+
return this.entriesByKey.get(this.createKeyFromUsage(args));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
private createKeyFromEntry(entry: CostCatalogEntry): string {
|
|
16
|
+
return `${entry.component}::${entry.provider}::${entry.operation}::${entry.pricingKey}::${entry.usageUnit}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private createKeyFromUsage(args: CostTrackingUsageRecord): string {
|
|
20
|
+
return `${args.component}::${args.provider}::${args.operation}::${args.pricingKey}::${args.usageUnit}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -24,6 +24,7 @@ export class WorkflowRunExecutionContextFactory {
|
|
|
24
24
|
workflowId: WorkflowId;
|
|
25
25
|
nodeId: NodeId;
|
|
26
26
|
parent?: ParentExecutionRef;
|
|
27
|
+
policySnapshot?: import("../types").PersistedRunPolicySnapshot;
|
|
27
28
|
subworkflowDepth: number;
|
|
28
29
|
engineMaxNodeActivations: number;
|
|
29
30
|
engineMaxSubworkflowDepth: number;
|
|
@@ -34,6 +35,7 @@ export class WorkflowRunExecutionContextFactory {
|
|
|
34
35
|
runId: args.runId,
|
|
35
36
|
workflowId: args.workflowId,
|
|
36
37
|
parent: args.parent,
|
|
38
|
+
policySnapshot: args.policySnapshot,
|
|
37
39
|
subworkflowDepth: args.subworkflowDepth,
|
|
38
40
|
engineMaxNodeActivations: args.engineMaxNodeActivations,
|
|
39
41
|
engineMaxSubworkflowDepth: args.engineMaxSubworkflowDepth,
|
package/src/execution/index.ts
CHANGED
|
@@ -4,8 +4,11 @@ export { NodeInputContractError } from "./NodeInputContractError";
|
|
|
4
4
|
export { CredentialResolverFactory } from "./CredentialResolverFactory";
|
|
5
5
|
export { DefaultAsyncSleeper } from "./DefaultAsyncSleeper";
|
|
6
6
|
export { DefaultExecutionContextFactory } from "./DefaultExecutionContextFactory";
|
|
7
|
+
export { CatalogBackedCostTrackingTelemetry } from "./CatalogBackedCostTrackingTelemetry";
|
|
8
|
+
export { CatalogBackedCostTrackingTelemetryFactory } from "./CatalogBackedCostTrackingTelemetryFactory";
|
|
9
|
+
export { ExecutionTelemetryCostTrackingDecoratorFactory } from "./ExecutionTelemetryCostTrackingDecoratorFactory";
|
|
7
10
|
export { InProcessRetryRunner } from "./InProcessRetryRunner";
|
|
8
|
-
export {
|
|
11
|
+
export { ItemExprResolver } from "./ItemExprResolver";
|
|
9
12
|
export { NodeOutputNormalizer } from "./NodeOutputNormalizer";
|
|
10
13
|
export { RunnableOutputBehaviorResolver } from "./RunnableOutputBehaviorResolver";
|
|
11
14
|
export { InProcessRetryRunnerFactory } from "./InProcessRetryRunnerFactory";
|
|
@@ -21,6 +24,7 @@ export { NodeRunStateWriterFactory } from "./NodeRunStateWriterFactory";
|
|
|
21
24
|
export { PersistedRunStateTerminalBuilder } from "./PersistedRunStateTerminalBuilder";
|
|
22
25
|
export { RunStateSemantics } from "./RunStateSemantics";
|
|
23
26
|
export { WorkflowRunExecutionContextFactory } from "./WorkflowRunExecutionContextFactory";
|
|
27
|
+
export { StaticCostCatalog } from "./StaticCostCatalog";
|
|
24
28
|
export type { AsyncSleeper } from "./asyncSleeper.types";
|
|
25
29
|
export { RunContinuationService } from "../orchestration/RunContinuationService";
|
|
26
30
|
export { RunStartService } from "../orchestration/RunStartService";
|
package/src/index.ts
CHANGED
|
@@ -71,6 +71,7 @@ export class NodeExecutionRequestHandlerService implements NodeExecutionRequestH
|
|
|
71
71
|
workflowId: state.workflowId,
|
|
72
72
|
nodeId: request.nodeId,
|
|
73
73
|
parent: resolvedParent,
|
|
74
|
+
policySnapshot: state.policySnapshot,
|
|
74
75
|
subworkflowDepth: state.executionOptions?.subworkflowDepth ?? 0,
|
|
75
76
|
engineMaxNodeActivations: limits.engineMaxNodeActivations,
|
|
76
77
|
engineMaxSubworkflowDepth: limits.engineMaxSubworkflowDepth,
|
|
@@ -135,6 +135,7 @@ export class RunContinuationService {
|
|
|
135
135
|
workflowId: state.workflowId,
|
|
136
136
|
nodeId: args.nodeId,
|
|
137
137
|
parent: state.parent,
|
|
138
|
+
policySnapshot: state.policySnapshot,
|
|
138
139
|
subworkflowDepth: state.executionOptions?.subworkflowDepth ?? 0,
|
|
139
140
|
engineMaxNodeActivations: limits.engineMaxNodeActivations,
|
|
140
141
|
engineMaxSubworkflowDepth: limits.engineMaxSubworkflowDepth,
|
|
@@ -748,6 +749,7 @@ export class RunContinuationService {
|
|
|
748
749
|
workflowId: args.state.workflowId,
|
|
749
750
|
nodeId: nextDefinition.id,
|
|
750
751
|
parent: args.state.parent,
|
|
752
|
+
policySnapshot: args.state.policySnapshot,
|
|
751
753
|
subworkflowDepth: args.state.executionOptions?.subworkflowDepth ?? 0,
|
|
752
754
|
engineMaxNodeActivations: webhookLimits.engineMaxNodeActivations,
|
|
753
755
|
engineMaxSubworkflowDepth: webhookLimits.engineMaxSubworkflowDepth,
|
|
@@ -851,6 +853,7 @@ export class RunContinuationService {
|
|
|
851
853
|
workflowId: state.workflowId,
|
|
852
854
|
nodeId,
|
|
853
855
|
parent: state.parent,
|
|
856
|
+
policySnapshot: state.policySnapshot,
|
|
854
857
|
subworkflowDepth: state.executionOptions?.subworkflowDepth ?? 0,
|
|
855
858
|
engineMaxNodeActivations: limits.engineMaxNodeActivations,
|
|
856
859
|
engineMaxSubworkflowDepth: limits.engineMaxSubworkflowDepth,
|
|
@@ -864,6 +867,7 @@ export class RunContinuationService {
|
|
|
864
867
|
nodeId,
|
|
865
868
|
activationId,
|
|
866
869
|
config: def.config,
|
|
870
|
+
telemetry: base.telemetry.forNode({ nodeId, activationId }),
|
|
867
871
|
binary: base.binary.forNode({ nodeId, activationId }),
|
|
868
872
|
getCredential: this.credentialResolverFactory.create(wf.id, nodeId, def.config),
|
|
869
873
|
};
|
|
@@ -90,6 +90,7 @@ export class RunStartService {
|
|
|
90
90
|
workflowId: workflow.id,
|
|
91
91
|
nodeId: startAt,
|
|
92
92
|
parent,
|
|
93
|
+
policySnapshot,
|
|
93
94
|
subworkflowDepth: mergedExecutionOptions.subworkflowDepth ?? 0,
|
|
94
95
|
engineMaxNodeActivations: mergedExecutionOptions.maxNodeActivations!,
|
|
95
96
|
engineMaxSubworkflowDepth: mergedExecutionOptions.maxSubworkflowDepth!,
|
|
@@ -199,6 +200,7 @@ export class RunStartService {
|
|
|
199
200
|
request.workflow,
|
|
200
201
|
) ?? "unknown_node",
|
|
201
202
|
parent: request.parent,
|
|
203
|
+
policySnapshot,
|
|
202
204
|
subworkflowDepth: mergedExecutionOptions.subworkflowDepth ?? 0,
|
|
203
205
|
engineMaxNodeActivations: mergedExecutionOptions.maxNodeActivations!,
|
|
204
206
|
engineMaxSubworkflowDepth: mergedExecutionOptions.maxSubworkflowDepth!,
|
|
@@ -10,6 +10,12 @@ export class RunPolicySnapshotFactory {
|
|
|
10
10
|
const prune = workflow.prunePolicy;
|
|
11
11
|
const retentionSeconds = prune?.runDataRetentionSeconds ?? defaults?.retentionSeconds;
|
|
12
12
|
const binaryRetentionSeconds = prune?.binaryRetentionSeconds ?? defaults?.binaryRetentionSeconds;
|
|
13
|
+
const telemetrySpanRetentionSeconds =
|
|
14
|
+
prune?.telemetrySpanRetentionSeconds ?? defaults?.telemetrySpanRetentionSeconds;
|
|
15
|
+
const telemetryArtifactRetentionSeconds =
|
|
16
|
+
prune?.telemetryArtifactRetentionSeconds ?? defaults?.telemetryArtifactRetentionSeconds;
|
|
17
|
+
const telemetryMetricRetentionSeconds =
|
|
18
|
+
prune?.telemetryMetricRetentionSeconds ?? defaults?.telemetryMetricRetentionSeconds;
|
|
13
19
|
const storagePolicy: WorkflowStoragePolicyMode =
|
|
14
20
|
typeof workflow.storagePolicy === "string"
|
|
15
21
|
? (workflow.storagePolicy as WorkflowStoragePolicyMode)
|
|
@@ -17,6 +23,9 @@ export class RunPolicySnapshotFactory {
|
|
|
17
23
|
return {
|
|
18
24
|
retentionSeconds,
|
|
19
25
|
binaryRetentionSeconds,
|
|
26
|
+
telemetrySpanRetentionSeconds,
|
|
27
|
+
telemetryArtifactRetentionSeconds,
|
|
28
|
+
telemetryMetricRetentionSeconds,
|
|
20
29
|
storagePolicy,
|
|
21
30
|
};
|
|
22
31
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Items, MutableRunData, NodeId, NodeOutputs, OutputPortKey } from "../types";
|
|
1
|
+
import type { Items, MutableRunData, NodeId, NodeIdRef, NodeOutputs, OutputPortKey, Item } from "../types";
|
|
2
2
|
|
|
3
3
|
export class InMemoryRunData implements MutableRunData {
|
|
4
4
|
private readonly byNode = new Map<NodeId, NodeOutputs>();
|
|
@@ -17,12 +17,16 @@ export class InMemoryRunData implements MutableRunData {
|
|
|
17
17
|
return this.byNode.get(nodeId);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
getOutputItems(nodeId: NodeId
|
|
21
|
-
return this.byNode.get(nodeId)?.[output] ?? []
|
|
20
|
+
getOutputItems<TJson = unknown>(nodeId: NodeId | NodeIdRef<TJson>, output: OutputPortKey = "main"): Items<TJson> {
|
|
21
|
+
return (this.byNode.get(nodeId)?.[output] ?? []) as Items<TJson>;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
getOutputItem
|
|
25
|
-
|
|
24
|
+
getOutputItem<TJson = unknown>(
|
|
25
|
+
nodeId: NodeId | NodeIdRef<TJson>,
|
|
26
|
+
itemIndex: number,
|
|
27
|
+
output: OutputPortKey = "main",
|
|
28
|
+
): Item<TJson> | undefined {
|
|
29
|
+
return this.getOutputItems<TJson>(nodeId, output)[itemIndex];
|
|
26
30
|
}
|
|
27
31
|
|
|
28
32
|
dump(): Record<NodeId, NodeOutputs> {
|
|
@@ -87,14 +87,16 @@ export class InMemoryWorkflowExecutionRepository
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
async listRunsOlderThan(
|
|
90
|
-
args: Readonly<{
|
|
90
|
+
args: Readonly<{ nowIso: string; defaultRetentionSeconds: number; limit?: number }>,
|
|
91
91
|
): Promise<ReadonlyArray<RunPruneCandidate>> {
|
|
92
92
|
const limit = args.limit ?? 100;
|
|
93
93
|
const out: RunPruneCandidate[] = [];
|
|
94
94
|
for (const s of this.runs.values()) {
|
|
95
95
|
if (s.status !== "completed" && s.status !== "failed") continue;
|
|
96
96
|
const finishedAt = RunFinishedAtFactory.resolveIso(s);
|
|
97
|
-
|
|
97
|
+
const retentionSeconds = s.policySnapshot?.retentionSeconds ?? args.defaultRetentionSeconds;
|
|
98
|
+
const cutoffIso = new Date(new Date(args.nowIso).getTime() - retentionSeconds * 1000).toISOString();
|
|
99
|
+
if (!finishedAt || finishedAt >= cutoffIso) continue;
|
|
98
100
|
out.push({
|
|
99
101
|
runId: s.runId,
|
|
100
102
|
workflowId: s.workflowId,
|
package/src/types/index.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
export * from "../contracts/emitPorts";
|
|
2
2
|
export * from "../contracts/itemMeta";
|
|
3
|
-
export * from "../contracts/
|
|
3
|
+
export * from "../contracts/params";
|
|
4
|
+
export * from "../contracts/itemExpr";
|
|
4
5
|
export * from "../contracts/retryPolicySpec.types";
|
|
5
6
|
export * from "../contracts/NoRetryPolicy";
|
|
6
7
|
export * from "../contracts/RetryPolicy";
|
|
7
8
|
export * from "../contracts/ExpRetryPolicy";
|
|
8
9
|
export * from "../contracts/credentialTypes";
|
|
10
|
+
export * from "../contracts/CostCatalogContract";
|
|
11
|
+
export * from "../contracts/CostTrackingTelemetryContract";
|
|
12
|
+
export * from "../contracts/NoOpCostTrackingTelemetry";
|
|
13
|
+
export * from "../contracts/NoOpCostTrackingTelemetryFactory";
|
|
9
14
|
export * from "../contracts/executionPersistenceContracts";
|
|
10
15
|
export * from "../contracts/runtimeTypes";
|
|
16
|
+
export * from "../contracts/telemetryTypes";
|
|
11
17
|
export * from "../contracts/runFinishedAtFactory";
|
|
12
18
|
export * from "../contracts/runTypes";
|
|
13
19
|
export * from "../contracts/webhookTypes";
|
|
@@ -134,7 +134,7 @@ export class WorkflowSnapshotCodec {
|
|
|
134
134
|
hydrated[key] = value;
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
-
// Preserve symbol-keyed brands (e.g.
|
|
137
|
+
// Preserve symbol-keyed brands (e.g. itemExpr / emitPorts) and other runtime-only keys.
|
|
138
138
|
for (const sym of Object.getOwnPropertySymbols(liveRecord)) {
|
|
139
139
|
hydrated[sym] = liveRecord[sym];
|
|
140
140
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-DVL2ue5v.cjs","names":["EngineExecutionLimitsPolicy","ENGINE_EXECUTION_LIMITS_DEFAULTS","RunFinishedAtFactory","out: RunPruneCandidate[]","RunFinishedAtFactory","InlineDrivingScheduler","ItemValueResolver","NodeOutputNormalizer","RunnableOutputBehaviorResolver","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 RunnableOutputBehaviorResolver,\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 if (!container.isRegistered(RunnableOutputBehaviorResolver, true)) {\n container.registerSingleton(RunnableOutputBehaviorResolver, RunnableOutputBehaviorResolver);\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(\n dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory),\n retryRunner,\n dependencyContainer.resolve(RunnableOutputBehaviorResolver),\n );\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-DdeiJ8cd.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 RunnableOutputBehaviorResolver,\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 if (!container.isRegistered(RunnableOutputBehaviorResolver, true)) {\n container.registerSingleton(RunnableOutputBehaviorResolver, RunnableOutputBehaviorResolver);\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(\n dependencyContainer.resolve(CoreTokens.WorkflowNodeInstanceFactory),\n retryRunner,\n dependencyContainer.resolve(RunnableOutputBehaviorResolver),\n );\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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"}
|