@codemation/core 0.2.0 → 0.2.3

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.
Files changed (61) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{EngineRuntimeRegistration.types-0sgV2XL2.d.ts → EngineRuntimeRegistration.types-Bjeo7Sfq.d.ts} +2 -2
  3. package/dist/{EngineWorkflowRunnerService-Dx7bJsJR.d.cts → EngineWorkflowRunnerService-Dd4yD31l.d.cts} +2 -2
  4. package/dist/{InMemoryRunDataFactory-qIYQEar7.d.cts → InMemoryRunDataFactory-OUzDmAHt.d.cts} +2 -2
  5. package/dist/{RunIntentService-BCvGdOSY.d.ts → RunIntentService-BAKikN8h.d.ts} +80 -12
  6. package/dist/{RunIntentService-CV8izV8t.d.cts → RunIntentService-Bkg4oYrM.d.cts} +74 -5
  7. package/dist/bootstrap/index.cjs +31 -31
  8. package/dist/bootstrap/index.d.cts +5 -3
  9. package/dist/bootstrap/index.d.ts +3 -3
  10. package/dist/bootstrap/index.js +2 -2
  11. package/dist/bootstrap-BD6CobHl.js +215 -0
  12. package/dist/bootstrap-BD6CobHl.js.map +1 -0
  13. package/dist/bootstrap-DwS5S7s9.cjs +240 -0
  14. package/dist/bootstrap-DwS5S7s9.cjs.map +1 -0
  15. package/dist/{index-BHmrZIHp.d.ts → index-BDHCiN22.d.ts} +23 -10
  16. package/dist/index.cjs +60 -32
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +28 -17
  19. package/dist/index.d.ts +3 -3
  20. package/dist/index.js +29 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/{RunIntentService-BFA48UpH.js → runtime-Cy-3FTI_.js} +1224 -94
  23. package/dist/runtime-Cy-3FTI_.js.map +1 -0
  24. package/dist/{RunIntentService-DcxXf_AM.cjs → runtime-ZJUpWmPH.cjs} +1251 -132
  25. package/dist/runtime-ZJUpWmPH.cjs.map +1 -0
  26. package/dist/testing.cjs +74 -29
  27. package/dist/testing.cjs.map +1 -1
  28. package/dist/testing.d.cts +55 -3
  29. package/dist/testing.d.ts +55 -3
  30. package/dist/testing.js +46 -3
  31. package/dist/testing.js.map +1 -1
  32. package/dist/workflowActivationPolicy-B8HzTk3o.js.map +1 -1
  33. package/dist/workflowActivationPolicy-BzyzXLa_.cjs.map +1 -1
  34. package/package.json +1 -1
  35. package/src/ai/AgentMessageConfigNormalizerFactory.ts +43 -0
  36. package/src/ai/AgentToolFactory.ts +2 -2
  37. package/src/ai/AiHost.ts +10 -9
  38. package/src/ai/NodeBackedToolConfig.ts +1 -1
  39. package/src/authoring/defineNode.types.ts +7 -1
  40. package/src/contracts/runtimeTypes.ts +26 -0
  41. package/src/contracts/workflowTypes.ts +67 -5
  42. package/src/execution/ActivationEnqueueService.ts +8 -5
  43. package/src/execution/NodeActivationRequestInputPreparer.ts +89 -0
  44. package/src/execution/NodeExecutor.ts +38 -1
  45. package/src/execution/NodeInputContractError.ts +13 -0
  46. package/src/execution/index.ts +2 -0
  47. package/src/orchestration/RunContinuationService.ts +181 -50
  48. package/src/planning/RunQueuePlanner.ts +12 -1
  49. package/src/runtime/EngineFactory.ts +3 -0
  50. package/src/testing/ItemHarnessNode.ts +27 -0
  51. package/src/testing/ItemHarnessNodeConfig.ts +43 -0
  52. package/src/testing/RegistrarEngineTestKitFactory.ts +2 -0
  53. package/src/testing.ts +2 -0
  54. package/src/workflow/dsl/ChainCursorResolver.ts +1 -1
  55. package/src/workflow/dsl/workflowBuilderTypes.ts +8 -5
  56. package/dist/RunIntentService-BFA48UpH.js.map +0 -1
  57. package/dist/RunIntentService-DcxXf_AM.cjs.map +0 -1
  58. package/dist/bootstrap-D67Sf2BF.js +0 -1136
  59. package/dist/bootstrap-D67Sf2BF.js.map +0 -1
  60. package/dist/bootstrap-DoQHAEQJ.cjs +0 -1203
  61. package/dist/bootstrap-DoQHAEQJ.cjs.map +0 -1
package/dist/testing.cjs CHANGED
@@ -1,8 +1,8 @@
1
- const require_RunIntentService = require('./RunIntentService-DcxXf_AM.cjs');
1
+ const require_runtime = require('./runtime-ZJUpWmPH.cjs');
2
2
  const require_workflowActivationPolicy = require('./workflowActivationPolicy-BzyzXLa_.cjs');
3
- const require_bootstrap = require('./bootstrap-DoQHAEQJ.cjs');
3
+ const require_bootstrap = require('./bootstrap-DwS5S7s9.cjs');
4
4
  let tsyringe = require("tsyringe");
5
- tsyringe = require_RunIntentService.__toESM(tsyringe);
5
+ tsyringe = require_runtime.__toESM(tsyringe);
6
6
 
7
7
  //#region src/testing/RejectingCredentialSessionService.ts
8
8
  /**
@@ -15,6 +15,48 @@ var RejectingCredentialSessionService = class {
15
15
  }
16
16
  };
17
17
 
18
+ //#endregion
19
+ //#region src/testing/ItemHarnessNode.ts
20
+ /**
21
+ * Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).
22
+ */
23
+ var ItemHarnessNode = class {
24
+ kind = "node";
25
+ outputPorts = ["main"];
26
+ async executeOne(args) {
27
+ return await args.ctx.config.runOne({
28
+ input: args.input,
29
+ item: args.item,
30
+ itemIndex: args.itemIndex,
31
+ items: args.items,
32
+ ctx: args.ctx
33
+ });
34
+ }
35
+ };
36
+
37
+ //#endregion
38
+ //#region src/testing/ItemHarnessNodeConfig.ts
39
+ /**
40
+ * Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema} +
41
+ * optional {@link RunnableNodeConfig.mapInput}, then {@link ItemHarnessNode.executeOne} per item.
42
+ */
43
+ var ItemHarnessNodeConfig = class {
44
+ kind = "node";
45
+ type = ItemHarnessNode;
46
+ constructor(name, inputSchema, runOne, opts = {}) {
47
+ this.name = name;
48
+ this.inputSchema = inputSchema;
49
+ this.runOne = runOne;
50
+ this.opts = opts;
51
+ }
52
+ get mapInput() {
53
+ return this.opts.mapInput;
54
+ }
55
+ get id() {
56
+ return this.opts.id;
57
+ }
58
+ };
59
+
18
60
  //#endregion
19
61
  //#region src/testing/CapturingScheduler.ts
20
62
  /**
@@ -172,7 +214,7 @@ var RegistrarEngineTestKitFactory = class {
172
214
  static create(options = {}) {
173
215
  const runStore = options.runStore ?? new require_bootstrap.InMemoryWorkflowExecutionRepository();
174
216
  const scheduler = options.scheduler ?? new CapturingScheduler();
175
- const offloadPolicy = options.offloadPolicy ?? new require_RunIntentService.HintOnlyOffloadPolicy();
217
+ const offloadPolicy = options.offloadPolicy ?? new require_runtime.HintOnlyOffloadPolicy();
176
218
  const runIdGen = new PrefixedSequentialIdGenerator("run_");
177
219
  const activationIdGen = new PrefixedSequentialIdGenerator("act_");
178
220
  const makeRunId = options.makeRunId ?? runIdGen.asFn();
@@ -180,35 +222,36 @@ var RegistrarEngineTestKitFactory = class {
180
222
  const credentialSessions = options.credentialSessions ?? new RejectingCredentialSessionService();
181
223
  const eventBus = options.eventBus ?? new require_workflowActivationPolicy.InMemoryRunEventBus();
182
224
  const triggerSetupStateRepository = options.triggerSetupStateRepository ?? new InMemoryTriggerSetupStateRepository();
183
- const liveWorkflowRepository = new require_RunIntentService.InMemoryLiveWorkflowRepository();
184
- const runDataFactory = options.runDataFactory ?? new require_RunIntentService.InMemoryRunDataFactory();
185
- const executionContextFactory = options.executionContextFactory ?? new require_RunIntentService.DefaultExecutionContextFactory();
225
+ const liveWorkflowRepository = new require_runtime.InMemoryLiveWorkflowRepository();
226
+ const runDataFactory = options.runDataFactory ?? new require_runtime.InMemoryRunDataFactory();
227
+ const executionContextFactory = options.executionContextFactory ?? new require_runtime.DefaultExecutionContextFactory();
186
228
  const container = options.container ?? tsyringe.container.createChildContainer();
187
229
  const dependencyContainer = container;
188
230
  const nodeResolver = container;
189
- const activationScheduler = new require_RunIntentService.DefaultDrivingScheduler(offloadPolicy, scheduler, new require_RunIntentService.InlineDrivingScheduler(new require_RunIntentService.NodeExecutor(new require_RunIntentService.NodeInstanceFactory(nodeResolver), new require_RunIntentService.InProcessRetryRunner(new require_RunIntentService.DefaultAsyncSleeper()))));
231
+ const activationScheduler = new require_runtime.DefaultDrivingScheduler(offloadPolicy, scheduler, new require_runtime.InlineDrivingScheduler(new require_runtime.NodeExecutor(new require_runtime.NodeInstanceFactory(nodeResolver), new require_runtime.InProcessRetryRunner(new require_runtime.DefaultAsyncSleeper()))));
190
232
  for (const [token, value] of options.providers ?? /* @__PURE__ */ new Map()) dependencyContainer.registerInstance(token, value);
191
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.CredentialSessionService, credentialSessions);
192
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.LiveWorkflowRepository, liveWorkflowRepository);
193
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.WorkflowRepository, liveWorkflowRepository);
194
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.NodeResolver, nodeResolver);
195
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.RunIdFactory, new EngineTestKitRunIdFactory(makeRunId, makeActivationId));
196
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.ActivationIdFactory, new EngineTestKitRunIdFactory(makeRunId, makeActivationId));
197
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.WebhookBasePath, options.webhookBasePath ?? "/webhooks");
198
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.WorkflowExecutionRepository, runStore);
199
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.TriggerSetupStateRepository, triggerSetupStateRepository);
200
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.NodeActivationScheduler, activationScheduler);
201
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.RunDataFactory, runDataFactory);
202
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.ExecutionContextFactory, executionContextFactory);
203
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.RunEventBus, eventBus);
204
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.PersistedWorkflowTokenRegistry, new require_RunIntentService.PersistedWorkflowTokenRegistry());
205
- dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.WorkflowActivationPolicy, new require_workflowActivationPolicy.AllWorkflowsActiveWorkflowActivationPolicy());
206
- if (options.executionLimitsPolicy !== void 0) dependencyContainer.registerInstance(require_RunIntentService.CoreTokens.EngineExecutionLimitsPolicy, options.executionLimitsPolicy);
233
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.CredentialSessionService, credentialSessions);
234
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.LiveWorkflowRepository, liveWorkflowRepository);
235
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.WorkflowRepository, liveWorkflowRepository);
236
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.NodeResolver, nodeResolver);
237
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.RunIdFactory, new EngineTestKitRunIdFactory(makeRunId, makeActivationId));
238
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.ActivationIdFactory, new EngineTestKitRunIdFactory(makeRunId, makeActivationId));
239
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.WebhookBasePath, options.webhookBasePath ?? "/webhooks");
240
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.WorkflowExecutionRepository, runStore);
241
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.TriggerSetupStateRepository, triggerSetupStateRepository);
242
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.NodeActivationScheduler, activationScheduler);
243
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.RunDataFactory, runDataFactory);
244
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.ExecutionContextFactory, executionContextFactory);
245
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.RunEventBus, eventBus);
246
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.PersistedWorkflowTokenRegistry, new require_runtime.PersistedWorkflowTokenRegistry());
247
+ dependencyContainer.registerInstance(require_runtime.CoreTokens.WorkflowActivationPolicy, new require_workflowActivationPolicy.AllWorkflowsActiveWorkflowActivationPolicy());
248
+ if (options.executionLimitsPolicy !== void 0) dependencyContainer.registerInstance(require_runtime.CoreTokens.EngineExecutionLimitsPolicy, options.executionLimitsPolicy);
207
249
  new require_bootstrap.EngineRuntimeRegistrar().register(dependencyContainer, options.registrarOptions ?? {});
208
- const engine = dependencyContainer.resolve(require_bootstrap.Engine);
209
- const runIntent = dependencyContainer.resolve(require_RunIntentService.RunIntentService);
210
- const workflowRunner = options.workflowRunner ?? dependencyContainer.resolve(require_RunIntentService.CoreTokens.WorkflowRunnerService);
250
+ const engine = dependencyContainer.resolve(require_runtime.Engine);
251
+ const runIntent = dependencyContainer.resolve(require_runtime.RunIntentService);
252
+ const workflowRunner = options.workflowRunner ?? dependencyContainer.resolve(require_runtime.CoreTokens.WorkflowRunnerService);
211
253
  dependencyContainer.registerInstance(SubWorkflowRunnerNode, new SubWorkflowRunnerNode(workflowRunner));
254
+ dependencyContainer.registerInstance(ItemHarnessNode, new ItemHarnessNode());
212
255
  dependencyContainer.registerInstance(WorkflowTestHarnessManualTriggerNode, new WorkflowTestHarnessManualTriggerNode());
213
256
  const start = async (workflows) => {
214
257
  await engine.start([...workflows]);
@@ -331,8 +374,10 @@ var WorkflowTestKit = class {
331
374
 
332
375
  //#endregion
333
376
  exports.CapturingScheduler = CapturingScheduler;
334
- exports.InMemoryLiveWorkflowRepository = require_RunIntentService.InMemoryLiveWorkflowRepository;
335
- exports.PersistedWorkflowSnapshotFactory = require_RunIntentService.WorkflowSnapshotCodec;
377
+ exports.InMemoryLiveWorkflowRepository = require_runtime.InMemoryLiveWorkflowRepository;
378
+ exports.ItemHarnessNode = ItemHarnessNode;
379
+ exports.ItemHarnessNodeConfig = ItemHarnessNodeConfig;
380
+ exports.PersistedWorkflowSnapshotFactory = require_runtime.WorkflowSnapshotCodec;
336
381
  exports.PrefixedSequentialIdGenerator = PrefixedSequentialIdGenerator;
337
382
  exports.RegistrarEngineTestKitFactory = RegistrarEngineTestKitFactory;
338
383
  exports.RejectingCredentialSessionService = RejectingCredentialSessionService;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.cjs","names":["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/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 { 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 { 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(\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":";;;;;;;;;;;AAMA,IAAa,oCAAb,MAAmF;CACjF,MAAM,WACJ,MACmB;AACnB,QAAM,IAAI,MACR,oDAAoD,KAAK,WAAW,QAAQ,KAAK,OAAO,SAAS,KAAK,QAAQ,wFAC/G;;;;;;;;;ACPL,IAAa,qBAAb,MAAkE;CAChE;CACA,WAAmC,EAAE;CAErC,MAAM,QAAQ,SAA+D;AAC3E,OAAK,cAAc;AACnB,OAAK,SAAS,KAAK,QAAQ;AAC3B,SAAO,EAAE,WAAW,WAAW,KAAK,SAAS,UAAU;;;;;;;;;ACT3D,IAAa,gCAAb,MAA2C;CACzC,AAAQ,IAAI;CAEZ,YAAY,AAAiBA,QAAgB;EAAhB;;CAE7B,OAAe;AACb,OAAK,KAAK;AACV,SAAO,GAAG,KAAK,SAAS,KAAK;;CAG/B,OAAqB;AACnB,eAAa,KAAK,MAAM;;;;;;;;;ACT5B,IAAa,4BAAb,MAA+D;CAC7D,AAAQ,aAAa;CACrB,AAAQ,oBAAoB;CAE5B,YACE,AAAiBC,gBACjB,AAAiBC,uBACjB;EAFiB;EACA;;CAGnB,YAAoB;AAClB,OAAK,cAAc;AACnB,SAAO,KAAK,gBAAgB;;CAG9B,mBAA2B;AACzB,OAAK,qBAAqB;AAC1B,SAAO,KAAK,uBAAuB;;;;;;ACnBvC,IAAa,sCAAb,MAAwF;CACtF,AAAiB,8BAAc,IAAI,KAAyC;CAE5E,MAAM,KAAK,SAAkG;AAC3G,SAAO,KAAK,YAAY,IAAI,KAAK,MAAM,QAAQ,CAAC;;CAGlD,MAAM,KAAK,OAAkD;AAC3D,OAAK,YAAY,IAAI,KAAK,MAAM,MAAM,QAAQ,EAAE,MAAM;;CAGxD,MAAM,OAAO,SAAgE;AAC3E,OAAK,YAAY,OAAO,KAAK,MAAM,QAAQ,CAAC;;CAG9C,AAAQ,MAAM,SAAyD;AACrE,SAAO,GAAG,QAAQ,WAAW,GAAG,QAAQ;;;;;;;;;ACD5C,IAAa,0BAAb,MAGE;CACA,AAAS,OAAO;CAChB,AAAS,OAA2B;CAEpC,YACE,AAAgBC,MAChB,AAAgBC,MAMhB;EAPgB;EACA;;CAQlB,IAAI,KAAyB;AAC3B,SAAO,KAAK,KAAK;;CAGnB,IAAI,YAAiF;AACnF,SAAO,KAAK,KAAK;;CAGnB,IAAI,aAAyB;AAC3B,SAAO,KAAK,KAAK;;CAGnB,IAAI,UAA8B;AAChC,SAAO,KAAK,KAAK;;;AAIrB,IAAa,wBAAb,MAAsF;CACpF,AAAS,OAAO;CAChB,AAAS,cAAc,CAAC,OAAO;CAE/B,YAAY,AAAiBC,WAAkC;EAAlC;;CAE7B,MAAM,QAAQ,OAAc,KAAoF;EAC9G,MAAMC,MAAc,EAAE;AACtB,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,MAAM,UAAU,MAAM;GACtB,MAAM,SAAS,MAAM,KAAK,UAAU,QAAQ;IAC1C,YAAY,IAAI,OAAO;IACvB,SAAS,IAAI,OAAO;IACpB,OAAO,CAAC,QAAQ;IAChB,QAAQ;KACN,OAAO,IAAI;KACX,YAAY,IAAI;KAChB,QAAQ,IAAI;KACZ,kBAAkB,IAAI;KACtB,0BAA0B,IAAI;KAC9B,2BAA2B,IAAI;KAChC;IACF,CAAC;AACF,OAAI,OAAO,WAAW,YACpB,OAAM,IAAI,MAAM,eAAe,IAAI,OAAO,WAAW,4BAA4B,OAAO,OAAO,GAAG;AAEpG,OAAI,KAAK,GAAG,OAAO,QAAQ;;AAG7B,SAAO,EAAE,MAAM,KAAK;;;;;;;;;AClExB,IAAa,yCAAb,MAA0F;CACxF,AAAS,OAAO;CAChB,AAAS,OAA2B;CAEpC,YACE,AAAgBC,MAChB,AAAgBC,IAChB;EAFgB;EACA;;;AAIpB,IAAa,uCAAb,MAAiH;CAC/G,AAAS,OAAO;CAChB,AAAS,cAAc,CAAC,OAAO;CAE/B,MAAM,MAAM,MAAuF;CAInG,MAAM,QACJ,OACA,MACsB;AACtB,SAAO,EAAE,MAAM,OAAO;;;;;;ACF1B,IAAa,gCAAb,MAA2C;CACzC,OAAO,OAAO,UAAyC,EAAE,EAAgC;EACvF,MAAM,WAAW,QAAQ,YAAY,IAAIC,uDAAqC;EAC9E,MAAM,YAAY,QAAQ,aAAa,IAAI,oBAAoB;EAC/D,MAAM,gBAAgB,QAAQ,iBAAiB,IAAIC,gDAAuB;EAC1E,MAAM,WAAW,IAAI,8BAA8B,OAAO;EAC1D,MAAM,kBAAkB,IAAI,8BAA8B,OAAO;EACjE,MAAM,YAAY,QAAQ,aAAa,SAAS,MAAM;EACtD,MAAM,mBAAmB,QAAQ,oBAAoB,gBAAgB,MAAM;EAC3E,MAAM,qBAAqB,QAAQ,sBAAsB,IAAI,mCAAmC;EAChG,MAAM,WAAW,QAAQ,YAAY,IAAIC,sDAAqB;EAC9D,MAAM,8BACJ,QAAQ,+BAA+B,IAAI,qCAAqC;EAClF,MAAM,yBAAyB,IAAIC,yDAAgC;EACnE,MAAM,iBAAiB,QAAQ,kBAAkB,IAAIC,iDAAwB;EAC7E,MAAM,0BAA0B,QAAQ,2BAA2B,IAAIC,yDAAgC;EACvG,MAAM,YAAY,QAAQ,aAAaC,mBAAkB,sBAAsB;EAC/E,MAAM,sBAAsB;EAC5B,MAAM,eAAe;EAKrB,MAAM,sBAAsB,IAAIC,iDAC9B,eACA,WACA,IAAIC,gDAPe,IAAIC,sCACvB,IAAIC,6CAAoB,aAAa,EACrC,IAAIC,8CAAqB,IAAIC,8CAAqB,CAAC,CACpD,CAIyC,CACzC;AAED,OAAK,MAAM,CAAC,OAAO,UAAU,QAAQ,6BAAa,IAAI,KAAuC,CAC3F,qBAAoB,iBAAiB,OAAO,MAAM;AAGpD,sBAAoB,iBAAiBC,oCAAW,0BAA0B,mBAAmB;AAC7F,sBAAoB,iBAAiBA,oCAAW,wBAAwB,uBAAuB;AAC/F,sBAAoB,iBAAiBA,oCAAW,oBAAoB,uBAAuB;AAC3F,sBAAoB,iBAAiBA,oCAAW,cAAc,aAAa;AAC3E,sBAAoB,iBAClBA,oCAAW,cACX,IAAI,0BAA0B,WAAW,iBAAiB,CAC3D;AACD,sBAAoB,iBAClBA,oCAAW,qBACX,IAAI,0BAA0B,WAAW,iBAAiB,CAC3D;AACD,sBAAoB,iBAAiBA,oCAAW,iBAAiB,QAAQ,mBAAmB,YAAY;AACxG,sBAAoB,iBAAiBA,oCAAW,6BAA6B,SAAS;AACtF,sBAAoB,iBAAiBA,oCAAW,6BAA6B,4BAA4B;AACzG,sBAAoB,iBAAiBA,oCAAW,yBAAyB,oBAAoB;AAC7F,sBAAoB,iBAAiBA,oCAAW,gBAAgB,eAAe;AAC/E,sBAAoB,iBAAiBA,oCAAW,yBAAyB,wBAAwB;AACjG,sBAAoB,iBAAiBA,oCAAW,aAAa,SAAS;AACtE,sBAAoB,iBAClBA,oCAAW,gCACX,IAAIC,yDAAgC,CACrC;AACD,sBAAoB,iBAClBD,oCAAW,0BACX,IAAIE,6EAA4C,CACjD;AAED,MAAI,QAAQ,0BAA0B,OACpC,qBAAoB,iBAAiBF,oCAAW,6BAA6B,QAAQ,sBAAsB;AAG7G,MAAIG,0CAAwB,CAAC,SAAS,qBAAqB,QAAQ,oBAAoB,EAAE,CAAC;EAE1F,MAAM,SAAS,oBAAoB,QAAQC,yBAAO;EAClD,MAAM,YAAY,oBAAoB,QAAQC,0CAAiB;EAC/D,MAAM,iBACJ,QAAQ,kBACP,oBAAoB,QAAQL,oCAAW,sBAAsB;AAChE,sBAAoB,iBAClB,uBACA,IAAI,sBAAsB,eAAwC,CACnE;AACD,sBAAoB,iBAClB,sCACA,IAAI,sCAAsC,CAC3C;EAED,MAAM,QAAQ,OAAO,cAAmF;AACtG,SAAM,OAAO,MAAM,CAAC,GAAG,UAAU,CAAC;;EAGpC,MAAMM,kBAAmE,OAAO,SAAS;GACvF,MAAM,KAAK,MAAM,OAAO,YAAY,KAAK,IAAI,KAAK,SAAS,KAAK,OAAO,KAAK,OAAO;AACnF,OAAI,GAAG,WAAW,UAAW,QAAO;AACpC,UAAO,MAAM,OAAO,kBAAkB,GAAG,MAAM;;EAGjD,MAAMC,6BAAyF,OAAO,SAAS;GAC7G,MAAM,KAAK,MAAM,UAAU,cAAc;IACvC,UAAU,KAAK;IACf,SAAS,KAAK;IACd,OAAO,KAAK;IACZ,QAAQ,KAAK;IACd,CAAC;AACF,OAAI,GAAG,WAAW,UAAW,QAAO;AACpC,UAAO,MAAM,OAAO,kBAAkB,GAAG,MAAM;;AAGjD,SAAO;GACL;GACA;GACA;GACA;GACA;GACW;GACX;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;;;;;;ACjJL,IAAa,gDAAb,MAA2D;CACzD,OAAO,qBAA0E;AAC/E,SAAO,EACL,aAAqB,OAA0B,gBAAoC;AACjF,uBAAoB,SAAS,OAAO,EAClC,UAAW,kBAAkB,OAC9B,CAAC;KAEL;;;;;;ACTL,MAAM,0BAA0B;AAChC,MAAM,4BAA4B;;;;AAKlC,IAAa,wCAAb,MAAmD;CACjD,MAAM,MAAwG;EAC5G,MAAM,aAAa,KAAK,cAAc;EACtC,MAAM,eAAe,KAAK,gBAAgB;EAC1C,MAAM,UAAU,IAAI,uCAClB,2BACA,8BACD;AACD,SAAO,IAAIC,iDAAgB;GAAE,IAAI;GAAY,MAAM;GAAc,CAAC,CAAC,QAAQ,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO;;CAG7G,qBAA6B;AAC3B,SAAO;;;;;;ACTX,IAAa,kBAAb,MAA6B;CAC3B,AAAiB;CACjB,AAAiB,yBAAyB,IAAI,uCAAuC;CACrF,AAAiB,iCAAiC,IAAI,+CAA+C;CAErG,YAAY,UAAkC,EAAE,EAAE;AAChD,OAAK,SAAS,8BAA8B,OAAO,QAAQ;;CAG7D,IAAI,sBAA2C;AAC7C,SAAO,KAAK,OAAO;;CAGrB,IAAI,SAAiD;AACnD,SAAO,KAAK,OAAO;;CAGrB,IAAI,iBAAiE;AACnE,SAAO,KAAK,OAAO;;CAGrB,IAAI,yBAAiF;AACnF,SAAO,KAAK,OAAO;;CAGrB,IAAI,WAAqD;AACvD,SAAO,KAAK,OAAO;;;;;;CAOrB,qBAAqB,aAA2D;EAC9E,MAAM,MAAM,KAAK,+BAA+B,OAAO,KAAK,OAAO,oBAAoB;AACvF,OAAK,MAAM,OAAO,YAChB,KAAI,SAAS,IAAI;;CAIrB,MAAM,IAAI,MAA4F;AACpG,QAAM,KAAK,OAAO,MAAM,CAAC,KAAK,SAAS,CAAC;AACxC,SAAO,MAAM,KAAK,OAAO,eAAe,QAAQ;GAC9C,YAAY,KAAK,SAAS;GAC1B,SAAS,KAAK;GACd,OAAO,KAAK;GACb,CAAC;;CAGJ,MAAM,QAAQ,MAKS;EACrB,MAAM,KAAK,KAAK,uBAAuB,MAAM,KAAK;AAClD,SAAO,MAAM,KAAK,IAAI;GACpB,UAAU;GACV,OAAO,KAAK;GACZ,SAAS,KAAK,uBAAuB,oBAAoB;GAC1D,CAAC"}
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,6 +1,7 @@
1
- import { Cr as TypeToken, Ct as WorkflowId, I as Items, Ir as EngineExecutionLimitsPolicy, Jt as ExecutionContextFactory, Q as NodeOutputs, Y as NodeId, Z as NodeOffloadPolicy, Zt as Node, _n as TriggerSetupContext, _r as Container, _t as WorkflowDefinition, an as NodeExecutionRequest, b as CredentialSessionService, cr as RunResult, gr as WorkflowExecutionRepository, hn as TriggerNode, in as NodeExecutionContext, n as InMemoryLiveWorkflowRepository, ot as RunDataFactory, pt as TriggerNodeConfig, r as Engine, rt as ParentExecutionRef, sn as NodeExecutionScheduler, t as RunIntentService, ut as RunnableNodeConfig, wn as WorkflowRunnerService, yn as TriggerSetupStateRepository, zr as RunEventBus } from "./RunIntentService-CV8izV8t.cjs";
2
- import { a as WorkflowSnapshotCodec, n as EngineRuntimeRegistrationOptions, t as EngineWorkflowRunnerService } from "./EngineWorkflowRunnerService-Dx7bJsJR.cjs";
1
+ import { $t as ExecutionContextFactory, An as WorkflowRunnerService, Cn as TriggerSetupContext, Cr as Container, Dt as WorkflowId, Gr as RunEventBus, Hr as EngineExecutionLimitsPolicy, I as ItemInputMapper, P as Item, Q as NodeId, Sr as WorkflowExecutionRepository, Tn as TriggerSetupStateRepository, _t as TriggerNodeConfig, b as CredentialSessionService, dn as NodeExecutionRequest, en as ItemNode, et as NodeOffloadPolicy, kr as TypeToken, lt as RunDataFactory, mr as RunResult, n as InMemoryLiveWorkflowRepository, ot as ParentExecutionRef, pn as NodeExecutionScheduler, pt as RunnableNodeConfig, r as Engine, rn as Node, t as RunIntentService, tt as NodeOutputs, un as NodeExecutionContext, xn as TriggerNode, xt as WorkflowDefinition, z as Items } from "./RunIntentService-Bkg4oYrM.cjs";
2
+ import { a as WorkflowSnapshotCodec, n as EngineRuntimeRegistrationOptions, t as EngineWorkflowRunnerService } from "./EngineWorkflowRunnerService-Dd4yD31l.cjs";
3
3
  import { DependencyContainer, InjectionToken } from "tsyringe";
4
+ import { ZodType } from "zod";
4
5
 
5
6
  //#region src/testing/RejectingCredentialSessionService.d.ts
6
7
  /**
@@ -15,6 +16,57 @@ declare class RejectingCredentialSessionService implements CredentialSessionServ
15
16
  }>): Promise<TSession>;
16
17
  }
17
18
  //#endregion
19
+ //#region src/testing/ItemHarnessNodeConfig.d.ts
20
+ /**
21
+ * Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema} +
22
+ * optional {@link RunnableNodeConfig.mapInput}, then {@link ItemHarnessNode.executeOne} per item.
23
+ */
24
+ declare class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown, TWire = TIn> implements RunnableNodeConfig<TIn, TOut, TWire> {
25
+ readonly name: string;
26
+ readonly inputSchema: ZodType<TIn>;
27
+ readonly runOne: (args: {
28
+ input: TIn;
29
+ item: Item<TWire>;
30
+ itemIndex: number;
31
+ items: Items<TWire>;
32
+ ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut, TWire>>;
33
+ }) => TOut | Promise<TOut>;
34
+ readonly opts: Readonly<{
35
+ id?: string;
36
+ mapInput?: ItemInputMapper<TWire, TIn>;
37
+ }>;
38
+ readonly kind: "node";
39
+ readonly type: TypeToken<unknown>;
40
+ constructor(name: string, inputSchema: ZodType<TIn>, runOne: (args: {
41
+ input: TIn;
42
+ item: Item<TWire>;
43
+ itemIndex: number;
44
+ items: Items<TWire>;
45
+ ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut, TWire>>;
46
+ }) => TOut | Promise<TOut>, opts?: Readonly<{
47
+ id?: string;
48
+ mapInput?: ItemInputMapper<TWire, TIn>;
49
+ }>);
50
+ get mapInput(): ItemInputMapper<TWire, TIn> | undefined;
51
+ get id(): string | undefined;
52
+ }
53
+ //#endregion
54
+ //#region src/testing/ItemHarnessNode.d.ts
55
+ /**
56
+ * Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).
57
+ */
58
+ declare class ItemHarnessNode implements ItemNode<ItemHarnessNodeConfig<any, any, any>, unknown, unknown> {
59
+ readonly kind: "node";
60
+ readonly outputPorts: readonly ["main"];
61
+ executeOne(args: {
62
+ input: unknown;
63
+ item: Item;
64
+ itemIndex: number;
65
+ items: Items;
66
+ ctx: NodeExecutionContext<ItemHarnessNodeConfig<any, any, any>>;
67
+ }): Promise<unknown>;
68
+ }
69
+ //#endregion
18
70
  //#region src/testing/CapturingScheduler.d.ts
19
71
  /**
20
72
  * Test scheduler that records enqueue requests without executing a real queue.
@@ -192,5 +244,5 @@ declare class WorkflowTestKit {
192
244
  }): Promise<RunResult>;
193
245
  }
194
246
  //#endregion
195
- export { CapturingScheduler, type DefinedNodeRegistration, type DefinedNodeRegistrationContext, type EngineTestKitOptions, InMemoryLiveWorkflowRepository, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, PrefixedSequentialIdGenerator, RegistrarEngineTestKitFactory, type RegistrarEngineTestKitHandle, type RegistrarEngineTestKitOptions, RejectingCredentialSessionService, SubWorkflowRunnerConfig, SubWorkflowRunnerNode, WorkflowTestHarnessManualTriggerConfig, WorkflowTestHarnessManualTriggerNode, WorkflowTestKit, type WorkflowTestKitOptions };
247
+ export { CapturingScheduler, type DefinedNodeRegistration, type DefinedNodeRegistrationContext, type EngineTestKitOptions, InMemoryLiveWorkflowRepository, ItemHarnessNode, ItemHarnessNodeConfig, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, PrefixedSequentialIdGenerator, RegistrarEngineTestKitFactory, type RegistrarEngineTestKitHandle, type RegistrarEngineTestKitOptions, RejectingCredentialSessionService, SubWorkflowRunnerConfig, SubWorkflowRunnerNode, WorkflowTestHarnessManualTriggerConfig, WorkflowTestHarnessManualTriggerNode, WorkflowTestKit, type WorkflowTestKitOptions };
196
248
  //# sourceMappingURL=testing.d.cts.map
package/dist/testing.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { Bt as NodeOutputs, Di as RunEventBus, Gt as ParentExecutionRef, In as ExecutionContextFactory, Jt as RunDataFactory, Kn as NodeExecutionContext, Lt as NodeId, Qt as RunnableNodeConfig, Xr as RunResult, Yn as NodeExecutionScheduler, ai as Container, an as WorkflowDefinition, ar as TriggerSetupContext, ct as CredentialSessionService, di as TypeToken, dn as WorkflowId, fr as WorkflowRunnerService, ii as WorkflowExecutionRepository, l as WorkflowSnapshotCodec, n as InMemoryLiveWorkflowRepository, qn as NodeExecutionRequest, r as EngineWorkflowRunnerService, rr as TriggerNode, sr as TriggerSetupStateRepository, t as RunIntentService, tn as TriggerNodeConfig, u as Engine, wi as EngineExecutionLimitsPolicy, wt as Items, zn as Node, zt as NodeOffloadPolicy } from "./RunIntentService-BCvGdOSY.js";
2
- import { t as EngineRuntimeRegistrationOptions } from "./EngineRuntimeRegistration.types-0sgV2XL2.js";
1
+ import { $n as NodeExecutionRequest, Ai as EngineExecutionLimitsPolicy, Bt as NodeId, Dt as Items, Gn as Node, Hn as ItemNode, Ht as NodeOffloadPolicy, Jt as ParentExecutionRef, Ni as RunEventBus, Qn as NodeExecutionContext, St as Item, Ut as NodeOutputs, Vn as ExecutionContextFactory, Zt as RunDataFactory, _i as TypeToken, an as TriggerNodeConfig, ct as CredentialSessionService, di as Container, dr as TriggerSetupContext, hn as WorkflowId, l as WorkflowSnapshotCodec, ln as WorkflowDefinition, lr as TriggerNode, n as InMemoryLiveWorkflowRepository, ni as RunResult, pr as TriggerSetupStateRepository, r as EngineWorkflowRunnerService, t as RunIntentService, tn as RunnableNodeConfig, tr as NodeExecutionScheduler, u as Engine, ui as WorkflowExecutionRepository, vr as WorkflowRunnerService, wt as ItemInputMapper } from "./RunIntentService-BAKikN8h.js";
2
+ import { t as EngineRuntimeRegistrationOptions } from "./EngineRuntimeRegistration.types-Bjeo7Sfq.js";
3
3
  import { DependencyContainer, InjectionToken } from "tsyringe";
4
+ import { ZodType } from "zod";
4
5
 
5
6
  //#region src/testing/RejectingCredentialSessionService.d.ts
6
7
  /**
@@ -15,6 +16,57 @@ declare class RejectingCredentialSessionService implements CredentialSessionServ
15
16
  }>): Promise<TSession>;
16
17
  }
17
18
  //#endregion
19
+ //#region src/testing/ItemHarnessNodeConfig.d.ts
20
+ /**
21
+ * Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema} +
22
+ * optional {@link RunnableNodeConfig.mapInput}, then {@link ItemHarnessNode.executeOne} per item.
23
+ */
24
+ declare class ItemHarnessNodeConfig<TIn = unknown, TOut = unknown, TWire = TIn> implements RunnableNodeConfig<TIn, TOut, TWire> {
25
+ readonly name: string;
26
+ readonly inputSchema: ZodType<TIn>;
27
+ readonly runOne: (args: {
28
+ input: TIn;
29
+ item: Item<TWire>;
30
+ itemIndex: number;
31
+ items: Items<TWire>;
32
+ ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut, TWire>>;
33
+ }) => TOut | Promise<TOut>;
34
+ readonly opts: Readonly<{
35
+ id?: string;
36
+ mapInput?: ItemInputMapper<TWire, TIn>;
37
+ }>;
38
+ readonly kind: "node";
39
+ readonly type: TypeToken<unknown>;
40
+ constructor(name: string, inputSchema: ZodType<TIn>, runOne: (args: {
41
+ input: TIn;
42
+ item: Item<TWire>;
43
+ itemIndex: number;
44
+ items: Items<TWire>;
45
+ ctx: NodeExecutionContext<ItemHarnessNodeConfig<TIn, TOut, TWire>>;
46
+ }) => TOut | Promise<TOut>, opts?: Readonly<{
47
+ id?: string;
48
+ mapInput?: ItemInputMapper<TWire, TIn>;
49
+ }>);
50
+ get mapInput(): ItemInputMapper<TWire, TIn> | undefined;
51
+ get id(): string | undefined;
52
+ }
53
+ //#endregion
54
+ //#region src/testing/ItemHarnessNode.d.ts
55
+ /**
56
+ * Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).
57
+ */
58
+ declare class ItemHarnessNode implements ItemNode<ItemHarnessNodeConfig<any, any, any>, unknown, unknown> {
59
+ readonly kind: "node";
60
+ readonly outputPorts: readonly ["main"];
61
+ executeOne(args: {
62
+ input: unknown;
63
+ item: Item;
64
+ itemIndex: number;
65
+ items: Items;
66
+ ctx: NodeExecutionContext<ItemHarnessNodeConfig<any, any, any>>;
67
+ }): Promise<unknown>;
68
+ }
69
+ //#endregion
18
70
  //#region src/testing/CapturingScheduler.d.ts
19
71
  /**
20
72
  * Test scheduler that records enqueue requests without executing a real queue.
@@ -192,5 +244,5 @@ declare class WorkflowTestKit {
192
244
  }): Promise<RunResult>;
193
245
  }
194
246
  //#endregion
195
- export { CapturingScheduler, type DefinedNodeRegistration, type DefinedNodeRegistrationContext, type EngineTestKitOptions, InMemoryLiveWorkflowRepository, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, PrefixedSequentialIdGenerator, RegistrarEngineTestKitFactory, type RegistrarEngineTestKitHandle, type RegistrarEngineTestKitOptions, RejectingCredentialSessionService, SubWorkflowRunnerConfig, SubWorkflowRunnerNode, WorkflowTestHarnessManualTriggerConfig, WorkflowTestHarnessManualTriggerNode, WorkflowTestKit, type WorkflowTestKitOptions };
247
+ export { CapturingScheduler, type DefinedNodeRegistration, type DefinedNodeRegistrationContext, type EngineTestKitOptions, InMemoryLiveWorkflowRepository, ItemHarnessNode, ItemHarnessNodeConfig, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, PrefixedSequentialIdGenerator, RegistrarEngineTestKitFactory, type RegistrarEngineTestKitHandle, type RegistrarEngineTestKitOptions, RejectingCredentialSessionService, SubWorkflowRunnerConfig, SubWorkflowRunnerNode, WorkflowTestHarnessManualTriggerConfig, WorkflowTestHarnessManualTriggerNode, WorkflowTestKit, type WorkflowTestKitOptions };
196
248
  //# sourceMappingURL=testing.d.ts.map
package/dist/testing.js CHANGED
@@ -1,6 +1,6 @@
1
- import { A as NodeExecutor, F as DefaultAsyncSleeper, N as InProcessRetryRunner, P as DefaultExecutionContextFactory, S as NodeInstanceFactory, T as PersistedWorkflowTokenRegistry, ct as CoreTokens, d as DefaultDrivingScheduler, i as InMemoryRunDataFactory, l as InlineDrivingScheduler, n as InMemoryLiveWorkflowRepository, t as RunIntentService, u as HintOnlyOffloadPolicy, w as WorkflowSnapshotCodec } from "./RunIntentService-BFA48UpH.js";
1
+ import { A as NodeExecutor, D as PersistedWorkflowTokenRegistry, E as WorkflowSnapshotCodec, M as InProcessRetryRunner, N as DefaultExecutionContextFactory, P as DefaultAsyncSleeper, T as NodeInstanceFactory, a as InMemoryLiveWorkflowRepository, b as HintOnlyOffloadPolicy, d as InMemoryRunDataFactory, i as RunIntentService, l as Engine, ot as CoreTokens, x as DefaultDrivingScheduler, y as InlineDrivingScheduler } from "./runtime-Cy-3FTI_.js";
2
2
  import { n as InMemoryRunEventBus, r as WorkflowBuilder, t as AllWorkflowsActiveWorkflowActivationPolicy } from "./workflowActivationPolicy-B8HzTk3o.js";
3
- import { a as Engine, o as InMemoryWorkflowExecutionRepository, t as EngineRuntimeRegistrar } from "./bootstrap-D67Sf2BF.js";
3
+ import { n as InMemoryWorkflowExecutionRepository, t as EngineRuntimeRegistrar } from "./bootstrap-BD6CobHl.js";
4
4
  import { container } from "tsyringe";
5
5
 
6
6
  //#region src/testing/RejectingCredentialSessionService.ts
@@ -14,6 +14,48 @@ var RejectingCredentialSessionService = class {
14
14
  }
15
15
  };
16
16
 
17
+ //#endregion
18
+ //#region src/testing/ItemHarnessNode.ts
19
+ /**
20
+ * Item-mode harness node for engine tests (see {@link ItemHarnessNodeConfig}).
21
+ */
22
+ var ItemHarnessNode = class {
23
+ kind = "node";
24
+ outputPorts = ["main"];
25
+ async executeOne(args) {
26
+ return await args.ctx.config.runOne({
27
+ input: args.input,
28
+ item: args.item,
29
+ itemIndex: args.itemIndex,
30
+ items: args.items,
31
+ ctx: args.ctx
32
+ });
33
+ }
34
+ };
35
+
36
+ //#endregion
37
+ //#region src/testing/ItemHarnessNodeConfig.ts
38
+ /**
39
+ * Item-mode harness node config for engine tests: engine applies {@link RunnableNodeConfig.inputSchema} +
40
+ * optional {@link RunnableNodeConfig.mapInput}, then {@link ItemHarnessNode.executeOne} per item.
41
+ */
42
+ var ItemHarnessNodeConfig = class {
43
+ kind = "node";
44
+ type = ItemHarnessNode;
45
+ constructor(name, inputSchema, runOne, opts = {}) {
46
+ this.name = name;
47
+ this.inputSchema = inputSchema;
48
+ this.runOne = runOne;
49
+ this.opts = opts;
50
+ }
51
+ get mapInput() {
52
+ return this.opts.mapInput;
53
+ }
54
+ get id() {
55
+ return this.opts.id;
56
+ }
57
+ };
58
+
17
59
  //#endregion
18
60
  //#region src/testing/CapturingScheduler.ts
19
61
  /**
@@ -208,6 +250,7 @@ var RegistrarEngineTestKitFactory = class {
208
250
  const runIntent = dependencyContainer.resolve(RunIntentService);
209
251
  const workflowRunner = options.workflowRunner ?? dependencyContainer.resolve(CoreTokens.WorkflowRunnerService);
210
252
  dependencyContainer.registerInstance(SubWorkflowRunnerNode, new SubWorkflowRunnerNode(workflowRunner));
253
+ dependencyContainer.registerInstance(ItemHarnessNode, new ItemHarnessNode());
211
254
  dependencyContainer.registerInstance(WorkflowTestHarnessManualTriggerNode, new WorkflowTestHarnessManualTriggerNode());
212
255
  const start = async (workflows) => {
213
256
  await engine.start([...workflows]);
@@ -329,5 +372,5 @@ var WorkflowTestKit = class {
329
372
  };
330
373
 
331
374
  //#endregion
332
- export { CapturingScheduler, InMemoryLiveWorkflowRepository, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, PrefixedSequentialIdGenerator, RegistrarEngineTestKitFactory, RejectingCredentialSessionService, SubWorkflowRunnerConfig, SubWorkflowRunnerNode, WorkflowTestHarnessManualTriggerConfig, WorkflowTestHarnessManualTriggerNode, WorkflowTestKit };
375
+ export { CapturingScheduler, InMemoryLiveWorkflowRepository, ItemHarnessNode, ItemHarnessNodeConfig, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, PrefixedSequentialIdGenerator, RegistrarEngineTestKitFactory, RejectingCredentialSessionService, SubWorkflowRunnerConfig, SubWorkflowRunnerNode, WorkflowTestHarnessManualTriggerConfig, WorkflowTestHarnessManualTriggerNode, WorkflowTestKit };
333
376
  //# sourceMappingURL=testing.js.map