@voyant-travel/workflows 0.107.10

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 (120) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +52 -0
  3. package/README.md +79 -0
  4. package/dist/auth/index.d.ts +125 -0
  5. package/dist/auth/index.d.ts.map +1 -0
  6. package/dist/auth/index.js +352 -0
  7. package/dist/bindings.d.ts +119 -0
  8. package/dist/bindings.d.ts.map +1 -0
  9. package/dist/bindings.js +19 -0
  10. package/dist/client.d.ts +135 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +305 -0
  13. package/dist/conditions.d.ts +29 -0
  14. package/dist/conditions.d.ts.map +1 -0
  15. package/dist/conditions.js +5 -0
  16. package/dist/config.d.ts +93 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +7 -0
  19. package/dist/driver.d.ts +237 -0
  20. package/dist/driver.d.ts.map +1 -0
  21. package/dist/driver.js +53 -0
  22. package/dist/errors.d.ts +58 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +76 -0
  25. package/dist/events/compile.d.ts +34 -0
  26. package/dist/events/compile.d.ts.map +1 -0
  27. package/dist/events/compile.js +204 -0
  28. package/dist/events/index.d.ts +8 -0
  29. package/dist/events/index.d.ts.map +1 -0
  30. package/dist/events/index.js +11 -0
  31. package/dist/events/input-mapper.d.ts +24 -0
  32. package/dist/events/input-mapper.d.ts.map +1 -0
  33. package/dist/events/input-mapper.js +169 -0
  34. package/dist/events/manifest-builder.d.ts +42 -0
  35. package/dist/events/manifest-builder.d.ts.map +1 -0
  36. package/dist/events/manifest-builder.js +313 -0
  37. package/dist/events/payload-hash.d.ts +46 -0
  38. package/dist/events/payload-hash.d.ts.map +1 -0
  39. package/dist/events/payload-hash.js +98 -0
  40. package/dist/events/predicate.d.ts +77 -0
  41. package/dist/events/predicate.d.ts.map +1 -0
  42. package/dist/events/predicate.js +347 -0
  43. package/dist/events/registry.d.ts +37 -0
  44. package/dist/events/registry.d.ts.map +1 -0
  45. package/dist/events/registry.js +47 -0
  46. package/dist/handler/index.d.ts +114 -0
  47. package/dist/handler/index.d.ts.map +1 -0
  48. package/dist/handler/index.js +267 -0
  49. package/dist/handler/resume.d.ts +41 -0
  50. package/dist/handler/resume.d.ts.map +1 -0
  51. package/dist/handler/resume.js +44 -0
  52. package/dist/http-ingest.d.ts +54 -0
  53. package/dist/http-ingest.d.ts.map +1 -0
  54. package/dist/http-ingest.js +214 -0
  55. package/dist/index.d.ts +6 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +10 -0
  58. package/dist/protocol/index.d.ts +345 -0
  59. package/dist/protocol/index.d.ts.map +1 -0
  60. package/dist/protocol/index.js +110 -0
  61. package/dist/rate-limit/index.d.ts +40 -0
  62. package/dist/rate-limit/index.d.ts.map +1 -0
  63. package/dist/rate-limit/index.js +139 -0
  64. package/dist/runtime/ctx.d.ts +111 -0
  65. package/dist/runtime/ctx.d.ts.map +1 -0
  66. package/dist/runtime/ctx.js +624 -0
  67. package/dist/runtime/determinism.d.ts +19 -0
  68. package/dist/runtime/determinism.d.ts.map +1 -0
  69. package/dist/runtime/determinism.js +61 -0
  70. package/dist/runtime/errors.d.ts +21 -0
  71. package/dist/runtime/errors.d.ts.map +1 -0
  72. package/dist/runtime/errors.js +45 -0
  73. package/dist/runtime/executor.d.ts +166 -0
  74. package/dist/runtime/executor.d.ts.map +1 -0
  75. package/dist/runtime/executor.js +226 -0
  76. package/dist/runtime/journal.d.ts +56 -0
  77. package/dist/runtime/journal.d.ts.map +1 -0
  78. package/dist/runtime/journal.js +28 -0
  79. package/dist/testing/index.d.ts +117 -0
  80. package/dist/testing/index.d.ts.map +1 -0
  81. package/dist/testing/index.js +599 -0
  82. package/dist/trigger.d.ts +37 -0
  83. package/dist/trigger.d.ts.map +1 -0
  84. package/dist/trigger.js +11 -0
  85. package/dist/types.d.ts +63 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +3 -0
  88. package/dist/workflow.d.ts +222 -0
  89. package/dist/workflow.d.ts.map +1 -0
  90. package/dist/workflow.js +55 -0
  91. package/package.json +120 -0
  92. package/src/auth/index.ts +398 -0
  93. package/src/bindings.ts +135 -0
  94. package/src/client.ts +498 -0
  95. package/src/conditions.ts +43 -0
  96. package/src/config.ts +114 -0
  97. package/src/driver.ts +277 -0
  98. package/src/errors.ts +109 -0
  99. package/src/events/compile.ts +268 -0
  100. package/src/events/index.ts +42 -0
  101. package/src/events/input-mapper.ts +201 -0
  102. package/src/events/manifest-builder.ts +372 -0
  103. package/src/events/payload-hash.ts +110 -0
  104. package/src/events/predicate.ts +390 -0
  105. package/src/events/registry.ts +86 -0
  106. package/src/handler/index.ts +413 -0
  107. package/src/handler/resume.ts +100 -0
  108. package/src/http-ingest.ts +299 -0
  109. package/src/index.ts +18 -0
  110. package/src/protocol/index.ts +483 -0
  111. package/src/rate-limit/index.ts +181 -0
  112. package/src/runtime/ctx.ts +876 -0
  113. package/src/runtime/determinism.ts +75 -0
  114. package/src/runtime/errors.ts +58 -0
  115. package/src/runtime/executor.ts +442 -0
  116. package/src/runtime/journal.ts +80 -0
  117. package/src/testing/index.ts +796 -0
  118. package/src/trigger.ts +63 -0
  119. package/src/types.ts +80 -0
  120. package/src/workflow.ts +328 -0
@@ -0,0 +1,63 @@
1
+ export type Duration = number | `${number}${"ms" | "s" | "m" | "h" | "d" | "w"}`;
2
+ /**
3
+ * Cloudflare Container instance types — the set Voyant Cloud honors
4
+ * for `runtime: "node"` steps. Match the sizes published at
5
+ * https://developers.cloudflare.com/containers/ (as of
6
+ * compat-date 2026-04-01).
7
+ *
8
+ * | name | vCPU | memory | disk |
9
+ * | ----------- | ----- | ------- | ----- |
10
+ * | lite | 1/16 | 256 MiB | 2 GB |
11
+ * | basic | 1/4 | 1 GiB | 4 GB |
12
+ * | standard-1 | 1/2 | 4 GiB | 8 GB |
13
+ * | standard-2 | 1 | 6 GiB | 12 GB |
14
+ * | standard-3 | 2 | 8 GiB | 16 GB |
15
+ * | standard-4 | 4 | 12 GiB | 20 GB |
16
+ *
17
+ * The open `(string & {})` escape hatch accepts CF custom instance
18
+ * types (up to 4 vCPU / 12 GiB / 20 GB, min 3 GiB RAM per vCPU) —
19
+ * rendered as `"custom-<vcpu>-<ramGiB>"` by convention.
20
+ */
21
+ export type MachineType = "lite" | "basic" | "standard-1" | "standard-2" | "standard-3" | "standard-4" | (string & {});
22
+ export type EnvironmentName = "production" | "preview" | "development";
23
+ export type RunStatus = "pending" | "queued" | "running" | "waiting" | "completed" | "failed" | "cancelled" | "cancelled_by_dev_reload" | "cancelled_by_version_sunset" | "compensated" | "compensation_failed" | "timed_out";
24
+ export type ExecutionStatus = "CREATED" | "QUEUED" | "EXECUTING" | "EXECUTING_WITH_WAITPOINTS" | "SUSPENDED" | "PENDING_CANCEL" | "FINISHED";
25
+ export type WaitpointKind = "DATETIME" | "EVENT" | "SIGNAL" | "RUN" | "MANUAL";
26
+ export interface RetryPolicy {
27
+ max?: number;
28
+ backoff?: "exponential" | "linear" | "fixed";
29
+ initial?: Duration;
30
+ maxDelay?: Duration;
31
+ }
32
+ export interface RateLimitSpec {
33
+ key: string | ((input: unknown, ctx: {
34
+ run: {
35
+ id: string;
36
+ };
37
+ project: {
38
+ id: string;
39
+ };
40
+ }) => string);
41
+ limit: number | ((input: unknown) => number);
42
+ units?: number | ((input: unknown) => number);
43
+ window: Duration;
44
+ onLimit?: "queue" | "fail";
45
+ }
46
+ export type RunTrigger = {
47
+ kind: "api";
48
+ actor?: string;
49
+ accessTokenId?: string;
50
+ } | {
51
+ kind: "schedule";
52
+ scheduleId: string;
53
+ } | {
54
+ kind: "event";
55
+ eventId: string;
56
+ eventType: string;
57
+ filterId: string;
58
+ } | {
59
+ kind: "parent";
60
+ parentRunId: string;
61
+ parentStepId: string;
62
+ };
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAA;AAEhF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,OAAO,GACP,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAEjB,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,SAAS,GAAG,aAAa,CAAA;AAEtE,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,QAAQ,GACR,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ,GACR,WAAW,GACX,yBAAyB,GACzB,6BAA6B,GAC7B,aAAa,GACb,qBAAqB,GACrB,WAAW,CAAA;AAEf,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,QAAQ,GACR,WAAW,GACX,2BAA2B,GAC3B,WAAW,GACX,gBAAgB,GAChB,UAAU,CAAA;AAEd,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE9E,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC5C,OAAO,CAAC,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;QAAE,GAAG,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,OAAO,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAAK,MAAM,CAAC,CAAA;IACjG,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,CAAA;IAC5C,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,CAAA;IAC7C,MAAM,EAAE,QAAQ,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAC3B;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // Core type aliases used across the SDK.
2
+ // Authoritative definitions in docs/sdk-surface.md §0 and §2.
3
+ export {};
@@ -0,0 +1,222 @@
1
+ import type { Condition } from "./conditions.js";
2
+ import type { ServiceResolver } from "./driver.js";
3
+ import type { Duration, EnvironmentName, MachineType, RateLimitSpec, RetryPolicy, RunStatus, RunTrigger } from "./types.js";
4
+ export interface WorkflowHandle<TInput = unknown, TOutput = unknown> {
5
+ readonly id: string;
6
+ /** Phantom; used only for TypeScript inference of `workflows.trigger(...)`. */
7
+ readonly __input?: TInput;
8
+ readonly __output?: TOutput;
9
+ }
10
+ export interface WorkflowConfig<TInput, TOutput> {
11
+ id: string;
12
+ input?: unknown;
13
+ output?: unknown;
14
+ description?: string;
15
+ schedule?: ScheduleDeclaration | ScheduleDeclaration[];
16
+ concurrency?: ConcurrencyPolicy<TInput>;
17
+ retry?: RetryPolicy;
18
+ timeout?: Duration;
19
+ defaultRuntime?: "edge" | "node";
20
+ tags?: string[];
21
+ run: (input: TInput, ctx: WorkflowContext<TInput>) => Promise<TOutput>;
22
+ }
23
+ /**
24
+ * Internal registered form of a workflow. The executor takes this
25
+ * plus a request and drives the body.
26
+ */
27
+ export interface WorkflowDefinition<TInput = unknown, TOutput = unknown> extends WorkflowHandle<TInput, TOutput> {
28
+ readonly config: WorkflowConfig<TInput, TOutput>;
29
+ }
30
+ export type ScheduleDeclaration = ({
31
+ cron: string;
32
+ } | {
33
+ every: Duration;
34
+ } | {
35
+ at: string | Date;
36
+ }) & {
37
+ timezone?: string;
38
+ input?: unknown | (() => unknown | Promise<unknown>);
39
+ enabled?: boolean;
40
+ overlap?: "skip" | "queue" | "allow";
41
+ environments?: EnvironmentName[];
42
+ name?: string;
43
+ };
44
+ export interface ConcurrencyPolicy<TInput> {
45
+ key?: string | ((input: TInput) => string);
46
+ limit?: number;
47
+ strategy?: "queue" | "cancel-in-progress" | "cancel-newest" | "round-robin";
48
+ }
49
+ /** Declare a workflow. See docs/sdk-surface.md §2.1. */
50
+ export declare function workflow<TInput = unknown, TOutput = unknown>(config: WorkflowConfig<TInput, TOutput>): WorkflowDefinition<TInput, TOutput>;
51
+ /** Internal: look up a registered workflow by id. */
52
+ export declare function getWorkflow(id: string): WorkflowDefinition | undefined;
53
+ /**
54
+ * Internal: enumerate every registered workflow. Used by the CLI to list
55
+ * workflows discovered from a loaded entry file. Not part of the stable
56
+ * public API — implementation detail of the SDK/CLI pair.
57
+ */
58
+ export declare function __listRegisteredWorkflows(): WorkflowDefinition[];
59
+ /**
60
+ * Internal: clear the workflow registry. Called by the CLI between
61
+ * builds / hot-reloads to drop stale workflows before re-importing
62
+ * the tenant bundle, and by test suites in beforeEach to isolate
63
+ * runs. Not part of the stable public API.
64
+ */
65
+ export declare function __resetRegistry(): void;
66
+ export interface RunContext {
67
+ id: string;
68
+ number: number;
69
+ attempt: number;
70
+ triggeredBy: RunTrigger;
71
+ tags: readonly string[];
72
+ startedAt: number;
73
+ }
74
+ export interface EnvironmentContext {
75
+ name: EnvironmentName;
76
+ git?: {
77
+ commit: string;
78
+ branch: string;
79
+ pr?: {
80
+ number: number;
81
+ url: string;
82
+ };
83
+ };
84
+ }
85
+ export interface WorkflowContext<_TInput = unknown> {
86
+ readonly run: RunContext;
87
+ readonly workflow: {
88
+ id: string;
89
+ version: string;
90
+ };
91
+ readonly environment: EnvironmentContext;
92
+ readonly project: {
93
+ id: string;
94
+ slug: string;
95
+ };
96
+ readonly organization: {
97
+ id: string;
98
+ slug: string;
99
+ };
100
+ readonly invocationCount: number;
101
+ readonly signal: AbortSignal;
102
+ /**
103
+ * Read-only view of the framework's service container. Step bodies resolve
104
+ * shared services (db, indexer, etc.) via `ctx.services.resolve("name")`.
105
+ * The framework wires this from `createApp()`'s `ModuleContainer` through
106
+ * `StepHandlerDeps.services`. When no container is plumbed (driver not
107
+ * configured with `services`, or in raw orchestrator tests), `resolve(...)`
108
+ * throws with a clear message and `has(...)` returns `false`.
109
+ */
110
+ readonly services: ServiceResolver;
111
+ step: StepApi;
112
+ sleep: (duration: Duration) => Promise<void>;
113
+ waitForEvent: WaitForEventApi;
114
+ waitForSignal: WaitForSignalApi;
115
+ waitForToken: WaitForTokenApi;
116
+ invoke: InvokeApi;
117
+ parallel: ParallelApi;
118
+ stream: StreamApi;
119
+ group: GroupApi;
120
+ compensate: () => Promise<never>;
121
+ metadata: MetadataApi;
122
+ now: () => number;
123
+ random: () => number;
124
+ randomUUID: () => string;
125
+ setRetry: (policy: RetryPolicy) => void;
126
+ }
127
+ export interface StepApi {
128
+ <T>(id: string, fn: StepFn<T>): Promise<T>;
129
+ <T>(id: string, opts: StepOptions<T>, fn: StepFn<T>): Promise<T>;
130
+ }
131
+ export type StepFn<T> = (stepCtx: StepContext) => Promise<T>;
132
+ export interface StepContext {
133
+ signal: AbortSignal;
134
+ attempt: number;
135
+ log: (level: "info" | "warn" | "error", msg: string, data?: object) => void;
136
+ }
137
+ export interface StepOptions<T = unknown> {
138
+ runtime?: "edge" | "node";
139
+ machine?: MachineType;
140
+ timeout?: Duration;
141
+ retry?: RetryPolicy | {
142
+ max: 0;
143
+ };
144
+ idempotencyKey?: string;
145
+ compensate?: (output: T) => Promise<void>;
146
+ rateLimit?: RateLimitSpec;
147
+ waitFor?: Condition;
148
+ cancelIf?: Condition;
149
+ skipIf?: Condition;
150
+ }
151
+ export interface Waitable<T> extends PromiseLike<T | null> {
152
+ [Symbol.asyncIterator](): AsyncIterableIterator<T>;
153
+ close(): void;
154
+ }
155
+ export type WaitForEventApi = <T = unknown>(eventType: string, opts?: WaitForEventOptions<T>) => Waitable<T>;
156
+ export interface WaitForEventOptions<T> {
157
+ match?: Partial<T> | ((payload: T) => boolean);
158
+ timeout?: Duration;
159
+ lookback?: Duration;
160
+ bufferSize?: number;
161
+ onTimeout?: "null" | "throw";
162
+ }
163
+ export type WaitForSignalApi = <T = unknown>(name: string, opts?: WaitForSignalOptions<T>) => Waitable<T>;
164
+ export interface WaitForSignalOptions<T> extends WaitForEventOptions<T> {
165
+ }
166
+ export type WaitForTokenApi = <T = unknown>(opts?: WaitForTokenOptions<T>) => Promise<TokenWait<T>>;
167
+ export interface WaitForTokenOptions<_T> {
168
+ tokenId?: string;
169
+ timeout?: Duration;
170
+ onTimeout?: "null" | "throw";
171
+ schema?: unknown;
172
+ }
173
+ export interface TokenWait<T> {
174
+ tokenId: string;
175
+ url: string;
176
+ wait: () => Promise<T | null>;
177
+ }
178
+ export type InvokeApi = <TIn, TOut>(workflow: WorkflowHandle<TIn, TOut>, input: TIn, opts?: InvokeOptions) => Promise<TOut>;
179
+ export interface InvokeOptions {
180
+ idempotencyKey?: string;
181
+ tags?: string[];
182
+ lockToVersion?: string;
183
+ /**
184
+ * Fire-and-forget child run. The child is still triggered and
185
+ * persisted, but the parent does not wait for its output or error.
186
+ * The awaited result resolves to `undefined`; callers should not use
187
+ * detached invokes for control flow.
188
+ */
189
+ detach?: boolean;
190
+ }
191
+ export type ParallelApi = <T, R>(items: readonly T[], fn: (item: T, index: number) => Promise<R>, opts?: ParallelOptions) => Promise<R[]>;
192
+ export interface ParallelOptions {
193
+ concurrency?: number;
194
+ settle?: boolean;
195
+ }
196
+ export interface StreamApi {
197
+ text(streamId: string, source: AsyncIterable<string>): Promise<void>;
198
+ json<T>(streamId: string, source: AsyncIterable<T>): Promise<void>;
199
+ bytes(streamId: string, source: AsyncIterable<Uint8Array>): Promise<void>;
200
+ <T>(streamId: string, fn: () => AsyncGenerator<T>): Promise<void>;
201
+ }
202
+ export type GroupApi = <T>(name: string, fn: (scope: GroupScope) => Promise<T>) => Promise<T>;
203
+ export interface GroupScope {
204
+ step: StepApi;
205
+ compensate: () => Promise<never>;
206
+ }
207
+ export type MetadataValue = string | number | boolean | null | MetadataValue[] | {
208
+ [key: string]: MetadataValue;
209
+ };
210
+ export interface MetadataMutatorSubset {
211
+ set(key: string, value: MetadataValue): void;
212
+ increment(key: string, by?: number): void;
213
+ append<T>(key: string, value: T): void;
214
+ remove(key: string): void;
215
+ }
216
+ export interface MetadataApi extends MetadataMutatorSubset {
217
+ flush(): Promise<void>;
218
+ parent?: MetadataMutatorSubset;
219
+ root?: MetadataMutatorSubset;
220
+ }
221
+ export type { RunStatus };
222
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ // Workflow declaration and the `ctx` object.
2
+ // Authoritative contract in docs/sdk-surface.md §2–§3.
3
+ /**
4
+ * Process-local registry. Backed by globalThis so bundles that inline
5
+ * their own copy of @voyant-travel/workflows still share the registry with
6
+ * the loader's copy (voyant build relies on this to extract the
7
+ * manifest from a user bundle at load-time). Module-local `const`
8
+ * would create a private map per bundle copy.
9
+ */
10
+ const REGISTRY_KEY = "__voyantWorkflowRegistry";
11
+ const globalRef = globalThis;
12
+ const REGISTRY = globalRef[REGISTRY_KEY] ?? new Map();
13
+ globalRef[REGISTRY_KEY] = REGISTRY;
14
+ /** Declare a workflow. See docs/sdk-surface.md §2.1. */
15
+ export function workflow(config) {
16
+ // Vite / Cloudflare workerd HMR re-evaluates modules in place, so a
17
+ // workflow file that registers ids at import-time will be re-imported
18
+ // on every save. Throwing on duplicate ids would surface real
19
+ // collisions but also kills the entire dev loop. The CLI's pre-flight
20
+ // (`voyant workflows build`) is the right place to catch genuine
21
+ // duplicates across files; here we replace + warn so HMR keeps
22
+ // working. Production bundles run this once at startup, so the
23
+ // duplicate path is effectively dev-only.
24
+ if (REGISTRY.has(config.id)) {
25
+ console.warn(`[workflows] workflow id "${config.id}" re-registered — assuming HMR re-import. ` +
26
+ `If this is a real duplicate, \`voyant workflows build\` will reject the bundle.`);
27
+ }
28
+ const def = {
29
+ id: config.id,
30
+ config,
31
+ };
32
+ REGISTRY.set(config.id, def);
33
+ return def;
34
+ }
35
+ /** Internal: look up a registered workflow by id. */
36
+ export function getWorkflow(id) {
37
+ return REGISTRY.get(id);
38
+ }
39
+ /**
40
+ * Internal: enumerate every registered workflow. Used by the CLI to list
41
+ * workflows discovered from a loaded entry file. Not part of the stable
42
+ * public API — implementation detail of the SDK/CLI pair.
43
+ */
44
+ export function __listRegisteredWorkflows() {
45
+ return [...REGISTRY.values()];
46
+ }
47
+ /**
48
+ * Internal: clear the workflow registry. Called by the CLI between
49
+ * builds / hot-reloads to drop stale workflows before re-importing
50
+ * the tenant bundle, and by test suites in beforeEach to isolate
51
+ * runs. Not part of the stable public API.
52
+ */
53
+ export function __resetRegistry() {
54
+ REGISTRY.clear();
55
+ }
package/package.json ADDED
@@ -0,0 +1,120 @@
1
+ {
2
+ "name": "@voyant-travel/workflows",
3
+ "version": "0.107.10",
4
+ "description": "Authoring SDK for Voyant Workflows — durable, step-based orchestrations for Voyant Cloud.",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/voyant-travel/voyant.git",
9
+ "directory": "packages/workflows"
10
+ },
11
+ "homepage": "https://voyant.cloud/workflows",
12
+ "type": "module",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
18
+ },
19
+ "./testing": {
20
+ "types": "./dist/testing/index.d.ts",
21
+ "import": "./dist/testing/index.js",
22
+ "default": "./dist/testing/index.js"
23
+ },
24
+ "./protocol": {
25
+ "types": "./dist/protocol/index.d.ts",
26
+ "import": "./dist/protocol/index.js",
27
+ "default": "./dist/protocol/index.js"
28
+ },
29
+ "./handler": {
30
+ "types": "./dist/handler/index.d.ts",
31
+ "import": "./dist/handler/index.js",
32
+ "default": "./dist/handler/index.js"
33
+ },
34
+ "./auth": {
35
+ "types": "./dist/auth/index.d.ts",
36
+ "import": "./dist/auth/index.js",
37
+ "default": "./dist/auth/index.js"
38
+ },
39
+ "./client": {
40
+ "types": "./dist/client.d.ts",
41
+ "import": "./dist/client.js",
42
+ "default": "./dist/client.js"
43
+ },
44
+ "./bindings": {
45
+ "types": "./dist/bindings.d.ts",
46
+ "import": "./dist/bindings.js",
47
+ "default": "./dist/bindings.js"
48
+ },
49
+ "./config": {
50
+ "types": "./dist/config.d.ts",
51
+ "import": "./dist/config.js",
52
+ "default": "./dist/config.js"
53
+ },
54
+ "./errors": {
55
+ "types": "./dist/errors.d.ts",
56
+ "import": "./dist/errors.js",
57
+ "default": "./dist/errors.js"
58
+ },
59
+ "./rate-limit": {
60
+ "types": "./dist/rate-limit/index.d.ts",
61
+ "import": "./dist/rate-limit/index.js",
62
+ "default": "./dist/rate-limit/index.js"
63
+ },
64
+ "./driver": {
65
+ "types": "./dist/driver.d.ts",
66
+ "import": "./dist/driver.js",
67
+ "default": "./dist/driver.js"
68
+ },
69
+ "./events": {
70
+ "types": "./dist/events/index.d.ts",
71
+ "import": "./dist/events/index.js",
72
+ "default": "./dist/events/index.js"
73
+ },
74
+ "./http-ingest": {
75
+ "types": "./dist/http-ingest.d.ts",
76
+ "import": "./dist/http-ingest.js",
77
+ "default": "./dist/http-ingest.js"
78
+ }
79
+ },
80
+ "main": "./dist/index.js",
81
+ "types": "./dist/index.d.ts",
82
+ "files": [
83
+ "dist",
84
+ "src",
85
+ "!**/*.test.*",
86
+ "!**/*.spec.*",
87
+ "NOTICE"
88
+ ],
89
+ "dependencies": {
90
+ "zod": "^3.23.8"
91
+ },
92
+ "devDependencies": {
93
+ "@types/node": "^20.12.0",
94
+ "esbuild": "0.28.1",
95
+ "typescript": "^5.9.2",
96
+ "vitest": "^3.2.6",
97
+ "@voyant-travel/voyant-typescript-config": "^0.1.0"
98
+ },
99
+ "peerDependencies": {
100
+ "zod": "^3.23.0 || ^4.0.0"
101
+ },
102
+ "peerDependenciesMeta": {
103
+ "zod": {
104
+ "optional": true
105
+ }
106
+ },
107
+ "publishConfig": {
108
+ "access": "public"
109
+ },
110
+ "scripts": {
111
+ "build": "tsc -p tsconfig.json",
112
+ "build:examples": "tsc -p tsconfig.examples.json",
113
+ "spike": "pnpm build && pnpm build:examples && node examples-dist/drive.js",
114
+ "check-types": "tsc --noEmit",
115
+ "dev": "tsc -w -p tsconfig.json",
116
+ "test": "vitest run",
117
+ "typecheck": "tsc --noEmit",
118
+ "test:watch": "vitest"
119
+ }
120
+ }