@sanoma-ai/workflows 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -14
- package/dist/apply.d.ts +2 -1
- package/dist/apply.js +29 -7
- package/dist/apply.js.map +1 -1
- package/dist/approvals.d.ts +27 -2
- package/dist/approvals.js +73 -9
- package/dist/approvals.js.map +1 -1
- package/dist/call.d.ts +3 -2
- package/dist/call.js +38 -30
- package/dist/call.js.map +1 -1
- package/dist/cedar.js +24 -9
- package/dist/cedar.js.map +1 -1
- package/dist/change.d.ts +219 -0
- package/dist/change.js +150 -0
- package/dist/change.js.map +1 -0
- package/dist/chats.d.ts +43 -0
- package/dist/chats.js +48 -0
- package/dist/chats.js.map +1 -0
- package/dist/client.d.ts +52 -6
- package/dist/client.js +88 -47
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +47 -5
- package/dist/config.js +71 -7
- package/dist/config.js.map +1 -1
- package/dist/database.d.ts +83 -0
- package/dist/database.js +92 -0
- package/dist/database.js.map +1 -0
- package/dist/db.d.ts +31 -1
- package/dist/db.js +89 -7
- package/dist/db.js.map +1 -1
- package/dist/deadlines.d.ts +88 -0
- package/dist/deadlines.js +171 -0
- package/dist/deadlines.js.map +1 -0
- package/dist/define.d.ts +25 -4
- package/dist/define.js +40 -0
- package/dist/define.js.map +1 -1
- package/dist/demo.d.ts +28 -0
- package/dist/demo.js +72 -0
- package/dist/demo.js.map +1 -0
- package/dist/describe.d.ts +5 -2
- package/dist/describe.js +10 -6
- package/dist/describe.js.map +1 -1
- package/dist/errors.d.ts +10 -1
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -1
- package/dist/fake.d.ts +8 -0
- package/dist/fake.js +11 -1
- package/dist/fake.js.map +1 -1
- package/dist/grid.d.ts +34 -0
- package/dist/grid.js +62 -0
- package/dist/grid.js.map +1 -0
- package/dist/host.d.ts +13 -2
- package/dist/host.js +2 -2
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +16 -8
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/dist/ledger.d.ts +11 -2
- package/dist/ledger.js.map +1 -1
- package/dist/lint.js +1 -1
- package/dist/lint.js.map +1 -1
- package/dist/op.d.ts +14 -2
- package/dist/op.js.map +1 -1
- package/dist/policy.d.ts +7 -1
- package/dist/policy.js +2 -1
- package/dist/policy.js.map +1 -1
- package/dist/resource.d.ts +13 -1
- package/dist/resource.js +9 -1
- package/dist/resource.js.map +1 -1
- package/dist/resources.d.ts +2 -0
- package/dist/resources.js +10 -1
- package/dist/resources.js.map +1 -1
- package/dist/run.d.ts +5 -0
- package/dist/run.js.map +1 -1
- package/dist/sandbox.d.ts +38 -10
- package/dist/sandbox.js +66 -35
- package/dist/sandbox.js.map +1 -1
- package/dist/scenario.d.ts +18 -1
- package/dist/scenario.js +77 -27
- package/dist/scenario.js.map +1 -1
- package/dist/scenarios.d.ts +10 -1
- package/dist/scenarios.js +19 -4
- package/dist/scenarios.js.map +1 -1
- package/dist/schedules.d.ts +66 -0
- package/dist/schedules.js +158 -0
- package/dist/schedules.js.map +1 -0
- package/dist/schema.d.ts +6 -0
- package/dist/schema.js +13 -3
- package/dist/schema.js.map +1 -1
- package/dist/shared.d.ts +30 -2
- package/dist/shared.js +42 -4
- package/dist/shared.js.map +1 -1
- package/dist/source.d.ts +61 -2
- package/dist/source.js.map +1 -1
- package/dist/supervisor.d.ts +38 -0
- package/dist/supervisor.js +77 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/version.d.ts +3 -1
- package/dist/version.js +3 -1
- package/dist/version.js.map +1 -1
- package/dist/wakeup-service.d.ts +83 -0
- package/dist/wakeup-service.js +421 -0
- package/dist/wakeup-service.js.map +1 -0
- package/dist/wakeup.d.ts +84 -0
- package/dist/wakeup.js +87 -0
- package/dist/wakeup.js.map +1 -0
- package/dist/worker.d.ts +39 -1
- package/dist/worker.js +130 -39
- package/dist/worker.js.map +1 -1
- package/oxlint.json +2 -1
- package/package.json +8 -2
- package/src/apply.ts +25 -6
- package/src/approvals.ts +89 -16
- package/src/call.ts +40 -29
- package/src/cedar.ts +24 -6
- package/src/change.ts +222 -0
- package/src/chats.ts +114 -0
- package/src/client.ts +145 -55
- package/src/config.ts +110 -13
- package/src/database.ts +152 -0
- package/src/db.ts +108 -9
- package/src/deadlines.ts +234 -0
- package/src/define.ts +71 -4
- package/src/demo.ts +87 -0
- package/src/describe.ts +18 -6
- package/src/errors.ts +14 -0
- package/src/fake.ts +12 -0
- package/src/grid.ts +100 -0
- package/src/host.ts +13 -4
- package/src/index.ts +61 -3
- package/src/ledger.ts +15 -3
- package/src/lint.ts +1 -1
- package/src/op.ts +15 -2
- package/src/policy.ts +7 -1
- package/src/resource.ts +22 -3
- package/src/resources.ts +12 -1
- package/src/run.ts +5 -0
- package/src/sandbox.ts +97 -37
- package/src/scenario.ts +97 -28
- package/src/scenarios.ts +21 -5
- package/src/schedules.ts +206 -0
- package/src/schema.ts +16 -3
- package/src/shared.ts +51 -4
- package/src/source.ts +58 -3
- package/src/supervisor.ts +107 -0
- package/src/version.ts +3 -1
- package/src/wakeup-service.ts +511 -0
- package/src/wakeup.ts +150 -0
- package/src/worker.ts +181 -44
package/dist/worker.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type SanomaConfig } from "./config.ts";
|
|
1
|
+
import { type ResolvedConfig, type SanomaConfig } from "./config.ts";
|
|
2
|
+
import { type Deadlines, type SelfStop } from "./deadlines.ts";
|
|
2
3
|
import type { Source } from "./source.ts";
|
|
3
4
|
export interface Worker {
|
|
4
5
|
/**
|
|
@@ -7,6 +8,18 @@ export interface Worker {
|
|
|
7
8
|
* The worker names them in one line at start, unless started `quiet`.
|
|
8
9
|
*/
|
|
9
10
|
readonly unconfigured: readonly string[];
|
|
11
|
+
/**
|
|
12
|
+
* Its runs' deadlines: each sleeping run's, and the sources added here (a schedule's next
|
|
13
|
+
* fire), which a stop registers the earliest of with the wakeup.
|
|
14
|
+
*/
|
|
15
|
+
readonly deadlines: Deadlines;
|
|
16
|
+
/**
|
|
17
|
+
* True when nothing this worker would run can run soon (`idle` in deadlines.ts): no run executing,
|
|
18
|
+
* none queued, every unfinished one blocked in a sleep or an approval, the next deadline past
|
|
19
|
+
* `idleHorizonMs`. False once stopped.
|
|
20
|
+
*/
|
|
21
|
+
idle(): Promise<boolean>;
|
|
22
|
+
/** Stops the worker; a second call waits for the first. */
|
|
10
23
|
stop(): Promise<void>;
|
|
11
24
|
}
|
|
12
25
|
export interface WorkerOptions {
|
|
@@ -27,6 +40,31 @@ export interface WorkerOptions {
|
|
|
27
40
|
promote?: boolean;
|
|
28
41
|
/** The company's repository, which apply commits the lockfile to; the launcher passes its checkout. */
|
|
29
42
|
source?: Source;
|
|
43
|
+
/**
|
|
44
|
+
* How soon a deadline keeps the worker up (`idle`): 60 s by default, so apply's short sleeps
|
|
45
|
+
* and other short waits never stop it.
|
|
46
|
+
*/
|
|
47
|
+
idleHorizonMs?: number;
|
|
48
|
+
/** How often a worker whose data files declare a wakeup checks whether it may stop: every 15 s by default. */
|
|
49
|
+
stopCheckMs?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Given, and with a wakeup declared, the worker stops itself when idle (`stopCheckMs`); without
|
|
52
|
+
* it, nobody would start another, so it never does. Called once the worker has stopped itself, with the deadline it registered with the
|
|
53
|
+
* wakeup (null for none) and that registration's generation: a supervisor starts a fresh
|
|
54
|
+
* worker on the next request or wake (`shouldWake`), since a stopped one cannot launch again.
|
|
55
|
+
*/
|
|
56
|
+
onStopped?: (stopped: SelfStop) => void;
|
|
57
|
+
/**
|
|
58
|
+
* Apply the workflows' schedules (`trigger: { schedule }`): on by default. `runScenarios` turns
|
|
59
|
+
* it off, on a database of its own, so no schedule is applied there to start a live run.
|
|
60
|
+
*/
|
|
61
|
+
schedules?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* The config as the caller resolved it (`resolveConfig(config, options)`), for a worker that
|
|
64
|
+
* shares its drivers with the caller: the instance fakes of `fakes: "instance"`, which a demo's
|
|
65
|
+
* client and reseed call too. The caller closes its `dataStore`, as it made it.
|
|
66
|
+
*/
|
|
67
|
+
resolved?: ResolvedConfig;
|
|
30
68
|
}
|
|
31
69
|
/**
|
|
32
70
|
* Registers the workflows, connects to Postgres and recovers any runs that were interrupted.
|
package/dist/worker.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
2
3
|
import { awaitApproval } from "./approvals.js";
|
|
3
4
|
import { buildCtx, decideStart, isInfrastructureError, startHoldOf } from "./call.js";
|
|
4
5
|
import { dbosStatusesOf } from "./client.js";
|
|
5
|
-
import { resolveConfig } from "./config.js";
|
|
6
|
+
import { declaredWakeup, resolveConfig } from "./config.js";
|
|
6
7
|
import { storedSecrets, watchCredentials } from "./credentials.js";
|
|
7
|
-
import { DBOS_DATABASE_OPTIONS, lazyPool, prepareDatabase } from "./db.js";
|
|
8
|
+
import { claimWakeup, DBOS_DATABASE_OPTIONS, lazyPool, prepareDatabase } from "./db.js";
|
|
9
|
+
import { deadlineRegistry, idle, onOwnQueue, stopWhenIdle } from "./deadlines.js";
|
|
8
10
|
import { credentialsOf, unconfigured, unconfiguredSummary } from "./env.js";
|
|
9
11
|
import { errorInfo, parseOrThrow, PolicyDeniedError } from "./errors.js";
|
|
10
12
|
import { entry, ownedLedger, skipped, write, writeFailure } from "./ledger.js";
|
|
@@ -12,12 +14,22 @@ import { dbosLogger, quietIfSandbox, setLogLevel, warn } from "./log.js";
|
|
|
12
14
|
import { lineStartsOf, readSource } from "./ast.js";
|
|
13
15
|
import { callsOf, outlineWithSource } from "./outline.js";
|
|
14
16
|
import { currentRun } from "./run.js";
|
|
15
|
-
import {
|
|
17
|
+
import { applyScheduled, nextScheduledFire, scheduledStarter } from "./schedules.js";
|
|
18
|
+
import { approverLabel, errorMessage, WORKFLOW_ACTION } from "./shared.js";
|
|
19
|
+
/**
|
|
20
|
+
* How many times DBOS may start a run again before it gives up on it
|
|
21
|
+
* (`MAX_RECOVERY_ATTEMPTS_EXCEEDED`). Every start of a worker counts one for each unfinished run
|
|
22
|
+
* of its version, and a worker that stops when idle starts again at each wake and each request:
|
|
23
|
+
* at one every five minutes, DBOS's default of 100 would fail a run waiting on an approval within
|
|
24
|
+
* nine hours. 100,000 is a year of that; a run that crashes its process at every recovery is still
|
|
25
|
+
* given up on, after as many restarts.
|
|
26
|
+
*/
|
|
27
|
+
const MAX_RECOVERY_ATTEMPTS = 100_000;
|
|
16
28
|
// DBOS registrations are process-wide and survive shutdown, so a name is registered once, and
|
|
17
29
|
// its function reads the state of the worker running when a run starts, definition and all; the
|
|
18
|
-
// run keeps that state.
|
|
30
|
+
// run keeps that state. Each registered function, by name, is what a schedule fires.
|
|
19
31
|
let current;
|
|
20
|
-
const registered = new
|
|
32
|
+
const registered = new Map();
|
|
21
33
|
/**
|
|
22
34
|
* Registers the workflows, connects to Postgres and recovers any runs that were interrupted.
|
|
23
35
|
* When a driver declares variables the environment leaves unset, it first loads their stored
|
|
@@ -27,16 +39,27 @@ const registered = new Set();
|
|
|
27
39
|
*/
|
|
28
40
|
export async function startWorker(config, options = {}) {
|
|
29
41
|
// Check everything before touching the state a running worker reads.
|
|
30
|
-
const resolved = resolveConfig(config);
|
|
42
|
+
const resolved = options.resolved ?? resolveConfig(config);
|
|
31
43
|
setLogLevel(options.logLevel);
|
|
44
|
+
// Read once, when it matters: a worker stops itself, registering its next deadline there, only
|
|
45
|
+
// when its caller hears it stop (`onStopped`).
|
|
46
|
+
const wakeup = options.onStopped || config.wakeup === true ? await declaredWakeup(config) : undefined;
|
|
47
|
+
// The wakeup service wakes the instances that stop: one that runs it must not stop with its worker.
|
|
48
|
+
if (config.wakeup === true && wakeup) {
|
|
49
|
+
throw new Error("The config runs the wakeup service (`wakeup: true`) and declares a wakeup of its own: an instance that runs the service must not stop, so leave out one of them");
|
|
50
|
+
}
|
|
32
51
|
// The config's own, or a Postgres store made for this worker, which `stop` then closes.
|
|
33
52
|
const ledger = ownedLedger(resolved);
|
|
34
53
|
const secrets = lazyPool(resolved.databaseUrl, "secrets");
|
|
54
|
+
let stopRule;
|
|
55
|
+
let stopping;
|
|
56
|
+
const horizonMs = options.idleHorizonMs ?? 60_000;
|
|
35
57
|
const state = {
|
|
36
58
|
app: resolved.appName,
|
|
37
59
|
ops: resolved.ops,
|
|
38
60
|
drivers: resolved.drivers,
|
|
39
61
|
fakes: resolved.fakes,
|
|
62
|
+
...(resolved.instanceFakes && { instanceFakes: resolved.instanceFakes }),
|
|
40
63
|
...(resolved.scenarios && { scenarios: resolved.scenarios }),
|
|
41
64
|
...(options.source && { source: options.source }),
|
|
42
65
|
types: resolved.types,
|
|
@@ -49,27 +72,38 @@ export async function startWorker(config, options = {}) {
|
|
|
49
72
|
workflows: resolved.workflows,
|
|
50
73
|
outlines: new Map([...resolved.workflows].map(([name, wf]) => [name, outlineOf(wf)])),
|
|
51
74
|
stopped: false,
|
|
75
|
+
deadlines: deadlineRegistry(),
|
|
52
76
|
};
|
|
53
77
|
const credentials = await watchCredentials(resolved.databaseUrl, resolved.driversByVendor);
|
|
54
78
|
const worker = {
|
|
55
79
|
unconfigured: [...credentialsOf(resolved.driversByVendor, (name) => process.env[name])]
|
|
56
80
|
.filter(([vendor, statuses]) => unconfigured(vendor, statuses))
|
|
57
81
|
.map(([vendor]) => vendor),
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
82
|
+
deadlines: state.deadlines,
|
|
83
|
+
async idle() {
|
|
84
|
+
return !state.stopped && idle(state.deadlines, resolved, horizonMs);
|
|
85
|
+
},
|
|
86
|
+
stop() {
|
|
87
|
+
// A stop that failed may be tried again.
|
|
88
|
+
return (stopping ??= (async () => {
|
|
89
|
+
state.stopped = true;
|
|
90
|
+
stopRule?.close();
|
|
91
|
+
// Each is closed whatever the one before did; the first failure is what stop throws.
|
|
92
|
+
let failed;
|
|
93
|
+
for (const close of [
|
|
94
|
+
() => DBOS.shutdown(),
|
|
95
|
+
() => credentials.close(),
|
|
96
|
+
() => secrets.close(),
|
|
97
|
+
() => ledger.close(),
|
|
98
|
+
async () => (options.resolved ? undefined : resolved.dataStore?.close()),
|
|
99
|
+
]) {
|
|
100
|
+
await close().catch((error) => (failed ??= { error }));
|
|
101
|
+
}
|
|
102
|
+
if (failed) {
|
|
103
|
+
stopping = undefined;
|
|
104
|
+
throw failed.error;
|
|
105
|
+
}
|
|
106
|
+
})());
|
|
73
107
|
},
|
|
74
108
|
};
|
|
75
109
|
// Runs recovered during launch start before it returns, so they must already find this
|
|
@@ -79,10 +113,8 @@ export async function startWorker(config, options = {}) {
|
|
|
79
113
|
let launched = false;
|
|
80
114
|
try {
|
|
81
115
|
for (const name of resolved.workflows.keys()) {
|
|
82
|
-
if (!registered.has(name))
|
|
83
|
-
register(name);
|
|
84
|
-
registered.add(name);
|
|
85
|
-
}
|
|
116
|
+
if (!registered.has(name))
|
|
117
|
+
registered.set(name, register(name));
|
|
86
118
|
}
|
|
87
119
|
current = state;
|
|
88
120
|
// Before DBOS's pool connects, so its connections start with the database's idle-transaction
|
|
@@ -102,6 +134,7 @@ export async function startWorker(config, options = {}) {
|
|
|
102
134
|
// DBOS gives runs queued without a version only to the app's latest version, which is the
|
|
103
135
|
// newest one registered. A worker started on code seen before (a rollback) is not it.
|
|
104
136
|
const latest = (await DBOS.getLatestApplicationVersion()).versionName;
|
|
137
|
+
const isLatest = latest === resolved.version || options.promote === true;
|
|
105
138
|
if (latest !== resolved.version) {
|
|
106
139
|
if (options.promote)
|
|
107
140
|
await DBOS.setLatestApplicationVersion(resolved.version);
|
|
@@ -111,6 +144,12 @@ export async function startWorker(config, options = {}) {
|
|
|
111
144
|
}
|
|
112
145
|
}
|
|
113
146
|
await DBOS.registerQueue(resolved.queueName);
|
|
147
|
+
// The schedules are the latest version's: an older worker leaves them as the newer set them.
|
|
148
|
+
if (isLatest && options.schedules !== false) {
|
|
149
|
+
await applyScheduled(resolved, registered, () => secrets.db());
|
|
150
|
+
// A schedule's next tick is a deadline: a worker that stops when quiet registers it with its wakeup.
|
|
151
|
+
state.deadlines.addSource(() => nextScheduledFire(resolved, new Date()));
|
|
152
|
+
}
|
|
114
153
|
await warnAboutStrandedRuns(resolved);
|
|
115
154
|
const summary = unconfiguredSummary(worker.unconfigured, resolved.driversByVendor.size);
|
|
116
155
|
if (summary && !options.quiet)
|
|
@@ -118,6 +157,25 @@ export async function startWorker(config, options = {}) {
|
|
|
118
157
|
if (resolved.policyProblems.length && !options.quiet) {
|
|
119
158
|
warn(`the policies do not hold, so every call and start is refused:\n ${resolved.policyProblems.join("\n ")}`);
|
|
120
159
|
}
|
|
160
|
+
if (wakeup && options.onStopped) {
|
|
161
|
+
const owner = randomUUID();
|
|
162
|
+
await claimWakeup(await secrets.db(), owner);
|
|
163
|
+
const registerId = wakeup.type.wakeup.register;
|
|
164
|
+
stopRule = stopWhenIdle({
|
|
165
|
+
// The row is one more of the runtime's tables: the secrets' pool, on the same database.
|
|
166
|
+
db: () => secrets.db(),
|
|
167
|
+
owner,
|
|
168
|
+
wakeup: wakeup.binding ?? wakeup.id,
|
|
169
|
+
// `resolveConfig` checked the operation is the config's (`checkWakeupOps`).
|
|
170
|
+
register: { op: resolved.ops.get(registerId), fn: resolved.drivers.get(registerId) },
|
|
171
|
+
secrets: state.secrets,
|
|
172
|
+
deadlines: state.deadlines,
|
|
173
|
+
idle: () => worker.idle(),
|
|
174
|
+
everyMs: options.stopCheckMs ?? 15_000,
|
|
175
|
+
stop: () => worker.stop(),
|
|
176
|
+
onStopped: options.onStopped,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
121
179
|
}
|
|
122
180
|
catch (err) {
|
|
123
181
|
// Once DBOS is launched, the caller gets no worker to stop: stop it here, so no run goes on
|
|
@@ -163,7 +221,7 @@ async function warnAboutStrandedRuns({ appName, version, queueName }) {
|
|
|
163
221
|
});
|
|
164
222
|
const otherVersion = runs.filter((r) => r.applicationVersion && r.applicationVersion !== version);
|
|
165
223
|
// Recovery moves a worker's own runs to DBOS's internal queues, which are fine.
|
|
166
|
-
const otherQueue = runs.filter((r) => !otherVersion.includes(r) && r.queueName
|
|
224
|
+
const otherQueue = runs.filter((r) => !otherVersion.includes(r) && !onOwnQueue(r.queueName, queueName));
|
|
167
225
|
if (!otherVersion.length && !otherQueue.length)
|
|
168
226
|
return;
|
|
169
227
|
const ids = [...otherVersion, ...otherQueue].map((r) => r.workflowID);
|
|
@@ -173,23 +231,44 @@ async function warnAboutStrandedRuns({ appName, version, queueName }) {
|
|
|
173
231
|
`with DBOSClient.forkWorkflow(id, step, { applicationVersion: "${version}", queueName: "${queueName}" }) ` +
|
|
174
232
|
`and cancel the original; resumeWorkflow(id, { queueName: "${queueName}" }) moves a run on this version to this queue.`);
|
|
175
233
|
}
|
|
176
|
-
/**
|
|
234
|
+
/**
|
|
235
|
+
* Registers the name with DBOS: its runs take the definition of that name from the running worker.
|
|
236
|
+
* A start passes its `RunArgs`; a schedule's tick passes the time it is for (and DBOS's context).
|
|
237
|
+
*/
|
|
177
238
|
function register(name) {
|
|
178
|
-
DBOS.registerWorkflow((
|
|
179
|
-
name,
|
|
180
|
-
|
|
239
|
+
const fn = DBOS.registerWorkflow((start) => start instanceof Date
|
|
240
|
+
? runWorkflow(name, start)
|
|
241
|
+
: quietIfSandbox(start.sandbox !== undefined, () => runWorkflow(name, start)), { name, maxRecoveryAttempts: MAX_RECOVERY_ATTEMPTS });
|
|
242
|
+
return fn;
|
|
181
243
|
}
|
|
182
|
-
/**
|
|
183
|
-
|
|
244
|
+
/**
|
|
245
|
+
* One run of the workflow registered as `name`, on the state of the worker running when it
|
|
246
|
+
* starts, counted busy in its deadlines but while it waits: started with its `RunArgs`, or by its
|
|
247
|
+
* schedule for the time `start`, as the `schedule` agent with the input `{}`, the policy deciding
|
|
248
|
+
* that start at the top of the run.
|
|
249
|
+
*/
|
|
250
|
+
async function runWorkflow(name, start) {
|
|
184
251
|
const state = current;
|
|
185
252
|
// A stopped worker's state stays current while DBOS shuts down.
|
|
186
253
|
if (!state || state.stopped)
|
|
187
254
|
throw new Error(`Run of "${name}" started with no worker running`);
|
|
255
|
+
return state.deadlines.running(DBOS.workflowID, () => runOn(state, name, start));
|
|
256
|
+
}
|
|
257
|
+
async function runOn(state, name, start) {
|
|
188
258
|
const wf = state.workflows.get(name);
|
|
189
259
|
const outline = state.outlines.get(name);
|
|
190
260
|
// Registered by an earlier worker in this process, whose config had it; this one's has not.
|
|
191
261
|
if (!wf || !outline)
|
|
192
262
|
throw new Error(`Run of "${name}" refused: this worker's config has no workflow of that name`);
|
|
263
|
+
let scheduled;
|
|
264
|
+
let args;
|
|
265
|
+
if (start instanceof Date) {
|
|
266
|
+
scheduled = { at: start, ...(await scheduledStarter(state)) };
|
|
267
|
+
args = { input: {}, startedBy: scheduled.startedBy };
|
|
268
|
+
}
|
|
269
|
+
else
|
|
270
|
+
args = start;
|
|
271
|
+
const { input, startedBy, sandbox, hold } = args;
|
|
193
272
|
const run = {
|
|
194
273
|
id: DBOS.workflowID,
|
|
195
274
|
workflow: wf.name,
|
|
@@ -203,23 +282,35 @@ async function runWorkflow(name, { input, startedBy, sandbox, hold }) {
|
|
|
203
282
|
outline,
|
|
204
283
|
state,
|
|
205
284
|
};
|
|
206
|
-
await write(run, entry(run, { type: "run.started", input }));
|
|
285
|
+
await write(run, entry(run, { type: "run.started", input, ...(scheduled && { scheduledFor: scheduled.at.toISOString() }) }));
|
|
207
286
|
let output;
|
|
208
287
|
try {
|
|
209
288
|
try {
|
|
210
289
|
// The one parse of the input: the client checked it, but sent it as given.
|
|
211
290
|
const parsed = parseOrThrow(wf.input, input, `The input does not match ${wf.name}'s schema`);
|
|
291
|
+
const action = `${WORKFLOW_ACTION}${wf.name}`;
|
|
292
|
+
/** The policy's answer to this start, in a step; a deny fails the run. */
|
|
293
|
+
const decide = async () => {
|
|
294
|
+
const decision = await DBOS.runStep(async () => decideStart(state.policy, wf.name, parsed, startedBy, run.approvals), { name: `policy:${action}` });
|
|
295
|
+
if (decision.kind === "deny")
|
|
296
|
+
throw new PolicyDeniedError(action, decision.reason);
|
|
297
|
+
return decision;
|
|
298
|
+
};
|
|
299
|
+
if (scheduled) {
|
|
300
|
+
if (scheduled.refused)
|
|
301
|
+
throw new Error(`The schedule agent was not admitted: ${scheduled.refused}`);
|
|
302
|
+
// A schedule has no one to wait for, and its next tick would start another run meanwhile.
|
|
303
|
+
const decision = await decide();
|
|
304
|
+
if (decision.kind === "approve") {
|
|
305
|
+
throw new PolicyDeniedError(action, `it needs ${approverLabel(decision.approver)} to approve it, and a scheduled start waits for no approval`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
212
308
|
// The policy held the start: the body waits for each hold's approval in turn, the policy
|
|
213
309
|
// asked again once one is approved, and a rejection or a deny fails the run.
|
|
214
|
-
const action = `${WORKFLOW_ACTION}${wf.name}`;
|
|
215
310
|
for (let next = hold; next;) {
|
|
216
311
|
const held = { op: action, input, reasons: next.reasons };
|
|
217
312
|
await awaitApproval(run, next.title, { approver: next.approver, covers: [action] }, undefined, held);
|
|
218
|
-
const decision = await
|
|
219
|
-
name: `policy:${action}`,
|
|
220
|
-
});
|
|
221
|
-
if (decision.kind === "deny")
|
|
222
|
-
throw new PolicyDeniedError(action, decision.reason);
|
|
313
|
+
const decision = await decide();
|
|
223
314
|
next = decision.kind === "approve" ? startHoldOf(wf.name, decision) : undefined;
|
|
224
315
|
}
|
|
225
316
|
if (sandbox !== undefined) {
|
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAuB,aAAa,EAAqB,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAkE,MAAM,UAAU,CAAC;AAEtG,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY5D,8FAA8F;AAC9F,gGAAgG;AAChG,wBAAwB;AACxB,IAAI,OAAgC,CAAC;AACrC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AAsBrC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,OAAO,GAAkB,EAAE;IACjF,qEAAqE;IACrE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,wFAAwF;IACxF,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAgB;QACzB,GAAG,EAAE,QAAQ,CAAC,OAAO;QACrB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACjD,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,OAAO,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC;QACpD,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,EAAE,KAAK;KACf,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC3F,MAAM,MAAM,GAAW;QACrB,YAAY,EAAE,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;aACpF,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;aAC9D,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;QAC5B,KAAK,CAAC,IAAI;YACR,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,qFAAqF;YACrF,IAAI,MAAsC,CAAC;YAC3C,KAAK,MAAM,KAAK,IAAI;gBAClB,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACrB,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE;gBACzB,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;gBACrB,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;gBACpB,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE;aACxC,EAAE,CAAC;gBACF,MAAM,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,MAAM;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC;QACjC,CAAC;KACF,CAAC;IACF,uFAAuF;IACvF,0FAA0F;IAC1F,+FAA+F;IAC/F,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,KAAK,CAAC;QAChB,6FAA6F;QAC7F,oEAAoE;QACpE,MAAM,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,QAAQ,CAAC,OAAO;YACtB,iBAAiB,EAAE,QAAQ,CAAC,WAAW;YACvC,GAAG,qBAAqB;YACxB,2FAA2F;YAC3F,wGAAwG;YACxG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC3G,kBAAkB,EAAE,QAAQ,CAAC,OAAO;SACrC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,QAAQ,GAAG,IAAI,CAAC;QAChB,0FAA0F;QAC1F,sFAAsF;QACtF,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC,WAAW,CAAC;QACtE,IAAI,MAAM,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,OAAO;gBAAE,MAAM,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBACzE,CAAC;gBACJ,IAAI,CACF,4BAA4B,QAAQ,CAAC,OAAO,4BAA4B,MAAM,IAAI;oBAChF,gGAAgG,CACnG,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACxF,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrD,IAAI,CAAC,oEAAoE,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,4FAA4F;QAC5F,sEAAsE;QACtE,IAAI,UAA0C,CAAC;QAC/C,IAAI,QAAQ;YAAE,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;aACjF,CAAC;YACJ,MAAM,WAAW;iBACd,KAAK,EAAE;iBACP,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,IAAI,CAAC,4CAA4C,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,GAAG,QAAQ,CAAC;QACnB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,cAAc,CACtB,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,EACvB,GAAG,YAAY,CAAC,GAAG,CAAC,mCAAmC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EACxF,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,EAAgC;IACjD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,aAAa,EAAE,CAAC,IAAI,oEAAoE,OAAO,CAAC,KAAK,EAAE,CACxG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,MAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,qBAAqB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAkB;IAClF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;QACpC,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC;QAC3C,eAAe,EAAE,OAAO;QACxB,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,kBAAkB,KAAK,OAAO,CAAC,CAAC;IAClG,gFAAgF;IAChF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAClH,CAAC;IACF,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO;IACvD,MAAM,GAAG,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,CACF,GAAG,YAAY,CAAC,MAAM,0BAA0B,OAAO,mCAAmC,UAAU,CAAC,MAAM,GAAG;QAC5G,kDAAkD,OAAO,WAAW,SAAS,uBAAuB;QACpG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,oDAAoD;QAC/G,iEAAiE,OAAO,kBAAkB,SAAS,OAAO;QAC1G,6DAA6D,SAAS,iDAAiD,CAC1H,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE;QAClH,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,uGAAuG;AACvG,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAW;IACnF,MAAM,KAAK,GAAG,OAAO,CAAC;IACtB,gEAAgE;IAChE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,kCAAkC,CAAC,CAAC;IAChG,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,4FAA4F;IAC5F,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,8DAA8D,CAAC,CAAC;IACpH,MAAM,GAAG,GAAQ;QACf,EAAE,EAAE,IAAI,CAAC,UAAW;QACpB,QAAQ,EAAE,EAAE,CAAC,IAAI;QACjB,KAAK,EAAE,SAAS;QAChB,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7C,SAAS,EAAE,EAAE;QACb,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;QACvB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;QACZ,OAAO;QACP,KAAK;KACN,CAAC;IACF,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,IAAI,CAAC;YACH,2EAA2E;YAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC;YAC7F,yFAAyF;YACzF,6EAA6E;YAC7E,MAAM,MAAM,GAAG,GAAG,eAAe,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;YAC9C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC;gBAC5B,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC1D,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;gBACrG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CACjC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,EAChF;oBACE,IAAI,EAAE,UAAU,MAAM,EAAE;iBACzB,CACF,CAAC;gBACF,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM;oBAAE,MAAM,IAAI,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACnF,IAAI,GAAG,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClF,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,2EAA2E;gBAC3E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;gBACrD,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;YACD,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9E,CAAC;gBAAS,CAAC;YACT,8EAA8E;YAC9E,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO,CAAC,MAAM,EAAE,4BAA4B,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;YACpG,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
|
package/oxlint.json
CHANGED
|
@@ -97,7 +97,8 @@
|
|
|
97
97
|
"@sanoma-ai/workflows/fake",
|
|
98
98
|
"@sanoma-ai/workflows/plugin",
|
|
99
99
|
"@sanoma-ai/workflows/scenario",
|
|
100
|
-
"@sanoma-ai/workflows/scenarios"
|
|
100
|
+
"@sanoma-ai/workflows/scenarios",
|
|
101
|
+
"@sanoma-ai/workflows/wakeup-service"
|
|
101
102
|
],
|
|
102
103
|
"message": "A workflow must call vendors through ctx, so the policy sees every call: import the connector itself, `@sanoma-ai/connector-<vendor>`."
|
|
103
104
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanoma-ai/workflows",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Business processes as TypeScript functions, run durably on DBOS",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"approvals",
|
|
@@ -66,12 +66,17 @@
|
|
|
66
66
|
"./shared": {
|
|
67
67
|
"types": "./dist/shared.d.ts",
|
|
68
68
|
"default": "./dist/shared.js"
|
|
69
|
+
},
|
|
70
|
+
"./wakeup-service": {
|
|
71
|
+
"types": "./dist/wakeup-service.d.ts",
|
|
72
|
+
"default": "./dist/wakeup-service.js"
|
|
69
73
|
}
|
|
70
74
|
},
|
|
71
75
|
"publishConfig": {
|
|
72
76
|
"access": "public"
|
|
73
77
|
},
|
|
74
78
|
"dependencies": {
|
|
79
|
+
"@ai-sdk/provider": "4.0.34",
|
|
75
80
|
"@cedar-policy/cedar-wasm": "4.14.0",
|
|
76
81
|
"@cucumber/cucumber": "13.3.0",
|
|
77
82
|
"@cucumber/cucumber-expressions": "^20.1.0",
|
|
@@ -79,6 +84,7 @@
|
|
|
79
84
|
"@cucumber/query": "16.1.1",
|
|
80
85
|
"@dbos-inc/dbos-sdk": "^5.2.11",
|
|
81
86
|
"@faker-js/faker": "^10.6.0",
|
|
87
|
+
"ai": "7.0.153",
|
|
82
88
|
"oxc-parser": "^0.153.0",
|
|
83
89
|
"oxfmt": "^0.72.0",
|
|
84
90
|
"pg": "^8.23.1",
|
|
@@ -93,7 +99,7 @@
|
|
|
93
99
|
"zod": "^4"
|
|
94
100
|
},
|
|
95
101
|
"engines": {
|
|
96
|
-
"node": "
|
|
102
|
+
"node": ">=26"
|
|
97
103
|
},
|
|
98
104
|
"//": "randexp is a dependency only because zod-schema-faker, which makes up scenario inputs, needs it as a peer.",
|
|
99
105
|
"scripts": {
|
package/src/apply.ts
CHANGED
|
@@ -178,15 +178,17 @@ function inDependencyOrder<T extends { id: string; refs: Record<string, string>
|
|
|
178
178
|
/**
|
|
179
179
|
* What a change operation is given of a declaration: its fields, where it names a resource the
|
|
180
180
|
* vendor may hold by another field (`by`, as a repository's node id), that resource's binding id
|
|
181
|
-
* when it has one, made in this run or before
|
|
181
|
+
* when it has one, made in this run or before; a wakeup's `host`, the URL its host answers at
|
|
182
|
+
* (`urls`, by the host's declared id) once its state says.
|
|
182
183
|
*/
|
|
183
184
|
function desiredOf(
|
|
184
185
|
r: Declaration,
|
|
185
186
|
types: ReadonlyMap<string, Resource>,
|
|
186
187
|
bindings: Bindings,
|
|
187
188
|
hosts: ReadonlyMap<string, { source: string; revision: string }>,
|
|
189
|
+
urls: ReadonlyMap<string, string>,
|
|
188
190
|
): State {
|
|
189
|
-
const { fields, host } = types.get(`${r.vendor}.${r.type}`)!;
|
|
191
|
+
const { fields, host, wakeup } = types.get(`${r.vendor}.${r.type}`)!;
|
|
190
192
|
const { references = {} } = fields;
|
|
191
193
|
const out = structuredClone(r.desired);
|
|
192
194
|
for (const [at, target] of Object.entries(r.refs)) {
|
|
@@ -194,6 +196,11 @@ function desiredOf(
|
|
|
194
196
|
const place = holderOf(out, at);
|
|
195
197
|
if (references[fieldPathOf(at)]?.by?.length && bound !== undefined && place) place.holder[place.key] = bound;
|
|
196
198
|
}
|
|
199
|
+
if (wakeup) {
|
|
200
|
+
const url = urls.get(r.refs[wakeup.inputs.host] ?? "");
|
|
201
|
+
const named = holderOf(out, wakeup.inputs.host);
|
|
202
|
+
if (url && named) named.holder[named.key] = url;
|
|
203
|
+
}
|
|
197
204
|
// A host is given its source's clone URL and the commit its ref names now.
|
|
198
205
|
const run = hosts.get(r.id);
|
|
199
206
|
if (host && run) {
|
|
@@ -406,7 +413,8 @@ function messageOf(step: PlanStep, before: Binding | undefined, after: Binding |
|
|
|
406
413
|
* and right after one that changes a binding, the lockfile written and committed
|
|
407
414
|
* (`steps.write`), so an object made is never left unbound. An update is given the plan's action
|
|
408
415
|
* and replace (`expect`), and refuses (`plan_changed`) when the vendor now plans otherwise; a
|
|
409
|
-
* reference to a resource made in this run is given its new binding
|
|
416
|
+
* reference to a resource made in this run is given its new binding, and a wakeup's `host` the
|
|
417
|
+
* URL its host's state gives (`outputs(state).url`), found or made in this run. A failed step is reported
|
|
410
418
|
* and the run goes on; a failure that ends the run (`isRunControlError`) ends it.
|
|
411
419
|
*/
|
|
412
420
|
export function applyWorkflow(
|
|
@@ -467,6 +475,16 @@ export function applyWorkflow(
|
|
|
467
475
|
}
|
|
468
476
|
}
|
|
469
477
|
}
|
|
478
|
+
// Where each declared host answers, as its state says, found now or made below: a wakeup is given it.
|
|
479
|
+
const urls = new Map<string, string>();
|
|
480
|
+
const answersAt = (r: Declaration, state: State) => {
|
|
481
|
+
const url = types.get(`${r.vendor}.${r.type}`)?.host?.outputs(state).url;
|
|
482
|
+
if (url) urls.set(r.id, url);
|
|
483
|
+
};
|
|
484
|
+
for (const resource of resources) {
|
|
485
|
+
const now = found.get(resource.id);
|
|
486
|
+
if (now && "state" in now) answersAt(resource, now.state);
|
|
487
|
+
}
|
|
470
488
|
// A host wanted runs the commit its ref names now, resolved before planning: a merge is a change
|
|
471
489
|
// to it. One bound by the input needs none.
|
|
472
490
|
const revisions = new Map<string, Revision>();
|
|
@@ -492,7 +510,7 @@ export function applyWorkflow(
|
|
|
492
510
|
}
|
|
493
511
|
}
|
|
494
512
|
const drift = new Map(compare(types, resources, found, revisions).map((result) => [result.id, result]));
|
|
495
|
-
const desired = new Map(resources.map((r) => [r.id, desiredOf(r, types, locked, hosts)]));
|
|
513
|
+
const desired = new Map(resources.map((r) => [r.id, desiredOf(r, types, locked, hosts, urls)]));
|
|
496
514
|
|
|
497
515
|
const planned: PlanStep[] = [];
|
|
498
516
|
for (const resource of inDependencyOrder(resources).filter((r) => wanted(r.id))) {
|
|
@@ -546,7 +564,7 @@ export function applyWorkflow(
|
|
|
546
564
|
try {
|
|
547
565
|
if (todo === "create") {
|
|
548
566
|
const made = await ctx[step.vendor]![step.type]!.create({
|
|
549
|
-
desired: desiredOf(declared!, types, bindings, hosts),
|
|
567
|
+
desired: desiredOf(declared!, types, bindings, hosts, urls),
|
|
550
568
|
});
|
|
551
569
|
bindings[key] = { type, id: made.id };
|
|
552
570
|
state = made.state;
|
|
@@ -554,7 +572,7 @@ export function applyWorkflow(
|
|
|
554
572
|
const expect = { action: step.action, replace: step.replace };
|
|
555
573
|
const changed = await ctx[step.vendor]![step.type]!.update({
|
|
556
574
|
id: binding,
|
|
557
|
-
desired: desiredOf(declared!, types, bindings, hosts),
|
|
575
|
+
desired: desiredOf(declared!, types, bindings, hosts, urls),
|
|
558
576
|
expect,
|
|
559
577
|
});
|
|
560
578
|
bindings[key] = { type, id: changed.id };
|
|
@@ -564,6 +582,7 @@ export function applyWorkflow(
|
|
|
564
582
|
delete bindings[key];
|
|
565
583
|
} else if (todo === "bind") bindings[key] = { type, id: binding };
|
|
566
584
|
else if (todo === "forget") delete bindings[key];
|
|
585
|
+
if (state && declared) answersAt(declared, state);
|
|
567
586
|
const after = bindings[key];
|
|
568
587
|
if (after?.id !== before?.id) {
|
|
569
588
|
const wrote = await steps.write(key, after, messageOf(step, before, after));
|