@adonis-agora/durable 0.49.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/CHANGELOG.md +261 -0
  2. package/README.md +53 -22
  3. package/dist/assets/spa/assets/index-DupjrK7N.js +16 -0
  4. package/dist/assets/spa/assets/index-DupjrK7N.js.map +1 -0
  5. package/dist/assets/spa/index.html +1 -1
  6. package/dist/commands/durable_worker.d.ts.map +1 -1
  7. package/dist/commands/durable_worker.js +9 -8
  8. package/dist/commands/durable_worker.js.map +1 -1
  9. package/dist/configure.d.ts.map +1 -1
  10. package/dist/configure.js +1 -0
  11. package/dist/configure.js.map +1 -1
  12. package/dist/providers/dashboard_provider.d.ts +2 -0
  13. package/dist/providers/dashboard_provider.d.ts.map +1 -1
  14. package/dist/providers/dashboard_provider.js +50 -6
  15. package/dist/providers/dashboard_provider.js.map +1 -1
  16. package/dist/providers/durable_provider.d.ts.map +1 -1
  17. package/dist/providers/durable_provider.js +143 -34
  18. package/dist/providers/durable_provider.js.map +1 -1
  19. package/dist/src/admission-redis/redis-admission-backend.d.ts.map +1 -1
  20. package/dist/src/admission-redis/redis-admission-backend.js +3 -1
  21. package/dist/src/admission-redis/redis-admission-backend.js.map +1 -1
  22. package/dist/src/ambient-step.d.ts +24 -0
  23. package/dist/src/ambient-step.d.ts.map +1 -0
  24. package/dist/src/ambient-step.js +42 -0
  25. package/dist/src/ambient-step.js.map +1 -0
  26. package/dist/src/base-workflow.d.ts +10 -1
  27. package/dist/src/base-workflow.d.ts.map +1 -1
  28. package/dist/src/base-workflow.js.map +1 -1
  29. package/dist/src/codec-state-store.d.ts +28 -2
  30. package/dist/src/codec-state-store.d.ts.map +1 -1
  31. package/dist/src/codec-state-store.js +61 -3
  32. package/dist/src/codec-state-store.js.map +1 -1
  33. package/dist/src/commands/worker.d.ts +4 -1
  34. package/dist/src/commands/worker.d.ts.map +1 -1
  35. package/dist/src/commands/worker.js +27 -3
  36. package/dist/src/commands/worker.js.map +1 -1
  37. package/dist/src/config_types.d.ts +6 -0
  38. package/dist/src/config_types.d.ts.map +1 -1
  39. package/dist/src/control-plane-redis/redis-control-plane.d.ts.map +1 -1
  40. package/dist/src/control-plane-redis/redis-control-plane.js +22 -6
  41. package/dist/src/control-plane-redis/redis-control-plane.js.map +1 -1
  42. package/dist/src/control-planes/factory.d.ts +6 -0
  43. package/dist/src/control-planes/factory.d.ts.map +1 -1
  44. package/dist/src/control-planes/factory.js +1 -0
  45. package/dist/src/control-planes/factory.js.map +1 -1
  46. package/dist/src/dashboard/gateway-adapter.d.ts +15 -5
  47. package/dist/src/dashboard/gateway-adapter.d.ts.map +1 -1
  48. package/dist/src/dashboard/gateway-adapter.js +71 -7
  49. package/dist/src/dashboard/gateway-adapter.js.map +1 -1
  50. package/dist/src/dashboard/handlers.d.ts +53 -1
  51. package/dist/src/dashboard/handlers.d.ts.map +1 -1
  52. package/dist/src/dashboard/handlers.js +200 -20
  53. package/dist/src/dashboard/handlers.js.map +1 -1
  54. package/dist/src/dashboard/index.d.ts +2 -2
  55. package/dist/src/dashboard/index.d.ts.map +1 -1
  56. package/dist/src/dashboard/index.js +2 -2
  57. package/dist/src/dashboard/index.js.map +1 -1
  58. package/dist/src/dashboard/openapi.d.ts.map +1 -1
  59. package/dist/src/dashboard/openapi.js +71 -1
  60. package/dist/src/dashboard/openapi.js.map +1 -1
  61. package/dist/src/define_config.d.ts +122 -8
  62. package/dist/src/define_config.d.ts.map +1 -1
  63. package/dist/src/define_config.js.map +1 -1
  64. package/dist/src/diagnostics-bridge.d.ts +16 -3
  65. package/dist/src/diagnostics-bridge.d.ts.map +1 -1
  66. package/dist/src/diagnostics-bridge.js +9 -3
  67. package/dist/src/diagnostics-bridge.js.map +1 -1
  68. package/dist/src/discovery-roots.d.ts +92 -0
  69. package/dist/src/discovery-roots.d.ts.map +1 -0
  70. package/dist/src/discovery-roots.js +150 -0
  71. package/dist/src/discovery-roots.js.map +1 -0
  72. package/dist/src/engine.d.ts +418 -20
  73. package/dist/src/engine.d.ts.map +1 -1
  74. package/dist/src/engine.js +1523 -159
  75. package/dist/src/engine.js.map +1 -1
  76. package/dist/src/entities.d.ts +36 -1
  77. package/dist/src/entities.d.ts.map +1 -1
  78. package/dist/src/entities.js +65 -4
  79. package/dist/src/entities.js.map +1 -1
  80. package/dist/src/errors.d.ts +36 -0
  81. package/dist/src/errors.d.ts.map +1 -1
  82. package/dist/src/errors.js +44 -0
  83. package/dist/src/errors.js.map +1 -1
  84. package/dist/src/event-trigger-bridge.d.ts +8 -0
  85. package/dist/src/event-trigger-bridge.d.ts.map +1 -1
  86. package/dist/src/event-trigger-bridge.js +24 -3
  87. package/dist/src/event-trigger-bridge.js.map +1 -1
  88. package/dist/src/handshake/announced.d.ts +27 -0
  89. package/dist/src/handshake/announced.d.ts.map +1 -1
  90. package/dist/src/handshake/announced.js +62 -0
  91. package/dist/src/handshake/announced.js.map +1 -1
  92. package/dist/src/handshake/directory.d.ts +92 -0
  93. package/dist/src/handshake/directory.d.ts.map +1 -0
  94. package/dist/src/handshake/directory.js +139 -0
  95. package/dist/src/handshake/directory.js.map +1 -0
  96. package/dist/src/hooks/barrel-sources.d.ts +28 -0
  97. package/dist/src/hooks/barrel-sources.d.ts.map +1 -0
  98. package/dist/src/hooks/barrel-sources.js +92 -0
  99. package/dist/src/hooks/barrel-sources.js.map +1 -0
  100. package/dist/src/hooks/steps.d.ts +12 -3
  101. package/dist/src/hooks/steps.d.ts.map +1 -1
  102. package/dist/src/hooks/steps.js +7 -11
  103. package/dist/src/hooks/steps.js.map +1 -1
  104. package/dist/src/hooks/workflows.d.ts +12 -3
  105. package/dist/src/hooks/workflows.d.ts.map +1 -1
  106. package/dist/src/hooks/workflows.js +7 -13
  107. package/dist/src/hooks/workflows.js.map +1 -1
  108. package/dist/src/index.d.ts +12 -3
  109. package/dist/src/index.d.ts.map +1 -1
  110. package/dist/src/index.js +12 -3
  111. package/dist/src/index.js.map +1 -1
  112. package/dist/src/interfaces.d.ts +309 -21
  113. package/dist/src/interfaces.d.ts.map +1 -1
  114. package/dist/src/interfaces.js +10 -0
  115. package/dist/src/interfaces.js.map +1 -1
  116. package/dist/src/metrics.d.ts.map +1 -1
  117. package/dist/src/metrics.js +5 -0
  118. package/dist/src/metrics.js.map +1 -1
  119. package/dist/src/namespaces.d.ts +17 -0
  120. package/dist/src/namespaces.d.ts.map +1 -0
  121. package/dist/src/namespaces.js +24 -0
  122. package/dist/src/namespaces.js.map +1 -0
  123. package/dist/src/otel/durable-metrics.d.ts.map +1 -1
  124. package/dist/src/otel/durable-metrics.js +5 -0
  125. package/dist/src/otel/durable-metrics.js.map +1 -1
  126. package/dist/src/otel/durable-otel.d.ts.map +1 -1
  127. package/dist/src/otel/durable-otel.js +5 -0
  128. package/dist/src/otel/durable-otel.js.map +1 -1
  129. package/dist/src/pollers.d.ts +10 -1
  130. package/dist/src/pollers.d.ts.map +1 -1
  131. package/dist/src/pollers.js +15 -5
  132. package/dist/src/pollers.js.map +1 -1
  133. package/dist/src/protocol.d.ts +12 -0
  134. package/dist/src/protocol.d.ts.map +1 -1
  135. package/dist/src/protocol.js +27 -1
  136. package/dist/src/protocol.js.map +1 -1
  137. package/dist/src/remote-event.d.ts +6 -0
  138. package/dist/src/remote-event.d.ts.map +1 -0
  139. package/dist/src/remote-event.js +19 -0
  140. package/dist/src/remote-event.js.map +1 -0
  141. package/dist/src/remote-workflow-executor.d.ts +34 -12
  142. package/dist/src/remote-workflow-executor.d.ts.map +1 -1
  143. package/dist/src/remote-workflow-executor.js +42 -40
  144. package/dist/src/remote-workflow-executor.js.map +1 -1
  145. package/dist/src/run-detail-summary.d.ts +90 -3
  146. package/dist/src/run-detail-summary.d.ts.map +1 -1
  147. package/dist/src/run-detail-summary.js +360 -2
  148. package/dist/src/run-detail-summary.js.map +1 -1
  149. package/dist/src/run-facets.d.ts +48 -0
  150. package/dist/src/run-facets.d.ts.map +1 -0
  151. package/dist/src/run-facets.js +100 -0
  152. package/dist/src/run-facets.js.map +1 -0
  153. package/dist/src/run-gateway/interface.d.ts +27 -1
  154. package/dist/src/run-gateway/interface.d.ts.map +1 -1
  155. package/dist/src/run-gateway/proxy-run-gateway.d.ts +32 -4
  156. package/dist/src/run-gateway/proxy-run-gateway.d.ts.map +1 -1
  157. package/dist/src/run-gateway/proxy-run-gateway.js +101 -5
  158. package/dist/src/run-gateway/proxy-run-gateway.js.map +1 -1
  159. package/dist/src/run-gateway/run-request-responder.d.ts +18 -5
  160. package/dist/src/run-gateway/run-request-responder.d.ts.map +1 -1
  161. package/dist/src/run-gateway/run-request-responder.js +155 -32
  162. package/dist/src/run-gateway/run-request-responder.js.map +1 -1
  163. package/dist/src/run-gateway/store-run-gateway.d.ts +23 -1
  164. package/dist/src/run-gateway/store-run-gateway.d.ts.map +1 -1
  165. package/dist/src/run-gateway/store-run-gateway.js +38 -0
  166. package/dist/src/run-gateway/store-run-gateway.js.map +1 -1
  167. package/dist/src/search-attributes-schema.d.ts +44 -0
  168. package/dist/src/search-attributes-schema.d.ts.map +1 -0
  169. package/dist/src/search-attributes-schema.js +51 -0
  170. package/dist/src/search-attributes-schema.js.map +1 -0
  171. package/dist/src/singleton-admission.d.ts +75 -0
  172. package/dist/src/singleton-admission.d.ts.map +1 -0
  173. package/dist/src/singleton-admission.js +156 -0
  174. package/dist/src/singleton-admission.js.map +1 -0
  175. package/dist/src/singleton-gate.d.ts +23 -8
  176. package/dist/src/singleton-gate.d.ts.map +1 -1
  177. package/dist/src/singleton-gate.js +59 -12
  178. package/dist/src/singleton-gate.js.map +1 -1
  179. package/dist/src/standard-schema.d.ts +83 -0
  180. package/dist/src/standard-schema.d.ts.map +1 -0
  181. package/dist/src/standard-schema.js +31 -0
  182. package/dist/src/standard-schema.js.map +1 -0
  183. package/dist/src/step-discovery.d.ts +21 -11
  184. package/dist/src/step-discovery.d.ts.map +1 -1
  185. package/dist/src/step-discovery.js +86 -45
  186. package/dist/src/step-discovery.js.map +1 -1
  187. package/dist/src/step-ref.d.ts +38 -12
  188. package/dist/src/step-ref.d.ts.map +1 -1
  189. package/dist/src/step-ref.js +5 -13
  190. package/dist/src/step-ref.js.map +1 -1
  191. package/dist/src/stores/factory.d.ts +6 -0
  192. package/dist/src/stores/factory.d.ts.map +1 -1
  193. package/dist/src/stores/factory.js +4 -1
  194. package/dist/src/stores/factory.js.map +1 -1
  195. package/dist/src/stores/lucid-helpers.d.ts +2 -0
  196. package/dist/src/stores/lucid-helpers.d.ts.map +1 -1
  197. package/dist/src/stores/lucid-helpers.js +7 -0
  198. package/dist/src/stores/lucid-helpers.js.map +1 -1
  199. package/dist/src/stores/lucid-mappers.d.ts +25 -0
  200. package/dist/src/stores/lucid-mappers.d.ts.map +1 -1
  201. package/dist/src/stores/lucid-mappers.js +81 -18
  202. package/dist/src/stores/lucid-mappers.js.map +1 -1
  203. package/dist/src/stores/lucid-schema.d.ts +59 -1
  204. package/dist/src/stores/lucid-schema.d.ts.map +1 -1
  205. package/dist/src/stores/lucid-schema.js +271 -25
  206. package/dist/src/stores/lucid-schema.js.map +1 -1
  207. package/dist/src/stores/lucid.d.ts +61 -2
  208. package/dist/src/stores/lucid.d.ts.map +1 -1
  209. package/dist/src/stores/lucid.js +346 -41
  210. package/dist/src/stores/lucid.js.map +1 -1
  211. package/dist/src/telescope/dashboard.d.ts.map +1 -1
  212. package/dist/src/telescope/dashboard.js +30 -1
  213. package/dist/src/telescope/dashboard.js.map +1 -1
  214. package/dist/src/telescope/data-providers.d.ts +19 -1
  215. package/dist/src/telescope/data-providers.d.ts.map +1 -1
  216. package/dist/src/telescope/data-providers.js +119 -3
  217. package/dist/src/telescope/data-providers.js.map +1 -1
  218. package/dist/src/telescope/extension.d.ts.map +1 -1
  219. package/dist/src/telescope/extension.js +2 -1
  220. package/dist/src/telescope/extension.js.map +1 -1
  221. package/dist/src/telescope/index.d.ts +1 -1
  222. package/dist/src/telescope/index.d.ts.map +1 -1
  223. package/dist/src/telescope/index.js +1 -1
  224. package/dist/src/telescope/index.js.map +1 -1
  225. package/dist/src/testing/in-memory-state-store.d.ts +44 -15
  226. package/dist/src/testing/in-memory-state-store.d.ts.map +1 -1
  227. package/dist/src/testing/in-memory-state-store.js +204 -41
  228. package/dist/src/testing/in-memory-state-store.js.map +1 -1
  229. package/dist/src/testing-kit/checkpoint-aggregation-contract.d.ts +16 -0
  230. package/dist/src/testing-kit/checkpoint-aggregation-contract.d.ts.map +1 -0
  231. package/dist/src/testing-kit/checkpoint-aggregation-contract.js +228 -0
  232. package/dist/src/testing-kit/checkpoint-aggregation-contract.js.map +1 -0
  233. package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -1
  234. package/dist/src/testing-kit/state-store-conformance.js +355 -3
  235. package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
  236. package/dist/src/transport-pool.d.ts +15 -1
  237. package/dist/src/transport-pool.d.ts.map +1 -1
  238. package/dist/src/transport-pool.js +50 -4
  239. package/dist/src/transport-pool.js.map +1 -1
  240. package/dist/src/transports/adaptive-concurrency.d.ts +168 -0
  241. package/dist/src/transports/adaptive-concurrency.d.ts.map +1 -0
  242. package/dist/src/transports/adaptive-concurrency.js +353 -0
  243. package/dist/src/transports/adaptive-concurrency.js.map +1 -0
  244. package/dist/src/transports/bullmq/adaptive-concurrency.d.ts +1 -143
  245. package/dist/src/transports/bullmq/adaptive-concurrency.d.ts.map +1 -1
  246. package/dist/src/transports/bullmq/adaptive-concurrency.js +3 -311
  247. package/dist/src/transports/bullmq/adaptive-concurrency.js.map +1 -1
  248. package/dist/src/transports/bullmq/bullmq-transport.d.ts +49 -1
  249. package/dist/src/transports/bullmq/bullmq-transport.d.ts.map +1 -1
  250. package/dist/src/transports/bullmq/bullmq-transport.js +330 -38
  251. package/dist/src/transports/bullmq/bullmq-transport.js.map +1 -1
  252. package/dist/src/transports/bullmq/deps.d.ts +18 -2
  253. package/dist/src/transports/bullmq/deps.d.ts.map +1 -1
  254. package/dist/src/transports/bullmq/deps.js +44 -2
  255. package/dist/src/transports/bullmq/deps.js.map +1 -1
  256. package/dist/src/transports/db-helpers.d.ts +39 -0
  257. package/dist/src/transports/db-helpers.d.ts.map +1 -1
  258. package/dist/src/transports/db-helpers.js +73 -0
  259. package/dist/src/transports/db-helpers.js.map +1 -1
  260. package/dist/src/transports/db-remote.d.ts +53 -0
  261. package/dist/src/transports/db-remote.d.ts.map +1 -0
  262. package/dist/src/transports/db-remote.js +147 -0
  263. package/dist/src/transports/db-remote.js.map +1 -0
  264. package/dist/src/transports/db-schema.d.ts +44 -1
  265. package/dist/src/transports/db-schema.d.ts.map +1 -1
  266. package/dist/src/transports/db-schema.js +227 -88
  267. package/dist/src/transports/db-schema.js.map +1 -1
  268. package/dist/src/transports/db.d.ts +189 -6
  269. package/dist/src/transports/db.d.ts.map +1 -1
  270. package/dist/src/transports/db.js +1291 -137
  271. package/dist/src/transports/db.js.map +1 -1
  272. package/dist/src/transports/event-emitter.d.ts +8 -0
  273. package/dist/src/transports/event-emitter.d.ts.map +1 -1
  274. package/dist/src/transports/event-emitter.js +36 -3
  275. package/dist/src/transports/event-emitter.js.map +1 -1
  276. package/dist/src/transports/factory.d.ts +110 -5
  277. package/dist/src/transports/factory.d.ts.map +1 -1
  278. package/dist/src/transports/factory.js +56 -9
  279. package/dist/src/transports/factory.js.map +1 -1
  280. package/dist/src/transports/queue-mock-adapter.d.ts +7 -2
  281. package/dist/src/transports/queue-mock-adapter.d.ts.map +1 -1
  282. package/dist/src/transports/queue-mock-adapter.js +18 -2
  283. package/dist/src/transports/queue-mock-adapter.js.map +1 -1
  284. package/dist/src/transports/queue-remote.d.ts +146 -0
  285. package/dist/src/transports/queue-remote.d.ts.map +1 -0
  286. package/dist/src/transports/queue-remote.js +398 -0
  287. package/dist/src/transports/queue-remote.js.map +1 -0
  288. package/dist/src/transports/queue.d.ts +159 -6
  289. package/dist/src/transports/queue.d.ts.map +1 -1
  290. package/dist/src/transports/queue.js +747 -37
  291. package/dist/src/transports/queue.js.map +1 -1
  292. package/dist/src/transports/task-failure.d.ts +31 -0
  293. package/dist/src/transports/task-failure.d.ts.map +1 -0
  294. package/dist/src/transports/task-failure.js +50 -0
  295. package/dist/src/transports/task-failure.js.map +1 -0
  296. package/dist/src/workflow-als.d.ts +1 -1
  297. package/dist/src/workflow-als.d.ts.map +1 -1
  298. package/dist/src/workflow-ctx.d.ts +10 -0
  299. package/dist/src/workflow-ctx.d.ts.map +1 -1
  300. package/dist/src/workflow-ctx.js +97 -15
  301. package/dist/src/workflow-ctx.js.map +1 -1
  302. package/dist/src/workflow-discovery.d.ts +32 -41
  303. package/dist/src/workflow-discovery.d.ts.map +1 -1
  304. package/dist/src/workflow-discovery.js +65 -88
  305. package/dist/src/workflow-discovery.js.map +1 -1
  306. package/dist/src/workflow-ref.d.ts +24 -0
  307. package/dist/src/workflow-ref.d.ts.map +1 -1
  308. package/dist/src/workflow-ref.js.map +1 -1
  309. package/dist/stubs/config/durable.stub +6 -0
  310. package/dist/stubs/config/durable_dashboard.stub +7 -3
  311. package/dist/stubs/database/migrations/create_durable_tables.stub +2 -1
  312. package/dist/stubs/database/migrations/create_durable_transport_messages.stub +43 -0
  313. package/dist/stubs/database/migrations/create_durable_transport_tables.stub +12 -9
  314. package/dist/stubs/database/migrations/create_durable_transport_worker_keys.stub +1 -1
  315. package/dist/stubs/make/workflow/main.stub +1 -1
  316. package/package.json +6 -4
  317. package/skills/durable-cluster/SKILL.md +80 -11
  318. package/skills/durable-determinism/SKILL.md +11 -5
  319. package/skills/durable-reliability/SKILL.md +77 -37
  320. package/skills/durable-setup/SKILL.md +51 -22
  321. package/skills/durable-transports-stores/SKILL.md +130 -19
  322. package/skills/durable-workflows/SKILL.md +71 -18
  323. package/dist/assets/spa/assets/index-DdB9zxuX.js +0 -16
  324. package/dist/assets/spa/assets/index-DdB9zxuX.js.map +0 -1
@@ -1,9 +1,11 @@
1
1
  import { childIdsOf, FOLDED_PREFIX, parseFanGroup } from './fan-join.js';
2
+ import { checkpointNameKind, } from './interfaces.js';
2
3
  export const FAN_SUMMARY_FAILURES = 20;
3
4
  /** The most children a summarized detail lists by id; `childCount` carries the rest. */
4
5
  export const SUMMARY_CHILD_LIMIT = 200;
5
6
  const FAN_PAGE_MAX = 500;
6
- function foldedCount(cp) {
7
+ /** How many children a folded `fan:` checkpoint stands for; undefined for any other checkpoint. */
8
+ export function foldedCount(cp) {
7
9
  if (!cp.name.startsWith(FOLDED_PREFIX))
8
10
  return undefined;
9
11
  const values = cp.output?.values;
@@ -106,13 +108,18 @@ export function summarizeTimeline(timeline, over) {
106
108
  /** One page of a fan's members out of a run's timeline. */
107
109
  export function pageFan(timeline, group, query) {
108
110
  const matching = timeline.filter((cp) => cp.parallelGroup === group && (!query.failedOnly || isFailedMember(cp)));
111
+ const { offset, limit } = fanPageBounds(query);
112
+ return { items: matching.slice(offset, offset + limit), total: matching.length };
113
+ }
114
+ /** A {@link FanPageQuery}'s offset and limit, clamped to sane bounds. */
115
+ export function fanPageBounds(query) {
109
116
  const offset = query.offset !== undefined && Number.isFinite(query.offset)
110
117
  ? Math.max(0, Math.floor(query.offset))
111
118
  : 0;
112
119
  const limit = query.limit !== undefined && Number.isFinite(query.limit)
113
120
  ? Math.min(FAN_PAGE_MAX, Math.max(1, Math.floor(query.limit)))
114
121
  : 100;
115
- return { items: matching.slice(offset, offset + limit), total: matching.length };
122
+ return { offset, limit };
116
123
  }
117
124
  /** Read `runId`'s {@link RunDetail}, summarized per `options`, or null for an unknown run. */
118
125
  export async function loadRunDetail(source, runId, options) {
@@ -127,6 +134,16 @@ export async function loadRunDetail(source, runId, options) {
127
134
  ]);
128
135
  return { run, timeline, children };
129
136
  }
137
+ if (aggregatesCheckpoints(source)) {
138
+ // The buckets are read before any row, so a write landing mid-read leaves the ETag older than
139
+ // the body: the next poll misses and re-reads, rather than pinning a stale body.
140
+ const stats = await source.checkpointStats(runId);
141
+ const etag = runDetailEtag(run, stats, over);
142
+ if (etagMatches(options?.ifNoneMatch, etag)) {
143
+ return { run, timeline: [], children: [], notModified: true, etag };
144
+ }
145
+ return { run, ...(await summarizeRunFromStore(source, runId, over, stats)), etag };
146
+ }
130
147
  // Summarized: the children come from the timeline already loaded, rather than a second read of
131
148
  // every child-edge checkpoint (one per child of a wide fan). A child whose waiter is written but
132
149
  // whose placeholder checkpoint is not yet is missing for that one read; the next one lists it.
@@ -145,6 +162,347 @@ export async function loadRunDetail(source, runId, options) {
145
162
  export async function loadFanMembers(source, runId, group, query) {
146
163
  if (!(await source.getRun(runId)))
147
164
  return null;
165
+ if (aggregatesCheckpoints(source)) {
166
+ const stats = await source.checkpointStats(runId, { group });
167
+ const etag = fanPageEtag(group, stats, query);
168
+ if (etagMatches(query.ifNoneMatch, etag)) {
169
+ return { items: [], total: 0, notModified: true, etag };
170
+ }
171
+ return { ...(await pageFanFromStore(source, runId, group, query, stats)), etag };
172
+ }
148
173
  return pageFan(await source.listCheckpoints(runId), group, query);
149
174
  }
175
+ // --- store-side aggregates (StateStore.checkpointStats / queryCheckpoints) ----------------------
176
+ /** Checkpoint names that record a parent→child edge: an awaited child, a folded group of them, a spawn. */
177
+ const CHILD_EDGE_PREFIXES = ['signal:child:', FOLDED_PREFIX, 'spawn:'];
178
+ /** Whether `source` has both aggregate reads ({@link StateStore.checkpointStats} + `queryCheckpoints`). */
179
+ export function aggregatesCheckpoints(source) {
180
+ return source.checkpointStats !== undefined && source.queryCheckpoints !== undefined;
181
+ }
182
+ /**
183
+ * {@link StateStore.checkpointStats} over checkpoints already in memory — the reference a store's
184
+ * `GROUP BY` must agree with, and the in-memory store's implementation.
185
+ */
186
+ export function checkpointStatsOf(checkpoints, opts) {
187
+ const buckets = new Map();
188
+ for (const cp of checkpoints) {
189
+ const group = cp.parallelGroup ?? null;
190
+ if (opts?.group !== undefined && group !== opts.group)
191
+ continue;
192
+ const nameKind = checkpointNameKind(cp.name);
193
+ const key = JSON.stringify([group, cp.status, nameKind]);
194
+ const enqueuedAt = cp.enqueuedAt ?? cp.startedAt;
195
+ const bucket = buckets.get(key);
196
+ if (!bucket) {
197
+ buckets.set(key, {
198
+ group,
199
+ status: cp.status,
200
+ nameKind,
201
+ count: 1,
202
+ minSeq: cp.seq,
203
+ maxSeq: cp.seq,
204
+ minName: cp.name,
205
+ maxName: cp.name,
206
+ minEnqueuedAt: enqueuedAt,
207
+ minStartedAt: cp.startedAt,
208
+ maxStartedAt: cp.startedAt,
209
+ maxFinishedAt: cp.finishedAt,
210
+ sumAttempts: cp.attempts,
211
+ });
212
+ continue;
213
+ }
214
+ bucket.count += 1;
215
+ bucket.minSeq = Math.min(bucket.minSeq, cp.seq);
216
+ bucket.maxSeq = Math.max(bucket.maxSeq, cp.seq);
217
+ if (cp.name < bucket.minName)
218
+ bucket.minName = cp.name;
219
+ if (cp.name > bucket.maxName)
220
+ bucket.maxName = cp.name;
221
+ if (enqueuedAt < bucket.minEnqueuedAt)
222
+ bucket.minEnqueuedAt = enqueuedAt;
223
+ if (cp.startedAt < bucket.minStartedAt)
224
+ bucket.minStartedAt = cp.startedAt;
225
+ if (cp.startedAt > bucket.maxStartedAt)
226
+ bucket.maxStartedAt = cp.startedAt;
227
+ if (cp.finishedAt > bucket.maxFinishedAt)
228
+ bucket.maxFinishedAt = cp.finishedAt;
229
+ bucket.sumAttempts += cp.attempts;
230
+ }
231
+ return [...buckets.values()];
232
+ }
233
+ /** {@link StateStore.queryCheckpoints} over checkpoints already in memory, sorted by `seq` here. */
234
+ export function queryCheckpointsOf(checkpoints, query) {
235
+ const excluded = new Set(query.excludeGroups ?? []);
236
+ const matching = checkpoints
237
+ .filter((cp) => (query.group === undefined || cp.parallelGroup === query.group) &&
238
+ (cp.parallelGroup === undefined || !excluded.has(cp.parallelGroup)) &&
239
+ (query.statuses === undefined || query.statuses.includes(cp.status)) &&
240
+ (query.namePrefixes === undefined ||
241
+ query.namePrefixes.some((prefix) => cp.name.startsWith(prefix))))
242
+ .sort((a, b) => a.seq - b.seq);
243
+ const offset = query.offset ?? 0;
244
+ return matching.slice(offset, query.limit === undefined ? undefined : offset + query.limit);
245
+ }
246
+ const TERMINAL = (status) => status !== 'pending' && status !== 'running';
247
+ /** True when a group with `rows` checkpoints is summarized: the rule of `summarizeTimeline`. */
248
+ function isWide(group, rows, over) {
249
+ return rows > over || (parseFanGroup(group)?.size ?? 0) > over;
250
+ }
251
+ /** Merge two seq-sorted lists of distinct checkpoints into one, in seq order. */
252
+ function mergeBySeq(a, b) {
253
+ return [...a, ...b].sort((x, y) => x.seq - y.seq);
254
+ }
255
+ /**
256
+ * A child of a fan whose `signal:child:` checkpoint is `completed` failed when its completion says
257
+ * `ok: false` — a payload the store cannot read (a codec may encode it), so those rows are loaded
258
+ * and judged here. Only the completed child rows of the one group are read.
259
+ */
260
+ async function failedChildren(store, runId, group, buckets) {
261
+ if (!buckets.some((b) => b.nameKind === 'child' && b.status === 'completed')) {
262
+ return { completed: [], failed: [] };
263
+ }
264
+ const completed = await store.queryCheckpoints(runId, {
265
+ group,
266
+ statuses: ['completed'],
267
+ namePrefixes: ['signal:child:'],
268
+ });
269
+ return { completed, failed: completed.filter(isFailedMember) };
270
+ }
271
+ async function summarizeFanFromStats(store, runId, group, buckets, folded) {
272
+ const counts = {};
273
+ const add = (status, n) => {
274
+ counts[status] = (counts[status] ?? 0) + n;
275
+ };
276
+ let size = 0;
277
+ let startedAt;
278
+ let finishedAt;
279
+ let firstSeq = Number.POSITIVE_INFINITY;
280
+ let lastSeq = Number.NEGATIVE_INFINITY;
281
+ let minName;
282
+ let maxName;
283
+ let childRuns = false;
284
+ for (const b of buckets) {
285
+ firstSeq = Math.min(firstSeq, b.minSeq);
286
+ lastSeq = Math.max(lastSeq, b.maxSeq);
287
+ if (minName === undefined || b.minName < minName)
288
+ minName = b.minName;
289
+ if (maxName === undefined || b.maxName > maxName)
290
+ maxName = b.maxName;
291
+ if (b.nameKind === 'child' || b.nameKind === 'folded')
292
+ childRuns = true;
293
+ if (TERMINAL(b.status)) {
294
+ if (!startedAt || b.minStartedAt < startedAt)
295
+ startedAt = b.minStartedAt;
296
+ if (!finishedAt || b.maxFinishedAt > finishedAt)
297
+ finishedAt = b.maxFinishedAt;
298
+ }
299
+ else if (!startedAt || b.minEnqueuedAt < startedAt) {
300
+ startedAt = b.minEnqueuedAt;
301
+ }
302
+ // Folded rows and completed child rows count by their payload, below.
303
+ if (b.nameKind === 'folded')
304
+ continue;
305
+ if (b.nameKind === 'child' && b.status === 'completed')
306
+ continue;
307
+ add(b.status, b.count);
308
+ size += b.count;
309
+ }
310
+ for (const cp of folded) {
311
+ const n = foldedCount(cp) ?? 1;
312
+ add(isFailedMember(cp) ? 'failed' : cp.status, n);
313
+ size += n;
314
+ }
315
+ const children = await failedChildren(store, runId, group, buckets);
316
+ const failedChildSet = new Set(children.failed);
317
+ for (const cp of children.completed)
318
+ add(failedChildSet.has(cp) ? 'failed' : 'completed', 1);
319
+ size += children.completed.length;
320
+ const failedStatusRows = buckets.some((b) => b.status === 'failed')
321
+ ? await store.queryCheckpoints(runId, {
322
+ group,
323
+ statuses: ['failed'],
324
+ limit: FAN_SUMMARY_FAILURES,
325
+ })
326
+ : [];
327
+ const failures = mergeBySeq(failedStatusRows, children.failed).slice(0, FAN_SUMMARY_FAILURES);
328
+ const parsed = parseFanGroup(group);
329
+ const total = parsed?.size;
330
+ return {
331
+ group,
332
+ label: childRuns ? 'child runs' : minName === maxName ? (minName ?? '') : 'steps',
333
+ firstSeq,
334
+ lastSeq,
335
+ size,
336
+ total,
337
+ notStarted: total === undefined ? undefined : Math.max(0, total - size),
338
+ failFast: parsed?.failFast ?? false,
339
+ counts,
340
+ startedAt,
341
+ finishedAt,
342
+ failures,
343
+ };
344
+ }
345
+ /**
346
+ * The run's distinct child ids, as `loadRunDetail` lists them, read SUMMARY_CHILD_LIMIT edge rows at
347
+ * a time until that many distinct ids are known. `complete` says every edge row was read, so `ids`
348
+ * holds them all and their count is exact.
349
+ */
350
+ async function firstChildIds(store, runId) {
351
+ const ids = new Set();
352
+ for (let offset = 0;; offset += SUMMARY_CHILD_LIMIT) {
353
+ const page = await store.queryCheckpoints(runId, {
354
+ namePrefixes: CHILD_EDGE_PREFIXES,
355
+ offset,
356
+ limit: SUMMARY_CHILD_LIMIT,
357
+ });
358
+ for (const id of childIdsOf(page))
359
+ ids.add(id);
360
+ if (page.length < SUMMARY_CHILD_LIMIT)
361
+ return { ids: [...ids], complete: true };
362
+ if (ids.size >= SUMMARY_CHILD_LIMIT)
363
+ return { ids: [...ids], complete: false };
364
+ }
365
+ }
366
+ /**
367
+ * What `summarizeTimeline` plus `childIdsOf` make of a run's whole checkpoint list, read through the
368
+ * store's aggregates instead: the checkpoints outside wide fans, one {@link FanSummary} per wide fan,
369
+ * and the run's children capped at {@link SUMMARY_CHILD_LIMIT} with their count.
370
+ *
371
+ * What it reads besides the aggregates: the rows outside wide fans, every folded `fan:` checkpoint
372
+ * (one per settled wave), up to {@link FAN_SUMMARY_FAILURES} failed rows per wide fan, the first
373
+ * child-edge rows, and — while a wide child fan is in flight — that fan's completed `signal:child:`
374
+ * rows, whose `ok: false` payload is what marks a failed child.
375
+ *
376
+ * `childCount` is exact (distinct ids, as `loadRunDetail` counts them) while the run has few enough
377
+ * child edges to read them all. Past that it adds up the edge rows and the folded ids without
378
+ * de-duplicating, so a child both spawned and awaited counts twice.
379
+ */
380
+ export async function summarizeRunFromStore(store, runId, over, stats) {
381
+ const all = stats ?? (await store.checkpointStats(runId));
382
+ const byGroup = new Map();
383
+ let edgeRows = 0;
384
+ let hasFolded = false;
385
+ for (const b of all) {
386
+ if (b.nameKind === 'child' || b.nameKind === 'spawn')
387
+ edgeRows += b.count;
388
+ if (b.nameKind === 'folded')
389
+ hasFolded = true;
390
+ if (b.group === null)
391
+ continue;
392
+ const buckets = byGroup.get(b.group);
393
+ if (buckets)
394
+ buckets.push(b);
395
+ else
396
+ byGroup.set(b.group, [b]);
397
+ }
398
+ const wide = [...byGroup].filter(([group, buckets]) => isWide(group, buckets.reduce((n, b) => n + b.count, 0), over));
399
+ const [timeline, folded, children] = await Promise.all([
400
+ store.queryCheckpoints(runId, { excludeGroups: wide.map(([group]) => group) }),
401
+ hasFolded ? store.queryCheckpoints(runId, { namePrefixes: [FOLDED_PREFIX] }) : [],
402
+ edgeRows > 0 || hasFolded ? firstChildIds(store, runId) : { ids: [], complete: true },
403
+ ]);
404
+ const fans = await Promise.all(wide.map(([group, buckets]) => summarizeFanFromStats(store, runId, group, buckets, folded.filter((cp) => cp.parallelGroup === group))));
405
+ const childCount = children.complete
406
+ ? children.ids.length
407
+ : folded.reduce((n, cp) => n + childIdsOf([cp]).length, edgeRows);
408
+ return {
409
+ timeline,
410
+ fans: fans.sort((a, b) => a.firstSeq - b.firstSeq),
411
+ children: children.ids.slice(0, SUMMARY_CHILD_LIMIT),
412
+ childCount,
413
+ };
414
+ }
415
+ /** What `pageFan` makes of a run's whole checkpoint list, read one page at a time from the store. */
416
+ export async function pageFanFromStore(store, runId, group, query, stats) {
417
+ const buckets = stats ?? (await store.checkpointStats(runId, { group }));
418
+ const { offset, limit } = fanPageBounds(query);
419
+ if (!query.failedOnly) {
420
+ const total = buckets.reduce((n, b) => n + b.count, 0);
421
+ const items = total > offset ? await store.queryCheckpoints(runId, { group, offset, limit }) : [];
422
+ return { items, total };
423
+ }
424
+ const failedStatus = buckets
425
+ .filter((b) => b.status === 'failed')
426
+ .reduce((n, b) => n + b.count, 0);
427
+ const children = await failedChildren(store, runId, group, buckets);
428
+ const total = failedStatus + children.failed.length;
429
+ if (total <= offset)
430
+ return { items: [], total };
431
+ if (children.failed.length === 0) {
432
+ return {
433
+ items: await store.queryCheckpoints(runId, { group, statuses: ['failed'], offset, limit }),
434
+ total,
435
+ };
436
+ }
437
+ // The page's members are among the first `offset + limit` of each kind of failure.
438
+ const failedRows = await store.queryCheckpoints(runId, {
439
+ group,
440
+ statuses: ['failed'],
441
+ limit: offset + limit,
442
+ });
443
+ return {
444
+ items: mergeBySeq(failedRows, children.failed).slice(offset, offset + limit),
445
+ total,
446
+ };
447
+ }
448
+ /** A 53-bit string hash (cyrb53), as hex: enough to tell two fingerprints apart. */
449
+ function hash(text) {
450
+ let h1 = 0xdeadbeef;
451
+ let h2 = 0x41c6ce57;
452
+ for (let i = 0; i < text.length; i++) {
453
+ const ch = text.charCodeAt(i);
454
+ h1 = Math.imul(h1 ^ ch, 2654435761);
455
+ h2 = Math.imul(h2 ^ ch, 1597334677);
456
+ }
457
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
458
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
459
+ return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(16);
460
+ }
461
+ /**
462
+ * The checkpoint half of a change marker. There is no per-checkpoint write version to read, so it
463
+ * is the buckets themselves: every engine write to a checkpoint adds a row, moves a row to another
464
+ * status bucket, or rewrites a row's timestamps or attempts — and each of those moves a bucket's
465
+ * count, seq range, timestamp bounds or attempt sum.
466
+ */
467
+ function statsFingerprint(stats) {
468
+ return stats
469
+ .map((b) => [
470
+ b.group ?? '',
471
+ b.status,
472
+ b.nameKind,
473
+ b.count,
474
+ b.minSeq,
475
+ b.maxSeq,
476
+ b.minName,
477
+ b.maxName,
478
+ b.minEnqueuedAt.getTime(),
479
+ b.minStartedAt.getTime(),
480
+ b.maxStartedAt.getTime(),
481
+ b.maxFinishedAt.getTime(),
482
+ b.sumAttempts,
483
+ ].join('\u0001'))
484
+ .sort()
485
+ .join('\u0002');
486
+ }
487
+ /**
488
+ * The ETag of a summarized run detail: the run row as read (so any run field that changes shows)
489
+ * plus its checkpoint buckets, and the threshold it was summarized with.
490
+ */
491
+ export function runDetailEtag(run, stats, over) {
492
+ return `"rd-${hash(`${over}\u0003${JSON.stringify(run)}\u0003${statsFingerprint(stats)}`)}"`;
493
+ }
494
+ /** The ETag of one page of a fan: its group's buckets and the page asked for. */
495
+ export function fanPageEtag(group, stats, query) {
496
+ const { offset, limit } = fanPageBounds(query);
497
+ const key = [group, offset, limit, query.failedOnly === true].join('\u0001');
498
+ return `"fp-${hash(`${key}\u0003${statsFingerprint(stats)}`)}"`;
499
+ }
500
+ /** Whether an `If-None-Match` header value names `etag` (weak comparison, as RFC 9110 asks for). */
501
+ export function etagMatches(ifNoneMatch, etag) {
502
+ if (!ifNoneMatch)
503
+ return false;
504
+ const bare = (tag) => tag.trim().replace(/^W\//, '');
505
+ const target = bare(etag);
506
+ return ifNoneMatch.split(',').some((tag) => tag.trim() === '*' || bare(tag) === target);
507
+ }
150
508
  //# sourceMappingURL=run-detail-summary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-detail-summary.js","sourceRoot":"","sources":["../../src/run-detail-summary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-detail-summary.js","sourceRoot":"","sources":["../../src/run-detail-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { RunFacetQuery, RunFacetRow, RunQuery, RunStatus, RunValueAxis, RunValueFacetOptions, RunValueFacetRow, RunWaiting, SignalWaiter, WorkflowRun } from './interfaces.js';
2
+ /**
3
+ * The origin a facet cell is filed under. An origin that is absent, null, or blank is all the same
4
+ * thing to an operator — a run no package claims — so they collapse to `null` here.
5
+ */
6
+ export declare function facetOrigin(origin: string | null | undefined): string | null;
7
+ /**
8
+ * Fold `(status, origin)` counts into one cell per pair, normalising origins via {@link facetOrigin}.
9
+ * Stores group in SQL and pipe their rows through this, so every store agrees on what lands in the
10
+ * unattributed bucket.
11
+ */
12
+ export declare function mergeRunFacetRows(rows: readonly {
13
+ status: RunStatus;
14
+ origin: string | null | undefined;
15
+ count: number;
16
+ }[]): RunFacetRow[];
17
+ /**
18
+ * The reads {@link runFacetsOf} can be built on — a `StateStore`, an engine, or a gateway. Each is
19
+ * optional; the best one present wins:
20
+ * 1. `runFacets` — the native one-`GROUP BY` count (`StateStore.runFacets` / `engine.runFacets`);
21
+ * 2. `runValueFacets` — the status axis enumerated once overall and once per named origin;
22
+ * 3. `listRuns` — every matching run counted in process (correct, but it reads them all).
23
+ */
24
+ export interface RunFacetSource {
25
+ runFacets?(query: RunFacetQuery): Promise<RunFacetRow[]>;
26
+ runValueFacets?(axis: RunValueAxis, query: RunFacetQuery, opts?: RunValueFacetOptions): Promise<RunValueFacetRow[]>;
27
+ listRuns?(query: RunQuery): Promise<WorkflowRun[]>;
28
+ }
29
+ /**
30
+ * Counts of the runs matching `query` grouped by `(status, origin)` — one cell per pair, zero-count
31
+ * cells absent, `null` for runs with no (or a blank) origin. Byte-compatible with aviary's
32
+ * `RunFacetRow`. Uses the best read `source` offers (see {@link RunFacetSource}); a source with none
33
+ * of them yields no cells.
34
+ */
35
+ export declare function runFacetsOf(source: RunFacetSource, query: RunFacetQuery): Promise<RunFacetRow[]>;
36
+ /** The reads {@link waitingForRuns} needs. */
37
+ export interface WaitingSource {
38
+ getRun(runId: string): Promise<WorkflowRun | null>;
39
+ listSignalWaitersByRunIds(runIds: string[]): Promise<SignalWaiter[]>;
40
+ }
41
+ /**
42
+ * What each of `runIds` is parked on, for the ones currently `suspended` on a signal, webhook,
43
+ * awaited child or breakpoint. An unknown id, a run that is not suspended, and a suspension on
44
+ * something else (a bare sleep, an in-flight step) are simply absent. A `Record` so it crosses the
45
+ * P4 wire as plain JSON. Reads one run per waiting id, never per requested id.
46
+ */
47
+ export declare function waitingForRuns(source: WaitingSource, runIds: readonly string[]): Promise<Record<string, RunWaiting>>;
48
+ //# sourceMappingURL=run-facets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-facets.d.ts","sourceRoot":"","sources":["../../src/run-facets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAGzB;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAE5E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GACvF,WAAW,EAAE,CAWf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,cAAc,CAAC,CACb,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,aAAa,EACpB,IAAI,CAAC,EAAE,oBAAoB,GAC1B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC/B,QAAQ,CAAC,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CACpD;AAKD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,WAAW,EAAE,CAAC,CAgBxB;AAkCD,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACtE;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAWrC"}
@@ -0,0 +1,100 @@
1
+ import { indexWaitersByRun, resolveRunWaiting } from './run-waiting.js';
2
+ /**
3
+ * The origin a facet cell is filed under. An origin that is absent, null, or blank is all the same
4
+ * thing to an operator — a run no package claims — so they collapse to `null` here.
5
+ */
6
+ export function facetOrigin(origin) {
7
+ return origin?.trim() ? origin : null;
8
+ }
9
+ /**
10
+ * Fold `(status, origin)` counts into one cell per pair, normalising origins via {@link facetOrigin}.
11
+ * Stores group in SQL and pipe their rows through this, so every store agrees on what lands in the
12
+ * unattributed bucket.
13
+ */
14
+ export function mergeRunFacetRows(rows) {
15
+ const cells = new Map();
16
+ for (const row of rows) {
17
+ if (!(row.count > 0))
18
+ continue;
19
+ const origin = facetOrigin(row.origin);
20
+ const key = JSON.stringify([row.status, origin]);
21
+ const cell = cells.get(key);
22
+ if (cell)
23
+ cell.count += row.count;
24
+ else
25
+ cells.set(key, { status: row.status, origin, count: row.count });
26
+ }
27
+ return [...cells.values()];
28
+ }
29
+ /** Origins counted one by one before the rest fold into the `null` bucket. */
30
+ const ORIGIN_LIMIT = 1_000;
31
+ /**
32
+ * Counts of the runs matching `query` grouped by `(status, origin)` — one cell per pair, zero-count
33
+ * cells absent, `null` for runs with no (or a blank) origin. Byte-compatible with aviary's
34
+ * `RunFacetRow`. Uses the best read `source` offers (see {@link RunFacetSource}); a source with none
35
+ * of them yields no cells.
36
+ */
37
+ export async function runFacetsOf(source, query) {
38
+ if (source.runFacets)
39
+ return source.runFacets(query);
40
+ const valueFacets = source.runValueFacets;
41
+ if (valueFacets) {
42
+ return runFacetsFromValueFacets((axis, q, opts) => valueFacets.call(source, axis, q, opts), query);
43
+ }
44
+ if (source.listRuns) {
45
+ const runs = await source.listRuns(query);
46
+ return mergeRunFacetRows(runs.map((run) => ({ status: run.status, origin: run.origin, count: 1 })));
47
+ }
48
+ return [];
49
+ }
50
+ /**
51
+ * The status axis enumerated once overall and once per named origin: the `null` bucket is the overall
52
+ * count less every named origin's. Exact on a store whose `runValueFacets` groups in SQL (the column
53
+ * axes do); one query per distinct origin, and origins are few (one per declaring package).
54
+ */
55
+ async function runFacetsFromValueFacets(runValueFacets, query) {
56
+ const opts = { limit: ORIGIN_LIMIT };
57
+ const [all, origins] = await Promise.all([
58
+ runValueFacets({ field: 'status' }, query, opts),
59
+ runValueFacets({ field: 'origin' }, query, opts),
60
+ ]);
61
+ const rest = new Map();
62
+ for (const row of all)
63
+ if (row.value !== null)
64
+ rest.set(row.value, row.count);
65
+ const cells = [];
66
+ for (const { value: origin } of origins) {
67
+ if (origin === null || !origin.trim())
68
+ continue;
69
+ const rows = await runValueFacets({ field: 'status' }, { ...query, origin }, opts);
70
+ for (const row of rows) {
71
+ if (row.value === null || row.count === 0)
72
+ continue;
73
+ cells.push({ status: row.value, origin, count: row.count });
74
+ rest.set(row.value, (rest.get(row.value) ?? 0) - row.count);
75
+ }
76
+ }
77
+ for (const [status, count] of rest) {
78
+ if (count > 0)
79
+ cells.push({ status: status, origin: null, count });
80
+ }
81
+ return cells;
82
+ }
83
+ /**
84
+ * What each of `runIds` is parked on, for the ones currently `suspended` on a signal, webhook,
85
+ * awaited child or breakpoint. An unknown id, a run that is not suspended, and a suspension on
86
+ * something else (a bare sleep, an in-flight step) are simply absent. A `Record` so it crosses the
87
+ * P4 wire as plain JSON. Reads one run per waiting id, never per requested id.
88
+ */
89
+ export async function waitingForRuns(source, runIds) {
90
+ const byRun = indexWaitersByRun(await source.listSignalWaitersByRunIds([...new Set(runIds)]));
91
+ const out = {};
92
+ await Promise.all([...byRun.keys()].map(async (runId) => {
93
+ const run = await source.getRun(runId);
94
+ const waiting = run ? resolveRunWaiting(run, byRun) : undefined;
95
+ if (waiting)
96
+ out[runId] = waiting;
97
+ }));
98
+ return out;
99
+ }
100
+ //# sourceMappingURL=run-facets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-facets.js","sourceRoot":"","sources":["../../src/run-facets.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAiC;IAC3D,OAAO,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAwF;IAExF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YAAE,SAAS;QAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,IAAI;YAAE,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;;YAC7B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAmBD,8EAA8E;AAC9E,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAsB,EACtB,KAAoB;IAEpB,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;IAC1C,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,wBAAwB,CAC7B,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAC1D,KAAK,CACN,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,iBAAiB,CACtB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,wBAAwB,CACrC,cAA6D,EAC7D,KAAoB;IAEpB,MAAM,IAAI,GAAyB,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAC3D,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACvC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC;QAChD,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC;KACjD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,GAAG;QAAE,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACxC,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,SAAS;QAChD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;QACnF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC;gBAAE,SAAS;YACpD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,KAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAQD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAqB,EACrB,MAAyB;IAEzB,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,GAAG,GAA+B,EAAE,CAAC;IAC3C,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,IAAI,OAAO;YAAE,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IACpC,CAAC,CAAC,CACH,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { StartOptions } from '../engine.js';
2
- import type { EngineEvent, GroupHealth, RunQuery, RunResult, SearchAttributes, StepCheckpoint, WorkflowRun } from '../interfaces.js';
2
+ import type { EngineEvent, GroupHealth, RunFacetQuery, RunFacetRow, RunQuery, RunResult, RunValueAxis, RunValueFacetOptions, RunValueFacetRow, RunWaiting, SearchAttributes, StepCheckpoint, WorkflowRun } from '../interfaces.js';
3
3
  import type { FanPage, FanPageQuery, RunDetail, RunDetailOptions } from '../run-detail-summary.js';
4
4
  import type { WorkflowRef } from '../workflow-ref.js';
5
5
  /**
@@ -94,6 +94,32 @@ export interface RunGateway {
94
94
  redispatchPending(runId: string): Promise<(RunResult & {
95
95
  redispatched: number;
96
96
  }) | null>;
97
+ /**
98
+ * Retry a failed/dead run in place: it goes back to `pending` and a worker resumes it, replaying
99
+ * its checkpoints and re-attempting the failed step (`engine.requeue`). Returns the enqueued state,
100
+ * or null for an unknown run.
101
+ *
102
+ * This verb and the five below are aviary's, in aviary's shapes. They are optional so a gateway
103
+ * written against an earlier release keeps compiling; both shipped gateways implement them all.
104
+ */
105
+ retry?(runId: string): Promise<RunResult | null>;
106
+ /** Resume a run paused at a `ctx.breakpoint()`. Null if it is not paused at one. */
107
+ continue?(runId: string): Promise<RunResult | null>;
108
+ /** Fix-and-replay: a fresh linked run of the same workflow with a corrected `input`. Returns the
109
+ * new run's id, or null for an unknown run. */
110
+ retryWithInput?(runId: string, input: unknown): Promise<{
111
+ runId: string;
112
+ } | null>;
113
+ /** Counts of the runs matching `query` by `(status, origin)` — a console's status and origin
114
+ * chips, exact while the list is paginated. Zero-count cells are absent. A tenant proxy's answer
115
+ * is scoped to the tenant's own runs. */
116
+ runFacets?(query: RunFacetQuery): Promise<RunFacetRow[]>;
117
+ /** The distinct values of one filter axis over the runs matching `query`, with counts — what a
118
+ * console's pickers list. Scoped to the tenant's own runs over a proxy. */
119
+ runValueFacets?(axis: RunValueAxis, query: RunFacetQuery, opts?: RunValueFacetOptions): Promise<RunValueFacetRow[]>;
120
+ /** What each of `runIds` is parked on (signal, webhook, awaited child, breakpoint), for the ones
121
+ * currently waiting; every other id is absent. A proxy only learns about the tenant's own runs. */
122
+ waitingFor?(runIds: string[]): Promise<Record<string, RunWaiting>>;
97
123
  /** Live lifecycle events for ONE run; returns an unsubscribe fn. Framework-agnostic (no rxjs). */
98
124
  subscribe(runId: string, onEvent: (event: EngineEvent) => void): () => void;
99
125
  }