@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.
Files changed (149) hide show
  1. package/README.md +48 -14
  2. package/dist/apply.d.ts +2 -1
  3. package/dist/apply.js +29 -7
  4. package/dist/apply.js.map +1 -1
  5. package/dist/approvals.d.ts +27 -2
  6. package/dist/approvals.js +73 -9
  7. package/dist/approvals.js.map +1 -1
  8. package/dist/call.d.ts +3 -2
  9. package/dist/call.js +38 -30
  10. package/dist/call.js.map +1 -1
  11. package/dist/cedar.js +24 -9
  12. package/dist/cedar.js.map +1 -1
  13. package/dist/change.d.ts +219 -0
  14. package/dist/change.js +150 -0
  15. package/dist/change.js.map +1 -0
  16. package/dist/chats.d.ts +43 -0
  17. package/dist/chats.js +48 -0
  18. package/dist/chats.js.map +1 -0
  19. package/dist/client.d.ts +52 -6
  20. package/dist/client.js +88 -47
  21. package/dist/client.js.map +1 -1
  22. package/dist/config.d.ts +47 -5
  23. package/dist/config.js +71 -7
  24. package/dist/config.js.map +1 -1
  25. package/dist/database.d.ts +83 -0
  26. package/dist/database.js +92 -0
  27. package/dist/database.js.map +1 -0
  28. package/dist/db.d.ts +31 -1
  29. package/dist/db.js +89 -7
  30. package/dist/db.js.map +1 -1
  31. package/dist/deadlines.d.ts +88 -0
  32. package/dist/deadlines.js +171 -0
  33. package/dist/deadlines.js.map +1 -0
  34. package/dist/define.d.ts +25 -4
  35. package/dist/define.js +40 -0
  36. package/dist/define.js.map +1 -1
  37. package/dist/demo.d.ts +28 -0
  38. package/dist/demo.js +72 -0
  39. package/dist/demo.js.map +1 -0
  40. package/dist/describe.d.ts +5 -2
  41. package/dist/describe.js +10 -6
  42. package/dist/describe.js.map +1 -1
  43. package/dist/errors.d.ts +10 -1
  44. package/dist/errors.js +13 -0
  45. package/dist/errors.js.map +1 -1
  46. package/dist/fake.d.ts +8 -0
  47. package/dist/fake.js +11 -1
  48. package/dist/fake.js.map +1 -1
  49. package/dist/grid.d.ts +34 -0
  50. package/dist/grid.js +62 -0
  51. package/dist/grid.js.map +1 -0
  52. package/dist/host.d.ts +13 -2
  53. package/dist/host.js +2 -2
  54. package/dist/host.js.map +1 -1
  55. package/dist/index.d.ts +16 -8
  56. package/dist/index.js +12 -5
  57. package/dist/index.js.map +1 -1
  58. package/dist/ledger.d.ts +11 -2
  59. package/dist/ledger.js.map +1 -1
  60. package/dist/lint.js +1 -1
  61. package/dist/lint.js.map +1 -1
  62. package/dist/op.d.ts +14 -2
  63. package/dist/op.js.map +1 -1
  64. package/dist/policy.d.ts +7 -1
  65. package/dist/policy.js +2 -1
  66. package/dist/policy.js.map +1 -1
  67. package/dist/resource.d.ts +13 -1
  68. package/dist/resource.js +9 -1
  69. package/dist/resource.js.map +1 -1
  70. package/dist/resources.d.ts +2 -0
  71. package/dist/resources.js +10 -1
  72. package/dist/resources.js.map +1 -1
  73. package/dist/run.d.ts +5 -0
  74. package/dist/run.js.map +1 -1
  75. package/dist/sandbox.d.ts +38 -10
  76. package/dist/sandbox.js +66 -35
  77. package/dist/sandbox.js.map +1 -1
  78. package/dist/scenario.d.ts +18 -1
  79. package/dist/scenario.js +77 -27
  80. package/dist/scenario.js.map +1 -1
  81. package/dist/scenarios.d.ts +10 -1
  82. package/dist/scenarios.js +19 -4
  83. package/dist/scenarios.js.map +1 -1
  84. package/dist/schedules.d.ts +66 -0
  85. package/dist/schedules.js +158 -0
  86. package/dist/schedules.js.map +1 -0
  87. package/dist/schema.d.ts +6 -0
  88. package/dist/schema.js +13 -3
  89. package/dist/schema.js.map +1 -1
  90. package/dist/shared.d.ts +30 -2
  91. package/dist/shared.js +42 -4
  92. package/dist/shared.js.map +1 -1
  93. package/dist/source.d.ts +61 -2
  94. package/dist/source.js.map +1 -1
  95. package/dist/supervisor.d.ts +38 -0
  96. package/dist/supervisor.js +77 -0
  97. package/dist/supervisor.js.map +1 -0
  98. package/dist/version.d.ts +3 -1
  99. package/dist/version.js +3 -1
  100. package/dist/version.js.map +1 -1
  101. package/dist/wakeup-service.d.ts +83 -0
  102. package/dist/wakeup-service.js +421 -0
  103. package/dist/wakeup-service.js.map +1 -0
  104. package/dist/wakeup.d.ts +84 -0
  105. package/dist/wakeup.js +87 -0
  106. package/dist/wakeup.js.map +1 -0
  107. package/dist/worker.d.ts +39 -1
  108. package/dist/worker.js +130 -39
  109. package/dist/worker.js.map +1 -1
  110. package/oxlint.json +2 -1
  111. package/package.json +8 -2
  112. package/src/apply.ts +25 -6
  113. package/src/approvals.ts +89 -16
  114. package/src/call.ts +40 -29
  115. package/src/cedar.ts +24 -6
  116. package/src/change.ts +222 -0
  117. package/src/chats.ts +114 -0
  118. package/src/client.ts +145 -55
  119. package/src/config.ts +110 -13
  120. package/src/database.ts +152 -0
  121. package/src/db.ts +108 -9
  122. package/src/deadlines.ts +234 -0
  123. package/src/define.ts +71 -4
  124. package/src/demo.ts +87 -0
  125. package/src/describe.ts +18 -6
  126. package/src/errors.ts +14 -0
  127. package/src/fake.ts +12 -0
  128. package/src/grid.ts +100 -0
  129. package/src/host.ts +13 -4
  130. package/src/index.ts +61 -3
  131. package/src/ledger.ts +15 -3
  132. package/src/lint.ts +1 -1
  133. package/src/op.ts +15 -2
  134. package/src/policy.ts +7 -1
  135. package/src/resource.ts +22 -3
  136. package/src/resources.ts +12 -1
  137. package/src/run.ts +5 -0
  138. package/src/sandbox.ts +97 -37
  139. package/src/scenario.ts +97 -28
  140. package/src/scenarios.ts +21 -5
  141. package/src/schedules.ts +206 -0
  142. package/src/schema.ts +16 -3
  143. package/src/shared.ts +51 -4
  144. package/src/source.ts +58 -3
  145. package/src/supervisor.ts +107 -0
  146. package/src/version.ts +3 -1
  147. package/src/wakeup-service.ts +511 -0
  148. package/src/wakeup.ts +150 -0
  149. 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 { errorMessage, WORKFLOW_ACTION } from "./shared.js";
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 Set();
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
- async stop() {
59
- state.stopped = true;
60
- // Each is closed whatever the one before did; the first failure is what stop throws.
61
- let failed;
62
- for (const close of [
63
- () => DBOS.shutdown(),
64
- () => credentials.close(),
65
- () => secrets.close(),
66
- () => ledger.close(),
67
- async () => resolved.dataStore?.close(),
68
- ]) {
69
- await close().catch((error) => (failed ??= { error }));
70
- }
71
- if (failed)
72
- throw failed.error;
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 && r.queueName !== queueName && !r.queueName.startsWith("_dbos_"));
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
- /** Registers the name with DBOS: its runs take the definition of that name from the running worker. */
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((args) => quietIfSandbox(args.sandbox !== undefined, () => runWorkflow(name, args)), {
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
- /** One run of the workflow registered as `name`, on the state of the worker running when it starts. */
183
- async function runWorkflow(name, { input, startedBy, sandbox, hold }) {
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 DBOS.runStep(async () => decideStart(state.policy, wf.name, parsed, startedBy, run.approvals), {
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
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.6.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": "24 || >=26"
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. A failed step is reported
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));