@lostgradient/weft 0.2.0 → 0.3.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 (207) hide show
  1. package/README.md +47 -22
  2. package/dist/cli/generated/operation-client.generated.d.ts +28 -1
  3. package/dist/cli/generated/operation-client.generated.js +2 -0
  4. package/dist/cli-main.js +79 -79
  5. package/dist/client/handle-delegation.d.ts +4 -0
  6. package/dist/client/handle-delegation.js +6 -0
  7. package/dist/client/http-client-requests.d.ts +2 -0
  8. package/dist/client/http-client-requests.js +3 -0
  9. package/dist/client/http-client.d.ts +4 -1
  10. package/dist/client/http-client.js +9 -1
  11. package/dist/client/interface.d.ts +57 -2
  12. package/dist/client/local.d.ts +4 -1
  13. package/dist/client/local.js +7 -0
  14. package/dist/client/start-body.d.ts +7 -1
  15. package/dist/client/start-body.js +13 -4
  16. package/dist/core/codec/extension-codec.js +4 -2
  17. package/dist/core/codec/index.d.ts +1 -0
  18. package/dist/core/codec/index.js +1 -0
  19. package/dist/core/codec/serializer-registry.d.ts +122 -0
  20. package/dist/core/codec/serializer-registry.js +51 -0
  21. package/dist/core/context/index.d.ts +10 -0
  22. package/dist/core/context/index.js +3 -0
  23. package/dist/core/context/internals.d.ts +10 -0
  24. package/dist/core/context/internals.js +5 -1
  25. package/dist/core/context/run-operation.d.ts +16 -3
  26. package/dist/core/context/run-operation.js +16 -7
  27. package/dist/core/context/speculative-child.js +2 -0
  28. package/dist/core/context/types.d.ts +6 -0
  29. package/dist/core/engine/bulk-operations-purge.js +1 -0
  30. package/dist/core/engine/bulk-operations.js +1 -1
  31. package/dist/core/engine/callback-creators-bundles.js +2 -1
  32. package/dist/core/engine/callback-creators-core.js +2 -1
  33. package/dist/core/engine/construction.d.ts +1 -1
  34. package/dist/core/engine/construction.js +15 -3
  35. package/dist/core/engine/disposal.js +12 -0
  36. package/dist/core/engine/engine-create-types.d.ts +0 -14
  37. package/dist/core/engine/engine-internal-types.d.ts +17 -0
  38. package/dist/core/engine/engine-leak-warnings.d.ts +6 -0
  39. package/dist/core/engine/engine-leak-warnings.js +4 -0
  40. package/dist/core/engine/engine-runtime-helpers.d.ts +17 -0
  41. package/dist/core/engine/engine-runtime-helpers.js +26 -5
  42. package/dist/core/engine/errors.d.ts +74 -0
  43. package/dist/core/engine/errors.js +25 -1
  44. package/dist/core/engine/handle-result.js +1 -1
  45. package/dist/core/engine/handles.d.ts +89 -40
  46. package/dist/core/engine/handles.js +25 -27
  47. package/dist/core/engine/index.d.ts +122 -4
  48. package/dist/core/engine/index.js +82 -5
  49. package/dist/core/engine/inline-launch-queue.d.ts +14 -0
  50. package/dist/core/engine/inline-launch-queue.js +32 -7
  51. package/dist/core/engine/internals.d.ts +26 -10
  52. package/dist/core/engine/lifecycle/fork-helpers.js +1 -7
  53. package/dist/core/engine/lifecycle/persist.js +5 -20
  54. package/dist/core/engine/lifecycle/recovered-services.d.ts +45 -0
  55. package/dist/core/engine/lifecycle/recovered-services.js +34 -0
  56. package/dist/core/engine/lifecycle/resume.js +33 -5
  57. package/dist/core/engine/lifecycle/shared.d.ts +8 -0
  58. package/dist/core/engine/lifecycle/start-batch.js +23 -12
  59. package/dist/core/engine/lifecycle/start-commit.d.ts +47 -0
  60. package/dist/core/engine/lifecycle/start-commit.js +27 -0
  61. package/dist/core/engine/lifecycle/start-exec.d.ts +30 -2
  62. package/dist/core/engine/lifecycle/start-exec.js +38 -0
  63. package/dist/core/engine/lifecycle/start-or-signal-resolution.d.ts +79 -0
  64. package/dist/core/engine/lifecycle/start-or-signal-resolution.js +60 -0
  65. package/dist/core/engine/lifecycle/start-or-signal.d.ts +45 -0
  66. package/dist/core/engine/lifecycle/start-or-signal.js +141 -0
  67. package/dist/core/engine/lifecycle/start.d.ts +3 -3
  68. package/dist/core/engine/lifecycle/start.js +42 -37
  69. package/dist/core/engine/lifecycle.d.ts +3 -2
  70. package/dist/core/engine/lifecycle.js +9 -2
  71. package/dist/core/engine/listing.js +1 -1
  72. package/dist/core/engine/operations-data.d.ts +16 -0
  73. package/dist/core/engine/operations-data.js +6 -0
  74. package/dist/core/engine/operations-time.d.ts +3 -2
  75. package/dist/core/engine/operations-time.js +6 -1
  76. package/dist/core/engine/persisted-data-version.d.ts +5 -9
  77. package/dist/core/engine/persisted-data-version.js +4 -5
  78. package/dist/core/engine/schedule-handle.d.ts +45 -0
  79. package/dist/core/engine/schedule-handle.js +26 -0
  80. package/dist/core/engine/schedules.d.ts +1 -1
  81. package/dist/core/engine/schedules.js +7 -3
  82. package/dist/core/engine/second-instance-detector.d.ts +96 -0
  83. package/dist/core/engine/second-instance-detector.js +108 -0
  84. package/dist/core/engine/signals.d.ts +22 -0
  85. package/dist/core/engine/signals.js +15 -0
  86. package/dist/core/engine/termination/cleanup.d.ts +25 -0
  87. package/dist/core/engine/termination/cleanup.js +21 -1
  88. package/dist/core/engine/termination/complete.js +4 -3
  89. package/dist/core/engine/termination/suspend.d.ts +68 -0
  90. package/dist/core/engine/termination/suspend.js +41 -0
  91. package/dist/core/engine/termination.d.ts +4 -2
  92. package/dist/core/engine/termination.js +2 -0
  93. package/dist/core/engine/validation.js +25 -1
  94. package/dist/core/engine/workflow-feed.d.ts +5 -3
  95. package/dist/core/events/event-map.d.ts +2 -1
  96. package/dist/core/events/workflow-events.d.ts +23 -0
  97. package/dist/core/events/workflow-events.js +9 -0
  98. package/dist/core/inline-execution-strategy.d.ts +5 -0
  99. package/dist/core/inline-execution-strategy.js +2 -1
  100. package/dist/core/list-filter-validation.js +2 -1
  101. package/dist/core/start-workflow-validation.d.ts +22 -0
  102. package/dist/core/start-workflow-validation.js +11 -1
  103. package/dist/core/step-context.d.ts +10 -6
  104. package/dist/core/step-context.js +7 -15
  105. package/dist/core/types/activity.d.ts +6 -3
  106. package/dist/core/types/identity.d.ts +8 -1
  107. package/dist/core/types/launch-metadata.d.ts +33 -0
  108. package/dist/core/types/launch-metadata.js +0 -0
  109. package/dist/core/types/message-handles.d.ts +25 -0
  110. package/dist/core/types/options.d.ts +90 -7
  111. package/dist/core/types/reviews.d.ts +2 -1
  112. package/dist/core/types/services-resolution.d.ts +47 -0
  113. package/dist/core/types/services-resolution.js +0 -0
  114. package/dist/core/types/state.d.ts +11 -11
  115. package/dist/core/types/workflow-builder.d.ts +5 -4
  116. package/dist/core/types/workflow-context.d.ts +25 -0
  117. package/dist/core/types/workflow-function.d.ts +17 -0
  118. package/dist/core/types/workflow-snapshot.d.ts +29 -0
  119. package/dist/core/types/workflow-snapshot.js +0 -0
  120. package/dist/core/types.d.ts +3 -0
  121. package/dist/core/types.js +3 -0
  122. package/dist/core/weft-error.d.ts +46 -14
  123. package/dist/core/weft-error.js +12 -1
  124. package/dist/diagnostics/doctor.js +6 -3
  125. package/dist/diagnostics/format.js +2 -2
  126. package/dist/diagnostics/types.d.ts +1 -0
  127. package/dist/diagnostics/version-check.js +6 -4
  128. package/dist/index.d.ts +10 -5
  129. package/dist/index.js +11 -2
  130. package/dist/json-schema.js +3 -3
  131. package/dist/mcp/cli.js +35 -35
  132. package/dist/mcp/list-filter.js +2 -1
  133. package/dist/mcp/session.js +1 -0
  134. package/dist/observability/index.js +2 -2
  135. package/dist/server/handler.js +30 -30
  136. package/dist/server/index.js +33 -33
  137. package/dist/server/interactive-operations.js +1 -0
  138. package/dist/server/operations/resume-workflow.js +2 -2
  139. package/dist/server/operations/start-or-signal-workflow.d.ts +39 -0
  140. package/dist/server/operations/start-or-signal-workflow.js +140 -0
  141. package/dist/server/operations/start-workflow-options.d.ts +32 -0
  142. package/dist/server/operations/start-workflow-options.js +63 -0
  143. package/dist/server/operations/start-workflow.js +7 -69
  144. package/dist/server/operations/suspend-workflow.d.ts +13 -0
  145. package/dist/server/operations/suspend-workflow.js +36 -0
  146. package/dist/server/rest-binding.d.ts +18 -7
  147. package/dist/server/rest-bindings.js +12 -0
  148. package/dist/server/runtime/task-dispatch.js +5 -3
  149. package/dist/server/runtime/task-polling.d.ts +16 -2
  150. package/dist/server/runtime/task-polling.js +20 -5
  151. package/dist/server/runtime/websocket-worker.js +8 -0
  152. package/dist/server/serve-internals.d.ts +8 -0
  153. package/dist/server/serve-internals.js +4 -2
  154. package/dist/server/task-state.d.ts +8 -0
  155. package/dist/service-worker/index.js +28 -28
  156. package/dist/storage/capabilities.d.ts +10 -2
  157. package/dist/storage/capabilities.js +2 -2
  158. package/dist/storage/http.js +2 -2
  159. package/dist/storage/index.d.ts +7 -1
  160. package/dist/storage/indexeddb.js +1 -1
  161. package/dist/storage/interface.d.ts +40 -0
  162. package/dist/storage/interface.js +1 -1
  163. package/dist/storage/key-prefixes.d.ts +1 -1
  164. package/dist/storage/key-prefixes.js +3 -0
  165. package/dist/storage/lmdb.js +1 -1
  166. package/dist/storage/memory.js +1 -1
  167. package/dist/storage/neon-value-mapping.d.ts +47 -0
  168. package/dist/storage/neon-value-mapping.js +11 -0
  169. package/dist/storage/neon.d.ts +108 -0
  170. package/dist/storage/neon.js +10 -0
  171. package/dist/storage/node-sqlite-loader.d.ts +71 -0
  172. package/dist/storage/node-sqlite-loader.js +41 -0
  173. package/dist/storage/node-sqlite.d.ts +1 -19
  174. package/dist/storage/node-sqlite.js +38 -32
  175. package/dist/storage/postgres-key-value-queries.d.ts +79 -0
  176. package/dist/storage/postgres-key-value-queries.js +63 -0
  177. package/dist/storage/resolve.d.ts +2 -165
  178. package/dist/storage/resolve.js +1 -1
  179. package/dist/storage/scoped-storage.js +1 -1
  180. package/dist/storage/storage-configuration.d.ts +209 -0
  181. package/dist/storage/storage-configuration.js +0 -0
  182. package/dist/storage/text-value-store.d.ts +13 -10
  183. package/dist/storage/turso.js +2 -2
  184. package/dist/storage/typed-storage.js +1 -1
  185. package/dist/storage/web-extension.js +1 -1
  186. package/dist/testing/event-loop.d.ts +36 -2
  187. package/dist/testing/index.d.ts +31 -1
  188. package/dist/testing/index.js +33 -33
  189. package/dist/version.d.ts +1 -1
  190. package/dist/version.js +1 -1
  191. package/dist/worker/index.js +9 -5
  192. package/dist/worker/long-poll.js +4 -0
  193. package/dist/worker/protocol-messages.d.ts +20 -0
  194. package/dist/worker/protocol-schemas.d.ts +32 -0
  195. package/dist/worker/protocol-schemas.js +8 -4
  196. package/dist/worker/protocol-task-result.d.ts +28 -0
  197. package/dist/worker/protocol-task-result.js +76 -0
  198. package/dist/worker/protocol.d.ts +4 -15
  199. package/dist/worker/protocol.js +1 -1
  200. package/dist/worker/registry/fair-share.d.ts +29 -0
  201. package/dist/worker/registry/fair-share.js +30 -0
  202. package/dist/worker/registry/routing.d.ts +18 -0
  203. package/dist/worker/registry/routing.js +14 -0
  204. package/dist/worker/registry/types.d.ts +7 -0
  205. package/dist/worker/registry.d.ts +16 -1
  206. package/dist/worker/registry.js +24 -36
  207. package/package.json +17 -4
@@ -47,10 +47,11 @@ export type WorkflowGenerator<TInput, TOutput, TActivities extends ActivityMap,
47
47
  * `TSearchAttributes`), and the builder threads its normalised maps through
48
48
  * this alias so `.execute(fn)` sees the right `ctx` shape inside `fn`.
49
49
  *
50
- * Legacy bare-`WorkflowContext` callers continue to typecheck because the
51
- * interface's generics all default to empty/permissive shapes, so the typed
52
- * overloads de-prioritise to `never` and existing string-name/callable
53
- * overloads still match.
50
+ * Bare-`WorkflowContext` callers (no declared activity/signal/etc. maps)
51
+ * typecheck because the interface's generics all default to permissive shapes:
52
+ * the typed overloads de-prioritise to `never` and the dynamic string-name /
53
+ * callable overloads match instead. This permissive path is current API — it is
54
+ * how untyped, ad-hoc-name authoring is supported, not a compatibility shim.
54
55
  */
55
56
  export type WorkflowContextOf<TActivities extends ActivityMap = ActivityMap, TSignals extends SignalMap = SignalMap, TUpdates extends UpdateMap = UpdateMap, TQueries extends QueryMap = QueryMap, TSearchAttributes extends SearchAttributeSchema = SearchAttributeSchema> = WorkflowContext<TActivities, TSignals, TUpdates, TQueries, TSearchAttributes>;
56
57
  /**
@@ -57,6 +57,31 @@ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals
57
57
  readonly executionTimeRemaining: number;
58
58
  readonly startedAt: number;
59
59
  readonly state: WorkflowStateNamespace;
60
+ /**
61
+ * Host-supplied, per-run capabilities passed at launch via
62
+ * `engine.start(type, input, { services })` (or `ctx.run`-free closures, live
63
+ * clients, tool registries). The value is **never checkpointed**: it is held
64
+ * only in engine memory for this run, and on a fresh-process recovery it is
65
+ * re-provided by the engine's `resolveWorkflowServices` resolver before the
66
+ * generator advances. `undefined` when no services were supplied (and not yet
67
+ * re-provided on recovery). Inline execution mode only — passing `services`
68
+ * under `workflowExecutionMode: 'worker'` throws at `engine.start()`, since a
69
+ * non-serializable value cannot cross to a Worker.
70
+ *
71
+ * Typed `unknown`: narrow or cast at the call site
72
+ * (`const { db } = ctx.services as MyServices`). A threaded generic is a
73
+ * deliberate follow-on, not part of this surface yet. Optional so existing
74
+ * structural `WorkflowContext` implementors are not source-broken.
75
+ *
76
+ * Separate child *workflows* started from within a workflow (`ctx.startChild()`)
77
+ * do **not** inherit the parent's `services` — each run is its own workflow with
78
+ * its own services, configured the same way (and re-provided on recovery by the
79
+ * engine's `resolveWorkflowServices`). This is distinct from a *speculative
80
+ * child context*, which is the same run advanced in-memory for speculative
81
+ * replay (same `workflowId`) and therefore does carry the run's `services`
82
+ * across.
83
+ */
84
+ readonly services?: unknown;
60
85
  run<TName extends keyof TActivities & string>(name: TName, ...rest: ActivityArgsFor<TActivities[TName]>): WorkflowOperation<ActivityResultFor<TActivities[TName]>>;
61
86
  run<TName extends keyof TActivities & string>(name: TName, ...rest: [...ActivityArgsFor<TActivities[TName]>, ActivityCallOptions]): WorkflowOperation<ActivityResultFor<TActivities[TName]>>;
62
87
  run<TName extends string>(name: UnknownNameWhenRegistryHasNoKnownNames<TName, keyof TActivities & string>, input?: unknown, options?: ActivityCallOptions): WorkflowOperation<unknown>;
@@ -54,6 +54,23 @@ export type WorkflowFunction<TInput = unknown, TOutput = unknown> = (context: Wo
54
54
  export interface StepWorkflowContext {
55
55
  readonly workflowId: string;
56
56
  readonly signal: AbortSignal;
57
+ /**
58
+ * Run `fn` as a durable step. Each call routes through the same machinery as
59
+ * `ctx.run(...)`: the engine assigns a positional replay slot, persists the
60
+ * result to the checkpoint, and on crash recovery returns the stored result
61
+ * without re-running `fn`. `name` is the durable activity label (timeline and
62
+ * diagnostics only) — replay is keyed by position, not by name.
63
+ *
64
+ * Because durability is positional, you must `await` each step before
65
+ * starting the next: steps must be queued in a deterministic order so the
66
+ * original run and a recovered run agree on which slot is which. Firing steps
67
+ * concurrently (so a continuation enqueues further steps in completion order)
68
+ * can return a wrong cached value after a crash. For parallelism, durable
69
+ * timers, or signals, use the generator API instead.
70
+ *
71
+ * Requires `workflowExecutionMode: 'inline'` (the default); the worker
72
+ * execution strategy has no step machinery and throws an actionable error.
73
+ */
57
74
  step<T>(name: string, fn: () => Promise<T> | T): Promise<T>;
58
75
  }
59
76
  /**
@@ -0,0 +1,29 @@
1
+ import type { WorkflowStatus } from './identity.ts';
2
+ /**
3
+ * A point-in-time view of a workflow's progress, returned by
4
+ * {@link WorkflowHandle.snapshot}. Combines the persisted status with the
5
+ * current checkpoint step (the run's cursor), so a caller — typically after
6
+ * `engine.recoverAll()` — can rebuild its own progress adapter for a recovered
7
+ * run and re-register it on a live surface, without awaiting the run's final
8
+ * result.
9
+ *
10
+ * `step` is the run's current checkpoint step: the number of generator turns it
11
+ * has advanced. For a run live in this engine it reflects the latest in-memory
12
+ * checkpoint (which may be one step ahead of the last durable commit); for a
13
+ * run inspected or recovered in a fresh process it reflects the durably
14
+ * persisted checkpoint. It is `0` for a run that has its initial checkpoint but
15
+ * has not yet advanced, and increases as the run makes progress.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { type WorkflowSnapshot } from '@lostgradient/weft';
20
+ *
21
+ * function describe(snapshot: WorkflowSnapshot): string {
22
+ * return `${snapshot.status} @ step ${snapshot.step}`;
23
+ * }
24
+ * ```
25
+ */
26
+ export interface WorkflowSnapshot {
27
+ status: WorkflowStatus;
28
+ step: number;
29
+ }
File without changes
@@ -7,6 +7,7 @@ export * from './types/definition-schema-to-json.ts';
7
7
  export * from './types/definition-schema.ts';
8
8
  export * from './types/history-policy.ts';
9
9
  export * from './types/identity.ts';
10
+ export * from './types/launch-metadata.ts';
10
11
  export * from './types/message-handles.ts';
11
12
  export * from './types/options.ts';
12
13
  export * from './types/payload-size-policy.ts';
@@ -15,6 +16,7 @@ export * from './types/reviews.ts';
15
16
  export * from './types/schedules.ts';
16
17
  export * from './types/search-attributes.ts';
17
18
  export * from './types/serializer.ts';
19
+ export * from './types/services-resolution.ts';
18
20
  export * from './types/standard-schema-validate.ts';
19
21
  export * from './types/state.ts';
20
22
  export * from './types/workflow-builder-helpers.ts';
@@ -24,3 +26,4 @@ export * from './types/workflow-context.ts';
24
26
  export * from './types/workflow-function.ts';
25
27
  export * from './types/workflow-registries.ts';
26
28
  export * from './types/workflow-registry.ts';
29
+ export * from './types/workflow-snapshot.ts';
@@ -7,6 +7,7 @@ export * from "./types/definition-schema-to-json.js";
7
7
  export * from "./types/definition-schema.js";
8
8
  export * from "./types/history-policy.js";
9
9
  export * from "./types/identity.js";
10
+ export * from "./types/launch-metadata.js";
10
11
  export * from "./types/message-handles.js";
11
12
  export * from "./types/options.js";
12
13
  export * from "./types/payload-size-policy.js";
@@ -15,6 +16,7 @@ export * from "./types/reviews.js";
15
16
  export * from "./types/schedules.js";
16
17
  export * from "./types/search-attributes.js";
17
18
  export * from "./types/serializer.js";
19
+ export * from "./types/services-resolution.js";
18
20
  export * from "./types/standard-schema-validate.js";
19
21
  export * from "./types/state.js";
20
22
  export * from "./types/workflow-builder-helpers.js";
@@ -24,3 +26,4 @@ export * from "./types/workflow-context.js";
24
26
  export * from "./types/workflow-function.js";
25
27
  export * from "./types/workflow-registries.js";
26
28
  export * from "./types/workflow-registry.js";
29
+ export * from "./types/workflow-snapshot.js";
@@ -5,16 +5,16 @@
5
5
  * exported from `@lostgradient/weft` carry internal codes that are intentionally absent
6
6
  * from this union and may change between releases.
7
7
  *
8
- * Prefer comparing `error.code` (or {@link isWeftErrorCode}) over `instanceof`
8
+ * Prefer comparing `error.code` (or {@link isWeftErrorLike}) over `instanceof`
9
9
  * when an error may have crossed a realm or duplicate-module boundary, where
10
10
  * `instanceof` is unreliable.
11
11
  *
12
12
  * @example
13
13
  * ```ts
14
- * import { isWeftError, isWeftErrorCode, type WeftErrorCode } from '@lostgradient/weft';
14
+ * import { isWeftErrorLike, type WeftErrorCode } from '@lostgradient/weft';
15
15
  *
16
16
  * function statusFor(error: unknown): number {
17
- * if (isWeftError(error) && isWeftErrorCode(error.code)) {
17
+ * if (isWeftErrorLike(error)) {
18
18
  * const code: WeftErrorCode = error.code;
19
19
  * return code === 'WorkflowNotFoundError' ? 404 : 400;
20
20
  * }
@@ -22,7 +22,7 @@
22
22
  * }
23
23
  * ```
24
24
  */
25
- export type WeftErrorCode = 'WorkflowAlreadyExistsError' | 'BulkDeleteRequiresTerminalWorkflowsError' | 'BulkOperationConfirmationError' | 'WorkflowTypeNotRegisteredForRecoveryError' | 'EngineCreateNameMismatchError' | 'EngineDisposedError' | 'WorkflowNotFoundError' | 'WorkflowNotRegisteredError' | 'ActivityResolutionError' | 'PersistedDataIncompatibleError' | 'WorkflowTimeoutError' | 'HttpClientError' | 'WorkerProtocolIncompatibleError' | 'UpdateTimeoutError' | 'UpdateValidationError' | 'WorkflowTerminalError' | 'WorkflowBuilderError' | 'VersionMismatchError' | 'EffectReplayConflictError' | 'ReviewTimeoutError' | 'AtomicStateConflictError' | 'StandardSchemaValidationError' | 'ActivityReconciliationCapabilityError' | 'ActivityReconciliationConflictError' | 'ActivityReconciliationIndeterminateError' | 'AsyncActivityTokenNotFoundError' | 'PayloadSizeExceededError';
25
+ export type WeftErrorCode = 'WorkflowAlreadyExistsError' | 'BulkDeleteRequiresTerminalWorkflowsError' | 'BulkOperationConfirmationError' | 'WorkflowTypeNotRegisteredForRecoveryError' | 'EngineCreateNameMismatchError' | 'EngineDisposedError' | 'WorkflowNotFoundError' | 'WorkflowNotRegisteredError' | 'ActivityResolutionError' | 'PersistedDataIncompatibleError' | 'WorkflowTimeoutError' | 'HttpClientError' | 'WorkerProtocolIncompatibleError' | 'UpdateTimeoutError' | 'UpdateValidationError' | 'WorkflowTerminalError' | 'WorkflowBuilderError' | 'VersionMismatchError' | 'EffectReplayConflictError' | 'ReviewTimeoutError' | 'AtomicStateConflictError' | 'StandardSchemaValidationError' | 'ActivityReconciliationCapabilityError' | 'ActivityReconciliationConflictError' | 'ActivityReconciliationIndeterminateError' | 'AsyncActivityTokenNotFoundError' | 'PayloadSizeExceededError' | 'StartOrSignalConflictError' | 'IdempotencyKeyPurgedError';
26
26
  /**
27
27
  * Generic abstract base for all Weft library errors. The `TCode` parameter
28
28
  * makes each subclass's `code` its own literal type; the exported base surface
@@ -50,8 +50,10 @@ export declare abstract class WeftError<TCode extends string = string> extends E
50
50
  /**
51
51
  * Same-realm narrowing: `true` when `value` is a Weft library error instance.
52
52
  * Use this for the common case of catching any Weft error. For comparisons
53
- * that may cross a realm or duplicate-module boundary, narrow on
54
- * {@link isWeftErrorCode} against `error.code` instead.
53
+ * that may cross a realm or duplicate-module boundary (where `instanceof` is
54
+ * unreliable), use {@link isWeftErrorLike} instead — it narrows the error
55
+ * object structurally. {@link isWeftErrorCode} narrows a bare `code` *string*,
56
+ * not a caught `unknown`.
55
57
  *
56
58
  * @example
57
59
  * ```ts
@@ -64,19 +66,49 @@ export declare abstract class WeftError<TCode extends string = string> extends E
64
66
  */
65
67
  export declare function isWeftError(value: unknown): value is WeftError;
66
68
  /**
67
- * Cross-boundary structural check: `true` when `value` is one of the public
68
- * {@link WeftErrorCode} values. Pair with {@link isWeftError} to safely switch
69
- * over public codes: `if (isWeftError(e) && isWeftErrorCode(e.code)) { ... }`.
69
+ * Cross-boundary discriminant check: `true` when `value` is one of the public
70
+ * {@link WeftErrorCode} string values. This narrows a `code` *string*; to test
71
+ * a caught `unknown` (the common `catch` case), reach for {@link isWeftErrorLike},
72
+ * which checks the whole error object structurally.
70
73
  *
71
74
  * @example
72
75
  * ```ts
73
- * import { isWeftError, isWeftErrorCode } from '@lostgradient/weft';
76
+ * import { isWeftErrorCode } from '@lostgradient/weft';
74
77
  *
75
- * function isMissingWorkflow(error: unknown): boolean {
76
- * return isWeftError(error) && isWeftErrorCode(error.code)
77
- * ? error.code === 'WorkflowNotFoundError'
78
- * : false;
78
+ * function isPublicCode(code: string): boolean {
79
+ * return isWeftErrorCode(code);
79
80
  * }
80
81
  * ```
81
82
  */
82
83
  export declare function isWeftErrorCode(value: unknown): value is WeftErrorCode;
84
+ /**
85
+ * Cross-boundary structural narrowing: `true` when `value` looks like a public
86
+ * Weft error — an object carrying a public {@link WeftErrorCode} `code` and a
87
+ * string `message`. Unlike {@link isWeftError}, this does *not* use `instanceof`,
88
+ * so it stays reliable when the error crossed a realm or duplicate-module
89
+ * boundary — the common case when Weft is a transitive dependency in a monorepo,
90
+ * where two copies of the `WeftError` class make `instanceof` fail.
91
+ *
92
+ * Use this in a `catch` to branch on a caught `unknown` without first proving
93
+ * `instanceof`. It is the structural counterpart to {@link isWeftError}: prefer
94
+ * `isWeftError` for same-realm catches where you want the live class instance,
95
+ * and `isWeftErrorLike` whenever the error may have crossed a module boundary.
96
+ * To match a *specific* code, narrow with this guard then compare `error.code`
97
+ * — TypeScript narrows it to the matched literal in the branch.
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * import { isWeftErrorLike } from '@lostgradient/weft';
102
+ *
103
+ * function statusFor(error: unknown): number {
104
+ * if (isWeftErrorLike(error)) {
105
+ * return error.code === 'WorkflowNotFoundError' ? 404 : 400;
106
+ * }
107
+ * return 500;
108
+ * }
109
+ * ```
110
+ */
111
+ export declare function isWeftErrorLike(value: unknown): value is {
112
+ code: WeftErrorCode;
113
+ message: string;
114
+ };
@@ -33,7 +33,9 @@ const publicWeftErrorCodeMap = {
33
33
  ActivityReconciliationConflictError: !0,
34
34
  ActivityReconciliationIndeterminateError: !0,
35
35
  AsyncActivityTokenNotFoundError: !0,
36
- PayloadSizeExceededError: !0
36
+ PayloadSizeExceededError: !0,
37
+ StartOrSignalConflictError: !0,
38
+ IdempotencyKeyPurgedError: !0
37
39
  }, PUBLIC_WEFT_ERROR_CODES = new Set(Object.keys(publicWeftErrorCodeMap));
38
40
  export function isWeftError(value) {
39
41
  return value instanceof WeftError;
@@ -41,3 +43,12 @@ export function isWeftError(value) {
41
43
  export function isWeftErrorCode(value) {
42
44
  return typeof value === "string" && PUBLIC_WEFT_ERROR_CODES.has(value);
43
45
  }
46
+ export function isWeftErrorLike(value) {
47
+ if (typeof value !== "object" || value === null)
48
+ return !1;
49
+ try {
50
+ return "code" in value && isWeftErrorCode(value.code) && "message" in value && typeof value.message === "string";
51
+ } catch {
52
+ return !1;
53
+ }
54
+ }
@@ -1,4 +1,6 @@
1
1
  import { decode } from "../core/codec.js";
2
+ import { decodeWorkflowState } from "../core/engine/validation.js";
3
+ import { isTopLevelWorkflowStateKey } from "../core/engine/workflow-state-stream.js";
2
4
  import { fileSize } from "../runtime/portable.js";
3
5
  import { KEYS } from "../storage/interface.js";
4
6
  import { generateRecommendations } from "./recommendations.js";
@@ -89,13 +91,14 @@ async function aggregateWorkflowScan(storage, now) {
89
91
  completed: 0,
90
92
  failed: 0,
91
93
  cancelled: 0,
92
- timedOut: 0
94
+ timedOut: 0,
95
+ suspended: 0
93
96
  };
94
97
  let total = 0, longestRunning = null, earliestCreatedAt = 1 / 0;
95
98
  for await (const [key, value] of storage.scan("wf:")) {
96
- if (key.includes(":ckpt"))
99
+ if (!isTopLevelWorkflowStateKey(key))
97
100
  continue;
98
- const state = decode(value);
101
+ const state = decodeWorkflowState(value);
99
102
  total++;
100
103
  statusCounts[mapStatusKey(state.status)]++;
101
104
  if (state.status === "running" && state.createdAt < earliestCreatedAt) {
@@ -47,8 +47,8 @@ function appendWorkflowsSection(lines, workflows) {
47
47
  lines.push(" Total: 0 (no workflows)");
48
48
  return;
49
49
  }
50
- const counts = workflows.statusCounts;
51
- lines.push(` Total: ${workflows.total} (${counts.running} running, ${counts.completed} completed, ${counts.failed} failed)`);
50
+ const counts = workflows.statusCounts, suspendedSummary = counts.suspended > 0 ? `, ${counts.suspended} suspended` : "";
51
+ lines.push(` Total: ${workflows.total} (${counts.running} running, ${counts.completed} completed, ${counts.failed} failed${suspendedSummary})`);
52
52
  if (workflows.longestRunning) {
53
53
  const longest = workflows.longestRunning;
54
54
  lines.push(` Longest running: ${longest.id} (started ${formatDuration(longest.elapsedMilliseconds)} ago, step ${longest.currentStep})`);
@@ -48,6 +48,7 @@ export interface WorkflowStatusCounts {
48
48
  failed: number;
49
49
  cancelled: number;
50
50
  timedOut: number;
51
+ suspended: number;
51
52
  }
52
53
  /**
53
54
  * Identity and elapsed wall-clock time of the longest-running workflow in
@@ -1,20 +1,22 @@
1
- import { decode } from "../core/codec.js";
1
+ import { decodeWorkflowState } from "../core/engine/validation.js";
2
+ import { isTopLevelWorkflowStateKey } from "../core/engine/workflow-state-stream.js";
2
3
  import { DEFAULT_WORKFLOW_VERSION, checkVersionCompatibility } from "../core/versioning.js";
3
4
  async function groupActiveWorkflowsByType(storage) {
4
5
  const groups = new Map;
5
6
  for await (const [key, bytes] of storage.scan("wf:")) {
6
- if (key.includes(":ckpt"))
7
+ if (!isTopLevelWorkflowStateKey(key))
7
8
  continue;
8
- const state = decode(bytes);
9
+ const state = decodeWorkflowState(bytes);
9
10
  if (state.status !== "running" && state.status !== "pending")
10
11
  continue;
12
+ const storedVersion = state.versionTuple.workflowVersion;
11
13
  let group = groups.get(state.type);
12
14
  if (!group) {
13
15
  group = { count: 0, versionCounts: new Map };
14
16
  groups.set(state.type, group);
15
17
  }
16
18
  group.count++;
17
- group.versionCounts.set(state.version, (group.versionCounts.get(state.version) ?? 0) + 1);
19
+ group.versionCounts.set(storedVersion, (group.versionCounts.get(storedVersion) ?? 0) + 1);
18
20
  }
19
21
  return groups;
20
22
  }
package/dist/index.d.ts CHANGED
@@ -8,20 +8,25 @@
8
8
  *
9
9
  * For end-to-end usage examples see the {@link Engine} class.
10
10
  *
11
+ * This is the package's public re-export barrel: it contains only `export`
12
+ * statements, no logic, and grows one line per public symbol. Line count here
13
+ * is semantically meaningless, so it carries a `max-lines: off` override in
14
+ * `.oxlintrc.json` (unlike logic-bearing files, which keep the numeric ceiling).
15
+ *
11
16
  * @module weft
12
17
  */
13
18
  export { VERSION } from './version.ts';
14
- export { WeftError, isWeftError, isWeftErrorCode } from './core/weft-error.ts';
19
+ export { WeftError, isWeftError, isWeftErrorCode, isWeftErrorLike } from './core/weft-error.ts';
15
20
  export type { WeftErrorCode } from './core/weft-error.ts';
16
21
  export { FAULT_CODE_TO_FAILURE_CATEGORY, failureCategoryForFaultCode, isFaultCode, } from './core/fault-code.ts';
17
22
  export type { FaultCode } from './core/fault-code.ts';
18
- export { ActivityReconciliationCapabilityError, ActivityReconciliationConflictError, ActivityReconciliationIndeterminateError, ActivityResolutionError, AsyncActivityTokenNotFoundError, BulkDeleteRequiresTerminalWorkflowsError, BulkOperationConfirmationError, Engine, EngineCreateNameMismatchError, EngineDisposedError, PersistedDataIncompatibleError, ScheduleHandle, WorkflowAlreadyExistsError, WorkflowHandle, WorkflowNotFoundError, WorkflowNotRegisteredError, WorkflowTypeNotRegisteredForRecoveryError, } from './core/engine';
23
+ export { ActivityReconciliationCapabilityError, ActivityReconciliationConflictError, ActivityReconciliationIndeterminateError, ActivityResolutionError, AsyncActivityTokenNotFoundError, BulkDeleteRequiresTerminalWorkflowsError, BulkOperationConfirmationError, Engine, EngineCreateNameMismatchError, EngineDisposedError, IdempotencyKeyPurgedError, PersistedDataIncompatibleError, ScheduleHandle, StartOrSignalConflictError, WorkflowAlreadyExistsError, WorkflowHandle, WorkflowNotFoundError, WorkflowNotRegisteredError, WorkflowSuspendNotSupportedError, WorkflowTypeNotRegisteredForRecoveryError, } from './core/engine';
19
24
  export type { EngineCreateOptions, EngineStateNamespace, RecoverAllOptions } from './core/engine';
20
25
  export { DEFAULT_CHECKPOINT_SIZE_WARNING_THRESHOLD, DEFAULT_MAX_NESTING_DEPTH, DEFAULT_RETRY_POLICY, DEFAULT_VISIBILITY_TIMEOUT_MS, HISTORY_CIRCUIT_BREAKER_REASON, WorkflowBuilderError, query, schedule, signal, update, workflow, } from './core/types';
21
- export type { ActivityArgsFor, ActivityCallOptions, ActivityCallable, ActivityContext, ActivityDefinition, ActivityEntryInput, ActivityFunction, ActivityMap, ActivityMapInput, ActivityObjectInput, ActivityResultFor, ActivityVerificationContext, ActivityVerificationPhase, ActivityVerificationResult, AnyActivityDefinition, AnyWorkflowDefinition, ArchiveAdapter, BuilderState, BuiltWorkflowDefinition, BulkCancelResult, BulkDeleteResult, BulkOperationAction, BulkOperationAuditEvent, BulkOperationCommitOptions, BulkOperationDryRunOptions, BulkOperationDryRunResult, BulkOperationError, BulkOperationFilterSummary, BulkOperationOptions, BulkOperationPrincipal, BulkOperationScopeSummary, BulkSignalAllCommitOptions, BulkSignalAllDryRunOptions, BulkSignalAllOptions, BulkSignalResult, BulkTagResult, Checkpoint, CheckpointState, CheckpointSummary, CompletedReviewEntry, CoordinatedUpdateResult, DefinitionSchema, Duration, EngineOptions, FailureCategory, ForkLineage, ForkOptions, HistoryPolicy, InferActivityEntries, InferActivityEntry, InferWorkflowEntries, InferWorkflowEntry, InitialBuilderState, ListFilter, ListOptions, MarkBuilderState, NormalizeActivities, NormalizedActivityEntry, NormalizedRetentionPolicy, PaginatedResult, PayloadSizePolicy, PendingReviewEntry, PurgeResult, QueryDefinition, QueryMap, QueryShape, RegisteredWorkflowDefinition, RetentionOverview, RetentionPolicy, RetryPolicy, ReviewListEntry, ReviewListFilter, ReviewStatus, ScheduleDefinition, ScheduleFilter, ScheduleOptions, ScheduleOverlapPolicy, ScheduleSpec, ScheduleState, ScheduleStatus, ScheduleSummary, SearchAttributeDefinition, SearchAttributeHandle, SearchAttributeSchema, SearchAttributeValue, Serializer, SignalDefinition, SignalDeliveryOptions, SignalMap, SignalPayload, StartOptions, SubmitReviewOptions, TerminationReason, UpdateDefinition, UpdateMap, UpdatePayload, WorkerReplayOperationFailure, WorkerReplayOperationSignature, WorkflowAlreadyRegistered, WorkflowAtomicState, WorkflowAtomicStateOptions, WorkflowBuilder, WorkflowBuilderOptions, WorkflowContext, WorkflowDefinition, WorkflowEvent, WorkflowFunction, WorkflowGenerator, WorkflowId, WorkflowRegistry, WorkflowReplay, WorkflowSessionState, WorkflowState, WorkflowStateNamespace, WorkflowStatus, WorkflowSummary, WorkflowTimelineEntry, WorkflowTimelineStatus, WorkflowTypeRetentionPolicy, } from './core/types';
26
+ export type { ActivityArgsFor, ActivityCallOptions, ActivityCallable, ActivityContext, ActivityDefinition, ActivityEntryInput, ActivityFunction, ActivityMap, ActivityMapInput, ActivityObjectInput, ActivityResultFor, ActivityVerificationContext, ActivityVerificationPhase, ActivityVerificationResult, AnyActivityDefinition, AnyWorkflowDefinition, ArchiveAdapter, BuilderState, BuiltWorkflowDefinition, BulkCancelResult, BulkDeleteResult, BulkOperationAction, BulkOperationAuditEvent, BulkOperationCommitOptions, BulkOperationDryRunOptions, BulkOperationDryRunResult, BulkOperationError, BulkOperationFilterSummary, BulkOperationOptions, BulkOperationPrincipal, BulkOperationScopeSummary, BulkSignalAllCommitOptions, BulkSignalAllDryRunOptions, BulkSignalAllOptions, BulkSignalResult, BulkTagResult, Checkpoint, CheckpointState, CheckpointSummary, CompletedReviewEntry, CoordinatedUpdateResult, DefinitionSchema, Duration, EngineOptions, FailureCategory, ForkLineage, ForkOptions, HistoryPolicy, InferActivityEntries, InferActivityEntry, InferWorkflowEntries, InferWorkflowEntry, InitialBuilderState, LaunchMetadata, ListFilter, ListOptions, MarkBuilderState, NormalizeActivities, NormalizedActivityEntry, NormalizedRetentionPolicy, PaginatedResult, PayloadSizePolicy, PendingReviewEntry, PurgeResult, QueryDefinition, QueryMap, QueryShape, RegisteredWorkflowDefinition, RetentionOverview, RetentionPolicy, RetryPolicy, ReviewListEntry, ReviewListFilter, ReviewStatus, ScheduleDefinition, ScheduleFilter, ScheduleOptions, ScheduleOverlapPolicy, ScheduleSpec, ScheduleState, ScheduleStatus, ScheduleSummary, SearchAttributeDefinition, SearchAttributeHandle, SearchAttributeSchema, SearchAttributeValue, Serializer, SignalDefinition, SignalDeliveryOptions, SignalMap, SignalPayload, StartOptions, StartOrSignalSignal, SubmitReviewOptions, TerminationReason, UpdateDefinition, UpdateMap, UpdatePayload, WorkerReplayOperationFailure, WorkerReplayOperationSignature, WorkflowAlreadyRegistered, WorkflowAtomicState, WorkflowAtomicStateOptions, WorkflowBuilder, WorkflowBuilderOptions, WorkflowContext, WorkflowDefinition, WorkflowEvent, WorkflowFunction, WorkflowGenerator, WorkflowId, WorkflowRegistry, WorkflowReplay, WorkflowServicesResolution, WorkflowServicesResolverInfo, WorkflowSessionState, WorkflowSnapshot, WorkflowState, WorkflowStateNamespace, WorkflowStatus, WorkflowSummary, WorkflowTimelineEntry, WorkflowTimelineStatus, WorkflowTypeRetentionPolicy, } from './core/types';
22
27
  export { AlertManager } from './alerting/index';
23
28
  export type { AlertAction, AlertMetric, AlertRule, AlertState, AlertStatus, AlertingOptions, WebhookTarget, } from './alerting/types';
24
- export { ActivityAsyncPendingEvent, ActivityCompletedEvent, ActivityFailedEvent, ActivityStartedEvent, AlertFiredEvent, AlertResolvedEvent, AttributesChangedEvent, CheckpointSizeWarningEvent, ConstraintViolatedEvent, DevelopmentWarningEvent, SignalDeliveredEvent, SignalReceivedEvent, StorageSizeReportedEvent, UpdateCompletedEvent, UpdateReceivedEvent, WorkflowCancelledEvent, WorkflowCompletedEvent, WorkflowFailedEvent, WorkflowRecoverySkippedEvent, WorkflowResumedEvent, WorkflowStartedEvent, WorkflowTimedOutEvent, } from './core/events';
29
+ export { ActivityAsyncPendingEvent, ActivityCompletedEvent, ActivityFailedEvent, ActivityStartedEvent, AlertFiredEvent, AlertResolvedEvent, AttributesChangedEvent, CheckpointSizeWarningEvent, ConstraintViolatedEvent, DevelopmentWarningEvent, SignalDeliveredEvent, SignalReceivedEvent, StorageSizeReportedEvent, UpdateCompletedEvent, UpdateReceivedEvent, WorkflowCancelledEvent, WorkflowCompletedEvent, WorkflowFailedEvent, WorkflowRecoverySkippedEvent, WorkflowResumedEvent, WorkflowStartedEvent, WorkflowSuspendedEvent, WorkflowTimedOutEvent, } from './core/events';
25
30
  export type { TypedEventTarget, WeftEventMap, WorkflowRecoverySkippedReason } from './core/events';
26
31
  export { detectRuntime, hashBytes, hashString, sleep } from './runtime/portable';
27
32
  export type { RuntimeKind } from './runtime/portable';
@@ -38,7 +43,7 @@ export { copyTextKeyValueRowsToStorage } from './storage/text-value-import';
38
43
  export type { CopyTextKeyValueRowsToStorageOptions, CopyTextKeyValueRowsToStorageResult, TextKeyValueRow, } from './storage/text-value-import';
39
44
  export { jsonCodec, msgpackCodec, withCodec } from './storage/typed-storage';
40
45
  export type { CodecStorageOptions, MessagePackValue, StorageCodec, StorageValueParser, TypedBatchOperation, TypedConditionalBatchCondition, TypedStorage, } from './storage/typed-storage';
41
- export { decode, encode, validateCloneable } from './core/codec';
46
+ export { decode, encode, registerSerializer, validateCloneable, type SerializerHandlers, } from './core/codec';
42
47
  export { PayloadSizeExceededError } from './core/payload-size';
43
48
  export { advanceCheckpoint, checkpointSizeBytes, createCheckpoint, deserializeCheckpoint, serializeCheckpoint, } from './core/checkpoint';
44
49
  export { Scheduler, calculateBackoff, parseDuration } from './core/scheduler';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { VERSION } from "./version.js";
2
- export { WeftError, isWeftError, isWeftErrorCode } from "./core/weft-error.js";
2
+ export { WeftError, isWeftError, isWeftErrorCode, isWeftErrorLike } from "./core/weft-error.js";
3
3
  export {
4
4
  FAULT_CODE_TO_FAILURE_CATEGORY,
5
5
  failureCategoryForFaultCode,
@@ -16,12 +16,15 @@ export {
16
16
  Engine,
17
17
  EngineCreateNameMismatchError,
18
18
  EngineDisposedError,
19
+ IdempotencyKeyPurgedError,
19
20
  PersistedDataIncompatibleError,
20
21
  ScheduleHandle,
22
+ StartOrSignalConflictError,
21
23
  WorkflowAlreadyExistsError,
22
24
  WorkflowHandle,
23
25
  WorkflowNotFoundError,
24
26
  WorkflowNotRegisteredError,
27
+ WorkflowSuspendNotSupportedError,
25
28
  WorkflowTypeNotRegisteredForRecoveryError
26
29
  } from "./core/engine.js";
27
30
  export {
@@ -60,6 +63,7 @@ export {
60
63
  WorkflowRecoverySkippedEvent,
61
64
  WorkflowResumedEvent,
62
65
  WorkflowStartedEvent,
66
+ WorkflowSuspendedEvent,
63
67
  WorkflowTimedOutEvent
64
68
  } from "./core/events.js";
65
69
  export { detectRuntime, hashBytes, hashString, sleep } from "./runtime/portable.js";
@@ -78,7 +82,12 @@ export { MemoryStorage } from "./storage/memory.js";
78
82
  export { ScopedStorage, scopedStorage } from "./storage/scoped-storage.js";
79
83
  export { copyTextKeyValueRowsToStorage } from "./storage/text-value-import.js";
80
84
  export { jsonCodec, msgpackCodec, withCodec } from "./storage/typed-storage.js";
81
- export { decode, encode, validateCloneable } from "./core/codec.js";
85
+ export {
86
+ decode,
87
+ encode,
88
+ registerSerializer,
89
+ validateCloneable
90
+ } from "./core/codec.js";
82
91
  export { PayloadSizeExceededError } from "./core/payload-size.js";
83
92
  export {
84
93
  advanceCheckpoint,
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- var B=Object.defineProperty;var D=(j)=>j;function L(j,q){this[j]=D.bind(null,q)}var _=(j,q)=>{for(var z in q)B(j,z,{get:q[z],enumerable:!0,configurable:!0,set:L.bind(q,z)})};var X=(j,q)=>()=>(j&&(q=j(j=0)),q);var K,U,N;var Y=X(()=>{K=class K extends Error{code;constructor(j,q,z){super(q,z);this.code=j,this.name=j}};U={WorkflowAlreadyExistsError:!0,BulkDeleteRequiresTerminalWorkflowsError:!0,BulkOperationConfirmationError:!0,WorkflowTypeNotRegisteredForRecoveryError:!0,EngineCreateNameMismatchError:!0,EngineDisposedError:!0,WorkflowNotFoundError:!0,WorkflowNotRegisteredError:!0,ActivityResolutionError:!0,PersistedDataIncompatibleError:!0,WorkflowTimeoutError:!0,HttpClientError:!0,WorkerProtocolIncompatibleError:!0,UpdateTimeoutError:!0,UpdateValidationError:!0,WorkflowTerminalError:!0,WorkflowBuilderError:!0,VersionMismatchError:!0,EffectReplayConflictError:!0,ReviewTimeoutError:!0,AtomicStateConflictError:!0,StandardSchemaValidationError:!0,ActivityReconciliationCapabilityError:!0,ActivityReconciliationConflictError:!0,ActivityReconciliationIndeterminateError:!0,AsyncActivityTokenNotFoundError:!0,PayloadSizeExceededError:!0},N=new Set(Object.keys(U))});async function Z(j,q,z){let G=j["~standard"];if(!J(G))throw TypeError(`Schema for ${z.fieldName} does not provide runtime validation. Attach a Standard Schema validator (Zod, Valibot, or another vendor) or supply a runtime-validating schema at this boundary.`);let H=await G.validate(q);if(H.issues===void 0)return H.value;throw new A({fieldName:z.fieldName,operation:z.operation,issues:H.issues.map(O)})}function Q(j){return j.map((q)=>q.path===""?q.message:`${q.path}: ${q.message}`).join(`
3
- `)}function J(j){return typeof j.validate==="function"}function O(j){return{message:j.message,path:T(j.path)}}function T(j){if(j===void 0||j.length===0)return"";let q="";for(let z of j)q+="/",q+=y(z);return q}function y(j){let q=F(j)?j.key:j;return M(String(q))}function F(j){return j!==null&&typeof j==="object"&&"key"in j}function M(j){return j.replace(/~/g,"~0").replace(/\//g,"~1")}function R(j,q,z){return`Validation failed for ${q===void 0?j:`${q} ${j}`}:
4
- ${Q(z)}`}var A;var $=X(()=>{Y();A=class A extends K{fieldName;operation;issues;constructor(j){super("StandardSchemaValidationError",R(j.fieldName,j.operation,j.issues));this.fieldName=j.fieldName,this.operation=j.operation,this.issues=j.issues}}});$();var C=Q,x=A,k=Z;export{k as validateStandardSchema,C as formatStandardSchemaIssues,x as StandardSchemaValidationError};
2
+ var w=Object.defineProperty;var y=(j)=>j;function B(j,q){this[j]=y.bind(null,q)}var T=(j,q)=>{for(var z in q)w(j,z,{get:q[z],enumerable:!0,configurable:!0,set:B.bind(q,z)})};var X=(j,q)=>()=>(j&&(q=j(j=0)),q);var K,D,_;var Y=X(()=>{K=class K extends Error{code;constructor(j,q,z){super(q,z);this.code=j,this.name=j}};D={WorkflowAlreadyExistsError:!0,BulkDeleteRequiresTerminalWorkflowsError:!0,BulkOperationConfirmationError:!0,WorkflowTypeNotRegisteredForRecoveryError:!0,EngineCreateNameMismatchError:!0,EngineDisposedError:!0,WorkflowNotFoundError:!0,WorkflowNotRegisteredError:!0,ActivityResolutionError:!0,PersistedDataIncompatibleError:!0,WorkflowTimeoutError:!0,HttpClientError:!0,WorkerProtocolIncompatibleError:!0,UpdateTimeoutError:!0,UpdateValidationError:!0,WorkflowTerminalError:!0,WorkflowBuilderError:!0,VersionMismatchError:!0,EffectReplayConflictError:!0,ReviewTimeoutError:!0,AtomicStateConflictError:!0,StandardSchemaValidationError:!0,ActivityReconciliationCapabilityError:!0,ActivityReconciliationConflictError:!0,ActivityReconciliationIndeterminateError:!0,AsyncActivityTokenNotFoundError:!0,PayloadSizeExceededError:!0,StartOrSignalConflictError:!0,IdempotencyKeyPurgedError:!0},_=new Set(Object.keys(D))});async function Z(j,q,z){let G=j["~standard"];if(!L(G))throw TypeError(`Schema for ${z.fieldName} does not provide runtime validation. Attach a Standard Schema validator (Zod, Valibot, or another vendor) or supply a runtime-validating schema at this boundary.`);let H=await G.validate(q);if(H.issues===void 0)return H.value;throw new A({fieldName:z.fieldName,operation:z.operation,issues:H.issues.map(U)})}function Q(j){return j.map((q)=>q.path===""?q.message:`${q.path}: ${q.message}`).join(`
3
+ `)}function L(j){return typeof j.validate==="function"}function U(j){return{message:j.message,path:b(j.path)}}function b(j){if(j===void 0||j.length===0)return"";let q="";for(let z of j)q+="/",q+=F(z);return q}function F(j){let q=J(j)?j.key:j;return M(String(q))}function J(j){return j!==null&&typeof j==="object"&&"key"in j}function M(j){return j.replace(/~/g,"~0").replace(/\//g,"~1")}function O(j,q,z){return`Validation failed for ${q===void 0?j:`${q} ${j}`}:
4
+ ${Q(z)}`}var A;var $=X(()=>{Y();A=class A extends K{fieldName;operation;issues;constructor(j){super("StandardSchemaValidationError",O(j.fieldName,j.operation,j.issues));this.fieldName=j.fieldName,this.operation=j.operation,this.issues=j.issues}}});$();var V=Q,P=A,W=Z;export{W as validateStandardSchema,V as formatStandardSchemaIssues,P as StandardSchemaValidationError};