@workflow/core 5.0.0-beta.4 → 5.0.0-beta.40

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 (325) hide show
  1. package/dist/attribute-changes.d.ts +7 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +33 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +71 -4
  7. package/dist/capture-stack.d.ts +16 -0
  8. package/dist/capture-stack.d.ts.map +1 -0
  9. package/dist/capture-stack.js +21 -0
  10. package/dist/class-serialization.d.ts +32 -0
  11. package/dist/class-serialization.d.ts.map +1 -1
  12. package/dist/class-serialization.js +37 -1
  13. package/dist/classify-error.d.ts +26 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +109 -6
  16. package/dist/context-errors.d.ts +27 -0
  17. package/dist/context-errors.d.ts.map +1 -0
  18. package/dist/context-errors.js +101 -0
  19. package/dist/context-violation-error.d.ts +97 -0
  20. package/dist/context-violation-error.d.ts.map +1 -0
  21. package/dist/context-violation-error.js +149 -0
  22. package/dist/correlation-id.d.ts +109 -0
  23. package/dist/correlation-id.d.ts.map +1 -0
  24. package/dist/correlation-id.js +139 -0
  25. package/dist/create-hook.d.ts +62 -4
  26. package/dist/create-hook.d.ts.map +1 -1
  27. package/dist/create-hook.js +4 -3
  28. package/dist/define-hook.d.ts.map +1 -1
  29. package/dist/define-hook.js +20 -5
  30. package/dist/describe-error.d.ts +70 -0
  31. package/dist/describe-error.d.ts.map +1 -0
  32. package/dist/describe-error.js +189 -0
  33. package/dist/encryption.d.ts +37 -3
  34. package/dist/encryption.d.ts.map +1 -1
  35. package/dist/encryption.js +97 -31
  36. package/dist/events-consumer.d.ts +26 -1
  37. package/dist/events-consumer.d.ts.map +1 -1
  38. package/dist/events-consumer.js +105 -18
  39. package/dist/flushable-stream.d.ts +65 -10
  40. package/dist/flushable-stream.d.ts.map +1 -1
  41. package/dist/flushable-stream.js +131 -18
  42. package/dist/global.d.ts +37 -1
  43. package/dist/global.d.ts.map +1 -1
  44. package/dist/global.js +21 -3
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -1
  48. package/dist/log-format.d.ts +25 -0
  49. package/dist/log-format.d.ts.map +1 -0
  50. package/dist/log-format.js +250 -0
  51. package/dist/logger.d.ts +29 -30
  52. package/dist/logger.d.ts.map +1 -1
  53. package/dist/logger.js +82 -32
  54. package/dist/private.d.ts +178 -9
  55. package/dist/private.d.ts.map +1 -1
  56. package/dist/private.js +273 -9
  57. package/dist/replay-payload-cache.d.ts +68 -0
  58. package/dist/replay-payload-cache.d.ts.map +1 -0
  59. package/dist/replay-payload-cache.js +160 -0
  60. package/dist/runtime/compute-instance.d.ts +12 -0
  61. package/dist/runtime/compute-instance.d.ts.map +1 -0
  62. package/dist/runtime/compute-instance.js +13 -0
  63. package/dist/runtime/constants.d.ts +237 -0
  64. package/dist/runtime/constants.d.ts.map +1 -1
  65. package/dist/runtime/constants.js +405 -15
  66. package/dist/runtime/count-step-started-events.d.ts +52 -0
  67. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  68. package/dist/runtime/count-step-started-events.js +72 -0
  69. package/dist/runtime/deployment-guard.d.ts +99 -0
  70. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  71. package/dist/runtime/deployment-guard.js +154 -0
  72. package/dist/runtime/get-port-lazy.d.ts +25 -0
  73. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  74. package/dist/runtime/get-port-lazy.js +92 -0
  75. package/dist/runtime/get-world-lazy.d.ts +23 -0
  76. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  77. package/dist/runtime/get-world-lazy.js +46 -0
  78. package/dist/runtime/helpers.d.ts +219 -10
  79. package/dist/runtime/helpers.d.ts.map +1 -1
  80. package/dist/runtime/helpers.js +414 -40
  81. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  82. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-assets.generated.js +30 -0
  84. package/dist/runtime/quickjs-entrypoint.d.ts +124 -0
  85. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  86. package/dist/runtime/quickjs-entrypoint.js +1429 -0
  87. package/dist/runtime/quickjs-runtime.d.ts +193 -0
  88. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  89. package/dist/runtime/quickjs-runtime.js +1944 -0
  90. package/dist/runtime/replay-budget.d.ts +98 -0
  91. package/dist/runtime/replay-budget.d.ts.map +1 -0
  92. package/dist/runtime/replay-budget.js +192 -0
  93. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  94. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  95. package/dist/runtime/replay-recovery-reporter.js +64 -0
  96. package/dist/runtime/resume-hook.d.ts +27 -4
  97. package/dist/runtime/resume-hook.d.ts.map +1 -1
  98. package/dist/runtime/resume-hook.js +448 -76
  99. package/dist/runtime/run-id-time.d.ts +19 -0
  100. package/dist/runtime/run-id-time.d.ts.map +1 -0
  101. package/dist/runtime/run-id-time.js +42 -0
  102. package/dist/runtime/run.d.ts +8 -2
  103. package/dist/runtime/run.d.ts.map +1 -1
  104. package/dist/runtime/run.js +62 -15
  105. package/dist/runtime/runs.d.ts +54 -3
  106. package/dist/runtime/runs.d.ts.map +1 -1
  107. package/dist/runtime/runs.js +117 -10
  108. package/dist/runtime/start.d.ts +70 -1
  109. package/dist/runtime/start.d.ts.map +1 -1
  110. package/dist/runtime/start.js +312 -54
  111. package/dist/runtime/step-executor.d.ts +177 -0
  112. package/dist/runtime/step-executor.d.ts.map +1 -0
  113. package/dist/runtime/step-executor.js +949 -0
  114. package/dist/runtime/step-latency.d.ts +197 -0
  115. package/dist/runtime/step-latency.d.ts.map +1 -0
  116. package/dist/runtime/step-latency.js +207 -0
  117. package/dist/runtime/step-ownership.d.ts +72 -0
  118. package/dist/runtime/step-ownership.d.ts.map +1 -0
  119. package/dist/runtime/step-ownership.js +114 -0
  120. package/dist/runtime/step-single-flight.d.ts +12 -0
  121. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  122. package/dist/runtime/step-single-flight.js +69 -0
  123. package/dist/runtime/suspension-handler.d.ts +102 -7
  124. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  125. package/dist/runtime/suspension-handler.js +439 -140
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +84 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +105 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +5 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +12 -0
  141. package/dist/runtime/world-init.d.ts +50 -0
  142. package/dist/runtime/world-init.d.ts.map +1 -0
  143. package/dist/runtime/world-init.js +50 -0
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +101 -26
  147. package/dist/runtime.d.ts +17 -12
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3078 -327
  150. package/dist/schemas.d.ts +1 -1
  151. package/dist/schemas.d.ts.map +1 -1
  152. package/dist/schemas.js +1 -1
  153. package/dist/sealed-box.d.ts +167 -0
  154. package/dist/sealed-box.d.ts.map +1 -0
  155. package/dist/sealed-box.js +571 -0
  156. package/dist/serialization/client.d.ts +17 -0
  157. package/dist/serialization/client.d.ts.map +1 -0
  158. package/dist/serialization/client.js +48 -0
  159. package/dist/serialization/codec-devalue-vm.d.ts +9 -0
  160. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  161. package/dist/serialization/codec-devalue-vm.js +137 -0
  162. package/dist/serialization/codec-devalue.d.ts +14 -0
  163. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  164. package/dist/serialization/codec-devalue.js +105 -0
  165. package/dist/serialization/codec.d.ts +125 -0
  166. package/dist/serialization/codec.d.ts.map +1 -0
  167. package/dist/serialization/codec.js +17 -0
  168. package/dist/serialization/compression.d.ts +104 -0
  169. package/dist/serialization/compression.d.ts.map +1 -0
  170. package/dist/serialization/compression.js +260 -0
  171. package/dist/serialization/encryption.d.ts +134 -0
  172. package/dist/serialization/encryption.d.ts.map +1 -0
  173. package/dist/serialization/encryption.js +186 -0
  174. package/dist/serialization/errors.d.ts +34 -0
  175. package/dist/serialization/errors.d.ts.map +1 -0
  176. package/dist/serialization/errors.js +59 -0
  177. package/dist/serialization/format.d.ts +60 -0
  178. package/dist/serialization/format.d.ts.map +1 -0
  179. package/dist/serialization/format.js +97 -0
  180. package/dist/serialization/hardened.d.ts +155 -0
  181. package/dist/serialization/hardened.d.ts.map +1 -0
  182. package/dist/serialization/hardened.js +523 -0
  183. package/dist/serialization/index.d.ts +20 -0
  184. package/dist/serialization/index.d.ts.map +1 -0
  185. package/dist/serialization/index.js +22 -0
  186. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  187. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  188. package/dist/serialization/reducers/class-vm.js +77 -0
  189. package/dist/serialization/reducers/class.d.ts +11 -0
  190. package/dist/serialization/reducers/class.d.ts.map +1 -0
  191. package/dist/serialization/reducers/class.js +73 -0
  192. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  193. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  194. package/dist/serialization/reducers/common-vm.js +579 -0
  195. package/dist/serialization/reducers/common.d.ts +16 -0
  196. package/dist/serialization/reducers/common.d.ts.map +1 -0
  197. package/dist/serialization/reducers/common.js +478 -0
  198. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  199. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  200. package/dist/serialization/reducers/step-function-vm.js +97 -0
  201. package/dist/serialization/reducers/step-function.d.ts +35 -0
  202. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  203. package/dist/serialization/reducers/step-function.js +104 -0
  204. package/dist/serialization/step.d.ts +17 -0
  205. package/dist/serialization/step.d.ts.map +1 -0
  206. package/dist/serialization/step.js +48 -0
  207. package/dist/serialization/types.d.ts +273 -0
  208. package/dist/serialization/types.d.ts.map +1 -0
  209. package/dist/serialization/types.js +35 -0
  210. package/dist/serialization/vm-bundle-entry.d.ts +12 -0
  211. package/dist/serialization/vm-bundle-entry.d.ts.map +1 -0
  212. package/dist/serialization/vm-bundle-entry.js +58 -0
  213. package/dist/serialization/workflow-vm.d.ts +24 -0
  214. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  215. package/dist/serialization/workflow-vm.js +66 -0
  216. package/dist/serialization/workflow.d.ts +29 -0
  217. package/dist/serialization/workflow.d.ts.map +1 -0
  218. package/dist/serialization/workflow.js +54 -0
  219. package/dist/serialization-format.d.ts +60 -4
  220. package/dist/serialization-format.d.ts.map +1 -1
  221. package/dist/serialization-format.js +276 -56
  222. package/dist/serialization.d.ts +374 -221
  223. package/dist/serialization.d.ts.map +1 -1
  224. package/dist/serialization.js +2300 -783
  225. package/dist/set-attributes.d.ts +13 -0
  226. package/dist/set-attributes.d.ts.map +1 -0
  227. package/dist/set-attributes.js +60 -0
  228. package/dist/sleep.d.ts.map +1 -1
  229. package/dist/sleep.js +3 -2
  230. package/dist/source-map.d.ts +25 -0
  231. package/dist/source-map.d.ts.map +1 -1
  232. package/dist/source-map.js +148 -10
  233. package/dist/step/context-storage.d.ts +61 -2
  234. package/dist/step/context-storage.d.ts.map +1 -1
  235. package/dist/step/context-storage.js +7 -5
  236. package/dist/step/get-closure-vars.d.ts.map +1 -1
  237. package/dist/step/get-closure-vars.js +3 -2
  238. package/dist/step/get-step-metadata.d.ts.map +1 -1
  239. package/dist/step/get-step-metadata.js +3 -2
  240. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  241. package/dist/step/get-workflow-metadata.js +3 -2
  242. package/dist/step/writable-stream.d.ts.map +1 -1
  243. package/dist/step/writable-stream.js +71 -7
  244. package/dist/step.d.ts.map +1 -1
  245. package/dist/step.js +226 -30
  246. package/dist/symbols.d.ts +54 -0
  247. package/dist/symbols.d.ts.map +1 -1
  248. package/dist/symbols.js +55 -1
  249. package/dist/telemetry/semantic-conventions.d.ts +242 -2
  250. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  251. package/dist/telemetry/semantic-conventions.js +173 -1
  252. package/dist/telemetry.d.ts +73 -0
  253. package/dist/telemetry.d.ts.map +1 -1
  254. package/dist/telemetry.js +153 -16
  255. package/dist/types.d.ts +6 -0
  256. package/dist/types.d.ts.map +1 -1
  257. package/dist/types.js +23 -1
  258. package/dist/util.d.ts +16 -6
  259. package/dist/util.d.ts.map +1 -1
  260. package/dist/util.js +25 -16
  261. package/dist/version.d.ts +1 -1
  262. package/dist/version.d.ts.map +1 -1
  263. package/dist/version.js +2 -2
  264. package/dist/vm/index.d.ts.map +1 -1
  265. package/dist/vm/index.js +77 -9
  266. package/dist/vm/script-cache.d.ts +28 -0
  267. package/dist/vm/script-cache.d.ts.map +1 -0
  268. package/dist/vm/script-cache.js +140 -0
  269. package/dist/workflow/abort-controller.d.ts +65 -0
  270. package/dist/workflow/abort-controller.d.ts.map +1 -0
  271. package/dist/workflow/abort-controller.js +314 -0
  272. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  273. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  274. package/dist/workflow/attribute-dispatcher.js +48 -0
  275. package/dist/workflow/create-hook.d.ts.map +1 -1
  276. package/dist/workflow/create-hook.js +25 -3
  277. package/dist/workflow/define-hook.d.ts +1 -1
  278. package/dist/workflow/define-hook.d.ts.map +1 -1
  279. package/dist/workflow/define-hook.js +8 -4
  280. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  281. package/dist/workflow/get-workflow-metadata.js +14 -3
  282. package/dist/workflow/hook.d.ts.map +1 -1
  283. package/dist/workflow/hook.js +303 -37
  284. package/dist/workflow/index.d.ts +1 -0
  285. package/dist/workflow/index.d.ts.map +1 -1
  286. package/dist/workflow/index.js +5 -3
  287. package/dist/workflow/set-attributes.d.ts +68 -0
  288. package/dist/workflow/set-attributes.d.ts.map +1 -0
  289. package/dist/workflow/set-attributes.js +60 -0
  290. package/dist/workflow/sleep.d.ts.map +1 -1
  291. package/dist/workflow/sleep.js +58 -9
  292. package/dist/workflow/world-init-stub.d.ts +15 -0
  293. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  294. package/dist/workflow/world-init-stub.js +15 -0
  295. package/dist/workflow.d.ts +69 -3
  296. package/dist/workflow.d.ts.map +1 -1
  297. package/dist/workflow.js +791 -554
  298. package/docs/api-reference/create-hook.mdx +79 -0
  299. package/docs/api-reference/create-webhook.mdx +1 -0
  300. package/docs/api-reference/define-hook.mdx +26 -24
  301. package/docs/api-reference/fatal-error.mdx +29 -7
  302. package/docs/api-reference/fetch.mdx +8 -4
  303. package/docs/api-reference/index.mdx +3 -0
  304. package/docs/api-reference/set-attributes.mdx +61 -0
  305. package/docs/api-reference/sleep.mdx +1 -1
  306. package/docs/foundations/cancellation.mdx +459 -0
  307. package/docs/foundations/errors-and-retries.mdx +7 -3
  308. package/docs/foundations/hooks.mdx +29 -0
  309. package/docs/foundations/idempotency.mdx +243 -11
  310. package/docs/foundations/index.mdx +1 -23
  311. package/docs/foundations/meta.json +3 -1
  312. package/docs/foundations/serialization.mdx +77 -41
  313. package/docs/foundations/starting-workflows.mdx +79 -2
  314. package/docs/foundations/streaming.mdx +14 -23
  315. package/docs/foundations/versioning.mdx +263 -0
  316. package/docs/how-it-works/cancellation.mdx +287 -0
  317. package/docs/how-it-works/code-transform.mdx +21 -17
  318. package/docs/how-it-works/encryption.mdx +5 -5
  319. package/docs/how-it-works/event-sourcing.mdx +6 -6
  320. package/docs/how-it-works/framework-integrations.mdx +96 -337
  321. package/docs/how-it-works/meta.json +2 -1
  322. package/package.json +31 -13
  323. package/dist/runtime/step-handler.d.ts +0 -2
  324. package/dist/runtime/step-handler.d.ts.map +0 -1
  325. package/dist/runtime/step-handler.js +0 -678
@@ -0,0 +1,27 @@
1
+ import { ContextViolationError, type DocsUrl, NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError } from './context-violation-error.js';
2
+ export { ContextViolationError, NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, };
3
+ /**
4
+ * Thrown when an API that MUST NOT run inside a workflow function is called
5
+ * from one (e.g. `resumeHook()`, which would cause determinism issues).
6
+ * The message names the specific workflow that made the offending call.
7
+ */
8
+ export declare class UnavailableInWorkflowContextError extends ContextViolationError {
9
+ name: string;
10
+ constructor(functionName: string, docsUrl: DocsUrl);
11
+ }
12
+ /**
13
+ * Throw a {@link NotInWorkflowContextError} whose stack trace points at the
14
+ * user code that called `stackStartFn`, not at our framework internals.
15
+ *
16
+ * Prefer this over `throw new NotInWorkflowContextError(...)` so tooling
17
+ * (Next.js error overlay, VS Code terminal linkifier, Sentry, etc.) shows
18
+ * the user's call site as the relevant frame.
19
+ */
20
+ export declare function throwNotInWorkflowContext(functionName: string, docsUrl: DocsUrl, stackStartFn: Function): never;
21
+ /** See {@link throwNotInWorkflowContext}. */
22
+ export declare function throwNotInStepContext(functionName: string, docsUrl: DocsUrl, stackStartFn: Function): never;
23
+ /** See {@link throwNotInWorkflowContext}. */
24
+ export declare function throwNotInWorkflowOrStepContext(functionName: string, docsUrl: DocsUrl, stackStartFn: Function): never;
25
+ /** See {@link throwNotInWorkflowContext}. */
26
+ export declare function throwUnavailableInWorkflowContext(functionName: string, docsUrl: DocsUrl, stackStartFn: Function): never;
27
+ //# sourceMappingURL=context-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-errors.d.ts","sourceRoot":"","sources":["../src/context-errors.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EAErB,KAAK,OAAO,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,EAChC,MAAM,8BAA8B,CAAC;AAUtC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,GAChC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iCAAkC,SAAQ,qBAAqB;IAC1E,IAAI,SAAuC;gBAE/B,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CAgDnD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAEhB,YAAY,EAAE,QAAQ,GACrB,KAAK,CAIP;AAED,6CAA6C;AAC7C,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAEhB,YAAY,EAAE,QAAQ,GACrB,KAAK,CAIP;AAED,6CAA6C;AAC7C,wBAAgB,+BAA+B,CAC7C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAEhB,YAAY,EAAE,QAAQ,GACrB,KAAK,CAIP;AAED,6CAA6C;AAC7C,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAEhB,YAAY,EAAE,QAAQ,GACrB,KAAK,CAIP"}
@@ -0,0 +1,101 @@
1
+ import { redirectStackToCaller } from './capture-stack.js';
2
+ import { ContextViolationError, NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, } from './context-violation-error.js';
3
+ import { WORKFLOW_CONTEXT_SYMBOL, } from './workflow/get-workflow-metadata.js';
4
+ // Re-export the structural base + subclasses so the public surface is a
5
+ // single import point. The base + simpler subclasses live in
6
+ // `context-violation-error.ts` because `get-workflow-metadata.ts` needs to
7
+ // throw one without creating an import cycle with this file.
8
+ export { ContextViolationError, NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, };
9
+ /**
10
+ * Thrown when an API that MUST NOT run inside a workflow function is called
11
+ * from one (e.g. `resumeHook()`, which would cause determinism issues).
12
+ * The message names the specific workflow that made the offending call.
13
+ */
14
+ export class UnavailableInWorkflowContextError extends ContextViolationError {
15
+ name = 'UnavailableInWorkflowContextError';
16
+ constructor(functionName, docsUrl) {
17
+ const ctx = globalThis[WORKFLOW_CONTEXT_SYMBOL];
18
+ const workflowName = ctx?.workflowName;
19
+ // Apply dim styling to `workflow/` / `step/` prefixes in the qualified
20
+ // name so the part the user named stands out.
21
+ const nameSegs = (() => {
22
+ if (!workflowName)
23
+ return null;
24
+ const m = workflowName.match(/^(workflow\/|step\/)(.*)$/);
25
+ if (m)
26
+ return [{ dim: m[1] }, { text: m[2] }];
27
+ return [{ text: workflowName }];
28
+ })();
29
+ const contextLine = nameSegs
30
+ ? {
31
+ type: 'plain',
32
+ segments: [
33
+ { text: 'this call was made from the ' },
34
+ ...nameSegs,
35
+ { text: ' workflow context.' },
36
+ ],
37
+ }
38
+ : {
39
+ type: 'plain',
40
+ segments: [{ text: 'this call was made from a workflow context.' }],
41
+ };
42
+ super({
43
+ title: [
44
+ { code: functionName },
45
+ { text: ' cannot be called from a workflow context.' },
46
+ ],
47
+ details: [
48
+ {
49
+ type: 'plain',
50
+ segments: [
51
+ {
52
+ text: 'calling this in a workflow context can cause determinism issues.',
53
+ },
54
+ ],
55
+ },
56
+ contextLine,
57
+ { type: 'docs', url: docsUrl },
58
+ ],
59
+ });
60
+ }
61
+ }
62
+ /**
63
+ * Throw a {@link NotInWorkflowContextError} whose stack trace points at the
64
+ * user code that called `stackStartFn`, not at our framework internals.
65
+ *
66
+ * Prefer this over `throw new NotInWorkflowContextError(...)` so tooling
67
+ * (Next.js error overlay, VS Code terminal linkifier, Sentry, etc.) shows
68
+ * the user's call site as the relevant frame.
69
+ */
70
+ export function throwNotInWorkflowContext(functionName, docsUrl,
71
+ // biome-ignore lint/complexity/noBannedTypes: matches Error.captureStackTrace
72
+ stackStartFn) {
73
+ const err = new NotInWorkflowContextError(functionName, docsUrl);
74
+ redirectStackToCaller(err, stackStartFn);
75
+ throw err;
76
+ }
77
+ /** See {@link throwNotInWorkflowContext}. */
78
+ export function throwNotInStepContext(functionName, docsUrl,
79
+ // biome-ignore lint/complexity/noBannedTypes: matches Error.captureStackTrace
80
+ stackStartFn) {
81
+ const err = new NotInStepContextError(functionName, docsUrl);
82
+ redirectStackToCaller(err, stackStartFn);
83
+ throw err;
84
+ }
85
+ /** See {@link throwNotInWorkflowContext}. */
86
+ export function throwNotInWorkflowOrStepContext(functionName, docsUrl,
87
+ // biome-ignore lint/complexity/noBannedTypes: matches Error.captureStackTrace
88
+ stackStartFn) {
89
+ const err = new NotInWorkflowOrStepContextError(functionName, docsUrl);
90
+ redirectStackToCaller(err, stackStartFn);
91
+ throw err;
92
+ }
93
+ /** See {@link throwNotInWorkflowContext}. */
94
+ export function throwUnavailableInWorkflowContext(functionName, docsUrl,
95
+ // biome-ignore lint/complexity/noBannedTypes: matches Error.captureStackTrace
96
+ stackStartFn) {
97
+ const err = new UnavailableInWorkflowContextError(functionName, docsUrl);
98
+ redirectStackToCaller(err, stackStartFn);
99
+ throw err;
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC1lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUNMLHFCQUFxQixFQUdyQixxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLCtCQUErQixHQUNoQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFDTCx1QkFBdUIsR0FFeEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3Qyx3RUFBd0U7QUFDeEUsNkRBQTZEO0FBQzdELDJFQUEyRTtBQUMzRSw2REFBNkQ7QUFDN0QsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLCtCQUErQixHQUNoQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxpQ0FBa0MsU0FBUSxxQkFBcUI7SUFDMUUsSUFBSSxHQUFHLG1DQUFtQyxDQUFDO0lBRTNDLFlBQVksWUFBb0IsRUFBRSxPQUFnQjtRQUNoRCxNQUFNLEdBQUcsR0FBSSxVQUFrQixDQUFDLHVCQUF1QixDQUUxQyxDQUFDO1FBQ2QsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFLFlBQVksQ0FBQztRQUV2Qyx1RUFBdUU7UUFDdkUsOENBQThDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUM7Z0JBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFVLENBQUM7WUFDdkQsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFVLENBQUM7UUFDM0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVMLE1BQU0sV0FBVyxHQUFXLFFBQVE7WUFDbEMsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRTtvQkFDUixFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRTtvQkFDeEMsR0FBRyxRQUFRO29CQUNYLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFO2lCQUMvQjthQUNGO1lBQ0gsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLDZDQUE2QyxFQUFFLENBQUM7YUFDcEUsQ0FBQztRQUVOLEtBQUssQ0FBQztZQUNKLEtBQUssRUFBRTtnQkFDTCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUU7Z0JBQ3RCLEVBQUUsSUFBSSxFQUFFLDRDQUE0QyxFQUFFO2FBQ3ZEO1lBQ0QsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxPQUFPO29CQUNiLFFBQVEsRUFBRTt3QkFDUjs0QkFDRSxJQUFJLEVBQUUsa0VBQWtFO3lCQUN6RTtxQkFDRjtpQkFDRjtnQkFDRCxXQUFXO2dCQUNYLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsWUFBb0IsRUFDcEIsT0FBZ0I7QUFDaEIsOEVBQThFO0FBQzlFLFlBQXNCO0lBRXRCLE1BQU0sR0FBRyxHQUFHLElBQUkseUJBQXlCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6QyxNQUFNLEdBQUcsQ0FBQztBQUNaLENBQUM7QUFFRCw2Q0FBNkM7QUFDN0MsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxZQUFvQixFQUNwQixPQUFnQjtBQUNoQiw4RUFBOEU7QUFDOUUsWUFBc0I7SUFFdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QscUJBQXFCLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sR0FBRyxDQUFDO0FBQ1osQ0FBQztBQUVELDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsK0JBQStCLENBQzdDLFlBQW9CLEVBQ3BCLE9BQWdCO0FBQ2hCLDhFQUE4RTtBQUM5RSxZQUFzQjtJQUV0QixNQUFNLEdBQUcsR0FBRyxJQUFJLCtCQUErQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekMsTUFBTSxHQUFHLENBQUM7QUFDWixDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsWUFBb0IsRUFDcEIsT0FBZ0I7QUFDaEIsOEVBQThFO0FBQzlFLFlBQXNCO0lBRXRCLE1BQU0sR0FBRyxHQUFHLElBQUksaUNBQWlDLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6QyxNQUFNLEdBQUcsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWRpcmVjdFN0YWNrVG9DYWxsZXIgfSBmcm9tICcuL2NhcHR1cmUtc3RhY2suanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dFZpb2xhdGlvbkVycm9yLFxuICB0eXBlIERldGFpbCxcbiAgdHlwZSBEb2NzVXJsLFxuICBOb3RJblN0ZXBDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IsXG59IGZyb20gJy4vY29udGV4dC12aW9sYXRpb24tZXJyb3IuanMnO1xuaW1wb3J0IHtcbiAgV09SS0ZMT1dfQ09OVEVYVF9TWU1CT0wsXG4gIHR5cGUgV29ya2Zsb3dNZXRhZGF0YSxcbn0gZnJvbSAnLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuXG4vLyBSZS1leHBvcnQgdGhlIHN0cnVjdHVyYWwgYmFzZSArIHN1YmNsYXNzZXMgc28gdGhlIHB1YmxpYyBzdXJmYWNlIGlzIGFcbi8vIHNpbmdsZSBpbXBvcnQgcG9pbnQuIFRoZSBiYXNlICsgc2ltcGxlciBzdWJjbGFzc2VzIGxpdmUgaW5cbi8vIGBjb250ZXh0LXZpb2xhdGlvbi1lcnJvci50c2AgYmVjYXVzZSBgZ2V0LXdvcmtmbG93LW1ldGFkYXRhLnRzYCBuZWVkcyB0b1xuLy8gdGhyb3cgb25lIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlIHdpdGggdGhpcyBmaWxlLlxuZXhwb3J0IHtcbiAgQ29udGV4dFZpb2xhdGlvbkVycm9yLFxuICBOb3RJblN0ZXBDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IsXG59O1xuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIEFQSSB0aGF0IE1VU1QgTk9UIHJ1biBpbnNpZGUgYSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBjYWxsZWRcbiAqIGZyb20gb25lIChlLmcuIGByZXN1bWVIb29rKClgLCB3aGljaCB3b3VsZCBjYXVzZSBkZXRlcm1pbmlzbSBpc3N1ZXMpLlxuICogVGhlIG1lc3NhZ2UgbmFtZXMgdGhlIHNwZWNpZmljIHdvcmtmbG93IHRoYXQgbWFkZSB0aGUgb2ZmZW5kaW5nIGNhbGwuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0RXJyb3IgZXh0ZW5kcyBDb250ZXh0VmlvbGF0aW9uRXJyb3Ige1xuICBuYW1lID0gJ1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvcic7XG5cbiAgY29uc3RydWN0b3IoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIGRvY3NVcmw6IERvY3NVcmwpIHtcbiAgICBjb25zdCBjdHggPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1dPUktGTE9XX0NPTlRFWFRfU1lNQk9MXSBhc1xuICAgICAgfCBXb3JrZmxvd01ldGFkYXRhXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBjdHg/LndvcmtmbG93TmFtZTtcblxuICAgIC8vIEFwcGx5IGRpbSBzdHlsaW5nIHRvIGB3b3JrZmxvdy9gIC8gYHN0ZXAvYCBwcmVmaXhlcyBpbiB0aGUgcXVhbGlmaWVkXG4gICAgLy8gbmFtZSBzbyB0aGUgcGFydCB0aGUgdXNlciBuYW1lZCBzdGFuZHMgb3V0LlxuICAgIGNvbnN0IG5hbWVTZWdzID0gKCgpID0+IHtcbiAgICAgIGlmICghd29ya2Zsb3dOYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IG0gPSB3b3JrZmxvd05hbWUubWF0Y2goL14od29ya2Zsb3dcXC98c3RlcFxcLykoLiopJC8pO1xuICAgICAgaWYgKG0pIHJldHVybiBbeyBkaW06IG1bMV0gfSwgeyB0ZXh0OiBtWzJdIH1dIGFzIGNvbnN0O1xuICAgICAgcmV0dXJuIFt7IHRleHQ6IHdvcmtmbG93TmFtZSB9XSBhcyBjb25zdDtcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgY29udGV4dExpbmU6IERldGFpbCA9IG5hbWVTZWdzXG4gICAgICA/IHtcbiAgICAgICAgICB0eXBlOiAncGxhaW4nLFxuICAgICAgICAgIHNlZ21lbnRzOiBbXG4gICAgICAgICAgICB7IHRleHQ6ICd0aGlzIGNhbGwgd2FzIG1hZGUgZnJvbSB0aGUgJyB9LFxuICAgICAgICAgICAgLi4ubmFtZVNlZ3MsXG4gICAgICAgICAgICB7IHRleHQ6ICcgd29ya2Zsb3cgY29udGV4dC4nIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgdHlwZTogJ3BsYWluJyxcbiAgICAgICAgICBzZWdtZW50czogW3sgdGV4dDogJ3RoaXMgY2FsbCB3YXMgbWFkZSBmcm9tIGEgd29ya2Zsb3cgY29udGV4dC4nIH1dLFxuICAgICAgICB9O1xuXG4gICAgc3VwZXIoe1xuICAgICAgdGl0bGU6IFtcbiAgICAgICAgeyBjb2RlOiBmdW5jdGlvbk5hbWUgfSxcbiAgICAgICAgeyB0ZXh0OiAnIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIHdvcmtmbG93IGNvbnRleHQuJyB9LFxuICAgICAgXSxcbiAgICAgIGRldGFpbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwbGFpbicsXG4gICAgICAgICAgc2VnbWVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogJ2NhbGxpbmcgdGhpcyBpbiBhIHdvcmtmbG93IGNvbnRleHQgY2FuIGNhdXNlIGRldGVybWluaXNtIGlzc3Vlcy4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0TGluZSxcbiAgICAgICAgeyB0eXBlOiAnZG9jcycsIHVybDogZG9jc1VybCB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93IGEge0BsaW5rIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3J9IHdob3NlIHN0YWNrIHRyYWNlIHBvaW50cyBhdCB0aGVcbiAqIHVzZXIgY29kZSB0aGF0IGNhbGxlZCBgc3RhY2tTdGFydEZuYCwgbm90IGF0IG91ciBmcmFtZXdvcmsgaW50ZXJuYWxzLlxuICpcbiAqIFByZWZlciB0aGlzIG92ZXIgYHRocm93IG5ldyBOb3RJbldvcmtmbG93Q29udGV4dEVycm9yKC4uLilgIHNvIHRvb2xpbmdcbiAqIChOZXh0LmpzIGVycm9yIG92ZXJsYXksIFZTIENvZGUgdGVybWluYWwgbGlua2lmaWVyLCBTZW50cnksIGV0Yy4pIHNob3dzXG4gKiB0aGUgdXNlcidzIGNhbGwgc2l0ZSBhcyB0aGUgcmVsZXZhbnQgZnJhbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd05vdEluV29ya2Zsb3dDb250ZXh0KFxuICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgZG9jc1VybDogRG9jc1VybCxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBtYXRjaGVzIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlXG4gIHN0YWNrU3RhcnRGbjogRnVuY3Rpb25cbik6IG5ldmVyIHtcbiAgY29uc3QgZXJyID0gbmV3IE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IoZnVuY3Rpb25OYW1lLCBkb2NzVXJsKTtcbiAgcmVkaXJlY3RTdGFja1RvQ2FsbGVyKGVyciwgc3RhY2tTdGFydEZuKTtcbiAgdGhyb3cgZXJyO1xufVxuXG4vKiogU2VlIHtAbGluayB0aHJvd05vdEluV29ya2Zsb3dDb250ZXh0fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd05vdEluU3RlcENvbnRleHQoXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICBkb2NzVXJsOiBEb2NzVXJsLFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IG1hdGNoZXMgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2VcbiAgc3RhY2tTdGFydEZuOiBGdW5jdGlvblxuKTogbmV2ZXIge1xuICBjb25zdCBlcnIgPSBuZXcgTm90SW5TdGVwQ29udGV4dEVycm9yKGZ1bmN0aW9uTmFtZSwgZG9jc1VybCk7XG4gIHJlZGlyZWN0U3RhY2tUb0NhbGxlcihlcnIsIHN0YWNrU3RhcnRGbik7XG4gIHRocm93IGVycjtcbn1cblxuLyoqIFNlZSB7QGxpbmsgdGhyb3dOb3RJbldvcmtmbG93Q29udGV4dH0uICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dChcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gIGRvY3NVcmw6IERvY3NVcmwsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogbWF0Y2hlcyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZVxuICBzdGFja1N0YXJ0Rm46IEZ1bmN0aW9uXG4pOiBuZXZlciB7XG4gIGNvbnN0IGVyciA9IG5ldyBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yKGZ1bmN0aW9uTmFtZSwgZG9jc1VybCk7XG4gIHJlZGlyZWN0U3RhY2tUb0NhbGxlcihlcnIsIHN0YWNrU3RhcnRGbik7XG4gIHRocm93IGVycjtcbn1cblxuLyoqIFNlZSB7QGxpbmsgdGhyb3dOb3RJbldvcmtmbG93Q29udGV4dH0uICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0KFxuICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgZG9jc1VybDogRG9jc1VybCxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBtYXRjaGVzIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlXG4gIHN0YWNrU3RhcnRGbjogRnVuY3Rpb25cbik6IG5ldmVyIHtcbiAgY29uc3QgZXJyID0gbmV3IFVuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvcihmdW5jdGlvbk5hbWUsIGRvY3NVcmwpO1xuICByZWRpcmVjdFN0YWNrVG9DYWxsZXIoZXJyLCBzdGFja1N0YXJ0Rm4pO1xuICB0aHJvdyBlcnI7XG59XG4iXX0=
@@ -0,0 +1,97 @@
1
+ /**
2
+ * A `docs:` line URL. The leading protocol is part of the type so call sites
3
+ * can't accidentally pass a protocol-relative or bare path.
4
+ */
5
+ export type DocsUrl = `https://${string}`;
6
+ declare const INSPECT_CUSTOM: unique symbol;
7
+ /**
8
+ * Structured data for a framed error. The base class takes this and renders
9
+ * it to plain text (for `.message` / `.stack` / structured logs) or to an
10
+ * ANSI-framed string (for terminal display via `util.inspect` / `toString`).
11
+ *
12
+ * Keeping the pieces structured means we never have to strip ANSI back out
13
+ * once it's in the message — we just don't put it there in the first place.
14
+ */
15
+ export interface FramedContent {
16
+ /** Headline. `{ code: 'foo()' }` segments render as backticked inline code. */
17
+ readonly title: readonly Segment[];
18
+ /** One framed branch per entry. The last uses `╰▶`, others use `├▶`. */
19
+ readonly details: readonly Detail[];
20
+ }
21
+ export type Segment = {
22
+ readonly text: string;
23
+ } | {
24
+ readonly code: string;
25
+ } | {
26
+ readonly dim: string;
27
+ };
28
+ export type Detail = {
29
+ readonly type: 'plain';
30
+ readonly segments: readonly Segment[];
31
+ } | {
32
+ readonly type: 'docs';
33
+ readonly url: DocsUrl;
34
+ };
35
+ export declare function renderPlain(c: FramedContent): string;
36
+ export declare function renderPretty(c: FramedContent): string;
37
+ /**
38
+ * Base class for structured context-violation errors.
39
+ *
40
+ * Design notes:
41
+ *
42
+ * - `.message` is **plain text** (no ANSI escape bytes). Structured logs,
43
+ * log drains, CBOR-serialized event data, and anything else that reads
44
+ * `err.message` / `err.stack` as a string gets clean output — no mojibake
45
+ * in JSON, no `\x1B[...m` noise in Vercel logs.
46
+ *
47
+ * - The ANSI-framed version is rendered **lazily** via `toString()` and
48
+ * `[util.inspect.custom]`. When the error is thrown and Node prints it
49
+ * via `util.inspect`, the user sees the colored, framed box. When it's
50
+ * attached to a structured log field, the consumer sees plain text.
51
+ *
52
+ * - `fatal = true` marks these as non-retryable. Calling `createHook()`
53
+ * from a step function will never succeed no matter how many retries —
54
+ * burning attempts just produces duplicated log output. The runtime's
55
+ * `FatalError.is(err)` gate recognizes any error with `fatal: true`.
56
+ */
57
+ export declare abstract class ContextViolationError extends Error {
58
+ #private;
59
+ /** Non-retryable — see class doc. */
60
+ readonly fatal = true;
61
+ constructor(content: FramedContent);
62
+ /**
63
+ * `console.log(err)` and most Node internals route through `util.inspect`,
64
+ * which respects this symbol. Returning a custom string here means the
65
+ * thrown error prints as a pretty frame in the terminal while `.message`
66
+ * and `.stack` stay plain.
67
+ */
68
+ [INSPECT_CUSTOM](): string;
69
+ toString(): string;
70
+ }
71
+ /**
72
+ * Thrown when an API that must run inside a workflow function is called
73
+ * from outside a workflow context (e.g. from a step function or from
74
+ * regular application code).
75
+ */
76
+ export declare class NotInWorkflowContextError extends ContextViolationError {
77
+ name: string;
78
+ constructor(functionName: string, docsUrl: DocsUrl);
79
+ }
80
+ /**
81
+ * Thrown when an API that must run inside a step function is called from
82
+ * outside a step context.
83
+ */
84
+ export declare class NotInStepContextError extends ContextViolationError {
85
+ name: string;
86
+ constructor(functionName: string, docsUrl: DocsUrl);
87
+ }
88
+ /**
89
+ * Thrown when an API that must run inside either a workflow or step function
90
+ * is called from regular application code.
91
+ */
92
+ export declare class NotInWorkflowOrStepContextError extends ContextViolationError {
93
+ name: string;
94
+ constructor(functionName: string, docsUrl: DocsUrl);
95
+ }
96
+ export {};
97
+ //# sourceMappingURL=context-violation-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-violation-error.d.ts","sourceRoot":"","sources":["../src/context-violation-error.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,WAAW,MAAM,EAAE,CAAC;AAE1C,QAAA,MAAM,cAAc,eAA2C,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,OAAO,GACf;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7B,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,GACjE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;AAwBrD,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAepD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAGrD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8BAAsB,qBAAsB,SAAQ,KAAK;;IACvD,qCAAqC;IACrC,QAAQ,CAAC,KAAK,QAAQ;gBAIV,OAAO,EAAE,aAAa;IAKlC;;;;;OAKG;IACH,CAAC,cAAc,CAAC,IAAI,MAAM;IAgB1B,QAAQ,IAAI,MAAM;CAGnB;AAED;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,qBAAqB;IAClE,IAAI,SAA+B;gBAEvB,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CASnD;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,qBAAqB;IAC9D,IAAI,SAA2B;gBAEnB,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CASnD;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,qBAAqB;IACxE,IAAI,SAAqC;gBAE7B,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CASnD"}
@@ -0,0 +1,149 @@
1
+ import * as Ansi from '@workflow/errors/ansi';
2
+ const INSPECT_CUSTOM = Symbol.for('nodejs.util.inspect.custom');
3
+ function renderSegmentPlain(s) {
4
+ if ('code' in s)
5
+ return `\`${s.code}\``;
6
+ if ('dim' in s)
7
+ return s.dim;
8
+ return s.text;
9
+ }
10
+ function renderSegmentPretty(s) {
11
+ if ('code' in s)
12
+ return Ansi.code(s.code);
13
+ if ('dim' in s)
14
+ return Ansi.dim(s.dim);
15
+ return s.text;
16
+ }
17
+ function renderDetailPlain(d) {
18
+ if (d.type === 'docs')
19
+ return `docs: ${d.url}`;
20
+ return d.segments.map(renderSegmentPlain).join('');
21
+ }
22
+ function renderDetailPretty(d) {
23
+ if (d.type === 'docs')
24
+ return Ansi.docs(d.url);
25
+ return d.segments.map(renderSegmentPretty).join('');
26
+ }
27
+ export function renderPlain(c) {
28
+ // Mimic `Ansi.frame` structure so `.message` is still readable in logs
29
+ // even without the color.
30
+ const title = c.title.map(renderSegmentPlain).join('');
31
+ const lines = [title];
32
+ c.details.forEach((detail, index) => {
33
+ const isLast = index === c.details.length - 1;
34
+ const first = isLast ? '╰▶ ' : '├▶ ';
35
+ const cont = isLast ? ' ' : '│ ';
36
+ const raw = renderDetailPlain(detail).split('\n');
37
+ raw.forEach((line, i) => {
38
+ lines.push(`${i === 0 ? first : cont}${line}`);
39
+ });
40
+ });
41
+ return lines.join('\n');
42
+ }
43
+ export function renderPretty(c) {
44
+ const title = c.title.map(renderSegmentPretty).join('');
45
+ return Ansi.frame(title, c.details.map(renderDetailPretty));
46
+ }
47
+ /**
48
+ * Base class for structured context-violation errors.
49
+ *
50
+ * Design notes:
51
+ *
52
+ * - `.message` is **plain text** (no ANSI escape bytes). Structured logs,
53
+ * log drains, CBOR-serialized event data, and anything else that reads
54
+ * `err.message` / `err.stack` as a string gets clean output — no mojibake
55
+ * in JSON, no `\x1B[...m` noise in Vercel logs.
56
+ *
57
+ * - The ANSI-framed version is rendered **lazily** via `toString()` and
58
+ * `[util.inspect.custom]`. When the error is thrown and Node prints it
59
+ * via `util.inspect`, the user sees the colored, framed box. When it's
60
+ * attached to a structured log field, the consumer sees plain text.
61
+ *
62
+ * - `fatal = true` marks these as non-retryable. Calling `createHook()`
63
+ * from a step function will never succeed no matter how many retries —
64
+ * burning attempts just produces duplicated log output. The runtime's
65
+ * `FatalError.is(err)` gate recognizes any error with `fatal: true`.
66
+ */
67
+ export class ContextViolationError extends Error {
68
+ /** Non-retryable — see class doc. */
69
+ fatal = true;
70
+ #content;
71
+ constructor(content) {
72
+ super(renderPlain(content));
73
+ this.#content = content;
74
+ }
75
+ /**
76
+ * `console.log(err)` and most Node internals route through `util.inspect`,
77
+ * which respects this symbol. Returning a custom string here means the
78
+ * thrown error prints as a pretty frame in the terminal while `.message`
79
+ * and `.stack` stay plain.
80
+ */
81
+ [INSPECT_CUSTOM]() {
82
+ const pretty = renderPretty(this.#content);
83
+ // `stack` starts with `${name}: ${message}\n at ...`. Our message is
84
+ // multi-line (`title\n╰▶ docs: …`), so slicing only the first line glues
85
+ // the framed-detail tail of the message onto the prepended pretty form
86
+ // and renders every detail line twice. Slice past *all* message lines.
87
+ const messageLineCount = this.message.split('\n').length;
88
+ const tail = (this.stack ?? '')
89
+ .split('\n')
90
+ .slice(messageLineCount)
91
+ .join('\n');
92
+ return tail
93
+ ? `${this.name}: ${pretty}\n${tail}`
94
+ : `${this.name}: ${pretty}`;
95
+ }
96
+ toString() {
97
+ return `${this.name}: ${renderPretty(this.#content)}`;
98
+ }
99
+ }
100
+ /**
101
+ * Thrown when an API that must run inside a workflow function is called
102
+ * from outside a workflow context (e.g. from a step function or from
103
+ * regular application code).
104
+ */
105
+ export class NotInWorkflowContextError extends ContextViolationError {
106
+ name = 'NotInWorkflowContextError';
107
+ constructor(functionName, docsUrl) {
108
+ super({
109
+ title: [
110
+ { code: functionName },
111
+ { text: ' can only be called inside a workflow function' },
112
+ ],
113
+ details: [{ type: 'docs', url: docsUrl }],
114
+ });
115
+ }
116
+ }
117
+ /**
118
+ * Thrown when an API that must run inside a step function is called from
119
+ * outside a step context.
120
+ */
121
+ export class NotInStepContextError extends ContextViolationError {
122
+ name = 'NotInStepContextError';
123
+ constructor(functionName, docsUrl) {
124
+ super({
125
+ title: [
126
+ { code: functionName },
127
+ { text: ' can only be called inside a step function' },
128
+ ],
129
+ details: [{ type: 'docs', url: docsUrl }],
130
+ });
131
+ }
132
+ }
133
+ /**
134
+ * Thrown when an API that must run inside either a workflow or step function
135
+ * is called from regular application code.
136
+ */
137
+ export class NotInWorkflowOrStepContextError extends ContextViolationError {
138
+ name = 'NotInWorkflowOrStepContextError';
139
+ constructor(functionName, docsUrl) {
140
+ super({
141
+ title: [
142
+ { code: functionName },
143
+ { text: ' can only be called inside a workflow or step function' },
144
+ ],
145
+ details: [{ type: 'docs', url: docsUrl }],
146
+ });
147
+ }
148
+ }
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC12aW9sYXRpb24tZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC12aW9sYXRpb24tZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSx1QkFBdUIsQ0FBQztBQVE5QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7QUEwQmhFLFNBQVMsa0JBQWtCLENBQUMsQ0FBVTtJQUNwQyxJQUFJLE1BQU0sSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUN4QyxJQUFJLEtBQUssSUFBSSxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxDQUFVO0lBQ3JDLElBQUksTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxDQUFTO0lBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMvQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQVM7SUFDbkMsSUFBSSxDQUFDLENBQUMs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LGlDQUFpQyxDQUFDO0lBRXpDLFlBQVksWUFBb0IsRUFBRSxPQUFnQjtRQUNoRCxLQUFLLENBQUM7WUFDSixLQUFLLEVBQUU7Z0JBQ0wsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO2dCQUN0QixFQUFFLElBQUksRUFBRSx3REFBd0QsRUFBRTthQUNuRTtZQUNELE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQW5zaSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzL2Fuc2knO1xuXG4vKipcbiAqIEEgYGRvY3M6YCBsaW5lIFVSTC4gVGhlIGxlYWRpbmcgcHJvdG9jb2wgaXMgcGFydCBvZiB0aGUgdHlwZSBzbyBjYWxsIHNpdGVzXG4gKiBjYW4ndCBhY2NpZGVudGFsbHkgcGFzcyBhIHByb3RvY29sLXJlbGF0aXZlIG9yIGJhcmUgcGF0aC5cbiAqL1xuZXhwb3J0IHR5cGUgRG9jc1VybCA9IGBodHRwczovLyR7c3RyaW5nfWA7XG5cbmNvbnN0IElOU1BFQ1RfQ1VTVE9NID0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKTtcblxuLyoqXG4gKiBTdHJ1Y3R1cmVkIGRhdGEgZm9yIGEgZnJhbWVkIGVycm9yLiBUaGUgYmFzZSBjbGFzcyB0YWtlcyB0aGlzIGFuZCByZW5kZXJzXG4gKiBpdCB0byBwbGFpbiB0ZXh0IChmb3IgYC5tZXNzYWdlYCAvIGAuc3RhY2tgIC8gc3RydWN0dXJlZCBsb2dzKSBvciB0byBhblxuICogQU5TSS1mcmFtZWQgc3RyaW5nIChmb3IgdGVybWluYWwgZGlzcGxheSB2aWEgYHV0aWwuaW5zcGVjdGAgLyBgdG9TdHJpbmdgKS5cbiAqXG4gKiBLZWVwaW5nIHRoZSBwaWVjZXMgc3RydWN0dXJlZCBtZWFucyB3ZSBuZXZlciBoYXZlIHRvIHN0cmlwIEFOU0kgYmFjayBvdXRcbiAqIG9uY2UgaXQncyBpbiB0aGUgbWVzc2FnZSDigJQgd2UganVzdCBkb24ndCBwdXQgaXQgdGhlcmUgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZyYW1lZENvbnRlbnQge1xuICAvKiogSGVhZGxpbmUuIGB7IGNvZGU6ICdmb28oKScgfWAgc2VnbWVudHMgcmVuZGVyIGFzIGJhY2t0aWNrZWQgaW5saW5lIGNvZGUuICovXG4gIHJlYWRvbmx5IHRpdGxlOiByZWFkb25seSBTZWdtZW50W107XG4gIC8qKiBPbmUgZnJhbWVkIGJyYW5jaCBwZXIgZW50cnkuIFRoZSBsYXN0IHVzZXMgYOKVsOKWtmAsIG90aGVycyB1c2UgYOKUnOKWtmAuICovXG4gIHJlYWRvbmx5IGRldGFpbHM6IHJlYWRvbmx5IERldGFpbFtdO1xufVxuXG5leHBvcnQgdHlwZSBTZWdtZW50ID1cbiAgfCB7IHJlYWRvbmx5IHRleHQ6IHN0cmluZyB9XG4gIHwgeyByZWFkb25seSBjb2RlOiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkgZGltOiBzdHJpbmcgfTtcblxuZXhwb3J0IHR5cGUgRGV0YWlsID1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdwbGFpbic7IHJlYWRvbmx5IHNlZ21lbnRzOiByZWFkb25seSBTZWdtZW50W10gfVxuICB8IHsgcmVhZG9ubHkgdHlwZTogJ2RvY3MnOyByZWFkb25seSB1cmw6IERvY3NVcmwgfTtcblxuZnVuY3Rpb24gcmVuZGVyU2VnbWVudFBsYWluKHM6IFNlZ21lbnQpOiBzdHJpbmcge1xuICBpZiAoJ2NvZGUnIGluIHMpIHJldHVybiBgXFxgJHtzLmNvZGV9XFxgYDtcbiAgaWYgKCdkaW0nIGluIHMpIHJldHVybiBzLmRpbTtcbiAgcmV0dXJuIHMudGV4dDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2VnbWVudFByZXR0eShzOiBTZWdtZW50KTogc3RyaW5nIHtcbiAgaWYgKCdjb2RlJyBpbiBzKSByZXR1cm4gQW5zaS5jb2RlKHMuY29kZSk7XG4gIGlmICgnZGltJyBpbiBzKSByZXR1cm4gQW5zaS5kaW0ocy5kaW0pO1xuICByZXR1cm4gcy50ZXh0O1xufVxuXG5mdW5jdGlvbiByZW5kZXJEZXRhaWxQbGFpbihkOiBEZXRhaWwpOiBzdHJpbmcge1xuICBpZiAoZC50eXBlID09PSAnZG9jcycpIHJldHVybiBgZG9jczogJHtkLnVybH1gO1xuICByZXR1cm4gZC5zZWdtZW50cy5tYXAocmVuZGVyU2VnbWVudFBsYWluKS5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyRGV0YWlsUHJldHR5KGQ6IERldGFpbCk6IHN0cmluZyB7XG4gIGlmIChkLnR5cGUgPT09ICdkb2NzJykgcmV0dXJuIEFuc2kuZG9jcyhkLnVybCk7XG4gIHJldHVybiBkLnNlZ21lbnRzLm1hcChyZW5kZXJTZWdtZW50UHJldHR5KS5qb2luKCcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclBsYWluKGM6IEZyYW1lZENvbnRlbnQpOiBzdHJpbmcge1xuICAvLyBNaW1pYyBgQW5zaS5mcmFtZWAgc3RydWN0dXJlIHNvIGAubWVzc2FnZWAgaXMgc3RpbGwgcmVhZGFibGUgaW4gbG9nc1xuICAvLyBldmVuIHdpdGhvdXQgdGhlIGNvbG9yLlxuICBjb25zdCB0aXRsZSA9IGMudGl0bGUubWFwKHJlbmRlclNlZ21lbnRQbGFpbikuam9pbignJyk7XG4gIGNvbnN0IGxpbmVzID0gW3RpdGxlXTtcbiAgYy5kZXRhaWxzLmZvckVhY2goKGRldGFpbCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gYy5kZXRhaWxzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgZmlyc3QgPSBpc0xhc3QgPyAn4pWw4pa2ICcgOiAn4pSc4pa2ICc7XG4gICAgY29uc3QgY29udCA9IGlzTGFzdCA/ICcgICAnIDogJ+KUgiAgJztcbiAgICBjb25zdCByYXcgPSByZW5kZXJEZXRhaWxQbGFpbihkZXRhaWwpLnNwbGl0KCdcXG4nKTtcbiAgICByYXcuZm9yRWFjaCgobGluZSwgaSkgPT4ge1xuICAgICAgbGluZXMucHVzaChgJHtpID09PSAwID8gZmlyc3QgOiBjb250fSR7bGluZX1gKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByZXR0eShjOiBGcmFtZWRDb250ZW50KTogc3RyaW5nIHtcbiAgY29uc3QgdGl0bGUgPSBjLnRpdGxlLm1hcChyZW5kZXJTZWdtZW50UHJldHR5KS5qb2luKCcnKTtcbiAgcmV0dXJuIEFuc2kuZnJhbWUodGl0bGUsIGMuZGV0YWlscy5tYXAocmVuZGVyRGV0YWlsUHJldHR5KSk7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3Igc3RydWN0dXJlZCBjb250ZXh0LXZpb2xhdGlvbiBlcnJvcnMuXG4gKlxuICogRGVzaWduIG5vdGVzOlxuICpcbiAqIC0gYC5tZXNzYWdlYCBpcyAqKnBsYWluIHRleHQqKiAobm8gQU5TSSBlc2NhcGUgYnl0ZXMpLiBTdHJ1Y3R1cmVkIGxvZ3MsXG4gKiAgIGxvZyBkcmFpbnMsIENCT1Itc2VyaWFsaXplZCBldmVudCBkYXRhLCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IHJlYWRzXG4gKiAgIGBlcnIubWVzc2FnZWAgLyBgZXJyLnN0YWNrYCBhcyBhIHN0cmluZyBnZXRzIGNsZWFuIG91dHB1dCDigJQgbm8gbW9qaWJha2VcbiAqICAgaW4gSlNPTiwgbm8gYFxceDFCWy4uLm1gIG5vaXNlIGluIFZlcmNlbCBsb2dzLlxuICpcbiAqIC0gVGhlIEFOU0ktZnJhbWVkIHZlcnNpb24gaXMgcmVuZGVyZWQgKipsYXppbHkqKiB2aWEgYHRvU3RyaW5nKClgIGFuZFxuICogICBgW3V0aWwuaW5zcGVjdC5jdXN0b21dYC4gV2hlbiB0aGUgZXJyb3IgaXMgdGhyb3duIGFuZCBOb2RlIHByaW50cyBpdFxuICogICB2aWEgYHV0aWwuaW5zcGVjdGAsIHRoZSB1c2VyIHNlZXMgdGhlIGNvbG9yZWQsIGZyYW1lZCBib3guIFdoZW4gaXQnc1xuICogICBhdHRhY2hlZCB0byBhIHN0cnVjdHVyZWQgbG9nIGZpZWxkLCB0aGUgY29uc3VtZXIgc2VlcyBwbGFpbiB0ZXh0LlxuICpcbiAqIC0gYGZhdGFsID0gdHJ1ZWAgbWFya3MgdGhlc2UgYXMgbm9uLXJldHJ5YWJsZS4gQ2FsbGluZyBgY3JlYXRlSG9vaygpYFxuICogICBmcm9tIGEgc3RlcCBmdW5jdGlvbiB3aWxsIG5ldmVyIHN1Y2NlZWQgbm8gbWF0dGVyIGhvdyBtYW55IHJldHJpZXMg4oCUXG4gKiAgIGJ1cm5pbmcgYXR0ZW1wdHMganVzdCBwcm9kdWNlcyBkdXBsaWNhdGVkIGxvZyBvdXRwdXQuIFRoZSBydW50aW1lJ3NcbiAqICAgYEZhdGFsRXJyb3IuaXMoZXJyKWAgZ2F0ZSByZWNvZ25pemVzIGFueSBlcnJvciB3aXRoIGBmYXRhbDogdHJ1ZWAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250ZXh0VmlvbGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKiBOb24tcmV0cnlhYmxlIOKAlCBzZWUgY2xhc3MgZG9jLiAqL1xuICByZWFkb25seSBmYXRhbCA9IHRydWU7XG5cbiAgcmVhZG9ubHkgI2NvbnRlbnQ6IEZyYW1lZENvbnRlbnQ7XG5cbiAgY29uc3RydWN0b3IoY29udGVudDogRnJhbWVkQ29udGVudCkge1xuICAgIHN1cGVyKHJlbmRlclBsYWluKGNvbnRlbnQpKTtcbiAgICB0aGlzLiNjb250ZW50ID0gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBgY29uc29sZS5sb2coZXJyKWAgYW5kIG1vc3QgTm9kZSBpbnRlcm5hbHMgcm91dGUgdGhyb3VnaCBgdXRpbC5pbnNwZWN0YCxcbiAgICogd2hpY2ggcmVzcGVjdHMgdGhpcyBzeW1ib2wuIFJldHVybmluZyBhIGN1c3RvbSBzdHJpbmcgaGVyZSBtZWFucyB0aGVcbiAgICogdGhyb3duIGVycm9yIHByaW50cyBhcyBhIHByZXR0eSBmcmFtZSBpbiB0aGUgdGVybWluYWwgd2hpbGUgYC5tZXNzYWdlYFxuICAgKiBhbmQgYC5zdGFja2Agc3RheSBwbGFpbi5cbiAgICovXG4gIFtJTlNQRUNUX0NVU1RPTV0oKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmV0dHkgPSByZW5kZXJQcmV0dHkodGhpcy4jY29udGVudCk7XG4gICAgLy8gYHN0YWNrYCBzdGFydHMgd2l0aCBgJHtuYW1lfTogJHttZXNzYWdlfVxcbiAgICBhdCAuLi5gLiBPdXIgbWVzc2FnZSBpc1xuICAgIC8vIG11bHRpLWxpbmUgKGB0aXRsZVxcbuKVsOKWtiBkb2NzOiDigKZgKSwgc28gc2xpY2luZyBvbmx5IHRoZSBmaXJzdCBsaW5lIGdsdWVzXG4gICAgLy8gdGhlIGZyYW1lZC1kZXRhaWwgdGFpbCBvZiB0aGUgbWVzc2FnZSBvbnRvIHRoZSBwcmVwZW5kZWQgcHJldHR5IGZvcm1cbiAgICAvLyBhbmQgcmVuZGVycyBldmVyeSBkZXRhaWwgbGluZSB0d2ljZS4gU2xpY2UgcGFzdCAqYWxsKiBtZXNzYWdlIGxpbmVzLlxuICAgIGNvbnN0IG1lc3NhZ2VMaW5lQ291bnQgPSB0aGlzLm1lc3NhZ2Uuc3BsaXQoJ1xcbicpLmxlbmd0aDtcbiAgICBjb25zdCB0YWlsID0gKHRoaXMuc3RhY2sgPz8gJycpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuc2xpY2UobWVzc2FnZUxpbmVDb3VudClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gdGFpbFxuICAgICAgPyBgJHt0aGlzLm5hbWV9OiAke3ByZXR0eX1cXG4ke3RhaWx9YFxuICAgICAgOiBgJHt0aGlzLm5hbWV9OiAke3ByZXR0eX1gO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5uYW1lfTogJHtyZW5kZXJQcmV0dHkodGhpcy4jY29udGVudCl9YDtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIEFQSSB0aGF0IG11c3QgcnVuIGluc2lkZSBhIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGNhbGxlZFxuICogZnJvbSBvdXRzaWRlIGEgd29ya2Zsb3cgY29udGV4dCAoZS5nLiBmcm9tIGEgc3RlcCBmdW5jdGlvbiBvciBmcm9tXG4gKiByZWd1bGFyIGFwcGxpY2F0aW9uIGNvZGUpLlxuICovXG5leHBvcnQgY2xhc3MgTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvciBleHRlbmRzIENvbnRleHRWaW9sYXRpb25FcnJvciB7XG4gIG5hbWUgPSAnTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvcic7XG5cbiAgY29uc3RydWN0b3IoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIGRvY3NVcmw6IERvY3NVcmwpIHtcbiAgICBzdXBlcih7XG4gICAgICB0aXRsZTogW1xuICAgICAgICB7IGNvZGU6IGZ1bmN0aW9uTmFtZSB9LFxuICAgICAgICB7IHRleHQ6ICcgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBhIHdvcmtmbG93IGZ1bmN0aW9uJyB9LFxuICAgICAgXSxcbiAgICAgIGRldGFpbHM6IFt7IHR5cGU6ICdkb2NzJywgdXJsOiBkb2NzVXJsIH1dLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYW4gQVBJIHRoYXQgbXVzdCBydW4gaW5zaWRlIGEgc3RlcCBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbVxuICogb3V0c2lkZSBhIHN0ZXAgY29udGV4dC5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEluU3RlcENvbnRleHRFcnJvciBleHRlbmRzIENvbnRleHRWaW9sYXRpb25FcnJvciB7XG4gIG5hbWUgPSAnTm90SW5TdGVwQ29udGV4dEVycm9yJztcblxuICBjb25zdHJ1Y3RvcihmdW5jdGlvbk5hbWU6IHN0cmluZywgZG9jc1VybDogRG9jc1VybCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHRpdGxlOiBbXG4gICAgICAgIHsgY29kZTogZnVuY3Rpb25OYW1lIH0sXG4gICAgICAgIHsgdGV4dDogJyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgc3RlcCBmdW5jdGlvbicgfSxcbiAgICAgIF0sXG4gICAgICBkZXRhaWxzOiBbeyB0eXBlOiAnZG9jcycsIHVybDogZG9jc1VybCB9XSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIEFQSSB0aGF0IG11c3QgcnVuIGluc2lkZSBlaXRoZXIgYSB3b3JrZmxvdyBvciBzdGVwIGZ1bmN0aW9uXG4gKiBpcyBjYWxsZWQgZnJvbSByZWd1bGFyIGFwcGxpY2F0aW9uIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yIGV4dGVuZHMgQ29udGV4dFZpb2xhdGlvbkVycm9yIHtcbiAgbmFtZSA9ICdOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yJztcblxuICBjb25zdHJ1Y3RvcihmdW5jdGlvbk5hbWU6IHN0cmluZywgZG9jc1VybDogRG9jc1VybCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHRpdGxlOiBbXG4gICAgICAgIHsgY29kZTogZnVuY3Rpb25OYW1lIH0sXG4gICAgICAgIHsgdGV4dDogJyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgd29ya2Zsb3cgb3Igc3RlcCBmdW5jdGlvbicgfSxcbiAgICAgIF0sXG4gICAgICBkZXRhaWxzOiBbeyB0eXBlOiAnZG9jcycsIHVybDogZG9jc1VybCB9XSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Correlation-id generation for the entity families a replay can create.
3
+ *
4
+ * Correlation ids are minted by the workflow VM and are the server's identity
5
+ * gate: a conditional create on the id is what makes a duplicate write from a
6
+ * second live replay idempotent instead of additive. That only works if two
7
+ * replays of the same run mint the same id for the same entity.
8
+ *
9
+ * Historically every id was the Nth draw of *one* monotonic ULID sequence per
10
+ * run, shared by steps, waits, hooks, attribute writes, abort controllers and
11
+ * stream ids alike. Every id was therefore an ordinal over the whole run, and a
12
+ * single extra draw of any kind renumbered every entity of every kind after it.
13
+ * Two replays that agreed about every step but disagreed about one `sleep()`
14
+ * would mint different ids for all subsequent steps, so their writes appended
15
+ * side by side instead of colliding, and the settled log ended up holding two
16
+ * names for one logical step. Only one of them can be consumed on the next
17
+ * replay; the other is fatal (`onUnconsumedEvent`).
18
+ *
19
+ * Per-kind sources narrow that coupling to one kind at a time: each family
20
+ * draws from its own independent incrementing sequence, so a disagreement about
21
+ * how many hooks or sleeps were created no longer renames steps.
22
+ *
23
+ * Ids stay syntactically valid ULIDs (10 Crockford characters of
24
+ * `fixedTimestamp` plus 16 of body), because correlation ids are validated as
25
+ * prefixed 26-char ULIDs by the backend, and they stay monotonic *within* a
26
+ * kind, because `hooks.list` is ordered by hook id.
27
+ *
28
+ * Monotonicity is per kind, and two kinds mint `hook_` ids (`hook` and
29
+ * `abortHook`), so listing order is only creation order *within* each of them.
30
+ * No world filters system hooks out of a listing, so a run that constructs an
31
+ * abort controller and also creates its own hooks lists that system hook at a
32
+ * position decided by its kind's hash rather than at its creation position.
33
+ * Order among the user's own hooks is unaffected.
34
+ *
35
+ * This does not make ids independent of *ordinal position within their own
36
+ * kind*: two replays that disagree about how many steps ran still mint
37
+ * different ids for the next step. That is a narrower failure than the shared
38
+ * sequence's, not an eliminated one.
39
+ */
40
+ /** Entity families that draw correlation ids, each from its own sequence. */
41
+ export type CorrelationIdKind =
42
+ /** `step_` ids, one per step invocation. */
43
+ 'step'
44
+ /** `wait_` ids, one per `sleep()`. */
45
+ | 'wait'
46
+ /** `hook_` ids for hooks created by workflow code. */
47
+ | 'hook'
48
+ /** `attr_` ids, one per attribute write. */
49
+ | 'attr'
50
+ /**
51
+ * The abort controller's own id, which becomes its stream name and hook
52
+ * token. Separate from `hook` so constructing an abort controller does not
53
+ * renumber later user hooks.
54
+ */
55
+ | 'abort'
56
+ /** `hook_` ids for the internal system hook backing an abort controller. */
57
+ | 'abortHook'
58
+ /**
59
+ * Ids minted during serialization (`STABLE_ULID`): stream names, and an abort
60
+ * holder's stream name and `abrt_` hook token when it reaches serialization
61
+ * without an identity yet (`reduceAbortWithListener`), which is why `abort`
62
+ * above is not the only mint path for an abort identity. Not correlation ids,
63
+ * but they drew from the same shared sequence, so a workflow that serialized
64
+ * a stream renumbered every entity created after it.
65
+ */
66
+ | 'stream';
67
+ /** Mints the ULID body of a correlation id for one entity family. */
68
+ export type CorrelationIdGenerator = (kind: CorrelationIdKind) => string;
69
+ /**
70
+ * Builds a replay's correlation-id generator.
71
+ *
72
+ * `perKind: false` returns the run's single shared monotonic sequence and
73
+ * ignores the kind entirely, so both schemes go through one call path and the
74
+ * flag is the only difference between them.
75
+ */
76
+ export declare function createCorrelationIdGenerator(options: {
77
+ /**
78
+ * The run's replay-stable seed. Must not vary between replays of one run, and
79
+ * must differ between runs, or two runs would mint identical ids.
80
+ */
81
+ seed: string;
82
+ fixedTimestamp: number;
83
+ /** The run's shared monotonic sequence, used as-is when `perKind` is false. */
84
+ positional: () => string;
85
+ perKind: boolean;
86
+ }): CorrelationIdGenerator;
87
+ /** Length of a ULID, exported so tests need not restate it. */
88
+ export declare const CORRELATION_ID_LENGTH: number;
89
+ /**
90
+ * Whether each entity family draws correlation ids from its own sequence rather
91
+ * than from one sequence shared by the whole run. Off unless opted in, so an SDK
92
+ * upgrade alone never moves a run between schemes.
93
+ *
94
+ * The invariant either way: a run must replay under the scheme that minted its
95
+ * ids. A replay under the other scheme mints ids its own earlier events do not
96
+ * carry, so it can consume none of them and fails the run. Two things can break
97
+ * it, and both are about turning the flag on rather than about upgrading:
98
+ *
99
+ * - Enabling it while runs are in flight. On Vercel, skew protection keeps a run
100
+ * on the deployment that started it, so a run only ever sees the value baked
101
+ * into its own deployment. Elsewhere (world-postgres, world-local, a
102
+ * self-hosted process) nothing pins a run to the code that started it, so
103
+ * enable it during a quiet window.
104
+ * - A rolling deploy that leaves both values live, which puts two schemes on one
105
+ * run concurrently — the side-by-side append this whole mechanism exists to
106
+ * avoid. Roll the value out to the whole fleet at once.
107
+ */
108
+ export declare function isPerKindCorrelationIdsEnabled(): boolean;
109
+ //# sourceMappingURL=correlation-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation-id.d.ts","sourceRoot":"","sources":["../src/correlation-id.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,iBAAiB;AAC3B,4CAA4C;AAC1C,MAAM;AACR,sCAAsC;GACpC,MAAM;AACR,sDAAsD;GACpD,MAAM;AACR,4CAA4C;GAC1C,MAAM;AACR;;;;GAIG;GACD,OAAO;AACT,4EAA4E;GAC1E,WAAW;AACb;;;;;;;GAOG;GACD,QAAQ,CAAC;AAEb,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC;AAoGzE;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,sBAAsB,CAmBzB;AAED,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,QAA0B,CAAC;AAE7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD"}