@codemation/core 0.0.19 → 0.2.1

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 (81) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/EngineRuntimeRegistration.types-0sgV2XL2.d.ts +42 -0
  3. package/dist/EngineWorkflowRunnerService-Dx7bJsJR.d.cts +73 -0
  4. package/dist/InMemoryRunDataFactory-qIYQEar7.d.cts +94 -0
  5. package/dist/{InMemoryLiveWorkflowRepository-DxoualoC.d.ts → RunIntentService-BCvGdOSY.d.ts} +438 -9
  6. package/dist/{RunIntentService-C1nu_YwM.js → RunIntentService-BFA48UpH.js} +252 -67
  7. package/dist/RunIntentService-BFA48UpH.js.map +1 -0
  8. package/dist/{InMemoryLiveWorkflowRepository-orY1VsWG.d.cts → RunIntentService-CV8izV8t.d.cts} +214 -7
  9. package/dist/{RunIntentService-ZkjpY7MS.cjs → RunIntentService-DcxXf_AM.cjs} +262 -65
  10. package/dist/RunIntentService-DcxXf_AM.cjs.map +1 -0
  11. package/dist/bootstrap/index.cjs +14 -1135
  12. package/dist/bootstrap/index.d.cts +7 -60
  13. package/dist/bootstrap/index.d.ts +4 -40
  14. package/dist/bootstrap/index.js +3 -1122
  15. package/dist/bootstrap-D67Sf2BF.js +1136 -0
  16. package/dist/bootstrap-D67Sf2BF.js.map +1 -0
  17. package/dist/bootstrap-DoQHAEQJ.cjs +1203 -0
  18. package/dist/bootstrap-DoQHAEQJ.cjs.map +1 -0
  19. package/dist/{index-BIewO9-9.d.ts → index-CueSzHsf.d.ts} +37 -260
  20. package/dist/index.cjs +99 -223
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +201 -6
  23. package/dist/index.d.ts +3 -3
  24. package/dist/index.js +93 -218
  25. package/dist/index.js.map +1 -1
  26. package/dist/testing.cjs +329 -3
  27. package/dist/testing.cjs.map +1 -1
  28. package/dist/testing.d.cts +181 -4
  29. package/dist/testing.d.ts +181 -3
  30. package/dist/testing.js +319 -2
  31. package/dist/testing.js.map +1 -1
  32. package/dist/workflowActivationPolicy-B8HzTk3o.js +201 -0
  33. package/dist/workflowActivationPolicy-B8HzTk3o.js.map +1 -0
  34. package/dist/workflowActivationPolicy-BzyzXLa_.cjs +231 -0
  35. package/dist/workflowActivationPolicy-BzyzXLa_.cjs.map +1 -0
  36. package/package.json +1 -1
  37. package/src/ai/AgentConnectionNodeCollector.ts +99 -0
  38. package/src/ai/AgentToolFactory.ts +38 -2
  39. package/src/ai/AiHost.ts +1 -1
  40. package/src/authoring/defineNode.types.ts +6 -0
  41. package/src/browser.ts +11 -0
  42. package/src/contracts/executionPersistenceContracts.ts +186 -0
  43. package/src/contracts/index.ts +1 -0
  44. package/src/contracts/runFinishedAtFactory.ts +5 -2
  45. package/src/contracts/runTypes.ts +10 -0
  46. package/src/contracts/runtimeTypes.ts +6 -2
  47. package/src/contracts/workflowTypes.ts +3 -2
  48. package/src/events/EventPublishingWorkflowExecutionRepository.ts +5 -0
  49. package/src/execution/ActivationEnqueueService.ts +8 -8
  50. package/src/execution/PersistedRunStateTerminalBuilder.ts +3 -0
  51. package/src/index.ts +6 -0
  52. package/src/orchestration/NodeExecutionRequestHandlerService.ts +11 -6
  53. package/src/orchestration/RunContinuationService.ts +94 -24
  54. package/src/runStorage/InMemoryWorkflowExecutionRepository.ts +14 -1
  55. package/src/scheduler/DefaultDrivingScheduler.ts +21 -11
  56. package/src/scheduler/InlineDrivingScheduler.ts +17 -21
  57. package/src/testing/CapturingScheduler.ts +15 -0
  58. package/src/testing/EngineTestKitRunIdFactory.ts +24 -0
  59. package/src/testing/InMemoryTriggerSetupStateRepository.ts +21 -0
  60. package/src/testing/PrefixedSequentialIdGenerator.ts +17 -0
  61. package/src/testing/RegistrarEngineTestKit.types.ts +76 -0
  62. package/src/testing/RegistrarEngineTestKitFactory.ts +154 -0
  63. package/src/testing/SubWorkflowRunnerTestNode.ts +83 -0
  64. package/src/testing/WorkflowTestHarnessManualTrigger.ts +39 -0
  65. package/src/testing/WorkflowTestKit.types.ts +9 -0
  66. package/src/testing/WorkflowTestKitBuilder.ts +77 -0
  67. package/src/testing/WorkflowTestKitNodeRegistrationContextFactory.ts +17 -0
  68. package/src/testing/WorkflowTestKitRunNodeWorkflowFactory.ts +26 -0
  69. package/src/testing.ts +19 -0
  70. package/src/types/index.ts +1 -0
  71. package/src/workflow/definition/ConnectionNodeIdFactory.ts +28 -0
  72. package/dist/InMemoryLiveWorkflowRepository-BTzHpQ6e.cjs +0 -151
  73. package/dist/InMemoryLiveWorkflowRepository-BTzHpQ6e.cjs.map +0 -1
  74. package/dist/InMemoryLiveWorkflowRepository-BoLNnVLg.js +0 -139
  75. package/dist/InMemoryLiveWorkflowRepository-BoLNnVLg.js.map +0 -1
  76. package/dist/RunIntentService-C1nu_YwM.js.map +0 -1
  77. package/dist/RunIntentService-DjbxzBBP.d.cts +0 -288
  78. package/dist/RunIntentService-ZkjpY7MS.cjs.map +0 -1
  79. package/dist/WorkflowSnapshotCodec-DSEzKyt3.d.cts +0 -22
  80. package/dist/bootstrap/index.cjs.map +0 -1
  81. package/dist/bootstrap/index.js.map +0 -1
package/dist/testing.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { I as CredentialSessionService, n as WorkflowSnapshotCodec, t as InMemoryLiveWorkflowRepository } from "./InMemoryLiveWorkflowRepository-DxoualoC.js";
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";
3
+ import { DependencyContainer, InjectionToken } from "tsyringe";
2
4
 
3
5
  //#region src/testing/RejectingCredentialSessionService.d.ts
4
-
5
6
  /**
6
7
  * Test harness default: rejects any credential lookup so missing bindings fail loudly.
7
8
  * Prefer registering a real {@link CredentialSessionService} in integration scenarios.
@@ -14,5 +15,182 @@ declare class RejectingCredentialSessionService implements CredentialSessionServ
14
15
  }>): Promise<TSession>;
15
16
  }
16
17
  //#endregion
17
- export { InMemoryLiveWorkflowRepository, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, RejectingCredentialSessionService };
18
+ //#region src/testing/CapturingScheduler.d.ts
19
+ /**
20
+ * Test scheduler that records enqueue requests without executing a real queue.
21
+ */
22
+ declare class CapturingScheduler implements NodeExecutionScheduler {
23
+ lastRequest: NodeExecutionRequest | undefined;
24
+ requests: NodeExecutionRequest[];
25
+ enqueue(request: NodeExecutionRequest): Promise<{
26
+ receiptId: string;
27
+ }>;
28
+ }
29
+ //#endregion
30
+ //#region src/testing/PrefixedSequentialIdGenerator.d.ts
31
+ /**
32
+ * Deterministic `run_1`, `act_1`-style ids for test harness factories.
33
+ */
34
+ declare class PrefixedSequentialIdGenerator {
35
+ private readonly prefix;
36
+ private n;
37
+ constructor(prefix: string);
38
+ next(): string;
39
+ asFn(): () => string;
40
+ }
41
+ //#endregion
42
+ //#region src/testing/RegistrarEngineTestKit.types.d.ts
43
+ type EngineTestKitOptions = Partial<{
44
+ container: Container;
45
+ providers: Map<InjectionToken<unknown>, unknown>;
46
+ credentialSessions: CredentialSessionService;
47
+ runStore: WorkflowExecutionRepository;
48
+ scheduler: NodeExecutionScheduler;
49
+ offloadPolicy: NodeOffloadPolicy;
50
+ runDataFactory: RunDataFactory;
51
+ executionContextFactory: ExecutionContextFactory;
52
+ eventBus: RunEventBus;
53
+ triggerSetupStateRepository: TriggerSetupStateRepository;
54
+ webhookBasePath: string;
55
+ makeRunId: () => string;
56
+ makeActivationId: () => string;
57
+ workflowRunner: EngineWorkflowRunnerService;
58
+ /** Passed to engine factory so integration tests can assert host-configured limits propagate. */
59
+ executionLimitsPolicy: EngineExecutionLimitsPolicy;
60
+ }>;
61
+ type RegistrarEngineTestKitOptions = EngineTestKitOptions & {
62
+ /** Passed to {@link EngineRuntimeRegistrar.register}. */
63
+ registrarOptions?: EngineRuntimeRegistrationOptions;
64
+ };
65
+ interface RegistrarEngineTestKitHandle {
66
+ readonly engine: Engine;
67
+ readonly runIntent: RunIntentService;
68
+ readonly liveWorkflowRepository: InMemoryLiveWorkflowRepository;
69
+ readonly runStore: WorkflowExecutionRepository;
70
+ readonly triggerSetupStateRepository: TriggerSetupStateRepository;
71
+ readonly scheduler: CapturingScheduler | NodeExecutionScheduler;
72
+ readonly offloadPolicy: NodeOffloadPolicy;
73
+ readonly workflowRunner: EngineWorkflowRunnerService;
74
+ readonly dependencyContainer: DependencyContainer;
75
+ start(workflows: ReadonlyArray<WorkflowDefinition>): Promise<void>;
76
+ runToCompletion(args: {
77
+ wf: WorkflowDefinition;
78
+ startAt: string;
79
+ items: Items;
80
+ parent?: ParentExecutionRef;
81
+ }): Promise<RunResult>;
82
+ runIntentStartToCompletion(args: {
83
+ wf: WorkflowDefinition;
84
+ startAt: string;
85
+ items: Items;
86
+ parent?: ParentExecutionRef;
87
+ }): Promise<RunResult>;
88
+ readonly makeRunId: () => string;
89
+ readonly makeActivationId: () => string;
90
+ }
91
+ //#endregion
92
+ //#region src/testing/RegistrarEngineTestKitFactory.d.ts
93
+ declare class RegistrarEngineTestKitFactory {
94
+ static create(options?: RegistrarEngineTestKitOptions): RegistrarEngineTestKitHandle;
95
+ }
96
+ //#endregion
97
+ //#region src/testing/SubWorkflowRunnerTestNode.d.ts
98
+ /**
99
+ * Test harness subworkflow runner (mirrors integration patterns; lives under {@link "@codemation/core/testing"}).
100
+ */
101
+ declare class SubWorkflowRunnerConfig<TInputJson = unknown, TOutputJson = unknown> implements RunnableNodeConfig<TInputJson, TOutputJson> {
102
+ readonly name: string;
103
+ readonly args: Readonly<{
104
+ workflowId: WorkflowId;
105
+ startAt?: NodeId;
106
+ id?: string;
107
+ execution?: Readonly<{
108
+ hint?: "local" | "worker";
109
+ queue?: string;
110
+ }>;
111
+ }>;
112
+ readonly kind: "node";
113
+ readonly type: TypeToken<unknown>;
114
+ constructor(name: string, args: Readonly<{
115
+ workflowId: WorkflowId;
116
+ startAt?: NodeId;
117
+ id?: string;
118
+ execution?: Readonly<{
119
+ hint?: "local" | "worker";
120
+ queue?: string;
121
+ }>;
122
+ }>);
123
+ get id(): string | undefined;
124
+ get execution(): Readonly<{
125
+ hint?: "local" | "worker";
126
+ queue?: string;
127
+ }> | undefined;
128
+ get workflowId(): WorkflowId;
129
+ get startAt(): NodeId | undefined;
130
+ }
131
+ declare class SubWorkflowRunnerNode implements Node<SubWorkflowRunnerConfig<any, any>> {
132
+ private readonly workflows;
133
+ readonly kind: "node";
134
+ readonly outputPorts: readonly ["main"];
135
+ constructor(workflows: WorkflowRunnerService);
136
+ execute(items: Items, ctx: NodeExecutionContext<SubWorkflowRunnerConfig<any, any>>): Promise<NodeOutputs>;
137
+ }
138
+ //#endregion
139
+ //#region src/testing/WorkflowTestHarnessManualTrigger.d.ts
140
+ /**
141
+ * Minimal pass-through manual trigger for {@link WorkflowTestKit.runNode}; emits input items unchanged.
142
+ */
143
+ declare class WorkflowTestHarnessManualTriggerConfig implements TriggerNodeConfig<unknown> {
144
+ readonly name: string;
145
+ readonly id?: string | undefined;
146
+ readonly kind: "trigger";
147
+ readonly type: TypeToken<unknown>;
148
+ constructor(name: string, id?: string | undefined);
149
+ }
150
+ declare class WorkflowTestHarnessManualTriggerNode implements TriggerNode<WorkflowTestHarnessManualTriggerConfig> {
151
+ readonly kind: "trigger";
152
+ readonly outputPorts: readonly ["main"];
153
+ setup(_ctx: TriggerSetupContext<WorkflowTestHarnessManualTriggerConfig>): Promise<undefined>;
154
+ execute(items: Items, _ctx: NodeExecutionContext<WorkflowTestHarnessManualTriggerConfig>): Promise<NodeOutputs>;
155
+ }
156
+ //#endregion
157
+ //#region src/testing/WorkflowTestKit.types.d.ts
158
+ type DefinedNodeRegistrationContext = {
159
+ registerNode<TValue>(token: TypeToken<TValue>, implementation?: TypeToken<TValue>): void;
160
+ };
161
+ type DefinedNodeRegistration = {
162
+ register(context: DefinedNodeRegistrationContext): void;
163
+ };
164
+ //#endregion
165
+ //#region src/testing/WorkflowTestKitBuilder.d.ts
166
+ type WorkflowTestKitOptions = EngineTestKitOptions;
167
+ declare class WorkflowTestKit {
168
+ private readonly handle;
169
+ private readonly runNodeWorkflowFactory;
170
+ private readonly nodeRegistrationContextFactory;
171
+ constructor(options?: WorkflowTestKitOptions);
172
+ get dependencyContainer(): DependencyContainer;
173
+ get engine(): RegistrarEngineTestKitHandle["engine"];
174
+ get workflowRunner(): RegistrarEngineTestKitHandle["workflowRunner"];
175
+ get liveWorkflowRepository(): RegistrarEngineTestKitHandle["liveWorkflowRepository"];
176
+ get runStore(): RegistrarEngineTestKitHandle["runStore"];
177
+ /**
178
+ * Registers {@link import("../authoring/defineNode.types").DefinedNode} implementations on the same DI container used by the engine
179
+ * (same pattern as `plugin.register({ registerNode })` in the host).
180
+ */
181
+ registerDefinedNodes(definitions: ReadonlyArray<DefinedNodeRegistration>): void;
182
+ run(args: {
183
+ workflow: WorkflowDefinition;
184
+ items: Items;
185
+ startAt?: NodeId;
186
+ }): Promise<RunResult>;
187
+ runNode(args: {
188
+ node: RunnableNodeConfig;
189
+ items: Items;
190
+ workflowId?: WorkflowId;
191
+ workflowName?: string;
192
+ }): Promise<RunResult>;
193
+ }
194
+ //#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 };
18
196
  //# sourceMappingURL=testing.d.ts.map
package/dist/testing.js CHANGED
@@ -1,4 +1,7 @@
1
- import { n as WorkflowSnapshotCodec, t as InMemoryLiveWorkflowRepository } from "./InMemoryLiveWorkflowRepository-BoLNnVLg.js";
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";
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";
4
+ import { container } from "tsyringe";
2
5
 
3
6
  //#region src/testing/RejectingCredentialSessionService.ts
4
7
  /**
@@ -12,5 +15,319 @@ var RejectingCredentialSessionService = class {
12
15
  };
13
16
 
14
17
  //#endregion
15
- export { InMemoryLiveWorkflowRepository, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, RejectingCredentialSessionService };
18
+ //#region src/testing/CapturingScheduler.ts
19
+ /**
20
+ * Test scheduler that records enqueue requests without executing a real queue.
21
+ */
22
+ var CapturingScheduler = class {
23
+ lastRequest;
24
+ requests = [];
25
+ async enqueue(request) {
26
+ this.lastRequest = request;
27
+ this.requests.push(request);
28
+ return { receiptId: `receipt_${this.requests.length}` };
29
+ }
30
+ };
31
+
32
+ //#endregion
33
+ //#region src/testing/PrefixedSequentialIdGenerator.ts
34
+ /**
35
+ * Deterministic `run_1`, `act_1`-style ids for test harness factories.
36
+ */
37
+ var PrefixedSequentialIdGenerator = class {
38
+ n = 0;
39
+ constructor(prefix) {
40
+ this.prefix = prefix;
41
+ }
42
+ next() {
43
+ this.n += 1;
44
+ return `${this.prefix}${this.n}`;
45
+ }
46
+ asFn() {
47
+ return () => this.next();
48
+ }
49
+ };
50
+
51
+ //#endregion
52
+ //#region src/testing/EngineTestKitRunIdFactory.ts
53
+ /**
54
+ * @internal Test harness id factory shared by registrar kit wiring.
55
+ */
56
+ var EngineTestKitRunIdFactory = class {
57
+ runCounter = 0;
58
+ activationCounter = 0;
59
+ constructor(makeRunIdValue, makeActivationIdValue) {
60
+ this.makeRunIdValue = makeRunIdValue;
61
+ this.makeActivationIdValue = makeActivationIdValue;
62
+ }
63
+ makeRunId() {
64
+ this.runCounter += 1;
65
+ return this.makeRunIdValue();
66
+ }
67
+ makeActivationId() {
68
+ this.activationCounter += 1;
69
+ return this.makeActivationIdValue();
70
+ }
71
+ };
72
+
73
+ //#endregion
74
+ //#region src/testing/InMemoryTriggerSetupStateRepository.ts
75
+ var InMemoryTriggerSetupStateRepository = class {
76
+ statesByKey = /* @__PURE__ */ new Map();
77
+ async load(trigger) {
78
+ return this.statesByKey.get(this.toKey(trigger));
79
+ }
80
+ async save(state) {
81
+ this.statesByKey.set(this.toKey(state.trigger), state);
82
+ }
83
+ async delete(trigger) {
84
+ this.statesByKey.delete(this.toKey(trigger));
85
+ }
86
+ toKey(trigger) {
87
+ return `${trigger.workflowId}:${trigger.nodeId}`;
88
+ }
89
+ };
90
+
91
+ //#endregion
92
+ //#region src/testing/SubWorkflowRunnerTestNode.ts
93
+ /**
94
+ * Test harness subworkflow runner (mirrors integration patterns; lives under {@link "@codemation/core/testing"}).
95
+ */
96
+ var SubWorkflowRunnerConfig = class {
97
+ kind = "node";
98
+ type = SubWorkflowRunnerNode;
99
+ constructor(name, args) {
100
+ this.name = name;
101
+ this.args = args;
102
+ }
103
+ get id() {
104
+ return this.args.id;
105
+ }
106
+ get execution() {
107
+ return this.args.execution;
108
+ }
109
+ get workflowId() {
110
+ return this.args.workflowId;
111
+ }
112
+ get startAt() {
113
+ return this.args.startAt;
114
+ }
115
+ };
116
+ var SubWorkflowRunnerNode = class {
117
+ kind = "node";
118
+ outputPorts = ["main"];
119
+ constructor(workflows) {
120
+ this.workflows = workflows;
121
+ }
122
+ async execute(items, ctx) {
123
+ const out = [];
124
+ for (let i = 0; i < items.length; i++) {
125
+ const current = items[i];
126
+ const result = await this.workflows.runById({
127
+ workflowId: ctx.config.workflowId,
128
+ startAt: ctx.config.startAt,
129
+ items: [current],
130
+ parent: {
131
+ runId: ctx.runId,
132
+ workflowId: ctx.workflowId,
133
+ nodeId: ctx.nodeId,
134
+ subworkflowDepth: ctx.subworkflowDepth,
135
+ engineMaxNodeActivations: ctx.engineMaxNodeActivations,
136
+ engineMaxSubworkflowDepth: ctx.engineMaxSubworkflowDepth
137
+ }
138
+ });
139
+ if (result.status !== "completed") throw new Error(`Subworkflow ${ctx.config.workflowId} did not complete (status=${result.status})`);
140
+ out.push(...result.outputs);
141
+ }
142
+ return { main: out };
143
+ }
144
+ };
145
+
146
+ //#endregion
147
+ //#region src/testing/WorkflowTestHarnessManualTrigger.ts
148
+ /**
149
+ * Minimal pass-through manual trigger for {@link WorkflowTestKit.runNode}; emits input items unchanged.
150
+ */
151
+ var WorkflowTestHarnessManualTriggerConfig = class {
152
+ kind = "trigger";
153
+ type = WorkflowTestHarnessManualTriggerNode;
154
+ constructor(name, id) {
155
+ this.name = name;
156
+ this.id = id;
157
+ }
158
+ };
159
+ var WorkflowTestHarnessManualTriggerNode = class {
160
+ kind = "trigger";
161
+ outputPorts = ["main"];
162
+ async setup(_ctx) {}
163
+ async execute(items, _ctx) {
164
+ return { main: items };
165
+ }
166
+ };
167
+
168
+ //#endregion
169
+ //#region src/testing/RegistrarEngineTestKitFactory.ts
170
+ var RegistrarEngineTestKitFactory = class {
171
+ static create(options = {}) {
172
+ const runStore = options.runStore ?? new InMemoryWorkflowExecutionRepository();
173
+ const scheduler = options.scheduler ?? new CapturingScheduler();
174
+ const offloadPolicy = options.offloadPolicy ?? new HintOnlyOffloadPolicy();
175
+ const runIdGen = new PrefixedSequentialIdGenerator("run_");
176
+ const activationIdGen = new PrefixedSequentialIdGenerator("act_");
177
+ const makeRunId = options.makeRunId ?? runIdGen.asFn();
178
+ const makeActivationId = options.makeActivationId ?? activationIdGen.asFn();
179
+ const credentialSessions = options.credentialSessions ?? new RejectingCredentialSessionService();
180
+ const eventBus = options.eventBus ?? new InMemoryRunEventBus();
181
+ const triggerSetupStateRepository = options.triggerSetupStateRepository ?? new InMemoryTriggerSetupStateRepository();
182
+ const liveWorkflowRepository = new InMemoryLiveWorkflowRepository();
183
+ const runDataFactory = options.runDataFactory ?? new InMemoryRunDataFactory();
184
+ const executionContextFactory = options.executionContextFactory ?? new DefaultExecutionContextFactory();
185
+ const container$1 = options.container ?? container.createChildContainer();
186
+ const dependencyContainer = container$1;
187
+ const nodeResolver = container$1;
188
+ const activationScheduler = new DefaultDrivingScheduler(offloadPolicy, scheduler, new InlineDrivingScheduler(new NodeExecutor(new NodeInstanceFactory(nodeResolver), new InProcessRetryRunner(new DefaultAsyncSleeper()))));
189
+ for (const [token, value] of options.providers ?? /* @__PURE__ */ new Map()) dependencyContainer.registerInstance(token, value);
190
+ dependencyContainer.registerInstance(CoreTokens.CredentialSessionService, credentialSessions);
191
+ dependencyContainer.registerInstance(CoreTokens.LiveWorkflowRepository, liveWorkflowRepository);
192
+ dependencyContainer.registerInstance(CoreTokens.WorkflowRepository, liveWorkflowRepository);
193
+ dependencyContainer.registerInstance(CoreTokens.NodeResolver, nodeResolver);
194
+ dependencyContainer.registerInstance(CoreTokens.RunIdFactory, new EngineTestKitRunIdFactory(makeRunId, makeActivationId));
195
+ dependencyContainer.registerInstance(CoreTokens.ActivationIdFactory, new EngineTestKitRunIdFactory(makeRunId, makeActivationId));
196
+ dependencyContainer.registerInstance(CoreTokens.WebhookBasePath, options.webhookBasePath ?? "/webhooks");
197
+ dependencyContainer.registerInstance(CoreTokens.WorkflowExecutionRepository, runStore);
198
+ dependencyContainer.registerInstance(CoreTokens.TriggerSetupStateRepository, triggerSetupStateRepository);
199
+ dependencyContainer.registerInstance(CoreTokens.NodeActivationScheduler, activationScheduler);
200
+ dependencyContainer.registerInstance(CoreTokens.RunDataFactory, runDataFactory);
201
+ dependencyContainer.registerInstance(CoreTokens.ExecutionContextFactory, executionContextFactory);
202
+ dependencyContainer.registerInstance(CoreTokens.RunEventBus, eventBus);
203
+ dependencyContainer.registerInstance(CoreTokens.PersistedWorkflowTokenRegistry, new PersistedWorkflowTokenRegistry());
204
+ dependencyContainer.registerInstance(CoreTokens.WorkflowActivationPolicy, new AllWorkflowsActiveWorkflowActivationPolicy());
205
+ if (options.executionLimitsPolicy !== void 0) dependencyContainer.registerInstance(CoreTokens.EngineExecutionLimitsPolicy, options.executionLimitsPolicy);
206
+ new EngineRuntimeRegistrar().register(dependencyContainer, options.registrarOptions ?? {});
207
+ const engine = dependencyContainer.resolve(Engine);
208
+ const runIntent = dependencyContainer.resolve(RunIntentService);
209
+ const workflowRunner = options.workflowRunner ?? dependencyContainer.resolve(CoreTokens.WorkflowRunnerService);
210
+ dependencyContainer.registerInstance(SubWorkflowRunnerNode, new SubWorkflowRunnerNode(workflowRunner));
211
+ dependencyContainer.registerInstance(WorkflowTestHarnessManualTriggerNode, new WorkflowTestHarnessManualTriggerNode());
212
+ const start = async (workflows) => {
213
+ await engine.start([...workflows]);
214
+ };
215
+ const runToCompletion = async (args) => {
216
+ const r0 = await engine.runWorkflow(args.wf, args.startAt, args.items, args.parent);
217
+ if (r0.status !== "pending") return r0;
218
+ return await engine.waitForCompletion(r0.runId);
219
+ };
220
+ const runIntentStartToCompletion = async (args) => {
221
+ const r0 = await runIntent.startWorkflow({
222
+ workflow: args.wf,
223
+ startAt: args.startAt,
224
+ items: args.items,
225
+ parent: args.parent
226
+ });
227
+ if (r0.status !== "pending") return r0;
228
+ return await engine.waitForCompletion(r0.runId);
229
+ };
230
+ return {
231
+ engine,
232
+ runIntent,
233
+ liveWorkflowRepository,
234
+ runStore,
235
+ triggerSetupStateRepository,
236
+ scheduler,
237
+ offloadPolicy,
238
+ workflowRunner,
239
+ dependencyContainer,
240
+ start,
241
+ runToCompletion,
242
+ runIntentStartToCompletion,
243
+ makeRunId,
244
+ makeActivationId
245
+ };
246
+ }
247
+ };
248
+
249
+ //#endregion
250
+ //#region src/testing/WorkflowTestKitNodeRegistrationContextFactory.ts
251
+ var WorkflowTestKitNodeRegistrationContextFactory = class {
252
+ create(dependencyContainer) {
253
+ return { registerNode(token, implementation) {
254
+ dependencyContainer.register(token, { useClass: implementation ?? token });
255
+ } };
256
+ }
257
+ };
258
+
259
+ //#endregion
260
+ //#region src/testing/WorkflowTestKitRunNodeWorkflowFactory.ts
261
+ const defaultInlineWorkflowId = "codemation.testing.workflowkit.inline";
262
+ const defaultInlineWorkflowName = "WorkflowTestKit inline";
263
+ /**
264
+ * Builds the minimal trigger → runnable workflow used by {@link import("./WorkflowTestKit").WorkflowTestKit.runNode}.
265
+ */
266
+ var WorkflowTestKitRunNodeWorkflowFactory = class {
267
+ build(args) {
268
+ const workflowId = args.workflowId ?? defaultInlineWorkflowId;
269
+ const workflowName = args.workflowName ?? defaultInlineWorkflowName;
270
+ const trigger = new WorkflowTestHarnessManualTriggerConfig("WorkflowTestKit trigger", "workflowkit.harness.trigger");
271
+ return new WorkflowBuilder({
272
+ id: workflowId,
273
+ name: workflowName
274
+ }).trigger(trigger).then(args.node).build();
275
+ }
276
+ defaultStartNodeId() {
277
+ return "workflowkit.harness.trigger";
278
+ }
279
+ };
280
+
281
+ //#endregion
282
+ //#region src/testing/WorkflowTestKitBuilder.ts
283
+ var WorkflowTestKit = class {
284
+ handle;
285
+ runNodeWorkflowFactory = new WorkflowTestKitRunNodeWorkflowFactory();
286
+ nodeRegistrationContextFactory = new WorkflowTestKitNodeRegistrationContextFactory();
287
+ constructor(options = {}) {
288
+ this.handle = RegistrarEngineTestKitFactory.create(options);
289
+ }
290
+ get dependencyContainer() {
291
+ return this.handle.dependencyContainer;
292
+ }
293
+ get engine() {
294
+ return this.handle.engine;
295
+ }
296
+ get workflowRunner() {
297
+ return this.handle.workflowRunner;
298
+ }
299
+ get liveWorkflowRepository() {
300
+ return this.handle.liveWorkflowRepository;
301
+ }
302
+ get runStore() {
303
+ return this.handle.runStore;
304
+ }
305
+ /**
306
+ * Registers {@link import("../authoring/defineNode.types").DefinedNode} implementations on the same DI container used by the engine
307
+ * (same pattern as `plugin.register({ registerNode })` in the host).
308
+ */
309
+ registerDefinedNodes(definitions) {
310
+ const ctx = this.nodeRegistrationContextFactory.create(this.handle.dependencyContainer);
311
+ for (const def of definitions) def.register(ctx);
312
+ }
313
+ async run(args) {
314
+ await this.handle.start([args.workflow]);
315
+ return await this.handle.workflowRunner.runById({
316
+ workflowId: args.workflow.id,
317
+ startAt: args.startAt,
318
+ items: args.items
319
+ });
320
+ }
321
+ async runNode(args) {
322
+ const wf = this.runNodeWorkflowFactory.build(args);
323
+ return await this.run({
324
+ workflow: wf,
325
+ items: args.items,
326
+ startAt: this.runNodeWorkflowFactory.defaultStartNodeId()
327
+ });
328
+ }
329
+ };
330
+
331
+ //#endregion
332
+ export { CapturingScheduler, InMemoryLiveWorkflowRepository, WorkflowSnapshotCodec as PersistedWorkflowSnapshotFactory, PrefixedSequentialIdGenerator, RegistrarEngineTestKitFactory, RejectingCredentialSessionService, SubWorkflowRunnerConfig, SubWorkflowRunnerNode, WorkflowTestHarnessManualTriggerConfig, WorkflowTestHarnessManualTriggerNode, WorkflowTestKit };
16
333
  //# sourceMappingURL=testing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","names":[],"sources":["../src/testing/RejectingCredentialSessionService.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"],"mappings":";;;;;;;AAMA,IAAa,oCAAb,MAAmF;CACjF,MAAM,WACJ,MACmB;AACnB,QAAM,IAAI,MACR,oDAAoD,KAAK,WAAW,QAAQ,KAAK,OAAO,SAAS,KAAK,QAAQ,wFAC/G"}
1
+ {"version":3,"file":"testing.js","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","container","tsyringeContainer","runToCompletion: RegistrarEngineTestKitHandle[\"runToCompletion\"]","runIntentStartToCompletion: RegistrarEngineTestKitHandle[\"runIntentStartToCompletion\"]"],"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":"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"}