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