@workflow/core 5.0.0-beta.3 → 5.0.0-beta.31

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 (268) 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 +22 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +41 -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 +103 -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 +147 -0
  22. package/dist/create-hook.d.ts +42 -3
  23. package/dist/create-hook.d.ts.map +1 -1
  24. package/dist/create-hook.js +4 -3
  25. package/dist/define-hook.d.ts.map +1 -1
  26. package/dist/define-hook.js +20 -5
  27. package/dist/describe-error.d.ts +70 -0
  28. package/dist/describe-error.d.ts.map +1 -0
  29. package/dist/describe-error.js +165 -0
  30. package/dist/encryption.d.ts +22 -1
  31. package/dist/encryption.d.ts.map +1 -1
  32. package/dist/encryption.js +72 -27
  33. package/dist/events-consumer.d.ts +25 -1
  34. package/dist/events-consumer.d.ts.map +1 -1
  35. package/dist/events-consumer.js +95 -16
  36. package/dist/flushable-stream.d.ts +10 -10
  37. package/dist/flushable-stream.d.ts.map +1 -1
  38. package/dist/flushable-stream.js +26 -15
  39. package/dist/global.d.ts +35 -1
  40. package/dist/global.d.ts.map +1 -1
  41. package/dist/global.js +21 -3
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -1
  45. package/dist/log-format.d.ts +25 -0
  46. package/dist/log-format.d.ts.map +1 -0
  47. package/dist/log-format.js +250 -0
  48. package/dist/logger.d.ts +29 -30
  49. package/dist/logger.d.ts.map +1 -1
  50. package/dist/logger.js +82 -32
  51. package/dist/private.d.ts +107 -2
  52. package/dist/private.d.ts.map +1 -1
  53. package/dist/private.js +80 -3
  54. package/dist/runtime/constants.d.ts +189 -0
  55. package/dist/runtime/constants.d.ts.map +1 -1
  56. package/dist/runtime/constants.js +310 -15
  57. package/dist/runtime/get-port-lazy.d.ts +25 -0
  58. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  59. package/dist/runtime/get-port-lazy.js +92 -0
  60. package/dist/runtime/get-world-lazy.d.ts +23 -0
  61. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  62. package/dist/runtime/get-world-lazy.js +46 -0
  63. package/dist/runtime/helpers.d.ts +57 -6
  64. package/dist/runtime/helpers.d.ts.map +1 -1
  65. package/dist/runtime/helpers.js +169 -32
  66. package/dist/runtime/replay-budget.d.ts +98 -0
  67. package/dist/runtime/replay-budget.d.ts.map +1 -0
  68. package/dist/runtime/replay-budget.js +192 -0
  69. package/dist/runtime/resume-hook.d.ts.map +1 -1
  70. package/dist/runtime/resume-hook.js +39 -23
  71. package/dist/runtime/run-id-time.d.ts +10 -0
  72. package/dist/runtime/run-id-time.d.ts.map +1 -0
  73. package/dist/runtime/run-id-time.js +31 -0
  74. package/dist/runtime/run.d.ts +6 -2
  75. package/dist/runtime/run.d.ts.map +1 -1
  76. package/dist/runtime/run.js +52 -10
  77. package/dist/runtime/runs.d.ts +36 -2
  78. package/dist/runtime/runs.d.ts.map +1 -1
  79. package/dist/runtime/runs.js +18 -7
  80. package/dist/runtime/start.d.ts +58 -1
  81. package/dist/runtime/start.d.ts.map +1 -1
  82. package/dist/runtime/start.js +160 -46
  83. package/dist/runtime/step-executor.d.ts +131 -0
  84. package/dist/runtime/step-executor.d.ts.map +1 -0
  85. package/dist/runtime/step-executor.js +818 -0
  86. package/dist/runtime/step-handler.d.ts.map +1 -1
  87. package/dist/runtime/step-handler.js +718 -557
  88. package/dist/runtime/step-latency.d.ts +131 -0
  89. package/dist/runtime/step-latency.d.ts.map +1 -0
  90. package/dist/runtime/step-latency.js +155 -0
  91. package/dist/runtime/step-ownership.d.ts +72 -0
  92. package/dist/runtime/step-ownership.d.ts.map +1 -0
  93. package/dist/runtime/step-ownership.js +114 -0
  94. package/dist/runtime/step-single-flight.d.ts +12 -0
  95. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  96. package/dist/runtime/step-single-flight.js +69 -0
  97. package/dist/runtime/suspension-handler.d.ts +81 -7
  98. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  99. package/dist/runtime/suspension-handler.js +355 -137
  100. package/dist/runtime/wait-continuation.d.ts +84 -0
  101. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  102. package/dist/runtime/wait-continuation.js +105 -0
  103. package/dist/runtime/wait-until.d.ts +18 -0
  104. package/dist/runtime/wait-until.d.ts.map +1 -0
  105. package/dist/runtime/wait-until.js +42 -0
  106. package/dist/runtime/world-compatibility.d.ts +5 -0
  107. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  108. package/dist/runtime/world-compatibility.js +12 -0
  109. package/dist/runtime/world-init.d.ts +50 -0
  110. package/dist/runtime/world-init.d.ts.map +1 -0
  111. package/dist/runtime/world-init.js +50 -0
  112. package/dist/runtime/world-target.d.ts +11 -0
  113. package/dist/runtime/world-target.d.ts.map +1 -0
  114. package/dist/runtime/world-target.js +15 -0
  115. package/dist/runtime/world.d.ts +21 -9
  116. package/dist/runtime/world.d.ts.map +1 -1
  117. package/dist/runtime/world.js +58 -83
  118. package/dist/runtime.d.ts +15 -10
  119. package/dist/runtime.d.ts.map +1 -1
  120. package/dist/runtime.js +1757 -326
  121. package/dist/schemas.d.ts +1 -1
  122. package/dist/schemas.d.ts.map +1 -1
  123. package/dist/schemas.js +1 -1
  124. package/dist/serialization/client.d.ts +17 -0
  125. package/dist/serialization/client.d.ts.map +1 -0
  126. package/dist/serialization/client.js +48 -0
  127. package/dist/serialization/codec-devalue.d.ts +14 -0
  128. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  129. package/dist/serialization/codec-devalue.js +98 -0
  130. package/dist/serialization/codec.d.ts +106 -0
  131. package/dist/serialization/codec.d.ts.map +1 -0
  132. package/dist/serialization/codec.js +17 -0
  133. package/dist/serialization/compression.d.ts +104 -0
  134. package/dist/serialization/compression.d.ts.map +1 -0
  135. package/dist/serialization/compression.js +260 -0
  136. package/dist/serialization/encryption.d.ts +33 -0
  137. package/dist/serialization/encryption.d.ts.map +1 -0
  138. package/dist/serialization/encryption.js +70 -0
  139. package/dist/serialization/errors.d.ts +34 -0
  140. package/dist/serialization/errors.d.ts.map +1 -0
  141. package/dist/serialization/errors.js +59 -0
  142. package/dist/serialization/format.d.ts +60 -0
  143. package/dist/serialization/format.d.ts.map +1 -0
  144. package/dist/serialization/format.js +97 -0
  145. package/dist/serialization/index.d.ts +19 -0
  146. package/dist/serialization/index.d.ts.map +1 -0
  147. package/dist/serialization/index.js +22 -0
  148. package/dist/serialization/reducers/class.d.ts +11 -0
  149. package/dist/serialization/reducers/class.d.ts.map +1 -0
  150. package/dist/serialization/reducers/class.js +68 -0
  151. package/dist/serialization/reducers/common.d.ts +16 -0
  152. package/dist/serialization/reducers/common.d.ts.map +1 -0
  153. package/dist/serialization/reducers/common.js +417 -0
  154. package/dist/serialization/reducers/step-function.d.ts +35 -0
  155. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  156. package/dist/serialization/reducers/step-function.js +88 -0
  157. package/dist/serialization/step.d.ts +17 -0
  158. package/dist/serialization/step.d.ts.map +1 -0
  159. package/dist/serialization/step.js +48 -0
  160. package/dist/serialization/types.d.ts +253 -0
  161. package/dist/serialization/types.d.ts.map +1 -0
  162. package/dist/serialization/types.js +25 -0
  163. package/dist/serialization/workflow.d.ts +29 -0
  164. package/dist/serialization/workflow.d.ts.map +1 -0
  165. package/dist/serialization/workflow.js +54 -0
  166. package/dist/serialization-format.d.ts +16 -0
  167. package/dist/serialization-format.d.ts.map +1 -1
  168. package/dist/serialization-format.js +213 -50
  169. package/dist/serialization.d.ts +322 -214
  170. package/dist/serialization.d.ts.map +1 -1
  171. package/dist/serialization.js +1575 -664
  172. package/dist/set-attributes.d.ts +18 -0
  173. package/dist/set-attributes.d.ts.map +1 -0
  174. package/dist/set-attributes.js +61 -0
  175. package/dist/sleep.d.ts.map +1 -1
  176. package/dist/sleep.js +3 -2
  177. package/dist/source-map.d.ts +5 -0
  178. package/dist/source-map.d.ts.map +1 -1
  179. package/dist/source-map.js +102 -10
  180. package/dist/step/context-storage.d.ts +53 -0
  181. package/dist/step/context-storage.d.ts.map +1 -1
  182. package/dist/step/context-storage.js +1 -1
  183. package/dist/step/get-closure-vars.d.ts.map +1 -1
  184. package/dist/step/get-closure-vars.js +3 -2
  185. package/dist/step/get-step-metadata.d.ts.map +1 -1
  186. package/dist/step/get-step-metadata.js +3 -2
  187. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  188. package/dist/step/get-workflow-metadata.js +3 -2
  189. package/dist/step/writable-stream.d.ts.map +1 -1
  190. package/dist/step/writable-stream.js +58 -6
  191. package/dist/step-hydration-cache.d.ts +148 -0
  192. package/dist/step-hydration-cache.d.ts.map +1 -0
  193. package/dist/step-hydration-cache.js +171 -0
  194. package/dist/step.d.ts.map +1 -1
  195. package/dist/step.js +144 -25
  196. package/dist/symbols.d.ts +28 -0
  197. package/dist/symbols.d.ts.map +1 -1
  198. package/dist/symbols.js +29 -1
  199. package/dist/telemetry/semantic-conventions.d.ts +98 -2
  200. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  201. package/dist/telemetry/semantic-conventions.js +66 -1
  202. package/dist/telemetry.d.ts +68 -0
  203. package/dist/telemetry.d.ts.map +1 -1
  204. package/dist/telemetry.js +106 -4
  205. package/dist/types.d.ts +6 -0
  206. package/dist/types.d.ts.map +1 -1
  207. package/dist/types.js +23 -1
  208. package/dist/util.d.ts +16 -6
  209. package/dist/util.d.ts.map +1 -1
  210. package/dist/util.js +25 -16
  211. package/dist/version.d.ts +1 -1
  212. package/dist/version.d.ts.map +1 -1
  213. package/dist/version.js +2 -2
  214. package/dist/vm/index.d.ts.map +1 -1
  215. package/dist/vm/index.js +3 -2
  216. package/dist/vm/script-cache.d.ts +28 -0
  217. package/dist/vm/script-cache.d.ts.map +1 -0
  218. package/dist/vm/script-cache.js +140 -0
  219. package/dist/workflow/abort-controller.d.ts +65 -0
  220. package/dist/workflow/abort-controller.d.ts.map +1 -0
  221. package/dist/workflow/abort-controller.js +277 -0
  222. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  223. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  224. package/dist/workflow/attribute-dispatcher.js +48 -0
  225. package/dist/workflow/create-hook.d.ts.map +1 -1
  226. package/dist/workflow/create-hook.js +25 -3
  227. package/dist/workflow/define-hook.d.ts +1 -1
  228. package/dist/workflow/define-hook.d.ts.map +1 -1
  229. package/dist/workflow/define-hook.js +8 -4
  230. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  231. package/dist/workflow/get-workflow-metadata.js +14 -3
  232. package/dist/workflow/hook.d.ts.map +1 -1
  233. package/dist/workflow/hook.js +207 -33
  234. package/dist/workflow/index.d.ts +1 -0
  235. package/dist/workflow/index.d.ts.map +1 -1
  236. package/dist/workflow/index.js +5 -3
  237. package/dist/workflow/set-attributes.d.ts +77 -0
  238. package/dist/workflow/set-attributes.d.ts.map +1 -0
  239. package/dist/workflow/set-attributes.js +65 -0
  240. package/dist/workflow/sleep.d.ts.map +1 -1
  241. package/dist/workflow/sleep.js +45 -8
  242. package/dist/workflow/world-init-stub.d.ts +15 -0
  243. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  244. package/dist/workflow/world-init-stub.js +15 -0
  245. package/dist/workflow.d.ts +17 -1
  246. package/dist/workflow.d.ts.map +1 -1
  247. package/dist/workflow.js +190 -56
  248. package/docs/api-reference/create-hook.mdx +38 -0
  249. package/docs/api-reference/create-webhook.mdx +1 -0
  250. package/docs/api-reference/fetch.mdx +5 -0
  251. package/docs/api-reference/index.mdx +3 -0
  252. package/docs/api-reference/set-attributes.mdx +65 -0
  253. package/docs/foundations/cancellation.mdx +459 -0
  254. package/docs/foundations/errors-and-retries.mdx +7 -3
  255. package/docs/foundations/hooks.mdx +29 -0
  256. package/docs/foundations/idempotency.mdx +236 -11
  257. package/docs/foundations/index.mdx +1 -23
  258. package/docs/foundations/meta.json +3 -1
  259. package/docs/foundations/serialization.mdx +77 -41
  260. package/docs/foundations/starting-workflows.mdx +5 -1
  261. package/docs/foundations/streaming.mdx +14 -23
  262. package/docs/foundations/versioning.mdx +263 -0
  263. package/docs/how-it-works/cancellation.mdx +287 -0
  264. package/docs/how-it-works/code-transform.mdx +2 -2
  265. package/docs/how-it-works/encryption.mdx +2 -2
  266. package/docs/how-it-works/event-sourcing.mdx +2 -2
  267. package/docs/how-it-works/meta.json +2 -1
  268. package/package.json +32 -11
@@ -1,4 +1,193 @@
1
1
  export declare const MAX_QUEUE_DELIVERIES = 48;
2
+ /**
3
+ * Effective max queue deliveries. Override via `WORKFLOW_MAX_QUEUE_DELIVERIES`.
4
+ */
5
+ export declare function getMaxQueueDeliveries(): number;
6
+ /**
7
+ * Default maximum time allowed for the *replay* portion of a single workflow
8
+ * handler invocation (in ms). This budget only covers deterministic-replay
9
+ * and workflow-VM execution between step boundaries — inline step bodies
10
+ * (`"use step"` functions invoked via `executeStep`) do NOT count against
11
+ * it. Step bodies are bounded separately by the platform's function
12
+ * `maxDuration` (e.g. 800s on Vercel Pro Fluid) and `NO_INLINE_REPLAY_AFTER_MS`.
13
+ *
14
+ * If the non-step ("replay") time within a single invocation exceeds this
15
+ * budget, the handler exits so the queue can retry. After
16
+ * `REPLAY_TIMEOUT_MAX_RETRIES` exhausted attempts the run is failed with
17
+ * `RUN_ERROR_CODES.REPLAY_TIMEOUT`.
18
+ *
19
+ * Note that on Vercel Hobby (standard functions), the platform `maxDuration`
20
+ * is 60s — well below this budget, so the platform SIGTERM will fire first
21
+ * and the queue will re-deliver until the visibility window expires. With
22
+ * Fluid Compute on Hobby the per-function ceiling rises to 300s, still
23
+ * under the default budget.
24
+ *
25
+ * Override via the `WORKFLOW_REPLAY_TIMEOUT_MS` env var (clamped to
26
+ * `MIN_REPLAY_TIMEOUT_MS`..`MAX_REPLAY_TIMEOUT_MS`).
27
+ */
2
28
  export declare const REPLAY_TIMEOUT_MS = 240000;
29
+ /** Lower bound for the replay-timeout env var override. */
30
+ export declare const MIN_REPLAY_TIMEOUT_MS = 30000;
31
+ /**
32
+ * Upper bound for the replay-timeout env var override. 780s leaves ≥20s of
33
+ * headroom under Vercel Pro Fluid's 800s function ceiling so the handler
34
+ * can write `run_failed` before SIGTERM.
35
+ */
36
+ export declare const MAX_REPLAY_TIMEOUT_MS = 780000;
37
+ /**
38
+ * Resolve the effective replay-timeout budget for the current process.
39
+ *
40
+ * Reads `process.env.WORKFLOW_REPLAY_TIMEOUT_MS` lazily so tests and
41
+ * deployments can override per invocation. Invalid / out-of-range values
42
+ * fall back to a safe value (no throw — the env var is an escape hatch,
43
+ * not a hard requirement) and emit a one-time warning so misconfiguration
44
+ * is observable.
45
+ */
46
+ export declare function getReplayTimeoutMs(): number;
47
+ /**
48
+ * Reset the warn-once cache. Test-only — exported so unit tests can
49
+ * exercise the warn path repeatedly without sharing state.
50
+ *
51
+ * @internal
52
+ */
53
+ export declare function _resetReplayTimeoutWarnCacheForTests(): void;
3
54
  export declare const REPLAY_TIMEOUT_MAX_RETRIES = 3;
55
+ /**
56
+ * Effective replay-timeout retry budget. Override via
57
+ * `WORKFLOW_REPLAY_TIMEOUT_MAX_RETRIES`.
58
+ */
59
+ export declare function getReplayTimeoutMaxRetries(): number;
60
+ /**
61
+ * Default maximum number of steps the owned-inline path runs inline (in
62
+ * parallel) per suspension. The rest are queued to background handlers. Each
63
+ * inline step is created lazily — its `step_created` is folded into the
64
+ * `step_started` that `executeStep` sends — so inlining N steps saves N queue
65
+ * round-trips for a `Promise.all`-style fan-out. `1` reproduces the
66
+ * single-inline-step behavior exactly (useful kill-switch).
67
+ *
68
+ * Override via `WORKFLOW_MAX_INLINE_STEPS` (clamped to
69
+ * `MIN_MAX_INLINE_STEPS`..`MAX_MAX_INLINE_STEPS`).
70
+ */
71
+ export declare const MAX_INLINE_STEPS = 3;
72
+ /** Lower bound for the inline-steps env override (1 = single inline step). */
73
+ export declare const MIN_MAX_INLINE_STEPS = 1;
74
+ /**
75
+ * Upper bound for the inline-steps env override. Inline bodies run in parallel
76
+ * within one function invocation, so this caps memory/CPU fan-out per handler.
77
+ */
78
+ export declare const MAX_MAX_INLINE_STEPS = 16;
79
+ /**
80
+ * Resolve the effective max number of inline steps for the current process.
81
+ *
82
+ * Reads `process.env.WORKFLOW_MAX_INLINE_STEPS` lazily so tests and
83
+ * deployments can override per invocation. Invalid / out-of-range values fall
84
+ * back to a safe value (no throw — the env var is an escape hatch) and emit a
85
+ * one-time warning so misconfiguration is observable.
86
+ */
87
+ export declare function getMaxInlineSteps(): number;
88
+ /**
89
+ * Whether optimistic inline step start is enabled. When on, the owned-inline
90
+ * path begins running a brand-new step's body *before* its lazy `step_started`
91
+ * network call resolves (the input is already known locally), awaiting the
92
+ * `step_started` only before the terminal write.
93
+ *
94
+ * This can run a step body more than once when handlers race for the same
95
+ * step's create-claim — both run the body before one wins. That is unsafe for
96
+ * steps with non-idempotent side effects; in particular, two concurrent runs
97
+ * of a step that writes to the workflow stream (e.g. an AI agent streaming
98
+ * tokens) can interleave and corrupt the stream data. So the optimization is
99
+ * **off by default** and must be explicitly opted into per deployment.
100
+ *
101
+ * Reads `process.env.WORKFLOW_OPTIMISTIC_INLINE_START` lazily. Default OFF;
102
+ * enabled only by an explicit `'1'` / `'true'`.
103
+ */
104
+ export declare function isOptimisticInlineStartEnabled(): boolean;
105
+ /**
106
+ * Whether an operator has **explicitly disabled** optimistic inline start via
107
+ * `WORKFLOW_OPTIMISTIC_INLINE_START=0` / `=false`. Distinct from "unset": unset
108
+ * leaves the optimization off by default but lets turbo force it on; an explicit
109
+ * `0`/`false` is an operator opt-out that turbo must honor (turbo's forced
110
+ * optimistic start still runs a step body before `step_started`/`run_started` is
111
+ * confirmed, the property such an operator is opting out of), so
112
+ * `forceOptimisticStart` defers to this. Reads the env var lazily.
113
+ */
114
+ export declare function isOptimisticInlineStartExplicitlyDisabled(): boolean;
115
+ /**
116
+ * Whether "turbo mode" is enabled. Turbo mode fast-paths the *first delivery of
117
+ * the first invocation* of a run (detected by the entrypoint via `runInput`
118
+ * presence + `metadata.attempt === 1`): it backgrounds the `run_started` event
119
+ * creation, skips the initial event-log load (nothing has been written yet),
120
+ * and forces optimistic inline step start for that invocation — independent of
121
+ * `WORKFLOW_OPTIMISTIC_INLINE_START`.
122
+ *
123
+ * Forcing optimistic start is safe here because the first delivery has no
124
+ * concurrent peer handler to race the step create-claim, so a step body runs
125
+ * exactly once. That single-handler guarantee ends as soon as the run creates a
126
+ * hook or wait (which introduce resume/parallel invocations), so the runtime
127
+ * exits turbo at that point.
128
+ *
129
+ * Reads `process.env.WORKFLOW_TURBO` lazily. Default **ON**; disabled only by an
130
+ * explicit `'0'` / `'false'` (case-insensitive).
131
+ */
132
+ export declare function isTurboEnabled(): boolean;
133
+ /**
134
+ * Whether inline step ownership is enabled (default ON). When on, the lazy
135
+ * `step_started` that creates an inline step records the owning queue
136
+ * message ID, and wake replays that observe an actively-owned step enqueue a
137
+ * *delayed backstop* message instead of immediately requeueing it — fixing
138
+ * duplicate inline step execution when a hook/wait wakes a run mid-step
139
+ * (vercel/workflow#2780).
140
+ *
141
+ * `WORKFLOW_INLINE_OWNERSHIP=0` (or `false`) is the kill switch: dispatch
142
+ * reverts to the unconditional immediate requeue. Stamping is unaffected —
143
+ * the recorded ownerMessageId is inert data when the switch is off.
144
+ */
145
+ export declare function isInlineOwnershipEnabled(): boolean;
146
+ /**
147
+ * Default inline-ownership lease, in seconds: how long after a step's latest
148
+ * (stamped) `step_started` a non-owner invocation assumes the owning
149
+ * invocation may still be alive. Within the lease, wake replays enqueue the
150
+ * step's backstop message with `delaySeconds = lease remaining` instead of
151
+ * immediately; past it, they enqueue immediately (today's behavior).
152
+ *
153
+ * Why a fixed 860 and not a value derived from the function's `maxDuration`:
154
+ * neither runtime nor build time can see the resolved value — builders emit
155
+ * `maxDuration: 'max'`, which the platform resolves per-plan at deploy, and
156
+ * no env var or request-context deadline API exposes the result. The bound
157
+ * comes from a platform rule instead: durations above 800s require explicit
158
+ * per-function numeric config, so a builder-emitted `'max'` resolves to at
159
+ * most 800s — 860s therefore dominates any workflow route's invocation
160
+ * lifetime plus scheduling slack. Revisit when that ceiling moves (the
161
+ * 30-minute duration beta becoming reachable via `'max'` would invalidate
162
+ * the bound). Worlds without an invocation kill bound (world-local,
163
+ * self-hosted) get no death proof from any constant — there the in-process
164
+ * single-flight layer (step-single-flight.ts) is what makes a backstop
165
+ * firing mid-step harmless.
166
+ *
167
+ * 860 also stays under the queue's 900s maximum delay (SQS cap), so a
168
+ * backstop's full lease remainder always fits in a single delayed message.
169
+ *
170
+ * Override via `WORKFLOW_INLINE_OWNERSHIP_LEASE_SECONDS` (clamped to
171
+ * 1..`MAX_INLINE_OWNERSHIP_LEASE_SECONDS`).
172
+ */
173
+ export declare const INLINE_OWNERSHIP_LEASE_SECONDS = 860;
174
+ /**
175
+ * Upper bound for the lease env override. 900s is the queue's maximum
176
+ * per-message delay (SQS cap) — a longer lease would need delay chaining
177
+ * like long waits use; clamp instead so one delayed message always suffices.
178
+ */
179
+ export declare const MAX_INLINE_OWNERSHIP_LEASE_SECONDS = 900;
180
+ /**
181
+ * Effective inline-ownership lease. Override via
182
+ * `WORKFLOW_INLINE_OWNERSHIP_LEASE_SECONDS` — e.g. raise it on self-hosted
183
+ * multi-instance worlds with long-running steps to widen the window in which
184
+ * a live owner is protected from a concurrent backstop execution.
185
+ */
186
+ export declare function getInlineOwnershipLeaseSeconds(): number;
187
+ export declare const REPLAY_DIVERGENCE_MAX_RETRIES = 3;
188
+ /**
189
+ * Effective replay-divergence recovery budget. Override via
190
+ * `WORKFLOW_REPLAY_DIVERGENCE_MAX_RETRIES`.
191
+ */
192
+ export declare function getReplayDivergenceMaxRetries(): number;
4
193
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AASvC,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAMzC,eAAO,MAAM,0BAA0B,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAgB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAKvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAKD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD"}
@@ -1,27 +1,322 @@
1
+ import { envNumber } from '@workflow/world';
2
+ import { runtimeLogger } from '../logger.js';
1
3
  // Maximum number of queue delivery attempts before the handler gives up and
2
4
  // gracefully fails the run/step. This must be bounded under the VQS message
3
5
  // max visibility window (24 hours) so that our handler-side failure path
4
6
  // reliably executes before VQS expires the message.
5
7
  //
6
- // VQS retry schedule (with retryAfterSeconds: 5):
7
- // Attempts 1–32: linear backoff at 5s each → 32 × 5s = 160s (~2.7 min)
8
- // Attempts 33+: exponential backoff: 60s × 2^(attempt-32),
9
- // capped at 7,200s (2h), floored at retryAfterSeconds
10
- //
11
- // At 48 attempts the total elapsed time is approximately 20 hours, which is
12
- // safely under the 24-hour message visibility limit.
8
+ // The effective wall-clock survival depends on the per-redelivery backoff: the
9
+ // `retry-after` the handler returns (see world-vercel
10
+ // `getHandlerErrorRetryAfterSeconds`) fed through VQS `calculateBackoffDelay`.
11
+ // VQS uses our value for the first 32 attempts (clamped to [5s, 900s]) then
12
+ // applies its own exponential growth — every hop hard-capped at the SQS limit
13
+ // of 900s. With the backoff ramping toward that 900s ceiling (reached by
14
+ // ~delivery 11), 48 attempts span roughly 9–10 hours of wall-clock (~35,000s),
15
+ // comfortably under the 24-hour message-visibility limit so the failure path
16
+ // runs before the message expires. (A flatter, low-capped backoff exhausts the
17
+ // budget in only a few hours, failing otherwise-healthy runs during a transient
18
+ // backend outage; conversely, spanning the full 24h window would require a
19
+ // substantially higher cap here, not a higher per-hop ceiling — VQS clamps
20
+ // every hop at 900s.)
13
21
  export const MAX_QUEUE_DELIVERIES = 48;
14
- // Maximum time allowed for a single workflow replay execution (in ms).
15
- // If a replay exceeds this duration, the process exits so the queue can retry.
16
- // This must be lower than the function's maxDuration to ensure the
17
- // timeout handler has time to post the run_failed event before the platform
18
- // kills the function.
19
- // Note that on hobby plan, the maxDuration is 60s, so this barrier will not be hit,
20
- // and the queue will re-try until the visibility window expires.
22
+ /**
23
+ * Effective max queue deliveries. Override via `WORKFLOW_MAX_QUEUE_DELIVERIES`.
24
+ */
25
+ export function getMaxQueueDeliveries() {
26
+ // Only ever lower the delivery budget. The default is calibrated so the
27
+ // handler-side failure path runs before VQS message-retention expiry (see
28
+ // MAX_QUEUE_DELIVERIES above); a higher value would bypass that invariant and
29
+ // let a bad deployment redeliver until queue expiry instead of recording
30
+ // run_fail. `max` clamps a too-high override back down to the safe default.
31
+ return envNumber('WORKFLOW_MAX_QUEUE_DELIVERIES', MAX_QUEUE_DELIVERIES, {
32
+ integer: true,
33
+ min: 1,
34
+ max: MAX_QUEUE_DELIVERIES,
35
+ });
36
+ }
37
+ /**
38
+ * Default maximum time allowed for the *replay* portion of a single workflow
39
+ * handler invocation (in ms). This budget only covers deterministic-replay
40
+ * and workflow-VM execution between step boundaries — inline step bodies
41
+ * (`"use step"` functions invoked via `executeStep`) do NOT count against
42
+ * it. Step bodies are bounded separately by the platform's function
43
+ * `maxDuration` (e.g. 800s on Vercel Pro Fluid) and `NO_INLINE_REPLAY_AFTER_MS`.
44
+ *
45
+ * If the non-step ("replay") time within a single invocation exceeds this
46
+ * budget, the handler exits so the queue can retry. After
47
+ * `REPLAY_TIMEOUT_MAX_RETRIES` exhausted attempts the run is failed with
48
+ * `RUN_ERROR_CODES.REPLAY_TIMEOUT`.
49
+ *
50
+ * Note that on Vercel Hobby (standard functions), the platform `maxDuration`
51
+ * is 60s — well below this budget, so the platform SIGTERM will fire first
52
+ * and the queue will re-deliver until the visibility window expires. With
53
+ * Fluid Compute on Hobby the per-function ceiling rises to 300s, still
54
+ * under the default budget.
55
+ *
56
+ * Override via the `WORKFLOW_REPLAY_TIMEOUT_MS` env var (clamped to
57
+ * `MIN_REPLAY_TIMEOUT_MS`..`MAX_REPLAY_TIMEOUT_MS`).
58
+ */
21
59
  export const REPLAY_TIMEOUT_MS = 240_000;
60
+ /** Lower bound for the replay-timeout env var override. */
61
+ export const MIN_REPLAY_TIMEOUT_MS = 30_000;
62
+ /**
63
+ * Upper bound for the replay-timeout env var override. 780s leaves ≥20s of
64
+ * headroom under Vercel Pro Fluid's 800s function ceiling so the handler
65
+ * can write `run_failed` before SIGTERM.
66
+ */
67
+ export const MAX_REPLAY_TIMEOUT_MS = 780_000;
68
+ // Track which raw env var values we've already warned about so the warning
69
+ // log only fires once per process (the function may be called many times).
70
+ const warnedReplayTimeoutValues = new Set();
71
+ function warnOnce(raw, message, data) {
72
+ if (warnedReplayTimeoutValues.has(raw))
73
+ return;
74
+ warnedReplayTimeoutValues.add(raw);
75
+ runtimeLogger.warn(message, data);
76
+ }
77
+ /**
78
+ * Resolve the effective replay-timeout budget for the current process.
79
+ *
80
+ * Reads `process.env.WORKFLOW_REPLAY_TIMEOUT_MS` lazily so tests and
81
+ * deployments can override per invocation. Invalid / out-of-range values
82
+ * fall back to a safe value (no throw — the env var is an escape hatch,
83
+ * not a hard requirement) and emit a one-time warning so misconfiguration
84
+ * is observable.
85
+ */
86
+ export function getReplayTimeoutMs() {
87
+ const raw = process.env.WORKFLOW_REPLAY_TIMEOUT_MS;
88
+ if (!raw)
89
+ return REPLAY_TIMEOUT_MS;
90
+ const parsed = Number(raw);
91
+ if (!Number.isFinite(parsed) || parsed <= 0) {
92
+ warnOnce(raw, 'Ignoring WORKFLOW_REPLAY_TIMEOUT_MS: not a positive finite number; using default', { raw, defaultMs: REPLAY_TIMEOUT_MS });
93
+ return REPLAY_TIMEOUT_MS;
94
+ }
95
+ if (parsed < MIN_REPLAY_TIMEOUT_MS) {
96
+ warnOnce(raw, 'WORKFLOW_REPLAY_TIMEOUT_MS below minimum; clamped', {
97
+ raw,
98
+ clampedMs: MIN_REPLAY_TIMEOUT_MS,
99
+ minMs: MIN_REPLAY_TIMEOUT_MS,
100
+ });
101
+ return MIN_REPLAY_TIMEOUT_MS;
102
+ }
103
+ if (parsed > MAX_REPLAY_TIMEOUT_MS) {
104
+ warnOnce(raw, 'WORKFLOW_REPLAY_TIMEOUT_MS above maximum; clamped', {
105
+ raw,
106
+ clampedMs: MAX_REPLAY_TIMEOUT_MS,
107
+ maxMs: MAX_REPLAY_TIMEOUT_MS,
108
+ });
109
+ return MAX_REPLAY_TIMEOUT_MS;
110
+ }
111
+ return parsed;
112
+ }
113
+ /**
114
+ * Reset the warn-once cache. Test-only — exported so unit tests can
115
+ * exercise the warn path repeatedly without sharing state.
116
+ *
117
+ * @internal
118
+ */
119
+ export function _resetReplayTimeoutWarnCacheForTests() {
120
+ warnedReplayTimeoutValues.clear();
121
+ }
22
122
  // Number of queue delivery attempts to allow before permanently failing a run
23
123
  // due to a replay timeout. On attempts 1 through this value, the timeout
24
124
  // handler exits without writing run_failed so the queue retries the message.
25
125
  // On the next attempt the run is marked as failed.
26
126
  export const REPLAY_TIMEOUT_MAX_RETRIES = 3;
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0Ysa0RBQWtEO0FBQ2xELDJFQUEyRTtBQUMzRSwrREFBK0Q7QUFDL0Qsd0VBQXdFO0FBQ3hFLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUscURBQXFEO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUV2Qyx1RUFBdUU7QUFDdkUsK0VBQStFO0FBQy9FLG1FQUFtRTtBQUNuRSw0RUFBNEU7QUFDNUUsc0JBQXNCO0FBQ3RCLG9GQUFvRjtBQUNwRixpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDO0FBRXpDLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsNkVBQTZFO0FBQzdFLG1EQUFtRDtBQUNuRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBNYXhpbXVtIG51bWJlciBvZiBxdWV1ZSBkZWxpdmVyeSBhdHRlbXB0cyBiZWZvcmUgdGhlIGhhbmRsZXIgZ2l2ZXMgdXAgYW5kXG4vLyBncmFjZWZ1bGx5IGZhaWxzIHRoZSBydW4vc3RlcC4gVGhpcyBtdXN0IGJlIGJvdW5kZWQgdW5kZXIgdGhlIFZRUyBtZXNzYWdlXG4vLyBtYXggdmlzaWJpbGl0eSB3aW5kb3cgKDI0IGhvdXJzKSBzbyB0aGF0IG91ciBoYW5kbGVyLXNpZGUgZmFpbHVyZSBwYXRoXG4vLyByZWxpYWJseSBleGVjdXRlcyBiZWZvcmUgVlFTIGV4cGlyZXMgdGhlIG1lc3NhZ2UuXG4vL1xuLy8gVlFTIHJldHJ5IHNjaGVkdWxlICh3aXRoIHJldHJ5QWZ0ZXJTZWNvbmRzOiA1KTpcbi8vICAgQXR0ZW1wdHMgMeKAkzMyOiAgbGluZWFyIGJhY2tvZmYgYXQgNXMgZWFjaCAg4oaSIDMyIMOXIDVzID0gMTYwcyAofjIuNyBtaW4pXG4vLyAgIEF0dGVtcHRzIDMzKzogICBleHBvbmVudGlhbCBiYWNrb2ZmOiA2MHMgw5cgMl4oYXR0ZW1wdC0zMiksXG4vLyAgICAgICAgICAgICAgICAgICBjYXBwZWQgYXQgNywyMDBzICgyaCksIGZsb29yZWQgYXQgcmV0cnlBZnRlclNlY29uZHNcbi8vXG4vLyBBdCA0OCBhdHRlbXB0cyB0aGUgdG90YWwgZWxhcHNlZCB0aW1lIGlzIGFwcHJveGltYXRlbHkgMjAgaG91cnMsIHdoaWNoIGlzXG4vLyBzYWZlbHkgdW5kZXIgdGhlIDI0LWhvdXIgbWVzc2FnZSB2aXNpYmlsaXR5IGxpbWl0LlxuZXhwb3J0IGNvbnN0IE1BWF9RVUVVRV9ERUxJVkVSSUVTID0gNDg7XG5cbi8vIE1heGltdW0gdGltZSBhbGxvd2VkIGZvciBhIHNpbmdsZSB3b3JrZmxvdyByZXBsYXkgZXhlY3V0aW9uIChpbiBtcykuXG4vLyBJZiBhIHJlcGxheSBleGNlZWRzIHRoaXMgZHVyYXRpb24sIHRoZSBwcm9jZXNzIGV4aXRzIHNvIHRoZSBxdWV1ZSBjYW4gcmV0cnkuXG4vLyBUaGlzIG11c3QgYmUgbG93ZXIgdGhhbiB0aGUgZnVuY3Rpb24ncyBtYXhEdXJhdGlvbiB0byBlbnN1cmUgdGhlXG4vLyB0aW1lb3V0IGhhbmRsZXIgaGFzIHRpbWUgdG8gcG9zdCB0aGUgcnVuX2ZhaWxlZCBldmVudCBiZWZvcmUgdGhlIHBsYXRmb3JtXG4vLyBraWxscyB0aGUgZnVuY3Rpb24uXG4vLyBOb3RlIHRoYXQgb24gaG9iYnkgcGxhbiwgdGhlIG1heER1cmF0aW9uIGlzIDYwcywgc28gdGhpcyBiYXJyaWVyIHdpbGwgbm90IGJlIGhpdCxcbi8vIGFuZCB0aGUgcXVldWUgd2lsbCByZS10cnkgdW50aWwgdGhlIHZpc2liaWxpdHkgd2luZG93IGV4cGlyZXMuXG5leHBvcnQgY29uc3QgUkVQTEFZX1RJTUVPVVRfTVMgPSAyNDBfMDAwO1xuXG4vLyBOdW1iZXIgb2YgcXVldWUgZGVsaXZlcnkgYXR0ZW1wdHMgdG8gYWxsb3cgYmVmb3JlIHBlcm1hbmVudGx5IGZhaWxpbmcgYSBydW5cbi8vIGR1ZSB0byBhIHJlcGxheSB0aW1lb3V0LiBPbiBhdHRlbXB0cyAxIHRocm91Z2ggdGhpcyB2YWx1ZSwgdGhlIHRpbWVvdXRcbi8vIGhhbmRsZXIgZXhpdHMgd2l0aG91dCB3cml0aW5nIHJ1bl9mYWlsZWQgc28gdGhlIHF1ZXVlIHJldHJpZXMgdGhlIG1lc3NhZ2UuXG4vLyBPbiB0aGUgbmV4dCBhdHRlbXB0IHRoZSBydW4gaXMgbWFya2VkIGFzIGZhaWxlZC5cbmV4cG9ydCBjb25zdCBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUyA9IDM7XG4iXX0=
127
+ /**
128
+ * Effective replay-timeout retry budget. Override via
129
+ * `WORKFLOW_REPLAY_TIMEOUT_MAX_RETRIES`.
130
+ */
131
+ export function getReplayTimeoutMaxRetries() {
132
+ return envNumber('WORKFLOW_REPLAY_TIMEOUT_MAX_RETRIES', REPLAY_TIMEOUT_MAX_RETRIES, { integer: true });
133
+ }
134
+ /**
135
+ * Default maximum number of steps the owned-inline path runs inline (in
136
+ * parallel) per suspension. The rest are queued to background handlers. Each
137
+ * inline step is created lazily — its `step_created` is folded into the
138
+ * `step_started` that `executeStep` sends — so inlining N steps saves N queue
139
+ * round-trips for a `Promise.all`-style fan-out. `1` reproduces the
140
+ * single-inline-step behavior exactly (useful kill-switch).
141
+ *
142
+ * Override via `WORKFLOW_MAX_INLINE_STEPS` (clamped to
143
+ * `MIN_MAX_INLINE_STEPS`..`MAX_MAX_INLINE_STEPS`).
144
+ */
145
+ export const MAX_INLINE_STEPS = 3;
146
+ /** Lower bound for the inline-steps env override (1 = single inline step). */
147
+ export const MIN_MAX_INLINE_STEPS = 1;
148
+ /**
149
+ * Upper bound for the inline-steps env override. Inline bodies run in parallel
150
+ * within one function invocation, so this caps memory/CPU fan-out per handler.
151
+ */
152
+ export const MAX_MAX_INLINE_STEPS = 16;
153
+ // Warn-once cache for WORKFLOW_MAX_INLINE_STEPS, keyed by raw env value.
154
+ const warnedMaxInlineStepsValues = new Set();
155
+ /**
156
+ * Resolve the effective max number of inline steps for the current process.
157
+ *
158
+ * Reads `process.env.WORKFLOW_MAX_INLINE_STEPS` lazily so tests and
159
+ * deployments can override per invocation. Invalid / out-of-range values fall
160
+ * back to a safe value (no throw — the env var is an escape hatch) and emit a
161
+ * one-time warning so misconfiguration is observable.
162
+ */
163
+ export function getMaxInlineSteps() {
164
+ const raw = process.env.WORKFLOW_MAX_INLINE_STEPS;
165
+ if (!raw)
166
+ return MAX_INLINE_STEPS;
167
+ const parsed = Number(raw);
168
+ if (!Number.isInteger(parsed) || parsed <= 0) {
169
+ if (!warnedMaxInlineStepsValues.has(raw)) {
170
+ warnedMaxInlineStepsValues.add(raw);
171
+ runtimeLogger.warn('Ignoring WORKFLOW_MAX_INLINE_STEPS: not a positive integer; using default', { raw, defaultValue: MAX_INLINE_STEPS });
172
+ }
173
+ return MAX_INLINE_STEPS;
174
+ }
175
+ if (parsed < MIN_MAX_INLINE_STEPS)
176
+ return MIN_MAX_INLINE_STEPS;
177
+ if (parsed > MAX_MAX_INLINE_STEPS) {
178
+ if (!warnedMaxInlineStepsValues.has(raw)) {
179
+ warnedMaxInlineStepsValues.add(raw);
180
+ runtimeLogger.warn('WORKFLOW_MAX_INLINE_STEPS above maximum; clamped', {
181
+ raw,
182
+ clampedValue: MAX_MAX_INLINE_STEPS,
183
+ maxValue: MAX_MAX_INLINE_STEPS,
184
+ });
185
+ }
186
+ return MAX_MAX_INLINE_STEPS;
187
+ }
188
+ return parsed;
189
+ }
190
+ /**
191
+ * Whether optimistic inline step start is enabled. When on, the owned-inline
192
+ * path begins running a brand-new step's body *before* its lazy `step_started`
193
+ * network call resolves (the input is already known locally), awaiting the
194
+ * `step_started` only before the terminal write.
195
+ *
196
+ * This can run a step body more than once when handlers race for the same
197
+ * step's create-claim — both run the body before one wins. That is unsafe for
198
+ * steps with non-idempotent side effects; in particular, two concurrent runs
199
+ * of a step that writes to the workflow stream (e.g. an AI agent streaming
200
+ * tokens) can interleave and corrupt the stream data. So the optimization is
201
+ * **off by default** and must be explicitly opted into per deployment.
202
+ *
203
+ * Reads `process.env.WORKFLOW_OPTIMISTIC_INLINE_START` lazily. Default OFF;
204
+ * enabled only by an explicit `'1'` / `'true'`.
205
+ */
206
+ export function isOptimisticInlineStartEnabled() {
207
+ const raw = process.env.WORKFLOW_OPTIMISTIC_INLINE_START;
208
+ if (raw === undefined || raw === '')
209
+ return false;
210
+ return raw === '1' || raw.toLowerCase() === 'true';
211
+ }
212
+ /**
213
+ * Whether an operator has **explicitly disabled** optimistic inline start via
214
+ * `WORKFLOW_OPTIMISTIC_INLINE_START=0` / `=false`. Distinct from "unset": unset
215
+ * leaves the optimization off by default but lets turbo force it on; an explicit
216
+ * `0`/`false` is an operator opt-out that turbo must honor (turbo's forced
217
+ * optimistic start still runs a step body before `step_started`/`run_started` is
218
+ * confirmed, the property such an operator is opting out of), so
219
+ * `forceOptimisticStart` defers to this. Reads the env var lazily.
220
+ */
221
+ export function isOptimisticInlineStartExplicitlyDisabled() {
222
+ const raw = process.env.WORKFLOW_OPTIMISTIC_INLINE_START;
223
+ if (raw === undefined || raw === '')
224
+ return false;
225
+ return raw === '0' || raw.toLowerCase() === 'false';
226
+ }
227
+ /**
228
+ * Whether "turbo mode" is enabled. Turbo mode fast-paths the *first delivery of
229
+ * the first invocation* of a run (detected by the entrypoint via `runInput`
230
+ * presence + `metadata.attempt === 1`): it backgrounds the `run_started` event
231
+ * creation, skips the initial event-log load (nothing has been written yet),
232
+ * and forces optimistic inline step start for that invocation — independent of
233
+ * `WORKFLOW_OPTIMISTIC_INLINE_START`.
234
+ *
235
+ * Forcing optimistic start is safe here because the first delivery has no
236
+ * concurrent peer handler to race the step create-claim, so a step body runs
237
+ * exactly once. That single-handler guarantee ends as soon as the run creates a
238
+ * hook or wait (which introduce resume/parallel invocations), so the runtime
239
+ * exits turbo at that point.
240
+ *
241
+ * Reads `process.env.WORKFLOW_TURBO` lazily. Default **ON**; disabled only by an
242
+ * explicit `'0'` / `'false'` (case-insensitive).
243
+ */
244
+ export function isTurboEnabled() {
245
+ const raw = process.env.WORKFLOW_TURBO;
246
+ if (raw === undefined || raw === '')
247
+ return true;
248
+ return !(raw === '0' || raw.toLowerCase() === 'false');
249
+ }
250
+ /**
251
+ * Whether inline step ownership is enabled (default ON). When on, the lazy
252
+ * `step_started` that creates an inline step records the owning queue
253
+ * message ID, and wake replays that observe an actively-owned step enqueue a
254
+ * *delayed backstop* message instead of immediately requeueing it — fixing
255
+ * duplicate inline step execution when a hook/wait wakes a run mid-step
256
+ * (vercel/workflow#2780).
257
+ *
258
+ * `WORKFLOW_INLINE_OWNERSHIP=0` (or `false`) is the kill switch: dispatch
259
+ * reverts to the unconditional immediate requeue. Stamping is unaffected —
260
+ * the recorded ownerMessageId is inert data when the switch is off.
261
+ */
262
+ export function isInlineOwnershipEnabled() {
263
+ const raw = process.env.WORKFLOW_INLINE_OWNERSHIP;
264
+ if (raw === undefined || raw === '')
265
+ return true;
266
+ return !(raw === '0' || raw.toLowerCase() === 'false');
267
+ }
268
+ /**
269
+ * Default inline-ownership lease, in seconds: how long after a step's latest
270
+ * (stamped) `step_started` a non-owner invocation assumes the owning
271
+ * invocation may still be alive. Within the lease, wake replays enqueue the
272
+ * step's backstop message with `delaySeconds = lease remaining` instead of
273
+ * immediately; past it, they enqueue immediately (today's behavior).
274
+ *
275
+ * Why a fixed 860 and not a value derived from the function's `maxDuration`:
276
+ * neither runtime nor build time can see the resolved value — builders emit
277
+ * `maxDuration: 'max'`, which the platform resolves per-plan at deploy, and
278
+ * no env var or request-context deadline API exposes the result. The bound
279
+ * comes from a platform rule instead: durations above 800s require explicit
280
+ * per-function numeric config, so a builder-emitted `'max'` resolves to at
281
+ * most 800s — 860s therefore dominates any workflow route's invocation
282
+ * lifetime plus scheduling slack. Revisit when that ceiling moves (the
283
+ * 30-minute duration beta becoming reachable via `'max'` would invalidate
284
+ * the bound). Worlds without an invocation kill bound (world-local,
285
+ * self-hosted) get no death proof from any constant — there the in-process
286
+ * single-flight layer (step-single-flight.ts) is what makes a backstop
287
+ * firing mid-step harmless.
288
+ *
289
+ * 860 also stays under the queue's 900s maximum delay (SQS cap), so a
290
+ * backstop's full lease remainder always fits in a single delayed message.
291
+ *
292
+ * Override via `WORKFLOW_INLINE_OWNERSHIP_LEASE_SECONDS` (clamped to
293
+ * 1..`MAX_INLINE_OWNERSHIP_LEASE_SECONDS`).
294
+ */
295
+ export const INLINE_OWNERSHIP_LEASE_SECONDS = 860;
296
+ /**
297
+ * Upper bound for the lease env override. 900s is the queue's maximum
298
+ * per-message delay (SQS cap) — a longer lease would need delay chaining
299
+ * like long waits use; clamp instead so one delayed message always suffices.
300
+ */
301
+ export const MAX_INLINE_OWNERSHIP_LEASE_SECONDS = 900;
302
+ /**
303
+ * Effective inline-ownership lease. Override via
304
+ * `WORKFLOW_INLINE_OWNERSHIP_LEASE_SECONDS` — e.g. raise it on self-hosted
305
+ * multi-instance worlds with long-running steps to widen the window in which
306
+ * a live owner is protected from a concurrent backstop execution.
307
+ */
308
+ export function getInlineOwnershipLeaseSeconds() {
309
+ return envNumber('WORKFLOW_INLINE_OWNERSHIP_LEASE_SECONDS', INLINE_OWNERSHIP_LEASE_SECONDS, { integer: true, min: 1, max: MAX_INLINE_OWNERSHIP_LEASE_SECONDS });
310
+ }
311
+ // A replay-consumer mismatch can be caused by a transient divergent replay
312
+ // rather than an invalid persisted history. Queue bounded recovery replays
313
+ // before recording terminal corruption for a run that cannot replay.
314
+ export const REPLAY_DIVERGENCE_MAX_RETRIES = 3;
315
+ /**
316
+ * Effective replay-divergence recovery budget. Override via
317
+ * `WORKFLOW_REPLAY_DIVERGENCE_MAX_RETRIES`.
318
+ */
319
+ export function getReplayDivergenceMaxRetries() {
320
+ return envNumber('WORKFLOW_REPLAY_DIVERGENCE_MAX_RETRIES', REPLAY_DIVERGENCE_MAX_RETRIES, { integer: true });
321
+ }
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLHNEQUFzRDtBQUN0RCwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0Usc0JBQXNCO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSxPQUFPLFNBQVMsQ0FBQywrQkFBK0IsRUFBRSxvQkFBb0IsRUFBRTtRQUN0RSxPQUFPLEVBQUUsSUFBSTtRQUNiLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLG9CQUFvQjtLQUMxQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUV6QywyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUM7QUFFN0Ms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UyxDQUNkLHlDQUF5QyxFQUN6Qyw4QkFBOEIsRUFDOUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLGtDQUFrQyxFQUFFLENBQ25FLENBQUM7QUFDSixDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxDQUFDO0FBRS9DOzs7R0FHRztBQUNILE1BQU0sVUFBVSw2QkFBNkI7SUFDM0MsT0FBTyxTQUFTLENBQ2Qsd0NBQXdDLEVBQ3hDLDZCQUE2QixFQUM3QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FDbEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbi8vIE1heGltdW0gbnVtYmVyIG9mIHF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHRzIGJlZm9yZSB0aGUgaGFuZGxlciBnaXZlcyB1cCBhbmRcbi8vIGdyYWNlZnVsbHkgZmFpbHMgdGhlIHJ1bi9zdGVwLiBUaGlzIG11c3QgYmUgYm91bmRlZCB1bmRlciB0aGUgVlFTIG1lc3NhZ2Vcbi8vIG1heCB2aXNpYmlsaXR5IHdpbmRvdyAoMjQgaG91cnMpIHNvIHRoYXQgb3VyIGhhbmRsZXItc2lkZSBmYWlsdXJlIHBhdGhcbi8vIHJlbGlhYmx5IGV4ZWN1dGVzIGJlZm9yZSBWUVMgZXhwaXJlcyB0aGUgbWVzc2FnZS5cbi8vXG4vLyBUaGUgZWZmZWN0aXZlIHdhbGwtY2xvY2sgc3Vydml2YWwgZGVwZW5kcyBvbiB0aGUgcGVyLXJlZGVsaXZlcnkgYmFja29mZjogdGhlXG4vLyBgcmV0cnktYWZ0ZXJgIHRoZSBoYW5kbGVyIHJldHVybnMgKHNlZSB3b3JsZC12ZXJjZWxcbi8vIGBnZXRIYW5kbGVyRXJyb3JSZXRyeUFmdGVyU2Vjb25kc2ApIGZlZCB0aHJvdWdoIFZRUyBgY2FsY3VsYXRlQmFja29mZkRlbGF5YC5cbi8vIFZRUyB1c2VzIG91ciB2YWx1ZSBmb3IgdGhlIGZpcnN0IDMyIGF0dGVtcHRzIChjbGFtcGVkIHRvIFs1cywgOTAwc10pIHRoZW5cbi8vIGFwcGxpZXMgaXRzIG93biBleHBvbmVudGlhbCBncm93dGgg4oCUIGV2ZXJ5IGhvcCBoYXJkLWNhcHBlZCBhdCB0aGUgU1FTIGxpbWl0XG4vLyBvZiA5MDBzLiBXaXRoIHRoZSBiYWNrb2ZmIHJhbXBpbmcgdG93YXJkIHRoYXQgOTAwcyBjZWlsaW5nIChyZWFjaGVkIGJ5XG4vLyB+ZGVsaXZlcnkgMTEpLCA0OCBhdHRlbXB0cyBzcGFuIHJvdWdobHkgOeKAkzEwIGhvdXJzIG9mIHdhbGwtY2xvY2sgKH4zNSwwMDBzKSxcbi8vIGNvbWZvcnRhYmx5IHVuZGVyIHRoZSAyNC1ob3VyIG1lc3NhZ2UtdmlzaWJpbGl0eSBsaW1pdCBzbyB0aGUgZmFpbHVyZSBwYXRoXG4vLyBydW5zIGJlZm9yZSB0aGUgbWVzc2FnZSBleHBpcmVzLiAoQSBmbGF0dGVyLCBsb3ctY2FwcGVkIGJhY2tvZmYgZXhoYXVzdHMgdGhlXG4vLyBidWRnZXQgaW4gb25seSBhIGZldyBob3VycywgZmFpbGluZyBvdGhlcndpc2UtaGVhbHRoeSBydW5zIGR1cmluZyBhIHRyYW5zaWVudFxuLy8gYmFja2VuZCBvdXRhZ2U7IGNvbnZlcnNlbHksIHNwYW5uaW5nIHRoZSBmdWxsIDI0aCB3aW5kb3cgd291bGQgcmVxdWlyZSBhXG4vLyBzdWJzdGFudGlhbGx5IGhpZ2hlciBjYXAgaGVyZSwgbm90IGEgaGlnaGVyIHBlci1ob3AgY2VpbGluZyDigJQgVlFTIGNsYW1wc1xuLy8gZXZlcnkgaG9wIGF0IDkwMHMuKVxuZXhwb3J0IGNvbnN0IE1BWF9RVUVVRV9ERUxJVkVSSUVTID0gNDg7XG5cbi8qKlxuICogRWZmZWN0aXZlIG1heCBxdWV1ZSBkZWxpdmVyaWVzLiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX01BWF9RVUVVRV9ERUxJVkVSSUVTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFF1ZXVlRGVsaXZlcmllcygpOiBudW1iZXIge1xuICAvLyBPbmx5IGV2ZXIgbG93ZXIgdGhlIGRlbGl2ZXJ5IGJ1ZGdldC4gVGhlIGRlZmF1bHQgaXMgY2FsaWJyYXRlZCBzbyB0aGVcbiAgLy8gaGFuZGxlci1zaWRlIGZhaWx1cmUgcGF0aCBydW5zIGJlZm9yZSBWUVMgbWVzc2FnZS1yZXRlbnRpb24gZXhwaXJ5IChzZWVcbiAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgYWJvdmUpOyBhIGhpZ2hlciB2YWx1ZSB3b3VsZCBieXBhc3MgdGhhdCBpbnZhcmlhbnQgYW5kXG4gIC8vIGxldCBhIGJhZCBkZXBsb3ltZW50IHJlZGVsaXZlciB1bnRpbCBxdWV1ZSBleHBpcnkgaW5zdGVhZCBvZiByZWNvcmRpbmdcbiAgLy8gcnVuX2ZhaWwuIGBtYXhgIGNsYW1wcyBhIHRvby1oaWdoIG92ZXJyaWRlIGJhY2sgZG93biB0byB0aGUgc2FmZSBkZWZhdWx0LlxuICByZXR1cm4gZW52TnVtYmVyKCdXT1JLRkxPV19NQVhfUVVFVUVfREVMSVZFUklFUycsIE1BWF9RVUVVRV9ERUxJVkVSSUVTLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gICAgbWF4OiBNQVhfUVVFVUVfREVMSVZFUklFUyxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgYWxsb3dlZCBmb3IgdGhlICpyZXBsYXkqIHBvcnRpb24gb2YgYSBzaW5nbGUgd29ya2Zsb3dcbiAqIGhhbmRsZXIgaW52b2NhdGlvbiAoaW4gbXMpLiBUaGlzIGJ1ZGdldCBvbmx5IGNvdmVycyBkZXRlcm1pbmlzdGljLXJlcGxheVxuICogYW5kIHdvcmtmbG93LVZNIGV4ZWN1dGlvbiBiZXR3ZWVuIHN0ZXAgYm91bmRhcmllcyDigJQgaW5saW5lIHN0ZXAgYm9kaWVzXG4gKiAoYFwidXNlIHN0ZXBcImAgZnVuY3Rpb25zIGludm9rZWQgdmlhIGBleGVjdXRlU3RlcGApIGRvIE5PVCBjb3VudCBhZ2FpbnN0XG4gKiBpdC4gU3RlcCBib2RpZXMgYXJlIGJvdW5kZWQgc2VwYXJhdGVseSBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICogYG1heER1cmF0aW9uYCAoZS5nLiA4MDBzIG9uIFZlcmNlbCBQcm8gRmx1aWQpIGFuZCBgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NU2AuXG4gKlxuICogSWYgdGhlIG5vbi1zdGVwIChcInJlcGxheVwiKSB0aW1lIHdpdGhpbiBhIHNpbmdsZSBpbnZvY2F0aW9uIGV4Y2VlZHMgdGhpc1xuICogYnVkZ2V0LCB0aGUgaGFuZGxlciBleGl0cyBzbyB0aGUgcXVldWUgY2FuIHJldHJ5LiBBZnRlclxuICogYFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTYCBleGhhdXN0ZWQgYXR0ZW1wdHMgdGhlIHJ1biBpcyBmYWlsZWQgd2l0aFxuICogYFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVGAuXG4gKlxuICogTm90ZSB0aGF0IG9uIFZlcmNlbCBIb2JieSAoc3RhbmRhcmQgZnVuY3Rpb25zKSwgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAqIGlzIDYwcyDigJQgd2VsbCBiZWxvdyB0aGlzIGJ1ZGdldCwgc28gdGhlIHBsYXRmb3JtIFNJR1RFUk0gd2lsbCBmaXJlIGZpcnN0XG4gKiBhbmQgdGhlIHF1ZXVlIHdpbGwgcmUtZGVsaXZlciB1bnRpbCB0aGUgdmlzaWJpbGl0eSB3aW5kb3cgZXhwaXJlcy4gV2l0aFxuICogRmx1aWQgQ29tcHV0ZSBvbiBIb2JieSB0aGUgcGVyLWZ1bmN0aW9uIGNlaWxpbmcgcmlzZXMgdG8gMzAwcywgc3RpbGxcbiAqIHVuZGVyIHRoZSBkZWZhdWx0IGJ1ZGdldC5cbiAqXG4gKiBPdmVycmlkZSB2aWEgdGhlIGBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NU2AgZW52IHZhciAoY2xhbXBlZCB0b1xuICogYE1JTl9SRVBMQVlfVElNRU9VVF9NU2AuLmBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUExBWV9USU1FT1VUX01TID0gMjQwXzAwMDtcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgcmVwbGF5LXRpbWVvdXQgZW52IHZhciBvdmVycmlkZS4gKi9cbmV4cG9ydCBjb25zdCBNSU5fUkVQTEFZX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgZm9yIHRoZSByZXBsYXktdGltZW91dCBlbnYgdmFyIG92ZXJyaWRlLiA3ODBzIGxlYXZlcyDiiaUyMHMgb2ZcbiAqIGhlYWRyb29tIHVuZGVyIFZlcmNlbCBQcm8gRmx1aWQncyA4MDBzIGZ1bmN0aW9uIGNlaWxpbmcgc28gdGhlIGhhbmRsZXJcbiAqIGNhbiB3cml0ZSBgcnVuX2ZhaWxlZGAgYmVmb3JlIFNJR1RFUk0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfUkVQTEFZX1RJTUVPVVRfTVMgPSA3ODBfMDAwO1xuXG4vLyBUcmFjayB3aGljaCByYXcgZW52IHZhciB2YWx1ZXMgd2UndmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQgc28gdGhlIHdhcm5pbmdcbi8vIGxvZyBvbmx5IGZpcmVzIG9uY2UgcGVyIHByb2Nlc3MgKHRoZSBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1hbnkgdGltZXMpLlxuY29uc3Qgd2FybmVkUmVwbGF5VGltZW91dFZhbHVlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5mdW5jdGlvbiB3YXJuT25jZShcbiAgcmF3OiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQge1xuICBpZiAod2FybmVkUmVwbGF5VGltZW91dFZhbHVlcy5oYXMocmF3KSkgcmV0dXJuO1xuICB3YXJuZWRSZXBsYXlUaW1lb3V0VmFsdWVzLmFkZChyYXcpO1xuICBydW50aW1lTG9nZ2VyLndhcm4obWVzc2FnZSwgZGF0YSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIHJlcGxheS10aW1lb3V0IGJ1ZGdldCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVNgIGxhemlseSBzbyB0ZXN0cyBhbmRcbiAqIGRlcGxveW1lbnRzIGNhbiBvdmVycmlkZSBwZXIgaW52b2NhdGlvbi4gSW52YWxpZCAvIG91dC1vZi1yYW5nZSB2YWx1ZXNcbiAqIGZhbGwgYmFjayB0byBhIHNhZmUgdmFsdWUgKG5vIHRocm93IOKAlCB0aGUgZW52IHZhciBpcyBhbiBlc2NhcGUgaGF0Y2gsXG4gKiBub3QgYSBoYXJkIHJlcXVpcmVtZW50KSBhbmQgZW1pdCBhIG9uZS10aW1lIHdhcm5pbmcgc28gbWlzY29uZmlndXJhdGlvblxuICogaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcGxheVRpbWVvdXRNcygpOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUztcbiAgaWYgKCFyYXcpIHJldHVybiBSRVBMQVlfVElNRU9VVF9NUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgfHwgcGFyc2VkIDw9IDApIHtcbiAgICB3YXJuT25jZShcbiAgICAgIHJhdyxcbiAgICAgICdJZ25vcmluZyBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUzogbm90IGEgcG9zaXRpdmUgZmluaXRlIG51bWJlcjsgdXNpbmcgZGVmYXVsdCcsXG4gICAgICB7IHJhdywgZGVmYXVsdE1zOiBSRVBMQVlfVElNRU9VVF9NUyB9XG4gICAgKTtcbiAgICByZXR1cm4gUkVQTEFZX1RJTUVPVVRfTVM7XG4gIH1cbiAgaWYgKHBhcnNlZCA8IE1JTl9SRVBMQVlfVElNRU9VVF9NUykge1xuICAgIHdhcm5PbmNlKHJhdywgJ1dPUktGTE9XX1JFUExBWV9USU1FT1VUX01TIGJlbG93IG1pbmltdW07IGNsYW1wZWQnLCB7XG4gICAgICByYXcsXG4gICAgICBjbGFtcGVkTXM6IE1JTl9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICAgIG1pbk1zOiBNSU5fUkVQTEFZX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gICAgcmV0dXJuIE1JTl9SRVBMQVlfVElNRU9VVF9NUztcbiAgfVxuICBpZiAocGFyc2VkID4gTUFYX1JFUExBWV9USU1FT1VUX01TKSB7XG4gICAgd2Fybk9uY2UocmF3LCAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVMgYWJvdmUgbWF4aW11bTsgY2xhbXBlZCcsIHtcbiAgICAgIHJhdyxcbiAgICAgIGNsYW1wZWRNczogTUFYX1JFUExBWV9USU1FT1VUX01TLFxuICAgICAgbWF4TXM6IE1BWF9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgICByZXR1cm4gTUFYX1JFUExBWV9USU1FT1VUX01TO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogUmVzZXQgdGhlIHdhcm4tb25jZSBjYWNoZS4gVGVzdC1vbmx5IOKAlCBleHBvcnRlZCBzbyB1bml0IHRlc3RzIGNhblxuICogZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCByZXBlYXRlZGx5IHdpdGhvdXQgc2hhcmluZyBzdGF0ZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFJlcGxheVRpbWVvdXRXYXJuQ2FjaGVGb3JUZXN0cygpOiB2b2lkIHtcbiAgd2FybmVkUmVwbGF5VGltZW91dFZhbHVlcy5jbGVhcigpO1xufVxuXG4vLyBOdW1iZXIgb2YgcXVldWUgZGVsaXZlcnkgYXR0ZW1wdHMgdG8gYWxsb3cgYmVmb3JlIHBlcm1hbmVudGx5IGZhaWxpbmcgYSBydW5cbi8vIGR1ZSB0byBhIHJlcGxheSB0aW1lb3V0LiBPbiBhdHRlbXB0cyAxIHRocm91Z2ggdGhpcyB2YWx1ZSwgdGhlIHRpbWVvdXRcbi8vIGhhbmRsZXIgZXhpdHMgd2l0aG91dCB3cml0aW5nIHJ1bl9mYWlsZWQgc28gdGhlIHF1ZXVlIHJldHJpZXMgdGhlIG1lc3NhZ2UuXG4vLyBPbiB0aGUgbmV4dCBhdHRlbXB0IHRoZSBydW4gaXMgbWFya2VkIGFzIGZhaWxlZC5cbmV4cG9ydCBjb25zdCBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIHJlcGxheS10aW1lb3V0IHJldHJ5IGJ1ZGdldC4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5VGltZW91dE1heFJldHJpZXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVMnLFxuICAgIFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBzdGVwcyB0aGUgb3duZWQtaW5saW5lIHBhdGggcnVucyBpbmxpbmUgKGluXG4gKiBwYXJhbGxlbCkgcGVyIHN1c3BlbnNpb24uIFRoZSByZXN0IGFyZSBxdWV1ZWQgdG8gYmFja2dyb3VuZCBoYW5kbGVycy4gRWFjaFxuICogaW5saW5lIHN0ZXAgaXMgY3JlYXRlZCBsYXppbHkg4oCUIGl0cyBgc3RlcF9jcmVhdGVkYCBpcyBmb2xkZWQgaW50byB0aGVcbiAqIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgYGV4ZWN1dGVTdGVwYCBzZW5kcyDigJQgc28gaW5saW5pbmcgTiBzdGVwcyBzYXZlcyBOIHF1ZXVlXG4gKiByb3VuZC10cmlwcyBmb3IgYSBgUHJvbWlzZS5hbGxgLXN0eWxlIGZhbi1vdXQuIGAxYCByZXByb2R1Y2VzIHRoZVxuICogc2luZ2xlLWlubGluZS1zdGVwIGJlaGF2aW9yIGV4YWN0bHkgKHVzZWZ1bCBraWxsLXN3aXRjaCkuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCAoY2xhbXBlZCB0b1xuICogYE1JTl9NQVhfSU5MSU5FX1NURVBTYC4uYE1BWF9NQVhfSU5MSU5FX1NURVBTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfSU5MSU5FX1NURVBTID0gMztcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZSAoMSA9IHNpbmdsZSBpbmxpbmUgc3RlcCkuICovXG5leHBvcnQgY29uc3QgTUlOX01BWF9JTkxJTkVfU1RFUFMgPSAxO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZS4gSW5saW5lIGJvZGllcyBydW4gaW4gcGFyYWxsZWxcbiAqIHdpdGhpbiBvbmUgZnVuY3Rpb24gaW52b2NhdGlvbiwgc28gdGhpcyBjYXBzIG1lbW9yeS9DUFUgZmFuLW91dCBwZXIgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9NQVhfSU5MSU5FX1NURVBTID0gMTY7XG5cbi8vIFdhcm4tb25jZSBjYWNoZSBmb3IgV09SS0ZMT1dfTUFYX0lOTElORV9TVEVQUywga2V5ZWQgYnkgcmF3IGVudiB2YWx1ZS5cbmNvbnN0IHdhcm5lZE1heElubGluZVN0ZXBzVmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIG1heCBudW1iZXIgb2YgaW5saW5lIHN0ZXBzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCBsYXppbHkgc28gdGVzdHMgYW5kXG4gKiBkZXBsb3ltZW50cyBjYW4gb3ZlcnJpZGUgcGVyIGludm9jYXRpb24uIEludmFsaWQgLyBvdXQtb2YtcmFuZ2UgdmFsdWVzIGZhbGxcbiAqIGJhY2sgdG8gYSBzYWZlIHZhbHVlIChubyB0aHJvdyDigJQgdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhXG4gKiBvbmUtdGltZSB3YXJuaW5nIHNvIG1pc2NvbmZpZ3VyYXRpb24gaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heElubGluZVN0ZXBzKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX01BWF9JTkxJTkVfU1RFUFM7XG4gIGlmICghcmF3KSByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdJZ25vcmluZyBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTOiBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyOyB1c2luZyBkZWZhdWx0JyxcbiAgICAgICAgeyByYXcsIGRlZmF1bHRWYWx1ZTogTUFYX0lOTElORV9TVEVQUyB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgfVxuICBpZiAocGFyc2VkIDwgTUlOX01BWF9JTkxJTkVfU1RFUFMpIHJldHVybiBNSU5fTUFYX0lOTElORV9TVEVQUztcbiAgaWYgKHBhcnNlZCA+IE1BWF9NQVhfSU5MSU5FX1NURVBTKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1dPUktGTE9XX01BWF9JTkxJTkVfU1RFUFMgYWJvdmUgbWF4aW11bTsgY2xhbXBlZCcsIHtcbiAgICAgICAgcmF3LFxuICAgICAgICBjbGFtcGVkVmFsdWU6IE1BWF9NQVhfSU5MSU5FX1NURVBTLFxuICAgICAgICBtYXhWYWx1ZTogTUFYX01BWF9JTkxJTkVfU1RFUFMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIE1BWF9NQVhfSU5MSU5FX1NURVBTO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciBvcHRpbWlzdGljIGlubGluZSBzdGVwIHN0YXJ0IGlzIGVuYWJsZWQuIFdoZW4gb24sIHRoZSBvd25lZC1pbmxpbmVcbiAqIHBhdGggYmVnaW5zIHJ1bm5pbmcgYSBicmFuZC1uZXcgc3RlcCdzIGJvZHkgKmJlZm9yZSogaXRzIGxhenkgYHN0ZXBfc3RhcnRlZGBcbiAqIG5ldHdvcmsgY2FsbCByZXNvbHZlcyAodGhlIGlucHV0IGlzIGFscmVhZHkga25vd24gbG9jYWxseSksIGF3YWl0aW5nIHRoZVxuICogYHN0ZXBfc3RhcnRlZGAgb25seSBiZWZvcmUgdGhlIHRlcm1pbmFsIHdyaXRlLlxuICpcbiAqIFRoaXMgY2FuIHJ1biBhIHN0ZXAgYm9keSBtb3JlIHRoYW4gb25jZSB3aGVuIGhhbmRsZXJzIHJhY2UgZm9yIHRoZSBzYW1lXG4gKiBzdGVwJ3MgY3JlYXRlLWNsYWltIOKAlCBib3RoIHJ1biB0aGUgYm9keSBiZWZvcmUgb25lIHdpbnMuIFRoYXQgaXMgdW5zYWZlIGZvclxuICogc3RlcHMgd2l0aCBub24taWRlbXBvdGVudCBzaWRlIGVmZmVjdHM7IGluIHBhcnRpY3VsYXIsIHR3byBjb25jdXJyZW50IHJ1bnNcbiAqIG9mIGEgc3RlcCB0aGF0IHdyaXRlcyB0byB0aGUgd29ya2Zsb3cgc3RyZWFtIChlLmcuIGFuIEFJIGFnZW50IHN0cmVhbWluZ1xuICogdG9rZW5zKSBjYW4gaW50ZXJsZWF2ZSBhbmQgY29ycnVwdCB0aGUgc3RyZWFtIGRhdGEuIFNvIHRoZSBvcHRpbWl6YXRpb24gaXNcbiAqICoqb2ZmIGJ5IGRlZmF1bHQqKiBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IG9wdGVkIGludG8gcGVyIGRlcGxveW1lbnQuXG4gKlxuICogUmVhZHMgYHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUYCBsYXppbHkuIERlZmF1bHQgT0ZGO1xuICogZW5hYmxlZCBvbmx5IGJ5IGFuIGV4cGxpY2l0IGAnMSdgIC8gYCd0cnVlJ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGltaXN0aWNJbmxpbmVTdGFydEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmF3ID09PSAnMScgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIG9wZXJhdG9yIGhhcyAqKmV4cGxpY2l0bHkgZGlzYWJsZWQqKiBvcHRpbWlzdGljIGlubGluZSBzdGFydCB2aWFcbiAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVD0wYCAvIGA9ZmFsc2VgLiBEaXN0aW5jdCBmcm9tIFwidW5zZXRcIjogdW5zZXRcbiAqIGxlYXZlcyB0aGUgb3B0aW1pemF0aW9uIG9mZiBieSBkZWZhdWx0IGJ1dCBsZXRzIHR1cmJvIGZvcmNlIGl0IG9uOyBhbiBleHBsaWNpdFxuICogYDBgL2BmYWxzZWAgaXMgYW4gb3BlcmF0b3Igb3B0LW91dCB0aGF0IHR1cmJvIG11c3QgaG9ub3IgKHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0IHN0aWxsIHJ1bnMgYSBzdGVwIGJvZHkgYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgL2BydW5fc3RhcnRlZGAgaXNcbiAqIGNvbmZpcm1lZCwgdGhlIHByb3BlcnR5IHN1Y2ggYW4gb3BlcmF0b3IgaXMgb3B0aW5nIG91dCBvZiksIHNvXG4gKiBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIGRlZmVycyB0byB0aGlzLiBSZWFkcyB0aGUgZW52IHZhciBsYXppbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGltaXN0aWNJbmxpbmVTdGFydEV4cGxpY2l0bHlEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiByYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIFwidHVyYm8gbW9kZVwiIGlzIGVuYWJsZWQuIFR1cmJvIG1vZGUgZmFzdC1wYXRocyB0aGUgKmZpcnN0IGRlbGl2ZXJ5IG9mXG4gKiB0aGUgZmlyc3QgaW52b2NhdGlvbiogb2YgYSBydW4gKGRldGVjdGVkIGJ5IHRoZSBlbnRyeXBvaW50IHZpYSBgcnVuSW5wdXRgXG4gKiBwcmVzZW5jZSArIGBtZXRhZGF0YS5hdHRlbXB0ID09PSAxYCk6IGl0IGJhY2tncm91bmRzIHRoZSBgcnVuX3N0YXJ0ZWRgIGV2ZW50XG4gKiBjcmVhdGlvbiwgc2tpcHMgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB5ZXQpLFxuICogYW5kIGZvcmNlcyBvcHRpbWlzdGljIGlubGluZSBzdGVwIHN0YXJ0IGZvciB0aGF0IGludm9jYXRpb24g4oCUIGluZGVwZW5kZW50IG9mXG4gKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlRgLlxuICpcbiAqIEZvcmNpbmcgb3B0aW1pc3RpYyBzdGFydCBpcyBzYWZlIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgZGVsaXZlcnkgaGFzIG5vXG4gKiBjb25jdXJyZW50IHBlZXIgaGFuZGxlciB0byByYWNlIHRoZSBzdGVwIGNyZWF0ZS1jbGFpbSwgc28gYSBzdGVwIGJvZHkgcnVuc1xuICogZXhhY3RseSBvbmNlLiBUaGF0IHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSBlbmRzIGFzIHNvb24gYXMgdGhlIHJ1biBjcmVhdGVzIGFcbiAqIGhvb2sgb3Igd2FpdCAod2hpY2ggaW50cm9kdWNlIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyksIHNvIHRoZSBydW50aW1lXG4gKiBleGl0cyB0dXJibyBhdCB0aGF0IHBvaW50LlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19UVVJCT2AgbGF6aWx5LiBEZWZhdWx0ICoqT04qKjsgZGlzYWJsZWQgb25seSBieSBhblxuICogZXhwbGljaXQgYCcwJ2AgLyBgJ2ZhbHNlJ2AgKGNhc2UtaW5zZW5zaXRpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUdXJib0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1RVUkJPO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhKHJhdyA9PT0gJzAnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGlubGluZSBzdGVwIG93bmVyc2hpcCBpcyBlbmFibGVkIChkZWZhdWx0IE9OKS4gV2hlbiBvbiwgdGhlIGxhenlcbiAqIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgY3JlYXRlcyBhbiBpbmxpbmUgc3RlcCByZWNvcmRzIHRoZSBvd25pbmcgcXVldWVcbiAqIG1lc3NhZ2UgSUQsIGFuZCB3YWtlIHJlcGxheXMgdGhhdCBvYnNlcnZlIGFuIGFjdGl2ZWx5LW93bmVkIHN0ZXAgZW5xdWV1ZSBhXG4gKiAqZGVsYXllZCBiYWNrc3RvcCogbWVzc2FnZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IHJlcXVldWVpbmcgaXQg4oCUIGZpeGluZ1xuICogZHVwbGljYXRlIGlubGluZSBzdGVwIGV4ZWN1dGlvbiB3aGVuIGEgaG9vay93YWl0IHdha2VzIGEgcnVuIG1pZC1zdGVwXG4gKiAodmVyY2VsL3dvcmtmbG93IzI3ODApLlxuICpcbiAqIGBXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQPTBgIChvciBgZmFsc2VgKSBpcyB0aGUga2lsbCBzd2l0Y2g6IGRpc3BhdGNoXG4gKiByZXZlcnRzIHRvIHRoZSB1bmNvbmRpdGlvbmFsIGltbWVkaWF0ZSByZXF1ZXVlLiBTdGFtcGluZyBpcyB1bmFmZmVjdGVkIOKAlFxuICogdGhlIHJlY29yZGVkIG93bmVyTWVzc2FnZUlkIGlzIGluZXJ0IGRhdGEgd2hlbiB0aGUgc3dpdGNoIGlzIG9mZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpbmxpbmUtb3duZXJzaGlwIGxlYXNlLCBpbiBzZWNvbmRzOiBob3cgbG9uZyBhZnRlciBhIHN0ZXAncyBsYXRlc3RcbiAqIChzdGFtcGVkKSBgc3RlcF9zdGFydGVkYCBhIG5vbi1vd25lciBpbnZvY2F0aW9uIGFzc3VtZXMgdGhlIG93bmluZ1xuICogaW52b2NhdGlvbiBtYXkgc3RpbGwgYmUgYWxpdmUuIFdpdGhpbiB0aGUgbGVhc2UsIHdha2UgcmVwbGF5cyBlbnF1ZXVlIHRoZVxuICogc3RlcCdzIGJhY2tzdG9wIG1lc3NhZ2Ugd2l0aCBgZGVsYXlTZWNvbmRzID0gbGVhc2UgcmVtYWluaW5nYCBpbnN0ZWFkIG9mXG4gKiBpbW1lZGlhdGVseTsgcGFzdCBpdCwgdGhleSBlbnF1ZXVlIGltbWVkaWF0ZWx5ICh0b2RheSdzIGJlaGF2aW9yKS5cbiAqXG4gKiBXaHkgYSBmaXhlZCA4NjAgYW5kIG5vdCBhIHZhbHVlIGRlcml2ZWQgZnJvbSB0aGUgZnVuY3Rpb24ncyBgbWF4RHVyYXRpb25gOlxuICogbmVpdGhlciBydW50aW1lIG5vciBidWlsZCB0aW1lIGNhbiBzZWUgdGhlIHJlc29sdmVkIHZhbHVlIOKAlCBidWlsZGVycyBlbWl0XG4gKiBgbWF4RHVyYXRpb246ICdtYXgnYCwgd2hpY2ggdGhlIHBsYXRmb3JtIHJlc29sdmVzIHBlci1wbGFuIGF0IGRlcGxveSwgYW5kXG4gKiBubyBlbnYgdmFyIG9yIHJlcXVlc3QtY29udGV4dCBkZWFkbGluZSBBUEkgZXhwb3NlcyB0aGUgcmVzdWx0LiBUaGUgYm91bmRcbiAqIGNvbWVzIGZyb20gYSBwbGF0Zm9ybSBydWxlIGluc3RlYWQ6IGR1cmF0aW9ucyBhYm92ZSA4MDBzIHJlcXVpcmUgZXhwbGljaXRcbiAqIHBlci1mdW5jdGlvbiBudW1lcmljIGNvbmZpZywgc28gYSBidWlsZGVyLWVtaXR0ZWQgYCdtYXgnYCByZXNvbHZlcyB0byBhdFxuICogbW9zdCA4MDBzIOKAlCA4NjBzIHRoZXJlZm9yZSBkb21pbmF0ZXMgYW55IHdvcmtmbG93IHJvdXRlJ3MgaW52b2NhdGlvblxuICogbGlmZXRpbWUgcGx1cyBzY2hlZHVsaW5nIHNsYWNrLiBSZXZpc2l0IHdoZW4gdGhhdCBjZWlsaW5nIG1vdmVzICh0aGVcbiAqIDMwLW1pbnV0ZSBkdXJhdGlvbiBiZXRhIGJlY29taW5nIHJlYWNoYWJsZSB2aWEgYCdtYXgnYCB3b3VsZCBpbnZhbGlkYXRlXG4gKiB0aGUgYm91bmQpLiBXb3JsZHMgd2l0aG91dCBhbiBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsLFxuICogc2VsZi1ob3N0ZWQpIGdldCBubyBkZWF0aCBwcm9vZiBmcm9tIGFueSBjb25zdGFudCDigJQgdGhlcmUgdGhlIGluLXByb2Nlc3NcbiAqIHNpbmdsZS1mbGlnaHQgbGF5ZXIgKHN0ZXAtc2luZ2xlLWZsaWdodC50cykgaXMgd2hhdCBtYWtlcyBhIGJhY2tzdG9wXG4gKiBmaXJpbmcgbWlkLXN0ZXAgaGFybWxlc3MuXG4gKlxuICogODYwIGFsc28gc3RheXMgdW5kZXIgdGhlIHF1ZXVlJ3MgOTAwcyBtYXhpbXVtIGRlbGF5IChTUVMgY2FwKSwgc28gYVxuICogYmFja3N0b3AncyBmdWxsIGxlYXNlIHJlbWFpbmRlciBhbHdheXMgZml0cyBpbiBhIHNpbmdsZSBkZWxheWVkIG1lc3NhZ2UuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFNgIChjbGFtcGVkIHRvXG4gKiAxLi5gTUFYX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2ApLlxuICovXG5leHBvcnQgY29uc3QgSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTID0gODYwO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgbGVhc2UgZW52IG92ZXJyaWRlLiA5MDBzIGlzIHRoZSBxdWV1ZSdzIG1heGltdW1cbiAqIHBlci1tZXNzYWdlIGRlbGF5IChTUVMgY2FwKSDigJQgYSBsb25nZXIgbGVhc2Ugd291bGQgbmVlZCBkZWxheSBjaGFpbmluZ1xuICogbGlrZSBsb25nIHdhaXRzIHVzZTsgY2xhbXAgaW5zdGVhZCBzbyBvbmUgZGVsYXllZCBtZXNzYWdlIGFsd2F5cyBzdWZmaWNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgPSA5MDA7XG5cbi8qKlxuICogRWZmZWN0aXZlIGlubGluZS1vd25lcnNoaXAgbGVhc2UuIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2Ag4oCUIGUuZy4gcmFpc2UgaXQgb24gc2VsZi1ob3N0ZWRcbiAqIG11bHRpLWluc3RhbmNlIHdvcmxkcyB3aXRoIGxvbmctcnVubmluZyBzdGVwcyB0byB3aWRlbiB0aGUgd2luZG93IGluIHdoaWNoXG4gKiBhIGxpdmUgb3duZXIgaXMgcHJvdGVjdGVkIGZyb20gYSBjb25jdXJyZW50IGJhY2tzdG9wIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElubGluZU93bmVyc2hpcExlYXNlU2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMnLFxuICAgIElOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMSwgbWF4OiBNQVhfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTIH1cbiAgKTtcbn1cblxuLy8gQSByZXBsYXktY29uc3VtZXIgbWlzbWF0Y2ggY2FuIGJlIGNhdXNlZCBieSBhIHRyYW5zaWVudCBkaXZlcmdlbnQgcmVwbGF5XG4vLyByYXRoZXIgdGhhbiBhbiBpbnZhbGlkIHBlcnNpc3RlZCBoaXN0b3J5LiBRdWV1ZSBib3VuZGVkIHJlY292ZXJ5IHJlcGxheXNcbi8vIGJlZm9yZSByZWNvcmRpbmcgdGVybWluYWwgY29ycnVwdGlvbiBmb3IgYSBydW4gdGhhdCBjYW5ub3QgcmVwbGF5LlxuZXhwb3J0IGNvbnN0IFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBFZmZlY3RpdmUgcmVwbGF5LWRpdmVyZ2VuY2UgcmVjb3ZlcnkgYnVkZ2V0LiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19SRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUycsXG4gICAgUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cbiJdfQ==
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Lazy loader for getPort that prevents bundlers (Turbopack, esbuild)
3
+ * from statically tracing @workflow/utils/get-port and its filesystem
4
+ * operations (readdir, readFile, readlink) into the flow route bundle.
5
+ *
6
+ * Uses createRequire with a dynamically constructed specifier so the
7
+ * dependency is invisible to bundler static analysis.
8
+ */
9
+ export declare function getPortLazy(): Promise<number | undefined>;
10
+ /**
11
+ * Resets the per-process port cache. Intended for tests; not used on the hot
12
+ * path. Callers must let any in-flight lookup settle (await the pending
13
+ * `getPortLazy()` call) before resetting: clearing `_inFlight` here does not
14
+ * cancel an already-scheduled resolution, so a late `.then` could otherwise
15
+ * repopulate `_cachedPort` after the reset and bleed into the next test.
16
+ */
17
+ export declare function resetPortCacheForTesting(): void;
18
+ /**
19
+ * Installs a fake port resolver and clears the cache. Test-only seam: the real
20
+ * resolver is loaded via `createRequire` with a runtime-built specifier (to
21
+ * hide it from bundlers), which also defeats module mocking, so injection is
22
+ * the only deterministic way to exercise the caching contract.
23
+ */
24
+ export declare function setPortResolverForTesting(fn: () => Promise<number | undefined>): void;
25
+ //# sourceMappingURL=get-port-lazy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-port-lazy.d.ts","sourceRoot":"","sources":["../../src/runtime/get-port-lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuBH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4C/D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAI/C;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GACpC,IAAI,CAIN"}