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.
Files changed (233) hide show
  1. package/dist/bridge/bridge.d.ts +34 -0
  2. package/dist/bridge/bridge.d.ts.map +1 -0
  3. package/dist/bridge/bridge.js +365 -0
  4. package/dist/bridge/bridge.js.map +1 -0
  5. package/dist/bridge/index.d.ts +3 -0
  6. package/dist/bridge/index.d.ts.map +1 -0
  7. package/dist/bridge/index.js +6 -0
  8. package/dist/bridge/index.js.map +1 -0
  9. package/dist/runtimes/copilot/copilot-adapter.d.ts +28 -0
  10. package/dist/runtimes/copilot/copilot-adapter.d.ts.map +1 -0
  11. package/dist/runtimes/copilot/copilot-adapter.js +50 -0
  12. package/dist/runtimes/copilot/copilot-adapter.js.map +1 -0
  13. package/dist/runtimes/copilot/copilot-backend.d.ts +49 -0
  14. package/dist/runtimes/copilot/copilot-backend.d.ts.map +1 -0
  15. package/dist/runtimes/copilot/copilot-backend.js +13 -0
  16. package/dist/runtimes/copilot/copilot-backend.js.map +1 -0
  17. package/dist/runtimes/copilot/index.d.ts +5 -0
  18. package/dist/runtimes/copilot/index.d.ts.map +1 -0
  19. package/dist/runtimes/copilot/index.js +11 -0
  20. package/dist/runtimes/copilot/index.js.map +1 -0
  21. package/dist/runtimes/copilot/process-killer.d.ts +13 -0
  22. package/dist/runtimes/copilot/process-killer.d.ts.map +1 -0
  23. package/dist/runtimes/copilot/process-killer.js +77 -0
  24. package/dist/runtimes/copilot/process-killer.js.map +1 -0
  25. package/dist/runtimes/copilot/subprocess-backend.d.ts +26 -0
  26. package/dist/runtimes/copilot/subprocess-backend.d.ts.map +1 -0
  27. package/dist/runtimes/copilot/subprocess-backend.js +308 -0
  28. package/dist/runtimes/copilot/subprocess-backend.js.map +1 -0
  29. package/dist/runtimes/mock/index.d.ts +3 -0
  30. package/dist/runtimes/mock/index.d.ts.map +1 -0
  31. package/dist/runtimes/mock/index.js +6 -0
  32. package/dist/runtimes/mock/index.js.map +1 -0
  33. package/dist/runtimes/mock/mock-runtime.d.ts +43 -0
  34. package/dist/runtimes/mock/mock-runtime.d.ts.map +1 -0
  35. package/dist/runtimes/mock/mock-runtime.js +153 -0
  36. package/dist/runtimes/mock/mock-runtime.js.map +1 -0
  37. package/dist/src/agent.d.ts +35 -0
  38. package/dist/src/agent.d.ts.map +1 -0
  39. package/dist/src/agent.js +257 -0
  40. package/dist/src/agent.js.map +1 -0
  41. package/dist/src/events.d.ts +153 -0
  42. package/dist/src/events.d.ts.map +1 -0
  43. package/dist/src/events.js +11 -0
  44. package/dist/src/events.js.map +1 -0
  45. package/dist/src/index.d.ts +8 -0
  46. package/dist/src/index.d.ts.map +1 -0
  47. package/dist/src/index.js +24 -0
  48. package/dist/src/index.js.map +1 -0
  49. package/dist/src/nodes.d.ts +63 -0
  50. package/dist/src/nodes.d.ts.map +1 -0
  51. package/dist/src/nodes.js +120 -0
  52. package/dist/src/nodes.js.map +1 -0
  53. package/dist/src/scheduler.d.ts +11 -0
  54. package/dist/src/scheduler.d.ts.map +1 -0
  55. package/dist/src/scheduler.js +478 -0
  56. package/dist/src/scheduler.js.map +1 -0
  57. package/dist/src/types.d.ts +201 -0
  58. package/dist/src/types.d.ts.map +1 -0
  59. package/dist/src/types.js +38 -0
  60. package/dist/src/types.js.map +1 -0
  61. package/dist/src/verify.d.ts +51 -0
  62. package/dist/src/verify.d.ts.map +1 -0
  63. package/dist/src/verify.js +126 -0
  64. package/dist/src/verify.js.map +1 -0
  65. package/dist/state/index.d.ts +5 -0
  66. package/dist/state/index.d.ts.map +1 -0
  67. package/dist/state/index.js +14 -0
  68. package/dist/state/index.js.map +1 -0
  69. package/dist/state/reducer.d.ts +11 -0
  70. package/dist/state/reducer.d.ts.map +1 -0
  71. package/dist/state/reducer.js +223 -0
  72. package/dist/state/reducer.js.map +1 -0
  73. package/dist/state/state-runtime.d.ts +30 -0
  74. package/dist/state/state-runtime.d.ts.map +1 -0
  75. package/dist/state/state-runtime.js +131 -0
  76. package/dist/state/state-runtime.js.map +1 -0
  77. package/dist/state/storage-memory.d.ts +24 -0
  78. package/dist/state/storage-memory.d.ts.map +1 -0
  79. package/dist/state/storage-memory.js +91 -0
  80. package/dist/state/storage-memory.js.map +1 -0
  81. package/dist/state/storage.d.ts +29 -0
  82. package/dist/state/storage.d.ts.map +1 -0
  83. package/dist/state/storage.js +175 -0
  84. package/dist/state/storage.js.map +1 -0
  85. package/dist/theme/index.d.ts +128 -0
  86. package/dist/theme/index.d.ts.map +1 -0
  87. package/dist/theme/index.js +59 -0
  88. package/dist/theme/index.js.map +1 -0
  89. package/dist/ui/ansi.d.ts +9 -0
  90. package/dist/ui/ansi.d.ts.map +1 -0
  91. package/dist/ui/ansi.js +78 -0
  92. package/dist/ui/ansi.js.map +1 -0
  93. package/dist/ui/components/FlowEdge.d.ts +5 -0
  94. package/dist/ui/components/FlowEdge.d.ts.map +1 -0
  95. package/dist/ui/components/FlowEdge.js +33 -0
  96. package/dist/ui/components/FlowEdge.js.map +1 -0
  97. package/dist/ui/components/FlowGraph.d.ts +10 -0
  98. package/dist/ui/components/FlowGraph.d.ts.map +1 -0
  99. package/dist/ui/components/FlowGraph.js +124 -0
  100. package/dist/ui/components/FlowGraph.js.map +1 -0
  101. package/dist/ui/components/FlowStatusBar.d.ts +7 -0
  102. package/dist/ui/components/FlowStatusBar.d.ts.map +1 -0
  103. package/dist/ui/components/FlowStatusBar.js +27 -0
  104. package/dist/ui/components/FlowStatusBar.js.map +1 -0
  105. package/dist/ui/components/MiniPipeline.d.ts +10 -0
  106. package/dist/ui/components/MiniPipeline.d.ts.map +1 -0
  107. package/dist/ui/components/MiniPipeline.js +155 -0
  108. package/dist/ui/components/MiniPipeline.js.map +1 -0
  109. package/dist/ui/components/NodeCard.d.ts +5 -0
  110. package/dist/ui/components/NodeCard.d.ts.map +1 -0
  111. package/dist/ui/components/NodeCard.js +39 -0
  112. package/dist/ui/components/NodeCard.js.map +1 -0
  113. package/dist/ui/components/NodeDetailPanel.d.ts +10 -0
  114. package/dist/ui/components/NodeDetailPanel.d.ts.map +1 -0
  115. package/dist/ui/components/NodeDetailPanel.js +38 -0
  116. package/dist/ui/components/NodeDetailPanel.js.map +1 -0
  117. package/dist/ui/components/node-panel/Controls.d.ts +16 -0
  118. package/dist/ui/components/node-panel/Controls.d.ts.map +1 -0
  119. package/dist/ui/components/node-panel/Controls.js +28 -0
  120. package/dist/ui/components/node-panel/Controls.js.map +1 -0
  121. package/dist/ui/components/node-panel/ErrorBar.d.ts +6 -0
  122. package/dist/ui/components/node-panel/ErrorBar.d.ts.map +1 -0
  123. package/dist/ui/components/node-panel/ErrorBar.js +14 -0
  124. package/dist/ui/components/node-panel/ErrorBar.js.map +1 -0
  125. package/dist/ui/components/node-panel/Gate.d.ts +13 -0
  126. package/dist/ui/components/node-panel/Gate.d.ts.map +1 -0
  127. package/dist/ui/components/node-panel/Gate.js +40 -0
  128. package/dist/ui/components/node-panel/Gate.js.map +1 -0
  129. package/dist/ui/components/node-panel/Header.d.ts +10 -0
  130. package/dist/ui/components/node-panel/Header.d.ts.map +1 -0
  131. package/dist/ui/components/node-panel/Header.js +19 -0
  132. package/dist/ui/components/node-panel/Header.js.map +1 -0
  133. package/dist/ui/components/node-panel/Info.d.ts +7 -0
  134. package/dist/ui/components/node-panel/Info.d.ts.map +1 -0
  135. package/dist/ui/components/node-panel/Info.js +23 -0
  136. package/dist/ui/components/node-panel/Info.js.map +1 -0
  137. package/dist/ui/components/node-panel/Output.d.ts +27 -0
  138. package/dist/ui/components/node-panel/Output.d.ts.map +1 -0
  139. package/dist/ui/components/node-panel/Output.js +66 -0
  140. package/dist/ui/components/node-panel/Output.js.map +1 -0
  141. package/dist/ui/components/node-panel/index.d.ts +47 -0
  142. package/dist/ui/components/node-panel/index.d.ts.map +1 -0
  143. package/dist/ui/components/node-panel/index.js +54 -0
  144. package/dist/ui/components/node-panel/index.js.map +1 -0
  145. package/dist/ui/components/node-panel/types.d.ts +23 -0
  146. package/dist/ui/components/node-panel/types.d.ts.map +1 -0
  147. package/dist/ui/components/node-panel/types.js +24 -0
  148. package/dist/ui/components/node-panel/types.js.map +1 -0
  149. package/dist/ui/core/components/Badge.d.ts +6 -0
  150. package/dist/ui/core/components/Badge.d.ts.map +1 -0
  151. package/dist/ui/core/components/Badge.js +11 -0
  152. package/dist/ui/core/components/Badge.js.map +1 -0
  153. package/dist/ui/core/components/Button.d.ts +9 -0
  154. package/dist/ui/core/components/Button.d.ts.map +1 -0
  155. package/dist/ui/core/components/Button.js +18 -0
  156. package/dist/ui/core/components/Button.js.map +1 -0
  157. package/dist/ui/core/components/ConfirmDialog.d.ts +11 -0
  158. package/dist/ui/core/components/ConfirmDialog.d.ts.map +1 -0
  159. package/dist/ui/core/components/ConfirmDialog.js +23 -0
  160. package/dist/ui/core/components/ConfirmDialog.js.map +1 -0
  161. package/dist/ui/core/components/ExecutionCard.d.ts +12 -0
  162. package/dist/ui/core/components/ExecutionCard.d.ts.map +1 -0
  163. package/dist/ui/core/components/ExecutionCard.js +15 -0
  164. package/dist/ui/core/components/ExecutionCard.js.map +1 -0
  165. package/dist/ui/core/components/NodeListItem.d.ts +10 -0
  166. package/dist/ui/core/components/NodeListItem.d.ts.map +1 -0
  167. package/dist/ui/core/components/NodeListItem.js +27 -0
  168. package/dist/ui/core/components/NodeListItem.js.map +1 -0
  169. package/dist/ui/core/components/PageHeader.d.ts +10 -0
  170. package/dist/ui/core/components/PageHeader.d.ts.map +1 -0
  171. package/dist/ui/core/components/PageHeader.js +9 -0
  172. package/dist/ui/core/components/PageHeader.js.map +1 -0
  173. package/dist/ui/core/components/SectionLabel.d.ts +6 -0
  174. package/dist/ui/core/components/SectionLabel.d.ts.map +1 -0
  175. package/dist/ui/core/components/SectionLabel.js +9 -0
  176. package/dist/ui/core/components/SectionLabel.js.map +1 -0
  177. package/dist/ui/core/components/Skeleton.d.ts +7 -0
  178. package/dist/ui/core/components/Skeleton.d.ts.map +1 -0
  179. package/dist/ui/core/components/Skeleton.js +26 -0
  180. package/dist/ui/core/components/Skeleton.js.map +1 -0
  181. package/dist/ui/core/components/Stat.d.ts +8 -0
  182. package/dist/ui/core/components/Stat.d.ts.map +1 -0
  183. package/dist/ui/core/components/Stat.js +9 -0
  184. package/dist/ui/core/components/Stat.js.map +1 -0
  185. package/dist/ui/core/components/Toast.d.ts +7 -0
  186. package/dist/ui/core/components/Toast.d.ts.map +1 -0
  187. package/dist/ui/core/components/Toast.js +28 -0
  188. package/dist/ui/core/components/Toast.js.map +1 -0
  189. package/dist/ui/core/components/__tests__/primitives.test.d.ts +2 -0
  190. package/dist/ui/core/components/__tests__/primitives.test.d.ts.map +1 -0
  191. package/dist/ui/core/components/__tests__/primitives.test.js +3 -0
  192. package/dist/ui/core/components/__tests__/primitives.test.js.map +1 -0
  193. package/dist/ui/core/components/index.d.ts +21 -0
  194. package/dist/ui/core/components/index.d.ts.map +1 -0
  195. package/dist/ui/core/components/index.js +24 -0
  196. package/dist/ui/core/components/index.js.map +1 -0
  197. package/dist/ui/core/index.d.ts +17 -0
  198. package/dist/ui/core/index.d.ts.map +1 -0
  199. package/dist/ui/core/index.js +56 -0
  200. package/dist/ui/core/index.js.map +1 -0
  201. package/dist/ui/core/utils.d.ts +6 -0
  202. package/dist/ui/core/utils.d.ts.map +1 -0
  203. package/dist/ui/core/utils.js +32 -0
  204. package/dist/ui/core/utils.js.map +1 -0
  205. package/dist/ui/graph/index.d.ts +4 -0
  206. package/dist/ui/graph/index.d.ts.map +1 -0
  207. package/dist/ui/graph/index.js +11 -0
  208. package/dist/ui/graph/index.js.map +1 -0
  209. package/dist/ui/hooks/useAutoSelectNode.d.ts +3 -0
  210. package/dist/ui/hooks/useAutoSelectNode.d.ts.map +1 -0
  211. package/dist/ui/hooks/useAutoSelectNode.js +36 -0
  212. package/dist/ui/hooks/useAutoSelectNode.js.map +1 -0
  213. package/dist/ui/hooks/useFlowExecution.d.ts +32 -0
  214. package/dist/ui/hooks/useFlowExecution.d.ts.map +1 -0
  215. package/dist/ui/hooks/useFlowExecution.js +113 -0
  216. package/dist/ui/hooks/useFlowExecution.js.map +1 -0
  217. package/dist/ui/hooks/useNodeNavigation.d.ts +3 -0
  218. package/dist/ui/hooks/useNodeNavigation.d.ts.map +1 -0
  219. package/dist/ui/hooks/useNodeNavigation.js +38 -0
  220. package/dist/ui/hooks/useNodeNavigation.js.map +1 -0
  221. package/dist/ui/hooks/useNodeOutput.d.ts +21 -0
  222. package/dist/ui/hooks/useNodeOutput.d.ts.map +1 -0
  223. package/dist/ui/hooks/useNodeOutput.js +75 -0
  224. package/dist/ui/hooks/useNodeOutput.js.map +1 -0
  225. package/dist/ui/index.d.ts +16 -0
  226. package/dist/ui/index.d.ts.map +1 -0
  227. package/dist/ui/index.js +37 -0
  228. package/dist/ui/index.js.map +1 -0
  229. package/dist/ui/utils.d.ts +3 -0
  230. package/dist/ui/utils.d.ts.map +1 -0
  231. package/dist/ui/utils.js +9 -0
  232. package/dist/ui/utils.js.map +1 -0
  233. 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,6 @@
1
+ interface Props {
2
+ error: string;
3
+ }
4
+ export declare function ErrorBar({ error }: Props): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=ErrorBar.d.ts.map
@@ -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"}