@workflow/web-shared 5.0.0-beta.40 → 5.0.0-beta.42

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 (86) hide show
  1. package/dist/components/event-list-view.d.ts +10 -2
  2. package/dist/components/event-list-view.d.ts.map +1 -1
  3. package/dist/components/event-list-view.js +52 -26
  4. package/dist/components/sidebar/attributes-block.d.ts.map +1 -1
  5. package/dist/components/sidebar/attributes-block.js +3 -6
  6. package/dist/components/sidebar/conversation-view.d.ts.map +1 -1
  7. package/dist/components/sidebar/conversation-view.js +19 -36
  8. package/dist/components/sidebar/entity-detail-panel.d.ts +5 -0
  9. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  10. package/dist/components/sidebar/entity-detail-panel.js +2 -2
  11. package/dist/components/sidebar/events-list.d.ts +7 -1
  12. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  13. package/dist/components/sidebar/events-list.js +6 -5
  14. package/dist/components/sidebar/resolve-hook-modal.d.ts.map +1 -1
  15. package/dist/components/sidebar/resolve-hook-modal.js +4 -145
  16. package/dist/components/sidebar/sidebar-data-context.d.ts +6 -0
  17. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  18. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  19. package/dist/components/stream-viewer-skeleton.js +6 -6
  20. package/dist/components/stream-viewer.js +2 -2
  21. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -1
  22. package/dist/components/trace-viewer/components/detail-panel.js +2 -1
  23. package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -1
  24. package/dist/components/trace-viewer/components/timeline.js +13 -22
  25. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -1
  26. package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +58 -18
  27. package/dist/components/trace-viewer/icons.js +5 -5
  28. package/dist/components/trace-viewer/utils.d.ts +6 -10
  29. package/dist/components/trace-viewer/utils.d.ts.map +1 -1
  30. package/dist/components/trace-viewer/utils.js +14 -24
  31. package/dist/components/trace-viewer.d.ts.map +1 -1
  32. package/dist/components/trace-viewer.js +12 -4
  33. package/dist/components/ui/context-card.d.ts.map +1 -1
  34. package/dist/components/ui/context-card.js +9 -21
  35. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  36. package/dist/components/ui/data-inspector.js +8 -35
  37. package/dist/components/ui/duplicate-event-tooltip.d.ts +15 -0
  38. package/dist/components/ui/duplicate-event-tooltip.d.ts.map +1 -0
  39. package/dist/components/ui/duplicate-event-tooltip.js +19 -0
  40. package/dist/components/ui/menu-dropdown.d.ts.map +1 -1
  41. package/dist/components/ui/menu-dropdown.js +3 -19
  42. package/dist/components/ui/skeleton.js +2 -2
  43. package/dist/components/ui/spinner.d.ts.map +1 -1
  44. package/dist/components/ui/spinner.js +5 -11
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -1
  48. package/dist/lib/duplicate-events.d.ts +27 -0
  49. package/dist/lib/duplicate-events.d.ts.map +1 -0
  50. package/dist/lib/duplicate-events.js +166 -0
  51. package/dist/lib/event-materialization.d.ts +15 -2
  52. package/dist/lib/event-materialization.d.ts.map +1 -1
  53. package/dist/lib/event-materialization.js +19 -4
  54. package/dist/lib/trace-builder.d.ts +16 -1
  55. package/dist/lib/trace-builder.d.ts.map +1 -1
  56. package/dist/lib/trace-builder.js +23 -4
  57. package/package.json +4 -4
  58. package/src/components/event-list-view.tsx +70 -32
  59. package/src/components/sidebar/attributes-block.tsx +4 -11
  60. package/src/components/sidebar/conversation-view.tsx +25 -79
  61. package/src/components/sidebar/entity-detail-panel.tsx +6 -0
  62. package/src/components/sidebar/events-list.tsx +21 -3
  63. package/src/components/sidebar/resolve-hook-modal.tsx +23 -186
  64. package/src/components/sidebar/sidebar-data-context.tsx +6 -0
  65. package/src/components/stream-viewer-skeleton.tsx +5 -5
  66. package/src/components/stream-viewer.tsx +1 -1
  67. package/src/components/trace-viewer/components/detail-panel.tsx +1 -0
  68. package/src/components/trace-viewer/components/timeline.tsx +21 -39
  69. package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +63 -35
  70. package/src/components/trace-viewer/icons.tsx +4 -4
  71. package/src/components/trace-viewer/utils.test.ts +5 -7
  72. package/src/components/trace-viewer/utils.ts +17 -31
  73. package/src/components/trace-viewer.tsx +15 -3
  74. package/src/components/ui/context-card.tsx +16 -26
  75. package/src/components/ui/data-inspector.tsx +20 -65
  76. package/src/components/ui/duplicate-event-tooltip.tsx +44 -0
  77. package/src/components/ui/menu-dropdown.tsx +8 -22
  78. package/src/components/ui/skeleton.tsx +2 -2
  79. package/src/components/ui/spinner.tsx +4 -8
  80. package/src/index.ts +4 -0
  81. package/src/lib/duplicate-events.test.ts +339 -0
  82. package/src/lib/duplicate-events.ts +188 -0
  83. package/src/lib/event-materialization.test.ts +117 -0
  84. package/src/lib/event-materialization.ts +23 -3
  85. package/src/lib/trace-builder.test.ts +74 -0
  86. package/src/lib/trace-builder.ts +30 -3
@@ -34,24 +34,18 @@ export function Spinner({ size = 14, color, }) {
34
34
  lineW: size * 0.24,
35
35
  lineH: size * 0.08,
36
36
  };
37
- return (_jsxs("span", { style: {
38
- display: 'inline-flex',
39
- position: 'relative',
37
+ return (_jsxs("span", { className: "relative inline-flex", style: {
40
38
  width: size,
41
39
  height: size,
42
- }, children: [_jsx("style", { dangerouslySetInnerHTML: { __html: KEYFRAMES } }), config.delays.map((delay, i) => (_jsx("span", { style: {
43
- position: 'absolute',
44
- left: '50%',
45
- top: '50%',
40
+ }, children: [_jsx("style", { dangerouslySetInnerHTML: { __html: KEYFRAMES } }), config.delays.map((delay, i) => (_jsx("span", { className: "absolute top-1/2 left-1/2 rounded-[1px] bg-gray-700 [animation-iteration-count:infinite] [animation-name:wf-spinner-fade] [animation-timing-function:linear]", style: {
46
41
  width: config.lineW,
47
42
  height: config.lineH,
48
43
  marginLeft: -config.lineW / 2,
49
44
  marginTop: -config.lineH / 2,
50
- borderRadius: 1,
51
- backgroundColor: color ?? 'var(--ds-gray-700)',
45
+ backgroundColor: color,
52
46
  transform: `rotate(${i * config.angle}deg) translate(${size * 0.36}px)`,
53
- animation: `wf-spinner-fade ${config.duration}ms linear infinite`,
47
+ animationDuration: `${config.duration}ms`,
54
48
  animationDelay: `${delay}ms`,
55
49
  } }, delay)))] }));
56
50
  }
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3VpL3NwaW5uZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFNLFNBQVMsR0FBRyw0REFBNEQsQ0FBQztBQUUvRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLEVBQ3RCLElBQUksR0FBRyxFQUFFLEVBQ1QsS0FBSyxHQUlOO0lBQ0MsTUFBTSxNQUFNLEdBQ1YsSUFBSSxJQUFJLEVBQUU7UUFDUixDQUFDLENBQUM7WUFDRSxLQUFLLEVBQUUsQ0FBQztZQUNSLEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsR0FBRztTQUNYO1FBQ0gsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ1YsQ0FBQyxDQUFDO2dCQUNFLEtBQUssRUFBRSxFQUFFO2dCQUNULEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDakUsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLEdBQUc7YUFDWDtZQUNILENBQUMsQ0FBQztnQkFDRSxLQUFLLEVBQUUsRUFBRTtnQkFDVCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxNQUFNLEVBQUU7b0JBQ04sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHO29CQUM1RCxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNSO2dCQUNELFFBQVEsRUFBRSxJQUFJO2dCQUNkLEtBQUssRUFBRSxJQUFJLEdBQUcsSUFBSTtnQkFDbEIsS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJO2FBQ25CLENBQUM7SUFFVixPQUFPLENBQ0wsZ0JBQ0UsS0FBSyxFQUFFO1lBQ0wsT0FBTyxFQUFFLGFBQWE7WUFDdEIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsS0FBSyxFQUFFLElBQUk7WUFDWCxNQUFNLEVBQUUsSUFBSTtTQUNiLGFBRUQsZ0JBQU8sdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUksRUFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUMvQixlQUVFLEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsR0FBRyxFQUFFLEtBQUs7b0JBQ1YsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQ3BCLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQztvQkFDN0IsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDO29CQUM1QixZQUFZLEVBQUUsQ0FBQztvQkFDZixlQUFlLEVBQUUsS0FBSyxJQUFJLG9CQUFvQjtvQkFDOUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLGtCQUFrQixJQUFJLEdBQUcsSUFBSSxLQUFLO29CQUN2RSxTQUFTLEVBQUUsbUJBQW1CLE1BQU0sQ0FBQyxRQUFRLG9CQUFvQjtvQkFDakUsY0FBYyxFQUFFLEdBQUcsS0FBSyxJQUFJO2lCQUM3QixJQWRJLEtBQUssQ0FlVixDQUNILENBQUMsSUFDRyxDQUNSLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgS0VZRlJBTUVTID0gYEBrZXlmcmFtZXMgd2Ytc3Bpbm5lci1mYWRlezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6LjE1fX1gO1xuXG4vKipcbiAqIFNwaW5uZXIgbWF0Y2hpbmcgR2Vpc3QncyBtdWx0aS1saW5lIGZhZGUgc3Bpbm5lci5cbiAqIEF0IHNpemUg4omkMTI6IDggbGluZXMsIOKJpDE2OiAxMCBsaW5lcywgZWxzZTogMTIgbGluZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTcGlubmVyKHtcbiAgc2l6ZSA9IDE0LFxuICBjb2xvcixcbn06IHtcbiAgc2l6ZT86IG51bWJlcjtcbiAgY29sb3I/OiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IGNvbmZpZyA9XG4gICAgc2l6ZSA8PSAxMlxuICAgICAgPyB7XG4gICAgICAgICAgY291bnQ6IDgsXG4gICAgICAgICAgYW5nbGU6IDQ1LFxuICAgICAgICAgIGRlbGF5czogWy04NzUsIC03NTAsIC02MjUsIC01MDAsIC0zNzUsIC0yNTAsIC0xMjUsIDBdLFxuICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgIGxpbmVXOiAzLFxuICAgICAgICAgIGxpbmVIOiAxLjUsXG4gICAgICAgIH1cbiAgICAgIDogc2l6ZSA8PSAxNlxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGNvdW50OiAxMCxcbiAgICAgICAgICAgIGFuZ2xlOiAzNixcbiAgICAgICAgICAgIGRlbGF5czogWy05MDAsIC04MDAsIC03MDAsIC02MDAsIC01MDAsIC00MDAsIC0zMDAsIC0yMDAsIC0xMDAsIDBdLFxuICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICBsaW5lVzogNCxcbiAgICAgICAgICAgIGxpbmVIOiAxLjUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGNvdW50OiAxMixcbiAgICAgICAgICAgIGFuZ2xlOiAzMCxcbiAgICAgICAgICAgIGRlbGF5czogW1xuICAgICAgICAgICAgICAtMTEwMCwgLTEwMDAsIC05MDAsIC04MDAsIC03MDAsIC02MDAsIC01MDAsIC00MDAsIC0zMDAsIC0yMDAsXG4gICAgICAgICAgICAgIC0xMDAsIDAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZHVyYXRpb246IDEyMDAsXG4gICAgICAgICAgICBsaW5lVzogc2l6ZSAqIDAuMjQsXG4gICAgICAgICAgICBsaW5lSDogc2l6ZSAqIDAuMDgsXG4gICAgICAgICAgfTtcblxuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBzdHlsZT17e1xuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgd2lkdGg6IHNpemUsXG4gICAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPHN0eWxlIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogS0VZRlJBTUVTIH19IC8+XG4gICAgICB7Y29uZmlnLmRlbGF5cy5tYXAoKGRlbGF5LCBpKSA9PiAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAga2V5PXtkZWxheX1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBsZWZ0OiAnNTAlJyxcbiAgICAgICAgICAgIHRvcDogJzUwJScsXG4gICAgICAgICAgICB3aWR0aDogY29uZmlnLmxpbmVXLFxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcubGluZUgsXG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiAtY29uZmlnLmxpbmVXIC8gMixcbiAgICAgICAgICAgIG1hcmdpblRvcDogLWNvbmZpZy5saW5lSCAvIDIsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IDEsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yID8/ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgcm90YXRlKCR7aSAqIGNvbmZpZy5hbmdsZX1kZWcpIHRyYW5zbGF0ZSgke3NpemUgKiAwLjM2fXB4KWAsXG4gICAgICAgICAgICBhbmltYXRpb246IGB3Zi1zcGlubmVyLWZhZGUgJHtjb25maWcuZHVyYXRpb259bXMgbGluZWFyIGluZmluaXRlYCxcbiAgICAgICAgICAgIGFuaW1hdGlvbkRlbGF5OiBgJHtkZWxheX1tc2AsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICkpfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cbiJdfQ==
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3VpL3NwaW5uZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFNLFNBQVMsR0FBRyw0REFBNEQsQ0FBQztBQUUvRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLEVBQ3RCLElBQUksR0FBRyxFQUFFLEVBQ1QsS0FBSyxHQUlOO0lBQ0MsTUFBTSxNQUFNLEdBQ1YsSUFBSSxJQUFJLEVBQUU7UUFDUixDQUFDLENBQUM7WUFDRSxLQUFLLEVBQUUsQ0FBQztZQUNSLEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsR0FBRztTQUNYO1FBQ0gsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ1YsQ0FBQyxDQUFDO2dCQUNFLEtBQUssRUFBRSxFQUFFO2dCQUNULEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDakUsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLEdBQUc7YUFDWDtZQUNILENBQUMsQ0FBQztnQkFDRSxLQUFLLEVBQUUsRUFBRTtnQkFDVCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxNQUFNLEVBQUU7b0JBQ04sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHO29CQUM1RCxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNSO2dCQUNELFFBQVEsRUFBRSxJQUFJO2dCQUNkLEtBQUssRUFBRSxJQUFJLEdBQUcsSUFBSTtnQkFDbEIsS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJO2FBQ25CLENBQUM7SUFFVixPQUFPLENBQ0wsZ0JBQ0UsU0FBUyxFQUFDLHNCQUFzQixFQUNoQyxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUUsSUFBSTtZQUNYLE1BQU0sRUFBRSxJQUFJO1NBQ2IsYUFFRCxnQkFBTyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBSSxFQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQy9CLGVBRUUsU0FBUyxFQUFDLDhKQUE4SixFQUN4SyxLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQ3BCLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQztvQkFDN0IsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDO29CQUM1QixlQUFlLEVBQUUsS0FBSztvQkFDdEIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLGtCQUFrQixJQUFJLEdBQUcsSUFBSSxLQUFLO29CQUN2RSxpQkFBaUIsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUk7b0JBQ3pDLGNBQWMsRUFBRSxHQUFHLEtBQUssSUFBSTtpQkFDN0IsSUFYSSxLQUFLLENBWVYsQ0FDSCxDQUFDLElBQ0csQ0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEtFWUZSQU1FUyA9IGBAa2V5ZnJhbWVzIHdmLXNwaW5uZXItZmFkZXswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5Oi4xNX19YDtcblxuLyoqXG4gKiBTcGlubmVyIG1hdGNoaW5nIEdlaXN0J3MgbXVsdGktbGluZSBmYWRlIHNwaW5uZXIuXG4gKiBBdCBzaXplIOKJpDEyOiA4IGxpbmVzLCDiiaQxNjogMTAgbGluZXMsIGVsc2U6IDEyIGxpbmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3Bpbm5lcih7XG4gIHNpemUgPSAxNCxcbiAgY29sb3IsXG59OiB7XG4gIHNpemU/OiBudW1iZXI7XG4gIGNvbG9yPzogc3RyaW5nO1xufSkge1xuICBjb25zdCBjb25maWcgPVxuICAgIHNpemUgPD0gMTJcbiAgICAgID8ge1xuICAgICAgICAgIGNvdW50OiA4LFxuICAgICAgICAgIGFuZ2xlOiA0NSxcbiAgICAgICAgICBkZWxheXM6IFstODc1LCAtNzUwLCAtNjI1LCAtNTAwLCAtMzc1LCAtMjUwLCAtMTI1LCAwXSxcbiAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcbiAgICAgICAgICBsaW5lVzogMyxcbiAgICAgICAgICBsaW5lSDogMS41LFxuICAgICAgICB9XG4gICAgICA6IHNpemUgPD0gMTZcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBjb3VudDogMTAsXG4gICAgICAgICAgICBhbmdsZTogMzYsXG4gICAgICAgICAgICBkZWxheXM6IFstOTAwLCAtODAwLCAtNzAwLCAtNjAwLCAtNTAwLCAtNDAwLCAtMzAwLCAtMjAwLCAtMTAwLCAwXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgbGluZVc6IDQsXG4gICAgICAgICAgICBsaW5lSDogMS41LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBjb3VudDogMTIsXG4gICAgICAgICAgICBhbmdsZTogMzAsXG4gICAgICAgICAgICBkZWxheXM6IFtcbiAgICAgICAgICAgICAgLTExMDAsIC0xMDAwLCAtOTAwLCAtODAwLCAtNzAwLCAtNjAwLCAtNTAwLCAtNDAwLCAtMzAwLCAtMjAwLFxuICAgICAgICAgICAgICAtMTAwLCAwLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMjAwLFxuICAgICAgICAgICAgbGluZVc6IHNpemUgKiAwLjI0LFxuICAgICAgICAgICAgbGluZUg6IHNpemUgKiAwLjA4LFxuICAgICAgICAgIH07XG5cbiAgcmV0dXJuIChcbiAgICA8c3BhblxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgaW5saW5lLWZsZXhcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgd2lkdGg6IHNpemUsXG4gICAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPHN0eWxlIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogS0VZRlJBTUVTIH19IC8+XG4gICAgICB7Y29uZmlnLmRlbGF5cy5tYXAoKGRlbGF5LCBpKSA9PiAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAga2V5PXtkZWxheX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMS8yIGxlZnQtMS8yIHJvdW5kZWQtWzFweF0gYmctZ3JheS03MDAgW2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGVdIFthbmltYXRpb24tbmFtZTp3Zi1zcGlubmVyLWZhZGVdIFthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmxpbmVhcl1cIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogY29uZmlnLmxpbmVXLFxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcubGluZUgsXG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiAtY29uZmlnLmxpbmVXIC8gMixcbiAgICAgICAgICAgIG1hcmdpblRvcDogLWNvbmZpZy5saW5lSCAvIDIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgcm90YXRlKCR7aSAqIGNvbmZpZy5hbmdsZX1kZWcpIHRyYW5zbGF0ZSgke3NpemUgKiAwLjM2fXB4KWAsXG4gICAgICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogYCR7Y29uZmlnLmR1cmF0aW9ufW1zYCxcbiAgICAgICAgICAgIGFuaW1hdGlvbkRlbGF5OiBgJHtkZWxheX1tc2AsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICkpfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cbiJdfQ==
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export { parseStepName, parseWorkflowName, } from '@workflow/utils/parse-name';
3
3
  export type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
4
4
  export * from './components';
5
5
  export { hookEventsToHookEntity, stepEventsToStepEntity, waitEventsToWaitEntity, } from './components/workflow-traces/trace-span-construction';
6
+ export { DUPLICATE_EVENT_MESSAGE, findDuplicateEventIds, } from './lib/duplicate-events';
6
7
  export type { EventAnalysis } from './lib/event-analysis';
7
8
  export { analyzeEvents, hasPendingHooksFromEvents, hasPendingStepsFromEvents, isTerminalStatus, shouldShowReenqueueButton, } from './lib/event-analysis';
8
9
  export type { MaterializedEntities, MaterializedHook, MaterializedStep, MaterializedWait, } from './lib/event-materialization';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sDAAsD,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  export { parseStepName, parseWorkflowName, } from '@workflow/utils/parse-name';
2
2
  export * from './components';
3
3
  export { hookEventsToHookEntity, stepEventsToStepEntity, waitEventsToWaitEntity, } from './components/workflow-traces/trace-span-construction';
4
+ export { DUPLICATE_EVENT_MESSAGE, findDuplicateEventIds, } from './lib/duplicate-events';
4
5
  export { analyzeEvents, hasPendingHooksFromEvents, hasPendingStepsFromEvents, isTerminalStatus, shouldShowReenqueueButton, } from './lib/event-analysis';
5
6
  export { materializeAll, materializeHooks, materializeSteps, materializeWaits, } from './lib/event-materialization';
6
7
  export { looksLikeWorkflowIdSearchInput, parseExactWorkflowSearchId, } from './lib/exact-event-search-id';
7
8
  export { CLASS_INSTANCE_REF_TYPE, ClassInstanceRef, ENCRYPTED_PLACEHOLDER, extractStreamIds, getWebRevivers, hasEncryptedFields, hydrateResourceIO, hydrateResourceIOAsync, hydrateResourceIOWithKey, isClassInstanceRef, isEncryptedMarker, isStreamId, isStreamRef, STREAM_REF_TYPE, truncateId, } from './lib/hydration';
8
9
  export { ToastProvider, useToast } from './lib/toast';
9
10
  export { extractConversation, formatDuration, formatDurationPrecise, identifyStreamSteps, isDoStreamStep, } from './lib/utils';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSxzREFBc0QsQ0FBQztBQUU5RCxPQUFPLEVBQ0wsYUFBYSxFQUNiLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsZ0JBQWdCLEVBQ2hCLHlCQUF5QixHQUMxQixNQUFNLHNCQUFzQixDQUFDO0FBTzlCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsR0FDakIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBSUwsOEJBQThCLEVBQzlCLDBCQUEwQixHQUMzQixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixXQUFXLEVBQ1gsZUFBZSxFQUNmLFVBQVUsR0FDWCxNQUFNLGlCQUFpQixDQUFDO0FBR3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsY0FBYyxHQUNmLE1BQU0sYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgeyBIZWFsdGhDaGVja1Jlc3VsdCB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuZXhwb3J0IHtcbiAgcGFyc2VTdGVwTmFtZSxcbiAgcGFyc2VXb3JrZmxvd05hbWUsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmV4cG9ydCB0eXBlIHsgRXZlbnQsIEhvb2ssIFN0ZXAsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cyc7XG5leHBvcnQge1xuICBob29rRXZlbnRzVG9Ib29rRW50aXR5LFxuICBzdGVwRXZlbnRzVG9TdGVwRW50aXR5LFxuICB3YWl0RXZlbnRzVG9XYWl0RW50aXR5LFxufSBmcm9tICcuL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLXNwYW4tY29uc3RydWN0aW9uJztcbmV4cG9ydCB0eXBlIHsgRXZlbnRBbmFseXNpcyB9IGZyb20gJy4vbGliL2V2ZW50LWFuYWx5c2lzJztcbmV4cG9ydCB7XG4gIGFuYWx5emVFdmVudHMsXG4gIGhhc1BlbmRpbmdIb29rc0Zyb21FdmVudHMsXG4gIGhhc1BlbmRpbmdTdGVwc0Zyb21FdmVudHMsXG4gIGlzVGVybWluYWxTdGF0dXMsXG4gIHNob3VsZFNob3dSZWVucXVldWVCdXR0b24sXG59IGZyb20gJy4vbGliL2V2ZW50LWFuYWx5c2lzJztcbmV4cG9ydCB0eXBlIHtcbiAgTWF0ZXJpYWxpemVkRW50aXRpZXMsXG4gIE1hdGVyaWFsaXplZEhvb2ssXG4gIE1hdGVyaWFsaXplZFN0ZXAsXG4gIE1hdGVyaWFsaXplZFdhaXQsXG59IGZyb20gJy4vbGliL2V2ZW50LW1hdGVyaWFsaXphdGlvbic7XG5leHBvcnQge1xuICBtYXRlcmlhbGl6ZUFsbCxcbiAgbWF0ZXJpYWxpemVIb29rcyxcbiAgbWF0ZXJpYWxpemVTdGVwcyxcbiAgbWF0ZXJpYWxpemVXYWl0cyxcbn0gZnJvbSAnLi9saWIvZXZlbnQtbWF0ZXJpYWxpemF0aW9uJztcbmV4cG9ydCB7XG4gIHR5cGUgRXhhY3RJZFNlYXJjaFJlc3VsdCxcbiAgdHlwZSBFeGFjdFdvcmtmbG93U2VhcmNoSWQsXG4gIHR5cGUgRXhhY3RXb3JrZmxvd1NlYXJjaElkS2luZCxcbiAgbG9va3NMaWtlV29ya2Zsb3dJZFNlYXJjaElucHV0LFxuICBwYXJzZUV4YWN0V29ya2Zsb3dTZWFyY2hJZCxcbn0gZnJvbSAnLi9saWIvZXhhY3QtZXZlbnQtc2VhcmNoLWlkJztcbmV4cG9ydCB0eXBlIHsgUmV2aXZlcnMsIFN0cmVhbVJlZiB9IGZyb20gJy4vbGliL2h5ZHJhdGlvbic7XG5leHBvcnQge1xuICBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSxcbiAgQ2xhc3NJbnN0YW5jZVJlZixcbiAgRU5DUllQVEVEX1BMQUNFSE9MREVSLFxuICBleHRyYWN0U3RyZWFtSWRzLFxuICBnZXRXZWJSZXZpdmVycyxcbiAgaGFzRW5jcnlwdGVkRmllbGRzLFxuICBoeWRyYXRlUmVzb3VyY2VJTyxcbiAgaHlkcmF0ZVJlc291cmNlSU9Bc3luYyxcbiAgaHlkcmF0ZVJlc291cmNlSU9XaXRoS2V5LFxuICBpc0NsYXNzSW5zdGFuY2VSZWYsXG4gIGlzRW5jcnlwdGVkTWFya2VyLFxuICBpc1N0cmVhbUlkLFxuICBpc1N0cmVhbVJlZixcbiAgU1RSRUFNX1JFRl9UWVBFLFxuICB0cnVuY2F0ZUlkLFxufSBmcm9tICcuL2xpYi9oeWRyYXRpb24nO1xuZXhwb3J0IHR5cGUgeyBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2UgfSBmcm9tICcuL2xpYi9zdHJlYW0tZGlzcGxheSc7XG5leHBvcnQgdHlwZSB7IFRvYXN0QWRhcHRlciB9IGZyb20gJy4vbGliL3RvYXN0JztcbmV4cG9ydCB7IFRvYXN0UHJvdmlkZXIsIHVzZVRvYXN0IH0gZnJvbSAnLi9saWIvdG9hc3QnO1xuZXhwb3J0IHR5cGUgeyBTdHJlYW1TdGVwIH0gZnJvbSAnLi9saWIvdXRpbHMnO1xuZXhwb3J0IHtcbiAgZXh0cmFjdENvbnZlcnNhdGlvbixcbiAgZm9ybWF0RHVyYXRpb24sXG4gIGZvcm1hdER1cmF0aW9uUHJlY2lzZSxcbiAgaWRlbnRpZnlTdHJlYW1TdGVwcyxcbiAgaXNEb1N0cmVhbVN0ZXAsXG59IGZyb20gJy4vbGliL3V0aWxzJztcbiJdfQ==
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSxzREFBc0QsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHFCQUFxQixHQUN0QixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIseUJBQXlCLEdBQzFCLE1BQU0sc0JBQXNCLENBQUM7QUFPOUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFJTCw4QkFBOEIsRUFDOUIsMEJBQTBCLEdBQzNCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YsVUFBVSxHQUNYLE1BQU0saUJBQWlCLENBQUM7QUFHekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixjQUFjLEdBQ2YsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IEhlYWx0aENoZWNrUmVzdWx0IH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG5leHBvcnQge1xuICBwYXJzZVN0ZXBOYW1lLFxuICBwYXJzZVdvcmtmbG93TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuZXhwb3J0IHR5cGUgeyBFdmVudCwgSG9vaywgU3RlcCwgV29ya2Zsb3dSdW4gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzJztcbmV4cG9ydCB7XG4gIGhvb2tFdmVudHNUb0hvb2tFbnRpdHksXG4gIHN0ZXBFdmVudHNUb1N0ZXBFbnRpdHksXG4gIHdhaXRFdmVudHNUb1dhaXRFbnRpdHksXG59IGZyb20gJy4vY29tcG9uZW50cy93b3JrZmxvdy10cmFjZXMvdHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24nO1xuZXhwb3J0IHtcbiAgRFVQTElDQVRFX0VWRU5UX01FU1NBR0UsXG4gIGZpbmREdXBsaWNhdGVFdmVudElkcyxcbn0gZnJvbSAnLi9saWIvZHVwbGljYXRlLWV2ZW50cyc7XG5leHBvcnQgdHlwZSB7IEV2ZW50QW5hbHlzaXMgfSBmcm9tICcuL2xpYi9ldmVudC1hbmFseXNpcyc7XG5leHBvcnQge1xuICBhbmFseXplRXZlbnRzLFxuICBoYXNQZW5kaW5nSG9va3NGcm9tRXZlbnRzLFxuICBoYXNQZW5kaW5nU3RlcHNGcm9tRXZlbnRzLFxuICBpc1Rlcm1pbmFsU3RhdHVzLFxuICBzaG91bGRTaG93UmVlbnF1ZXVlQnV0dG9uLFxufSBmcm9tICcuL2xpYi9ldmVudC1hbmFseXNpcyc7XG5leHBvcnQgdHlwZSB7XG4gIE1hdGVyaWFsaXplZEVudGl0aWVzLFxuICBNYXRlcmlhbGl6ZWRIb29rLFxuICBNYXRlcmlhbGl6ZWRTdGVwLFxuICBNYXRlcmlhbGl6ZWRXYWl0LFxufSBmcm9tICcuL2xpYi9ldmVudC1tYXRlcmlhbGl6YXRpb24nO1xuZXhwb3J0IHtcbiAgbWF0ZXJpYWxpemVBbGwsXG4gIG1hdGVyaWFsaXplSG9va3MsXG4gIG1hdGVyaWFsaXplU3RlcHMsXG4gIG1hdGVyaWFsaXplV2FpdHMsXG59IGZyb20gJy4vbGliL2V2ZW50LW1hdGVyaWFsaXphdGlvbic7XG5leHBvcnQge1xuICB0eXBlIEV4YWN0SWRTZWFyY2hSZXN1bHQsXG4gIHR5cGUgRXhhY3RXb3JrZmxvd1NlYXJjaElkLFxuICB0eXBlIEV4YWN0V29ya2Zsb3dTZWFyY2hJZEtpbmQsXG4gIGxvb2tzTGlrZVdvcmtmbG93SWRTZWFyY2hJbnB1dCxcbiAgcGFyc2VFeGFjdFdvcmtmbG93U2VhcmNoSWQsXG59IGZyb20gJy4vbGliL2V4YWN0LWV2ZW50LXNlYXJjaC1pZCc7XG5leHBvcnQgdHlwZSB7IFJldml2ZXJzLCBTdHJlYW1SZWYgfSBmcm9tICcuL2xpYi9oeWRyYXRpb24nO1xuZXhwb3J0IHtcbiAgQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEUsXG4gIENsYXNzSW5zdGFuY2VSZWYsXG4gIEVOQ1JZUFRFRF9QTEFDRUhPTERFUixcbiAgZXh0cmFjdFN0cmVhbUlkcyxcbiAgZ2V0V2ViUmV2aXZlcnMsXG4gIGhhc0VuY3J5cHRlZEZpZWxkcyxcbiAgaHlkcmF0ZVJlc291cmNlSU8sXG4gIGh5ZHJhdGVSZXNvdXJjZUlPQXN5bmMsXG4gIGh5ZHJhdGVSZXNvdXJjZUlPV2l0aEtleSxcbiAgaXNDbGFzc0luc3RhbmNlUmVmLFxuICBpc0VuY3J5cHRlZE1hcmtlcixcbiAgaXNTdHJlYW1JZCxcbiAgaXNTdHJlYW1SZWYsXG4gIFNUUkVBTV9SRUZfVFlQRSxcbiAgdHJ1bmNhdGVJZCxcbn0gZnJvbSAnLi9saWIvaHlkcmF0aW9uJztcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZFN0cmVhbUNodW5rU291cmNlIH0gZnJvbSAnLi9saWIvc3RyZWFtLWRpc3BsYXknO1xuZXhwb3J0IHR5cGUgeyBUb2FzdEFkYXB0ZXIgfSBmcm9tICcuL2xpYi90b2FzdCc7XG5leHBvcnQgeyBUb2FzdFByb3ZpZGVyLCB1c2VUb2FzdCB9IGZyb20gJy4vbGliL3RvYXN0JztcbmV4cG9ydCB0eXBlIHsgU3RyZWFtU3RlcCB9IGZyb20gJy4vbGliL3V0aWxzJztcbmV4cG9ydCB7XG4gIGV4dHJhY3RDb252ZXJzYXRpb24sXG4gIGZvcm1hdER1cmF0aW9uLFxuICBmb3JtYXREdXJhdGlvblByZWNpc2UsXG4gIGlkZW50aWZ5U3RyZWFtU3RlcHMsXG4gIGlzRG9TdHJlYW1TdGVwLFxufSBmcm9tICcuL2xpYi91dGlscyc7XG4iXX0=
@@ -0,0 +1,27 @@
1
+ import { type Event } from '@workflow/world';
2
+ /**
3
+ * Shown against an event this module reports. Deliberately says what the log
4
+ * shows rather than what the runtime did with it: tolerating these repeats is
5
+ * recent, and on a run recorded before it a repeat no consumer claimed failed
6
+ * the replay instead of being passed over.
7
+ */
8
+ export declare const DUPLICATE_EVENT_MESSAGE = "Written by a concurrent replay after an event of the same kind was already recorded and acted on. The run follows the earlier one.";
9
+ /**
10
+ * The IDs of the events in `events` that repeat a class the log already
11
+ * records for the same entity, after that entity finished.
12
+ *
13
+ * `isCompleteHistory` must be false whenever the caller holds a subset of the
14
+ * run's log: one page of a paginated list, or the result of a search. Which
15
+ * occurrence of a class came first is a property of the whole log, so on a
16
+ * subset the earlier event may simply be missing, and the fold would report
17
+ * the surviving one. Nothing is classified in that case.
18
+ *
19
+ * Two other things make the answer unknowable and yield the same empty result:
20
+ * a log whose order cannot be recovered from the events (see
21
+ * {@link hasKnowableLogOrder}), and everything past the point the run
22
+ * diverged, since the run exited there and read no further.
23
+ */
24
+ export declare function findDuplicateEventIds(events: readonly Event[], { isCompleteHistory }: {
25
+ isCompleteHistory: boolean;
26
+ }): Set<string>;
27
+ //# sourceMappingURL=duplicate-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-events.d.ts","sourceRoot":"","sources":["../../src/lib/duplicate-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EAGX,MAAM,iBAAiB,CAAC;AA2CzB;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,uIACkG,CAAC;AAsGvI;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,EAAE,iBAAiB,EAAE,EAAE;IAAE,iBAAiB,EAAE,OAAO,CAAA;CAAE,GACpD,GAAG,CAAC,MAAM,CAAC,CAYb"}
@@ -0,0 +1,166 @@
1
+ import { entityEventClass, isSlotEventId, } from '@workflow/world';
2
+ /**
3
+ * Identifies events a replay reads past.
4
+ *
5
+ * Concurrent replays of one run write to a shared log, so a replay working
6
+ * from a stale prefix can commit a second `step_created` / `step_started` /
7
+ * `wait_created` for an entity the log already records one of. Every replay
8
+ * reads the first event of that class at the same position, so a later one
9
+ * cannot change what the workflow observes.
10
+ *
11
+ * The classification mirrors `entityEventClass` in `@workflow/world`, which is
12
+ * what the runtime keys its own duplicate detection on. What it cannot mirror
13
+ * is consumer state: the runtime passes over an event only after every
14
+ * registered callback has declined it, and a callback registered for a
15
+ * still-open entity legitimately claims a repeat (each retry of a step writes
16
+ * another `step_started`, and a live step consumer absorbs a second
17
+ * `step_created`). So a repeat counts here only once a terminal event for the
18
+ * same entity sits earlier in the log, which is the point past which no
19
+ * consumer remains.
20
+ */
21
+ /**
22
+ * Classes whose event closes its entity: no consumer is left for it after.
23
+ *
24
+ * The run's own terminal events are absent because `entityEventClass` gives
25
+ * them no class. The runtime exits rather than replaying the body once the log
26
+ * holds one, so nothing ever consumes them and nothing can repeat them.
27
+ */
28
+ const TERMINAL_EVENT_CLASSES = new Set([
29
+ 'step_terminal',
30
+ 'wait_completed',
31
+ 'hook_disposed',
32
+ ]);
33
+ /** Classes with no entity to close first: the log records one per run. */
34
+ const SINGLETON_EVENT_CLASSES = new Set([
35
+ 'run_started',
36
+ ]);
37
+ /** Entity key for events that carry no correlation ID (the run itself). */
38
+ const RUN_ENTITY_KEY = '';
39
+ /**
40
+ * Shown against an event this module reports. Deliberately says what the log
41
+ * shows rather than what the runtime did with it: tolerating these repeats is
42
+ * recent, and on a run recorded before it a repeat no consumer claimed failed
43
+ * the replay instead of being passed over.
44
+ */
45
+ export const DUPLICATE_EVENT_MESSAGE = 'Written by a concurrent replay after an event of the same kind was already recorded and acted on. The run follows the earlier one.';
46
+ /**
47
+ * Candidate log order, by event ID.
48
+ *
49
+ * Event IDs are fixed-width and monotonic within a run under both the ULID and
50
+ * the slot scheme. Length is compared first so a shorter ID never sorts after
51
+ * a longer one on a log that mixes widths.
52
+ *
53
+ * Whether this *is* the log order depends on the ID scheme, which is why
54
+ * {@link hasKnowableLogOrder} gates the fold. See its doc.
55
+ */
56
+ function compareEventId(a, b) {
57
+ if (a.eventId.length !== b.eventId.length) {
58
+ return a.eventId.length - b.eventId.length;
59
+ }
60
+ return a.eventId < b.eventId ? -1 : a.eventId > b.eventId ? 1 : 0;
61
+ }
62
+ function createdAtMs(event) {
63
+ const createdAt = event.createdAt;
64
+ return createdAt instanceof Date
65
+ ? createdAt.getTime()
66
+ : new Date(createdAt).getTime();
67
+ }
68
+ /**
69
+ * Whether the order the run consumed its log in can be recovered from the
70
+ * events alone.
71
+ *
72
+ * Which occurrence of a class came first is the whole question here, so the
73
+ * fold needs the log's order, not an order. The backends do not agree on how
74
+ * to recover it for every ID scheme:
75
+ *
76
+ * - A **slot-numbered** run carries its position in the ID. The slot is drawn
77
+ * at the publish, which is the linearization point, so slot order is log
78
+ * order everywhere and the ID alone settles it.
79
+ * - A **ULID-numbered** run does not. One backend returns such a log in
80
+ * `(createdAt, eventId)` order while another returns it keyed on the ID, and
81
+ * `createdAt` is stamped when the write request arrives rather than when it
82
+ * commits. Concurrent writers can therefore produce opposite timestamp and
83
+ * ID orders, and the run consumed whichever its own backend served.
84
+ *
85
+ * So a ULID log is only knowable where the two orders agree. Where they
86
+ * contradict, the fold could name the surviving event and pass over the one
87
+ * the run acted on, which is worse than saying nothing.
88
+ */
89
+ function hasKnowableLogOrder(orderedById) {
90
+ if (orderedById.every((event) => isSlotEventId(event.eventId)))
91
+ return true;
92
+ for (let index = 1; index < orderedById.length; index++) {
93
+ const previous = createdAtMs(orderedById[index - 1]);
94
+ const current = createdAtMs(orderedById[index]);
95
+ // A missing or unparseable timestamp leaves nothing to corroborate the ID
96
+ // order with, which is the same position as a contradiction.
97
+ if (Number.isNaN(previous) || Number.isNaN(current))
98
+ return false;
99
+ if (current < previous)
100
+ return false;
101
+ }
102
+ return true;
103
+ }
104
+ /** The fold itself, over a log whose order is known. */
105
+ function foldDuplicates(ordered) {
106
+ const duplicates = new Set();
107
+ const seenClasses = new Set();
108
+ const closedEntities = new Set();
109
+ for (const event of ordered) {
110
+ const eventClass = entityEventClass(event.eventType);
111
+ if (eventClass === undefined)
112
+ continue;
113
+ const entity = event.correlationId ?? RUN_ENTITY_KEY;
114
+ const classKey = `${eventClass}:${entity}`;
115
+ const repeatsClass = seenClasses.has(classKey);
116
+ const entityWasClosed = closedEntities.has(entity);
117
+ if (TERMINAL_EVENT_CLASSES.has(eventClass)) {
118
+ closedEntities.add(entity);
119
+ }
120
+ if (!repeatsClass) {
121
+ // First of its class, but the entity already finished: no consumer is
122
+ // left to take it and it repeats nothing, so the runtime reports
123
+ // divergence here and exits. Everything past this point went unread, so
124
+ // the fold stops with it rather than recording the class and presenting
125
+ // a later event of it as a repeat the run passed over.
126
+ if (entityWasClosed)
127
+ break;
128
+ seenClasses.add(classKey);
129
+ continue;
130
+ }
131
+ // The entity is still open, so a consumer is registered for it and takes
132
+ // this event: another attempt, not a repeat read past.
133
+ if (entityWasClosed || SINGLETON_EVENT_CLASSES.has(eventClass)) {
134
+ duplicates.add(event.eventId);
135
+ }
136
+ }
137
+ return duplicates;
138
+ }
139
+ /**
140
+ * The IDs of the events in `events` that repeat a class the log already
141
+ * records for the same entity, after that entity finished.
142
+ *
143
+ * `isCompleteHistory` must be false whenever the caller holds a subset of the
144
+ * run's log: one page of a paginated list, or the result of a search. Which
145
+ * occurrence of a class came first is a property of the whole log, so on a
146
+ * subset the earlier event may simply be missing, and the fold would report
147
+ * the surviving one. Nothing is classified in that case.
148
+ *
149
+ * Two other things make the answer unknowable and yield the same empty result:
150
+ * a log whose order cannot be recovered from the events (see
151
+ * {@link hasKnowableLogOrder}), and everything past the point the run
152
+ * diverged, since the run exited there and read no further.
153
+ */
154
+ export function findDuplicateEventIds(events, { isCompleteHistory }) {
155
+ if (!isCompleteHistory || events.length < 2)
156
+ return new Set();
157
+ // Dropped before the sort, not during the fold: an event with no ID has no
158
+ // log position to order on, and the caller could not match it either.
159
+ const ordered = events
160
+ .filter((event) => Boolean(event.eventId))
161
+ .sort(compareEventId);
162
+ if (!hasKnowableLogOrder(ordered))
163
+ return new Set();
164
+ return foldDuplicates(ordered);
165
+ }
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZHVwbGljYXRlLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLHNCQUFzQixHQUFrQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGVBQWU7Q0FDaEIsQ0FBQyxDQUFDO0FBRUgsMEVBQTBFO0FBQzFFLE1BQU0sdUJBQXVCLEdBQWtDLElBQUksR0FBRyxDQUFDO0lBQ3JFLGFBQWE7Q0FDZCxDQUFDLENBQUM7QUFFSCwyRUFBMkU7QUFDM0UsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBRTFCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQ2xDLG9JQUFvSSxDQUFDO0FBRXZJOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsY0FBYyxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQ3hDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELFNBQVMsV0FBVyxD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TUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUF3QixFQUN4QixFQUFFLGlCQUFpQixFQUFrQztJQUVyRCxJQUFJLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTlELDJFQUEyRTtJQUMzRSxzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTTtTQUNuQixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7SUFFcEQsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgRW50aXR5RXZlbnRDbGFzcyxcbiAgdHlwZSBFdmVudCxcbiAgZW50aXR5RXZlbnRDbGFzcyxcbiAgaXNTbG90RXZlbnRJZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBJZGVudGlmaWVzIGV2ZW50cyBhIHJlcGxheSByZWFkcyBwYXN0LlxuICpcbiAqIENvbmN1cnJlbnQgcmVwbGF5cyBvZiBvbmUgcnVuIHdyaXRlIHRvIGEgc2hhcmVkIGxvZywgc28gYSByZXBsYXkgd29ya2luZ1xuICogZnJvbSBhIHN0YWxlIHByZWZpeCBjYW4gY29tbWl0IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIC8gYHN0ZXBfc3RhcnRlZGAgL1xuICogYHdhaXRfY3JlYXRlZGAgZm9yIGFuIGVudGl0eSB0aGUgbG9nIGFscmVhZHkgcmVjb3JkcyBvbmUgb2YuIEV2ZXJ5IHJlcGxheVxuICogcmVhZHMgdGhlIGZpcnN0IGV2ZW50IG9mIHRoYXQgY2xhc3MgYXQgdGhlIHNhbWUgcG9zaXRpb24sIHNvIGEgbGF0ZXIgb25lXG4gKiBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVzLlxuICpcbiAqIFRoZSBjbGFzc2lmaWNhdGlvbiBtaXJyb3JzIGBlbnRpdHlFdmVudENsYXNzYCBpbiBgQHdvcmtmbG93L3dvcmxkYCwgd2hpY2ggaXNcbiAqIHdoYXQgdGhlIHJ1bnRpbWUga2V5cyBpdHMgb3duIGR1cGxpY2F0ZSBkZXRlY3Rpb24gb24uIFdoYXQgaXQgY2Fubm90IG1pcnJvclxuICogaXMgY29uc3VtZXIgc3RhdGU6IHRoZSBydW50aW1lIHBhc3NlcyBvdmVyIGFuIGV2ZW50IG9ubHkgYWZ0ZXIgZXZlcnlcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIGl0LCBhbmQgYSBjYWxsYmFjayByZWdpc3RlcmVkIGZvciBhXG4gKiBzdGlsbC1vcGVuIGVudGl0eSBsZWdpdGltYXRlbHkgY2xhaW1zIGEgcmVwZWF0IChlYWNoIHJldHJ5IG9mIGEgc3RlcCB3cml0ZXNcbiAqIGFub3RoZXIgYHN0ZXBfc3RhcnRlZGAsIGFuZCBhIGxpdmUgc3RlcCBjb25zdW1lciBhYnNvcmJzIGEgc2Vjb25kXG4gKiBgc3RlcF9jcmVhdGVkYCkuIFNvIGEgcmVwZWF0IGNvdW50cyBoZXJlIG9ubHkgb25jZSBhIHRlcm1pbmFsIGV2ZW50IGZvciB0aGVcbiAqIHNhbWUgZW50aXR5IHNpdHMgZWFybGllciBpbiB0aGUgbG9nLCB3aGljaCBpcyB0aGUgcG9pbnQgcGFzdCB3aGljaCBub1xuICogY29uc3VtZXIgcmVtYWlucy5cbiAqL1xuXG4vKipcbiAqIENsYXNzZXMgd2hvc2UgZXZlbnQgY2xvc2VzIGl0cyBlbnRpdHk6IG5vIGNvbnN1bWVyIGlzIGxlZnQgZm9yIGl0IGFmdGVyLlxuICpcbiAqIFRoZSBydW4ncyBvd24gdGVybWluYWwgZXZlbnRzIGFyZSBhYnNlbnQgYmVjYXVzZSBgZW50aXR5RXZlbnRDbGFzc2AgZ2l2ZXNcbiAqIHRoZW0gbm8gY2xhc3MuIFRoZSBydW50aW1lIGV4aXRzIHJhdGhlciB0aGFuIHJlcGxheWluZyB0aGUgYm9keSBvbmNlIHRoZSBsb2dcbiAqIGhvbGRzIG9uZSwgc28gbm90aGluZyBldmVyIGNvbnN1bWVzIHRoZW0gYW5kIG5vdGhpbmcgY2FuIHJlcGVhdCB0aGVtLlxuICovXG5jb25zdCBURVJNSU5BTF9FVkVOVF9DTEFTU0VTOiBSZWFkb25seVNldDxFbnRpdHlFdmVudENsYXNzPiA9IG5ldyBTZXQoW1xuICAnc3RlcF90ZXJtaW5hbCcsXG4gICd3YWl0X2NvbXBsZXRlZCcsXG4gICdob29rX2Rpc3Bvc2VkJyxcbl0pO1xuXG4vKiogQ2xhc3NlcyB3aXRoIG5vIGVudGl0eSB0byBjbG9zZSBmaXJzdDogdGhlIGxvZyByZWNvcmRzIG9uZSBwZXIgcnVuLiAqL1xuY29uc3QgU0lOR0xFVE9OX0VWRU5UX0NMQVNTRVM6IFJlYWRvbmx5U2V0PEVudGl0eUV2ZW50Q2xhc3M+ID0gbmV3IFNldChbXG4gICdydW5fc3RhcnRlZCcsXG5dKTtcblxuLyoqIEVudGl0eSBrZXkgZm9yIGV2ZW50cyB0aGF0IGNhcnJ5IG5vIGNvcnJlbGF0aW9uIElEICh0aGUgcnVuIGl0c2VsZikuICovXG5jb25zdCBSVU5fRU5USVRZX0tFWSA9ICcnO1xuXG4vKipcbiAqIFNob3duIGFnYWluc3QgYW4gZXZlbnQgdGhpcyBtb2R1bGUgcmVwb3J0cy4gRGVsaWJlcmF0ZWx5IHNheXMgd2hhdCB0aGUgbG9nXG4gKiBzaG93cyByYXRoZXIgdGhhbiB3aGF0IHRoZSBydW50aW1lIGRpZCB3aXRoIGl0OiB0b2xlcmF0aW5nIHRoZXNlIHJlcGVhdHMgaXNcbiAqIHJlY2VudCwgYW5kIG9uIGEgcnVuIHJlY29yZGVkIGJlZm9yZSBpdCBhIHJlcGVhdCBubyBjb25zdW1lciBjbGFpbWVkIGZhaWxlZFxuICogdGhlIHJlcGxheSBpbnN0ZWFkIG9mIGJlaW5nIHBhc3NlZCBvdmVyLlxuICovXG5leHBvcnQgY29uc3QgRFVQTElDQVRFX0VWRU5UX01FU1NBR0UgPVxuICAnV3JpdHRlbiBieSBhIGNvbmN1cnJlbnQgcmVwbGF5IGFmdGVyIGFuIGV2ZW50IG9mIHRoZSBzYW1lIGtpbmQgd2FzIGFscmVhZHkgcmVjb3JkZWQgYW5kIGFjdGVkIG9uLiBUaGUgcnVuIGZvbGxvd3MgdGhlIGVhcmxpZXIgb25lLic7XG5cbi8qKlxuICogQ2FuZGlkYXRlIGxvZyBvcmRlciwgYnkgZXZlbnQgSUQuXG4gKlxuICogRXZlbnQgSURzIGFyZSBmaXhlZC13aWR0aCBhbmQgbW9ub3RvbmljIHdpdGhpbiBhIHJ1biB1bmRlciBib3RoIHRoZSBVTElEIGFuZFxuICogdGhlIHNsb3Qgc2NoZW1lLiBMZW5ndGggaXMgY29tcGFyZWQgZmlyc3Qgc28gYSBzaG9ydGVyIElEIG5ldmVyIHNvcnRzIGFmdGVyXG4gKiBhIGxvbmdlciBvbmUgb24gYSBsb2cgdGhhdCBtaXhlcyB3aWR0aHMuXG4gKlxuICogV2hldGhlciB0aGlzICppcyogdGhlIGxvZyBvcmRlciBkZXBlbmRzIG9uIHRoZSBJRCBzY2hlbWUsIHdoaWNoIGlzIHdoeVxuICoge0BsaW5rIGhhc0tub3dhYmxlTG9nT3JkZXJ9IGdhdGVzIHRoZSBmb2xkLiBTZWUgaXRzIGRvYy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUV2ZW50SWQoYTogRXZlbnQsIGI6IEV2ZW50KTogbnVtYmVyIHtcbiAgaWYgKGEuZXZlbnRJZC5sZW5ndGggIT09IGIuZXZlbnRJZC5sZW5ndGgpIHtcbiAgICByZXR1cm4gYS5ldmVudElkLmxlbmd0aCAtIGIuZXZlbnRJZC5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGEuZXZlbnRJZCA8IGIuZXZlbnRJZCA/IC0xIDogYS5ldmVudElkID4gYi5ldmVudElkID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZWRBdE1zKGV2ZW50OiBFdmVudCk6IG51bWJlciB7XG4gIGNvbnN0IGNyZWF0ZWRBdCA9IGV2ZW50LmNyZWF0ZWRBdDtcbiAgcmV0dXJuIGNyZWF0ZWRBdCBpbnN0YW5jZW9mIERhdGVcbiAgICA/IGNyZWF0ZWRBdC5nZXRUaW1lKClcbiAgICA6IG5ldyBEYXRlKGNyZWF0ZWRBdCBhcyB1bmtub3duIGFzIHN0cmluZykuZ2V0VGltZSgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG9yZGVyIHRoZSBydW4gY29uc3VtZWQgaXRzIGxvZyBpbiBjYW4gYmUgcmVjb3ZlcmVkIGZyb20gdGhlXG4gKiBldmVudHMgYWxvbmUuXG4gKlxuICogV2hpY2ggb2NjdXJyZW5jZSBvZiBhIGNsYXNzIGNhbWUgZmlyc3QgaXMgdGhlIHdob2xlIHF1ZXN0aW9uIGhlcmUsIHNvIHRoZVxuICogZm9sZCBuZWVkcyB0aGUgbG9nJ3Mgb3JkZXIsIG5vdCBhbiBvcmRlci4gVGhlIGJhY2tlbmRzIGRvIG5vdCBhZ3JlZSBvbiBob3dcbiAqIHRvIHJlY292ZXIgaXQgZm9yIGV2ZXJ5IElEIHNjaGVtZTpcbiAqXG4gKiAtIEEgKipzbG90LW51bWJlcmVkKiogcnVuIGNhcnJpZXMgaXRzIHBvc2l0aW9uIGluIHRoZSBJRC4gVGhlIHNsb3QgaXMgZHJhd25cbiAqICAgYXQgdGhlIHB1Ymxpc2gsIHdoaWNoIGlzIHRoZSBsaW5lYXJpemF0aW9uIHBvaW50LCBzbyBzbG90IG9yZGVyIGlzIGxvZ1xuICogICBvcmRlciBldmVyeXdoZXJlIGFuZCB0aGUgSUQgYWxvbmUgc2V0dGxlcyBpdC5cbiAqIC0gQSAqKlVMSUQtbnVtYmVyZWQqKiBydW4gZG9lcyBub3QuIE9uZSBiYWNrZW5kIHJldHVybnMgc3VjaCBhIGxvZyBpblxuICogICBgKGNyZWF0ZWRBdCwgZXZlbnRJZClgIG9yZGVyIHdoaWxlIGFub3RoZXIgcmV0dXJucyBpdCBrZXllZCBvbiB0aGUgSUQsIGFuZFxuICogICBgY3JlYXRlZEF0YCBpcyBzdGFtcGVkIHdoZW4gdGhlIHdyaXRlIHJlcXVlc3QgYXJyaXZlcyByYXRoZXIgdGhhbiB3aGVuIGl0XG4gKiAgIGNvbW1pdHMuIENvbmN1cnJlbnQgd3JpdGVycyBjYW4gdGhlcmVmb3JlIHByb2R1Y2Ugb3Bwb3NpdGUgdGltZXN0YW1wIGFuZFxuICogICBJRCBvcmRlcnMsIGFuZCB0aGUgcnVuIGNvbnN1bWVkIHdoaWNoZXZlciBpdHMgb3duIGJhY2tlbmQgc2VydmVkLlxuICpcbiAqIFNvIGEgVUxJRCBsb2cgaXMgb25seSBrbm93YWJsZSB3aGVyZSB0aGUgdHdvIG9yZGVycyBhZ3JlZS4gV2hlcmUgdGhleVxuICogY29udHJhZGljdCwgdGhlIGZvbGQgY291bGQgbmFtZSB0aGUgc3Vydml2aW5nIGV2ZW50IGFuZCBwYXNzIG92ZXIgdGhlIG9uZVxuICogdGhlIHJ1biBhY3RlZCBvbiwgd2hpY2ggaXMgd29yc2UgdGhhbiBzYXlpbmcgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gaGFzS25vd2FibGVMb2dPcmRlcihvcmRlcmVkQnlJZDogcmVhZG9ubHkgRXZlbnRbXSk6IGJvb2xlYW4ge1xuICBpZiAob3JkZXJlZEJ5SWQuZXZlcnkoKGV2ZW50KSA9PiBpc1Nsb3RFdmVudElkKGV2ZW50LmV2ZW50SWQpKSkgcmV0dXJuIHRydWU7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IG9yZGVyZWRCeUlkLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3JlYXRlZEF0TXMob3JkZXJlZEJ5SWRbaW5kZXggLSAxXSk7XG4gICAgY29uc3QgY3VycmVudCA9IGNyZWF0ZWRBdE1zKG9yZGVyZWRCeUlkW2luZGV4XSk7XG4gICAgLy8gQSBtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRpbWVzdGFtcCBsZWF2ZXMgbm90aGluZyB0byBjb3Jyb2JvcmF0ZSB0aGUgSURcbiAgICAvLyBvcmRlciB3aXRoLCB3aGljaCBpcyB0aGUgc2FtZSBwb3NpdGlvbiBhcyBhIGNvbnRyYWRpY3Rpb24uXG4gICAgaWYgKE51bWJlci5pc05hTihwcmV2aW91cykgfHwgTnVtYmVyLmlzTmFOKGN1cnJlbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnQgPCBwcmV2aW91cykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBUaGUgZm9sZCBpdHNlbGYsIG92ZXIgYSBsb2cgd2hvc2Ugb3JkZXIgaXMga25vd24uICovXG5mdW5jdGlvbiBmb2xkRHVwbGljYXRlcyhvcmRlcmVkOiByZWFkb25seSBFdmVudFtdKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBkdXBsaWNhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHNlZW5DbGFzc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNsb3NlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBldmVudCBvZiBvcmRlcmVkKSB7XG4gICAgY29uc3QgZXZlbnRDbGFzcyA9IGVudGl0eUV2ZW50Q2xhc3MoZXZlbnQuZXZlbnRUeXBlKTtcbiAgICBpZiAoZXZlbnRDbGFzcyA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVudGl0eSA9IGV2ZW50LmNvcnJlbGF0aW9uSWQgPz8gUlVOX0VOVElUWV9LRVk7XG4gICAgY29uc3QgY2xhc3NLZXkgPSBgJHtldmVudENsYXNzfToke2VudGl0eX1gO1xuICAgIGNvbnN0IHJlcGVhdHNDbGFzcyA9IHNlZW5DbGFzc2VzLmhhcyhjbGFzc0tleSk7XG4gICAgY29uc3QgZW50aXR5V2FzQ2xvc2VkID0gY2xvc2VkRW50aXRpZXMuaGFzKGVudGl0eSk7XG5cbiAgICBpZiAoVEVSTUlOQUxfRVZFTlRfQ0xBU1NFUy5oYXMoZXZlbnRDbGFzcykpIHtcbiAgICAgIGNsb3NlZEVudGl0aWVzLmFkZChlbnRpdHkpO1xuICAgIH1cblxuICAgIGlmICghcmVwZWF0c0NsYXNzKSB7XG4gICAgICAvLyBGaXJzdCBvZiBpdHMgY2xhc3MsIGJ1dCB0aGUgZW50aXR5IGFscmVhZHkgZmluaXNoZWQ6IG5vIGNvbnN1bWVyIGlzXG4gICAgICAvLyBsZWZ0IHRvIHRha2UgaXQgYW5kIGl0IHJlcGVhdHMgbm90aGluZywgc28gdGhlIHJ1bnRpbWUgcmVwb3J0c1xuICAgICAgLy8gZGl2ZXJnZW5jZSBoZXJlIGFuZCBleGl0cy4gRXZlcnl0aGluZyBwYXN0IHRoaXMgcG9pbnQgd2VudCB1bnJlYWQsIHNvXG4gICAgICAvLyB0aGUgZm9sZCBzdG9wcyB3aXRoIGl0IHJhdGhlciB0aGFuIHJlY29yZGluZyB0aGUgY2xhc3MgYW5kIHByZXNlbnRpbmdcbiAgICAgIC8vIGEgbGF0ZXIgZXZlbnQgb2YgaXQgYXMgYSByZXBlYXQgdGhlIHJ1biBwYXNzZWQgb3Zlci5cbiAgICAgIGlmIChlbnRpdHlXYXNDbG9zZWQpIGJyZWFrO1xuICAgICAgc2VlbkNsYXNzZXMuYWRkKGNsYXNzS2V5KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIFRoZSBlbnRpdHkgaXMgc3RpbGwgb3Blbiwgc28gYSBjb25zdW1lciBpcyByZWdpc3RlcmVkIGZvciBpdCBhbmQgdGFrZXNcbiAgICAvLyB0aGlzIGV2ZW50OiBhbm90aGVyIGF0dGVtcHQsIG5vdCBhIHJlcGVhdCByZWFkIHBhc3QuXG4gICAgaWYgKGVudGl0eVdhc0Nsb3NlZCB8fCBTSU5HTEVUT05fRVZFTlRfQ0xBU1NFUy5oYXMoZXZlbnRDbGFzcykpIHtcbiAgICAgIGR1cGxpY2F0ZXMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkdXBsaWNhdGVzO1xufVxuXG4vKipcbiAqIFRoZSBJRHMgb2YgdGhlIGV2ZW50cyBpbiBgZXZlbnRzYCB0aGF0IHJlcGVhdCBhIGNsYXNzIHRoZSBsb2cgYWxyZWFkeVxuICogcmVjb3JkcyBmb3IgdGhlIHNhbWUgZW50aXR5LCBhZnRlciB0aGF0IGVudGl0eSBmaW5pc2hlZC5cbiAqXG4gKiBgaXNDb21wbGV0ZUhpc3RvcnlgIG11c3QgYmUgZmFsc2Ugd2hlbmV2ZXIgdGhlIGNhbGxlciBob2xkcyBhIHN1YnNldCBvZiB0aGVcbiAqIHJ1bidzIGxvZzogb25lIHBhZ2Ugb2YgYSBwYWdpbmF0ZWQgbGlzdCwgb3IgdGhlIHJlc3VsdCBvZiBhIHNlYXJjaC4gV2hpY2hcbiAqIG9jY3VycmVuY2Ugb2YgYSBjbGFzcyBjYW1lIGZpcnN0IGlzIGEgcHJvcGVydHkgb2YgdGhlIHdob2xlIGxvZywgc28gb24gYVxuICogc3Vic2V0IHRoZSBlYXJsaWVyIGV2ZW50IG1heSBzaW1wbHkgYmUgbWlzc2luZywgYW5kIHRoZSBmb2xkIHdvdWxkIHJlcG9ydFxuICogdGhlIHN1cnZpdmluZyBvbmUuIE5vdGhpbmcgaXMgY2xhc3NpZmllZCBpbiB0aGF0IGNhc2UuXG4gKlxuICogVHdvIG90aGVyIHRoaW5ncyBtYWtlIHRoZSBhbnN3ZXIgdW5rbm93YWJsZSBhbmQgeWllbGQgdGhlIHNhbWUgZW1wdHkgcmVzdWx0OlxuICogYSBsb2cgd2hvc2Ugb3JkZXIgY2Fubm90IGJlIHJlY292ZXJlZCBmcm9tIHRoZSBldmVudHMgKHNlZVxuICoge0BsaW5rIGhhc0tub3dhYmxlTG9nT3JkZXJ9KSwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgcG9pbnQgdGhlIHJ1blxuICogZGl2ZXJnZWQsIHNpbmNlIHRoZSBydW4gZXhpdGVkIHRoZXJlIGFuZCByZWFkIG5vIGZ1cnRoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRHVwbGljYXRlRXZlbnRJZHMoXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSxcbiAgeyBpc0NvbXBsZXRlSGlzdG9yeSB9OiB7IGlzQ29tcGxldGVIaXN0b3J5OiBib29sZWFuIH1cbik6IFNldDxzdHJpbmc+IHtcbiAgaWYgKCFpc0NvbXBsZXRlSGlzdG9yeSB8fCBldmVudHMubGVuZ3RoIDwgMikgcmV0dXJuIG5ldyBTZXQoKTtcblxuICAvLyBEcm9wcGVkIGJlZm9yZSB0aGUgc29ydCwgbm90IGR1cmluZyB0aGUgZm9sZDogYW4gZXZlbnQgd2l0aCBubyBJRCBoYXMgbm9cbiAgLy8gbG9nIHBvc2l0aW9uIHRvIG9yZGVyIG9uLCBhbmQgdGhlIGNhbGxlciBjb3VsZCBub3QgbWF0Y2ggaXQgZWl0aGVyLlxuICBjb25zdCBvcmRlcmVkID0gZXZlbnRzXG4gICAgLmZpbHRlcigoZXZlbnQpID0+IEJvb2xlYW4oZXZlbnQuZXZlbnRJZCkpXG4gICAgLnNvcnQoY29tcGFyZUV2ZW50SWQpO1xuXG4gIGlmICghaGFzS25vd2FibGVMb2dPcmRlcihvcmRlcmVkKSkgcmV0dXJuIG5ldyBTZXQoKTtcblxuICByZXR1cm4gZm9sZER1cGxpY2F0ZXMob3JkZXJlZCk7XG59XG4iXX0=
@@ -54,8 +54,19 @@ export interface MaterializedEntities {
54
54
  *
55
55
  * Handles partial event lists gracefully: a step may only have a
56
56
  * step_created event with no completion yet.
57
+ *
58
+ * The derived status and timestamps come from the events the run acted on. A
59
+ * repeat of a class the log already records is read past by every replay, so
60
+ * a second terminal event written by a concurrent replay does not move a step
61
+ * off the outcome the first one recorded. Every event stays on the entity's
62
+ * `events` list.
63
+ *
64
+ * That reduction needs the whole log to be sound, so it only runs when
65
+ * `isCompleteHistory` says `events` is it. See {@link findDuplicateEventIds}.
57
66
  */
58
- export declare function materializeSteps(events: Event[]): MaterializedStep[];
67
+ export declare function materializeSteps(events: Event[], { isCompleteHistory }?: {
68
+ isCompleteHistory?: boolean;
69
+ }): MaterializedStep[];
59
70
  /**
60
71
  * Group hook_* events by correlationId and build Hook-like entities.
61
72
  */
@@ -68,5 +79,7 @@ export declare function materializeWaits(events: Event[]): MaterializedWait[];
68
79
  * Convenience function that materializes all entity types from a flat
69
80
  * event list.
70
81
  */
71
- export declare function materializeAll(events: Event[]): MaterializedEntities;
82
+ export declare function materializeAll(events: Event[], options?: {
83
+ isCompleteHistory?: boolean;
84
+ }): MaterializedEntities;
72
85
  //# sourceMappingURL=event-materialization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-materialization.d.ts","sourceRoot":"","sources":["../../src/lib/event-materialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAqCD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CA2DpE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CA8BpE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CAyBpE;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAMpE"}
1
+ {"version":3,"file":"event-materialization.d.ts","sourceRoot":"","sources":["../../src/lib/event-materialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAOzB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAqCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,KAAK,EAAE,EACf,EAAE,iBAAyB,EAAE,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,gBAAgB,EAAE,CA+DpB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CA8BpE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CAyBpE;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,oBAAoB,CAMtB"}
@@ -10,6 +10,7 @@
10
10
  * of making separate API calls for each entity type.
11
11
  */
12
12
  import { isHookLifecycleEventType, isStepEventType, isWaitEventType, } from '@workflow/world';
13
+ import { findDuplicateEventIds } from './duplicate-events';
13
14
  // ---------------------------------------------------------------------------
14
15
  // Helper: group events by correlationId
15
16
  // ---------------------------------------------------------------------------
@@ -46,9 +47,21 @@ function getEventTimestamp(event) {
46
47
  *
47
48
  * Handles partial event lists gracefully: a step may only have a
48
49
  * step_created event with no completion yet.
50
+ *
51
+ * The derived status and timestamps come from the events the run acted on. A
52
+ * repeat of a class the log already records is read past by every replay, so
53
+ * a second terminal event written by a concurrent replay does not move a step
54
+ * off the outcome the first one recorded. Every event stays on the entity's
55
+ * `events` list.
56
+ *
57
+ * That reduction needs the whole log to be sound, so it only runs when
58
+ * `isCompleteHistory` says `events` is it. See {@link findDuplicateEventIds}.
49
59
  */
50
- export function materializeSteps(events) {
60
+ export function materializeSteps(events, { isCompleteHistory = false } = {}) {
51
61
  const groups = groupByCorrelationId(events, isStepEventType);
62
+ const duplicateEventIds = findDuplicateEventIds(events, {
63
+ isCompleteHistory,
64
+ });
52
65
  const steps = [];
53
66
  for (const [correlationId, stepEvents] of groups) {
54
67
  const created = stepEvents.find((e) => e.eventType === 'step_created');
@@ -60,6 +73,8 @@ export function materializeSteps(events) {
60
73
  let completedAt;
61
74
  let updatedAt = getEventTimestamp(created) ?? created.createdAt;
62
75
  for (const e of stepEvents) {
76
+ if (duplicateEventIds.has(e.eventId))
77
+ continue;
63
78
  switch (e.eventType) {
64
79
  case 'step_started':
65
80
  status = 'running';
@@ -169,11 +184,11 @@ export function materializeWaits(events) {
169
184
  * Convenience function that materializes all entity types from a flat
170
185
  * event list.
171
186
  */
172
- export function materializeAll(events) {
187
+ export function materializeAll(events, options = {}) {
173
188
  return {
174
- steps: materializeSteps(events),
189
+ steps: materializeSteps(events, options),
175
190
  hooks: materializeHooks(events),
176
191
  waits: materializeWaits(events),
177
192
  };
178
193
  }
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWF0ZXJpYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9ldmVudC1tYXRlcmlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGVBQWUsR0FFaEIsTUFBTSxpQkFBaUIsQ0FBQztBQWlEekIsOEVBQThFO0FBQzlFLHdDQUF3QztBQUN4Qyw4RUFBOEU7QUFFOUUsU0FBUyxvQkFBb0IsQ0FDM0IsTUFBZSxFQUNmLGdCQUFnRDtJQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxTQUFTO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsU0FBUztRQUNqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBd0I7SUFDakQsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQ3BELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENB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TyxDQUFDLEtBQUs7WUFDcEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUztZQUMxRCxRQUFRLEVBQ04sT0FBTyxDQUFDLFNBQVMsS0FBSyxjQUFjO2dCQUNsQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRO2dCQUM3QixDQUFDLENBQUMsU0FBUztZQUNmLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7WUFDekMsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxpQkFBaUI7QUFDakIsOEVBQThFO0FBRTlFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBZTtJQUM1QyxPQUFPO1FBQ0wsS0FBSyxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUMvQixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQy9CLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7S0FDaEMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV2ZW50IG1hdGVyaWFsaXphdGlvbiBoZWxwZXJzLlxuICpcbiAqIFRoZXNlIGZ1bmN0aW9ucyBjb252ZXJ0IGEgZmxhdCBsaXN0IG9mIHdvcmtmbG93IGV2ZW50cyBpbnRvIGVudGl0eS1saWtlXG4gKiBvYmplY3RzIChzdGVwcywgaG9va3MsIHdhaXRzKSBieSBncm91cGluZyBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmRcbiAqIHN0aXRjaGluZyB0b2dldGhlciBsaWZlY3ljbGUgZXZlbnRzLlxuICpcbiAqIFRoaXMgZW5hYmxlcyBhIFwidG9wLWRvd25cIiBkYXRhIGZldGNoaW5nIHBhdHRlcm4gd2hlcmUgdGhlIGNsaWVudCBmZXRjaGVzXG4gKiBhbGwgZXZlbnRzIGZvciBhIHJ1biBvbmNlLCB0aGVuIG1hdGVyaWFsaXplcyBlbnRpdGllcyBjbGllbnQtc2lkZSBpbnN0ZWFkXG4gKiBvZiBtYWtpbmcgc2VwYXJhdGUgQVBJIGNhbGxzIGZvciBlYWNoIGVudGl0eSB0eXBlLlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIGlzSG9va0xpZmVjeWNsZUV2ZW50VHlwZSxcbiAgaXNTdGVwRXZlbnRUeXBlLFxuICBpc1dhaXRFdmVudFR5cGUsXG4gIHR5cGUgU3RlcFN0YXR1cyxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYXRlcmlhbGl6ZWQgZW50aXR5IHR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbGl6ZWRTdGVwIHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogU3RlcFN0YXR1cztcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHN0YXJ0ZWRBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICAvKiogQWxsIGV2ZW50cyBmb3IgdGhpcyBzdGVwLCBpbiBpbnNlcnRpb24gb3JkZXIgKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplZEhvb2sge1xuICBob29rSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcmVjZWl2ZWRDb3VudDogbnVtYmVyO1xuICBsYXN0UmVjZWl2ZWRBdD86IERhdGU7XG4gIGRpc3Bvc2VkQXQ/OiBEYXRlO1xuICAvKiogQWxsIGV2ZW50cyBmb3IgdGhpcyBob29rLCBpbiBpbnNlcnRpb24gb3JkZXIgKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplZFdhaXQge1xuICB3YWl0SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgc3RhdHVzOiAnd2FpdGluZycgfCAnY29tcGxldGVkJztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICByZXN1bWVBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgLyoqIEFsbCBldmVudHMgZm9yIHRoaXMgd2FpdCwgaW4gaW5zZXJ0aW9uIG9yZGVyICovXG4gIGV2ZW50czogRXZlbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbGl6ZWRFbnRpdGllcyB7XG4gIHN0ZXBzOiBNYXRlcmlhbGl6ZWRTdGVwW107XG4gIGhvb2tzOiBNYXRlcmlhbGl6ZWRIb29rW107XG4gIHdhaXRzOiBNYXRlcmlhbGl6ZWRXYWl0W107XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyOiBncm91cCBldmVudHMgYnkgY29ycmVsYXRpb25JZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdyb3VwQnlDb3JyZWxhdGlvbklkKFxuICBldmVudHM6IEV2ZW50W10sXG4gIG1hdGNoZXNFdmVudFR5cGU6IChldmVudFR5cGU6IHN0cmluZykgPT4gYm9vbGVhblxuKTogTWFwPHN0cmluZywgRXZlbnRbXT4ge1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBjaWQgPSBldmVudC5jb3JyZWxhdGlvbklkO1xuICAgIGlmICghY2lkKSBjb250aW51ZTtcbiAgICBpZiAoIW1hdGNoZXNFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSkgY29udGludWU7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBncm91cHMuZ2V0KGNpZCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5wdXNoKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBzLnNldChjaWQsIFtldmVudF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudFRpbWVzdGFtcChldmVudDogRXZlbnQgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBldmVudD8ub2NjdXJyZWRBdCA/PyBldmVudD8uY3JlYXRlZEF0O1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHZhbHVlKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyB1bmRlZmluZWQgOiBkYXRlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIG1hdGVyaWFsaXplU3RlcHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdyb3VwIHN0ZXBfKiBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmQgYnVpbGQgU3RlcC1saWtlIGVudGl0aWVzLlxuICpcbiAqIEhhbmRsZXMgcGFydGlhbCBldmVudCBsaXN0cyBncmFjZWZ1bGx5OiBhIHN0ZXAgbWF5IG9ubHkgaGF2ZSBhXG4gKiBzdGVwX2NyZWF0ZWQgZXZlbnQgd2l0aCBubyBjb21wbGV0aW9uIHlldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplU3RlcHMoZXZlbnRzOiBFdmVudFtdKTogTWF0ZXJpYWxpemVkU3RlcFtdIHtcbiAgY29uc3QgZ3JvdXBzID0gZ3JvdXBCeUNvcnJlbGF0aW9uSWQoZXZlbnRzLCBpc1N0ZXBFdmVudFR5cGUpO1xuICBjb25zdCBzdGVwczogTWF0ZXJpYWxpemVkU3RlcFtdID0gW107XG5cbiAgZm9yIChjb25zdCBbY29ycmVsYXRpb25JZCwgc3RlcEV2ZW50c10gb2YgZ3JvdXBzKSB7XG4gICAgY29uc3QgY3JlYXRlZCA9IHN0ZXBFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKTtcbiAgICBpZiAoIWNyZWF0ZWQpIGNvbnRpbnVlO1xuXG4gICAgbGV0IHN0YXR1czogU3RlcFN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgbGV0IHN0YXJ0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY29tcGxldGVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWQpID8/IGNyZWF0ZWQuY3JlYXRlZEF0O1xuXG4gICAgZm9yIChjb25zdCBlIG9mIHN0ZXBFdmVudHMpIHtcbiAgICAgIHN3aXRjaCAoZS5ldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgICAgICBzdGF0dXMgPSAncnVubmluZyc7XG4gICAgICAgICAgYXR0ZW1wdCArPSAxO1xuICAgICAgICAgIGlmICghc3RhcnRlZEF0KSBzdGFydGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgICBjb21wbGV0ZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB1cGRhdGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RlcF9jb21wbGV0ZWQnOlxuICAgICAgICAgIHN0YXR1cyA9ICdjb21wbGV0ZWQnO1xuICAgICAgICAgIGNvbXBsZXRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgdXBkYXRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N0ZXBfZmFpbGVkJzpcbiAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICBjb21wbGV0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdGVwX3JldHJ5aW5nJzpcbiAgICAgICAgICBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdXBkYXRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RlcHMucHVzaCh7XG4gICAgICBzdGVwSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgICBydW5JZDogY3JlYXRlZC5ydW5JZCxcbiAgICAgIHN0ZXBOYW1lOlxuICAgICAgICBjcmVhdGVkLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCdcbiAgICAgICAgICA/IChjcmVhdGVkLmV2ZW50RGF0YT8uc3RlcE5hbWUgPz8gY29ycmVsYXRpb25JZClcbiAgICAgICAgICA6IGNvcnJlbGF0aW9uSWQsXG4gICAgICBzdGF0dXMsXG4gICAgICBhdHRlbXB0LFxuICAgICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjcmVhdGVkKSA/PyBjcmVhdGVkLmNyZWF0ZWRBdCxcbiAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgdXBkYXRlZEF0LFxuICAgICAgZXZlbnRzOiBzdGVwRXZlbnRzLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0ZXBzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIG1hdGVyaWFsaXplSG9va3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdyb3VwIGhvb2tfKiBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmQgYnVpbGQgSG9vay1saWtlIGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0ZXJpYWxpemVIb29rcyhldmVudHM6IEV2ZW50W10pOiBNYXRlcmlhbGl6ZWRIb29rW10ge1xuICBjb25zdCBncm91cHMgPSBncm91cEJ5Q29ycmVsYXRpb25JZChldmVudHMsIGlzSG9va0xpZmVjeWNsZUV2ZW50VHlwZSk7XG4gIGNvbnN0IGhvb2tzOiBNYXRlcmlhbGl6ZWRIb29rW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtjb3JyZWxhdGlvbklkLCBob29rRXZlbnRzXSBvZiBncm91cHMpIHtcbiAgICBjb25zdCBjcmVhdGVkID0gaG9va0V2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcpO1xuICAgIGlmICghY3JlYXRlZCkgY29udGludWU7XG5cbiAgICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IGhvb2tFdmVudHMuZmlsdGVyKFxuICAgICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAnaG9va19yZWNlaXZlZCdcbiAgICApO1xuICAgIGNvbnN0IGRpc3Bvc2VkID0gaG9va0V2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKTtcbiAgICBjb25zdCBsYXN0UmVjZWl2ZWQgPSByZWNlaXZlZEV2ZW50cy5hdCgtMSk7XG5cbiAgICBob29rcy5wdXNoKHtcbiAgICAgIGhvb2tJZDogY29ycmVsYXRpb25JZCxcbiAgICAgIHJ1bklkOiBjcmVhdGVkLnJ1bklkLFxuICAgICAgdG9rZW46XG4gICAgICAgIGNyZWF0ZWQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJ1xuICAgICAgICAgID8gY3JlYXRlZC5ldmVudERhdGE/LnRva2VuXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBjcmVhdGVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWQpID8/IGNyZWF0ZWQuY3JlYXRlZEF0LFxuICAgICAgcmVjZWl2ZWRDb3VudDogcmVjZWl2ZWRFdmVudHMubGVuZ3RoLFxuICAgICAgbGFzdFJlY2VpdmVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGxhc3RSZWNlaXZlZCksXG4gICAgICBkaXNwb3NlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChkaXNwb3NlZCksXG4gICAgICBldmVudHM6IGhvb2tFdmVudHMsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gaG9va3M7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gbWF0ZXJpYWxpemVXYWl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogR3JvdXAgd2FpdF8qIGV2ZW50cyBieSBjb3JyZWxhdGlvbklkIGFuZCBidWlsZCBXYWl0LWxpa2UgZW50aXRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRlcmlhbGl6ZVdhaXRzKGV2ZW50czogRXZlbnRbXSk6IE1hdGVyaWFsaXplZFdhaXRbXSB7XG4gIGNvbnN0IGdyb3VwcyA9IGdyb3VwQnlDb3JyZWxhdGlvbklkKGV2ZW50cywgaXNXYWl0RXZlbnRUeXBlKTtcbiAgY29uc3Qgd2FpdHM6IE1hdGVyaWFsaXplZFdhaXRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2NvcnJlbGF0aW9uSWQsIHdhaXRFdmVudHNdIG9mIGdyb3Vwcykge1xuICAgIGNvbnN0IGNyZWF0ZWQgPSB3YWl0RXZlbnRzLmZpbmQoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyk7XG4gICAgaWYgKCFjcmVhdGVkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNvbXBsZXRlZCA9IHdhaXRFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpO1xuXG4gICAgd2FpdHMucHVzaCh7XG4gICAgICB3YWl0SWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgICBydW5JZDogY3JlYXRlZC5ydW5JZCxcbiAgICAgIHN0YXR1czogY29tcGxldGVkID8gJ2NvbXBsZXRlZCcgOiAnd2FpdGluZycsXG4gICAgICBjcmVhdGVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWQpID8/IGNyZWF0ZWQuY3JlYXRlZEF0LFxuICAgICAgcmVzdW1lQXQ6XG4gICAgICAgIGNyZWF0ZWQuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJ1xuICAgICAgICAgID8gY3JlYXRlZC5ldmVudERhdGE/LnJlc3VtZUF0XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBjb21wbGV0ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoY29tcGxldGVkKSxcbiAgICAgIGV2ZW50czogd2FpdEV2ZW50cyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB3YWl0cztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBtYXRlcmlhbGl6ZUFsbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBtYXRlcmlhbGl6ZXMgYWxsIGVudGl0eSB0eXBlcyBmcm9tIGEgZmxhdFxuICogZXZlbnQgbGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplQWxsKGV2ZW50czogRXZlbnRbXSk6IE1hdGVyaWFsaXplZEVudGl0aWVzIHtcbiAgcmV0dXJuIHtcbiAgICBzdGVwczogbWF0ZXJpYWxpemVTdGVwcyhldmVudHMpLFxuICAgIGhvb2tzOiBtYXRlcmlhbGl6ZUhvb2tzKGV2ZW50cyksXG4gICAgd2FpdHM6IG1hdGVyaWFsaXplV2FpdHMoZXZlbnRzKSxcbiAgfTtcbn1cbiJdfQ==
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWF0ZXJpYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9ldmVudC1tYXRlcmlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGVBQWUsR0FFaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWlEM0QsOEVBQThFO0FBQzlFLHdDQUF3QztBQUN4Qyw4RUFBOEU7QUFFOUUsU0FBUyxvQkFBb0IsQ0FDM0IsTUFBZSxFQUNmLGdCQUFnRDtJQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxTQUFTO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsU0FBUztRQUNqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBd0I7SUFDakQsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLEVBQUUsU0FB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VGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgYSBmbGF0IGxpc3Qgb2Ygd29ya2Zsb3cgZXZlbnRzIGludG8gZW50aXR5LWxpa2VcbiAqIG9iamVjdHMgKHN0ZXBzLCBob29rcywgd2FpdHMpIGJ5IGdyb3VwaW5nIGV2ZW50cyBieSBjb3JyZWxhdGlvbklkIGFuZFxuICogc3RpdGNoaW5nIHRvZ2V0aGVyIGxpZmVjeWNsZSBldmVudHMuXG4gKlxuICogVGhpcyBlbmFibGVzIGEgXCJ0b3AtZG93blwiIGRhdGEgZmV0Y2hpbmcgcGF0dGVybiB3aGVyZSB0aGUgY2xpZW50IGZldGNoZXNcbiAqIGFsbCBldmVudHMgZm9yIGEgcnVuIG9uY2UsIHRoZW4gbWF0ZXJpYWxpemVzIGVudGl0aWVzIGNsaWVudC1zaWRlIGluc3RlYWRcbiAqIG9mIG1ha2luZyBzZXBhcmF0ZSBBUEkgY2FsbHMgZm9yIGVhY2ggZW50aXR5IHR5cGUuXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgaXNIb29rTGlmZWN5Y2xlRXZlbnRUeXBlLFxuICBpc1N0ZXBFdmVudFR5cGUsXG4gIGlzV2FpdEV2ZW50VHlwZSxcbiAgdHlwZSBTdGVwU3RhdHVzLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZmluZER1cGxpY2F0ZUV2ZW50SWRzIH0gZnJvbSAnLi9kdXBsaWNhdGUtZXZlbnRzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYXRlcmlhbGl6ZWQgZW50aXR5IHR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbGl6ZWRTdGVwIHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogU3RlcFN0YXR1cztcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHN0YXJ0ZWRBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICAvKiogQWxsIGV2ZW50cyBmb3IgdGhpcyBzdGVwLCBpbiBpbnNlcnRpb24gb3JkZXIgKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplZEhvb2sge1xuICBob29rSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcmVjZWl2ZWRDb3VudDogbnVtYmVyO1xuICBsYXN0UmVjZWl2ZWRBdD86IERhdGU7XG4gIGRpc3Bvc2VkQXQ/OiBEYXRlO1xuICAvKiogQWxsIGV2ZW50cyBmb3IgdGhpcyBob29rLCBpbiBpbnNlcnRpb24gb3JkZXIgKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplZFdhaXQge1xuICB3YWl0SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgc3RhdHVzOiAnd2FpdGluZycgfCAnY29tcGxldGVkJztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICByZXN1bWVBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgLyoqIEFsbCBldmVudHMgZm9yIHRoaXMgd2FpdCwgaW4gaW5zZXJ0aW9uIG9yZGVyICovXG4gIGV2ZW50czogRXZlbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbGl6ZWRFbnRpdGllcyB7XG4gIHN0ZXBzOiBNYXRlcmlhbGl6ZWRTdGVwW107XG4gIGhvb2tzOiBNYXRlcmlhbGl6ZWRIb29rW107XG4gIHdhaXRzOiBNYXRlcmlhbGl6ZWRXYWl0W107XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyOiBncm91cCBldmVudHMgYnkgY29ycmVsYXRpb25JZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdyb3VwQnlDb3JyZWxhdGlvbklkKFxuICBldmVudHM6IEV2ZW50W10sXG4gIG1hdGNoZXNFdmVudFR5cGU6IChldmVudFR5cGU6IHN0cmluZykgPT4gYm9vbGVhblxuKTogTWFwPHN0cmluZywgRXZlbnRbXT4ge1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBjaWQgPSBldmVudC5jb3JyZWxhdGlvbklkO1xuICAgIGlmICghY2lkKSBjb250aW51ZTtcbiAgICBpZiAoIW1hdGNoZXNFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSkgY29udGludWU7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBncm91cHMuZ2V0KGNpZCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5wdXNoKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBzLnNldChjaWQsIFtldmVudF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudFRpbWVzdGFtcChldmVudDogRXZlbnQgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBldmVudD8ub2NjdXJyZWRBdCA/PyBldmVudD8uY3JlYXRlZEF0O1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHZhbHVlKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyB1bmRlZmluZWQgOiBkYXRlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIG1hdGVyaWFsaXplU3RlcHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdyb3VwIHN0ZXBfKiBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmQgYnVpbGQgU3RlcC1saWtlIGVudGl0aWVzLlxuICpcbiAqIEhhbmRsZXMgcGFydGlhbCBldmVudCBsaXN0cyBncmFjZWZ1bGx5OiBhIHN0ZXAgbWF5IG9ubHkgaGF2ZSBhXG4gKiBzdGVwX2NyZWF0ZWQgZXZlbnQgd2l0aCBubyBjb21wbGV0aW9uIHlldC5cbiAqXG4gKiBUaGUgZGVyaXZlZCBzdGF0dXMgYW5kIHRpbWVzdGFtcHMgY29tZSBmcm9tIHRoZSBldmVudHMgdGhlIHJ1biBhY3RlZCBvbi4gQVxuICogcmVwZWF0IG9mIGEgY2xhc3MgdGhlIGxvZyBhbHJlYWR5IHJlY29yZHMgaXMgcmVhZCBwYXN0IGJ5IGV2ZXJ5IHJlcGxheSwgc29cbiAqIGEgc2Vjb25kIHRlcm1pbmFsIGV2ZW50IHdyaXR0ZW4gYnkgYSBjb25jdXJyZW50IHJlcGxheSBkb2VzIG5vdCBtb3ZlIGEgc3RlcFxuICogb2ZmIHRoZSBvdXRjb21lIHRoZSBmaXJzdCBvbmUgcmVjb3JkZWQuIEV2ZXJ5IGV2ZW50IHN0YXlzIG9uIHRoZSBlbnRpdHknc1xuICogYGV2ZW50c2AgbGlzdC5cbiAqXG4gKiBUaGF0IHJlZHVjdGlvbiBuZWVkcyB0aGUgd2hvbGUgbG9nIHRvIGJlIHNvdW5kLCBzbyBpdCBvbmx5IHJ1bnMgd2hlblxuICogYGlzQ29tcGxldGVIaXN0b3J5YCBzYXlzIGBldmVudHNgIGlzIGl0LiBTZWUge0BsaW5rIGZpbmREdXBsaWNhdGVFdmVudElkc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRlcmlhbGl6ZVN0ZXBzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIHsgaXNDb21wbGV0ZUhpc3RvcnkgPSBmYWxzZSB9OiB7IGlzQ29tcGxldGVIaXN0b3J5PzogYm9vbGVhbiB9ID0ge31cbik6IE1hdGVyaWFsaXplZFN0ZXBbXSB7XG4gIGNvbnN0IGdyb3VwcyA9IGdyb3VwQnlDb3JyZWxhdGlvbklkKGV2ZW50cywgaXNTdGVwRXZlbnRUeXBlKTtcbiAgY29uc3QgZHVwbGljYXRlRXZlbnRJZHMgPSBmaW5kRHVwbGljYXRlRXZlbnRJZHMoZXZlbnRzLCB7XG4gICAgaXNDb21wbGV0ZUhpc3RvcnksXG4gIH0pO1xuICBjb25zdCBzdGVwczogTWF0ZXJpYWxpemVkU3RlcFtdID0gW107XG5cbiAgZm9yIChjb25zdCBbY29ycmVsYXRpb25JZCwgc3RlcEV2ZW50c10gb2YgZ3JvdXBzKSB7XG4gICAgY29uc3QgY3JlYXRlZCA9IHN0ZXBFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKTtcbiAgICBpZiAoIWNyZWF0ZWQpIGNvbnRpbnVlO1xuXG4gICAgbGV0IHN0YXR1czogU3RlcFN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgbGV0IHN0YXJ0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY29tcGxldGVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWQpID8/IGNyZWF0ZWQuY3JlYXRlZEF0O1xuXG4gICAgZm9yIChjb25zdCBlIG9mIHN0ZXBFdmVudHMpIHtcbiAgICAgIGlmIChkdXBsaWNhdGVFdmVudElkcy5oYXMoZS5ldmVudElkKSkgY29udGludWU7XG4gICAgICBzd2l0Y2ggKGUuZXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0ZXBfc3RhcnRlZCc6XG4gICAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICAgIGF0dGVtcHQgKz0gMTtcbiAgICAgICAgICBpZiAoIXN0YXJ0ZWRBdCkgc3RhcnRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdXBkYXRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzpcbiAgICAgICAgICBzdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgICBjb21wbGV0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgICAgc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgY29tcGxldGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgICB1cGRhdGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RlcF9yZXRyeWluZyc6XG4gICAgICAgICAgc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICAgIGNvbXBsZXRlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0ZXBzLnB1c2goe1xuICAgICAgc3RlcElkOiBjb3JyZWxhdGlvbklkLFxuICAgICAgcnVuSWQ6IGNyZWF0ZWQucnVuSWQsXG4gICAgICBzdGVwTmFtZTpcbiAgICAgICAgY3JlYXRlZC5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnXG4gICAgICAgICAgPyAoY3JlYXRlZC5ldmVudERhdGE/LnN0ZXBOYW1lID8/IGNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgOiBjb3JyZWxhdGlvbklkLFxuICAgICAgc3RhdHVzLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIGNyZWF0ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoY3JlYXRlZCkgPz8gY3JlYXRlZC5jcmVhdGVkQXQsXG4gICAgICBzdGFydGVkQXQsXG4gICAgICBjb21wbGV0ZWRBdCxcbiAgICAgIHVwZGF0ZWRBdCxcbiAgICAgIGV2ZW50czogc3RlcEV2ZW50cyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGVwcztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBtYXRlcmlhbGl6ZUhvb2tzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBHcm91cCBob29rXyogZXZlbnRzIGJ5IGNvcnJlbGF0aW9uSWQgYW5kIGJ1aWxkIEhvb2stbGlrZSBlbnRpdGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplSG9va3MoZXZlbnRzOiBFdmVudFtdKTogTWF0ZXJpYWxpemVkSG9va1tdIHtcbiAgY29uc3QgZ3JvdXBzID0gZ3JvdXBCeUNvcnJlbGF0aW9uSWQoZXZlbnRzLCBpc0hvb2tMaWZlY3ljbGVFdmVudFR5cGUpO1xuICBjb25zdCBob29rczogTWF0ZXJpYWxpemVkSG9va1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbY29ycmVsYXRpb25JZCwgaG9va0V2ZW50c10gb2YgZ3JvdXBzKSB7XG4gICAgY29uc3QgY3JlYXRlZCA9IGhvb2tFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKTtcbiAgICBpZiAoIWNyZWF0ZWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcmVjZWl2ZWRFdmVudHMgPSBob29rRXZlbnRzLmZpbHRlcihcbiAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnXG4gICAgKTtcbiAgICBjb25zdCBkaXNwb3NlZCA9IGhvb2tFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJyk7XG4gICAgY29uc3QgbGFzdFJlY2VpdmVkID0gcmVjZWl2ZWRFdmVudHMuYXQoLTEpO1xuXG4gICAgaG9va3MucHVzaCh7XG4gICAgICBob29rSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgICBydW5JZDogY3JlYXRlZC5ydW5JZCxcbiAgICAgIHRva2VuOlxuICAgICAgICBjcmVhdGVkLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCdcbiAgICAgICAgICA/IGNyZWF0ZWQuZXZlbnREYXRhPy50b2tlblxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjcmVhdGVkKSA/PyBjcmVhdGVkLmNyZWF0ZWRBdCxcbiAgICAgIHJlY2VpdmVkQ291bnQ6IHJlY2VpdmVkRXZlbnRzLmxlbmd0aCxcbiAgICAgIGxhc3RSZWNlaXZlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChsYXN0UmVjZWl2ZWQpLFxuICAgICAgZGlzcG9zZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoZGlzcG9zZWQpLFxuICAgICAgZXZlbnRzOiBob29rRXZlbnRzLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGhvb2tzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIG1hdGVyaWFsaXplV2FpdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdyb3VwIHdhaXRfKiBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmQgYnVpbGQgV2FpdC1saWtlIGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0ZXJpYWxpemVXYWl0cyhldmVudHM6IEV2ZW50W10pOiBNYXRlcmlhbGl6ZWRXYWl0W10ge1xuICBjb25zdCBncm91cHMgPSBncm91cEJ5Q29ycmVsYXRpb25JZChldmVudHMsIGlzV2FpdEV2ZW50VHlwZSk7XG4gIGNvbnN0IHdhaXRzOiBNYXRlcmlhbGl6ZWRXYWl0W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtjb3JyZWxhdGlvbklkLCB3YWl0RXZlbnRzXSBvZiBncm91cHMpIHtcbiAgICBjb25zdCBjcmVhdGVkID0gd2FpdEV2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcpO1xuICAgIGlmICghY3JlYXRlZCkgY29udGludWU7XG5cbiAgICBjb25zdCBjb21wbGV0ZWQgPSB3YWl0RXZlbnRzLmZpbmQoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKTtcblxuICAgIHdhaXRzLnB1c2goe1xuICAgICAgd2FpdElkOiBjb3JyZWxhdGlvbklkLFxuICAgICAgcnVuSWQ6IGNyZWF0ZWQucnVuSWQsXG4gICAgICBzdGF0dXM6IGNvbXBsZXRlZCA/ICdjb21wbGV0ZWQnIDogJ3dhaXRpbmcnLFxuICAgICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjcmVhdGVkKSA/PyBjcmVhdGVkLmNyZWF0ZWRBdCxcbiAgICAgIHJlc3VtZUF0OlxuICAgICAgICBjcmVhdGVkLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCdcbiAgICAgICAgICA/IGNyZWF0ZWQuZXZlbnREYXRhPy5yZXN1bWVBdFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgY29tcGxldGVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGNvbXBsZXRlZCksXG4gICAgICBldmVudHM6IHdhaXRFdmVudHMsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gd2FpdHM7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gbWF0ZXJpYWxpemVBbGxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgbWF0ZXJpYWxpemVzIGFsbCBlbnRpdHkgdHlwZXMgZnJvbSBhIGZsYXRcbiAqIGV2ZW50IGxpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRlcmlhbGl6ZUFsbChcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBvcHRpb25zOiB7IGlzQ29tcGxldGVIaXN0b3J5PzogYm9vbGVhbiB9ID0ge31cbik6IE1hdGVyaWFsaXplZEVudGl0aWVzIHtcbiAgcmV0dXJuIHtcbiAgICBzdGVwczogbWF0ZXJpYWxpemVTdGVwcyhldmVudHMsIG9wdGlvbnMpLFxuICAgIGhvb2tzOiBtYXRlcmlhbGl6ZUhvb2tzKGV2ZW50cyksXG4gICAgd2FpdHM6IG1hdGVyaWFsaXplV2FpdHMoZXZlbnRzKSxcbiAgfTtcbn1cbiJdfQ==
@@ -39,6 +39,21 @@ export interface TraceWithMeta {
39
39
  }[];
40
40
  /** Duration in ms from trace start to the latest known event. */
41
41
  knownDurationMs: number;
42
+ /**
43
+ * The events left out of the span geometry as repeats. Empty unless the
44
+ * caller vouched for the log being complete. See
45
+ * {@link findDuplicateEventIds}.
46
+ */
47
+ duplicateEventIds: ReadonlySet<string>;
42
48
  }
43
- export declare function buildTrace(run: WorkflowRun, events: Event[], now: Date): TraceWithMeta;
49
+ export declare function buildTrace(run: WorkflowRun, events: Event[], now: Date,
50
+ /**
51
+ * Whether `events` is the run's whole log. Defaults to false, which builds
52
+ * the trace from every event: on a subset there is no way to tell a repeat
53
+ * from the only copy the caller was given, and dropping the wrong one moves
54
+ * a span. See {@link findDuplicateEventIds}.
55
+ */
56
+ { isCompleteHistory }?: {
57
+ isCompleteHistory?: boolean;
58
+ }): TraceWithMeta;
44
59
  //# sourceMappingURL=trace-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trace-builder.d.ts","sourceRoot":"","sources":["../../src/lib/trace-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAUzB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,OAIT,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,KAAK,EAAE,CAMT;AAMD,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,cAAc,EAAE,KAAK,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;CAClC,CAAC;AAeF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAgCvE;AAsED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EAAE,CAAC;IAClE,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,IAAI,GACR,aAAa,CA6Bf"}
1
+ {"version":3,"file":"trace-builder.d.ts","sourceRoot":"","sources":["../../src/lib/trace-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAWzB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,OAIT,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,KAAK,EAAE,CAMT;AAMD,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,cAAc,EAAE,KAAK,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;CAClC,CAAC;AAeF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAgCvE;AAsED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EAAE,CAAC;IAClE,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,IAAI;AACT;;;;;GAKG;AACH,EAAE,iBAAyB,EAAE,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,aAAa,CA0Cf"}