@xyne/workflow-ui 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/components/builder/v3/AiBuilderPanel.d.ts.map +1 -1
  2. package/dist/components/builder/v3/AiBuilderPanel.js +18 -50
  3. package/dist/components/builder/v3/AiBuilderPanel.js.map +1 -1
  4. package/dist/components/builder/v3/CitationEditor.d.ts +18 -0
  5. package/dist/components/builder/v3/CitationEditor.d.ts.map +1 -0
  6. package/dist/components/builder/v3/CitationEditor.js +32 -0
  7. package/dist/components/builder/v3/CitationEditor.js.map +1 -0
  8. package/dist/components/builder/v3/EnhancedSchemaFormRenderer.d.ts +6 -2
  9. package/dist/components/builder/v3/EnhancedSchemaFormRenderer.d.ts.map +1 -1
  10. package/dist/components/builder/v3/EnhancedSchemaFormRenderer.js +28 -9
  11. package/dist/components/builder/v3/EnhancedSchemaFormRenderer.js.map +1 -1
  12. package/dist/components/builder/v3/KeyValueEditor.d.ts +6 -1
  13. package/dist/components/builder/v3/KeyValueEditor.d.ts.map +1 -1
  14. package/dist/components/builder/v3/KeyValueEditor.js +3 -2
  15. package/dist/components/builder/v3/KeyValueEditor.js.map +1 -1
  16. package/dist/components/builder/v3/SidePanel.d.ts +3 -1
  17. package/dist/components/builder/v3/SidePanel.d.ts.map +1 -1
  18. package/dist/components/builder/v3/SidePanel.js +2 -2
  19. package/dist/components/builder/v3/SidePanel.js.map +1 -1
  20. package/dist/components/builder/v3/StepConfigPanel.d.ts +6 -2
  21. package/dist/components/builder/v3/StepConfigPanel.d.ts.map +1 -1
  22. package/dist/components/builder/v3/StepConfigPanel.js +2 -2
  23. package/dist/components/builder/v3/StepConfigPanel.js.map +1 -1
  24. package/dist/components/builder/v3/WorkflowBuilderV3.d.ts.map +1 -1
  25. package/dist/components/builder/v3/WorkflowBuilderV3.js +1 -1
  26. package/dist/components/builder/v3/WorkflowBuilderV3.js.map +1 -1
  27. package/dist/components/builder/v3/field-source-control.d.ts +20 -0
  28. package/dist/components/builder/v3/field-source-control.d.ts.map +1 -0
  29. package/dist/components/builder/v3/field-source-control.js +33 -0
  30. package/dist/components/builder/v3/field-source-control.js.map +1 -0
  31. package/dist/components/execution/ApprovalsView.d.ts.map +1 -1
  32. package/dist/components/execution/ApprovalsView.js +46 -21
  33. package/dist/components/execution/ApprovalsView.js.map +1 -1
  34. package/dist/components/execution/ExecutionViewer.d.ts.map +1 -1
  35. package/dist/components/execution/ExecutionViewer.js +31 -2
  36. package/dist/components/execution/ExecutionViewer.js.map +1 -1
  37. package/dist/components/execution/PauseFormRenderer.d.ts +5 -2
  38. package/dist/components/execution/PauseFormRenderer.d.ts.map +1 -1
  39. package/dist/components/execution/PauseFormRenderer.js +4 -4
  40. package/dist/components/execution/PauseFormRenderer.js.map +1 -1
  41. package/dist/components/execution/PauseInteractionPanel.d.ts +8 -1
  42. package/dist/components/execution/PauseInteractionPanel.d.ts.map +1 -1
  43. package/dist/components/execution/PauseInteractionPanel.js +15 -21
  44. package/dist/components/execution/PauseInteractionPanel.js.map +1 -1
  45. package/dist/components/execution/StepDetailPanel.d.ts +7 -1
  46. package/dist/components/execution/StepDetailPanel.d.ts.map +1 -1
  47. package/dist/components/execution/StepDetailPanel.js +2 -2
  48. package/dist/components/execution/StepDetailPanel.js.map +1 -1
  49. package/dist/components/execution/origin/OriginTrace.d.ts +40 -0
  50. package/dist/components/execution/origin/OriginTrace.d.ts.map +1 -0
  51. package/dist/components/execution/origin/OriginTrace.js +107 -0
  52. package/dist/components/execution/origin/OriginTrace.js.map +1 -0
  53. package/dist/components/execution/origin/origin-resolver.d.ts +99 -0
  54. package/dist/components/execution/origin/origin-resolver.d.ts.map +1 -0
  55. package/dist/components/execution/origin/origin-resolver.js +185 -0
  56. package/dist/components/execution/origin/origin-resolver.js.map +1 -0
  57. package/dist/components/shared/AttachmentCard.d.ts +10 -0
  58. package/dist/components/shared/AttachmentCard.d.ts.map +1 -1
  59. package/dist/components/shared/AttachmentCard.js +31 -0
  60. package/dist/components/shared/AttachmentCard.js.map +1 -1
  61. package/dist/components/shared/ChatPanel.d.ts +22 -0
  62. package/dist/components/shared/ChatPanel.d.ts.map +1 -0
  63. package/dist/components/shared/ChatPanel.js +64 -0
  64. package/dist/components/shared/ChatPanel.js.map +1 -0
  65. package/dist/hooks/use-ai-builder.d.ts +2 -2
  66. package/dist/hooks/use-ai-builder.d.ts.map +1 -1
  67. package/dist/hooks/use-ai-builder.js.map +1 -1
  68. package/dist/hooks/use-approval-ai.d.ts +13 -0
  69. package/dist/hooks/use-approval-ai.d.ts.map +1 -0
  70. package/dist/hooks/use-approval-ai.js +36 -0
  71. package/dist/hooks/use-approval-ai.js.map +1 -0
  72. package/dist/hooks/use-variable-picker.d.ts.map +1 -1
  73. package/dist/hooks/use-variable-picker.js +30 -9
  74. package/dist/hooks/use-variable-picker.js.map +1 -1
  75. package/dist/hooks/use-workflow-builder.d.ts +5 -1
  76. package/dist/hooks/use-workflow-builder.d.ts.map +1 -1
  77. package/dist/hooks/use-workflow-builder.js +48 -0
  78. package/dist/hooks/use-workflow-builder.js.map +1 -1
  79. package/dist/styles.css +1 -1
  80. package/package.json +2 -2
  81. package/dist/components/builder/AddStepButton.d.ts +0 -6
  82. package/dist/components/builder/AddStepButton.d.ts.map +0 -1
  83. package/dist/components/builder/AddStepButton.js +0 -7
  84. package/dist/components/builder/AddStepButton.js.map +0 -1
  85. package/dist/components/builder/BranchEdge.d.ts +0 -3
  86. package/dist/components/builder/BranchEdge.d.ts.map +0 -1
  87. package/dist/components/builder/BranchEdge.js +0 -19
  88. package/dist/components/builder/BranchEdge.js.map +0 -1
  89. package/dist/components/builder/BuilderToolbar.d.ts +0 -10
  90. package/dist/components/builder/BuilderToolbar.d.ts.map +0 -1
  91. package/dist/components/builder/BuilderToolbar.js +0 -16
  92. package/dist/components/builder/BuilderToolbar.js.map +0 -1
  93. package/dist/components/builder/StepConfigDrawer.d.ts +0 -11
  94. package/dist/components/builder/StepConfigDrawer.d.ts.map +0 -1
  95. package/dist/components/builder/StepConfigDrawer.js +0 -21
  96. package/dist/components/builder/StepConfigDrawer.js.map +0 -1
  97. package/dist/components/builder/StepNode.d.ts +0 -15
  98. package/dist/components/builder/StepNode.d.ts.map +0 -1
  99. package/dist/components/builder/StepNode.js +0 -56
  100. package/dist/components/builder/StepNode.js.map +0 -1
  101. package/dist/components/builder/StepPalette.d.ts +0 -7
  102. package/dist/components/builder/StepPalette.d.ts.map +0 -1
  103. package/dist/components/builder/StepPalette.js +0 -83
  104. package/dist/components/builder/StepPalette.js.map +0 -1
  105. package/dist/components/builder/StepPicker.d.ts +0 -9
  106. package/dist/components/builder/StepPicker.d.ts.map +0 -1
  107. package/dist/components/builder/StepPicker.js +0 -95
  108. package/dist/components/builder/StepPicker.js.map +0 -1
  109. package/dist/components/builder/TriggerConfigPanel.d.ts +0 -10
  110. package/dist/components/builder/TriggerConfigPanel.d.ts.map +0 -1
  111. package/dist/components/builder/TriggerConfigPanel.js +0 -49
  112. package/dist/components/builder/TriggerConfigPanel.js.map +0 -1
  113. package/dist/components/builder/TriggerNode.d.ts +0 -9
  114. package/dist/components/builder/TriggerNode.d.ts.map +0 -1
  115. package/dist/components/builder/TriggerNode.js +0 -30
  116. package/dist/components/builder/TriggerNode.js.map +0 -1
  117. package/dist/components/builder/TriggerPicker.d.ts +0 -8
  118. package/dist/components/builder/TriggerPicker.d.ts.map +0 -1
  119. package/dist/components/builder/TriggerPicker.js +0 -61
  120. package/dist/components/builder/TriggerPicker.js.map +0 -1
  121. package/dist/components/builder/WorkflowBuilder.d.ts +0 -20
  122. package/dist/components/builder/WorkflowBuilder.d.ts.map +0 -1
  123. package/dist/components/builder/WorkflowBuilder.js +0 -157
  124. package/dist/components/builder/WorkflowBuilder.js.map +0 -1
  125. package/dist/components/builder/edge-types.d.ts +0 -3
  126. package/dist/components/builder/edge-types.d.ts.map +0 -1
  127. package/dist/components/builder/edge-types.js +0 -5
  128. package/dist/components/builder/edge-types.js.map +0 -1
  129. package/dist/components/builder/node-types.d.ts +0 -3
  130. package/dist/components/builder/node-types.d.ts.map +0 -1
  131. package/dist/components/builder/node-types.js +0 -11
  132. package/dist/components/builder/node-types.js.map +0 -1
  133. package/dist/components/builder/v2/AddStepButton.d.ts +0 -6
  134. package/dist/components/builder/v2/AddStepButton.d.ts.map +0 -1
  135. package/dist/components/builder/v2/AddStepButton.js +0 -6
  136. package/dist/components/builder/v2/AddStepButton.js.map +0 -1
  137. package/dist/components/builder/v2/BranchEdge.d.ts +0 -3
  138. package/dist/components/builder/v2/BranchEdge.d.ts.map +0 -1
  139. package/dist/components/builder/v2/BranchEdge.js +0 -46
  140. package/dist/components/builder/v2/BranchEdge.js.map +0 -1
  141. package/dist/components/builder/v2/LoopBodyEdge.d.ts +0 -7
  142. package/dist/components/builder/v2/LoopBodyEdge.d.ts.map +0 -1
  143. package/dist/components/builder/v2/LoopBodyEdge.js +0 -19
  144. package/dist/components/builder/v2/LoopBodyEdge.js.map +0 -1
  145. package/dist/components/builder/v2/LoopbackEdge.d.ts +0 -10
  146. package/dist/components/builder/v2/LoopbackEdge.d.ts.map +0 -1
  147. package/dist/components/builder/v2/LoopbackEdge.js +0 -26
  148. package/dist/components/builder/v2/LoopbackEdge.js.map +0 -1
  149. package/dist/components/builder/v2/StepNode.d.ts +0 -21
  150. package/dist/components/builder/v2/StepNode.d.ts.map +0 -1
  151. package/dist/components/builder/v2/StepNode.js +0 -36
  152. package/dist/components/builder/v2/StepNode.js.map +0 -1
  153. package/dist/components/builder/v2/StepPicker.d.ts +0 -8
  154. package/dist/components/builder/v2/StepPicker.d.ts.map +0 -1
  155. package/dist/components/builder/v2/StepPicker.js +0 -73
  156. package/dist/components/builder/v2/StepPicker.js.map +0 -1
  157. package/dist/components/builder/v2/TerminalNode.d.ts +0 -6
  158. package/dist/components/builder/v2/TerminalNode.d.ts.map +0 -1
  159. package/dist/components/builder/v2/TerminalNode.js +0 -7
  160. package/dist/components/builder/v2/TerminalNode.js.map +0 -1
  161. package/dist/components/builder/v2/TriggerNode.d.ts +0 -10
  162. package/dist/components/builder/v2/TriggerNode.d.ts.map +0 -1
  163. package/dist/components/builder/v2/TriggerNode.js +0 -20
  164. package/dist/components/builder/v2/TriggerNode.js.map +0 -1
  165. package/dist/components/builder/v2/TriggerPicker.d.ts +0 -7
  166. package/dist/components/builder/v2/TriggerPicker.d.ts.map +0 -1
  167. package/dist/components/builder/v2/TriggerPicker.js +0 -45
  168. package/dist/components/builder/v2/TriggerPicker.js.map +0 -1
  169. package/dist/components/builder/v2/WorkflowBuilder.d.ts +0 -14
  170. package/dist/components/builder/v2/WorkflowBuilder.d.ts.map +0 -1
  171. package/dist/components/builder/v2/WorkflowBuilder.js +0 -189
  172. package/dist/components/builder/v2/WorkflowBuilder.js.map +0 -1
  173. package/dist/components/builder/v2/edge-types.d.ts +0 -3
  174. package/dist/components/builder/v2/edge-types.d.ts.map +0 -1
  175. package/dist/components/builder/v2/edge-types.js +0 -9
  176. package/dist/components/builder/v2/edge-types.js.map +0 -1
  177. package/dist/components/builder/v2/icons.d.ts +0 -25
  178. package/dist/components/builder/v2/icons.d.ts.map +0 -1
  179. package/dist/components/builder/v2/icons.js +0 -43
  180. package/dist/components/builder/v2/icons.js.map +0 -1
  181. package/dist/components/builder/v2/layout-engine.d.ts +0 -76
  182. package/dist/components/builder/v2/layout-engine.d.ts.map +0 -1
  183. package/dist/components/builder/v2/layout-engine.js +0 -465
  184. package/dist/components/builder/v2/layout-engine.js.map +0 -1
  185. package/dist/components/builder/v2/node-types.d.ts +0 -3
  186. package/dist/components/builder/v2/node-types.d.ts.map +0 -1
  187. package/dist/components/builder/v2/node-types.js +0 -11
  188. package/dist/components/builder/v2/node-types.js.map +0 -1
  189. package/dist/components/builder/v2/theme.d.ts +0 -28
  190. package/dist/components/builder/v2/theme.d.ts.map +0 -1
  191. package/dist/components/builder/v2/theme.js +0 -63
  192. package/dist/components/builder/v2/theme.js.map +0 -1
  193. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts +0 -11
  194. package/dist/components/dashboard/WorkflowSummaryEditor.d.ts.map +0 -1
  195. package/dist/components/dashboard/WorkflowSummaryEditor.js +0 -46
  196. package/dist/components/dashboard/WorkflowSummaryEditor.js.map +0 -1
  197. package/dist/components/execution/ExecutionEdge.d.ts +0 -4
  198. package/dist/components/execution/ExecutionEdge.d.ts.map +0 -1
  199. package/dist/components/execution/ExecutionEdge.js +0 -27
  200. package/dist/components/execution/ExecutionEdge.js.map +0 -1
  201. package/dist/components/execution/ExecutionStepNode.d.ts +0 -14
  202. package/dist/components/execution/ExecutionStepNode.d.ts.map +0 -1
  203. package/dist/components/execution/ExecutionStepNode.js +0 -47
  204. package/dist/components/execution/ExecutionStepNode.js.map +0 -1
  205. package/dist/components/execution/ExecutionTriggerNode.d.ts +0 -9
  206. package/dist/components/execution/ExecutionTriggerNode.d.ts.map +0 -1
  207. package/dist/components/execution/ExecutionTriggerNode.js +0 -15
  208. package/dist/components/execution/ExecutionTriggerNode.js.map +0 -1
  209. package/dist/components/execution/StepAgentPanels.d.ts +0 -9
  210. package/dist/components/execution/StepAgentPanels.d.ts.map +0 -1
  211. package/dist/components/execution/StepAgentPanels.js +0 -133
  212. package/dist/components/execution/StepAgentPanels.js.map +0 -1
  213. package/dist/components/execution/execution-layout.d.ts +0 -31
  214. package/dist/components/execution/execution-layout.d.ts.map +0 -1
  215. package/dist/components/execution/execution-layout.js +0 -90
  216. package/dist/components/execution/execution-layout.js.map +0 -1
  217. package/dist/components/shared/JsonTreeViewer.d.ts +0 -9
  218. package/dist/components/shared/JsonTreeViewer.d.ts.map +0 -1
  219. package/dist/components/shared/JsonTreeViewer.js +0 -46
  220. package/dist/components/shared/JsonTreeViewer.js.map +0 -1
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * OriginTrace — the reviewer-facing "where did this value come from" UI.
4
+ *
5
+ * - `OriginChip`: quiet "⌄ source" affordance next to a value.
6
+ * - `useOriginInspector`: holds which value is being inspected.
7
+ * - `OriginPanel`: right-hand drawer that resolves the value's ref(s) and lets
8
+ * the reviewer trace upstream ("and above") recursively.
9
+ *
10
+ * The chip only *sets* state; the panel does the rendering — keeping the
11
+ * resolver (origin-resolver.ts) presentation-agnostic.
12
+ */
13
+ import { useState } from 'react';
14
+ import { extractRefPath } from '@xyne/workflow-sdk/builder';
15
+ import { cn } from '../../shared/cn.js';
16
+ import { SidePanelShell } from '../SidePanelShell.js';
17
+ import { AttachmentList } from '../../shared/AttachmentCard.js';
18
+ import { resolveRef, getOriginRefs, } from './origin-resolver.js';
19
+ const MAX_DEPTH = 8;
20
+ export function useOriginInspector() {
21
+ const [inspected, setInspected] = useState(null);
22
+ return {
23
+ inspected,
24
+ open: (label, autoRefs, citations = []) => setInspected({ label, autoRefs, citations }),
25
+ close: () => setInspected(null),
26
+ };
27
+ }
28
+ // ─── Chip ───
29
+ export function OriginChip({ onClick, className }) {
30
+ return (_jsxs("button", { type: "button", onClick: onClick, title: "Where this value came from", className: cn('inline-flex shrink-0 items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide transition-colors', 'border-[var(--wui-border)] bg-[var(--wui-bg)] text-[var(--wui-fg-muted)]', 'hover:border-[var(--wui-status-paused)] hover:text-[var(--wui-fg)]', className), children: [_jsxs("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2.25, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "12", y1: "16", x2: "12", y2: "12" }), _jsx("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })] }), "Source"] }));
31
+ }
32
+ /**
33
+ * Generic, value-driven chip. Shows the Source chip when the value has auto refs
34
+ * OR the field has author citations. The single mechanism at every
35
+ * reviewer-visible value — no field- or step-specific knowledge.
36
+ */
37
+ export function OriginChipFor({ raw, label, citations = [], onInspect, className, }) {
38
+ if (!onInspect)
39
+ return null;
40
+ const autoRefs = getOriginRefs(raw);
41
+ if (autoRefs.length === 0 && citations.length === 0)
42
+ return null;
43
+ return _jsx(OriginChip, { onClick: () => onInspect(label, autoRefs, citations), className: className });
44
+ }
45
+ // ─── Panel (resizable, layout side-panel) ───
46
+ export function OriginPanel({ inspected, ctx, onClose, width, onWidthChange, className, }) {
47
+ if (!inspected)
48
+ return null;
49
+ const { autoRefs, citations } = inspected;
50
+ const multi = autoRefs.length > 1;
51
+ return (_jsxs(SidePanelShell, { accentClassName: "border-t-[var(--wui-status-paused)]", width: width, onWidthChange: onWidthChange, className: className, children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between gap-3 border-b border-[var(--wui-border)] px-4", style: { minHeight: '53px' }, children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-[10px] font-semibold uppercase tracking-wider text-[var(--wui-fg-muted)]", children: "Value origin" }), _jsx("p", { className: "truncate text-[13px] font-semibold text-[var(--wui-fg)]", title: inspected.label, children: inspected.label })] }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close", className: "grid h-7 w-7 shrink-0 place-items-center rounded-[var(--wui-radius-sm)] text-[var(--wui-fg-muted)] transition-colors hover:bg-[var(--wui-bg-subtle)]", children: _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: "18", y1: "6", x2: "6", y2: "18" }), _jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) })] }), _jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto px-4 py-4", children: [autoRefs.length > 0 && (_jsxs("section", { className: "space-y-2", children: [_jsx(SectionHeader, { children: "Where it came from" }), _jsx("p", { className: "text-[12px] leading-relaxed text-[var(--wui-fg-muted)]", children: multi
52
+ ? `This value is assembled from ${String(autoRefs.length)} sources:`
53
+ : 'This value comes from:' }), autoRefs.map((ref) => (_jsx(OriginNode, { refPath: ref, ctx: ctx, depth: 0, visited: new Set([ref]), onClose: onClose }, ref)))] })), citations.length > 0 && (_jsxs("section", { className: "space-y-2", children: [_jsxs(SectionHeader, { children: ["Supporting sources", _jsx("span", { className: "ml-1.5 rounded-full bg-[var(--wui-status-paused)]/15 px-1.5 py-px text-[9px] font-semibold text-[var(--wui-status-paused)]", children: "added by author" })] }), _jsx("p", { className: "text-[12px] leading-relaxed text-[var(--wui-fg-muted)]", children: "Reference material attached to help you verify this value:" }), citations.map((c, i) => (_jsx(CitationNode, { citation: c, ctx: ctx, onClose: onClose }, `${c.ref}-${String(i)}`)))] })), autoRefs.length === 0 && citations.length === 0 && (_jsx("p", { className: "text-[12px] leading-relaxed text-[var(--wui-fg-muted)]", children: "This value was entered directly \u2014 it isn\u2019t derived from an earlier step." }))] })] }));
54
+ }
55
+ function SectionHeader({ children }) {
56
+ return (_jsx("h3", { className: "flex items-center text-[10px] font-bold uppercase tracking-wider text-[var(--wui-fg-muted)]", children: children }));
57
+ }
58
+ /** A single author citation: resolves its ref and renders it like an origin (or a file). */
59
+ function CitationNode({ citation, ctx, onClose }) {
60
+ // citation.ref is the full "{{...}}" form; resolveRef wants the bare path.
61
+ const origin = resolveRef(extractRefPath(citation.ref) ?? citation.ref, ctx);
62
+ return (_jsx("div", { className: "overflow-hidden rounded-[var(--wui-radius-sm)] border border-[var(--wui-border)] bg-[var(--wui-bg-subtle)]", children: _jsxs("div", { className: "border-l-2 border-[var(--wui-status-paused)] p-2.5", children: [citation.label && (_jsx("div", { className: "mb-0.5 text-[12.5px] font-semibold text-[var(--wui-fg)]", children: citation.label })), citation.description && (_jsx("p", { className: "mb-1.5 text-[11px] leading-snug text-[var(--wui-fg-muted)]", children: citation.description })), _jsx(OriginBody, { origin: origin, ctx: ctx, onClose: onClose })] }) }));
63
+ }
64
+ // ─── Recursive node ───
65
+ function OriginNode({ refPath, ctx, depth, visited, onClose, }) {
66
+ const origin = resolveRef(refPath, ctx);
67
+ const [open, setOpen] = useState(false);
68
+ const traceable = origin.upstreamRefs.filter((r) => !visited.has(r));
69
+ const canTrace = traceable.length > 0 && depth < MAX_DEPTH;
70
+ return (_jsx("div", { className: "overflow-hidden rounded-[var(--wui-radius-sm)] border border-[var(--wui-border)] bg-[var(--wui-bg-subtle)]", children: _jsxs("div", { className: "border-l-2 border-[var(--wui-status-paused)]/50 p-2.5", children: [_jsx(OriginBody, { origin: origin, ctx: ctx, onClose: onClose }), canTrace && (_jsxs("div", { className: "mt-2", children: [_jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), className: "inline-flex items-center gap-1 text-[11px] font-medium text-[var(--wui-fg-muted)] transition-colors hover:text-[var(--wui-fg)]", children: [_jsx("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", className: cn('transition-transform', open && 'rotate-90'), children: _jsx("polyline", { points: "9 18 15 12 9 6" }) }), open ? 'Hide' : 'Trace back', " (", traceable.length, ")"] }), open && (_jsx("div", { className: "mt-2 space-y-2 border-l-2 border-[var(--wui-border)] pl-2.5", children: traceable.map((r) => (_jsx(OriginNode, { refPath: r, ctx: ctx, depth: depth + 1, visited: new Set([...visited, r]), onClose: onClose }, r))) }))] }))] }) }));
71
+ }
72
+ /** Inner card content shared by an auto-origin node and an author-citation node. */
73
+ function OriginBody({ origin, ctx, onClose }) {
74
+ const [showAll, setShowAll] = useState(false);
75
+ // The full source object behind this value (a step's whole output, or the request).
76
+ const fullData = origin.stepId
77
+ ? ctx.stepOutput(origin.stepId)
78
+ : origin.kind === 'trigger'
79
+ ? ctx.triggerData
80
+ : undefined;
81
+ const fullLabel = origin.kind === 'trigger' ? 'request' : 'output';
82
+ const hasFull = fullData !== undefined &&
83
+ fullData !== null &&
84
+ typeof fullData === 'object' &&
85
+ Object.keys(fullData).length > 0;
86
+ return (_jsxs(_Fragment, { children: [origin.group && (_jsxs("div", { className: "mb-1.5 inline-flex max-w-full items-center gap-1 truncate rounded-full bg-[var(--wui-bg)] px-2 py-0.5 text-[10px] font-medium text-[var(--wui-fg-muted)] ring-1 ring-inset ring-[var(--wui-border)]", title: origin.group.description ?? origin.group.title, children: [_jsxs("svg", { width: "9", height: "9", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1" }), _jsx("rect", { x: "14", y: "3", width: "7", height: "7", rx: "1" }), _jsx("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" })] }), origin.group.title] })), _jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsx("span", { className: "min-w-0 text-[13px] font-semibold text-[var(--wui-fg)]", title: origin.label, children: origin.label }), origin.stepId && ctx.onJump && (_jsx("button", { type: "button", onClick: () => { ctx.onJump?.(origin.stepId); onClose(); }, className: "shrink-0 rounded-full border border-[var(--wui-border)] px-2 py-0.5 text-[10.5px] font-medium text-[var(--wui-fg-muted)] transition hover:bg-[var(--wui-bg)] hover:text-[var(--wui-fg)]", children: "View step" }))] }), origin.stepDescription && (_jsx("p", { className: "mt-1 text-[11.5px] leading-relaxed text-[var(--wui-fg-muted)]", children: origin.stepDescription })), _jsxs("div", { className: "mt-2.5", children: [_jsx("div", { className: "mb-1 text-[10px] font-semibold uppercase tracking-wide text-[var(--wui-fg-muted)]", children: "Value" }), origin.attachments && origin.attachments.length > 0 ? (_jsx(AttachmentList, { attachments: origin.attachments })) : (_jsx("div", { className: "max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-[var(--wui-radius-sm)] border border-[var(--wui-border)] bg-[var(--wui-bg)] px-2.5 py-2 text-[13px] text-[var(--wui-fg)]", children: formatValue(origin.value) }))] }), hasFull && (_jsxs("div", { className: "mt-2", children: [_jsxs("button", { type: "button", onClick: () => setShowAll((o) => !o), className: "inline-flex items-center gap-1 text-[11px] font-medium text-[var(--wui-fg-muted)] transition-colors hover:text-[var(--wui-fg)]", children: [_jsx("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2.25, strokeLinecap: "round", strokeLinejoin: "round", className: cn('transition-transform', showAll && 'rotate-90'), children: _jsx("polyline", { points: "9 18 15 12 9 6" }) }), showAll ? `Hide full ${fullLabel}` : `View full ${fullLabel}`] }), showAll && (_jsx("pre", { className: "mt-1.5 max-h-60 overflow-auto rounded-[var(--wui-radius-sm)] border border-[var(--wui-border)] bg-[var(--wui-bg)] px-2.5 py-2 text-[11.5px] leading-relaxed text-[var(--wui-fg)]", children: formatValue(fullData) }))] }))] }));
87
+ }
88
+ function formatValue(value) {
89
+ if (value === undefined)
90
+ return '—';
91
+ if (value === null)
92
+ return 'null';
93
+ if (typeof value === 'string')
94
+ return value.length ? value : '(empty)';
95
+ if (Array.isArray(value))
96
+ return value.map((v) => formatValue(v)).join(', ');
97
+ if (typeof value === 'object') {
98
+ try {
99
+ return JSON.stringify(value, null, 2);
100
+ }
101
+ catch {
102
+ return String(value);
103
+ }
104
+ }
105
+ return String(value);
106
+ }
107
+ //# sourceMappingURL=OriginTrace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OriginTrace.js","sourceRoot":"","sources":["../../../../src/components/execution/origin/OriginTrace.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Value-origin resolution — derive "where did this value come from" entirely
3
+ * from the workflow definition (refs intact) + step outputs, both already
4
+ * loaded with an execution. No persistence, no extra fetches.
5
+ *
6
+ * Origins are the canonical `{{refs}}`; `parseRef` (SDK) turns a ref into
7
+ * source/stepId/path. Everything funnels through `getOriginRefs` and
8
+ * `resolveRef` so future tiers (author-tagged, agent-cited) layer in as a
9
+ * preferred provider — see plan "Forward-compat".
10
+ *
11
+ * Wiring a new reviewer surface: the resolver is generic, but each surface still
12
+ * enumerates the field values it renders. To make a new step's fields citable in
13
+ * review, for each visible field mount `<OriginChipFor raw={value}
14
+ * citations={getFieldCitations(stepConfig, citations, fieldPath)} … />`. There is
15
+ * deliberately no step-type switch here — resolution is value/ref-driven.
16
+ */
17
+ import type { WorkflowConfig, WorkflowStepConfig, Citation } from '@xyne/workflow-sdk/builder';
18
+ import type { ExecutionDetail } from '@xyne/workflow-sdk/client';
19
+ import type { Attachment } from '@xyne/workflow-sdk';
20
+ /**
21
+ * Where the value comes from — a *structural* classification from the ref
22
+ * grammar (`parseRef`), NOT the producing step's type. Framework-agnostic: the
23
+ * resolver never special-cases specific step types.
24
+ */
25
+ export type OriginKind = 'step' | 'trigger';
26
+ /** Provenance tier. Only `derived` today; `author`/`agent` layer in later. */
27
+ export type OriginTier = 'derived';
28
+ /** A step's documentation group (StepGroup), when it belongs to one. */
29
+ export interface OriginGroup {
30
+ title: string;
31
+ description?: string | undefined;
32
+ }
33
+ export interface ResolvedOrigin {
34
+ /** The raw ref this origin came from. */
35
+ refPath: string;
36
+ tier: OriginTier;
37
+ /** Human label — producing step title (or "the original request" for trigger). */
38
+ label: string;
39
+ /** The producing step's description (documentation), when set. */
40
+ stepDescription?: string | undefined;
41
+ /** The producing step's documentation group, when it belongs to one. */
42
+ group?: OriginGroup | undefined;
43
+ /** The live value at the source (walked from step output / trigger data). */
44
+ value: unknown;
45
+ /** When the resolved value is a file (or files), the attachment(s) to render. */
46
+ attachments?: Attachment[] | undefined;
47
+ kind: OriginKind;
48
+ /** Producing step id, when the ref targets a step. */
49
+ stepId?: string | undefined;
50
+ /** Sub-path within the source, e.g. `output.body.status`. */
51
+ path?: string | undefined;
52
+ /** Refs feeding the producing step — drives upstream ("trace back") recursion. */
53
+ upstreamRefs: string[];
54
+ }
55
+ /**
56
+ * Accessors the resolver needs, built from data already in hand. Both surfaces
57
+ * (ExecutionViewer, ApprovalsView) construct this from their `ExecutionDetail`.
58
+ */
59
+ export interface OriginResolverCtx {
60
+ stepTitle: (stepId: string) => string | undefined;
61
+ stepDescription: (stepId: string) => string | undefined;
62
+ /** The step's documentation group (resolved via groupId → workflow groups). */
63
+ stepGroup: (stepId: string) => OriginGroup | undefined;
64
+ stepOutput: (stepId: string) => unknown;
65
+ stepRawConfig: (stepId: string) => unknown;
66
+ triggerData: unknown;
67
+ /** Human label for the trigger, varied by trigger type. Defaults sensibly. */
68
+ triggerLabel?: string | undefined;
69
+ /** Navigate to the producing step (viewer only). */
70
+ onJump?: ((stepId: string) => void) | undefined;
71
+ }
72
+ /**
73
+ * Single funnel for "which refs explain this value". Today: extract every
74
+ * `{{ref}}` from the raw value via the SDK's `collectRefs`. (Future: prefer
75
+ * author-tagged `section.citations` here — one added branch.)
76
+ */
77
+ export declare function getOriginRefs(rawValue: unknown): string[];
78
+ export declare function resolveRef(refPath: string, ctx: OriginResolverCtx): ResolvedOrigin;
79
+ /**
80
+ * The author citations relevant to a rendered field, looked up by its stable
81
+ * {@link tryCitationPath} into the step config. Read-only; returns [] when none.
82
+ *
83
+ * Prefix-aware: returns citations attached to the field's own path **and** to any
84
+ * node beneath it (e.g. the reviewer renders the `display[id]` row while the
85
+ * author cited `display[id].value`). This decouples author-write granularity from
86
+ * reviewer-read granularity, so neither side hardcodes the other's shape.
87
+ */
88
+ export declare function getFieldCitations(stepConfig: Record<string, unknown> | undefined, citations: Record<string, Citation[]> | undefined, fieldPath: string): Citation[];
89
+ /**
90
+ * Flatten a workflow config's steps (incl. nested branches/loops/cases) → id →
91
+ * config. Delegates traversal to the canonical {@link walkStepConfigs} — the same
92
+ * structural walker the metadata cache and canvas use — so a new control-flow
93
+ * step type is covered automatically, with no nesting keys hardcoded here.
94
+ */
95
+ export declare function buildStepConfigMap(config: WorkflowConfig | undefined): Map<string, WorkflowStepConfig>;
96
+ export declare function buildOriginCtx(detail: ExecutionDetail, onJump?: (stepId: string) => void): OriginResolverCtx;
97
+ /** The raw config of the step currently paused awaiting approval (EXTERNAL_WAIT). */
98
+ export declare function findPausedStepConfig(detail: ExecutionDetail): WorkflowStepConfig | undefined;
99
+ //# sourceMappingURL=origin-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin-resolver.d.ts","sourceRoot":"","sources":["../../../../src/components/execution/origin/origin-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ import { collectRefs, parseRef, tryCitationPath } from '@xyne/workflow-sdk/builder';
2
+ import { walkStepConfigs } from '../../../utils/branch-detection.js';
3
+ import { isAttachment, isAttachmentArray } from '../../shared/AttachmentCard.js';
4
+ // ─── Funnel: which refs explain a value ───
5
+ /**
6
+ * Single funnel for "which refs explain this value". Today: extract every
7
+ * `{{ref}}` from the raw value via the SDK's `collectRefs`. (Future: prefer
8
+ * author-tagged `section.citations` here — one added branch.)
9
+ */
10
+ export function getOriginRefs(rawValue) {
11
+ if (rawValue == null)
12
+ return [];
13
+ const refs = collectRefs(rawValue, '').map((r) => r.refPath);
14
+ return [...new Set(refs)];
15
+ }
16
+ // ─── Resolve one ref against the execution data ───
17
+ function walkPath(root, path) {
18
+ if (!path)
19
+ return root;
20
+ let cur = root;
21
+ for (const seg of path.split('.')) {
22
+ if (cur == null || typeof cur !== 'object')
23
+ return undefined;
24
+ cur = cur[seg];
25
+ }
26
+ return cur;
27
+ }
28
+ /** Attachment(s) when a resolved value is a file or file array, else undefined. */
29
+ function attachmentsOf(value) {
30
+ if (isAttachmentArray(value))
31
+ return value;
32
+ if (isAttachment(value))
33
+ return [value];
34
+ return undefined;
35
+ }
36
+ export function resolveRef(refPath, ctx) {
37
+ const parsed = parseRef(refPath);
38
+ if (parsed.source === 'trigger') {
39
+ const value = walkPath(ctx.triggerData, parsed.path);
40
+ return {
41
+ refPath,
42
+ tier: 'derived',
43
+ label: ctx.triggerLabel ?? 'the original request',
44
+ kind: 'trigger',
45
+ path: parsed.path,
46
+ value,
47
+ attachments: attachmentsOf(value),
48
+ upstreamRefs: [],
49
+ };
50
+ }
51
+ // source === 'step' — classified structurally, never by step type.
52
+ const stepId = parsed.stepId;
53
+ const output = stepId ? ctx.stepOutput(stepId) : undefined;
54
+ const value = parsed.path ? walkPath({ output }, parsed.path) : output;
55
+ return {
56
+ refPath,
57
+ tier: 'derived',
58
+ label: (stepId && ctx.stepTitle(stepId)) || stepId || 'an earlier step',
59
+ stepDescription: stepId ? ctx.stepDescription(stepId) : undefined,
60
+ group: stepId ? ctx.stepGroup(stepId) : undefined,
61
+ kind: 'step',
62
+ stepId,
63
+ path: parsed.path,
64
+ value,
65
+ attachments: attachmentsOf(value),
66
+ upstreamRefs: stepId ? getOriginRefs(ctx.stepRawConfig(stepId)) : [],
67
+ };
68
+ }
69
+ // ─── Author citations (overlay lookup) ───
70
+ /**
71
+ * The author citations relevant to a rendered field, looked up by its stable
72
+ * {@link tryCitationPath} into the step config. Read-only; returns [] when none.
73
+ *
74
+ * Prefix-aware: returns citations attached to the field's own path **and** to any
75
+ * node beneath it (e.g. the reviewer renders the `display[id]` row while the
76
+ * author cited `display[id].value`). This decouples author-write granularity from
77
+ * reviewer-read granularity, so neither side hardcodes the other's shape.
78
+ */
79
+ export function getFieldCitations(stepConfig, citations, fieldPath) {
80
+ if (!stepConfig || !citations)
81
+ return [];
82
+ const path = tryCitationPath(stepConfig, fieldPath);
83
+ if (!path)
84
+ return [];
85
+ const out = [];
86
+ for (const [key, list] of Object.entries(citations)) {
87
+ // exact, descendant object key (`path.`), or descendant array element (`path[`)
88
+ if (key === path || key.startsWith(`${path}.`) || key.startsWith(`${path}[`)) {
89
+ out.push(...list);
90
+ }
91
+ }
92
+ return out;
93
+ }
94
+ // ─── Build a resolver ctx from an ExecutionDetail (refs + outputs in hand) ───
95
+ /**
96
+ * Flatten a workflow config's steps (incl. nested branches/loops/cases) → id →
97
+ * config. Delegates traversal to the canonical {@link walkStepConfigs} — the same
98
+ * structural walker the metadata cache and canvas use — so a new control-flow
99
+ * step type is covered automatically, with no nesting keys hardcoded here.
100
+ */
101
+ export function buildStepConfigMap(config) {
102
+ const map = new Map();
103
+ if (config?.steps)
104
+ walkStepConfigs(config.steps, (s) => map.set(s.id, s));
105
+ return map;
106
+ }
107
+ /** Map a step record's `stepName` (step_N or a config id) to its config id. */
108
+ function resolveStepId(stepName, config, configMap) {
109
+ if (configMap.has(stepName))
110
+ return stepName;
111
+ const m = /^step_(\d+)$/.exec(stepName);
112
+ if (m && config?.steps) {
113
+ const idx = Number(m[1]);
114
+ const id = config.steps[idx]?.id;
115
+ if (id)
116
+ return id;
117
+ }
118
+ return stepName;
119
+ }
120
+ export function buildOriginCtx(detail, onJump) {
121
+ const config = detail.config;
122
+ const configMap = buildStepConfigMap(config);
123
+ // groupId → group (workflow documentation groups)
124
+ const groupsById = new Map();
125
+ for (const g of (config?.groups ?? [])) {
126
+ groupsById.set(g.id, { title: g.title, description: g.description });
127
+ }
128
+ const groupFor = (id) => {
129
+ const gid = configMap.get(id)?.groupId;
130
+ return gid ? groupsById.get(gid) : undefined;
131
+ };
132
+ // stepId → output, parsed from each step record's data JSON.
133
+ const outputs = new Map();
134
+ for (const step of detail.steps) {
135
+ if (!step.data)
136
+ continue;
137
+ let parsed;
138
+ try {
139
+ parsed = JSON.parse(step.data);
140
+ }
141
+ catch {
142
+ continue;
143
+ }
144
+ const id = resolveStepId(step.stepName, config, configMap);
145
+ if ('output' in parsed)
146
+ outputs.set(id, parsed['output']);
147
+ }
148
+ return {
149
+ stepTitle: (id) => configMap.get(id)?.title,
150
+ stepDescription: (id) => configMap.get(id)?.description,
151
+ stepGroup: groupFor,
152
+ stepOutput: (id) => outputs.get(id),
153
+ stepRawConfig: (id) => configMap.get(id)?.config,
154
+ triggerData: detail.triggerData,
155
+ triggerLabel: triggerLabelFor(config?.trigger?.type),
156
+ onJump,
157
+ };
158
+ }
159
+ /**
160
+ * A human label for where the trigger data came from, varied by trigger type
161
+ * (a scheduled run isn't "the original request"). Falls back gracefully.
162
+ */
163
+ function triggerLabelFor(type) {
164
+ switch (type) {
165
+ case 'MANUAL':
166
+ return 'the original request';
167
+ case 'CRON':
168
+ return 'the scheduled run';
169
+ case 'WEBHOOK':
170
+ case 'EVENT':
171
+ return 'the incoming request';
172
+ default:
173
+ return 'the trigger';
174
+ }
175
+ }
176
+ /** The raw config of the step currently paused awaiting approval (EXTERNAL_WAIT). */
177
+ export function findPausedStepConfig(detail) {
178
+ const waitStep = detail.steps.find((s) => s.status === 'EXTERNAL_WAIT');
179
+ if (!waitStep)
180
+ return undefined;
181
+ const configMap = buildStepConfigMap(detail.config);
182
+ const id = resolveStepId(waitStep.stepName, detail.config, configMap);
183
+ return configMap.get(id);
184
+ }
185
+ //# sourceMappingURL=origin-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin-resolver.js","sourceRoot":"","sources":["../../../../src/components/execution/origin/origin-resolver.ts"],"names":[],"mappings":"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"}
@@ -15,4 +15,14 @@ export declare function AttachmentCard({ attachment }: {
15
15
  export declare function AttachmentList({ attachments }: {
16
16
  attachments: Attachment[];
17
17
  }): import("react").JSX.Element;
18
+ /**
19
+ * Render a reviewer-facing display value: attachment(s) become download/preview
20
+ * cards; everything else falls back to a text box (`className` styles that box).
21
+ * Generic — detected from the value shape, so a display section bound to
22
+ * `{{…attachments}}` shows the file instead of "[object Object]".
23
+ */
24
+ export declare function DisplayValue({ value, className }: {
25
+ value: unknown;
26
+ className?: string;
27
+ }): import("react").JSX.Element;
18
28
  //# sourceMappingURL=AttachmentCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AttachmentCard.d.ts","sourceRoot":"","sources":["../../../src/components/shared/AttachmentCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CASxD;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,EAAE,CAE/D;AASD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,+BAsDxE;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,+BAQ5E"}
1
+ {"version":3,"file":"AttachmentCard.d.ts","sourceRoot":"","sources":["../../../src/components/shared/AttachmentCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CASxD;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,EAAE,CAE/D;AASD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,+BAsDxE;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,+BAQ5E;AAaD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAIxF"}
@@ -53,4 +53,35 @@ export function AttachmentCard({ attachment }) {
53
53
  export function AttachmentList({ attachments }) {
54
54
  return (_jsx("div", { className: "space-y-2", children: attachments.map((att, i) => (_jsx(AttachmentCard, { attachment: att }, `${att.data}-${i}`))) }));
55
55
  }
56
+ /** Text rendering for a non-attachment display value. */
57
+ function formatScalar(value) {
58
+ if (value == null)
59
+ return '—';
60
+ if (typeof value === 'string')
61
+ return value;
62
+ if (Array.isArray(value))
63
+ return value.map(String).join(', ');
64
+ if (typeof value === 'object') {
65
+ try {
66
+ return JSON.stringify(value, null, 2);
67
+ }
68
+ catch {
69
+ return String(value);
70
+ }
71
+ }
72
+ return String(value);
73
+ }
74
+ /**
75
+ * Render a reviewer-facing display value: attachment(s) become download/preview
76
+ * cards; everything else falls back to a text box (`className` styles that box).
77
+ * Generic — detected from the value shape, so a display section bound to
78
+ * `{{…attachments}}` shows the file instead of "[object Object]".
79
+ */
80
+ export function DisplayValue({ value, className }) {
81
+ if (isAttachment(value))
82
+ return _jsx(AttachmentCard, { attachment: value });
83
+ if (isAttachmentArray(value))
84
+ return _jsx(AttachmentList, { attachments: value });
85
+ return _jsx("div", { className: className, children: formatScalar(value) });
86
+ }
56
87
  //# sourceMappingURL=AttachmentCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AttachmentCard.js","sourceRoot":"","sources":["../../../src/components/shared/AttachmentCard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AttachmentCard.js","sourceRoot":"","sources":["../../../src/components/shared/AttachmentCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { AiBuilderMessage } from '@xyne/workflow-sdk/ai-builder';
2
+ export interface SharedChatPanelProps {
3
+ isOpen: boolean;
4
+ messages: AiBuilderMessage[];
5
+ isLoading: boolean;
6
+ error: string | null;
7
+ draft: string;
8
+ onDraftChange: (value: string) => void;
9
+ onSend: () => Promise<void>;
10
+ onReset: () => void;
11
+ onClose: () => void;
12
+ suggestions: string[];
13
+ emptyStateDescription: string;
14
+ placeholder?: string;
15
+ canSend: boolean;
16
+ bannerSlot?: React.ReactNode;
17
+ inputPrefixSlot?: React.ReactNode;
18
+ containerStyle?: React.CSSProperties;
19
+ containerClassName?: string;
20
+ }
21
+ export declare function SharedChatPanel({ isOpen, messages, isLoading, error, draft, onDraftChange, onSend, onReset, onClose, suggestions, emptyStateDescription, placeholder, canSend, bannerSlot, inputPrefixSlot, containerStyle, containerClassName, }: SharedChatPanelProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=ChatPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../../src/components/shared/ChatPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAqCtE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACrC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,SAAS,EACT,KAAK,EACL,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,OAAO,EACP,WAAW,EACX,qBAAqB,EACrB,WAA6B,EAC7B,OAAO,EACP,UAAU,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,GACnB,EAAE,oBAAoB,+BA2MtB"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef } from 'react';
3
+ import { cn } from './cn.js';
4
+ // Renders a single line of markdown-lite: **bold**, `code`, plain text
5
+ function InlineMd({ text }) {
6
+ const parts = text.split(/(\*\*[^*\n]+\*\*|`[^`\n]+`)/g);
7
+ return (_jsx(_Fragment, { children: parts.map((part, i) => {
8
+ if (part.startsWith('**') && part.endsWith('**') && part.length > 4)
9
+ return _jsx("strong", { className: "font-semibold", children: part.slice(2, -2) }, i);
10
+ if (part.startsWith('`') && part.endsWith('`') && part.length > 2)
11
+ return _jsx("code", { className: "rounded bg-black/10 px-1 font-mono text-[11px]", children: part.slice(1, -1) }, i);
12
+ return _jsx("span", { children: part }, i);
13
+ }) }));
14
+ }
15
+ // Renders markdown text: splits on newlines, handles --- dividers
16
+ function MarkdownText({ text }) {
17
+ const lines = text.split('\n');
18
+ return (_jsx("div", { className: "space-y-0.5", children: lines.map((line, i) => {
19
+ if (/^-{3,}$/.test(line.trim()))
20
+ return _jsx("hr", { className: "my-1.5 border-[var(--wui-border)]" }, i);
21
+ return (_jsx("p", { className: line === '' ? 'h-2' : undefined, children: _jsx(InlineMd, { text: line }) }, i));
22
+ }) }));
23
+ }
24
+ export function SharedChatPanel({ isOpen, messages, isLoading, error, draft, onDraftChange, onSend, onReset, onClose, suggestions, emptyStateDescription, placeholder = 'Ask anything…', canSend, bannerSlot, inputPrefixSlot, containerStyle, containerClassName, }) {
25
+ const messagesEndRef = useRef(null);
26
+ const textareaRef = useRef(null);
27
+ useEffect(() => {
28
+ messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
29
+ }, [messages]);
30
+ useEffect(() => {
31
+ if (!isOpen)
32
+ return;
33
+ const id = setTimeout(() => textareaRef.current?.focus(), 180);
34
+ return () => clearTimeout(id);
35
+ }, [isOpen]);
36
+ const handleKeyDown = useCallback((e) => {
37
+ if (e.key === 'Enter' && !e.shiftKey) {
38
+ e.preventDefault();
39
+ void onSend();
40
+ }
41
+ }, [onSend]);
42
+ return (_jsx("div", { className: cn('flex h-full flex-col border-l border-[var(--wui-border)] bg-[var(--wui-bg)] overflow-hidden', containerClassName), style: containerStyle, children: isOpen && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between border-b border-[var(--wui-border)] px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-md bg-indigo-100 text-indigo-600", children: _jsx("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }) }), _jsx("span", { className: "text-[13px] font-semibold text-[var(--wui-fg)]", children: "Ask AI" })] }), _jsxs("div", { className: "flex items-center gap-1", children: [messages.length > 0 && (_jsx("button", { type: "button", onClick: onReset, title: "Clear conversation", className: "flex h-6 w-6 items-center justify-center rounded text-[var(--wui-fg-muted)] hover:bg-[var(--wui-bg-subtle)] transition-colors", children: _jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", children: _jsx("path", { d: "M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }) }) })), _jsx("button", { type: "button", onClick: onClose, title: "Close", className: "flex h-6 w-6 items-center justify-center rounded text-[var(--wui-fg-muted)] hover:bg-[var(--wui-bg-subtle)] transition-colors", children: _jsxs("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", children: [_jsx("path", { d: "M18 6 6 18" }), _jsx("path", { d: "m6 6 12 12" })] }) })] })] }), bannerSlot, _jsxs("div", { className: "flex-1 overflow-y-auto px-4 py-3 space-y-3", children: [messages.length === 0 && (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-3 py-8 text-center", children: [_jsx("span", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-indigo-50 text-indigo-400", children: _jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }) }), _jsx("p", { className: "max-w-[220px] text-[12px] text-[var(--wui-fg-muted)]", children: emptyStateDescription }), suggestions.length > 0 && (_jsx("div", { className: "flex w-full flex-col gap-1.5", children: suggestions.map((s) => (_jsx("button", { type: "button", onClick: () => onDraftChange(s), className: "rounded-lg border border-[var(--wui-border)] bg-[var(--wui-bg-subtle)] px-3 py-2 text-left text-[11px] text-[var(--wui-fg-muted)] transition hover:bg-indigo-50 hover:border-indigo-200 hover:text-indigo-700", children: s }, s))) }))] })), messages.map((msg, i) => {
43
+ // Strip embedded <document> XML so filenames show as chips, not raw text
44
+ const docNames = [];
45
+ const visibleText = msg.content
46
+ .replace(/<document name="([^"]+)">[\s\S]*?<\/document>/g, (_, name) => {
47
+ docNames.push(name);
48
+ return '';
49
+ })
50
+ .trim();
51
+ return (_jsx("div", { className: cn('flex', msg.role === 'user' ? 'justify-end' : 'justify-start'), children: _jsxs("div", { className: cn('max-w-[85%] rounded-2xl px-3 py-2 text-[13px] leading-relaxed space-y-1.5', msg.role === 'user'
52
+ ? 'bg-indigo-600 text-white rounded-br-sm'
53
+ : 'bg-[var(--wui-bg-subtle)] text-[var(--wui-fg)] rounded-bl-sm border border-[var(--wui-border)]'), children: [docNames.map((name) => (_jsxs("div", { className: "flex items-center gap-1.5 rounded-lg bg-white/20 px-2 py-1", children: [_jsxs("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "shrink-0", 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("span", { className: "text-xs font-medium truncate", children: name })] }, name))), visibleText && (msg.role === 'assistant'
54
+ ? _jsx(MarkdownText, { text: visibleText })
55
+ : _jsx("p", { className: "whitespace-pre-wrap", children: visibleText }))] }) }, i));
56
+ }), isLoading && (_jsx("div", { className: "flex justify-start", children: _jsx("div", { className: "rounded-2xl rounded-bl-sm border border-[var(--wui-border)] bg-[var(--wui-bg-subtle)] px-3 py-2", children: _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-[var(--wui-fg-muted)] animate-bounce [animation-delay:0ms]" }), _jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-[var(--wui-fg-muted)] animate-bounce [animation-delay:150ms]" }), _jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-[var(--wui-fg-muted)] animate-bounce [animation-delay:300ms]" })] }) }) })), error && (_jsx("div", { className: "rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-[12px] text-red-600", children: error })), _jsx("div", { ref: messagesEndRef })] }), _jsxs("div", { className: "shrink-0 border-t border-[var(--wui-border)] p-3 space-y-2", children: [_jsxs("div", { className: "flex items-end gap-2 rounded-xl border border-[var(--wui-border)] bg-[var(--wui-bg-subtle)] px-3 py-2.5 focus-within:border-indigo-300 focus-within:bg-[var(--wui-bg)] transition-colors", children: [inputPrefixSlot, _jsx("textarea", { ref: textareaRef, value: draft, onChange: (e) => {
57
+ onDraftChange(e.target.value);
58
+ e.target.style.height = 'auto';
59
+ e.target.style.height = `${Math.min(e.target.scrollHeight, 96)}px`;
60
+ }, onKeyDown: handleKeyDown, placeholder: placeholder, rows: 1, className: "flex-1 resize-none bg-transparent text-[13px] text-[var(--wui-fg)] placeholder:text-[var(--wui-fg-muted)] outline-none", style: { minHeight: '22px', maxHeight: '96px' } }), _jsx("button", { type: "button", onClick: () => void onSend(), disabled: !canSend || isLoading, className: cn('flex h-7 w-7 flex-shrink-0 self-end items-center justify-center rounded-lg transition-all', canSend && !isLoading
61
+ ? 'bg-indigo-600 text-white hover:bg-indigo-700 active:scale-95'
62
+ : 'bg-[var(--wui-bg-subtle)] text-[var(--wui-fg-muted)] cursor-not-allowed border border-[var(--wui-border)]'), children: _jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M22 2 11 13M22 2 15 22l-4-9-9-4 20-7z" }) }) })] }), _jsx("p", { className: "text-center text-[10px] text-[var(--wui-fg-muted)]", children: "Enter to send \u00B7 Shift+Enter for newline" })] })] })) }));
63
+ }
64
+ //# sourceMappingURL=ChatPanel.js.map