@octaviaflow/core 3.1.0-beta.100 → 3.1.0-beta.102

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.
package/dist/index.js CHANGED
@@ -34420,8 +34420,262 @@ var ToolCard = forwardRef96(
34420
34420
  );
34421
34421
  ToolCard.displayName = "ToolCard";
34422
34422
 
34423
- // src/components/TopBar/TopBar.tsx
34423
+ // src/components/ExpressionField/ExpressionField.tsx
34424
+ import {
34425
+ useCallback as useCallback50,
34426
+ useEffect as useEffect56,
34427
+ useId as useId61,
34428
+ useRef as useRef50
34429
+ } from "react";
34424
34430
  import { jsx as jsx147, jsxs as jsxs141 } from "react/jsx-runtime";
34431
+ var REF_TOKEN = /(\{\{ods:\/\/[^}]+\}\}|\$\{[^}]+\})/g;
34432
+ var ANY_TOKEN = /(\{\{[^}]+\}\}|\$\{[^}]+\})/g;
34433
+ var CALL_TOKEN = /^\{\{\s*(?:[A-Z_][A-Z0-9_]*|user\.[A-Za-z_][A-Za-z0-9_]*)\s*\(/;
34434
+ var ZERO_WIDTH = "\u200B";
34435
+ function shortReferenceLabel(token) {
34436
+ if (token.startsWith("{{ods://")) {
34437
+ const path = token.slice(8, -2);
34438
+ const parts = path.split("/");
34439
+ if (parts[0] === "steps" && parts.length >= 4) return parts.slice(3).join(".");
34440
+ if (parts[0] === "flow") return `flow.${parts.slice(1).join(".")}`;
34441
+ return parts.join(".");
34442
+ }
34443
+ if (token.startsWith("${")) return token.slice(2, -1);
34444
+ if (token.startsWith("{{")) return token.slice(2, -2).trim();
34445
+ return token;
34446
+ }
34447
+ function serialize(el) {
34448
+ let out = "";
34449
+ el.childNodes.forEach((node) => {
34450
+ if (node.nodeType === Node.TEXT_NODE) {
34451
+ out += (node.textContent || "").replace(/​/g, "");
34452
+ return;
34453
+ }
34454
+ if (node.nodeType !== Node.ELEMENT_NODE) return;
34455
+ const elem = node;
34456
+ if (elem.classList.contains("ods-expression-field__pill")) {
34457
+ out += elem.getAttribute("data-value") || "";
34458
+ } else if (elem.tagName === "BR") {
34459
+ out += "\n";
34460
+ } else if (elem.tagName === "DIV" || elem.tagName === "P") {
34461
+ out += `
34462
+ ${serialize(elem)}`;
34463
+ } else {
34464
+ out += (elem.textContent || "").replace(/​/g, "");
34465
+ }
34466
+ });
34467
+ return out;
34468
+ }
34469
+ function insideCallArguments(textBeforeCaret) {
34470
+ let depth = 0;
34471
+ let quote = null;
34472
+ for (let i = 0; i < textBeforeCaret.length; i++) {
34473
+ const ch = textBeforeCaret[i];
34474
+ if (quote) {
34475
+ if (ch === quote) quote = null;
34476
+ continue;
34477
+ }
34478
+ if (ch === '"' || ch === "'") {
34479
+ quote = ch;
34480
+ continue;
34481
+ }
34482
+ if (ch === "(") depth++;
34483
+ else if (ch === ")") depth = Math.max(0, depth - 1);
34484
+ }
34485
+ return depth > 0;
34486
+ }
34487
+ function ExpressionField({
34488
+ value,
34489
+ onChange,
34490
+ label,
34491
+ placeholder,
34492
+ helperText,
34493
+ disabled = false,
34494
+ rows = 4,
34495
+ id,
34496
+ className,
34497
+ style,
34498
+ resolveLabel,
34499
+ pillEveryToken = false,
34500
+ "aria-label": ariaLabel
34501
+ }) {
34502
+ const fieldRef = useRef50(null);
34503
+ const fromSelf = useRef50(false);
34504
+ const generatedId = useId61();
34505
+ const fieldId = id ?? generatedId;
34506
+ const helperId = `${fieldId}-helper`;
34507
+ const splitPattern = pillEveryToken ? ANY_TOKEN : REF_TOKEN;
34508
+ const isPillToken = useCallback50(
34509
+ (part) => {
34510
+ if (CALL_TOKEN.test(part)) return false;
34511
+ return pillEveryToken ? /^(\{\{[^}]+\}\}|\$\{[^}]+\})$/.test(part) : /^(\{\{ods:\/\/[^}]+\}\}|\$\{[^}]+\})$/.test(part);
34512
+ },
34513
+ [pillEveryToken]
34514
+ );
34515
+ const labelFor = useCallback50(
34516
+ (token) => resolveLabel?.(token) ?? shortReferenceLabel(token),
34517
+ [resolveLabel]
34518
+ );
34519
+ const makePill = useCallback50(
34520
+ (token) => {
34521
+ const pill = document.createElement("span");
34522
+ pill.className = "ods-expression-field__pill";
34523
+ pill.contentEditable = "false";
34524
+ pill.setAttribute("data-value", token);
34525
+ pill.textContent = labelFor(token);
34526
+ return pill;
34527
+ },
34528
+ [labelFor]
34529
+ );
34530
+ const render = useCallback50(
34531
+ (raw) => {
34532
+ const el = fieldRef.current;
34533
+ if (!el) return;
34534
+ el.innerHTML = "";
34535
+ if (!raw) return;
34536
+ raw.split(new RegExp(splitPattern.source, "g")).forEach((part) => {
34537
+ if (!part) return;
34538
+ if (isPillToken(part)) {
34539
+ el.appendChild(makePill(part));
34540
+ el.appendChild(document.createTextNode(ZERO_WIDTH));
34541
+ } else {
34542
+ el.appendChild(document.createTextNode(part));
34543
+ }
34544
+ });
34545
+ },
34546
+ [splitPattern, isPillToken, makePill]
34547
+ );
34548
+ useEffect56(() => {
34549
+ if (fromSelf.current) {
34550
+ fromSelf.current = false;
34551
+ return;
34552
+ }
34553
+ render(value);
34554
+ }, [value, render]);
34555
+ const commit = useCallback50(() => {
34556
+ const el = fieldRef.current;
34557
+ if (!el) return;
34558
+ fromSelf.current = true;
34559
+ onChange(serialize(el));
34560
+ }, [onChange]);
34561
+ const textBeforeCaret = useCallback50(() => {
34562
+ const el = fieldRef.current;
34563
+ const sel = typeof window !== "undefined" ? window.getSelection() : null;
34564
+ if (!el || !sel || sel.rangeCount === 0 || !el.contains(sel.anchorNode)) return "";
34565
+ const range = sel.getRangeAt(0).cloneRange();
34566
+ range.setStart(el, 0);
34567
+ const fragment = range.cloneContents();
34568
+ const holder = document.createElement("div");
34569
+ holder.appendChild(fragment);
34570
+ return serialize(holder);
34571
+ }, []);
34572
+ const insert = useCallback50(
34573
+ ({ value: raw, kind }) => {
34574
+ const el = fieldRef.current;
34575
+ if (!el || disabled) return;
34576
+ const sel = window.getSelection();
34577
+ const hasCaret = !!sel && sel.rangeCount > 0 && el.contains(sel.anchorNode);
34578
+ const asArgument = hasCaret && insideCallArguments(textBeforeCaret());
34579
+ const isCall = kind === "function" || /\(\s*\)?\s*$/.test(raw.trim());
34580
+ const text = isCall ? raw : asArgument ? raw : raw.startsWith("ods://") ? `{{${raw}}}` : raw;
34581
+ const node = !isCall && !asArgument && (text.startsWith("{{") || text.startsWith("${")) ? makePill(text) : document.createTextNode(text);
34582
+ const range = hasCaret && sel ? sel.getRangeAt(0) : (() => {
34583
+ const r = document.createRange();
34584
+ r.selectNodeContents(el);
34585
+ r.collapse(false);
34586
+ return r;
34587
+ })();
34588
+ range.deleteContents();
34589
+ range.insertNode(node);
34590
+ const after = document.createTextNode(ZERO_WIDTH);
34591
+ range.setStartAfter(node);
34592
+ range.insertNode(after);
34593
+ if (node.nodeType === Node.TEXT_NODE && isCall) {
34594
+ const open = text.lastIndexOf("(");
34595
+ const close = text.lastIndexOf(")");
34596
+ if (open !== -1 && close === open + 1) {
34597
+ range.setStart(node, open + 1);
34598
+ range.collapse(true);
34599
+ } else {
34600
+ range.setStartAfter(after);
34601
+ range.collapse(true);
34602
+ }
34603
+ } else {
34604
+ range.setStartAfter(after);
34605
+ range.collapse(true);
34606
+ }
34607
+ el.focus();
34608
+ const selection = window.getSelection();
34609
+ selection?.removeAllRanges();
34610
+ selection?.addRange(range);
34611
+ commit();
34612
+ },
34613
+ [commit, disabled, makePill, textBeforeCaret]
34614
+ );
34615
+ const handleDragOver = useCallback50(
34616
+ (e) => {
34617
+ if (disabled) return;
34618
+ if (e.dataTransfer.types.includes("application/x-fx-insert")) {
34619
+ e.preventDefault();
34620
+ e.dataTransfer.dropEffect = "copy";
34621
+ fieldRef.current?.classList.add("ods-expression-field__input--dragover");
34622
+ }
34623
+ },
34624
+ [disabled]
34625
+ );
34626
+ const handleDragLeave = useCallback50(() => {
34627
+ fieldRef.current?.classList.remove("ods-expression-field__input--dragover");
34628
+ }, []);
34629
+ const handleDrop = useCallback50(
34630
+ (e) => {
34631
+ const raw = e.dataTransfer.getData("application/x-fx-insert");
34632
+ if (!raw || disabled) return;
34633
+ e.preventDefault();
34634
+ fieldRef.current?.classList.remove("ods-expression-field__input--dragover");
34635
+ const kind = e.dataTransfer.getData("application/x-fx-type");
34636
+ insert({ value: raw, kind: kind === "function" ? "function" : "variable" });
34637
+ },
34638
+ [disabled, insert]
34639
+ );
34640
+ const handlePaste = useCallback50((e) => {
34641
+ e.preventDefault();
34642
+ const text = e.clipboardData.getData("text/plain");
34643
+ document.execCommand("insertText", false, text);
34644
+ }, []);
34645
+ return /* @__PURE__ */ jsxs141("div", { className: cn("ods-expression-field", className), style, children: [
34646
+ label && /* @__PURE__ */ jsx147("label", { className: "ods-expression-field__label", htmlFor: fieldId, children: label }),
34647
+ /* @__PURE__ */ jsx147(
34648
+ "div",
34649
+ {
34650
+ id: fieldId,
34651
+ ref: fieldRef,
34652
+ role: "textbox",
34653
+ "aria-multiline": "true",
34654
+ "aria-label": ariaLabel ?? (typeof label === "string" ? label : void 0),
34655
+ "aria-describedby": helperText ? helperId : void 0,
34656
+ "aria-disabled": disabled || void 0,
34657
+ contentEditable: !disabled,
34658
+ suppressContentEditableWarning: true,
34659
+ "data-placeholder": placeholder,
34660
+ className: cn(
34661
+ "ods-expression-field__input",
34662
+ disabled && "ods-expression-field__input--disabled"
34663
+ ),
34664
+ style: { minHeight: `${Math.max(1, rows) * 1.5 + 1}rem` },
34665
+ onInput: commit,
34666
+ onBlur: commit,
34667
+ onDragOver: handleDragOver,
34668
+ onDragLeave: handleDragLeave,
34669
+ onDrop: handleDrop,
34670
+ onPaste: handlePaste
34671
+ }
34672
+ ),
34673
+ helperText && /* @__PURE__ */ jsx147("span", { id: helperId, className: "ods-expression-field__helper", children: helperText })
34674
+ ] });
34675
+ }
34676
+
34677
+ // src/components/TopBar/TopBar.tsx
34678
+ import { jsx as jsx148, jsxs as jsxs142 } from "react/jsx-runtime";
34425
34679
  function TopBar({
34426
34680
  brand,
34427
34681
  workspaceSwitcher,
@@ -34441,32 +34695,32 @@ function TopBar({
34441
34695
  const showDividerAfterBrand = hasBrandBlock && (hasWorkspace || hasCrumbs || hasTitle);
34442
34696
  const showDividerAfterWorkspace = hasWorkspace && (hasCrumbs || hasTitle);
34443
34697
  const BrandRoot = brand?.href ? "a" : "div";
34444
- return /* @__PURE__ */ jsxs141("header", { ...props, className: cn("ods-topbar", className), children: [
34445
- /* @__PURE__ */ jsxs141("div", { className: "ods-topbar__left", children: [
34446
- brand && /* @__PURE__ */ jsxs141(
34698
+ return /* @__PURE__ */ jsxs142("header", { ...props, className: cn("ods-topbar", className), children: [
34699
+ /* @__PURE__ */ jsxs142("div", { className: "ods-topbar__left", children: [
34700
+ brand && /* @__PURE__ */ jsxs142(
34447
34701
  BrandRoot,
34448
34702
  {
34449
34703
  href: brand.href,
34450
34704
  className: cn("ods-topbar__brand", brand.href && "ods-topbar__brand--link"),
34451
34705
  children: [
34452
- brand.logo && /* @__PURE__ */ jsx147("span", { className: "ods-topbar__brand-mark", children: brand.logo }),
34453
- /* @__PURE__ */ jsx147("span", { className: "ods-topbar__brand-name", children: brand.name })
34706
+ brand.logo && /* @__PURE__ */ jsx148("span", { className: "ods-topbar__brand-mark", children: brand.logo }),
34707
+ /* @__PURE__ */ jsx148("span", { className: "ods-topbar__brand-name", children: brand.name })
34454
34708
  ]
34455
34709
  }
34456
34710
  ),
34457
- showDividerAfterBrand && /* @__PURE__ */ jsx147("span", { className: "ods-topbar__divider", "aria-hidden": "true" }),
34458
- workspaceSwitcher && /* @__PURE__ */ jsx147("div", { className: "ods-topbar__workspace", children: workspaceSwitcher }),
34459
- showDividerAfterWorkspace && /* @__PURE__ */ jsx147("span", { className: "ods-topbar__divider", "aria-hidden": "true" }),
34460
- hasCrumbs && /* @__PURE__ */ jsx147("nav", { className: "ods-topbar__breadcrumbs", "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsx147("ol", { children: breadcrumbs.map((crumb, idx) => /* @__PURE__ */ jsxs141("li", { className: "ods-topbar__crumb", children: [
34461
- idx > 0 && /* @__PURE__ */ jsx147("span", { className: "ods-topbar__separator", "aria-hidden": "true", children: "/" }),
34462
- crumb.href ? /* @__PURE__ */ jsx147("a", { href: crumb.href, children: crumb.label }) : /* @__PURE__ */ jsx147("span", { "aria-current": idx === breadcrumbs.length - 1 ? "page" : void 0, children: crumb.label })
34711
+ showDividerAfterBrand && /* @__PURE__ */ jsx148("span", { className: "ods-topbar__divider", "aria-hidden": "true" }),
34712
+ workspaceSwitcher && /* @__PURE__ */ jsx148("div", { className: "ods-topbar__workspace", children: workspaceSwitcher }),
34713
+ showDividerAfterWorkspace && /* @__PURE__ */ jsx148("span", { className: "ods-topbar__divider", "aria-hidden": "true" }),
34714
+ hasCrumbs && /* @__PURE__ */ jsx148("nav", { className: "ods-topbar__breadcrumbs", "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsx148("ol", { children: breadcrumbs.map((crumb, idx) => /* @__PURE__ */ jsxs142("li", { className: "ods-topbar__crumb", children: [
34715
+ idx > 0 && /* @__PURE__ */ jsx148("span", { className: "ods-topbar__separator", "aria-hidden": "true", children: "/" }),
34716
+ crumb.href ? /* @__PURE__ */ jsx148("a", { href: crumb.href, children: crumb.label }) : /* @__PURE__ */ jsx148("span", { "aria-current": idx === breadcrumbs.length - 1 ? "page" : void 0, children: crumb.label })
34463
34717
  ] }, idx)) }) }),
34464
- hasTitle && /* @__PURE__ */ jsx147("h1", { className: "ods-topbar__title", children: title })
34718
+ hasTitle && /* @__PURE__ */ jsx148("h1", { className: "ods-topbar__title", children: title })
34465
34719
  ] }),
34466
- children && /* @__PURE__ */ jsx147("div", { className: "ods-topbar__center", children }),
34467
- /* @__PURE__ */ jsxs141("div", { className: "ods-topbar__right", children: [
34468
- onSearch && /* @__PURE__ */ jsxs141("div", { className: "ods-topbar__search", children: [
34469
- /* @__PURE__ */ jsx147(
34720
+ children && /* @__PURE__ */ jsx148("div", { className: "ods-topbar__center", children }),
34721
+ /* @__PURE__ */ jsxs142("div", { className: "ods-topbar__right", children: [
34722
+ onSearch && /* @__PURE__ */ jsxs142("div", { className: "ods-topbar__search", children: [
34723
+ /* @__PURE__ */ jsx148(
34470
34724
  "svg",
34471
34725
  {
34472
34726
  className: "ods-topbar__search-icon",
@@ -34475,7 +34729,7 @@ function TopBar({
34475
34729
  viewBox: "0 0 20 20",
34476
34730
  fill: "currentColor",
34477
34731
  "aria-hidden": "true",
34478
- children: /* @__PURE__ */ jsx147(
34732
+ children: /* @__PURE__ */ jsx148(
34479
34733
  "path",
34480
34734
  {
34481
34735
  fillRule: "evenodd",
@@ -34485,7 +34739,7 @@ function TopBar({
34485
34739
  )
34486
34740
  }
34487
34741
  ),
34488
- /* @__PURE__ */ jsx147(
34742
+ /* @__PURE__ */ jsx148(
34489
34743
  "input",
34490
34744
  {
34491
34745
  type: "search",
@@ -34496,7 +34750,7 @@ function TopBar({
34496
34750
  }
34497
34751
  )
34498
34752
  ] }),
34499
- actions && /* @__PURE__ */ jsx147("div", { className: "ods-topbar__actions", children: actions })
34753
+ actions && /* @__PURE__ */ jsx148("div", { className: "ods-topbar__actions", children: actions })
34500
34754
  ] })
34501
34755
  ] });
34502
34756
  }
@@ -34505,8 +34759,8 @@ function TopBar({
34505
34759
  import { AnimatePresence as AnimatePresence19, motion as motion29 } from "framer-motion";
34506
34760
  import {
34507
34761
  forwardRef as forwardRef97,
34508
- useCallback as useCallback50,
34509
- useId as useId61,
34762
+ useCallback as useCallback51,
34763
+ useId as useId62,
34510
34764
  useState as useState71
34511
34765
  } from "react";
34512
34766
  import {
@@ -34518,13 +34772,13 @@ import {
34518
34772
  IdeaIcon,
34519
34773
  WarningAltIcon as WarningAltIcon2
34520
34774
  } from "@octaviaflow/icons";
34521
- import { jsx as jsx148, jsxs as jsxs142 } from "react/jsx-runtime";
34775
+ import { jsx as jsx149, jsxs as jsxs143 } from "react/jsx-runtime";
34522
34776
  var DEFAULT_KIND_GLYPH = {
34523
- thought: /* @__PURE__ */ jsx148(IdeaIcon, { size: "xs" }),
34524
- tool: /* @__PURE__ */ jsx148(BuildToolIcon, { size: "xs" }),
34525
- input: /* @__PURE__ */ jsx148(ConnectionReceiveIcon, { size: "xs" }),
34526
- output: /* @__PURE__ */ jsx148(ConnectionSendIcon, { size: "xs" }),
34527
- error: /* @__PURE__ */ jsx148(WarningAltIcon2, { size: "xs" })
34777
+ thought: /* @__PURE__ */ jsx149(IdeaIcon, { size: "xs" }),
34778
+ tool: /* @__PURE__ */ jsx149(BuildToolIcon, { size: "xs" }),
34779
+ input: /* @__PURE__ */ jsx149(ConnectionReceiveIcon, { size: "xs" }),
34780
+ output: /* @__PURE__ */ jsx149(ConnectionSendIcon, { size: "xs" }),
34781
+ error: /* @__PURE__ */ jsx149(WarningAltIcon2, { size: "xs" })
34528
34782
  };
34529
34783
  var FALLBACK_GLYPH = DEFAULT_KIND_GLYPH.thought;
34530
34784
  var TraceStep = forwardRef97(
@@ -34549,7 +34803,7 @@ var TraceStep = forwardRef97(
34549
34803
  className,
34550
34804
  ...rest
34551
34805
  }, ref) {
34552
- const reactId = useId61();
34806
+ const reactId = useId62();
34553
34807
  const baseId = providedId ?? `ods-trace-step-${reactId}`;
34554
34808
  const headId = `${baseId}-head`;
34555
34809
  const contentId = `${baseId}-content`;
@@ -34557,14 +34811,14 @@ var TraceStep = forwardRef97(
34557
34811
  const isControlled = controlledOpen !== void 0;
34558
34812
  const open = isControlled ? controlledOpen : uncontrolledOpen;
34559
34813
  const canExpand = !!children;
34560
- const toggle = useCallback50(() => {
34814
+ const toggle = useCallback51(() => {
34561
34815
  if (!canExpand) return;
34562
34816
  const next = !open;
34563
34817
  if (!isControlled) setUncontrolledOpen(next);
34564
34818
  onOpenChange?.(next);
34565
34819
  }, [canExpand, open, isControlled, onOpenChange]);
34566
34820
  const resolvedGlyph = icon ?? kindIcons?.[kind] ?? DEFAULT_KIND_GLYPH[kind] ?? FALLBACK_GLYPH;
34567
- return /* @__PURE__ */ jsxs142(
34821
+ return /* @__PURE__ */ jsxs143(
34568
34822
  "div",
34569
34823
  {
34570
34824
  ...rest,
@@ -34580,18 +34834,18 @@ var TraceStep = forwardRef97(
34580
34834
  className
34581
34835
  ),
34582
34836
  children: [
34583
- /* @__PURE__ */ jsxs142("div", { className: "ods-trace-step__rail", "aria-hidden": "true", children: [
34584
- /* @__PURE__ */ jsx148(
34837
+ /* @__PURE__ */ jsxs143("div", { className: "ods-trace-step__rail", "aria-hidden": "true", children: [
34838
+ /* @__PURE__ */ jsx149(
34585
34839
  motion29.span,
34586
34840
  {
34587
34841
  className: "ods-trace-step__icon",
34588
34842
  initial: disableAnimation ? false : { scale: 0.6, opacity: 0 },
34589
34843
  animate: { scale: 1, opacity: 1 },
34590
34844
  transition: { duration: 0.2, ease: [0.16, 1, 0.3, 1] },
34591
- children: status === "running" ? /* @__PURE__ */ jsx148("span", { className: "ods-trace-step__spin", children: /* @__PURE__ */ jsx148(CircleDashIcon, { size: "xs" }) }) : resolvedGlyph
34845
+ children: status === "running" ? /* @__PURE__ */ jsx149("span", { className: "ods-trace-step__spin", children: /* @__PURE__ */ jsx149(CircleDashIcon, { size: "xs" }) }) : resolvedGlyph
34592
34846
  }
34593
34847
  ),
34594
- !isLast && /* @__PURE__ */ jsx148(
34848
+ !isLast && /* @__PURE__ */ jsx149(
34595
34849
  motion29.span,
34596
34850
  {
34597
34851
  className: "ods-trace-step__line",
@@ -34601,8 +34855,8 @@ var TraceStep = forwardRef97(
34601
34855
  }
34602
34856
  )
34603
34857
  ] }),
34604
- /* @__PURE__ */ jsxs142("div", { className: "ods-trace-step__body", children: [
34605
- /* @__PURE__ */ jsxs142(
34858
+ /* @__PURE__ */ jsxs143("div", { className: "ods-trace-step__body", children: [
34859
+ /* @__PURE__ */ jsxs143(
34606
34860
  "button",
34607
34861
  {
34608
34862
  id: headId,
@@ -34613,7 +34867,7 @@ var TraceStep = forwardRef97(
34613
34867
  "aria-controls": canExpand ? contentId : void 0,
34614
34868
  disabled: !canExpand,
34615
34869
  children: [
34616
- index != null && /* @__PURE__ */ jsx148(
34870
+ index != null && /* @__PURE__ */ jsx149(
34617
34871
  "span",
34618
34872
  {
34619
34873
  className: cn(
@@ -34623,32 +34877,32 @@ var TraceStep = forwardRef97(
34623
34877
  children: index
34624
34878
  }
34625
34879
  ),
34626
- /* @__PURE__ */ jsx148("span", { className: "ods-trace-step__title", children: title }),
34627
- tool && /* @__PURE__ */ jsxs142(
34880
+ /* @__PURE__ */ jsx149("span", { className: "ods-trace-step__title", children: title }),
34881
+ tool && /* @__PURE__ */ jsxs143(
34628
34882
  "span",
34629
34883
  {
34630
34884
  className: "ods-trace-step__tool",
34631
34885
  title: tool,
34632
34886
  "aria-label": `Tool: ${tool}`,
34633
34887
  children: [
34634
- /* @__PURE__ */ jsx148("span", { className: "ods-trace-step__tool-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx148(BuildToolIcon, { size: "xs" }) }),
34888
+ /* @__PURE__ */ jsx149("span", { className: "ods-trace-step__tool-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx149(BuildToolIcon, { size: "xs" }) }),
34635
34889
  tool
34636
34890
  ]
34637
34891
  }
34638
34892
  ),
34639
- /* @__PURE__ */ jsxs142("span", { className: "ods-trace-step__meta", children: [
34640
- tokens != null && /* @__PURE__ */ jsxs142(
34893
+ /* @__PURE__ */ jsxs143("span", { className: "ods-trace-step__meta", children: [
34894
+ tokens != null && /* @__PURE__ */ jsxs143(
34641
34895
  "span",
34642
34896
  {
34643
34897
  className: "ods-trace-step__tokens",
34644
34898
  "aria-label": `${tokens} tokens`,
34645
34899
  children: [
34646
- /* @__PURE__ */ jsx148("span", { children: tokens.toLocaleString() }),
34900
+ /* @__PURE__ */ jsx149("span", { children: tokens.toLocaleString() }),
34647
34901
  " tok"
34648
34902
  ]
34649
34903
  }
34650
34904
  ),
34651
- duration && /* @__PURE__ */ jsx148(
34905
+ duration && /* @__PURE__ */ jsx149(
34652
34906
  "span",
34653
34907
  {
34654
34908
  className: "ods-trace-step__duration",
@@ -34657,20 +34911,20 @@ var TraceStep = forwardRef97(
34657
34911
  }
34658
34912
  )
34659
34913
  ] }),
34660
- canExpand && /* @__PURE__ */ jsx148(
34914
+ canExpand && /* @__PURE__ */ jsx149(
34661
34915
  motion29.span,
34662
34916
  {
34663
34917
  className: "ods-trace-step__chev",
34664
34918
  "aria-hidden": "true",
34665
34919
  animate: { rotate: open ? 180 : 0 },
34666
34920
  transition: { duration: 0.18, ease: [0.16, 1, 0.3, 1] },
34667
- children: /* @__PURE__ */ jsx148(CaretDownIcon5, { size: "xs" })
34921
+ children: /* @__PURE__ */ jsx149(CaretDownIcon5, { size: "xs" })
34668
34922
  }
34669
34923
  )
34670
34924
  ]
34671
34925
  }
34672
34926
  ),
34673
- /* @__PURE__ */ jsx148(AnimatePresence19, { initial: false, children: canExpand && open && /* @__PURE__ */ jsx148(
34927
+ /* @__PURE__ */ jsx149(AnimatePresence19, { initial: false, children: canExpand && open && /* @__PURE__ */ jsx149(
34674
34928
  motion29.div,
34675
34929
  {
34676
34930
  id: contentId,
@@ -34682,7 +34936,7 @@ var TraceStep = forwardRef97(
34682
34936
  exit: disableAnimation ? void 0 : { height: 0, opacity: 0 },
34683
34937
  transition: { duration: 0.2, ease: [0.16, 1, 0.3, 1] },
34684
34938
  style: { overflow: "hidden" },
34685
- children: /* @__PURE__ */ jsx148("div", { className: "ods-trace-step__content-inner", children })
34939
+ children: /* @__PURE__ */ jsx149("div", { className: "ods-trace-step__content-inner", children })
34686
34940
  },
34687
34941
  "content"
34688
34942
  ) })
@@ -34697,9 +34951,9 @@ TraceStep.displayName = "TraceStep";
34697
34951
  // src/components/UsageMeter/UsageMeter.tsx
34698
34952
  import {
34699
34953
  forwardRef as forwardRef98,
34700
- useId as useId62
34954
+ useId as useId63
34701
34955
  } from "react";
34702
- import { jsx as jsx149, jsxs as jsxs143 } from "react/jsx-runtime";
34956
+ import { jsx as jsx150, jsxs as jsxs144 } from "react/jsx-runtime";
34703
34957
  var defaultFormat8 = (n) => n.toLocaleString();
34704
34958
  var UsageMeter = forwardRef98(
34705
34959
  function UsageMeter2({
@@ -34718,7 +34972,7 @@ var UsageMeter = forwardRef98(
34718
34972
  "aria-label": ariaLabel,
34719
34973
  ...rest
34720
34974
  }, ref) {
34721
- const reactId = useId62();
34975
+ const reactId = useId63();
34722
34976
  const baseId = providedId ?? `ods-usage-meter-${reactId}`;
34723
34977
  const labelId = label ? `${baseId}-label` : void 0;
34724
34978
  const captionId = caption ? `${baseId}-caption` : void 0;
@@ -34735,7 +34989,7 @@ var UsageMeter = forwardRef98(
34735
34989
  const tone = exhausted ? "danger" : warned ? "warning" : "default";
34736
34990
  const resolvedValueLabel = valueLabel ?? `${formatValue(clamped)} / ${formatValue(safeAllowance)}${safeBonus > 0 ? ` + ${formatValue(safeBonus)}` : ""}`;
34737
34991
  const valueText = `${formatValue(clamped)} of ${formatValue(safeAllowance)} used` + (safeBonus > 0 ? `, plus ${formatValue(Math.max(0, safeBonus - inBonus))} add-on available` : "");
34738
- return /* @__PURE__ */ jsxs143(
34992
+ return /* @__PURE__ */ jsxs144(
34739
34993
  "div",
34740
34994
  {
34741
34995
  ...rest,
@@ -34748,9 +35002,9 @@ var UsageMeter = forwardRef98(
34748
35002
  className
34749
35003
  ),
34750
35004
  children: [
34751
- (label || !hideValueLabel) && /* @__PURE__ */ jsxs143("div", { className: "ods-usage-meter__header", children: [
34752
- label && /* @__PURE__ */ jsx149("span", { id: labelId, className: "ods-usage-meter__label", children: label }),
34753
- !hideValueLabel && /* @__PURE__ */ jsx149(
35005
+ (label || !hideValueLabel) && /* @__PURE__ */ jsxs144("div", { className: "ods-usage-meter__header", children: [
35006
+ label && /* @__PURE__ */ jsx150("span", { id: labelId, className: "ods-usage-meter__label", children: label }),
35007
+ !hideValueLabel && /* @__PURE__ */ jsx150(
34754
35008
  "span",
34755
35009
  {
34756
35010
  className: "ods-usage-meter__value-label",
@@ -34759,7 +35013,7 @@ var UsageMeter = forwardRef98(
34759
35013
  }
34760
35014
  )
34761
35015
  ] }),
34762
- /* @__PURE__ */ jsxs143(
35016
+ /* @__PURE__ */ jsxs144(
34763
35017
  "div",
34764
35018
  {
34765
35019
  className: "ods-usage-meter__track",
@@ -34772,12 +35026,12 @@ var UsageMeter = forwardRef98(
34772
35026
  "aria-labelledby": labelId,
34773
35027
  "aria-describedby": captionId,
34774
35028
  children: [
34775
- /* @__PURE__ */ jsx149(
35029
+ /* @__PURE__ */ jsx150(
34776
35030
  "div",
34777
35031
  {
34778
35032
  className: "ods-usage-meter__segment ods-usage-meter__segment--allowance",
34779
35033
  style: { flexGrow: safeAllowance || 1 },
34780
- children: /* @__PURE__ */ jsx149(
35034
+ children: /* @__PURE__ */ jsx150(
34781
35035
  "div",
34782
35036
  {
34783
35037
  className: "ods-usage-meter__fill",
@@ -34786,12 +35040,12 @@ var UsageMeter = forwardRef98(
34786
35040
  )
34787
35041
  }
34788
35042
  ),
34789
- safeBonus > 0 && /* @__PURE__ */ jsx149(
35043
+ safeBonus > 0 && /* @__PURE__ */ jsx150(
34790
35044
  "div",
34791
35045
  {
34792
35046
  className: "ods-usage-meter__segment ods-usage-meter__segment--bonus",
34793
35047
  style: { flexGrow: safeBonus },
34794
- children: /* @__PURE__ */ jsx149(
35048
+ children: /* @__PURE__ */ jsx150(
34795
35049
  "div",
34796
35050
  {
34797
35051
  className: "ods-usage-meter__fill ods-usage-meter__fill--bonus",
@@ -34803,7 +35057,7 @@ var UsageMeter = forwardRef98(
34803
35057
  ]
34804
35058
  }
34805
35059
  ),
34806
- caption && /* @__PURE__ */ jsx149("span", { id: captionId, className: "ods-usage-meter__caption", children: caption })
35060
+ caption && /* @__PURE__ */ jsx150("span", { id: captionId, className: "ods-usage-meter__caption", children: caption })
34807
35061
  ]
34808
35062
  }
34809
35063
  );
@@ -34814,9 +35068,9 @@ UsageMeter.displayName = "UsageMeter";
34814
35068
  // src/components/UserCard/UserCard.tsx
34815
35069
  import {
34816
35070
  forwardRef as forwardRef99,
34817
- useId as useId63
35071
+ useId as useId64
34818
35072
  } from "react";
34819
- import { Fragment as Fragment62, jsx as jsx150, jsxs as jsxs144 } from "react/jsx-runtime";
35073
+ import { Fragment as Fragment62, jsx as jsx151, jsxs as jsxs145 } from "react/jsx-runtime";
34820
35074
  var UserCard = forwardRef99(function UserCard2({
34821
35075
  name,
34822
35076
  nameAs = "h3",
@@ -34837,16 +35091,16 @@ var UserCard = forwardRef99(function UserCard2({
34837
35091
  className,
34838
35092
  ...rest
34839
35093
  }, ref) {
34840
- const reactId = useId63();
35094
+ const reactId = useId64();
34841
35095
  const baseId = providedId ?? `ods-user-card-${reactId}`;
34842
35096
  const nameId = `${baseId}-name`;
34843
35097
  const isInteractive = Boolean(href || onClick) && !disabled;
34844
35098
  const renderAvatar = () => {
34845
35099
  if (avatarNode) {
34846
- return /* @__PURE__ */ jsx150("span", { className: "ods-user-card__avatar ods-user-card__avatar--legacy", "aria-hidden": "true", children: avatarNode });
35100
+ return /* @__PURE__ */ jsx151("span", { className: "ods-user-card__avatar ods-user-card__avatar--legacy", "aria-hidden": "true", children: avatarNode });
34847
35101
  }
34848
35102
  const derivedInitials = avatar?.initials ?? (typeof initial === "string" ? initial : typeof name === "string" ? name.charAt(0).toUpperCase() : void 0);
34849
- return /* @__PURE__ */ jsx150(
35103
+ return /* @__PURE__ */ jsx151(
34850
35104
  Avatar,
34851
35105
  {
34852
35106
  size: orientation === "horizontal" ? "md" : "lg",
@@ -34860,18 +35114,18 @@ var UserCard = forwardRef99(function UserCard2({
34860
35114
  }
34861
35115
  );
34862
35116
  };
34863
- const body = /* @__PURE__ */ jsxs144(Fragment62, { children: [
35117
+ const body = /* @__PURE__ */ jsxs145(Fragment62, { children: [
34864
35118
  renderAvatar(),
34865
- /* @__PURE__ */ jsxs144("div", { className: "ods-user-card__body", children: [
34866
- /* @__PURE__ */ jsx150(Card.Title, { as: nameAs, id: nameId, className: "ods-user-card__name", children: name }),
34867
- role && /* @__PURE__ */ jsx150("div", { className: "ods-user-card__role", children: role }),
34868
- meta2 && /* @__PURE__ */ jsx150("div", { className: "ods-user-card__meta", children: meta2 })
35119
+ /* @__PURE__ */ jsxs145("div", { className: "ods-user-card__body", children: [
35120
+ /* @__PURE__ */ jsx151(Card.Title, { as: nameAs, id: nameId, className: "ods-user-card__name", children: name }),
35121
+ role && /* @__PURE__ */ jsx151("div", { className: "ods-user-card__role", children: role }),
35122
+ meta2 && /* @__PURE__ */ jsx151("div", { className: "ods-user-card__meta", children: meta2 })
34869
35123
  ] }),
34870
- stats && stats.length > 0 && /* @__PURE__ */ jsx150("div", { className: "ods-user-card__stats", children: stats.map((s, i) => /* @__PURE__ */ jsxs144("div", { className: "ods-user-card__stat", children: [
34871
- /* @__PURE__ */ jsx150("div", { className: "ods-user-card__stat-value", children: s.value }),
34872
- /* @__PURE__ */ jsx150("div", { className: "ods-user-card__stat-label", children: s.label })
35124
+ stats && stats.length > 0 && /* @__PURE__ */ jsx151("div", { className: "ods-user-card__stats", children: stats.map((s, i) => /* @__PURE__ */ jsxs145("div", { className: "ods-user-card__stat", children: [
35125
+ /* @__PURE__ */ jsx151("div", { className: "ods-user-card__stat-value", children: s.value }),
35126
+ /* @__PURE__ */ jsx151("div", { className: "ods-user-card__stat-label", children: s.label })
34873
35127
  ] }, i)) }),
34874
- action && /* @__PURE__ */ jsx150("div", { className: "ods-user-card__action", children: action })
35128
+ action && /* @__PURE__ */ jsx151("div", { className: "ods-user-card__action", children: action })
34875
35129
  ] });
34876
35130
  const sharedClass = cn(
34877
35131
  "ods-user-card",
@@ -34881,7 +35135,7 @@ var UserCard = forwardRef99(function UserCard2({
34881
35135
  className
34882
35136
  );
34883
35137
  if (href && !disabled) {
34884
- return /* @__PURE__ */ jsx150(Card, { asChild: true, radius, padding: "none", className: sharedClass, "aria-labelledby": nameId, children: /* @__PURE__ */ jsx150(
35138
+ return /* @__PURE__ */ jsx151(Card, { asChild: true, radius, padding: "none", className: sharedClass, "aria-labelledby": nameId, children: /* @__PURE__ */ jsx151(
34885
35139
  "a",
34886
35140
  {
34887
35141
  ...rest,
@@ -34893,7 +35147,7 @@ var UserCard = forwardRef99(function UserCard2({
34893
35147
  }
34894
35148
  ) });
34895
35149
  }
34896
- return /* @__PURE__ */ jsx150(
35150
+ return /* @__PURE__ */ jsx151(
34897
35151
  Card,
34898
35152
  {
34899
35153
  ...rest,
@@ -34912,10 +35166,10 @@ var UserCard = forwardRef99(function UserCard2({
34912
35166
  UserCard.displayName = "UserCard";
34913
35167
 
34914
35168
  // src/components/WorkflowEditor/WorkflowEditor.tsx
34915
- import { useCallback as useCallback52, useMemo as useMemo39, useState as useState72 } from "react";
35169
+ import { useCallback as useCallback53, useMemo as useMemo39, useState as useState72 } from "react";
34916
35170
 
34917
35171
  // src/hooks/useWorkflow.ts
34918
- import { useCallback as useCallback51, useMemo as useMemo38, useReducer } from "react";
35172
+ import { useCallback as useCallback52, useMemo as useMemo38, useReducer } from "react";
34919
35173
 
34920
35174
  // src/workflow/types.ts
34921
35175
  var types_exports = {};
@@ -35429,11 +35683,11 @@ function useWorkflow(options2 = {}) {
35429
35683
  []
35430
35684
  );
35431
35685
  const [workflow, dispatch] = useReducer(reducer, initial);
35432
- const addNode = useCallback51(
35686
+ const addNode = useCallback52(
35433
35687
  (node) => dispatch({ type: "ADD_NODE", payload: node }),
35434
35688
  []
35435
35689
  );
35436
- const createNode = useCallback51(
35690
+ const createNode = useCallback52(
35437
35691
  (partial) => {
35438
35692
  const id = partial.id ?? genId("node");
35439
35693
  const ports = partial.ports ?? {
@@ -35482,27 +35736,27 @@ function useWorkflow(options2 = {}) {
35482
35736
  },
35483
35737
  []
35484
35738
  );
35485
- const updateNode = useCallback51(
35739
+ const updateNode = useCallback52(
35486
35740
  (id, updates) => dispatch({ type: "UPDATE_NODE", payload: { id, updates } }),
35487
35741
  []
35488
35742
  );
35489
- const deleteNode = useCallback51(
35743
+ const deleteNode = useCallback52(
35490
35744
  (id) => dispatch({ type: "DELETE_NODE", payload: id }),
35491
35745
  []
35492
35746
  );
35493
- const deleteNodes = useCallback51(
35747
+ const deleteNodes = useCallback52(
35494
35748
  (ids) => dispatch({ type: "DELETE_NODES", payload: ids }),
35495
35749
  []
35496
35750
  );
35497
- const replaceNodes = useCallback51(
35751
+ const replaceNodes = useCallback52(
35498
35752
  (nodes) => dispatch({ type: "REPLACE_NODES", payload: nodes }),
35499
35753
  []
35500
35754
  );
35501
- const addEdge = useCallback51(
35755
+ const addEdge = useCallback52(
35502
35756
  (edge) => dispatch({ type: "ADD_EDGE", payload: edge }),
35503
35757
  []
35504
35758
  );
35505
- const createEdge = useCallback51(
35759
+ const createEdge = useCallback52(
35506
35760
  (source, sourcePort, target, targetPort) => {
35507
35761
  const edge = {
35508
35762
  id: genId("edge"),
@@ -35520,20 +35774,20 @@ function useWorkflow(options2 = {}) {
35520
35774
  },
35521
35775
  []
35522
35776
  );
35523
- const deleteEdge = useCallback51(
35777
+ const deleteEdge = useCallback52(
35524
35778
  (id) => dispatch({ type: "DELETE_EDGE", payload: id }),
35525
35779
  []
35526
35780
  );
35527
- const replaceEdges = useCallback51(
35781
+ const replaceEdges = useCallback52(
35528
35782
  (edges) => dispatch({ type: "REPLACE_EDGES", payload: edges }),
35529
35783
  []
35530
35784
  );
35531
- const startConnecting = useCallback51(
35785
+ const startConnecting = useCallback52(
35532
35786
  (nodeId, portId, portType) => dispatch({ type: "START_CONNECTING", payload: { nodeId, portId, portType } }),
35533
35787
  []
35534
35788
  );
35535
- const endConnecting = useCallback51(() => dispatch({ type: "END_CONNECTING" }), []);
35536
- const selectNode = useCallback51(
35789
+ const endConnecting = useCallback52(() => dispatch({ type: "END_CONNECTING" }), []);
35790
+ const selectNode = useCallback52(
35537
35791
  (id, multi = false) => {
35538
35792
  if (multi) {
35539
35793
  const current = workflow.canvas.selectedNodes;
@@ -35545,36 +35799,36 @@ function useWorkflow(options2 = {}) {
35545
35799
  },
35546
35800
  [workflow.canvas.selectedNodes]
35547
35801
  );
35548
- const selectNodes = useCallback51(
35802
+ const selectNodes = useCallback52(
35549
35803
  (ids) => dispatch({ type: "SELECT_NODES", payload: ids }),
35550
35804
  []
35551
35805
  );
35552
- const selectEdge = useCallback51(
35806
+ const selectEdge = useCallback52(
35553
35807
  (id) => dispatch({ type: "SELECT_EDGE", payload: id }),
35554
35808
  []
35555
35809
  );
35556
- const deselectAll = useCallback51(() => dispatch({ type: "DESELECT_ALL" }), []);
35557
- const zoomIn = useCallback51(() => {
35810
+ const deselectAll = useCallback52(() => dispatch({ type: "DESELECT_ALL" }), []);
35811
+ const zoomIn = useCallback52(() => {
35558
35812
  const z = Math.min(workflow.canvas.viewport.zoom * 1.2, 2);
35559
35813
  dispatch({ type: "UPDATE_VIEWPORT", payload: { zoom: z } });
35560
35814
  }, [workflow.canvas.viewport.zoom]);
35561
- const zoomOut = useCallback51(() => {
35815
+ const zoomOut = useCallback52(() => {
35562
35816
  const z = Math.max(workflow.canvas.viewport.zoom / 1.2, 0.25);
35563
35817
  dispatch({ type: "UPDATE_VIEWPORT", payload: { zoom: z } });
35564
35818
  }, [workflow.canvas.viewport.zoom]);
35565
- const resetViewport = useCallback51(
35819
+ const resetViewport = useCallback52(
35566
35820
  () => dispatch({ type: "UPDATE_VIEWPORT", payload: { x: 0, y: 0, zoom: 1 } }),
35567
35821
  []
35568
35822
  );
35569
- const setViewport = useCallback51(
35823
+ const setViewport = useCallback52(
35570
35824
  (viewport) => dispatch({ type: "UPDATE_VIEWPORT", payload: viewport }),
35571
35825
  []
35572
35826
  );
35573
- const undo = useCallback51(() => dispatch({ type: "UNDO" }), []);
35574
- const redo = useCallback51(() => dispatch({ type: "REDO" }), []);
35827
+ const undo = useCallback52(() => dispatch({ type: "UNDO" }), []);
35828
+ const redo = useCallback52(() => dispatch({ type: "REDO" }), []);
35575
35829
  const canUndo = workflow.canvas.history.past.length > 0;
35576
35830
  const canRedo = workflow.canvas.history.future.length > 0;
35577
- const validate = useCallback51(() => workflow.validation, [workflow.validation]);
35831
+ const validate = useCallback52(() => workflow.validation, [workflow.validation]);
35578
35832
  return {
35579
35833
  workflow,
35580
35834
  dispatch,
@@ -35607,7 +35861,7 @@ function useWorkflow(options2 = {}) {
35607
35861
  }
35608
35862
 
35609
35863
  // src/components/WorkflowEditor/WorkflowEditor.tsx
35610
- import { jsx as jsx151, jsxs as jsxs145 } from "react/jsx-runtime";
35864
+ import { jsx as jsx152, jsxs as jsxs146 } from "react/jsx-runtime";
35611
35865
  var NODE_KIND_MAP = {
35612
35866
  trigger: "trigger",
35613
35867
  action: "action",
@@ -35652,7 +35906,7 @@ function WorkflowEditor({
35652
35906
  drawer,
35653
35907
  console: consoleSlot,
35654
35908
  minimap,
35655
- emptyState = /* @__PURE__ */ jsx151(DefaultEmptyState, {}),
35909
+ emptyState = /* @__PURE__ */ jsx152(DefaultEmptyState, {}),
35656
35910
  children,
35657
35911
  background = "dots",
35658
35912
  snapToGrid = true,
@@ -35688,27 +35942,27 @@ function WorkflowEditor({
35688
35942
  const isDrawerOpen = controlledDrawerOpen ?? uncontrolledDrawer;
35689
35943
  const isHistoryOpen = controlledHistoryOpen ?? uncontrolledHistory;
35690
35944
  const isDebugOpen = controlledDebugOpen ?? uncontrolledDebug;
35691
- const toggleLock = useCallback52(() => {
35945
+ const toggleLock = useCallback53(() => {
35692
35946
  const next = !isLockMode;
35693
35947
  if (controlledLockMode === void 0) setUncontrolledLock(next);
35694
35948
  onToggleLockMode?.(next);
35695
35949
  }, [isLockMode, controlledLockMode, onToggleLockMode]);
35696
- const toggleDrawer = useCallback52(() => {
35950
+ const toggleDrawer = useCallback53(() => {
35697
35951
  const next = !isDrawerOpen;
35698
35952
  if (controlledDrawerOpen === void 0) setUncontrolledDrawer(next);
35699
35953
  onToggleDrawer?.(next);
35700
35954
  }, [isDrawerOpen, controlledDrawerOpen, onToggleDrawer]);
35701
- const toggleHistory = useCallback52(() => {
35955
+ const toggleHistory = useCallback53(() => {
35702
35956
  const next = !isHistoryOpen;
35703
35957
  if (controlledHistoryOpen === void 0) setUncontrolledHistory(next);
35704
35958
  onToggleHistory?.(next);
35705
35959
  }, [isHistoryOpen, controlledHistoryOpen, onToggleHistory]);
35706
- const toggleDebug = useCallback52(() => {
35960
+ const toggleDebug = useCallback53(() => {
35707
35961
  const next = !isDebugOpen;
35708
35962
  if (controlledDebugOpen === void 0) setUncontrolledDebug(next);
35709
35963
  onToggleDebug?.(next);
35710
35964
  }, [isDebugOpen, controlledDebugOpen, onToggleDebug]);
35711
- const handleReset = useCallback52(() => {
35965
+ const handleReset = useCallback53(() => {
35712
35966
  if (onReset) onReset();
35713
35967
  else dispatch({ type: "RESET" });
35714
35968
  }, [onReset, dispatch]);
@@ -35717,7 +35971,7 @@ function WorkflowEditor({
35717
35971
  [workflow.canvas.nodes]
35718
35972
  );
35719
35973
  const nextEdges = useMemo39(() => workflow.canvas.edges.map(toNextEdge), [workflow.canvas.edges]);
35720
- const onNodesChange = useCallback52(
35974
+ const onNodesChange = useCallback53(
35721
35975
  (changes) => {
35722
35976
  const reduced = applyNodeChanges(
35723
35977
  nextNodes,
@@ -35758,7 +36012,7 @@ function WorkflowEditor({
35758
36012
  },
35759
36013
  [nextNodes, workflow.canvas.nodes, wf, onNodeSelect]
35760
36014
  );
35761
- const onEdgesChange = useCallback52(
36015
+ const onEdgesChange = useCallback53(
35762
36016
  (changes) => {
35763
36017
  const reduced = applyEdgeChanges(nextEdges, changes);
35764
36018
  const byId = new Map(reduced.map((e) => [e.id, e]));
@@ -35768,18 +36022,18 @@ function WorkflowEditor({
35768
36022
  },
35769
36023
  [nextEdges, workflow.canvas.edges, wf]
35770
36024
  );
35771
- const onConnect = useCallback52(
36025
+ const onConnect = useCallback53(
35772
36026
  (c) => {
35773
36027
  wf.createEdge(c.source, c.sourceHandle ?? "default", c.target, c.targetHandle ?? "default");
35774
36028
  },
35775
36029
  [wf]
35776
36030
  );
35777
36031
  const [canvasSize, setCanvasSize] = useState72({ w: 0, h: 0 });
35778
- const handleCanvasRef = useCallback52((node) => {
36032
+ const handleCanvasRef = useCallback53((node) => {
35779
36033
  if (!node) return;
35780
36034
  setCanvasSize({ w: node.clientWidth, h: node.clientHeight });
35781
36035
  }, []);
35782
- const fitToView = useCallback52(() => {
36036
+ const fitToView = useCallback53(() => {
35783
36037
  const nodes = workflow.canvas.nodes;
35784
36038
  if (nodes.length === 0) return;
35785
36039
  let minX = Infinity;
@@ -35808,8 +36062,8 @@ function WorkflowEditor({
35808
36062
  wf.setViewport({ x: cw / 2 - cx * zoom, y: ch / 2 - cy * zoom, zoom });
35809
36063
  }, [workflow.canvas.nodes, canvasSize, wf]);
35810
36064
  const defaultToolbar = useMemo39(
35811
- () => /* @__PURE__ */ jsxs145(FlowToolbar, { placement: "left", children: [
35812
- onSave && /* @__PURE__ */ jsx151(
36065
+ () => /* @__PURE__ */ jsxs146(FlowToolbar, { placement: "left", children: [
36066
+ onSave && /* @__PURE__ */ jsx152(
35813
36067
  FlowToolbarButton,
35814
36068
  {
35815
36069
  icon: FlowToolbarIcons.save,
@@ -35818,7 +36072,7 @@ function WorkflowEditor({
35818
36072
  onClick: () => onSave(workflow)
35819
36073
  }
35820
36074
  ),
35821
- onRun && /* @__PURE__ */ jsx151(
36075
+ onRun && /* @__PURE__ */ jsx152(
35822
36076
  FlowToolbarButton,
35823
36077
  {
35824
36078
  icon: isExecuting ? FlowToolbarIcons.stop : FlowToolbarIcons.run,
@@ -35829,7 +36083,7 @@ function WorkflowEditor({
35829
36083
  onClick: isExecuting ? onStop : onRun
35830
36084
  }
35831
36085
  ),
35832
- /* @__PURE__ */ jsx151(
36086
+ /* @__PURE__ */ jsx152(
35833
36087
  FlowToolbarButton,
35834
36088
  {
35835
36089
  icon: isLockMode ? FlowToolbarIcons.lock : FlowToolbarIcons.unlock,
@@ -35839,7 +36093,7 @@ function WorkflowEditor({
35839
36093
  onClick: toggleLock
35840
36094
  }
35841
36095
  ),
35842
- /* @__PURE__ */ jsx151(
36096
+ /* @__PURE__ */ jsx152(
35843
36097
  FlowToolbarButton,
35844
36098
  {
35845
36099
  icon: FlowToolbarIcons.reset,
@@ -35847,7 +36101,7 @@ function WorkflowEditor({
35847
36101
  onClick: handleReset
35848
36102
  }
35849
36103
  ),
35850
- drawer && /* @__PURE__ */ jsx151(
36104
+ drawer && /* @__PURE__ */ jsx152(
35851
36105
  FlowToolbarButton,
35852
36106
  {
35853
36107
  icon: isDrawerOpen ? FlowToolbarIcons.drawerClose : FlowToolbarIcons.drawerOpen,
@@ -35856,8 +36110,8 @@ function WorkflowEditor({
35856
36110
  onClick: toggleDrawer
35857
36111
  }
35858
36112
  ),
35859
- /* @__PURE__ */ jsx151(FlowToolbarDivider, {}),
35860
- onSettings && /* @__PURE__ */ jsx151(
36113
+ /* @__PURE__ */ jsx152(FlowToolbarDivider, {}),
36114
+ onSettings && /* @__PURE__ */ jsx152(
35861
36115
  FlowToolbarButton,
35862
36116
  {
35863
36117
  icon: FlowToolbarIcons.settings,
@@ -35865,7 +36119,7 @@ function WorkflowEditor({
35865
36119
  onClick: onSettings
35866
36120
  }
35867
36121
  ),
35868
- /* @__PURE__ */ jsx151(
36122
+ /* @__PURE__ */ jsx152(
35869
36123
  FlowToolbarButton,
35870
36124
  {
35871
36125
  icon: FlowToolbarIcons.history,
@@ -35874,7 +36128,7 @@ function WorkflowEditor({
35874
36128
  onClick: toggleHistory
35875
36129
  }
35876
36130
  ),
35877
- isDebugModeEnabled && /* @__PURE__ */ jsx151(
36131
+ isDebugModeEnabled && /* @__PURE__ */ jsx152(
35878
36132
  FlowToolbarButton,
35879
36133
  {
35880
36134
  icon: FlowToolbarIcons.debug,
@@ -35883,8 +36137,8 @@ function WorkflowEditor({
35883
36137
  onClick: toggleDebug
35884
36138
  }
35885
36139
  ),
35886
- /* @__PURE__ */ jsx151(FlowToolbarDivider, {}),
35887
- /* @__PURE__ */ jsx151(
36140
+ /* @__PURE__ */ jsx152(FlowToolbarDivider, {}),
36141
+ /* @__PURE__ */ jsx152(
35888
36142
  FlowToolbarButton,
35889
36143
  {
35890
36144
  icon: FlowToolbarIcons.undo,
@@ -35894,7 +36148,7 @@ function WorkflowEditor({
35894
36148
  onClick: undo
35895
36149
  }
35896
36150
  ),
35897
- /* @__PURE__ */ jsx151(
36151
+ /* @__PURE__ */ jsx152(
35898
36152
  FlowToolbarButton,
35899
36153
  {
35900
36154
  icon: FlowToolbarIcons.redo,
@@ -35904,8 +36158,8 @@ function WorkflowEditor({
35904
36158
  onClick: redo
35905
36159
  }
35906
36160
  ),
35907
- /* @__PURE__ */ jsx151(FlowToolbarDivider, {}),
35908
- /* @__PURE__ */ jsx151(
36161
+ /* @__PURE__ */ jsx152(FlowToolbarDivider, {}),
36162
+ /* @__PURE__ */ jsx152(
35909
36163
  FlowToolbarZoom,
35910
36164
  {
35911
36165
  zoom: workflow.canvas.viewport.zoom,
@@ -35944,21 +36198,21 @@ function WorkflowEditor({
35944
36198
  );
35945
36199
  const resolvedToolbar = toolbar === "default" ? defaultToolbar : toolbar === null ? null : toolbar;
35946
36200
  const isEmpty = workflow.canvas.nodes.length === 0 && workflow.canvas.edges.length === 0;
35947
- return /* @__PURE__ */ jsxs145(
36201
+ return /* @__PURE__ */ jsxs146(
35948
36202
  "div",
35949
36203
  {
35950
36204
  className: cn("ods-workflow-editor", className),
35951
36205
  style: { width, height, position: "relative", display: "flex", overflow: "hidden" },
35952
36206
  children: [
35953
- drawer && isDrawerOpen && /* @__PURE__ */ jsx151("div", { className: "ods-workflow-editor__drawer", children: drawer }),
35954
- /* @__PURE__ */ jsxs145(
36207
+ drawer && isDrawerOpen && /* @__PURE__ */ jsx152("div", { className: "ods-workflow-editor__drawer", children: drawer }),
36208
+ /* @__PURE__ */ jsxs146(
35955
36209
  "div",
35956
36210
  {
35957
36211
  ref: handleCanvasRef,
35958
36212
  className: "ods-workflow-editor__canvas-wrapper",
35959
36213
  style: { position: "relative", flex: 1, minWidth: 0 },
35960
36214
  children: [
35961
- /* @__PURE__ */ jsx151(
36215
+ /* @__PURE__ */ jsx152(
35962
36216
  FlowCanvas,
35963
36217
  {
35964
36218
  nodes: nextNodes,
@@ -35972,9 +36226,9 @@ function WorkflowEditor({
35972
36226
  children: resolvedToolbar
35973
36227
  }
35974
36228
  ),
35975
- minimap && /* @__PURE__ */ jsx151("div", { className: "ods-workflow-editor__minimap", children: minimap }),
35976
- consoleSlot && /* @__PURE__ */ jsx151("div", { className: "ods-workflow-editor__console", children: consoleSlot }),
35977
- isEmpty && emptyState && /* @__PURE__ */ jsx151("div", { className: "ods-workflow-editor__empty", children: emptyState }),
36229
+ minimap && /* @__PURE__ */ jsx152("div", { className: "ods-workflow-editor__minimap", children: minimap }),
36230
+ consoleSlot && /* @__PURE__ */ jsx152("div", { className: "ods-workflow-editor__console", children: consoleSlot }),
36231
+ isEmpty && emptyState && /* @__PURE__ */ jsx152("div", { className: "ods-workflow-editor__empty", children: emptyState }),
35978
36232
  children
35979
36233
  ]
35980
36234
  }
@@ -35984,7 +36238,7 @@ function WorkflowEditor({
35984
36238
  );
35985
36239
  }
35986
36240
  function DefaultEmptyState() {
35987
- return /* @__PURE__ */ jsxs145(
36241
+ return /* @__PURE__ */ jsxs146(
35988
36242
  "div",
35989
36243
  {
35990
36244
  style: {
@@ -35999,14 +36253,14 @@ function DefaultEmptyState() {
35999
36253
  pointerEvents: "none"
36000
36254
  },
36001
36255
  children: [
36002
- /* @__PURE__ */ jsx151(
36256
+ /* @__PURE__ */ jsx152(
36003
36257
  "div",
36004
36258
  {
36005
36259
  style: { fontSize: 14, fontWeight: 600, color: "var(--ods-text-primary)", marginBottom: 4 },
36006
36260
  children: "Start with a trigger"
36007
36261
  }
36008
36262
  ),
36009
- /* @__PURE__ */ jsx151("div", { style: { fontSize: 12 }, children: "Drop an action here, or use the drawer to add your first node." })
36263
+ /* @__PURE__ */ jsx152("div", { style: { fontSize: 12 }, children: "Drop an action here, or use the drawer to add your first node." })
36010
36264
  ]
36011
36265
  }
36012
36266
  );
@@ -36024,7 +36278,7 @@ import {
36024
36278
  } from "@octaviaflow/icons";
36025
36279
 
36026
36280
  // src/hooks/useWorkflowRuntime.ts
36027
- import { useEffect as useEffect56, useState as useState73 } from "react";
36281
+ import { useEffect as useEffect57, useState as useState73 } from "react";
36028
36282
  function toMs2(t) {
36029
36283
  if (t == null) return null;
36030
36284
  return typeof t === "number" ? t : t.getTime();
@@ -36039,7 +36293,7 @@ function formatWorkflowRuntime(ms) {
36039
36293
  }
36040
36294
  function useWorkflowRuntime(startedAt, active) {
36041
36295
  const [, force] = useState73(0);
36042
- useEffect56(() => {
36296
+ useEffect57(() => {
36043
36297
  if (!active || startedAt == null) return;
36044
36298
  if (typeof window === "undefined") return;
36045
36299
  const id = window.setInterval(() => force((n) => n + 1), 1e3);
@@ -36051,7 +36305,7 @@ function useWorkflowRuntime(startedAt, active) {
36051
36305
  }
36052
36306
 
36053
36307
  // src/components/WorkflowHeader/WorkflowHeader.tsx
36054
- import { Fragment as Fragment63, jsx as jsx152, jsxs as jsxs146 } from "react/jsx-runtime";
36308
+ import { Fragment as Fragment63, jsx as jsx153, jsxs as jsxs147 } from "react/jsx-runtime";
36055
36309
  function WorkflowHeader({
36056
36310
  name,
36057
36311
  statusTone,
@@ -36090,21 +36344,21 @@ function WorkflowHeader({
36090
36344
  })();
36091
36345
  const rootCls = cn("ods-workflow-header", `ods-workflow-header--${size}`, className);
36092
36346
  if (loading) {
36093
- return /* @__PURE__ */ jsxs146("header", { className: rootCls, "data-loading": "true", children: [
36094
- /* @__PURE__ */ jsxs146("div", { className: "ods-workflow-header__left", children: [
36095
- /* @__PURE__ */ jsx152(Skeleton, { variant: "text", width: "120px" }),
36096
- /* @__PURE__ */ jsx152(Skeleton, { variant: "text", width: "180px" })
36347
+ return /* @__PURE__ */ jsxs147("header", { className: rootCls, "data-loading": "true", children: [
36348
+ /* @__PURE__ */ jsxs147("div", { className: "ods-workflow-header__left", children: [
36349
+ /* @__PURE__ */ jsx153(Skeleton, { variant: "text", width: "120px" }),
36350
+ /* @__PURE__ */ jsx153(Skeleton, { variant: "text", width: "180px" })
36097
36351
  ] }),
36098
- /* @__PURE__ */ jsxs146("div", { className: "ods-workflow-header__right", children: [
36099
- /* @__PURE__ */ jsx152(Skeleton, { variant: "circular", width: "28px", height: "28px" }),
36100
- /* @__PURE__ */ jsx152(Skeleton, { variant: "circular", width: "28px", height: "28px" })
36352
+ /* @__PURE__ */ jsxs147("div", { className: "ods-workflow-header__right", children: [
36353
+ /* @__PURE__ */ jsx153(Skeleton, { variant: "circular", width: "28px", height: "28px" }),
36354
+ /* @__PURE__ */ jsx153(Skeleton, { variant: "circular", width: "28px", height: "28px" })
36101
36355
  ] })
36102
36356
  ] });
36103
36357
  }
36104
36358
  const envAccentStyle = environment?.accent ? { borderLeftColor: environment.accent } : void 0;
36105
- return /* @__PURE__ */ jsxs146("header", { className: rootCls, "data-running": isRunning ? "true" : void 0, children: [
36106
- /* @__PURE__ */ jsxs146("div", { className: "ods-workflow-header__left", children: [
36107
- onBack && /* @__PURE__ */ jsxs146(
36359
+ return /* @__PURE__ */ jsxs147("header", { className: rootCls, "data-running": isRunning ? "true" : void 0, children: [
36360
+ /* @__PURE__ */ jsxs147("div", { className: "ods-workflow-header__left", children: [
36361
+ onBack && /* @__PURE__ */ jsxs147(
36108
36362
  "button",
36109
36363
  {
36110
36364
  type: "button",
@@ -36112,13 +36366,13 @@ function WorkflowHeader({
36112
36366
  onClick: onBack,
36113
36367
  "aria-label": `Back to ${typeof parentLabel === "string" ? parentLabel : "previous"}`,
36114
36368
  children: [
36115
- /* @__PURE__ */ jsx152(ChevronLeftIcon3, { size: "sm" }),
36116
- /* @__PURE__ */ jsx152("span", { className: "ods-workflow-header__back-label", children: parentLabel }),
36117
- /* @__PURE__ */ jsx152("span", { className: "ods-workflow-header__back-separator", "aria-hidden": "true", children: "/" })
36369
+ /* @__PURE__ */ jsx153(ChevronLeftIcon3, { size: "sm" }),
36370
+ /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header__back-label", children: parentLabel }),
36371
+ /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header__back-separator", "aria-hidden": "true", children: "/" })
36118
36372
  ]
36119
36373
  }
36120
36374
  ),
36121
- /* @__PURE__ */ jsx152(
36375
+ /* @__PURE__ */ jsx153(
36122
36376
  "span",
36123
36377
  {
36124
36378
  className: cn(
@@ -36129,7 +36383,7 @@ function WorkflowHeader({
36129
36383
  role: "img"
36130
36384
  }
36131
36385
  ),
36132
- /* @__PURE__ */ jsx152(
36386
+ /* @__PURE__ */ jsx153(
36133
36387
  "h1",
36134
36388
  {
36135
36389
  className: "ods-workflow-header__title",
@@ -36137,9 +36391,9 @@ function WorkflowHeader({
36137
36391
  children: name
36138
36392
  }
36139
36393
  ),
36140
- saveIndicator && /* @__PURE__ */ jsxs146(Fragment63, { children: [
36141
- /* @__PURE__ */ jsx152("span", { className: "ods-workflow-header__sep", "aria-hidden": "true" }),
36142
- /* @__PURE__ */ jsxs146(
36394
+ saveIndicator && /* @__PURE__ */ jsxs147(Fragment63, { children: [
36395
+ /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header__sep", "aria-hidden": "true" }),
36396
+ /* @__PURE__ */ jsxs147(
36143
36397
  "span",
36144
36398
  {
36145
36399
  className: cn(
@@ -36150,14 +36404,14 @@ function WorkflowHeader({
36150
36404
  "aria-live": "polite",
36151
36405
  title: saveState === "error" ? saveError ?? void 0 : void 0,
36152
36406
  children: [
36153
- saveState === "saving" ? /* @__PURE__ */ jsx152("span", { className: "ods-workflow-header__save-spinner", "aria-hidden": "true" }) : saveState === "error" ? /* @__PURE__ */ jsx152(
36407
+ saveState === "saving" ? /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header__save-spinner", "aria-hidden": "true" }) : saveState === "error" ? /* @__PURE__ */ jsx153(
36154
36408
  WarningAltIcon3,
36155
36409
  {
36156
36410
  size: "sm",
36157
36411
  className: "ods-workflow-header__save-icon",
36158
36412
  "aria-hidden": "true"
36159
36413
  }
36160
- ) : /* @__PURE__ */ jsx152(
36414
+ ) : /* @__PURE__ */ jsx153(
36161
36415
  CheckmarkIcon15,
36162
36416
  {
36163
36417
  size: "sm",
@@ -36172,11 +36426,11 @@ function WorkflowHeader({
36172
36426
  ] }),
36173
36427
  leftSlot
36174
36428
  ] }),
36175
- /* @__PURE__ */ jsxs146("div", { className: "ods-workflow-header__right", children: [
36429
+ /* @__PURE__ */ jsxs147("div", { className: "ods-workflow-header__right", children: [
36176
36430
  rightSlot,
36177
36431
  environment && // Consumer-driven env chip. Accent (left border colour) comes
36178
36432
  // from the consumer — we don't bake in environment names.
36179
- /* @__PURE__ */ jsx152(
36433
+ /* @__PURE__ */ jsx153(
36180
36434
  Chip,
36181
36435
  {
36182
36436
  size: "sm",
@@ -36192,59 +36446,59 @@ function WorkflowHeader({
36192
36446
  children: environment.label
36193
36447
  }
36194
36448
  ),
36195
- onToggleConsole && (isRunning || consoleHasLogs) && /* @__PURE__ */ jsx152(
36449
+ onToggleConsole && (isRunning || consoleHasLogs) && /* @__PURE__ */ jsx153(
36196
36450
  Button,
36197
36451
  {
36198
36452
  variant: "ghost",
36199
36453
  size: "sm",
36200
36454
  pressed: !!isConsoleOpen,
36201
36455
  "aria-label": isConsoleOpen ? "Hide execution console" : "Show execution console",
36202
- leftIcon: /* @__PURE__ */ jsx152(TerminalIcon, { size: "sm" }),
36456
+ leftIcon: /* @__PURE__ */ jsx153(TerminalIcon, { size: "sm" }),
36203
36457
  onClick: onToggleConsole,
36204
36458
  children: "Console"
36205
36459
  }
36206
36460
  ),
36207
- (environment || onToggleConsole && (isRunning || consoleHasLogs)) && (isRunning || onRun || menuItems && menuItems.length > 0) && /* @__PURE__ */ jsx152("span", { className: "ods-workflow-header__micro-divider", "aria-hidden": "true" }),
36208
- isRunning ? onStop && /* @__PURE__ */ jsx152(
36461
+ (environment || onToggleConsole && (isRunning || consoleHasLogs)) && (isRunning || onRun || menuItems && menuItems.length > 0) && /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header__micro-divider", "aria-hidden": "true" }),
36462
+ isRunning ? onStop && /* @__PURE__ */ jsx153(
36209
36463
  Button,
36210
36464
  {
36211
36465
  variant: "ghost",
36212
36466
  size: "sm",
36213
36467
  "aria-label": runtime ? `Stop execution (running ${runtime})` : "Stop execution",
36214
- leftIcon: /* @__PURE__ */ jsx152(StopFilledAltIcon2, { size: "sm", className: "ods-workflow-header__stop-glyph" }),
36468
+ leftIcon: /* @__PURE__ */ jsx153(StopFilledAltIcon2, { size: "sm", className: "ods-workflow-header__stop-glyph" }),
36215
36469
  onClick: onStop,
36216
- children: /* @__PURE__ */ jsxs146("span", { className: "ods-workflow-header__stop-label", children: [
36217
- /* @__PURE__ */ jsx152("span", { children: "Stop" }),
36218
- runtime && /* @__PURE__ */ jsxs146(Fragment63, { children: [
36219
- /* @__PURE__ */ jsx152("span", { className: "ods-workflow-header__stop-dot", "aria-hidden": "true", children: "\xB7" }),
36220
- /* @__PURE__ */ jsx152("span", { className: "ods-workflow-header__runtime", children: runtime })
36470
+ children: /* @__PURE__ */ jsxs147("span", { className: "ods-workflow-header__stop-label", children: [
36471
+ /* @__PURE__ */ jsx153("span", { children: "Stop" }),
36472
+ runtime && /* @__PURE__ */ jsxs147(Fragment63, { children: [
36473
+ /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header__stop-dot", "aria-hidden": "true", children: "\xB7" }),
36474
+ /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header__runtime", children: runtime })
36221
36475
  ] })
36222
36476
  ] })
36223
36477
  }
36224
- ) : onRun && /* @__PURE__ */ jsx152(
36478
+ ) : onRun && /* @__PURE__ */ jsx153(
36225
36479
  Button,
36226
36480
  {
36227
36481
  variant: "primary",
36228
36482
  size: "sm",
36229
36483
  "aria-label": "Run workflow",
36230
- leftIcon: /* @__PURE__ */ jsx152(PlayFilledAltIcon2, { size: "sm" }),
36484
+ leftIcon: /* @__PURE__ */ jsx153(PlayFilledAltIcon2, { size: "sm" }),
36231
36485
  onClick: onRun,
36232
36486
  children: "Run"
36233
36487
  }
36234
36488
  ),
36235
- menu ?? (menuItems && menuItems.length > 0 && /* @__PURE__ */ jsx152(
36489
+ menu ?? (menuItems && menuItems.length > 0 && /* @__PURE__ */ jsx153(
36236
36490
  DropdownMenu,
36237
36491
  {
36238
36492
  "aria-label": menuLabel,
36239
36493
  align: "end",
36240
36494
  triggerClassName: "ods-workflow-header__menu-trigger",
36241
36495
  ...menuProps,
36242
- trigger: menuTrigger ?? /* @__PURE__ */ jsx152("span", { "aria-hidden": "true", className: "ods-workflow-header__menu-icon", children: /* @__PURE__ */ jsx152(OverflowMenuVerticalIcon, { size: "sm" }) }),
36496
+ trigger: menuTrigger ?? /* @__PURE__ */ jsx153("span", { "aria-hidden": "true", className: "ods-workflow-header__menu-icon", children: /* @__PURE__ */ jsx153(OverflowMenuVerticalIcon, { size: "sm" }) }),
36243
36497
  items: menuItems
36244
36498
  }
36245
36499
  ))
36246
36500
  ] }),
36247
- /* @__PURE__ */ jsx152("span", { className: "ods-workflow-header__progress", "aria-hidden": "true" })
36501
+ /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header__progress", "aria-hidden": "true" })
36248
36502
  ] });
36249
36503
  }
36250
36504
 
@@ -36256,7 +36510,7 @@ import {
36256
36510
  StopFilledAltIcon as StopFilledAltIcon3,
36257
36511
  TerminalIcon as TerminalIcon2
36258
36512
  } from "@octaviaflow/icons";
36259
- import { Fragment as Fragment64, jsx as jsx153, jsxs as jsxs147 } from "react/jsx-runtime";
36513
+ import { Fragment as Fragment64, jsx as jsx154, jsxs as jsxs148 } from "react/jsx-runtime";
36260
36514
  function WorkflowHeaderExpanded({
36261
36515
  name,
36262
36516
  statusTone = "draft",
@@ -36284,15 +36538,15 @@ function WorkflowHeaderExpanded({
36284
36538
  const tickedRuntime = useWorkflowRuntime(runStartedAt, !!isRunning);
36285
36539
  const runtime = runtimeOverride ?? tickedRuntime ?? void 0;
36286
36540
  const effectiveTone = statusTone === "draft" && isRunning ? "running" : statusTone;
36287
- return /* @__PURE__ */ jsxs147(
36541
+ return /* @__PURE__ */ jsxs148(
36288
36542
  "header",
36289
36543
  {
36290
36544
  className: cn("ods-workflow-header-expanded", className),
36291
36545
  "data-running": isRunning ? "true" : void 0,
36292
36546
  children: [
36293
- /* @__PURE__ */ jsxs147("div", { className: "ods-workflow-header-expanded__row ods-workflow-header-expanded__row--top", children: [
36294
- /* @__PURE__ */ jsxs147("div", { className: "ods-workflow-header-expanded__left", children: [
36295
- onBack && /* @__PURE__ */ jsxs147(
36547
+ /* @__PURE__ */ jsxs148("div", { className: "ods-workflow-header-expanded__row ods-workflow-header-expanded__row--top", children: [
36548
+ /* @__PURE__ */ jsxs148("div", { className: "ods-workflow-header-expanded__left", children: [
36549
+ onBack && /* @__PURE__ */ jsxs148(
36296
36550
  "button",
36297
36551
  {
36298
36552
  type: "button",
@@ -36300,13 +36554,13 @@ function WorkflowHeaderExpanded({
36300
36554
  onClick: onBack,
36301
36555
  "aria-label": `Back to ${typeof parentLabel === "string" ? parentLabel : "previous"}`,
36302
36556
  children: [
36303
- /* @__PURE__ */ jsx153(ChevronLeftIcon4, { size: "sm" }),
36304
- /* @__PURE__ */ jsx153("span", { children: parentLabel }),
36305
- /* @__PURE__ */ jsx153("span", { "aria-hidden": "true", className: "ods-workflow-header-expanded__back-sep", children: "/" })
36557
+ /* @__PURE__ */ jsx154(ChevronLeftIcon4, { size: "sm" }),
36558
+ /* @__PURE__ */ jsx154("span", { children: parentLabel }),
36559
+ /* @__PURE__ */ jsx154("span", { "aria-hidden": "true", className: "ods-workflow-header-expanded__back-sep", children: "/" })
36306
36560
  ]
36307
36561
  }
36308
36562
  ),
36309
- /* @__PURE__ */ jsx153(
36563
+ /* @__PURE__ */ jsx154(
36310
36564
  "span",
36311
36565
  {
36312
36566
  className: cn(
@@ -36317,10 +36571,10 @@ function WorkflowHeaderExpanded({
36317
36571
  role: "img"
36318
36572
  }
36319
36573
  ),
36320
- /* @__PURE__ */ jsx153("h1", { className: "ods-workflow-header-expanded__title", children: name })
36574
+ /* @__PURE__ */ jsx154("h1", { className: "ods-workflow-header-expanded__title", children: name })
36321
36575
  ] }),
36322
- /* @__PURE__ */ jsxs147("div", { className: "ods-workflow-header-expanded__right", children: [
36323
- environment && /* @__PURE__ */ jsx153(
36576
+ /* @__PURE__ */ jsxs148("div", { className: "ods-workflow-header-expanded__right", children: [
36577
+ environment && /* @__PURE__ */ jsx154(
36324
36578
  Chip,
36325
36579
  {
36326
36580
  size: "sm",
@@ -36332,26 +36586,26 @@ function WorkflowHeaderExpanded({
36332
36586
  children: environment.label
36333
36587
  }
36334
36588
  ),
36335
- onToggleConsole && (isRunning || consoleHasLogs) && /* @__PURE__ */ jsx153(
36589
+ onToggleConsole && (isRunning || consoleHasLogs) && /* @__PURE__ */ jsx154(
36336
36590
  Button,
36337
36591
  {
36338
36592
  variant: "ghost",
36339
36593
  size: "sm",
36340
36594
  pressed: !!isConsoleOpen,
36341
36595
  "aria-label": isConsoleOpen ? "Hide execution console" : "Show execution console",
36342
- leftIcon: /* @__PURE__ */ jsx153(TerminalIcon2, { size: "sm" }),
36596
+ leftIcon: /* @__PURE__ */ jsx154(TerminalIcon2, { size: "sm" }),
36343
36597
  onClick: onToggleConsole,
36344
36598
  children: "Console"
36345
36599
  }
36346
36600
  ),
36347
- (environment || onToggleConsole && (isRunning || consoleHasLogs)) && (isRunning || onRun || menuItems && menuItems.length > 0) && /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header-expanded__micro-divider", "aria-hidden": "true" }),
36348
- isRunning ? onStop && /* @__PURE__ */ jsx153(
36601
+ (environment || onToggleConsole && (isRunning || consoleHasLogs)) && (isRunning || onRun || menuItems && menuItems.length > 0) && /* @__PURE__ */ jsx154("span", { className: "ods-workflow-header-expanded__micro-divider", "aria-hidden": "true" }),
36602
+ isRunning ? onStop && /* @__PURE__ */ jsx154(
36349
36603
  Button,
36350
36604
  {
36351
36605
  variant: "ghost",
36352
36606
  size: "sm",
36353
36607
  "aria-label": runtime ? `Stop execution (running ${runtime})` : "Stop execution",
36354
- leftIcon: /* @__PURE__ */ jsx153(
36608
+ leftIcon: /* @__PURE__ */ jsx154(
36355
36609
  StopFilledAltIcon3,
36356
36610
  {
36357
36611
  size: "sm",
@@ -36359,37 +36613,37 @@ function WorkflowHeaderExpanded({
36359
36613
  }
36360
36614
  ),
36361
36615
  onClick: onStop,
36362
- children: /* @__PURE__ */ jsxs147("span", { style: { display: "inline-flex", gap: 4, alignItems: "center" }, children: [
36363
- /* @__PURE__ */ jsx153("span", { children: "Stop" }),
36364
- runtime && /* @__PURE__ */ jsxs147(Fragment64, { children: [
36365
- /* @__PURE__ */ jsx153("span", { "aria-hidden": "true", style: { opacity: 0.6 }, children: "\xB7" }),
36366
- /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header-expanded__runtime", children: runtime })
36616
+ children: /* @__PURE__ */ jsxs148("span", { style: { display: "inline-flex", gap: 4, alignItems: "center" }, children: [
36617
+ /* @__PURE__ */ jsx154("span", { children: "Stop" }),
36618
+ runtime && /* @__PURE__ */ jsxs148(Fragment64, { children: [
36619
+ /* @__PURE__ */ jsx154("span", { "aria-hidden": "true", style: { opacity: 0.6 }, children: "\xB7" }),
36620
+ /* @__PURE__ */ jsx154("span", { className: "ods-workflow-header-expanded__runtime", children: runtime })
36367
36621
  ] })
36368
36622
  ] })
36369
36623
  }
36370
- ) : onRun && /* @__PURE__ */ jsx153(
36624
+ ) : onRun && /* @__PURE__ */ jsx154(
36371
36625
  Button,
36372
36626
  {
36373
36627
  variant: "primary",
36374
36628
  size: "sm",
36375
36629
  "aria-label": "Run workflow",
36376
- leftIcon: /* @__PURE__ */ jsx153(PlayFilledAltIcon3, { size: "sm" }),
36630
+ leftIcon: /* @__PURE__ */ jsx154(PlayFilledAltIcon3, { size: "sm" }),
36377
36631
  onClick: onRun,
36378
36632
  children: "Run"
36379
36633
  }
36380
36634
  ),
36381
- menu ?? (menuItems && menuItems.length > 0 && /* @__PURE__ */ jsx153(
36635
+ menu ?? (menuItems && menuItems.length > 0 && /* @__PURE__ */ jsx154(
36382
36636
  DropdownMenu,
36383
36637
  {
36384
36638
  "aria-label": menuLabel,
36385
36639
  align: "end",
36386
36640
  ...menuProps,
36387
- trigger: menuTrigger ?? /* @__PURE__ */ jsx153(
36641
+ trigger: menuTrigger ?? /* @__PURE__ */ jsx154(
36388
36642
  Button,
36389
36643
  {
36390
36644
  variant: "ghost",
36391
36645
  size: "sm",
36392
- leftIcon: /* @__PURE__ */ jsx153(OverflowMenuVerticalIcon2, { size: "sm" })
36646
+ leftIcon: /* @__PURE__ */ jsx154(OverflowMenuVerticalIcon2, { size: "sm" })
36393
36647
  }
36394
36648
  ),
36395
36649
  items: menuItems
@@ -36397,10 +36651,10 @@ function WorkflowHeaderExpanded({
36397
36651
  ))
36398
36652
  ] })
36399
36653
  ] }),
36400
- (meta2 || saveLabel) && /* @__PURE__ */ jsx153("div", { className: "ods-workflow-header-expanded__row ods-workflow-header-expanded__row--bottom", children: /* @__PURE__ */ jsxs147("span", { className: "ods-workflow-header-expanded__meta", children: [
36654
+ (meta2 || saveLabel) && /* @__PURE__ */ jsx154("div", { className: "ods-workflow-header-expanded__row ods-workflow-header-expanded__row--bottom", children: /* @__PURE__ */ jsxs148("span", { className: "ods-workflow-header-expanded__meta", children: [
36401
36655
  meta2,
36402
- meta2 && saveLabel && /* @__PURE__ */ jsx153("span", { "aria-hidden": "true", style: { margin: "0 6px", opacity: 0.4 }, children: "\xB7" }),
36403
- saveLabel && /* @__PURE__ */ jsx153(
36656
+ meta2 && saveLabel && /* @__PURE__ */ jsx154("span", { "aria-hidden": "true", style: { margin: "0 6px", opacity: 0.4 }, children: "\xB7" }),
36657
+ saveLabel && /* @__PURE__ */ jsx154(
36404
36658
  "span",
36405
36659
  {
36406
36660
  className: cn(
@@ -36412,36 +36666,36 @@ function WorkflowHeaderExpanded({
36412
36666
  }
36413
36667
  )
36414
36668
  ] }) }),
36415
- /* @__PURE__ */ jsx153("span", { className: "ods-workflow-header-expanded__progress", "aria-hidden": "true" })
36669
+ /* @__PURE__ */ jsx154("span", { className: "ods-workflow-header-expanded__progress", "aria-hidden": "true" })
36416
36670
  ]
36417
36671
  }
36418
36672
  );
36419
36673
  }
36420
36674
 
36421
36675
  // src/hooks/useBanner.ts
36422
- import { useCallback as useCallback53, useEffect as useEffect57, useRef as useRef50, useState as useState74 } from "react";
36676
+ import { useCallback as useCallback54, useEffect as useEffect58, useRef as useRef51, useState as useState74 } from "react";
36423
36677
  function useBanner(options2 = {}) {
36424
36678
  const { defaultOpen = false, autoDismissAfter, onDismiss } = options2;
36425
36679
  const [open, setOpen] = useState74(defaultOpen);
36426
- const timerRef = useRef50(null);
36427
- const onDismissRef = useRef50(onDismiss);
36428
- useEffect57(() => {
36680
+ const timerRef = useRef51(null);
36681
+ const onDismissRef = useRef51(onDismiss);
36682
+ useEffect58(() => {
36429
36683
  onDismissRef.current = onDismiss;
36430
36684
  }, [onDismiss]);
36431
- const clearTimer = useCallback53(() => {
36685
+ const clearTimer = useCallback54(() => {
36432
36686
  if (timerRef.current !== null) {
36433
36687
  clearTimeout(timerRef.current);
36434
36688
  timerRef.current = null;
36435
36689
  }
36436
36690
  }, []);
36437
- const hide = useCallback53(() => {
36691
+ const hide = useCallback54(() => {
36438
36692
  clearTimer();
36439
36693
  setOpen((wasOpen) => {
36440
36694
  if (wasOpen) onDismissRef.current?.();
36441
36695
  return false;
36442
36696
  });
36443
36697
  }, [clearTimer]);
36444
- const show = useCallback53(() => {
36698
+ const show = useCallback54(() => {
36445
36699
  clearTimer();
36446
36700
  setOpen(true);
36447
36701
  if (typeof autoDismissAfter === "number" && Number.isFinite(autoDismissAfter) && autoDismissAfter > 0) {
@@ -36452,11 +36706,11 @@ function useBanner(options2 = {}) {
36452
36706
  }, autoDismissAfter);
36453
36707
  }
36454
36708
  }, [autoDismissAfter, clearTimer]);
36455
- const toggle = useCallback53(() => {
36709
+ const toggle = useCallback54(() => {
36456
36710
  if (open) hide();
36457
36711
  else show();
36458
36712
  }, [open, show, hide]);
36459
- useEffect57(() => () => clearTimer(), [clearTimer]);
36713
+ useEffect58(() => () => clearTimer(), [clearTimer]);
36460
36714
  return {
36461
36715
  open,
36462
36716
  show,
@@ -36467,7 +36721,7 @@ function useBanner(options2 = {}) {
36467
36721
  }
36468
36722
 
36469
36723
  // src/hooks/useCallout.ts
36470
- import { useCallback as useCallback54, useEffect as useEffect58, useState as useState75 } from "react";
36724
+ import { useCallback as useCallback55, useEffect as useEffect59, useState as useState75 } from "react";
36471
36725
  var STORAGE_PREFIX = "ods:callout:dismissed:";
36472
36726
  function readPersisted(key) {
36473
36727
  if (!key || typeof window === "undefined") return false;
@@ -36491,12 +36745,12 @@ function writePersisted(key, value) {
36491
36745
  function useCallout(options2 = {}) {
36492
36746
  const { defaultOpen = true, persistKey, onDismiss } = options2;
36493
36747
  const [open, setOpen] = useState75(defaultOpen);
36494
- useEffect58(() => {
36748
+ useEffect59(() => {
36495
36749
  if (persistKey && readPersisted(persistKey)) {
36496
36750
  setOpen(false);
36497
36751
  }
36498
36752
  }, []);
36499
- const dismiss = useCallback54(() => {
36753
+ const dismiss = useCallback55(() => {
36500
36754
  setOpen((wasOpen) => {
36501
36755
  if (wasOpen) {
36502
36756
  writePersisted(persistKey, true);
@@ -36505,10 +36759,10 @@ function useCallout(options2 = {}) {
36505
36759
  return false;
36506
36760
  });
36507
36761
  }, [persistKey, onDismiss]);
36508
- const show = useCallback54(() => {
36762
+ const show = useCallback55(() => {
36509
36763
  setOpen(true);
36510
36764
  }, []);
36511
- const toggle = useCallback54(() => {
36765
+ const toggle = useCallback55(() => {
36512
36766
  setOpen((prev) => {
36513
36767
  const next = !prev;
36514
36768
  if (!next) {
@@ -36518,7 +36772,7 @@ function useCallout(options2 = {}) {
36518
36772
  return next;
36519
36773
  });
36520
36774
  }, [persistKey, onDismiss]);
36521
- const reset = useCallback54(() => {
36775
+ const reset = useCallback55(() => {
36522
36776
  writePersisted(persistKey, false);
36523
36777
  setOpen(true);
36524
36778
  }, [persistKey]);
@@ -36591,7 +36845,7 @@ function breakpointMinWidth(name) {
36591
36845
  }
36592
36846
 
36593
36847
  // src/hooks/useRating.ts
36594
- import { useCallback as useCallback55, useState as useState76 } from "react";
36848
+ import { useCallback as useCallback56, useState as useState76 } from "react";
36595
36849
  function useRating({
36596
36850
  value: controlled,
36597
36851
  defaultValue = 0,
@@ -36602,11 +36856,11 @@ function useRating({
36602
36856
  const [internal, setInternal] = useState76(defaultValue);
36603
36857
  const value = controlled ?? internal;
36604
36858
  const isControlled = controlled !== void 0;
36605
- const clamp2 = useCallback55(
36859
+ const clamp2 = useCallback56(
36606
36860
  (v) => Math.max(0, Math.min(max, v)),
36607
36861
  [max]
36608
36862
  );
36609
- const set = useCallback55(
36863
+ const set = useCallback56(
36610
36864
  (next) => {
36611
36865
  const clamped = clamp2(next);
36612
36866
  if (!isControlled) setInternal(clamped);
@@ -36631,7 +36885,7 @@ function useBinaryRating({
36631
36885
  const [internal, setInternal] = useState76(defaultValue);
36632
36886
  const value = controlled ?? internal;
36633
36887
  const isControlled = controlled !== void 0;
36634
- const set = useCallback55(
36888
+ const set = useCallback56(
36635
36889
  (next) => {
36636
36890
  if (!isControlled) setInternal(next);
36637
36891
  onChange?.(next);
@@ -36650,7 +36904,7 @@ function useBinaryRating({
36650
36904
  }
36651
36905
 
36652
36906
  // src/hooks/useTimeline.ts
36653
- import { useCallback as useCallback56, useState as useState77 } from "react";
36907
+ import { useCallback as useCallback57, useState as useState77 } from "react";
36654
36908
  function useTimeline({
36655
36909
  items: controlled,
36656
36910
  defaultItems = [],
@@ -36659,21 +36913,21 @@ function useTimeline({
36659
36913
  const [internal, setInternal] = useState77(defaultItems);
36660
36914
  const items = controlled ?? internal;
36661
36915
  const isControlled = controlled !== void 0;
36662
- const commit = useCallback56(
36916
+ const commit = useCallback57(
36663
36917
  (next) => {
36664
36918
  if (!isControlled) setInternal(next);
36665
36919
  onChange?.(next);
36666
36920
  },
36667
36921
  [isControlled, onChange]
36668
36922
  );
36669
- const add = useCallback56(
36923
+ const add = useCallback57(
36670
36924
  (item) => {
36671
36925
  if (items.some((i) => i.id === item.id)) return;
36672
36926
  commit([...items, item]);
36673
36927
  },
36674
36928
  [items, commit]
36675
36929
  );
36676
- const insert = useCallback56(
36930
+ const insert = useCallback57(
36677
36931
  (index, item) => {
36678
36932
  if (items.some((i) => i.id === item.id)) return;
36679
36933
  const at = Math.max(0, Math.min(items.length, index));
@@ -36683,7 +36937,7 @@ function useTimeline({
36683
36937
  },
36684
36938
  [items, commit]
36685
36939
  );
36686
- const remove = useCallback56(
36940
+ const remove = useCallback57(
36687
36941
  (id) => {
36688
36942
  const next = items.filter((i) => i.id !== id);
36689
36943
  if (next.length === items.length) return;
@@ -36691,7 +36945,7 @@ function useTimeline({
36691
36945
  },
36692
36946
  [items, commit]
36693
36947
  );
36694
- const update = useCallback56(
36948
+ const update = useCallback57(
36695
36949
  (id, patch) => {
36696
36950
  let changed = false;
36697
36951
  const next = items.map((i) => {
@@ -36716,7 +36970,7 @@ function useTimeline({
36716
36970
  }
36717
36971
 
36718
36972
  // src/hooks/useTraceTimeline.ts
36719
- import { useCallback as useCallback57, useRef as useRef51, useState as useState78 } from "react";
36973
+ import { useCallback as useCallback58, useRef as useRef52, useState as useState78 } from "react";
36720
36974
  var GLOBAL_SEQ = 0;
36721
36975
  var generateId = () => `ods-trace-${Date.now().toString(36)}-${(GLOBAL_SEQ++).toString(36)}`;
36722
36976
  function useTraceTimeline({
@@ -36727,9 +36981,9 @@ function useTraceTimeline({
36727
36981
  const [internal, setInternal] = useState78(defaultSteps);
36728
36982
  const steps = controlled ?? internal;
36729
36983
  const isControlled = controlled !== void 0;
36730
- const stepsRef = useRef51(steps);
36984
+ const stepsRef = useRef52(steps);
36731
36985
  stepsRef.current = steps;
36732
- const commit = useCallback57(
36986
+ const commit = useCallback58(
36733
36987
  (next) => {
36734
36988
  stepsRef.current = next;
36735
36989
  if (!isControlled) setInternal(next);
@@ -36737,7 +36991,7 @@ function useTraceTimeline({
36737
36991
  },
36738
36992
  [isControlled, onChange]
36739
36993
  );
36740
- const start = useCallback57(
36994
+ const start = useCallback58(
36741
36995
  (input) => {
36742
36996
  const id = input.id ?? generateId();
36743
36997
  const record = {
@@ -36757,7 +37011,7 @@ function useTraceTimeline({
36757
37011
  },
36758
37012
  [commit]
36759
37013
  );
36760
- const update = useCallback57(
37014
+ const update = useCallback58(
36761
37015
  (id, patch) => {
36762
37016
  let changed = false;
36763
37017
  const next = stepsRef.current.map((s) => {
@@ -36769,19 +37023,19 @@ function useTraceTimeline({
36769
37023
  },
36770
37024
  [commit]
36771
37025
  );
36772
- const complete = useCallback57(
37026
+ const complete = useCallback58(
36773
37027
  (id, patch = {}) => {
36774
37028
  update(id, { ...patch, status: "success" });
36775
37029
  },
36776
37030
  [update]
36777
37031
  );
36778
- const fail = useCallback57(
37032
+ const fail = useCallback58(
36779
37033
  (id, patch = {}) => {
36780
37034
  update(id, { ...patch, status: "failed" });
36781
37035
  },
36782
37036
  [update]
36783
37037
  );
36784
- const remove = useCallback57(
37038
+ const remove = useCallback58(
36785
37039
  (id) => {
36786
37040
  const next = stepsRef.current.filter((s) => s.id !== id);
36787
37041
  if (next.length === stepsRef.current.length) return;
@@ -36807,13 +37061,13 @@ function useTraceTimeline({
36807
37061
 
36808
37062
  // src/provider/OdsProvider.tsx
36809
37063
  import { generateCssVars, resolveConfig } from "@octaviaflow/config";
36810
- import { createContext as createContext4, useContext as useContext5, useEffect as useEffect59, useMemo as useMemo40 } from "react";
37064
+ import { createContext as createContext4, useContext as useContext5, useEffect as useEffect60, useMemo as useMemo40 } from "react";
36811
37065
  import { OverlayProvider as OverlayProvider3 } from "react-aria";
36812
- import { jsx as jsx154 } from "react/jsx-runtime";
37066
+ import { jsx as jsx155 } from "react/jsx-runtime";
36813
37067
  var OdsContext = createContext4(null);
36814
37068
  function OdsProvider({ config: userConfig, children }) {
36815
37069
  const resolved = useMemo40(() => resolveConfig(userConfig), [userConfig]);
36816
- useEffect59(() => {
37070
+ useEffect60(() => {
36817
37071
  const cssVarsBlock = generateCssVars(resolved);
36818
37072
  const match = cssVarsBlock.match(/:root\s*\{([\s\S]*)\}/);
36819
37073
  if (match) {
@@ -36830,7 +37084,7 @@ function OdsProvider({ config: userConfig, children }) {
36830
37084
  }
36831
37085
  }, [resolved]);
36832
37086
  const contextValue = useMemo40(() => ({ config: resolved }), [resolved]);
36833
- return /* @__PURE__ */ jsx154(OdsContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx154(OverlayProvider3, { children }) });
37087
+ return /* @__PURE__ */ jsx155(OdsContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx155(OverlayProvider3, { children }) });
36834
37088
  }
36835
37089
  function useOds() {
36836
37090
  const ctx = useContext5(OdsContext);
@@ -37141,7 +37395,7 @@ function applyVerticalLayout(nodes, edges) {
37141
37395
  }
37142
37396
 
37143
37397
  // src/notifications/components/AlertConditionComposer/AlertConditionComposer.tsx
37144
- import { useId as useId64 } from "react";
37398
+ import { useId as useId65 } from "react";
37145
37399
 
37146
37400
  // src/notifications/engine/catalog.ts
37147
37401
  var DEFAULT_NOTIFICATION_CATALOG = [
@@ -37637,7 +37891,7 @@ function describeRule(rule, catalog, channels) {
37637
37891
  }
37638
37892
 
37639
37893
  // src/notifications/components/AlertConditionComposer/AlertConditionComposer.tsx
37640
- import { Fragment as Fragment65, jsx as jsx155, jsxs as jsxs148 } from "react/jsx-runtime";
37894
+ import { Fragment as Fragment65, jsx as jsx156, jsxs as jsxs149 } from "react/jsx-runtime";
37641
37895
  var KIND_LABELS = {
37642
37896
  every: "every time it happens",
37643
37897
  state_change: "only when its status changes",
@@ -37663,7 +37917,7 @@ function AlertConditionComposer({
37663
37917
  className,
37664
37918
  id
37665
37919
  }) {
37666
- const reactId = useId64();
37920
+ const reactId = useId65();
37667
37921
  const baseId = id ?? `${reactId}-condition`;
37668
37922
  const helperId = `${baseId}-helper`;
37669
37923
  const kinds = allowThreshold ? ["every", "state_change", "consecutive", "count"] : ["every", "state_change"];
@@ -37689,7 +37943,7 @@ function AlertConditionComposer({
37689
37943
  onChange({ kind: "every" });
37690
37944
  }
37691
37945
  };
37692
- return /* @__PURE__ */ jsxs148(
37946
+ return /* @__PURE__ */ jsxs149(
37693
37947
  "div",
37694
37948
  {
37695
37949
  className: cn("ods-alert-condition", className),
@@ -37699,10 +37953,10 @@ function AlertConditionComposer({
37699
37953
  "aria-describedby": helperText ? helperId : void 0,
37700
37954
  "data-size": size,
37701
37955
  children: [
37702
- label && /* @__PURE__ */ jsx155("div", { className: "ods-alert-condition__label", children: label }),
37703
- /* @__PURE__ */ jsxs148("div", { className: "ods-alert-condition__sentence", children: [
37704
- /* @__PURE__ */ jsx155("span", { className: "ods-alert-condition__word", children: "Notify" }),
37705
- /* @__PURE__ */ jsx155(
37956
+ label && /* @__PURE__ */ jsx156("div", { className: "ods-alert-condition__label", children: label }),
37957
+ /* @__PURE__ */ jsxs149("div", { className: "ods-alert-condition__sentence", children: [
37958
+ /* @__PURE__ */ jsx156("span", { className: "ods-alert-condition__word", children: "Notify" }),
37959
+ /* @__PURE__ */ jsx156(
37706
37960
  Select,
37707
37961
  {
37708
37962
  "aria-label": "Condition kind",
@@ -37715,8 +37969,8 @@ function AlertConditionComposer({
37715
37969
  dropdownMinWidth: 280
37716
37970
  }
37717
37971
  ),
37718
- value.kind === "consecutive" && /* @__PURE__ */ jsxs148(Fragment65, { children: [
37719
- /* @__PURE__ */ jsx155(
37972
+ value.kind === "consecutive" && /* @__PURE__ */ jsxs149(Fragment65, { children: [
37973
+ /* @__PURE__ */ jsx156(
37720
37974
  NumberInput,
37721
37975
  {
37722
37976
  "aria-label": "Consecutive failures",
@@ -37730,13 +37984,13 @@ function AlertConditionComposer({
37730
37984
  align: "center"
37731
37985
  }
37732
37986
  ),
37733
- /* @__PURE__ */ jsxs148("span", { className: "ods-alert-condition__word", children: [
37987
+ /* @__PURE__ */ jsxs149("span", { className: "ods-alert-condition__word", children: [
37734
37988
  "failures in a row for the same ",
37735
37989
  subjectNoun
37736
37990
  ] })
37737
37991
  ] }),
37738
- value.kind === "count" && /* @__PURE__ */ jsxs148(Fragment65, { children: [
37739
- /* @__PURE__ */ jsx155(
37992
+ value.kind === "count" && /* @__PURE__ */ jsxs149(Fragment65, { children: [
37993
+ /* @__PURE__ */ jsx156(
37740
37994
  NumberInput,
37741
37995
  {
37742
37996
  "aria-label": "Occurrences",
@@ -37750,8 +38004,8 @@ function AlertConditionComposer({
37750
38004
  align: "center"
37751
38005
  }
37752
38006
  ),
37753
- /* @__PURE__ */ jsx155("span", { className: "ods-alert-condition__word", children: "times in" }),
37754
- /* @__PURE__ */ jsx155(
38007
+ /* @__PURE__ */ jsx156("span", { className: "ods-alert-condition__word", children: "times in" }),
38008
+ /* @__PURE__ */ jsx156(
37755
38009
  Select,
37756
38010
  {
37757
38011
  "aria-label": "Window",
@@ -37763,14 +38017,14 @@ function AlertConditionComposer({
37763
38017
  className: "ods-alert-condition__window"
37764
38018
  }
37765
38019
  ),
37766
- /* @__PURE__ */ jsxs148("span", { className: "ods-alert-condition__word", children: [
38020
+ /* @__PURE__ */ jsxs149("span", { className: "ods-alert-condition__word", children: [
37767
38021
  "for the same ",
37768
38022
  subjectNoun
37769
38023
  ] })
37770
38024
  ] })
37771
38025
  ] }),
37772
- /* @__PURE__ */ jsx155("div", { className: "ods-alert-condition__summary", "aria-live": "polite", children: value.kind === "every" ? `Every occurrence is sent (still de-duplicated per ${subjectNoun}).` : `Sends${describeCondition(value, subjectNoun)}.` }),
37773
- helperText && /* @__PURE__ */ jsx155("div", { id: helperId, className: "ods-alert-condition__helper", children: helperText })
38026
+ /* @__PURE__ */ jsx156("div", { className: "ods-alert-condition__summary", "aria-live": "polite", children: value.kind === "every" ? `Every occurrence is sent (still de-duplicated per ${subjectNoun}).` : `Sends${describeCondition(value, subjectNoun)}.` }),
38027
+ helperText && /* @__PURE__ */ jsx156("div", { id: helperId, className: "ods-alert-condition__helper", children: helperText })
37774
38028
  ]
37775
38029
  }
37776
38030
  );
@@ -37778,8 +38032,8 @@ function AlertConditionComposer({
37778
38032
  AlertConditionComposer.displayName = "AlertConditionComposer";
37779
38033
 
37780
38034
  // src/notifications/components/DeliveryFrequencyControl/DeliveryFrequencyControl.tsx
37781
- import { useId as useId65 } from "react";
37782
- import { jsx as jsx156, jsxs as jsxs149 } from "react/jsx-runtime";
38035
+ import { useId as useId66 } from "react";
38036
+ import { jsx as jsx157, jsxs as jsxs150 } from "react/jsx-runtime";
37783
38037
  var MODE_LABELS = {
37784
38038
  immediate: "Immediately",
37785
38039
  batched: "Batched",
@@ -37806,7 +38060,7 @@ function DeliveryFrequencyControl({
37806
38060
  className,
37807
38061
  id
37808
38062
  }) {
37809
- const reactId = useId65();
38063
+ const reactId = useId66();
37810
38064
  const baseId = id ?? `${reactId}-delivery`;
37811
38065
  const patch = (next) => onChange({ ...value, ...next });
37812
38066
  const windowOptions = batchWindows.map((m) => ({
@@ -37820,7 +38074,7 @@ function DeliveryFrequencyControl({
37820
38074
  if (mode === "digest" && !next.schedule) next.schedule = DEFAULT_SCHEDULE;
37821
38075
  onChange(next);
37822
38076
  };
37823
- return /* @__PURE__ */ jsxs149(
38077
+ return /* @__PURE__ */ jsxs150(
37824
38078
  "div",
37825
38079
  {
37826
38080
  className: cn("ods-delivery-freq", className),
@@ -37828,8 +38082,8 @@ function DeliveryFrequencyControl({
37828
38082
  role: "group",
37829
38083
  "aria-label": typeof label === "string" ? label : "Delivery",
37830
38084
  children: [
37831
- label && /* @__PURE__ */ jsx156("div", { className: "ods-delivery-freq__label", children: label }),
37832
- /* @__PURE__ */ jsx156(
38085
+ label && /* @__PURE__ */ jsx157("div", { className: "ods-delivery-freq__label", children: label }),
38086
+ /* @__PURE__ */ jsx157(
37833
38087
  SegmentedControl,
37834
38088
  {
37835
38089
  "aria-label": "Delivery mode",
@@ -37840,10 +38094,10 @@ function DeliveryFrequencyControl({
37840
38094
  disabled
37841
38095
  }
37842
38096
  ),
37843
- /* @__PURE__ */ jsx156("div", { className: "ods-delivery-freq__hint", children: MODE_HINTS[value.mode] }),
37844
- value.mode === "batched" && /* @__PURE__ */ jsx156("div", { className: "ods-delivery-freq__fields", children: /* @__PURE__ */ jsxs149("div", { className: "ods-delivery-freq__row", children: [
37845
- /* @__PURE__ */ jsx156("span", { className: "ods-delivery-freq__word", children: "Send at most one message every" }),
37846
- /* @__PURE__ */ jsx156(
38097
+ /* @__PURE__ */ jsx157("div", { className: "ods-delivery-freq__hint", children: MODE_HINTS[value.mode] }),
38098
+ value.mode === "batched" && /* @__PURE__ */ jsx157("div", { className: "ods-delivery-freq__fields", children: /* @__PURE__ */ jsxs150("div", { className: "ods-delivery-freq__row", children: [
38099
+ /* @__PURE__ */ jsx157("span", { className: "ods-delivery-freq__word", children: "Send at most one message every" }),
38100
+ /* @__PURE__ */ jsx157(
37847
38101
  Select,
37848
38102
  {
37849
38103
  "aria-label": "Batch window",
@@ -37856,8 +38110,8 @@ function DeliveryFrequencyControl({
37856
38110
  }
37857
38111
  )
37858
38112
  ] }) }),
37859
- value.mode === "digest" && /* @__PURE__ */ jsxs149("div", { className: "ods-delivery-freq__fields", children: [
37860
- /* @__PURE__ */ jsx156(
38113
+ value.mode === "digest" && /* @__PURE__ */ jsxs150("div", { className: "ods-delivery-freq__fields", children: [
38114
+ /* @__PURE__ */ jsx157(
37861
38115
  ScheduleBuilder,
37862
38116
  {
37863
38117
  value: value.schedule ?? DEFAULT_SCHEDULE,
@@ -37867,7 +38121,7 @@ function DeliveryFrequencyControl({
37867
38121
  disabled
37868
38122
  }
37869
38123
  ),
37870
- /* @__PURE__ */ jsx156(
38124
+ /* @__PURE__ */ jsx157(
37871
38125
  Switch,
37872
38126
  {
37873
38127
  size: "sm",
@@ -37887,7 +38141,7 @@ DeliveryFrequencyControl.displayName = "DeliveryFrequencyControl";
37887
38141
 
37888
38142
  // src/notifications/components/EventCatalogPicker/EventCatalogPicker.tsx
37889
38143
  import { SearchIcon as SearchIcon16 } from "@octaviaflow/icons";
37890
- import { useId as useId66, useMemo as useMemo41, useState as useState79 } from "react";
38144
+ import { useId as useId67, useMemo as useMemo41, useState as useState79 } from "react";
37891
38145
 
37892
38146
  // src/notifications/components/meta.tsx
37893
38147
  import {
@@ -37902,55 +38156,55 @@ import {
37902
38156
  WarningFilledIcon as WarningFilledIcon3,
37903
38157
  WebhookIcon
37904
38158
  } from "@octaviaflow/icons";
37905
- import { jsx as jsx157 } from "react/jsx-runtime";
38159
+ import { jsx as jsx158 } from "react/jsx-runtime";
37906
38160
  var CHANNEL_TYPE_META = {
37907
38161
  in_app: {
37908
38162
  label: "In-app",
37909
38163
  hint: "The bell in the top bar. Always on.",
37910
38164
  connected: false,
37911
- icon: /* @__PURE__ */ jsx157(NotificationIcon, { size: "sm", "aria-hidden": "true" })
38165
+ icon: /* @__PURE__ */ jsx158(NotificationIcon, { size: "sm", "aria-hidden": "true" })
37912
38166
  },
37913
38167
  email: {
37914
38168
  label: "Email",
37915
38169
  hint: "One or more addresses.",
37916
38170
  connected: false,
37917
- icon: /* @__PURE__ */ jsx157(EmailIcon, { size: "sm", "aria-hidden": "true" })
38171
+ icon: /* @__PURE__ */ jsx158(EmailIcon, { size: "sm", "aria-hidden": "true" })
37918
38172
  },
37919
38173
  slack: {
37920
38174
  label: "Slack",
37921
38175
  hint: "A channel in a connected workspace.",
37922
38176
  connected: true,
37923
- icon: /* @__PURE__ */ jsx157(LogoSlackIcon, { size: "sm", "aria-hidden": "true" })
38177
+ icon: /* @__PURE__ */ jsx158(LogoSlackIcon, { size: "sm", "aria-hidden": "true" })
37924
38178
  },
37925
38179
  teams: {
37926
38180
  label: "Microsoft Teams",
37927
38181
  hint: "A channel in a connected team.",
37928
38182
  connected: true,
37929
- icon: /* @__PURE__ */ jsx157(ChatOperationalIcon, { size: "sm", "aria-hidden": "true" })
38183
+ icon: /* @__PURE__ */ jsx158(ChatOperationalIcon, { size: "sm", "aria-hidden": "true" })
37930
38184
  },
37931
38185
  google_chat: {
37932
38186
  label: "Google Chat",
37933
38187
  hint: "A space in a connected account.",
37934
38188
  connected: true,
37935
- icon: /* @__PURE__ */ jsx157(ChatIcon2, { size: "sm", "aria-hidden": "true" })
38189
+ icon: /* @__PURE__ */ jsx158(ChatIcon2, { size: "sm", "aria-hidden": "true" })
37936
38190
  },
37937
38191
  whatsapp: {
37938
38192
  label: "WhatsApp",
37939
38193
  hint: "Template messages to a phone number.",
37940
38194
  connected: false,
37941
- icon: /* @__PURE__ */ jsx157(ChatLaunchIcon, { size: "sm", "aria-hidden": "true" })
38195
+ icon: /* @__PURE__ */ jsx158(ChatLaunchIcon, { size: "sm", "aria-hidden": "true" })
37942
38196
  },
37943
38197
  webhook: {
37944
38198
  label: "Webhook",
37945
38199
  hint: "Signed JSON to a URL you own.",
37946
38200
  connected: false,
37947
- icon: /* @__PURE__ */ jsx157(WebhookIcon, { size: "sm", "aria-hidden": "true" })
38201
+ icon: /* @__PURE__ */ jsx158(WebhookIcon, { size: "sm", "aria-hidden": "true" })
37948
38202
  }
37949
38203
  };
37950
38204
  var PERSONAL_CHANNEL_META = {
37951
- in_app: { label: "In-app", icon: /* @__PURE__ */ jsx157(NotificationIcon, { size: "sm", "aria-hidden": "true" }) },
37952
- email: { label: "Email", icon: /* @__PURE__ */ jsx157(EmailIcon, { size: "sm", "aria-hidden": "true" }) },
37953
- slack_dm: { label: "Slack DM", icon: /* @__PURE__ */ jsx157(LogoSlackIcon, { size: "sm", "aria-hidden": "true" }) }
38205
+ in_app: { label: "In-app", icon: /* @__PURE__ */ jsx158(NotificationIcon, { size: "sm", "aria-hidden": "true" }) },
38206
+ email: { label: "Email", icon: /* @__PURE__ */ jsx158(EmailIcon, { size: "sm", "aria-hidden": "true" }) },
38207
+ slack_dm: { label: "Slack DM", icon: /* @__PURE__ */ jsx158(LogoSlackIcon, { size: "sm", "aria-hidden": "true" }) }
37954
38208
  };
37955
38209
  var CHANNEL_STATUS_META = {
37956
38210
  verified: { label: "Verified", variant: "success" },
@@ -37962,22 +38216,22 @@ var SEVERITY_META = {
37962
38216
  info: {
37963
38217
  label: "Info",
37964
38218
  variant: "info",
37965
- icon: /* @__PURE__ */ jsx157(InformationFilledIcon, { size: "sm", "aria-hidden": "true" })
38219
+ icon: /* @__PURE__ */ jsx158(InformationFilledIcon, { size: "sm", "aria-hidden": "true" })
37966
38220
  },
37967
38221
  warning: {
37968
38222
  label: "Warning",
37969
38223
  variant: "warning",
37970
- icon: /* @__PURE__ */ jsx157(WarningFilledIcon3, { size: "sm", "aria-hidden": "true" })
38224
+ icon: /* @__PURE__ */ jsx158(WarningFilledIcon3, { size: "sm", "aria-hidden": "true" })
37971
38225
  },
37972
38226
  error: {
37973
38227
  label: "Error",
37974
38228
  variant: "error",
37975
- icon: /* @__PURE__ */ jsx157(ErrorFilledIcon2, { size: "sm", "aria-hidden": "true" })
38229
+ icon: /* @__PURE__ */ jsx158(ErrorFilledIcon2, { size: "sm", "aria-hidden": "true" })
37976
38230
  }
37977
38231
  };
37978
38232
 
37979
38233
  // src/notifications/components/EventCatalogPicker/EventCatalogPicker.tsx
37980
- import { jsx as jsx158, jsxs as jsxs150 } from "react/jsx-runtime";
38234
+ import { jsx as jsx159, jsxs as jsxs151 } from "react/jsx-runtime";
37981
38235
  function EventCatalogPicker({
37982
38236
  catalog,
37983
38237
  value,
@@ -37991,7 +38245,7 @@ function EventCatalogPicker({
37991
38245
  className,
37992
38246
  id
37993
38247
  }) {
37994
- const reactId = useId66();
38248
+ const reactId = useId67();
37995
38249
  const baseId = id ?? `${reactId}-events`;
37996
38250
  const [query, setQuery] = useState79("");
37997
38251
  const [collapsed, setCollapsed] = useState79({});
@@ -38030,7 +38284,7 @@ function EventCatalogPicker({
38030
38284
  if (explicit != null) return explicit;
38031
38285
  return !category.events.some((e) => selected.has(e.key));
38032
38286
  };
38033
- return /* @__PURE__ */ jsxs150(
38287
+ return /* @__PURE__ */ jsxs151(
38034
38288
  "div",
38035
38289
  {
38036
38290
  className: cn("ods-event-picker", className),
@@ -38038,16 +38292,16 @@ function EventCatalogPicker({
38038
38292
  role: "group",
38039
38293
  "aria-label": typeof label === "string" ? label : "Events",
38040
38294
  children: [
38041
- (label || searchable) && /* @__PURE__ */ jsxs150("div", { className: "ods-event-picker__head", children: [
38042
- label && /* @__PURE__ */ jsx158("div", { className: "ods-event-picker__label", children: label }),
38043
- searchable && /* @__PURE__ */ jsx158(
38295
+ (label || searchable) && /* @__PURE__ */ jsxs151("div", { className: "ods-event-picker__head", children: [
38296
+ label && /* @__PURE__ */ jsx159("div", { className: "ods-event-picker__label", children: label }),
38297
+ searchable && /* @__PURE__ */ jsx159(
38044
38298
  Input,
38045
38299
  {
38046
38300
  size: "sm",
38047
38301
  type: "search",
38048
38302
  "aria-label": "Search events",
38049
38303
  placeholder: "Search events",
38050
- leftIcon: /* @__PURE__ */ jsx158(SearchIcon16, { size: "sm", "aria-hidden": "true" }),
38304
+ leftIcon: /* @__PURE__ */ jsx159(SearchIcon16, { size: "sm", "aria-hidden": "true" }),
38051
38305
  value: query,
38052
38306
  onChange: (e) => setQuery(e.target.value),
38053
38307
  clearable: true,
@@ -38056,18 +38310,18 @@ function EventCatalogPicker({
38056
38310
  className: "ods-event-picker__search"
38057
38311
  }
38058
38312
  ),
38059
- /* @__PURE__ */ jsxs150("span", { className: "ods-event-picker__count", "aria-live": "polite", children: [
38313
+ /* @__PURE__ */ jsxs151("span", { className: "ods-event-picker__count", "aria-live": "polite", children: [
38060
38314
  value.length,
38061
38315
  " selected"
38062
38316
  ] })
38063
38317
  ] }),
38064
- filtered.length === 0 ? /* @__PURE__ */ jsx158("div", { className: "ods-event-picker__empty", children: emptyLabel }) : /* @__PURE__ */ jsx158("div", { className: "ods-event-picker__groups", children: filtered.map((category) => {
38318
+ filtered.length === 0 ? /* @__PURE__ */ jsx159("div", { className: "ods-event-picker__empty", children: emptyLabel }) : /* @__PURE__ */ jsx159("div", { className: "ods-event-picker__groups", children: filtered.map((category) => {
38065
38319
  const total = category.events.length;
38066
38320
  const picked = category.events.filter((e) => selected.has(e.key)).length;
38067
38321
  const all = picked === total;
38068
38322
  const some = picked > 0 && !all;
38069
38323
  const open = !isCollapsed(category);
38070
- return /* @__PURE__ */ jsxs150(
38324
+ return /* @__PURE__ */ jsxs151(
38071
38325
  "section",
38072
38326
  {
38073
38327
  className: cn(
@@ -38075,8 +38329,8 @@ function EventCatalogPicker({
38075
38329
  !open && "ods-event-picker__group--collapsed"
38076
38330
  ),
38077
38331
  children: [
38078
- /* @__PURE__ */ jsxs150("header", { className: "ods-event-picker__group-head", children: [
38079
- /* @__PURE__ */ jsx158(
38332
+ /* @__PURE__ */ jsxs151("header", { className: "ods-event-picker__group-head", children: [
38333
+ /* @__PURE__ */ jsx159(
38080
38334
  Checkbox,
38081
38335
  {
38082
38336
  size: "sm",
@@ -38085,9 +38339,9 @@ function EventCatalogPicker({
38085
38339
  disabled,
38086
38340
  onChange: (on) => toggleCategory(category, on),
38087
38341
  "aria-label": `${category.label} (all ${total} events)`,
38088
- label: /* @__PURE__ */ jsxs150("span", { className: "ods-event-picker__group-title", children: [
38342
+ label: /* @__PURE__ */ jsxs151("span", { className: "ods-event-picker__group-title", children: [
38089
38343
  category.label,
38090
- /* @__PURE__ */ jsxs150("span", { className: "ods-event-picker__group-count", children: [
38344
+ /* @__PURE__ */ jsxs151("span", { className: "ods-event-picker__group-count", children: [
38091
38345
  picked,
38092
38346
  "/",
38093
38347
  total
@@ -38096,7 +38350,7 @@ function EventCatalogPicker({
38096
38350
  description: open ? category.description : void 0
38097
38351
  }
38098
38352
  ),
38099
- collapsible && !query && /* @__PURE__ */ jsx158(
38353
+ collapsible && !query && /* @__PURE__ */ jsx159(
38100
38354
  "button",
38101
38355
  {
38102
38356
  type: "button",
@@ -38107,10 +38361,10 @@ function EventCatalogPicker({
38107
38361
  }
38108
38362
  )
38109
38363
  ] }),
38110
- open && /* @__PURE__ */ jsx158("ul", { className: "ods-event-picker__rows", children: category.events.map((event) => {
38364
+ open && /* @__PURE__ */ jsx159("ul", { className: "ods-event-picker__rows", children: category.events.map((event) => {
38111
38365
  const sev = SEVERITY_META[event.severity];
38112
- return /* @__PURE__ */ jsxs150("li", { className: "ods-event-picker__row", children: [
38113
- /* @__PURE__ */ jsx158(
38366
+ return /* @__PURE__ */ jsxs151("li", { className: "ods-event-picker__row", children: [
38367
+ /* @__PURE__ */ jsx159(
38114
38368
  Checkbox,
38115
38369
  {
38116
38370
  size: "sm",
@@ -38121,9 +38375,9 @@ function EventCatalogPicker({
38121
38375
  description: event.description
38122
38376
  }
38123
38377
  ),
38124
- /* @__PURE__ */ jsxs150("span", { className: "ods-event-picker__badges", children: [
38125
- event.threshold && /* @__PURE__ */ jsx158(Badge, { size: "sm", variant: "neutral", outlined: true, children: "Threshold" }),
38126
- showSeverity && /* @__PURE__ */ jsx158(Badge, { size: "sm", variant: sev.variant, dot: true, children: sev.label })
38378
+ /* @__PURE__ */ jsxs151("span", { className: "ods-event-picker__badges", children: [
38379
+ event.threshold && /* @__PURE__ */ jsx159(Badge, { size: "sm", variant: "neutral", outlined: true, children: "Threshold" }),
38380
+ showSeverity && /* @__PURE__ */ jsx159(Badge, { size: "sm", variant: sev.variant, dot: true, children: sev.label })
38127
38381
  ] })
38128
38382
  ] }, event.key);
38129
38383
  }) })
@@ -38140,7 +38394,7 @@ EventCatalogPicker.displayName = "EventCatalogPicker";
38140
38394
 
38141
38395
  // src/notifications/components/NotificationBell/NotificationBell.tsx
38142
38396
  import { NotificationIcon as NotificationIcon2 } from "@octaviaflow/icons";
38143
- import { useCallback as useCallback58, useState as useState81 } from "react";
38397
+ import { useCallback as useCallback59, useState as useState81 } from "react";
38144
38398
 
38145
38399
  // src/notifications/engine/inbox.ts
38146
38400
  function resolveInboxAction(item, catalog) {
@@ -38211,7 +38465,7 @@ function groupInboxByDay(items, now2 = Date.now()) {
38211
38465
 
38212
38466
  // src/notifications/components/NotificationDetailDialog/NotificationDetailDialog.tsx
38213
38467
  import { ArchiveIcon as ArchiveIcon2, LaunchIcon } from "@octaviaflow/icons";
38214
- import { jsx as jsx159, jsxs as jsxs151 } from "react/jsx-runtime";
38468
+ import { jsx as jsx160, jsxs as jsxs152 } from "react/jsx-runtime";
38215
38469
  function NotificationDetailDialog({
38216
38470
  item,
38217
38471
  open,
@@ -38228,7 +38482,7 @@ function NotificationDetailDialog({
38228
38482
  const sev = SEVERITY_META[item.severity];
38229
38483
  const when = formatRelativeTime(new Date(item.createdAt), now2);
38230
38484
  const fullDate = new Date(item.createdAt).toLocaleString();
38231
- return /* @__PURE__ */ jsxs151(
38485
+ return /* @__PURE__ */ jsxs152(
38232
38486
  Dialog,
38233
38487
  {
38234
38488
  open,
@@ -38236,12 +38490,12 @@ function NotificationDetailDialog({
38236
38490
  size: "md",
38237
38491
  className: cn("ods-notif-detail", className),
38238
38492
  title: item.title,
38239
- footer: /* @__PURE__ */ jsxs151("div", { className: "ods-notif-detail__footer", children: [
38240
- onArchive && !item.archivedAt && /* @__PURE__ */ jsx159(
38493
+ footer: /* @__PURE__ */ jsxs152("div", { className: "ods-notif-detail__footer", children: [
38494
+ onArchive && !item.archivedAt && /* @__PURE__ */ jsx160(
38241
38495
  Button,
38242
38496
  {
38243
38497
  variant: "ghost",
38244
- leftIcon: /* @__PURE__ */ jsx159(ArchiveIcon2, { size: "sm", "aria-hidden": "true" }),
38498
+ leftIcon: /* @__PURE__ */ jsx160(ArchiveIcon2, { size: "sm", "aria-hidden": "true" }),
38245
38499
  onClick: () => {
38246
38500
  onArchive(item);
38247
38501
  onClose();
@@ -38249,11 +38503,11 @@ function NotificationDetailDialog({
38249
38503
  children: "Archive"
38250
38504
  }
38251
38505
  ),
38252
- /* @__PURE__ */ jsx159("span", { className: "ods-notif-detail__spacer" }),
38253
- /* @__PURE__ */ jsx159(Button, { variant: "ghost", onClick: onClose, children: "Close" }),
38506
+ /* @__PURE__ */ jsx160("span", { className: "ods-notif-detail__spacer" }),
38507
+ /* @__PURE__ */ jsx160(Button, { variant: "ghost", onClick: onClose, children: "Close" }),
38254
38508
  resolved.href && // asChild projects the button chrome onto the anchor and skips the
38255
38509
  // icon slots, so the glyph is placed inline.
38256
- /* @__PURE__ */ jsx159(Button, { variant: "primary", asChild: true, children: /* @__PURE__ */ jsxs151(
38510
+ /* @__PURE__ */ jsx160(Button, { variant: "primary", asChild: true, children: /* @__PURE__ */ jsxs152(
38257
38511
  "a",
38258
38512
  {
38259
38513
  href: resolved.href,
@@ -38266,20 +38520,20 @@ function NotificationDetailDialog({
38266
38520
  },
38267
38521
  children: [
38268
38522
  resolved.label ?? "Open",
38269
- /* @__PURE__ */ jsx159(LaunchIcon, { size: "sm", "aria-hidden": "true" })
38523
+ /* @__PURE__ */ jsx160(LaunchIcon, { size: "sm", "aria-hidden": "true" })
38270
38524
  ]
38271
38525
  }
38272
38526
  ) })
38273
38527
  ] }),
38274
38528
  children: [
38275
- /* @__PURE__ */ jsxs151("div", { className: "ods-notif-detail__meta", children: [
38276
- /* @__PURE__ */ jsx159(Badge, { size: "sm", variant: sev.variant, dot: true, children: sev.label }),
38277
- item.source && /* @__PURE__ */ jsx159("span", { children: item.source }),
38278
- item.subject && /* @__PURE__ */ jsx159("span", { children: item.subject.label }),
38279
- /* @__PURE__ */ jsx159("time", { dateTime: new Date(item.createdAt).toISOString(), title: fullDate, children: when ?? fullDate })
38529
+ /* @__PURE__ */ jsxs152("div", { className: "ods-notif-detail__meta", children: [
38530
+ /* @__PURE__ */ jsx160(Badge, { size: "sm", variant: sev.variant, dot: true, children: sev.label }),
38531
+ item.source && /* @__PURE__ */ jsx160("span", { children: item.source }),
38532
+ item.subject && /* @__PURE__ */ jsx160("span", { children: item.subject.label }),
38533
+ /* @__PURE__ */ jsx160("time", { dateTime: new Date(item.createdAt).toISOString(), title: fullDate, children: when ?? fullDate })
38280
38534
  ] }),
38281
- item.body && /* @__PURE__ */ jsx159("p", { className: "ods-notif-detail__body", children: item.body }),
38282
- item.details && item.details.length > 0 && /* @__PURE__ */ jsx159(
38535
+ item.body && /* @__PURE__ */ jsx160("p", { className: "ods-notif-detail__body", children: item.body }),
38536
+ item.details && item.details.length > 0 && /* @__PURE__ */ jsx160(
38283
38537
  DescriptionList,
38284
38538
  {
38285
38539
  items: item.details.map((d) => ({ label: d.label, value: d.value })),
@@ -38296,7 +38550,7 @@ NotificationDetailDialog.displayName = "NotificationDetailDialog";
38296
38550
  // src/notifications/components/NotificationInbox/NotificationInbox.tsx
38297
38551
  import { ArchiveIcon as ArchiveIcon3, CheckmarkIcon as CheckmarkIcon16, NotificationOffIcon } from "@octaviaflow/icons";
38298
38552
  import { useMemo as useMemo42, useState as useState80 } from "react";
38299
- import { Fragment as Fragment66, jsx as jsx160, jsxs as jsxs152 } from "react/jsx-runtime";
38553
+ import { Fragment as Fragment66, jsx as jsx161, jsxs as jsxs153 } from "react/jsx-runtime";
38300
38554
  var FILTER_OPTIONS = [
38301
38555
  { value: "all", label: "All" },
38302
38556
  { value: "unread", label: "Unread" },
@@ -38348,20 +38602,20 @@ function NotificationInbox({
38348
38602
  const action = resolveInboxAction(item, catalog);
38349
38603
  const interactive = action.kind !== "none" && Boolean(onOpen || onMarkRead || detailDialog);
38350
38604
  const ariaLabel = `${unreadRow ? "Unread: " : ""}${item.title}`;
38351
- const inner = /* @__PURE__ */ jsxs152(Fragment66, { children: [
38352
- /* @__PURE__ */ jsx160("span", { className: "ods-inbox__glyph", "aria-hidden": "true", children: sev.icon }),
38353
- /* @__PURE__ */ jsxs152("span", { className: "ods-inbox__text", children: [
38354
- /* @__PURE__ */ jsx160("span", { className: "ods-inbox__title", children: item.title }),
38355
- item.body && /* @__PURE__ */ jsx160("span", { className: "ods-inbox__body", children: item.body }),
38356
- /* @__PURE__ */ jsxs152("span", { className: "ods-inbox__meta", children: [
38357
- item.source && /* @__PURE__ */ jsx160("span", { children: item.source }),
38358
- item.subject && /* @__PURE__ */ jsx160("span", { children: item.subject.label }),
38359
- when && /* @__PURE__ */ jsx160("time", { dateTime: new Date(item.createdAt).toISOString(), children: when })
38605
+ const inner = /* @__PURE__ */ jsxs153(Fragment66, { children: [
38606
+ /* @__PURE__ */ jsx161("span", { className: "ods-inbox__glyph", "aria-hidden": "true", children: sev.icon }),
38607
+ /* @__PURE__ */ jsxs153("span", { className: "ods-inbox__text", children: [
38608
+ /* @__PURE__ */ jsx161("span", { className: "ods-inbox__title", children: item.title }),
38609
+ item.body && /* @__PURE__ */ jsx161("span", { className: "ods-inbox__body", children: item.body }),
38610
+ /* @__PURE__ */ jsxs153("span", { className: "ods-inbox__meta", children: [
38611
+ item.source && /* @__PURE__ */ jsx161("span", { children: item.source }),
38612
+ item.subject && /* @__PURE__ */ jsx161("span", { children: item.subject.label }),
38613
+ when && /* @__PURE__ */ jsx161("time", { dateTime: new Date(item.createdAt).toISOString(), children: when })
38360
38614
  ] })
38361
38615
  ] }),
38362
- unreadRow && /* @__PURE__ */ jsx160("span", { className: "ods-inbox__dot", "aria-hidden": "true" })
38616
+ unreadRow && /* @__PURE__ */ jsx161("span", { className: "ods-inbox__dot", "aria-hidden": "true" })
38363
38617
  ] });
38364
- return /* @__PURE__ */ jsxs152(
38618
+ return /* @__PURE__ */ jsxs153(
38365
38619
  "li",
38366
38620
  {
38367
38621
  className: cn(
@@ -38374,7 +38628,7 @@ function NotificationInbox({
38374
38628
  children: [
38375
38629
  action.kind === "link" && action.href ? (
38376
38630
  // A real anchor: middle-click, copy link and keyboard all work.
38377
- /* @__PURE__ */ jsx160(
38631
+ /* @__PURE__ */ jsx161(
38378
38632
  "a",
38379
38633
  {
38380
38634
  className: "ods-inbox__main",
@@ -38389,7 +38643,7 @@ function NotificationInbox({
38389
38643
  children: inner
38390
38644
  }
38391
38645
  )
38392
- ) : /* @__PURE__ */ jsx160(
38646
+ ) : /* @__PURE__ */ jsx161(
38393
38647
  "button",
38394
38648
  {
38395
38649
  type: "button",
@@ -38401,25 +38655,25 @@ function NotificationInbox({
38401
38655
  children: inner
38402
38656
  }
38403
38657
  ),
38404
- !compact && (onMarkRead || onArchive) && !item.archivedAt && /* @__PURE__ */ jsxs152("span", { className: "ods-inbox__actions", children: [
38405
- onMarkRead && unreadRow && /* @__PURE__ */ jsx160(
38658
+ !compact && (onMarkRead || onArchive) && !item.archivedAt && /* @__PURE__ */ jsxs153("span", { className: "ods-inbox__actions", children: [
38659
+ onMarkRead && unreadRow && /* @__PURE__ */ jsx161(
38406
38660
  Button,
38407
38661
  {
38408
38662
  size: "sm",
38409
38663
  variant: "ghost",
38410
38664
  "aria-label": "Mark as read",
38411
38665
  onClick: () => onMarkRead([item.id]),
38412
- children: /* @__PURE__ */ jsx160(CheckmarkIcon16, { size: "sm", "aria-hidden": "true" })
38666
+ children: /* @__PURE__ */ jsx161(CheckmarkIcon16, { size: "sm", "aria-hidden": "true" })
38413
38667
  }
38414
38668
  ),
38415
- onArchive && /* @__PURE__ */ jsx160(
38669
+ onArchive && /* @__PURE__ */ jsx161(
38416
38670
  Button,
38417
38671
  {
38418
38672
  size: "sm",
38419
38673
  variant: "ghost",
38420
38674
  "aria-label": "Archive",
38421
38675
  onClick: () => onArchive([item.id]),
38422
- children: /* @__PURE__ */ jsx160(ArchiveIcon3, { size: "sm", "aria-hidden": "true" })
38676
+ children: /* @__PURE__ */ jsx161(ArchiveIcon3, { size: "sm", "aria-hidden": "true" })
38423
38677
  }
38424
38678
  )
38425
38679
  ] })
@@ -38428,9 +38682,9 @@ function NotificationInbox({
38428
38682
  item.id
38429
38683
  );
38430
38684
  };
38431
- return /* @__PURE__ */ jsxs152("div", { className: cn("ods-inbox", compact && "ods-inbox--compact", className), children: [
38432
- !compact && /* @__PURE__ */ jsxs152("div", { className: "ods-inbox__toolbar", children: [
38433
- /* @__PURE__ */ jsx160(
38685
+ return /* @__PURE__ */ jsxs153("div", { className: cn("ods-inbox", compact && "ods-inbox--compact", className), children: [
38686
+ !compact && /* @__PURE__ */ jsxs153("div", { className: "ods-inbox__toolbar", children: [
38687
+ /* @__PURE__ */ jsx161(
38434
38688
  SegmentedControl,
38435
38689
  {
38436
38690
  "aria-label": "Filter",
@@ -38440,22 +38694,22 @@ function NotificationInbox({
38440
38694
  onChange: (v) => setFilter(v)
38441
38695
  }
38442
38696
  ),
38443
- /* @__PURE__ */ jsx160("span", { className: "ods-inbox__unread", "aria-live": "polite", children: unread === 0 ? "All caught up" : `${unread} unread` }),
38444
- onMarkAllRead && unread > 0 && /* @__PURE__ */ jsx160(Button, { size: "sm", variant: "ghost", onClick: onMarkAllRead, children: "Mark all read" })
38697
+ /* @__PURE__ */ jsx161("span", { className: "ods-inbox__unread", "aria-live": "polite", children: unread === 0 ? "All caught up" : `${unread} unread` }),
38698
+ onMarkAllRead && unread > 0 && /* @__PURE__ */ jsx161(Button, { size: "sm", variant: "ghost", onClick: onMarkAllRead, children: "Mark all read" })
38445
38699
  ] }),
38446
- visible.length === 0 ? /* @__PURE__ */ jsx160(
38700
+ visible.length === 0 ? /* @__PURE__ */ jsx161(
38447
38701
  EmptyState,
38448
38702
  {
38449
38703
  size: compact ? "sm" : "md",
38450
- icon: /* @__PURE__ */ jsx160(NotificationOffIcon, { "aria-hidden": "true" }),
38704
+ icon: /* @__PURE__ */ jsx161(NotificationOffIcon, { "aria-hidden": "true" }),
38451
38705
  title: emptyTitle ?? (activeFilter === "unread" ? "You're all caught up" : activeFilter === "archived" ? "Nothing archived" : "No notifications yet"),
38452
38706
  description: emptyDescription ?? (activeFilter === "all" ? "Run failures, apps that need re-authentication and account activity will show up here." : void 0)
38453
38707
  }
38454
- ) : showDays ? /* @__PURE__ */ jsx160("div", { className: "ods-inbox__groups", children: groups.map((group) => /* @__PURE__ */ jsxs152("section", { className: "ods-inbox__group", "aria-label": group.label, children: [
38455
- /* @__PURE__ */ jsx160("h4", { className: "ods-inbox__day", children: group.label }),
38456
- /* @__PURE__ */ jsx160("ul", { className: "ods-inbox__rows", children: group.items.map(renderRow) })
38457
- ] }, group.key)) }) : /* @__PURE__ */ jsx160("ul", { className: "ods-inbox__rows", children: visible.map(renderRow) }),
38458
- detailDialog && /* @__PURE__ */ jsx160(
38708
+ ) : showDays ? /* @__PURE__ */ jsx161("div", { className: "ods-inbox__groups", children: groups.map((group) => /* @__PURE__ */ jsxs153("section", { className: "ods-inbox__group", "aria-label": group.label, children: [
38709
+ /* @__PURE__ */ jsx161("h4", { className: "ods-inbox__day", children: group.label }),
38710
+ /* @__PURE__ */ jsx161("ul", { className: "ods-inbox__rows", children: group.items.map(renderRow) })
38711
+ ] }, group.key)) }) : /* @__PURE__ */ jsx161("ul", { className: "ods-inbox__rows", children: visible.map(renderRow) }),
38712
+ detailDialog && /* @__PURE__ */ jsx161(
38459
38713
  NotificationDetailDialog,
38460
38714
  {
38461
38715
  item: detailItem,
@@ -38472,7 +38726,7 @@ function NotificationInbox({
38472
38726
  NotificationInbox.displayName = "NotificationInbox";
38473
38727
 
38474
38728
  // src/notifications/components/NotificationBell/NotificationBell.tsx
38475
- import { Fragment as Fragment67, jsx as jsx161, jsxs as jsxs153 } from "react/jsx-runtime";
38729
+ import { Fragment as Fragment67, jsx as jsx162, jsxs as jsxs154 } from "react/jsx-runtime";
38476
38730
  function NotificationBell({
38477
38731
  items,
38478
38732
  unreadCount,
@@ -38497,7 +38751,7 @@ function NotificationBell({
38497
38751
  const countLabel = unread > 99 ? "99+" : String(unread);
38498
38752
  const [internalOpen, setInternalOpen] = useState81(false);
38499
38753
  const isOpen = open ?? internalOpen;
38500
- const setOpen = useCallback58(
38754
+ const setOpen = useCallback59(
38501
38755
  (next) => {
38502
38756
  if (open === void 0) setInternalOpen(next);
38503
38757
  onOpenChange?.(next);
@@ -38510,8 +38764,8 @@ function NotificationBell({
38510
38764
  if (action.kind === "modal") setDetailItem(item);
38511
38765
  onOpenItem?.(item, action);
38512
38766
  };
38513
- return /* @__PURE__ */ jsxs153(Fragment67, { children: [
38514
- /* @__PURE__ */ jsx161(
38767
+ return /* @__PURE__ */ jsxs154(Fragment67, { children: [
38768
+ /* @__PURE__ */ jsx162(
38515
38769
  Popover,
38516
38770
  {
38517
38771
  open: isOpen,
@@ -38520,14 +38774,14 @@ function NotificationBell({
38520
38774
  align,
38521
38775
  "aria-label": label,
38522
38776
  className: cn("ods-notif-bell__popover", className),
38523
- content: /* @__PURE__ */ jsxs153("div", { className: "ods-notif-bell__panel", children: [
38524
- /* @__PURE__ */ jsxs153("div", { className: "ods-notif-bell__head", children: [
38525
- /* @__PURE__ */ jsx161("h3", { className: "ods-notif-bell__title", children: label }),
38526
- /* @__PURE__ */ jsx161("span", { className: "ods-notif-bell__spacer" }),
38777
+ content: /* @__PURE__ */ jsxs154("div", { className: "ods-notif-bell__panel", children: [
38778
+ /* @__PURE__ */ jsxs154("div", { className: "ods-notif-bell__head", children: [
38779
+ /* @__PURE__ */ jsx162("h3", { className: "ods-notif-bell__title", children: label }),
38780
+ /* @__PURE__ */ jsx162("span", { className: "ods-notif-bell__spacer" }),
38527
38781
  onMarkAllRead && // Always offered so the control is discoverable; disabled (not
38528
38782
  // hidden) when there's nothing unread, so it never appears to
38529
38783
  // vanish between visits.
38530
- /* @__PURE__ */ jsx161(
38784
+ /* @__PURE__ */ jsx162(
38531
38785
  Button,
38532
38786
  {
38533
38787
  size: "sm",
@@ -38538,7 +38792,7 @@ function NotificationBell({
38538
38792
  }
38539
38793
  )
38540
38794
  ] }),
38541
- /* @__PURE__ */ jsx161("div", { className: "ods-notif-bell__body", children: /* @__PURE__ */ jsx161(
38795
+ /* @__PURE__ */ jsx162("div", { className: "ods-notif-bell__body", children: /* @__PURE__ */ jsx162(
38542
38796
  NotificationInbox,
38543
38797
  {
38544
38798
  items,
@@ -38554,7 +38808,7 @@ function NotificationBell({
38554
38808
  emptyDescription: void 0
38555
38809
  }
38556
38810
  ) }),
38557
- onViewAll && /* @__PURE__ */ jsx161("div", { className: "ods-notif-bell__foot", children: /* @__PURE__ */ jsx161(
38811
+ onViewAll && /* @__PURE__ */ jsx162("div", { className: "ods-notif-bell__foot", children: /* @__PURE__ */ jsx162(
38558
38812
  Button,
38559
38813
  {
38560
38814
  size: "sm",
@@ -38567,22 +38821,22 @@ function NotificationBell({
38567
38821
  }
38568
38822
  ) })
38569
38823
  ] }),
38570
- children: /* @__PURE__ */ jsxs153("span", { className: cn("ods-notif-bell", hasUnread && "ods-notif-bell--unread"), children: [
38571
- /* @__PURE__ */ jsx161(
38824
+ children: /* @__PURE__ */ jsxs154("span", { className: cn("ods-notif-bell", hasUnread && "ods-notif-bell--unread"), children: [
38825
+ /* @__PURE__ */ jsx162(
38572
38826
  Button,
38573
38827
  {
38574
38828
  variant: "icon",
38575
38829
  size: "md",
38576
38830
  className: "ods-notif-bell__trigger",
38577
38831
  "aria-label": hasUnread ? `${label}, ${countLabel} unread` : label,
38578
- children: /* @__PURE__ */ jsx161(NotificationIcon2, { size: "sm", "aria-hidden": "true" })
38832
+ children: /* @__PURE__ */ jsx162(NotificationIcon2, { size: "sm", "aria-hidden": "true" })
38579
38833
  }
38580
38834
  ),
38581
- hasUnread && /* @__PURE__ */ jsx161("span", { className: "ods-notif-bell__count", "aria-hidden": "true", children: countLabel })
38835
+ hasUnread && /* @__PURE__ */ jsx162("span", { className: "ods-notif-bell__count", "aria-hidden": "true", children: countLabel })
38582
38836
  ] })
38583
38837
  }
38584
38838
  ),
38585
- /* @__PURE__ */ jsx161(
38839
+ /* @__PURE__ */ jsx162(
38586
38840
  NotificationDetailDialog,
38587
38841
  {
38588
38842
  item: detailItem,
@@ -38600,7 +38854,7 @@ NotificationBell.displayName = "NotificationBell";
38600
38854
 
38601
38855
  // src/notifications/components/NotificationChannelCard/NotificationChannelCard.tsx
38602
38856
  import { EditIcon, SendIcon, TrashCanIcon as TrashCanIcon3 } from "@octaviaflow/icons";
38603
- import { jsx as jsx162, jsxs as jsxs154 } from "react/jsx-runtime";
38857
+ import { jsx as jsx163, jsxs as jsxs155 } from "react/jsx-runtime";
38604
38858
  function NotificationChannelCard({
38605
38859
  channel,
38606
38860
  onTest,
@@ -38621,7 +38875,7 @@ function NotificationChannelCard({
38621
38875
  now2
38622
38876
  );
38623
38877
  const inApp = channel.type === "in_app";
38624
- return /* @__PURE__ */ jsxs154(
38878
+ return /* @__PURE__ */ jsxs155(
38625
38879
  "article",
38626
38880
  {
38627
38881
  className: cn(
@@ -38633,30 +38887,30 @@ function NotificationChannelCard({
38633
38887
  "data-status": channel.enabled ? channel.status : "disabled",
38634
38888
  "aria-label": `${channel.label} (${type.label})`,
38635
38889
  children: [
38636
- /* @__PURE__ */ jsxs154("header", { className: "ods-notif-channel__head", children: [
38637
- /* @__PURE__ */ jsx162("span", { className: "ods-notif-channel__icon", "aria-hidden": "true", children: icon ?? type.icon }),
38638
- /* @__PURE__ */ jsxs154("span", { className: "ods-notif-channel__titles", children: [
38639
- /* @__PURE__ */ jsx162("span", { className: "ods-notif-channel__label", children: channel.label }),
38640
- /* @__PURE__ */ jsxs154("span", { className: "ods-notif-channel__type", children: [
38890
+ /* @__PURE__ */ jsxs155("header", { className: "ods-notif-channel__head", children: [
38891
+ /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel__icon", "aria-hidden": "true", children: icon ?? type.icon }),
38892
+ /* @__PURE__ */ jsxs155("span", { className: "ods-notif-channel__titles", children: [
38893
+ /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel__label", children: channel.label }),
38894
+ /* @__PURE__ */ jsxs155("span", { className: "ods-notif-channel__type", children: [
38641
38895
  type.label,
38642
38896
  channel.instanceLabel ? ` \xB7 ${channel.instanceLabel}` : ""
38643
38897
  ] })
38644
38898
  ] }),
38645
- /* @__PURE__ */ jsx162(Badge, { size: "sm", variant: status.variant, dot: true, children: status.label })
38899
+ /* @__PURE__ */ jsx163(Badge, { size: "sm", variant: status.variant, dot: true, children: status.label })
38646
38900
  ] }),
38647
- (channel.target || inApp) && /* @__PURE__ */ jsx162("div", { className: "ods-notif-channel__target", title: channel.target, children: inApp ? "Every member's bell and inbox" : channel.target }),
38648
- /* @__PURE__ */ jsx162("div", { className: "ods-notif-channel__meta", children: channel.status === "failing" && channel.lastError ? /* @__PURE__ */ jsx162("span", { className: "ods-notif-channel__error", title: channel.lastError, children: channel.lastError }) : last ? /* @__PURE__ */ jsxs154("span", { children: [
38901
+ (channel.target || inApp) && /* @__PURE__ */ jsx163("div", { className: "ods-notif-channel__target", title: channel.target, children: inApp ? "Every member's bell and inbox" : channel.target }),
38902
+ /* @__PURE__ */ jsx163("div", { className: "ods-notif-channel__meta", children: channel.status === "failing" && channel.lastError ? /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel__error", title: channel.lastError, children: channel.lastError }) : last ? /* @__PURE__ */ jsxs155("span", { children: [
38649
38903
  "Last delivery ",
38650
38904
  last
38651
- ] }) : /* @__PURE__ */ jsx162("span", { children: "No deliveries yet" }) }),
38652
- testResult && /* @__PURE__ */ jsx162(InlineMessage, { tone: testResult.ok ? "success" : "danger", size: "sm", live: "polite", children: testResult.message ?? (testResult.ok ? "Test message delivered." : "Test failed.") }),
38653
- !readOnly && !inApp && /* @__PURE__ */ jsxs154("footer", { className: "ods-notif-channel__actions", children: [
38654
- onTest && /* @__PURE__ */ jsx162(
38905
+ ] }) : /* @__PURE__ */ jsx163("span", { children: "No deliveries yet" }) }),
38906
+ testResult && /* @__PURE__ */ jsx163(InlineMessage, { tone: testResult.ok ? "success" : "danger", size: "sm", live: "polite", children: testResult.message ?? (testResult.ok ? "Test message delivered." : "Test failed.") }),
38907
+ !readOnly && !inApp && /* @__PURE__ */ jsxs155("footer", { className: "ods-notif-channel__actions", children: [
38908
+ onTest && /* @__PURE__ */ jsx163(
38655
38909
  Button,
38656
38910
  {
38657
38911
  size: "sm",
38658
38912
  variant: "secondary",
38659
- leftIcon: /* @__PURE__ */ jsx162(SendIcon, { size: "sm", "aria-hidden": "true" }),
38913
+ leftIcon: /* @__PURE__ */ jsx163(SendIcon, { size: "sm", "aria-hidden": "true" }),
38660
38914
  loading: testing,
38661
38915
  loadingText: "Sending\u2026",
38662
38916
  disabled: !channel.enabled,
@@ -38664,18 +38918,18 @@ function NotificationChannelCard({
38664
38918
  children: "Send test"
38665
38919
  }
38666
38920
  ),
38667
- /* @__PURE__ */ jsx162("span", { className: "ods-notif-channel__spacer" }),
38668
- onEdit && /* @__PURE__ */ jsx162(
38921
+ /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel__spacer" }),
38922
+ onEdit && /* @__PURE__ */ jsx163(
38669
38923
  Button,
38670
38924
  {
38671
38925
  size: "sm",
38672
38926
  variant: "ghost",
38673
38927
  "aria-label": `Edit ${channel.label}`,
38674
38928
  onClick: () => onEdit(channel),
38675
- children: /* @__PURE__ */ jsx162(EditIcon, { size: "sm", "aria-hidden": "true" })
38929
+ children: /* @__PURE__ */ jsx163(EditIcon, { size: "sm", "aria-hidden": "true" })
38676
38930
  }
38677
38931
  ),
38678
- onRemove && /* @__PURE__ */ jsx162(
38932
+ onRemove && /* @__PURE__ */ jsx163(
38679
38933
  Button,
38680
38934
  {
38681
38935
  size: "sm",
@@ -38683,10 +38937,10 @@ function NotificationChannelCard({
38683
38937
  "aria-label": `Remove ${channel.label}`,
38684
38938
  className: "ods-notif-channel__remove",
38685
38939
  onClick: () => onRemove(channel),
38686
- children: /* @__PURE__ */ jsx162(TrashCanIcon3, { size: "sm", "aria-hidden": "true" })
38940
+ children: /* @__PURE__ */ jsx163(TrashCanIcon3, { size: "sm", "aria-hidden": "true" })
38687
38941
  }
38688
38942
  ),
38689
- onToggle && /* @__PURE__ */ jsx162(
38943
+ onToggle && /* @__PURE__ */ jsx163(
38690
38944
  Switch,
38691
38945
  {
38692
38946
  size: "sm",
@@ -38704,7 +38958,7 @@ NotificationChannelCard.displayName = "NotificationChannelCard";
38704
38958
 
38705
38959
  // src/notifications/components/NotificationChannelDialog/NotificationChannelDialog.tsx
38706
38960
  import { SendIcon as SendIcon2 } from "@octaviaflow/icons";
38707
- import { useEffect as useEffect60, useMemo as useMemo43, useState as useState83 } from "react";
38961
+ import { useEffect as useEffect61, useMemo as useMemo43, useState as useState83 } from "react";
38708
38962
 
38709
38963
  // src/notifications/engine/channels.ts
38710
38964
  var CONNECTED_CHANNEL_TYPES = [
@@ -38810,8 +39064,8 @@ function draftFromChannel(channel, fallbackType = "slack") {
38810
39064
 
38811
39065
  // src/notifications/components/NotificationChannelForm/NotificationChannelForm.tsx
38812
39066
  import { AddIcon as AddIcon6, CheckmarkFilledIcon as CheckmarkFilledIcon3, LaunchIcon as LaunchIcon2 } from "@octaviaflow/icons";
38813
- import { useId as useId67, useState as useState82 } from "react";
38814
- import { jsx as jsx163, jsxs as jsxs155 } from "react/jsx-runtime";
39067
+ import { useId as useId68, useState as useState82 } from "react";
39068
+ import { jsx as jsx164, jsxs as jsxs156 } from "react/jsx-runtime";
38815
39069
  var DEFAULT_TYPES = [
38816
39070
  "slack",
38817
39071
  "email",
@@ -38850,7 +39104,7 @@ function NotificationChannelForm({
38850
39104
  className,
38851
39105
  id
38852
39106
  }) {
38853
- const reactId = useId67();
39107
+ const reactId = useId68();
38854
39108
  const baseId = id ?? `${reactId}-channel`;
38855
39109
  const typeMeta = CHANNEL_TYPE_META[value.type];
38856
39110
  const patch = (next) => onChange({ ...value, ...next });
@@ -38894,20 +39148,20 @@ function NotificationChannelForm({
38894
39148
  onChange({ type, label: value.label, id: value.id });
38895
39149
  setTouched({});
38896
39150
  };
38897
- const stepTitle = (n, title, hint) => /* @__PURE__ */ jsxs155("legend", { className: "ods-notif-channel-form__legend", children: [
38898
- numbered && /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel-form__step-num", children: n }),
38899
- /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel-form__step-title", children: title }),
38900
- hint && /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel-form__step-hint", children: hint })
39151
+ const stepTitle = (n, title, hint) => /* @__PURE__ */ jsxs156("legend", { className: "ods-notif-channel-form__legend", children: [
39152
+ numbered && /* @__PURE__ */ jsx164("span", { className: "ods-notif-channel-form__step-num", children: n }),
39153
+ /* @__PURE__ */ jsx164("span", { className: "ods-notif-channel-form__step-title", children: title }),
39154
+ hint && /* @__PURE__ */ jsx164("span", { className: "ods-notif-channel-form__step-hint", children: hint })
38901
39155
  ] });
38902
39156
  const destinationHint = typeMeta.connected ? "Pick a connected app, then where it should post." : value.type === "email" ? "Who should receive these emails?" : "Where should we send the signed JSON?";
38903
- return /* @__PURE__ */ jsxs155("div", { className: cn("ods-notif-channel-form", className), "data-size": size, id: baseId, children: [
38904
- /* @__PURE__ */ jsxs155("fieldset", { className: "ods-notif-channel-form__section", children: [
39157
+ return /* @__PURE__ */ jsxs156("div", { className: cn("ods-notif-channel-form", className), "data-size": size, id: baseId, children: [
39158
+ /* @__PURE__ */ jsxs156("fieldset", { className: "ods-notif-channel-form__section", children: [
38905
39159
  stepTitle(1, "Type", lockType ? "Type cannot change after creation." : void 0),
38906
- /* @__PURE__ */ jsx163("div", { className: "ods-notif-channel-form__types", role: "radiogroup", "aria-label": "Channel type", children: types.map((type) => {
39160
+ /* @__PURE__ */ jsx164("div", { className: "ods-notif-channel-form__types", role: "radiogroup", "aria-label": "Channel type", children: types.map((type) => {
38907
39161
  const meta2 = CHANNEL_TYPE_META[type];
38908
39162
  const selected = type === value.type;
38909
39163
  const hasApp = !meta2.connected || instances.some((i) => i.type === type);
38910
- return /* @__PURE__ */ jsxs155(
39164
+ return /* @__PURE__ */ jsxs156(
38911
39165
  "button",
38912
39166
  {
38913
39167
  type: "button",
@@ -38920,28 +39174,28 @@ function NotificationChannelForm({
38920
39174
  disabled: readOnly || lockType && !selected,
38921
39175
  onClick: () => selectType(type),
38922
39176
  children: [
38923
- /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel-form__type-icon", "aria-hidden": "true", children: meta2.icon }),
38924
- /* @__PURE__ */ jsxs155("span", { className: "ods-notif-channel-form__type-text", children: [
38925
- /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel-form__type-label", children: meta2.label }),
38926
- /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel-form__type-hint", children: meta2.connected && hasApp ? "Connected" : meta2.hint })
39177
+ /* @__PURE__ */ jsx164("span", { className: "ods-notif-channel-form__type-icon", "aria-hidden": "true", children: meta2.icon }),
39178
+ /* @__PURE__ */ jsxs156("span", { className: "ods-notif-channel-form__type-text", children: [
39179
+ /* @__PURE__ */ jsx164("span", { className: "ods-notif-channel-form__type-label", children: meta2.label }),
39180
+ /* @__PURE__ */ jsx164("span", { className: "ods-notif-channel-form__type-hint", children: meta2.connected && hasApp ? "Connected" : meta2.hint })
38927
39181
  ] }),
38928
- selected && /* @__PURE__ */ jsx163("span", { className: "ods-notif-channel-form__type-check", "aria-hidden": "true", children: /* @__PURE__ */ jsx163(CheckmarkFilledIcon3, { size: "sm" }) })
39182
+ selected && /* @__PURE__ */ jsx164("span", { className: "ods-notif-channel-form__type-check", "aria-hidden": "true", children: /* @__PURE__ */ jsx164(CheckmarkFilledIcon3, { size: "sm" }) })
38929
39183
  ]
38930
39184
  },
38931
39185
  type
38932
39186
  );
38933
39187
  }) })
38934
39188
  ] }),
38935
- /* @__PURE__ */ jsxs155("fieldset", { className: "ods-notif-channel-form__section", children: [
39189
+ /* @__PURE__ */ jsxs156("fieldset", { className: "ods-notif-channel-form__section", children: [
38936
39190
  stepTitle(2, "Destination", destinationHint),
38937
- typeMeta.connected && (forType.length === 0 ? /* @__PURE__ */ jsxs155(Callout, { variant: "info", size: "sm", title: `No ${typeMeta.label} app connected yet`, children: [
38938
- /* @__PURE__ */ jsx163("p", { className: "ods-notif-channel-form__p", children: "Connect one first \u2014 it takes a minute, and flows can use the same connection." }),
38939
- onConnectNew && !readOnly && /* @__PURE__ */ jsxs155(
39191
+ typeMeta.connected && (forType.length === 0 ? /* @__PURE__ */ jsxs156(Callout, { variant: "info", size: "sm", title: `No ${typeMeta.label} app connected yet`, children: [
39192
+ /* @__PURE__ */ jsx164("p", { className: "ods-notif-channel-form__p", children: "Connect one first \u2014 it takes a minute, and flows can use the same connection." }),
39193
+ onConnectNew && !readOnly && /* @__PURE__ */ jsxs156(
38940
39194
  Button,
38941
39195
  {
38942
39196
  size: "sm",
38943
39197
  variant: "primary",
38944
- leftIcon: /* @__PURE__ */ jsx163(LaunchIcon2, { size: "sm", "aria-hidden": "true" }),
39198
+ leftIcon: /* @__PURE__ */ jsx164(LaunchIcon2, { size: "sm", "aria-hidden": "true" }),
38945
39199
  onClick: () => onConnectNew(value.type),
38946
39200
  children: [
38947
39201
  "Connect ",
@@ -38949,9 +39203,9 @@ function NotificationChannelForm({
38949
39203
  ]
38950
39204
  }
38951
39205
  )
38952
- ] }) : /* @__PURE__ */ jsxs155("div", { className: "ods-notif-channel-form__grid", children: [
38953
- /* @__PURE__ */ jsxs155("div", { className: "ods-notif-channel-form__row", children: [
38954
- /* @__PURE__ */ jsx163(
39206
+ ] }) : /* @__PURE__ */ jsxs156("div", { className: "ods-notif-channel-form__grid", children: [
39207
+ /* @__PURE__ */ jsxs156("div", { className: "ods-notif-channel-form__row", children: [
39208
+ /* @__PURE__ */ jsx164(
38955
39209
  Select,
38956
39210
  {
38957
39211
  id: `${baseId}-instance`,
@@ -38970,12 +39224,12 @@ function NotificationChannelForm({
38970
39224
  className: "ods-notif-channel-form__grow"
38971
39225
  }
38972
39226
  ),
38973
- onConnectNew && !readOnly && /* @__PURE__ */ jsx163(
39227
+ onConnectNew && !readOnly && /* @__PURE__ */ jsx164(
38974
39228
  Button,
38975
39229
  {
38976
39230
  size,
38977
39231
  variant: "ghost",
38978
- leftIcon: /* @__PURE__ */ jsx163(AddIcon6, { size: "sm", "aria-hidden": "true" }),
39232
+ leftIcon: /* @__PURE__ */ jsx164(AddIcon6, { size: "sm", "aria-hidden": "true" }),
38979
39233
  onClick: () => onConnectNew(value.type),
38980
39234
  className: "ods-notif-channel-form__connect",
38981
39235
  children: "Connect new"
@@ -38987,7 +39241,7 @@ function NotificationChannelForm({
38987
39241
  // modal whose focus scope would pull focus straight back
38988
39242
  // out of a portaled search box. The Combobox input stays
38989
39243
  // inside the dialog; only its list is portaled.
38990
- /* @__PURE__ */ jsx163(
39244
+ /* @__PURE__ */ jsx164(
38991
39245
  Combobox,
38992
39246
  {
38993
39247
  id: `${baseId}-target`,
@@ -39005,7 +39259,7 @@ function NotificationChannelForm({
39005
39259
  size
39006
39260
  }
39007
39261
  )
39008
- ) : /* @__PURE__ */ jsx163(
39262
+ ) : /* @__PURE__ */ jsx164(
39009
39263
  Input,
39010
39264
  {
39011
39265
  id: `${baseId}-target`,
@@ -39021,9 +39275,9 @@ function NotificationChannelForm({
39021
39275
  }
39022
39276
  ))
39023
39277
  ] })),
39024
- value.type === "email" && /* @__PURE__ */ jsxs155("div", { className: "ods-notif-channel-form__field", children: [
39025
- /* @__PURE__ */ jsx163("label", { className: "ods-notif-channel-form__label", htmlFor: `${baseId}-recipient`, children: "Recipients" }),
39026
- /* @__PURE__ */ jsxs155(
39278
+ value.type === "email" && /* @__PURE__ */ jsxs156("div", { className: "ods-notif-channel-form__field", children: [
39279
+ /* @__PURE__ */ jsx164("label", { className: "ods-notif-channel-form__label", htmlFor: `${baseId}-recipient`, children: "Recipients" }),
39280
+ /* @__PURE__ */ jsxs156(
39027
39281
  "div",
39028
39282
  {
39029
39283
  className: cn(
@@ -39031,7 +39285,7 @@ function NotificationChannelForm({
39031
39285
  errorFor("recipients") && "ods-notif-channel-form__recipients--error"
39032
39286
  ),
39033
39287
  children: [
39034
- recipients.map((r) => /* @__PURE__ */ jsx163(
39288
+ recipients.map((r) => /* @__PURE__ */ jsx164(
39035
39289
  Chip,
39036
39290
  {
39037
39291
  size: "sm",
@@ -39042,7 +39296,7 @@ function NotificationChannelForm({
39042
39296
  },
39043
39297
  r
39044
39298
  )),
39045
- /* @__PURE__ */ jsx163(
39299
+ /* @__PURE__ */ jsx164(
39046
39300
  "input",
39047
39301
  {
39048
39302
  id: `${baseId}-recipient`,
@@ -39060,7 +39314,7 @@ function NotificationChannelForm({
39060
39314
  ]
39061
39315
  }
39062
39316
  ),
39063
- /* @__PURE__ */ jsx163(
39317
+ /* @__PURE__ */ jsx164(
39064
39318
  "div",
39065
39319
  {
39066
39320
  className: cn(
@@ -39071,7 +39325,7 @@ function NotificationChannelForm({
39071
39325
  }
39072
39326
  )
39073
39327
  ] }),
39074
- value.type === "webhook" && /* @__PURE__ */ jsx163(
39328
+ value.type === "webhook" && /* @__PURE__ */ jsx164(
39075
39329
  Input,
39076
39330
  {
39077
39331
  id: `${baseId}-url`,
@@ -39088,7 +39342,7 @@ function NotificationChannelForm({
39088
39342
  size
39089
39343
  }
39090
39344
  ),
39091
- value.type === "whatsapp" && /* @__PURE__ */ jsx163(
39345
+ value.type === "whatsapp" && /* @__PURE__ */ jsx164(
39092
39346
  Input,
39093
39347
  {
39094
39348
  id: `${baseId}-target`,
@@ -39106,9 +39360,9 @@ function NotificationChannelForm({
39106
39360
  }
39107
39361
  )
39108
39362
  ] }),
39109
- /* @__PURE__ */ jsxs155("fieldset", { className: "ods-notif-channel-form__section", children: [
39363
+ /* @__PURE__ */ jsxs156("fieldset", { className: "ods-notif-channel-form__section", children: [
39110
39364
  stepTitle(3, "Name", "How this channel appears in rules and the activity log."),
39111
- /* @__PURE__ */ jsx163(
39365
+ /* @__PURE__ */ jsx164(
39112
39366
  Input,
39113
39367
  {
39114
39368
  id: `${baseId}-label`,
@@ -39125,16 +39379,16 @@ function NotificationChannelForm({
39125
39379
  }
39126
39380
  )
39127
39381
  ] }),
39128
- showSummary && summary && /* @__PURE__ */ jsxs155("div", { className: "ods-notif-channel-form__summary", "aria-live": "polite", children: [
39129
- /* @__PURE__ */ jsx163(CheckmarkFilledIcon3, { size: "sm", "aria-hidden": "true" }),
39130
- /* @__PURE__ */ jsx163("span", { children: summary })
39382
+ showSummary && summary && /* @__PURE__ */ jsxs156("div", { className: "ods-notif-channel-form__summary", "aria-live": "polite", children: [
39383
+ /* @__PURE__ */ jsx164(CheckmarkFilledIcon3, { size: "sm", "aria-hidden": "true" }),
39384
+ /* @__PURE__ */ jsx164("span", { children: summary })
39131
39385
  ] })
39132
39386
  ] });
39133
39387
  }
39134
39388
  NotificationChannelForm.displayName = "NotificationChannelForm";
39135
39389
 
39136
39390
  // src/notifications/components/NotificationChannelDialog/NotificationChannelDialog.tsx
39137
- import { jsx as jsx164, jsxs as jsxs156 } from "react/jsx-runtime";
39391
+ import { jsx as jsx165, jsxs as jsxs157 } from "react/jsx-runtime";
39138
39392
  function NotificationChannelDialog({
39139
39393
  open,
39140
39394
  onClose,
@@ -39162,7 +39416,7 @@ function NotificationChannelDialog({
39162
39416
  const [testing, setTesting] = useState83(false);
39163
39417
  const [testResult, setTestResult] = useState83(null);
39164
39418
  const [submitError, setSubmitError] = useState83(null);
39165
- useEffect60(() => {
39419
+ useEffect61(() => {
39166
39420
  if (!open) return;
39167
39421
  setDraft(draftFromChannel(channel, initialType));
39168
39422
  setSubmitted(false);
@@ -39205,7 +39459,7 @@ function NotificationChannelDialog({
39205
39459
  setTesting(false);
39206
39460
  }
39207
39461
  };
39208
- return /* @__PURE__ */ jsxs156(
39462
+ return /* @__PURE__ */ jsxs157(
39209
39463
  Dialog,
39210
39464
  {
39211
39465
  open,
@@ -39215,12 +39469,12 @@ function NotificationChannelDialog({
39215
39469
  title: title ?? (editing ? "Edit channel" : "Add channel"),
39216
39470
  description: description ?? (editing ? "Change where this channel posts or what it is called." : "Where should notifications go besides the in-app inbox?"),
39217
39471
  closeOnOverlayClick: false,
39218
- footer: /* @__PURE__ */ jsxs156("div", { className: "ods-notif-channel-dialog__footer", children: [
39219
- onTest && /* @__PURE__ */ jsx164(
39472
+ footer: /* @__PURE__ */ jsxs157("div", { className: "ods-notif-channel-dialog__footer", children: [
39473
+ onTest && /* @__PURE__ */ jsx165(
39220
39474
  Button,
39221
39475
  {
39222
39476
  variant: "secondary",
39223
- leftIcon: /* @__PURE__ */ jsx164(SendIcon2, { size: "sm", "aria-hidden": "true" }),
39477
+ leftIcon: /* @__PURE__ */ jsx165(SendIcon2, { size: "sm", "aria-hidden": "true" }),
39224
39478
  loading: testing,
39225
39479
  loadingText: "Sending\u2026",
39226
39480
  disabled: !complete || saving,
@@ -39228,9 +39482,9 @@ function NotificationChannelDialog({
39228
39482
  children: "Send test"
39229
39483
  }
39230
39484
  ),
39231
- /* @__PURE__ */ jsx164("span", { className: "ods-notif-channel-dialog__spacer" }),
39232
- /* @__PURE__ */ jsx164(Button, { variant: "ghost", onClick: onClose, disabled: saving, children: "Cancel" }),
39233
- /* @__PURE__ */ jsx164(
39485
+ /* @__PURE__ */ jsx165("span", { className: "ods-notif-channel-dialog__spacer" }),
39486
+ /* @__PURE__ */ jsx165(Button, { variant: "ghost", onClick: onClose, disabled: saving, children: "Cancel" }),
39487
+ /* @__PURE__ */ jsx165(
39234
39488
  Button,
39235
39489
  {
39236
39490
  variant: "primary",
@@ -39242,7 +39496,7 @@ function NotificationChannelDialog({
39242
39496
  )
39243
39497
  ] }),
39244
39498
  children: [
39245
- /* @__PURE__ */ jsx164(
39499
+ /* @__PURE__ */ jsx165(
39246
39500
  NotificationChannelForm,
39247
39501
  {
39248
39502
  value: draft,
@@ -39257,7 +39511,7 @@ function NotificationChannelDialog({
39257
39511
  showAllErrors: submitted
39258
39512
  }
39259
39513
  ),
39260
- (testResult || submitError) && /* @__PURE__ */ jsx164("div", { className: "ods-notif-channel-dialog__test", children: submitError ? /* @__PURE__ */ jsx164(InlineMessage, { tone: "danger", size: "sm", live: "assertive", children: submitError }) : testResult ? /* @__PURE__ */ jsx164(InlineMessage, { tone: testResult.ok ? "success" : "danger", size: "sm", live: "polite", children: testResult.message ?? (testResult.ok ? "Test message delivered." : "Test failed \u2014 check the destination.") }) : null })
39514
+ (testResult || submitError) && /* @__PURE__ */ jsx165("div", { className: "ods-notif-channel-dialog__test", children: submitError ? /* @__PURE__ */ jsx165(InlineMessage, { tone: "danger", size: "sm", live: "assertive", children: submitError }) : testResult ? /* @__PURE__ */ jsx165(InlineMessage, { tone: testResult.ok ? "success" : "danger", size: "sm", live: "polite", children: testResult.message ?? (testResult.ok ? "Test message delivered." : "Test failed \u2014 check the destination.") }) : null })
39261
39515
  ]
39262
39516
  }
39263
39517
  );
@@ -39266,7 +39520,7 @@ NotificationChannelDialog.displayName = "NotificationChannelDialog";
39266
39520
 
39267
39521
  // src/notifications/components/NotificationChannelList/NotificationChannelList.tsx
39268
39522
  import { AddIcon as AddIcon7, ConnectIcon } from "@octaviaflow/icons";
39269
- import { jsx as jsx165, jsxs as jsxs157 } from "react/jsx-runtime";
39523
+ import { jsx as jsx166, jsxs as jsxs158 } from "react/jsx-runtime";
39270
39524
  function NotificationChannelList({
39271
39525
  channels,
39272
39526
  title = "Channels",
@@ -39283,41 +39537,41 @@ function NotificationChannelList({
39283
39537
  className
39284
39538
  }) {
39285
39539
  const canAdd = Boolean(onAdd) && !readOnly;
39286
- return /* @__PURE__ */ jsxs157("section", { className: cn("ods-notif-channels", className), "aria-label": "Notification channels", children: [
39287
- /* @__PURE__ */ jsxs157("header", { className: "ods-notif-channels__head", children: [
39288
- /* @__PURE__ */ jsxs157("h3", { className: "ods-notif-channels__title", children: [
39540
+ return /* @__PURE__ */ jsxs158("section", { className: cn("ods-notif-channels", className), "aria-label": "Notification channels", children: [
39541
+ /* @__PURE__ */ jsxs158("header", { className: "ods-notif-channels__head", children: [
39542
+ /* @__PURE__ */ jsxs158("h3", { className: "ods-notif-channels__title", children: [
39289
39543
  title,
39290
- /* @__PURE__ */ jsx165("span", { className: "ods-notif-channels__count", children: channels.length })
39544
+ /* @__PURE__ */ jsx166("span", { className: "ods-notif-channels__count", children: channels.length })
39291
39545
  ] }),
39292
- canAdd && channels.length > 0 && /* @__PURE__ */ jsx165(
39546
+ canAdd && channels.length > 0 && /* @__PURE__ */ jsx166(
39293
39547
  Button,
39294
39548
  {
39295
39549
  size: "sm",
39296
39550
  variant: "secondary",
39297
- leftIcon: /* @__PURE__ */ jsx165(AddIcon7, { size: "sm", "aria-hidden": "true" }),
39551
+ leftIcon: /* @__PURE__ */ jsx166(AddIcon7, { size: "sm", "aria-hidden": "true" }),
39298
39552
  onClick: onAdd,
39299
39553
  children: "Add channel"
39300
39554
  }
39301
39555
  )
39302
39556
  ] }),
39303
- channels.length === 0 ? /* @__PURE__ */ jsx165(
39557
+ channels.length === 0 ? /* @__PURE__ */ jsx166(
39304
39558
  EmptyState,
39305
39559
  {
39306
- icon: /* @__PURE__ */ jsx165(ConnectIcon, { "aria-hidden": "true" }),
39560
+ icon: /* @__PURE__ */ jsx166(ConnectIcon, { "aria-hidden": "true" }),
39307
39561
  title: "No channels yet",
39308
39562
  description: "A channel is somewhere alerts go besides the in-app inbox \u2014 a Slack channel, an email address, a webhook. Add one, then point rules at it.",
39309
- action: canAdd ? /* @__PURE__ */ jsx165(
39563
+ action: canAdd ? /* @__PURE__ */ jsx166(
39310
39564
  Button,
39311
39565
  {
39312
39566
  variant: "primary",
39313
- leftIcon: /* @__PURE__ */ jsx165(AddIcon7, { size: "sm", "aria-hidden": "true" }),
39567
+ leftIcon: /* @__PURE__ */ jsx166(AddIcon7, { size: "sm", "aria-hidden": "true" }),
39314
39568
  onClick: onAdd,
39315
39569
  children: "Add channel"
39316
39570
  }
39317
39571
  ) : void 0
39318
39572
  }
39319
- ) : /* @__PURE__ */ jsxs157("div", { className: "ods-notif-channels__grid", children: [
39320
- channels.map((channel) => /* @__PURE__ */ jsx165(
39573
+ ) : /* @__PURE__ */ jsxs158("div", { className: "ods-notif-channels__grid", children: [
39574
+ channels.map((channel) => /* @__PURE__ */ jsx166(
39321
39575
  NotificationChannelCard,
39322
39576
  {
39323
39577
  channel,
@@ -39333,8 +39587,8 @@ function NotificationChannelList({
39333
39587
  },
39334
39588
  channel.id
39335
39589
  )),
39336
- canAdd && /* @__PURE__ */ jsxs157("button", { type: "button", className: "ods-notif-channels__add", onClick: onAdd, children: [
39337
- /* @__PURE__ */ jsx165("span", { className: "ods-notif-channels__add-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx165(AddIcon7, { size: "sm" }) }),
39590
+ canAdd && /* @__PURE__ */ jsxs158("button", { type: "button", className: "ods-notif-channels__add", onClick: onAdd, children: [
39591
+ /* @__PURE__ */ jsx166("span", { className: "ods-notif-channels__add-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx166(AddIcon7, { size: "sm" }) }),
39338
39592
  "Add channel"
39339
39593
  ] })
39340
39594
  ] })
@@ -39344,7 +39598,7 @@ NotificationChannelList.displayName = "NotificationChannelList";
39344
39598
 
39345
39599
  // src/notifications/components/NotificationPreferenceMatrix/NotificationPreferenceMatrix.tsx
39346
39600
  import { LockedIcon as LockedIcon2 } from "@octaviaflow/icons";
39347
- import { useId as useId68, useMemo as useMemo44, useState as useState84 } from "react";
39601
+ import { useId as useId69, useMemo as useMemo44, useState as useState84 } from "react";
39348
39602
 
39349
39603
  // src/notifications/engine/preferences.ts
39350
39604
  var CRITICAL_CHANNELS = ["in_app", "email"];
@@ -39413,7 +39667,7 @@ function countEnabled(prefs, catalog, channel) {
39413
39667
  }
39414
39668
 
39415
39669
  // src/notifications/components/NotificationPreferenceMatrix/NotificationPreferenceMatrix.tsx
39416
- import { jsx as jsx166, jsxs as jsxs158 } from "react/jsx-runtime";
39670
+ import { jsx as jsx167, jsxs as jsxs159 } from "react/jsx-runtime";
39417
39671
  var DEFAULT_COLUMNS = [{ id: "in_app" }, { id: "email" }];
39418
39672
  var FREQUENCY_OPTIONS = [
39419
39673
  { value: "immediate", label: "Immediately" },
@@ -39432,7 +39686,7 @@ function NotificationPreferenceMatrix({
39432
39686
  className,
39433
39687
  id
39434
39688
  }) {
39435
- const reactId = useId68();
39689
+ const reactId = useId69();
39436
39690
  const baseId = id ?? `${reactId}-prefs`;
39437
39691
  const visible = useMemo44(
39438
39692
  () => filterCatalog(catalog, personalAudiences(isAdmin)),
@@ -39455,13 +39709,13 @@ function NotificationPreferenceMatrix({
39455
39709
  );
39456
39710
  onChange(r.next);
39457
39711
  };
39458
- return /* @__PURE__ */ jsxs158("div", { className: cn("ods-pref-matrix", className), id: baseId, children: [
39459
- showEmailFrequency && /* @__PURE__ */ jsxs158("div", { className: "ods-pref-matrix__frequency", children: [
39460
- /* @__PURE__ */ jsxs158("div", { className: "ods-pref-matrix__frequency-label", children: [
39712
+ return /* @__PURE__ */ jsxs159("div", { className: cn("ods-pref-matrix", className), id: baseId, children: [
39713
+ showEmailFrequency && /* @__PURE__ */ jsxs159("div", { className: "ods-pref-matrix__frequency", children: [
39714
+ /* @__PURE__ */ jsxs159("div", { className: "ods-pref-matrix__frequency-label", children: [
39461
39715
  "Email frequency",
39462
- /* @__PURE__ */ jsx166("span", { className: "ods-pref-matrix__frequency-hint", children: "Critical alerts are always sent immediately." })
39716
+ /* @__PURE__ */ jsx167("span", { className: "ods-pref-matrix__frequency-hint", children: "Critical alerts are always sent immediately." })
39463
39717
  ] }),
39464
- /* @__PURE__ */ jsx166(
39718
+ /* @__PURE__ */ jsx167(
39465
39719
  SegmentedControl,
39466
39720
  {
39467
39721
  "aria-label": "Email frequency",
@@ -39472,8 +39726,8 @@ function NotificationPreferenceMatrix({
39472
39726
  disabled: readOnly
39473
39727
  }
39474
39728
  ),
39475
- value.emailFrequency === "daily" && /* @__PURE__ */ jsxs158("div", { className: "ods-pref-matrix__digest", children: [
39476
- /* @__PURE__ */ jsx166(
39729
+ value.emailFrequency === "daily" && /* @__PURE__ */ jsxs159("div", { className: "ods-pref-matrix__digest", children: [
39730
+ /* @__PURE__ */ jsx167(
39477
39731
  TimePicker,
39478
39732
  {
39479
39733
  label: "At",
@@ -39484,7 +39738,7 @@ function NotificationPreferenceMatrix({
39484
39738
  disabled: readOnly
39485
39739
  }
39486
39740
  ),
39487
- /* @__PURE__ */ jsx166(
39741
+ /* @__PURE__ */ jsx167(
39488
39742
  TimezonePicker,
39489
39743
  {
39490
39744
  label: "Timezone",
@@ -39496,8 +39750,8 @@ function NotificationPreferenceMatrix({
39496
39750
  )
39497
39751
  ] })
39498
39752
  ] }),
39499
- notice && /* @__PURE__ */ jsx166(InlineMessage, { tone: "warning", size: "sm", live: "polite", children: notice }),
39500
- /* @__PURE__ */ jsxs158(
39753
+ notice && /* @__PURE__ */ jsx167(InlineMessage, { tone: "warning", size: "sm", live: "polite", children: notice }),
39754
+ /* @__PURE__ */ jsxs159(
39501
39755
  "div",
39502
39756
  {
39503
39757
  className: "ods-pref-matrix__table",
@@ -39505,17 +39759,17 @@ function NotificationPreferenceMatrix({
39505
39759
  "aria-label": "Notification preferences",
39506
39760
  style: { "--ods-pref-columns": channels.length },
39507
39761
  children: [
39508
- /* @__PURE__ */ jsxs158("div", { className: "ods-pref-matrix__row ods-pref-matrix__row--head", role: "row", children: [
39509
- /* @__PURE__ */ jsx166("div", { className: "ods-pref-matrix__cell ods-pref-matrix__cell--label", role: "columnheader", children: "Event" }),
39762
+ /* @__PURE__ */ jsxs159("div", { className: "ods-pref-matrix__row ods-pref-matrix__row--head", role: "row", children: [
39763
+ /* @__PURE__ */ jsx167("div", { className: "ods-pref-matrix__cell ods-pref-matrix__cell--label", role: "columnheader", children: "Event" }),
39510
39764
  channels.map((col) => {
39511
39765
  const meta2 = PERSONAL_CHANNEL_META[col.id];
39512
- return /* @__PURE__ */ jsxs158(
39766
+ return /* @__PURE__ */ jsxs159(
39513
39767
  "div",
39514
39768
  {
39515
39769
  className: "ods-pref-matrix__cell ods-pref-matrix__cell--col",
39516
39770
  role: "columnheader",
39517
39771
  children: [
39518
- /* @__PURE__ */ jsx166("span", { className: "ods-pref-matrix__col-icon", "aria-hidden": "true", children: col.icon ?? meta2.icon }),
39772
+ /* @__PURE__ */ jsx167("span", { className: "ods-pref-matrix__col-icon", "aria-hidden": "true", children: col.icon ?? meta2.icon }),
39519
39773
  col.label ?? meta2.label
39520
39774
  ]
39521
39775
  },
@@ -39523,20 +39777,20 @@ function NotificationPreferenceMatrix({
39523
39777
  );
39524
39778
  })
39525
39779
  ] }),
39526
- visible.map((category) => /* @__PURE__ */ jsxs158("div", { className: "ods-pref-matrix__group", role: "rowgroup", children: [
39527
- /* @__PURE__ */ jsxs158("div", { className: "ods-pref-matrix__row ods-pref-matrix__row--group", role: "row", children: [
39528
- /* @__PURE__ */ jsxs158("div", { className: "ods-pref-matrix__cell ods-pref-matrix__cell--label", role: "rowheader", children: [
39529
- /* @__PURE__ */ jsx166("span", { className: "ods-pref-matrix__group-title", children: category.label }),
39530
- category.description && /* @__PURE__ */ jsx166("span", { className: "ods-pref-matrix__group-desc", children: category.description })
39780
+ visible.map((category) => /* @__PURE__ */ jsxs159("div", { className: "ods-pref-matrix__group", role: "rowgroup", children: [
39781
+ /* @__PURE__ */ jsxs159("div", { className: "ods-pref-matrix__row ods-pref-matrix__row--group", role: "row", children: [
39782
+ /* @__PURE__ */ jsxs159("div", { className: "ods-pref-matrix__cell ods-pref-matrix__cell--label", role: "rowheader", children: [
39783
+ /* @__PURE__ */ jsx167("span", { className: "ods-pref-matrix__group-title", children: category.label }),
39784
+ category.description && /* @__PURE__ */ jsx167("span", { className: "ods-pref-matrix__group-desc", children: category.description })
39531
39785
  ] }),
39532
39786
  channels.map((col) => {
39533
39787
  const state = categoryColumnState(value, category, col.id);
39534
- return /* @__PURE__ */ jsx166(
39788
+ return /* @__PURE__ */ jsx167(
39535
39789
  "div",
39536
39790
  {
39537
39791
  className: "ods-pref-matrix__cell ods-pref-matrix__cell--col",
39538
39792
  role: "cell",
39539
- children: /* @__PURE__ */ jsx166(
39793
+ children: /* @__PURE__ */ jsx167(
39540
39794
  Checkbox,
39541
39795
  {
39542
39796
  size: "sm",
@@ -39554,19 +39808,19 @@ function NotificationPreferenceMatrix({
39554
39808
  ] }),
39555
39809
  category.events.map((event) => {
39556
39810
  const sev = SEVERITY_META[event.severity];
39557
- return /* @__PURE__ */ jsxs158("div", { className: "ods-pref-matrix__row", role: "row", children: [
39558
- /* @__PURE__ */ jsxs158(
39811
+ return /* @__PURE__ */ jsxs159("div", { className: "ods-pref-matrix__row", role: "row", children: [
39812
+ /* @__PURE__ */ jsxs159(
39559
39813
  "div",
39560
39814
  {
39561
39815
  className: "ods-pref-matrix__cell ods-pref-matrix__cell--label",
39562
39816
  role: "rowheader",
39563
39817
  children: [
39564
- /* @__PURE__ */ jsxs158("span", { className: "ods-pref-matrix__event", children: [
39565
- /* @__PURE__ */ jsx166("span", { className: "ods-pref-matrix__event-label", children: event.label }),
39566
- /* @__PURE__ */ jsx166(Badge, { size: "sm", variant: sev.variant, dot: true, children: sev.label }),
39567
- event.critical && /* @__PURE__ */ jsx166(Badge, { size: "sm", variant: "neutral", outlined: true, children: "Critical" })
39818
+ /* @__PURE__ */ jsxs159("span", { className: "ods-pref-matrix__event", children: [
39819
+ /* @__PURE__ */ jsx167("span", { className: "ods-pref-matrix__event-label", children: event.label }),
39820
+ /* @__PURE__ */ jsx167(Badge, { size: "sm", variant: sev.variant, dot: true, children: sev.label }),
39821
+ event.critical && /* @__PURE__ */ jsx167(Badge, { size: "sm", variant: "neutral", outlined: true, children: "Critical" })
39568
39822
  ] }),
39569
- event.description && /* @__PURE__ */ jsx166("span", { className: "ods-pref-matrix__event-desc", children: event.description })
39823
+ event.description && /* @__PURE__ */ jsx167("span", { className: "ods-pref-matrix__event-desc", children: event.description })
39570
39824
  ]
39571
39825
  }
39572
39826
  ),
@@ -39574,8 +39828,8 @@ function NotificationPreferenceMatrix({
39574
39828
  const on = isPreferenceEnabled(value, event, col.id);
39575
39829
  const locked = isPreferenceLocked(value, event, col.id);
39576
39830
  const colLabel = typeof col.label === "string" ? col.label : PERSONAL_CHANNEL_META[col.id].label;
39577
- const control = /* @__PURE__ */ jsxs158("span", { className: "ods-pref-matrix__control", children: [
39578
- /* @__PURE__ */ jsx166(
39831
+ const control = /* @__PURE__ */ jsxs159("span", { className: "ods-pref-matrix__control", children: [
39832
+ /* @__PURE__ */ jsx167(
39579
39833
  Switch,
39580
39834
  {
39581
39835
  size: "sm",
@@ -39585,14 +39839,14 @@ function NotificationPreferenceMatrix({
39585
39839
  "aria-label": `${event.label} via ${colLabel}`
39586
39840
  }
39587
39841
  ),
39588
- locked && /* @__PURE__ */ jsx166("span", { className: "ods-pref-matrix__lock", "aria-hidden": "true", children: /* @__PURE__ */ jsx166(LockedIcon2, { size: "sm" }) })
39842
+ locked && /* @__PURE__ */ jsx167("span", { className: "ods-pref-matrix__lock", "aria-hidden": "true", children: /* @__PURE__ */ jsx167(LockedIcon2, { size: "sm" }) })
39589
39843
  ] });
39590
- return /* @__PURE__ */ jsx166(
39844
+ return /* @__PURE__ */ jsx167(
39591
39845
  "div",
39592
39846
  {
39593
39847
  className: "ods-pref-matrix__cell ods-pref-matrix__cell--col",
39594
39848
  role: "cell",
39595
- children: /* @__PURE__ */ jsx166(
39849
+ children: /* @__PURE__ */ jsx167(
39596
39850
  Tooltip,
39597
39851
  {
39598
39852
  content: locked ? LOCK_MESSAGE : col.disabledReason ?? "",
@@ -39617,8 +39871,8 @@ NotificationPreferenceMatrix.displayName = "NotificationPreferenceMatrix";
39617
39871
 
39618
39872
  // src/notifications/components/NotificationRuleEditor/NotificationRuleEditor.tsx
39619
39873
  import { AddIcon as AddIcon8, RuleIcon } from "@octaviaflow/icons";
39620
- import { useId as useId69, useMemo as useMemo45 } from "react";
39621
- import { Fragment as Fragment68, jsx as jsx167, jsxs as jsxs159 } from "react/jsx-runtime";
39874
+ import { useId as useId70, useMemo as useMemo45 } from "react";
39875
+ import { Fragment as Fragment68, jsx as jsx168, jsxs as jsxs160 } from "react/jsx-runtime";
39622
39876
  var COOLDOWN_OPTIONS = [
39623
39877
  { value: "0", label: "No limit" },
39624
39878
  { value: "15", label: "Once every 15 minutes" },
@@ -39681,7 +39935,7 @@ function NotificationRuleEditor({
39681
39935
  className,
39682
39936
  id
39683
39937
  }) {
39684
- const reactId = useId69();
39938
+ const reactId = useId70();
39685
39939
  const baseId = id ?? `${reactId}-rule`;
39686
39940
  const patch = (next) => onChange({ ...value, ...next });
39687
39941
  const ruleCatalog = useMemo45(() => filterCatalog(catalog, RULE_AUDIENCES), [catalog]);
@@ -39700,12 +39954,12 @@ function NotificationRuleEditor({
39700
39954
  const setQuiet = (next) => patch({ quietHours: { ...quiet, ...next } });
39701
39955
  const showFooter = Boolean(onSave || onCancel);
39702
39956
  const canSave = value.events.length > 0 && value.channelIds.length > 0 && !saving && !readOnly;
39703
- return /* @__PURE__ */ jsxs159("div", { className: cn("ods-rule-editor", className), id: baseId, children: [
39704
- /* @__PURE__ */ jsxs159("div", { className: "ods-rule-editor__summary", "aria-live": "polite", children: [
39705
- /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__summary-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx167(RuleIcon, { size: "sm" }) }),
39706
- /* @__PURE__ */ jsx167("span", { children: sentence })
39957
+ return /* @__PURE__ */ jsxs160("div", { className: cn("ods-rule-editor", className), id: baseId, children: [
39958
+ /* @__PURE__ */ jsxs160("div", { className: "ods-rule-editor__summary", "aria-live": "polite", children: [
39959
+ /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__summary-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx168(RuleIcon, { size: "sm" }) }),
39960
+ /* @__PURE__ */ jsx168("span", { children: sentence })
39707
39961
  ] }),
39708
- /* @__PURE__ */ jsx167(
39962
+ /* @__PURE__ */ jsx168(
39709
39963
  Input,
39710
39964
  {
39711
39965
  id: `${baseId}-name`,
@@ -39718,13 +39972,13 @@ function NotificationRuleEditor({
39718
39972
  disabled: readOnly
39719
39973
  }
39720
39974
  ),
39721
- /* @__PURE__ */ jsxs159("section", { className: "ods-rule-editor__step", "aria-labelledby": `${baseId}-what`, children: [
39722
- /* @__PURE__ */ jsxs159("h4", { id: `${baseId}-what`, className: "ods-rule-editor__step-title", children: [
39723
- /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__step-num", children: "1" }),
39975
+ /* @__PURE__ */ jsxs160("section", { className: "ods-rule-editor__step", "aria-labelledby": `${baseId}-what`, children: [
39976
+ /* @__PURE__ */ jsxs160("h4", { id: `${baseId}-what`, className: "ods-rule-editor__step-title", children: [
39977
+ /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__step-num", children: "1" }),
39724
39978
  "What",
39725
- /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__step-hint", children: "Which events should trigger this rule?" })
39979
+ /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__step-hint", children: "Which events should trigger this rule?" })
39726
39980
  ] }),
39727
- /* @__PURE__ */ jsx167(
39981
+ /* @__PURE__ */ jsx168(
39728
39982
  EventCatalogPicker,
39729
39983
  {
39730
39984
  catalog: ruleCatalog,
@@ -39734,20 +39988,20 @@ function NotificationRuleEditor({
39734
39988
  collapsible: true
39735
39989
  }
39736
39990
  ),
39737
- errors?.events && /* @__PURE__ */ jsx167("div", { className: "ods-rule-editor__error", children: errors.events })
39991
+ errors?.events && /* @__PURE__ */ jsx168("div", { className: "ods-rule-editor__error", children: errors.events })
39738
39992
  ] }),
39739
- /* @__PURE__ */ jsxs159("section", { className: "ods-rule-editor__step", "aria-labelledby": `${baseId}-where`, children: [
39740
- /* @__PURE__ */ jsxs159("h4", { id: `${baseId}-where`, className: "ods-rule-editor__step-title", children: [
39741
- /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__step-num", children: "2" }),
39993
+ /* @__PURE__ */ jsxs160("section", { className: "ods-rule-editor__step", "aria-labelledby": `${baseId}-where`, children: [
39994
+ /* @__PURE__ */ jsxs160("h4", { id: `${baseId}-where`, className: "ods-rule-editor__step-title", children: [
39995
+ /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__step-num", children: "2" }),
39742
39996
  "Where",
39743
- /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__step-hint", children: "Pick one or more channels." })
39997
+ /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__step-hint", children: "Pick one or more channels." })
39744
39998
  ] }),
39745
- /* @__PURE__ */ jsxs159("div", { className: "ods-rule-editor__channels", role: "group", "aria-label": "Channels", children: [
39746
- channels.length === 0 && /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__muted", children: "No channels yet." }),
39999
+ /* @__PURE__ */ jsxs160("div", { className: "ods-rule-editor__channels", role: "group", "aria-label": "Channels", children: [
40000
+ channels.length === 0 && /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__muted", children: "No channels yet." }),
39747
40001
  channels.map((channel) => {
39748
40002
  const on = value.channelIds.includes(channel.id);
39749
40003
  const meta2 = CHANNEL_TYPE_META[channel.type];
39750
- return /* @__PURE__ */ jsx167(
40004
+ return /* @__PURE__ */ jsx168(
39751
40005
  Chip,
39752
40006
  {
39753
40007
  size: "md",
@@ -39762,26 +40016,26 @@ function NotificationRuleEditor({
39762
40016
  channel.id
39763
40017
  );
39764
40018
  }),
39765
- onAddChannel && !readOnly && /* @__PURE__ */ jsx167(
40019
+ onAddChannel && !readOnly && /* @__PURE__ */ jsx168(
39766
40020
  Button,
39767
40021
  {
39768
40022
  size: "sm",
39769
40023
  variant: "ghost",
39770
- leftIcon: /* @__PURE__ */ jsx167(AddIcon8, { size: "sm", "aria-hidden": "true" }),
40024
+ leftIcon: /* @__PURE__ */ jsx168(AddIcon8, { size: "sm", "aria-hidden": "true" }),
39771
40025
  onClick: onAddChannel,
39772
40026
  children: "Add channel"
39773
40027
  }
39774
40028
  )
39775
40029
  ] }),
39776
- errors?.channelIds && /* @__PURE__ */ jsx167("div", { className: "ods-rule-editor__error", children: errors.channelIds })
40030
+ errors?.channelIds && /* @__PURE__ */ jsx168("div", { className: "ods-rule-editor__error", children: errors.channelIds })
39777
40031
  ] }),
39778
- /* @__PURE__ */ jsxs159("section", { className: "ods-rule-editor__step", "aria-labelledby": `${baseId}-when`, children: [
39779
- /* @__PURE__ */ jsxs159("h4", { id: `${baseId}-when`, className: "ods-rule-editor__step-title", children: [
39780
- /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__step-num", children: "3" }),
40032
+ /* @__PURE__ */ jsxs160("section", { className: "ods-rule-editor__step", "aria-labelledby": `${baseId}-when`, children: [
40033
+ /* @__PURE__ */ jsxs160("h4", { id: `${baseId}-when`, className: "ods-rule-editor__step-title", children: [
40034
+ /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__step-num", children: "3" }),
39781
40035
  "When",
39782
- /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__step-hint", children: "How quickly should it go out?" })
40036
+ /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__step-hint", children: "How quickly should it go out?" })
39783
40037
  ] }),
39784
- /* @__PURE__ */ jsx167(
40038
+ /* @__PURE__ */ jsx168(
39785
40039
  DeliveryFrequencyControl,
39786
40040
  {
39787
40041
  label: null,
@@ -39791,7 +40045,7 @@ function NotificationRuleEditor({
39791
40045
  }
39792
40046
  )
39793
40047
  ] }),
39794
- /* @__PURE__ */ jsx167(
40048
+ /* @__PURE__ */ jsx168(
39795
40049
  Disclosure,
39796
40050
  {
39797
40051
  title: "Advanced options",
@@ -39799,9 +40053,9 @@ function NotificationRuleEditor({
39799
40053
  defaultOpen: openAdvanced,
39800
40054
  size: "sm",
39801
40055
  className: "ods-rule-editor__advanced",
39802
- children: /* @__PURE__ */ jsxs159("div", { className: "ods-rule-editor__advanced-body", children: [
39803
- /* @__PURE__ */ jsx167("div", { className: "ods-rule-editor__subhead", children: "Condition" }),
39804
- /* @__PURE__ */ jsx167(
40056
+ children: /* @__PURE__ */ jsxs160("div", { className: "ods-rule-editor__advanced-body", children: [
40057
+ /* @__PURE__ */ jsx168("div", { className: "ods-rule-editor__subhead", children: "Condition" }),
40058
+ /* @__PURE__ */ jsx168(
39805
40059
  AlertConditionComposer,
39806
40060
  {
39807
40061
  label: null,
@@ -39813,10 +40067,10 @@ function NotificationRuleEditor({
39813
40067
  disabled: readOnly
39814
40068
  }
39815
40069
  ),
39816
- (scopeOptions?.flows || scopeOptions?.connectors) && /* @__PURE__ */ jsxs159(Fragment68, { children: [
39817
- /* @__PURE__ */ jsx167("div", { className: "ods-rule-editor__subhead", children: "Scope" }),
39818
- /* @__PURE__ */ jsxs159("div", { className: "ods-rule-editor__grid", children: [
39819
- scopeOptions.flows && /* @__PURE__ */ jsx167(
40070
+ (scopeOptions?.flows || scopeOptions?.connectors) && /* @__PURE__ */ jsxs160(Fragment68, { children: [
40071
+ /* @__PURE__ */ jsx168("div", { className: "ods-rule-editor__subhead", children: "Scope" }),
40072
+ /* @__PURE__ */ jsxs160("div", { className: "ods-rule-editor__grid", children: [
40073
+ scopeOptions.flows && /* @__PURE__ */ jsx168(
39820
40074
  MultiSelect,
39821
40075
  {
39822
40076
  label: "Only these flows",
@@ -39828,7 +40082,7 @@ function NotificationRuleEditor({
39828
40082
  disabled: readOnly
39829
40083
  }
39830
40084
  ),
39831
- scopeOptions.connectors && /* @__PURE__ */ jsx167(
40085
+ scopeOptions.connectors && /* @__PURE__ */ jsx168(
39832
40086
  MultiSelect,
39833
40087
  {
39834
40088
  label: "Only these apps",
@@ -39842,9 +40096,9 @@ function NotificationRuleEditor({
39842
40096
  )
39843
40097
  ] })
39844
40098
  ] }),
39845
- /* @__PURE__ */ jsx167("div", { className: "ods-rule-editor__subhead", children: "Repeat & cooldown" }),
39846
- /* @__PURE__ */ jsxs159("div", { className: "ods-rule-editor__grid", children: [
39847
- /* @__PURE__ */ jsx167(
40099
+ /* @__PURE__ */ jsx168("div", { className: "ods-rule-editor__subhead", children: "Repeat & cooldown" }),
40100
+ /* @__PURE__ */ jsxs160("div", { className: "ods-rule-editor__grid", children: [
40101
+ /* @__PURE__ */ jsx168(
39848
40102
  Select,
39849
40103
  {
39850
40104
  label: `Limit per ${subjectNoun}`,
@@ -39855,7 +40109,7 @@ function NotificationRuleEditor({
39855
40109
  disabled: readOnly
39856
40110
  }
39857
40111
  ),
39858
- /* @__PURE__ */ jsx167(
40112
+ /* @__PURE__ */ jsx168(
39859
40113
  Select,
39860
40114
  {
39861
40115
  label: "While it keeps failing",
@@ -39867,8 +40121,8 @@ function NotificationRuleEditor({
39867
40121
  }
39868
40122
  )
39869
40123
  ] }),
39870
- /* @__PURE__ */ jsx167("div", { className: "ods-rule-editor__subhead", children: "Quiet hours" }),
39871
- /* @__PURE__ */ jsx167(
40124
+ /* @__PURE__ */ jsx168("div", { className: "ods-rule-editor__subhead", children: "Quiet hours" }),
40125
+ /* @__PURE__ */ jsx168(
39872
40126
  Switch,
39873
40127
  {
39874
40128
  size: "sm",
@@ -39879,8 +40133,8 @@ function NotificationRuleEditor({
39879
40133
  disabled: readOnly
39880
40134
  }
39881
40135
  ),
39882
- quiet.enabled && /* @__PURE__ */ jsxs159("div", { className: "ods-rule-editor__quiet", children: [
39883
- /* @__PURE__ */ jsx167(
40136
+ quiet.enabled && /* @__PURE__ */ jsxs160("div", { className: "ods-rule-editor__quiet", children: [
40137
+ /* @__PURE__ */ jsx168(
39884
40138
  TimePicker,
39885
40139
  {
39886
40140
  label: "From",
@@ -39891,7 +40145,7 @@ function NotificationRuleEditor({
39891
40145
  disabled: readOnly
39892
40146
  }
39893
40147
  ),
39894
- /* @__PURE__ */ jsx167(
40148
+ /* @__PURE__ */ jsx168(
39895
40149
  TimePicker,
39896
40150
  {
39897
40151
  label: "Until",
@@ -39902,7 +40156,7 @@ function NotificationRuleEditor({
39902
40156
  disabled: readOnly
39903
40157
  }
39904
40158
  ),
39905
- /* @__PURE__ */ jsx167(
40159
+ /* @__PURE__ */ jsx168(
39906
40160
  TimezonePicker,
39907
40161
  {
39908
40162
  label: "Timezone",
@@ -39912,7 +40166,7 @@ function NotificationRuleEditor({
39912
40166
  disabled: readOnly
39913
40167
  }
39914
40168
  ),
39915
- /* @__PURE__ */ jsx167(
40169
+ /* @__PURE__ */ jsx168(
39916
40170
  MultiSelect,
39917
40171
  {
39918
40172
  label: "Days",
@@ -39926,8 +40180,8 @@ function NotificationRuleEditor({
39926
40180
  }
39927
40181
  )
39928
40182
  ] }),
39929
- /* @__PURE__ */ jsx167("div", { className: "ods-rule-editor__subhead", children: "Minimum severity" }),
39930
- /* @__PURE__ */ jsx167(
40183
+ /* @__PURE__ */ jsx168("div", { className: "ods-rule-editor__subhead", children: "Minimum severity" }),
40184
+ /* @__PURE__ */ jsx168(
39931
40185
  SegmentedControl,
39932
40186
  {
39933
40187
  "aria-label": "Minimum severity",
@@ -39941,8 +40195,8 @@ function NotificationRuleEditor({
39941
40195
  ] })
39942
40196
  }
39943
40197
  ),
39944
- showFooter && /* @__PURE__ */ jsxs159("footer", { className: "ods-rule-editor__footer", children: [
39945
- /* @__PURE__ */ jsx167(
40198
+ showFooter && /* @__PURE__ */ jsxs160("footer", { className: "ods-rule-editor__footer", children: [
40199
+ /* @__PURE__ */ jsx168(
39946
40200
  Switch,
39947
40201
  {
39948
40202
  size: "sm",
@@ -39952,9 +40206,9 @@ function NotificationRuleEditor({
39952
40206
  disabled: readOnly
39953
40207
  }
39954
40208
  ),
39955
- /* @__PURE__ */ jsx167("span", { className: "ods-rule-editor__spacer" }),
39956
- onCancel && /* @__PURE__ */ jsx167(Button, { variant: "ghost", onClick: onCancel, disabled: saving, children: "Cancel" }),
39957
- onSave && /* @__PURE__ */ jsx167(Button, { variant: "primary", onClick: onSave, loading: saving, disabled: !canSave, children: value.id ? "Save rule" : "Create rule" })
40209
+ /* @__PURE__ */ jsx168("span", { className: "ods-rule-editor__spacer" }),
40210
+ onCancel && /* @__PURE__ */ jsx168(Button, { variant: "ghost", onClick: onCancel, disabled: saving, children: "Cancel" }),
40211
+ onSave && /* @__PURE__ */ jsx168(Button, { variant: "primary", onClick: onSave, loading: saving, disabled: !canSave, children: value.id ? "Save rule" : "Create rule" })
39958
40212
  ] })
39959
40213
  ] });
39960
40214
  }
@@ -39962,7 +40216,7 @@ NotificationRuleEditor.displayName = "NotificationRuleEditor";
39962
40216
 
39963
40217
  // src/notifications/components/NotificationRuleList/NotificationRuleList.tsx
39964
40218
  import { AddIcon as AddIcon9, CopyIcon as CopyIcon6, EditIcon as EditIcon2, RuleIcon as RuleIcon2, TrashCanIcon as TrashCanIcon4 } from "@octaviaflow/icons";
39965
- import { Fragment as Fragment69, jsx as jsx168, jsxs as jsxs160 } from "react/jsx-runtime";
40219
+ import { Fragment as Fragment69, jsx as jsx169, jsxs as jsxs161 } from "react/jsx-runtime";
39966
40220
  function NotificationRuleList({
39967
40221
  rules,
39968
40222
  catalog,
@@ -39980,61 +40234,61 @@ function NotificationRuleList({
39980
40234
  className
39981
40235
  }) {
39982
40236
  const canCreate = Boolean(onCreate) && !readOnly;
39983
- return /* @__PURE__ */ jsxs160("section", { className: cn("ods-rule-list", className), "aria-label": "Notification rules", children: [
39984
- /* @__PURE__ */ jsxs160("header", { className: "ods-rule-list__head", children: [
39985
- /* @__PURE__ */ jsxs160("h3", { className: "ods-rule-list__title", children: [
40237
+ return /* @__PURE__ */ jsxs161("section", { className: cn("ods-rule-list", className), "aria-label": "Notification rules", children: [
40238
+ /* @__PURE__ */ jsxs161("header", { className: "ods-rule-list__head", children: [
40239
+ /* @__PURE__ */ jsxs161("h3", { className: "ods-rule-list__title", children: [
39986
40240
  title,
39987
- /* @__PURE__ */ jsx168("span", { className: "ods-rule-list__count", children: rules.length })
40241
+ /* @__PURE__ */ jsx169("span", { className: "ods-rule-list__count", children: rules.length })
39988
40242
  ] }),
39989
- canCreate && rules.length > 0 && /* @__PURE__ */ jsx168(
40243
+ canCreate && rules.length > 0 && /* @__PURE__ */ jsx169(
39990
40244
  Button,
39991
40245
  {
39992
40246
  size: "sm",
39993
40247
  variant: "secondary",
39994
- leftIcon: /* @__PURE__ */ jsx168(AddIcon9, { size: "sm", "aria-hidden": "true" }),
40248
+ leftIcon: /* @__PURE__ */ jsx169(AddIcon9, { size: "sm", "aria-hidden": "true" }),
39995
40249
  onClick: onCreate,
39996
40250
  children: "New rule"
39997
40251
  }
39998
40252
  )
39999
40253
  ] }),
40000
- rules.length === 0 ? /* @__PURE__ */ jsxs160(Fragment69, { children: [
40001
- /* @__PURE__ */ jsx168(
40254
+ rules.length === 0 ? /* @__PURE__ */ jsxs161(Fragment69, { children: [
40255
+ /* @__PURE__ */ jsx169(
40002
40256
  EmptyState,
40003
40257
  {
40004
- icon: /* @__PURE__ */ jsx168(RuleIcon2, { "aria-hidden": "true" }),
40258
+ icon: /* @__PURE__ */ jsx169(RuleIcon2, { "aria-hidden": "true" }),
40005
40259
  title: "No rules yet",
40006
40260
  description: "Rules route events to shared channels \u2014 a Slack channel, an ops mailbox, a webhook \u2014 with thresholds and timing you choose. Everyone still gets their personal inbox and email without a rule.",
40007
- action: canCreate ? /* @__PURE__ */ jsx168(
40261
+ action: canCreate ? /* @__PURE__ */ jsx169(
40008
40262
  Button,
40009
40263
  {
40010
40264
  variant: "primary",
40011
- leftIcon: /* @__PURE__ */ jsx168(AddIcon9, { size: "sm", "aria-hidden": "true" }),
40265
+ leftIcon: /* @__PURE__ */ jsx169(AddIcon9, { size: "sm", "aria-hidden": "true" }),
40012
40266
  onClick: onCreate,
40013
40267
  children: "New rule"
40014
40268
  }
40015
40269
  ) : void 0
40016
40270
  }
40017
40271
  ),
40018
- starters && starters.length > 0 && !readOnly && onStarter && /* @__PURE__ */ jsx168("div", { className: "ods-rule-list__starters", children: starters.map((s) => /* @__PURE__ */ jsxs160(
40272
+ starters && starters.length > 0 && !readOnly && onStarter && /* @__PURE__ */ jsx169("div", { className: "ods-rule-list__starters", children: starters.map((s) => /* @__PURE__ */ jsxs161(
40019
40273
  "button",
40020
40274
  {
40021
40275
  type: "button",
40022
40276
  className: "ods-rule-list__starter",
40023
40277
  onClick: () => onStarter(s),
40024
40278
  children: [
40025
- /* @__PURE__ */ jsx168("span", { className: "ods-rule-list__starter-title", children: s.title }),
40026
- s.description && /* @__PURE__ */ jsx168("span", { className: "ods-rule-list__starter-desc", children: s.description })
40279
+ /* @__PURE__ */ jsx169("span", { className: "ods-rule-list__starter-title", children: s.title }),
40280
+ s.description && /* @__PURE__ */ jsx169("span", { className: "ods-rule-list__starter-desc", children: s.description })
40027
40281
  ]
40028
40282
  },
40029
40283
  s.id
40030
40284
  )) })
40031
- ] }) : /* @__PURE__ */ jsx168("ul", { className: "ods-rule-list__rows", children: rules.map((rule) => {
40285
+ ] }) : /* @__PURE__ */ jsx169("ul", { className: "ods-rule-list__rows", children: rules.map((rule) => {
40032
40286
  const last = formatRelativeTime(
40033
40287
  rule.lastFiredAt ? new Date(rule.lastFiredAt) : null,
40034
40288
  now2
40035
40289
  );
40036
40290
  const ruleChannels = rule.channelIds.map((id) => channels.find((c) => c.id === id)).filter((c) => Boolean(c));
40037
- return /* @__PURE__ */ jsxs160(
40291
+ return /* @__PURE__ */ jsxs161(
40038
40292
  "li",
40039
40293
  {
40040
40294
  className: cn(
@@ -40042,7 +40296,7 @@ function NotificationRuleList({
40042
40296
  !rule.enabled && "ods-rule-list__row--disabled"
40043
40297
  ),
40044
40298
  children: [
40045
- /* @__PURE__ */ jsx168("div", { className: "ods-rule-list__switch", children: /* @__PURE__ */ jsx168(
40299
+ /* @__PURE__ */ jsx169("div", { className: "ods-rule-list__switch", children: /* @__PURE__ */ jsx169(
40046
40300
  Switch,
40047
40301
  {
40048
40302
  size: "sm",
@@ -40052,43 +40306,43 @@ function NotificationRuleList({
40052
40306
  "aria-label": `${rule.enabled ? "Disable" : "Enable"} ${rule.name || "rule"}`
40053
40307
  }
40054
40308
  ) }),
40055
- /* @__PURE__ */ jsxs160("div", { className: "ods-rule-list__body", children: [
40056
- /* @__PURE__ */ jsx168("div", { className: "ods-rule-list__name", children: rule.name || "Untitled rule" }),
40057
- /* @__PURE__ */ jsx168("div", { className: "ods-rule-list__sentence", children: describeRule(rule, catalog, channels) }),
40058
- /* @__PURE__ */ jsxs160("div", { className: "ods-rule-list__meta", children: [
40059
- ruleChannels.map((c) => /* @__PURE__ */ jsx168(Chip, { size: "sm", icon: CHANNEL_TYPE_META[c.type].icon, children: c.label }, c.id)),
40060
- /* @__PURE__ */ jsx168("span", { children: last ? `Last fired ${last}` : "Never fired" })
40309
+ /* @__PURE__ */ jsxs161("div", { className: "ods-rule-list__body", children: [
40310
+ /* @__PURE__ */ jsx169("div", { className: "ods-rule-list__name", children: rule.name || "Untitled rule" }),
40311
+ /* @__PURE__ */ jsx169("div", { className: "ods-rule-list__sentence", children: describeRule(rule, catalog, channels) }),
40312
+ /* @__PURE__ */ jsxs161("div", { className: "ods-rule-list__meta", children: [
40313
+ ruleChannels.map((c) => /* @__PURE__ */ jsx169(Chip, { size: "sm", icon: CHANNEL_TYPE_META[c.type].icon, children: c.label }, c.id)),
40314
+ /* @__PURE__ */ jsx169("span", { children: last ? `Last fired ${last}` : "Never fired" })
40061
40315
  ] })
40062
40316
  ] }),
40063
- !readOnly && /* @__PURE__ */ jsxs160("div", { className: "ods-rule-list__actions", children: [
40064
- onEdit && /* @__PURE__ */ jsx168(
40317
+ !readOnly && /* @__PURE__ */ jsxs161("div", { className: "ods-rule-list__actions", children: [
40318
+ onEdit && /* @__PURE__ */ jsx169(
40065
40319
  Button,
40066
40320
  {
40067
40321
  size: "sm",
40068
40322
  variant: "ghost",
40069
40323
  "aria-label": `Edit ${rule.name || "rule"}`,
40070
40324
  onClick: () => onEdit(rule),
40071
- children: /* @__PURE__ */ jsx168(EditIcon2, { size: "sm", "aria-hidden": "true" })
40325
+ children: /* @__PURE__ */ jsx169(EditIcon2, { size: "sm", "aria-hidden": "true" })
40072
40326
  }
40073
40327
  ),
40074
- onDuplicate && /* @__PURE__ */ jsx168(
40328
+ onDuplicate && /* @__PURE__ */ jsx169(
40075
40329
  Button,
40076
40330
  {
40077
40331
  size: "sm",
40078
40332
  variant: "ghost",
40079
40333
  "aria-label": `Duplicate ${rule.name || "rule"}`,
40080
40334
  onClick: () => onDuplicate(rule),
40081
- children: /* @__PURE__ */ jsx168(CopyIcon6, { size: "sm", "aria-hidden": "true" })
40335
+ children: /* @__PURE__ */ jsx169(CopyIcon6, { size: "sm", "aria-hidden": "true" })
40082
40336
  }
40083
40337
  ),
40084
- onDelete && /* @__PURE__ */ jsx168(
40338
+ onDelete && /* @__PURE__ */ jsx169(
40085
40339
  Button,
40086
40340
  {
40087
40341
  size: "sm",
40088
40342
  variant: "ghost",
40089
40343
  "aria-label": `Delete ${rule.name || "rule"}`,
40090
40344
  onClick: () => onDelete(rule),
40091
- children: /* @__PURE__ */ jsx168(TrashCanIcon4, { size: "sm", "aria-hidden": "true" })
40345
+ children: /* @__PURE__ */ jsx169(TrashCanIcon4, { size: "sm", "aria-hidden": "true" })
40092
40346
  }
40093
40347
  )
40094
40348
  ] })
@@ -40188,6 +40442,7 @@ export {
40188
40442
  EmptyState,
40189
40443
  EventCatalogPicker,
40190
40444
  ExecutionConsole,
40445
+ ExpressionField,
40191
40446
  FeatureCard,
40192
40447
  FieldPicker,
40193
40448
  FileBrowser,
@@ -40395,6 +40650,7 @@ export {
40395
40650
  googleChatAdapter,
40396
40651
  gradient,
40397
40652
  groupInboxByDay,
40653
+ insideCallArguments,
40398
40654
  isArchived,
40399
40655
  isChannelDraftComplete,
40400
40656
  isPreferenceEnabled,
@@ -40412,6 +40668,7 @@ export {
40412
40668
  sanitizeImageUrl,
40413
40669
  setCategoryPreference,
40414
40670
  setPreference,
40671
+ shortReferenceLabel,
40415
40672
  slackAdapter,
40416
40673
  suggestChannelLabel,
40417
40674
  teamsAdapter,