@dudousxd/nestjs-durable-dashboard 0.53.0 → 0.55.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 (41) hide show
  1. package/dist/client/durable-client.d.ts +67 -3
  2. package/dist/client/durable-client.d.ts.map +1 -1
  3. package/dist/client/durable-client.js +26 -46
  4. package/dist/client/durable-client.js.map +1 -1
  5. package/dist/client/event-tail.d.ts +25 -0
  6. package/dist/client/event-tail.d.ts.map +1 -0
  7. package/dist/client/event-tail.js +30 -0
  8. package/dist/client/event-tail.js.map +1 -0
  9. package/dist/server/index.cjs +322 -1337
  10. package/dist/server/index.cjs.map +1 -1
  11. package/dist/server/index.d.cts +149 -389
  12. package/dist/server/index.d.ts +149 -389
  13. package/dist/server/index.js +308 -1317
  14. package/dist/server/index.js.map +1 -1
  15. package/dist/spa/assets/{bench-Db-gqOEF.js → bench-DCclNvcZ.js} +1 -1
  16. package/dist/spa/assets/index-B-wtX4GV.js +66 -0
  17. package/dist/spa/assets/index-CJdk28vt.css +1 -0
  18. package/dist/spa/assets/{index-4tEXGRlA.js → index-ChjKRQZx.js} +1 -1
  19. package/dist/spa/assets/{preview-BvCp1zR5.js → preview-CdsjvOrK.js} +1 -1
  20. package/dist/spa/bench.html +3 -3
  21. package/dist/spa/index.html +3 -3
  22. package/dist/spa/preview.html +3 -3
  23. package/package.json +5 -18
  24. package/dist/client/console-session.d.ts +0 -63
  25. package/dist/client/console-session.d.ts.map +0 -1
  26. package/dist/client/console-session.js +0 -107
  27. package/dist/client/console-session.js.map +0 -1
  28. package/dist/react/index.d.ts +0 -4
  29. package/dist/react/index.d.ts.map +0 -1
  30. package/dist/react/index.js +0 -14
  31. package/dist/react/index.js.map +0 -1
  32. package/dist/react/open-console-button.d.ts +0 -26
  33. package/dist/react/open-console-button.d.ts.map +0 -1
  34. package/dist/react/open-console-button.js +0 -26
  35. package/dist/react/open-console-button.js.map +0 -1
  36. package/dist/react/use-open-console.d.ts +0 -40
  37. package/dist/react/use-open-console.d.ts.map +0 -1
  38. package/dist/react/use-open-console.js +0 -77
  39. package/dist/react/use-open-console.js.map +0 -1
  40. package/dist/spa/assets/index-BbR4CZ1K.css +0 -1
  41. package/dist/spa/assets/index-CEV7yPmk.js +0 -66
@@ -0,0 +1 @@
1
+ .react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgb(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgb(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color, var(--xy-background-color-props, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-x-6{left:1.5rem;right:1.5rem}.inset-y-0{top:0;bottom:0}.bottom-6{bottom:1.5rem}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.top-0{top:0}.top-1\/2{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-\[10px\]{margin-left:10px}.ml-\[18px\]{margin-left:18px}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-full{height:100%}.h-px{height:1px}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[320px\]{max-height:320px}.max-h-\[60vh\]{max-height:60vh}.min-h-0{min-height:0px}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-3{width:.75rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-80{width:20rem}.w-\[208px\]{width:208px}.w-\[300px\]{width:300px}.w-\[34rem\]{width:34rem}.w-\[380px\]{width:380px}.w-\[3px\]{width:3px}.w-\[min\(560px\,92vw\)\]{width:min(560px,92vw)}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-3xl{max-width:48rem}.max-w-\[10rem\]{max-width:10rem}.max-w-\[120px\]{max-width:120px}.max-w-\[12rem\]{max-width:12rem}.max-w-\[180px\]{max-width:180px}.max-w-\[24rem\]{max-width:24rem}.max-w-\[280px\]{max-width:280px}.max-w-\[28rem\]{max-width:28rem}.max-w-\[90\%\]{max-width:90%}.max-w-\[9rem\]{max-width:9rem}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize-y{resize:vertical}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[130px_1fr\]{grid-template-columns:130px 1fr}.grid-cols-\[150px_1fr\]{grid-template-columns:150px 1fr}.grid-cols-\[minmax\(300px\,360px\)_1fr\]{grid-template-columns:minmax(300px,360px) 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-0\.5{row-gap:.125rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-line-soft>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:color-mix(in srgb,var(--line-soft) calc(var(--tw-divide-opacity, 1) * 100%),transparent)}.self-end{align-self:flex-end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.\!border-0{border-width:0px!important}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/25{border-color:#f59e0b40}.border-amber-500\/30{border-color:#f59e0b4d}.border-amber-500\/40{border-color:#f59e0b66}.border-amber-500\/50{border-color:#f59e0b80}.border-bad\/25{border-color:color-mix(in srgb,var(--bad) 25%,transparent)}.border-brand\/30{border-color:color-mix(in srgb,var(--accent) 30%,transparent)}.border-brand\/60{border-color:color-mix(in srgb,var(--accent) 60%,transparent)}.border-emerald-500\/25{border-color:#10b98140}.border-indigo-500\/30{border-color:#6366f14d}.border-indigo-500\/40{border-color:#6366f166}.border-line{--tw-border-opacity: 1;border-color:color-mix(in srgb,var(--line) calc(var(--tw-border-opacity, 1) * 100%),transparent)}.border-line-soft{--tw-border-opacity: 1;border-color:color-mix(in srgb,var(--line-soft) calc(var(--tw-border-opacity, 1) * 100%),transparent)}.border-line\/60{border-color:color-mix(in srgb,var(--line) 60%,transparent)}.border-red-500\/20{border-color:#ef444433}.border-red-500\/25{border-color:#ef444440}.border-red-500\/30{border-color:#ef44444d}.border-red-500\/40{border-color:#ef444466}.border-rose-500\/30{border-color:#f43f5e4d}.border-rose-500\/40{border-color:#f43f5e66}.border-rose-500\/50{border-color:#f43f5e80}.border-sky-500\/30{border-color:#0ea5e94d}.border-sky-500\/40{border-color:#0ea5e966}.border-teal-500\/30{border-color:#14b8a64d}.border-transparent{border-color:transparent}.border-warn\/40{border-color:color-mix(in srgb,var(--warn) 40%,transparent)}.border-zinc-500{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.border-zinc-600{--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.border-zinc-600\/50{border-color:#52525b80}.border-zinc-700{--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1))}.\!bg-zinc-600{--tw-bg-opacity: 1 !important;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))!important}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/35{background-color:#f59e0b59}.bg-amber-500\/5{background-color:#f59e0b0d}.bg-amber-500\/60{background-color:#f59e0b99}.bg-bad\/10{background-color:color-mix(in srgb,var(--bad) 10%,transparent)}.bg-black\/15{background-color:#00000026}.bg-black\/20{background-color:#0003}.bg-black\/40{background-color:#0006}.bg-black\/60{background-color:#0009}.bg-brand\/10{background-color:color-mix(in srgb,var(--accent) 10%,transparent)}.bg-current{background-color:currentColor}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-400\/45{background-color:#34d39973}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-500\/20{background-color:#10b98133}.bg-emerald-500\/30{background-color:#10b9814d}.bg-emerald-500\/40{background-color:#10b98166}.bg-emerald-500\/60{background-color:#10b98199}.bg-indigo-500\/10{background-color:#6366f11a}.bg-indigo-500\/15{background-color:#6366f126}.bg-indigo-500\/20{background-color:#6366f133}.bg-line-soft{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--line-soft) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-live{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--live) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-live\/15{background-color:color-mix(in srgb,var(--live) 15%,transparent)}.bg-live\/20{background-color:color-mix(in srgb,var(--live) 20%,transparent)}.bg-live\/70{background-color:color-mix(in srgb,var(--live) 70%,transparent)}.bg-panel{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-panel-2{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel-2) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-panel\/95{background-color:color-mix(in srgb,var(--panel) 95%,transparent)}.bg-popover{--tw-bg-opacity: 1;background-color:color-mix(in srgb,var(--panel-2) calc(var(--tw-bg-opacity, 1) * 100%),transparent)}.bg-popover\/95{background-color:color-mix(in srgb,var(--panel-2) 95%,transparent)}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-red-500\/20{background-color:#ef444433}.bg-red-500\/25{background-color:#ef444440}.bg-red-500\/35{background-color:#ef444459}.bg-red-500\/40{background-color:#ef444466}.bg-red-500\/70{background-color:#ef4444b3}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-rose-500\/15{background-color:#f43f5e26}.bg-rose-500\/80{background-color:#f43f5ecc}.bg-sky-500\/10{background-color:#0ea5e91a}.bg-teal-500\/10{background-color:#14b8a61a}.bg-transparent{background-color:transparent}.bg-warn\/10{background-color:color-mix(in srgb,var(--warn) 10%,transparent)}.bg-zinc-500\/60{background-color:#71717a99}.bg-zinc-700\/40{background-color:#3f3f4666}.bg-zinc-700\/70{background-color:#3f3f46b3}.bg-zinc-800{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.bg-zinc-800\/40{background-color:#27272a66}.bg-zinc-800\/50{background-color:#27272a80}.bg-zinc-800\/60{background-color:#27272a99}.bg-zinc-800\/70{background-color:#27272ab3}.bg-zinc-900{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.bg-zinc-900\/30{background-color:#18181b4d}.bg-zinc-900\/40{background-color:#18181b66}.bg-zinc-900\/60{background-color:#18181b99}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-px{padding-top:1px;padding-bottom:1px}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3\.5{padding-left:.875rem}.pl-\[26px\]{padding-left:26px}.pr-3{padding-right:.75rem}.pt-1\.5{padding-top:.375rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[9px\]{font-size:9px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.normal-case{text-transform:none}.italic{font-style:italic}.leading-7{line-height:1.75rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-\[0\.15em\]{letter-spacing:.15em}.tracking-\[0\.16em\]{letter-spacing:.16em}.tracking-\[0\.18em\]{letter-spacing:.18em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-100{--tw-text-opacity: 1;color:rgb(254 243 199 / var(--tw-text-opacity, 1))}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-300\/70{color:#fcd34db3}.text-amber-300\/80{color:#fcd34dcc}.text-amber-400\/70{color:#fbbf24b3}.text-amber-400\/80{color:#fbbf24cc}.text-bad{--tw-text-opacity: 1;color:color-mix(in srgb,var(--bad) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-brand{--tw-text-opacity: 1;color:color-mix(in srgb,var(--accent) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500\/80{color:#10b981cc}.text-foreground{--tw-text-opacity: 1;color:color-mix(in srgb,var(--text) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-good{--tw-text-opacity: 1;color:color-mix(in srgb,var(--good) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-indigo-300{--tw-text-opacity: 1;color:rgb(165 180 252 / var(--tw-text-opacity, 1))}.text-indigo-300\/70{color:#a5b4fcb3}.text-indigo-300\/80{color:#a5b4fccc}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-live{--tw-text-opacity: 1;color:color-mix(in srgb,var(--live) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-300\/70{color:#fca5a5b3}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/80{color:#f87171cc}.text-rose-200{--tw-text-opacity: 1;color:rgb(254 205 211 / var(--tw-text-opacity, 1))}.text-rose-300{--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.text-rose-300\/70{color:#fda4afb3}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-teal-300{--tw-text-opacity: 1;color:rgb(94 234 212 / var(--tw-text-opacity, 1))}.text-warn{--tw-text-opacity: 1;color:color-mix(in srgb,var(--warn) calc(var(--tw-text-opacity, 1) * 100%),transparent)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-zinc-100{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity, 1))}.text-zinc-200{--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))}.text-zinc-300{--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.text-zinc-400{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.text-zinc-50{--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.text-zinc-500{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.text-zinc-600{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.text-zinc-700{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.text-zinc-800{--tw-text-opacity: 1;color:rgb(39 39 42 / var(--tw-text-opacity, 1))}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-amber-500\/45{--tw-ring-color: rgb(245 158 11 / .45)}.ring-brand\/30{--tw-ring-color: color-mix(in srgb, var(--accent) 30% , transparent)}.ring-emerald-400\/60{--tw-ring-color: rgb(52 211 153 / .6)}.ring-emerald-500\/40{--tw-ring-color: rgb(16 185 129 / .4)}.ring-emerald-500\/50{--tw-ring-color: rgb(16 185 129 / .5)}.ring-indigo-500\/40{--tw-ring-color: rgb(99 102 241 / .4)}.ring-line-soft{--tw-ring-opacity: 1;--tw-ring-color: color-mix(in srgb, var(--line-soft) calc(var(--tw-ring-opacity, 1) * 100%), transparent)}.ring-red-500\/40{--tw-ring-color: rgb(239 68 68 / .4)}.ring-red-500\/50{--tw-ring-color: rgb(239 68 68 / .5)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-500{transition-duration:.5s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}:root{--bg: #09090b;--panel: #0c0c0f;--panel-2: #101017;--line: #1c1c22;--line-soft: #16161a;--text: #e7e7ea;--muted: #76767f;--good: #34d399;--warn: #fbbf24;--bad: #f87171;--live: #60a5fa;--accent: #a3e635}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--text);font-family:Space Grotesk,ui-sans-serif,system-ui,sans-serif;-webkit-font-smoothing:antialiased}.app-bg{position:fixed;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;background-image:radial-gradient(900px 400px at 78% -8%,color-mix(in srgb,var(--accent) 8%,transparent),transparent 70%),linear-gradient(to right,var(--line-soft) 1px,transparent 1px),linear-gradient(to bottom,var(--line-soft) 1px,transparent 1px);background-size:100% 100%,44px 44px,44px 44px;-webkit-mask-image:linear-gradient(to bottom,black,black 60%,transparent);mask-image:linear-gradient(to bottom,black,black 60%,transparent);opacity:.5}.mono{font-family:JetBrains Mono,ui-monospace,monospace}.tnum{font-variant-numeric:tabular-nums}.s-running{color:var(--live)}.s-suspended{color:var(--warn)}.s-sleeping{color:#818cf8}.s-awaiting{color:var(--warn)}.s-completed{color:var(--good)}.s-failed{color:var(--bad)}.s-cancelling{color:#f59e0b}.s-cancelled{color:#71717a}.s-dead{color:#e11d48}.s-pending{color:#94a3b8}.s-no-worker{color:#fb923c}.s-queued{color:#a78bfa}.s-stale{color:#fb923c}.dot{width:7px;height:7px;border-radius:999px;background:currentColor;box-shadow:0 0 0 3px color-mix(in srgb,currentColor 18%,transparent)}.pulse{animation:pulse 1.6s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}@keyframes rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.rise{animation:rise .32s cubic-bezier(.2,.7,.2,1) both}.react-flow{--xy-background-color: transparent;--xy-edge-stroke-default: var(--line);--xy-attribution-background-color: transparent}.react-flow__edge-path{stroke-width:1.5}.react-flow__controls{border:1px solid var(--line);border-radius:8px;overflow:hidden;box-shadow:none}.react-flow__controls-button{background:var(--panel);border-bottom:1px solid var(--line);color:var(--muted);fill:var(--muted)}.react-flow__controls-button:hover{background:#18181b}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#26262c;border:3px solid var(--bg);border-radius:999px}.placeholder\:text-zinc-600::-moz-placeholder{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.placeholder\:text-zinc-600::placeholder{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.focus-within\:border-zinc-600:focus-within{--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-amber-500\/40:hover{border-color:#f59e0b66}.hover\:border-indigo-400\/60:hover{border-color:#818cf899}.hover\:border-red-400\/60:hover{border-color:#f8717199}.hover\:border-sky-400\/60:hover{border-color:#38bdf899}.hover\:border-teal-400\/60:hover{border-color:#2dd4bf99}.hover\:border-zinc-500:hover{--tw-border-opacity: 1;border-color:rgb(113 113 122 / var(--tw-border-opacity, 1))}.hover\:border-zinc-600:hover{--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.hover\:bg-brand\/20:hover{background-color:color-mix(in srgb,var(--accent) 20%,transparent)}.hover\:bg-brand\/40:hover{background-color:color-mix(in srgb,var(--accent) 40%,transparent)}.hover\:bg-indigo-500\/20:hover{background-color:#6366f133}.hover\:bg-rose-500\/20:hover{background-color:#f43f5e33}.hover\:bg-sky-500\/20:hover{background-color:#0ea5e933}.hover\:bg-warn\/20:hover{background-color:color-mix(in srgb,var(--warn) 20%,transparent)}.hover\:bg-zinc-800:hover{--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-800\/50:hover{background-color:#27272a80}.hover\:bg-zinc-900\/50:hover{background-color:#18181b80}.hover\:bg-zinc-900\/60:hover{background-color:#18181b99}.hover\:text-amber-100:hover{--tw-text-opacity: 1;color:rgb(254 243 199 / var(--tw-text-opacity, 1))}.hover\:text-indigo-100:hover{--tw-text-opacity: 1;color:rgb(224 231 255 / var(--tw-text-opacity, 1))}.hover\:text-indigo-200:hover{--tw-text-opacity: 1;color:rgb(199 210 254 / var(--tw-text-opacity, 1))}.hover\:text-sky-200:hover{--tw-text-opacity: 1;color:rgb(186 230 253 / var(--tw-text-opacity, 1))}.hover\:text-teal-200:hover{--tw-text-opacity: 1;color:rgb(153 246 228 / var(--tw-text-opacity, 1))}.hover\:text-zinc-100:hover{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity, 1))}.hover\:text-zinc-200:hover{--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))}.hover\:text-zinc-300:hover{--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-zinc-600:focus{--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: color-mix(in srgb, var(--accent) calc(var(--tw-ring-opacity, 1) * 100%), transparent)}.enabled\:hover\:bg-rose-500\/25:hover:enabled{background-color:#f43f5e40}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.data-\[active\]\:bg-zinc-700[data-active]{--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.data-\[active\]\:text-zinc-100[data-active]{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity, 1))}
@@ -1 +1 @@
1
- import{a as t,c as r,j as e,r as s,Q as n,A as o}from"./index-CEV7yPmk.js";const i=new t({defaultOptions:{queries:{refetchInterval:2e3,refetchOnWindowFocus:!1}}});r(document.getElementById("root")).render(e.jsx(s.StrictMode,{children:e.jsx(n,{client:i,children:e.jsx(o,{})})}));
1
+ import{a as t,c as r,j as e,r as s,Q as n,A as o}from"./index-B-wtX4GV.js";const i=new t({defaultOptions:{queries:{refetchInterval:2e3,refetchOnWindowFocus:!1}}});r(document.getElementById("root")).render(e.jsx(s.StrictMode,{children:e.jsx(n,{client:i,children:e.jsx(o,{})})}));
@@ -1 +1 @@
1
- import{a as b,c as x,j as u,r as I,Q as S,A as j,R as q}from"./index-CEV7yPmk.js";const l=Date.parse("2026-07-29T09:14:00.000Z"),e=r=>new Date(l+r).toISOString(),h=[{id:"ord-9f2c1a4b",workflow:"checkout",workflowVersion:"4",status:"failed",namespace:"default",origin:"acme-storefront",createdAt:e(-62e4),updatedAt:e(-54e4),tags:["tier:pro","region:us-east"],searchAttributes:{amount:249,tier:"pro"},input:{orderId:"ord-9f2c1a4b",amount:249,currency:"USD"},error:{message:"charge declined: card_expired (stripe: card_error)"}},{id:"ord-77ab3012",workflow:"checkout",workflowVersion:"4",status:"completed",origin:"acme-storefront",createdAt:e(-18e5),updatedAt:e(-1744e3),tags:["tier:free"],input:{orderId:"ord-77ab3012",amount:19},output:{charged:!0}},{id:"inv-2b91ee70",workflow:"invoiceSettlement",workflowVersion:"2",status:"completed",createdAt:e(-21e5),updatedAt:e(-201e4),input:{invoice:"INV-4471"}},{id:"shp-01d4f7c9",workflow:"shipmentSync",workflowVersion:"1",status:"running",origin:"@dudousxd/nestjs-catalog-pipeline",createdAt:e(-9e4),updatedAt:e(-4e3),input:{carrier:"dhl"}},{id:"shp-55c2aa18",workflow:"shipmentSync",workflowVersion:"1",status:"completed",origin:"@dudousxd/nestjs-catalog-pipeline",createdAt:e(-34e5),updatedAt:e(-333e4),input:{carrier:"ups"}},{id:"rep-8812cd44",workflow:"nightlyReport",workflowVersion:"7",status:"suspended",namespace:"acme",origin:"@dudousxd/nestjs-agent",createdAt:e(-54e5),updatedAt:e(-3e5),waiting:{on:"signal",name:"approve"},input:{day:"2026-07-28"}},{id:"ord-1177fe22",workflow:"checkout",workflowVersion:"4",status:"completed",namespace:"acme",origin:"acme-storefront",createdAt:e(-72e5),updatedAt:e(-712e4),tags:["tier:pro"],input:{orderId:"ord-1177fe22",amount:640},output:{charged:!0}},{id:"bck-4410aa03",workflow:"backfillLedger",workflowVersion:"1",status:"cancelled",createdAt:e(-9e6),updatedAt:e(-888e4),input:{from:"2026-01-01"}},{id:"ord-6650bb91",workflow:"checkout",workflowVersion:"4",status:"pending",origin:"acme-storefront",createdAt:e(-12e3),updatedAt:e(-12e3),input:{orderId:"ord-6650bb91",amount:78}}],M=[{runId:"ord-9f2c1a4b",seq:1,name:"reserveInventory",kind:"remote",status:"completed",attempts:1,workerGroup:"inventory",enqueuedAt:e(-619e3),startedAt:e(-618200),finishedAt:e(-615900),input:{sku:"SKU-8823",qty:1},output:{reservationId:"rsv-77120"}},{runId:"ord-9f2c1a4b",seq:2,name:"quoteShipping",kind:"remote",status:"completed",attempts:1,workerGroup:"shipping",enqueuedAt:e(-615800),startedAt:e(-615100),finishedAt:e(-612400),output:{carrier:"dhl",cents:890}},{runId:"ord-9f2c1a4b",seq:3,name:"chargeCard",kind:"remote",status:"failed",attempts:3,workerGroup:"payments",enqueuedAt:e(-612300),startedAt:e(-611800),finishedAt:e(-54e4),input:{amount:249,currency:"USD"},error:{message:"charge declined: card_expired (stripe: card_error)"},events:[{at:l-611700,level:"info",message:"attempt 1 → gateway timeout, retrying"},{at:l-59e4,level:"warn",message:"attempt 2 → gateway timeout, retrying"},{at:l-540200,level:"error",message:"attempt 3 → card_expired, giving up"}]}],R=[{runId:"shp-01d4f7c9",seq:1,name:"fetchManifest",kind:"remote",status:"completed",attempts:1,workerGroup:"shipping",enqueuedAt:e(-89e3),startedAt:e(-88400),finishedAt:e(-84100),output:{parcels:42}},{runId:"shp-01d4f7c9",seq:2,name:"syncCarrier",kind:"remote",status:"pending",attempts:1,workerGroup:"shipping",enqueuedAt:e(-84e3),startedAt:e(-83600),finishedAt:e(-4e3),input:{carrier:"dhl",parcels:42}}],_={"shp-01d4f7c9":{run:h[3],timeline:R,children:[]},"ord-9f2c1a4b":{run:h[0],timeline:M,children:[]}},C=[{group:"checkout",kind:"workflow",depth:0,liveWorkers:[{group:"checkout",instanceId:"api-7f9c4d-2",lastBeatAt:l-2e3,status:{runtime:"node",concurrency:{mode:"adaptive",limit:16,min:4,max:32},inFlight:3,rssPct:41,cpuPct:22,throughputPerMin:118,p95Ms:740,lastAdjust:{at:l-61e3,from:12,to:16,reason:"grow"}}}]},{group:"payments",kind:"step",depth:2,liveWorkers:[{group:"payments",instanceId:"worker-payments-5b81",lastBeatAt:l-3500,status:{runtime:"node",concurrency:{mode:"fixed",limit:8},inFlight:7,rssPct:88,cpuPct:63,throughputPerMin:44,p95Ms:2310}}]},{group:"inventory",kind:"step",depth:0,liveWorkers:[{group:"inventory",instanceId:"worker-inventory-11ce",lastBeatAt:l-1200,status:{runtime:"python",concurrency:{mode:"fixed",limit:4},inFlight:1}}]},{group:"shipping",kind:"step",depth:6,liveWorkers:[]}],V={role:"control-plane"};function N(r){const t=new Map;for(const[n,s]of new URLSearchParams(r??"")){const i=/^filter\[where\]\[(\d+)\]\[(field|operator|value)\](?:\[(\d+)\])?$/.exec(n);if(!i)continue;const[,o,c,f]=i,a=t.get(o)??{field:"",operator:"",value:""};if(c==="value"&&f!==void 0){const d=Array.isArray(a.value)?a.value:[];d[Number(f)]=s,a.value=d}else c==="value"?a.value=s:a[c]=s;t.set(o,a)}return[...t.entries()].sort(([n],[s])=>Number(n)-Number(s)).map(([,n])=>n)}function v(r,t){var n;if(t==="tag")return r.tags??[];if(t==="namespace")return[r.namespace??"default"];if(t==="origin")return[r.origin??null];if(t==="status")return[r.status];if(t==="workflow")return[r.workflow];if(t==="attr")return Object.keys(r.searchAttributes??{});if(t.startsWith("attr.")){const s=(n=r.searchAttributes)==null?void 0:n[t.slice(5)];return s===void 0?[]:[String(s)]}return[]}function w(r){return h.filter(t=>N(r).every(n=>{const s=v(t,n.field);if(n.operator==="isNull")return s.includes(null);const i=Array.isArray(n.value)?n.value:[n.value];return s.some(o=>o!==null&&i.includes(o))}))}function P(r){var i;const[t,n]=r.split("?");if(t==="/runs")return w(n);if(t==="/runs/facets"){const o=new Map;for(const c of w(n)){const f=c.origin??null,a=`${c.status}|${f}`,d=o.get(a)??{status:c.status,origin:f,count:0};d.count+=1,o.set(a,d)}return[...o.values()]}if(t==="/runs/values"){const o=new URLSearchParams(n??""),c=o.get("groupByCount[field]")??"",f=Number(o.get("groupByCount[limit]")??100),a=new Map;for(const d of w(n))for(const g of v(d,c))a.set(g,(a.get(g)??0)+1);return[...a].map(([d,g])=>({value:d,count:g})).sort((d,g)=>g.count-d.count||String(d.value).localeCompare(String(g.value))).slice(0,f)}if(t==="/workers")return C;if(t==="/topology")return V;const s=(i=t==null?void 0:t.match(/^\/runs\/(.+)$/))==null?void 0:i[1];if(s){const o=decodeURIComponent(s);return _[o]??{run:h.find(c=>c.id===o),timeline:[],children:[]}}}function T(){const r=window.fetch.bind(window);window.fetch=async(t,n)=>{const i=(typeof t=="string"?t:t instanceof URL?t.href:t.url).match(/\/durable\/api(\/.*)$/),o=i!=null&&i[1]?P(i[1]):void 0;return o===void 0?r(t,n):new Response(JSON.stringify(o),{status:200,headers:{"content-type":"application/json"}})}}const p=r=>new Date(r).toISOString(),m=Date.parse("2026-06-22T14:00:00.000Z"),U="gather:1",O=[{name:"handle_AF_FLEET",start:2e3,end:8200},{name:"handle_MEL",start:2120,end:6900},{name:"handle_METADATA",start:2050,end:5400},{name:"handle_MVR",start:2300,end:9600,failed:!0},{name:"handle_SCHED_MX",start:2080,end:7300},{name:"handle_SUBWO",start:2260,end:8900},{name:"handle_UTIL",start:2010,end:4700}],D=O.map((r,t)=>({runId:"mock-run",seq:2+t,name:r.name,kind:"remote",status:r.failed?"failed":"completed",parallelGroup:U,attempts:1,workerGroup:"gather",startedAt:p(m+r.start),finishedAt:p(m+r.end),...r.failed?{error:{message:"MVR lookup timed out after 7s"}}:{}})),E=[{runId:"mock-run",seq:1,name:"setup",kind:"local",status:"completed",attempts:1,startedAt:p(m+0),finishedAt:p(m+1800)},...D,{runId:"mock-run",seq:9,name:"finalize",kind:"local",status:"completed",attempts:1,startedAt:p(m+9700),finishedAt:p(m+11200)}],A={run:{id:"mock-run",workflow:"gatherAircraftData",workflowVersion:"1",status:"completed",createdAt:p(m),updatedAt:p(m+11200)},timeline:E},F=new b({defaultOptions:{queries:{refetchInterval:!1,refetchOnWindowFocus:!1}}}),k=()=>{},y=new URLSearchParams(window.location.search).get("view")==="console";y&&T();x(document.getElementById("root")).render(u.jsx(I.StrictMode,{children:u.jsx(S,{client:F,children:y?u.jsx(j,{}):u.jsxs(u.Fragment,{children:[u.jsx("div",{className:"app-bg"}),u.jsxs("div",{className:"relative z-10 mx-auto max-w-3xl p-8",children:[u.jsx("div",{className:"mb-3 mono text-[10px] uppercase tracking-[0.2em] text-zinc-500",children:"preview · parallel-fan timeline"}),u.jsx("div",{className:"rounded-lg border border-line bg-panel p-2",children:u.jsx(q,{run:A.run,timeline:A.timeline,depth:0,selectedKey:void 0,onSelect:k,onOpenRun:k,expanded:new Set,onToggleChild:k})})]})]})})}));
1
+ import{a as b,c as x,j as u,r as I,Q as S,A as j,R as q}from"./index-B-wtX4GV.js";const l=Date.parse("2026-07-29T09:14:00.000Z"),e=r=>new Date(l+r).toISOString(),h=[{id:"ord-9f2c1a4b",workflow:"checkout",workflowVersion:"4",status:"failed",namespace:"default",origin:"acme-storefront",createdAt:e(-62e4),updatedAt:e(-54e4),tags:["tier:pro","region:us-east"],searchAttributes:{amount:249,tier:"pro"},input:{orderId:"ord-9f2c1a4b",amount:249,currency:"USD"},error:{message:"charge declined: card_expired (stripe: card_error)"}},{id:"ord-77ab3012",workflow:"checkout",workflowVersion:"4",status:"completed",origin:"acme-storefront",createdAt:e(-18e5),updatedAt:e(-1744e3),tags:["tier:free"],input:{orderId:"ord-77ab3012",amount:19},output:{charged:!0}},{id:"inv-2b91ee70",workflow:"invoiceSettlement",workflowVersion:"2",status:"completed",createdAt:e(-21e5),updatedAt:e(-201e4),input:{invoice:"INV-4471"}},{id:"shp-01d4f7c9",workflow:"shipmentSync",workflowVersion:"1",status:"running",origin:"@dudousxd/nestjs-catalog-pipeline",createdAt:e(-9e4),updatedAt:e(-4e3),input:{carrier:"dhl"}},{id:"shp-55c2aa18",workflow:"shipmentSync",workflowVersion:"1",status:"completed",origin:"@dudousxd/nestjs-catalog-pipeline",createdAt:e(-34e5),updatedAt:e(-333e4),input:{carrier:"ups"}},{id:"rep-8812cd44",workflow:"nightlyReport",workflowVersion:"7",status:"suspended",namespace:"acme",origin:"@dudousxd/nestjs-agent",createdAt:e(-54e5),updatedAt:e(-3e5),waiting:{on:"signal",name:"approve"},input:{day:"2026-07-28"}},{id:"ord-1177fe22",workflow:"checkout",workflowVersion:"4",status:"completed",namespace:"acme",origin:"acme-storefront",createdAt:e(-72e5),updatedAt:e(-712e4),tags:["tier:pro"],input:{orderId:"ord-1177fe22",amount:640},output:{charged:!0}},{id:"bck-4410aa03",workflow:"backfillLedger",workflowVersion:"1",status:"cancelled",createdAt:e(-9e6),updatedAt:e(-888e4),input:{from:"2026-01-01"}},{id:"ord-6650bb91",workflow:"checkout",workflowVersion:"4",status:"pending",origin:"acme-storefront",createdAt:e(-12e3),updatedAt:e(-12e3),input:{orderId:"ord-6650bb91",amount:78}}],M=[{runId:"ord-9f2c1a4b",seq:1,name:"reserveInventory",kind:"remote",status:"completed",attempts:1,workerGroup:"inventory",enqueuedAt:e(-619e3),startedAt:e(-618200),finishedAt:e(-615900),input:{sku:"SKU-8823",qty:1},output:{reservationId:"rsv-77120"}},{runId:"ord-9f2c1a4b",seq:2,name:"quoteShipping",kind:"remote",status:"completed",attempts:1,workerGroup:"shipping",enqueuedAt:e(-615800),startedAt:e(-615100),finishedAt:e(-612400),output:{carrier:"dhl",cents:890}},{runId:"ord-9f2c1a4b",seq:3,name:"chargeCard",kind:"remote",status:"failed",attempts:3,workerGroup:"payments",enqueuedAt:e(-612300),startedAt:e(-611800),finishedAt:e(-54e4),input:{amount:249,currency:"USD"},error:{message:"charge declined: card_expired (stripe: card_error)"},events:[{at:l-611700,level:"info",message:"attempt 1 → gateway timeout, retrying"},{at:l-59e4,level:"warn",message:"attempt 2 → gateway timeout, retrying"},{at:l-540200,level:"error",message:"attempt 3 → card_expired, giving up"}]}],R=[{runId:"shp-01d4f7c9",seq:1,name:"fetchManifest",kind:"remote",status:"completed",attempts:1,workerGroup:"shipping",enqueuedAt:e(-89e3),startedAt:e(-88400),finishedAt:e(-84100),output:{parcels:42}},{runId:"shp-01d4f7c9",seq:2,name:"syncCarrier",kind:"remote",status:"pending",attempts:1,workerGroup:"shipping",enqueuedAt:e(-84e3),startedAt:e(-83600),finishedAt:e(-4e3),input:{carrier:"dhl",parcels:42}}],_={"shp-01d4f7c9":{run:h[3],timeline:R,children:[]},"ord-9f2c1a4b":{run:h[0],timeline:M,children:[]}},C=[{group:"checkout",kind:"workflow",depth:0,liveWorkers:[{group:"checkout",instanceId:"api-7f9c4d-2",lastBeatAt:l-2e3,status:{runtime:"node",concurrency:{mode:"adaptive",limit:16,min:4,max:32},inFlight:3,rssPct:41,cpuPct:22,throughputPerMin:118,p95Ms:740,lastAdjust:{at:l-61e3,from:12,to:16,reason:"grow"}}}]},{group:"payments",kind:"step",depth:2,liveWorkers:[{group:"payments",instanceId:"worker-payments-5b81",lastBeatAt:l-3500,status:{runtime:"node",concurrency:{mode:"fixed",limit:8},inFlight:7,rssPct:88,cpuPct:63,throughputPerMin:44,p95Ms:2310}}]},{group:"inventory",kind:"step",depth:0,liveWorkers:[{group:"inventory",instanceId:"worker-inventory-11ce",lastBeatAt:l-1200,status:{runtime:"python",concurrency:{mode:"fixed",limit:4},inFlight:1}}]},{group:"shipping",kind:"step",depth:6,liveWorkers:[]}],V={role:"control-plane"};function N(r){const t=new Map;for(const[n,s]of new URLSearchParams(r??"")){const i=/^filter\[where\]\[(\d+)\]\[(field|operator|value)\](?:\[(\d+)\])?$/.exec(n);if(!i)continue;const[,o,c,f]=i,a=t.get(o)??{field:"",operator:"",value:""};if(c==="value"&&f!==void 0){const d=Array.isArray(a.value)?a.value:[];d[Number(f)]=s,a.value=d}else c==="value"?a.value=s:a[c]=s;t.set(o,a)}return[...t.entries()].sort(([n],[s])=>Number(n)-Number(s)).map(([,n])=>n)}function v(r,t){var n;if(t==="tag")return r.tags??[];if(t==="namespace")return[r.namespace??"default"];if(t==="origin")return[r.origin??null];if(t==="status")return[r.status];if(t==="workflow")return[r.workflow];if(t==="attr")return Object.keys(r.searchAttributes??{});if(t.startsWith("attr.")){const s=(n=r.searchAttributes)==null?void 0:n[t.slice(5)];return s===void 0?[]:[String(s)]}return[]}function w(r){return h.filter(t=>N(r).every(n=>{const s=v(t,n.field);if(n.operator==="isNull")return s.includes(null);const i=Array.isArray(n.value)?n.value:[n.value];return s.some(o=>o!==null&&i.includes(o))}))}function P(r){var i;const[t,n]=r.split("?");if(t==="/runs")return w(n);if(t==="/runs/facets"){const o=new Map;for(const c of w(n)){const f=c.origin??null,a=`${c.status}|${f}`,d=o.get(a)??{status:c.status,origin:f,count:0};d.count+=1,o.set(a,d)}return[...o.values()]}if(t==="/runs/values"){const o=new URLSearchParams(n??""),c=o.get("groupByCount[field]")??"",f=Number(o.get("groupByCount[limit]")??100),a=new Map;for(const d of w(n))for(const g of v(d,c))a.set(g,(a.get(g)??0)+1);return[...a].map(([d,g])=>({value:d,count:g})).sort((d,g)=>g.count-d.count||String(d.value).localeCompare(String(g.value))).slice(0,f)}if(t==="/workers")return C;if(t==="/topology")return V;const s=(i=t==null?void 0:t.match(/^\/runs\/(.+)$/))==null?void 0:i[1];if(s){const o=decodeURIComponent(s);return _[o]??{run:h.find(c=>c.id===o),timeline:[],children:[]}}}function T(){const r=window.fetch.bind(window);window.fetch=async(t,n)=>{const i=(typeof t=="string"?t:t instanceof URL?t.href:t.url).match(/\/durable\/api(\/.*)$/),o=i!=null&&i[1]?P(i[1]):void 0;return o===void 0?r(t,n):new Response(JSON.stringify(o),{status:200,headers:{"content-type":"application/json"}})}}const p=r=>new Date(r).toISOString(),m=Date.parse("2026-06-22T14:00:00.000Z"),U="gather:1",O=[{name:"handle_AF_FLEET",start:2e3,end:8200},{name:"handle_MEL",start:2120,end:6900},{name:"handle_METADATA",start:2050,end:5400},{name:"handle_MVR",start:2300,end:9600,failed:!0},{name:"handle_SCHED_MX",start:2080,end:7300},{name:"handle_SUBWO",start:2260,end:8900},{name:"handle_UTIL",start:2010,end:4700}],D=O.map((r,t)=>({runId:"mock-run",seq:2+t,name:r.name,kind:"remote",status:r.failed?"failed":"completed",parallelGroup:U,attempts:1,workerGroup:"gather",startedAt:p(m+r.start),finishedAt:p(m+r.end),...r.failed?{error:{message:"MVR lookup timed out after 7s"}}:{}})),E=[{runId:"mock-run",seq:1,name:"setup",kind:"local",status:"completed",attempts:1,startedAt:p(m+0),finishedAt:p(m+1800)},...D,{runId:"mock-run",seq:9,name:"finalize",kind:"local",status:"completed",attempts:1,startedAt:p(m+9700),finishedAt:p(m+11200)}],A={run:{id:"mock-run",workflow:"gatherAircraftData",workflowVersion:"1",status:"completed",createdAt:p(m),updatedAt:p(m+11200)},timeline:E},F=new b({defaultOptions:{queries:{refetchInterval:!1,refetchOnWindowFocus:!1}}}),k=()=>{},y=new URLSearchParams(window.location.search).get("view")==="console";y&&T();x(document.getElementById("root")).render(u.jsx(I.StrictMode,{children:u.jsx(S,{client:F,children:y?u.jsx(j,{}):u.jsxs(u.Fragment,{children:[u.jsx("div",{className:"app-bg"}),u.jsxs("div",{className:"relative z-10 mx-auto max-w-3xl p-8",children:[u.jsx("div",{className:"mb-3 mono text-[10px] uppercase tracking-[0.2em] text-zinc-500",children:"preview · parallel-fan timeline"}),u.jsx("div",{className:"rounded-lg border border-line bg-panel p-2",children:u.jsx(q,{run:A.run,timeline:A.timeline,depth:0,selectedKey:void 0,onSelect:k,onOpenRun:k,expanded:new Set,onToggleChild:k})})]})]})})}));
@@ -4,9 +4,9 @@
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <title>durable · scale bench</title>
7
- <script type="module" crossorigin src="/durable/assets/bench-Db-gqOEF.js"></script>
8
- <link rel="modulepreload" crossorigin href="/durable/assets/index-CEV7yPmk.js">
9
- <link rel="stylesheet" crossorigin href="/durable/assets/index-BbR4CZ1K.css">
7
+ <script type="module" crossorigin src="/durable/assets/bench-DCclNvcZ.js"></script>
8
+ <link rel="modulepreload" crossorigin href="/durable/assets/index-B-wtX4GV.js">
9
+ <link rel="stylesheet" crossorigin href="/durable/assets/index-CJdk28vt.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -10,9 +10,9 @@
10
10
  rel="stylesheet"
11
11
  />
12
12
  <title>durable · control plane</title>
13
- <script type="module" crossorigin src="/durable/assets/index-4tEXGRlA.js"></script>
14
- <link rel="modulepreload" crossorigin href="/durable/assets/index-CEV7yPmk.js">
15
- <link rel="stylesheet" crossorigin href="/durable/assets/index-BbR4CZ1K.css">
13
+ <script type="module" crossorigin src="/durable/assets/index-ChjKRQZx.js"></script>
14
+ <link rel="modulepreload" crossorigin href="/durable/assets/index-B-wtX4GV.js">
15
+ <link rel="stylesheet" crossorigin href="/durable/assets/index-CJdk28vt.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
@@ -10,9 +10,9 @@
10
10
  rel="stylesheet"
11
11
  />
12
12
  <title>durable · parallel-fan preview</title>
13
- <script type="module" crossorigin src="/durable/assets/preview-BvCp1zR5.js"></script>
14
- <link rel="modulepreload" crossorigin href="/durable/assets/index-CEV7yPmk.js">
15
- <link rel="stylesheet" crossorigin href="/durable/assets/index-BbR4CZ1K.css">
13
+ <script type="module" crossorigin src="/durable/assets/preview-CdsjvOrK.js"></script>
14
+ <link rel="modulepreload" crossorigin href="/durable/assets/index-B-wtX4GV.js">
15
+ <link rel="stylesheet" crossorigin href="/durable/assets/index-CJdk28vt.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/nestjs-durable-dashboard",
3
- "version": "0.53.0",
3
+ "version": "0.55.0",
4
4
  "description": "Embedded control plane (runs, step timeline, retry/cancel) for nestjs-durable — bundled React SPA served by NestJS",
5
5
  "license": "MIT",
6
6
  "author": "Davide Carvalho",
@@ -37,11 +37,6 @@
37
37
  "types": "./dist/client/durable-client.d.ts",
38
38
  "import": "./dist/client/durable-client.js",
39
39
  "default": "./dist/client/durable-client.js"
40
- },
41
- "./react": {
42
- "types": "./dist/react/index.d.ts",
43
- "import": "./dist/react/index.js",
44
- "default": "./dist/react/index.js"
45
40
  }
46
41
  },
47
42
  "files": [
@@ -55,16 +50,16 @@
55
50
  "@dudousxd/nestjs-filter": ">=1.33.0 <2.0.0",
56
51
  "@nestjs/common": "^10.0.0 || ^11.0.0 || ^12.0.0",
57
52
  "@nestjs/core": "^10.0.0 || ^11.0.0 || ^12.0.0",
58
- "react": ">=18.0.0",
59
- "react-dom": ">=18.0.0",
60
53
  "reflect-metadata": "^0.2.0",
61
54
  "rxjs": "^7.0.0"
62
55
  },
63
56
  "devDependencies": {
64
57
  "@base-ui/react": "1.8.0",
65
58
  "@dudousxd/nestjs-filter": "1.33.0",
59
+ "@nestjs/authorization": "0.1.3",
66
60
  "@nestjs/common": "12.0.1",
67
61
  "@nestjs/core": "12.0.1",
62
+ "@nestjs/idempotency": "0.0.4",
68
63
  "@nestjs/platform-express": "12.0.1",
69
64
  "@tanstack/react-query": "5.102.8",
70
65
  "@tanstack/react-virtual": "3.14.13",
@@ -90,18 +85,10 @@
90
85
  "tsup": "8.3.5",
91
86
  "typescript": "5.9.3",
92
87
  "vite": "5.4.21",
93
- "@dudousxd/nestjs-durable-core": "^0.85.12"
94
- },
95
- "peerDependenciesMeta": {
96
- "react": {
97
- "optional": true
98
- },
99
- "react-dom": {
100
- "optional": true
101
- }
88
+ "@dudousxd/nestjs-durable-core": "^0.88.0"
102
89
  },
103
90
  "scripts": {
104
- "build": "vite build && tsup && tsc -p tsconfig.client.json && tsc -p tsconfig.react.json",
91
+ "build": "vite build && tsup && tsc -p tsconfig.client.json",
105
92
  "typecheck": "tsc -p tsconfig.server.json --noEmit && tsc -p tsconfig.app.json --noEmit"
106
93
  }
107
94
  }
@@ -1,63 +0,0 @@
1
- /**
2
- * Headless client for opening the console from YOUR app.
3
- *
4
- * The console SPA is served at a literal path and knows nothing about your app's auth, so a plain
5
- * browser navigation to it carries no identity. Mode A closes that gap: an XHR from inside your app
6
- * — which DOES carry your auth — posts to the console's session endpoint, the `session` hook
7
- * decides, and the library answers with its own signed cookie. The navigation that follows rides it.
8
- *
9
- * No UI here on purpose: you own the button, the page and the copy. This module owns the two things
10
- * a host would otherwise have to rediscover — where the session endpoint actually lives, and how to
11
- * call it without the failure mode below.
12
- */
13
- /**
14
- * Where `POST` mints the console session cookie.
15
- *
16
- * Derived from `basePath` rather than hardcoded by the caller: this package owns the route (the
17
- * auth controller is mounted relative to `basePath` by `RouterModule`), so a host that hardcodes it
18
- * is guessing at something that can change under a version bump — with no compile error when it
19
- * does, because the break only shows up as a 404 at runtime.
20
- */
21
- export declare function durableConsoleSessionUrl(basePath?: string): string;
22
- /** Where the console SPA itself is served. */
23
- export declare function durableConsoleUrl(basePath?: string): string;
24
- export interface OpenConsoleOptions {
25
- /** Where the console is mounted. MUST match `DurableDashboardModule.forRoot({ basePath })`. */
26
- basePath?: string;
27
- /**
28
- * Headers for the mint request — in practice your app's `Authorization` header. A function (sync
29
- * or async) is accepted so a token can be read at call time rather than captured at wiring time,
30
- * which is what a refreshing token needs.
31
- */
32
- headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
33
- /** Injected for tests and non-browser callers. Defaults to the global `fetch`. */
34
- fetch?: typeof globalThis.fetch;
35
- signal?: AbortSignal;
36
- /**
37
- * Performs the navigation after a successful mint. Defaults to `location.assign`. Override to
38
- * route through your own router, or to open in a new tab.
39
- */
40
- navigate?: (url: string) => void;
41
- }
42
- /** Thrown when the session could not be minted. Never thrown after a successful mint. */
43
- export declare class ConsoleSessionError extends Error {
44
- readonly url: string;
45
- /** The HTTP status, or `undefined` when the request never produced one (network error). */
46
- readonly status?: number | undefined;
47
- constructor(message: string, url: string,
48
- /** The HTTP status, or `undefined` when the request never produced one (network error). */
49
- status?: number | undefined);
50
- }
51
- /**
52
- * Mint the console session cookie. Resolves on success; throws {@link ConsoleSessionError} on
53
- * refusal. Use this directly when you want to mint without navigating (a pre-flight check, or a
54
- * link the user opens later).
55
- */
56
- export declare function mintDurableConsoleSession(options?: OpenConsoleOptions): Promise<void>;
57
- /**
58
- * Mint the session, then navigate to the console. Throws without navigating when the mint is
59
- * refused, so a denied user gets a real error instead of landing on the console's
60
- * "no session" page — which reads as a bug rather than a permission decision.
61
- */
62
- export declare function openDurableConsole(options?: OpenConsoleOptions): Promise<void>;
63
- //# sourceMappingURL=console-session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"console-session.d.ts","sourceRoot":"","sources":["../../src/client/console-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,GAAE,MAA0B,GAAG,MAAM,CAErF;AAED,8CAA8C;AAC9C,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAA0B,GAAG,MAAM,CAE9E;AAED,MAAM,WAAW,kBAAkB;IACjC,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACnE,kFAAkF;IAClF,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,yFAAyF;AACzF,qBAAa,mBAAoB,SAAQ,KAAK;IAG1C,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBAHxB,OAAO,EAAE,MAAM,EACN,GAAG,EAAE,MAAM;IACpB,2FAA2F;IAClF,MAAM,CAAC,EAAE,MAAM,YAAA;CAK3B;AAOD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD/F;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF"}
@@ -1,107 +0,0 @@
1
- /**
2
- * Headless client for opening the console from YOUR app.
3
- *
4
- * The console SPA is served at a literal path and knows nothing about your app's auth, so a plain
5
- * browser navigation to it carries no identity. Mode A closes that gap: an XHR from inside your app
6
- * — which DOES carry your auth — posts to the console's session endpoint, the `session` hook
7
- * decides, and the library answers with its own signed cookie. The navigation that follows rides it.
8
- *
9
- * No UI here on purpose: you own the button, the page and the copy. This module owns the two things
10
- * a host would otherwise have to rediscover — where the session endpoint actually lives, and how to
11
- * call it without the failure mode below.
12
- */
13
- /** The mount default; matches `DurableDashboardModule.forRoot()`'s own `basePath` default. */
14
- const DEFAULT_BASE_PATH = '/durable';
15
- function normalizeBasePath(basePath) {
16
- const trimmed = basePath.trim().replace(/\/+$/, '');
17
- if (trimmed === '')
18
- return '';
19
- return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
20
- }
21
- /**
22
- * Where `POST` mints the console session cookie.
23
- *
24
- * Derived from `basePath` rather than hardcoded by the caller: this package owns the route (the
25
- * auth controller is mounted relative to `basePath` by `RouterModule`), so a host that hardcodes it
26
- * is guessing at something that can change under a version bump — with no compile error when it
27
- * does, because the break only shows up as a 404 at runtime.
28
- */
29
- export function durableConsoleSessionUrl(basePath = DEFAULT_BASE_PATH) {
30
- return `${normalizeBasePath(basePath)}/session`;
31
- }
32
- /** Where the console SPA itself is served. */
33
- export function durableConsoleUrl(basePath = DEFAULT_BASE_PATH) {
34
- return normalizeBasePath(basePath) || '/';
35
- }
36
- /** Thrown when the session could not be minted. Never thrown after a successful mint. */
37
- export class ConsoleSessionError extends Error {
38
- url;
39
- status;
40
- constructor(message, url,
41
- /** The HTTP status, or `undefined` when the request never produced one (network error). */
42
- status) {
43
- super(message);
44
- this.url = url;
45
- this.status = status;
46
- this.name = 'ConsoleSessionError';
47
- }
48
- }
49
- async function resolveHeaders(headers) {
50
- if (headers === undefined)
51
- return {};
52
- return typeof headers === 'function' ? await headers() : headers;
53
- }
54
- /**
55
- * Mint the console session cookie. Resolves on success; throws {@link ConsoleSessionError} on
56
- * refusal. Use this directly when you want to mint without navigating (a pre-flight check, or a
57
- * link the user opens later).
58
- */
59
- export async function mintDurableConsoleSession(options = {}) {
60
- const url = durableConsoleSessionUrl(options.basePath);
61
- const doFetch = options.fetch ?? globalThis.fetch;
62
- if (typeof doFetch !== 'function') {
63
- throw new ConsoleSessionError('No `fetch` available; pass one via `options.fetch`.', url);
64
- }
65
- let response;
66
- try {
67
- response = await doFetch(url, {
68
- method: 'POST',
69
- // The whole point: the response's Set-Cookie must stick, and the cookie must ride the
70
- // navigation that follows.
71
- credentials: 'include',
72
- headers: await resolveHeaders(options.headers),
73
- // Load-bearing, and the reason this helper exists rather than three lines at the call site.
74
- // `fetch` FOLLOWS redirects by default, so an app whose auth layer rewrites a 401 into a
75
- // "go to /signin" redirect makes this request resolve 200 against the sign-in HTML —
76
- // `response.ok` reads true, the caller navigates, and the user lands in a console with no
77
- // session, which looks exactly like a permissions bug. Handling the redirect explicitly turns
78
- // that into a clear error instead of a silent false success.
79
- redirect: 'manual',
80
- ...(options.signal ? { signal: options.signal } : {}),
81
- });
82
- }
83
- catch (cause) {
84
- throw new ConsoleSessionError(`Could not reach the console session endpoint at ${url}: ${String(cause)}`, url);
85
- }
86
- // `redirect: 'manual'` surfaces differently per runtime: browsers give an opaque response
87
- // (`type: 'opaqueredirect'`, status 0), Node/undici gives the real 3xx. Both mean the same thing.
88
- const redirected = response.type === 'opaqueredirect' || (response.status >= 300 && response.status < 400);
89
- if (redirected) {
90
- throw new ConsoleSessionError(`The console session endpoint at ${url} answered with a redirect instead of minting a session. Something in front of it — usually an auth middleware or exception filter that rewrites 401s into a sign-in redirect — is intercepting the response. Exempt this path from that rewrite so the real status reaches this caller.`, url, response.status || undefined);
91
- }
92
- if (!response.ok) {
93
- throw new ConsoleSessionError(`The console refused to open (HTTP ${response.status}).`, url, response.status);
94
- }
95
- }
96
- /**
97
- * Mint the session, then navigate to the console. Throws without navigating when the mint is
98
- * refused, so a denied user gets a real error instead of landing on the console's
99
- * "no session" page — which reads as a bug rather than a permission decision.
100
- */
101
- export async function openDurableConsole(options = {}) {
102
- await mintDurableConsoleSession(options);
103
- const target = durableConsoleUrl(options.basePath);
104
- const navigate = options.navigate ?? ((url) => globalThis.location?.assign(url));
105
- navigate(target);
106
- }
107
- //# sourceMappingURL=console-session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"console-session.js","sourceRoot":"","sources":["../../src/client/console-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,8FAA8F;AAC9F,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAErC,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB,iBAAiB;IAC3E,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC;AAClD,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,iBAAiB,CAAC,WAAmB,iBAAiB;IACpE,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;AAC5C,CAAC;AAqBD,yFAAyF;AACzF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAGjC;IAEA;IAJX,YACE,OAAe,EACN,GAAW;IACpB,2FAA2F;IAClF,MAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,QAAG,GAAH,GAAG,CAAQ;QAEX,WAAM,GAAN,MAAM,CAAS;QAGxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,KAAK,UAAU,cAAc,CAAC,OAAsC;IAClE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,UAA8B,EAAE;IAC9E,MAAM,GAAG,GAAG,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,mBAAmB,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,MAAM;YACd,sFAAsF;YACtF,2BAA2B;YAC3B,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE,MAAM,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9C,4FAA4F;YAC5F,yFAAyF;YACzF,qFAAqF;YACrF,0FAA0F;YAC1F,8FAA8F;YAC9F,6DAA6D;YAC7D,QAAQ,EAAE,QAAQ;YAClB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,mBAAmB,CAC3B,mDAAmD,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAC1E,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,0FAA0F;IAC1F,kGAAkG;IAClG,MAAM,UAAU,GACd,QAAQ,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC1F,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,mBAAmB,CAC3B,mCAAmC,GAAG,yRAAyR,EAC/T,GAAG,EACH,QAAQ,CAAC,MAAM,IAAI,SAAS,CAC7B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,mBAAmB,CAC3B,qCAAqC,QAAQ,CAAC,MAAM,IAAI,EACxD,GAAG,EACH,QAAQ,CAAC,MAAM,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA8B,EAAE;IACvE,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzF,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC"}
@@ -1,4 +0,0 @@
1
- export * from './use-open-console.js';
2
- export * from './open-console-button.js';
3
- export * from '../client/console-session.js';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AASA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,8BAA8B,CAAC"}
@@ -1,14 +0,0 @@
1
- // The React tier of `@dudousxd/nestjs-durable-dashboard`, published at the `./react` subpath so a
2
- // host that only mounts the NestJS module never pulls React in. Three levels, pick one:
3
- //
4
- // openDurableConsole(...) — no React at all (`./client`), you own everything
5
- // useOpenDurableConsole(...) — state for a launcher UI, you own the markup
6
- // <OpenDurableConsoleButton /> — drop-in, unstyled, forwards every button prop
7
- //
8
- // `openDurableConsoleMutationOptions` wires the same call into TanStack Query without this package
9
- // depending on TanStack.
10
- export * from './use-open-console.js';
11
- export * from './open-console-button.js';
12
- // Re-exported so a React consumer needs one import path, not two.
13
- export * from '../client/console-session.js';
14
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,wFAAwF;AACxF,EAAE;AACF,sFAAsF;AACtF,iFAAiF;AACjF,mFAAmF;AACnF,EAAE;AACF,mGAAmG;AACnG,yBAAyB;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,kEAAkE;AAClE,cAAc,8BAA8B,CAAC"}
@@ -1,26 +0,0 @@
1
- import type { ButtonHTMLAttributes, ReactNode } from 'react';
2
- import type { OpenConsoleOptions } from '../client/console-session.js';
3
- export interface OpenDurableConsoleButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick' | 'children'>, OpenConsoleOptions {
4
- /** Button label. Defaults to "Open Durable". */
5
- children?: ReactNode;
6
- /** Shown while the session is being minted. Defaults to "Opening…". */
7
- pendingLabel?: ReactNode;
8
- /**
9
- * Render the refusal yourself. Omit and the button renders a plain `<p role="alert">` under
10
- * itself; pass `null` to render nothing and read the error from {@link useOpenDurableConsole}.
11
- */
12
- renderError?: ((error: Error) => ReactNode) | null;
13
- }
14
- /**
15
- * Drop-in launcher: the top tier, for a host that just wants a working button.
16
- *
17
- * Deliberately unstyled — it emits a bare `<button>` and forwards `className`/`style`/every other
18
- * button prop, so it inherits whatever design system the host already has instead of importing CSS
19
- * that would fight it. When it doesn't fit, drop to {@link useOpenDurableConsole} (same behaviour,
20
- * your markup) or to `openDurableConsole` (no React at all).
21
- *
22
- * The error is rendered by default rather than swallowed: a refused mint is the case a launcher most
23
- * needs to surface, and a button that silently does nothing reads as broken rather than forbidden.
24
- */
25
- export declare function OpenDurableConsoleButton({ children, pendingLabel, renderError, basePath, headers, fetch: fetchImpl, signal, navigate, disabled, ...buttonProps }: OpenDurableConsoleButtonProps): import("react").JSX.Element;
26
- //# sourceMappingURL=open-console-button.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"open-console-button.d.ts","sourceRoot":"","sources":["../../src/react/open-console-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,MAAM,WAAW,6BACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,EAC3E,kBAAkB;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,uEAAuE;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC;CACpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,KAAK,EAAE,SAAS,EAChB,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,GAAG,WAAW,EACf,EAAE,6BAA6B,+BAyB/B"}
@@ -1,26 +0,0 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useOpenDurableConsole } from './use-open-console.js';
3
- /**
4
- * Drop-in launcher: the top tier, for a host that just wants a working button.
5
- *
6
- * Deliberately unstyled — it emits a bare `<button>` and forwards `className`/`style`/every other
7
- * button prop, so it inherits whatever design system the host already has instead of importing CSS
8
- * that would fight it. When it doesn't fit, drop to {@link useOpenDurableConsole} (same behaviour,
9
- * your markup) or to `openDurableConsole` (no React at all).
10
- *
11
- * The error is rendered by default rather than swallowed: a refused mint is the case a launcher most
12
- * needs to surface, and a button that silently does nothing reads as broken rather than forbidden.
13
- */
14
- export function OpenDurableConsoleButton({ children, pendingLabel, renderError, basePath, headers, fetch: fetchImpl, signal, navigate, disabled, ...buttonProps }) {
15
- const { open, isPending, error } = useOpenDurableConsole({
16
- ...(basePath !== undefined ? { basePath } : {}),
17
- ...(headers !== undefined ? { headers } : {}),
18
- ...(fetchImpl !== undefined ? { fetch: fetchImpl } : {}),
19
- ...(signal !== undefined ? { signal } : {}),
20
- ...(navigate !== undefined ? { navigate } : {}),
21
- });
22
- return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", ...buttonProps, onClick: open, disabled: disabled || isPending, "aria-busy": isPending || undefined, children: isPending ? (pendingLabel ?? 'Opening…') : (children ?? 'Open Durable') }), error &&
23
- renderError !== null &&
24
- (renderError?.(error) ?? _jsx("p", { role: "alert", children: error.message }))] }));
25
- }
26
- //# sourceMappingURL=open-console-button.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"open-console-button.js","sourceRoot":"","sources":["../../src/react/open-console-button.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAgB9D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,KAAK,EAAE,SAAS,EAChB,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,GAAG,WAAW,EACgB;IAC9B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,qBAAqB,CAAC;QACvD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC,CAAC;IAEH,OAAO,CACL,8BACE,iBACE,IAAI,EAAC,QAAQ,KACT,WAAW,EACf,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,QAAQ,IAAI,SAAS,eACpB,SAAS,IAAI,SAAS,YAEhC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,cAAc,CAAC,GACjE,EACR,KAAK;gBACJ,WAAW,KAAK,IAAI;gBACpB,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,YAAG,IAAI,EAAC,OAAO,YAAE,KAAK,CAAC,OAAO,GAAK,CAAC,IAC9D,CACJ,CAAC;AACJ,CAAC"}
@@ -1,40 +0,0 @@
1
- import { ConsoleSessionError, type OpenConsoleOptions } from '../client/console-session.js';
2
- /**
3
- * React layer over `openDurableConsole` — the middle tier between the bare function
4
- * (`../client/console-session.ts`) and the drop-in `<OpenDurableConsoleButton>`.
5
- *
6
- * You get the state a launcher UI actually needs (in-flight, error) and keep full control of the
7
- * markup. Nothing here is Durable-specific beyond the endpoint: it is a mint-then-navigate call with
8
- * the two states that call can be in.
9
- */
10
- export interface UseOpenConsoleResult {
11
- /** Start the mint-then-navigate. Never rejects — read `error` instead. */
12
- open: () => void;
13
- /**
14
- * True from the click until the navigation starts, or until it fails.
15
- *
16
- * With the DEFAULT navigation it stays true afterwards, because the page is being replaced and
17
- * flipping the button back to idle would flicker "ready to click again" on a document that is
18
- * leaving. With a caller-supplied `navigate` it is cleared on success — see {@link open}.
19
- */
20
- isPending: boolean;
21
- /** The last refusal, or `null`. Cleared when `open()` is called again. */
22
- error: ConsoleSessionError | null;
23
- /** Drop a stale error without retrying — e.g. when a dialog closes. */
24
- reset: () => void;
25
- }
26
- export declare function useOpenDurableConsole(options?: OpenConsoleOptions): UseOpenConsoleResult;
27
- /**
28
- * TanStack Query integration WITHOUT a TanStack dependency: the returned object is the shape
29
- * `useMutation` takes, so a host that already uses Query wires the launcher into its own cache,
30
- * devtools and error handling with no extra adapter — and a host that doesn't never pays for it.
31
- *
32
- * ```ts
33
- * const { mutate, isPending } = useMutation(openDurableConsoleMutationOptions({ headers }));
34
- * ```
35
- */
36
- export declare function openDurableConsoleMutationOptions(options?: OpenConsoleOptions): {
37
- mutationKey: readonly unknown[];
38
- mutationFn: () => Promise<void>;
39
- };
40
- //# sourceMappingURL=use-open-console.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-open-console.d.ts","sourceRoot":"","sources":["../../src/react/use-open-console.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EAExB,MAAM,8BAA8B,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB;;;;;;OAMG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,uEAAuE;IACvE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,kBAAuB,GAAG,oBAAoB,CA8D5F;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,GAAE,kBAAuB,GAAG;IACnF,WAAW,EAAE,SAAS,OAAO,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAKA"}