@xyne/workflow-ui 1.3.34 → 1.3.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/dist/components/builder/v3/WorkflowBuilderV3.d.ts +10 -1
  2. package/dist/components/builder/v3/WorkflowBuilderV3.d.ts.map +1 -1
  3. package/dist/components/builder/v3/WorkflowBuilderV3.js +8 -1
  4. package/dist/components/builder/v3/WorkflowBuilderV3.js.map +1 -1
  5. package/dist/components/dashboard/WorkflowDashboard.d.ts +3 -1
  6. package/dist/components/dashboard/WorkflowDashboard.d.ts.map +1 -1
  7. package/dist/components/dashboard/WorkflowDashboard.js +2 -2
  8. package/dist/components/dashboard/WorkflowDashboard.js.map +1 -1
  9. package/dist/components/provider/WorkflowUIProvider.d.ts +1 -1
  10. package/dist/components/provider/WorkflowUIProvider.d.ts.map +1 -1
  11. package/dist/components/provider/WorkflowUIProvider.js +2 -2
  12. package/dist/components/provider/WorkflowUIProvider.js.map +1 -1
  13. package/dist/components/provider/workflow-ui-context.d.ts +11 -0
  14. package/dist/components/provider/workflow-ui-context.d.ts.map +1 -1
  15. package/dist/components/provider/workflow-ui-context.js.map +1 -1
  16. package/dist/components/workflows/WorkflowApp.d.ts +6 -1
  17. package/dist/components/workflows/WorkflowApp.d.ts.map +1 -1
  18. package/dist/components/workflows/WorkflowApp.js +3 -3
  19. package/dist/components/workflows/WorkflowApp.js.map +1 -1
  20. package/dist/components/workflows/WorkflowHome.d.ts +10 -1
  21. package/dist/components/workflows/WorkflowHome.d.ts.map +1 -1
  22. package/dist/components/workflows/WorkflowHome.js +8 -8
  23. package/dist/components/workflows/WorkflowHome.js.map +1 -1
  24. package/package.json +1 -1
  25. package/dist/components/builder/AddStepButton.d.ts +0 -6
  26. package/dist/components/builder/AddStepButton.d.ts.map +0 -1
  27. package/dist/components/builder/AddStepButton.js +0 -7
  28. package/dist/components/builder/AddStepButton.js.map +0 -1
  29. package/dist/components/builder/BranchEdge.d.ts +0 -3
  30. package/dist/components/builder/BranchEdge.d.ts.map +0 -1
  31. package/dist/components/builder/BranchEdge.js +0 -19
  32. package/dist/components/builder/BranchEdge.js.map +0 -1
  33. package/dist/components/builder/BuilderToolbar.d.ts +0 -10
  34. package/dist/components/builder/BuilderToolbar.d.ts.map +0 -1
  35. package/dist/components/builder/BuilderToolbar.js +0 -16
  36. package/dist/components/builder/BuilderToolbar.js.map +0 -1
  37. package/dist/components/builder/StepConfigDrawer.d.ts +0 -11
  38. package/dist/components/builder/StepConfigDrawer.d.ts.map +0 -1
  39. package/dist/components/builder/StepConfigDrawer.js +0 -21
  40. package/dist/components/builder/StepConfigDrawer.js.map +0 -1
  41. package/dist/components/builder/StepNode.d.ts +0 -15
  42. package/dist/components/builder/StepNode.d.ts.map +0 -1
  43. package/dist/components/builder/StepNode.js +0 -56
  44. package/dist/components/builder/StepNode.js.map +0 -1
  45. package/dist/components/builder/StepPalette.d.ts +0 -7
  46. package/dist/components/builder/StepPalette.d.ts.map +0 -1
  47. package/dist/components/builder/StepPalette.js +0 -83
  48. package/dist/components/builder/StepPalette.js.map +0 -1
  49. package/dist/components/builder/StepPicker.d.ts +0 -9
  50. package/dist/components/builder/StepPicker.d.ts.map +0 -1
  51. package/dist/components/builder/StepPicker.js +0 -95
  52. package/dist/components/builder/StepPicker.js.map +0 -1
  53. package/dist/components/builder/TriggerConfigPanel.d.ts +0 -10
  54. package/dist/components/builder/TriggerConfigPanel.d.ts.map +0 -1
  55. package/dist/components/builder/TriggerConfigPanel.js +0 -49
  56. package/dist/components/builder/TriggerConfigPanel.js.map +0 -1
  57. package/dist/components/builder/TriggerNode.d.ts +0 -9
  58. package/dist/components/builder/TriggerNode.d.ts.map +0 -1
  59. package/dist/components/builder/TriggerNode.js +0 -30
  60. package/dist/components/builder/TriggerNode.js.map +0 -1
  61. package/dist/components/builder/TriggerPicker.d.ts +0 -8
  62. package/dist/components/builder/TriggerPicker.d.ts.map +0 -1
  63. package/dist/components/builder/TriggerPicker.js +0 -61
  64. package/dist/components/builder/TriggerPicker.js.map +0 -1
  65. package/dist/components/builder/WorkflowBuilder.d.ts +0 -20
  66. package/dist/components/builder/WorkflowBuilder.d.ts.map +0 -1
  67. package/dist/components/builder/WorkflowBuilder.js +0 -157
  68. package/dist/components/builder/WorkflowBuilder.js.map +0 -1
  69. package/dist/components/builder/edge-types.d.ts +0 -3
  70. package/dist/components/builder/edge-types.d.ts.map +0 -1
  71. package/dist/components/builder/edge-types.js +0 -5
  72. package/dist/components/builder/edge-types.js.map +0 -1
  73. package/dist/components/builder/node-types.d.ts +0 -3
  74. package/dist/components/builder/node-types.d.ts.map +0 -1
  75. package/dist/components/builder/node-types.js +0 -11
  76. package/dist/components/builder/node-types.js.map +0 -1
  77. package/dist/components/builder/v2/AddStepButton.d.ts +0 -6
  78. package/dist/components/builder/v2/AddStepButton.d.ts.map +0 -1
  79. package/dist/components/builder/v2/AddStepButton.js +0 -6
  80. package/dist/components/builder/v2/AddStepButton.js.map +0 -1
  81. package/dist/components/builder/v2/BranchEdge.d.ts +0 -3
  82. package/dist/components/builder/v2/BranchEdge.d.ts.map +0 -1
  83. package/dist/components/builder/v2/BranchEdge.js +0 -46
  84. package/dist/components/builder/v2/BranchEdge.js.map +0 -1
  85. package/dist/components/builder/v2/LoopBodyEdge.d.ts +0 -7
  86. package/dist/components/builder/v2/LoopBodyEdge.d.ts.map +0 -1
  87. package/dist/components/builder/v2/LoopBodyEdge.js +0 -19
  88. package/dist/components/builder/v2/LoopBodyEdge.js.map +0 -1
  89. package/dist/components/builder/v2/LoopbackEdge.d.ts +0 -10
  90. package/dist/components/builder/v2/LoopbackEdge.d.ts.map +0 -1
  91. package/dist/components/builder/v2/LoopbackEdge.js +0 -26
  92. package/dist/components/builder/v2/LoopbackEdge.js.map +0 -1
  93. package/dist/components/builder/v2/StepNode.d.ts +0 -21
  94. package/dist/components/builder/v2/StepNode.d.ts.map +0 -1
  95. package/dist/components/builder/v2/StepNode.js +0 -36
  96. package/dist/components/builder/v2/StepNode.js.map +0 -1
  97. package/dist/components/builder/v2/StepPicker.d.ts +0 -8
  98. package/dist/components/builder/v2/StepPicker.d.ts.map +0 -1
  99. package/dist/components/builder/v2/StepPicker.js +0 -73
  100. package/dist/components/builder/v2/StepPicker.js.map +0 -1
  101. package/dist/components/builder/v2/TerminalNode.d.ts +0 -6
  102. package/dist/components/builder/v2/TerminalNode.d.ts.map +0 -1
  103. package/dist/components/builder/v2/TerminalNode.js +0 -7
  104. package/dist/components/builder/v2/TerminalNode.js.map +0 -1
  105. package/dist/components/builder/v2/TriggerNode.d.ts +0 -10
  106. package/dist/components/builder/v2/TriggerNode.d.ts.map +0 -1
  107. package/dist/components/builder/v2/TriggerNode.js +0 -20
  108. package/dist/components/builder/v2/TriggerNode.js.map +0 -1
  109. package/dist/components/builder/v2/TriggerPicker.d.ts +0 -7
  110. package/dist/components/builder/v2/TriggerPicker.d.ts.map +0 -1
  111. package/dist/components/builder/v2/TriggerPicker.js +0 -45
  112. package/dist/components/builder/v2/TriggerPicker.js.map +0 -1
  113. package/dist/components/builder/v2/WorkflowBuilder.d.ts +0 -14
  114. package/dist/components/builder/v2/WorkflowBuilder.d.ts.map +0 -1
  115. package/dist/components/builder/v2/WorkflowBuilder.js +0 -189
  116. package/dist/components/builder/v2/WorkflowBuilder.js.map +0 -1
  117. package/dist/components/builder/v2/edge-types.d.ts +0 -3
  118. package/dist/components/builder/v2/edge-types.d.ts.map +0 -1
  119. package/dist/components/builder/v2/edge-types.js +0 -9
  120. package/dist/components/builder/v2/edge-types.js.map +0 -1
  121. package/dist/components/builder/v2/icons.d.ts +0 -25
  122. package/dist/components/builder/v2/icons.d.ts.map +0 -1
  123. package/dist/components/builder/v2/icons.js +0 -43
  124. package/dist/components/builder/v2/icons.js.map +0 -1
  125. package/dist/components/builder/v2/layout-engine.d.ts +0 -76
  126. package/dist/components/builder/v2/layout-engine.d.ts.map +0 -1
  127. package/dist/components/builder/v2/layout-engine.js +0 -465
  128. package/dist/components/builder/v2/layout-engine.js.map +0 -1
  129. package/dist/components/builder/v2/node-types.d.ts +0 -3
  130. package/dist/components/builder/v2/node-types.d.ts.map +0 -1
  131. package/dist/components/builder/v2/node-types.js +0 -11
  132. package/dist/components/builder/v2/node-types.js.map +0 -1
  133. package/dist/components/builder/v2/theme.d.ts +0 -28
  134. package/dist/components/builder/v2/theme.d.ts.map +0 -1
  135. package/dist/components/builder/v2/theme.js +0 -63
  136. package/dist/components/builder/v2/theme.js.map +0 -1
  137. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts +0 -11
  138. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts.map +0 -1
  139. package/dist/components/dashboard/WorkflowSummaryEditor.js +0 -46
  140. package/dist/components/dashboard/WorkflowSummaryEditor.js.map +0 -1
  141. package/dist/components/execution/ExecutionEdge.d.ts +0 -4
  142. package/dist/components/execution/ExecutionEdge.d.ts.map +0 -1
  143. package/dist/components/execution/ExecutionEdge.js +0 -27
  144. package/dist/components/execution/ExecutionEdge.js.map +0 -1
  145. package/dist/components/execution/ExecutionJourney.d.ts +0 -24
  146. package/dist/components/execution/ExecutionJourney.d.ts.map +0 -1
  147. package/dist/components/execution/ExecutionJourney.js +0 -268
  148. package/dist/components/execution/ExecutionJourney.js.map +0 -1
  149. package/dist/components/execution/ExecutionStepNode.d.ts +0 -14
  150. package/dist/components/execution/ExecutionStepNode.d.ts.map +0 -1
  151. package/dist/components/execution/ExecutionStepNode.js +0 -47
  152. package/dist/components/execution/ExecutionStepNode.js.map +0 -1
  153. package/dist/components/execution/ExecutionTriggerNode.d.ts +0 -9
  154. package/dist/components/execution/ExecutionTriggerNode.d.ts.map +0 -1
  155. package/dist/components/execution/ExecutionTriggerNode.js +0 -15
  156. package/dist/components/execution/ExecutionTriggerNode.js.map +0 -1
  157. package/dist/components/execution/StepAgentPanels.d.ts +0 -9
  158. package/dist/components/execution/StepAgentPanels.d.ts.map +0 -1
  159. package/dist/components/execution/StepAgentPanels.js +0 -133
  160. package/dist/components/execution/StepAgentPanels.js.map +0 -1
  161. package/dist/components/execution/execution-layout.d.ts +0 -31
  162. package/dist/components/execution/execution-layout.d.ts.map +0 -1
  163. package/dist/components/execution/execution-layout.js +0 -90
  164. package/dist/components/execution/execution-layout.js.map +0 -1
  165. package/dist/components/shared/JsonTreeViewer.d.ts +0 -9
  166. package/dist/components/shared/JsonTreeViewer.d.ts.map +0 -1
  167. package/dist/components/shared/JsonTreeViewer.js +0 -46
  168. package/dist/components/shared/JsonTreeViewer.js.map +0 -1
@@ -1,11 +0,0 @@
1
- import { StepNode } from './StepNode.js';
2
- import { TriggerNode } from './TriggerNode.js';
3
- import { AddStepButton } from './AddStepButton.js';
4
- import { TerminalNode } from './TerminalNode.js';
5
- export const v2NodeTypes = {
6
- step: StepNode,
7
- trigger: TriggerNode,
8
- addButton: AddStepButton,
9
- terminal: TerminalNode,
10
- };
11
- //# sourceMappingURL=node-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-types.js","sourceRoot":"","sources":["../../../../src/components/builder/v2/node-types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,WAAW;IACpB,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,YAAY;CACvB,CAAC"}
@@ -1,28 +0,0 @@
1
- /**
2
- * v2/theme — Centralized category theming.
3
- *
4
- * All visual styling for categories is derived from backend-provided category names.
5
- * The UI never hardcodes which step TYPE belongs to which category.
6
- */
7
- export interface CategoryTheme {
8
- /** Tailwind class for left accent border (e.g. "border-l-sky-400") */
9
- accent: string;
10
- /** Tailwind class for icon container background */
11
- iconBg: string;
12
- /** Tailwind class for icon container text color */
13
- iconText: string;
14
- /** Tailwind class for the category dot */
15
- dot: string;
16
- /** Tailwind class for light background (cards, picker hover) */
17
- lightBg: string;
18
- /** Tailwind class for selection ring */
19
- ring: string;
20
- /** CSS color value for edges/connectors */
21
- edgeColor: string;
22
- }
23
- /**
24
- * Get the visual theme for a category name (from backend StepSummary.category).
25
- * Falls back gracefully for unknown categories.
26
- */
27
- export declare function getCategoryTheme(category?: string): CategoryTheme;
28
- //# sourceMappingURL=theme.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../../src/components/builder/v2/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB;AAmDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAGjE"}
@@ -1,63 +0,0 @@
1
- /**
2
- * v2/theme — Centralized category theming.
3
- *
4
- * All visual styling for categories is derived from backend-provided category names.
5
- * The UI never hardcodes which step TYPE belongs to which category.
6
- */
7
- const CATEGORY_THEMES = {
8
- data: {
9
- accent: 'border-l-sky-400',
10
- iconBg: 'bg-sky-50',
11
- iconText: 'text-sky-600',
12
- dot: 'bg-sky-400',
13
- lightBg: 'bg-sky-50/50',
14
- ring: 'ring-sky-200 border-sky-300',
15
- edgeColor: '#38bdf8',
16
- },
17
- integration: {
18
- accent: 'border-l-violet-400',
19
- iconBg: 'bg-violet-50',
20
- iconText: 'text-violet-600',
21
- dot: 'bg-violet-400',
22
- lightBg: 'bg-violet-50/50',
23
- ring: 'ring-violet-200 border-violet-300',
24
- edgeColor: '#a78bfa',
25
- },
26
- control: {
27
- accent: 'border-l-amber-400',
28
- iconBg: 'bg-amber-50',
29
- iconText: 'text-amber-600',
30
- dot: 'bg-amber-400',
31
- lightBg: 'bg-amber-50/50',
32
- ring: 'ring-amber-200 border-amber-300',
33
- edgeColor: '#fbbf24',
34
- },
35
- flow: {
36
- accent: 'border-l-teal-400',
37
- iconBg: 'bg-teal-50',
38
- iconText: 'text-teal-600',
39
- dot: 'bg-teal-400',
40
- lightBg: 'bg-teal-50/50',
41
- ring: 'ring-teal-200 border-teal-300',
42
- edgeColor: '#2dd4bf',
43
- },
44
- };
45
- const FALLBACK_THEME = {
46
- accent: 'border-l-slate-400',
47
- iconBg: 'bg-slate-100',
48
- iconText: 'text-slate-500',
49
- dot: 'bg-slate-400',
50
- lightBg: 'bg-slate-50/50',
51
- ring: 'ring-slate-200 border-slate-300',
52
- edgeColor: '#94a3b8',
53
- };
54
- /**
55
- * Get the visual theme for a category name (from backend StepSummary.category).
56
- * Falls back gracefully for unknown categories.
57
- */
58
- export function getCategoryTheme(category) {
59
- if (!category)
60
- return FALLBACK_THEME;
61
- return CATEGORY_THEMES[category.toLowerCase()] ?? FALLBACK_THEME;
62
- }
63
- //# sourceMappingURL=theme.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../../src/components/builder/v2/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,MAAM,eAAe,GAAkC;IACrD,IAAI,EAAE;QACJ,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,cAAc;QACxB,GAAG,EAAE,YAAY;QACjB,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,6BAA6B;QACnC,SAAS,EAAE,SAAS;KACrB;IACD,WAAW,EAAE;QACX,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,cAAc;QACtB,QAAQ,EAAE,iBAAiB;QAC3B,GAAG,EAAE,eAAe;QACpB,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,mCAAmC;QACzC,SAAS,EAAE,SAAS;KACrB;IACD,OAAO,EAAE;QACP,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,aAAa;QACrB,QAAQ,EAAE,gBAAgB;QAC1B,GAAG,EAAE,cAAc;QACnB,OAAO,EAAE,gBAAgB;QACzB,IAAI,EAAE,iCAAiC;QACvC,SAAS,EAAE,SAAS;KACrB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,eAAe;QACzB,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,eAAe;QACxB,IAAI,EAAE,+BAA+B;QACrC,SAAS,EAAE,SAAS;KACrB;CACF,CAAC;AAEF,MAAM,cAAc,GAAkB;IACpC,MAAM,EAAE,oBAAoB;IAC5B,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,gBAAgB;IAC1B,GAAG,EAAE,cAAc;IACnB,OAAO,EAAE,gBAAgB;IACzB,IAAI,EAAE,iCAAiC;IACvC,SAAS,EAAE,SAAS;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,cAAc,CAAC;IACrC,OAAO,eAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,cAAc,CAAC;AACnE,CAAC"}
@@ -1,11 +0,0 @@
1
- export interface WorkflowSummaryEditorProps {
2
- workflowId: string;
3
- className?: string | undefined;
4
- }
5
- /**
6
- * Edits the workflow-level summary/readme — a first-class record column,
7
- * independent of the builder config. Reads via `workflows.get`, saves via
8
- * `workflows.update({ summary })`.
9
- */
10
- export declare function WorkflowSummaryEditor({ workflowId, className }: WorkflowSummaryEditorProps): import("react").JSX.Element;
11
- //# sourceMappingURL=WorkflowSummaryEditor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkflowSummaryEditor.d.ts","sourceRoot":"","sources":["../../../src/components/dashboard/WorkflowSummaryEditor.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,0BAA0B,+BAgE1F"}
@@ -1,46 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
3
- import { useWorkflowClient } from '../../hooks/use-workflow-client.js';
4
- import { cn } from '../shared/cn.js';
5
- /**
6
- * Edits the workflow-level summary/readme — a first-class record column,
7
- * independent of the builder config. Reads via `workflows.get`, saves via
8
- * `workflows.update({ summary })`.
9
- */
10
- export function WorkflowSummaryEditor({ workflowId, className }) {
11
- const client = useWorkflowClient();
12
- const [summary, setSummary] = useState('');
13
- const [loaded, setLoaded] = useState(false);
14
- const [saving, setSaving] = useState(false);
15
- const [savedAt, setSavedAt] = useState(false);
16
- useEffect(() => {
17
- let cancelled = false;
18
- void (async () => {
19
- try {
20
- const wf = await client.workflows.get(workflowId);
21
- if (!cancelled) {
22
- setSummary(wf.summary ?? '');
23
- setLoaded(true);
24
- }
25
- }
26
- catch {
27
- if (!cancelled)
28
- setLoaded(true);
29
- }
30
- })();
31
- return () => { cancelled = true; };
32
- }, [client, workflowId]);
33
- const save = async () => {
34
- setSaving(true);
35
- setSavedAt(false);
36
- try {
37
- await client.workflows.update(workflowId, { summary });
38
- setSavedAt(true);
39
- }
40
- finally {
41
- setSaving(false);
42
- }
43
- };
44
- return (_jsxs("div", { className: cn('space-y-2', className), "data-testid": "workflow-summary-editor", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("label", { className: "text-[11px] font-bold uppercase tracking-widest text-slate-400", children: "Summary" }), _jsx("button", { type: "button", "data-testid": "summary-save", onClick: () => void save(), disabled: saving || !loaded, className: cn('rounded-md px-3 py-1 text-[12px] font-semibold text-white transition-colors', savedAt ? 'bg-emerald-500' : 'bg-indigo-500 hover:bg-indigo-600', (saving || !loaded) && 'opacity-50 cursor-not-allowed'), children: saving ? 'Saving…' : savedAt ? 'Saved' : 'Save summary' })] }), _jsx("textarea", { "data-testid": "summary-input", value: summary, onChange: (e) => { setSummary(e.target.value); setSavedAt(false); }, rows: 3, placeholder: "Describe what this workflow does\u2026", className: "w-full resize-y rounded-lg border border-slate-200 px-3 py-2 text-[13px] outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100" })] }));
45
- }
46
- //# sourceMappingURL=WorkflowSummaryEditor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkflowSummaryEditor.js","sourceRoot":"","sources":["../../../src/components/dashboard/WorkflowSummaryEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAOrC;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAE,UAAU,EAAE,SAAS,EAA8B;IACzF,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAClD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,UAAU,CAAE,EAAkC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC9D,SAAS,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,SAAS;oBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAEzB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACvD,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,iBAAc,yBAAyB,aAC/E,eAAK,SAAS,EAAC,mCAAmC,aAChD,gBAAO,SAAS,EAAC,gEAAgE,wBAEzE,EACR,iBACE,IAAI,EAAC,QAAQ,iBACD,cAAc,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAC1B,QAAQ,EAAE,MAAM,IAAI,CAAC,MAAM,EAC3B,SAAS,EAAE,EAAE,CACX,6EAA6E,EAC7E,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mCAAmC,EAChE,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,+BAA+B,CACvD,YAEA,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,GACjD,IACL,EACN,kCACc,eAAe,EAC3B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACnE,IAAI,EAAE,CAAC,EACP,WAAW,EAAC,wCAAmC,EAC/C,SAAS,EAAC,kJAAkJ,GAC5J,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -1,4 +0,0 @@
1
- import { type EdgeProps } from '@xyflow/react';
2
- export type ExecutionEdgeStatus = 'completed' | 'active' | 'pending' | 'skipped';
3
- export declare function ExecutionEdge({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data, style, }: EdgeProps): import("react").JSX.Element;
4
- //# sourceMappingURL=ExecutionEdge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExecutionEdge.d.ts","sourceRoot":"","sources":["../../../src/components/execution/ExecutionEdge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AASjF,wBAAgB,aAAa,CAAC,EAC5B,EAAE,EACF,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,cAAc,EACd,cAAc,EACd,IAAI,EACJ,KAAK,GACN,EAAE,SAAS,+BAyBX"}
@@ -1,27 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { BaseEdge, getBezierPath } from '@xyflow/react';
3
- const statusColors = {
4
- completed: 'var(--wui-status-completed)',
5
- active: 'var(--wui-status-running)',
6
- pending: 'var(--wui-border)',
7
- skipped: 'var(--wui-border)',
8
- };
9
- export function ExecutionEdge({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data, style, }) {
10
- const edgeStatus = data?.['status'] ?? 'pending';
11
- const [edgePath] = getBezierPath({
12
- sourceX,
13
- sourceY,
14
- sourcePosition,
15
- targetX,
16
- targetY,
17
- targetPosition,
18
- });
19
- return (_jsx(BaseEdge, { id: id, path: edgePath, style: {
20
- stroke: statusColors[edgeStatus],
21
- strokeWidth: edgeStatus === 'active' ? 2 : 1.5,
22
- strokeDasharray: edgeStatus === 'pending' || edgeStatus === 'skipped' ? '5 5' : undefined,
23
- opacity: edgeStatus === 'skipped' ? 0.3 : 1,
24
- ...style,
25
- } }));
26
- }
27
- //# sourceMappingURL=ExecutionEdge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExecutionEdge.js","sourceRoot":"","sources":["../../../src/components/execution/ExecutionEdge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAkB,MAAM,eAAe,CAAC;AAIxE,MAAM,YAAY,GAAwC;IACxD,SAAS,EAAE,6BAA6B;IACxC,MAAM,EAAE,2BAA2B;IACnC,OAAO,EAAE,mBAAmB;IAC5B,OAAO,EAAE,mBAAmB;CAC7B,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAC5B,EAAE,EACF,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,cAAc,EACd,cAAc,EACd,IAAI,EACJ,KAAK,GACK;IACV,MAAM,UAAU,GAAK,IAA4C,EAAE,CAAC,QAAQ,CAAqC,IAAI,SAAS,CAAC;IAE/H,MAAM,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;QAC/B,OAAO;QACP,OAAO;QACP,cAAc;QACd,OAAO;QACP,OAAO;QACP,cAAc;KACf,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,QAAQ,IACP,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE;YACL,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC;YAChC,WAAW,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;YAC9C,eAAe,EAAE,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACzF,OAAO,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3C,GAAG,KAAK;SACT,GACD,CACH,CAAC;AACJ,CAAC"}
@@ -1,24 +0,0 @@
1
- import type { WorkflowStepConfig, StepGroup } from '@xyne/workflow-sdk/builder';
2
- import type { StepMeta } from '../../hooks/use-step-metadata.js';
3
- import type { StepExecutionState } from '../../utils/step-state.js';
4
- import type { ExecutionDetail } from '@xyne/workflow-sdk/client';
5
- export interface ExecutionJourneyProps {
6
- steps: WorkflowStepConfig[];
7
- stepMeta: Map<string, StepMeta>;
8
- stepStates: Map<string, StepExecutionState>;
9
- /** Raw execution records — used to enumerate MAP/LOOP runtime iterations. */
10
- executionSteps?: ExecutionDetail['steps'] | undefined;
11
- groups?: StepGroup[] | undefined;
12
- selectedStepId: string | null;
13
- onStepClick: (stepId: string) => void;
14
- selectedStepState?: StepExecutionState | undefined;
15
- selectedStepTitle?: string | undefined;
16
- selectedStepDescription?: string | undefined;
17
- triggerLabel: string;
18
- triggerIconName?: string | undefined;
19
- triggerCompleted: boolean;
20
- isTriggerSelected: boolean;
21
- onTriggerClick: () => void;
22
- }
23
- export declare function ExecutionJourney({ steps, stepMeta, stepStates, executionSteps, groups, selectedStepId, onStepClick, selectedStepState, selectedStepTitle, selectedStepDescription, triggerLabel, triggerIconName, triggerCompleted, isTriggerSelected, onTriggerClick, }: ExecutionJourneyProps): import("react").JSX.Element;
24
- //# sourceMappingURL=ExecutionJourney.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExecutionJourney.d.ts","sourceRoot":"","sources":["../../../src/components/execution/ExecutionJourney.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAsejE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,6EAA6E;IAC7E,cAAc,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IACtD,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,iBAAiB,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACnD,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,uBAAuB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAChF,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAC7D,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,GACnF,EAAE,qBAAqB,+BA+KvB"}
@@ -1,268 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useMemo, useRef, useState } from 'react';
3
- import { getStepIcon } from '../builder/icons.js';
4
- import { StatusBadge } from '../shared/StatusBadge.js';
5
- import { DisplayValue, isAttachment, isAttachmentArray } from '../shared/AttachmentCard.js';
6
- import { ReviewDisplay } from './ApprovalReviewDisplay.js';
7
- import { PauseFormRenderer } from './PauseFormRenderer.js';
8
- import { MarkdownView } from '../shared/MarkdownView.js';
9
- import { cn } from '../shared/cn.js';
10
- import { rollup, resolveLevel, buildRows, findLivePath, tallyLeaves, } from './journey-model.js';
11
- /**
12
- * Journey mode — a banker-friendly master-detail alternative to the graph: a
13
- * left sidebar lists the executed path (StepGroups + control-flow constructs
14
- * collapse into folders you drill into), the right pane shows the selected
15
- * step's input/output. Hierarchy is resolved from the config by id each render
16
- * (so it survives the viewer's status re-fetch), never from the flat step rows.
17
- */
18
- // ─── Status presentation ───
19
- const CHECK = (_jsx("svg", { width: "9", height: "9", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "4", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }));
20
- const CROSS = (_jsxs("svg", { width: "9", height: "9", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "4", strokeLinecap: "round", children: [_jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), _jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }));
21
- const PLAY = (_jsx("svg", { width: "9", height: "9", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("polygon", { points: "6 4 20 12 6 20 6 4" }) }));
22
- const PAUSE = (_jsxs("svg", { width: "9", height: "9", viewBox: "0 0 24 24", fill: "currentColor", children: [_jsx("rect", { x: "6", y: "4", width: "4", height: "16", rx: "1" }), _jsx("rect", { x: "14", y: "4", width: "4", height: "16", rx: "1" })] }));
23
- const DASH = (_jsx("svg", { width: "9", height: "9", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", children: _jsx("path", { d: "M5 12h14" }) }));
24
- const STATUS_STYLE = {
25
- completed: { dot: 'var(--wui-status-completed)', fg: '#fff', icon: CHECK },
26
- failed: { dot: 'var(--wui-status-failed)', fg: '#fff', icon: CROSS },
27
- running: { dot: '#3b82f6', fg: '#fff', icon: PLAY, pulse: true },
28
- paused: { dot: 'var(--wui-status-paused)', fg: '#fff', icon: PAUSE },
29
- skipped: { dot: 'var(--wui-bg-muted)', fg: 'var(--wui-fg-muted)', icon: DASH },
30
- pending: { dot: 'transparent', fg: 'var(--wui-fg-muted)', icon: null },
31
- };
32
- function StatusDot({ status, size = 22 }) {
33
- const s = STATUS_STYLE[status];
34
- return (_jsx("span", { className: cn('flex shrink-0 items-center justify-center rounded-full', s.pulse && 'animate-pulse'), style: {
35
- width: size,
36
- height: size,
37
- backgroundColor: s.dot,
38
- color: s.fg,
39
- border: status === 'pending' ? '1.5px solid var(--wui-border-strong)' : 'none',
40
- }, children: s.icon }));
41
- }
42
- // ─── Icons for folders / drill ───
43
- const FOLDER = (_jsx("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z" }) }));
44
- const BRANCH = (_jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("line", { x1: "6", y1: "3", x2: "6", y2: "15" }), _jsx("circle", { cx: "18", cy: "6", r: "3" }), _jsx("circle", { cx: "6", cy: "18", r: "3" }), _jsx("path", { d: "M18 9a9 9 0 0 1-9 9" })] }));
45
- const LOOP = (_jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "m17 2 4 4-4 4" }), _jsx("path", { d: "M3 11v-1a4 4 0 0 1 4-4h14" }), _jsx("path", { d: "m7 22-4-4 4-4" }), _jsx("path", { d: "M21 13v1a4 4 0 0 1-4 4H3" })] }));
46
- const LAYERS = (_jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("polygon", { points: "12 2 2 7 12 12 22 7 12 2" }), _jsx("polyline", { points: "2 17 12 22 22 17" }), _jsx("polyline", { points: "2 12 12 17 22 12" })] }));
47
- const CHEVRON = (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "9 18 15 12 9 6" }) }));
48
- const BOLT = (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polygon", { points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2" }) }));
49
- const plural = (n) => `${String(n)} ${n === 1 ? 'step' : 'steps'}`;
50
- // ─── Sidebar row ───
51
- function SidebarRow({ status, icon, label, meta, drillable, active, onClick, }) {
52
- return (_jsxs("button", { type: "button", onClick: onClick, title: label, className: cn('group flex w-full items-center gap-2.5 rounded-[var(--wui-radius)] px-2.5 py-2 text-left transition-colors', active
53
- ? 'bg-[color-mix(in_srgb,var(--wui-primary)_12%,transparent)] font-medium text-[var(--wui-primary)]'
54
- : 'text-[var(--wui-fg)] hover:bg-[var(--wui-bg-subtle)]', status === 'skipped' && !active && 'opacity-55'), children: [_jsx(StatusDot, { status: status, size: 18 }), _jsx("span", { className: cn('flex h-[18px] w-[18px] shrink-0 items-center justify-center', !active && 'text-[var(--wui-fg-muted)]'), children: icon }), _jsx("span", { className: "min-w-0 flex-1 truncate text-[13px]", children: label }), meta && _jsx("span", { className: cn('shrink-0 text-[10.5px]', active ? 'text-[var(--wui-primary)]' : 'text-[var(--wui-fg-muted)]'), children: meta }), drillable && (_jsx("span", { className: cn('shrink-0 transition-transform group-hover:translate-x-0.5', active ? 'text-[var(--wui-primary)]' : 'text-[var(--wui-fg-muted)]'), children: CHEVRON }))] }));
55
- }
56
- // ─── Detail pane ───
57
- function NoData() {
58
- return _jsx("div", { className: "text-[12.5px] italic text-[var(--wui-fg-muted)]", children: "No data" });
59
- }
60
- /** A primitive value — long strings truncate with the full text on hover. */
61
- function PrimitiveValue({ value, className }) {
62
- if (value === null || value === undefined || value === '') {
63
- return _jsx("span", { className: "text-[13.5px] italic text-[var(--wui-fg-muted)]", children: "No value" });
64
- }
65
- // Same renderer the approval uses: strings → MarkdownView (in a show-more
66
- // Collapsible), scalars → formatted. Markdown + long text render correctly.
67
- return _jsx(DisplayValue, { value: value, className: cn('text-[14px] text-[var(--wui-fg)]', className), maxClass: "max-h-72" });
68
- }
69
- /**
70
- * Render a record/array as approval-style labeled fields: top level is a stack
71
- * of bordered field cards (muted label over the value, like ReviewDisplay's
72
- * InfoRow); nested objects/arrays recurse as lighter indented rows; genuinely
73
- * deep values fall back to a compact JSON block so we never wall-of-text.
74
- */
75
- function Fields({ data, depth = 0 }) {
76
- // Arrays: render each entry as its own clean card (objects) or bullet
77
- // (primitives) — never numeric "1, 2, 3" labels.
78
- if (Array.isArray(data)) {
79
- if (data.length === 0)
80
- return _jsx(NoData, {});
81
- return (_jsx("div", { className: "flex flex-col gap-1.5", children: data.map((item, i) => {
82
- if (isAttachment(item) || isAttachmentArray(item))
83
- return _jsx(DisplayValue, { value: item }, i);
84
- if (item !== null && typeof item === 'object') {
85
- return (_jsx("div", { className: "rounded-[var(--wui-radius-sm)] border border-[color-mix(in_srgb,var(--wui-border)_70%,transparent)] px-3 py-2", children: _jsx(Fields, { data: item, depth: depth + 1 }) }, i));
86
- }
87
- return (_jsxs("div", { className: "flex items-start gap-2 py-0.5", children: [_jsx("span", { className: "mt-[7px] h-1 w-1 shrink-0 rounded-full bg-[var(--wui-fg-muted)]" }), _jsx(PrimitiveValue, { value: item, className: "min-w-0 flex-1 text-[13.5px]" })] }, i));
88
- }) }));
89
- }
90
- const entries = Object.entries((data ?? {}));
91
- if (entries.length === 0)
92
- return _jsx(NoData, {});
93
- return (_jsx("div", { className: depth === 0 ? 'space-y-2.5' : 'flex flex-col', children: entries.map(([k, v]) => (_jsx(FieldItem, { label: k, value: v, depth: depth }, k))) }));
94
- }
95
- /** A WAIT step's `display`: an array of { label, value } review rows. */
96
- function isDisplayRows(v) {
97
- return Array.isArray(v) && v.length > 0 && v.every((r) => !!r && typeof r === 'object' && !Array.isArray(r) && typeof r.label === 'string' && 'value' in r);
98
- }
99
- function FieldItem({ label, value, depth }) {
100
- const isAtt = isAttachment(value) || isAttachmentArray(value);
101
- const isDisplay = !isAtt && isDisplayRows(value);
102
- const isObj = !isAtt && !isDisplay && value !== null && typeof value === 'object';
103
- const isArr = isObj && Array.isArray(value);
104
- // Pause display rows → the approval's ReviewDisplay (label → value cards, markdown).
105
- if (isDisplay) {
106
- const rows = _jsx(ReviewDisplay, { rows: value });
107
- return depth === 0 ? rows : (_jsxs("div", { className: "border-b border-[color-mix(in_srgb,var(--wui-border)_55%,transparent)] py-1.5 last:border-0", children: [_jsx("div", { className: "mb-1.5 text-[12px] text-[var(--wui-fg-muted)]", children: label }), rows] }));
108
- }
109
- // Top level → the approval field card: a shaded header (label) over the value body.
110
- if (depth === 0) {
111
- return (_jsxs("div", { className: "overflow-hidden rounded-[var(--wui-radius-sm)] border border-[var(--wui-border)]", children: [_jsx("div", { className: cn('border-b border-[var(--wui-border)] bg-[var(--wui-bg-subtle)] px-3 py-2 text-[11px] text-[var(--wui-fg)]', isArr ? 'font-bold' : 'font-semibold'), children: label }), _jsx("div", { className: "px-3 py-2.5", children: isAtt ? _jsx(DisplayValue, { value: value }) : isObj ? _jsx(Fields, { data: value, depth: depth + 1 }) : _jsx(PrimitiveValue, { value: value }) })] }));
112
- }
113
- const rowBorder = 'border-b border-[color-mix(in_srgb,var(--wui-border)_55%,transparent)] py-1.5 last:border-0';
114
- // Attachment (nested) → label + the shared file card (download + preview).
115
- if (isAtt) {
116
- return (_jsxs("div", { className: rowBorder, children: [_jsx("div", { className: "mb-1.5 text-[12px] text-[var(--wui-fg-muted)]", children: label }), _jsx(DisplayValue, { value: value })] }));
117
- }
118
- // Pathologically deep → compact JSON (rare; guards against runaway nesting).
119
- if (isObj && depth >= 8) {
120
- return (_jsxs("div", { className: rowBorder, children: [_jsx("div", { className: "mb-1 text-[12px] text-[var(--wui-fg-muted)]", children: label }), _jsx("pre", { className: "overflow-x-auto rounded-[var(--wui-radius-sm)] bg-[var(--wui-bg-subtle)] px-2 py-1.5 font-mono text-[11px] leading-relaxed text-[var(--wui-fg)]", children: JSON.stringify(value, null, 2) })] }));
121
- }
122
- // Nested object/array → label + sub-fields (objects indent; arrays use cards).
123
- if (isObj) {
124
- return (_jsxs("div", { className: rowBorder, children: [_jsx("div", { className: cn('mb-1 text-[12px]', isArr ? 'font-bold text-[var(--wui-fg)]' : 'font-medium text-[var(--wui-fg-muted)]'), children: label }), _jsx("div", { className: Array.isArray(value) ? 'mt-1' : 'border-l border-[var(--wui-border)] pl-3', children: _jsx(Fields, { data: value, depth: depth + 1 }) })] }));
125
- }
126
- // Nested primitive → a clean label → value row.
127
- return (_jsxs("div", { className: cn('flex items-start gap-3', rowBorder), children: [_jsx("span", { className: "w-[140px] shrink-0 break-words text-[12px] text-[var(--wui-fg-muted)]", children: label }), _jsx(PrimitiveValue, { value: value, className: "min-w-0 flex-1 text-[13.5px]" })] }));
128
- }
129
- /** One side of the detail (Input or Output) — a section header + the fields. */
130
- function IoSection({ title, data, hasData, className }) {
131
- return (_jsxs("div", { className: cn('flex min-w-0 flex-1 flex-col', className), children: [_jsx("div", { className: "shrink-0 border-b border-[var(--wui-border)] px-4 py-2.5 text-[11px] font-semibold uppercase tracking-[0.09em] text-[var(--wui-fg-muted)]", children: title }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 py-3 [scrollbar-width:thin]", children: hasData ? _jsx(Fields, { data: data }) : _jsx(NoData, {}) })] }));
132
- }
133
- // ─── Approval (pause / WAIT) steps — render like the Approvals screen ───
134
- const NOOP = () => { };
135
- /** A pause/approval step's input is a serialized PauseState (a form and/or display sections). */
136
- function isPauseInput(v) {
137
- if (!v || typeof v !== 'object')
138
- return false;
139
- const o = v;
140
- const hasForm = !!o['form'] && typeof o['form'] === 'object' && Array.isArray(o['form'].fields);
141
- return (hasForm || isDisplayRows(o['display'])) && (typeof o['reason'] === 'string' || typeof o['prompt'] === 'string' || 'mode' in o);
142
- }
143
- function DecisionBadge({ action }) {
144
- const approve = /^(approve|accept|yes|confirm)/i.test(action);
145
- const reject = /^(reject|deny|decline|no|abort)/i.test(action);
146
- const color = approve ? 'var(--wui-status-completed)' : reject ? 'var(--wui-status-failed)' : 'var(--wui-status-paused)';
147
- const label = approve ? 'Approved' : reject ? 'Rejected' : action.charAt(0).toUpperCase() + action.slice(1);
148
- return (_jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[12px] font-semibold", style: { color, backgroundColor: `color-mix(in srgb, ${color} 14%, transparent)` }, children: [_jsx("span", { className: "h-1.5 w-1.5 rounded-full", style: { backgroundColor: color } }), label] }));
149
- }
150
- /** The approval screen, read-only — reason/prompt, the review display, the form with the reviewer's submitted answers, and the decision. */
151
- function ApprovalStepDetail({ input, output }) {
152
- const reason = typeof input['reason'] === 'string' ? input['reason'] : undefined;
153
- const prompt = typeof input['prompt'] === 'string' ? input['prompt'] : undefined;
154
- const display = isDisplayRows(input['display']) ? input['display'] : undefined;
155
- const form = input['form'] && typeof input['form'] === 'object' && Array.isArray(input['form'].fields)
156
- ? input['form'] : undefined;
157
- const resume = output?.['resumeData'];
158
- const action = typeof resume?.action === 'string' ? resume.action : undefined;
159
- const submitted = (resume?.data && typeof resume.data === 'object' ? resume.data : {});
160
- return (_jsxs("div", { className: "mt-5 min-h-0 flex-1 space-y-4 overflow-y-auto rounded-[var(--wui-radius-lg)] border border-[var(--wui-border)] px-5 py-4 [scrollbar-width:thin]", children: [action ? _jsx(DecisionBadge, { action: action }) : (_jsxs("div", { className: "inline-flex items-center gap-1.5 rounded-full bg-[color-mix(in_srgb,var(--wui-status-paused)_14%,transparent)] px-2.5 py-1 text-[12px] font-semibold text-[var(--wui-status-paused)]", children: [_jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-[var(--wui-status-paused)]" }), "Awaiting decision \u2014 respond in the Approvals tab"] })), reason && _jsx(MarkdownView, { className: "text-[14px] font-medium text-[var(--wui-fg)]", children: reason }), prompt && _jsx(MarkdownView, { className: "text-[13px] text-[var(--wui-fg-muted)]", children: prompt }), display && _jsx(ReviewDisplay, { rows: display }), form && (_jsxs("div", { children: [_jsx("div", { className: "mb-2 text-[11px] font-semibold uppercase tracking-[0.09em] text-[var(--wui-fg-muted)]", children: "Reviewer response" }), _jsx(PauseFormRenderer, { form: form, values: submitted, onChange: NOOP, disabled: true })] }))] }));
161
- }
162
- function JourneyStepDetail({ state, title, description }) {
163
- const status = state.status;
164
- const hasInput = !!state.input && Object.keys(state.input).length > 0;
165
- const hasOutput = !!state.output && Object.keys(state.output).length > 0;
166
- const [layout, setLayout] = useState('tabs');
167
- const [tab, setTab] = useState('output');
168
- // Pending/un-run steps have no output yet — fall back to input so we never open an empty pane.
169
- const showTab = tab === 'output' && !hasOutput ? 'input' : tab === 'input' && !hasInput ? 'output' : tab;
170
- const pause = isPauseInput(state.input);
171
- const notRun = status === 'pending' && !hasInput && !hasOutput;
172
- return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col px-6 py-5", children: [_jsxs("div", { className: "flex shrink-0 items-start gap-3", children: [_jsx(StatusDot, { status: status, size: 26 }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("h2", { className: "truncate text-[17px] font-semibold text-[var(--wui-fg)]", children: title || state.stepName }), _jsx(StatusBadge, { status: status })] }), !notRun && _jsx("div", { className: "mt-0.5 text-[12px] uppercase tracking-wide text-[var(--wui-fg-muted)]", children: state.stepType }), description && _jsx("p", { className: "mt-1.5 text-[13px] leading-snug text-[var(--wui-fg-muted)]", children: description })] }), !pause && !notRun && (_jsx("div", { className: "flex shrink-0 items-center rounded-[var(--wui-radius-sm)] border border-[var(--wui-border)] p-0.5", children: ['split', 'tabs'].map((l) => (_jsx("button", { type: "button", onClick: () => setLayout(l), className: cn('rounded-[calc(var(--wui-radius-sm)-2px)] px-2.5 py-1 text-[12px] font-medium transition-colors', layout === l ? 'bg-[var(--wui-primary)] text-[var(--wui-primary-fg)]' : 'text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]'), children: l === 'split' ? 'Side by side' : 'Tabs' }, l))) }))] }), state.error && (_jsxs("div", { className: "mt-4 shrink-0 rounded-[var(--wui-radius-lg)] border border-[var(--wui-status-failed)] bg-[color-mix(in_srgb,var(--wui-status-failed)_8%,transparent)] p-4", children: [_jsx("div", { className: "mb-1.5 text-[12px] font-semibold uppercase tracking-wide text-[var(--wui-status-failed)]", children: "Error" }), _jsx("pre", { className: "whitespace-pre-wrap font-mono text-[12px] leading-relaxed text-[var(--wui-status-failed)]", children: state.error })] })), notRun ? (_jsx(NotRunYet, {})) : pause ? (_jsx(ApprovalStepDetail, { input: state.input, output: state.output })) : layout === 'split' ? (_jsxs("div", { className: "mt-5 flex min-h-0 flex-1 overflow-hidden rounded-[var(--wui-radius-lg)] border border-[var(--wui-border)]", children: [_jsx(IoSection, { title: "Input", data: state.input, hasData: hasInput, className: "border-r border-[var(--wui-border)]" }), _jsx(IoSection, { title: "Output", data: state.output, hasData: hasOutput })] })) : (_jsxs("div", { className: "mt-5 flex min-h-0 flex-1 flex-col overflow-hidden rounded-[var(--wui-radius-lg)] border border-[var(--wui-border)]", children: [_jsx("div", { className: "flex shrink-0 gap-1 border-b border-[var(--wui-border)] px-2", children: ['input', 'output'].map((t) => {
173
- const empty = t === 'input' ? !hasInput : !hasOutput;
174
- return (_jsxs("button", { type: "button", disabled: empty, onClick: () => setTab(t), className: cn('relative px-3 py-2 text-[12px] font-medium capitalize transition-colors', empty
175
- ? 'cursor-not-allowed opacity-40'
176
- : showTab === t ? 'text-[var(--wui-fg)]' : 'text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]'), children: [t, showTab === t && _jsx("span", { className: "absolute inset-x-0 bottom-0 h-0.5 bg-[var(--wui-primary)]" })] }, t));
177
- }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 py-3 [scrollbar-width:thin]", children: showTab === 'input'
178
- ? (hasInput ? _jsx(Fields, { data: state.input }) : _jsx(NoData, {}))
179
- : (hasOutput ? _jsx(Fields, { data: state.output }) : _jsx(NoData, {})) })] }))] }));
180
- }
181
- function EmptyDetail() {
182
- return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 px-6 text-center text-[var(--wui-fg-muted)]", children: [_jsxs("svg", { width: "40", height: "40", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", className: "opacity-40", children: [_jsx("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }), _jsx("polyline", { points: "14 2 14 8 20 8" }), _jsx("line", { x1: "9", y1: "13", x2: "15", y2: "13" }), _jsx("line", { x1: "9", y1: "17", x2: "13", y2: "17" })] }), _jsx("p", { className: "text-[13px]", children: "Select a step to view its details" })] }));
183
- }
184
- /** A step that hasn't executed yet — a single clean placeholder instead of two empty I/O panes. */
185
- function NotRunYet() {
186
- return (_jsxs("div", { className: "mt-5 flex min-h-0 flex-1 flex-col items-center justify-center gap-2.5 rounded-[var(--wui-radius-lg)] border border-dashed border-[var(--wui-border)] text-[var(--wui-fg-muted)]", children: [_jsxs("svg", { width: "26", height: "26", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", className: "opacity-50", children: [_jsx("circle", { cx: "12", cy: "12", r: "9" }), _jsx("path", { d: "M12 7v5l3 2" })] }), _jsx("p", { className: "text-[13px] font-medium", children: "Not run yet" })] }));
187
- }
188
- /** Run-level progress counts + a jump-to-current pill (shown only at the Run level). */
189
- function RunStatusStrip({ counts, live, onJump }) {
190
- const order = [['completed', 'done'], ['failed', 'failed'], ['running', 'running'], ['paused', 'paused'], ['pending', 'pending']];
191
- const shown = order.filter(([k]) => counts[k] > 0);
192
- return (_jsxs("div", { className: "ml-auto flex min-w-0 items-center gap-3.5 pl-3", children: [shown.length > 0 && (_jsx("div", { className: "flex shrink-0 items-center gap-2.5", children: shown.map(([k, label]) => (_jsxs("span", { className: "flex items-center gap-1.5 text-[11.5px] text-[var(--wui-fg-muted)]", children: [_jsx("span", { className: "h-1.5 w-1.5 rounded-full", style: { backgroundColor: STATUS_STYLE[k].dot, border: k === 'pending' ? '1px solid var(--wui-border-strong)' : 'none' } }), _jsx("span", { className: "font-semibold text-[var(--wui-fg)]", children: counts[k] }), " ", label] }, k))) })), live && (_jsxs("button", { type: "button", onClick: onJump, title: `Jump to ${live.label}`, className: "flex min-w-0 items-center gap-1.5 rounded-full border border-[color-mix(in_srgb,var(--wui-status-paused)_40%,transparent)] bg-[color-mix(in_srgb,var(--wui-status-paused)_12%,transparent)] px-2.5 py-1 text-[11.5px] font-medium text-[var(--wui-status-paused)] transition-colors hover:bg-[color-mix(in_srgb,var(--wui-status-paused)_20%,transparent)]", children: [_jsx("span", { className: "shrink-0", children: live.status === 'paused' ? PAUSE : PLAY }), _jsxs("span", { className: "truncate", children: [live.status === 'paused' ? 'Paused' : 'Running', " \u2014 at ", live.label] })] }))] }));
193
- }
194
- export function ExecutionJourney({ steps, stepMeta, stepStates, executionSteps, groups, selectedStepId, onStepClick, selectedStepState, selectedStepTitle, selectedStepDescription, triggerLabel, triggerIconName, triggerCompleted, isTriggerSelected, onTriggerClick, }) {
195
- const [path, setPath] = useState([]);
196
- const didInit = useRef(false); // jump-to-live runs once on open, not every time you click "Run"
197
- const { sections, crumbs, insideGroupId } = useMemo(() => resolveLevel(steps, stepMeta, path, executionSteps, stepStates), [steps, stepMeta, path, executionSteps, stepStates]);
198
- // The current execution point (running/paused leaf) + per-status leaf tally — for
199
- // jump-to-live auto-select on open and the Run-level status strip.
200
- const live = useMemo(() => findLivePath(steps, groups, stepMeta, stepStates, undefined, []), [steps, groups, stepMeta, stepStates]);
201
- const tally = useMemo(() => tallyLeaves(steps, stepMeta, stepStates), [steps, stepMeta, stepStates]);
202
- // On open, jump to the live step (running/paused); on drill, prefer a live leaf,
203
- // else the first leaf — per section, prepending the MAP/LOOP selection prefix.
204
- useEffect(() => {
205
- if (path.length === 0) {
206
- if (!didInit.current && live) {
207
- didInit.current = true;
208
- setPath(live.path);
209
- onStepClick(live.stepId);
210
- return;
211
- }
212
- onTriggerClick();
213
- return;
214
- }
215
- for (const section of sections) {
216
- const st = section.states ?? stepStates;
217
- const prefix = section.selectionPrefix ?? '';
218
- const leaves = buildRows(section.steps, groups, stepMeta, insideGroupId, st)
219
- .filter((r) => r.kind === 'leaf');
220
- const liveLeaf = leaves.find((r) => { const s = st.get(r.step.id)?.status; return s === 'running' || s === 'paused'; });
221
- const target = liveLeaf ?? leaves[0];
222
- if (target) {
223
- onStepClick(prefix + target.step.id);
224
- return;
225
- }
226
- }
227
- // eslint-disable-next-line react-hooks/exhaustive-deps
228
- }, [path]);
229
- // `states`/`prefix` are the current level's source + selection frame (the global
230
- // stepStates and '' for normal levels; a MAP/LOOP iteration's own map + node-path
231
- // frame for an iteration level). The render path is otherwise uniform.
232
- const renderRow = (row, states, prefix) => {
233
- if (row.kind === 'group') {
234
- return (_jsx(SidebarRow, { status: rollup(row.members, states, stepMeta), icon: FOLDER, label: row.group.title, meta: plural(row.members.length), drillable: true, onClick: () => setPath((p) => [...p, { kind: 'group', id: row.group.id, label: row.group.title }]) }, `g-${row.group.id}`));
235
- }
236
- if (row.kind === 'construct') {
237
- const label = row.step.title || row.meta?.name || row.step.type;
238
- const status = states.get(row.step.id)?.status ?? rollup([row.step], states, stepMeta);
239
- const icon = row.meta?.branchModel === 'iterate' ? LOOP : row.meta?.branchModel === 'map' ? LAYERS : BRANCH;
240
- return (_jsx(SidebarRow, { status: status, icon: icon, label: label, drillable: true, onClick: () => setPath((p) => [...p, { kind: 'construct', id: row.step.id, label }]) }, `c-${row.step.id}`));
241
- }
242
- if (row.kind === 'iteration') {
243
- // A MAP/LOOP iteration folder — drills into that iteration's body.
244
- const { view } = row;
245
- return (_jsx(SidebarRow, { status: rollup(view.bodySteps, view.states, stepMeta), icon: LAYERS, label: view.label, drillable: true, onClick: () => setPath((p) => [...p, { kind: 'iterationItem', id: view.ctrlId, index: view.index, label: view.label }]) }, `i-${view.prefix}`));
246
- }
247
- const label = row.step.title || row.meta?.name || row.step.type;
248
- const selectionId = `${prefix}${row.step.id}`;
249
- return (_jsx(SidebarRow, { status: states.get(row.step.id)?.status ?? 'pending', icon: getStepIcon(row.meta?.icon, { size: 14 }), label: label, active: selectedStepId === selectionId, onClick: () => onStepClick(selectionId) }, `l-${selectionId}`));
250
- };
251
- return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden bg-[var(--wui-bg)]", children: [_jsxs("div", { className: "flex shrink-0 items-center gap-1 border-b border-[var(--wui-border)] px-5 py-2.5 text-[12px]", children: [crumbs.map((c, i) => {
252
- const last = i === crumbs.length - 1;
253
- return (_jsxs("span", { className: "flex items-center gap-1", children: [i > 0 && _jsx("span", { className: "text-[var(--wui-fg-muted)]", children: "/" }), _jsx("button", { type: "button", disabled: last, onClick: () => setPath((p) => p.slice(0, i)), className: cn('rounded px-1 py-0.5 transition-colors', last ? 'font-semibold text-[var(--wui-fg)]' : 'text-[var(--wui-fg-muted)] hover:text-[var(--wui-primary)]'), children: c.label })] }, i));
254
- }), path.length === 0 && (_jsx(RunStatusStrip, { counts: tally, live: live, onJump: () => { if (live) {
255
- setPath(live.path);
256
- onStepClick(live.stepId);
257
- } } }))] }), _jsxs("div", { className: "flex min-h-0 flex-1 overflow-hidden", children: [_jsx("div", { className: "flex w-[300px] shrink-0 flex-col border-r border-[var(--wui-border)] bg-[var(--wui-bg-subtle)]", children: _jsxs("div", { className: "flex-1 overflow-y-auto px-2 py-2 [scrollbar-width:thin]", children: [path.length === 0 && (_jsx(SidebarRow, { status: triggerCompleted ? 'completed' : 'pending', icon: triggerIconName ? getStepIcon(triggerIconName, { size: 14 }) : BOLT, label: triggerLabel, meta: "Trigger", active: isTriggerSelected, onClick: onTriggerClick })), sections.map((section, si) => {
258
- const states = section.states ?? stepStates;
259
- const prefix = section.selectionPrefix ?? '';
260
- // Iteration-list level → iteration rows; otherwise the usual config-step
261
- // rows (resolved if-blocks inlined). Either way, one `renderRow` switch.
262
- const rows = section.iterations
263
- ? section.iterations.map((view) => ({ kind: 'iteration', view }))
264
- : buildRows(section.steps, groups, stepMeta, insideGroupId, states);
265
- return (_jsxs("div", { className: "flex flex-col", children: [section.label && (_jsxs("div", { className: "mt-2 flex items-center gap-2 px-2.5 pb-1 text-[10.5px] font-semibold uppercase tracking-wide text-[var(--wui-fg-muted)]", children: [_jsx("span", { className: "truncate", children: section.label }), _jsx("span", { className: "h-px flex-1 bg-[var(--wui-border)]" })] })), rows.map((row) => renderRow(row, states, prefix)), rows.length === 0 && (_jsx("div", { className: "px-2.5 py-2 text-[12px] italic text-[var(--wui-fg-muted)]", children: "No steps" }))] }, si));
266
- })] }) }), _jsx("div", { className: "flex min-w-0 flex-1 flex-col overflow-hidden bg-[var(--wui-bg)]", children: selectedStepState ? (_jsx(JourneyStepDetail, { state: selectedStepState, title: selectedStepTitle, description: selectedStepDescription })) : (_jsx(EmptyDetail, {})) })] })] }));
267
- }
268
- //# sourceMappingURL=ExecutionJourney.js.map