@orkestrel/workflow 0.0.18 → 0.0.19

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.
@@ -1,5 +1,5 @@
1
+ import { arrayShape, attempt, cloneJSONRecord, cloneJSONValue, compileGuard, createContract, integerShape, isArray, isBoolean, isContractError, isError, isFiniteNumber, isFunction, isInstance, isInteger, isJSONValue, isNonEmptyString, isObject, isRecord, isString, literalShape, objectShape, optionalShape, rawShape, stringShape } from "@orkestrel/contract";
1
2
  import { createAbort, isAbortSignal, linkSignal } from "@orkestrel/abort";
2
- import { arrayShape, attempt, cloneJSONRecord, cloneJSONValue, compileGuard, createContract, integerShape, isArray, isBoolean, isContractError, isFiniteNumber, isFunction, isInteger, isJSONValue, isNonEmptyString, isObject, isRecord, literalShape, objectShape, optionalShape, rawShape, stringShape } from "@orkestrel/contract";
3
3
  import { createDatabase, createMemoryDriver } from "@orkestrel/database";
4
4
  import { Emitter } from "@orkestrel/emitter";
5
5
  import { createTimeout } from "@orkestrel/timeout";
@@ -44,11 +44,7 @@ var WorkflowError = class extends Error {
44
44
  * ```
45
45
  */
46
46
  function isWorkflowError(value) {
47
- try {
48
- return value instanceof WorkflowError;
49
- } catch {
50
- return false;
51
- }
47
+ return isInstance(value, WorkflowError);
52
48
  }
53
49
  //#endregion
54
50
  //#region src/core/constants.ts
@@ -277,14 +273,14 @@ function isWorkflowInterface(value) {
277
273
  */
278
274
  function isOwnedWorkflowSnapshot(value) {
279
275
  try {
280
- if (!isRecord(value) || !Object.keys(value).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "override" || key === "bail" || key === "phases" || key === "created" || key === "updated") || !isNonEmptyString(value.id) || !isNonEmptyString(value.name) || value.description !== void 0 && typeof value.description !== "string" || !isLifecycleStatus(value.status) || value.override !== void 0 && value.override !== "completed" && value.override !== "skipped" && value.override !== "stopped" || !isBoolean(value.bail) || !isArray(value.phases) || !isFiniteNumber(value.created) || value.created < 0 || !isFiniteNumber(value.updated) || value.updated < value.created) return false;
276
+ if (!isRecord(value) || !Object.keys(value).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "override" || key === "bail" || key === "phases" || key === "created" || key === "updated") || !isNonEmptyString(value.id) || !isNonEmptyString(value.name) || value.description !== void 0 && !isString(value.description) || !isLifecycleStatus(value.status) || value.override !== void 0 && value.override !== "completed" && value.override !== "skipped" && value.override !== "stopped" || !isBoolean(value.bail) || !isArray(value.phases) || !isFiniteNumber(value.created) || value.created < 0 || !isFiniteNumber(value.updated) || value.updated < value.created) return false;
281
277
  const phaseIds = /* @__PURE__ */ new Set();
282
278
  const derivations = [];
283
279
  let frontier = false;
284
280
  let running = false;
285
281
  let vacuous = true;
286
282
  for (const phase of value.phases) {
287
- if (!isRecord(phase) || !Object.keys(phase).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "override" || key === "bail" || key === "concurrency" || key === "tasks") || !isNonEmptyString(phase.id) || phaseIds.has(phase.id) || !isNonEmptyString(phase.name) || phase.description !== void 0 && typeof phase.description !== "string" || !isLifecycleStatus(phase.status) || phase.override !== void 0 && phase.override !== "skipped" && phase.override !== "stopped" || !isBoolean(phase.bail) || phase.concurrency !== void 0 && (!isInteger(phase.concurrency) || phase.concurrency < 1) || !isArray(phase.tasks)) return false;
283
+ if (!isRecord(phase) || !Object.keys(phase).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "override" || key === "bail" || key === "concurrency" || key === "tasks") || !isNonEmptyString(phase.id) || phaseIds.has(phase.id) || !isNonEmptyString(phase.name) || phase.description !== void 0 && !isString(phase.description) || !isLifecycleStatus(phase.status) || phase.override !== void 0 && phase.override !== "skipped" && phase.override !== "stopped" || !isBoolean(phase.bail) || phase.concurrency !== void 0 && (!isInteger(phase.concurrency) || phase.concurrency < 1) || !isArray(phase.tasks)) return false;
288
284
  const forced = phase.override === "skipped" || phase.override === "stopped";
289
285
  const started = phase.status === "running" || phase.status === "completed" || phase.status === "failed";
290
286
  if (!forced && frontier && started || phase.status === "running" && running) return false;
@@ -295,7 +291,7 @@ function isOwnedWorkflowSnapshot(value) {
295
291
  const statuses = [];
296
292
  if (phase.tasks.length > 0) vacuous = false;
297
293
  for (const task of phase.tasks) {
298
- if (!isRecord(task) || !Object.keys(task).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "result" || key === "metadata" || key === "attempts" || key === "behavior" || key === "retries" || key === "timeout" || key === "activity") || !isNonEmptyString(task.id) || taskIds.has(task.id) || !isNonEmptyString(task.name) || task.description !== void 0 && typeof task.description !== "string" || !isLifecycleStatus(task.status) || !isRecord(task.metadata) || !isJSONValue(task.metadata) || !isInteger(task.attempts) || task.attempts < 0 || task.behavior !== void 0 && !isNonEmptyString(task.behavior) || task.retries !== void 0 && (!isInteger(task.retries) || task.retries < 0) || task.timeout !== void 0 && (!isInteger(task.timeout) || task.timeout < 0 || task.timeout > 2147483647)) return false;
294
+ if (!isRecord(task) || !Object.keys(task).every((key) => key === "id" || key === "name" || key === "description" || key === "status" || key === "result" || key === "metadata" || key === "attempts" || key === "behavior" || key === "retries" || key === "timeout" || key === "activity") || !isNonEmptyString(task.id) || taskIds.has(task.id) || !isNonEmptyString(task.name) || task.description !== void 0 && !isString(task.description) || !isLifecycleStatus(task.status) || !isRecord(task.metadata) || !isJSONValue(task.metadata) || !isInteger(task.attempts) || task.attempts < 0 || task.behavior !== void 0 && !isNonEmptyString(task.behavior) || task.retries !== void 0 && (!isInteger(task.retries) || task.retries < 0) || task.timeout !== void 0 && (!isInteger(task.timeout) || task.timeout < 0 || task.timeout > 2147483647)) return false;
299
295
  const budget = (task.retries ?? 0) + 1;
300
296
  if (task.attempts > budget || task.status === "pending" && task.attempts >= budget) return false;
301
297
  if (!(task.activity === void 0 || isTaskActivity(task.activity))) return false;
@@ -771,8 +767,8 @@ function canTransitionTask(from, to) {
771
767
  * @returns A host-safe effective window (`1..MAX_TIMER_MS`), or `undefined`
772
768
  */
773
769
  function resolveTaskSilence(value, fallback) {
774
- if (value !== void 0) return Number.isFinite(value) && value > 0 && value <= 2147483647 ? value : void 0;
775
- return fallback !== void 0 && Number.isFinite(fallback) && fallback > 0 && fallback <= 2147483647 ? fallback : void 0;
770
+ if (value !== void 0) return isFiniteNumber(value) && value > 0 && value <= 2147483647 ? value : void 0;
771
+ return fallback !== void 0 && isFiniteNumber(fallback) && fallback > 0 && fallback <= 2147483647 ? fallback : void 0;
776
772
  }
777
773
  /**
778
774
  * Boxes a value as a {@link Success} — the graceful outcome half of a {@link Result}.
@@ -818,8 +814,8 @@ function failure(error) {
818
814
  */
819
815
  function errorToMessage(error) {
820
816
  try {
821
- const message = error instanceof Error ? error.message : String(error);
822
- return typeof message === "string" && message.length > 0 ? message : "unknown failure";
817
+ const message = isError(error) ? error.message : String(error);
818
+ return isString(message) && message.length > 0 ? message : "unknown failure";
823
819
  } catch {
824
820
  return "unknown failure";
825
821
  }
@@ -1089,7 +1085,7 @@ function recoverWorkflowSnapshot(snapshot) {
1089
1085
  * ```
1090
1086
  */
1091
1087
  function matchesDescription(left, right) {
1092
- return left === right && (left === void 0 || typeof left === "string");
1088
+ return left === right && (left === void 0 || isString(left));
1093
1089
  }
1094
1090
  /**
1095
1091
  * Tests a result's lineage against its containing snapshot nodes.
@@ -2087,7 +2083,7 @@ var Task = class {
2087
2083
  }
2088
2084
  fail(error) {
2089
2085
  const origin = error.origin === "handler" || error.origin === "timeout" || error.origin === "recovery" ? error.origin : "handler";
2090
- const message = typeof error.message === "string" && error.message.length > 0 ? error.message : "unknown failure";
2086
+ const message = isString(error.message) && error.message.length > 0 ? error.message : "unknown failure";
2091
2087
  this.#transition("failed");
2092
2088
  this.#finish();
2093
2089
  const result = this.#record("failed", Object.freeze({
@@ -2126,7 +2122,7 @@ var Task = class {
2126
2122
  this.#emitter.emit("report", activity);
2127
2123
  return success(activity);
2128
2124
  } catch (error) {
2129
- return failure(error instanceof WorkflowError ? error : new WorkflowError("MUTATION", "task activity report was refused", { task: this.id }));
2125
+ return failure(isWorkflowError(error) ? error : new WorkflowError("MUTATION", "task activity report was refused", { task: this.id }));
2130
2126
  }
2131
2127
  }
2132
2128
  pulse() {
@@ -4024,7 +4020,7 @@ var WorkflowRunner = class WorkflowRunner {
4024
4020
  let runSignal;
4025
4021
  let onCancel;
4026
4022
  try {
4027
- timeout = ms !== void 0 && Number.isFinite(ms) && ms > 0 && ms <= 2147483647 ? createTimeout({ ms }) : void 0;
4023
+ timeout = ms !== void 0 && isFiniteNumber(ms) && ms > 0 && ms <= 2147483647 ? createTimeout({ ms }) : void 0;
4028
4024
  timeout?.start();
4029
4025
  budget?.start();
4030
4026
  runSignal = this.#fold(workflow, signal, budget, timeout);
@@ -4157,7 +4153,7 @@ var WorkflowRunner = class WorkflowRunner {
4157
4153
  return;
4158
4154
  }
4159
4155
  const ms = task.timeout;
4160
- const deadline = ms !== void 0 && Number.isFinite(ms) && ms > 0 && ms <= 2147483647 ? createTimeout({ ms }) : void 0;
4156
+ const deadline = ms !== void 0 && isFiniteNumber(ms) && ms > 0 && ms <= 2147483647 ? createTimeout({ ms }) : void 0;
4161
4157
  const signal = this.#taskSignal(task, controller.signal, runSignal, deadline);
4162
4158
  try {
4163
4159
  task.start();
@@ -4311,7 +4307,7 @@ var WorkflowRunner = class WorkflowRunner {
4311
4307
  try {
4312
4308
  if (workflow !== void 0 && isHalted(workflow, phase)) deferred.resolve(void 0);
4313
4309
  const outcome = await Promise.race([wait, deferred.promise]);
4314
- return typeof outcome === "boolean" ? outcome : void 0;
4310
+ return isBoolean(outcome) ? outcome : void 0;
4315
4311
  } finally {
4316
4312
  signal.removeEventListener("abort", onAbort);
4317
4313
  workflow?.emitter.off("skip", onTerminal);