@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
package/dist/testing.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const require_runtime = require('./runtime-
|
|
2
|
-
const require_workflowActivationPolicy = require('./workflowActivationPolicy-
|
|
3
|
-
const require_bootstrap = require('./bootstrap-
|
|
1
|
+
const require_runtime = require('./runtime-feFn8OmG.cjs');
|
|
2
|
+
const require_workflowActivationPolicy = require('./workflowActivationPolicy-6V3OJD3N.cjs');
|
|
3
|
+
const require_bootstrap = require('./bootstrap-DHH2uo-W.cjs');
|
|
4
4
|
let tsyringe = require("tsyringe");
|
|
5
5
|
tsyringe = require_runtime.__toESM(tsyringe);
|
|
6
6
|
|
|
@@ -23,7 +23,7 @@ var RejectingCredentialSessionService = class {
|
|
|
23
23
|
var ItemHarnessNode = class {
|
|
24
24
|
kind = "node";
|
|
25
25
|
outputPorts = ["main"];
|
|
26
|
-
async
|
|
26
|
+
async execute(args) {
|
|
27
27
|
return await args.ctx.config.runOne({
|
|
28
28
|
input: args.input,
|
|
29
29
|
item: args.item,
|
|
@@ -37,8 +37,8 @@ var ItemHarnessNode = class {
|
|
|
37
37
|
//#endregion
|
|
38
38
|
//#region src/testing/ItemHarnessNodeConfig.ts
|
|
39
39
|
/**
|
|
40
|
-
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema}
|
|
41
|
-
*
|
|
40
|
+
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema},
|
|
41
|
+
* then {@link ItemHarnessNode.execute} per item.
|
|
42
42
|
*/
|
|
43
43
|
var ItemHarnessNodeConfig = class {
|
|
44
44
|
kind = "node";
|
|
@@ -49,9 +49,6 @@ var ItemHarnessNodeConfig = class {
|
|
|
49
49
|
this.runOne = runOne;
|
|
50
50
|
this.opts = opts;
|
|
51
51
|
}
|
|
52
|
-
get mapInput() {
|
|
53
|
-
return this.opts.mapInput;
|
|
54
|
-
}
|
|
55
52
|
get id() {
|
|
56
53
|
return this.opts.id;
|
|
57
54
|
}
|
|
@@ -139,9 +136,13 @@ var InMemoryTriggerSetupStateRepository = class {
|
|
|
139
136
|
var SubWorkflowRunnerConfig = class {
|
|
140
137
|
kind = "node";
|
|
141
138
|
type = SubWorkflowRunnerNode;
|
|
139
|
+
workflowId;
|
|
140
|
+
startAt;
|
|
142
141
|
constructor(name, args) {
|
|
143
142
|
this.name = name;
|
|
144
143
|
this.args = args;
|
|
144
|
+
this.workflowId = args.workflowId;
|
|
145
|
+
this.startAt = args.startAt;
|
|
145
146
|
}
|
|
146
147
|
get id() {
|
|
147
148
|
return this.args.id;
|
|
@@ -149,12 +150,6 @@ var SubWorkflowRunnerConfig = class {
|
|
|
149
150
|
get execution() {
|
|
150
151
|
return this.args.execution;
|
|
151
152
|
}
|
|
152
|
-
get workflowId() {
|
|
153
|
-
return this.args.workflowId;
|
|
154
|
-
}
|
|
155
|
-
get startAt() {
|
|
156
|
-
return this.args.startAt;
|
|
157
|
-
}
|
|
158
153
|
};
|
|
159
154
|
var SubWorkflowRunnerNode = class {
|
|
160
155
|
kind = "node";
|
|
@@ -162,27 +157,23 @@ var SubWorkflowRunnerNode = class {
|
|
|
162
157
|
constructor(workflows) {
|
|
163
158
|
this.workflows = workflows;
|
|
164
159
|
}
|
|
165
|
-
async execute(
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (result.status !== "completed") throw new Error(`Subworkflow ${ctx.config.workflowId} did not complete (status=${result.status})`);
|
|
183
|
-
out.push(...result.outputs);
|
|
184
|
-
}
|
|
185
|
-
return { main: out };
|
|
160
|
+
async execute(args) {
|
|
161
|
+
const current = args.item;
|
|
162
|
+
const result = await this.workflows.runById({
|
|
163
|
+
workflowId: args.ctx.config.workflowId,
|
|
164
|
+
startAt: args.ctx.config.startAt,
|
|
165
|
+
items: [current],
|
|
166
|
+
parent: {
|
|
167
|
+
runId: args.ctx.runId,
|
|
168
|
+
workflowId: args.ctx.workflowId,
|
|
169
|
+
nodeId: args.ctx.nodeId,
|
|
170
|
+
subworkflowDepth: args.ctx.subworkflowDepth,
|
|
171
|
+
engineMaxNodeActivations: args.ctx.engineMaxNodeActivations,
|
|
172
|
+
engineMaxSubworkflowDepth: args.ctx.engineMaxSubworkflowDepth
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
if (result.status !== "completed") throw new Error(`Subworkflow ${args.ctx.config.workflowId} did not complete (status=${result.status})`);
|
|
176
|
+
return require_runtime.emitPorts({ main: result.outputs });
|
|
186
177
|
}
|
|
187
178
|
};
|
|
188
179
|
|
|
@@ -208,6 +199,18 @@ var WorkflowTestHarnessManualTriggerNode = class {
|
|
|
208
199
|
}
|
|
209
200
|
};
|
|
210
201
|
|
|
202
|
+
//#endregion
|
|
203
|
+
//#region src/testing/SwitchHarnessNode.ts
|
|
204
|
+
var SwitchHarnessNode = class {
|
|
205
|
+
kind = "node";
|
|
206
|
+
outputPorts = [];
|
|
207
|
+
async execute(args) {
|
|
208
|
+
const key = await Promise.resolve(args.ctx.config.cfg.resolveCaseKey(args.item, args.itemIndex, args.items, args.ctx));
|
|
209
|
+
const { cases, defaultCase } = args.ctx.config.cfg;
|
|
210
|
+
return require_runtime.emitPorts({ [cases.includes(key) ? key : defaultCase]: [args.item] });
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
|
|
211
214
|
//#endregion
|
|
212
215
|
//#region src/testing/RegistrarEngineTestKitFactory.ts
|
|
213
216
|
var RegistrarEngineTestKitFactory = class {
|
|
@@ -252,6 +255,7 @@ var RegistrarEngineTestKitFactory = class {
|
|
|
252
255
|
const workflowRunner = options.workflowRunner ?? dependencyContainer.resolve(require_runtime.CoreTokens.WorkflowRunnerService);
|
|
253
256
|
dependencyContainer.registerInstance(SubWorkflowRunnerNode, new SubWorkflowRunnerNode(workflowRunner));
|
|
254
257
|
dependencyContainer.registerInstance(ItemHarnessNode, new ItemHarnessNode());
|
|
258
|
+
dependencyContainer.registerInstance(SwitchHarnessNode, new SwitchHarnessNode());
|
|
255
259
|
dependencyContainer.registerInstance(WorkflowTestHarnessManualTriggerNode, new WorkflowTestHarnessManualTriggerNode());
|
|
256
260
|
const start = async (workflows) => {
|
|
257
261
|
await engine.start([...workflows]);
|
package/dist/testing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.cjs","names":["name: string","inputSchema: ZodType<TIn>","runOne: (args: {\n input: TIn;\n item: Item<TWire>;\n itemIndex: number;\n items: Items<TWire>;\n ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut, TWire>>;\n }) => TOut | Promise<TOut>","opts: Readonly<{\n id?: string;\n mapInput?: ItemInputMapper<TWire, TIn>;\n }>","prefix: string","makeRunIdValue: () => string","makeActivationIdValue: () => string","name: string","args: Readonly<{\n workflowId: WorkflowId;\n startAt?: NodeId;\n id?: string;\n execution?: Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }>;\n }>","workflows: WorkflowRunnerService","out: Item[]","name: string","id?: string","InMemoryWorkflowExecutionRepository","HintOnlyOffloadPolicy","InMemoryRunEventBus","InMemoryLiveWorkflowRepository","InMemoryRunDataFactory","DefaultExecutionContextFactory","tsyringeContainer","DefaultDrivingScheduler","InlineDrivingScheduler","NodeExecutor","NodeInstanceFactory","InProcessRetryRunner","DefaultAsyncSleeper","CoreTokens","PersistedWorkflowTokenRegistry","AllWorkflowsActiveWorkflowActivationPolicy","EngineRuntimeRegistrar","Engine","RunIntentService","runToCompletion: RegistrarEngineTestKitHandle[\"runToCompletion\"]","runIntentStartToCompletion: RegistrarEngineTestKitHandle[\"runIntentStartToCompletion\"]","WorkflowBuilder"],"sources":["../src/testing/RejectingCredentialSessionService.ts","../src/testing/ItemHarnessNode.ts","../src/testing/ItemHarnessNodeConfig.ts","../src/testing/CapturingScheduler.ts","../src/testing/PrefixedSequentialIdGenerator.ts","../src/testing/EngineTestKitRunIdFactory.ts","../src/testing/InMemoryTriggerSetupStateRepository.ts","../src/testing/SubWorkflowRunnerTestNode.ts","../src/testing/WorkflowTestHarnessManualTrigger.ts","../src/testing/RegistrarEngineTestKitFactory.ts","../src/testing/WorkflowTestKitNodeRegistrationContextFactory.ts","../src/testing/WorkflowTestKitRunNodeWorkflowFactory.ts","../src/testing/WorkflowTestKitBuilder.ts"],"sourcesContent":["import type { CredentialSessionService } from \"../contracts/credentialTypes\";\n\n/**\n * Test harness default: rejects any credential lookup so missing bindings fail loudly.\n * Prefer registering a real {@link CredentialSessionService} in integration scenarios.\n */\nexport class RejectingCredentialSessionService implements CredentialSessionService {\n async getSession<TSession = unknown>(\n args: Readonly<{ workflowId: string; nodeId: string; slotKey: string }>,\n ): Promise<TSession> {\n throw new Error(\n `Credential sessions are unavailable for workflow ${args.workflowId} node ${args.nodeId} slot \"${args.slotKey}\". Register a real CredentialSessionService implementation before executing workflows.`,\n );\n }\n}\n","import type { Item, ItemNode, Items, NodeExecutionContext } from \"../types\";\n\nimport type { ItemHarnessNodeConfig } from \"./ItemHarnessNodeConfig\";\n\n/**\n * Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).\n */\nexport class ItemHarnessNode implements ItemNode<ItemHarnessNodeConfig<any, any, any>, unknown, unknown> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async executeOne(args: {\n input: unknown;\n item: Item;\n itemIndex: number;\n items: Items;\n ctx: NodeExecutionContext<ItemHarnessNodeConfig<any, any, any>>;\n }): Promise<unknown> {\n return await args.ctx.config.runOne({\n input: args.input as never,\n item: args.item,\n itemIndex: args.itemIndex,\n items: args.items,\n ctx: args.ctx,\n });\n }\n}\n","import type { ZodType } from \"zod\";\n\nimport type { TypeToken } from \"../di\";\nimport type { Item, ItemInputMapper, Items, NodeExecutionContext, RunnableNodeConfig } from \"../types\";\n\nimport { ItemHarnessNode } from \"./ItemHarnessNode\";\n\n/**\n * Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema} +\n * optional {@link RunnableNodeConfig.mapInput}, then {@link ItemHarnessNode.executeOne} per item.\n */\nexport class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown, TWire = TIn> implements RunnableNodeConfig<\n TIn,\n TOut,\n TWire\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = ItemHarnessNode;\n\n constructor(\n public readonly name: string,\n public readonly inputSchema: ZodType<TIn>,\n public readonly runOne: (args: {\n input: TIn;\n item: Item<TWire>;\n itemIndex: number;\n items: Items<TWire>;\n ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut, TWire>>;\n }) => TOut | Promise<TOut>,\n public readonly opts: Readonly<{\n id?: string;\n mapInput?: ItemInputMapper<TWire, TIn>;\n }> = {},\n ) {}\n\n get mapInput(): ItemInputMapper<TWire, TIn> | undefined {\n return this.opts.mapInput;\n }\n\n get id(): string | undefined {\n return this.opts.id;\n }\n}\n","import type { NodeExecutionRequest, NodeExecutionScheduler } from \"../types\";\n\n/**\n * Test scheduler that records enqueue requests without executing a real queue.\n */\nexport class CapturingScheduler implements NodeExecutionScheduler {\n lastRequest: NodeExecutionRequest | undefined;\n requests: NodeExecutionRequest[] = [];\n\n async enqueue(request: NodeExecutionRequest): Promise<{ receiptId: string }> {\n this.lastRequest = request;\n this.requests.push(request);\n return { receiptId: `receipt_${this.requests.length}` };\n }\n}\n","/**\n * Deterministic `run_1`, `act_1`-style ids for test harness factories.\n */\nexport class PrefixedSequentialIdGenerator {\n private n = 0;\n\n constructor(private readonly prefix: string) {}\n\n next(): string {\n this.n += 1;\n return `${this.prefix}${this.n}`;\n }\n\n asFn(): () => string {\n return () => this.next();\n }\n}\n","import type { RunIdFactory } from \"../types\";\n\n/**\n * @internal Test harness id factory shared by registrar kit wiring.\n */\nexport class EngineTestKitRunIdFactory implements RunIdFactory {\n private runCounter = 0;\n private activationCounter = 0;\n\n constructor(\n private readonly makeRunIdValue: () => string,\n private readonly makeActivationIdValue: () => string,\n ) {}\n\n makeRunId(): string {\n this.runCounter += 1;\n return this.makeRunIdValue();\n }\n\n makeActivationId(): string {\n this.activationCounter += 1;\n return this.makeActivationIdValue();\n }\n}\n","import type { PersistedTriggerSetupState, TriggerSetupStateRepository } from \"../types\";\n\nexport class InMemoryTriggerSetupStateRepository implements TriggerSetupStateRepository {\n private readonly statesByKey = new Map<string, PersistedTriggerSetupState>();\n\n async load(trigger: { workflowId: string; nodeId: string }): Promise<PersistedTriggerSetupState | undefined> {\n return this.statesByKey.get(this.toKey(trigger));\n }\n\n async save(state: PersistedTriggerSetupState): Promise<void> {\n this.statesByKey.set(this.toKey(state.trigger), state);\n }\n\n async delete(trigger: { workflowId: string; nodeId: string }): Promise<void> {\n this.statesByKey.delete(this.toKey(trigger));\n }\n\n private toKey(trigger: { workflowId: string; nodeId: string }): string {\n return `${trigger.workflowId}:${trigger.nodeId}`;\n }\n}\n","/* eslint-disable codemation/single-class-per-file -- Runnable config and implementation share a TypeToken pairing. */\nimport type { WorkflowRunnerService } from \"../contracts/runtimeTypes\";\nimport type { TypeToken } from \"../di\";\nimport type {\n Item,\n Items,\n NodeExecutionContext,\n NodeId,\n NodeOutputs,\n Node,\n RunnableNodeConfig,\n WorkflowId,\n} from \"../types\";\n\n/**\n * Test harness subworkflow runner (mirrors integration patterns; lives under {@link \"@codemation/core/testing\"}).\n */\nexport class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknown> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = SubWorkflowRunnerNode;\n\n constructor(\n public readonly name: string,\n public readonly args: Readonly<{\n workflowId: WorkflowId;\n startAt?: NodeId;\n id?: string;\n execution?: Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }>;\n }>,\n ) {}\n\n get id(): string | undefined {\n return this.args.id;\n }\n\n get execution(): Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }> | undefined {\n return this.args.execution;\n }\n\n get workflowId(): WorkflowId {\n return this.args.workflowId;\n }\n\n get startAt(): NodeId | undefined {\n return this.args.startAt;\n }\n}\n\nexport class SubWorkflowRunnerNode implements Node<SubWorkflowRunnerConfig<any, any>> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n constructor(private readonly workflows: WorkflowRunnerService) {}\n\n async execute(items: Items, ctx: NodeExecutionContext<SubWorkflowRunnerConfig<any, any>>): Promise<NodeOutputs> {\n const out: Item[] = [];\n for (let i = 0; i < items.length; i++) {\n const current = items[i]!;\n const result = await this.workflows.runById({\n workflowId: ctx.config.workflowId,\n startAt: ctx.config.startAt,\n items: [current],\n parent: {\n runId: ctx.runId,\n workflowId: ctx.workflowId,\n nodeId: ctx.nodeId,\n subworkflowDepth: ctx.subworkflowDepth,\n engineMaxNodeActivations: ctx.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: ctx.engineMaxSubworkflowDepth,\n },\n });\n if (result.status !== \"completed\") {\n throw new Error(`Subworkflow ${ctx.config.workflowId} did not complete (status=${result.status})`);\n }\n out.push(...result.outputs);\n }\n\n return { main: out };\n }\n}\n","/* eslint-disable codemation/single-class-per-file -- Trigger config and implementation share a TypeToken pairing. */\nimport type { TypeToken } from \"../di\";\nimport type {\n Items,\n NodeExecutionContext,\n NodeOutputs,\n TriggerNode,\n TriggerNodeConfig,\n TriggerSetupContext,\n} from \"../types\";\n\n/**\n * Minimal pass-through manual trigger for {@link WorkflowTestKit.runNode}; emits input items unchanged.\n */\nexport class WorkflowTestHarnessManualTriggerConfig implements TriggerNodeConfig<unknown> {\n readonly kind = \"trigger\" as const;\n readonly type: TypeToken<unknown> = WorkflowTestHarnessManualTriggerNode;\n\n constructor(\n public readonly name: string,\n public readonly id?: string,\n ) {}\n}\n\nexport class WorkflowTestHarnessManualTriggerNode implements TriggerNode<WorkflowTestHarnessManualTriggerConfig> {\n readonly kind = \"trigger\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async setup(_ctx: TriggerSetupContext<WorkflowTestHarnessManualTriggerConfig>): Promise<undefined> {\n return undefined;\n }\n\n async execute(\n items: Items,\n _ctx: NodeExecutionContext<WorkflowTestHarnessManualTriggerConfig>,\n ): Promise<NodeOutputs> {\n return { main: items };\n }\n}\n","import type { DependencyContainer, InjectionToken } from \"tsyringe\";\nimport { container as tsyringeContainer } from \"tsyringe\";\n\nimport type { WorkflowRunnerService } from \"../contracts/runtimeTypes\";\nimport { CoreTokens } from \"../di\";\nimport { InMemoryRunEventBus } from \"../events/InMemoryRunEventBusRegistry\";\nimport { AllWorkflowsActiveWorkflowActivationPolicy } from \"../contracts/workflowActivationPolicy\";\nimport { RunIntentService } from \"../runtime/RunIntentService\";\nimport {\n DefaultDrivingScheduler,\n DefaultAsyncSleeper,\n DefaultExecutionContextFactory,\n Engine,\n EngineRuntimeRegistrar,\n EngineWorkflowRunnerService,\n HintOnlyOffloadPolicy,\n InProcessRetryRunner,\n InMemoryRunDataFactory,\n InMemoryWorkflowExecutionRepository,\n InlineDrivingScheduler,\n NodeExecutor,\n NodeInstanceFactory,\n PersistedWorkflowTokenRegistry,\n} from \"../bootstrap/index\";\nimport { InMemoryLiveWorkflowRepository } from \"../runtime/InMemoryLiveWorkflowRepository\";\nimport { EngineTestKitRunIdFactory } from \"./EngineTestKitRunIdFactory\";\nimport { InMemoryTriggerSetupStateRepository } from \"./InMemoryTriggerSetupStateRepository\";\nimport { RejectingCredentialSessionService } from \"./RejectingCredentialSessionService\";\nimport { CapturingScheduler } from \"./CapturingScheduler\";\nimport { PrefixedSequentialIdGenerator } from \"./PrefixedSequentialIdGenerator\";\nimport type { RegistrarEngineTestKitHandle, RegistrarEngineTestKitOptions } from \"./RegistrarEngineTestKit.types\";\nimport { ItemHarnessNode } from \"./ItemHarnessNode\";\nimport { SubWorkflowRunnerNode } from \"./SubWorkflowRunnerTestNode\";\nimport { WorkflowTestHarnessManualTriggerNode } from \"./WorkflowTestHarnessManualTrigger\";\n\nexport class RegistrarEngineTestKitFactory {\n static create(options: RegistrarEngineTestKitOptions = {}): RegistrarEngineTestKitHandle {\n const runStore = options.runStore ?? new InMemoryWorkflowExecutionRepository();\n const scheduler = options.scheduler ?? new CapturingScheduler();\n const offloadPolicy = options.offloadPolicy ?? new HintOnlyOffloadPolicy();\n const runIdGen = new PrefixedSequentialIdGenerator(\"run_\");\n const activationIdGen = new PrefixedSequentialIdGenerator(\"act_\");\n const makeRunId = options.makeRunId ?? runIdGen.asFn();\n const makeActivationId = options.makeActivationId ?? activationIdGen.asFn();\n const credentialSessions = options.credentialSessions ?? new RejectingCredentialSessionService();\n const eventBus = options.eventBus ?? new InMemoryRunEventBus();\n const triggerSetupStateRepository =\n options.triggerSetupStateRepository ?? new InMemoryTriggerSetupStateRepository();\n const liveWorkflowRepository = new InMemoryLiveWorkflowRepository();\n const runDataFactory = options.runDataFactory ?? new InMemoryRunDataFactory();\n const executionContextFactory = options.executionContextFactory ?? new DefaultExecutionContextFactory();\n const container = options.container ?? tsyringeContainer.createChildContainer();\n const dependencyContainer = container as DependencyContainer;\n const nodeResolver = container;\n const nodeExecutor = new NodeExecutor(\n new NodeInstanceFactory(nodeResolver),\n new InProcessRetryRunner(new DefaultAsyncSleeper()),\n );\n const activationScheduler = new DefaultDrivingScheduler(\n offloadPolicy,\n scheduler,\n new InlineDrivingScheduler(nodeExecutor),\n );\n\n for (const [token, value] of options.providers ?? new Map<InjectionToken<unknown>, unknown>()) {\n dependencyContainer.registerInstance(token, value);\n }\n\n dependencyContainer.registerInstance(CoreTokens.CredentialSessionService, credentialSessions);\n dependencyContainer.registerInstance(CoreTokens.LiveWorkflowRepository, liveWorkflowRepository);\n dependencyContainer.registerInstance(CoreTokens.WorkflowRepository, liveWorkflowRepository);\n dependencyContainer.registerInstance(CoreTokens.NodeResolver, nodeResolver);\n dependencyContainer.registerInstance(\n CoreTokens.RunIdFactory,\n new EngineTestKitRunIdFactory(makeRunId, makeActivationId),\n );\n dependencyContainer.registerInstance(\n CoreTokens.ActivationIdFactory,\n new EngineTestKitRunIdFactory(makeRunId, makeActivationId),\n );\n dependencyContainer.registerInstance(CoreTokens.WebhookBasePath, options.webhookBasePath ?? \"/webhooks\");\n dependencyContainer.registerInstance(CoreTokens.WorkflowExecutionRepository, runStore);\n dependencyContainer.registerInstance(CoreTokens.TriggerSetupStateRepository, triggerSetupStateRepository);\n dependencyContainer.registerInstance(CoreTokens.NodeActivationScheduler, activationScheduler);\n dependencyContainer.registerInstance(CoreTokens.RunDataFactory, runDataFactory);\n dependencyContainer.registerInstance(CoreTokens.ExecutionContextFactory, executionContextFactory);\n dependencyContainer.registerInstance(CoreTokens.RunEventBus, eventBus);\n dependencyContainer.registerInstance(\n CoreTokens.PersistedWorkflowTokenRegistry,\n new PersistedWorkflowTokenRegistry(),\n );\n dependencyContainer.registerInstance(\n CoreTokens.WorkflowActivationPolicy,\n new AllWorkflowsActiveWorkflowActivationPolicy(),\n );\n\n if (options.executionLimitsPolicy !== undefined) {\n dependencyContainer.registerInstance(CoreTokens.EngineExecutionLimitsPolicy, options.executionLimitsPolicy);\n }\n\n new EngineRuntimeRegistrar().register(dependencyContainer, options.registrarOptions ?? {});\n\n const engine = dependencyContainer.resolve(Engine);\n const runIntent = dependencyContainer.resolve(RunIntentService);\n const workflowRunner =\n options.workflowRunner ??\n (dependencyContainer.resolve(CoreTokens.WorkflowRunnerService) as EngineWorkflowRunnerService);\n dependencyContainer.registerInstance(\n SubWorkflowRunnerNode,\n new SubWorkflowRunnerNode(workflowRunner as WorkflowRunnerService),\n );\n dependencyContainer.registerInstance(ItemHarnessNode, new ItemHarnessNode());\n dependencyContainer.registerInstance(\n WorkflowTestHarnessManualTriggerNode,\n new WorkflowTestHarnessManualTriggerNode(),\n );\n\n const start = async (workflows: ReadonlyArray<import(\"../types\").WorkflowDefinition>): Promise<void> => {\n await engine.start([...workflows]);\n };\n\n const runToCompletion: RegistrarEngineTestKitHandle[\"runToCompletion\"] = async (args) => {\n const r0 = await engine.runWorkflow(args.wf, args.startAt, args.items, args.parent);\n if (r0.status !== \"pending\") return r0;\n return await engine.waitForCompletion(r0.runId);\n };\n\n const runIntentStartToCompletion: RegistrarEngineTestKitHandle[\"runIntentStartToCompletion\"] = async (args) => {\n const r0 = await runIntent.startWorkflow({\n workflow: args.wf,\n startAt: args.startAt,\n items: args.items,\n parent: args.parent,\n });\n if (r0.status !== \"pending\") return r0;\n return await engine.waitForCompletion(r0.runId);\n };\n\n return {\n engine,\n runIntent,\n liveWorkflowRepository,\n runStore,\n triggerSetupStateRepository,\n scheduler: scheduler as CapturingScheduler | import(\"../types\").NodeExecutionScheduler,\n offloadPolicy,\n workflowRunner,\n dependencyContainer,\n start,\n runToCompletion,\n runIntentStartToCompletion,\n makeRunId,\n makeActivationId,\n };\n }\n}\n","import type { DependencyContainer } from \"tsyringe\";\n\nimport type { TypeToken } from \"../di\";\n\nimport type { DefinedNodeRegistrationContext } from \"./WorkflowTestKit.types\";\n\nexport class WorkflowTestKitNodeRegistrationContextFactory {\n create(dependencyContainer: DependencyContainer): DefinedNodeRegistrationContext {\n return {\n registerNode<TValue>(token: TypeToken<TValue>, implementation?: TypeToken<TValue>) {\n dependencyContainer.register(token, {\n useClass: (implementation ?? token) as never,\n });\n },\n };\n }\n}\n","import type { RunnableNodeConfig, WorkflowDefinition, WorkflowId } from \"../types\";\nimport { WorkflowBuilder } from \"../workflow/dsl/WorkflowBuilder\";\n\nimport { WorkflowTestHarnessManualTriggerConfig } from \"./WorkflowTestHarnessManualTrigger\";\n\nconst defaultInlineWorkflowId = \"codemation.testing.workflowkit.inline\" as WorkflowId;\nconst defaultInlineWorkflowName = \"WorkflowTestKit inline\";\n\n/**\n * Builds the minimal trigger → runnable workflow used by {@link import(\"./WorkflowTestKit\").WorkflowTestKit.runNode}.\n */\nexport class WorkflowTestKitRunNodeWorkflowFactory {\n build(args: { node: RunnableNodeConfig; workflowId?: WorkflowId; workflowName?: string }): WorkflowDefinition {\n const workflowId = args.workflowId ?? defaultInlineWorkflowId;\n const workflowName = args.workflowName ?? defaultInlineWorkflowName;\n const trigger = new WorkflowTestHarnessManualTriggerConfig(\n \"WorkflowTestKit trigger\",\n \"workflowkit.harness.trigger\",\n );\n return new WorkflowBuilder({ id: workflowId, name: workflowName }).trigger(trigger).then(args.node).build();\n }\n\n defaultStartNodeId(): string {\n return \"workflowkit.harness.trigger\";\n }\n}\n","import type { DependencyContainer } from \"tsyringe\";\n\nimport type { Items, NodeId, RunnableNodeConfig, RunResult, WorkflowDefinition, WorkflowId } from \"../types\";\n\nimport { RegistrarEngineTestKitFactory } from \"./RegistrarEngineTestKitFactory\";\nimport type { EngineTestKitOptions, RegistrarEngineTestKitHandle } from \"./RegistrarEngineTestKit.types\";\nimport { WorkflowTestKitNodeRegistrationContextFactory } from \"./WorkflowTestKitNodeRegistrationContextFactory\";\nimport type { DefinedNodeRegistration } from \"./WorkflowTestKit.types\";\nimport { WorkflowTestKitRunNodeWorkflowFactory } from \"./WorkflowTestKitRunNodeWorkflowFactory\";\n\nexport type { DefinedNodeRegistration, DefinedNodeRegistrationContext } from \"./WorkflowTestKit.types\";\n\nexport type WorkflowTestKitOptions = EngineTestKitOptions;\n\nexport class WorkflowTestKit {\n private readonly handle: RegistrarEngineTestKitHandle;\n private readonly runNodeWorkflowFactory = new WorkflowTestKitRunNodeWorkflowFactory();\n private readonly nodeRegistrationContextFactory = new WorkflowTestKitNodeRegistrationContextFactory();\n\n constructor(options: WorkflowTestKitOptions = {}) {\n this.handle = RegistrarEngineTestKitFactory.create(options);\n }\n\n get dependencyContainer(): DependencyContainer {\n return this.handle.dependencyContainer;\n }\n\n get engine(): RegistrarEngineTestKitHandle[\"engine\"] {\n return this.handle.engine;\n }\n\n get workflowRunner(): RegistrarEngineTestKitHandle[\"workflowRunner\"] {\n return this.handle.workflowRunner;\n }\n\n get liveWorkflowRepository(): RegistrarEngineTestKitHandle[\"liveWorkflowRepository\"] {\n return this.handle.liveWorkflowRepository;\n }\n\n get runStore(): RegistrarEngineTestKitHandle[\"runStore\"] {\n return this.handle.runStore;\n }\n\n /**\n * Registers {@link import(\"../authoring/defineNode.types\").DefinedNode} implementations on the same DI container used by the engine\n * (same pattern as `plugin.register({ registerNode })` in the host).\n */\n registerDefinedNodes(definitions: ReadonlyArray<DefinedNodeRegistration>): void {\n const ctx = this.nodeRegistrationContextFactory.create(this.handle.dependencyContainer);\n for (const def of definitions) {\n def.register(ctx);\n }\n }\n\n async run(args: { workflow: WorkflowDefinition; items: Items; startAt?: NodeId }): Promise<RunResult> {\n await this.handle.start([args.workflow]);\n return await this.handle.workflowRunner.runById({\n workflowId: args.workflow.id,\n startAt: args.startAt,\n items: args.items,\n });\n }\n\n async runNode(args: {\n node: RunnableNodeConfig;\n items: Items;\n workflowId?: WorkflowId;\n workflowName?: string;\n }): Promise<RunResult> {\n const wf = this.runNodeWorkflowFactory.build(args);\n return await this.run({\n workflow: wf,\n items: args.items,\n startAt: this.runNodeWorkflowFactory.defaultStartNodeId(),\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testing.cjs","names":["name: string","inputSchema: ZodType<TIn>","runOne: (args: {\n input: TIn;\n item: Item<TIn>;\n itemIndex: number;\n items: Items<TIn>;\n ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut>>;\n }) => TOut | Promise<TOut>","opts: Readonly<{\n id?: string;\n }>","prefix: string","makeRunIdValue: () => string","makeActivationIdValue: () => string","name: string","args: Readonly<{\n workflowId: WorkflowId;\n startAt?: NodeId;\n id?: string;\n execution?: Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }>;\n }>","workflows: WorkflowRunnerService","emitPorts","name: string","id?: string","emitPorts","InMemoryWorkflowExecutionRepository","HintOnlyOffloadPolicy","InMemoryRunEventBus","InMemoryLiveWorkflowRepository","InMemoryRunDataFactory","DefaultExecutionContextFactory","tsyringeContainer","DefaultDrivingScheduler","InlineDrivingScheduler","NodeExecutor","NodeInstanceFactory","InProcessRetryRunner","DefaultAsyncSleeper","CoreTokens","PersistedWorkflowTokenRegistry","AllWorkflowsActiveWorkflowActivationPolicy","EngineRuntimeRegistrar","Engine","RunIntentService","runToCompletion: RegistrarEngineTestKitHandle[\"runToCompletion\"]","runIntentStartToCompletion: RegistrarEngineTestKitHandle[\"runIntentStartToCompletion\"]","WorkflowBuilder"],"sources":["../src/testing/RejectingCredentialSessionService.ts","../src/testing/ItemHarnessNode.ts","../src/testing/ItemHarnessNodeConfig.ts","../src/testing/CapturingScheduler.ts","../src/testing/PrefixedSequentialIdGenerator.ts","../src/testing/EngineTestKitRunIdFactory.ts","../src/testing/InMemoryTriggerSetupStateRepository.ts","../src/testing/SubWorkflowRunnerTestNode.ts","../src/testing/WorkflowTestHarnessManualTrigger.ts","../src/testing/SwitchHarnessNode.ts","../src/testing/RegistrarEngineTestKitFactory.ts","../src/testing/WorkflowTestKitNodeRegistrationContextFactory.ts","../src/testing/WorkflowTestKitRunNodeWorkflowFactory.ts","../src/testing/WorkflowTestKitBuilder.ts"],"sourcesContent":["import type { CredentialSessionService } from \"../contracts/credentialTypes\";\n\n/**\n * Test harness default: rejects any credential lookup so missing bindings fail loudly.\n * Prefer registering a real {@link CredentialSessionService} in integration scenarios.\n */\nexport class RejectingCredentialSessionService implements CredentialSessionService {\n async getSession<TSession = unknown>(\n args: Readonly<{ workflowId: string; nodeId: string; slotKey: string }>,\n ): Promise<TSession> {\n throw new Error(\n `Credential sessions are unavailable for workflow ${args.workflowId} node ${args.nodeId} slot \"${args.slotKey}\". Register a real CredentialSessionService implementation before executing workflows.`,\n );\n }\n}\n","import type { Item, RunnableNode, RunnableNodeExecuteArgs } from \"../types\";\n\nimport type { ItemHarnessNodeConfig } from \"./ItemHarnessNodeConfig\";\n\n/**\n * Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).\n */\nexport class ItemHarnessNode implements RunnableNode<ItemHarnessNodeConfig<any, any>> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async execute(args: RunnableNodeExecuteArgs<ItemHarnessNodeConfig<any, any>>): Promise<unknown> {\n return await args.ctx.config.runOne({\n input: args.input as never,\n item: args.item as Item,\n itemIndex: args.itemIndex,\n items: args.items,\n ctx: args.ctx,\n });\n }\n}\n","import type { ZodType } from \"zod\";\n\nimport type { TypeToken } from \"../di\";\nimport type { Item, Items, NodeExecutionContext, RunnableNodeConfig } from \"../types\";\n\nimport { ItemHarnessNode } from \"./ItemHarnessNode\";\n\n/**\n * Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema},\n * then {@link ItemHarnessNode.execute} per item.\n */\nexport class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown> implements RunnableNodeConfig<TIn, TOut> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = ItemHarnessNode;\n\n constructor(\n public readonly name: string,\n public readonly inputSchema: ZodType<TIn>,\n public readonly runOne: (args: {\n input: TIn;\n item: Item<TIn>;\n itemIndex: number;\n items: Items<TIn>;\n ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut>>;\n }) => TOut | Promise<TOut>,\n public readonly opts: Readonly<{\n id?: string;\n }> = {},\n ) {}\n\n get id(): string | undefined {\n return this.opts.id;\n }\n}\n","import type { NodeExecutionRequest, NodeExecutionScheduler } from \"../types\";\n\n/**\n * Test scheduler that records enqueue requests without executing a real queue.\n */\nexport class CapturingScheduler implements NodeExecutionScheduler {\n lastRequest: NodeExecutionRequest | undefined;\n requests: NodeExecutionRequest[] = [];\n\n async enqueue(request: NodeExecutionRequest): Promise<{ receiptId: string }> {\n this.lastRequest = request;\n this.requests.push(request);\n return { receiptId: `receipt_${this.requests.length}` };\n }\n}\n","/**\n * Deterministic `run_1`, `act_1`-style ids for test harness factories.\n */\nexport class PrefixedSequentialIdGenerator {\n private n = 0;\n\n constructor(private readonly prefix: string) {}\n\n next(): string {\n this.n += 1;\n return `${this.prefix}${this.n}`;\n }\n\n asFn(): () => string {\n return () => this.next();\n }\n}\n","import type { RunIdFactory } from \"../types\";\n\n/**\n * @internal Test harness id factory shared by registrar kit wiring.\n */\nexport class EngineTestKitRunIdFactory implements RunIdFactory {\n private runCounter = 0;\n private activationCounter = 0;\n\n constructor(\n private readonly makeRunIdValue: () => string,\n private readonly makeActivationIdValue: () => string,\n ) {}\n\n makeRunId(): string {\n this.runCounter += 1;\n return this.makeRunIdValue();\n }\n\n makeActivationId(): string {\n this.activationCounter += 1;\n return this.makeActivationIdValue();\n }\n}\n","import type { PersistedTriggerSetupState, TriggerSetupStateRepository } from \"../types\";\n\nexport class InMemoryTriggerSetupStateRepository implements TriggerSetupStateRepository {\n private readonly statesByKey = new Map<string, PersistedTriggerSetupState>();\n\n async load(trigger: { workflowId: string; nodeId: string }): Promise<PersistedTriggerSetupState | undefined> {\n return this.statesByKey.get(this.toKey(trigger));\n }\n\n async save(state: PersistedTriggerSetupState): Promise<void> {\n this.statesByKey.set(this.toKey(state.trigger), state);\n }\n\n async delete(trigger: { workflowId: string; nodeId: string }): Promise<void> {\n this.statesByKey.delete(this.toKey(trigger));\n }\n\n private toKey(trigger: { workflowId: string; nodeId: string }): string {\n return `${trigger.workflowId}:${trigger.nodeId}`;\n }\n}\n","/* eslint-disable codemation/single-class-per-file -- Runnable config and implementation share a TypeToken pairing. */\nimport type { WorkflowRunnerService } from \"../contracts/runtimeTypes\";\nimport type { TypeToken } from \"../di\";\nimport type { Item, NodeId, RunnableNode, RunnableNodeConfig, RunnableNodeExecuteArgs, WorkflowId } from \"../types\";\nimport { emitPorts } from \"../contracts/emitPorts\";\n\n/**\n * Test harness subworkflow runner (mirrors integration patterns; lives under {@link \"@codemation/core/testing\"}).\n */\nexport class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknown> implements RunnableNodeConfig<\n TInputJson,\n TOutputJson\n> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = SubWorkflowRunnerNode;\n\n readonly workflowId: WorkflowId;\n readonly startAt: NodeId | undefined;\n\n constructor(\n public readonly name: string,\n public readonly args: Readonly<{\n workflowId: WorkflowId;\n startAt?: NodeId;\n id?: string;\n execution?: Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }>;\n }>,\n ) {\n this.workflowId = args.workflowId;\n this.startAt = args.startAt;\n }\n\n get id(): string | undefined {\n return this.args.id;\n }\n\n get execution(): Readonly<{ hint?: \"local\" | \"worker\"; queue?: string }> | undefined {\n return this.args.execution;\n }\n}\n\nexport class SubWorkflowRunnerNode implements RunnableNode<SubWorkflowRunnerConfig<any, any>> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n constructor(private readonly workflows: WorkflowRunnerService) {}\n\n async execute(args: RunnableNodeExecuteArgs<SubWorkflowRunnerConfig<any, any>>): Promise<unknown> {\n const current = args.item as Item;\n const result = await this.workflows.runById({\n workflowId: args.ctx.config.workflowId,\n startAt: args.ctx.config.startAt,\n items: [current],\n parent: {\n runId: args.ctx.runId,\n workflowId: args.ctx.workflowId,\n nodeId: args.ctx.nodeId,\n subworkflowDepth: args.ctx.subworkflowDepth,\n engineMaxNodeActivations: args.ctx.engineMaxNodeActivations,\n engineMaxSubworkflowDepth: args.ctx.engineMaxSubworkflowDepth,\n },\n });\n if (result.status !== \"completed\") {\n throw new Error(`Subworkflow ${args.ctx.config.workflowId} did not complete (status=${result.status})`);\n }\n return emitPorts({ main: result.outputs });\n }\n}\n","/* eslint-disable codemation/single-class-per-file -- Trigger config and implementation share a TypeToken pairing. */\nimport type { TypeToken } from \"../di\";\nimport type {\n Items,\n NodeExecutionContext,\n NodeOutputs,\n TriggerNode,\n TriggerNodeConfig,\n TriggerSetupContext,\n} from \"../types\";\n\n/**\n * Minimal pass-through manual trigger for {@link WorkflowTestKit.runNode}; emits input items unchanged.\n */\nexport class WorkflowTestHarnessManualTriggerConfig implements TriggerNodeConfig<unknown> {\n readonly kind = \"trigger\" as const;\n readonly type: TypeToken<unknown> = WorkflowTestHarnessManualTriggerNode;\n\n constructor(\n public readonly name: string,\n public readonly id?: string,\n ) {}\n}\n\nexport class WorkflowTestHarnessManualTriggerNode implements TriggerNode<WorkflowTestHarnessManualTriggerConfig> {\n readonly kind = \"trigger\" as const;\n readonly outputPorts = [\"main\"] as const;\n\n async setup(_ctx: TriggerSetupContext<WorkflowTestHarnessManualTriggerConfig>): Promise<undefined> {\n return undefined;\n }\n\n async execute(\n items: Items,\n _ctx: NodeExecutionContext<WorkflowTestHarnessManualTriggerConfig>,\n ): Promise<NodeOutputs> {\n return { main: items };\n }\n}\n","import type { TypeToken } from \"../di\";\nimport type {\n Item,\n Items,\n NodeExecutionContext,\n RunnableNode,\n RunnableNodeConfig,\n RunnableNodeExecuteArgs,\n} from \"../types\";\nimport { emitPorts } from \"../contracts/emitPorts\";\n\nexport class SwitchHarnessNode implements RunnableNode<SwitchHarnessNodeConfig<any>> {\n readonly kind = \"node\" as const;\n readonly outputPorts = [] as const;\n\n async execute(args: RunnableNodeExecuteArgs<SwitchHarnessNodeConfig<any>>): Promise<unknown> {\n const key = await Promise.resolve(\n args.ctx.config.cfg.resolveCaseKey(args.item as Item, args.itemIndex, args.items, args.ctx),\n );\n const { cases, defaultCase } = args.ctx.config.cfg;\n const port = cases.includes(key) ? key : defaultCase;\n return emitPorts({\n [port]: [args.item],\n });\n }\n}\n\nexport class SwitchHarnessNodeConfig<TInputJson = unknown> implements RunnableNodeConfig<TInputJson, TInputJson> {\n readonly kind = \"node\" as const;\n readonly type: TypeToken<unknown> = SwitchHarnessNode;\n readonly lineageCarry = \"carryThrough\" as const;\n readonly declaredOutputPorts: ReadonlyArray<string>;\n\n constructor(\n public readonly name: string,\n public readonly cfg: Readonly<{\n cases: readonly string[];\n defaultCase: string;\n resolveCaseKey: (\n item: Item<TInputJson>,\n index: number,\n items: Items<TInputJson>,\n ctx: NodeExecutionContext<SwitchHarnessNodeConfig<TInputJson>>,\n ) => string | Promise<string>;\n }>,\n public readonly opts: Readonly<{ id?: string }> = {},\n ) {\n this.declaredOutputPorts = [...new Set([...cfg.cases, cfg.defaultCase])].sort();\n }\n\n get id(): string | undefined {\n return this.opts.id;\n }\n}\n","import type { DependencyContainer, InjectionToken } from \"tsyringe\";\nimport { container as tsyringeContainer } from \"tsyringe\";\n\nimport type { WorkflowRunnerService } from \"../contracts/runtimeTypes\";\nimport { CoreTokens } from \"../di\";\nimport { InMemoryRunEventBus } from \"../events/InMemoryRunEventBusRegistry\";\nimport { AllWorkflowsActiveWorkflowActivationPolicy } from \"../contracts/workflowActivationPolicy\";\nimport { RunIntentService } from \"../runtime/RunIntentService\";\nimport {\n DefaultDrivingScheduler,\n DefaultAsyncSleeper,\n DefaultExecutionContextFactory,\n Engine,\n EngineRuntimeRegistrar,\n EngineWorkflowRunnerService,\n HintOnlyOffloadPolicy,\n InProcessRetryRunner,\n InMemoryRunDataFactory,\n InMemoryWorkflowExecutionRepository,\n InlineDrivingScheduler,\n NodeExecutor,\n NodeInstanceFactory,\n PersistedWorkflowTokenRegistry,\n} from \"../bootstrap/index\";\nimport { InMemoryLiveWorkflowRepository } from \"../runtime/InMemoryLiveWorkflowRepository\";\nimport { EngineTestKitRunIdFactory } from \"./EngineTestKitRunIdFactory\";\nimport { InMemoryTriggerSetupStateRepository } from \"./InMemoryTriggerSetupStateRepository\";\nimport { RejectingCredentialSessionService } from \"./RejectingCredentialSessionService\";\nimport { CapturingScheduler } from \"./CapturingScheduler\";\nimport { PrefixedSequentialIdGenerator } from \"./PrefixedSequentialIdGenerator\";\nimport type { RegistrarEngineTestKitHandle, RegistrarEngineTestKitOptions } from \"./RegistrarEngineTestKit.types\";\nimport { ItemHarnessNode } from \"./ItemHarnessNode\";\nimport { SubWorkflowRunnerNode } from \"./SubWorkflowRunnerTestNode\";\nimport { WorkflowTestHarnessManualTriggerNode } from \"./WorkflowTestHarnessManualTrigger\";\nimport { SwitchHarnessNode } from \"./SwitchHarnessNode\";\n\nexport class RegistrarEngineTestKitFactory {\n static create(options: RegistrarEngineTestKitOptions = {}): RegistrarEngineTestKitHandle {\n const runStore = options.runStore ?? new InMemoryWorkflowExecutionRepository();\n const scheduler = options.scheduler ?? new CapturingScheduler();\n const offloadPolicy = options.offloadPolicy ?? new HintOnlyOffloadPolicy();\n const runIdGen = new PrefixedSequentialIdGenerator(\"run_\");\n const activationIdGen = new PrefixedSequentialIdGenerator(\"act_\");\n const makeRunId = options.makeRunId ?? runIdGen.asFn();\n const makeActivationId = options.makeActivationId ?? activationIdGen.asFn();\n const credentialSessions = options.credentialSessions ?? new RejectingCredentialSessionService();\n const eventBus = options.eventBus ?? new InMemoryRunEventBus();\n const triggerSetupStateRepository =\n options.triggerSetupStateRepository ?? new InMemoryTriggerSetupStateRepository();\n const liveWorkflowRepository = new InMemoryLiveWorkflowRepository();\n const runDataFactory = options.runDataFactory ?? new InMemoryRunDataFactory();\n const executionContextFactory = options.executionContextFactory ?? new DefaultExecutionContextFactory();\n const container = options.container ?? tsyringeContainer.createChildContainer();\n const dependencyContainer = container as DependencyContainer;\n const nodeResolver = container;\n const nodeExecutor = new NodeExecutor(\n new NodeInstanceFactory(nodeResolver),\n new InProcessRetryRunner(new DefaultAsyncSleeper()),\n );\n const activationScheduler = new DefaultDrivingScheduler(\n offloadPolicy,\n scheduler,\n new InlineDrivingScheduler(nodeExecutor),\n );\n\n for (const [token, value] of options.providers ?? new Map<InjectionToken<unknown>, unknown>()) {\n dependencyContainer.registerInstance(token, value);\n }\n\n dependencyContainer.registerInstance(CoreTokens.CredentialSessionService, credentialSessions);\n dependencyContainer.registerInstance(CoreTokens.LiveWorkflowRepository, liveWorkflowRepository);\n dependencyContainer.registerInstance(CoreTokens.WorkflowRepository, liveWorkflowRepository);\n dependencyContainer.registerInstance(CoreTokens.NodeResolver, nodeResolver);\n dependencyContainer.registerInstance(\n CoreTokens.RunIdFactory,\n new EngineTestKitRunIdFactory(makeRunId, makeActivationId),\n );\n dependencyContainer.registerInstance(\n CoreTokens.ActivationIdFactory,\n new EngineTestKitRunIdFactory(makeRunId, makeActivationId),\n );\n dependencyContainer.registerInstance(CoreTokens.WebhookBasePath, options.webhookBasePath ?? \"/webhooks\");\n dependencyContainer.registerInstance(CoreTokens.WorkflowExecutionRepository, runStore);\n dependencyContainer.registerInstance(CoreTokens.TriggerSetupStateRepository, triggerSetupStateRepository);\n dependencyContainer.registerInstance(CoreTokens.NodeActivationScheduler, activationScheduler);\n dependencyContainer.registerInstance(CoreTokens.RunDataFactory, runDataFactory);\n dependencyContainer.registerInstance(CoreTokens.ExecutionContextFactory, executionContextFactory);\n dependencyContainer.registerInstance(CoreTokens.RunEventBus, eventBus);\n dependencyContainer.registerInstance(\n CoreTokens.PersistedWorkflowTokenRegistry,\n new PersistedWorkflowTokenRegistry(),\n );\n dependencyContainer.registerInstance(\n CoreTokens.WorkflowActivationPolicy,\n new AllWorkflowsActiveWorkflowActivationPolicy(),\n );\n\n if (options.executionLimitsPolicy !== undefined) {\n dependencyContainer.registerInstance(CoreTokens.EngineExecutionLimitsPolicy, options.executionLimitsPolicy);\n }\n\n new EngineRuntimeRegistrar().register(dependencyContainer, options.registrarOptions ?? {});\n\n const engine = dependencyContainer.resolve(Engine);\n const runIntent = dependencyContainer.resolve(RunIntentService);\n const workflowRunner =\n options.workflowRunner ??\n (dependencyContainer.resolve(CoreTokens.WorkflowRunnerService) as EngineWorkflowRunnerService);\n dependencyContainer.registerInstance(\n SubWorkflowRunnerNode,\n new SubWorkflowRunnerNode(workflowRunner as WorkflowRunnerService),\n );\n dependencyContainer.registerInstance(ItemHarnessNode, new ItemHarnessNode());\n dependencyContainer.registerInstance(SwitchHarnessNode, new SwitchHarnessNode());\n dependencyContainer.registerInstance(\n WorkflowTestHarnessManualTriggerNode,\n new WorkflowTestHarnessManualTriggerNode(),\n );\n\n const start = async (workflows: ReadonlyArray<import(\"../types\").WorkflowDefinition>): Promise<void> => {\n await engine.start([...workflows]);\n };\n\n const runToCompletion: RegistrarEngineTestKitHandle[\"runToCompletion\"] = async (args) => {\n const r0 = await engine.runWorkflow(args.wf, args.startAt, args.items, args.parent);\n if (r0.status !== \"pending\") return r0;\n return await engine.waitForCompletion(r0.runId);\n };\n\n const runIntentStartToCompletion: RegistrarEngineTestKitHandle[\"runIntentStartToCompletion\"] = async (args) => {\n const r0 = await runIntent.startWorkflow({\n workflow: args.wf,\n startAt: args.startAt,\n items: args.items,\n parent: args.parent,\n });\n if (r0.status !== \"pending\") return r0;\n return await engine.waitForCompletion(r0.runId);\n };\n\n return {\n engine,\n runIntent,\n liveWorkflowRepository,\n runStore,\n triggerSetupStateRepository,\n scheduler: scheduler as CapturingScheduler | import(\"../types\").NodeExecutionScheduler,\n offloadPolicy,\n workflowRunner,\n dependencyContainer,\n start,\n runToCompletion,\n runIntentStartToCompletion,\n makeRunId,\n makeActivationId,\n };\n }\n}\n","import type { DependencyContainer } from \"tsyringe\";\n\nimport type { TypeToken } from \"../di\";\n\nimport type { DefinedNodeRegistrationContext } from \"./WorkflowTestKit.types\";\n\nexport class WorkflowTestKitNodeRegistrationContextFactory {\n create(dependencyContainer: DependencyContainer): DefinedNodeRegistrationContext {\n return {\n registerNode<TValue>(token: TypeToken<TValue>, implementation?: TypeToken<TValue>) {\n dependencyContainer.register(token, {\n useClass: (implementation ?? token) as never,\n });\n },\n };\n }\n}\n","import type { RunnableNodeConfig, WorkflowDefinition, WorkflowId } from \"../types\";\nimport { WorkflowBuilder } from \"../workflow/dsl/WorkflowBuilder\";\n\nimport { WorkflowTestHarnessManualTriggerConfig } from \"./WorkflowTestHarnessManualTrigger\";\n\nconst defaultInlineWorkflowId = \"codemation.testing.workflowkit.inline\" as WorkflowId;\nconst defaultInlineWorkflowName = \"WorkflowTestKit inline\";\n\n/**\n * Builds the minimal trigger → runnable workflow used by {@link import(\"./WorkflowTestKit\").WorkflowTestKit.runNode}.\n */\nexport class WorkflowTestKitRunNodeWorkflowFactory {\n build(args: { node: RunnableNodeConfig; workflowId?: WorkflowId; workflowName?: string }): WorkflowDefinition {\n const workflowId = args.workflowId ?? defaultInlineWorkflowId;\n const workflowName = args.workflowName ?? defaultInlineWorkflowName;\n const trigger = new WorkflowTestHarnessManualTriggerConfig(\n \"WorkflowTestKit trigger\",\n \"workflowkit.harness.trigger\",\n );\n return new WorkflowBuilder({ id: workflowId, name: workflowName }).trigger(trigger).then(args.node).build();\n }\n\n defaultStartNodeId(): string {\n return \"workflowkit.harness.trigger\";\n }\n}\n","import type { DependencyContainer } from \"tsyringe\";\n\nimport type { Items, NodeId, RunnableNodeConfig, RunResult, WorkflowDefinition, WorkflowId } from \"../types\";\n\nimport { RegistrarEngineTestKitFactory } from \"./RegistrarEngineTestKitFactory\";\nimport type { EngineTestKitOptions, RegistrarEngineTestKitHandle } from \"./RegistrarEngineTestKit.types\";\nimport { WorkflowTestKitNodeRegistrationContextFactory } from \"./WorkflowTestKitNodeRegistrationContextFactory\";\nimport type { DefinedNodeRegistration } from \"./WorkflowTestKit.types\";\nimport { WorkflowTestKitRunNodeWorkflowFactory } from \"./WorkflowTestKitRunNodeWorkflowFactory\";\n\nexport type { DefinedNodeRegistration, DefinedNodeRegistrationContext } from \"./WorkflowTestKit.types\";\n\nexport type WorkflowTestKitOptions = EngineTestKitOptions;\n\nexport class WorkflowTestKit {\n private readonly handle: RegistrarEngineTestKitHandle;\n private readonly runNodeWorkflowFactory = new WorkflowTestKitRunNodeWorkflowFactory();\n private readonly nodeRegistrationContextFactory = new WorkflowTestKitNodeRegistrationContextFactory();\n\n constructor(options: WorkflowTestKitOptions = {}) {\n this.handle = RegistrarEngineTestKitFactory.create(options);\n }\n\n get dependencyContainer(): DependencyContainer {\n return this.handle.dependencyContainer;\n }\n\n get engine(): RegistrarEngineTestKitHandle[\"engine\"] {\n return this.handle.engine;\n }\n\n get workflowRunner(): RegistrarEngineTestKitHandle[\"workflowRunner\"] {\n return this.handle.workflowRunner;\n }\n\n get liveWorkflowRepository(): RegistrarEngineTestKitHandle[\"liveWorkflowRepository\"] {\n return this.handle.liveWorkflowRepository;\n }\n\n get runStore(): RegistrarEngineTestKitHandle[\"runStore\"] {\n return this.handle.runStore;\n }\n\n /**\n * Registers {@link import(\"../authoring/defineNode.types\").DefinedNode} implementations on the same DI container used by the engine\n * (same pattern as `plugin.register({ registerNode })` in the host).\n */\n registerDefinedNodes(definitions: ReadonlyArray<DefinedNodeRegistration>): void {\n const ctx = this.nodeRegistrationContextFactory.create(this.handle.dependencyContainer);\n for (const def of definitions) {\n def.register(ctx);\n }\n }\n\n async run(args: { workflow: WorkflowDefinition; items: Items; startAt?: NodeId }): Promise<RunResult> {\n await this.handle.start([args.workflow]);\n return await this.handle.workflowRunner.runById({\n workflowId: args.workflow.id,\n startAt: args.startAt,\n items: args.items,\n });\n }\n\n async runNode(args: {\n node: RunnableNodeConfig;\n items: Items;\n workflowId?: WorkflowId;\n workflowName?: string;\n }): Promise<RunResult> {\n const wf = this.runNodeWorkflowFactory.build(args);\n return await this.run({\n workflow: wf,\n items: args.items,\n startAt: this.runNodeWorkflowFactory.defaultStartNodeId(),\n });\n }\n}\n"],"mappings":"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"}
|
package/dist/testing.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { $t as
|
|
2
|
-
import { a as WorkflowSnapshotCodec, n as EngineRuntimeRegistrationOptions, t as EngineWorkflowRunnerService } from "./EngineWorkflowRunnerService-
|
|
1
|
+
import { $t as TriggerNode, A as NodeOutputs, At as ExecutionContextFactory, Bt as NodeExecutionContext, D as NodeId, F as ParentExecutionRef, G as TriggerNodeConfig, H as RunnableNodeConfig, Kn as RunResult, R as RunDataFactory, Tr as Container, Ut as NodeExecutionScheduler, Vt as NodeExecutionRequest, Wr as EngineExecutionLimitsPolicy, Xt as RunnableNodeExecuteArgs, Y as WorkflowDefinition, Yt as RunnableNode, _r as CredentialSessionService, cn as WorkflowRunnerService, er as WorkflowExecutionRepository, f as Items, jr as TypeToken, k as NodeOffloadPolicy, n as InMemoryLiveWorkflowRepository, qr as RunEventBus, r as Engine, rn as TriggerSetupStateRepository, t as RunIntentService, tn as TriggerSetupContext, tt as WorkflowId, u as Item } from "./RunIntentService-BvlTpmEb.cjs";
|
|
2
|
+
import { a as WorkflowSnapshotCodec, n as EngineRuntimeRegistrationOptions, t as EngineWorkflowRunnerService } from "./EngineWorkflowRunnerService-BBkL4VQF.cjs";
|
|
3
3
|
import { DependencyContainer, InjectionToken } from "tsyringe";
|
|
4
4
|
import { ZodType } from "zod";
|
|
5
5
|
|
|
@@ -18,36 +18,33 @@ declare class RejectingCredentialSessionService implements CredentialSessionServ
|
|
|
18
18
|
//#endregion
|
|
19
19
|
//#region src/testing/ItemHarnessNodeConfig.d.ts
|
|
20
20
|
/**
|
|
21
|
-
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema}
|
|
22
|
-
*
|
|
21
|
+
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema},
|
|
22
|
+
* then {@link ItemHarnessNode.execute} per item.
|
|
23
23
|
*/
|
|
24
|
-
declare class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown
|
|
24
|
+
declare class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown> implements RunnableNodeConfig<TIn, TOut> {
|
|
25
25
|
readonly name: string;
|
|
26
26
|
readonly inputSchema: ZodType<TIn>;
|
|
27
27
|
readonly runOne: (args: {
|
|
28
28
|
input: TIn;
|
|
29
|
-
item: Item<
|
|
29
|
+
item: Item<TIn>;
|
|
30
30
|
itemIndex: number;
|
|
31
|
-
items: Items<
|
|
32
|
-
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut
|
|
31
|
+
items: Items<TIn>;
|
|
32
|
+
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut>>;
|
|
33
33
|
}) => TOut | Promise<TOut>;
|
|
34
34
|
readonly opts: Readonly<{
|
|
35
35
|
id?: string;
|
|
36
|
-
mapInput?: ItemInputMapper<TWire, TIn>;
|
|
37
36
|
}>;
|
|
38
37
|
readonly kind: "node";
|
|
39
38
|
readonly type: TypeToken<unknown>;
|
|
40
39
|
constructor(name: string, inputSchema: ZodType<TIn>, runOne: (args: {
|
|
41
40
|
input: TIn;
|
|
42
|
-
item: Item<
|
|
41
|
+
item: Item<TIn>;
|
|
43
42
|
itemIndex: number;
|
|
44
|
-
items: Items<
|
|
45
|
-
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut
|
|
43
|
+
items: Items<TIn>;
|
|
44
|
+
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut>>;
|
|
46
45
|
}) => TOut | Promise<TOut>, opts?: Readonly<{
|
|
47
46
|
id?: string;
|
|
48
|
-
mapInput?: ItemInputMapper<TWire, TIn>;
|
|
49
47
|
}>);
|
|
50
|
-
get mapInput(): ItemInputMapper<TWire, TIn> | undefined;
|
|
51
48
|
get id(): string | undefined;
|
|
52
49
|
}
|
|
53
50
|
//#endregion
|
|
@@ -55,16 +52,10 @@ declare class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown, TWire = TIn>
|
|
|
55
52
|
/**
|
|
56
53
|
* Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).
|
|
57
54
|
*/
|
|
58
|
-
declare class ItemHarnessNode implements
|
|
55
|
+
declare class ItemHarnessNode implements RunnableNode<ItemHarnessNodeConfig<any, any>> {
|
|
59
56
|
readonly kind: "node";
|
|
60
57
|
readonly outputPorts: readonly ["main"];
|
|
61
|
-
|
|
62
|
-
input: unknown;
|
|
63
|
-
item: Item;
|
|
64
|
-
itemIndex: number;
|
|
65
|
-
items: Items;
|
|
66
|
-
ctx: NodeExecutionContext<ItemHarnessNodeConfig<any, any, any>>;
|
|
67
|
-
}): Promise<unknown>;
|
|
58
|
+
execute(args: RunnableNodeExecuteArgs<ItemHarnessNodeConfig<any, any>>): Promise<unknown>;
|
|
68
59
|
}
|
|
69
60
|
//#endregion
|
|
70
61
|
//#region src/testing/CapturingScheduler.d.ts
|
|
@@ -163,6 +154,8 @@ declare class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknow
|
|
|
163
154
|
}>;
|
|
164
155
|
readonly kind: "node";
|
|
165
156
|
readonly type: TypeToken<unknown>;
|
|
157
|
+
readonly workflowId: WorkflowId;
|
|
158
|
+
readonly startAt: NodeId | undefined;
|
|
166
159
|
constructor(name: string, args: Readonly<{
|
|
167
160
|
workflowId: WorkflowId;
|
|
168
161
|
startAt?: NodeId;
|
|
@@ -177,15 +170,13 @@ declare class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknow
|
|
|
177
170
|
hint?: "local" | "worker";
|
|
178
171
|
queue?: string;
|
|
179
172
|
}> | undefined;
|
|
180
|
-
get workflowId(): WorkflowId;
|
|
181
|
-
get startAt(): NodeId | undefined;
|
|
182
173
|
}
|
|
183
|
-
declare class SubWorkflowRunnerNode implements
|
|
174
|
+
declare class SubWorkflowRunnerNode implements RunnableNode<SubWorkflowRunnerConfig<any, any>> {
|
|
184
175
|
private readonly workflows;
|
|
185
176
|
readonly kind: "node";
|
|
186
177
|
readonly outputPorts: readonly ["main"];
|
|
187
178
|
constructor(workflows: WorkflowRunnerService);
|
|
188
|
-
execute(
|
|
179
|
+
execute(args: RunnableNodeExecuteArgs<SubWorkflowRunnerConfig<any, any>>): Promise<unknown>;
|
|
189
180
|
}
|
|
190
181
|
//#endregion
|
|
191
182
|
//#region src/testing/WorkflowTestHarnessManualTrigger.d.ts
|
package/dist/testing.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as EngineRuntimeRegistrationOptions } from "./EngineRuntimeRegistration.types-
|
|
1
|
+
import { Ai as Container, Bt as ParentExecutionRef, Fn as ExecutionContextFactory, Ft as NodeOutputs, Gn as NodeExecutionContext, Ii as TypeToken, Jn as NodeExecutionScheduler, Kn as NodeExecutionRequest, Mt as NodeId, Pt as NodeOffloadPolicy, Qi as RunEventBus, Si as CredentialSessionService, Ut as RunDataFactory, Xt as TriggerNodeConfig, Yi as EngineExecutionLimitsPolicy, Zr as RunResult, _t as Items, ai as WorkflowExecutionRepository, cr as TriggerSetupStateRepository, en as WorkflowDefinition, er as RunnableNode, ht as Item, ir as TriggerNode, l as WorkflowSnapshotCodec, n as InMemoryLiveWorkflowRepository, on as WorkflowId, or as TriggerSetupContext, pr as WorkflowRunnerService, qt as RunnableNodeConfig, r as EngineWorkflowRunnerService, t as RunIntentService, tr as RunnableNodeExecuteArgs, u as Engine } from "./RunIntentService-zbTchO9T.js";
|
|
2
|
+
import { t as EngineRuntimeRegistrationOptions } from "./EngineRuntimeRegistration.types-DU6MsjU9.js";
|
|
3
3
|
import { DependencyContainer, InjectionToken } from "tsyringe";
|
|
4
4
|
import { ZodType } from "zod";
|
|
5
5
|
|
|
@@ -18,36 +18,33 @@ declare class RejectingCredentialSessionService implements CredentialSessionServ
|
|
|
18
18
|
//#endregion
|
|
19
19
|
//#region src/testing/ItemHarnessNodeConfig.d.ts
|
|
20
20
|
/**
|
|
21
|
-
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema}
|
|
22
|
-
*
|
|
21
|
+
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema},
|
|
22
|
+
* then {@link ItemHarnessNode.execute} per item.
|
|
23
23
|
*/
|
|
24
|
-
declare class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown
|
|
24
|
+
declare class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown> implements RunnableNodeConfig<TIn, TOut> {
|
|
25
25
|
readonly name: string;
|
|
26
26
|
readonly inputSchema: ZodType<TIn>;
|
|
27
27
|
readonly runOne: (args: {
|
|
28
28
|
input: TIn;
|
|
29
|
-
item: Item<
|
|
29
|
+
item: Item<TIn>;
|
|
30
30
|
itemIndex: number;
|
|
31
|
-
items: Items<
|
|
32
|
-
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut
|
|
31
|
+
items: Items<TIn>;
|
|
32
|
+
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut>>;
|
|
33
33
|
}) => TOut | Promise<TOut>;
|
|
34
34
|
readonly opts: Readonly<{
|
|
35
35
|
id?: string;
|
|
36
|
-
mapInput?: ItemInputMapper<TWire, TIn>;
|
|
37
36
|
}>;
|
|
38
37
|
readonly kind: "node";
|
|
39
38
|
readonly type: TypeToken<unknown>;
|
|
40
39
|
constructor(name: string, inputSchema: ZodType<TIn>, runOne: (args: {
|
|
41
40
|
input: TIn;
|
|
42
|
-
item: Item<
|
|
41
|
+
item: Item<TIn>;
|
|
43
42
|
itemIndex: number;
|
|
44
|
-
items: Items<
|
|
45
|
-
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut
|
|
43
|
+
items: Items<TIn>;
|
|
44
|
+
ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut>>;
|
|
46
45
|
}) => TOut | Promise<TOut>, opts?: Readonly<{
|
|
47
46
|
id?: string;
|
|
48
|
-
mapInput?: ItemInputMapper<TWire, TIn>;
|
|
49
47
|
}>);
|
|
50
|
-
get mapInput(): ItemInputMapper<TWire, TIn> | undefined;
|
|
51
48
|
get id(): string | undefined;
|
|
52
49
|
}
|
|
53
50
|
//#endregion
|
|
@@ -55,16 +52,10 @@ declare class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown, TWire = TIn>
|
|
|
55
52
|
/**
|
|
56
53
|
* Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).
|
|
57
54
|
*/
|
|
58
|
-
declare class ItemHarnessNode implements
|
|
55
|
+
declare class ItemHarnessNode implements RunnableNode<ItemHarnessNodeConfig<any, any>> {
|
|
59
56
|
readonly kind: "node";
|
|
60
57
|
readonly outputPorts: readonly ["main"];
|
|
61
|
-
|
|
62
|
-
input: unknown;
|
|
63
|
-
item: Item;
|
|
64
|
-
itemIndex: number;
|
|
65
|
-
items: Items;
|
|
66
|
-
ctx: NodeExecutionContext<ItemHarnessNodeConfig<any, any, any>>;
|
|
67
|
-
}): Promise<unknown>;
|
|
58
|
+
execute(args: RunnableNodeExecuteArgs<ItemHarnessNodeConfig<any, any>>): Promise<unknown>;
|
|
68
59
|
}
|
|
69
60
|
//#endregion
|
|
70
61
|
//#region src/testing/CapturingScheduler.d.ts
|
|
@@ -163,6 +154,8 @@ declare class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknow
|
|
|
163
154
|
}>;
|
|
164
155
|
readonly kind: "node";
|
|
165
156
|
readonly type: TypeToken<unknown>;
|
|
157
|
+
readonly workflowId: WorkflowId;
|
|
158
|
+
readonly startAt: NodeId | undefined;
|
|
166
159
|
constructor(name: string, args: Readonly<{
|
|
167
160
|
workflowId: WorkflowId;
|
|
168
161
|
startAt?: NodeId;
|
|
@@ -177,15 +170,13 @@ declare class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknow
|
|
|
177
170
|
hint?: "local" | "worker";
|
|
178
171
|
queue?: string;
|
|
179
172
|
}> | undefined;
|
|
180
|
-
get workflowId(): WorkflowId;
|
|
181
|
-
get startAt(): NodeId | undefined;
|
|
182
173
|
}
|
|
183
|
-
declare class SubWorkflowRunnerNode implements
|
|
174
|
+
declare class SubWorkflowRunnerNode implements RunnableNode<SubWorkflowRunnerConfig<any, any>> {
|
|
184
175
|
private readonly workflows;
|
|
185
176
|
readonly kind: "node";
|
|
186
177
|
readonly outputPorts: readonly ["main"];
|
|
187
178
|
constructor(workflows: WorkflowRunnerService);
|
|
188
|
-
execute(
|
|
179
|
+
execute(args: RunnableNodeExecuteArgs<SubWorkflowRunnerConfig<any, any>>): Promise<unknown>;
|
|
189
180
|
}
|
|
190
181
|
//#endregion
|
|
191
182
|
//#region src/testing/WorkflowTestHarnessManualTrigger.d.ts
|
package/dist/testing.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as NodeExecutor, D as PersistedWorkflowTokenRegistry, E as WorkflowSnapshotCodec,
|
|
2
|
-
import { n as InMemoryRunEventBus, r as WorkflowBuilder, t as AllWorkflowsActiveWorkflowActivationPolicy } from "./workflowActivationPolicy-
|
|
3
|
-
import { n as InMemoryWorkflowExecutionRepository, t as EngineRuntimeRegistrar } from "./bootstrap-
|
|
1
|
+
import { A as NodeExecutor, D as PersistedWorkflowTokenRegistry, E as WorkflowSnapshotCodec, L as InProcessRetryRunner, N as emitPorts, R as DefaultExecutionContextFactory, T as NodeInstanceFactory, a as InMemoryLiveWorkflowRepository, b as HintOnlyOffloadPolicy, d as InMemoryRunDataFactory, gt as CoreTokens, i as RunIntentService, l as Engine, x as DefaultDrivingScheduler, y as InlineDrivingScheduler, z as DefaultAsyncSleeper } from "./runtime-BdH94eBR.js";
|
|
2
|
+
import { n as InMemoryRunEventBus, r as WorkflowBuilder, t as AllWorkflowsActiveWorkflowActivationPolicy } from "./workflowActivationPolicy-Td9HTOuD.js";
|
|
3
|
+
import { n as InMemoryWorkflowExecutionRepository, t as EngineRuntimeRegistrar } from "./bootstrap-DbUlOl11.js";
|
|
4
4
|
import { container } from "tsyringe";
|
|
5
5
|
|
|
6
6
|
//#region src/testing/RejectingCredentialSessionService.ts
|
|
@@ -22,7 +22,7 @@ var RejectingCredentialSessionService = class {
|
|
|
22
22
|
var ItemHarnessNode = class {
|
|
23
23
|
kind = "node";
|
|
24
24
|
outputPorts = ["main"];
|
|
25
|
-
async
|
|
25
|
+
async execute(args) {
|
|
26
26
|
return await args.ctx.config.runOne({
|
|
27
27
|
input: args.input,
|
|
28
28
|
item: args.item,
|
|
@@ -36,8 +36,8 @@ var ItemHarnessNode = class {
|
|
|
36
36
|
//#endregion
|
|
37
37
|
//#region src/testing/ItemHarnessNodeConfig.ts
|
|
38
38
|
/**
|
|
39
|
-
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema}
|
|
40
|
-
*
|
|
39
|
+
* Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema},
|
|
40
|
+
* then {@link ItemHarnessNode.execute} per item.
|
|
41
41
|
*/
|
|
42
42
|
var ItemHarnessNodeConfig = class {
|
|
43
43
|
kind = "node";
|
|
@@ -48,9 +48,6 @@ var ItemHarnessNodeConfig = class {
|
|
|
48
48
|
this.runOne = runOne;
|
|
49
49
|
this.opts = opts;
|
|
50
50
|
}
|
|
51
|
-
get mapInput() {
|
|
52
|
-
return this.opts.mapInput;
|
|
53
|
-
}
|
|
54
51
|
get id() {
|
|
55
52
|
return this.opts.id;
|
|
56
53
|
}
|
|
@@ -138,9 +135,13 @@ var InMemoryTriggerSetupStateRepository = class {
|
|
|
138
135
|
var SubWorkflowRunnerConfig = class {
|
|
139
136
|
kind = "node";
|
|
140
137
|
type = SubWorkflowRunnerNode;
|
|
138
|
+
workflowId;
|
|
139
|
+
startAt;
|
|
141
140
|
constructor(name, args) {
|
|
142
141
|
this.name = name;
|
|
143
142
|
this.args = args;
|
|
143
|
+
this.workflowId = args.workflowId;
|
|
144
|
+
this.startAt = args.startAt;
|
|
144
145
|
}
|
|
145
146
|
get id() {
|
|
146
147
|
return this.args.id;
|
|
@@ -148,12 +149,6 @@ var SubWorkflowRunnerConfig = class {
|
|
|
148
149
|
get execution() {
|
|
149
150
|
return this.args.execution;
|
|
150
151
|
}
|
|
151
|
-
get workflowId() {
|
|
152
|
-
return this.args.workflowId;
|
|
153
|
-
}
|
|
154
|
-
get startAt() {
|
|
155
|
-
return this.args.startAt;
|
|
156
|
-
}
|
|
157
152
|
};
|
|
158
153
|
var SubWorkflowRunnerNode = class {
|
|
159
154
|
kind = "node";
|
|
@@ -161,27 +156,23 @@ var SubWorkflowRunnerNode = class {
|
|
|
161
156
|
constructor(workflows) {
|
|
162
157
|
this.workflows = workflows;
|
|
163
158
|
}
|
|
164
|
-
async execute(
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
if (result.status !== "completed") throw new Error(`Subworkflow ${ctx.config.workflowId} did not complete (status=${result.status})`);
|
|
182
|
-
out.push(...result.outputs);
|
|
183
|
-
}
|
|
184
|
-
return { main: out };
|
|
159
|
+
async execute(args) {
|
|
160
|
+
const current = args.item;
|
|
161
|
+
const result = await this.workflows.runById({
|
|
162
|
+
workflowId: args.ctx.config.workflowId,
|
|
163
|
+
startAt: args.ctx.config.startAt,
|
|
164
|
+
items: [current],
|
|
165
|
+
parent: {
|
|
166
|
+
runId: args.ctx.runId,
|
|
167
|
+
workflowId: args.ctx.workflowId,
|
|
168
|
+
nodeId: args.ctx.nodeId,
|
|
169
|
+
subworkflowDepth: args.ctx.subworkflowDepth,
|
|
170
|
+
engineMaxNodeActivations: args.ctx.engineMaxNodeActivations,
|
|
171
|
+
engineMaxSubworkflowDepth: args.ctx.engineMaxSubworkflowDepth
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
if (result.status !== "completed") throw new Error(`Subworkflow ${args.ctx.config.workflowId} did not complete (status=${result.status})`);
|
|
175
|
+
return emitPorts({ main: result.outputs });
|
|
185
176
|
}
|
|
186
177
|
};
|
|
187
178
|
|
|
@@ -207,6 +198,18 @@ var WorkflowTestHarnessManualTriggerNode = class {
|
|
|
207
198
|
}
|
|
208
199
|
};
|
|
209
200
|
|
|
201
|
+
//#endregion
|
|
202
|
+
//#region src/testing/SwitchHarnessNode.ts
|
|
203
|
+
var SwitchHarnessNode = class {
|
|
204
|
+
kind = "node";
|
|
205
|
+
outputPorts = [];
|
|
206
|
+
async execute(args) {
|
|
207
|
+
const key = await Promise.resolve(args.ctx.config.cfg.resolveCaseKey(args.item, args.itemIndex, args.items, args.ctx));
|
|
208
|
+
const { cases, defaultCase } = args.ctx.config.cfg;
|
|
209
|
+
return emitPorts({ [cases.includes(key) ? key : defaultCase]: [args.item] });
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
|
|
210
213
|
//#endregion
|
|
211
214
|
//#region src/testing/RegistrarEngineTestKitFactory.ts
|
|
212
215
|
var RegistrarEngineTestKitFactory = class {
|
|
@@ -251,6 +254,7 @@ var RegistrarEngineTestKitFactory = class {
|
|
|
251
254
|
const workflowRunner = options.workflowRunner ?? dependencyContainer.resolve(CoreTokens.WorkflowRunnerService);
|
|
252
255
|
dependencyContainer.registerInstance(SubWorkflowRunnerNode, new SubWorkflowRunnerNode(workflowRunner));
|
|
253
256
|
dependencyContainer.registerInstance(ItemHarnessNode, new ItemHarnessNode());
|
|
257
|
+
dependencyContainer.registerInstance(SwitchHarnessNode, new SwitchHarnessNode());
|
|
254
258
|
dependencyContainer.registerInstance(WorkflowTestHarnessManualTriggerNode, new WorkflowTestHarnessManualTriggerNode());
|
|
255
259
|
const start = async (workflows) => {
|
|
256
260
|
await engine.start([...workflows]);
|