@adonis-agora/durable 0.47.0 → 0.49.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 (183) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/assets/spa/assets/index-6nmSTfT7.css +1 -0
  3. package/dist/assets/spa/assets/index-DdB9zxuX.js +16 -0
  4. package/dist/assets/spa/assets/index-DdB9zxuX.js.map +1 -0
  5. package/dist/assets/spa/index.html +2 -2
  6. package/dist/configure.d.ts.map +1 -1
  7. package/dist/configure.js +1 -0
  8. package/dist/configure.js.map +1 -1
  9. package/dist/providers/dashboard_provider.d.ts +3 -1
  10. package/dist/providers/dashboard_provider.d.ts.map +1 -1
  11. package/dist/providers/dashboard_provider.js +7 -2
  12. package/dist/providers/dashboard_provider.js.map +1 -1
  13. package/dist/providers/durable_provider.d.ts +0 -25
  14. package/dist/providers/durable_provider.d.ts.map +1 -1
  15. package/dist/providers/durable_provider.js +30 -5
  16. package/dist/providers/durable_provider.js.map +1 -1
  17. package/dist/src/codec-state-store.d.ts +2 -0
  18. package/dist/src/codec-state-store.d.ts.map +1 -1
  19. package/dist/src/codec-state-store.js +6 -0
  20. package/dist/src/codec-state-store.js.map +1 -1
  21. package/dist/src/completion.d.ts +11 -0
  22. package/dist/src/completion.d.ts.map +1 -1
  23. package/dist/src/completion.js +18 -1
  24. package/dist/src/completion.js.map +1 -1
  25. package/dist/src/dashboard/gateway-adapter.d.ts.map +1 -1
  26. package/dist/src/dashboard/gateway-adapter.js +10 -0
  27. package/dist/src/dashboard/gateway-adapter.js.map +1 -1
  28. package/dist/src/dashboard/handlers.d.ts +22 -1
  29. package/dist/src/dashboard/handlers.d.ts.map +1 -1
  30. package/dist/src/dashboard/handlers.js +63 -10
  31. package/dist/src/dashboard/handlers.js.map +1 -1
  32. package/dist/src/dashboard/index.d.ts +1 -1
  33. package/dist/src/dashboard/index.js +1 -1
  34. package/dist/src/dashboard/openapi.d.ts.map +1 -1
  35. package/dist/src/dashboard/openapi.js +26 -2
  36. package/dist/src/dashboard/openapi.js.map +1 -1
  37. package/dist/src/define_config.d.ts +6 -0
  38. package/dist/src/define_config.d.ts.map +1 -1
  39. package/dist/src/define_config.js.map +1 -1
  40. package/dist/src/engine.d.ts +89 -3
  41. package/dist/src/engine.d.ts.map +1 -1
  42. package/dist/src/engine.js +448 -39
  43. package/dist/src/engine.js.map +1 -1
  44. package/dist/src/errors.d.ts +30 -12
  45. package/dist/src/errors.d.ts.map +1 -1
  46. package/dist/src/errors.js +17 -8
  47. package/dist/src/errors.js.map +1 -1
  48. package/dist/src/fan-join.d.ts +36 -6
  49. package/dist/src/fan-join.d.ts.map +1 -1
  50. package/dist/src/fan-join.js +63 -8
  51. package/dist/src/fan-join.js.map +1 -1
  52. package/dist/src/handshake/announced.d.ts +94 -0
  53. package/dist/src/handshake/announced.d.ts.map +1 -0
  54. package/dist/src/handshake/announced.js +113 -0
  55. package/dist/src/handshake/announced.js.map +1 -0
  56. package/dist/src/handshake/descriptor.d.ts +59 -0
  57. package/dist/src/handshake/descriptor.d.ts.map +1 -1
  58. package/dist/src/handshake/descriptor.js +38 -0
  59. package/dist/src/handshake/descriptor.js.map +1 -1
  60. package/dist/src/index.d.ts +6 -3
  61. package/dist/src/index.d.ts.map +1 -1
  62. package/dist/src/index.js +5 -2
  63. package/dist/src/index.js.map +1 -1
  64. package/dist/src/interfaces.d.ts +85 -4
  65. package/dist/src/interfaces.d.ts.map +1 -1
  66. package/dist/src/interfaces.js.map +1 -1
  67. package/dist/src/metrics.d.ts +5 -0
  68. package/dist/src/metrics.d.ts.map +1 -1
  69. package/dist/src/metrics.js +14 -1
  70. package/dist/src/metrics.js.map +1 -1
  71. package/dist/src/on-error.d.ts +59 -0
  72. package/dist/src/on-error.d.ts.map +1 -0
  73. package/dist/src/on-error.js +71 -0
  74. package/dist/src/on-error.js.map +1 -0
  75. package/dist/src/otel/durable-metrics.d.ts +6 -0
  76. package/dist/src/otel/durable-metrics.d.ts.map +1 -1
  77. package/dist/src/otel/durable-metrics.js +22 -2
  78. package/dist/src/otel/durable-metrics.js.map +1 -1
  79. package/dist/src/otel/durable-otel.d.ts.map +1 -1
  80. package/dist/src/otel/durable-otel.js +15 -0
  81. package/dist/src/otel/durable-otel.js.map +1 -1
  82. package/dist/src/protocol.d.ts.map +1 -1
  83. package/dist/src/protocol.js +1 -0
  84. package/dist/src/protocol.js.map +1 -1
  85. package/dist/src/run-detail-summary.d.ts +98 -0
  86. package/dist/src/run-detail-summary.d.ts.map +1 -0
  87. package/dist/src/run-detail-summary.js +150 -0
  88. package/dist/src/run-detail-summary.js.map +1 -0
  89. package/dist/src/run-gateway/interface.d.ts +11 -0
  90. package/dist/src/run-gateway/interface.d.ts.map +1 -1
  91. package/dist/src/run-gateway/proxy-run-gateway.d.ts +3 -0
  92. package/dist/src/run-gateway/proxy-run-gateway.d.ts.map +1 -1
  93. package/dist/src/run-gateway/proxy-run-gateway.js +8 -0
  94. package/dist/src/run-gateway/proxy-run-gateway.js.map +1 -1
  95. package/dist/src/run-gateway/run-request-responder.d.ts +4 -3
  96. package/dist/src/run-gateway/run-request-responder.d.ts.map +1 -1
  97. package/dist/src/run-gateway/run-request-responder.js +23 -3
  98. package/dist/src/run-gateway/run-request-responder.js.map +1 -1
  99. package/dist/src/run-gateway/store-run-gateway.d.ts +3 -0
  100. package/dist/src/run-gateway/store-run-gateway.d.ts.map +1 -1
  101. package/dist/src/run-gateway/store-run-gateway.js +7 -0
  102. package/dist/src/run-gateway/store-run-gateway.js.map +1 -1
  103. package/dist/src/stores/lucid.d.ts +1 -0
  104. package/dist/src/stores/lucid.d.ts.map +1 -1
  105. package/dist/src/stores/lucid.js +17 -4
  106. package/dist/src/stores/lucid.js.map +1 -1
  107. package/dist/src/testing/in-memory-state-store.d.ts +1 -0
  108. package/dist/src/testing/in-memory-state-store.d.ts.map +1 -1
  109. package/dist/src/testing/in-memory-state-store.js +14 -6
  110. package/dist/src/testing/in-memory-state-store.js.map +1 -1
  111. package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -1
  112. package/dist/src/testing-kit/state-store-conformance.js +59 -0
  113. package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
  114. package/dist/src/transports/bullmq/adaptive-concurrency.d.ts +144 -0
  115. package/dist/src/transports/bullmq/adaptive-concurrency.d.ts.map +1 -0
  116. package/dist/src/transports/bullmq/adaptive-concurrency.js +312 -0
  117. package/dist/src/transports/bullmq/adaptive-concurrency.js.map +1 -0
  118. package/dist/src/transports/bullmq/bullmq-transport.d.ts +18 -1
  119. package/dist/src/transports/bullmq/bullmq-transport.d.ts.map +1 -1
  120. package/dist/src/transports/bullmq/bullmq-transport.js +50 -49
  121. package/dist/src/transports/bullmq/bullmq-transport.js.map +1 -1
  122. package/dist/src/transports/bullmq/deps.d.ts +11 -1
  123. package/dist/src/transports/bullmq/deps.d.ts.map +1 -1
  124. package/dist/src/transports/bullmq/deps.js +12 -1
  125. package/dist/src/transports/bullmq/deps.js.map +1 -1
  126. package/dist/src/transports/bullmq/index.d.ts +1 -0
  127. package/dist/src/transports/bullmq/index.d.ts.map +1 -1
  128. package/dist/src/transports/bullmq/index.js +1 -0
  129. package/dist/src/transports/bullmq/index.js.map +1 -1
  130. package/dist/src/transports/db-schema.d.ts +12 -0
  131. package/dist/src/transports/db-schema.d.ts.map +1 -1
  132. package/dist/src/transports/db-schema.js +24 -0
  133. package/dist/src/transports/db-schema.js.map +1 -1
  134. package/dist/src/transports/db.d.ts +14 -0
  135. package/dist/src/transports/db.d.ts.map +1 -1
  136. package/dist/src/transports/db.js +34 -0
  137. package/dist/src/transports/db.js.map +1 -1
  138. package/dist/src/transports/event-emitter.d.ts +8 -0
  139. package/dist/src/transports/event-emitter.d.ts.map +1 -1
  140. package/dist/src/transports/event-emitter.js +27 -0
  141. package/dist/src/transports/event-emitter.js.map +1 -1
  142. package/dist/src/transports/factory.d.ts +33 -2
  143. package/dist/src/transports/factory.d.ts.map +1 -1
  144. package/dist/src/transports/factory.js +29 -1
  145. package/dist/src/transports/factory.js.map +1 -1
  146. package/dist/src/transports/queue.d.ts +19 -0
  147. package/dist/src/transports/queue.d.ts.map +1 -1
  148. package/dist/src/transports/queue.js +17 -0
  149. package/dist/src/transports/queue.js.map +1 -1
  150. package/dist/src/transports/worker-keys-db.d.ts +17 -0
  151. package/dist/src/transports/worker-keys-db.d.ts.map +1 -0
  152. package/dist/src/transports/worker-keys-db.js +43 -0
  153. package/dist/src/transports/worker-keys-db.js.map +1 -0
  154. package/dist/src/transports/worker-keys.d.ts +56 -0
  155. package/dist/src/transports/worker-keys.d.ts.map +1 -0
  156. package/dist/src/transports/worker-keys.js +92 -0
  157. package/dist/src/transports/worker-keys.js.map +1 -0
  158. package/dist/src/worker-runtime/index.d.ts +1 -1
  159. package/dist/src/worker-runtime/index.d.ts.map +1 -1
  160. package/dist/src/worker-runtime/index.js.map +1 -1
  161. package/dist/src/worker-runtime/worker-runtime.d.ts +7 -2
  162. package/dist/src/worker-runtime/worker-runtime.d.ts.map +1 -1
  163. package/dist/src/worker-runtime/worker-runtime.js +22 -20
  164. package/dist/src/worker-runtime/worker-runtime.js.map +1 -1
  165. package/dist/src/workflow-ctx.d.ts +13 -1
  166. package/dist/src/workflow-ctx.d.ts.map +1 -1
  167. package/dist/src/workflow-ctx.js +44 -6
  168. package/dist/src/workflow-ctx.js.map +1 -1
  169. package/dist/src/workflow-discovery.d.ts.map +1 -1
  170. package/dist/src/workflow-discovery.js +2 -1
  171. package/dist/src/workflow-discovery.js.map +1 -1
  172. package/dist/src/workflow-ref.d.ts +31 -0
  173. package/dist/src/workflow-ref.d.ts.map +1 -1
  174. package/dist/src/workflow-ref.js +22 -0
  175. package/dist/src/workflow-ref.js.map +1 -1
  176. package/dist/stubs/database/migrations/create_durable_transport_worker_keys.stub +24 -0
  177. package/package.json +5 -5
  178. package/skills/durable-cluster/SKILL.md +10 -0
  179. package/skills/durable-transports-stores/SKILL.md +37 -0
  180. package/skills/durable-workflows/SKILL.md +22 -1
  181. package/dist/assets/spa/assets/index-CL6q2kMB.js +0 -16
  182. package/dist/assets/spa/assets/index-CL6q2kMB.js.map +0 -1
  183. package/dist/assets/spa/assets/index-DU6cGcJz.css +0 -1
@@ -6,7 +6,8 @@
6
6
  */
7
7
  export function collectMetrics(engine) {
8
8
  const m = {
9
- runs: { started: 0, completed: 0, failed: 0, suspended: 0 },
9
+ runs: { started: 0, completed: 0, failed: 0, suspended: 0, routed: 0, unrouted: 0 },
10
+ routedByCode: {},
10
11
  steps: { started: 0, completed: 0, failed: 0 },
11
12
  byWorkflow: {},
12
13
  stepDuration: { sumMs: 0, count: 0 },
@@ -37,6 +38,15 @@ export function collectMetrics(engine) {
37
38
  case 'run.suspended':
38
39
  m.runs.suspended += 1;
39
40
  break;
41
+ case 'run.routed': {
42
+ m.runs.routed += 1;
43
+ const code = e.error?.code ?? '*';
44
+ m.routedByCode[code] = (m.routedByCode[code] ?? 0) + 1;
45
+ break;
46
+ }
47
+ case 'run.unrouted':
48
+ m.runs.unrouted += 1;
49
+ break;
40
50
  case 'step.started':
41
51
  m.steps.started += 1;
42
52
  break;
@@ -67,6 +77,9 @@ export function collectMetrics(engine) {
67
77
  for (const [name, v] of Object.entries(m.byWorkflow))
68
78
  for (const [event, n] of Object.entries(v))
69
79
  lines.push(`durable_runs_by_workflow_total{workflow="${name}",event="${event}"} ${n}`);
80
+ lines.push('# TYPE durable_runs_routed_total counter');
81
+ for (const [code, n] of Object.entries(m.routedByCode))
82
+ lines.push(`durable_runs_routed_total{code="${code}"} ${n}`);
70
83
  lines.push('# TYPE durable_step_duration_ms_sum counter');
71
84
  lines.push(`durable_step_duration_ms_sum ${m.stepDuration.sumMs}`);
72
85
  lines.push('# TYPE durable_step_duration_count counter');
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { StepError } from './interfaces.js';
2
+ /**
3
+ * Routes a failed run to a handler workflow instead of failing it: when a run of the workflow ends
4
+ * `failed` with an error whose `code` matches (or with any error, for the route without a `code`), the
5
+ * engine starts `workflow` with an {@link OnErrorInput} and the failed run waits for it. The run then
6
+ * settles with the handler's outcome: its output on success, its error on failure.
7
+ */
8
+ export interface OnErrorRoute {
9
+ /** The error `code` to route. Omitted: routes any failure no other route's `code` matches. */
10
+ code?: string | undefined;
11
+ /** The registered handler workflow's name. */
12
+ workflow: string;
13
+ }
14
+ /** The input an {@link OnErrorRoute} handler workflow is started with. */
15
+ export interface OnErrorInput<TInput = unknown> {
16
+ /** The run that failed; it completes with this handler's output. */
17
+ runId: string;
18
+ /** The failed run's workflow. */
19
+ workflow: string;
20
+ /** The failed run's input. */
21
+ input: TInput;
22
+ /** The failure, as the run recorded it. */
23
+ error: StepError;
24
+ }
25
+ /**
26
+ * Handoff checkpoints live at seqs from here up, one per handoff, so a body that runs again after a
27
+ * retry can never reach one. Fits a 32-bit `seq` column.
28
+ */
29
+ export declare const HANDOFF_SEQ_BASE = 1000000000;
30
+ /** The id of the handler run of a run's `attempt`-th handoff. */
31
+ export declare const onErrorRunId: (runId: string, attempt: number) => string;
32
+ /** The waiter checkpoint a run waits on its handler under; renamed {@link retiredHandoffName} on retry. */
33
+ export declare const handoffName: (handlerId: string) => string;
34
+ /** What a retry renames a handoff checkpoint to: kept in the timeline, never followed again. */
35
+ export declare const retiredHandoffName: (handlerId: string) => string;
36
+ /** The handler run id a live handoff checkpoint of `runId` names, or undefined for any other one. */
37
+ export declare function handoffHandlerId(runId: string, cp: {
38
+ seq: number;
39
+ name: string;
40
+ }): string | undefined;
41
+ /** The run's live handoff (its latest, unretired one), if it handed a failure off. */
42
+ export declare function liveHandoff<C extends {
43
+ seq: number;
44
+ name: string;
45
+ }>(runId: string, checkpoints: readonly C[]): C | undefined;
46
+ /** The route a failure takes: the one for its exact code, else the catch-all, else none. */
47
+ export declare function routeFor(routes: OnErrorRoute[] | undefined, error: StepError): OnErrorRoute | undefined;
48
+ /** Reject two routes for one code, or two catch-alls — ambiguous config, caught at registration. */
49
+ export declare function assertRoutes(workflow: string, routes: OnErrorRoute[]): void;
50
+ /** The `code` carried by a thrown value: its own, a dispatched step's, or a thin-worker step's. */
51
+ export declare function codeOf(err: unknown): string | undefined;
52
+ /** The `details` carried by a thrown value, from the same places as {@link codeOf}. */
53
+ export declare function detailsOf(err: unknown): unknown;
54
+ /** `code` and `details` as optional keys, so an absent one is not written as `undefined`. */
55
+ export declare function codeAndDetails(err: unknown): {
56
+ code?: string;
57
+ details?: unknown;
58
+ };
59
+ //# sourceMappingURL=on-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-error.d.ts","sourceRoot":"","sources":["../../src/on-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,8FAA8F;IAC9F,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO;IAC5C,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,EAAE,SAAS,CAAC;CAClB;AAQD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aAAgB,CAAC;AAE9C,iEAAiE;AACjE,eAAO,MAAM,YAAY,UAAW,MAAM,WAAW,MAAM,KAAG,MAC/B,CAAC;AAEhC,2GAA2G;AAC3G,eAAO,MAAM,WAAW,cAAe,MAAM,KAAG,MAAqC,CAAC;AAEtF,gGAAgG;AAChG,eAAO,MAAM,kBAAkB,cAAe,MAAM,KAAG,MAAwC,CAAC;AAEhG,qGAAqG;AACrG,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC,MAAM,GAAG,SAAS,CAKpB;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,CAAC,SAAS;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACjE,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,SAAS,CAAC,EAAE,GACxB,CAAC,GAAG,SAAS,CAMf;AAED,4FAA4F;AAC5F,wBAAgB,QAAQ,CACtB,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,EAClC,KAAK,EAAE,SAAS,GACf,YAAY,GAAG,SAAS,CAM1B;AAED,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAY3E;AASD,mGAAmG;AACnG,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAKvD;AAED,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAG/C;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAOjF"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Codes of failures that mean the code or the deployment is broken, not that the work failed: routing
3
+ * them would turn a non-deterministic deploy or a misuse of the ctx into a completed run.
4
+ */
5
+ const UNROUTABLE_CODES = new Set(['non_determinism', 'nested_workflow_call']);
6
+ /**
7
+ * Handoff checkpoints live at seqs from here up, one per handoff, so a body that runs again after a
8
+ * retry can never reach one. Fits a 32-bit `seq` column.
9
+ */
10
+ export const HANDOFF_SEQ_BASE = 1_000_000_000;
11
+ /** The id of the handler run of a run's `attempt`-th handoff. */
12
+ export const onErrorRunId = (runId, attempt) => `${runId}.onError.${attempt}`;
13
+ /** The waiter checkpoint a run waits on its handler under; renamed {@link retiredHandoffName} on retry. */
14
+ export const handoffName = (handlerId) => `signal:child:${handlerId}`;
15
+ /** What a retry renames a handoff checkpoint to: kept in the timeline, never followed again. */
16
+ export const retiredHandoffName = (handlerId) => `onError:retried:${handlerId}`;
17
+ /** The handler run id a live handoff checkpoint of `runId` names, or undefined for any other one. */
18
+ export function handoffHandlerId(runId, cp) {
19
+ const prefix = `signal:child:${runId}.onError.`;
20
+ return cp.seq >= HANDOFF_SEQ_BASE && cp.name.startsWith(prefix)
21
+ ? cp.name.slice('signal:child:'.length)
22
+ : undefined;
23
+ }
24
+ /** The run's live handoff (its latest, unretired one), if it handed a failure off. */
25
+ export function liveHandoff(runId, checkpoints) {
26
+ let live;
27
+ for (const cp of checkpoints) {
28
+ if (handoffHandlerId(runId, cp) !== undefined && (!live || cp.seq > live.seq))
29
+ live = cp;
30
+ }
31
+ return live;
32
+ }
33
+ /** The route a failure takes: the one for its exact code, else the catch-all, else none. */
34
+ export function routeFor(routes, error) {
35
+ if (!routes?.length || (error.code && UNROUTABLE_CODES.has(error.code)))
36
+ return undefined;
37
+ return ((error.code ? routes.find((r) => r.code === error.code) : undefined) ??
38
+ routes.find((r) => r.code === undefined));
39
+ }
40
+ /** Reject two routes for one code, or two catch-alls — ambiguous config, caught at registration. */
41
+ export function assertRoutes(workflow, routes) {
42
+ const seen = new Set();
43
+ for (const r of routes) {
44
+ if (seen.has(r.code)) {
45
+ throw new Error(r.code === undefined
46
+ ? `workflow ${workflow}: more than one onError route without a code`
47
+ : `workflow ${workflow}: more than one onError route for code "${r.code}"`);
48
+ }
49
+ seen.add(r.code);
50
+ }
51
+ }
52
+ /** The `code` carried by a thrown value: its own, a dispatched step's, or a thin-worker step's. */
53
+ export function codeOf(err) {
54
+ const e = err;
55
+ return [e?.code, e?.stepError?.code, e?.error?.code].find((c) => typeof c === 'string');
56
+ }
57
+ /** The `details` carried by a thrown value, from the same places as {@link codeOf}. */
58
+ export function detailsOf(err) {
59
+ const e = err;
60
+ return e?.details ?? e?.stepError?.details ?? e?.error?.details;
61
+ }
62
+ /** `code` and `details` as optional keys, so an absent one is not written as `undefined`. */
63
+ export function codeAndDetails(err) {
64
+ const code = codeOf(err);
65
+ const details = detailsOf(err);
66
+ return {
67
+ ...(code !== undefined ? { code } : {}),
68
+ ...(details !== undefined ? { details } : {}),
69
+ };
70
+ }
71
+ //# sourceMappingURL=on-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-error.js","sourceRoot":"","sources":["../../src/on-error.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,13 @@ export interface DurableMetricsSnapshot {
12
12
  completed: number;
13
13
  failed: number;
14
14
  suspended: number;
15
+ /** Failures handed to an onError handler instead of failing the run. */
16
+ routed: number;
17
+ /** Failures that had onError routes the engine could not apply (workers disagree). */
18
+ unrouted: number;
15
19
  };
20
+ /** Routed failures by error code (`*` for a failure without one). */
21
+ routedByCode: Record<string, number>;
16
22
  steps: {
17
23
  completed: number;
18
24
  failed: number;
@@ -1 +1 @@
1
- {"version":3,"file":"durable-metrics.d.ts","sourceRoot":"","sources":["../../../src/otel/durable-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,kEAAkE;IAClE,cAAc,EAAE,aAAa,CAAC;IAC9B,6DAA6D;IAC7D,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,QAAQ,IAAI,sBAAsB,CAAC;IACnC,qDAAqD;IACrD,KAAK,IAAI,IAAI,CAAC;IACd,uBAAuB;IACvB,WAAW,IAAI,IAAI,CAAC;CACrB;AAUD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CA2D3E"}
1
+ {"version":3,"file":"durable-metrics.d.ts","sourceRoot":"","sources":["../../../src/otel/durable-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,wEAAwE;QACxE,MAAM,EAAE,MAAM,CAAC;QACf,sFAAsF;QACtF,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,kEAAkE;IAClE,cAAc,EAAE,aAAa,CAAC;IAC9B,6DAA6D;IAC7D,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,QAAQ,IAAI,sBAAsB,CAAC;IACnC,qDAAqD;IACrD,KAAK,IAAI,IAAI,CAAC;IACd,uBAAuB;IACvB,WAAW,IAAI,IAAI,CAAC;CACrB;AAUD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CA+E3E"}
@@ -14,7 +14,16 @@ function stats(xs) {
14
14
  * its own.
15
15
  */
16
16
  export function attachDurableMetrics(engine) {
17
- let runs = { started: 0, completed: 0, failed: 0, suspended: 0 };
17
+ const zeroRuns = () => ({
18
+ started: 0,
19
+ completed: 0,
20
+ failed: 0,
21
+ suspended: 0,
22
+ routed: 0,
23
+ unrouted: 0,
24
+ });
25
+ let runs = zeroRuns();
26
+ let routedByCode = {};
18
27
  let steps = { completed: 0, failed: 0 };
19
28
  let stepDur = [];
20
29
  let runDur = [];
@@ -43,6 +52,15 @@ export function attachDurableMetrics(engine) {
43
52
  case 'run.suspended':
44
53
  runs.suspended += 1;
45
54
  break;
55
+ case 'run.routed': {
56
+ runs.routed += 1;
57
+ const code = e.error?.code ?? '*';
58
+ routedByCode[code] = (routedByCode[code] ?? 0) + 1;
59
+ break;
60
+ }
61
+ case 'run.unrouted':
62
+ runs.unrouted += 1;
63
+ break;
46
64
  case 'step.completed':
47
65
  steps.completed += 1;
48
66
  if (e.durationMs != null)
@@ -58,12 +76,14 @@ export function attachDurableMetrics(engine) {
58
76
  return {
59
77
  snapshot: () => ({
60
78
  runs: { ...runs },
79
+ routedByCode: { ...routedByCode },
61
80
  steps: { ...steps },
62
81
  stepDurationMs: stats(stepDur),
63
82
  runDurationMs: stats(runDur),
64
83
  }),
65
84
  reset: () => {
66
- runs = { started: 0, completed: 0, failed: 0, suspended: 0 };
85
+ runs = zeroRuns();
86
+ routedByCode = {};
67
87
  steps = { completed: 0, failed: 0 };
68
88
  stepDur = [];
69
89
  runDur = [];
@@ -1 +1 @@
1
- {"version":3,"file":"durable-metrics.js","sourceRoot":"","sources":["../../../src/otel/durable-metrics.ts"],"names":[],"mappings":"AA4BA,SAAS,KAAK,CAAC,EAAY;IACzB,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CACvB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClF,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACjG,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,IAAI,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACjE,IAAI,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACxC,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAa,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAQ,EAAQ,EAAE;QAClD,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/B,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;QACzC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,aAAa;gBAChB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;gBAClB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,eAAe;gBAClB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;gBACpB,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzB,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;gBACjB,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzB,MAAM;YACR,KAAK,eAAe;gBAClB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;gBACpB,MAAM;YACR,KAAK,gBAAgB;gBACnB,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;gBACrB,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,aAAa;gBAChB,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;gBAClB,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACrD,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACf,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE;YACjB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE;YACnB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC;YAC9B,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;SAC7B,CAAC;QACF,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YAC7D,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,EAAE,CAAC;YACZ,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QACD,WAAW;KACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"durable-metrics.js","sourceRoot":"","sources":["../../../src/otel/durable-metrics.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"durable-otel.d.ts","sourceRoot":"","sources":["../../../src/otel/durable-otel.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,kBAAuB,GAC/B,MAAM,IAAI,CAwFZ"}
1
+ {"version":3,"file":"durable-otel.d.ts","sourceRoot":"","sources":["../../../src/otel/durable-otel.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,kBAAuB,GAC/B,MAAM,IAAI,CA+GZ"}
@@ -57,6 +57,21 @@ export function attachDurableOtel(engine, options = {}) {
57
57
  span.end(event.at);
58
58
  break;
59
59
  }
60
+ // Both are emitted while the run's span is still open: the handoff before the run suspends on its
61
+ // handler, the unrouted failure before the run fails.
62
+ case 'run.routed':
63
+ roots.get(event.runId)?.addEvent('durable.run.routed', {
64
+ 'durable.on_error.handler': event.name,
65
+ 'durable.error.code': event.error?.code,
66
+ 'durable.error.message': event.error?.message,
67
+ }, event.at);
68
+ break;
69
+ case 'run.unrouted':
70
+ roots.get(event.runId)?.addEvent('durable.run.unrouted', {
71
+ 'durable.on_error.reason': event.reason,
72
+ 'durable.error.code': event.error?.code,
73
+ }, event.at);
74
+ break;
60
75
  case 'run.completed':
61
76
  endRoot(event);
62
77
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"durable-otel.js","sourceRoot":"","sources":["../../../src/otel/durable-otel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"durable-otel.js","sourceRoot":"","sources":["../../../src/otel/durable-otel.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAa,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiChG;oGACoG;AACpG,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;6FAC6F;AAC7F,eAAO,MAAM,eAAe,UAAW,MAAM,OAAO,MAAM,KAAG,MAA8B,CAAC;AAE5F;kGACkG;AAClG,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAE1F;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnD,OAAO,CAAC,UAAU,CAAC,CA+DrB"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAa,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiChG;oGACoG;AACpG,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;6FAC6F;AAC7F,eAAO,MAAM,eAAe,UAAW,MAAM,OAAO,MAAM,KAAG,MAA8B,CAAC;AAE5F;kGACkG;AAClG,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAE1F;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnD,OAAO,CAAC,UAAU,CAAC,CAgErB"}
@@ -93,6 +93,7 @@ export async function runStepHandler(task, handler, emitBeat) {
93
93
  error: {
94
94
  message: err instanceof Error ? err.message : String(err),
95
95
  ...(typeof e?.code === 'string' ? { code: e.code } : {}),
96
+ ...(e?.details !== undefined ? { details: e.details } : {}),
96
97
  ...(typeof e?.retryable === 'boolean' ? { retryable: e.retryable } : {}),
97
98
  },
98
99
  });
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import type { StepCheckpoint, WorkflowRun } from './interfaces.js';
2
+ /**
3
+ * A parallel fan (a `ctx.all`, a step fan, a polyglot `gather`) reduced to what a detail view needs
4
+ * to draw it: one node, its progress and its failures. A run detail with a 40,000-item fan otherwise
5
+ * carries every member — megabytes of JSON, and one rendered row (or fetched child) per member.
6
+ */
7
+ export interface FanSummary {
8
+ /** The fan's `parallelGroup`. */
9
+ group: string;
10
+ /** The members' common step name, or `child runs` for a fan of child workflows. */
11
+ label: string;
12
+ firstSeq: number;
13
+ lastSeq: number;
14
+ /** Members started so far: steps, or child runs (a folded checkpoint counts as the children it stands for). */
15
+ size: number;
16
+ /**
17
+ * The fan's declared size, when its group carries it. More than `size` while waves are still to
18
+ * be sent (`concurrency`), and for good when a failFast fan stopped early.
19
+ */
20
+ total?: number | undefined;
21
+ /** `total - size`: members never started yet — or never to start, once the run has finished. */
22
+ notStarted?: number | undefined;
23
+ /** The fan stops at its first failure. */
24
+ failFast: boolean;
25
+ /** Members by status. A child that failed counts as `failed`, though its checkpoint is `completed`. */
26
+ counts: Partial<Record<StepCheckpoint['status'], number>>;
27
+ startedAt?: Date | undefined;
28
+ finishedAt?: Date | undefined;
29
+ /** The first {@link FAN_SUMMARY_FAILURES} failed members, so a failure shows without paging. */
30
+ failures: StepCheckpoint[];
31
+ }
32
+ /** A page of one fan's members, in seq order. */
33
+ export interface FanPage {
34
+ items: StepCheckpoint[];
35
+ /** Members matching the query, across all pages. */
36
+ total: number;
37
+ }
38
+ export interface FanPageQuery {
39
+ offset?: number | undefined;
40
+ limit?: number | undefined;
41
+ /** Only failed members (a failed step, or a child that failed). */
42
+ failedOnly?: boolean | undefined;
43
+ }
44
+ export declare const FAN_SUMMARY_FAILURES = 20;
45
+ /** The most children a summarized detail lists by id; `childCount` carries the rest. */
46
+ export declare const SUMMARY_CHILD_LIMIT = 200;
47
+ /** A failed member: a failed step, or a child whose completion reports `ok: false`. */
48
+ export declare function isFailedMember(cp: StepCheckpoint): boolean;
49
+ /** Summarize one fan's members (in seq order). */
50
+ export declare function summarizeFan(group: string, members: StepCheckpoint[]): FanSummary;
51
+ /**
52
+ * Split a run's timeline into the checkpoints a detail view lists one by one and the fans it draws as
53
+ * one node each: every `parallelGroup` with more than `over` members, or declared wider than that,
54
+ * becomes a {@link FanSummary}, and its members leave the timeline. Smaller groups and ungrouped
55
+ * steps stay as they are.
56
+ */
57
+ export declare function summarizeTimeline(timeline: StepCheckpoint[], over: number): {
58
+ timeline: StepCheckpoint[];
59
+ fans: FanSummary[];
60
+ };
61
+ /** One page of a fan's members out of a run's timeline. */
62
+ export declare function pageFan(timeline: StepCheckpoint[], group: string, query: FanPageQuery): FanPage;
63
+ /**
64
+ * A run's detail: the run, its step timeline, and the runs it spawned. With
65
+ * {@link RunDetailOptions.summarizeFansOver}, the members of a wide fan are left out of `timeline`
66
+ * and drawn from {@link fans} instead, and `children` lists only the first {@link SUMMARY_CHILD_LIMIT}.
67
+ */
68
+ export interface RunDetail {
69
+ run: WorkflowRun;
70
+ /** Steps in execution order, less the members of a summarized fan. */
71
+ timeline: StepCheckpoint[];
72
+ /** Ids of runs this run spawned. Capped when summarized — see {@link childCount}. */
73
+ children: string[];
74
+ /** The fans drawn as one node each, when the detail was asked to summarize them. */
75
+ fans?: FanSummary[] | undefined;
76
+ /** How many children the run has, when `children` lists only the first of them. */
77
+ childCount?: number | undefined;
78
+ }
79
+ /** How to shape a {@link RunDetail}. */
80
+ export interface RunDetailOptions {
81
+ /**
82
+ * Summarize every fan with more than this many members into a {@link FanSummary} instead of
83
+ * listing them, and cap `children`. Unset returns the full timeline. A view of a run with a wide
84
+ * fan should set it: the full detail of a 40k-member fan is megabytes.
85
+ */
86
+ summarizeFansOver?: number | undefined;
87
+ }
88
+ /** The reads a {@link RunDetail} is built from — an engine, a dashboard port, or a gateway. */
89
+ export interface RunDetailSource {
90
+ getRun(runId: string): Promise<WorkflowRun | null>;
91
+ listCheckpoints(runId: string): Promise<StepCheckpoint[]>;
92
+ getRunChildren(runId: string): Promise<string[]>;
93
+ }
94
+ /** Read `runId`'s {@link RunDetail}, summarized per `options`, or null for an unknown run. */
95
+ export declare function loadRunDetail(source: RunDetailSource, runId: string, options?: RunDetailOptions): Promise<RunDetail | null>;
96
+ /** One page of `runId`'s fan `group`, or null for an unknown run. */
97
+ export declare function loadFanMembers(source: Pick<RunDetailSource, 'getRun' | 'listCheckpoints'>, runId: string, group: string, query: FanPageQuery): Promise<FanPage | null>;
98
+ //# sourceMappingURL=run-detail-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-detail-summary.d.ts","sourceRoot":"","sources":["../../src/run-detail-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import { childIdsOf, FOLDED_PREFIX, parseFanGroup } from './fan-join.js';
2
+ export const FAN_SUMMARY_FAILURES = 20;
3
+ /** The most children a summarized detail lists by id; `childCount` carries the rest. */
4
+ export const SUMMARY_CHILD_LIMIT = 200;
5
+ const FAN_PAGE_MAX = 500;
6
+ function foldedCount(cp) {
7
+ if (!cp.name.startsWith(FOLDED_PREFIX))
8
+ return undefined;
9
+ const values = cp.output?.values;
10
+ return Array.isArray(values) ? values.length : 0;
11
+ }
12
+ /** A failed member: a failed step, or a child whose completion reports `ok: false`. */
13
+ export function isFailedMember(cp) {
14
+ if (cp.status === 'failed')
15
+ return true;
16
+ if (!cp.name.startsWith('signal:child:') || cp.status !== 'completed')
17
+ return false;
18
+ return cp.output?.ok === false;
19
+ }
20
+ function fanLabel(members) {
21
+ if (members.some((cp) => cp.name.startsWith('signal:child:') || foldedCount(cp) !== undefined)) {
22
+ return 'child runs';
23
+ }
24
+ const first = members[0]?.name ?? '';
25
+ return members.every((cp) => cp.name === first) ? first : 'steps';
26
+ }
27
+ /** Summarize one fan's members (in seq order). */
28
+ export function summarizeFan(group, members) {
29
+ const counts = {};
30
+ const failures = [];
31
+ let size = 0;
32
+ let startedAt;
33
+ let finishedAt;
34
+ let firstSeq = Number.POSITIVE_INFINITY;
35
+ let lastSeq = Number.NEGATIVE_INFINITY;
36
+ for (const cp of members) {
37
+ firstSeq = Math.min(firstSeq, cp.seq);
38
+ lastSeq = Math.max(lastSeq, cp.seq);
39
+ const folded = foldedCount(cp);
40
+ const n = folded ?? 1;
41
+ size += n;
42
+ const status = isFailedMember(cp) ? 'failed' : cp.status;
43
+ counts[status] = (counts[status] ?? 0) + n;
44
+ if (status === 'failed' && failures.length < FAN_SUMMARY_FAILURES)
45
+ failures.push(cp);
46
+ if (cp.status !== 'pending' && cp.status !== 'running') {
47
+ if (!startedAt || cp.startedAt < startedAt)
48
+ startedAt = cp.startedAt;
49
+ if (!finishedAt || cp.finishedAt > finishedAt)
50
+ finishedAt = cp.finishedAt;
51
+ }
52
+ else if (!startedAt || cp.enqueuedAt < startedAt) {
53
+ startedAt = cp.enqueuedAt;
54
+ }
55
+ }
56
+ const parsed = parseFanGroup(group);
57
+ const total = parsed?.size;
58
+ return {
59
+ group,
60
+ label: fanLabel(members),
61
+ firstSeq,
62
+ lastSeq,
63
+ size,
64
+ total,
65
+ notStarted: total === undefined ? undefined : Math.max(0, total - size),
66
+ failFast: parsed?.failFast ?? false,
67
+ counts,
68
+ startedAt,
69
+ finishedAt,
70
+ failures,
71
+ };
72
+ }
73
+ /**
74
+ * Split a run's timeline into the checkpoints a detail view lists one by one and the fans it draws as
75
+ * one node each: every `parallelGroup` with more than `over` members, or declared wider than that,
76
+ * becomes a {@link FanSummary}, and its members leave the timeline. Smaller groups and ungrouped
77
+ * steps stay as they are.
78
+ */
79
+ export function summarizeTimeline(timeline, over) {
80
+ const byGroup = new Map();
81
+ for (const cp of timeline) {
82
+ if (cp.parallelGroup === undefined)
83
+ continue;
84
+ const members = byGroup.get(cp.parallelGroup);
85
+ if (members)
86
+ members.push(cp);
87
+ else
88
+ byGroup.set(cp.parallelGroup, [cp]);
89
+ }
90
+ const summarized = new Set();
91
+ const fans = [];
92
+ for (const [group, members] of byGroup) {
93
+ // A fan sent in small waves has few rows yet; its declared size is what makes it wide.
94
+ if (members.length <= over && (parseFanGroup(group)?.size ?? 0) <= over)
95
+ continue;
96
+ summarized.add(group);
97
+ fans.push(summarizeFan(group, members));
98
+ }
99
+ if (fans.length === 0)
100
+ return { timeline, fans };
101
+ return {
102
+ timeline: timeline.filter((cp) => cp.parallelGroup === undefined || !summarized.has(cp.parallelGroup)),
103
+ fans: fans.sort((a, b) => a.firstSeq - b.firstSeq),
104
+ };
105
+ }
106
+ /** One page of a fan's members out of a run's timeline. */
107
+ export function pageFan(timeline, group, query) {
108
+ const matching = timeline.filter((cp) => cp.parallelGroup === group && (!query.failedOnly || isFailedMember(cp)));
109
+ const offset = query.offset !== undefined && Number.isFinite(query.offset)
110
+ ? Math.max(0, Math.floor(query.offset))
111
+ : 0;
112
+ const limit = query.limit !== undefined && Number.isFinite(query.limit)
113
+ ? Math.min(FAN_PAGE_MAX, Math.max(1, Math.floor(query.limit)))
114
+ : 100;
115
+ return { items: matching.slice(offset, offset + limit), total: matching.length };
116
+ }
117
+ /** Read `runId`'s {@link RunDetail}, summarized per `options`, or null for an unknown run. */
118
+ export async function loadRunDetail(source, runId, options) {
119
+ const run = await source.getRun(runId);
120
+ if (!run)
121
+ return null;
122
+ const over = options?.summarizeFansOver;
123
+ if (over === undefined) {
124
+ const [timeline, children] = await Promise.all([
125
+ source.listCheckpoints(runId),
126
+ source.getRunChildren(runId),
127
+ ]);
128
+ return { run, timeline, children };
129
+ }
130
+ // Summarized: the children come from the timeline already loaded, rather than a second read of
131
+ // every child-edge checkpoint (one per child of a wide fan). A child whose waiter is written but
132
+ // whose placeholder checkpoint is not yet is missing for that one read; the next one lists it.
133
+ const full = await source.listCheckpoints(runId);
134
+ const { timeline, fans } = summarizeTimeline(full, over);
135
+ const ids = [...new Set(childIdsOf(full))];
136
+ return {
137
+ run,
138
+ timeline,
139
+ children: ids.slice(0, SUMMARY_CHILD_LIMIT),
140
+ fans,
141
+ childCount: ids.length,
142
+ };
143
+ }
144
+ /** One page of `runId`'s fan `group`, or null for an unknown run. */
145
+ export async function loadFanMembers(source, runId, group, query) {
146
+ if (!(await source.getRun(runId)))
147
+ return null;
148
+ return pageFan(await source.listCheckpoints(runId), group, query);
149
+ }
150
+ //# sourceMappingURL=run-detail-summary.js.map