condukt 0.1.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.
- package/dist/bridge/bridge.d.ts +34 -0
- package/dist/bridge/bridge.d.ts.map +1 -0
- package/dist/bridge/bridge.js +365 -0
- package/dist/bridge/bridge.js.map +1 -0
- package/dist/bridge/index.d.ts +3 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +6 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/runtimes/copilot/copilot-adapter.d.ts +28 -0
- package/dist/runtimes/copilot/copilot-adapter.d.ts.map +1 -0
- package/dist/runtimes/copilot/copilot-adapter.js +50 -0
- package/dist/runtimes/copilot/copilot-adapter.js.map +1 -0
- package/dist/runtimes/copilot/copilot-backend.d.ts +49 -0
- package/dist/runtimes/copilot/copilot-backend.d.ts.map +1 -0
- package/dist/runtimes/copilot/copilot-backend.js +13 -0
- package/dist/runtimes/copilot/copilot-backend.js.map +1 -0
- package/dist/runtimes/copilot/index.d.ts +5 -0
- package/dist/runtimes/copilot/index.d.ts.map +1 -0
- package/dist/runtimes/copilot/index.js +11 -0
- package/dist/runtimes/copilot/index.js.map +1 -0
- package/dist/runtimes/copilot/process-killer.d.ts +13 -0
- package/dist/runtimes/copilot/process-killer.d.ts.map +1 -0
- package/dist/runtimes/copilot/process-killer.js +77 -0
- package/dist/runtimes/copilot/process-killer.js.map +1 -0
- package/dist/runtimes/copilot/subprocess-backend.d.ts +26 -0
- package/dist/runtimes/copilot/subprocess-backend.d.ts.map +1 -0
- package/dist/runtimes/copilot/subprocess-backend.js +308 -0
- package/dist/runtimes/copilot/subprocess-backend.js.map +1 -0
- package/dist/runtimes/mock/index.d.ts +3 -0
- package/dist/runtimes/mock/index.d.ts.map +1 -0
- package/dist/runtimes/mock/index.js +6 -0
- package/dist/runtimes/mock/index.js.map +1 -0
- package/dist/runtimes/mock/mock-runtime.d.ts +43 -0
- package/dist/runtimes/mock/mock-runtime.d.ts.map +1 -0
- package/dist/runtimes/mock/mock-runtime.js +153 -0
- package/dist/runtimes/mock/mock-runtime.js.map +1 -0
- package/dist/src/agent.d.ts +35 -0
- package/dist/src/agent.d.ts.map +1 -0
- package/dist/src/agent.js +257 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/events.d.ts +153 -0
- package/dist/src/events.d.ts.map +1 -0
- package/dist/src/events.js +11 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/nodes.d.ts +63 -0
- package/dist/src/nodes.d.ts.map +1 -0
- package/dist/src/nodes.js +120 -0
- package/dist/src/nodes.js.map +1 -0
- package/dist/src/scheduler.d.ts +11 -0
- package/dist/src/scheduler.d.ts.map +1 -0
- package/dist/src/scheduler.js +478 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/types.d.ts +201 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +38 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/verify.d.ts +51 -0
- package/dist/src/verify.d.ts.map +1 -0
- package/dist/src/verify.js +126 -0
- package/dist/src/verify.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +14 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/reducer.d.ts +11 -0
- package/dist/state/reducer.d.ts.map +1 -0
- package/dist/state/reducer.js +223 -0
- package/dist/state/reducer.js.map +1 -0
- package/dist/state/state-runtime.d.ts +30 -0
- package/dist/state/state-runtime.d.ts.map +1 -0
- package/dist/state/state-runtime.js +131 -0
- package/dist/state/state-runtime.js.map +1 -0
- package/dist/state/storage-memory.d.ts +24 -0
- package/dist/state/storage-memory.d.ts.map +1 -0
- package/dist/state/storage-memory.js +91 -0
- package/dist/state/storage-memory.js.map +1 -0
- package/dist/state/storage.d.ts +29 -0
- package/dist/state/storage.d.ts.map +1 -0
- package/dist/state/storage.js +175 -0
- package/dist/state/storage.js.map +1 -0
- package/dist/theme/index.d.ts +128 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +59 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/ui/ansi.d.ts +9 -0
- package/dist/ui/ansi.d.ts.map +1 -0
- package/dist/ui/ansi.js +78 -0
- package/dist/ui/ansi.js.map +1 -0
- package/dist/ui/components/FlowEdge.d.ts +5 -0
- package/dist/ui/components/FlowEdge.d.ts.map +1 -0
- package/dist/ui/components/FlowEdge.js +33 -0
- package/dist/ui/components/FlowEdge.js.map +1 -0
- package/dist/ui/components/FlowGraph.d.ts +10 -0
- package/dist/ui/components/FlowGraph.d.ts.map +1 -0
- package/dist/ui/components/FlowGraph.js +124 -0
- package/dist/ui/components/FlowGraph.js.map +1 -0
- package/dist/ui/components/FlowStatusBar.d.ts +7 -0
- package/dist/ui/components/FlowStatusBar.d.ts.map +1 -0
- package/dist/ui/components/FlowStatusBar.js +27 -0
- package/dist/ui/components/FlowStatusBar.js.map +1 -0
- package/dist/ui/components/MiniPipeline.d.ts +10 -0
- package/dist/ui/components/MiniPipeline.d.ts.map +1 -0
- package/dist/ui/components/MiniPipeline.js +155 -0
- package/dist/ui/components/MiniPipeline.js.map +1 -0
- package/dist/ui/components/NodeCard.d.ts +5 -0
- package/dist/ui/components/NodeCard.d.ts.map +1 -0
- package/dist/ui/components/NodeCard.js +39 -0
- package/dist/ui/components/NodeCard.js.map +1 -0
- package/dist/ui/components/NodeDetailPanel.d.ts +10 -0
- package/dist/ui/components/NodeDetailPanel.d.ts.map +1 -0
- package/dist/ui/components/NodeDetailPanel.js +38 -0
- package/dist/ui/components/NodeDetailPanel.js.map +1 -0
- package/dist/ui/components/node-panel/Controls.d.ts +16 -0
- package/dist/ui/components/node-panel/Controls.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Controls.js +28 -0
- package/dist/ui/components/node-panel/Controls.js.map +1 -0
- package/dist/ui/components/node-panel/ErrorBar.d.ts +6 -0
- package/dist/ui/components/node-panel/ErrorBar.d.ts.map +1 -0
- package/dist/ui/components/node-panel/ErrorBar.js +14 -0
- package/dist/ui/components/node-panel/ErrorBar.js.map +1 -0
- package/dist/ui/components/node-panel/Gate.d.ts +13 -0
- package/dist/ui/components/node-panel/Gate.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Gate.js +40 -0
- package/dist/ui/components/node-panel/Gate.js.map +1 -0
- package/dist/ui/components/node-panel/Header.d.ts +10 -0
- package/dist/ui/components/node-panel/Header.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Header.js +19 -0
- package/dist/ui/components/node-panel/Header.js.map +1 -0
- package/dist/ui/components/node-panel/Info.d.ts +7 -0
- package/dist/ui/components/node-panel/Info.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Info.js +23 -0
- package/dist/ui/components/node-panel/Info.js.map +1 -0
- package/dist/ui/components/node-panel/Output.d.ts +27 -0
- package/dist/ui/components/node-panel/Output.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Output.js +66 -0
- package/dist/ui/components/node-panel/Output.js.map +1 -0
- package/dist/ui/components/node-panel/index.d.ts +47 -0
- package/dist/ui/components/node-panel/index.d.ts.map +1 -0
- package/dist/ui/components/node-panel/index.js +54 -0
- package/dist/ui/components/node-panel/index.js.map +1 -0
- package/dist/ui/components/node-panel/types.d.ts +23 -0
- package/dist/ui/components/node-panel/types.d.ts.map +1 -0
- package/dist/ui/components/node-panel/types.js +24 -0
- package/dist/ui/components/node-panel/types.js.map +1 -0
- package/dist/ui/core/components/Badge.d.ts +6 -0
- package/dist/ui/core/components/Badge.d.ts.map +1 -0
- package/dist/ui/core/components/Badge.js +11 -0
- package/dist/ui/core/components/Badge.js.map +1 -0
- package/dist/ui/core/components/Button.d.ts +9 -0
- package/dist/ui/core/components/Button.d.ts.map +1 -0
- package/dist/ui/core/components/Button.js +18 -0
- package/dist/ui/core/components/Button.js.map +1 -0
- package/dist/ui/core/components/ConfirmDialog.d.ts +11 -0
- package/dist/ui/core/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/ui/core/components/ConfirmDialog.js +23 -0
- package/dist/ui/core/components/ConfirmDialog.js.map +1 -0
- package/dist/ui/core/components/ExecutionCard.d.ts +12 -0
- package/dist/ui/core/components/ExecutionCard.d.ts.map +1 -0
- package/dist/ui/core/components/ExecutionCard.js +15 -0
- package/dist/ui/core/components/ExecutionCard.js.map +1 -0
- package/dist/ui/core/components/NodeListItem.d.ts +10 -0
- package/dist/ui/core/components/NodeListItem.d.ts.map +1 -0
- package/dist/ui/core/components/NodeListItem.js +27 -0
- package/dist/ui/core/components/NodeListItem.js.map +1 -0
- package/dist/ui/core/components/PageHeader.d.ts +10 -0
- package/dist/ui/core/components/PageHeader.d.ts.map +1 -0
- package/dist/ui/core/components/PageHeader.js +9 -0
- package/dist/ui/core/components/PageHeader.js.map +1 -0
- package/dist/ui/core/components/SectionLabel.d.ts +6 -0
- package/dist/ui/core/components/SectionLabel.d.ts.map +1 -0
- package/dist/ui/core/components/SectionLabel.js +9 -0
- package/dist/ui/core/components/SectionLabel.js.map +1 -0
- package/dist/ui/core/components/Skeleton.d.ts +7 -0
- package/dist/ui/core/components/Skeleton.d.ts.map +1 -0
- package/dist/ui/core/components/Skeleton.js +26 -0
- package/dist/ui/core/components/Skeleton.js.map +1 -0
- package/dist/ui/core/components/Stat.d.ts +8 -0
- package/dist/ui/core/components/Stat.d.ts.map +1 -0
- package/dist/ui/core/components/Stat.js +9 -0
- package/dist/ui/core/components/Stat.js.map +1 -0
- package/dist/ui/core/components/Toast.d.ts +7 -0
- package/dist/ui/core/components/Toast.d.ts.map +1 -0
- package/dist/ui/core/components/Toast.js +28 -0
- package/dist/ui/core/components/Toast.js.map +1 -0
- package/dist/ui/core/components/__tests__/primitives.test.d.ts +2 -0
- package/dist/ui/core/components/__tests__/primitives.test.d.ts.map +1 -0
- package/dist/ui/core/components/__tests__/primitives.test.js +3 -0
- package/dist/ui/core/components/__tests__/primitives.test.js.map +1 -0
- package/dist/ui/core/components/index.d.ts +21 -0
- package/dist/ui/core/components/index.d.ts.map +1 -0
- package/dist/ui/core/components/index.js +24 -0
- package/dist/ui/core/components/index.js.map +1 -0
- package/dist/ui/core/index.d.ts +17 -0
- package/dist/ui/core/index.d.ts.map +1 -0
- package/dist/ui/core/index.js +56 -0
- package/dist/ui/core/index.js.map +1 -0
- package/dist/ui/core/utils.d.ts +6 -0
- package/dist/ui/core/utils.d.ts.map +1 -0
- package/dist/ui/core/utils.js +32 -0
- package/dist/ui/core/utils.js.map +1 -0
- package/dist/ui/graph/index.d.ts +4 -0
- package/dist/ui/graph/index.d.ts.map +1 -0
- package/dist/ui/graph/index.js +11 -0
- package/dist/ui/graph/index.js.map +1 -0
- package/dist/ui/hooks/useAutoSelectNode.d.ts +3 -0
- package/dist/ui/hooks/useAutoSelectNode.d.ts.map +1 -0
- package/dist/ui/hooks/useAutoSelectNode.js +36 -0
- package/dist/ui/hooks/useAutoSelectNode.js.map +1 -0
- package/dist/ui/hooks/useFlowExecution.d.ts +32 -0
- package/dist/ui/hooks/useFlowExecution.d.ts.map +1 -0
- package/dist/ui/hooks/useFlowExecution.js +113 -0
- package/dist/ui/hooks/useFlowExecution.js.map +1 -0
- package/dist/ui/hooks/useNodeNavigation.d.ts +3 -0
- package/dist/ui/hooks/useNodeNavigation.d.ts.map +1 -0
- package/dist/ui/hooks/useNodeNavigation.js +38 -0
- package/dist/ui/hooks/useNodeNavigation.js.map +1 -0
- package/dist/ui/hooks/useNodeOutput.d.ts +21 -0
- package/dist/ui/hooks/useNodeOutput.d.ts.map +1 -0
- package/dist/ui/hooks/useNodeOutput.js +75 -0
- package/dist/ui/hooks/useNodeOutput.js.map +1 -0
- package/dist/ui/index.d.ts +16 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +37 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/utils.d.ts +3 -0
- package/dist/ui/utils.d.ts.map +1 -0
- package/dist/ui/utils.js +9 -0
- package/dist/ui/utils.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.FlowGraph = FlowGraph;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const react_2 = require("@xyflow/react");
|
|
8
|
+
require("@xyflow/react/dist/style.css");
|
|
9
|
+
const NodeCard_1 = require("./NodeCard");
|
|
10
|
+
const FlowEdge_1 = require("./FlowEdge");
|
|
11
|
+
function computeLayout(projection) {
|
|
12
|
+
const { nodes: projNodes, edges: projEdges } = projection.graph;
|
|
13
|
+
// Build adjacency for topological ordering
|
|
14
|
+
const inDegree = new Map();
|
|
15
|
+
const adjList = new Map();
|
|
16
|
+
for (const n of projNodes) {
|
|
17
|
+
inDegree.set(n.id, 0);
|
|
18
|
+
adjList.set(n.id, []);
|
|
19
|
+
}
|
|
20
|
+
for (const e of projEdges) {
|
|
21
|
+
if (e.target !== 'end') {
|
|
22
|
+
adjList.get(e.source)?.push(e.target);
|
|
23
|
+
inDegree.set(e.target, (inDegree.get(e.target) ?? 0) + 1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Assign layers via BFS (Kahn's algorithm)
|
|
27
|
+
const layers = new Map();
|
|
28
|
+
const queue = [];
|
|
29
|
+
for (const [id, deg] of inDegree) {
|
|
30
|
+
if (deg === 0) {
|
|
31
|
+
queue.push(id);
|
|
32
|
+
layers.set(id, 0);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
while (queue.length > 0) {
|
|
36
|
+
const current = queue.shift();
|
|
37
|
+
const currentLayer = layers.get(current);
|
|
38
|
+
for (const next of adjList.get(current) ?? []) {
|
|
39
|
+
const newDeg = (inDegree.get(next) ?? 1) - 1;
|
|
40
|
+
inDegree.set(next, newDeg);
|
|
41
|
+
layers.set(next, Math.max(layers.get(next) ?? 0, currentLayer + 1));
|
|
42
|
+
if (newDeg === 0)
|
|
43
|
+
queue.push(next);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Group by layer
|
|
47
|
+
const layerGroups = new Map();
|
|
48
|
+
for (const [id, layer] of layers) {
|
|
49
|
+
if (!layerGroups.has(layer))
|
|
50
|
+
layerGroups.set(layer, []);
|
|
51
|
+
layerGroups.get(layer).push(id);
|
|
52
|
+
}
|
|
53
|
+
// Position nodes
|
|
54
|
+
const NODE_WIDTH = 200;
|
|
55
|
+
const NODE_HEIGHT = 70;
|
|
56
|
+
const X_GAP = 60;
|
|
57
|
+
const Y_GAP = 30;
|
|
58
|
+
const nodes = [];
|
|
59
|
+
for (const [layer, ids] of layerGroups) {
|
|
60
|
+
const totalHeight = ids.length * NODE_HEIGHT + (ids.length - 1) * Y_GAP;
|
|
61
|
+
const startY = -totalHeight / 2;
|
|
62
|
+
ids.forEach((id, index) => {
|
|
63
|
+
const projNode = projNodes.find((n) => n.id === id);
|
|
64
|
+
nodes.push({
|
|
65
|
+
id,
|
|
66
|
+
type: 'nodeCard',
|
|
67
|
+
position: {
|
|
68
|
+
x: layer * (NODE_WIDTH + X_GAP),
|
|
69
|
+
y: startY + index * (NODE_HEIGHT + Y_GAP),
|
|
70
|
+
},
|
|
71
|
+
data: { ...(projNode ?? { id, displayName: id, nodeType: 'unknown', status: 'pending', attempt: 0 }) },
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Map edges
|
|
76
|
+
const edges = projEdges
|
|
77
|
+
.filter((e) => e.target !== 'end')
|
|
78
|
+
.map((e, i) => ({
|
|
79
|
+
id: `e-${e.source}-${e.target}-${i}`,
|
|
80
|
+
source: e.source,
|
|
81
|
+
target: e.target,
|
|
82
|
+
type: 'flowEdge',
|
|
83
|
+
data: { state: e.state, action: e.action },
|
|
84
|
+
animated: e.state === 'taken',
|
|
85
|
+
}));
|
|
86
|
+
return { nodes, edges };
|
|
87
|
+
}
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Node and Edge type registrations
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
const nodeTypes = {
|
|
92
|
+
nodeCard: NodeCard_1.NodeCard,
|
|
93
|
+
};
|
|
94
|
+
const edgeTypes = {
|
|
95
|
+
flowEdge: FlowEdge_1.FlowEdge,
|
|
96
|
+
};
|
|
97
|
+
function FlowGraph({ projection, selectedNodeId, onNodeSelect }) {
|
|
98
|
+
const layout = (0, react_1.useMemo)(() => computeLayout(projection), [projection]);
|
|
99
|
+
const [nodes, setNodes, onNodesChange] = (0, react_2.useNodesState)(layout.nodes);
|
|
100
|
+
const [edges, setEdges, onEdgesChange] = (0, react_2.useEdgesState)(layout.edges);
|
|
101
|
+
// Update when projection changes
|
|
102
|
+
(0, react_1.useEffect)(() => {
|
|
103
|
+
setNodes(layout.nodes);
|
|
104
|
+
setEdges(layout.edges);
|
|
105
|
+
}, [layout, setNodes, setEdges]);
|
|
106
|
+
const onNodeClick = (0, react_1.useCallback)((_, node) => {
|
|
107
|
+
onNodeSelect(node.id);
|
|
108
|
+
}, [onNodeSelect]);
|
|
109
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "h-full w-full", style: { minHeight: 400 }, children: (0, jsx_runtime_1.jsxs)(react_2.ReactFlow, { nodes: nodes.map((n) => ({
|
|
110
|
+
...n,
|
|
111
|
+
selected: n.id === selectedNodeId,
|
|
112
|
+
})), edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, onNodeClick: onNodeClick, fitView: true, fitViewOptions: { padding: 0.2 }, proOptions: { hideAttribution: true }, minZoom: 0.3, maxZoom: 2, children: [(0, jsx_runtime_1.jsx)(react_2.Background, { variant: react_2.BackgroundVariant.Dots, gap: 16, size: 1, color: "hsl(var(--muted))" }), (0, jsx_runtime_1.jsx)(react_2.Controls, { showInteractive: false }), (0, jsx_runtime_1.jsx)(react_2.MiniMap, { nodeColor: (n) => {
|
|
113
|
+
const status = n.data?.status ?? 'pending';
|
|
114
|
+
switch (status) {
|
|
115
|
+
case 'completed': return 'hsl(142 76% 36%)';
|
|
116
|
+
case 'running': return 'hsl(217 91% 60%)';
|
|
117
|
+
case 'failed': return 'hsl(0 84% 60%)';
|
|
118
|
+
case 'gated': return 'hsl(48 96% 53%)';
|
|
119
|
+
case 'killed': return 'hsl(0 0% 45%)';
|
|
120
|
+
default: return 'hsl(0 0% 30%)';
|
|
121
|
+
}
|
|
122
|
+
}, zoomable: true, pannable: true })] }) }));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=FlowGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowGraph.js","sourceRoot":"","sources":["../../../ui/components/FlowGraph.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ExecutionProjection } from '../../src/types';
|
|
2
|
+
interface FlowStatusBarProps {
|
|
3
|
+
projection: ExecutionProjection;
|
|
4
|
+
}
|
|
5
|
+
export declare function FlowStatusBar({ projection }: FlowStatusBarProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=FlowStatusBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowStatusBar.d.ts","sourceRoot":"","sources":["../../../ui/components/FlowStatusBar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,UAAU,kBAAkB;IAC1B,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE,kBAAkB,2CAsD/D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.FlowStatusBar = FlowStatusBar;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const utils_1 = require("../utils");
|
|
8
|
+
function FlowStatusBar({ projection }) {
|
|
9
|
+
const counts = (0, react_1.useMemo)(() => {
|
|
10
|
+
const result = {};
|
|
11
|
+
for (const node of projection.graph.nodes) {
|
|
12
|
+
result[node.status] = (result[node.status] ?? 0) + 1;
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
}, [projection.graph.nodes]);
|
|
16
|
+
const totalCost = projection.totalCost;
|
|
17
|
+
const duration = projection.startedAt && projection.finishedAt
|
|
18
|
+
? ((projection.finishedAt - projection.startedAt) / 1000).toFixed(0)
|
|
19
|
+
: projection.startedAt
|
|
20
|
+
? ((Date.now() - projection.startedAt) / 1000).toFixed(0)
|
|
21
|
+
: null;
|
|
22
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-4 px-4 py-1.5 text-xs text-muted-foreground border-t border-border bg-background", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3", children: [counts.completed && (0, jsx_runtime_1.jsx)(StatusCount, { label: "completed", count: counts.completed, color: "text-green-400" }), counts.running && (0, jsx_runtime_1.jsx)(StatusCount, { label: "running", count: counts.running, color: "text-blue-400" }), counts.pending && (0, jsx_runtime_1.jsx)(StatusCount, { label: "pending", count: counts.pending, color: "text-muted-foreground" }), counts.failed && (0, jsx_runtime_1.jsx)(StatusCount, { label: "failed", count: counts.failed, color: "text-red-400" }), counts.gated && (0, jsx_runtime_1.jsx)(StatusCount, { label: "gated", count: counts.gated, color: "text-yellow-400" }), counts.skipped && (0, jsx_runtime_1.jsx)(StatusCount, { label: "skipped", count: counts.skipped, color: "text-muted-foreground/50" }), counts.killed && (0, jsx_runtime_1.jsx)(StatusCount, { label: "killed", count: counts.killed, color: "text-muted-foreground" })] }), (0, jsx_runtime_1.jsx)("div", { className: "w-px h-3 bg-border" }), (0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)(projection.status === 'running' && 'text-blue-400', projection.status === 'completed' && 'text-green-400', projection.status === 'failed' && 'text-red-400', projection.status === 'stopped' && 'text-yellow-400'), children: projection.status }), duration && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "w-px h-3 bg-border" }), (0, jsx_runtime_1.jsxs)("span", { children: [duration, "s"] })] })), totalCost > 0 && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "w-px h-3 bg-border" }), (0, jsx_runtime_1.jsxs)("span", { children: ["$", totalCost.toFixed(2)] })] }))] }));
|
|
23
|
+
}
|
|
24
|
+
function StatusCount({ label, count, color }) {
|
|
25
|
+
return ((0, jsx_runtime_1.jsxs)("span", { className: (0, utils_1.cn)('flex items-center gap-1', color), children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: count }), (0, jsx_runtime_1.jsx)("span", { children: label })] }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=FlowStatusBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowStatusBar.js","sourceRoot":"","sources":["../../../ui/components/FlowStatusBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExecutionProjection } from '../../src/types';
|
|
2
|
+
export interface MiniPipelineProps {
|
|
3
|
+
projection: ExecutionProjection;
|
|
4
|
+
/** Rendering mode. auto: graph ≤20, bar ≤50, summary >50. */
|
|
5
|
+
mode?: 'graph' | 'bar' | 'summary' | 'auto';
|
|
6
|
+
/** Height in px. Default: 32 for graph, 8 for bar, 20 for summary. */
|
|
7
|
+
height?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function MiniPipeline({ projection, mode, height }: MiniPipelineProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=MiniPipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MiniPipeline.d.ts","sourceRoot":"","sources":["../../../ui/components/MiniPipeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAkC,MAAM,iBAAiB,CAAC;AAO3F,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,mBAAmB,CAAC;IAChC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IAC5C,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiND,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,IAAa,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CAepF"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.MiniPipeline = MiniPipeline;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const types_1 = require("./node-panel/types");
|
|
8
|
+
function computeMiniLayout(nodes, edges) {
|
|
9
|
+
const nodeMap = new Map(nodes.map(n => [n.id, n]));
|
|
10
|
+
const inDegree = new Map();
|
|
11
|
+
const adj = new Map();
|
|
12
|
+
for (const n of nodes) {
|
|
13
|
+
inDegree.set(n.id, 0);
|
|
14
|
+
adj.set(n.id, []);
|
|
15
|
+
}
|
|
16
|
+
for (const e of edges) {
|
|
17
|
+
if (e.target !== 'end' && nodeMap.has(e.target)) {
|
|
18
|
+
adj.get(e.source)?.push(e.target);
|
|
19
|
+
inDegree.set(e.target, (inDegree.get(e.target) ?? 0) + 1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Kahn's algorithm for layer assignment
|
|
23
|
+
const layers = new Map();
|
|
24
|
+
const queue = [];
|
|
25
|
+
for (const [id, deg] of inDegree) {
|
|
26
|
+
if (deg === 0) {
|
|
27
|
+
queue.push(id);
|
|
28
|
+
layers.set(id, 0);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
while (queue.length > 0) {
|
|
32
|
+
const cur = queue.shift();
|
|
33
|
+
const curLayer = layers.get(cur);
|
|
34
|
+
for (const next of adj.get(cur) ?? []) {
|
|
35
|
+
layers.set(next, Math.max(layers.get(next) ?? 0, curLayer + 1));
|
|
36
|
+
const newDeg = (inDegree.get(next) ?? 1) - 1;
|
|
37
|
+
inDegree.set(next, newDeg);
|
|
38
|
+
if (newDeg === 0)
|
|
39
|
+
queue.push(next);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Assign rows within each layer
|
|
43
|
+
const layerGroups = new Map();
|
|
44
|
+
for (const [id, layer] of layers) {
|
|
45
|
+
if (!layerGroups.has(layer))
|
|
46
|
+
layerGroups.set(layer, []);
|
|
47
|
+
layerGroups.get(layer).push(id);
|
|
48
|
+
}
|
|
49
|
+
const miniNodes = [];
|
|
50
|
+
let maxRow = 0;
|
|
51
|
+
for (const [layer, ids] of layerGroups) {
|
|
52
|
+
ids.forEach((id, row) => {
|
|
53
|
+
miniNodes.push({ id, status: nodeMap.get(id)?.status ?? 'pending', layer, row });
|
|
54
|
+
if (row > maxRow)
|
|
55
|
+
maxRow = row;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const maxLayer = Math.max(0, ...[...layers.values()]);
|
|
59
|
+
return { miniNodes, maxLayer, maxRow };
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Graph mode — compact SVG mini-DAG
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
function GraphMode({ projection, height = 32 }) {
|
|
65
|
+
const { miniNodes, maxLayer, maxRow } = (0, react_1.useMemo)(() => computeMiniLayout(projection.graph.nodes, projection.graph.edges), [projection.graph.nodes, projection.graph.edges]);
|
|
66
|
+
const dotSize = 6;
|
|
67
|
+
const xGap = 16;
|
|
68
|
+
const yGap = 10;
|
|
69
|
+
const padding = 4;
|
|
70
|
+
const width = (maxLayer + 1) * (dotSize + xGap) + padding * 2;
|
|
71
|
+
const svgHeight = Math.max(height, (maxRow + 1) * (dotSize + yGap) + padding * 2);
|
|
72
|
+
const nodePos = new Map();
|
|
73
|
+
for (const n of miniNodes) {
|
|
74
|
+
const x = padding + n.layer * (dotSize + xGap) + dotSize / 2;
|
|
75
|
+
const totalRows = miniNodes.filter(m => m.layer === n.layer).length;
|
|
76
|
+
const layerHeight = totalRows * (dotSize + yGap) - yGap;
|
|
77
|
+
const startY = (svgHeight - layerHeight) / 2;
|
|
78
|
+
const y = startY + n.row * (dotSize + yGap) + dotSize / 2;
|
|
79
|
+
nodePos.set(n.id, { x, y });
|
|
80
|
+
}
|
|
81
|
+
return ((0, jsx_runtime_1.jsxs)("svg", { width: width, height: svgHeight, style: { display: 'block', overflow: 'visible' }, children: [projection.graph.edges.filter(e => e.target !== 'end').map((e, i) => {
|
|
82
|
+
const from = nodePos.get(e.source);
|
|
83
|
+
const to = nodePos.get(e.target);
|
|
84
|
+
if (!from || !to)
|
|
85
|
+
return null;
|
|
86
|
+
return ((0, jsx_runtime_1.jsx)("line", { x1: from.x + dotSize / 2, y1: from.y, x2: to.x - dotSize / 2, y2: to.y, stroke: e.state === 'taken' ? '#4ade80' : '#333', strokeWidth: e.state === 'taken' ? 1.5 : 0.5, strokeDasharray: e.state === 'not_taken' ? '2 2' : undefined }, i));
|
|
87
|
+
}), miniNodes.map(n => {
|
|
88
|
+
const pos = nodePos.get(n.id);
|
|
89
|
+
const color = types_1.STATUS_COLORS[n.status]?.dot ?? '#555';
|
|
90
|
+
const isActive = n.status === 'running' || n.status === 'gated';
|
|
91
|
+
return ((0, jsx_runtime_1.jsxs)("g", { children: [(0, jsx_runtime_1.jsx)("circle", { cx: pos.x, cy: pos.y, r: dotSize / 2, fill: color, style: isActive ? { filter: `drop-shadow(0 0 3px ${color})` } : undefined, children: isActive && ((0, jsx_runtime_1.jsx)("animate", { attributeName: "opacity", values: "1;0.4;1", dur: "1.5s", repeatCount: "indefinite" })) }), (0, jsx_runtime_1.jsxs)("title", { children: [n.id, ": ", n.status] })] }, n.id));
|
|
92
|
+
})] }));
|
|
93
|
+
}
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// Bar mode — proportional status bar
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
function BarMode({ projection, height = 8 }) {
|
|
98
|
+
const counts = (0, react_1.useMemo)(() => {
|
|
99
|
+
const c = {};
|
|
100
|
+
for (const n of projection.graph.nodes) {
|
|
101
|
+
c[n.status] = (c[n.status] ?? 0) + 1;
|
|
102
|
+
}
|
|
103
|
+
return c;
|
|
104
|
+
}, [projection.graph.nodes]);
|
|
105
|
+
const total = projection.graph.nodes.length;
|
|
106
|
+
if (total === 0)
|
|
107
|
+
return null;
|
|
108
|
+
const segments = Object.entries(counts)
|
|
109
|
+
.sort(([a], [b]) => {
|
|
110
|
+
const order = ['completed', 'running', 'gated', 'retrying', 'failed', 'killed', 'skipped', 'pending'];
|
|
111
|
+
return order.indexOf(a) - order.indexOf(b);
|
|
112
|
+
});
|
|
113
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', height, borderRadius: height / 2, overflow: 'hidden', background: '#1a1a1a' }, children: segments.map(([status, count]) => ((0, jsx_runtime_1.jsx)("div", { title: `${count} ${status}`, style: {
|
|
114
|
+
width: `${(count / total) * 100}%`,
|
|
115
|
+
background: types_1.STATUS_COLORS[status]?.dot ?? '#555',
|
|
116
|
+
transition: 'width 0.3s',
|
|
117
|
+
} }, status))) }));
|
|
118
|
+
}
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Summary mode — text counts
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
function SummaryMode({ projection, height = 20 }) {
|
|
123
|
+
const counts = (0, react_1.useMemo)(() => {
|
|
124
|
+
const c = {};
|
|
125
|
+
for (const n of projection.graph.nodes) {
|
|
126
|
+
c[n.status] = (c[n.status] ?? 0) + 1;
|
|
127
|
+
}
|
|
128
|
+
return c;
|
|
129
|
+
}, [projection.graph.nodes]);
|
|
130
|
+
const parts = Object.entries(counts)
|
|
131
|
+
.filter(([, v]) => v > 0)
|
|
132
|
+
.sort(([a], [b]) => {
|
|
133
|
+
const order = ['completed', 'running', 'gated', 'failed', 'pending', 'killed', 'skipped'];
|
|
134
|
+
return order.indexOf(a) - order.indexOf(b);
|
|
135
|
+
});
|
|
136
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: { height, display: 'flex', alignItems: 'center', gap: 8, fontSize: 10 }, children: parts.map(([status, count]) => ((0, jsx_runtime_1.jsxs)("span", { style: { color: types_1.STATUS_COLORS[status]?.dot ?? '#888' }, children: [count, " ", status] }, status))) }));
|
|
137
|
+
}
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// MiniPipeline — main component (ADR-004)
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
function MiniPipeline({ projection, mode = 'auto', height }) {
|
|
142
|
+
const nodeCount = projection.graph.nodes.length;
|
|
143
|
+
const resolvedMode = mode === 'auto'
|
|
144
|
+
? nodeCount <= 20 ? 'graph' : nodeCount <= 50 ? 'bar' : 'summary'
|
|
145
|
+
: mode;
|
|
146
|
+
switch (resolvedMode) {
|
|
147
|
+
case 'graph':
|
|
148
|
+
return (0, jsx_runtime_1.jsx)(GraphMode, { projection: projection, height: height ?? 32 });
|
|
149
|
+
case 'bar':
|
|
150
|
+
return (0, jsx_runtime_1.jsx)(BarMode, { projection: projection, height: height ?? 8 });
|
|
151
|
+
case 'summary':
|
|
152
|
+
return (0, jsx_runtime_1.jsx)(SummaryMode, { projection: projection, height: height ?? 20 });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=MiniPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MiniPipeline.js","sourceRoot":"","sources":["../../../ui/components/MiniPipeline.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type NodeProps } from '@xyflow/react';
|
|
2
|
+
declare function NodeCardInner({ data, selected }: NodeProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export declare const NodeCard: import("react").MemoExoticComponent<typeof NodeCardInner>;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=NodeCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeCard.d.ts","sourceRoot":"","sources":["../../../ui/components/NodeCard.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AA+BjE,iBAAS,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,2CA8CnD;AAED,eAAO,MAAM,QAAQ,2DAAsB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NodeCard = void 0;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const react_2 = require("@xyflow/react");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
const utils_2 = require("../core/utils");
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Status styling
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const STATUS_STYLES = {
|
|
14
|
+
pending: { bg: 'bg-muted/30', border: 'border-muted', icon: '○' },
|
|
15
|
+
running: { bg: 'bg-blue-500/10', border: 'border-blue-500', icon: '●', animate: 'animate-pulse-status' },
|
|
16
|
+
completed: { bg: 'bg-green-500/10', border: 'border-green-500', icon: '✓' },
|
|
17
|
+
failed: { bg: 'bg-red-500/10', border: 'border-red-500', icon: '✗' },
|
|
18
|
+
killed: { bg: 'bg-muted/30', border: 'border-muted', icon: '■' },
|
|
19
|
+
skipped: { bg: 'bg-muted/20', border: 'border-muted/50', icon: '→' },
|
|
20
|
+
gated: { bg: 'bg-yellow-500/10', border: 'border-yellow-500', icon: '⏸', animate: 'animate-pulse-status' },
|
|
21
|
+
retrying: { bg: 'bg-orange-500/10', border: 'border-orange-500', icon: '↻', animate: 'animate-pulse-status' },
|
|
22
|
+
};
|
|
23
|
+
const TYPE_BADGES = {
|
|
24
|
+
agent: { label: 'Agent', color: 'bg-blue-500/20 text-blue-400' },
|
|
25
|
+
deterministic: { label: 'Check', color: 'bg-purple-500/20 text-purple-400' },
|
|
26
|
+
gate: { label: 'Gate', color: 'bg-yellow-500/20 text-yellow-400' },
|
|
27
|
+
verify: { label: 'Verify', color: 'bg-orange-500/20 text-orange-400' },
|
|
28
|
+
};
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Component
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
function NodeCardInner({ data, selected }) {
|
|
33
|
+
const node = data;
|
|
34
|
+
const style = STATUS_STYLES[node.status] ?? STATUS_STYLES.pending;
|
|
35
|
+
const badge = TYPE_BADGES[node.nodeType] ?? { label: node.nodeType, color: 'bg-muted text-muted-foreground' };
|
|
36
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_2.Handle, { type: "target", position: react_2.Position.Left, className: "!bg-muted-foreground !w-2 !h-2" }), (0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)('rounded-lg border px-3 py-2 shadow-sm transition-all w-[200px]', style.bg, style.border, selected && 'ring-2 ring-primary ring-offset-1 ring-offset-background'), children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)('text-sm', style.animate), children: style.icon }), (0, jsx_runtime_1.jsx)("span", { className: "text-sm font-medium truncate flex-1", children: node.displayName })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mt-1.5 gap-1", children: [(0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)('text-[10px] px-1.5 py-0.5 rounded-full font-medium', badge.color), children: badge.label }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-1.5 text-[10px] text-muted-foreground", children: [node.model && (0, jsx_runtime_1.jsx)("span", { children: node.model }), node.elapsedMs && (0, jsx_runtime_1.jsx)("span", { children: (0, utils_2.formatElapsed)(node.elapsedMs) }), node.attempt > 1 && (0, jsx_runtime_1.jsxs)("span", { children: ["\u00D7", node.attempt] })] })] }), node.error && ((0, jsx_runtime_1.jsx)("div", { className: "mt-1 text-[10px] text-red-400 truncate", title: node.error, children: node.error }))] }), (0, jsx_runtime_1.jsx)(react_2.Handle, { type: "source", position: react_2.Position.Right, className: "!bg-muted-foreground !w-2 !h-2" })] }));
|
|
37
|
+
}
|
|
38
|
+
exports.NodeCard = (0, react_1.memo)(NodeCardInner);
|
|
39
|
+
//# sourceMappingURL=NodeCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeCard.js","sourceRoot":"","sources":["../../../ui/components/NodeCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExecutionProjection } from '../../src/types';
|
|
2
|
+
interface NodeDetailPanelProps {
|
|
3
|
+
projection: ExecutionProjection;
|
|
4
|
+
nodeId: string;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
onAction: (action: 'retry' | 'skip' | 'approve' | 'reject', nodeId: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function NodeDetailPanel({ projection, nodeId, onClose, onAction }: NodeDetailPanelProps): import("react/jsx-runtime").JSX.Element | null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=NodeDetailPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeDetailPanel.d.ts","sourceRoot":"","sources":["../../../ui/components/NodeDetailPanel.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,iBAAiB,CAAC;AAO3E,UAAU,oBAAoB;IAC5B,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrF;AAMD,wBAAgB,eAAe,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,oBAAoB,kDAyG9F"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NodeDetailPanel = NodeDetailPanel;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const useNodeOutput_1 = require("../hooks/useNodeOutput");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Component
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
function NodeDetailPanel({ projection, nodeId, onClose, onAction }) {
|
|
13
|
+
const node = (0, react_1.useMemo)(() => projection.graph.nodes.find((n) => n.id === nodeId), [projection, nodeId]);
|
|
14
|
+
const { lines, total, loading, scrollRef } = (0, useNodeOutput_1.useNodeOutput)({
|
|
15
|
+
executionId: projection.id,
|
|
16
|
+
nodeId,
|
|
17
|
+
});
|
|
18
|
+
if (!node)
|
|
19
|
+
return null;
|
|
20
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "flex h-full flex-col border-l border-border bg-background animate-slide-in", style: { width: '40%', minWidth: 360 }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between border-b border-border px-4 py-3", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(StatusDot, { status: node.status }), (0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: node.displayName }), (0, jsx_runtime_1.jsxs)("span", { className: "text-xs text-muted-foreground", children: ["(", node.nodeType, ")"] })] }), (0, jsx_runtime_1.jsx)("button", { onClick: onClose, className: "text-muted-foreground hover:text-foreground text-lg", children: "\u00D7" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "border-b border-border px-4 py-2 text-xs text-muted-foreground space-y-1", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between", children: [(0, jsx_runtime_1.jsxs)("span", { children: ["Status: ", (0, jsx_runtime_1.jsx)("span", { className: "text-foreground", children: node.status })] }), node.attempt > 0 && (0, jsx_runtime_1.jsxs)("span", { children: ["Attempt: ", node.attempt] })] }), node.model && (0, jsx_runtime_1.jsxs)("div", { children: ["Model: ", node.model] }), node.elapsedMs && (0, jsx_runtime_1.jsxs)("div", { children: ["Duration: ", (node.elapsedMs / 1000).toFixed(1), "s"] }), node.error && (0, jsx_runtime_1.jsxs)("div", { className: "text-red-400", children: ["Error: ", node.error] })] }), node.status === 'gated' && ((0, jsx_runtime_1.jsxs)("div", { className: "border-b border-border px-4 py-3", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-sm font-medium mb-2", children: "Awaiting Approval" }), node.gateData && ((0, jsx_runtime_1.jsx)("pre", { className: "text-xs bg-muted/30 rounded p-2 mb-2 max-h-32 overflow-auto", children: JSON.stringify(node.gateData, null, 2) })), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-2", children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => onAction('approve', nodeId), className: "px-3 py-1.5 text-sm bg-green-600 hover:bg-green-700 text-white rounded", children: "Approve" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => onAction('reject', nodeId), className: "px-3 py-1.5 text-sm bg-red-600 hover:bg-red-700 text-white rounded", children: "Reject" })] })] })), (node.status === 'failed' || node.status === 'completed' || node.status === 'killed') && ((0, jsx_runtime_1.jsxs)("div", { className: "border-b border-border px-4 py-2 flex gap-2", children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => onAction('retry', nodeId), className: "px-3 py-1 text-xs bg-blue-600 hover:bg-blue-700 text-white rounded", children: "Retry" }), node.status !== 'completed' && ((0, jsx_runtime_1.jsx)("button", { onClick: () => onAction('skip', nodeId), className: "px-3 py-1 text-xs bg-muted hover:bg-muted/80 text-foreground rounded", children: "Skip" }))] })), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 overflow-hidden flex flex-col", children: [(0, jsx_runtime_1.jsxs)("div", { className: "px-4 py-2 text-xs text-muted-foreground border-b border-border flex justify-between", children: [(0, jsx_runtime_1.jsxs)("span", { children: ["Output (", total, " lines)"] }), loading && (0, jsx_runtime_1.jsx)("span", { className: "animate-pulse-status", children: "Loading..." })] }), (0, jsx_runtime_1.jsx)("div", { ref: scrollRef, className: "flex-1 overflow-y-auto px-4 py-2 font-mono text-xs leading-relaxed", children: lines.length === 0 ? ((0, jsx_runtime_1.jsx)("span", { className: "text-muted-foreground", children: "No output yet" })) : (lines.map((line, i) => ((0, jsx_runtime_1.jsx)("div", { className: "whitespace-pre-wrap break-words", children: line }, i)))) })] })] }));
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Status dot
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function StatusDot({ status }) {
|
|
26
|
+
const colors = {
|
|
27
|
+
pending: 'bg-muted-foreground',
|
|
28
|
+
running: 'bg-blue-500 animate-pulse-status',
|
|
29
|
+
completed: 'bg-green-500',
|
|
30
|
+
failed: 'bg-red-500',
|
|
31
|
+
killed: 'bg-muted-foreground',
|
|
32
|
+
skipped: 'bg-muted-foreground/50',
|
|
33
|
+
gated: 'bg-yellow-500 animate-pulse-status',
|
|
34
|
+
retrying: 'bg-orange-500 animate-pulse-status',
|
|
35
|
+
};
|
|
36
|
+
return (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)('w-2 h-2 rounded-full', colors[status] ?? 'bg-muted') });
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=NodeDetailPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeDetailPanel.js","sourceRoot":"","sources":["../../../ui/components/NodeDetailPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProjectionNode } from '../../../src/types';
|
|
2
|
+
interface Props {
|
|
3
|
+
node: ProjectionNode;
|
|
4
|
+
onRetry: () => void;
|
|
5
|
+
onSkip: () => void;
|
|
6
|
+
/** Is the execution still running? Controls are hidden while running. */
|
|
7
|
+
executionRunning?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Node lifecycle controls: Retry/Redo/Skip.
|
|
11
|
+
* Shows different buttons based on node status.
|
|
12
|
+
* Hidden while the execution is actively running (can't retry a running node).
|
|
13
|
+
*/
|
|
14
|
+
export declare function Controls({ node, onRetry, onSkip, executionRunning }: Props): import("react/jsx-runtime").JSX.Element | null;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=Controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Controls.d.ts","sourceRoot":"","sources":["../../../../ui/components/node-panel/Controls.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,UAAU,KAAK;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,KAAK,kDAsB1E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Controls = Controls;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* Node lifecycle controls: Retry/Redo/Skip.
|
|
8
|
+
* Shows different buttons based on node status.
|
|
9
|
+
* Hidden while the execution is actively running (can't retry a running node).
|
|
10
|
+
*/
|
|
11
|
+
function Controls({ node, onRetry, onSkip, executionRunning }) {
|
|
12
|
+
if (executionRunning)
|
|
13
|
+
return null;
|
|
14
|
+
const showRetry = node.status === 'failed' || node.status === 'killed';
|
|
15
|
+
const showRedo = node.status === 'completed';
|
|
16
|
+
const showSkip = node.status === 'failed' || node.status === 'killed' || node.status === 'pending';
|
|
17
|
+
if (!showRetry && !showRedo && !showSkip)
|
|
18
|
+
return null;
|
|
19
|
+
return ((0, jsx_runtime_1.jsxs)("div", { style: { padding: '12px 24px', borderBottom: '1px solid #302e2b', display: 'flex', gap: 8 }, children: [showRetry && ((0, jsx_runtime_1.jsx)(Btn, { label: "Retry", color: "#3b82f6", onClick: onRetry })), showRedo && ((0, jsx_runtime_1.jsx)(Btn, { label: "Redo", color: "#a855f7", onClick: onRetry })), showSkip && ((0, jsx_runtime_1.jsx)(Btn, { label: "Skip", color: "#888", onClick: onSkip }))] }));
|
|
20
|
+
}
|
|
21
|
+
function Btn({ label, color, onClick }) {
|
|
22
|
+
return ((0, jsx_runtime_1.jsx)("button", { onClick: onClick, style: {
|
|
23
|
+
background: color + '18', color, border: `1px solid ${color}33`,
|
|
24
|
+
borderRadius: 6, padding: '4px 12px', fontSize: 11, cursor: 'pointer', fontWeight: 500,
|
|
25
|
+
transition: 'all 150ms',
|
|
26
|
+
}, children: label }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=Controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Controls.js","sourceRoot":"","sources":["../../../../ui/components/node-panel/Controls.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAiBb,4BAsBC;;AA3BD;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAS;IACzE,IAAI,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IAEnG,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEtD,OAAO,CACL,iCAAK,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,aAC7F,SAAS,IAAI,CACZ,uBAAC,GAAG,IAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAE,OAAO,GAAI,CACxD,EACA,QAAQ,IAAI,CACX,uBAAC,GAAG,IAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAE,OAAO,GAAI,CACvD,EACA,QAAQ,IAAI,CACX,uBAAC,GAAG,IAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAE,MAAM,GAAI,CACnD,IACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAyD;IAC3F,OAAO,CACL,mCAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;YAC/B,UAAU,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI;YAC/D,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG;YACtF,UAAU,EAAE,WAAW;SACxB,YACE,KAAK,GACC,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBar.d.ts","sourceRoot":"","sources":["../../../../ui/components/node-panel/ErrorBar.tsx"],"names":[],"mappings":"AAEA,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,2CAWxC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ErrorBar = ErrorBar;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
function ErrorBar({ error }) {
|
|
7
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
8
|
+
padding: '12px 24px', fontSize: 11,
|
|
9
|
+
color: '#f87171', background: '#3a1a1a44',
|
|
10
|
+
borderBottom: '1px solid #302e2b',
|
|
11
|
+
borderLeft: '3px solid #f8717144',
|
|
12
|
+
}, children: error }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ErrorBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBar.js","sourceRoot":"","sources":["../../../../ui/components/node-panel/ErrorBar.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAMb,4BAWC;;AAXD,SAAgB,QAAQ,CAAC,EAAE,KAAK,EAAS;IACvC,OAAO,CACL,gCAAK,KAAK,EAAE;YACV,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE;YAClC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW;YACzC,YAAY,EAAE,mBAAmB;YACjC,UAAU,EAAE,qBAAqB;SAClC,YACE,KAAK,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ProjectionNode } from '../../../src/types';
|
|
2
|
+
interface Props {
|
|
3
|
+
node: ProjectionNode;
|
|
4
|
+
onResolve: (resolution: string) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Data-driven gate section (ADR-002).
|
|
8
|
+
* Reads allowedResolutions from gateData. Default: ['approved', 'rejected'].
|
|
9
|
+
* Renders one button per allowed resolution.
|
|
10
|
+
*/
|
|
11
|
+
export declare function Gate({ node, onResolve }: Props): import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=Gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gate.d.ts","sourceRoot":"","sources":["../../../../ui/components/node-panel/Gate.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,UAAU,KAAK;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAmBD;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,kDA0C9C"}
|