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
@@ -1,357 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * portfolio-tracker-http-test.js
4
- *
5
- * E2E test for the portfolio-tracker board via HTTP + SSE.
6
- *
7
- * Two parallel tracks:
8
- *
9
- * Worker thread (portfolio-tracker-sse-worker.js) — SSE consumer
10
- * Opens the board's /sse endpoint, parses every frame, and forwards it
11
- * to the main thread via parentPort.postMessage({ type: 'frame', payload }).
12
- *
13
- * Main thread (this file) — Test driver
14
- * Accumulates state from worker messages into NotificationState (NS).
15
- * Drives sequential test steps (T1–T5) via HTTP PATCH/GET.
16
- * All "wait for X" helpers poll NS with setInterval — no callbacks needed.
17
- *
18
- * Usage:
19
- * node portfolio-tracker-http-test.js [--port 7800] [--server node|py]
20
- */
21
-
22
- import { Worker } from 'node:worker_threads';
23
- import { spawn, spawnSync } from 'node:child_process';
24
- import { fileURLToPath } from 'node:url';
25
- import path from 'node:path';
26
- import http from 'node:http';
27
-
28
- const __filename = fileURLToPath(import.meta.url);
29
- const __dirname = path.dirname(__filename);
30
-
31
- const cliArgs = process.argv.slice(2);
32
- const portArg = cliArgs.indexOf('--port');
33
- const serverArg = cliArgs.indexOf('--server');
34
- const SERVER_TYPE = serverArg !== -1 ? cliArgs[serverArg + 1] : 'node'; // 'node' | 'py'
35
- const PORT = portArg !== -1 ? parseInt(cliArgs[portArg + 1], 10) : (SERVER_TYPE === 'py' ? 7801 : 7800);
36
- const BASE = `http://127.0.0.1:${PORT}/api/board`;
37
- const SERVER_SCRIPT = path.join(__dirname, 'portfolio-tracker-server.js');
38
- const PY_SERVER_SCRIPT = path.join(__dirname, 'portfolio-tracker-server.py');
39
- const SSE_WORKER_SCRIPT = path.join(__dirname, 'portfolio-tracker-sse-worker.js');
40
-
41
- /** Find a working Python interpreter. Returns null if none found. */
42
- function findPython() {
43
- const candidates = ['python3', 'python'];
44
- for (const cmd of candidates) {
45
- try {
46
- const r = spawnSync(cmd, ['--version'], { stdio: 'pipe', timeout: 3000 });
47
- if (r.status === 0 && r.stdout?.toString().startsWith('Python ')) return cmd;
48
- } catch { /* next */ }
49
- }
50
- return null;
51
- }
52
-
53
- // =============================================================================
54
- // NOTIFICATION STATE — accumulated by the main thread from worker SSE frames
55
- // =============================================================================
56
- const NS = {
57
- initialPayload: null, // first full snapshot frame
58
- statusSummary: null, // latest { card_count, completed, failed, ... }
59
- statusGeneration: 0, // bumped on every status notification received
60
- dataObjects: {}, // token → payload (e.g. 'prices' → { AAPL: 142.5, ... })
61
- computedValues: {}, // cardId → values (e.g. 'holdings-table' → { table: { rows: [...] } })
62
- };
63
-
64
- // Apply a parsed SSE frame into NS (called from worker message handler)
65
- function applyFrame(payload) {
66
- // Initial full snapshot — has cardDefinitions
67
- if (payload.cardDefinitions) {
68
- NS.initialPayload = payload;
69
- if (payload.statusSnapshot?.summary) {
70
- NS.statusSummary = payload.statusSnapshot.summary;
71
- NS.statusGeneration++;
72
- }
73
- if (payload.dataObjectsByToken) {
74
- Object.assign(NS.dataObjects, payload.dataObjectsByToken);
75
- }
76
- if (payload.cardRuntimeById) {
77
- for (const [cardId, runtime] of Object.entries(payload.cardRuntimeById)) {
78
- if (runtime?.computed_values && Object.keys(runtime.computed_values).length > 0) {
79
- NS.computedValues[cardId] = runtime.computed_values;
80
- }
81
- }
82
- }
83
- return;
84
- }
85
- // Subsequent frames — notification-batch
86
- if (payload.kind === 'notification-batch' && Array.isArray(payload.notifications)) {
87
- for (const n of payload.notifications) {
88
- if (n.kind === 'status' && n.status?.summary) {
89
- NS.statusSummary = n.status.summary;
90
- NS.statusGeneration++;
91
- } else if (n.kind === 'data_object' && n.key) {
92
- NS.dataObjects[n.key] = n.payload;
93
- } else if (n.kind === 'computed_values' && n.cardId) {
94
- NS.computedValues[n.cardId] = n.values;
95
- }
96
- }
97
- }
98
- }
99
-
100
- // ── Polling helpers (poll NS, never block the event loop) ───────────────────
101
-
102
- function assert(condition, message) {
103
- if (!condition) {
104
- console.error(`\n[ASSERT FAILED] ${message}`);
105
- process.exit(1);
106
- }
107
- }
108
-
109
- function waitUntil(predicate, timeoutMs, label) {
110
- return new Promise((resolve, reject) => {
111
- const deadline = Date.now() + timeoutMs;
112
- const interval = setInterval(() => {
113
- let result;
114
- try { result = predicate(); } catch { /* retry */ }
115
- if (result !== undefined && result !== null && result !== false) {
116
- clearInterval(interval);
117
- resolve(result);
118
- return;
119
- }
120
- if (Date.now() > deadline) {
121
- clearInterval(interval);
122
- reject(new Error(`Timeout (${timeoutMs}ms) waiting for: ${label}\n NS.statusSummary=${JSON.stringify(NS.statusSummary)}\n dataObjects=${JSON.stringify(Object.keys(NS.dataObjects))}`));
123
- }
124
- }, 150);
125
- });
126
- }
127
-
128
- // Waits for first full payload frame from SSE worker
129
- const waitForInitialPayload = (ms = 15_000) =>
130
- waitUntil(() => NS.initialPayload || false, ms, 'initial SSE payload');
131
-
132
- // Waits for all cards to reach completed status
133
- const waitForAllCompleted = (ms = 60_000, label = 'all completed') =>
134
- waitUntil(() => {
135
- const s = NS.statusSummary;
136
- return (s && s.card_count > 0 && s.completed === s.card_count) ? s : false;
137
- }, ms, label);
138
-
139
- // Waits until prices data object has exactly the expected set of symbols
140
- function waitForPriceSymbols(expectedSymbols, ms = 30_000, label = 'price symbols') {
141
- const expected = [...expectedSymbols].sort().join(',');
142
- return waitUntil(() => {
143
- const prices = NS.dataObjects['prices'];
144
- if (!prices || typeof prices !== 'object') return false;
145
- const actual = Object.keys(prices).sort().join(',');
146
- return actual === expected ? prices : false;
147
- }, ms, `${label}: expected [${expected}]`);
148
- }
149
-
150
- // ── HTTP helpers ─────────────────────────────────────────────────────────────
151
-
152
- function httpGet(url) {
153
- return new Promise((resolve, reject) => {
154
- http.get(url, (res) => {
155
- let body = '';
156
- res.on('data', c => { body += c; });
157
- res.on('end', () => {
158
- try { resolve({ status: res.statusCode, data: JSON.parse(body) }); }
159
- catch { resolve({ status: res.statusCode, data: body }); }
160
- });
161
- }).on('error', reject);
162
- });
163
- }
164
-
165
- function httpPatch(url, payload) {
166
- return new Promise((resolve, reject) => {
167
- const body = JSON.stringify(payload);
168
- const req = http.request(url, {
169
- method: 'PATCH',
170
- headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) },
171
- }, (res) => {
172
- let data = '';
173
- res.on('data', c => { data += c; });
174
- res.on('end', () => {
175
- try { resolve({ status: res.statusCode, data: JSON.parse(data) }); }
176
- catch { resolve({ status: res.statusCode, data }); }
177
- });
178
- });
179
- req.on('error', reject);
180
- req.write(body);
181
- req.end();
182
- });
183
- }
184
-
185
- function makeHoldingsPatch(holdingsMap) {
186
- return {
187
- card_data: {
188
- holdings: Object.entries(holdingsMap).map(([symbol, qty]) => ({ symbol, qty })),
189
- },
190
- };
191
- }
192
-
193
- // ── Server process ────────────────────────────────────────────────────────────
194
-
195
- function startServer(port) {
196
- const isPy = SERVER_TYPE === 'py';
197
- let cmd, cmdArgs;
198
- if (isPy) {
199
- const python = findPython();
200
- if (!python) throw new Error('Python interpreter not found on PATH');
201
- cmd = python;
202
- cmdArgs = [PY_SERVER_SCRIPT, '--port', String(port), '--reset'];
203
- } else {
204
- cmd = process.execPath;
205
- cmdArgs = [SERVER_SCRIPT, '--port', String(port), '--reset'];
206
- }
207
- return new Promise((resolve, reject) => {
208
- const proc = spawn(cmd, cmdArgs, {
209
- stdio: ['ignore', 'pipe', 'pipe'],
210
- windowsHide: true,
211
- });
212
- let ready = false;
213
- proc.stdout.on('data', (chunk) => {
214
- const text = chunk.toString('utf-8');
215
- process.stdout.write(`[server] ${text}`);
216
- if (!ready && text.includes('listening on')) { ready = true; resolve(proc); }
217
- });
218
- proc.stderr.on('data', (chunk) => process.stderr.write(`[server:err] ${chunk}`));
219
- proc.on('error', reject);
220
- proc.on('exit', (code) => { if (!ready) reject(new Error(`Server exited early: code ${code}`)); });
221
- setTimeout(() => { if (!ready) reject(new Error('Server startup timeout (15s)')); }, 15_000);
222
- });
223
- }
224
-
225
- // ── Main ──────────────────────────────────────────────────────────────────────
226
-
227
- console.log('\n=== portfolio-tracker HTTP E2E test ===');
228
- console.log(`target: ${BASE} [server: ${SERVER_TYPE}]`);
229
- console.log(`architecture: main-thread (test driver) + worker-thread (SSE consumer)\n`);
230
-
231
- const serverProc = await startServer(PORT);
232
- await new Promise(r => setTimeout(r, 300)); // brief settle
233
-
234
- let sseWorker = null;
235
- try {
236
- // ── Step 1: init-board ──────────────────────────────────────────────────────
237
- console.log('\n=== Step 1: init-board ===');
238
- const initRes = await httpGet(`${BASE}/init-board`);
239
- assert(initRes.status === 200, `init-board returned ${initRes.status}`);
240
- console.log('[step1] ok');
241
-
242
- // ── Step 2: Start SSE consumer worker ───────────────────────────────────────
243
- // The worker opens /sse and forwards every parsed frame here via postMessage.
244
- // Main thread accumulates frames into NS via applyFrame().
245
- console.log('\n=== Step 2: Start SSE consumer worker ===');
246
- sseWorker = new Worker(SSE_WORKER_SCRIPT, {
247
- workerData: { sseUrl: `${BASE}/sse` },
248
- });
249
- sseWorker.on('message', (msg) => {
250
- if (msg.type === 'frame') {
251
- applyFrame(msg.payload);
252
- } else if (msg.type === 'error') {
253
- console.error(`[sse-worker] error: ${msg.message}`);
254
- } else if (msg.type === 'closed') {
255
- console.log('[sse-worker] SSE stream closed by server');
256
- }
257
- });
258
- sseWorker.on('error', (err) => console.error(`[sse-worker] uncaught: ${err.message}`));
259
-
260
- const initialPayload = await waitForInitialPayload();
261
- console.log(`[step2] SSE worker online — initial payload (${initialPayload.cardDefinitions?.length ?? 0} cards)`);
262
- console.log(` statusGen=${NS.statusGeneration}, dataObjects=${JSON.stringify(Object.keys(NS.dataObjects))}`);
263
-
264
- // ── T1: Wait for initial drain ──────────────────────────────────────────────
265
- console.log('\n=== T1: Wait for initial completion ===');
266
- const t1Summary = await waitForAllCompleted(60_000, 'T1 initial drain');
267
- console.log(`[T1] board completed — ${JSON.stringify(t1Summary)}`);
268
-
269
- const t1Prices = await waitForPriceSymbols(['AAPL', 'MSFT'], 30_000, 'T1 prices');
270
- assert(Object.values(t1Prices).every(v => typeof v === 'number'), 'T1: all prices must be numbers');
271
- const t1Table = NS.computedValues['holdings-table']?.table;
272
- assert(Array.isArray(t1Table?.rows) && t1Table.rows.length === 2, `T1: expected 2 rows, got ${t1Table?.rows?.length}`);
273
- const t1Total = NS.computedValues['portfolio-value']?.totalValue;
274
- assert(typeof t1Total === 'number' && t1Total > 0, `T1: totalValue must be positive, got ${t1Total}`);
275
- console.log(`[T1] passed: prices=[AAPL,MSFT], rows=2, totalValue=${t1Total.toFixed(2)}`);
276
-
277
- // ── T2a: Add GOOG to holdings ────────────────────────────────────────────────
278
- console.log('\n=== T2a: Update holdings — add GOOG ===');
279
- const t2Patch = await httpPatch(
280
- `${BASE}/cards/portfolio-form`,
281
- makeHoldingsPatch({ AAPL: 50, MSFT: 30, GOOG: 100 }),
282
- );
283
- assert(t2Patch.status === 200, `PATCH portfolio-form returned ${t2Patch.status}`);
284
- console.log('[T2a] PATCH ok — worker will receive SSE notifications independently');
285
-
286
- // ── T2b: Wait for 3-ticker completion ───────────────────────────────────────
287
- console.log('\n=== T2b: Wait for 3-ticker completion ===');
288
- const t2Summary = await waitForAllCompleted(60_000, 'T2b 3-ticker drain');
289
- console.log(`[T2b] completed — ${JSON.stringify(t2Summary)}`);
290
-
291
- const t2Prices = await waitForPriceSymbols(['AAPL', 'GOOG', 'MSFT'], 30_000, 'T2b prices');
292
- const t2Table = NS.computedValues['holdings-table']?.table;
293
- assert(Array.isArray(t2Table?.rows) && t2Table.rows.length === 3, `T2b: expected 3 rows, got ${t2Table?.rows?.length}`);
294
- const t2Total = NS.computedValues['portfolio-value']?.totalValue;
295
- assert(typeof t2Total === 'number' && t2Total > 0, 'T2b: totalValue must be positive');
296
- console.log(`[T2b] passed: prices=[AAPL,GOOG,MSFT], rows=3, totalValue=${t2Total.toFixed(2)}`);
297
-
298
- // ── T3: Rapid 3× holdings updates (queue stress) ─────────────────────────────
299
- // The worker independently streams all SSE notifications while the driver
300
- // fires rapid PATCHes. NS accumulates state continuously in both cases.
301
- console.log('\n=== T3: Rapid 3× holdings updates ===');
302
- const rapidUpdates = [
303
- { AAPL: 45, MSFT: 30, GOOG: 110, TSLA: 60 },
304
- { AAPL: 45, MSFT: 30, GOOG: 110, AMZN: 100 }, // intermediate — not expected to be final
305
- { AAPL: 40, MSFT: 35, GOOG: 120, TSLA: 70 }, // V5 — expected final state
306
- ];
307
- for (const holdings of rapidUpdates) {
308
- await httpPatch(`${BASE}/cards/portfolio-form`, makeHoldingsPatch(holdings));
309
- }
310
- console.log('[T3] rapid PATCHes sent — worker accumulates SSE state in parallel');
311
-
312
- await waitForAllCompleted(60_000, 'T3 rapid-update drain');
313
- const t3Prices = await waitForPriceSymbols(['AAPL', 'GOOG', 'MSFT', 'TSLA'], 30_000, 'T3 final prices');
314
- const t3Table = NS.computedValues['holdings-table']?.table;
315
- assert(Array.isArray(t3Table?.rows) && t3Table.rows.length === 4, `T3: expected 4 rows, got ${t3Table?.rows?.length}`);
316
- assert(!Object.keys(t3Prices).includes('AMZN'), `T3: AMZN must not be present (got ${JSON.stringify(Object.keys(t3Prices))})`);
317
- console.log(`[T3] passed: prices=${JSON.stringify(Object.keys(t3Prices).sort())}, rows=4, AMZN absent`);
318
-
319
- // ── T4: Cross-verify portfolio-value totalValue ───────────────────────────────
320
- console.log('\n=== T4: Cross-verify totalValue ===');
321
- const t4Total = NS.computedValues['portfolio-value']?.totalValue;
322
- assert(typeof t4Total === 'number' && t4Total > 0, `T4: totalValue must be positive, got ${t4Total}`);
323
- const sumRows = t3Table.rows.reduce((acc, r) => acc + (r.value || 0), 0);
324
- assert(Math.abs(sumRows - t4Total) < 0.01, `T4: mismatch: sumRows=${sumRows}, totalValue=${t4Total}`);
325
- console.log(`[T4] passed: totalValue=${t4Total.toFixed(2)}, sumRows=${sumRows.toFixed(2)}`);
326
-
327
- // ── T5: board-status HTTP cross-check ────────────────────────────────────────
328
- // Compare the HTTP board-status endpoint response against what the worker
329
- // accumulated via SSE — the two sources must agree.
330
- console.log('\n=== T5: board-status HTTP cross-check ===');
331
- const t5Res = await httpGet(`${BASE}/board-status`);
332
- assert(t5Res.status === 200, `board-status returned ${t5Res.status}`);
333
- const t5Summary = t5Res.data?.statusSnapshot?.summary;
334
- assert(t5Summary, 'T5: statusSnapshot.summary missing from board-status');
335
- assert(t5Summary.completed === t5Summary.card_count,
336
- `T5: completed=${t5Summary.completed} !== card_count=${t5Summary.card_count}`);
337
- assert(t5Summary.failed === 0, `T5: failed=${t5Summary.failed} (expected 0)`);
338
-
339
- // Cross-check: dataObjects from HTTP response matches what worker accumulated
340
- const httpDataObjKeys = Object.keys(t5Res.data.dataObjectsByToken || {}).sort().join(',');
341
- const workerDataObjKeys = Object.keys(NS.dataObjects).sort().join(',');
342
- assert(httpDataObjKeys === workerDataObjKeys,
343
- `T5: HTTP dataObjects keys [${httpDataObjKeys}] differ from worker-accumulated [${workerDataObjKeys}]`);
344
-
345
- console.log(`[T5] summary: ${JSON.stringify(t5Summary)}`);
346
- console.log(`[T5] HTTP vs worker dataObjects agree: [${workerDataObjKeys}]`);
347
- console.log(`[T5] statusGen at end: ${NS.statusGeneration}`);
348
- console.log('[T5] all assertions passed');
349
-
350
- console.log('\n=== All tests passed ✓ ===\n');
351
-
352
- } finally {
353
- sseWorker?.terminate();
354
- serverProc.kill();
355
- await new Promise(r => serverProc.on('exit', r));
356
- console.log(`[portfolio-tracker-http-test] server stopped (${SERVER_TYPE})`);
357
- }
@@ -1,196 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import * as path from 'node:path';
4
- import * as fs from 'node:fs';
5
- import { parseRef, blobStorageForRef } from 'yaml-flow/storage-refs';
6
-
7
- function parseArgs(argv) {
8
- const inIdx = argv.indexOf('--in-ref');
9
- const outIdx = argv.indexOf('--out-ref');
10
- const errIdx = argv.indexOf('--err-ref');
11
- const inRefStr = inIdx !== -1 ? argv[inIdx + 1] : undefined;
12
- const outRefStr = outIdx !== -1 ? argv[outIdx + 1] : undefined;
13
- const errRefStr = errIdx !== -1 ? argv[errIdx + 1] : undefined;
14
- if (!inRefStr || !outRefStr || !errRefStr) {
15
- console.error('Usage: <adapter> run-inference --in-ref <::kind::value> --out-ref <::kind::value> --err-ref <::kind::value>');
16
- process.exit(1);
17
- }
18
- const inRef = parseRef(inRefStr);
19
- const outRef = parseRef(outRefStr);
20
- const errRef = parseRef(errRefStr);
21
- const inStorage = blobStorageForRef(inRef);
22
- const outStorage = blobStorageForRef(outRef);
23
- const errStorage = blobStorageForRef(errRef);
24
- return { inRef, outRef, errRef, inStorage, outStorage, errStorage };
25
- }
26
-
27
- const envBoardDir = (process.env.BOARD_DIR ?? '').trim();
28
-
29
- function resolveSyncTmpFileCandidates(payload) {
30
- const fileName = payload?.context?.card_data?.llm_task_completion_inference?.sync_tmp_file;
31
- if (typeof fileName !== 'string' || !fileName.trim()) return [];
32
-
33
- const cleaned = fileName.trim();
34
- if (path.isAbsolute(cleaned)) {
35
- return [cleaned];
36
- }
37
-
38
- return [
39
- envBoardDir ? path.join(envBoardDir, cleaned) : '',
40
- path.join(process.cwd(), cleaned),
41
- path.join(process.cwd(), 'board-runtime', cleaned),
42
- path.join(process.cwd(), '..', 'board-runtime', cleaned),
43
- ].filter(Boolean);
44
- }
45
-
46
- function getReadableTmpFile(tmpCandidates) {
47
- for (const tmpFile of tmpCandidates) {
48
- if (!fs.existsSync(tmpFile)) continue;
49
- const content = fs.readFileSync(tmpFile, 'utf-8').trim();
50
- if (content) return { tmpFile, content };
51
- }
52
- return undefined;
53
- }
54
-
55
- function waitForTmpSyncInput(tmpCandidates, timeoutMs = 120000) {
56
- const started = Date.now();
57
-
58
- return new Promise((resolve, reject) => {
59
- const interval = setInterval(() => {
60
- if (Date.now() - started > timeoutMs) {
61
- clearInterval(interval);
62
- reject(new Error('Timed out waiting for sync tmp input'));
63
- }
64
-
65
- const ready = getReadableTmpFile(tmpCandidates);
66
- if (!ready) return;
67
-
68
- clearInterval(interval);
69
- fs.writeFileSync(ready.tmpFile, '', 'utf-8');
70
- resolve(ready);
71
- }, 250);
72
- });
73
- }
74
-
75
- function toNumber(value) {
76
- const n = Number(value);
77
- return Number.isFinite(n) ? n : 0;
78
- }
79
-
80
- function buildRiskAssessment(table, totalValue) {
81
- const rows = Array.isArray(table) ? table : [];
82
- const total = toNumber(totalValue);
83
- const withWeights = rows.map((row) => {
84
- const v = toNumber(row?.value);
85
- return { symbol: String(row?.symbol ?? ''), value: v, weight: total > 0 ? v / total : 0 };
86
- });
87
- withWeights.sort((a, b) => b.weight - a.weight);
88
- const largest = withWeights[0] ?? { symbol: 'N/A', weight: 0, value: 0 };
89
- const concentrationPct = Math.round(largest.weight * 1000) / 10;
90
- const concentrationFlag = largest.weight > 0.6;
91
- const breadthFlag = withWeights.length < 3;
92
-
93
- const statusText = concentrationFlag
94
- ? `High concentration risk: ${largest.symbol} at ${concentrationPct}% of portfolio value.`
95
- : `Risk appears moderate: largest position ${largest.symbol} at ${concentrationPct}% of portfolio value.`;
96
-
97
- const evidence = [
98
- `positions=${withWeights.length}`,
99
- `largest=${largest.symbol}`,
100
- `largest_weight=${concentrationPct}%`,
101
- `total_value=${Math.round(total * 100) / 100}`,
102
- `breadth_ok=${withWeights.length >= 3}`,
103
- `concentration_ok=${largest.weight <= 0.6}`,
104
- `risk_flag=${breadthFlag || concentrationFlag}`,
105
- ].join('; ');
106
-
107
- return { isTaskCompleted: true, reason: statusText, evidence };
108
- }
109
-
110
- function buildRebalancingPlan(table, totalValue, riskAssessment) {
111
- const rows = Array.isArray(table) ? table : [];
112
- const total = toNumber(totalValue);
113
- const targetWeight = rows.length > 0 ? 1 / rows.length : 0;
114
- const moves = rows
115
- .map((row) => {
116
- const symbol = String(row?.symbol ?? 'UNKNOWN');
117
- const currentValue = toNumber(row?.value);
118
- const currentWeight = total > 0 ? currentValue / total : 0;
119
- const deltaWeight = targetWeight - currentWeight;
120
- return {
121
- symbol,
122
- currentWeight,
123
- deltaWeight,
124
- action: deltaWeight > 0.03 ? 'BUY' : (deltaWeight < -0.03 ? 'SELL' : 'HOLD'),
125
- };
126
- })
127
- .sort((a, b) => Math.abs(b.deltaWeight) - Math.abs(a.deltaWeight));
128
-
129
- const topMoves = moves
130
- .filter((m) => m.action !== 'HOLD')
131
- .slice(0, 3)
132
- .map((m) => `${m.action} ${m.symbol} (${Math.round(m.deltaWeight * 1000) / 10}pp)`);
133
-
134
- const summary = topMoves.length > 0
135
- ? `Rebalance toward equal-weight profile: ${topMoves.join(', ')}.`
136
- : 'Current allocations are close to equal-weight; no major rebalance needed.';
137
-
138
- const evidence = [
139
- `positions=${rows.length}`,
140
- `target_weight=${Math.round(targetWeight * 1000) / 10}%`,
141
- `risk_assessment=${typeof riskAssessment === 'string' ? riskAssessment : 'n/a'}`,
142
- ].join('; ');
143
-
144
- return { isTaskCompleted: true, reason: summary, evidence };
145
- }
146
-
147
- async function main() {
148
- const command = process.argv[2];
149
- if (command !== 'run-inference') {
150
- console.error(`Unknown command: ${command ?? '(none)'}`);
151
- process.exit(1);
152
- }
153
-
154
- const { inRef, outRef, errRef, inStorage, outStorage, errStorage } = parseArgs(process.argv.slice(3));
155
-
156
- try {
157
- const rawIn = inStorage.read(inRef.value);
158
- if (rawIn === null) throw new Error(`Input not found: ${inRef.value}`);
159
- const payload = JSON.parse(rawIn);
160
- const tmpCandidates = resolveSyncTmpFileCandidates(payload);
161
- if (tmpCandidates.length > 0) {
162
- await waitForTmpSyncInput(tmpCandidates);
163
- }
164
-
165
- const taskName = String(payload?.taskName ?? '');
166
- const context = payload?.context ?? {};
167
- // Inputs arrive under context.requires (the card's declared dependencies)
168
- const requires = context?.requires ?? {};
169
- const table = requires?.table?.rows ?? requires?.table;
170
- const totalValue = requires?.totalValue;
171
- const riskAssessment = requires?.riskAssessment;
172
-
173
- let result;
174
- if (taskName === 'portfolio-risk-assessment') {
175
- result = buildRiskAssessment(table, totalValue);
176
- } else if (taskName === 'rebalancing-strategy') {
177
- result = buildRebalancingPlan(table, totalValue, riskAssessment);
178
- } else {
179
- result = {
180
- isTaskCompleted: true,
181
- reason: `Inference completed for ${taskName || 'unknown-task'}`,
182
- evidence: 'deterministic-demo-adapter',
183
- };
184
- }
185
-
186
- outStorage.write(outRef.value, JSON.stringify(result));
187
- errStorage.write(errRef.value, '');
188
- } catch (err) {
189
- const message = err instanceof Error ? err.message : String(err);
190
- errStorage.write(errRef.value, message);
191
- outStorage.write(outRef.value, JSON.stringify({ isTaskCompleted: false, reason: message, evidence: '' }));
192
- process.exit(1);
193
- }
194
- }
195
-
196
- void main();