@sayiir/flow-js 0.5.0-rc1
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/LICENSE +21 -0
- package/README.md +44 -0
- package/dist/duration.d.ts +15 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +29 -0
- package/dist/duration.js.map +1 -0
- package/dist/flow.d.ts +231 -0
- package/dist/flow.d.ts.map +1 -0
- package/dist/flow.js +410 -0
- package/dist/flow.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +66 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +9 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/task.d.ts +29 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +103 -0
- package/dist/task.js.map +1 -0
- package/dist/types.d.ts +114 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +40 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
package/dist/flow.js
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Type-safe flow builder for constructing workflows.
|
|
4
|
+
*
|
|
5
|
+
* The builder tracks input/output types through the chain using generics,
|
|
6
|
+
* providing full type inference without manual annotations.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const wf = flow<number>("welcome")
|
|
10
|
+
* .then("load", (id) => getUser(id)) // id: number -> User
|
|
11
|
+
* .then("greet", (user) => `Hi ${user.name}`) // user: User -> string
|
|
12
|
+
* .build(); // Workflow<number, string>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.RouteBuilder = exports.ForkBuilder = exports.Flow = exports.Workflow = void 0;
|
|
17
|
+
exports.branch = branch;
|
|
18
|
+
exports.createFlowFactory = createFlowFactory;
|
|
19
|
+
const duration_js_1 = require("./duration.js");
|
|
20
|
+
/**
|
|
21
|
+
* Suffix convention for branch key-function task IDs.
|
|
22
|
+
* Must match `sayiir_core::workflow::key_fn_id`.
|
|
23
|
+
*/
|
|
24
|
+
const KEY_FN_SUFFIX = "::key_fn";
|
|
25
|
+
/** A compiled workflow ready for execution. */
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
27
|
+
class Workflow {
|
|
28
|
+
/** @internal */
|
|
29
|
+
_inner;
|
|
30
|
+
/** @internal */
|
|
31
|
+
_taskRegistry;
|
|
32
|
+
/** @internal — kept for child workflow composition via `thenFlow`. */
|
|
33
|
+
_builder;
|
|
34
|
+
constructor(inner, taskRegistry, builder) {
|
|
35
|
+
this._inner = inner;
|
|
36
|
+
this._taskRegistry = taskRegistry;
|
|
37
|
+
this._builder = builder;
|
|
38
|
+
}
|
|
39
|
+
get workflowId() {
|
|
40
|
+
return this._inner.workflowId;
|
|
41
|
+
}
|
|
42
|
+
get definitionHash() {
|
|
43
|
+
return this._inner.definitionHash;
|
|
44
|
+
}
|
|
45
|
+
/** Workflow-level metadata, or `undefined` if none was provided. */
|
|
46
|
+
get metadata() {
|
|
47
|
+
const json = this._inner.metadataJson;
|
|
48
|
+
return json != null ? JSON.parse(json) : undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Return all nodes in topological (execution) order.
|
|
52
|
+
*
|
|
53
|
+
* Each {@link NodeInfo} carries the node's ID, kind, predecessor,
|
|
54
|
+
* and any configured timeout / retry / priority metadata.
|
|
55
|
+
* Useful for introspection, UI visualisation, and documentation.
|
|
56
|
+
*/
|
|
57
|
+
iterNodes() {
|
|
58
|
+
return this._inner.iterNodes();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.Workflow = Workflow;
|
|
62
|
+
/**
|
|
63
|
+
* Create a branch for use with `.fork()`.
|
|
64
|
+
*
|
|
65
|
+
* ```ts
|
|
66
|
+
* flow<Order>("process")
|
|
67
|
+
* .then(chargePayment)
|
|
68
|
+
* .fork([
|
|
69
|
+
* branch("email", sendConfirmation),
|
|
70
|
+
* branch("ship", shipOrder),
|
|
71
|
+
* ])
|
|
72
|
+
* .join("finalize", ([email, ship]) => ({ email, ship }))
|
|
73
|
+
* .build();
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
function branch(name, fn) {
|
|
77
|
+
const taskId = isTaskFn(fn) ? fn._taskId : name;
|
|
78
|
+
const metadata = isTaskFn(fn) ? fn._metadata : undefined;
|
|
79
|
+
return {
|
|
80
|
+
name,
|
|
81
|
+
steps: [{ taskId, fn: fn, metadata }],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create a `flow()` factory function bound to a specific builder backend.
|
|
86
|
+
*
|
|
87
|
+
* Each binding package (sayiir-nodejs, sayiir-cloudflare, etc.) calls this
|
|
88
|
+
* once with their native builder constructor.
|
|
89
|
+
*/
|
|
90
|
+
function createFlowFactory(factory) {
|
|
91
|
+
return (name, opts) => {
|
|
92
|
+
return new Flow(factory(name), opts);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Type-safe workflow builder. */
|
|
96
|
+
class Flow {
|
|
97
|
+
/** @internal */
|
|
98
|
+
_builder;
|
|
99
|
+
/** @internal */
|
|
100
|
+
_taskRegistry = {};
|
|
101
|
+
/** @internal */
|
|
102
|
+
_childCounter = 0;
|
|
103
|
+
constructor(builder, opts) {
|
|
104
|
+
this._builder = builder;
|
|
105
|
+
if (opts?.metadata != null) {
|
|
106
|
+
this._builder.setMetadataJson(JSON.stringify(opts.metadata));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
then(idOrFn, fnOrOpts, maybeOpts) {
|
|
110
|
+
let taskId;
|
|
111
|
+
let taskFn;
|
|
112
|
+
let metadata;
|
|
113
|
+
if (typeof idOrFn === "string") {
|
|
114
|
+
// .then("id", fn, opts?)
|
|
115
|
+
taskId = idOrFn;
|
|
116
|
+
taskFn = fnOrOpts;
|
|
117
|
+
const opts = maybeOpts;
|
|
118
|
+
if (isTaskFn(taskFn)) {
|
|
119
|
+
metadata = taskFn._metadata;
|
|
120
|
+
// Keep the wrapped TaskFn (preserves Zod validation); only override the id.
|
|
121
|
+
}
|
|
122
|
+
if (opts) {
|
|
123
|
+
metadata = { ...metadata, ...buildStepMetadata(taskId, opts) };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (isTaskFn(idOrFn)) {
|
|
127
|
+
// .then(taskFn)
|
|
128
|
+
taskId = idOrFn._taskId;
|
|
129
|
+
taskFn = idOrFn;
|
|
130
|
+
metadata = idOrFn._metadata;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// .then(lambda) — auto-generate id
|
|
134
|
+
taskId = this._builder.nextLambdaId();
|
|
135
|
+
taskFn = idOrFn;
|
|
136
|
+
}
|
|
137
|
+
this._taskRegistry[taskId] = taskFn;
|
|
138
|
+
this._builder.then(taskId, metadata);
|
|
139
|
+
return this;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Start a fork for parallel execution.
|
|
143
|
+
*
|
|
144
|
+
* ```ts
|
|
145
|
+
* .fork([
|
|
146
|
+
* branch("email", sendEmail),
|
|
147
|
+
* branch("sms", sendSms),
|
|
148
|
+
* ])
|
|
149
|
+
* .join("merge", ([email, sms]) => ({ email, sms }))
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
fork(branches) {
|
|
153
|
+
return new ForkBuilder(this, branches);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Add a durable delay. No workers are held during the delay.
|
|
157
|
+
*
|
|
158
|
+
* Duration can be a number (ms) or a string like "30s", "5m", "1h".
|
|
159
|
+
*/
|
|
160
|
+
delay(id, duration) {
|
|
161
|
+
const ms = (0, duration_js_1.parseDuration)(duration);
|
|
162
|
+
this._builder.delay(id, ms / 1000);
|
|
163
|
+
return this;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Wait for an external signal before continuing.
|
|
167
|
+
*
|
|
168
|
+
* The workflow parks and releases the worker until the signal arrives.
|
|
169
|
+
*/
|
|
170
|
+
waitForSignal(id, signalName, opts) {
|
|
171
|
+
const timeoutSecs = opts?.timeout != null ? (0, duration_js_1.parseDuration)(opts.timeout) / 1000 : undefined;
|
|
172
|
+
this._builder.waitForSignal(id, signalName, timeoutSecs);
|
|
173
|
+
return this;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Start a conditional branch based on a routing key.
|
|
177
|
+
*
|
|
178
|
+
* The `keys` array declares all valid routing keys up front, providing
|
|
179
|
+
* type-level safety: the key function's return type and `.branch()` key
|
|
180
|
+
* parameter are constrained to the declared set.
|
|
181
|
+
*
|
|
182
|
+
* ```ts
|
|
183
|
+
* flow<Ticket>("classify")
|
|
184
|
+
* .then("classify", classify)
|
|
185
|
+
* .route((result) => result.intent, ["billing", "tech"] as const)
|
|
186
|
+
* .branch("billing", handleBilling)
|
|
187
|
+
* .branch("tech", handleTech)
|
|
188
|
+
* .done()
|
|
189
|
+
* .then("finalize", finalizeStep)
|
|
190
|
+
* .build();
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
route(keyFn, keys) {
|
|
194
|
+
return new RouteBuilder(this, keyFn, [
|
|
195
|
+
...keys,
|
|
196
|
+
]);
|
|
197
|
+
}
|
|
198
|
+
loop(idOrFn, fnOrOpts, maybeOpts) {
|
|
199
|
+
let taskId;
|
|
200
|
+
let taskFn;
|
|
201
|
+
let metadata;
|
|
202
|
+
let opts;
|
|
203
|
+
if (typeof idOrFn === "string") {
|
|
204
|
+
taskId = idOrFn;
|
|
205
|
+
taskFn = fnOrOpts;
|
|
206
|
+
opts = maybeOpts;
|
|
207
|
+
if (isTaskFn(taskFn)) {
|
|
208
|
+
metadata = taskFn._metadata;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else if (isTaskFn(idOrFn)) {
|
|
212
|
+
taskId = idOrFn._taskId;
|
|
213
|
+
taskFn = idOrFn;
|
|
214
|
+
metadata = idOrFn._metadata;
|
|
215
|
+
opts = fnOrOpts;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
taskId = this._builder.nextLambdaId();
|
|
219
|
+
taskFn = idOrFn;
|
|
220
|
+
opts = fnOrOpts;
|
|
221
|
+
}
|
|
222
|
+
this._taskRegistry[taskId] = taskFn;
|
|
223
|
+
const maxIterations = opts?.maxIterations ?? 10;
|
|
224
|
+
if (maxIterations < 1) {
|
|
225
|
+
throw new Error("maxIterations must be at least 1");
|
|
226
|
+
}
|
|
227
|
+
const onMax = opts?.onMax ?? "fail";
|
|
228
|
+
this._builder.addLoop(taskId, metadata, maxIterations, onMax);
|
|
229
|
+
return this;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Compose another workflow inline as a child.
|
|
233
|
+
*
|
|
234
|
+
* The child workflow's tasks execute as a sub-pipeline: the current
|
|
235
|
+
* step's output feeds into the child's first task, and the child's
|
|
236
|
+
* final output continues to the next step.
|
|
237
|
+
*
|
|
238
|
+
* ```ts
|
|
239
|
+
* const child = flow<number>("double").then("x2", (n) => n * 2).build();
|
|
240
|
+
* const parent = flow<number>("pipeline").then("inc", (n) => n + 1).thenFlow(child).build();
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
thenFlow(workflow) {
|
|
244
|
+
const childId = `child_${this._childCounter++}`;
|
|
245
|
+
// Merge child task registry into parent (parent takes precedence)
|
|
246
|
+
for (const [key, value] of Object.entries(workflow._taskRegistry)) {
|
|
247
|
+
this._taskRegistry[key] ??= value;
|
|
248
|
+
}
|
|
249
|
+
// Tell native builder about the child
|
|
250
|
+
this._builder.addChildWorkflow(childId, workflow._builder);
|
|
251
|
+
return this;
|
|
252
|
+
}
|
|
253
|
+
/** Build the workflow definition. */
|
|
254
|
+
build() {
|
|
255
|
+
const inner = this._builder.build();
|
|
256
|
+
return new Workflow(inner, this._taskRegistry, this._builder);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.Flow = Flow;
|
|
260
|
+
/** Builder for fork/join parallel branches. */
|
|
261
|
+
class ForkBuilder {
|
|
262
|
+
flow;
|
|
263
|
+
branches;
|
|
264
|
+
constructor(flow, branches) {
|
|
265
|
+
this.flow = flow;
|
|
266
|
+
this.branches = branches;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Join branches with a combining function.
|
|
270
|
+
*
|
|
271
|
+
* The join function receives a tuple of branch outputs.
|
|
272
|
+
*/
|
|
273
|
+
join(id, fn) {
|
|
274
|
+
// Register all branch tasks
|
|
275
|
+
const backendBranches = this.branches.map((b) => {
|
|
276
|
+
return b.steps.map((step) => {
|
|
277
|
+
this.flow._taskRegistry[step.taskId] = step.fn;
|
|
278
|
+
return { taskId: step.taskId, metadata: step.metadata };
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
// The join function receives a Record (from Rust codec) keyed by the
|
|
282
|
+
// first task ID of each branch. We wrap to convert to a tuple.
|
|
283
|
+
const branchNames = this.branches.map((b) => b.steps[0].taskId);
|
|
284
|
+
const joinWrapper = (branchResults) => {
|
|
285
|
+
const tuple = branchNames.map((name) => branchResults[name]);
|
|
286
|
+
return fn(tuple);
|
|
287
|
+
};
|
|
288
|
+
this.flow._taskRegistry[id] = joinWrapper;
|
|
289
|
+
this.flow._builder.addFork(backendBranches, id);
|
|
290
|
+
return this.flow;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
exports.ForkBuilder = ForkBuilder;
|
|
294
|
+
/** Builder for conditional branching (route). */
|
|
295
|
+
class RouteBuilder {
|
|
296
|
+
flow;
|
|
297
|
+
keyFn;
|
|
298
|
+
declaredKeys;
|
|
299
|
+
branches = [];
|
|
300
|
+
defaultSteps;
|
|
301
|
+
constructor(flow, keyFn, declaredKeys) {
|
|
302
|
+
this.flow = flow;
|
|
303
|
+
this.keyFn = keyFn;
|
|
304
|
+
this.declaredKeys = declaredKeys;
|
|
305
|
+
}
|
|
306
|
+
branch(key, idOrFn, maybeFn) {
|
|
307
|
+
const { taskId, taskFn, metadata } = resolveBranchTask(key, idOrFn, maybeFn, this.flow);
|
|
308
|
+
this.branches.push({
|
|
309
|
+
key,
|
|
310
|
+
steps: [{ taskId, fn: taskFn, metadata }],
|
|
311
|
+
});
|
|
312
|
+
return this;
|
|
313
|
+
}
|
|
314
|
+
defaultBranch(idOrFn, maybeFn) {
|
|
315
|
+
const { taskId, taskFn, metadata } = resolveBranchTask("_default", idOrFn, maybeFn, this.flow);
|
|
316
|
+
this.defaultSteps = [{ taskId, fn: taskFn, metadata }];
|
|
317
|
+
return this;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Finish the route and return to the Flow builder.
|
|
321
|
+
*
|
|
322
|
+
* Performs exhaustiveness checks:
|
|
323
|
+
* - Throws if a declared key has no `.branch()` call and no `.defaultBranch()`.
|
|
324
|
+
* - Throws if a `.branch()` key is not in the declared set.
|
|
325
|
+
*/
|
|
326
|
+
done() {
|
|
327
|
+
const branchedKeys = new Set(this.branches.map((b) => b.key));
|
|
328
|
+
const declaredSet = new Set(this.declaredKeys);
|
|
329
|
+
// Check for orphan branches
|
|
330
|
+
const orphans = [...branchedKeys].filter((k) => !declaredSet.has(k));
|
|
331
|
+
if (orphans.length > 0) {
|
|
332
|
+
throw new Error(`Route: orphan branches for keys: ${orphans.join(", ")}`);
|
|
333
|
+
}
|
|
334
|
+
// Check for missing branches (no default)
|
|
335
|
+
if (!this.defaultSteps) {
|
|
336
|
+
const missing = this.declaredKeys.filter((k) => !branchedKeys.has(k));
|
|
337
|
+
if (missing.length > 0) {
|
|
338
|
+
throw new Error(`Route: missing branches for keys: ${missing.join(", ")}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Build backend branch entries
|
|
342
|
+
const backendBranches = this.branches.map((b) => ({
|
|
343
|
+
key: b.key,
|
|
344
|
+
tasks: b.steps.map((step) => {
|
|
345
|
+
this.flow._taskRegistry[step.taskId] = step.fn;
|
|
346
|
+
return { taskId: step.taskId, metadata: step.metadata };
|
|
347
|
+
}),
|
|
348
|
+
}));
|
|
349
|
+
const backendDefault = this.defaultSteps?.map((step) => {
|
|
350
|
+
this.flow._taskRegistry[step.taskId] = step.fn;
|
|
351
|
+
return { taskId: step.taskId, metadata: step.metadata };
|
|
352
|
+
});
|
|
353
|
+
// addBranch returns the generated branch ID
|
|
354
|
+
const branchId = this.flow._builder.addBranch(backendBranches, backendDefault);
|
|
355
|
+
// Register key function using the generated branch ID
|
|
356
|
+
const keyFnId = `${branchId}${KEY_FN_SUFFIX}`;
|
|
357
|
+
this.flow._taskRegistry[keyFnId] = this.keyFn;
|
|
358
|
+
return this.flow;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
exports.RouteBuilder = RouteBuilder;
|
|
362
|
+
function isTaskFn(fn) {
|
|
363
|
+
return typeof fn === "function" && "_taskId" in fn;
|
|
364
|
+
}
|
|
365
|
+
/** Resolve task id/fn/metadata from branch-style overloaded args. */
|
|
366
|
+
function resolveBranchTask(fallbackId, idOrFn, maybeFn, flow) {
|
|
367
|
+
if (typeof idOrFn === "string") {
|
|
368
|
+
const fn = maybeFn;
|
|
369
|
+
const metadata = isTaskFn(fn)
|
|
370
|
+
? fn._metadata
|
|
371
|
+
: undefined;
|
|
372
|
+
return { taskId: idOrFn, taskFn: fn, metadata };
|
|
373
|
+
}
|
|
374
|
+
else if (isTaskFn(idOrFn)) {
|
|
375
|
+
return {
|
|
376
|
+
taskId: idOrFn._taskId,
|
|
377
|
+
taskFn: idOrFn,
|
|
378
|
+
metadata: idOrFn._metadata,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
const taskId = `${fallbackId}_${flow._builder.nextLambdaId()}`;
|
|
383
|
+
return { taskId, taskFn: idOrFn };
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
function buildStepMetadata(id, opts) {
|
|
387
|
+
const metadata = { displayName: id };
|
|
388
|
+
if (opts.timeout != null) {
|
|
389
|
+
metadata.timeoutSecs = (0, duration_js_1.parseDuration)(opts.timeout) / 1000;
|
|
390
|
+
}
|
|
391
|
+
if (opts.retry) {
|
|
392
|
+
metadata.retries = {
|
|
393
|
+
maxRetries: opts.retry.maxAttempts,
|
|
394
|
+
initialDelaySecs: (0, duration_js_1.parseDuration)(opts.retry.initialDelay) / 1000,
|
|
395
|
+
backoffMultiplier: opts.retry.backoffMultiplier ?? 2.0,
|
|
396
|
+
maxDelaySecs: opts.retry.maxDelay != null
|
|
397
|
+
? (0, duration_js_1.parseDuration)(opts.retry.maxDelay) / 1000
|
|
398
|
+
: undefined,
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
else if (opts.retries != null) {
|
|
402
|
+
metadata.retries = {
|
|
403
|
+
maxRetries: opts.retries,
|
|
404
|
+
initialDelaySecs: 1.0,
|
|
405
|
+
backoffMultiplier: 2.0,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
return metadata;
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=flow.js.map
|
package/dist/flow.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../src/flow.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @sayiir/flow-js — Pure TypeScript workflow builder DSL for Sayiir.
|
|
3
|
+
*
|
|
4
|
+
* This package contains only the builder logic with no native dependencies.
|
|
5
|
+
* It is used by binding packages (sayiir-nodejs, sayiir-cloudflare, etc.)
|
|
6
|
+
* that provide the concrete FlowBuilderBackend implementation.
|
|
7
|
+
*/
|
|
8
|
+
export type { FlowBuilderBackend, CompiledWorkflow, NodeKind, NodeInfo, TaskMetadata, RetryPolicyConfig, BranchTask, BranchEntry, } from "./interfaces.js";
|
|
9
|
+
export type { Duration, LoopOptions, RetryPolicy, TaskCallback, TaskOptions, StepOptions, WorkflowStatus, ZodLike, MaxIterationsPolicy, } from "./types.js";
|
|
10
|
+
export { LoopResult, WorkflowError, TaskError, BackendError } from "./types.js";
|
|
11
|
+
export { task } from "./task.js";
|
|
12
|
+
export type { TaskFn } from "./task.js";
|
|
13
|
+
export { branch, Flow, ForkBuilder, RouteBuilder, Workflow, createFlowFactory, } from "./flow.js";
|
|
14
|
+
export type { BranchDef, BranchEnvelope, FlowOptions, InferBranchOutputs, BuilderFactory, } from "./flow.js";
|
|
15
|
+
export { parseDuration } from "./duration.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,OAAO,EACP,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EACL,MAAM,EACN,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,cAAc,GACf,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @sayiir/flow-js — Pure TypeScript workflow builder DSL for Sayiir.
|
|
4
|
+
*
|
|
5
|
+
* This package contains only the builder logic with no native dependencies.
|
|
6
|
+
* It is used by binding packages (sayiir-nodejs, sayiir-cloudflare, etc.)
|
|
7
|
+
* that provide the concrete FlowBuilderBackend implementation.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.parseDuration = exports.createFlowFactory = exports.Workflow = exports.RouteBuilder = exports.ForkBuilder = exports.Flow = exports.branch = exports.task = exports.BackendError = exports.TaskError = exports.WorkflowError = exports.LoopResult = void 0;
|
|
11
|
+
var types_js_1 = require("./types.js");
|
|
12
|
+
Object.defineProperty(exports, "LoopResult", { enumerable: true, get: function () { return types_js_1.LoopResult; } });
|
|
13
|
+
Object.defineProperty(exports, "WorkflowError", { enumerable: true, get: function () { return types_js_1.WorkflowError; } });
|
|
14
|
+
Object.defineProperty(exports, "TaskError", { enumerable: true, get: function () { return types_js_1.TaskError; } });
|
|
15
|
+
Object.defineProperty(exports, "BackendError", { enumerable: true, get: function () { return types_js_1.BackendError; } });
|
|
16
|
+
// Task
|
|
17
|
+
var task_js_1 = require("./task.js");
|
|
18
|
+
Object.defineProperty(exports, "task", { enumerable: true, get: function () { return task_js_1.task; } });
|
|
19
|
+
// Flow
|
|
20
|
+
var flow_js_1 = require("./flow.js");
|
|
21
|
+
Object.defineProperty(exports, "branch", { enumerable: true, get: function () { return flow_js_1.branch; } });
|
|
22
|
+
Object.defineProperty(exports, "Flow", { enumerable: true, get: function () { return flow_js_1.Flow; } });
|
|
23
|
+
Object.defineProperty(exports, "ForkBuilder", { enumerable: true, get: function () { return flow_js_1.ForkBuilder; } });
|
|
24
|
+
Object.defineProperty(exports, "RouteBuilder", { enumerable: true, get: function () { return flow_js_1.RouteBuilder; } });
|
|
25
|
+
Object.defineProperty(exports, "Workflow", { enumerable: true, get: function () { return flow_js_1.Workflow; } });
|
|
26
|
+
Object.defineProperty(exports, "createFlowFactory", { enumerable: true, get: function () { return flow_js_1.createFlowFactory; } });
|
|
27
|
+
// Duration utility
|
|
28
|
+
var duration_js_1 = require("./duration.js");
|
|
29
|
+
Object.defineProperty(exports, "parseDuration", { enumerable: true, get: function () { return duration_js_1.parseDuration; } });
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AA2BH,uCAAgF;AAAvE,sGAAA,UAAU,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,wGAAA,YAAY,OAAA;AAE3D,OAAO;AACP,qCAAiC;AAAxB,+FAAA,IAAI,OAAA;AAGb,OAAO;AACP,qCAOmB;AANjB,iGAAA,MAAM,OAAA;AACN,+FAAA,IAAI,OAAA;AACJ,sGAAA,WAAW,OAAA;AACX,uGAAA,YAAY,OAAA;AACZ,mGAAA,QAAQ,OAAA;AACR,4GAAA,iBAAiB,OAAA;AAUnB,mBAAmB;AACnB,6CAA8C;AAArC,4GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend interfaces for the Sayiir flow builder.
|
|
3
|
+
*
|
|
4
|
+
* These abstract over the concrete builder implementation (NAPI-RS, WASM, etc.)
|
|
5
|
+
* so the pure-TypeScript DSL can be used without native dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export interface RetryPolicyConfig {
|
|
8
|
+
maxRetries: number;
|
|
9
|
+
initialDelaySecs: number;
|
|
10
|
+
backoffMultiplier: number;
|
|
11
|
+
maxDelaySecs?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface TaskMetadata {
|
|
14
|
+
displayName?: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
timeoutSecs?: number;
|
|
17
|
+
retries?: RetryPolicyConfig;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
version?: string;
|
|
20
|
+
priority?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface BranchTask {
|
|
23
|
+
taskId: string;
|
|
24
|
+
metadata?: TaskMetadata;
|
|
25
|
+
}
|
|
26
|
+
export interface BranchEntry {
|
|
27
|
+
key: string;
|
|
28
|
+
tasks: BranchTask[];
|
|
29
|
+
}
|
|
30
|
+
/** The kind of node in a workflow DAG. */
|
|
31
|
+
export type NodeKind = "task" | "fork" | "delay" | "await_signal" | "branch" | "loop" | "child_workflow";
|
|
32
|
+
/** Metadata about a single node in the workflow DAG. */
|
|
33
|
+
export interface NodeInfo {
|
|
34
|
+
/** Unique node identifier. */
|
|
35
|
+
id: string;
|
|
36
|
+
/** Node kind. */
|
|
37
|
+
kind: NodeKind;
|
|
38
|
+
/** ID of the preceding node, or `undefined` for the root. */
|
|
39
|
+
predecessorId?: string;
|
|
40
|
+
/** Timeout in seconds (task timeout, delay duration, or signal timeout). */
|
|
41
|
+
timeoutSecs?: number;
|
|
42
|
+
/** Retry policy (tasks only). */
|
|
43
|
+
retryPolicy?: RetryPolicyConfig;
|
|
44
|
+
/** Execution priority 1–5 (tasks only). */
|
|
45
|
+
priority?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface CompiledWorkflow {
|
|
48
|
+
workflowId: string;
|
|
49
|
+
definitionHash: string;
|
|
50
|
+
metadataJson?: string;
|
|
51
|
+
/** Return all nodes in topological (execution) order. */
|
|
52
|
+
iterNodes(): NodeInfo[];
|
|
53
|
+
}
|
|
54
|
+
export interface FlowBuilderBackend {
|
|
55
|
+
nextLambdaId(): string;
|
|
56
|
+
then(taskId: string, metadata?: TaskMetadata): void;
|
|
57
|
+
addFork(branches: BranchTask[][], joinId: string, joinMetadata?: TaskMetadata): void;
|
|
58
|
+
addBranch(branches: BranchEntry[], defaultBranch?: BranchTask[]): string;
|
|
59
|
+
waitForSignal(signalId: string, signalName: string, timeoutSecs?: number): void;
|
|
60
|
+
delay(delayId: string, seconds: number): void;
|
|
61
|
+
addLoop(bodyTaskId: string, bodyMetadata?: TaskMetadata, maxIterations?: number, onMax?: string): string;
|
|
62
|
+
addChildWorkflow(childId: string, childBuilder: FlowBuilderBackend): void;
|
|
63
|
+
setMetadataJson(json: string): void;
|
|
64
|
+
build(): CompiledWorkflow;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,0CAA0C;AAC1C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,gBAAgB,CAAC;AAEzG,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,SAAS,IAAI,QAAQ,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,IAAI,MAAM,CAAC;IACvB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACpD,OAAO,CACL,QAAQ,EAAE,UAAU,EAAE,EAAE,EACxB,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,YAAY,GAC1B,IAAI,CAAC;IACR,SAAS,CACP,QAAQ,EAAE,WAAW,EAAE,EACvB,aAAa,CAAC,EAAE,UAAU,EAAE,GAC3B,MAAM,CAAC;IACV,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAAC;IACR,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,OAAO,CACL,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,YAAY,EAC3B,aAAa,CAAC,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAAC;IACV,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1E,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,gBAAgB,CAAC;CAC3B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Backend interfaces for the Sayiir flow builder.
|
|
4
|
+
*
|
|
5
|
+
* These abstract over the concrete builder implementation (NAPI-RS, WASM, etc.)
|
|
6
|
+
* so the pure-TypeScript DSL can be used without native dependencies.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
|
package/dist/task.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task definition for workflow steps.
|
|
3
|
+
*
|
|
4
|
+
* The `task()` function wraps a function with metadata (id, timeout, retries)
|
|
5
|
+
* and optionally Zod schemas for input/output validation. The Flow builder
|
|
6
|
+
* reads these properties when constructing workflows.
|
|
7
|
+
*/
|
|
8
|
+
import type { TaskOptions, ZodLike } from "./types.js";
|
|
9
|
+
import type { TaskMetadata } from "./interfaces.js";
|
|
10
|
+
/** Branded type for a registered task function. */
|
|
11
|
+
export interface TaskFn<TIn, TOut> {
|
|
12
|
+
(input: TIn): TOut | Promise<TOut>;
|
|
13
|
+
readonly _taskId: string;
|
|
14
|
+
readonly _metadata: TaskMetadata;
|
|
15
|
+
readonly _inputSchema?: ZodLike<TIn>;
|
|
16
|
+
readonly _outputSchema?: ZodLike<TOut>;
|
|
17
|
+
readonly _rawFn: (input: TIn) => TOut | Promise<TOut>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Define a named task with optional configuration.
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* const getUser = task("get-user", async (id: number) => {
|
|
24
|
+
* return await db.getUser(id);
|
|
25
|
+
* }, { timeout: "30s", retries: 3 });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function task<TIn, TOut>(id: string, fn: (input: TIn) => TOut | Promise<TOut>, opts?: TaskOptions<TIn>): TaskFn<TIn, TOut>;
|
|
29
|
+
//# sourceMappingURL=task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAe,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpE,OAAO,KAAK,EAAqB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEvE,mDAAmD;AACnD,MAAM,WAAW,MAAM,CAAC,GAAG,EAAE,IAAI;IAC/B,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,IAAI,EAC5B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACxC,IAAI,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,GACtB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAiBnB"}
|