@xyne/workflow-ui 1.3.26 → 1.3.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/builder/AddStepButton.d.ts +6 -0
- package/dist/components/builder/AddStepButton.d.ts.map +1 -0
- package/dist/components/builder/AddStepButton.js +7 -0
- package/dist/components/builder/AddStepButton.js.map +1 -0
- package/dist/components/builder/BranchEdge.d.ts +3 -0
- package/dist/components/builder/BranchEdge.d.ts.map +1 -0
- package/dist/components/builder/BranchEdge.js +19 -0
- package/dist/components/builder/BranchEdge.js.map +1 -0
- package/dist/components/builder/BuilderToolbar.d.ts +10 -0
- package/dist/components/builder/BuilderToolbar.d.ts.map +1 -0
- package/dist/components/builder/BuilderToolbar.js +16 -0
- package/dist/components/builder/BuilderToolbar.js.map +1 -0
- package/dist/components/builder/StepConfigDrawer.d.ts +11 -0
- package/dist/components/builder/StepConfigDrawer.d.ts.map +1 -0
- package/dist/components/builder/StepConfigDrawer.js +21 -0
- package/dist/components/builder/StepConfigDrawer.js.map +1 -0
- package/dist/components/builder/StepNode.d.ts +15 -0
- package/dist/components/builder/StepNode.d.ts.map +1 -0
- package/dist/components/builder/StepNode.js +56 -0
- package/dist/components/builder/StepNode.js.map +1 -0
- package/dist/components/builder/StepPalette.d.ts +7 -0
- package/dist/components/builder/StepPalette.d.ts.map +1 -0
- package/dist/components/builder/StepPalette.js +83 -0
- package/dist/components/builder/StepPalette.js.map +1 -0
- package/dist/components/builder/StepPicker.d.ts +9 -0
- package/dist/components/builder/StepPicker.d.ts.map +1 -0
- package/dist/components/builder/StepPicker.js +95 -0
- package/dist/components/builder/StepPicker.js.map +1 -0
- package/dist/components/builder/TriggerConfigPanel.d.ts +10 -0
- package/dist/components/builder/TriggerConfigPanel.d.ts.map +1 -0
- package/dist/components/builder/TriggerConfigPanel.js +49 -0
- package/dist/components/builder/TriggerConfigPanel.js.map +1 -0
- package/dist/components/builder/TriggerNode.d.ts +9 -0
- package/dist/components/builder/TriggerNode.d.ts.map +1 -0
- package/dist/components/builder/TriggerNode.js +30 -0
- package/dist/components/builder/TriggerNode.js.map +1 -0
- package/dist/components/builder/TriggerPicker.d.ts +8 -0
- package/dist/components/builder/TriggerPicker.d.ts.map +1 -0
- package/dist/components/builder/TriggerPicker.js +61 -0
- package/dist/components/builder/TriggerPicker.js.map +1 -0
- package/dist/components/builder/WorkflowBuilder.d.ts +20 -0
- package/dist/components/builder/WorkflowBuilder.d.ts.map +1 -0
- package/dist/components/builder/WorkflowBuilder.js +157 -0
- package/dist/components/builder/WorkflowBuilder.js.map +1 -0
- package/dist/components/builder/edge-types.d.ts +3 -0
- package/dist/components/builder/edge-types.d.ts.map +1 -0
- package/dist/components/builder/edge-types.js +5 -0
- package/dist/components/builder/edge-types.js.map +1 -0
- package/dist/components/builder/node-types.d.ts +3 -0
- package/dist/components/builder/node-types.d.ts.map +1 -0
- package/dist/components/builder/node-types.js +11 -0
- package/dist/components/builder/node-types.js.map +1 -0
- package/dist/components/builder/v2/AddStepButton.d.ts +6 -0
- package/dist/components/builder/v2/AddStepButton.d.ts.map +1 -0
- package/dist/components/builder/v2/AddStepButton.js +6 -0
- package/dist/components/builder/v2/AddStepButton.js.map +1 -0
- package/dist/components/builder/v2/BranchEdge.d.ts +3 -0
- package/dist/components/builder/v2/BranchEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/BranchEdge.js +46 -0
- package/dist/components/builder/v2/BranchEdge.js.map +1 -0
- package/dist/components/builder/v2/LoopBodyEdge.d.ts +7 -0
- package/dist/components/builder/v2/LoopBodyEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/LoopBodyEdge.js +19 -0
- package/dist/components/builder/v2/LoopBodyEdge.js.map +1 -0
- package/dist/components/builder/v2/LoopbackEdge.d.ts +10 -0
- package/dist/components/builder/v2/LoopbackEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/LoopbackEdge.js +26 -0
- package/dist/components/builder/v2/LoopbackEdge.js.map +1 -0
- package/dist/components/builder/v2/StepNode.d.ts +21 -0
- package/dist/components/builder/v2/StepNode.d.ts.map +1 -0
- package/dist/components/builder/v2/StepNode.js +36 -0
- package/dist/components/builder/v2/StepNode.js.map +1 -0
- package/dist/components/builder/v2/StepPicker.d.ts +8 -0
- package/dist/components/builder/v2/StepPicker.d.ts.map +1 -0
- package/dist/components/builder/v2/StepPicker.js +73 -0
- package/dist/components/builder/v2/StepPicker.js.map +1 -0
- package/dist/components/builder/v2/TerminalNode.d.ts +6 -0
- package/dist/components/builder/v2/TerminalNode.d.ts.map +1 -0
- package/dist/components/builder/v2/TerminalNode.js +7 -0
- package/dist/components/builder/v2/TerminalNode.js.map +1 -0
- package/dist/components/builder/v2/TriggerNode.d.ts +10 -0
- package/dist/components/builder/v2/TriggerNode.d.ts.map +1 -0
- package/dist/components/builder/v2/TriggerNode.js +20 -0
- package/dist/components/builder/v2/TriggerNode.js.map +1 -0
- package/dist/components/builder/v2/TriggerPicker.d.ts +7 -0
- package/dist/components/builder/v2/TriggerPicker.d.ts.map +1 -0
- package/dist/components/builder/v2/TriggerPicker.js +45 -0
- package/dist/components/builder/v2/TriggerPicker.js.map +1 -0
- package/dist/components/builder/v2/WorkflowBuilder.d.ts +14 -0
- package/dist/components/builder/v2/WorkflowBuilder.d.ts.map +1 -0
- package/dist/components/builder/v2/WorkflowBuilder.js +189 -0
- package/dist/components/builder/v2/WorkflowBuilder.js.map +1 -0
- package/dist/components/builder/v2/edge-types.d.ts +3 -0
- package/dist/components/builder/v2/edge-types.d.ts.map +1 -0
- package/dist/components/builder/v2/edge-types.js +9 -0
- package/dist/components/builder/v2/edge-types.js.map +1 -0
- package/dist/components/builder/v2/icons.d.ts +25 -0
- package/dist/components/builder/v2/icons.d.ts.map +1 -0
- package/dist/components/builder/v2/icons.js +43 -0
- package/dist/components/builder/v2/icons.js.map +1 -0
- package/dist/components/builder/v2/layout-engine.d.ts +76 -0
- package/dist/components/builder/v2/layout-engine.d.ts.map +1 -0
- package/dist/components/builder/v2/layout-engine.js +465 -0
- package/dist/components/builder/v2/layout-engine.js.map +1 -0
- package/dist/components/builder/v2/node-types.d.ts +3 -0
- package/dist/components/builder/v2/node-types.d.ts.map +1 -0
- package/dist/components/builder/v2/node-types.js +11 -0
- package/dist/components/builder/v2/node-types.js.map +1 -0
- package/dist/components/builder/v2/theme.d.ts +28 -0
- package/dist/components/builder/v2/theme.d.ts.map +1 -0
- package/dist/components/builder/v2/theme.js +63 -0
- package/dist/components/builder/v2/theme.js.map +1 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.d.ts +11 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.d.ts.map +1 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.js +46 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.js.map +1 -0
- package/dist/components/execution/CitationSourcePanel.d.ts.map +1 -1
- package/dist/components/execution/CitationSourcePanel.js +28 -12
- package/dist/components/execution/CitationSourcePanel.js.map +1 -1
- package/dist/components/execution/ExecutionEdge.d.ts +4 -0
- package/dist/components/execution/ExecutionEdge.d.ts.map +1 -0
- package/dist/components/execution/ExecutionEdge.js +27 -0
- package/dist/components/execution/ExecutionEdge.js.map +1 -0
- package/dist/components/execution/ExecutionStepNode.d.ts +14 -0
- package/dist/components/execution/ExecutionStepNode.d.ts.map +1 -0
- package/dist/components/execution/ExecutionStepNode.js +47 -0
- package/dist/components/execution/ExecutionStepNode.js.map +1 -0
- package/dist/components/execution/ExecutionTabs.d.ts +26 -1
- package/dist/components/execution/ExecutionTabs.d.ts.map +1 -1
- package/dist/components/execution/ExecutionTabs.js +34 -19
- package/dist/components/execution/ExecutionTabs.js.map +1 -1
- package/dist/components/execution/ExecutionTriggerNode.d.ts +9 -0
- package/dist/components/execution/ExecutionTriggerNode.d.ts.map +1 -0
- package/dist/components/execution/ExecutionTriggerNode.js +15 -0
- package/dist/components/execution/ExecutionTriggerNode.js.map +1 -0
- package/dist/components/execution/ExecutionViewer.d.ts.map +1 -1
- package/dist/components/execution/ExecutionViewer.js +1 -1
- package/dist/components/execution/ExecutionViewer.js.map +1 -1
- package/dist/components/execution/StepAgentPanels.d.ts +9 -0
- package/dist/components/execution/StepAgentPanels.d.ts.map +1 -0
- package/dist/components/execution/StepAgentPanels.js +133 -0
- package/dist/components/execution/StepAgentPanels.js.map +1 -0
- package/dist/components/execution/execution-layout.d.ts +31 -0
- package/dist/components/execution/execution-layout.d.ts.map +1 -0
- package/dist/components/execution/execution-layout.js +90 -0
- package/dist/components/execution/execution-layout.js.map +1 -0
- package/dist/components/execution/origin/citation-resolver.js +1 -1
- package/dist/components/execution/origin/citation-resolver.js.map +1 -1
- package/dist/components/shared/JsonTreeViewer.d.ts +9 -0
- package/dist/components/shared/JsonTreeViewer.d.ts.map +1 -0
- package/dist/components/shared/JsonTreeViewer.js +46 -0
- package/dist/components/shared/JsonTreeViewer.js.map +1 -0
- package/dist/components/shared/viewers/CsvView.js +2 -2
- package/dist/components/shared/viewers/CsvView.js.map +1 -1
- package/dist/components/shared/viewers/DocxView.js +1 -1
- package/dist/components/shared/viewers/DocxView.js.map +1 -1
- package/dist/components/shared/viewers/HtmlView.js +1 -1
- package/dist/components/shared/viewers/HtmlView.js.map +1 -1
- package/dist/components/shared/viewers/TextView.js +3 -3
- package/dist/components/shared/viewers/TextView.js.map +1 -1
- package/dist/layout-engine/components.d.ts.map +1 -1
- package/dist/layout-engine/components.js +11 -3
- package/dist/layout-engine/components.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/components/schema-form/AttachmentField.d.ts +0 -16
- package/dist/components/schema-form/AttachmentField.d.ts.map +0 -1
- package/dist/components/schema-form/AttachmentField.js +0 -139
- package/dist/components/schema-form/AttachmentField.js.map +0 -1
- package/dist/components/share/ShareDialog.d.ts +0 -21
- package/dist/components/share/ShareDialog.d.ts.map +0 -1
- package/dist/components/share/ShareDialog.js +0 -98
- package/dist/components/share/ShareDialog.js.map +0 -1
- package/dist/utils/map-lanes.d.ts +0 -35
- package/dist/utils/map-lanes.d.ts.map +0 -1
- package/dist/utils/map-lanes.js +0 -48
- package/dist/utils/map-lanes.js.map +0 -1
|
@@ -0,0 +1,46 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowSummaryEditor.js","sourceRoot":"","sources":["../../../src/components/dashboard/WorkflowSummaryEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CitationSourcePanel.d.ts","sourceRoot":"","sources":["../../../src/components/execution/CitationSourcePanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CitationSourcePanel.d.ts","sourceRoot":"","sources":["../../../src/components/execution/CitationSourcePanel.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,KAAK,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AAYrF;;iFAEiF;AACjF,eAAO,MAAM,cAAc,GAAI,GAAG,iBAAiB,KAAG,MAMjC,CAAC;AAEtB,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAcD,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,UAAU,EACV,UAAU,EACV,KAAK,EACL,aAAa,EACb,SAAS,GACV,EAAE,wBAAwB,sCAsL1B"}
|
|
@@ -10,7 +10,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
10
10
|
* Every open document's viewer stays mounted (hidden when inactive) so switching
|
|
11
11
|
* tabs preserves each one's scroll and zoom.
|
|
12
12
|
*/
|
|
13
|
-
import { useEffect, useRef } from 'react';
|
|
13
|
+
import { useEffect, useRef, useState } from 'react';
|
|
14
|
+
import { createPortal } from 'react-dom';
|
|
14
15
|
import { SidePanelShell } from './SidePanelShell.js';
|
|
15
16
|
import { DocumentViewer } from '../shared/DocumentViewer.js';
|
|
16
17
|
import { StepOutputView } from './StepOutputView.js';
|
|
@@ -37,6 +38,7 @@ export const citationDocKey = (d) => d.kind === 'doc'
|
|
|
37
38
|
// Keying on the id would collapse two iterations into one tab.
|
|
38
39
|
: `step:${d.ref}`;
|
|
39
40
|
const CloseIcon = ({ size = 12 }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2.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" })] }));
|
|
41
|
+
const ExpandIcon = ({ size = 14 }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("polyline", { points: "15 3 21 3 21 9" }), _jsx("polyline", { points: "9 21 3 21 3 15" }), _jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10" }), _jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14" })] }));
|
|
40
42
|
export function CitationSourcePanel({ docs, activeKey, onSelect, onCloseTab, onCloseAll, width, onWidthChange, className, }) {
|
|
41
43
|
const client = useWorkflowClient();
|
|
42
44
|
// The provider is mounted above this panel in the run view, so a step tab can
|
|
@@ -44,6 +46,7 @@ export function CitationSourcePanel({ docs, activeKey, onSelect, onCloseTab, onC
|
|
|
44
46
|
const originCtx = useCitationOrigin();
|
|
45
47
|
const scrollerRef = useRef(null);
|
|
46
48
|
const activeTabRef = useRef(null);
|
|
49
|
+
const [full, setFull] = useState(false);
|
|
47
50
|
// Opening/activating a document should bring its tab into view — it may sit
|
|
48
51
|
// off-screen to the right when many are open. Scroll only the strip, not the page.
|
|
49
52
|
useEffect(() => {
|
|
@@ -58,9 +61,28 @@ export function CitationSourcePanel({ docs, activeKey, onSelect, onCloseTab, onC
|
|
|
58
61
|
else if (tr.right > sr.right)
|
|
59
62
|
s.scrollBy({ left: tr.right - sr.right + 8, behavior: 'smooth' });
|
|
60
63
|
}, [activeKey]);
|
|
64
|
+
// Full-screen preview closes on Escape.
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (!full)
|
|
67
|
+
return;
|
|
68
|
+
const onKey = (e) => { if (e.key === 'Escape')
|
|
69
|
+
setFull(false); };
|
|
70
|
+
window.addEventListener('keydown', onKey);
|
|
71
|
+
return () => { window.removeEventListener('keydown', onKey); };
|
|
72
|
+
}, [full]);
|
|
61
73
|
if (docs.length === 0)
|
|
62
74
|
return null;
|
|
63
75
|
const active = docs.find((d) => citationDocKey(d) === activeKey) ?? docs[0];
|
|
76
|
+
// One viewer-render path shared by the side panel and the full-screen overlay.
|
|
77
|
+
const renderDoc = (d) => d.kind === 'doc' ? (_jsx(DocumentViewer, { url: client.uploads.url(d.attachment), mimeType: d.attachment.mimeType, name: d.attachment.name, anchor: d.anchor }, `${String(d.attachment.data)}#${JSON.stringify(d.anchor ?? {})}`)) : (_jsx(StepOutputView
|
|
78
|
+
// Resolved from the ref prefix rather than `stepOutput(stepId)`: under
|
|
79
|
+
// MAP/LOOP a bare id names N iterations, and only the ref says which one.
|
|
80
|
+
, {
|
|
81
|
+
// Resolved from the ref prefix rather than `stepOutput(stepId)`: under
|
|
82
|
+
// MAP/LOOP a bare id names N iterations, and only the ref says which one.
|
|
83
|
+
output: d.stepOutputRef !== undefined && originCtx
|
|
84
|
+
? resolveRef(d.stepOutputRef, originCtx).value
|
|
85
|
+
: d.value, path: d.path, label: (d.stepId !== undefined ? originCtx?.stepTitle(d.stepId) : undefined) ?? d.label, stepId: d.stepId, description: d.stepId !== undefined ? originCtx?.stepDescription(d.stepId) : undefined }));
|
|
64
86
|
return (_jsxs(SidePanelShell, { accentClassName: "border-t-0", width: width, onWidthChange: onWidthChange, className: className, children: [_jsxs("div", { className: "flex shrink-0 items-stretch border-b border-[var(--wui-border)]", style: { minHeight: '44px' }, children: [_jsx("div", { ref: scrollerRef, className: "flex min-w-0 flex-1 items-stretch overflow-x-auto [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: docs.map((d) => {
|
|
65
87
|
const key = citationDocKey(d);
|
|
66
88
|
const isActive = d === active;
|
|
@@ -70,16 +92,10 @@ export function CitationSourcePanel({ docs, activeKey, onSelect, onCloseTab, onC
|
|
|
70
92
|
// Data, not a file — say so in the tab so the reader knows what
|
|
71
93
|
// opens before clicking.
|
|
72
94
|
_jsx("span", { "aria-hidden": "true", className: "shrink-0 rounded bg-[var(--wui-bg-muted)] px-1 font-mono text-[9px] leading-[14px] text-[var(--wui-fg-muted)]", children: '{}' })), _jsx("span", { className: "min-w-0 flex-1 truncate", children: titleOf(d) }), _jsx("button", { type: "button", onClick: (e) => { e.stopPropagation(); onCloseTab(key); }, "aria-label": `Close ${titleOf(d)}`, className: cn('grid h-5 w-5 shrink-0 place-items-center rounded text-[var(--wui-fg-muted)] transition hover:bg-[var(--wui-bg-muted)] hover:text-[var(--wui-fg)]', isActive ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'), children: _jsx(CloseIcon, {}) })] }, key));
|
|
73
|
-
}) }), _jsx("button", { type: "button", onClick: onCloseAll, "aria-label": "Close panel", className: "grid w-10 shrink-0 place-items-center border-l border-[var(--wui-border)] text-[var(--wui-fg-muted)] transition-colors hover:bg-[var(--wui-bg-subtle)] hover:text-[var(--wui-fg)]", children: _jsx(CloseIcon, { size: 15 }) })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-hidden bg-[var(--wui-bg-subtle)]", children: docs.map((d) => (_jsx("div", { className: cn('h-full', d === active ? 'block' : 'hidden'), children:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
// Resolved from the ref prefix rather than `stepOutput(stepId)`:
|
|
79
|
-
// under MAP/LOOP a bare id names N iterations, and only the ref
|
|
80
|
-
// says which one.
|
|
81
|
-
output: d.stepOutputRef !== undefined && originCtx
|
|
82
|
-
? resolveRef(d.stepOutputRef, originCtx).value
|
|
83
|
-
: d.value, path: d.path, label: (d.stepId !== undefined ? originCtx?.stepTitle(d.stepId) : undefined) ?? d.label, stepId: d.stepId, description: d.stepId !== undefined ? originCtx?.stepDescription(d.stepId) : undefined })) }, citationDocKey(d)))) })] }));
|
|
95
|
+
}) }), _jsx("button", { type: "button", onClick: () => { setFull(true); }, "aria-label": "Open full preview", title: "Full preview", className: "grid w-10 shrink-0 place-items-center border-l border-[var(--wui-border)] text-[var(--wui-fg-muted)] transition-colors hover:bg-[var(--wui-bg-subtle)] hover:text-[var(--wui-fg)]", children: _jsx(ExpandIcon, { size: 15 }) }), _jsx("button", { type: "button", onClick: onCloseAll, "aria-label": "Close panel", className: "grid w-10 shrink-0 place-items-center border-l border-[var(--wui-border)] text-[var(--wui-fg-muted)] transition-colors hover:bg-[var(--wui-bg-subtle)] hover:text-[var(--wui-fg)]", children: _jsx(CloseIcon, { size: 15 }) })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-hidden bg-[var(--wui-bg-subtle)]", children: docs.map((d) => (_jsx("div", { className: cn('h-full', d === active ? 'block' : 'hidden'), children: renderDoc(d) }, citationDocKey(d)))) }), full &&
|
|
96
|
+
createPortal(
|
|
97
|
+
// Modal dialog — dimmed/blurred backdrop with a centered floating panel.
|
|
98
|
+
// Click-away or Esc closes; clicks inside the panel don't.
|
|
99
|
+
_jsx("div", { className: "fixed inset-0 z-[200] flex items-center justify-center bg-black/45 p-4 backdrop-blur-sm sm:p-8", onClick: () => { setFull(false); }, children: _jsxs("div", { role: "dialog", "aria-modal": "true", onClick: (e) => { e.stopPropagation(); }, className: "flex h-full max-h-[92vh] w-full max-w-[1120px] flex-col overflow-hidden rounded-xl border border-[var(--wui-border)] bg-[var(--wui-bg)] shadow-2xl", children: [_jsxs("div", { className: "flex shrink-0 items-center gap-2 border-b border-[var(--wui-border)] px-4", style: { minHeight: '48px' }, children: [active.kind === 'doc' ? (_jsx(FileTypeBadge, { name: active.attachment.name, size: "sm" })) : (_jsx("span", { "aria-hidden": "true", className: "shrink-0 rounded bg-[var(--wui-bg-muted)] px-1 font-mono text-[9px] leading-[14px] text-[var(--wui-fg-muted)]", children: '{}' })), _jsx("span", { className: "min-w-0 flex-1 truncate text-[13px] font-medium text-[var(--wui-fg)]", children: titleOf(active) }), _jsx("button", { type: "button", onClick: () => { setFull(false); }, "aria-label": "Close full preview", title: "Close (Esc)", className: "grid h-7 w-7 shrink-0 place-items-center rounded-md text-[var(--wui-fg-muted)] transition-colors hover:bg-[var(--wui-bg-subtle)] hover:text-[var(--wui-fg)]", children: _jsx(CloseIcon, { size: 15 }) })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-hidden bg-[var(--wui-bg-subtle)]", children: _jsx("div", { className: "h-full", children: renderDoc(active) }) })] }) }), document.body)] }));
|
|
84
100
|
}
|
|
85
101
|
//# sourceMappingURL=CitationSourcePanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CitationSourcePanel.js","sourceRoot":"","sources":["../../../src/components/execution/CitationSourcePanel.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CitationSourcePanel.js","sourceRoot":"","sources":["../../../src/components/execution/CitationSourcePanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NodeProps } from '@xyflow/react';
|
|
2
|
+
import type { WorkflowStepConfig } from '@xyne/workflow-sdk/builder';
|
|
3
|
+
export type ExecutionStepStatus = 'pending' | 'running' | 'completed' | 'failed' | 'paused' | 'skipped';
|
|
4
|
+
export interface ExecutionStepNodeData {
|
|
5
|
+
stepConfig: WorkflowStepConfig;
|
|
6
|
+
label: string;
|
|
7
|
+
status: ExecutionStepStatus;
|
|
8
|
+
category?: string | undefined;
|
|
9
|
+
icon?: string | undefined;
|
|
10
|
+
isSelected?: boolean | undefined;
|
|
11
|
+
onSelect?: (() => void) | undefined;
|
|
12
|
+
}
|
|
13
|
+
export declare function ExecutionStepNode({ data }: NodeProps): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=ExecutionStepNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionStepNode.d.ts","sourceRoot":"","sources":["../../../src/components/execution/ExecutionStepNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAKrE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExG,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACrC;AAsDD,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,+BA6EpD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Handle, Position } from '@xyflow/react';
|
|
3
|
+
import { cn } from '../shared/cn.js';
|
|
4
|
+
import { getCategoryTheme } from '../builder/theme.js';
|
|
5
|
+
import { getStepIcon } from '../builder/icons.js';
|
|
6
|
+
// Small status indicator icons (SVG)
|
|
7
|
+
function StatusIcon({ status }) {
|
|
8
|
+
const size = 12;
|
|
9
|
+
switch (status) {
|
|
10
|
+
case 'completed':
|
|
11
|
+
return (_jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }));
|
|
12
|
+
case 'failed':
|
|
13
|
+
return (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", children: [_jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), _jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }));
|
|
14
|
+
case 'running':
|
|
15
|
+
return (_jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", children: [_jsx("path", { d: "M12 2v4" }), _jsx("path", { d: "M12 18v4" }), _jsx("path", { d: "M4.93 4.93l2.83 2.83" }), _jsx("path", { d: "M16.24 16.24l2.83 2.83" }), _jsx("path", { d: "M2 12h4" }), _jsx("path", { d: "M18 12h4" }), _jsx("path", { d: "M4.93 19.07l2.83-2.83" }), _jsx("path", { d: "M16.24 7.76l2.83-2.83" })] }));
|
|
16
|
+
case 'paused':
|
|
17
|
+
return (_jsxs("svg", { width: size, height: size, 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" })] }));
|
|
18
|
+
case 'skipped':
|
|
19
|
+
return (_jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", children: _jsx("path", { d: "M5 12h14" }) }));
|
|
20
|
+
default: // pending
|
|
21
|
+
return (_jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", children: _jsx("circle", { cx: "12", cy: "12", r: "10" }) }));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const statusBadgeColors = {
|
|
25
|
+
pending: 'bg-slate-100 text-slate-400',
|
|
26
|
+
running: 'bg-blue-50 text-blue-500',
|
|
27
|
+
completed: 'bg-emerald-50 text-emerald-600',
|
|
28
|
+
failed: 'bg-red-50 text-red-500',
|
|
29
|
+
paused: 'bg-purple-50 text-purple-500',
|
|
30
|
+
skipped: 'bg-slate-100 text-slate-400',
|
|
31
|
+
};
|
|
32
|
+
export function ExecutionStepNode({ data }) {
|
|
33
|
+
const { label, status, category, icon, isSelected, onSelect } = data;
|
|
34
|
+
const theme = getCategoryTheme(category);
|
|
35
|
+
// Rejoin nodes (invisible merge)
|
|
36
|
+
if (!label) {
|
|
37
|
+
return (_jsxs("div", { className: "h-0 w-0", children: [_jsx(Handle, { type: "target", position: Position.Top, className: "opacity-0" }), _jsx(Handle, { type: "source", position: Position.Bottom, className: "opacity-0" })] }));
|
|
38
|
+
}
|
|
39
|
+
// Status-driven left border override for completed/failed
|
|
40
|
+
const statusAccent = status === 'completed' ? 'border-l-emerald-500'
|
|
41
|
+
: status === 'failed' ? 'border-l-red-500'
|
|
42
|
+
: theme.accent;
|
|
43
|
+
return (_jsxs("div", { onClick: onSelect, className: cn('group relative flex w-48 cursor-pointer items-center gap-3 rounded-lg border bg-white px-3 py-3 transition-all', `border-l-[3px] ${statusAccent}`, isSelected
|
|
44
|
+
? `ring-2 ${theme.ring} shadow-md`
|
|
45
|
+
: 'border-slate-200 shadow-sm hover:shadow-md hover:-translate-y-px hover:border-slate-300', status === 'running' && 'shadow-md shadow-blue-100', status === 'paused' && 'shadow-md shadow-purple-100', status === 'skipped' && 'opacity-50 grayscale'), style: { animation: 'wui-scale-in 200ms ease-out' }, children: [_jsx(Handle, { type: "target", position: Position.Top, className: "!bg-transparent !border-0 !w-1 !h-1 !min-w-0 !min-h-0" }), _jsxs("div", { className: cn('relative flex h-8 w-8 shrink-0 items-center justify-center rounded-lg', theme.iconBg, theme.iconText), children: [getStepIcon(icon, { size: 16 }), status !== 'pending' && (_jsx("span", { className: cn('absolute -bottom-1 -right-1 flex h-4 w-4 items-center justify-center rounded-full ring-2 ring-white', statusBadgeColors[status], status === 'running' && 'animate-[wui-spin_1.5s_linear_infinite]'), children: _jsx(StatusIcon, { status: status }) }))] }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: cn('truncate text-[13px] font-semibold leading-tight', status === 'skipped' ? 'text-slate-400 line-through' : 'text-slate-800'), children: label }), category && (_jsxs("div", { className: "mt-0.5 flex items-center gap-1.5", children: [_jsx("span", { className: cn('h-1.5 w-1.5 rounded-full', theme.dot) }), _jsx("span", { className: "text-[10px] text-slate-400 uppercase tracking-wide", children: category })] }))] }), _jsx(Handle, { type: "source", position: Position.Bottom, className: "!bg-transparent !border-0 !w-1 !h-1 !min-w-0 !min-h-0" })] }));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=ExecutionStepNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionStepNode.js","sourceRoot":"","sources":["../../../src/components/execution/ExecutionStepNode.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { WorkflowStepConfig, StepGroup } from '@xyne/workflow-sdk/builder';
|
|
|
2
2
|
import type { StepMeta } from '../../hooks/use-step-metadata.js';
|
|
3
3
|
import type { StepExecutionState } from '../../utils/step-state.js';
|
|
4
4
|
import type { ExecutionDetail } from '@xyne/workflow-sdk/client';
|
|
5
|
+
import { type Section } from './journey-model.js';
|
|
5
6
|
/**
|
|
6
7
|
* Tabs view — a code-editor read of an execution: the sidebar navigates the run
|
|
7
8
|
* (drill into groups/constructs/iterations, breadcrumb to climb) exactly like the
|
|
@@ -16,6 +17,9 @@ export interface ExecutionTabsProps {
|
|
|
16
17
|
stepStates: Map<string, StepExecutionState>;
|
|
17
18
|
executionSteps?: ExecutionDetail['steps'] | undefined;
|
|
18
19
|
groups?: StepGroup[] | undefined;
|
|
20
|
+
/** Whitelist mode: when true, the root sidebar shows ONLY pinned groups; every
|
|
21
|
+
* non-pinned group and ungrouped step is dropped (still reachable via search). */
|
|
22
|
+
onlyPinned?: boolean | undefined;
|
|
19
23
|
selectedStepId: string | null;
|
|
20
24
|
onStepClick: (stepId: string, replace?: boolean) => void;
|
|
21
25
|
selectedStepState?: StepExecutionState | undefined;
|
|
@@ -30,5 +34,26 @@ export interface ExecutionTabsProps {
|
|
|
30
34
|
/** Node-carried JSX layout for the trigger (from the workflow config). */
|
|
31
35
|
triggerLayout?: string | undefined;
|
|
32
36
|
}
|
|
33
|
-
|
|
37
|
+
/** The pinned groups lifted to the Run level, each resolved to a single-leaf row (when the
|
|
38
|
+
* group has exactly one leaf member) or a drillable group folder. Shared by the sidebar's
|
|
39
|
+
* hoisted rendering and the whitelist auto-open so both agree on what "the pinned rows" are. */
|
|
40
|
+
type PinnedRootRow = {
|
|
41
|
+
kind: 'leaf';
|
|
42
|
+
g: StepGroup;
|
|
43
|
+
member: WorkflowStepConfig;
|
|
44
|
+
} | {
|
|
45
|
+
kind: 'group';
|
|
46
|
+
g: StepGroup;
|
|
47
|
+
members: WorkflowStepConfig[];
|
|
48
|
+
};
|
|
49
|
+
export declare function pinnedRootRows(groups: StepGroup[] | undefined, pinnedIds: Set<string>, rootSteps: WorkflowStepConfig[], stepMeta: Map<string, StepMeta>, states: Map<string, StepExecutionState>): PinnedRootRow[];
|
|
50
|
+
/** The first openable (non-drillable) node at the current level, in sidebar order —
|
|
51
|
+
* what "open the first node by default" resolves to on entering the view or after
|
|
52
|
+
* drilling into a construct/group. Null when a level has no leaf yet (still loading). */
|
|
53
|
+
export declare function firstLeafOfLevel(sections: Section[], groups: StepGroup[] | undefined, stepMeta: Map<string, StepMeta>, insideGroupId: string | undefined, stepStates: Map<string, StepExecutionState>, hoistedIds: Set<string>, onlyPinnedRoot?: boolean): {
|
|
54
|
+
id: string;
|
|
55
|
+
label: string;
|
|
56
|
+
} | null;
|
|
57
|
+
export declare function ExecutionTabs({ steps, stepMeta, stepStates, executionSteps, groups, onlyPinned, selectedStepId, onStepClick, selectedStepState, selectedStepTitle, selectedStepDescription, triggerLabel, triggerCompleted, isTriggerSelected, onTriggerClick, triggerData, triggerLayout, }: ExecutionTabsProps): import("react").JSX.Element;
|
|
58
|
+
export {};
|
|
34
59
|
//# sourceMappingURL=ExecutionTabs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutionTabs.d.ts","sourceRoot":"","sources":["../../../src/components/execution/ExecutionTabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAChF,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;
|
|
1
|
+
{"version":3,"file":"ExecutionTabs.d.ts","sourceRoot":"","sources":["../../../src/components/execution/ExecutionTabs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -79,10 +79,33 @@ function rowInfo(row, st, stepMeta) {
|
|
|
79
79
|
descriptor: { kind: 'iterationItem', id: row.view.ctrlId, index: row.view.index, label: row.view.label },
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
|
+
export function pinnedRootRows(groups, pinnedIds, rootSteps, stepMeta, states) {
|
|
83
|
+
return (groups ?? [])
|
|
84
|
+
.filter((g) => pinnedIds.has(g.id))
|
|
85
|
+
.map((g) => ({ g, members: membersOfGroup(rootSteps, g.id, stepMeta, states) }))
|
|
86
|
+
.filter((p) => p.members.length > 0)
|
|
87
|
+
.map(({ g, members }) => {
|
|
88
|
+
const only = members.length === 1 ? members[0] : undefined;
|
|
89
|
+
return only && stepRow(only, stepMeta).kind === 'leaf'
|
|
90
|
+
? { kind: 'leaf', g, member: only }
|
|
91
|
+
: { kind: 'group', g, members };
|
|
92
|
+
});
|
|
93
|
+
}
|
|
82
94
|
/** The first openable (non-drillable) node at the current level, in sidebar order —
|
|
83
95
|
* what "open the first node by default" resolves to on entering the view or after
|
|
84
96
|
* drilling into a construct/group. Null when a level has no leaf yet (still loading). */
|
|
85
|
-
function firstLeafOfLevel(sections, groups, stepMeta, insideGroupId, stepStates, hoistedIds) {
|
|
97
|
+
export function firstLeafOfLevel(sections, groups, stepMeta, insideGroupId, stepStates, hoistedIds, onlyPinnedRoot) {
|
|
98
|
+
// Whitelist mode at the root: the normal (non-pinned) sections are hidden, so the
|
|
99
|
+
// default open must come from a pinned group's own leaf — never a hidden node. Open it
|
|
100
|
+
// even while pending (the sole visible node) so it fills in live as the run completes.
|
|
101
|
+
if (onlyPinnedRoot) {
|
|
102
|
+
const rootSteps = sections.flatMap((s) => s.steps);
|
|
103
|
+
for (const row of pinnedRootRows(groups, hoistedIds, rootSteps, stepMeta, stepStates)) {
|
|
104
|
+
if (row.kind === 'leaf')
|
|
105
|
+
return { id: row.member.id, label: row.g.title };
|
|
106
|
+
}
|
|
107
|
+
return null; // only multi-member pinned groups (drillable) — let the user drill in
|
|
108
|
+
}
|
|
86
109
|
for (const sec of sections) {
|
|
87
110
|
const st = sec.states ?? stepStates;
|
|
88
111
|
const prefix = sec.selectionPrefix ?? '';
|
|
@@ -109,7 +132,7 @@ function SidebarRow({ label, status, drillable, active, onClick }) {
|
|
|
109
132
|
? 'bg-[color-mix(in_srgb,var(--wui-primary)_14%,transparent)] font-medium text-[var(--wui-fg)]'
|
|
110
133
|
: 'text-[var(--wui-fg)] hover:bg-[color-mix(in_srgb,var(--wui-fg)_5%,transparent)]'), children: [_jsx("span", { className: cn('h-2 w-2 shrink-0 rounded-full', DOT[status]) }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), drillable && _jsx("span", { className: "shrink-0 text-[var(--wui-fg-muted)] group-hover:text-[var(--wui-fg)]", children: CHEVRON })] }));
|
|
111
134
|
}
|
|
112
|
-
function Sidebar({ sections, insideGroupId, atRoot, stepMeta, stepStates, groups, hoistedIds, onDrill, onOpenLeaf, selectedId, allNodes, onOpenNode, triggerLabel, triggerCompleted, isTriggerSelected, onOpenTrigger, }) {
|
|
135
|
+
function Sidebar({ sections, insideGroupId, atRoot, stepMeta, stepStates, groups, hoistedIds, onlyPinned, onDrill, onOpenLeaf, selectedId, allNodes, onOpenNode, triggerLabel, triggerCompleted, isTriggerSelected, onOpenTrigger, }) {
|
|
113
136
|
// A search box over *every* node (whole tree, ignoring the current drill level);
|
|
114
137
|
// clearing it falls back to the normal current-path rows below.
|
|
115
138
|
const [search, setSearch] = useState('');
|
|
@@ -129,19 +152,11 @@ function Sidebar({ sections, insideGroupId, atRoot, stepMeta, stepStates, groups
|
|
|
129
152
|
// Pinned groups lifted to the Run level. A single-leaf pinned group adds no value as a
|
|
130
153
|
// folder — surface its one member directly under the group's (section) label, mirroring
|
|
131
154
|
// buildRows' flattening for nested single-member groups (which skips hoisted ones).
|
|
132
|
-
const hoistedRows = atRoot
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
.map(({ g, members }) => {
|
|
138
|
-
const only = members.length === 1 ? members[0] : undefined;
|
|
139
|
-
return only && stepRow(only, stepMeta).kind === 'leaf'
|
|
140
|
-
? ({ kind: 'leaf', g, member: only })
|
|
141
|
-
: ({ kind: 'group', g, members });
|
|
142
|
-
})
|
|
143
|
-
: [];
|
|
144
|
-
return (_jsxs("div", { className: "flex h-full w-full flex-col bg-[var(--wui-bg-subtle)]", children: [_jsx("div", { className: "shrink-0 p-2 pb-1", children: _jsxs("div", { className: "flex items-center gap-2 rounded-md border border-[var(--wui-border)] bg-[var(--wui-bg)] px-2.5", children: [_jsx("span", { className: "shrink-0 text-[var(--wui-fg-muted)]", children: SEARCH_ICON }), _jsx("input", { value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search all nodes\u2026", className: "min-w-0 flex-1 bg-transparent py-1.5 text-[12.5px] text-[var(--wui-fg)] outline-none placeholder:text-[var(--wui-fg-muted)]" }), q && (_jsx("button", { type: "button", onClick: () => { setSearch(''); }, "aria-label": "Clear search", className: "grid h-4 w-4 shrink-0 place-items-center rounded text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]", children: CLOSE }))] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto p-2 pt-1", children: matches ? (matches.length === 0 ? (_jsx("div", { className: "px-2.5 py-3 text-[12px] italic text-[var(--wui-fg-muted)]", children: "No matching nodes" })) : (matches.map(({ n, indices }) => (_jsx(SidebarRow, { label: _jsx(Highlighted, { text: n.label, indices: indices }), status: n.status, active: n.id === TRIGGER_ID ? isTriggerSelected : (!isTriggerSelected && selectedId === n.id), onClick: () => { onOpenNode(n); } }, n.id))))) : (_jsxs(_Fragment, { children: [atRoot && (_jsx(SidebarRow, { label: triggerLabel, status: triggerCompleted ? 'completed' : 'pending', active: isTriggerSelected, onClick: () => onOpenTrigger() })), sections.map((sec, si) => {
|
|
155
|
+
const hoistedRows = atRoot ? pinnedRootRows(groups, hoistedIds, rootSteps, stepMeta, stepStates) : [];
|
|
156
|
+
// Whitelist mode: at the root, only the pinned groups (above) are shown — every non-pinned
|
|
157
|
+
// section is dropped. They stay reachable through the "Search all nodes" box.
|
|
158
|
+
const hideSections = atRoot && !!onlyPinned;
|
|
159
|
+
return (_jsxs("div", { className: "flex h-full w-full flex-col bg-[var(--wui-bg-subtle)]", children: [_jsx("div", { className: "shrink-0 p-2 pb-1", children: _jsxs("div", { className: "flex items-center gap-2 rounded-md border border-[var(--wui-border)] bg-[var(--wui-bg)] px-2.5", children: [_jsx("span", { className: "shrink-0 text-[var(--wui-fg-muted)]", children: SEARCH_ICON }), _jsx("input", { value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search all nodes\u2026", className: "min-w-0 flex-1 bg-transparent py-1.5 text-[12.5px] text-[var(--wui-fg)] outline-none placeholder:text-[var(--wui-fg-muted)]" }), q && (_jsx("button", { type: "button", onClick: () => { setSearch(''); }, "aria-label": "Clear search", className: "grid h-4 w-4 shrink-0 place-items-center rounded text-[var(--wui-fg-muted)] hover:text-[var(--wui-fg)]", children: CLOSE }))] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto p-2 pt-1", children: matches ? (matches.length === 0 ? (_jsx("div", { className: "px-2.5 py-3 text-[12px] italic text-[var(--wui-fg-muted)]", children: "No matching nodes" })) : (matches.map(({ n, indices }) => (_jsx(SidebarRow, { label: _jsx(Highlighted, { text: n.label, indices: indices }), status: n.status, active: n.id === TRIGGER_ID ? isTriggerSelected : (!isTriggerSelected && selectedId === n.id), onClick: () => { onOpenNode(n); } }, n.id))))) : (_jsxs(_Fragment, { children: [atRoot && (_jsx(SidebarRow, { label: triggerLabel, status: triggerCompleted ? 'completed' : 'pending', active: isTriggerSelected, onClick: () => onOpenTrigger() })), !hideSections && sections.map((sec, si) => {
|
|
145
160
|
const st = sec.states ?? stepStates;
|
|
146
161
|
const prefix = sec.selectionPrefix ?? '';
|
|
147
162
|
const rows = sec.iterations ? sec.iterations.map((view) => ({ kind: 'iteration', view })) : buildRows(sec.steps, groups, stepMeta, insideGroupId, st, hoistedIds);
|
|
@@ -315,7 +330,7 @@ function NodeDetail({ state, meta, title, description, template }) {
|
|
|
315
330
|
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [_jsxs("div", { className: "shrink-0 px-6 pt-5 pb-4", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2.5", children: [_jsx("span", { className: cn('h-2.5 w-2.5 rounded-full', DOT[status]) }), _jsx("h2", { className: "text-[16px] font-semibold text-[var(--wui-fg)]", children: title }), _jsx(StatusBadge, { status: status, className: "ml-0.5" })] }), description && _jsx("p", { className: "mt-1.5 max-w-3xl text-[13px] leading-relaxed text-[var(--wui-fg-muted)]", children: description })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto px-6 pb-6", children: rendered ? (rendered.ok ? (_jsx("div", { className: "flex flex-col gap-8", children: rendered.node })) : (_jsxs("div", { className: "rounded-lg border border-red-300 bg-[color-mix(in_srgb,#ef4444_8%,transparent)] p-3 text-[13px] text-red-700", children: ["Layout error: ", rendered.error] }))) : fallback.length === 0 ? (_jsx("div", { className: "flex h-full items-center justify-center text-[13px] text-[var(--wui-fg-muted)]", children: "No data for this step." })) : (_jsx("div", { className: "flex flex-col gap-8", children: fallback.map((s) => (_jsxs("section", { children: [_jsxs("div", { className: "mb-3 flex items-center gap-3", children: [_jsx("h3", { className: "text-[12px] font-semibold uppercase tracking-wide text-[var(--wui-fg-muted)]", children: s.title }), _jsx("span", { className: "h-px flex-1 bg-[var(--wui-border)]" })] }), _jsx(KeyValueGrid, { entries: s.entries, cite: s.cite })] }, s.key))) })) })] }));
|
|
316
331
|
}
|
|
317
332
|
// ─── The view ───
|
|
318
|
-
export function ExecutionTabs({ steps, stepMeta, stepStates, executionSteps, groups, selectedStepId, onStepClick, selectedStepState, selectedStepTitle, selectedStepDescription, triggerLabel, triggerCompleted, isTriggerSelected, onTriggerClick, triggerData, triggerLayout, }) {
|
|
333
|
+
export function ExecutionTabs({ steps, stepMeta, stepStates, executionSteps, groups, onlyPinned, selectedStepId, onStepClick, selectedStepState, selectedStepTitle, selectedStepDescription, triggerLabel, triggerCompleted, isTriggerSelected, onTriggerClick, triggerData, triggerLayout, }) {
|
|
319
334
|
const [path, setPath] = useState([]);
|
|
320
335
|
const [openTabs, setOpenTabs] = useState([]);
|
|
321
336
|
const [paletteOpen, setPaletteOpen] = useState(false);
|
|
@@ -442,13 +457,13 @@ export function ExecutionTabs({ steps, stepMeta, stepStates, executionSteps, gro
|
|
|
442
457
|
openLeaf(selectedStepId, paletteNodes.find((n) => n.id === selectedStepId)?.label ?? selectedStepId, true);
|
|
443
458
|
return;
|
|
444
459
|
}
|
|
445
|
-
const first = firstLeafOfLevel(sections, groups, stepMeta, insideGroupId, stepStates, hoistedIds);
|
|
460
|
+
const first = firstLeafOfLevel(sections, groups, stepMeta, insideGroupId, stepStates, hoistedIds, path.length === 0 && !!onlyPinned);
|
|
446
461
|
if (!first)
|
|
447
462
|
return; // states still loading, or no leaf at this level — retry next render
|
|
448
463
|
autoOpened.current.add(key);
|
|
449
464
|
openLeaf(first.id, first.label, true);
|
|
450
465
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
451
|
-
}, [path, sections, groups, stepMeta, insideGroupId, stepStates, hoistedIds, selectedStepId]);
|
|
466
|
+
}, [path, sections, groups, stepMeta, insideGroupId, stepStates, hoistedIds, onlyPinned, selectedStepId]);
|
|
452
467
|
// An externally-driven selection (URL back/forward, deep-link) opens the node's
|
|
453
468
|
// detail; make sure its tab exists in the strip too.
|
|
454
469
|
useEffect(() => {
|
|
@@ -484,6 +499,6 @@ export function ExecutionTabs({ steps, stepMeta, stepStates, executionSteps, gro
|
|
|
484
499
|
: 'bg-[color-mix(in_srgb,var(--wui-primary)_13%,transparent)] text-[var(--wui-primary)]'), children: PANEL_LEFT }), crumbs.map((c, i) => {
|
|
485
500
|
const last = i === crumbs.length - 1;
|
|
486
501
|
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));
|
|
487
|
-
})] }), _jsxs("div", { className: "flex min-h-0 flex-1 overflow-hidden", children: [!sidebarCollapsed && (_jsxs("div", { className: "relative flex shrink-0 border-r border-[var(--wui-border)]", style: { width: sidebarWidth }, children: [_jsx(Sidebar, { sections: sections, insideGroupId: insideGroupId, atRoot: path.length === 0, stepMeta: stepMeta, stepStates: stepStates, groups: groups, hoistedIds: hoistedIds, onDrill: (d) => setPath((p) => [...p, d]), onOpenLeaf: openLeaf, selectedId: selectedStepId, allNodes: paletteNodes, onOpenNode: openNode, triggerLabel: triggerLabel, triggerCompleted: triggerCompleted, isTriggerSelected: isTriggerSelected, onOpenTrigger: openTrigger }), _jsx("div", { onMouseDown: handleSidebarResize, title: "Drag to resize", className: "absolute right-0 top-0 bottom-0 z-10 w-1 cursor-col-resize transition-colors hover:bg-[color-mix(in_srgb,var(--wui-primary)_40%,transparent)] active:bg-[color-mix(in_srgb,var(--wui-primary)_55%,transparent)]" })] })), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx(EditorTabStrip, { tabs: openTabs, activeId: activeId, onActivate: activateTab, onClose: closeTab }), _jsx("div", { className: "min-h-0 flex-1", children: isTriggerSelected ? (_jsx(NodeDetail, { state: triggerState, meta: undefined, title: triggerLabel, template: triggerLayout ?? null })) : selectedStepState ? (_jsx(NodeDetail, { state: selectedStepState, meta: detailMeta, title: selectedStepTitle ?? selectedStepState.stepName, description: selectedStepDescription, template: stepTemplate })) : (_jsx("div", { className: "flex h-full flex-col items-center justify-center gap-1 text-[var(--wui-fg-muted)]", children: _jsx("p", { className: "text-[13px]", children: "Open a step from the sidebar." }) })) })] })] }), paletteOpen && (_jsx(NodePalette, { nodes: paletteNodes, container: rootRef.current?.closest('[data-workflow-ui]') ?? null, onPick: (n) => { openNode(n); setPaletteOpen(false); }, onClose: () => { setPaletteOpen(false); } }))] }));
|
|
502
|
+
})] }), _jsxs("div", { className: "flex min-h-0 flex-1 overflow-hidden", children: [!sidebarCollapsed && (_jsxs("div", { className: "relative flex shrink-0 border-r border-[var(--wui-border)]", style: { width: sidebarWidth }, children: [_jsx(Sidebar, { sections: sections, insideGroupId: insideGroupId, atRoot: path.length === 0, stepMeta: stepMeta, stepStates: stepStates, groups: groups, hoistedIds: hoistedIds, onlyPinned: onlyPinned, onDrill: (d) => setPath((p) => [...p, d]), onOpenLeaf: openLeaf, selectedId: selectedStepId, allNodes: paletteNodes, onOpenNode: openNode, triggerLabel: triggerLabel, triggerCompleted: triggerCompleted, isTriggerSelected: isTriggerSelected, onOpenTrigger: openTrigger }), _jsx("div", { onMouseDown: handleSidebarResize, title: "Drag to resize", className: "absolute right-0 top-0 bottom-0 z-10 w-1 cursor-col-resize transition-colors hover:bg-[color-mix(in_srgb,var(--wui-primary)_40%,transparent)] active:bg-[color-mix(in_srgb,var(--wui-primary)_55%,transparent)]" })] })), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx(EditorTabStrip, { tabs: openTabs, activeId: activeId, onActivate: activateTab, onClose: closeTab }), _jsx("div", { className: "min-h-0 flex-1", children: isTriggerSelected ? (_jsx(NodeDetail, { state: triggerState, meta: undefined, title: triggerLabel, template: triggerLayout ?? null })) : selectedStepState ? (_jsx(NodeDetail, { state: selectedStepState, meta: detailMeta, title: selectedStepTitle ?? selectedStepState.stepName, description: selectedStepDescription, template: stepTemplate })) : (_jsx("div", { className: "flex h-full flex-col items-center justify-center gap-1 text-[var(--wui-fg-muted)]", children: _jsx("p", { className: "text-[13px]", children: "Open a step from the sidebar." }) })) })] })] }), paletteOpen && (_jsx(NodePalette, { nodes: paletteNodes, container: rootRef.current?.closest('[data-workflow-ui]') ?? null, onPick: (n) => { openNode(n); setPaletteOpen(false); }, onClose: () => { setPaletteOpen(false); } }))] }));
|
|
488
503
|
}
|
|
489
504
|
//# sourceMappingURL=ExecutionTabs.js.map
|