yaml-flow 7.0.0 → 8.0.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 (393) hide show
  1. package/browser/asset-integrity.json +8 -4
  2. package/browser/board-livecards-client.js +1 -1
  3. package/browser/board-livecards-localstorage.js +5 -5
  4. package/browser/live-cards.js +19 -3307
  5. package/cli/board-live-cards-lib-tjYsPt5U.d.ts +321 -0
  6. package/{dist/cli → cli}/browser-api/board-live-cards-browser-adapter.d.ts +3 -5
  7. package/cli/browser-api/board-live-cards-browser-adapter.js +3 -0
  8. package/{dist/cli → cli}/browser-api/card-store-browser-api.d.ts +1 -2
  9. package/{dist/cli → cli}/browser-api/card-store-browser-api.js +1 -1
  10. package/cli/execution-interface-C_A6WCiK.d.ts +284 -0
  11. package/cli/node/artifacts-store-cli.js +11 -0
  12. package/cli/node/batch-runner-cli.js +3 -0
  13. package/cli/node/board-live-cards-cli.js +15 -0
  14. package/cli/node/card-store-cli.js +8 -0
  15. package/{dist/cli → cli}/node/execution-adapter.d.ts +3 -3
  16. package/cli/node/execution-adapter.js +3 -0
  17. package/{dist/cli → cli}/node/fs-board-adapter.d.ts +24 -11
  18. package/cli/node/fs-board-adapter.js +14 -0
  19. package/{dist/cli → cli}/node/source-cli-task-executor.js +2 -2
  20. package/cli/node/step-machine-cli.d.ts +7 -0
  21. package/cli/node/step-machine-cli.js +5 -0
  22. package/{dist/board-live-cards-public-CW5074xr.d.cts → cli/types-CziUxkiv.d.ts} +69 -7
  23. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/card-store-ref.json +1 -0
  24. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/chat-handler.json +1 -0
  25. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/outputs-store-ref.json +1 -0
  26. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.config/task-executor.json +1 -0
  27. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.state-snapshot/board/graph.json +29 -0
  28. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime/.state-snapshot/board/lastJournalProcessedId.json +1 -0
  29. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/gandalf-runtime-out/.outputs/status.json +25 -0
  30. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-market-prices/computed_values.json +67 -0
  31. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-portfolio/computed_values.json +1 -0
  32. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/cards/card-portfolio-value/computed_values.json +52 -0
  33. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/holdings.json +22 -0
  34. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/positions.json +46 -0
  35. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/data-objects/quotes.json +35 -0
  36. package/examples/board/.demo-setup/run-1778643703151-3360-dopnpv/board-default/runtime-out/.outputs/status.json +113 -0
  37. package/examples/{example-board/cards/card-market-prices.json → board/cards/cardT-market-prices.json} +2 -2
  38. package/examples/{example-board/cards/card-portfolio.json → board/cards/cardT-portfolio.json} +3 -13
  39. package/examples/{example-board → board}/demo-server-config.json +0 -1
  40. package/examples/{example-board → board}/demo-server.js +70 -72
  41. package/examples/{example-board → board}/demo-shell-with-server.html +3 -3
  42. package/examples/{example-board → board}/demo-task-executor.js +75 -32
  43. package/examples/board/gandalf-cards/card-source-kinds.json +36 -0
  44. package/examples/board/gandalf-cards/cards/_index.json +7 -0
  45. package/examples/board/gandalf-cards/cards/card-source-kinds.json +64 -0
  46. package/examples/board/source-def-flows/copilot.flow.json +33 -0
  47. package/examples/board/source-def-flows/mock.flow.json +35 -0
  48. package/examples/board/source-def-flows/url-list.flow.json +33 -0
  49. package/examples/board/source-def-flows/url.flow.json +33 -0
  50. package/examples/board/source-def-flows/workiq.flow.json +34 -0
  51. package/examples/board/source-def-handlers/copilot-source-handler.js +141 -0
  52. package/examples/board/source-def-handlers/http-source-handler.js +145 -0
  53. package/examples/board/source_def_flows.json +249 -0
  54. package/examples/board/test/demo-http-test.js +317 -0
  55. package/examples/{example-board → board-local}/demo-shell-localstorage.html +4 -4
  56. package/examples/{browser/boards/portfolio-tracker → portfolio-tracker/handlers}/portfolio-tracker-fetch-prices.js +1 -1
  57. package/examples/{browser/boards/portfolio-tracker/portfolio-tracker-public.js → portfolio-tracker/portfolio-tracker.js} +11 -14
  58. package/examples/{browser/boards/portfolio-tracker → portfolio-tracker/test}/portfolio-t4.js +32 -50
  59. package/lib/artifacts-store-lib-public-BABrgFkV.d.ts +119 -0
  60. package/lib/artifacts-store-lib-public-DGa8BpJT.d.cts +119 -0
  61. package/lib/artifacts-store-public.cjs +2 -0
  62. package/lib/artifacts-store-public.d.cts +5 -0
  63. package/lib/artifacts-store-public.d.ts +5 -0
  64. package/lib/artifacts-store-public.js +2 -0
  65. package/lib/board-live-cards-node.cjs +14 -0
  66. package/{dist/cli/node/execution-adapter.d.cts → lib/board-live-cards-node.d.cts} +45 -85
  67. package/lib/board-live-cards-node.d.ts +134 -0
  68. package/lib/board-live-cards-node.js +14 -0
  69. package/lib/board-live-cards-public-BnmRAbQV.d.cts +383 -0
  70. package/{dist/board-live-cards-public-hnZo0mAf.d.ts → lib/board-live-cards-public-CsmYrvpd.d.ts} +142 -77
  71. package/lib/board-live-cards-public.cjs +3 -0
  72. package/lib/board-live-cards-public.d.cts +4 -0
  73. package/lib/board-live-cards-public.d.ts +4 -0
  74. package/lib/board-live-cards-public.js +3 -0
  75. package/lib/board-live-cards-server-runtime.cjs +9 -0
  76. package/lib/board-live-cards-server-runtime.d.cts +6 -0
  77. package/lib/board-live-cards-server-runtime.d.ts +6 -0
  78. package/lib/board-live-cards-server-runtime.js +9 -0
  79. package/lib/board-livegraph-runtime/index.cjs +3 -0
  80. package/{dist → lib}/board-livegraph-runtime/index.d.cts +1 -2
  81. package/{dist → lib}/board-livegraph-runtime/index.d.ts +1 -2
  82. package/lib/board-livegraph-runtime/index.js +3 -0
  83. package/lib/board-worker-adapter.cjs +10 -0
  84. package/{dist/storage-refs.d.cts → lib/board-worker-adapter.d.cts} +5 -5
  85. package/{dist/storage-refs.d.ts → lib/board-worker-adapter.d.ts} +5 -5
  86. package/lib/board-worker-adapter.js +10 -0
  87. package/{dist → lib}/card-compute/index.cjs +1 -1
  88. package/{dist → lib}/card-compute/index.js +1 -1
  89. package/lib/card-store-public.cjs +2 -0
  90. package/lib/card-store-public.d.cts +61 -0
  91. package/lib/card-store-public.d.ts +61 -0
  92. package/lib/card-store-public.js +2 -0
  93. package/lib/card-validation.cjs +10 -0
  94. package/lib/card-validation.d.cts +35 -0
  95. package/lib/card-validation.d.ts +35 -0
  96. package/lib/card-validation.js +10 -0
  97. package/{dist/constants-oCEbNpul.d.ts → lib/constants-BPVLb3Es.d.ts} +1 -1
  98. package/{dist/constants-BzZUyYlp.d.cts → lib/constants-DXxsRN9y.d.cts} +1 -1
  99. package/{dist → lib}/continuous-event-graph/index.cjs +2 -2
  100. package/{dist → lib}/continuous-event-graph/index.d.cts +3 -5
  101. package/{dist → lib}/continuous-event-graph/index.d.ts +3 -5
  102. package/{dist → lib}/continuous-event-graph/index.js +2 -2
  103. package/{dist → lib}/event-graph/index.d.cts +2 -2
  104. package/{dist → lib}/event-graph/index.d.ts +2 -2
  105. package/lib/execution-refs.cjs +3 -0
  106. package/{dist → lib}/execution-refs.d.cts +38 -14
  107. package/{dist → lib}/execution-refs.d.ts +38 -14
  108. package/lib/execution-refs.js +3 -0
  109. package/lib/index.cjs +25 -0
  110. package/{dist → lib}/index.d.cts +7 -8
  111. package/{dist → lib}/index.d.ts +7 -8
  112. package/lib/index.js +25 -0
  113. package/{dist/live-cards-bridge-BXbVTsna.d.cts → lib/live-cards-bridge-DC_ZU0eS.d.ts} +134 -3
  114. package/{dist/live-cards-bridge-Ds28XR15.d.ts → lib/live-cards-bridge-b25aAVvE.d.cts} +134 -3
  115. package/lib/loader-CuuLjxVA.d.cts +42 -0
  116. package/lib/loader-Zborm2pq.d.ts +42 -0
  117. package/lib/server-runtime/index.cjs +9 -0
  118. package/{dist → lib}/server-runtime/index.d.cts +4 -4
  119. package/{dist → lib}/server-runtime/index.d.ts +4 -4
  120. package/lib/server-runtime/index.js +9 -0
  121. package/lib/step-machine/index.d.cts +64 -0
  122. package/lib/step-machine/index.d.ts +64 -0
  123. package/lib/step-machine-public/index.cjs +5 -0
  124. package/{dist → lib}/step-machine-public/index.d.cts +21 -1
  125. package/{dist → lib}/step-machine-public/index.d.ts +21 -1
  126. package/lib/step-machine-public/index.js +5 -0
  127. package/lib/storage-interface-BhAON-gW.d.cts +84 -0
  128. package/lib/storage-interface-BhAON-gW.d.ts +84 -0
  129. package/lib/stores/index.cjs +3 -0
  130. package/lib/stores/index.d.cts +4 -0
  131. package/lib/stores/index.d.ts +4 -0
  132. package/lib/stores/index.js +3 -0
  133. package/lib/stores/kv.cjs +3 -0
  134. package/lib/stores/kv.d.cts +32 -0
  135. package/lib/stores/kv.d.ts +32 -0
  136. package/lib/stores/kv.js +3 -0
  137. package/{dist → lib}/stores/memory.d.cts +1 -1
  138. package/{dist → lib}/stores/memory.d.ts +1 -1
  139. package/{dist/types-B1ZRa4aI.d.ts → lib/types-CBxkYuLY.d.ts} +2 -1
  140. package/{dist/types-ycun84cq.d.cts → lib/types-DQ1bKuB1.d.cts} +11 -0
  141. package/{dist/types-ycun84cq.d.ts → lib/types-DQ1bKuB1.d.ts} +11 -0
  142. package/{dist/types-BxEFcVK9.d.cts → lib/types-DkFvgxwq.d.cts} +2 -1
  143. package/package.json +79 -119
  144. package/board-live-cards-cli.js +0 -37
  145. package/browser/board-livecards-client.js.map +0 -1
  146. package/browser/board-livecards-localstorage.js.map +0 -1
  147. package/browser/board-livegraph-engine.js +0 -3
  148. package/browser/board-livegraph-engine.js.map +0 -1
  149. package/browser/card-compute.js +0 -266
  150. package/browser/compute-jsonata.js.map +0 -1
  151. package/card-store.js +0 -37
  152. package/dist/batch/index.cjs.map +0 -1
  153. package/dist/batch/index.js.map +0 -1
  154. package/dist/board-live-cards-lib-Bg6EvCo5.d.cts +0 -136
  155. package/dist/board-live-cards-lib-jM2uYG1v.d.ts +0 -136
  156. package/dist/board-livegraph-runtime/index.cjs +0 -3
  157. package/dist/board-livegraph-runtime/index.cjs.map +0 -1
  158. package/dist/board-livegraph-runtime/index.js +0 -3
  159. package/dist/board-livegraph-runtime/index.js.map +0 -1
  160. package/dist/card-compute/index.cjs.map +0 -1
  161. package/dist/card-compute/index.js.map +0 -1
  162. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +0 -3
  163. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +0 -1
  164. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +0 -37
  165. package/dist/cli/browser-api/board-live-cards-browser-adapter.js +0 -3
  166. package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +0 -1
  167. package/dist/cli/browser-api/card-store-browser-api.cjs +0 -2
  168. package/dist/cli/browser-api/card-store-browser-api.cjs.map +0 -1
  169. package/dist/cli/browser-api/card-store-browser-api.d.cts +0 -26
  170. package/dist/cli/browser-api/card-store-browser-api.js.map +0 -1
  171. package/dist/cli/node/artifacts-store-cli.cjs +0 -11
  172. package/dist/cli/node/artifacts-store-cli.cjs.map +0 -1
  173. package/dist/cli/node/artifacts-store-cli.d.cts +0 -8
  174. package/dist/cli/node/artifacts-store-cli.js +0 -11
  175. package/dist/cli/node/artifacts-store-cli.js.map +0 -1
  176. package/dist/cli/node/board-live-cards-cli.cjs +0 -15
  177. package/dist/cli/node/board-live-cards-cli.cjs.map +0 -1
  178. package/dist/cli/node/board-live-cards-cli.d.cts +0 -20
  179. package/dist/cli/node/board-live-cards-cli.js +0 -15
  180. package/dist/cli/node/board-live-cards-cli.js.map +0 -1
  181. package/dist/cli/node/card-store-cli.cjs +0 -8
  182. package/dist/cli/node/card-store-cli.cjs.map +0 -1
  183. package/dist/cli/node/card-store-cli.d.cts +0 -15
  184. package/dist/cli/node/card-store-cli.js +0 -8
  185. package/dist/cli/node/card-store-cli.js.map +0 -1
  186. package/dist/cli/node/execution-adapter.cjs +0 -3
  187. package/dist/cli/node/execution-adapter.cjs.map +0 -1
  188. package/dist/cli/node/execution-adapter.js +0 -3
  189. package/dist/cli/node/execution-adapter.js.map +0 -1
  190. package/dist/cli/node/fs-board-adapter.cjs +0 -14
  191. package/dist/cli/node/fs-board-adapter.cjs.map +0 -1
  192. package/dist/cli/node/fs-board-adapter.d.cts +0 -204
  193. package/dist/cli/node/fs-board-adapter.js +0 -14
  194. package/dist/cli/node/fs-board-adapter.js.map +0 -1
  195. package/dist/cli/node/source-cli-task-executor.cjs +0 -11
  196. package/dist/cli/node/source-cli-task-executor.cjs.map +0 -1
  197. package/dist/cli/node/source-cli-task-executor.js.map +0 -1
  198. package/dist/config/index.cjs.map +0 -1
  199. package/dist/config/index.js.map +0 -1
  200. package/dist/continuous-event-graph/index.cjs.map +0 -1
  201. package/dist/continuous-event-graph/index.js.map +0 -1
  202. package/dist/event-graph/index.cjs.map +0 -1
  203. package/dist/event-graph/index.js.map +0 -1
  204. package/dist/execution-refs.cjs +0 -3
  205. package/dist/execution-refs.cjs.map +0 -1
  206. package/dist/execution-refs.js +0 -3
  207. package/dist/execution-refs.js.map +0 -1
  208. package/dist/index.cjs +0 -30
  209. package/dist/index.cjs.map +0 -1
  210. package/dist/index.js +0 -30
  211. package/dist/index.js.map +0 -1
  212. package/dist/inference/index.cjs +0 -7
  213. package/dist/inference/index.cjs.map +0 -1
  214. package/dist/inference/index.d.cts +0 -229
  215. package/dist/inference/index.d.ts +0 -229
  216. package/dist/inference/index.js +0 -7
  217. package/dist/inference/index.js.map +0 -1
  218. package/dist/server-runtime/index.cjs +0 -9
  219. package/dist/server-runtime/index.cjs.map +0 -1
  220. package/dist/server-runtime/index.js +0 -9
  221. package/dist/server-runtime/index.js.map +0 -1
  222. package/dist/step-machine/index.cjs.map +0 -1
  223. package/dist/step-machine/index.d.cts +0 -102
  224. package/dist/step-machine/index.d.ts +0 -102
  225. package/dist/step-machine/index.js.map +0 -1
  226. package/dist/step-machine-public/index.cjs +0 -2
  227. package/dist/step-machine-public/index.cjs.map +0 -1
  228. package/dist/step-machine-public/index.js +0 -2
  229. package/dist/step-machine-public/index.js.map +0 -1
  230. package/dist/storage-refs.cjs +0 -10
  231. package/dist/storage-refs.cjs.map +0 -1
  232. package/dist/storage-refs.js +0 -10
  233. package/dist/storage-refs.js.map +0 -1
  234. package/dist/stores/file.cjs +0 -2
  235. package/dist/stores/file.cjs.map +0 -1
  236. package/dist/stores/file.d.cts +0 -36
  237. package/dist/stores/file.d.ts +0 -36
  238. package/dist/stores/file.js +0 -2
  239. package/dist/stores/file.js.map +0 -1
  240. package/dist/stores/index.cjs +0 -2
  241. package/dist/stores/index.cjs.map +0 -1
  242. package/dist/stores/index.d.cts +0 -4
  243. package/dist/stores/index.d.ts +0 -4
  244. package/dist/stores/index.js +0 -2
  245. package/dist/stores/index.js.map +0 -1
  246. package/dist/stores/localStorage.cjs +0 -2
  247. package/dist/stores/localStorage.cjs.map +0 -1
  248. package/dist/stores/localStorage.d.cts +0 -34
  249. package/dist/stores/localStorage.d.ts +0 -34
  250. package/dist/stores/localStorage.js +0 -2
  251. package/dist/stores/localStorage.js.map +0 -1
  252. package/dist/stores/memory.cjs.map +0 -1
  253. package/dist/stores/memory.js.map +0 -1
  254. package/dist/types-CHSdoAAA.d.cts +0 -135
  255. package/dist/types-CoW0gQl3.d.ts +0 -135
  256. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-fetch-prices.py +0 -201
  257. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +0 -357
  258. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-inference-adapter.js +0 -196
  259. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +0 -300
  260. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +0 -617
  261. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +0 -366
  262. package/examples/browser/livecards-browser/index.html +0 -41
  263. package/examples/browser/step-machine-browser/index.html +0 -367
  264. package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/.runtime-out +0 -1
  265. package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/board-graph.json +0 -32
  266. package/examples/cli/step-machine-cli/portfolio-tracker/cards/holdings-table.json +0 -22
  267. package/examples/cli/step-machine-cli/portfolio-tracker/cards/portfolio-form.json +0 -43
  268. package/examples/cli/step-machine-cli/portfolio-tracker/cards/portfolio-value.json +0 -15
  269. package/examples/cli/step-machine-cli/portfolio-tracker/cards/price-fetch.json +0 -15
  270. package/examples/cli/step-machine-cli/portfolio-tracker/fetch-prices.js +0 -48
  271. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +0 -125
  272. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +0 -32
  273. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +0 -26
  274. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +0 -49
  275. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +0 -25
  276. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +0 -23
  277. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +0 -21
  278. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +0 -38
  279. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +0 -48
  280. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +0 -31
  281. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +0 -107
  282. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +0 -51
  283. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +0 -45
  284. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +0 -71
  285. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/reset-board-dir.py +0 -36
  286. package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-demo.flow.yaml +0 -26
  287. package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-handlers.py +0 -39
  288. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker-pycli.flow.yaml +0 -80
  289. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +0 -76
  290. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +0 -44
  291. package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +0 -43
  292. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker-pycli.py +0 -77
  293. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +0 -28
  294. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +0 -31
  295. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +0 -54
  296. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +0 -21
  297. package/examples/cli/step-machine-demo/step-cli-echo-y.js +0 -15
  298. package/examples/cli/step-machine-demo/step2-double-cli.js +0 -33
  299. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +0 -93
  300. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +0 -43
  301. package/examples/example-board/agent-instructions-cardlayout.md +0 -56
  302. package/examples/example-board/agent-instructions.md +0 -834
  303. package/examples/example-board/cards/_index.json +0 -47
  304. package/examples/example-board/demo-shell.html +0 -63
  305. package/examples/index.html +0 -785
  306. package/examples/npm-libs/batch/batch-step-machine.ts +0 -121
  307. package/examples/npm-libs/continuous-event-graph/live-cards-board.ts +0 -215
  308. package/examples/npm-libs/continuous-event-graph/live-portfolio-dashboard.ts +0 -555
  309. package/examples/npm-libs/continuous-event-graph/portfolio-tracker.ts +0 -287
  310. package/examples/npm-libs/continuous-event-graph/reactive-monitoring.ts +0 -265
  311. package/examples/npm-libs/continuous-event-graph/reactive-pipeline.ts +0 -168
  312. package/examples/npm-libs/continuous-event-graph/soc-incident-board.ts +0 -287
  313. package/examples/npm-libs/continuous-event-graph/stock-dashboard.ts +0 -229
  314. package/examples/npm-libs/event-graph/ci-cd-pipeline.ts +0 -243
  315. package/examples/npm-libs/event-graph/executor-diamond.ts +0 -165
  316. package/examples/npm-libs/event-graph/executor-pipeline.ts +0 -161
  317. package/examples/npm-libs/event-graph/research-pipeline.ts +0 -137
  318. package/examples/npm-libs/flows/ai-conversation.yaml +0 -116
  319. package/examples/npm-libs/flows/order-processing.yaml +0 -143
  320. package/examples/npm-libs/flows/simple-greeting.yaml +0 -54
  321. package/examples/npm-libs/graph-of-graphs/multi-stage-etl.ts +0 -307
  322. package/examples/npm-libs/graph-of-graphs/url-processing-pipeline.ts +0 -254
  323. package/examples/npm-libs/inference/azure-deployment.ts +0 -149
  324. package/examples/npm-libs/inference/copilot-cli.ts +0 -138
  325. package/examples/npm-libs/inference/data-pipeline.ts +0 -145
  326. package/examples/npm-libs/inference/pluggable-adapters.ts +0 -254
  327. package/examples/npm-libs/node/ai-conversation.ts +0 -195
  328. package/examples/npm-libs/node/simple-greeting.ts +0 -101
  329. package/examples/step-machine-cli/portfolio-tracker/cards/holdings-table.json +0 -22
  330. package/examples/step-machine-cli/portfolio-tracker/cards/portfolio-form.json +0 -43
  331. package/examples/step-machine-cli/portfolio-tracker/cards/portfolio-value.json +0 -15
  332. package/examples/step-machine-cli/portfolio-tracker/cards/price-fetch.json +0 -15
  333. package/examples/step-machine-cli/portfolio-tracker/fetch-prices.js +0 -48
  334. package/examples/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +0 -57
  335. package/examples/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +0 -27
  336. package/examples/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +0 -25
  337. package/examples/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +0 -29
  338. package/examples/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +0 -27
  339. package/examples/step-machine-cli/portfolio-tracker/handlers/status-cli.js +0 -25
  340. package/examples/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +0 -37
  341. package/examples/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +0 -53
  342. package/examples/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +0 -35
  343. package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker-task-executor.cjs +0 -96
  344. package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +0 -227
  345. package/examples/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +0 -38
  346. package/examples/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +0 -28
  347. package/step-machine-cli.js +0 -407
  348. /package/{dist/board-livegraph-runtime → cli/browser-api}/jsonata-sync.cjs +0 -0
  349. /package/{dist/cli → cli}/node/artifacts-store-cli.d.ts +0 -0
  350. /package/{dist/cli/node/source-cli-task-executor.d.cts → cli/node/batch-runner-cli.d.ts} +0 -0
  351. /package/{dist/cli → cli}/node/board-live-cards-cli.d.ts +0 -0
  352. /package/{dist/cli → cli}/node/card-store-cli.d.ts +0 -0
  353. /package/{dist/card-compute → cli/node}/jsonata-sync.cjs +0 -0
  354. /package/{dist/cli → cli}/node/source-cli-task-executor.d.ts +0 -0
  355. /package/examples/{example-board → board}/cards/card-concentration.json +0 -0
  356. /package/examples/{example-board → board}/cards/card-my-identity.json +0 -0
  357. /package/examples/{example-board → board}/cards/card-portfolio-action.json +0 -0
  358. /package/examples/{example-board → board}/cards/card-portfolio-intelligence.json +0 -0
  359. /package/examples/{example-board → board}/cards/card-portfolio-risks.json +0 -0
  360. /package/examples/{example-board → board}/cards/card-rebalance-impact.json +0 -0
  361. /package/examples/{example-board → board}/cards/card-rebalance-sim.json +0 -0
  362. /package/examples/{example-board/cards/card-portfolio-value.json → board/cards/cardT-portfolio-value.json} +0 -0
  363. /package/examples/{example-board → board}/demo-chat-handler.js +0 -0
  364. /package/examples/{example-board → board}/scripts/copilot_wrapper.bat +0 -0
  365. /package/examples/{example-board → board}/scripts/copilot_wrapper_helper.ps1 +0 -0
  366. /package/examples/{example-board → board}/scripts/workiq_wrapper.mjs +0 -0
  367. /package/examples/{browser/boards/portfolio-tracker → board/test}/portfolio-tracker-sse-worker.js +0 -0
  368. /package/{dist → lib}/batch/index.cjs +0 -0
  369. /package/{dist → lib}/batch/index.d.cts +0 -0
  370. /package/{dist → lib}/batch/index.d.ts +0 -0
  371. /package/{dist → lib}/batch/index.js +0 -0
  372. /package/{dist/cli/browser-api → lib/board-livegraph-runtime}/jsonata-sync.cjs +0 -0
  373. /package/{dist → lib}/card-compute/index.d.cts +0 -0
  374. /package/{dist → lib}/card-compute/index.d.ts +0 -0
  375. /package/{dist/cli/node → lib/card-compute}/jsonata-sync.cjs +0 -0
  376. /package/{dist → lib}/config/index.cjs +0 -0
  377. /package/{dist → lib}/config/index.d.cts +0 -0
  378. /package/{dist → lib}/config/index.d.ts +0 -0
  379. /package/{dist → lib}/config/index.js +0 -0
  380. /package/{dist → lib}/continuous-event-graph/jsonata-sync.cjs +0 -0
  381. /package/{dist → lib}/event-graph/index.cjs +0 -0
  382. /package/{dist → lib}/event-graph/index.js +0 -0
  383. /package/{dist → lib}/jsonata-sync.cjs +0 -0
  384. /package/{dist → lib}/server-runtime/jsonata-sync.cjs +0 -0
  385. /package/{dist → lib}/step-machine/index.cjs +0 -0
  386. /package/{dist → lib}/step-machine/index.js +0 -0
  387. /package/{dist → lib}/step-machine-public/jsonata-sync.cjs +0 -0
  388. /package/{dist → lib}/stores/memory.cjs +0 -0
  389. /package/{dist → lib}/stores/memory.js +0 -0
  390. /package/{dist → lib}/types-BBhqYGhE.d.cts +0 -0
  391. /package/{dist → lib}/types-BBhqYGhE.d.ts +0 -0
  392. /package/{dist → lib}/validate-BAVzUJWa.d.ts +0 -0
  393. /package/{dist → lib}/validate-Dbu7ygys.d.cts +0 -0
@@ -0,0 +1,36 @@
1
+ {
2
+ "id": "card-source-kinds",
3
+ "meta": {
4
+ "title": "Source Connection Types",
5
+ "tags": ["admin"],
6
+ "desc": "Reference card listing the source def kinds supported by the demo task executor.",
7
+ "_gandalfCard": true
8
+ },
9
+ "provides": [],
10
+ "compute": [],
11
+ "view": {
12
+ "elements": [
13
+ {
14
+ "kind": "table",
15
+ "label": "Supported connection types",
16
+ "data": {
17
+ "bind": "card_data.kinds",
18
+ "columns": ["kind", "description"]
19
+ }
20
+ }
21
+ ],
22
+ "layout": {
23
+ "board": { "col": 4, "order": 99 },
24
+ "canvas": { "x": 900, "y": 50, "w": 480, "h": 240 }
25
+ }
26
+ },
27
+ "card_data": {
28
+ "kinds": [
29
+ { "kind": "mock", "description": "Look up a key in the built-in MOCK_DB dictionary and return static JSON." },
30
+ { "kind": "copilot", "description": "Invoke GitHub Copilot CLI using copilot.prompt_template (or top-level prompt_template shorthand) with {{key}} interpolation from _projections and args." },
31
+ { "kind": "workiq", "description": "Invoke WorkIQ (Microsoft 365 Copilot) using workiq.query_template with {{key}} interpolation. Requires workiq CLI + az login." },
32
+ { "kind": "url", "description": "Single URL fetch via curl with {{key}} interpolation from _projections. Supports method, headers, args, tickersFrom, and cacheTimeout (seconds)." },
33
+ { "kind": "url-list", "description": "Fan-out fetch over _projections.url_list (string[]), returning an array of raw JSON responses. Supports method, headers, and cacheTimeout." }
34
+ ]
35
+ }
36
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "card-source-kinds": {
3
+ "key": "card-source-kinds",
4
+ "checksum": "",
5
+ "updatedAt": "2026-05-07T19:32:58.245Z"
6
+ }
7
+ }
@@ -0,0 +1,64 @@
1
+ {
2
+ "id": "card-source-kinds",
3
+ "meta": {
4
+ "title": "Source Connection Types",
5
+ "tags": [
6
+ "admin"
7
+ ],
8
+ "desc": "Reference card listing the source def kinds supported by the demo task executor.",
9
+ "_gandalfCard": true
10
+ },
11
+ "provides": [],
12
+ "compute": [],
13
+ "view": {
14
+ "elements": [
15
+ {
16
+ "kind": "table",
17
+ "label": "Supported connection types",
18
+ "data": {
19
+ "bind": "card_data.kinds",
20
+ "columns": [
21
+ "kind",
22
+ "description"
23
+ ]
24
+ }
25
+ }
26
+ ],
27
+ "layout": {
28
+ "board": {
29
+ "col": 4,
30
+ "order": 99
31
+ },
32
+ "canvas": {
33
+ "x": 900,
34
+ "y": 50,
35
+ "w": 480,
36
+ "h": 240
37
+ }
38
+ }
39
+ },
40
+ "card_data": {
41
+ "kinds": [
42
+ {
43
+ "kind": "mock",
44
+ "description": "Look up a key in the built-in MOCK_DB dictionary and return static JSON."
45
+ },
46
+ {
47
+ "kind": "copilot",
48
+ "description": "Invoke GitHub Copilot CLI using copilot.prompt_template (or top-level prompt_template shorthand) with {{key}} interpolation from _projections and args."
49
+ },
50
+ {
51
+ "kind": "workiq",
52
+ "description": "Invoke WorkIQ (Microsoft 365 Copilot) using workiq.query_template with {{key}} interpolation. Requires workiq CLI + az login."
53
+ },
54
+ {
55
+ "kind": "url",
56
+ "description": "Single URL fetch via curl with {{key}} interpolation from _projections. Supports method, headers, args, tickersFrom, and cacheTimeout (seconds)."
57
+ },
58
+ {
59
+ "kind": "url-list",
60
+ "description": "Fan-out fetch over _projections.url_list (string[]), returning an array of raw JSON responses. Supports method, headers, and cacheTimeout."
61
+ }
62
+ ]
63
+ }
64
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "id": "demo-source-copilot",
3
+ "settings": {
4
+ "start_step": "execute",
5
+ "max_total_steps": 8,
6
+ "timeout_ms": 180000
7
+ },
8
+ "steps": {
9
+ "execute": {
10
+ "description": "Execute copilot source def",
11
+ "handler": {
12
+ "type": "ref",
13
+ "howToRun": "demo-local-module",
14
+ "whatToRun": { "kind": "fs-path", "value": "./source-def-handlers/copilot-source-handler.js" }
15
+ },
16
+ "transitions": {
17
+ "success": "completed",
18
+ "failure": "failed"
19
+ }
20
+ }
21
+ },
22
+ "terminal_states": {
23
+ "completed": {
24
+ "description": "Copilot source succeeded",
25
+ "return_intent": "success",
26
+ "return_artifacts": ["resultValue", "wroteOutputDirectly"]
27
+ },
28
+ "failed": {
29
+ "description": "Copilot source failed",
30
+ "return_intent": "failure"
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "id": "demo-source-mock",
3
+ "settings": {
4
+ "start_step": "execute",
5
+ "max_total_steps": 5,
6
+ "timeout_ms": 30000
7
+ },
8
+ "steps": {
9
+ "execute": {
10
+ "description": "Execute mock source def",
11
+ "handler": {
12
+ "type": "compute-jsonata",
13
+ "expr": [
14
+ "data.resultValue = $lookup(expects_data.mockDb, expects_data.sourceDef.mock)",
15
+ "result = $exists(data.resultValue) ? \"success\" : \"failure\""
16
+ ]
17
+ },
18
+ "transitions": {
19
+ "success": "completed",
20
+ "failure": "failed"
21
+ }
22
+ }
23
+ },
24
+ "terminal_states": {
25
+ "completed": {
26
+ "description": "Mock lookup succeeded",
27
+ "return_intent": "success",
28
+ "return_artifacts": ["resultValue", "wroteOutputDirectly"]
29
+ },
30
+ "failed": {
31
+ "description": "Mock lookup failed",
32
+ "return_intent": "failure"
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "id": "demo-source-url-list",
3
+ "settings": {
4
+ "start_step": "execute",
5
+ "max_total_steps": 10,
6
+ "timeout_ms": 60000
7
+ },
8
+ "steps": {
9
+ "execute": {
10
+ "description": "Execute URL list source def",
11
+ "handler": {
12
+ "type": "ref",
13
+ "howToRun": "demo-local-module",
14
+ "whatToRun": { "kind": "fs-path", "value": "./source-def-handlers/http-source-handler.js" }
15
+ },
16
+ "transitions": {
17
+ "success": "completed",
18
+ "failure": "failed"
19
+ }
20
+ }
21
+ },
22
+ "terminal_states": {
23
+ "completed": {
24
+ "description": "URL list fetch succeeded",
25
+ "return_intent": "success",
26
+ "return_artifacts": ["resultValue", "wroteOutputDirectly"]
27
+ },
28
+ "failed": {
29
+ "description": "URL list fetch failed",
30
+ "return_intent": "failure"
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "id": "demo-source-url",
3
+ "settings": {
4
+ "start_step": "execute",
5
+ "max_total_steps": 10,
6
+ "timeout_ms": 60000
7
+ },
8
+ "steps": {
9
+ "execute": {
10
+ "description": "Execute single URL source def",
11
+ "handler": {
12
+ "type": "ref",
13
+ "howToRun": "demo-local-module",
14
+ "whatToRun": { "kind": "fs-path", "value": "./source-def-handlers/http-source-handler.js" }
15
+ },
16
+ "transitions": {
17
+ "success": "completed",
18
+ "failure": "failed"
19
+ }
20
+ }
21
+ },
22
+ "terminal_states": {
23
+ "completed": {
24
+ "description": "URL fetch succeeded",
25
+ "return_intent": "success",
26
+ "return_artifacts": ["resultValue", "wroteOutputDirectly"]
27
+ },
28
+ "failed": {
29
+ "description": "URL fetch failed",
30
+ "return_intent": "failure"
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "id": "demo-source-workiq",
3
+ "settings": {
4
+ "start_step": "execute",
5
+ "max_total_steps": 8,
6
+ "timeout_ms": 120000
7
+ },
8
+ "steps": {
9
+ "execute": {
10
+ "description": "Execute workiq source def via demo-server HTTP proxy",
11
+ "handler": {
12
+ "type": "ref",
13
+ "howToRun": "http:post",
14
+ "whatToRun": { "kind": "http-url", "value": "/api/workiq/ask" }
15
+ },
16
+ "transitions": {
17
+ "success": "completed",
18
+ "failure": "failed"
19
+ }
20
+ }
21
+ },
22
+ "terminal_states": {
23
+ "completed": {
24
+ "description": "WorkIQ source succeeded",
25
+ "return_intent": "success",
26
+ "return_artifacts": ["resultValue", "wroteOutputDirectly"]
27
+ },
28
+ "failed": {
29
+ "description": "WorkIQ source failed",
30
+ "return_intent": "failure",
31
+ "return_artifacts": ["error"]
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { execFileSync } from 'node:child_process';
6
+
7
+ function interpolate(template, args) {
8
+ return String(template).replace(/\{\{\s*([a-zA-Z0-9_.-]+)\s*\}\}/g, (_m, key) => {
9
+ const v = args?.[key];
10
+ if (v === undefined) return '';
11
+ return typeof v === 'string' ? v : JSON.stringify(v);
12
+ });
13
+ }
14
+
15
+ const DEFAULT_PROMPT_CONTEXT = {
16
+ view_kind_guidance: [
17
+ 'VIEW KIND GUIDANCE (for dynamic ref rendering):',
18
+ '- Return a _view object whenever your output data is meant for a ref element.',
19
+ '- Allowed _view.kind values only: table, editable-table, chart, metric, list, badge, text, narrative, markdown, form, filter, todo, alert.',
20
+ '- If uncertain, use "table".',
21
+ '- For array rows that users should edit, prefer "editable-table" and set _view.data.writeTo to a card_data path.',
22
+ '- For chart, set _view.data.chartType and _view.data.columns with [labelField, valueField].',
23
+ '- Keep _view.data minimal and valid JSON (no comments, no trailing text).',
24
+ ].join('\n'),
25
+ card_layout_guidance: [
26
+ 'CARD LAYOUT GUIDANCE:',
27
+ '- Prefer compact outputs that fit a card: one primary structure plus concise rationale text.',
28
+ '- Avoid repeating values already present in upstream inputs.',
29
+ '- If you produce both machine-readable and human-readable content, keep machine-readable fields top-level and concise prose in a separate field.',
30
+ ].join('\n'),
31
+ };
32
+
33
+ function resolvePrompt(sourceDef, promptContext) {
34
+ const cfg = sourceDef?.copilot && typeof sourceDef.copilot === 'object' ? sourceDef.copilot : {};
35
+ const template = cfg.prompt_template ?? sourceDef.prompt_template;
36
+ if (!template || typeof template !== 'string') return null;
37
+ const args = {
38
+ ...(promptContext || DEFAULT_PROMPT_CONTEXT),
39
+ ...(sourceDef?._projections || {}),
40
+ ...(cfg.args || sourceDef.args || {}),
41
+ };
42
+ return interpolate(template, args);
43
+ }
44
+
45
+ function runCopilot(prompt, sourceDef, executorDir, extra) {
46
+ const wrapperPath = path.join(executorDir, 'scripts', 'copilot_wrapper.bat');
47
+ if (process.platform === 'win32' && fs.existsSync(wrapperPath)) {
48
+ const tmpBase = path.join(process.env.TEMP || process.cwd(), `copilot-handler-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
49
+ const outFile = `${tmpBase}.out.json`;
50
+ const promptFile = `${tmpBase}.prompt.txt`;
51
+ const sessionDir = path.join(
52
+ extra?.boardSetupRoot || (process.env.TEMP || process.cwd()),
53
+ 'copilot-sessions',
54
+ String(sourceDef?.bindTo || 'default').replace(/[^a-zA-Z0-9_-]/g, '_'),
55
+ );
56
+ fs.mkdirSync(sessionDir, { recursive: true });
57
+ fs.writeFileSync(promptFile, prompt, 'utf-8');
58
+
59
+ let shapeFile = '';
60
+ const shape = sourceDef?.copilot?.result_shape ?? sourceDef?.result_shape;
61
+ if (shape && typeof shape === 'object') {
62
+ shapeFile = `${tmpBase}.shape.json`;
63
+ fs.writeFileSync(shapeFile, JSON.stringify(shape), 'utf-8');
64
+ }
65
+
66
+ try {
67
+ execFileSync('cmd.exe', [
68
+ '/d', '/c',
69
+ wrapperPath,
70
+ outFile,
71
+ sessionDir,
72
+ extra?.boardSetupRoot || process.cwd(),
73
+ `@${promptFile}`,
74
+ 'json',
75
+ String(sourceDef?.bindTo || 'executor'),
76
+ '',
77
+ shapeFile,
78
+ ], {
79
+ encoding: 'utf-8',
80
+ stdio: ['ignore', 'pipe', 'pipe'],
81
+ windowsHide: true,
82
+ maxBuffer: 10 * 1024 * 1024,
83
+ });
84
+ return JSON.parse(fs.readFileSync(outFile, 'utf-8').replace(/^\uFEFF/, ''));
85
+ } finally {
86
+ try { fs.unlinkSync(promptFile); } catch {}
87
+ try { fs.unlinkSync(outFile); } catch {}
88
+ if (shapeFile) { try { fs.unlinkSync(shapeFile); } catch {} }
89
+ }
90
+ }
91
+
92
+ const stdout = execFileSync('copilot', ['--allow-all'], {
93
+ input: prompt,
94
+ encoding: 'utf-8',
95
+ stdio: ['pipe', 'pipe', 'pipe'],
96
+ timeout: 120000,
97
+ cwd: extra?.boardSetupRoot || process.cwd(),
98
+ windowsHide: true,
99
+ maxBuffer: 10 * 1024 * 1024,
100
+ });
101
+
102
+ const firstBrace = stdout.indexOf('{');
103
+ const firstBracket = stdout.indexOf('[');
104
+ let jsonStart = -1;
105
+ if (firstBrace === -1) jsonStart = firstBracket;
106
+ else if (firstBracket === -1) jsonStart = firstBrace;
107
+ else jsonStart = Math.min(firstBrace, firstBracket);
108
+
109
+ if (jsonStart !== -1) {
110
+ try {
111
+ return JSON.parse(stdout.slice(jsonStart));
112
+ } catch {
113
+ return stdout;
114
+ }
115
+ }
116
+ return stdout;
117
+ }
118
+
119
+ export async function execute(context) {
120
+ const sourceDef = context?.sourceDef || {};
121
+ const extra = context?.extra || {};
122
+ const executorDir = context?.executorDir || process.cwd();
123
+ const promptContext = context?.promptContext || DEFAULT_PROMPT_CONTEXT;
124
+
125
+ const prompt = resolvePrompt(sourceDef, promptContext);
126
+ if (!prompt) {
127
+ return {
128
+ result: 'failure',
129
+ data: { error: 'Source definition missing copilot.prompt_template (or prompt_template)' },
130
+ error: 'missing prompt_template',
131
+ };
132
+ }
133
+
134
+ try {
135
+ const resultValue = runCopilot(prompt, sourceDef, executorDir, extra);
136
+ return { result: 'success', data: { resultValue } };
137
+ } catch (err) {
138
+ const msg = String(err?.message || err);
139
+ return { result: 'failure', data: { error: `copilot invocation failed: ${msg}` }, error: msg };
140
+ }
141
+ }
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import os from 'node:os';
6
+ import crypto from 'node:crypto';
7
+
8
+ const CACHE_DIR = path.join(os.tmpdir(), 'demo-executor-cache');
9
+ const DEFAULT_CACHE_TTL_MS = 60 * 60 * 1000;
10
+
11
+ function interpolate(template, args) {
12
+ return String(template).replace(/\{\{\s*([a-zA-Z0-9_.-]+)\s*\}\}/g, (_m, key) => {
13
+ const v = args?.[key];
14
+ if (v === undefined) return '';
15
+ return typeof v === 'string' ? v : JSON.stringify(v);
16
+ });
17
+ }
18
+
19
+ function cacheKey(seed) {
20
+ return crypto.createHash('sha1').update(seed).digest('hex');
21
+ }
22
+
23
+ function readCache(key, ttlMs) {
24
+ const p = path.join(CACHE_DIR, `${key}.json`);
25
+ try {
26
+ const stat = fs.statSync(p);
27
+ const ageMs = Date.now() - stat.mtimeMs;
28
+ if (ageMs > ttlMs) return null;
29
+ return JSON.parse(fs.readFileSync(p, 'utf-8'));
30
+ } catch {
31
+ return null;
32
+ }
33
+ }
34
+
35
+ function writeCache(key, value) {
36
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
37
+ fs.writeFileSync(path.join(CACHE_DIR, `${key}.json`), JSON.stringify(value));
38
+ }
39
+
40
+ async function fetchJson(url, method, headers) {
41
+ const response = await fetch(url, { method, headers });
42
+ const text = await response.text();
43
+ let parsed;
44
+ try {
45
+ parsed = text ? JSON.parse(text) : {};
46
+ } catch {
47
+ throw new Error(`Invalid JSON from ${url}`);
48
+ }
49
+ if (!response.ok) {
50
+ const msg = typeof parsed?.error === 'string' ? parsed.error : `HTTP ${response.status}`;
51
+ throw new Error(msg);
52
+ }
53
+ return parsed;
54
+ }
55
+
56
+ async function doFetchApi(url, method, headers, ttlMs) {
57
+ const key = cacheKey(`url:${method}:${url}`);
58
+ const cached = readCache(key, ttlMs);
59
+ if (cached !== null) {
60
+ console.error(`[http-source-handler] cache hit for ${url}`);
61
+ return cached;
62
+ }
63
+ const data = await fetchJson(url, method, headers);
64
+ writeCache(key, data);
65
+ return data;
66
+ }
67
+
68
+ function resolveTickersArg(sourceDef, fetchArgs) {
69
+ const tickersFrom = sourceDef?.tickersFrom;
70
+ if (typeof tickersFrom !== 'string' || !tickersFrom.includes('.')) return;
71
+ const [refKey, fieldName] = tickersFrom.split('.', 2);
72
+ const arr = sourceDef?._projections?.[refKey];
73
+ if (!Array.isArray(arr)) return;
74
+ const vals = arr
75
+ .filter((row) => row && typeof row === 'object' && row[fieldName])
76
+ .map((row) => String(row[fieldName]));
77
+ if (vals.length > 0) fetchArgs.tickers = vals.join(',');
78
+ }
79
+
80
+ async function executeUrl(sourceDef) {
81
+ const cfg = sourceDef?.url;
82
+ if (!cfg || typeof cfg !== 'object') {
83
+ throw new Error('url source requires object config');
84
+ }
85
+ const method = String(cfg.method || 'GET').toUpperCase();
86
+ const headers = cfg.headers && typeof cfg.headers === 'object' ? cfg.headers : {};
87
+ const ttlMs = typeof cfg.cacheTimeout === 'number' ? cfg.cacheTimeout * 1000 : DEFAULT_CACHE_TTL_MS;
88
+ const fetchArgs = cfg.args && typeof cfg.args === 'object' ? { ...cfg.args } : {};
89
+
90
+ resolveTickersArg(sourceDef, fetchArgs);
91
+ if (sourceDef?.tickersFrom && !fetchArgs.tickers) {
92
+ throw new Error('url: tickersFrom resolved to empty list - skipping fetch');
93
+ }
94
+
95
+ const ctx = {
96
+ ...(sourceDef?._projections || {}),
97
+ ...fetchArgs,
98
+ };
99
+
100
+ if (typeof cfg.url !== 'string' || !cfg.url) {
101
+ throw new Error('url source missing url template');
102
+ }
103
+ const url = interpolate(cfg.url, ctx);
104
+ return doFetchApi(url, method, headers, ttlMs);
105
+ }
106
+
107
+ async function executeUrlList(sourceDef) {
108
+ const cfg = sourceDef?.['url-list'];
109
+ if (!cfg || typeof cfg !== 'object') {
110
+ throw new Error('url-list source requires object config');
111
+ }
112
+ const method = String(cfg.method || 'GET').toUpperCase();
113
+ const headers = cfg.headers && typeof cfg.headers === 'object' ? cfg.headers : {};
114
+ const ttlMs = typeof cfg.cacheTimeout === 'number' ? cfg.cacheTimeout * 1000 : DEFAULT_CACHE_TTL_MS;
115
+
116
+ const urlList = sourceDef?._projections?.url_list;
117
+ if (!Array.isArray(urlList) || urlList.length === 0) {
118
+ throw new Error('url-list source requires _projections.url_list as non-empty array');
119
+ }
120
+
121
+ const results = [];
122
+ for (const u of urlList) {
123
+ results.push(await doFetchApi(String(u), method, headers, ttlMs));
124
+ }
125
+ return results;
126
+ }
127
+
128
+ export async function execute(context) {
129
+ const kind = context?.kind;
130
+ const sourceDef = context?.sourceDef || {};
131
+ try {
132
+ let resultValue;
133
+ if (kind === 'url') {
134
+ resultValue = await executeUrl(sourceDef);
135
+ } else if (kind === 'url-list') {
136
+ resultValue = await executeUrlList(sourceDef);
137
+ } else {
138
+ throw new Error(`http-source-handler does not support kind: ${kind}`);
139
+ }
140
+ return { result: 'success', data: { resultValue } };
141
+ } catch (err) {
142
+ const msg = String(err?.message || err);
143
+ return { result: 'failure', data: { error: msg }, error: msg };
144
+ }
145
+ }