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,40 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Gate = Gate;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /** Capitalize first letter of each word. */
7
+ function titleCase(s) {
8
+ return s.replace(/\b\w/g, c => c.toUpperCase());
9
+ }
10
+ const RESOLUTION_COLORS = {
11
+ approved: '#22c55e',
12
+ rejected: '#ef4444',
13
+ deploy: '#3b82f6',
14
+ rollback: '#ef4444',
15
+ skip: '#888',
16
+ };
17
+ function resolveColor(resolution) {
18
+ return RESOLUTION_COLORS[resolution.toLowerCase()] ?? '#3b82f6';
19
+ }
20
+ /**
21
+ * Data-driven gate section (ADR-002).
22
+ * Reads allowedResolutions from gateData. Default: ['approved', 'rejected'].
23
+ * Renders one button per allowed resolution.
24
+ */
25
+ function Gate({ node, onResolve }) {
26
+ if (node.status !== 'gated')
27
+ return null;
28
+ const gateData = node.gateData ?? {};
29
+ const resolutions = (Array.isArray(gateData.allowedResolutions) ? gateData.allowedResolutions : null) ??
30
+ ['approved', 'rejected'];
31
+ return ((0, jsx_runtime_1.jsxs)("div", { style: { padding: '12px 24px', borderBottom: '1px solid #302e2b', background: '#352a1533', borderLeft: '3px solid #fbbf2444' }, children: [(0, jsx_runtime_1.jsx)("div", { style: { fontWeight: 600, color: '#fbbf24', fontSize: 12, marginBottom: 6 }, children: "Awaiting Resolution" }), Object.keys(gateData).filter(k => k !== 'allowedResolutions').length > 0 && ((0, jsx_runtime_1.jsx)("pre", { style: { margin: '0 0 8px', color: '#8a8578', fontSize: 11, maxHeight: 80, overflow: 'auto', background: '#343230', padding: 8, borderRadius: 6 }, children: JSON.stringify(Object.fromEntries(Object.entries(gateData).filter(([k]) => k !== 'allowedResolutions')), null, 2) })), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', gap: 6 }, children: resolutions.map(resolution => {
32
+ const color = resolveColor(resolution);
33
+ return ((0, jsx_runtime_1.jsx)("button", { onClick: () => onResolve(resolution), style: {
34
+ background: color + '18', color, border: `1px solid ${color}33`,
35
+ borderRadius: 6, padding: '4px 12px', fontSize: 11,
36
+ cursor: 'pointer', fontWeight: 500,
37
+ }, children: titleCase(resolution) }, resolution));
38
+ }) })] }));
39
+ }
40
+ //# sourceMappingURL=Gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Gate.js","sourceRoot":"","sources":["../../../../ui/components/node-panel/Gate.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA+Bb,oBA0CC;;AAhED,4CAA4C;AAC5C,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,iBAAiB,GAA2B;IAChD,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,SAAS,YAAY,CAAC,UAAkB;IACtC,OAAO,iBAAiB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,SAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAS;IAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,MAAM,WAAW,GACf,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAE3B,OAAO,CACL,iCAAK,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,qBAAqB,EAAE,aACjI,gCAAK,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,oCAE1E,EAEL,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAC3E,gCAAK,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YACnJ,IAAI,CAAC,SAAS,CACb,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC,EACxF,IAAI,EAAE,CAAC,CACR,GACG,CACP,EACD,gCAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,YACpC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;oBAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;oBACvC,OAAO,CACL,mCAEE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,EACpC,KAAK,EAAE;4BACL,UAAU,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI;4BAC/D,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE;4BAClD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG;yBACnC,YAEA,SAAS,CAAC,UAAU,CAAC,IARjB,UAAU,CASR,CACV,CAAC;gBACJ,CAAC,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ProjectionNode } from '../../../src/types';
2
+ interface Props {
3
+ node: ProjectionNode;
4
+ onClose: () => void;
5
+ /** Optional action buttons (Redo/Retry/Skip) rendered inline in the header */
6
+ actions?: React.ReactNode;
7
+ }
8
+ export declare function Header({ node, onClose, actions }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../ui/components/node-panel/Header.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,UAAU,KAAK;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,2CA4BvD"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Header = Header;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const types_1 = require("./types");
7
+ function Header({ node, onClose, actions }) {
8
+ const c = (0, types_1.sc)(node.status);
9
+ const isActive = node.status === 'running' || node.status === 'gated';
10
+ return ((0, jsx_runtime_1.jsxs)("div", { style: {
11
+ padding: '16px 24px', borderBottom: '1px solid #302e2b',
12
+ background: 'linear-gradient(to bottom, #201d18, #1a1815)',
13
+ display: 'flex', justifyContent: 'space-between', alignItems: 'center',
14
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
15
+ width: 10, height: 10, borderRadius: '50%', background: c.dot,
16
+ boxShadow: isActive ? `0 0 8px ${c.dot}, 0 0 20px ${c.dot}33` : 'none',
17
+ } }), (0, jsx_runtime_1.jsx)("span", { style: { fontWeight: 600, fontSize: 16, letterSpacing: '-0.01em' }, children: node.displayName }), (0, jsx_runtime_1.jsx)("span", { style: { fontSize: 11, color: '#8a8578', background: '#2b2a27', padding: '2px 8px', borderRadius: 6, marginLeft: 6 }, children: node.nodeType }), actions && (0, jsx_runtime_1.jsx)("div", { style: { marginLeft: 8, display: 'flex', gap: 6 }, children: actions })] }), (0, jsx_runtime_1.jsx)("button", { onClick: onClose, "aria-label": "Close panel", style: { background: 'none', border: 'none', color: '#8a8578', cursor: 'pointer', fontSize: 18, padding: '8px 8px', minWidth: 32, minHeight: 32, display: 'flex', alignItems: 'center', justifyContent: 'center', borderRadius: 6 }, children: "\u00D7" })] }));
18
+ }
19
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../../ui/components/node-panel/Header.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAYb,wBA4BC;;AArCD,mCAA6B;AAS7B,SAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAS;IACtD,MAAM,CAAC,GAAG,IAAA,UAAE,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC;IAEtE,OAAO,CACL,iCAAK,KAAK,EAAE;YACV,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB;YACvD,UAAU,EAAE,8CAA8C;YAC1D,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ;SACvE,aACC,iCAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC3D,gCAAK,KAAK,EAAE;4BACV,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG;4BAC7D,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM;yBACvE,GAAI,EACL,iCAAM,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,YAAG,IAAI,CAAC,WAAW,GAAQ,EACnG,iCAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAG,IAAI,CAAC,QAAQ,GAAQ,EACjJ,OAAO,IAAI,gCAAK,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,YAAG,OAAO,GAAO,IAC/E,EACN,mCACE,OAAO,EAAE,OAAO,gBACL,aAAa,EACxB,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,uBAG5N,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProjectionNode } from '../../../src/types';
2
+ interface Props {
3
+ node: ProjectionNode;
4
+ }
5
+ export declare function Info({ node }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=Info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Info.d.ts","sourceRoot":"","sources":["../../../../ui/components/node-panel/Info.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,UAAU,KAAK;IACb,IAAI,EAAE,cAAc,CAAC;CACtB;AASD,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,2CAenC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Info = Info;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const types_1 = require("./types");
7
+ function fmt(ms) {
8
+ if (ms < 1000)
9
+ return `${ms}ms`;
10
+ const s = Math.floor(ms / 1000);
11
+ if (s < 60)
12
+ return `${s}s`;
13
+ return `${Math.floor(s / 60)}m ${s % 60}s`;
14
+ }
15
+ function Info({ node }) {
16
+ const c = (0, types_1.sc)(node.status);
17
+ return ((0, jsx_runtime_1.jsxs)("div", { style: {
18
+ padding: '12px 24px', fontSize: 11, color: '#8a8578',
19
+ borderBottom: '1px solid #302e2b',
20
+ display: 'flex', gap: 16, flexWrap: 'wrap',
21
+ }, children: [(0, jsx_runtime_1.jsxs)("span", { children: ["Status: ", (0, jsx_runtime_1.jsx)("b", { style: { color: c.text }, children: node.status })] }), node.model && (0, jsx_runtime_1.jsxs)("span", { children: ["Model: ", node.model] }), node.elapsedMs != null && (0, jsx_runtime_1.jsxs)("span", { children: ["Duration: ", fmt(node.elapsedMs)] }), node.attempt > 1 && (0, jsx_runtime_1.jsxs)("span", { children: ["Attempt: ", node.attempt] })] }));
22
+ }
23
+ //# sourceMappingURL=Info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Info.js","sourceRoot":"","sources":["../../../../ui/components/node-panel/Info.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAgBb,oBAeC;;AA5BD,mCAA6B;AAM7B,SAAS,GAAG,CAAC,EAAU;IACrB,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC3B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AAC7C,CAAC;AAED,SAAgB,IAAI,CAAC,EAAE,IAAI,EAAS;IAClC,MAAM,CAAC,GAAG,IAAA,UAAE,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,CACL,iCAAK,KAAK,EAAE;YACV,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS;YACpD,YAAY,EAAE,mBAAmB;YACjC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM;SAC3C,aACC,yDAAc,8BAAG,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,YAAG,IAAI,CAAC,MAAM,GAAK,IAAO,EAClE,IAAI,CAAC,KAAK,IAAI,wDAAc,IAAI,CAAC,KAAK,IAAQ,EAC9C,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,2DAAiB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAQ,EACtE,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,0DAAgB,IAAI,CAAC,OAAO,IAAQ,IACrD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ export type OutputRenderer = 'plain' | 'ansi' | ((line: string, index: number) => React.ReactNode);
2
+ interface Props {
3
+ lines: string[];
4
+ total: number;
5
+ loading?: boolean;
6
+ /** Output rendering mode. Default: 'plain'. */
7
+ renderer?: OutputRenderer;
8
+ /** Max lines to keep in memory. Default: 50000. Oldest evicted first. */
9
+ maxLines?: number;
10
+ /** Auto-scroll to bottom on new lines. Default: true. */
11
+ autoScroll?: boolean;
12
+ /** Show running cursor animation. */
13
+ isRunning?: boolean;
14
+ }
15
+ /**
16
+ * Scrollable output stream with configurable renderer (ADR-001).
17
+ *
18
+ * - 'plain' (default): renders lines as text nodes. No dangerouslySetInnerHTML.
19
+ * - 'ansi': converts ANSI escape codes to colored HTML spans. Uses fast-path
20
+ * (hasAnsi check) to avoid unnecessary HTML for plain lines.
21
+ * - function: custom renderer receives (line, index) and returns ReactNode.
22
+ *
23
+ * Features: auto-scroll toggle, copy button (strips ANSI), line count, line cap.
24
+ */
25
+ export declare function Output({ lines: rawLines, total, loading, renderer, maxLines, autoScroll: initialAutoScroll, isRunning, }: Props): import("react/jsx-runtime").JSX.Element;
26
+ export {};
27
+ //# sourceMappingURL=Output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Output.d.ts","sourceRoot":"","sources":["../../../../ui/components/node-panel/Output.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;AAEnG,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAK,EAAE,QAAQ,EACf,KAAK,EACL,OAAO,EACP,QAAkB,EAClB,QAA4B,EAC5B,UAAU,EAAE,iBAAwB,EACpC,SAAS,GACV,EAAE,KAAK,2CA4FP"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Output = Output;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const ansi_1 = require("../../ansi");
8
+ const MAX_LINES_DEFAULT = 50000;
9
+ /**
10
+ * Scrollable output stream with configurable renderer (ADR-001).
11
+ *
12
+ * - 'plain' (default): renders lines as text nodes. No dangerouslySetInnerHTML.
13
+ * - 'ansi': converts ANSI escape codes to colored HTML spans. Uses fast-path
14
+ * (hasAnsi check) to avoid unnecessary HTML for plain lines.
15
+ * - function: custom renderer receives (line, index) and returns ReactNode.
16
+ *
17
+ * Features: auto-scroll toggle, copy button (strips ANSI), line count, line cap.
18
+ */
19
+ function Output({ lines: rawLines, total, loading, renderer = 'plain', maxLines = MAX_LINES_DEFAULT, autoScroll: initialAutoScroll = true, isRunning, }) {
20
+ const [autoScroll, setAutoScroll] = (0, react_1.useState)(initialAutoScroll);
21
+ const scrollRef = (0, react_1.useRef)(null);
22
+ const [copyFeedback, setCopyFeedback] = (0, react_1.useState)(false);
23
+ // Apply line cap
24
+ const lines = rawLines.length > maxLines ? rawLines.slice(-maxLines) : rawLines;
25
+ // Auto-scroll on new content
26
+ (0, react_1.useEffect)(() => {
27
+ if (autoScroll && scrollRef.current) {
28
+ scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
29
+ }
30
+ }, [lines.length, autoScroll]);
31
+ const handleCopy = () => {
32
+ const text = lines.map(l => (0, ansi_1.stripAnsi)(l)).join('\n');
33
+ navigator.clipboard.writeText(text).then(() => {
34
+ setCopyFeedback(true);
35
+ setTimeout(() => setCopyFeedback(false), 2000);
36
+ }).catch(() => { });
37
+ };
38
+ // Render a single line based on renderer mode
39
+ const renderLine = (line, i) => {
40
+ if (typeof renderer === 'function') {
41
+ return (0, jsx_runtime_1.jsx)("div", { style: { whiteSpace: 'pre-wrap', wordBreak: 'break-word', minHeight: 18 }, children: renderer(line, i) }, i);
42
+ }
43
+ if (renderer === 'ansi' && (0, ansi_1.hasAnsi)(line)) {
44
+ return (0, jsx_runtime_1.jsx)("div", { style: { whiteSpace: 'pre-wrap', wordBreak: 'break-word', minHeight: 18 }, dangerouslySetInnerHTML: { __html: (0, ansi_1.ansiToHtml)(line) || '\u00A0' } }, i);
45
+ }
46
+ return (0, jsx_runtime_1.jsx)("div", { style: { whiteSpace: 'pre-wrap', wordBreak: 'break-word', minHeight: 18 }, children: line || '\u00A0' }, i);
47
+ };
48
+ return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column', flex: 1, overflow: 'hidden' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
49
+ padding: '12px 24px', fontSize: 11, color: '#6b6660', background: '#1a1815',
50
+ borderBottom: '1px solid #302e2b',
51
+ display: 'flex', justifyContent: 'space-between', gap: 8,
52
+ }, children: [(0, jsx_runtime_1.jsxs)("span", { children: [lines.length === total ? `${total} lines` : `${lines.length} of ${total} lines`, loading && ' (loading...)'] }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: 8 }, children: [(0, jsx_runtime_1.jsx)("button", { onClick: handleCopy, onMouseEnter: e => { const btn = e.currentTarget; if (!copyFeedback)
53
+ btn.style.color = '#c4bfb5'; btn.style.background = '#343230'; }, onMouseLeave: e => { const btn = e.currentTarget; if (!copyFeedback)
54
+ btn.style.color = '#8a8578'; btn.style.background = 'none'; }, style: { background: 'none', border: 'none', color: copyFeedback ? '#4ade80' : '#8a8578', cursor: 'pointer', fontSize: 11, transition: 'all 150ms', borderRadius: 4, padding: '2px 6px' }, children: copyFeedback ? 'Copied!' : 'Copy' }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setAutoScroll(!autoScroll), onMouseEnter: e => { const btn = e.currentTarget; if (!autoScroll)
55
+ btn.style.color = '#c4bfb5'; btn.style.background = '#343230'; }, onMouseLeave: e => { const btn = e.currentTarget; if (!autoScroll)
56
+ btn.style.color = '#8a8578'; btn.style.background = 'none'; }, style: { background: 'none', border: 'none', color: autoScroll ? '#4ade80' : '#8a8578', cursor: 'pointer', fontSize: 11, transition: 'all 150ms', borderRadius: 4, padding: '2px 6px' }, children: autoScroll ? 'Auto-scroll ON' : 'Auto-scroll OFF' })] })] }), (0, jsx_runtime_1.jsxs)("div", { ref: scrollRef, style: {
57
+ flex: 1, overflowY: 'auto', padding: '12px 24px',
58
+ fontFamily: '"Cascadia Code", "Fira Code", "JetBrains Mono", "Consolas", monospace',
59
+ fontSize: 12, lineHeight: 1.5, background: '#161411',
60
+ }, children: [lines.length === 0 ? ((0, jsx_runtime_1.jsx)("span", { style: { color: '#585350' }, children: isRunning ? 'Waiting for output...' : 'No output' })) : (lines.map(renderLine)), isRunning && ((0, jsx_runtime_1.jsx)("span", { style: {
61
+ display: 'inline-block', width: 7, height: 14,
62
+ background: '#4ade80', marginLeft: 2, verticalAlign: 'text-bottom',
63
+ animation: 'flow-blink 1s step-end infinite',
64
+ } }))] }), (0, jsx_runtime_1.jsx)("style", { children: `@keyframes flow-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }` })] }));
65
+ }
66
+ //# sourceMappingURL=Output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Output.js","sourceRoot":"","sources":["../../../../ui/components/node-panel/Output.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * NodePanel — compound component for node detail views (ADR-003).
3
+ *
4
+ * Usage (zero-config convenience):
5
+ * ```tsx
6
+ * import { NodeDetailPanel } from '@anthropic/flow-framework/ui';
7
+ * <NodeDetailPanel projection={p} nodeId={id} onClose={close} onAction={act} />
8
+ * ```
9
+ *
10
+ * Usage (compound composition):
11
+ * ```tsx
12
+ * import { NodePanel } from '@anthropic/flow-framework/ui';
13
+ * <NodePanel>
14
+ * <NodePanel.Header node={node} onClose={close} />
15
+ * <NodePanel.Info node={node} />
16
+ * {node.status === 'gated' && <MyCustomGateUI />}
17
+ * <NodePanel.Controls node={node} onRetry={retry} onSkip={skip} />
18
+ * <NodePanel.Output lines={lines} total={total} renderer="ansi" />
19
+ * </NodePanel>
20
+ * ```
21
+ */
22
+ import { Header } from './Header';
23
+ import { Info } from './Info';
24
+ import { ErrorBar } from './ErrorBar';
25
+ import { Gate } from './Gate';
26
+ import { Controls } from './Controls';
27
+ import { Output } from './Output';
28
+ import type { OutputRenderer } from './Output';
29
+ interface NodePanelProps {
30
+ children: React.ReactNode;
31
+ style?: React.CSSProperties;
32
+ }
33
+ /**
34
+ * Shell container for the node detail panel.
35
+ * Provides the flex column layout. Children are the compound sub-components.
36
+ */
37
+ declare function NodePanelRoot({ children, style }: NodePanelProps): import("react/jsx-runtime").JSX.Element;
38
+ export declare const NodePanel: typeof NodePanelRoot & {
39
+ Header: typeof Header;
40
+ Info: typeof Info;
41
+ Error: typeof ErrorBar;
42
+ Gate: typeof Gate;
43
+ Controls: typeof Controls;
44
+ Output: typeof Output;
45
+ };
46
+ export type { OutputRenderer };
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../ui/components/node-panel/index.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,UAAU,cAAc;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;;;GAGG;AACH,iBAAS,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,cAAc,2CAWzD;AAGD,eAAO,MAAM,SAAS;;;;;;;CAOpB,CAAC;AAEH,YAAY,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NodePanel = void 0;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * NodePanel — compound component for node detail views (ADR-003).
8
+ *
9
+ * Usage (zero-config convenience):
10
+ * ```tsx
11
+ * import { NodeDetailPanel } from '@anthropic/flow-framework/ui';
12
+ * <NodeDetailPanel projection={p} nodeId={id} onClose={close} onAction={act} />
13
+ * ```
14
+ *
15
+ * Usage (compound composition):
16
+ * ```tsx
17
+ * import { NodePanel } from '@anthropic/flow-framework/ui';
18
+ * <NodePanel>
19
+ * <NodePanel.Header node={node} onClose={close} />
20
+ * <NodePanel.Info node={node} />
21
+ * {node.status === 'gated' && <MyCustomGateUI />}
22
+ * <NodePanel.Controls node={node} onRetry={retry} onSkip={skip} />
23
+ * <NodePanel.Output lines={lines} total={total} renderer="ansi" />
24
+ * </NodePanel>
25
+ * ```
26
+ */
27
+ const Header_1 = require("./Header");
28
+ const Info_1 = require("./Info");
29
+ const ErrorBar_1 = require("./ErrorBar");
30
+ const Gate_1 = require("./Gate");
31
+ const Controls_1 = require("./Controls");
32
+ const Output_1 = require("./Output");
33
+ /**
34
+ * Shell container for the node detail panel.
35
+ * Provides the flex column layout. Children are the compound sub-components.
36
+ */
37
+ function NodePanelRoot({ children, style }) {
38
+ return ((0, jsx_runtime_1.jsx)("div", { style: {
39
+ display: 'flex', flexDirection: 'column', height: '100%',
40
+ background: '#1a1815', color: '#e8e6e3',
41
+ fontFamily: 'system-ui, -apple-system, sans-serif',
42
+ ...style,
43
+ }, children: children }));
44
+ }
45
+ // Attach sub-components as static properties (dot notation pattern)
46
+ exports.NodePanel = Object.assign(NodePanelRoot, {
47
+ Header: Header_1.Header,
48
+ Info: Info_1.Info,
49
+ Error: ErrorBar_1.ErrorBar,
50
+ Gate: Gate_1.Gate,
51
+ Controls: Controls_1.Controls,
52
+ Output: Output_1.Output,
53
+ });
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../ui/components/node-panel/index.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;AAEb;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,qCAAkC;AAClC,iCAA8B;AAC9B,yCAAsC;AACtC,iCAA8B;AAC9B,yCAAsC;AACtC,qCAAkC;AAQlC;;;GAGG;AACH,SAAS,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAkB;IACxD,OAAO,CACL,gCAAK,KAAK,EAAE;YACV,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;YACxD,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS;YACvC,UAAU,EAAE,sCAAsC;YAClD,GAAG,KAAK;SACT,YACE,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED,oEAAoE;AACvD,QAAA,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE;IACpD,MAAM,EAAN,eAAM;IACN,IAAI,EAAJ,WAAI;IACJ,KAAK,EAAE,mBAAQ;IACf,IAAI,EAAJ,WAAI;IACJ,QAAQ,EAAR,mBAAQ;IACR,MAAM,EAAN,eAAM;CACP,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared types for NodePanel compound components.
3
+ */
4
+ import type { ProjectionNode } from '../../../src/types';
5
+ export type OnActionFn = (action: string, nodeId: string) => void;
6
+ export interface NodePanelContext {
7
+ node: ProjectionNode;
8
+ executionId: string;
9
+ onAction: OnActionFn;
10
+ onClose: () => void;
11
+ }
12
+ /** Status → inline style colors (no Tailwind dependency). */
13
+ export declare const STATUS_COLORS: Record<string, {
14
+ dot: string;
15
+ text: string;
16
+ bg: string;
17
+ }>;
18
+ export declare function sc(status: string): {
19
+ dot: string;
20
+ text: string;
21
+ bg: string;
22
+ };
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../ui/components/node-panel/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,6DAA6D;AAC7D,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAWnF,CAAC;AAEF,wBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM;SAbiB,MAAM;UAAQ,MAAM;QAAM,MAAM;EAejF"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Shared types for NodePanel compound components.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.STATUS_COLORS = void 0;
7
+ exports.sc = sc;
8
+ /** Status → inline style colors (no Tailwind dependency). */
9
+ exports.STATUS_COLORS = {
10
+ pending: { dot: '#555', text: '#888', bg: '#252320' },
11
+ running: { dot: '#60a5fa', text: '#60a5fa', bg: '#1a2a40' },
12
+ completed: { dot: '#4ade80', text: '#4ade80', bg: '#1a3528' },
13
+ failed: { dot: '#f87171', text: '#f87171', bg: '#3a1a1a' },
14
+ killed: { dot: '#666', text: '#888', bg: '#252320' },
15
+ skipped: { dot: '#555', text: '#888', bg: '#252320' },
16
+ gated: { dot: '#fbbf24', text: '#fbbf24', bg: '#352a15' },
17
+ retrying: { dot: '#fb923c', text: '#fb923c', bg: '#3a2515' },
18
+ stopped: { dot: '#fbbf24', text: '#fbbf24', bg: '#352a15' },
19
+ crashed: { dot: '#c084fc', text: '#c084fc', bg: '#2a1845' },
20
+ };
21
+ function sc(status) {
22
+ return exports.STATUS_COLORS[status] ?? exports.STATUS_COLORS.pending;
23
+ }
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../ui/components/node-panel/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA2BH,gBAEC;AAhBD,6DAA6D;AAChD,QAAA,aAAa,GAA8D;IACtF,OAAO,EAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE;IACvD,OAAO,EAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;IAC7D,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;IAC7D,MAAM,EAAK,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;IAC7D,MAAM,EAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE;IACvD,OAAO,EAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE;IACvD,KAAK,EAAM,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;IAC7D,QAAQ,EAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;IAC7D,OAAO,EAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;IAC7D,OAAO,EAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;CAC9D,CAAC;AAEF,SAAgB,EAAE,CAAC,MAAc;IAC/B,OAAO,qBAAa,CAAC,MAAM,CAAC,IAAI,qBAAa,CAAC,OAAO,CAAC;AACxD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface BadgeProps {
2
+ status: string;
3
+ className?: string;
4
+ }
5
+ export declare function Badge({ status, className }: BadgeProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=Badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../../ui/core/components/Badge.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,UAAU,2CAatD"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Badge = Badge;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const utils_1 = require("../../utils");
6
+ const types_1 = require("../../components/node-panel/types");
7
+ function Badge({ status, className }) {
8
+ const colors = (0, types_1.sc)(status);
9
+ return ((0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)('inline-flex items-center px-2 py-[3px] rounded-full text-[10px] font-semibold uppercase tracking-wide', className), style: { backgroundColor: colors.bg, color: colors.text, border: `1px solid ${colors.dot}44`, boxShadow: `0 0 12px ${colors.dot}44` }, children: status }));
10
+ }
11
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sourceRoot":"","sources":["../../../../ui/core/components/Badge.tsx"],"names":[],"mappings":";;AAQA,sBAaC;;AArBD,uCAAiC;AACjC,6DAAuD;AAOvD,SAAgB,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAc;IACrD,MAAM,MAAM,GAAG,IAAA,UAAE,EAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,CACL,iCACE,SAAS,EAAE,IAAA,UAAE,EACX,uGAAuG,EACvG,SAAS,CACV,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,MAAM,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,YAAY,MAAM,CAAC,GAAG,IAAI,EAAE,YAEpI,MAAM,GACF,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
2
+ variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
3
+ size?: 'sm' | 'md';
4
+ loading?: boolean;
5
+ }
6
+ export declare function Button({ variant, size, loading, disabled, className, children, ref, ...rest }: ButtonProps & {
7
+ ref?: React.Ref<HTMLButtonElement>;
8
+ }): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../../ui/core/components/Button.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IAChF,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AASD,wBAAgB,MAAM,CAAC,EACrB,OAAmB,EACnB,IAAW,EACX,OAAe,EACf,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,GAAG,EACH,GAAG,IAAI,EACR,EAAE,WAAW,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAAE,2CA+BtD"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Button = Button;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const utils_1 = require("../../utils");
6
+ const variantStyles = {
7
+ primary: 'bg-blue-600 text-white hover:bg-blue-500 shadow-[0_1px_2px_rgba(0,0,0,0.3),0_0_12px_rgba(59,130,246,0.2)] hover:shadow-[0_1px_2px_rgba(0,0,0,0.3),0_0_20px_rgba(59,130,246,0.3)]',
8
+ secondary: 'bg-[#2d2a26] border border-[#4a4742] text-[#d4cfc5] hover:bg-[#343230] hover:border-[#5a5650] hover:text-[#e8e6e3] shadow-[0_1px_2px_rgba(0,0,0,0.2)]',
9
+ ghost: 'bg-transparent text-[#b1ada1] hover:bg-[#343230] hover:text-[#e8e6e3]',
10
+ danger: 'bg-red-600 text-white hover:bg-red-500 shadow-[0_1px_2px_rgba(0,0,0,0.3),0_0_12px_rgba(239,68,68,0.2)]',
11
+ };
12
+ function Button({ variant = 'primary', size = 'md', loading = false, disabled, className, children, ref, ...rest }) {
13
+ const isDisabled = disabled || loading;
14
+ return ((0, jsx_runtime_1.jsx)("button", { ref: ref, disabled: isDisabled, className: (0, utils_1.cn)('rounded-xl font-medium transition-all duration-200 active:scale-[0.97]', variantStyles[variant], size === 'sm' && 'text-xs px-3 py-1.5', size === 'md' && 'text-sm px-4 py-2', isDisabled && 'opacity-50 cursor-not-allowed', className), style: {
15
+ minHeight: size === 'sm' ? 32 : 36,
16
+ }, ...rest, children: loading ? ((0, jsx_runtime_1.jsx)("span", { className: "inline-block w-4 h-4 border-2 border-current border-t-transparent rounded-full", style: { animation: 'spin 0.6s linear infinite' }, "aria-label": "Loading" })) : (children) }));
17
+ }
18
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../../ui/core/components/Button.tsx"],"names":[],"mappings":";;AAeA,wBAwCC;;AAvDD,uCAAiC;AAQjC,MAAM,aAAa,GAA2B;IAC5C,OAAO,EAAE,kLAAkL;IAC3L,SAAS,EAAE,uJAAuJ;IAClK,KAAK,EAAE,uEAAuE;IAC9E,MAAM,EAAE,wGAAwG;CACjH,CAAC;AAEF,SAAgB,MAAM,CAAC,EACrB,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,OAAO,GAAG,KAAK,EACf,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,GAAG,EACH,GAAG,IAAI,EAC8C;IACrD,MAAM,UAAU,GAAG,QAAQ,IAAI,OAAO,CAAC;IAEvC,OAAO,CACL,mCACE,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,IAAA,UAAE,EACX,wEAAwE,EACxE,aAAa,CAAC,OAAO,CAAC,EACtB,IAAI,KAAK,IAAI,IAAI,qBAAqB,EACtC,IAAI,KAAK,IAAI,IAAI,mBAAmB,EACpC,UAAU,IAAI,+BAA+B,EAC7C,SAAS,CACV,EACD,KAAK,EAAE;YACL,SAAS,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;SACnC,KACG,IAAI,YAEP,OAAO,CAAC,CAAC,CAAC,CACT,iCACE,SAAS,EAAC,gFAAgF,EAC1F,KAAK,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,gBACtC,SAAS,GACpB,CACH,CAAC,CAAC,CAAC,CACF,QAAQ,CACT,GACM,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ConfirmDialogProps {
2
+ title: string;
3
+ message: string;
4
+ confirmLabel?: string;
5
+ cancelLabel?: string;
6
+ variant?: 'danger' | 'default';
7
+ onConfirm: () => void;
8
+ onCancel: () => void;
9
+ }
10
+ export declare function ConfirmDialog({ title, message, confirmLabel, cancelLabel, variant, onConfirm, onCancel, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=ConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../../ui/core/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,YAAwB,EACxB,WAAsB,EACtB,OAAmB,EACnB,SAAS,EACT,QAAQ,GACT,EAAE,kBAAkB,2CAyCpB"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ConfirmDialog = ConfirmDialog;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const Button_1 = require("./Button");
8
+ function ConfirmDialog({ title, message, confirmLabel = 'Confirm', cancelLabel = 'Cancel', variant = 'default', onConfirm, onCancel, }) {
9
+ const confirmRef = (0, react_1.useRef)(null);
10
+ (0, react_1.useEffect)(() => {
11
+ confirmRef.current?.focus();
12
+ }, []);
13
+ (0, react_1.useEffect)(() => {
14
+ function handleKeyDown(e) {
15
+ if (e.key === 'Escape')
16
+ onCancel();
17
+ }
18
+ document.addEventListener('keydown', handleKeyDown);
19
+ return () => document.removeEventListener('keydown', handleKeyDown);
20
+ }, [onCancel]);
21
+ return ((0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 flex items-center justify-center", style: { backgroundColor: 'rgba(0, 0, 0, 0.6)', backdropFilter: 'blur(4px)', zIndex: 50 }, children: (0, jsx_runtime_1.jsxs)("div", { className: "max-w-md w-full rounded-2xl p-8", style: { background: 'linear-gradient(to bottom, #343230, #2b2a27)', border: '1px solid #3d3a36', boxShadow: '0 8px 40px rgba(0,0,0,0.4), 0 0 1px rgba(255,255,255,0.03)' }, children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-lg font-semibold mb-2 tracking-tight", children: title }), (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-[#b1ada1] mb-6", children: message }), (0, jsx_runtime_1.jsxs)("div", { className: "flex justify-end gap-3", children: [(0, jsx_runtime_1.jsx)(Button_1.Button, { variant: "ghost", onClick: onCancel, children: cancelLabel }), (0, jsx_runtime_1.jsx)(Button_1.Button, { ref: confirmRef, variant: variant === 'danger' ? 'danger' : 'primary', onClick: onConfirm, children: confirmLabel })] })] }) }));
22
+ }
23
+ //# sourceMappingURL=ConfirmDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.js","sourceRoot":"","sources":["../../../../ui/core/components/ConfirmDialog.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAeb,sCAiDC;;AA9DD,iCAA0C;AAC1C,qCAAkC;AAYlC,SAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,YAAY,GAAG,SAAS,EACxB,WAAW,GAAG,QAAQ,EACtB,OAAO,GAAG,SAAS,EACnB,SAAS,EACT,QAAQ,GACW;IACnB,MAAM,UAAU,GAAG,IAAA,cAAM,EAAoB,IAAI,CAAC,CAAC;IAEnD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,SAAS,aAAa,CAAC,CAAgB;YACrC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,QAAQ,EAAE,CAAC;QACrC,CAAC;QACD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACpD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,CACL,gCACE,SAAS,EAAC,gDAAgD,EAC1D,KAAK,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,YAEzF,iCACE,SAAS,EAAC,iCAAiC,EAC3C,KAAK,EAAE,EAAE,UAAU,EAAE,8CAA8C,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,4DAA4D,EAAE,aAE3K,+BAAI,SAAS,EAAC,2CAA2C,YAAE,KAAK,GAAM,EACtE,8BAAG,SAAS,EAAC,6BAA6B,YAAE,OAAO,GAAK,EACxD,iCAAK,SAAS,EAAC,wBAAwB,aACrC,uBAAC,eAAM,IAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAE,QAAQ,YACtC,WAAW,GACL,EACT,uBAAC,eAAM,IACL,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACpD,OAAO,EAAE,SAAS,YAEjB,YAAY,GACN,IACL,IACF,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ExecutionCardProps {
2
+ href: string;
3
+ title: string;
4
+ subtitle?: string;
5
+ status: string;
6
+ metadata?: string;
7
+ progress?: number;
8
+ children?: React.ReactNode;
9
+ className?: string;
10
+ }
11
+ export declare function ExecutionCard({ href, title, subtitle, status, metadata, progress, children, className }: ExecutionCardProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=ExecutionCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionCard.d.ts","sourceRoot":"","sources":["../../../../ui/core/components/ExecutionCard.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CAsD3H"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExecutionCard = ExecutionCard;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const utils_1 = require("../../utils");
6
+ const types_1 = require("../../components/node-panel/types");
7
+ function ExecutionCard({ href, title, subtitle, status, metadata, progress, children, className }) {
8
+ const colors = (0, types_1.sc)(status);
9
+ return ((0, jsx_runtime_1.jsxs)("a", { href: href, className: (0, utils_1.cn)('block rounded-2xl border border-[#302e2b] p-6 no-underline', 'shadow-[0_1px_3px_rgba(0,0,0,0.2),0_4px_12px_rgba(0,0,0,0.15)]', 'hover:border-[#4a4742] hover:-translate-y-1 hover:shadow-[0_2px_8px_rgba(0,0,0,0.2),0_12px_28px_rgba(0,0,0,0.18)] transition-all duration-200', 'active:translate-y-0 active:shadow-card', 'relative overflow-hidden group/card', className), style: { background: 'linear-gradient(to bottom, #2b2a27, #1e1b17)' }, children: [(0, jsx_runtime_1.jsx)("div", { className: "absolute top-0 left-0 right-0 h-px", style: { background: 'linear-gradient(to right, transparent, rgba(255,255,255,0.06), transparent)' } }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium text-[15px] tracking-[-0.01em] truncate", children: title }), (0, jsx_runtime_1.jsx)("span", { className: "inline-flex items-center px-2 py-0.5 rounded-full text-[11px] font-semibold shrink-0", style: { backgroundColor: colors.bg, color: colors.text }, children: status })] }), subtitle && ((0, jsx_runtime_1.jsx)("div", { className: "mt-1 text-[12px]", style: { color: '#8a8578' }, children: subtitle })), metadata && ((0, jsx_runtime_1.jsx)("div", { className: "mt-1 text-[12px]", style: { color: '#8a8578' }, children: metadata })), children && (0, jsx_runtime_1.jsx)("div", { className: "mt-3", children: children }), progress != null && progress > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "absolute bottom-0 left-0 h-[3px]", style: {
10
+ width: `${Math.min(100, Math.max(0, progress))}%`,
11
+ backgroundColor: colors.dot,
12
+ transition: 'width 0.3s',
13
+ } }))] }));
14
+ }
15
+ //# sourceMappingURL=ExecutionCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionCard.js","sourceRoot":"","sources":["../../../../ui/core/components/ExecutionCard.tsx"],"names":[],"mappings":";;AAcA,sCAsDC;;AApED,uCAAiC;AACjC,6DAAuD;AAavD,SAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAsB;IAC1H,MAAM,MAAM,GAAG,IAAA,UAAE,EAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,CACL,+BACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,IAAA,UAAE,EACX,4DAA4D,EAC5D,gEAAgE,EAChE,+IAA+I,EAC/I,yCAAyC,EACzC,qCAAqC,EACrC,SAAS,CACV,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,8CAA8C,EAAE,aAErE,gCAAK,SAAS,EAAC,oCAAoC,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,6EAA6E,EAAE,GAAI,EAE5J,iCAAK,SAAS,EAAC,yCAAyC,aACtD,iCAAM,SAAS,EAAC,qDAAqD,YAAE,KAAK,GAAQ,EACpF,iCACE,SAAS,EAAC,sFAAsF,EAChG,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,YAExD,MAAM,GACF,IACH,EAGL,QAAQ,IAAI,CACX,gCAAK,SAAS,EAAC,kBAAkB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,YAAG,QAAQ,GAAO,CAChF,EAGA,QAAQ,IAAI,CACX,gCAAK,SAAS,EAAC,kBAAkB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,YAAG,QAAQ,GAAO,CAChF,EAGA,QAAQ,IAAI,gCAAK,SAAS,EAAC,MAAM,YAAE,QAAQ,GAAO,EAGlD,QAAQ,IAAI,IAAI,IAAI,QAAQ,GAAG,CAAC,IAAI,CACnC,gCACE,SAAS,EAAC,kCAAkC,EAC5C,KAAK,EAAE;oBACL,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG;oBACjD,eAAe,EAAE,MAAM,CAAC,GAAG;oBAC3B,UAAU,EAAE,YAAY;iBACzB,GACD,CACH,IACC,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ProjectionNode } from '../../../src/types';
2
+ export interface NodeListItemProps {
3
+ node: ProjectionNode;
4
+ selected?: boolean;
5
+ onClick?: () => void;
6
+ actions?: React.ReactNode;
7
+ className?: string;
8
+ }
9
+ export declare function NodeListItem({ node, selected, onClick, actions, className }: NodeListItemProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=NodeListItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeListItem.d.ts","sourceRoot":"","sources":["../../../../ui/core/components/NodeListItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKzD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAkF9F"}