@workflow/core 5.0.0-beta.5 → 5.0.0-beta.51

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 (317) hide show
  1. package/README.md +5 -0
  2. package/dist/attribute-changes.d.ts +5 -0
  3. package/dist/attribute-changes.d.ts.map +1 -0
  4. package/dist/attribute-changes.js +25 -0
  5. package/dist/capabilities.d.ts +35 -2
  6. package/dist/capabilities.d.ts.map +1 -1
  7. package/dist/capabilities.js +74 -5
  8. package/dist/capture-stack.d.ts +1 -1
  9. package/dist/capture-stack.js +2 -2
  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 +19 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +98 -6
  16. package/dist/context-violation-error.d.ts +5 -5
  17. package/dist/context-violation-error.d.ts.map +1 -1
  18. package/dist/context-violation-error.js +8 -6
  19. package/dist/create-hook.d.ts +72 -7
  20. package/dist/create-hook.d.ts.map +1 -1
  21. package/dist/create-hook.js +1 -1
  22. package/dist/define-hook.js +2 -2
  23. package/dist/describe-error.d.ts +7 -7
  24. package/dist/describe-error.d.ts.map +1 -1
  25. package/dist/describe-error.js +97 -12
  26. package/dist/encryption.d.ts +38 -4
  27. package/dist/encryption.d.ts.map +1 -1
  28. package/dist/encryption.js +96 -14
  29. package/dist/events-consumer.d.ts +297 -0
  30. package/dist/events-consumer.d.ts.map +1 -1
  31. package/dist/events-consumer.js +673 -42
  32. package/dist/flushable-stream.d.ts +97 -1
  33. package/dist/flushable-stream.d.ts.map +1 -1
  34. package/dist/flushable-stream.js +291 -11
  35. package/dist/global.d.ts +36 -2
  36. package/dist/global.d.ts.map +1 -1
  37. package/dist/global.js +21 -6
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -2
  41. package/dist/log-format.d.ts +2 -2
  42. package/dist/log-format.js +19 -12
  43. package/dist/logger.d.ts +1 -0
  44. package/dist/logger.d.ts.map +1 -1
  45. package/dist/logger.js +10 -6
  46. package/dist/private.d.ts +226 -9
  47. package/dist/private.d.ts.map +1 -1
  48. package/dist/private.js +626 -7
  49. package/dist/replay-divergence.d.ts +25 -0
  50. package/dist/replay-divergence.d.ts.map +1 -0
  51. package/dist/replay-divergence.js +61 -0
  52. package/dist/replay-payload-cache.d.ts +64 -0
  53. package/dist/replay-payload-cache.d.ts.map +1 -0
  54. package/dist/replay-payload-cache.js +158 -0
  55. package/dist/runtime/compute-instance.d.ts +13 -0
  56. package/dist/runtime/compute-instance.d.ts.map +1 -0
  57. package/dist/runtime/compute-instance.js +14 -0
  58. package/dist/runtime/constants.d.ts +315 -0
  59. package/dist/runtime/constants.d.ts.map +1 -1
  60. package/dist/runtime/constants.js +502 -16
  61. package/dist/runtime/count-step-started-events.d.ts +52 -0
  62. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  63. package/dist/runtime/count-step-started-events.js +72 -0
  64. package/dist/runtime/deployment-guard.d.ts +99 -0
  65. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  66. package/dist/runtime/deployment-guard.js +154 -0
  67. package/dist/runtime/get-port-lazy.d.ts +15 -0
  68. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  69. package/dist/runtime/get-port-lazy.js +75 -6
  70. package/dist/runtime/get-world-lazy.d.ts +5 -14
  71. package/dist/runtime/get-world-lazy.d.ts.map +1 -1
  72. package/dist/runtime/get-world-lazy.js +19 -29
  73. package/dist/runtime/helpers.d.ts +415 -29
  74. package/dist/runtime/helpers.d.ts.map +1 -1
  75. package/dist/runtime/helpers.js +686 -57
  76. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  77. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  78. package/dist/runtime/quickjs-assets.generated.js +30 -0
  79. package/dist/runtime/quickjs-entrypoint.d.ts +158 -0
  80. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  81. package/dist/runtime/quickjs-entrypoint.js +1863 -0
  82. package/dist/runtime/quickjs-log-view.d.ts +129 -0
  83. package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
  84. package/dist/runtime/quickjs-log-view.js +229 -0
  85. package/dist/runtime/quickjs-runtime.d.ts +244 -0
  86. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  87. package/dist/runtime/quickjs-runtime.js +2427 -0
  88. package/dist/runtime/quickjs-serde.d.ts +107 -0
  89. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  90. package/dist/runtime/quickjs-serde.js +2159 -0
  91. package/dist/runtime/replay-budget.d.ts +97 -0
  92. package/dist/runtime/replay-budget.d.ts.map +1 -0
  93. package/dist/runtime/replay-budget.js +139 -0
  94. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  95. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  96. package/dist/runtime/replay-recovery-reporter.js +64 -0
  97. package/dist/runtime/resume-hook.d.ts +91 -8
  98. package/dist/runtime/resume-hook.d.ts.map +1 -1
  99. package/dist/runtime/resume-hook.js +512 -89
  100. package/dist/runtime/resume-latency.d.ts +150 -0
  101. package/dist/runtime/resume-latency.d.ts.map +1 -0
  102. package/dist/runtime/resume-latency.js +155 -0
  103. package/dist/runtime/run-id-time.d.ts +19 -0
  104. package/dist/runtime/run-id-time.d.ts.map +1 -0
  105. package/dist/runtime/run-id-time.js +42 -0
  106. package/dist/runtime/run.d.ts +72 -7
  107. package/dist/runtime/run.d.ts.map +1 -1
  108. package/dist/runtime/run.js +280 -53
  109. package/dist/runtime/runs.d.ts +54 -3
  110. package/dist/runtime/runs.d.ts.map +1 -1
  111. package/dist/runtime/runs.js +126 -16
  112. package/dist/runtime/start.d.ts +101 -2
  113. package/dist/runtime/start.d.ts.map +1 -1
  114. package/dist/runtime/start.js +352 -61
  115. package/dist/runtime/step-executor.d.ts +186 -5
  116. package/dist/runtime/step-executor.d.ts.map +1 -1
  117. package/dist/runtime/step-executor.js +768 -130
  118. package/dist/runtime/step-latency.d.ts +220 -0
  119. package/dist/runtime/step-latency.d.ts.map +1 -0
  120. package/dist/runtime/step-latency.js +215 -0
  121. package/dist/runtime/step-ownership.d.ts +72 -0
  122. package/dist/runtime/step-ownership.d.ts.map +1 -0
  123. package/dist/runtime/step-ownership.js +114 -0
  124. package/dist/runtime/step-single-flight.d.ts +12 -0
  125. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  126. package/dist/runtime/step-single-flight.js +75 -0
  127. package/dist/runtime/suspension-handler.d.ts +247 -7
  128. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  129. package/dist/runtime/suspension-handler.js +1304 -125
  130. package/dist/runtime/unserializable-step.d.ts +34 -0
  131. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  132. package/dist/runtime/unserializable-step.js +52 -0
  133. package/dist/runtime/vm-mode.d.ts +44 -0
  134. package/dist/runtime/vm-mode.d.ts.map +1 -0
  135. package/dist/runtime/vm-mode.js +62 -0
  136. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  137. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  138. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  139. package/dist/runtime/wait-continuation.d.ts +106 -0
  140. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  141. package/dist/runtime/wait-continuation.js +136 -0
  142. package/dist/runtime/wait-until.d.ts +18 -0
  143. package/dist/runtime/wait-until.d.ts.map +1 -0
  144. package/dist/runtime/wait-until.js +42 -0
  145. package/dist/runtime/world-compatibility.d.ts +32 -0
  146. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  147. package/dist/runtime/world-compatibility.js +44 -0
  148. package/dist/runtime/world-init.d.ts +17 -42
  149. package/dist/runtime/world-init.d.ts.map +1 -1
  150. package/dist/runtime/world-init.js +18 -43
  151. package/dist/runtime/world.d.ts +14 -2
  152. package/dist/runtime/world.d.ts.map +1 -1
  153. package/dist/runtime/world.js +75 -19
  154. package/dist/runtime.d.ts +10 -6
  155. package/dist/runtime.d.ts.map +1 -1
  156. package/dist/runtime.js +3911 -489
  157. package/dist/sealed-box.d.ts +167 -0
  158. package/dist/sealed-box.d.ts.map +1 -0
  159. package/dist/sealed-box.js +571 -0
  160. package/dist/serialization/client.d.ts +3 -3
  161. package/dist/serialization/client.d.ts.map +1 -1
  162. package/dist/serialization/client.js +8 -4
  163. package/dist/serialization/codec-devalue-vm.d.ts +16 -0
  164. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  165. package/dist/serialization/codec-devalue-vm.js +148 -0
  166. package/dist/serialization/codec-devalue.d.ts +1 -1
  167. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  168. package/dist/serialization/codec-devalue.js +24 -6
  169. package/dist/serialization/codec.d.ts +37 -2
  170. package/dist/serialization/codec.d.ts.map +1 -1
  171. package/dist/serialization/codec.js +2 -2
  172. package/dist/serialization/compression.d.ts +105 -0
  173. package/dist/serialization/compression.d.ts.map +1 -0
  174. package/dist/serialization/compression.js +261 -0
  175. package/dist/serialization/encryption.d.ts +119 -17
  176. package/dist/serialization/encryption.d.ts.map +1 -1
  177. package/dist/serialization/encryption.js +152 -17
  178. package/dist/serialization/errors.d.ts +13 -0
  179. package/dist/serialization/errors.d.ts.map +1 -1
  180. package/dist/serialization/errors.js +20 -2
  181. package/dist/serialization/format.d.ts +6 -6
  182. package/dist/serialization/format.js +7 -7
  183. package/dist/serialization/hardened.d.ts +156 -0
  184. package/dist/serialization/hardened.d.ts.map +1 -0
  185. package/dist/serialization/hardened.js +538 -0
  186. package/dist/serialization/index.d.ts +10 -8
  187. package/dist/serialization/index.d.ts.map +1 -1
  188. package/dist/serialization/index.js +10 -8
  189. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  190. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  191. package/dist/serialization/reducers/class-vm.js +77 -0
  192. package/dist/serialization/reducers/class.d.ts.map +1 -1
  193. package/dist/serialization/reducers/class.js +11 -6
  194. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  195. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  196. package/dist/serialization/reducers/common-vm.js +616 -0
  197. package/dist/serialization/reducers/common.d.ts +1 -1
  198. package/dist/serialization/reducers/common.d.ts.map +1 -1
  199. package/dist/serialization/reducers/common.js +202 -62
  200. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  201. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  202. package/dist/serialization/reducers/step-function-vm.js +97 -0
  203. package/dist/serialization/reducers/step-function.d.ts.map +1 -1
  204. package/dist/serialization/reducers/step-function.js +25 -9
  205. package/dist/serialization/step.d.ts +4 -4
  206. package/dist/serialization/step.d.ts.map +1 -1
  207. package/dist/serialization/step.js +9 -5
  208. package/dist/serialization/types.d.ts +80 -1
  209. package/dist/serialization/types.d.ts.map +1 -1
  210. package/dist/serialization/types.js +15 -1
  211. package/dist/serialization/workflow-vm.d.ts +29 -0
  212. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  213. package/dist/serialization/workflow-vm.js +74 -0
  214. package/dist/serialization-format.d.ts +64 -8
  215. package/dist/serialization-format.d.ts.map +1 -1
  216. package/dist/serialization-format.js +225 -73
  217. package/dist/serialization.d.ts +262 -34
  218. package/dist/serialization.d.ts.map +1 -1
  219. package/dist/serialization.js +1885 -277
  220. package/dist/set-attributes.d.ts +13 -0
  221. package/dist/set-attributes.d.ts.map +1 -0
  222. package/dist/set-attributes.js +60 -0
  223. package/dist/source-map.d.ts +25 -0
  224. package/dist/source-map.d.ts.map +1 -1
  225. package/dist/source-map.js +154 -10
  226. package/dist/step/context-storage.d.ts +63 -2
  227. package/dist/step/context-storage.d.ts.map +1 -1
  228. package/dist/step/context-storage.js +7 -5
  229. package/dist/step/writable-stream.d.ts +3 -3
  230. package/dist/step/writable-stream.d.ts.map +1 -1
  231. package/dist/step/writable-stream.js +80 -13
  232. package/dist/step.d.ts.map +1 -1
  233. package/dist/step.js +148 -27
  234. package/dist/symbols.d.ts +50 -0
  235. package/dist/symbols.d.ts.map +1 -1
  236. package/dist/symbols.js +51 -1
  237. package/dist/telemetry/semantic-conventions.d.ts +433 -2
  238. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  239. package/dist/telemetry/semantic-conventions.js +319 -3
  240. package/dist/telemetry.d.ts +91 -0
  241. package/dist/telemetry.d.ts.map +1 -1
  242. package/dist/telemetry.js +244 -17
  243. package/dist/test-support/orchestrator-context.d.ts +25 -0
  244. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  245. package/dist/test-support/orchestrator-context.js +107 -0
  246. package/dist/types.d.ts +6 -0
  247. package/dist/types.d.ts.map +1 -1
  248. package/dist/types.js +23 -1
  249. package/dist/util.d.ts +0 -5
  250. package/dist/util.d.ts.map +1 -1
  251. package/dist/util.js +1 -15
  252. package/dist/version.d.ts +1 -1
  253. package/dist/version.d.ts.map +1 -1
  254. package/dist/version.js +2 -2
  255. package/dist/vm/index.d.ts.map +1 -1
  256. package/dist/vm/index.js +84 -14
  257. package/dist/vm/script-cache.d.ts +26 -0
  258. package/dist/vm/script-cache.d.ts.map +1 -0
  259. package/dist/vm/script-cache.js +131 -0
  260. package/dist/vm/uint8array-base64.js +1 -1
  261. package/dist/workflow/abort-controller.d.ts +2 -2
  262. package/dist/workflow/abort-controller.d.ts.map +1 -1
  263. package/dist/workflow/abort-controller.js +88 -21
  264. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  265. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  266. package/dist/workflow/attribute-dispatcher.js +45 -0
  267. package/dist/workflow/create-hook.d.ts.map +1 -1
  268. package/dist/workflow/create-hook.js +24 -3
  269. package/dist/workflow/get-workflow-metadata.js +2 -2
  270. package/dist/workflow/hook.d.ts.map +1 -1
  271. package/dist/workflow/hook.js +304 -47
  272. package/dist/workflow/index.d.ts +1 -0
  273. package/dist/workflow/index.d.ts.map +1 -1
  274. package/dist/workflow/index.js +2 -1
  275. package/dist/workflow/set-attributes.d.ts +68 -0
  276. package/dist/workflow/set-attributes.d.ts.map +1 -0
  277. package/dist/workflow/set-attributes.js +60 -0
  278. package/dist/workflow/sleep.d.ts.map +1 -1
  279. package/dist/workflow/sleep.js +58 -12
  280. package/dist/workflow/world-init-stub.d.ts +3 -3
  281. package/dist/workflow/world-init-stub.js +4 -4
  282. package/dist/workflow.d.ts +95 -3
  283. package/dist/workflow.d.ts.map +1 -1
  284. package/dist/workflow.js +900 -561
  285. package/docs/api-reference/create-hook.mdx +89 -10
  286. package/docs/api-reference/create-webhook.mdx +16 -15
  287. package/docs/api-reference/define-hook.mdx +35 -33
  288. package/docs/api-reference/fatal-error.mdx +30 -8
  289. package/docs/api-reference/fetch.mdx +14 -10
  290. package/docs/api-reference/get-step-metadata.mdx +2 -2
  291. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  292. package/docs/api-reference/get-writable.mdx +7 -7
  293. package/docs/api-reference/index.mdx +4 -1
  294. package/docs/api-reference/retryable-error.mdx +1 -1
  295. package/docs/api-reference/set-attributes.mdx +61 -0
  296. package/docs/api-reference/sleep.mdx +4 -4
  297. package/docs/foundations/cancellation.mdx +31 -32
  298. package/docs/foundations/errors-and-retries.mdx +42 -11
  299. package/docs/foundations/hooks.mdx +64 -35
  300. package/docs/foundations/idempotency.mdx +244 -12
  301. package/docs/foundations/index.mdx +1 -23
  302. package/docs/foundations/meta.json +2 -1
  303. package/docs/foundations/serialization.mdx +21 -22
  304. package/docs/foundations/starting-workflows.mdx +106 -30
  305. package/docs/foundations/streaming.mdx +108 -60
  306. package/docs/foundations/versioning.mdx +263 -0
  307. package/docs/foundations/workflows-and-steps.mdx +9 -9
  308. package/docs/how-it-works/cancellation.mdx +63 -63
  309. package/docs/how-it-works/code-transform.mdx +83 -67
  310. package/docs/how-it-works/encryption.mdx +30 -26
  311. package/docs/how-it-works/event-sourcing.mdx +125 -34
  312. package/docs/how-it-works/framework-integrations.mdx +96 -337
  313. package/docs/how-it-works/understanding-directives.mdx +22 -22
  314. package/package.json +24 -15
  315. package/dist/runtime/step-handler.d.ts +0 -2
  316. package/dist/runtime/step-handler.d.ts.map +0 -1
  317. package/dist/runtime/step-handler.js +0 -776
@@ -0,0 +1,150 @@
1
+ import type { HookResumeTiming } from '@workflow/world';
2
+ /**
3
+ * Hook-triggered time-to-resume (TTR): wall-clock from entry into
4
+ * `resumeHook()` (T0) to the first line of the next durable step (T7), plus a
5
+ * decomposition into non-overlapping phases that sum exactly to it.
6
+ *
7
+ * ```text
8
+ * T0 resumeHook() entered
9
+ * producer_prep : hook lookup, serialization, encryption
10
+ * T1 queue publish requested
11
+ * queue_delivery : network + VQS delivery (incl. any affinity re-route)
12
+ * T2 final consumer's queue handler entered
13
+ * resume_setup : affinity check, hook_received re-ensure, replay preload
14
+ * T3 replay begins
15
+ * replay : VM/session creation and workflow replay
16
+ * T4 next durable step encountered
17
+ * step_dispatch : suspension handling, inline batch or queue dispatch
18
+ * T5 step_started request begins
19
+ * step_claim : the claim round trip
20
+ * T6 step_started response returned
21
+ * step_prepare : key resolution, argument hydration, context setup
22
+ * T7 immediately before stepFn.apply()
23
+ * ```
24
+ *
25
+ * The producer's `hook_received` write is awaited inside `producer_prep`
26
+ * (the wake is only published after it commits). Older producers may report
27
+ * `lazy`, where the consumer materializes the event from `hookInput`, or
28
+ * `parallel`, where the write raced the publish. The write has no phase of
29
+ * its own; it remains visible as a contextual span (`hook.resume`).
30
+ *
31
+ * T0/T1 are stamped on the producer's machine and T2..T7 on the consumer's, so
32
+ * the measurement is subject to cross-machine clock skew. Rather than clamp
33
+ * (which would break the sum-equals-total property this decomposition exists
34
+ * for), a non-monotonic boundary set drops the whole sample; see
35
+ * {@link computeResumeTtrAttributes}.
36
+ */
37
+ /** What caused the resumption being measured. Only hooks are measured today. */
38
+ export type ResumeTrigger = 'hook';
39
+ /**
40
+ * Which `resumeHook()` dispatch path produced this resume.
41
+ *
42
+ * Current producers always send `sequential` (durable write, then wake).
43
+ * Older producers may send `lazy` (the consumer materializes the event from
44
+ * `hookInput`) or `parallel` (the write raced the publish).
45
+ */
46
+ export type ResumeStrategy = 'lazy' | 'parallel' | 'sequential';
47
+ /**
48
+ * How the consuming invocation initialized its replay state:
49
+ *
50
+ * - `hook_preload`: the hoisted `hook_received` write returned a usable
51
+ * replay preload, so neither `run_started` nor the initial `events.list` ran.
52
+ * - `run_started`: the generic `run_started` setup ran (including the fast
53
+ * path's fallback, where the hoisted write succeeded but returned no usable
54
+ * preload).
55
+ * - `event_load`: neither setup ran because the run arrived already loaded,
56
+ * so setup was a plain event load. No current path produces it (the one
57
+ * preloaded-run path, the background-step fall-through, consumes the
58
+ * tracking on its own step first); it is the honest default rather than a
59
+ * live value, and keeps the dimension total if such a path is added.
60
+ */
61
+ export type ResumeSetupSource = 'hook_preload' | 'run_started' | 'event_load';
62
+ /** Whether the measured step ran in the resuming invocation or a queued one. */
63
+ export type ResumeStepExecution = 'inline' | 'dispatched';
64
+ /**
65
+ * The resume boundaries observed so far, threaded from the queue handler into
66
+ * `executeStep`. Producer fields arrive on the queue message
67
+ * ({@link HookResumeTiming}); consumer fields are stamped by the invocation
68
+ * that replays the resume.
69
+ *
70
+ * The runtime holds at most one of these per invocation and CONSUMES it when
71
+ * it hands it to the execution that will attempt the next durable step, so a
72
+ * later step in the same invocation (or a retry of the same step) never
73
+ * re-reports the same resumption. Within one inline batch the object is
74
+ * shared by every step and the {@link ResumeTtrTracking.reported} latch picks
75
+ * the single reporter.
76
+ */
77
+ export interface ResumeTtrTracking {
78
+ trigger: ResumeTrigger;
79
+ /** Absent only if an older producer omitted it from the queue message. */
80
+ strategy?: ResumeStrategy;
81
+ /** T0: entry into `resumeHook()`. */
82
+ resumeRequestedAtMs: number;
83
+ /** T1: immediately before the queue publish was requested. */
84
+ queuePublishRequestedAtMs: number;
85
+ /**
86
+ * T2: entry into the FINAL consumer's queue handler. A delivery that
87
+ * re-routes for deployment affinity never stamps this, so the re-routed hop
88
+ * stays inside `queue_delivery` where it belongs.
89
+ */
90
+ consumerStartedAtMs: number;
91
+ /** T3: this invocation's first replay pass. */
92
+ replayStartedAtMs?: number;
93
+ /** T4: replay first encountered a durable step after the resume. */
94
+ nextStepEncounteredAtMs?: number;
95
+ setupSource?: ResumeSetupSource;
96
+ stepExecution: ResumeStepExecution;
97
+ /**
98
+ * One-shot latch, set by the step executor once this resumption has been
99
+ * reported. Every step of an inline batch is handed the SAME tracking
100
+ * object, so the first one to reach user code takes the measurement and the
101
+ * rest see this and skip: one resumption, one sample, without pinning the
102
+ * sample to a step that may lose its create-claim and never run.
103
+ *
104
+ * Deliberately not part of {@link HookResumeTiming}: it is invocation-local
105
+ * state, and a queue message carries the boundaries, not the claim.
106
+ */
107
+ reported?: boolean;
108
+ }
109
+ /**
110
+ * Rebuild tracking from a queue message's timing object. Returns undefined for
111
+ * a message that carries none (an older producer, or any non-hook delivery);
112
+ * the caller then reports no TTR.
113
+ */
114
+ export declare function resumeTrackingFromMessage(timing: HookResumeTiming | undefined, stepExecution: ResumeStepExecution): ResumeTtrTracking | undefined;
115
+ /**
116
+ * Serialize tracking back onto a queue message, for the case where the
117
+ * resuming invocation dispatches the next durable step to another invocation
118
+ * instead of running it inline. Returns undefined when the tracking is not
119
+ * complete enough to be worth forwarding.
120
+ */
121
+ export declare function resumeTimingForMessage(tracking: ResumeTtrTracking | undefined): HookResumeTiming | undefined;
122
+ /**
123
+ * Compute the TTR span attributes for a step that is the first durable step
124
+ * following a hook resume. Returns undefined (emitting nothing at all) when
125
+ * any of these hold:
126
+ *
127
+ * - the invocation carries no resume tracking (not a hook resume, or an older
128
+ * queue message with no timing);
129
+ * - this is a retry (`attempt !== 1`), which measures a re-execution rather
130
+ * than the resumption;
131
+ * - a required boundary is missing, non-finite, or out of order.
132
+ *
133
+ * `step_claim_ms` is the one phase that may be individually omitted. Under
134
+ * optimistic inline start the `step_started` claim is deliberately NOT awaited
135
+ * before the body runs, so its completion instant does not exist yet at T7;
136
+ * rather than invent one, the claim phase is dropped and `step_prepare_ms`
137
+ * spans T5→T7. The sum-equals-total property holds either way.
138
+ */
139
+ export declare function computeResumeTtrAttributes(params: {
140
+ tracking: ResumeTtrTracking | undefined;
141
+ /** The attempt number of the execution about to run. */
142
+ attempt: number;
143
+ /** T5: `Date.now()` immediately before the `step_started` request. */
144
+ stepClaimStartedAtMs: number | undefined;
145
+ /** T6: `Date.now()` once the `step_started` response returned. */
146
+ stepClaimCompletedAtMs: number | undefined;
147
+ /** T7: `Date.now()` immediately before `stepFn.apply()`. */
148
+ stepCodeStartedAtMs: number;
149
+ }): Record<string, string | number> | undefined;
150
+ //# sourceMappingURL=resume-latency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/resume-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9E,gFAAgF;AAChF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,qCAAqC;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,yBAAyB,EAAE,MAAM,CAAC;IAClC;;;;OAIG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,aAAa,EAAE,mBAAmB,CAAC;IACnC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,aAAa,EAAE,mBAAmB,GACjC,iBAAiB,GAAG,SAAS,CAkC/B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GACtC,gBAAgB,GAAG,SAAS,CAkB9B;AA6CD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACxC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,kEAAkE;IAClE,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,4DAA4D;IAC5D,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,CAoD9C"}
@@ -0,0 +1,155 @@
1
+ import * as Attribute from '../telemetry/semantic-conventions.js';
2
+ /**
3
+ * Rebuild tracking from a queue message's timing object. Returns undefined for
4
+ * a message that carries none (an older producer, or any non-hook delivery);
5
+ * the caller then reports no TTR.
6
+ */
7
+ export function resumeTrackingFromMessage(timing, stepExecution) {
8
+ if (!timing)
9
+ return undefined;
10
+ if (!Number.isFinite(timing.resumeRequestedAtMs) ||
11
+ !Number.isFinite(timing.queuePublishRequestedAtMs)) {
12
+ return undefined;
13
+ }
14
+ return {
15
+ trigger: 'hook',
16
+ ...(timing.strategy === 'lazy' ||
17
+ timing.strategy === 'parallel' ||
18
+ timing.strategy === 'sequential'
19
+ ? { strategy: timing.strategy }
20
+ : {}),
21
+ resumeRequestedAtMs: timing.resumeRequestedAtMs,
22
+ queuePublishRequestedAtMs: timing.queuePublishRequestedAtMs,
23
+ // A dispatched step reads the resuming invocation's boundaries off the
24
+ // message; an inline one has them stamped locally by the caller, which
25
+ // overwrites this placeholder immediately after construction.
26
+ consumerStartedAtMs: timing.consumerStartedAtMs ?? Number.NaN,
27
+ ...(timing.replayStartedAtMs !== undefined
28
+ ? { replayStartedAtMs: timing.replayStartedAtMs }
29
+ : {}),
30
+ ...(timing.nextStepEncounteredAtMs !== undefined
31
+ ? { nextStepEncounteredAtMs: timing.nextStepEncounteredAtMs }
32
+ : {}),
33
+ ...(timing.setupSource === 'hook_preload' ||
34
+ timing.setupSource === 'run_started' ||
35
+ timing.setupSource === 'event_load'
36
+ ? { setupSource: timing.setupSource }
37
+ : {}),
38
+ stepExecution,
39
+ };
40
+ }
41
+ /**
42
+ * Serialize tracking back onto a queue message, for the case where the
43
+ * resuming invocation dispatches the next durable step to another invocation
44
+ * instead of running it inline. Returns undefined when the tracking is not
45
+ * complete enough to be worth forwarding.
46
+ */
47
+ export function resumeTimingForMessage(tracking) {
48
+ if (!tracking)
49
+ return undefined;
50
+ if (!Number.isFinite(tracking.consumerStartedAtMs))
51
+ return undefined;
52
+ return {
53
+ resumeRequestedAtMs: tracking.resumeRequestedAtMs,
54
+ queuePublishRequestedAtMs: tracking.queuePublishRequestedAtMs,
55
+ ...(tracking.strategy !== undefined ? { strategy: tracking.strategy } : {}),
56
+ consumerStartedAtMs: tracking.consumerStartedAtMs,
57
+ ...(tracking.replayStartedAtMs !== undefined
58
+ ? { replayStartedAtMs: tracking.replayStartedAtMs }
59
+ : {}),
60
+ ...(tracking.nextStepEncounteredAtMs !== undefined
61
+ ? { nextStepEncounteredAtMs: tracking.nextStepEncounteredAtMs }
62
+ : {}),
63
+ ...(tracking.setupSource !== undefined
64
+ ? { setupSource: tracking.setupSource }
65
+ : {}),
66
+ };
67
+ }
68
+ /**
69
+ * Validate that every required boundary is a finite epoch-ms value and that
70
+ * the whole sequence is non-decreasing. Returns undefined otherwise, which
71
+ * suppresses the metric entirely rather than reporting a phase that never
72
+ * happened or a negative duration.
73
+ */
74
+ function validateBoundaries(b) {
75
+ const ordered = [
76
+ b.resumeRequestedAtMs,
77
+ b.queuePublishRequestedAtMs,
78
+ b.consumerStartedAtMs,
79
+ b.replayStartedAtMs,
80
+ b.nextStepEncounteredAtMs,
81
+ b.stepClaimStartedAtMs,
82
+ ...(b.stepClaimCompletedAtMs !== undefined
83
+ ? [b.stepClaimCompletedAtMs]
84
+ : []),
85
+ b.stepCodeStartedAtMs,
86
+ ];
87
+ for (const value of ordered) {
88
+ if (typeof value !== 'number' || !Number.isFinite(value))
89
+ return undefined;
90
+ }
91
+ for (let i = 1; i < ordered.length; i++) {
92
+ if (ordered[i] < ordered[i - 1])
93
+ return undefined;
94
+ }
95
+ return ordered;
96
+ }
97
+ /**
98
+ * Compute the TTR span attributes for a step that is the first durable step
99
+ * following a hook resume. Returns undefined (emitting nothing at all) when
100
+ * any of these hold:
101
+ *
102
+ * - the invocation carries no resume tracking (not a hook resume, or an older
103
+ * queue message with no timing);
104
+ * - this is a retry (`attempt !== 1`), which measures a re-execution rather
105
+ * than the resumption;
106
+ * - a required boundary is missing, non-finite, or out of order.
107
+ *
108
+ * `step_claim_ms` is the one phase that may be individually omitted. Under
109
+ * optimistic inline start the `step_started` claim is deliberately NOT awaited
110
+ * before the body runs, so its completion instant does not exist yet at T7;
111
+ * rather than invent one, the claim phase is dropped and `step_prepare_ms`
112
+ * spans T5→T7. The sum-equals-total property holds either way.
113
+ */
114
+ export function computeResumeTtrAttributes(params) {
115
+ const { tracking } = params;
116
+ if (!tracking || params.attempt !== 1)
117
+ return undefined;
118
+ if (tracking.replayStartedAtMs === undefined ||
119
+ tracking.nextStepEncounteredAtMs === undefined ||
120
+ params.stepClaimStartedAtMs === undefined) {
121
+ return undefined;
122
+ }
123
+ const boundaries = {
124
+ resumeRequestedAtMs: tracking.resumeRequestedAtMs,
125
+ queuePublishRequestedAtMs: tracking.queuePublishRequestedAtMs,
126
+ consumerStartedAtMs: tracking.consumerStartedAtMs,
127
+ replayStartedAtMs: tracking.replayStartedAtMs,
128
+ nextStepEncounteredAtMs: tracking.nextStepEncounteredAtMs,
129
+ stepClaimStartedAtMs: params.stepClaimStartedAtMs,
130
+ stepClaimCompletedAtMs: params.stepClaimCompletedAtMs,
131
+ stepCodeStartedAtMs: params.stepCodeStartedAtMs,
132
+ };
133
+ if (!validateBoundaries(boundaries))
134
+ return undefined;
135
+ const { resumeRequestedAtMs: t0, queuePublishRequestedAtMs: t1, consumerStartedAtMs: t2, replayStartedAtMs: t3, nextStepEncounteredAtMs: t4, stepClaimStartedAtMs: t5, stepClaimCompletedAtMs: t6, stepCodeStartedAtMs: t7, } = boundaries;
136
+ return {
137
+ ...Attribute.ResumeTotalMs(t7 - t0),
138
+ ...Attribute.ResumeProducerPrepMs(t1 - t0),
139
+ ...Attribute.ResumeQueueDeliveryMs(t2 - t1),
140
+ ...Attribute.ResumeSetupMs(t3 - t2),
141
+ ...Attribute.ResumeReplayMs(t4 - t3),
142
+ ...Attribute.ResumeStepDispatchMs(t5 - t4),
143
+ ...(t6 !== undefined ? Attribute.ResumeStepClaimMs(t6 - t5) : {}),
144
+ ...Attribute.ResumeStepPrepareMs(t7 - (t6 ?? t5)),
145
+ ...Attribute.ResumeTrigger(tracking.trigger),
146
+ ...(tracking.strategy !== undefined
147
+ ? Attribute.ResumeStrategy(tracking.strategy)
148
+ : {}),
149
+ ...(tracking.setupSource !== undefined
150
+ ? Attribute.ResumeSetupSource(tracking.setupSource)
151
+ : {}),
152
+ ...Attribute.ResumeStepExecution(tracking.stepExecution),
153
+ };
154
+ }
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWxhdGVuY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBbUhsRTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxNQUFvQyxFQUNwQyxhQUFrQztJQUVsQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLElBQ0UsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUM1QyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEVBQ2xELENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTztRQUNMLE9BQU8sRUFBRSxNQUFNO1FBQ2YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTTtZQUM5QixNQUFNLENBQUMsUUFBUSxLQUFLLFVBQVU7WUFDOUIsTUFBTSxDQUFDLFFBQVEsS0FBSyxZQUFZO1lBQzlCLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQy9CLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxtQkFBbUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CO1FBQy9DLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyx5QkFBeUI7UUFDM0QsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSw4REFBOEQ7UUFDOUQsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxHQUFHO1FBQzdELEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEtBQUssU0FBUztZQUN4QyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCLEVBQUU7WUFDakQsQ0FB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QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIb29rUmVzdW1lVGltaW5nIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuXG4vKipcbiAqIEhvb2stdHJpZ2dlcmVkIHRpbWUtdG8tcmVzdW1lIChUVFIpOiB3YWxsLWNsb2NrIGZyb20gZW50cnkgaW50b1xuICogYHJlc3VtZUhvb2soKWAgKFQwKSB0byB0aGUgZmlyc3QgbGluZSBvZiB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAgKFQ3KSwgcGx1cyBhXG4gKiBkZWNvbXBvc2l0aW9uIGludG8gbm9uLW92ZXJsYXBwaW5nIHBoYXNlcyB0aGF0IHN1bSBleGFjdGx5IHRvIGl0LlxuICpcbiAqIGBgYHRleHRcbiAqIFQwIHJlc3VtZUhvb2soKSBlbnRlcmVkXG4gKiAgICAgIHByb2R1Y2VyX3ByZXAgICA6IGhvb2sgbG9va3VwLCBzZXJpYWxpemF0aW9uLCBlbmNyeXB0aW9uXG4gKiBUMSBxdWV1ZSBwdWJsaXNoIHJlcXVlc3RlZFxuICogICAgICBxdWV1ZV9kZWxpdmVyeSAgOiBuZXR3b3JrICsgVlFTIGRlbGl2ZXJ5IChpbmNsLiBhbnkgYWZmaW5pdHkgcmUtcm91dGUpXG4gKiBUMiBmaW5hbCBjb25zdW1lcidzIHF1ZXVlIGhhbmRsZXIgZW50ZXJlZFxuICogICAgICByZXN1bWVfc2V0dXAgICAgOiBhZmZpbml0eSBjaGVjaywgaG9va19yZWNlaXZlZCByZS1lbnN1cmUsIHJlcGxheSBwcmVsb2FkXG4gKiBUMyByZXBsYXkgYmVnaW5zXG4gKiAgICAgIHJlcGxheSAgICAgICAgICA6IFZNL3Nlc3Npb24gY3JlYXRpb24gYW5kIHdvcmtmbG93IHJlcGxheVxuICogVDQgbmV4dCBkdXJhYmxlIHN0ZXAgZW5jb3VudGVyZWRcbiAqICAgICAgc3RlcF9kaXNwYXRjaCAgIDogc3VzcGVuc2lvbiBoYW5kbGluZywgaW5saW5lIGJhdGNoIG9yIHF1ZXVlIGRpc3BhdGNoXG4gKiBUNSBzdGVwX3N0YXJ0ZWQgcmVxdWVzdCBiZWdpbnNcbiAqICAgICAgc3RlcF9jbGFpbSAgICAgIDogdGhlIGNsYWltIHJvdW5kIHRyaXBcbiAqIFQ2IHN0ZXBfc3RhcnRlZCByZXNwb25zZSByZXR1cm5lZFxuICogICAgICBzdGVwX3ByZXBhcmUgICAgOiBrZXkgcmVzb2x1dGlvbiwgYXJndW1lbnQgaHlkcmF0aW9uLCBjb250ZXh0IHNldHVwXG4gKiBUNyBpbW1lZGlhdGVseSBiZWZvcmUgc3RlcEZuLmFwcGx5KClcbiAqIGBgYFxuICpcbiAqIFRoZSBwcm9kdWNlcidzIGBob29rX3JlY2VpdmVkYCB3cml0ZSBpcyBhd2FpdGVkIGluc2lkZSBgcHJvZHVjZXJfcHJlcGBcbiAqICh0aGUgd2FrZSBpcyBvbmx5IHB1Ymxpc2hlZCBhZnRlciBpdCBjb21taXRzKS4gT2xkZXIgcHJvZHVjZXJzIG1heSByZXBvcnRcbiAqIGBsYXp5YCwgd2hlcmUgdGhlIGNvbnN1bWVyIG1hdGVyaWFsaXplcyB0aGUgZXZlbnQgZnJvbSBgaG9va0lucHV0YCwgb3JcbiAqIGBwYXJhbGxlbGAsIHdoZXJlIHRoZSB3cml0ZSByYWNlZCB0aGUgcHVibGlzaC4gVGhlIHdyaXRlIGhhcyBubyBwaGFzZSBvZlxuICogaXRzIG93bjsgaXQgcmVtYWlucyB2aXNpYmxlIGFzIGEgY29udGV4dHVhbCBzcGFuIChgaG9vay5yZXN1bWVgKS5cbiAqXG4gKiBUMC9UMSBhcmUgc3RhbXBlZCBvbiB0aGUgcHJvZHVjZXIncyBtYWNoaW5lIGFuZCBUMi4uVDcgb24gdGhlIGNvbnN1bWVyJ3MsIHNvXG4gKiB0aGUgbWVhc3VyZW1lbnQgaXMgc3ViamVjdCB0byBjcm9zcy1tYWNoaW5lIGNsb2NrIHNrZXcuIFJhdGhlciB0aGFuIGNsYW1wXG4gKiAod2hpY2ggd291bGQgYnJlYWsgdGhlIHN1bS1lcXVhbHMtdG90YWwgcHJvcGVydHkgdGhpcyBkZWNvbXBvc2l0aW9uIGV4aXN0c1xuICogZm9yKSwgYSBub24tbW9ub3RvbmljIGJvdW5kYXJ5IHNldCBkcm9wcyB0aGUgd2hvbGUgc2FtcGxlOyBzZWVcbiAqIHtAbGluayBjb21wdXRlUmVzdW1lVHRyQXR0cmlidXRlc30uXG4gKi9cblxuLyoqIFdoYXQgY2F1c2VkIHRoZSByZXN1bXB0aW9uIGJlaW5nIG1lYXN1cmVkLiBPbmx5IGhvb2tzIGFyZSBtZWFzdXJlZCB0b2RheS4gKi9cbmV4cG9ydCB0eXBlIFJlc3VtZVRyaWdnZXIgPSAnaG9vayc7XG5cbi8qKlxuICogV2hpY2ggYHJlc3VtZUhvb2soKWAgZGlzcGF0Y2ggcGF0aCBwcm9kdWNlZCB0aGlzIHJlc3VtZS5cbiAqXG4gKiBDdXJyZW50IHByb2R1Y2VycyBhbHdheXMgc2VuZCBgc2VxdWVudGlhbGAgKGR1cmFibGUgd3JpdGUsIHRoZW4gd2FrZSkuXG4gKiBPbGRlciBwcm9kdWNlcnMgbWF5IHNlbmQgYGxhenlgICh0aGUgY29uc3VtZXIgbWF0ZXJpYWxpemVzIHRoZSBldmVudCBmcm9tXG4gKiBgaG9va0lucHV0YCkgb3IgYHBhcmFsbGVsYCAodGhlIHdyaXRlIHJhY2VkIHRoZSBwdWJsaXNoKS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzdW1lU3RyYXRlZ3kgPSAnbGF6eScgfCAncGFyYWxsZWwnIHwgJ3NlcXVlbnRpYWwnO1xuXG4vKipcbiAqIEhvdyB0aGUgY29uc3VtaW5nIGludm9jYXRpb24gaW5pdGlhbGl6ZWQgaXRzIHJlcGxheSBzdGF0ZTpcbiAqXG4gKiAtIGBob29rX3ByZWxvYWRgOiB0aGUgaG9pc3RlZCBgaG9va19yZWNlaXZlZGAgd3JpdGUgcmV0dXJuZWQgYSB1c2FibGVcbiAqICAgcmVwbGF5IHByZWxvYWQsIHNvIG5laXRoZXIgYHJ1bl9zdGFydGVkYCBub3IgdGhlIGluaXRpYWwgYGV2ZW50cy5saXN0YCByYW4uXG4gKiAtIGBydW5fc3RhcnRlZGA6IHRoZSBnZW5lcmljIGBydW5fc3RhcnRlZGAgc2V0dXAgcmFuIChpbmNsdWRpbmcgdGhlIGZhc3RcbiAqICAgcGF0aCdzIGZhbGxiYWNrLCB3aGVyZSB0aGUgaG9pc3RlZCB3cml0ZSBzdWNjZWVkZWQgYnV0IHJldHVybmVkIG5vIHVzYWJsZVxuICogICBwcmVsb2FkKS5cbiAqIC0gYGV2ZW50X2xvYWRgOiBuZWl0aGVyIHNldHVwIHJhbiBiZWNhdXNlIHRoZSBydW4gYXJyaXZlZCBhbHJlYWR5IGxvYWRlZCxcbiAqICAgc28gc2V0dXAgd2FzIGEgcGxhaW4gZXZlbnQgbG9hZC4gTm8gY3VycmVudCBwYXRoIHByb2R1Y2VzIGl0ICh0aGUgb25lXG4gKiAgIHByZWxvYWRlZC1ydW4gcGF0aCwgdGhlIGJhY2tncm91bmQtc3RlcCBmYWxsLXRocm91Z2gsIGNvbnN1bWVzIHRoZVxuICogICB0cmFja2luZyBvbiBpdHMgb3duIHN0ZXAgZmlyc3QpOyBpdCBpcyB0aGUgaG9uZXN0IGRlZmF1bHQgcmF0aGVyIHRoYW4gYVxuICogICBsaXZlIHZhbHVlLCBhbmQga2VlcHMgdGhlIGRpbWVuc2lvbiB0b3RhbCBpZiBzdWNoIGEgcGF0aCBpcyBhZGRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzdW1lU2V0dXBTb3VyY2UgPSAnaG9va19wcmVsb2FkJyB8ICdydW5fc3RhcnRlZCcgfCAnZXZlbnRfbG9hZCc7XG5cbi8qKiBXaGV0aGVyIHRoZSBtZWFzdXJlZCBzdGVwIHJhbiBpbiB0aGUgcmVzdW1pbmcgaW52b2NhdGlvbiBvciBhIHF1ZXVlZCBvbmUuICovXG5leHBvcnQgdHlwZSBSZXN1bWVTdGVwRXhlY3V0aW9uID0gJ2lubGluZScgfCAnZGlzcGF0Y2hlZCc7XG5cbi8qKlxuICogVGhlIHJlc3VtZSBib3VuZGFyaWVzIG9ic2VydmVkIHNvIGZhciwgdGhyZWFkZWQgZnJvbSB0aGUgcXVldWUgaGFuZGxlciBpbnRvXG4gKiBgZXhlY3V0ZVN0ZXBgLiBQcm9kdWNlciBmaWVsZHMgYXJyaXZlIG9uIHRoZSBxdWV1ZSBtZXNzYWdlXG4gKiAoe0BsaW5rIEhvb2tSZXN1bWVUaW1pbmd9KTsgY29uc3VtZXIgZmllbGRzIGFyZSBzdGFtcGVkIGJ5IHRoZSBpbnZvY2F0aW9uXG4gKiB0aGF0IHJlcGxheXMgdGhlIHJlc3VtZS5cbiAqXG4gKiBUaGUgcnVudGltZSBob2xkcyBhdCBtb3N0IG9uZSBvZiB0aGVzZSBwZXIgaW52b2NhdGlvbiBhbmQgQ09OU1VNRVMgaXQgd2hlblxuICogaXQgaGFuZHMgaXQgdG8gdGhlIGV4ZWN1dGlvbiB0aGF0IHdpbGwgYXR0ZW1wdCB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAsIHNvIGFcbiAqIGxhdGVyIHN0ZXAgaW4gdGhlIHNhbWUgaW52b2NhdGlvbiAob3IgYSByZXRyeSBvZiB0aGUgc2FtZSBzdGVwKSBuZXZlclxuICogcmUtcmVwb3J0cyB0aGUgc2FtZSByZXN1bXB0aW9uLiBXaXRoaW4gb25lIGlubGluZSBiYXRjaCB0aGUgb2JqZWN0IGlzXG4gKiBzaGFyZWQgYnkgZXZlcnkgc3RlcCBhbmQgdGhlIHtAbGluayBSZXN1bWVUdHJUcmFja2luZy5yZXBvcnRlZH0gbGF0Y2ggcGlja3NcbiAqIHRoZSBzaW5nbGUgcmVwb3J0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdW1lVHRyVHJhY2tpbmcge1xuICB0cmlnZ2VyOiBSZXN1bWVUcmlnZ2VyO1xuICAvKiogQWJzZW50IG9ubHkgaWYgYW4gb2xkZXIgcHJvZHVjZXIgb21pdHRlZCBpdCBmcm9tIHRoZSBxdWV1ZSBtZXNzYWdlLiAqL1xuICBzdHJhdGVneT86IFJlc3VtZVN0cmF0ZWd5O1xuICAvKiogVDA6IGVudHJ5IGludG8gYHJlc3VtZUhvb2soKWAuICovXG4gIHJlc3VtZVJlcXVlc3RlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQxOiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHF1ZXVlIHB1Ymxpc2ggd2FzIHJlcXVlc3RlZC4gKi9cbiAgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNczogbnVtYmVyO1xuICAvKipcbiAgICogVDI6IGVudHJ5IGludG8gdGhlIEZJTkFMIGNvbnN1bWVyJ3MgcXVldWUgaGFuZGxlci4gQSBkZWxpdmVyeSB0aGF0XG4gICAqIHJlLXJvdXRlcyBmb3IgZGVwbG95bWVudCBhZmZpbml0eSBuZXZlciBzdGFtcHMgdGhpcywgc28gdGhlIHJlLXJvdXRlZCBob3BcbiAgICogc3RheXMgaW5zaWRlIGBxdWV1ZV9kZWxpdmVyeWAgd2hlcmUgaXQgYmVsb25ncy5cbiAgICovXG4gIGNvbnN1bWVyU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQzOiB0aGlzIGludm9jYXRpb24ncyBmaXJzdCByZXBsYXkgcGFzcy4gKi9cbiAgcmVwbGF5U3RhcnRlZEF0TXM/OiBudW1iZXI7XG4gIC8qKiBUNDogcmVwbGF5IGZpcnN0IGVuY291bnRlcmVkIGEgZHVyYWJsZSBzdGVwIGFmdGVyIHRoZSByZXN1bWUuICovXG4gIG5leHRTdGVwRW5jb3VudGVyZWRBdE1zPzogbnVtYmVyO1xuICBzZXR1cFNvdXJjZT86IFJlc3VtZVNldHVwU291cmNlO1xuICBzdGVwRXhlY3V0aW9uOiBSZXN1bWVTdGVwRXhlY3V0aW9uO1xuICAvKipcbiAgICogT25lLXNob3QgbGF0Y2gsIHNldCBieSB0aGUgc3RlcCBleGVjdXRvciBvbmNlIHRoaXMgcmVzdW1wdGlvbiBoYXMgYmVlblxuICAgKiByZXBvcnRlZC4gRXZlcnkgc3RlcCBvZiBhbiBpbmxpbmUgYmF0Y2ggaXMgaGFuZGVkIHRoZSBTQU1FIHRyYWNraW5nXG4gICAqIG9iamVjdCwgc28gdGhlIGZpcnN0IG9uZSB0byByZWFjaCB1c2VyIGNvZGUgdGFrZXMgdGhlIG1lYXN1cmVtZW50IGFuZCB0aGVcbiAgICogcmVzdCBzZWUgdGhpcyBhbmQgc2tpcDogb25lIHJlc3VtcHRpb24sIG9uZSBzYW1wbGUsIHdpdGhvdXQgcGlubmluZyB0aGVcbiAgICogc2FtcGxlIHRvIGEgc3RlcCB0aGF0IG1heSBsb3NlIGl0cyBjcmVhdGUtY2xhaW0gYW5kIG5ldmVyIHJ1bi5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IG5vdCBwYXJ0IG9mIHtAbGluayBIb29rUmVzdW1lVGltaW5nfTogaXQgaXMgaW52b2NhdGlvbi1sb2NhbFxuICAgKiBzdGF0ZSwgYW5kIGEgcXVldWUgbWVzc2FnZSBjYXJyaWVzIHRoZSBib3VuZGFyaWVzLCBub3QgdGhlIGNsYWltLlxuICAgKi9cbiAgcmVwb3J0ZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlYnVpbGQgdHJhY2tpbmcgZnJvbSBhIHF1ZXVlIG1lc3NhZ2UncyB0aW1pbmcgb2JqZWN0LiBSZXR1cm5zIHVuZGVmaW5lZCBmb3JcbiAqIGEgbWVzc2FnZSB0aGF0IGNhcnJpZXMgbm9uZSAoYW4gb2xkZXIgcHJvZHVjZXIsIG9yIGFueSBub24taG9vayBkZWxpdmVyeSk7XG4gKiB0aGUgY2FsbGVyIHRoZW4gcmVwb3J0cyBubyBUVFIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN1bWVUcmFja2luZ0Zyb21NZXNzYWdlKFxuICB0aW1pbmc6IEhvb2tSZXN1bWVUaW1pbmcgfCB1bmRlZmluZWQsXG4gIHN0ZXBFeGVjdXRpb246IFJlc3VtZVN0ZXBFeGVjdXRpb25cbik6IFJlc3VtZVR0clRyYWNraW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0aW1pbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICAhTnVtYmVyLmlzRmluaXRlKHRpbWluZy5yZXN1bWVSZXF1ZXN0ZWRBdE1zKSB8fFxuICAgICFOdW1iZXIuaXNGaW5pdGUodGltaW5nLnF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0cmlnZ2VyOiAnaG9vaycsXG4gICAgLi4uKHRpbWluZy5zdHJhdGVneSA9PT0gJ2xhenknIHx8XG4gICAgdGltaW5nLnN0cmF0ZWd5ID09PSAncGFyYWxsZWwnIHx8XG4gICAgdGltaW5nLnN0cmF0ZWd5ID09PSAnc2VxdWVudGlhbCdcbiAgICAgID8geyBzdHJhdGVneTogdGltaW5nLnN0cmF0ZWd5IH1cbiAgICAgIDoge30pLFxuICAgIHJlc3VtZVJlcXVlc3RlZEF0TXM6IHRpbWluZy5yZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXM6IHRpbWluZy5xdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zLFxuICAgIC8vIEEgZGlzcGF0Y2hlZCBzdGVwIHJlYWRzIHRoZSByZXN1bWluZyBpbnZvY2F0aW9uJ3MgYm91bmRhcmllcyBvZmYgdGhlXG4gICAgLy8gbWVzc2FnZTsgYW4gaW5saW5lIG9uZSBoYXMgdGhlbSBzdGFtcGVkIGxvY2FsbHkgYnkgdGhlIGNhbGxlciwgd2hpY2hcbiAgICAvLyBvdmVyd3JpdGVzIHRoaXMgcGxhY2Vob2xkZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICAgIGNvbnN1bWVyU3RhcnRlZEF0TXM6IHRpbWluZy5jb25zdW1lclN0YXJ0ZWRBdE1zID8/IE51bWJlci5OYU4sXG4gICAgLi4uKHRpbWluZy5yZXBsYXlTdGFydGVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgcmVwbGF5U3RhcnRlZEF0TXM6IHRpbWluZy5yZXBsYXlTdGFydGVkQXRNcyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4odGltaW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBuZXh0U3RlcEVuY291bnRlcmVkQXRNczogdGltaW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLih0aW1pbmcuc2V0dXBTb3VyY2UgPT09ICdob29rX3ByZWxvYWQnIHx8XG4gICAgdGltaW5nLnNldHVwU291cmNlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgdGltaW5nLnNldHVwU291cmNlID09PSAnZXZlbnRfbG9hZCdcbiAgICAgID8geyBzZXR1cFNvdXJjZTogdGltaW5nLnNldHVwU291cmNlIH1cbiAgICAgIDoge30pLFxuICAgIHN0ZXBFeGVjdXRpb24sXG4gIH07XG59XG5cbi8qKlxuICogU2VyaWFsaXplIHRyYWNraW5nIGJhY2sgb250byBhIHF1ZXVlIG1lc3NhZ2UsIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVcbiAqIHJlc3VtaW5nIGludm9jYXRpb24gZGlzcGF0Y2hlcyB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAgdG8gYW5vdGhlciBpbnZvY2F0aW9uXG4gKiBpbnN0ZWFkIG9mIHJ1bm5pbmcgaXQgaW5saW5lLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSB0cmFja2luZyBpcyBub3RcbiAqIGNvbXBsZXRlIGVub3VnaCB0byBiZSB3b3J0aCBmb3J3YXJkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzdW1lVGltaW5nRm9yTWVzc2FnZShcbiAgdHJhY2tpbmc6IFJlc3VtZVR0clRyYWNraW5nIHwgdW5kZWZpbmVkXG4pOiBIb29rUmVzdW1lVGltaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0cmFja2luZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodHJhY2tpbmcuY29uc3VtZXJTdGFydGVkQXRNcykpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgcmVzdW1lUmVxdWVzdGVkQXRNczogdHJhY2tpbmcucmVzdW1lUmVxdWVzdGVkQXRNcyxcbiAgICBxdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zOiB0cmFja2luZy5xdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zLFxuICAgIC4uLih0cmFja2luZy5zdHJhdGVneSAhPT0gdW5kZWZpbmVkID8geyBzdHJhdGVneTogdHJhY2tpbmcuc3RyYXRlZ3kgfSA6IHt9KSxcbiAgICBjb25zdW1lclN0YXJ0ZWRBdE1zOiB0cmFja2luZy5jb25zdW1lclN0YXJ0ZWRBdE1zLFxuICAgIC4uLih0cmFja2luZy5yZXBsYXlTdGFydGVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgcmVwbGF5U3RhcnRlZEF0TXM6IHRyYWNraW5nLnJlcGxheVN0YXJ0ZWRBdE1zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLih0cmFja2luZy5uZXh0U3RlcEVuY291bnRlcmVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgbmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXM6IHRyYWNraW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLih0cmFja2luZy5zZXR1cFNvdXJjZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgc2V0dXBTb3VyY2U6IHRyYWNraW5nLnNldHVwU291cmNlIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG4vKiogRXZlcnkgYm91bmRhcnkgdGhlIGVtaXNzaW9uIGdhdGUgcmVxdWlyZXMsIHBsdXMgdGhlIG9wdGlvbmFsIGNsYWltIGVuZC4gKi9cbmludGVyZmFjZSBSZXN1bWVCb3VuZGFyaWVzIHtcbiAgLyoqIFQwICovIHJlc3VtZVJlcXVlc3RlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQxICovIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQyICovIGNvbnN1bWVyU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQzICovIHJlcGxheVN0YXJ0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKiBUNCAqLyBuZXh0U3RlcEVuY291bnRlcmVkQXRNczogbnVtYmVyO1xuICAvKiogVDUgKi8gc3RlcENsYWltU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQ2OiBhYnNlbnQgb24gdGhlIG9wdGltaXN0aWMtc3RhcnQgcGF0aDsgc2VlIGJlbG93LiAqL1xuICBzdGVwQ2xhaW1Db21wbGV0ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBUNyAqLyBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBudW1iZXI7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBldmVyeSByZXF1aXJlZCBib3VuZGFyeSBpcyBhIGZpbml0ZSBlcG9jaC1tcyB2YWx1ZSBhbmQgdGhhdFxuICogdGhlIHdob2xlIHNlcXVlbmNlIGlzIG5vbi1kZWNyZWFzaW5nLiBSZXR1cm5zIHVuZGVmaW5lZCBvdGhlcndpc2UsIHdoaWNoXG4gKiBzdXBwcmVzc2VzIHRoZSBtZXRyaWMgZW50aXJlbHkgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIGEgcGhhc2UgdGhhdCBuZXZlclxuICogaGFwcGVuZWQgb3IgYSBuZWdhdGl2ZSBkdXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCb3VuZGFyaWVzKFxuICBiOiBSZXN1bWVCb3VuZGFyaWVzXG4pOiByZWFkb25seSBudW1iZXJbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG9yZGVyZWQgPSBbXG4gICAgYi5yZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgIGIucXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICBiLmNvbnN1bWVyU3RhcnRlZEF0TXMsXG4gICAgYi5yZXBsYXlTdGFydGVkQXRNcyxcbiAgICBiLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zLFxuICAgIGIuc3RlcENsYWltU3RhcnRlZEF0TXMsXG4gICAgLi4uKGIuc3RlcENsYWltQ29tcGxldGVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IFtiLnN0ZXBDbGFpbUNvbXBsZXRlZEF0TXNdXG4gICAgICA6IFtdKSxcbiAgICBiLnN0ZXBDb2RlU3RhcnRlZEF0TXMsXG4gIF07XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygb3JkZXJlZCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgb3JkZXJlZC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvcmRlcmVkW2ldIDwgb3JkZXJlZFtpIC0gMV0pIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG9yZGVyZWQ7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgVFRSIHNwYW4gYXR0cmlidXRlcyBmb3IgYSBzdGVwIHRoYXQgaXMgdGhlIGZpcnN0IGR1cmFibGUgc3RlcFxuICogZm9sbG93aW5nIGEgaG9vayByZXN1bWUuIFJldHVybnMgdW5kZWZpbmVkIChlbWl0dGluZyBub3RoaW5nIGF0IGFsbCkgd2hlblxuICogYW55IG9mIHRoZXNlIGhvbGQ6XG4gKlxuICogLSB0aGUgaW52b2NhdGlvbiBjYXJyaWVzIG5vIHJlc3VtZSB0cmFja2luZyAobm90IGEgaG9vayByZXN1bWUsIG9yIGFuIG9sZGVyXG4gKiAgIHF1ZXVlIG1lc3NhZ2Ugd2l0aCBubyB0aW1pbmcpO1xuICogLSB0aGlzIGlzIGEgcmV0cnkgKGBhdHRlbXB0ICE9PSAxYCksIHdoaWNoIG1lYXN1cmVzIGEgcmUtZXhlY3V0aW9uIHJhdGhlclxuICogICB0aGFuIHRoZSByZXN1bXB0aW9uO1xuICogLSBhIHJlcXVpcmVkIGJvdW5kYXJ5IGlzIG1pc3NpbmcsIG5vbi1maW5pdGUsIG9yIG91dCBvZiBvcmRlci5cbiAqXG4gKiBgc3RlcF9jbGFpbV9tc2AgaXMgdGhlIG9uZSBwaGFzZSB0aGF0IG1heSBiZSBpbmRpdmlkdWFsbHkgb21pdHRlZC4gVW5kZXJcbiAqIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IHRoZSBgc3RlcF9zdGFydGVkYCBjbGFpbSBpcyBkZWxpYmVyYXRlbHkgTk9UIGF3YWl0ZWRcbiAqIGJlZm9yZSB0aGUgYm9keSBydW5zLCBzbyBpdHMgY29tcGxldGlvbiBpbnN0YW50IGRvZXMgbm90IGV4aXN0IHlldCBhdCBUNztcbiAqIHJhdGhlciB0aGFuIGludmVudCBvbmUsIHRoZSBjbGFpbSBwaGFzZSBpcyBkcm9wcGVkIGFuZCBgc3RlcF9wcmVwYXJlX21zYFxuICogc3BhbnMgVDXihpJUNy4gVGhlIHN1bS1lcXVhbHMtdG90YWwgcHJvcGVydHkgaG9sZHMgZWl0aGVyIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZXN1bWVUdHJBdHRyaWJ1dGVzKHBhcmFtczoge1xuICB0cmFja2luZzogUmVzdW1lVHRyVHJhY2tpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgYXR0ZW1wdCBudW1iZXIgb2YgdGhlIGV4ZWN1dGlvbiBhYm91dCB0byBydW4uICovXG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgLyoqIFQ1OiBgRGF0ZS5ub3coKWAgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBgc3RlcF9zdGFydGVkYCByZXF1ZXN0LiAqL1xuICBzdGVwQ2xhaW1TdGFydGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKiogVDY6IGBEYXRlLm5vdygpYCBvbmNlIHRoZSBgc3RlcF9zdGFydGVkYCByZXNwb25zZSByZXR1cm5lZC4gKi9cbiAgc3RlcENsYWltQ29tcGxldGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKiogVDc6IGBEYXRlLm5vdygpYCBpbW1lZGlhdGVseSBiZWZvcmUgYHN0ZXBGbi5hcHBseSgpYC4gKi9cbiAgc3RlcENvZGVTdGFydGVkQXRNczogbnVtYmVyO1xufSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gfCB1bmRlZmluZWQge1xuICBjb25zdCB7IHRyYWNraW5nIH0gPSBwYXJhbXM7XG4gIGlmICghdHJhY2tpbmcgfHwgcGFyYW1zLmF0dGVtcHQgIT09IDEpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICB0cmFja2luZy5yZXBsYXlTdGFydGVkQXRNcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgdHJhY2tpbmcubmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXMgPT09IHVuZGVmaW5lZCB8fFxuICAgIHBhcmFtcy5zdGVwQ2xhaW1TdGFydGVkQXRNcyA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBib3VuZGFyaWVzOiBSZXN1bWVCb3VuZGFyaWVzID0ge1xuICAgIHJlc3VtZVJlcXVlc3RlZEF0TXM6IHRyYWNraW5nLnJlc3VtZVJlcXVlc3RlZEF0TXMsXG4gICAgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNczogdHJhY2tpbmcucXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICBjb25zdW1lclN0YXJ0ZWRBdE1zOiB0cmFja2luZy5jb25zdW1lclN0YXJ0ZWRBdE1zLFxuICAgIHJlcGxheVN0YXJ0ZWRBdE1zOiB0cmFja2luZy5yZXBsYXlTdGFydGVkQXRNcyxcbiAgICBuZXh0U3RlcEVuY291bnRlcmVkQXRNczogdHJhY2tpbmcubmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXMsXG4gICAgc3RlcENsYWltU3RhcnRlZEF0TXM6IHBhcmFtcy5zdGVwQ2xhaW1TdGFydGVkQXRNcyxcbiAgICBzdGVwQ2xhaW1Db21wbGV0ZWRBdE1zOiBwYXJhbXMuc3RlcENsYWltQ29tcGxldGVkQXRNcyxcbiAgICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBwYXJhbXMuc3RlcENvZGVTdGFydGVkQXRNcyxcbiAgfTtcbiAgaWYgKCF2YWxpZGF0ZUJvdW5kYXJpZXMoYm91bmRhcmllcykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qge1xuICAgIHJlc3VtZVJlcXVlc3RlZEF0TXM6IHQwLFxuICAgIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXM6IHQxLFxuICAgIGNvbnN1bWVyU3RhcnRlZEF0TXM6IHQyLFxuICAgIHJlcGxheVN0YXJ0ZWRBdE1zOiB0MyxcbiAgICBuZXh0U3RlcEVuY291bnRlcmVkQXRNczogdDQsXG4gICAgc3RlcENsYWltU3RhcnRlZEF0TXM6IHQ1LFxuICAgIHN0ZXBDbGFpbUNvbXBsZXRlZEF0TXM6IHQ2LFxuICAgIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IHQ3LFxuICB9ID0gYm91bmRhcmllcztcblxuICByZXR1cm4ge1xuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVUb3RhbE1zKHQ3IC0gdDApLFxuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVQcm9kdWNlclByZXBNcyh0MSAtIHQwKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lUXVldWVEZWxpdmVyeU1zKHQyIC0gdDEpLFxuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVTZXR1cE1zKHQzIC0gdDIpLFxuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVSZXBsYXlNcyh0NCAtIHQzKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lU3RlcERpc3BhdGNoTXModDUgLSB0NCksXG4gICAgLi4uKHQ2ICE9PSB1bmRlZmluZWQgPyBBdHRyaWJ1dGUuUmVzdW1lU3RlcENsYWltTXModDYgLSB0NSkgOiB7fSksXG4gICAgLi4uQXR0cmlidXRlLlJlc3VtZVN0ZXBQcmVwYXJlTXModDcgLSAodDYgPz8gdDUpKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lVHJpZ2dlcih0cmFja2luZy50cmlnZ2VyKSxcbiAgICAuLi4odHJhY2tpbmcuc3RyYXRlZ3kgIT09IHVuZGVmaW5lZFxuICAgICAgPyBBdHRyaWJ1dGUuUmVzdW1lU3RyYXRlZ3kodHJhY2tpbmcuc3RyYXRlZ3kpXG4gICAgICA6IHt9KSxcbiAgICAuLi4odHJhY2tpbmcuc2V0dXBTb3VyY2UgIT09IHVuZGVmaW5lZFxuICAgICAgPyBBdHRyaWJ1dGUuUmVzdW1lU2V0dXBTb3VyY2UodHJhY2tpbmcuc2V0dXBTb3VyY2UpXG4gICAgICA6IHt9KSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lU3RlcEV4ZWN1dGlvbih0cmFja2luZy5zdGVwRXhlY3V0aW9uKSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Extracts the run's creation timestamp (epoch milliseconds) from a `wrun_`
3
+ * run ID by decoding the embedded ULID time component.
4
+ *
5
+ * `@workflow/world-vercel`'s region-tagged run IDs mark an ID as carrying
6
+ * metadata by setting the most-significant bit of the ULID's 48-bit
7
+ * timestamp, which would otherwise skew the decoded time past the year 6400.
8
+ * The tag-bit handling is delegated to the scheme's own codec
9
+ * (`decode()` returns the ULID with the tag bit cleared), so if the tagged
10
+ * layout ever evolves (the scheme carries a 5-bit version field for exactly
11
+ * that), this anchor keeps tracking the codec instead of silently diverging.
12
+ * For untagged input `decode()` is a passthrough.
13
+ *
14
+ * Returns `undefined` when `runId` is not a decodable `wrun_<ulid>` (e.g. a
15
+ * legacy/non-ULID id, or a test fixture like `wrun_test`); callers fall back to
16
+ * an authoritative timestamp from the run snapshot (`createdAt`) in that case.
17
+ */
18
+ export declare function runIdCreatedAt(runId: string): number | undefined;
19
+ //# sourceMappingURL=run-id-time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-id-time.d.ts","sourceRoot":"","sources":["../../src/runtime/run-id-time.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAShE"}
@@ -0,0 +1,42 @@
1
+ import { decode } from '@workflow/world-vercel/run-id';
2
+ import { decodeTime } from 'ulid';
3
+ /**
4
+ * Run IDs are minted client-side in `start()` as `wrun_<ulid>` (via
5
+ * `World.createRunId()` when the world provides one, else a plain ULID; see
6
+ * `runtime/helpers.ts`). A ULID encodes its creation time in its first 48 bits,
7
+ * so the run's creation timestamp is recoverable from the run ID alone,
8
+ * without any server round-trip or run-snapshot load. This is the earliest
9
+ * replay-stable timestamp a delivery has (the run ID arrives in the queue
10
+ * payload), which lets the workflow VM be seeded and clock-initialized before
11
+ * `run_started`.
12
+ */
13
+ const RUN_ID_PREFIX = 'wrun_';
14
+ /**
15
+ * Extracts the run's creation timestamp (epoch milliseconds) from a `wrun_`
16
+ * run ID by decoding the embedded ULID time component.
17
+ *
18
+ * `@workflow/world-vercel`'s region-tagged run IDs mark an ID as carrying
19
+ * metadata by setting the most-significant bit of the ULID's 48-bit
20
+ * timestamp, which would otherwise skew the decoded time past the year 6400.
21
+ * The tag-bit handling is delegated to the scheme's own codec
22
+ * (`decode()` returns the ULID with the tag bit cleared), so if the tagged
23
+ * layout ever evolves (the scheme carries a 5-bit version field for exactly
24
+ * that), this anchor keeps tracking the codec instead of silently diverging.
25
+ * For untagged input `decode()` is a passthrough.
26
+ *
27
+ * Returns `undefined` when `runId` is not a decodable `wrun_<ulid>` (e.g. a
28
+ * legacy/non-ULID id, or a test fixture like `wrun_test`); callers fall back to
29
+ * an authoritative timestamp from the run snapshot (`createdAt`) in that case.
30
+ */
31
+ export function runIdCreatedAt(runId) {
32
+ const ulidPart = runId.startsWith(RUN_ID_PREFIX)
33
+ ? runId.slice(RUN_ID_PREFIX.length)
34
+ : runId;
35
+ try {
36
+ return decodeTime(decode(ulidPart).ulid);
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWlkLXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9ydW4taWQtdGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUM7QUFFOUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWE7SUFDMUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1YsSUFBSSxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlY29kZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZC12ZXJjZWwvcnVuLWlkJztcbmltcG9ydCB7IGRlY29kZVRpbWUgfSBmcm9tICd1bGlkJztcblxuLyoqXG4gKiBSdW4gSURzIGFyZSBtaW50ZWQgY2xpZW50LXNpZGUgaW4gYHN0YXJ0KClgIGFzIGB3cnVuXzx1bGlkPmAgKHZpYVxuICogYFdvcmxkLmNyZWF0ZVJ1bklkKClgIHdoZW4gdGhlIHdvcmxkIHByb3ZpZGVzIG9uZSwgZWxzZSBhIHBsYWluIFVMSUQ7IHNlZVxuICogYHJ1bnRpbWUvaGVscGVycy50c2ApLiBBIFVMSUQgZW5jb2RlcyBpdHMgY3JlYXRpb24gdGltZSBpbiBpdHMgZmlyc3QgNDggYml0cyxcbiAqIHNvIHRoZSBydW4ncyBjcmVhdGlvbiB0aW1lc3RhbXAgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgcnVuIElEIGFsb25lLFxuICogd2l0aG91dCBhbnkgc2VydmVyIHJvdW5kLXRyaXAgb3IgcnVuLXNuYXBzaG90IGxvYWQuIFRoaXMgaXMgdGhlIGVhcmxpZXN0XG4gKiByZXBsYXktc3RhYmxlIHRpbWVzdGFtcCBhIGRlbGl2ZXJ5IGhhcyAodGhlIHJ1biBJRCBhcnJpdmVzIGluIHRoZSBxdWV1ZVxuICogcGF5bG9hZCksIHdoaWNoIGxldHMgdGhlIHdvcmtmbG93IFZNIGJlIHNlZWRlZCBhbmQgY2xvY2staW5pdGlhbGl6ZWQgYmVmb3JlXG4gKiBgcnVuX3N0YXJ0ZWRgLlxuICovXG5jb25zdCBSVU5fSURfUFJFRklYID0gJ3dydW5fJztcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcnVuJ3MgY3JlYXRpb24gdGltZXN0YW1wIChlcG9jaCBtaWxsaXNlY29uZHMpIGZyb20gYSBgd3J1bl9gXG4gKiBydW4gSUQgYnkgZGVjb2RpbmcgdGhlIGVtYmVkZGVkIFVMSUQgdGltZSBjb21wb25lbnQuXG4gKlxuICogYEB3b3JrZmxvdy93b3JsZC12ZXJjZWxgJ3MgcmVnaW9uLXRhZ2dlZCBydW4gSURzIG1hcmsgYW4gSUQgYXMgY2FycnlpbmdcbiAqIG1ldGFkYXRhIGJ5IHNldHRpbmcgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBVTElEJ3MgNDgtYml0XG4gKiB0aW1lc3RhbXAsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBza2V3IHRoZSBkZWNvZGVkIHRpbWUgcGFzdCB0aGUgeWVhciA2NDAwLlxuICogVGhlIHRhZy1iaXQgaGFuZGxpbmcgaXMgZGVsZWdhdGVkIHRvIHRoZSBzY2hlbWUncyBvd24gY29kZWNcbiAqIChgZGVjb2RlKClgIHJldHVybnMgdGhlIFVMSUQgd2l0aCB0aGUgdGFnIGJpdCBjbGVhcmVkKSwgc28gaWYgdGhlIHRhZ2dlZFxuICogbGF5b3V0IGV2ZXIgZXZvbHZlcyAodGhlIHNjaGVtZSBjYXJyaWVzIGEgNS1iaXQgdmVyc2lvbiBmaWVsZCBmb3IgZXhhY3RseVxuICogdGhhdCksIHRoaXMgYW5jaG9yIGtlZXBzIHRyYWNraW5nIHRoZSBjb2RlYyBpbnN0ZWFkIG9mIHNpbGVudGx5IGRpdmVyZ2luZy5cbiAqIEZvciB1bnRhZ2dlZCBpbnB1dCBgZGVjb2RlKClgIGlzIGEgcGFzc3Rocm91Z2guXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIGBydW5JZGAgaXMgbm90IGEgZGVjb2RhYmxlIGB3cnVuXzx1bGlkPmAgKGUuZy4gYVxuICogbGVnYWN5L25vbi1VTElEIGlkLCBvciBhIHRlc3QgZml4dHVyZSBsaWtlIGB3cnVuX3Rlc3RgKTsgY2FsbGVycyBmYWxsIGJhY2sgdG9cbiAqIGFuIGF1dGhvcml0YXRpdmUgdGltZXN0YW1wIGZyb20gdGhlIHJ1biBzbmFwc2hvdCAoYGNyZWF0ZWRBdGApIGluIHRoYXQgY2FzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bklkQ3JlYXRlZEF0KHJ1bklkOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB1bGlkUGFydCA9IHJ1bklkLnN0YXJ0c1dpdGgoUlVOX0lEX1BSRUZJWClcbiAgICA/IHJ1bklkLnNsaWNlKFJVTl9JRF9QUkVGSVgubGVuZ3RoKVxuICAgIDogcnVuSWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVRpbWUoZGVjb2RlKHVsaWRQYXJ0KS51bGlkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -1,6 +1,25 @@
1
1
  import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from '@workflow/serde';
2
- import { type WorkflowRunStatus } from '@workflow/world';
3
- import { type StopSleepOptions, type StopSleepResult } from './runs.js';
2
+ import type { WorkflowRunStatus } from '@workflow/world';
3
+ import { type CancelRunOptions, type StopSleepOptions, type StopSleepResult } from './runs.js';
4
+ /** @internal */
5
+ export declare function getReturnValuePollIntervalMs(): number;
6
+ /** @internal */
7
+ export declare function getReturnValueWaitTimeoutMs(): number;
8
+ /** @internal */
9
+ export declare function getReturnValueMaxLongPolls(): number;
10
+ /**
11
+ * Whether `await run.returnValue` may use the World's long poll
12
+ * (`runs.waitForTerminalStatus`) instead of interval-polling `runs.get`.
13
+ *
14
+ * Default **ON** wherever the World implements the method; a World that does
15
+ * not is already on the interval path with nothing to switch off. Reads
16
+ * `process.env.WORKFLOW_RETURN_VALUE_LONG_POLL` lazily; an explicit `'0'` /
17
+ * `'false'` is the kill switch, restoring the fixed-interval poll exactly as
18
+ * it behaved before the fast path existed.
19
+ *
20
+ * @internal
21
+ */
22
+ export declare function isReturnValueLongPollEnabled(): boolean;
4
23
  /**
5
24
  * A `ReadableStream` extended with workflow-specific helpers.
6
25
  */
@@ -8,7 +27,7 @@ export type WorkflowReadableStream<R = any> = ReadableStream<R> & {
8
27
  /**
9
28
  * Returns the tail index (index of the last known chunk, 0-based) of the
10
29
  * underlying workflow stream. Useful for resolving a negative `startIndex`
11
- * into an absolute position for example, when building reconnection
30
+ * into an absolute position, for example, when building reconnection
12
31
  * endpoints that need to inform the client where the stream starts.
13
32
  *
14
33
  * Returns `-1` when no chunks have been written yet.
@@ -30,8 +49,8 @@ export interface WorkflowReadableStreamOptions {
30
49
  */
31
50
  startIndex?: number;
32
51
  /**
33
- * Any asynchronous operations that need to be performed before the execution
34
- * environment is paused / terminated
52
+ * Any asynchronous operations to complete before pausing or terminating the
53
+ * execution environment
35
54
  * (i.e. using [`waitUntil()`](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) or similar).
36
55
  */
37
56
  ops?: Promise<any>[];
@@ -42,6 +61,32 @@ export interface WorkflowReadableStreamOptions {
42
61
  */
43
62
  global?: Record<string, any>;
44
63
  }
64
+ /**
65
+ * Options for configuring a writable onto a workflow run's stream.
66
+ */
67
+ export interface WorkflowRunWritableStreamOptions {
68
+ /**
69
+ * An optional namespace to distinguish between multiple streams associated
70
+ * with the same workflow run.
71
+ */
72
+ namespace?: string;
73
+ /**
74
+ * Any asynchronous operations to complete before pausing or terminating the
75
+ * execution environment
76
+ * (i.e. using [`waitUntil()`](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) or similar).
77
+ *
78
+ * Writes are acknowledged on buffer entry, so a caller that needs them
79
+ * durable before the environment goes away should pass an array here and
80
+ * await it after releasing the writer lock.
81
+ */
82
+ ops?: Promise<any>[];
83
+ /**
84
+ * The global object to use for reducing types from the global scope.
85
+ *
86
+ * Defaults to {@link [`globalThis`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/globalThis)}.
87
+ */
88
+ global?: Record<string, any>;
89
+ }
45
90
  /**
46
91
  * A handler class for a workflow run.
47
92
  */
@@ -72,8 +117,12 @@ export declare class Run<TResult> {
72
117
  wakeUp(options?: StopSleepOptions): Promise<StopSleepResult>;
73
118
  /**
74
119
  * Cancels the workflow run.
120
+ *
121
+ * @param options - Optional cancellation settings. `cancelReason` records a
122
+ * free-text reason (max 512 chars) on the run_cancelled event, surfaced in
123
+ * the run detail view.
75
124
  */
76
- cancel(): Promise<void>;
125
+ cancel(options?: CancelRunOptions): Promise<void>;
77
126
  /**
78
127
  * Whether the workflow run exists.
79
128
  */
@@ -84,7 +133,7 @@ export declare class Run<TResult> {
84
133
  get status(): Promise<WorkflowRunStatus>;
85
134
  /**
86
135
  * The return value of the workflow run.
87
- * Polls the workflow return value until it is completed.
136
+ * Polls the workflow return value until the workflow run completes.
88
137
  */
89
138
  get returnValue(): Promise<TResult>;
90
139
  /**
@@ -122,6 +171,22 @@ export declare class Run<TResult> {
122
171
  * @returns A `WorkflowReadableStream` for the workflow run.
123
172
  */
124
173
  getReadable<R = any>(options?: WorkflowReadableStreamOptions): WorkflowReadableStream<R>;
174
+ /** The writable stream of the workflow run. */
175
+ get writable(): WritableStream;
176
+ /**
177
+ * Returns a writable that appends to this run's stream.
178
+ *
179
+ * Initialization is deferred until the first write. The run must already
180
+ * exist. The writable may be forwarded through `start()` and into steps, but
181
+ * grants no read access or additional authorization.
182
+ *
183
+ * @remarks
184
+ * `writer.close()` closes the shared stream. Contributors should call
185
+ * `releaseLock()`, which also drains pending writes.
186
+ *
187
+ * @param options - The writable stream options.
188
+ */
189
+ getWritable<W = any>(options?: WorkflowRunWritableStreamOptions): WritableStream<W>;
125
190
  }
126
191
  /**
127
192
  * Retrieves a `Run` object for a given run ID.
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,WAAW,CAAC;AAGnB;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAChE;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,GAAG,CAAC,OAAO;;IACtB,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;;;;IAIlD,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;IAID;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;gBA4BF,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAuB9D;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKlE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAa7B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAKvC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGlC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKlC;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAKzC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAK3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CAErC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EACjB,OAAO,GAAE,6BAAkC,GAC1C,sBAAsB,CAAC,CAAC,CAAC;CA4G7B;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3D"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}