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,120 @@
1
+ "use strict";
2
+ /**
3
+ * Non-agent node factories: deterministic() and gate().
4
+ *
5
+ * deterministic() — wraps a pure function as a NodeFn (ignores ExecutionContext).
6
+ * gate() — returns a blocking NodeFn resolved externally via resolveGate().
7
+ *
8
+ * Gate mechanism:
9
+ * 1. gate() creates a Promise + resolver, stores in module-level gateRegistry
10
+ * 2. The scheduler dispatches the gate node; it blocks on the Promise
11
+ * 3. External code (bridge/API) calls resolveGate() to unblock
12
+ * 4. The scheduler sees the gate complete normally and proceeds
13
+ *
14
+ * Gate nodes listen for abort signals so they can be cleanly cancelled.
15
+ * The gate registry is module-level (survives across requests but not restarts).
16
+ * Restart recovery: the scheduler re-dispatches gate nodes, creating fresh resolvers (CR4).
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.deterministic = deterministic;
20
+ exports._getGateRegistryForTesting = _getGateRegistryForTesting;
21
+ exports.gate = gate;
22
+ exports.resolveGate = resolveGate;
23
+ const types_1 = require("./types");
24
+ // ---------------------------------------------------------------------------
25
+ // Deterministic node factory
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Wraps a pure async function as a NodeFn.
29
+ * The ExecutionContext is available but typically unused — deterministic nodes
30
+ * don't need runtime services or streaming output.
31
+ *
32
+ * @param _name - Display name (used for logging/debugging, not stored here)
33
+ * @param fn - The computation. Receives NodeInput, returns NodeOutput.
34
+ */
35
+ function deterministic(_name, fn) {
36
+ return async (input, _ctx) => {
37
+ return fn(input);
38
+ };
39
+ }
40
+ const GATE_REGISTRY_KEY = Symbol.for('__flow_gate_registry__');
41
+ /** globalThis-backed registry: survives HMR, separate entry points, bundler dedup. */
42
+ function getGateRegistry() {
43
+ const g = globalThis;
44
+ if (!g[GATE_REGISTRY_KEY]) {
45
+ g[GATE_REGISTRY_KEY] = new Map();
46
+ }
47
+ return g[GATE_REGISTRY_KEY];
48
+ }
49
+ /**
50
+ * Expose the registry for testing purposes only.
51
+ * @internal
52
+ */
53
+ function _getGateRegistryForTesting() {
54
+ return getGateRegistry();
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Gate node factory
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Creates a NodeFn that blocks until externally resolved via resolveGate().
61
+ *
62
+ * The gate:
63
+ * - Registers a Promise resolver in the module-level gateRegistry
64
+ * - Blocks (awaits the Promise) until resolveGate() is called
65
+ * - Listens for abort signal to clean up on cancellation
66
+ * - Returns { action: resolution } when resolved (e.g., 'approved', 'rejected')
67
+ *
68
+ * The scheduler emits node:gated after dispatching gate-type nodes.
69
+ * The bridge emits gate:resolved when calling resolveGate().
70
+ *
71
+ * @param name - Optional gate type name (e.g., 'approval', 'quality-review').
72
+ * Used by the scheduler for the node:gated event's gateType field.
73
+ */
74
+ function gate(name) {
75
+ // The name is captured in the closure but only used for documentation/debugging.
76
+ // The scheduler reads the nodeType from NodeEntry to determine gate behavior.
77
+ void name;
78
+ return async (_input, ctx) => {
79
+ const key = `${ctx.executionId}:${ctx.nodeId}`;
80
+ // Abort check: bail early if already aborted
81
+ if (ctx.signal.aborted) {
82
+ throw new types_1.FlowAbortedError('Gate aborted before registration');
83
+ }
84
+ return new Promise((resolve, reject) => {
85
+ const registry = getGateRegistry();
86
+ // Register resolver in the gate registry
87
+ registry.set(key, { resolve, reject });
88
+ // Listen for abort signal — clean up and reject if cancelled (AI-3: prevents memory leak)
89
+ const onAbort = () => {
90
+ registry.delete(key);
91
+ reject(new types_1.FlowAbortedError('Gate aborted'));
92
+ };
93
+ ctx.signal.addEventListener('abort', onAbort, { once: true });
94
+ });
95
+ };
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // Gate resolution (called by bridge from API endpoint)
99
+ // ---------------------------------------------------------------------------
100
+ /**
101
+ * Resolves a waiting gate node, unblocking the scheduler.
102
+ *
103
+ * @param executionId - The execution containing the gate
104
+ * @param nodeId - The gate node's ID
105
+ * @param resolution - The action string (e.g., 'approved', 'rejected')
106
+ * @param _reason - Optional human-readable reason (for audit, not used in output)
107
+ * @returns true if the gate was found and resolved, false otherwise
108
+ */
109
+ function resolveGate(executionId, nodeId, resolution, _reason) {
110
+ const key = `${executionId}:${nodeId}`;
111
+ const registry = getGateRegistry();
112
+ const entry = registry.get(key);
113
+ if (!entry) {
114
+ return false;
115
+ }
116
+ entry.resolve({ action: resolution });
117
+ registry.delete(key);
118
+ return true;
119
+ }
120
+ //# sourceMappingURL=nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/nodes.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAsBH,sCAOC;AA0BD,gEAEC;AAqBD,oBA0BC;AAeD,kCAgBC;AA/HD,mCAA2C;AAE3C,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E;;;;;;;GAOG;AACH,SAAgB,aAAa,CAC3B,KAAa,EACb,EAA6C;IAE7C,OAAO,KAAK,EAAE,KAAgB,EAAE,IAAsB,EAAuB,EAAE;QAC7E,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC;AAWD,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAE/D,sFAAsF;AACtF,SAAS,eAAe;IACtB,MAAM,CAAC,GAAG,UAAqC,CAAC;IAChD,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1B,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI,GAAG,EAAqB,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,CAAC,iBAAiB,CAA2B,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,SAAgB,0BAA0B;IACxC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;;;;;;;;GAcG;AACH,SAAgB,IAAI,CAAC,IAAa;IAChC,iFAAiF;IACjF,8EAA8E;IAC9E,KAAK,IAAI,CAAC;IAEV,OAAO,KAAK,EAAE,MAAiB,EAAE,GAAqB,EAAuB,EAAE;QAC7E,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAE/C,6CAA6C;QAC7C,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,wBAAgB,CAAC,kCAAkC,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YACnC,yCAAyC;YACzC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAEvC,0FAA0F;YAC1F,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,wBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,SAAgB,WAAW,CACzB,WAAmB,EACnB,MAAc,EACd,UAAkB,EAClB,OAAgB;IAEhB,MAAM,GAAG,GAAG,GAAG,WAAW,IAAI,MAAM,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Flow scheduler — graph walker, node dispatcher, fan-in tracker.
3
+ *
4
+ * Stateless: emits events via callbacks, reads/writes artifacts to dir.
5
+ * The only mutable state is the per-run tracking (completed, firedEdges, pending).
6
+ */
7
+ import type { FlowGraph, RunOptions, RunResult, ResumeState } from './types';
8
+ export declare function validateGraph(graph: FlowGraph): void;
9
+ export declare function computeFrontier(graph: FlowGraph, state: ResumeState): string[];
10
+ export declare function run(graph: FlowGraph, options: RunOptions): Promise<RunResult>;
11
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,SAAS,EAKT,UAAU,EACV,SAAS,EACT,WAAW,EACZ,MAAM,SAAS,CAAC;AAYjB,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CA2CpD;AAMD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,WAAW,GACjB,MAAM,EAAE,CA8BV;AAyED,wBAAsB,GAAG,CACvB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,SAAS,CAAC,CAuWpB"}
@@ -0,0 +1,478 @@
1
+ "use strict";
2
+ /**
3
+ * Flow scheduler — graph walker, node dispatcher, fan-in tracker.
4
+ *
5
+ * Stateless: emits events via callbacks, reads/writes artifacts to dir.
6
+ * The only mutable state is the per-run tracking (completed, firedEdges, pending).
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.validateGraph = validateGraph;
43
+ exports.computeFrontier = computeFrontier;
44
+ exports.run = run;
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const types_1 = require("./types");
48
+ // ---------------------------------------------------------------------------
49
+ // Validation
50
+ // ---------------------------------------------------------------------------
51
+ function validateGraph(graph) {
52
+ const issues = [];
53
+ const nodeIds = new Set(Object.keys(graph.nodes));
54
+ // Start nodes must exist
55
+ for (const startId of graph.start) {
56
+ if (!nodeIds.has(startId)) {
57
+ issues.push(`Start node '${startId}' does not exist in graph.nodes`);
58
+ }
59
+ }
60
+ // Edge sources and targets must exist (target may be 'end')
61
+ for (const [source, actionMap] of Object.entries(graph.edges)) {
62
+ if (!nodeIds.has(source)) {
63
+ issues.push(`Edge source '${source}' does not exist in graph.nodes`);
64
+ }
65
+ for (const [action, target] of Object.entries(actionMap)) {
66
+ if (target !== 'end' && !nodeIds.has(target)) {
67
+ issues.push(`Edge target '${target}' (from '${source}' via '${action}') does not exist in graph.nodes`);
68
+ }
69
+ }
70
+ }
71
+ // No duplicate output filenames across nodes
72
+ const outputs = new Map();
73
+ for (const [nodeId, entry] of Object.entries(graph.nodes)) {
74
+ if (entry.output) {
75
+ const existing = outputs.get(entry.output);
76
+ if (existing) {
77
+ issues.push(`Duplicate output filename '${entry.output}' on nodes '${existing}' and '${nodeId}'`);
78
+ }
79
+ else {
80
+ outputs.set(entry.output, nodeId);
81
+ }
82
+ }
83
+ }
84
+ if (issues.length > 0) {
85
+ throw new types_1.FlowValidationError(issues);
86
+ }
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // Frontier computation (used by bridge for resume/retry)
90
+ // ---------------------------------------------------------------------------
91
+ function computeFrontier(graph, state) {
92
+ const frontier = [];
93
+ const completedSet = new Set(state.completedNodes.keys());
94
+ // Start nodes that haven't completed
95
+ for (const startId of graph.start) {
96
+ if (!completedSet.has(startId)) {
97
+ frontier.push(startId);
98
+ }
99
+ }
100
+ // Nodes reachable via fired edges where all sources completed
101
+ for (const [target, sources] of state.firedEdges) {
102
+ if (completedSet.has(target))
103
+ continue;
104
+ // Already in frontier from start check
105
+ if (frontier.includes(target))
106
+ continue;
107
+ let allSourcesCompleted = true;
108
+ for (const src of sources) {
109
+ if (!completedSet.has(src)) {
110
+ allSourcesCompleted = false;
111
+ break;
112
+ }
113
+ }
114
+ if (allSourcesCompleted) {
115
+ frontier.push(target);
116
+ }
117
+ }
118
+ return frontier;
119
+ }
120
+ // ---------------------------------------------------------------------------
121
+ // Graph skeleton extraction
122
+ // ---------------------------------------------------------------------------
123
+ function extractSkeleton(graph) {
124
+ const nodes = Object.entries(graph.nodes).map(([id, entry]) => ({
125
+ id,
126
+ displayName: entry.displayName,
127
+ nodeType: entry.nodeType,
128
+ model: entry.model,
129
+ output: entry.output,
130
+ }));
131
+ const edges = [];
132
+ for (const [source, actionMap] of Object.entries(graph.edges)) {
133
+ for (const [action, target] of Object.entries(actionMap)) {
134
+ edges.push({ source, action, target });
135
+ }
136
+ }
137
+ return { nodes, edges };
138
+ }
139
+ // ---------------------------------------------------------------------------
140
+ // Timeout helper
141
+ // ---------------------------------------------------------------------------
142
+ function rejectAfterTimeout(seconds, signal) {
143
+ let timer;
144
+ const promise = new Promise((_resolve, reject) => {
145
+ timer = setTimeout(() => reject(new Error(`Node timed out after ${seconds}s`)), seconds * 1000);
146
+ // Also clear timer on abort to prevent leaks
147
+ signal.addEventListener('abort', () => clearTimeout(timer), { once: true });
148
+ });
149
+ return { promise, clear: () => clearTimeout(timer) };
150
+ }
151
+ // ---------------------------------------------------------------------------
152
+ // Artifact path resolver
153
+ // ---------------------------------------------------------------------------
154
+ function resolveArtifactPaths(reads, dir, outputMap) {
155
+ const result = {};
156
+ if (!reads)
157
+ return result;
158
+ for (const filename of reads) {
159
+ if (outputMap.has(filename)) {
160
+ result[filename] = path.join(dir, filename);
161
+ }
162
+ }
163
+ return result;
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // Main run loop
167
+ // ---------------------------------------------------------------------------
168
+ async function run(graph, options) {
169
+ validateGraph(graph);
170
+ const { executionId, dir, params, runtime, emitState, emitOutput, signal, resumeFrom, retryContexts, } = options;
171
+ const skeleton = extractSkeleton(graph);
172
+ const startTime = Date.now();
173
+ // I5 fix: Only emit run:started for fresh runs, not resume/retry
174
+ if (!resumeFrom) {
175
+ await emitState({
176
+ type: 'run:started',
177
+ executionId,
178
+ flowId: '',
179
+ params: { ...params },
180
+ graph: skeleton,
181
+ ts: Date.now(),
182
+ });
183
+ }
184
+ // Build output map: filename → nodeId (for artifact resolution)
185
+ const outputMap = new Map();
186
+ for (const [nodeId, entry] of Object.entries(graph.nodes)) {
187
+ if (entry.output) {
188
+ outputMap.set(entry.output, nodeId);
189
+ }
190
+ }
191
+ // Internal state
192
+ const completed = new Map();
193
+ const firedEdges = new Map(); // target → sources
194
+ const nodeStatuses = new Map();
195
+ const failedNodes = new Set();
196
+ let pending;
197
+ if (resumeFrom) {
198
+ // Pre-populate from resume state
199
+ for (const [nodeId, info] of resumeFrom.completedNodes) {
200
+ completed.set(nodeId, info);
201
+ }
202
+ for (const [target, sources] of resumeFrom.firedEdges) {
203
+ firedEdges.set(target, new Set(sources));
204
+ }
205
+ for (const [nodeId, status] of resumeFrom.nodeStatuses) {
206
+ nodeStatuses.set(nodeId, status);
207
+ }
208
+ // Compute frontier for resume
209
+ pending = computeFrontier(graph, resumeFrom);
210
+ await emitState({
211
+ type: 'run:resumed',
212
+ executionId,
213
+ resumingFrom: [...pending],
214
+ ts: Date.now(),
215
+ });
216
+ }
217
+ else {
218
+ pending = [...graph.start];
219
+ }
220
+ // Main loop
221
+ while (pending.length > 0) {
222
+ // Check abort before each batch
223
+ if (signal.aborted) {
224
+ for (const nodeId of pending) {
225
+ await emitState({
226
+ type: 'node:killed',
227
+ executionId,
228
+ nodeId,
229
+ ts: Date.now(),
230
+ });
231
+ }
232
+ await emitState({
233
+ type: 'run:completed',
234
+ executionId,
235
+ status: 'stopped',
236
+ ts: Date.now(),
237
+ });
238
+ throw new types_1.FlowAbortedError('Flow aborted');
239
+ }
240
+ // Emit node:started for all pending nodes first
241
+ for (const nodeId of pending) {
242
+ await emitState({
243
+ type: 'node:started',
244
+ executionId,
245
+ nodeId,
246
+ ts: Date.now(),
247
+ });
248
+ }
249
+ // C2 fix: emit node:gated for gate-type nodes so frontend knows they're waiting
250
+ for (const nodeId of pending) {
251
+ const entry = graph.nodes[nodeId];
252
+ if (entry.nodeType === 'gate') {
253
+ await emitState({
254
+ type: 'node:gated',
255
+ executionId,
256
+ nodeId,
257
+ gateType: 'approval',
258
+ ts: Date.now(),
259
+ });
260
+ }
261
+ }
262
+ // Dispatch all pending nodes in parallel
263
+ const batchResults = await Promise.allSettled(pending.map(async (nodeId) => {
264
+ const entry = graph.nodes[nodeId];
265
+ // Delete stale artifact before dispatch
266
+ if (entry.output) {
267
+ const artifactPath = path.join(dir, entry.output);
268
+ try {
269
+ if (fs.existsSync(artifactPath)) {
270
+ fs.unlinkSync(artifactPath);
271
+ }
272
+ }
273
+ catch {
274
+ // ignore
275
+ }
276
+ }
277
+ // Resolve artifact paths for reads
278
+ const artifactPaths = resolveArtifactPaths(entry.reads, dir, outputMap);
279
+ // PARITY-1: Build NodeInput with retryContext from RunOptions if present
280
+ const nodeInput = {
281
+ dir,
282
+ params,
283
+ artifactPaths,
284
+ retryContext: retryContexts?.[nodeId],
285
+ };
286
+ // Build ExecutionContext
287
+ const execCtx = {
288
+ executionId,
289
+ nodeId,
290
+ runtime,
291
+ emitOutput,
292
+ signal,
293
+ };
294
+ const nodeStart = Date.now();
295
+ const timeoutSecs = entry.timeout ?? 3600;
296
+ // Dispatch with timeout (CR3: applies to ALL node types)
297
+ // C3 fix: clear timer when node completes to prevent leaks
298
+ const timeout = rejectAfterTimeout(timeoutSecs, signal);
299
+ try {
300
+ const output = await Promise.race([
301
+ entry.fn(nodeInput, execCtx),
302
+ timeout.promise,
303
+ ]);
304
+ timeout.clear();
305
+ const elapsedMs = Date.now() - nodeStart;
306
+ return { nodeId, output, elapsedMs, entry };
307
+ }
308
+ catch (err) {
309
+ timeout.clear();
310
+ throw err;
311
+ }
312
+ }));
313
+ // Abort check after batch: if signal was aborted during batch (e.g., gate abort),
314
+ // treat all rejected nodes as killed and stop
315
+ if (signal.aborted) {
316
+ for (let i = 0; i < pending.length; i++) {
317
+ const nodeId = pending[i];
318
+ const result = batchResults[i];
319
+ if (result.status === 'rejected') {
320
+ await emitState({
321
+ type: 'node:killed',
322
+ executionId,
323
+ nodeId,
324
+ ts: Date.now(),
325
+ });
326
+ }
327
+ else {
328
+ const { output, elapsedMs, entry } = result.value;
329
+ await emitState({
330
+ type: 'node:completed',
331
+ executionId,
332
+ nodeId,
333
+ action: output.action,
334
+ elapsedMs,
335
+ ts: Date.now(),
336
+ });
337
+ }
338
+ }
339
+ await emitState({
340
+ type: 'run:completed',
341
+ executionId,
342
+ status: 'stopped',
343
+ ts: Date.now(),
344
+ });
345
+ throw new types_1.FlowAbortedError('Flow aborted');
346
+ }
347
+ // Phase 1: Record completions + fire edges
348
+ const newlyCompleted = [];
349
+ for (let i = 0; i < pending.length; i++) {
350
+ const nodeId = pending[i];
351
+ const result = batchResults[i];
352
+ if (result.status === 'fulfilled') {
353
+ const { output, elapsedMs, entry } = result.value;
354
+ // Emit node:completed
355
+ await emitState({
356
+ type: 'node:completed',
357
+ executionId,
358
+ nodeId,
359
+ action: output.action,
360
+ elapsedMs,
361
+ ts: Date.now(),
362
+ });
363
+ // Write artifact if present
364
+ if (output.artifact && entry.output) {
365
+ const artifactPath = path.join(dir, entry.output);
366
+ fs.writeFileSync(artifactPath, output.artifact, 'utf-8');
367
+ await emitState({
368
+ type: 'artifact:written',
369
+ executionId,
370
+ nodeId,
371
+ path: artifactPath,
372
+ size: output.artifact.length,
373
+ ts: Date.now(),
374
+ });
375
+ }
376
+ // Emit metadata events
377
+ if (output.metadata) {
378
+ for (const [key, value] of Object.entries(output.metadata)) {
379
+ await emitState({
380
+ type: 'metadata',
381
+ executionId,
382
+ key,
383
+ value,
384
+ ts: Date.now(),
385
+ });
386
+ }
387
+ }
388
+ completed.set(nodeId, {
389
+ action: output.action,
390
+ finishedAt: Date.now(),
391
+ });
392
+ nodeStatuses.set(nodeId, 'completed');
393
+ newlyCompleted.push({ nodeId, output, elapsedMs, entry });
394
+ }
395
+ else {
396
+ // Node failed
397
+ const error = result.reason instanceof Error
398
+ ? result.reason.message
399
+ : String(result.reason);
400
+ await emitState({
401
+ type: 'node:failed',
402
+ executionId,
403
+ nodeId,
404
+ error,
405
+ ts: Date.now(),
406
+ });
407
+ failedNodes.add(nodeId);
408
+ nodeStatuses.set(nodeId, 'failed');
409
+ }
410
+ }
411
+ // Phase 1b: Fire edges for all completed nodes
412
+ for (const { nodeId, output } of newlyCompleted) {
413
+ const edgeMap = graph.edges[nodeId];
414
+ if (!edgeMap)
415
+ continue; // terminal node, no outgoing edges
416
+ let target = edgeMap[output.action];
417
+ if (!target) {
418
+ target = edgeMap['default'];
419
+ }
420
+ if (target && target !== 'end') {
421
+ // Record fired edge
422
+ let sources = firedEdges.get(target);
423
+ if (!sources) {
424
+ sources = new Set();
425
+ firedEdges.set(target, sources);
426
+ }
427
+ sources.add(nodeId);
428
+ await emitState({
429
+ type: 'edge:traversed',
430
+ executionId,
431
+ source: nodeId,
432
+ target,
433
+ action: output.action,
434
+ ts: Date.now(),
435
+ });
436
+ }
437
+ // If no matching edge at all: terminal node (flow ends here for this path)
438
+ }
439
+ // Phase 2: Determine which nodes are newly ready
440
+ const nextPending = [];
441
+ const completedSet = new Set(completed.keys());
442
+ const pendingSet = new Set(pending);
443
+ for (const [target, sources] of firedEdges) {
444
+ if (completedSet.has(target))
445
+ continue;
446
+ if (pendingSet.has(target))
447
+ continue;
448
+ if (nextPending.includes(target))
449
+ continue;
450
+ // Check: all sources that fired toward this target must be completed
451
+ let allReady = true;
452
+ for (const src of sources) {
453
+ if (!completedSet.has(src)) {
454
+ allReady = false;
455
+ break;
456
+ }
457
+ }
458
+ if (allReady) {
459
+ nextPending.push(target);
460
+ }
461
+ }
462
+ pending = nextPending;
463
+ }
464
+ // Determine final status
465
+ const status = failedNodes.size > 0 ? 'failed' : 'completed';
466
+ const durationMs = Date.now() - startTime;
467
+ await emitState({
468
+ type: 'run:completed',
469
+ executionId,
470
+ status,
471
+ ts: Date.now(),
472
+ });
473
+ return {
474
+ completed: status === 'completed',
475
+ durationMs,
476
+ };
477
+ }
478
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/scheduler.ts"],"names":[],"mappings":"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"}